diff options
Diffstat (limited to 'src/lib/netlist/devices/nlid_proxy.cpp')
-rw-r--r-- | src/lib/netlist/devices/nlid_proxy.cpp | 101 |
1 files changed, 48 insertions, 53 deletions
diff --git a/src/lib/netlist/devices/nlid_proxy.cpp b/src/lib/netlist/devices/nlid_proxy.cpp index e8cc27fc987..0ab77e84e7d 100644 --- a/src/lib/netlist/devices/nlid_proxy.cpp +++ b/src/lib/netlist/devices/nlid_proxy.cpp @@ -1,9 +1,10 @@ -// license:GPL-2.0+ +// license:BSD-3-Clause // copyright-holders:Couriersud -/* - * nlid_proxy.cpp - * - */ + +/// +/// \file nlid_proxy.cpp +/// +/// #include "nlid_proxy.h" #include "core/setup.h" @@ -12,10 +13,7 @@ #include <array> -namespace netlist -{ - namespace devices - { +namespace netlist::devices { // ----------------------------------------------------------------------------- // nld_base_proxy @@ -23,9 +21,9 @@ namespace netlist 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) { @@ -34,15 +32,14 @@ namespace netlist 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)) { @@ -51,23 +48,23 @@ namespace netlist 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()); } @@ -76,16 +73,16 @@ namespace netlist // 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", nldelegate(&nld_a_to_d_proxy::input, this)) + , m_I(*this, "I", nl_delegate(&nld_a_to_d_proxy::input, this)) { } @@ -95,9 +92,9 @@ namespace netlist const auto vn(m_tn->net().Q_Analog()); const auto vp(m_tp->net().Q_Analog()); - if (logic_family()->is_above_high_thresh_V(v, vn, vp)) + if (logic_family()->is_above_high_threshold_V(v, vn, vp)) out().push(1, netlist_time::quantum()); - else if (logic_family()->is_below_low_thresh_V(v, vn, vp)) + else if (logic_family()->is_below_low_threshold_V(v, vn, vp)) out().push(0, netlist_time::quantum()); else { @@ -109,25 +106,25 @@ namespace netlist // 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) - , m_I(*this, "I", nldelegate(&nld_d_to_a_proxy :: input, this)) + 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") , m_last_state(*this, "m_last_var", terminal_t::OUT_TRISTATE()) { - register_subalias("Q", "RN.1"); + 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()); } @@ -135,11 +132,11 @@ namespace netlist { //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()); } @@ -150,29 +147,29 @@ namespace netlist 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; @@ -184,6 +181,4 @@ namespace netlist } } - - } //namespace devices -} // namespace netlist +} // namespace netlist::devices |