diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/netlist/devices/net_lib.cpp | 1 | ||||
| -rw-r--r-- | src/lib/netlist/devices/net_lib.h | 2 | ||||
| -rw-r--r-- | src/lib/netlist/devices/nld_schmitt.cpp | 131 | ||||
| -rw-r--r-- | src/lib/netlist/devices/nld_schmitt.h | 25 | ||||
| -rw-r--r-- | src/lib/netlist/macro/nlm_base.cpp | 1 | ||||
| -rw-r--r-- | src/lib/netlist/macro/nlm_ttl74xx.cpp | 73 | ||||
| -rw-r--r-- | src/lib/netlist/macro/nlm_ttl74xx.h | 16 |
7 files changed, 248 insertions, 1 deletions
diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp index 661df946512..d0875338eab 100644 --- a/src/lib/netlist/devices/net_lib.cpp +++ b/src/lib/netlist/devices/net_lib.cpp @@ -101,6 +101,7 @@ namespace netlist ENTRYX(CD4020, CD4020, "") ENTRYX(CD4066_GATE, CD4066_GATE, "") ENTRYX(CD4316_GATE, CD4316_GATE, "") + ENTRYX(schmitt_trigger, SCHMITT_TRIGGER, "MODEL") /* entries with suffix WI are legacy only */ ENTRYX(CD4020, CD4020_WI, "+IP,+RESET,+VDD,+VSS") //ENTRY(4066, CD_4066, "+A,B") diff --git a/src/lib/netlist/devices/net_lib.h b/src/lib/netlist/devices/net_lib.h index 4c32235f6fc..49002594138 100644 --- a/src/lib/netlist/devices/net_lib.h +++ b/src/lib/netlist/devices/net_lib.h @@ -76,6 +76,8 @@ #include "nld_r2r_dac.h" +#include "nld_schmitt.h" + #include "nld_tristate.h" #include "nld_log.h" diff --git a/src/lib/netlist/devices/nld_schmitt.cpp b/src/lib/netlist/devices/nld_schmitt.cpp new file mode 100644 index 00000000000..4bc41075f89 --- /dev/null +++ b/src/lib/netlist/devices/nld_schmitt.cpp @@ -0,0 +1,131 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +/* + * nld_schmitt.cpp + * + */ + +#include "nld_schmitt.h" + +#include "../nl_base.h" +#include "../nl_errstr.h" +#include "../analog/nlid_twoterm.h" +#include "../solver/nld_solver.h" + +#include <cmath> + + +namespace netlist +{ + namespace devices + { + + /* + * Over-simplified TTL Schmitt trigger model + * It's good enough to work for 74xx/74LSxx if it isn't abused too badly + * It would need major changes to support 4000 or 74HCxx behaviour + * The input is over-simplified - it's actually more like a resistor in series with a diode, and can only source current + * Similarly, high output can only source current and low output can only sink current + * Propagation delays are ignored + * + */ + + class schmitt_trigger_model_t : public param_model_t + { + public: + schmitt_trigger_model_t(device_t &device, const pstring &name, const pstring &val) + : param_model_t(device, name, val) + , m_VTP(*this, "VTP") + , m_VTM(*this, "VTM") + , m_VI(*this, "VI") + , m_RI(*this, "RI") + , m_VOH(*this, "VOH") + , m_ROH(*this, "ROH") + , m_VOL(*this, "VOL") + , m_ROL(*this, "ROL") + , m_TPLH(*this, "TPLH") + , m_TPHL(*this, "TPHL") + { + } + + value_t m_VTP; + value_t m_VTM; + value_t m_VI; + value_t m_RI; + value_t m_VOH; + value_t m_ROH; + value_t m_VOL; + value_t m_ROL; + value_t m_TPLH; + value_t m_TPHL; + }; + + NETLIB_OBJECT(schmitt_trigger) + { + NETLIB_CONSTRUCTOR(schmitt_trigger) + , m_A(*this, "A") + , m_GND(*this, "GND") + , m_RVI(*this, "RVI") + , m_RVO(*this, "RVO") + , m_model(*this, "MODEL", "TTL_7414_GATE") + , m_last_state(*this, "m_last_var", 1) + , m_is_timestep(false) + { + register_subalias("Q", m_RVO.m_P); + + connect(m_A, m_RVI.m_P); + connect(m_GND, m_RVI.m_N); + connect(m_GND, m_RVO.m_N); + } + + protected: + NETLIB_RESETI() + { + m_last_state = 1; + m_RVI.do_reset(); + m_RVO.do_reset(); + m_is_timestep = m_RVO.m_P.net().solver()->has_timestep_devices(); + m_RVI.set(NL_FCONST(1.0) / m_model.m_RI, m_model.m_VI, 0.0); + m_RVO.set(NL_FCONST(1.0) / m_model.m_ROL, m_model.m_VOL, 0.0); + } + + NETLIB_UPDATEI() + { + if (m_last_state) + { + if (m_A.Q_Analog() < m_model.m_VTM) + { + m_last_state = 0; + if (m_is_timestep) + m_RVO.update_dev(); + m_RVO.set(NL_FCONST(1.0) / m_model.m_ROH, m_model.m_VOH, 0.0); + m_RVO.m_P.schedule_solve_after(NLTIME_FROM_NS(1)); + } + } + else + { + if (m_A.Q_Analog() > m_model.m_VTP) + { + m_last_state = 1; + if (m_is_timestep) + m_RVO.update_dev(); + m_RVO.set(NL_FCONST(1.0) / m_model.m_ROL, m_model.m_VOL, 0.0); + m_RVO.m_P.schedule_solve_after(NLTIME_FROM_NS(1)); + } + } + } + + private: + analog_input_t m_A; + analog_input_t m_GND; + analog::NETLIB_SUB(twoterm) m_RVI; + analog::NETLIB_SUB(twoterm) m_RVO; + schmitt_trigger_model_t m_model; + state_var<int> m_last_state; + bool m_is_timestep; + }; + + NETLIB_DEVICE_IMPL(schmitt_trigger) + + } // namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_schmitt.h b/src/lib/netlist/devices/nld_schmitt.h new file mode 100644 index 00000000000..ecce59be616 --- /dev/null +++ b/src/lib/netlist/devices/nld_schmitt.h @@ -0,0 +1,25 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +/* + * nld_schmitt.h + * + */ + +//#pragma once + +#ifndef NLD_SCHMITT_H_ +#define NLD_SCHMITT_H_ + + +#include "../nl_setup.h" + +// ---------------------------------------------------------------------------------------- +// Macros +// ---------------------------------------------------------------------------------------- + +#define SCHMITT_TRIGGER(name, model) \ + NET_REGISTER_DEV(SCHMITT_TRIGGER, name) \ + NETDEV_PARAMI(name, MODEL, model) + + +#endif /* NLD_SCHMITT_H_ */ diff --git a/src/lib/netlist/macro/nlm_base.cpp b/src/lib/netlist/macro/nlm_base.cpp index 62e713c76dc..8ea6f148864 100644 --- a/src/lib/netlist/macro/nlm_base.cpp +++ b/src/lib/netlist/macro/nlm_base.cpp @@ -55,6 +55,7 @@ NETLIST_END() static NETLIST_START(family_models) NET_MODEL("FAMILY _(TYPE=CUSTOM FV=5 IVL=0.16 IVH=0.4 OVL=0.1 OVH=1.0 ORL=1.0 ORH=130.0)") NET_MODEL("OPAMP _()") + NET_MODEL("SCHMITT_TRIGGER _()") NET_MODEL("74XXOC FAMILY(FV=5 IVL=0.16 IVH=0.4 OVL=0.1 OVH=0.05 ORL=10.0 ORH=1.0e8)") NET_MODEL("74XX FAMILY(TYPE=TTL)") diff --git a/src/lib/netlist/macro/nlm_ttl74xx.cpp b/src/lib/netlist/macro/nlm_ttl74xx.cpp index 369b5816bf0..7a1a5187c65 100644 --- a/src/lib/netlist/macro/nlm_ttl74xx.cpp +++ b/src/lib/netlist/macro/nlm_ttl74xx.cpp @@ -2,6 +2,7 @@ // copyright-holders:Couriersud #include "nlm_ttl74xx.h" +#include "../devices/nld_schmitt.h" #include "../devices/nld_system.h" @@ -229,6 +230,72 @@ static NETLIST_START(TTL_7411_DIP) s2.C, /* C2 |5 10| B3 */ s3.B, s2.Q, /* Y2 |6 9| A3 */ s3.A, GND.I, /* GND |7 8| Y3 */ s3.Q + /* +--------------+ */ + ) +NETLIST_END() + +/* + * DM7414/DM74LS14: Hex Inverter with + * Schmitt Trigger Inputs + * + */ + +static NETLIST_START(TTL_7414_GATE) + SCHMITT_TRIGGER(X, "DM7414") + ALIAS(A, X.A) + ALIAS(Q, X.Q) + ALIAS(GND, X.GND) +NETLIST_END() + +static NETLIST_START(TTL_74LS14_GATE) + SCHMITT_TRIGGER(X, "DM74LS14") + ALIAS(A, X.A) + ALIAS(Q, X.Q) + ALIAS(GND, X.GND) +NETLIST_END() + +static NETLIST_START(TTL_7414_DIP) + SCHMITT_TRIGGER(s1, "DM7414") + SCHMITT_TRIGGER(s2, "DM7414") + SCHMITT_TRIGGER(s3, "DM7414") + SCHMITT_TRIGGER(s4, "DM7414") + SCHMITT_TRIGGER(s5, "DM7414") + SCHMITT_TRIGGER(s6, "DM7414") + + NET_C(s1.GND, s2.GND, s3.GND, s4.GND, s5.GND, s6.GND) + DUMMY_INPUT(VCC) + + DIPPINS( /* +--------------+ */ + s1.A, /* A1 |1 ++ 14| VCC */ VCC.I, + s1.Q, /* Y1 |2 13| A6 */ s6.A, + s2.A, /* A2 |3 12| Y6 */ s6.Q, + s2.Q, /* Y2 |4 7414 11| A5 */ s5.A, + s3.A, /* A3 |5 10| Y5 */ s5.Q, + s3.Q, /* Y3 |6 9| A4 */ s4.A, + s1.GND, /* GND |7 8| Y4 */ s4.Q + /* +--------------+ */ + ) +NETLIST_END() + +static NETLIST_START(TTL_74LS14_DIP) + SCHMITT_TRIGGER(s1, "DM74LS14") + SCHMITT_TRIGGER(s2, "DM74LS14") + SCHMITT_TRIGGER(s3, "DM74LS14") + SCHMITT_TRIGGER(s4, "DM74LS14") + SCHMITT_TRIGGER(s5, "DM74LS14") + SCHMITT_TRIGGER(s6, "DM74LS14") + + NET_C(s1.GND, s2.GND, s3.GND, s4.GND, s5.GND, s6.GND) + DUMMY_INPUT(VCC) + + DIPPINS( /* +--------------+ */ + s1.A, /* A1 |1 ++ 14| VCC */ VCC.I, + s1.Q, /* Y1 |2 13| A6 */ s6.A, + s2.A, /* A2 |3 12| Y6 */ s6.Q, + s2.Q, /* Y2 |4 74LS14 11| A5 */ s5.A, + s3.A, /* A3 |5 10| Y5 */ s5.Q, + s3.Q, /* Y3 |6 9| A4 */ s4.A, + s1.GND, /* GND |7 8| Y4 */ s4.Q /* +--------------+ */ ) NETLIST_END() @@ -758,6 +825,8 @@ NETLIST_END() NETLIST_START(TTL74XX_lib) + NET_MODEL("DM7414 SCHMITT_TRIGGER(VTP=1.7 VTM=0.9 VI=4.35 RI=6.15k VOH=3.5 ROH=120 VOL=0.1 ROL=37.5 TPLH=15 TPHL=15)") + NET_MODEL("DM74LS14 SCHMITT_TRIGGER(VTP=1.6 VTM=0.8 VI=4.4 RI=19.3k VOH=3.45 ROH=130 VOL=0.1 ROL=31.2 TPLH=15 TPHL=15)") TRUTHTABLE_START(TTL_7400_GATE, 2, 1, "") TT_HEAD("A,B|Q ") @@ -1119,6 +1188,10 @@ NETLIST_START(TTL74XX_lib) LOCAL_LIB_ENTRY(TTL_7408_DIP) LOCAL_LIB_ENTRY(TTL_7410_DIP) LOCAL_LIB_ENTRY(TTL_7411_DIP) + LOCAL_LIB_ENTRY(TTL_7414_GATE) + LOCAL_LIB_ENTRY(TTL_74LS14_GATE) + LOCAL_LIB_ENTRY(TTL_7414_DIP) + LOCAL_LIB_ENTRY(TTL_74LS14_DIP) LOCAL_LIB_ENTRY(TTL_7416_DIP) LOCAL_LIB_ENTRY(TTL_7420_DIP) LOCAL_LIB_ENTRY(TTL_7425_DIP) diff --git a/src/lib/netlist/macro/nlm_ttl74xx.h b/src/lib/netlist/macro/nlm_ttl74xx.h index 18c0cfe6138..c8868e45f7f 100644 --- a/src/lib/netlist/macro/nlm_ttl74xx.h +++ b/src/lib/netlist/macro/nlm_ttl74xx.h @@ -85,11 +85,25 @@ NET_REGISTER_DEV(TTL_7411_DIP, name) +#define TTL_7414_GATE(name) \ + NET_REGISTER_DEV(TTL_7414_GATE, name) + +#define TTL_7414_DIP(name) \ + NET_REGISTER_DEV(TTL_7414_DIP, name) + + +#define TTL_74LS14_GATE(name) \ + NET_REGISTER_DEV(TTL_74LS14_GATE, name) + +#define TTL_74LS14_DIP(name) \ + NET_REGISTER_DEV(TTL_74LS14_DIP, name) + + #define TTL_7416_GATE(name) \ NET_REGISTER_DEV(TTL_7416_GATE, name) #define TTL_7416_DIP(name) \ - NET_REGISTER_DEV(TTL7416_DIP, name) + NET_REGISTER_DEV(TTL_7416_DIP, name) #define TTL_7420_GATE(name) \ |
