mirror of https://github.com/KLayout/klayout.git
[BUGFIX] WIP: property support for DRC functions, bugfix: DRC check against raw (non-merged semantics) second input did not work
This commit is contained in:
parent
c3383cf7df
commit
9f6f0e2d43
|
|
@ -43,8 +43,6 @@
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
#define USE_LOCAL_PROCESSOR // comment out for original implementation based on a single scan
|
|
||||||
|
|
||||||
namespace db
|
namespace db
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
@ -708,8 +706,6 @@ AsIfFlatRegion::pull_generic (const Edges &other) const
|
||||||
return new EmptyEdges ();
|
return new EmptyEdges ();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(USE_LOCAL_PROCESSOR)
|
|
||||||
|
|
||||||
db::RegionIterator polygons (begin ());
|
db::RegionIterator polygons (begin ());
|
||||||
|
|
||||||
db::pull_with_edge_local_operation <db::Polygon, db::Edge, db::Edge> op;
|
db::pull_with_edge_local_operation <db::Polygon, db::Edge, db::Edge> op;
|
||||||
|
|
@ -729,39 +725,11 @@ AsIfFlatRegion::pull_generic (const Edges &other) const
|
||||||
proc.run_flat (polygons, others, std::vector<bool> (), &op, results);
|
proc.run_flat (polygons, others, std::vector<bool> (), &op, results);
|
||||||
|
|
||||||
return output.release ();
|
return output.release ();
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
db::box_scanner2<db::Polygon, size_t, db::Edge, size_t> scanner (report_progress (), progress_desc ());
|
|
||||||
scanner.reserve1 (count ());
|
|
||||||
scanner.reserve2 (other.count ());
|
|
||||||
|
|
||||||
std::unique_ptr<FlatEdges> output (new FlatEdges (false));
|
|
||||||
region_to_edge_interaction_filter<db::Polygon, db::Edge, db::Shapes, db::Edge> filter (output->raw_edges (), false);
|
|
||||||
|
|
||||||
AddressablePolygonDelivery p (begin ());
|
|
||||||
|
|
||||||
for ( ; ! p.at_end (); ++p) {
|
|
||||||
scanner.insert1 (p.operator-> (), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
AddressableEdgeDelivery e (other.addressable_merged_edges ());
|
|
||||||
|
|
||||||
for ( ; ! e.at_end (); ++e) {
|
|
||||||
scanner.insert2 (e.operator-> (), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
scanner.process (filter, 1, db::box_convert<db::Polygon> (), db::box_convert<db::Edge> ());
|
|
||||||
|
|
||||||
return output.release ();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TextsDelegate *
|
TextsDelegate *
|
||||||
AsIfFlatRegion::pull_generic (const Texts &other) const
|
AsIfFlatRegion::pull_generic (const Texts &other) const
|
||||||
{
|
{
|
||||||
#if defined(USE_LOCAL_PROCESSOR)
|
|
||||||
|
|
||||||
db::RegionIterator polygons (begin ());
|
db::RegionIterator polygons (begin ());
|
||||||
|
|
||||||
db::pull_with_text_local_operation <db::Polygon, db::Text, db::Text> op;
|
db::pull_with_text_local_operation <db::Polygon, db::Text, db::Text> op;
|
||||||
|
|
@ -781,44 +749,11 @@ AsIfFlatRegion::pull_generic (const Texts &other) const
|
||||||
proc.run_flat (polygons, others, std::vector<bool> (), &op, results);
|
proc.run_flat (polygons, others, std::vector<bool> (), &op, results);
|
||||||
|
|
||||||
return output.release ();
|
return output.release ();
|
||||||
|
|
||||||
#else
|
|
||||||
if (other.empty ()) {
|
|
||||||
return other.delegate ()->clone ();
|
|
||||||
} else if (empty ()) {
|
|
||||||
return new EmptyTexts ();
|
|
||||||
}
|
|
||||||
|
|
||||||
db::box_scanner2<db::Polygon, size_t, db::Text, size_t> scanner (report_progress (), progress_desc ());
|
|
||||||
scanner.reserve1 (count ());
|
|
||||||
scanner.reserve2 (other.count ());
|
|
||||||
|
|
||||||
std::unique_ptr<FlatTexts> output (new FlatTexts (false));
|
|
||||||
region_to_text_interaction_filter<db::Polygon, db::Text, db::Shapes, db::Text> filter (output->raw_texts (), false);
|
|
||||||
|
|
||||||
AddressablePolygonDelivery p (begin ());
|
|
||||||
|
|
||||||
for ( ; ! p.at_end (); ++p) {
|
|
||||||
scanner.insert1 (p.operator-> (), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
AddressableTextDelivery e (other.addressable_texts ());
|
|
||||||
|
|
||||||
for ( ; ! e.at_end (); ++e) {
|
|
||||||
scanner.insert2 (e.operator-> (), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
scanner.process (filter, 1, db::box_convert<db::Polygon> (), db::box_convert<db::Text> ());
|
|
||||||
|
|
||||||
return output.release ();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RegionDelegate *
|
RegionDelegate *
|
||||||
AsIfFlatRegion::pull_generic (const Region &other, int mode, bool touching) const
|
AsIfFlatRegion::pull_generic (const Region &other, int mode, bool touching) const
|
||||||
{
|
{
|
||||||
#if defined(USE_LOCAL_PROCESSOR)
|
|
||||||
|
|
||||||
db::RegionIterator polygons (begin ());
|
db::RegionIterator polygons (begin ());
|
||||||
|
|
||||||
db::pull_local_operation <db::Polygon, db::Polygon, db::Polygon> op (mode, touching);
|
db::pull_local_operation <db::Polygon, db::Polygon, db::Polygon> op (mode, touching);
|
||||||
|
|
@ -838,57 +773,6 @@ AsIfFlatRegion::pull_generic (const Region &other, int mode, bool touching) cons
|
||||||
proc.run_flat (polygons, others, std::vector<bool> (), &op, results);
|
proc.run_flat (polygons, others, std::vector<bool> (), &op, results);
|
||||||
|
|
||||||
return output.release ();
|
return output.release ();
|
||||||
|
|
||||||
#else
|
|
||||||
db::EdgeProcessor ep (report_progress (), progress_desc ());
|
|
||||||
ep.set_base_verbosity (base_verbosity ());
|
|
||||||
|
|
||||||
// shortcut
|
|
||||||
if (empty ()) {
|
|
||||||
return clone ();
|
|
||||||
} else if (other.empty ()) {
|
|
||||||
return new EmptyRegion ();
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t n = 1;
|
|
||||||
for (RegionIterator p = other.begin_merged (); ! p.at_end (); ++p, ++n) {
|
|
||||||
if (p->box ().touches (bbox ())) {
|
|
||||||
ep.insert (*p, n);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (RegionIterator p (begin ()); ! p.at_end (); ++p) {
|
|
||||||
if (mode > 0 || p->box ().touches (other.bbox ())) {
|
|
||||||
ep.insert (*p, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
db::InteractionDetector id (mode, 0);
|
|
||||||
id.set_include_touching (touching);
|
|
||||||
db::EdgeSink es;
|
|
||||||
ep.process (es, id);
|
|
||||||
id.finish ();
|
|
||||||
|
|
||||||
std::unique_ptr<FlatRegion> output (new FlatRegion (false));
|
|
||||||
|
|
||||||
n = 0;
|
|
||||||
std::set <size_t> selected;
|
|
||||||
for (db::InteractionDetector::iterator i = id.begin (); i != id.end () && i->first == 0; ++i) {
|
|
||||||
++n;
|
|
||||||
selected.insert (i->second);
|
|
||||||
}
|
|
||||||
|
|
||||||
output->reserve (n);
|
|
||||||
|
|
||||||
n = 1;
|
|
||||||
for (RegionIterator p = other.begin_merged (); ! p.at_end (); ++p, ++n) {
|
|
||||||
if (selected.find (n) != selected.end ()) {
|
|
||||||
output->raw_polygons ().insert (*p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return output.release ();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Trans>
|
template <class Trans>
|
||||||
|
|
@ -1179,8 +1063,6 @@ AsIfFlatRegion::inside_check (const Region &other, db::Coord d, const RegionChec
|
||||||
EdgePairsDelegate *
|
EdgePairsDelegate *
|
||||||
AsIfFlatRegion::run_check (db::edge_relation_type rel, bool different_polygons, const Region *other, db::Coord d, const RegionCheckOptions &options) const
|
AsIfFlatRegion::run_check (db::edge_relation_type rel, bool different_polygons, const Region *other, db::Coord d, const RegionCheckOptions &options) const
|
||||||
{
|
{
|
||||||
#if defined(USE_LOCAL_PROCESSOR)
|
|
||||||
|
|
||||||
bool needs_merged_primary = different_polygons || options.needs_merged ();
|
bool needs_merged_primary = different_polygons || options.needs_merged ();
|
||||||
|
|
||||||
db::RegionIterator polygons (needs_merged_primary ? begin_merged () : begin ());
|
db::RegionIterator polygons (needs_merged_primary ? begin_merged () : begin ());
|
||||||
|
|
@ -1193,11 +1075,6 @@ AsIfFlatRegion::run_check (db::edge_relation_type rel, bool different_polygons,
|
||||||
check.set_min_projection (options.min_projection);
|
check.set_min_projection (options.min_projection);
|
||||||
check.set_max_projection (options.max_projection);
|
check.set_max_projection (options.max_projection);
|
||||||
|
|
||||||
db::local_processor<db::Polygon, db::Polygon, db::EdgePair> proc;
|
|
||||||
proc.set_base_verbosity (base_verbosity ());
|
|
||||||
proc.set_description (progress_desc ());
|
|
||||||
proc.set_report_progress (report_progress ());
|
|
||||||
|
|
||||||
std::vector<generic_shape_iterator<db::Polygon> > others;
|
std::vector<generic_shape_iterator<db::Polygon> > others;
|
||||||
std::vector<bool> foreign;
|
std::vector<bool> foreign;
|
||||||
bool has_other = false;
|
bool has_other = false;
|
||||||
|
|
@ -1210,6 +1087,7 @@ AsIfFlatRegion::run_check (db::edge_relation_type rel, bool different_polygons,
|
||||||
} else {
|
} else {
|
||||||
foreign.push_back (false);
|
foreign.push_back (false);
|
||||||
if (! other->merged_semantics ()) {
|
if (! other->merged_semantics ()) {
|
||||||
|
others.push_back (other->begin ());
|
||||||
other_is_merged = true;
|
other_is_merged = true;
|
||||||
} else if (options.whole_edges) {
|
} else if (options.whole_edges) {
|
||||||
// NOTE: whole edges needs both inputs merged
|
// NOTE: whole edges needs both inputs merged
|
||||||
|
|
@ -1222,63 +1100,44 @@ AsIfFlatRegion::run_check (db::edge_relation_type rel, bool different_polygons,
|
||||||
has_other = true;
|
has_other = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
db::check_local_operation<db::Polygon, db::Polygon> op (check, different_polygons, primary_is_merged, has_other, other_is_merged, options);
|
|
||||||
|
|
||||||
std::unique_ptr<FlatEdgePairs> output (new FlatEdgePairs ());
|
std::unique_ptr<FlatEdgePairs> output (new FlatEdgePairs ());
|
||||||
|
|
||||||
std::vector<db::Shapes *> results;
|
std::vector<db::Shapes *> results;
|
||||||
results.push_back (&output->raw_edge_pairs ());
|
results.push_back (&output->raw_edge_pairs ());
|
||||||
|
|
||||||
proc.run_flat (polygons, others, foreign, &op, results);
|
if (options.prop_constraint == db::IgnoreProperties) {
|
||||||
|
|
||||||
return output.release ();
|
db::check_local_operation<db::Polygon, db::Polygon> op (check, different_polygons, primary_is_merged, has_other, other_is_merged, options);
|
||||||
|
|
||||||
#else
|
db::local_processor<db::Polygon, db::Polygon, db::EdgePair> proc;
|
||||||
// not supported in this implementation
|
proc.set_base_verbosity (base_verbosity ());
|
||||||
tl_assert (! m_options.no_opposite);
|
proc.set_description (progress_desc ());
|
||||||
|
proc.set_report_progress (report_progress ());
|
||||||
|
|
||||||
std::unique_ptr<FlatEdgePairs> result (new FlatEdgePairs ());
|
proc.run_flat (polygons, others, foreign, &op, results);
|
||||||
|
|
||||||
db::box_scanner<db::Polygon, size_t> scanner (report_progress (), progress_desc ());
|
} else {
|
||||||
scanner.reserve (count () + (other ? other->count () : 0));
|
|
||||||
|
|
||||||
AddressablePolygonDelivery p (begin_merged ());
|
const db::PropertiesRepository *subject_pr = properties_repository ();
|
||||||
|
const db::PropertiesRepository *intruder_pr = (other == subject_regionptr () || other == foreign_regionptr ()) ? subject_pr : &other->properties_repository ();
|
||||||
|
|
||||||
size_t n = 0;
|
db::check_local_operation_with_properties<db::Polygon, db::Polygon> op (check, different_polygons, primary_is_merged, has_other, other_is_merged, options, output->properties_repository (), subject_pr, intruder_pr);
|
||||||
for ( ; ! p.at_end (); ++p) {
|
|
||||||
scanner.insert (p.operator-> (), n);
|
|
||||||
n += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
AddressablePolygonDelivery po;
|
db::local_processor<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgePair> proc;
|
||||||
|
proc.set_base_verbosity (base_verbosity ());
|
||||||
|
proc.set_description (progress_desc ());
|
||||||
|
proc.set_report_progress (report_progress ());
|
||||||
|
|
||||||
if (other) {
|
std::vector<db::generic_shape_iterator<db::PolygonWithProperties> > others_wp;
|
||||||
|
for (auto o = others.begin (); o != others.end (); ++o) {
|
||||||
po = other->addressable_merged_polygons ();
|
others_wp.push_back (db::make_wp_iter (std::move (*o)));
|
||||||
|
|
||||||
n = 1;
|
|
||||||
for ( ; ! po.at_end (); ++po) {
|
|
||||||
scanner.insert (po.operator-> (), n);
|
|
||||||
n += 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
proc.run_flat (db::make_wp_iter (std::move (polygons)), others_wp, foreign, &op, results);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EdgeRelationFilter check (rel, d, options.metrics);
|
return output.release ();
|
||||||
check.set_include_zero (false);
|
|
||||||
check.set_whole_edges (options.whole_edges);
|
|
||||||
check.set_ignore_angle (options.ignore_angle);
|
|
||||||
check.set_min_projection (options.min_projection);
|
|
||||||
check.set_max_projection (options.max_projection);
|
|
||||||
|
|
||||||
edge2edge_check_negative_or_positive<db::FlatEdgePairs> edge_check (check, *result, options.negative, different_polygons, other != 0 /*requires different layers*/, options.shielded);
|
|
||||||
poly2poly_check<db::Polygon, db::FlatEdgePairs> poly_check (edge_check);
|
|
||||||
|
|
||||||
do {
|
|
||||||
scanner.process (poly_check, d, db::box_convert<db::Polygon> ());
|
|
||||||
} while (edge_check.prepare_next_pass ());
|
|
||||||
|
|
||||||
return result.release ();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EdgePairsDelegate *
|
EdgePairsDelegate *
|
||||||
|
|
@ -1433,14 +1292,14 @@ AsIfFlatRegion::and_with (const Region &other, PropertyConstraint property_const
|
||||||
// Nothing to do
|
// Nothing to do
|
||||||
return new EmptyRegion ();
|
return new EmptyRegion ();
|
||||||
|
|
||||||
} else if (is_box () && other.is_box ()) {
|
} else if (property_constraint == db::IgnoreProperties && is_box () && other.is_box ()) {
|
||||||
|
|
||||||
// Simplified handling for boxes
|
// Simplified handling for boxes
|
||||||
db::Box b = bbox ();
|
db::Box b = bbox ();
|
||||||
b &= other.bbox ();
|
b &= other.bbox ();
|
||||||
return region_from_box (b);
|
return region_from_box (b);
|
||||||
|
|
||||||
} else if (is_box () && ! other.strict_handling ()) {
|
} else if (property_constraint == db::IgnoreProperties && is_box () && ! other.strict_handling ()) {
|
||||||
|
|
||||||
// map AND with box to clip ..
|
// map AND with box to clip ..
|
||||||
db::Box b = bbox ();
|
db::Box b = bbox ();
|
||||||
|
|
@ -1455,7 +1314,7 @@ AsIfFlatRegion::and_with (const Region &other, PropertyConstraint property_const
|
||||||
|
|
||||||
return new_region.release ();
|
return new_region.release ();
|
||||||
|
|
||||||
} else if (other.is_box () && ! strict_handling ()) {
|
} else if (property_constraint == db::IgnoreProperties && other.is_box () && ! strict_handling ()) {
|
||||||
|
|
||||||
// map AND with box to clip ..
|
// map AND with box to clip ..
|
||||||
db::Box b = other.bbox ();
|
db::Box b = other.bbox ();
|
||||||
|
|
|
||||||
|
|
@ -1805,6 +1805,7 @@ DeepRegion::run_check (db::edge_relation_type rel, bool different_polygons, cons
|
||||||
return db::AsIfFlatRegion::run_check (rel, different_polygons, other, d, options);
|
return db::AsIfFlatRegion::run_check (rel, different_polygons, other, d, options);
|
||||||
}
|
}
|
||||||
if (! other->merged_semantics ()) {
|
if (! other->merged_semantics ()) {
|
||||||
|
other_layer = other_deep->deep_layer ().layer ();
|
||||||
other_is_merged = true;
|
other_is_merged = true;
|
||||||
} else if (options.whole_edges) {
|
} else if (options.whole_edges) {
|
||||||
// NOTE: whole edges needs both inputs merged
|
// NOTE: whole edges needs both inputs merged
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@
|
||||||
#include "dbRecursiveShapeIterator.h"
|
#include "dbRecursiveShapeIterator.h"
|
||||||
#include "dbBoxConvert.h"
|
#include "dbBoxConvert.h"
|
||||||
#include "dbEdgeProcessor.h"
|
#include "dbEdgeProcessor.h"
|
||||||
|
#include "dbEdgeBoolean.h"
|
||||||
#include "dbPolygonGenerators.h"
|
#include "dbPolygonGenerators.h"
|
||||||
#include "dbLocalOperationUtils.h"
|
#include "dbLocalOperationUtils.h"
|
||||||
#include "dbShapeFlags.h"
|
#include "dbShapeFlags.h"
|
||||||
|
|
@ -439,22 +440,6 @@ local_processor_cell_context<TS, TI, TR>::propagate (unsigned int output_layer,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// explicit instantiations
|
|
||||||
template class DB_PUBLIC local_processor_cell_context<db::Polygon, db::Polygon, db::Polygon>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_context<db::Polygon, db::Text, db::Polygon>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_context<db::Polygon, db::Edge, db::Polygon>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_context<db::Polygon, db::Text, db::Text>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_context<db::Polygon, db::Edge, db::Edge>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_context<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::PolygonRefWithProperties>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_context<db::PolygonWithProperties, db::PolygonWithProperties, db::PolygonWithProperties>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_context<db::PolygonRef, db::PolygonRef, db::PolygonRef>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_context<db::PolygonRef, db::Edge, db::PolygonRef>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_context<db::PolygonRef, db::PolygonRef, db::EdgePair>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_context<db::Polygon, db::Polygon, db::EdgePair>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_context<db::Edge, db::Edge, db::Edge>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_context<db::Edge, db::Polygon, db::Edge>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_context<db::Edge, db::Edge, db::EdgePair>;
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------------
|
||||||
// LocalProcessorCellContexts implementation
|
// LocalProcessorCellContexts implementation
|
||||||
|
|
||||||
|
|
@ -863,24 +848,6 @@ local_processor_cell_contexts<TS, TI, TR>::compute_results (const local_processo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// explicit instantiations
|
|
||||||
template class DB_PUBLIC local_processor_cell_contexts<db::Polygon, db::Polygon, db::Polygon>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_contexts<db::Polygon, db::Edge, db::Polygon>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_contexts<db::Polygon, db::Edge, db::Edge>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_contexts<db::Polygon, db::Text, db::Polygon>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_contexts<db::Polygon, db::Text, db::Text>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_contexts<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::PolygonRefWithProperties>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_contexts<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::EdgeWithProperties>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_contexts<db::PolygonWithProperties, db::PolygonWithProperties, db::PolygonWithProperties>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_contexts<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgeWithProperties>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_contexts<db::PolygonRef, db::PolygonRef, db::PolygonRef>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_contexts<db::PolygonRef, db::Edge, db::PolygonRef>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_contexts<db::PolygonRef, db::PolygonRef, db::EdgePair>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_contexts<db::Polygon, db::Polygon, db::EdgePair>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_contexts<db::Edge, db::PolygonRef, db::Edge>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_contexts<db::Edge, db::Edge, db::Edge>;
|
|
||||||
template class DB_PUBLIC local_processor_cell_contexts<db::Edge, db::Edge, db::EdgePair>;
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
template <class TS, class TI>
|
template <class TS, class TI>
|
||||||
|
|
@ -972,22 +939,6 @@ shape_interactions<TS, TI>::intruder_shape (unsigned int id) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// explicit instantiations
|
|
||||||
template class DB_PUBLIC shape_interactions<db::Polygon, db::Polygon>;
|
|
||||||
template class DB_PUBLIC shape_interactions<db::Polygon, db::Text>;
|
|
||||||
template class DB_PUBLIC shape_interactions<db::Polygon, db::TextRef>;
|
|
||||||
template class DB_PUBLIC shape_interactions<db::Polygon, db::Edge>;
|
|
||||||
template class DB_PUBLIC shape_interactions<db::PolygonRefWithProperties, db::PolygonRefWithProperties>;
|
|
||||||
template class DB_PUBLIC shape_interactions<db::PolygonWithProperties, db::PolygonWithProperties>;
|
|
||||||
template class DB_PUBLIC shape_interactions<db::PolygonRef, db::PolygonRef>;
|
|
||||||
template class DB_PUBLIC shape_interactions<db::PolygonRef, db::TextRef>;
|
|
||||||
template class DB_PUBLIC shape_interactions<db::PolygonRef, db::Text>;
|
|
||||||
template class DB_PUBLIC shape_interactions<db::PolygonRef, db::Edge>;
|
|
||||||
template class DB_PUBLIC shape_interactions<db::Edge, db::Edge>;
|
|
||||||
template class DB_PUBLIC shape_interactions<db::Edge, db::PolygonRef>;
|
|
||||||
template class DB_PUBLIC shape_interactions<db::TextRef, db::TextRef>;
|
|
||||||
template class DB_PUBLIC shape_interactions<db::TextRef, db::PolygonRef>;
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------------
|
||||||
// Helper classes for the LocalProcessor
|
// Helper classes for the LocalProcessor
|
||||||
|
|
||||||
|
|
@ -1444,32 +1395,6 @@ local_processor_context_computation_task<TS, TI, TR>::perform ()
|
||||||
mp_proc->compute_contexts (*mp_contexts, mp_parent_context, mp_subject_parent, mp_subject_cell, m_subject_cell_inst, mp_intruder_cell, m_intruders, m_dist);
|
mp_proc->compute_contexts (*mp_contexts, mp_parent_context, mp_subject_parent, mp_subject_cell, m_subject_cell_inst, mp_intruder_cell, m_intruders, m_dist);
|
||||||
}
|
}
|
||||||
|
|
||||||
// explicit instantiations
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::Polygon, db::Polygon, db::Polygon>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::Polygon, db::Text, db::Polygon>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::Polygon, db::Text, db::Text>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::Polygon, db::Edge, db::Polygon>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::Polygon, db::Edge, db::Edge>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::PolygonRefWithProperties>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::EdgeWithProperties>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonWithProperties, db::PolygonWithProperties, db::PolygonWithProperties>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgeWithProperties>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRef, db::PolygonRef, db::PolygonRef>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRef, db::TextRef, db::TextRef>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRef, db::TextRef, db::PolygonRef>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::TextRef, db::PolygonRef, db::PolygonRef>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::TextRef, db::PolygonRef, db::TextRef>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRef, db::Edge, db::PolygonRef>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRef, db::Edge, db::Edge>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRef, db::PolygonRef, db::Edge>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRef, db::PolygonRef, db::EdgePair>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::Polygon, db::Polygon, db::EdgePair>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::Polygon, db::Polygon, db::Edge>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::Edge, db::Edge, db::Edge>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::Edge, db::PolygonRef, db::Edge>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::Edge, db::Edge, db::EdgePair>;
|
|
||||||
template class DB_PUBLIC local_processor_context_computation_task<db::Edge, db::PolygonRef, db::PolygonRef>;
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------------
|
||||||
// LocalProcessorResultComputationTask implementation
|
// LocalProcessorResultComputationTask implementation
|
||||||
|
|
||||||
|
|
@ -1510,24 +1435,6 @@ local_processor_result_computation_task<TS, TI, TR>::perform ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// explicit instantiations
|
|
||||||
template class DB_PUBLIC local_processor_result_computation_task<db::Polygon, db::Polygon, db::Polygon>;
|
|
||||||
template class DB_PUBLIC local_processor_result_computation_task<db::Polygon, db::Text, db::Polygon>;
|
|
||||||
template class DB_PUBLIC local_processor_result_computation_task<db::Polygon, db::Text, db::Text>;
|
|
||||||
template class DB_PUBLIC local_processor_result_computation_task<db::Polygon, db::Edge, db::Polygon>;
|
|
||||||
template class DB_PUBLIC local_processor_result_computation_task<db::Polygon, db::Edge, db::Edge>;
|
|
||||||
template class DB_PUBLIC local_processor_result_computation_task<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::EdgeWithProperties>;
|
|
||||||
template class DB_PUBLIC local_processor_result_computation_task<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::PolygonRefWithProperties>;
|
|
||||||
template class DB_PUBLIC local_processor_result_computation_task<db::PolygonWithProperties, db::PolygonWithProperties, db::PolygonWithProperties>;
|
|
||||||
template class DB_PUBLIC local_processor_result_computation_task<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgeWithProperties>;
|
|
||||||
template class DB_PUBLIC local_processor_result_computation_task<db::PolygonRef, db::PolygonRef, db::PolygonRef>;
|
|
||||||
template class DB_PUBLIC local_processor_result_computation_task<db::PolygonRef, db::Edge, db::PolygonRef>;
|
|
||||||
template class DB_PUBLIC local_processor_result_computation_task<db::PolygonRef, db::PolygonRef, db::EdgePair>;
|
|
||||||
template class DB_PUBLIC local_processor_result_computation_task<db::Polygon, db::Polygon, db::EdgePair>;
|
|
||||||
template class DB_PUBLIC local_processor_result_computation_task<db::Edge, db::Edge, db::Edge>;
|
|
||||||
template class DB_PUBLIC local_processor_result_computation_task<db::Edge, db::PolygonRef, db::Edge>;
|
|
||||||
template class DB_PUBLIC local_processor_result_computation_task<db::Edge, db::Edge, db::EdgePair>;
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------------
|
||||||
// LocalProcessor implementation
|
// LocalProcessor implementation
|
||||||
|
|
||||||
|
|
@ -2529,6 +2436,114 @@ local_processor<TS, TI, TR>::run_flat (const generic_shape_iterator<TS> &subject
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// NOTE: don't forget to update the explicit instantiations in dbLocalOperation.cc
|
||||||
|
|
||||||
|
// explicit instantiations
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::Polygon, db::Polygon, db::Polygon>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::Polygon, db::Text, db::Polygon>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::Polygon, db::Edge, db::Polygon>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::Polygon, db::Text, db::Text>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::Polygon, db::Edge, db::Edge>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::PolygonRefWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::EdgeWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::EdgePair>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::PolygonWithProperties, db::PolygonWithProperties, db::PolygonWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgeWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgePair>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::PolygonRef, db::PolygonRef, db::PolygonRef>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::PolygonRef, db::Edge, db::PolygonRef>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::PolygonRef, db::PolygonRef, db::EdgePair>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::Polygon, db::Polygon, db::EdgePair>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::Edge, db::Edge, db::Edge>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::Edge, db::Polygon, db::Edge>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_context<db::Edge, db::Edge, db::EdgePair>;
|
||||||
|
|
||||||
|
// explicit instantiations
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::Polygon, db::Polygon, db::Polygon>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::Polygon, db::Edge, db::Polygon>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::Polygon, db::Edge, db::Edge>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::Polygon, db::Text, db::Polygon>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::Polygon, db::Text, db::Text>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::PolygonRefWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::EdgeWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::EdgePair>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::PolygonWithProperties, db::PolygonWithProperties, db::PolygonWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgeWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgePair>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::PolygonRef, db::PolygonRef, db::PolygonRef>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::PolygonRef, db::Edge, db::PolygonRef>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::PolygonRef, db::PolygonRef, db::EdgePair>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::Polygon, db::Polygon, db::EdgePair>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::Edge, db::PolygonRef, db::Edge>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::Edge, db::Edge, db::Edge>;
|
||||||
|
template class DB_PUBLIC local_processor_cell_contexts<db::Edge, db::Edge, db::EdgePair>;
|
||||||
|
|
||||||
|
// explicit instantiations
|
||||||
|
template class DB_PUBLIC shape_interactions<db::Polygon, db::Polygon>;
|
||||||
|
template class DB_PUBLIC shape_interactions<db::Polygon, db::Text>;
|
||||||
|
template class DB_PUBLIC shape_interactions<db::Polygon, db::TextRef>;
|
||||||
|
template class DB_PUBLIC shape_interactions<db::Polygon, db::Edge>;
|
||||||
|
template class DB_PUBLIC shape_interactions<db::PolygonRefWithProperties, db::PolygonRefWithProperties>;
|
||||||
|
template class DB_PUBLIC shape_interactions<db::PolygonWithProperties, db::PolygonWithProperties>;
|
||||||
|
template class DB_PUBLIC shape_interactions<db::PolygonRef, db::PolygonRef>;
|
||||||
|
template class DB_PUBLIC shape_interactions<db::PolygonRef, db::TextRef>;
|
||||||
|
template class DB_PUBLIC shape_interactions<db::PolygonRef, db::Text>;
|
||||||
|
template class DB_PUBLIC shape_interactions<db::PolygonRef, db::Edge>;
|
||||||
|
template class DB_PUBLIC shape_interactions<db::Edge, db::Edge>;
|
||||||
|
template class DB_PUBLIC shape_interactions<db::Edge, db::PolygonRef>;
|
||||||
|
template class DB_PUBLIC shape_interactions<db::TextRef, db::TextRef>;
|
||||||
|
template class DB_PUBLIC shape_interactions<db::TextRef, db::PolygonRef>;
|
||||||
|
|
||||||
|
// explicit instantiations
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::Polygon, db::Polygon, db::Polygon>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::Polygon, db::Text, db::Polygon>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::Polygon, db::Text, db::Text>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::Polygon, db::Edge, db::Polygon>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::Polygon, db::Edge, db::Edge>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::PolygonRefWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::EdgeWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::EdgePair>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonWithProperties, db::PolygonWithProperties, db::PolygonWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgeWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgePair>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRef, db::PolygonRef, db::PolygonRef>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRef, db::TextRef, db::TextRef>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRef, db::TextRef, db::PolygonRef>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::TextRef, db::PolygonRef, db::PolygonRef>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::TextRef, db::PolygonRef, db::TextRef>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRef, db::Edge, db::PolygonRef>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRef, db::Edge, db::Edge>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRef, db::PolygonRef, db::Edge>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::PolygonRef, db::PolygonRef, db::EdgePair>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::Polygon, db::Polygon, db::EdgePair>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::Polygon, db::Polygon, db::Edge>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::Edge, db::Edge, db::Edge>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::Edge, db::PolygonRef, db::Edge>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::Edge, db::Edge, db::EdgePair>;
|
||||||
|
template class DB_PUBLIC local_processor_context_computation_task<db::Edge, db::PolygonRef, db::PolygonRef>;
|
||||||
|
|
||||||
|
// explicit instantiations
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::Polygon, db::Polygon, db::Polygon>;
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::Polygon, db::Text, db::Polygon>;
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::Polygon, db::Text, db::Text>;
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::Polygon, db::Edge, db::Polygon>;
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::Polygon, db::Edge, db::Edge>;
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::EdgeWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::PolygonRefWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::EdgePair>;
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::PolygonWithProperties, db::PolygonWithProperties, db::PolygonWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgeWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgePair>;
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::PolygonRef, db::PolygonRef, db::PolygonRef>;
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::PolygonRef, db::Edge, db::PolygonRef>;
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::PolygonRef, db::PolygonRef, db::EdgePair>;
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::Polygon, db::Polygon, db::EdgePair>;
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::Edge, db::Edge, db::Edge>;
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::Edge, db::PolygonRef, db::Edge>;
|
||||||
|
template class DB_PUBLIC local_processor_result_computation_task<db::Edge, db::Edge, db::EdgePair>;
|
||||||
|
|
||||||
// explicit instantiations
|
// explicit instantiations
|
||||||
template class DB_PUBLIC local_processor<db::Polygon, db::Polygon, db::Polygon>;
|
template class DB_PUBLIC local_processor<db::Polygon, db::Polygon, db::Polygon>;
|
||||||
template class DB_PUBLIC local_processor<db::Polygon, db::Text, db::Polygon>;
|
template class DB_PUBLIC local_processor<db::Polygon, db::Text, db::Polygon>;
|
||||||
|
|
@ -2537,8 +2552,10 @@ template class DB_PUBLIC local_processor<db::Polygon, db::Edge, db::Polygon>;
|
||||||
template class DB_PUBLIC local_processor<db::Polygon, db::Edge, db::Edge>;
|
template class DB_PUBLIC local_processor<db::Polygon, db::Edge, db::Edge>;
|
||||||
template class DB_PUBLIC local_processor<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::PolygonRefWithProperties>;
|
template class DB_PUBLIC local_processor<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::PolygonRefWithProperties>;
|
||||||
template class DB_PUBLIC local_processor<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::EdgeWithProperties>;
|
template class DB_PUBLIC local_processor<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::EdgeWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::EdgePair>;
|
||||||
template class DB_PUBLIC local_processor<db::PolygonWithProperties, db::PolygonWithProperties, db::PolygonWithProperties>;
|
template class DB_PUBLIC local_processor<db::PolygonWithProperties, db::PolygonWithProperties, db::PolygonWithProperties>;
|
||||||
template class DB_PUBLIC local_processor<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgeWithProperties>;
|
template class DB_PUBLIC local_processor<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgeWithProperties>;
|
||||||
|
template class DB_PUBLIC local_processor<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgePair>;
|
||||||
template class DB_PUBLIC local_processor<db::PolygonRef, db::PolygonRef, db::PolygonRef>;
|
template class DB_PUBLIC local_processor<db::PolygonRef, db::PolygonRef, db::PolygonRef>;
|
||||||
template class DB_PUBLIC local_processor<db::PolygonRef, db::Edge, db::PolygonRef>;
|
template class DB_PUBLIC local_processor<db::PolygonRef, db::Edge, db::PolygonRef>;
|
||||||
template class DB_PUBLIC local_processor<db::PolygonRef, db::Edge, db::Edge>;
|
template class DB_PUBLIC local_processor<db::PolygonRef, db::Edge, db::Edge>;
|
||||||
|
|
|
||||||
|
|
@ -22,18 +22,6 @@
|
||||||
|
|
||||||
#include "dbLocalOperation.h"
|
#include "dbLocalOperation.h"
|
||||||
#include "dbHierProcessor.h"
|
#include "dbHierProcessor.h"
|
||||||
#include "dbBoxScanner.h"
|
|
||||||
#include "dbRecursiveShapeIterator.h"
|
|
||||||
#include "dbBoxConvert.h"
|
|
||||||
#include "dbPolygonGenerators.h"
|
|
||||||
#include "dbPolygonTools.h"
|
|
||||||
#include "dbEdgeBoolean.h"
|
|
||||||
#include "dbLayoutUtils.h"
|
|
||||||
#include "tlLog.h"
|
|
||||||
#include "tlTimer.h"
|
|
||||||
#include "tlInternational.h"
|
|
||||||
#include "tlProgress.h"
|
|
||||||
#include "tlSList.h"
|
|
||||||
|
|
||||||
namespace db
|
namespace db
|
||||||
{
|
{
|
||||||
|
|
@ -95,8 +83,10 @@ template class DB_PUBLIC local_operation<db::Polygon, db::Edge, db::Polygon>;
|
||||||
template class DB_PUBLIC local_operation<db::Polygon, db::Edge, db::Edge>;
|
template class DB_PUBLIC local_operation<db::Polygon, db::Edge, db::Edge>;
|
||||||
template class DB_PUBLIC local_operation<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::PolygonRefWithProperties>;
|
template class DB_PUBLIC local_operation<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::PolygonRefWithProperties>;
|
||||||
template class DB_PUBLIC local_operation<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::EdgeWithProperties>;
|
template class DB_PUBLIC local_operation<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::EdgeWithProperties>;
|
||||||
|
template class DB_PUBLIC local_operation<db::PolygonRefWithProperties, db::PolygonRefWithProperties, db::EdgePair>;
|
||||||
template class DB_PUBLIC local_operation<db::PolygonWithProperties, db::PolygonWithProperties, db::PolygonWithProperties>;
|
template class DB_PUBLIC local_operation<db::PolygonWithProperties, db::PolygonWithProperties, db::PolygonWithProperties>;
|
||||||
template class DB_PUBLIC local_operation<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgeWithProperties>;
|
template class DB_PUBLIC local_operation<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgeWithProperties>;
|
||||||
|
template class DB_PUBLIC local_operation<db::PolygonWithProperties, db::PolygonWithProperties, db::EdgePair>;
|
||||||
template class DB_PUBLIC local_operation<db::PolygonRef, db::PolygonRef, db::PolygonRef>;
|
template class DB_PUBLIC local_operation<db::PolygonRef, db::PolygonRef, db::PolygonRef>;
|
||||||
template class DB_PUBLIC local_operation<db::PolygonRef, db::Text, db::PolygonRef>;
|
template class DB_PUBLIC local_operation<db::PolygonRef, db::Text, db::PolygonRef>;
|
||||||
template class DB_PUBLIC local_operation<db::PolygonRef, db::TextRef, db::PolygonRef>;
|
template class DB_PUBLIC local_operation<db::PolygonRef, db::TextRef, db::PolygonRef>;
|
||||||
|
|
|
||||||
|
|
@ -26,12 +26,7 @@
|
||||||
#define HDR_dbLocalOperation
|
#define HDR_dbLocalOperation
|
||||||
|
|
||||||
#include "dbCommon.h"
|
#include "dbCommon.h"
|
||||||
|
|
||||||
#include "dbLayout.h"
|
#include "dbLayout.h"
|
||||||
#include "dbEdgeBoolean.h"
|
|
||||||
#include "dbEdgeProcessor.h"
|
|
||||||
#include "dbPropertyConstraint.h"
|
|
||||||
#include "dbLayoutUtils.h"
|
|
||||||
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@
|
||||||
#include "dbCommon.h"
|
#include "dbCommon.h"
|
||||||
|
|
||||||
#include "dbLayout.h"
|
#include "dbLayout.h"
|
||||||
|
#include "dbPropertyConstraint.h"
|
||||||
#include "dbPolygonGenerators.h"
|
#include "dbPolygonGenerators.h"
|
||||||
#include "dbLocalOperation.h"
|
#include "dbLocalOperation.h"
|
||||||
#include "dbHash.h"
|
#include "dbHash.h"
|
||||||
|
|
@ -38,6 +39,8 @@
|
||||||
namespace db
|
namespace db
|
||||||
{
|
{
|
||||||
|
|
||||||
|
class PropertyMapper;
|
||||||
|
|
||||||
template <class Trans>
|
template <class Trans>
|
||||||
class polygon_transformation_filter
|
class polygon_transformation_filter
|
||||||
: public PolygonSink
|
: public PolygonSink
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@
|
||||||
#include "dbRegionUtils.h"
|
#include "dbRegionUtils.h"
|
||||||
#include "dbLocalOperationUtils.h"
|
#include "dbLocalOperationUtils.h"
|
||||||
#include "dbHierProcessor.h"
|
#include "dbHierProcessor.h"
|
||||||
|
#include "dbEdgeBoolean.h"
|
||||||
|
|
||||||
namespace db
|
namespace db
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@
|
||||||
#include "dbEdgeProcessor.h"
|
#include "dbEdgeProcessor.h"
|
||||||
#include "dbRegionCheckUtils.h"
|
#include "dbRegionCheckUtils.h"
|
||||||
#include "dbPropertyConstraint.h"
|
#include "dbPropertyConstraint.h"
|
||||||
|
#include "dbLayoutUtils.h"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
|
|
|
||||||
|
|
@ -1770,3 +1770,71 @@ TEST(41_EdgesWithProperties)
|
||||||
db::compare_layouts (_this, target, tl::testdata () + "/algo/flat_region_au41.gds");
|
db::compare_layouts (_this, target, tl::testdata () + "/algo/flat_region_au41.gds");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(42_DRCWithProperties)
|
||||||
|
{
|
||||||
|
db::Layout ly;
|
||||||
|
{
|
||||||
|
std::string fn (tl::testdata ());
|
||||||
|
fn += "/algo/deep_region_42.gds";
|
||||||
|
tl::InputStream stream (fn);
|
||||||
|
db::Reader reader (stream);
|
||||||
|
reader.read (ly);
|
||||||
|
}
|
||||||
|
|
||||||
|
db::cell_index_type top_cell_index = *ly.begin_top_down ();
|
||||||
|
db::Cell &top_cell = ly.cell (top_cell_index);
|
||||||
|
|
||||||
|
unsigned int l1 = ly.get_layer (db::LayerProperties (1, 0));
|
||||||
|
unsigned int l2 = ly.get_layer (db::LayerProperties (2, 0));
|
||||||
|
|
||||||
|
db::RecursiveShapeIterator si1 (ly, top_cell, l1);
|
||||||
|
si1.shape_flags (db::ShapeIterator::All | db::ShapeIterator::RegardProperties);
|
||||||
|
db::Region r1 (si1);
|
||||||
|
db::Region r1_nomerge (r1);
|
||||||
|
r1_nomerge.set_merged_semantics (false);
|
||||||
|
|
||||||
|
db::RecursiveShapeIterator si2 (ly, top_cell, l2);
|
||||||
|
si2.shape_flags (db::ShapeIterator::All | db::ShapeIterator::RegardProperties);
|
||||||
|
db::Region r2 (si2);
|
||||||
|
db::Region r2_nomerge (r2);
|
||||||
|
r2_nomerge.set_merged_semantics (false);
|
||||||
|
|
||||||
|
db::Layout target;
|
||||||
|
unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index));
|
||||||
|
|
||||||
|
db::RegionCheckOptions opt;
|
||||||
|
opt.metrics = db::Projection;
|
||||||
|
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (1, 0)), r1);
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (2, 0)), r2);
|
||||||
|
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (10, 0)), r1.space_check (1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (11, 0)), r1.separation_check (r2, 1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (12, 0)), r2.space_check (1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (13, 0)), r1_nomerge.space_check (1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (14, 0)), r1_nomerge.separation_check (r2, 1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (15, 0)), r1.separation_check (r2_nomerge, 1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (16, 0)), r1_nomerge.separation_check (r2_nomerge, 1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (17, 0)), r2_nomerge.space_check (1000, opt));
|
||||||
|
|
||||||
|
opt.prop_constraint = db::NoPropertyConstraint;
|
||||||
|
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (20, 0)), r1.space_check (1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (21, 0)), r1.separation_check (r2, 1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (22, 0)), r2.space_check (1000, opt));
|
||||||
|
|
||||||
|
opt.prop_constraint = db::SamePropertiesConstraint;
|
||||||
|
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (30, 0)), r1.space_check (1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (31, 0)), r1.separation_check (r2, 1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (32, 0)), r2.space_check (1000, opt));
|
||||||
|
|
||||||
|
opt.prop_constraint = db::DifferentPropertiesConstraint;
|
||||||
|
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (40, 0)), r1.space_check (1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (41, 0)), r1.separation_check (r2, 1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (42, 0)), r2.space_check (1000, opt));
|
||||||
|
|
||||||
|
CHECKPOINT();
|
||||||
|
db::compare_layouts (_this, target, tl::testdata () + "/algo/flat_region_au42.gds");
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -2222,7 +2222,6 @@ TEST(41_EdgesWithProperties)
|
||||||
|
|
||||||
unsigned int l1 = ly.get_layer (db::LayerProperties (1, 0));
|
unsigned int l1 = ly.get_layer (db::LayerProperties (1, 0));
|
||||||
unsigned int l2 = ly.get_layer (db::LayerProperties (2, 0));
|
unsigned int l2 = ly.get_layer (db::LayerProperties (2, 0));
|
||||||
unsigned int l3 = ly.get_layer (db::LayerProperties (3, 0)); // empty
|
|
||||||
|
|
||||||
db::RecursiveShapeIterator si1 (ly, top_cell, l1);
|
db::RecursiveShapeIterator si1 (ly, top_cell, l1);
|
||||||
si1.shape_flags (db::ShapeIterator::All | db::ShapeIterator::RegardProperties);
|
si1.shape_flags (db::ShapeIterator::All | db::ShapeIterator::RegardProperties);
|
||||||
|
|
@ -2260,6 +2259,77 @@ TEST(41_EdgesWithProperties)
|
||||||
db::compare_layouts (_this, target, tl::testdata () + "/algo/deep_region_au41.gds");
|
db::compare_layouts (_this, target, tl::testdata () + "/algo/deep_region_au41.gds");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(42_DRCWithProperties)
|
||||||
|
{
|
||||||
|
db::Layout ly;
|
||||||
|
{
|
||||||
|
std::string fn (tl::testdata ());
|
||||||
|
fn += "/algo/deep_region_42.gds";
|
||||||
|
tl::InputStream stream (fn);
|
||||||
|
db::Reader reader (stream);
|
||||||
|
reader.read (ly);
|
||||||
|
}
|
||||||
|
|
||||||
|
db::cell_index_type top_cell_index = *ly.begin_top_down ();
|
||||||
|
db::Cell &top_cell = ly.cell (top_cell_index);
|
||||||
|
|
||||||
|
db::DeepShapeStore dss;
|
||||||
|
|
||||||
|
unsigned int l1 = ly.get_layer (db::LayerProperties (1, 0));
|
||||||
|
unsigned int l2 = ly.get_layer (db::LayerProperties (2, 0));
|
||||||
|
|
||||||
|
db::RecursiveShapeIterator si1 (ly, top_cell, l1);
|
||||||
|
si1.shape_flags (db::ShapeIterator::All | db::ShapeIterator::RegardProperties);
|
||||||
|
db::Region r1 (si1, dss);
|
||||||
|
db::Region r1_nomerge (r1);
|
||||||
|
r1_nomerge.set_merged_semantics (false);
|
||||||
|
|
||||||
|
db::RecursiveShapeIterator si2 (ly, top_cell, l2);
|
||||||
|
si2.shape_flags (db::ShapeIterator::All | db::ShapeIterator::RegardProperties);
|
||||||
|
db::Region r2 (si2, dss);
|
||||||
|
db::Region r2_nomerge (r2);
|
||||||
|
r2_nomerge.set_merged_semantics (false);
|
||||||
|
|
||||||
|
db::Layout target;
|
||||||
|
unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index));
|
||||||
|
|
||||||
|
db::RegionCheckOptions opt;
|
||||||
|
opt.metrics = db::Projection;
|
||||||
|
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (1, 0)), r1);
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (2, 0)), r2);
|
||||||
|
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (10, 0)), r1.space_check (1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (11, 0)), r1.separation_check (r2, 1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (12, 0)), r2.space_check (1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (13, 0)), r1_nomerge.space_check (1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (14, 0)), r1_nomerge.separation_check (r2, 1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (15, 0)), r1.separation_check (r2_nomerge, 1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (16, 0)), r1_nomerge.separation_check (r2_nomerge, 1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (17, 0)), r2_nomerge.space_check (1000, opt));
|
||||||
|
|
||||||
|
opt.prop_constraint = db::NoPropertyConstraint;
|
||||||
|
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (20, 0)), r1.space_check (1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (21, 0)), r1.separation_check (r2, 1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (22, 0)), r2.space_check (1000, opt));
|
||||||
|
|
||||||
|
opt.prop_constraint = db::SamePropertiesConstraint;
|
||||||
|
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (30, 0)), r1.space_check (1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (31, 0)), r1.separation_check (r2, 1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (32, 0)), r2.space_check (1000, opt));
|
||||||
|
|
||||||
|
opt.prop_constraint = db::DifferentPropertiesConstraint;
|
||||||
|
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (40, 0)), r1.space_check (1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (41, 0)), r1.separation_check (r2, 1000, opt));
|
||||||
|
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (42, 0)), r2.space_check (1000, opt));
|
||||||
|
|
||||||
|
CHECKPOINT();
|
||||||
|
db::compare_layouts (_this, target, tl::testdata () + "/algo/deep_region_au42.gds");
|
||||||
|
}
|
||||||
|
|
||||||
TEST(100_Integration)
|
TEST(100_Integration)
|
||||||
{
|
{
|
||||||
db::Layout ly;
|
db::Layout ly;
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue