1/* The IGEN simulator generator for GDB, the GNU Debugger. 2 3 Copyright 2002-2020 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 23typedef struct _opcode_field opcode_field; 24struct _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 35typedef struct _opcode_bits opcode_bits; 36struct _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 46typedef struct _insn_opcodes insn_opcodes; 47struct _insn_opcodes 48{ 49 opcode_field *opcode; 50 insn_opcodes *next; 51}; 52 53typedef struct _insn_list insn_list; 54struct _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 */ 72typedef struct _gen_list gen_list; 73 74typedef struct _gen_entry gen_entry; 75struct _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 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 105struct _gen_list 106{ 107 model_entry *model; 108 insn_table *isa; 109 gen_entry *table; 110 gen_list *next; 111}; 112 113 114typedef struct _gen_table gen_table; 115struct _gen_table 116{ 117 /* list of all the instructions */ 118 insn_table *isa; 119 /* list of all the semantic functions */ 120 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 129extern gen_table *make_gen_tables (insn_table *isa, decode_table *rules); 130 131 132extern void gen_tables_expand_insns (gen_table *gen); 133 134extern void gen_tables_expand_semantics (gen_table *gen); 135 136extern int gen_entry_depth (gen_entry *table); 137 138 139 140/* Traverse the created data structure */ 141 142typedef void gen_entry_handler 143 (lf *file, gen_entry *entry, int depth, void *data); 144 145extern 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, gen_entry_handler * end, void *data); 151 152 153 154/* Misc functions - actually in igen.c */ 155 156 157/* Cache functions: */ 158 159extern int print_icache_function_formal (lf *file, int nr_prefetched_words); 160 161extern int print_icache_function_actual (lf *file, int nr_prefetched_words); 162 163extern int print_icache_function_type (lf *file); 164 165extern int print_semantic_function_formal (lf *file, int nr_prefetched_words); 166 167extern int print_semantic_function_actual (lf *file, int nr_prefetched_words); 168 169extern int print_semantic_function_type (lf *file); 170 171extern int print_idecode_function_formal (lf *file, int nr_prefetched_words); 172 173extern int print_idecode_function_actual (lf *file, int nr_prefetched_words); 174 175typedef enum 176{ 177 function_name_prefix_semantics, 178 function_name_prefix_idecode, 179 function_name_prefix_itable, 180 function_name_prefix_icache, 181 function_name_prefix_engine, 182 function_name_prefix_none 183} 184lf_function_name_prefixes; 185 186typedef enum 187{ 188 is_function_declaration = 0, 189 is_function_definition = 1, 190 is_function_variable, 191} 192function_decl_type; 193 194extern int print_function_name 195 (lf *file, 196 const char *basename, 197 const char *format_name, 198 const char *model_name, 199 opcode_bits *expanded_bits, lf_function_name_prefixes prefix); 200 201extern void print_my_defines 202 (lf *file, 203 const char *basename, const char *format_name, opcode_bits *expanded_bits); 204 205extern void print_itrace (lf *file, insn_entry * insn, int idecode); 206 207extern void print_sim_engine_abort (lf *file, const char *message); 208 209 210extern void print_include (lf *file, igen_module module); 211extern void print_include_inline (lf *file, igen_module module); 212extern void print_includes (lf *file); 213