summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/macro/nlm_opamp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/macro/nlm_opamp.cpp')
-rw-r--r--src/lib/netlist/macro/nlm_opamp.cpp89
1 files changed, 87 insertions, 2 deletions
diff --git a/src/lib/netlist/macro/nlm_opamp.cpp b/src/lib/netlist/macro/nlm_opamp.cpp
index f59fea119f6..886345ec6c3 100644
--- a/src/lib/netlist/macro/nlm_opamp.cpp
+++ b/src/lib/netlist/macro/nlm_opamp.cpp
@@ -4,6 +4,13 @@
#include "netlist/devices/net_lib.h"
/*
+ * 0 = Basic hack (Norton with just amplification, no voltage cutting)
+ * 1 = Model from LTSPICE list - slow!
+ * 2 = Simplified model using diode inputs and netlist TYPE=3
+ */
+#define USE_LM3900_MODEL (2)
+
+/*
* Generic layout with 4 opamps, VCC on pin 4 and GND on pin 11
*/
@@ -195,6 +202,7 @@ static NETLIST_START(LM747A_DIP)
NETLIST_END()
+#if USE_LM3900_MODEL == 0
static NETLIST_START(LM3900)
/*
@@ -206,8 +214,8 @@ static NETLIST_START(LM3900)
ALIAS(PLUS, R1.1) // Positive input
ALIAS(MINUS, R2.1) // Negative input
ALIAS(OUT, G1.OP) // Opamp output ...
- ALIAS(VM, G1.ON) // V- terminal
- ALIAS(VP, DUMMY.I) // V+ terminal
+ ALIAS(VCC, G1.ON) // V- terminal
+ ALIAS(GND, DUMMY.I) // V+ terminal
DUMMY_INPUT(DUMMY)
@@ -224,7 +232,79 @@ static NETLIST_START(LM3900)
PARAM(G1.RO, RES_K(8))
NETLIST_END()
+#endif
+
+#if USE_LM3900_MODEL == 1
+// LTSPICE MODEL OF LM3900 FROM NATIONAL SEMICONDUCTOR
+// MADE BY HELMUT SENNEWALD, 8/6/2004
+// THE LM3900 IS A SO CALLED NORTON AMPLIFIER.
+//
+// PIN ORDER: IN+ IN- VCC VSS OUT
+static NETLIST_START(LM3900)
+ PARAM(E1.G, 0.5)
+ //ALIAS(IN+, Q2.B)
+ //ALIAS(IN-, Q2.C)
+ //ALIAS(VCC, Q10.C)
+ //ALIAS(VSS, Q2.E)
+
+ ALIAS(PLUS, Q2.B)
+ ALIAS(MINUS, Q2.C)
+ ALIAS(VCC, Q10.C)
+ ALIAS(GND, Q2.E)
+ ALIAS(OUT, Q6.C)
+
+ //CS(B1/*I=LIMIT(0, V(VCC,VSS)/10K, 0.2m)*/)
+ CS(B1, 2e-4)
+ CAP(C1, CAP_P(6.000000))
+ VCVS(E1)
+ QBJT_EB(Q1, "LM3900_NPN1")
+ QBJT_EB(Q10, "LM3900_NPN1")
+ QBJT_EB(Q11, "LM3900_NPN1")
+ QBJT_EB(Q12, "LM3900_NPN1")
+ QBJT_EB(Q2, "LM3900_NPN1")
+ QBJT_EB(Q3, "LM3900_NPN1")
+ QBJT_EB(Q4, "LM3900_PNP1")
+ QBJT_EB(Q5, "LM3900_PNP1")
+ QBJT_EB(Q6, "LM3900_PNP1")
+ QBJT_EB(Q7, "LM3900_PNP1")
+ QBJT_EB(Q8, "LM3900_NPN1")
+ QBJT_EB(Q9, "LM3900_NPN1")
+ RES(R1, RES_K(2.000000))
+ RES(R6, RES_K(1.600000))
+ NET_C(Q11.B, Q12.B, R6.2)
+ NET_C(Q5.C, Q5.B, B1.P, Q4.B)
+ NET_C(Q8.C, Q8.B, B1.N, R1.1, E1.IP)
+ NET_C(Q9.B, R1.2)
+ NET_C(R6.1, E1.OP)
+ NET_C(Q10.C, Q5.E, Q4.E, Q11.C, Q12.C)
+ NET_C(Q2.C, Q3.B, Q12.E)
+ NET_C(Q2.E, Q3.E, Q9.E, C1.2, Q1.E, Q8.E, E1.ON, E1.IN, Q7.C)
+ NET_C(Q3.C, Q6.B, C1.1, Q7.B)
+ NET_C(Q6.E, Q10.B, Q4.C)
+ NET_C(Q6.C, Q10.E, Q9.C, Q7.E)
+ NET_C(Q2.B, Q1.C, Q1.B, Q11.E)
+NETLIST_END()
+#endif
+#if USE_LM3900_MODEL == 2
+static NETLIST_START(LM3900)
+ OPAMP(A, "LM3900")
+
+ DIODE(D1, "D")
+ DIODE(D2, "D")
+
+ ALIAS(VCC, A.VCC)
+ ALIAS(GND, A.GND)
+ ALIAS(MINUS, A.MINUS)
+ ALIAS(PLUS, A.PLUS)
+ ALIAS(OUT, A.OUT)
+
+ NET_C(D1.A, A.PLUS)
+ NET_C(D2.A, A.MINUS)
+ NET_C(D1.K, D2.K, A.MINUS)
+
+NETLIST_END()
+#endif
NETLIST_START(OPAMP_lib)
LOCAL_LIB_ENTRY(opamp_layout_4_4_11)
@@ -240,7 +320,12 @@ NETLIST_START(OPAMP_lib)
NET_MODEL("UA741 OPAMP(TYPE=3 VLH=1.0 VLL=1.0 FPF=5 UGF=1000k SLEW=0.5M RI=2000k RO=75 DAB=0.0017)")
NET_MODEL("LM747 OPAMP(TYPE=3 VLH=1.0 VLL=1.0 FPF=5 UGF=1000k SLEW=0.5M RI=2000k RO=50 DAB=0.0017)")
NET_MODEL("LM747A OPAMP(TYPE=3 VLH=2.0 VLL=2.0 FPF=5 UGF=1000k SLEW=0.7M RI=6000k RO=50 DAB=0.0015)")
+ NET_MODEL("LM3900 OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=2k UGF=4M SLEW=0.5M RI=1M RO=2k DAB=0.0015)")
+#if USE_LM3900_MODEL == 1
+ NET_MODEL("LM3900_NPN1 NPN(IS=1E-14 BF=150 TF=1E-9 CJC=1E-12 CJE=1E-12 VAF=150 RB=100 RE=5 IKF=0.002)")
+ NET_MODEL("LM3900_PNP1 PNP(IS=1E-14 BF=40 TF=1E-7 CJC=1E-12 CJE=1E-12 VAF=150 RB=100 RE=5)")
+#endif
LOCAL_LIB_ENTRY(MB3614_DIP)
LOCAL_LIB_ENTRY(LM324_DIP)
LOCAL_LIB_ENTRY(LM358_DIP)