1 /* The IGEN simulator generator for GDB, the GNU Debugger. 2 3 Copyright 2002-2023 Free Software Foundation, Inc. 4 5 Contributed by Andrew Cagney. 6 7 This file is part of GDB. 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 3 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 21 22 23 typedef struct _opcode_field opcode_field; 24 struct _opcode_field 25 { 26 int word_nr; 27 int first; 28 int last; 29 int is_boolean; 30 int nr_opcodes; 31 unsigned boolean_constant; 32 opcode_field *parent; 33 }; 34 35 typedef struct _opcode_bits opcode_bits; 36 struct _opcode_bits 37 { 38 int value; 39 int first; 40 int last; 41 insn_field_entry *field; 42 opcode_field *opcode; 43 opcode_bits *next; 44 }; 45 46 typedef struct _insn_opcodes insn_opcodes; 47 struct _insn_opcodes 48 { 49 opcode_field *opcode; 50 insn_opcodes *next; 51 }; 52 53 typedef struct _insn_list insn_list; 54 struct _insn_list 55 { 56 /* the instruction */ 57 insn_entry *insn; 58 /* list of non constant bits that have been made constant */ 59 opcode_bits *expanded_bits; 60 /* list of the various opcode field paths used to reach this 61 instruction */ 62 insn_opcodes *opcodes; 63 /* number of prefetched words for this instruction */ 64 int nr_prefetched_words; 65 /* The semantic function list_entry corresponding to this insn */ 66 insn_list *semantic; 67 /* linked list */ 68 insn_list *next; 69 }; 70 71 /* forward */ 72 typedef struct _gen_list gen_list; 73 74 typedef struct _gen_entry gen_entry; 75 struct _gen_entry 76 { 77 78 /* as an entry in a table */ 79 int word_nr; 80 int opcode_nr; 81 gen_entry *sibling; 82 opcode_bits *expanded_bits; 83 gen_entry *parent; /* parent has the opcode* data */ 84 85 /* as a table containing entries */ 86 const decode_table *opcode_rule; 87 opcode_field *opcode; 88 int nr_prefetched_words; 89 int nr_entries; 90 gen_entry *entries; 91 92 /* as both an entry and a table */ 93 int nr_insns; 94 insn_list *insns; 95 96 /* if siblings are being combined */ 97 gen_entry *combined_next; 98 gen_entry *combined_parent; 99 100 /* our top-of-tree */ 101 gen_list *top; 102 }; 103 104 105 struct _gen_list 106 { 107 const model_entry *model; 108 const insn_table *isa; 109 gen_entry *table; 110 gen_list *next; 111 }; 112 113 114 typedef struct _gen_table gen_table; 115 struct _gen_table 116 { 117 /* list of all the instructions */ 118 const insn_table *isa; 119 /* list of all the semantic functions */ 120 const decode_table *rules; 121 /* list of all the generated instruction tables */ 122 gen_list *tables; 123 /* list of all the semantic functions */ 124 int nr_semantics; 125 insn_list *semantics; 126 }; 127 128 129 extern gen_table *make_gen_tables 130 (const insn_table *isa, const decode_table *rules); 131 132 133 extern void gen_tables_expand_insns (gen_table *gen); 134 135 extern void gen_tables_expand_semantics (gen_table *gen); 136 137 extern int gen_entry_depth (const gen_entry *table); 138 139 140 141 /* Traverse the created data structure */ 142 143 typedef void gen_entry_handler 144 (lf *file, const gen_entry *entry, int depth, void *data); 145 146 extern void gen_entry_traverse_tree 147 (lf *file, 148 const gen_entry *table, 149 int depth, 150 gen_entry_handler * start, 151 gen_entry_handler * leaf, gen_entry_handler * end, void *data); 152 153 154 155 /* Misc functions - actually in igen.c */ 156 157 158 /* Cache functions: */ 159 160 extern int print_icache_function_formal (lf *file, int nr_prefetched_words); 161 162 extern int print_icache_function_actual (lf *file, int nr_prefetched_words); 163 164 extern int print_icache_function_type (lf *file); 165 166 extern int print_semantic_function_formal (lf *file, int nr_prefetched_words); 167 168 extern int print_semantic_function_actual (lf *file, int nr_prefetched_words); 169 170 extern int print_semantic_function_type (lf *file); 171 172 extern int print_idecode_function_formal (lf *file, int nr_prefetched_words); 173 174 extern int print_idecode_function_actual (lf *file, int nr_prefetched_words); 175 176 typedef enum 177 { 178 function_name_prefix_semantics, 179 function_name_prefix_idecode, 180 function_name_prefix_itable, 181 function_name_prefix_icache, 182 function_name_prefix_engine, 183 function_name_prefix_none 184 } 185 lf_function_name_prefixes; 186 187 typedef enum 188 { 189 is_function_declaration = 0, 190 is_function_definition = 1, 191 is_function_variable, 192 } 193 function_decl_type; 194 195 extern int print_function_name 196 (lf *file, 197 const char *basename, 198 const char *format_name, 199 const char *model_name, 200 const opcode_bits *expanded_bits, 201 lf_function_name_prefixes prefix); 202 203 extern void print_my_defines 204 (lf *file, 205 const char *basename, 206 const char *format_name, 207 const opcode_bits *expanded_bits); 208 209 extern void print_itrace (lf *file, const insn_entry *insn, int idecode); 210 211 extern void print_sim_engine_abort (lf *file, const char *message); 212 213 214 extern void print_include (lf *file, igen_module module); 215 extern void print_include_inline (lf *file, igen_module module); 216 extern void print_includes (lf *file); 217