diff --git a/src/db/db/dbCompoundOperation.h b/src/db/db/dbCompoundOperation.h index 11488f7f6..01fd88678 100644 --- a/src/db/db/dbCompoundOperation.h +++ b/src/db/db/dbCompoundOperation.h @@ -64,6 +64,9 @@ public: std::string description () const; void set_description (const std::string &d); + // 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; virtual std::vector inputs () const = 0; @@ -990,7 +993,7 @@ protected: } virtual db::Coord dist () const { return mp_node->dist (); } - // @@@ TODO: virtual typename local_operation::on_empty_intruder_mode on_empty_intruder_hint () const { return mp_node->on_empty_intruder_hint (); } + virtual OnEmptyIntruderHint on_empty_intruder_hint () const { return mp_node->on_empty_intruder_hint (); } virtual std::string description () const { return mp_node->description (); } const TransformationReducer *vars () const { return mp_node->vars (); } diff --git a/src/db/db/dbDeepEdges.cc b/src/db/db/dbDeepEdges.cc index b1c410b02..5cc4c8da6 100644 --- a/src/db/db/dbDeepEdges.cc +++ b/src/db/db/dbDeepEdges.cc @@ -1123,7 +1123,7 @@ public: } - virtual on_empty_intruder_mode on_empty_intruder_hint () const + virtual OnEmptyIntruderHint on_empty_intruder_hint () const { if (m_inverse) { return Copy; @@ -1184,7 +1184,7 @@ public: } - virtual on_empty_intruder_mode on_empty_intruder_hint () const + virtual OnEmptyIntruderHint on_empty_intruder_hint () const { return Drop; } @@ -1257,7 +1257,7 @@ public: } } - virtual on_empty_intruder_mode on_empty_intruder_hint () const + virtual OnEmptyIntruderHint on_empty_intruder_hint () const { if (m_inverse) { return Copy; @@ -1340,7 +1340,7 @@ public: scanner.process (filter, 1, db::box_convert (), db::box_convert ()); } - virtual on_empty_intruder_mode on_empty_intruder_hint () const + virtual OnEmptyIntruderHint on_empty_intruder_hint () const { return Drop; } @@ -1533,7 +1533,7 @@ public: return m_check.distance (); } - virtual on_empty_intruder_mode on_empty_intruder_hint () const + virtual OnEmptyIntruderHint on_empty_intruder_hint () const { return Drop; } diff --git a/src/db/db/dbDeepTexts.cc b/src/db/db/dbDeepTexts.cc index f5c19b10b..23b8d7143 100644 --- a/src/db/db/dbDeepTexts.cc +++ b/src/db/db/dbDeepTexts.cc @@ -511,7 +511,7 @@ public: } } - virtual on_empty_intruder_mode on_empty_intruder_hint () const + virtual OnEmptyIntruderHint on_empty_intruder_hint () const { if (m_inverse) { return Copy; @@ -594,7 +594,7 @@ public: scanner.process (filter, 1, db::box_convert (), db::box_convert ()); } - virtual on_empty_intruder_mode on_empty_intruder_hint () const + virtual OnEmptyIntruderHint on_empty_intruder_hint () const { return Drop; } diff --git a/src/db/db/dbHierProcessor.cc b/src/db/db/dbHierProcessor.cc index f07b33df3..e94e1dad0 100644 --- a/src/db/db/dbHierProcessor.cc +++ b/src/db/db/dbHierProcessor.cc @@ -1787,7 +1787,7 @@ local_processor::compute_local_cell (const db::local_processor_conte subject_id0 = id; } - if (op->on_empty_intruder_hint () != local_operation::Drop) { + if (op->on_empty_intruder_hint () != OnEmptyIntruderHint::Drop) { const TS *ref = i->basic_ptr (typename TS::tag ()); interactions.add_subject (id, *ref); } @@ -1856,8 +1856,8 @@ local_processor::compute_local_cell (const db::local_processor_conte if (interactions.begin_intruders () == interactions.end_intruders ()) { - typename local_operation::on_empty_intruder_mode eh = op->on_empty_intruder_hint (); - if (eh == local_operation::Drop) { + OnEmptyIntruderHint eh = op->on_empty_intruder_hint (); + if (eh == OnEmptyIntruderHint::Drop) { return; } @@ -2022,7 +2022,7 @@ local_processor::run_flat (const generic_shape_iterator &subject tl_assert (mp_intruder_top == 0); shape_interactions interactions; - bool needs_isolated_subjects = (op->on_empty_intruder_hint () != local_operation::Drop); + bool needs_isolated_subjects = (op->on_empty_intruder_hint () != OnEmptyIntruderHint::Drop); for (typename std::vector >::const_iterator il = intruders.begin (); il != intruders.end (); ++il) { if (*il == subjects) { @@ -2036,8 +2036,8 @@ local_processor::run_flat (const generic_shape_iterator &subject if (interactions.begin_intruders () == interactions.end_intruders ()) { - typename local_operation::on_empty_intruder_mode eh = op->on_empty_intruder_hint (); - if (eh == local_operation::Drop) { + OnEmptyIntruderHint eh = op->on_empty_intruder_hint (); + if (eh == OnEmptyIntruderHint::Drop) { return; } diff --git a/src/db/db/dbLocalOperation.cc b/src/db/db/dbLocalOperation.cc index b0e340c60..9c31b38db 100644 --- a/src/db/db/dbLocalOperation.cc +++ b/src/db/db/dbLocalOperation.cc @@ -46,7 +46,7 @@ BoolAndOrNotLocalOperation::BoolAndOrNotLocalOperation (bool is_and) // .. nothing yet .. } -local_operation::on_empty_intruder_mode +OnEmptyIntruderHint BoolAndOrNotLocalOperation::on_empty_intruder_hint () const { return m_is_and ? Drop : Copy; @@ -251,7 +251,7 @@ SelfOverlapMergeLocalOperation::compute_local (db::Layout *layout, const shape_i ep.process (pg, op); } -SelfOverlapMergeLocalOperation::on_empty_intruder_mode SelfOverlapMergeLocalOperation::on_empty_intruder_hint () const +OnEmptyIntruderHint SelfOverlapMergeLocalOperation::on_empty_intruder_hint () const { return m_wrap_count > 1 ? Drop : Copy; } @@ -270,7 +270,7 @@ EdgeBoolAndOrNotLocalOperation::EdgeBoolAndOrNotLocalOperation (EdgeBoolOp op) // .. nothing yet .. } -local_operation::on_empty_intruder_mode +OnEmptyIntruderHint EdgeBoolAndOrNotLocalOperation::on_empty_intruder_hint () const { return (m_op == EdgeAnd || m_op == EdgeIntersections) ? Drop : Copy; @@ -349,7 +349,7 @@ EdgeToPolygonLocalOperation::EdgeToPolygonLocalOperation (bool outside, bool inc // .. nothing yet .. } -local_operation::on_empty_intruder_mode +OnEmptyIntruderHint EdgeToPolygonLocalOperation::on_empty_intruder_hint () const { return m_outside ? Copy : Drop; diff --git a/src/db/db/dbLocalOperation.h b/src/db/db/dbLocalOperation.h index dc577781a..47d0403b4 100644 --- a/src/db/db/dbLocalOperation.h +++ b/src/db/db/dbLocalOperation.h @@ -39,6 +39,26 @@ namespace db template class shape_interactions; +/** + * @brief Indicates the desired behaviour for subject shapes for which there is no intruder + */ +enum OnEmptyIntruderHint { + /** + * @brief Don't imply a specific behaviour + */ + Ignore = 0, + + /** + * @brief Copy the subject shape + */ + Copy, + + /** + * @brief Drop the subject shape + */ + Drop +}; + /** * @brief A base class for "local operations" * A local operation is any operation whose result can be computed by @@ -54,26 +74,6 @@ template class DB_PUBLIC local_operation { public: - /** - * @brief Indicates the desired behaviour for subject shapes for which there is no intruder - */ - enum on_empty_intruder_mode { - /** - * @brief Don't imply a specific behaviour - */ - Ignore = 0, - - /** - * @brief Copy the subject shape - */ - Copy, - - /** - * @brief Drop the subject shape - */ - Drop - }; - /** * @brief Constructor */ @@ -95,7 +95,7 @@ public: /** * @brief Indicates the desired behaviour when a shape does not have an intruder */ - virtual on_empty_intruder_mode on_empty_intruder_hint () const { return Ignore; } + virtual OnEmptyIntruderHint on_empty_intruder_hint () const { return Ignore; } /** * @brief Gets a description text for this operation @@ -119,7 +119,7 @@ public: BoolAndOrNotLocalOperation (bool is_and); virtual void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &result, size_t max_vertex_count, double area_ratio) const; - virtual on_empty_intruder_mode on_empty_intruder_hint () const; + virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; private: @@ -154,7 +154,7 @@ public: SelfOverlapMergeLocalOperation (unsigned int wrap_count); virtual void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &result, size_t max_vertex_count, double area_ratio) const; - virtual on_empty_intruder_mode on_empty_intruder_hint () const; + virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; private: @@ -171,7 +171,7 @@ public: EdgeBoolAndOrNotLocalOperation (EdgeBoolOp op); virtual void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &result, size_t max_vertex_count, double area_ratio) const; - virtual on_empty_intruder_mode on_empty_intruder_hint () const; + virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; // edge interaction distance is 1 to force overlap between edges and edge/boxes @@ -194,7 +194,7 @@ public: EdgeToPolygonLocalOperation (bool outside, bool include_borders); virtual void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &result, size_t max_vertex_count, double area_ratio) const; - virtual on_empty_intruder_mode on_empty_intruder_hint () const; + virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; // edge interaction distance is 1 to force overlap between edges and edge/boxes diff --git a/src/db/db/dbRegionLocalOperations.cc b/src/db/db/dbRegionLocalOperations.cc index b3a08620d..25de4e2b9 100644 --- a/src/db/db/dbRegionLocalOperations.cc +++ b/src/db/db/dbRegionLocalOperations.cc @@ -238,10 +238,10 @@ check_local_operation::dist () const } template -typename db::local_operation::on_empty_intruder_mode +OnEmptyIntruderHint check_local_operation::on_empty_intruder_hint () const { - return m_different_polygons ? db::local_operation::Drop : db::local_operation::Ignore; + return m_different_polygons ? OnEmptyIntruderHint::Drop : OnEmptyIntruderHint::Ignore; } template @@ -339,13 +339,13 @@ void interacting_local_operation::compute_local (db::Layout * /*layo } template -typename local_operation::on_empty_intruder_mode +OnEmptyIntruderHint interacting_local_operation::on_empty_intruder_hint () const { if ((m_mode <= 0) != m_inverse) { - return local_operation::Drop; + return OnEmptyIntruderHint::Drop; } else { - return local_operation::Copy; + return OnEmptyIntruderHint::Copy; } } @@ -424,9 +424,9 @@ void pull_local_operation::compute_local (db::Layout * /*layout*/, c } template -typename local_operation::on_empty_intruder_mode pull_local_operation::on_empty_intruder_hint () const +OnEmptyIntruderHint pull_local_operation::on_empty_intruder_hint () const { - return local_operation::Drop; + return OnEmptyIntruderHint::Drop; } template @@ -506,12 +506,12 @@ void interacting_with_edge_local_operation::compute_local (db::Layou } template -typename local_operation::on_empty_intruder_mode interacting_with_edge_local_operation::on_empty_intruder_hint () const +OnEmptyIntruderHint interacting_with_edge_local_operation::on_empty_intruder_hint () const { if (!m_inverse) { - return local_operation::Drop; + return OnEmptyIntruderHint::Drop; } else { - return local_operation::Copy; + return OnEmptyIntruderHint::Copy; } } @@ -571,9 +571,9 @@ void pull_with_edge_local_operation::compute_local (db::Layout *layo } template -typename local_operation::on_empty_intruder_mode pull_with_edge_local_operation::on_empty_intruder_hint () const +OnEmptyIntruderHint pull_with_edge_local_operation::on_empty_intruder_hint () const { - return local_operation::Drop; + return OnEmptyIntruderHint::Drop; } template @@ -638,9 +638,9 @@ void pull_with_text_local_operation::compute_local (db::Layout *layo } template -typename local_operation::on_empty_intruder_mode pull_with_text_local_operation::on_empty_intruder_hint () const +OnEmptyIntruderHint pull_with_text_local_operation::on_empty_intruder_hint () const { - return local_operation::Drop; + return OnEmptyIntruderHint::Drop; } template @@ -719,12 +719,12 @@ void interacting_with_text_local_operation::compute_local (db::Layou } template -typename local_operation::on_empty_intruder_mode interacting_with_text_local_operation::on_empty_intruder_hint () const +OnEmptyIntruderHint interacting_with_text_local_operation::on_empty_intruder_hint () const { if (!m_inverse) { - return local_operation::Drop; + return OnEmptyIntruderHint::Drop; } else { - return local_operation::Copy; + return OnEmptyIntruderHint::Copy; } } diff --git a/src/db/db/dbRegionLocalOperations.h b/src/db/db/dbRegionLocalOperations.h index a37e0a8b0..9bd50466a 100644 --- a/src/db/db/dbRegionLocalOperations.h +++ b/src/db/db/dbRegionLocalOperations.h @@ -42,7 +42,7 @@ public: virtual void compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const; virtual db::Coord dist () const; - virtual typename local_operation::on_empty_intruder_mode on_empty_intruder_hint () const; + virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; private: @@ -64,7 +64,7 @@ public: virtual db::Coord dist () const; virtual void compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const; - virtual typename local_operation::on_empty_intruder_mode on_empty_intruder_hint () const; + virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; private: @@ -85,7 +85,7 @@ public: virtual db::Coord dist () const; virtual void compute_local (db::Layout * /*layout*/, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const; - virtual typename local_operation::on_empty_intruder_mode on_empty_intruder_hint () const; + virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; private: @@ -104,7 +104,7 @@ public: virtual db::Coord dist () const; virtual void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const; - virtual typename local_operation::on_empty_intruder_mode on_empty_intruder_hint () const; + virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; private: @@ -123,7 +123,7 @@ public: virtual db::Coord dist () const; virtual void compute_local (db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const; - virtual typename local_operation::on_empty_intruder_mode on_empty_intruder_hint () const; + virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; }; @@ -138,7 +138,7 @@ public: virtual db::Coord dist () const; virtual void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const; - virtual typename local_operation::on_empty_intruder_mode on_empty_intruder_hint () const; + virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; private: @@ -157,7 +157,7 @@ public: virtual db::Coord dist () const; virtual void compute_local (db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const; - virtual typename local_operation::on_empty_intruder_mode on_empty_intruder_hint () const; + virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual std::string description () const; }; diff --git a/src/db/db/gsiDeclDbCompoundOperation.cc b/src/db/db/gsiDeclDbCompoundOperation.cc index be6f52e86..fa3fc5428 100644 --- a/src/db/db/gsiDeclDbCompoundOperation.cc +++ b/src/db/db/gsiDeclDbCompoundOperation.cc @@ -21,6 +21,7 @@ */ #include "gsiDecl.h" +#include "gsiEnums.h" #include "dbCompoundOperation.h" @@ -347,5 +348,114 @@ Class decl_CompoundRegionOperationNode ("db", " "This class has been introduced in version 0.27." ); +gsi::EnumIn decl_dbCompoundRegionLogicalBoolOperationNode_LogicalOp ("db", "LogicalOp", + gsi::enum_const ("And", db::CompoundRegionLogicalBoolOperationNode::LogicalOp::And, + "@brief Indicates a logical '&&' (and)." + ) + + gsi::enum_const ("Or", db::CompoundRegionLogicalBoolOperationNode::LogicalOp::Or, + "@brief Indicates a logical '||' (or)." + ), + "@brief This class represents the CompoundRegionOperationNode::LogicalOp enum\n" + "\n" + "This enum has been introduced in version 0.27." +); + +gsi::EnumIn decl_dbCompoundRegionGeometricalBoolOperationNode_GeometricalOp ("db", "GeometricalOp", + gsi::enum_const ("And", db::CompoundRegionGeometricalBoolOperationNode::GeometricalOp::And, + "@brief Indicates a geometrical '&' (and)." + ) + + gsi::enum_const ("Not", db::CompoundRegionGeometricalBoolOperationNode::GeometricalOp::Not, + "@brief Indicates a geometrical '-' (not)." + ) + + gsi::enum_const ("Xor", db::CompoundRegionGeometricalBoolOperationNode::GeometricalOp::Xor, + "@brief Indicates a geometrical '^' (xor)." + ) + + gsi::enum_const ("Or", db::CompoundRegionGeometricalBoolOperationNode::GeometricalOp::Or, + "@brief Indicates a geometrical '|' (or)." + ), + "@brief This class represents the CompoundRegionOperationNode::GeometricalOp enum\n" + "\n" + "This enum has been introduced in version 0.27." +); + +gsi::EnumIn decl_dbCompoundRegionOperationNode_ResultType ("db", "ResultType", + gsi::enum_const ("Region", db::CompoundRegionOperationNode::ResultType::Region, + "@brief Indicates polygon result type." + ) + + gsi::enum_const ("Edges", db::CompoundRegionOperationNode::ResultType::Edges, + "@brief Indicates edge result type." + ) + + gsi::enum_const ("EdgePairs", db::CompoundRegionOperationNode::ResultType::EdgePairs, + "@brief Indicates edge pair result type." + ), + "@brief This class represents the CompoundRegionOperationNode::ResultType enum\n" + "\n" + "This enum has been introduced in version 0.27." +); + +gsi::Enum decl_dbTrapezoidDecompositionMode ("db", "TrapezoidDecompositionMode", + gsi::enum_const ("TD_simple", db::TrapezoidDecompositionMode::TD_simple, + "@brief Indicates unspecific decomposition." + ) + + gsi::enum_const ("TD_htrapezoids", db::TrapezoidDecompositionMode::TD_htrapezoids, + "@brief Indicates horizontal trapezoid decomposition." + ) + + gsi::enum_const ("TD_vtrapezoids", db::TrapezoidDecompositionMode::TD_vtrapezoids, + "@brief Indicates vertical trapezoid decomposition." + ), + "@brief This class represents the TrapezoidDecompositionMode enum used within trapezoid decomposition\n" + "\n" + "This enum has been introduced in version 0.27." +); + +gsi::Enum decl_dbPreferredOrientation ("db", "PreferredOrientation", + gsi::enum_const ("PO_any", db::PreferredOrientation::PO_any, + "@brief Indicates any orientation." + ) + + gsi::enum_const ("PO_horizontal", db::PreferredOrientation::PO_horizontal, + "@brief Indicates horizontal orientation." + ) + + gsi::enum_const ("PO_vertical", db::PreferredOrientation::PO_vertical, + "@brief Indicates vertical orientation." + ) + + gsi::enum_const ("PO_htrapezoids", db::PreferredOrientation::PO_htrapezoids, + "@brief Indicates horizontal trapezoid decomposition." + ) + + gsi::enum_const ("PO_vtrapezoids", db::PreferredOrientation::PO_vtrapezoids, + "@brief Indicates vertical trapezoid decomposition." + ), + "@brief This class represents the PreferredOrientation enum used within polygon decomposition\n" + "\n" + "This enum has been introduced in version 0.27." +); + +gsi::Enum decl_dbMetricsType ("db", "MetricsType", + gsi::enum_const ("Euclidian", db::metrics_type::Euclidian, + "@brief Euclidian metrics\n" + "\n" + "The distance between two points is defined as the euclidian\n" + "distance, i.e. d = sqrt(dx * dx + dy * dy).\n" + "All points within a circle with radius r around another point \n" + "have a distance less than r to this point.\n" + ) + + gsi::enum_const ("Square", db::metrics_type::Square, + "@brief Square metrics\n" + "\n" + "The distance between two points is the minimum of x and\n" + "y distance, i.e. d = min(abs(dx), abs(dy)).\n" + "All points within a square with length 2*r round another point\n" + "have a distance less than r to this point.\n" + ) + + gsi::enum_const ("Projection", db::metrics_type::Projection, + "@brief Projection metrics\n" + "\n" + "The distance between a point and another point on an edge\n" + "is measured by the distance of the point to the edge.\n" + ), + "@brief This class represents the MetricsType enum used within DRC functions\n" + "\n" + "This enum has been introduced in version 0.27." +); + } diff --git a/src/db/db/gsiDeclDbLayoutToNetlist.cc b/src/db/db/gsiDeclDbLayoutToNetlist.cc index 1f46e9139..afad6d3bc 100644 --- a/src/db/db/gsiDeclDbLayoutToNetlist.cc +++ b/src/db/db/gsiDeclDbLayoutToNetlist.cc @@ -722,7 +722,7 @@ gsi::EnumIn dec "This enum is used for \\LayoutToNetlist#build_all_nets and \\LayoutToNetlist#build_net." ); -// Inject the NetlistCrossReference::Status declarations into NetlistCrossReference: +// Inject the NetlistCrossReference::BuildNetHierarchyMode declarations into NetlistCrossReference: gsi::ClassExt inject_dbLayoutToNetlist_BuildNetHierarchyMode_in_parent (decl_dbLayoutToNetlist_BuildNetHierarchyMode.defs ()); }