From fba5bed2a3a6bb03d2ae3629d21fcaaa91989f37 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Wed, 23 Jan 2019 01:02:22 +0100 Subject: [PATCH] Performance improvement of device extractor (taking out a O(N**2) loop) --- src/db/db/dbNetlistDeviceExtractor.cc | 34 +++++++++++++++------------ src/db/db/dbNetlistDeviceExtractor.h | 4 ++-- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/db/db/dbNetlistDeviceExtractor.cc b/src/db/db/dbNetlistDeviceExtractor.cc index e45cedf92..07103f2a1 100644 --- a/src/db/db/dbNetlistDeviceExtractor.cc +++ b/src/db/db/dbNetlistDeviceExtractor.cc @@ -194,10 +194,9 @@ void NetlistDeviceExtractor::extract_without_initialize (db::Layout &layout, db: tl::RelativeProgress progress (tl::to_string (tr ("Extracting devices")), n, 1); struct ExtractorCacheValueType { - ExtractorCacheValueType () : circuit (0) { } - db::Circuit *circuit; + ExtractorCacheValueType () { } db::Vector disp; - std::map geometry; + tl::vector devices; }; typedef std::map, ExtractorCacheValueType> extractor_cache_type; @@ -245,7 +244,6 @@ void NetlistDeviceExtractor::extract_without_initialize (db::Layout &layout, db: for (db::recursive_cluster_shape_iterator si (device_clusters, *l, *ci, *c); ! si.at_end(); ++si) { insert_into_region (*si, si.trans (), r); } - // r.merge ()??? } db::Box box; @@ -269,12 +267,16 @@ void NetlistDeviceExtractor::extract_without_initialize (db::Layout &layout, db: ExtractorCacheValueType &ecv = extractor_cache [layer_geometry]; ecv.disp = disp; - ecv.circuit = mp_circuit; - ecv.geometry.swap (m_new_devices); + + for (std::map >::const_iterator d = m_new_devices.begin (); d != m_new_devices.end (); ++d) { + ecv.devices.push_back (d->second.first); + } + + m_new_devices.clear (); } else { - push_cached_devices (ec->second.circuit, ec->second.geometry, ec->second.disp, disp); + push_cached_devices (ec->second.devices, ec->second.disp, disp); } @@ -288,16 +290,16 @@ void NetlistDeviceExtractor::push_new_devices (const db::Vector &disp_cache) db::CplxTrans dbu = db::CplxTrans (mp_layout->dbu ()); db::VCplxTrans dbu_inv = dbu.inverted (); - for (std::map::const_iterator d = m_new_devices.begin (); d != m_new_devices.end (); ++d) { + for (std::map >::const_iterator d = m_new_devices.begin (); d != m_new_devices.end (); ++d) { - db::Device *device = mp_circuit->device_by_id (d->first); + db::Device *device = d->second.first; db::Vector disp = dbu_inv * device->position () - db::Point (); device->set_position (device->position () + dbu * disp_cache); DeviceCellKey key; - for (geometry_per_terminal_type::const_iterator t = d->second.begin (); t != d->second.end (); ++t) { + for (geometry_per_terminal_type::const_iterator t = d->second.second.begin (); t != d->second.second.end (); ++t) { std::map > > = key.geometry [t->first]; for (geometry_per_layer_type::const_iterator l = t->second.begin (); l != t->second.end (); ++l) { std::set &gl = gt [l->first]; @@ -333,7 +335,7 @@ void NetlistDeviceExtractor::push_new_devices (const db::Vector &disp_cache) ps.insert (std::make_pair (m_device_class_propname_id, tl::Variant (mp_device_class->name ()))); device_cell.prop_id (mp_layout->properties_repository ().properties_id (ps)); - for (geometry_per_terminal_type::const_iterator t = d->second.begin (); t != d->second.end (); ++t) { + for (geometry_per_terminal_type::const_iterator t = d->second.second.begin (); t != d->second.second.end (); ++t) { // Build a property set for the device terminal ID ps.clear (); @@ -370,15 +372,15 @@ void NetlistDeviceExtractor::push_new_devices (const db::Vector &disp_cache) } } -void NetlistDeviceExtractor::push_cached_devices (db::Circuit *circuit, const std::map &cached_devices, const db::Vector &disp_cache, const db::Vector &new_disp) +void NetlistDeviceExtractor::push_cached_devices (const tl::vector &cached_devices, const db::Vector &disp_cache, const db::Vector &new_disp) { db::CplxTrans dbu = db::CplxTrans (mp_layout->dbu ()); db::VCplxTrans dbu_inv = dbu.inverted (); db::PropertiesRepository::properties_set ps; - for (std::map::const_iterator d = cached_devices.begin (); d != cached_devices.end (); ++d) { + for (std::vector::const_iterator d = cached_devices.begin (); d != cached_devices.end (); ++d) { - db::Device *cached_device = circuit->device_by_id (d->first); + db::Device *cached_device = *d; db::Vector disp = dbu_inv * cached_device->position () - disp_cache - db::Point (); db::Device *device = new db::Device (*cached_device); @@ -453,7 +455,9 @@ void NetlistDeviceExtractor::define_terminal (Device *device, size_t terminal_id unsigned int layer_index = m_layers [geometry_index]; db::PolygonRef pr (polygon, mp_layout->shape_repository ()); - m_new_devices[device->id ()][terminal_id][layer_index].push_back (pr); + std::pair &dd = m_new_devices[device->id ()]; + dd.first = device; + dd.second[terminal_id][layer_index].push_back (pr); } void NetlistDeviceExtractor::define_terminal (Device *device, size_t terminal_id, size_t layer_index, const db::Box &box) diff --git a/src/db/db/dbNetlistDeviceExtractor.h b/src/db/db/dbNetlistDeviceExtractor.h index e2b97280d..cbd8ec85a 100644 --- a/src/db/db/dbNetlistDeviceExtractor.h +++ b/src/db/db/dbNetlistDeviceExtractor.h @@ -507,7 +507,7 @@ private: layer_definitions m_layer_definitions; std::vector m_layers; error_list m_errors; - std::map m_new_devices; + std::map > m_new_devices; std::map > m_device_cells; // no copying @@ -522,7 +522,7 @@ private: void extract_without_initialize (db::Layout &layout, db::Cell &cell, hier_clusters_type &clusters, const std::vector &layers); void push_new_devices (const Vector &disp_cache); - void push_cached_devices (db::Circuit *circuit, const std::map &cached_devices, const db::Vector &disp_cache, const db::Vector &new_disp); + void push_cached_devices (const tl::vector &cached_devices, const db::Vector &disp_cache, const db::Vector &new_disp); }; }