From bc63f98622bfcb95cc12a63f8491cb2108748dd2 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 9 Jan 2021 18:40:32 +0100 Subject: [PATCH] WIP: more tests on complex DRC ops --- .../drc/built-in-macros/_drc_complex_ops.rb | 76 +++++++++--------- src/drc/drc/built-in-macros/_drc_engine.rb | 2 +- src/drc/unit_tests/drcGenericTests.cc | 10 +++ testdata/drc/drcGenericTests_5.drc | 41 ++++++++++ testdata/drc/drcGenericTests_5.gds | Bin 0 -> 1302 bytes testdata/drc/drcGenericTests_au5.gds | Bin 0 -> 6218 bytes testdata/drc/drcGenericTests_au5d.gds | Bin 0 -> 5950 bytes 7 files changed, 90 insertions(+), 39 deletions(-) create mode 100644 testdata/drc/drcGenericTests_5.drc create mode 100644 testdata/drc/drcGenericTests_5.gds create mode 100644 testdata/drc/drcGenericTests_au5.gds create mode 100644 testdata/drc/drcGenericTests_au5d.gds diff --git a/src/drc/drc/built-in-macros/_drc_complex_ops.rb b/src/drc/drc/built-in-macros/_drc_complex_ops.rb index e7a843aa1..655bcbbba 100644 --- a/src/drc/drc/built-in-macros/_drc_complex_ops.rb +++ b/src/drc/drc/built-in-macros/_drc_complex_ops.rb @@ -1190,31 +1190,31 @@ end class DRCOpNodeCountFilter < DRCOpNodeWithCompare attr_accessor :input - attr_accessor :inverted + attr_accessor :inverse def initialize(engine, input) super(engine) self.input = input - self.inverted = false + self.inverse = false self.description = "count" end def _description_for_dump - self.inverted ? "count" : "not_count" + self.inverse ? "count" : "not_count" end def do_create_node(cache) args = [ self.input.create_node(cache), self.inverse ] args << (self.gt ? @engine._make_numeric_value(self.gt) + 1 : (self.ge ? @engine._make_numeric_value(self.ge) : 0)) if self.lt || self.le - args << self.lt ? @engine._make_numeric_value(self.lt) : @engine._make_numeric_value(self.le) - 1 + args << (self.lt ? @engine._make_numeric_value(self.lt) : @engine._make_numeric_value(self.le) - 1) end RBA::CompoundRegionOperationNode::new_count_filter(*args) end def inverted res = self.dup - res.inverted = !res.inverted + res.inverse = !res.inverse return res end @@ -1223,31 +1223,31 @@ end class DRCOpNodeAreaFilter < DRCOpNodeWithCompare attr_accessor :input - attr_accessor :inverted + attr_accessor :inverse def initialize(engine, input) super(engine) self.input = input - self.inverted = false + self.inverse = false self.description = "area" end def _description_for_dump - self.inverted ? "area" : "not_area" + self.inverse ? "area" : "not_area" end def do_create_node(cache) args = [ self.input.create_node(cache), self.inverse ] args << (self.gt ? @engine._make_area_value(self.gt) + 1 : (self.ge ? @engine._make_area_value(self.ge) : 0)) if self.lt || self.le - args << self.lt ? @engine._make_area_value(self.lt) : @engine._make_area_value(self.le) - 1 + args << (self.lt ? @engine._make_area_value(self.lt) : @engine._make_area_value(self.le) - 1) end RBA::CompoundRegionOperationNode::new_area_filter(*args) end def inverted res = self.dup - res.inverted = !res.inverted + res.inverse = !res.inverse return res end @@ -1256,17 +1256,17 @@ end class DRCOpNodeEdgeLengthFilter < DRCOpNodeWithCompare attr_accessor :input - attr_accessor :inverted + attr_accessor :inverse def initialize(engine, input) super(engine) self.input = input - self.inverted = false + self.inverse = false self.description = "length" end def _description_for_dump - self.inverted ? "length" : "not_length" + self.inverse ? "length" : "not_length" end def do_create_node(cache) @@ -1281,7 +1281,7 @@ class DRCOpNodeEdgeLengthFilter < DRCOpNodeWithCompare args = [ n, self.inverse ] args << (self.gt ? @engine._make_value(self.gt) + 1 : (self.ge ? @engine._make_value(self.ge) : 0)) if self.lt || self.le - args << self.lt ? @engine._make_value(self.lt) : @engine._make_value(self.le) - 1 + args << (self.lt ? @engine._make_value(self.lt) : @engine._make_value(self.le) - 1) end RBA::CompoundRegionOperationNode::new_edge_length_filter(*args) @@ -1290,7 +1290,7 @@ class DRCOpNodeEdgeLengthFilter < DRCOpNodeWithCompare def inverted res = self.dup - res.inverted = !res.inverted + res.inverse = !res.inverse return res end @@ -1299,17 +1299,17 @@ end class DRCOpNodeEdgeOrientationFilter < DRCOpNodeWithCompare attr_accessor :input - attr_accessor :inverted + attr_accessor :inverse def initialize(engine, input) super(engine) self.input = input - self.inverted = false + self.inverse = false self.description = "angle" end def _description_for_dump - self.inverted ? "angle" : "not_angle" + self.inverse ? "angle" : "not_angle" end def do_create_node(cache) @@ -1332,7 +1332,7 @@ class DRCOpNodeEdgeOrientationFilter < DRCOpNodeWithCompare def inverted res = self.dup - res.inverted = !res.inverted + res.inverse = !res.inverse return res end @@ -1341,31 +1341,31 @@ end class DRCOpNodePerimeterFilter < DRCOpNodeWithCompare attr_accessor :input - attr_accessor :inverted + attr_accessor :inverse def initialize(engine, input) super(engine) self.input = input - self.inverted = false + self.inverse = false self.description = "perimeter" end def _description_for_dump - self.inverted ? "perimeter" : "not_perimeter" + self.inverse ? "perimeter" : "not_perimeter" end def do_create_node(cache) args = [ self.input.create_node(cache), self.inverse ] args << (self.gt ? @engine._make_value(self.gt) + 1 : (self.ge ? @engine._make_value(self.ge) : 0)) if self.lt || self.le - args << self.lt ? @engine._make_value(self.lt) : @engine._make_value(self.le) - 1 + args << (self.lt ? @engine._make_value(self.lt) : @engine._make_value(self.le) - 1) end RBA::CompoundRegionOperationNode::new_perimeter_filter(*args) end def inverted res = self.dup - res.inverted = !res.inverted + res.inverse = !res.inverse return res end @@ -1374,7 +1374,7 @@ end class DRCOpNodeInteractingWithCount < DRCOpNodeWithCompare attr_accessor :a, :b - attr_accessor :inverted + attr_accessor :inverse attr_accessor :op def initialize(engine, a, b, op) @@ -1382,15 +1382,15 @@ class DRCOpNodeInteractingWithCount < DRCOpNodeWithCompare self.a = a self.b = b self.op = op - self.inverted = false - self.description = (self.inverted ? "" : "not_") + self.op.to_s + self.inverse = false + self.description = (self.inverse ? "" : "not_") + self.op.to_s end def do_create_node(cache) args = [ self.a.create_node(cache), self.b.create_node(cache), self.inverse ] args << (self.gt ? self.gt + 1 : (self.ge ? self.ge : 0)) if self.lt || self.le - args << self.lt ? self.lt : self.le - 1 + args << (self.lt ? self.lt : self.le - 1) end factory = { :covering => :new_enclosing, :overlapping => :new_overlapping, @@ -1400,7 +1400,7 @@ class DRCOpNodeInteractingWithCount < DRCOpNodeWithCompare def inverted res = self.dup - res.inverted = !res.inverted + res.inverse = !res.inverse return res end @@ -1409,7 +1409,7 @@ end class DRCOpNodeInteracting < DRCOpNode attr_accessor :a, :b - attr_accessor :inverted + attr_accessor :inverse attr_accessor :op def initialize(engine, a, b, op) @@ -1417,8 +1417,8 @@ class DRCOpNodeInteracting < DRCOpNode self.a = a self.b = b self.op = op - self.inverted = false - self.description = (self.inverted ? "" : "not_") + self.op.to_s + self.inverse = false + self.description = (self.inverse ? "" : "not_") + self.op.to_s end def do_create_node(cache) @@ -1429,7 +1429,7 @@ class DRCOpNodeInteracting < DRCOpNode def inverted res = self.dup - res.inverted = !res.inverted + res.inverse = !res.inverse return res end @@ -1535,13 +1535,13 @@ class DRCOpNodeBBoxParameterFilter < DRCOpNodeWithCompare attr_accessor :input attr_accessor :parameter - attr_accessor :inverted + attr_accessor :inverse def initialize(engine, parameter, input, description) super(engine) self.parameter = parameter self.input = input - self.inverted = false + self.inverse = false self.description = description end @@ -1549,14 +1549,14 @@ class DRCOpNodeBBoxParameterFilter < DRCOpNodeWithCompare args = [ self.input.create_node(cache), self.inverse ] args << (self.gt ? @engine._make_value(self.gt) + 1 : (self.ge ? @engine._make_value(self.ge) : 0)) if self.lt || self.le - args << self.lt ? @engine._make_value(self.lt) : @engine._make_value(self.le) - 1 + args << (self.lt ? @engine._make_value(self.lt) : @engine._make_value(self.le) - 1) end RBA::CompoundRegionOperationNode::new_perimeter_filter(*args) end def inverted res = self.dup - res.inverted = !res.inverted + res.inverse = !res.inverse return res end @@ -1566,7 +1566,7 @@ class DRCOpNodeCornersFilter < DRCOpNodeWithCompare attr_accessor :input attr_accessor :parameter - attr_accessor :inverted + attr_accessor :inverse def initialize(engine, as_dots, input) super(engine) diff --git a/src/drc/drc/built-in-macros/_drc_engine.rb b/src/drc/drc/built-in-macros/_drc_engine.rb index 94c8512eb..16f2ccadb 100644 --- a/src/drc/drc/built-in-macros/_drc_engine.rb +++ b/src/drc/drc/built-in-macros/_drc_engine.rb @@ -2264,7 +2264,7 @@ CODE def _make_area_value(v) self._check_numeric(v) - self._prep_area_value(v) + self._prep_value_area(v) end def _make_numeric_value(v) diff --git a/src/drc/unit_tests/drcGenericTests.cc b/src/drc/unit_tests/drcGenericTests.cc index 0b7b4572c..a0314f298 100644 --- a/src/drc/unit_tests/drcGenericTests.cc +++ b/src/drc/unit_tests/drcGenericTests.cc @@ -108,3 +108,13 @@ TEST(4d) { run_test (_this, "4", true); } + +TEST(5) +{ + run_test (_this, "5", false); +} + +TEST(5d) +{ + run_test (_this, "5", true); +} diff --git a/testdata/drc/drcGenericTests_5.drc b/testdata/drc/drcGenericTests_5.drc new file mode 100644 index 000000000..0e4cae5e7 --- /dev/null +++ b/testdata/drc/drcGenericTests_5.drc @@ -0,0 +1,41 @@ + +source $drc_test_source +target $drc_test_target + +if $drc_test_deep + deep + threads(0) # easier to debug +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) + +# predicates and logical operations + +l1.drc(rectangles).output(100, 0) +l1.drc(primary.rectangles).output(101, 0) +l2.drc(secondary(l1).rectangles).output(102, 0) + +l1.drc(rectilinear).output(110, 0) +l1.drc(primary.rectilinear).output(111, 0) +l2.drc(secondary(l1).rectilinear).output(112, 0) + +l1.drc(area > 3.0).output(120, 0) +l1.drc(area >= 3.0).output(121, 0) +l1.drc(3.0 <= area < 4.0).output(122, 0) + +l1.drc(perimeter > 7.0).output(130, 0) +l1.drc(perimeter >= 7.0).output(131, 0) +l1.drc(7.0 <= perimeter < 8.0).output(132, 0) + +l1.drc(! rectilinear).output(140, 0) +l1.drc(! rectangles).output(141, 0) + +l1.drc(if_all(! rectangles, area < 8.0)).output(150, 0) +l1.drc(if_any(rectangles, area > 8.0)).output(151, 0) + diff --git a/testdata/drc/drcGenericTests_5.gds b/testdata/drc/drcGenericTests_5.gds new file mode 100644 index 0000000000000000000000000000000000000000..0b407243fbbb3aae8b38e25640951ae1dfc095a2 GIT binary patch literal 1302 zcmaizy)Oh&6vfZZ%)b4wK6VjSw$zc(i9{sU7Aqt~wh)ys-8=7|fr003ppx=3_edd!B4#n+-XrUom8B{$ zQSYKMH@soKVTe4LPPL*(%ziUJfhlp7tdLIva2-o7e_uHYDyC!;W0R63q zyl1HE-hcf>p9S$-zD-LlBBkodejsxL^jumFHi6!AK&d*@?cZ}xKYa`2t^lE&dVedT z>dY>FqPsKk6Lq$veni!oq5q%hWsPa9uG!h;OFGH8=|!t%EOh`BD(UJ4ADvwMyqy5w zyIpJM#w87z8={X<`?iudnVS6n*5iDfRic-=oQ`FA+fGWUI-g>q|7iyp*(DN+Pxe!) zKC+wSxBW@Vq|etm+qY76W@3Fwv-Bw}Z`*H8sd~5m+sBeNBH>_@=y5Ni>d9%7q)0j} xU+2Ux?_sGrr^xN!Nvr+Ra#xnpubiV&^-$@tFRcbwT|XEC$y!3%`5xija^opbNpnT?bsiXKR9EUJ8y zF{#RVsmT@hvy4aO#+{oY7Ye28H(p=8`{mQ#wOifGYabsrrB)ikE0>%1?u!)1MaolA z?7e&@5|M@Jf=K17F@G+KoLv(s>;m=g#9lmil6PskV9c-EBC{RE`Ia$=MPyCpn`{!KL9)74xGVbAPelUl5Jet&e0%?ywc=_8KsvmH_i8{0h z{dC;V2M6j#MXLC%S&A079vk8^{40#UE19U|?+_K*D{PWk~K zJnl=!{p;hrVm|u-Y7pzQ7InOjA0>UK*FSdFjoDkmK8-o3$sl} z-S`W=pdXR;W9t{J{u&?F927t8F}m@$EMND|Ivv#i2Gp;^59&XUMqJE-q4I<7)(nsC=IsB9P`;Y$P@PqVwn&{WS`@yfDo&(#@Y+q%c_4H@@ zuk(Gv{$$@1+9&u=DR!3laO%^#;b1 z^w0kL180`!kmvH){muQv{Gj|j%Q%1ZpH}|pFE9CHJfZn>_(Az=kJ!KZ_yPUP;s5JT zy*|ahMfCJ9hac3x9Da~~%Nf@{{ijv`^p}_VXFQ?x|2$*;=|3&~=`Sz(GoDfP54}HL z*!~lA{$6IBfBH`=|MZua{4<`={J+XrfBH{LfBMUd{)}f-{X@^+%82LhO~OCz{|(=c y$ZKTueSvYMRd4i{mwJ02s5^OS>GC0oBda{pe_nKFJfY{@;h*lFti<16i}DvIVvXJa literal 0 HcmV?d00001 diff --git a/testdata/drc/drcGenericTests_au5d.gds b/testdata/drc/drcGenericTests_au5d.gds new file mode 100644 index 0000000000000000000000000000000000000000..fa60a6bc5a096e8213f12bba9ea2ad9a00647316 GIT binary patch literal 5950 zcmd5=ziSjh82xfT_Ac>aG*M#Y%9Mf@f(SuKOp#!~AXkW$MYIx486|~iiU>aGaUc~mfHRotbTJyq&aFg$>$JX7k|WLQJ^EUEhHZphVDE4AMd8QHL?bB1x|KFU|>um!%spBJ!}Qbfkn`67)S zkz-p1$JRxL--{3#*XY(?al2ptC^EP$0z}tGHY_r(u?JtN&+oujYVS7Ix5&80kpB<$ znnBRHzG$=?8l{p+>e;8k*@4F*t#*B8Q@0Ku{k~B^e|M{<=O*EX#*R|I&zRl9Z%_^Y zcjHMs?Nz0I%%M95Czgy-M8VXfr}0gFa2e`6m@;(}8P}M) zKHQ8tffGyStPvUSRsZfwxJ@bG*t$~RRxC1}?lw3D?l5>T1wQs+ka6uIw|>X1=A;d7 z8$`Y6Ba!i#TdPsGo0^l{ioGDN(OrMZ@{QB6PdGbi|A@!-@9?2p->3CX#`PV(*ZOze z^*?QzX$9Qxp#K&zt<3XC{~~Y*=Y^doxH&kF_+G4^%(ses>9>#3<*;QD`OIyYG(U`n zm`j{PoJ+)%+l=)rpq_MpS)UlcVD_R97E}Dk{NenL>mQ$A3Fp`0d+GlmXZ@J3Ec&sY zqV!{aU;P}umww9`=U;^HG5;cbkNFqj$Nm2w^UvXD?Vs2DTgmzSFke~D59=xF{4l@o z`FWUg|Cz5W{bxNz^`H5(_Fwb8&fgu%A!B(DN29l_tpPt&i!Y;vh<(z z6xDy`&)R>@_c}jo8PDJIF2CR3Enej88|L$^qbz>oK8o_&tDO7JeEs(Qb+?YP^qut- U)pzFiJ?9R;zjLmC)vVRz4_Y?hEdT%j literal 0 HcmV?d00001