diff options
Diffstat (limited to 'src/lib/netlist/macro/nlm_opamp.cpp')
-rw-r--r-- | src/lib/netlist/macro/nlm_opamp.cpp | 374 |
1 files changed, 0 insertions, 374 deletions
diff --git a/src/lib/netlist/macro/nlm_opamp.cpp b/src/lib/netlist/macro/nlm_opamp.cpp deleted file mode 100644 index 34c0791e312..00000000000 --- a/src/lib/netlist/macro/nlm_opamp.cpp +++ /dev/null @@ -1,374 +0,0 @@ -// license:GPL-2.0+ -// copyright-holders:Couriersud -#include "nlm_opamp.h" -#include "netlist/devices/net_lib.h" - -/* - * 0 = Basic hack (Norton with just amplification, no voltage cutting) - * 1 = Model from LTSPICE mailing list - slow! - * 2 = Simplified model using diode inputs and netlist TYPE=3 - * 3 = Model according to datasheet - * - * For Money Money 1 and 3 delivery comparable results. - * 3 is simpler (less BJTs) and converges a lot faster. - */ -#define USE_LM3900_MODEL (3) - -/* - * Generic layout with 4 opamps, VCC on pin 4 and GND on pin 11 - */ - -static 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() - -/* - * Generic layout with 2 opamps, VCC on pin 8 and GND on pin 4 - */ - -static NETLIST_START(opamp_layout_2_8_4) - DIPPINS( /* +--------------+ */ - A.OUT, /* |1 ++ 8| */ A.VCC, - A.MINUS, /* |2 7| */ B.OUT, - A.PLUS, /* |3 6| */ B.MINUS, - A.GND, /* |4 5| */ B.PLUS - /* +--------------+ */ - ) - NET_C(A.GND, B.GND) - NET_C(A.VCC, B.VCC) -NETLIST_END() - -/* - * Generic layout with 2 opamps, VCC+ on pins 9/13, VCC- on pin 4 and compensation - */ - -static NETLIST_START(opamp_layout_2_13_9_4) - DIPPINS( /* +--------------+ */ - A.MINUS, /* |1 ++ 14| */ A.N2, - A.PLUS, /* |2 13| */ A.VCC, - A.N1, /* |3 12| */ A.OUT, - A.GND, /* |4 11| */ NC, - B.N1, /* |5 10| */ B.OUT, - B.PLUS, /* |6 9| */ B.VCC, - B.MINUS, /* |7 8| */ B.N2 - /* +--------------+ */ - ) - NET_C(A.GND, B.GND) -NETLIST_END() - -/* - * Generic layout with 1 opamp, VCC+ on pin 7, VCC- on pin 4 and compensation - */ - -static NETLIST_START(opamp_layout_1_7_4) - DIPPINS( /* +--------------+ */ - OFFSET.N1, /* |1 ++ 8| */ NC, - MINUS, /* |2 7| */ VCC.PLUS, - PLUS, /* |3 6| */ OUT, - VCC.MINUS, /* |4 5| */ OFFSET.N2 - /* +--------------+ */ - ) - NET_C(A.GND, VCC.MINUS) - NET_C(A.VCC, VCC.PLUS) - NET_C(A.MINUS, MINUS) - NET_C(A.PLUS, PLUS) - NET_C(A.OUT, OUT) -NETLIST_END() - -/* - * Generic layout with 1 opamp, VCC+ on pin 8, VCC- on pin 5 and compensation - */ - -static NETLIST_START(opamp_layout_1_8_5) - DIPPINS( /* +--------------+ */ - NC.1, /* |1 10| */ NC.3, - OFFSET.N1, /* |2 9| */ NC.2, - MINUS, /* |3 8| */ VCC.PLUS, - PLUS, /* |4 7| */ OUT, - VCC.MINUS, /* |5 6| */ OFFSET.N2 - /* +--------------+ */ - ) - NET_C(A.GND, VCC.MINUS) - NET_C(A.VCC, VCC.PLUS) - NET_C(A.MINUS, MINUS) - NET_C(A.PLUS, PLUS) - NET_C(A.OUT, OUT) -NETLIST_END() - -/* - * Generic layout with 1 opamp, VCC+ on pin 11, VCC- on pin 6 and compensation - */ - -static NETLIST_START(opamp_layout_1_11_6) - DIPPINS( /* +--------------+ */ - NC.1, /* |1 ++ 14| */ NC.7, - NC.2, /* |2 13| */ NC.6, - OFFSET.N1, /* |3 12| */ NC.5, - MINUS, /* |4 11| */ VCC.PLUS, - PLUS, /* |5 10| */ OUT, - VCC.MINUS, /* |6 9| */ OFFSET.N2, - NC.3, /* |7 8| */ NC.4 - /* +--------------+ */ - ) - NET_C(A.GND, VCC.MINUS) - NET_C(A.VCC, VCC.PLUS) - NET_C(A.MINUS, MINUS) - NET_C(A.PLUS, PLUS) - NET_C(A.OUT, OUT) -NETLIST_END() - -static NETLIST_START(MB3614_DIP) - OPAMP(A, "MB3614") - OPAMP(B, "MB3614") - OPAMP(C, "MB3614") - OPAMP(D, "MB3614") - - INCLUDE(opamp_layout_4_4_11) - -NETLIST_END() - -static NETLIST_START(LM324_DIP) - OPAMP(A, "LM324") - OPAMP(B, "LM324") - OPAMP(C, "LM324") - OPAMP(D, "LM324") - - INCLUDE(opamp_layout_4_4_11) - -NETLIST_END() - -static NETLIST_START(LM2902_DIP) - // Same datasheet and mostly same characteristics as LM324 - OPAMP(A, "LM324") - OPAMP(B, "LM324") - OPAMP(C, "LM324") - OPAMP(D, "LM324") - - INCLUDE(opamp_layout_4_4_11) - -NETLIST_END() - -static NETLIST_START(LM358_DIP) - OPAMP(A, "LM358") - OPAMP(B, "LM358") - - INCLUDE(opamp_layout_2_8_4) - -NETLIST_END() - -static NETLIST_START(UA741_DIP8) - OPAMP(A, "UA741") - - INCLUDE(opamp_layout_1_7_4) - -NETLIST_END() - -static NETLIST_START(UA741_DIP10) - OPAMP(A, "UA741") - - INCLUDE(opamp_layout_1_8_5) - -NETLIST_END() - -static NETLIST_START(UA741_DIP14) - OPAMP(A, "UA741") - - INCLUDE(opamp_layout_1_11_6) - -NETLIST_END() - -static NETLIST_START(LM747_DIP) - OPAMP(A, "LM747") - OPAMP(B, "LM747") - - INCLUDE(opamp_layout_2_13_9_4) - NET_C(A.VCC, B.VCC) - -NETLIST_END() - -static NETLIST_START(LM747A_DIP) - OPAMP(A, "LM747A") - OPAMP(B, "LM747A") - - INCLUDE(opamp_layout_2_13_9_4) - NET_C(A.VCC, B.VCC) - -NETLIST_END() - -#if USE_LM3900_MODEL == 0 -static NETLIST_START(LM3900) - - /* - * Fast norton opamp model without bandwidth - */ - - /* Terminal definitions for calling netlists */ - - ALIAS(PLUS, R1.1) // Positive input - ALIAS(MINUS, R2.1) // Negative input - ALIAS(OUT, G1.OP) // Opamp output ... - ALIAS(GND, G1.ON) // V- terminal - ALIAS(VCC, DUMMY.I) // V+ terminal - - DUMMY_INPUT(DUMMY) - - /* The opamp model */ - - RES(R1, 1) - RES(R2, 1) - NET_C(R1.1, G1.IP) - NET_C(R2.1, G1.IN) - NET_C(R1.2, R2.2, G1.ON) - VCVS(G1) - PARAM(G1.G, 10000000) - //PARAM(G1.RI, 1) - 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(IS=1e-15 N=1)") - CCCS(CS1) // Current Mirror - - ALIAS(VCC, A.VCC) - ALIAS(GND, A.GND) - ALIAS(PLUS, A.PLUS) - ALIAS(MINUS, A.MINUS) - ALIAS(OUT, A.OUT) - - NET_C(A.PLUS, CS1.IP) - NET_C(D1.A, CS1.IN) - NET_C(CS1.OP, A.MINUS) - NET_C(CS1.ON, A.GND, D1.K) - -NETLIST_END() -#endif - -#if USE_LM3900_MODEL == 3 -static NETLIST_START(LM3900) - - ALIAS(VCC, Q5.C) - ALIAS(GND, Q1.E) - ALIAS(PLUS, Q1.B) - ALIAS(MINUS, Q1.C) - ALIAS(OUT, Q5.E) - - CAP(C1, CAP_P(6.000000)) - CS(I1, 1.300000e-3) - CS(I2, 200e-6) - QBJT_EB(Q1, "NPN") - QBJT_EB(Q2, "NPN") - QBJT_EB(Q3, "PNP") - QBJT_EB(Q4, "PNP") - QBJT_EB(Q5, "NPN") - QBJT_EB(Q6, "NPN") - NET_C(Q3.E, Q5.B, I2.2) - NET_C(Q3.C, Q4.E, Q5.E, I1.1) - NET_C(Q5.C, I2.1) - NET_C(Q1.B, Q6.C, Q6.B) - NET_C(Q1.E, Q2.E, Q4.C, C1.2, I1.2, Q6.E) - NET_C(Q1.C, Q2.B) - NET_C(Q2.C, Q3.B, Q4.B, C1.1) -NETLIST_END() -#endif - -NETLIST_START(OPAMP_lib) - LOCAL_LIB_ENTRY(opamp_layout_4_4_11) - LOCAL_LIB_ENTRY(opamp_layout_2_8_4) - LOCAL_LIB_ENTRY(opamp_layout_2_13_9_4) - LOCAL_LIB_ENTRY(opamp_layout_1_7_4) - LOCAL_LIB_ENTRY(opamp_layout_1_8_5) - LOCAL_LIB_ENTRY(opamp_layout_1_11_6) - - NET_MODEL("LM324 OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=500k SLEW=0.3M RI=1000k RO=50 DAB=0.00075)") - NET_MODEL("LM358 OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=500k SLEW=0.3M RI=1000k RO=50 DAB=0.001)") - NET_MODEL("MB3614 OPAMP(TYPE=3 VLH=1.4 VLL=0.02 FPF=10 UGF=1000k SLEW=0.6M RI=1000k RO=50 DAB=0.002)") - 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)") - // TI and Motorola Datasheets differ - below are Motorola values values SLEW is average of LH and HL - NET_MODEL("LM3900 OPAMP(TYPE=3 VLH=1.0 VLL=0.03 FPF=2k UGF=4M SLEW=10M RI=10M 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) - LOCAL_LIB_ENTRY(LM2902_DIP) - LOCAL_LIB_ENTRY(UA741_DIP8) - LOCAL_LIB_ENTRY(UA741_DIP10) - LOCAL_LIB_ENTRY(UA741_DIP14) - LOCAL_LIB_ENTRY(LM747_DIP) - LOCAL_LIB_ENTRY(LM747A_DIP) - LOCAL_LIB_ENTRY(LM3900) - -NETLIST_END() |