Bugfixed GSI binding of compound DRC operation nodes.

This commit is contained in:
Matthias Koefferlein 2020-12-05 17:11:01 +01:00
parent 44fd6bff11
commit 44aef92160
10 changed files with 181 additions and 68 deletions

View File

@ -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<db::Region *> inputs () const = 0;
@ -990,7 +993,7 @@ protected:
}
virtual db::Coord dist () const { return mp_node->dist (); }
// @@@ TODO: virtual typename local_operation<TS, TI, TR>::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 (); }

View File

@ -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::Edge> (), db::box_convert<db::Polygon> ());
}
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;
}

View File

@ -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::TextRef> (), db::box_convert<db::Polygon> ());
}
virtual on_empty_intruder_mode on_empty_intruder_hint () const
virtual OnEmptyIntruderHint on_empty_intruder_hint () const
{
return Drop;
}

View File

@ -1787,7 +1787,7 @@ local_processor<TS, TI, TR>::compute_local_cell (const db::local_processor_conte
subject_id0 = id;
}
if (op->on_empty_intruder_hint () != local_operation<TS, TI, TR>::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<TS, TI, TR>::compute_local_cell (const db::local_processor_conte
if (interactions.begin_intruders () == interactions.end_intruders ()) {
typename local_operation<TS, TI, TR>::on_empty_intruder_mode eh = op->on_empty_intruder_hint ();
if (eh == local_operation<TS, TI, TR>::Drop) {
OnEmptyIntruderHint eh = op->on_empty_intruder_hint ();
if (eh == OnEmptyIntruderHint::Drop) {
return;
}
@ -2022,7 +2022,7 @@ local_processor<TS, TI, TR>::run_flat (const generic_shape_iterator<TS> &subject
tl_assert (mp_intruder_top == 0);
shape_interactions<TS, TI> interactions;
bool needs_isolated_subjects = (op->on_empty_intruder_hint () != local_operation<TS, TI, TR>::Drop);
bool needs_isolated_subjects = (op->on_empty_intruder_hint () != OnEmptyIntruderHint::Drop);
for (typename std::vector<generic_shape_iterator<TI> >::const_iterator il = intruders.begin (); il != intruders.end (); ++il) {
if (*il == subjects) {
@ -2036,8 +2036,8 @@ local_processor<TS, TI, TR>::run_flat (const generic_shape_iterator<TS> &subject
if (interactions.begin_intruders () == interactions.end_intruders ()) {
typename local_operation<TS, TI, TR>::on_empty_intruder_mode eh = op->on_empty_intruder_hint ();
if (eh == local_operation<TS, TI, TR>::Drop) {
OnEmptyIntruderHint eh = op->on_empty_intruder_hint ();
if (eh == OnEmptyIntruderHint::Drop) {
return;
}

View File

@ -46,7 +46,7 @@ BoolAndOrNotLocalOperation::BoolAndOrNotLocalOperation (bool is_and)
// .. nothing yet ..
}
local_operation<db::PolygonRef, db::PolygonRef, db::PolygonRef>::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<db::Edge, db::Edge, db::Edge>::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<db::Edge, db::PolygonRef, db::Edge>::on_empty_intruder_mode
OnEmptyIntruderHint
EdgeToPolygonLocalOperation::on_empty_intruder_hint () const
{
return m_outside ? Copy : Drop;

View File

@ -39,6 +39,26 @@ namespace db
template <class TS, class TI> 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 TS, class TI, class TR>
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<db::PolygonRef, db::PolygonRef> &interactions, std::vector<std::unordered_set<db::PolygonRef> > &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<db::PolygonRef, db::PolygonRef> &interactions, std::vector<std::unordered_set<db::PolygonRef> > &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<db::Edge, db::Edge> &interactions, std::vector<std::unordered_set<db::Edge> > &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<db::Edge, db::PolygonRef> &interactions, std::vector<std::unordered_set<db::Edge> > &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

View File

@ -238,10 +238,10 @@ check_local_operation<TS, TI, TR>::dist () const
}
template <class TS, class TI, class TR>
typename db::local_operation<TS, TI, TR>::on_empty_intruder_mode
OnEmptyIntruderHint
check_local_operation<TS, TI, TR>::on_empty_intruder_hint () const
{
return m_different_polygons ? db::local_operation<TS, TI, TR>::Drop : db::local_operation<TS, TI, TR>::Ignore;
return m_different_polygons ? OnEmptyIntruderHint::Drop : OnEmptyIntruderHint::Ignore;
}
template <class TS, class TI, class TR>
@ -339,13 +339,13 @@ void interacting_local_operation<TS, TI, TR>::compute_local (db::Layout * /*layo
}
template <class TS, class TI, class TR>
typename local_operation<TS, TI, TR>::on_empty_intruder_mode
OnEmptyIntruderHint
interacting_local_operation<TS, TI, TR>::on_empty_intruder_hint () const
{
if ((m_mode <= 0) != m_inverse) {
return local_operation<TS, TI, TR>::Drop;
return OnEmptyIntruderHint::Drop;
} else {
return local_operation<TS, TI, TR>::Copy;
return OnEmptyIntruderHint::Copy;
}
}
@ -424,9 +424,9 @@ void pull_local_operation<TS, TI, TR>::compute_local (db::Layout * /*layout*/, c
}
template <class TS, class TI, class TR>
typename local_operation<TS, TI, TR>::on_empty_intruder_mode pull_local_operation<TS, TI, TR>::on_empty_intruder_hint () const
OnEmptyIntruderHint pull_local_operation<TS, TI, TR>::on_empty_intruder_hint () const
{
return local_operation<TS, TI, TR>::Drop;
return OnEmptyIntruderHint::Drop;
}
template <class TS, class TI, class TR>
@ -506,12 +506,12 @@ void interacting_with_edge_local_operation<TS, TI, TR>::compute_local (db::Layou
}
template <class TS, class TI, class TR>
typename local_operation<TS, TI, TR>::on_empty_intruder_mode interacting_with_edge_local_operation<TS, TI, TR>::on_empty_intruder_hint () const
OnEmptyIntruderHint interacting_with_edge_local_operation<TS, TI, TR>::on_empty_intruder_hint () const
{
if (!m_inverse) {
return local_operation<TS, TI, TR>::Drop;
return OnEmptyIntruderHint::Drop;
} else {
return local_operation<TS, TI, TR>::Copy;
return OnEmptyIntruderHint::Copy;
}
}
@ -571,9 +571,9 @@ void pull_with_edge_local_operation<TS, TI, TR>::compute_local (db::Layout *layo
}
template <class TS, class TI, class TR>
typename local_operation<TS, TI, TR>::on_empty_intruder_mode pull_with_edge_local_operation<TS, TI, TR>::on_empty_intruder_hint () const
OnEmptyIntruderHint pull_with_edge_local_operation<TS, TI, TR>::on_empty_intruder_hint () const
{
return local_operation<TS, TI, TR>::Drop;
return OnEmptyIntruderHint::Drop;
}
template <class TS, class TI, class TR>
@ -638,9 +638,9 @@ void pull_with_text_local_operation<TS, TI, TR>::compute_local (db::Layout *layo
}
template <class TS, class TI, class TR>
typename local_operation<TS, TI, TR>::on_empty_intruder_mode pull_with_text_local_operation<TS, TI, TR>::on_empty_intruder_hint () const
OnEmptyIntruderHint pull_with_text_local_operation<TS, TI, TR>::on_empty_intruder_hint () const
{
return local_operation<TS, TI, TR>::Drop;
return OnEmptyIntruderHint::Drop;
}
template <class TS, class TI, class TR>
@ -719,12 +719,12 @@ void interacting_with_text_local_operation<TS, TI, TR>::compute_local (db::Layou
}
template <class TS, class TI, class TR>
typename local_operation<TS, TI, TR>::on_empty_intruder_mode interacting_with_text_local_operation<TS, TI, TR>::on_empty_intruder_hint () const
OnEmptyIntruderHint interacting_with_text_local_operation<TS, TI, TR>::on_empty_intruder_hint () const
{
if (!m_inverse) {
return local_operation<TS, TI, TR>::Drop;
return OnEmptyIntruderHint::Drop;
} else {
return local_operation<TS, TI, TR>::Copy;
return OnEmptyIntruderHint::Copy;
}
}

View File

@ -42,7 +42,7 @@ public:
virtual void compute_local (db::Layout * /*layout*/, const shape_interactions<TS, TI> &interactions, std::vector<std::unordered_set<TR> > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const;
virtual db::Coord dist () const;
virtual typename local_operation<TS, TI, TR>::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<TS, TI> &interactions, std::vector<std::unordered_set<TR> > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const;
virtual typename local_operation<TS, TI, TR>::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<TS, TI> &interactions, std::vector<std::unordered_set<TR> > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const;
virtual typename local_operation<TS, TI, TR>::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<TS, TI> &interactions, std::vector<std::unordered_set<TR> > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const;
virtual typename local_operation<TS, TI, TR>::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<TS, TI> &interactions, std::vector<std::unordered_set<TR> > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const;
virtual typename local_operation<TS, TI, TR>::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<TS, TI> &interactions, std::vector<std::unordered_set<TR> > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const;
virtual typename local_operation<TS, TI, TR>::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<TS, TI> &interactions, std::vector<std::unordered_set<TR> > &results, size_t /*max_vertex_count*/, double /*area_ratio*/) const;
virtual typename local_operation<TS, TI, TR>::on_empty_intruder_mode on_empty_intruder_hint () const;
virtual OnEmptyIntruderHint on_empty_intruder_hint () const;
virtual std::string description () const;
};

View File

@ -21,6 +21,7 @@
*/
#include "gsiDecl.h"
#include "gsiEnums.h"
#include "dbCompoundOperation.h"
@ -347,5 +348,114 @@ Class<db::CompoundRegionOperationNode> decl_CompoundRegionOperationNode ("db", "
"This class has been introduced in version 0.27."
);
gsi::EnumIn<db::CompoundRegionOperationNode, db::CompoundRegionLogicalBoolOperationNode::LogicalOp> 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<db::CompoundRegionOperationNode, db::CompoundRegionGeometricalBoolOperationNode::GeometricalOp> 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<db::CompoundRegionOperationNode, db::CompoundRegionOperationNode::ResultType> 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<db::TrapezoidDecompositionMode> 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<db::PreferredOrientation> 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<db::metrics_type> 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."
);
}

View File

@ -722,7 +722,7 @@ gsi::EnumIn<db::LayoutToNetlist, db::LayoutToNetlist::BuildNetHierarchyMode> 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<db::LayoutToNetlist> inject_dbLayoutToNetlist_BuildNetHierarchyMode_in_parent (decl_dbLayoutToNetlist_BuildNetHierarchyMode.defs ());
}