diff options
Diffstat (limited to 'src/lib/netlist/nl_base.h')
-rw-r--r-- | src/lib/netlist/nl_base.h | 59 |
1 files changed, 46 insertions, 13 deletions
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index ca75046b3e5..35ecc694cfd 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -732,8 +732,8 @@ namespace netlist void update_devs() NL_NOEXCEPT; - const netlist_time time() const noexcept { return m_time; } - void set_time(netlist_time ntime) noexcept { m_time = ntime; } + const netlist_time next_scheduled_time() const noexcept { return m_next_scheduled_time; } + void set_next_scheduled_time(netlist_time ntime) noexcept { m_next_scheduled_time = ntime; } bool isRailNet() const noexcept { return !(m_railterminal == nullptr); } core_terminal_t & railterminal() const noexcept { return *m_railterminal; } @@ -761,7 +761,7 @@ namespace netlist state_var<netlist_sig_t> m_cur_Q; state_var<queue_status> m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */ - state_var<netlist_time> m_time; + state_var<netlist_time> m_next_scheduled_time; private: plib::linkedlist_t<core_terminal_t> m_list_active; @@ -803,7 +803,7 @@ namespace netlist if (newQ != m_new_Q) { m_in_queue = QS_DELAYED_DUE_TO_INACTIVE; - m_time = at; + m_next_scheduled_time = at; } m_cur_Q = m_new_Q = newQ; } @@ -1204,8 +1204,8 @@ namespace netlist protected: void register_state(plib::state_manager_t &manager, const pstring &module) override; - void on_pre_save() override; - void on_post_load() override; + void on_pre_save(plib::state_manager_t &manager) override; + void on_post_load(plib::state_manager_t &manager) override; private: std::size_t m_qsize; @@ -1272,8 +1272,6 @@ namespace netlist template <typename T> void register_net(plib::owned_ptr<T> &&net) { m_nets.push_back(std::move(net)); } - devices::NETLIB_NAME(netlistparams) *m_params; - template<class device_class> inline std::vector<device_class *> get_device_list() { @@ -1387,11 +1385,10 @@ namespace netlist void print_stats() const; private: - std::unique_ptr<netlist_state_t> m_state; - /* mostly rw */ netlist_time m_time; devices::NETLIB_NAME(mainclock) * m_mainclock; + std::unique_ptr<netlist_state_t> m_state; detail::queue_t m_queue; devices::NETLIB_NAME(solver) * m_solver; @@ -1517,15 +1514,50 @@ namespace netlist { if ((num_cons() != 0)) { + auto &lexec(exec()); + auto &q(lexec.queue()); + auto nst(lexec.time() + delay); + if (is_queued()) - exec().queue().remove(this); - m_time = exec().time() + delay; + q.remove(this); m_in_queue = (!m_list_active.empty()) ? QS_QUEUED : QS_DELAYED_DUE_TO_INACTIVE; /* queued ? */ if (m_in_queue == QS_QUEUED) - exec().queue().push(queue_t::entry_t(m_time, this)); + q.push(queue_t::entry_t(nst, this)); + m_next_scheduled_time = nst; } } + inline void detail::net_t::add_to_active_list(core_terminal_t &term) NL_NOEXCEPT + { + if (m_list_active.empty()) + { + m_list_active.push_front(&term); + railterminal().device().do_inc_active(); + if (m_in_queue == QS_DELAYED_DUE_TO_INACTIVE) + { + if (m_next_scheduled_time > exec().time()) + { + m_in_queue = QS_QUEUED; /* pending */ + exec().queue().push({m_next_scheduled_time, this}); + } + else + { + m_in_queue = QS_DELIVERED; + m_cur_Q = m_new_Q; + } + } + } + else + m_list_active.push_front(&term); + } + + inline void detail::net_t::remove_from_active_list(core_terminal_t &term) NL_NOEXCEPT + { + m_list_active.remove(&term); + if (m_list_active.empty()) + railterminal().device().do_dec_active(); + } + inline const analog_net_t & analog_t::net() const NL_NOEXCEPT { return static_cast<const analog_net_t &>(core_terminal_t::net()); @@ -1583,6 +1615,7 @@ namespace netlist return m_device.exec(); } + inline const netlist_t &detail::device_object_t::exec() const NL_NOEXCEPT { return m_device.exec(); |