1 /**********
2 Copyright 1990 Regents of the University of California.  All rights reserved.
3 Author: 1985 Thomas L. Quarles
4 **********/
5 /*
6  */
7 
8 /*
9  * This routine sets model parameters for
10  * BJTs in the circuit.
11  */
12 
13 #include "ngspice/ngspice.h"
14 #include "ngspice/const.h"
15 #include "ngspice/ifsim.h"
16 #include "bjtdefs.h"
17 #include "ngspice/sperror.h"
18 #include "ngspice/suffix.h"
19 
20 
21 int
BJTmParam(int param,IFvalue * value,GENmodel * inModel)22 BJTmParam(int param, IFvalue *value, GENmodel *inModel)
23 {
24     BJTmodel *mods = (BJTmodel*)inModel;
25 
26     switch(param) {
27         case BJT_MOD_NPN:
28             if(value->iValue) {
29                 mods->BJTtype = NPN;
30             }
31             break;
32         case BJT_MOD_PNP:
33             if(value->iValue) {
34                 mods->BJTtype = PNP;
35             }
36             break;
37         case BJT_MOD_SUBS:
38             mods->BJTsubs = value->iValue;
39             mods->BJTsubsGiven = TRUE;
40             break;
41         case BJT_MOD_TNOM:
42             mods->BJTtnom = value->rValue+CONSTCtoK;
43             mods->BJTtnomGiven = TRUE;
44             break;
45         case BJT_MOD_IS:
46             mods->BJTsatCur = value->rValue;
47             mods->BJTsatCurGiven = TRUE;
48             break;
49         case BJT_MOD_BF:
50             mods->BJTbetaF = value->rValue;
51             mods->BJTbetaFGiven = TRUE;
52             break;
53         case BJT_MOD_NF:
54             mods->BJTemissionCoeffF = value->rValue;
55             mods->BJTemissionCoeffFGiven = TRUE;
56             break;
57         case BJT_MOD_VAF:
58             mods->BJTearlyVoltF = value->rValue;
59             mods->BJTearlyVoltFGiven = TRUE;
60             break;
61         case BJT_MOD_IKF:
62             mods->BJTrollOffF = value->rValue;
63             mods->BJTrollOffFGiven = TRUE;
64             break;
65         case BJT_MOD_ISE:
66             mods->BJTleakBEcurrent = value->rValue;
67             mods->BJTleakBEcurrentGiven = TRUE;
68             break;
69         case BJT_MOD_C2:
70             mods->BJTc2 = value->rValue;
71             mods->BJTc2Given=TRUE;
72             break;
73         case BJT_MOD_NE:
74             mods->BJTleakBEemissionCoeff = value->rValue;
75             mods->BJTleakBEemissionCoeffGiven = TRUE;
76             break;
77         case BJT_MOD_BR:
78             mods->BJTbetaR = value->rValue;
79             mods->BJTbetaRGiven = TRUE;
80             break;
81         case BJT_MOD_NR:
82             mods->BJTemissionCoeffR = value->rValue;
83             mods->BJTemissionCoeffRGiven = TRUE;
84             break;
85         case BJT_MOD_VAR:
86             mods->BJTearlyVoltR = value->rValue;
87             mods->BJTearlyVoltRGiven = TRUE;
88             break;
89         case BJT_MOD_IKR:
90             mods->BJTrollOffR = value->rValue;
91             mods->BJTrollOffRGiven = TRUE;
92             break;
93         case BJT_MOD_ISC:
94             mods->BJTleakBCcurrent = value->rValue;
95             mods->BJTleakBCcurrentGiven = TRUE;
96             break;
97         case BJT_MOD_C4:
98             mods->BJTc4 = value->rValue;
99             mods->BJTc4Given=TRUE;
100             break;
101         case BJT_MOD_NC:
102             mods->BJTleakBCemissionCoeff = value->rValue;
103             mods->BJTleakBCemissionCoeffGiven = TRUE;
104             break;
105         case BJT_MOD_RB:
106             mods->BJTbaseResist = value->rValue;
107             mods->BJTbaseResistGiven = TRUE;
108             break;
109         case BJT_MOD_IRB:
110             mods->BJTbaseCurrentHalfResist = value->rValue;
111             mods->BJTbaseCurrentHalfResistGiven = TRUE;
112             break;
113         case BJT_MOD_RBM:
114             mods->BJTminBaseResist = value->rValue;
115             mods->BJTminBaseResistGiven = TRUE;
116             break;
117         case BJT_MOD_RE:
118             mods->BJTemitterResist = value->rValue;
119             mods->BJTemitterResistGiven = TRUE;
120             break;
121         case BJT_MOD_RC:
122             mods->BJTcollectorResist = value->rValue;
123             mods->BJTcollectorResistGiven = TRUE;
124             break;
125         case BJT_MOD_CJE:
126             mods->BJTdepletionCapBE = value->rValue;
127             mods->BJTdepletionCapBEGiven = TRUE;
128             break;
129         case BJT_MOD_VJE:
130             mods->BJTpotentialBE = value->rValue;
131             mods->BJTpotentialBEGiven = TRUE;
132             break;
133         case BJT_MOD_MJE:
134             mods->BJTjunctionExpBE = value->rValue;
135             mods->BJTjunctionExpBEGiven = TRUE;
136             break;
137         case BJT_MOD_TF:
138             mods->BJTtransitTimeF = value->rValue;
139             mods->BJTtransitTimeFGiven = TRUE;
140             break;
141         case BJT_MOD_XTF:
142             mods->BJTtransitTimeBiasCoeffF = value->rValue;
143             mods->BJTtransitTimeBiasCoeffFGiven = TRUE;
144             break;
145         case BJT_MOD_VTF:
146             mods->BJTtransitTimeFVBC = value->rValue;
147             mods->BJTtransitTimeFVBCGiven = TRUE;
148             break;
149         case BJT_MOD_ITF:
150             mods->BJTtransitTimeHighCurrentF = value->rValue;
151             mods->BJTtransitTimeHighCurrentFGiven = TRUE;
152             break;
153         case BJT_MOD_PTF:
154             mods->BJTexcessPhase = value->rValue;
155             mods->BJTexcessPhaseGiven = TRUE;
156             break;
157         case BJT_MOD_CJC:
158             mods->BJTdepletionCapBC = value->rValue;
159             mods->BJTdepletionCapBCGiven = TRUE;
160             break;
161         case BJT_MOD_VJC:
162             mods->BJTpotentialBC = value->rValue;
163             mods->BJTpotentialBCGiven = TRUE;
164             break;
165         case BJT_MOD_MJC:
166             mods->BJTjunctionExpBC = value->rValue;
167             mods->BJTjunctionExpBCGiven = TRUE;
168             break;
169         case BJT_MOD_XCJC:
170             mods->BJTbaseFractionBCcap = value->rValue;
171             mods->BJTbaseFractionBCcapGiven = TRUE;
172             break;
173         case BJT_MOD_TR:
174             mods->BJTtransitTimeR = value->rValue;
175             mods->BJTtransitTimeRGiven = TRUE;
176             break;
177         case BJT_MOD_CJS:
178             mods->BJTcapSub = value->rValue;
179             mods->BJTcapSubGiven = TRUE;
180             break;
181         case BJT_MOD_VJS:
182             mods->BJTpotentialSubstrate = value->rValue;
183             mods->BJTpotentialSubstrateGiven = TRUE;
184             break;
185         case BJT_MOD_MJS:
186             mods->BJTexponentialSubstrate = value->rValue;
187             mods->BJTexponentialSubstrateGiven = TRUE;
188             break;
189         case BJT_MOD_XTB:
190             mods->BJTbetaExp = value->rValue;
191             mods->BJTbetaExpGiven = TRUE;
192             break;
193         case BJT_MOD_EG:
194             mods->BJTenergyGap = value->rValue;
195             mods->BJTenergyGapGiven = TRUE;
196             break;
197         case BJT_MOD_XTI:
198             mods->BJTtempExpIS = value->rValue;
199             mods->BJTtempExpISGiven = TRUE;
200             break;
201         case BJT_MOD_FC:
202             mods->BJTdepletionCapCoeff = value->rValue;
203             mods->BJTdepletionCapCoeffGiven = TRUE;
204             break;
205         case BJT_MOD_KF:
206             mods->BJTfNcoef = value->rValue;
207             mods->BJTfNcoefGiven = TRUE;
208             break;
209         case BJT_MOD_AF:
210             mods->BJTfNexp = value->rValue;
211             mods->BJTfNexpGiven = TRUE;
212             break;
213         case BJT_MOD_ISS:
214             mods->BJTsubSatCur = value->rValue;
215             mods->BJTsubSatCurGiven = TRUE;
216             break;
217         case BJT_MOD_NS:
218             mods->BJTemissionCoeffS = value->rValue;
219             mods->BJTemissionCoeffSGiven = TRUE;
220             break;
221         case BJT_MOD_RCO:
222             mods->BJTintCollResist = value->rValue;
223             mods->BJTintCollResistGiven = TRUE;
224             break;
225         case BJT_MOD_VO:
226             mods->BJTepiSatVoltage = value->rValue;
227             mods->BJTepiSatVoltageGiven = TRUE;
228             break;
229         case BJT_MOD_GAMMA:
230             mods->BJTepiDoping = value->rValue;
231             mods->BJTepiDopingGiven = TRUE;
232             break;
233         case BJT_MOD_QCO:
234             mods->BJTepiCharge = value->rValue;
235             mods->BJTepiChargeGiven = TRUE;
236             break;
237         case BJT_MOD_TLEV:
238             mods->BJTtlev = value->iValue;
239             mods->BJTtlevGiven = TRUE;
240             break;
241         case BJT_MOD_TLEVC:
242             mods->BJTtlevc = value->iValue;
243             mods->BJTtlevcGiven = TRUE;
244             break;
245         case BJT_MOD_TBF1:
246             mods->BJTtbf1 = value->rValue;
247             mods->BJTtbf1Given = TRUE;
248             break;
249         case BJT_MOD_TBF2:
250             mods->BJTtbf2 = value->rValue;
251             mods->BJTtbf2Given = TRUE;
252             break;
253         case BJT_MOD_TBR1:
254             mods->BJTtbr1 = value->rValue;
255             mods->BJTtbr1Given = TRUE;
256             break;
257         case BJT_MOD_TBR2:
258             mods->BJTtbr2 = value->rValue;
259             mods->BJTtbr2Given = TRUE;
260             break;
261         case BJT_MOD_TIKF1:
262             mods->BJTtikf1 = value->rValue;
263             mods->BJTtikf1Given = TRUE;
264             break;
265         case BJT_MOD_TIKF2:
266             mods->BJTtikf2 = value->rValue;
267             mods->BJTtikf2Given = TRUE;
268             break;
269         case BJT_MOD_TIKR1:
270             mods->BJTtikr1 = value->rValue;
271             mods->BJTtikr1Given = TRUE;
272             break;
273         case BJT_MOD_TIKR2:
274             mods->BJTtikr2 = value->rValue;
275             mods->BJTtikr2Given = TRUE;
276             break;
277         case BJT_MOD_TIRB1:
278             mods->BJTtirb1 = value->rValue;
279             mods->BJTtirb1Given = TRUE;
280             break;
281         case BJT_MOD_TIRB2:
282             mods->BJTtirb2 = value->rValue;
283             mods->BJTtirb2Given = TRUE;
284             break;
285         case BJT_MOD_TNC1:
286             mods->BJTtnc1 = value->rValue;
287             mods->BJTtnc1Given = TRUE;
288             break;
289         case BJT_MOD_TNC2:
290             mods->BJTtnc2 = value->rValue;
291             mods->BJTtnc2Given = TRUE;
292             break;
293         case BJT_MOD_TNE1:
294             mods->BJTtne1 = value->rValue;
295             mods->BJTtne1Given = TRUE;
296             break;
297         case BJT_MOD_TNE2:
298             mods->BJTtne2 = value->rValue;
299             mods->BJTtne2Given = TRUE;
300             break;
301         case BJT_MOD_TNF1:
302             mods->BJTtnf1 = value->rValue;
303             mods->BJTtnf1Given = TRUE;
304             break;
305         case BJT_MOD_TNF2:
306             mods->BJTtnf2 = value->rValue;
307             mods->BJTtnf2Given = TRUE;
308             break;
309         case BJT_MOD_TNR1:
310             mods->BJTtnr1 = value->rValue;
311             mods->BJTtnr1Given = TRUE;
312             break;
313         case BJT_MOD_TNR2:
314             mods->BJTtnr2 = value->rValue;
315             mods->BJTtnr2Given = TRUE;
316             break;
317         case BJT_MOD_TRB1:
318             mods->BJTtrb1 = value->rValue;
319             mods->BJTtrb1Given = TRUE;
320             break;
321         case BJT_MOD_TRB2:
322             mods->BJTtrb2 = value->rValue;
323             mods->BJTtrb2Given = TRUE;
324             break;
325         case BJT_MOD_TRC1:
326             mods->BJTtrc1 = value->rValue;
327             mods->BJTtrc1Given = TRUE;
328             break;
329         case BJT_MOD_TRC2:
330             mods->BJTtrc2 = value->rValue;
331             mods->BJTtrc2Given = TRUE;
332             break;
333         case BJT_MOD_TRE1:
334             mods->BJTtre1 = value->rValue;
335             mods->BJTtre1Given = TRUE;
336             break;
337         case BJT_MOD_TRE2:
338             mods->BJTtre2 = value->rValue;
339             mods->BJTtre2Given = TRUE;
340             break;
341         case BJT_MOD_TRM1:
342             mods->BJTtrm1 = value->rValue;
343             mods->BJTtrm1Given = TRUE;
344             break;
345         case BJT_MOD_TRM2:
346             mods->BJTtrm2 = value->rValue;
347             mods->BJTtrm2Given = TRUE;
348             break;
349         case BJT_MOD_TVAF1:
350             mods->BJTtvaf1 = value->rValue;
351             mods->BJTtvaf1Given = TRUE;
352             break;
353         case BJT_MOD_TVAF2:
354             mods->BJTtvaf2 = value->rValue;
355             mods->BJTtvaf2Given = TRUE;
356             break;
357         case BJT_MOD_TVAR1:
358             mods->BJTtvar1 = value->rValue;
359             mods->BJTtvar1Given = TRUE;
360             break;
361         case BJT_MOD_TVAR2:
362             mods->BJTtvar2 = value->rValue;
363             mods->BJTtvar2Given = TRUE;
364             break;
365         case BJT_MOD_CTC:
366             mods->BJTctc = value->rValue;
367             mods->BJTctcGiven = TRUE;
368             break;
369         case BJT_MOD_CTE:
370             mods->BJTcte = value->rValue;
371             mods->BJTcteGiven = TRUE;
372             break;
373         case BJT_MOD_CTS:
374             mods->BJTcts = value->rValue;
375             mods->BJTctsGiven = TRUE;
376             break;
377         case BJT_MOD_TVJE:
378             mods->BJTtvje = value->rValue;
379             mods->BJTtvjeGiven = TRUE;
380             break;
381         case BJT_MOD_TVJC:
382             mods->BJTtvjc = value->rValue;
383             mods->BJTtvjcGiven = TRUE;
384             break;
385         case BJT_MOD_TVJS:
386             mods->BJTtvjs = value->rValue;
387             mods->BJTtvjsGiven = TRUE;
388             break;
389         case BJT_MOD_TITF1:
390             mods->BJTtitf1 = value->rValue;
391             mods->BJTtitf1Given = TRUE;
392             break;
393         case BJT_MOD_TITF2:
394             mods->BJTtitf2 = value->rValue;
395             mods->BJTtitf2Given = TRUE;
396             break;
397         case BJT_MOD_TTF1:
398             mods->BJTttf1 = value->rValue;
399             mods->BJTttf1Given = TRUE;
400             break;
401         case BJT_MOD_TTF2:
402             mods->BJTttf2 = value->rValue;
403             mods->BJTttf2Given = TRUE;
404             break;
405         case BJT_MOD_TTR1:
406             mods->BJTttr1 = value->rValue;
407             mods->BJTttr1Given = TRUE;
408             break;
409         case BJT_MOD_TTR2:
410             mods->BJTttr2 = value->rValue;
411             mods->BJTttr2Given = TRUE;
412             break;
413         case BJT_MOD_TMJE1:
414             mods->BJTtmje1 = value->rValue;
415             mods->BJTtmje1Given = TRUE;
416             break;
417         case BJT_MOD_TMJE2:
418             mods->BJTtmje2 = value->rValue;
419             mods->BJTtmje2Given = TRUE;
420             break;
421         case BJT_MOD_TMJC1:
422             mods->BJTtmjc1 = value->rValue;
423             mods->BJTtmjc1Given = TRUE;
424             break;
425         case BJT_MOD_TMJC2:
426             mods->BJTtmjc2 = value->rValue;
427             mods->BJTtmjc2Given = TRUE;
428             break;
429         case BJT_MOD_TMJS1:
430             mods->BJTtmjs1 = value->rValue;
431             mods->BJTtmjs1Given = TRUE;
432             break;
433         case BJT_MOD_TMJS2:
434             mods->BJTtmjs2 = value->rValue;
435             mods->BJTtmjs2Given = TRUE;
436             break;
437         case BJT_MOD_TNS1:
438             mods->BJTtns1 = value->rValue;
439             mods->BJTtns1Given = TRUE;
440             break;
441         case BJT_MOD_TNS2:
442             mods->BJTtns2 = value->rValue;
443             mods->BJTtns2Given = TRUE;
444             break;
445         case BJT_MOD_NKF:
446             mods->BJTnkf = value->rValue;
447             mods->BJTnkfGiven = TRUE;
448             break;
449         case BJT_MOD_TIS1:
450             mods->BJTtis1 = value->rValue;
451             mods->BJTtis1Given = TRUE;
452             break;
453         case BJT_MOD_TIS2:
454             mods->BJTtis2 = value->rValue;
455             mods->BJTtis2Given = TRUE;
456             break;
457         case BJT_MOD_TISE1:
458             mods->BJTtise1 = value->rValue;
459             mods->BJTtise1Given = TRUE;
460             break;
461         case BJT_MOD_TISE2:
462             mods->BJTtise2 = value->rValue;
463             mods->BJTtise2Given = TRUE;
464             break;
465         case BJT_MOD_TISC1:
466             mods->BJTtisc1 = value->rValue;
467             mods->BJTtisc1Given = TRUE;
468             break;
469         case BJT_MOD_TISC2:
470             mods->BJTtisc2 = value->rValue;
471             mods->BJTtisc2Given = TRUE;
472             break;
473         case BJT_MOD_TISS1:
474             mods->BJTtiss1 = value->rValue;
475             mods->BJTtiss1Given = TRUE;
476             break;
477         case BJT_MOD_TISS2:
478             mods->BJTtiss2 = value->rValue;
479             mods->BJTtiss2Given = TRUE;
480             break;
481         case BJT_MOD_QUASIMOD:
482             mods->BJTquasimod = value->iValue;
483             mods->BJTquasimodGiven = TRUE;
484             break;
485         case BJT_MOD_EGQS:
486             mods->BJTenergyGapQS = value->rValue;
487             mods->BJTenergyGapQSGiven = TRUE;
488             break;
489         case BJT_MOD_XRCI:
490             mods->BJTtempExpRCI = value->rValue;
491             mods->BJTtempExpRCIGiven = TRUE;
492             break;
493         case BJT_MOD_XD:
494             mods->BJTtempExpVO = value->rValue;
495             mods->BJTtempExpVOGiven = TRUE;
496             break;
497         case BJT_MOD_VBE_MAX:
498             mods->BJTvbeMax = value->rValue;
499             mods->BJTvbeMaxGiven = TRUE;
500             break;
501         case BJT_MOD_VBC_MAX:
502             mods->BJTvbcMax = value->rValue;
503             mods->BJTvbcMaxGiven = TRUE;
504             break;
505         case BJT_MOD_VCE_MAX:
506             mods->BJTvceMax = value->rValue;
507             mods->BJTvceMaxGiven = TRUE;
508             break;
509         default:
510             return(E_BADPARM);
511     }
512     return(OK);
513 }
514