From 28e96ee0c3d9809a52f77b4d46115c480a345f5f Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Thu, 7 Mar 2024 22:29:33 +0100 Subject: [PATCH] Added not_... versions of edge modes --- src/db/db/dbRegionProcessors.cc | 45 +++++++++++++++--- src/db/db/dbRegionProcessors.h | 3 +- src/db/db/gsiDeclDbRegion.cc | 15 ++++++ .../drc/built-in-macros/_drc_complex_ops.rb | 7 +++ src/drc/drc/built-in-macros/_drc_engine.rb | 20 ++++++++ src/drc/drc/built-in-macros/_drc_layer.rb | 9 +++- testdata/drc/drcSimpleTests_92.drc | 11 +++++ testdata/drc/drcSimpleTests_au92.gds | Bin 14666 -> 36266 bytes testdata/drc/drcSimpleTests_au92d.gds | Bin 10176 -> 25296 bytes 9 files changed, 102 insertions(+), 8 deletions(-) diff --git a/src/db/db/dbRegionProcessors.cc b/src/db/db/dbRegionProcessors.cc index 9ba85b006..63fcdea3b 100644 --- a/src/db/db/dbRegionProcessors.cc +++ b/src/db/db/dbRegionProcessors.cc @@ -170,12 +170,45 @@ contour_to_edges (const db::Polygon::contour_type &contour, PolygonToEdgeProcess int s1 = db::vprod_sign (*p0 - *pm1, *p1 - *p0); int s2 = db::vprod_sign (*p1 - *p0, *p2 - *p1); - if (mode == PolygonToEdgeProcessor::All || - (mode == PolygonToEdgeProcessor::Convex && s1 < 0 && s2 < 0) || - (mode == PolygonToEdgeProcessor::Concave && s1 > 0 && s2 > 0) || - (mode == PolygonToEdgeProcessor::StepOut && s1 > 0 && s2 < 0) || - (mode == PolygonToEdgeProcessor::StepIn && s1 < 0 && s2 > 0) || - (mode == PolygonToEdgeProcessor::Step && s1 * s2 < 0)) { + bool take = true; + + switch (mode) { + case PolygonToEdgeProcessor::All: + default: + break; + case PolygonToEdgeProcessor::Convex: + take = s1 < 0 && s2 < 0; + break; + case PolygonToEdgeProcessor::NotConvex: + take = ! (s1 < 0 && s2 < 0); + break; + case PolygonToEdgeProcessor::Concave: + take = s1 > 0 && s2 > 0; + break; + case PolygonToEdgeProcessor::NotConcave: + take = ! (s1 > 0 && s2 > 0); + break; + case PolygonToEdgeProcessor::StepOut: + take = s1 > 0 && s2 < 0; + break; + case PolygonToEdgeProcessor::NotStepOut: + take = ! (s1 > 0 && s2 < 0); + break; + case PolygonToEdgeProcessor::StepIn: + take = s1 < 0 && s2 > 0; + break; + case PolygonToEdgeProcessor::NotStepIn: + take = ! (s1 < 0 && s2 > 0); + break; + case PolygonToEdgeProcessor::Step: + take = s1 * s2 < 0; + break; + case PolygonToEdgeProcessor::NotStep: + take = ! (s1 * s2 < 0); + break; + } + + if (take) { result.push_back (db::Edge (*p0, *p1)); } diff --git a/src/db/db/dbRegionProcessors.h b/src/db/db/dbRegionProcessors.h index 9cfc96fc5..08553ca25 100644 --- a/src/db/db/dbRegionProcessors.h +++ b/src/db/db/dbRegionProcessors.h @@ -293,7 +293,8 @@ class DB_PUBLIC PolygonToEdgeProcessor : public db::PolygonToEdgeProcessorBase { public: - enum EdgeMode { All = 0, Convex, Concave, StepIn, StepOut, Step }; + enum EdgeMode { All = 0, Convex, Concave, StepIn, StepOut, Step, + NotConvex, NotConcave, NotStepIn, NotStepOut, NotStep }; PolygonToEdgeProcessor (EdgeMode mode = All); diff --git a/src/db/db/gsiDeclDbRegion.cc b/src/db/db/gsiDeclDbRegion.cc index b51b1f4e9..2e16558ed 100644 --- a/src/db/db/gsiDeclDbRegion.cc +++ b/src/db/db/gsiDeclDbRegion.cc @@ -3258,17 +3258,32 @@ gsi::Enum decl_EdgeMode ("db", "EdgeMode", gsi::enum_const ("Concave", db::PolygonToEdgeProcessor::Concave, "@brief Selects only concave edges\n" ) + + gsi::enum_const ("NotConcave", db::PolygonToEdgeProcessor::NotConcave, + "@brief Selects only edges which are not concave\n" + ) + gsi::enum_const ("Convex", db::PolygonToEdgeProcessor::Convex, "@brief Selects only convex edges\n" ) + + gsi::enum_const ("NotConvex", db::PolygonToEdgeProcessor::NotConvex, + "@brief Selects only edges which are not convex\n" + ) + gsi::enum_const ("Step", db::PolygonToEdgeProcessor::Step, "@brief Selects only step edges leading inside or outside\n" ) + + gsi::enum_const ("NotStep", db::PolygonToEdgeProcessor::NotStep, + "@brief Selects only edges which are not steps\n" + ) + gsi::enum_const ("StepIn", db::PolygonToEdgeProcessor::StepIn, "@brief Selects only step edges leading inside\n" ) + + gsi::enum_const ("NotStepIn", db::PolygonToEdgeProcessor::NotStepIn, + "@brief Selects only edges which are not steps leading inside\n" + ) + gsi::enum_const ("StepOut", db::PolygonToEdgeProcessor::StepOut, "@brief Selects only step edges leading outside\n" + ) + + gsi::enum_const ("NotStepOut", db::PolygonToEdgeProcessor::NotStepOut, + "@brief Selects only edges which are not steps leading outside\n" ), "@brief This class represents the edge mode type for \\Region#edges.\n" "\n" 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 9950da2e9..93a659a95 100644 --- a/src/drc/drc/built-in-macros/_drc_complex_ops.rb +++ b/src/drc/drc/built-in-macros/_drc_complex_ops.rb @@ -1014,6 +1014,13 @@ CODE # out = in.drc(primary.edges(convex)) # @/code # + # In addition, "not_.." variants are available which selects edges + # not qualifying for the specific mode: + # + # @code + # out = in.drc(primary.edges(not_convex)) + # @/code + # # The mode argument is ignored when translating other objects than # polygons. diff --git a/src/drc/drc/built-in-macros/_drc_engine.rb b/src/drc/drc/built-in-macros/_drc_engine.rb index 3714a325b..e7289f3f6 100644 --- a/src/drc/drc/built-in-macros/_drc_engine.rb +++ b/src/drc/drc/built-in-macros/_drc_engine.rb @@ -259,22 +259,42 @@ module DRC DRCEdgeMode::new(RBA::EdgeMode::Convex) end + def not_convex + DRCEdgeMode::new(RBA::EdgeMode::NotConvex) + end + def concave DRCEdgeMode::new(RBA::EdgeMode::Concave) end + def not_concave + DRCEdgeMode::new(RBA::EdgeMode::NotConcave) + end + def step_in DRCEdgeMode::new(RBA::EdgeMode::StepIn) end + def not_step_in + DRCEdgeMode::new(RBA::EdgeMode::NotStepIn) + end + def step_out DRCEdgeMode::new(RBA::EdgeMode::StepOut) end + def not_step_out + DRCEdgeMode::new(RBA::EdgeMode::NotStepOut) + end + def step DRCEdgeMode::new(RBA::EdgeMode::Step) end + def not_step + DRCEdgeMode::new(RBA::EdgeMode::NotStep) + end + def padding_zero DRCDensityPadding::new(:zero) end diff --git a/src/drc/drc/built-in-macros/_drc_layer.rb b/src/drc/drc/built-in-macros/_drc_layer.rb index 5d0409e2a..fc722810a 100644 --- a/src/drc/drc/built-in-macros/_drc_layer.rb +++ b/src/drc/drc/built-in-macros/_drc_layer.rb @@ -3409,7 +3409,14 @@ CODE # out = in.edges(convex) # @/code # - # This feature is only available for polygon layers. + # In addition, "not_.." variants are available which selects edges + # not qualifying for the specific mode: + # + # @code + # out = in.edges(not_convex) + # @/code + # + # The mode argument is only available for polygon layers. # # The following images show the effect of the mode argument: # diff --git a/testdata/drc/drcSimpleTests_92.drc b/testdata/drc/drcSimpleTests_92.drc index 5894b4c93..7187fe7aa 100644 --- a/testdata/drc/drcSimpleTests_92.drc +++ b/testdata/drc/drcSimpleTests_92.drc @@ -19,6 +19,12 @@ l2.edges(step).output(103, 0) l2.edges(step_in).output(104, 0) l2.edges(step_out).output(105, 0) +l2.edges(not_convex).output(111, 0) +l2.edges(not_concave).output(112, 0) +l2.edges(not_step).output(113, 0) +l2.edges(not_step_in).output(114, 0) +l2.edges(not_step_out).output(115, 0) + l2.drc(primary.edges).output(200, 0) l2.drc(primary.edges(convex)).output(201, 0) l2.drc(primary.edges(concave)).output(202, 0) @@ -26,4 +32,9 @@ l2.drc(primary.edges(step)).output(203, 0) l2.drc(primary.edges(step_in)).output(204, 0) l2.drc(primary.edges(step_out)).output(205, 0) +l2.drc(primary.edges(not_convex)).output(211, 0) +l2.drc(primary.edges(not_concave)).output(212, 0) +l2.drc(primary.edges(not_step)).output(213, 0) +l2.drc(primary.edges(not_step_in)).output(214, 0) +l2.drc(primary.edges(not_step_out)).output(215, 0) diff --git a/testdata/drc/drcSimpleTests_au92.gds b/testdata/drc/drcSimpleTests_au92.gds index 2ce998226d5f99532ba5ed4577e969a40e7ba7e6..26068b9b3bb8abd2c88391f2ce863219a089854d 100644 GIT binary patch delta 3467 zcmZXXJ8xW76oqGu@em$ik|+syl559O$OB;+#NZSZ{sTxZBSevZz|6gWfPX;9DFG=p zqA)^q6mCHjNOR}jHWi{wO~v}wzUK@U&Cxoq{a9?HQt*1 zJ$hv{8QmD|j%NSG-yGb#^1sEOKL4#6f0<5p<{qo`-G?`Yp6)UK^Bu;Q6UL)kK5>Wf z#chqx-m21%pXe}PdXHPDZ&c~&$DpI*D!sUw(ezEwSG(NZ|HyZNN5_mW9x8C#LbP!%lPBvU56WWg(R&%4-v>dXE)S+2I<~V1 zReF4#-Nkim!K~sFvti>%q6YfMr=Gme&h!Ju%)EIT_YzopO7iEPZ;&?CkP< zytFRMqDw}h%d+UQEV?Z1jS^dCRagpDGO{X5tAfQ)Vp)^`;Tt7%MFokc7()Y{7&HLI zPH3P=q`}gRFH4a!uM#{5g6E|Rb%|O~%*CKsjzw`Cgw{aNDmp}~0vD~3C}pe^L}tm& zWNv1V2|e?1Z8GaZW=26~UC68pnROwvcA+!6(Afw|Gcu*MDa9_{GO=|b7Q_z3>Y|9P zUE=r#=MvYsfnHGT1igw)^wzl{)aJP^JO`q(*$Ku2!FX-Pb$PG=?HCN&6_#jMK&t7u z1NngQRT zCdkHeuMR>@21EA!X7d-?lihCG4LH@RJqO#GJs+yWKe99p~;=5u?&pS zon>_B&ap<}2SSF%4W_XeHh~UU3>_4gbif27Cea}fI*32%pd6(`a6(rPgd)mVIut^z z!)AsKFgs7*@6Xih&3gLmV3y90Wi`Wj;6E)L1%+{)d z{fV}Ynu8&KYq?uX-`at&MAf?JZcQpH@wDiK=x?1NDYOm_`djBNXQIE&&C6c>70993 z=OQC{x32me@l5ml;&E!z|HB2PvROy1)?WngTWjuQPqk;)K}DugIZW+tD5Pu#m${4r zQH3%PvBi7N26I|h9O7q2_~zxeKOWO;)n6L>@vVU7%uz*LNDzon|1jtK+JQ^tzBfygF>hZhftN*XF}vo#)0^l0-@&GI^he} zG1a-kbz6L4lQI8>)O<(>o0~chYcQJEXF|C^10h%5-S+RH&T@AYEx|J8x(|df1QNnv zhBNtxt1d<}DOS;n{m=@;dA@3&r6(&p{S5Cf$j}#)eHNj&CcXO&heLqg0`ykAcfZk! z1n4b*)`w2hTS9tFAgJ%1Eb~omhhyZ(>ocKT+kvR^; z2sR2ZyV&;Y5hhVgiKs31?nB`C3!;=%L$WzE9;}B9++-)e++m5%!fEXg99^t9L>5vF RSwOyj=Wu5-8f|Zn{slrPHyr=~ delta 97 zcmZ2Ao9R@M5(66p6H^3(3?mc!3kGHeb_P)fT?SQT_CzIhK@7o-Q77dlpY@WSyg`6v da$J%4@|VP7%NI+HSF-l3ucr zjFU(I~=467rl`p z^UB_yVho7!uwyZW#$c~v3e8q%WDz4l(-cpOEHx5q90RhvrAC)A z8Z=Gu(P;N>X?%LN_;tZubb9GLZW54fGFKv%Cc;{x%FiOKiU~lB1HD?KuvfxrB~`~5 z&@{!zBsCg?y^3ixTceRpj08(1-OPQy8PMbVpyNU2_8)>itgH7P_GmkEe|MODvcWhf zQoZtB8Yo}E`a}TjGD);A+e^Rsl;S9XB(k|1tA_9niDgAn>SpfunDu-mb3fNW(704| z-p}00gt_xR-mE<92Op^BN;P+fW7aQjo6X$w2j<22cz_LJK#YeIESy)@@rBu|0k;F0 z(*ItUjC}!Z4mBWrDBg^Ms0JcU!z^l;33Jl`!aHb~Dd(AT#u{hV@q)A5KH+Ft;mE9U zl$$3U3q1k3Z=R{ldZvar0b7MLh!{8vmg*C4%-PSF7m;}pnS<~S%nPk~q5KQwk2U^y z;R}CQU{PT_P{Eq1C{;xX3p!V>z87MM?iCj=$>tCO;)w{YRH`K1MvsAQO-vcZlu-yl_5+Ja~R{L)=wC zvYCx3DTr|>oFIRLtC+Bg#ni2})V2c!sA7RZ`oKzoEC!Mw#^LNMEjDA#tAs;wt5|$8 zvCh4Q9X1?XrLyH|_DxgA(%BrkWX`ujO*xdat-`rhPIcr|D<{T0_MrhljLA-fy+HCa z5Ph|3#o8UWb>1$ru+D9hpMd8mKMCK?hB#hXm9sD(I5#nd*}%Wi%