100 REM IFOA.BAS  Copyright 1989 by Russell Kincaid
110 REM  Kincaid Engineering, Savage Road, Milford, NH 03055
120 REM VERSION 1.0 WRITTEN 10/20/1989
122 REM VERSION 2.0 WRITTEN 1/6/1990
130 CLS
140 PRINT "**********************************************************************"
150 PRINT" THIS PROGRAM GENERATES A SPICE DECK THAT DESCRIBES A"
160 PRINT" CURRENT MODE OP AMP CIRCUIT"
170 PRINT"       Written by:  Russ Kincaid, Milford, NH 03055"
180 PRINT:PRINT"  This is shareware, see the file README.DOC"
190 PRINT"**********************************************************************"
200 PRINT:PRINT
210 ISD=1E-12 : P=3.14162 :  R3 = 1 : V=.02585  : NN$=" 2 " : NI$=" 1 "
220 PRINT:PRINT
230 C2=10 : REM PF STARTING VALUE IS ARBITRARY
240 INPUT"INPUT BIAS CURRENT (NON-INV INPUT):";IB2
250 INPUT"INPUT BIAS CURRENT (INVERTING INPUT):";IB1
260 INPUT"INPUT OFFSET VOLTAGE :";VOFF
270 INPUT"INVERTING TRANSIMPEDANCE GAIN IN DB (1) OR OHMS (2) ";Y
280 IF Y=1 THEN 300
290 INPUT"DC V/I GAIN IN OHMS ";A: ADB=8.686*LOG(A) : GOTO 310
300 INPUT"DC V/I GAIN IN DB :";ADB : A=EXP(ADB/8.686)
310 INPUT"FIRST CUT FREQUENCY (1) OR ZERO dB FREQUENCY (2) ";Y
320 IF Y>2 OR Y<1 THEN PRINT" ONE OR TWO, DUMMY!":PRINT:GOTO 310
330 ON Y GOTO 340, 360
340 INPUT"FIRST CUT FREQUENCY (HZ)";F3DB 
350 W0=2*P*F3DB*(10^(ADB/20))/1000000! : GOTO 380
360 INPUT"ZERO DB FREQUENCY AS IF SINGLE CUT (IN mHZ)";F0
370 F3DB=F0/(10^(ADB/20))*1000000! : W0=2*P*F0
380 W3DB=2*P*F3DB
390 R2=1/W3DB/C2*1E+09 : REM R2 IN KOHMS
400 INPUT"INVERTING INPUT RESISTANCE IN OHMS ( 50 NOMINAL):";RIN
410 INPUT"NON-INVERTING INPUT CAPACITANCE IN PF " ;CIN$
420 INPUT"NON-INVERTING INPUT RESISTANCE IN OHMS ";RIN2
430 PRINT"IF THE INPUT COMMON MODE RANGE IS VCC-X TO VEE+Y, WHAT IS:"
440 INPUT"      X = ";VCMP: VCMP=VCMP+.5
450 INPUT"      Y = ";VCMN: VCMN=VCMN+.5
455 PRINT"IF PHASE AT LOW FREQ. IS 180 DEGREES,"
460 PRINT:PRINT"GIVE HIGHEST FREQUENCY AND PHASE DATA POINT:"
470 INPUT"PHASE (DEGREES):";PT:PT=P-(P/180*PT)  : PRINT PT*180/P;"=PT"
480 INPUT"FREQUENCY (mHZ):";F2:W2=2*P*F2
490 INPUT"LOAD RESISTANCE FOR PHASE MEASUREMENT:";RL
494 INPUT "POWER FROM (1) MAX CURRENT (2) POWER";C
496 ON C GOTO 498,500
498 INPUT"MAX SUPPLY CURRENT (AMPS)";C:INPUT"  AT VCC=";VCC:INPUT"  AT VEE=";VEE
499 PD=C*(VCC-VEE):GOTO 520
500 INPUT"STANDBY POWER DISSAPATION :";PD
510 PRINT "         AT VCC = ";:INPUT VCC : PRINT"      AT VEE = ";:INPUT VEE
520 INPUT"COMMON-MODE REJECTION RATIO IN DB :";CM
530 ECM=1/EXP((CM)/8.686)
540 INPUT"OUTPUT RESISTANCE AT LOW FREQUENCY :";ROUT 
550 INPUT"OUTPUT INDUCTANCE (nH):";LO:LO$=STR$(LO)
560 PRINT:PRINT"IF THE MAX OUTPUT SWING IS VCC-X TO VEE+Y, WHAT ARE:"
570 INPUT"      X = ";VOLP : VOLP=VOLP+.5
580 INPUT"      Y = ";VOLN : VOLN=VOLN+.5
584 INPUT"OUTPUT DELAY WHEN OVERDRIVEN (nS) (ZERO FOR NONE):";TT :TT=TT/2
590 INPUT"OUTPUT CURRENT LIMIT IN AMPS :";ISC
600 INPUT"WILL YOU MODEL THE NOISE PERFORMANCE";NP$
604 INPUT"INTERNAL FEEDBACK RESISTOR, OHMS (ZERO FOR NONE):";RF
610 REM ****** END OF OP AMP PARAMETER INPUT ******
620 F2G=100: N1$="12":N2$="13"  : ISE=1E-14 : RB1=1000
630 IC2=IB1
640 F1G=RIN2/(RIN*(F2G+1)+1)
650 I1=IB2*(F1G+1)
660 RB2=RIN*(F2G+1)-RB1/F1G
670 GAIN=A/R2/1000
680 VBE1=-IB2*RB1+VOFF
690 ILIM=ISC/100
700 F3I0=PD/(VCC-VEE)-.001
710 PLO=ATN(W2*LO/1000/RL) : PC2=ATN(R2*.001*W2*C2)
720 PC3=PT-PC2-PLO
730 C3= TAN(PC3)/R3/W2*1000000! : REM C3 IN PF
740 INPUT"WHAT WILL YOU NAME THIS MODEL : ";SUBNAM$
750 A1=ASC(LEFT$(SUBNAM$,1))
760 IF A1<65 OR A1 > 122 THEN PRINT"NAME MUST BEGIN WITH A LETTER":GOTO 740
770 NAM$=SUBNAM$+".MDL"
780 OPEN NAM$  FOR OUTPUT AS  #1
790 PRINT#1,""
800 PRINT#1,".SUBCKT ";SUBNAM$;" 1 2 3 4 5 "
810 PRINT#1,"*** -IN +IN OUT V+ V- *** " 
830 PRINT#1,".MODEL GD D RS=1"
840 PRINT#1,".MODEL DLIM D IS=1E-16"
841 PRINT#1,".MODEL DF D IS=1E-16 N=1.2"
843 IF TT=0 THEN K$="0":GOTO 844
844 K=TT:GOSUB 1340
845 PRINT#1,".MODEL DOL D TT=";K$+"NS"
850 PRINT#1," ECM 10"+ NN$+"9 0 ";ECM
852 IF RF=0 THEN 860
854 PRINT#1," RF 3 1 ";RF
860 PRINT#1," RIN2"+ NN$+"0 ";RIN2
870 PRINT#1," C1 10 0 ";CIN$+"PF"
880 PRINT#1," GRB1 16 10 16 10 ";1/RB1
890 PRINT#1," D1 16 7 GD"
900 PRINT#1," VCMP 4 7 ";VCMP
910 PRINT#1," VBE1 16 9 ";VBE1
920 K=F1G: GOSUB 1340
930 PRINT#1," F1 0 9 VBE1 ";F1G
940 PRINT#1," I1 9 0 ";I1
950  K=1/RB2:GOSUB 1340
960 PRINT#1," GRB2 9 6 9 6 ";K$
970 PRINT#1," VBE2"+NI$+"6 0"
980 PRINT#1," F2"+NI$+"11 POLY(1) VBE2 ";IB2;" 100"
990 PRINT#1," D2 11"+NI$+"GD"
1000 PRINT#1," VCMN 11 5 ";VCMN
1010 K=IC2:GOSUB 1340
1020 PRINT#1," IC2 11 0 ";K$
1030 PRINT#1," FA 8 0 VCMN ";GAIN
1040 K=R2:GOSUB 1340
1050 REM R2 SHOULD NOT BE LESS THAN 1K
1060 PRINT#1," R2 8 0 ";K$+"K"
1070 PRINT#1," C2 8 0 ";STR$(C2)+"PF"
1080 PRINT#1," GB 0 29 8 0 1"
1090 K=C3:GOSUB 1340
1100 PRINT#1," R3 0 29 1"
1110 PRINT#1," C3 0 29 ";K$+"PF"
1120 PRINT#1," D3 13 29 DLIM"
1130 PRINT#1," D4 29 24 DLIM"
1140 PRINT#1," ILIM 24 13 ";ILIM
1150 PRINT#1," D5 8 32 DOL"
1160 PRINT#1," D6 13 18 DF"
1170 PRINT#1," D7 14 24 DF"
1180 PRINT#1," D8 12 8 DOL"
1190 PRINT#1," V3 18 17 0"
1200 PRINT#1," V4 17 14 0"
1210 PRINT#1," F3 4 17 V3 ";F3I0;" 100"
1220 PRINT#1," F4 17 5 V4 ";F3I0;" 100"
1230 IF LO=0 THEN 1260
1240 PRINT#1," RO 17 15 ";ROUT
1250 PRINT#1," LO 15 3 ";LO$+"NH":GOTO 1270
1260 PRINT#1," RO 17 3 ";ROUT
1270 PRINT#1," VOLP 4 32 ";VOLP
1280 PRINT#1," VOLN 12 5 ";VOLN
1290 PRINT#1,".ENDS ";SUBNAM$
1300 CLOSE#1 
1310 PRINT:PRINT"USE TYPE COMMAND TO VIEW THE  FILE ";NAM$
1320 GOTO 2230
1330 REM ROUNDOFF ROUTINE
1340 IF K=0 THEN RETURN
1350 IF ABS(K)<1 THEN 1390
1360 FOR T=0 TO 16 :K2=K/10^T
1370 IF ABS(K2)<10 THEN 1420
1380 NEXT T : PRINT K;" IS TOO LARGE":STOP
1390 FOR T=0 TO 16 : K2=K*10^T
1400 IF ABS(K2)>1 THEN 1430
1410 NEXT T : PRINT K;" IS TOO SMALL": STOP
1420 K=10^T*INT(K2*1000+.5)/1000 : GOTO 1440
1430 K=INT(K2*1000+.5)/1000/10^T 
1440 IF K<0 THEN K$=STR$(K):GOTO 1460
1450 K$=RIGHT$(STR$(K),LEN(STR$(K))-1)
1460 RETURN
1470 REM THIS ROUTINE GENERATES SUBCIRCUITS FOR NOISE SOURCES
1480  KTB=4*1.38E-23*300 : RVN=.01656 : RIN=16560 : NN$=" 25 " : NI$=" 21 "
1490 CLS
1500 PRINT"********************************************************"
1510 PRINT"     NOISE CURRENT AND VOLTAGE CALCULATIONS"
1520 PRINT"     AND SUBCIRCUIT GENERATION"
1560 REM PINK NOISE
1570 PRINT"This noise is constant below 1 hZ and rolls off at 20dB/decade to a"
1580 PRINT"corner frequency above which it remains constant.":PRINT
1585 PRINT"     NON-INVERTING INPUT:"
1590 INPUT"VOLTAGE NOISE CORNER FREQUENCY IN HZ";FV
1600 INPUT"CURRENT NOISE CORNER FREQUENCY IN HZ";FI
1610 INPUT"CONSTANT NOISE LEVEL (NV/RT HZ):";NV
1620 INPUT"CONSTANT NOISE LEVEL (PA/RT HZ):";NI
1630 DECADE=.4343*LOG(FV): NXV=10^DECADE 
1640 RXV=1E+18*KTB/NXV^2 : RXV = RXV*RVN/(RVN-RXV) 
1650 LXV=RXV/2/P
1660 DECADE=.4343*LOG(FI):NXI=10^DECADE
1670 RXI=1E+24*KTB/NXI^2  : RXI=RXI*RIN/(RIN-RXI)
1680 LXI=RXI/2/P
1690 PRINT#1,".SUBCKT PINK 1 2 3
1700 PRINT#1,"* Noise generator, Fcv=";FV;", Fci=";FI;"
1710 PRINT#1,"* Vn=";NV;"nV/rt hZ, In=";NI;"pA/rt hZ"
1720 PRINT#1,"RVN 4 0 ";RVN
1730 PRINT#1,"RXV 0 5 ";RXV
1740 PRINT#1,"LXV 4 5 ";LXV
1750 PRINT#1,"VN 4 0 0"
1760 PRINT#1,"H1 1 2 VN ";NV
1770 PRINT#1,"RIN 6 0 ";RIN
1780 PRINT#1,"RXI 0 7 ";RXI
1790 PRINT#1,"LXI 6 7 ";LXI
1800 PRINT#1,"VI 6 0 0"
1810 PRINT#1,"F1 2 3 VI ";NI
1820 PRINT#1,".ENDS PINK" 
2000 PRINT#1,"XNOISE 2 25 0 PINK"
2010 PRINT
2050 PRINT"This noise is constant below 1 hZ and rolls off at 20dB/decade to a"
2060 PRINT"corner frequency above which it remains constant.":PRINT
2070 INPUT"INVERTING INPUT CURRENT NOISE CORNER FREQUENCY IN HZ";FI
2075 IF FI=0 THEN RETURN
2080 INPUT"INVERTING INPUT CONSTANT NOISE LEVEL (PA/RT HZ):";NI
2082 DECADE=.4343*LOG(FI):NXI=10^DECADE
2084 RXI=1E+24*KTB/NXI^2  : RXI=RXI*RIN/(RIN-RXI)
2086 LXI=RXI/2/P
2088 PRINT#1,".SUBCKT PINV 1 2 "
2100 PRINT#1,"* Noise generator,  Fci=";FI;"
2110 PRINT#1,"* Vn=";NV;"nV/rt hZ, In=";NI;"pA/rt hZ"
2112 PRINT#1,"RIN 6 0 ";RIN
2114 PRINT#1,"RXI 0 7 ";RXI
2116 PRINT#1,"LXI 6 7 ";LXI
2118 PRINT#1,"VI 6 0 0"
2120 PRINT#1,"F1 1 2 VI ";NI
2200 PRINT#1,".ENDS PINV" 
2210 PRINT#1,"XVN 1 21 PINV"
2220 RETURN
2222 REM **********   THE SIMPLE MODEL   ***************
2230 NAM$=SUBNAM$+".SMP"
2240 OPEN NAM$  FOR OUTPUT AS  #1
2250 PRINT#1,""
2260 PRINT#1,".SUBCKT ";SUBNAM$;" 1 2 3 "
2270 PRINT#1,"*** -IN +IN OUT *** " 
2280 IF RF=0 THEN 2350
2290 PRINT#1,"RF 3 1 ";RF
2350 PRINT#1," C1 2 0 ";CIN$+"PF"
2360 PRINT#1," GRB1 16 2 16 2 ";1/RB1
2390 PRINT#1," VBE1 16 9 ";VBE1
2400 K=F1G: GOSUB 1340
2410 PRINT#1," F1 0 9 VBE1 ";F1G
2420 PRINT#1," I1 9 0 ";I1
2430  K=1/RB2:GOSUB 1340
2440 PRINT#1," GRB2 9 6 9 6 ";K$
2450 PRINT#1," VBE2 1 6 0"
2460 PRINT#1," F2 1 11 POLY(1) VBE2 ";IB2;" 100"
2480 PRINT#1," VCMN 11 0 0"
2490 K=IC2:GOSUB 1340
2500 PRINT#1," IC2 11 0 ";K$
2510 PRINT#1," FA 8 0 VCMN ";GAIN
2520 K=R2:GOSUB 1340
2530 REM R2 SHOULD NOT BE LESS THAN 1K
2540 PRINT#1," R2 8 0 ";K$+"K"
2560 PRINT#1," C2 8 0 ";STR$(C2)+"PF"
2570 PRINT#1," GB 0 29 8 0 1"
2580 K=C3:GOSUB 1340
2590 PRINT#1," R3 0 29 1"
2600 PRINT#1," C3 0 29 ";K$+"PF"
2720 IF LO=0 THEN 2750
2740 PRINT#1," LO 29 17 ";LO$+"NH"
2750 PRINT#1," RO 17 3 ";ROUT-1
2780 PRINT#1,".ENDS ";SUBNAM$
2790 CLOSE#1 
2800 PRINT:PRINT"USE TYPE COMMAND TO VIEW THE  FILE ";NAM$
2802 REM *********  NOISE MODEL  *************
2804 STOP
2810 NAM$=SUBNAM$+".NSE"
2820 OPEN NAM$  FOR OUTPUT AS  #1
2830 PRINT#1,""
2840 PRINT#1,".SUBCKT ";SUBNAM$;" 1 2 3 "
2850 PRINT#1,"*** -IN +IN OUT *** " 
2860 NP$=LEFT$(NP$,1):IF NP$="Y" OR NP$="y" THEN GOSUB 1470
2865 IF RF=0 THEN 2930
2870 PRINT#1," RF 3 1 ";RF
2930 PRINT#1," C1 2 0 ";CIN$+"PF"
2940 PRINT#1," GRB1 16 2 16 2 ";1/RB1
2970 PRINT#1," VBE1 16 9 ";VBE1
2980 K=F1G: GOSUB 1340
2990 PRINT#1," F1 0 9 VBE1 ";F1G
3000 PRINT#1," I1 9 0 ";I1
3010  K=1/RB2:GOSUB 1340
3020 PRINT#1," GRB2 9 6 9 6 ";K$
3030 PRINT#1," VBE2 1 6 0"
3040 PRINT#1," F2 1 11 POLY(1) VBE2 ";IB2;" 100"
3060 PRINT#1," VCMN 11 0 0 "
3070 K=IC2:GOSUB 1340
3080 PRINT#1," IC2 11 0 ";K$
3090 PRINT#1," FA 8 0 VCMN ";GAIN
3100 K=R2:GOSUB 1340
3110 REM R2 SHOULD NOT BE LESS THAN 1K
3111 IF R2>1 THEN 3120
3112 PRINT" ERROR - R2 IS LESS THAN 1K": PRINT
3120 PRINT#1," R2 8 0 ";K$+"K"
3130 PRINT#1," C2 8 0 ";STR$(C2)+"PF"
3140 PRINT#1," GB 0 29 8 0 1"
3150 K=C3:GOSUB 1340
3160 PRINT#1," R3 0 29 1"
3170 PRINT#1," C3 0 29 ";K$+"PF"
3290 IF LO=0 THEN 3320
3310 PRINT#1," LO 29 17 ";LO$+"NH"
3320 PRINT#1," RO 17 3 ";ROUT-1
3350 PRINT#1,".ENDS ";SUBNAM$
3360 CLOSE#1 
3370 PRINT:PRINT"USE TYPE COMMAND TO VIEW THE  FILE ";NAM$
3380 SYSTEM
9999 END








    Source: geocities.com/russlk/spice

               ( geocities.com/russlk)