From b0be9fe75d82984fa34495d8c05c76e772f77c52 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 10 Apr 2024 15:51:26 -0700 Subject: [PATCH] [core] developing xml writer for fabric pin phy loc --- ...write_xml_fabric_pin_physical_location.cpp | 107 ++++++++++++++++-- 1 file changed, 100 insertions(+), 7 deletions(-) diff --git a/openfpga/src/fabric/write_xml_fabric_pin_physical_location.cpp b/openfpga/src/fabric/write_xml_fabric_pin_physical_location.cpp index ab6ac5703..89a2f50c7 100644 --- a/openfpga/src/fabric/write_xml_fabric_pin_physical_location.cpp +++ b/openfpga/src/fabric/write_xml_fabric_pin_physical_location.cpp @@ -1,6 +1,12 @@ /*************************************************************************************** - * Output internal structure of DeviceRRGSB to XML format + * Output internal structure of module graph to XML format ***************************************************************************************/ +/* Headers from system goes first */ +#include +#include +#include +#include + /* Headers from vtrutil library */ #include "vtr_assert.h" #include "vtr_log.h" @@ -8,12 +14,80 @@ /* Headers from openfpgautil library */ #include "openfpga_digest.h" +#include "command_exit_codes.h" + +/* Headers from arch openfpga library */ +#include "write_xml_utils.h" + #include "fabric_pin_physical_location_xml_constants.h" #include "write_xml_fabric_pin_physical_location.h" /* begin namespace openfpga */ namespace openfpga { +/******************************************************************** + * This function write header information to a pin location file + *******************************************************************/ +static void write_xml_fabric_pin_physical_location_file_head( + std::fstream& fp, const bool& include_time_stamp) { + valid_file_stream(fp); + + fp << "" << std::endl; + fp << std::endl; +} + +/******************************************************************** + * This function write header information to a pin location file + *******************************************************************/ +static int write_xml_fabric_module_pin_phy_loc( + std::fstream& fp, const ModuleManager& module_manager, const ModuleId& curr_module) { + valid_file_stream(fp); + + /* Print a head */ + write_tab_to_file(fp, 1); + fp << "<" << XML_MODULE_NODE_NAME; + write_xml_attribute(fp, XML_MODULE_ATTRIBUTE_NAME, module_manager.module_name(curr_module).c_str()); + fp << ">" + << "\n"; + + for (ModulePortId curr_port_id : module_manager.module_ports(curr_module)) { + BasicPort curr_port = module_manager.module_port(curr_module, curr_port_id); + for (int curr_pin_id : curr_port.pins()) { + BasicPort curr_pin(curr_port.get_name(), curr_pin_id, curr_pin_id); + std::string curr_port_str = generate_xml_port_name(curr_pin); + SideManager side_mgr(module_manager.module_pin_side(curr_module, curr_port_id, curr_pin_id)); + write_tab_to_file(fp, 2); + fp << "<" << XML_MODULE_PINLOC_NODE_NAME; + write_xml_attribute(fp, XML_MODULE_PINLOC_ATTRIBUTE_PIN, curr_port_str.c_str()); + write_xml_attribute(fp, XML_MODULE_PINLOC_ATTRIBUTE_SIDE, side_mgr.c_str()); + fp << "/>" + fp << std::endl; + } + } + + /* Print a tail */ + write_tab_to_file(fp, 1); + fp << "" + << "\n"; + + return CMD_EXEC_SUCCESS; +} + +/******************************************************************** + * Top-level function + *******************************************************************/ int write_xml_fabric_pin_physical_location( const char* fname, const std::string& module_name, const ModuleGraph& module_manager, @@ -37,11 +111,30 @@ int write_xml_fabric_pin_physical_location( fp << ">" << "\n"; - int err_code = 0; - - /* Write each port */ - - + /* If module name is not specified, walk through all the modules and write physical pin location when any is specified */ + cnt = 0; + if (module_name.empty()) { + for (ModuleId curr_module : module_manager.modules()) { + int err_code = write_xml_fabric_module_pin_phy_loc(fp, curr_module); + if (err_code != CMD_EXEC_SUCESS) { + return CMD_EXEC_FATAL_ERROR; + } + cnt++; + } + } else { + /* Check if the module name is valid or not, if not, error out */ + ModuleId curr_module = module_manager.find_module(module_name); + if (!module_manager.valid_module_id(curr_module)) { + VTR_LOG_ERROR("Invalid module name '%s' which does not exist in current fabric!\n", module_name.c_str()); + return CMD_EXEC_FATAL_ERROR; + } + /* Write the pin physical location for this module */ + int err_code = write_xml_fabric_module_pin_phy_loc(fp, curr_module); + if (err_code != CMD_EXEC_SUCESS) { + return CMD_EXEC_FATAL_ERROR; + } + cnt++; + } /* Finish writing the root node */ fp << "" @@ -52,5 +145,5 @@ int write_xml_fabric_pin_physical_location( VTR_LOGV(verbose, "Outputted %lu modules with pin physical location.\n", cnt); - return err_code; + return CMD_EXEC_SUCCESS; } /* end namespace openfpga */