WIP: moved some GSI specific methods into the C++ classes because they are of general use.

This commit is contained in:
Matthias Koefferlein 2018-12-26 00:38:35 +01:00
parent 4e899d7d6c
commit ec65d293e3
3 changed files with 105 additions and 40 deletions

View File

@ -157,6 +157,19 @@ void Device::set_parameter_value (size_t param_id, double v)
m_parameters [param_id] = v; m_parameters [param_id] = v;
} }
double Device::parameter_value (const std::string &name) const
{
return device_class () ? parameter_value (device_class ()->parameter_id_for_name (name)) : 0.0;
}
void Device::set_parameter_value (const std::string &name, double v)
{
if (device_class ()) {
set_parameter_value (device_class ()->parameter_id_for_name (name), v);
}
}
// -------------------------------------------------------------------------------- // --------------------------------------------------------------------------------
// SubCircuit class implementation // SubCircuit class implementation
@ -888,6 +901,50 @@ const DeviceParameterDefinition *DeviceClass::parameter_definition (size_t id) c
} }
} }
bool DeviceClass::has_parameter_with_name (const std::string &name) const
{
const std::vector<db::DeviceParameterDefinition> &pd = parameter_definitions ();
for (std::vector<db::DeviceParameterDefinition>::const_iterator i = pd.begin (); i != pd.end (); ++i) {
if (i->name () == name) {
return true;
}
}
return false;
}
size_t DeviceClass::parameter_id_for_name (const std::string &name) const
{
const std::vector<db::DeviceParameterDefinition> &pd = parameter_definitions ();
for (std::vector<db::DeviceParameterDefinition>::const_iterator i = pd.begin (); i != pd.end (); ++i) {
if (i->name () == name) {
return i->id ();
}
}
throw tl::Exception (tl::to_string (tr ("Invalid parameter name")) + ": '" + name + "'");
}
bool DeviceClass::has_terminal_with_name (const std::string &name) const
{
const std::vector<db::DeviceTerminalDefinition> &td = terminal_definitions ();
for (std::vector<db::DeviceTerminalDefinition>::const_iterator i = td.begin (); i != td.end (); ++i) {
if (i->name () == name) {
return true;
}
}
return false;
}
size_t DeviceClass::terminal_id_for_name (const std::string &name) const
{
const std::vector<db::DeviceTerminalDefinition> &td = terminal_definitions ();
for (std::vector<db::DeviceTerminalDefinition>::const_iterator i = td.begin (); i != td.end (); ++i) {
if (i->name () == name) {
return i->id ();
}
}
throw tl::Exception (tl::to_string (tr ("Invalid terminal name")) + ": '" + name + "'");
}
// -------------------------------------------------------------------------------- // --------------------------------------------------------------------------------
// Netlist class implementation // Netlist class implementation

View File

@ -635,6 +635,18 @@ public:
*/ */
void set_parameter_value (size_t param_id, double v); void set_parameter_value (size_t param_id, double v);
/**
* @brief Gets the value for the parameter with the given name
* If the name is not valid, an exception is thrown.
*/
double parameter_value (const std::string &name) const;
/**
* @brief Sets the value for the parameter with the given name
* If the name is not valid, an exception is thrown.
*/
void set_parameter_value (const std::string &name, double v);
private: private:
friend class Circuit; friend class Circuit;
friend class Net; friend class Net;
@ -1432,6 +1444,28 @@ public:
*/ */
const DeviceParameterDefinition *parameter_definition (size_t id) const; const DeviceParameterDefinition *parameter_definition (size_t id) const;
/**
* @brief Returns true, if the device has a parameter with the given name
*/
bool has_parameter_with_name (const std::string &name) const;
/**
* @brief Returns the parameter ID for the parameter with the given name
* If the name is invalid, an exception is thrown.
*/
size_t parameter_id_for_name (const std::string &name) const;
/**
* @brief Returns true, if the device has a terminal with the given name
*/
bool has_terminal_with_name (const std::string &name) const;
/**
* @brief Returns the parameter ID for the terminal with the given name
* If the name is invalid, an exception is thrown.
*/
size_t terminal_id_for_name (const std::string &name) const;
/** /**
* @brief Clears the circuit * @brief Clears the circuit
*/ */

View File

@ -47,40 +47,6 @@ static void device_disconnect_terminal (db::Device *device, size_t terminal_id)
device->connect_terminal (terminal_id, 0); device->connect_terminal (terminal_id, 0);
} }
static bool device_has_param_with_name (const db::DeviceClass *device_class, const std::string &name)
{
const std::vector<db::DeviceParameterDefinition> &pd = device_class->parameter_definitions ();
for (std::vector<db::DeviceParameterDefinition>::const_iterator i = pd.begin (); i != pd.end (); ++i) {
if (i->name () == name) {
return true;
}
}
return false;
}
static size_t device_param_id_for_name (const db::DeviceClass *device_class, const std::string &name)
{
if (device_class) {
const std::vector<db::DeviceParameterDefinition> &pd = device_class->parameter_definitions ();
for (std::vector<db::DeviceParameterDefinition>::const_iterator i = pd.begin (); i != pd.end (); ++i) {
if (i->name () == name) {
return i->id ();
}
}
}
throw tl::Exception (tl::to_string (tr ("Invalid parameter name")) + ": '" + name + "'");
}
static double device_parameter_value (const db::Device *device, const std::string &name)
{
return device->parameter_value (device_param_id_for_name (device->device_class (), name));
}
static void device_set_parameter_value (db::Device *device, const std::string &name, double value)
{
return device->set_parameter_value (device_param_id_for_name (device->device_class (), name), value);
}
Class<db::Device> decl_dbDevice ("db", "Device", Class<db::Device> decl_dbDevice ("db", "Device",
gsi::method ("device_class", &db::Device::device_class, gsi::method ("device_class", &db::Device::device_class,
"@brief Gets the device class the device belongs to.\n" "@brief Gets the device class the device belongs to.\n"
@ -103,17 +69,17 @@ Class<db::Device> decl_dbDevice ("db", "Device",
gsi::method_ext ("disconnect_terminal", &device_disconnect_terminal, gsi::arg ("terminal_id"), gsi::method_ext ("disconnect_terminal", &device_disconnect_terminal, gsi::arg ("terminal_id"),
"@brief Disconnects the given terminal from any net.\n" "@brief Disconnects the given terminal from any net.\n"
) + ) +
gsi::method ("parameter", &db::Device::parameter_value, gsi::arg ("param_id"), gsi::method ("parameter", (double (db::Device::*) (size_t) const) &db::Device::parameter_value, gsi::arg ("param_id"),
"@brief Gets the parameter value for the given parameter ID." "@brief Gets the parameter value for the given parameter ID."
) + ) +
gsi::method ("set_parameter", &db::Device::set_parameter_value, gsi::arg ("param_id"), gsi::arg ("value"), gsi::method ("set_parameter", (void (db::Device::*) (size_t, double)) &db::Device::set_parameter_value, gsi::arg ("param_id"), gsi::arg ("value"),
"@brief Sets the parameter value for the given parameter ID." "@brief Sets the parameter value for the given parameter ID."
) + ) +
gsi::method_ext ("parameter", &gsi::device_parameter_value, gsi::arg ("param_name"), gsi::method ("parameter", (double (db::Device::*) (const std::string &) const) &db::Device::parameter_value, gsi::arg ("param_name"),
"@brief Gets the parameter value for the given parameter name.\n" "@brief Gets the parameter value for the given parameter name.\n"
"If the parameter name is not valid, an exception is thrown." "If the parameter name is not valid, an exception is thrown."
) + ) +
gsi::method_ext ("set_parameter", &gsi::device_set_parameter_value, gsi::arg ("param_name"), gsi::arg ("value"), gsi::method ("set_parameter", (void (db::Device::*) (const std::string &, double)) &db::Device::set_parameter_value, gsi::arg ("param_name"), gsi::arg ("value"),
"@brief Sets the parameter value for the given parameter name.\n" "@brief Sets the parameter value for the given parameter name.\n"
"If the parameter name is not valid, an exception is thrown." "If the parameter name is not valid, an exception is thrown."
), ),
@ -417,13 +383,21 @@ Class<db::DeviceClass> decl_dbDeviceClass ("db", "DeviceClass",
"Parameter definition IDs are used in some places to reference a specific parameter of a device. " "Parameter definition IDs are used in some places to reference a specific parameter of a device. "
"This method obtains the corresponding definition object." "This method obtains the corresponding definition object."
) + ) +
gsi::method_ext ("has_parameter", &gsi::device_has_param_with_name, gsi::arg ("name"), gsi::method ("has_parameter", &db::DeviceClass::has_parameter_with_name, gsi::arg ("name"),
"@brief Returns true, if the device class has a parameter with the given name.\n" "@brief Returns true, if the device class has a parameter with the given name.\n"
) + ) +
gsi::method_ext ("parameter_id", &gsi::device_param_id_for_name, gsi::arg ("name"), gsi::method ("parameter_id", &db::DeviceClass::parameter_id_for_name, gsi::arg ("name"),
"@brief Returns the parameter ID of the parameter with the given name.\n" "@brief Returns the parameter ID of the parameter with the given name.\n"
"An exception is thrown if there is no parameter with the given name. Use \\has_parameter to check " "An exception is thrown if there is no parameter with the given name. Use \\has_parameter to check "
"whether the name is a valid parameter name." "whether the name is a valid parameter name."
) +
gsi::method ("has_terminal", &db::DeviceClass::has_terminal_with_name, gsi::arg ("name"),
"@brief Returns true, if the device class has a terminal with the given name.\n"
) +
gsi::method ("terminal_id", &db::DeviceClass::terminal_id_for_name, gsi::arg ("name"),
"@brief Returns the terminal ID of the terminal with the given name.\n"
"An exception is thrown if there is no terminal with the given name. Use \\has_terminal to check "
"whether the name is a valid terminal name."
), ),
"@brief A class describing a specific type of device.\n" "@brief A class describing a specific type of device.\n"
"Device class objects live in the context of a \\Netlist object. After a " "Device class objects live in the context of a \\Netlist object. After a "