From af6762b52d4aea8e6f75c15df0c58be8c0fa28dd Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Thu, 4 Sep 2025 21:58:46 +0200 Subject: [PATCH] Fixing issue #2134 ('merged' on edge layers not working in DRC) --- src/drc/drc/built-in-macros/_drc_layer.rb | 17 +++++++++++++++-- src/drc/unit_tests/drcSimpleTests.cc | 11 +++++++++++ testdata/drc/drcSimpleTests_145.drc | 22 ++++++++++++++++++++++ testdata/drc/drcSimpleTests_145.gds | Bin 0 -> 842 bytes testdata/drc/drcSimpleTests_au145.gds | Bin 0 -> 3290 bytes testdata/drc/drcSimpleTests_au145d.gds | Bin 0 -> 2084 bytes 6 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 testdata/drc/drcSimpleTests_145.drc create mode 100644 testdata/drc/drcSimpleTests_145.gds create mode 100644 testdata/drc/drcSimpleTests_au145.gds create mode 100644 testdata/drc/drcSimpleTests_au145d.gds diff --git a/src/drc/drc/built-in-macros/_drc_layer.rb b/src/drc/drc/built-in-macros/_drc_layer.rb index 6c119936d..7eee5f905 100644 --- a/src/drc/drc/built-in-macros/_drc_layer.rb +++ b/src/drc/drc/built-in-macros/_drc_layer.rb @@ -5079,6 +5079,7 @@ CODE # # This method works both on edge or polygon layers. Edge merging forms # single, continuous edges from coincident and connected individual edges. + # The overlap count is only available on polygon layers. # # A version that modifies the input layer is \merge. # @@ -5106,7 +5107,13 @@ CODE def merged(overlap_count = 1) @engine._context("merged") do requires_edges_or_region - aa = [ @engine._prep_value(overlap_count) ] + oc = @engine._prep_value(overlap_count) + if self.data.is_a?(RBA::Edges) + oc == 1 || raise("'overlap_count' (merged) is only available on polygon layers") + aa = [] + else + aa = [ oc ] + end DRCLayer::new(@engine, @engine._tcmd(self.data, 0, self.data.class, :merged, *aa)) end end @@ -5114,7 +5121,13 @@ CODE def merge(overlap_count = 1) @engine._context("merge") do requires_edges_or_region - aa = [ @engine._prep_value(overlap_count) ] + oc = @engine._prep_value(overlap_count) + if self.data.is_a?(RBA::Edges) + oc == 1 || raise("'overlap_count' (merged) is only available on polygon layers") + aa = [] + else + aa = [ oc ] + end if @engine.is_tiled? # in tiled mode, no modifying versions are available self.data = @engine._tcmd(self.data, 0, self.data.class, :merged, *aa) diff --git a/src/drc/unit_tests/drcSimpleTests.cc b/src/drc/unit_tests/drcSimpleTests.cc index 8e46d2d74..85547ab6b 100644 --- a/src/drc/unit_tests/drcSimpleTests.cc +++ b/src/drc/unit_tests/drcSimpleTests.cc @@ -2044,3 +2044,14 @@ TEST(144d_combined_antennas) run_test (_this, "144", true); } +// issue 2134 +TEST(145_edges_merge) +{ + run_test (_this, "145", false); +} + +TEST(145d_edges_merge) +{ + run_test (_this, "145", true); +} + diff --git a/testdata/drc/drcSimpleTests_145.drc b/testdata/drc/drcSimpleTests_145.drc new file mode 100644 index 000000000..c5c5e094e --- /dev/null +++ b/testdata/drc/drcSimpleTests_145.drc @@ -0,0 +1,22 @@ + +source $drc_test_source +target $drc_test_target + +if $drc_test_deep + deep +end + +l1 = input(1, 0) +l2 = input(2, 0) +l3 = input(3, 0) + +l1.output(1, 0) +l2.output(2, 0) +l3.output(3, 0) + +l1.raw.edges.merged.output(100, 0) +l2.raw.edges.merged.output(101, 0) +l3e = l3.raw.edges +l3e.merge +l3e.output(102, 0) + diff --git a/testdata/drc/drcSimpleTests_145.gds b/testdata/drc/drcSimpleTests_145.gds new file mode 100644 index 0000000000000000000000000000000000000000..5ded0984e1f99889e8a1733705d08d0530737163 GIT binary patch literal 842 zcmb7?F;2rU7=>SK$1y6AQT`M7$V3;24FMgTEFL7zbGQmx&@MFM>i)zEO|W(^&e}b z(VE!o1N_y~&5dWNPw-bt^KYVIQZ7?oxgMF6^I2Rx8q!iNN*^Ihxg9hH-&pQ6tH(wP zkVlRG@X&fRA&)vMjq$LtVcWJoY}>ZC#*S`Yp2jSVDJi?BXVcD1d(+PLQ)5f3(ixqu z-_Px9v)ax=kD_NSsvbAF^{BDT`*p*D8)ExCHy^0y%MoyW=;`K$zv}5$k)EFX%G1pa IU0*`r6Sp~u1ONa4 literal 0 HcmV?d00001 diff --git a/testdata/drc/drcSimpleTests_au145.gds b/testdata/drc/drcSimpleTests_au145.gds new file mode 100644 index 0000000000000000000000000000000000000000..3e5c58ed74658dcd2db1a2bd4505a7045ad75e21 GIT binary patch literal 3290 zcmb7`F>6#o6opS_H!r)0CPIW1DYOzK5V0_^2^dls5>zCG3W7yUCunIQ*!mmNq)Tg= zGL_^f#4LU@hUxv+4BDaN>iO-%Fen1pVB zcN0c3tNio3apk-7$V(MB9pvekKIQwX-HQIHir4&;V;(B= zl9MVvE59K<&$`J=6*tZOhrItc&VX0;V5n~{fzQvbRdLfQKl&AU-s9n?_?@b_=^)QF z5B|ipk1irBRot}7^B&4Y5Bex>TIE?M*Rp=~fvR||e)fw#sr3D2N|P* zpejBqKfRNuXL3@-i~2|T^XDGX#eK)UBURiq@83WC$MHRi!QpHqgpg2Q#X@>ZEs3+jBtC%|t4%I_V zDW5~lDAR^qqO2heRNuh(C#OCP@55q>IVrwxeCMe)3mPa*JU_*ET$JWZ>U^axQgZ00 zSdTt-hlaYCFZI$%akX-pIw=yImQ6UJbLpgtQ@(*3IEgBCgVm|2Gz_D`Wfx6g3bp literal 0 HcmV?d00001 diff --git a/testdata/drc/drcSimpleTests_au145d.gds b/testdata/drc/drcSimpleTests_au145d.gds new file mode 100644 index 0000000000000000000000000000000000000000..243f03859f60045368f869281b9f8eef258a9af0 GIT binary patch literal 2084 zcmb7Ezfaph7=1ZA7XvLx3zecOLprfkB@?tur9g*PRDh}sfW$^S)1gBLcK91u*jO1D zGIr|R43#o=OgF|3NbdLUeE4iIIZkq(b@|@+^ZA2@Qak9>RO2sZ5aStMW7dC1qV&fP zYrtYuf7?G<-S~Na_2%7h`RsIWfKI)dr?u__aRTVa3N`3?1>j{XO4EP6H2s|rfrVqB z@ynsRCnA25^OeuPZj+Oy#O4_gO>%Vi;?wYFZ2W_auU{xAB+W>2k(z8aF1kUV^|_i= zifvd8OzVjBF`ko*p0YRkc};S7)Tyssnrwh%ft{+M)3W(tZfO7U&_oLLvDAX`QNjoK zNYn8ZeU!1#-O4`M*>FD5#LO$WyR^0w7IrYpk5|x7-iHvOny zs+Cak7R+)n4F<7*Vy1<@RAxxl?YgFDHPL#owSA*j(QU5Qy}Q))0IwU*G5G?gj7VQ=8=T=^f_i?n~;c+#|M} zl?&iVUIqP$-ov6bzfK;(Ko+gJ`N$RwWYK!FD?f4s16j1*|6yYZ2C^8-J3ed5w%{bc zx6LF2S+wT7IWsr!Z0}Er>R!JidU@^Pw31m^v%#ig72C`_)IAjY3vNCJKa