WIP: templatized local hierarchical processor.

This commit is contained in:
Matthias Koefferlein 2019-02-10 18:39:32 +01:00
parent d35e86e189
commit dd4fcd9e36
6 changed files with 400 additions and 268 deletions

View File

@ -463,7 +463,7 @@ DeepRegion::and_or_not_with (const DeepRegion *other, bool and_op) const
db::BoolAndOrNotLocalOperation op (and_op); db::BoolAndOrNotLocalOperation op (and_op);
db::LocalProcessor proc (const_cast<db::Layout *> (&m_deep_layer.layout ()), const_cast<db::Cell *> (&m_deep_layer.initial_cell ()), &other->deep_layer ().layout (), &other->deep_layer ().initial_cell ()); db::local_processor<db::PolygonRef> proc (const_cast<db::Layout *> (&m_deep_layer.layout ()), const_cast<db::Cell *> (&m_deep_layer.initial_cell ()), &other->deep_layer ().layout (), &other->deep_layer ().initial_cell ());
proc.set_base_verbosity (base_verbosity ()); proc.set_base_verbosity (base_verbosity ());
proc.set_threads (m_deep_layer.store ()->threads ()); proc.set_threads (m_deep_layer.store ()->threads ());
proc.set_area_ratio (m_deep_layer.store ()->max_area_ratio ()); proc.set_area_ratio (m_deep_layer.store ()->max_area_ratio ());

File diff suppressed because it is too large Load Diff

View File

@ -42,19 +42,20 @@
namespace db namespace db
{ {
class LocalProcessor; template <class T> class local_processor;
class LocalProcessorCellContext; template <class T> class local_processor_cell_context;
class LocalProcessorContexts; template <class T> class local_processor_contexts;
// TODO: move this somewhere else? // TODO: move this somewhere else?
class DB_PUBLIC ShapeInteractions template <class T>
class DB_PUBLIC shape_interactions
{ {
public: public:
typedef std::unordered_map<unsigned int, std::vector<unsigned int> > container; typedef std::unordered_map<unsigned int, std::vector<unsigned int> > container;
typedef container::const_iterator iterator; typedef container::const_iterator iterator;
typedef container::value_type::second_type::const_iterator iterator2; typedef container::value_type::second_type::const_iterator iterator2;
ShapeInteractions (); shape_interactions ();
iterator begin () const iterator begin () const
{ {
@ -67,11 +68,11 @@ public:
} }
bool has_shape_id (unsigned int id) const; bool has_shape_id (unsigned int id) const;
void add_shape (unsigned int id, const db::PolygonRef &shape); void add_shape (unsigned int id, const T &shape);
void add_subject (unsigned int id, const db::PolygonRef &shape); void add_subject (unsigned int id, const T &shape);
void add_interaction (unsigned int subject_id, unsigned int intruder_id); void add_interaction (unsigned int subject_id, unsigned int intruder_id);
const std::vector<unsigned int> &intruders_for (unsigned int subject_id) const; const std::vector<unsigned int> &intruders_for (unsigned int subject_id) const;
const db::PolygonRef &shape (unsigned int id) const; const T &shape (unsigned int id) const;
unsigned int next_id () unsigned int next_id ()
{ {
@ -80,43 +81,45 @@ public:
private: private:
std::unordered_map<unsigned int, std::vector<unsigned int> > m_interactions; std::unordered_map<unsigned int, std::vector<unsigned int> > m_interactions;
std::unordered_map<unsigned int, db::PolygonRef> m_shapes; std::unordered_map<unsigned int, T> m_shapes;
unsigned int m_id; unsigned int m_id;
}; };
// TODO: should be hidden (private data?) // TODO: should be hidden (private data?)
struct DB_PUBLIC LocalProcessorCellDrop template <class T>
struct DB_PUBLIC local_processor_cell_drop
{ {
LocalProcessorCellDrop (db::LocalProcessorCellContext *_parent_context, db::Cell *_parent, const db::ICplxTrans &_cell_inst) local_processor_cell_drop (db::local_processor_cell_context<T> *_parent_context, db::Cell *_parent, const db::ICplxTrans &_cell_inst)
: parent_context (_parent_context), parent (_parent), cell_inst (_cell_inst) : parent_context (_parent_context), parent (_parent), cell_inst (_cell_inst)
{ {
// .. nothing yet .. // .. nothing yet ..
} }
db::LocalProcessorCellContext *parent_context; db::local_processor_cell_context<T> *parent_context;
db::Cell *parent; db::Cell *parent;
db::ICplxTrans cell_inst; db::ICplxTrans cell_inst;
}; };
// TODO: should be hidden (private data?) // TODO: should be hidden (private data?)
class DB_PUBLIC LocalProcessorCellContext template <class T>
class DB_PUBLIC local_processor_cell_context
{ {
public: public:
typedef std::pair<const db::Cell *, db::ICplxTrans> parent_inst_type; typedef std::pair<const db::Cell *, db::ICplxTrans> parent_inst_type;
typedef std::vector<LocalProcessorCellDrop>::const_iterator drop_iterator; typedef typename std::vector<local_processor_cell_drop<T> >::const_iterator drop_iterator;
LocalProcessorCellContext (); local_processor_cell_context ();
LocalProcessorCellContext (const LocalProcessorCellContext &other); local_processor_cell_context (const local_processor_cell_context &other);
void add (db::LocalProcessorCellContext *parent_context, db::Cell *parent, const db::ICplxTrans &cell_inst); void add (db::local_processor_cell_context<T> *parent_context, db::Cell *parent, const db::ICplxTrans &cell_inst);
void propagate (const std::unordered_set<db::PolygonRef> &res); void propagate (const std::unordered_set<T> &res);
std::unordered_set<db::PolygonRef> &propagated () std::unordered_set<T> &propagated ()
{ {
return m_propagated; return m_propagated;
} }
const std::unordered_set<db::PolygonRef> &propagated () const const std::unordered_set<T> &propagated () const
{ {
return m_propagated; return m_propagated;
} }
@ -144,24 +147,25 @@ public:
} }
private: private:
std::unordered_set<db::PolygonRef> m_propagated; std::unordered_set<T> m_propagated;
std::vector<LocalProcessorCellDrop> m_drops; std::vector<local_processor_cell_drop<T> > m_drops;
tl::Mutex m_lock; tl::Mutex m_lock;
}; };
class DB_PUBLIC LocalProcessorCellContexts template <class T>
class DB_PUBLIC local_processor_cell_contexts
{ {
public: public:
typedef std::pair<std::set<CellInstArray>, std::set<db::PolygonRef> > context_key_type; typedef std::pair<std::set<CellInstArray>, std::set<T> > context_key_type;
typedef std::unordered_map<context_key_type, db::LocalProcessorCellContext> context_map_type; typedef std::unordered_map<context_key_type, db::local_processor_cell_context<T> > context_map_type;
typedef context_map_type::const_iterator iterator; typedef typename context_map_type::const_iterator iterator;
LocalProcessorCellContexts (); local_processor_cell_contexts ();
LocalProcessorCellContexts (const db::Cell *intruder_cell); local_processor_cell_contexts (const db::Cell *intruder_cell);
db::LocalProcessorCellContext *find_context (const context_key_type &intruders); db::local_processor_cell_context<T> *find_context (const context_key_type &intruders);
db::LocalProcessorCellContext *create (const context_key_type &intruders); db::local_processor_cell_context<T> *create (const context_key_type &intruders);
void compute_results (const LocalProcessorContexts &contexts, db::Cell *cell, const LocalOperation *op, unsigned int output_layer, const LocalProcessor *proc); void compute_results (const local_processor_contexts<T> &contexts, db::Cell *cell, const local_operation<T> *op, unsigned int output_layer, const local_processor<T> *proc);
iterator begin () const iterator begin () const
{ {
@ -175,22 +179,23 @@ public:
private: private:
const db::Cell *mp_intruder_cell; const db::Cell *mp_intruder_cell;
std::unordered_map<context_key_type, db::LocalProcessorCellContext> m_contexts; std::unordered_map<context_key_type, db::local_processor_cell_context<T> > m_contexts;
}; };
class DB_PUBLIC LocalProcessorContexts template <class T>
class DB_PUBLIC local_processor_contexts
{ {
public: public:
typedef std::unordered_map<db::Cell *, LocalProcessorCellContexts> contexts_per_cell_type; typedef std::unordered_map<db::Cell *, local_processor_cell_contexts<T> > contexts_per_cell_type;
typedef contexts_per_cell_type::iterator iterator; typedef typename contexts_per_cell_type::iterator iterator;
LocalProcessorContexts () local_processor_contexts ()
: m_subject_layer (0), m_intruder_layer (0) : m_subject_layer (0), m_intruder_layer (0)
{ {
// .. nothing yet .. // .. nothing yet ..
} }
LocalProcessorContexts (const LocalProcessorContexts &other) local_processor_contexts (const local_processor_contexts &other)
: m_contexts_per_cell (other.m_contexts_per_cell), m_subject_layer (other.m_subject_layer), m_intruder_layer (other.m_intruder_layer) : m_contexts_per_cell (other.m_contexts_per_cell), m_subject_layer (other.m_subject_layer), m_intruder_layer (other.m_intruder_layer)
{ {
// .. nothing yet .. // .. nothing yet ..
@ -201,11 +206,11 @@ public:
m_contexts_per_cell.clear (); m_contexts_per_cell.clear ();
} }
LocalProcessorCellContexts &contexts_per_cell (db::Cell *subject_cell, const db::Cell *intruder_cell) local_processor_cell_contexts<T> &contexts_per_cell (db::Cell *subject_cell, const db::Cell *intruder_cell)
{ {
contexts_per_cell_type::iterator ctx = m_contexts_per_cell.find (subject_cell); typename contexts_per_cell_type::iterator ctx = m_contexts_per_cell.find (subject_cell);
if (ctx == m_contexts_per_cell.end ()) { if (ctx == m_contexts_per_cell.end ()) {
ctx = m_contexts_per_cell.insert (std::make_pair (subject_cell, LocalProcessorCellContexts (intruder_cell))).first; ctx = m_contexts_per_cell.insert (std::make_pair (subject_cell, local_processor_cell_contexts<T> (intruder_cell))).first;
} }
return ctx->second; return ctx->second;
} }
@ -256,30 +261,32 @@ private:
mutable tl::Mutex m_lock; mutable tl::Mutex m_lock;
}; };
class DB_PUBLIC LocalProcessorContextComputationTask template <class T>
class DB_PUBLIC local_processor_context_computation_task
: public tl::Task : public tl::Task
{ {
public: public:
LocalProcessorContextComputationTask (const LocalProcessor *proc, LocalProcessorContexts &contexts, db::LocalProcessorCellContext *parent_context, db::Cell *subject_parent, db::Cell *subject_cell, const db::ICplxTrans &subject_cell_inst, const db::Cell *intruder_cell, LocalProcessorCellContexts::context_key_type &intruders, db::Coord dist); local_processor_context_computation_task (const local_processor<T> *proc, local_processor_contexts<T> &contexts, db::local_processor_cell_context<T> *parent_context, db::Cell *subject_parent, db::Cell *subject_cell, const db::ICplxTrans &subject_cell_inst, const db::Cell *intruder_cell, typename local_processor_cell_contexts<T>::context_key_type &intruders, db::Coord dist);
void perform (); void perform ();
private: private:
const LocalProcessor *mp_proc; const local_processor<T> *mp_proc;
LocalProcessorContexts *mp_contexts; local_processor_contexts<T> *mp_contexts;
db::LocalProcessorCellContext *mp_parent_context; db::local_processor_cell_context<T> *mp_parent_context;
db::Cell *mp_subject_parent; db::Cell *mp_subject_parent;
db::Cell *mp_subject_cell; db::Cell *mp_subject_cell;
db::ICplxTrans m_subject_cell_inst; db::ICplxTrans m_subject_cell_inst;
const db::Cell *mp_intruder_cell; const db::Cell *mp_intruder_cell;
LocalProcessorCellContexts::context_key_type m_intruders; typename local_processor_cell_contexts<T>::context_key_type m_intruders;
db::Coord m_dist; db::Coord m_dist;
}; };
class DB_PUBLIC LocalProcessorContextComputationWorker template <class T>
class DB_PUBLIC local_processor_context_computation_worker
: public tl::Worker : public tl::Worker
{ {
public: public:
LocalProcessorContextComputationWorker () local_processor_context_computation_worker ()
: tl::Worker () : tl::Worker ()
{ {
// .. nothing yet .. // .. nothing yet ..
@ -287,31 +294,33 @@ public:
void perform_task (tl::Task *task) void perform_task (tl::Task *task)
{ {
static_cast<LocalProcessorContextComputationTask *> (task)->perform (); static_cast<local_processor_context_computation_task<T> *> (task)->perform ();
} }
}; };
class DB_PUBLIC LocalProcessorResultComputationTask template <class T>
class DB_PUBLIC local_processor_result_computation_task
: public tl::Task : public tl::Task
{ {
public: public:
LocalProcessorResultComputationTask (const LocalProcessor *proc, LocalProcessorContexts &contexts, db::Cell *cell, LocalProcessorCellContexts *cell_contexts, const LocalOperation *op, unsigned int output_layer); local_processor_result_computation_task (const local_processor<T> *proc, local_processor_contexts<T> &contexts, db::Cell *cell, local_processor_cell_contexts<T> *cell_contexts, const local_operation<T> *op, unsigned int output_layer);
void perform (); void perform ();
private: private:
const LocalProcessor *mp_proc; const local_processor<T> *mp_proc;
LocalProcessorContexts *mp_contexts; local_processor_contexts<T> *mp_contexts;
db::Cell *mp_cell; db::Cell *mp_cell;
LocalProcessorCellContexts *mp_cell_contexts; local_processor_cell_contexts<T> *mp_cell_contexts;
const LocalOperation *mp_op; const local_operation<T> *mp_op;
unsigned int m_output_layer; unsigned int m_output_layer;
}; };
class DB_PUBLIC LocalProcessorResultComputationWorker template <class T>
class DB_PUBLIC local_processor_result_computation_worker
: public tl::Worker : public tl::Worker
{ {
public: public:
LocalProcessorResultComputationWorker () local_processor_result_computation_worker ()
: tl::Worker () : tl::Worker ()
{ {
// .. nothing yet .. // .. nothing yet ..
@ -319,18 +328,19 @@ public:
void perform_task (tl::Task *task) void perform_task (tl::Task *task)
{ {
static_cast<LocalProcessorResultComputationTask *> (task)->perform (); static_cast<local_processor_result_computation_task<T> *> (task)->perform ();
} }
}; };
class DB_PUBLIC LocalProcessor template <class T>
class DB_PUBLIC local_processor
{ {
public: public:
LocalProcessor (db::Layout *layout, db::Cell *top); local_processor (db::Layout *layout, db::Cell *top);
LocalProcessor (db::Layout *subject_layout, db::Cell *subject_top, const db::Layout *intruder_layout, const db::Cell *intruder_cell); local_processor (db::Layout *subject_layout, db::Cell *subject_top, const db::Layout *intruder_layout, const db::Cell *intruder_cell);
void run (LocalOperation *op, unsigned int subject_layer, unsigned int intruder_layer, unsigned int output_layer); void run (local_operation<T> *op, unsigned int subject_layer, unsigned int intruder_layer, unsigned int output_layer);
void compute_contexts (LocalProcessorContexts &contexts, const LocalOperation *op, unsigned int subject_layer, unsigned int intruder_layer) const; void compute_contexts (local_processor_contexts<T> &contexts, const local_operation<T> *op, unsigned int subject_layer, unsigned int intruder_layer) const;
void compute_results (LocalProcessorContexts &contexts, const LocalOperation *op, unsigned int output_layer) const; void compute_results (local_processor_contexts<T> &contexts, const local_operation<T> *op, unsigned int output_layer) const;
void set_description (const std::string &d) void set_description (const std::string &d)
{ {
@ -378,8 +388,8 @@ public:
} }
private: private:
friend class LocalProcessorCellContexts; template<typename> friend class local_processor_cell_contexts;
friend class LocalProcessorContextComputationTask; template<typename> friend class local_processor_context_computation_task;
db::Layout *mp_subject_layout; db::Layout *mp_subject_layout;
const db::Layout *mp_intruder_layout; const db::Layout *mp_intruder_layout;
@ -390,14 +400,14 @@ private:
size_t m_max_vertex_count; size_t m_max_vertex_count;
double m_area_ratio; double m_area_ratio;
int m_base_verbosity; int m_base_verbosity;
mutable std::auto_ptr<tl::Job<LocalProcessorContextComputationWorker> > mp_cc_job; mutable std::auto_ptr<tl::Job<local_processor_context_computation_worker<T> > > mp_cc_job;
std::string description (const LocalOperation *op) const; std::string description (const local_operation<T> *op) const;
void compute_contexts (db::LocalProcessorContexts &contexts, db::LocalProcessorCellContext *parent_context, db::Cell *subject_parent, db::Cell *subject_cell, const db::ICplxTrans &subject_cell_inst, const db::Cell *intruder_cell, const LocalProcessorCellContexts::context_key_type &intruders, db::Coord dist) const; void compute_contexts (db::local_processor_contexts<T> &contexts, db::local_processor_cell_context<T> *parent_context, db::Cell *subject_parent, db::Cell *subject_cell, const db::ICplxTrans &subject_cell_inst, const db::Cell *intruder_cell, const typename local_processor_cell_contexts<T>::context_key_type &intruders, db::Coord dist) const;
void do_compute_contexts (db::LocalProcessorCellContext *cell_context, const db::LocalProcessorContexts &contexts, db::LocalProcessorCellContext *parent_context, db::Cell *subject_parent, db::Cell *subject_cell, const db::ICplxTrans &subject_cell_inst, const db::Cell *intruder_cell, const LocalProcessorCellContexts::context_key_type &intruders, db::Coord dist) const; void do_compute_contexts (db::local_processor_cell_context<T> *cell_context, const db::local_processor_contexts<T> &contexts, db::local_processor_cell_context<T> *parent_context, db::Cell *subject_parent, db::Cell *subject_cell, const db::ICplxTrans &subject_cell_inst, const db::Cell *intruder_cell, const typename local_processor_cell_contexts<T>::context_key_type &intruders, db::Coord dist) const;
void issue_compute_contexts (db::LocalProcessorContexts &contexts, db::LocalProcessorCellContext *parent_context, db::Cell *subject_parent, db::Cell *subject_cell, const db::ICplxTrans &subject_cell_inst, const db::Cell *intruder_cell, LocalProcessorCellContexts::context_key_type &intruders, db::Coord dist) const; void issue_compute_contexts (db::local_processor_contexts<T> &contexts, db::local_processor_cell_context<T> *parent_context, db::Cell *subject_parent, db::Cell *subject_cell, const db::ICplxTrans &subject_cell_inst, const db::Cell *intruder_cell, typename local_processor_cell_contexts<T>::context_key_type &intruders, db::Coord dist) const;
void push_results (db::Cell *cell, unsigned int output_layer, const std::unordered_set<db::PolygonRef> &result) const; void push_results (db::Cell *cell, unsigned int output_layer, const std::unordered_set<T> &result) const;
void compute_local_cell (const db::LocalProcessorContexts &contexts, db::Cell *subject_cell, const db::Cell *intruder_cell, const LocalOperation *op, const LocalProcessorCellContexts::context_key_type &intruders, std::unordered_set<db::PolygonRef> &result) const; void compute_local_cell (const db::local_processor_contexts<T> &contexts, db::Cell *subject_cell, const db::Cell *intruder_cell, const local_operation<T> *op, const typename local_processor_cell_contexts<T>::context_key_type &intruders, std::unordered_set<T> &result) const;
}; };
} }
@ -405,8 +415,8 @@ private:
namespace tl namespace tl
{ {
template <> template <class T>
struct type_traits<db::LocalProcessor> : public tl::type_traits<void> struct type_traits<db::local_processor<T> > : public tl::type_traits<void>
{ {
// mark "LocalProcessor" as not having a default ctor and no copy ctor // mark "LocalProcessor" as not having a default ctor and no copy ctor
typedef tl::false_tag has_default_constructor; typedef tl::false_tag has_default_constructor;

View File

@ -45,10 +45,10 @@ BoolAndOrNotLocalOperation::BoolAndOrNotLocalOperation (bool is_and)
// .. nothing yet .. // .. nothing yet ..
} }
LocalOperation::on_empty_intruder_mode local_operation<db::PolygonRef>::on_empty_intruder_mode
BoolAndOrNotLocalOperation::on_empty_intruder_hint () const BoolAndOrNotLocalOperation::on_empty_intruder_hint () const
{ {
return m_is_and ? LocalOperation::Drop : LocalOperation::Copy; return m_is_and ? local_operation::Drop : local_operation::Copy;
} }
std::string std::string
@ -58,20 +58,20 @@ BoolAndOrNotLocalOperation::description () const
} }
void void
BoolAndOrNotLocalOperation::compute_local (db::Layout *layout, const ShapeInteractions &interactions, std::unordered_set<db::PolygonRef> &result, size_t max_vertex_count, double area_ratio) const BoolAndOrNotLocalOperation::compute_local (db::Layout *layout, const shape_interactions<db::PolygonRef> &interactions, std::unordered_set<db::PolygonRef> &result, size_t max_vertex_count, double area_ratio) const
{ {
db::EdgeProcessor ep; db::EdgeProcessor ep;
size_t p1 = 0, p2 = 1; size_t p1 = 0, p2 = 1;
std::set<db::PolygonRef> others; std::set<db::PolygonRef> others;
for (ShapeInteractions::iterator i = interactions.begin (); i != interactions.end (); ++i) { for (shape_interactions<db::PolygonRef>::iterator i = interactions.begin (); i != interactions.end (); ++i) {
for (ShapeInteractions::iterator2 j = i->second.begin (); j != i->second.end (); ++j) { for (shape_interactions<db::PolygonRef>::iterator2 j = i->second.begin (); j != i->second.end (); ++j) {
others.insert (interactions.shape (*j)); others.insert (interactions.shape (*j));
} }
} }
for (ShapeInteractions::iterator i = interactions.begin (); i != interactions.end (); ++i) { for (shape_interactions<db::PolygonRef>::iterator i = interactions.begin (); i != interactions.end (); ++i) {
const db::PolygonRef &subject = interactions.shape (i->first); const db::PolygonRef &subject = interactions.shape (i->first);
if (others.find (subject) != others.end ()) { if (others.find (subject) != others.end ()) {
@ -119,7 +119,7 @@ SelfOverlapMergeLocalOperation::SelfOverlapMergeLocalOperation (unsigned int wra
// .. nothing yet .. // .. nothing yet ..
} }
void SelfOverlapMergeLocalOperation::compute_local (db::Layout *layout, const ShapeInteractions &interactions, std::unordered_set<db::PolygonRef> &result, size_t /*max_vertex_count*/, double /*area_ratio*/) const void SelfOverlapMergeLocalOperation::compute_local (db::Layout *layout, const shape_interactions<db::PolygonRef> &interactions, std::unordered_set<db::PolygonRef> &result, size_t /*max_vertex_count*/, double /*area_ratio*/) const
{ {
if (m_wrap_count == 0) { if (m_wrap_count == 0) {
return; return;
@ -130,7 +130,7 @@ void SelfOverlapMergeLocalOperation::compute_local (db::Layout *layout, const Sh
size_t p1 = 0, p2 = 1; size_t p1 = 0, p2 = 1;
std::set<unsigned int> seen; std::set<unsigned int> seen;
for (ShapeInteractions::iterator i = interactions.begin (); i != interactions.end (); ++i) { for (shape_interactions<db::PolygonRef>::iterator i = interactions.begin (); i != interactions.end (); ++i) {
if (seen.find (i->first) == seen.end ()) { if (seen.find (i->first) == seen.end ()) {
seen.insert (i->first); seen.insert (i->first);
@ -141,7 +141,7 @@ void SelfOverlapMergeLocalOperation::compute_local (db::Layout *layout, const Sh
p1 += 2; p1 += 2;
} }
for (db::ShapeInteractions::iterator2 o = i->second.begin (); o != i->second.end (); ++o) { for (db::shape_interactions<db::PolygonRef>::iterator2 o = i->second.begin (); o != i->second.end (); ++o) {
// don't take the same (really the same, not an identical one) shape twice - the interaction // don't take the same (really the same, not an identical one) shape twice - the interaction
// set does not take care to list just one copy of the same item on the intruder side. // set does not take care to list just one copy of the same item on the intruder side.
if (seen.find (*o) == seen.end ()) { if (seen.find (*o) == seen.end ()) {
@ -165,7 +165,7 @@ void SelfOverlapMergeLocalOperation::compute_local (db::Layout *layout, const Sh
SelfOverlapMergeLocalOperation::on_empty_intruder_mode SelfOverlapMergeLocalOperation::on_empty_intruder_hint () const SelfOverlapMergeLocalOperation::on_empty_intruder_mode SelfOverlapMergeLocalOperation::on_empty_intruder_hint () const
{ {
return m_wrap_count > 1 ? LocalOperation::Drop : LocalOperation::Copy; return m_wrap_count > 1 ? local_operation::Drop : local_operation::Copy;
} }
std::string SelfOverlapMergeLocalOperation::description () const std::string SelfOverlapMergeLocalOperation::description () const

View File

@ -36,7 +36,7 @@
namespace db namespace db
{ {
class ShapeInteractions; template <class T> class shape_interactions;
/** /**
* @brief A base class for "local operations" * @brief A base class for "local operations"
@ -49,7 +49,8 @@ class ShapeInteractions;
* This class implements the actual operation. It receives a * This class implements the actual operation. It receives a
* cluster of subject shapes vs. corresponding intruder shapes. * cluster of subject shapes vs. corresponding intruder shapes.
*/ */
class DB_PUBLIC LocalOperation template <class T>
class DB_PUBLIC local_operation
{ {
public: public:
/** /**
@ -75,12 +76,12 @@ public:
/** /**
* @brief Constructor * @brief Constructor
*/ */
LocalOperation () { } local_operation () { }
/** /**
* @brief Destructor * @brief Destructor
*/ */
virtual ~LocalOperation () { } virtual ~local_operation () { }
/** /**
* @brief Computes the results from a given set of interacting shapes * @brief Computes the results from a given set of interacting shapes
@ -88,7 +89,7 @@ public:
* @param interactions The interaction set * @param interactions The interaction set
* @param result The container to which the results are written * @param result The container to which the results are written
*/ */
virtual void compute_local (db::Layout *layout, const ShapeInteractions &interactions, std::unordered_set<db::PolygonRef> &result, size_t max_vertex_count, double area_ratio) const = 0; virtual void compute_local (db::Layout *layout, const shape_interactions<T> &interactions, std::unordered_set<T> &result, size_t max_vertex_count, double area_ratio) const = 0;
/** /**
* @brief Indicates the desired behaviour when a shape does not have an intruder * @brief Indicates the desired behaviour when a shape does not have an intruder
@ -111,12 +112,12 @@ public:
* @brief Implements a boolean AND or NOT operation * @brief Implements a boolean AND or NOT operation
*/ */
class DB_PUBLIC BoolAndOrNotLocalOperation class DB_PUBLIC BoolAndOrNotLocalOperation
: public LocalOperation : public local_operation<db::PolygonRef>
{ {
public: public:
BoolAndOrNotLocalOperation (bool is_and); BoolAndOrNotLocalOperation (bool is_and);
virtual void compute_local (db::Layout *layout, const ShapeInteractions &interactions, std::unordered_set<db::PolygonRef> &result, size_t max_vertex_count, double area_ratio) const; virtual void compute_local (db::Layout *layout, const shape_interactions<db::PolygonRef> &interactions, 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 on_empty_intruder_mode on_empty_intruder_hint () const;
virtual std::string description () const; virtual std::string description () const;
@ -130,12 +131,12 @@ private:
* the original shapes overlap at least "wrap_count" times. * the original shapes overlap at least "wrap_count" times.
*/ */
class DB_PUBLIC SelfOverlapMergeLocalOperation class DB_PUBLIC SelfOverlapMergeLocalOperation
: public LocalOperation : public local_operation<db::PolygonRef>
{ {
public: public:
SelfOverlapMergeLocalOperation (unsigned int wrap_count); SelfOverlapMergeLocalOperation (unsigned int wrap_count);
virtual void compute_local (db::Layout *layout, const ShapeInteractions &interactions, std::unordered_set<db::PolygonRef> &result, size_t max_vertex_count, double area_ratio) const; virtual void compute_local (db::Layout *layout, const shape_interactions<db::PolygonRef> &interactions, 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 on_empty_intruder_mode on_empty_intruder_hint () const;
virtual std::string description () const; virtual std::string description () const;

View File

@ -55,11 +55,11 @@ public:
// .. nothing yet .. // .. nothing yet ..
} }
virtual void compute_local (db::Layout *layout, const db::ShapeInteractions &interactions, std::unordered_set<db::PolygonRef> &result, size_t max_vertex_count, double area_ratio) const virtual void compute_local (db::Layout *layout, const db::shape_interactions<db::PolygonRef> &interactions, std::unordered_set<db::PolygonRef> &result, size_t max_vertex_count, double area_ratio) const
{ {
db::ShapeInteractions sized_interactions = interactions; db::shape_interactions<db::PolygonRef> sized_interactions = interactions;
for (db::ShapeInteractions::iterator i = sized_interactions.begin (); i != sized_interactions.end (); ++i) { for (db::shape_interactions<db::PolygonRef>::iterator i = sized_interactions.begin (); i != sized_interactions.end (); ++i) {
for (db::ShapeInteractions::iterator2 j = i->second.begin (); j != i->second.end (); ++j) { for (db::shape_interactions<db::PolygonRef>::iterator2 j = i->second.begin (); j != i->second.end (); ++j) {
const db::PolygonRef &ref = interactions.shape (*j); const db::PolygonRef &ref = interactions.shape (*j);
db::Polygon poly = ref.obj ().transformed (ref.trans ()); db::Polygon poly = ref.obj ().transformed (ref.trans ());
poly.size (m_dist, m_dist); poly.size (m_dist, m_dist);
@ -91,17 +91,17 @@ public:
// .. nothing yet .. // .. nothing yet ..
} }
virtual void compute_local (db::Layout *layout, const db::ShapeInteractions &interactions, std::unordered_set<db::PolygonRef> &result, size_t max_vertex_count, double area_ratio) const virtual void compute_local (db::Layout *layout, const db::shape_interactions<db::PolygonRef> &interactions, std::unordered_set<db::PolygonRef> &result, size_t max_vertex_count, double area_ratio) const
{ {
db::ShapeInteractions sized_interactions = interactions; db::shape_interactions<db::PolygonRef> sized_interactions = interactions;
for (db::ShapeInteractions::iterator i = sized_interactions.begin (); i != sized_interactions.end (); ++i) { for (db::shape_interactions<db::PolygonRef>::iterator i = sized_interactions.begin (); i != sized_interactions.end (); ++i) {
const db::PolygonRef &ref = interactions.shape (i->first); const db::PolygonRef &ref = interactions.shape (i->first);
db::Polygon poly = ref.obj ().transformed (ref.trans ()); db::Polygon poly = ref.obj ().transformed (ref.trans ());
poly.size (m_dist / 2, m_dist / 2); poly.size (m_dist / 2, m_dist / 2);
sized_interactions.add_shape (i->first, db::PolygonRef (poly, layout->shape_repository ())); sized_interactions.add_shape (i->first, db::PolygonRef (poly, layout->shape_repository ()));
for (db::ShapeInteractions::iterator2 j = i->second.begin (); j != i->second.end (); ++j) { for (db::shape_interactions<db::PolygonRef>::iterator2 j = i->second.begin (); j != i->second.end (); ++j) {
const db::PolygonRef &ref = interactions.shape (*j); const db::PolygonRef &ref = interactions.shape (*j);
db::Polygon poly = ref.obj ().transformed (ref.trans ()); db::Polygon poly = ref.obj ().transformed (ref.trans ());
poly.size (m_dist / 2, m_dist / 2); poly.size (m_dist / 2, m_dist / 2);
@ -140,15 +140,15 @@ static void normalize_layer (db::Layout &layout, unsigned int layer)
} }
static std::string contexts_to_s (db::Layout *layout, db::LocalProcessorContexts &contexts) static std::string contexts_to_s (db::Layout *layout, db::local_processor_contexts<db::PolygonRef> &contexts)
{ {
std::string res; std::string res;
for (db::Layout::top_down_const_iterator i = layout->begin_top_down (); i != layout->end_top_down(); ++i) { for (db::Layout::top_down_const_iterator i = layout->begin_top_down (); i != layout->end_top_down(); ++i) {
db::LocalProcessorContexts::iterator cc = contexts.context_map ().find (&layout->cell (*i)); db::local_processor_contexts<db::PolygonRef>::iterator cc = contexts.context_map ().find (&layout->cell (*i));
if (cc != contexts.context_map ().end ()) { if (cc != contexts.context_map ().end ()) {
int index = 1; int index = 1;
for (db::LocalProcessorCellContexts::iterator j = cc->second.begin (); j != cc->second.end (); ++j) { for (db::local_processor_cell_contexts<db::PolygonRef>::iterator j = cc->second.begin (); j != cc->second.end (); ++j) {
res += tl::sprintf ("%s[%d] %d insts, %d shapes (%d times)\n", layout->cell_name (*i), index, int (j->first.first.size ()), int (j->first.second.size ()), int (j->second.size ())); res += tl::sprintf ("%s[%d] %d insts, %d shapes (%d times)\n", layout->cell_name (*i), index, int (j->first.first.size ()), int (j->first.second.size ()), int (j->second.size ()));
index += 1; index += 1;
} }
@ -203,7 +203,7 @@ static void run_test_bool_gen (tl::TestBase *_this, const char *file, TestMode m
normalize_layer (layout_org, l2); normalize_layer (layout_org, l2);
} }
db::LocalOperation *lop = 0; db::local_operation<db::PolygonRef> *lop = 0;
db::BoolAndOrNotLocalOperation bool_op (mode == TMAnd || mode == TMAndSwapped); db::BoolAndOrNotLocalOperation bool_op (mode == TMAnd || mode == TMAndSwapped);
db::SelfOverlapMergeLocalOperation self_intersect_op (2); db::SelfOverlapMergeLocalOperation self_intersect_op (2);
BoolAndOrNotWithSizedLocalOperation sized_bool_op (mode == TMAnd || mode == TMAndSwapped, dist); BoolAndOrNotWithSizedLocalOperation sized_bool_op (mode == TMAnd || mode == TMAndSwapped, dist);
@ -224,7 +224,7 @@ static void run_test_bool_gen (tl::TestBase *_this, const char *file, TestMode m
if (single) { if (single) {
db::LocalProcessor proc (&layout_org, &layout_org.cell (*layout_org.begin_top_down ())); db::local_processor<db::PolygonRef> proc (&layout_org, &layout_org.cell (*layout_org.begin_top_down ()));
proc.set_threads (nthreads); proc.set_threads (nthreads);
proc.set_area_ratio (3.0); proc.set_area_ratio (3.0);
proc.set_max_vertex_count (16); proc.set_max_vertex_count (16);
@ -232,7 +232,7 @@ static void run_test_bool_gen (tl::TestBase *_this, const char *file, TestMode m
if (! context_doc) { if (! context_doc) {
proc.run (lop, l1, l2, lout); proc.run (lop, l1, l2, lout);
} else { } else {
db::LocalProcessorContexts contexts; db::local_processor_contexts<db::PolygonRef> contexts;
proc.compute_contexts (contexts, lop, l1, l2); proc.compute_contexts (contexts, lop, l1, l2);
*context_doc = contexts_to_s (&layout_org, contexts); *context_doc = contexts_to_s (&layout_org, contexts);
proc.compute_results (contexts, lop, lout); proc.compute_results (contexts, lop, lout);
@ -242,7 +242,7 @@ static void run_test_bool_gen (tl::TestBase *_this, const char *file, TestMode m
db::Layout layout_org2 = layout_org; db::Layout layout_org2 = layout_org;
db::LocalProcessor proc (&layout_org, &layout_org.cell (*layout_org.begin_top_down ()), &layout_org2, &layout_org2.cell (*layout_org2.begin_top_down ())); db::local_processor<db::PolygonRef> proc (&layout_org, &layout_org.cell (*layout_org.begin_top_down ()), &layout_org2, &layout_org2.cell (*layout_org2.begin_top_down ()));
proc.set_threads (nthreads); proc.set_threads (nthreads);
proc.set_area_ratio (3.0); proc.set_area_ratio (3.0);
proc.set_max_vertex_count (16); proc.set_max_vertex_count (16);
@ -250,7 +250,7 @@ static void run_test_bool_gen (tl::TestBase *_this, const char *file, TestMode m
if (! context_doc) { if (! context_doc) {
proc.run (lop, l1, l2, lout); proc.run (lop, l1, l2, lout);
} else { } else {
db::LocalProcessorContexts contexts; db::local_processor_contexts<db::PolygonRef> contexts;
proc.compute_contexts (contexts, lop, l1, l2); proc.compute_contexts (contexts, lop, l1, l2);
*context_doc = contexts_to_s (&layout_org, contexts); *context_doc = contexts_to_s (&layout_org, contexts);
proc.compute_results (contexts, lop, lout); proc.compute_results (contexts, lop, lout);