From 0c73b11f9b21d55f30ed47c00705c1a70e72d77a Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Mon, 3 Oct 2022 22:02:13 +0200 Subject: [PATCH] Added a convenience version for GenericDeviceExtractor#define_terminal which takes terminal and layer names --- src/db/db/gsiDeclDbNetlistDeviceExtractor.cc | 45 ++++++++++++++++++++ testdata/lvs/res_combine3.lvs | 4 +- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/db/db/gsiDeclDbNetlistDeviceExtractor.cc b/src/db/db/gsiDeclDbNetlistDeviceExtractor.cc index 2bf9b60d2..bb5d379eb 100644 --- a/src/db/db/gsiDeclDbNetlistDeviceExtractor.cc +++ b/src/db/db/gsiDeclDbNetlistDeviceExtractor.cc @@ -295,6 +295,30 @@ Class decl_dbNetlistDeviceExtractor ("db", "DeviceEx "This class has been introduced in version 0.26." ); +template +static void +define_terminal_by_names (GenericDeviceExtractor *extractor, db::Device *device, const std::string &terminal_name, const std::string &layer_name, const Shape &shape) +{ + if (! extractor->device_class ()) { + throw tl::Exception (tl::to_string (tr ("No device class registered yet"))); + } + + size_t terminal_id = extractor->device_class ()->terminal_id_for_name (terminal_name); + + size_t layer_id = std::numeric_limits::max (); + for (auto l = extractor->begin_layer_definitions (); l != extractor->end_layer_definitions (); ++l) { + if (l->name == layer_name) { + layer_id = l->index; + } + } + + if (layer_id == std::numeric_limits::max ()) { + throw tl::Exception (tl::to_string (tr ("Not a valid layer name: ")) + layer_name); + } + + extractor->define_terminal (device, terminal_id, layer_id, shape); +} + Class decl_GenericDeviceExtractor (decl_dbNetlistDeviceExtractor, "db", "GenericDeviceExtractor", gsi::callback ("setup", &GenericDeviceExtractor::setup, &GenericDeviceExtractor::cb_setup, "@brief Sets up the extractor.\n" @@ -392,6 +416,27 @@ Class decl_GenericDeviceExtractor (decl_dbNetlistDeviceE "This version produces a point-like terminal. Note that the point is\n" "specified in database units.\n" ) + + gsi::method_ext ("define_terminal", &define_terminal_by_names, + gsi::arg ("device"), gsi::arg ("terminal_name"), gsi::arg ("layer_name"), gsi::arg ("shape"), + "@brief Defines a device terminal using names for terminal and layer.\n" + "\n" + "This convenience version of the ID-based \\define_terminal methods allows using names for terminal and layer.\n" + "It has been introduced in version 0.28." + ) + + gsi::method_ext ("define_terminal", &define_terminal_by_names, + gsi::arg ("device"), gsi::arg ("terminal_name"), gsi::arg ("layer_name"), gsi::arg ("shape"), + "@brief Defines a device terminal using names for terminal and layer.\n" + "\n" + "This convenience version of the ID-based \\define_terminal methods allows using names for terminal and layer.\n" + "It has been introduced in version 0.28." + ) + + gsi::method_ext ("define_terminal", &define_terminal_by_names, + gsi::arg ("device"), gsi::arg ("terminal_name"), gsi::arg ("layer_name"), gsi::arg ("point"), + "@brief Defines a device terminal using names for terminal and layer.\n" + "\n" + "This convenience version of the ID-based \\define_terminal methods allows using names for terminal and layer.\n" + "It has been introduced in version 0.28." + ) + gsi::method ("dbu", &GenericDeviceExtractor::dbu, "@brief Gets the database unit\n" ) + diff --git a/testdata/lvs/res_combine3.lvs b/testdata/lvs/res_combine3.lvs index e0ebec331..c609c0824 100644 --- a/testdata/lvs/res_combine3.lvs +++ b/testdata/lvs/res_combine3.lvs @@ -67,8 +67,8 @@ class ResistorExtractor < RBA::GenericDeviceExtractor device.set_parameter(RBA::DeviceClassResistor::PARAM_L, l) device.set_parameter(RBA::DeviceClassResistor::PARAM_P, 2*l+2*w) device.set_parameter(RBA::DeviceClassResistor::PARAM_W, w) - define_terminal(device, RBA::DeviceClassResistor::TERMINAL_A, 0, terminals[0]); - define_terminal(device, RBA::DeviceClassResistor::TERMINAL_B, 0, terminals[1]); + define_terminal(device, "A", "C", terminals[0]); + define_terminal(device, "B", "C", terminals[1]); end end end