diff --git a/src/plugins/tools/netx/db_plugin/dbHierProcessor.cc b/src/plugins/tools/netx/db_plugin/dbHierProcessor.cc index e952f611f..9f8948a1e 100644 --- a/src/plugins/tools/netx/db_plugin/dbHierProcessor.cc +++ b/src/plugins/tools/netx/db_plugin/dbHierProcessor.cc @@ -70,6 +70,12 @@ BoolAndOrNotLocalOperation::BoolAndOrNotLocalOperation (bool is_and) // .. nothing yet .. } +LocalOperation::on_empty_intruder_mode +BoolAndOrNotLocalOperation::on_empty_intruder_hint () const +{ + return m_is_and ? LocalOperation::Drop : LocalOperation::Copy; +} + void BoolAndOrNotLocalOperation::compute_local (db::Layout *layout, const std::map > &interactions, std::set &result) const { @@ -496,7 +502,7 @@ void LocalProcessor::compute_contexts (db::LocalProcessorCellContext *parent_con std::map interactions; - // @@@ TODO: don't do this in AND more for instances without an intruder + // insert dummy interactions to handle at least the child cell vs. itself for (db::Cell::const_iterator i = cell->begin (); !i.at_end (); ++i) { interactions.insert (std::make_pair (&i->cell_inst (), interaction_value_type ())); } @@ -602,9 +608,11 @@ LocalProcessor::compute_local_cell (db::Cell *cell, const std::pair > interactions; db::box_convert inst_bci (*mp_layout, m_intruder_layer); - // @@@ TODO: don't do this in AND mode (we don't need interactions without an intruder) - for (db::Shapes::shape_iterator i = shapes_subject.begin (polygon_ref_flags ()); !i.at_end (); ++i) { - interactions.insert (std::make_pair (*i->basic_ptr (db::PolygonRef::tag ()), std::vector ())); + if (mp_op->on_empty_intruder_hint () != LocalOperation::Drop) { + // insert dummy interactions to accommodate subject vs. nothing + for (db::Shapes::shape_iterator i = shapes_subject.begin (polygon_ref_flags ()); !i.at_end (); ++i) { + interactions.insert (std::make_pair (*i->basic_ptr (db::PolygonRef::tag ()), std::vector ())); + } } if (! shapes_subject.empty () && ! (shapes_intruders.empty () && intruders.second.empty ())) { diff --git a/src/plugins/tools/netx/db_plugin/dbHierProcessor.h b/src/plugins/tools/netx/db_plugin/dbHierProcessor.h index 3522c7e8c..c97a2d7c3 100644 --- a/src/plugins/tools/netx/db_plugin/dbHierProcessor.h +++ b/src/plugins/tools/netx/db_plugin/dbHierProcessor.h @@ -41,10 +41,15 @@ class LocalProcessorCellContext; class DB_PLUGIN_PUBLIC LocalOperation { public: + enum on_empty_intruder_mode { + Ignore = 0, Copy, Drop + }; + LocalOperation () { } virtual ~LocalOperation () { } virtual void compute_local (db::Layout *layout, const std::map > &interactions, std::set &result) const = 0; + virtual on_empty_intruder_mode on_empty_intruder_hint () const = 0; }; class DB_PLUGIN_PUBLIC BoolAndOrNotLocalOperation @@ -54,6 +59,7 @@ public: BoolAndOrNotLocalOperation (bool is_and); virtual void compute_local (db::Layout *layout, const std::map > &interactions, std::set &result) const; + virtual on_empty_intruder_mode on_empty_intruder_hint () const; private: bool m_is_and;