49 #include <Xyce_config.h>
64 #include <N_UTL_IndentStreamBuf.h>
73 struct DeviceInstanceCmp :
public std::binary_function<DeviceInstance, DeviceInstance, bool>
75 bool operator()(
const DeviceInstance &entity_0,
const DeviceInstance &entity_1)
const
77 return less_nocase(entity_0.getName().getEncodedName(), entity_1.getName().getEncodedName());
79 bool operator()(
const DeviceInstance *entity_0,
const DeviceInstance *entity_1)
const
81 return less_nocase(entity_0->getName().getEncodedName(), entity_1->getName().getEncodedName());
96 std::vector<DeviceModel *> models;
100 << std::endl << section_divider << std::endl
101 <<
"Number of " << device.getName() <<
" models: " << models.size() << std::endl;
104 for (std::vector<DeviceModel *>::const_iterator it = models.begin(); it != models.end(); ++it, ++i)
106 os << i <<
": name = " << (*it)->getName() <<
" type = " << (*it)->getType() <<
" level = " << (*it)->getLevel() << std::endl;
108 (*it)->printOutInstances(os);
110 os << section_divider << std::endl;
115 typedef std::map<std::string, std::pair<DeviceModel *, std::vector<DeviceInstance *> > >
UglyMap;
126 std::pair<UglyMap::iterator, bool> result =
modelMap_.insert(UglyMap::value_type(model->
getName(), std::make_pair(model, std::vector<DeviceInstance *>())));
130 if ((*result.first).second.second.empty())
134 std::sort((*result.first).second.second.begin(), (*result.first).second.second.end(), DeviceInstanceCmp());
157 static const int stdWidth = 15;
163 device.forEachModel(op);
166 <<
"Number of " << device.getName() <<
" models: " << model_map.size() << std::endl
167 << std::setw(stdWidth) <<
"name ";
169 if (!model_map.empty())
171 int column_count = 1;
172 for (UglyMap::const_iterator it_model = model_map.begin(); it_model != model_map.end(); ++it_model, ++column_count)
174 if (column_count%8 == 0)
176 os << std::setw(stdWidth) << (*it_model).first ;
180 os << std::setw(stdWidth) <<
"type ";
182 for (UglyMap::const_iterator it_model = model_map.begin(); it_model != model_map.end(); ++it_model, ++column_count)
184 if (column_count%8 == 0)
186 os << std::setw(stdWidth) << (*it_model).second.first->getType() ;
190 os << std::setw(stdWidth) <<
"level ";
192 for (UglyMap::const_iterator it_model = model_map.begin(); it_model != model_map.end(); ++it_model, ++column_count)
194 if (column_count%8 == 0)
196 os << std::setw(stdWidth) << (*it_model).second.first->getLevel() ;
200 const ParameterMap &parMap = (*model_map.begin()).second.first->getParameterMap();
203 for (ParameterMap::const_iterator it_parameter = parMap.begin(); it_parameter != parMap.end(); ++it_parameter)
205 for (UglyMap::const_iterator it_model = model_map.begin(); it_model != model_map.end(); ++it_model, ++column_count)
207 if (it_model == model_map.begin())
209 if (column_count%8 == 0)
211 os << std::setw(stdWidth) << (*it_parameter).first;
214 os << std::setw(stdWidth);
215 printParameter(os, *(*it_model).second.first, (*it_parameter).first, *(*it_parameter).second);
222 os <<
"Number of " << device.getName() <<
" instances: " << op.
deviceCount_ << std::endl
223 << std::setw(stdWidth) <<
"name ";
226 for (UglyMap::const_iterator it_model = model_map.begin(); it_model != model_map.end(); ++it_model)
228 const std::vector<DeviceInstance *> &instance_list = (*it_model).second.second;
230 for (std::vector<DeviceInstance *>::const_iterator it_instance = instance_list.begin(); it_instance != instance_list.end(); ++it_instance, ++column_count)
232 if (column_count%8 == 0)
234 os << std::setw(stdWidth) << (*it_instance)->getName();
238 << std::setw(stdWidth) <<
"model ";
241 const DeviceInstance &first_instance = *(*model_map.begin()).second.second.front();
244 for (UglyMap::const_iterator it_model = model_map.begin(); it_model != model_map.end(); ++it_model)
246 const DeviceModel &model = *(*it_model).second.first;
247 const std::vector<DeviceInstance *> &instance_list = (*it_model).second.second;
249 if ( !instance_list.empty () ) {
250 for (std::vector<DeviceInstance *>::const_iterator it_instance = instance_list.begin(); it_instance != instance_list.end(); ++it_instance, ++column_count)
252 if (column_count%8 == 0)
254 os << std::setw(stdWidth) << model.
getName();
263 for (ParameterMap::const_iterator it_parameter = parameter_map.begin() ; it_parameter != parameter_map.end(); ++it_parameter)
265 os << std::setw(stdWidth) << it_parameter->first;
268 for (UglyMap::const_iterator it_model = model_map.begin(); it_model != model_map.end(); ++it_model)
270 const DeviceModel &model = *(*it_model).second.first;
271 const std::vector<DeviceInstance *> &instance_list = (*it_model).second.second;
273 if ( !instance_list.empty () ) {
274 for (std::vector<DeviceInstance *>::const_iterator it_instance = instance_list.begin(); it_instance != instance_list.end(); ++it_instance, ++column_count)
276 if (column_count%8 == 0)
278 os << std::setw(stdWidth);
279 printParameter(os, *(*it_instance), (*it_parameter).first, *(*it_parameter).second);
305 if (param.
isType<
double>())
313 os << param.
value<
double>(entity);
316 else if (param.
isType<
bool>())
318 os << param.
value<
bool>(entity);
320 else if (param.
isType<
int>())
322 os << param.
value<
int>(entity);
324 else if (param.
isType<
long>())
326 os << param.
value<
long>(entity);
328 else if (param.
isType<std::string>())
330 os << param.
value<std::string>(entity);
332 else if (param.
isType<std::vector<std::string> >())
344 else if (param.
isType<std::vector<int> >())
356 else if (param.
isType<std::vector<double> >())
424 std::string option_device_name,
425 int option_device_level,
429 typedef std::map<std::pair<std::string, int>,
Device *> DeviceMap;
432 typedef std::map<NameLevelKey, Configuration *, NameLevelKeyLess> OrderedConfigurationMap;
434 for (OrderedConfigurationMap::const_iterator it = configuration_map.begin(), end = configuration_map.end(); it != end; ++it)
436 Xyce::dout() << (*it).first << Xyce::Util::push << std::endl
437 << *(*it).second << Xyce::Util::pop << std::endl;
442 for (Configuration::ConfigurationMap::const_iterator it = configuration_map.begin(), end = configuration_map.end(); it != end; ++it)
444 const NameLevelKey &device_key = (*it).first;
446 std::string device_name = (*it).first.first;
447 const int device_level = (*it).first.second;
449 device_name[0] = toupper(device_name[0]);
451 if ((option_device_name.empty() || Xyce::equal_nocase(option_device_name, device_name)) && (option_device_level == -1 || option_device_level == device_level)) {
454 std::string device_description = configuration.
getName();
458 if (configuration.
getName() ==
"Behavioral Digital")
459 device_name =
"Digital";
461 if (print_instance && !instance_parameters.
getMap().empty()) {
462 std::ostringstream path;
463 path << device_name <<
"_" << device_level <<
"_Device_Instance" <<
"_Params.tex";
465 std::ofstream os(path.str().c_str(), std::ios_base::out);
466 os <<
"% This table was generated by Xyce:" << std::endl
468 << device_name <<
" " << device_level << std::endl
471 laTexDevice(os, device_name, device_level, 0, device_description, instance_parameters, format);
474 if (print_model && !model_parameters.
getMap().empty()) {
475 std::ostringstream path;
476 path << device_name <<
"_" << device_level <<
"_Device_Model" <<
"_Params.tex";
478 std::ofstream os(path.str().c_str(), std::ios_base::out);
480 os <<
"% This table was generated by Xyce:" << std::endl
482 << device_name <<
" " << device_level << std::endl
485 laTexDevice(os, device_name, device_level, 1, device_description, model_parameters, format);
ParametricData< void > & getModelParameters() const
Returns the model parameter descriptions.
std::ostream & printDotOpOutput(std::ostream &os, const Device &device)
UglyDeviceModelOp(const Device &device, UglyMap &model_map)
Pure virtual class to augment a linear system.
void getDeviceInstances(const D &d, Out it)
Calls forEachInstance() on d which iterates through all the instances copies them to the output itera...
unordered_map< std::string, Descriptor *, HashNoCase, EqualNoCase > ParameterMap
Base class for all parameters.
bool isTempParam(const std::string &name)
Returns true if the name is TNOM or TEMP.
void getDeviceModels(const D &d, Out it)
Calls forEachModel() on d which iterates through all the models copies them to the output iterator...
void handleParameterOutputs(OutputMode::Mode format, std::string option_device_name, int option_device_level, bool print_model, bool print_instance)
const ParameterMap & getParameterMap() const
const std::string & getName() const
const T & value(const ParameterBase &entity) const
Returns the value of the parameter for the entity.
ParametricData< void > & getInstanceParameters() const
Returns the instance parameter descriptions.
Class ParametricData manages the configuration information and the parameter binding map...
The Device class is an interface for device implementations.
Class Descriptor describes the parameters stored in the ParametricData parameter map.
Class Configuration contains device configuration data.
bool hasCompositeData() const
std::ostream & print(std::ostream &os, const Device &device)
static const ConfigurationMap & getConfigurationMap()
Returns the configuration map of the system.
unordered_map< NameLevelKey, Configuration * > ConfigurationMap
virtual bool operator()(DeviceModel *model)
bool isType() const
Tests entry data type.
const std::string & getName() const
Returns the device name.
std::ostream & printCompositeParameters(std::ostream &os, const CompositeParam &composite)
ParameterMap & getMap()
Gets the parameter binding map map.
std::ostream & printParameter(std::ostream &os, const ParameterBase &entity, const std::string &name, const Descriptor ¶m)
std::map< std::string, std::pair< DeviceModel *, std::vector< DeviceInstance * > > > UglyMap
CompositeParam is the base class for classes that wish to only manage the processing of parameter dat...
const ParameterMap & getParameterMap() const
getParameterMap returns the parameter map which describes the parameters.
std::ostream & laTexDevice(std::ostream &os, const std::string &name, const int level, const int type, const std::string &device_description, const ParametricData< void > ¶meters, const OutputMode::Mode format)