Functional netlist hierarchy tree.

This commit is contained in:
Matthias Koefferlein
2019-06-06 01:36:07 +02:00
parent 577edea08b
commit 7c220c63e1
18 changed files with 364 additions and 101 deletions
+89 -37
View File
@@ -204,49 +204,95 @@
</widget>
</item>
<item>
<widget class="QTreeView" name="directory_tree">
<widget class="QFrame" name="frame_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>4</height>
</size>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="contextMenuPolicy">
<enum>Qt::ActionsContextMenu</enum>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<attribute name="headerCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="headerShowSortIndicator" stdset="0">
<bool>false</bool>
</attribute>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QTreeView" name="hierarchy_tree">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<attribute name="headerDefaultSectionSize">
<number>100</number>
</attribute>
</widget>
<widget class="QTreeView" name="directory_tree">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="contextMenuPolicy">
<enum>Qt::ActionsContextMenu</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<attribute name="headerCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="headerShowSortIndicator" stdset="0">
<bool>false</bool>
</attribute>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</widget>
</item>
</layout>
</widget>
</item>
<item>
@@ -338,6 +384,12 @@
</customwidget>
</customwidgets>
<tabstops>
<tabstop>backward</tabstop>
<tabstop>forward</tabstop>
<tabstop>info_button</tabstop>
<tabstop>find_text</tabstop>
<tabstop>find_button</tabstop>
<tabstop>hierarchy_tree</tabstop>
<tabstop>directory_tree</tabstop>
</tabstops>
<resources>
@@ -272,15 +272,15 @@ SingleIndexedNetlistModel::parent_of (const subcircuit_pair &subcircuits) const
std::pair<IndexedNetlistModel::circuit_pair, IndexedNetlistModel::Status>
SingleIndexedNetlistModel::top_circuit_from_index (size_t index) const
{
const db::Circuit *c = mp_netlist->begin_top_down () [index];
return std::make_pair (std::make_pair (c, (const db::Circuit *) 0), db::NetlistCrossReference::None);
db::Netlist::const_top_down_circuit_iterator none;
return std::make_pair (attr_by_object_and_index (std::make_pair ((const db::Circuit *) 0, (const db::Circuit *) 0), index, mp_netlist->begin_top_down (), mp_netlist->begin_top_down () + mp_netlist->top_circuit_count (), none, none, m_child_circuit_by_circuit_and_index, sort_by_name<db::Circuit> ()), db::NetlistCrossReference::None);
}
std::pair<IndexedNetlistModel::circuit_pair, IndexedNetlistModel::Status>
SingleIndexedNetlistModel::child_circuit_from_index (const circuit_pair &circuits, size_t index) const
{
const db::Circuit *c = circuits.first->begin_children () [index];
return std::make_pair (std::make_pair (c, (const db::Circuit *) 0), db::NetlistCrossReference::None);
db::Circuit::const_child_circuit_iterator none;
return std::make_pair (attr_by_object_and_index (circuits, index, circuits.first->begin_children (), circuits.first->end_children (), none, none, m_child_circuit_by_circuit_and_index, sort_by_name<db::Circuit> ()), db::NetlistCrossReference::None);
}
std::pair<IndexedNetlistModel::circuit_pair, IndexedNetlistModel::Status>
@@ -303,6 +303,12 @@ SingleIndexedNetlistModel::second_net_for (const db::Net * /*first*/) const
return 0;
}
const db::Circuit *
SingleIndexedNetlistModel::second_circuit_for (const db::Circuit * /*first*/) const
{
return 0;
}
IndexedNetlistModel::net_subcircuit_pin_pair
SingleIndexedNetlistModel::net_subcircuit_pinref_from_index (const net_pair &nets, size_t index) const
{
@@ -90,6 +90,7 @@ public:
virtual std::pair<circuit_pair, Status> circuit_from_index (size_t index) const = 0;
virtual std::pair<net_pair, Status> net_from_index (const circuit_pair &circuits, size_t index) const = 0;
virtual const db::Net *second_net_for (const db::Net *first) const = 0;
virtual const db::Circuit *second_circuit_for (const db::Circuit *first) const = 0;
virtual net_subcircuit_pin_pair net_subcircuit_pinref_from_index (const net_pair &nets, size_t index) const = 0;
virtual net_terminal_pair net_terminalref_from_index (const net_pair &nets, size_t index) const = 0;
virtual net_pin_pair net_pinref_from_index (const net_pair &nets, size_t index) const = 0;
@@ -147,7 +148,8 @@ public:
virtual std::pair<circuit_pair, Status> circuit_from_index (size_t index) const;
virtual std::pair<circuit_pair, Status> child_circuit_from_index (const circuit_pair &circuits, size_t index) const;
virtual std::pair<net_pair, Status> net_from_index (const circuit_pair &circuits, size_t index) const;
virtual const db::Net *second_net_for (const db::Net * /*first*/) const;
virtual const db::Net *second_net_for (const db::Net *first) const;
virtual const db::Circuit *second_circuit_for (const db::Circuit *first) const;
virtual net_subcircuit_pin_pair net_subcircuit_pinref_from_index (const net_pair &nets, size_t index) const;
virtual net_terminal_pair net_terminalref_from_index (const net_pair &nets, size_t index) const;
virtual net_pin_pair net_pinref_from_index (const net_pair &nets, size_t index) const;
@@ -167,6 +169,7 @@ private:
const db::Netlist *mp_netlist;
mutable std::map<netlist_pair, std::vector<circuit_pair> > m_circuit_by_index;
mutable std::map<circuit_pair, std::vector<circuit_pair> > m_child_circuit_by_circuit_and_index;
mutable std::map<circuit_pair, std::vector<net_pair> > m_net_by_circuit_and_index;
mutable std::map<net_pair, std::vector<net_subcircuit_pin_pair> > m_subcircuit_pinref_by_net_and_index;
mutable std::map<net_pair, std::vector<net_terminal_pair> > m_terminalref_by_net_and_index;
@@ -1911,6 +1911,25 @@ NetlistBrowserModel::index_from_net (const db::Net *net) const
return index_from_net (std::make_pair (net, mp_indexer->second_net_for (net)));
}
QModelIndex
NetlistBrowserModel::index_from_circuit (const std::pair<const db::Circuit *, const db::Circuit *> &circuits) const
{
void *id = make_id_circuit (mp_indexer->circuit_index (circuits));
return index_from_id (id, 0);
}
QModelIndex
NetlistBrowserModel::index_from_circuit (const db::Circuit *net) const
{
return index_from_circuit (std::make_pair (net, mp_indexer->second_circuit_for (net)));
}
std::pair<const db::Circuit *, const db::Circuit *>
NetlistBrowserModel::circuit_from_index (const QModelIndex &index) const
{
return circuits_from_id (index.internalPointer ());
}
std::pair<const db::Net *, const db::Net *>
NetlistBrowserModel::net_from_index (const QModelIndex &index) const
{
@@ -135,6 +135,9 @@ public:
std::pair<const db::Net *, const db::Net *> net_from_index (const QModelIndex &index) const;
QModelIndex index_from_net (const std::pair<const db::Net *, const db::Net *> &net) const;
QModelIndex index_from_net (const db::Net *net) const;
std::pair<const db::Circuit *, const db::Circuit *> circuit_from_index (const QModelIndex &index) const;
QModelIndex index_from_circuit (const std::pair<const db::Circuit *, const db::Circuit *> &circuit) const;
QModelIndex index_from_circuit (const db::Circuit *circuit) const;
std::pair<const db::SubCircuit *, const db::SubCircuit *> subcircuit_from_index (const QModelIndex &index) const;
+116 -31
View File
@@ -23,6 +23,7 @@
#include "layNetlistBrowserPage.h"
#include "layNetlistBrowserModel.h"
#include "layNetlistBrowserTreeModel.h"
#include "layItemDelegates.h"
#include "layCellView.h"
#include "layLayoutView.h"
@@ -153,6 +154,14 @@ NetlistBrowserPage::NetlistBrowserPage (QWidget * /*parent*/)
directory_tree->setItemDelegateForColumn (i, delegate);
}
for (int i = 0; i < 2; ++i) {
delegate = new lay::HTMLItemDelegate (this);
delegate->set_text_margin (2);
delegate->set_anchors_clickable (true);
connect (delegate, SIGNAL (anchor_clicked (const QString &)), this, SLOT (anchor_clicked (const QString &)));
hierarchy_tree->setItemDelegateForColumn (i, delegate);
}
QMenu *find_edit_menu = new QMenu (find_text);
find_edit_menu->addAction (actionUseRegularExpressions);
find_edit_menu->addAction (actionCaseSensitive);
@@ -284,14 +293,48 @@ NetlistBrowserPage::anchor_clicked (const QString &a)
navigate_to (id, true);
}
void
NetlistBrowserPage::current_tree_index_changed (const QModelIndex &index)
{
if (index.isValid () && m_signals_enabled) {
NetlistBrowserTreeModel *tree_model = dynamic_cast<NetlistBrowserTreeModel *> (hierarchy_tree->model ());
NetlistBrowserModel *netlist_model = dynamic_cast<NetlistBrowserModel *> (directory_tree->model ());
if (! tree_model || ! netlist_model) {
return;
}
std::pair<const db::Circuit *, const db::Circuit *> circuits = tree_model->circuits_from_index (index);
QModelIndex circuit_index = netlist_model->index_from_circuit (circuits);
m_signals_enabled = false;
directory_tree->setCurrentIndex (circuit_index);
m_signals_enabled = true;
}
}
void
NetlistBrowserPage::current_index_changed (const QModelIndex &index)
{
if (index.isValid () && m_signals_enabled) {
NetlistBrowserTreeModel *tree_model = dynamic_cast<NetlistBrowserTreeModel *> (hierarchy_tree->model ());
NetlistBrowserModel *netlist_model = dynamic_cast<NetlistBrowserModel *> (directory_tree->model ());
if (! tree_model || ! netlist_model) {
return;
}
void *id = index.internalPointer ();
add_to_history (id, true);
std::pair<const db::Circuit *, const db::Circuit *> circuits = netlist_model->circuit_from_index (index);
QModelIndex circuit_index = tree_model->index_from_circuits (circuits);
m_signals_enabled = false;
hierarchy_tree->setCurrentIndex (circuit_index);
m_signals_enabled = true;
}
}
@@ -424,19 +467,26 @@ NetlistBrowserPage::select_color_for_net ()
void
NetlistBrowserPage::navigate_to (void *id, bool fwd)
{
NetlistBrowserModel *model = dynamic_cast<NetlistBrowserModel *> (directory_tree->model ());
if (! model) {
NetlistBrowserTreeModel *tree_model = dynamic_cast<NetlistBrowserTreeModel *> (hierarchy_tree->model ());
NetlistBrowserModel *netlist_model = dynamic_cast<NetlistBrowserModel *> (directory_tree->model ());
if (! tree_model || ! netlist_model) {
return;
}
QModelIndex index = model->index_from_id (id, 0);
QModelIndex index = netlist_model->index_from_id (id, 0);
if (! index.isValid ()) {
return;
}
m_signals_enabled = false;
try {
directory_tree->setCurrentIndex (index);
std::pair<const db::Circuit *, const db::Circuit *> circuits = netlist_model->circuit_from_index (index);
QModelIndex circuit_index = tree_model->index_from_circuits (circuits);
hierarchy_tree->setCurrentIndex (circuit_index);
} catch (...) {
}
m_signals_enabled = true;
@@ -636,43 +686,78 @@ NetlistBrowserPage::set_db (db::LayoutToNetlist *l2ndb)
if (! mp_database.get ()) {
delete directory_tree->model ();
directory_tree->setModel (0);
delete hierarchy_tree->model ();
hierarchy_tree->setModel (0);
return;
}
m_cell_context_cache = db::ContextCache (mp_database->internal_layout ());
// NOTE: with the tree as the parent, the tree will take over ownership of the model
NetlistBrowserModel *new_model = 0;
if (lvsdb) {
new_model = new NetlistBrowserModel (directory_tree, lvsdb, &m_colorizer);
} else {
new_model = new NetlistBrowserModel (directory_tree, l2ndb, &m_colorizer);
}
int columns = directory_tree->model () ? directory_tree->model ()->columnCount (QModelIndex ()) : 0;
int new_columns = new_model->columnCount (QModelIndex ());
delete directory_tree->model ();
directory_tree->setModel (new_model);
connect (directory_tree->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (current_index_changed (const QModelIndex &)));
connect (directory_tree->selectionModel (), SIGNAL (selectionChanged (const QItemSelection &, const QItemSelection &)), this, SLOT (selection_changed ()));
directory_tree->header ()->show ();
directory_tree->header ()->setStretchLastSection (true);
directory_tree->header ()->setMinimumSectionSize (25);
if (columns < new_columns) {
// makes sure new columns are properly size-adjusted
for (int i = std::max (0, columns - 1); i < new_columns; ++i) {
directory_tree->header ()->resizeSection (i, i == 1 ? directory_tree->header ()->minimumSectionSize () : directory_tree->header ()->defaultSectionSize ());
{
// NOTE: with the tree as the parent, the tree will take over ownership of the model
NetlistBrowserModel *new_model = 0;
if (lvsdb) {
new_model = new NetlistBrowserModel (directory_tree, lvsdb, &m_colorizer);
} else {
new_model = new NetlistBrowserModel (directory_tree, l2ndb, &m_colorizer);
}
int columns = directory_tree->model () ? directory_tree->model ()->columnCount (QModelIndex ()) : 0;
int new_columns = new_model->columnCount (QModelIndex ());
delete directory_tree->model ();
directory_tree->setModel (new_model);
connect (directory_tree->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (current_index_changed (const QModelIndex &)));
connect (directory_tree->selectionModel (), SIGNAL (selectionChanged (const QItemSelection &, const QItemSelection &)), this, SLOT (selection_changed ()));
directory_tree->header ()->show ();
directory_tree->header ()->setStretchLastSection (true);
directory_tree->header ()->setMinimumSectionSize (25);
if (columns < new_columns) {
// makes sure new columns are properly size-adjusted
for (int i = std::max (0, columns - 1); i < new_columns; ++i) {
directory_tree->header ()->resizeSection (i, i == 1 ? directory_tree->header ()->minimumSectionSize () : directory_tree->header ()->defaultSectionSize ());
}
}
// hide the status column if not needed
directory_tree->header ()->setSectionHidden (1, new_model->status_column () < 0);
// establish visibility according to "show all"
new_model->set_item_visibility (directory_tree, m_show_all, false /*show warnings only with 'show all'*/);
}
// hide the status column if not needed
directory_tree->header ()->setSectionHidden (1, new_model->status_column () < 0);
{
// NOTE: with the tree as the parent, the tree will take over ownership of the model
NetlistBrowserTreeModel *new_hierarchy_model = 0;
if (lvsdb) {
new_hierarchy_model = new NetlistBrowserTreeModel (hierarchy_tree, lvsdb);
} else {
new_hierarchy_model = new NetlistBrowserTreeModel (hierarchy_tree, l2ndb);
}
// establish visibility according to "show all"
new_model->set_item_visibility (directory_tree, m_show_all, false /*show warnings only with 'show all'*/);
int columns = hierarchy_tree->model () ? hierarchy_tree->model ()->columnCount (QModelIndex ()) : 0;
int new_columns = new_hierarchy_model->columnCount (QModelIndex ());
delete hierarchy_tree->model ();
hierarchy_tree->setModel (new_hierarchy_model);
connect (hierarchy_tree->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (current_tree_index_changed (const QModelIndex &)));
hierarchy_tree->header ()->show ();
hierarchy_tree->header ()->setStretchLastSection (true);
hierarchy_tree->header ()->setMinimumSectionSize (25);
if (columns < new_columns) {
// makes sure new columns are properly size-adjusted
for (int i = std::max (0, columns - 1); i < new_columns; ++i) {
hierarchy_tree->header ()->resizeSection (i, i == 1 ? hierarchy_tree->header ()->minimumSectionSize () : hierarchy_tree->header ()->defaultSectionSize ());
}
}
// hide the status column if not needed
hierarchy_tree->header ()->setSectionHidden (1, new_hierarchy_model->status_column () < 0);
}
find_text->setText (QString ());
}
@@ -169,6 +169,7 @@ private slots:
void navigate_back ();
void navigate_forward ();
void current_index_changed (const QModelIndex &index);
void current_tree_index_changed (const QModelIndex &index);
void selection_changed ();
void browse_color_for_net ();
void select_color_for_net ();
@@ -202,7 +202,7 @@ NetlistBrowserTreeModel::search_text (const QModelIndex &index) const
}
std::pair<std::pair<const db::Circuit *, const db::Circuit *>, db::NetlistCrossReference::Status>
NetlistBrowserTreeModel::cp_status_from_index (const QModelIndex &index, size_t &nprod, size_t &nlast) const
NetlistBrowserTreeModel::cp_status_from_index (const QModelIndex &index, size_t &nprod, size_t &nlast, size_t &nnlast) const
{
typedef std::pair<std::pair<const db::Circuit *, const db::Circuit *>, db::NetlistCrossReference::Status> cp_status;
@@ -210,6 +210,7 @@ NetlistBrowserTreeModel::cp_status_from_index (const QModelIndex &index, size_t
tl_assert (id != 0);
nprod = 1;
nnlast = 1;
nlast = mp_indexer->top_circuit_count () + 1;
size_t i = pop (id, nlast);
@@ -217,6 +218,7 @@ NetlistBrowserTreeModel::cp_status_from_index (const QModelIndex &index, size_t
cp_status cps = mp_indexer->top_circuit_from_index (i - 1);
while (id != 0) {
nnlast = nlast;
nlast = mp_indexer->child_circuit_count (cps.first) + 1;
i = pop (id, nlast);
nprod *= nlast;
@@ -229,15 +231,58 @@ NetlistBrowserTreeModel::cp_status_from_index (const QModelIndex &index, size_t
std::pair<const db::Circuit *, const db::Circuit *>
NetlistBrowserTreeModel::circuits_from_index (const QModelIndex &index) const
{
size_t nprod = 0, nlast = 0;
return cp_status_from_index (index, nprod, nlast).first;
size_t nprod = 0, nlast = 0, nnlast = 0;
return cp_status_from_index (index, nprod, nlast, nnlast).first;
}
void
NetlistBrowserTreeModel::build_circuits_to_index (size_t nprod, const std::pair<const db::Circuit *, const db::Circuit *> &circuits, IndexedNetlistModel *model, const QModelIndex &index, std::map<std::pair<const db::Circuit *, const db::Circuit *>, QModelIndex> &map) const
{
if (map.find (circuits) != map.end ()) {
return;
}
map.insert (std::make_pair (circuits, index));
size_t count = mp_indexer->child_circuit_count (circuits);
size_t child_nprod = nprod * (count + 1);
for (size_t n = count; n > 0; ) {
std::pair<std::pair<const db::Circuit *, const db::Circuit *>, IndexedNetlistModel::Status> cp = mp_indexer->child_circuit_from_index (circuits, n - 1);
QModelIndex child_index = createIndex (int (n - 1), 0, reinterpret_cast<void *> (size_t (index.internalPointer ()) + nprod * n));
build_circuits_to_index (child_nprod, cp.first, model, child_index, map);
--n;
}
}
QModelIndex
NetlistBrowserTreeModel::index_from_circuits (const std::pair<const db::Circuit *, const db::Circuit *> &circuits) const
{
if (m_circuits_to_index.empty ()) {
size_t count = mp_indexer->top_circuit_count ();
for (size_t n = count; n > 0; ) {
std::pair<std::pair<const db::Circuit *, const db::Circuit *>, IndexedNetlistModel::Status> cp = mp_indexer->top_circuit_from_index (n - 1);
build_circuits_to_index (count + 1, cp.first, mp_indexer.get (), createIndex (int (n - 1), 0, reinterpret_cast<void *> (n)), m_circuits_to_index);
--n;
}
}
std::map<std::pair<const db::Circuit *, const db::Circuit *>, QModelIndex>::const_iterator m = m_circuits_to_index.find (circuits);
if (m != m_circuits_to_index.end ()) {
return m->second;
} else {
return QModelIndex ();
}
}
db::NetlistCrossReference::Status
NetlistBrowserTreeModel::status (const QModelIndex &index) const
{
size_t nprod = 0, nlast = 0;
return cp_status_from_index (index, nprod, nlast).second;
size_t nprod = 0, nlast = 0, nnlast = 0;
return cp_status_from_index (index, nprod, nlast, nnlast).second;
}
Qt::ItemFlags
@@ -276,8 +321,8 @@ NetlistBrowserTreeModel::index (int row, int column, const QModelIndex &parent)
} else {
size_t nprod = 0, nlast = 0;
cp_status_from_index (parent, nprod, nlast);
size_t nprod = 0, nlast = 0, nnlast = 0;
cp_status_from_index (parent, nprod, nlast, nnlast);
void *id = parent.internalPointer ();
return createIndex (row, column, reinterpret_cast<void *> (reinterpret_cast<size_t> (id) + size_t (row + 1) * nprod));
@@ -290,8 +335,8 @@ NetlistBrowserTreeModel::parent (const QModelIndex &index) const
{
if (index.isValid ()) {
size_t nprod = 0, nlast = 0;
cp_status_from_index (index, nprod, nlast);
size_t nprod = 0, nlast = 0, nnlast = 0;
cp_status_from_index (index, nprod, nlast, nnlast);
tl_assert (nlast != 0);
@@ -302,7 +347,11 @@ NetlistBrowserTreeModel::parent (const QModelIndex &index) const
void *id = index.internalPointer ();
size_t ids = reinterpret_cast<size_t> (id);
tl_assert (ids >= nprod);
return createIndex (int (ids / nprod - 1), index.column (), reinterpret_cast<void *> (ids % nprod));
ids %= nprod;
nprod /= nnlast;
return createIndex (int (ids / nprod - 1), index.column (), reinterpret_cast<void *> (ids));
}
@@ -76,6 +76,7 @@ public:
}
std::pair<const db::Circuit *, const db::Circuit *> circuits_from_index (const QModelIndex &index) const;
QModelIndex index_from_circuits (const std::pair<const db::Circuit *, const db::Circuit *> &circuits) const;
private:
NetlistBrowserTreeModel (const NetlistBrowserTreeModel &);
@@ -84,11 +85,13 @@ private:
QString text (const QModelIndex &index) const;
QString search_text (const QModelIndex &index) const;
db::NetlistCrossReference::Status status (const QModelIndex &index) const;
std::pair<std::pair<const db::Circuit *, const db::Circuit *>, db::NetlistCrossReference::Status> cp_status_from_index (const QModelIndex &index, size_t &nprod, size_t &nlast) const;
std::pair<std::pair<const db::Circuit *, const db::Circuit *>, db::NetlistCrossReference::Status> cp_status_from_index (const QModelIndex &index, size_t &nprod, size_t &nlast, size_t &nnlast) const;
void build_circuits_to_index (size_t nprod, const std::pair<const db::Circuit *, const db::Circuit *> &circuits, IndexedNetlistModel *model, const QModelIndex &index, std::map<std::pair<const db::Circuit *, const db::Circuit *>, QModelIndex> &map) const;
db::LayoutToNetlist *mp_l2ndb;
db::LayoutVsSchematic *mp_lvsdb;
std::auto_ptr<IndexedNetlistModel> mp_indexer;
mutable std::map<std::pair<const db::Circuit *, const db::Circuit *>, QModelIndex> m_circuits_to_index;
int m_object_column;
int m_status_column;
};
@@ -299,6 +299,11 @@ const db::Net *NetlistCrossReferenceModel::second_net_for (const db::Net *first)
return mp_cross_ref->other_net_for (first);
}
const db::Circuit *NetlistCrossReferenceModel::second_circuit_for (const db::Circuit *first) const
{
return mp_cross_ref->other_circuit_for (first);
}
IndexedNetlistModel::net_subcircuit_pin_pair NetlistCrossReferenceModel::net_subcircuit_pinref_from_index (const net_pair &nets, size_t index) const
{
const db::NetlistCrossReference::PerNetData *data = mp_cross_ref->per_net_data_for (nets);
@@ -63,6 +63,7 @@ public:
virtual std::pair<circuit_pair, Status> child_circuit_from_index (const circuit_pair &circuits, size_t index) const;
virtual std::pair<net_pair, Status> net_from_index (const circuit_pair &circuits, size_t index) const;
virtual const db::Net *second_net_for (const db::Net *first) const;
virtual const db::Circuit *second_circuit_for (const db::Circuit *first) const;
virtual net_subcircuit_pin_pair net_subcircuit_pinref_from_index (const net_pair &nets, size_t index) const;
virtual net_terminal_pair net_terminalref_from_index (const net_pair &nets, size_t index) const;
virtual net_pin_pair net_pinref_from_index (const net_pair &nets, size_t index) const;