From 2fe611a75c82d74ec3e2a973c4dbeaef5a182868 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 17 Sep 2023 23:21:34 +0200 Subject: [PATCH] Log model enhanced for extractor messages --- src/layui/layui/layNetlistBrowserPage.cc | 2 +- src/layui/layui/layNetlistLogModel.cc | 79 +++++++++++++----------- src/layui/layui/layNetlistLogModel.h | 6 +- 3 files changed, 48 insertions(+), 39 deletions(-) diff --git a/src/layui/layui/layNetlistBrowserPage.cc b/src/layui/layui/layNetlistBrowserPage.cc index a967d9b73..58a4a7b23 100644 --- a/src/layui/layui/layNetlistBrowserPage.cc +++ b/src/layui/layui/layNetlistBrowserPage.cc @@ -1134,7 +1134,7 @@ NetlistBrowserPage::setup_trees () if ((lvsdb && lvsdb->cross_ref ()) || (l2ndb && ! l2ndb->log_entries ().empty ())) { - NetlistLogModel *new_model = new NetlistLogModel (log_view, lvsdb->cross_ref () /*@@@, l2ndb*/); + NetlistLogModel *new_model = new NetlistLogModel (log_view, lvsdb->cross_ref (), l2ndb); delete log_view->model (); log_view->setModel (new_model); diff --git a/src/layui/layui/layNetlistLogModel.cc b/src/layui/layui/layNetlistLogModel.cc index 021c24b9a..7bf06c714 100644 --- a/src/layui/layui/layNetlistLogModel.cc +++ b/src/layui/layui/layNetlistLogModel.cc @@ -78,19 +78,20 @@ namespace { const std::string var_sep (" \u21D4 "); -NetlistLogModel::NetlistLogModel (QWidget *parent, const db::NetlistCrossReference *cross_ref) +NetlistLogModel::NetlistLogModel (QWidget *parent, const db::NetlistCrossReference *cross_ref, const db::LayoutToNetlist *l2n) : QAbstractItemModel (parent) { tl_assert (cross_ref->netlist_a () != 0); tl_assert (cross_ref->netlist_b () != 0); - if (! cross_ref->other_log_entries ().empty ()) { - m_circuits.push_back (std::make_pair (std::make_pair ((const db::Circuit *)0, (const db::Circuit *)0), &cross_ref->other_log_entries ())); - } + mp_lvsdb_messages = cross_ref ? &cross_ref->other_log_entries () : 0; + mp_l2n_messages = l2n ? &l2n->log_entries () : 0; + + m_global_entries = int ((mp_lvsdb_messages ? mp_lvsdb_messages->size () : 0) + (mp_l2n_messages ? mp_l2n_messages->size () : 0)); for (auto i = cross_ref->begin_circuits (); i != cross_ref->end_circuits (); ++i) { const db::NetlistCrossReference::PerCircuitData *pcd = cross_ref->per_circuit_data_for (*i); - if (pcd && i->first && i->second && ! pcd->log_entries.empty ()) { + if (pcd && (i->first || i->second) && ! pcd->log_entries.empty ()) { m_circuits.push_back (std::make_pair (*i, &pcd->log_entries)); } } @@ -102,9 +103,11 @@ bool NetlistLogModel::hasChildren (const QModelIndex &parent) const { if (! parent.isValid ()) { - return ! m_circuits.empty (); + return m_global_entries > 0 || ! m_circuits.empty (); + } else if (! parent.parent ().isValid ()) { + return parent.row () >= m_global_entries; } else { - return ! parent.parent ().isValid (); + return false; } } @@ -114,7 +117,7 @@ NetlistLogModel::index (int row, int column, const QModelIndex &parent) const if (! parent.isValid ()) { return createIndex (row, column, (void *) (0)); } else { - return createIndex (row, column, (void *) (& m_circuits [parent.row ()])); + return createIndex (row, column, (void *) (& m_circuits [parent.row () - m_global_entries])); } } @@ -125,7 +128,7 @@ NetlistLogModel::parent (const QModelIndex &child) const return QModelIndex (); } else { const circuit_entry *ce = (const circuit_entry *) child.internalPointer (); - return createIndex (int (ce - & m_circuits.front ()), child.column (), (void *) (0)); + return createIndex (int (ce - & m_circuits.front ()) + m_global_entries, child.column (), (void *) (0)); } } @@ -133,12 +136,11 @@ int NetlistLogModel::rowCount (const QModelIndex &parent) const { if (! parent.isValid ()) { - return int (m_circuits.size ()); + return int (m_circuits.size ()) + m_global_entries; } else if (parent.parent ().isValid ()) { return 0; - } else if (parent.row () >= 0 && parent.row () < int (m_circuits.size ())) { - // @@@ that would crash for "other entries"! - return int (m_circuits [parent.row ()].second->size ()); + } else if (parent.row () >= m_global_entries && parent.row () < int (m_circuits.size ()) + m_global_entries) { + return int (m_circuits [parent.row () - m_global_entries].second->size ()); } else { return 0; } @@ -157,7 +159,14 @@ NetlistLogModel::data (const QModelIndex &index, int role) const if (index.parent ().isValid ()) { const circuit_entry *ce = (const circuit_entry *) index.internalPointer (); if (ce) { - le = &(*ce->second) [index.row ()]; + le = (ce->second->begin () + index.row ()).operator-> (); + } + } else if (index.row () < m_global_entries) { + int n_l2n = int (mp_l2n_messages ? mp_l2n_messages->size () : 0); + if (index.row () < n_l2n) { + le = (mp_l2n_messages->begin () + index.row ()).operator-> (); + } else { + le = (mp_lvsdb_messages->begin () + (index.row () - n_l2n)).operator-> (); } } @@ -175,14 +184,14 @@ NetlistLogModel::data (const QModelIndex &index, int role) const } else if (role == Qt::DisplayRole) { - if (index.parent ().isValid ()) { - 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 || ! cp.second) { - return QVariant (tr ("General")); + if (le) { + return QVariant (tl::to_qstring (le->msg)); + } else if (! index.parent ().isValid () && index.row () >= m_global_entries && index.row () < int (m_circuits.size ()) + m_global_entries) { + const std::pair &cp = m_circuits [index.row () - m_global_entries].first; + if (! cp.first) { + return QVariant (tr ("Circuit ") + tl::to_qstring (std::string ("-") + var_sep + cp.second->name ())); + } else if (! cp.second) { + return QVariant (tr ("Circuit ") + tl::to_qstring (cp.first->name () + var_sep + std::string ("-"))); } else if (cp.first->name () != cp.second->name ()) { return QVariant (tr ("Circuit ") + tl::to_qstring (cp.first->name () + var_sep + cp.second->name ())); } else { @@ -192,13 +201,11 @@ NetlistLogModel::data (const QModelIndex &index, int role) const } else if (role == Qt::FontRole) { - if (index.parent ().isValid ()) { - if (le && le->severity == db::Error) { - QFont f; - f.setBold (true); - return QVariant (f); - } - } else { + if (le) { + QFont f; + f.setBold (le->severity == db::Error); + return QVariant (f); + } else if (! index.parent ().isValid () && index.row () >= m_global_entries && index.row () < int (m_circuits.size ()) + m_global_entries) { QFont f; f.setBold (true); return QVariant (f); @@ -206,14 +213,12 @@ NetlistLogModel::data (const QModelIndex &index, int role) const } else if (role == Qt::ForegroundRole) { - if (index.parent ().isValid ()) { - if (!le) { - // ignore - } else if (le->severity == db::Error) { - return QColor (255, 0, 0); - } else if (le->severity == db::Warning) { - return QColor (0, 0, 255); - } + if (! le) { + // ignore + } else if (le->severity == db::Error) { + return QColor (255, 0, 0); + } else if (le->severity == db::Warning) { + return QColor (0, 0, 255); } } diff --git a/src/layui/layui/layNetlistLogModel.h b/src/layui/layui/layNetlistLogModel.h index 751a007e0..cd4178936 100644 --- a/src/layui/layui/layNetlistLogModel.h +++ b/src/layui/layui/layNetlistLogModel.h @@ -27,6 +27,7 @@ #include "layuiCommon.h" #include "dbNetlistCrossReference.h" +#include "dbLayoutToNetlist.h" #include @@ -40,7 +41,7 @@ class LAYUI_PUBLIC NetlistLogModel : public QAbstractItemModel { public: - NetlistLogModel (QWidget *parent, const db::NetlistCrossReference *cross_ref); + NetlistLogModel (QWidget *parent, const db::NetlistCrossReference *cross_ref, const db::LayoutToNetlist *l2n); virtual bool hasChildren (const QModelIndex &parent) const; virtual QModelIndex index (int row, int column, const QModelIndex &parent) const; @@ -53,6 +54,9 @@ public: private: typedef std::pair, const db::NetlistCrossReference::PerCircuitData::log_entries_type *> circuit_entry; std::vector m_circuits; + const db::NetlistCrossReference::PerCircuitData::log_entries_type *mp_lvsdb_messages; + const db::LayoutToNetlist::log_entries_type *mp_l2n_messages; + int m_global_entries; }; }