summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/core/nets.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/core/nets.h')
-rw-r--r--src/lib/netlist/core/nets.h169
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_