Multiple stacks for net tracer - finished selection box in net tracer dialog

This commit is contained in:
Matthias Koefferlein 2022-09-25 19:10:30 +02:00
parent 511f55d4da
commit 7b4b345cf4
7 changed files with 194 additions and 83 deletions

View File

@ -1631,6 +1631,14 @@ LAYBASIC_PUBLIC Class<lay::LayoutViewBase> 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<tl::event<int> (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<tl::Event (lay::LayoutViewBase::*)> (&lay::LayoutViewBase::file_open_event),
"@brief An event indicating that a file was opened\n"
"\n"

View File

@ -2314,6 +2314,8 @@ LayoutViewBase::signal_apply_technology (lay::LayoutHandle *layout_handle)
}
apply_technology_event (int (i));
}
}

View File

@ -677,6 +677,14 @@ public:
*/
tl::event<int> 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<int> apply_technology_event;
/**
* @brief An event signalling that a file has been loaded.
*

View File

@ -29,24 +29,14 @@
<property name="spacing">
<number>6</number>
</property>
<item row="3" column="0" rowspan="2" colspan="8">
<item row="3" column="0" rowspan="2" colspan="9">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="5" column="0" rowspan="2">
<widget class="QPushButton" name="configure_pb">
<property name="text">
<string>Configure</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="0" colspan="8">
<item row="1" column="0" colspan="9">
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
@ -67,7 +57,7 @@ Select one or multiple nets and choose &quot;Export&quot; to export the selected
</property>
</widget>
</item>
<item row="2" column="7">
<item row="2" column="8">
<widget class="QFrame" name="frame">
<property name="minimumSize">
<size>
@ -196,60 +186,7 @@ Select one or multiple nets and choose &quot;Export&quot; to export the selected
</layout>
</widget>
</item>
<item row="5" column="2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>5</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="5" column="3" rowspan="2">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Trace depth:</string>
</property>
</widget>
</item>
<item row="5" column="7" rowspan="2">
<widget class="QPushButton" name="close_pb">
<property name="text">
<string>Close</string>
</property>
</widget>
</item>
<item row="5" column="6" rowspan="2">
<widget class="QLabel" name="tech_info_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="5" column="1" rowspan="2">
<widget class="QPushButton" name="stack_pb">
<property name="text">
<string>Layer Stack</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="2" column="0" colspan="7">
<item row="2" column="0" colspan="8">
<widget class="QSplitter" name="splitter">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
@ -332,7 +269,6 @@ Select one or multiple nets and choose &quot;Export&quot; to export the selected
<property name="font">
<font>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -477,7 +413,23 @@ p, li { white-space: pre-wrap; }
</widget>
</widget>
</item>
<item row="0" column="0" colspan="8">
<item row="5" column="3">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>5</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0" colspan="9">
<widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
@ -488,7 +440,6 @@ p, li { white-space: pre-wrap; }
<property name="font">
<font>
<pointsize>12</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
@ -498,14 +449,54 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="5" column="5" rowspan="2">
<item row="5" column="2">
<widget class="QComboBox" name="stack_selector">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Ignored">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QPushButton" name="stack_pb">
<property name="text">
<string>Layer Stack</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QPushButton" name="configure_pb">
<property name="text">
<string>Configure</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="5" column="8">
<widget class="QPushButton" name="close_pb">
<property name="text">
<string>Close</string>
</property>
</widget>
</item>
<item row="5" column="6">
<widget class="QLabel" name="label_6">
<property name="text">
<string>shapes</string>
</property>
</widget>
</item>
<item row="5" column="4" rowspan="2">
<item row="5" column="5">
<widget class="QLineEdit" name="depth_le">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@ -521,6 +512,26 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="5" column="4">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Trace depth:</string>
</property>
</widget>
</item>
<item row="5" column="7">
<widget class="QLabel" name="tech_info_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>

View File

@ -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<QString> 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 <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) {
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 <const db::NetTracerConnectivity *> (tech->component_by_name (db::net_tracer_component_name ()));
const db::NetTracerTechnologyComponent *tech_component = dynamic_cast <const db::NetTracerTechnologyComponent *> (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

View File

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

View File

@ -300,8 +300,6 @@ NetTracerTechComponentEditor::del_clicked ()
selected_rows.insert (i->row ());
}
stack_tree->setCurrentIndex (QModelIndex ());
int offset = 0;
for (std::set<int>::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 <int>::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 <int>::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);
}
}