'Trace all nets': provide a selection dialog for the stack.

This commit is contained in:
Matthias Koefferlein 2023-12-01 22:02:26 +01:00
parent 8da6a131e8
commit 3dc3349d88
4 changed files with 102 additions and 11 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<unsigned int> ());
std::unique_ptr <db::LayoutToNetlist> 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<std::string> raw_stacks;
int current = 0;
const db::NetTracerTechnologyComponent *tech_component = dynamic_cast <const db::NetTracerTechnologyComponent *> (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 ();

View File

@ -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 ()