diff --git a/libopenfpga/libfabrickey/src/fabric_key.cpp b/libopenfpga/libfabrickey/src/fabric_key.cpp index 0c2c508bd..b4bf5efac 100644 --- a/libopenfpga/libfabrickey/src/fabric_key.cpp +++ b/libopenfpga/libfabrickey/src/fabric_key.cpp @@ -37,6 +37,13 @@ size_t FabricKey::key_value(const FabricKeyId& key_id) const { return key_values_[key_id]; } +/* Access the alias of a key */ +std::string FabricKey::key_alias(const FabricKeyId& key_id) const { + /* validate the key_id */ + VTR_ASSERT(valid_key_id(key_id)); + return key_alias_[key_id]; +} + bool FabricKey::empty() const { return 0 == key_ids_.size(); } @@ -48,6 +55,7 @@ void FabricKey::reserve_keys(const size_t& num_keys) { key_ids_.reserve(num_keys); key_names_.reserve(num_keys); key_values_.reserve(num_keys); + key_alias_.reserve(num_keys); } /* Create a new key and add it to the library, return an id */ @@ -57,6 +65,7 @@ FabricKeyId FabricKey::create_key() { key_ids_.push_back(key); key_names_.emplace_back(); key_values_.emplace_back(); + key_alias_.emplace_back(); return key; } @@ -77,6 +86,14 @@ void FabricKey::set_key_value(const FabricKeyId& key_id, key_values_[key_id] = value; } +void FabricKey::set_key_alias(const FabricKeyId& key_id, + const std::string& alias) { + /* validate the key_id */ + VTR_ASSERT(valid_key_id(key_id)); + + key_alias_[key_id] = alias; +} + /************************************************************************ * Internal invalidators/validators ***********************************************************************/ diff --git a/libopenfpga/libfabrickey/src/fabric_key.h b/libopenfpga/libfabrickey/src/fabric_key.h index 053e32e56..4ca678722 100644 --- a/libopenfpga/libfabrickey/src/fabric_key.h +++ b/libopenfpga/libfabrickey/src/fabric_key.h @@ -36,6 +36,7 @@ class FabricKey { public: /* Public Accessors: Basic data query */ std::string key_name(const FabricKeyId& key_id) const; size_t key_value(const FabricKeyId& key_id) const; + std::string key_alias(const FabricKeyId& key_id) const; bool empty() const; public: /* Public Mutators: model-related */ void reserve_keys(const size_t& num_keys); @@ -44,6 +45,8 @@ class FabricKey { const std::string& name); void set_key_value(const FabricKeyId& key_id, const size_t& value); + void set_key_alias(const FabricKeyId& key_id, + const std::string& alias); public: /* Public invalidators/validators */ bool valid_key_id(const FabricKeyId& key_id) const; private: /* Internal data */ @@ -55,6 +58,9 @@ class FabricKey { /* Values for each key */ vtr::vector key_values_; + + /* Optional alias for each key, with which a key can also be represented */ + vtr::vector key_alias_; }; #endif diff --git a/libopenfpga/libfabrickey/src/read_xml_fabric_key.cpp b/libopenfpga/libfabrickey/src/read_xml_fabric_key.cpp index 8b1f03f11..291352eaa 100644 --- a/libopenfpga/libfabrickey/src/read_xml_fabric_key.cpp +++ b/libopenfpga/libfabrickey/src/read_xml_fabric_key.cpp @@ -42,6 +42,12 @@ void read_xml_component_key(pugi::xml_node& xml_component_key, fabric_key.set_key_name(FabricKeyId(id), name); fabric_key.set_key_value(FabricKeyId(id), value); + + /* If we have an alias, set the value as well */ + const std::string& alias = get_attribute(xml_component_key, "alias", loc_data, pugiutil::ReqOpt::OPTIONAL).as_string(); + if (!alias.empty()) { + fabric_key.set_key_alias(FabricKeyId(id), alias); + } } /******************************************************************** diff --git a/libopenfpga/libfabrickey/src/write_xml_fabric_key.cpp b/libopenfpga/libfabrickey/src/write_xml_fabric_key.cpp index 1697f94a6..305d6d67e 100644 --- a/libopenfpga/libfabrickey/src/write_xml_fabric_key.cpp +++ b/libopenfpga/libfabrickey/src/write_xml_fabric_key.cpp @@ -43,6 +43,10 @@ int write_xml_fabric_component_key(std::fstream& fp, write_xml_attribute(fp, "name", fabric_key.key_name(component_key).c_str()); write_xml_attribute(fp, "value", fabric_key.key_value(component_key)); + if (!fabric_key.key_alias(component_key).empty()) { + write_xml_attribute(fp, "alias", fabric_key.key_alias(component_key).c_str()); + } + fp << "/>" << "\n"; return 0; diff --git a/openfpga/src/fabric/build_top_module_memory.cpp b/openfpga/src/fabric/build_top_module_memory.cpp index 158a0f44a..e37c585d2 100644 --- a/openfpga/src/fabric/build_top_module_memory.cpp +++ b/openfpga/src/fabric/build_top_module_memory.cpp @@ -429,6 +429,11 @@ int load_top_module_memory_modules_from_fabric_key(ModuleManager& module_manager /* Find if instance id is valid */ size_t child_instance = fabric_key.key_value(key); + /* If we have alias, we try to find a instance in this name */ + if (!fabric_key.key_alias(key).empty()) { + child_instance = module_manager.instance_id(top_module, child_module, fabric_key.key_alias(key)); + } + if (child_instance >= module_manager.num_instance(top_module, child_module)) { VTR_LOGF_ERROR(__FILE__, __LINE__, "Invalid key value '%ld'!\n", diff --git a/openfpga/src/fabric/fabric_key_writer.cpp b/openfpga/src/fabric/fabric_key_writer.cpp index 40770965f..1af6d77fd 100644 --- a/openfpga/src/fabric/fabric_key_writer.cpp +++ b/openfpga/src/fabric/fabric_key_writer.cpp @@ -65,6 +65,10 @@ int write_fabric_key_to_xml_file(const ModuleManager& module_manager, FabricKeyId key = fabric_key.create_key(); fabric_key.set_key_name(key, module_manager.module_name(child_module)); fabric_key.set_key_value(key, child_instance); + + if (false == module_manager.instance_name(top_module, child_module, child_instance).empty()) { + fabric_key.set_key_alias(key, module_manager.instance_name(top_module, child_module, child_instance)); + } } VTR_LOGV(verbose,