summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nlid_proxy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices/nlid_proxy.cpp')
-rw-r--r--src/lib/netlist/devices/nlid_proxy.cpp71
1 files changed, 35 insertions, 36 deletions
diff --git a/src/lib/netlist/devices/nlid_proxy.cpp b/src/lib/netlist/devices/nlid_proxy.cpp
index 96ec987df8e..0ab77e84e7d 100644
--- a/src/lib/netlist/devices/nlid_proxy.cpp
+++ b/src/lib/netlist/devices/nlid_proxy.cpp
@@ -21,9 +21,9 @@ namespace netlist::devices {
static constexpr std::array<std::pair<const char *, const char *>, 3> power_syms = {{ {"VCC", "VEE"}, {"VCC", "GND"}, {"VDD", "VSS"}}};
- nld_base_proxy::nld_base_proxy(netlist_state_t &anetlist, const pstring &name,
+ nld_base_proxy::nld_base_proxy(device_param_t data,
const logic_t *inout_proxied)
- : device_t(anetlist, name, inout_proxied->logic_family())
+ : device_t(data, inout_proxied->logic_family())
, m_tp(nullptr)
, m_tn(nullptr)
{
@@ -32,15 +32,14 @@ namespace netlist::devices {
throw nl_exception(MF_NULLPTR_FAMILY_NP("nld_base_proxy"));
}
-
bool f = false;
for (const auto & pwr_sym : power_syms)
{
pstring devname = inout_proxied->device().name();
- auto *tp_ct(anetlist.setup().find_terminal(devname + "." + pstring(pwr_sym.first),
+ auto *tp_ct(state().setup().find_terminal(devname + "." + pstring(pwr_sym.first),
/*detail::terminal_type::INPUT,*/ false));
- auto *tp_cn(anetlist.setup().find_terminal(devname + "." + pstring(pwr_sym.second),
+ auto *tp_cn(state().setup().find_terminal(devname + "." + pstring(pwr_sym.second),
/*detail::terminal_type::INPUT,*/ false));
if ((tp_ct != nullptr) && (tp_cn != nullptr))
{
@@ -49,23 +48,23 @@ namespace netlist::devices {
if (!tp_cn->is_analog())
throw nl_exception(plib::pfmt("Not an analog terminal: {1}")(tp_cn->name()));
- auto *tp_t = dynamic_cast<analog_t* >(tp_ct);
- auto *tn_t = dynamic_cast<analog_t *>(tp_cn);
- if (f && (tp_t != nullptr && tn_t != nullptr))
+ auto tp_t = plib::dynamic_downcast<analog_t* >(tp_ct);
+ auto tn_t = plib::dynamic_downcast<analog_t *>(tp_cn);
+ if (f && (tp_t && tn_t))
log().warning(MI_MULTIPLE_POWER_TERMINALS_ON_DEVICE(inout_proxied->device().name(),
m_tp->name(), m_tn->name(),
- tp_t != nullptr ? tp_t->name() : "",
- tn_t != nullptr ? tn_t->name() : ""));
- else if (tp_t != nullptr && tn_t != nullptr)
+ tp_t ? (*tp_t)->name() : "",
+ tn_t ? (*tn_t)->name() : ""));
+ else if (tp_t && tn_t)
{
- m_tp = tp_t;
- m_tn = tn_t;
+ m_tp = *tp_t;
+ m_tn = *tn_t;
f = true;
}
}
}
if (!f)
- throw nl_exception(MF_NO_POWER_TERMINALS_ON_DEVICE_2(name, anetlist.setup().de_alias(inout_proxied->device().name())));
+ throw nl_exception(MF_NO_POWER_TERMINALS_ON_DEVICE_2(name(), state().setup().de_alias(inout_proxied->device().name())));
log().verbose("D/A Proxy: Found power terminals on device {1}", inout_proxied->device().name());
}
@@ -74,14 +73,14 @@ namespace netlist::devices {
// nld_a_to_d_proxy
// ----------------------------------------------------------------------------------------
- nld_base_a_to_d_proxy::nld_base_a_to_d_proxy(netlist_state_t &anetlist, const pstring &name,
+ nld_base_a_to_d_proxy::nld_base_a_to_d_proxy(device_param_t data,
const logic_input_t *in_proxied)
- : nld_base_proxy(anetlist, name, in_proxied)
+ : nld_base_proxy(data, in_proxied)
{
}
- nld_a_to_d_proxy::nld_a_to_d_proxy(netlist_state_t &anetlist, const pstring &name, const logic_input_t *in_proxied)
- : nld_base_a_to_d_proxy(anetlist, name, in_proxied)
+ nld_a_to_d_proxy::nld_a_to_d_proxy(device_param_t data, const logic_input_t *in_proxied)
+ : nld_base_a_to_d_proxy(data, in_proxied)
, m_Q(*this, "Q")
, m_I(*this, "I", nl_delegate(&nld_a_to_d_proxy::input, this))
{
@@ -107,14 +106,14 @@ namespace netlist::devices {
// nld_d_to_a_proxy
// ----------------------------------------------------------------------------------------
- nld_base_d_to_a_proxy::nld_base_d_to_a_proxy(netlist_state_t &anetlist, const pstring &name,
+ nld_base_d_to_a_proxy::nld_base_d_to_a_proxy(device_param_t data,
const logic_output_t *out_proxied)
- : nld_base_proxy(anetlist, name, out_proxied)
+ : nld_base_proxy(data, out_proxied)
{
}
- nld_d_to_a_proxy::nld_d_to_a_proxy(netlist_state_t &anetlist, const pstring &name, const logic_output_t *out_proxied)
- : nld_base_d_to_a_proxy(anetlist, name, out_proxied)
+ nld_d_to_a_proxy::nld_d_to_a_proxy(device_param_t data, const logic_output_t *out_proxied)
+ : nld_base_d_to_a_proxy(data, out_proxied)
, m_I(*this, "I", nl_delegate(&nld_d_to_a_proxy :: input, this))
, m_RP(*this, "RP")
, m_RN(*this, "RN")
@@ -122,10 +121,10 @@ namespace netlist::devices {
{
register_sub_alias("Q", "RN.1");
- connect(m_RN.N(), *m_tn);
- connect(m_RP.P(), *m_tp);
+ connect(m_RN().N(), *m_tn);
+ connect(m_RP().P(), *m_tp);
- connect(m_RN.P(), m_RP.N());
+ connect(m_RN().P(), m_RP().N());
}
@@ -133,11 +132,11 @@ namespace netlist::devices {
{
//m_Q.initial(0.0);
m_last_state = terminal_t::OUT_TRISTATE();
- m_RN.reset();
- m_RP.reset();
- m_RN.set_G_V_I(plib::reciprocal(logic_family()->R_low()),
+ m_RN().reset();
+ m_RP().reset();
+ m_RN().set_G_V_I(plib::reciprocal(logic_family()->R_low()),
logic_family()->low_offset_V(), nlconst::zero());
- m_RP.set_G_V_I(G_OFF,
+ m_RP().set_G_V_I(G_OFF,
nlconst::zero(),
nlconst::zero());
}
@@ -148,29 +147,29 @@ namespace netlist::devices {
if (state != m_last_state)
{
// RN, RP are connected ...
- m_RN.change_state([this, &state]()
+ m_RN().change_state([this, &state]()
{
switch (state)
{
case 0:
- m_RN.set_G_V_I(plib::reciprocal(logic_family()->R_low()),
+ m_RN().set_G_V_I(plib::reciprocal(logic_family()->R_low()),
logic_family()->low_offset_V(), nlconst::zero());
- m_RP.set_G_V_I(G_OFF,
+ m_RP().set_G_V_I(G_OFF,
nlconst::zero(),
nlconst::zero());
break;
case 1:
- m_RN.set_G_V_I(G_OFF,
+ m_RN().set_G_V_I(G_OFF,
nlconst::zero(),
nlconst::zero());
- m_RP.set_G_V_I(plib::reciprocal(logic_family()->R_high()),
+ m_RP().set_G_V_I(plib::reciprocal(logic_family()->R_high()),
logic_family()->high_offset_V(), nlconst::zero());
break;
case terminal_t::OUT_TRISTATE():
- m_RN.set_G_V_I(G_OFF,
+ m_RN().set_G_V_I(G_OFF,
nlconst::zero(),
nlconst::zero());
- m_RP.set_G_V_I(G_OFF,
+ m_RP().set_G_V_I(G_OFF,
nlconst::zero(),
nlconst::zero());
break;