From 18ee59023ed3f68b166d4ad6ccf3b6ebe5b71dcc Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 6 Apr 2019 21:14:25 +0200 Subject: [PATCH] Speedup of Spice format netlist reader --- src/db/db/dbNetlistSpiceReader.cc | 23 +++++++++++++++++++++-- src/db/db/dbNetlistSpiceReader.h | 1 + 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/db/db/dbNetlistSpiceReader.cc b/src/db/db/dbNetlistSpiceReader.cc index 32e62e9db..b62a78939 100644 --- a/src/db/db/dbNetlistSpiceReader.cc +++ b/src/db/db/dbNetlistSpiceReader.cc @@ -49,6 +49,7 @@ void NetlistSpiceReader::read (tl::InputStream &stream, db::Netlist &netlist) mp_stream.reset (new tl::TextInputStream (stream)); mp_netlist = &netlist; mp_circuit = 0; + mp_nets_by_name.reset (0); try { @@ -83,6 +84,7 @@ void NetlistSpiceReader::finish () mp_stream.reset (0); mp_netlist = 0; mp_circuit = 0; + mp_nets_by_name.reset (0); } void NetlistSpiceReader::push_stream (const std::string &path) @@ -367,12 +369,25 @@ void NetlistSpiceReader::ensure_circuit () db::Net *NetlistSpiceReader::make_net (const std::string &name) { - db::Net *net = mp_circuit->net_by_name (name); - if (! net) { + if (! mp_nets_by_name.get ()) { + mp_nets_by_name.reset (new std::map ()); + } + + std::map::const_iterator n2n = mp_nets_by_name->find (name); + + db::Net *net = 0; + if (n2n == mp_nets_by_name->end ()) { + net = new db::Net (); net->set_name (name); mp_circuit->add_net (net); + + mp_nets_by_name->insert (std::make_pair (name, net)); + + } else { + net = n2n->second; } + return net; } @@ -477,6 +492,9 @@ void NetlistSpiceReader::read_circuit (tl::Extractor &ex) } } + std::auto_ptr > n2n (mp_nets_by_name.release ()); + mp_nets_by_name.reset (0); + std::swap (cc, mp_circuit); for (std::vector::const_iterator i = nn.begin (); i != nn.end (); ++i) { @@ -490,6 +508,7 @@ void NetlistSpiceReader::read_circuit (tl::Extractor &ex) } } + mp_nets_by_name.reset (n2n.release ()); std::swap (cc, mp_circuit); ex.expect_end (); diff --git a/src/db/db/dbNetlistSpiceReader.h b/src/db/db/dbNetlistSpiceReader.h index 08d3991a1..73185fad6 100644 --- a/src/db/db/dbNetlistSpiceReader.h +++ b/src/db/db/dbNetlistSpiceReader.h @@ -55,6 +55,7 @@ private: db::Circuit *mp_circuit; std::auto_ptr mp_stream; std::vector > m_streams; + std::auto_ptr > mp_nets_by_name; std::string m_stored_line; void push_stream (const std::string &path);