diff --git a/src/db/db/dbCompoundOperation.cc b/src/db/db/dbCompoundOperation.cc index 65f3778cf..f05a8d4b3 100644 --- a/src/db/db/dbCompoundOperation.cc +++ b/src/db/db/dbCompoundOperation.cc @@ -117,38 +117,6 @@ CompoundRegionOperationNode::compute_local (db::Layout *layout, const shape_inte translate (layout, intermediate, results); } -void -CompoundRegionOperationNode::compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const -{ - std::vector > intermediate; - implement_compute_local (layout, interactions, intermediate, max_vertex_count, area_ratio); - translate (layout, intermediate, results); -} - -void -CompoundRegionOperationNode::compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const -{ - std::vector > intermediate; - implement_compute_local (layout, interactions, intermediate, max_vertex_count, area_ratio); - translate (layout, intermediate, results); -} - -void -CompoundRegionOperationNode::compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const -{ - std::vector > intermediate; - implement_compute_local (layout, interactions, intermediate, max_vertex_count, area_ratio); - translate (layout, intermediate, results); -} - -void -CompoundRegionOperationNode::compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const -{ - std::vector > intermediate; - implement_compute_local (layout, interactions, intermediate, max_vertex_count, area_ratio); - translate (layout, intermediate, results); -} - // --------------------------------------------------------------------------------------------- CompoundRegionOperationPrimaryNode::CompoundRegionOperationPrimaryNode () @@ -785,6 +753,11 @@ namespace result.insert (shape.edge ()); } + static void insert (db::Layout *, const db::Shape &shape, std::unordered_set &result) + { + result.insert (shape.edge_pair ()); + } + static void insert (db::Layout *, const db::Shape &shape, std::unordered_set &result) { db::Polygon p; @@ -875,8 +848,12 @@ void compound_region_generic_operation_node::implement_compute_local // explicit instantiations template void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; template void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; // --------------------------------------------------------------------------------------------- diff --git a/src/db/db/dbCompoundOperation.h b/src/db/db/dbCompoundOperation.h index 6048cdeb8..a8d7e163e 100644 --- a/src/db/db/dbCompoundOperation.h +++ b/src/db/db/dbCompoundOperation.h @@ -124,54 +124,6 @@ public: implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); } - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const - { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); - } - - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const - { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); - } - - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const - { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); - } - - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const - { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); - } - - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const - { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); - } - - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const - { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); - } - - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const - { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); - } - - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const - { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); - } - template bool compute_local_bool (db::Layout *layout, const shape_interactions &interactions, size_t max_vertex_count, double area_ratio) const { @@ -218,14 +170,6 @@ protected: virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } virtual std::string generated_description () const; @@ -622,12 +566,12 @@ public: return std::string ("interact") + compound_region_generic_operation_node::description (); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); } @@ -686,12 +630,12 @@ public: return std::string ("pull") + compound_region_generic_operation_node::description (); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); } diff --git a/src/db/db/dbRegionLocalOperations.cc b/src/db/db/dbRegionLocalOperations.cc index 47f46425b..1b189a6ae 100644 --- a/src/db/db/dbRegionLocalOperations.cc +++ b/src/db/db/dbRegionLocalOperations.cc @@ -407,8 +407,8 @@ check_local_operation::description () const } // explicit instantiations -template class check_local_operation; -template class check_local_operation; +template class DB_PUBLIC check_local_operation; +template class DB_PUBLIC check_local_operation; // --------------------------------------------------------------------------------------------------------------- @@ -535,9 +535,9 @@ std::string interacting_local_operation::description () const } // explicit instantiations -template class interacting_local_operation; -template class interacting_local_operation; -template class interacting_local_operation; +template class DB_PUBLIC interacting_local_operation; +template class DB_PUBLIC interacting_local_operation; +template class DB_PUBLIC interacting_local_operation; // --------------------------------------------------------------------------------------------------------------- @@ -614,8 +614,8 @@ std::string pull_local_operation::description () const return tl::to_string (tr ("Pull regions by their geometrical relation to first")); } -template class pull_local_operation; -template class pull_local_operation; +template class DB_PUBLIC pull_local_operation; +template class DB_PUBLIC pull_local_operation; // --------------------------------------------------------------------------------------------------------------- @@ -700,8 +700,8 @@ std::string interacting_with_edge_local_operation::description () co return tl::to_string (tr ("Select regions by their geometric relation to edges")); } -template class interacting_with_edge_local_operation; -template class interacting_with_edge_local_operation; +template class DB_PUBLIC interacting_with_edge_local_operation; +template class DB_PUBLIC interacting_with_edge_local_operation; // --------------------------------------------------------------------------------------------------------------- @@ -761,8 +761,8 @@ std::string pull_with_edge_local_operation::description () const return tl::to_string (tr ("Pull edges from second by their geometric relation to first")); } -template class pull_with_edge_local_operation; -template class pull_with_edge_local_operation; +template class DB_PUBLIC pull_with_edge_local_operation; +template class DB_PUBLIC pull_with_edge_local_operation; // --------------------------------------------------------------------------------------------------------------- @@ -828,8 +828,8 @@ std::string pull_with_text_local_operation::description () const return tl::to_string (tr ("Pull texts from second by their geometric relation to first")); } -template class pull_with_text_local_operation; -template class pull_with_text_local_operation; +template class DB_PUBLIC pull_with_text_local_operation; +template class DB_PUBLIC pull_with_text_local_operation; // --------------------------------------------------------------------------------------------------------------- @@ -914,7 +914,7 @@ std::string interacting_with_text_local_operation::description () co } // explicit instantiations -template class interacting_with_text_local_operation; -template class interacting_with_text_local_operation; +template class DB_PUBLIC interacting_with_text_local_operation; +template class DB_PUBLIC interacting_with_text_local_operation; } diff --git a/src/db/unit_tests/dbCompoundOperationTests.cc b/src/db/unit_tests/dbCompoundOperationTests.cc index 41363e795..d5c1e6c91 100644 --- a/src/db/unit_tests/dbCompoundOperationTests.cc +++ b/src/db/unit_tests/dbCompoundOperationTests.cc @@ -233,3 +233,72 @@ TEST(5_InteractOperation) db::compare_layouts (_this, ly, tl::testsrc () + "/testdata/drc/compound_au5.gds"); } +TEST(6_InteractWithEdgeOperation) +{ + db::Layout ly; + { + std::string fn (tl::testsrc ()); + fn += "/testdata/drc/compound_6.gds"; + tl::InputStream stream (fn); + db::Reader reader (stream); + reader.read (ly); + } + + db::RegionCheckOptions check_options; + check_options.metrics = db::Projection; + + unsigned int l1 = ly.get_layer (db::LayerProperties (1, 0)); + db::Region r (db::RecursiveShapeIterator (ly, ly.cell (*ly.begin_top_down ()), l1)); + + unsigned int l2 = ly.get_layer (db::LayerProperties (2, 0)); + db::Region r2 (db::RecursiveShapeIterator (ly, ly.cell (*ly.begin_top_down ()), l2)); + + db::CompoundRegionOperationPrimaryNode *primary = new db::CompoundRegionOperationPrimaryNode (); + db::CompoundRegionOperationSecondaryNode *secondary = new db::CompoundRegionOperationSecondaryNode (&r2); + db::CompoundRegionToEdgeProcessingOperationNode *secondary_edges = new db::CompoundRegionToEdgeProcessingOperationNode (new db::PolygonToEdgeProcessor (), secondary, true); + + db::CompoundRegionInteractWithEdgeOperationNode interact (primary, secondary_edges, 0, true, false); + + db::Region res = r.cop_to_region (interact); + + unsigned int l1000 = ly.get_layer (db::LayerProperties (1000, 0)); + res.insert_into (&ly, *ly.begin_top_down (), l1000); + + CHECKPOINT(); + db::compare_layouts (_this, ly, tl::testsrc () + "/testdata/drc/compound_au6.gds"); +} + +TEST(7_PullOperation) +{ + db::Layout ly; + { + std::string fn (tl::testsrc ()); + fn += "/testdata/drc/compound_7.gds"; + tl::InputStream stream (fn); + db::Reader reader (stream); + reader.read (ly); + } + + db::RegionCheckOptions check_options; + check_options.metrics = db::Projection; + + unsigned int l1 = ly.get_layer (db::LayerProperties (1, 0)); + db::Region r (db::RecursiveShapeIterator (ly, ly.cell (*ly.begin_top_down ()), l1)); + + unsigned int l2 = ly.get_layer (db::LayerProperties (2, 0)); + db::Region r2 (db::RecursiveShapeIterator (ly, ly.cell (*ly.begin_top_down ()), l2)); + + db::CompoundRegionOperationPrimaryNode *primary = new db::CompoundRegionOperationPrimaryNode (); + db::CompoundRegionOperationSecondaryNode *secondary = new db::CompoundRegionOperationSecondaryNode (&r2); + + db::CompoundRegionPullOperationNode pull (primary, secondary, 0, true); + + db::Region res = r.cop_to_region (pull); + + unsigned int l1000 = ly.get_layer (db::LayerProperties (1000, 0)); + res.insert_into (&ly, *ly.begin_top_down (), l1000); + + CHECKPOINT(); + db::compare_layouts (_this, ly, tl::testsrc () + "/testdata/drc/compound_au7.gds"); +} + diff --git a/testdata/drc/compound_6.gds b/testdata/drc/compound_6.gds new file mode 100644 index 000000000..001eefe47 Binary files /dev/null and b/testdata/drc/compound_6.gds differ diff --git a/testdata/drc/compound_7.gds b/testdata/drc/compound_7.gds new file mode 100644 index 000000000..001eefe47 Binary files /dev/null and b/testdata/drc/compound_7.gds differ diff --git a/testdata/drc/compound_au6.gds b/testdata/drc/compound_au6.gds new file mode 100644 index 000000000..d8feb077b Binary files /dev/null and b/testdata/drc/compound_au6.gds differ diff --git a/testdata/drc/compound_au7.gds b/testdata/drc/compound_au7.gds new file mode 100644 index 000000000..310c7af60 Binary files /dev/null and b/testdata/drc/compound_au7.gds differ