Skip to content

Commit ba5b41f

Browse files
committed
Parallelize netlist extraction (LVS) with OpenMP
1 parent 197aad9 commit ba5b41f

2 files changed

Lines changed: 17 additions & 0 deletions

File tree

src/db/db/dbHierNetworkProcessor.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2945,10 +2945,23 @@ template <class T>
29452945
void
29462946
hier_clusters<T>::build_hier_connections_for_cells (cell_clusters_box_converter<T> &cbc, const db::Layout &layout, const std::vector<db::cell_index_type> &cells, const db::Connectivity &conn, const std::set<db::cell_index_type> *breakout_cells, tl::RelativeProgress &progress, instance_interaction_cache_type &instance_interaction_cache, bool separate_attributes)
29472947
{
2948+
#if defined(_OPENMP)
2949+
#pragma omp parallel for schedule(dynamic)
2950+
for (long long i = 0; i < (long long)cells.size (); ++i) {
2951+
db::cell_index_type c = cells[i];
2952+
build_hier_connections (cbc, layout, layout.cell (c), conn, breakout_cells, instance_interaction_cache, separate_attributes);
2953+
2954+
#pragma omp critical
2955+
{
2956+
++progress;
2957+
}
2958+
}
2959+
#else
29482960
for (std::vector<db::cell_index_type>::const_iterator c = cells.begin (); c != cells.end (); ++c) {
29492961
build_hier_connections (cbc, layout, layout.cell (*c), conn, breakout_cells, instance_interaction_cache, separate_attributes);
29502962
++progress;
29512963
}
2964+
#endif
29522965
}
29532966

29542967
namespace {

src/db/db/dbHierNetworkProcessor.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1110,6 +1110,7 @@ class DB_PUBLIC_TEMPLATE instance_interaction_cache
11101110

11111111
size_t size () const
11121112
{
1113+
tl::MutexLocker lock (&m_mutex);
11131114
MemStatisticsSimple ms;
11141115
ms << m_map;
11151116
return ms.used ();
@@ -1127,6 +1128,7 @@ class DB_PUBLIC_TEMPLATE instance_interaction_cache
11271128

11281129
const Value *find (db::cell_index_type ci1, db::cell_index_type ci2, const Key &key) const
11291130
{
1131+
tl::MutexLocker lock (&m_mutex);
11301132
typename std::map <std::pair<db::cell_index_type, db::cell_index_type>, std::list <std::pair<Key, Value> > >::iterator i1 = m_map.find (std::make_pair (ci1, ci2));
11311133
if (i1 == m_map.end ()) {
11321134
++m_misses;
@@ -1156,6 +1158,7 @@ class DB_PUBLIC_TEMPLATE instance_interaction_cache
11561158
{
11571159
const size_t instance_cache_variant_threshold = 20;
11581160

1161+
tl::MutexLocker lock (&m_mutex);
11591162
std::list <std::pair<Key, Value> > &m = m_map [std::make_pair (ci1, ci2)];
11601163
if (m.size () >= instance_cache_variant_threshold) {
11611164
m.pop_back ();
@@ -1166,6 +1169,7 @@ class DB_PUBLIC_TEMPLATE instance_interaction_cache
11661169
}
11671170

11681171
private:
1172+
mutable tl::Mutex m_mutex;
11691173
mutable size_t m_hits, m_misses;
11701174
mutable std::map <std::pair<db::cell_index_type, db::cell_index_type>, std::list <std::pair<Key, Value> > > m_map;
11711175
};

0 commit comments

Comments
 (0)