diff options
Diffstat (limited to 'sim/igen/gen.h')
-rw-r--r-- | sim/igen/gen.h | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/sim/igen/gen.h b/sim/igen/gen.h new file mode 100644 index 0000000..884e277 --- /dev/null +++ b/sim/igen/gen.h @@ -0,0 +1,227 @@ +/* This file is part of the program psim. + + Copyright (C) 1994,1995,1996, Andrew Cagney <cagney@highland.com.au> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + + +typedef struct _opcode_field opcode_field; +struct _opcode_field { + int word_nr; + int first; + int last; + int is_boolean; + int nr_opcodes; + unsigned boolean_constant; + opcode_field *parent; +}; + +typedef struct _opcode_bits opcode_bits; +struct _opcode_bits { + int value; + int first; + int last; + insn_field_entry *field; + opcode_field *opcode; + opcode_bits *next; +}; + +typedef struct _insn_opcodes insn_opcodes; +struct _insn_opcodes { + opcode_field *opcode; + insn_opcodes *next; +}; + +typedef struct _insn_list insn_list; +struct _insn_list { + /* the instruction */ + insn_entry *insn; + /* list of non constant bits that have been made constant */ + opcode_bits *expanded_bits; + /* list of the various opcode field paths used to reach this + instruction */ + insn_opcodes *opcodes; + /* number of prefetched words for this instruction */ + int nr_prefetched_words; + /* The semantic function list_entry corresponding to this insn */ + insn_list *semantic; + /* linked list */ + insn_list *next; +}; + +/* forward */ +typedef struct _gen_list gen_list; + +typedef struct _gen_entry gen_entry; +struct _gen_entry { + + /* as an entry in a table */ + int word_nr; + int opcode_nr; + gen_entry *sibling; + opcode_bits *expanded_bits; + gen_entry *parent; /* parent has the opcode* data */ + + /* as a table containing entries */ + decode_table *opcode_rule; + opcode_field *opcode; + int nr_prefetched_words; + int nr_entries; + gen_entry *entries; + + /* as both an entry and a table */ + int nr_insns; + insn_list *insns; + + /* if siblings are being combined */ + gen_entry *combined_next; + gen_entry *combined_parent; + + /* our top-of-tree */ + gen_list *top; +}; + + +struct _gen_list { + model_entry *model; + insn_table *isa; + gen_entry *table; + gen_list *next; +}; + + +typedef struct _gen_table gen_table; +struct _gen_table { + /* list of all the instructions */ + insn_table *isa; + /* list of all the semantic functions */ + decode_table *rules; + /* list of all the generated instruction tables */ + gen_list *tables; + /* list of all the semantic functions */ + int nr_semantics; + insn_list *semantics; +}; + + +extern gen_table *make_gen_tables +(insn_table *isa, + decode_table *rules); + + +extern void gen_tables_expand_insns +(gen_table *gen); + +extern void gen_tables_expand_semantics +(gen_table *gen); + +extern int gen_entry_depth +(gen_entry *table); + + + +/* Traverse the created data structure */ + +typedef void gen_entry_handler +(lf *file, + gen_entry *entry, + int depth, + void *data); + +extern void gen_entry_traverse_tree +(lf *file, + gen_entry *table, + int depth, + gen_entry_handler *start, + gen_entry_handler *leaf, + gen_entry_handler *end, + void *data); + + + +/* Misc functions - actually in igen.c */ + + +/* Cache functions: */ + +extern int print_icache_function_formal +(lf *file, int nr_prefetched_words); + +extern int print_icache_function_actual +(lf *file, int nr_prefetched_words); + +extern int print_icache_function_type +(lf *file); + +extern int print_semantic_function_formal +(lf *file, int nr_prefetched_words); + +extern int print_semantic_function_actual +(lf *file, int nr_prefetched_words); + +extern int print_semantic_function_type +(lf *file); + +extern int print_idecode_function_formal +(lf *file, int nr_prefetched_words); + +extern int print_idecode_function_actual +(lf *file, int nr_prefetched_words); + +typedef enum { + function_name_prefix_semantics, + function_name_prefix_idecode, + function_name_prefix_itable, + function_name_prefix_icache, + function_name_prefix_engine, + function_name_prefix_none +} lf_function_name_prefixes; + +typedef enum { + is_function_declaration = 0, + is_function_definition = 1, + is_function_variable, +} function_decl_type; + +extern int print_function_name +(lf *file, + const char *basename, + const char *format_name, + const char *model_name, + opcode_bits *expanded_bits, + lf_function_name_prefixes prefix); + +extern void print_my_defines +(lf *file, + const char *basename, + const char *format_name, + opcode_bits *expanded_bits); + +extern void print_itrace +(lf *file, + insn_entry *insn, + int idecode); + +extern void print_sim_engine_abort +(lf *file, + const char *message); + + +extern void print_include (lf *file, igen_module module); +extern void print_include_inline (lf *file, igen_module module); +extern void print_includes (lf *file); + |