10 REM SMALLOP.BAS  Copyright 1989 by Russell Kincaid
20 REM  Kincaid Engineering, Savage Road, Milford, NH 03055
30 REM VERSION 1.1 WRITTEN 9/1/1989, REVISED 9/24/89 AND 5/15/94
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 : R1=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"USE CAPITAL LETTERS ONLY":PRINT
150 INPUT"CAN AN EXTERNAL COMPENSATION CAPACITOR BE ATTACHED ";EXT$
160 IF EXT$="N" OR EXT$="NO" THEN 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"INPUT OFFSET CURRENT :";IOS
220 INPUT"INPUT OFFSET VOLTAGE :";VOFF
230 INPUT"GAIN IN DB (1) OR VOLTS/MV (2) ";Y
240 IF Y=1 THEN 260
250 INPUT"DC VOLTAGE GAIN IN V/MV ";A:A=A*1000: ADB=8.686*LOG(A) : GOTO 270
260 INPUT"DC VOLTAGE GAIN IN DB :";ADB : A=EXP(ADB/8.686)
270 INPUT"FIRST CUT FREQUENCY (1) OR ZERO dB FREQUENCY (2) ";Y
275 IF Y>2 OR Y<1 THEN PRINT" ONE OR TWO, DUMMY!":PRINT:GOTO 270
280 ON Y GOTO 290, 310
290 INPUT"FIRST CUT FREQUENCY (HZ)";F3DB 
300 W0=2*P*F3DB*(10^(ADB/20))/1000000! : GOTO 330
310 INPUT"ZERO DB FREQUENCY AS IF SINGLE CUT (IN mHZ)";F0
320 F3DB=F0/(10^(ADB/20))*1000000! : W0=2*P*F0
330 W3DB=2*P*F3DB
340 R2=1/W3DB/C2*1000000! : REM R2 IN MEGOHMS
350 INPUT"DIFFERENTIAL INPUT RESISTANCE IN MEGHOMS :";RIN
360 INPUT"DIFFERENTIAL INPUT CAPACITANCE IN PF (CANNOT BE ZERO) " ;CIN
370 INPUT"COMMON-MODE INPUT RESISTANCE IN MEGOHMS (ZERO IF NOT SPECIFIED) :";RCM
380 IF RCM=0 THEN 400
390 RCM= RCM-RIN/4
400 INPUT"PHASE MARGIN (1) OR 2ND CUT FREQ (2)";D
410 ON D GOTO 420,460
420 INPUT"PHASE MARGIN IN DEGREES :";PM :PM=PM*P/180
425 INPUT"ACTUAL 0dB FREQUENCY IN mHZ";F0:W0=2*P*F0
430 XC2=1/W0/C2 : P2=ATN(R2/XC2)
440 P3=P-P2-PM 
450 XC3=RGB/ABS(TAN(P3)) : C3=1/XC3/W0*1000000! : GOTO 480 : REM C3 IN PF
460 INPUT"2ND CUT FREQ (MHZ) ";F2
470 C3=1/2/P/RGB/F2*1000000! : REM PICOFARADS
480 INPUT"STANDBY POWER DISSAPATION :";PD
490 PRINT "         AT VCC = ";:INPUT VCC : PRINT"      AT VEE = ";:INPUT VEE
500 RP=((VCC-VEE)^2)/(PD-VCC*2*IC*.000001-ABS(VEE*IEE*.000001))
560 INPUT"OUTPUT RESISTANCE AT LOW FREQUENCY :";ROUT : L1=0
570 PRINT:PRINT"IF THE MAX OUTPUT SWING IS VCC-X TO VEE+Y, WHAT ARE:"
580 INPUT"      X = ";VC: VOLP=VC+V*LOG(S*C2/ISD)
590 INPUT"      Y = ";VE: VOLN=VE+V*LOG(SN*C2/ISD)
650 REM ****** END OF OP AMP PARAMETER INPUT ******
660 RS=R2*(1-1/1000)
670 VSLEWP=S*RS*C2-V*LOG(C2*S/ISD)
680 VSLEWN=SN*RS*C2-V*LOG(C2*SN/ISD)
690 IB1=IB+IOS/2 : IB2=IB-IOS/2
700 INPUT"WHAT WILL YOU NAME THIS MODEL : ";SUBNAM$
710 A1=ASC(LEFT$(SUBNAM$,1))
720 IF A1<65 OR A1 > 122 THEN PRINT"NAME MUST BEGIN WITH A LETTER":GOTO 700
730 NAM$=SUBNAM$+".MDL"
740 OPEN NAM$  FOR OUTPUT AS  #1
750 PRINT#1,""
760 IF EXT$="N" OR EXT$="NO" THEN 780
770  ON COMP GOTO 800,820
780 PRINT#1,".SUBCKT ";SUBNAM$;" 2 24 21 20 12"
790 PRINT#1,"*** -IN +IN OUT V- V+ *** " :GOTO 840
800 PRINT#1,".SUBCKT ";SUBNAM$;" 2 24 21 20 12 11"
810 PRINT#1,"*** -IN +IN OUT V- V+ COMP ***" :GOTO 840
820 PRINT#1,".SUBCKT ";SUBNAM$;" 2 24 21 20 12 27 28"
830 PRINT#1,"*** -IN +IN OUT V- V+ COMP1 COMP2 ***"
840 PRINT#1,".MODEL DG D RS=1 IS=";ISD
844 PRINT#1,"* USE .NODESET V(IN)=0 V(OUT)=0
880 PRINT#1,"VOFF 2 1 ";VOFF
900 PRINT#1,"VS1 10 13 ";VSLEWP
910 PRINT#1,"VS2 13 8 ";VSLEWN
915 PRINT#1,"D3 8 7 DG"
920 PRINT#1,"D2 7 10 DG"
930 K=RIN/2
940 PRINT#1,"RIN1 1 5 ";STR$(K)+"MEG"
950 PRINT#1,"RIN2 5 24 ";STR$(K)+"MEG"
960 IF RCM=0 THEN 990
970 K=RCM-RIN/4 : GOSUB 1440
980 PRINT#1,"RCM 5 13 ";STR$(K)+"MEG"
990 PRINT#1,"RP1 12 13 " ;RP/2 : PRINT#1,"RP2 13 20 ";RP/2
1020 PRINT#1,"RO 21 23 ";ROUT
1030 PRINT#1,"IB2 24 0 ";IB2
1040 PRINT#1,"IB1 1 0 ";IB1
1050 PRINT#1,"C1 1 24 ";STR$(CIN)+"PF"
1060 K=A:GOSUB 1440
1070 PRINT#1,"EA 19 0 1 24 ";K
1080 K=R2*(1-1/1000):GOSUB 1440
1090 PRINT#1,"R2 7 11 ";STR$(K)+"MEG"
1100 N$=STR$(C2)+"PF"
1110 IF COMP<2 THEN 1160
1120 PRINT#1,"C2 27 28 ";N$
1130 PRINT#1,"EC2 27 0 11 0 1"
1140 PRINT#1,"VC2 28 0 0"
1150 PRINT#1,"FC2 11 0 VC2 1" :GOTO 1170
1160 PRINT#1,"C2 11 0 ";N$
1170 PRINT#1,"D5 11 22 DG"
1180 PRINT#1,"GB 13 3 0 11 .001"
1190 PRINT#1,"RGB 3 13 1K"
1200 K=C3 : GOSUB 1440
1210 PRINT#1,"C3 3 13 ";STR$(K)+"PF"
1230 PRINT#1,"D6 15 11 DG"
1300 PRINT#1,"VOLP 12 22 ";VC+.5: PRINT#1,"VOLN 15 20 ";VE+.5
1310 K=R2/1000:GOSUB 1440
1320 PRINT#1,"R22 19 7 ";STR$(K)+"MEG"
1380 PRINT#1,"EOUT 0 23 0 3 1"
1390 PRINT#1,".ENDS ";SUBNAM$
1400 CLOSE#1 
1410 PRINT:PRINT"USE TYPE COMMAND TO VIEW THE  FILE ";NAM$
1420 GOTO 1540
1430 REM ROUNDOFF ROUTINE
1440 IF K=0 THEN RETURN
1450 IF ABS(K)<1 THEN 1490
1460 FOR T=0 TO 8 : K2=K/10^T
1470 IF ABS(K2)<10 THEN 1520
1480 NEXT T : PRINT "ERROR":STOP
1490 FOR T=0 TO 8 : K2=K*10^T
1500 IF ABS(K2)>1 THEN 1530
1510 NEXT T : PRINT"ERROR": STOP
1520 K=10^T*INT(K2*1000+.5)/1000 : RETURN
1530 K=INT(K2*1000+.5)/1000/10^T : RETURN
1540 SYSTEM : END

    Source: geocities.com/russlk/spice

               ( geocities.com/russlk)