diff --git a/src/laybasic/laybasic/gsiDeclLayLayoutViewBase.cc b/src/laybasic/laybasic/gsiDeclLayLayoutViewBase.cc index dc10d5ba7..cef7e30bf 100644 --- a/src/laybasic/laybasic/gsiDeclLayLayoutViewBase.cc +++ b/src/laybasic/laybasic/gsiDeclLayLayoutViewBase.cc @@ -1631,6 +1631,14 @@ LAYBASIC_PUBLIC Class decl_LayoutViewBase ("lay", "LayoutVi "Before version 0.25 this event was based on the observer pattern obsolete now. The corresponding methods " "(add_cellview_observer/remove_cellview_observer) have been removed in 0.25.\n" ) + + gsi::event ("on_apply_technology", static_cast (lay::LayoutViewBase::*)> (&lay::LayoutViewBase::apply_technology_event), gsi::arg ("cellview_index"), + "@brief An event indicating that a cellview has requested a new technology\n" + "\n" + "If the technology of a cellview is changed, this event is triggered.\n" + "The integer parameter of this event will indicate the cellview that has changed.\n" + "\n" + "This event has been introduced in version 0.28.\n" + ) + gsi::event ("on_file_open", static_cast (&lay::LayoutViewBase::file_open_event), "@brief An event indicating that a file was opened\n" "\n" diff --git a/src/laybasic/laybasic/layLayoutViewBase.cc b/src/laybasic/laybasic/layLayoutViewBase.cc index 57c00aa38..e2ec59bce 100644 --- a/src/laybasic/laybasic/layLayoutViewBase.cc +++ b/src/laybasic/laybasic/layLayoutViewBase.cc @@ -2314,6 +2314,8 @@ LayoutViewBase::signal_apply_technology (lay::LayoutHandle *layout_handle) } + apply_technology_event (int (i)); + } } diff --git a/src/laybasic/laybasic/layLayoutViewBase.h b/src/laybasic/laybasic/layLayoutViewBase.h index 5837c042d..d34426ce8 100644 --- a/src/laybasic/laybasic/layLayoutViewBase.h +++ b/src/laybasic/laybasic/layLayoutViewBase.h @@ -677,6 +677,14 @@ public: */ tl::event cellview_changed_event; + /** + * @brief A event signalling that one cellview has requested a new technology + * + * This event is triggered if a cellview has requested a new technology. + * The argument is the index of the cellview that received the new technology. + */ + tl::event apply_technology_event; + /** * @brief An event signalling that a file has been loaded. * diff --git a/src/plugins/tools/net_tracer/lay_plugin/NetTracerDialog.ui b/src/plugins/tools/net_tracer/lay_plugin/NetTracerDialog.ui index 823a74505..8a2669a57 100644 --- a/src/plugins/tools/net_tracer/lay_plugin/NetTracerDialog.ui +++ b/src/plugins/tools/net_tracer/lay_plugin/NetTracerDialog.ui @@ -29,24 +29,14 @@ 6 - + Qt::Horizontal - - - - Configure - - - false - - - - + @@ -67,7 +57,7 @@ Select one or multiple nets and choose "Export" to export the selected - + @@ -196,60 +186,7 @@ Select one or multiple nets and choose "Export" to export the selected - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 5 - 20 - - - - - - - - Trace depth: - - - - - - - Close - - - - - - - - 1 - 0 - - - - - - - - - - - Layer Stack - - - false - - - - + @@ -332,7 +269,6 @@ Select one or multiple nets and choose "Export" to export the selected 12 - 75 true @@ -477,7 +413,23 @@ p, li { white-space: pre-wrap; } - + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 5 + 20 + + + + + @@ -488,7 +440,6 @@ p, li { white-space: pre-wrap; } 12 - 75 false true @@ -498,14 +449,54 @@ p, li { white-space: pre-wrap; } - + + + + + 0 + 0 + + + + QComboBox::AdjustToContents + + + + + + + Layer Stack + + + false + + + + + + + Configure + + + false + + + + + + + Close + + + + shapes - + @@ -521,6 +512,26 @@ p, li { white-space: pre-wrap; } + + + + Trace depth: + + + + + + + + 1 + 0 + + + + + + + diff --git a/src/plugins/tools/net_tracer/lay_plugin/layNetTracerDialog.cc b/src/plugins/tools/net_tracer/lay_plugin/layNetTracerDialog.cc index 454f58330..654212b30 100644 --- a/src/plugins/tools/net_tracer/lay_plugin/layNetTracerDialog.cc +++ b/src/plugins/tools/net_tracer/lay_plugin/layNetTracerDialog.cc @@ -92,7 +92,9 @@ NetTracerDialog::NetTracerDialog (lay::Dispatcher *root, LayoutViewBase *view) view->layer_list_changed_event.add (this, &NetTracerDialog::layer_list_changed); + attach_events (); update_info (); + update_list_of_stacks (); } NetTracerDialog::~NetTracerDialog () @@ -101,6 +103,69 @@ NetTracerDialog::~NetTracerDialog () clear_nets (); } +void +NetTracerDialog::attach_events () +{ + detach_from_all_events (); + + mp_view->layer_list_changed_event.add (this, &NetTracerDialog::layer_list_changed); + + db::Technologies::instance ()->technology_changed_event.add (this, &NetTracerDialog::update_list_of_stacks_with_technology); + db::Technologies::instance ()->technologies_changed_event.add (this, &NetTracerDialog::update_list_of_stacks); + + mp_view->cellviews_changed_event.add (this, &NetTracerDialog::update_list_of_stacks); + mp_view->apply_technology_event.add (this, &NetTracerDialog::update_list_of_stacks_with_cellview); +} + +void +NetTracerDialog::update_list_of_stacks_with_technology (db::Technology *) +{ + update_list_of_stacks (); +} + +void +NetTracerDialog::update_list_of_stacks_with_cellview (int) +{ + update_list_of_stacks (); +} + +void +NetTracerDialog::update_list_of_stacks () +{ + QString current_name = stack_selector->currentText (); + + std::set names; + for (unsigned int cvi = 0; cvi < mp_view->cellviews (); ++cvi) { + const db::Technology *tech = mp_view->cellview (cvi)->technology (); + if (tech) { + 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) { + names.insert (tl::to_qstring (d->name ())); + } + } + } + } + + stack_selector->clear (); + + int current_index = 0; + int i = 0; + for (auto n = names.begin (); n != names.end (); ++n, ++i) { + if (n->isEmpty ()) { + stack_selector->addItem (tr ("(default)"), QVariant (*n)); + } else { + stack_selector->addItem (*n, QVariant (*n)); + } + if (*n == current_name) { + current_index = i; + } + } + + stack_selector->setVisible (stack_selector->count () >= 2); + stack_selector->setCurrentIndex (current_index); +} + void NetTracerDialog::clear_nets () { @@ -290,14 +355,27 @@ NetTracerDialog::get_net_tracer_setup (const lay::CellView &cv, db::NetTracerDat if (! tech) { return false; } - const db::NetTracerConnectivity *tech_component = dynamic_cast (tech->component_by_name (db::net_tracer_component_name ())); + + const db::NetTracerTechnologyComponent *tech_component = dynamic_cast (tech->component_by_name (db::net_tracer_component_name ())); if (! tech_component) { return false; } - // Set up the net tracer environment - data = tech_component->get_tracer_data (cv->layout ()); + 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) { + connectivity = d.operator-> (); + } + } + + if (! connectivity) { + return false; + } + + // Set up the net tracer environment + data = connectivity->get_tracer_data (cv->layout ()); return true; } @@ -545,6 +623,7 @@ NetTracerDialog::configure (const std::string &name, const std::string &value) update_highlights (); adjust_view (); update_info (); + update_list_of_stacks (); } return taken; @@ -1243,6 +1322,7 @@ BEGIN_PROTECTED lay::TechComponentSetupDialog dialog (this, &tech, db::net_tracer_component_name ()); if (dialog.exec ()) { *db::Technologies::instance ()->technology_by_name (tech.name ()) = tech; + update_list_of_stacks (); } END_PROTECTED diff --git a/src/plugins/tools/net_tracer/lay_plugin/layNetTracerDialog.h b/src/plugins/tools/net_tracer/lay_plugin/layNetTracerDialog.h index b777d32e7..f439f4af6 100644 --- a/src/plugins/tools/net_tracer/lay_plugin/layNetTracerDialog.h +++ b/src/plugins/tools/net_tracer/lay_plugin/layNetTracerDialog.h @@ -112,6 +112,11 @@ private: void commit (); size_t get_trace_depth (); + void attach_events (); + void update_list_of_stacks_with_technology (db::Technology *); + void update_list_of_stacks_with_cellview (int); + void update_list_of_stacks (); + void update_highlights (); void adjust_view (); void clear_markers (); diff --git a/src/plugins/tools/net_tracer/lay_plugin/layNetTracerTechComponentEditor.cc b/src/plugins/tools/net_tracer/lay_plugin/layNetTracerTechComponentEditor.cc index f2c19f968..22f69020f 100644 --- a/src/plugins/tools/net_tracer/lay_plugin/layNetTracerTechComponentEditor.cc +++ b/src/plugins/tools/net_tracer/lay_plugin/layNetTracerTechComponentEditor.cc @@ -300,8 +300,6 @@ NetTracerTechComponentEditor::del_clicked () selected_rows.insert (i->row ()); } - stack_tree->setCurrentIndex (QModelIndex ()); - int offset = 0; for (std::set::const_iterator r = selected_rows.begin (); r != selected_rows.end (); ++r) { m_data.erase (m_data.begin () + (*r - offset)); @@ -309,6 +307,7 @@ NetTracerTechComponentEditor::del_clicked () } update (); + stack_tree->setCurrentItem (0); } void @@ -345,11 +344,10 @@ NetTracerTechComponentEditor::move_up_clicked () // select the new items for (std::set ::const_iterator s = selected_rows.begin (); s != selected_rows.end (); ++s) { - stack_tree->selectionModel ()->select (stack_tree->model ()->index (*s, 0), QItemSelectionModel::Select | QItemSelectionModel::Rows); + stack_tree->topLevelItem (*s)->setSelected (true); } - if (n_current >= 0) { - stack_tree->selectionModel ()->select (stack_tree->model ()->index (n_current, 0), QItemSelectionModel::Current | QItemSelectionModel::Rows); + stack_tree->setCurrentItem (stack_tree->topLevelItem (n_current), 0, QItemSelectionModel::Current); } } @@ -389,11 +387,10 @@ NetTracerTechComponentEditor::move_down_clicked () // select the new items for (std::set ::const_iterator s = selected_rows.begin (); s != selected_rows.end (); ++s) { - stack_tree->selectionModel ()->select (stack_tree->model ()->index (*s, 0), QItemSelectionModel::Select | QItemSelectionModel::Rows); + stack_tree->topLevelItem (*s)->setSelected (true); } - if (n_current >= 0) { - stack_tree->selectionModel ()->select (stack_tree->model ()->index (n_current, 0), QItemSelectionModel::Current | QItemSelectionModel::Rows); + stack_tree->setCurrentItem (stack_tree->topLevelItem (n_current), 0, QItemSelectionModel::Current); } }