diff --git a/src/laybasic/laybasic/NetInfoDialog.ui b/src/laybasic/laybasic/NetInfoDialog.ui new file mode 100644 index 000000000..2da36ca59 --- /dev/null +++ b/src/laybasic/laybasic/NetInfoDialog.ui @@ -0,0 +1,180 @@ + + + NetInfoDialog + + + + 0 + 0 + 490 + 394 + + + + Net Info + + + + + + + 1 + 0 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 12 + 75 + true + + + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Net Info</span></p></body></html> + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + Detailed + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 10 + 20 + + + + + + + + + + + false + + + QFrame::StyledPanel + + + QTextEdit::NoWrap + + + 0 + + + 1 + + + + + + + + + + QDialogButtonBox::Close + + + + + + + + + buttonBox + rejected() + NetInfoDialog + accept() + + + 439 + 373 + + + 398 + 389 + + + + + diff --git a/src/laybasic/laybasic/NetlistBrowserPage.ui b/src/laybasic/laybasic/NetlistBrowserPage.ui index 6148fbd1e..030339e09 100644 --- a/src/laybasic/laybasic/NetlistBrowserPage.ui +++ b/src/laybasic/laybasic/NetlistBrowserPage.ui @@ -49,7 +49,7 @@ - 0 + 5 0 @@ -72,6 +72,9 @@ QFrame::Raised + + 2 + 0 @@ -112,6 +115,23 @@ + + + + Show more information about nets + + + ... + + + + :/info_16.png:/info_16.png + + + true + + + @@ -164,25 +184,32 @@ + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 6 + 20 + + + + + + + + Probe + + + - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 6 - - - - @@ -241,23 +268,6 @@ 0 - - - - Show more information about nets - - - ... - - - - :/info_16.png:/info_16.png - - - true - - - @@ -268,42 +278,6 @@ - - - - - 0 - 0 - - - - - 0 - 0 - - - - QFrame::NoFrame - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - - diff --git a/src/laybasic/laybasic/layNetInfoDialog.cc b/src/laybasic/laybasic/layNetInfoDialog.cc new file mode 100644 index 000000000..36e8b4396 --- /dev/null +++ b/src/laybasic/laybasic/layNetInfoDialog.cc @@ -0,0 +1,492 @@ + +/* + + KLayout Layout Viewer + Copyright (C) 2006-2019 Matthias Koefferlein + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + +#include "layNetInfoDialog.h" +#include "tlXMLWriter.h" + +#include "ui_NetInfoDialog.h" + +#include + +namespace lay +{ + +NetInfoDialog::NetInfoDialog (QWidget *parent) + : QDialog (parent), m_needs_update (false) +{ + ui = new Ui::NetInfoDialog (); + ui->setupUi (this); + + connect (ui->detailed_cb, SIGNAL (stateChanged (int)), this, SLOT (detailed_checkbox_clicked ())); +} + +NetInfoDialog::~NetInfoDialog () +{ + delete ui; + ui = 0; +} + +void NetInfoDialog::needs_update () +{ + if (! isVisible ()) { + m_needs_update = true; + } else { + update_info_text (); + m_needs_update = false; + } +} + +void NetInfoDialog::set_nets (const db::LayoutToNetlist *l2ndb, const std::vector &nets) +{ + mp_l2ndb = const_cast (l2ndb); + mp_nets.clear (); + for (std::vector::const_iterator n = nets.begin (); n != nets.end (); ++n) { + mp_nets.push_back (const_cast (*n)); + } + needs_update (); +} + +void NetInfoDialog::detailed_checkbox_clicked () +{ + needs_update (); +} + +void NetInfoDialog::showEvent (QShowEvent * /*event*/) +{ + if (isVisible () && m_needs_update) { + needs_update (); + } +} + +size_t count_shapes (db::LayoutToNetlist *l2ndb, db::Net *net, unsigned int layer) +{ + if (! net || ! net->circuit ()) { + return 0; + } + + db::cell_index_type cell_index = net->circuit ()->cell_index (); + size_t cluster_id = net->cluster_id (); + + size_t n = 0; + for (db::recursive_cluster_shape_iterator shapes (l2ndb->net_clusters (), layer, cell_index, cluster_id); ! shapes.at_end (); ++shapes) { + ++n; + } + return n; +} + +size_t count_shapes (db::LayoutToNetlist *l2ndb, db::Net *net) +{ + size_t n = 0; + + const db::Connectivity &conn = l2ndb->connectivity (); + for (db::Connectivity::layer_iterator layer = conn.begin_layers (); layer != conn.end_layers (); ++layer) { + n += count_shapes (l2ndb, net, *layer); + } + + return n; +} + +static std::string layer_string (const db::LayoutToNetlist *l2ndb, unsigned int layer) +{ + const db::Layout *ly = l2ndb->internal_layout (); + + db::LayerProperties lp = ly->get_properties (layer); + std::string l = l2ndb->name (layer); + if (! lp.is_null ()) { + if (! l.empty ()) { + l += " "; + } + l += lp.to_string (); + } + + if (l.empty ()) { + return ""; + } else { + return l; + } +} + +void NetInfoDialog::update_info_text () +{ + bool detailed = ui->detailed_cb->isChecked (); + + std::ostringstream info_stream; + info_stream.imbue (std::locale ("C")); + + tl::XMLWriter info (info_stream); + + info.start_document (""); + info.start_element ("html"); + info.start_element ("body"); + + if (! mp_l2ndb.get () || mp_nets.empty () || ! mp_l2ndb->internal_layout ()) { + + info.start_element ("p"); + info.cdata (tl::to_string (QObject::tr ("No net selected"))); + info.end_element ("p"); + + } else { + + info.start_element ("table"); + info.write_attribute ("cellspacing", "6"); + + info.start_element ("tr"); + info.start_element ("th"); + info.cdata (tl::to_string (tr ("Net"))); + info.end_element ("th"); + info.start_element ("th"); + info.cdata (tl::to_string (tr ("Shapes"))); + info.end_element ("th"); + info.start_element ("th"); + info.cdata (tl::to_string (tr ("Device terminals"))); + info.end_element ("th"); + info.start_element ("th"); + info.cdata (tl::to_string (tr ("Subcircuit pins"))); + info.end_element ("th"); + info.start_element ("th"); + info.cdata (tl::to_string (tr ("Circuit pins"))); + info.end_element ("th"); + info.end_element ("tr"); + + size_t shapes = 0, terminals = 0, pins = 0, subcircuit_pins = 0; + + for (tl::weak_collection::iterator net = mp_nets.begin (); net != mp_nets.end (); ++net) { + + info.start_element ("tr"); + + info.start_element ("td"); + info.cdata (net->expanded_name ()); + info.end_element ("td"); + + size_t n; + + info.start_element ("td"); + n = count_shapes (mp_l2ndb.get (), net.operator-> ()); + shapes += n; + info.cdata (tl::to_string (n)); + info.end_element ("td"); + + info.start_element ("td"); + n = net->terminal_count (); + terminals += n; + info.cdata (tl::to_string (n)); + info.end_element ("td"); + + info.start_element ("td"); + n = net->subcircuit_pin_count (); + subcircuit_pins += n; + info.cdata (tl::to_string (n)); + info.end_element ("td"); + + info.start_element ("td"); + n = net->pin_count (); + pins += n; + info.cdata (tl::to_string (n)); + info.end_element ("td"); + + info.end_element ("tr"); + + } + + if (mp_nets.size () > 1) { + + info.start_element ("tr"); + + info.start_element ("td"); + info.cdata (tl::to_string (tr ("(total)"))); + info.end_element ("td"); + + info.start_element ("td"); + info.cdata (tl::to_string (shapes)); + info.end_element ("td"); + + info.start_element ("td"); + info.cdata (tl::to_string (terminals)); + info.end_element ("td"); + + info.start_element ("td"); + info.cdata (tl::to_string (subcircuit_pins)); + info.end_element ("td"); + + info.start_element ("td"); + info.cdata (tl::to_string (pins)); + info.end_element ("td"); + + info.end_element ("tr"); + + } + + info.end_element ("table"); + + if (mp_nets.size () == 1 && detailed) { + + const db::Net *net = mp_nets.front (); + const db::Layout *ly = mp_l2ndb->internal_layout (); + db::cell_index_type cell_index = net->circuit ()->cell_index (); + size_t cluster_id = net->cluster_id (); + + double dbu_unidir = ly->dbu (); + db::CplxTrans dbu (ly->dbu ()); + db::VCplxTrans dbuinv = dbu.inverted (); + + size_t max_shapes = 2000; + + info.start_element ("hr"); + info.end_element ("hr"); + + info.start_element ("h3"); + info.cdata (tl::to_string (QObject::tr ("Details:"))); + info.end_element ("h3"); + + info.start_element ("p"); + info.start_element ("b"); + info.cdata (tl::to_string (QObject::tr ("Net name: "))); + info.end_element ("b"); + info.cdata (net->expanded_name ()); + info.start_element ("br"); + info.end_element ("br"); + info.start_element ("b"); + info.cdata (tl::to_string (QObject::tr ("Circuit: "))); + info.end_element ("b"); + info.cdata (net->circuit () ? net->circuit ()->name () : "(null)"); + info.end_element ("p"); + + std::map > shapes; + + // map as (layernumber, group of shapes by layer): + std::map > shapes_by_layer; + std::map layer_names; + std::map::area_type> statinfo_area; + std::map::perimeter_type> statinfo_perimeter; + + size_t tot_shapes = 0; + bool incomplete = false; + + const db::Connectivity &conn = mp_l2ndb->connectivity (); + for (db::Connectivity::layer_iterator layer = conn.begin_layers (); layer != conn.end_layers (); ++layer) { + + std::string l = layer_string (mp_l2ndb.get (), *layer); + + for (db::recursive_cluster_shape_iterator si (mp_l2ndb->net_clusters (), *layer, cell_index, cluster_id); ! si.at_end (); ++si) { + + if (tot_shapes++ >= max_shapes) { + incomplete = true; + break; + } + + // Check if layer is already detected, otherwise create vector-of-Shape object to hold shapes + // plus initialize the perimeter and area sums + std::map >::iterator s = shapes_by_layer.find (*layer); + if (s == shapes_by_layer.end ()) { + s = shapes_by_layer.insert (std::make_pair (*layer, std::vector ())).first; + layer_names.insert (std::make_pair (*layer, l)); + statinfo_perimeter.insert (std::make_pair (*layer, db::coord_traits::perimeter_type (0))); + statinfo_area.insert (std::make_pair (*layer, db::coord_traits::area_type (0))); + } + + s->second.push_back (si->instantiate ()); + + std::string c (ly->cell_name (si.cell_index ())); + c += " (with "; + c += (dbu * db::CplxTrans (si.trans ()) * dbuinv).to_string (); + c += ")"; + + std::string t; + if (s->second.back ().is_box ()) { + t = tl::to_string (QObject::tr ("box on ")) + l + ": " + (dbu * s->second.back ().box ()).to_string (); + } else { + t = tl::to_string (QObject::tr ("polygon on ")) + l + ": " + (dbu * s->second.back ()).to_string (); + } + + shapes.insert (std::make_pair (c, std::set ())).first->second.insert (t); + + } + + } + + // Try to merge all shaped to polygons, use Map of (layernumber, group of polygons by layer) + std::map > polygons_by_layer; + for (std::map >::iterator i = shapes_by_layer.begin(); i != shapes_by_layer.end (); ++i) { + + unsigned int l = i->first; + + db::EdgeProcessor ep; + std::vector &merged = polygons_by_layer.insert (std::make_pair (l, std::vector ())).first->second; + ep.merge(i->second, merged, 0, true, true); + + db::coord_traits::area_type area = 0; + db::coord_traits::perimeter_type perimeter = 0; + + // Despite merging, a multitude of seperate non-touching polygons can exist. + for (std::vector ::iterator j = merged.begin (); j != merged.end (); ++j) { + // Sum area + area += j->area (); + // Sum perimeter for the merged polygon + perimeter += j->perimeter (); + } + + statinfo_area [l] += area; + statinfo_perimeter [l] += perimeter; + + } + + if (! shapes.empty ()) { + + if (! incomplete) { + + info.start_element ("h3"); + info.cdata (tl::to_string (QObject::tr ("Geometry:"))); + info.end_element ("h3"); + + db::coord_traits::area_type total_area = 0; + db::coord_traits::perimeter_type total_perimeter = 0; + size_t nshapes = 0; + + // Print perimeter and area and sum up total + info.start_element ("table"); + info.write_attribute ("cellspacing", "6"); + + info.start_element ("tr"); + info.start_element ("td"); + info.start_element ("b"); + info.cdata (tl::to_string (QObject::tr ("Layer"))); + info.end_element ("b"); + info.end_element ("td"); + info.start_element ("td"); + info.start_element ("b"); + info.cdata (tl::to_string (QObject::tr ("Shapes"))); + info.end_element ("b"); + info.end_element ("td"); + info.start_element ("td"); + info.start_element ("b"); + info.cdata (tl::to_string (QObject::tr ("Perimeter"))); + info.start_element ("br"); + info.end_element ("br"); + info.cdata (tl::to_string (QObject::tr ("(micron)"))); + info.end_element ("b"); + info.end_element ("td"); + info.start_element ("td"); + info.start_element ("b"); + info.cdata (tl::to_string (QObject::tr ("Area"))); + info.start_element ("br"); + info.end_element ("br"); + info.cdata (tl::to_string (QObject::tr ("(square micron)"))); + info.end_element ("b"); + info.end_element ("td"); + info.end_element ("tr"); + + for (std::map::area_type>::iterator i = statinfo_area.begin (); i != statinfo_area.end(); ++i) { + + unsigned int l = i->first; + size_t n; + double v; + + info.start_element ("tr"); + info.start_element ("td"); + info.cdata (layer_names [l]); + info.end_element ("td"); + info.start_element ("td"); + n = shapes_by_layer [l].size (); + nshapes += n; + info.cdata (tl::to_string (n)); + info.end_element ("td"); + info.start_element ("td"); + v = statinfo_perimeter [l]; + total_perimeter += v; + info.cdata (tl::micron_to_string (v * dbu_unidir)); + info.end_element ("td"); + info.start_element ("td"); + v = statinfo_area[l]; + total_area += v; + info.cdata (tl::to_string (v * dbu_unidir * dbu_unidir)); + info.end_element ("td"); + info.end_element ("tr"); + + } + + // Only if more than one layer is involved, print summed values + if (statinfo_area.size () != 1) { + + info.start_element ("tr"); + info.start_element ("td"); + info.cdata (tl::to_string (QObject::tr ("(total)"))); + info.end_element ("td"); + info.start_element ("td"); + info.cdata (tl::to_string (nshapes)); + info.end_element ("td"); + info.start_element ("td"); + info.cdata (tl::micron_to_string (total_perimeter * dbu_unidir)); + info.end_element ("td"); + info.start_element ("td"); + info.cdata (tl::to_string (total_area * dbu_unidir * dbu_unidir)); + info.end_element ("td"); + info.end_element ("tr"); + + } + + info.end_element ("table"); + + } + + info.start_element ("h3"); + info.cdata (tl::to_string (QObject::tr ("Shapes:"))); + info.end_element ("h3"); + + for (std::map >::const_iterator s = shapes.begin (); s != shapes.end (); ++s) { + + info.start_element ("p"); + + info.start_element ("b"); + info.cdata (tl::to_string (QObject::tr ("Cell "))); + info.cdata (s->first); + info.cdata (":"); + info.end_element ("b"); + + for (std::set ::const_iterator l = s->second.begin (); l != s->second.end (); ++l) { + info.start_element ("br"); + info.end_element ("br"); + info.cdata (*l); + } + + info.end_element ("p"); + + } + + if (incomplete) { + info.start_element ("p"); + info.cdata ("..."); + info.end_element ("p"); + } + + } + + } + + } + + info.end_element ("body"); + info.end_element ("html"); + + ui->net_info_text->setHtml (tl::to_qstring (info_stream.str ())); +} + +} diff --git a/src/laybasic/laybasic/layNetInfoDialog.h b/src/laybasic/laybasic/layNetInfoDialog.h new file mode 100644 index 000000000..379ea5b49 --- /dev/null +++ b/src/laybasic/laybasic/layNetInfoDialog.h @@ -0,0 +1,75 @@ + +/* + + KLayout Layout Viewer + Copyright (C) 2006-2019 Matthias Koefferlein + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + + +#ifndef HDR_layNetInfoDialog +#define HDR_layNetInfoDialog + +#include "ui_NetInfoDialog.h" + +#include "dbLayoutToNetlist.h" +#include "tlObjectCollection.h" + +#include + +namespace Ui +{ + class NetInfoDialog; +} + +namespace lay +{ + +/** + * @brief A dialog showing the details of a net + */ +class NetInfoDialog + : public QDialog +{ + Q_OBJECT + +public: + NetInfoDialog (QWidget *parent); + ~NetInfoDialog (); + + void set_nets (const db::LayoutToNetlist *l2ndb, const std::vector &nets); + +private slots: + void detailed_checkbox_clicked (); + +protected: + void showEvent (QShowEvent *); + +private: + tl::weak_ptr mp_l2ndb; + tl::weak_collection mp_nets; + bool m_needs_update; + Ui::NetInfoDialog *ui; + + void update_info_text (); + void needs_update (); +}; + +} + +#endif + diff --git a/src/laybasic/laybasic/layNetlistBrowserPage.cc b/src/laybasic/laybasic/layNetlistBrowserPage.cc index 849f2e364..6c114b8a2 100644 --- a/src/laybasic/laybasic/layNetlistBrowserPage.cc +++ b/src/laybasic/laybasic/layNetlistBrowserPage.cc @@ -26,6 +26,7 @@ #include "layCellView.h" #include "layLayoutView.h" #include "layMarker.h" +#include "layNetInfoDialog.h" #include "dbLayoutToNetlist.h" #include "dbNetlistDeviceClasses.h" @@ -1671,7 +1672,8 @@ NetlistBrowserPage::NetlistBrowserPage (QWidget * /*parent*/) m_history_ptr (0), m_signals_enabled (true), m_enable_updates (true), - m_update_needed (true) + m_update_needed (true), + mp_info_dialog (0) { Ui::NetlistBrowserPage::setupUi (this); @@ -1826,9 +1828,11 @@ NetlistBrowserPage::selected_nets () QModelIndexList selection = directory_tree->selectionModel ()->selectedIndexes (); for (QModelIndexList::const_iterator i = selection.begin (); i != selection.end (); ++i) { - const db::Net *net = model->net_from_index (*i); - if (net) { - nets.push_back (net); + if (i->column () == 0) { + const db::Net *net = model->net_from_index (*i); + if (net) { + nets.push_back (net); + } } } @@ -1838,7 +1842,11 @@ NetlistBrowserPage::selected_nets () void NetlistBrowserPage::net_selection_changed () { - highlight_nets (selected_nets ()); + std::vector nets = selected_nets (); + if (mp_info_dialog) { + mp_info_dialog->set_nets (mp_database.get (), nets); + } + highlight_nets (nets); } void @@ -1944,7 +1952,12 @@ NetlistBrowserPage::navigate_forward () void NetlistBrowserPage::info_button_pressed () { - // @@@ + if (! mp_info_dialog) { + mp_info_dialog = new lay::NetInfoDialog (this); + } + + mp_info_dialog->set_nets (mp_database.get (), selected_nets ()); + mp_info_dialog->show (); } static QModelIndex find_next (QAbstractItemModel *model, const QRegExp &to_find, const QModelIndex &from) @@ -2067,6 +2080,11 @@ NetlistBrowserPage::show_all (bool f) void NetlistBrowserPage::set_l2ndb (db::LayoutToNetlist *database) { + if (mp_info_dialog) { + delete mp_info_dialog; + mp_info_dialog = 0; + } + mp_database.reset (database); clear_markers (); highlight_nets (std::vector ()); @@ -2209,8 +2227,6 @@ NetlistBrowserPage::update_highlights () } clear_markers (); - info_label->setText (QString ()); - if (! mp_database.get () || ! mp_view) { return; } @@ -2321,6 +2337,9 @@ NetlistBrowserPage::update_highlights () info_label->setText (tl::to_qstring ("

" + tl::to_string (QObject::tr ("Not all shapes are highlighted")) + "

")); + info_label->show (); + } else { + info_label->hide (); } } diff --git a/src/laybasic/laybasic/layNetlistBrowserPage.h b/src/laybasic/laybasic/layNetlistBrowserPage.h index c10b3772b..1bd372d92 100644 --- a/src/laybasic/laybasic/layNetlistBrowserPage.h +++ b/src/laybasic/laybasic/layNetlistBrowserPage.h @@ -42,6 +42,7 @@ namespace lay class LayoutView; class PluginRoot; class Marker; +class NetInfoDialog; // ---------------------------------------------------------------------------------- // NetColorizer definition @@ -333,6 +334,7 @@ private: bool m_enable_updates; bool m_update_needed; std::vector m_current_nets; + lay::NetInfoDialog *mp_info_dialog; void add_to_history (void *id, bool fwd); void navigate_to (void *id, bool forward = true); diff --git a/src/laybasic/laybasic/laybasic.pro b/src/laybasic/laybasic/laybasic.pro index 752ad5ed2..d8e1a4659 100644 --- a/src/laybasic/laybasic/laybasic.pro +++ b/src/laybasic/laybasic/laybasic.pro @@ -69,7 +69,8 @@ FORMS = \ NetlistBrowserPage.ui \ NetlistBrowserConfigPage.ui \ NetlistBrowserConfigPage2.ui \ - NetlistBrowserDialog.ui + NetlistBrowserDialog.ui \ + NetInfoDialog.ui RESOURCES = \ laybasicResources.qrc @@ -167,7 +168,8 @@ SOURCES = \ layNetlistBrowser.cc \ layNetlistBrowserDialog.cc \ layNetlistBrowserPage.cc \ - layItemDelegates.cc + layItemDelegates.cc \ + layNetInfoDialog.cc HEADERS = \ gtf.h \ @@ -257,7 +259,8 @@ HEADERS = \ layNetlistBrowser.h \ layNetlistBrowserDialog.h \ layNetlistBrowserPage.h \ - layItemDelegates.h + layItemDelegates.h \ + layNetInfoDialog.h INCLUDEPATH += $$TL_INC $$GSI_INC $$DB_INC $$RDB_INC DEPENDPATH += $$TL_INC $$GSI_INC $$DB_INC $$RDB_INC diff --git a/src/plugins/tools/net_tracer/lay_plugin/NetTracerDialog.ui b/src/plugins/tools/net_tracer/lay_plugin/NetTracerDialog.ui index c286503f9..aa6d47d46 100644 --- a/src/plugins/tools/net_tracer/lay_plugin/NetTracerDialog.ui +++ b/src/plugins/tools/net_tracer/lay_plugin/NetTracerDialog.ui @@ -1,7 +1,8 @@ - + + NetTracerDialog - - + + 0 0 @@ -9,50 +10,55 @@ 504 - + Net Trace - - + + 9 - + + 9 + + + 9 + + + 9 + + 6 - - - - - 5 - 1 + + + + 0 0 - - Choose "Trace Net" and click at one point in the net to trace the net and add it to the list. + + Choose "Trace Net" and click at one point in the net to trace the net and add it to the list. Double-click the net entry to rename it. -Select one or multiple nets and choose "Export" to export the selected nets to a new layout or cell. +Select one or multiple nets and choose "Export" to export the selected nets to a new layout or cell. - + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - + true - - - - - 5 - 1 + + + + 0 0 - + 12 75 @@ -60,130 +66,142 @@ Select one or multiple nets and choose "Export" to export the selected nets to a true - + Net Tracer - - - + + + Qt::Horizontal - - - + + + Configure - + false - - - + + + Layer Stack - + false - - - - - 7 - 5 + + + + 0 1 - + Qt::Horizontal - - - - 7 - 7 + + + 0 0 - + QAbstractItemView::ExtendedSelection - + true - - - - 5 - 5 + + + 1 0 - + QFrame::StyledPanel - + QFrame::Raised - - - 9 - - + + 6 + + 9 + + + 9 + + + 9 + + + 9 + - - + + QFrame::NoFrame - + QFrame::Raised - - - 0 - - + + 6 + + 0 + + + 0 + + + 0 + + + 0 + - - + + 12 75 true - - <html><head><meta name="qrichtext" content="1" /><style type="text/css"> + + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:600; font-style:normal; text-decoration:none;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Net Info</span></p></body></html> +</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:600; font-style:normal; text-decoration:none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Net Info</span></p></body></html> - + Qt::Horizontal - + QSizePolicy::Fixed - + 10 20 @@ -192,21 +210,21 @@ p, li { white-space: pre-wrap; } - - + + Detailed - + Qt::Horizontal - + QSizePolicy::Expanding - + 10 20 @@ -215,15 +233,15 @@ p, li { white-space: pre-wrap; } - - + + Color - - + + Color @@ -232,59 +250,68 @@ p, li { white-space: pre-wrap; } - - + + false - + QFrame::StyledPanel - + QTextEdit::NoWrap - + 0 - + 1 - - + + QFrame::NoFrame - + QFrame::Raised - - - 0 - - + + 6 + + 0 + + + 0 + + + 0 + + + 0 + - - + + Export - - + + Export To Text - + Qt::Horizontal - + 40 20 @@ -299,59 +326,68 @@ p, li { white-space: pre-wrap; } - - - + + + 0 0 - + QFrame::NoFrame - + QFrame::Raised - - - 0 - - + + 6 + + 0 + + + 0 + + + 0 + + + 0 + - - + + Trace Net - + true - + false - + true - - + + Lock - + Qt::Vertical - + QSizePolicy::Fixed - + 20 10 @@ -360,21 +396,21 @@ p, li { white-space: pre-wrap; } - - + + Trace Path - + Qt::Vertical - + QSizePolicy::Fixed - + 20 10 @@ -383,25 +419,25 @@ p, li { white-space: pre-wrap; } - - + + Delete - - + + Clear All - + Qt::Vertical - + 11 261 @@ -410,8 +446,8 @@ p, li { white-space: pre-wrap; } - - + + Redo @@ -419,24 +455,22 @@ p, li { white-space: pre-wrap; } - - - - - 5 - 5 + + + + 1 0 - + - - - + + + Close @@ -466,9 +500,7 @@ p, li { white-space: pre-wrap; } stack_pb close_pb - - - + close_pb @@ -476,11 +508,11 @@ p, li { white-space: pre-wrap; } NetTracerDialog accept() - + 512 458 - + 422 472