diff options
author | 2020-07-25 14:44:54 +0200 | |
---|---|---|
committer | 2020-07-25 14:47:22 +0200 | |
commit | 2231bf8ae0ab6e752e394ad2c84d843d6a19d0f8 (patch) | |
tree | 252740e29ae17263d208cc896543ad3e5ce0f63f /src/lib/netlist/nl_base.cpp | |
parent | 016c636bb38824031082b100e667596508822cdd (diff) |
netlist: Rewrote scheduler scheduling.
* All solver scheduling is now handled by nld_solver.
* Previously, for dynamic timestepping the sub solvers would be
responsible for their scheduling themselves.
- This prevented any attemps to use parallel execution of solvers.
* Now the route is free towards experiments to use parallel execution of
solvers.
* Uses ptimed_queue_linear in solver scheduling
* Improved netlist queue implementation (template now)
* Added const delegates.
* Added subsolver stats
* Removed dead code.
Diffstat (limited to 'src/lib/netlist/nl_base.cpp')
-rw-r--r-- | src/lib/netlist/nl_base.cpp | 79 |
1 files changed, 31 insertions, 48 deletions
diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 078236da474..61265e9cb65 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -36,45 +36,6 @@ namespace netlist // queue_t // ---------------------------------------------------------------------------------------- - detail::queue_t::queue_t(netlist_t &nl, const pstring &name) - : timed_queue<plib::pqentry_t<netlist_time_ext, net_t *>, false>(config::MAX_QUEUE_SIZE::value) - , netlist_object_t(nl, name) - , m_qsize(0) - , m_times(config::MAX_QUEUE_SIZE::value) - , m_net_ids(config::MAX_QUEUE_SIZE::value) - { - } - - void detail::queue_t::register_state(plib::state_manager_t &manager, const pstring &module) - { - //state().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_net_ids[0], module + "." + "names", m_net_ids.size()); - } - - void detail::queue_t::on_pre_save(plib::state_manager_t &manager) - { - plib::unused_var(manager); - m_qsize = this->size(); - for (std::size_t i = 0; i < m_qsize; i++ ) - { - m_times[i] = this->listptr()[i].exec_time().as_raw(); - m_net_ids[i] = state().find_net_id(this->listptr()[i].object()); - } - } - - void detail::queue_t::on_post_load(plib::state_manager_t &manager) - { - plib::unused_var(manager); - this->clear(); - for (std::size_t i = 0; i < m_qsize; i++ ) - { - detail::net_t *n = state().nets()[m_net_ids[i]].get(); - this->push<false>(queue_t::entry_t(netlist_time_ext::from_raw(m_times[i]),n)); - } - } - // ---------------------------------------------------------------------------------------- // device_object_t // ---------------------------------------------------------------------------------------- @@ -101,6 +62,30 @@ namespace netlist //return terminal_type::TERMINAL; // please compiler } + netlist_state_t &detail::device_object_t::state() noexcept + { + return m_device->state(); + } + + const netlist_state_t &detail::device_object_t::state() const noexcept + { + return m_device->state(); + } + + // ---------------------------------------------------------------------------------------- + // netlist_object_t + // ---------------------------------------------------------------------------------------- + + netlist_state_t & detail::netlist_object_t::state() noexcept + { + return m_netlist.nlstate(); + } + + const netlist_state_t & detail::netlist_object_t::state() const noexcept + { + return m_netlist.nlstate(); + } + // ---------------------------------------------------------------------------------------- // netlist_t // ---------------------------------------------------------------------------------------- @@ -110,7 +95,9 @@ namespace netlist , m_solver(nullptr) , m_time(netlist_time_ext::zero()) , m_mainclock(nullptr) - , m_queue(*this, aname + "." + "m_queue") + , m_queue(config::MAX_QUEUE_SIZE::value, + detail::queue_t::id_delegate(&netlist_state_t :: find_net_id, &state), + detail::queue_t::obj_delegate(&netlist_state_t :: net_by_id, &state)) , m_use_stats(false) { state.save(*this, static_cast<plib::state_manager_t::callback_t &>(m_queue), aname, "m_queue"); @@ -175,6 +162,10 @@ namespace netlist return i; return std::numeric_limits<std::size_t>::max(); } + detail::net_t *netlist_state_t::net_by_id(std::size_t id) const + { + return m_nets[id].get(); + } void netlist_state_t::rebuild_lists() { @@ -702,14 +693,6 @@ namespace netlist state().setup().register_term(*this, *otherterm); } - void terminal_t::solve_now() const - { - const auto *solv(solver()); - // Nets may belong to railnets which do not have a solver attached - if (solv != nullptr) - solver()->solve_now(); - } - void terminal_t::set_ptrs(nl_fptype *gt, nl_fptype *go, nl_fptype *Idr) noexcept(false) { // NOLINTNEXTLINE(readability-implicit-bool-conversion) |