This commit was generated by cvs2svn to track changes on a CVS vendor
[external/binutils.git] / sim / igen / gen.h
1 /*  This file is part of the program psim.
2
3     Copyright (C) 1994,1995,1996, 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
22 typedef struct _opcode_field opcode_field;
23 struct _opcode_field {
24   int word_nr;
25   int first;
26   int last;
27   int is_boolean;
28   int nr_opcodes;
29   unsigned boolean_constant;
30   opcode_field *parent;
31 };
32
33 typedef struct _opcode_bits opcode_bits;
34 struct _opcode_bits {
35   int value;
36   int first;
37   int last;
38   insn_field_entry *field;
39   opcode_field *opcode;
40   opcode_bits *next;
41 };
42
43 typedef struct _insn_opcodes insn_opcodes;
44 struct _insn_opcodes {
45   opcode_field *opcode;
46   insn_opcodes *next;
47 };
48
49 typedef struct _insn_list insn_list;
50 struct _insn_list {
51   /* the instruction */
52   insn_entry *insn;
53   /* list of non constant bits that have been made constant */
54   opcode_bits *expanded_bits;
55   /* list of the various opcode field paths used to reach this
56      instruction */
57   insn_opcodes *opcodes;
58   /* number of prefetched words for this instruction */
59   int nr_prefetched_words;
60   /* The semantic function list_entry corresponding to this insn */
61   insn_list *semantic;
62   /* linked list */
63   insn_list *next;
64 };
65
66 /* forward */
67 typedef struct _gen_list gen_list;
68
69 typedef struct _gen_entry gen_entry;
70 struct _gen_entry {
71
72   /* as an entry in a table */
73   int word_nr;
74   int opcode_nr;
75   gen_entry *sibling;
76   opcode_bits *expanded_bits;
77   gen_entry *parent; /* parent has the opcode* data */
78
79   /* as a table containing entries */
80   decode_table *opcode_rule;
81   opcode_field *opcode;
82   int nr_prefetched_words;
83   int nr_entries;
84   gen_entry *entries;
85
86   /* as both an entry and a table */
87   int nr_insns;
88   insn_list *insns;
89
90   /* if siblings are being combined */
91   gen_entry *combined_next;
92   gen_entry *combined_parent;
93
94   /* our top-of-tree */
95   gen_list *top;
96 };
97
98
99 struct _gen_list {
100   model_entry *model;
101   insn_table *isa;
102   gen_entry *table;
103   gen_list *next;
104 };
105
106
107 typedef struct _gen_table gen_table;
108 struct _gen_table {
109   /* list of all the instructions */
110   insn_table *isa;
111   /* list of all the semantic functions */
112   decode_table *rules;
113   /* list of all the generated instruction tables */
114   gen_list *tables;
115   /* list of all the semantic functions */
116   int nr_semantics;
117   insn_list *semantics;
118 };
119
120
121 extern gen_table *make_gen_tables
122 (insn_table *isa,
123  decode_table *rules);
124
125
126 extern void gen_tables_expand_insns
127 (gen_table *gen);
128
129 extern void gen_tables_expand_semantics
130 (gen_table *gen);
131
132 extern int gen_entry_depth
133 (gen_entry *table);
134
135
136
137 /* Traverse the created data structure */
138
139 typedef void gen_entry_handler
140 (lf *file,
141  gen_entry *entry,
142  int depth,
143  void *data);
144
145 extern void gen_entry_traverse_tree
146 (lf *file,
147  gen_entry *table,
148  int depth,
149  gen_entry_handler *start,
150  gen_entry_handler *leaf,
151  gen_entry_handler *end,
152  void *data);
153
154
155
156 /* Misc functions - actually in igen.c */
157
158
159 /* Cache functions: */
160
161 extern int print_icache_function_formal
162 (lf *file, int nr_prefetched_words);
163
164 extern int print_icache_function_actual
165 (lf *file, int nr_prefetched_words);
166
167 extern int print_icache_function_type
168 (lf *file);
169
170 extern int print_semantic_function_formal
171 (lf *file, int nr_prefetched_words);
172
173 extern int print_semantic_function_actual
174 (lf *file, int nr_prefetched_words);
175
176 extern int print_semantic_function_type
177 (lf *file);
178
179 extern int print_idecode_function_formal
180 (lf *file, int nr_prefetched_words);
181
182 extern int print_idecode_function_actual
183 (lf *file, int nr_prefetched_words);
184
185 typedef enum {
186   function_name_prefix_semantics,
187   function_name_prefix_idecode,
188   function_name_prefix_itable,
189   function_name_prefix_icache,
190   function_name_prefix_engine,
191   function_name_prefix_none
192 } lf_function_name_prefixes;
193
194 typedef enum {
195   is_function_declaration = 0,
196   is_function_definition = 1,
197   is_function_variable,
198 } function_decl_type;
199
200 extern int print_function_name
201 (lf *file,
202  const char *basename,
203  const char *format_name,
204  const char *model_name,
205  opcode_bits *expanded_bits,
206  lf_function_name_prefixes prefix);
207
208 extern void print_my_defines
209 (lf *file,
210  const char *basename,
211  const char *format_name,
212  opcode_bits *expanded_bits);
213
214 extern void print_itrace
215 (lf *file,
216  insn_entry *insn,
217  int idecode);
218
219 extern void print_sim_engine_abort
220 (lf *file,
221  const char *message);
222
223
224 extern void print_include (lf *file, igen_module module);
225 extern void print_include_inline  (lf *file, igen_module module);
226 extern void print_includes (lf *file);
227