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 ()
|
||||
: 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<CompoundRegionOperationNode>::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 ();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<db::Region *> 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<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 db::Coord computed_dist () const = 0;
|
||||
|
||||
virtual std::string generated_description () const;
|
||||
|
||||
private:
|
||||
std::string m_description;
|
||||
db::Coord m_dist;
|
||||
mutable std::vector<std::unordered_set<db::PolygonRef> > m_cache_polyref;
|
||||
mutable bool m_cache_polyref_valid;
|
||||
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 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<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 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 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 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 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 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 ();
|
||||
|
||||
virtual db::Coord dist () const;
|
||||
virtual db::Coord computed_dist () const;
|
||||
virtual std::string generated_description () const;
|
||||
|
||||
virtual std::vector<db::Region *> 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<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 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<db::Region *> 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<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"),
|
||||
"@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"
|
||||
) +
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue