OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [sim/] [igen/] [gen-support.c] - Blame information for rev 578

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 578 markom
/*  This file is part of the program psim.
2
 
3
    Copyright (C) 1994-1998, Andrew Cagney <cagney@highland.com.au>
4
 
5
    This program is free software; you can redistribute it and/or modify
6
    it under the terms of the GNU General Public License as published by
7
    the Free Software Foundation; either version 2 of the License, or
8
    (at your option) any later version.
9
 
10
    This program is distributed in the hope that it will be useful,
11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
    GNU General Public License for more details.
14
 
15
    You should have received a copy of the GNU General Public License
16
    along with this program; if not, write to the Free Software
17
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
 
19
    */
20
 
21
#include "misc.h"
22
#include "lf.h"
23
#include "table.h"
24
#include "filter.h"
25
 
26
#include "igen.h"
27
 
28
#include "ld-insn.h"
29
#include "ld-decode.h"
30
 
31
#include "gen.h"
32
 
33
#include "gen-semantics.h"
34
#include "gen-support.h"
35
 
36
static void
37
print_support_function_name (lf *file,
38
                             function_entry *function,
39
                             int is_function_definition)
40
{
41
  if (function->is_internal)
42
    {
43
      lf_print__function_type_function (file, print_semantic_function_type,
44
                                        "INLINE_SUPPORT",
45
                                        (is_function_definition ? "\n" : " "));
46
      print_function_name (file,
47
                           function->name,
48
                           NULL,
49
                           NULL,
50
                           NULL,
51
                           function_name_prefix_semantics);
52
      lf_printf (file, "\n(");
53
      lf_indent (file, +1);
54
      print_semantic_function_formal (file, 0);
55
      lf_indent (file, -1);
56
      lf_printf (file, ")");
57
      if (!is_function_definition)
58
        lf_printf (file, ";");
59
      lf_printf (file, "\n");
60
    }
61
  else
62
    {
63
      /* map the name onto a globally valid name */
64
      if (!is_function_definition
65
          && strcmp (options.module.support.prefix.l, "") != 0)
66
        {
67
          lf_indent_suppress (file);
68
          lf_printf (file, "#define %s %s%s\n",
69
                     function->name,
70
                     options.module.support.prefix.l,
71
                     function->name);
72
        }
73
      lf_print__function_type (file,
74
                               function->type,
75
                               "INLINE_SUPPORT",
76
                               (is_function_definition ? "\n" : " "));
77
      lf_printf (file, "%s%s\n(",
78
                 options.module.support.prefix.l,
79
                 function->name);
80
      if (options.gen.smp)
81
        lf_printf (file,
82
                   "sim_cpu *cpu, %sinstruction_address cia, int MY_INDEX",
83
                   options.module.support.prefix.l);
84
      else
85
        lf_printf (file,
86
                   "SIM_DESC sd, %sinstruction_address cia, int MY_INDEX",
87
                   options.module.support.prefix.l);
88
      if (function->param != NULL
89
          && strlen (function->param) > 0)
90
        lf_printf (file, ", %s", function->param);
91
      lf_printf (file, ")%s", (is_function_definition ? "\n" : ";\n"));
92
    }
93
}
94
 
95
 
96
static void
97
support_h_function (lf *file,
98
                    function_entry *function,
99
                    void *data)
100
{
101
  ASSERT (function->type != NULL);
102
  print_support_function_name (file,
103
                               function,
104
                               0/*!is_definition*/);
105
  lf_printf(file, "\n");
106
}
107
 
108
 
109
extern void
110
gen_support_h (lf *file,
111
               insn_table *table)
112
{
113
  /* output the definition of `SD_'*/
114
  if (options.gen.smp)
115
    {
116
      lf_printf(file, "#define SD CPU_STATE (cpu)\n");
117
      lf_printf(file, "#define CPU cpu\n");
118
      lf_printf(file, "#define CPU_ cpu\n");
119
    }
120
  else
121
    {
122
      lf_printf(file, "#define SD sd\n");
123
      lf_printf(file, "#define CPU (STATE_CPU (sd, 0))\n");
124
      lf_printf(file, "#define CPU_ sd\n");
125
    }
126
 
127
  lf_printf(file, "#define CIA_ cia\n");
128
  if (options.gen.delayed_branch)
129
    {
130
      lf_printf(file, "#define CIA cia.ip\n");
131
      lf_printf(file, "/* #define NIA nia.dp -- do not define, ambigious */\n");
132
    }
133
  else
134
    {
135
      lf_printf(file, "#define CIA cia\n");
136
      lf_printf(file, "#define NIA nia\n");
137
    }
138
  lf_printf(file, "\n");
139
 
140
  lf_printf(file, "#define SD_ CPU_, CIA_, MY_INDEX\n");
141
  lf_printf(file, "#define _SD SD_ /* deprecated */\n");
142
  lf_printf(file, "\n");
143
 
144
  /* Map <PREFIX>_instruction_word and <PREFIX>_idecode_issue onto the
145
     shorter instruction_word and idecode_issue.  Map defined here as,
146
     name space problems are created when the name is defined in
147
     idecode.h */
148
  if (strcmp (options.module.idecode.prefix.l, "") != 0)
149
    {
150
      lf_indent_suppress (file);
151
      lf_printf (file, "#define %s %s%s\n",
152
                 "instruction_word",
153
                 options.module.idecode.prefix.l,
154
                 "instruction_word");
155
      lf_printf (file, "\n");
156
      lf_indent_suppress (file);
157
      lf_printf (file, "#define %s %s%s\n",
158
                 "idecode_issue",
159
                 options.module.idecode.prefix.l,
160
                 "idecode_issue");
161
      lf_printf (file, "\n");
162
    }
163
 
164
  /* output a declaration for all functions */
165
  function_entry_traverse (file, table->functions,
166
                           support_h_function,
167
                           NULL);
168
  lf_printf(file, "\n");
169
  lf_printf(file, "#if defined(SUPPORT_INLINE)\n");
170
  lf_printf(file, "# if ((SUPPORT_INLINE & INCLUDE_MODULE)\\\n");
171
  lf_printf(file, "      && (SUPPORT_INLINE & INCLUDED_BY_MODULE))\n");
172
  lf_printf(file, "#  include \"%ssupport.c\"\n", options.module.support.prefix.l);
173
  lf_printf(file, "# endif\n");
174
  lf_printf(file, "#endif\n");
175
}
176
 
177
static void
178
support_c_function (lf *file,
179
                    function_entry *function,
180
                    void *data)
181
{
182
  ASSERT (function->type != NULL);
183
  print_support_function_name (file,
184
                               function,
185
                               1/*!is_definition*/);
186
  lf_printf (file, "{\n");
187
  lf_indent (file, +2);
188
  if (function->code == NULL)
189
    error (function->line,
190
           "Function without body (or null statement)");
191
  lf_print__line_ref (file, function->code->line);
192
  table_print_code (file, function->code);
193
  if (function->is_internal)
194
    {
195
      lf_printf (file, "sim_engine_abort (SD, CPU, cia, \"Internal function must longjump\\n\");\n");
196
      lf_printf (file, "return cia;\n");
197
    }
198
  lf_indent (file, -2);
199
  lf_printf (file, "}\n");
200
  lf_print__internal_ref (file);
201
  lf_printf (file, "\n");
202
}
203
 
204
 
205
void
206
gen_support_c (lf *file,
207
               insn_table *table)
208
{
209
  lf_printf(file, "#include \"sim-main.h\"\n");
210
  lf_printf(file, "#include \"%sidecode.h\"\n", options.module.idecode.prefix.l);
211
  lf_printf(file, "#include \"%sitable.h\"\n", options.module.itable.prefix.l);
212
  lf_printf(file, "#include \"%ssupport.h\"\n", options.module.support.prefix.l);
213
  lf_printf(file, "\n");
214
 
215
  /* output a definition (c-code) for all functions */
216
  function_entry_traverse (file, table->functions,
217
                           support_c_function,
218
                           NULL);
219
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.