diff options
author | andreasnaive <andreasnaive@gmail.com> | 2019-03-25 23:13:40 +0100 |
---|---|---|
committer | andreasnaive <andreasnaive@gmail.com> | 2019-03-25 23:13:40 +0100 |
commit | b380514764cf857469bae61c11143a19f79a74c5 (patch) | |
tree | 63c8012e262618f08a332da31dd714281aa2c5ed /src/lib/netlist/devices/nld_ne555.cpp | |
parent | c24473ddff715ecec2e258a6eb38960cf8c8e98e (diff) |
Revert "conflict resolution (nw)"
This reverts commit c24473ddff715ecec2e258a6eb38960cf8c8e98e, reversing
changes made to 009cba4fb8102102168ef32870892438327f3705.
Diffstat (limited to 'src/lib/netlist/devices/nld_ne555.cpp')
-rw-r--r-- | src/lib/netlist/devices/nld_ne555.cpp | 101 |
1 files changed, 44 insertions, 57 deletions
diff --git a/src/lib/netlist/devices/nld_ne555.cpp b/src/lib/netlist/devices/nld_ne555.cpp index 5e990d2e974..8795197bd57 100644 --- a/src/lib/netlist/devices/nld_ne555.cpp +++ b/src/lib/netlist/devices/nld_ne555.cpp @@ -46,8 +46,8 @@ */ #include "nld_ne555.h" -#include "netlist/analog/nlid_twoterm.h" -#include "netlist/solver/nld_solver.h" +#include "../analog/nlid_twoterm.h" +#include "../solver/nld_solver.h" #define R_OFF (1E20) #define R_ON (25) // Datasheet states a maximum discharge of 200mA, R = 5V / 0.2 @@ -62,37 +62,31 @@ namespace netlist , m_R1(*this, "R1") , m_R2(*this, "R2") , m_R3(*this, "R3") - , m_ROUT(*this, "ROUT") , m_RDIS(*this, "RDIS") , m_RESET(*this, "RESET") // Pin 4 , m_THRES(*this, "THRESH") // Pin 6 , m_TRIG(*this, "TRIG") // Pin 2 - , m_OUT(*this, "_OUT") // to Pin 3 via ROUT + , m_OUT(*this, "OUT") // Pin 3 , m_last_out(*this, "m_last_out", false) , m_ff(*this, "m_ff", false) - , m_last_reset(*this, "m_last_reset", false) { register_subalias("GND", m_R3.m_N); // Pin 1 register_subalias("CONT", m_R1.m_N); // Pin 5 register_subalias("DISCH", m_RDIS.m_P); // Pin 7 register_subalias("VCC", m_R1.m_P); // Pin 8 - register_subalias("OUT", m_ROUT.m_P); // Pin 3 connect(m_R1.m_N, m_R2.m_P); - connect(m_R1.m_N, m_R2.m_P); connect(m_R2.m_N, m_R3.m_P); connect(m_RDIS.m_N, m_R3.m_N); - connect(m_OUT, m_ROUT.m_N); } NETLIB_UPDATEI(); NETLIB_RESETI(); - private: + protected: analog::NETLIB_SUB(R_base) m_R1; analog::NETLIB_SUB(R_base) m_R2; analog::NETLIB_SUB(R_base) m_R3; - analog::NETLIB_SUB(R_base) m_ROUT; analog::NETLIB_SUB(R_base) m_RDIS; logic_input_t m_RESET; @@ -100,51 +94,52 @@ namespace netlist analog_input_t m_TRIG; analog_output_t m_OUT; + private: state_var<bool> m_last_out; state_var<bool> m_ff; - state_var<bool> m_last_reset; - nl_double clamp(const nl_double v, const nl_double a, const nl_double b) - { - nl_double ret = v; - nl_double vcc = m_R1.m_P(); - - if (ret > vcc - a) - ret = vcc - a; - if (ret < b) - ret = b; - return ret; - } + inline nl_double clamp(const nl_double v, const nl_double a, const nl_double b); + }; NETLIB_OBJECT_DERIVED(NE555_dip, NE555) { NETLIB_CONSTRUCTOR_DERIVED(NE555_dip, NE555) { - register_subalias("1", "GND"); // Pin 1 - register_subalias("2", "TRIG"); // Pin 2 - register_subalias("3", "OUT"); // Pin 3 - register_subalias("4", "RESET"); // Pin 4 - register_subalias("5", "CONT"); // Pin 5 - register_subalias("6", "THRESH"); // Pin 6 - register_subalias("7", "DISCH"); // Pin 7 - register_subalias("8", "VCC"); // Pin 8 + register_subalias("1", m_R3.m_N); // Pin 1 + register_subalias("2", m_TRIG); // Pin 2 + register_subalias("3", m_OUT); // Pin 3 + register_subalias("4", m_RESET); // Pin 4 + register_subalias("5", m_R1.m_N); // Pin 5 + register_subalias("6", m_THRES); // Pin 6 + register_subalias("7", m_RDIS.m_P); // Pin 7 + register_subalias("8", m_R1.m_P); // Pin 8 } }; + inline nl_double NETLIB_NAME(NE555)::clamp(const nl_double v, const nl_double a, const nl_double b) + { + nl_double ret = v; + nl_double vcc = m_R1.m_P(); + + if (ret > vcc - a) + ret = vcc - a; + if (ret < b) + ret = b; + return ret; + } + NETLIB_RESET(NE555) { - m_R1.reset(); - m_R2.reset(); - m_R3.reset(); - m_ROUT.reset(); - m_RDIS.reset(); + m_R1.do_reset(); + m_R2.do_reset(); + m_R3.do_reset(); + m_RDIS.do_reset(); - /* FIXME make resistances a parameter, properly model other variants */ + /* FIXME make resistance a parameter, properly model other variants */ m_R1.set_R(5000); m_R2.set_R(5000); m_R3.set_R(5000); - m_ROUT.set_R(20); m_RDIS.set_R(R_OFF); m_last_out = true; @@ -154,47 +149,39 @@ namespace netlist { // FIXME: assumes GND is connected to 0V. - const auto reset = m_RESET(); + nl_double vt = clamp(m_R2.m_P(), 0.7, 1.4); + bool bthresh = (m_THRES() > vt); + bool btrig = (m_TRIG() > clamp(m_R2.m_N(), 0.7, 1.4)); - if (!reset && m_last_reset) + if (!btrig) { - m_ff = false; + m_ff = true; } - else + else if (bthresh) { - const nl_double vt = clamp(m_R2.m_P(), 0.7, 1.4); - const bool bthresh = (m_THRES() > vt); - const bool btrig = (m_TRIG() > clamp(m_R2.m_N(), 0.7, 1.4)); - - if (!btrig) - m_ff = true; - else if (bthresh) - m_ff = false; + m_ff = false; } - const bool out = (!reset ? false : m_ff); + bool out = (!m_RESET() ? false : m_ff); if (m_last_out && !out) { - m_RDIS.update(); + m_RDIS.update_dev(); m_OUT.push(m_R3.m_N()); m_RDIS.set_R(R_ON); } else if (!m_last_out && out) { - m_RDIS.update(); + m_RDIS.update_dev(); // FIXME: Should be delayed by 100ns m_OUT.push(m_R1.m_P()); m_RDIS.set_R(R_OFF); } - m_last_reset = reset; m_last_out = out; } - NETLIB_DEVICE_IMPL(NE555, "NE555", "") - NETLIB_DEVICE_IMPL(NE555_dip, "NE555_DIP", "") + NETLIB_DEVICE_IMPL(NE555) + NETLIB_DEVICE_IMPL(NE555_dip) - NETLIB_DEVICE_IMPL_ALIAS(MC1455P, NE555, "MC1455P", "") - NETLIB_DEVICE_IMPL_ALIAS(MC1455P_dip, NE555_dip, "MC1455P_DIP", "") } //namespace devices } // namespace netlist |