diff options
author | couriersud <couriersud@gmx.org> | 2017-02-11 21:58:27 +0100 |
---|---|---|
committer | couriersud <couriersud@gmx.org> | 2017-02-12 23:48:52 +0100 |
commit | d7f420ccf76d560281904522fefb5729195a58e3 (patch) | |
tree | daf4e0cde500e378a86cc56146d67eca680b5762 /src/lib/netlist | |
parent | 132cc8fe76bdce2f9fb2e2bf7fb333d8752cf5b6 (diff) |
Optimize queue save state. (nw)
Diffstat (limited to 'src/lib/netlist')
-rw-r--r-- | src/lib/netlist/nl_base.cpp | 27 | ||||
-rw-r--r-- | src/lib/netlist/nl_base.h | 6 |
2 files changed, 19 insertions, 14 deletions
diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 56a88ad60fc..14e16f8dbe7 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -20,6 +20,7 @@ #include <cstring> #include <cmath> +#include <limits> namespace netlist { @@ -151,7 +152,7 @@ detail::queue_t::queue_t(netlist_t &nl) , plib::state_manager_t::callback_t() , m_qsize(0) , m_times(512) - , m_names(512) + , m_net_ids(512) { } @@ -160,7 +161,7 @@ void detail::queue_t::register_state(plib::state_manager_t &manager, const pstri netlist().log().debug("register_state\n"); manager.save_item(this, m_qsize, module + "." + "qsize"); manager.save_item(this, &m_times[0], module + "." + "times", m_times.size()); - manager.save_item(this, &(m_names[0].m_buf[0]), module + "." + "names", m_names.size() * sizeof(names_t)); + manager.save_item(this, &m_net_ids[0], module + "." + "names", m_net_ids.size()); } void detail::queue_t::on_pre_save() @@ -171,11 +172,7 @@ void detail::queue_t::on_pre_save() for (std::size_t i = 0; i < m_qsize; i++ ) { m_times[i] = this->listptr()[i].m_exec_time.as_raw(); - pstring p = this->listptr()[i].m_object->name(); - std::size_t n = p.len(); - if (n > 63) n = 63; - std::strncpy(m_names[i].m_buf, p.c_str(), n); - m_names[i].m_buf[n] = 0; + m_net_ids[i] = netlist().find_net_id(this->listptr()[i].m_object); } } @@ -186,9 +183,7 @@ void detail::queue_t::on_post_load() netlist().log().debug("current time {1} qsize {2}\n", netlist().time().as_double(), m_qsize); for (std::size_t i = 0; i < m_qsize; i++ ) { - detail::net_t *n = netlist().find_net(pstring(m_names[i].m_buf, pstring::UTF8)); - //log().debug("Got {1} ==> {2}\n", qtemp[i].m_name, n)); - //log().debug("schedule time {1} ({2})\n", n->time().as_double(), netlist_time::from_raw(m_times[i]).as_double())); + detail::net_t *n = netlist().m_nets[m_net_ids[i]].get(); this->push(queue_t::entry_t(netlist_time::from_raw(m_times[i]),n)); } } @@ -408,7 +403,7 @@ void netlist_t::stop() m_solver->stop(); } -detail::net_t *netlist_t::find_net(const pstring &name) +detail::net_t *netlist_t::find_net(const pstring &name) const { for (auto & net : m_nets) if (net->name() == name) @@ -417,6 +412,16 @@ detail::net_t *netlist_t::find_net(const pstring &name) return nullptr; } +std::size_t netlist_t::find_net_id(const detail::net_t *net) const +{ + for (std::size_t i = 0; i < m_nets.size(); i++) + if (m_nets[i].get() == net) + return i; + return std::numeric_limits<std::size_t>::max(); +} + + + void netlist_t::rebuild_lists() { for (auto & net : m_nets) diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 3e06144168d..b8cb99933a9 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -1163,10 +1163,9 @@ namespace netlist void on_post_load() override; private: - struct names_t { char m_buf[64]; }; std::size_t m_qsize; std::vector<netlist_time::internal_type> m_times; - std::vector<names_t> m_names; + std::vector<std::size_t> m_net_ids; }; // ----------------------------------------------------------------------------- @@ -1208,7 +1207,8 @@ namespace netlist void register_dev(plib::owned_ptr<core_device_t> dev); void remove_dev(core_device_t *dev); - detail::net_t *find_net(const pstring &name); + detail::net_t *find_net(const pstring &name) const; + std::size_t find_net_id(const detail::net_t *net) const; template<class device_class> std::vector<device_class *> get_device_list() |