From 39c8e0ca15fa681c7d73d23a7791509ab95a8682 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Mon, 18 Aug 2025 22:53:45 +0200 Subject: [PATCH] WIP: some refactoring, introducing cut layer in via definition --- src/db/db/dbVia.h | 5 ++++ src/db/db/gsiDeclDbVia.cc | 3 +++ src/edt/edt/edtServiceImpl.cc | 4 ++++ src/edt/edt/edtUtils.cc | 28 +++++++++++++++------- src/edt/edt/edtUtils.h | 2 +- src/laybasic/laybasic/layLayoutViewBase.cc | 23 +++++++++++++----- src/laybasic/laybasic/layLayoutViewBase.h | 7 ++++++ 7 files changed, 56 insertions(+), 16 deletions(-) diff --git a/src/db/db/dbVia.h b/src/db/db/dbVia.h index dd44a3aa7..91bad19ff 100644 --- a/src/db/db/dbVia.h +++ b/src/db/db/dbVia.h @@ -128,6 +128,11 @@ public: */ bool bottom_wired; + /** + * @brief The cut layer + */ + db::LayerProperties cut; + /** * @brief The top layer */ diff --git a/src/db/db/gsiDeclDbVia.cc b/src/db/db/gsiDeclDbVia.cc index 7aff5e0c0..7ef8b9fb3 100644 --- a/src/db/db/gsiDeclDbVia.cc +++ b/src/db/db/gsiDeclDbVia.cc @@ -119,6 +119,9 @@ Class decl_dbViaType ("db", "ViaType", make_getter_setter ("bottom", "@brief The bottom layer of the via.\n" ) + + make_getter_setter ("cut", + "@brief The cut layer of the via.\n" + ) + make_getter_setter ("top", "@brief The top layer of the via.\n" ) + diff --git a/src/edt/edt/edtServiceImpl.cc b/src/edt/edt/edtServiceImpl.cc index db4068756..8cdc802a2 100644 --- a/src/edt/edt/edtServiceImpl.cc +++ b/src/edt/edt/edtServiceImpl.cc @@ -1574,6 +1574,10 @@ PathService::via () db::Instance via_instance = cell ().insert (db::CellInstArray (db::CellInst (via_cell), db::Trans (trans () * via_pos - db::Point ()))); push_segment (path_shape, via_instance, via_def.via_type); + if (! via_def.via_type.cut.is_null ()) { + edt::set_or_request_current_layer (view (), via_def.via_type.cut, cv_index (), false /*don't make current*/); + } + change_edit_layer (lp_new); m_points.clear (); diff --git a/src/edt/edt/edtUtils.cc b/src/edt/edt/edtUtils.cc index cdc0fc525..2a7ec7810 100644 --- a/src/edt/edt/edtUtils.cc +++ b/src/edt/edt/edtUtils.cc @@ -114,12 +114,18 @@ config_recent_for_layer (lay::LayoutViewBase *view, const db::LayerProperties &l } bool -set_or_request_current_layer (lay::LayoutViewBase *view, const db::LayerProperties &lp, unsigned int cv_index) +set_or_request_current_layer (lay::LayoutViewBase *view, const db::LayerProperties &lp, unsigned int cv_index, bool make_current) { #if defined(HAVE_QT) - bool ok = view->set_current_layer (cv_index, lp); - if (ok) { - return true; + // try to find an existing layer + if (make_current) { + if (view->set_current_layer (cv_index, lp)) { + return true; + } + } else { + if (! view->find_layer (cv_index, lp).is_null ()) { + return true; + } } if (! view->control_panel ()) { @@ -137,11 +143,15 @@ set_or_request_current_layer (lay::LayoutViewBase *view, const db::LayerProperti lpn.set_source (lay::ParsedLayerSource (lp, cv_index)); view->init_layer_properties (lpn); - view->transaction (tl::to_string (QObject::tr ("Create new layer"))); - lay::LayerPropertiesConstIterator lpi = lay::LayerPropertiesConstIterator (& view->insert_layer (view->end_layers (), lpn)); - view->set_current_layer (lpi); - lpi->realize_source (); - view->commit (); + { + db::Transaction transaction (! view->manager ()->transacting () ? view->manager () : 0, tl::to_string (QObject::tr ("Create new layer"))); + + lay::LayerPropertiesConstIterator lpi = lay::LayerPropertiesConstIterator (& view->insert_layer (view->end_layers (), lpn)); + if (make_current) { + view->set_current_layer (lpi); + } + lpi->realize_source (); + } return true; diff --git a/src/edt/edt/edtUtils.h b/src/edt/edt/edtUtils.h index a1a012cb2..e4e8b17b3 100644 --- a/src/edt/edt/edtUtils.h +++ b/src/edt/edt/edtUtils.h @@ -83,7 +83,7 @@ config_recent_for_layer (lay::LayoutViewBase *view, const db::LayerProperties &l * @brief Request to make the given layer the current one (asks whether to create the layer if needed) */ bool -set_or_request_current_layer (lay::LayoutViewBase *view, const db::LayerProperties &lp, unsigned int cv_index); +set_or_request_current_layer (lay::LayoutViewBase *view, const db::LayerProperties &lp, unsigned int cv_index, bool make_current = true); /** * @brief A helper class that identifies clipboard data for edt:: diff --git a/src/laybasic/laybasic/layLayoutViewBase.cc b/src/laybasic/laybasic/layLayoutViewBase.cc index a11ddf17a..d743b860c 100644 --- a/src/laybasic/laybasic/layLayoutViewBase.cc +++ b/src/laybasic/laybasic/layLayoutViewBase.cc @@ -1604,19 +1604,30 @@ LayoutViewBase::rename_properties (unsigned int index, const std::string &new_na layer_list_changed_event (4); } -bool -LayoutViewBase::set_current_layer (unsigned int cv_index, const db::LayerProperties &lp) +lay::LayerPropertiesConstIterator +LayoutViewBase::find_layer (unsigned int cv_index, const db::LayerProperties &lp) const { - // rename the ones that got shifted. lay::LayerPropertiesConstIterator l = begin_layers (); while (! l.at_end ()) { if (l->source (true).cv_index () == int (cv_index) && l->source (true).layer_props ().log_equal (lp)) { - set_current_layer (l); - return true; + return l; } ++l; } - return false; + + return lay::LayerPropertiesConstIterator (); +} + +bool +LayoutViewBase::set_current_layer (unsigned int cv_index, const db::LayerProperties &lp) +{ + lay::LayerPropertiesConstIterator l = find_layer (cv_index, lp); + if (! l.is_null ()) { + set_current_layer (l); + return true; + } else { + return false; + } } void diff --git a/src/laybasic/laybasic/layLayoutViewBase.h b/src/laybasic/laybasic/layLayoutViewBase.h index 245afbf7c..4b839ed61 100644 --- a/src/laybasic/laybasic/layLayoutViewBase.h +++ b/src/laybasic/laybasic/layLayoutViewBase.h @@ -602,6 +602,13 @@ public: */ virtual lay::LayerPropertiesConstIterator current_layer () const; + /** + * @brief Finds the first layer by layer properties and cell view index + * + * Returns a null iterator if the layer is not found in the list. + */ + virtual lay::LayerPropertiesConstIterator find_layer (unsigned int cv_index, const db::LayerProperties &properties) const; + /** * @brief Return the layers that are selected in the layer browser *