[lib] now use constants in xml io for fabric key

This commit is contained in:
tangxifan 2023-07-04 21:04:21 -07:00
parent 93158bdc62
commit c2020d6cef
3 changed files with 132 additions and 59 deletions

View File

@ -0,0 +1,26 @@
#ifndef FABRIC_KEY_XML_CONSTANTS_H
#define FABRIC_KEY_XML_CONSTANTS_H
/* Constants required by XML parser */
constexpr const char* XML_FABRIC_KEY_ROOT_NAME = "fabric_key";
constexpr const char* XML_FABRIC_KEY_REGION_NODE_NAME = "region";
constexpr const char* XML_FABRIC_KEY_REGION_ATTRIBUTE_ID_NAME = "id";
constexpr const char* XML_FABRIC_KEY_KEY_NODE_NAME = "key";
constexpr const char* XML_FABRIC_KEY_KEY_ATTRIBUTE_ID_NAME = "id";
constexpr const char* XML_FABRIC_KEY_KEY_ATTRIBUTE_ALIAS_NAME = "alias";
constexpr const char* XML_FABRIC_KEY_KEY_ATTRIBUTE_NAME_NAME = "name";
constexpr const char* XML_FABRIC_KEY_KEY_ATTRIBUTE_VALUE_NAME = "value";
constexpr const char* XML_FABRIC_KEY_KEY_ATTRIBUTE_COLUMN_NAME = "column";
constexpr const char* XML_FABRIC_KEY_KEY_ATTRIBUTE_ROW_NAME = "row";
constexpr const char* XML_FABRIC_KEY_BL_SHIFT_REGISTER_BANKS_NODE_NAME =
"bl_shift_register_banks";
constexpr const char* XML_FABRIC_KEY_WL_SHIFT_REGISTER_BANKS_NODE_NAME =
"wl_shift_register_banks";
constexpr const char* XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_NODE_NAME =
"bank";
constexpr const char*
XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_ATTRIBUTE_ID_NAME = "id";
constexpr const char*
XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_ATTRIBUTE_RANGE_NAME = "range";
#endif

View File

@ -19,6 +19,7 @@
/* Headers from libarchfpga */ /* Headers from libarchfpga */
#include "arch_error.h" #include "arch_error.h"
#include "fabric_key_xml_constants.h"
#include "read_xml_fabric_key.h" #include "read_xml_fabric_key.h"
#include "read_xml_util.h" #include "read_xml_util.h"
@ -30,7 +31,10 @@ static void read_xml_region_key(pugi::xml_node& xml_component_key,
FabricKey& fabric_key, FabricKey& fabric_key,
const FabricRegionId& fabric_region) { const FabricRegionId& fabric_region) {
/* Find the id of component key */ /* Find the id of component key */
const size_t& id = get_attribute(xml_component_key, "id", loc_data).as_int(); const size_t& id =
get_attribute(xml_component_key, XML_FABRIC_KEY_KEY_ATTRIBUTE_ID_NAME,
loc_data)
.as_int();
if (false == fabric_key.valid_key_id(FabricKeyId(id))) { if (false == fabric_key.valid_key_id(FabricKeyId(id))) {
archfpga_throw(loc_data.filename_c_str(), loc_data.line(xml_component_key), archfpga_throw(loc_data.filename_c_str(), loc_data.line(xml_component_key),
@ -41,8 +45,9 @@ static void read_xml_region_key(pugi::xml_node& xml_component_key,
VTR_ASSERT_SAFE(true == fabric_key.valid_key_id(FabricKeyId(id))); VTR_ASSERT_SAFE(true == fabric_key.valid_key_id(FabricKeyId(id)));
/* If we have an alias, set the value as well */ /* If we have an alias, set the value as well */
const std::string& alias = get_attribute(xml_component_key, "alias", loc_data, const std::string& alias =
pugiutil::ReqOpt::OPTIONAL) get_attribute(xml_component_key, XML_FABRIC_KEY_KEY_ATTRIBUTE_ALIAS_NAME,
loc_data, pugiutil::ReqOpt::OPTIONAL)
.as_string(); .as_string();
if (!alias.empty()) { if (!alias.empty()) {
fabric_key.set_key_alias(FabricKeyId(id), alias); fabric_key.set_key_alias(FabricKeyId(id), alias);
@ -57,10 +62,12 @@ static void read_xml_region_key(pugi::xml_node& xml_component_key,
} }
const std::string& name = const std::string& name =
get_attribute(xml_component_key, "name", loc_data, required_name_value) get_attribute(xml_component_key, XML_FABRIC_KEY_KEY_ATTRIBUTE_NAME_NAME,
loc_data, required_name_value)
.as_string(); .as_string();
const size_t& value = const size_t& value =
get_attribute(xml_component_key, "value", loc_data, required_name_value) get_attribute(xml_component_key, XML_FABRIC_KEY_KEY_ATTRIBUTE_VALUE_NAME,
loc_data, required_name_value)
.as_int(); .as_int();
fabric_key.set_key_name(FabricKeyId(id), name); fabric_key.set_key_name(FabricKeyId(id), name);
@ -69,10 +76,12 @@ static void read_xml_region_key(pugi::xml_node& xml_component_key,
/* Parse coordinates */ /* Parse coordinates */
vtr::Point<int> coord; vtr::Point<int> coord;
coord.set_x(get_attribute(xml_component_key, "column", loc_data, coord.set_x(get_attribute(xml_component_key,
XML_FABRIC_KEY_KEY_ATTRIBUTE_COLUMN_NAME, loc_data,
pugiutil::ReqOpt::OPTIONAL) pugiutil::ReqOpt::OPTIONAL)
.as_int(-1)); .as_int(-1));
coord.set_y(get_attribute(xml_component_key, "row", loc_data, coord.set_y(get_attribute(xml_component_key,
XML_FABRIC_KEY_KEY_ATTRIBUTE_ROW_NAME, loc_data,
pugiutil::ReqOpt::OPTIONAL) pugiutil::ReqOpt::OPTIONAL)
.as_int(-1)); .as_int(-1));
if (fabric_key.valid_key_coordinate(coord)) { if (fabric_key.valid_key_coordinate(coord)) {
@ -88,8 +97,11 @@ static void read_xml_region_bl_shift_register_bank(
pugi::xml_node& xml_bank, const pugiutil::loc_data& loc_data, pugi::xml_node& xml_bank, const pugiutil::loc_data& loc_data,
FabricKey& fabric_key, const FabricRegionId& fabric_region) { FabricKey& fabric_key, const FabricRegionId& fabric_region) {
/* Find the id of the bank */ /* Find the id of the bank */
FabricBitLineBankId bank_id = FabricBitLineBankId bank_id = FabricBitLineBankId(
FabricBitLineBankId(get_attribute(xml_bank, "id", loc_data).as_int()); get_attribute(xml_bank,
XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_ATTRIBUTE_ID_NAME,
loc_data)
.as_int());
if (!fabric_key.valid_bl_bank_id(fabric_region, bank_id)) { if (!fabric_key.valid_bl_bank_id(fabric_region, bank_id)) {
archfpga_throw(loc_data.filename_c_str(), loc_data.line(xml_bank), archfpga_throw(loc_data.filename_c_str(), loc_data.line(xml_bank),
@ -101,7 +113,10 @@ static void read_xml_region_bl_shift_register_bank(
/* Parse the ports */ /* Parse the ports */
std::string data_ports = std::string data_ports =
get_attribute(xml_bank, "range", loc_data).as_string(); get_attribute(xml_bank,
XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_ATTRIBUTE_RANGE_NAME,
loc_data)
.as_string();
/* Split with ',' if we have multiple ports */ /* Split with ',' if we have multiple ports */
openfpga::StringToken tokenizer(data_ports); openfpga::StringToken tokenizer(data_ports);
for (const std::string& data_port : tokenizer.split(',')) { for (const std::string& data_port : tokenizer.split(',')) {
@ -117,8 +132,9 @@ static void read_xml_region_bl_shift_register_bank(
static void read_xml_region_bl_shift_register_banks( static void read_xml_region_bl_shift_register_banks(
pugi::xml_node& xml_bl_bank, const pugiutil::loc_data& loc_data, pugi::xml_node& xml_bl_bank, const pugiutil::loc_data& loc_data,
FabricKey& fabric_key, const FabricRegionId& fabric_region) { FabricKey& fabric_key, const FabricRegionId& fabric_region) {
size_t num_banks = size_t num_banks = count_children(
count_children(xml_bl_bank, "bank", loc_data, pugiutil::ReqOpt::OPTIONAL); xml_bl_bank, XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_NODE_NAME, loc_data,
pugiutil::ReqOpt::OPTIONAL);
fabric_key.reserve_bl_shift_register_banks(fabric_region, num_banks); fabric_key.reserve_bl_shift_register_banks(fabric_region, num_banks);
for (size_t ibank = 0; ibank < num_banks; ++ibank) { for (size_t ibank = 0; ibank < num_banks; ++ibank) {
@ -127,8 +143,10 @@ static void read_xml_region_bl_shift_register_banks(
for (pugi::xml_node xml_bank : xml_bl_bank.children()) { for (pugi::xml_node xml_bank : xml_bl_bank.children()) {
/* Error out if the XML child has an invalid name! */ /* Error out if the XML child has an invalid name! */
if (xml_bank.name() != std::string("bank")) { if (xml_bank.name() !=
bad_tag(xml_bank, loc_data, xml_bl_bank, {"bank"}); std::string(XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_NODE_NAME)) {
bad_tag(xml_bank, loc_data, xml_bl_bank,
{XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_NODE_NAME});
} }
read_xml_region_bl_shift_register_bank(xml_bank, loc_data, fabric_key, read_xml_region_bl_shift_register_bank(xml_bank, loc_data, fabric_key,
fabric_region); fabric_region);
@ -143,8 +161,11 @@ static void read_xml_region_wl_shift_register_bank(
pugi::xml_node& xml_bank, const pugiutil::loc_data& loc_data, pugi::xml_node& xml_bank, const pugiutil::loc_data& loc_data,
FabricKey& fabric_key, const FabricRegionId& fabric_region) { FabricKey& fabric_key, const FabricRegionId& fabric_region) {
/* Find the id of the bank */ /* Find the id of the bank */
FabricWordLineBankId bank_id = FabricWordLineBankId bank_id = FabricWordLineBankId(
FabricWordLineBankId(get_attribute(xml_bank, "id", loc_data).as_int()); get_attribute(xml_bank,
XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_ATTRIBUTE_ID_NAME,
loc_data)
.as_int());
if (!fabric_key.valid_wl_bank_id(fabric_region, bank_id)) { if (!fabric_key.valid_wl_bank_id(fabric_region, bank_id)) {
archfpga_throw(loc_data.filename_c_str(), loc_data.line(xml_bank), archfpga_throw(loc_data.filename_c_str(), loc_data.line(xml_bank),
@ -156,7 +177,10 @@ static void read_xml_region_wl_shift_register_bank(
/* Parse the ports */ /* Parse the ports */
std::string data_ports = std::string data_ports =
get_attribute(xml_bank, "range", loc_data).as_string(); get_attribute(xml_bank,
XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_ATTRIBUTE_RANGE_NAME,
loc_data)
.as_string();
/* Split with ',' if we have multiple ports */ /* Split with ',' if we have multiple ports */
openfpga::StringToken tokenizer(data_ports); openfpga::StringToken tokenizer(data_ports);
for (const std::string& data_port : tokenizer.split(',')) { for (const std::string& data_port : tokenizer.split(',')) {
@ -172,8 +196,9 @@ static void read_xml_region_wl_shift_register_bank(
static void read_xml_region_wl_shift_register_banks( static void read_xml_region_wl_shift_register_banks(
pugi::xml_node& xml_wl_bank, const pugiutil::loc_data& loc_data, pugi::xml_node& xml_wl_bank, const pugiutil::loc_data& loc_data,
FabricKey& fabric_key, const FabricRegionId& fabric_region) { FabricKey& fabric_key, const FabricRegionId& fabric_region) {
size_t num_banks = size_t num_banks = count_children(
count_children(xml_wl_bank, "bank", loc_data, pugiutil::ReqOpt::OPTIONAL); xml_wl_bank, XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_NODE_NAME, loc_data,
pugiutil::ReqOpt::OPTIONAL);
fabric_key.reserve_wl_shift_register_banks(fabric_region, num_banks); fabric_key.reserve_wl_shift_register_banks(fabric_region, num_banks);
for (size_t ibank = 0; ibank < num_banks; ++ibank) { for (size_t ibank = 0; ibank < num_banks; ++ibank) {
@ -182,8 +207,10 @@ static void read_xml_region_wl_shift_register_banks(
for (pugi::xml_node xml_bank : xml_wl_bank.children()) { for (pugi::xml_node xml_bank : xml_wl_bank.children()) {
/* Error out if the XML child has an invalid name! */ /* Error out if the XML child has an invalid name! */
if (xml_bank.name() != std::string("bank")) { if (xml_bank.name() !=
bad_tag(xml_bank, loc_data, xml_wl_bank, {"bank"}); std::string(XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_NODE_NAME)) {
bad_tag(xml_bank, loc_data, xml_wl_bank,
{XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_NODE_NAME});
} }
read_xml_region_wl_shift_register_bank(xml_bank, loc_data, fabric_key, read_xml_region_wl_shift_register_bank(xml_bank, loc_data, fabric_key,
fabric_region); fabric_region);
@ -197,8 +224,9 @@ static void read_xml_fabric_region(pugi::xml_node& xml_region,
const pugiutil::loc_data& loc_data, const pugiutil::loc_data& loc_data,
FabricKey& fabric_key) { FabricKey& fabric_key) {
/* Find the unique id for the region */ /* Find the unique id for the region */
const FabricRegionId& region_id = const FabricRegionId& region_id = FabricRegionId(
FabricRegionId(get_attribute(xml_region, "id", loc_data).as_int()); get_attribute(xml_region, XML_FABRIC_KEY_REGION_ATTRIBUTE_ID_NAME, loc_data)
.as_int());
if (false == fabric_key.valid_region_id(region_id)) { if (false == fabric_key.valid_region_id(region_id)) {
archfpga_throw(loc_data.filename_c_str(), loc_data.line(xml_region), archfpga_throw(loc_data.filename_c_str(), loc_data.line(xml_region),
"Invalid region id '%lu' (in total %lu regions)!\n", "Invalid region id '%lu' (in total %lu regions)!\n",
@ -207,13 +235,14 @@ static void read_xml_fabric_region(pugi::xml_node& xml_region,
VTR_ASSERT_SAFE(true == fabric_key.valid_region_id(region_id)); VTR_ASSERT_SAFE(true == fabric_key.valid_region_id(region_id));
/* Reserve memory space for the keys in the region */ /* Reserve memory space for the keys in the region */
size_t num_keys = size_t num_keys = count_children(xml_region, XML_FABRIC_KEY_KEY_NODE_NAME,
count_children(xml_region, "key", loc_data, pugiutil::ReqOpt::OPTIONAL); loc_data, pugiutil::ReqOpt::OPTIONAL);
fabric_key.reserve_region_keys(region_id, num_keys); fabric_key.reserve_region_keys(region_id, num_keys);
/* Parse the key for this region */ /* Parse the key for this region */
if (0 < num_keys) { if (0 < num_keys) {
pugi::xml_node xml_key = get_first_child(xml_region, "key", loc_data); pugi::xml_node xml_key =
get_first_child(xml_region, XML_FABRIC_KEY_KEY_NODE_NAME, loc_data);
while (xml_key) { while (xml_key) {
read_xml_region_key(xml_key, loc_data, fabric_key, region_id); read_xml_region_key(xml_key, loc_data, fabric_key, region_id);
xml_key = xml_key.next_sibling(xml_key.name()); xml_key = xml_key.next_sibling(xml_key.name());
@ -221,15 +250,15 @@ static void read_xml_fabric_region(pugi::xml_node& xml_region,
} }
/* Parse the BL shift register bank for this region */ /* Parse the BL shift register bank for this region */
pugi::xml_node xml_bl_bank = pugi::xml_node xml_bl_bank = get_single_child(
get_single_child(xml_region, "bl_shift_register_banks", loc_data, xml_region, XML_FABRIC_KEY_BL_SHIFT_REGISTER_BANKS_NODE_NAME, loc_data,
pugiutil::ReqOpt::OPTIONAL); pugiutil::ReqOpt::OPTIONAL);
read_xml_region_bl_shift_register_banks(xml_bl_bank, loc_data, fabric_key, read_xml_region_bl_shift_register_banks(xml_bl_bank, loc_data, fabric_key,
region_id); region_id);
/* Parse the WL shift register bank for this region */ /* Parse the WL shift register bank for this region */
pugi::xml_node xml_wl_bank = pugi::xml_node xml_wl_bank = get_single_child(
get_single_child(xml_region, "wl_shift_register_banks", loc_data, xml_region, XML_FABRIC_KEY_WL_SHIFT_REGISTER_BANKS_NODE_NAME, loc_data,
pugiutil::ReqOpt::OPTIONAL); pugiutil::ReqOpt::OPTIONAL);
read_xml_region_wl_shift_register_banks(xml_wl_bank, loc_data, fabric_key, read_xml_region_wl_shift_register_banks(xml_wl_bank, loc_data, fabric_key,
region_id); region_id);
@ -250,7 +279,8 @@ FabricKey read_xml_fabric_key(const char* key_fname) {
try { try {
loc_data = pugiutil::load_xml(doc, key_fname); loc_data = pugiutil::load_xml(doc, key_fname);
pugi::xml_node xml_root = get_single_child(doc, "fabric_key", loc_data); pugi::xml_node xml_root =
get_single_child(doc, XML_FABRIC_KEY_ROOT_NAME, loc_data);
size_t num_regions = size_t num_regions =
std::distance(xml_root.children().begin(), xml_root.children().end()); std::distance(xml_root.children().begin(), xml_root.children().end());
@ -265,8 +295,9 @@ FabricKey read_xml_fabric_key(const char* key_fname) {
for (pugi::xml_node xml_region : xml_root.children()) { for (pugi::xml_node xml_region : xml_root.children()) {
/* Error out if the XML child has an invalid name! */ /* Error out if the XML child has an invalid name! */
if (xml_region.name() != std::string("region")) { if (xml_region.name() != std::string(XML_FABRIC_KEY_REGION_NODE_NAME)) {
bad_tag(xml_region, loc_data, xml_root, {"region"}); bad_tag(xml_region, loc_data, xml_root,
{XML_FABRIC_KEY_REGION_NODE_NAME});
} }
num_keys += std::distance(xml_region.children().begin(), num_keys += std::distance(xml_region.children().begin(),
xml_region.children().end()); xml_region.children().end());
@ -282,8 +313,9 @@ FabricKey read_xml_fabric_key(const char* key_fname) {
*/ */
for (pugi::xml_node xml_region : xml_root.children()) { for (pugi::xml_node xml_region : xml_root.children()) {
/* Error out if the XML child has an invalid name! */ /* Error out if the XML child has an invalid name! */
if (xml_region.name() != std::string("region")) { if (xml_region.name() != std::string(XML_FABRIC_KEY_REGION_NODE_NAME)) {
bad_tag(xml_region, loc_data, xml_root, {"region"}); bad_tag(xml_region, loc_data, xml_root,
{XML_FABRIC_KEY_REGION_NODE_NAME});
} }
read_xml_fabric_region(xml_region, loc_data, fabric_key); read_xml_fabric_region(xml_region, loc_data, fabric_key);
} }

View File

@ -18,6 +18,7 @@
#include "write_xml_utils.h" #include "write_xml_utils.h"
/* Headers from fabrickey library */ /* Headers from fabrickey library */
#include "fabric_key_xml_constants.h"
#include "write_xml_fabric_key.h" #include "write_xml_fabric_key.h"
/******************************************************************** /********************************************************************
@ -36,27 +37,31 @@ static int write_xml_fabric_component_key(std::fstream& fp,
} }
openfpga::write_tab_to_file(fp, 2); openfpga::write_tab_to_file(fp, 2);
fp << "<key"; fp << "<" << XML_FABRIC_KEY_KEY_NODE_NAME;
if (false == fabric_key.valid_key_id(component_key)) { if (false == fabric_key.valid_key_id(component_key)) {
return 1; return 1;
} }
write_xml_attribute(fp, "id", size_t(component_key)); write_xml_attribute(fp, XML_FABRIC_KEY_KEY_ATTRIBUTE_ID_NAME,
size_t(component_key));
if (!fabric_key.key_name(component_key).empty()) { if (!fabric_key.key_name(component_key).empty()) {
write_xml_attribute(fp, "name", fabric_key.key_name(component_key).c_str()); write_xml_attribute(fp, XML_FABRIC_KEY_KEY_ATTRIBUTE_NAME_NAME,
fabric_key.key_name(component_key).c_str());
} }
write_xml_attribute(fp, "value", fabric_key.key_value(component_key)); write_xml_attribute(fp, XML_FABRIC_KEY_KEY_ATTRIBUTE_VALUE_NAME,
fabric_key.key_value(component_key));
if (!fabric_key.key_alias(component_key).empty()) { if (!fabric_key.key_alias(component_key).empty()) {
write_xml_attribute(fp, "alias", write_xml_attribute(fp, XML_FABRIC_KEY_KEY_ATTRIBUTE_ALIAS_NAME,
fabric_key.key_alias(component_key).c_str()); fabric_key.key_alias(component_key).c_str());
} }
vtr::Point<int> coord = fabric_key.key_coordinate(component_key); vtr::Point<int> coord = fabric_key.key_coordinate(component_key);
if (fabric_key.valid_key_coordinate(coord)) { if (fabric_key.valid_key_coordinate(coord)) {
write_xml_attribute(fp, "column", coord.x()); write_xml_attribute(fp, XML_FABRIC_KEY_KEY_ATTRIBUTE_COLUMN_NAME,
write_xml_attribute(fp, "row", coord.y()); coord.x());
write_xml_attribute(fp, XML_FABRIC_KEY_KEY_ATTRIBUTE_ROW_NAME, coord.y());
} }
fp << "/>" fp << "/>"
@ -86,14 +91,16 @@ static int write_xml_fabric_bl_shift_register_banks(
/* Write the root node */ /* Write the root node */
openfpga::write_tab_to_file(fp, 2); openfpga::write_tab_to_file(fp, 2);
fp << "<bl_shift_register_banks>" fp << "<" << XML_FABRIC_KEY_BL_SHIFT_REGISTER_BANKS_NODE_NAME << ">"
<< "\n"; << "\n";
for (const auto& bank : fabric_key.bl_banks(region)) { for (const auto& bank : fabric_key.bl_banks(region)) {
openfpga::write_tab_to_file(fp, 3); openfpga::write_tab_to_file(fp, 3);
fp << "<bank"; fp << "<" << XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_NODE_NAME;
write_xml_attribute(fp, "id", size_t(bank)); write_xml_attribute(
fp, XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_ATTRIBUTE_ID_NAME,
size_t(bank));
std::string port_str; std::string port_str;
for (const auto& port : fabric_key.bl_bank_data_ports(region, bank)) { for (const auto& port : fabric_key.bl_bank_data_ports(region, bank)) {
@ -103,14 +110,16 @@ static int write_xml_fabric_bl_shift_register_banks(
if (!port_str.empty()) { if (!port_str.empty()) {
port_str.pop_back(); port_str.pop_back();
} }
write_xml_attribute(fp, "range", port_str.c_str()); write_xml_attribute(
fp, XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_ATTRIBUTE_RANGE_NAME,
port_str.c_str());
fp << "/>" fp << "/>"
<< "\n"; << "\n";
} }
openfpga::write_tab_to_file(fp, 2); openfpga::write_tab_to_file(fp, 2);
fp << "</bl_shift_register_banks>" fp << "</" << XML_FABRIC_KEY_BL_SHIFT_REGISTER_BANKS_NODE_NAME << ">"
<< "\n"; << "\n";
return 0; return 0;
@ -137,14 +146,16 @@ static int write_xml_fabric_wl_shift_register_banks(
/* Write the root node */ /* Write the root node */
openfpga::write_tab_to_file(fp, 2); openfpga::write_tab_to_file(fp, 2);
fp << "<wl_shift_register_banks>" fp << "<" << XML_FABRIC_KEY_WL_SHIFT_REGISTER_BANKS_NODE_NAME << ">"
<< "\n"; << "\n";
for (const auto& bank : fabric_key.wl_banks(region)) { for (const auto& bank : fabric_key.wl_banks(region)) {
openfpga::write_tab_to_file(fp, 3); openfpga::write_tab_to_file(fp, 3);
fp << "<bank"; fp << "<" << XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_NODE_NAME;
write_xml_attribute(fp, "id", size_t(bank)); write_xml_attribute(
fp, XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_ATTRIBUTE_ID_NAME,
size_t(bank));
std::string port_str; std::string port_str;
for (const auto& port : fabric_key.wl_bank_data_ports(region, bank)) { for (const auto& port : fabric_key.wl_bank_data_ports(region, bank)) {
@ -154,14 +165,16 @@ static int write_xml_fabric_wl_shift_register_banks(
if (!port_str.empty()) { if (!port_str.empty()) {
port_str.pop_back(); port_str.pop_back();
} }
write_xml_attribute(fp, "range", port_str.c_str()); write_xml_attribute(
fp, XML_FABRIC_KEY_BLWL_SHIFT_REGISTER_BANK_ATTRIBUTE_RANGE_NAME,
port_str.c_str());
fp << "/>" fp << "/>"
<< "\n"; << "\n";
} }
openfpga::write_tab_to_file(fp, 2); openfpga::write_tab_to_file(fp, 2);
fp << "</wl_shift_register_banks>" fp << "</" << XML_FABRIC_KEY_WL_SHIFT_REGISTER_BANKS_NODE_NAME << ">"
<< "\n"; << "\n";
return 0; return 0;
@ -186,7 +199,7 @@ int write_xml_fabric_key(const char* fname, const FabricKey& fabric_key) {
openfpga::check_file_stream(fname, fp); openfpga::check_file_stream(fname, fp);
/* Write the root node */ /* Write the root node */
fp << "<fabric_key>" fp << "<" << XML_FABRIC_KEY_ROOT_NAME << ">"
<< "\n"; << "\n";
int err_code = 0; int err_code = 0;
@ -194,7 +207,9 @@ int write_xml_fabric_key(const char* fname, const FabricKey& fabric_key) {
/* Write region by region */ /* Write region by region */
for (const FabricRegionId& region : fabric_key.regions()) { for (const FabricRegionId& region : fabric_key.regions()) {
openfpga::write_tab_to_file(fp, 1); openfpga::write_tab_to_file(fp, 1);
fp << "<region id=\"" << size_t(region) << "\"" fp << "<" << XML_FABRIC_KEY_REGION_NODE_NAME << " "
<< XML_FABRIC_KEY_REGION_ATTRIBUTE_ID_NAME << "=\"" << size_t(region)
<< "\""
<< ">\n"; << ">\n";
/* Write shift register banks */ /* Write shift register banks */
@ -210,12 +225,12 @@ int write_xml_fabric_key(const char* fname, const FabricKey& fabric_key) {
} }
openfpga::write_tab_to_file(fp, 1); openfpga::write_tab_to_file(fp, 1);
fp << "</region>" fp << "</" << XML_FABRIC_KEY_REGION_NODE_NAME << ">"
<< "\n"; << "\n";
} }
/* Finish writing the root node */ /* Finish writing the root node */
fp << "</fabric_key>" fp << "</" << XML_FABRIC_KEY_ROOT_NAME << ">"
<< "\n"; << "\n";
/* Close the file stream */ /* Close the file stream */