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