diff --git a/libopenfpga/libfabrickey/src/write_xml_fabric_key.cpp b/libopenfpga/libfabrickey/src/write_xml_fabric_key.cpp index aa38c8140..ffd64ea54 100644 --- a/libopenfpga/libfabrickey/src/write_xml_fabric_key.cpp +++ b/libopenfpga/libfabrickey/src/write_xml_fabric_key.cpp @@ -63,6 +63,106 @@ int write_xml_fabric_component_key(std::fstream& fp, return 0; } +/******************************************************************** + * A writer to output a BL shift register bank description to XML format + * + * Return 0 if successful + * Return 1 if there are more serious bugs in the architecture + * Return 2 if fail when creating files + *******************************************************************/ +static +int write_xml_fabric_bl_shift_register_banks(std::fstream& fp, + const FabricKey& fabric_key, + const FabricRegionId& region) { + /* Validate the file stream */ + if (false == openfpga::valid_file_stream(fp)) { + return 2; + } + + /* If we have an empty bank, we just skip it */ + if (0 == fabric_key.bl_banks(region).size()) { + return 0; + } + + /* Write the root node */ + openfpga::write_tab_to_file(fp, 2); + fp << "" << "\n"; + + for (const auto& bank : fabric_key.bl_banks(region)) { + openfpga::write_tab_to_file(fp, 3); + fp << "" << "\n"; + } + + openfpga::write_tab_to_file(fp, 2); + fp << "" << "\n"; + + return 0; +} + +/******************************************************************** + * A writer to output a WL shift register bank description to XML format + * + * Return 0 if successful + * Return 1 if there are more serious bugs in the architecture + * Return 2 if fail when creating files + *******************************************************************/ +static +int write_xml_fabric_wl_shift_register_banks(std::fstream& fp, + const FabricKey& fabric_key, + const FabricRegionId& region) { + /* Validate the file stream */ + if (false == openfpga::valid_file_stream(fp)) { + return 2; + } + + /* If we have an empty bank, we just skip it */ + if (0 == fabric_key.wl_banks(region).size()) { + return 0; + } + + /* Write the root node */ + openfpga::write_tab_to_file(fp, 2); + fp << "" << "\n"; + + for (const auto& bank : fabric_key.wl_banks(region)) { + openfpga::write_tab_to_file(fp, 3); + fp << "" << "\n"; + } + + openfpga::write_tab_to_file(fp, 2); + fp << "" << "\n"; + + return 0; +} + /******************************************************************** * A writer to output a fabric key to XML format * @@ -93,6 +193,10 @@ int write_xml_fabric_key(const char* fname, openfpga::write_tab_to_file(fp, 1); fp << "\n"; + /* Write shift register banks */ + write_xml_fabric_bl_shift_register_banks(fp, fabric_key, region); + write_xml_fabric_wl_shift_register_banks(fp, fabric_key, region); + /* Write component by component */ for (const FabricKeyId& key : fabric_key.region_keys(region)) { err_code = write_xml_fabric_component_key(fp, fabric_key, key);