1 /* ******************************************************************************
2 * BSIM4 4.8.1 released by Chetan Kumar Dabhi 2/15/2017 *
3 * BSIM4 Model Equations *
4 ******************************************************************************
5
6 ******************************************************************************
7 * Copyright 2017 Regents of the University of California. *
8 * All rights reserved. *
9 * *
10 * Project Director: Prof. Chenming Hu. *
11 * Authors: Gary W. Ng, Weidong Liu, Xuemei Xi, Mohan Dunga, Wenwei Yang *
12 * Ali Niknejad, Shivendra Singh Parihar, Chetan Kumar Dabhi *
13 * Yogesh Singh Chauhan, Sayeef Salahuddin, Chenming Hu *
14 ******************************************************************************
15
16 ******************************************************************************
17 * CMC In-Code Statement *
18 * *
19 * The Developer agrees that the following statement will appear in the *
20 * model code that has been adopted as a CMC Standard. *
21 * *
22 * Software is distributed as is, completely without warranty or service *
23 * support. The University of California and its employees are not liable *
24 * for the condition or performance of the software. *
25 * *
26 * The University of California owns the copyright and grants users a *
27 * perpetual, irrevocable, worldwide, non-exclusive, royalty-free license *
28 * with respect to the software as set forth below. *
29 * *
30 * The University of California hereby disclaims all implied warranties. *
31 * *
32 * The University of California grants the users the right to modify, *
33 * copy, and redistribute the software and documentation, both within *
34 * the user's organization and externally, subject to the following *
35 * restrictions: *
36 * *
37 * 1. The users agree not to charge for the University of California code *
38 * itself but may charge for additions, extensions, or support. *
39 * *
40 * 2. In any product based on the software, the users agree to *
41 * acknowledge the University of California that developed the *
42 * software. This acknowledgment shall appear in the product *
43 * documentation. *
44 * *
45 * 3. Redistributions to others of source code and documentation must *
46 * retain the copyright notice, disclaimer, and list of conditions. *
47 * *
48 * 4. Redistributions to others in binary form must reproduce the *
49 * copyright notice, disclaimer, and list of conditions in the *
50 * documentation and/or other materials provided with the *
51 * distribution. *
52 * *
53 * Agreed to on ______Feb. 15, 2017______________ *
54 * *
55 * By: ____University of California, Berkeley___ *
56 * ____Chenming Hu__________________________ *
57 * ____Professor in Graduate School ________ *
58 * *
59 ****************************************************************************** */
60
61 #include "ngspice/ngspice.h"
62 #include "ngspice/ifsim.h"
63 #include "ngspice/cktdefs.h"
64 #include "ngspice/devdefs.h"
65 #include "bsim4def.h"
66 #include "ngspice/sperror.h"
67 #include "ngspice/suffix.h"
68
69 int
BSIM4ask(CKTcircuit * ckt,GENinstance * inst,int which,IFvalue * value,IFvalue * select)70 BSIM4ask(
71 CKTcircuit *ckt,
72 GENinstance *inst,
73 int which,
74 IFvalue *value,
75 IFvalue *select)
76 {
77 BSIM4instance *here = (BSIM4instance*)inst;
78
79 NG_IGNORE(select);
80
81 switch(which)
82 { case BSIM4_L:
83 value->rValue = here->BSIM4l;
84 return(OK);
85 case BSIM4_W:
86 value->rValue = here->BSIM4w;
87 return(OK);
88 case BSIM4_M:
89 value->rValue = here->BSIM4m;
90 return(OK);
91 case BSIM4_NF:
92 value->rValue = here->BSIM4nf;
93 return(OK);
94 case BSIM4_MIN:
95 value->iValue = here->BSIM4min;
96 return(OK);
97 case BSIM4_AS:
98 value->rValue = here->BSIM4sourceArea;
99 return(OK);
100 case BSIM4_AD:
101 value->rValue = here->BSIM4drainArea;
102 return(OK);
103 case BSIM4_PS:
104 value->rValue = here->BSIM4sourcePerimeter;
105 return(OK);
106 case BSIM4_PD:
107 value->rValue = here->BSIM4drainPerimeter;
108 return(OK);
109 case BSIM4_NRS:
110 value->rValue = here->BSIM4sourceSquares;
111 return(OK);
112 case BSIM4_NRD:
113 value->rValue = here->BSIM4drainSquares;
114 return(OK);
115 case BSIM4_OFF:
116 value->rValue = here->BSIM4off;
117 return(OK);
118 case BSIM4_SA:
119 value->rValue = here->BSIM4sa ;
120 return(OK);
121 case BSIM4_SB:
122 value->rValue = here->BSIM4sb ;
123 return(OK);
124 case BSIM4_SD:
125 value->rValue = here->BSIM4sd ;
126 return(OK);
127 case BSIM4_SCA:
128 value->rValue = here->BSIM4sca ;
129 return(OK);
130 case BSIM4_SCB:
131 value->rValue = here->BSIM4scb ;
132 return(OK);
133 case BSIM4_SCC:
134 value->rValue = here->BSIM4scc ;
135 return(OK);
136 case BSIM4_SC:
137 value->rValue = here->BSIM4sc ;
138 return(OK);
139
140 case BSIM4_RBSB:
141 value->rValue = here->BSIM4rbsb;
142 return(OK);
143 case BSIM4_RBDB:
144 value->rValue = here->BSIM4rbdb;
145 return(OK);
146 case BSIM4_RBPB:
147 value->rValue = here->BSIM4rbpb;
148 return(OK);
149 case BSIM4_RBPS:
150 value->rValue = here->BSIM4rbps;
151 return(OK);
152 case BSIM4_RBPD:
153 value->rValue = here->BSIM4rbpd;
154 return(OK);
155 case BSIM4_DELVTO:
156 value->rValue = here->BSIM4delvto;
157 return(OK);
158 case BSIM4_MULU0:
159 value->rValue = here->BSIM4mulu0;
160 return(OK);
161 case BSIM4_WNFLAG:
162 value->iValue = here->BSIM4wnflag;
163 return(OK);
164 case BSIM4_XGW:
165 value->rValue = here->BSIM4xgw;
166 return(OK);
167 case BSIM4_NGCON:
168 value->rValue = here->BSIM4ngcon;
169 return(OK);
170 case BSIM4_TRNQSMOD:
171 value->iValue = here->BSIM4trnqsMod;
172 return(OK);
173 case BSIM4_ACNQSMOD:
174 value->iValue = here->BSIM4acnqsMod;
175 return(OK);
176 case BSIM4_RBODYMOD:
177 value->iValue = here->BSIM4rbodyMod;
178 return(OK);
179 case BSIM4_RGATEMOD:
180 value->iValue = here->BSIM4rgateMod;
181 return(OK);
182 case BSIM4_GEOMOD:
183 value->iValue = here->BSIM4geoMod;
184 return(OK);
185 case BSIM4_RGEOMOD:
186 value->iValue = here->BSIM4rgeoMod;
187 return(OK);
188 case BSIM4_IC_VDS:
189 value->rValue = here->BSIM4icVDS;
190 return(OK);
191 case BSIM4_IC_VGS:
192 value->rValue = here->BSIM4icVGS;
193 return(OK);
194 case BSIM4_IC_VBS:
195 value->rValue = here->BSIM4icVBS;
196 return(OK);
197 case BSIM4_DNODE:
198 value->iValue = here->BSIM4dNode;
199 return(OK);
200 case BSIM4_GNODEEXT:
201 value->iValue = here->BSIM4gNodeExt;
202 return(OK);
203 case BSIM4_SNODE:
204 value->iValue = here->BSIM4sNode;
205 return(OK);
206 case BSIM4_BNODE:
207 value->iValue = here->BSIM4bNode;
208 return(OK);
209 case BSIM4_DNODEPRIME:
210 value->iValue = here->BSIM4dNodePrime;
211 return(OK);
212 case BSIM4_GNODEPRIME:
213 value->iValue = here->BSIM4gNodePrime;
214 return(OK);
215 case BSIM4_GNODEMID:
216 value->iValue = here->BSIM4gNodeMid;
217 return(OK);
218 case BSIM4_SNODEPRIME:
219 value->iValue = here->BSIM4sNodePrime;
220 return(OK);
221 case BSIM4_DBNODE:
222 value->iValue = here->BSIM4dbNode;
223 return(OK);
224 case BSIM4_BNODEPRIME:
225 value->iValue = here->BSIM4bNodePrime;
226 return(OK);
227 case BSIM4_SBNODE:
228 value->iValue = here->BSIM4sbNode;
229 return(OK);
230 case BSIM4_SOURCECONDUCT:
231 value->rValue = here->BSIM4sourceConductance;
232 value->rValue *= here->BSIM4m;
233 return(OK);
234 case BSIM4_DRAINCONDUCT:
235 value->rValue = here->BSIM4drainConductance;
236 value->rValue *= here->BSIM4m;
237 return(OK);
238 case BSIM4_VBD:
239 value->rValue = *(ckt->CKTstate0 + here->BSIM4vbd);
240 return(OK);
241 case BSIM4_VBS:
242 value->rValue = *(ckt->CKTstate0 + here->BSIM4vbs);
243 return(OK);
244 case BSIM4_VGS:
245 value->rValue = *(ckt->CKTstate0 + here->BSIM4vgs);
246 return(OK);
247 case BSIM4_VDS:
248 value->rValue = *(ckt->CKTstate0 + here->BSIM4vds);
249 return(OK);
250 case BSIM4_CD:
251 value->rValue = here->BSIM4cd;
252 value->rValue *= here->BSIM4m;
253 return(OK);
254 case BSIM4_CBS:
255 value->rValue = here->BSIM4cbs;
256 value->rValue *= here->BSIM4m;
257 return(OK);
258 case BSIM4_CBD:
259 value->rValue = here->BSIM4cbd;
260 value->rValue *= here->BSIM4m;
261 return(OK);
262 case BSIM4_CSUB:
263 value->rValue = here->BSIM4csub;
264 value->rValue *= here->BSIM4m;
265 return(OK);
266 case BSIM4_QINV:
267 value->rValue = here-> BSIM4qinv;
268 value->rValue *= here->BSIM4m;
269 return(OK);
270 case BSIM4_IGIDL:
271 value->rValue = here->BSIM4Igidl;
272 value->rValue *= here->BSIM4m;
273 return(OK);
274 case BSIM4_IGISL:
275 value->rValue = here->BSIM4Igisl;
276 value->rValue *= here->BSIM4m;
277 return(OK);
278 case BSIM4_IGS:
279 value->rValue = here->BSIM4Igs;
280 value->rValue *= here->BSIM4m;
281 return(OK);
282 case BSIM4_IGD:
283 value->rValue = here->BSIM4Igd;
284 value->rValue *= here->BSIM4m;
285 return(OK);
286 case BSIM4_IGB:
287 value->rValue = here->BSIM4Igb;
288 value->rValue *= here->BSIM4m;
289 return(OK);
290 case BSIM4_IGCS:
291 value->rValue = here->BSIM4Igcs;
292 value->rValue *= here->BSIM4m;
293 return(OK);
294 case BSIM4_IGCD:
295 value->rValue = here->BSIM4Igcd;
296 value->rValue *= here->BSIM4m;
297 return(OK);
298 case BSIM4_GM:
299 value->rValue = here->BSIM4gm;
300 value->rValue *= here->BSIM4m;
301 return(OK);
302 case BSIM4_GDS:
303 value->rValue = here->BSIM4gds;
304 value->rValue *= here->BSIM4m;
305 return(OK);
306 case BSIM4_GMBS:
307 value->rValue = here->BSIM4gmbs;
308 value->rValue *= here->BSIM4m;
309 return(OK);
310 case BSIM4_GBD:
311 value->rValue = here->BSIM4gbd;
312 value->rValue *= here->BSIM4m;
313 return(OK);
314 case BSIM4_GBS:
315 value->rValue = here->BSIM4gbs;
316 value->rValue *= here->BSIM4m;
317 return(OK);
318 /* case BSIM4_QB:
319 value->rValue = *(ckt->CKTstate0 + here->BSIM4qb);
320 return(OK); */
321 case BSIM4_CQB:
322 value->rValue = *(ckt->CKTstate0 + here->BSIM4cqb);
323 return(OK);
324 /* case BSIM4_QG:
325 value->rValue = *(ckt->CKTstate0 + here->BSIM4qg);
326 return(OK); */
327 case BSIM4_CQG:
328 value->rValue = *(ckt->CKTstate0 + here->BSIM4cqg);
329 return(OK);
330 /* case BSIM4_QD:
331 value->rValue = *(ckt->CKTstate0 + here->BSIM4qd);
332 return(OK); */
333 case BSIM4_CQD:
334 value->rValue = *(ckt->CKTstate0 + here->BSIM4cqd);
335 return(OK);
336 /* case BSIM4_QS:
337 value->rValue = *(ckt->CKTstate0 + here->BSIM4qs);
338 return(OK); */
339 case BSIM4_QB:
340 value->rValue = here->BSIM4qbulk;
341 value->rValue *= here->BSIM4m;
342 return(OK);
343 case BSIM4_QG:
344 value->rValue = here->BSIM4qgate;
345 value->rValue *= here->BSIM4m;
346 return(OK);
347 case BSIM4_QS:
348 value->rValue = here->BSIM4qsrc;
349 value->rValue *= here->BSIM4m;
350 return(OK);
351 case BSIM4_QD:
352 value->rValue = here->BSIM4qdrn;
353 value->rValue *= here->BSIM4m;
354 return(OK);
355 case BSIM4_QDEF:
356 value->rValue = *(ckt->CKTstate0 + here->BSIM4qdef);
357 return(OK);
358 case BSIM4_GCRG:
359 value->rValue = here->BSIM4gcrg;
360 value->rValue *= here->BSIM4m;
361 return(OK);
362 case BSIM4_GTAU:
363 value->rValue = here->BSIM4gtau;
364 value->rValue *= here->BSIM4m;
365 return(OK);
366 case BSIM4_CGGB:
367 value->rValue = here->BSIM4cggb;
368 value->rValue *= here->BSIM4m;
369 return(OK);
370 case BSIM4_CGDB:
371 value->rValue = here->BSIM4cgdb;
372 value->rValue *= here->BSIM4m;
373 return(OK);
374 case BSIM4_CGSB:
375 value->rValue = here->BSIM4cgsb;
376 value->rValue *= here->BSIM4m;
377 return(OK);
378 case BSIM4_CDGB:
379 value->rValue = here->BSIM4cdgb;
380 value->rValue *= here->BSIM4m;
381 return(OK);
382 case BSIM4_CDDB:
383 value->rValue = here->BSIM4cddb;
384 value->rValue *= here->BSIM4m;
385 return(OK);
386 case BSIM4_CDSB:
387 value->rValue = here->BSIM4cdsb;
388 value->rValue *= here->BSIM4m;
389 return(OK);
390 case BSIM4_CBGB:
391 value->rValue = here->BSIM4cbgb;
392 value->rValue *= here->BSIM4m;
393 return(OK);
394 case BSIM4_CBDB:
395 value->rValue = here->BSIM4cbdb;
396 value->rValue *= here->BSIM4m;
397 return(OK);
398 case BSIM4_CBSB:
399 value->rValue = here->BSIM4cbsb;
400 value->rValue *= here->BSIM4m;
401 return(OK);
402 case BSIM4_CSGB:
403 value->rValue = here->BSIM4csgb;
404 value->rValue *= here->BSIM4m;
405 return(OK);
406 case BSIM4_CSDB:
407 value->rValue = here->BSIM4csdb;
408 value->rValue *= here->BSIM4m;
409 return(OK);
410 case BSIM4_CSSB:
411 value->rValue = here->BSIM4cssb;
412 value->rValue *= here->BSIM4m;
413 return(OK);
414 case BSIM4_CGBB:
415 value->rValue = here->BSIM4cgbb;
416 value->rValue *= here->BSIM4m;
417 return(OK);
418 case BSIM4_CDBB:
419 value->rValue = here->BSIM4cdbb;
420 value->rValue *= here->BSIM4m;
421 return(OK);
422 case BSIM4_CSBB:
423 value->rValue = here->BSIM4csbb;
424 value->rValue *= here->BSIM4m;
425 return(OK);
426 case BSIM4_CBBB:
427 value->rValue = here->BSIM4cbbb;
428 value->rValue *= here->BSIM4m;
429 return(OK);
430 case BSIM4_CAPBD:
431 value->rValue = here->BSIM4capbd;
432 value->rValue *= here->BSIM4m;
433 return(OK);
434 case BSIM4_CAPBS:
435 value->rValue = here->BSIM4capbs;
436 value->rValue *= here->BSIM4m;
437 return(OK);
438 case BSIM4_VON:
439 value->rValue = here->BSIM4von;
440 return(OK);
441 case BSIM4_VDSAT:
442 value->rValue = here->BSIM4vdsat;
443 return(OK);
444 case BSIM4_QBS:
445 value->rValue = *(ckt->CKTstate0 + here->BSIM4qbs);
446 return(OK);
447 case BSIM4_QBD:
448 value->rValue = *(ckt->CKTstate0 + here->BSIM4qbd);
449 return(OK);
450 default:
451 return(E_BADPARM);
452 }
453 /* NOTREACHED */
454 }
455
456