From ae783a224563389d2a5bec0a64224f73c36aa82d Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 17 Feb 2019 16:18:24 +0100 Subject: [PATCH] Hiearchical implementation of edge filter. --- src/db/db/dbDeepEdges.cc | 44 +++++++++++++++++++-- src/db/unit_tests/dbDeepEdgesTests.cc | 54 ++++++++++++++++++++++++++ testdata/algo/deep_edges_au5a.gds | Bin 0 -> 2868 bytes testdata/algo/deep_edges_au5b.gds | Bin 0 -> 2982 bytes 4 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 testdata/algo/deep_edges_au5a.gds create mode 100644 testdata/algo/deep_edges_au5b.gds diff --git a/src/db/db/dbDeepEdges.cc b/src/db/db/dbDeepEdges.cc index c0fc78fc4..55aee834b 100644 --- a/src/db/db/dbDeepEdges.cc +++ b/src/db/db/dbDeepEdges.cc @@ -476,14 +476,50 @@ std::string DeepEdges::to_string (size_t nmax) const EdgesDelegate *DeepEdges::filter_in_place (const EdgeFilterBase &filter) { - // TODO: implement - return AsIfFlatEdges::filter_in_place (filter); + // TODO: implement to be really in-place + return filtered (filter); } EdgesDelegate *DeepEdges::filtered (const EdgeFilterBase &filter) const { - // TODO: implement - return AsIfFlatEdges::filtered (filter); + ensure_merged_edges_valid (); + + std::auto_ptr vars; + + if (filter.isotropic ()) { + vars.reset (new db::cell_variants_collector ()); + } else { + vars.reset (new db::cell_variants_collector ()); + } + + vars->collect (m_merged_edges.layout (), m_merged_edges.initial_cell ()); + + // NOTE: m_merged_polygons is mutable, so why is the const_cast needed? + const_cast (m_merged_edges).separate_variants (*vars); + + db::Layout &layout = m_merged_edges.layout (); + + std::auto_ptr res (new db::DeepEdges (m_merged_edges.derived ())); + for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) { + + const std::map &v = vars->variants (c->cell_index ()); + tl_assert (v.size () == size_t (1)); + const db::ICplxTrans &tr = v.begin ()->first; + + const db::Shapes &s = c->shapes (m_merged_edges.layer ()); + db::Shapes &st = c->shapes (res->deep_layer ().layer ()); + + for (db::Shapes::shape_iterator si = s.begin (db::ShapeIterator::Edges); ! si.at_end (); ++si) { + db::Edge edge = si->edge (); + if (filter.selected (edge.transformed (tr))) { + st.insert (edge); + } + } + + } + + res->set_is_merged (true); + return res.release (); } EdgesDelegate *DeepEdges::merged_in_place () diff --git a/src/db/unit_tests/dbDeepEdgesTests.cc b/src/db/unit_tests/dbDeepEdgesTests.cc index f1ea9b6bd..2c14840b6 100644 --- a/src/db/unit_tests/dbDeepEdgesTests.cc +++ b/src/db/unit_tests/dbDeepEdgesTests.cc @@ -193,3 +193,57 @@ TEST(4_Edge2PolygonBooleans) db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/deep_edges_au4.gds"); } +TEST(5_Filters) +{ + db::Layout ly; + { + std::string fn (tl::testsrc ()); + fn += "/testdata/algo/deep_region_area_peri_l1.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 l2 = ly.get_layer (db::LayerProperties (2, 0)); + + db::Region r2 (db::RecursiveShapeIterator (ly, top_cell, l2), dss); + db::Edges e2 = r2.edges (); + + { + db::Layout target; + unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index)); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (2, 0)), r2); + + db::EdgeLengthFilter elf1 (0, 40000, false); + db::EdgeLengthFilter elf2 (0, 30000, true); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (10, 0)), e2.filtered (elf1)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (11, 0)), e2.filtered (elf2)); + + CHECKPOINT(); + db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/deep_edges_au5a.gds"); + } + + { + db::Layout target; + unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index)); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (2, 0)), r2); + + db::EdgeOrientationFilter eof1 (0, 1, false); + db::EdgeOrientationFilter eof2 (0, 1, true); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (10, 0)), e2.filtered (eof1)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (11, 0)), e2.filtered (eof2)); + + CHECKPOINT(); + db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/deep_edges_au5b.gds"); + } +} + diff --git a/testdata/algo/deep_edges_au5a.gds b/testdata/algo/deep_edges_au5a.gds new file mode 100644 index 0000000000000000000000000000000000000000..28805aa0d60e8143818c633ae2d67ef60127afdc GIT binary patch literal 2868 zcmcgtJ#Q016r5Z8E*HlH2WY^SVk8O*6qJUK2H7SJ9|{N}zyrh;%Z(aNe1U0^zW^sz6d186dFjD73lL> zzNg1)bf@>W2-kiBm)>hVZZe|20zXSuTioo1v4G94)}LQ;O@qZ+OD=`NDk-dF<;tig z*PT*W$ucW5#zf%)oNg!NHhGp>r&YF(3$0qoCDCGV*7Gty_sR4q+ecB|l#d>jDQ99m zptsXiLlbe7Idb;ak@Sg!livF0(1SLr&Q7Gt33o( zd-=Y|19`IA(|T{;K3OvE(3A9}qO&$ehdpTz_4r*6(fyG@{;n4@M(!t9iC$0@s$_KL zPcrA)aldPKRdQWDrv0COTI5l$=JR&s9aOLO$-YtQrQ9u=-FaF{oeb4eK5w-Ck!toKi1NbEold18jt`Qqew-H4)ZX3h)}yI8C8f7Y1|Crk2Z zFsPQz2AvVo?LbzR3DdWkY*Z?AcGQ8<&RYL+BPG7{#z OB+0NPQS|Rnuj4O4_?Hy` literal 0 HcmV?d00001 diff --git a/testdata/algo/deep_edges_au5b.gds b/testdata/algo/deep_edges_au5b.gds new file mode 100644 index 0000000000000000000000000000000000000000..538b90698c34e80e0f567b9acc238fc930d8d147 GIT binary patch literal 2982 zcmdT_zi-n(7=6CjS2s1_78XdP2B`xB0(F4Gf|9_(4;2Iz3Y{{tFfjHXK(JMv5G-sk zc3^;k5oQ>WIwDv)c48yPcX$45H_qAD36UuIocNyKckjK=hJ+9!bOSN>3j&Ks>3yku zj9AD!H;2HfR&;IfV(s>qw+B~me7N}L_2ve;ksFstIb3--xWBrxif|r~#{}At#|7y4 ztp1KqwCJ0zoKn5;L#aN~uYrSKGSY^Fsl&GW!_LGS@;~hXvPEhfY-9 z8FPAat@l`sqQg1V>fL6&5yn<+k?rMt+NvnU{g}!M@~*1*!~PWdX&sN;Y090NczF2C zso-7s`CO}gO%iAAD9f+Y=fnE2j!h`uPu{6_I;#0?NQad2Iw{=-+DqA7LY@g|`jT!m zd{0%s5Zq>T^GGPP;QZxsNlMa+~&&vn`+c+$Wtuk#@%~1*>Xt|qsee*1T6RS442L<_mz6KZ_g~y zebQj!lY*Xp5xP46ospWn>mzuuXR7|K<}(D%10g8EnkCpF7Gg4e+A}m`*^G3eLC@~W zOxPwL6R!2qo?%>NBB!wB=@d^%yVK8e&NQD+{it=ZJFif^(<}8oR_gO(U4dIyfJb{= z`F~w)2TgNSxr*mRXioAEfA$L>o4E99r4GirV^h7kj=nFOlHX$lug<9nRX;AXdW$;L z8KdflA|*^_gWzkC-9|Oc>JfRU(NxP^&gWRgeJ@lwBNe}#T)DgKn>SbC@>C9MxH83! e@>71fQS2`J=GkGUIQ!;@Vt3g$gQB}%7~(JHoUbPU literal 0 HcmV?d00001