diff options
Diffstat (limited to 'src/lib/netlist/core/nets.h')
-rw-r--r-- | src/lib/netlist/core/nets.h | 169 |
1 files changed, 103 insertions, 66 deletions
diff --git a/src/lib/netlist/core/nets.h b/src/lib/netlist/core/nets.h index 280cda2013e..1a81c7ecd1c 100644 --- a/src/lib/netlist/core/nets.h +++ b/src/lib/netlist/core/nets.h @@ -8,12 +8,12 @@ #ifndef NL_CORE_NETS_H_ #define NL_CORE_NETS_H_ +#include "../nltypes.h" #include "base_objects.h" #include "core_device.h" #include "exec.h" #include "state_var.h" -#include "../nltypes.h" #include "../plib/plists.h" #include "../plib/pstring.h" @@ -21,16 +21,16 @@ namespace netlist { - namespace detail { + namespace detail + { - // ----------------------------------------------------------------------------- + // --------------------------------------------------------------------- // net_t - // ----------------------------------------------------------------------------- + // --------------------------------------------------------------------- class net_t : public netlist_object_t { public: - enum class queue_status { DELAYED_DUE_TO_INACTIVE = 0, @@ -38,7 +38,8 @@ namespace netlist DELIVERED }; - net_t(netlist_state_t &nl, const pstring &aname, core_terminal_t *rail_terminal = nullptr); + net_t(netlist_state_t &nl, const pstring &aname, + core_terminal_t *rail_terminal = nullptr); net_t(const net_t &) = delete; net_t &operator=(const net_t &) = delete; @@ -49,16 +50,13 @@ namespace netlist virtual void reset() noexcept; - // ----------------------------------------------------------------------------- + // ----------------------------------------------------------------- // Hot section // // Any changes below will impact performance. - // ----------------------------------------------------------------------------- + // ----------------------------------------------------------------- - constexpr void toggle_new_Q() noexcept - { - m_new_Q = (m_cur_Q ^ 1); - } + constexpr void toggle_new_Q() noexcept { m_new_Q = (m_cur_Q ^ 1); } void toggle_and_push_to_queue(const netlist_time &delay) noexcept { @@ -73,30 +71,44 @@ namespace netlist return m_in_queue == queue_status::QUEUED; } - // ----------------------------------------------------------------------------- + // ----------------------------------------------------------------- // Very hot - // ----------------------------------------------------------------------------- + // ----------------------------------------------------------------- template <bool KEEP_STATS> void update_devs() noexcept; - constexpr const netlist_time_ext &next_scheduled_time() const noexcept { return m_next_scheduled_time; } - void set_next_scheduled_time(const netlist_time_ext &next_time) noexcept { m_next_scheduled_time = next_time; } + constexpr const netlist_time_ext & + next_scheduled_time() const noexcept + { + return m_next_scheduled_time; + } + void set_next_scheduled_time( + const netlist_time_ext &next_time) noexcept + { + m_next_scheduled_time = next_time; + } - bool is_rail_net() const noexcept { return !(m_rail_terminal == nullptr); } - core_terminal_t & rail_terminal() const noexcept { return *m_rail_terminal; } + bool is_rail_net() const noexcept + { + return !(m_rail_terminal == nullptr); + } + core_terminal_t &rail_terminal() const noexcept + { + return *m_rail_terminal; + } void add_to_active_list(core_terminal_t &term) noexcept; void remove_from_active_list(core_terminal_t &term) noexcept; - // ----------------------------------------------------------------------------- + // ----------------------------------------------------------------- // setup stuff - cold - // ----------------------------------------------------------------------------- + // ----------------------------------------------------------------- bool is_logic() const noexcept; bool is_analog() const noexcept; - void rebuild_list(); // rebuild m_list after a load + void rebuild_list() noexcept(false); // rebuild m_list after a load void update_inputs() noexcept { @@ -107,26 +119,36 @@ namespace netlist } } - // ----------------------------------------------------------------------------- + // ----------------------------------------------------------------- // net management - // ----------------------------------------------------------------------------- + // ----------------------------------------------------------------- - const std::vector<detail::core_terminal_t *> core_terms_copy() + std::vector<detail::core_terminal_t *> + core_terms_copy() noexcept(false) { - std::vector<detail::core_terminal_t *> ret(core_terms_ref().size()); - std::copy(core_terms_ref().begin(), core_terms_ref().end(), ret.begin()); + std::vector<detail::core_terminal_t *> ret( + core_terms_ref().size()); + std::copy(core_terms_ref().begin(), core_terms_ref().end(), + ret.begin()); return ret; } - void remove_terminal(detail::core_terminal_t &term); - void remove_all_terminals(); - void add_terminal(detail::core_terminal_t &terminal); + void remove_terminal(detail::core_terminal_t &term) noexcept(false); + void remove_all_terminals() noexcept(false); + void add_terminal(detail::core_terminal_t &terminal) noexcept( + false); - bool core_terms_empty() noexcept { return core_terms_ref().empty(); } - protected: + bool core_terms_empty() noexcept(false) + { + return core_terms_ref().empty(); + } + protected: // only used for logic nets - constexpr const netlist_sig_t &Q() const noexcept { return m_cur_Q; } + constexpr const netlist_sig_t &Q() const noexcept + { + return m_cur_Q; + } // only used for logic nets void initial(netlist_sig_t val) noexcept @@ -136,15 +158,17 @@ namespace netlist } // only used for logic nets - void set_Q_and_push(netlist_sig_t newQ, const netlist_time &delay) noexcept; + void set_Q_and_push(netlist_sig_t newQ, + const netlist_time & delay) noexcept; // only used for logic nets - void set_Q_time(netlist_sig_t newQ, const netlist_time_ext &at) noexcept; - + void set_Q_time(netlist_sig_t newQ, + const netlist_time_ext & at) noexcept; private: #if NL_USE_INPLACE_CORE_TERMS - const plib::linked_list_t<core_terminal_t, 1> &core_terms_ref() const noexcept + const plib::linked_list_t<core_terminal_t, 1> & + core_terms_ref() const noexcept { return m_core_terms; } @@ -154,14 +178,14 @@ namespace netlist return state().core_terms(*this); } #endif - state_var<netlist_sig_t> m_new_Q; - state_var<netlist_sig_t> m_cur_Q; - state_var<queue_status> m_in_queue; + state_var<netlist_sig_t> m_new_Q; + state_var<netlist_sig_t> m_cur_Q; + state_var<queue_status> m_in_queue; // FIXME: this needs to be saved as well plib::linked_list_t<core_terminal_t, 0> m_list_active; - state_var<netlist_time_ext> m_next_scheduled_time; + state_var<netlist_time_ext> m_next_scheduled_time; - core_terminal_t * m_rail_terminal; + core_terminal_t *m_rail_terminal; #if NL_USE_INPLACE_CORE_TERMS plib::linked_list_t<core_terminal_t, 1> m_core_terms; #endif @@ -174,10 +198,15 @@ namespace netlist m_next_scheduled_time = exec().time() + delay; if constexpr (config::avoid_noop_queue_pushes::value) - m_in_queue = (m_list_active.empty() ? queue_status::DELAYED_DUE_TO_INACTIVE - : (m_new_Q != m_cur_Q ? queue_status::QUEUED : queue_status::DELIVERED)); + m_in_queue = (m_list_active.empty() + ? queue_status::DELAYED_DUE_TO_INACTIVE + : (m_new_Q != m_cur_Q + ? queue_status::QUEUED + : queue_status::DELIVERED)); else - m_in_queue = m_list_active.empty() ? queue_status::DELAYED_DUE_TO_INACTIVE : queue_status::QUEUED; + m_in_queue = m_list_active.empty() + ? queue_status::DELAYED_DUE_TO_INACTIVE + : queue_status::QUEUED; if (m_in_queue == queue_status::QUEUED) exec().queue_push(m_next_scheduled_time, this); @@ -194,15 +223,16 @@ namespace netlist const netlist_sig_t new_Q(m_new_Q); const netlist_sig_t cur_Q(m_cur_Q); - if (config::avoid_noop_queue_pushes::value || ((new_Q ^ cur_Q) != 0)) + if (config::avoid_noop_queue_pushes::value + || ((new_Q ^ cur_Q) != 0)) { m_cur_Q = new_Q; const auto mask = (new_Q << core_terminal_t::INP_LH_SHIFT) - | (cur_Q << core_terminal_t::INP_HL_SHIFT); + | (cur_Q << core_terminal_t::INP_HL_SHIFT); if (!KEEP_STATS) { - for (core_terminal_t * p: m_list_active) + for (core_terminal_t *p : m_list_active) { p->set_copied_input(new_Q); if ((p->terminal_state() & mask) != 0) @@ -211,7 +241,7 @@ namespace netlist } else { - for (core_terminal_t * p : m_list_active) + for (core_terminal_t *p : m_list_active) { p->set_copied_input(new_Q); auto *stats(p->device().stats()); @@ -239,11 +269,13 @@ namespace netlist rail_terminal().device().do_inc_active(); if (m_in_queue == queue_status::DELAYED_DUE_TO_INACTIVE) { - // if we avoid queue pushes we must test if m_cur_Q and m_new_Q are equal - if ((!config::avoid_noop_queue_pushes::value || (m_cur_Q != m_new_Q)) + // if we avoid queue pushes we must test if m_cur_Q and + // m_new_Q are equal + if ((!config::avoid_noop_queue_pushes::value + || (m_cur_Q != m_new_Q)) && (m_next_scheduled_time > exec().time())) { - m_in_queue = queue_status::QUEUED; // pending + m_in_queue = queue_status::QUEUED; // pending exec().queue_push(m_next_scheduled_time, this); } else @@ -258,7 +290,8 @@ namespace netlist } } - inline void net_t::remove_from_active_list(core_terminal_t &term) noexcept + inline void net_t::remove_from_active_list( + core_terminal_t &term) noexcept { gsl_Expects(!m_list_active.empty()); m_list_active.remove(&term); @@ -269,7 +302,8 @@ namespace netlist // All our connected outputs have signalled they no longer // will act on input. We thus remove any potentially queued // events and mark them. - // FIXME: May cause regression test to fail - revisit in this case + // FIXME: May cause regression test to fail - revisit in + // this case // // This code is definitively needed for the // AVOID_NOOP_QUEUE_PUSHES code path - therefore I left @@ -285,7 +319,8 @@ namespace netlist } // only used for logic nets - inline void net_t::set_Q_and_push(netlist_sig_t newQ, const netlist_time &delay) noexcept + inline void net_t::set_Q_and_push(netlist_sig_t newQ, + const netlist_time & delay) noexcept { gsl_Expects(delay >= netlist_time::zero()); @@ -297,7 +332,8 @@ namespace netlist } // only used for logic nets - inline void net_t::set_Q_time(netlist_sig_t newQ, const netlist_time_ext &at) noexcept + inline void net_t::set_Q_time(netlist_sig_t newQ, + const netlist_time_ext & at) noexcept { gsl_Expects(at >= netlist_time_ext::zero()); @@ -317,12 +353,11 @@ namespace netlist } // namespace detail - class analog_net_t : public detail::net_t { public: - - analog_net_t(netlist_state_t &nl, const pstring &aname, detail::core_terminal_t *rail_terminal = nullptr); + analog_net_t(netlist_state_t &nl, const pstring &aname, + detail::core_terminal_t *rail_terminal = nullptr); void reset() noexcept override; @@ -331,11 +366,15 @@ namespace netlist // used by solver code ... nl_fptype *Q_Analog_state_ptr() noexcept { return *m_cur_Analog; } - //FIXME: needed by current solver code + // FIXME: needed by current solver code solver::matrix_solver_t *solver() const noexcept { return m_solver; } - void set_solver(solver::matrix_solver_t *solver) noexcept { m_solver = solver; } + void set_solver(solver::matrix_solver_t *solver) noexcept + { + m_solver = solver; + } - friend constexpr bool operator==(const analog_net_t &lhs, const analog_net_t &rhs) noexcept + friend constexpr bool operator==(const analog_net_t &lhs, + const analog_net_t & rhs) noexcept { return &lhs == &rhs; } @@ -348,17 +387,15 @@ namespace netlist class logic_net_t : public detail::net_t { public: + logic_net_t(netlist_state_t &nl, const pstring &aname, + detail::core_terminal_t *rail_terminal = nullptr); - logic_net_t(netlist_state_t &nl, const pstring &aname, detail::core_terminal_t *rail_terminal = nullptr); - - using detail::net_t::Q; using detail::net_t::initial; + using detail::net_t::Q; using detail::net_t::set_Q_and_push; using detail::net_t::set_Q_time; }; - } // namespace netlist - #endif // NL_CORE_NETS_H_ |