diff --git a/openfpga/src/fabric/module_manager.cpp b/openfpga/src/fabric/module_manager.cpp index d03af54b0..3f5cfdbfb 100644 --- a/openfpga/src/fabric/module_manager.cpp +++ b/openfpga/src/fabric/module_manager.cpp @@ -626,6 +626,18 @@ void ModuleManager::add_configurable_child(const ModuleId& parent_module, configurable_child_instances_[parent_module].push_back(child_instance); } +void ModuleManager::reserve_configurable_child(const ModuleId& parent_module, + const size_t& num_children) { + VTR_ASSERT ( valid_module_id(parent_module) ); + /* Do reserve when the number of children is larger than current size of lists */ + if (num_children > configurable_children_[parent_module].size()) { + configurable_children_[parent_module].reserve(num_children); + } + if (num_children > configurable_child_instances_[parent_module].size()) { + configurable_child_instances_[parent_module].reserve(num_children); + } +} + /* Add a net to the connection graph of the module */ ModuleNetId ModuleManager::create_module_net(const ModuleId& module) { /* Validate the module id */ @@ -741,6 +753,16 @@ ModuleNetSinkId ModuleManager::add_module_net_sink(const ModuleId& module, const return net_sink; } +/****************************************************************************** + * Public Deconstructor + ******************************************************************************/ +void ModuleManager::clear_configurable_children(const ModuleId& parent_module) { + VTR_ASSERT(valid_module_id(parent_module)); + + configurable_children_[parent_module].clear(); + configurable_child_instances_[parent_module].clear(); +} + /****************************************************************************** * Private validators/invalidators ******************************************************************************/ diff --git a/openfpga/src/fabric/module_manager.h b/openfpga/src/fabric/module_manager.h index cd79bde8c..ee06f1415 100644 --- a/openfpga/src/fabric/module_manager.h +++ b/openfpga/src/fabric/module_manager.h @@ -156,6 +156,11 @@ class ModuleManager { void set_child_instance_name(const ModuleId& parent_module, const ModuleId& child_module, const size_t& instance_id, const std::string& instance_name); /* Add a configurable child module to module */ void add_configurable_child(const ModuleId& module, const ModuleId& child_module, const size_t& child_instance); + /* Reserved a number of configurable children + * for memory efficiency + */ + void reserve_configurable_child(const ModuleId& module, const size_t& num_children); + /* Add a net to the connection graph of the module */ ModuleNetId create_module_net(const ModuleId& module); /* Set the name of net */ @@ -169,6 +174,13 @@ class ModuleManager { ModuleNetSinkId add_module_net_sink(const ModuleId& module, const ModuleNetId& net, const ModuleId& sink_module, const size_t& instance_id, const ModulePortId& sink_port, const size_t& sink_pin); + public: /* Public deconstructors */ + /* This is a strong function which will remove all the configurable children + * under a given parent module + * It is mainly used by loading fabric keys + * Do NOT use unless you know what you are doing!!! + */ + void clear_configurable_children(const ModuleId& parent_module); public: /* Public validators/invalidators */ bool valid_module_id(const ModuleId& module) const; bool valid_module_port_id(const ModuleId& module, const ModulePortId& port) const;