100 REM COMLIN.BAS  Copyright 1990 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
124 REM VERSION 3.0 WRITTEN 1/12/1990  REVISED 9 FEB 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
392 INPUT"PEAK FREQUENCY (MHZ) OF NON-INVERTING GAIN (OR 3DB PT IF NO PEAK)";FP
394 INPUT"EXCESS OF NON-INVERTING GAIN OVER INVERTING GAIN (DB)";DB
395 F1=1.41*FP/(10^3): AC1=1/2/P/F1/5*.000001 : REM PF
396 IF DB>.8 THEN SLP=.00032:INTC=14000!
397 IF DB<.8 THEN SLP=.000156:INTC=16830!
398 AC2=AC1/(INTC-DB/SLP)
400 INPUT"INVERTING INPUT RESISTANCE IN OHMS ( 50 NOMINAL):";RIN
404 INPUT"INVERTING INPUT CAPACITANCE IN PF: ";CI
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
670 GAIN=A/R2/1000
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/2)/R3/W2*1000000! : REM C3 IN PF & C4=C3/10
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 845
844 K=TT:GOSUB 1340
845 PRINT#1,".MODEL DOL D TT=";K$+"NS"
850 PRINT#1," ECM 11 1 10 0 ";ECM
852 IF RF=0 THEN 856
854 PRINT#1," RF 15 1 ";RF
856 PRINT#1,".SUBCKT AMP 2 5 6 12"
858 PRINT#1,"CIN 2 0 ";CIN$+"PF"
860 PRINT#1,"RIN 2 0 ";STR$(RIN2/1000)+"K"
864 PRINT#1,"IBIAS 2 0 ";IB2
868 PRINT#1,"EA 3 0 2 5 1000"
870 PRINT#1,"R1 3 4 5"
874 PRINT#1,"R2 4 5 50"
876 PRINT#1,"C1 4 0 ";STR$(AC1)
878 PRINT#1,"C2 5 0 ";STR$(AC2)
879 PRINT#1,"D1 4 6 GD"
880 PRINT#1,"D2 12 4 GD"
882 PRINT#1,".ENDS AMP"
884 PRINT#1,"XAMP 2 10 6 12 AMP"
886 PRINT#1,"VOFF 9 10 ";VOFF
890 PRINT#1,"RI 9 11 ";RIN
900 PRINT#1,"INVI 1 0 ";IB1
904 PRINT#1,"CI 1 0 ";STR$(CI)+"PF"
910 PRINT#1,"D3 9 6 GD"
920 PRINT#1,"D4 12 9 GD"
930 PRINT#1,"VCMP 4 6 ";VCMP
940 PRINT#1,"VCMN 12 5 ";VCMN
1030 PRINT#1," FA 8 0 VOFF ";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"
1112 PRINT#1," R4 29 40 10"
1113 K=C3/10:GOSUB 1340
1114 PRINT#1," C4 40 0 ";K$+"PF"
1120 PRINT#1," D7 13 40 DLIM"
1130 PRINT#1," D8 40 24 DLIM"
1140 PRINT#1," ILIM 24 13 ";ILIM
1150 PRINT#1," D5 8 32 DOL"
1160 PRINT#1," D9 13 18 DF"
1170 PRINT#1," D10 14 24 DF"
1180 PRINT#1," D6 16 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 16 5 ";VOLN
1290 PRINT#1,".ENDS ";SUBNAM$
1292 PRINT#1,"*********"
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
1465 REM THIS ROUTINE GENERATES SUBCIRCUITS FOR NOISE SOURCES
1470 REM PINK.BAS A PROGRAM TO MODEL NOISE THAT FALLS AT LESS THAN 20DB/DECADE
1472 REM REVISION #4, 3/19/90
1474 DIM R$(20),L$(20)
1476 DATA R0,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,R16,R17,R18,R19,R20
1478 FOR J=0 TO 20:READ R$(J):NEXT J
1480 DATA L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10,L11,L12,L13,L14,L15,L16,L17,L18,L19,L20
1482 FOR J=0 TO 20:READ L$(J):NEXT J
1484 A=0:K=0: KTB=4*1.38E-23*300: PI=3.14162
1486 REM PROGRAM TO COMPUTE VOLTAGE AND CURRENT NOISE SOURCE VALUES FROM
1488 REM DBM DATA GIVEN FOR A PARTICULAR CIRCUIT.
1490 INPUT "MAX NOISE DATA IN DBM(1) OR NV/RT HZ (2):";DBM
1491 ON DBM GOTO 1492,1495
1492 INPUT"MAX NOISE DATA IN DBM:";DBM
1493 NV1=SQR(.05*10^(DBM/10))
1494 PRINT "NV1=";NV1 : PRINT:GOTO 1496
1495 INPUT"MAX NOISE DATA IN NV/RT HZ:";NV1:NV1=NV1*1E-9
1496 INPUT"GAIN RESISTOR VALUE:";RG
1498 INPUT"TYPICAL VOLTAGE NOISE AT NON-INVERTING INPUT (NV/RT HZ):";VN 
1500 VN=VN*1E-09
1502 INPUT"TYPICAL CURRENT NOISE AT INVERTING INPUT (PA/RT HZ):";PA
1504 PA=PA*1E-12
1506 F=1.01 : P0=PA
1508 PA=PA*F : VN=VN*F
1510 VN2=SQR((PA*F*RG)^2 + (VN*F)^2)
1512 PRINT"VN2=";VN2
1514 IF VN210 THEN 1542
1540 GOTO 1544
1542 NEXT J
1544 FD=.4343*LOG(K)
1546 FOR Q=1 TO 3
1548 IF Q=1 THEN V=VN/1000 :REM EVERYTHING IS IN PICO UNITS, MULT BY 1000 LATER
1550 IF Q=2 THEN V=PN
1552 IF Q=3 THEN V=PA
1554 DB0=8.686*LOG(V)
1556 FOR K=J TO 0 STEP -1 : DB=DBD*K  + FD*DBD + DB0 : T=J-K
1558 N(T)=EXP(DB/8.686)
1560 NEXT K : N(J+1)=V 
1562 FOR X=0 TO J+1:PRINT X,"NV=";N(X):NEXT X
1564 IF A=0 THEN KR=J+1: A=1
1566  R(J+1)=KTB/N(J+1)^2
1568 FOR P=J TO 0 STEP -1 : W=2*PI*10^P : N2=N(J+1)^2
1570 FOR T=J TO P+1 STEP -1: N2=N2+N(T)^2:NEXT T
1572 R(P)= KTB/(N(P)^2-N2) : L(P)= R(P)/W 
1574 NEXT P
1576 IF Q=1 THEN GOSUB 1586
1578 IF Q=2 THEN GOSUB 1608
1580 IF Q=3 THEN NME$="PINK2":GOSUB 1626
1582 NEXT Q
1584 RETURN
1586 NME$="PINK1"
1590 PRINT#1,".SUBCKT ";NME$+" 1 2 3"
1592 PRINT#1,R$(J+1);" 0 4 ";R(J+1)
1594 FOR P=0 TO J
1596 PRINT#1,R$(P);" 4 ";6+P;" ";R(P)
1598 PRINT#1,L$(P);6+P;" 0 ";L(P)
1600 NEXT P
1602 PRINT#1,"VV 4 0 0"
1604 PRINT#1,"H1 1 2 VV 1E3"
1606 RETURN
1608 PRINT#1,R$(KR+1);" 0 5 ";R(J+1)
1610 FOR P=0 TO J
1612 PRINT#1,R$(P+KR+2);" 5 ";6+P+KR;" ";R(P)
1614 PRINT#1,L$(P+KR+2);6+P+KR;" 0 ";L(P)
1616 NEXT P
1618 PRINT#1,"VI 5 0 0 "
1620 PRINT#1,"F1 2 3 VI 1"
1622 PRINT#1,".ENDS ";NME$
1624 RETURN
1626 PRINT#1,".SUBCKT ";NME$+" 2 3"
1628 PRINT#1,R$(KR+1);" 0 5 ";R(J+1)
1630 FOR P=0 TO J
1632 PRINT#1,R$(P+KR+2);" 5 ";6+P+KR;" ";R(P)
1634 PRINT#1,L$(P+KR+2);6+P+KR;" 0 ";L(P)
1636 NEXT P
1638 PRINT#1,"VI 5 0 0 "
1640 PRINT#1,"F1 2 3 VI 1"
1642 PRINT#1,".ENDS ";NME$
1644 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 17 1 ";RF
2350 PRINT#1,"CIN 2 0 ";CIN$+"PF"
2352 PRINT#1,"RIN 2 0 ";STR$(RIN2/1000)+"K"
2354 PRINT#1,"IBIAS 2 0 ";IB2
2356 PRINT#1,"ENI 9 10 2 0 1"
2380 PRINT#1,"VOFF 10 0 ";VOFF
2390 PRINT#1,"RI 9 1 ";RIN
2400 PRINT#1,"INVI 1 0 ";IB1
2404 PRINT#1,"CI 1 0 ";STR$(CI)+"PF"
2510 PRINT#1," FA 8 0 VOFF ";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"
2602 PRINT#1," R4 29 40 10"
2603 K=C3/10:GOSUB 1340
2604 PRINT#1," C4 40 0 ";K$+"PF"
2720 IF LO=0 THEN 2764
2740 PRINT#1," LO 3 17 ";LO$+"NH"
2750 PRINT#1," RO 17 40 ";ROUT-11  :GOTO 2780
2764 PRINT#1,"RO 40 3 ";ROUT-11
2780 PRINT#1,".ENDS ";SUBNAM$
2782 PRINT#1,"**********"
2790 CLOSE#1 
2800 PRINT:PRINT"USE TYPE COMMAND TO VIEW THE  FILE ";NAM$
2802 REM *********  NOISE MODEL  *************
2804 IF LEFT$(NP$,1)="N" OR LEFT$(NP$,1)="n" THEN  3360
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 GOSUB 1470
2862 PRINT#1,"XNON 2 25 0 PINK1"
2864 PRINT#1,"XINV 1 0 PINK2"
2865 IF RF=0 THEN 2882
2870 PRINT#1," RF 17 1 ";RF
2882 PRINT#1,"CIN 2 0 ";CIN$+"PF"
2883 K=1/RIN2 : GOSUB 1340
2884 PRINT#1,"GRIN 2 0 2 0 ";K$
2886 PRINT#1,"IBIAS 2 0 ";IB2
2890 PRINT#1,"ENI 9 10 2 0 1"
2904 PRINT#1,"VOFF 10 0 ";VOFF
2905 K=1/RIN:GOSUB 1340
2906 PRINT#1,"GRI 9 1 9 1 ";K$
2908 PRINT#1,"INVI 1 0 ";IB1
2909 PRINT#1,"CI 1 0 ";STR$(CI)+"PF"
3090 PRINT#1," FA 8 0 VOFF ";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"
3172 PRINT#1," R4 29 40 10"
3173 K=C3/10:GOSUB 1340
3174 PRINT#1," C4 40 0 ";K$+"PF"
3290 IF LO=0 THEN 3330
3310 PRINT#1," LO 3 17 ";LO$+"NH"
3320 PRINT#1," RO 17 40 ";ROUT-11 : GOTO 3350
3330 PRINT#1," RO 40 3 ";ROUT-11
3350 PRINT#1,".ENDS ";SUBNAM$
3352 PRINT#1,"**********"
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)