diff --git a/src/db/db/db.pro b/src/db/db/db.pro index 0b2eaeaeb..ef6d26aa5 100644 --- a/src/db/db/db.pro +++ b/src/db/db/db.pro @@ -292,7 +292,8 @@ HEADERS = \ dbLayoutToNetlistWriter.h \ dbLayoutToNetlistFormatDefs.h \ dbDeviceAbstract.h \ - dbLocalOperationUtils.h + dbLocalOperationUtils.h \ + dbDeepRegion.h !equals(HAVE_QT, "0") { diff --git a/src/db/db/dbHierProcessor.cc b/src/db/db/dbHierProcessor.cc index 21729cb86..c84236f9d 100644 --- a/src/db/db/dbHierProcessor.cc +++ b/src/db/db/dbHierProcessor.cc @@ -772,6 +772,23 @@ LocalProcessorResultComputationTask::perform () // erase the contexts we don't need any longer { tl::MutexLocker locker (& mp_contexts->lock ()); + +#if defined(ENABLE_DB_HP_SANITY_ASSERTIONS) + std::set td; + for (db::LocalProcessorCellContexts::iterator i = mp_cell_contexts->begin (); i != mp_cell_contexts->end (); ++i) { + td.insert (&i->second); + } + for (db::LocalProcessorContexts::contexts_per_cell_type::iterator pcc = mp_contexts->context_map ().begin (); pcc != mp_contexts->context_map ().end (); ++pcc) { + for (db::LocalProcessorCellContexts::iterator i = pcc->second.begin (); i != pcc->second.end (); ++i) { + for (db::LocalProcessorCellContext::drop_iterator j = i->second.begin_drops (); j != i->second.end_drops (); ++j) { + if (td.find (j->parent_context) != td.end ()) { + tl_assert (false); + } + } + } + } +#endif + mp_contexts->context_map ().erase (mp_cell); } } @@ -892,6 +909,23 @@ void LocalProcessor::compute_contexts (LocalProcessorContexts &contexts, db::LocalProcessorCellContexts &cell_contexts = contexts.contexts_per_cell (subject_cell, intruder_cell); +#if defined(ENABLE_DB_HP_SANITY_ASSERTIONS) + if (subject_parent) { + db::LocalProcessorContexts::contexts_per_cell_type::iterator pcc = contexts.context_map ().find (subject_parent); + if (pcc == contexts.context_map ().end ()) { + tl_assert (false); + } + tl_assert (pcc->first == subject_parent); + bool any = false; + for (db::LocalProcessorCellContexts::iterator pcci = pcc->second.begin (); pcci != pcc->second.end () && !any; ++pcci) { + any = (&pcci->second == parent_context); + } + if (!any) { + tl_assert (false); + } + } + #endif + cell_context = cell_contexts.find_context (intruders); if (cell_context) { // we already have a context for this intruder scheme @@ -1087,23 +1121,24 @@ LocalProcessor::compute_results (LocalProcessorContexts &contexts, const LocalOp std::vector next_cells_bu; next_cells_bu.reserve (cells_bu.size ()); - std::list tasks; - for (std::vector::const_iterator bu = cells_bu.begin (); bu != cells_bu.end (); ++bu) { - if (later.find (*bu) == later.end ()) { + LocalProcessorContexts::iterator cpc = contexts.context_map ().find (&mp_subject_layout->cell (*bu)); + if (cpc != contexts.context_map ().end ()) { + + if (later.find (*bu) == later.end ()) { - LocalProcessorContexts::iterator cpc = contexts.context_map ().find (&mp_subject_layout->cell (*bu)); - if (cpc != contexts.context_map ().end ()) { rc_job->schedule (new LocalProcessorResultComputationTask (this, contexts, cpc->first, &cpc->second, op, output_layer)); any = true; - for (db::Cell::parent_cell_iterator pc = cpc->first->begin_parent_cells (); pc != cpc->first->end_parent_cells (); ++pc) { - later.insert (*pc); - } + + } else { + next_cells_bu.push_back (*bu); + } + + for (db::Cell::parent_cell_iterator pc = cpc->first->begin_parent_cells (); pc != cpc->first->end_parent_cells (); ++pc) { + later.insert (*pc); } - } else { - next_cells_bu.push_back (*bu); } } diff --git a/src/db/db/dbHierProcessor.h b/src/db/db/dbHierProcessor.h index 4cba12d1b..5ed1ecb4e 100644 --- a/src/db/db/dbHierProcessor.h +++ b/src/db/db/dbHierProcessor.h @@ -103,6 +103,7 @@ class DB_PUBLIC LocalProcessorCellContext { public: typedef std::pair parent_inst_type; + typedef std::vector::const_iterator drop_iterator; LocalProcessorCellContext (); LocalProcessorCellContext (const LocalProcessorCellContext &other); @@ -130,6 +131,18 @@ public: return m_lock; } + // used for debugging purposes only + drop_iterator begin_drops () const + { + return m_drops.begin (); + } + + // used for debugging purposes only + drop_iterator end_drops () const + { + return m_drops.end (); + } + private: std::unordered_set m_propagated; std::vector m_drops; diff --git a/src/db/db/dbNetlistDeviceExtractorClasses.cc b/src/db/db/dbNetlistDeviceExtractorClasses.cc index 79f344f94..a82fa11ff 100644 --- a/src/db/db/dbNetlistDeviceExtractorClasses.cc +++ b/src/db/db/dbNetlistDeviceExtractorClasses.cc @@ -109,6 +109,11 @@ void NetlistDeviceExtractorMOS3Transistor::extract_devices (const std::vectorbox().to_string().c_str()); + printf("@@@ rdiff=%s\n", rdiff.to_string().c_str()); + printf("@@@ rgates=%s\n", rgates.to_string().c_str()); fflush(stdout); + } tl_assert (n > 0); device->set_parameter_value (diff_index == 0 ? db::DeviceClassMOS3Transistor::param_id_AS : db::DeviceClassMOS3Transistor::param_id_AD, dbu () * dbu () * d->area () / double (n));