diff --git a/src/db/db/dbLayoutVsSchematicReader.cc b/src/db/db/dbLayoutVsSchematicReader.cc
index bdc875a34..f3dffcaaf 100644
--- a/src/db/db/dbLayoutVsSchematicReader.cc
+++ b/src/db/db/dbLayoutVsSchematicReader.cc
@@ -38,10 +38,10 @@ LayoutVsSchematicStandardReader::LayoutVsSchematicStandardReader (tl::InputStrea
// .. nothing yet ..
}
-void LayoutVsSchematicStandardReader::do_read_lvs (db::LayoutVsSchematic *l2n)
+void LayoutVsSchematicStandardReader::do_read_lvs (db::LayoutVsSchematic *lvs)
{
try {
- read_netlist (l2n);
+ read_netlist (lvs);
} catch (tl::Exception &ex) {
throw tl::Exception (tl::sprintf (tl::to_string (tr ("%s in line: %d of %s")), ex.msg (), stream ().line_number (), path ()));
}
diff --git a/src/layui/layui/NetlistBrowserPage.ui b/src/layui/layui/NetlistBrowserPage.ui
index 684f347ed..5e84ba2d0 100644
--- a/src/layui/layui/NetlistBrowserPage.ui
+++ b/src/layui/layui/NetlistBrowserPage.ui
@@ -572,7 +572,14 @@
4
-
-
+
+
+ true
+
+
+ false
+
+
diff --git a/src/layui/layui/layNetlistBrowserPage.cc b/src/layui/layui/layNetlistBrowserPage.cc
index 705b43000..350ddebce 100644
--- a/src/layui/layui/layNetlistBrowserPage.cc
+++ b/src/layui/layui/layNetlistBrowserPage.cc
@@ -25,6 +25,7 @@
#include "layNetlistBrowserPage.h"
#include "layNetlistBrowserModel.h"
#include "layNetlistBrowserTreeModel.h"
+#include "layNetlistLogModel.h"
#include "layItemDelegates.h"
#include "layCellView.h"
#include "layLayoutViewBase.h"
@@ -1090,6 +1091,7 @@ void
NetlistBrowserPage::setup_trees ()
{
if (! mp_database.get ()) {
+
delete nl_directory_tree->model ();
nl_directory_tree->setModel (0);
delete sch_directory_tree->model ();
@@ -1102,12 +1104,29 @@ NetlistBrowserPage::setup_trees ()
sch_hierarchy_tree->setModel (0);
delete xref_hierarchy_tree->model ();
xref_hierarchy_tree->setModel (0);
+ delete log_view->model ();
+ log_view->setModel (0);
+
return;
+
}
db::LayoutToNetlist *l2ndb = mp_database.get ();
db::LayoutVsSchematic *lvsdb = dynamic_cast (l2ndb);
+ if (lvsdb && lvsdb->cross_ref ()) {
+
+ NetlistLogModel *new_model = new NetlistLogModel (log_view, lvsdb->cross_ref ());
+ delete log_view->model ();
+ log_view->setModel (new_model);
+
+ } else {
+
+ delete log_view->model ();
+ log_view->setModel (0);
+
+ }
+
{
// NOTE: with the tree as the parent, the tree will take over ownership of the model
NetlistBrowserModel *new_model = new NetlistBrowserModel (nl_directory_tree, l2ndb, &m_colorizer);
diff --git a/src/layui/layui/layNetlistLogModel.cc b/src/layui/layui/layNetlistLogModel.cc
index 6c3cb1da5..650218fe1 100644
--- a/src/layui/layui/layNetlistLogModel.cc
+++ b/src/layui/layui/layNetlistLogModel.cc
@@ -27,6 +27,7 @@
#include
#include
#include
+#include
namespace lay
{
@@ -70,7 +71,8 @@ namespace {
const std::string var_sep (" \u21D4 ");
-NetlistLogModel::NetlistLogModel (const db::NetlistCrossReference *cross_ref)
+NetlistLogModel::NetlistLogModel (QWidget *parent, const db::NetlistCrossReference *cross_ref)
+ : QAbstractItemModel (parent)
{
tl_assert (cross_ref->netlist_a () != 0);
tl_assert (cross_ref->netlist_b () != 0);
@@ -88,7 +90,11 @@ NetlistLogModel::NetlistLogModel (const db::NetlistCrossReference *cross_ref)
bool
NetlistLogModel::hasChildren (const QModelIndex &parent) const
{
- return (parent.isValid () || ! m_circuits.empty ());
+ if (! parent.isValid ()) {
+ return ! m_circuits.empty ();
+ } else {
+ return ! parent.parent ().isValid ();
+ }
}
QModelIndex
@@ -97,7 +103,18 @@ NetlistLogModel::index (int row, int column, const QModelIndex &parent) const
if (! parent.isValid ()) {
return createIndex (row, column, quintptr (0));
} else {
- return createIndex (row, column, quintptr (& m_circuits [parent.row ()].second->log_entries [row]));
+ return createIndex (row, column, quintptr (& m_circuits [parent.row ()]));
+ }
+}
+
+QModelIndex
+NetlistLogModel::parent (const QModelIndex &child) const
+{
+ if (child.internalPointer () == (void *) 0) {
+ return QModelIndex ();
+ } else {
+ const circuit_entry *ce = (const circuit_entry *) child.internalPointer ();
+ return createIndex (int (ce - & m_circuits.front ()), child.column (), quintptr (0));
}
}
@@ -106,6 +123,8 @@ NetlistLogModel::rowCount (const QModelIndex &parent) const
{
if (! parent.isValid ()) {
return int (m_circuits.size ());
+ } else if (parent.parent ().isValid ()) {
+ return 0;
} else if (parent.row () >= 0 && parent.row () < int (m_circuits.size ())) {
return int (m_circuits [parent.row ()].second->log_entries.size ());
} else {
@@ -116,49 +135,50 @@ NetlistLogModel::rowCount (const QModelIndex &parent) const
int
NetlistLogModel::columnCount (const QModelIndex & /*parent*/) const
{
- return 2;
+ return 1;
}
QVariant
NetlistLogModel::data (const QModelIndex &index, int role) const
{
+ const db::NetlistCrossReference::LogEntryData *le = 0;
+ if (index.parent ().isValid ()) {
+ const circuit_entry *ce = (const circuit_entry *) index.internalPointer ();
+ if (ce) {
+ le = &ce->second->log_entries [index.row ()];
+ }
+ }
+
if (role == Qt::DecorationRole) {
- if (index.parent ().isValid ()) {
- auto *le = (const db::NetlistCrossReference::LogEntryData *) index.internalPointer ();
- if (! le) {
- // ignore
- } else if (le->severity == db::NetlistCrossReference::Error) {
- return QIcon (QString::fromUtf8 (":/error_16.png"));
- } else if (le->severity == db::NetlistCrossReference::Warning) {
- return QIcon (QString::fromUtf8 (":/warn_16.png"));
- } else if (le->severity == db::NetlistCrossReference::Info) {
- return QIcon (QString::fromUtf8 (":/info_16.png"));
- } else {
- return QIcon (QString::fromUtf8 (":/empty_16.png"));
- }
+ if (! le) {
+ // ignore
+ } else if (le->severity == db::NetlistCrossReference::Error) {
+ return QIcon (QString::fromUtf8 (":/error_16.png"));
+ } else if (le->severity == db::NetlistCrossReference::Warning) {
+ return QIcon (QString::fromUtf8 (":/warn_16.png"));
+ } else if (le->severity == db::NetlistCrossReference::Info) {
+ return QIcon (QString::fromUtf8 (":/info_16.png"));
}
} else if (role == Qt::DisplayRole) {
if (index.parent ().isValid ()) {
- auto *le = (const db::NetlistCrossReference::LogEntryData *) index.internalPointer ();
if (le) {
return QVariant (tl::to_qstring (le->msg));
}
} else if (index.row () >= 0 && index.row () < int (m_circuits.size ())) {
const std::pair &cp = m_circuits [index.row ()].first;
if (cp.first->name () != cp.second->name ()) {
- return QVariant (tl::to_qstring (cp.first->name () + var_sep + cp.second->name ()));
+ return QVariant (tr ("Circuit ") + tl::to_qstring (cp.first->name () + var_sep + cp.second->name ()));
} else {
- return QVariant (tl::to_qstring (cp.first->name ()));
+ return QVariant (tr ("Circuit ") + tl::to_qstring (cp.first->name ()));
}
}
} else if (role == Qt::FontRole) {
if (index.parent ().isValid ()) {
- auto *le = (const db::NetlistCrossReference::LogEntryData *) index.internalPointer ();
if (le && le->severity == db::NetlistCrossReference::Error) {
QFont f;
f.setBold (true);
@@ -169,7 +189,6 @@ NetlistLogModel::data (const QModelIndex &index, int role) const
} else if (role == Qt::ForegroundRole) {
if (index.parent ().isValid ()) {
- auto *le = (const db::NetlistCrossReference::LogEntryData *) index.internalPointer ();
if (!le) {
// ignore
} else if (le->severity == db::NetlistCrossReference::Error) {
@@ -187,7 +206,7 @@ NetlistLogModel::data (const QModelIndex &index, int role) const
QVariant
NetlistLogModel::headerData (int section, Qt::Orientation /*orientation*/, int role) const
{
- if (role == Qt::DisplayRole && section == 1) {
+ if (role == Qt::DisplayRole && section == 0) {
return QVariant (tr ("Message"));
} else {
return QVariant ();
diff --git a/src/layui/layui/layNetlistLogModel.h b/src/layui/layui/layNetlistLogModel.h
index 2fec5f4da..5d8253a47 100644
--- a/src/layui/layui/layNetlistLogModel.h
+++ b/src/layui/layui/layNetlistLogModel.h
@@ -40,17 +40,19 @@ class LAYUI_PUBLIC NetlistLogModel
: public QAbstractItemModel
{
public:
- NetlistLogModel (const db::NetlistCrossReference *cross_ref);
+ NetlistLogModel (QWidget *parent, const db::NetlistCrossReference *cross_ref);
virtual bool hasChildren (const QModelIndex &parent) const;
virtual QModelIndex index (int row, int column, const QModelIndex &parent) const;
+ virtual QModelIndex parent (const QModelIndex &child) const;
virtual int rowCount (const QModelIndex &parent) const;
virtual int columnCount (const QModelIndex &parent) const;
virtual QVariant data (const QModelIndex &index, int role) const;
virtual QVariant headerData (int section, Qt::Orientation orientation, int role) const;
private:
- std::vector, const db::NetlistCrossReference::PerCircuitData *> > m_circuits;
+ typedef std::pair, const db::NetlistCrossReference::PerCircuitData *> circuit_entry;
+ std::vector m_circuits;
};
}