summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--nl_examples/congo_bongo.c54
-rw-r--r--scripts/src/netlist.lua2
-rw-r--r--src/emu/netlist/devices/net_lib.h6
-rw-r--r--src/emu/netlist/macro/nlm_cd4xxx.h11
-rw-r--r--src/emu/netlist/macro/nlm_opamp.c47
-rw-r--r--src/emu/netlist/macro/nlm_opamp.h23
-rw-r--r--src/emu/netlist/nl_setup.c16
-rw-r--r--src/emu/netlist/plib/plists.h8
8 files changed, 115 insertions, 52 deletions
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 &param, 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));