From 71d2d9ef3f92f2f89442a5ccb5aa4164069feffb Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Wed, 18 Jan 2023 15:46:09 +0100 Subject: [PATCH] WIP: tests for complex DRC ops with properties --- src/db/unit_tests/dbAsIfFlatRegionTests.cc | 67 ++++++++++++++++++++ src/db/unit_tests/dbDeepRegionTests.cc | 68 +++++++++++++++++++++ testdata/algo/deep_region_au43.gds | Bin 0 -> 5872 bytes testdata/algo/flat_region_au43.gds | Bin 0 -> 8814 bytes 4 files changed, 135 insertions(+) create mode 100644 testdata/algo/deep_region_au43.gds create mode 100644 testdata/algo/flat_region_au43.gds diff --git a/src/db/unit_tests/dbAsIfFlatRegionTests.cc b/src/db/unit_tests/dbAsIfFlatRegionTests.cc index 6ad733c54..1f1a443b1 100644 --- a/src/db/unit_tests/dbAsIfFlatRegionTests.cc +++ b/src/db/unit_tests/dbAsIfFlatRegionTests.cc @@ -33,6 +33,7 @@ #include "dbOriginalLayerRegion.h" #include "dbCellGraphUtils.h" #include "dbTestSupport.h" +#include "dbCompoundOperation.h" #include "tlUnitTest.h" #include "tlStream.h" @@ -1838,3 +1839,69 @@ TEST(42_DRCWithProperties) CHECKPOINT(); db::compare_layouts (_this, target, tl::testdata () + "/algo/flat_region_au42.gds"); } + +TEST(43_ComplexOpsWithProperties) +{ + db::Layout ly; + { + std::string fn (tl::testdata ()); + fn += "/algo/deep_region_42.gds"; + tl::InputStream stream (fn); + db::Reader reader (stream); + reader.read (ly); + } + + db::cell_index_type top_cell_index = *ly.begin_top_down (); + db::Cell &top_cell = ly.cell (top_cell_index); + + unsigned int l1 = ly.get_layer (db::LayerProperties (1, 0)); + unsigned int l2 = ly.get_layer (db::LayerProperties (2, 0)); + + db::RecursiveShapeIterator si1 (ly, top_cell, l1); + si1.shape_flags (db::ShapeIterator::All | db::ShapeIterator::RegardProperties); + db::Region r1 (si1); + + db::RecursiveShapeIterator si2 (ly, top_cell, l2); + si2.shape_flags (db::ShapeIterator::All | db::ShapeIterator::RegardProperties); + db::Region r2 (si2); + + db::Layout target; + unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index)); + + db::RegionCheckOptions opt; + opt.metrics = db::Projection; + + db::CompoundRegionOperationSecondaryNode *secondary = new db::CompoundRegionOperationSecondaryNode (&r2); + db::CompoundRegionCheckOperationNode sep_check (secondary, db::SpaceRelation, true /*==different polygons*/, 1000, opt); + + db::CompoundRegionOperationSecondaryNode *secondary2 = new db::CompoundRegionOperationSecondaryNode (&r2); + db::CompoundRegionCheckOperationNode *sep_check2 = new db::CompoundRegionCheckOperationNode (secondary2, db::SpaceRelation, true /*==different polygons*/, 1000, opt); + db::CompoundRegionEdgePairToPolygonProcessingOperationNode sep_check2p (new db::EdgePairToPolygonProcessor (0), sep_check2, true); + + db::CompoundRegionOperationSecondaryNode *secondary3 = new db::CompoundRegionOperationSecondaryNode (&r2); + db::CompoundRegionCheckOperationNode *sep_check3 = new db::CompoundRegionCheckOperationNode (secondary3, db::SpaceRelation, true /*==different polygons*/, 1000, opt); + db::CompoundRegionEdgePairToEdgeProcessingOperationNode sep_check2e (new db::EdgePairToEdgesProcessor (), sep_check3, true); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (1, 0)), r1); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (2, 0)), r2); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (10, 0)), r1.cop_to_edge_pairs (sep_check)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (11, 0)), r1.cop_to_region (sep_check2p)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (12, 0)), r1.cop_to_edges (sep_check2e)); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (20, 0)), r1.cop_to_edge_pairs (sep_check, db::NoPropertyConstraint)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (21, 0)), r1.cop_to_region (sep_check2p, db::NoPropertyConstraint)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (22, 0)), r1.cop_to_edges (sep_check2e, db::NoPropertyConstraint)); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (30, 0)), r1.cop_to_edge_pairs (sep_check, db::SamePropertiesConstraint)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (31, 0)), r1.cop_to_region (sep_check2p, db::SamePropertiesConstraint)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (32, 0)), r1.cop_to_edges (sep_check2e, db::SamePropertiesConstraint)); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (40, 0)), r1.cop_to_edge_pairs (sep_check, db::DifferentPropertiesConstraint)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (41, 0)), r1.cop_to_region (sep_check2p, db::DifferentPropertiesConstraint)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (42, 0)), r1.cop_to_edges (sep_check2e, db::DifferentPropertiesConstraint)); + + CHECKPOINT(); + db::compare_layouts (_this, target, tl::testdata () + "/algo/flat_region_au43.gds"); +} + diff --git a/src/db/unit_tests/dbDeepRegionTests.cc b/src/db/unit_tests/dbDeepRegionTests.cc index 4923f8340..5b2abe509 100644 --- a/src/db/unit_tests/dbDeepRegionTests.cc +++ b/src/db/unit_tests/dbDeepRegionTests.cc @@ -33,6 +33,7 @@ #include "dbOriginalLayerRegion.h" #include "dbCellGraphUtils.h" #include "dbTestSupport.h" +#include "dbCompoundOperation.h" #include "tlUnitTest.h" #include "tlStream.h" @@ -2330,6 +2331,73 @@ TEST(42_DRCWithProperties) db::compare_layouts (_this, target, tl::testdata () + "/algo/deep_region_au42.gds"); } +TEST(43_ComplexOpsWithProperties) +{ + db::Layout ly; + { + std::string fn (tl::testdata ()); + fn += "/algo/deep_region_42.gds"; + tl::InputStream stream (fn); + db::Reader reader (stream); + reader.read (ly); + } + + db::cell_index_type top_cell_index = *ly.begin_top_down (); + db::Cell &top_cell = ly.cell (top_cell_index); + + db::DeepShapeStore dss; + + unsigned int l1 = ly.get_layer (db::LayerProperties (1, 0)); + unsigned int l2 = ly.get_layer (db::LayerProperties (2, 0)); + + db::RecursiveShapeIterator si1 (ly, top_cell, l1); + si1.shape_flags (db::ShapeIterator::All | db::ShapeIterator::RegardProperties); + db::Region r1 (si1, dss); + + db::RecursiveShapeIterator si2 (ly, top_cell, l2); + si2.shape_flags (db::ShapeIterator::All | db::ShapeIterator::RegardProperties); + db::Region r2 (si2, dss); + + db::Layout target; + unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index)); + + db::RegionCheckOptions opt; + opt.metrics = db::Projection; + + db::CompoundRegionOperationSecondaryNode *secondary = new db::CompoundRegionOperationSecondaryNode (&r2); + db::CompoundRegionCheckOperationNode sep_check (secondary, db::SpaceRelation, true /*==different polygons*/, 1000, opt); + + db::CompoundRegionOperationSecondaryNode *secondary2 = new db::CompoundRegionOperationSecondaryNode (&r2); + db::CompoundRegionCheckOperationNode *sep_check2 = new db::CompoundRegionCheckOperationNode (secondary2, db::SpaceRelation, true /*==different polygons*/, 1000, opt); + db::CompoundRegionEdgePairToPolygonProcessingOperationNode sep_check2p (new db::EdgePairToPolygonProcessor (0), sep_check2, true); + + db::CompoundRegionOperationSecondaryNode *secondary3 = new db::CompoundRegionOperationSecondaryNode (&r2); + db::CompoundRegionCheckOperationNode *sep_check3 = new db::CompoundRegionCheckOperationNode (secondary3, db::SpaceRelation, true /*==different polygons*/, 1000, opt); + db::CompoundRegionEdgePairToEdgeProcessingOperationNode sep_check2e (new db::EdgePairToEdgesProcessor (), sep_check3, true); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (1, 0)), r1); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (2, 0)), r2); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (10, 0)), r1.cop_to_edge_pairs (sep_check)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (11, 0)), r1.cop_to_region (sep_check2p)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (12, 0)), r1.cop_to_edges (sep_check2e)); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (20, 0)), r1.cop_to_edge_pairs (sep_check, db::NoPropertyConstraint)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (21, 0)), r1.cop_to_region (sep_check2p, db::NoPropertyConstraint)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (22, 0)), r1.cop_to_edges (sep_check2e, db::NoPropertyConstraint)); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (30, 0)), r1.cop_to_edge_pairs (sep_check, db::SamePropertiesConstraint)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (31, 0)), r1.cop_to_region (sep_check2p, db::SamePropertiesConstraint)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (32, 0)), r1.cop_to_edges (sep_check2e, db::SamePropertiesConstraint)); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (40, 0)), r1.cop_to_edge_pairs (sep_check, db::DifferentPropertiesConstraint)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (41, 0)), r1.cop_to_region (sep_check2p, db::DifferentPropertiesConstraint)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (42, 0)), r1.cop_to_edges (sep_check2e, db::DifferentPropertiesConstraint)); + + CHECKPOINT(); + db::compare_layouts (_this, target, tl::testdata () + "/algo/deep_region_au43.gds"); +} + TEST(100_Integration) { db::Layout ly; diff --git a/testdata/algo/deep_region_au43.gds b/testdata/algo/deep_region_au43.gds new file mode 100644 index 0000000000000000000000000000000000000000..c65a1ecc32d916380a8b1df624d8023621f098dd GIT binary patch literal 5872 zcmbtXzfTlV5T4t+TUI#WAP0zE5DUW(Nf2X#Cd33{p^-!j3d3JOX<@-1U}IuoX`+Rl z7M2ti*2coZf|A0*#KywH!oqmY?9R9McDbGR0Fupj?7nY)d^7LuEX5Q>kEmOVhJH|u zCTW}&Xu6Fj_SdaDA6DPI+TEdUvziyj@g`9tA&N&MwjGZ} zM6}Yb6OHT;C4Vy<-yoX$Mg+ut#>PYizxINtK2Ib#{G6}FKH@%Od^PpE65qI9uobzn z%(RGFT_VBGL!yfx`-uCDZY@@Row%K zTC;GqGFZq#V-94=>WXR_zL4L5Y8ou4DOl=lg9UBf9#9QC)fyUV7%W2#4-5OKl$XIW zs%)@I%I7BxPHn$3B|VQ>NU}3(%H3a3QxN+CD4FYXcYhT4TJd~8X=hvev%p8p+HdK3 zAiqod>sT(T#&mU`7!@~I&_mdzlha`7>QseNpBOCUuDPBfN2AjWzk!`LXKP!rFASCu zt-(5bv_746UtDtc#VPu_z=uykxsZj{8t;v&n)B3_&WR_RBMcVeQU9m#YgEthi@a5b zD!+@>`5HUYU=7;+TIVIV&af_sa}QWP|MbjRu8wt(S3e6e=qZw(wL@fnRU~n|^MJ?d z#xS4hlk$ZTU#OA1e4AUljPlo#sdM%-e;@qL=Boi~53;4Ymj7AbFU(^2UP)*C`LC=| zgGg{`kLb$xK2Dt{T6@iNl_J(L<~7HxtaT`SKg_c4>31A2<0|9aQ6IZciI%UiAc|PW z=(C;9^rFGUpG*tkiY*}SGv>BRZ(L)h7bPSrRm7dl43^|3`Ux^SkTvr-Q$%p(XDCbb zg$2Nn%5dk)a!F!rjK-vIV|IMTio0g#Q6i8H*s$PJ*FX6NR@j)i0<$nI1S)A*khhDxP2{v@%&UpcP#p{lIOoNZ z@vbP$ZD;J$f-PjA{tNFN$xNSDWoArOf%P#g1lGr};8R!YV_1Mbo(daNUSOvi7JR!+ b&!57~c*gU`m>+%7sHTPmpCUY0HX8IF`gf^? literal 0 HcmV?d00001 diff --git a/testdata/algo/flat_region_au43.gds b/testdata/algo/flat_region_au43.gds new file mode 100644 index 0000000000000000000000000000000000000000..33db39033ff784f7cc35f8cd2f58b7b6af080880 GIT binary patch literal 8814 zcmbtZv2Gnz5FJ0;&o7A+JMf%nTeU*+Fmug^pn~4T8WqMnLYQr8FA+cv+JLm5&4|s^lA}je|r6< zt({$ty^q)@KQ%l3Mv3Qt_IZ9ZBXZoam%n<+Z10vC@P!XO*4GQh-_ZP@<$G%vTdd{Ep-_sWZA zL_X(O#ct)i5qssIGT*?h`)2DOED-aZc(0rni1Uf(tJtj^G-97RG`skP8St6Cl1qGk z+t2r&8IjL9F2z1k>X5OgPeYBfEmzFypY|-2v-y$B{M&M+M5y3#KLN)P5vQ+~c?G`o zO{qhoYkVod{Sb2=th*mA}s3pI;u0O^~#6>?v$ zw&Yy!1!~jTNfy*dr(K_CS?4#srslpkM`tJJf&;@nf$qFX7IXo>20A;*qU-PcR=9qW zRXlwhcgAscF5Jj)f1uyQ$+>Wc_|wH*;_QMoD?RK~)K^uj&`{JypI)qe2wm0H*u|%k3Ox4S3W_2gRsBWp`Qe(A5~w1CF)DCTA8o9Eq3(b1|mYM z)<#4amnBiHVzsSv9I@I~4UUK)JWZ@zRF+@~wF{PT48dyEh9Xhh+eC)7S<(|$La>+ohSZZcwyK4 ztkAgQ`g)zzUXp!RDpuU@Lp@X#tEISe+VA;gi(Pc+RIr5K3s$l|M1-OG7+!hOC&U`4 zsnA&cUKOmQyNC$XW^@77S+kyo_byyq%$vMpMFipKf|b1ML}eFa|#p(i58 z9jm?2hr9MdC5`MW8tWR{3v{iECmZL|_&$#lkN;PDY@N9Ou2K9h*YO=(IE-Kk4-_on zOM;bj7!e^^-6BG=xc*Bn_*FAs4`(K04ywVZiLO2~@&--74KlYt1YUE14 nPQ)n)mN;?2Visc8bxjJ^(0L8-k=c&yC+8hf+J^r=y=MOd))jse literal 0 HcmV?d00001