summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2017-02-11 21:58:27 +0100
committer couriersud <couriersud@gmx.org>2017-02-12 23:48:52 +0100
commitd7f420ccf76d560281904522fefb5729195a58e3 (patch)
treedaf4e0cde500e378a86cc56146d67eca680b5762 /src/lib/netlist
parent132cc8fe76bdce2f9fb2e2bf7fb333d8752cf5b6 (diff)
Optimize queue save state. (nw)
Diffstat (limited to 'src/lib/netlist')
-rw-r--r--src/lib/netlist/nl_base.cpp27
-rw-r--r--src/lib/netlist/nl_base.h6
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()