From 3dc3349d88ee05f367f4e9bc5929a74c5f3659a7 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Fri, 1 Dec 2023 22:02:26 +0100 Subject: [PATCH] 'Trace all nets': provide a selection dialog for the stack. --- src/layui/layui/layNetlistBrowserDialog.cc | 8 +- src/layui/layui/layNetlistBrowserPage.cc | 4 +- .../lay_plugin/layNetTracerDialog.cc | 100 ++++++++++++++++-- .../lay_plugin/layNetTracerDialog.h | 1 + 4 files changed, 102 insertions(+), 11 deletions(-) diff --git a/src/layui/layui/layNetlistBrowserDialog.cc b/src/layui/layui/layNetlistBrowserDialog.cc index 9f393573a..10c798adb 100644 --- a/src/layui/layui/layNetlistBrowserDialog.cc +++ b/src/layui/layui/layNetlistBrowserDialog.cc @@ -677,7 +677,13 @@ NetlistBrowserDialog::l2ndbs_changed () for (unsigned int i = 0; i < view ()->num_l2ndbs (); ++i) { const db::LayoutToNetlist *l2ndb = view ()->get_l2ndb (i); - mp_ui->l2ndb_cb->addItem (tl::to_qstring (l2ndb->name ())); + std::string text = l2ndb->name (); + if (! l2ndb->description ().empty ()) { + text += " ("; + text += l2ndb->description (); + text += ")"; + } + mp_ui->l2ndb_cb->addItem (tl::to_qstring (text)); if (l2ndb->name () == m_l2ndb_name) { l2n_index = i; } diff --git a/src/layui/layui/layNetlistBrowserPage.cc b/src/layui/layui/layNetlistBrowserPage.cc index e8c3947ed..3c24089ae 100644 --- a/src/layui/layui/layNetlistBrowserPage.cc +++ b/src/layui/layui/layNetlistBrowserPage.cc @@ -1345,7 +1345,7 @@ bbox_for_circuit (const db::Layout *layout, const db::Circuit *circuit) void NetlistBrowserPage::adjust_view () { - if (! mp_database.get () || ! mp_view) { + if (! mp_database.get () || ! mp_database->netlist () || ! mp_view) { return; } @@ -1666,7 +1666,7 @@ NetlistBrowserPage::update_highlights () } clear_markers (); - if (! mp_database.get () || ! mp_view) { + if (! mp_database.get () || ! mp_database->netlist () || ! mp_view) { return; } diff --git a/src/plugins/tools/net_tracer/lay_plugin/layNetTracerDialog.cc b/src/plugins/tools/net_tracer/lay_plugin/layNetTracerDialog.cc index 42c5c86b4..c3248abf6 100644 --- a/src/plugins/tools/net_tracer/lay_plugin/layNetTracerDialog.cc +++ b/src/plugins/tools/net_tracer/lay_plugin/layNetTracerDialog.cc @@ -348,10 +348,10 @@ END_PROTECTED } bool -NetTracerDialog::get_net_tracer_setup (const lay::CellView &cv, db::NetTracerData &data) +NetTracerDialog::get_net_tracer_setup_from_tech (const std::string &tech_name, const std::string &stack_name, const db::Layout &layout, db::NetTracerData &data) { // fetch the net tracer data from the technology and apply to the current layout - const db::Technology *tech = cv->technology (); + const db::Technology *tech = db::Technologies::instance ()->technology_by_name (tech_name); if (! tech) { return false; } @@ -361,8 +361,6 @@ NetTracerDialog::get_net_tracer_setup (const lay::CellView &cv, db::NetTracerDat return false; } - std::string stack_name = tl::to_string (stack_selector->itemData (stack_selector->currentIndex ()).toString ()); - const db::NetTracerConnectivity *connectivity = 0; for (auto d = tech_component->begin (); d != tech_component->end () && ! connectivity; ++d) { if (d->name () == stack_name) { @@ -375,10 +373,25 @@ NetTracerDialog::get_net_tracer_setup (const lay::CellView &cv, db::NetTracerDat } // Set up the net tracer environment - data = connectivity->get_tracer_data (cv->layout ()); + data = connectivity->get_tracer_data (layout); return true; } +bool +NetTracerDialog::get_net_tracer_setup (const lay::CellView &cv, db::NetTracerData &data) +{ + // fetch the net tracer data from the technology and apply to the current layout + const db::Technology *tech = cv->technology (); + if (! tech) { + return false; + } + + const std::string &tech_name = tech->name (); + std::string stack_name = tl::to_string (stack_selector->itemData (stack_selector->currentIndex ()).toString ()); + + return get_net_tracer_setup_from_tech (tech_name, stack_name, cv->layout (), data); +} + db::NetTracerNet * NetTracerDialog::do_trace (const db::DBox &start_search_box, const db::DBox &stop_search_box, bool trace_path) { @@ -652,11 +665,16 @@ NetTracerDialog::menu_activated (const std::string &symbol) const lay::CellView &cv = view ()->cellview (view ()->active_cellview_index ()); if (cv.is_valid ()) { + db::RecursiveShapeIterator si (cv->layout (), *cv.cell (), std::vector ()); std::unique_ptr l2ndb (new db::LayoutToNetlist (si)); trace_all_nets (l2ndb.get (), cv, flat); - unsigned int l2ndb_index = view ()->add_l2ndb (l2ndb.release ()); - view ()->open_l2ndb_browser (l2ndb_index, view ()->index_of_cellview (&cv)); + + if (l2ndb->netlist ()) { + unsigned int l2ndb_index = view ()->add_l2ndb (l2ndb.release ()); + view ()->open_l2ndb_browser (l2ndb_index, view ()->index_of_cellview (&cv)); + } + } } else { @@ -1781,13 +1799,79 @@ NetTracerDialog::clear_markers () void NetTracerDialog::trace_all_nets (db::LayoutToNetlist *l2ndb, const lay::CellView &cv, bool flat) { + const db::Technology *tech = cv->technology (); + if (! tech) { + return; + } + + static std::string current_stack; + + QStringList stacks; + std::vector raw_stacks; + int current = 0; + + const db::NetTracerTechnologyComponent *tech_component = dynamic_cast (tech->component_by_name (db::net_tracer_component_name ())); + if (tech_component) { + for (auto d = tech_component->begin (); d != tech_component->end (); ++d) { + raw_stacks.push_back (d->name ()); + if (d->name () == current_stack) { + current = stacks.size (); + } + if (d->name ().empty ()) { + stacks.push_back (tr ("(default)")); + } else { + stacks.push_back (tl::to_qstring (d->name ())); + } + } + } + + if (raw_stacks.empty ()) { + return; + } + + current_stack = raw_stacks.front (); + + if (stacks.size () >= 2) { + bool ok = true; + QString sel = QInputDialog::getItem (parentWidget (), tr ("Select Stack for Net Tracing (All Nets)"), tr ("Stack"), stacks, current, false, &ok); + if (! ok) { + return; + } + current = stacks.indexOf (sel); + if (current < 0) { + return; + } + current_stack = raw_stacks [current]; + } + db::NetTracerData tracer_data; - if (! get_net_tracer_setup (cv, tracer_data)) { + if (! get_net_tracer_setup_from_tech (tech->name (), current_stack, cv->layout (), tracer_data)) { return; } tracer_data.configure_l2n (*l2ndb); + std::string description = flat ? tl::to_string (tr ("Flat nets")) : tl::to_string (tr ("Hierarchical nets")); + std::string name = flat ? "Flat_Nets" : "Hierarchical_Nets"; + if (! tech->name ().empty ()) { + description += ", "; + description += tl::to_string (tr ("Technology")); + description += ": "; + description += tech->name (); + name += "_"; + name += tech->name (); + } + if (! current_stack.empty ()) { + description += ", "; + description += tl::to_string (tr ("Stack")); + description += ": "; + description += current_stack; + name += "_"; + name += current_stack; + } + l2ndb->set_description (description); + l2ndb->set_name (name); + l2ndb->clear_join_nets (); l2ndb->clear_join_net_names (); diff --git a/src/plugins/tools/net_tracer/lay_plugin/layNetTracerDialog.h b/src/plugins/tools/net_tracer/lay_plugin/layNetTracerDialog.h index 8d304c0ba..61306de66 100644 --- a/src/plugins/tools/net_tracer/lay_plugin/layNetTracerDialog.h +++ b/src/plugins/tools/net_tracer/lay_plugin/layNetTracerDialog.h @@ -127,6 +127,7 @@ private: void release_mouse (); db::NetTracerNet *do_trace (const db::DBox &start_search_box, const db::DBox &stop_search_box, bool trace_path); bool get_net_tracer_setup (const lay::CellView &cv, db::NetTracerData &data); + static bool get_net_tracer_setup_from_tech (const std::string &tech_name, const std::string &stack_name, const db::Layout &layout, db::NetTracerData &data); void trace_all_nets (db::LayoutToNetlist *l2ndb, const lay::CellView &cv, bool flat); lay::LayoutViewBase *view ()