From fda5d86b4bd2ab0f584aa1e35fcf890687c67279 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Fri, 2 Aug 2019 01:39:07 +0200 Subject: [PATCH] Performance enhancement of netlist compare (avoid O(2) loop) --- src/db/db/dbNetlistCompare.cc | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/db/db/dbNetlistCompare.cc b/src/db/db/dbNetlistCompare.cc index c1ee28855..e6d776188 100644 --- a/src/db/db/dbNetlistCompare.cc +++ b/src/db/db/dbNetlistCompare.cc @@ -692,6 +692,12 @@ public: typedef std::pair, std::pair > edge_type; + static void swap_edges (edge_type &e1, edge_type &e2) + { + e1.first.swap (e2.first); + std::swap (e1.second, e2.second); + } + struct EdgeToEdgeOnlyCompare { bool operator() (const edge_type &a, const std::vector &b) const @@ -1149,17 +1155,22 @@ NetGraphNode::expand_subcircuit_nodes (NetGraph *graph) std::list sc_edges; - for (size_t i = 0; i < m_edges.size (); ) { - if (m_edges [i].second.second == 0) { + size_t ii = 0; + for (size_t i = 0; i < m_edges.size (); ++i) { + if (ii != i) { + swap_edges (m_edges [ii], m_edges [i]); + } + if (m_edges [ii].second.second == 0) { // subcircuit pin - sc_edges.push_back (m_edges [i]); - m_edges.erase (m_edges.begin () + i); + sc_edges.push_back (m_edges [ii]); } else { - n2entry.insert (std::make_pair (m_edges [i].second.second, i)); - ++i; + n2entry.insert (std::make_pair (m_edges [ii].second.second, ii)); + ++ii; } } + m_edges.erase (m_edges.begin () + ii, m_edges.end ()); + for (std::list::const_iterator e = sc_edges.begin (); e != sc_edges.end (); ++e) { const db::SubCircuit *sc = 0;