diff --git a/c_emulator/CMakeLists.txt b/c_emulator/CMakeLists.txt index 87447cfc1..4019131dd 100644 --- a/c_emulator/CMakeLists.txt +++ b/c_emulator/CMakeLists.txt @@ -29,6 +29,7 @@ foreach (xlen IN ITEMS 32 64) add_executable(riscv_sim_${arch} "${CMAKE_BINARY_DIR}/riscv_model_${arch}.c" + "${CMAKE_BINARY_DIR}/riscv_model_${arch}.h" ${EMULATOR_COMMON_SRCS} ) # The generated model is not warnings-clean, silence them. @@ -56,6 +57,15 @@ foreach (xlen IN ITEMS 32 64) target_include_directories(riscv_sim_${arch} # So the generated C can find riscv_platform/prelude.h" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" + # So we can find riscv_model_${arch}.h + "${CMAKE_BINARY_DIR}" + ) + + # This is necessary so it can pick the right riscv_model_${arch}.h + # to #include. We can remove it when there is a single model with + # runtime xlen and flen. + target_compile_definitions(riscv_sim_${arch} + PRIVATE "RISCV_MODEL_HEADER=" ) if (arch MATCHES "rvfi") diff --git a/c_emulator/riscv_sail.h b/c_emulator/riscv_sail.h index 67e0ad759..2ff16f60e 100644 --- a/c_emulator/riscv_sail.h +++ b/c_emulator/riscv_sail.h @@ -1,76 +1,18 @@ -/* Top-level interfaces to the Sail model. - Ideally, this would be autogenerated. - */ +#pragma once + +// The header generated by Sail. +#include RISCV_MODEL_HEADER #ifdef __cplusplus extern "C" { #endif -typedef int unit; -#define UNIT 0 -typedef uint64_t mach_bits; - -struct zMisa { - mach_bits zMisa_chunk_0; -}; -extern struct zMisa zmisa; - -void model_init(void); -void model_fini(void); - -unit zinit_model(unit); -bool zstep(sail_int); -unit ztick_clock(unit); -unit ztick_platform(unit); - -#ifdef RVFI_DII -unit zrvfi_set_instr_packet(mach_bits); -mach_bits zrvfi_get_cmd(unit); -mach_bits zrvfi_get_insn(unit); -bool zrvfi_step(sail_int); -unit zrvfi_zzero_exec_packet(unit); -unit zrvfi_halt_exec_packet(unit); -void zrvfi_get_exec_packet_v1(sail_bits *rop, unit); -void zrvfi_get_exec_packet_v2(sail_bits *rop, unit); -extern bool zrvfi_int_data_present; -void zrvfi_get_int_data(sail_bits *rop, unit); -extern bool zrvfi_mem_data_present; -void zrvfi_get_mem_data(sail_bits *rop, unit); -void zrvfi_get_v2_support_packet(sail_bits *rop, unit); - -// Debugging prints -unit zprint_rvfi_exec(unit); -unit zprint_instr_packet(uint64_t); -#endif +// The generated header does not include these functions. +void model_init(); +void model_fini(); extern mach_bits zxlen_val; -extern bool zhtif_done; -extern mach_bits zhtif_exit_code; -extern bool have_exception; - -/* machine state */ - -extern uint32_t zcur_privilege; - -extern mach_bits zPC; - -extern mach_bits zx1, zx2, zx3, zx4, zx5, zx6, zx7, zx8, zx9, zx10, zx11, zx12, - zx13, zx14, zx15, zx16, zx17, zx18, zx19, zx20, zx21, zx22, zx23, zx24, - zx25, zx26, zx27, zx28, zx29, zx30, zx31; - -extern mach_bits zmstatus; -extern mach_bits zmepc, zmtval; -extern mach_bits zsepc, zstval; - -extern mach_bits zfloat_result, zfloat_fflags; - -struct zMcause { - mach_bits zMcause_chunk_0; -}; -extern struct zMcause zmcause, zscause; - -extern mach_bits zminstret; #ifdef __cplusplus -} // extern "C" +} #endif diff --git a/model/CMakeLists.txt b/model/CMakeLists.txt index 817c222fa..717c03d65 100644 --- a/model/CMakeLists.txt +++ b/model/CMakeLists.txt @@ -210,6 +210,7 @@ foreach (xlen IN ITEMS 32 64) if (NOT variant OR variant STREQUAL "rvfi") set(c_model_no_ext "${CMAKE_BINARY_DIR}/riscv_model_${arch}") set(c_model "${c_model_no_ext}.c") + set(c_model_header "${c_model_no_ext}.h") if (COVERAGE) set(branch_info_file "${c_model_no_ext}.branch_info") @@ -221,7 +222,7 @@ foreach (xlen IN ITEMS 32 64) add_custom_command( DEPENDS ${sail_srcs} - OUTPUT ${c_model} ${branch_info_file} + OUTPUT ${c_model} ${c_model_header} ${branch_info_file} VERBATIM COMMENT "Building C code from Sail model (${arch})" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} @@ -245,13 +246,14 @@ foreach (xlen IN ITEMS 32 64) --memo-z3 # Output C code. -c + # Generate a C header too. + --c-generate-header # Don't generate a main() function. --c-no-main # Extra #include's. --c-include riscv_prelude.h --c-include riscv_platform.h - # Don't dead-code eliminate these functions. These should match the - # ones used from riscv_sail.h + # Don't dead-code eliminate these functions. --c-preserve init_model --c-preserve step --c-preserve tick_clock @@ -274,7 +276,7 @@ foreach (xlen IN ITEMS 32 64) ${sail_srcs} ) - add_custom_target(generated_model_${arch} DEPENDS ${c_model}) + add_custom_target(generated_model_${arch} DEPENDS ${c_model} ${c_model_header}) endif() if (NOT variant)