1 /**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/
2 /**** OpenMP support for ngspice by Holger Vogt 06/28/2010 ****/
3 
4 /**********
5  * Copyright 2004 Regents of the University of California. All rights reserved.
6  * File: b3set.c of BSIM3v3.3.0
7  * Author: 1995 Min-Chie Jeng and Mansun Chan.
8  * Author: 1997-1999 Weidong Liu.
9  * Author: 2001  Xuemei Xi
10  **********/
11 
12 #include "ngspice/ngspice.h"
13 #include "ngspice/smpdefs.h"
14 #include "ngspice/cktdefs.h"
15 #include "bsim3def.h"
16 #include "ngspice/const.h"
17 #include "ngspice/sperror.h"
18 #include "ngspice/devdefs.h"
19 #include "ngspice/suffix.h"
20 
21 #define MAX_EXP 5.834617425e14
22 #define MIN_EXP 1.713908431e-15
23 #define EXP_THRESHOLD 34.0
24 #define SMOOTHFACTOR 0.1
25 #define EPSOX 3.453133e-11
26 #define EPSSI 1.03594e-10
27 #define PI 3.141592654
28 #define Charge_q 1.60219e-19
29 #define Meter2Micron 1.0e6
30 
31 int
BSIM3setup(SMPmatrix * matrix,GENmodel * inModel,CKTcircuit * ckt,int * states)32 BSIM3setup(
33 SMPmatrix *matrix,
34 GENmodel *inModel,
35 CKTcircuit *ckt,
36 int *states)
37 {
38 BSIM3model *model = (BSIM3model*)inModel;
39 BSIM3instance *here;
40 int error;
41 CKTnode *tmp;
42 CKTnode *tmpNode;
43 IFuid tmpName;
44 
45 #ifdef USE_OMP
46 int idx, InstCount;
47 BSIM3instance **InstArray;
48 #endif
49 
50 
51     /*  loop through all the BSIM3 device models */
52     for( ; model != NULL; model = BSIM3nextModel(model))
53     {
54 /* Default value Processing for BSIM3 MOSFET Models */
55         if (!model->BSIM3typeGiven)
56             model->BSIM3type = NMOS;
57         if (!model->BSIM3mobModGiven)
58             model->BSIM3mobMod = 1;
59         if (!model->BSIM3binUnitGiven)
60             model->BSIM3binUnit = 1;
61         if (!model->BSIM3paramChkGiven)
62             model->BSIM3paramChk = 0;
63         if (!model->BSIM3capModGiven)
64             model->BSIM3capMod = 3;
65         if (!model->BSIM3acmModGiven)
66             model->BSIM3acmMod = 0;
67         if (!model->BSIM3calcacmGiven)
68             model->BSIM3calcacm = 0;
69         if (!model->BSIM3noiModGiven)
70             model->BSIM3noiMod = 1;
71         if (!model->BSIM3nqsModGiven)
72             model->BSIM3nqsMod = 0;
73         else if ((model->BSIM3nqsMod != 0) && (model->BSIM3nqsMod != 1))
74         {   model->BSIM3nqsMod = 0;
75             printf("Warning: nqsMod has been set to its default value: 0.\n");
76         }
77         if (!model->BSIM3acnqsModGiven)
78             model->BSIM3acnqsMod = 0;
79         else if ((model->BSIM3acnqsMod != 0) && (model->BSIM3acnqsMod != 1))
80         {   model->BSIM3acnqsMod = 0;
81             printf("Warning: acnqsMod has been set to its default value: 0.\n");
82         }
83         if (!model->BSIM3versionGiven)
84             model->BSIM3version = copy("3.3.0");
85         if (!model->BSIM3toxGiven)
86             model->BSIM3tox = 150.0e-10;
87         model->BSIM3cox = 3.453133e-11 / model->BSIM3tox;
88         if (!model->BSIM3toxmGiven)
89             model->BSIM3toxm = model->BSIM3tox;
90 
91         if (!model->BSIM3cdscGiven)
92             model->BSIM3cdsc = 2.4e-4;   /* unit Q/V/m^2  */
93         if (!model->BSIM3cdscbGiven)
94             model->BSIM3cdscb = 0.0;   /* unit Q/V/m^2  */
95         if (!model->BSIM3cdscdGiven)
96             model->BSIM3cdscd = 0.0;   /* unit Q/V/m^2  */
97         if (!model->BSIM3citGiven)
98             model->BSIM3cit = 0.0;   /* unit Q/V/m^2  */
99         if (!model->BSIM3nfactorGiven)
100             model->BSIM3nfactor = 1;
101         if (!model->BSIM3xjGiven)
102             model->BSIM3xj = .15e-6;
103         if (!model->BSIM3vsatGiven)
104             model->BSIM3vsat = 8.0e4;    /* unit m/s */
105         if (!model->BSIM3atGiven)
106             model->BSIM3at = 3.3e4;    /* unit m/s */
107         if (!model->BSIM3a0Given)
108             model->BSIM3a0 = 1.0;
109         if (!model->BSIM3agsGiven)
110             model->BSIM3ags = 0.0;
111         if (!model->BSIM3a1Given)
112             model->BSIM3a1 = 0.0;
113         if (!model->BSIM3a2Given)
114             model->BSIM3a2 = 1.0;
115         if (!model->BSIM3ketaGiven)
116             model->BSIM3keta = -0.047;    /* unit  / V */
117         if (!model->BSIM3nsubGiven)
118             model->BSIM3nsub = 6.0e16;   /* unit 1/cm3 */
119         if (!model->BSIM3npeakGiven)
120             model->BSIM3npeak = 1.7e17;   /* unit 1/cm3 */
121         if (!model->BSIM3ngateGiven)
122             model->BSIM3ngate = 0;   /* unit 1/cm3 */
123         if (!model->BSIM3vbmGiven)
124             model->BSIM3vbm = -3.0;
125         if (!model->BSIM3xtGiven)
126             model->BSIM3xt = 1.55e-7;
127         if (!model->BSIM3kt1Given)
128             model->BSIM3kt1 = -0.11;      /* unit V */
129         if (!model->BSIM3kt1lGiven)
130             model->BSIM3kt1l = 0.0;      /* unit V*m */
131         if (!model->BSIM3kt2Given)
132             model->BSIM3kt2 = 0.022;      /* No unit */
133         if (!model->BSIM3k3Given)
134             model->BSIM3k3 = 80.0;
135         if (!model->BSIM3k3bGiven)
136             model->BSIM3k3b = 0.0;
137         if (!model->BSIM3w0Given)
138             model->BSIM3w0 = 2.5e-6;
139         if (!model->BSIM3nlxGiven)
140             model->BSIM3nlx = 1.74e-7;
141         if (!model->BSIM3dvt0Given)
142             model->BSIM3dvt0 = 2.2;
143         if (!model->BSIM3dvt1Given)
144             model->BSIM3dvt1 = 0.53;
145         if (!model->BSIM3dvt2Given)
146             model->BSIM3dvt2 = -0.032;   /* unit 1 / V */
147 
148         if (!model->BSIM3dvt0wGiven)
149             model->BSIM3dvt0w = 0.0;
150         if (!model->BSIM3dvt1wGiven)
151             model->BSIM3dvt1w = 5.3e6;
152         if (!model->BSIM3dvt2wGiven)
153             model->BSIM3dvt2w = -0.032;
154 
155         if (!model->BSIM3droutGiven)
156             model->BSIM3drout = 0.56;
157         if (!model->BSIM3dsubGiven)
158             model->BSIM3dsub = model->BSIM3drout;
159         if (!model->BSIM3vth0Given)
160             model->BSIM3vth0 = (model->BSIM3type == NMOS) ? 0.7 : -0.7;
161         if (!model->BSIM3uaGiven)
162             model->BSIM3ua = 2.25e-9;      /* unit m/V */
163         if (!model->BSIM3ua1Given)
164             model->BSIM3ua1 = 4.31e-9;      /* unit m/V */
165         if (!model->BSIM3ubGiven)
166             model->BSIM3ub = 5.87e-19;     /* unit (m/V)**2 */
167         if (!model->BSIM3ub1Given)
168             model->BSIM3ub1 = -7.61e-18;     /* unit (m/V)**2 */
169         if (!model->BSIM3ucGiven)
170             model->BSIM3uc = (model->BSIM3mobMod == 3) ? -0.0465 : -0.0465e-9;
171         if (!model->BSIM3uc1Given)
172             model->BSIM3uc1 = (model->BSIM3mobMod == 3) ? -0.056 : -0.056e-9;
173         if (!model->BSIM3u0Given)
174             model->BSIM3u0 = (model->BSIM3type == NMOS) ? 0.067 : 0.025;
175         if (!model->BSIM3uteGiven)
176             model->BSIM3ute = -1.5;
177         if (!model->BSIM3voffGiven)
178             model->BSIM3voff = -0.08;
179         if (!model->BSIM3deltaGiven)
180            model->BSIM3delta = 0.01;
181         if (!model->BSIM3rdswGiven)
182             model->BSIM3rdsw = 0;
183         if (!model->BSIM3prwgGiven)
184             model->BSIM3prwg = 0.0;      /* unit 1/V */
185         if (!model->BSIM3prwbGiven)
186             model->BSIM3prwb = 0.0;
187         if (!model->BSIM3prtGiven)
188             model->BSIM3prt = 0.0;
189         if (!model->BSIM3eta0Given)
190             model->BSIM3eta0 = 0.08;      /* no unit  */
191         if (!model->BSIM3etabGiven)
192             model->BSIM3etab = -0.07;      /* unit  1/V */
193         if (!model->BSIM3pclmGiven)
194             model->BSIM3pclm = 1.3;      /* no unit  */
195         if (!model->BSIM3pdibl1Given)
196             model->BSIM3pdibl1 = .39;    /* no unit  */
197         if (!model->BSIM3pdibl2Given)
198             model->BSIM3pdibl2 = 0.0086;    /* no unit  */
199         if (!model->BSIM3pdiblbGiven)
200             model->BSIM3pdiblb = 0.0;    /* 1/V  */
201         if (!model->BSIM3pscbe1Given)
202             model->BSIM3pscbe1 = 4.24e8;
203         if (!model->BSIM3pscbe2Given)
204             model->BSIM3pscbe2 = 1.0e-5;
205         if (!model->BSIM3pvagGiven)
206             model->BSIM3pvag = 0.0;
207         if (!model->BSIM3wrGiven)
208             model->BSIM3wr = 1.0;
209         if (!model->BSIM3dwgGiven)
210             model->BSIM3dwg = 0.0;
211         if (!model->BSIM3dwbGiven)
212             model->BSIM3dwb = 0.0;
213         if (!model->BSIM3b0Given)
214             model->BSIM3b0 = 0.0;
215         if (!model->BSIM3b1Given)
216             model->BSIM3b1 = 0.0;
217         if (!model->BSIM3alpha0Given)
218             model->BSIM3alpha0 = 0.0;
219         if (!model->BSIM3alpha1Given)
220             model->BSIM3alpha1 = 0.0;
221         if (!model->BSIM3beta0Given)
222             model->BSIM3beta0 = 30.0;
223         if (!model->BSIM3ijthGiven)
224             model->BSIM3ijth = 0.1; /* unit A */
225 
226         if (!model->BSIM3elmGiven)
227             model->BSIM3elm = 5.0;
228         if (!model->BSIM3cgslGiven)
229             model->BSIM3cgsl = 0.0;
230         if (!model->BSIM3cgdlGiven)
231             model->BSIM3cgdl = 0.0;
232         if (!model->BSIM3ckappaGiven)
233             model->BSIM3ckappa = 0.6;
234         if (!model->BSIM3clcGiven)
235             model->BSIM3clc = 0.1e-6;
236         if (!model->BSIM3cleGiven)
237             model->BSIM3cle = 0.6;
238         if (!model->BSIM3vfbcvGiven)
239             model->BSIM3vfbcv = -1.0;
240         if (!model->BSIM3acdeGiven)
241             model->BSIM3acde = 1.0;
242         if (!model->BSIM3moinGiven)
243             model->BSIM3moin = 15.0;
244         if (!model->BSIM3noffGiven)
245             model->BSIM3noff = 1.0;
246         if (!model->BSIM3voffcvGiven)
247             model->BSIM3voffcv = 0.0;
248         if (!model->BSIM3tcjGiven)
249             model->BSIM3tcj = 0.0;
250         if (!model->BSIM3tpbGiven)
251             model->BSIM3tpb = 0.0;
252         if (!model->BSIM3tcjswGiven)
253             model->BSIM3tcjsw = 0.0;
254         if (!model->BSIM3tpbswGiven)
255             model->BSIM3tpbsw = 0.0;
256         if (!model->BSIM3tcjswgGiven)
257             model->BSIM3tcjswg = 0.0;
258         if (!model->BSIM3tpbswgGiven)
259             model->BSIM3tpbswg = 0.0;
260 
261         /* ACM model */
262         if (!model->BSIM3hdifGiven)
263           model->BSIM3hdif = 0.0;
264         if (!model->BSIM3ldifGiven)
265           model->BSIM3ldif = 0.0;
266         if (!model->BSIM3ldGiven)
267           model->BSIM3ld = 0.0;
268         if (!model->BSIM3rdGiven)
269           model->BSIM3rd = 0.0;
270         if (!model->BSIM3rsGiven)
271           model->BSIM3rs = 0.0;
272         if (!model->BSIM3rdcGiven)
273           model->BSIM3rdc = 0.0;
274         if (!model->BSIM3rscGiven)
275           model->BSIM3rsc = 0.0;
276         if (!model->BSIM3wmltGiven)
277           model->BSIM3wmlt = 1.0;
278 
279         /* Length dependence */
280         if (!model->BSIM3lcdscGiven)
281             model->BSIM3lcdsc = 0.0;
282         if (!model->BSIM3lcdscbGiven)
283             model->BSIM3lcdscb = 0.0;
284         if (!model->BSIM3lcdscdGiven)
285             model->BSIM3lcdscd = 0.0;
286         if (!model->BSIM3lcitGiven)
287             model->BSIM3lcit = 0.0;
288         if (!model->BSIM3lnfactorGiven)
289             model->BSIM3lnfactor = 0.0;
290         if (!model->BSIM3lxjGiven)
291             model->BSIM3lxj = 0.0;
292         if (!model->BSIM3lvsatGiven)
293             model->BSIM3lvsat = 0.0;
294         if (!model->BSIM3latGiven)
295             model->BSIM3lat = 0.0;
296         if (!model->BSIM3la0Given)
297             model->BSIM3la0 = 0.0;
298         if (!model->BSIM3lagsGiven)
299             model->BSIM3lags = 0.0;
300         if (!model->BSIM3la1Given)
301             model->BSIM3la1 = 0.0;
302         if (!model->BSIM3la2Given)
303             model->BSIM3la2 = 0.0;
304         if (!model->BSIM3lketaGiven)
305             model->BSIM3lketa = 0.0;
306         if (!model->BSIM3lnsubGiven)
307             model->BSIM3lnsub = 0.0;
308         if (!model->BSIM3lnpeakGiven)
309             model->BSIM3lnpeak = 0.0;
310         if (!model->BSIM3lngateGiven)
311             model->BSIM3lngate = 0.0;
312         if (!model->BSIM3lvbmGiven)
313             model->BSIM3lvbm = 0.0;
314         if (!model->BSIM3lxtGiven)
315             model->BSIM3lxt = 0.0;
316         if (!model->BSIM3lkt1Given)
317             model->BSIM3lkt1 = 0.0;
318         if (!model->BSIM3lkt1lGiven)
319             model->BSIM3lkt1l = 0.0;
320         if (!model->BSIM3lkt2Given)
321             model->BSIM3lkt2 = 0.0;
322         if (!model->BSIM3lk3Given)
323             model->BSIM3lk3 = 0.0;
324         if (!model->BSIM3lk3bGiven)
325             model->BSIM3lk3b = 0.0;
326         if (!model->BSIM3lw0Given)
327             model->BSIM3lw0 = 0.0;
328         if (!model->BSIM3lnlxGiven)
329             model->BSIM3lnlx = 0.0;
330         if (!model->BSIM3ldvt0Given)
331             model->BSIM3ldvt0 = 0.0;
332         if (!model->BSIM3ldvt1Given)
333             model->BSIM3ldvt1 = 0.0;
334         if (!model->BSIM3ldvt2Given)
335             model->BSIM3ldvt2 = 0.0;
336         if (!model->BSIM3ldvt0wGiven)
337             model->BSIM3ldvt0w = 0.0;
338         if (!model->BSIM3ldvt1wGiven)
339             model->BSIM3ldvt1w = 0.0;
340         if (!model->BSIM3ldvt2wGiven)
341             model->BSIM3ldvt2w = 0.0;
342         if (!model->BSIM3ldroutGiven)
343             model->BSIM3ldrout = 0.0;
344         if (!model->BSIM3ldsubGiven)
345             model->BSIM3ldsub = 0.0;
346         if (!model->BSIM3lvth0Given)
347            model->BSIM3lvth0 = 0.0;
348         if (!model->BSIM3luaGiven)
349             model->BSIM3lua = 0.0;
350         if (!model->BSIM3lua1Given)
351             model->BSIM3lua1 = 0.0;
352         if (!model->BSIM3lubGiven)
353             model->BSIM3lub = 0.0;
354         if (!model->BSIM3lub1Given)
355             model->BSIM3lub1 = 0.0;
356         if (!model->BSIM3lucGiven)
357             model->BSIM3luc = 0.0;
358         if (!model->BSIM3luc1Given)
359             model->BSIM3luc1 = 0.0;
360         if (!model->BSIM3lu0Given)
361             model->BSIM3lu0 = 0.0;
362         if (!model->BSIM3luteGiven)
363             model->BSIM3lute = 0.0;
364         if (!model->BSIM3lvoffGiven)
365             model->BSIM3lvoff = 0.0;
366         if (!model->BSIM3ldeltaGiven)
367             model->BSIM3ldelta = 0.0;
368         if (!model->BSIM3lrdswGiven)
369             model->BSIM3lrdsw = 0.0;
370         if (!model->BSIM3lprwbGiven)
371             model->BSIM3lprwb = 0.0;
372         if (!model->BSIM3lprwgGiven)
373             model->BSIM3lprwg = 0.0;
374         if (!model->BSIM3lprtGiven)
375             model->BSIM3lprt = 0.0;
376         if (!model->BSIM3leta0Given)
377             model->BSIM3leta0 = 0.0;
378         if (!model->BSIM3letabGiven)
379             model->BSIM3letab = -0.0;
380         if (!model->BSIM3lpclmGiven)
381             model->BSIM3lpclm = 0.0;
382         if (!model->BSIM3lpdibl1Given)
383             model->BSIM3lpdibl1 = 0.0;
384         if (!model->BSIM3lpdibl2Given)
385             model->BSIM3lpdibl2 = 0.0;
386         if (!model->BSIM3lpdiblbGiven)
387             model->BSIM3lpdiblb = 0.0;
388         if (!model->BSIM3lpscbe1Given)
389             model->BSIM3lpscbe1 = 0.0;
390         if (!model->BSIM3lpscbe2Given)
391             model->BSIM3lpscbe2 = 0.0;
392         if (!model->BSIM3lpvagGiven)
393             model->BSIM3lpvag = 0.0;
394         if (!model->BSIM3lwrGiven)
395             model->BSIM3lwr = 0.0;
396         if (!model->BSIM3ldwgGiven)
397             model->BSIM3ldwg = 0.0;
398         if (!model->BSIM3ldwbGiven)
399             model->BSIM3ldwb = 0.0;
400         if (!model->BSIM3lb0Given)
401             model->BSIM3lb0 = 0.0;
402         if (!model->BSIM3lb1Given)
403             model->BSIM3lb1 = 0.0;
404         if (!model->BSIM3lalpha0Given)
405             model->BSIM3lalpha0 = 0.0;
406         if (!model->BSIM3lalpha1Given)
407             model->BSIM3lalpha1 = 0.0;
408         if (!model->BSIM3lbeta0Given)
409             model->BSIM3lbeta0 = 0.0;
410         if (!model->BSIM3lvfbGiven)
411             model->BSIM3lvfb = 0.0;
412 
413         if (!model->BSIM3lelmGiven)
414             model->BSIM3lelm = 0.0;
415         if (!model->BSIM3lcgslGiven)
416             model->BSIM3lcgsl = 0.0;
417         if (!model->BSIM3lcgdlGiven)
418             model->BSIM3lcgdl = 0.0;
419         if (!model->BSIM3lckappaGiven)
420             model->BSIM3lckappa = 0.0;
421         if (!model->BSIM3lclcGiven)
422             model->BSIM3lclc = 0.0;
423         if (!model->BSIM3lcleGiven)
424             model->BSIM3lcle = 0.0;
425         if (!model->BSIM3lcfGiven)
426             model->BSIM3lcf = 0.0;
427         if (!model->BSIM3lvfbcvGiven)
428             model->BSIM3lvfbcv = 0.0;
429         if (!model->BSIM3lacdeGiven)
430             model->BSIM3lacde = 0.0;
431         if (!model->BSIM3lmoinGiven)
432             model->BSIM3lmoin = 0.0;
433         if (!model->BSIM3lnoffGiven)
434             model->BSIM3lnoff = 0.0;
435         if (!model->BSIM3lvoffcvGiven)
436             model->BSIM3lvoffcv = 0.0;
437 
438         /* Width dependence */
439         if (!model->BSIM3wcdscGiven)
440             model->BSIM3wcdsc = 0.0;
441         if (!model->BSIM3wcdscbGiven)
442             model->BSIM3wcdscb = 0.0;
443         if (!model->BSIM3wcdscdGiven)
444             model->BSIM3wcdscd = 0.0;
445         if (!model->BSIM3wcitGiven)
446             model->BSIM3wcit = 0.0;
447         if (!model->BSIM3wnfactorGiven)
448             model->BSIM3wnfactor = 0.0;
449         if (!model->BSIM3wxjGiven)
450             model->BSIM3wxj = 0.0;
451         if (!model->BSIM3wvsatGiven)
452             model->BSIM3wvsat = 0.0;
453         if (!model->BSIM3watGiven)
454             model->BSIM3wat = 0.0;
455         if (!model->BSIM3wa0Given)
456             model->BSIM3wa0 = 0.0;
457         if (!model->BSIM3wagsGiven)
458             model->BSIM3wags = 0.0;
459         if (!model->BSIM3wa1Given)
460             model->BSIM3wa1 = 0.0;
461         if (!model->BSIM3wa2Given)
462             model->BSIM3wa2 = 0.0;
463         if (!model->BSIM3wketaGiven)
464             model->BSIM3wketa = 0.0;
465         if (!model->BSIM3wnsubGiven)
466             model->BSIM3wnsub = 0.0;
467         if (!model->BSIM3wnpeakGiven)
468             model->BSIM3wnpeak = 0.0;
469         if (!model->BSIM3wngateGiven)
470             model->BSIM3wngate = 0.0;
471         if (!model->BSIM3wvbmGiven)
472             model->BSIM3wvbm = 0.0;
473         if (!model->BSIM3wxtGiven)
474             model->BSIM3wxt = 0.0;
475         if (!model->BSIM3wkt1Given)
476             model->BSIM3wkt1 = 0.0;
477         if (!model->BSIM3wkt1lGiven)
478             model->BSIM3wkt1l = 0.0;
479         if (!model->BSIM3wkt2Given)
480             model->BSIM3wkt2 = 0.0;
481         if (!model->BSIM3wk3Given)
482             model->BSIM3wk3 = 0.0;
483         if (!model->BSIM3wk3bGiven)
484             model->BSIM3wk3b = 0.0;
485         if (!model->BSIM3ww0Given)
486             model->BSIM3ww0 = 0.0;
487         if (!model->BSIM3wnlxGiven)
488             model->BSIM3wnlx = 0.0;
489         if (!model->BSIM3wdvt0Given)
490             model->BSIM3wdvt0 = 0.0;
491         if (!model->BSIM3wdvt1Given)
492             model->BSIM3wdvt1 = 0.0;
493         if (!model->BSIM3wdvt2Given)
494             model->BSIM3wdvt2 = 0.0;
495         if (!model->BSIM3wdvt0wGiven)
496             model->BSIM3wdvt0w = 0.0;
497         if (!model->BSIM3wdvt1wGiven)
498             model->BSIM3wdvt1w = 0.0;
499         if (!model->BSIM3wdvt2wGiven)
500             model->BSIM3wdvt2w = 0.0;
501         if (!model->BSIM3wdroutGiven)
502             model->BSIM3wdrout = 0.0;
503         if (!model->BSIM3wdsubGiven)
504             model->BSIM3wdsub = 0.0;
505         if (!model->BSIM3wvth0Given)
506            model->BSIM3wvth0 = 0.0;
507         if (!model->BSIM3wuaGiven)
508             model->BSIM3wua = 0.0;
509         if (!model->BSIM3wua1Given)
510             model->BSIM3wua1 = 0.0;
511         if (!model->BSIM3wubGiven)
512             model->BSIM3wub = 0.0;
513         if (!model->BSIM3wub1Given)
514             model->BSIM3wub1 = 0.0;
515         if (!model->BSIM3wucGiven)
516             model->BSIM3wuc = 0.0;
517         if (!model->BSIM3wuc1Given)
518             model->BSIM3wuc1 = 0.0;
519         if (!model->BSIM3wu0Given)
520             model->BSIM3wu0 = 0.0;
521         if (!model->BSIM3wuteGiven)
522             model->BSIM3wute = 0.0;
523         if (!model->BSIM3wvoffGiven)
524             model->BSIM3wvoff = 0.0;
525         if (!model->BSIM3wdeltaGiven)
526             model->BSIM3wdelta = 0.0;
527         if (!model->BSIM3wrdswGiven)
528             model->BSIM3wrdsw = 0.0;
529         if (!model->BSIM3wprwbGiven)
530             model->BSIM3wprwb = 0.0;
531         if (!model->BSIM3wprwgGiven)
532             model->BSIM3wprwg = 0.0;
533         if (!model->BSIM3wprtGiven)
534             model->BSIM3wprt = 0.0;
535         if (!model->BSIM3weta0Given)
536             model->BSIM3weta0 = 0.0;
537         if (!model->BSIM3wetabGiven)
538             model->BSIM3wetab = 0.0;
539         if (!model->BSIM3wpclmGiven)
540             model->BSIM3wpclm = 0.0;
541         if (!model->BSIM3wpdibl1Given)
542             model->BSIM3wpdibl1 = 0.0;
543         if (!model->BSIM3wpdibl2Given)
544             model->BSIM3wpdibl2 = 0.0;
545         if (!model->BSIM3wpdiblbGiven)
546             model->BSIM3wpdiblb = 0.0;
547         if (!model->BSIM3wpscbe1Given)
548             model->BSIM3wpscbe1 = 0.0;
549         if (!model->BSIM3wpscbe2Given)
550             model->BSIM3wpscbe2 = 0.0;
551         if (!model->BSIM3wpvagGiven)
552             model->BSIM3wpvag = 0.0;
553         if (!model->BSIM3wwrGiven)
554             model->BSIM3wwr = 0.0;
555         if (!model->BSIM3wdwgGiven)
556             model->BSIM3wdwg = 0.0;
557         if (!model->BSIM3wdwbGiven)
558             model->BSIM3wdwb = 0.0;
559         if (!model->BSIM3wb0Given)
560             model->BSIM3wb0 = 0.0;
561         if (!model->BSIM3wb1Given)
562             model->BSIM3wb1 = 0.0;
563         if (!model->BSIM3walpha0Given)
564             model->BSIM3walpha0 = 0.0;
565         if (!model->BSIM3walpha1Given)
566             model->BSIM3walpha1 = 0.0;
567         if (!model->BSIM3wbeta0Given)
568             model->BSIM3wbeta0 = 0.0;
569         if (!model->BSIM3wvfbGiven)
570             model->BSIM3wvfb = 0.0;
571 
572         if (!model->BSIM3welmGiven)
573             model->BSIM3welm = 0.0;
574         if (!model->BSIM3wcgslGiven)
575             model->BSIM3wcgsl = 0.0;
576         if (!model->BSIM3wcgdlGiven)
577             model->BSIM3wcgdl = 0.0;
578         if (!model->BSIM3wckappaGiven)
579             model->BSIM3wckappa = 0.0;
580         if (!model->BSIM3wcfGiven)
581             model->BSIM3wcf = 0.0;
582         if (!model->BSIM3wclcGiven)
583             model->BSIM3wclc = 0.0;
584         if (!model->BSIM3wcleGiven)
585             model->BSIM3wcle = 0.0;
586         if (!model->BSIM3wvfbcvGiven)
587             model->BSIM3wvfbcv = 0.0;
588         if (!model->BSIM3wacdeGiven)
589             model->BSIM3wacde = 0.0;
590         if (!model->BSIM3wmoinGiven)
591             model->BSIM3wmoin = 0.0;
592         if (!model->BSIM3wnoffGiven)
593             model->BSIM3wnoff = 0.0;
594         if (!model->BSIM3wvoffcvGiven)
595             model->BSIM3wvoffcv = 0.0;
596 
597         /* Cross-term dependence */
598         if (!model->BSIM3pcdscGiven)
599             model->BSIM3pcdsc = 0.0;
600         if (!model->BSIM3pcdscbGiven)
601             model->BSIM3pcdscb = 0.0;
602         if (!model->BSIM3pcdscdGiven)
603             model->BSIM3pcdscd = 0.0;
604         if (!model->BSIM3pcitGiven)
605             model->BSIM3pcit = 0.0;
606         if (!model->BSIM3pnfactorGiven)
607             model->BSIM3pnfactor = 0.0;
608         if (!model->BSIM3pxjGiven)
609             model->BSIM3pxj = 0.0;
610         if (!model->BSIM3pvsatGiven)
611             model->BSIM3pvsat = 0.0;
612         if (!model->BSIM3patGiven)
613             model->BSIM3pat = 0.0;
614         if (!model->BSIM3pa0Given)
615             model->BSIM3pa0 = 0.0;
616 
617         if (!model->BSIM3pagsGiven)
618             model->BSIM3pags = 0.0;
619         if (!model->BSIM3pa1Given)
620             model->BSIM3pa1 = 0.0;
621         if (!model->BSIM3pa2Given)
622             model->BSIM3pa2 = 0.0;
623         if (!model->BSIM3pketaGiven)
624             model->BSIM3pketa = 0.0;
625         if (!model->BSIM3pnsubGiven)
626             model->BSIM3pnsub = 0.0;
627         if (!model->BSIM3pnpeakGiven)
628             model->BSIM3pnpeak = 0.0;
629         if (!model->BSIM3pngateGiven)
630             model->BSIM3pngate = 0.0;
631         if (!model->BSIM3pvbmGiven)
632             model->BSIM3pvbm = 0.0;
633         if (!model->BSIM3pxtGiven)
634             model->BSIM3pxt = 0.0;
635         if (!model->BSIM3pkt1Given)
636             model->BSIM3pkt1 = 0.0;
637         if (!model->BSIM3pkt1lGiven)
638             model->BSIM3pkt1l = 0.0;
639         if (!model->BSIM3pkt2Given)
640             model->BSIM3pkt2 = 0.0;
641         if (!model->BSIM3pk3Given)
642             model->BSIM3pk3 = 0.0;
643         if (!model->BSIM3pk3bGiven)
644             model->BSIM3pk3b = 0.0;
645         if (!model->BSIM3pw0Given)
646             model->BSIM3pw0 = 0.0;
647         if (!model->BSIM3pnlxGiven)
648             model->BSIM3pnlx = 0.0;
649         if (!model->BSIM3pdvt0Given)
650             model->BSIM3pdvt0 = 0.0;
651         if (!model->BSIM3pdvt1Given)
652             model->BSIM3pdvt1 = 0.0;
653         if (!model->BSIM3pdvt2Given)
654             model->BSIM3pdvt2 = 0.0;
655         if (!model->BSIM3pdvt0wGiven)
656             model->BSIM3pdvt0w = 0.0;
657         if (!model->BSIM3pdvt1wGiven)
658             model->BSIM3pdvt1w = 0.0;
659         if (!model->BSIM3pdvt2wGiven)
660             model->BSIM3pdvt2w = 0.0;
661         if (!model->BSIM3pdroutGiven)
662             model->BSIM3pdrout = 0.0;
663         if (!model->BSIM3pdsubGiven)
664             model->BSIM3pdsub = 0.0;
665         if (!model->BSIM3pvth0Given)
666            model->BSIM3pvth0 = 0.0;
667         if (!model->BSIM3puaGiven)
668             model->BSIM3pua = 0.0;
669         if (!model->BSIM3pua1Given)
670             model->BSIM3pua1 = 0.0;
671         if (!model->BSIM3pubGiven)
672             model->BSIM3pub = 0.0;
673         if (!model->BSIM3pub1Given)
674             model->BSIM3pub1 = 0.0;
675         if (!model->BSIM3pucGiven)
676             model->BSIM3puc = 0.0;
677         if (!model->BSIM3puc1Given)
678             model->BSIM3puc1 = 0.0;
679         if (!model->BSIM3pu0Given)
680             model->BSIM3pu0 = 0.0;
681         if (!model->BSIM3puteGiven)
682             model->BSIM3pute = 0.0;
683         if (!model->BSIM3pvoffGiven)
684             model->BSIM3pvoff = 0.0;
685         if (!model->BSIM3pdeltaGiven)
686             model->BSIM3pdelta = 0.0;
687         if (!model->BSIM3prdswGiven)
688             model->BSIM3prdsw = 0.0;
689         if (!model->BSIM3pprwbGiven)
690             model->BSIM3pprwb = 0.0;
691         if (!model->BSIM3pprwgGiven)
692             model->BSIM3pprwg = 0.0;
693         if (!model->BSIM3pprtGiven)
694             model->BSIM3pprt = 0.0;
695         if (!model->BSIM3peta0Given)
696             model->BSIM3peta0 = 0.0;
697         if (!model->BSIM3petabGiven)
698             model->BSIM3petab = 0.0;
699         if (!model->BSIM3ppclmGiven)
700             model->BSIM3ppclm = 0.0;
701         if (!model->BSIM3ppdibl1Given)
702             model->BSIM3ppdibl1 = 0.0;
703         if (!model->BSIM3ppdibl2Given)
704             model->BSIM3ppdibl2 = 0.0;
705         if (!model->BSIM3ppdiblbGiven)
706             model->BSIM3ppdiblb = 0.0;
707         if (!model->BSIM3ppscbe1Given)
708             model->BSIM3ppscbe1 = 0.0;
709         if (!model->BSIM3ppscbe2Given)
710             model->BSIM3ppscbe2 = 0.0;
711         if (!model->BSIM3ppvagGiven)
712             model->BSIM3ppvag = 0.0;
713         if (!model->BSIM3pwrGiven)
714             model->BSIM3pwr = 0.0;
715         if (!model->BSIM3pdwgGiven)
716             model->BSIM3pdwg = 0.0;
717         if (!model->BSIM3pdwbGiven)
718             model->BSIM3pdwb = 0.0;
719         if (!model->BSIM3pb0Given)
720             model->BSIM3pb0 = 0.0;
721         if (!model->BSIM3pb1Given)
722             model->BSIM3pb1 = 0.0;
723         if (!model->BSIM3palpha0Given)
724             model->BSIM3palpha0 = 0.0;
725         if (!model->BSIM3palpha1Given)
726             model->BSIM3palpha1 = 0.0;
727         if (!model->BSIM3pbeta0Given)
728             model->BSIM3pbeta0 = 0.0;
729         if (!model->BSIM3pvfbGiven)
730             model->BSIM3pvfb = 0.0;
731 
732         if (!model->BSIM3pelmGiven)
733             model->BSIM3pelm = 0.0;
734         if (!model->BSIM3pcgslGiven)
735             model->BSIM3pcgsl = 0.0;
736         if (!model->BSIM3pcgdlGiven)
737             model->BSIM3pcgdl = 0.0;
738         if (!model->BSIM3pckappaGiven)
739             model->BSIM3pckappa = 0.0;
740         if (!model->BSIM3pcfGiven)
741             model->BSIM3pcf = 0.0;
742         if (!model->BSIM3pclcGiven)
743             model->BSIM3pclc = 0.0;
744         if (!model->BSIM3pcleGiven)
745             model->BSIM3pcle = 0.0;
746         if (!model->BSIM3pvfbcvGiven)
747             model->BSIM3pvfbcv = 0.0;
748         if (!model->BSIM3pacdeGiven)
749             model->BSIM3pacde = 0.0;
750         if (!model->BSIM3pmoinGiven)
751             model->BSIM3pmoin = 0.0;
752         if (!model->BSIM3pnoffGiven)
753             model->BSIM3pnoff = 0.0;
754         if (!model->BSIM3pvoffcvGiven)
755             model->BSIM3pvoffcv = 0.0;
756 
757         /* unit degree celcius */
758         if (!model->BSIM3tnomGiven)
759             model->BSIM3tnom = ckt->CKTnomTemp;
760 /*        else
761             model->BSIM3tnom = model->BSIM3tnom + 273.15; we make this transform in b3mpar.c in the first run */
762         if (!model->BSIM3lintnoiGiven)
763             model->BSIM3lintnoi = 0.0;  /* unit m */
764         if (!model->BSIM3LintGiven)
765            model->BSIM3Lint = 0.0;
766         if (!model->BSIM3LlGiven)
767            model->BSIM3Ll = 0.0;
768         if (!model->BSIM3LlcGiven)
769            model->BSIM3Llc = model->BSIM3Ll;
770         if (!model->BSIM3LlnGiven)
771            model->BSIM3Lln = 1.0;
772         if (!model->BSIM3LwGiven)
773            model->BSIM3Lw = 0.0;
774         if (!model->BSIM3LwcGiven)
775            model->BSIM3Lwc = model->BSIM3Lw;
776         if (!model->BSIM3LwnGiven)
777            model->BSIM3Lwn = 1.0;
778         if (!model->BSIM3LwlGiven)
779            model->BSIM3Lwl = 0.0;
780         if (!model->BSIM3LwlcGiven)
781            model->BSIM3Lwlc = model->BSIM3Lwl;
782         if (!model->BSIM3LminGiven)
783            model->BSIM3Lmin = 0.0;
784         if (!model->BSIM3LmaxGiven)
785            model->BSIM3Lmax = 1.0;
786         if (!model->BSIM3WintGiven)
787            model->BSIM3Wint = 0.0;
788         if (!model->BSIM3WlGiven)
789            model->BSIM3Wl = 0.0;
790         if (!model->BSIM3WlcGiven)
791            model->BSIM3Wlc = model->BSIM3Wl;
792         if (!model->BSIM3WlnGiven)
793            model->BSIM3Wln = 1.0;
794         if (!model->BSIM3WwGiven)
795            model->BSIM3Ww = 0.0;
796         if (!model->BSIM3WwcGiven)
797            model->BSIM3Wwc = model->BSIM3Ww;
798         if (!model->BSIM3WwnGiven)
799            model->BSIM3Wwn = 1.0;
800         if (!model->BSIM3WwlGiven)
801            model->BSIM3Wwl = 0.0;
802         if (!model->BSIM3WwlcGiven)
803            model->BSIM3Wwlc = model->BSIM3Wwl;
804         if (!model->BSIM3WminGiven)
805            model->BSIM3Wmin = 0.0;
806         if (!model->BSIM3WmaxGiven)
807            model->BSIM3Wmax = 1.0;
808         if (!model->BSIM3dwcGiven)
809            model->BSIM3dwc = model->BSIM3Wint;
810         if (!model->BSIM3dlcGiven)
811            model->BSIM3dlc = model->BSIM3Lint;
812 
813         if (!model->BSIM3xlGiven)
814            model->BSIM3xl = 0.0;
815         if (!model->BSIM3xwGiven)
816            model->BSIM3xw = 0.0;
817 
818         if (!model->BSIM3cfGiven)
819             model->BSIM3cf = 2.0 * EPSOX / PI
820                            * log(1.0 + 0.4e-6 / model->BSIM3tox);
821         if (!model->BSIM3cgdoGiven)
822         {   if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0))
823             {   model->BSIM3cgdo = model->BSIM3dlc * model->BSIM3cox
824                                  - model->BSIM3cgdl ;
825             }
826             else
827                 model->BSIM3cgdo = 0.6 * model->BSIM3xj * model->BSIM3cox;
828         }
829         if (!model->BSIM3cgsoGiven)
830         {   if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0))
831             {   model->BSIM3cgso = model->BSIM3dlc * model->BSIM3cox
832                                  - model->BSIM3cgsl ;
833             }
834             else
835                 model->BSIM3cgso = 0.6 * model->BSIM3xj * model->BSIM3cox;
836         }
837 
838         if (!model->BSIM3cgboGiven)
839         {   model->BSIM3cgbo = 2.0 * model->BSIM3dwc * model->BSIM3cox;
840         }
841         if (!model->BSIM3xpartGiven)
842             model->BSIM3xpart = 0.0;
843         if (!model->BSIM3sheetResistanceGiven)
844             model->BSIM3sheetResistance = 0.0;
845         if (!model->BSIM3unitAreaJctCapGiven)
846             model->BSIM3unitAreaJctCap = 5.0E-4;
847         if (!model->BSIM3unitLengthSidewallJctCapGiven)
848             model->BSIM3unitLengthSidewallJctCap = 5.0E-10;
849         if (!model->BSIM3unitLengthGateSidewallJctCapGiven)
850             model->BSIM3unitLengthGateSidewallJctCap = model->BSIM3unitLengthSidewallJctCap ;
851         if (!model->BSIM3jctSatCurDensityGiven)
852             model->BSIM3jctSatCurDensity = 1.0E-4;
853         if (!model->BSIM3jctSidewallSatCurDensityGiven)
854             model->BSIM3jctSidewallSatCurDensity = 0.0;
855         if (!model->BSIM3bulkJctPotentialGiven)
856             model->BSIM3bulkJctPotential = 1.0;
857         if (!model->BSIM3sidewallJctPotentialGiven)
858             model->BSIM3sidewallJctPotential = 1.0;
859         if (!model->BSIM3GatesidewallJctPotentialGiven)
860             model->BSIM3GatesidewallJctPotential = model->BSIM3sidewallJctPotential;
861         if (!model->BSIM3bulkJctBotGradingCoeffGiven)
862             model->BSIM3bulkJctBotGradingCoeff = 0.5;
863         if (!model->BSIM3bulkJctSideGradingCoeffGiven)
864             model->BSIM3bulkJctSideGradingCoeff = 0.33;
865         if (!model->BSIM3bulkJctGateSideGradingCoeffGiven)
866             model->BSIM3bulkJctGateSideGradingCoeff = model->BSIM3bulkJctSideGradingCoeff;
867         if (!model->BSIM3jctEmissionCoeffGiven)
868             model->BSIM3jctEmissionCoeff = 1.0;
869         if (!model->BSIM3jctTempExponentGiven)
870             model->BSIM3jctTempExponent = 3.0;
871         if (!model->BSIM3oxideTrapDensityAGiven)
872         {   if (model->BSIM3type == NMOS)
873                 model->BSIM3oxideTrapDensityA = 1e20;
874             else
875                 model->BSIM3oxideTrapDensityA=9.9e18;
876         }
877         if (!model->BSIM3oxideTrapDensityBGiven)
878         {   if (model->BSIM3type == NMOS)
879                 model->BSIM3oxideTrapDensityB = 5e4;
880             else
881                 model->BSIM3oxideTrapDensityB = 2.4e3;
882         }
883         if (!model->BSIM3oxideTrapDensityCGiven)
884         {   if (model->BSIM3type == NMOS)
885                 model->BSIM3oxideTrapDensityC = -1.4e-12;
886             else
887                 model->BSIM3oxideTrapDensityC = 1.4e-12;
888 
889         }
890         if (!model->BSIM3emGiven)
891             model->BSIM3em = 4.1e7; /* V/m */
892         if (!model->BSIM3efGiven)
893             model->BSIM3ef = 1.0;
894         if (!model->BSIM3afGiven)
895             model->BSIM3af = 1.0;
896         if (!model->BSIM3kfGiven)
897             model->BSIM3kf = 0.0;
898 
899         if (!model->BSIM3vgsMaxGiven)
900             model->BSIM3vgsMax = 1e99;
901         if (!model->BSIM3vgdMaxGiven)
902             model->BSIM3vgdMax = 1e99;
903         if (!model->BSIM3vgbMaxGiven)
904             model->BSIM3vgbMax = 1e99;
905         if (!model->BSIM3vdsMaxGiven)
906             model->BSIM3vdsMax = 1e99;
907         if (!model->BSIM3vbsMaxGiven)
908             model->BSIM3vbsMax = 1e99;
909         if (!model->BSIM3vbdMaxGiven)
910             model->BSIM3vbdMax = 1e99;
911         if (!model->BSIM3vgsrMaxGiven)
912             model->BSIM3vgsrMax = 1e99;
913         if (!model->BSIM3vgdrMaxGiven)
914             model->BSIM3vgdrMax = 1e99;
915         if (!model->BSIM3vgbrMaxGiven)
916             model->BSIM3vgbrMax = 1e99;
917         if (!model->BSIM3vbsrMaxGiven)
918             model->BSIM3vbsrMax = 1e99;
919         if (!model->BSIM3vbdrMaxGiven)
920             model->BSIM3vbdrMax = 1e99;
921 
922         /* loop through all the instances of the model */
923         for (here = BSIM3instances(model); here != NULL ;
924              here=BSIM3nextInstance(here))
925         {
926             /* allocate a chunk of the state vector */
927             here->BSIM3states = *states;
928             *states += BSIM3numStates;
929 
930             /* perform the parameter defaulting */
931             if (!here->BSIM3drainAreaGiven)
932                 here->BSIM3drainArea = 0.0;
933             if (!here->BSIM3drainPerimeterGiven)
934                 here->BSIM3drainPerimeter = 0.0;
935             if (!here->BSIM3drainSquaresGiven)
936             {
937                 if (model->BSIM3acmMod == 0)
938                   here->BSIM3drainSquares = 1.0;
939                 else
940                   here->BSIM3drainSquares = 0.0;
941             }
942             if (!here->BSIM3delvtoGiven)
943                 here->BSIM3delvto = 0.0;
944             if (!here->BSIM3mulu0Given)
945                 here->BSIM3mulu0 = 1.0;
946             if (!here->BSIM3icVBSGiven)
947                 here->BSIM3icVBS = 0.0;
948             if (!here->BSIM3icVDSGiven)
949                 here->BSIM3icVDS = 0.0;
950             if (!here->BSIM3icVGSGiven)
951                 here->BSIM3icVGS = 0.0;
952             if (!here->BSIM3lGiven)
953                 here->BSIM3l = 5.0e-6;
954             if (!here->BSIM3sourceAreaGiven)
955                 here->BSIM3sourceArea = 0.0;
956             if (!here->BSIM3sourcePerimeterGiven)
957                 here->BSIM3sourcePerimeter = 0.0;
958             if (!here->BSIM3sourceSquaresGiven)
959             {
960                 if (model->BSIM3acmMod == 0)
961                   here->BSIM3sourceSquares = 1.0;
962                 else
963                   here->BSIM3sourceSquares = 0.0;
964             }
965             if (!here->BSIM3wGiven)
966                 here->BSIM3w = 5.0e-6;
967             if (!here->BSIM3nqsModGiven)
968                 here->BSIM3nqsMod = model->BSIM3nqsMod;
969             else if ((here->BSIM3nqsMod != 0) && (here->BSIM3nqsMod != 1))
970             {   here->BSIM3nqsMod = model->BSIM3nqsMod;
971                 printf("Warning: nqsMod has been set to its global value %d.\n",
972                 model->BSIM3nqsMod);
973             }
974             if (!here->BSIM3acnqsModGiven)
975                 here->BSIM3acnqsMod = model->BSIM3acnqsMod;
976             else if ((here->BSIM3acnqsMod != 0) && (here->BSIM3acnqsMod != 1))
977             {   here->BSIM3acnqsMod = model->BSIM3acnqsMod;
978                 printf("Warning: acnqsMod has been set to its global value %d.\n",
979                 model->BSIM3acnqsMod);
980             }
981 
982             if (!here->BSIM3geoGiven)
983                 here->BSIM3geo = 0;
984 
985             if (!here->BSIM3mGiven)
986                 here->BSIM3m = 1;
987 
988             /* process source/drain series resistance */
989             /* ACM model */
990 
991             double drainResistance, sourceResistance;
992 
993             if (model->BSIM3acmMod == 0)
994             {
995                 drainResistance = model->BSIM3sheetResistance
996                     * here->BSIM3drainSquares;
997                 sourceResistance = model->BSIM3sheetResistance
998                     * here->BSIM3sourceSquares;
999             }
1000             else /* ACM > 0 */
1001             {
1002                 error = ACM_SourceDrainResistances(
1003                     model->BSIM3acmMod,
1004                     model->BSIM3ld,
1005                     model->BSIM3ldif,
1006                     model->BSIM3hdif,
1007                     model->BSIM3wmlt,
1008                     here->BSIM3w,
1009                     model->BSIM3xw,
1010                     model->BSIM3sheetResistance,
1011                     here->BSIM3drainSquaresGiven,
1012                     model->BSIM3rd,
1013                     model->BSIM3rdc,
1014                     here->BSIM3drainSquares,
1015                     here->BSIM3sourceSquaresGiven,
1016                     model->BSIM3rs,
1017                     model->BSIM3rsc,
1018                     here->BSIM3sourceSquares,
1019                     &drainResistance,
1020                     &sourceResistance
1021                     );
1022                 if (error)
1023                     return(error);
1024             }
1025 
1026             /* process drain series resistance */
1027             if (drainResistance != 0.0)
1028             {
1029               if(here->BSIM3dNodePrime == 0) {
1030                 error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"drain");
1031                 if(error) return(error);
1032                 here->BSIM3dNodePrime = tmp->number;
1033                 if (ckt->CKTcopyNodesets) {
1034                   if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
1035                     if (tmpNode->nsGiven) {
1036                       tmp->nodeset=tmpNode->nodeset;
1037                       tmp->nsGiven=tmpNode->nsGiven;
1038                     }
1039                   }
1040                 }
1041               }
1042             }
1043             else
1044             {   here->BSIM3dNodePrime = here->BSIM3dNode;
1045             }
1046 
1047             /* process source series resistance */
1048             if (sourceResistance != 0.0)
1049             {
1050               if(here->BSIM3sNodePrime == 0) {
1051                 error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"source");
1052                 if(error) return(error);
1053                 here->BSIM3sNodePrime = tmp->number;
1054                 if (ckt->CKTcopyNodesets) {
1055                   if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
1056                     if (tmpNode->nsGiven) {
1057                       tmp->nodeset=tmpNode->nodeset;
1058                       tmp->nsGiven=tmpNode->nsGiven;
1059                     }
1060                   }
1061                 }
1062               }
1063             }
1064             else
1065             {   here->BSIM3sNodePrime = here->BSIM3sNode;
1066             }
1067 
1068  /* internal charge node */
1069 
1070             if (here->BSIM3nqsMod)
1071             {   if (here->BSIM3qNode == 0)
1072             {   error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"charge");
1073                 if(error) return(error);
1074                 here->BSIM3qNode = tmp->number;
1075             }
1076             }
1077             else
1078             {   here->BSIM3qNode = 0;
1079             }
1080 
1081         /* set Sparse Matrix Pointers */
1082 
1083 
1084 /* macro to make elements with built in test for out of memory */
1085 #define TSTALLOC(ptr,first,second) \
1086 do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\
1087     return(E_NOMEM);\
1088 } } while(0)
1089 
1090             TSTALLOC(BSIM3DdPtr, BSIM3dNode, BSIM3dNode);
1091             TSTALLOC(BSIM3GgPtr, BSIM3gNode, BSIM3gNode);
1092             TSTALLOC(BSIM3SsPtr, BSIM3sNode, BSIM3sNode);
1093             TSTALLOC(BSIM3BbPtr, BSIM3bNode, BSIM3bNode);
1094             TSTALLOC(BSIM3DPdpPtr, BSIM3dNodePrime, BSIM3dNodePrime);
1095             TSTALLOC(BSIM3SPspPtr, BSIM3sNodePrime, BSIM3sNodePrime);
1096             TSTALLOC(BSIM3DdpPtr, BSIM3dNode, BSIM3dNodePrime);
1097             TSTALLOC(BSIM3GbPtr, BSIM3gNode, BSIM3bNode);
1098             TSTALLOC(BSIM3GdpPtr, BSIM3gNode, BSIM3dNodePrime);
1099             TSTALLOC(BSIM3GspPtr, BSIM3gNode, BSIM3sNodePrime);
1100             TSTALLOC(BSIM3SspPtr, BSIM3sNode, BSIM3sNodePrime);
1101             TSTALLOC(BSIM3BdpPtr, BSIM3bNode, BSIM3dNodePrime);
1102             TSTALLOC(BSIM3BspPtr, BSIM3bNode, BSIM3sNodePrime);
1103             TSTALLOC(BSIM3DPspPtr, BSIM3dNodePrime, BSIM3sNodePrime);
1104             TSTALLOC(BSIM3DPdPtr, BSIM3dNodePrime, BSIM3dNode);
1105             TSTALLOC(BSIM3BgPtr, BSIM3bNode, BSIM3gNode);
1106             TSTALLOC(BSIM3DPgPtr, BSIM3dNodePrime, BSIM3gNode);
1107             TSTALLOC(BSIM3SPgPtr, BSIM3sNodePrime, BSIM3gNode);
1108             TSTALLOC(BSIM3SPsPtr, BSIM3sNodePrime, BSIM3sNode);
1109             TSTALLOC(BSIM3DPbPtr, BSIM3dNodePrime, BSIM3bNode);
1110             TSTALLOC(BSIM3SPbPtr, BSIM3sNodePrime, BSIM3bNode);
1111             TSTALLOC(BSIM3SPdpPtr, BSIM3sNodePrime, BSIM3dNodePrime);
1112 
1113             TSTALLOC(BSIM3QqPtr, BSIM3qNode, BSIM3qNode);
1114 
1115             TSTALLOC(BSIM3QdpPtr, BSIM3qNode, BSIM3dNodePrime);
1116             TSTALLOC(BSIM3QspPtr, BSIM3qNode, BSIM3sNodePrime);
1117             TSTALLOC(BSIM3QgPtr, BSIM3qNode, BSIM3gNode);
1118             TSTALLOC(BSIM3QbPtr, BSIM3qNode, BSIM3bNode);
1119             TSTALLOC(BSIM3DPqPtr, BSIM3dNodePrime, BSIM3qNode);
1120             TSTALLOC(BSIM3SPqPtr, BSIM3sNodePrime, BSIM3qNode);
1121             TSTALLOC(BSIM3GqPtr, BSIM3gNode, BSIM3qNode);
1122             TSTALLOC(BSIM3BqPtr, BSIM3bNode, BSIM3qNode);
1123 
1124         }
1125     }
1126 #ifdef USE_OMP
1127     InstCount = 0;
1128     model = (BSIM3model*)inModel;
1129     /* loop through all the BSIM3 device models
1130        to count the number of instances */
1131 
1132     for( ; model != NULL; model = BSIM3nextModel(model))
1133     {
1134         /* loop through all the instances of the model */
1135         for (here = BSIM3instances(model); here != NULL ;
1136              here=BSIM3nextInstance(here))
1137         {
1138             InstCount++;
1139         }
1140         model->BSIM3InstCount = 0;
1141         model->BSIM3InstanceArray = NULL;
1142     }
1143     InstArray = TMALLOC(BSIM3instance*, InstCount);
1144     model = (BSIM3model*)inModel;
1145     /* store this in the first model only */
1146     model->BSIM3InstCount = InstCount;
1147     model->BSIM3InstanceArray = InstArray;
1148     idx = 0;
1149     for( ; model != NULL; model = BSIM3nextModel(model))
1150     {
1151         /* loop through all the instances of the model */
1152         for (here = BSIM3instances(model); here != NULL ;
1153              here=BSIM3nextInstance(here))
1154         {
1155             InstArray[idx] = here;
1156             idx++;
1157         }
1158     }
1159 
1160 #endif
1161     return(OK);
1162 }
1163 
1164 int
BSIM3unsetup(GENmodel * inModel,CKTcircuit * ckt)1165 BSIM3unsetup(
1166     GENmodel *inModel,
1167     CKTcircuit *ckt)
1168 {
1169     BSIM3model *model;
1170     BSIM3instance *here;
1171 
1172 #ifdef USE_OMP
1173     model = (BSIM3model*)inModel;
1174     tfree(model->BSIM3InstanceArray);
1175 #endif
1176 
1177     for (model = (BSIM3model *)inModel; model != NULL;
1178             model = BSIM3nextModel(model))
1179     {
1180         for (here = BSIM3instances(model); here != NULL;
1181                 here=BSIM3nextInstance(here))
1182         {
1183             if (here->BSIM3qNode > 0)
1184                 CKTdltNNum(ckt, here->BSIM3qNode);
1185             here->BSIM3qNode = 0;
1186 
1187             if (here->BSIM3sNodePrime > 0
1188                     && here->BSIM3sNodePrime != here->BSIM3sNode)
1189                 CKTdltNNum(ckt, here->BSIM3sNodePrime);
1190             here->BSIM3sNodePrime = 0;
1191 
1192             if (here->BSIM3dNodePrime > 0
1193                     && here->BSIM3dNodePrime != here->BSIM3dNode)
1194                 CKTdltNNum(ckt, here->BSIM3dNodePrime);
1195             here->BSIM3dNodePrime = 0;
1196         }
1197     }
1198     return OK;
1199 }
1200 
1201 
1202 
1203 
1204 
1205 
1206