From 4be134e2938fe78a9103d0d39526d477ff23e58e Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Mon, 30 Sep 2024 22:06:38 +0200 Subject: [PATCH 1/4] LEF/DEF reader recognizes existing layers by name now This is helpful as it assigns layer/datatype numbers automatically. If only a name is given for a layer (i.e. "OUTLINE"), it will not match any previously loaded layer and layer matching goes by layer/datatype first. This way, every "reload" added a new "OUTLINE" layer. --- src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc index ec404f7c8..7c1bcb383 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc +++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc @@ -1508,7 +1508,9 @@ std::set LEFDEFReaderState::open_layer_uncached(db::Layout &layout bool found = false; for (db::Layout::layer_iterator i = layout.begin_layers (); i != layout.end_layers () && ! found; ++i) { - if ((*i).second->log_equal (lp_new)) { + // NOTE: if lp_new only has a name, we also check for the name. Since we assign a default layer/datatype, + // otherwise, a "reload" in the UI would not recognize the layer as the same. + if ((*i).second->log_equal (lp_new) || (lp_new.is_named () && (*i).second->name == lp_new.name)) { found = true; res.insert ((*i).first); } From b44ff4b8e8f679ecc946947f4157b8b295a21c14 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 6 Oct 2024 19:07:17 +0200 Subject: [PATCH 2/4] Avoid a potential hard assertion in debug mode --- src/lay/lay/layMacroEditorPage.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lay/lay/layMacroEditorPage.cc b/src/lay/lay/layMacroEditorPage.cc index b0818e6f4..5b601b6e9 100644 --- a/src/lay/lay/layMacroEditorPage.cc +++ b/src/lay/lay/layMacroEditorPage.cc @@ -753,7 +753,7 @@ void MacroEditorPage::fill_completer_list () QString ssel = c.selectedText (); QString s = ssel.mid (0, pos - pos0); - if (! s[0].isLetter () && s[0].toLatin1 () != '_') { + if (s.length () == 0 || (! s[0].isLetter () && s[0].toLatin1 () != '_')) { return; // not a word } From f25693373e5cf6eadc5075d50914d0f21e2e7787 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 6 Oct 2024 19:07:42 +0200 Subject: [PATCH 3/4] Small doc update --- src/laybasic/laybasic/gsiDeclLayLayoutViewBase.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/laybasic/laybasic/gsiDeclLayLayoutViewBase.cc b/src/laybasic/laybasic/gsiDeclLayLayoutViewBase.cc index 86bf942d7..c6149950e 100644 --- a/src/laybasic/laybasic/gsiDeclLayLayoutViewBase.cc +++ b/src/laybasic/laybasic/gsiDeclLayLayoutViewBase.cc @@ -868,7 +868,7 @@ LAYBASIC_PUBLIC Class decl_LayoutViewBase ("lay", "LayoutVi gsi::method ("active_cellview", static_cast (&lay::LayoutViewBase::active_cellview_ref), "@brief Gets the active cellview (shown in hierarchy browser)\n" "\n" - "This is a convenience method which is equivalent to cellview(active_cellview_index()).\n" + "This is a convenience method which is equivalent to \"cellview(active_cellview_index)\".\n" "\n" "This method has been introduced in version 0.19.\n" "Starting from version 0.25, the returned object can be manipulated which will have an immediate effect " From 8dab13eb426ee16754a62c962001ffc8518f1740 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 6 Oct 2024 19:08:38 +0200 Subject: [PATCH 4/4] In DRC, with '@+' as target layout, maintain the original active cell view. This way, DRC can be re-run on the original layout, but each time generating a new output cellview. --- src/drc/drc/built-in-macros/_drc_engine.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/drc/drc/built-in-macros/_drc_engine.rb b/src/drc/drc/built-in-macros/_drc_engine.rb index faa119dac..fa5cf402c 100644 --- a/src/drc/drc/built-in-macros/_drc_engine.rb +++ b/src/drc/drc/built-in-macros/_drc_engine.rb @@ -3450,7 +3450,13 @@ CODE view = RBA::LayoutView::current view || raise("No view open") if $1 == "+" + prev_cv = view.active_cellview_index n = view.create_layout(true) + if prev_cv >= 0 + # make the original cellview the active one again - this way + # we can re-run DRC without using the new output. + view.active_cellview_index = prev_cv + end cellname ||= (@def_cell ? @def_cell.name : "TOP") else n = $1.to_i - 1