diff --git a/openfpga/src/base/openfpga_build_fabric_template.h b/openfpga/src/base/openfpga_build_fabric_template.h index 466702530..18825759e 100644 --- a/openfpga/src/base/openfpga_build_fabric_template.h +++ b/openfpga/src/base/openfpga_build_fabric_template.h @@ -525,7 +525,7 @@ int write_unique_blocks_template(T& openfpga_ctx, const Command& cmd, /* Write unique blocks to a file */ if (file_type == "xml") { - return write_xml_unique_blocks(openfpga_ctx.mutable_device_rr_gsb(), + return write_xml_unique_blocks(openfpga_ctx.device_rr_gsb(), file_name.c_str(), cmd_context.option_enable(cmd, opt_verbose)); } else { diff --git a/openfpga/src/fabric/read_xml_unique_blocks.cpp b/openfpga/src/fabric/read_xml_unique_blocks.cpp index e754aef40..0888e390c 100644 --- a/openfpga/src/fabric/read_xml_unique_blocks.cpp +++ b/openfpga/src/fabric/read_xml_unique_blocks.cpp @@ -34,12 +34,26 @@ *******************************************************************/ namespace openfpga { -vtr::Point read_xml_unique_instance_info( - pugi::xml_node& xml_instance_info, const pugiutil::loc_data& loc_data) { - int instance_x = get_attribute(xml_instance_info, "x", loc_data).as_int(); - int instance_y = get_attribute(xml_instance_info, "y", loc_data).as_int(); - vtr::Point instance_coordinate(instance_x, instance_y); - return instance_coordinate; +std::vector> read_xml_unique_instance_coords( + const pugi::xml_node& xml_block_info, const pugiutil::loc_data& loc_data) { + std::vector> instance_coords; + for (pugi::xml_node xml_instance_info : xml_block_info.children()) { + if (xml_instance_info.name() == std::string("instance")) { + int instance_x = get_attribute(xml_instance_info, "x", loc_data).as_int(); + int instance_y = get_attribute(xml_instance_info, "y", loc_data).as_int(); + vtr::Point instance_coordinate(instance_x, instance_y); + instance_coords.push_back(instance_coordinate); + } + } + return instance_coords; +} + +vtr::Point read_xml_unique_block_coord( + const pugi::xml_node& xml_block_info, const pugiutil::loc_data& loc_data) { + int block_x = get_attribute(xml_block_info, "x", loc_data).as_int(); + int block_y = get_attribute(xml_block_info, "y", loc_data).as_int(); + vtr::Point block_coordinate(block_x, block_y); + return block_coordinate; } void report_unique_module_status_read(const DeviceRRGSB& device_rr_gsb, @@ -113,17 +127,11 @@ int read_xml_unique_blocks(DeviceRRGSB& device_rr_gsb, const char* file_name, if (xml_block_info.name() == std::string("block")) { std::string type = get_attribute(xml_block_info, "type", loc_data).as_string(); - int block_x = get_attribute(xml_block_info, "x", loc_data).as_int(); - int block_y = get_attribute(xml_block_info, "y", loc_data).as_int(); - vtr::Point block_coordinate(block_x, block_y); - std::vector> instance_coords; - for (pugi::xml_node xml_instance_info : xml_block_info.children()) { - if (xml_instance_info.name() == std::string("instance")) { - auto instance_coordinate = - read_xml_unique_instance_info(xml_instance_info, loc_data); - instance_coords.push_back(instance_coordinate); - } - } + vtr::Point block_coordinate = + read_xml_unique_block_coord(xml_block_info, loc_data); + std::vector> instance_coords = + read_xml_unique_instance_coords(xml_block_info, loc_data); + /* get block coordinate and instance coordinate, try to setup * device_rr_gsb */ if (type == "sb") { diff --git a/openfpga/src/fabric/read_xml_unique_blocks.h b/openfpga/src/fabric/read_xml_unique_blocks.h index c2e3a06cd..b1885fca7 100644 --- a/openfpga/src/fabric/read_xml_unique_blocks.h +++ b/openfpga/src/fabric/read_xml_unique_blocks.h @@ -30,10 +30,15 @@ *******************************************************************/ namespace openfpga { -vtr::Point read_xml_unique_instance_info( - pugi::xml_node& xml_instance_info, const pugiutil::loc_data& loc_data); +std::vector> read_xml_unique_instance_coords( + const pugi::xml_node& xml_block_info, const pugiutil::loc_data& loc_data); + +vtr::Point read_xml_unique_block_coord( + const pugi::xml_node& xml_block_info, const pugiutil::loc_data& loc_data); + void report_unique_module_status_read(const DeviceRRGSB& device_rr_gsb, bool verbose_output); + int read_xml_unique_blocks(DeviceRRGSB& device_rr_gsb, const char* file_name, bool verbose_output); } // namespace openfpga