diff --git a/src/db/db/dbLog.cc b/src/db/db/dbLog.cc index 6e9428c5c..acc295813 100644 --- a/src/db/db/dbLog.cc +++ b/src/db/db/dbLog.cc @@ -158,7 +158,7 @@ LogEntryData::set_cell_name (const std::string &n) } std::string -LogEntryData::to_string () const +LogEntryData::to_string (bool with_geometry) const { std::string res; @@ -178,7 +178,7 @@ LogEntryData::to_string () const res += message (); - if (! m_geometry.box ().empty ()) { + if (with_geometry && ! m_geometry.box ().empty ()) { res += tl::to_string (tr (", shape: ")) + m_geometry.to_string (); } diff --git a/src/db/db/dbLog.h b/src/db/db/dbLog.h index 985558b6d..ff11f528e 100644 --- a/src/db/db/dbLog.h +++ b/src/db/db/dbLog.h @@ -161,7 +161,7 @@ public: /** * @brief Formats this message for printing */ - std::string to_string () const; + std::string to_string (bool with_geometry = true) const; private: Severity m_severity; diff --git a/src/layui/layui/layNetlistBrowserPage.cc b/src/layui/layui/layNetlistBrowserPage.cc index f879e9e24..e8c3947ed 100644 --- a/src/layui/layui/layNetlistBrowserPage.cc +++ b/src/layui/layui/layNetlistBrowserPage.cc @@ -798,6 +798,10 @@ NetlistBrowserPage::log_selection_changed () { clear_highlights (); + if (! mp_database.get () || ! mp_database->netlist ()) { + return; + } + NetlistLogModel *model = dynamic_cast (log_view->model ()); tl_assert (model != 0); @@ -805,15 +809,17 @@ NetlistBrowserPage::log_selection_changed () for (QModelIndexList::const_iterator i = selection.begin (); i != selection.end (); ++i) { if (i->column () == 0) { const db::LogEntryData *le = model->log_entry (*i); - if (le && le->geometry () != db::DPolygon ()) { - - // @@@ TODO: add highlight for error here. - + if (le && le->geometry () != db::DPolygon () && ! le->cell_name ().empty ()) { + const db::Circuit *c = mp_database->netlist ()->circuit_by_name (le->cell_name ()); + if (c) { + m_markers.push_back (std::make_pair (c, le->geometry ())); + } } } } update_highlights (); + adjust_view (); } void @@ -1276,6 +1282,7 @@ NetlistBrowserPage::clear_highlights () { m_current_path = lay::NetlistObjectsPath (); m_selected_paths.clear (); + m_markers.clear (); update_highlights (); } @@ -1435,6 +1442,17 @@ NetlistBrowserPage::adjust_view () } + // add markers boxes + + for (auto marker = m_markers.begin (); marker != m_markers.end (); ++marker) { + + std::pair tr = trans_for (marker->first, *layout, *cell, m_cell_context_cache, cv.context_dtrans ()); + if (tr.first) { + bbox += (tr.second * marker->second).box (); + } + + } + if (! bbox.empty ()) { std::vector tv = mp_view->cv_transform_variants (m_cv_index); @@ -1676,10 +1694,12 @@ NetlistBrowserPage::update_highlights () } } + std::vector tv = mp_view->cv_transform_variants (m_cv_index); + size_t n_markers = 0; bool not_all_shapes_are_shown = false; - for (std::vector::const_iterator path = m_selected_paths.begin (); path != m_selected_paths.end (); ++path) { + for (auto path = m_selected_paths.begin (); path != m_selected_paths.end (); ++path) { const db::Circuit *circuit = path->root.first; if (! circuit) { @@ -1711,7 +1731,6 @@ NetlistBrowserPage::update_highlights () // a map of display properties vs. layer properties // correct DBU differences between the storage layout and the original layout - std::vector tv = mp_view->cv_transform_variants (m_cv_index); for (std::vector::iterator t = tv.begin (); t != tv.end (); ++t) { *t = *t * trans * db::DCplxTrans (layout->dbu () / original_layout.dbu ()); } @@ -1732,6 +1751,28 @@ NetlistBrowserPage::update_highlights () } + for (auto marker = m_markers.begin (); marker != m_markers.end (); ++marker) { + + // computes the transformation supplied by the path + + std::pair tr = trans_for (marker->first, *layout, *cell, m_cell_context_cache, cv.context_dtrans ()); + if (! tr.first) { + continue; + } + + // creates a highlight from the marker + + tl::Color color = make_valid_color (m_colorizer.marker_color ()); + + mp_markers.push_back (new lay::Marker (mp_view, m_cv_index)); + mp_markers.back ()->set (marker->second, db::DCplxTrans (1.0 / original_layout.dbu ()) * tr.second, tv); + mp_markers.back ()->set_color (color); + mp_markers.back ()->set_frame_color (color); + + configure_marker (mp_markers.back (), true); + + } + if (not_all_shapes_are_shown) { info_label->setText (tl::to_qstring ("

" + tl::to_string (QObject::tr ("Not all shapes are highlighted")) + diff --git a/src/layui/layui/layNetlistBrowserPage.h b/src/layui/layui/layNetlistBrowserPage.h index aec13cbf5..ad29cdba9 100644 --- a/src/layui/layui/layNetlistBrowserPage.h +++ b/src/layui/layui/layNetlistBrowserPage.h @@ -244,6 +244,7 @@ private: bool m_update_needed; lay::NetlistObjectsPath m_current_path; std::vector m_selected_paths; + std::vector > m_markers; lay::NetInfoDialog *mp_info_dialog; tl::DeferredMethod dm_update_highlights; tl::DeferredMethod dm_rerun_macro; diff --git a/src/layui/layui/layNetlistLogModel.cc b/src/layui/layui/layNetlistLogModel.cc index 4b6aa865a..82784d628 100644 --- a/src/layui/layui/layNetlistLogModel.cc +++ b/src/layui/layui/layNetlistLogModel.cc @@ -218,7 +218,7 @@ NetlistLogModel::data (const QModelIndex &index, int role) const } else if (role == Qt::DisplayRole) { if (le) { - return QVariant (tl::to_qstring (le->to_string ())); + return QVariant (tl::to_qstring (le->to_string (false))); } 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) {