mirror of
https://github.com/holub/mame
synced 2025-04-22 16:31:49 +03:00
Optimize queue save state. (nw)
This commit is contained in:
parent
132cc8fe76
commit
d7f420ccf7
@ -183,8 +183,11 @@ public:
|
||||
, m_channel(*this, "CHAN", 0)
|
||||
, m_mult(*this, "MULT", 1000.0)
|
||||
, m_offset(*this, "OFFSET", 0.0)
|
||||
, m_buffer(nullptr)
|
||||
, m_sample(netlist::netlist_time::from_hz(1)) //sufficiently big enough
|
||||
, m_in(*this, "IN")
|
||||
, m_cur(0.0)
|
||||
, m_last_pos(0)
|
||||
, m_last_buffer(*this, "m_last_buffer", netlist::netlist_time::zero())
|
||||
{
|
||||
}
|
||||
@ -255,6 +258,8 @@ public:
|
||||
: netlist::device_t(anetlist, name)
|
||||
, m_feedback(*this, "FB") // clock part
|
||||
, m_Q(*this, "Q")
|
||||
, m_pos(0)
|
||||
, m_num_channel(0)
|
||||
{
|
||||
connect(m_feedback, m_Q);
|
||||
m_inc = netlist::netlist_time::from_nsec(1);
|
||||
@ -266,7 +271,6 @@ public:
|
||||
m_param_mult[i] = std::make_unique<netlist::param_double_t>(*this, plib::pfmt("MULT{1}")(i), 1.0);
|
||||
m_param_offset[i] = std::make_unique<netlist::param_double_t>(*this, plib::pfmt("OFFSET{1}")(i), 0.0);
|
||||
}
|
||||
m_num_channel = 0;
|
||||
}
|
||||
|
||||
static const int MAX_INPUT_CHANNELS = 10;
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user