From 4773bb3227382559b1a704f22cd781fdae38f212 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 3 Aug 2025 18:00:25 +0200 Subject: [PATCH] Added a test for cumulative antenna ratio --- src/db/db/gsiDeclDbMeasureHelpers.h | 2 +- src/drc/unit_tests/drcSimpleTests.cc | 10 +++ testdata/drc/drcSimpleTests_144.drc | 81 +++++++++++++++++++++++++ testdata/drc/drcSimpleTests_144.gds | Bin 0 -> 2346 bytes testdata/drc/drcSimpleTests_au144.gds | Bin 0 -> 21474 bytes testdata/drc/drcSimpleTests_au144d.gds | Bin 0 -> 12642 bytes 6 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 testdata/drc/drcSimpleTests_144.drc create mode 100644 testdata/drc/drcSimpleTests_144.gds create mode 100644 testdata/drc/drcSimpleTests_au144.gds create mode 100644 testdata/drc/drcSimpleTests_au144d.gds diff --git a/src/db/db/gsiDeclDbMeasureHelpers.h b/src/db/db/gsiDeclDbMeasureHelpers.h index 80bc65bdf..7840b0f4d 100644 --- a/src/db/db/gsiDeclDbMeasureHelpers.h +++ b/src/db/db/gsiDeclDbMeasureHelpers.h @@ -177,7 +177,7 @@ public: */ template class expression_filter - : public gsi::shape_filter_impl + : public FilterBase { public: typedef typename FilterBase::shape_type shape_type; diff --git a/src/drc/unit_tests/drcSimpleTests.cc b/src/drc/unit_tests/drcSimpleTests.cc index cd25b1774..8e46d2d74 100644 --- a/src/drc/unit_tests/drcSimpleTests.cc +++ b/src/drc/unit_tests/drcSimpleTests.cc @@ -2034,3 +2034,13 @@ TEST(143d_evaluate_and_filter) run_test (_this, "143", true); } +TEST(144_combined_antennas) +{ + run_test (_this, "144", false); +} + +TEST(144d_combined_antennas) +{ + run_test (_this, "144", true); +} + diff --git a/testdata/drc/drcSimpleTests_144.drc b/testdata/drc/drcSimpleTests_144.drc new file mode 100644 index 000000000..393b91902 --- /dev/null +++ b/testdata/drc/drcSimpleTests_144.drc @@ -0,0 +1,81 @@ + +source $drc_test_source +target $drc_test_target + +if $drc_test_deep + deep +end + +gate = input(1, 0) +contact = input(2, 0) +metal1 = input(3, 0) +via1 = input(4, 0) +metal2 = input(5, 0) +via2 = input(6, 0) +metal3 = input(7, 0) +via3 = input(8, 0) +metal4 = input(9, 0) + +source.layers.each do |lp| + input(lp).output(lp) +end + +# Incrementally connect the metal stack, starting +# from gate, up to metal4. +# On each level, compute the antenna ratio of last +# metal area vs. gate area. Record the ratio in different +# layers. +# Then combine the layers and compute the cumulative +# ratio. Select gate shapes according to that ratio. + +connect(gate, contact) +connect(contact, metal1) + +# place metal1/gate area ratio in property #1 +ar_m1 = evaluate_nets(gate, { "m" => metal1 }, "put(1, area(m)/area)") + +# Note: incremental connect +connect(metal1, via1) +connect(via1, metal2) + +# place metal2/gate area ratio in property #2 +ar_m2 = evaluate_nets(gate, { "m" => metal2 }, "put(2, area(m)/area)") + +# Note: incremental connect +connect(metal2, via2) +connect(via2, metal3) + +# place metal3/gate area ratio in property #3 +ar_m3 = evaluate_nets(gate, { "m" => metal3 }, "put(3, area(m)/area)") + +# Note: incremental connect +connect(metal3, via3) +connect(via3, metal4) + +# place metal4/gate area ratio in property #4 +ar_m4 = evaluate_nets(gate, { "m" => metal4 }, "put(4, area(m)/area)") + +# merge properties #1 to #4: produces a set of properties on each shape +# Note: "merged_props" will merge the shapes and while doing so, combine +# the properties. As the propery names are all different, we get a list +# of area ratios on each shape. +ar_all = (ar_m1 + ar_m2 + ar_m3 + ar_m4).merged_props + +# we do not need these layers anymore +ar_m1.forget +ar_m2.forget +ar_m3.forget +ar_m4.forget + +# compute the sum of the area ratios in property #10 +ar_all.evaluate("put(10, value(1)+value(2)+value(3)+value(4))", {}, true) + +# output for debugging +ar_all.output(1000, 0) + +# select based on the cumulative area ratio +errors = ar_all.selected_if("value(10)>=ar_max", { "ar_max" => 3.0 }) + +# output errors +errors.output(1001, 0) + diff --git a/testdata/drc/drcSimpleTests_144.gds b/testdata/drc/drcSimpleTests_144.gds new file mode 100644 index 0000000000000000000000000000000000000000..8ecd65dfc19d8e1c91a5d3197f70ca57260a19fc GIT binary patch literal 2346 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 literal 0 HcmV?d00001 diff --git a/testdata/drc/drcSimpleTests_au144d.gds b/testdata/drc/drcSimpleTests_au144d.gds new file mode 100644 index 0000000000000000000000000000000000000000..e7ddcbf0b653c0189e2c29f4486fdd6fb8da1f5a GIT binary patch literal 12642 zcmc(lO=whC6vt08$z-bih_!)I0}T{uv6{wMKMFg(7qlg+eGUg1CrKN+>R}5N^-!o;ma0O`If(b7x@u&77P2 z&i|cz&%5`YQL56}c}Ds>I(r^UO)9cY-j_Y)&r<8Gp8WWz$ZM7E!$-b4_{kqXEPrr( z_Py!vK07V_-Oc+|tJNbST{V&FOP$go)t5U(WOr{Rgq5KX{;ENd?UN!s^G>%z>DpHG z?=1I!{5pL?fUiu8RF(?5U9TDY_sB*n_1?O+s>)Z^0u*72z7I_!QR&VPTnTtY#9iN;zV81}y4#1}xfxi%z%4(b#0fjx{2t zv0D=#uFb2&(!FVqO~lx)ko+63QJ+m+<$L?*3z1zbA;96=Av`)!(CxcclGv2`+gNCO z9FyVOHWQt0Z{8oj%tZ5FSu+1dx5t^Gr1?+vAO~)lptGwjnG{F(wI1W4pS?CCzhstYZ02s^vRj1h-FGBzK&# zNIKoF(P`4(B1rUz2INvGS_>woT=^?~%epn9D2ueUe#Ke1%}A^j$23(~*d-lV_H zqzBiG%&JEx>@#%xgKO*EKYwR4svJvV=l1pbpHtub9i;yS)!=mddi^JstUsjR*tKRAFqpMlgp*gvM4x;q; zoJFg|l8*8-`&jRyYSvdN9wNVdi;guck96|PV&(sGK0cQ^I_CK-PPbz#_kW=n=@9nx z+KkxKYcu4x38&lF%#@`6=po`B0=z#J!jCHj-LB(O@~`u$v4gSQ#wEQ6b{{uq%(v6+ z%Idr99csI)LxcNu9Q2#+V|G{f*=Jp$wZ%T`iq!bLg&zCp(bPXP96u1hAB`4tdn^5) zoiqOs|DTT)#DBfLW%p0q?=HvqcWk>D9)u>8h6O^>)#Uv-L7mB|DjFH|CljN=RbbQdHCmm`FFZq*;4=ar_BFvN*T+H=H3^o17V@)+w0T8wVb6Bp_MrUjyb-K-NW z_4X${Q=W59i<}xTEf5W7=L({w-kwDZr$>B3w6JeOc5|XyJV7bbFq-*m}c$p-=VPoU!%D>Gme|k@fddv9*3$il?LD zK@LmnosMkh!m5J;RwE}$u;)?2T7yT3g7L9}ZqK8Hl?IOxC9FhFx93s9`h!P^0@fj? z+w&-4^}!=V0jrSH?Rk{+P1{~lsWqjTJI=VrwDxCMo1ZCn*wt!|Lss%{*}>xhTjDe z|84kPpyZ$Z7S97CHNDJr=|oGL>(Yr9t2(ZsU oTf~4^@XlP9PPB0DV=N$AGS{UOEp4t#CtBK7m)8Gb+SMih13