mirror of https://github.com/KLayout/klayout.git
Multiple stacks for net tracer - finished selection box in net tracer dialog
This commit is contained in:
parent
511f55d4da
commit
7b4b345cf4
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -2314,6 +2314,8 @@ LayoutViewBase::signal_apply_technology (lay::LayoutHandle *layout_handle)
|
|||
|
||||
}
|
||||
|
||||
apply_technology_event (int (i));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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 "Export" 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 "Export" 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 "Export" 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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue