From aa5785832c5dc42dc7f4d9f9e1983cf1eb9f13fb Mon Sep 17 00:00:00 2001 From: couriersud Date: Tue, 14 Jul 2015 00:57:45 +0200 Subject: [PATCH] Add macro library for opamp models. (nw) --- nl_examples/congo_bongo.c | 54 ++++-------------------------- scripts/src/netlist.lua | 2 ++ src/emu/netlist/devices/net_lib.h | 6 ++-- src/emu/netlist/macro/nlm_cd4xxx.h | 11 ++++++ src/emu/netlist/macro/nlm_opamp.c | 47 ++++++++++++++++++++++++++ src/emu/netlist/macro/nlm_opamp.h | 23 +++++++++++++ src/emu/netlist/nl_setup.c | 16 +++++++-- src/emu/netlist/plib/plists.h | 8 +++++ 8 files changed, 115 insertions(+), 52 deletions(-) create mode 100644 src/emu/netlist/macro/nlm_opamp.c create mode 100644 src/emu/netlist/macro/nlm_opamp.h diff --git a/nl_examples/congo_bongo.c b/nl_examples/congo_bongo.c index d842356d85f..d9f40c9859a 100644 --- a/nl_examples/congo_bongo.c +++ b/nl_examples/congo_bongo.c @@ -9,9 +9,6 @@ #ifndef __PLIB_PREPROCESSOR__ -#define MB3614_DIP(_name) \ - NET_REGISTER_DEV_X(MB3614_DIP, _name) - #define LM358_DIP(_name) \ NET_REGISTER_DEV_X(LM358_DIP, _name) @@ -78,6 +75,12 @@ NETLIST_START(dummy) INCLUDE(CongoBongo_schematics) + /* The opamp actually has an FPF of about 500k. This doesn't work here and causes oscillations. + * FPF here therefore about half the Solver clock. + */ + PARAM(XU16.B.model, "MB3614_SLOW") + PARAM(XU17.C.model, "MB3614_SLOW") + OPTIMIZE_FRONTIER(C51.1, RES_K(20), 50) OPTIMIZE_FRONTIER(R77.2, RES_K(20), 50) @@ -226,6 +229,7 @@ NETLIST_START(CongoBongo_schematics) CD4538_DIP(XU19) MM5837_DIP(XU20) TTL_7416_DIP(XU6) + NET_C(D1.A, C21.2, R23.1) NET_C(D1.K, C20.1, R22.1) NET_C(XU13.1, C37.2, C36.1, R48.1) @@ -410,47 +414,6 @@ NETLIST_START(opamp_mod) NETLIST_END() -NETLIST_START(MB3614_DIP) -#if 0 - SUBMODEL(opamp_mod, op1) - SUBMODEL(opamp_mod, op2) - SUBMODEL(opamp_mod, op3) - SUBMODEL(opamp_mod, op4) -#else - /* The opamp actually has an FPF of about 500k. This doesn't work here and causes oscillations. - * FPF here therefore about half the Solver clock. - */ - OPAMP(op1, ".model MB3614 OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=110k SLEW=0.6M RI=1000k RO=50 DAB=0.002)") - OPAMP(op2, ".model MB3614 OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=11k SLEW=0.6M RI=1000k RO=50 DAB=0.002)") - OPAMP(op3, ".model MB3614 OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=11k SLEW=0.6M RI=1000k RO=50 DAB=0.002)") - OPAMP(op4, ".model MB3614 OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=110k SLEW=0.6M RI=1000k RO=50 DAB=0.002)") -#endif - ALIAS( 1, op1.OUT) - ALIAS( 2, op1.MINUS) - ALIAS( 3, op1.PLUS) - - ALIAS( 4, op1.VCC) - - ALIAS( 5, op2.PLUS) - ALIAS( 6, op2.MINUS) - ALIAS( 7, op2.OUT) - - ALIAS( 8, op3.OUT) - ALIAS( 9, op3.MINUS) - ALIAS(10, op3.PLUS) - - ALIAS(11, op1.GND) - - ALIAS(12, op4.PLUS) - ALIAS(13, op4.MINUS) - ALIAS(14, op4.OUT) - - NET_C(op1.GND, op2.GND, op3.GND, op4.GND) - NET_C(op1.VCC, op2.VCC, op3.VCC, op4.VCC) - -NETLIST_END() - - NETLIST_START(G501534_DIP) AFUNC(f, 2, "A0 A1 0.2 * *") @@ -482,9 +445,6 @@ NETLIST_END() NETLIST_START(congob_lib) - //LOCAL_LIB_ENTRY(LM324_DIP) - //LOCAL_LIB_ENTRY(LM358_DIP) - LOCAL_LIB_ENTRY(MB3614_DIP) LOCAL_LIB_ENTRY(G501534_DIP) NETLIST_END() diff --git a/scripts/src/netlist.lua b/scripts/src/netlist.lua index 15361d5576a..d79ec5ecd58 100644 --- a/scripts/src/netlist.lua +++ b/scripts/src/netlist.lua @@ -156,4 +156,6 @@ project "netlist" MAME_DIR .. "src/emu/netlist/macro/nlm_ttl74xx.h", MAME_DIR .. "src/emu/netlist/macro/nlm_cd4xxx.c", MAME_DIR .. "src/emu/netlist/macro/nlm_cd4xxx.h", + MAME_DIR .. "src/emu/netlist/macro/nlm_opamp.c", + MAME_DIR .. "src/emu/netlist/macro/nlm_opamp.h", } diff --git a/src/emu/netlist/devices/net_lib.h b/src/emu/netlist/devices/net_lib.h index b7eb7d3c201..4f10aee0651 100644 --- a/src/emu/netlist/devices/net_lib.h +++ b/src/emu/netlist/devices/net_lib.h @@ -56,13 +56,15 @@ #include "nld_log.h" +#include "../macro/nlm_cd4xxx.h" +#include "../macro/nlm_ttl74xx.h" +#include "../macro/nlm_opamp.h" + #include "../analog/nld_bjt.h" #include "../analog/nld_fourterm.h" #include "../analog/nld_switches.h" #include "../analog/nld_twoterm.h" #include "../analog/nld_opamps.h" -#include "../macro/nlm_cd4xxx.h" -#include "../macro/nlm_ttl74xx.h" #include "../solver/nld_solver.h" #include "nld_legacy.h" diff --git a/src/emu/netlist/macro/nlm_cd4xxx.h b/src/emu/netlist/macro/nlm_cd4xxx.h index 9c2c4fef315..45bdaf87a75 100644 --- a/src/emu/netlist/macro/nlm_cd4xxx.h +++ b/src/emu/netlist/macro/nlm_cd4xxx.h @@ -3,6 +3,17 @@ #include "../nl_setup.h" +/* + * Devices: + * + * CD4001_NOR : single gate + * CD4001_DIP : dip package + * CD4020_DIP : dip package (device model in core) + * CD4016_DIP : dip package (device model in core) + * CD4066_DIP : dip package (device model in core) + * + */ + #ifndef __PLIB_PREPROCESSOR__ /* ---------------------------------------------------------------------------- diff --git a/src/emu/netlist/macro/nlm_opamp.c b/src/emu/netlist/macro/nlm_opamp.c new file mode 100644 index 00000000000..143f4d8cfec --- /dev/null +++ b/src/emu/netlist/macro/nlm_opamp.c @@ -0,0 +1,47 @@ + +#include "nlm_opamp.h" + +#include "analog/nld_opamps.h" +#include "devices/nld_system.h" + +/* + * Generic layout with 4 opamps, VCC on pint 4 and GND on pin 11 + */ + +NETLIST_START(opamp_layout_4_4_11) + DIPPINS( /* +--------------+ */ + A.OUT, /* |1 ++ 14| */ D.OUT, + A.MINUS, /* |2 13| */ D.MINUS, + A.PLUS, /* |3 12| */ D.PLUS, + A.VCC, /* |4 11| */ A.GND, + B.PLUS, /* |5 10| */ C.PLUS, + B.MINUS, /* |6 9| */ C.MINUS, + B.OUT, /* |7 8| */ C.OUT + /* +--------------+ */ + ) + NET_C(A.GND, B.GND, C.GND, D.GND) + NET_C(A.VCC, B.VCC, C.VCC, D.VCC) +NETLIST_END() + +NETLIST_START(MB3614_DIP) + /* The opamp actually has an FPF of about 500k. This doesn't work here and causes oscillations. + * FPF here therefore about half the Solver clock. + */ + OPAMP(A, "MB3614") + OPAMP(B, "MB3614") + OPAMP(C, "MB3614") + OPAMP(D, "MB3614") + + INCLUDE(opamp_layout_4_4_11) + +NETLIST_END() + +NETLIST_START(OPAMP_lib) + LOCAL_LIB_ENTRY(opamp_layout_4_4_11) + + NET_MODEL(".model MB3614 OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=500k SLEW=0.6M RI=1000k RO=50 DAB=0.002)") + NET_MODEL(".model MB3614_SLOW OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=11k SLEW=0.6M RI=1000k RO=50 DAB=0.002)") + LOCAL_LIB_ENTRY(MB3614_DIP) + + +NETLIST_END() diff --git a/src/emu/netlist/macro/nlm_opamp.h b/src/emu/netlist/macro/nlm_opamp.h new file mode 100644 index 00000000000..1a721c96ded --- /dev/null +++ b/src/emu/netlist/macro/nlm_opamp.h @@ -0,0 +1,23 @@ +#ifndef NLM_OPAMP_H_ +#define NLM_OPAMP_H_ + +#include "../nl_setup.h" + +#ifndef __PLIB_PREPROCESSOR__ + +/* ---------------------------------------------------------------------------- + * Netlist Macros + * ---------------------------------------------------------------------------*/ + +#define MB3614_DIP(_name) \ + NET_REGISTER_DEV_X(MB3614_DIP, _name) + +/* ---------------------------------------------------------------------------- + * External declarations + * ---------------------------------------------------------------------------*/ + +NETLIST_EXTERNAL(OPAMP_lib) + +#endif + +#endif diff --git a/src/emu/netlist/nl_setup.c b/src/emu/netlist/nl_setup.c index cb36360362e..dd8fa0c400e 100644 --- a/src/emu/netlist/nl_setup.c +++ b/src/emu/netlist/nl_setup.c @@ -29,13 +29,14 @@ static NETLIST_START(base) LOCAL_SOURCE(family_models) LOCAL_SOURCE(TTL74XX_lib) LOCAL_SOURCE(CD4XXX_lib) - + LOCAL_SOURCE(OPAMP_lib) INCLUDE(diode_models); INCLUDE(bjt_models); INCLUDE(family_models); INCLUDE(TTL74XX_lib); INCLUDE(CD4XXX_lib); + INCLUDE(OPAMP_lib); NETLIST_END() @@ -399,8 +400,17 @@ void setup_t::register_param(const pstring ¶m, const pstring &value) { pstring fqn = build_fqn(param); - if (!(m_params_temp.add(link_t(fqn, value), false)==true)) - netlist().error("Error adding parameter %s to parameter list\n", param.cstr()); + int idx = m_params_temp.index_by_name(fqn); + if (idx < 0) + { + if (!(m_params_temp.add(link_t(fqn, value), false)==true)) + netlist().error("Unexpected error adding parameter %s to parameter list\n", param.cstr()); + } + else + { + netlist().warning("Overwriting %s old <%s> new <%s>\n", fqn.cstr(), m_params_temp[idx].e2.cstr(), value.cstr()); + m_params_temp[idx].e2 = value; + } } const pstring setup_t::resolve_alias(const pstring &name) const diff --git a/src/emu/netlist/plib/plists.h b/src/emu/netlist/plib/plists.h index e54c63f38e0..0430c5aebf6 100644 --- a/src/emu/netlist/plib/plists.h +++ b/src/emu/netlist/plib/plists.h @@ -364,6 +364,14 @@ public: return _ListClass(NULL); } + int index_by_name(const pstring &name) const + { + for (std::size_t i=0; i < this->size(); i++) + if (get_name((*this)[i]) == name) + return (int) i; + return -1; + } + void remove_by_name(const pstring &name) { plist_t<_ListClass>::remove(find_by_name(name));