100 REM SPI.BAS Copyright 1989 by Russell Kincaid 110 REM Kincaid Engineering, Savage Road, Milford, NH 03055 120 REM VERSION 1.0 FEBURARY 1988 130 CLS 140 PRINT"***************************************************************" 150 PRINT" THIS PROGRAM GENERATES THE CONTROL DECK FOR SPICE OUTPUTS " 160 PRINT" APPEND THE NETLIST FILE TO THIS ONE":PRINT 170 PRINT" Written by: Russ Kincaid, Milford, NH 03055":PRINT:PRINT 180 PRINT" This is shareware, see the file README.DOC" 190 PRINT"***************************************************************" 200 PRINT:PRINT 210 INPUT"WHAT TITLE FOR THIS ANALYSIS ";T$ 220 INPUT"WHAT WILL YOU NAME THE OUTPUT FILE ";NME$ 230 POO$=NME$+".DEK" :NS=1 240 OPEN POO$ FOR OUTPUT AS #1 250 PRINT#1,"* "+T$ 260 PRINT"WHAT TYPE OF DRIVING SOURCE :" 270 PRINT TAB(10);"1 = SOURCE ALREADY CONNECTED" 280 PRINT TAB(10);"2 = DC" 290 PRINT TAB(10);"3 = AC (frequency sweep)" 300 PRINT TAB(10);"4 = SINE (transient analysis)" 310 PRINT TAB(10);"5 = PULSE (transient analysis)" 320 PRINT TAB(10);"6 = SINGLE FREQUENCY FM" 330 PRINT TAB(10);"7 = PROGRAM A LINEAR SEGMENT WAVEFORM" 340 INPUT"SELECT NUMBER :";S : IF S=1 THEN 750 350 IF C=1 THEN 400 360 INPUT"NAME OF SOURCE (MUST START WITH V OR I) :";NAM$ 370 C=1 380 INPUT"FROM POSITIVE NODE :";N1$ : INPUT"TO NEGATIVE NODE :";N2$ 390 PRINT#1,NAM$;" ";N1$;" ";N2$;" "; 400 ON S GOTO 750,410,430,490,560,490,700 410 INPUT"NOMINAL VOLTAGE = ";V$ 420 PRINT#1,"DC ";V$;" ";: GOTO 750 430 PRINT : AC=1:INPUT"IS ONE VOLT OK ";Y$ :IF Y$="Y" THEN PRINT#1,"AC 1 "; 440 INPUT"IS ZERO PHASE OK ";X$:IF X$="Y" THEN PRINT#1,""; 450 IF LEFT$(Y$,1)="N" THEN INPUT"VOLTS = ";V$ 460 IF LEFT$(X$,1)="N" THEN INPUT"PHASE (DEG) = ";P0$ 470 IF LEFT$(Y$,1)="N" AND LEFT$(X$,1)="N" THEN PRINT#1,"AC ";V$;" ";P0$;" "; 480 GOTO 750 490 INPUT"PEAK VOLTS = ";V$ : INPUT"FREQUENCY = ";F$ : INPUT"DC OFFSET = ";VO$ 500 IF S=6 THEN 540 510 INPUT"TIME DELAY (sec) = ";TD$ 520 INPUT"DAMPING FACTOR (ZERO IF NONE) = ";THETA$ 530 PRINT#1,"SIN(";VO$;" ";V$;" ";F$;" ";TD$;" ";THETA;") "; : GOTO 750 540 INPUT"MODULATION INDEX = ";MDI$ : INPUT"MODULATION FREQUENCY = ";FS$ 550 PRINT#1," SFFM(";VO$;" ";V$;" ";F$;" ";MDI$;" ";FS$;")";:GOTO 750 560 INPUT"AMPLITUDE AT T=0 :";VO$ : INPUT"PEAK AMPLITUDE = ";V1$ 570 INPUT"LINEAR (1) OR EXPONENTIAL (2) RISE AND FALL SHAPE ";J 580 INPUT"DELAY TIME = ";TD$ 590 ON J GOTO 600,640 600 TYP$="PULSE" 610 INPUT"RISE TIME = ";TR$ : INPUT"FALL TIME = ";TF$ 620 INPUT"PULSE WIDTH AT TOP = ";PW$ : INPUT"NEXT PULSE (PERIOD) = ";PER$ 630 GOTO 680 640 TYP$="EXP" 650 INPUT"RISE TIME CONSTANT = ";TR$ : INPUT"FALL TIME CONSTANT = ";TF$ 660 INPUT"DELAY TIME TO START OF FALL = ";PW$ 670 PER$ = "" 680 PRINT#1,TYP$;"(";VO$;" ";V1$;" ";TD$;" ";TR$;" ";TF$;" ";PW$;" ";PER$;") "; 690 GOTO 750 700 INPUT"HOW MANY SEGMENTS TO THE PROGRAMMED VOLTAGE ";N 710 INPUT"TIME ZERO VOLTS = ";V0$ : PRINT#1,"PWL(0 ";V0$;" "; 720 FOR Q=1 TO N : INPUT"TIME = ";T$ : INPUT"VOLTS = ";V$ : PRINT 730 PRINT#1,T$;" ";V$;" ";: NEXT Q : PRINT#1,")" 740 REM END SOURCE DESCRIPTION 750 INPUT"MORE ";Y$: IF LEFT$(Y$,1)="Y" THEN 260 760 PRINT#1,"" 770 PRINT : PRINT"WHAT TYPE OF ANALYSIS DO YOU WANT?" : PRINT 780 PRINT TAB(10);"1 = STATIC DC" 790 PRINT TAB(10);"2 = DC SWEEP (TRANSFER CHARACTERISTIC)" 800 PRINT TAB(10);"3 = FREQUENCY SWEEP" 810 PRINT TAB(10);"4 = TRANSIENT AND INITIAL DC" 820 PRINT TAB(10);"5 = TRANSIENT WITH FOURIER COMPONENTS" 830 PRINT TAB(10);"6 = SENSITIVITY ANALYSIS" 840 PRINT TAB(10);"7 = DISTORTION ANALYSIS" 850 PRINT TAB(10);"8 = NOISE ANALYSIS" 860 PRINT TAB(10);"9 = TRANSFER FUNCTION ANALYSIS" 870 PRINT TAB(10);"10 = QUIT" 880 PRINT : INPUT"WHICH ONE ";A 890 ON A GOTO 900,900,1130,1290,1290,1650,1740,1810,1940,2030 900 INPUT"DO YOU WANT TO ADD DC SOURCES ";Y$ 910 IF LEFT$(Y$,1)="N" AND A=1 THEN 1010 920 IF LEFT$(Y$,1)="N" AND A=2 THEN 1020 930 INPUT"HOW MANY DC SOURCES :";NS 940 FOR Q=1 TO NS 950 INPUT"VOLTS = ";V$ : INPUT"POS NODE = ";PP 960 INPUT "NEG NODE = ";NP 970 INPUT"SOURCE NAME (MUST START WITH V OR I) = ";NAM$(Q) 980 PRINT#1,NAM$(Q);" ";PP;" ";N;" ";" DC ";V$ 990 PRINT 1000 NEXT Q : IF A=2 THEN 1020 1010 PRINT#1,".OP" : GOTO 2020 1020 PRINT#1,".DC "; 1030 PRINT"SWEEP INFO :":PRINT 1040 INPUT"WHAT IS THE NAME OF THE SOURCE ";NAM$ 1050 INPUT"WHAT IS THE SWEEP START VOLTAGE ";V0$ 1060 INPUT"WHAT IS THE VOLTAGE STEP INCREMENT ";V1$ 1070 INPUT"WHAT IS THE END VOLTAGE ";V2$ 1080 PRINT#1,NAM$;" ";V0$;" ";V2$;" ";V1$;" "; 1090 INPUT"ANOTHER SWEPT SOURCE ";Y$ 1100 IF Y$="Y" THEN 1040 1110 PRINT#1,"" 1120 GOSUB 2050: GOTO 2020 1130 PRINT"WILL YOU USE LINEAR OR LOGRITHMIC SWEEP? " 1140 PRINT TAB(10);"1 = LINEAR" 1150 PRINT TAB(10);"2 = LOG DECADE" 1160 PRINT TAB(10);"3 = LOG OCTAVE" 1170 INPUT"WHICH ONE ";J : ON J GOTO 1180,1190,1200 1180 TYP$="LIN":GOTO 1220 1190 TYP$="DEC":GOTO 1210 1200 TYP$="OCT" 1210 PRINT"HOW MANY POINTS PER ";TYP$;:INPUT NP: GOTO 1230 1220 INPUT"HOW MANY LINEAR DATA POINTS ";NP 1230 INPUT"START FREQUENCY = ";F1 : INPUT"STOP FREQUENCY = ";F2 1240 IF F1 START":GOTO 1230 1250 PRINT#1,".AC ";TYP$;" ";NP;" ";F1;" ";F2:K=K+1:A$(K)=" AC " 1260 IF A=6 THEN 1660 1270 IF A=8 THEN 1820 1280 GOSUB 2050:GOTO 2020 1290 INPUT"WHAT IS THE MINUMUM TIMESTEP FOR OUTPUT ";TSTEP$ 1300 INPUT"WHAT IS THE END TIME FOR OUTPUT ";TSTOP$ 1310 INPUT"WILL YOU DELAY OUTPUT PRINTING TO A TIME TX ";Y$ 1320 IF Y$="Y" OR Y$="YES" THEN 1450 1330 PRINT"DO YOU NEED INTERVALS SMALLER THAN ";TSTEP$; 1340 INPUT Y$ : IF Y$="Y" OR Y$="YES" THEN 1440 1350 INPUT"DO YOU WANT TO SPECIFY SOME INITIAL CONDITIONS ";Y$ 1360 IF Y$="N" OR Y$="NO" THEN 1400 1370 PRINT#1,".IC "; : INPUT"HOW MANY NODES (INCLUDE SOURCES ) ";N 1380 FOR J=1 TO N : INPUT"NODE NUMBER = ";NM$ : INPUT"VALUE = ";VL$ 1390 PRINT#1," V("+NM$+") ";VL$; : NEXT J : PRINT#1,"": PRINT 1400 INPUT"DO YOU WANT TO START FROM INITIAL CONDITIONS (1) OR QUIESCENT (2) ";J 1410 ON J GOTO 1420 ,1430 1420 UIC$="UIC" : GOTO 1470 1430 UIC$="" : GOTO 1470 1440 INPUT"HOW SMALL ";TMAX : TMAX$=STR$(TMAX) : GOTO 1350 1450 INPUT"WHEN ";TS$ 1460 GOTO 1330 1470 IF A<>5 THEN 1620 1480 INPUT"WHAT IS THE FUNDAMENTAL FOURIER FREQUENCY ";F : F$=STR$(F) 1490 IF 1/F/1001 THEN 1130 1660 INPUT"HOW MANY NODES AND BRANCHES DO YOU WANT SENSITIVITY ON ";N 1670 PRINT#1,".SENS "; 1680 FOR J=1 TO N 1690 INPUT"NODE (V) OR BRANCH (I) ";NB$ 1700 INPUT"NODE NUMBER OR VOLTAGE SOURCE NAME = ";NM$ 1710 IF NB$="I" AND MID$(NM$,1,1)<>"V" THEN PRINT"MUST START WITH 'V'":GOTO 1690 1720 IF NB$="V" AND ASC(NM$)>57 THEN PRINT"ERROR, ILLEGAL NODE":GOTO 1690 1730 PRINT#1,NB$+"("+NM$+") "; :NEXT J:PRINT#1,"": GOTO 2020 1740 PRINT#1,".DISTO "; :K=K+1: A$(K)=" DISTO " 1750 INPUT"NAME OF LOAD RESISTOR = ";NM$ 1760 IF ASC(NM$)<>82 THEN PRINT"ERROR, NOT A VALID NAME":GOTO 1750 1770 INPUT"INTERVAL FOR SUMMARY PRINTOUT(ZERO = NONE) ";IN$ 1780 INPUT"RATIO F2/F1 = ";R$ : INPUT"AMPLITUDE OF F2 = ";AF$ 1790 INPUT"REFERENCE POWER LEVEL (WATTS)--(1mW=0dBm) = ";REF$ 1800 PRINT#1,NM$;" ";IN$;" ";R$;" ";REF$;" ";AF$:GOSUB 2340:GOTO 2020 1810 IF AC<>1 THEN 1130 1820 PRINT#1,".NOISE "; : K=K+1:A$(K)=" NOISE " 1830 INPUT"NOISE OUTPUT NODE NUMBER ";NM$ 1840 INPUT"INPUT NODE FOR EQUIVALENT NOISE ";NE$ 1850 INPUT"FREQUENCY INTERVAL FOR SUMMARY PRINTOUT (ZERO=NONE) ";IN$ 1860 PRINT#1,NM$;" ";NE$;" ";IN$ 1870 INPUT"DO YOU WANT TABULAR (T) OR PLOTTED (P) OUTPUT ";Y$ 1880 IF Y$="T" THEN 1900 1890 PRINT#1,".PLOT NOISE ";:GOTO 1910 1900 PRINT#1,".PRINT NOISE "; 1910 INPUT"DO YOU WANT OUTPUT IN DB (1) OR VOLTS (2) ";P:ON P GOTO 1920,1930 1920 PRINT#1,"INOISE(DB) ONOISE(DB)":GOTO 2020 1930 PRINT#1,"INOISE(M) ONOISE(M)":GOTO 2020 1940 PRINT#1,".TF"; 1950 INPUT"NAME OF DRIVING SOURCE ";V$ 1960 INPUT"IS THE OUTPUT A CURRENT (I) OR VOLTAGE (V) ";Y$ 1970 IF Y$="I" THEN 2000 1980 PRINT "OUTPUT BETWEEN NODES:";:INPUT"FROM NODE =";N1$:INPUT"TO NODE =";N2$ 1990 PRINT#1," V(";N1$;",";N2$;") ";V$:GOTO 2020 2000 INPUT"NAME OF CURRENT METER = ";IM$ 2010 PRINT#1," I(";IM$;") ";V$ 2020 INPUT"MORE ANALYSIS ";Y$:IF Y$="Y" OR Y$="YES" THEN 770 2030 CLOSE#1 : GOTO 2660 2040 REM PLOT ROUTINES 2050 INPUT"DO YOU WANT TABULAR (T) OR PLOTTED (P) OUTPUT ";Y$ 2060 IF Y$="T" THEN 2080 2070 PRINT#1,".PLOT ";A$(K); : GOTO 2090 2080 PRINT#1,".PRINT ";A$(K); 2090 INPUT"HOW MANY NODE VOLTAGES WILL YOU CHOOSE ";NV 2100 FOR Q=1 TO NV:INPUT"NODE NUMBER = ";NN$ 2110 IF A=2 THEN 2190 2120 PRINT"DO YOU WANT: 1. REAL : IMAGINARY PARTS" 2130 PRINT TAB(14);"2. MAGNITUDE AND PHASE" 2140 PRINT TAB(14);"3. dB AND PHASE" 2150 INPUT P : IF P=1 THEN V1$="VR" : V2$="VI" 2160 IF P=2 THEN V1$="VM":V2$="VP" 2170 IF P=3 THEN V1$="VDB":V2$="VP" 2180 PRINT#1,V1$;"(";NN$;") ";V2$;"(";NN$;") "; : GOTO 2200 2190 PRINT#1,"V(";NN$;") "; 2200 NEXT Q 2210 INPUT"HOW MANY BRANCH CURRENTS WILL YOU CHOOSE ";NI 2220 FOR Q=1 TO NI:INPUT"NAME OF VOLTAGE SOURCE OR CURRENT METER ";NI$ 2230 IF A=2 THEN 2310 2240 PRINT"DO YOU WANT: 1. REAL : IMAGINARY PARTS" 2250 PRINT TAB(14);"2. MAGNITUDE AND PHASE" 2260 PRINT TAB(14);"3. dB AND PHASE" 2270 INPUT P : IF P=1 THEN I1$="IR":I2$="II" 2280 IF P=2 THEN I1$="IM":I2$="IP" 2290 IF P=3 THEN I1$="IDB":I2$="IP" 2300 PRINT#1,I1$;"(";NI$;") ";I2$;"(";NI$;") "; 2310 PRINT#1,"I(";NI$;") "; 2320 NEXT Q:PRINT#1,"" 2330 RETURN 2340 REM DISTO 2350 INPUT"DO YOU WANT TABULAR (T) OR PLOTTED (P) OUTPUT ";Y$:IF Y$="T" THEN 2370 2360 PRINT#1,".PLOT DISTO ";:GOTO 2380 2370 PRINT#1,".PRINT DISTO "; 2380 PRINT"DO YOU WANT: 1. REAL : IMAGINARY PARTS" 2390 PRINT TAB(14);"2. MAGNITUDE AND PHASE" 2400 PRINT TAB(14);"3. dB AND PHASE" : INPUT P 2410 IF P=1 THEN V1$="(R) ":V2$="(I) " 2420 IF P=2 THEN V1$="(M) ":V2$="(P) " 2430 IF P=3 THEN V1$="(DB) ":V2$="(P) " 2440 PRINT TAB(10);" 2ND HARMONIC = 2" 2450 PRINT TAB(10);" 3RD HARMONIC = 3" 2460 PRINT TAB(10);" BOTH + SUM & DIFF = 4" 2470 INPUT" WHICH ";P 2480 ON P GOTO 2490,2500,2510 2490 PRINT#1,"HD2";V1$;"HD2";V2$:RETURN 2500 PRINT#1,"HD3";V1$;"HD3";V2$:RETURN 2510 PRINT#1,"HD2";V1$;"HD2";V2$;"HD3";V1$;"HD3";V2$;"SIM2";V1$;"SIM2";V2$; 2520 PRINT#1,"DIM2";V1$;"DIM2";V2$;"DIM3";V1$;"DIM3";V2$:RETURN 2530 REM TRAN 2540 INPUT"DO YOU WANT TABULAR T OR PLOTTED P OUTPUT ";Y$:IF Y$="T" THEN 2560 2550 PRINT#1,".PLOT TRAN ";:GOTO 2570 2560 PRINT#1,".PRINT TRAN "; 2570 INPUT"PLOT NODE (V) OR BRANCH (I) ";NB$ 2580 IF NB$="V" OR NB$="I" THEN 2600 2590 PRINT"MUST BE 'V' OR 'I'":GOTO 2570 2600 INPUT"NODE NUMBER OR VOLTAGE SOURCE (CURRENT METER) NAME = ";NM$ 2610 IF NB$="I" AND LEFT$(NM$,1)<>"V" THEN PRINT"MUST START WITH 'V'":GOTO 2600 2620 IF NB$="V" AND ASC(NM$)>57 THEN PRINT"ERROR, ILLEGAL NODE":GOTO 2600 2630 PRINT#1,NB$+"("+NM$+") "; 2640 INPUT"MORE NODES ";Y$:IF Y$="Y" OR Y$="YES" THEN 2570 2650 PRINT#1,"":RETURN 2660 END