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