46 #include <Xyce_config.h>
54 #include <N_ERH_Message.h>
55 #include <N_UTL_Demangle.h>
63 typedef std::map<EntityTypeId, Configuration *> EntityTypeIdConfigurationMap;
64 typedef std::map<std::string, EntityTypeId, LessNoCase> NameEntityTypeIdMap;
65 typedef std::map<NameLevelKey, EntityTypeId, NameLevelLess> NameLevelKeyEntityTypeIdMap;
99 std::vector<Configuration *> c;
101 c.push_back((*it).second);
102 std::sort(c.begin(), c.end());
103 c.erase(std::unique(c.begin(), c.end()), c.end());
104 for (std::vector<Configuration *>::iterator it = c.begin(); it != c.end(); ++it)
141 return getData().configurationMap_;
155 ConfigurationMap::const_iterator it = getData().configurationMap_.find(ConfigurationMap::key_type(device_name, level));
156 return it == getData().configurationMap_.end() ? 0 : (*it).second;
174 EntityTypeIdConfigurationMap::const_iterator it = getData().modelTypeConfigurationMap_.find(model_type_id);
176 throw std::runtime_error(
"Instance type not found");
178 device = (*it).second->factory(factory_block);
195 NameLevelKeyEntityTypeIdMap::const_iterator it = getData().modelTypeNameLevelModelTypeMap_.find(
NameLevelKey(model_type_name, level));
213 NameEntityTypeIdMap::const_iterator it = getData().modelTypeNameModelGroupMap_.find(device_name);
230 const char * model_name,
231 const int model_level,
234 int model_type_nodes,
235 int model_group_nodes)
237 if (model_type_id == model_group_id) {
238 std::pair<NameEntityTypeIdMap::iterator, bool> result = getData().modelTypeNameModelGroupMap_.insert(NameEntityTypeIdMap::value_type(model_name, model_type_id));
239 if (!result.second && (*result.first).second != model_type_id)
240 Report::DevelFatal0().in(
"Configuration::addDevice")
241 <<
"Attempt to register more than one device model group to the name " << model_name;
244 if (model_type_nodes < model_group_nodes) {
253 std::pair<ConfigurationMap::iterator, bool> result
254 = getData().configurationMap_.insert(ConfigurationMap::value_type(
NameLevelKey(model_name, model_level),
this));
256 Report::DevelFatal0().in(
"Configuration::addDevice")
257 <<
"Device with name " << model_name <<
" level " << model_level
258 <<
" already registered as " << (*result.first).second->getName();
262 std::pair<EntityTypeIdConfigurationMap::iterator, bool> result
263 = getData().modelTypeConfigurationMap_.insert(EntityTypeIdConfigurationMap::value_type(model_type_id,
this));
264 if (!result.second && (*result.first).second !=
this)
265 Report::DevelFatal().in(
"Configuration::addDevice")
266 <<
"Model " << demangle(model_type_id.type().name()) <<
" already registered to device " << (*result.first).second->getName()
267 <<
" while trying to register with device " << model_name <<
" level " << model_level;
282 const char * model_name,
287 if (model_type_id == model_group_id) {
288 std::pair<NameEntityTypeIdMap::iterator, bool> result = getData().modelTypeNameModelGroupMap_.insert(NameEntityTypeIdMap::value_type(model_name, model_type_id));
289 if (!result.second && (*result.first).second != model_type_id)
290 Report::DevelFatal0().in(
"Configuration::addDevice")
291 <<
"Attempt to register more than one device model group to the name " << model_name;
294 std::pair<NameLevelKeyEntityTypeIdMap::iterator, bool> result
295 = getData().modelTypeNameLevelModelTypeMap_.insert(NameLevelKeyEntityTypeIdMap::value_type(
NameLevelKey(model_name, level), model_type_id));
296 if (!result.second && (*result.first).second != model_type_id)
297 Report::DevelFatal0() <<
"Attempt to register more than one model type to the device " << model_name <<
" level " << level;