summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2019-11-15 21:55:41 +0100
committer couriersud <couriersud@gmx.org>2019-11-15 22:16:37 +0100
commitbcfa9eae6f16c35254a5cee1fb992f988c0a86ce (patch)
tree8b42ff7a46d9be7b73e2c5b7170afe7c27d15180 /src/lib/netlist
parentdf143446696cee294a6ffd7ea6bc0b09a43d9c02 (diff)
netlist: maintenance and bug fixes, remove DUMMY_INPUT. [Couriersud]
- Removed DUMMY_INPUT. NC (not connected) pins should now use NC_PIN. If a NC_PIN is actually connected, an error will be logged and validation will fail. - Enabled "extended" validation. This will catch now if power terminals are not connected. - Added const and noexcept where appropriate. - Removed dead code. - Fixed the 7414 Schmitt-Trigger device to use nld_power_pins
Diffstat (limited to 'src/lib/netlist')
-rw-r--r--src/lib/netlist/analog/nld_bjt.cpp18
-rw-r--r--src/lib/netlist/analog/nld_generic_models.h24
-rw-r--r--src/lib/netlist/analog/nld_mosfet.cpp6
-rw-r--r--src/lib/netlist/analog/nlid_twoterm.cpp2
-rw-r--r--src/lib/netlist/analog/nlid_twoterm.h4
-rw-r--r--src/lib/netlist/devices/net_lib.cpp2
-rw-r--r--src/lib/netlist/devices/nld_4066.cpp6
-rw-r--r--src/lib/netlist/devices/nld_schmitt.cpp14
-rw-r--r--src/lib/netlist/devices/nld_system.cpp2
-rw-r--r--src/lib/netlist/devices/nld_system.h4
-rw-r--r--src/lib/netlist/devices/nlid_proxy.cpp121
-rw-r--r--src/lib/netlist/devices/nlid_proxy.h55
-rw-r--r--src/lib/netlist/devices/nlid_system.h42
-rw-r--r--src/lib/netlist/devices/nlid_truthtable.cpp5
-rw-r--r--src/lib/netlist/devices/nlid_truthtable.h2
-rw-r--r--src/lib/netlist/macro/nlm_ttl74xx.cpp25
-rw-r--r--src/lib/netlist/nl_base.cpp12
-rw-r--r--src/lib/netlist/nl_base.h44
-rw-r--r--src/lib/netlist/nl_config.h2
-rw-r--r--src/lib/netlist/nl_errstr.h6
-rw-r--r--src/lib/netlist/nl_factory.cpp4
-rw-r--r--src/lib/netlist/nl_factory.h10
-rw-r--r--src/lib/netlist/nl_setup.cpp30
-rw-r--r--src/lib/netlist/nl_setup.h20
-rw-r--r--src/lib/netlist/plib/parray.h6
-rw-r--r--src/lib/netlist/plib/pchrono.h6
-rw-r--r--src/lib/netlist/plib/pdynlib.cpp7
-rw-r--r--src/lib/netlist/plib/pdynlib.h12
-rw-r--r--src/lib/netlist/plib/pstring.cpp6
-rw-r--r--src/lib/netlist/plib/pstring.h82
-rw-r--r--src/lib/netlist/plib/ptypes.h12
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.h2
32 files changed, 245 insertions, 348 deletions
diff --git a/src/lib/netlist/analog/nld_bjt.cpp b/src/lib/netlist/analog/nld_bjt.cpp
index 61c7d9296a1..68253e303cf 100644
--- a/src/lib/netlist/analog/nld_bjt.cpp
+++ b/src/lib/netlist/analog/nld_bjt.cpp
@@ -18,22 +18,22 @@ namespace analog
, m_VT_inv(plib::reciprocal(m_VT))
{}
- diode(const nl_fptype Is, const nl_fptype n)
+ diode(nl_fptype Is, nl_fptype n)
{
m_Is = Is;
m_VT = nlconst::magic(0.0258) * n;
m_VT_inv = plib::reciprocal(m_VT);
}
- void set(const nl_fptype Is, const nl_fptype n)
+ void set(nl_fptype Is, nl_fptype n) noexcept
{
m_Is = Is;
m_VT = nlconst::magic(0.0258) * n;
m_VT_inv = plib::reciprocal(m_VT);
}
- nl_fptype I(const nl_fptype V) const { return m_Is * plib::exp(V * m_VT_inv) - m_Is; }
- nl_fptype g(const nl_fptype V) const { return m_Is * m_VT_inv * plib::exp(V * m_VT_inv); }
- nl_fptype V(const nl_fptype I) const { return plib::log1p(I / m_Is) * m_VT; } // log1p(x)=log(1.0 + x)
- nl_fptype gI(const nl_fptype I) const { return m_VT_inv * (I + m_Is); }
+ nl_fptype I(nl_fptype V) const noexcept { return m_Is * plib::exp(V * m_VT_inv) - m_Is; }
+ nl_fptype g(nl_fptype V) const noexcept { return m_Is * m_VT_inv * plib::exp(V * m_VT_inv); }
+ nl_fptype V(nl_fptype I) const noexcept { return plib::log1p(I / m_Is) * m_VT; } // log1p(x)=log(1.0 + x)
+ nl_fptype gI(nl_fptype I) const noexcept { return m_VT_inv * (I + m_Is); }
private:
nl_fptype m_Is;
@@ -140,9 +140,9 @@ namespace analog
//NETLIB_RESETI();
NETLIB_UPDATEI();
- q_type qtype() const { return m_qtype; }
- bool is_qtype(q_type atype) const { return m_qtype == atype; }
- void set_qtype(q_type atype) { m_qtype = atype; }
+ q_type qtype() const noexcept { return m_qtype; }
+ bool is_qtype(q_type atype) const noexcept { return m_qtype == atype; }
+ void set_qtype(q_type atype) noexcept { m_qtype = atype; }
protected:
bjt_model_t m_model;
diff --git a/src/lib/netlist/analog/nld_generic_models.h b/src/lib/netlist/analog/nld_generic_models.h
index 25c99ac1279..a5d035ed32b 100644
--- a/src/lib/netlist/analog/nld_generic_models.h
+++ b/src/lib/netlist/analog/nld_generic_models.h
@@ -43,7 +43,7 @@ namespace analog
{
}
- static capacitor_e type() { return capacitor_e::VARIABLE_CAPACITY; }
+ static capacitor_e type() noexcept { return capacitor_e::VARIABLE_CAPACITY; }
// Circuit Simulation, page 284, 5.360
// q(un+1) - q(un) = int(un, un+1, C(U)) = (C0+C1)/2 * (un+1-un)
@@ -52,14 +52,14 @@ namespace analog
// so that G depends on un+1 only and Ieq on un only.
// In both cases, i = G * un+1 + Ieq
- nl_fptype G(nl_fptype cap) const
+ nl_fptype G(nl_fptype cap) const noexcept
{
//return m_h * cap + m_gmin;
return m_h * nlconst::half() * (cap + m_c) + m_gmin;
//return m_h * cap + m_gmin;
}
- nl_fptype Ieq(nl_fptype cap, nl_fptype v) const
+ nl_fptype Ieq(nl_fptype cap, nl_fptype v) const noexcept
{
plib::unused_var(v);
//return -m_h * 0.5 * ((cap + m_c) * m_v + (cap - m_c) * v) ;
@@ -67,14 +67,14 @@ namespace analog
//return -m_h * cap * m_v;
}
- void timestep(nl_fptype cap, nl_fptype v, nl_fptype step)
+ void timestep(nl_fptype cap, nl_fptype v, nl_fptype step) noexcept
{
m_h = plib::reciprocal(step);
m_c = cap;
m_v = v;
}
- void setparams(nl_fptype gmin) { m_gmin = gmin; }
+ void setparams(nl_fptype gmin) noexcept { m_gmin = gmin; }
private:
state_var<nl_fptype> m_h;
@@ -95,21 +95,21 @@ namespace analog
{
}
- static capacitor_e type() { return capacitor_e::CONSTANT_CAPACITY; }
- nl_fptype G(nl_fptype cap) const { return cap * m_h + m_gmin; }
- nl_fptype Ieq(nl_fptype cap, nl_fptype v) const
+ static capacitor_e type() noexcept { return capacitor_e::CONSTANT_CAPACITY; }
+ nl_fptype G(nl_fptype cap) const noexcept { return cap * m_h + m_gmin; }
+ nl_fptype Ieq(nl_fptype cap, nl_fptype v) const noexcept
{
plib::unused_var(v);
return - G(cap) * m_v;
}
- void timestep(nl_fptype cap, nl_fptype v, nl_fptype step)
+ void timestep(nl_fptype cap, nl_fptype v, nl_fptype step) noexcept
{
plib::unused_var(cap);
m_h = plib::reciprocal(step);
m_v = v;
}
- void setparams(nl_fptype gmin) { m_gmin = gmin; }
+ void setparams(nl_fptype gmin) noexcept { m_gmin = gmin; }
private:
state_var<nl_fptype> m_h;
state_var<nl_fptype> m_v;
@@ -151,7 +151,7 @@ namespace analog
, nlconst::magic(300.0));
}
- void update_diode(const nl_fptype nVd)
+ void update_diode(nl_fptype nVd) noexcept
{
nl_fptype IseVDVt(nlconst::zero());
@@ -198,7 +198,7 @@ namespace analog
}
}
- void set_param(const nl_fptype Is, const nl_fptype n, nl_fptype gmin, nl_fptype temp)
+ void set_param(nl_fptype Is, nl_fptype n, nl_fptype gmin, nl_fptype temp) noexcept
{
m_Is = Is;
m_logIs = plib::log(Is);
diff --git a/src/lib/netlist/analog/nld_mosfet.cpp b/src/lib/netlist/analog/nld_mosfet.cpp
index 57ccf2220c7..fff7b8d03eb 100644
--- a/src/lib/netlist/analog/nld_mosfet.cpp
+++ b/src/lib/netlist/analog/nld_mosfet.cpp
@@ -165,9 +165,9 @@ namespace analog
//NETLIB_RESETI();
NETLIB_UPDATEI() { }
- q_type qtype() const { return m_qtype; }
- bool is_qtype(q_type atype) const { return m_qtype == atype; }
- void set_qtype(q_type atype) { m_qtype = atype; }
+ q_type qtype() const noexcept { return m_qtype; }
+ bool is_qtype(q_type atype) const noexcept { return m_qtype == atype; }
+ void set_qtype(q_type atype) noexcept { m_qtype = atype; }
protected:
fet_model_t m_model;
diff --git a/src/lib/netlist/analog/nlid_twoterm.cpp b/src/lib/netlist/analog/nlid_twoterm.cpp
index 0b3e6412584..e06a9cf275a 100644
--- a/src/lib/netlist/analog/nlid_twoterm.cpp
+++ b/src/lib/netlist/analog/nlid_twoterm.cpp
@@ -24,7 +24,7 @@ namespace analog
m_N.solve_now();
}
- void NETLIB_NAME(twoterm)::solve_later(netlist_time delay)
+ void NETLIB_NAME(twoterm)::solve_later(netlist_time delay) noexcept
{
// we only need to call the non-rail terminal
if (m_P.has_net() && !m_P.net().isRailNet())
diff --git a/src/lib/netlist/analog/nlid_twoterm.h b/src/lib/netlist/analog/nlid_twoterm.h
index a052153e531..c85c45b20a2 100644
--- a/src/lib/netlist/analog/nlid_twoterm.h
+++ b/src/lib/netlist/analog/nlid_twoterm.h
@@ -88,7 +88,7 @@ namespace analog
void solve_now();
- void solve_later(netlist_time delay = netlist_time::quantum());
+ void solve_later(netlist_time delay = netlist_time::quantum()) noexcept;
void set_G_V_I(nl_fptype G, nl_fptype V, nl_fptype I) const noexcept
{
@@ -134,7 +134,7 @@ namespace analog
{
}
- void set_R(nl_fptype R)
+ void set_R(nl_fptype R) const noexcept
{
const nl_fptype G = plib::reciprocal(R);
set_mat( G, -G, nlconst::zero(),
diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp
index 2b6070dc864..4d80e3a549b 100644
--- a/src/lib/netlist/devices/net_lib.cpp
+++ b/src/lib/netlist/devices/net_lib.cpp
@@ -40,7 +40,7 @@ namespace devices
LIB_ENTRY(CCCS)
LIB_ENTRY(LVCCS)
LIB_ENTRY(opamp)
- LIB_ENTRY(dummy_input)
+ LIB_ENTRY(nc_pin)
LIB_ENTRY(frontier) // not intended to be used directly
LIB_ENTRY(function) // only for macro devices - NO FEEDBACK loops
LIB_ENTRY(QBJT_EB)
diff --git a/src/lib/netlist/devices/nld_4066.cpp b/src/lib/netlist/devices/nld_4066.cpp
index 70a43f06f20..70e687b56bb 100644
--- a/src/lib/netlist/devices/nld_4066.cpp
+++ b/src/lib/netlist/devices/nld_4066.cpp
@@ -19,7 +19,7 @@ namespace netlist
{
NETLIB_CONSTRUCTOR(CD4066_GATE)
NETLIB_FAMILY("CD4XXX")
- , m_supply(*this, "VDD", "VSS", true)
+ , m_supply(*this, "VDD", "VSS")
, m_R(*this, "R")
, m_control(*this, "CTL")
, m_base_r(*this, "BASER", nlconst::magic(270.0))
@@ -47,10 +47,10 @@ namespace netlist
NETLIB_UPDATE(CD4066_GATE)
{
- nl_fptype sup = (m_supply.VCC() - m_supply.GND());
+ nl_fptype sup = (m_supply.VCC().Q_Analog() - m_supply.GND().Q_Analog());
nl_fptype low = nlconst::magic(0.45) * sup;
nl_fptype high = nlconst::magic(0.55) * sup;
- nl_fptype in = m_control() - m_supply.GND();
+ nl_fptype in = m_control() - m_supply.GND().Q_Analog();
nl_fptype rON = m_base_r() * nlconst::magic(5.0) / sup;
nl_fptype R = -nlconst::one();
diff --git a/src/lib/netlist/devices/nld_schmitt.cpp b/src/lib/netlist/devices/nld_schmitt.cpp
index 81624733278..c36ce978b0d 100644
--- a/src/lib/netlist/devices/nld_schmitt.cpp
+++ b/src/lib/netlist/devices/nld_schmitt.cpp
@@ -8,6 +8,7 @@
#include "nld_schmitt.h"
#include "netlist/analog/nlid_twoterm.h"
+#include "netlist/devices/nlid_system.h"
#include "netlist/nl_base.h"
#include "netlist/nl_errstr.h"
#include "netlist/solver/nld_solver.h"
@@ -61,7 +62,7 @@ namespace netlist
{
NETLIB_CONSTRUCTOR(schmitt_trigger)
, m_A(*this, "A")
- , m_GND(*this, "GND")
+ , m_supply(*this)
, m_RVI(*this, "RVI")
, m_RVO(*this, "RVO")
, m_model(*this, "MODEL", "TTL_7414_GATE")
@@ -71,8 +72,8 @@ namespace netlist
register_subalias("Q", m_RVO.m_P);
connect(m_A, m_RVI.m_P);
- connect(m_GND, m_RVI.m_N);
- connect(m_GND, m_RVO.m_N);
+ connect(m_supply.GND(), m_RVI.m_N);
+ connect(m_supply.GND(), m_RVO.m_N);
}
protected:
@@ -88,9 +89,10 @@ namespace netlist
NETLIB_UPDATEI()
{
+ const auto va(m_A.Q_Analog() - m_supply.GND().Q_Analog());
if (m_last_state)
{
- if (m_A.Q_Analog() < m_model.m_VTM)
+ if (va < m_model.m_VTM)
{
m_last_state = 0;
if (m_is_timestep)
@@ -101,7 +103,7 @@ namespace netlist
}
else
{
- if (m_A.Q_Analog() > m_model.m_VTP)
+ if (va > m_model.m_VTP)
{
m_last_state = 1;
if (m_is_timestep)
@@ -114,7 +116,7 @@ namespace netlist
private:
analog_input_t m_A;
- analog_input_t m_GND;
+ NETLIB_NAME(power_pins) m_supply;
analog::NETLIB_SUB(twoterm) m_RVI;
analog::NETLIB_SUB(twoterm) m_RVO;
schmitt_trigger_model_t m_model;
diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp
index 004b8c1b900..b4483b84ad7 100644
--- a/src/lib/netlist/devices/nld_system.cpp
+++ b/src/lib/netlist/devices/nld_system.cpp
@@ -61,7 +61,7 @@ namespace devices
}
- NETLIB_DEVICE_IMPL(dummy_input, "DUMMY_INPUT", "")
+ NETLIB_DEVICE_IMPL(nc_pin, "NC_PIN", "")
NETLIB_DEVICE_IMPL(frontier, "FRONTIER_DEV", "+I,+G,+Q")
NETLIB_DEVICE_IMPL(function, "AFUNC", "N,FUNC")
NETLIB_DEVICE_IMPL(analog_input, "ANALOG_INPUT", "IN")
diff --git a/src/lib/netlist/devices/nld_system.h b/src/lib/netlist/devices/nld_system.h
index af577a9d543..2600b7a41f3 100644
--- a/src/lib/netlist/devices/nld_system.h
+++ b/src/lib/netlist/devices/nld_system.h
@@ -47,8 +47,8 @@
#define GNDA() \
NET_REGISTER_DEV(GNDA, GND)
-#define DUMMY_INPUT(name) \
- NET_REGISTER_DEV(DUMMY_INPUT, name)
+#define NC_PIN(name) \
+ NET_REGISTER_DEV(NC_PIN, name)
//FIXME: Usage discouraged, use OPTIMIZE_FRONTIER instead
#define FRONTIER_DEV(name, cIN, cG, cOUT) \
diff --git a/src/lib/netlist/devices/nlid_proxy.cpp b/src/lib/netlist/devices/nlid_proxy.cpp
index dc613c58f4c..d59e7416e12 100644
--- a/src/lib/netlist/devices/nlid_proxy.cpp
+++ b/src/lib/netlist/devices/nlid_proxy.cpp
@@ -18,12 +18,10 @@ namespace netlist
// -----------------------------------------------------------------------------
nld_base_proxy::nld_base_proxy(netlist_state_t &anetlist, const pstring &name,
- logic_t *inout_proxied, detail::core_terminal_t *proxy_inout)
+ logic_t *inout_proxied)
: device_t(anetlist, name)
, m_tp(nullptr)
, m_tn(nullptr)
- , m_term_proxied(inout_proxied)
- , m_proxy_term(proxy_inout)
{
m_logic_family = inout_proxied->logic_family();
@@ -60,29 +58,10 @@ namespace netlist
}
}
}
- //FIXME: Use power terminals and change info to warning or error
if (!f)
- {
-#if 1
- if (logic_family()->fixed_V() == nlconst::zero())
- log().error(MI_NO_POWER_TERMINALS_ON_DEVICE_2(name, anetlist.setup().de_alias(inout_proxied->device().name())));
- else
- log().warning(MI_NO_POWER_TERMINALS_ON_DEVICE_2(name, anetlist.setup().de_alias(inout_proxied->device().name())));
-#endif
- m_GNDHack = plib::make_unique<analog_output_t>(*this, "_QGND");
- m_VCCHack = plib::make_unique<analog_output_t>(*this, "_QVCC");
-
- m_tp = m_VCCHack.get();
- m_tn = m_GNDHack.get();
- m_need_hack = true;
- }
+ log().error(MI_NO_POWER_TERMINALS_ON_DEVICE_2(name, anetlist.setup().de_alias(inout_proxied->device().name())));
else
- {
log().verbose("D/A Proxy: Found power terminals on device {1}", inout_proxied->device().name());
- m_need_hack = false;
- }
- //printf("vcc: %f\n", logic_family()->fixed_V());
-
}
// ----------------------------------------------------------------------------------------
@@ -90,53 +69,24 @@ namespace netlist
// ----------------------------------------------------------------------------------------
nld_base_a_to_d_proxy::nld_base_a_to_d_proxy(netlist_state_t &anetlist, const pstring &name,
- logic_input_t *in_proxied, detail::core_terminal_t *in_proxy)
- : nld_base_proxy(anetlist, name, in_proxied, in_proxy)
- , m_Q(*this, "Q")
+ logic_input_t *in_proxied)
+ : nld_base_proxy(anetlist, name, in_proxied)
{
}
nld_a_to_d_proxy::nld_a_to_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *in_proxied)
- : nld_base_a_to_d_proxy(anetlist, name, in_proxied, &m_I)
+ : nld_base_a_to_d_proxy(anetlist, name, in_proxied)
+ , m_Q(*this, "Q")
, m_I(*this, "I")
{
}
NETLIB_RESET(a_to_d_proxy)
{
- // FIXME: Variable voltage
- nl_fptype supply_V = logic_family()->fixed_V();
- // FIXME: comparison to zero
- if (supply_V == nlconst::zero())
- supply_V = nlconst::magic(5.0);
-
- if (need_hack())
- {
- if (m_tn)
- m_GNDHack->initial(0);
- if (m_tp)
- m_VCCHack->initial(supply_V);
- }
}
NETLIB_UPDATE(a_to_d_proxy)
{
-#if 0
- nl_assert(m_logic_family != nullptr);
- // FIXME: Variable supply voltage!
- nl_fptype supply_V = logic_family()->fixed_V();
- // FIXME: bad hack
- if (supply_V == nlconst::zero()) supply_V = nlconst::magic(5.0);
-
- if (m_I.Q_Analog() > logic_family()->high_thresh_V(nlconst::zero(), supply_V))
- out().push(1, netlist_time::quantum());
- else if (m_I.Q_Analog() < logic_family()->low_thresh_V(nlconst::zero(), supply_V))
- out().push(0, netlist_time::quantum());
- else
- {
- // do nothing
- }
-#else
const auto v(m_I.Q_Analog());
const auto vn(m_tn->net().Q_Analog());
const auto vp(m_tp->net().Q_Analog());
@@ -149,7 +99,6 @@ namespace netlist
{
// do nothing
}
-#endif
}
// ----------------------------------------------------------------------------------------
@@ -157,14 +106,14 @@ namespace netlist
// ----------------------------------------------------------------------------------------
nld_base_d_to_a_proxy::nld_base_d_to_a_proxy(netlist_state_t &anetlist, const pstring &name,
- logic_output_t *out_proxied, detail::core_terminal_t &proxy_out)
- : nld_base_proxy(anetlist, name, out_proxied, &proxy_out)
- , m_I(*this, "I")
+ logic_output_t *out_proxied)
+ : nld_base_proxy(anetlist, name, out_proxied)
{
}
nld_d_to_a_proxy::nld_d_to_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *out_proxied)
- : nld_base_d_to_a_proxy(anetlist, name, out_proxied, m_RN.m_P)
+ : nld_base_d_to_a_proxy(anetlist, name, out_proxied)
+ , m_I(*this, "I")
, m_RP(*this, "RP")
, m_RN(*this, "RN")
, m_last_state(*this, "m_last_var", -1)
@@ -172,62 +121,30 @@ namespace netlist
{
register_subalias("Q", m_RN.m_P);
- if (need_hack())
+ log().verbose("D/A Proxy: Found power terminals on device {1}", out_proxied->device().name());
+ if (anetlist.setup().is_extended_validation())
{
- if (anetlist.setup().is_extended_validation())
- {
- // During validation, don't connect to terminals found
- // This will cause terminals not connected to a rail net to
- // fail connection stage.
- connect(m_RN.m_N, m_RP.m_P);
- }
- else
- {
- connect(m_RN.m_N, *m_tn);
- connect(m_RP.m_P, *m_tp);
- }
- connect(m_RN.m_P, m_RP.m_N);
+ // During validation, don't connect to terminals found
+ // This will cause terminals not connected to a rail net to
+ // fail connection stage.
+ connect(m_RN.m_N, m_RP.m_P);
}
else
{
- log().verbose("D/A Proxy: Found power terminals on device {1}", out_proxied->device().name());
- if (anetlist.setup().is_extended_validation())
- {
- // During validation, don't connect to terminals found
- // This will cause terminals not connected to a rail net to
- // fail connection stage.
- connect(m_RN.m_N, m_RP.m_P);
- }
- else
- {
- connect(m_RN.m_N, *m_tn);
- connect(m_RP.m_P, *m_tp);
- }
- connect(m_RN.m_P, m_RP.m_N);
+ connect(m_RN.m_N, *m_tn);
+ connect(m_RP.m_P, *m_tp);
}
+ connect(m_RN.m_P, m_RP.m_N);
//printf("vcc: %f\n", logic_family()->fixed_V());
}
void nld_d_to_a_proxy::reset()
{
- // FIXME: Variable voltage
- nl_fptype supply_V = logic_family()->fixed_V();
- // FIXME: comparison to zero
- if (supply_V == nlconst::zero())
- supply_V = nlconst::magic(5.0);
-
//m_Q.initial(0.0);
m_last_state = -1;
m_RN.reset();
m_RP.reset();
- if (need_hack())
- {
- if (m_tn)
- m_GNDHack->initial(0);
- if (m_tp)
- m_VCCHack->initial(supply_V);
- }
m_is_timestep = m_RN.m_P.net().solver()->has_timestep_devices();
m_RN.set_G_V_I(plib::reciprocal(logic_family()->R_low()),
logic_family()->low_offset_V(), nlconst::zero());
diff --git a/src/lib/netlist/devices/nlid_proxy.h b/src/lib/netlist/devices/nlid_proxy.h
index eb2f2dd5ade..0e1b51c9ca7 100644
--- a/src/lib/netlist/devices/nlid_proxy.h
+++ b/src/lib/netlist/devices/nlid_proxy.h
@@ -27,10 +27,10 @@ namespace devices
{
public:
nld_base_proxy(netlist_state_t &anetlist, const pstring &name,
- logic_t *inout_proxied, detail::core_terminal_t *proxy_inout);
+ logic_t *inout_proxied);
- logic_t &term_proxied() const { return *m_term_proxied; }
- detail::core_terminal_t &proxy_term() const { return *m_proxy_term; }
+ // only used during setup
+ virtual detail::core_terminal_t &proxy_term() noexcept = 0;
protected:
// FIXME: these should be core_terminal_t and only used for connecting
@@ -38,14 +38,6 @@ namespace devices
analog_t *m_tp;
analog_t *m_tn;
- plib::unique_ptr<analog_output_t> m_GNDHack; // FIXME: Long term, we need to connect proxy gnd to device gnd
- plib::unique_ptr<analog_output_t> m_VCCHack; // FIXME: Long term, we need to connect proxy gnd to device gnd
-
- bool need_hack() const noexcept { return m_need_hack; }
- private:
- logic_t *m_term_proxied;
- detail::core_terminal_t *m_proxy_term;
- bool m_need_hack;
};
// -----------------------------------------------------------------------------
@@ -55,33 +47,34 @@ namespace devices
NETLIB_OBJECT_DERIVED(base_a_to_d_proxy, base_proxy)
{
public:
-
- virtual logic_output_t &out() { return m_Q; }
+ virtual logic_output_t &out() noexcept = 0;
protected:
-
nld_base_a_to_d_proxy(netlist_state_t &anetlist, const pstring &name,
- logic_input_t *in_proxied, detail::core_terminal_t *in_proxy);
-
- private:
-
- logic_output_t m_Q;
+ logic_input_t *in_proxied);
};
NETLIB_OBJECT_DERIVED(a_to_d_proxy, base_a_to_d_proxy)
{
public:
- nld_a_to_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *in_proxied);
+ nld_a_to_d_proxy(netlist_state_t &anetlist, const pstring &name,
+ logic_input_t *in_proxied);
- analog_input_t m_I;
+ virtual logic_output_t &out() noexcept override { return m_Q; }
- protected:
+ virtual detail::core_terminal_t &proxy_term() noexcept override
+ {
+ return m_I;
+ }
+ protected:
NETLIB_RESETI();
NETLIB_UPDATEI();
private:
+ logic_output_t m_Q;
+ analog_input_t m_I;
};
// -----------------------------------------------------------------------------
@@ -91,20 +84,27 @@ namespace devices
NETLIB_OBJECT_DERIVED(base_d_to_a_proxy, base_proxy)
{
public:
-
- virtual logic_input_t &in() { return m_I; }
+ // only used in setup
+ virtual logic_input_t &in() noexcept = 0;
protected:
nld_base_d_to_a_proxy(netlist_state_t &anetlist, const pstring &name,
- logic_output_t *out_proxied, detail::core_terminal_t &proxy_out);
+ logic_output_t *out_proxied);
- logic_input_t m_I;
};
NETLIB_OBJECT_DERIVED(d_to_a_proxy, base_d_to_a_proxy)
{
public:
- nld_d_to_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *out_proxied);
+ nld_d_to_a_proxy(netlist_state_t &anetlist, const pstring &name,
+ logic_output_t *out_proxied);
+
+ virtual logic_input_t &in() noexcept override { return m_I; }
+
+ virtual detail::core_terminal_t &proxy_term() noexcept override
+ {
+ return m_RN.m_P;
+ }
protected:
@@ -115,6 +115,7 @@ namespace devices
static constexpr const nl_fptype G_OFF = nlconst::magic(1e-9);
+ logic_input_t m_I;
analog::NETLIB_NAME(twoterm) m_RP;
analog::NETLIB_NAME(twoterm) m_RN;
state_var<int> m_last_state;
diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h
index a59a5ca5adf..fcba83f3a2e 100644
--- a/src/lib/netlist/devices/nlid_system.h
+++ b/src/lib/netlist/devices/nlid_system.h
@@ -48,40 +48,30 @@ namespace devices
///
/// Power Pins are passive inputs. Delegate noop will silently ignore any
/// updates.
+
class nld_power_pins
{
public:
explicit nld_power_pins(device_t &owner, const pstring &sVCC = sPowerVCC,
- const pstring &sGND = sPowerGND, bool force_analog_input = true)
+ const pstring &sGND = sPowerGND)
+ : m_VCC(owner, sVCC, NETLIB_DELEGATE(power_pins, noop))
+ , m_GND(owner, sGND, NETLIB_DELEGATE(power_pins, noop))
{
- if (owner.state().setup().is_extended_validation() || force_analog_input)
- {
- m_GND = owner.state().make_object<analog_input_t>(owner, sGND, NETLIB_DELEGATE(power_pins, noop));
- m_VCC = owner.state().make_object<analog_input_t>(owner, sVCC, NETLIB_DELEGATE(power_pins, noop));
- }
- else
- {
- owner.create_and_register_subdevice(sPowerDevRes, m_RVG);
- owner.register_subalias(sVCC, pstring(sPowerDevRes) + ".1");
- owner.register_subalias(sGND, pstring(sPowerDevRes) + ".2");
- }
}
- nl_fptype VCC() const noexcept
+ const analog_input_t &VCC() const noexcept
{
- return (m_VCC ? m_VCC->Q_Analog() : m_RVG->V1P());
+ return m_VCC;
}
- nl_fptype GND() const noexcept
+ const analog_input_t &GND() const noexcept
{
- return (m_GND ? m_GND->Q_Analog() : m_RVG->V2N());
+ return m_GND;
}
private:
void noop() { }
- unique_pool_ptr<analog_input_t> m_VCC; // only used during validation or force_analog_input
- unique_pool_ptr<analog_input_t> m_GND; // only used during validation or force_analog_input
-
- NETLIB_SUB_UPTR(analog, R) m_RVG; // dummy resistor between VCC and GND
+ analog_input_t m_VCC;
+ analog_input_t m_GND;
};
// -----------------------------------------------------------------------------
@@ -287,19 +277,18 @@ namespace devices
};
// -----------------------------------------------------------------------------
- // nld_dummy_input
+ // nld_nc_pin
// -----------------------------------------------------------------------------
- NETLIB_OBJECT(dummy_input)
+ NETLIB_OBJECT(nc_pin)
{
public:
- NETLIB_CONSTRUCTOR(dummy_input)
+ NETLIB_CONSTRUCTOR(nc_pin)
, m_I(*this, "I")
{
}
protected:
-
NETLIB_RESETI() { }
NETLIB_UPDATEI() { }
@@ -381,7 +370,6 @@ namespace devices
}
protected:
-
NETLIB_RESETI()
{
//m_Q.initial(0.0);
@@ -395,8 +383,8 @@ namespace devices
}
m_Q.push(m_compiled.evaluate(m_vals));
}
- private:
+ private:
param_int_t m_N;
param_str_t m_func;
analog_output_t m_Q;
@@ -404,6 +392,7 @@ namespace devices
std::vector<nl_fptype> m_vals;
plib::pfunction<nl_fptype> m_compiled;
+
};
// -----------------------------------------------------------------------------
@@ -447,6 +436,7 @@ namespace devices
//NETLIB_UPDATE_PARAMI();
+ // used by 74123
analog::NETLIB_SUB(R_base) m_R;
logic_input_t m_I;
param_fp_t m_RON;
diff --git a/src/lib/netlist/devices/nlid_truthtable.cpp b/src/lib/netlist/devices/nlid_truthtable.cpp
index e471bff549b..362784aec87 100644
--- a/src/lib/netlist/devices/nlid_truthtable.cpp
+++ b/src/lib/netlist/devices/nlid_truthtable.cpp
@@ -266,7 +266,7 @@ namespace devices
if (m_family_desc == nullptr)
plib::pthrow<nl_exception>("family description not found for {1}", m_family_name);
- return pool.make_unique<tt_type>(anetlist, name, m_family_desc, *m_ttbl, m_desc);
+ return pool.make_unique<tt_type>(anetlist, name, *m_family_desc, *m_ttbl, m_desc);
}
private:
unique_pool_ptr<typename nld_truthtable_t<m_NI, m_NO>::truthtable_t> m_ttbl;
@@ -480,7 +480,8 @@ namespace factory
truthtable_base_element_t::truthtable_base_element_t(const pstring &name, const pstring &classname,
const pstring &def_param, const pstring &sourcefile)
- : factory::element_t(name, classname, def_param, sourcefile), m_family_desc(family_TTL())
+ : factory::element_t(name, classname, def_param, sourcefile)
+ , m_family_desc(family_TTL())
{
}
diff --git a/src/lib/netlist/devices/nlid_truthtable.h b/src/lib/netlist/devices/nlid_truthtable.h
index 484928207cf..2677ce7433a 100644
--- a/src/lib/netlist/devices/nlid_truthtable.h
+++ b/src/lib/netlist/devices/nlid_truthtable.h
@@ -63,7 +63,7 @@ namespace devices
template <class C>
nld_truthtable_t(C &owner, const pstring &name,
- const logic_family_desc_t *fam,
+ const logic_family_desc_t &fam,
truthtable_t &ttp, const std::vector<pstring> &desc)
: device_t(owner, name)
, m_fam(*this, fam)
diff --git a/src/lib/netlist/macro/nlm_ttl74xx.cpp b/src/lib/netlist/macro/nlm_ttl74xx.cpp
index e30800abdf2..9e0fa15c582 100644
--- a/src/lib/netlist/macro/nlm_ttl74xx.cpp
+++ b/src/lib/netlist/macro/nlm_ttl74xx.cpp
@@ -245,6 +245,7 @@ static NETLIST_START(TTL_7414_GATE)
ALIAS(A, X.A)
ALIAS(Q, X.Q)
ALIAS(GND, X.GND)
+ ALIAS(VCC, X.VCC)
NETLIST_END()
static NETLIST_START(TTL_74LS14_GATE)
@@ -252,6 +253,7 @@ static NETLIST_START(TTL_74LS14_GATE)
ALIAS(A, X.A)
ALIAS(Q, X.Q)
ALIAS(GND, X.GND)
+ ALIAS(VCC, X.VCC)
NETLIST_END()
static NETLIST_START(TTL_7414_DIP)
@@ -263,7 +265,7 @@ static NETLIST_START(TTL_7414_DIP)
SCHMITT_TRIGGER(F, "DM7414")
NET_C(A.GND, B.GND, C.GND, D.GND, E.GND, F.GND)
- DUMMY_INPUT(VCC)
+ NET_C(A.VCC, B.VCC, C.VCC, D.VCC, E.VCC, F.VCC)
DIPPINS( /* +--------------+ */
A.A, /* A1 |1 ++ 14| VCC */ VCC.I,
@@ -286,7 +288,7 @@ static NETLIST_START(TTL_74LS14_DIP)
SCHMITT_TRIGGER(F, "DM74LS14")
NET_C(A.GND, B.GND, C.GND, D.GND, E.GND, F.GND)
- DUMMY_INPUT(VCC)
+ NET_C(A.VCC, B.VCC, C.VCC, D.VCC, E.VCC, F.VCC)
DIPPINS( /* +--------------+ */
A.A, /* A1 |1 ++ 14| VCC */ VCC.I,
@@ -353,7 +355,7 @@ static NETLIST_START(TTL_7420_DIP)
NET_C(A.VCC, B.VCC)
NET_C(A.GND, B.GND)
- DUMMY_INPUT(NC)
+ NC_PIN(NC)
DIPPINS( /* +--------------+ */
A.A, /* A1 |1 ++ 14| VCC */ A.VCC,
@@ -395,13 +397,14 @@ static NETLIST_START(TTL_7425_DIP)
NET_C(A.VCC, B.VCC)
NET_C(A.GND, B.GND)
- DUMMY_INPUT(X)
+ NC_PIN(XA) // FIXME: Functionality needs to be implemented
+ NC_PIN(XB) // FIXME: Functionality needs to be implemented
DIPPINS( /* +--------------+ */
A.A, /* A1 |1 ++ 14| VCC */ A.VCC,
A.B, /* B1 |2 13| D2 */ B.D,
- X.I, /* X1 |3 12| C2 */ B.C,
- A.C, /* C1 |4 7425 11| X2 */ X.I,
+ XA.I, /* X1 |3 12| C2 */ B.C,
+ A.C, /* C1 |4 7425 11| X2 */ XB.I,
A.D, /* D1 |5 10| B2 */ B.B,
A.Q, /* Y1 |6 9| A2 */ B.A,
A.GND,/* GND |7 8| Y2 */ B.Q
@@ -471,15 +474,17 @@ NETLIST_END()
static NETLIST_START(TTL_7430_DIP)
TTL_7430_GATE(A)
- DUMMY_INPUT(NC)
+ NC_PIN(NC9)
+ NC_PIN(NC10)
+ NC_PIN(NC13)
DIPPINS( /* +--------------+ */
A.A, /* A |1 ++ 14| VCC */ A.VCC,
- A.B, /* B |2 13| NC */ NC.I,
+ A.B, /* B |2 13| NC */ NC13.I,
A.C, /* C |3 12| H */ A.H,
A.D, /* D |4 7430 11| G */ A.G,
- A.E, /* E |5 10| NC */ NC.I,
- A.F, /* F |6 9| NC */ NC.I,
+ A.E, /* E |5 10| NC */ NC10.I,
+ A.F, /* F |6 9| NC */ NC9.I,
A.GND,/* GND |7 8| Y */ A.Q
/* +--------------+ */
)
diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp
index 1213636d837..c161c9ea80b 100644
--- a/src/lib/netlist/nl_base.cpp
+++ b/src/lib/netlist/nl_base.cpp
@@ -585,7 +585,7 @@ namespace netlist
state().setup().register_alias_nofqn(alias, aliased_fqn);
}
- void device_t::connect(detail::core_terminal_t &t1, detail::core_terminal_t &t2)
+ void device_t::connect(const detail::core_terminal_t &t1, const detail::core_terminal_t &t2)
{
state().setup().register_link_fqn(t1.name(), t2.name());
}
@@ -621,9 +621,9 @@ namespace netlist
dev.set_logic_family(dev.state().setup().family_from_model(desc));
}
- detail::family_setter_t::family_setter_t(core_device_t &dev, const logic_family_desc_t *desc)
+ detail::family_setter_t::family_setter_t(core_device_t &dev, const logic_family_desc_t &desc)
{
- dev.set_logic_family(desc);
+ dev.set_logic_family(&desc);
}
// ----------------------------------------------------------------------------------------
@@ -787,7 +787,7 @@ namespace netlist
net().solver()->update_forced();
}
- void terminal_t::schedule_solve_after(netlist_time after)
+ void terminal_t::schedule_solve_after(netlist_time after) noexcept
{
// Nets may belong to railnets which do not have a solver attached
if (this->has_net())
@@ -896,14 +896,14 @@ namespace netlist
}
- pstring param_t::get_initial(const device_t &dev, bool *found)
+ pstring param_t::get_initial(const device_t &dev, bool *found) const
{
pstring res = dev.state().setup().get_initial_param_val(this->name(), "");
*found = (res != "");
return res;
}
- const pstring param_model_t::type()
+ pstring param_model_t::type()
{
return state().setup().models().type(str());
}
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h
index e80267105ae..bcff0162fa6 100644
--- a/src/lib/netlist/nl_base.h
+++ b/src/lib/netlist/nl_base.h
@@ -819,7 +819,7 @@ namespace netlist
}
void solve_now();
- void schedule_solve_after(netlist_time after);
+ void schedule_solve_after(netlist_time after) noexcept;
void set_ptrs(nl_fptype *gt, nl_fptype *go, nl_fptype *Idr) noexcept(false);
@@ -903,7 +903,6 @@ namespace netlist
nl_fptype Q_Analog() const noexcept;
};
-
class logic_net_t : public detail::net_t
{
public:
@@ -1081,7 +1080,7 @@ namespace netlist
void register_subalias(const pstring &name, const pstring &aliased);
void connect(const pstring &t1, const pstring &t2);
- void connect(detail::core_terminal_t &t1, detail::core_terminal_t &t2);
+ void connect(const detail::core_terminal_t &t1, const detail::core_terminal_t &t2);
void connect_post_start(detail::core_terminal_t &t1, detail::core_terminal_t &t2);
protected:
@@ -1121,7 +1120,7 @@ namespace netlist
device().update_param();
}
- pstring get_initial(const device_t &dev, bool *found);
+ pstring get_initial(const device_t &dev, bool *found) const;
template<typename C>
void set(C &p, const C v) noexcept
@@ -1194,8 +1193,8 @@ namespace netlist
public:
param_str_t(device_t &device, const pstring &name, const pstring &val);
- pstring operator()() const noexcept { return str(); }
- void setTo(const pstring &param) noexcept
+ const pstring &operator()() const noexcept { return str(); }
+ void setTo(const pstring &param)
{
if (m_param != param)
{
@@ -1206,9 +1205,8 @@ namespace netlist
}
protected:
virtual void changed() noexcept;
- pstring str() const noexcept { return m_param; }
+ const pstring &str() const noexcept { return m_param; }
private:
- PALIGNAS_CACHELINE()
pstring m_param;
};
@@ -1236,15 +1234,12 @@ namespace netlist
using value_t = value_base_t<nl_fptype>;
- template <typename T>
- friend class value_base_t;
-
param_model_t(device_t &device, const pstring &name, const pstring &val)
: param_str_t(device, name, val) { }
pstring value_str(const pstring &entity);
nl_fptype value(const pstring &entity);
- const pstring type();
+ pstring type();
// hide this
void setTo(const pstring &param) = delete;
protected:
@@ -1302,7 +1297,7 @@ namespace netlist
// NOLINTNEXTLINE(modernize-use-equals-default)
family_setter_t();
family_setter_t(core_device_t &dev, const pstring &desc);
- family_setter_t(core_device_t &dev, const logic_family_desc_t *desc);
+ family_setter_t(core_device_t &dev, const logic_family_desc_t &desc);
};
template <class T, bool TS>
@@ -1407,7 +1402,7 @@ namespace netlist
/// \return vector with pointers to devices
template<class C>
- inline std::vector<C *> get_device_list()
+ inline std::vector<C *> get_device_list() const
{
std::vector<C *> tmp;
for (auto &d : m_devices)
@@ -1421,18 +1416,18 @@ namespace netlist
// logging and name
- pstring name() const noexcept { return m_name; }
+ const pstring &name() const noexcept { return m_name; }
log_type & log() noexcept { return m_log; }
const log_type &log() const noexcept { return m_log; }
plib::dynlib &lib() const noexcept { return *m_lib; }
- netlist_t &exec() { return *m_netlist; }
- const netlist_t &exec() const { return *m_netlist; }
+ netlist_t &exec() noexcept { return *m_netlist; }
+ const netlist_t &exec() const noexcept { return *m_netlist; }
// state handling
- plib::state_manager_t &run_state_manager() { return m_state; }
+ plib::state_manager_t &run_state_manager() noexcept { return m_state; }
template<typename O, typename C>
void save(O &owner, C &state, const pstring &module, const pstring &stname)
@@ -1458,7 +1453,7 @@ namespace netlist
///
/// \return core_device_t pointer if device exists, else nullptr
- core_device_t *find_device(const pstring &name)
+ core_device_t *find_device(const pstring &name) const
{
for (auto & d : m_devices)
if (d.first == name)
@@ -1745,16 +1740,6 @@ namespace netlist
pstring p = this->get_initial(device, &found);
if (found)
{
-#if 0
- bool err = false;
- auto vald = plib::pstonum_ne<T>(p, err);
- if (err)
- {
- device.state().log().fatal(MF_INVALID_NUMBER_CONVERSION_1_2(name, p));
- plib::pthrow<nl_exception>(MF_INVALID_NUMBER_CONVERSION_1_2(name, p));
- }
- m_param = vald;
-#else
plib::pfunction<nl_fptype> func;
func.compile_infix(p, {});
auto valx = func.evaluate();
@@ -1762,7 +1747,6 @@ namespace netlist
if (plib::abs(valx - plib::trunc(valx)) > nlconst::magic(1e-6))
plib::pthrow<nl_exception>(MF_INVALID_NUMBER_CONVERSION_1_2(device.name() + "." + name, p));
m_param = static_cast<T>(valx);
-#endif
}
else
m_param = val;
diff --git a/src/lib/netlist/nl_config.h b/src/lib/netlist/nl_config.h
index c3e3124787f..ed6f5ec4d74 100644
--- a/src/lib/netlist/nl_config.h
+++ b/src/lib/netlist/nl_config.h
@@ -231,7 +231,7 @@ namespace netlist
//============================================================
#if defined(MAME_DEBUG) || (NL_DEBUG == true)
-#define nl_assert(x) passert_always(x);
+#define nl_assert(x) passert_always(x)
#else
#define nl_assert(x) do { } while (0)
#endif
diff --git a/src/lib/netlist/nl_errstr.h b/src/lib/netlist/nl_errstr.h
index 026b3476a16..636c5ec7628 100644
--- a/src/lib/netlist/nl_errstr.h
+++ b/src/lib/netlist/nl_errstr.h
@@ -22,7 +22,7 @@
template<typename... Args> explicit name(Args&&... args) \
: m_m(plib::pfmt(str)(std::forward<Args>(args)...)) \
{ static_assert(narg == sizeof...(args), "Argument count mismatch"); } \
- operator pstring() const noexcept { return m_m; } \
+ operator pstring() const { return m_m; } \
pstring m_m; \
};
@@ -30,7 +30,6 @@ namespace netlist
{
static constexpr const char sHINT_NO_DEACTIVATE[] = ".HINT_NO_DEACTIVATE";
- static constexpr const char sPowerDevRes[] = "_RVG";
static constexpr const char sPowerGND[] = "GND";
static constexpr const char sPowerVCC[] = "VCC";
@@ -98,7 +97,7 @@ namespace netlist
PERRMSGV(MW_OVERWRITING_PARAM_1_OLD_2_NEW_3, 3, "Overwriting {1} old <{2}> new <{3}>")
PERRMSGV(MW_CONNECTING_1_TO_ITSELF, 1, "Connecting {1} to itself. This may be right, though")
- PERRMSGV(MI_DUMMY_1_WITHOUT_CONNECTIONS, 1, "Found dummy terminal {1} without connections")
+ PERRMSGV(ME_NC_PIN_1_WITH_CONNECTIONS, 1, "Found NC (not connected) terminal {1} with connections")
PERRMSGV(MI_ANALOG_OUTPUT_1_WITHOUT_CONNECTIONS,1, "Found analog output {1} without connections")
PERRMSGV(MI_LOGIC_OUTPUT_1_WITHOUT_CONNECTIONS, 1, "Found logic output {1} without connections")
PERRMSGV(MW_LOGIC_INPUT_1_WITHOUT_CONNECTIONS, 1, "Found logic input {1} without connections")
@@ -108,7 +107,6 @@ namespace netlist
PERRMSGV(MF_TERMINALS_WITHOUT_NET, 0, "Found terminals without a net")
PERRMSGV(MI_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3, 3, "Found device {1} connected only to railterminals {2}/{3}. Will be removed")
- PERRMSGV(MI_POWER_TERMINALS_1_CONNECTED_ANALOG_2_3, 3, "Power terminals {1} connected to analog nets {2}/{3}.")
PERRMSGV(MW_DATA_1_NOT_FOUND, 1, "unable to find data {1} in sources collection")
diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp
index 55d62c7b336..4e53903971d 100644
--- a/src/lib/netlist/nl_factory.cpp
+++ b/src/lib/netlist/nl_factory.cpp
@@ -11,8 +11,8 @@
#include "nl_setup.h"
#include "plib/putil.h"
-namespace netlist { namespace factory
-{
+namespace netlist {
+namespace factory {
class NETLIB_NAME(wrapper) : public device_t
{
diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h
index e03989d860d..b9d00b4bcd6 100644
--- a/src/lib/netlist/nl_factory.h
+++ b/src/lib/netlist/nl_factory.h
@@ -64,10 +64,10 @@ namespace factory {
plib::unused_var(name);
}
- const pstring &name() const { return m_name; }
- const pstring &classname() const { return m_classname; }
- const pstring &param_desc() const { return m_def_param; }
- const pstring &sourcefile() const { return m_sourcefile; }
+ const pstring &name() const noexcept { return m_name; }
+ const pstring &classname() const noexcept { return m_classname; }
+ const pstring &param_desc() const noexcept { return m_def_param; }
+ const pstring &sourcefile() const noexcept { return m_sourcefile; }
private:
pstring m_name; ///< device name
@@ -115,7 +115,7 @@ namespace factory {
element_t * factory_by_name(const pstring &devname);
template <class C>
- bool is_class(element_t *f)
+ bool is_class(element_t *f) noexcept
{
return dynamic_cast<device_element_t<C> *>(f) != nullptr;
}
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp
index 4722be06be0..1bd5a4aeffb 100644
--- a/src/lib/netlist/nl_setup.cpp
+++ b/src/lib/netlist/nl_setup.cpp
@@ -552,8 +552,8 @@ param_t *setup_t::find_param(const pstring &param_in, bool required) const
{
const pstring param_in_fqn = build_fqn(param_in);
- const pstring &outname = resolve_alias(param_in_fqn);
- auto ret = m_params.find(outname);
+ const pstring outname(resolve_alias(param_in_fqn));
+ auto ret(m_params.find(outname));
if (ret == m_params.end() && required)
{
log().fatal(MF_PARAMETER_1_2_NOT_FOUND(param_in_fqn, outname));
@@ -561,7 +561,7 @@ param_t *setup_t::find_param(const pstring &param_in, bool required) const
}
if (ret != m_params.end())
log().debug("Found parameter {1}\n", outname);
- return (ret == m_params.end() ? nullptr : &ret->second.m_param);
+ return (ret == m_params.end() ? nullptr : ret->second.param());
}
devices::nld_base_proxy *setup_t::get_d_a_proxy(detail::core_terminal_t &out)
@@ -935,8 +935,16 @@ void setup_t::resolve_inputs()
for (auto & i : m_terminals)
{
detail::core_terminal_t *term = i.second;
- if (!term->has_net() && dynamic_cast< devices::NETLIB_NAME(dummy_input) *>(&term->device()) != nullptr)
- log().info(MI_DUMMY_1_WITHOUT_CONNECTIONS(term->name()));
+ bool is_nc(dynamic_cast< devices::NETLIB_NAME(nc_pin) *>(&term->device()) != nullptr);
+ if (term->has_net() && is_nc)
+ {
+ log().error(ME_NC_PIN_1_WITH_CONNECTIONS(term->name()));
+ err = true;
+ }
+ else if (is_nc)
+ {
+ /* ignore */
+ }
else if (!term->has_net())
{
log().error(ME_TERMINAL_1_WITHOUT_NET(setup().de_alias(term->name())));
@@ -1295,20 +1303,12 @@ void setup_t::prepare_to_run()
{
if (t->m_N.net().isRailNet() && t->m_P.net().isRailNet())
{
- // We are not interested in power terminals - This is intended behaviour
- if (!plib::endsWith(t->name(), pstring(".") + sPowerDevRes))
- log().info(MI_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3(
- t->name(), t->m_N.net().name(), t->m_P.net().name()));
+ log().info(MI_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3(
+ t->name(), t->m_N.net().name(), t->m_P.net().name()));
t->m_N.net().remove_terminal(t->m_N);
t->m_P.net().remove_terminal(t->m_P);
m_nlstate.remove_device(t);
}
- else
- {
- if (plib::endsWith(t->name(), pstring(".") + sPowerDevRes))
- log().info(MI_POWER_TERMINALS_1_CONNECTED_ANALOG_2_3(
- t->name(), t->m_N.net().name(), t->m_P.net().name()));
- }
}
log().verbose("initialize solver ...\n");
diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h
index e07a8009157..77bb68d8803 100644
--- a/src/lib/netlist/nl_setup.h
+++ b/src/lib/netlist/nl_setup.h
@@ -165,6 +165,10 @@ namespace netlist
, m_device(device)
, m_param(param)
{ }
+ const pstring &name() const noexcept { return m_name; }
+ const core_device_t &device() const noexcept { return m_device; }
+ param_t *param() const noexcept { return &m_param; }
+ private:
pstring m_name;
core_device_t &m_device;
param_t &m_param;
@@ -317,11 +321,11 @@ namespace netlist
void add_define(const pstring &defstr);
- factory::list_t &factory() { return m_factory; }
- const factory::list_t &factory() const { return m_factory; }
+ factory::list_t &factory() noexcept { return m_factory; }
+ const factory::list_t &factory() const noexcept { return m_factory; }
- log_type &log() { return m_log; }
- const log_type &log() const { return m_log; }
+ log_type &log() noexcept { return m_log; }
+ const log_type &log() const noexcept { return m_log; }
// FIXME: sources may need access to the netlist parent type
// since they may be created in a context in which they don't
@@ -330,11 +334,11 @@ namespace netlist
// We thus need a better approach to creating netlists in a context
// other than static procedures.
- setup_t &setup() { return m_setup; }
- const setup_t &setup() const { return m_setup; }
+ setup_t &setup() noexcept { return m_setup; }
+ const setup_t &setup() const noexcept { return m_setup; }
- models_t &models() { return m_models; }
- const models_t &models() const { return m_models; }
+ models_t &models() noexcept { return m_models; }
+ const models_t &models() const noexcept { return m_models; }
protected:
models_t m_models;
diff --git a/src/lib/netlist/plib/parray.h b/src/lib/netlist/plib/parray.h
index ea240faaac7..c60698d10e1 100644
--- a/src/lib/netlist/plib/parray.h
+++ b/src/lib/netlist/plib/parray.h
@@ -24,14 +24,14 @@ namespace plib {
template <typename FT, int SIZE>
struct sizeabs
{
- static constexpr std::size_t ABS() { return (SIZE < 0) ? static_cast<std::size_t>(0 - SIZE) : static_cast<std::size_t>(SIZE); }
+ static constexpr std::size_t ABS() noexcept { return (SIZE < 0) ? static_cast<std::size_t>(0 - SIZE) : static_cast<std::size_t>(SIZE); }
using container = typename std::array<FT, ABS()> ;
};
template <typename FT>
struct sizeabs<FT, 0>
{
- static constexpr std::size_t ABS() { return 0; }
+ static constexpr std::size_t ABS() noexcept { return 0; }
//using container = typename std::vector<FT, arena_allocator<mempool, FT, 64>>;
using container = typename std::vector<FT, aligned_allocator<FT, PALIGN_VECTOROPT>>;
};
@@ -55,7 +55,7 @@ namespace plib {
struct parray
{
public:
- static constexpr std::size_t SIZEABS() { return sizeabs<FT, SIZE>::ABS(); }
+ static constexpr std::size_t SIZEABS() noexcept { return sizeabs<FT, SIZE>::ABS(); }
using base_type = typename sizeabs<FT, SIZE>::container;
using size_type = typename base_type::size_type;
diff --git a/src/lib/netlist/plib/pchrono.h b/src/lib/netlist/plib/pchrono.h
index 640921e15d8..08738f98a9d 100644
--- a/src/lib/netlist/plib/pchrono.h
+++ b/src/lib/netlist/plib/pchrono.h
@@ -194,7 +194,7 @@ namespace plib {
{
guard_t() = delete;
explicit guard_t(timer &m) noexcept : m_m(m) { m_m.m_time -= T::start(); }
- ~guard_t() { m_m.m_time += T::stop(); ++m_m.m_count; }
+ ~guard_t() noexcept { m_m.m_time += T::stop(); ++m_m.m_count; }
COPYASSIGNMOVE(guard_t, default)
@@ -208,7 +208,7 @@ namespace plib {
type operator()() const { return m_time; }
- void reset() { m_time = 0; m_count = 0; }
+ void reset() noexcept { m_time = 0; m_count = 0; }
type average() const noexcept { return (m_count == 0) ? 0 : m_time / m_count; }
type total() const noexcept { return m_time; }
ctype count() const noexcept { return m_count; }
@@ -237,7 +237,7 @@ namespace plib {
// unused local variable.
// NOLINTNEXTLINE(modernize-use-equals-default)
- ~guard_t() { }
+ ~guard_t() noexcept { }
};
constexpr type operator()() const noexcept { return 0; }
diff --git a/src/lib/netlist/plib/pdynlib.cpp b/src/lib/netlist/plib/pdynlib.cpp
index a569d36dad5..d92e0b471d0 100644
--- a/src/lib/netlist/plib/pdynlib.cpp
+++ b/src/lib/netlist/plib/pdynlib.cpp
@@ -132,12 +132,7 @@ dynlib::~dynlib()
}
}
-bool dynlib::isLoaded() const
-{
- return m_isLoaded;
-}
-
-void *dynlib::getsym_p(const pstring &name)
+void *dynlib::getsym_p(const pstring &name) const noexcept
{
#ifdef _WIN32
return (void *) GetProcAddress((HMODULE) m_lib, name.c_str());
diff --git a/src/lib/netlist/plib/pdynlib.h b/src/lib/netlist/plib/pdynlib.h
index b776d8e9b89..9c44452d16f 100644
--- a/src/lib/netlist/plib/pdynlib.h
+++ b/src/lib/netlist/plib/pdynlib.h
@@ -25,15 +25,15 @@ public:
~dynlib();
COPYASSIGNMOVE(dynlib, delete)
- bool isLoaded() const;
+ bool isLoaded() const { return m_isLoaded; }
template <typename T>
- T getsym(const pstring &name)
+ T getsym(const pstring &name) const noexcept
{
return reinterpret_cast<T>(getsym_p(name));
}
private:
- void *getsym_p(const pstring &name);
+ void *getsym_p(const pstring &name) const noexcept;
bool m_isLoaded;
void *m_lib;
@@ -47,12 +47,12 @@ public:
dynproc() : m_sym(nullptr) { }
- dynproc(dynlib &dl, const pstring &name)
+ dynproc(dynlib &dl, const pstring &name) noexcept
{
m_sym = dl.getsym<calltype>(name);
}
- void load(dynlib &dl, const pstring &name)
+ void load(dynlib &dl, const pstring &name) noexcept
{
m_sym = dl.getsym<calltype>(name);
}
@@ -63,7 +63,7 @@ public:
//return m_sym(args...);
}
- bool resolved() const { return m_sym != nullptr; }
+ bool resolved() const noexcept { return m_sym != nullptr; }
private:
calltype m_sym;
};
diff --git a/src/lib/netlist/plib/pstring.cpp b/src/lib/netlist/plib/pstring.cpp
index 7af1228ef6d..b6ec39c25ed 100644
--- a/src/lib/netlist/plib/pstring.cpp
+++ b/src/lib/netlist/plib/pstring.cpp
@@ -10,7 +10,7 @@
#include <stack>
template<typename F>
-int pstring_t<F>::compare(const pstring_t &right) const
+int pstring_t<F>::compare(const pstring_t &right) const noexcept
{
if (mem_t_size() == 0 && right.mem_t_size() == 0)
return 0;
@@ -54,7 +54,7 @@ pstring_t<F> pstring_t<F>::substr(size_type start, size_type nlen) const
}
template<typename F>
-typename pstring_t<F>::size_type pstring_t<F>::find(const pstring_t &search, size_type start) const
+typename pstring_t<F>::size_type pstring_t<F>::find(const pstring_t &search, size_type start) const noexcept
{
auto istart = std::next(begin(), static_cast<difference_type>(start));
for (; istart != end(); ++istart)
@@ -74,7 +74,7 @@ typename pstring_t<F>::size_type pstring_t<F>::find(const pstring_t &search, siz
}
template<typename F>
-typename pstring_t<F>::size_type pstring_t<F>::find(code_t search, size_type start) const
+typename pstring_t<F>::size_type pstring_t<F>::find(code_t search, size_type start) const noexcept
{
pstring_t ss;
traits_type::encode(search, ss.m_str);
diff --git a/src/lib/netlist/plib/pstring.h b/src/lib/netlist/plib/pstring.h
index 5c2ac2b9c47..4a9d99300bb 100644
--- a/src/lib/netlist/plib/pstring.h
+++ b/src/lib/netlist/plib/pstring.h
@@ -161,26 +161,26 @@ public:
using iterator = pstring_const_iterator<pstring_t<F> >;
using const_iterator = pstring_const_iterator<pstring_t<F> >;
- iterator begin() { return iterator(m_str.begin()); }
- iterator end() { return iterator(m_str.end()); }
- const_iterator begin() const { return const_iterator(m_str.begin()); }
- const_iterator end() const { return const_iterator(m_str.end()); }
- const_iterator cbegin() const { return const_iterator(m_str.begin()); }
- const_iterator cend() const { return const_iterator(m_str.end()); }
+ iterator begin() noexcept { return iterator(m_str.begin()); }
+ iterator end() noexcept { return iterator(m_str.end()); }
+ const_iterator begin() const noexcept { return const_iterator(m_str.begin()); }
+ const_iterator end() const noexcept { return const_iterator(m_str.end()); }
+ const_iterator cbegin() const noexcept { return const_iterator(m_str.begin()); }
+ const_iterator cend() const noexcept { return const_iterator(m_str.end()); }
// C string conversion helpers
- const mem_t *c_str() const { return static_cast<const mem_t *>(m_str.c_str()); }
- const mem_t *data() const { return c_str(); }
+ const mem_t *c_str() const noexcept { return static_cast<const mem_t *>(m_str.c_str()); }
+ const mem_t *data() const noexcept { return c_str(); }
- size_type length() const { return traits_type::len(m_str); }
- size_type size() const { return traits_type::len(m_str); }
- bool empty() const { return m_str.size() == 0; }
+ size_type length() const noexcept { return traits_type::len(m_str); }
+ size_type size() const noexcept { return traits_type::len(m_str); }
+ bool empty() const noexcept { return m_str.size() == 0; }
pstring_t substr(size_type start, size_type nlen = npos) const;
- int compare(const pstring_t &right) const;
+ int compare(const pstring_t &right) const noexcept;
- size_type find(const pstring_t &search, size_type start = 0) const;
- size_type find(code_t search, size_type start = 0) const;
+ size_type find(const pstring_t &search, size_type start = 0) const noexcept;
+ size_type find(code_t search, size_type start = 0) const noexcept;
// concatenation operators
pstring_t& operator+=(const pstring_t &string) { m_str.append(string.m_str); return *this; }
@@ -190,13 +190,13 @@ public:
friend pstring_t operator+(const code_t lhs, const pstring_t &rhs) { return pstring_t(1, lhs) += rhs; }
// comparison operators
- bool operator==(const pstring_t &string) const { return (compare(string) == 0); }
- bool operator!=(const pstring_t &string) const { return (compare(string) != 0); }
+ bool operator==(const pstring_t &string) const noexcept { return (compare(string) == 0); }
+ bool operator!=(const pstring_t &string) const noexcept { return (compare(string) != 0); }
- bool operator<(const pstring_t &string) const { return (compare(string) < 0); }
- bool operator<=(const pstring_t &string) const { return (compare(string) <= 0); }
- bool operator>(const pstring_t &string) const { return (compare(string) > 0); }
- bool operator>=(const pstring_t &string) const { return (compare(string) >= 0); }
+ bool operator<(const pstring_t &string) const noexcept { return (compare(string) < 0); }
+ bool operator<=(const pstring_t &string) const noexcept { return (compare(string) <= 0); }
+ bool operator>(const pstring_t &string) const noexcept { return (compare(string) > 0); }
+ bool operator>=(const pstring_t &string) const noexcept { return (compare(string) >= 0); }
friend auto operator<<(std::basic_ostream<typename string_type::value_type> &ostrm, const pstring_t &str) -> std::basic_ostream<typename string_type::value_type> &
{
@@ -211,7 +211,7 @@ public:
// the following are extensions to <string>
// FIXME: remove those
- size_type mem_t_size() const { return m_str.size(); }
+ size_type mem_t_size() const noexcept { return m_str.size(); }
private:
string_type m_str;
@@ -222,12 +222,12 @@ struct pu8_traits
using mem_t = char;
using code_t = char;
using string_type = std::string;
- static std::size_t len(const string_type &p) { return p.size(); }
- static std::size_t codelen(const mem_t *p) { plib::unused_var(p); return 1; }
- static std::size_t codelen(const code_t c) { plib::unused_var(c); return 1; }
- static code_t code(const mem_t *p) { return *p; }
+ static std::size_t len(const string_type &p) noexcept { return p.size(); }
+ static std::size_t codelen(const mem_t *p) noexcept { plib::unused_var(p); return 1; }
+ static std::size_t codelen(const code_t c) noexcept { plib::unused_var(c); return 1; }
+ static code_t code(const mem_t *p) noexcept { return *p; }
static void encode(const code_t c, string_type &s) { s += static_cast<mem_t>(c); }
- static const mem_t *nthcode(const mem_t *p, const std::size_t n) { return &(p[n]); }
+ static const mem_t *nthcode(const mem_t *p, const std::size_t n) noexcept { return &(p[n]); }
};
// No checking, this may deliver invalid codes
@@ -236,7 +236,7 @@ struct putf8_traits
using mem_t = char;
using code_t = char32_t;
using string_type = std::string;
- static std::size_t len(const string_type &p)
+ static std::size_t len(const string_type &p) noexcept
{
std::size_t ret = 0;
for (const auto &c : p)
@@ -246,7 +246,7 @@ struct putf8_traits
}
return ret;
}
- static std::size_t codelen(const mem_t *p)
+ static std::size_t codelen(const mem_t *p) noexcept
{
const auto p1 = reinterpret_cast<const unsigned char *>(p);
if ((*p1 & 0xE0) == 0xC0)
@@ -262,7 +262,7 @@ struct putf8_traits
return 1;
}
}
- static std::size_t codelen(const code_t c)
+ static std::size_t codelen(const code_t c) noexcept
{
if (c < 0x0080)
return 1;
@@ -273,7 +273,7 @@ struct putf8_traits
else // U+10000 U+1FFFFF
return 4; // no checks
}
- static code_t code(const mem_t *p)
+ static code_t code(const mem_t *p) noexcept
{
const auto p1 = reinterpret_cast<const unsigned char *>(p);
if ((*p1 & 0x80) == 0x00)
@@ -312,7 +312,7 @@ struct putf8_traits
s += static_cast<mem_t>(0x80 | (c & 0x3f));
}
}
- static const mem_t *nthcode(const mem_t *p, const std::size_t n)
+ static const mem_t *nthcode(const mem_t *p, const std::size_t n) noexcept
{
const mem_t *p1 = p;
std::size_t i = n;
@@ -327,7 +327,7 @@ struct putf16_traits
using mem_t = char16_t;
using code_t = char32_t;
using string_type = std::u16string;
- static std::size_t len(const string_type &p)
+ static std::size_t len(const string_type &p) noexcept
{
std::size_t ret = 0;
auto i = p.begin();
@@ -340,19 +340,19 @@ struct putf16_traits
}
return ret;
}
- static std::size_t codelen(const mem_t *p)
+ static std::size_t codelen(const mem_t *p) noexcept
{
auto c = static_cast<uint16_t>(*p);
return ((c & 0xd800) == 0xd800) ? 2 : 1;
}
- static std::size_t codelen(const code_t c)
+ static std::size_t codelen(const code_t c) noexcept
{
if (c < 0x10000)
return 1;
else // U+10000 U+1FFFFF
return 2;
}
- static code_t code(const mem_t *p)
+ static code_t code(const mem_t *p) noexcept
{
auto c = static_cast<uint32_t>(*p++);
if ((c & 0xd800) == 0xd800)
@@ -362,7 +362,7 @@ struct putf16_traits
}
return static_cast<code_t>(c);
}
- static void encode(code_t c, string_type &s)
+ static void encode(code_t c, string_type &s) noexcept
{
auto cu = static_cast<uint32_t>(c);
if (c > 0xffff)
@@ -377,7 +377,7 @@ struct putf16_traits
s += static_cast<mem_t>(cu);
}
}
- static const mem_t *nthcode(const mem_t *p, const std::size_t n)
+ static const mem_t *nthcode(const mem_t *p, const std::size_t n) noexcept
{
std::size_t i = n;
while (i-- > 0)
@@ -391,7 +391,7 @@ struct pwchar_traits
using mem_t = wchar_t;
using code_t = char32_t;
using string_type = std::wstring;
- static std::size_t len(const string_type &p)
+ static std::size_t len(const string_type &p) noexcept
{
if (sizeof(wchar_t) == 2)
{
@@ -410,7 +410,7 @@ struct pwchar_traits
return p.size();
}
- static std::size_t codelen(const mem_t *p)
+ static std::size_t codelen(const mem_t *p) noexcept
{
if (sizeof(wchar_t) == 2)
{
@@ -421,7 +421,7 @@ struct pwchar_traits
return 1;
}
- static std::size_t codelen(const code_t c)
+ static std::size_t codelen(const code_t c) noexcept
{
if (sizeof(wchar_t) == 2)
return ((c & 0xd800) == 0xd800) ? 2 : 1;
@@ -463,7 +463,7 @@ struct pwchar_traits
else
s += static_cast<wchar_t>(c);
}
- static const mem_t *nthcode(const mem_t *p, const std::size_t n)
+ static const mem_t *nthcode(const mem_t *p, const std::size_t n) noexcept
{
if (sizeof(wchar_t) == 2)
{
diff --git a/src/lib/netlist/plib/ptypes.h b/src/lib/netlist/plib/ptypes.h
index d34651b9f70..7619faa1348 100644
--- a/src/lib/netlist/plib/ptypes.h
+++ b/src/lib/netlist/plib/ptypes.h
@@ -57,12 +57,12 @@ namespace plib
struct nocopyassignmove
{
nocopyassignmove(const nocopyassignmove &) = delete;
- nocopyassignmove(nocopyassignmove &&) = delete;
+ nocopyassignmove(nocopyassignmove &&) noexcept = delete;
nocopyassignmove &operator=(const nocopyassignmove &) = delete;
- nocopyassignmove &operator=(nocopyassignmove &&) = delete;
+ nocopyassignmove &operator=(nocopyassignmove &&) noexcept = delete;
protected:
nocopyassignmove() = default;
- ~nocopyassignmove() = default;
+ ~nocopyassignmove() noexcept = default;
};
struct nocopyassign
@@ -71,9 +71,9 @@ namespace plib
nocopyassign &operator=(const nocopyassign &) = delete;
protected:
nocopyassign() = default;
- ~nocopyassign() = default;
- nocopyassign(nocopyassign &&) = default;
- nocopyassign &operator=(nocopyassign &&) = default;
+ ~nocopyassign() noexcept = default;
+ nocopyassign(nocopyassign &&) noexcept = default;
+ nocopyassign &operator=(nocopyassign &&) noexcept = default;
};
//============================================================
diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h
index 09695f203aa..3065cd55afa 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.h
+++ b/src/lib/netlist/solver/nld_matrix_solver.h
@@ -186,7 +186,7 @@ namespace solver
bool has_timestep_devices() const noexcept { return m_step_devices.size() > 0; }
void update_forced();
- void update_after(const netlist_time after)
+ void update_after(netlist_time after) noexcept
{
m_Q_sync.net().toggle_and_push_to_queue(after);
}