mirror of https://github.com/KLayout/klayout.git
WIP: proper integration of complex DRC ops in DRC framework
This commit is contained in:
parent
7093dfd0eb
commit
b15e7f2b9f
|
|
@ -30,6 +30,7 @@ namespace db
|
||||||
// ---------------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
CompoundRegionOperationNode::CompoundRegionOperationNode ()
|
CompoundRegionOperationNode::CompoundRegionOperationNode ()
|
||||||
|
: m_dist (0)
|
||||||
{
|
{
|
||||||
invalidate_cache ();
|
invalidate_cache ();
|
||||||
}
|
}
|
||||||
|
|
@ -356,7 +357,7 @@ CompoundRegionMultiInputOperationNode::invalidate_cache () const
|
||||||
}
|
}
|
||||||
|
|
||||||
db::Coord
|
db::Coord
|
||||||
CompoundRegionMultiInputOperationNode::dist () const
|
CompoundRegionMultiInputOperationNode::computed_dist () const
|
||||||
{
|
{
|
||||||
db::Coord d = 0;
|
db::Coord d = 0;
|
||||||
for (tl::shared_collection<CompoundRegionOperationNode>::const_iterator i = m_children.begin (); i != m_children.end (); ++i) {
|
for (tl::shared_collection<CompoundRegionOperationNode>::const_iterator i = m_children.begin (); i != m_children.end (); ++i) {
|
||||||
|
|
@ -548,9 +549,9 @@ CompoundRegionGeometricalBoolOperationNode::result_type () const
|
||||||
}
|
}
|
||||||
|
|
||||||
db::Coord
|
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_a = child (0)->result_type ();
|
||||||
ResultType res_b = child (1)->result_type ();
|
ResultType res_b = child (1)->result_type ();
|
||||||
|
|
@ -1541,7 +1542,7 @@ CompoundRegionCheckOperationNode::on_empty_intruder_hint () const
|
||||||
}
|
}
|
||||||
|
|
||||||
db::Coord
|
db::Coord
|
||||||
CompoundRegionCheckOperationNode::dist () const
|
CompoundRegionCheckOperationNode::computed_dist () const
|
||||||
{
|
{
|
||||||
return m_check.distance ();
|
return m_check.distance ();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -67,21 +67,60 @@ public:
|
||||||
CompoundRegionOperationNode ();
|
CompoundRegionOperationNode ();
|
||||||
virtual ~CompoundRegionOperationNode ();
|
virtual ~CompoundRegionOperationNode ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the description set with "set_description"
|
||||||
|
*/
|
||||||
const std::string &raw_description () const
|
const std::string &raw_description () const
|
||||||
{
|
{
|
||||||
return m_description;
|
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;
|
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);
|
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:
|
// 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 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<db::Region *> inputs () const = 0;
|
virtual std::vector<db::Region *> inputs () const = 0;
|
||||||
|
|
||||||
// specifies the result type
|
/**
|
||||||
|
* @brief Specifies the type of shapes this node delivers
|
||||||
|
*/
|
||||||
virtual ResultType result_type () const = 0;
|
virtual ResultType result_type () const = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -185,10 +224,13 @@ protected:
|
||||||
virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions<db::PolygonRef, db::PolygonRef> & /*interactions*/, std::vector<std::unordered_set<db::Edge> > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { }
|
virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions<db::PolygonRef, db::PolygonRef> & /*interactions*/, std::vector<std::unordered_set<db::Edge> > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { }
|
||||||
virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions<db::PolygonRef, db::PolygonRef> & /*interactions*/, std::vector<std::unordered_set<db::EdgePair> > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { }
|
virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions<db::PolygonRef, db::PolygonRef> & /*interactions*/, std::vector<std::unordered_set<db::EdgePair> > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { }
|
||||||
|
|
||||||
|
virtual db::Coord computed_dist () const = 0;
|
||||||
|
|
||||||
virtual std::string generated_description () const;
|
virtual std::string generated_description () const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string m_description;
|
std::string m_description;
|
||||||
|
db::Coord m_dist;
|
||||||
mutable std::vector<std::unordered_set<db::PolygonRef> > m_cache_polyref;
|
mutable std::vector<std::unordered_set<db::PolygonRef> > m_cache_polyref;
|
||||||
mutable bool m_cache_polyref_valid;
|
mutable bool m_cache_polyref_valid;
|
||||||
mutable std::vector<std::unordered_set<db::Polygon> > m_cache_poly;
|
mutable std::vector<std::unordered_set<db::Polygon> > m_cache_poly;
|
||||||
|
|
@ -263,7 +305,7 @@ public:
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
virtual std::vector<db::Region *> inputs () const { return std::vector<db::Region *> (); }
|
virtual std::vector<db::Region *> inputs () const { return std::vector<db::Region *> (); }
|
||||||
virtual db::Coord dist () const { return 0; }
|
virtual db::Coord computed_dist () const { return 0; }
|
||||||
virtual ResultType result_type () const { return m_type; }
|
virtual ResultType result_type () const { return m_type; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -279,7 +321,7 @@ public:
|
||||||
virtual ~CompoundRegionOperationPrimaryNode ();
|
virtual ~CompoundRegionOperationPrimaryNode ();
|
||||||
|
|
||||||
virtual std::vector<db::Region *> inputs () const;
|
virtual std::vector<db::Region *> 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 ResultType result_type () const { return Region; }
|
||||||
|
|
||||||
virtual void do_compute_local (db::Layout *layout, const shape_interactions<db::Polygon, db::Polygon> &interactions, std::vector<std::unordered_set<db::Polygon> > &results, size_t max_vertex_count, double area_ratio) const;
|
virtual void do_compute_local (db::Layout *layout, const shape_interactions<db::Polygon, db::Polygon> &interactions, std::vector<std::unordered_set<db::Polygon> > &results, size_t max_vertex_count, double area_ratio) const;
|
||||||
|
|
@ -294,7 +336,7 @@ public:
|
||||||
virtual ~CompoundRegionOperationForeignNode ();
|
virtual ~CompoundRegionOperationForeignNode ();
|
||||||
|
|
||||||
virtual std::vector<db::Region *> inputs () const;
|
virtual std::vector<db::Region *> 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 ResultType result_type () const { return Region; }
|
||||||
|
|
||||||
virtual void do_compute_local (db::Layout *layout, const shape_interactions<db::Polygon, db::Polygon> &interactions, std::vector<std::unordered_set<db::Polygon> > &results, size_t max_vertex_count, double area_ratio) const;
|
virtual void do_compute_local (db::Layout *layout, const shape_interactions<db::Polygon, db::Polygon> &interactions, std::vector<std::unordered_set<db::Polygon> > &results, size_t max_vertex_count, double area_ratio) const;
|
||||||
|
|
@ -309,7 +351,7 @@ public:
|
||||||
virtual ~CompoundRegionOperationSecondaryNode ();
|
virtual ~CompoundRegionOperationSecondaryNode ();
|
||||||
|
|
||||||
virtual std::vector<db::Region *> inputs () const;
|
virtual std::vector<db::Region *> 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 ResultType result_type () const { return Region; }
|
||||||
|
|
||||||
virtual void do_compute_local (db::Layout *layout, const shape_interactions<db::Polygon, db::Polygon> &interactions, std::vector<std::unordered_set<db::Polygon> > &results, size_t max_vertex_count, double area_ratio) const;
|
virtual void do_compute_local (db::Layout *layout, const shape_interactions<db::Polygon, db::Polygon> &interactions, std::vector<std::unordered_set<db::Polygon> > &results, size_t max_vertex_count, double area_ratio) const;
|
||||||
|
|
@ -349,7 +391,7 @@ public:
|
||||||
CompoundRegionMultiInputOperationNode (CompoundRegionOperationNode *a, CompoundRegionOperationNode *b);
|
CompoundRegionMultiInputOperationNode (CompoundRegionOperationNode *a, CompoundRegionOperationNode *b);
|
||||||
~CompoundRegionMultiInputOperationNode ();
|
~CompoundRegionMultiInputOperationNode ();
|
||||||
|
|
||||||
virtual db::Coord dist () const;
|
virtual db::Coord computed_dist () const;
|
||||||
virtual std::string generated_description () const;
|
virtual std::string generated_description () const;
|
||||||
|
|
||||||
virtual std::vector<db::Region *> inputs () const
|
virtual std::vector<db::Region *> inputs () const
|
||||||
|
|
@ -535,7 +577,7 @@ public:
|
||||||
|
|
||||||
// specifies the result type
|
// specifies the result type
|
||||||
virtual ResultType result_type () const;
|
virtual ResultType result_type () const;
|
||||||
virtual db::Coord dist () const;
|
virtual db::Coord computed_dist () const;
|
||||||
|
|
||||||
// the different computation slots
|
// the different computation slots
|
||||||
virtual void do_compute_local (db::Layout *layout, const shape_interactions<db::Polygon, db::Polygon> &interactions, std::vector<std::unordered_set<db::Polygon> > &results, size_t max_vertex_count, double area_ratio) const;
|
virtual void do_compute_local (db::Layout *layout, const shape_interactions<db::Polygon, db::Polygon> &interactions, std::vector<std::unordered_set<db::Polygon> > &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<TR>::type (); }
|
virtual ResultType result_type () const { return compound_operation_type_traits<TR>::type (); }
|
||||||
virtual const db::TransformationReducer *vars () const { return mp_vars; }
|
virtual const db::TransformationReducer *vars () const { return mp_vars; }
|
||||||
virtual bool wants_variants () const { return m_wants_variants; }
|
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 bool wants_merged () const { return true; }
|
||||||
|
|
||||||
virtual std::vector<db::Region *> inputs () const
|
virtual std::vector<db::Region *> inputs () const
|
||||||
|
|
@ -1000,7 +1042,7 @@ public:
|
||||||
// specifies the result type
|
// specifies the result type
|
||||||
virtual ResultType result_type () const { return Region; }
|
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 const TransformationReducer *vars () const { return mp_proc->vars (); }
|
||||||
virtual bool wants_variants () const { return mp_proc->wants_variants (); }
|
virtual bool wants_variants () const { return mp_proc->wants_variants (); }
|
||||||
|
|
@ -1400,7 +1442,7 @@ public:
|
||||||
virtual ResultType result_type () const { return EdgePairs; }
|
virtual ResultType result_type () const { return EdgePairs; }
|
||||||
|
|
||||||
virtual OnEmptyIntruderHint on_empty_intruder_hint () const;
|
virtual OnEmptyIntruderHint on_empty_intruder_hint () const;
|
||||||
virtual db::Coord dist () const;
|
virtual db::Coord computed_dist () const;
|
||||||
virtual bool wants_merged () const;
|
virtual bool wants_merged () const;
|
||||||
|
|
||||||
virtual void do_compute_local (db::Layout *layout, const shape_interactions<db::Polygon, db::Polygon> &interactions, std::vector<std::unordered_set<db::EdgePair> > &results, size_t max_vertex_count, double area_ratio) const;
|
virtual void do_compute_local (db::Layout *layout, const shape_interactions<db::Polygon, db::Polygon> &interactions, std::vector<std::unordered_set<db::EdgePair> > &results, size_t max_vertex_count, double area_ratio) const;
|
||||||
|
|
|
||||||
|
|
@ -709,6 +709,15 @@ Class<db::CompoundRegionOperationNode> decl_CompoundRegionOperationNode ("db", "
|
||||||
gsi::constructor ("new_empty", &new_empty, gsi::arg ("type"),
|
gsi::constructor ("new_empty", &new_empty, gsi::arg ("type"),
|
||||||
"@brief Creates a node delivering an empty result of the given type\n"
|
"@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"),
|
method ("description=", &db::CompoundRegionOperationNode::set_description, gsi::arg ("d"),
|
||||||
"@brief Sets the description for this node"
|
"@brief Sets the description for this node"
|
||||||
) +
|
) +
|
||||||
|
|
|
||||||
|
|
@ -77,8 +77,18 @@ module DRC
|
||||||
@engine._context("drc") do
|
@engine._context("drc") do
|
||||||
requires_region
|
requires_region
|
||||||
op.is_a?(DRCOpNode) || raise("A DRC expression is required for the argument (got #{op.inspect})")
|
op.is_a?(DRCOpNode) || raise("A DRC expression is required for the argument (got #{op.inspect})")
|
||||||
# @@@ proper output type!!!
|
node = op.create_node({})
|
||||||
DRCLayer::new(@engine, @engine._tcmd(self.data, 0, RBA::Region, :complex_op, 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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue