1 /**********
2 Copyright 1999 Regents of the University of California. All rights reserved.
3 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
4 File: b3soiddcheck.c 98/5/01
5 Modified by Paolo Nenzi 2002
6 **********/
7
8 /*
9 * Revision 2.1 99/9/27 Pin Su
10 * BSIMDD2.1 release
11 */
12
13 #include "ngspice/ngspice.h"
14 #include "ngspice/cktdefs.h"
15 #include "b3soidddef.h"
16 #include "ngspice/trandefs.h"
17 #include "ngspice/const.h"
18 #include "ngspice/sperror.h"
19 #include "ngspice/devdefs.h"
20 #include "ngspice/suffix.h"
21
22 int
B3SOIDDcheckModel(B3SOIDDmodel * model,B3SOIDDinstance * here,CKTcircuit * ckt)23 B3SOIDDcheckModel(B3SOIDDmodel *model, B3SOIDDinstance *here, CKTcircuit *ckt)
24 {
25 struct b3soiddSizeDependParam *pParam;
26 int Fatal_Flag = 0;
27 FILE *fplog;
28
29 NG_IGNORE(ckt);
30
31 if ((fplog = fopen("b3soiddv2check.log", "w")) != NULL)
32 { pParam = here->pParam;
33 fprintf(fplog, "B3SOI(DD)V2.1 Parameter Check\n");
34 fprintf(fplog, "Model = %s\n", model->B3SOIDDmodName);
35 fprintf(fplog, "W = %g, L = %g\n, M = %g\n", here->B3SOIDDw,
36 here->B3SOIDDl, here->B3SOIDDm);
37
38
39 if (pParam->B3SOIDDnlx < -pParam->B3SOIDDleff)
40 { fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n",
41 pParam->B3SOIDDnlx);
42 printf("Fatal: Nlx = %g is less than -Leff.\n",
43 pParam->B3SOIDDnlx);
44 Fatal_Flag = 1;
45 }
46
47 if (model->B3SOIDDtox <= 0.0)
48 { fprintf(fplog, "Fatal: Tox = %g is not positive.\n",
49 model->B3SOIDDtox);
50 printf("Fatal: Tox = %g is not positive.\n", model->B3SOIDDtox);
51 Fatal_Flag = 1;
52 }
53
54 if (model->B3SOIDDtbox <= 0.0)
55 { fprintf(fplog, "Fatal: Tbox = %g is not positive.\n",
56 model->B3SOIDDtbox);
57 printf("Fatal: Tbox = %g is not positive.\n", model->B3SOIDDtbox);
58 Fatal_Flag = 1;
59 }
60
61 if (pParam->B3SOIDDnpeak <= 0.0)
62 { fprintf(fplog, "Fatal: Nch = %g is not positive.\n",
63 pParam->B3SOIDDnpeak);
64 printf("Fatal: Nch = %g is not positive.\n",
65 pParam->B3SOIDDnpeak);
66 Fatal_Flag = 1;
67 }
68 if (pParam->B3SOIDDngate < 0.0)
69 { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n",
70 pParam->B3SOIDDngate);
71 printf("Fatal: Ngate = %g Ngate is not positive.\n",
72 pParam->B3SOIDDngate);
73 Fatal_Flag = 1;
74 }
75 if (pParam->B3SOIDDngate > 1.e25)
76 { fprintf(fplog, "Fatal: Ngate = %g is too high.\n",
77 pParam->B3SOIDDngate);
78 printf("Fatal: Ngate = %g Ngate is too high\n",
79 pParam->B3SOIDDngate);
80 Fatal_Flag = 1;
81 }
82
83 if (model->B3SOIDDdvbd1 < 0.0)
84 { fprintf(fplog, "Fatal: Dvbd1 = %g is negative.\n",
85 model->B3SOIDDdvbd1);
86 printf("Fatal: Dvbd1 = %g is negative.\n", model->B3SOIDDdvbd1);
87 Fatal_Flag = 1;
88 }
89
90 if (pParam->B3SOIDDdvt1 < 0.0)
91 { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n",
92 pParam->B3SOIDDdvt1);
93 printf("Fatal: Dvt1 = %g is negative.\n", pParam->B3SOIDDdvt1);
94 Fatal_Flag = 1;
95 }
96
97 if (pParam->B3SOIDDdvt1w < 0.0)
98 { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n",
99 pParam->B3SOIDDdvt1w);
100 printf("Fatal: Dvt1w = %g is negative.\n", pParam->B3SOIDDdvt1w);
101 Fatal_Flag = 1;
102 }
103
104 if (pParam->B3SOIDDw0 == -pParam->B3SOIDDweff)
105 { fprintf(fplog, "Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n");
106 printf("Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n");
107 Fatal_Flag = 1;
108 }
109
110 if (pParam->B3SOIDDdsub < 0.0)
111 { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->B3SOIDDdsub);
112 printf("Fatal: Dsub = %g is negative.\n", pParam->B3SOIDDdsub);
113 Fatal_Flag = 1;
114 }
115 if (pParam->B3SOIDDb1 == -pParam->B3SOIDDweff)
116 { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n");
117 printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n");
118 Fatal_Flag = 1;
119 }
120 if (pParam->B3SOIDDu0temp <= 0.0)
121 { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->B3SOIDDu0temp);
122 printf("Fatal: u0 at current temperature = %g is not positive.\n",
123 pParam->B3SOIDDu0temp);
124 Fatal_Flag = 1;
125 }
126
127 /* Check delta parameter */
128 if (pParam->B3SOIDDdelta < 0.0)
129 { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n",
130 pParam->B3SOIDDdelta);
131 printf("Fatal: Delta = %g is less than zero.\n", pParam->B3SOIDDdelta);
132 Fatal_Flag = 1;
133 }
134
135 if (pParam->B3SOIDDvsattemp <= 0.0)
136 { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->B3SOIDDvsattemp);
137 printf("Fatal: Vsat at current temperature = %g is not positive.\n",
138 pParam->B3SOIDDvsattemp);
139 Fatal_Flag = 1;
140 }
141 /* Check Rout parameters */
142 if (pParam->B3SOIDDpclm <= 0.0)
143 { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->B3SOIDDpclm);
144 printf("Fatal: Pclm = %g is not positive.\n", pParam->B3SOIDDpclm);
145 Fatal_Flag = 1;
146 }
147
148 if (pParam->B3SOIDDdrout < 0.0)
149 { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->B3SOIDDdrout);
150 printf("Fatal: Drout = %g is negative.\n", pParam->B3SOIDDdrout);
151 Fatal_Flag = 1;
152 }
153 if ( model->B3SOIDDunitLengthGateSidewallJctCap > 0.0)
154 {
155 if (here->B3SOIDDdrainPerimeter < pParam->B3SOIDDweff)
156 { fprintf(fplog, "Warning: Pd = %g is less than W.\n",
157 here->B3SOIDDdrainPerimeter);
158 printf("Warning: Pd = %g is less than W.\n",
159 here->B3SOIDDdrainPerimeter);
160 here->B3SOIDDdrainPerimeter =pParam->B3SOIDDweff;
161 }
162 if (here->B3SOIDDsourcePerimeter < pParam->B3SOIDDweff)
163 { fprintf(fplog, "Warning: Ps = %g is less than W.\n",
164 here->B3SOIDDsourcePerimeter);
165 printf("Warning: Ps = %g is less than W.\n",
166 here->B3SOIDDsourcePerimeter);
167 here->B3SOIDDsourcePerimeter =pParam->B3SOIDDweff;
168 }
169 }
170 /* Check capacitance parameters */
171 if (pParam->B3SOIDDclc < 0.0)
172 { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->B3SOIDDclc);
173 printf("Fatal: Clc = %g is negative.\n", pParam->B3SOIDDclc);
174 Fatal_Flag = 1;
175 }
176 if (model->B3SOIDDparamChk ==1)
177 {
178 /* Check L and W parameters */
179 if (pParam->B3SOIDDleff <= 5.0e-8)
180 { fprintf(fplog, "Warning: Leff = %g may be too small.\n",
181 pParam->B3SOIDDleff);
182 printf("Warning: Leff = %g may be too small.\n",
183 pParam->B3SOIDDleff);
184 }
185
186 if (pParam->B3SOIDDleffCV <= 5.0e-8)
187 { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n",
188 pParam->B3SOIDDleffCV);
189 printf("Warning: Leff for CV = %g may be too small.\n",
190 pParam->B3SOIDDleffCV);
191 }
192
193 if (pParam->B3SOIDDweff <= 1.0e-7)
194 { fprintf(fplog, "Warning: Weff = %g may be too small.\n",
195 pParam->B3SOIDDweff);
196 printf("Warning: Weff = %g may be too small.\n",
197 pParam->B3SOIDDweff);
198 }
199
200 if (pParam->B3SOIDDweffCV <= 1.0e-7)
201 { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n",
202 pParam->B3SOIDDweffCV);
203 printf("Warning: Weff for CV = %g may be too small.\n",
204 pParam->B3SOIDDweffCV);
205 }
206
207 /* Check threshold voltage parameters */
208 if (pParam->B3SOIDDnlx < 0.0)
209 { fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->B3SOIDDnlx);
210 printf("Warning: Nlx = %g is negative.\n", pParam->B3SOIDDnlx);
211 }
212 if (model->B3SOIDDtox < 1.0e-9)
213 { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n",
214 model->B3SOIDDtox);
215 printf("Warning: Tox = %g is less than 10A.\n", model->B3SOIDDtox);
216 }
217
218 if (pParam->B3SOIDDnpeak <= 1.0e15)
219 { fprintf(fplog, "Warning: Nch = %g may be too small.\n",
220 pParam->B3SOIDDnpeak);
221 printf("Warning: Nch = %g may be too small.\n",
222 pParam->B3SOIDDnpeak);
223 }
224 else if (pParam->B3SOIDDnpeak >= 1.0e21)
225 { fprintf(fplog, "Warning: Nch = %g may be too large.\n",
226 pParam->B3SOIDDnpeak);
227 printf("Warning: Nch = %g may be too large.\n",
228 pParam->B3SOIDDnpeak);
229 }
230
231 if (fabs(pParam->B3SOIDDnsub) >= 1.0e21)
232 { fprintf(fplog, "Warning: Nsub = %g may be too large.\n",
233 pParam->B3SOIDDnsub);
234 printf("Warning: Nsub = %g may be too large.\n",
235 pParam->B3SOIDDnsub);
236 }
237
238 if ((pParam->B3SOIDDngate > 0.0) &&
239 (pParam->B3SOIDDngate <= 1.e18))
240 { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n",
241 pParam->B3SOIDDngate);
242 printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n",
243 pParam->B3SOIDDngate);
244 }
245
246 if (model->B3SOIDDdvbd0 < 0.0)
247 { fprintf(fplog, "Warning: Dvbd0 = %g is negative.\n",
248 model->B3SOIDDdvbd0);
249 printf("Warning: Dvbd0 = %g is negative.\n", model->B3SOIDDdvbd0);
250 }
251
252 if (pParam->B3SOIDDdvt0 < 0.0)
253 { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n",
254 pParam->B3SOIDDdvt0);
255 printf("Warning: Dvt0 = %g is negative.\n", pParam->B3SOIDDdvt0);
256 }
257
258 if (fabs(1.0e-6 / (pParam->B3SOIDDw0 + pParam->B3SOIDDweff)) > 10.0)
259 { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n");
260 printf("Warning: (W0 + Weff) may be too small.\n");
261 }
262
263 /* Check subthreshold parameters */
264 if (pParam->B3SOIDDnfactor < 0.0)
265 { fprintf(fplog, "Warning: Nfactor = %g is negative.\n",
266 pParam->B3SOIDDnfactor);
267 printf("Warning: Nfactor = %g is negative.\n", pParam->B3SOIDDnfactor);
268 }
269 if (model->B3SOIDDkb3 < 0.0)
270 { fprintf(fplog, "Warning: Kb3 = %g is negative.\n",
271 model->B3SOIDDkb3);
272 printf("Warning: Kb3 = %g is negative.\n", model->B3SOIDDkb3);
273 }
274
275 if (pParam->B3SOIDDcdsc < 0.0)
276 { fprintf(fplog, "Warning: Cdsc = %g is negative.\n",
277 pParam->B3SOIDDcdsc);
278 printf("Warning: Cdsc = %g is negative.\n", pParam->B3SOIDDcdsc);
279 }
280 if (pParam->B3SOIDDcdscd < 0.0)
281 { fprintf(fplog, "Warning: Cdscd = %g is negative.\n",
282 pParam->B3SOIDDcdscd);
283 printf("Warning: Cdscd = %g is negative.\n", pParam->B3SOIDDcdscd);
284 }
285 /* Check DIBL parameters */
286 if (pParam->B3SOIDDeta0 < 0.0)
287 { fprintf(fplog, "Warning: Eta0 = %g is negative.\n",
288 pParam->B3SOIDDeta0);
289 printf("Warning: Eta0 = %g is negative.\n", pParam->B3SOIDDeta0);
290 }
291
292 /* Check Abulk parameters */
293 if (fabs(1.0e-6 / (pParam->B3SOIDDb1 + pParam->B3SOIDDweff)) > 10.0)
294 { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n");
295 printf("Warning: (B1 + Weff) may be too small.\n");
296 }
297
298 if (model->B3SOIDDadice0 > 1.0)
299 { fprintf(fplog, "Warning: Adice0 = %g should be smaller than 1.\n",
300 model->B3SOIDDadice0);
301 printf("Warning: Adice0 = %g should be smaller than 1.\n", model->B3SOIDDadice0);
302 }
303
304 if (model->B3SOIDDabp < 0.2)
305 { fprintf(fplog, "Warning: Abp = %g is too small.\n",
306 model->B3SOIDDabp);
307 printf("Warning: Abp = %g is too small.\n", model->B3SOIDDabp);
308 }
309
310 if ((model->B3SOIDDmxc < -1.0) || (model->B3SOIDDmxc > 1.0))
311 { fprintf(fplog, "Warning: Mxc = %g should be within (-1, 1).\n",
312 model->B3SOIDDmxc);
313 printf("Warning: Mxc = %g should be within (-1, 1).\n", model->B3SOIDDmxc);
314 }
315
316 /* Check Saturation parameters */
317 if (pParam->B3SOIDDa2 < 0.01)
318 { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->B3SOIDDa2);
319 printf("Warning: A2 = %g is too small. Set to 0.01.\n",
320 pParam->B3SOIDDa2);
321 pParam->B3SOIDDa2 = 0.01;
322 }
323 else if (pParam->B3SOIDDa2 > 1.0)
324 { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
325 pParam->B3SOIDDa2);
326 printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n",
327 pParam->B3SOIDDa2);
328 pParam->B3SOIDDa2 = 1.0;
329 pParam->B3SOIDDa1 = 0.0;
330
331 }
332
333 if (pParam->B3SOIDDrdsw < 0.0)
334 { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n",
335 pParam->B3SOIDDrdsw);
336 printf("Warning: Rdsw = %g is negative. Set to zero.\n",
337 pParam->B3SOIDDrdsw);
338 pParam->B3SOIDDrdsw = 0.0;
339 pParam->B3SOIDDrds0 = 0.0;
340 }
341 else if ((pParam->B3SOIDDrds0 > 0.0) && (pParam->B3SOIDDrds0 < 0.001))
342 { fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n",
343 pParam->B3SOIDDrds0);
344 printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n",
345 pParam->B3SOIDDrds0);
346 pParam->B3SOIDDrds0 = 0.0;
347 }
348 if (pParam->B3SOIDDvsattemp < 1.0e3)
349 { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->B3SOIDDvsattemp);
350 printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->B3SOIDDvsattemp);
351 }
352
353 if (pParam->B3SOIDDpdibl1 < 0.0)
354 { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n",
355 pParam->B3SOIDDpdibl1);
356 printf("Warning: Pdibl1 = %g is negative.\n", pParam->B3SOIDDpdibl1);
357 }
358 if (pParam->B3SOIDDpdibl2 < 0.0)
359 { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n",
360 pParam->B3SOIDDpdibl2);
361 printf("Warning: Pdibl2 = %g is negative.\n", pParam->B3SOIDDpdibl2);
362 }
363 /* Check overlap capacitance parameters */
364 if (model->B3SOIDDcgdo < 0.0)
365 { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->B3SOIDDcgdo);
366 printf("Warning: cgdo = %g is negative. Set to zero.\n", model->B3SOIDDcgdo);
367 model->B3SOIDDcgdo = 0.0;
368 }
369 if (model->B3SOIDDcgso < 0.0)
370 { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->B3SOIDDcgso);
371 printf("Warning: cgso = %g is negative. Set to zero.\n", model->B3SOIDDcgso);
372 model->B3SOIDDcgso = 0.0;
373 }
374 if (model->B3SOIDDcgeo < 0.0)
375 { fprintf(fplog, "Warning: cgeo = %g is negative. Set to zero.\n", model->B3SOIDDcgeo);
376 printf("Warning: cgeo = %g is negative. Set to zero.\n", model->B3SOIDDcgeo);
377 model->B3SOIDDcgeo = 0.0;
378 }
379
380 if (model->B3SOIDDntun < 0.0)
381 { fprintf(fplog, "Warning: Ntun = %g is negative.\n",
382 model->B3SOIDDntun);
383 printf("Warning: Ntun = %g is negative.\n", model->B3SOIDDntun);
384 }
385
386 if (model->B3SOIDDndiode < 0.0)
387 { fprintf(fplog, "Warning: Ndiode = %g is negative.\n",
388 model->B3SOIDDndiode);
389 printf("Warning: Ndiode = %g is negative.\n", model->B3SOIDDndiode);
390 }
391
392 if (model->B3SOIDDisbjt < 0.0)
393 { fprintf(fplog, "Warning: Isbjt = %g is negative.\n",
394 model->B3SOIDDisbjt);
395 printf("Warning: Isbjt = %g is negative.\n", model->B3SOIDDisbjt);
396 }
397
398 if (model->B3SOIDDisdif < 0.0)
399 { fprintf(fplog, "Warning: Isdif = %g is negative.\n",
400 model->B3SOIDDisdif);
401 printf("Warning: Isdif = %g is negative.\n", model->B3SOIDDisdif);
402 }
403
404 if (model->B3SOIDDisrec < 0.0)
405 { fprintf(fplog, "Warning: Isrec = %g is negative.\n",
406 model->B3SOIDDisrec);
407 printf("Warning: Isrec = %g is negative.\n", model->B3SOIDDisrec);
408 }
409
410 if (model->B3SOIDDistun < 0.0)
411 { fprintf(fplog, "Warning: Istun = %g is negative.\n",
412 model->B3SOIDDistun);
413 printf("Warning: Istun = %g is negative.\n", model->B3SOIDDistun);
414 }
415
416 if (model->B3SOIDDedl < 0.0)
417 { fprintf(fplog, "Warning: Edl = %g is negative.\n",
418 model->B3SOIDDedl);
419 printf("Warning: Edl = %g is negative.\n", model->B3SOIDDedl);
420 }
421
422 if (model->B3SOIDDkbjt1 < 0.0)
423 { fprintf(fplog, "Warning: Kbjt1 = %g is negative.\n",
424 model->B3SOIDDkbjt1);
425 printf("Warning: kbjt1 = %g is negative.\n", model->B3SOIDDkbjt1);
426 }
427
428 if (model->B3SOIDDtt < 0.0)
429 { fprintf(fplog, "Warning: Tt = %g is negative.\n",
430 model->B3SOIDDtt);
431 printf("Warning: Tt = %g is negative.\n", model->B3SOIDDtt);
432 }
433
434 if (model->B3SOIDDcsdmin < 0.0)
435 { fprintf(fplog, "Warning: Csdmin = %g is negative.\n",
436 model->B3SOIDDcsdmin);
437 printf("Warning: Csdmin = %g is negative.\n", model->B3SOIDDcsdmin);
438 }
439
440 if (model->B3SOIDDcsdesw < 0.0)
441 { fprintf(fplog, "Warning: Csdesw = %g is negative.\n",
442 model->B3SOIDDcsdesw);
443 printf("Warning: Csdesw = %g is negative.\n", model->B3SOIDDcsdesw);
444 }
445
446 if ((model->B3SOIDDasd < 0.0) || (model->B3SOIDDmxc > 1.0))
447 { fprintf(fplog, "Warning: Asd = %g should be within (0, 1).\n",
448 model->B3SOIDDasd);
449 printf("Warning: Asd = %g should be within (0, 1).\n", model->B3SOIDDasd);
450 }
451
452 if (model->B3SOIDDrth0 < 0.0)
453 { fprintf(fplog, "Warning: Rth0 = %g is negative.\n",
454 model->B3SOIDDrth0);
455 printf("Warning: Rth0 = %g is negative.\n", model->B3SOIDDrth0);
456 }
457
458 if (model->B3SOIDDcth0 < 0.0)
459 { fprintf(fplog, "Warning: Cth0 = %g is negative.\n",
460 model->B3SOIDDcth0);
461 printf("Warning: Cth0 = %g is negative.\n", model->B3SOIDDcth0);
462 }
463
464 if (model->B3SOIDDrbody < 0.0)
465 { fprintf(fplog, "Warning: Rbody = %g is negative.\n",
466 model->B3SOIDDrbody);
467 printf("Warning: Rbody = %g is negative.\n", model->B3SOIDDrbody);
468 }
469
470 if (model->B3SOIDDrbsh < 0.0)
471 { fprintf(fplog, "Warning: Rbsh = %g is negative.\n",
472 model->B3SOIDDrbsh);
473 printf("Warning: Rbsh = %g is negative.\n", model->B3SOIDDrbsh);
474 }
475
476 if (model->B3SOIDDxj > model->B3SOIDDtsi)
477 { fprintf(fplog, "Warning: Xj = %g is thicker than Tsi = %g.\n",
478 model->B3SOIDDxj, model->B3SOIDDtsi);
479 printf("Warning: Xj = %g is thicker than Tsi = %g.\n",
480 model->B3SOIDDxj, model->B3SOIDDtsi);
481 }
482
483 if (model->B3SOIDDcapMod < 2)
484 { fprintf(fplog, "Warning: capMod < 2 is not supported by BSIM3SOI.\n");
485 printf("Warning: Warning: capMod < 2 is not supported by BSIM3SOI.\n");
486 }
487
488 if (model->B3SOIDDcii > 2.0)
489 { fprintf(fplog, "Warning: Cii = %g is larger than 2.0.\n", model->B3SOIDDcii);
490 printf("Warning: Cii = %g is larger than 2.0.\n", model->B3SOIDDcii);
491 }
492
493 if (model->B3SOIDDdii > 1.5)
494 { fprintf(fplog, "Warning: Dii = %g is larger than 1.5.\n", model->B3SOIDDcii);
495 printf("Warning: Dii = %g is too larger than 1.5.\n", model->B3SOIDDcii);
496 }
497
498 }/* loop for the parameter check for warning messages */
499 fclose(fplog);
500 }
501 else
502 { fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n");
503 }
504
505 return(Fatal_Flag);
506 }
507
508