From 65fec369024d8bb14bd40095c3afb03c509cccb7 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 4 Apr 2026 14:40:30 +0200 Subject: [PATCH] Fixed a bug in PCell parameter computation "coerce_parameters" and "callback" was called with the client layout instead of definition layout, hence the DBU was incorrect if both layouts have different DBU. This became visible on the computed character dimensions of the Basic.TEXT PCell when the client layout had a DBU != 1nm. --- src/edt/edt/edtPCellParametersPage.cc | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/edt/edt/edtPCellParametersPage.cc b/src/edt/edt/edtPCellParametersPage.cc index 38969f3f6..500d76b58 100644 --- a/src/edt/edt/edtPCellParametersPage.cc +++ b/src/edt/edt/edtPCellParametersPage.cc @@ -699,7 +699,9 @@ PCellParametersPage::setup (lay::LayoutViewBase *view, int cv_index, const db::P // initial callback try { - mp_pcell_decl->callback (mp_view->cellview (m_cv_index)->layout (), std::string (), m_states); + if (mp_pcell_decl->layout ()) { + mp_pcell_decl->callback (*mp_pcell_decl->layout (), std::string (), m_states); + } } catch (tl::Exception &ex) { // potentially caused by script errors in callback implementation tl::error << ex.msg (); @@ -788,7 +790,9 @@ PCellParametersPage::parameter_changed () // Note: checking for is_busy prevents callbacks during debugger execution if (! edit_error) { - mp_pcell_decl->callback (mp_view->cellview (m_cv_index)->layout (), pd ? pd->get_name () : std::string (), states); + if (mp_pcell_decl->layout ()) { + mp_pcell_decl->callback (*mp_pcell_decl->layout (), pd ? pd->get_name () : std::string (), states); + } m_states = states; } @@ -1014,7 +1018,9 @@ PCellParametersPage::get_parameters (db::ParameterStates &states, bool *ok) auto parameters = parameter_from_states (states); auto before_coerce = parameters; - mp_pcell_decl->coerce_parameters (mp_view->cellview (m_cv_index)->layout (), parameters); + if (mp_pcell_decl->layout ()) { + mp_pcell_decl->coerce_parameters (*mp_pcell_decl->layout (), parameters); + } if (parameters != before_coerce) { states_from_parameters (states, parameters); @@ -1070,8 +1076,8 @@ PCellParametersPage::set_parameters (const std::vector ¶meters) states_from_parameters (m_states, parameters); try { - if (mp_view->cellview (m_cv_index).is_valid ()) { - mp_pcell_decl->callback (mp_view->cellview (m_cv_index)->layout (), std::string (), m_states); + if (mp_view->cellview (m_cv_index).is_valid () && mp_pcell_decl->layout ()) { + mp_pcell_decl->callback (*mp_pcell_decl->layout (), std::string (), m_states); } } catch (tl::Exception &ex) { // potentially caused by script errors in callback implementation