summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nld_r2r_dac.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices/nld_r2r_dac.cpp')
-rw-r--r--src/lib/netlist/devices/nld_r2r_dac.cpp97
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