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