diff --git a/src/db/db/gsiDeclDbLayoutToNetlist.cc b/src/db/db/gsiDeclDbLayoutToNetlist.cc index 76dacfb14..cedc464ab 100644 --- a/src/db/db/gsiDeclDbLayoutToNetlist.cc +++ b/src/db/db/gsiDeclDbLayoutToNetlist.cc @@ -566,7 +566,7 @@ Class decl_dbLayoutToNetlist ("db", "LayoutToNetlist", "This variant accepts a micrometer-unit location. The location is given in the\n" "coordinate space of the initial cell.\n" "\n" - "The \\sc_path_out parameter has been added in version 0.27.\n" + "The \\sc_path_out and \\initial_circuit parameters have been added in version 0.27.\n" ) + gsi::method ("probe_net", (db::Net *(db::LayoutToNetlist::*) (const db::Region &, const db::Point &, std::vector *, db::Circuit *)) &db::LayoutToNetlist::probe_net, gsi::arg ("of_layer"), gsi::arg ("point"), gsi::arg ("sc_path_out", (std::vector *) 0, "nil"), gsi::arg ("initial_circuit", (db::Circuit *) 0, "nil"), "@brief Finds the net by probing a specific location on the given layer\n" @@ -574,7 +574,7 @@ Class decl_dbLayoutToNetlist ("db", "LayoutToNetlist", "This variant accepts a database-unit location. The location is given in the\n" "coordinate space of the initial cell.\n" "\n" - "The \\sc_path_out parameter has been added in version 0.27.\n" + "The \\sc_path_out and \\initial_circuit parameters have been added in version 0.27.\n" ) + gsi::method ("write|write_l2n", &db::LayoutToNetlist::save, gsi::arg ("path"), gsi::arg ("short_format", false), "@brief Writes the extracted netlist to a file.\n" diff --git a/src/laybasic/laybasic/gsiDeclLayNetlistBrowserDialog.cc b/src/laybasic/laybasic/gsiDeclLayNetlistBrowserDialog.cc index dfd7b08af..016afa8d8 100644 --- a/src/laybasic/laybasic/gsiDeclLayNetlistBrowserDialog.cc +++ b/src/laybasic/laybasic/gsiDeclLayNetlistBrowserDialog.cc @@ -42,6 +42,109 @@ template <> struct type_traits : public type_traitsroot = r; +} + +static db::Circuit *root (const lay::NetlistObjectPath *path) +{ + return const_cast (path->root); +} + +static void set_device (lay::NetlistObjectPath *path, db::Device *r) +{ + path->device = r; +} + +static db::Device *device (const lay::NetlistObjectPath *path) +{ + return const_cast (path->device); +} + +static void set_net (lay::NetlistObjectPath *path, db::Net *r) +{ + path->net = r; +} + +static db::Net *net (const lay::NetlistObjectPath *path) +{ + return const_cast (path->net); +} + +static std::vector path (const lay::NetlistObjectPath *p) +{ + std::vector pp; + pp.reserve (p->path.size ()); + for (lay::NetlistObjectPath::path_iterator i = p->path.begin (); i != p->path.end (); ++i) { + pp.push_back (const_cast (*i)); + } + return pp; +} + +static void set_path (lay::NetlistObjectPath *p, const std::vector &path) +{ + p->path = lay::NetlistObjectPath::path_type (path.begin (), path.end ()); +} + +Class decl_NetlistObjectPath ("lay", "NetlistObjectPath", + gsi::method_ext ("root=", &set_root, gsi::arg ("root"), + "@brief Sets the root circuit of the path.\n" + "The root circuit is the circuit from which the path starts.\n" + ) + + gsi::method_ext ("root", &root, + "@brief Gets the root circuit of the path.\n" + ) + + gsi::method_ext ("path=", &set_path, gsi::arg ("path"), + "@brief Sets the path.\n" + "The path is a list of subcircuits leading from the root to the final object. " + "The final (net, device) object is located in the circuit called by the last subcircuit " + "of the subcircuit chain. If the subcircuit list is empty, the final object is located inside " + "the root object." + ) + + gsi::method_ext ("path", &path, + "@brief Gets the path.\n" + ) + + gsi::method_ext ("net=", &set_net, gsi::arg ("net"), + "@brief Sets the net the path points to.\n" + "If the path describes the location of a net, this member will indicate it.\n" + "The other way to describe a final object is \\device=. If neither a device nor " + "net is given, the path describes a circuit and how it is referenced from the root." + ) + + gsi::method_ext ("net", &net, + "@brief Gets the net the path points to.\n" + ) + + gsi::method_ext ("device=", &set_device, gsi::arg ("device"), + "@brief Sets the device the path points to.\n" + "If the path describes the location of a device, this member will indicate it.\n" + "The other way to describe a final object is \\net=. If neither a device nor " + "net is given, the path describes a circuit and how it is referenced from the root." + ) + + gsi::method_ext ("device", &device, + "@brief Gets the device the path points to.\n" + ) + + gsi::method ("is_null", &lay::NetlistObjectPath::is_null, + "@brief Returns a value indicating whether the path is an empty one.\n" + ), + "@brief An object describing the instantiation of an object.\n" + "This class describes the instantiation of a net or a device or a circuit in terms of " + "a root circuit and a subcircuit chain leading to the indicated object.\n" + "\n" + "See \\net= or \\device= for the indicated object, \\path= for the subcircuit chain.\n" + "\n" + "This class has been introduced in version 0.27.\n" +); + +static lay::NetlistObjectPath current_path_first (lay::NetlistBrowserDialog *dialog) +{ + return dialog->current_path ().first (); +} + +static lay::NetlistObjectPath current_path_second (lay::NetlistBrowserDialog *dialog) +{ + return dialog->current_path ().second (); +} + Class decl_NetlistBrowserDialog ("lay", "NetlistBrowserDialog", gsi::event ("on_current_db_changed", &lay::NetlistBrowserDialog::current_db_changed_event, "@brief This event is triggered when the current database is changed.\n" @@ -51,24 +154,32 @@ Class decl_NetlistBrowserDialog ("lay", "NetlistBrows "@brief This event is triggered when the selection changed.\n" "The selection can be obtained with \\selected_nets, \\selected_devices, \\selected_subcircuits and \\selected_circuits." ) + - gsi::event ("on_probe", &lay::NetlistBrowserDialog::probe_event, gsi::arg ("net"), gsi::arg ("subcircuit_path"), + gsi::event ("on_probe", &lay::NetlistBrowserDialog::probe_event, gsi::arg ("first_path"), gsi::arg ("second_path"), "@brief This event is triggered when a net is probed.\n" - "'subcircuit_path' will contain the subcircuit objects leading to the probed net from the netlist databases' top circuit. " + "The first path will indicate the location of the probed net in terms of " + "\\subcircuit_path will contain the subcircuit objects leading to the probed net from the circuit given by \\root_circuit. " "This path may not be complete - it may contain null entries if a cell instance can't be associated with a subcircuit." ) + gsi::method ("db", &lay::NetlistBrowserDialog::db, "@brief Gets the database the browser is connected to.\n" ) + + gsi::method_ext ("current_path_first", ¤t_path_first, + "@brief Gets the path of the current object on the first (layout in case of LVS database) side.\n" + ) + + gsi::method_ext ("current_path_second", ¤t_path_second, + "@brief Gets the path of the current object on the second (schematic in case of LVS database) side.\n" + ) + + // @@@ gsi::method ("selected_nets", &lay::NetlistBrowserDialog::selected_nets, "@brief Gets the nets currently selected in the netlist database browser.\n" ) + - gsi::method ("selected_nets", &lay::NetlistBrowserDialog::selected_devices, + gsi::method ("selected_devices", &lay::NetlistBrowserDialog::selected_devices, "@brief Gets the devices currently selected in the netlist database browser.\n" ) + - gsi::method ("selected_nets", &lay::NetlistBrowserDialog::selected_subcircuits, + gsi::method ("selected_subcircuits", &lay::NetlistBrowserDialog::selected_subcircuits, "@brief Gets the subcircuits currently selected in the netlist database browser.\n" ) + - gsi::method ("selected_nets", &lay::NetlistBrowserDialog::selected_circuits, + gsi::method ("selected_circuits", &lay::NetlistBrowserDialog::selected_circuits, "@brief Gets the circuits currently selected in the netlist database browser.\n" ), "@brief Represents the netlist browser dialog.\n" diff --git a/src/laybasic/laybasic/layNetlistBrowserDialog.cc b/src/laybasic/laybasic/layNetlistBrowserDialog.cc index e225cbf4e..85cc4b4c3 100644 --- a/src/laybasic/laybasic/layNetlistBrowserDialog.cc +++ b/src/laybasic/laybasic/layNetlistBrowserDialog.cc @@ -135,6 +135,17 @@ NetlistBrowserDialog::db () return browser_page->db (); } +const lay::NetlistObjectsPath & +NetlistBrowserDialog::current_path () const +{ + if (browser_page) { + return browser_page->current_path (); + } else { + static lay::NetlistObjectsPath empty; + return empty; + } +} + const std::vector & NetlistBrowserDialog::selected_nets () const { @@ -357,7 +368,9 @@ NetlistBrowserDialog::probe_net (const db::DPoint &p, bool trace_path) browser_page->select_path (path); // emits the probe event - probe_event (net, sc_path); + // NOTE: browser_page->current_path () will hold the paired path with the schematic side being + // expanded. + probe_event (browser_page->current_path ().first (), browser_page->current_path ().second ()); } void diff --git a/src/laybasic/laybasic/layNetlistBrowserDialog.h b/src/laybasic/laybasic/layNetlistBrowserDialog.h index 221408999..2c3d84bcb 100644 --- a/src/laybasic/laybasic/layNetlistBrowserDialog.h +++ b/src/laybasic/laybasic/layNetlistBrowserDialog.h @@ -54,14 +54,21 @@ public: /** * @brief This event is emitted when a shape is probed + * The first path is that of the layout, the second that of the schematic in case of a + * LVS database. */ - tl::event > probe_event; + tl::event probe_event; /** * @brief Gets the current database */ db::LayoutToNetlist *db (); + /** + * @brief Gets the current object's path + */ + const lay::NetlistObjectsPath ¤t_path () const; + /** * @brief Gets the selected nets */ diff --git a/src/laybasic/laybasic/layNetlistBrowserPage.h b/src/laybasic/laybasic/layNetlistBrowserPage.h index 03c695824..88a48acca 100644 --- a/src/laybasic/laybasic/layNetlistBrowserPage.h +++ b/src/laybasic/laybasic/layNetlistBrowserPage.h @@ -168,6 +168,14 @@ public: */ void update_highlights (); + /** + * @brief Gets the current object's path + */ + const lay::NetlistObjectsPath ¤t_path () const + { + return m_current_path; + } + /** * @brief Gets the selected nets */