diff options
Diffstat (limited to 'src/lib/netlist/devices/nlid_proxy.cpp')
-rw-r--r-- | src/lib/netlist/devices/nlid_proxy.cpp | 71 |
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; |