diff --git a/src/db/db/dbCompoundOperation.cc b/src/db/db/dbCompoundOperation.cc index ad8681470..61b189184 100644 --- a/src/db/db/dbCompoundOperation.cc +++ b/src/db/db/dbCompoundOperation.cc @@ -30,6 +30,7 @@ namespace db // --------------------------------------------------------------------------------------------- CompoundRegionOperationNode::CompoundRegionOperationNode () + : m_dist (0) { invalidate_cache (); } @@ -356,7 +357,7 @@ CompoundRegionMultiInputOperationNode::invalidate_cache () const } db::Coord -CompoundRegionMultiInputOperationNode::dist () const +CompoundRegionMultiInputOperationNode::computed_dist () const { db::Coord d = 0; for (tl::shared_collection::const_iterator i = m_children.begin (); i != m_children.end (); ++i) { @@ -548,9 +549,9 @@ CompoundRegionGeometricalBoolOperationNode::result_type () const } db::Coord -CompoundRegionGeometricalBoolOperationNode::dist () const +CompoundRegionGeometricalBoolOperationNode::computed_dist () const { - db::Coord d = CompoundRegionMultiInputOperationNode::dist (); + db::Coord d = CompoundRegionMultiInputOperationNode::computed_dist (); ResultType res_a = child (0)->result_type (); ResultType res_b = child (1)->result_type (); @@ -1541,7 +1542,7 @@ CompoundRegionCheckOperationNode::on_empty_intruder_hint () const } db::Coord -CompoundRegionCheckOperationNode::dist () const +CompoundRegionCheckOperationNode::computed_dist () const { return m_check.distance (); } diff --git a/src/db/db/dbCompoundOperation.h b/src/db/db/dbCompoundOperation.h index d9e1bb80e..34b12c8a1 100644 --- a/src/db/db/dbCompoundOperation.h +++ b/src/db/db/dbCompoundOperation.h @@ -67,21 +67,60 @@ public: CompoundRegionOperationNode (); virtual ~CompoundRegionOperationNode (); + /** + * @brief Returns the description set with "set_description" + */ const std::string &raw_description () const { return m_description; } + /** + * @brief Gets the interaction distance of this operation + * The returned value will be the minimum distance (set_dist) or the computed distance + * (compute_dist), whichever is larger. + */ + db::Coord dist () const + { + return std::max (m_dist, computed_dist ()); + } + + /** + * @brief Sets a minmum distance + */ + void set_dist (db::Coord d) + { + m_dist = d; + } + + /** + * @brief Gets the description for this node + */ std::string description () const; + + /** + * @brief Sets the description for this node + * If no description is set, the generated description will be used. + */ void set_description (const std::string &d); + /** + * @brief Returns a value giving a hint how to handle the case of empty intruders + */ // NOTE: it's probably going to be difficult to compute a different value here: virtual OnEmptyIntruderHint on_empty_intruder_hint () const { return OnEmptyIntruderHint::Ignore; } - virtual db::Coord dist () const = 0; + /** + * @brief Returns the inputs this node depends on + * The returned vector may use subject_regionptr() or forein_regionptr() as abstract values + * for the subject layer and the subject layer in "foreign" mode (asymmetric: other subjects are treated + * as different shapes). + */ virtual std::vector inputs () const = 0; - // specifies the result type + /** + * @brief Specifies the type of shapes this node delivers + */ virtual ResultType result_type () const = 0; /** @@ -185,10 +224,13 @@ 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 db::Coord computed_dist () const = 0; + virtual std::string generated_description () const; private: std::string m_description; + db::Coord m_dist; mutable std::vector > m_cache_polyref; mutable bool m_cache_polyref_valid; mutable std::vector > m_cache_poly; @@ -263,7 +305,7 @@ public: { } virtual std::vector inputs () const { return std::vector (); } - virtual db::Coord dist () const { return 0; } + virtual db::Coord computed_dist () const { return 0; } virtual ResultType result_type () const { return m_type; } private: @@ -279,7 +321,7 @@ public: virtual ~CompoundRegionOperationPrimaryNode (); virtual std::vector inputs () const; - virtual db::Coord dist () const { return 0; } + virtual db::Coord computed_dist () const { return 0; } virtual ResultType result_type () const { return Region; } virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; @@ -294,7 +336,7 @@ public: virtual ~CompoundRegionOperationForeignNode (); virtual std::vector inputs () const; - virtual db::Coord dist () const { return 0; } + virtual db::Coord computed_dist () const { return 0; } virtual ResultType result_type () const { return Region; } virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; @@ -309,7 +351,7 @@ public: virtual ~CompoundRegionOperationSecondaryNode (); virtual std::vector inputs () const; - virtual db::Coord dist () const { return 0; } + virtual db::Coord computed_dist () const { return 0; } virtual ResultType result_type () const { return Region; } virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; @@ -349,7 +391,7 @@ public: CompoundRegionMultiInputOperationNode (CompoundRegionOperationNode *a, CompoundRegionOperationNode *b); ~CompoundRegionMultiInputOperationNode (); - virtual db::Coord dist () const; + virtual db::Coord computed_dist () const; virtual std::string generated_description () const; virtual std::vector inputs () const @@ -535,7 +577,7 @@ public: // specifies the result type virtual ResultType result_type () const; - virtual db::Coord dist () const; + virtual db::Coord computed_dist () const; // the different computation slots virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; @@ -586,7 +628,7 @@ public: virtual ResultType result_type () const { return compound_operation_type_traits::type (); } virtual const db::TransformationReducer *vars () const { return mp_vars; } virtual bool wants_variants () const { return m_wants_variants; } - virtual db::Coord dist () const { return m_op->dist (); } + virtual db::Coord computed_dist () const { return m_op->dist (); } virtual bool wants_merged () const { return true; } virtual std::vector inputs () const @@ -1000,7 +1042,7 @@ public: // specifies the result type virtual ResultType result_type () const { return Region; } - virtual db::Coord dist () const { return m_dist_adder + CompoundRegionMultiInputOperationNode::dist (); } + virtual db::Coord computed_dist () const { return m_dist_adder + CompoundRegionMultiInputOperationNode::computed_dist (); } virtual const TransformationReducer *vars () const { return mp_proc->vars (); } virtual bool wants_variants () const { return mp_proc->wants_variants (); } @@ -1400,7 +1442,7 @@ public: virtual ResultType result_type () const { return EdgePairs; } virtual OnEmptyIntruderHint on_empty_intruder_hint () const; - virtual db::Coord dist () const; + virtual db::Coord computed_dist () const; virtual bool wants_merged () 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; diff --git a/src/db/db/gsiDeclDbCompoundOperation.cc b/src/db/db/gsiDeclDbCompoundOperation.cc index b5bb2fe16..8248259d4 100644 --- a/src/db/db/gsiDeclDbCompoundOperation.cc +++ b/src/db/db/gsiDeclDbCompoundOperation.cc @@ -709,6 +709,15 @@ Class decl_CompoundRegionOperationNode ("db", " gsi::constructor ("new_empty", &new_empty, gsi::arg ("type"), "@brief Creates a node delivering an empty result of the given type\n" ) + + method ("distance=", &db::CompoundRegionOperationNode::set_dist, gsi::arg ("d"), + "@brief Sets the distance value for this node" + "Usually it's not required to provide a distance because the nodes compute a distance based on their " + "operation. If necessary you can supply a distance. The processor will use this distance or the computed one, " + "whichever is larger." + ) + + method ("distance", &db::CompoundRegionOperationNode::dist, + "@brief Gets the distance value for this node" + ) + method ("description=", &db::CompoundRegionOperationNode::set_description, gsi::arg ("d"), "@brief Sets the description for this node" ) + diff --git a/src/drc/drc/built-in-macros/_drc_cop_integration.rb b/src/drc/drc/built-in-macros/_drc_cop_integration.rb index 367ea1939..a039a3f62 100644 --- a/src/drc/drc/built-in-macros/_drc_cop_integration.rb +++ b/src/drc/drc/built-in-macros/_drc_cop_integration.rb @@ -77,8 +77,18 @@ module DRC @engine._context("drc") do requires_region op.is_a?(DRCOpNode) || raise("A DRC expression is required for the argument (got #{op.inspect})") - # @@@ proper output type!!! - DRCLayer::new(@engine, @engine._tcmd(self.data, 0, RBA::Region, :complex_op, op.create_node({}))) + node = op.create_node({}) + result_cls = nil + if node.result_type == RBA::CompoundRegionOperationNode::ResultType::Region + result_cls = RBA::Region + elsif node.result_type == RBA::CompoundRegionOperationNode::ResultType::Edges + result_cls = RBA::Edges + elsif node.result_type == RBA::CompoundRegionOperationNode::ResultType::EdgePairs + result_cls = RBA::EdgePairs + end + if result_cls + DRCLayer::new(@engine, @engine._tcmd(self.data, node.distance, result_cls, :complex_op, node)) + end end end