static void gen_icache_h(insn_table *table, lf *file, igen_code generate) { lf_printf(file, "typedef %s idecode_icache\n(%s);\n", ICACHE_FUNCTION_TYPE, ICACHE_FUNCTION_FORMAL); lf_printf(file, "\n"); if ((code & generate_calls) && (code & generate_with_icache)) { insn_table_traverse_function(table, file, NULL, print_icache_internal_function_declaration); if (generate_expanded_instructions) insn_table_traverse_tree(table, file, NULL, 1, NULL, /* start */ print_icache_declaration, /* leaf */ NULL, /* end */ NULL); /* padding */ else insn_table_traverse_insn(table, file, NULL, print_icache_declaration); } else { lf_print__this_file_is_empty(file); } }
static void gen_semantics_h(insn_table *table, lf *file, igen_code generate) { lf_printf(file, "typedef %s idecode_semantic\n(%s);\n", SEMANTIC_FUNCTION_TYPE, SEMANTIC_FUNCTION_FORMAL); lf_printf(file, "\n"); if ((code & generate_calls)) { lf_printf(file, "extern int option_mpc860c0;\n"); lf_printf(file, "#define PAGE_SIZE 0x1000\n"); lf_printf(file, "\n"); lf_printf(file, "PSIM_EXTERN_SEMANTICS(void)\n"); lf_printf(file, "semantic_init(device* root);\n"); lf_printf(file, "\n"); if (generate_expanded_instructions) insn_table_traverse_tree(table, file, NULL, 1, NULL, /* start */ print_semantic_declaration, /* leaf */ NULL, /* end */ NULL); /* padding */ else insn_table_traverse_insn(table, file, NULL, print_semantic_declaration); } else { lf_print__this_file_is_empty(file); } }
static void gen_semantics_c (lf *file, insn_list *semantics, cache_entry *cache_rules) { if (options.gen.code == generate_calls) { insn_list *semantic; print_includes (file); print_include (file, options.module.semantics); lf_printf (file, "\n"); for (semantic = semantics; semantic != NULL; semantic = semantic->next) { /* Ignore any special/internal instructions */ if (semantic->insn->nr_words == 0) continue; print_semantic_definition (file, semantic->insn, semantic->expanded_bits, semantic->opcodes, cache_rules, semantic->nr_prefetched_words); } } else { lf_print__this_file_is_empty (file, "generating jump engine"); } }
static void gen_idecode_c (lf *file, gen_table *gen, insn_table *isa, cache_entry *cache_rules) { /* the intro */ print_includes (file); print_include_inline (file, options.module.semantics); lf_printf (file, "\n"); print_idecode_globals (file); lf_printf (file, "\n"); switch (options.gen.code) { case generate_calls: { gen_list *entry; for (entry = gen->tables; entry != NULL; entry = entry->next) { print_idecode_lookups (file, entry->table, cache_rules); /* output the main idecode routine */ if (!options.gen.icache) { print_idecode_issue_function_header (file, (options.gen.multi_sim ? entry->model->name : NULL), 1/*is definition*/, 1/*ALWAYS ONE WORD*/); lf_printf (file, "{\n"); lf_indent (file, +2); lf_printf (file, "%sinstruction_address nia;\n", options.module.global.prefix.l); print_idecode_body (file, entry->table, "nia ="); lf_printf (file, "return nia;"); lf_indent (file, -2); lf_printf (file, "}\n"); } } break; } case generate_jumps: { lf_print__this_file_is_empty (file, "generating a jump engine"); break; } } }
static void gen_semantics_c(insn_table *table, cache_table *cache_rules, lf *file, igen_code generate) { if ((code & generate_calls)) { lf_printf(file, "\n"); lf_printf(file, "#include \"cpu.h\"\n"); lf_printf(file, "#include \"idecode.h\"\n"); lf_printf(file, "#include \"semantics.h\"\n"); lf_printf(file, "#ifdef HAVE_COMMON_FPU\n"); lf_printf(file, "#include \"sim-inline.h\"\n"); lf_printf(file, "#include \"sim-fpu.h\"\n"); lf_printf(file, "#endif\n"); lf_printf(file, "#include \"support.h\"\n"); lf_printf(file, "\n"); lf_printf(file, "int option_mpc860c0 = 0;\n"); lf_printf(file, "\n"); lf_printf(file, "PSIM_EXTERN_SEMANTICS(void)\n"); lf_printf(file, "semantic_init(device* root)\n"); lf_printf(file, "{\n"); lf_printf(file, " option_mpc860c0 = 0;\n"); lf_printf(file, " if (tree_find_property(root, \"/options/mpc860c0\"))\n"); lf_printf(file, " option_mpc860c0 = tree_find_integer_property(root, \"/options/mpc860c0\");\n"); lf_printf(file, " option_mpc860c0 *= 4; /* convert word count to byte count */\n"); lf_printf(file, "}\n"); lf_printf(file, "\n"); if (generate_expanded_instructions) insn_table_traverse_tree(table, file, cache_rules, 1, NULL, /* start */ print_semantic_definition, /* leaf */ NULL, /* end */ NULL); /* padding */ else insn_table_traverse_insn(table, file, cache_rules, print_semantic_definition); } else { lf_print__this_file_is_empty(file); } }
static void gen_icache_c(insn_table *table, cache_table *cache_rules, lf *file, igen_code generate) { /* output `internal' invalid/floating-point unavailable functions where needed */ if ((code & generate_calls) && (code & generate_with_icache)) { lf_printf(file, "\n"); lf_printf(file, "#include \"cpu.h\"\n"); lf_printf(file, "#include \"idecode.h\"\n"); lf_printf(file, "#include \"semantics.h\"\n"); lf_printf(file, "#include \"icache.h\"\n"); lf_printf(file, "#ifdef HAVE_COMMON_FPU\n"); lf_printf(file, "#include \"sim-inline.h\"\n"); lf_printf(file, "#include \"sim-fpu.h\"\n"); lf_printf(file, "#endif\n"); lf_printf(file, "#include \"support.h\"\n"); lf_printf(file, "\n"); insn_table_traverse_function(table, file, NULL, print_icache_internal_function_definition); lf_printf(file, "\n"); if (generate_expanded_instructions) insn_table_traverse_tree(table, file, cache_rules, 1, NULL, /* start */ print_icache_definition, /* leaf */ NULL, /* end */ NULL); /* padding */ else insn_table_traverse_insn(table, file, cache_rules, print_icache_definition); } else { lf_print__this_file_is_empty(file); } }
static void gen_semantics_h (lf *file, insn_list *semantics, int max_nr_words) { int word_nr; insn_list *semantic; for (word_nr = -1; word_nr <= max_nr_words; word_nr++) { lf_printf (file, "typedef "); print_semantic_function_type (file); lf_printf (file, " %sidecode_semantic", options.module.global.prefix.l); if (word_nr >= 0) lf_printf (file, "_%d", word_nr); lf_printf (file, "\n("); lf_indent (file, +1); print_semantic_function_formal (file, word_nr); lf_indent (file, -1); lf_printf (file, ");\n"); lf_printf (file, "\n"); } switch (options.gen.code) { case generate_calls: for (semantic = semantics; semantic != NULL; semantic = semantic->next) { /* Ignore any special/internal instructions */ if (semantic->insn->nr_words == 0) continue; print_semantic_declaration (file, semantic->insn, semantic->expanded_bits, semantic->opcodes, semantic->nr_prefetched_words); } break; case generate_jumps: lf_print__this_file_is_empty (file, "generating jumps"); break; } }
static void gen_icache_h (lf *file, insn_list *semantic, function_entry *functions, int max_nr_words) { int word_nr; for (word_nr = 0; word_nr <= max_nr_words; word_nr++) { lf_printf (file, "typedef "); print_icache_function_type(file); lf_printf (file, " %sidecode_icache_%d\n(", options.module.global.prefix.l, word_nr); print_icache_function_formal(file, word_nr); lf_printf (file, ");\n"); lf_printf (file, "\n"); } if (options.gen.code == generate_calls && options.gen.icache) { function_entry_traverse (file, functions, print_icache_internal_function_declaration, NULL); while (semantic != NULL) { print_icache_declaration (file, semantic->insn, semantic->expanded_bits, semantic->opcodes, semantic->nr_prefetched_words); semantic = semantic->next; } } else { lf_print__this_file_is_empty (file, "generating jump engine"); } }
static void gen_icache_c (lf *file, insn_list *semantic, function_entry *functions, cache_entry *cache_rules) { /* output `internal' invalid/floating-point unavailable functions where needed */ if (options.gen.code == generate_calls && options.gen.icache) { lf_printf (file, "\n"); lf_printf (file, "#include \"cpu.h\"\n"); lf_printf (file, "#include \"idecode.h\"\n"); lf_printf (file, "#include \"semantics.h\"\n"); lf_printf (file, "#include \"icache.h\"\n"); lf_printf (file, "#include \"support.h\"\n"); lf_printf (file, "\n"); function_entry_traverse (file, functions, print_icache_internal_function_definition, NULL); lf_printf (file, "\n"); while (semantic != NULL) { print_icache_definition (file, semantic->insn, semantic->expanded_bits, semantic->opcodes, cache_rules, semantic->nr_prefetched_words); semantic = semantic->next; } } else { lf_print__this_file_is_empty (file, "generating jump engine"); } }
void gen_model_c (lf *file, insn_table *table) { lf_print__this_file_is_empty (file, "suffering bit rot"); }