From 15f087598c3ce8704c69d6605b7796a6523d1bc7 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 10 Jun 2020 15:10:19 -0600 Subject: [PATCH] split simulation settings to a separated XML file --- libopenfpga/libarchopenfpga/CMakeLists.txt | 19 ++++------ .../arch/sample_simulation_setting.xml | 36 ++++++++++++++++++ .../src/read_xml_openfpga_arch.cpp | 32 ++++++++++++++++ .../src/read_xml_openfpga_arch.h | 2 + .../src/read_xml_simulation_setting.cpp | 20 +++++----- .../src/read_xml_simulation_setting.h | 5 ++- .../src/simulation_setting.cpp | 5 +++ .../libarchopenfpga/src/simulation_setting.h | 5 +++ .../src/write_xml_openfpga_arch.cpp | 24 +++++++++++- .../src/write_xml_openfpga_arch.h | 4 ++ .../src/write_xml_simulation_setting.cpp | 16 ++++---- .../src/write_xml_simulation_setting.h | 2 +- libopenfpga/libarchopenfpga/test/main.cpp | 37 ------------------- 13 files changed, 137 insertions(+), 70 deletions(-) create mode 100644 libopenfpga/libarchopenfpga/arch/sample_simulation_setting.xml delete mode 100644 libopenfpga/libarchopenfpga/test/main.cpp diff --git a/libopenfpga/libarchopenfpga/CMakeLists.txt b/libopenfpga/libarchopenfpga/CMakeLists.txt index b8a9a3fc1..d204718d7 100644 --- a/libopenfpga/libarchopenfpga/CMakeLists.txt +++ b/libopenfpga/libarchopenfpga/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.9) project("libarchopenfpga") -file(GLOB_RECURSE EXEC_SOURCES test/main.cpp) +file(GLOB_RECURSE EXEC_SOURCES test/*.cpp) file(GLOB_RECURSE LIB_SOURCES src/*.cpp) file(GLOB_RECURSE LIB_HEADERS src/*.h) files_to_dirs(LIB_HEADERS LIB_INCLUDE_DIRS) @@ -26,13 +26,10 @@ target_link_libraries(libarchopenfpga libpugiutil) #Create the test executable -add_executable(read_arch_openfpga ${EXEC_SOURCES}) -target_link_libraries(read_arch_openfpga libarchopenfpga) - -#Supress IPO link warnings if IPO is enabled -get_target_property(READ_ARCH_USES_IPO read_arch_openfpga INTERPROCEDURAL_OPTIMIZATION) -if (READ_ARCH_USES_IPO) - set_target_properties(read_arch_openfpga PROPERTIES LINK_FLAGS ${IPO_LINK_WARN_SUPRESS_FLAGS}) -endif() - -install(TARGETS libarchopenfpga read_arch_openfpga DESTINATION bin) +foreach(testsourcefile ${EXEC_SOURCES}) + # Use a simple string replace, to cut off .cpp. + get_filename_component(testname ${testsourcefile} NAME_WE) + add_executable(${testname} ${testsourcefile}) + # Make sure the library is linked to each test executable + target_link_libraries(${testname} libarchopenfpga) +endforeach(testsourcefile ${EXEC_SOURCES}) diff --git a/libopenfpga/libarchopenfpga/arch/sample_simulation_setting.xml b/libopenfpga/libarchopenfpga/arch/sample_simulation_setting.xml new file mode 100644 index 000000000..349a49a89 --- /dev/null +++ b/libopenfpga/libarchopenfpga/arch/sample_simulation_setting.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.cpp b/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.cpp index 4c773f87f..031946346 100644 --- a/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.cpp +++ b/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.cpp @@ -113,3 +113,35 @@ openfpga::Arch read_xml_openfpga_arch(const char* arch_file_name) { return openfpga_arch; } + +/******************************************************************** + * Top-level function to parse an XML file and load data to simulation settings + *******************************************************************/ +openfpga::SimulationSetting read_xml_openfpga_simulation_settings(const char* sim_setting_file_name) { + vtr::ScopedStartFinishTimer timer("Read OpenFPGA simulation settings"); + + openfpga::SimulationSetting openfpga_sim_setting; + + pugi::xml_node Next; + + /* Parse the file */ + pugi::xml_document doc; + pugiutil::loc_data loc_data; + + try { + loc_data = pugiutil::load_xml(doc, sim_setting_file_name); + + /* Second node should be */ + auto xml_simulation_settings = get_single_child(doc, "openfpga_simulation_setting", loc_data); + + /* Parse simulation settings to data structure */ + openfpga_sim_setting = read_xml_simulation_setting(xml_simulation_settings, loc_data); + + } catch (pugiutil::XmlError& e) { + archfpga_throw(sim_setting_file_name, e.line(), + "%s", e.what()); + } + + return openfpga_sim_setting; +} + diff --git a/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.h b/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.h index e23018c8f..660baeec0 100644 --- a/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.h +++ b/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.h @@ -12,4 +12,6 @@ *******************************************************************/ openfpga::Arch read_xml_openfpga_arch(const char* arch_file_name); +openfpga::SimulationSetting read_xml_openfpga_simulation_settings(const char* sim_setting_file_name); + #endif diff --git a/libopenfpga/libarchopenfpga/src/read_xml_simulation_setting.cpp b/libopenfpga/libarchopenfpga/src/read_xml_simulation_setting.cpp index 60821e2ed..6007a14bf 100644 --- a/libopenfpga/libarchopenfpga/src/read_xml_simulation_setting.cpp +++ b/libopenfpga/libarchopenfpga/src/read_xml_simulation_setting.cpp @@ -40,7 +40,7 @@ e_sim_accuracy_type string_to_sim_accuracy_type(const std::string& type_string) static void read_xml_clock_setting(pugi::xml_node& xml_clock_setting, const pugiutil::loc_data& loc_data, - SimulationSetting& sim_setting) { + openfpga::SimulationSetting& sim_setting) { /* Parse operating clock setting */ pugi::xml_node xml_operating_clock_setting = get_single_child(xml_clock_setting, "operating", loc_data); @@ -73,7 +73,7 @@ void read_xml_clock_setting(pugi::xml_node& xml_clock_setting, static void read_xml_simulator_option(pugi::xml_node& xml_sim_option, const pugiutil::loc_data& loc_data, - SimulationSetting& sim_setting) { + openfpga::SimulationSetting& sim_setting) { pugi::xml_node xml_operating_condition = get_single_child(xml_sim_option, "operating_condition", loc_data); sim_setting.set_simulation_temperature(get_attribute(xml_operating_condition, "temperature", loc_data).as_float(0.)); @@ -119,7 +119,7 @@ void read_xml_simulator_option(pugi::xml_node& xml_sim_option, static void read_xml_monte_carlo(pugi::xml_node& xml_mc, const pugiutil::loc_data& loc_data, - SimulationSetting& sim_setting) { + openfpga::SimulationSetting& sim_setting) { sim_setting.set_monte_carlo_simulation_points(get_attribute(xml_mc, "num_simulation_points", loc_data).as_int(0)); } @@ -129,7 +129,7 @@ void read_xml_monte_carlo(pugi::xml_node& xml_mc, static void read_xml_measurement_setting(pugi::xml_node& xml_measurement, const pugiutil::loc_data& loc_data, - SimulationSetting& sim_setting) { + openfpga::SimulationSetting& sim_setting) { pugi::xml_node xml_slew = get_single_child(xml_measurement, "slew", loc_data); pugi::xml_node xml_slew_rise = get_single_child(xml_slew, "rise", loc_data); sim_setting.set_measure_slew_upper_threshold(SIM_SIGNAL_RISE, get_attribute(xml_slew_rise, "upper_thres_pct", loc_data).as_float(0.)); @@ -155,7 +155,7 @@ void read_xml_measurement_setting(pugi::xml_node& xml_measurement, static void read_xml_stimulus_clock(pugi::xml_node& xml_stimuli_clock, const pugiutil::loc_data& loc_data, - SimulationSetting& sim_setting, + openfpga::SimulationSetting& sim_setting, const e_sim_signal_type& signal_type) { /* Find the type of accuracy */ const char* type_attr = get_attribute(xml_stimuli_clock, "slew_type", loc_data).value(); @@ -188,7 +188,7 @@ void read_xml_stimulus_clock(pugi::xml_node& xml_stimuli_clock, static void read_xml_stimulus_input(pugi::xml_node& xml_stimuli_input, const pugiutil::loc_data& loc_data, - SimulationSetting& sim_setting, + openfpga::SimulationSetting& sim_setting, const e_sim_signal_type& signal_type) { /* Find the type of accuracy */ const char* type_attr = get_attribute(xml_stimuli_input, "slew_type", loc_data).value(); @@ -221,7 +221,7 @@ void read_xml_stimulus_input(pugi::xml_node& xml_stimuli_input, static void read_xml_stimulus(pugi::xml_node& xml_stimulus, const pugiutil::loc_data& loc_data, - SimulationSetting& sim_setting) { + openfpga::SimulationSetting& sim_setting) { pugi::xml_node xml_clock = get_single_child(xml_stimulus, "clock", loc_data); pugi::xml_node xml_clock_rise = get_single_child(xml_clock, "rise", loc_data); read_xml_stimulus_clock(xml_clock_rise, loc_data, sim_setting, SIM_SIGNAL_RISE); @@ -240,9 +240,9 @@ void read_xml_stimulus(pugi::xml_node& xml_stimulus, /******************************************************************** * Parse XML codes about to an object of technology library *******************************************************************/ -SimulationSetting read_xml_simulation_setting(pugi::xml_node& Node, - const pugiutil::loc_data& loc_data) { - SimulationSetting sim_setting; +openfpga::SimulationSetting read_xml_simulation_setting(pugi::xml_node& Node, + const pugiutil::loc_data& loc_data) { + openfpga::SimulationSetting sim_setting; /* Parse clock settings */ pugi::xml_node xml_clock_setting = get_single_child(Node, "clock_setting", loc_data); diff --git a/libopenfpga/libarchopenfpga/src/read_xml_simulation_setting.h b/libopenfpga/libarchopenfpga/src/read_xml_simulation_setting.h index 801caad2e..df6f2856c 100644 --- a/libopenfpga/libarchopenfpga/src/read_xml_simulation_setting.h +++ b/libopenfpga/libarchopenfpga/src/read_xml_simulation_setting.h @@ -11,7 +11,8 @@ /******************************************************************** * Function declaration *******************************************************************/ -SimulationSetting read_xml_simulation_setting(pugi::xml_node& Node, - const pugiutil::loc_data& loc_data); + +openfpga::SimulationSetting read_xml_simulation_setting(pugi::xml_node& Node, + const pugiutil::loc_data& loc_data); #endif diff --git a/libopenfpga/libarchopenfpga/src/simulation_setting.cpp b/libopenfpga/libarchopenfpga/src/simulation_setting.cpp index 2e332a29d..63f20a90c 100644 --- a/libopenfpga/libarchopenfpga/src/simulation_setting.cpp +++ b/libopenfpga/libarchopenfpga/src/simulation_setting.cpp @@ -2,6 +2,9 @@ #include "simulation_setting.h" +/* namespace openfpga begins */ +namespace openfpga { + /************************************************************************ * Member functions for class SimulationSetting ***********************************************************************/ @@ -208,3 +211,5 @@ void SimulationSetting::set_stimuli_input_slew(const e_sim_signal_type& signal_t bool SimulationSetting::valid_signal_threshold(const float& threshold) const { return (0. < threshold) && (threshold < 1); } + +} /* namespace openfpga ends */ diff --git a/libopenfpga/libarchopenfpga/src/simulation_setting.h b/libopenfpga/libarchopenfpga/src/simulation_setting.h index f2e4add5c..7be1294eb 100644 --- a/libopenfpga/libarchopenfpga/src/simulation_setting.h +++ b/libopenfpga/libarchopenfpga/src/simulation_setting.h @@ -34,6 +34,9 @@ enum e_sim_accuracy_type { /* Strings correspond to each accuracy type */ constexpr std::array SIM_ACCURACY_TYPE_STRING = {{"frac", "abs"}}; +/* namespace openfpga begins */ +namespace openfpga { + /******************************************************************** * A data structure to describe simulation settings * @@ -211,4 +214,6 @@ class SimulationSetting { std::array input_slews_; }; +} /* namespace openfpga ends */ + #endif diff --git a/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.cpp b/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.cpp index 6d0a8ff06..468924ad2 100644 --- a/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.cpp +++ b/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.cpp @@ -20,7 +20,7 @@ #include "write_xml_openfpga_arch.h" /******************************************************************** - * A writer to output an OpenFPGAArch to XML format + * A writer to output an OpenFPGA arch database to XML format *******************************************************************/ void write_xml_openfpga_arch(const char* fname, const openfpga::Arch& openfpga_arch) { @@ -69,3 +69,25 @@ void write_xml_openfpga_arch(const char* fname, /* Close the file stream */ fp.close(); } + +/******************************************************************** + * A writer to output an OpenFPGA simulation setting database to XML format + *******************************************************************/ +void write_xml_openfpga_simulation_settings(const char* fname, + const openfpga::SimulationSetting& openfpga_sim_setting) { + vtr::ScopedStartFinishTimer timer("Write OpenFPGA simulation settings"); + + /* Create a file handler */ + std::fstream fp; + /* Open the file stream */ + fp.open(std::string(fname), std::fstream::out | std::fstream::trunc); + + /* Validate the file stream */ + openfpga::check_file_stream(fname, fp); + + /* Write the simulation */ + write_xml_simulation_setting(fp, fname, openfpga_sim_setting); + + /* Close the file stream */ + fp.close(); +} diff --git a/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.h b/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.h index 790d483f4..68611493f 100644 --- a/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.h +++ b/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.h @@ -13,4 +13,8 @@ void write_xml_openfpga_arch(const char* xml_fname, const openfpga::Arch& openfpga_arch); +void write_xml_openfpga_simulation_settings(const char* xml_fname, + const openfpga::SimulationSetting& openfpga_sim_setting); + + #endif diff --git a/libopenfpga/libarchopenfpga/src/write_xml_simulation_setting.cpp b/libopenfpga/libarchopenfpga/src/write_xml_simulation_setting.cpp index c5ff0beca..9403036c6 100644 --- a/libopenfpga/libarchopenfpga/src/write_xml_simulation_setting.cpp +++ b/libopenfpga/libarchopenfpga/src/write_xml_simulation_setting.cpp @@ -20,7 +20,7 @@ static void write_xml_clock_setting(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting) { + const openfpga::SimulationSetting& sim_setting) { /* Validate the file stream */ openfpga::check_file_stream(fname, fp); @@ -53,7 +53,7 @@ void write_xml_clock_setting(std::fstream& fp, static void write_xml_simulator_option(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting) { + const openfpga::SimulationSetting& sim_setting) { /* Validate the file stream */ openfpga::check_file_stream(fname, fp); @@ -87,7 +87,7 @@ void write_xml_simulator_option(std::fstream& fp, static void write_xml_monte_carlo(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting) { + const openfpga::SimulationSetting& sim_setting) { /* Validate the file stream */ openfpga::check_file_stream(fname, fp); @@ -111,7 +111,7 @@ void write_xml_monte_carlo(std::fstream& fp, static void write_xml_slew_measurement(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting, + const openfpga::SimulationSetting& sim_setting, const e_sim_signal_type& signal_type) { /* Validate the file stream */ openfpga::check_file_stream(fname, fp); @@ -130,7 +130,7 @@ void write_xml_slew_measurement(std::fstream& fp, static void write_xml_delay_measurement(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting, + const openfpga::SimulationSetting& sim_setting, const e_sim_signal_type& signal_type) { /* Validate the file stream */ openfpga::check_file_stream(fname, fp); @@ -149,7 +149,7 @@ void write_xml_delay_measurement(std::fstream& fp, static void write_xml_measurement(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting) { + const openfpga::SimulationSetting& sim_setting) { /* Validate the file stream */ openfpga::check_file_stream(fname, fp); @@ -174,7 +174,7 @@ void write_xml_measurement(std::fstream& fp, static void write_xml_stimulus(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting) { + const openfpga::SimulationSetting& sim_setting) { /* Validate the file stream */ openfpga::check_file_stream(fname, fp); @@ -216,7 +216,7 @@ void write_xml_stimulus(std::fstream& fp, *******************************************************************/ void write_xml_simulation_setting(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting) { + const openfpga::SimulationSetting& sim_setting) { /* Validate the file stream */ openfpga::check_file_stream(fname, fp); diff --git a/libopenfpga/libarchopenfpga/src/write_xml_simulation_setting.h b/libopenfpga/libarchopenfpga/src/write_xml_simulation_setting.h index 1c23ef0ca..d0581a8c6 100644 --- a/libopenfpga/libarchopenfpga/src/write_xml_simulation_setting.h +++ b/libopenfpga/libarchopenfpga/src/write_xml_simulation_setting.h @@ -12,6 +12,6 @@ *******************************************************************/ void write_xml_simulation_setting(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting); + const openfpga::SimulationSetting& sim_setting); #endif diff --git a/libopenfpga/libarchopenfpga/test/main.cpp b/libopenfpga/libarchopenfpga/test/main.cpp deleted file mode 100644 index 7974cf258..000000000 --- a/libopenfpga/libarchopenfpga/test/main.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/******************************************************************** - * Unit test functions to validate the correctness of - * 1. parser of data structures - * 2. writer of data structures - *******************************************************************/ -/* Headers from vtrutils */ -#include "vtr_assert.h" -#include "vtr_log.h" - -/* Headers from readarchopenfpga */ -#include "check_circuit_library.h" -#include "read_xml_openfpga_arch.h" -#include "write_xml_openfpga_arch.h" - -int main(int argc, const char** argv) { - /* Ensure we have only one or two argument */ - VTR_ASSERT((2 == argc) || (3 == argc)); - - /* Parse the circuit library from an XML file */ - const openfpga::Arch& openfpga_arch = read_xml_openfpga_arch(argv[1]); - VTR_LOG("Parsed %lu circuit models from XML into circuit library.\n", - openfpga_arch.circuit_lib.num_models()); - - /* Check the circuit library */ - check_circuit_library(openfpga_arch.circuit_lib); - - /* Output the circuit library to an XML file - * This is optional only used when there is a second argument - */ - if (3 <= argc) { - write_xml_openfpga_arch(argv[2], openfpga_arch); - VTR_LOG("Echo the OpenFPGA architecture to an XML file: %s.\n", - argv[2]); - } -} - -