From 0e596e67ce347d976b78e26fc3d078bf0b3f1533 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Tue, 17 Nov 2020 23:19:45 +0100 Subject: [PATCH] WIP: compound operations. --- src/db/db/dbCompoundOperation.cc | 50 ++++++- src/db/db/dbCompoundOperation.h | 21 ++- src/db/db/gsiDeclDbCompoundOperation.cc | 184 +++++++++++++++++++++++- 3 files changed, 237 insertions(+), 18 deletions(-) diff --git a/src/db/db/dbCompoundOperation.cc b/src/db/db/dbCompoundOperation.cc index 17235b0e1..72797ddc7 100644 --- a/src/db/db/dbCompoundOperation.cc +++ b/src/db/db/dbCompoundOperation.cc @@ -30,7 +30,6 @@ TODO: * Transform variants? * "result is merged"? * "requires raw input"? -* Make nodes shared pointers/GSI objects for better compatibility with GSI, at least "keep" them. * edge pair to edge generation nodes (first, second) @@ -281,6 +280,7 @@ CompoundTransformationReducer::is_translation_invariant () const CompoundRegionMultiInputOperationNode::CompoundRegionMultiInputOperationNode (const std::vector &children) { for (std::vector::const_iterator c = children.begin (); c != children.end (); ++c) { + (*c)->keep (); m_children.push_back (*c); } init (); @@ -943,12 +943,20 @@ CompoundRegionFilterOperationNode::is_selected (const db::PolygonRef &p) const // --------------------------------------------------------------------------------------------- -CompoundRegionProcessingOperationNode::CompoundRegionProcessingOperationNode (PolygonProcessorBase *proc, CompoundRegionOperationNode *input) - : CompoundRegionMultiInputOperationNode (input), mp_proc (proc) +CompoundRegionProcessingOperationNode::CompoundRegionProcessingOperationNode (PolygonProcessorBase *proc, CompoundRegionOperationNode *input, bool owns_proc) + : CompoundRegionMultiInputOperationNode (input), mp_proc (proc), m_owns_proc (owns_proc) { set_description ("processor"); } +CompoundRegionProcessingOperationNode::~CompoundRegionProcessingOperationNode () +{ + if (m_owns_proc) { + delete mp_proc; + mp_proc = 0; + } +} + void CompoundRegionProcessingOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { @@ -979,12 +987,20 @@ CompoundRegionProcessingOperationNode::processed (db::Layout *layout, const db:: // --------------------------------------------------------------------------------------------- -CompoundRegionToEdgeProcessingOperationNode::CompoundRegionToEdgeProcessingOperationNode (PolygonToEdgeProcessorBase *proc, CompoundRegionOperationNode *input) - : CompoundRegionMultiInputOperationNode (input), mp_proc (proc) +CompoundRegionToEdgeProcessingOperationNode::CompoundRegionToEdgeProcessingOperationNode (PolygonToEdgeProcessorBase *proc, CompoundRegionOperationNode *input, bool owns_proc) + : CompoundRegionMultiInputOperationNode (input), mp_proc (proc), m_owns_proc (owns_proc) { set_description ("processor"); } +CompoundRegionToEdgeProcessingOperationNode::~CompoundRegionToEdgeProcessingOperationNode () +{ + if (m_owns_proc) { + delete mp_proc; + mp_proc = 0; + } +} + void CompoundRegionToEdgeProcessingOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { @@ -1011,12 +1027,20 @@ CompoundRegionToEdgeProcessingOperationNode::processed (db::Layout *, const db:: // --------------------------------------------------------------------------------------------- -CompoundRegionToEdgePairProcessingOperationNode::CompoundRegionToEdgePairProcessingOperationNode (PolygonToEdgePairProcessorBase *proc, CompoundRegionOperationNode *input) - : CompoundRegionMultiInputOperationNode (input), mp_proc (proc) +CompoundRegionToEdgePairProcessingOperationNode::CompoundRegionToEdgePairProcessingOperationNode (PolygonToEdgePairProcessorBase *proc, CompoundRegionOperationNode *input, bool owns_proc) + : CompoundRegionMultiInputOperationNode (input), mp_proc (proc), m_owns_proc (owns_proc) { set_description ("processor"); } +CompoundRegionToEdgePairProcessingOperationNode::~CompoundRegionToEdgePairProcessingOperationNode () +{ + if (m_owns_proc) { + delete mp_proc; + mp_proc = 0; + } +} + void CompoundRegionToEdgePairProcessingOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { @@ -1055,6 +1079,18 @@ CompoundRegionCheckOperationNode::CompoundRegionCheckOperationNode (CompoundRegi m_check.set_max_projection (max_projection); } +CompoundRegionCheckOperationNode::CompoundRegionCheckOperationNode (db::edge_relation_type rel, bool different_polygons, db::Coord d, bool whole_edges, db::metrics_type metrics, double ignore_angle, db::coord_traits::distance_type min_projection, db::coord_traits::distance_type max_projection, bool shielded) + : CompoundRegionMultiInputOperationNode (), m_check (rel, d, metrics), m_different_polygons (different_polygons), m_shielded (shielded) +{ + set_description ("check"); + + m_check.set_include_zero (false); + m_check.set_whole_edges (whole_edges); + m_check.set_ignore_angle (ignore_angle); + m_check.set_min_projection (min_projection); + m_check.set_max_projection (max_projection); +} + void CompoundRegionCheckOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { diff --git a/src/db/db/dbCompoundOperation.h b/src/db/db/dbCompoundOperation.h index ce02ef6f1..d61c5550a 100644 --- a/src/db/db/dbCompoundOperation.h +++ b/src/db/db/dbCompoundOperation.h @@ -768,7 +768,8 @@ class DB_PUBLIC CompoundRegionProcessingOperationNode : public CompoundRegionMultiInputOperationNode { public: - CompoundRegionProcessingOperationNode (PolygonProcessorBase *proc, CompoundRegionOperationNode *input); + CompoundRegionProcessingOperationNode (PolygonProcessorBase *proc, CompoundRegionOperationNode *input, bool owns_proc = false); + ~CompoundRegionProcessingOperationNode (); // specifies the result type virtual ResultType result_type () const { return Region; } @@ -781,6 +782,7 @@ public: private: PolygonProcessorBase *mp_proc; + bool m_owns_proc; void processed (db::Layout *, const db::Polygon &p, std::vector &res) const; void processed (db::Layout *layout, const db::PolygonRef &p, std::vector &res) const; @@ -827,7 +829,8 @@ class DB_PUBLIC CompoundRegionToEdgeProcessingOperationNode : public CompoundRegionMultiInputOperationNode { public: - CompoundRegionToEdgeProcessingOperationNode (PolygonToEdgeProcessorBase *proc, CompoundRegionOperationNode *input); + CompoundRegionToEdgeProcessingOperationNode (PolygonToEdgeProcessorBase *proc, CompoundRegionOperationNode *input, bool owns_proc = false); + ~CompoundRegionToEdgeProcessingOperationNode (); // specifies the result type virtual ResultType result_type () const { return Edges; } @@ -840,6 +843,7 @@ public: private: PolygonToEdgeProcessorBase *mp_proc; + bool m_owns_proc; void processed (db::Layout *, const db::Polygon &p, std::vector &res) const; void processed (db::Layout *layout, const db::PolygonRef &p, std::vector &res) const; @@ -871,10 +875,11 @@ class DB_PUBLIC CompoundRegionToEdgePairProcessingOperationNode public: /** * @brief Constructor - * @param proc The processor which turns polygons into edge pairs (it's reimplementation) - the node will *not* take ownership + * @param proc The processor which turns polygons into edge pairs (it's reimplementation) - the node will *not* take ownership unless owns_proc is true * @param input The node for the original (the node will take ownership) */ - CompoundRegionToEdgePairProcessingOperationNode (PolygonToEdgePairProcessorBase *proc, CompoundRegionOperationNode *input); + CompoundRegionToEdgePairProcessingOperationNode (PolygonToEdgePairProcessorBase *proc, CompoundRegionOperationNode *input, bool owns_proc = false); + ~CompoundRegionToEdgePairProcessingOperationNode (); // specifies the result type virtual ResultType result_type () const { return EdgePairs; } @@ -886,7 +891,8 @@ public: virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; private: - tl::weak_ptr mp_proc; + PolygonToEdgePairProcessorBase *mp_proc; + bool m_owns_proc; void processed (db::Layout *, const db::Polygon &p, std::vector &res) const; void processed (db::Layout *layout, const db::PolygonRef &p, std::vector &res) const; @@ -922,6 +928,11 @@ public: */ CompoundRegionCheckOperationNode (db::CompoundRegionOperationNode *input, db::edge_relation_type rel, bool different_polygons, db::Coord d, bool whole_edges, db::metrics_type metrics, double ignore_angle, db::coord_traits::distance_type min_projection, db::coord_traits::distance_type max_projection, bool shielded); + /** + * @brief Constructor for the single-layer check + */ + CompoundRegionCheckOperationNode (db::edge_relation_type rel, bool different_polygons, db::Coord d, bool whole_edges, db::metrics_type metrics, double ignore_angle, db::coord_traits::distance_type min_projection, db::coord_traits::distance_type max_projection, bool shielded); + // specifies the result type virtual ResultType result_type () const { return EdgePairs; } diff --git a/src/db/db/gsiDeclDbCompoundOperation.cc b/src/db/db/gsiDeclDbCompoundOperation.cc index 086f8d8d3..be6f52e86 100644 --- a/src/db/db/gsiDeclDbCompoundOperation.cc +++ b/src/db/db/gsiDeclDbCompoundOperation.cc @@ -111,13 +111,95 @@ static db::CompoundRegionOperationNode *new_case (const std::vector (e), input, true /*processor is owned*/); +} + +static db::CompoundRegionOperationNode *new_minkowsky_sum_node2 (db::CompoundRegionOperationNode *input, const db::Polygon &p) +{ + return new db::CompoundRegionProcessingOperationNode (new db::minkowsky_sum_computation (p), input, true /*processor is owned*/); +} + +static db::CompoundRegionOperationNode *new_minkowsky_sum_node3 (db::CompoundRegionOperationNode *input, const db::Box &p) +{ + return new db::CompoundRegionProcessingOperationNode (new db::minkowsky_sum_computation (p), input, true /*processor is owned*/); +} + +static db::CompoundRegionOperationNode *new_minkowsky_sum_node4 (db::CompoundRegionOperationNode *input, const std::vector &p) +{ + return new db::CompoundRegionProcessingOperationNode (new db::minkowsky_sum_computation > (p), input, true /*processor is owned*/); +} + +static db::CompoundRegionOperationNode *new_width_check_node (db::Coord d, bool whole_edges, db::metrics_type metrics, double ignore_angle, db::coord_traits::distance_type min_projection, db::coord_traits::distance_type max_projection, bool shielded) +{ + return new db::CompoundRegionCheckOperationNode (db::WidthRelation, false, d, whole_edges, metrics, ignore_angle, min_projection, max_projection, shielded); +} + +static db::CompoundRegionOperationNode *new_space_check_node (db::Coord d, bool whole_edges, db::metrics_type metrics, double ignore_angle, db::coord_traits::distance_type min_projection, db::coord_traits::distance_type max_projection, bool shielded) +{ + return new db::CompoundRegionCheckOperationNode (db::SpaceRelation, true, d, whole_edges, metrics, ignore_angle, min_projection, max_projection, shielded); +} + +static db::CompoundRegionOperationNode *new_notch_check_node (db::Coord d, bool whole_edges, db::metrics_type metrics, double ignore_angle, db::coord_traits::distance_type min_projection, db::coord_traits::distance_type max_projection, bool shielded) +{ + return new db::CompoundRegionCheckOperationNode (db::SpaceRelation, false, d, whole_edges, metrics, ignore_angle, min_projection, max_projection, shielded); +} + +static db::CompoundRegionOperationNode *new_separation_check_node (db::CompoundRegionOperationNode *input, db::Coord d, bool whole_edges, db::metrics_type metrics, double ignore_angle, db::coord_traits::distance_type min_projection, db::coord_traits::distance_type max_projection, bool shielded) +{ + return new db::CompoundRegionCheckOperationNode (input, db::SpaceRelation, true, d, whole_edges, metrics, ignore_angle, min_projection, max_projection, shielded); +} + +static db::CompoundRegionOperationNode *new_overlap_check_node (db::CompoundRegionOperationNode *input, db::Coord d, bool whole_edges, db::metrics_type metrics, double ignore_angle, db::coord_traits::distance_type min_projection, db::coord_traits::distance_type max_projection, bool shielded) +{ + return new db::CompoundRegionCheckOperationNode (input, db::OverlapRelation, true, d, whole_edges, metrics, ignore_angle, min_projection, max_projection, shielded); +} + +static db::CompoundRegionOperationNode *new_inside_check_node (db::CompoundRegionOperationNode *input, db::Coord d, bool whole_edges, db::metrics_type metrics, double ignore_angle, db::coord_traits::distance_type min_projection, db::coord_traits::distance_type max_projection, bool shielded) +{ + return new db::CompoundRegionCheckOperationNode (input, db::InsideRelation, true, d, whole_edges, metrics, ignore_angle, min_projection, max_projection, shielded); +} Class decl_CompoundRegionOperationNode ("db", "CompoundRegionOperationNode", gsi::constructor ("new_primary", &new_primary, @@ -161,6 +243,96 @@ Class decl_CompoundRegionOperationNode ("db", " "\n" "@@@ TODO.\n" ) + + gsi::constructor ("new_corners_as_rectangles", &new_corners_as_rectangles_node, gsi::arg ("input"), gsi::arg ("angle_start"), gsi::arg ("angle_end"), gsi::arg ("dim"), + "@brief Creates a node turning corners into rectangles.\n" + "\n" + "@@@ TODO.\n" + ) + + gsi::constructor ("new_corners_as_dots", &new_corners_as_dots_node, gsi::arg ("input"), gsi::arg ("angle_start"), gsi::arg ("angle_end"), + "@brief Creates a node turning corners into dots (single-point edges).\n" + "\n" + "@@@ TODO.\n" + ) + + gsi::constructor ("new_relative_extents", &new_relative_extents_node, gsi::arg ("input"), gsi::arg ("fx1"), gsi::arg ("fy1"), gsi::arg ("fx2"), gsi::arg ("fy2"), gsi::arg ("dx"), gsi::arg ("dy"), + "@brief Creates a node returning markers at specified locations of the extend (e.g. at the center).\n" + "\n" + "@@@ TODO.\n" + ) + + gsi::constructor ("new_relative_extents_as_edges", &new_relative_extents_as_edges_node, gsi::arg ("input"), gsi::arg ("fx1"), gsi::arg ("fy1"), gsi::arg ("fx2"), gsi::arg ("fy2"), + "@brief Creates a node returning edges at specified locations of the extend (e.g. at the center).\n" + "\n" + "@@@ TODO.\n" + ) + + gsi::constructor ("new_convex_decomposition", &new_convex_decomposition_node, gsi::arg ("input"), gsi::arg ("mode"), + "@brief Creates a node providing a composition into convex pieces.\n" + "\n" + "@@@ TODO.\n" + ) + + gsi::constructor ("new_trapezoid_decomposition", &new_trapezoid_decomposition_node, gsi::arg ("input"), gsi::arg ("mode"), + "@brief Creates a node providing a composition into trapezoids.\n" + "\n" + "@@@ TODO.\n" + ) + + gsi::constructor ("new_polygon_breaker_node", &new_polygon_breaker_node, gsi::arg ("input"), gsi::arg ("max_vertex_count"), gsi::arg ("max_area_ratio"), + "@brief Creates a node providing a composition into parts with less than the given number of points and a smaller area ratio.\n" + "\n" + "@@@ TODO.\n" + ) + + gsi::constructor ("new_size_node", &new_size_node, gsi::arg ("input"), gsi::arg ("dx"), gsi::arg ("dy"), gsi::arg ("mode"), + "@brief Creates a node providing sizing.\n" + "\n" + "@@@ TODO.\n" + ) + + gsi::constructor ("new_minkowsky_sum", &new_minkowsky_sum_node1, gsi::arg ("input"), gsi::arg ("e"), + "@brief Creates a node providing a Minkowsky sum with an edge.\n" + "\n" + "@@@ TODO.\n" + ) + + gsi::constructor ("new_minkowsky_sum", &new_minkowsky_sum_node2, gsi::arg ("input"), gsi::arg ("p"), + "@brief Creates a node providing a Minkowsky sum with a polygon.\n" + "\n" + "@@@ TODO.\n" + ) + + gsi::constructor ("new_minkowsky_sum", &new_minkowsky_sum_node3, gsi::arg ("input"), gsi::arg ("p"), + "@brief Creates a node providing a Minkowsky sum with a box.\n" + "\n" + "@@@ TODO.\n" + ) + + gsi::constructor ("new_minkowsky_sum", &new_minkowsky_sum_node4, gsi::arg ("input"), gsi::arg ("p"), + "@brief Creates a node providing a Minkowsky sum with a point sequence forming a contour.\n" + "\n" + "@@@ TODO.\n" + ) + + gsi::constructor ("new_width_check", &new_width_check_node, gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::Euclidian), gsi::arg ("ignore_angle", 90.0), gsi::arg ("min_projection", db::coord_traits::distance_type (0)), gsi::arg ("max_projection", std::numeric_limits::distance_type>::max (), "max."), gsi::arg ("shielded", true), + "@brief Creates a node providing a width check.\n" + "\n" + "@@@ TODO.\n" + ) + + gsi::constructor ("new_space_check", &new_space_check_node, gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::Euclidian), gsi::arg ("ignore_angle", 90.0), gsi::arg ("min_projection", db::coord_traits::distance_type (0)), gsi::arg ("max_projection", std::numeric_limits::distance_type>::max (), "max."), gsi::arg ("shielded", true), + "@brief Creates a node providing a space check.\n" + "\n" + "@@@ TODO.\n" + ) + + gsi::constructor ("new_notch_check", &new_notch_check_node, gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::Euclidian), gsi::arg ("ignore_angle", 90.0), gsi::arg ("min_projection", db::coord_traits::distance_type (0)), gsi::arg ("max_projection", std::numeric_limits::distance_type>::max (), "max."), gsi::arg ("shielded", true), + "@brief Creates a node providing a space check.\n" + "\n" + "@@@ TODO.\n" + ) + + gsi::constructor ("new_separation_check", &new_separation_check_node, gsi::arg ("input"), gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::Euclidian), gsi::arg ("ignore_angle", 90.0), gsi::arg ("min_projection", db::coord_traits::distance_type (0)), gsi::arg ("max_projection", std::numeric_limits::distance_type>::max (), "max."), gsi::arg ("shielded", true), + "@brief Creates a node providing a separation check.\n" + "\n" + "@@@ TODO.\n" + ) + + gsi::constructor ("new_overlap_check", &new_overlap_check_node, gsi::arg ("input"), gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::Euclidian), gsi::arg ("ignore_angle", 90.0), gsi::arg ("min_projection", db::coord_traits::distance_type (0)), gsi::arg ("max_projection", std::numeric_limits::distance_type>::max (), "max."), gsi::arg ("shielded", true), + "@brief Creates a node providing an overlap check.\n" + "\n" + "@@@ TODO.\n" + ) + + gsi::constructor ("new_inside_check", &new_inside_check_node, gsi::arg ("input"), gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::Euclidian), gsi::arg ("ignore_angle", 90.0), gsi::arg ("min_projection", db::coord_traits::distance_type (0)), gsi::arg ("max_projection", std::numeric_limits::distance_type>::max (), "max."), gsi::arg ("shielded", true), + "@brief Creates a node providing an inside (enclosure) check.\n" + "\n" + "@@@ TODO.\n" + ) + method ("description=", &db::CompoundRegionOperationNode::set_description, gsi::arg ("d"), "@brief Sets the description for this node" ) +