From 4fcf7b5bcf34d4b618ad24ee640fae78866e142b Mon Sep 17 00:00:00 2001 From: Couriersud Date: Sun, 2 Mar 2014 20:23:53 +0000 Subject: [PATCH] Implemented CD4066 device - Quad Bilateral Switch. [Couriersud] --- .gitattributes | 3 + nl_examples/cd4066.c | 44 ++++++++++++++ src/emu/netlist/devices/net_lib.c | 1 + src/emu/netlist/devices/net_lib.h | 1 + src/emu/netlist/devices/nld_4066.c | 94 ++++++++++++++++++++++++++++++ src/emu/netlist/devices/nld_4066.h | 60 +++++++++++++++++++ src/emu/netlist/netlist.mak | 1 + 7 files changed, 204 insertions(+) create mode 100644 nl_examples/cd4066.c create mode 100644 src/emu/netlist/devices/nld_4066.c create mode 100644 src/emu/netlist/devices/nld_4066.h diff --git a/.gitattributes b/.gitattributes index 34933b7f5b0..2d5f87db331 100644 --- a/.gitattributes +++ b/.gitattributes @@ -362,6 +362,7 @@ nl_examples/7400_astable.c svneol=native#text/plain nl_examples/bjt.c svneol=native#text/plain nl_examples/bjt_eb.c svneol=native#text/plain nl_examples/bjt_eb_pnp.c svneol=native#text/plain +nl_examples/cd4066.c svneol=native#text/plain nl_examples/msx_mixer_stage.c svneol=native#text/plain nl_examples/ne555_astable.c svneol=native#text/plain nl_examples/opamp.c svneol=native#text/plain @@ -2210,6 +2211,8 @@ src/emu/netlist/analog/nld_twoterm.c svneol=native#text/plain src/emu/netlist/analog/nld_twoterm.h svneol=native#text/plain src/emu/netlist/devices/net_lib.c svneol=native#text/plain src/emu/netlist/devices/net_lib.h svneol=native#text/plain +src/emu/netlist/devices/nld_4066.c svneol=native#text/plain +src/emu/netlist/devices/nld_4066.h svneol=native#text/plain src/emu/netlist/devices/nld_7400.c svneol=native#text/plain src/emu/netlist/devices/nld_7400.h svneol=native#text/plain src/emu/netlist/devices/nld_7402.c svneol=native#text/plain diff --git a/nl_examples/cd4066.c b/nl_examples/cd4066.c new file mode 100644 index 00000000000..1db59b670ed --- /dev/null +++ b/nl_examples/cd4066.c @@ -0,0 +1,44 @@ +/* + * bjt.c + * + */ + + +#include "netlist/devices/net_lib.h" + +NETLIST_START(cd4066) + /* Standard stuff */ + + CLOCK(clk, 1000) // 1000 Hz + SOLVER(Solver, 48000) + + ANALOG_INPUT(V5, 5) + + CD_4066_DIP(SW) + RES(R1, 1000) + + NET_C(SW.7, GND) + NET_C(SW.14, V5) + + NET_C(SW.13, clk) + NET_C(SW.1, V5) + + NET_C(SW.2, R1.1) + NET_C(R1.2, GND) + + // ground anything else + + NET_C(SW.3, GND) + NET_C(SW.4, GND) + NET_C(SW.5, GND) + NET_C(SW.6, GND) + NET_C(SW.8, GND) + NET_C(SW.9, GND) + NET_C(SW.10, GND) + NET_C(SW.11, GND) + NET_C(SW.12, GND) + + LOG(logB, clk) + LOG(logC, R1.1) + +NETLIST_END() diff --git a/src/emu/netlist/devices/net_lib.c b/src/emu/netlist/devices/net_lib.c index 6136f8f906e..b038d27db8d 100644 --- a/src/emu/netlist/devices/net_lib.c +++ b/src/emu/netlist/devices/net_lib.c @@ -122,6 +122,7 @@ void netlist_factory_t::initialize() ENTRY(SN74LS629, SN74LS629, "CAP") ENTRY(9316, TTL_9316, "+CLK,ENP,ENT,CLRQ,LOADQ,A,B,C,D") ENTRY(NE555, NE555, "-") + ENTRY(4066_dip, CD_4066_DIP, "-") ENTRY(7400_dip, TTL_7400_DIP, "-") ENTRY(7402_dip, TTL_7402_DIP, "-") ENTRY(7404_dip, TTL_7404_DIP, "-") diff --git a/src/emu/netlist/devices/net_lib.h b/src/emu/netlist/devices/net_lib.h index 8367f1fda84..e73d9ee849b 100644 --- a/src/emu/netlist/devices/net_lib.h +++ b/src/emu/netlist/devices/net_lib.h @@ -54,6 +54,7 @@ #include "nld_signal.h" #include "nld_system.h" +#include "nld_4066.h" #include "nld_7400.h" #include "nld_7402.h" #include "nld_7404.h" diff --git a/src/emu/netlist/devices/nld_4066.c b/src/emu/netlist/devices/nld_4066.c new file mode 100644 index 00000000000..0d9dd97ead4 --- /dev/null +++ b/src/emu/netlist/devices/nld_4066.c @@ -0,0 +1,94 @@ +/* + * nld_4066.c + * + */ + +#include "nld_4066.h" + +NETLIB_START(vdd_vss) +{ +} + +NETLIB_RESET(vdd_vss) +{ +} + +NETLIB_UPDATE(vdd_vss) +{ +} + +NETLIB_START(4066) +{ + register_input("CTL", m_control); + register_sub(m_R, "R"); +} + +NETLIB_RESET(4066) +{ + m_R.do_reset(); +} + +NETLIB_UPDATE(4066) +{ + double sup = (supply->vdd() - supply->vss()); + double low = 0.45 * sup; + double high = 0.55 * sup; + double in = INPANALOG(m_control) - supply->vss(); + double rON = 270.0 * 5.0 / sup; + + if (in < low) + { + m_R.set_R(1.0 / NETLIST_GMIN); + m_R.update_dev(); + } + else if (in > high) + { + m_R.set_R(rON); + m_R.update_dev(); + } +} + + +NETLIB_START(4066_dip) +{ + register_sub(supply, "supply"); + m_A.supply = m_B.supply = m_C.supply = m_D.supply = &supply; + register_sub(m_A, "A"); + register_sub(m_B, "B"); + register_sub(m_C, "C"); + register_sub(m_D, "D"); + + register_subalias("1", m_A.m_R.m_P); + register_subalias("2", m_A.m_R.m_N); + register_subalias("3", m_B.m_R.m_P); + register_subalias("4", m_B.m_R.m_N); + register_subalias("5", m_B.m_control); + register_subalias("6", m_C.m_control); + register_input("7", supply.m_vss); + + register_subalias("8", m_C.m_R.m_P); + register_subalias("9", m_C.m_R.m_N); + register_subalias("10", m_D.m_R.m_P); + register_subalias("11", m_D.m_R.m_N); + register_subalias("12", m_D.m_control); + register_subalias("13", m_A.m_control); + register_input("14", supply.m_vdd); + +} + +NETLIB_RESET(4066_dip) +{ + m_A.do_reset(); + m_B.do_reset(); + m_C.do_reset(); + m_D.do_reset(); +} + +NETLIB_UPDATE(4066_dip) +{ + /* only called during startup */ + m_A.update_dev(); + m_B.update_dev(); + m_C.update_dev(); + m_D.update_dev(); +} diff --git a/src/emu/netlist/devices/nld_4066.h b/src/emu/netlist/devices/nld_4066.h new file mode 100644 index 00000000000..74695dc573a --- /dev/null +++ b/src/emu/netlist/devices/nld_4066.h @@ -0,0 +1,60 @@ +// license:GPL-2.0+ +// copyright-holders:Couriersud +/* + * nld_4066.h + * + * CD4066: Quad Bilateral Switch + * + * +--------------+ + * INOUTA |1 ++ 14| VDD + * OUTINA |2 13| CONTROLA + * OUTINB |3 12| CONTROLD + * INOUTB |4 4066 11| INOUTD + * CONTROLB |5 10| OUTIND + * CONTROLC |6 9| OUTINC + * VSS |7 8| INOUTC + * +--------------+ + * + * FIXME: These devices are slow (~125 ns). THis is currently not reflected + * + * Naming conventions follow National semiconductor datasheet + * + */ + +#ifndef NLD_4066_H_ +#define NLD_4066_H_ + +#include "../nl_base.h" +#include "../analog/nld_twoterm.h" + +#define CD_4066_DIP(_name) \ + NET_REGISTER_DEV(4066_dip, _name) + +NETLIB_SUBDEVICE(vdd_vss, + netlist_analog_input_t m_vdd; + netlist_analog_input_t m_vss; + +public: + ATTR_HOT inline double vdd() { return INPANALOG(m_vdd); } + ATTR_HOT inline double vss() { return INPANALOG(m_vss); } +); + +NETLIB_SUBDEVICE(4066, +public: + + netlist_analog_input_t m_control; + NETLIB_NAME(R) m_R; + + NETLIB_NAME(vdd_vss) *supply; +); + +NETLIB_DEVICE(4066_dip, + + NETLIB_NAME(4066) m_A; + NETLIB_NAME(4066) m_B; + NETLIB_NAME(4066) m_C; + NETLIB_NAME(4066) m_D; + NETLIB_NAME(vdd_vss) supply; +); + +#endif /* NLD_4066_H_ */ diff --git a/src/emu/netlist/netlist.mak b/src/emu/netlist/netlist.mak index 4e02ec04c29..94e863ea69b 100644 --- a/src/emu/netlist/netlist.mak +++ b/src/emu/netlist/netlist.mak @@ -33,6 +33,7 @@ NETLISTOBJS+= \ $(NETLISTOBJ)/analog/nld_solver.o \ $(NETLISTOBJ)/analog/nld_switches.o \ $(NETLISTOBJ)/analog/nld_twoterm.o \ + $(NETLISTOBJ)/devices/nld_4066.o \ $(NETLISTOBJ)/devices/nld_7400.o \ $(NETLISTOBJ)/devices/nld_7402.o \ $(NETLISTOBJ)/devices/nld_7404.o \