10 REM BIGOP.BAS  Copyright 1989 by Russell Kincaid
20 REM  Kincaid Engineering, Savage Road, Milford, NH 03055
30 REM VERSION 1.0 WRITTEN 9/24/1989
40 CLS
50 PRINT "**********************************************************************"
60 PRINT" THIS PROGRAM GENERATES A SPICE DECK THAT DESCRIBES AN OP AMP CIRCUIT"
70 PRINT"       Written by:  Russ Kincaid, Milford, NH 03055"
80 PRINT:PRINT"  This is shareware, see the file README.DOC"
90 PRINT"**********************************************************************"
100 PRINT:PRINT
110 ISD=1E-12 : P=3.14162 : RGB= 1000 : V=.02585 :  BF=1000
120 INPUT"WHAT IS THE INTERNAL COMPENSATION CAPACITOR IN PF :";C2
130 IF C2<=0 THEN PRINT :PRINT "MUST BE GREATER THAN ZERO":GOTO 120
140 PRINT:PRINT
150 INPUT"CAN AN EXTERNAL COMPENSATION CAPACITOR BE ATTACHED ";EXT$
160 IF LEFT$(EXT$,1)="N" OR LEFT$(EXT$,1)="n" THEN EXT$="N":GOTO 180
170 INPUT"IS IT CONNECTED FROM 1 PIN TO GND (1), OR BETWEEN TWO PINS (2) ";COMP
180 INPUT"POSITIVE SLEW RATE IN V/US :";S
190 INPUT"NEGATIVE SLEW RATE IN V/US :";SN
200 INPUT"INPUT BIAS CURRENT :";IB
210 INPUT"BIPOLAR (1) OR FET (2) INPUT";BI
220 IF BI>2 OR BI<1 THEN PRINT"HOW'S THAT?":PRINT:GOTO 210
230 IF BI=2 THEN 250
240 INPUT"NPN (1) OR PNP (2) INPUT";NPN
250 INPUT"INPUT OFFSET CURRENT :";IOS
260 IF BI=2 THEN INPUT"P, N, OR MOS TYPE FET";FET$
270 IF LEFT$(FET$,1)="M" OR LEFT$(FET$,1)="m" THEN FET$="N"
280 IF LEFT$(FET$,1)="n" OR LEFT$(FET$,1)="N" THEN FET$="N"
290 INPUT"INPUT OFFSET VOLTAGE :";VOFF
300 INPUT"GAIN IN DB (1) OR VOLTS/MV (2) ";Y
310 IF Y=1 THEN 330
320 INPUT"DC VOLTAGE GAIN IN V/MV ";A:A=A*1000: ADB=8.686*LOG(A) : GOTO 340
330 INPUT"DC VOLTAGE GAIN IN DB :";ADB : A=EXP(ADB/8.686)
340 INPUT"FIRST CUT FREQUENCY (1) OR ZERO dB FREQUENCY (2) ";Y
350 IF Y>2 OR Y<1 THEN PRINT" ONE OR TWO, DUMMY!":PRINT:GOTO 340
360 ON Y GOTO 370, 390
370 INPUT"FIRST CUT FREQUENCY (HZ)";F3DB 
380 W0=2*P*F3DB*(10^(ADB/20))/1000000! : GOTO 410
390 INPUT"ZERO DB FREQUENCY AS IF SINGLE CUT (IN mHZ)";F0
400 F3DB=F0/(10^(ADB/20))*1000000! : W0=2*P*F0
410 W3DB=2*P*F3DB
420 R2=1/W3DB/C2*1000000! : REM R2 IN MEGOHMS
430 INPUT"DIFFERENTIAL INPUT RESISTANCE IN MEGHOMS :";RIN
440 INPUT"DIFFERENTIAL INPUT CAPACITANCE IN PF " ;CIN
450 INPUT"COMMON-MODE INPUT RESISTANCE IN MEGOHMS (ZERO IF NOT SPECIFIED) :";RCM
460 IF RCM=0 THEN 480
470 RCM= RCM-RIN/4
480 PRINT"IF THE INPUT COMMON MODE RANGE IS VCC-X TO VEE+Y, WHAT IS:"
490 INPUT"      X = ";VCMP: VCMP=VCMP+.5
500 INPUT"      Y = ";VCMN: VCMN=VCMN+.5
510 INPUT"PHASE MARGIN (1) OR 2ND CUT FREQ (2)";D
520 ON D GOTO 530,580
530 INPUT"PHASE MARGIN IN DEGREES :";PM :PM=PM*P/180
540 INPUT"ACTUAL 0dB FREQUENCY IN mHZ";F0:W0=2*P*F0
550 XC2=1/W0/C2 : P2=ATN(R2/XC2)
560 P3=P-P2-PM 
570 XC3=RGB/TAN(P3) : C3=1/XC3/W0*1000000! : GOTO 600 : REM C3 IN PF
580 INPUT"2ND CUT FREQ (MHZ) ";F2
590 C3=1/2/P/RGB/F2*1000000! : REM PICOFARADS
600 INPUT"ARE YOU CONCERNED WITH GAIN VARIATION OVER TEMPERATURE";Y$
610 IF LEFT$(Y$,1)><"y" AND LEFT$(Y$,1)><"Y" THEN 660
614 INPUT"IS YOUR DATA GAIN & TEMP (1) OR BANDWIDTH & TEMP (2)";D
615 IF D>2 OR D<1 THEN PRINT"TRY AGAIN!":GOTO 614
616 ON D GOTO 620,644
620 PRINT"GIVE TWO DATA POINTS (TEMP,GAIN):"
630 INPUT"LOW TEMP (T,Av) :";T1,A1
640 INPUT"HIGH TEMP (T,Av):";T2,A2
642 TC=(A2-A1)/A/(T2-T1): GOTO 660
644 PRINT"GIVE TWO DATA POINTS  (BANDWIDTH, TEMP):"
645 INPUT"LOW FREQ (mHZ) (Bw,T):";B1,T1:INPUT"HIGH FREQ (mHZ) (Bw,T):";B2,T2
647  R=LOG(F0/B1)/LOG(2):DA=EXP(6*R/8.686) : A1=A/DA:PRINT A1
648  R=LOG(B2/F0)/LOG(2):DA=EXP(6*R/8.686) : A2=DA*A:PRINT A2:GOTO 642
660 INPUT"STANDBY POWER DISSAPATION :";PD
670 PRINT "         AT VCC = ";:INPUT VCC : PRINT"      AT VEE = ";:INPUT VEE
680 RP=((VCC-VEE)^2)/(PD-VCC*2*IC*.000001-ABS(VEE*IEE*.000001))
690 INPUT"COMMON-MODE REJECTION RATIO IN DB :";CM
700 ECM=1/EXP((CM)/8.686)
710 INPUT"OUTPUT RESISTANCE AT LOW FREQUENCY :";ROUT : L1=0
720 PRINT:PRINT"IF THE MAX OUTPUT SWING IS VCC-X TO VEE+Y, WHAT ARE:"
730 INPUT"      X = ";VC: VOLP=VC+V*LOG(S*C2/ISD)
740 INPUT"      Y = ";VE: VOLN=VE+V*LOG(SN*C2/ISD)
750 INPUT"OUTPUT CURRENT LIMIT IN AMPS (SOURCE) :";ISCU
760 INPUT"OUTPUT CURRENT LIMIT IN AMPS (SINK) :";ISCD
770 IF ISCU=ISCD THEN 800
780 IF ISCU>ISCD THEN BF1=1000:BF2=1000*ISCU/ISCD:ISC=ISCU:GOTO 820
790 BF2=1000:BF1=BF*ISCD/ISCU:ISC=ISCD:GOTO 820
800 BF2=1000:BF1=BF:ISC=ISCU
810 REM ****** END OF OP AMP PARAMETER INPUT ******
820 RS=R2*(1-1/1000)
830 VSLEWP=S*RS*C2-V*LOG(C2*S/ISD)
840 VSLEWN=SN*RS*C2-V*LOG(C2*SN/ISD)
850 IB1=IB+IOS/2 : IB2=IB-IOS/2
860 IF IB1>VCC*1E-12 AND IB2>VCC*1E-12 OR FET$>"N" THEN 880
870  PRINT"Ib TOO SMALL TO MODEL WITH A DIODE":FET$="":GOTO 890
880 IF IB1"N" THEN 870
890 INPUT"WHAT WILL YOU NAME THIS MODEL : ";SUBNAM$
900 A1=ASC(LEFT$(SUBNAM$,1))
910 IF A1<65 OR A1 > 122 THEN PRINT"NAME MUST BEGIN WITH A LETTER":GOTO 890
920 NAM$=SUBNAM$+".MDL"
930 OPEN NAM$  FOR OUTPUT AS  #1
940 PRINT#1,""
950 IF EXT$="N" OR EXT$="NO" THEN 970
960  ON COMP GOTO 990,1010
970 PRINT#1,".SUBCKT ";SUBNAM$;" 1 2 3 4 5 "
980 PRINT#1,"*** -IN +IN OUT V+ V- *** " :GOTO 1030
990 PRINT#1,".SUBCKT ";SUBNAM$;" 1 2 3 4 5 8"
1000 PRINT#1,"*** -IN +IN OUT V+ V- COMP ***" :GOTO 1030
1010 PRINT#1,".SUBCKT ";SUBNAM$;" 1 2 3 4 5 8 26"
1020 PRINT#1,"*** -IN +IN OUT V+ V- COMP1 COMP2 ***"
1030 K=ISD:GOSUB 1870
1040 PRINT#1,".MODEL DG D RS=1 IS=";K$
1050 PRINT#1,".MODEL DLIM D IS=1E-16"
1060 K=IB1:GOSUB 1870
1070 PRINT#1,".MODEL DIB1 D IS=";K$
1080 K=IB2:GOSUB 1870
1090 PRINT#1,".MODEL DIB2 D IS=";K$
1100 K=BF1:GOSUB 1870
1110 PRINT#1,".MODEL Q1 NPN BF=";K$;" ISE=1E-16"
1120 K=BF2:GOSUB 1870
1130 PRINT#1,".MODEL Q2 PNP BF=";K$;" ISE=1E-16"
1140 PRINT#1,"VOFF 2 15 ";VOFF
1150 PRINT#1,"VSLEWP 13 0 ";VSLEWP
1160 PRINT#1,"VSLEWN 0 16 ";VSLEWN
1170 PRINT#1,"D3 11 13 DG"
1180 PRINT#1,"D4 16 11 DG"
1190 K=RIN/2
1200 PRINT#1,"RIN1 15 18 ";STR$(K)+"MEG"
1210 PRINT#1,"RIN2 18 24  ";STR$(K)+"MEG"
1220 IF RCM=0 THEN 1250
1230 K=RCM-RIN/4 : GOSUB 1870
1240 PRINT#1,"RCM 18 0 ";STR$(K)+"MEG"
1250 PRINT#1,"RP 4 5 " ;RP
1260 IF FET$>"" THEN 1320
1270 IF NPN=2 OR LEFT$(FET$,1)="P" OR LEFT$(FET$,1)="p" THEN 1300
1280 PRINT#1,"IB2 24 0 ";IB2
1290 PRINT#1,"IB1 15 0 ";IB1: GOTO 1420
1300 PRINT#1,"IB2 0 1 ";IB2
1310 PRINT#1,"IB1 15 0 ";IB1 : GOTO 1420
1320 PRINT:PRINT"CHECK TO SEE IF D1, D2 LEAKAGE IS SIGNIFICANT":PRINT
1330 IF FET$="N" THEN 1380
1340 PRINT#1,"DIB2 5 15 DIB2"
1350 PRINT#1,"DIB1 5 1  DIB1" : GOTO 1420  
1380 PRINT#1,"DIB2 15 4 DIB2"
1390 PRINT#1,"DIB1 1 4 DIB1"
1420 IF C1=0 THEN 1440
1430 PRINT#1,"C1 15 24 ";STR$(CIN)+"PF"
1440 K=A:GOSUB 1870
1450 IF LEFT$(Y$,1)="Y" OR LEFT$(Y$,1)="y" THEN 1470
1460 PRINT#1,"EA 14 0 20 10 ";K : GOTO 1510
1470 PRINT#1,"EA 14 0 POLY(2) 20 10 27 0 0 0 0 0 1
1480 PRINT#1,"IGAIN 0 27 ";A
1490 K=TC:GOSUB 1870
1500 PRINT#1,"RGAIN 0 27 1 TC=";K$
1510 PRINT#1,"R9 20 15 1K"
1520 PRINT#1,"R10 10 24 1K"
1530 PRINT#1,"D1 20 12 DG" : PRINT#1,"D2 7 10 DG"
1540 PRINT#1,"VCMP 4 12 ";VCMP : PRINT#1,"VCMN 7 5 ";VCMN
1550 K=R2*(1-1/1000):GOSUB 1870
1560 PRINT#1,"R2 11 8 ";K$+"MEG"
1570 K=R2/1000:GOSUB 1870
1580 PRINT#1,"R22 14 11 ";K$+"MEG"
1590 N$=STR$(C2)+"PF"
1600 IF COMP<2 THEN 1630
1610 PRINT#1,"C2 8 26 ";N$
1620 PRINT#1,"VC2 26 0 0"   : GOTO 1640
1630 PRINT#1,"C2 8 0 ";N$
1640 PRINT#1,"D5 8 19 DG"
1650 PRINT#1,"GB 0 17 8 0 .001"
1660 PRINT#1,"RGB 17 0 1K"
1670 K=C3 : GOSUB 1870
1680 PRINT#1,"C3 17 0 ";K$+"PF"
1690 PRINT#1,"D6 22 8 DG"
1700 PRINT#1,"VOLP 4 19 ";VC+.5: PRINT#1,"VOLN 22 5 ";VE+.5
1710 K=R2/1000:GOSUB 1870
1720 K=ECM : GOSUB 1870
1730 PRINT#1,"ECM 24 1 0 18 ";K$
1740 PRINT#1,"EOUT 21 0 17 0 1"
1750 PRINT#1,"ROUT 9 3 ";ROUT
1760 PRINT#1,"D7 25 21 DLIM"
1770 PRINT#1,"D8 21 6 DLIM"
1780 K=ISC/BF:GOSUB 1870
1790 PRINT#1,"ILIM 6 25 ";K$
1800 PRINT#1,"Q1 4 25 9 Q1"
1810 PRINT#1,"Q2 5 6 9 Q2"
1820 PRINT#1,".ENDS ";SUBNAM$
1822 PRINT#1,"**********"
1830 CLOSE#1 
1840 PRINT:PRINT"USE TYPE COMMAND TO VIEW THE  FILE ";NAM$
1850 GOTO 1970
1860 REM ROUNDOFF ROUTINE
1870 IF K=0 THEN RETURN
1880 IF ABS(K)<1 THEN 1920
1890 FOR T=0 TO 16 :K2=K/10^T
1900 IF ABS(K2)<10 THEN 1950
1910 NEXT T : PRINT K;" IS TOO LARGE":STOP
1920 FOR T=0 TO 16 : K2=K*10^T
1930 IF ABS(K2)>1 THEN 1960
1940 NEXT T : PRINT K;" IS TOO SMALL": STOP
1950 K=10^T*INT(K2*1000+.5)/1000 : GOTO 1962
1960 K=INT(K2*1000+.5)/1000/10^T 
1962 IF K<0 THEN K$=STR$(K):GOTO 1966
1964 K$=RIGHT$(STR$(K),LEN(STR$(K))-1)
1966 RETURN
1970 END


    Source: geocities.com/russlk/spice

               ( geocities.com/russlk)