diff options
Diffstat (limited to 'src/lib/netlist/devices/nld_r2r_dac.cpp')
-rw-r--r-- | src/lib/netlist/devices/nld_r2r_dac.cpp | 97 |
1 files changed, 68 insertions, 29 deletions
diff --git a/src/lib/netlist/devices/nld_r2r_dac.cpp b/src/lib/netlist/devices/nld_r2r_dac.cpp index 284b6673f76..efff78d9ca8 100644 --- a/src/lib/netlist/devices/nld_r2r_dac.cpp +++ b/src/lib/netlist/devices/nld_r2r_dac.cpp @@ -1,55 +1,94 @@ -// license:GPL-2.0+ +// license:BSD-3-Clause // copyright-holders:Couriersud /* - * nld_R2R_dac.c + * nld_r2r_dac.cpp + * + * DMR2R_DAC: R-2R DAC + * + * Generic R-2R DAC ... This is fast. + * 2R + * Bit n >----RRR----+---------> Vout + * | + * R + * R R + * R + * | + * . + * . + * 2R | + * Bit 2 >----RRR----+ + * | + * R + * R R + * R + * | + * 2R | + * Bit 1 >----RRR----+ + * | + * R + * R 2R + * R + * | + * V0 + * + * Using Thevenin's Theorem, this can be written as + * + * +---RRR-----------> Vout + * | + * V + * V V = VAL / 2^n * Vin + * V + * | + * V0 * */ -#include "netlist/nl_base.h" -#include "netlist/analog/nlid_twoterm.h" -#include "netlist/nl_factory.h" +#include "nl_base.h" +#include "nl_factory.h" + +#include "analog/nlid_twoterm.h" -namespace netlist +namespace netlist::analog { - namespace analog - { - NETLIB_OBJECT_DERIVED(r2r_dac, twoterm) + + class nld_r2r_dac : public nld_two_terminal { - NETLIB_CONSTRUCTOR_DERIVED(r2r_dac, twoterm) - , m_VIN(*this, "VIN", 1.0) - , m_R(*this, "R", 1.0) + public: + nld_r2r_dac(constructor_param_t data) + : nld_two_terminal(data) + , m_VIN(*this, "VIN", nlconst::one()) + , m_R(*this, "R", nlconst::one()) , m_num(*this, "N", 1) , m_val(*this, "VAL", 1) { - register_subalias("VOUT", m_P); - register_subalias("VGND", m_N); + register_sub_alias("VOUT", P()); + register_sub_alias("VGND", N()); } NETLIB_UPDATE_PARAMI(); - //NETLIB_RESETI(); - //NETLIB_UPDATEI(); + // NETLIB_RESETI(); protected: - param_double_t m_VIN; - param_double_t m_R; + param_fp_t m_VIN; + param_fp_t m_R; param_int_t m_num; param_int_t m_val; }; - NETLIB_UPDATE_PARAM(r2r_dac) { - solve_now(); + nl_fptype V = m_VIN() / static_cast<nl_fptype>(1 << m_num()) + * static_cast<nl_fptype>(m_val()); + change_state( + [this, &V]() + { this->set_G_V_I(plib::reciprocal(m_R()), V, nlconst::zero()); }); + } - double V = m_VIN() / static_cast<double>(1 << m_num()) - * static_cast<double>(m_val()); +} // namespace netlist::analog - this->set_G_V_I(1.0 / m_R(), V, 0.0); - } - } //namespace analog +namespace netlist::devices +{ - namespace devices { - NETLIB_DEVICE_IMPL_NS(analog, r2r_dac, "R2R_DAC", "VIN,R,N") - } // namespace devices + NETLIB_DEVICE_IMPL_NS(analog, r2r_dac, "R2R_DAC", "VIN,R,N") -} // namespace netlist +} // namespace netlist::devices |