Xyce  6.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
N_DEV_MOSFET_B4.C
Go to the documentation of this file.
1 //-----------------------------------------------------------------------------
2 // Copyright Notice
3 //
4 // Copyright 2002 Sandia Corporation. Under the terms
5 // of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S.
6 // Government retains certain rights in this software.
7 //
8 // Xyce(TM) Parallel Electrical Simulator
9 // Copyright (C) 2002-2014 Sandia Corporation
10 //
11 // This program is free software: you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation, either version 3 of the License, or
14 // (at your option) any later version.
15 //
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU General Public License
22 // along with this program. If not, see <http://www.gnu.org/licenses/>.
23 //-----------------------------------------------------------------------------
24 
25 //-------------------------------------------------------------------------
26 // Filename : $RCSfile: N_DEV_MOSFET_B4.C,v $
27 //
28 // Purpose : This file implements the BSIM4 MOSFET model. It
29 // is intended to be compatible with the Berkeley SPICE
30 // (3f5) version, BSIM4 version 4.6.1
31 //
32 // Special Notes : Updated from BSIM 4.5.0 to version 4.6.1 by TVR, August 07
33 //
34 //
35 // Creator : Eric R. Keiter, SNL, Electrical and Microsystems Modeling
36 //
37 // Creation Date : 11/25/06
38 //
39 // Revision Information:
40 // ---------------------
41 //
42 // Revision Number: $Revision: 1.103 $
43 //
44 //
45 // Current Owner : $Author: erkeite $
46 //-------------------------------------------------------------------------
47 
48 #include <Xyce_config.h>
49 
50 
51 // ---------- Standard Includes ----------
52 
53 #ifdef HAVE_CSTDIO
54 #include <cstdio>
55 #else
56 #include <stdio.h>
57 #endif
58 
59 #ifdef HAVE_CMATH
60 #include <cmath>
61 #else
62 #include <math.h>
63 #endif
64 
65 // ---------- Xyce Includes ----------
66 #include <N_DEV_Const.h>
67 
68 #include <N_DEV_DeviceOptions.h>
69 #include <N_DEV_ExternData.h>
70 #include <N_DEV_MOSFET_B4.h>
71 #include <N_DEV_MatrixLoadData.h>
72 #include <N_DEV_SolverState.h>
73 #include <N_DEV_Message.h>
74 #include <N_ERH_ErrorMgr.h>
75 
76 #include <N_DEV_MOSFET1.h>
77 
78 #include <N_LAS_Matrix.h>
79 #include <N_LAS_Vector.h>
80 
81 // ---------- BSIM4 constants ---------------
82 // Many constants are obtained from N_DEV_Const.h
83 // A few overrides (2) are below, to make this device as close
84 // to the original spice3f5 code as possible.
85 
86 #define CONSTEPS0 8.85418e-12
87 #if 0
88 #define CONSTMAX_EXP 5.834617425e+14
89 #define CONSTMIN_EXP 1.713908431e-15
90 
91 #define CONSTEXP_THRESHOLD 34.0
92 
93 #define CONSTDELTA_1 0.02
94 #define CONSTDELTA_2 0.02
95 #define CONSTDELTA_3 0.02
96 #define CONSTDELTA_4 0.02
97 #endif
98 
99 #define Charge_q (1.60219e-19) // electron charge, used in the
100  // updateTemperature function instead of
101  // of CONSTQ. Having 2 constants for
102  // the same quantity (with different
103  // precision) doesn't make sense, but
104  // it is what is in the spice3f5 bsim4.
105 
106 #define CONSTKboQ 8.617087e-5 // another updateTemperature constant, which is
107  // not really necessary but I am keeping for
108  // compatibility with the spice3f5 bsim4.
109 
110 #define CONSTvt0 (CONSTboltz * (27.0 +CONSTCtoK)/CONSTQ)
111 
112 #define CONSTMM 3 // smooth coeff
113 
114 #define DEXP(A,B,C) { \
115  if (A > CONSTEXP_THRESHOLD) { \
116  B = CONSTMAX_EXP*(1.0+(A)-CONSTEXP_THRESHOLD); \
117  C = CONSTMAX_EXP; \
118  } else if (A < -CONSTEXP_THRESHOLD) { \
119  B = CONSTMIN_EXP; \
120  C = 0; \
121  } else { \
122  B = exp(A); \
123  C = B; \
124  } \
125  }
126 
127 
128 #define DELTA 1.0E-9
129 #define DEXP2(A,B) { \
130  if (A > CONSTEXP_THRESHOLD) { \
131  B = CONSTMAX_EXP*(1.0+(A)-CONSTEXP_THRESHOLD); \
132  } else if (A < -CONSTEXP_THRESHOLD) { \
133  B = CONSTMIN_EXP; \
134  } else { \
135  B = exp(A); \
136  } \
137  }
138 
139 namespace Xyce {
140 namespace Device {
141 
142 
143 namespace MOSFET_B4 {
144 
145 
147 {
148 // Set up double precision variables:
149  p.addPar ("TEMP", 0.0, false, ParameterType::TIME_DEP,
151  NULL, STANDARD, CAT_NONE, "Device temperature");
152 
153  p.addPar ("L", 5.0e-6, false, ParameterType::NO_DEP,
155  NULL, U_NONE, CAT_NONE, "Length");
156 
157  p.addPar ("W", 5.0e-6, false, ParameterType::NO_DEP,
159  NULL, U_NONE, CAT_NONE, "Width");
160 
161  p.addPar ("NF", 1.0, false, ParameterType::NO_DEP,
163  NULL, U_NONE, CAT_NONE, "Number of fingers");
164 
165  p.addPar ("SA", 0.0, false, ParameterType::NO_DEP,
167  NULL, U_NONE, CAT_NONE, "distance between OD edge to poly of one side ");
168 
169  p.addPar ("SB", 0.0, false, ParameterType::NO_DEP,
171  NULL, U_NONE, CAT_NONE, "distance between OD edge to poly of the other side");
172 
173  p.addPar ("SD", 0.0, false, ParameterType::NO_DEP,
175  NULL, U_NONE, CAT_NONE, "distance between neighbour fingers");
176 
177  p.addPar ("SCA", 0.0, false, ParameterType::NO_DEP,
180  U_NONE, CAT_NONE, "Integral of the first distribution function for scattered well dopant");
181 
182  p.addPar ("SCB", 0.0, false, ParameterType::NO_DEP,
185  U_NONE, CAT_NONE, "Integral of the second distribution function for scattered well dopant");
186 
187  p.addPar ("SCC", 0.0, false, ParameterType::NO_DEP,
190  U_NONE, CAT_NONE, "Integral of the third distribution function for scattered well dopant");
191 
192  p.addPar ("SC", 0.0, false, ParameterType::NO_DEP,
195  U_NONE, CAT_NONE, "Distance to a single well edge ");
196 
197 
198  p.addPar ("AD", 0.0, false, ParameterType::NO_DEP,
201  U_NONE, CAT_NONE, "Drain area");
202 
203  p.addPar ("AS", 0.0, false, ParameterType::NO_DEP,
206  U_NONE, CAT_NONE, "Source area");
207 
208  p.addPar ("PD", 0.0, false, ParameterType::NO_DEP,
211  U_NONE, CAT_NONE, "Drain perimeter");
212 
213 
214  p.addPar ("PS", 0.0, false, ParameterType::NO_DEP,
217  U_NONE, CAT_NONE, "Source perimeter");
218 
219  p.addPar ("NRD", 1.0, false, ParameterType::NO_DEP,
222  U_NONE, CAT_ASYMRDS, "Number of squares in drain");
223 
224  p.addPar ("NRS", 1.0, false, ParameterType::NO_DEP,
227  U_NONE, CAT_ASYMRDS, "Number of squares in source");
228 
229 
230  p.addPar ("RBDB", 0.0, false, ParameterType::NO_DEP,
232  NULL, U_NONE, CAT_NONE, "Body resistance");
233 
234  p.addPar ("RBSB", 0.0, false, ParameterType::NO_DEP,
236  NULL, U_NONE, CAT_NONE, "Body resistance");
237 
238  p.addPar ("RBPB", 0.0, false, ParameterType::NO_DEP,
240  NULL, U_NONE, CAT_NONE, "Body resistance");
241 
242  p.addPar ("RBPS", 0.0, false, ParameterType::NO_DEP,
244  NULL, U_NONE, CAT_NONE, "Body resistance");
245 
246  p.addPar ("RBPD", 0.0, false, ParameterType::NO_DEP,
248  NULL, U_NONE, CAT_NONE, "Body resistance");
249 
250  p.addPar ("DELVTO", 0.0, false, ParameterType::NO_DEP,
252  NULL, U_VOLT, CAT_BASIC, "Zero bias threshold voltage variation");
253 
254  p.addPar ("XGW", 0.0, false, ParameterType::NO_DEP,
256  NULL, U_NONE, CAT_NONE, "Distance from gate contact center to device edge");
257 
258  p.addPar ("NGCON", 0.0, false, ParameterType::NO_DEP,
260  NULL, U_NONE, CAT_NONE, "Number of gate contacts");
261 
262  p.addPar ("M", 1.0, false, ParameterType::NO_DEP,
264  NULL, U_NONE, CAT_NONE, "Number of parallel copies");
265 
266  p.addPar ("IC1", 0.0, false, ParameterType::NO_DEP,
269  U_VOLT, CAT_VOLT, "Vector of initial values: Vds, Vgs, Vbs");
270 
271  p.addPar ("IC2", 0.0, false, ParameterType::NO_DEP,
274  U_NONE, CAT_NONE, "");
275 
276  p.addPar ("IC3", 0.0, false, ParameterType::NO_DEP,
279  U_NONE, CAT_NONE, "");
280 
281  // Set up non-double precision variables:
282  p.addPar ("TRNQSMOD", 0, false, ParameterType::NO_DEP,
284  U_NONE, CAT_CONTROL, "Transient NQS model selector");
285 
286  p.addPar ("ACNQSMOD", 0, false, ParameterType::NO_DEP,
288  U_NONE, CAT_CONTROL, "AC NQS model selector");
289 
290  p.addPar ("RBODYMOD", 0, false, ParameterType::NO_DEP,
292  U_NONE, CAT_CONTROL, "Distributed body R model selector");
293 
294  p.addPar ("RGATEMOD", 0, false, ParameterType::NO_DEP,
296  U_NONE, CAT_CONTROL, "Gate resistance model selector");
297 
298  p.addPar ("GEOMOD", 0, false, ParameterType::NO_DEP,
300  U_NONE, CAT_CONTROL, "Geometry dependent parasitics model selector");
301 
302  p.addPar ("RGEOMOD", 0, false, ParameterType::NO_DEP,
304  U_NONE, CAT_CONTROL, "S/D resistance and contact model selector");
305 
306  p.addPar ("MIN", 0, false, ParameterType::NO_DEP,
308  U_NONE, CAT_NONE, "Minimize either D or S");
309 
310  p.addPar ("OFF", false, false, ParameterType::NO_DEP,
312  U_NONE, CAT_NONE, "Device is initially off");
313 
314  // This tells the parser that IC1, IC2, and IC3 are to be input as a vector of "IC"
315  p.makeVector ("IC", 3);
316 }
317 
319 {
320  p.addPar ("EOT", 15.0e-10, false, ParameterType::NO_DEP,
322  NULL, U_METER, CAT_PROCESS, "Equivalent gate oxide thickness in meters");
323 
324  p.addPar ("VDDEOT", 1.5, false, ParameterType::NO_DEP,
326  NULL, U_VOLT, CAT_BASIC, "Voltage for extraction of equivalent gate oxide thickness");
327 
328  p.addPar ("ADOS", 1.0, false, ParameterType::NO_DEP,
330  NULL, U_NONE, CAT_BASIC, "Charge centroid parameter");
331 
332  p.addPar ("BDOS", 1.0, false, ParameterType::NO_DEP,
334  NULL, U_NONE, CAT_BASIC, "Charge centroid parameter");
335 
336  p.addPar ("TOXE", 30.0e-10, false, ParameterType::NO_DEP,
338  &MOSFET_B4::Model::toxeGiven, U_METER, CAT_PROCESS, "Electrical gate oxide thickness in meters");
339 
340  p.addPar ("TOXP", 30.0e-10, false, ParameterType::NO_DEP,
342  &MOSFET_B4::Model::toxpGiven, U_METER, CAT_PROCESS, "Physical gate oxide thickness in meters");
343 
344  p.addPar ("TOXM", 30.0e-10, false, ParameterType::NO_DEP,
346  NULL, U_METER, CAT_PROCESS, "Gate oxide thickness at which parameters are extracted");
347 
348  p.addPar ("TOXREF",30.0e-10, false, ParameterType::NO_DEP,
350  NULL, U_METER, CAT_TUNNEL, "Target tox value");
351 
352  p.addPar ("DTOX", 0.0, false, ParameterType::NO_DEP,
355  U_METER, CAT_PROCESS, "Defined as (toxe - toxp) ");
356 
357  p.addPar ("EPSROX",3.9, false, ParameterType::NO_DEP,
359  NULL, U_NONE, CAT_PROCESS, "Dielectric constant of the gate oxide relative to vacuum");
360 
361 
362  p.addPar ("CDSC", 2.4e-4, false, ParameterType::NO_DEP,
364  NULL, U_FARADMM2, CAT_BASIC, "Drain/Source and channel coupling capacitance");
365 
366  p.addPar ("CDSCB", 0.0, false, ParameterType::NO_DEP,
368  NULL, U_FVM1MM2, CAT_BASIC, "Body-bias dependence of cdsc");
369 
370  p.addPar ("CDSCD", 0.0, false, ParameterType::NO_DEP,
372  NULL, U_FVM1MM2, CAT_BASIC, "Drain-bias dependence of cdsc");
373 
374  p.addPar ("CIT", 0.0, false, ParameterType::NO_DEP,
376  NULL, U_FARADMM2, CAT_BASIC, "Interface state capacitance");
377 
378  p.addPar ("NFACTOR", 1.0, false, ParameterType::NO_DEP,
380  NULL, U_NONE, CAT_BASIC, "Subthreshold swing Coefficient");
381 
382  p.addPar ("XJ", 0.15e-6,false, ParameterType::NO_DEP,
384  NULL, U_METER, CAT_PROCESS, "Junction depth in meters");
385 
386  p.addPar ("VSAT", 8.0e4, false, ParameterType::NO_DEP,
388  NULL, U_MSM1, CAT_BASIC, "Saturation velocity at tnom");
389 
390  p.addPar ("AT", 3.3e4, false, ParameterType::NO_DEP,
392  NULL, U_NONE, CAT_NONE, "Temperature coefficient of vsat");
393 
394  p.addPar ("A0", 1.0, false, ParameterType::NO_DEP,
396  NULL, U_NONE, CAT_BASIC, "Non-uniform depletion width effect coefficient.");
397 
398  p.addPar ("AGS", 0.0, false, ParameterType::NO_DEP,
400  NULL, U_VOLTM1, CAT_BASIC, "Gate bias coefficient of Abulk.");
401 
402  p.addPar ("A1", 0.0, false, ParameterType::NO_DEP,
404  NULL, U_VOLTM1, CAT_BASIC, "Non-saturation effect coefficient");
405 
406  p.addPar ("A2", 1.0, false, ParameterType::NO_DEP,
408  NULL, U_NONE, CAT_BASIC, "Non-saturation effect coefficient");
409 
410  p.addPar ("KETA", -0.047, false, ParameterType::NO_DEP,
412  NULL, U_VOLTM1, CAT_BASIC, "Body-bias coefficient of non-uniform depletion width effect.");
413 
414  p.addPar ("PHIG", 4.05, false, ParameterType::NO_DEP,
417  U_NONE, CAT_NONE, "Work Function of gate");
418 
419  p.addPar ("EPSRGATE", 11.7, false, ParameterType::NO_DEP,
421  NULL,
422  U_NONE, CAT_NONE, "Dielectric constant of gate relative to vacuum");
423 
424  p.addPar ("EASUB", 4.05, false, ParameterType::NO_DEP,
426  NULL,
427  U_VOLT, CAT_BASIC, "Electron affinity of substrate");
428 
429  p.addPar ("EPSRSUB", 11.7, false, ParameterType::NO_DEP,
431  NULL,
432  U_NONE, CAT_BASIC, "Dielectric constant of substrate relative to vacuum");
433 
434  p.addPar ("NI0SUB", 1.45e10, false, ParameterType::NO_DEP,
436  NULL,
437  U_CMM3, CAT_BASIC, "Intrinsic carrier concentration of substrate at 300.15K");
438 
439  p.addPar ("BG0SUB", 1.16, false, ParameterType::NO_DEP,
441  NULL,
442  U_EV, CAT_BASIC, "Band-gap of substrate at T=0K");
443 
444  p.addPar ("TBGASUB", 7.02e-4, false, ParameterType::NO_DEP,
446  NULL,
447  U_EVDEGKM1, CAT_BASIC, "First parameter of band-gap change due to temperature");
448 
449 
450  p.addPar ("TBGBSUB", 1108.0, false, ParameterType::NO_DEP,
452  NULL,
453  U_DEGK, CAT_BASIC, "Second parameter of band-gap change due to temperature");
454 
455  p.addPar ("NSUB", 6.0e16, false, ParameterType::NO_DEP,
458  U_CMM3, CAT_PROCESS, "Substrate doping concentration");
459 
460  p.addPar ("NDEP", 1.7e17, false, ParameterType::NO_DEP,
463  U_CMM3, CAT_PROCESS, "Channel doping concentration at the depletion edge");
464 
465  p.addPar ("NSD", 1.0e20, false, ParameterType::NO_DEP,
467  NULL, U_CMM3, CAT_PROCESS, "S/D doping concentration");
468 
469  p.addPar ("PHIN", 0.0, false, ParameterType::NO_DEP,
471  NULL, U_VOLT, CAT_BASIC, "Adjusting parameter for surface potential due to non-uniform vertical doping");
472 
473  p.addPar ("NGATE", 0.0, false, ParameterType::NO_DEP,
475  NULL, U_CMM3, CAT_PROCESS, "Poly-gate doping concentration");
476 
477  p.addPar ("GAMMA1",0.0, false, ParameterType::NO_DEP,
480  U_VOLTH, CAT_PROCESS, "Vth body coefficient");
481 
482  p.addPar ("GAMMA2",0.0, false, ParameterType::NO_DEP,
485  U_VOLTH, CAT_PROCESS, "Vth body coefficient");
486 
487  p.addPar ("VBX", 0.0, false, ParameterType::NO_DEP,
490  U_VOLT, CAT_PROCESS, "Vth transition body Voltage");
491 
492  p.addPar ("VBM", -3.0, false, ParameterType::NO_DEP,
494  NULL, U_VOLT, CAT_BASIC, "Maximum body voltage");
495 
496  p.addPar ("XT", 1.55e-7,false, ParameterType::NO_DEP,
499  U_METER, CAT_PROCESS, "Doping depth");
500 
501  p.addPar ("K1", 0.0, false, ParameterType::NO_DEP,
504  U_VOLTMH, CAT_BASIC, "Bulk effect coefficient 1");
505 
506  p.addPar ("KT1", -0.11, false, ParameterType::NO_DEP,
508  NULL, U_NONE, CAT_NONE, "Temperature coefficient of Vth");
509 
510  p.addPar ("KT1L", 0.0, false, ParameterType::NO_DEP,
512  NULL, U_NONE, CAT_NONE, "Temperature coefficient of Vth");
513 
514  p.addPar ("KT2", 0.022, false, ParameterType::NO_DEP,
516  NULL, U_NONE, CAT_NONE, "Body-coefficient of kt1");
517 
518  p.addPar ("K2", 0.0, false, ParameterType::NO_DEP,
521  U_NONE, CAT_BASIC, "Bulk effect coefficient 2");
522 
523  p.addPar ("K3", 80.0, false, ParameterType::NO_DEP,
525  NULL, U_NONE, CAT_BASIC, "Narrow width effect coefficient");
526 
527  p.addPar ("K3B", 0.0, false, ParameterType::NO_DEP,
529  NULL, U_NONE, CAT_NONE, "Body effect coefficient of k3");
530 
531  p.addPar ("W0", 2.5e-6, false, ParameterType::NO_DEP,
533  NULL, U_METER, CAT_BASIC, "Narrow width effect parameter");
534 
535  p.addPar ("DVTP0", 0.0, false, ParameterType::NO_DEP,
537  NULL, U_METER, CAT_BASIC, "First parameter for Vth shift due to pocket");
538 
539  p.addPar ("DVTP1", 0.0, false, ParameterType::NO_DEP,
541  NULL, U_VOLTM1, CAT_BASIC, "Second parameter for Vth shift due to pocket");
542 
543  p.addPar ("LPE0", 1.74e-7,false, ParameterType::NO_DEP,
545  NULL, U_METER, CAT_BASIC, "Equivalent length of pocket region at zero bias");
546 
547  p.addPar ("LPEB", 0.0, false, ParameterType::NO_DEP,
549  NULL, U_METER, CAT_BASIC, "Equivalent length of pocket region accounting for body bias");
550 
551 
552  p.addPar ("DVT0", 2.2, false, ParameterType::NO_DEP,
554  NULL, U_NONE, CAT_BASIC, "Short channel effect coeff. 0");
555 
556  p.addPar ("DVT1", 0.53, false, ParameterType::NO_DEP,
558  NULL, U_NONE, CAT_BASIC, "Short channel effect coeff. 1");
559 
560  p.addPar ("DVT2", -0.032, false, ParameterType::NO_DEP,
562  NULL, U_VOLTM1, CAT_BASIC, "Short channel effect coeff. 2");
563 
564  p.addPar ("DVT0W", 0.0, false, ParameterType::NO_DEP,
566  NULL, U_NONE, CAT_BASIC, "Narrow Width coeff. 0");
567 
568  p.addPar ("DVT1W", 5.3e6, false, ParameterType::NO_DEP,
570  NULL, U_METERM1, CAT_BASIC, "Narrow Width effect coeff. 1");
571 
572  p.addPar ("DVT2W",-0.032, false, ParameterType::NO_DEP,
574  NULL, U_VOLTM1, CAT_BASIC, "Narrow Width effect coeff. 2");
575 
576  p.addPar ("DROUT", 0.56, false, ParameterType::NO_DEP,
578  NULL, U_NONE, CAT_BASIC, "DIBL coefficient of output resistance");
579 
580  p.addPar ("DSUB", 0.0, false, ParameterType::NO_DEP,
582  NULL, U_NONE, CAT_BASIC, "DIBL coefficient in the subthreshold region");
583 
584  p.addPar ("VTH0", 0.0, false, ParameterType::NO_DEP,
587 
588  p.addPar ("UA", 0.0, false, ParameterType::NO_DEP,
590  NULL, U_MVM1, CAT_BASIC, "Linear gate dependence of mobility");
591 
592  p.addPar ("UA1", 1.0e-9, false, ParameterType::NO_DEP,
594  NULL, U_NONE, CAT_NONE, "Temperature coefficient of ua");
595 
596  p.addPar ("UB", 1.0e-19,false, ParameterType::NO_DEP,
598  NULL, U_M2VM2, CAT_BASIC, "Quadratic gate dependence of mobility");
599 
600  p.addPar ("UB1", -1.0e-18,false, ParameterType::NO_DEP,
602  NULL, U_NONE, CAT_NONE, "Temperature coefficient of ub");
603 
604  p.addPar ("UC", 0.0, false, ParameterType::NO_DEP,
606  NULL, U_VOLTM1, CAT_BASIC, "Body-bias dependence of mobility");
607 
608  p.addPar ("UC1", 0.0, false, ParameterType::NO_DEP,
610  NULL, U_NONE, CAT_NONE, "Temperature coefficient of uc");
611 
612  p.addPar ("UD", 0.0, false, ParameterType::NO_DEP,
614  NULL, U_METERM2, CAT_BASIC, "Coulomb scattering factor of mobility");
615 
616  p.addPar ("UD1", 0.0, false, ParameterType::NO_DEP,
618  NULL, U_NONE, CAT_NONE, "Temperature coefficient of ud");
619 
620  p.addPar ("UP", 0.0, false, ParameterType::NO_DEP,
622  NULL, U_METERM2, CAT_BASIC, "Channel length linear factor of mobility");
623 
624  p.addPar ("LP", 1.0e-8, false, ParameterType::NO_DEP,
626  NULL, U_METER, CAT_BASIC, "Channel length exponential factor of mobility");
627 
628  p.addPar ("U0", 0.0, false, ParameterType::NO_DEP,
630  NULL, U_M2VM1SM1, CAT_BASIC, "Low-field mobility at Tnom");
631 
632  p.addPar ("EU", 0.0, false, ParameterType::NO_DEP,
634  NULL, U_NONE, CAT_BASIC, "Mobility exponent");
635 
636  p.addPar ("UTE", -1.5, false, ParameterType::NO_DEP,
638  NULL, U_NONE, CAT_NONE, "Temperature coefficient of mobility");
639 
640  p.addPar ("VOFF", -0.08, false, ParameterType::NO_DEP,
642  NULL, U_VOLT, CAT_BASIC, "Threshold voltage offset");
643 
644  p.addPar ("MINV", 0.0, false, ParameterType::NO_DEP,
646  NULL, U_NONE, CAT_BASIC, "Fitting parameter for moderate inversion in Vgsteff");
647 
648  p.addPar ("MINVCV", 0.0, false, ParameterType::NO_DEP,
650  NULL, U_NONE, CAT_CAP, "Fitting parameter for moderate inversion in Vgsteffcv");
651 
652  p.addPar ("VOFFL", 0.0, false, ParameterType::NO_DEP,
654  NULL, U_VOLT, CAT_BASIC, "Length dependence parameter for Vth offset");
655 
656  p.addPar ("VOFFCVL", 0.0, false, ParameterType::NO_DEP,
658  NULL, U_NONE, CAT_CAP, "Length dependence parameter for Vth offset in CV");
659 
660  p.addPar ("TNOM", 0.0, false, ParameterType::NO_DEP,
662  NULL, U_NONE, CAT_NONE, "Parameter measurement temperature");
663 
664  p.addPar ("CGSO", 0.0, false, ParameterType::NO_DEP,
667  U_FARADMM1, CAT_CAP, "Gate-source overlap capacitance per width");
668 
669  p.addPar ("CGDO", 0.0, false, ParameterType::NO_DEP,
672  U_FARADMM1, CAT_CAP, "Gate-drain overlap capacitance per width");
673 
674  p.addPar ("CGBO", 0.0, false, ParameterType::NO_DEP,
677  U_NONE, CAT_CAP, "Gate-bulk overlap capacitance per length");
678 
679  p.addPar ("XPART", 0.0, false, ParameterType::NO_DEP,
681  NULL, U_FARADMM1, CAT_CAP, "Channel charge partitioning");
682 
683  p.addPar ("DELTA", 0.01, false, ParameterType::NO_DEP,
685  NULL, U_VOLT, CAT_BASIC, "Effective Vds parameter");
686 
687  p.addPar ("RSH", 0.0, false, ParameterType::NO_DEP,
689  NULL, U_OSQM1, CAT_PROCESS, "Source-drain sheet resistance");
690 
691 
692  p.addPar ("RDSW", 200.0, false, ParameterType::NO_DEP,
694  NULL, U_OHMMICRON, CAT_ASYMRDS, "Source-drain resistance per width");
695 
696  p.addPar ("RDSWMIN", 0.0, false, ParameterType::NO_DEP,
698  NULL, U_OHMMICRON, CAT_ASYMRDS, "Source-drain resistance per width at high Vg");
699 
700  p.addPar ("RSW", 100.0, false, ParameterType::NO_DEP,
702  NULL, U_OHMMICRON, CAT_ASYMRDS, "Source resistance per width");
703 
704  p.addPar ("RDW", 100.0, false, ParameterType::NO_DEP,
706  NULL, U_OHMMICRON, CAT_ASYMRDS, "Drain resistance per width");
707 
708  p.addPar ("RDWMIN", 0.0, false, ParameterType::NO_DEP,
710  NULL, U_OHMMICRON, CAT_ASYMRDS, "Drain resistance per width at high Vg");
711 
712  p.addPar ("RSWMIN", 0.0, false, ParameterType::NO_DEP,
714  NULL, U_OHMMICRON, CAT_ASYMRDS, "Source resistance per width at high Vg");
715 
716  p.addPar ("PRWG", 1.0, false, ParameterType::NO_DEP,
718  NULL, U_VOLTM1, CAT_ASYMRDS, "Gate-bias effect on parasitic resistance ");
719 
720  p.addPar ("PRWB", 0.0, false, ParameterType::NO_DEP,
722  NULL, U_VOLTM1, CAT_ASYMRDS, "Body-effect on parasitic resistance ");
723 
724  p.addPar ("PRT", 0.0, false, ParameterType::NO_DEP,
726  NULL, U_NONE, CAT_NONE, "Temperature coefficient of parasitic resistance ");
727 
728  p.addPar ("ETA0", 0.08, false, ParameterType::NO_DEP,
730  NULL, U_NONE, CAT_BASIC, "Subthreshold region DIBL coefficient");
731 
732  p.addPar ("ETAB", -0.07, false, ParameterType::NO_DEP,
734  NULL, U_VOLTM1, CAT_BASIC, "Subthreshold region DIBL coefficient");
735 
736  p.addPar ("PCLM", 1.3, false, ParameterType::NO_DEP,
738  NULL, U_NONE, CAT_BASIC, "Channel length modulation Coefficient");
739 
740 
741  // check these: are they PDIBL1, etc?
742  p.addPar ("PDIBLC1", 0.39, false, ParameterType::NO_DEP,
744  NULL, U_NONE, CAT_BASIC, "Drain-induced barrier lowering coefficient");
745 
746  p.addPar ("PDIBLC2", 0.0086, false, ParameterType::NO_DEP,
748  NULL, U_NONE, CAT_BASIC, "Drain-induced barrier lowering coefficient");
749 
750  p.addPar ("PDIBLCB", 0.0, false, ParameterType::NO_DEP,
752  NULL, U_VOLTM1, CAT_BASIC, "Body-effect on drain-induced barrier lowering");
753 
754 
755  p.addPar ("FPROUT", 0.0, false, ParameterType::NO_DEP,
757  NULL, U_VMMH, CAT_BASIC, "Rout degradation coefficient for pocket devices");
758 
759  p.addPar ("PDITS", 0.0, false, ParameterType::NO_DEP,
761  NULL, U_VOLTM1, CAT_BASIC, "Coefficient for drain-induced Vth shifts");
762 
763  p.addPar ("PDITSL", 0.0, false, ParameterType::NO_DEP,
765  NULL, U_METERM1, CAT_BASIC, "Length dependence of drain-induced Vth shifts");
766 
767  p.addPar ("PDITSD", 0.0, false, ParameterType::NO_DEP,
769  NULL, U_VOLTM1, CAT_BASIC, "Vds dependence of drain-induced Vth shifts");
770 
771 
772  p.addPar ("PSCBE1", 4.24e8, false, ParameterType::NO_DEP,
774  NULL, U_VMM1, CAT_BASIC, "Substrate current body-effect coefficient");
775 
776  p.addPar ("PSCBE2", 1.0e-5, false, ParameterType::NO_DEP,
778  NULL, U_MVM1, CAT_BASIC, "Substrate current body-effect coefficient");
779 
780 
781  p.addPar ("PVAG", 0.0, false, ParameterType::NO_DEP,
783  NULL, U_NONE, CAT_NONE, "Gate dependence of output resistance parameter");
784 
785  p.addPar ("JSS", 1e-4, false, ParameterType::NO_DEP,
787  NULL, U_NONE, CAT_NONE, "Bottom source junction reverse saturation current density");
788 
789  p.addPar ("JSWS", 0.0, false, ParameterType::NO_DEP,
791  NULL, U_NONE, CAT_NONE, "Isolation edge sidewall source junction reverse saturation current density");
792 
793  p.addPar ("JSWGS", 0.0, false, ParameterType::NO_DEP,
795  NULL, U_NONE, CAT_NONE, "Gate edge source junction reverse saturation current density");
796 
797  p.addPar ("PBS", 1.0, false, ParameterType::NO_DEP,
799  NULL, U_NONE, CAT_NONE, "Source junction built-in potential");
800 
801  p.addPar ("NJS", 1.0, false, ParameterType::NO_DEP,
803  NULL, U_NONE, CAT_NONE, "Source junction emission coefficient");
804 
805  p.addPar ("XTIS", 3.0, false, ParameterType::NO_DEP,
807  NULL, U_NONE, CAT_NONE, "Source junction current temperature exponent");
808 
809  p.addPar ("MJS", 0.5, false, ParameterType::NO_DEP,
811  NULL, U_NONE, CAT_NONE, "Source bottom junction capacitance grading coefficient");
812 
813  p.addPar ("PBSWS", 1.0, false, ParameterType::NO_DEP,
815  NULL, U_NONE, CAT_NONE, "Source sidewall junction capacitance built in potential");
816 
817  p.addPar ("MJSWS", 0.33, false, ParameterType::NO_DEP,
819  NULL, U_NONE, CAT_NONE, "Source sidewall junction capacitance grading coefficient");
820 
821 
822  p.addPar ("PBSWGS", 0.0, false, ParameterType::NO_DEP,
824  NULL, U_NONE, CAT_NONE, "Source (gate side) sidewall junction capacitance built in potential");
825 
826  p.addPar ("MJSWGS", 0.33, false, ParameterType::NO_DEP,
828  NULL, U_NONE, CAT_NONE, "Source (gate side) sidewall junction capacitance grading coefficient");
829 
830  p.addPar ("CJS", 5e-4, false, ParameterType::NO_DEP,
832  NULL, U_NONE, CAT_NONE, "Source bottom junction capacitance per unit area");
833 
834  p.addPar ("CJSWS", 5e-10, false, ParameterType::NO_DEP,
836  NULL, U_NONE, CAT_NONE, "Source sidewall junction capacitance per unit periphery");
837 
838  p.addPar ("CJSWGS", 0.0, false, ParameterType::NO_DEP,
840  NULL, U_NONE, CAT_NONE, "Source (gate side) sidewall junction capacitance per unit width");
841 
842  p.addPar ("JSD", 1e-4, false, ParameterType::NO_DEP,
844  NULL, U_NONE, CAT_NONE, "Bottom drain junction reverse saturation current density");
845 
846  p.addPar ("JSWD", 0.0, false, ParameterType::NO_DEP,
848  NULL, U_NONE, CAT_NONE, "Isolation edge sidewall drain junction reverse saturation current density");
849 
850  p.addPar ("JSWGD", 0.0, false, ParameterType::NO_DEP,
852  NULL, U_NONE, CAT_NONE, "Gate edge drain junction reverse saturation current density");
853 
854  p.addPar ("PBD", 1.0, false, ParameterType::NO_DEP,
856  NULL, U_NONE, CAT_NONE, "Drain junction built-in potential");
857 
858  p.addPar ("NJD", 1.0, false, ParameterType::NO_DEP,
860  NULL, U_NONE, CAT_NONE, "Drain junction emission coefficient");
861 
862  p.addPar ("XTID", 3.0, false, ParameterType::NO_DEP,
864  NULL, U_NONE, CAT_NONE, "Drainjunction current temperature exponent");
865 
866  p.addPar ("MJD", 0.5, false, ParameterType::NO_DEP,
868  NULL, U_NONE, CAT_NONE, "Drain bottom junction capacitance grading coefficient");
869 
870  p.addPar ("PBSWD", 1.0, false, ParameterType::NO_DEP,
872  NULL, U_NONE, CAT_NONE, "Drain sidewall junction capacitance built in potential");
873 
874  p.addPar ("MJSWD", 0.33, false, ParameterType::NO_DEP,
876  NULL, U_NONE, CAT_NONE, "Drain sidewall junction capacitance grading coefficient");
877 
878  p.addPar ("PBSWGD", 0.0, false, ParameterType::NO_DEP,
880  NULL, U_NONE, CAT_NONE, "Drain (gate side) sidewall junction capacitance built in potential");
881 
882  p.addPar ("MJSWGD", 0.33, false, ParameterType::NO_DEP,
884  NULL, U_NONE, CAT_NONE, "Drain (gate side) sidewall junction capacitance grading coefficient");
885 
886  p.addPar ("CJD", 5e-4, false, ParameterType::NO_DEP,
888  NULL, U_NONE, CAT_NONE, "Drain bottom junction capacitance per unit area");
889 
890  p.addPar ("CJSWD", 5e-10, false, ParameterType::NO_DEP,
892  NULL, U_NONE, CAT_NONE, "Drain sidewall junction capacitance per unit periphery");
893 
894  p.addPar ("CJSWGD", 0.0, false, ParameterType::NO_DEP,
896  NULL, U_NONE, CAT_NONE, "Drain (gate side) sidewall junction capacitance per unit width");
897 
898  p.addPar ("VFBCV", -1.0, false, ParameterType::NO_DEP,
900  NULL, U_VOLT, CAT_CAP, "Flat Band Voltage parameter for capmod=0 only");
901 
902  p.addPar ("VFB", -1.0, false, ParameterType::NO_DEP,
904  &MOSFET_B4::Model::vfbGiven, U_VOLT, CAT_BASIC, "Flat Band Voltage");
905 
906  p.addPar ("TPB", 0.0, false, ParameterType::NO_DEP,
908  NULL, U_NONE, CAT_NONE, "Temperature coefficient of pb");
909 
910  p.addPar ("TCJ", 0.0, false, ParameterType::NO_DEP,
912  NULL, U_NONE, CAT_NONE, "Temperature coefficient of cj");
913 
914  p.addPar ("TPBSW", 0.0, false, ParameterType::NO_DEP,
916  NULL, U_NONE, CAT_NONE, "Temperature coefficient of pbsw");
917 
918  p.addPar ("TCJSW", 0.0, false, ParameterType::NO_DEP,
920  NULL, U_NONE, CAT_NONE, "Temperature coefficient of cjsw");
921 
922  p.addPar ("TPBSWG", 0.0, false, ParameterType::NO_DEP,
924  NULL, U_NONE, CAT_NONE, "Temperature coefficient of pbswg");
925 
926  p.addPar ("TCJSWG", 0.0, false, ParameterType::NO_DEP,
928  NULL, U_NONE, CAT_NONE, "Temperature coefficient of cjswg");
929 
930  p.addPar ("ACDE", 1.0, false, ParameterType::NO_DEP,
932  NULL, U_MVM1, CAT_CAP, "Exponential coefficient for finite charge thickness");
933 
934  p.addPar ("MOIN", 15.0, false, ParameterType::NO_DEP,
936  NULL, U_NONE, CAT_CAP, "Coefficient for gate-bias dependent surface potential");
937 
938  p.addPar ("NOFF", 1.0, false, ParameterType::NO_DEP,
940  NULL, U_NONE, CAT_CAP, "C-V turn-on/off parameter");
941 
942  p.addPar ("VOFFCV", 0.0, false, ParameterType::NO_DEP,
944  NULL, U_VOLT, CAT_CAP, "C-V lateral-shift parameter");
945 
946 
947  p.addPar ("DMCG", 0.0, false, ParameterType::NO_DEP,
949  NULL, U_NONE, CAT_NONE, "Distance of Mid-Contact to Gate edge");
950 
951  p.addPar ("DMCI", 0.0, false, ParameterType::NO_DEP,
953  NULL, U_NONE, CAT_NONE, "Distance of Mid-Contact to Isolation");
954 
955 
956  p.addPar ("DMDG", 0.0, false, ParameterType::NO_DEP,
958  NULL, U_NONE, CAT_NONE, "Distance of Mid-Diffusion to Gate edge");
959 
960  p.addPar ("DMCGT", 0.0, false, ParameterType::NO_DEP,
962  NULL, U_NONE, CAT_NONE, "Distance of Mid-Contact to Gate edge in Test structures");
963 
964  p.addPar ("XGW", 0.0, false, ParameterType::NO_DEP,
966  NULL, U_NONE, CAT_NONE, "Distance from gate contact center to device edge");
967 
968  p.addPar ("XGL", 0.0, false, ParameterType::NO_DEP,
970  NULL, U_NONE, CAT_NONE, "Variation in Ldrawn");
971 
972  p.addPar ("RSHG", 0.1, false, ParameterType::NO_DEP,
974  NULL, U_OSQM1, CAT_PROCESS, "Gate sheet resistance");
975 
976  p.addPar ("NGCON", 1.0, false, ParameterType::NO_DEP,
978  NULL, U_NONE, CAT_NONE, "Number of gate contacts");
979 
980  p.addPar ("XRCRG1", 12.0, false, ParameterType::NO_DEP,
982  NULL, U_NONE, CAT_NONE, "First fitting parameter the bias-dependent Rg");
983 
984  p.addPar ("XRCRG2", 1.0, false, ParameterType::NO_DEP,
986  NULL, U_NONE, CAT_NONE, "Second fitting parameter the bias-dependent Rg");
987 
988 
989  p.addPar ("LAMBDA", 0.0, false, ParameterType::NO_DEP,
992  U_NONE, CAT_BASIC, " Velocity overshoot parameter");
993 
994  p.addPar ("VTL", 2.0e5, false, ParameterType::NO_DEP,
997  U_MSM1, CAT_BASIC, " thermal velocity");
998 
999  p.addPar ("LC", 5.0e-9, false, ParameterType::NO_DEP,
1001  NULL, U_METER, CAT_BASIC, " back scattering parameter");
1002 
1003  p.addPar ("XN", 3.0, false, ParameterType::NO_DEP,
1005  NULL, U_NONE, CAT_BASIC, " back scattering parameter");
1006 
1007  p.addPar ("VFBSDOFF", 0.0, false, ParameterType::NO_DEP,
1009  NULL, U_VOLT, CAT_TUNNEL, "S/D flatband voltage offset");
1010 
1011  p.addPar ("TVFBSDOFF",0.0, false, ParameterType::NO_DEP,
1013  NULL, U_NONE, CAT_NONE, "Temperature parameter for vfbsdoff");
1014 
1015  p.addPar ("TVOFF", 0.0, false, ParameterType::NO_DEP,
1017  NULL, U_NONE, CAT_NONE, "Temperature parameter for voff");
1018 
1019  p.addPar ("LINTNOI", 0.0, false, ParameterType::NO_DEP,
1021  NULL, U_NONE, CAT_NONE, "lint offset for noise calculation");
1022 
1023  p.addPar ("LINT", 0.0, false, ParameterType::NO_DEP,
1025  NULL, U_METER, CAT_BASIC, "Length reduction parameter");
1026 
1027  p.addPar ("LL", 0.0, false, ParameterType::NO_DEP,
1029  NULL, U_NONE, CAT_NONE, "Length reduction parameter");
1030 
1031  p.addPar ("LLC", 0.0, false, ParameterType::NO_DEP,
1033  NULL, U_NONE, CAT_NONE, "Length reduction parameter for CV");
1034 
1035  p.addPar ("LLN", 1.0, false, ParameterType::NO_DEP,
1037  NULL, U_NONE, CAT_NONE, "Length reduction parameter");
1038 
1039  p.addPar ("LW", 0.0, false, ParameterType::NO_DEP,
1041  NULL, U_NONE, CAT_NONE, "Length reduction parameter");
1042 
1043  p.addPar ("LWC", 0.0, false, ParameterType::NO_DEP,
1045  NULL, U_NONE, CAT_NONE, "Length reduction parameter for CV");
1046 
1047  p.addPar ("LWN", 1.0, false, ParameterType::NO_DEP,
1049  NULL, U_NONE, CAT_NONE, "Length reduction parameter");
1050 
1051  p.addPar ("LWL", 0.0, false, ParameterType::NO_DEP,
1053  NULL, U_NONE, CAT_NONE, "Length reduction parameter");
1054 
1055  p.addPar ("LWLC", 0.0, false, ParameterType::NO_DEP,
1057  NULL, U_NONE, CAT_NONE, "Length reduction parameter for CV");
1058 
1059  p.addPar ("LMIN", 0.0, false, ParameterType::NO_DEP,
1061  NULL, U_NONE, CAT_NONE, "Minimum length for the model");
1062 
1063  p.addPar ("LMAX", 1.0, false, ParameterType::NO_DEP,
1065  NULL, U_NONE, CAT_NONE, "Maximum length for the model");
1066 
1067 
1068  p.addPar ("WR", 1.0, false, ParameterType::NO_DEP,
1070  NULL, U_NONE, CAT_ASYMRDS, "Width dependence of rds");
1071 
1072  p.addPar ("WINT", 0.0, false, ParameterType::NO_DEP,
1074  NULL, U_METER, CAT_BASIC, "Width reduction parameter");
1075 
1076  p.addPar ("DWG", 0.0, false, ParameterType::NO_DEP,
1078  NULL, U_MVM1, CAT_BASIC, "Width reduction parameter");
1079 
1080  p.addPar ("DWB", 0.0, false, ParameterType::NO_DEP,
1082  NULL, U_MVMH, CAT_BASIC, "Width reduction parameter");
1083 
1084  p.addPar ("WL", 0.0, false, ParameterType::NO_DEP,
1086  NULL, U_NONE, CAT_NONE, "Width reduction parameter");
1087 
1088  p.addPar ("WLC", 0.0, false, ParameterType::NO_DEP,
1090  NULL, U_NONE, CAT_NONE, "Width reduction parameter for CV");
1091 
1092  p.addPar ("WLN", 1.0, false, ParameterType::NO_DEP,
1094  NULL, U_NONE, CAT_NONE, "Width reduction parameter");
1095 
1096  p.addPar ("WW", 0.0, false, ParameterType::NO_DEP,
1098  NULL, U_NONE, CAT_NONE, "Width reduction parameter");
1099 
1100  p.addPar ("WWC", 0.0, false, ParameterType::NO_DEP,
1102  NULL, U_NONE, CAT_NONE, "Width reduction parameter for CV");
1103 
1104  p.addPar ("WWN", 1.0, false, ParameterType::NO_DEP,
1106  NULL, U_NONE, CAT_NONE, "Width reduction parameter");
1107 
1108  p.addPar ("WWL", 0.0, false, ParameterType::NO_DEP,
1110  NULL, U_NONE, CAT_NONE, "Width reduction parameter");
1111 
1112  p.addPar ("WWLC", 0.0, false, ParameterType::NO_DEP,
1114  NULL, U_NONE, CAT_NONE, "Width reduction parameter for CV");
1115 
1116  p.addPar ("WMIN", 0.0, false, ParameterType::NO_DEP,
1118  NULL, U_NONE, CAT_NONE, "Minimum width for the model");
1119 
1120  p.addPar ("WMAX", 1.0, false, ParameterType::NO_DEP,
1122  NULL, U_NONE, CAT_NONE, "Maximum width for the model");
1123 
1124  p.addPar ("B0", 0.0, false, ParameterType::NO_DEP,
1126  NULL, U_METER, CAT_BASIC, "Abulk narrow width parameter");
1127 
1128  p.addPar ("B1", 0.0, false, ParameterType::NO_DEP,
1130  NULL, U_METER, CAT_BASIC, "Abulk narrow width parameter");
1131 
1132  p.addPar ("CGSL", 0.0, false, ParameterType::NO_DEP,
1134  NULL, U_FARADMM1, CAT_CAP, "New C-V model parameter");
1135 
1136  p.addPar ("CGDL", 0.0, false, ParameterType::NO_DEP,
1138  NULL, U_FARADMM1, CAT_CAP, "New C-V model parameter");
1139 
1140 
1141  p.addPar ("CKAPPAS", 0.6, false, ParameterType::NO_DEP,
1143  NULL, U_VOLT, CAT_CAP, "S/G overlap C-V parameter ");
1144 
1145  p.addPar ("CKAPPAD", 0.6, false, ParameterType::NO_DEP,
1147  NULL, U_VOLT, CAT_CAP, "D/G overlap C-V parameter");
1148 
1149 
1150  p.addPar ("CF", 0.0, false, ParameterType::NO_DEP,
1152  NULL, U_FARADMM1, CAT_CAP, "Fringe capacitance parameter");
1153 
1154  p.addPar ("CLC", 0.1e-6, false, ParameterType::NO_DEP,
1156  NULL, U_METER, CAT_CAP, "Vdsat parameter for C-V model");
1157 
1158  p.addPar ("CLE", 0.6, false, ParameterType::NO_DEP,
1160  NULL, U_NONE, CAT_CAP, "Vdsat parameter for C-V model");
1161 
1162  p.addPar ("DWC", 0.0, false, ParameterType::NO_DEP,
1164  NULL, U_METER, CAT_CAP, "Delta W for C-V model");
1165 
1166  p.addPar ("DLC", 0.0, false, ParameterType::NO_DEP,
1168  &MOSFET_B4::Model::dlcGiven, U_METER, CAT_CAP, "Delta L for C-V model");
1169 
1170  p.addPar ("XW", 0.0, false, ParameterType::NO_DEP,
1172  NULL, U_NONE, CAT_NONE, "W offset for channel width due to mask/etch effect");
1173 
1174  p.addPar ("XL", 0.0, false, ParameterType::NO_DEP,
1176  NULL, U_NONE, CAT_NONE, "L offset for channel length due to mask/etch effect");
1177 
1178  p.addPar ("DLCIG", 0.0, false, ParameterType::NO_DEP,
1180  NULL, U_NONE, CAT_NONE, "Delta L for Ig model");
1181 
1182  p.addPar ("DLCIGD", 0.0, false, ParameterType::NO_DEP,
1184  NULL, U_METER, CAT_TUNNEL, "Delta L for Ig model drain side");
1185 
1186  p.addPar ("DWJ", 0.0, false, ParameterType::NO_DEP,
1188  NULL, U_NONE, CAT_NONE, "Delta W for S/D junctions");
1189 
1190  p.addPar ("ALPHA0", 0.0, false, ParameterType::NO_DEP,
1192  NULL, U_MVM1, CAT_IMPACT, "substrate current model parameter");
1193 
1194  p.addPar ("ALPHA1", 0.0, false, ParameterType::NO_DEP,
1196  NULL, U_VOLTM1, CAT_IMPACT, "substrate current model parameter");
1197 
1198  p.addPar ("BETA0", 0.0, false, ParameterType::NO_DEP,
1200  NULL, U_VOLTM1, CAT_IMPACT, "substrate current model parameter");
1201 
1202  p.addPar ("AGIDL", 0.0, false, ParameterType::NO_DEP,
1204  NULL, U_OHMM1, CAT_GDLEAKAGE, "Pre-exponential constant for GIDL");
1205 
1206  p.addPar ("BGIDL", 2.3e9, false, ParameterType::NO_DEP,
1208  NULL, U_VMM1, CAT_GDLEAKAGE, "Exponential constant for GIDL");
1209 
1210  p.addPar ("CGIDL", 0.5, false, ParameterType::NO_DEP,
1212  NULL, U_VOLT3, CAT_GDLEAKAGE, "Parameter for body-bias dependence of GIDL");
1213 
1214  p.addPar ("EGIDL", 0.8, false, ParameterType::NO_DEP,
1216  NULL, U_VOLT, CAT_GDLEAKAGE, "Fitting parameter for Bandbending");
1217 
1218  p.addPar ("AGISL", 0.0, false, ParameterType::NO_DEP,
1220  NULL, U_OHMM1, CAT_GDLEAKAGE, "Pre-exponential constant for GISL");
1221 
1222  p.addPar ("BGISL", 2.3e-9, false, ParameterType::NO_DEP,
1224  NULL, U_VMM1, CAT_GDLEAKAGE, "Exponential constant for GISL");
1225 
1226  p.addPar ("CGISL", 0.5, false, ParameterType::NO_DEP,
1228  NULL, U_VOLT3, CAT_GDLEAKAGE, "Parameter for body-bias dependence of GISL");
1229 
1230  p.addPar ("EGISL", 0.8, false, ParameterType::NO_DEP,
1232  NULL, U_VOLT, CAT_GDLEAKAGE, "Fitting parameter for Bandbending");
1233 
1234 
1235  // These are type-dependent. For the table, assuming NMOS.
1236  p.addPar ("AIGC", 1.36e-2, false, ParameterType::NO_DEP,
1238  NULL, U_FS2HGMHMM1, CAT_TUNNEL, "Parameter for Igc");
1239 
1240  p.addPar ("BIGC", 1.71e-3, false, ParameterType::NO_DEP,
1242  NULL, U_FS2HGMHMM1VM1, CAT_TUNNEL, "Parameter for Igc");
1243 
1244  p.addPar ("CIGC", 0.075, false, ParameterType::NO_DEP,
1246  NULL, U_VOLTM1, CAT_TUNNEL, "Parameter for Igc");
1247 
1248  p.addPar ("AIGSD", 1.36e-2, false, ParameterType::NO_DEP,
1250  NULL, U_NONE, CAT_NONE, "Parameter for Igs,d");
1251 
1252  p.addPar ("BIGSD", 1.71e-3, false, ParameterType::NO_DEP,
1254  NULL, U_NONE, CAT_NONE, "Parameter for Igs,d");
1255 
1256  p.addPar ("CIGSD", 0.075, false, ParameterType::NO_DEP,
1258  NULL, U_NONE, CAT_NONE, "Parameter for Igs,d");
1259 
1260  p.addPar ("AIGS", 1.36e-2, false, ParameterType::NO_DEP,
1262  NULL, U_FS2HGMHMM1, CAT_TUNNEL, "Parameter for Igs");
1263 
1264  p.addPar ("BIGS", 1.71e-3, false, ParameterType::NO_DEP,
1266  NULL, U_FS2HGMHMM1VM1, CAT_TUNNEL, "Parameter for Igs");
1267 
1268  p.addPar ("CIGS", 0.075, false, ParameterType::NO_DEP,
1270  NULL, U_VOLTM1, CAT_TUNNEL, "Parameter for Igs");
1271 
1272  p.addPar ("AIGD", 1.36e-2, false, ParameterType::NO_DEP,
1274  NULL, U_FS2HGMHMM1, CAT_TUNNEL, "Parameter for Igd");
1275 
1276  p.addPar ("BIGD", 1.71e-3, false, ParameterType::NO_DEP,
1278  NULL, U_FS2HGMHMM1VM1, CAT_TUNNEL, "Parameter for Igd");
1279 
1280  p.addPar ("CIGD", 0.075, false, ParameterType::NO_DEP,
1282  NULL, U_VOLTM1, CAT_TUNNEL, "Parameter for Igd");
1283 
1284 
1285 
1286  p.addPar ("AIGBACC", 1.36e-2, false, ParameterType::NO_DEP,
1288  NULL, U_FS2HGMHMM1, CAT_TUNNEL, "Parameter for Igb");
1289 
1290  p.addPar ("BIGBACC", 1.71e-3, false, ParameterType::NO_DEP,
1292  NULL, U_FS2HGMHMM1VM1, CAT_TUNNEL, "Parameter for Igb");
1293 
1294  p.addPar ("CIGBACC", 0.075, false, ParameterType::NO_DEP,
1296  NULL, U_VOLTM1, CAT_TUNNEL, "Parameter for Igb");
1297 
1298  p.addPar ("AIGBINV", 1.11e-2, false, ParameterType::NO_DEP,
1300  NULL, U_FS2HGMHMM1, CAT_TUNNEL, "Parameter for Igb");
1301 
1302  p.addPar ("BIGBINV", 9.49e-4, false, ParameterType::NO_DEP,
1304  NULL, U_FS2HGMHMM1VM1, CAT_TUNNEL, "Parameter for Igb");
1305 
1306  p.addPar ("CIGBINV", 0.006, false, ParameterType::NO_DEP,
1308  NULL, U_VOLTM1, CAT_TUNNEL, "Parameter for Igb");
1309 
1310 
1311  p.addPar ("NIGC", 1.0, false, ParameterType::NO_DEP,
1313  NULL, U_NONE, CAT_TUNNEL, "Parameter for Igc slope");
1314 
1315  p.addPar ("NIGBINV", 3.0, false, ParameterType::NO_DEP,
1317  NULL, U_NONE, CAT_TUNNEL, "Parameter for Igbinv slope");
1318 
1319  p.addPar ("NIGBACC", 1.0, false, ParameterType::NO_DEP,
1321  NULL, U_NONE, CAT_TUNNEL, "Parameter for Igbacc slope");
1322 
1323  p.addPar ("NTOX", 1.0, false, ParameterType::NO_DEP,
1325  NULL, U_NONE, CAT_TUNNEL, "Exponent for Tox ratio");
1326 
1327  p.addPar ("EIGBINV", 1.1, false, ParameterType::NO_DEP,
1329  NULL, U_VOLT, CAT_TUNNEL, "Parameter for the Si bandgap for Igbinv");
1330 
1331  p.addPar ("PIGCD", 1.0, false, ParameterType::NO_DEP,
1333  &MOSFET_B4::Model::pigcdGiven, U_NONE, CAT_TUNNEL, "Parameter for Igc partition");
1334 
1335  p.addPar ("POXEDGE", 1.0, false, ParameterType::NO_DEP,
1337  NULL, U_NONE, CAT_TUNNEL, "Factor for the gate edge Tox");
1338 
1339 
1340  // By default, the drain values are set to the source values here:
1341  p.addPar ("IJTHDFWD", 0.1, false, ParameterType::NO_DEP,
1343  NULL, U_NONE, CAT_NONE, "Forward drain diode forward limiting current");
1344 
1345  p.addPar ("IJTHSFWD", 0.1, false, ParameterType::NO_DEP,
1347  NULL, U_NONE, CAT_NONE, "Forward source diode forward limiting current");
1348 
1349  p.addPar ("IJTHDREV", 0.1, false, ParameterType::NO_DEP,
1351  NULL, U_NONE, CAT_NONE, "Reverse drain diode forward limiting current");
1352 
1353  p.addPar ("IJTHSREV", 0.1, false, ParameterType::NO_DEP,
1355  NULL, U_NONE, CAT_NONE, "Reverse source diode forward limiting current");
1356 
1357  p.addPar ("XJBVD", 1.0, false, ParameterType::NO_DEP,
1359  NULL, U_NONE, CAT_NONE, "Fitting parameter for drain diode breakdown current");
1360 
1361  p.addPar ("XJBVS", 1.0, false, ParameterType::NO_DEP,
1363  NULL, U_NONE, CAT_NONE, "Fitting parameter for source diode breakdown current");
1364 
1365  p.addPar ("BVD", 10.0, false, ParameterType::NO_DEP,
1367  NULL, U_NONE, CAT_NONE, "Drain diode breakdown voltage");
1368 
1369  p.addPar ("BVS", 10.0, false, ParameterType::NO_DEP,
1371  NULL, U_NONE, CAT_NONE, "Source diode breakdown voltage");
1372 
1373 
1374  p.addPar ("JTSS", 0.0, false, ParameterType::NO_DEP,
1376  NULL, U_NONE, CAT_NONE, "Source bottom trap-assisted saturation current density");
1377 
1378  p.addPar ("JTSD", 0.0, false, ParameterType::NO_DEP,
1380  NULL, U_NONE, CAT_NONE, "Drain bottom trap-assisted saturation current density");
1381 
1382  p.addPar ("JTSSWS", 0.0, false, ParameterType::NO_DEP,
1384  NULL, U_NONE, CAT_NONE, "Source STI sidewall trap-assisted saturation current density");
1385 
1386  p.addPar ("JTSSWD", 0.0, false, ParameterType::NO_DEP,
1388  NULL, U_NONE, CAT_NONE, "Drain STI sidewall trap-assisted saturation current density");
1389 
1390  p.addPar ("JTSSWGS", 0.0, false, ParameterType::NO_DEP,
1392  NULL, U_NONE, CAT_NONE, "Source gate-edge sidewall trap-assisted saturation current density");
1393 
1394  p.addPar ("JTSSWGD", 0.0, false, ParameterType::NO_DEP,
1396  NULL, U_NONE, CAT_NONE, "Drain gate-edge sidewall trap-assisted saturation current density");
1397 
1398  p.addPar ("NJTS", 20.0, false, ParameterType::NO_DEP,
1400  NULL, U_NONE, CAT_NONE, "Non-ideality factor for bottom junction");
1401 
1402  p.addPar ("NJTSSW", 20.0, false, ParameterType::NO_DEP,
1404  NULL, U_NONE, CAT_NONE, "Non-ideality factor for STI sidewall junction");
1405 
1406  p.addPar ("NJTSSWG", 20.0, false, ParameterType::NO_DEP,
1408  NULL, U_NONE, CAT_NONE, "Non-ideality factor for gate-edge sidewall junction");
1409 
1410 
1411  p.addPar ("NJTSD", 20.0, false, ParameterType::NO_DEP,
1413  NULL, U_NONE, CAT_NONE, "Non-ideality factor for bottom junction drain side");
1414 
1415  p.addPar ("NJTSSWD", 20.0, false, ParameterType::NO_DEP,
1417  NULL, U_NONE, CAT_NONE, "Non-ideality factor for STI sidewall junction drain side");
1418 
1419  p.addPar ("NJTSSWGD", 20.0, false, ParameterType::NO_DEP,
1421  NULL,U_NONE, CAT_NONE, "Non-ideality factor for gate-edge sidewall junction drain side");
1422 
1423 
1424  p.addPar ("XTSS", 0.02, false, ParameterType::NO_DEP,
1426  NULL, U_NONE, CAT_NONE, "Power dependence of JTSS on temperature");
1427 
1428  p.addPar ("XTSD", 0.02, false, ParameterType::NO_DEP,
1430  NULL, U_NONE, CAT_NONE, "Power dependence of JTSD on temperature");
1431 
1432  p.addPar ("XTSSWS", 0.02, false, ParameterType::NO_DEP,
1434  NULL, U_NONE, CAT_NONE, "Power dependence of JTSSWS on temperature");
1435 
1436  p.addPar ("XTSSWD", 0.02, false, ParameterType::NO_DEP,
1438  NULL, U_NONE, CAT_NONE, "Power dependence of JTSSWD on temperature");
1439 
1440  p.addPar ("XTSSWGS", 0.02, false, ParameterType::NO_DEP,
1442  NULL, U_NONE, CAT_NONE, "Power dependence of JTSSWGS on temperature");
1443 
1444  p.addPar ("XTSSWGD", 0.02, false, ParameterType::NO_DEP,
1446  NULL, U_NONE, CAT_NONE, "Power dependence of JTSSWGD on temperature");
1447 
1448  p.addPar ("TNJTS", 0.0, false, ParameterType::NO_DEP,
1450  NULL, U_NONE, CAT_NONE, "Temperature coefficient for NJTS");
1451 
1452  p.addPar ("TNJTSSW", 0.0, false, ParameterType::NO_DEP,
1454  NULL, U_NONE, CAT_NONE, "Temperature coefficient for NJTSSW");
1455 
1456  p.addPar ("TNJTSSWG", 0.0, false, ParameterType::NO_DEP,
1458  NULL, U_NONE, CAT_NONE, "Temperature coefficient for NJTSSWG");
1459 
1460  p.addPar ("TNJTSD", 0.0, false, ParameterType::NO_DEP,
1462  NULL, U_NONE, CAT_NONE, "Temperature coefficient for NJTSD");
1463 
1464  p.addPar ("TNJTSSWD", 0.0, false, ParameterType::NO_DEP,
1466  NULL, U_NONE, CAT_NONE, "Temperature coefficient for NJTSSWD");
1467 
1468  p.addPar ("TNJTSSWGD", 0.0, false, ParameterType::NO_DEP,
1470  NULL, U_NONE, CAT_NONE, "Temperature coefficient for NJTSSWGD");
1471 
1472 
1473  p.addPar ("VTSS", 10.0, false, ParameterType::NO_DEP,
1475  NULL, U_NONE, CAT_NONE, "Source bottom trap-assisted voltage dependent parameter");
1476 
1477  p.addPar ("VTSD", 10.0, false, ParameterType::NO_DEP,
1479  NULL, U_NONE, CAT_NONE, "Drain bottom trap-assisted voltage dependent parameter");
1480 
1481  p.addPar ("VTSSWS", 10.0, false, ParameterType::NO_DEP,
1483  NULL, U_NONE, CAT_NONE, "Source STI sidewall trap-assisted voltage dependent parameter");
1484 
1485  p.addPar ("VTSSWD", 10.0, false, ParameterType::NO_DEP,
1487  NULL, U_NONE, CAT_NONE, "Drain STI sidewall trap-assisted voltage dependent parameter");
1488 
1489  p.addPar ("VTSSWGS", 10.0, false, ParameterType::NO_DEP,
1491  NULL, U_NONE, CAT_NONE, "Source gate-edge sidewall trap-assisted voltage dependent parameter");
1492 
1493  p.addPar ("VTSSWGD", 10.0, false, ParameterType::NO_DEP,
1495  NULL, U_NONE, CAT_NONE, "Drain gate-edge sidewall trap-assisted voltage dependent parameter");
1496 
1497 
1498  p.addPar ("GBMIN", 1.0e-12, false, ParameterType::NO_DEP,
1500  NULL, U_OHMM1, CAT_NONE, "Minimum body conductance");
1501 
1502  p.addPar ("RBDB", 50.0, false, ParameterType::NO_DEP,
1504  NULL, U_OHM, CAT_NONE, "Resistance between bNode and dbNode");
1505 
1506  p.addPar ("RBPB", 50.0, false, ParameterType::NO_DEP,
1508  NULL, U_OHM, CAT_NONE, "Resistance between bNodePrime and bNode");
1509 
1510  p.addPar ("RBSB", 50.0, false, ParameterType::NO_DEP,
1512  NULL, U_OHM, CAT_NONE, "Resistance between bNode and sbNode");
1513 
1514  p.addPar ("RBPS", 50.0, false, ParameterType::NO_DEP,
1516  NULL, U_OHM, CAT_NONE, "Resistance between bNodePrime and sbNode");
1517 
1518  p.addPar ("RBPD", 50.0, false, ParameterType::NO_DEP,
1520  NULL, U_OHM, CAT_NONE, "Resistance between bNodePrime and bNode");
1521 
1522 
1523  p.addPar ("RBPS0", 50.0, false, ParameterType::NO_DEP,
1525  &MOSFET_B4::Model::rbps0Given, U_NONE, CAT_NONE, "Body resistance RBPS scaling");
1526 
1527  p.addPar ("RBPSL", 0.0, false, ParameterType::NO_DEP,
1529  NULL, U_NONE, CAT_NONE, "Body resistance RBPS L scaling");
1530 
1531  p.addPar ("RBPSW", 0.0, false, ParameterType::NO_DEP,
1533  NULL, U_NONE, CAT_NONE, "Body resistance RBPS W scaling");
1534 
1535  p.addPar ("RBPSNF", 0.0, false, ParameterType::NO_DEP,
1537  NULL, U_NONE, CAT_NONE, "Body resistance RBPS NF scaling");
1538 
1539 
1540  p.addPar ("RBPD0", 50.0, false, ParameterType::NO_DEP,
1543  U_NONE, CAT_NONE, "Body resistance RBPD scaling");
1544 
1545  p.addPar ("RBPDL", 0.0, false, ParameterType::NO_DEP,
1547  NULL, U_NONE, CAT_NONE, "Body resistance RBPD L scaling");
1548 
1549  p.addPar ("RBPDW", 0.0, false, ParameterType::NO_DEP,
1551  NULL, U_NONE, CAT_NONE, "Body resistance RBPD W scaling");
1552 
1553  p.addPar ("RBPDNF", 0.0, false, ParameterType::NO_DEP,
1555  NULL, U_NONE, CAT_NONE, "Body resistance RBPD NF scaling");
1556 
1557 
1558  p.addPar ("RBPBX0", 100.0, false, ParameterType::NO_DEP,
1560  NULL, U_NONE, CAT_NONE, "Body resistance RBPBX scaling");
1561 
1562  p.addPar ("RBPBXL", 0.0, false, ParameterType::NO_DEP,
1564  NULL, U_NONE, CAT_NONE, "Body resistance RBPBX L scaling");
1565 
1566  p.addPar ("RBPBXW", 0.0, false, ParameterType::NO_DEP,
1568  NULL, U_NONE, CAT_NONE, "Body resistance RBPBX W scaling");
1569 
1570  p.addPar ("RBPBXNF", 0.0, false, ParameterType::NO_DEP,
1572  NULL, U_NONE, CAT_NONE, "Body resistance RBPBX NF scaling");
1573 
1574 
1575  p.addPar ("RBPBY0", 100.0, false, ParameterType::NO_DEP,
1577  NULL, U_NONE, CAT_NONE, "Body resistance RBPBY scaling");
1578 
1579  p.addPar ("RBPBYL", 0.0, false, ParameterType::NO_DEP,
1581  NULL, U_NONE, CAT_NONE, "Body resistance RBPBY L scaling");
1582 
1583  p.addPar ("RBPBYW", 0.0, false, ParameterType::NO_DEP,
1585  NULL, U_NONE, CAT_NONE, "Body resistance RBPBY W scaling");
1586 
1587  p.addPar ("RBPBYNF", 0.0, false, ParameterType::NO_DEP,
1589  NULL, U_NONE, CAT_NONE, "Body resistance RBPBY NF scaling");
1590 
1591 
1592  p.addPar ("RBSBX0", 100.0, false, ParameterType::NO_DEP,
1595  U_NONE, CAT_NONE, "Body resistance RBSBX scaling");
1596 
1597  p.addPar ("RBSBY0", 100.0, false, ParameterType::NO_DEP,
1600  U_NONE, CAT_NONE, "Body resistance RBSBY scaling");
1601 
1602  p.addPar ("RBDBX0", 100.0, false, ParameterType::NO_DEP,
1605  U_NONE, CAT_NONE, "Body resistance RBDBX scaling");
1606 
1607  p.addPar ("RBDBY0", 100.0, false, ParameterType::NO_DEP,
1610  U_NONE, CAT_NONE, "Body resistance RBDBY scaling");
1611 
1612 
1613  p.addPar ("RBSDBXL", 0.0, false, ParameterType::NO_DEP,
1615  NULL, U_NONE, CAT_NONE, "Body resistance RBSDBX L scaling");
1616 
1617  p.addPar ("RBSDBXW", 0.0, false, ParameterType::NO_DEP,
1619  NULL, U_NONE, CAT_NONE, "Body resistance RBSDBX W scaling");
1620 
1621  p.addPar ("RBSDBXNF", 0.0, false, ParameterType::NO_DEP,
1623  NULL, U_NONE, CAT_NONE, "Body resistance RBSDBX NF scaling");
1624 
1625  p.addPar ("RBSDBYL", 0.0, false, ParameterType::NO_DEP,
1627  NULL, U_NONE, CAT_NONE, "Body resistance RBSDBY L scaling");
1628 
1629  p.addPar ("RBSDBYW", 0.0, false, ParameterType::NO_DEP,
1631  NULL, U_NONE, CAT_NONE, "Body resistance RBSDBY W scaling");
1632 
1633  p.addPar ("RBSDBYNF", 0.0, false, ParameterType::NO_DEP,
1635  NULL, U_NONE, CAT_NONE, "Body resistance RBSDBY NF scaling");
1636 
1637  p.addPar ("LCDSC", 0.0, false, ParameterType::NO_DEP,
1639  NULL, U_NONE, CAT_NONE, "Length dependence of cdsc");
1640 
1641  p.addPar ("LCDSCB", 0.0, false, ParameterType::NO_DEP,
1643  NULL, U_NONE, CAT_NONE, "Length dependence of cdscb");
1644 
1645  p.addPar ("LCDSCD", 0.0, false, ParameterType::NO_DEP,
1647  NULL, U_NONE, CAT_NONE, "Length dependence of cdscd");
1648 
1649  p.addPar ("LCIT", 0.0, false, ParameterType::NO_DEP,
1651  NULL, U_NONE, CAT_NONE, "Length dependence of cit");
1652 
1653  p.addPar ("LNFACTOR", 0.0, false, ParameterType::NO_DEP,
1655  NULL, U_NONE, CAT_NONE, "Length dependence of nfactor");
1656 
1657  p.addPar ("LXJ", 0.0, false, ParameterType::NO_DEP,
1659  NULL, U_NONE, CAT_NONE, "Length dependence of xj");
1660 
1661  p.addPar ("LVSAT", 0.0, false, ParameterType::NO_DEP,
1663  NULL, U_NONE, CAT_NONE, "Length dependence of vsat");
1664 
1665  p.addPar ("LAT", 0.0, false, ParameterType::NO_DEP,
1667  NULL, U_NONE, CAT_NONE, "Length dependence of at");
1668 
1669  p.addPar ("LA0", 0.0, false, ParameterType::NO_DEP,
1671  NULL, U_NONE, CAT_NONE, "Length dependence of a0");
1672 
1673  p.addPar ("LAGS", 0.0, false, ParameterType::NO_DEP,
1675  NULL, U_NONE, CAT_NONE, "Length dependence of ags");
1676 
1677  p.addPar ("LA1", 0.0, false, ParameterType::NO_DEP,
1679  NULL, U_NONE, CAT_NONE, "Length dependence of a1");
1680 
1681  p.addPar ("LA2", 0.0, false, ParameterType::NO_DEP,
1683  NULL, U_NONE, CAT_NONE, "Length dependence of a2");
1684 
1685  p.addPar ("LKETA", 0.0, false, ParameterType::NO_DEP,
1687  NULL, U_NONE, CAT_NONE, "Length dependence of keta");
1688 
1689  p.addPar ("LNSUB", 0.0, false, ParameterType::NO_DEP,
1691  NULL, U_NONE, CAT_NONE, "Length dependence of nsub");
1692 
1693  p.addPar ("LNDEP", 0.0, false, ParameterType::NO_DEP,
1695  NULL, U_NONE, CAT_NONE, "Length dependence of ndep");
1696 
1697  p.addPar ("LNSD", 0.0, false, ParameterType::NO_DEP,
1699  NULL, U_NONE, CAT_NONE, "Length dependence of nsd");
1700 
1701  p.addPar ("LPHIN", 0.0, false, ParameterType::NO_DEP,
1703  NULL, U_NONE, CAT_NONE, "Length dependence of phin");
1704 
1705  p.addPar ("LNGATE", 0.0, false, ParameterType::NO_DEP,
1707  NULL, U_NONE, CAT_NONE, "Length dependence of ngate");
1708 
1709  p.addPar ("LGAMMA1", 0.0, false, ParameterType::NO_DEP,
1711  NULL, U_NONE, CAT_NONE, "Length dependence of gamma1");
1712 
1713  p.addPar ("LGAMMA2", 0.0, false, ParameterType::NO_DEP,
1715  NULL, U_NONE, CAT_NONE, "Length dependence of gamma2");
1716 
1717  p.addPar ("LVBX", 0.0, false, ParameterType::NO_DEP,
1719  NULL, U_NONE, CAT_NONE, "Length dependence of vbx");
1720 
1721  p.addPar ("LVBM", 0.0, false, ParameterType::NO_DEP,
1723  NULL, U_NONE, CAT_NONE, "Length dependence of vbm");
1724 
1725  p.addPar ("LXT", 0.0, false, ParameterType::NO_DEP,
1727  NULL, U_NONE, CAT_NONE, "Length dependence of xt");
1728 
1729  p.addPar ("LK1", 0.0, false, ParameterType::NO_DEP,
1731  NULL, U_NONE, CAT_NONE, "Length dependence of k1");
1732 
1733  p.addPar ("LKT1", 0.0, false, ParameterType::NO_DEP,
1735  NULL, U_NONE, CAT_NONE, "Length dependence of kt1");
1736 
1737  p.addPar ("LKT1L", 0.0, false, ParameterType::NO_DEP,
1739  NULL, U_NONE, CAT_NONE, "Length dependence of kt1l");
1740 
1741  p.addPar ("LKT2", 0.0, false, ParameterType::NO_DEP,
1743  NULL, U_NONE, CAT_NONE, "Length dependence of kt2");
1744 
1745  p.addPar ("LK2", 0.0, false, ParameterType::NO_DEP,
1747  NULL, U_NONE, CAT_NONE, "Length dependence of k2");
1748 
1749  p.addPar ("LK3", 0.0, false, ParameterType::NO_DEP,
1751  NULL, U_NONE, CAT_NONE, "Length dependence of k3");
1752 
1753  p.addPar ("LK3B", 0.0, false, ParameterType::NO_DEP,
1755  NULL, U_NONE, CAT_NONE, "Length dependence of k3b");
1756 
1757  p.addPar ("LW0", 0.0, false, ParameterType::NO_DEP,
1759  NULL, U_NONE, CAT_NONE, "Length dependence of w0");
1760 
1761  p.addPar ("LDVTP0", 0.0, false, ParameterType::NO_DEP,
1763  NULL, U_NONE, CAT_NONE, "Length dependence of dvtp0");
1764 
1765  p.addPar ("LDVTP1", 0.0, false, ParameterType::NO_DEP,
1767  NULL, U_NONE, CAT_NONE, "Length dependence of dvtp1");
1768 
1769  p.addPar ("LLPE0", 0.0, false, ParameterType::NO_DEP,
1771  NULL, U_NONE, CAT_NONE, "Length dependence of lpe0");
1772 
1773  p.addPar ("LLPEB", 0.0, false, ParameterType::NO_DEP,
1775  NULL, U_NONE, CAT_NONE, "Length dependence of lpeb");
1776 
1777  p.addPar ("LDVT0", 0.0, false, ParameterType::NO_DEP,
1779  NULL, U_NONE, CAT_NONE, "Length dependence of dvt0");
1780 
1781  p.addPar ("LDVT1", 0.0, false, ParameterType::NO_DEP,
1783  NULL, U_NONE, CAT_NONE, "Length dependence of dvt1");
1784 
1785  p.addPar ("LDVT2", 0.0, false, ParameterType::NO_DEP,
1787  NULL, U_NONE, CAT_NONE, "Length dependence of dvt2");
1788 
1789  p.addPar ("LDVT0W", 0.0, false, ParameterType::NO_DEP,
1791  NULL, U_NONE, CAT_NONE, "Length dependence of dvt0w");
1792 
1793  p.addPar ("LDVT1W", 0.0, false, ParameterType::NO_DEP,
1795  NULL, U_NONE, CAT_NONE, "Length dependence of dvt1w");
1796 
1797  p.addPar ("LDVT2W", 0.0, false, ParameterType::NO_DEP,
1799  NULL, U_NONE, CAT_NONE, "Length dependence of dvt2w");
1800 
1801  p.addPar ("LDROUT", 0.0, false, ParameterType::NO_DEP,
1803  NULL, U_NONE, CAT_NONE, "Length dependence of drout");
1804 
1805  p.addPar ("LDSUB", 0.0, false, ParameterType::NO_DEP,
1807  NULL, U_NONE, CAT_NONE, "Length dependence of dsub");
1808 
1809  p.addPar ("LVTH0", 0.0, false, ParameterType::NO_DEP,
1811  NULL, U_NONE, CAT_NONE, "");
1812 
1813  p.addPar ("LUA", 0.0, false, ParameterType::NO_DEP,
1815  NULL, U_NONE, CAT_NONE, "Length dependence of ua");
1816 
1817  p.addPar ("LUA1", 0.0, false, ParameterType::NO_DEP,
1819  NULL, U_NONE, CAT_NONE, "Length dependence of ua1");
1820 
1821  p.addPar ("LUB", 0.0, false, ParameterType::NO_DEP,
1823  NULL, U_NONE, CAT_NONE, "Length dependence of ub");
1824 
1825  p.addPar ("LUB1", 0.0, false, ParameterType::NO_DEP,
1827  NULL, U_NONE, CAT_NONE, "Length dependence of ub1");
1828 
1829  p.addPar ("LUC", 0.0, false, ParameterType::NO_DEP,
1831  NULL, U_NONE, CAT_NONE, "Length dependence of uc");
1832 
1833  p.addPar ("LUC1", 0.0, false, ParameterType::NO_DEP,
1835  NULL, U_NONE, CAT_NONE, "Length dependence of uc1");
1836 
1837  p.addPar ("LUD", 0.0, false, ParameterType::NO_DEP,
1839  NULL, U_NONE, CAT_NONE, "Length dependence of ud");
1840 
1841  p.addPar ("LUD1", 0.0, false, ParameterType::NO_DEP,
1843  NULL, U_NONE, CAT_NONE, "Length dependence of ud1");
1844 
1845  p.addPar ("LUP", 0.0, false, ParameterType::NO_DEP,
1847  NULL, U_NONE, CAT_NONE, "Length dependence of up");
1848 
1849  p.addPar ("LLP", 0.0, false, ParameterType::NO_DEP,
1851  NULL, U_NONE, CAT_NONE, "Length dependence of lp");
1852 
1853  p.addPar ("LU0", 0.0, false, ParameterType::NO_DEP,
1855  NULL, U_NONE, CAT_NONE, "Length dependence of u0");
1856 
1857  p.addPar ("LUTE", 0.0, false, ParameterType::NO_DEP,
1859  NULL, U_NONE, CAT_NONE, "Length dependence of ute");
1860 
1861  p.addPar ("LVOFF", 0.0, false, ParameterType::NO_DEP,
1863  NULL, U_NONE, CAT_NONE, "Length dependence of voff");
1864 
1865  p.addPar ("LMINV", 0.0, false, ParameterType::NO_DEP,
1867  NULL, U_NONE, CAT_NONE, "Length dependence of minv");
1868 
1869  p.addPar ("LMINVCV", 0.0, false, ParameterType::NO_DEP,
1871  NULL, U_NONE, CAT_NONE, "Length dependence of minvcv");
1872 
1873  p.addPar ("LDELTA", 0.0, false, ParameterType::NO_DEP,
1875  NULL, U_NONE, CAT_NONE, "Length dependence of delta");
1876 
1877  p.addPar ("LRDSW", 0.0, false, ParameterType::NO_DEP,
1879  NULL, U_NONE, CAT_NONE, "Length dependence of rdsw ");
1880 
1881  p.addPar ("LRSW", 0.0, false, ParameterType::NO_DEP,
1883  NULL, U_NONE, CAT_NONE, "Length dependence of rsw");
1884 
1885  p.addPar ("LRDW", 0.0, false, ParameterType::NO_DEP,
1887  NULL, U_NONE, CAT_NONE, "Length dependence of rdw");
1888 
1889  p.addPar ("LPRWG", 0.0, false, ParameterType::NO_DEP,
1891  NULL, U_NONE, CAT_NONE, "Length dependence of prwg ");
1892 
1893  p.addPar ("LPRWB", 0.0, false, ParameterType::NO_DEP,
1895  NULL, U_NONE, CAT_NONE, "Length dependence of prwb ");
1896 
1897  p.addPar ("LPRT", 0.0, false, ParameterType::NO_DEP,
1899  NULL, U_NONE, CAT_NONE, "Length dependence of prt ");
1900 
1901  p.addPar ("LETA0", 0.0, false, ParameterType::NO_DEP,
1903  NULL, U_NONE, CAT_NONE, "Length dependence of eta0");
1904 
1905  p.addPar ("LETAB", 0.0, false, ParameterType::NO_DEP,
1907  NULL, U_NONE, CAT_NONE, "Length dependence of etab");
1908 
1909  p.addPar ("LPCLM", 0.0, false, ParameterType::NO_DEP,
1911  NULL, U_NONE, CAT_NONE, "Length dependence of pclm");
1912 
1913  p.addPar ("LPDIBLC1", 0.0, false, ParameterType::NO_DEP,
1915  NULL, U_NONE, CAT_NONE, "Length dependence of pdiblc1");
1916 
1917  p.addPar ("LPDIBLC2", 0.0, false, ParameterType::NO_DEP,
1919  NULL, U_NONE, CAT_NONE, "Length dependence of pdiblc2");
1920 
1921  p.addPar ("LPDIBLCB", 0.0, false, ParameterType::NO_DEP,
1923  NULL, U_NONE, CAT_NONE, "Length dependence of pdiblcb");
1924 
1925  p.addPar ("LFPROUT", 0.0, false, ParameterType::NO_DEP,
1927  NULL, U_NONE, CAT_NONE, "Length dependence of pdiblcb");
1928 
1929  p.addPar ("LPDITS", 0.0, false, ParameterType::NO_DEP,
1931  NULL, U_NONE, CAT_NONE, "Length dependence of pdits");
1932 
1933  p.addPar ("LPDITSD", 0.0, false, ParameterType::NO_DEP,
1935  NULL, U_NONE, CAT_NONE, "Length dependence of pditsd");
1936 
1937  p.addPar ("LPSCBE1", 0.0, false, ParameterType::NO_DEP,
1939  NULL, U_NONE, CAT_NONE, "Length dependence of pscbe1");
1940 
1941  p.addPar ("LPSCBE2", 0.0, false, ParameterType::NO_DEP,
1943  NULL, U_NONE, CAT_NONE, "Length dependence of pscbe2");
1944 
1945  p.addPar ("LPVAG", 0.0, false, ParameterType::NO_DEP,
1947  NULL, U_NONE, CAT_NONE, "Length dependence of pvag");
1948 
1949  p.addPar ("LWR", 0.0, false, ParameterType::NO_DEP,
1951  NULL, U_NONE, CAT_NONE, "Length dependence of wr");
1952 
1953  p.addPar ("LDWG", 0.0, false, ParameterType::NO_DEP,
1955  NULL, U_NONE, CAT_NONE, "Length dependence of dwg");
1956 
1957  p.addPar ("LDWB", 0.0, false, ParameterType::NO_DEP,
1959  NULL, U_NONE, CAT_NONE, "Length dependence of dwb");
1960 
1961  p.addPar ("LB0", 0.0, false, ParameterType::NO_DEP,
1963  NULL, U_NONE, CAT_NONE, "Length dependence of b0");
1964 
1965  p.addPar ("LB1", 0.0, false, ParameterType::NO_DEP,
1967  NULL, U_NONE, CAT_NONE, "Length dependence of b1");
1968 
1969  p.addPar ("LCGSL", 0.0, false, ParameterType::NO_DEP,
1971  NULL, U_NONE, CAT_NONE, "Length dependence of cgsl");
1972 
1973  p.addPar ("LCGDL", 0.0, false, ParameterType::NO_DEP,
1975  NULL, U_NONE, CAT_NONE, "Length dependence of cgdl");
1976 
1977  p.addPar ("LCKAPPAS", 0.0, false, ParameterType::NO_DEP,
1979  NULL, U_NONE, CAT_NONE, "Length dependence of ckappas");
1980 
1981  p.addPar ("LCKAPPAD", 0.0, false, ParameterType::NO_DEP,
1983  NULL, U_NONE, CAT_NONE, "Length dependence of ckappad");
1984 
1985  p.addPar ("LCF", 0.0, false, ParameterType::NO_DEP,
1987  NULL, U_NONE, CAT_NONE, "Length dependence of cf");
1988 
1989  p.addPar ("LCLC", 0.0, false, ParameterType::NO_DEP,
1991  NULL, U_NONE, CAT_NONE, "Length dependence of clc");
1992 
1993  p.addPar ("LCLE", 0.0, false, ParameterType::NO_DEP,
1995  NULL, U_NONE, CAT_NONE, "Length dependence of cle");
1996 
1997  p.addPar ("LALPHA0", 0.0, false, ParameterType::NO_DEP,
1999  NULL, U_NONE, CAT_NONE, "Length dependence of alpha0");
2000 
2001  p.addPar ("LALPHA1", 0.0, false, ParameterType::NO_DEP,
2003  NULL, U_NONE, CAT_NONE, "Length dependence of alpha1");
2004 
2005  p.addPar ("LBETA0", 0.0, false, ParameterType::NO_DEP,
2007  NULL, U_NONE, CAT_NONE, "Length dependence of beta0");
2008 
2009  p.addPar ("LAGIDL", 0.0, false, ParameterType::NO_DEP,
2011  NULL, U_NONE, CAT_NONE, "Length dependence of agidl");
2012 
2013  p.addPar ("LBGIDL", 0.0, false, ParameterType::NO_DEP,
2015  NULL, U_NONE, CAT_NONE, "Length dependence of bgidl");
2016 
2017  p.addPar ("LCGIDL", 0.0, false, ParameterType::NO_DEP,
2019  NULL, U_NONE, CAT_NONE, "Length dependence of cgidl");
2020 
2021  p.addPar ("LEGIDL", 0.0, false, ParameterType::NO_DEP,
2023  NULL, U_NONE, CAT_NONE, "Length dependence of egidl");
2024 
2025  p.addPar ("LAGISL", 0.0, false, ParameterType::NO_DEP,
2027  NULL, U_NONE, CAT_NONE, "Length dependence of agisl");
2028 
2029  p.addPar ("LBGISL", 0.0, false, ParameterType::NO_DEP,
2031  NULL, U_NONE, CAT_NONE, "Length dependence of bgisl");
2032 
2033  p.addPar ("LCGISL", 0.0, false, ParameterType::NO_DEP,
2035  NULL, U_NONE, CAT_NONE, "Length dependence of cgisl");
2036 
2037  p.addPar ("LEGISL", 0.0, false, ParameterType::NO_DEP,
2039  NULL, U_NONE, CAT_NONE, "Length dependence of egisl");
2040 
2041  p.addPar ("LAIGC", 0.0, false, ParameterType::NO_DEP,
2043  NULL, U_NONE, CAT_NONE, "Length dependence of aigc");
2044 
2045  p.addPar ("LBIGC", 0.0, false, ParameterType::NO_DEP,
2047  NULL, U_NONE, CAT_NONE, "Length dependence of bigc");
2048 
2049  p.addPar ("LCIGC", 0.0, false, ParameterType::NO_DEP,
2051  NULL, U_NONE, CAT_NONE, "Length dependence of cigc");
2052 
2053  p.addPar ("LAIGSD", 0.0, false, ParameterType::NO_DEP,
2055  NULL, U_NONE, CAT_NONE, "Length dependence of aigsd");
2056 
2057  p.addPar ("LBIGSD", 0.0, false, ParameterType::NO_DEP,
2059  NULL, U_NONE, CAT_NONE, "Length dependence of bigsd");
2060 
2061  p.addPar ("LCIGSD", 0.0, false, ParameterType::NO_DEP,
2063  NULL, U_NONE, CAT_NONE, "Length dependence of cigsd");
2064 
2065 
2066  p.addPar ("LAIGS", 0.0, false, ParameterType::NO_DEP,
2068  NULL, U_NONE, CAT_NONE,"Length dependence of aigs");
2069 
2070  p.addPar ("LBIGS", 0.0, false, ParameterType::NO_DEP,
2072  NULL, U_NONE, CAT_NONE, "Length dependence of bigs");
2073 
2074  p.addPar ("LCIGS", 0.0, false, ParameterType::NO_DEP,
2076  NULL, U_NONE, CAT_NONE, "Length dependence of cigs");
2077 
2078  p.addPar ("LAIGD", 0.0, false, ParameterType::NO_DEP,
2080  NULL, U_NONE, CAT_NONE, "Length dependence of aigd");
2081 
2082  p.addPar ("LBIGD", 0.0, false, ParameterType::NO_DEP,
2084  NULL, U_NONE, CAT_NONE,"Length dependence of bigd");
2085 
2086  p.addPar ("LCIGD", 0.0, false, ParameterType::NO_DEP,
2088  NULL, U_NONE, CAT_NONE,"Length dependence of cigd");
2089 
2090  p.addPar ("LAIGBACC", 0.0, false, ParameterType::NO_DEP,
2092  NULL, U_NONE, CAT_NONE, "Length dependence of aigbacc");
2093 
2094  p.addPar ("LBIGBACC", 0.0, false, ParameterType::NO_DEP,
2096  NULL, U_NONE, CAT_NONE, "Length dependence of bigbacc");
2097 
2098  p.addPar ("LCIGBACC", 0.0, false, ParameterType::NO_DEP,
2100  NULL, U_NONE, CAT_NONE, "Length dependence of cigbacc");
2101 
2102  p.addPar ("LAIGBINV", 0.0, false, ParameterType::NO_DEP,
2104  NULL, U_NONE, CAT_NONE, "Length dependence of aigbinv");
2105 
2106  p.addPar ("LBIGBINV", 0.0, false, ParameterType::NO_DEP,
2108  NULL, U_NONE, CAT_NONE, "Length dependence of bigbinv");
2109 
2110  p.addPar ("LCIGBINV", 0.0, false, ParameterType::NO_DEP,
2112  NULL, U_NONE, CAT_NONE, "Length dependence of cigbinv");
2113 
2114  p.addPar ("LNIGC", 0.0, false, ParameterType::NO_DEP,
2116  NULL, U_NONE, CAT_NONE, "Length dependence of nigc");
2117 
2118  p.addPar ("LNIGBINV", 0.0, false, ParameterType::NO_DEP,
2120  NULL, U_NONE, CAT_NONE, "Length dependence of nigbinv");
2121 
2122  p.addPar ("LNIGBACC", 0.0, false, ParameterType::NO_DEP,
2124  NULL, U_NONE, CAT_NONE, "Length dependence of nigbacc");
2125 
2126  p.addPar ("LNTOX", 0.0, false, ParameterType::NO_DEP,
2128  NULL, U_NONE, CAT_NONE, "Length dependence of ntox");
2129 
2130  p.addPar ("LEIGBINV", 0.0, false, ParameterType::NO_DEP,
2132  NULL, U_NONE, CAT_NONE, "Length dependence for eigbinv");
2133 
2134  p.addPar ("LPIGCD", 0.0, false, ParameterType::NO_DEP,
2136  NULL, U_NONE, CAT_NONE, "Length dependence for pigcd");
2137 
2138  p.addPar ("LPOXEDGE", 0.0, false, ParameterType::NO_DEP,
2140  NULL, U_NONE, CAT_NONE, "Length dependence for poxedge");
2141 
2142  p.addPar ("LVFBCV", 0.0, false, ParameterType::NO_DEP,
2144  NULL, U_NONE, CAT_NONE, "Length dependence of vfbcv");
2145 
2146  p.addPar ("LVFB", 0.0, false, ParameterType::NO_DEP,
2148  NULL, U_NONE, CAT_NONE, "Length dependence of vfb");
2149 
2150  p.addPar ("LACDE", 0.0, false, ParameterType::NO_DEP,
2152  NULL, U_NONE, CAT_NONE, "Length dependence of acde");
2153 
2154  p.addPar ("LMOIN", 0.0, false, ParameterType::NO_DEP,
2156  NULL, U_NONE, CAT_NONE, "Length dependence of moin");
2157 
2158  p.addPar ("LNOFF", 0.0, false, ParameterType::NO_DEP,
2160  NULL, U_NONE, CAT_NONE, "Length dependence of noff");
2161 
2162  p.addPar ("LVOFFCV", 0.0, false, ParameterType::NO_DEP,
2164  NULL, U_NONE, CAT_NONE, "Length dependence of voffcv");
2165 
2166  p.addPar ("LXRCRG1", 0.0, false, ParameterType::NO_DEP,
2168  NULL, U_NONE, CAT_NONE, "Length dependence of xrcrg1");
2169 
2170  p.addPar ("LXRCRG2", 0.0, false, ParameterType::NO_DEP,
2172  NULL, U_NONE, CAT_NONE, "Length dependence of xrcrg2");
2173 
2174  p.addPar ("LLAMBDA", 0.0, false, ParameterType::NO_DEP,
2176  NULL, U_NONE, CAT_NONE, "Length dependence of lambda");
2177 
2178  p.addPar ("LVTL", 0.0, false, ParameterType::NO_DEP,
2180  NULL, U_NONE, CAT_NONE, " Length dependence of vtl");
2181 
2182  p.addPar ("LXN", 0.0, false, ParameterType::NO_DEP,
2184  NULL, U_NONE, CAT_NONE, " Length dependence of xn");
2185 
2186  p.addPar ("LEU", 0.0, false, ParameterType::NO_DEP,
2188  NULL, U_NONE, CAT_NONE, " Length dependence of eu");
2189 
2190  p.addPar ("LVFBSDOFF",0.0, false, ParameterType::NO_DEP,
2192  NULL, U_NONE, CAT_NONE, "Length dependence of vfbsdoff");
2193 
2194  p.addPar ("LTVFBSDOFF",0.0, false, ParameterType::NO_DEP,
2196  NULL, U_NONE, CAT_NONE, "Length dependence of tvfbsdoff");
2197 
2198  p.addPar ("LTVOFF", 0.0, false, ParameterType::NO_DEP,
2200  NULL, U_NONE, CAT_NONE, "Length dependence of tvoff");
2201 
2202  p.addPar ("WCDSC", 0.0, false, ParameterType::NO_DEP,
2204  NULL, U_NONE, CAT_NONE, "Width dependence of cdsc");
2205 
2206  p.addPar ("WCDSCB", 0.0, false, ParameterType::NO_DEP,
2208  NULL, U_NONE, CAT_NONE, "Width dependence of cdscb");
2209 
2210  p.addPar ("WCDSCD", 0.0, false, ParameterType::NO_DEP,
2212  NULL, U_NONE, CAT_NONE, "Width dependence of cdscd");
2213 
2214  p.addPar ("WCIT", 0.0, false, ParameterType::NO_DEP,
2216  NULL, U_NONE, CAT_NONE, "Width dependence of cit");
2217 
2218  p.addPar ("WNFACTOR", 0.0, false, ParameterType::NO_DEP,
2220  NULL, U_NONE, CAT_NONE, "Width dependence of nfactor");
2221 
2222  p.addPar ("WXJ", 0.0, false, ParameterType::NO_DEP,
2224  NULL, U_NONE, CAT_NONE, "Width dependence of xj");
2225 
2226  p.addPar ("WVSAT", 0.0, false, ParameterType::NO_DEP,
2228  NULL, U_NONE, CAT_NONE, "Width dependence of vsat");
2229 
2230  p.addPar ("WAT", 0.0, false, ParameterType::NO_DEP,
2232  NULL, U_NONE, CAT_NONE, "Width dependence of at");
2233 
2234  p.addPar ("WA0", 0.0, false, ParameterType::NO_DEP,
2236  NULL, U_NONE, CAT_NONE, "Width dependence of a0");
2237 
2238  p.addPar ("WAGS", 0.0, false, ParameterType::NO_DEP,
2240  NULL, U_NONE, CAT_NONE, "Width dependence of ags");
2241 
2242  p.addPar ("WA1", 0.0, false, ParameterType::NO_DEP,
2244  NULL, U_NONE, CAT_NONE, "Width dependence of a1");
2245 
2246  p.addPar ("WA2", 0.0, false, ParameterType::NO_DEP,
2248  NULL, U_NONE, CAT_NONE, "Width dependence of a2");
2249 
2250  p.addPar ("WKETA", 0.0, false, ParameterType::NO_DEP,
2252  NULL, U_NONE, CAT_NONE, "Width dependence of keta");
2253 
2254  p.addPar ("WNSUB", 0.0, false, ParameterType::NO_DEP,
2256  NULL, U_NONE, CAT_NONE, "Width dependence of nsub");
2257 
2258  p.addPar ("WNDEP", 0.0, false, ParameterType::NO_DEP,
2260  NULL, U_NONE, CAT_NONE, "Width dependence of ndep");
2261 
2262  p.addPar ("WNSD", 0.0, false, ParameterType::NO_DEP,
2264  NULL, U_NONE, CAT_NONE, "Width dependence of nsd");
2265 
2266  p.addPar ("WPHIN", 0.0, false, ParameterType::NO_DEP,
2268  NULL, U_NONE, CAT_NONE, "Width dependence of phin");
2269 
2270  p.addPar ("WNGATE", 0.0, false, ParameterType::NO_DEP,
2272  NULL, U_NONE, CAT_NONE, "Width dependence of ngate");
2273 
2274  p.addPar ("WGAMMA1", 0.0, false, NO_DEP,
2276  NULL, U_NONE, CAT_NONE, "Width dependence of gamma1");
2277 
2278  p.addPar ("WGAMMA2", 0.0, false, NO_DEP,
2280  NULL, U_NONE, CAT_NONE, "Width dependence of gamma2");
2281 
2282  p.addPar ("WVBX", 0.0, false, ParameterType::NO_DEP,
2284  NULL, U_NONE, CAT_NONE, "Width dependence of vbx");
2285 
2286  p.addPar ("WVBM", 0.0, false, ParameterType::NO_DEP,
2288  NULL, U_NONE, CAT_NONE, "Width dependence of vbm");
2289 
2290  p.addPar ("WXT", 0.0, false, ParameterType::NO_DEP,
2292  NULL, U_NONE, CAT_NONE, "Width dependence of xt");
2293 
2294  p.addPar ("WK1", 0.0, false, ParameterType::NO_DEP,
2296  NULL, U_NONE, CAT_NONE, "Width dependence of k1");
2297 
2298  p.addPar ("WKT1", 0.0, false, ParameterType::NO_DEP,
2300  NULL, U_NONE, CAT_NONE, "Width dependence of kt1");
2301 
2302  p.addPar ("WKT1L", 0.0, false, ParameterType::NO_DEP,
2304  NULL, U_NONE, CAT_NONE, "Width dependence of kt1l");
2305 
2306  p.addPar ("WKT2", 0.0, false, ParameterType::NO_DEP,
2308  NULL, U_NONE, CAT_NONE, "Width dependence of kt2");
2309 
2310  p.addPar ("WK2", 0.0, false, ParameterType::NO_DEP,
2312  NULL, U_NONE, CAT_NONE, "Width dependence of k2");
2313 
2314  p.addPar ("WK3", 0.0, false, ParameterType::NO_DEP,
2316  NULL, U_NONE, CAT_NONE, "Width dependence of k3");
2317 
2318  p.addPar ("WK3B", 0.0, false, ParameterType::NO_DEP,
2320  NULL, U_NONE, CAT_NONE, "Width dependence of k3b");
2321 
2322  p.addPar ("WW0", 0.0, false, ParameterType::NO_DEP,
2324  NULL, U_NONE, CAT_NONE, "Width dependence of w0");
2325 
2326  p.addPar ("WDVTP0", 0.0, false, ParameterType::NO_DEP,
2328  NULL, U_NONE, CAT_NONE, "Width dependence of dvtp0");
2329 
2330  p.addPar ("WDVTP1", 0.0, false, ParameterType::NO_DEP,
2332  NULL, U_NONE, CAT_NONE, "Width dependence of dvtp1");
2333 
2334  p.addPar ("WLPE0", 0.0, false, ParameterType::NO_DEP,
2336  NULL, U_NONE, CAT_NONE, "Width dependence of lpe0");
2337 
2338  p.addPar ("WLPEB", 0.0, false, ParameterType::NO_DEP,
2340  NULL, U_NONE, CAT_NONE, "Width dependence of lpeb");
2341 
2342  p.addPar ("WDVT0", 0.0, false, ParameterType::NO_DEP,
2344  NULL, U_NONE, CAT_NONE, "Width dependence of dvt0");
2345 
2346  p.addPar ("WDVT1", 0.0, false, ParameterType::NO_DEP,
2348  NULL, U_NONE, CAT_NONE, "Width dependence of dvt1");
2349 
2350  p.addPar ("WDVT2", 0.0, false, ParameterType::NO_DEP,
2352  NULL, U_NONE, CAT_NONE, "Width dependence of dvt2");
2353 
2354  p.addPar ("WDVT0W", 0.0, false, ParameterType::NO_DEP,
2356  NULL, U_NONE, CAT_NONE, "Width dependence of dvt0w");
2357 
2358  p.addPar ("WDVT1W", 0.0, false, ParameterType::NO_DEP,
2360  NULL, U_NONE, CAT_NONE, "Width dependence of dvt1w");
2361 
2362  p.addPar ("WDVT2W", 0.0, false, ParameterType::NO_DEP,
2364  NULL, U_NONE, CAT_NONE, "Width dependence of dvt2w");
2365 
2366  p.addPar ("WDROUT", 0.0, false, ParameterType::NO_DEP,
2368  NULL, U_NONE, CAT_NONE, "Width dependence of drout");
2369 
2370  p.addPar ("WDSUB", 0.0, false, ParameterType::NO_DEP,
2372  NULL, U_NONE, CAT_NONE, "Width dependence of dsub");
2373 
2374  p.addPar ("WVTH0", 0.0, false, ParameterType::NO_DEP,
2376  NULL, U_NONE, CAT_NONE, "");
2377 
2378  p.addPar ("WUA", 0.0, false, ParameterType::NO_DEP,
2380  NULL, U_NONE, CAT_NONE, "Width dependence of ua");
2381 
2382  p.addPar ("WUA1", 0.0, false, ParameterType::NO_DEP,
2384  NULL, U_NONE, CAT_NONE, "Width dependence of ua1");
2385 
2386  p.addPar ("WUB", 0.0, false, ParameterType::NO_DEP,
2388  NULL, U_NONE, CAT_NONE, "Width dependence of ub");
2389 
2390  p.addPar ("WUB1", 0.0, false, ParameterType::NO_DEP,
2392  NULL, U_NONE, CAT_NONE, "Width dependence of ub1");
2393 
2394  p.addPar ("WUC", 0.0, false, ParameterType::NO_DEP,
2396  NULL, U_NONE, CAT_NONE, "Width dependence of uc");
2397 
2398  p.addPar ("WUC1", 0.0, false, ParameterType::NO_DEP,
2400  NULL, U_NONE, CAT_NONE, "Width dependence of uc1");
2401 
2402  p.addPar ("WUD", 0.0, false, ParameterType::NO_DEP,
2404  NULL, U_NONE, CAT_NONE, "Width dependence of ud");
2405 
2406  p.addPar ("WUD1", 0.0, false, ParameterType::NO_DEP,
2408  NULL, U_NONE, CAT_NONE, "Width dependence of ud1");
2409 
2410  p.addPar ("WUP", 0.0, false, ParameterType::NO_DEP,
2412  NULL, U_NONE, CAT_NONE, "Width dependence of up");
2413 
2414  p.addPar ("WLP", 0.0, false, ParameterType::NO_DEP,
2416  NULL, U_NONE, CAT_NONE, "Width dependence of lp");
2417 
2418  p.addPar ("WU0", 0.0, false, ParameterType::NO_DEP,
2420  NULL, U_NONE, CAT_NONE, "Width dependence of u0");
2421 
2422  p.addPar ("WUTE", 0.0, false, ParameterType::NO_DEP,
2424  NULL, U_NONE, CAT_NONE, "Width dependence of ute");
2425 
2426  p.addPar ("WVOFF", 0.0, false, ParameterType::NO_DEP,
2428  NULL, U_NONE, CAT_NONE, "Width dependence of voff");
2429 
2430  p.addPar ("WMINV", 0.0, false, ParameterType::NO_DEP,
2432  NULL, U_NONE, CAT_NONE, "Width dependence of minv");
2433 
2434  p.addPar ("WMINVCV", 0.0, false, ParameterType::NO_DEP,
2436  NULL, U_NONE, CAT_NONE, "Width dependence of minvcv");
2437 
2438  p.addPar ("WDELTA", 0.0, false, ParameterType::NO_DEP,
2440  NULL, U_NONE, CAT_NONE, "Width dependence of delta");
2441 
2442  p.addPar ("WRDSW", 0.0, false, ParameterType::NO_DEP,
2444  NULL, U_NONE, CAT_NONE, "Width dependence of rdsw ");
2445 
2446  p.addPar ("WRSW", 0.0, false, ParameterType::NO_DEP,
2448  NULL, U_NONE, CAT_NONE, "Width dependence of rsw");
2449 
2450  p.addPar ("WRDW", 0.0, false, ParameterType::NO_DEP,
2452  NULL, U_NONE, CAT_NONE, "Width dependence of rdw");
2453 
2454  p.addPar ("WPRWG", 0.0, false, ParameterType::NO_DEP,
2456  NULL, U_NONE, CAT_NONE, "Width dependence of prwg ");
2457 
2458  p.addPar ("WPRWB", 0.0, false, ParameterType::NO_DEP,
2460  NULL, U_NONE, CAT_NONE, "Width dependence of prwb ");
2461 
2462  p.addPar ("WPRT", 0.0, false, ParameterType::NO_DEP,
2464  NULL, U_NONE, CAT_NONE, "Width dependence of prt");
2465 
2466  p.addPar ("WETA0", 0.0, false, ParameterType::NO_DEP,
2468  NULL, U_NONE, CAT_NONE, "Width dependence of eta0");
2469 
2470  p.addPar ("WETAB", 0.0, false, ParameterType::NO_DEP,
2472  NULL, U_NONE, CAT_NONE, "Width dependence of etab");
2473 
2474  p.addPar ("WPCLM", 0.0, false, ParameterType::NO_DEP,
2476  NULL, U_NONE, CAT_NONE, "Width dependence of pclm");
2477 
2478  p.addPar ("WPDIBLC1", 0.0, false, ParameterType::NO_DEP,
2480  NULL, U_NONE, CAT_NONE, "Width dependence of pdiblc1");
2481 
2482  p.addPar ("WPDIBLC2", 0.0, false, ParameterType::NO_DEP,
2484  NULL, U_NONE, CAT_NONE, "Width dependence of pdiblc2");
2485 
2486  p.addPar ("WPDIBLCB", 0.0, false, ParameterType::NO_DEP,
2488  NULL, U_NONE, CAT_NONE, "Width dependence of pdiblcb");
2489 
2490  p.addPar ("WFPROUT", 0.0, false, ParameterType::NO_DEP,
2492  NULL, U_NONE, CAT_NONE, "Width dependence of pdiblcb");
2493 
2494  p.addPar ("WPDITS", 0.0, false, ParameterType::NO_DEP,
2496  NULL, U_NONE, CAT_NONE, "Width dependence of pdits");
2497 
2498  p.addPar ("WPDITSD", 0.0, false, ParameterType::NO_DEP,
2500  NULL, U_NONE, CAT_NONE, "Width dependence of pditsd");
2501 
2502  p.addPar ("WPSCBE1", 0.0, false, ParameterType::NO_DEP,
2504  NULL, U_NONE, CAT_NONE, "Width dependence of pscbe1");
2505 
2506  p.addPar ("WPSCBE2", 0.0, false, ParameterType::NO_DEP,
2508  NULL, U_NONE, CAT_NONE, "Width dependence of pscbe2");
2509 
2510  p.addPar ("WPVAG", 0.0, false, ParameterType::NO_DEP,
2512  NULL, U_NONE, CAT_NONE, "Width dependence of pvag");
2513 
2514  p.addPar ("WWR", 0.0, false, ParameterType::NO_DEP,
2516  NULL, U_NONE, CAT_NONE, "Width dependence of wr");
2517 
2518  p.addPar ("WDWG", 0.0, false, ParameterType::NO_DEP,
2520  NULL, U_NONE, CAT_NONE, "Width dependence of dwg");
2521 
2522  p.addPar ("WDWB", 0.0, false, ParameterType::NO_DEP,
2524  NULL, U_NONE, CAT_NONE, "Width dependence of dwb");
2525 
2526  p.addPar ("WB0", 0.0, false, ParameterType::NO_DEP,
2528  NULL, U_NONE, CAT_NONE, "Width dependence of b0");
2529 
2530  p.addPar ("WB1", 0.0, false, ParameterType::NO_DEP,
2532  NULL, U_NONE, CAT_NONE, "Width dependence of b1");
2533 
2534  p.addPar ("WCGSL", 0.0, false, ParameterType::NO_DEP,
2536  NULL, U_NONE, CAT_NONE, "Width dependence of cgsl");
2537 
2538  p.addPar ("WCGDL", 0.0, false, ParameterType::NO_DEP,
2540  NULL, U_NONE, CAT_NONE, "Width dependence of cgdl");
2541 
2542  p.addPar ("WCKAPPAS", 0.0, false, ParameterType::NO_DEP,
2544  NULL, U_NONE, CAT_NONE, "Width dependence of ckappas");
2545 
2546  p.addPar ("WCKAPPAD", 0.0, false, ParameterType::NO_DEP,
2548  NULL, U_NONE, CAT_NONE, "Width dependence of ckappad");
2549 
2550  p.addPar ("WCF", 0.0, false, ParameterType::NO_DEP,
2552  NULL, U_NONE, CAT_NONE, "Width dependence of cf");
2553 
2554  p.addPar ("WCLC", 0.0, false, ParameterType::NO_DEP,
2556  NULL, U_NONE, CAT_NONE, "Width dependence of clc");
2557 
2558  p.addPar ("WCLE", 0.0, false, ParameterType::NO_DEP,
2560  NULL, U_NONE, CAT_NONE, "Width dependence of cle");
2561 
2562  p.addPar ("WALPHA0", 0.0, false, ParameterType::NO_DEP,
2564  NULL, U_NONE, CAT_NONE, "Width dependence of alpha0");
2565 
2566  p.addPar ("WALPHA1", 0.0, false, ParameterType::NO_DEP,
2568  NULL, U_NONE, CAT_NONE, "Width dependence of alpha1");
2569 
2570  p.addPar ("WBETA0", 0.0, false, ParameterType::NO_DEP,
2572  NULL, U_NONE, CAT_NONE, "Width dependence of beta0");
2573 
2574  p.addPar ("WAGIDL", 0.0, false, ParameterType::NO_DEP,
2576  NULL, U_NONE, CAT_NONE, "Width dependence of agidl");
2577 
2578  p.addPar ("WBGIDL", 0.0, false, ParameterType::NO_DEP,
2580  NULL, U_NONE, CAT_NONE, "Width dependence of bgidl");
2581 
2582  p.addPar ("WCGIDL", 0.0, false, ParameterType::NO_DEP,
2584  NULL, U_NONE, CAT_NONE, "Width dependence of cgidl");
2585 
2586  p.addPar ("WEGIDL", 0.0, false, ParameterType::NO_DEP,
2588  NULL, U_NONE, CAT_NONE, "Width dependence of egidl");
2589 
2590  p.addPar ("WAGISL", 0.0, false, ParameterType::NO_DEP,
2592  NULL, U_NONE, CAT_NONE, "Width dependence of agisl");
2593 
2594  p.addPar ("WBGISL", 0.0, false, ParameterType::NO_DEP,
2596  NULL, U_NONE, CAT_NONE, "Width dependence of bgisl");
2597 
2598  p.addPar ("WCGISL", 0.0, false, ParameterType::NO_DEP,
2600  NULL, U_NONE, CAT_NONE, "Width dependence of cgisl");
2601 
2602  p.addPar ("WEGISL", 0.0, false, ParameterType::NO_DEP,
2604  NULL, U_NONE, CAT_NONE, "Width dependence of egisl");
2605 
2606  p.addPar ("WAIGC", 0.0, false, ParameterType::NO_DEP,
2608  NULL, U_NONE, CAT_NONE, "Width dependence of aigc");
2609 
2610  p.addPar ("WBIGC", 0.0, false, ParameterType::NO_DEP,
2612  NULL, U_NONE, CAT_NONE, "Width dependence of bigc");
2613 
2614  p.addPar ("WCIGC", 0.0, false, ParameterType::NO_DEP,
2616  NULL, U_NONE, CAT_NONE, "Width dependence of cigc");
2617 
2618  p.addPar ("WAIGSD", 0.0, false, ParameterType::NO_DEP,
2620  NULL, U_NONE, CAT_NONE, "Width dependence of aigsd");
2621 
2622  p.addPar ("WBIGSD", 0.0, false, ParameterType::NO_DEP,
2624  NULL, U_NONE, CAT_NONE, "Width dependence of bigsd");
2625 
2626  p.addPar ("WCIGSD", 0.0, false, ParameterType::NO_DEP,
2628  NULL, U_NONE, CAT_NONE, "Width dependence of cigsd");
2629 
2630  p.addPar ("WAIGS",0.0, false, ParameterType::NO_DEP,
2632  NULL, U_NONE, CAT_NONE,"Width dependence of aigs");
2633 
2634  p.addPar ("WBIGS",0.0, false, ParameterType::NO_DEP,
2636  NULL, U_NONE, CAT_NONE,"Width dependence of bigs");
2637 
2638  p.addPar ("WCIGS",0.0, false, ParameterType::NO_DEP,
2640  NULL, U_NONE, CAT_NONE,"Width dependence of cigs");
2641 
2642  p.addPar ("WAIGD",0.0, false, ParameterType::NO_DEP,
2644  NULL, U_NONE, CAT_NONE,"Width dependence of aigd");
2645 
2646  p.addPar ("WBIGD",0.0, false, ParameterType::NO_DEP,
2648  NULL, U_NONE, CAT_NONE,"Width dependence of bigd");
2649 
2650  p.addPar ("WCIGD",0.0, false, ParameterType::NO_DEP,
2652  NULL, U_NONE, CAT_NONE,"Width dependence of cigd");
2653 
2654  p.addPar ("WAIGBACC", 0.0, false, ParameterType::NO_DEP,
2656  NULL, U_NONE, CAT_NONE, "Width dependence of aigbacc");
2657 
2658  p.addPar ("WBIGBACC", 0.0, false, ParameterType::NO_DEP,
2660  NULL, U_NONE, CAT_NONE, "Width dependence of bigbacc");
2661 
2662  p.addPar ("WCIGBACC", 0.0, false, ParameterType::NO_DEP,
2664  NULL, U_NONE, CAT_NONE, "Width dependence of cigbacc");
2665 
2666  p.addPar ("WAIGBINV", 0.0, false, ParameterType::NO_DEP,
2668  NULL, U_NONE, CAT_NONE, "Width dependence of aigbinv");
2669 
2670  p.addPar ("WBIGBINV", 0.0, false, ParameterType::NO_DEP,
2672  NULL, U_NONE, CAT_NONE, "Width dependence of bigbinv");
2673 
2674  p.addPar ("WCIGBINV", 0.0, false, ParameterType::NO_DEP,
2676  NULL, U_NONE, CAT_NONE, "Width dependence of cigbinv");
2677 
2678  p.addPar ("WNIGC", 0.0, false, ParameterType::NO_DEP,
2680  NULL, U_NONE, CAT_NONE, "Width dependence of nigc");
2681 
2682  p.addPar ("WNIGBINV", 0.0, false, ParameterType::NO_DEP,
2684  NULL, U_NONE, CAT_NONE, "Width dependence of nigbinv");
2685 
2686  p.addPar ("WNIGBACC", 0.0, false, ParameterType::NO_DEP,
2688  NULL, U_NONE, CAT_NONE, "Width dependence of nigbacc");
2689 
2690  p.addPar ("WNTOX", 0.0, false, ParameterType::NO_DEP,
2692  NULL, U_NONE, CAT_NONE, "Width dependence of ntox");
2693 
2694  p.addPar ("WEIGBINV", 0.0, false, ParameterType::NO_DEP,
2696  NULL, U_NONE, CAT_NONE, "Width dependence for eigbinv");
2697 
2698  p.addPar ("WPIGCD", 0.0, false, ParameterType::NO_DEP,
2700  NULL, U_NONE, CAT_NONE, "Width dependence for pigcd");
2701 
2702  p.addPar ("WPOXEDGE", 0.0, false, ParameterType::NO_DEP,
2704  NULL, U_NONE, CAT_NONE, "Width dependence for poxedge");
2705 
2706  p.addPar ("WVFBCV", 0.0, false, ParameterType::NO_DEP,
2708  NULL, U_NONE, CAT_NONE, "Width dependence of vfbcv");
2709 
2710  p.addPar ("WVFB", 0.0, false, ParameterType::NO_DEP,
2712  NULL, U_NONE, CAT_NONE, "Width dependence of vfb");
2713 
2714  p.addPar ("WACDE", 0.0, false, ParameterType::NO_DEP,
2716  NULL, U_NONE, CAT_NONE, "Width dependence of acde");
2717 
2718  p.addPar ("WMOIN", 0.0, false, ParameterType::NO_DEP,
2720  NULL, U_NONE, CAT_NONE, "Width dependence of moin");
2721 
2722  p.addPar ("WNOFF", 0.0, false, ParameterType::NO_DEP,
2724  NULL, U_NONE, CAT_NONE, "Width dependence of noff");
2725 
2726  p.addPar ("WVOFFCV", 0.0, false, ParameterType::NO_DEP,
2728  NULL, U_NONE, CAT_NONE, "Width dependence of voffcv");
2729 
2730  p.addPar ("WXRCRG1", 0.0, false, ParameterType::NO_DEP,
2732  NULL, U_NONE, CAT_NONE, "Width dependence of xrcrg1");
2733 
2734  p.addPar ("WXRCRG2", 0.0, false, ParameterType::NO_DEP,
2736  NULL, U_NONE, CAT_NONE, "Width dependence of xrcrg2");
2737 
2738  p.addPar ("WLAMBDA", 0.0, false, ParameterType::NO_DEP,
2740  NULL, U_NONE, CAT_NONE, "Width dependence of lambda");
2741 
2742  p.addPar ("WVTL", 0.0, false, ParameterType::NO_DEP,
2744  NULL, U_NONE, CAT_NONE, "Width dependence of vtl");
2745 
2746  p.addPar ("WXN", 0.0, false, ParameterType::NO_DEP,
2748  NULL, U_NONE, CAT_NONE, "Width dependence of xn");
2749 
2750  p.addPar ("WEU", 0.0, false, ParameterType::NO_DEP,
2752  NULL, U_NONE, CAT_NONE, "Width dependence of eu");
2753 
2754  p.addPar ("WVFBSDOFF", 0.0, false, ParameterType::NO_DEP,
2756  NULL, U_NONE, CAT_NONE, "Width dependence of vfbsdoff");
2757 
2758  p.addPar ("WTVFBSDOFF", 0.0, false, ParameterType::NO_DEP,
2760  NULL, U_NONE, CAT_NONE, "Width dependence of tvfbsdoff");
2761 
2762  p.addPar ("WTVOFF", 0.0, false, ParameterType::NO_DEP,
2764  NULL, U_NONE, CAT_NONE, "Width dependence of tvoff");
2765 
2766  p.addPar ("PCDSC", 0.0, false, ParameterType::NO_DEP,
2768  NULL, U_NONE, CAT_NONE, "Cross-term dependence of cdsc");
2769 
2770  p.addPar ("PCDSCB", 0.0, false, ParameterType::NO_DEP,
2772  NULL, U_NONE, CAT_NONE, "Cross-term dependence of cdscb");
2773 
2774  p.addPar ("PCDSCD", 0.0, false, ParameterType::NO_DEP,
2776  NULL, U_NONE, CAT_NONE, "Cross-term dependence of cdscd");
2777 
2778  p.addPar ("PCIT", 0.0, false, ParameterType::NO_DEP,
2780  NULL, U_NONE, CAT_NONE, "Cross-term dependence of cit");
2781 
2782  p.addPar ("PNFACTOR", 0.0, false, ParameterType::NO_DEP,
2784  NULL, U_NONE, CAT_NONE, "Cross-term dependence of nfactor");
2785 
2786  p.addPar ("PXJ", 0.0, false, ParameterType::NO_DEP,
2788  NULL, U_NONE, CAT_NONE, "Cross-term dependence of xj");
2789 
2790  p.addPar ("PVSAT", 0.0, false, ParameterType::NO_DEP,
2792  NULL, U_NONE, CAT_NONE, "Cross-term dependence of vsat");
2793 
2794  p.addPar ("PAT", 0.0, false, ParameterType::NO_DEP,
2796  NULL, U_NONE, CAT_NONE, "Cross-term dependence of at");
2797 
2798  p.addPar ("PA0", 0.0, false, ParameterType::NO_DEP,
2800  NULL, U_NONE, CAT_NONE, "Cross-term dependence of a0");
2801 
2802  p.addPar ("PAGS", 0.0, false, ParameterType::NO_DEP,
2804  NULL, U_NONE, CAT_NONE, "Cross-term dependence of ags");
2805 
2806  p.addPar ("PA1", 0.0, false, ParameterType::NO_DEP,
2808  NULL, U_NONE, CAT_NONE, "Cross-term dependence of a1");
2809 
2810  p.addPar ("PA2", 0.0, false, ParameterType::NO_DEP,
2812  NULL, U_NONE, CAT_NONE, "Cross-term dependence of a2");
2813 
2814  p.addPar ("PKETA", 0.0, false, ParameterType::NO_DEP,
2816  NULL, U_NONE, CAT_NONE, "Cross-term dependence of keta");
2817 
2818  p.addPar ("PNSUB", 0.0, false, ParameterType::NO_DEP,
2820  NULL, U_NONE, CAT_NONE, "Cross-term dependence of nsub");
2821 
2822  p.addPar ("PNDEP", 0.0, false, ParameterType::NO_DEP,
2824  NULL, U_NONE, CAT_NONE, "Cross-term dependence of ndep");
2825 
2826  p.addPar ("PNSD", 0.0, false, ParameterType::NO_DEP,
2828  NULL, U_NONE, CAT_NONE, "Cross-term dependence of nsd");
2829 
2830  p.addPar ("PPHIN", 0.0, false, ParameterType::NO_DEP,
2832  NULL, U_NONE, CAT_NONE, "Cross-term dependence of phin");
2833 
2834  p.addPar ("PNGATE", 0.0, false, ParameterType::NO_DEP,
2836  NULL, U_NONE, CAT_NONE, "Cross-term dependence of ngate");
2837 
2838  p.addPar ("PGAMMA1", 0.0, false, ParameterType::NO_DEP,
2840  NULL, U_NONE, CAT_NONE, "Cross-term dependence of gamma1");
2841 
2842  p.addPar ("PGAMMA2", 0.0, false, ParameterType::NO_DEP,
2844  NULL, U_NONE, CAT_NONE, "Cross-term dependence of gamma2");
2845 
2846  p.addPar ("PVBX", 0.0, false, ParameterType::NO_DEP,
2848  NULL, U_NONE, CAT_NONE, "Cross-term dependence of vbx");
2849 
2850  p.addPar ("PVBM", 0.0, false, ParameterType::NO_DEP,
2852  NULL, U_NONE, CAT_NONE, "Cross-term dependence of vbm");
2853 
2854  p.addPar ("PXT", 0.0, false, ParameterType::NO_DEP,
2856  NULL, U_NONE, CAT_NONE, "Cross-term dependence of xt");
2857 
2858  p.addPar ("PK1", 0.0, false, ParameterType::NO_DEP,
2860  NULL, U_NONE, CAT_NONE, "Cross-term dependence of k1");
2861 
2862  p.addPar ("PKT1", 0.0, false, ParameterType::NO_DEP,
2864  NULL, U_NONE, CAT_NONE, "Cross-term dependence of kt1");
2865 
2866  p.addPar ("PKT1L", 0.0, false, ParameterType::NO_DEP,
2868  NULL, U_NONE, CAT_NONE, "Cross-term dependence of kt1l");
2869 
2870  p.addPar ("PKT2", 0.0, false, ParameterType::NO_DEP,
2872  NULL, U_NONE, CAT_NONE, "Cross-term dependence of kt2");
2873 
2874  p.addPar ("PK2", 0.0, false, ParameterType::NO_DEP,
2876  NULL, U_NONE, CAT_NONE, "Cross-term dependence of k2");
2877 
2878  p.addPar ("PK3", 0.0, false, ParameterType::NO_DEP,
2880  NULL, U_NONE, CAT_NONE, "Cross-term dependence of k3");
2881 
2882  p.addPar ("PK3B", 0.0, false, ParameterType::NO_DEP,
2884  NULL, U_NONE, CAT_NONE, "Cross-term dependence of k3b");
2885 
2886  p.addPar ("PW0", 0.0, false, ParameterType::NO_DEP,
2888  NULL, U_NONE, CAT_NONE, "Cross-term dependence of w0");
2889 
2890  p.addPar ("PDVTP0", 0.0, false, ParameterType::NO_DEP,
2892  NULL, U_NONE, CAT_NONE, "Cross-term dependence of dvtp0");
2893 
2894  p.addPar ("PDVTP1", 0.0, false, ParameterType::NO_DEP,
2896  NULL, U_NONE, CAT_NONE, "Cross-term dependence of dvtp1");
2897 
2898  p.addPar ("PLPE0", 0.0, false, ParameterType::NO_DEP,
2900  NULL, U_NONE, CAT_NONE, "Cross-term dependence of lpe0");
2901 
2902  p.addPar ("PLPEB", 0.0, false, ParameterType::NO_DEP,
2904  NULL, U_NONE, CAT_NONE, "Cross-term dependence of lpeb");
2905 
2906  p.addPar ("PDVT0", 0.0, false, ParameterType::NO_DEP,
2908  NULL, U_NONE, CAT_NONE, "Cross-term dependence of dvt0");
2909 
2910  p.addPar ("PDVT1", 0.0, false, ParameterType::NO_DEP,
2912  NULL, U_NONE, CAT_NONE, "Cross-term dependence of dvt1");
2913 
2914  p.addPar ("PDVT2", 0.0, false, ParameterType::NO_DEP,
2916  NULL, U_NONE, CAT_NONE, "Cross-term dependence of dvt2");
2917 
2918  p.addPar ("PDVT0W", 0.0, false, ParameterType::NO_DEP,
2920  NULL, U_NONE, CAT_NONE, "Cross-term dependence of dvt0w");
2921 
2922  p.addPar ("PDVT1W", 0.0, false, ParameterType::NO_DEP,
2924  NULL, U_NONE, CAT_NONE, "Cross-term dependence of dvt1w");
2925 
2926  p.addPar ("PDVT2W", 0.0, false, ParameterType::NO_DEP,
2928  NULL, U_NONE, CAT_NONE, "Cross-term dependence of dvt2w");
2929 
2930  p.addPar ("PDROUT", 0.0, false, ParameterType::NO_DEP,
2932  NULL, U_NONE, CAT_NONE, "Cross-term dependence of drout");
2933 
2934  p.addPar ("PDSUB", 0.0, false, ParameterType::NO_DEP,
2936  NULL, U_NONE, CAT_NONE, "Cross-term dependence of dsub");
2937 
2938  p.addPar ("PVTH0", 0.0, false, ParameterType::NO_DEP,
2940  NULL, U_NONE, CAT_NONE, "");
2941 
2942  p.addPar ("PUA", 0.0, false, ParameterType::NO_DEP,
2944  NULL, U_NONE, CAT_NONE, "Cross-term dependence of ua");
2945 
2946  p.addPar ("PUA1", 0.0, false, ParameterType::NO_DEP,
2948  NULL, U_NONE, CAT_NONE, "Cross-term dependence of ua1");
2949 
2950  p.addPar ("PUB", 0.0, false, ParameterType::NO_DEP,
2952  NULL, U_NONE, CAT_NONE, "Cross-term dependence of ub");
2953 
2954  p.addPar ("PUB1", 0.0, false, ParameterType::NO_DEP,
2956  NULL, U_NONE, CAT_NONE, "Cross-term dependence of ub1");
2957 
2958  p.addPar ("PUC", 0.0, false, ParameterType::NO_DEP,
2960  NULL, U_NONE, CAT_NONE, "Cross-term dependence of uc");
2961 
2962  p.addPar ("PUC1", 0.0, false, ParameterType::NO_DEP,
2964  NULL, U_NONE, CAT_NONE, "Cross-term dependence of uc1");
2965 
2966  p.addPar ("PUD", 0.0, false, ParameterType::NO_DEP,
2968  NULL, U_NONE, CAT_NONE, "Cross-term dependence of ud");
2969 
2970  p.addPar ("PUD1", 0.0, false, ParameterType::NO_DEP,
2972  NULL, U_NONE, CAT_NONE, "Cross-term dependence of ud1");
2973 
2974  p.addPar ("PUP", 0.0, false, ParameterType::NO_DEP,
2976  NULL, U_NONE, CAT_NONE, "Cross-term dependence of up");
2977 
2978  p.addPar ("PLP", 0.0, false, ParameterType::NO_DEP,
2980  NULL, U_NONE, CAT_NONE, "Cross-term dependence of lp");
2981 
2982  p.addPar ("PU0", 0.0, false, ParameterType::NO_DEP,
2984  NULL, U_NONE, CAT_NONE, "Cross-term dependence of u0");
2985 
2986  p.addPar ("PUTE", 0.0, false, ParameterType::NO_DEP,
2988  NULL, U_NONE, CAT_NONE, "Cross-term dependence of ute");
2989 
2990  p.addPar ("PVOFF", 0.0, false, ParameterType::NO_DEP,
2992  NULL, U_NONE, CAT_NONE, "Cross-term dependence of voff");
2993 
2994  p.addPar ("PMINV", 0.0, false, ParameterType::NO_DEP,
2996  NULL, U_NONE, CAT_NONE, "Cross-term dependence of minv");
2997 
2998  p.addPar ("PMINVCV", 0.0, false, ParameterType::NO_DEP,
3000  NULL, U_NONE, CAT_NONE, "Cross-term dependence of minvcv");
3001 
3002  p.addPar ("PDELTA", 0.0, false, ParameterType::NO_DEP,
3004  NULL, U_NONE, CAT_NONE, "Cross-term dependence of delta");
3005 
3006  p.addPar ("PRDSW", 0.0, false, ParameterType::NO_DEP,
3008  NULL, U_NONE, CAT_NONE, "Cross-term dependence of rdsw ");
3009 
3010  p.addPar ("PRSW", 0.0, false, ParameterType::NO_DEP,
3012  NULL, U_NONE, CAT_NONE, "Cross-term dependence of rsw");
3013 
3014  p.addPar ("PRDW", 0.0, false, ParameterType::NO_DEP,
3016  NULL, U_NONE, CAT_NONE, "Cross-term dependence of rdw");
3017 
3018  p.addPar ("PPRWG", 0.0, false, ParameterType::NO_DEP,
3020  NULL, U_NONE, CAT_NONE, "Cross-term dependence of prwg ");
3021 
3022  p.addPar ("PPRWB", 0.0, false, ParameterType::NO_DEP,
3024  NULL, U_NONE, CAT_NONE, "Cross-term dependence of prwb ");
3025 
3026  p.addPar ("PPRT", 0.0, false, ParameterType::NO_DEP,
3028  NULL, U_NONE, CAT_NONE, "Cross-term dependence of prt ");
3029 
3030  p.addPar ("PETA0", 0.0, false, ParameterType::NO_DEP,
3032  NULL, U_NONE, CAT_NONE, "Cross-term dependence of eta0");
3033 
3034  p.addPar ("PETAB", 0.0, false, ParameterType::NO_DEP,
3036  NULL, U_NONE, CAT_NONE, "Cross-term dependence of etab");
3037 
3038  p.addPar ("PPCLM", 0.0, false, ParameterType::NO_DEP,
3040  NULL, U_NONE, CAT_NONE, "Cross-term dependence of pclm");
3041 
3042  p.addPar ("PPDIBLC1", 0.0, false, ParameterType::NO_DEP,
3044  NULL, U_NONE, CAT_NONE, "Cross-term dependence of pdiblc1");
3045 
3046  p.addPar ("PPDIBLC2", 0.0, false, ParameterType::NO_DEP,
3048  NULL, U_NONE, CAT_NONE, "Cross-term dependence of pdiblc2");
3049 
3050  p.addPar ("PPDIBLCB", 0.0, false, ParameterType::NO_DEP,
3052  NULL, U_NONE, CAT_NONE, "Cross-term dependence of pdiblcb");
3053 
3054  p.addPar ("PFPROUT", 0.0, false, ParameterType::NO_DEP,
3056  NULL, U_NONE, CAT_NONE, "Cross-term dependence of pdiblcb");
3057 
3058  p.addPar ("PPDITS", 0.0, false, ParameterType::NO_DEP,
3060  NULL, U_NONE, CAT_NONE, "Cross-term dependence of pdits");
3061 
3062  p.addPar ("PPDITSD", 0.0, false, ParameterType::NO_DEP,
3064  NULL, U_NONE, CAT_NONE, "Cross-term dependence of pditsd");
3065 
3066  p.addPar ("PPSCBE1", 0.0, false, ParameterType::NO_DEP,
3068  NULL, U_NONE, CAT_NONE, "Cross-term dependence of pscbe1");
3069 
3070  p.addPar ("PPSCBE2", 0.0, false, ParameterType::NO_DEP,
3072  NULL, U_NONE, CAT_NONE, "Cross-term dependence of pscbe2");
3073 
3074  p.addPar ("PPVAG", 0.0, false, ParameterType::NO_DEP,
3076  NULL, U_NONE, CAT_NONE, "Cross-term dependence of pvag");
3077 
3078  p.addPar ("PWR", 0.0, false, ParameterType::NO_DEP,
3080  NULL, U_NONE, CAT_NONE, "Cross-term dependence of wr");
3081 
3082  p.addPar ("PDWG", 0.0, false, ParameterType::NO_DEP,
3084  NULL, U_NONE, CAT_NONE, "Cross-term dependence of dwg");
3085 
3086  p.addPar ("PDWB", 0.0, false, ParameterType::NO_DEP,
3088  NULL, U_NONE, CAT_NONE, "Cross-term dependence of dwb");
3089 
3090  p.addPar ("PB0", 0.0, false, ParameterType::NO_DEP,
3092  NULL, U_NONE, CAT_NONE, "Cross-term dependence of b0");
3093 
3094  p.addPar ("PB1", 0.0, false, ParameterType::NO_DEP,
3096  NULL, U_NONE, CAT_NONE, "Cross-term dependence of b1");
3097 
3098  p.addPar ("PCGSL", 0.0, false, ParameterType::NO_DEP,
3100  NULL, U_NONE, CAT_NONE, "Cross-term dependence of cgsl");
3101 
3102  p.addPar ("PCGDL", 0.0, false, ParameterType::NO_DEP,
3104  NULL, U_NONE, CAT_NONE, "Cross-term dependence of cgdl");
3105 
3106  p.addPar ("PCKAPPAS", 0.0, false, ParameterType::NO_DEP,
3108  NULL, U_NONE, CAT_NONE, "Cross-term dependence of ckappas");
3109 
3110  p.addPar ("PCKAPPAD", 0.0, false, ParameterType::NO_DEP,
3112  NULL, U_NONE, CAT_NONE, "Cross-term dependence of ckappad");
3113 
3114  p.addPar ("PCF", 0.0, false, ParameterType::NO_DEP,
3116  NULL, U_NONE, CAT_NONE, "Cross-term dependence of cf");
3117 
3118  p.addPar ("PCLC", 0.0, false, ParameterType::NO_DEP,
3120  NULL, U_NONE, CAT_NONE, "Cross-term dependence of clc");
3121 
3122  p.addPar ("PCLE", 0.0, false, ParameterType::NO_DEP,
3124  NULL, U_NONE, CAT_NONE, "Cross-term dependence of cle");
3125 
3126  p.addPar ("PALPHA0", 0.0, false, ParameterType::NO_DEP,
3128  NULL, U_NONE, CAT_NONE, "Cross-term dependence of alpha0");
3129 
3130  p.addPar ("PALPHA1", 0.0, false, ParameterType::NO_DEP,
3132  NULL, U_NONE, CAT_NONE, "Cross-term dependence of alpha1");
3133 
3134  p.addPar ("PBETA0", 0.0, false, ParameterType::NO_DEP,
3136  NULL, U_NONE, CAT_NONE, "Cross-term dependence of beta0");
3137 
3138  p.addPar ("PAGIDL", 0.0, false, ParameterType::NO_DEP,
3140  NULL, U_NONE, CAT_NONE, "Cross-term dependence of agidl");
3141 
3142  p.addPar ("PBGIDL", 0.0, false, ParameterType::NO_DEP,
3144  NULL, U_NONE, CAT_NONE, "Cross-term dependence of bgidl");
3145 
3146  p.addPar ("PCGIDL", 0.0, false, ParameterType::NO_DEP,
3148  NULL, U_NONE, CAT_NONE, "Cross-term dependence of cgidl");
3149 
3150  p.addPar ("PEGIDL", 0.0, false, ParameterType::NO_DEP,
3152  NULL, U_NONE, CAT_NONE, "Cross-term dependence of egidl");
3153 
3154  p.addPar ("PAGISL", 0.0, false, ParameterType::NO_DEP,
3156  NULL, U_NONE, CAT_NONE, "Cross-term dependence of agisl");
3157 
3158  p.addPar ("PBGISL", 0.0, false, ParameterType::NO_DEP,
3160  NULL, U_NONE, CAT_NONE, "Cross-term dependence of bgisl");
3161 
3162  p.addPar ("PCGISL", 0.0, false, ParameterType::NO_DEP,
3164  NULL, U_NONE, CAT_NONE, "Cross-term dependence of cgisl");
3165 
3166  p.addPar ("PEGISL", 0.0, false, ParameterType::NO_DEP,
3168  NULL, U_NONE, CAT_NONE, "Cross-term dependence of egisl");
3169 
3170  p.addPar ("PAIGC", 0.0, false, ParameterType::NO_DEP,
3172  NULL, U_NONE, CAT_NONE, "Cross-term dependence of aigc");
3173 
3174  p.addPar ("PBIGC", 0.0, false, ParameterType::NO_DEP,
3176  NULL, U_NONE, CAT_NONE, "Cross-term dependence of bigc");
3177 
3178  p.addPar ("PCIGC", 0.0, false, ParameterType::NO_DEP,
3180  NULL, U_NONE, CAT_NONE, "Cross-term dependence of cigc");
3181 
3182  p.addPar ("PAIGSD", 0.0, false, ParameterType::NO_DEP,
3184  NULL, U_NONE, CAT_NONE, "Cross-term dependence of aigsd");
3185 
3186  p.addPar ("PBIGSD", 0.0, false, ParameterType::NO_DEP,
3188  NULL, U_NONE, CAT_NONE, "Cross-term dependence of bigsd");
3189 
3190  p.addPar ("PCIGSD", 0.0, false, ParameterType::NO_DEP,
3192  NULL, U_NONE, CAT_NONE, "Cross-term dependence of cigsd");
3193 
3194  p.addPar ("PAIGS", 0.0, false, ParameterType::NO_DEP,
3196  NULL, U_NONE, CAT_NONE, "Cross-term dependence of aigs");
3197 
3198  p.addPar ("PBIGS", 0.0, false, ParameterType::NO_DEP,
3200  NULL, U_NONE, CAT_NONE, "Cross-term dependence of bigs");
3201 
3202  p.addPar ("PCIGS", 0.0, false, ParameterType::NO_DEP,
3204  NULL, U_NONE, CAT_NONE, "Cross-term dependence of cigs");
3205 
3206  p.addPar ("PAIGD", 0.0, false, ParameterType::NO_DEP,
3208  NULL, U_NONE, CAT_NONE, "Cross-term dependence of aigd");
3209 
3210  p.addPar ("PBIGD", 0.0, false, ParameterType::NO_DEP,
3212  NULL, U_NONE, CAT_NONE, "Cross-term dependence of bigd");
3213 
3214  p.addPar ("PCIGD", 0.0, false, ParameterType::NO_DEP,
3216  NULL, U_NONE, CAT_NONE, "Cross-term dependence of cigd");
3217 
3218  p.addPar ("PAIGBACC", 0.0, false, ParameterType::NO_DEP,
3220  NULL, U_NONE, CAT_NONE, "Cross-term dependence of aigbacc");
3221 
3222  p.addPar ("PBIGBACC", 0.0, false, ParameterType::NO_DEP,
3224  NULL, U_NONE, CAT_NONE, "Cross-term dependence of bigbacc");
3225 
3226  p.addPar ("PCIGBACC", 0.0, false, ParameterType::NO_DEP,
3228  NULL, U_NONE, CAT_NONE, "Cross-term dependence of cigbacc");
3229 
3230  p.addPar ("PAIGBINV", 0.0, false, ParameterType::NO_DEP,
3232  NULL, U_NONE, CAT_NONE, "Cross-term dependence of aigbinv");
3233 
3234  p.addPar ("PBIGBINV", 0.0, false, ParameterType::NO_DEP,
3236  NULL, U_NONE, CAT_NONE, "Cross-term dependence of bigbinv");
3237 
3238  p.addPar ("PCIGBINV", 0.0, false, ParameterType::NO_DEP,
3240  NULL, U_NONE, CAT_NONE, "Cross-term dependence of cigbinv");
3241 
3242  p.addPar ("PNIGC", 0.0, false, ParameterType::NO_DEP,
3244  NULL, U_NONE, CAT_NONE, "Cross-term dependence of nigc");
3245 
3246  p.addPar ("PNIGBINV", 0.0, false, ParameterType::NO_DEP,
3248  NULL, U_NONE, CAT_NONE, "Cross-term dependence of nigbinv");
3249 
3250  p.addPar ("PNIGBACC", 0.0, false, ParameterType::NO_DEP,
3252  NULL, U_NONE, CAT_NONE, "Cross-term dependence of nigbacc");
3253 
3254  p.addPar ("PNTOX", 0.0, false, ParameterType::NO_DEP,
3256  NULL, U_NONE, CAT_NONE, "Cross-term dependence of ntox");
3257 
3258  p.addPar ("PEIGBINV", 0.0, false, ParameterType::NO_DEP,
3260  NULL, U_NONE, CAT_NONE, "Cross-term dependence for eigbinv");
3261 
3262  p.addPar ("PPIGCD", 0.0, false, ParameterType::NO_DEP,
3264  NULL, U_NONE, CAT_NONE, "Cross-term dependence for pigcd");
3265 
3266  p.addPar ("PPOXEDGE", 0.0, false, ParameterType::NO_DEP,
3268  NULL, U_NONE, CAT_NONE, "Cross-term dependence for poxedge");
3269 
3270  p.addPar ("PVFBCV", 0.0, false, ParameterType::NO_DEP,
3272  NULL, U_NONE, CAT_NONE, "Cross-term dependence of vfbcv");
3273 
3274  p.addPar ("PVFB", 0.0, false, ParameterType::NO_DEP,
3276  NULL, U_NONE, CAT_NONE, "Cross-term dependence of vfb");
3277 
3278  p.addPar ("PACDE", 0.0, false, ParameterType::NO_DEP,
3280  NULL, U_NONE, CAT_NONE, "Cross-term dependence of acde");
3281 
3282  p.addPar ("PMOIN", 0.0, false, ParameterType::NO_DEP,
3284  NULL, U_NONE, CAT_NONE, "Cross-term dependence of moin");
3285 
3286  p.addPar ("PNOFF", 0.0, false, ParameterType::NO_DEP,
3288  NULL, U_NONE, CAT_NONE, "Cross-term dependence of noff");
3289 
3290  p.addPar ("PVOFFCV", 0.0, false, ParameterType::NO_DEP,
3292  NULL, U_NONE, CAT_NONE, "Cross-term dependence of voffcv");
3293 
3294  p.addPar ("PXRCRG1", 0.0, false, ParameterType::NO_DEP,
3296  NULL, U_NONE, CAT_NONE, "Cross-term dependence of xrcrg1");
3297 
3298  p.addPar ("PXRCRG2", 0.0, false, ParameterType::NO_DEP,
3300  NULL, U_NONE, CAT_NONE, "Cross-term dependence of xrcrg2");
3301 
3302  p.addPar ("PLAMBDA", 0.0, false, ParameterType::NO_DEP,
3304  NULL, U_NONE, CAT_NONE, "Cross-term dependence of lambda");
3305 
3306  p.addPar ("PVTL", 0.0, false, ParameterType::NO_DEP,
3308  NULL, U_NONE, CAT_NONE, "Cross-term dependence of vtl");
3309 
3310  p.addPar ("PXN", 0.0, false, ParameterType::NO_DEP,
3312  NULL, U_NONE, CAT_NONE, "Cross-term dependence of xn");
3313 
3314  p.addPar ("PEU", 0.0, false, ParameterType::NO_DEP,
3316  NULL, U_NONE, CAT_NONE, "Cross-term dependence of eu");
3317 
3318  p.addPar ("PVFBSDOFF", 0.0, false, ParameterType::NO_DEP,
3320  NULL, U_NONE, CAT_NONE, "Cross-term dependence of vfbsdoff");
3321 
3322  p.addPar ("PTVFBSDOFF",0.0, false, ParameterType::NO_DEP,
3324  NULL, U_NONE, CAT_NONE, "Cross-term dependence of tvfbsdoff");
3325 
3326  p.addPar ("PTVOFF", 0.0, false, ParameterType::NO_DEP,
3328  NULL, U_NONE, CAT_NONE, "Cross-term dependence of tvoff");
3329 
3330  // stress effect
3331  p.addPar ("SAREF", 1.0e-6, false, ParameterType::NO_DEP,
3333  NULL, U_NONE, CAT_NONE, "Reference distance between OD edge to poly of one side");
3334 
3335  p.addPar ("SBREF", 1.0e-6, false, ParameterType::NO_DEP,
3337  NULL, U_NONE, CAT_NONE, "Reference distance between OD edge to poly of the other side");
3338 
3339  p.addPar ("WLOD", 0.0, false, ParameterType::NO_DEP,
3341  NULL, U_NONE, CAT_NONE, "Width parameter for stress effect");
3342 
3343  p.addPar ("KU0", 0.0, false, ParameterType::NO_DEP,
3345  NULL, U_NONE, CAT_NONE, "Mobility degradation/enhancement coefficient for LOD");
3346 
3347  p.addPar ("KVSAT", 0.0, false, ParameterType::NO_DEP,
3349  NULL, U_NONE, CAT_NONE, "Saturation velocity degradation/enhancement parameter for LOD");
3350 
3351  p.addPar ("KVTH0", 0.0, false, ParameterType::NO_DEP,
3353  NULL, U_NONE, CAT_NONE, "Threshold degradation/enhancement parameter for LOD");
3354 
3355  p.addPar ("TKU0", 0.0, false, ParameterType::NO_DEP,
3357  NULL, U_NONE, CAT_NONE, "Temperature coefficient of KU0");
3358 
3359  p.addPar ("LLODKU0", 0.0, false, ParameterType::NO_DEP,
3361  NULL, U_NONE, CAT_NONE, "Length parameter for u0 LOD effect");
3362 
3363  p.addPar ("WLODKU0", 0.0, false, ParameterType::NO_DEP,
3365  NULL, U_NONE, CAT_NONE, "Width parameter for u0 LOD effect");
3366 
3367  p.addPar ("LLODVTH", 0.0, false, ParameterType::NO_DEP,
3369  NULL, U_NONE, CAT_NONE, "Length parameter for vth LOD effect");
3370 
3371  p.addPar ("WLODVTH", 0.0, false, ParameterType::NO_DEP,
3373  NULL, U_NONE, CAT_NONE, "Width parameter for vth LOD effect");
3374 
3375  p.addPar ("LKU0", 0.0, false, ParameterType::NO_DEP,
3377  NULL, U_NONE, CAT_NONE, "Length dependence of ku0");
3378 
3379  p.addPar ("WKU0", 0.0, false, ParameterType::NO_DEP,
3381  NULL, U_NONE, CAT_NONE, "Width dependence of ku0");
3382 
3383  p.addPar ("PKU0", 0.0, false, ParameterType::NO_DEP,
3385  NULL, U_NONE, CAT_NONE, "Cross-term dependence of ku0");
3386 
3387  p.addPar ("LKVTH0", 0.0, false, ParameterType::NO_DEP,
3389  NULL, U_NONE, CAT_NONE, "Length dependence of kvth0");
3390 
3391  p.addPar ("WKVTH0", 0.0, false, ParameterType::NO_DEP,
3393  NULL, U_NONE, CAT_NONE, "Width dependence of kvth0");
3394 
3395  p.addPar ("PKVTH0", 0.0, false, ParameterType::NO_DEP,
3397  NULL, U_NONE, CAT_NONE, "Cross-term dependence of kvth0");
3398 
3399  p.addPar ("STK2", 0.0, false, ParameterType::NO_DEP,
3401  NULL, U_NONE, CAT_NONE, "K2 shift factor related to stress effect on vth");
3402 
3403  p.addPar ("LODK2", 1.0, false, ParameterType::NO_DEP,
3405  NULL, U_NONE, CAT_NONE, "K2 shift modification factor for stress effect");
3406 
3407  p.addPar ("STETA0", 0.0, false, ParameterType::NO_DEP,
3409  NULL, U_NONE, CAT_NONE, "eta0 shift factor related to stress effect on vth");
3410 
3411  p.addPar ("LODETA0", 1.0, false, ParameterType::NO_DEP,
3413  NULL, U_NONE, CAT_NONE, "eta0 shift modification factor for stress effect");
3414 
3415  // Well Proximity Effect
3416  p.addPar ("WEB", 0.0, false, ParameterType::NO_DEP,
3418  NULL, U_NONE, CAT_NONE, "Coefficient for SCB");
3419 
3420  p.addPar ("WEC", 0.0, false, ParameterType::NO_DEP,
3422  NULL, U_NONE, CAT_NONE, "Coefficient for SCC");
3423 
3424  p.addPar ("KVTH0WE", 0.0, false, ParameterType::NO_DEP,
3426  NULL, U_NONE, CAT_NONE, "Threshold shift factor for well proximity effect");
3427 
3428  p.addPar ("K2WE", 0.0, false, ParameterType::NO_DEP,
3430  NULL, U_NONE, CAT_NONE, " K2 shift factor for well proximity effect ");
3431 
3432  p.addPar ("KU0WE", 0.0, false, ParameterType::NO_DEP,
3434  NULL, U_NONE, CAT_NONE, " Mobility degradation factor for well proximity effect ");
3435 
3436  p.addPar ("SCREF", 1.0e-6, false, ParameterType::NO_DEP,
3438  NULL, U_NONE, CAT_NONE, " Reference distance to calculate SCA, SCB and SCC");
3439 
3440  p.addPar ("LKVTH0WE", 0.0, false, ParameterType::NO_DEP,
3442  NULL, U_NONE, CAT_NONE, "Length dependence of kvth0we");
3443 
3444  p.addPar ("LK2WE", 0.0, false, ParameterType::NO_DEP,
3446  NULL, U_NONE, CAT_NONE, " Length dependence of k2we ");
3447 
3448  p.addPar ("LKU0WE", 0.0, false, ParameterType::NO_DEP,
3450  NULL, U_NONE, CAT_NONE, " Length dependence of ku0we ");
3451 
3452  p.addPar ("WKVTH0WE", 0.0, false, ParameterType::NO_DEP,
3454  NULL, U_NONE, CAT_NONE, "Width dependence of kvth0we");
3455 
3456  p.addPar ("WK2WE", 0.0, false, ParameterType::NO_DEP,
3458  NULL, U_NONE, CAT_NONE, " Width dependence of k2we ");
3459 
3460  p.addPar ("WKU0WE", 0.0, false, ParameterType::NO_DEP,
3462  NULL, U_NONE, CAT_NONE, " Width dependence of ku0we ");
3463 
3464  p.addPar ("PKVTH0WE", 0.0, false, ParameterType::NO_DEP,
3466  NULL, U_NONE, CAT_NONE, "Cross-term dependence of kvth0we");
3467 
3468  p.addPar ("PK2WE", 0.0, false, ParameterType::NO_DEP,
3470  NULL, U_NONE, CAT_NONE, " Cross-term dependence of k2we ");
3471 
3472  p.addPar ("PKU0WE", 0.0, false, ParameterType::NO_DEP,
3474  NULL, U_NONE, CAT_NONE, " Cross-term dependence of ku0we ");
3475 
3476 
3477  p.addPar ("NOIA", 0.0, false, ParameterType::NO_DEP,
3479  NULL, U_NONE, CAT_FLICKER, "Flicker Noise parameter a");
3480 
3481  p.addPar ("NOIB", 0.0, false, ParameterType::NO_DEP,
3483  NULL, U_NONE, CAT_FLICKER, "Flicker Noise parameter b");
3484 
3485  p.addPar ("NOIC", 0.0, false, ParameterType::NO_DEP,
3487  NULL, U_NONE, CAT_FLICKER, "Flicker Noise parameter c");
3488 
3489 
3490  p.addPar ("TNOIA", 1.5, false, ParameterType::NO_DEP,
3492  NULL, U_NONE, CAT_NONE, "Thermal noise parameter");
3493 
3494  p.addPar ("TNOIB", 3.5, false, ParameterType::NO_DEP,
3496  NULL, U_NONE, CAT_NONE, "Thermal noise parameter");
3497 
3498  p.addPar ("RNOIA", 0.577, false, ParameterType::NO_DEP,
3500  NULL, U_NONE, CAT_NONE, "Thermal noise coefficient");
3501 
3502  p.addPar ("RNOIB", 0.5164, false, ParameterType::NO_DEP,
3504  NULL, U_NONE, CAT_NONE, "Thermal noise coefficient");
3505 
3506  p.addPar ("NTNOI", 1.0, false, ParameterType::NO_DEP,
3508  NULL, U_NONE, CAT_NONE, "Thermal noise parameter");
3509 
3510  p.addPar ("EM", 4.1e7,false, ParameterType::NO_DEP,
3512  NULL, U_NONE, CAT_NONE, "Flicker noise parameter");
3513 
3514  p.addPar ("EF", 1.0, false, ParameterType::NO_DEP,
3516  NULL, U_NONE, CAT_NONE, "Flicker noise frequency exponent");
3517 
3518  p.addPar ("AF", 1.0, false, ParameterType::NO_DEP,
3520  NULL, U_NONE, CAT_NONE, "Flicker noise exponent");
3521 
3522  p.addPar ("KF", 0.0, false, ParameterType::NO_DEP,
3524  NULL, U_NONE, CAT_NONE, "Flicker noise coefficient");
3525 
3526  p.addPar ("WPEMOD", 0.0, false, ParameterType::NO_DEP,
3528  NULL, U_NONE, CAT_NONE, " Flag for WPE model (WPEMOD=1 to activate this model) ");
3529 
3530  // Set up non-double precision variables:
3531  p.addPar ("CVCHARGEMOD", 0, false, ParameterType::NO_DEP,
3533  U_NONE, CAT_CONTROL, "Capacitance charge model selector");
3534 
3535  p.addPar ("CAPMOD", 2, false, ParameterType::NO_DEP,
3536  &MOSFET_B4::Model::capMod, NULL,
3537  U_NONE, CAT_CONTROL, "Capacitance model selector");
3538 
3539  p.addPar ("DIOMOD", 1, false, ParameterType::NO_DEP,
3540  &MOSFET_B4::Model::dioMod, NULL,
3541  U_NONE, CAT_CONTROL, "Diode IV model selector");
3542 
3543  p.addPar ("RDSMOD", 0, false, ParameterType::NO_DEP,
3544  &MOSFET_B4::Model::rdsMod, NULL,
3545  U_NONE, CAT_CONTROL, "Bias-dependent S/D resistance model selector");
3546 
3547  p.addPar ("TRNQSMOD", 0, false, ParameterType::NO_DEP,
3549  U_NONE, CAT_CONTROL, "Transient NQS model selector");
3550 
3551  p.addPar ("ACNQSMOD", 0, false, ParameterType::NO_DEP,
3553  U_NONE, CAT_CONTROL, "AC NQS model selector");
3554 
3555  p.addPar ("MOBMOD", 0, false, ParameterType::NO_DEP,
3556  &MOSFET_B4::Model::mobMod, NULL,
3557  U_NONE, CAT_CONTROL, "Mobility model selector");
3558 
3559  p.addPar ("RBODYMOD", 0, false, ParameterType::NO_DEP,
3561  U_NONE, CAT_CONTROL, "Distributed body R model selector");
3562 
3563  p.addPar ("RGATEMOD", 0, false, ParameterType::NO_DEP,
3565  U_NONE, CAT_CONTROL, "Gate R model selector");
3566 
3567  p.addPar ("PERMOD", 1, false, ParameterType::NO_DEP,
3568  &MOSFET_B4::Model::perMod, NULL,
3569  U_NONE, CAT_CONTROL, "Pd and Ps model selector");
3570 
3571  p.addPar ("GEOMOD", 0, false, ParameterType::NO_DEP,
3572  &MOSFET_B4::Model::geoMod, NULL,
3573  U_NONE, CAT_CONTROL, "Geometry dependent parasitics model selector");
3574 
3575  p.addPar ("FNOIMOD", 1, false, ParameterType::NO_DEP,
3577  U_NONE, CAT_CONTROL, "Flicker noise model selector");
3578 
3579  p.addPar ("TNOIMOD", 0, false, ParameterType::NO_DEP,
3581  U_NONE, CAT_CONTROL, "Thermal noise model selector");
3582 
3583  p.addPar ("MTRLMOD", 0, false, ParameterType::NO_DEP,
3585  U_NONE, CAT_CONTROL, "parameter for nonm-silicon substrate or metal gate selector");
3586 
3587  p.addPar ("IGCMOD", 0, false, ParameterType::NO_DEP,
3588  &MOSFET_B4::Model::igcMod, NULL,
3589  U_NONE, CAT_CONTROL, "Gate-to-channel Ig model selector");
3590 
3591  p.addPar ("IGBMOD", 0, false, ParameterType::NO_DEP,
3592  &MOSFET_B4::Model::igbMod, NULL,
3593  U_NONE, CAT_CONTROL, "Gate-to-body Ig model selector");
3594 
3595  p.addPar ("TEMPMOD", 0, false, ParameterType::NO_DEP,
3597  U_NONE, CAT_CONTROL, "Temperature model selector");
3598 
3599  p.addPar ("PARAMCHK", 1, false, ParameterType::NO_DEP,
3601  U_NONE, CAT_CONTROL, "Model parameter checking selector");
3602 
3603  p.addPar ("BINUNIT", 1, false, ParameterType::NO_DEP,
3605  U_NONE, CAT_CONTROL, "Bin unit selector");
3606 
3607  p.addPar ("VERSION", std::string("4.6.1"), false, ParameterType::NO_DEP,
3609  U_NONE, CAT_CONTROL, "parameter for model version");
3610 }
3611 
3612 
3613 // Class Instance
3614 //-----------------------------------------------------------------------------
3615 // Function : Instance::processParams
3616 // Purpose :
3617 // Special Notes :
3618 // Scope : public
3619 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
3620 //-----------------------------------------------------------------------------
3622 {
3623  double Rtot;
3624 
3625  // Process instance (*M_iter) selectors, some
3626  // may override their global counterparts
3627  //
3628  if (!given("RBODYMOD"))
3629  {
3631  }
3632  else if ((rbodyMod != 0) && (rbodyMod != 1) && (rbodyMod != 2))
3633  {
3635  UserWarning(*this) << "rbodyMod has been set to its global value: ";
3636  }
3637 
3638  if (!given("RGATEMOD"))
3639  {
3641  }
3642  else if ((rgateMod != 0) && (rgateMod != 1) && (rgateMod != 2) && (rgateMod != 3))
3643  {
3645  UserWarning(*this) << "rgateMod has been set to its global value: ";
3646  }
3647 
3648  if (!given("GEOMOD"))
3649  {
3650  geoMod = model_.geoMod;
3651  }
3652  if (!given("RGEOMOD"))
3653  {
3654  rgeoMod = 0;
3655  }
3656  if (!given("TRNQSMOD"))
3657  {
3659  }
3660  else if ((trnqsMod != 0) && (trnqsMod != 1))
3661  {
3663  UserWarning(*this) << "trnqsMod has been set to its global value: ";
3664  }
3665 
3666  if (!given("ACNQSMOD"))
3667  {
3669  }
3670  else if ((acnqsMod != 0) && (acnqsMod != 1))
3671  {
3673  UserWarning(*this) << "acnqsMod has been set to its global value: ";
3674  }
3675 
3676  // now set the temperature related stuff.
3678 
3679  // Note: Xyce does not support noise analysis, so the noiseAnalGive
3680  // flag is always false. However, I've left it in here to show consistency
3681  // with the original spice3f5 code.
3682 
3683  bool noiseAnalGiven=false;
3684 
3685  // process drain series resistance
3686  int createNode = 0;
3687  if ( (model_.rdsMod != 0) || (model_.tnoiMod != 0 && noiseAnalGiven))
3688  {
3689  createNode = 1;
3690  }
3691  else if (model_.sheetResistance > 0)
3692  {
3693  if (drainSquaresGiven && drainSquares > 0)
3694  {
3695  createNode = 1;
3696  }
3697  else if (!drainSquaresGiven && (rgeoMod != 0))
3698  {
3701  DMCGeff, DMCIeff, DMDGeff, 0, Rtot);
3702 
3703  if(Rtot > 0)
3704  {
3705  createNode = 1;
3706  }
3707  }
3708  }
3709 
3710  if ( createNode != 0 )
3711  {
3712  drainMOSFET_B4Exists = true;
3713  }
3714  else
3715  {
3716  drainMOSFET_B4Exists = false;
3717  }
3718 
3719  // process source series resistance
3720  createNode = 0;
3721  if ( (model_.rdsMod != 0) || (model_.tnoiMod != 0 && noiseAnalGiven))
3722  {
3723  createNode = 1;
3724  }
3725  else if (model_.sheetResistance > 0)
3726  {
3727  if (sourceSquaresGiven && sourceSquares > 0)
3728  {
3729  createNode = 1;
3730  }
3731  else if (!sourceSquaresGiven && (rgeoMod != 0))
3732  {
3735  DMCGeff, DMCIeff, DMDGeff, 1, Rtot);
3736 
3737  if(Rtot > 0)
3738  {
3739  createNode = 1;
3740  }
3741  }
3742  }
3743 
3744  if ( createNode != 0 )
3745  {
3746  sourceMOSFET_B4Exists = true;
3747  }
3748  else
3749  {
3750  sourceMOSFET_B4Exists = false;
3751  }
3752 
3753 
3754  // set up numIntVars:
3755  numIntVars = 0;
3756 
3759 
3760  if (rgateMod == 1 || rgateMod == 2) ++numIntVars;
3761  else if (rgateMod == 3) numIntVars+=2;
3762 
3763  if ( trnqsMod ) ++numIntVars;
3764  if ( rbodyMod ) numIntVars+=3;
3765 
3766  if (icVBSGiven) ++numIntVars;
3767  if (icVDSGiven) ++numIntVars;
3768  if (icVGSGiven) ++numIntVars;
3769 
3770  // set up numStateVars
3771  numStateVars = 3;
3772  setNumStoreVars(14);
3773 
3774  if (rgateMod == 3)
3775  {
3776  numStateVars += 1;
3777  }
3778 
3779  // parasitic capacitors:
3780  if (rbodyMod)
3781  {
3782  numStateVars += 2;
3783  }
3784 
3785  if (trnqsMod)
3786  {
3787  numStateVars += 2;
3788  }
3789 
3790  // If there are any time dependent parameters, set their values at for
3791  // the current time.
3792 
3793  return true;
3794 }
3795 
3796 //-----------------------------------------------------------------------------
3797 // Function : Instance::debugJacStampOutput
3798 // Purpose :
3799 // Special Notes :
3800 // Scope : public
3801 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
3802 // Creation Date : 11/30/06
3803 //-----------------------------------------------------------------------------
3805 {
3806  Xyce::dout() << "Jacobian stamp:" << std::endl;
3807  for( int rw=0; rw < jacStamp.size() ; ++rw )
3808  {
3809  Xyce::dout() << "jacStamp[ " << rw << "] = { " ;
3810  for( int cl=0; cl < jacStamp[rw].size(); ++cl )
3811  {
3812  Xyce::dout() << jacStamp[rw][cl];
3813  if( cl != (jacStamp[rw].size()-1) )
3814  {
3815  Xyce::dout() << ", ";
3816  }
3817  }
3818  Xyce::dout() << "}" << std::endl;
3819  }
3820  Xyce::dout() << std::endl;
3821 
3822  Xyce::dout() << "And as viewed through the maps" << std::endl;
3823  for( int rw=0; rw < jacMap.size() ; ++rw )
3824  {
3825  Xyce::dout() << "jacStamp[ " << rw << "] mapped to jacStamp[ " << jacMap[rw] << "] = { " ;
3826  for( int cl=0; cl < jacMap2[rw].size(); ++cl )
3827  {
3828  Xyce::dout() << jacStamp[jacMap[rw]][jacMap2[rw][cl]];
3829  if( cl != (jacMap2[rw].size()-1) )
3830  {
3831  Xyce::dout() << ", ";
3832  }
3833  }
3834  Xyce::dout() << "}" << std::endl;
3835  }
3836  Xyce::dout() << std::endl;
3837 }
3838 
3839 //-----------------------------------------------------------------------------
3840 // Function : Instance::Instance
3841 // Purpose : instance block constructor
3842 // Special Notes :
3843 // Scope : public
3844 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
3845 // Creation Date : 11/25/06
3846 //-----------------------------------------------------------------------------
3847 
3849  const Configuration & configuration,
3850  const InstanceBlock & IB,
3851  Model & Miter,
3852  const FactoryBlock & factory_block)
3853  : DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
3854  model_(Miter),
3855  ueff (0.0),
3856  thetavth (0.0),
3857  von (0.0),
3858  vdsat (0.0),
3859  cgdo (0.0),
3860  qgdo (0.0),
3861  cgso (0.0),
3862  qgso (0.0),
3863  grbsb (0.0),
3864  grbdb (0.0),
3865  grbpb (0.0),
3866  grbps (0.0),
3867  grbpd (0.0),
3868  vjsmFwd (0.0),
3869  vjsmRev (0.0),
3870  vjdmFwd (0.0),
3871  vjdmRev (0.0),
3872  XExpBVS (0.0),
3873  XExpBVD (0.0),
3874  SslpFwd (0.0),
3875  SslpRev (0.0),
3876  DslpFwd (0.0),
3877  DslpRev (0.0),
3878  IVjsmFwd (0.0),
3879  IVjsmRev (0.0),
3880  IVjdmFwd (0.0),
3881  IVjdmRev (0.0),
3882  grgeltd (0.0),
3883  Pseff (0.0),
3884  Pdeff (0.0),
3885  Aseff (0.0),
3886  Adeff (0.0),
3887  l (getDeviceOptions().defl),
3888  w (getDeviceOptions().defw),
3889  drainArea (getDeviceOptions().defad),
3890  sourceArea (getDeviceOptions().defas),
3891  numberParallel (1.0),
3892  sourceSquares(0.0),
3893  drainPerimeter(0.0),
3894  sourcePerimeter(0.0),
3895  sourceConductance(0.0),
3896  drainConductance(0.0),
3897  sa(0.0),
3898  sb(0.0),
3899  sd(0.0),
3900  sca(0.0),
3901  scb(0.0),
3902  scc(0.0),
3903  sc(0.0),
3904  rbdb(0.0),
3905  rbsb(0.0),
3906  rbpb(0.0),
3907  rbps(0.0),
3908  rbpd(0.0),
3909  delvto(0.0),
3910  xgw(0.0),
3911  ngcon(0.0),
3912  u0temp(0.0),
3913  vsattemp(0.0),
3914  vth0(0.0),
3915  vfb(0.0),
3916  vfbzb(0.0),
3917  vtfbphi1(0.0),
3918  vtfbphi2(0.0),
3919  k2(0.0),
3920  vbsc(0.0),
3921  k2ox(0.0),
3922  eta0(0.0),
3923  icVDS(0.0),
3924  icVGS(0.0),
3925  icVBS(0.0),
3926  nf(0.0),
3927  OFF(0),
3928  mode(0),
3929  trnqsMod(0),
3930  acnqsMod(0),
3931  rbodyMod(0),
3932  rgateMod(0),
3933  geoMod(0),
3934  rgeoMod(0),
3935  min(0),
3936  Vgsteff(0.0),
3937  vgs_eff(0.0),
3938  vgd_eff(0.0),
3939  dvgs_eff_dvg(0.0),
3940  dvgd_eff_dvg(0.0),
3941  Vdseff(0.0),
3942  nstar(0.0),
3943  Abulk(0.0),
3944  EsatL(0.0),
3945  AbovVgst2Vtm(0.0),
3946  qinv(0.0),
3947  cd(0.0),
3948  cbs(0.0),
3949  cbd(0.0),
3950  csub(0.0),
3951  Igidl(0.0),
3952  Igisl(0.0),
3953  gm(0.0),
3954  gds(0.0),
3955  gmbs(0.0),
3956  gbd(0.0),
3957  gbs(0.0),
3958  gbbs(0.0),
3959  gbgs(0.0),
3960  gbds(0.0),
3961  ggidld(0.0),
3962  ggidlg(0.0),
3963  ggidls(0.0),
3964  ggidlb(0.0),
3965  ggisld(0.0),
3966  ggislg(0.0),
3967  ggisls(0.0),
3968  ggislb(0.0),
3969  Igcs(0.0),
3970  gIgcsg(0.0),
3971  gIgcsd(0.0),
3972  gIgcss(0.0),
3973  gIgcsb(0.0),
3974  Igcd(0.0),
3975  gIgcdg(0.0),
3976  gIgcdd(0.0),
3977  gIgcds(0.0),
3978  gIgcdb(0.0),
3979  Igs(0.0),
3980  gIgsg(0.0),
3981  gIgss(0.0),
3982  Igd(0.0),
3983  gIgdg(0.0),
3984  gIgdd(0.0),
3985  Igb(0.0),
3986  gIgbg(0.0),
3987  gIgbd(0.0),
3988  gIgbs(0.0),
3989  gIgbb(0.0),
3990  grdsw(0.0),
3991  IdovVds(0.0),
3992  gcrg(0.0),
3993  gcrgd(0.0),
3994  gcrgg(0.0),
3995  gcrgs(0.0),
3996  gcrgb(0.0),
3997  gstot(0.0),
3998  gstotd(0.0),
3999  gstotg(0.0),
4000  gstots(0.0),
4001  gstotb(0.0),
4002  gdtot(0.0),
4003  gdtotd(0.0),
4004  gdtotg(0.0),
4005  gdtots(0.0),
4006  gdtotb(0.0),
4007  cggb(0.0),
4008  cgdb(0.0),
4009  cgsb(0.0),
4010  cbgb(0.0),
4011  cbdb(0.0),
4012  cbsb(0.0),
4013  cdgb(0.0),
4014  cddb(0.0),
4015  cdsb(0.0),
4016  csgb(0.0),
4017  csdb(0.0),
4018  cssb(0.0),
4019  cgbb(0.0),
4020  cdbb(0.0),
4021  csbb(0.0),
4022  cbbb(0.0),
4023  capbd(0.0),
4024  capbs(0.0),
4025  cqgb(0.0),
4026  cqdb(0.0),
4027  cqsb(0.0),
4028  cqbb(0.0),
4029  qgate(0.0),
4030  qbulk(0.0),
4031  qdrn(0.0),
4032  qsrc(0.0),
4033  qdef(0.0),
4034  qchqs(0.0),
4035  taunet(0.0),
4036  gtau(0.0),
4037  gtg(0.0),
4038  gtd(0.0),
4039  gts(0.0),
4040  gtb(0.0),
4041  SjctTempRevSatCur(0.0),
4042  DjctTempRevSatCur(0.0),
4043  SswTempRevSatCur(0.0),
4044  DswTempRevSatCur(0.0),
4045  SswgTempRevSatCur(0.0),
4046  DswgTempRevSatCur(0.0),
4047  paramPtr (NULL),
4048  icVBSGiven (false),
4049  icVDSGiven (false),
4050  icVGSGiven (false),
4051  scaGiven(false),
4052  scbGiven(false),
4053  sccGiven(false),
4054  scGiven(false),
4055  sourcePerimeterGiven(false),
4056  drainPerimeterGiven(false),
4057  sourceAreaGiven(false),
4058  drainAreaGiven(false),
4059  sourceSquaresGiven(false),
4060  drainSquaresGiven(false),
4061  drainMOSFET_B4Exists(false),
4062  sourceMOSFET_B4Exists(false),
4063  ChargeComputationNeeded (true),
4064  temp (getDeviceOptions().temp.getImmutableValue<double>()),
4065  limitedFlag(false),
4066  // missing stuff...
4067  Vd (0.0),
4068  Vs (0.0),
4069  Vb (0.0),
4070  Vsp(0.0),
4071  Vdp(0.0),
4072  Vgp(0.0),
4073  Vbp(0.0),
4074  Vge(0.0),
4075  Vgm(0.0),
4076  Vdb(0.0),
4077  Vsb(0.0),
4078  Vds(0.0),
4079  Vgs(0.0),
4080  Vbs(0.0),
4081 
4082  Qtotal (0.0),
4083  Vddp (0.0),
4084  Vssp (0.0),
4085  Vbsp (0.0),
4086  Vbdp (0.0),
4087  Vgsp (0.0),
4088  Vgdp (0.0),
4089  Vgb (0.0),
4090  Vdpsp (0.0),
4091  Vdbb (0.0),
4092  Vdbbp (0.0),
4093  Vbpb (0.0),
4094  Vsbb (0.0),
4095  Vsbbp (0.0),
4096  Idrain (0.0),
4097  Isource (0.0),
4098  Idbb (0.0),
4099  Idbbp (0.0),
4100  Ibpb (0.0),
4101  Isbb (0.0),
4102  Isbbp (0.0),
4103  df1dVdp (0.0),
4104  df2dVdp (0.0),
4105  df1dVsp (0.0),
4106  df2dVsp (0.0),
4107  df1dVg (0.0),
4108  df2dVg (0.0),
4109  df1dVb (0.0),
4110  df2dVb (0.0),
4111 
4112  vgb (0.0),
4113  vgd (0.0),
4114  cqdef (0.0),
4115  ceqqd (0.0),
4116  ceqqb (0.0),
4117  ceqqg (0.0),
4118 
4119  cqdef_Jdxp (0.0),
4120  ceqqd_Jdxp (0.0),
4121  ceqqb_Jdxp (0.0),
4122  ceqqg_Jdxp (0.0),
4123 
4124  vbd(0.0),
4125  vbs(0.0),
4126  vgs(0.0),
4127  vds(0.0),
4128  vges(0.0),
4129  vgms(0.0),
4130  vdes(0.0),
4131  vses(0.0),
4132  vdbs(0.0),
4133  vsbs(0.0),
4134  vdbd(0.0),
4135  vged(0.0),
4136  vgmd(0.0),
4137 
4138  vbd_old(0.0),
4139  vbs_old(0.0),
4140  vgs_old(0.0),
4141  vds_old(0.0),
4142  vges_old(0.0),
4143  vgms_old(0.0),
4144  vdes_old(0.0),
4145  vses_old(0.0),
4146  vdbs_old(0.0),
4147  vsbs_old(0.0),
4148  vdbd_old(0.0),
4149  vged_old(0.0),
4150  vgmd_old(0.0),
4151 
4152  vbd_orig(0.0),
4153  vbs_orig(0.0),
4154  vgs_orig(0.0),
4155  vds_orig(0.0),
4156  vgd_orig(0.0),
4157  vges_orig(0.0),
4158  vgms_orig(0.0),
4159  vdes_orig(0.0),
4160  vses_orig(0.0),
4161  vdbs_orig(0.0),
4162  vsbs_orig(0.0),
4163  vdbd_orig(0.0),
4164  vbs_jct_orig(0.0),
4165  vbd_jct_orig(0.0),
4166  vgmb_orig(0.0),
4167  vgb_orig(0.0),
4168  vged_orig(0.0),
4169  vgmd_orig(0.0),
4170 
4171  newtonIterOld (0),
4172 
4173  Gm(0.0),
4174  Gmbs(0.0),
4175  FwdSum(0.0),
4176  RevSum(0.0),
4177  ceqdrn(0.0),
4178  cdrain(0.0),
4179  ceqbd(0.0),
4180  ceqbs(0.0),
4181  cqgate(0.0),
4182  cqbody(0.0),
4183  cqdrn(0.0),
4184  gbbdp(0.0),
4185  gbbsp(0.0),
4186  gbdpg(0.0),
4187  gbdpdp(0.0),
4188  gbdpb(0.0),
4189  gbdpsp(0.0),
4190  gbspg(0.0),
4191  gbspdp(0.0),
4192  gbspb(0.0),
4193  gbspsp(0.0),
4194  Istoteq(0.0),
4195  gIstotg(0.0),
4196  gIstotd(0.0),
4197  gIstots(0.0),
4198  gIstotb(0.0),
4199  Idtoteq(0.0),
4200  gIdtotg(0.0),
4201  gIdtotd(0.0),
4202  gIdtots(0.0),
4203  gIdtotb(0.0),
4204  Ibtoteq(0.0),
4205  gIbtotg(0.0),
4206  gIbtotd(0.0),
4207  gIbtots(0.0),
4208  gIbtotb(0.0),
4209  Igtoteq(0.0),
4210  gIgtotg(0.0),
4211  gIgtotd(0.0),
4212  gIgtots(0.0),
4213  gIgtotb(0.0),
4214  ceqgcrg(0.0),
4215  ceqgstot(0.0),
4216  ceqgdtot(0.0),
4217  ceqjs(0.0),
4218  ceqjd(0.0),
4219  vbs_jct(0.0),
4220  vbd_jct(0.0),
4221 
4222  ceqqjs(0.0),
4223  ceqqjd(0.0),
4224  ceqqgmid(0.0),
4225  gjbd(0.0),
4226  gjbs(0.0),
4227  gdpr(0.0),
4228  gspr(0.0),
4229  geltd(0.0),
4230  gcggb(0.0),
4231  ggtg(0.0),
4232  gcgdb(0.0),
4233  ggtd(0.0),
4234  gcgsb(0.0),
4235  ggts(0.0),
4236  gcgbb(0.0),
4237  ggtb(0.0),
4238  gcgmgmb(0.0),
4239  gcgmdb(0.0),
4240  gcgmsb(0.0),
4241  gcgmbb(0.0),
4242  gcdgmb(0.0),
4243  gcsgmb(0.0),
4244  gcbgmb(0.0),
4245  gcddb(0.0),
4246  dxpart(0.0),
4247  gcdgb(0.0),
4248  gcdsb(0.0),
4249  gcdbb(0.0),
4250  gcsdb(0.0),
4251  sxpart(0.0),
4252  gcsgb(0.0),
4253  gcssb(0.0),
4254  gcsbb(0.0),
4255  gcbdb(0.0),
4256  gcbgb(0.0),
4257  gcbsb(0.0),
4258  gcbbb(0.0),
4259  gcdbdb(0.0),
4260  gcsbsb(0.0),
4261  gqdef(0.0),
4262  gcqgb(0.0),
4263  gcqdb(0.0),
4264  gcqsb(0.0),
4265  gcqbb(0.0),
4266  ddxpart_dVd(0.0),
4267  ddxpart_dVg(0.0),
4268  ddxpart_dVb(0.0),
4269  ddxpart_dVs(0.0),
4270  dsxpart_dVd(0.0),
4271  dsxpart_dVg(0.0),
4272  dsxpart_dVb(0.0),
4273  dsxpart_dVs(0.0),
4274  vgmb(0.0),
4275  CoxWL(0.0),
4276  ScalingFactor(0.0),
4277  DMCGeff(0.0),
4278  DMCIeff(0.0),
4279  DMDGeff(0.0),
4280 
4281  ceqqgmid_Jdxp(0.0),
4282  ceqqjs_Jdxp(0.0),
4283  ceqqjd_Jdxp(0.0),
4284 
4285  qgmb(0.0),
4286  qgb(0.0),
4287  Cgg(0.0),
4288  Cgd(0.0),
4289  Cgb(0.0),
4290  Cdg(0.0),
4291  Cdd(0.0),
4292  Cds(0.0),
4293  Csg(0.0),
4294  Csd(0.0),
4295  Css(0.0),
4296  Csb(0.0),
4297  Cbg(0.0),
4298  Cbd(0.0),
4299  Cbb(0.0),
4300 
4301  Igate(0.0),
4302  Igate_Jdxp(0.0),
4303  IgateMid(0.0),
4304  IgateMid_Jdxp(0.0),
4305  Vgegp(0.0), Vgegp_orig(0.0),
4306  Vgegm(0.0), Vgegm_orig(0.0),
4307  Vgmgp(0.0), Vgmgp_orig(0.0),
4308 
4309  qb (0.0),
4310  qg (0.0),
4311  qd (0.0),
4312  qgmid (0.0),
4313  qbs (0.0),
4314  qbd (0.0),
4315  qcheq (0.0),
4316  cqcheq (0.0),
4317  cqcheq_Jdxp (0.0),
4318  cqcdump (0.0),
4319 
4320 // matrix and vectors indices:
4321 // state vector: (local indices)
4322  li_store_vbd(-1),
4323  li_store_vbs(-1),
4324  li_store_vgs(-1),
4325  li_store_vds(-1),
4326  li_store_vges(-1),
4327  li_store_vgms(-1),
4328  li_store_vdes(-1),
4329  li_store_vses(-1),
4330  li_store_vdbs(-1),
4331  li_store_vsbs(-1),
4332  li_store_vdbd(-1),
4333  li_store_vged(-1),
4334  li_store_vgmd(-1),
4335  li_store_von (-1),
4336 
4337  li_state_qb (-1),
4338  li_state_qg (-1),
4339  li_state_qd (-1),
4340  li_state_qgmid (-1),
4341  li_state_qbs (-1),
4342  li_state_qbd (-1),
4343  li_state_qcheq (-1),
4344  li_state_qcdump (-1),
4345  li_state_qdef (-1),
4346 // solution vector: (local indices)
4347  li_Drain (-1),
4348  li_GateExt (-1),
4349  li_Source (-1),
4350  li_Body (-1),
4351  li_DrainPrime (-1),
4352  li_GatePrime (-1),
4353  li_GateMid (-1),
4354  li_SourcePrime (-1),
4355  li_BodyPrime (-1),
4356  li_DrainBody (-1),
4357  li_SourceBody (-1),
4358  li_Charge (-1),
4359  li_Ibs (-1),
4360  li_Ids (-1),
4361  li_Igs (-1),
4362 // jacobian matrix offsets:
4363  GEge(-1),
4364  GEgp(-1),
4365  GEdp(-1),
4366  GEsp(-1),
4367  GEbp(-1),
4368  GEgm(-1),
4369  GEigs(-1),
4370  GPge(-1),
4371  GPgp(-1),
4372  GPdp(-1),
4373  GPsp(-1),
4374  GPbp(-1),
4375  GPq(-1),
4376  GMge(-1),
4377  GMgp(-1),
4378  GMdp(-1),
4379  GMsp(-1),
4380  GMbp(-1),
4381  GMgm(-1),
4382  GPgm(-1),
4383  DPgm(-1),
4384  DPdp(-1),
4385  DPd(-1),
4386  DPgp(-1),
4387  DPsp(-1),
4388  DPbp(-1),
4389  DPdb(-1),
4390  DPq(-1),
4391  Dd(-1),
4392  Dgp(-1),
4393  Ddp(-1),
4394  Dsp(-1),
4395  Dbp(-1),
4396  Dids(-1),
4397  SPgm(-1),
4398  SPdp(-1),
4399  SPgp(-1),
4400  SPsp(-1),
4401  SPs(-1),
4402  SPbp(-1),
4403  SPsb(-1),
4404  SPq(-1),
4405  Ss(-1),
4406  Sdp(-1),
4407  Sgp(-1),
4408  Ssp(-1),
4409  Sbp(-1),
4410  Sibs(-1),
4411  Sids(-1),
4412  Sigs(-1),
4413  BPgm(-1),
4414  BPdp(-1),
4415  BPgp(-1),
4416  BPsp(-1),
4417  BPb(-1),
4418  BPbp(-1),
4419  BPdb(-1),
4420  BPsb(-1),
4421  DBdp(-1),
4422  DBdb(-1),
4423  DBbp(-1),
4424  DBb(-1),
4425  SBsp(-1),
4426  SBbp(-1),
4427  SBb(-1),
4428  SBsb(-1),
4429  Bdb(-1),
4430  Bbp(-1),
4431  Bsb(-1),
4432  Bb(-1),
4433  Bibs(-1),
4434  Qq(-1),
4435  Qgp(-1),
4436  Qdp(-1),
4437  Qsp(-1),
4438  Qbp(-1),
4439  IBSb(-1),
4440  IBSs(-1),
4441  IBSibs(-1),
4442  IDSd(-1),
4443  IDSs(-1),
4444  IDSids(-1),
4445  IGSg(-1),
4446  IGSs(-1),
4447  IGSigs(-1),
4448 
4450  f_DdPtr (0), q_DdPtr (0),
4451  f_DdpPtr (0), q_DdpPtr (0),
4452  f_DspPtr (0), q_DspPtr (0),
4453  f_DgpPtr (0), q_DgpPtr (0),
4454  f_DbpPtr (0), q_DbpPtr (0),
4455 
4456  f_GEgePtr (0), q_GEgePtr (0),
4457  f_GEdpPtr (0), q_GEdpPtr (0),
4458  f_GEspPtr (0), q_GEspPtr (0),
4459  f_GEgpPtr (0), q_GEgpPtr (0),
4460  f_GEgmPtr (0), q_GEgmPtr (0),
4461  f_GEbpPtr (0), q_GEbpPtr (0),
4462 
4463  f_SsPtr (0), q_SsPtr (0),
4464  f_SdpPtr (0), q_SdpPtr (0),
4465  f_SspPtr (0), q_SspPtr (0),
4466  f_SgpPtr (0), q_SgpPtr (0),
4467  f_SbpPtr (0), q_SbpPtr (0),
4468 
4469  f_BbPtr (0), q_BbPtr (0),
4470  f_BbpPtr (0), q_BbpPtr (0),
4471  f_BsbPtr (0), q_BsbPtr (0),
4472  f_BdbPtr (0), q_BdbPtr (0),
4473 
4474  f_DPdPtr (0), q_DPdPtr (0),
4475  f_DPdpPtr (0), q_DPdpPtr (0),
4476  f_DPspPtr (0), q_DPspPtr (0),
4477  f_DPgpPtr (0), q_DPgpPtr (0),
4478  f_DPgmPtr (0), q_DPgmPtr (0),
4479  f_DPbpPtr (0), q_DPbpPtr (0),
4480  f_DPdbPtr (0), q_DPdbPtr (0),
4481 
4482 
4483  f_DPqPtr (0), q_DPqPtr (0),
4484 
4485 
4486  f_SPsPtr (0), q_SPsPtr (0),
4487  f_SPdpPtr (0), q_SPdpPtr (0),
4488  f_SPspPtr (0), q_SPspPtr (0),
4489  f_SPgpPtr (0), q_SPgpPtr (0),
4490  f_SPgmPtr (0), q_SPgmPtr (0),
4491  f_SPbpPtr (0), q_SPbpPtr (0),
4492  f_SPsbPtr (0), q_SPsbPtr (0),
4493 
4494  f_SPqPtr (0), q_SPqPtr (0),
4495 
4496  f_GPgePtr(0), q_GPgePtr(0),
4497  f_GPdpPtr(0), q_GPdpPtr(0),
4498  f_GPspPtr(0), q_GPspPtr(0),
4499  f_GPgpPtr(0), q_GPgpPtr(0),
4500  f_GPgmPtr(0), q_GPgmPtr(0),
4501  f_GPbpPtr(0), q_GPbpPtr(0),
4502 
4503  f_GPqPtr(0), q_GPqPtr(0),
4504 
4505  f_GMgePtr(0), q_GMgePtr(0),
4506  f_GMdpPtr(0), q_GMdpPtr(0),
4507  f_GMspPtr(0), q_GMspPtr(0),
4508  f_GMgpPtr(0), q_GMgpPtr(0),
4509  f_GMgmPtr(0), q_GMgmPtr(0),
4510  f_GMbpPtr(0), q_GMbpPtr(0),
4511 
4512  f_BPbPtr (0), q_BPbPtr (0),
4513  f_BPdpPtr(0), q_BPdpPtr(0),
4514  f_BPspPtr(0), q_BPspPtr(0),
4515  f_BPgpPtr(0), q_BPgpPtr(0),
4516  f_BPgmPtr(0), q_BPgmPtr(0),
4517  f_BPbpPtr(0), q_BPbpPtr(0),
4518  f_BPsbPtr(0), q_BPsbPtr(0),
4519  f_BPdbPtr(0), q_BPdbPtr(0),
4520 
4521  f_SBbPtr (0), q_SBbPtr (0),
4522  f_SBspPtr(0), q_SBspPtr(0),
4523  f_SBbpPtr(0), q_SBbpPtr(0),
4524  f_SBsbPtr(0), q_SBsbPtr(0),
4525 
4526  f_DBbPtr (0), q_DBbPtr (0),
4527  f_DBdpPtr(0), q_DBdpPtr(0),
4528  f_DBbpPtr(0), q_DBbpPtr(0),
4529  f_DBdbPtr(0), q_DBdbPtr(0),
4530 
4531  f_QdpPtr(0), q_QdpPtr(0),
4532  f_QspPtr(0), q_QspPtr(0),
4533  f_QgpPtr(0), q_QgpPtr(0),
4534  f_QbpPtr(0), q_QbpPtr(0),
4535  f_QqPtr (0), q_QqPtr (0),
4536  f_IBSbPtr(0),
4537  f_IBSsPtr(0),
4538  f_IBSibsPtr(0),
4539 
4540  f_IDSdPtr(0),
4541  f_IDSsPtr(0),
4542  f_IDSidsPtr(0),
4543  f_IGSgPtr(0),
4544  f_IGSsPtr(0),
4545  f_IGSigsPtr(0),
4546 #endif
4547 
4548  blockHomotopyID (0),
4549  randomPerturb (0.0),
4550 
4551  ceqdrn_Jdxp(0.0),
4552  ceqbd_Jdxp(0.0),
4553  ceqbs_Jdxp(0.0),
4554  Istoteq_Jdxp(0.0),
4555  Idtoteq_Jdxp(0.0),
4556  Ibtoteq_Jdxp(0.0),
4557  Igtoteq_Jdxp(0.0) ,
4558  ceqgcrg_Jdxp(0.0),
4559  ceqgstot_Jdxp(0.0),
4560  ceqgdtot_Jdxp(0.0),
4561  ceqjs_Jdxp(0.0),
4562  ceqjd_Jdxp(0.0),
4563  T0(0.0),
4564 
4565  // one last thing
4566  updateTemperatureCalled_ (false)
4567 {
4568  numIntVars = 3;
4569  numExtVars = 4;
4570  numStateVars = 17;
4571 
4572  devConMap.resize(4);
4573  devConMap[0] = 1;
4574  devConMap[1] = 2;
4575  devConMap[2] = 1;
4576  devConMap[3] = 3;
4577 
4578  blockHomotopyID =
4579  devSupport.getGainScaleBlockID(getDeviceOptions().numGainScaleBlocks);
4580  randomPerturb =
4582 
4583 
4584  // Set params to constant default values:
4585  setDefaultParams ();
4586 
4587  // Set params according to instance line and constant defaults from metadata:
4588  setParams (IB.params);
4589 
4590  // Set any non-constant parameter defaults:
4591  if (!given("RBDB"))
4592  rbdb = model_.rbdb;
4593  if (!given("RBSB"))
4594  rbsb = model_.rbsb;
4595  if (!given("RBPB"))
4596  rbpb = model_.rbpb;
4597  if (!given("RBPS"))
4598  rbps = model_.rbps;
4599  if (!given("RBPD"))
4600  rbpd = model_.rbpd;
4601  if (!given("XGW"))
4602  xgw = model_.xgw;
4603  if (!given("NGCON"))
4604  ngcon = model_.ngcon;
4605  if (!given("SD"))
4606  sd = 2.0 * model_.dmcg;
4607  if (!given("TEMP"))
4608  temp = getDeviceOptions().temp.getImmutableValue<double>();
4609  if (!given("AD"))
4611  if (!given("AS"))
4613 
4614  // Calculate any parameters specified as expressions:
4616 
4617  // calculate dependent (ie computed) params and check for errors:
4618  processParams ();
4619 
4620  if (given("TRNQSMOD"))
4621  {
4622  UserWarning(*this) << "nsqMod = 1. Not allowed yet. Setting to 0";
4623  }
4624 
4625  if (getDeviceOptions().verboseLevel > 0 && (l > model_.Lmax || l < model_.Lmin))
4626  {
4627  UserWarning(*this) << "Channel length out of range";
4628  }
4629 
4630  if (getDeviceOptions().verboseLevel > 0 && (w > model_.Wmax || w < model_.Wmin))
4631  {
4632  UserWarning(*this) << "Channel width out of range";
4633  }
4634 
4635  // Note important difference from the BSIM3 --- we do NOT keep any
4636  // static jacstamps for special cases, we build the entire real jacstamp
4637  // for this particular device, starting from the full general case, then
4638  // mapping away what's unneeded. There are simply too many special cases
4639  // to do it the old way.
4640 
4641  if( jacStamp.empty() )
4642  {
4643  jacStamp.resize(11);
4644  jacStamp[0].resize(5); // Drain Row
4645  jacStamp[0][0]=0; // Dd (drain-drain)
4646  jacStamp[0][1]=4; // Ddp (drain-drain')
4647  jacStamp[0][2]=5; // Dsp (drain-source')
4648  jacStamp[0][3]=6; // Dgp (drain-gate')
4649  jacStamp[0][4]=8; // Dbp (drain-body')
4650 
4651  jacStamp[1].resize(6); // GateExt Row
4652  jacStamp[1][0]= 1; // GEge
4653  jacStamp[1][1]= 4; // GEdp
4654  jacStamp[1][2]= 5; // GEsp
4655  jacStamp[1][3]= 6; // GEgp
4656  jacStamp[1][4]= 7; // GEgm
4657  jacStamp[1][5]= 8; // GEbp
4658 
4659  jacStamp[2].resize(5); // Source Row
4660  jacStamp[2][0]=2; // Ss (source-source)
4661  jacStamp[2][1]=4; // Sdp (source-drain')
4662  jacStamp[2][2]=5; // Ssp (source-source')
4663  jacStamp[2][3]=6; // Sgp (source-gate')
4664  jacStamp[2][4]=8; // Sbp (source-body')
4665 
4666  jacStamp[3].resize(4); // Body Row
4667  jacStamp[3][0]= 3; // Bb
4668  jacStamp[3][1]= 8; // Bbp
4669  jacStamp[3][2]= 9; // Bsb
4670  jacStamp[3][3]= 10; // Bdb
4671 
4672  // Optional terminal resistors (rdsMod):
4673  jacStamp[4].resize(7); // Drain' Row
4674  jacStamp[4][0]=0; // DPd (drain'-drain)
4675  jacStamp[4][1]=4; // DPdp (drain'-drain')
4676  jacStamp[4][2]=5; // DPsp (drain'-source')
4677  jacStamp[4][3]=6; // DPgp (drain'-gate')
4678  jacStamp[4][4]=7; // DPgm (drain'-gateMid)
4679  jacStamp[4][5]=8; // DPbp (drain'-body')
4680  jacStamp[4][6]=10; // DPdb (drain'-drainBody)
4681 
4682  jacStamp[5].resize(7); // Source' Row
4683  jacStamp[5][0]=2; // SPs (source'-source)
4684  jacStamp[5][1]=4; // SPdp (source'-drain')
4685  jacStamp[5][2]=5; // SPsp (source'-source')
4686  jacStamp[5][3]=6; // SPgp (source'-gate')
4687  jacStamp[5][4]=7; // SPgm (source'-gateMid)
4688  jacStamp[5][5]=8; // SPbp (source'-body')
4689  jacStamp[5][6]=9; // SPsb (source'-sourceBody)
4690 
4691  // Optional gate resistors (rgateMod)
4692  jacStamp[6].resize(6); // Gate' Row (needed of rgateMod > 0)
4693  jacStamp[6][0]=1; // GPge (gate'-gate')
4694  jacStamp[6][1]=4; // GPdp (gate'-drain')
4695  jacStamp[6][2]=5; // GPsp (gate'-source')
4696  jacStamp[6][3]=6; // GPgp (gate'-gateExt)
4697  jacStamp[6][4]=7; // GPgm (gate'-gateMid)
4698  jacStamp[6][5 ]=8; // GPbp (gate'-body')
4699 
4700  jacStamp[7].resize(6); // GateMid Row (needed of rgateMod == 3)
4701  jacStamp[7][0]= 1; // GMge
4702  jacStamp[7][1]= 4; // GMdp
4703  jacStamp[7][2]= 5; // GMsp
4704  jacStamp[7][3]= 6; // GMgp
4705  jacStamp[7][4]= 7; // GMgm
4706  jacStamp[7][5]= 8; // GMbp
4707 
4708  // Optional rbodyMod variables:
4709  jacStamp[8].resize(8); // Body' Row
4710  jacStamp[8][0]=3; // BPb (body'-body)
4711  jacStamp[8][1]=4; // BPdp (body'-drain')
4712  jacStamp[8][2]=5; // BPsp (body'-source')
4713  jacStamp[8][3]=6; // BPgp (body'-gate')
4714  jacStamp[8][4]=7; // BPgm (body'-gateMid)
4715  jacStamp[8][5]=8; // BPbp (body'-body')
4716  jacStamp[8][6]=9; // BPsb (body'-sourceBody)
4717  jacStamp[8][7]=10; // BPdb (body'-drainBody)
4718 
4719  jacStamp[9].resize(4); // SourceBody Row
4720  jacStamp[9][0] = 3; // SBb
4721  jacStamp[9][1] = 5; // SBsp
4722  jacStamp[9][2] = 8; // SBbp
4723  jacStamp[9][3] = 9; // SBsb
4724 
4725  jacStamp[10].resize(4); // DrainBody Row
4726  jacStamp[10][0] = 3; // DBb
4727  jacStamp[10][1] = 4; // DBdp
4728  jacStamp[10][2] = 8; // DBbp
4729  jacStamp[10][3] = 10; // DBdb
4730 
4731  // Optional nqs row:
4732  if( trnqsMod )
4733  {
4734  int oldSize = jacStamp.size();
4735  int newMaxCol=oldSize;
4736  int newSize = oldSize+1;
4737  jacStamp.resize(newSize);
4738  jacStamp[newMaxCol].resize(5); // Charge Row
4739  jacStamp[newMaxCol][0] = 4; // Qdp
4740  jacStamp[newMaxCol][1] = 5; // Qsp
4741  jacStamp[newMaxCol][2] = 6; // Qgp
4742  jacStamp[newMaxCol][3] = 8; // Qbp
4743  jacStamp[newMaxCol][4] = newMaxCol; // Qq
4744 
4745  // extra columns in other rows:
4746  jacStamp[6].resize(7); // Gate' Row
4747  jacStamp[6][6]=newMaxCol; // GPq (gate'-charge)
4748 
4749  jacStamp[4].resize(8); // Drain' Row
4750  jacStamp[4][7]=newMaxCol; // DPq (drain'-charge)
4751 
4752  jacStamp[5].resize(8); // Source' Row
4753  jacStamp[5][7]=newMaxCol; // SPq (source'-charge)
4754  }
4755 
4756  if (icVBSGiven)
4757  {
4758  int oldSize=jacStamp.size();
4759  int icVBSCol=oldSize;
4760  int newSize=oldSize+1;
4761 
4762  jacStamp.resize(newSize);
4763  // New Ibs row:
4764  jacStamp[icVBSCol].resize(3);
4765  jacStamp[icVBSCol][0]=2; // Ibs-Source
4766  jacStamp[icVBSCol][1]=3; // Ibs-Body
4767  jacStamp[icVBSCol][2]=icVBSCol; // Ibs-Ibs
4768 
4769 
4770  // Fix up Source row:
4771  int sourceSize=jacStamp[2].size();
4772  int newSourceCol=sourceSize;
4773  sourceSize++;
4774  jacStamp[2].resize(sourceSize);
4775  jacStamp[2][newSourceCol]=icVBSCol; // Source-IBS
4776 
4777  // Fix up Body row:
4778  int bodySize=jacStamp[3].size();
4779  int newBodyCol=bodySize;
4780  bodySize++;
4781  jacStamp[3].resize(bodySize);
4782  jacStamp[3][newBodyCol]=icVBSCol; // Body-IBS
4783  }
4784 
4785  if (icVDSGiven)
4786  {
4787  int oldSize=jacStamp.size();
4788  int icVDSCol=oldSize;
4789  int newSize=oldSize+1;
4790 
4791  jacStamp.resize(newSize);
4792  // New Ids row:
4793  jacStamp[icVDSCol].resize(3);
4794  jacStamp[icVDSCol][0]=0; // Ids-Drain
4795  jacStamp[icVDSCol][1]=2; // Ids-Source
4796  jacStamp[icVDSCol][2]=icVDSCol; // Ids-Ids
4797 
4798 
4799  // Fix up Source row:
4800  int sourceSize=jacStamp[2].size();
4801  int newSourceCol=sourceSize;
4802  sourceSize++;
4803  jacStamp[2].resize(sourceSize);
4804  jacStamp[2][newSourceCol]=icVDSCol; // Source-IDS
4805 
4806  // Fix up Drain row:
4807  int drainSize=jacStamp[0].size();
4808  int newDrainCol=drainSize;
4809  drainSize++;
4810  jacStamp[0].resize(drainSize);
4811  jacStamp[0][newDrainCol]=icVDSCol; // Drain-IDS
4812  }
4813 
4814  if (icVGSGiven)
4815  {
4816  int oldSize=jacStamp.size();
4817  int icVGSCol=oldSize;
4818  int newSize=oldSize+1;
4819 
4820  jacStamp.resize(newSize);
4821  // New Igs row:
4822  jacStamp[icVGSCol].resize(3);
4823  jacStamp[icVGSCol][0]=1; // Ids-GateExt
4824  jacStamp[icVGSCol][1]=2; // Ids-Source
4825  jacStamp[icVGSCol][2]=icVGSCol; // Igs-Igs
4826 
4827 
4828  // Fix up Source row:
4829  int sourceSize=jacStamp[2].size();
4830  int newSourceCol=sourceSize;
4831  sourceSize++;
4832  jacStamp[2].resize(sourceSize);
4833  jacStamp[2][newSourceCol]=icVGSCol; // Source-IGS
4834 
4835  // Fix up gate row:
4836  int gateSize=jacStamp[1].size();
4837  int newGateCol=gateSize;
4838  gateSize++;
4839  jacStamp[1].resize(gateSize);
4840  jacStamp[1][newGateCol]=icVGSCol; // Gate-IGS
4841  }
4842 
4843  jacMap.clear();
4844  jacMap2.clear();
4845  jacMap.resize(jacStamp.size());
4846  jacMap2.resize(jacStamp.size());
4847 
4848  int mapSize = jacMap.size();
4849  for (int i=0;i<mapSize;++i)
4850  {
4851  jacMap[i]=i;
4852  jacMap2[i].resize(jacStamp[i].size());
4853  for (int j=0;j<jacStamp[i].size();++j)
4854  {
4855  jacMap2[i][j] = j;
4856  }
4857  }
4858 
4859 #ifdef Xyce_DEBUG_DEVICE
4860  Xyce::dout() << "About to remap away optional nodes from the jacStamp!" << std::endl;
4862 #endif
4863 
4864  // Selectively map away bits and pieces of the
4865  // jacobian stamp based on absent resistances
4866 
4867  // temporary stamps and maps
4868  std::vector< std::vector<int> > tempStamp;
4869  std::vector<int> tempMap;
4870  std::vector< std::vector<int> > tempMap2;
4871 
4872  int OriginalSize = jacMap.size();
4873 
4874  // Body mod:
4875  if (!rbodyMod) // remove body, sourcebody, drainbody
4876  {
4877  // Map away the drainBody (originally 10)
4878  tempStamp.clear(); tempMap.clear(); tempMap2.clear();
4880  tempStamp, tempMap, tempMap2,
4881  jacMap[10] , jacMap[3],
4882  OriginalSize);
4883 
4884  // now move the new stuff into the old place
4885  jacStamp = tempStamp; jacMap = tempMap; jacMap2 = tempMap2;
4886 
4887  // Map away the sourceBody (originally 9)
4888  tempStamp.clear(); tempMap.clear(); tempMap2.clear();
4890  tempStamp, tempMap, tempMap2,
4891  jacMap[9] , jacMap[3],
4892  OriginalSize);
4893 
4894  // now move the new stuff into the old place
4895  jacStamp = tempStamp; jacMap = tempMap; jacMap2 = tempMap2;
4896 
4897  // Map Body' (originally 8) onto Body
4898  tempStamp.clear(); tempMap.clear(); tempMap2.clear();
4900  tempStamp, tempMap, tempMap2,
4901  jacMap[8] , jacMap[3],
4902  OriginalSize);
4903 
4904  // now move the new stuff into the old place
4905  jacStamp = tempStamp; jacMap = tempMap; jacMap2 = tempMap2;
4906  }
4907 
4908  // rgateMod. The gate resistor has 4 options
4909  // rgateMod==0 no gate resistor.
4910  // rgateMod==1 linear gate resistor
4911  // rgateMod==2 nonlinear gate resistor
4912  // rgateMod==3 2 gate resistors, in series.:
4913 
4914  if (rgateMod != 3) // remove gateMid.
4915  {
4916  // Map away the gateMid (originally 7)
4917  tempStamp.clear(); tempMap.clear(); tempMap2.clear();
4919  tempStamp, tempMap, tempMap2,
4920  jacMap[7] , jacMap[1],
4921  OriginalSize);
4922 
4923  // now move the new stuff into the old place
4924  jacStamp = tempStamp; jacMap = tempMap; jacMap2 = tempMap2;
4925  }
4926 
4927  if (rgateMod < 1) // remove gatePrime
4928  {
4929  // Map away the gatePrime (originally 6)
4930  tempStamp.clear(); tempMap.clear(); tempMap2.clear();
4932  tempStamp, tempMap, tempMap2,
4933  jacMap[6] , jacMap[1],
4934  OriginalSize);
4935 
4936  // now move the new stuff into the old place
4937  jacStamp = tempStamp; jacMap = tempMap; jacMap2 = tempMap2;
4938  }
4939 
4940  // drain and source terminal resistors.
4942  {
4943  // Map away the source' (originally 5), into the source (2):
4944  tempStamp.clear(); tempMap.clear(); tempMap2.clear();
4946  tempStamp, tempMap, tempMap2,
4947  jacMap[5], jacMap[2],
4948  OriginalSize);
4949  // now move the new stuff into the old place
4950  jacStamp = tempStamp; jacMap = tempMap; jacMap2 = tempMap2;
4951  }
4952 
4953 
4954  if (!drainMOSFET_B4Exists)
4955  {
4956  // Map away the drain' (always 4), into the drain (0):
4957  tempStamp.clear(); tempMap.clear(); tempMap2.clear();
4959  tempStamp, tempMap, tempMap2,
4960  jacMap[4] , jacMap[0],
4961  OriginalSize);
4962 
4963  // now move the new stuff into the old place
4964  jacStamp = tempStamp; jacMap = tempMap; jacMap2 = tempMap2;
4965  }
4966 
4967 
4968 #ifdef Xyce_DEBUG_DEVICE
4969  Xyce::dout() << "Done remap away optional nodes from the jacStamp!" << std::endl;
4971 #endif
4972  }
4973 
4974 }
4975 
4976 //-----------------------------------------------------------------------------
4977 // Function : Instance::~Instance
4978 // Purpose : destructor
4979 // Special Notes :
4980 // Scope : public
4981 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
4982 // Creation Date : 11/25/06
4983 //-----------------------------------------------------------------------------
4985 {
4986 }
4987 
4988 //-----------------------------------------------------------------------------
4989 // Function : Instance::registerLIDs
4990 // Purpose :
4991 // Special Notes :
4992 // Scope : public
4993 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
4994 // Creation Date : 11/25/06
4995 //-----------------------------------------------------------------------------
4996 void Instance::registerLIDs( const std::vector<int> & intLIDVecRef,
4997  const std::vector<int> & extLIDVecRef )
4998 {
4999  AssertLIDs(intLIDVecRef.size() == numIntVars);
5000  AssertLIDs(extLIDVecRef.size() == numExtVars);
5001 
5002  if (DEBUG_DEVICE && getDeviceOptions().debugLevel > 0)
5003  {
5004  Xyce::dout() << section_divider << std::endl
5005  << " In Instance::register LIDs" << std::endl
5006  << " name = " << getName() << std::endl
5007  << " number of internal variables: " << intLIDVecRef.size() << std::endl
5008  << " number of external variables: " << extLIDVecRef.size() << std::endl;
5009  }
5010 
5011  // copy over the global ID lists.
5012  intLIDVec = intLIDVecRef;
5013  extLIDVec = extLIDVecRef;
5014 
5015  // now use these lists to obtain the indices into the
5016  // linear algebra entities. This assumes an order.
5017  // For the matrix indices, first do the rows.
5018 
5019  li_Drain = extLIDVec[0];
5020  li_GateExt = extLIDVec[1];
5021  li_Source = extLIDVec[2];
5022  li_Body = extLIDVec[3];
5023 
5024  int intLoc = 0;
5025 
5027  {
5028  li_DrainPrime = intLIDVec[intLoc++];
5029  }
5030  else
5031  {
5033  }
5034 
5036  {
5037  li_SourcePrime = intLIDVec[intLoc++];
5038  }
5039  else
5040  {
5042  }
5043 
5044  if (rgateMod>0)
5045  {
5046  li_GatePrime = intLIDVec[intLoc++];
5047  }
5048  else
5049  {
5051  }
5052 
5053  if (rgateMod==3)
5054  {
5055  li_GateMid = intLIDVec[intLoc++];
5056  }
5057  else
5058  {
5060  }
5061 
5062  if ( rbodyMod )
5063  {
5064  li_BodyPrime = intLIDVec[intLoc++];
5065  li_SourceBody = intLIDVec[intLoc++];
5066  li_DrainBody = intLIDVec[intLoc++];
5067  }
5068  else
5069  {
5073  }
5074 
5075  if( trnqsMod )
5076  {
5077  li_Charge = intLIDVec[intLoc++];
5078  }
5079 
5080  if( icVBSGiven )
5081  {
5082  if( li_Body == li_Source )
5083  {
5084  UserError(*this) << "Tried to specify an initial condition on V_Bulk_Source when Bulk and Source nodes are the same node";
5085  }
5086  li_Ibs = intLIDVec[intLoc++];
5087  }
5088 
5089  if( icVDSGiven )
5090  {
5091  if( li_Drain == li_Source )
5092  {
5093  UserError(*this) << "Tried to specify an initial condition on V_Drain_Source when Drain and Source nodes are the same node";
5094  }
5095  li_Ids = intLIDVec[intLoc++];
5096  }
5097 
5098  if( icVGSGiven )
5099  {
5100  if( li_GateExt == li_Source )
5101  {
5102  UserError(*this) << "Tried to specify an initial condition on V_Gate_Source when Gate and Source nodes are the same node";
5103  }
5104  li_Igs = intLIDVec[intLoc++];
5105  }
5106 
5107 
5108 #ifdef Xyce_DEBUG_DEVICE
5109  if (getDeviceOptions().debugLevel > 0)
5110  {
5111  Xyce::dout() << "\n local variable indices:\n";
5112  Xyce::dout() << " li_Drain = " << li_Drain << std::endl;
5113  Xyce::dout() << " li_GateExt = " << li_GateExt << std::endl;
5114  Xyce::dout() << " li_Source = " << li_Source << std::endl;
5115  Xyce::dout() << " li_Body = " << li_Body << std::endl;
5116  Xyce::dout() << " li_DrainPrime = " << li_DrainPrime << std::endl;
5117  Xyce::dout() << " li_GatePrime = " << li_GatePrime << std::endl;
5118  Xyce::dout() << " li_GateMid = " << li_GateMid << std::endl;
5119  Xyce::dout() << " li_SourcePrime = " << li_SourcePrime << std::endl;
5120  Xyce::dout() << " li_BodyPrime = " << li_BodyPrime << std::endl;
5121  Xyce::dout() << " li_DrainBody = " << li_DrainBody << std::endl;
5122  Xyce::dout() << " li_SourceBody = " << li_SourceBody << std::endl;
5123  Xyce::dout() << " li_Charge = " << li_Charge << std::endl;
5124  Xyce::dout() << section_divider << std::endl;
5125  }
5126 #endif
5127 
5128 }
5129 
5130 //-----------------------------------------------------------------------------
5131 // Function : Instance::getIntNameMap
5132 // Purpose :
5133 // Special Notes :
5134 // Scope : public
5135 // Creator : Eric R. Keiter, SNL, Electrical and Microsystems Modeling
5136 // Creation Date : 11/25/06
5137 //-----------------------------------------------------------------------------
5138 std::map<int,std::string> & Instance::getIntNameMap ()
5139 {
5140  // set up the internal name map, if it hasn't been already.
5141  if (intNameMap.empty ())
5142  {
5144  {
5145  intNameMap[ li_DrainPrime ] = spiceInternalName(getName(), "drainprime");
5146  }
5147 
5149  {
5150  intNameMap[ li_SourcePrime ] = spiceInternalName(getName(), "sourceprime");
5151  }
5152 
5153  if (rgateMod>0)
5154  {
5155  intNameMap[ li_GatePrime] = spiceInternalName(getName(), "GatePrime");
5156  }
5157 
5158  if (rgateMod==3)
5159  {
5160  intNameMap[ li_GateMid] = spiceInternalName(getName(), "MidGate");
5161  }
5162 
5163  if (rbodyMod)
5164  {
5166  intNameMap[ li_SourceBody ] = spiceInternalName(getName(), "SourceBody");
5167  intNameMap[ li_DrainPrime ] = spiceInternalName(getName(), "DrainBody");
5168  }
5169 
5170  if (trnqsMod)
5171  {
5173  }
5174 
5175  if (icVDSGiven)
5176  {
5177  intNameMap[li_Ids] = spiceInternalName(getName(), "branch_DS");
5178  }
5179  if (icVGSGiven)
5180  {
5181  intNameMap[li_Igs] = spiceInternalName(getName(), "branch_GS");
5182  }
5183  if (icVBSGiven)
5184  {
5185  intNameMap[li_Ibs] = spiceInternalName(getName(), "branch_BS");
5186  }
5187  }
5188 
5189  return intNameMap;
5190 }
5191 
5192 //-----------------------------------------------------------------------------
5193 // Function : Instance::registerStateLIDs
5194 // Purpose :
5195 // Special Notes :
5196 // Scope : public
5197 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
5198 // Creation Date : 11/25/06
5199 //-----------------------------------------------------------------------------
5200 void Instance::registerStateLIDs( const std::vector<int> & staLIDVecRef )
5201 {
5202  AssertLIDs(staLIDVecRef.size() == numStateVars);
5203 
5204  if (DEBUG_DEVICE && getDeviceOptions().debugLevel > 0)
5205  {
5206  Xyce::dout() << std::endl
5207  << section_divider << std::endl
5208  << " In Instance::registerStateLIDs" << std::endl
5209  << " name = " << getName() << std::endl
5210  << " Number of State LIDs: " << staLIDVecRef.size() << std::endl;
5211  }
5212 
5213  // Copy over the global ID lists:
5214  staLIDVec = staLIDVecRef;
5215 
5216  int lid=0;
5217  // Intrinsic capacitors:
5218  li_state_qb = staLIDVec[lid++];
5219  li_state_qg = staLIDVec[lid++];
5220  li_state_qd = staLIDVec[lid++];
5221 
5222  if (rgateMod == 3)
5223  {
5224  li_state_qgmid = staLIDVec[lid++];
5225  }
5226 
5227  // Parasitic capacitors:
5228  if (rbodyMod)
5229  {
5230  li_state_qbs = staLIDVec[lid++];
5231  li_state_qbd = staLIDVec[lid++];
5232  }
5233 
5234  if( trnqsMod )
5235  {
5236  li_state_qcheq = staLIDVec[lid++];
5237  li_state_qcdump = staLIDVec[lid++];
5238  }
5239 
5240 #ifdef Xyce_DEBUG_DEVICE
5241  if (getDeviceOptions().debugLevel > 0)
5242  {
5243  Xyce::dout() << " Local State indices:" << std::endl;
5244  Xyce::dout() << std::endl;
5245  Xyce::dout() << " li_state_qb = " << li_state_qb << std::endl;
5246  Xyce::dout() << " li_state_qg = " << li_state_qg << std::endl;
5247  Xyce::dout() << " li_state_qd = " << li_state_qd << std::endl;
5248  Xyce::dout() << " li_state_qbs = " << li_state_qbs << std::endl;
5249  Xyce::dout() << " li_state_qbd = " << li_state_qbd << std::endl;
5250  Xyce::dout() << " li_state_qcheq = " << li_state_qcheq << std::endl;
5251  Xyce::dout() << " li_state_qcdump = " << li_state_qcdump << std::endl;
5252  Xyce::dout() << std::endl;
5253  Xyce::dout() << section_divider << std::endl;
5254  }
5255 #endif
5256 
5257 }
5258 
5259 //-----------------------------------------------------------------------------
5260 // Function : Instance::registerStoreLIDs
5261 // Purpose :
5262 // Special Notes :
5263 // Scope : public
5264 // Creator : Eric Keiter, SNL
5265 // Creation Date : 12/9/11
5266 //-----------------------------------------------------------------------------
5267 void Instance::registerStoreLIDs( const std::vector<int> & stoLIDVecRef )
5268 {
5269  AssertLIDs(stoLIDVecRef.size() == getNumStoreVars());
5270 
5271  // Copy over the global ID lists:
5272  stoLIDVec = stoLIDVecRef;
5273 
5274  int lid=0;
5275  // Voltage drops:
5276  li_store_vbd = stoLIDVec[lid++];
5277  li_store_vbs = stoLIDVec[lid++];
5278  li_store_vgs = stoLIDVec[lid++];
5279  li_store_vds = stoLIDVec[lid++];
5280  li_store_vges = stoLIDVec[lid++];
5281  li_store_vgms = stoLIDVec[lid++];
5282  li_store_vdes = stoLIDVec[lid++];
5283  li_store_vses = stoLIDVec[lid++];
5284  li_store_vdbs = stoLIDVec[lid++];
5285  li_store_vsbs = stoLIDVec[lid++];
5286  li_store_vdbd = stoLIDVec[lid++];
5287  li_store_vged = stoLIDVec[lid++];
5288  li_store_vgmd = stoLIDVec[lid++];
5289  li_store_von = stoLIDVec[lid++];
5290 }
5291 
5292 //-----------------------------------------------------------------------------
5293 // Function : Instance::jacobianStamp
5294 // Purpose :
5295 // Special Notes :
5296 // Scope : public
5297 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
5298 // Creation Date : 11/25/06
5299 //-----------------------------------------------------------------------------
5300 const std::vector< std::vector<int> > & Instance::jacobianStamp() const
5301 {
5302  return jacStamp;
5303 }
5304 
5305 //-----------------------------------------------------------------------------
5306 // Function : Instance::registerJacLIDs
5307 // Purpose :
5308 // Special Notes :
5309 // Scope : public
5310 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
5311 // Creation Date : 11/25/06
5312 //-----------------------------------------------------------------------------
5313 void Instance::registerJacLIDs( const std::vector< std::vector<int> > & jacLIDVec )
5314 {
5315  DeviceInstance::registerJacLIDs( jacLIDVec );
5316  std::vector<int> & map = jacMap;
5317  std::vector< std::vector<int> > & map2 = jacMap2;;
5318 
5319  Dd = jacLIDVec[map[0]][map2[0][0]];
5320  Ddp = jacLIDVec[map[0]][map2[0][1]];
5321  Dsp = jacLIDVec[map[0]][map2[0][2]];
5322  Dgp = jacLIDVec[map[0]][map2[0][3]];
5323  Dbp = jacLIDVec[map[0]][map2[0][4]];
5324  if (icVDSGiven)
5325  {
5326  Dids = jacLIDVec[map[0]][map2[0][5]];
5327  }
5328 
5329  GEge = jacLIDVec[map[1]][map2[1][0]];
5330  GEdp = jacLIDVec[map[1]][map2[1][1]];
5331  GEsp = jacLIDVec[map[1]][map2[1][2]];
5332  GEgp = jacLIDVec[map[1]][map2[1][3]];
5333  GEgm = jacLIDVec[map[1]][map2[1][4]];
5334  GEbp = jacLIDVec[map[1]][map2[1][5]];
5335  if (icVGSGiven)
5336  {
5337  GEigs = jacLIDVec[map[1]][map2[1][6]];
5338  }
5339 
5340  Ss = jacLIDVec[map[2]][map2[2][0]];
5341  Sdp = jacLIDVec[map[2]][map2[2][1]];
5342  Ssp = jacLIDVec[map[2]][map2[2][2]];
5343  Sgp = jacLIDVec[map[2]][map2[2][3]];
5344  Sbp = jacLIDVec[map[2]][map2[2][4]];
5345  int currentCol=5;
5346  // these must be assigned in the same order that they were set up
5347  // in the jacstamp set-up in the constructor
5348  if (icVBSGiven)
5349  {
5350  Sibs = jacLIDVec[map[2]][map2[2][currentCol++]];
5351  }
5352  if (icVDSGiven)
5353  {
5354  Sids = jacLIDVec[map[2]][map2[2][currentCol++]];
5355  }
5356  if (icVGSGiven)
5357  {
5358  Sigs = jacLIDVec[map[2]][map2[2][currentCol++]];
5359  }
5360 
5361  Bb = jacLIDVec[map[3]][map2[3][0]];
5362  Bbp = jacLIDVec[map[3]][map2[3][1]];
5363  Bsb = jacLIDVec[map[3]][map2[3][2]];
5364  Bdb = jacLIDVec[map[3]][map2[3][3]];
5365  if (icVBSGiven)
5366  {
5367  Bibs = jacLIDVec[map[3]][map2[3][4]];
5368  }
5369 
5370  DPd = jacLIDVec[map[4]][map2[4][0]];
5371  DPdp = jacLIDVec[map[4]][map2[4][1]];
5372  DPsp = jacLIDVec[map[4]][map2[4][2]];
5373  DPgp = jacLIDVec[map[4]][map2[4][3]];
5374  DPgm = jacLIDVec[map[4]][map2[4][4]];
5375  DPbp = jacLIDVec[map[4]][map2[4][5]];
5376  DPdb = jacLIDVec[map[4]][map2[4][6]];
5377  if( trnqsMod )
5378  {
5379  DPq = jacLIDVec[map[4]][map2[4][7]];
5380  }
5381 
5382  SPs = jacLIDVec[map[5]][map2[5][0]];
5383  SPdp = jacLIDVec[map[5]][map2[5][1]];
5384  SPsp = jacLIDVec[map[5]][map2[5][2]];
5385  SPgp = jacLIDVec[map[5]][map2[5][3]];
5386  SPgm = jacLIDVec[map[5]][map2[5][4]];
5387  SPbp = jacLIDVec[map[5]][map2[5][5]];
5388  SPsb = jacLIDVec[map[5]][map2[5][6]];
5389 
5390  if( trnqsMod )
5391  {
5392  SPq = jacLIDVec[map[5]][map2[5][7]];
5393  }
5394 
5395  GPge = jacLIDVec[map[6]][map2[6][0]];
5396  GPdp = jacLIDVec[map[6]][map2[6][1]];
5397  GPsp = jacLIDVec[map[6]][map2[6][2]];
5398  GPgp = jacLIDVec[map[6]][map2[6][3]];
5399  GPgm = jacLIDVec[map[6]][map2[6][4]];
5400  GPbp = jacLIDVec[map[6]][map2[6][5]];
5401 
5402  if( trnqsMod )
5403  {
5404  GPq = jacLIDVec[map[6]][map2[1][6]];
5405  }
5406 
5407  GMge = jacLIDVec[map[7]][map2[7][0]];
5408  GMdp = jacLIDVec[map[7]][map2[7][1]];
5409  GMsp = jacLIDVec[map[7]][map2[7][2]];
5410  GMgp = jacLIDVec[map[7]][map2[7][3]];
5411  GMgm = jacLIDVec[map[7]][map2[7][4]];
5412  GMbp = jacLIDVec[map[7]][map2[7][5]];
5413 
5414  BPb = jacLIDVec[map[8]][map2[8][0]];
5415  BPdp = jacLIDVec[map[8]][map2[8][1]];
5416  BPsp = jacLIDVec[map[8]][map2[8][2]];
5417  BPgp = jacLIDVec[map[8]][map2[8][3]];
5418  BPgm = jacLIDVec[map[8]][map2[8][4]];
5419  BPbp = jacLIDVec[map[8]][map2[8][5]];
5420  BPsb = jacLIDVec[map[8]][map2[8][6]];
5421  BPdb = jacLIDVec[map[8]][map2[8][7]];
5422 
5423  SBb = jacLIDVec[map[9]][map2[9][0]];
5424  SBsp = jacLIDVec[map[9]][map2[9][1]];
5425  SBbp = jacLIDVec[map[9]][map2[9][2]];
5426  SBsb = jacLIDVec[map[9]][map2[9][3]];
5427 
5428  DBb = jacLIDVec[map[10]][map2[10][0]];
5429  DBdp = jacLIDVec[map[10]][map2[10][1]];
5430  DBbp = jacLIDVec[map[10]][map2[10][2]];
5431  DBdb = jacLIDVec[map[10]][map2[10][3]];
5432 
5433  int currentRow=11;
5434  // Optional nqs row:
5435  if( trnqsMod )
5436  {
5437  Qdp = jacLIDVec[map[currentRow]][map2[currentRow][0]];
5438  Qsp = jacLIDVec[map[currentRow]][map2[currentRow][1]];
5439  Qgp = jacLIDVec[map[currentRow]][map2[currentRow][2]];
5440  Qbp = jacLIDVec[map[currentRow]][map2[currentRow][3]];
5441  Qq = jacLIDVec[map[currentRow]][map2[currentRow][4]];
5442  currentRow++;
5443  }
5444 
5445  if (icVBSGiven)
5446  {
5447  IBSs = jacLIDVec[map[currentRow]][map2[currentRow][0]];
5448  IBSb = jacLIDVec[map[currentRow]][map2[currentRow][1]];
5449  IBSibs = jacLIDVec[map[currentRow]][map2[currentRow][2]];
5450  currentRow++;
5451  }
5452 
5453  if (icVDSGiven)
5454  {
5455  IDSd = jacLIDVec[map[currentRow]][map2[currentRow][0]];
5456  IDSs = jacLIDVec[map[currentRow]][map2[currentRow][1]];
5457  IDSids = jacLIDVec[map[currentRow]][map2[currentRow][2]];
5458  currentRow++;
5459  }
5460 
5461  if (icVGSGiven)
5462  {
5463  IGSg = jacLIDVec[map[currentRow]][map2[currentRow][0]];
5464  IGSs = jacLIDVec[map[currentRow]][map2[currentRow][1]];
5465  IGSigs = jacLIDVec[map[currentRow]][map2[currentRow][2]];
5466  currentRow++;
5467  }
5468 
5469  return;
5470 }
5471 
5472 //-----------------------------------------------------------------------------
5473 // Function : Instance::setupPointers
5474 // Purpose :
5475 // Special Notes :
5476 // Scope : public
5477 // Creator : Eric Keiter, SNL
5478 // Creation Date : 12/01/08
5479 //-----------------------------------------------------------------------------
5481 {
5482 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
5483  N_LAS_Matrix & dFdx = *(extData.dFdxMatrixPtr);
5484  N_LAS_Matrix & dQdx = *(extData.dQdxMatrixPtr);
5485 
5486  f_DdPtr = &(dFdx[li_Drain][Dd ]); q_DdPtr = &(dQdx[li_Drain][Dd ]);
5487  f_DdpPtr = &(dFdx[li_Drain][Ddp ]); q_DdpPtr = &(dQdx[li_Drain][Ddp ]);
5488  f_DspPtr = &(dFdx[li_Drain][Dsp ]); q_DspPtr = &(dQdx[li_Drain][Dsp ]);
5489  f_DgpPtr = &(dFdx[li_Drain][Dgp ]); q_DgpPtr = &(dQdx[li_Drain][Dgp ]);
5490  f_DbpPtr = &(dFdx[li_Drain][Dbp ]); q_DbpPtr = &(dQdx[li_Drain][Dbp ]);
5491  if (icVDSGiven)
5492  {
5493  f_DidsPtr = &(dFdx[li_Drain][Dids]);
5494  }
5495 
5496  f_GEgePtr = &(dFdx[li_GateExt][GEge ]); q_GEgePtr = &(dQdx[li_GateExt][GEge ]);
5497  f_GEdpPtr = &(dFdx[li_GateExt][GEdp ]); q_GEdpPtr = &(dQdx[li_GateExt][GEdp ]);
5498  f_GEspPtr = &(dFdx[li_GateExt][GEsp ]); q_GEspPtr = &(dQdx[li_GateExt][GEsp ]);
5499  f_GEgpPtr = &(dFdx[li_GateExt][GEgp ]); q_GEgpPtr = &(dQdx[li_GateExt][GEgp ]);
5500  f_GEgmPtr = &(dFdx[li_GateExt][GEgm ]); q_GEgmPtr = &(dQdx[li_GateExt][GEgm ]);
5501  f_GEbpPtr = &(dFdx[li_GateExt][GEbp ]); q_GEbpPtr = &(dQdx[li_GateExt][GEbp ]);
5502  if (icVGSGiven)
5503  {
5504  f_GEigsPtr = &(dFdx[li_GateExt][GEigs]);
5505  }
5506 
5507  f_SsPtr = &(dFdx[li_Source][Ss ]); q_SsPtr = &(dQdx[li_Source][Ss ]);
5508  f_SdpPtr = &(dFdx[li_Source][Sdp ]); q_SdpPtr = &(dQdx[li_Source][Sdp ]);
5509  f_SspPtr = &(dFdx[li_Source][Ssp ]); q_SspPtr = &(dQdx[li_Source][Ssp ]);
5510  f_SgpPtr = &(dFdx[li_Source][Sgp ]); q_SgpPtr = &(dQdx[li_Source][Sgp ]);
5511  f_SbpPtr = &(dFdx[li_Source][Sbp ]); q_SbpPtr = &(dQdx[li_Source][Sbp ]);
5512  if (icVBSGiven)
5513  {
5514  f_SibsPtr = &(dFdx[li_Source][Sibs]);
5515  }
5516  if (icVDSGiven)
5517  {
5518  f_SidsPtr = &(dFdx[li_Source][Sids]);
5519  }
5520  if (icVGSGiven)
5521  {
5522  f_SigsPtr = &(dFdx[li_Source][Sigs]);
5523  }
5524 
5525  f_BbPtr = &(dFdx[li_Body][Bb ]); q_BbPtr = &(dQdx[li_Body][Bb ]);
5526  f_BbpPtr = &(dFdx[li_Body][Bbp ]); q_BbpPtr = &(dQdx[li_Body][Bbp ]);
5527  f_BsbPtr = &(dFdx[li_Body][Bsb ]); q_BsbPtr = &(dQdx[li_Body][Bsb ]);
5528  f_BdbPtr = &(dFdx[li_Body][Bdb ]); q_BdbPtr = &(dQdx[li_Body][Bdb ]);
5529  if (icVBSGiven)
5530  {
5531  f_BibsPtr = &(dFdx[li_Body][Bibs]);
5532  }
5533 
5534  f_DPdPtr = &(dFdx[li_DrainPrime][DPd ]); q_DPdPtr = &(dQdx[li_DrainPrime][DPd ]);
5535  f_DPdpPtr = &(dFdx[li_DrainPrime][DPdp ]); q_DPdpPtr = &(dQdx[li_DrainPrime][DPdp ]);
5536  f_DPspPtr = &(dFdx[li_DrainPrime][DPsp ]); q_DPspPtr = &(dQdx[li_DrainPrime][DPsp ]);
5537  f_DPgpPtr = &(dFdx[li_DrainPrime][DPgp ]); q_DPgpPtr = &(dQdx[li_DrainPrime][DPgp ]);
5538  f_DPgmPtr = &(dFdx[li_DrainPrime][DPgm ]); q_DPgmPtr = &(dQdx[li_DrainPrime][DPgm ]);
5539  f_DPbpPtr = &(dFdx[li_DrainPrime][DPbp ]); q_DPbpPtr = &(dQdx[li_DrainPrime][DPbp ]);
5540  f_DPdbPtr = &(dFdx[li_DrainPrime][DPdb ]); q_DPdbPtr = &(dQdx[li_DrainPrime][DPdb ]);
5541  if( trnqsMod )
5542  {
5543  f_DPqPtr = &(dFdx[li_DrainPrime][DPq ]); q_DPqPtr = &(dQdx[li_DrainPrime][DPq ]);
5544  }
5545 
5546  f_SPsPtr = &(dFdx[li_SourcePrime][SPs ]); q_SPsPtr = &(dQdx[li_SourcePrime][SPs ]);
5547  f_SPdpPtr = &(dFdx[li_SourcePrime][SPdp ]); q_SPdpPtr = &(dQdx[li_SourcePrime][SPdp ]);
5548  f_SPspPtr = &(dFdx[li_SourcePrime][SPsp ]); q_SPspPtr = &(dQdx[li_SourcePrime][SPsp ]);
5549  f_SPgpPtr = &(dFdx[li_SourcePrime][SPgp ]); q_SPgpPtr = &(dQdx[li_SourcePrime][SPgp ]);
5550  f_SPgmPtr = &(dFdx[li_SourcePrime][SPgm ]); q_SPgmPtr = &(dQdx[li_SourcePrime][SPgm ]);
5551  f_SPbpPtr = &(dFdx[li_SourcePrime][SPbp ]); q_SPbpPtr = &(dQdx[li_SourcePrime][SPbp ]);
5552  f_SPsbPtr = &(dFdx[li_SourcePrime][SPsb ]); q_SPsbPtr = &(dQdx[li_SourcePrime][SPsb ]);
5553 
5554  if( trnqsMod )
5555  {
5556  f_SPqPtr = &(dFdx[li_SourcePrime][SPq ]); q_SPqPtr = &(dQdx[li_SourcePrime][SPq ]);
5557  }
5558 
5559  f_GPgePtr = &(dFdx[li_GatePrime][GPge ]); q_GPgePtr = &(dQdx[li_GatePrime][GPge ]);
5560  f_GPdpPtr = &(dFdx[li_GatePrime][GPdp ]); q_GPdpPtr = &(dQdx[li_GatePrime][GPdp ]);
5561  f_GPspPtr = &(dFdx[li_GatePrime][GPsp ]); q_GPspPtr = &(dQdx[li_GatePrime][GPsp ]);
5562  f_GPgpPtr = &(dFdx[li_GatePrime][GPgp ]); q_GPgpPtr = &(dQdx[li_GatePrime][GPgp ]);
5563  f_GPgmPtr = &(dFdx[li_GatePrime][GPgm ]); q_GPgmPtr = &(dQdx[li_GatePrime][GPgm ]);
5564  f_GPbpPtr = &(dFdx[li_GatePrime][GPbp ]); q_GPbpPtr = &(dQdx[li_GatePrime][GPbp ]);
5565 
5566  if( trnqsMod )
5567  {
5568  f_GPqPtr = &(dFdx[li_GatePrime][GPq ]); q_GPqPtr = &(dQdx[li_GatePrime][GPq ]);
5569  }
5570 
5571  f_GMgePtr = &(dFdx[li_GateMid][GMge ]); q_GMgePtr = &(dQdx[li_GateMid][GMge ]);
5572  f_GMdpPtr = &(dFdx[li_GateMid][GMdp ]); q_GMdpPtr = &(dQdx[li_GateMid][GMdp ]);
5573  f_GMspPtr = &(dFdx[li_GateMid][GMsp ]); q_GMspPtr = &(dQdx[li_GateMid][GMsp ]);
5574  f_GMgpPtr = &(dFdx[li_GateMid][GMgp ]); q_GMgpPtr = &(dQdx[li_GateMid][GMgp ]);
5575  f_GMgmPtr = &(dFdx[li_GateMid][GMgm ]); q_GMgmPtr = &(dQdx[li_GateMid][GMgm ]);
5576  f_GMbpPtr = &(dFdx[li_GateMid][GMbp ]); q_GMbpPtr = &(dQdx[li_GateMid][GMbp ]);
5577 
5578  f_BPbPtr = &(dFdx[li_BodyPrime][BPb ]); q_BPbPtr = &(dQdx[li_BodyPrime][BPb ]);
5579  f_BPdpPtr = &(dFdx[li_BodyPrime][BPdp ]); q_BPdpPtr = &(dQdx[li_BodyPrime][BPdp ]);
5580  f_BPspPtr = &(dFdx[li_BodyPrime][BPsp ]); q_BPspPtr = &(dQdx[li_BodyPrime][BPsp ]);
5581  f_BPgpPtr = &(dFdx[li_BodyPrime][BPgp ]); q_BPgpPtr = &(dQdx[li_BodyPrime][BPgp ]);
5582  f_BPgmPtr = &(dFdx[li_BodyPrime][BPgm ]); q_BPgmPtr = &(dQdx[li_BodyPrime][BPgm ]);
5583  f_BPbpPtr = &(dFdx[li_BodyPrime][BPbp ]); q_BPbpPtr = &(dQdx[li_BodyPrime][BPbp ]);
5584  f_BPsbPtr = &(dFdx[li_BodyPrime][BPsb ]); q_BPsbPtr = &(dQdx[li_BodyPrime][BPsb ]);
5585  f_BPdbPtr = &(dFdx[li_BodyPrime][BPdb ]); q_BPdbPtr = &(dQdx[li_BodyPrime][BPdb ]);
5586 
5587  f_SBbPtr = &(dFdx[li_SourceBody][SBb ]); q_SBbPtr = &(dQdx[li_SourceBody][SBb ]);
5588  f_SBspPtr = &(dFdx[li_SourceBody][SBsp ]); q_SBspPtr = &(dQdx[li_SourceBody][SBsp ]);
5589  f_SBbpPtr = &(dFdx[li_SourceBody][SBbp ]); q_SBbpPtr = &(dQdx[li_SourceBody][SBbp ]);
5590  f_SBsbPtr = &(dFdx[li_SourceBody][SBsb ]); q_SBsbPtr = &(dQdx[li_SourceBody][SBsb ]);
5591 
5592  f_DBbPtr = &(dFdx[li_DrainBody][DBb ]); q_DBbPtr = &(dQdx[li_DrainBody][DBb ]);
5593  f_DBdpPtr = &(dFdx[li_DrainBody][DBdp ]); q_DBdpPtr = &(dQdx[li_DrainBody][DBdp ]);
5594  f_DBbpPtr = &(dFdx[li_DrainBody][DBbp ]); q_DBbpPtr = &(dQdx[li_DrainBody][DBbp ]);
5595  f_DBdbPtr = &(dFdx[li_DrainBody][DBdb ]); q_DBdbPtr = &(dQdx[li_DrainBody][DBdb ]);
5596 
5597  // Optional nqs row:
5598  if( trnqsMod )
5599  {
5600  f_QdpPtr = &(dFdx[li_Charge][Qdp ]); q_QdpPtr = &(dQdx[li_Charge][Qdp ]);
5601  f_QspPtr = &(dFdx[li_Charge][Qsp ]); q_QspPtr = &(dQdx[li_Charge][Qsp ]);
5602  f_QgpPtr = &(dFdx[li_Charge][Qgp ]); q_QgpPtr = &(dQdx[li_Charge][Qgp ]);
5603  f_QbpPtr = &(dFdx[li_Charge][Qbp ]); q_QbpPtr = &(dQdx[li_Charge][Qbp ]);
5604  f_QqPtr = &(dFdx[li_Charge][Qq ]); q_QqPtr = &(dQdx[li_Charge][Qq ]);
5605  }
5606  if (icVBSGiven)
5607  {
5608  f_IBSbPtr = &(dFdx[li_Ibs][IBSb]);
5609  f_IBSsPtr = &(dFdx[li_Ibs][IBSs]);
5610  f_IBSibsPtr = &(dFdx[li_Ibs][IBSibs]);
5611  }
5612  if (icVDSGiven)
5613  {
5614  f_IDSdPtr = &(dFdx[li_Ids][IDSd]);
5615  f_IDSsPtr = &(dFdx[li_Ids][IDSs]);
5616  f_IDSidsPtr = &(dFdx[li_Ids][IDSids]);
5617  }
5618  if (icVGSGiven)
5619  {
5620  f_IGSgPtr = &(dFdx[li_Igs][IGSg]);
5621  f_IGSsPtr = &(dFdx[li_Igs][IGSs]);
5622  f_IGSigsPtr = &(dFdx[li_Igs][IGSigs]);
5623  }
5624 
5625 #endif
5626 }
5627 
5628 //-----------------------------------------------------------------------------
5629 // Function : Instance::updateTemperature
5630 // Purpose : This updates all the instance-owned paramters which
5631 // are temperature dependent.
5632 //
5633 // Special Notes : Annoyingly, some model-owned parameters need to be
5634 // tweaked here because of how the SPICE code is set up.
5635 //
5636 // Scope : public
5637 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
5638 // Creation Date : 11/25/06
5639 //-----------------------------------------------------------------------------
5640 bool Instance::updateTemperature (const double & temp_tmp)
5641 {
5642  std::string msg="";
5643 
5644  double tmp(0.0), tmp1(0.0), tmp2(0.0), tmp3(0.0), Eg(0.0), Eg0(0.0), ni,epssub;
5645  double T0(0.0), T1(0.0);
5646  double T2(0.0), T3(0.0), T4(0.0), T5(0.0), T6(0.0), T7(0.0), T8(0.0), T9(0.0), Lnew(0.0), Wnew(0.0);
5647  double delTemp(0.0), TRatio(0.0), Inv_L(0.0), Inv_W(0.0), Inv_LW(0.0), Vtm0, Tnom(0.0);
5648  double dumPs(0.0), dumPd(0.0), dumAs(0.0), dumAd(0.0), PowWeffWr(0.0);
5649  double Nvtms(0.0), Nvtmd(0.0), SourceSatCurrent(0.0), DrainSatCurrent(0.0);
5650  double T10(0.0);
5651  double Inv_saref(0.0), Inv_sbref(0.0), Inv_sa(0.0), Inv_sb(0.0), rho(0.0), Ldrn(0.0), dvth0_lod(0.0);
5652  double W_tmp(0.0), Inv_ODeff(0.0), OD_offset(0.0), dk2_lod(0.0), deta0_lod(0.0);
5653  double lnl(0.0), lnw(0.0), lnnf(0.0), rbpbx(0.0), rbpby(0.0), rbsbx(0.0), rbsby(0.0), rbdbx(0.0), rbdby(0.0),bodymode(0.0);
5654  double kvsat(0.0), wlod(0.0), sceff(0.0), Wdrn(0.0);
5655  double V0, lt1, ltw, Theta0, Delt_vth, TempRatio, Vth_NarrowW, Lpe_Vb, Vth;
5656  double n, Vgsteff, Vgs_eff, toxpf, toxpi, Tcen, toxe, epsrox, vddeot;
5657 
5658  int niter;
5659 
5660  bool bsuccess = true;
5661 
5662 #ifdef Xyce_DEBUG_DEVICE
5663  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
5664  {
5665  Xyce::dout() << std::endl << subsection_divider << std::endl;
5666  Xyce::dout() << "Instance::updateTemperature\n";
5667  Xyce::dout() << "name = " << getName() << std::endl;
5668  }
5669 #endif
5670 
5671  // first set the instance temperature to the new temperature:
5672  if (temp_tmp != -999.0) temp = temp_tmp;
5673 
5674  Tnom = model_.tnom;
5675  TRatio = temp/Tnom;
5676 
5677  ///////////////////////////////////////////////////////////////////////////////
5678  // Model-specific stuff:
5679  // This is kludgey - the model-specific stuff should be handled in a model function.
5680  // Some of this used to be in the model class's processParams, but was
5681  // moved back here because it makes updating from new spice BSIM4 code
5682  // less painful, even though it makes no sense here.
5683  //
5684 
5685  if (model_.mtrlMod == 0)
5686  {
5687  if ((model_.toxeGiven) && (model_.toxpGiven) &&
5688  (model_.dtoxGiven) &&
5689  (model_.toxe != (model_.toxp +model_.dtox)))
5690  {
5691  UserWarning(*this) << "toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored";
5692  }
5693  else if ((model_.toxeGiven) && (!model_.toxpGiven))
5694  {
5696  }
5697  else if ((!model_.toxeGiven) && (model_.toxpGiven))
5698  {
5700  }
5701  }
5702 
5703  if (model_.mtrlMod)
5704  {
5705  epsrox = 3.9;
5706  toxe = model_.eot;
5707  epssub = CONSTEPS0 * model_.epsrsub;
5708  }
5709  else
5710  {
5711  epsrox = model_.epsrox;
5712  toxe = model_.toxe;
5713  epssub = CONSTEPSSI;
5714  }
5715 
5716 
5717  model_.coxe = epsrox * CONSTEPS0 / toxe;
5718  if (model_.mtrlMod == 0)
5720 
5721  if (!model_.cgdoGiven)
5722  {
5723  if (model_.dlcGiven && (model_.dlc > 0.0))
5724  {
5726  }
5727  else
5728  {
5729  model_.cgdo = 0.6 * model_.xj * model_.coxe;
5730  }
5731  }
5732 
5733  if (!model_.cgsoGiven)
5734  {
5735  if (model_.dlcGiven && (model_.dlc > 0.0))
5736  {
5738  }
5739  else
5740  {
5741  model_.cgso = 0.6 * model_.xj * model_.coxe;
5742  }
5743  }
5744  if (!model_.cgboGiven)
5745  {
5746  model_.cgbo = 2.0 * model_.dwc * model_.coxe;
5747  }
5748 
5749  model_.vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14));
5750  model_.factor1 = sqrt(epssub / (epsrox * CONSTEPS0) * toxe);
5751 
5752  Vtm0 = model_.vtm0 = CONSTKboQ * Tnom;
5753 
5754  if (model_.mtrlMod == 0)
5755  {
5756  Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0);
5757  ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15)
5758  * exp(21.5565981 - Eg0 / (2.0 * Vtm0));
5759  }
5760  else
5761  {
5762  Eg0 = model_.bg0sub - model_.tbgasub * Tnom * Tnom
5763  / (Tnom + model_.tbgbsub);
5764  T0 = model_.bg0sub - model_.tbgasub * 90090.0225
5765  / (300.15 + model_.tbgbsub);
5766  ni = model_.ni0sub * (Tnom / 300.15) * sqrt(Tnom / 300.15)
5767  * exp((T0 - Eg0) / (2.0 * Vtm0));
5768  }
5769 
5770  model_.Eg0 = Eg0;
5771  model_.vtm = CONSTKboQ * temp;
5772  if (model_.mtrlMod == 0)
5773  {
5774  Eg = 1.16 - 7.02e-4 * temp * temp / (temp + 1108.0);
5775  }
5776  else
5777  {
5778  Eg = model_.bg0sub - model_.tbgasub * temp * temp
5779  / (temp + model_.tbgbsub);
5780  }
5781 
5782  if (temp != Tnom)
5783  {
5784  T0 = Eg0 / Vtm0 - Eg / model_.vtm;
5785  T1 = log(temp / Tnom);
5786  T2 = T0 + model_.SjctTempExponent * T1;
5787  T3 = exp(T2 / model_.SjctEmissionCoeff);
5789 
5792 
5795 
5796  T2 = T0 + model_.DjctTempExponent * T1;
5797  T3 = exp(T2 / model_.DjctEmissionCoeff);
5798 
5800 
5803 
5806 
5807  }
5808  else
5809  {
5812 
5815 
5817 
5820 
5823  }
5824 
5825  if (model_.SjctTempSatCurDensity < 0.0)
5827 
5830 
5833 
5834  if (model_.DjctTempSatCurDensity < 0.0)
5836 
5839 
5842 
5843  // Temperature dependence of D/B and S/B diode capacitance begins
5844  delTemp = temp - Tnom;
5845  T0 = model_.tcj * delTemp;
5846  if (T0 >= -1.0)
5847  { model_.SunitAreaTempJctCap = model_.SunitAreaJctCap *(1.0 + T0); //bug_fix -JX
5849  }
5850  else
5851  {
5852  if (model_.SunitAreaJctCap > 0.0)
5853  {
5855  UserWarning(*this) << "Temperature effect has caused cjs to be negative. Cjs is clamped to zero";
5856 
5857  }
5858  if (model_.DunitAreaJctCap > 0.0)
5859  {
5861  UserWarning(*this) << "Temperature effect has caused cjd to be negative. Cjd is clamped to zero";
5862  }
5863  }
5864 
5865  T0 = model_.tcjsw * delTemp;
5866  if (T0 >= -1.0)
5867  {
5870  }
5871  else
5872  {
5874  {
5876  UserWarning(*this) << "Temperature effect has caused cjsws to be negative. Cjsws is clamped to zero";
5877  }
5879  {
5881  UserWarning(*this) << "Temperature effect has caused cjswd to be negative. Cjswd is clamped to zero";
5882  }
5883  }
5884 
5885  T0 = model_.tcjswg * delTemp;
5886  if (T0 >= -1.0)
5887  {
5890  }
5891  else
5892  {
5894  {
5896  UserWarning(*this) << "Temperature effect has caused cjswgs to be negative. Cjswgs is clamped to zero";
5897  }
5899  {
5901  UserWarning(*this) << "Temperature effect has caused cjswgd to be negative. Cjswgd is clamped to zero";
5902  }
5903  }
5904 
5906 
5907  if (model_.PhiBS < 0.01)
5908  {
5909  model_.PhiBS = 0.01;
5910  UserWarning(*this) << "Temperature effect has caused pbs to be less than 0.01. Pbs is clamped to 0.01";
5911  }
5912 
5914  if (model_.PhiBD < 0.01)
5915  {
5916  model_.PhiBD = 0.01;
5917  UserWarning(*this) << "Temperature effect has caused pbd to be less than 0.01. Pbd is clamped to 0.01";
5918  }
5919 
5921  if (model_.PhiBSWS <= 0.01)
5922  {
5923  model_.PhiBSWS = 0.01;
5924  UserWarning(*this) << "Temperature effect has caused pbsws to be less than 0.01. Pbsws is clamped to 0.01";
5925  }
5926 
5928  if (model_.PhiBSWD <= 0.01)
5929  {
5930  model_.PhiBSWD = 0.01;
5931  UserWarning(*this) << "Temperature effect has caused pbswd to be less than 0.01. Pbswd is clamped to 0.01";
5932  }
5933 
5935  if (model_.PhiBSWGS <= 0.01)
5936  {
5937  model_.PhiBSWGS = 0.01;
5938  UserWarning(*this) << "Temperature effect has caused pbswgs to be less than 0.01. Pbswgs is clamped to 0.01";
5939  }
5940 
5942  if (model_.PhiBSWGD <= 0.01)
5943  {
5944  model_.PhiBSWGD = 0.01;
5945  UserWarning(*this) << "Temperature effect has caused pbswgd to be less than 0.01. Pbswgd is clamped to 0.01";
5946  } // End of junction capacitance
5947 
5948 
5949  if (model_.ijthdfwd <= 0.0)
5950  {
5951  model_.ijthdfwd = 0.1;
5952  UserWarning(*this) << "Ijthdfwd reset to " << model_.ijthdfwd;
5953  }
5954  if (model_.ijthsfwd <= 0.0)
5955  {
5956  model_.ijthsfwd = 0.1;
5957  UserWarning(*this) << "Ijthsfwd reset to " << model_.ijthsfwd;
5958  }
5959  if (model_.ijthdrev <= 0.0)
5960  {
5961  model_.ijthdrev = 0.1;
5962  UserWarning(*this) << "Ijthdrev reset to " << model_.ijthdrev;
5963  }
5964  if (model_.ijthsrev <= 0.0)
5965  {
5966  model_.ijthsrev = 0.1;
5967  UserWarning(*this) << "Ijthsrev reset to " << model_.ijthsrev;
5968  }
5969 
5970  if ((model_.xjbvd <= 0.0) && (model_.dioMod == 2))
5971  {
5972  model_.xjbvd = 1.0;
5973  UserWarning(*this) << "Xjbvd reset to " << model_.xjbvd;
5974  }
5975  else if ((model_.xjbvd < 0.0) && (model_.dioMod == 0))
5976  {
5977  model_.xjbvd = 1.0;
5978  UserWarning(*this) << "Xjbvd reset to " << model_.xjbvd;
5979  }
5980 
5981  if (model_.bvd <= 0.0)
5982  {
5983  model_.bvd = 10.0;
5984  UserWarning(*this) << "BVD reset to " << model_.bvd;
5985  }
5986 
5987  if ((model_.xjbvs <= 0.0) && (model_.dioMod == 2))
5988  {
5989  model_.xjbvs = 1.0;
5990  UserWarning(*this) << "Xjbvs reset to " << model_.xjbvs;
5991  }
5992  else if ((model_.xjbvs < 0.0) && (model_.dioMod == 0))
5993  {
5994  model_.xjbvs = 1.0;
5995  UserWarning(*this) << "Xjbvs reset to " << model_.xjbvs;
5996  }
5997 
5998  if (model_.bvs <= 0.0)
5999  {
6000  model_.bvs = 10.0;
6001  UserWarning(*this) << "BVS reset to " << model_.bvs;
6002  }
6003 
6004 
6005  ///////////////////////////////////////////////////////////////////////////////
6006  // Instance stuff:
6007  // (loop through all the instances of the model)
6008 
6009  // stress effect
6010  Ldrn = l;
6011  Wdrn = w / nf;
6012 
6013  // This next block determines whether or not to use a previously allocated
6014  // set of size dependent parameters. These are stored in a list that is
6015  // owned by the model. If the values for length and width match those of
6016  // a previously allocated set, then use the old set. If not, allocate a new set.
6017 
6018  std::list<SizeDependParam*>::iterator it_dpL =
6019  model_.sizeDependParamList.begin();
6020  std::list<SizeDependParam*>::iterator end_dpL =
6022 
6023  paramPtr = NULL;
6024 
6025  for( ; it_dpL != end_dpL; ++it_dpL )
6026  {
6027  if( ((*it_dpL)->Length == l)
6028  && ((*it_dpL)->Width == w)
6029  && ((*it_dpL)->NFinger == nf) )
6030  {
6031  paramPtr = (*it_dpL);
6032  }
6033  }
6034 
6035  // This was inside of the "Size_Not_Found" if-statement, but that
6036  // won't work here - it winds up being uninitialized whenever the
6037  // size pointer is found
6038  Lnew = l + model_.xl ;
6039  Wnew = w / nf + model_.xw;
6040 
6041  if ( paramPtr != NULL )
6042  {
6043  }
6044  else
6045  {
6046  paramPtr = new SizeDependParam ();
6047 
6048  model_.sizeDependParamList.push_back( paramPtr );
6049  paramPtr->referenceTemperature = temp_tmp;
6050 
6051  //paramPtr->pNext = NULL;
6052 
6053  paramPtr->Length = l;
6054  paramPtr->Width = w;
6055  paramPtr->NFinger = nf;
6056  //Lnew = l + model_.xl ;
6057  //Wnew = w / nf + model_.xw;
6058 
6059  T0 = pow(Lnew, model_.Lln);
6060  T1 = pow(Wnew, model_.Lwn);
6061  tmp1 = model_.Ll / T0 + model_.Lw / T1
6062  + model_.Lwl / (T0 * T1);
6063  paramPtr->dl = model_.Lint + tmp1;
6064  tmp2 = model_.Llc / T0 + model_.Lwc / T1
6065  + model_.Lwlc / (T0 * T1);
6066  paramPtr->dlc = model_.dlc + tmp2;
6067 
6068  T2 = pow(Lnew, model_.Wln);
6069  T3 = pow(Wnew, model_.Wwn);
6070  tmp1 = model_.Wl / T2 + model_.Ww / T3
6071  + model_.Wwl / (T2 * T3);
6072  paramPtr->dw = model_.Wint + tmp1;
6073  tmp2 = model_.Wlc / T2 + model_.Wwc / T3
6074  + model_.Wwlc / (T2 * T3);
6075  paramPtr->dwc = model_.dwc + tmp2;
6076  paramPtr->dwj = model_.dwj + tmp2;
6077 
6078  paramPtr->leff = Lnew - 2.0 * paramPtr->dl;
6079 
6080  if (paramPtr->leff <= 0.0)
6081  {
6082  UserError0(*this) << "mosfet " << getName() << " model " << model_.getName()
6083  << " Effective channel length <= 0";
6084  }
6085 
6086  paramPtr->weff = Wnew - 2.0 * paramPtr->dw;
6087  if (paramPtr->weff <= 0.0)
6088  {
6089  UserError0(*this) << "mosfet " << getName() << " model " << model_.getName()
6090  << " Effective channel width <= 0";
6091  }
6092 
6093  paramPtr->leffCV = Lnew - 2.0 * paramPtr->dlc;
6094  if (paramPtr->leffCV <= 0.0)
6095  {
6096  UserError0(*this) << "mosfet " << getName() << " model " << model_.getName()
6097  << " Effective channel length for C-V <= 0";
6098  }
6099 
6100  paramPtr->weffCV = Wnew - 2.0 * paramPtr->dwc;
6101  if (paramPtr->weffCV <= 0.0)
6102  {
6103  UserError0(*this) << "mosfet " << getName() << " model " << model_.getName()
6104  << " Effective channel width for C-V <= 0";
6105  }
6106 
6107  paramPtr->weffCJ = Wnew - 2.0 * paramPtr->dwj;
6108  if (paramPtr->weffCJ <= 0.0)
6109  {
6110  UserError0(*this) << "mosfet " << getName() << " model " << model_.getName()
6111  << " Effective channel width for S/D junctions <= 0";
6112  }
6113 
6114 
6115  if (model_.binUnit == 1)
6116  {
6117  Inv_L = 1.0e-6 / paramPtr->leff;
6118  Inv_W = 1.0e-6 / paramPtr->weff;
6119  Inv_LW = 1.0e-12 / (paramPtr->leff * paramPtr->weff);
6120  }
6121  else
6122  {
6123  Inv_L = 1.0 / paramPtr->leff;
6124  Inv_W = 1.0 / paramPtr->weff;
6125  Inv_LW = 1.0 / (paramPtr->leff * paramPtr->weff);
6126  }
6128  + model_.lcdsc * Inv_L
6129  + model_.wcdsc * Inv_W
6130  + model_.pcdsc * Inv_LW;
6132  + model_.lcdscb * Inv_L
6133  + model_.wcdscb * Inv_W
6134  + model_.pcdscb * Inv_LW;
6135 
6137  + model_.lcdscd * Inv_L
6138  + model_.wcdscd * Inv_W
6139  + model_.pcdscd * Inv_LW;
6140 
6141  paramPtr->cit = model_.cit
6142  + model_.lcit * Inv_L
6143  + model_.wcit * Inv_W
6144  + model_.pcit * Inv_LW;
6146  + model_.lnfactor * Inv_L
6147  + model_.wnfactor * Inv_W
6148  + model_.pnfactor * Inv_LW;
6149  paramPtr->xj = model_.xj
6150  + model_.lxj * Inv_L
6151  + model_.wxj * Inv_W
6152  + model_.pxj * Inv_LW;
6154  + model_.lvsat * Inv_L
6155  + model_.wvsat * Inv_W
6156  + model_.pvsat * Inv_LW;
6157  paramPtr->at = model_.at
6158  + model_.lat * Inv_L
6159  + model_.wat * Inv_W
6160  + model_.pat * Inv_LW;
6161  paramPtr->a0 = model_.a0
6162  + model_.la0 * Inv_L
6163  + model_.wa0 * Inv_W
6164  + model_.pa0 * Inv_LW;
6165 
6166  paramPtr->ags = model_.ags
6167  + model_.lags * Inv_L
6168  + model_.wags * Inv_W
6169  + model_.pags * Inv_LW;
6170 
6171  paramPtr->a1 = model_.a1
6172  + model_.la1 * Inv_L
6173  + model_.wa1 * Inv_W
6174  + model_.pa1 * Inv_LW;
6175  paramPtr->a2 = model_.a2
6176  + model_.la2 * Inv_L
6177  + model_.wa2 * Inv_W
6178  + model_.pa2 * Inv_LW;
6180  + model_.lketa * Inv_L
6181  + model_.wketa * Inv_W
6182  + model_.pketa * Inv_LW;
6184  + model_.lnsub * Inv_L
6185  + model_.wnsub * Inv_W
6186  + model_.pnsub * Inv_LW;
6188  + model_.lndep * Inv_L
6189  + model_.wndep * Inv_W
6190  + model_.pndep * Inv_LW;
6191  paramPtr->nsd = model_.nsd
6192  + model_.lnsd * Inv_L
6193  + model_.wnsd * Inv_W
6194  + model_.pnsd * Inv_LW;
6196  + model_.lphin * Inv_L
6197  + model_.wphin * Inv_W
6198  + model_.pphin * Inv_LW;
6200  + model_.lngate * Inv_L
6201  + model_.wngate * Inv_W
6202  + model_.pngate * Inv_LW;
6204  + model_.lgamma1 * Inv_L
6205  + model_.wgamma1 * Inv_W
6206  + model_.pgamma1 * Inv_LW;
6208  + model_.lgamma2 * Inv_L
6209  + model_.wgamma2 * Inv_W
6210  + model_.pgamma2 * Inv_LW;
6211  paramPtr->vbx = model_.vbx
6212  + model_.lvbx * Inv_L
6213  + model_.wvbx * Inv_W
6214  + model_.pvbx * Inv_LW;
6215  paramPtr->vbm = model_.vbm
6216  + model_.lvbm * Inv_L
6217  + model_.wvbm * Inv_W
6218  + model_.pvbm * Inv_LW;
6219  paramPtr->xt = model_.xt
6220  + model_.lxt * Inv_L
6221  + model_.wxt * Inv_W
6222  + model_.pxt * Inv_LW;
6223  paramPtr->vfb = model_.vfb
6224  + model_.lvfb * Inv_L
6225  + model_.wvfb * Inv_W
6226  + model_.pvfb * Inv_LW;
6227  paramPtr->k1 = model_.k1
6228  + model_.lk1 * Inv_L
6229  + model_.wk1 * Inv_W
6230  + model_.pk1 * Inv_LW;
6231  paramPtr->kt1 = model_.kt1
6232  + model_.lkt1 * Inv_L
6233  + model_.wkt1 * Inv_W
6234  + model_.pkt1 * Inv_LW;
6236  + model_.lkt1l * Inv_L
6237  + model_.wkt1l * Inv_W
6238  + model_.pkt1l * Inv_LW;
6239  paramPtr->k2 = model_.k2
6240  + model_.lk2 * Inv_L
6241  + model_.wk2 * Inv_W
6242  + model_.pk2 * Inv_LW;
6243  paramPtr->kt2 = model_.kt2
6244  + model_.lkt2 * Inv_L
6245  + model_.wkt2 * Inv_W
6246  + model_.pkt2 * Inv_LW;
6247  paramPtr->k3 = model_.k3
6248  + model_.lk3 * Inv_L
6249  + model_.wk3 * Inv_W
6250  + model_.pk3 * Inv_LW;
6251  paramPtr->k3b = model_.k3b
6252  + model_.lk3b * Inv_L
6253  + model_.wk3b * Inv_W
6254  + model_.pk3b * Inv_LW;
6255  paramPtr->w0 = model_.w0
6256  + model_.lw0 * Inv_L
6257  + model_.ww0 * Inv_W
6258  + model_.pw0 * Inv_LW;
6260  + model_.llpe0 * Inv_L
6261  + model_.wlpe0 * Inv_W
6262  + model_.plpe0 * Inv_LW;
6264  + model_.llpeb * Inv_L
6265  + model_.wlpeb * Inv_W
6266  + model_.plpeb * Inv_LW;
6268  + model_.ldvtp0 * Inv_L
6269  + model_.wdvtp0 * Inv_W
6270  + model_.pdvtp0 * Inv_LW;
6272  + model_.ldvtp1 * Inv_L
6273  + model_.wdvtp1 * Inv_W
6274  + model_.pdvtp1 * Inv_LW;
6276  + model_.ldvt0 * Inv_L
6277  + model_.wdvt0 * Inv_W
6278  + model_.pdvt0 * Inv_LW;
6280  + model_.ldvt1 * Inv_L
6281  + model_.wdvt1 * Inv_W
6282  + model_.pdvt1 * Inv_LW;
6284  + model_.ldvt2 * Inv_L
6285  + model_.wdvt2 * Inv_W
6286  + model_.pdvt2 * Inv_LW;
6288  + model_.ldvt0w * Inv_L
6289  + model_.wdvt0w * Inv_W
6290  + model_.pdvt0w * Inv_LW;
6292  + model_.ldvt1w * Inv_L
6293  + model_.wdvt1w * Inv_W
6294  + model_.pdvt1w * Inv_LW;
6296  + model_.ldvt2w * Inv_L
6297  + model_.wdvt2w * Inv_W
6298  + model_.pdvt2w * Inv_LW;
6300  + model_.ldrout * Inv_L
6301  + model_.wdrout * Inv_W
6302  + model_.pdrout * Inv_LW;
6304  + model_.ldsub * Inv_L
6305  + model_.wdsub * Inv_W
6306  + model_.pdsub * Inv_LW;
6308  + model_.lvth0 * Inv_L
6309  + model_.wvth0 * Inv_W
6310  + model_.pvth0 * Inv_LW;
6311  paramPtr->ua = model_.ua
6312  + model_.lua * Inv_L
6313  + model_.wua * Inv_W
6314  + model_.pua * Inv_LW;
6315  paramPtr->ua1 = model_.ua1
6316  + model_.lua1 * Inv_L
6317  + model_.wua1 * Inv_W
6318  + model_.pua1 * Inv_LW;
6319  paramPtr->ub = model_.ub
6320  + model_.lub * Inv_L
6321  + model_.wub * Inv_W
6322  + model_.pub * Inv_LW;
6323  paramPtr->ub1 = model_.ub1
6324  + model_.lub1 * Inv_L
6325  + model_.wub1 * Inv_W
6326  + model_.pub1 * Inv_LW;
6327  paramPtr->uc = model_.uc
6328  + model_.luc * Inv_L
6329  + model_.wuc * Inv_W
6330  + model_.puc * Inv_LW;
6331  paramPtr->uc1 = model_.uc1
6332  + model_.luc1 * Inv_L
6333  + model_.wuc1 * Inv_W
6334  + model_.puc1 * Inv_LW;
6335  paramPtr->ud = model_.ud
6336  + model_.lud * Inv_L
6337  + model_.wud * Inv_W
6338  + model_.pud * Inv_LW;
6339  paramPtr->ud1 = model_.ud1
6340  + model_.lud1 * Inv_L
6341  + model_.wud1 * Inv_W
6342  + model_.pud1 * Inv_LW;
6343  paramPtr->up = model_.up
6344  + model_.lup * Inv_L
6345  + model_.wup * Inv_W
6346  + model_.pup * Inv_LW;
6347  paramPtr->lp = model_.lp
6348  + model_.llp * Inv_L
6349  + model_.wlp * Inv_W
6350  + model_.plp * Inv_LW;
6351  paramPtr->eu = model_.eu
6352  + model_.leu * Inv_L
6353  + model_.weu * Inv_W
6354  + model_.peu * Inv_LW;
6355  paramPtr->u0 = model_.u0
6356  + model_.lu0 * Inv_L
6357  + model_.wu0 * Inv_W
6358  + model_.pu0 * Inv_LW;
6359  paramPtr->ute = model_.ute
6360  + model_.lute * Inv_L
6361  + model_.wute * Inv_W
6362  + model_.pute * Inv_LW;
6364  + model_.lvoff * Inv_L
6365  + model_.wvoff * Inv_W
6366  + model_.pvoff * Inv_LW;
6368  + model_.ltvoff * Inv_L
6369  + model_.wtvoff * Inv_W
6370  + model_.ptvoff * Inv_LW;
6372  + model_.lminv * Inv_L
6373  + model_.wminv * Inv_W
6374  + model_.pminv * Inv_LW;
6376  + model_.lminvcv * Inv_L
6377  + model_.wminvcv * Inv_W
6378  + model_.pminvcv * Inv_LW;
6380  + model_.lfprout * Inv_L
6381  + model_.wfprout * Inv_W
6382  + model_.pfprout * Inv_LW;
6384  + model_.lpdits * Inv_L
6385  + model_.wpdits * Inv_W
6386  + model_.ppdits * Inv_LW;
6388  + model_.lpditsd * Inv_L
6389  + model_.wpditsd * Inv_W
6390  + model_.ppditsd * Inv_LW;
6392  + model_.ldelta * Inv_L
6393  + model_.wdelta * Inv_W
6394  + model_.pdelta * Inv_LW;
6396  + model_.lrdsw * Inv_L
6397  + model_.wrdsw * Inv_W
6398  + model_.prdsw * Inv_LW;
6399  paramPtr->rdw = model_.rdw
6400  + model_.lrdw * Inv_L
6401  + model_.wrdw * Inv_W
6402  + model_.prdw * Inv_LW;
6403  paramPtr->rsw = model_.rsw
6404  + model_.lrsw * Inv_L
6405  + model_.wrsw * Inv_W
6406  + model_.prsw * Inv_LW;
6408  + model_.lprwg * Inv_L
6409  + model_.wprwg * Inv_W
6410  + model_.pprwg * Inv_LW;
6412  + model_.lprwb * Inv_L
6413  + model_.wprwb * Inv_W
6414  + model_.pprwb * Inv_LW;
6415  paramPtr->prt = model_.prt
6416  + model_.lprt * Inv_L
6417  + model_.wprt * Inv_W
6418  + model_.pprt * Inv_LW;
6420  + model_.leta0 * Inv_L
6421  + model_.weta0 * Inv_W
6422  + model_.peta0 * Inv_LW;
6424  + model_.letab * Inv_L
6425  + model_.wetab * Inv_W
6426  + model_.petab * Inv_LW;
6428  + model_.lpclm * Inv_L
6429  + model_.wpclm * Inv_W
6430  + model_.ppclm * Inv_LW;
6432  + model_.lpdibl1 * Inv_L
6433  + model_.wpdibl1 * Inv_W
6434  + model_.ppdibl1 * Inv_LW;
6436  + model_.lpdibl2 * Inv_L
6437  + model_.wpdibl2 * Inv_W
6438  + model_.ppdibl2 * Inv_LW;
6440  + model_.lpdiblb * Inv_L
6441  + model_.wpdiblb * Inv_W
6442  + model_.ppdiblb * Inv_LW;
6444  + model_.lpscbe1 * Inv_L
6445  + model_.wpscbe1 * Inv_W
6446  + model_.ppscbe1 * Inv_LW;
6448  + model_.lpscbe2 * Inv_L
6449  + model_.wpscbe2 * Inv_W
6450  + model_.ppscbe2 * Inv_LW;
6452  + model_.lpvag * Inv_L
6453  + model_.wpvag * Inv_W
6454  + model_.ppvag * Inv_LW;
6455  paramPtr->wr = model_.wr
6456  + model_.lwr * Inv_L
6457  + model_.wwr * Inv_W
6458  + model_.pwr * Inv_LW;
6459  paramPtr->dwg = model_.dwg
6460  + model_.ldwg * Inv_L
6461  + model_.wdwg * Inv_W
6462  + model_.pdwg * Inv_LW;
6463  paramPtr->dwb = model_.dwb
6464  + model_.ldwb * Inv_L
6465  + model_.wdwb * Inv_W
6466  + model_.pdwb * Inv_LW;
6467  paramPtr->b0 = model_.b0
6468  + model_.lb0 * Inv_L
6469  + model_.wb0 * Inv_W
6470  + model_.pb0 * Inv_LW;
6471  paramPtr->b1 = model_.b1
6472  + model_.lb1 * Inv_L
6473  + model_.wb1 * Inv_W
6474  + model_.pb1 * Inv_LW;
6476  + model_.lalpha0 * Inv_L
6477  + model_.walpha0 * Inv_W
6478  + model_.palpha0 * Inv_LW;
6480  + model_.lalpha1 * Inv_L
6481  + model_.walpha1 * Inv_W
6482  + model_.palpha1 * Inv_LW;
6484  + model_.lbeta0 * Inv_L
6485  + model_.wbeta0 * Inv_W
6486  + model_.pbeta0 * Inv_LW;
6488  + model_.lagidl * Inv_L
6489  + model_.wagidl * Inv_W
6490  + model_.pagidl * Inv_LW;
6492  + model_.lbgidl * Inv_L
6493  + model_.wbgidl * Inv_W
6494  + model_.pbgidl * Inv_LW;
6496  + model_.lcgidl * Inv_L
6497  + model_.wcgidl * Inv_W
6498  + model_.pcgidl * Inv_LW;
6500  + model_.legidl * Inv_L
6501  + model_.wegidl * Inv_W
6502  + model_.pegidl * Inv_LW;
6504  + model_.lagisl * Inv_L
6505  + model_.wagisl * Inv_W
6506  + model_.pagisl * Inv_LW;
6508  + model_.lbgisl * Inv_L
6509  + model_.wbgisl * Inv_W
6510  + model_.pbgisl * Inv_LW;
6512  + model_.lcgisl * Inv_L
6513  + model_.wcgisl * Inv_W
6514  + model_.pcgisl * Inv_LW;
6516  + model_.legisl * Inv_L
6517  + model_.wegisl * Inv_W
6518  + model_.pegisl * Inv_LW;
6520  + model_.laigc * Inv_L
6521  + model_.waigc * Inv_W
6522  + model_.paigc * Inv_LW;
6524  + model_.lbigc * Inv_L
6525  + model_.wbigc * Inv_W
6526  + model_.pbigc * Inv_LW;
6528  + model_.lcigc * Inv_L
6529  + model_.wcigc * Inv_W
6530  + model_.pcigc * Inv_LW;
6532  + model_.laigs * Inv_L
6533  + model_.waigs * Inv_W
6534  + model_.paigs * Inv_LW;
6536  + model_.lbigs * Inv_L
6537  + model_.wbigs * Inv_W
6538  + model_.pbigs * Inv_LW;
6540  + model_.lcigs * Inv_L
6541  + model_.wcigs * Inv_W
6542  + model_.pcigs * Inv_LW;
6544  + model_.laigd * Inv_L
6545  + model_.waigd * Inv_W
6546  + model_.paigd * Inv_LW;
6548  + model_.lbigd * Inv_L
6549  + model_.wbigd * Inv_W
6550  + model_.pbigd * Inv_LW;
6552  + model_.lcigd * Inv_L
6553  + model_.wcigd * Inv_W
6554  + model_.pcigd * Inv_LW;
6556  + model_.laigbacc * Inv_L
6557  + model_.waigbacc * Inv_W
6558  + model_.paigbacc * Inv_LW;
6560  + model_.lbigbacc * Inv_L
6561  + model_.wbigbacc * Inv_W
6562  + model_.pbigbacc * Inv_LW;
6564  + model_.lcigbacc * Inv_L
6565  + model_.wcigbacc * Inv_W
6566  + model_.pcigbacc * Inv_LW;
6568  + model_.laigbinv * Inv_L
6569  + model_.waigbinv * Inv_W
6570  + model_.paigbinv * Inv_LW;
6572  + model_.lbigbinv * Inv_L
6573  + model_.wbigbinv * Inv_W
6574  + model_.pbigbinv * Inv_LW;
6576  + model_.lcigbinv * Inv_L
6577  + model_.wcigbinv * Inv_W
6578  + model_.pcigbinv * Inv_LW;
6580  + model_.lnigc * Inv_L
6581  + model_.wnigc * Inv_W
6582  + model_.pnigc * Inv_LW;
6584  + model_.lnigbacc * Inv_L
6585  + model_.wnigbacc * Inv_W
6586  + model_.pnigbacc * Inv_LW;
6588  + model_.lnigbinv * Inv_L
6589  + model_.wnigbinv * Inv_W
6590  + model_.pnigbinv * Inv_LW;
6592  + model_.lntox * Inv_L
6593  + model_.wntox * Inv_W
6594  + model_.pntox * Inv_LW;
6596  + model_.leigbinv * Inv_L
6597  + model_.weigbinv * Inv_W
6598  + model_.peigbinv * Inv_LW;
6600  + model_.lpigcd * Inv_L
6601  + model_.wpigcd * Inv_W
6602  + model_.ppigcd * Inv_LW;
6604  + model_.lpoxedge * Inv_L
6605  + model_.wpoxedge * Inv_W
6606  + model_.ppoxedge * Inv_LW;
6608  + model_.lxrcrg1 * Inv_L
6609  + model_.wxrcrg1 * Inv_W
6610  + model_.pxrcrg1 * Inv_LW;
6612  + model_.lxrcrg2 * Inv_L
6613  + model_.wxrcrg2 * Inv_W
6614  + model_.pxrcrg2 * Inv_LW;
6616  + model_.llambda * Inv_L
6617  + model_.wlambda * Inv_W
6618  + model_.plambda * Inv_LW;
6619  paramPtr->vtl = model_.vtl
6620  + model_.lvtl * Inv_L
6621  + model_.wvtl * Inv_W
6622  + model_.pvtl * Inv_LW;
6623  paramPtr->xn = model_.xn
6624  + model_.lxn * Inv_L
6625  + model_.wxn * Inv_W
6626  + model_.pxn * Inv_LW;
6628  + model_.lvfbsdoff * Inv_L
6629  + model_.wvfbsdoff * Inv_W
6630  + model_.pvfbsdoff * Inv_LW;
6632  + model_.ltvfbsdoff * Inv_L
6633  + model_.wtvfbsdoff * Inv_W
6634  + model_.ptvfbsdoff * Inv_LW;
6635 
6637  + model_.lcgsl * Inv_L
6638  + model_.wcgsl * Inv_W
6639  + model_.pcgsl * Inv_LW;
6641  + model_.lcgdl * Inv_L
6642  + model_.wcgdl * Inv_W
6643  + model_.pcgdl * Inv_LW;
6645  + model_.lckappas * Inv_L
6646  + model_.wckappas * Inv_W
6647  + model_.pckappas * Inv_LW;
6649  + model_.lckappad * Inv_L
6650  + model_.wckappad * Inv_W
6651  + model_.pckappad * Inv_LW;
6652  paramPtr->cf = model_.cf
6653  + model_.lcf * Inv_L
6654  + model_.wcf * Inv_W
6655  + model_.pcf * Inv_LW;
6656  paramPtr->clc = model_.clc
6657  + model_.lclc * Inv_L
6658  + model_.wclc * Inv_W
6659  + model_.pclc * Inv_LW;
6660  paramPtr->cle = model_.cle
6661  + model_.lcle * Inv_L
6662  + model_.wcle * Inv_W
6663  + model_.pcle * Inv_LW;
6665  + model_.lvfbcv * Inv_L
6666  + model_.wvfbcv * Inv_W
6667  + model_.pvfbcv * Inv_LW;
6669  + model_.lacde * Inv_L
6670  + model_.wacde * Inv_W
6671  + model_.pacde * Inv_LW;
6673  + model_.lmoin * Inv_L
6674  + model_.wmoin * Inv_W
6675  + model_.pmoin * Inv_LW;
6677  + model_.lnoff * Inv_L
6678  + model_.wnoff * Inv_W
6679  + model_.pnoff * Inv_LW;
6681  + model_.lvoffcv * Inv_L
6682  + model_.wvoffcv * Inv_W
6683  + model_.pvoffcv * Inv_LW;
6685  + model_.lkvth0we * Inv_L
6686  + model_.wkvth0we * Inv_W
6687  + model_.pkvth0we * Inv_LW;
6689  + model_.lk2we * Inv_L
6690  + model_.wk2we * Inv_W
6691  + model_.pk2we * Inv_LW;
6693  + model_.lku0we * Inv_L
6694  + model_.wku0we * Inv_W
6695  + model_.pku0we * Inv_LW;
6696 
6697  paramPtr->abulkCVfactor = 1.0 + pow((paramPtr->clc / paramPtr->leffCV), paramPtr->cle);
6698 
6699  T0 = (TRatio - 1.0);
6700 
6701  PowWeffWr = pow(paramPtr->weffCJ * 1.0e6, paramPtr->wr) * nf;
6702 
6703  T1 = T2 = T3 = T4 = 0.0;
6704  if(model_.tempMod == 0)
6705  {
6706  paramPtr->ua = paramPtr->ua + paramPtr->ua1 * T0;
6707  paramPtr->ub = paramPtr->ub + paramPtr->ub1 * T0;
6708  paramPtr->uc = paramPtr->uc + paramPtr->uc1 * T0;
6709  paramPtr->ud = paramPtr->ud + paramPtr->ud1 * T0;
6711  T10 = paramPtr->prt * T0;
6712  if(model_.rdsMod)
6713  {
6714  // External Rd(V)
6715  T1 = paramPtr->rdw + T10;
6716  T2 = model_.rdwmin + T10;
6717  // External Rs(V)
6718  T3 = paramPtr->rsw + T10;
6719  T4 = model_.rswmin + T10;
6720  }
6721  // Internal Rds(V) in IV
6722  paramPtr->rds0 = (paramPtr->rdsw + T10) * nf / PowWeffWr;
6723  paramPtr->rdswmin = (model_.rdswmin + T10) * nf / PowWeffWr;
6724  }
6725  else
6726  { // tempMod = 1, 2
6727  paramPtr->ua = paramPtr->ua * (1.0 + paramPtr->ua1 * delTemp) ;
6728  paramPtr->ub = paramPtr->ub * (1.0 + paramPtr->ub1 * delTemp);
6729  paramPtr->uc = paramPtr->uc * (1.0 + paramPtr->uc1 * delTemp);
6730  paramPtr->ud = paramPtr->ud * (1.0 + paramPtr->ud1 * delTemp);
6731  paramPtr->vsattemp = paramPtr->vsat * (1.0 - paramPtr->at * delTemp);
6732  T10 = 1.0 + paramPtr->prt * delTemp;
6733  if(model_.rdsMod)
6734  {
6735  // External Rd(V)
6736  T1 = paramPtr->rdw * T10;
6737  T2 = model_.rdwmin * T10;
6738  // External Rs(V)
6739  T3 = paramPtr->rsw * T10;
6740  T4 = model_.rswmin * T10;
6741  }
6742  // Internal Rds(V) in IV
6743  paramPtr->rds0 = paramPtr->rdsw * T10 * nf / PowWeffWr;
6744  paramPtr->rdswmin = model_.rdswmin * T10 * nf / PowWeffWr;
6745  }
6746  if (T1 < 0.0)
6747  {
6748  T1 = 0.0;
6749  UserWarning(*this) << "Rdw at current temperature is negative; set to 0";
6750  }
6751  if (T2 < 0.0)
6752  {
6753  T2 = 0.0;
6754  UserWarning(*this) << "Rdwmin at current temperature is negative; set to 0";
6755  }
6756  paramPtr->rd0 = T1 / PowWeffWr;
6757  paramPtr->rdwmin = T2 / PowWeffWr;
6758  if (T3 < 0.0)
6759  {
6760  T3 = 0.0;
6761  UserWarning(*this) << "Rsw at current temperature is negative; set to 0";
6762  }
6763  if (T4 < 0.0)
6764  {
6765  T4 = 0.0;
6766  UserWarning(*this) << "Rswmin at current temperature is negative; set to 0";
6767  }
6768  paramPtr->rs0 = T3 / PowWeffWr;
6769  paramPtr->rswmin = T4 / PowWeffWr;
6770 
6771  if (paramPtr->u0 > 1.0)
6772  paramPtr->u0 = paramPtr->u0 / 1.0e4;
6773 
6774  // mobility channel length dependence
6775  T5 = 1.0 - paramPtr->up * exp( - paramPtr->leff / paramPtr->lp);
6776  paramPtr->u0temp = paramPtr->u0 * T5
6777  * pow(TRatio, paramPtr->ute);
6778  if (paramPtr->eu < 0.0)
6779  {
6780  paramPtr->eu = 0.0;
6781  UserWarning(*this) << "eu has been negative; reset to 0.0";
6782  }
6783 
6784  paramPtr->vfbsdoff = paramPtr->vfbsdoff * (1.0 + paramPtr->tvfbsdoff * delTemp);
6785  paramPtr->voff = paramPtr->voff * (1.0 + paramPtr->tvoff * delTemp);
6786 
6787  // Source End Velocity Limit
6788  if((model_.vtlGiven) && (model_.vtl > 0.0) )
6789  {
6790  if(model_.lc < 0.0) paramPtr->lc = 0.0;
6791  else paramPtr->lc = model_.lc ;
6792  T0 = paramPtr->leff / (paramPtr->xn * paramPtr->leff + paramPtr->lc);
6793  paramPtr->tfactor = (1.0 - T0) / (1.0 + T0 );
6794  }
6795 
6799 
6801  {
6802  T0 = paramPtr->gamma1 * model_.coxe;
6803  paramPtr->ndep = 3.01248e22 * T0 * T0;
6804  }
6805 
6806  paramPtr->phi = Vtm0 * log(paramPtr->ndep / ni) + paramPtr->phin + 0.4;
6807 
6808  paramPtr->sqrtPhi = sqrt(paramPtr->phi);
6810 
6811  paramPtr->Xdep0 = sqrt(2.0 * epssub / (Charge_q
6812  * paramPtr->ndep * 1.0e6))
6813  * paramPtr->sqrtPhi;
6814 
6815  paramPtr->sqrtXdep0 = sqrt(paramPtr->Xdep0);
6816 
6817  if (model_.mtrlMod == 0)
6818  {
6819  paramPtr->litl = sqrt(3.0 * paramPtr->xj * toxe);
6820  }
6821  else
6822  {
6823  paramPtr->litl = sqrt(model_.epsrsub/epsrox * paramPtr->xj * toxe);
6824  }
6825 
6826  paramPtr->vbi = Vtm0 * log(paramPtr->nsd * paramPtr->ndep / (ni * ni));
6827 
6828  if (model_.mtrlMod == 0)
6829  {
6830  if (paramPtr->ngate > 0.0)
6831  { paramPtr->vfbsd = Vtm0 * log(paramPtr->ngate
6832  / paramPtr->nsd);
6833  }
6834  else
6835  paramPtr->vfbsd = 0.0;
6836  }
6837  else
6838  {
6839  T0 = Vtm0 * log(paramPtr->nsd/ni);
6840  T1 = 0.5 * Eg0;
6841  if(T0 > T1)
6842  T0 = T1;
6843  T2 = model_.easub + T1 - model_.dtype * T0;
6844  paramPtr->vfbsd = model_.phig - T2;
6845  }
6846 
6847  paramPtr->cdep0 = sqrt(Charge_q * epssub
6848  * paramPtr->ndep * 1.0e6 / 2.0 / paramPtr->phi);
6849 
6850  paramPtr->ToxRatio = exp(paramPtr->ntox
6851  * log(model_.toxref / toxe))
6852  / toxe / toxe;
6853 
6855  * log(model_.toxref
6856  / (toxe * paramPtr->poxedge)))
6857  / toxe / toxe
6859 
6860  paramPtr->Aechvb = (model_.dtype == CONSTNMOS) ? 4.97232e-7 : 3.42537e-7;
6861  paramPtr->Bechvb = (model_.dtype == CONSTNMOS) ? 7.45669e11 : 1.16645e12;
6867  * model_.toxe * paramPtr->poxedge;
6869  * paramPtr->ToxRatio;
6870  paramPtr->Bechvb *= -toxe;
6871 
6872 
6873  paramPtr->mstar = 0.5 + atan(paramPtr->minv) / M_PI;
6874  paramPtr->mstarcv = 0.5 + atan(paramPtr->minvcv) / M_PI;
6877 
6878  paramPtr->ldeb = sqrt(epssub * Vtm0 / (Charge_q
6879  * paramPtr->ndep * 1.0e6)) / 3.0;
6880  paramPtr->acde *= pow((paramPtr->ndep / 2.0e16), -0.25);
6881 
6882 
6883  if (model_.k1Given || model_.k2Given)
6884  {
6885  if (!model_.k1Given)
6886  {
6887  UserWarning(*this) << "k1 should be specified with k2";
6888  paramPtr->k1 = 0.53;
6889  }
6890  if (!model_.k2Given)
6891  {
6892  UserWarning(*this) << "k2 should be specified with k1";
6893  paramPtr->k2 = -0.0186;
6894  }
6895  if (model_.nsubGiven)
6896  {
6897  UserWarning(*this) << "nsub is ignored because k1 or k2 is given";
6898  }
6899  if (model_.xtGiven)
6900  {
6901  UserWarning(*this) << "xt is ignored because k1 or k2 is given";
6902  }
6903  if (model_.vbxGiven)
6904  {
6905  UserWarning(*this) << "vbx is ignored because k1 or k2 is given";
6906  }
6907  if (model_.gamma1Given)
6908  {
6909  UserWarning(*this) << "gamma1 is ignored because k1 or k2 is given";
6910  }
6911  if (model_.gamma2Given)
6912  {
6913  UserWarning(*this) << "gamma2 is ignored because k1 or k2 is given";
6914  }
6915  }
6916  else
6917  {
6918  if (!model_.vbxGiven)
6919  paramPtr->vbx = paramPtr->phi - 7.7348e-4
6920  * paramPtr->ndep * paramPtr->xt * paramPtr->xt;
6921 
6922  if (paramPtr->vbx > 0.0)
6923  paramPtr->vbx = -paramPtr->vbx;
6924  if (paramPtr->vbm > 0.0)
6925  paramPtr->vbm = -paramPtr->vbm;
6926 
6927  if (!model_.gamma1Given)
6928  paramPtr->gamma1 = 5.753e-12
6929  * sqrt(paramPtr->ndep) / model_.coxe;
6930 
6931  if (!model_.gamma2Given)
6932  paramPtr->gamma2 = 5.753e-12
6933  * sqrt(paramPtr->nsub) / model_.coxe;
6934 
6936 
6937  T1 = sqrt(paramPtr->phi - paramPtr->vbx) - paramPtr->sqrtPhi;
6938 
6939  T2 = sqrt(paramPtr->phi * (paramPtr->phi - paramPtr->vbm)) - paramPtr->phi;
6940 
6941  paramPtr->k2 = T0 * T1 / (2.0 * T2 + paramPtr->vbm);
6942 
6943  paramPtr->k1 = paramPtr->gamma2 - 2.0
6944  * paramPtr->k2 * sqrt(paramPtr->phi - paramPtr->vbm);
6945  }
6946 
6947  if (!model_.vfbGiven)
6948  {
6949  if (model_.vth0Given)
6951  - paramPtr->phi - paramPtr->k1
6952  * paramPtr->sqrtPhi;
6953  }
6954  else
6955  {
6956  if ((model_.mtrlMod) && (model_.phigGiven) &&
6957  (model_.nsubGiven))
6958  {
6959  T0 = Vtm0 * log(paramPtr->nsub/ni);
6960  T1 = 0.5 * Eg0;
6961  if(T0 > T1)
6962  T0 = T1;
6963  T2 = model_.easub + T1 + model_.dtype * T0;
6964  paramPtr->vfb = model_.phig - T2;
6965  }
6966  else
6967  {
6968  paramPtr->vfb = -1.0;
6969  }
6970  }
6971  }
6972  if (!model_.vth0Given)
6973  {
6975  + paramPtr->phi + paramPtr->k1
6976  * paramPtr->sqrtPhi);
6977  }
6978 
6979  paramPtr->k1ox = paramPtr->k1 * toxe / model_.toxm;
6980 
6981  tmp = sqrt(epssub / (epsrox * CONSTEPS0)
6982  * toxe * paramPtr->Xdep0);
6983 
6984  T0 = paramPtr->dsub * paramPtr->leff / tmp;
6985  if (T0 < CONSTEXP_THRESHOLD)
6986  {
6987  T1 = exp(T0);
6988  T2 = T1 - 1.0;
6989  T3 = T2 * T2;
6990  T4 = T3 + 2.0 * T1 * CONSTMIN_EXP;
6991  paramPtr->theta0vb0 = T1 / T4;
6992  }
6993  else
6994  {
6995  paramPtr->theta0vb0 = 1.0 / (CONSTMAX_EXP - 2.0);
6996  }
6997 
6998  T0 = paramPtr->drout * paramPtr->leff / tmp;
6999  if (T0 < CONSTEXP_THRESHOLD)
7000  {
7001  T1 = exp(T0);
7002  T2 = T1 - 1.0;
7003  T3 = T2 * T2;
7004  T4 = T3 + 2.0 * T1 * CONSTMIN_EXP;
7005  T5 = T1 / T4;
7006  }
7007  else
7008  T5 = 1.0 / (CONSTMAX_EXP - 2.0); // 3.0 * CONSTMIN_EXP omitted
7009 
7011 
7012  tmp = sqrt(paramPtr->Xdep0);
7013  tmp1 = paramPtr->vbi - paramPtr->phi;
7014  tmp2 = model_.factor1 * tmp;
7015 
7016  T0 = paramPtr->dvt1w * paramPtr->weff * paramPtr->leff / tmp2;
7017 
7018  if (T0 < CONSTEXP_THRESHOLD)
7019  {
7020  T1 = exp(T0);
7021  T2 = T1 - 1.0;
7022  T3 = T2 * T2;
7023  T4 = T3 + 2.0 * T1 * CONSTMIN_EXP;
7024  T8 = T1 / T4;
7025  }
7026  else
7027  {
7028  T8 = 1.0 / (CONSTMAX_EXP - 2.0);
7029  }
7030 
7031  T0 = paramPtr->dvt0w * T8;
7032  T8 = T0 * tmp1;
7033 
7034  T0 = paramPtr->dvt1 * paramPtr->leff / tmp2;
7035  if (T0 < CONSTEXP_THRESHOLD)
7036  {
7037  T1 = exp(T0);
7038  T2 = T1 - 1.0;
7039  T3 = T2 * T2;
7040  T4 = T3 + 2.0 * T1 * CONSTMIN_EXP;
7041  T9 = T1 / T4;
7042  }
7043  else
7044  T9 = 1.0 / (CONSTMAX_EXP - 2.0);
7045  T9 = paramPtr->dvt0 * T9 * tmp1;
7046 
7047  T4 = toxe * paramPtr->phi
7048  / (paramPtr->weff + paramPtr->w0);
7049 
7050  T0 = sqrt(1.0 + paramPtr->lpe0 / paramPtr->leff);
7051  if((model_.tempMod == 1) || (model_.tempMod == 0))
7052  T3 = (paramPtr->kt1 + paramPtr->kt1l / paramPtr->leff)
7053  * (TRatio - 1.0);
7054  if(model_.tempMod == 2)
7055  T3 = - paramPtr->kt1 * (TRatio - 1.0);
7056 
7057  T5 = paramPtr->k1ox * (T0 - 1.0) * paramPtr->sqrtPhi + T3;
7058 
7060  = - T8 - T9 + paramPtr->k3 * T4 + T5 - paramPtr->phi - paramPtr->k1 * paramPtr->sqrtPhi;
7061 
7062  // stress effect
7063 
7064  wlod = model_.wlod;
7065  if (model_.wlod < 0.0)
7066  {
7067  UserWarning(*this) << "WLOD =is less than 0. 0.0 is used";
7068  wlod = 0.0;
7069  }
7070  T0 = pow(Lnew, model_.llodku0);
7071  W_tmp = Wnew + wlod;
7072  T1 = pow(W_tmp, model_.wlodku0);
7073  tmp1 = model_.lku0 / T0 + model_.wku0 / T1
7074  + model_.pku0 / (T0 * T1);
7075  paramPtr->ku0 = 1.0 + tmp1;
7076 
7077  T0 = pow(Lnew, model_.llodvth);
7078  T1 = pow(W_tmp, model_.wlodvth);
7079  tmp1 = model_.lkvth0 / T0 + model_.wkvth0 / T1
7080  + model_.pkvth0 / (T0 * T1);
7081  paramPtr->kvth0 = 1.0 + tmp1;
7083 
7084  T0 = (TRatio - 1.0);
7085  paramPtr->ku0temp = paramPtr->ku0 * (1.0 + model_.tku0 *T0) + DELTA;
7086 
7087  Inv_saref = 1.0/(model_.saref + 0.5*Ldrn);
7088  Inv_sbref = 1.0/(model_.sbref + 0.5*Ldrn);
7089  paramPtr->inv_od_ref = Inv_saref + Inv_sbref;
7091 
7092  } // End of size if-statement
7093 
7094  // stress effect
7095  if( (sa > 0.0) && (sb > 0.0) &&
7096  ((nf == 1.0) || ((nf > 1.0) && (sd > 0.0))) )
7097  {
7098  Inv_sa = 0;
7099  Inv_sb = 0;
7100 
7101  kvsat = model_.kvsat;
7102  if (model_.kvsat < -1.0 )
7103  {
7104  UserWarning(*this) << "KVSAT is too small; -1.0 is used";
7105  kvsat = -1.0;
7106  }
7107  if (model_.kvsat > 1.0)
7108  {
7109  UserWarning(*this) << "KVSAT is too big; 1.0 is used";
7110  kvsat = 1.0;
7111  }
7112 
7113  int i=0;
7114  for(i = 0; i < nf; i++)
7115  {
7116  T0 = 1.0 / nf / (sa + 0.5*Ldrn + i * (sd +Ldrn));
7117  T1 = 1.0 / nf / (sb + 0.5*Ldrn + i * (sd +Ldrn));
7118  Inv_sa += T0;
7119  Inv_sb += T1;
7120  }
7121  Inv_ODeff = Inv_sa + Inv_sb;
7122  rho = model_.ku0 / paramPtr->ku0temp * Inv_ODeff;
7123  T0 = (1.0 + rho)/(1.0 + paramPtr->rho_ref);
7124  u0temp = paramPtr->u0temp * T0;
7125 
7126  T1 = (1.0 + kvsat * rho)/(1.0 + kvsat * paramPtr->rho_ref);
7127  vsattemp = paramPtr->vsattemp * T1;
7128 
7129  OD_offset = Inv_ODeff - paramPtr->inv_od_ref;
7130  dvth0_lod = model_.kvth0 / paramPtr->kvth0 * OD_offset;
7131  dk2_lod = model_.stk2 / pow(paramPtr->kvth0, model_.lodk2) *
7132  OD_offset;
7133  deta0_lod = model_.steta0 / pow(paramPtr->kvth0, model_.lodeta0) *
7134  OD_offset;
7135  vth0 = paramPtr->vth0 + dvth0_lod;
7136 
7137  eta0 = paramPtr->eta0 + deta0_lod;
7138  k2 = paramPtr->k2 + dk2_lod;
7139  }
7140  else
7141  {
7142  u0temp = paramPtr->u0temp;
7143  vth0 = paramPtr->vth0;
7145  eta0 = paramPtr->eta0;
7146  k2 = paramPtr->k2;
7147  }
7148 
7149  // Well Proximity Effect
7150  if (model_.wpemod)
7151  {
7152  if( (!scaGiven) && (!scbGiven) && (!sccGiven) )
7153  {
7154  if((scGiven) && (sc > 0.0) )
7155  {
7156  T1 = sc + Wdrn;
7157  T2 = 1.0 / model_.scref;
7158  sca = model_.scref * model_.scref / (sc * T1);
7159  scb = ( (0.1 * sc + 0.01 * model_.scref)
7160  * exp(-10.0 * sc * T2)
7161  - (0.1 * T1 + 0.01 * model_.scref)
7162  * exp(-10.0 * T1 * T2) ) / Wdrn;
7163  scc = ( (0.05 * sc + 0.0025 * model_.scref)
7164  * exp(-20.0 * sc * T2)
7165  - (0.05 * T1 + 0.0025 * model_.scref)
7166  * exp(-20.0 * T1 * T2) ) / Wdrn;
7167  }
7168  else
7169  {
7170  UserWarning(*this) << "No WPE as none of SCA, SCB, SCC, SC is given and/or SC not positive";
7171  }
7172  }
7173  sceff = sca + model_.web * scb
7174  + model_.wec * scc;
7175  vth0 += paramPtr->kvth0we * sceff;
7176  k2 += paramPtr->k2we * sceff;
7177  T3 = 1.0 + paramPtr->ku0we * sceff;
7178  if (T3 <= 0.0)
7179  {
7180  T3 = 0.0;
7181  UserWarning(*this) << "ku0we = %g is negatively too high. Negative mobility!";
7182  }
7183  u0temp *= T3;
7184  }
7185 
7186  // adding delvto
7187  vth0 += delvto;
7188  vfb = paramPtr->vfb + model_.dtype * delvto;
7189 
7190  // Instance variables calculation
7191  T3 = model_.dtype * vth0
7192  - vfb - paramPtr->phi;
7193  T4 = T3 + T3;
7194  T5 = 2.5 * T3;
7195  vtfbphi1 = (model_.dtype == CONSTNMOS) ? T4 : T5;
7196  if (vtfbphi1 < 0.0)
7197  vtfbphi1 = 0.0;
7198 
7199  vtfbphi2 = 4.0 * T3;
7200  if (vtfbphi2 < 0.0)
7201  vtfbphi2 = 0.0;
7202 
7203  if (k2 < 0.0)
7204  {
7205  T0 = 0.5 * paramPtr->k1 / k2;
7206  vbsc = 0.9 * (paramPtr->phi - T0 * T0);
7207  if (vbsc > -3.0)
7208  vbsc = -3.0;
7209  else if (vbsc < -30.0)
7210  vbsc = -30.0;
7211  }
7212  else
7213  vbsc = -30.0;
7214  if (vbsc > paramPtr->vbm)
7215  vbsc = paramPtr->vbm;
7216  k2ox = k2 * toxe
7217  / model_.toxm;
7218 
7220  + model_.dtype * vth0 ;
7221 
7222  cgso = paramPtr->cgso;
7223  cgdo = paramPtr->cgdo;
7224 
7225  lnl = log(paramPtr->leff * 1.0e6);
7226  lnw = log(paramPtr->weff * 1.0e6);
7227  lnnf = log(nf);
7228 
7229  bodymode = 5;
7230  if( ( !model_.rbps0Given) || ( !model_.rbpd0Given) )
7231  bodymode = 1;
7232  else
7233  if( (!model_.rbsbx0Given && !model_.rbsby0Given) ||
7235  bodymode = 3;
7236 
7237  if(rbodyMod == 2)
7238  {
7239  if (bodymode == 5)
7240  {
7241  rbsbx = exp( log(model_.rbsbx0) + model_.rbsdbxl * lnl +
7242  model_.rbsdbxw * lnw + model_.rbsdbxnf * lnnf );
7243  rbsby = exp( log(model_.rbsby0) + model_.rbsdbyl * lnl +
7244  model_.rbsdbyw * lnw + model_.rbsdbynf * lnnf );
7245  rbsb = rbsbx * rbsby / (rbsbx + rbsby);
7246 
7247 
7248  rbdbx = exp( log(model_.rbdbx0) + model_.rbsdbxl * lnl +
7249  model_.rbsdbxw * lnw + model_.rbsdbxnf * lnnf );
7250  rbdby = exp( log(model_.rbdby0) + model_.rbsdbyl * lnl +
7251  model_.rbsdbyw * lnw + model_.rbsdbynf * lnnf );
7252  rbdb = rbdbx * rbdby / (rbdbx + rbdby);
7253  }
7254 
7255  if ((bodymode == 3)|| (bodymode == 5))
7256  {
7257  rbps = exp( log(model_.rbps0) + model_.rbpsl * lnl +
7258  model_.rbpsw * lnw + model_.rbpsnf * lnnf );
7259  rbpd = exp( log(model_.rbpd0) + model_.rbpdl * lnl +
7260  model_.rbpdw * lnw + model_.rbpdnf * lnnf );
7261  }
7262 
7263  rbpbx = exp( log(model_.rbpbx0) + model_.rbpbxl * lnl +
7264  model_.rbpbxw * lnw + model_.rbpbxnf * lnnf );
7265  rbpby = exp( log(model_.rbpby0) + model_.rbpbyl * lnl +
7266  model_.rbpbyw * lnw + model_.rbpbynf * lnnf );
7267  rbpb = rbpbx*rbpby/(rbpbx + rbpby);
7268  }
7269 
7270 
7271  if ((rbodyMod == 1 ) || ((rbodyMod == 2 ) && (bodymode == 5)) )
7272  {
7273  if (rbdb < 1.0e-3) grbdb = 1.0e3; // in mho
7274  else grbdb = model_.gbmin + 1.0 / rbdb;
7275 
7276  if (rbpb < 1.0e-3) grbpb = 1.0e3;
7277  else grbpb = model_.gbmin + 1.0 / rbpb;
7278 
7279  if (rbps < 1.0e-3) grbps = 1.0e3;
7280  else grbps = model_.gbmin + 1.0 / rbps;
7281 
7282  if (rbsb < 1.0e-3) grbsb = 1.0e3;
7283  else grbsb = model_.gbmin + 1.0 / rbsb;
7284 
7285  if (rbpd < 1.0e-3) grbpd = 1.0e3;
7286  else grbpd = model_.gbmin + 1.0 / rbpd;
7287 
7288  }
7289 
7290  if((rbodyMod == 2) && (bodymode == 3))
7291  {
7292  grbdb = grbsb = model_.gbmin;
7293 
7294  if (rbpb < 1.0e-3) grbpb = 1.0e3;
7295  else grbpb = model_.gbmin + 1.0 / rbpb;
7296 
7297  if (rbps < 1.0e-3) grbps = 1.0e3;
7298  else grbps = model_.gbmin + 1.0 / rbps;
7299 
7300  if (rbpd < 1.0e-3) grbpd = 1.0e3;
7301  else grbpd = model_.gbmin + 1.0 / rbpd;
7302  }
7303 
7304  if((rbodyMod == 2) && (bodymode == 1))
7305  {
7306  grbdb = grbsb = model_.gbmin;
7307  grbps = grbpd = 1.0e3;
7308  if (rbpb < 1.0e-3)
7309  {
7310  grbpb = 1.0e3;
7311  }
7312  else
7313  {
7314  grbpb = model_.gbmin + 1.0 / rbpb;
7315  }
7316  }
7317 
7318  // Process geomertry dependent parasitics
7319  grgeltd = model_.rshg * (xgw
7320  + paramPtr->weffCJ / 3.0 / ngcon) /
7321  (ngcon * nf * (Lnew - model_.xgl));
7322 
7323  if (grgeltd > 0.0)
7324  {
7325  grgeltd = 1.0 / grgeltd;
7326  }
7327  else
7328  {
7329  grgeltd = 1.0e3; // mho
7330  if (rgateMod != 0)
7331  {
7332  UserWarning(*this) << "The gate conductance reset to 1.0e3 mho";
7333  }
7334  }
7335 
7337  DMCIeff = model_.dmci;
7339 
7341  {
7342  if (model_.perMod == 0)
7344  else
7346  }
7347  else
7348  {
7349  PAeffGeo(nf, geoMod, min,
7351  (Pseff), dumPd, dumAs, dumAd);
7352  }
7353 
7354  if (drainPerimeterGiven)
7355  {
7356  if (model_.perMod == 0)
7358  else
7360  }
7361  else
7362  {
7363  PAeffGeo(nf, geoMod, min,
7365  dumPs, (Pdeff), dumAs, dumAd);
7366  }
7367 
7368  if (sourceAreaGiven)
7369  Aseff = sourceArea;
7370  else
7371  PAeffGeo(nf, geoMod, min,
7373  dumPs, dumPd, (Aseff), dumAd);
7374 
7375  if (drainAreaGiven)
7376  Adeff = drainArea;
7377  else
7378  PAeffGeo(nf, geoMod, min,
7380  dumPs, dumPd, dumAs, (Adeff));
7381 
7382  // Processing S/D resistance and conductance below
7384  {
7385  sourceConductance = 0.0;
7386  if(sourceSquaresGiven)
7387  {
7389  }
7390  else if (rgeoMod > 0)
7391  {
7392  RdseffGeo(nf, geoMod,
7393  rgeoMod, min,
7396  }
7397  else
7398  {
7399  sourceConductance = 0.0;
7400  }
7401 
7402  if (sourceConductance > 0.0)
7403  {
7405  }
7406  else
7407  {
7408  sourceConductance = 1.0e3; // mho
7409  UserWarning(*this) << "Source conductance reset to 1.0e3 mho";
7410  }
7411  }
7412  else
7413  {
7414  sourceConductance = 0.0;
7415  }
7416 
7418  {
7419  drainConductance = 0.0;
7420  if(drainSquaresGiven)
7421  {
7423  }
7424  else if (rgeoMod > 0)
7425  {
7429  }
7430  else
7431  {
7432  drainConductance = 0.0;
7433  }
7434 
7435  if (drainConductance > 0.0)
7436  {
7438  }
7439  else
7440  {
7441  drainConductance = 1.0e3; // mho
7442  UserWarning(*this) << "Drain conductance reset to 1.0e3 mho";
7443  }
7444  }
7445  else
7446  {
7447  drainConductance = 0.0;
7448  }
7449 
7450  // End of Rsd processing
7451 
7452  Nvtms = model_.vtm * model_.SjctEmissionCoeff;
7453  if ((Aseff <= 0.0) && (Pseff <= 0.0))
7454  {
7455  SourceSatCurrent = 1.0e-14;
7456  }
7457  else
7458  {
7459  SourceSatCurrent = Aseff * model_.SjctTempSatCurDensity
7461  + paramPtr->weffCJ * nf
7463  }
7464 
7465  if (SourceSatCurrent > 0.0)
7466  {
7467  switch(model_.dioMod)
7468  {
7469  case 0:
7470  if ((model_.bvs / Nvtms) > CONSTEXP_THRESHOLD)
7472  else
7473  XExpBVS = model_.xjbvs * exp(-model_.bvs / Nvtms);
7474  break;
7475  case 1:
7476  DioIjthVjmEval(Nvtms, model_.ijthsfwd, SourceSatCurrent,
7477  0.0, (vjsmFwd));
7478  IVjsmFwd = SourceSatCurrent * exp(vjsmFwd / Nvtms);
7479  break;
7480  case 2:
7481  if ((model_.bvs / Nvtms) > CONSTEXP_THRESHOLD)
7482  {
7484  tmp = CONSTMIN_EXP;
7485  }
7486  else
7487  {
7488  XExpBVS = exp(-model_.bvs / Nvtms);
7489  tmp = XExpBVS;
7490  XExpBVS *= model_.xjbvs;
7491  }
7492 
7493  DioIjthVjmEval(Nvtms, model_.ijthsfwd, SourceSatCurrent,
7494  XExpBVS, (vjsmFwd));
7495  T0 = exp(vjsmFwd / Nvtms);
7496  IVjsmFwd = SourceSatCurrent * (T0 - XExpBVS / T0
7497  + XExpBVS - 1.0);
7498  SslpFwd = SourceSatCurrent
7499  * (T0 + XExpBVS / T0) / Nvtms;
7500 
7501  T2 = model_.ijthsrev / SourceSatCurrent;
7502  if (T2 < 1.0)
7503  {
7504  T2 = 10.0;
7505  UserWarning(*this) << "ijthsrev too small and set to 10 times IsbSat";
7506  }
7507  vjsmRev = -model_.bvs
7508  - Nvtms * log((T2 - 1.0) / model_.xjbvs);
7509  T1 = model_.xjbvs * exp(-(model_.bvs
7510  + vjsmRev) / Nvtms);
7511  IVjsmRev = SourceSatCurrent * (1.0 + T1);
7512  SslpRev = -SourceSatCurrent * T1 / Nvtms;
7513  break;
7514  default:
7515  UserError(*this) << "Specified dioMod not matched. dioMod = " << model_.dioMod;
7516  }
7517  }
7518 
7519  Nvtmd = model_.vtm * model_.DjctEmissionCoeff;
7520  if ((Adeff <= 0.0) && (Pdeff <= 0.0))
7521  {
7522  DrainSatCurrent = 1.0e-14;
7523  }
7524  else
7525  {
7526  DrainSatCurrent = Adeff * model_.DjctTempSatCurDensity
7528  + paramPtr->weffCJ * nf
7530  }
7531 
7532  if (DrainSatCurrent > 0.0)
7533  {
7534  switch(model_.dioMod)
7535  {
7536  case 0:
7537  if ((model_.bvd / Nvtmd) > CONSTEXP_THRESHOLD)
7539  else
7540  XExpBVD = model_.xjbvd * exp(-model_.bvd / Nvtmd);
7541  break;
7542  case 1:
7543  DioIjthVjmEval(Nvtmd, model_.ijthdfwd, DrainSatCurrent,
7544  0.0, (vjdmFwd));
7545  IVjdmFwd = DrainSatCurrent * exp(vjdmFwd / Nvtmd);
7546  break;
7547  case 2:
7548  if ((model_.bvd / Nvtmd) > CONSTEXP_THRESHOLD)
7550  tmp = CONSTMIN_EXP;
7551  }
7552  else
7553  { XExpBVD = exp(-model_.bvd / Nvtmd);
7554  tmp = XExpBVD;
7555  XExpBVD *= model_.xjbvd;
7556  }
7557 
7558  DioIjthVjmEval(Nvtmd, model_.ijthdfwd, DrainSatCurrent,
7559  XExpBVD, (vjdmFwd));
7560  T0 = exp(vjdmFwd / Nvtmd);
7561  IVjdmFwd = DrainSatCurrent * (T0 - XExpBVD / T0 + XExpBVD - 1.0);
7562  DslpFwd = DrainSatCurrent * (T0 + XExpBVD / T0) / Nvtmd;
7563 
7564  T2 = model_.ijthdrev / DrainSatCurrent;
7565  if (T2 < 1.0)
7566  {
7567  T2 = 10.0;
7568  UserWarning(*this) << "ijthdrev too small and set to 10 times IdbSat";
7569  }
7570  vjdmRev = -model_.bvd
7571  - Nvtmd * log((T2 - 1.0) / model_.xjbvd); // bugfix
7572  T1 = model_.xjbvd * exp(-(model_.bvd
7573  + vjdmRev) / Nvtmd);
7574  IVjdmRev = DrainSatCurrent * (1.0 + T1);
7575  DslpRev = -DrainSatCurrent * T1 / Nvtmd;
7576  break;
7577  default:
7578  UserError(*this) << "Specified dioMod not matched. dioMod = " << model_.dioMod;
7579  }
7580  }
7581 
7582  // GEDL current reverse bias
7583  T0 = (TRatio - 1.0);
7584  model_.njtsstemp = model_.njts * (1.0 + model_.tnjts * T0);
7587  model_.njtsdtemp = model_.njtsd * (1.0 + model_.tnjtsd * T0);
7590 
7591  T7 = Eg0 / model_.vtm * T0;
7592 
7593  T9 = model_.xtss * T7;
7594  DEXP2(T9, T1);
7595  T9 = model_.xtsd * T7;
7596  DEXP2(T9, T2);
7597  T9 = model_.xtssws * T7;
7598  DEXP2(T9, T3);
7599  T9 = model_.xtsswd * T7;
7600  DEXP2(T9, T4);
7601  T9 = model_.xtsswgs * T7;
7602  DEXP2(T9, T5);
7603  T9 = model_.xtsswgd * T7;
7604  DEXP2(T9, T6);
7605 
7606  T10 = paramPtr->weffCJ * nf;
7611  SswgTempRevSatCur = T5 * T10 * model_.jtsswgs;
7612  DswgTempRevSatCur = T6 * T10 * model_.jtsswgd;
7613 
7614  if(model_.mtrlMod)
7615  {
7616  /* Calculate TOXP from EOT */
7617 
7618  /* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */
7619  tmp2 = vfb + paramPtr->phi;
7620  vddeot = model_.dtype * model_.vddeot;
7622  if ((paramPtr->ngate > 1.0e18) && (paramPtr->ngate < 1.0e25)
7623  && (vddeot > tmp2) && (T0!=0))
7624  {
7625  T1 = 1.0e6 * CONSTQ * T0 * paramPtr->ngate /
7626  (model_.coxe * model_.coxe);
7627  T8 = vddeot - tmp2;
7628  T4 = sqrt(1.0 + 2.0 * T8 / T1);
7629  T2 = 2.0 * T8 / (T4 + 1.0);
7630  T3 = 0.5 * T2 * T2 / T1;
7631  T7 = 1.12 - T3 - 0.05;
7632  T6 = sqrt(T7 * T7 + 0.224);
7633  T5 = 1.12 - 0.5 * (T7 + T6);
7634  Vgs_eff = vddeot - T5;
7635  }
7636  else
7637  Vgs_eff = vddeot;
7638 
7639  /* Calculate Vth @ Vds=Vbs=0 */
7640  V0 = paramPtr->vbi - paramPtr->phi;
7641  lt1 = model_.factor1* paramPtr->sqrtXdep0;
7642  ltw = lt1;
7643  T0 = paramPtr->dvt1 * paramPtr->leff / lt1;
7644  if (T0 < CONSTEXP_THRESHOLD)
7645  {
7646  T1 = exp(T0);
7647  T2 = T1 - 1.0;
7648  T3 = T2 * T2;
7649  T4 = T3 + 2.0 * T1 * CONSTMIN_EXP;
7650  Theta0 = T1 / T4;
7651  }
7652  else
7653  Theta0 = 1.0 / (CONSTMAX_EXP - 2.0);
7654  Delt_vth = paramPtr->dvt0 * Theta0 * V0;
7655  T0 = paramPtr->dvt1w * paramPtr->weff * paramPtr->leff / ltw;
7656  if (T0 < CONSTEXP_THRESHOLD)
7657  { T1 = exp(T0);
7658  T2 = T1 - 1.0;
7659  T3 = T2 * T2;
7660  T4 = T3 + 2.0 * T1 * CONSTMIN_EXP;
7661  T5 = T1 / T4;
7662  }
7663  else
7664  T5 = 1.0 / (CONSTMAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */
7665  T2 = paramPtr->dvt0w * T5 * V0;
7666  TempRatio = temp / model_.tnom - 1.0;
7667  T0 = sqrt(1.0 + paramPtr->lpe0 / paramPtr->leff);
7668  T1 = paramPtr->k1ox * (T0 - 1.0) * paramPtr->sqrtPhi
7669  + (paramPtr->kt1 + paramPtr->kt1l / paramPtr->leff) * TempRatio;
7670  Vth_NarrowW = toxe * paramPtr->phi
7671  / (paramPtr->weff + paramPtr->w0);
7672  Lpe_Vb = sqrt(1.0 + paramPtr->lpeb / paramPtr->leff);
7673  Vth = model_.dtype * vth0 +
7674  (paramPtr->k1ox - paramPtr->k1)*paramPtr->sqrtPhi*Lpe_Vb
7675  - Delt_vth - T2 + paramPtr->k3 * Vth_NarrowW + T1;
7676 
7677  /* Calculate n */
7678  tmp1 = epssub / paramPtr->Xdep0;
7679  nstar = model_.vtm / Charge_q *
7680  (model_.coxe + tmp1 + paramPtr->cit);
7681  tmp2 = paramPtr->nfactor * tmp1;
7682  tmp3 = (tmp2 + paramPtr->cdsc * Theta0 + paramPtr->cit) / model_.coxe;
7683  if (tmp3 >= -0.5)
7684  n = 1.0 + tmp3;
7685  else
7686  {
7687  T0 = 1.0 / (3.0 + 8.0 * tmp3);
7688  n = (1.0 + 3.0 * tmp3) * T0;
7689  }
7690 
7691  /* Vth correction for Pocket implant */
7692  if (paramPtr->dvtp0 > 0.0)
7693  {
7694  T3 = paramPtr->leff + paramPtr->dvtp0 * 2.0;
7695  if (model_.tempMod < 2)
7696  T4 = model_.vtm * log(paramPtr->leff / T3);
7697  else
7698  T4 = model_.vtm0 * log(paramPtr->leff / T3);
7699  Vth -= n * T4;
7700  }
7701  Vgsteff = Vgs_eff-Vth;
7702  /* calculating Toxp */
7703  niter = 0;
7704  toxpf = toxe;
7705  do
7706  {
7707  toxpi = toxpf;
7708  tmp2 = 2.0e8 * toxpf;
7709  T0 = (Vgsteff + vtfbphi2) / tmp2;
7710  T1 = 1.0 + exp(model_.bdos * 0.7 * log(T0));
7711  Tcen = model_.ados * 1.9e-9 / T1;
7712  toxpf = toxe - epsrox/model_.epsrsub * Tcen;
7713  niter++;
7714  } while ((niter<=4)&&(fabs(toxpf-toxpi)>1e-12));
7715  model_.toxp = toxpf;
7716  model_.coxp = epsrox * CONSTEPS0 / model_.toxp;
7717  }
7718 
7719 #if 0
7720  if (checkModel(model, here, ckt))
7721  { IFuid namarray[2];
7722  namarray[0] = model_.name;
7723  namarray[1] = name;
7724  (*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during .5.0 parameter checking for %s in model %s", namarray);
7725  return(E_BADPARM);
7726  }
7727 #endif
7728 
7729  ///////////////////////////////////////////////////////////////////////////////
7730 
7731  updateTemperatureCalled_ = true;
7732 
7733  return bsuccess;
7734 }
7735 
7736 //-----------------------------------------------------------------------------
7737 // Function : Instance::updateIntermediateVars
7738 // Purpose :
7739 // Special Notes :
7740 // Scope : public
7741 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
7742 // Creation Date : 11/25/06
7743 //-----------------------------------------------------------------------------
7745 {
7746  bool bsuccess = true;
7747 
7748  // begin the b4ld.c parameters:
7749  double dgstot_dvd(0.0), dgstot_dvg(0.0), dgstot_dvs(0.0), dgstot_dvb(0.0);
7750  double dgdtot_dvd(0.0), dgdtot_dvg(0.0), dgdtot_dvs(0.0), dgdtot_dvb(0.0);
7751  double Rs(0.0), Rd(0.0);
7752  double dRs_dvg(0.0), dRd_dvg(0.0), dRs_dvb(0.0), dRd_dvb(0.0);
7753  double dT0_dvg(0.0), dT1_dvb(0.0), dT3_dvg(0.0), dT3_dvb(0.0);
7754 
7755  double vgd_old(0.0), vsbd_old(0.0), vsbd(0.0);
7756  double SourceSatCurrent(0.0), DrainSatCurrent(0.0);
7757  double VgstNVt(0.0), ExpVgst(0.0);
7758  double czbd(0.0), czbdsw(0.0), czbdswg(0.0),
7759  czbs(0.0), czbssw(0.0), czbsswg(0.0);
7760  double evbd(0.0), evbs(0.0), arg(0.0), sarg(0.0);
7761  double Vfbeff(0.0), dVfbeff_dVg(0.0), dVfbeff_dVb(0.0), V3(0.0), V4(0.0);
7762  double MJD(0.0), MJSWD(0.0), MJSWGD(0.0);
7763  double MJS(0.0), MJSWS(0.0), MJSWGS(0.0);
7764  double Ggidld(0.0), Ggidlg(0.0), Ggidlb(0.0);
7765  double Voxacc(0.0), dVoxacc_dVg(0.0), dVoxacc_dVb(0.0);
7766  double Voxdepinv(0.0);
7767  double dVoxdepinv_dVg(0.0), dVoxdepinv_dVd(0.0), dVoxdepinv_dVb(0.0);
7768  double VxNVt(0.0), ExpVxNVt(0.0);
7769  double Vaux(0.0), dVaux_dVg(0.0), dVaux_dVd(0.0), dVaux_dVb(0.0);
7770  double Igc(0.0), dIgc_dVg(0.0), dIgc_dVd(0.0), dIgc_dVb(0.0);
7771  double dIgcs_dVg(0.0), dIgcs_dVd(0.0), dIgcs_dVb(0.0);
7772  double dIgcd_dVg(0.0), dIgcd_dVd(0.0), dIgcd_dVb(0.0);
7773  double dIgs_dVg(0.0), dIgs_dVs(0.0), dIgd_dVg(0.0), dIgd_dVd(0.0);
7774  double Igbacc(0.0), dIgbacc_dVg(0.0);
7775  double dIgbacc_dVb(0.0);
7776  double Igbinv(0.0), dIgbinv_dVg(0.0), dIgbinv_dVd(0.0), dIgbinv_dVb(0.0);
7777  double Pigcd(0.0), dPigcd_dVg(0.0), dPigcd_dVd(0.0), dPigcd_dVb(0.0);
7778 
7779  double Vgs_eff(0.0), Vfb(0.0);
7780  double Vth_NarrowW(0.0);
7781  double Phis(0.0), dPhis_dVb(0.0), sqrtPhis(0.0), dsqrtPhis_dVb(0.0);
7782  double Vth(0.0), dVth_dVb(0.0), dVth_dVd(0.0);
7783  double Vgst(0.0), dVgst_dVg(0.0), dVgst_dVb(0.0), dVgs_eff_dVg(0.0);
7784  double Nvtms(0.0), Nvtmd(0.0);
7785  double Vtm(0.0), Vtm0(0.0);
7786  double n(0.0), dn_dVb(0.0), dn_dVd(0.0), voffcv (0.0);
7787  double noff(0.0), dnoff_dVd(0.0), dnoff_dVb(0.0);
7788  double CoxWLcen(0.0), QovCox(0.0), LINK(0.0), V0(0.0);
7789  double DeltaPhi(0.0), dDeltaPhi_dVg(0.0), VgDP(0.0), dVgDP_dVg(0.0);
7790  double Cox(0.0), Tox(0.0);
7791  double Tcen(0.0), dTcen_dVg(0.0), dTcen_dVd(0.0), dTcen_dVb(0.0);
7792  double Ccen(0.0);
7793  double Coxeff(0.0), dCoxeff_dVd(0.0), dCoxeff_dVg(0.0), dCoxeff_dVb(0.0);
7794  double Denomi(0.0), dDenomi_dVg(0.0), dDenomi_dVd(0.0), dDenomi_dVb(0.0);
7795  double dueff_dVg(0.0), dueff_dVd(0.0), dueff_dVb(0.0);
7796  double Esat(0.0);
7797  double Vdsat(0.0);
7798  double dEsatL_dVg(0.0), dEsatL_dVd(0.0), dEsatL_dVb(0.0);
7799  double dVdsat_dVg(0.0), dVdsat_dVb(0.0);
7800  double dVdsat_dVd(0.0), Vasat(0.0), dAlphaz_dVg(0.0), dAlphaz_dVb(0.0);
7801  double dVasat_dVg(0.0), dVasat_dVb(0.0);
7802  double dVasat_dVd(0.0), Va(0.0), dVa_dVd(0.0), dVa_dVg(0.0), dVa_dVb(0.0);
7803  double Vbseff(0.0), dVbseff_dVb(0.0), VbseffCV(0.0), dVbseffCV_dVb(0.0);
7804  double Arg1(0.0), One_Third_CoxWL(0.0), Two_Third_CoxWL(0.0), Alphaz(0.0);
7805 
7806  double T0,dT0_dVg(0.0), dT0_dVd(0.0), dT0_dVb(0.0);
7807  double T1,dT1_dVg(0.0), dT1_dVd(0.0), dT1_dVb(0.0);
7808 
7809  double T2(0.0), dT2_dVg(0.0), dT2_dVd(0.0), dT2_dVb(0.0);
7810  double T3(0.0), dT3_dVg(0.0), dT3_dVd(0.0), dT3_dVb(0.0);
7811  double T4(0.0), dT4_dVd(0.0), dT4_dVb(0.0);
7812  double T5(0.0), dT5_dVg(0.0), dT5_dVd(0.0), dT5_dVb(0.0);
7813  double T6(0.0), dT6_dVg(0.0), dT6_dVd(0.0), dT6_dVb(0.0);
7814  double T7(0.0), dT7_dVg(0.0), dT7_dVd(0.0), dT7_dVb(0.0);
7815  double T8(0.0), dT8_dVg(0.0), dT8_dVd(0.0), dT8_dVb(0.0);
7816  double T9(0.0), dT9_dVg(0.0), dT9_dVd(0.0), dT9_dVb(0.0);
7817  double T10(0.0), dT10_dVg(0.0), dT10_dVb(0.0), dT10_dVd(0.0);
7818  double T11(0.0), T12(0.0), T13(0.0), T14(0.0);
7819  double tmp(0.0);
7820  double dAbulk_dVb(0.0), Abulk0(0.0), dAbulk0_dVb(0.0);
7821  double Cclm(0.0), dCclm_dVg(0.0), dCclm_dVd(0.0), dCclm_dVb(0.0);
7822  double FP(0.0), dFP_dVg(0.0);
7823  double PvagTerm(0.0), dPvagTerm_dVg(0.0);
7824  double dPvagTerm_dVd(0.0), dPvagTerm_dVb(0.0);
7825  double VADITS(0.0), dVADITS_dVg(0.0), dVADITS_dVd(0.0);
7826  double Lpe_Vb(0.0);
7827  double dDITS_Sft_dVb(0.0), dDITS_Sft_dVd(0.0);
7828  double VACLM(0.0), dVACLM_dVg(0.0), dVACLM_dVd(0.0), dVACLM_dVb(0.0);
7829  double VADIBL(0.0), dVADIBL_dVg(0.0), dVADIBL_dVd(0.0), dVADIBL_dVb(0.0);
7830  double Xdep(0.0), dXdep_dVb(0.0);
7831  double lt1(0.0), dlt1_dVb(0.0), ltw(0.0), dltw_dVb(0.0);
7832  double Delt_vth(0.0), dDelt_vth_dVb(0.0);
7833  double Theta0(0.0), dTheta0_dVb(0.0);
7834 
7835  double TempRatio(0.0), tmp1(0.0), tmp2(0.0), tmp3(0.0), tmp4(0.0);
7836  double DIBL_Sft(0.0), dDIBL_Sft_dVd(0.0);
7837  double Lambda(0.0), dLambda_dVg(0.0);
7838  double a1(0.0);
7839 
7840  double dVgsteff_dVg(0.0), dVgsteff_dVd(0.0), dVgsteff_dVb(0.0);
7841  double dVdseff_dVg(0.0), dVdseff_dVd(0.0), dVdseff_dVb(0.0);
7842  double VdseffCV(0.0),
7843  dVdseffCV_dVg(0.0), dVdseffCV_dVd(0.0), dVdseffCV_dVb(0.0);
7844  double diffVds(0.0);
7845  double dAbulk_dVg(0.0);
7846  double beta(0.0), dbeta_dVg(0.0), dbeta_dVd(0.0), dbeta_dVb(0.0);
7847  double gche(0.0), dgche_dVg(0.0), dgche_dVd(0.0), dgche_dVb(0.0);
7848  double fgche1(0.0), dfgche1_dVg(0.0), dfgche1_dVd(0.0), dfgche1_dVb(0.0);
7849  double fgche2(0.0), dfgche2_dVg(0.0), dfgche2_dVd(0.0), dfgche2_dVb(0.0);
7850  double Idl(0.0), dIdl_dVg(0.0), dIdl_dVd(0.0), dIdl_dVb(0.0);
7851  double Idsa(0.0), dIdsa_dVg(0.0), dIdsa_dVd(0.0), dIdsa_dVb(0.0);
7852  double Ids(0.0), Gmb(0.0);
7853  double devbs_dvb(0.0), devbd_dvb(0.0);
7854  double Isub(0.0), Gbd(0.0), Gbg(0.0), Gbb(0.0), Gds(0.0);
7855  double VASCBE(0.0), dVASCBE_dVg(0.0), dVASCBE_dVd(0.0), dVASCBE_dVb(0.0);
7856  double CoxeffWovL(0.0);
7857  double Rds(0.0), dRds_dVg(0.0), dRds_dVb(0.0), WVCox(0.0), WVCoxRds(0.0);
7858  double Vgst2Vtm(0.0), VdsatCV(0.0);
7859  double Leff(0.0), Weff(0.0), dWeff_dVg(0.0), dWeff_dVb(0.0);
7860  double AbulkCV(0.0), dAbulkCV_dVb(0.0);
7861 
7862  double Cgg1(0.0), Cgb1(0.0), Cgd1(0.0), Cbg1(0.0), Cbb1(0.0), Cbd1(0.0);
7863  double Qac0(0.0), Qsub0(0.0);
7864  double dQac0_dVg(0.0), dQac0_dVb(0.0);
7865  double dQsub0_dVg(0.0), dQsub0_dVd(0.0), dQsub0_dVb(0.0);
7866  double Ggislg(0.0), Ggislb(0.0), Ggisls(0.0);
7867  double Nvtmrss(0.0), Nvtmrssws(0.0), Nvtmrsswgs(0.0);
7868  double Nvtmrsd(0.0), Nvtmrsswd(0.0), Nvtmrsswgd(0.0);
7869 
7870  double vs(0.0), Fsevl(0.0);
7871  double dvs_dVg(0.0), dvs_dVd(0.0), dvs_dVb(0.0), dFsevl_dVg(0.0);
7872  double dFsevl_dVd(0.0), dFsevl_dVb(0.0);
7873  double vgdx(0.0), vgsx(0.0),epssub(0.0),toxe(0.0),epsrox(0.0);
7874  double von_local(0.0);
7875 
7876  // end b4ld.c parameters
7877 
7878  ScalingFactor = 1.0e-9;
7879 
7880  // Don't do charge computations in DC sweeps.
7881  if (getSolverState().tranopFlag || getSolverState().acopFlag || getSolverState().transientFlag)
7882  {
7883  ChargeComputationNeeded = true;
7884  }
7885  else
7886  {
7887  ChargeComputationNeeded = false;
7888  }
7889 
7890 #ifdef Xyce_DEBUG_DEVICE
7891  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
7892  {
7893  Xyce::dout() << subsection_divider << std::endl;
7894  Xyce::dout() << " Instance::updateIntermediateVars\n";
7895  Xyce::dout() << " name = " << getName();
7896  Xyce::dout() << " model name = " << model_.getName();
7897  Xyce::dout() <<" dtype is " << model_.dtype << std::endl;
7898  Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
7899  Xyce::dout() << " " << std::endl;
7900  }
7901 #endif
7902 
7903  int Check = 0;
7904  int Check1 = 0;
7905  int Check2 = 0;
7906 
7907  limitedFlag=false;
7908 
7909  // The first block of code in b4ld.c basically sets up, locally,
7910  // what the load function should use as values for the various solution
7911  // variables. There is a series of IF statements which are dependent
7912  // upon the mode. (transient, initializing transient, operating point,
7913  // small signal, etc.). Xyce treats the operating point and transient
7914  // calculation in the same way, from the device's point of view, and
7915  // we don't support any of the other modes. Therefore most of these
7916  // mode options are not here - only the transient mode stuff.
7917 
7918  // First get some of the needed solution variables:
7919  Vd = 0.0;
7920  Vs = 0.0;
7921  Vb = 0.0;
7922  Vsp = 0.0;
7923  Vdp = 0.0;
7924  Vgp = 0.0;
7925  Vbp = 0.0;
7926  Vge = 0.0;
7927  Vgm = 0.0;
7928  Vdb = 0.0;
7929  Vsb = 0.0;
7930  Qtotal = 0.0;
7931 
7937 
7941 
7942  if (li_GateMid >= 0) // only true for rgateMod==3
7943  {
7945  }
7946 
7949 
7950  if (trnqsMod)
7951  {
7953  }
7954  else
7955  {
7956  Qtotal = 0.0;
7957  }
7958 
7959  Vddp = Vd - Vdp;
7960  Vssp = Vs - Vsp;
7961  //Vbsp = Vb - Vsp;
7962  //Vbdp = Vb - Vdp;
7963  //Vgsp = Vg - Vsp;
7964  //Vgdp = Vg - Vdp;
7965  //Vgb = Vg - Vb;
7966 
7967  //Vdpsp = Vdp - Vsp;
7968 
7969  // substrate network:
7970  Vdbb = Vdb - Vb;
7971  Vdbbp = Vdb - Vbp;
7972  Vsbb = Vsb - Vb;
7973  Vsbbp = Vsb - Vbp;
7974  Vbpb = Vbp - Vb;
7975 
7976  // modified from b4ld:
7977  vds = model_.dtype * (Vdp - Vsp);
7978  vgs = model_.dtype * (Vgp - Vsp);
7979  vbs = model_.dtype * (Vbp - Vsp);
7980  vges = model_.dtype * (Vge - Vsp);
7981  vgms = model_.dtype * (Vgm - Vsp);
7982  vdbs = model_.dtype * (Vdb - Vsp);
7983  vsbs = model_.dtype * (Vsb - Vsp);
7984  vses = model_.dtype * (Vs - Vsp);
7985  vdes = model_.dtype * (Vd - Vsp);
7986  qdef = model_.dtype * (Qtotal);
7987 
7988  vbd = vbs - vds;
7989  vdbd = vdbs - vds;
7990  vgd = vgs - vds;
7991  vged = vges - vds;
7992  vgmd = vgms - vds;
7993  vgmb = vgms - vbs;
7994  vdbd = vdbs - vds;
7995 
7996  vbs_jct = (!rbodyMod) ? vbs : vsbs;
7997  vbd_jct = (!rbodyMod) ? vbd : vdbd;
7998 
7999  // Set up the linear resistors. Use type to "un-type" them:
8000  // Vgegp = model_.dtype *(vges-vgs);
8001  // Vgegm = model_.dtype *(vges-vgms);
8002  // Vgmgp = Vgegp-Vgegm;
8003  Vgegp = Vge - Vgp;
8004  Vgegm = Vge - Vgm;
8005  Vgmgp = Vgm - Vgp;
8006 
8007  origFlag = 1;
8008 
8009  vbd_orig = vbd;
8010  vbs_orig = vbs;
8011  vgs_orig = vgs;
8012  vds_orig = vds;
8013  vgd_orig = vgd;
8014  vges_orig = vges;
8015  vgms_orig = vgms;
8016  vdes_orig = vdes;
8017  vses_orig = vses;
8018  vdbs_orig = vdbs;
8019  vsbs_orig = vsbs;
8020  vdbd_orig = vdbd;
8021  vged_orig = vged;
8022  vgmd_orig = vgmd;
8025  vgmb_orig = vgmb;
8026  vgb_orig = vgb;
8027 
8028  Vgegp_orig = Vgegp;
8029  Vgegm_orig = Vgegm;
8030  Vgmgp_orig = Vgmgp;
8031 
8032  // What follows is a block of code designed to impose some limits,
8033  // or initial conditions on the junction voltages. Initial conditions
8034  // should only be imposed on the first Newton step of an operating point.
8035  //
8036  // The first possible limit on the junction voltages has to do with
8037  // limiting the percent change of junction voltages between Newton
8038  // iterations. The second has to do with avoiding extra floating point
8039  // operations in the event that the device has in some sense converged
8040  // (aka BYPASS). Although the primary point of BYPASS is to reduce
8041  // neccessary work, it also seems to reduce the number of Newton iterations.
8042  //
8043  // NOTE: We do not support BYPASS.
8044  //
8045  // The "old" variables should be the values for the previous
8046  // Newton iteration, if indeed there was a previous Newton
8047  // iteration. If not, just set the old values equal to
8048  // the current ones.
8049  //
8050 
8051  // set an initial condition if appropriate:
8053  {
8055  {
8056  N_LAS_Vector * flagSolVectorPtr = extData.flagSolVectorPtr;
8057  if ((*flagSolVectorPtr)[li_Drain] == 0 ||
8058  (*flagSolVectorPtr)[li_GateExt] == 0 ||
8059  (*flagSolVectorPtr)[li_Source] == 0 ||
8060  (*flagSolVectorPtr)[li_Body] == 0 ||
8061  (*flagSolVectorPtr)[li_DrainPrime] == 0 ||
8062  (*flagSolVectorPtr)[li_GatePrime] == 0 ||
8063  (*flagSolVectorPtr)[li_GateMid] == 0 ||
8064  (*flagSolVectorPtr)[li_SourcePrime] == 0 ||
8065  (*flagSolVectorPtr)[li_BodyPrime] == 0 ||
8066  (*flagSolVectorPtr)[li_DrainBody] == 0 ||
8067  (*flagSolVectorPtr)[li_SourceBody] == 0 ||
8068  (*flagSolVectorPtr)[li_Charge] == 0 )
8069  {
8070  vds = 0.1;
8071  vdes = 0.11;
8072  vses = -0.01;
8073  vgs = vges = vgms = model_.dtype * vth0 + 0.1;
8074  origFlag = 0;
8075  }
8076  }
8077  else
8078  {
8079  vds = 0.1;
8080  vdes = 0.11;
8081  vses = -0.01;
8082  vgs = vges = vgms = model_.dtype * vth0 + 0.1;
8083  origFlag = 0;
8084  }
8085  vbs = vdbs = vsbs = 0.0;
8086  vbd = vbs - vds;
8087  vdbd = vdbs - vds;
8088  vgd = vgs - vds;
8089  vged = vges-vds;
8090  vgmd = vgms-vds;
8091  //origFlag = 0;
8092  }
8093  else if ((getSolverState().initFixFlag || getSolverState().initJctFlag) && OFF)
8094  {
8095  vds = vgs = vbs = vges = vgms = 0.0;
8096  vds = vsbs = vdes = vses = qdef = 0.0;
8097  }
8098 
8099 
8100  if (getSolverState().newtonIter == 0)
8101  {
8102  newtonIterOld = 0;
8103 
8105  // ie, first newton step of a transient time step or DCOP continuation step.
8106  {
8120  von_local = (extData.currStoVectorRawPtr)[li_store_von];
8121  }
8122  else
8123  { // no history
8124  vbd_old = vbd;
8125  vbs_old = vbs;
8126  vgs_old = vgs;
8127  vds_old = vds;
8128  vges_old = vges;
8129  vgms_old = vgms;
8130  vdes_old = vdes;
8131  vses_old = vses;
8132  vdbs_old = vdbs;
8133  vsbs_old = vsbs;
8134  vdbd_old = vdbd;
8135  vged_old = vged;
8136  vgmd_old = vgmd;
8137  von_local = 0.0;
8138  }
8139  }
8140  else
8141  {
8155  von_local = (extData.nextStoVectorRawPtr)[li_store_von];
8156  }
8157 
8158  vgd_old = vgs_old - vds_old;
8159 
8160  // This next block performs checks on the junction voltages and
8161  // imposes limits on them if they are too big.
8162  // Note: In the level=1 von is multiplied by dtype. Here it is not. They
8163  // are both right.
8164 
8166  {
8167 
8168 #ifdef Xyce_DEBUG_DEVICE
8170  {
8171  Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
8172  Xyce::dout() << " von_local = " << von_local << std::endl;
8173  Xyce::dout() << " CONSTvt0 = " << CONSTvt0 << std::endl;
8174  Xyce::dout() << " vcrit = " << model_.vcrit << std::endl;
8175  Xyce::dout().width(3);
8176  Xyce::dout() << getSolverState().newtonIter;
8177  Xyce::dout().width(5);Xyce::dout() << getName();
8178  Xyce::dout() << " old :";
8179  Xyce::dout()<<" vgs:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8180  Xyce::dout() << vgs_old;
8181  Xyce::dout()<<" vds:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8182  Xyce::dout() << vds_old;
8183  Xyce::dout()<<" vbs:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8184  Xyce::dout() << vbs_old;
8185  Xyce::dout()<<" vbd:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8186  Xyce::dout() << vbd_old;
8187  Xyce::dout()<<" vges:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8188  Xyce::dout() << vges_old;
8189  Xyce::dout()<<" vgms:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8190  Xyce::dout() << vgms_old;
8191  Xyce::dout()<<" vged:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8192  Xyce::dout() << vged_old;
8193  Xyce::dout()<<" vgmd:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8194  Xyce::dout() << vgmd_old << std::endl;
8195  Xyce::dout().width(3);
8196  Xyce::dout() << getSolverState().newtonIter;
8197  Xyce::dout().width(5);Xyce::dout() << getName();
8198  Xyce::dout() << " Blim:";
8199  Xyce::dout()<<" vgs:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8200  Xyce::dout() << vgs;
8201  Xyce::dout()<<" vds:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8202  Xyce::dout() << vds;
8203  Xyce::dout()<<" vbs:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8204  Xyce::dout() << vbs;
8205  Xyce::dout()<<" vbd:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8206  Xyce::dout() << vbd;
8207  Xyce::dout()<<" vges:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8208  Xyce::dout() << vges;
8209  Xyce::dout()<<" vgms:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8210  Xyce::dout() << vgms;
8211  Xyce::dout()<<" vged:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8212  Xyce::dout() << vged;
8213  Xyce::dout()<<" vgmd:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8214  Xyce::dout() << vgmd << std::endl;
8215  Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
8216  }
8217 #endif
8218 
8219  // only do this if we are beyond the first Newton iteration. On the
8220  // first newton iteration, the "old" values are from a previous time
8221  // step.
8222 
8223  if (getSolverState().newtonIter >= 0 && !(getSolverState().initJctFlag))
8224  {
8225  if (vds_old >= 0.0)
8226  {
8227  vgs = devSupport.fetlim(vgs, vgs_old, von_local);
8228  vds = vgs - vgd;
8229  vds = devSupport.limvds(vds, vds_old);
8230  vgd = vgs - vds;
8231  if (rgateMod == 3)
8232  {
8233  vges = devSupport.fetlim(vges, vges_old, von_local);
8234  vgms = devSupport.fetlim(vgms, vgms_old, von_local);
8235  }
8236  else if ((rgateMod == 1) || (rgateMod == 2))
8237  {
8238  vges = devSupport.fetlim(vges, vges_old, von_local);
8239  vged = vges - vds;
8240  }
8241 
8242  if (model_.rdsMod)
8243  {
8246  }
8247  }
8248  else
8249  {
8250  vgd = devSupport.fetlim(vgd, vgd_old, von_local);
8251  vds = vgs - vgd;
8252  vds = -devSupport.limvds(-vds, -vds_old);
8253  vgs = vgd + vds;
8254 
8255  if (rgateMod == 3)
8256  {
8257  vged = devSupport.fetlim(vged, vged_old, von_local);
8258  vges = vged + vds;
8259  vgmd = devSupport.fetlim(vgmd, vgmd_old, von_local);
8260  vgms = vgmd + vds;
8261  }
8262  if ((rgateMod == 1) || (rgateMod == 2))
8263  {
8264  vged = devSupport.fetlim(vged, vged_old, von_local);
8265  vges = vged + vds;
8266  }
8267 
8268  if (model_.rdsMod)
8269  {
8272  }
8273  }
8274 
8275  if (vds >= 0.0)
8276  {
8277  vbs = devSupport.pnjlim(vbs, vbs_old,
8278  CONSTvt0, model_.vcrit, &Check);
8279  vbd = vbs - vds;
8280  if (rbodyMod)
8281  {
8283  CONSTvt0, model_.vcrit, &Check1);
8284  vdbd = vdbs - vds;
8286  CONSTvt0, model_.vcrit, &Check2);
8287  if ((Check1 != 0) || (Check2 != 0))
8288  {
8289  Check = 1;
8290  }
8291  }
8292  }
8293  else
8294  {
8296  CONSTvt0, model_.vcrit, &Check);
8297  vbs = vbd + vds;
8298  if (rbodyMod)
8299  {
8301  CONSTvt0, model_.vcrit, &Check1);
8302  vdbs = vdbd + vds;
8303  vsbd_old = vsbs_old - vds_old;
8304  vsbd = vsbs - vds;
8305  vsbd = devSupport.pnjlim(vsbd, vsbd_old, CONSTvt0, model_.vcrit, &Check2);
8306  vsbs = vsbd + vds;
8307  if ((Check1 != 0) || (Check2 != 0))
8308  {
8309  Check = 1;
8310  }
8311  }
8312  }
8313  }
8314 
8315 #if 0 // relying on check doesn't work.
8316  if (Check == 1)
8317  {
8318  origFlag = 0;
8319  }
8320 #endif
8321  // for convergence testing:
8322  if (Check == 1) limitedFlag=true;
8323 
8324  double machprec= N_UTL_MachineDependentParams::MachinePrecision();
8325 
8326 #if 0
8327  if (vbd_orig != vbd || vbs_orig != vbs || vgs_orig != vgs ||
8328  vds_orig != vds || vgd_orig != vgd || vges_orig != vges ||
8329  vgms_orig != vgms || vdes_orig != vdes || vses_orig != vses ||
8330  vdbs_orig != vdbs || vsbs_orig != vsbs || vdbd_orig != vdbd ||
8332  vgmb_orig != vgmb || vgb_orig != vgb || vged_orig != vged ||
8333  vgmd_orig != vgmd)
8334 #else
8335  if (
8336  fabs( vbd_orig - vbd) > machprec ||
8337  fabs( vbs_orig - vbs) > machprec ||
8338  fabs( vgs_orig - vgs) > machprec ||
8339  fabs( vds_orig - vds) > machprec ||
8340  fabs( vgd_orig - vgd) > machprec ||
8341  fabs( vges_orig - vges) > machprec ||
8342  fabs( vgms_orig - vgms) > machprec ||
8343  fabs( vdes_orig - vdes) > machprec ||
8344  fabs( vses_orig - vses) > machprec ||
8345  fabs( vdbs_orig - vdbs) > machprec ||
8346  fabs( vsbs_orig - vsbs) > machprec ||
8347  fabs( vdbd_orig - vdbd) > machprec ||
8348  fabs( vbs_jct_orig - vbs_jct) > machprec ||
8349  fabs( vbd_jct_orig - vbd_jct) > machprec ||
8350  fabs( vgmb_orig - vgmb) > machprec ||
8351  fabs( vgb_orig - vgb) > machprec ||
8352  fabs( vged_orig - vged) > machprec ||
8353  fabs( vgmd_orig - vgmd) > machprec )
8354 #endif
8355  {
8356  origFlag = 0;
8357  }
8358 
8359  } // getDeviceOptions().voltageLimiterFlag
8360 
8361  // update the "old" variables:
8362  if (getSolverState().newtonIter != 0 && getSolverState().newtonIter != newtonIterOld)
8363  {
8365  }
8366 
8367  // Calculate DC currents and their derivatives
8368  vbd = vbs - vds;
8369  vgd = vgs - vds;
8370  vgb = vgs - vbs;
8371  vged = vges - vds;
8372  vgmd = vgms - vds;
8373  vgmb = vgms - vbs;
8374  vdbd = vdbs - vds;
8375 
8376  vbs_jct = (!rbodyMod) ? vbs : vsbs;
8377  vbd_jct = (!rbodyMod) ? vbd : vdbd;
8378 
8379  // gate model voltage drops.
8380  // These are linear resistors, so no "type" parameter.
8381  // As these are being derived from limited "typed" junction
8382  // voltages, like vges, type is necessary to undo type.
8383  // Vgegp = model_.dtype *(vges-vgs);
8384  // Vgegm = model_.dtype *(vges-vgms);
8385  // Vgmgp = Vgegp-Vgegm;
8386 
8387 #ifdef Xyce_DEBUG_DEVICE
8389  {
8391  {
8392  Xyce::dout().width(3);
8393  Xyce::dout() << getSolverState().newtonIter;
8394  Xyce::dout().width(5);Xyce::dout() << getName();
8395  Xyce::dout() << " Alim:";
8396  Xyce::dout()<<" vgs:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8397  Xyce::dout() << vgs << "(diff="<<vgs-vgs_orig<<")";
8398  Xyce::dout()<<" vds:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8399  Xyce::dout() << vds << "(diff="<<vds-vds_orig<<")";
8400  Xyce::dout()<<" vbs:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8401  Xyce::dout() << vbs<< "(diff="<<vbs-vbs_orig<<")";
8402  Xyce::dout()<<" vbd:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8403  Xyce::dout() << vbd<< "(diff="<<vbd-vbd_orig<<")";
8404  Xyce::dout()<<" vges:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8405  Xyce::dout() << vges<< "(diff="<<vges-vges_orig<<")";
8406  Xyce::dout()<<" vgms:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8407  Xyce::dout() << vgms<< "(diff="<<vgms-vgms_orig<<")";
8408  Xyce::dout()<<" vged:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8409  Xyce::dout() << vged<< "(diff="<<vged-vged_orig<<")";
8410  Xyce::dout()<<" vgmd:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8411  Xyce::dout() << vgmd<< "(diff="<<vgmd-vgmd_orig<<")";
8412  Xyce::dout()<<" vbs_jct:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8413  Xyce::dout() << vbs_jct<< "(diff="<<vbs_jct-vbs_jct_orig<<")";
8414  Xyce::dout()<<" vbd_jct:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8415  Xyce::dout() << vbd_jct<< "(diff="<<vbd_jct-vbd_jct_orig<<")";
8416  if (origFlag) Xyce::dout() << " SAME";
8417  else Xyce::dout() << " DIFF";
8418  Xyce::dout() << std::endl;
8419  Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
8420  }
8421  }
8422 #endif
8423 
8424  // Source/drain junction diode DC model begins
8425  Nvtms = model_.vtm * model_.SjctEmissionCoeff;
8426  if ((Aseff <= 0.0) && (Pseff <= 0.0))
8427  {
8428  SourceSatCurrent = 1.0e-14;
8429  }
8430  else
8431  {
8432  SourceSatCurrent = Aseff * model_.SjctTempSatCurDensity
8434  + paramPtr->weffCJ * nf
8436  }
8437 
8438  if (SourceSatCurrent <= 0.0)
8439  {
8441  cbs = gbs * vbs_jct;
8442  }
8443  else
8444  {
8445  switch(model_.dioMod)
8446  {
8447  case 0:
8448  evbs = exp(vbs_jct / Nvtms);
8449  T1 = model_.xjbvs * exp(-(model_.bvs + vbs_jct) / Nvtms);
8450  // WDLiu: Magic T1 in this form; different from beta.
8451  gbs = SourceSatCurrent * (evbs + T1) / Nvtms + getDeviceOptions().gmin;
8452  cbs = SourceSatCurrent * (evbs + XExpBVS
8453  - T1 - 1.0) + getDeviceOptions().gmin * vbs_jct;
8454  break;
8455  case 1:
8456  T2 = vbs_jct / Nvtms;
8457  if (T2 < -CONSTEXP_THRESHOLD)
8458  {
8460  cbs = SourceSatCurrent * (CONSTMIN_EXP - 1.0)
8462  }
8463  else if (vbs_jct <= vjsmFwd)
8464  {
8465  evbs = exp(T2);
8466  gbs = SourceSatCurrent * evbs / Nvtms + getDeviceOptions().gmin;
8467  cbs = SourceSatCurrent * (evbs - 1.0)
8469  }
8470  else
8471  {
8472  T0 = IVjsmFwd / Nvtms;
8473  gbs = T0 + getDeviceOptions().gmin;
8474  cbs = IVjsmFwd - SourceSatCurrent + T0
8476  }
8477  break;
8478  case 2:
8479  if (vbs_jct < vjsmRev)
8480  {
8481  T0 = vbs_jct / Nvtms;
8482  if (T0 < -CONSTEXP_THRESHOLD)
8483  {
8484  evbs = CONSTMIN_EXP;
8485  devbs_dvb = 0.0;
8486  }
8487  else
8488  {
8489  evbs = exp(T0);
8490  devbs_dvb = evbs / Nvtms;
8491  }
8492 
8493  T1 = evbs - 1.0;
8494  T2 = IVjsmRev + SslpRev * (vbs_jct - vjsmRev);
8495  gbs = devbs_dvb * T2 + T1 * SslpRev + getDeviceOptions().gmin;
8496  cbs = T1 * T2 + getDeviceOptions().gmin * vbs_jct;
8497  }
8498  else if (vbs_jct <= vjsmFwd)
8499  {
8500  T0 = vbs_jct / Nvtms;
8501  if (T0 < -CONSTEXP_THRESHOLD)
8502  {
8503  evbs = CONSTMIN_EXP;
8504  devbs_dvb = 0.0;
8505  }
8506  else
8507  {
8508  evbs = exp(T0);
8509  devbs_dvb = evbs / Nvtms;
8510  }
8511 
8512  T1 = (model_.bvs + vbs_jct) / Nvtms;
8513  if (T1 > CONSTEXP_THRESHOLD)
8514  {
8515  T2 = CONSTMIN_EXP;
8516  T3 = 0.0;
8517  }
8518  else
8519  {
8520  T2 = exp(-T1);
8521  T3 = -T2 /Nvtms;
8522  }
8523  gbs = SourceSatCurrent * (devbs_dvb - model_.xjbvs * T3)
8524  + getDeviceOptions().gmin;
8525  cbs = SourceSatCurrent * (evbs + XExpBVS - 1.0
8526  - model_.xjbvs * T2)
8528  }
8529  else
8530  {
8532  cbs = IVjsmFwd + SslpFwd * (vbs_jct
8534  }
8535  break;
8536  default: break;
8537  }
8538  }
8539 
8540  Nvtmd = model_.vtm * model_.DjctEmissionCoeff;
8541  if ((Adeff <= 0.0) && (Pdeff <= 0.0))
8542  {
8543  DrainSatCurrent = 1.0e-14;
8544  }
8545  else
8546  {
8547  DrainSatCurrent = Adeff * model_.DjctTempSatCurDensity
8549  + paramPtr->weffCJ * nf
8551  }
8552 
8553  if (DrainSatCurrent <= 0.0)
8554  {
8556  cbd = gbd * vbd_jct;
8557  }
8558  else
8559  {
8560  switch(model_.dioMod)
8561  {
8562  case 0:
8563  evbd = exp(vbd_jct / Nvtmd);
8564  T1 = model_.xjbvd * exp(-(model_.bvd + vbd_jct) / Nvtmd);
8565  // WDLiu: Magic T1 in this form; different from beta.
8566  gbd = DrainSatCurrent * (evbd + T1) / Nvtmd + getDeviceOptions().gmin;
8567  cbd = DrainSatCurrent * (evbd + XExpBVD
8568  - T1 - 1.0) + getDeviceOptions().gmin * vbd_jct;
8569  break;
8570  case 1:
8571  T2 = vbd_jct / Nvtmd;
8572  if (T2 < -CONSTEXP_THRESHOLD)
8573  {
8575  cbd = DrainSatCurrent * (CONSTMIN_EXP - 1.0)
8577  }
8578  else if (vbd_jct <= vjdmFwd)
8579  {
8580  evbd = exp(T2);
8581  gbd = DrainSatCurrent * evbd / Nvtmd + getDeviceOptions().gmin;
8582  cbd = DrainSatCurrent * (evbd - 1.0)
8584  }
8585  else
8586  {
8587  T0 = IVjdmFwd / Nvtmd;
8588  gbd = T0 + getDeviceOptions().gmin;
8589  cbd = IVjdmFwd - DrainSatCurrent + T0
8591  }
8592  break;
8593  case 2:
8594  if (vbd_jct < vjdmRev)
8595  {
8596  T0 = vbd_jct / Nvtmd;
8597  if (T0 < -CONSTEXP_THRESHOLD)
8598  {
8599  evbd = CONSTMIN_EXP;
8600  devbd_dvb = 0.0;
8601  }
8602  else
8603  {
8604  evbd = exp(T0);
8605  devbd_dvb = evbd / Nvtmd;
8606  }
8607 
8608  T1 = evbd - 1.0;
8609  T2 = IVjdmRev + DslpRev * (vbd_jct - vjdmRev);
8610  gbd = devbd_dvb * T2 + T1 * DslpRev + getDeviceOptions().gmin;
8611  cbd = T1 * T2 + getDeviceOptions().gmin * vbd_jct;
8612  }
8613  else if (vbd_jct <= vjdmFwd)
8614  {
8615  T0 = vbd_jct / Nvtmd;
8616  if (T0 < -CONSTEXP_THRESHOLD)
8617  {
8618  evbd = CONSTMIN_EXP;
8619  devbd_dvb = 0.0;
8620  }
8621  else
8622  {
8623  evbd = exp(T0);
8624  devbd_dvb = evbd / Nvtmd;
8625  }
8626 
8627  T1 = (model_.bvd + vbd_jct) / Nvtmd;
8628  if (T1 > CONSTEXP_THRESHOLD)
8629  {
8630  T2 = CONSTMIN_EXP;
8631  T3 = 0.0;
8632  }
8633  else
8634  {
8635  T2 = exp(-T1);
8636  T3 = -T2 /Nvtmd;
8637  }
8638  gbd = DrainSatCurrent * (devbd_dvb - model_.xjbvd * T3)
8639  + getDeviceOptions().gmin;
8640  cbd = DrainSatCurrent * (evbd + XExpBVD - 1.0
8641  - model_.xjbvd * T2) + getDeviceOptions().gmin * vbd_jct;
8642  }
8643  else
8644  {
8646  cbd = IVjdmFwd + DslpFwd * (vbd_jct
8648  }
8649  break;
8650  default: break;
8651  }
8652  }
8653 
8654  /* trap-assisted tunneling and recombination current for reverse bias */
8655  Nvtmrssws = model_.vtm0 * model_.njtsswstemp;
8656  Nvtmrsswgs = model_.vtm0 * model_.njtsswgstemp;
8657  Nvtmrss = model_.vtm0 * model_.njtsstemp;
8658  Nvtmrsswd = model_.vtm0 * model_.njtsswdtemp;
8659  Nvtmrsswgd = model_.vtm0 * model_.njtsswgdtemp;
8660  Nvtmrsd = model_.vtm0 * model_.njtsdtemp;
8661 
8662  if ((model_.vtss - vbs_jct) < (model_.vtss * 1e-3))
8663  {
8664  T9 = 1.0e3;
8665  T0 = - vbs_jct / Nvtmrss * T9;
8666  DEXP(T0, T1, T10);
8667  dT1_dVb = T10 / Nvtmrss * T9;
8668  }
8669  else
8670  {
8671  T9 = 1.0 / (model_.vtss - vbs_jct);
8672  T0 = -vbs_jct / Nvtmrss * model_.vtss * T9;
8673  dT0_dVb = model_.vtss / Nvtmrss * (T9 + vbs_jct * T9 * T9) ;
8674  DEXP(T0, T1, T10);
8675  dT1_dVb = T10 * dT0_dVb;
8676  }
8677 
8678  if ((model_.vtsd - vbd_jct) < (model_.vtsd * 1e-3) )
8679  {
8680  T9 = 1.0e3;
8681  T0 = -vbd_jct / Nvtmrsd * T9;
8682  DEXP(T0, T2, T10);
8683  dT2_dVb = T10 / Nvtmrsd * T9;
8684  }
8685  else
8686  {
8687  T9 = 1.0 / (model_.vtsd - vbd_jct);
8688  T0 = -vbd_jct / Nvtmrsd * model_.vtsd * T9;
8689  dT0_dVb = model_.vtsd / Nvtmrsd * (T9 + vbd_jct * T9 * T9) ;
8690  DEXP(T0, T2, T10);
8691  dT2_dVb = T10 * dT0_dVb;
8692  }
8693 
8694  if ((model_.vtssws - vbs_jct) < (model_.vtssws * 1e-3) )
8695  {
8696  T9 = 1.0e3;
8697  T0 = -vbs_jct / Nvtmrssws * T9;
8698  DEXP(T0, T3, T10);
8699  dT3_dVb = T10 / Nvtmrssws * T9;
8700  }
8701  else
8702  {
8703  T9 = 1.0 / (model_.vtssws - vbs_jct);
8704  T0 = -vbs_jct / Nvtmrssws * model_.vtssws * T9;
8705  dT0_dVb = model_.vtssws / Nvtmrssws * (T9 + vbs_jct * T9 * T9) ;
8706  DEXP(T0, T3, T10);
8707  dT3_dVb = T10 * dT0_dVb;
8708  }
8709 
8710  if ((model_.vtsswd - vbd_jct) < (model_.vtsswd * 1e-3) )
8711  {
8712  T9 = 1.0e3;
8713  T0 = -vbd_jct / Nvtmrsswd * T9;
8714  DEXP(T0, T4, T10);
8715  dT4_dVb = T10 / Nvtmrsswd * T9;
8716  }
8717  else
8718  {
8719  T9 = 1.0 / (model_.vtsswd - vbd_jct);
8720  T0 = -vbd_jct / Nvtmrsswd * model_.vtsswd * T9;
8721  dT0_dVb = model_.vtsswd / Nvtmrsswd * (T9 + vbd_jct * T9 * T9) ;
8722  DEXP(T0, T4, T10);
8723  dT4_dVb = T10 * dT0_dVb;
8724  }
8725 
8726  if ((model_.vtsswgs - vbs_jct) < (model_.vtsswgs * 1e-3) )
8727  {
8728  T9 = 1.0e3;
8729  T0 = -vbs_jct / Nvtmrsswgs * T9;
8730  DEXP(T0, T5, T10);
8731  dT5_dVb = T10 / Nvtmrsswgs * T9;
8732  }
8733  else
8734  {
8735  T9 = 1.0 / (model_.vtsswgs - vbs_jct);
8736  T0 = -vbs_jct / Nvtmrsswgs * model_.vtsswgs * T9;
8737  dT0_dVb = model_.vtsswgs / Nvtmrsswgs * (T9 + vbs_jct * T9 * T9) ;
8738  DEXP(T0, T5, T10);
8739  dT5_dVb = T10 * dT0_dVb;
8740  }
8741 
8742  if ((model_.vtsswgd - vbd_jct) < (model_.vtsswgd * 1e-3) )
8743  {
8744  T9 = 1.0e3;
8745  T0 = -vbd_jct / Nvtmrsswgd * T9;
8746  DEXP(T0, T6, T10);
8747  dT6_dVb = T10 / Nvtmrsswgd * T9;
8748  }
8749  else
8750  {
8751  T9 = 1.0 / (model_.vtsswgd - vbd_jct);
8752  T0 = -vbd_jct / Nvtmrsswgd * model_.vtsswgd * T9;
8753  dT0_dVb = model_.vtsswgd / Nvtmrsswgd * (T9 + vbd_jct * T9 * T9) ;
8754  DEXP(T0, T6, T10);
8755  dT6_dVb = T10 * dT0_dVb;
8756  }
8757 
8758  gbs += SjctTempRevSatCur * dT1_dVb
8759  + SswTempRevSatCur * dT3_dVb
8760  + SswgTempRevSatCur * dT5_dVb;
8761  cbs -= SjctTempRevSatCur * (T1 - 1.0)
8762  + SswTempRevSatCur * (T3 - 1.0)
8763  + SswgTempRevSatCur * (T5 - 1.0);
8764  gbd += DjctTempRevSatCur * dT2_dVb
8765  + DswTempRevSatCur * dT4_dVb
8766  + DswgTempRevSatCur * dT6_dVb;
8767  cbd -= DjctTempRevSatCur * (T2 - 1.0)
8768  + DswTempRevSatCur * (T4 - 1.0)
8769  + DswgTempRevSatCur * (T6 - 1.0);
8770 
8771  // End of diode DC model
8772 
8773  if (vds >= 0.0)
8774  {
8775  mode = 1;
8776  Vds = vds;
8777  Vgs = vgs;
8778  Vbs = vbs;
8779  Vdb = vds - vbs; // WDLiu: for GIDL
8780  }
8781  else
8782  {
8783  mode = -1;
8784  Vds = -vds;
8785  Vgs = vgd;
8786  Vbs = vbd;
8787  Vdb = -vbs;
8788  }
8789 
8790  // dunga
8791  if(model_.mtrlMod)
8792  {
8793  epsrox = 3.9;
8794  toxe = model_.eot;
8795  epssub = CONSTEPS0 * model_.epsrsub;
8796  }
8797  else
8798  {
8799  epsrox = model_.epsrox;
8800  toxe = model_.toxe;
8801  epssub = CONSTEPSSI;
8802  }
8803 
8804  /////////////////////////////////////////////////////////////////////////////
8805  // mosfet continuation.
8806  // This idea is based, loosely, on a paper by Jaijeet
8807  // Rosychowdhury. If the artificial parameter flag has been enabled,
8808  // modify Vds and Vgs.
8809 #ifdef Xyce_DEBUG_DEVICE
8810  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
8811  {
8812  Xyce::dout() << "HOMOTOPY INFO: gainscale = "
8813  << getSolverState().gainScale[blockHomotopyID] << std::endl;
8814  Xyce::dout() << "HOMOTOPY INFO: before vds = " << Vds << std::endl;
8815  Xyce::dout() << "HOMOTOPY INFO: before vgst = " << Vgs << std::endl;
8816  }
8817 #endif
8818  if (getSolverState().artParameterFlag)
8819  {
8820 
8821  double alpha = getSolverState().gainScale[blockHomotopyID];
8822  if (getDeviceOptions().staggerGainScale)
8823  {
8824  alpha *= (0.3 * randomPerturb + 1.0);
8825  if (alpha > 1.0)
8826  {
8827  alpha = 1.0;
8828  }
8829  }
8830  double vgstConst = getDeviceOptions().vgstConst;
8831  if (getDeviceOptions().randomizeVgstConst)
8832  {
8833  vgstConst *= randomPerturb;
8834  }
8835 
8836  Vds = devSupport.contVds (Vds,getSolverState().nltermScale,getDeviceOptions().vdsScaleMin);
8837  Vgs = devSupport.contVgst(Vgs, alpha, vgstConst);
8838  }
8839 #ifdef Xyce_DEBUG_DEVICE
8840  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
8841  {
8842  Xyce::dout() << "HOMOTOPY INFO: after vds = " << Vds << std::endl;
8843  Xyce::dout() << "HOMOTOPY INFO: after vgst = " << Vgs << std::endl;
8844  }
8845 #endif
8846  // end of mosfet continuation block.
8847  /////////////////////////////////////////////////////////////////////////////
8848 
8849  T0 = Vbs - vbsc - 0.001;
8850  T1 = sqrt(T0 * T0 - 0.004 * vbsc);
8851  if (T0 >= 0.0)
8852  {
8853  Vbseff = vbsc + 0.5 * (T0 + T1);
8854  dVbseff_dVb = 0.5 * (1.0 + T0 / T1);
8855  }
8856  else
8857  {
8858  T2 = -0.002 / (T1 - T0);
8859  Vbseff = vbsc * (1.0 + T2);
8860  dVbseff_dVb = T2 * vbsc / T1;
8861  }
8862 
8863  // JX: Correction to forward body bias
8864  T9 = 0.95 * paramPtr->phi;
8865  T0 = T9 - Vbseff - 0.001;
8866  T1 = sqrt(T0 * T0 + 0.004 * T9);
8867  Vbseff = T9 - 0.5 * (T0 + T1);
8868  dVbseff_dVb *= 0.5 * (1.0 + T0 / T1);
8869 
8870  Phis = paramPtr->phi - Vbseff;
8871  dPhis_dVb = -1.0;
8872  sqrtPhis = sqrt(Phis);
8873  dsqrtPhis_dVb = -0.5 / sqrtPhis;
8874 
8875  Xdep = paramPtr->Xdep0 * sqrtPhis / paramPtr->sqrtPhi;
8876  dXdep_dVb = (paramPtr->Xdep0 / paramPtr->sqrtPhi) * dsqrtPhis_dVb;
8877 
8878  Leff = paramPtr->leff;
8879  Vtm = model_.vtm;
8880  Vtm0 = model_.vtm0;
8881 
8882  // Vth Calculation
8883  T3 = sqrt(Xdep);
8884  V0 = paramPtr->vbi - paramPtr->phi;
8885 
8886  T0 = paramPtr->dvt2 * Vbseff;
8887  if (T0 >= - 0.5)
8888  {
8889  T1 = 1.0 + T0;
8890  T2 = paramPtr->dvt2;
8891  }
8892  else
8893  {
8894  T4 = 1.0 / (3.0 + 8.0 * T0);
8895  T1 = (1.0 + 3.0 * T0) * T4;
8896  T2 = paramPtr->dvt2 * T4 * T4;
8897  }
8898  lt1 = model_.factor1 * T3 * T1;
8899  dlt1_dVb = model_.factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
8900 
8901  T0 = paramPtr->dvt2w * Vbseff;
8902  if (T0 >= - 0.5)
8903  {
8904  T1 = 1.0 + T0;
8905  T2 = paramPtr->dvt2w;
8906  }
8907  else
8908  {
8909  T4 = 1.0 / (3.0 + 8.0 * T0);
8910  T1 = (1.0 + 3.0 * T0) * T4;
8911  T2 = paramPtr->dvt2w * T4 * T4;
8912  }
8913  ltw = model_.factor1 * T3 * T1;
8914  dltw_dVb = model_.factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
8915 
8916  T0 = paramPtr->dvt1 * Leff / lt1;
8917  if (T0 < CONSTEXP_THRESHOLD)
8918  {
8919  T1 = exp(T0);
8920  T2 = T1 - 1.0;
8921  T3 = T2 * T2;
8922  T4 = T3 + 2.0 * T1 * CONSTMIN_EXP;
8923  Theta0 = T1 / T4;
8924  dT1_dVb = -T0 * T1 * dlt1_dVb / lt1;
8925  dTheta0_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 + CONSTMIN_EXP)) / T4 / T4;
8926  }
8927  else
8928  {
8929  Theta0 = 1.0 / (CONSTMAX_EXP - 2.0); // 3.0 * CONSTMIN_EXP omitted
8930  dTheta0_dVb = 0.0;
8931  }
8932  thetavth = paramPtr->dvt0 * Theta0;
8933  Delt_vth = thetavth * V0;
8934  dDelt_vth_dVb = paramPtr->dvt0 * dTheta0_dVb * V0;
8935 
8936  T0 = paramPtr->dvt1w * paramPtr->weff * Leff / ltw;
8937  if (T0 < CONSTEXP_THRESHOLD)
8938  {
8939  T1 = exp(T0);
8940  T2 = T1 - 1.0;
8941  T3 = T2 * T2;
8942  T4 = T3 + 2.0 * T1 * CONSTMIN_EXP;
8943  T5 = T1 / T4;
8944  dT1_dVb = -T0 * T1 * dltw_dVb / ltw;
8945  dT5_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 + CONSTMIN_EXP)) / T4 / T4;
8946  }
8947  else
8948  {
8949  T5 = 1.0 / (CONSTMAX_EXP - 2.0); // 3.0 * CONSTMIN_EXP omitted
8950  dT5_dVb = 0.0;
8951  }
8952 
8953  T0 = paramPtr->dvt0w * T5;
8954  T2 = T0 * V0;
8955  dT2_dVb = paramPtr->dvt0w * dT5_dVb * V0;
8956 
8957  TempRatio = temp / model_.tnom - 1.0;
8958  T0 = sqrt(1.0 + paramPtr->lpe0 / Leff);
8959  T1 = paramPtr->k1ox * (T0 - 1.0) * paramPtr->sqrtPhi
8960  + (paramPtr->kt1 + paramPtr->kt1l / Leff
8961  + paramPtr->kt2 * Vbseff) * TempRatio;
8962  Vth_NarrowW = toxe * paramPtr->phi
8963  / (paramPtr->weff + paramPtr->w0);
8964 
8965  T3 = eta0 + paramPtr->etab * Vbseff;
8966  if (T3 < 1.0e-4)
8967  {
8968  T9 = 1.0 / (3.0 - 2.0e4 * T3);
8969  T3 = (2.0e-4 - T3) * T9;
8970  T4 = T9 * T9;
8971  }
8972  else
8973  {
8974  T4 = 1.0;
8975  }
8976  dDIBL_Sft_dVd = T3 * paramPtr->theta0vb0;
8977  DIBL_Sft = dDIBL_Sft_dVd * Vds;
8978 
8979  Lpe_Vb = sqrt(1.0 + paramPtr->lpeb / Leff);
8980 
8981  Vth = model_.dtype * vth0 + (paramPtr->k1ox * sqrtPhis
8982  - paramPtr->k1 * paramPtr->sqrtPhi) * Lpe_Vb
8983  - k2ox * Vbseff - Delt_vth - T2 + (paramPtr->k3
8984  + paramPtr->k3b * Vbseff) * Vth_NarrowW + T1 - DIBL_Sft;
8985 
8986  dVth_dVb = Lpe_Vb * paramPtr->k1ox * dsqrtPhis_dVb - k2ox
8987  - dDelt_vth_dVb - dT2_dVb + paramPtr->k3b * Vth_NarrowW
8988  - paramPtr->etab * Vds * paramPtr->theta0vb0 * T4
8989  + paramPtr->kt2 * TempRatio;
8990  dVth_dVd = -dDIBL_Sft_dVd;
8991 
8992 
8993  // Calculate n
8994  tmp1 = epssub / Xdep;
8995  nstar = model_.vtm / CONSTQ * (model_.coxe + tmp1 + paramPtr->cit);
8996  tmp2 = paramPtr->nfactor * tmp1;
8997  tmp3 = paramPtr->cdsc + paramPtr->cdscb * Vbseff
8998  + paramPtr->cdscd * Vds;
8999  tmp4 = (tmp2 + tmp3 * Theta0 + paramPtr->cit) / model_.coxe;
9000  if (tmp4 >= -0.5)
9001  {
9002  n = 1.0 + tmp4;
9003  dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb
9004  + paramPtr->cdscb * Theta0) / model_.coxe;
9005  dn_dVd = paramPtr->cdscd * Theta0 / model_.coxe;
9006  }
9007  else
9008  {
9009  T0 = 1.0 / (3.0 + 8.0 * tmp4);
9010  n = (1.0 + 3.0 * tmp4) * T0;
9011  T0 *= T0;
9012  dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb
9013  + paramPtr->cdscb * Theta0) / model_.coxe * T0;
9014  dn_dVd = paramPtr->cdscd * Theta0 / model_.coxe * T0;
9015  }
9016 
9017 
9018  // Vth correction for Pocket implant
9019  if (paramPtr->dvtp0 > 0.0)
9020  {
9021  T0 = -paramPtr->dvtp1 * Vds;
9022  if (T0 < -CONSTEXP_THRESHOLD)
9023  {
9024  T2 = CONSTMIN_EXP;
9025  dT2_dVd = 0.0;
9026  }
9027  else
9028  {
9029  T2 = exp(T0);
9030  dT2_dVd = -paramPtr->dvtp1 * T2;
9031  }
9032 
9033  T3 = Leff + paramPtr->dvtp0 * (1.0 + T2);
9034  dT3_dVd = paramPtr->dvtp0 * dT2_dVd;
9035  if (model_.tempMod < 2)
9036  {
9037  T4 = Vtm * log(Leff / T3);
9038  dT4_dVd = -Vtm * dT3_dVd / T3;
9039  }
9040  else
9041  {
9042  T4 = model_.vtm0 * log(Leff / T3);
9043  dT4_dVd = -model_.vtm0 * dT3_dVd / T3;
9044  }
9045  dDITS_Sft_dVd = dn_dVd * T4 + n * dT4_dVd;
9046  dDITS_Sft_dVb = T4 * dn_dVb;
9047 
9048  Vth -= n * T4;
9049  dVth_dVd -= dDITS_Sft_dVd;
9050  dVth_dVb -= dDITS_Sft_dVb;
9051  }
9052  von = Vth;
9053 
9054  // Poly Gate Si Depletion Effect
9055  T0 = vfb + paramPtr->phi;
9056  if(model_.mtrlMod == 0)
9057  T1 = CONSTEPSSI;
9058  else
9059  T1 = model_.epsrgate * CONSTEPS0;
9060 
9063 
9066 
9067  if(mode>0)
9068  {
9069  Vgs_eff = vgs_eff;
9070  dVgs_eff_dVg = dvgs_eff_dvg;
9071  }
9072  else
9073  {
9074  Vgs_eff = vgd_eff;
9075  dVgs_eff_dVg = dvgd_eff_dvg;
9076  }
9077  vgs_eff = vgs_eff;
9078  vgd_eff = vgd_eff;
9081 
9082  Vgst = Vgs_eff - Vth;
9083 
9084  // Calculate Vgsteff
9085  T0 = n * Vtm;
9086  T1 = paramPtr->mstar * Vgst;
9087  T2 = T1 / T0;
9088  if (T2 > CONSTEXP_THRESHOLD)
9089  {
9090  T10 = T1;
9091  dT10_dVg = paramPtr->mstar * dVgs_eff_dVg;
9092  dT10_dVd = -dVth_dVd * paramPtr->mstar;
9093  dT10_dVb = -dVth_dVb * paramPtr->mstar;
9094  }
9095  else if (T2 < -CONSTEXP_THRESHOLD)
9096  {
9097  T10 = Vtm * log(1.0 + CONSTMIN_EXP);
9098  dT10_dVg = 0.0;
9099  dT10_dVd = T10 * dn_dVd;
9100  dT10_dVb = T10 * dn_dVb;
9101  T10 *= n;
9102  }
9103  else
9104  {
9105  ExpVgst = exp(T2);
9106  T3 = Vtm * log(1.0 + ExpVgst);
9107  T10 = n * T3;
9108  dT10_dVg = paramPtr->mstar * ExpVgst / (1.0 + ExpVgst);
9109  dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n);
9110  dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n);
9111  dT10_dVg *= dVgs_eff_dVg;
9112  }
9113 
9114  T1 = paramPtr->voffcbn - (1.0 - paramPtr->mstar) * Vgst;
9115  T2 = T1 / T0;
9116 
9117  if (T2 < -CONSTEXP_THRESHOLD)
9118  {
9120  T9 = paramPtr->mstar + T3 * n;
9121  dT9_dVg = 0.0;
9122  dT9_dVd = dn_dVd * T3;
9123  dT9_dVb = dn_dVb * T3;
9124  }
9125  else if (T2 > CONSTEXP_THRESHOLD)
9126  {
9128  T9 = paramPtr->mstar + T3 * n;
9129  dT9_dVg = 0.0;
9130  dT9_dVd = dn_dVd * T3;
9131  dT9_dVb = dn_dVb * T3;
9132  }
9133  else
9134  {
9135  ExpVgst = exp(T2);
9136  T3 = model_.coxe / paramPtr->cdep0;
9137  T4 = T3 * ExpVgst;
9138  T5 = T1 * T4 / T0;
9139  T9 = paramPtr->mstar + n * T4;
9140  dT9_dVg = T3 * (paramPtr->mstar - 1.0) * ExpVgst / Vtm;
9141  dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb;
9142  dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd;
9143  dT9_dVg *= dVgs_eff_dVg;
9144  }
9145 
9146  Vgsteff = T10 / T9;
9147  T11 = T9 * T9;
9148  dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11;
9149  dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11;
9150  dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11;
9151 
9152  // Calculate Effective Channel Geometry
9153  T9 = sqrtPhis - paramPtr->sqrtPhi;
9154  Weff = paramPtr->weff - 2.0 * (paramPtr->dwg * Vgsteff
9155  + paramPtr->dwb * T9);
9156  dWeff_dVg = -2.0 * paramPtr->dwg;
9157  dWeff_dVb = -2.0 * paramPtr->dwb * dsqrtPhis_dVb;
9158 
9159  if (Weff < 2.0e-8) // to avoid the discontinuity problem due to Weff
9160  {
9161  T0 = 1.0 / (6.0e-8 - 2.0 * Weff);
9162  Weff = 2.0e-8 * (4.0e-8 - Weff) * T0;
9163  T0 *= T0 * 4.0e-16;
9164  dWeff_dVg *= T0;
9165  dWeff_dVb *= T0;
9166  }
9167 
9168  if (model_.rdsMod == 1)
9169  {
9170  Rds = dRds_dVg = dRds_dVb = 0.0;
9171  }
9172  else
9173  {
9174  T0 = 1.0 + paramPtr->prwg * Vgsteff;
9175  dT0_dVg = -paramPtr->prwg / T0 / T0;
9176  T1 = paramPtr->prwb * T9;
9177  dT1_dVb = paramPtr->prwb * dsqrtPhis_dVb;
9178 
9179  T2 = 1.0 / T0 + T1;
9180  T3 = T2 + sqrt(T2 * T2 + 0.01); // 0.01 = 4.0 * 0.05 * 0.05
9181  dT3_dVg = 1.0 + T2 / (T3 - T2);
9182  dT3_dVb = dT3_dVg * dT1_dVb;
9183  dT3_dVg *= dT0_dVg;
9184 
9185  T4 = paramPtr->rds0 * 0.5;
9186  Rds = paramPtr->rdswmin + T3 * T4;
9187  dRds_dVg = T4 * dT3_dVg;
9188  dRds_dVb = T4 * dT3_dVb;
9189 
9190  if (Rds > 0.0)
9191  {
9192  grdsw = 1.0 / Rds;
9193  }
9194  else
9195  {
9196  grdsw = 0.0;
9197  }
9198  }
9199 
9200  // Calculate Abulk
9201  T9 = 0.5 * paramPtr->k1ox * Lpe_Vb / sqrtPhis;
9202  T1 = T9 + k2ox - paramPtr->k3b * Vth_NarrowW;
9203  dT1_dVb = -T9 / sqrtPhis * dsqrtPhis_dVb;
9204 
9205  T9 = sqrt(paramPtr->xj * Xdep);
9206  tmp1 = Leff + 2.0 * T9;
9207  T5 = Leff / tmp1;
9208  tmp2 = paramPtr->a0 * T5;
9209  tmp3 = paramPtr->weff + paramPtr->b1;
9210  tmp4 = paramPtr->b0 / tmp3;
9211  T2 = tmp2 + tmp4;
9212  dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb;
9213  T6 = T5 * T5;
9214  T7 = T5 * T6;
9215 
9216  Abulk0 = 1.0 + T1 * T2;
9217  dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb;
9218 
9219  T8 = paramPtr->ags * paramPtr->a0 * T7;
9220  dAbulk_dVg = -T1 * T8;
9221  Abulk = Abulk0 + dAbulk_dVg * Vgsteff;
9222  dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb + 3.0 * T1 * dT2_dVb);
9223 
9224  if (Abulk0 < 0.1) // added to avoid the problems caused by Abulk0
9225  {
9226  T9 = 1.0 / (3.0 - 20.0 * Abulk0);
9227  Abulk0 = (0.2 - Abulk0) * T9;
9228  dAbulk0_dVb *= T9 * T9;
9229  }
9230 
9231  if (Abulk < 0.1)
9232  {
9233  T9 = 1.0 / (3.0 - 20.0 * Abulk);
9234  Abulk = (0.2 - Abulk) * T9;
9235  T10 = T9 * T9;
9236  dAbulk_dVb *= T10;
9237  dAbulk_dVg *= T10;
9238  }
9239  Abulk = Abulk;
9240 
9241  T2 = paramPtr->keta * Vbseff;
9242  if (T2 >= -0.9)
9243  {
9244  T0 = 1.0 / (1.0 + T2);
9245  dT0_dVb = -paramPtr->keta * T0 * T0;
9246  }
9247  else
9248  {
9249  T1 = 1.0 / (0.8 + T2);
9250  T0 = (17.0 + 20.0 * T2) * T1;
9251  dT0_dVb = -paramPtr->keta * T1 * T1;
9252  }
9253 
9254  dAbulk_dVg *= T0;
9255  dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb;
9256  dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb;
9257  Abulk *= T0;
9258  Abulk0 *= T0;
9259 
9260  // Mobility calculation
9261  if (model_.mtrlMod)
9262  T14 = 2.0 * model_.dtype *(model_.phig - model_.easub - 0.5*model_.Eg0 + 0.45);
9263  else
9264  T14 = 0.0;
9265 
9266  if (model_.mobMod == 0)
9267  { T0 = Vgsteff + Vth + Vth - T14;
9268  T2 = paramPtr->ua + paramPtr->uc * Vbseff;
9269  T3 = T0 / toxe;
9270  T12 = sqrt(Vth * Vth + 0.0001);
9271  T9 = 1.0/(Vgsteff + 2*T12);
9272  T10 = T9*toxe;
9273  T8 = paramPtr->ud * T10 * T10 * Vth;
9274  T6 = T8 * Vth;
9275  T5 = T3 * (T2 + paramPtr->ub * T3) + T6;
9276  T7 = - 2.0 * T6 * T9;
9277  T11 = T7 * Vth/T12;
9278  dDenomi_dVg = (T2 + 2.0 * paramPtr->ub * T3) / toxe;
9279  T13 = 2.0 * (dDenomi_dVg + T11 + T8);
9280  dDenomi_dVd = T13 * dVth_dVd;
9281  dDenomi_dVb = T13 * dVth_dVb + paramPtr->uc * T3;
9282  dDenomi_dVg+= T7;
9283  }
9284  else if (model_.mobMod == 1)
9285  { T0 = Vgsteff + Vth + Vth - T14;
9286  T2 = 1.0 + paramPtr->uc * Vbseff;
9287  T3 = T0 / toxe;
9288  T4 = T3 * (paramPtr->ua + paramPtr->ub * T3);
9289  T12 = sqrt(Vth * Vth + 0.0001);
9290  T9 = 1.0/(Vgsteff + 2*T12);
9291  T10 = T9*toxe;
9292  T8 = paramPtr->ud * T10 * T10 * Vth;
9293  T6 = T8 * Vth;
9294  T5 = T4 * T2 + T6;
9295  T7 = - 2.0 * T6 * T9;
9296  T11 = T7 * Vth/T12;
9297  dDenomi_dVg = (paramPtr->ua + 2.0 * paramPtr->ub * T3) * T2 / toxe;
9298  T13 = 2.0 * (dDenomi_dVg + T11 + T8);
9299  dDenomi_dVd = T13 * dVth_dVd;
9300  dDenomi_dVb = T13 * dVth_dVb + paramPtr->uc * T4;
9301  dDenomi_dVg+= T7;
9302  }
9303  else
9304  { T0 = (Vgsteff + vtfbphi1) / toxe;
9305  T1 = exp(paramPtr->eu * log(T0));
9306  dT1_dVg = T1 * paramPtr->eu / T0 / toxe;
9307  T2 = paramPtr->ua + paramPtr->uc * Vbseff;
9308  T3 = T0 / toxe;
9309  T12 = sqrt(Vth * Vth + 0.0001);
9310  T9 = 1.0/(Vgsteff + 2*T12);
9311  T10 = T9*toxe;
9312  T8 = paramPtr->ud * T10 * T10 * Vth;
9313  T6 = T8 * Vth;
9314  T5 = T1 * T2 + T6;
9315  T7 = - 2.0 * T6 * T9;
9316  T11 = T7 * Vth/T12;
9317  dDenomi_dVg = T2 * dT1_dVg + T7;
9318  T13 = 2.0 * (T11 + T8);
9319  dDenomi_dVd = T13 * dVth_dVd;
9320  dDenomi_dVb = T13 * dVth_dVb + T1 * paramPtr->uc;
9321  }
9322 
9323  if (T5 >= -0.8)
9324  {
9325  Denomi = 1.0 + T5;
9326  }
9327  else
9328  {
9329  T9 = 1.0 / (7.0 + 10.0 * T5);
9330  Denomi = (0.6 + T5) * T9;
9331  T9 *= T9;
9332  dDenomi_dVg *= T9;
9333  dDenomi_dVd *= T9;
9334  dDenomi_dVb *= T9;
9335  }
9336 
9337  ueff = ueff = u0temp / Denomi;
9338  T9 = -ueff / Denomi;
9339  dueff_dVg = T9 * dDenomi_dVg;
9340  dueff_dVd = T9 * dDenomi_dVd;
9341  dueff_dVb = T9 * dDenomi_dVb;
9342 
9343  // Saturation Drain Voltage Vdsat
9344  WVCox = Weff * vsattemp * model_.coxe;
9345  WVCoxRds = WVCox * Rds;
9346 
9347  Esat = 2.0 * vsattemp / ueff;
9348  EsatL = EsatL = Esat * Leff;
9349  T0 = -EsatL /ueff;
9350  dEsatL_dVg = T0 * dueff_dVg;
9351  dEsatL_dVd = T0 * dueff_dVd;
9352  dEsatL_dVb = T0 * dueff_dVb;
9353 
9354  // Sqrt()
9355  a1 = paramPtr->a1;
9356  if (a1 == 0.0)
9357  {
9358  Lambda = paramPtr->a2;
9359  dLambda_dVg = 0.0;
9360  }
9361  else if (a1 > 0.0)
9362  {
9363  T0 = 1.0 - paramPtr->a2;
9364  T1 = T0 - paramPtr->a1 * Vgsteff - 0.0001;
9365  T2 = sqrt(T1 * T1 + 0.0004 * T0);
9366  Lambda = paramPtr->a2 + T0 - 0.5 * (T1 + T2);
9367  dLambda_dVg = 0.5 * paramPtr->a1 * (1.0 + T1 / T2);
9368  }
9369  else
9370  {
9371  T1 = paramPtr->a2 + paramPtr->a1 * Vgsteff - 0.0001;
9372  T2 = sqrt(T1 * T1 + 0.0004 * paramPtr->a2);
9373  Lambda = 0.5 * (T1 + T2);
9374  dLambda_dVg = 0.5 * paramPtr->a1 * (1.0 + T1 / T2);
9375  }
9376 
9377  Vgst2Vtm = Vgsteff + 2.0 * Vtm;
9378  if (Rds > 0)
9379  {
9380  tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff;
9381  tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff;
9382  }
9383  else
9384  {
9385  tmp2 = dWeff_dVg / Weff;
9386  tmp3 = dWeff_dVb / Weff;
9387  }
9388  if ((Rds == 0.0) && (Lambda == 1.0))
9389  {
9390  T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm);
9391  tmp1 = 0.0;
9392  T1 = T0 * T0;
9393  T2 = Vgst2Vtm * T0;
9394  T3 = EsatL * Vgst2Vtm;
9395  Vdsat = T3 * T0;
9396 
9397  dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1;
9398  dT0_dVd = -(Abulk * dEsatL_dVd) * T1;
9399  dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1;
9400 
9401  dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0;
9402  dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd;
9403  dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb;
9404  }
9405  else
9406  {
9407  tmp1 = dLambda_dVg / (Lambda * Lambda);
9408  T9 = Abulk * WVCoxRds;
9409  T8 = Abulk * T9;
9410  T7 = Vgst2Vtm * T9;
9411  T6 = Vgst2Vtm * WVCoxRds;
9412  T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda);
9413  dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1
9414  + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg);
9415 
9416  dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3)
9417  + (1.0 / Lambda - 1.0) * dAbulk_dVb);
9418  dT0_dVd = 0.0;
9419  T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7;
9420 
9421  dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1
9422  + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9
9423  + T7 * tmp2 + T6 * dAbulk_dVg);
9424  dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb
9425  + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3);
9426  dT1_dVd = Abulk * dEsatL_dVd;
9427 
9428  T2 = Vgst2Vtm * (EsatL + 2.0 * T6);
9429  dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg
9430  + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2);
9431  dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3);
9432  dT2_dVd = Vgst2Vtm * dEsatL_dVd;
9433 
9434  T3 = sqrt(T1 * T1 - 2.0 * T0 * T2);
9435  Vdsat = (T1 - T3) / T0;
9436 
9437  dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg))
9438  / T3;
9439  dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd))
9440  / T3;
9441  dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb))
9442  / T3;
9443 
9444  dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2
9445  - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0;
9446  dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2
9447  - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0;
9448  dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0;
9449  }
9450  vdsat = Vdsat;
9451 
9452  // Calculate Vdseff
9453  T1 = Vdsat - Vds - paramPtr->delta;
9454  dT1_dVg = dVdsat_dVg;
9455  dT1_dVd = dVdsat_dVd - 1.0;
9456  dT1_dVb = dVdsat_dVb;
9457 
9458  T2 = sqrt(T1 * T1 + 4.0 * paramPtr->delta * Vdsat);
9459  T0 = T1 / T2;
9460  T9 = 2.0 * paramPtr->delta;
9461  T3 = T9 / T2;
9462  dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg;
9463  dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd;
9464  dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb;
9465 
9466  if (T1 >= 0.0)
9467  {
9468  Vdseff = Vdsat - 0.5 * (T1 + T2);
9469  dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg);
9470  dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd);
9471  dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb);
9472  }
9473  else
9474  {
9475  T4 = T9 / (T2 - T1);
9476  T5 = 1.0 - T4;
9477  T6 = Vdsat * T4 / (T2 - T1);
9478  Vdseff = Vdsat * T5;
9479  dVdseff_dVg = dVdsat_dVg * T5 + T6 * (dT2_dVg - dT1_dVg);
9480  dVdseff_dVd = dVdsat_dVd * T5 + T6 * (dT2_dVd - dT1_dVd);
9481  dVdseff_dVb = dVdsat_dVb * T5 + T6 * (dT2_dVb - dT1_dVb);
9482  }
9483 
9484  if (Vds == 0.0)
9485  {
9486  Vdseff = 0.0;
9487  dVdseff_dVg = 0.0;
9488  dVdseff_dVb = 0.0;
9489  }
9490 
9491  if (Vdseff > Vds)
9492  {
9493  Vdseff = Vds;
9494  }
9495 
9496  diffVds = Vds - Vdseff;
9497  Vdseff = Vdseff;
9498 
9499  // Velocity Overshoot
9500  if((model_.lambdaGiven) && (model_.lambda > 0.0) )
9501  {
9502  T1 = Leff * ueff;
9503  T2 = paramPtr->lambda / T1;
9504  T3 = -T2 / T1 * Leff;
9505  dT2_dVd = T3 * dueff_dVd;
9506  dT2_dVg = T3 * dueff_dVg;
9507  dT2_dVb = T3 * dueff_dVb;
9508  T5 = 1.0 / (Esat * paramPtr->litl);
9509  T4 = -T5 / EsatL;
9510  dT5_dVg = dEsatL_dVg * T4;
9511  dT5_dVd = dEsatL_dVd * T4;
9512  dT5_dVb = dEsatL_dVb * T4;
9513  T6 = 1.0 + diffVds * T5;
9514  dT6_dVg = dT5_dVg * diffVds - dVdseff_dVg * T5;
9515  dT6_dVd = dT5_dVd * diffVds + (1.0 - dVdseff_dVd) * T5;
9516  dT6_dVb = dT5_dVb * diffVds - dVdseff_dVb * T5;
9517  T7 = 2.0 / (T6 * T6 + 1.0);
9518  T8 = 1.0 - T7;
9519  T9 = T6 * T7 * T7;
9520  dT8_dVg = T9 * dT6_dVg;
9521  dT8_dVd = T9 * dT6_dVd;
9522  dT8_dVb = T9 * dT6_dVb;
9523  T10 = 1.0 + T2 * T8;
9524  dT10_dVg = dT2_dVg * T8 + T2 * dT8_dVg;
9525  dT10_dVd = dT2_dVd * T8 + T2 * dT8_dVd;
9526  dT10_dVb = dT2_dVb * T8 + T2 * dT8_dVb;
9527  if(T10 == 1.0)
9528  {
9529  dT10_dVg = dT10_dVd = dT10_dVb = 0.0;
9530  }
9531 
9532  dEsatL_dVg *= T10;
9533  dEsatL_dVg += EsatL * dT10_dVg;
9534  dEsatL_dVd *= T10;
9535  dEsatL_dVd += EsatL * dT10_dVd;
9536  dEsatL_dVb *= T10;
9537  dEsatL_dVb += EsatL * dT10_dVb;
9538  EsatL *= T10;
9539  EsatL = EsatL;
9540  }
9541 
9542  // Calculate Vasat
9543  tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm;
9544  T9 = WVCoxRds * Vgsteff;
9545  T8 = T9 / Vgst2Vtm;
9546  T0 = EsatL + Vdsat + 2.0 * T9 * tmp4;
9547 
9548  T7 = 2.0 * WVCoxRds * tmp4;
9549  dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff)
9550  - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm
9551  + Vdsat * dAbulk_dVg);
9552 
9553  dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff
9554  - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb);
9555  dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd;
9556 
9557  T9 = WVCoxRds * Abulk;
9558  T1 = 2.0 / Lambda - 1.0 + T9;
9559  dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg);
9560  dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3;
9561 
9562  Vasat = T0 / T1;
9563  dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1;
9564  dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1;
9565  dVasat_dVd = dT0_dVd / T1;
9566 
9567  // Calculate Idl first
9568  tmp1 = vtfbphi2;
9569  tmp2 = 2.0e8 * model_.toxp;
9570  dT0_dVg = 1.0 / tmp2;
9571  T0 = (Vgsteff + tmp1) * dT0_dVg;
9572 
9573  tmp3 = exp(model_.bdos * 0.7 * log(T0));
9574  T1 = 1.0 + tmp3;
9575  T2 = model_.bdos * 0.7 * tmp3 / T0;
9576  Tcen = model_.ados * 1.9e-9 / T1;
9577  dTcen_dVg = -Tcen * T2 * dT0_dVg / T1;
9578 
9579  Coxeff = epssub * model_.coxp / (epssub + model_.coxp * Tcen);
9580  dCoxeff_dVg = -Coxeff * Coxeff * dTcen_dVg / epssub;
9581 
9582  CoxeffWovL = Coxeff * Weff / Leff;
9583  beta = ueff * CoxeffWovL;
9584  T3 = ueff / Leff;
9585  dbeta_dVg = CoxeffWovL * dueff_dVg + T3
9586  * (Weff * dCoxeff_dVg + Coxeff * dWeff_dVg);
9587  dbeta_dVd = CoxeffWovL * dueff_dVd;
9588  dbeta_dVb = CoxeffWovL * dueff_dVb + T3 * Coxeff * dWeff_dVb;
9589 
9590  AbovVgst2Vtm = Abulk / Vgst2Vtm;
9591  T0 = 1.0 - 0.5 * Vdseff * AbovVgst2Vtm;
9592  dT0_dVg = -0.5 * (Abulk * dVdseff_dVg
9593  - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm;
9594  dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm;
9595  dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) / Vgst2Vtm;
9596 
9597  fgche1 = Vgsteff * T0;
9598  dfgche1_dVg = Vgsteff * dT0_dVg + T0;
9599  dfgche1_dVd = Vgsteff * dT0_dVd;
9600  dfgche1_dVb = Vgsteff * dT0_dVb;
9601 
9602  T9 = Vdseff / EsatL;
9603  fgche2 = 1.0 + T9;
9604  dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL;
9605  dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL;
9606  dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL;
9607 
9608  gche = beta * fgche1 / fgche2;
9609  dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg
9610  - gche * dfgche2_dVg) / fgche2;
9611  dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd
9612  - gche * dfgche2_dVd) / fgche2;
9613  dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb
9614  - gche * dfgche2_dVb) / fgche2;
9615 
9616  T0 = 1.0 + gche * Rds;
9617  Idl = gche / T0;
9618  T1 = (1.0 - Idl * Rds) / T0;
9619  T2 = Idl * Idl;
9620  dIdl_dVg = T1 * dgche_dVg - T2 * dRds_dVg;
9621  dIdl_dVd = T1 * dgche_dVd;
9622  dIdl_dVb = T1 * dgche_dVb - T2 * dRds_dVb;
9623 
9624  // Calculate degradation factor due to pocket implant
9625  if (paramPtr->fprout <= 0.0)
9626  {
9627  FP = 1.0;
9628  dFP_dVg = 0.0;
9629  }
9630  else
9631  {
9632  T9 = paramPtr->fprout * sqrt(Leff) / Vgst2Vtm;
9633  FP = 1.0 / (1.0 + T9);
9634  dFP_dVg = FP * FP * T9 / Vgst2Vtm;
9635  }
9636 
9637  // Calculate VACLM
9638  T8 = paramPtr->pvag / EsatL;
9639  T9 = T8 * Vgsteff;
9640  if (T9 > -0.9)
9641  {
9642  PvagTerm = 1.0 + T9;
9643  dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL);
9644  dPvagTerm_dVb = -T9 * dEsatL_dVb / EsatL;
9645  dPvagTerm_dVd = -T9 * dEsatL_dVd / EsatL;
9646  }
9647  else
9648  {
9649  T4 = 1.0 / (17.0 + 20.0 * T9);
9650  PvagTerm = (0.8 + T9) * T4;
9651  T4 *= T4;
9652  dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T4;
9653  T9 *= T4 / EsatL;
9654  dPvagTerm_dVb = -T9 * dEsatL_dVb;
9655  dPvagTerm_dVd = -T9 * dEsatL_dVd;
9656  }
9657 
9658  if ((paramPtr->pclm > CONSTMIN_EXP) && (diffVds > 1.0e-10))
9659  {
9660  T0 = 1.0 + Rds * Idl;
9661  dT0_dVg = dRds_dVg * Idl + Rds * dIdl_dVg;
9662  dT0_dVd = Rds * dIdl_dVd;
9663  dT0_dVb = dRds_dVb * Idl + Rds * dIdl_dVb;
9664 
9665  T2 = Vdsat / Esat;
9666  T1 = Leff + T2;
9667  dT1_dVg = (dVdsat_dVg - T2 * dEsatL_dVg / Leff) / Esat;
9668  dT1_dVd = (dVdsat_dVd - T2 * dEsatL_dVd / Leff) / Esat;
9669  dT1_dVb = (dVdsat_dVb - T2 * dEsatL_dVb / Leff) / Esat;
9670 
9671  Cclm = FP * PvagTerm * T0 * T1 / (paramPtr->pclm * paramPtr->litl);
9672  dCclm_dVg = Cclm * (dFP_dVg / FP + dPvagTerm_dVg / PvagTerm
9673  + dT0_dVg / T0 + dT1_dVg / T1);
9674  dCclm_dVb = Cclm * (dPvagTerm_dVb / PvagTerm + dT0_dVb / T0
9675  + dT1_dVb / T1);
9676  dCclm_dVd = Cclm * (dPvagTerm_dVd / PvagTerm + dT0_dVd / T0
9677  + dT1_dVd / T1);
9678  VACLM = Cclm * diffVds;
9679 
9680  dVACLM_dVg = dCclm_dVg * diffVds - dVdseff_dVg * Cclm;
9681  dVACLM_dVb = dCclm_dVb * diffVds - dVdseff_dVb * Cclm;
9682  dVACLM_dVd = dCclm_dVd * diffVds + (1.0 - dVdseff_dVd) * Cclm;
9683  }
9684  else
9685  {
9686  VACLM = Cclm = CONSTMAX_EXP;
9687  dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0;
9688  dCclm_dVd = dCclm_dVg = dCclm_dVb = 0.0;
9689  }
9690 
9691  // Calculate VADIBL
9693  {
9694  T8 = Abulk * Vdsat;
9695  T0 = Vgst2Vtm * T8;
9696  dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8
9697  + Vgst2Vtm * Vdsat * dAbulk_dVg;
9698  dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb);
9699  dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd;
9700 
9701  T1 = Vgst2Vtm + T8;
9702  dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg;
9703  dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat;
9704  dT1_dVd = Abulk * dVdsat_dVd;
9705 
9706  T9 = T1 * T1;
9707  T2 = paramPtr->thetaRout;
9708  VADIBL = (Vgst2Vtm - T0 / T1) / T2;
9709  dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2;
9710  dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2;
9711  dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2;
9712 
9713  T7 = paramPtr->pdiblb * Vbseff;
9714  if (T7 >= -0.9)
9715  {
9716  T3 = 1.0 / (1.0 + T7);
9717  VADIBL *= T3;
9718  dVADIBL_dVg *= T3;
9719  dVADIBL_dVb = (dVADIBL_dVb - VADIBL * paramPtr->pdiblb) * T3;
9720  dVADIBL_dVd *= T3;
9721  }
9722  else
9723  {
9724  T4 = 1.0 / (0.8 + T7);
9725  T3 = (17.0 + 20.0 * T7) * T4;
9726  dVADIBL_dVg *= T3;
9727  dVADIBL_dVb = dVADIBL_dVb * T3
9728  - VADIBL * paramPtr->pdiblb * T4 * T4;
9729  dVADIBL_dVd *= T3;
9730  VADIBL *= T3;
9731  }
9732 
9733  dVADIBL_dVg = dVADIBL_dVg * PvagTerm + VADIBL * dPvagTerm_dVg;
9734  dVADIBL_dVb = dVADIBL_dVb * PvagTerm + VADIBL * dPvagTerm_dVb;
9735  dVADIBL_dVd = dVADIBL_dVd * PvagTerm + VADIBL * dPvagTerm_dVd;
9736  VADIBL *= PvagTerm;
9737  }
9738  else
9739  {
9740  VADIBL = CONSTMAX_EXP;
9741  dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0;
9742  }
9743 
9744  // Calculate Va
9745  Va = Vasat + VACLM;
9746  dVa_dVg = dVasat_dVg + dVACLM_dVg;
9747  dVa_dVb = dVasat_dVb + dVACLM_dVb;
9748  dVa_dVd = dVasat_dVd + dVACLM_dVd;
9749 
9750  // Calculate VADITS
9751  T0 = paramPtr->pditsd * Vds;
9752  if (T0 > CONSTEXP_THRESHOLD)
9753  {
9754  T1 = CONSTMAX_EXP;
9755  dT1_dVd = 0;
9756  }
9757  else
9758  {
9759  T1 = exp(T0);
9760  dT1_dVd = T1 * paramPtr->pditsd;
9761  }
9762 
9763  if (paramPtr->pdits > CONSTMIN_EXP)
9764  {
9765  T2 = 1.0 + model_.pditsl * Leff;
9766  VADITS = (1.0 + T2 * T1) / paramPtr->pdits;
9767  dVADITS_dVg = VADITS * dFP_dVg;
9768  dVADITS_dVd = FP * T2 * dT1_dVd / paramPtr->pdits;
9769  VADITS *= FP;
9770  }
9771  else
9772  {
9773  VADITS = CONSTMAX_EXP;
9774  dVADITS_dVg = dVADITS_dVd = 0;
9775  }
9776 
9777  // Calculate VASCBE
9778  if (paramPtr->pscbe2 > 0.0)
9779  {
9780  if (diffVds > paramPtr->pscbe1 * paramPtr->litl / CONSTEXP_THRESHOLD)
9781  {
9782  T0 = paramPtr->pscbe1 * paramPtr->litl / diffVds;
9783  VASCBE = Leff * exp(T0) / paramPtr->pscbe2;
9784  T1 = T0 * VASCBE / diffVds;
9785  dVASCBE_dVg = T1 * dVdseff_dVg;
9786  dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd);
9787  dVASCBE_dVb = T1 * dVdseff_dVb;
9788  }
9789  else
9790  {
9791  VASCBE = CONSTMAX_EXP * Leff/paramPtr->pscbe2;
9792  dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0;
9793  }
9794  }
9795  else
9796  {
9797  VASCBE = CONSTMAX_EXP;
9798  dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0;
9799  }
9800 
9801  // Add DIBL to Ids
9802  T9 = diffVds / VADIBL;
9803  T0 = 1.0 + T9;
9804  Idsa = Idl * T0;
9805  dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVADIBL_dVg) / VADIBL;
9806  dIdsa_dVd = T0 * dIdl_dVd + Idl
9807  * (1.0 - dVdseff_dVd - T9 * dVADIBL_dVd) / VADIBL;
9808  dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVADIBL_dVb) / VADIBL;
9809 
9810  // Add DITS to Ids
9811  T9 = diffVds / VADITS;
9812  T0 = 1.0 + T9;
9813  dIdsa_dVg = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVADITS_dVg) / VADITS;
9814  dIdsa_dVd = T0 * dIdsa_dVd + Idsa * (1.0 - dVdseff_dVd - T9 * dVADITS_dVd) / VADITS;
9815  dIdsa_dVb = T0 * dIdsa_dVb - Idsa * dVdseff_dVb / VADITS;
9816  Idsa *= T0;
9817 
9818  // Add CLM to Ids
9819  T0 = log(Va / Vasat);
9820  dT0_dVg = dVa_dVg / Va - dVasat_dVg / Vasat;
9821  dT0_dVb = dVa_dVb / Va - dVasat_dVb / Vasat;
9822  dT0_dVd = dVa_dVd / Va - dVasat_dVd / Vasat;
9823  T1 = T0 / Cclm;
9824  T9 = 1.0 + T1;
9825  dT9_dVg = (dT0_dVg - T1 * dCclm_dVg) / Cclm;
9826  dT9_dVb = (dT0_dVb - T1 * dCclm_dVb) / Cclm;
9827  dT9_dVd = (dT0_dVd - T1 * dCclm_dVd) / Cclm;
9828 
9829  dIdsa_dVg = dIdsa_dVg * T9 + Idsa * dT9_dVg;
9830  dIdsa_dVb = dIdsa_dVb * T9 + Idsa * dT9_dVb;
9831  dIdsa_dVd = dIdsa_dVd * T9 + Idsa * dT9_dVd;
9832  Idsa *= T9;
9833 
9834  // Substrate current begins
9835  tmp = paramPtr->alpha0 + paramPtr->alpha1 * Leff;
9836  if ((tmp <= 0.0) || (paramPtr->beta0 <= 0.0))
9837  {
9838  Isub = Gbd = Gbb = Gbg = 0.0;
9839  }
9840  else
9841  {
9842  T2 = tmp / Leff;
9843  if (diffVds > paramPtr->beta0 / CONSTEXP_THRESHOLD)
9844  {
9845  T0 = -paramPtr->beta0 / diffVds;
9846  T1 = T2 * diffVds * exp(T0);
9847  T3 = T1 / diffVds * (T0 - 1.0);
9848  dT1_dVg = T3 * dVdseff_dVg;
9849  dT1_dVd = T3 * (dVdseff_dVd - 1.0);
9850  dT1_dVb = T3 * dVdseff_dVb;
9851  }
9852  else
9853  {
9854  T3 = T2 * CONSTMIN_EXP;
9855  T1 = T3 * diffVds;
9856  dT1_dVg = -T3 * dVdseff_dVg;
9857  dT1_dVd = T3 * (1.0 - dVdseff_dVd);
9858  dT1_dVb = -T3 * dVdseff_dVb;
9859  }
9860  T4 = Idsa * Vdseff;
9861  Isub = T1 * T4;
9862  Gbg = T1 * (dIdsa_dVg * Vdseff + Idsa * dVdseff_dVg)
9863  + T4 * dT1_dVg;
9864  Gbd = T1 * (dIdsa_dVd * Vdseff + Idsa * dVdseff_dVd)
9865  + T4 * dT1_dVd;
9866  Gbb = T1 * (dIdsa_dVb * Vdseff + Idsa * dVdseff_dVb)
9867  + T4 * dT1_dVb;
9868 
9869  Gbd += Gbg * dVgsteff_dVd;
9870  Gbb += Gbg * dVgsteff_dVb;
9871  Gbg *= dVgsteff_dVg;
9872  Gbb *= dVbseff_dVb;
9873  }
9874  csub = Isub;
9875  gbbs = Gbb;
9876  gbgs = Gbg;
9877  gbds = Gbd;
9878 
9879  // Add SCBE to Ids
9880  T9 = diffVds / VASCBE;
9881  T0 = 1.0 + T9;
9882  Ids = Idsa * T0;
9883 
9884  Gm = T0 * dIdsa_dVg - Idsa
9885  * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE;
9886  Gds = T0 * dIdsa_dVd + Idsa
9887  * (1.0 - dVdseff_dVd - T9 * dVASCBE_dVd) / VASCBE;
9888  Gmb = T0 * dIdsa_dVb - Idsa
9889  * (dVdseff_dVb + T9 * dVASCBE_dVb) / VASCBE;
9890 
9891 
9892  tmp1 = Gds + Gm * dVgsteff_dVd;
9893  tmp2 = Gmb + Gm * dVgsteff_dVb;
9894  tmp3 = Gm;
9895 
9896  Gm = (Ids * dVdseff_dVg + Vdseff * tmp3) * dVgsteff_dVg;
9897  Gds = Ids * (dVdseff_dVd + dVdseff_dVg * dVgsteff_dVd)
9898  + Vdseff * tmp1;
9899  Gmb = (Ids * (dVdseff_dVb + dVdseff_dVg * dVgsteff_dVb)
9900  + Vdseff * tmp2) * dVbseff_dVb;
9901 
9902  cdrain = Ids * Vdseff;
9903 
9904  // Source End Velocity Limit
9905  if((model_.vtlGiven) && (model_.vtl > 0.0) )
9906  {
9907  T12 = 1.0 / Leff / CoxeffWovL;
9908  T11 = T12 / Vgsteff;
9909  T10 = -T11 / Vgsteff;
9910  vs = cdrain * T11; // vs
9911  dvs_dVg = Gm * T11 + cdrain * T10 * dVgsteff_dVg;
9912  dvs_dVd = Gds * T11 + cdrain * T10 * dVgsteff_dVd;
9913  dvs_dVb = Gmb * T11 + cdrain * T10 * dVgsteff_dVb;
9914  T0 = 2 * CONSTMM;
9915  T1 = vs / (paramPtr->vtl * paramPtr->tfactor);
9916 
9917  if(T1 > 0.0)
9918  {
9919  T2 = 1.0 + exp(T0 * log(T1));
9920  T3 = (T2 - 1.0) * T0 / vs;
9921  Fsevl = 1.0 / exp(log(T2)/ T0);
9922  dT2_dVg = T3 * dvs_dVg;
9923  dT2_dVd = T3 * dvs_dVd;
9924  dT2_dVb = T3 * dvs_dVb;
9925  T4 = -1.0 / T0 * Fsevl / T2;
9926  dFsevl_dVg = T4 * dT2_dVg;
9927  dFsevl_dVd = T4 * dT2_dVd;
9928  dFsevl_dVb = T4 * dT2_dVb;
9929  }
9930  else
9931  {
9932  Fsevl = 1.0;
9933  dFsevl_dVg = 0.0;
9934  dFsevl_dVd = 0.0;
9935  dFsevl_dVb = 0.0;
9936  }
9937  Gm *=Fsevl;
9938  Gm += cdrain * dFsevl_dVg;
9939  Gmb *=Fsevl;
9940  Gmb += cdrain * dFsevl_dVb;
9941  Gds *=Fsevl;
9942  Gds += cdrain * dFsevl_dVd;
9943 
9944  cdrain *= Fsevl;
9945  }
9946 
9947  gds = Gds;
9948  gm = Gm;
9949  gmbs = Gmb;
9950  IdovVds = Ids;
9951  if( IdovVds <= 1.0e-9) IdovVds = 1.0e-9;
9952 
9953  // Calculate Rg
9954  if ((rgateMod > 1) || (trnqsMod != 0) || (acnqsMod != 0))
9955  {
9956  T9 = paramPtr->xrcrg2 * model_.vtm;
9957  T0 = T9 * beta;
9958  dT0_dVd = (dbeta_dVd + dbeta_dVg * dVgsteff_dVd) * T9;
9959  dT0_dVb = (dbeta_dVb + dbeta_dVg * dVgsteff_dVb) * T9;
9960  dT0_dVg = dbeta_dVg * T9;
9961 
9962  gcrg = paramPtr->xrcrg1 * ( T0 + Ids);
9963  gcrgd = paramPtr->xrcrg1 * (dT0_dVd + tmp1);
9964  gcrgb = paramPtr->xrcrg1 * (dT0_dVb + tmp2)
9965  * dVbseff_dVb;
9966  gcrgg = paramPtr->xrcrg1 * (dT0_dVg + tmp3)
9967  * dVgsteff_dVg;
9968 
9969  if (nf != 1.0)
9970  {
9971  gcrg *= nf;
9972  gcrgg *= nf;
9973  gcrgd *= nf;
9974  gcrgb *= nf;
9975  }
9976 
9977  if (rgateMod == 2)
9978  {
9979  T10 = grgeltd * grgeltd;
9980  T11 = grgeltd + gcrg;
9981  gcrg = grgeltd * gcrg / T11;
9982  T12 = T10 / T11 / T11;
9983  gcrgg *= T12;
9984  gcrgd *= T12;
9985  gcrgb *= T12;
9986  }
9987  gcrgs = -(gcrgg + gcrgd + gcrgb);
9988  }
9989 
9990  // Calculate bias-dependent external S/D resistance
9991  if (model_.rdsMod)
9992  { // Rs(V)
9993  T0 = vgs - paramPtr->vfbsd;
9994  T1 = sqrt(T0 * T0 + 1.0e-4);
9995  vgs_eff = 0.5 * (T0 + T1);
9996  dvgs_eff_dvg = vgs_eff / T1;
9997 
9998  T0 = 1.0 + paramPtr->prwg * vgs_eff;
9999  dT0_dvg = -paramPtr->prwg / T0 / T0 * dvgs_eff_dvg;
10000  T1 = -paramPtr->prwb * vbs;
10001  dT1_dvb = -paramPtr->prwb;
10002 
10003  T2 = 1.0 / T0 + T1;
10004  T3 = T2 + sqrt(T2 * T2 + 0.01);
10005  dT3_dvg = T3 / (T3 - T2);
10006  dT3_dvb = dT3_dvg * dT1_dvb;
10007  dT3_dvg *= dT0_dvg;
10008 
10009  T4 = paramPtr->rs0 * 0.5;
10010  Rs = paramPtr->rswmin + T3 * T4;
10011  dRs_dvg = T4 * dT3_dvg;
10012  dRs_dvb = T4 * dT3_dvb;
10013 
10014  T0 = 1.0 + sourceConductance * Rs;
10016  T0 = -gstot * gstot;
10017  dgstot_dvd = 0.0; // place holder
10018  dgstot_dvg = T0 * dRs_dvg;
10019  dgstot_dvb = T0 * dRs_dvb;
10020  dgstot_dvs = -(dgstot_dvg + dgstot_dvb + dgstot_dvd);
10021 
10022  // Rd(V)
10023  T0 = vgd - paramPtr->vfbsd;
10024  T1 = sqrt(T0 * T0 + 1.0e-4);
10025  vgd_eff = 0.5 * (T0 + T1);
10026  dvgd_eff_dvg = vgd_eff / T1;
10027 
10028  T0 = 1.0 + paramPtr->prwg * vgd_eff;
10029  dT0_dvg = -paramPtr->prwg / T0 / T0 * dvgd_eff_dvg;
10030  T1 = -paramPtr->prwb * vbd;
10031  dT1_dvb = -paramPtr->prwb;
10032 
10033  T2 = 1.0 / T0 + T1;
10034  T3 = T2 + sqrt(T2 * T2 + 0.01);
10035  dT3_dvg = T3 / (T3 - T2);
10036  dT3_dvb = dT3_dvg * dT1_dvb;
10037  dT3_dvg *= dT0_dvg;
10038 
10039  T4 = paramPtr->rd0 * 0.5;
10040  Rd = paramPtr->rdwmin + T3 * T4;
10041  dRd_dvg = T4 * dT3_dvg;
10042  dRd_dvb = T4 * dT3_dvb;
10043 
10044  T0 = 1.0 + drainConductance * Rd;
10046  T0 = -gdtot * gdtot;
10047  dgdtot_dvs = 0.0;
10048  dgdtot_dvg = T0 * dRd_dvg;
10049  dgdtot_dvb = T0 * dRd_dvb;
10050  dgdtot_dvd = -(dgdtot_dvg + dgdtot_dvb + dgdtot_dvs);
10051 
10052  gstotd = vses * dgstot_dvd;
10053  gstotg = vses * dgstot_dvg;
10054  gstots = vses * dgstot_dvs;
10055  gstotb = vses * dgstot_dvb;
10056 
10057  T2 = vdes - vds;
10058  gdtotd = T2 * dgdtot_dvd;
10059  gdtotg = T2 * dgdtot_dvg;
10060  gdtots = T2 * dgdtot_dvs;
10061  gdtotb = T2 * dgdtot_dvb;
10062  }
10063  else // WDLiu: for bypass
10064  {
10065  gstot = gstotd = gstotg = 0.0;
10066  gstots = gstotb = 0.0;
10067  gdtot = gdtotd = gdtotg = 0.0;
10068  gdtots = gdtotb = 0.0;
10069  }
10070 
10071  // Calculate GIDL current
10072  vgs_eff = vgs_eff;
10074  if (model_.mtrlMod == 0)
10075  {
10076  T0 = 3.0 * toxe;
10077  }
10078  else
10079  {
10080  T0 = model_.epsrsub * toxe / epsrox;
10081  }
10082 
10083  if(model_.mtrlMod ==0)
10084  T1 = (vds - vgs_eff - paramPtr->egidl ) / T0;
10085  else
10086  T1 = (vds - vgs_eff - paramPtr->egidl + paramPtr->vfbsd) / T0;
10087 
10088  if ((paramPtr->agidl <= 0.0) || (paramPtr->bgidl <= 0.0)
10089  || (T1 <= 0.0) || (paramPtr->cgidl <= 0.0) || (vbd > 0.0))
10090  {
10091  Igidl = Ggidld = Ggidlg = Ggidlb = 0.0;
10092  }
10093  else
10094  {
10095  dT1_dVd = 1.0 / T0;
10096  dT1_dVg = -dvgs_eff_dvg * dT1_dVd;
10097  T2 = paramPtr->bgidl / T1;
10098  if (T2 < 100.0)
10099  {
10100  Igidl = paramPtr->agidl * paramPtr->weffCJ * T1 * exp(-T2);
10101  T3 = Igidl * (1.0 + T2) / T1;
10102  Ggidld = T3 * dT1_dVd;
10103  Ggidlg = T3 * dT1_dVg;
10104  }
10105  else
10106  {
10107  Igidl = paramPtr->agidl * paramPtr->weffCJ * 3.720075976e-44;
10108  Ggidld = Igidl * dT1_dVd;
10109  Ggidlg = Igidl * dT1_dVg;
10110  Igidl *= T1;
10111  }
10112 
10113  T4 = vbd * vbd;
10114  T5 = -vbd * T4;
10115  T6 = paramPtr->cgidl + T5;
10116  T7 = T5 / T6;
10117  T8 = 3.0 * paramPtr->cgidl * T4 / T6 / T6;
10118  Ggidld = Ggidld * T7 + Igidl * T8;
10119  Ggidlg = Ggidlg * T7;
10120  Ggidlb = -Igidl * T8;
10121  Igidl *= T7;
10122  }
10123  Igidl = Igidl;
10124  ggidld = Ggidld;
10125  ggidlg = Ggidlg;
10126  ggidlb = Ggidlb;
10127 
10128  // Calculate GISL current
10129  vgd_eff = vgd_eff;
10131 
10132  if (model_.mtrlMod == 0)
10133  {
10134  T1 = (-vds - vgd_eff - paramPtr->egisl ) / T0;
10135  }
10136  else
10137  {
10138  T1 = (-vds - vgd_eff - paramPtr->egisl + paramPtr->vfbsd ) / T0;
10139  }
10140 
10141  if ((paramPtr->agisl <= 0.0) || (paramPtr->bgisl <= 0.0)
10142  || (T1 <= 0.0) || (paramPtr->cgisl <= 0.0) || (vbs > 0.0))
10143  {
10144  Igisl = Ggisls = Ggislg = Ggislb = 0.0;
10145  }
10146  else
10147  {
10148  dT1_dVd = 1.0 / T0;
10149  dT1_dVg = -dvgd_eff_dvg * dT1_dVd;
10150  T2 = paramPtr->bgisl / T1;
10151  if (T2 < 100.0)
10152  {
10153  Igisl = paramPtr->agisl * paramPtr->weffCJ * T1 * exp(-T2);
10154  T3 = Igisl * (1.0 + T2) / T1;
10155  Ggisls = T3 * dT1_dVd;
10156  Ggislg = T3 * dT1_dVg;
10157  }
10158  else
10159  {
10160  Igisl = paramPtr->agisl * paramPtr->weffCJ * 3.720075976e-44;
10161  Ggisls = Igisl * dT1_dVd;
10162  Ggislg = Igisl * dT1_dVg;
10163  Igisl *= T1;
10164  }
10165 
10166  T4 = vbs * vbs;
10167  T5 = -vbs * T4;
10168  T6 = paramPtr->cgisl + T5;
10169  T7 = T5 / T6;
10170  T8 = 3.0 * paramPtr->cgisl * T4 / T6 / T6;
10171  Ggisls = Ggisls * T7 + Igisl * T8;
10172  Ggislg = Ggislg * T7;
10173  Ggislb = -Igisl * T8;
10174  Igisl *= T7;
10175  }
10176  Igisl = Igisl;
10177  ggisls = Ggisls;
10178  ggislg = Ggislg;
10179  ggislb = Ggislb;
10180 
10181 
10182  // Calculate gate tunneling current
10183  if ((model_.igcMod != 0) || (model_.igbMod != 0))
10184  {
10185  Vfb = vfbzb;
10186  V3 = Vfb - Vgs_eff + Vbseff - CONSTDELTA_3;
10187  if (Vfb <= 0.0)
10188  T0 = sqrt(V3 * V3 - 4.0 * CONSTDELTA_3 * Vfb);
10189  else
10190  T0 = sqrt(V3 * V3 + 4.0 * CONSTDELTA_3 * Vfb);
10191  T1 = 0.5 * (1.0 + V3 / T0);
10192  Vfbeff = Vfb - 0.5 * (V3 + T0);
10193  dVfbeff_dVg = T1 * dVgs_eff_dVg;
10194  dVfbeff_dVb = -T1; // WDLiu: -No surprise? No. -Good!
10195 
10196  Voxacc = Vfb - Vfbeff;
10197  dVoxacc_dVg = -dVfbeff_dVg;
10198  dVoxacc_dVb = -dVfbeff_dVb;
10199  if (Voxacc < 0.0) // WDLiu: Avoiding numerical instability.
10200  {
10201  Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0;
10202  }
10203 
10204  T0 = 0.5 * paramPtr->k1ox;
10205  T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff;
10206  if (paramPtr->k1ox == 0.0)
10207  {
10208  Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd = dVoxdepinv_dVb = 0.0;
10209  }
10210  else if (T3 < 0.0)
10211  {
10212  Voxdepinv = -T3;
10213  dVoxdepinv_dVg = -dVgs_eff_dVg + dVfbeff_dVg + dVgsteff_dVg;
10214  dVoxdepinv_dVd = dVgsteff_dVd;
10215  dVoxdepinv_dVb = dVfbeff_dVb + 1.0 + dVgsteff_dVb;
10216  }
10217  else
10218  {
10219  T1 = sqrt(T0 * T0 + T3);
10220  T2 = T0 / T1;
10221  Voxdepinv = paramPtr->k1ox * (T1 - T0);
10222  dVoxdepinv_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg);
10223  dVoxdepinv_dVd = -T2 * dVgsteff_dVd;
10224  dVoxdepinv_dVb = -T2 * (dVfbeff_dVb + 1.0 + dVgsteff_dVb);
10225  }
10226 
10227  Voxdepinv += Vgsteff;
10228  dVoxdepinv_dVg += dVgsteff_dVg;
10229  dVoxdepinv_dVd += dVgsteff_dVd;
10230  dVoxdepinv_dVb += dVgsteff_dVb;
10231  }
10232 
10233  if(model_.tempMod < 2)
10234  {
10235  tmp = Vtm;
10236  }
10237  else // model_.tempMod = 2
10238  {
10239  tmp = Vtm0;
10240  }
10241 
10242  if (model_.igcMod)
10243  {
10244  T0 = tmp * paramPtr->nigc;
10245  if(model_.igcMod == 1)
10246  {
10247  VxNVt = (Vgs_eff - model_.dtype * vth0) / T0;
10248  if (VxNVt > CONSTEXP_THRESHOLD)
10249  {
10250  Vaux = Vgs_eff - model_.dtype * vth0;
10251  dVaux_dVg = dVgs_eff_dVg;
10252  dVaux_dVd = 0.0;
10253  dVaux_dVb = 0.0;
10254  }
10255  }
10256  else if (model_.igcMod == 2)
10257  {
10258  VxNVt = (Vgs_eff - von) / T0;
10259  if (VxNVt > CONSTEXP_THRESHOLD)
10260  {
10261  Vaux = Vgs_eff - von;
10262  dVaux_dVg = dVgs_eff_dVg;
10263  dVaux_dVd = -dVth_dVd;
10264  dVaux_dVb = -dVth_dVb;
10265  }
10266  }
10267 
10268  if (VxNVt < -CONSTEXP_THRESHOLD)
10269  {
10270  Vaux = T0 * log(1.0 + CONSTMIN_EXP);
10271  dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0;
10272  }
10273  else if ((VxNVt >= -CONSTEXP_THRESHOLD) && (VxNVt <= CONSTEXP_THRESHOLD))
10274  {
10275  ExpVxNVt = exp(VxNVt);
10276  Vaux = T0 * log(1.0 + ExpVxNVt);
10277  dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt);
10278  if(model_.igcMod == 1)
10279  {
10280  dVaux_dVd = 0.0;
10281  dVaux_dVb = 0.0;
10282  }
10283  else if (model_.igcMod == 2)
10284  {
10285  dVaux_dVd = -dVgs_eff_dVg * dVth_dVd;
10286  dVaux_dVb = -dVgs_eff_dVg * dVth_dVb;
10287  }
10288  dVaux_dVg *= dVgs_eff_dVg;
10289  }
10290 
10291  T2 = Vgs_eff * Vaux;
10292  dT2_dVg = dVgs_eff_dVg * Vaux + Vgs_eff * dVaux_dVg;
10293  dT2_dVd = Vgs_eff * dVaux_dVd;
10294  dT2_dVb = Vgs_eff * dVaux_dVb;
10295 
10296  T11 = paramPtr->Aechvb;
10297  T12 = paramPtr->Bechvb;
10298  T3 = paramPtr->aigc * paramPtr->cigc
10299  - paramPtr->bigc;
10300  T4 = paramPtr->bigc * paramPtr->cigc;
10301  T5 = T12 * (paramPtr->aigc + T3 * Voxdepinv
10302  - T4 * Voxdepinv * Voxdepinv);
10303 
10304  if (T5 > CONSTEXP_THRESHOLD)
10305  {
10306  T6 = CONSTMAX_EXP;
10307  dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10308  }
10309  else if (T5 < -CONSTEXP_THRESHOLD)
10310  {
10311  T6 = CONSTMIN_EXP;
10312  dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10313  }
10314  else
10315  {
10316  T6 = exp(T5);
10317  dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv);
10318  dT6_dVd = dT6_dVg * dVoxdepinv_dVd;
10319  dT6_dVb = dT6_dVg * dVoxdepinv_dVb;
10320  dT6_dVg *= dVoxdepinv_dVg;
10321  }
10322 
10323  Igc = T11 * T2 * T6;
10324  dIgc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10325  dIgc_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd);
10326  dIgc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb);
10327 
10328  if (model_.pigcdGiven)
10329  {
10330  Pigcd = paramPtr->pigcd;
10331  dPigcd_dVg = dPigcd_dVd = dPigcd_dVb = 0.0;
10332  }
10333  else
10334  {
10335  T11 = paramPtr->Bechvb * toxe;
10336  T12 = Vgsteff + 1.0e-20;
10337  T13 = T11 / T12 / T12;
10338  T14 = -T13 / T12;
10339  Pigcd = T13 * (1.0 - 0.5 * Vdseff / T12);
10340  dPigcd_dVg = T14 * (2.0 + 0.5 * (dVdseff_dVg
10341  - 3.0 * Vdseff / T12));
10342  dPigcd_dVd = 0.5 * T14 * dVdseff_dVd;
10343  dPigcd_dVb = 0.5 * T14 * dVdseff_dVb;
10344  }
10345 
10346  T7 = -Pigcd * Vdseff; // bugfix
10347  dT7_dVg = -Vdseff * dPigcd_dVg - Pigcd * dVdseff_dVg;
10348  dT7_dVd = -Vdseff * dPigcd_dVd - Pigcd * dVdseff_dVd + dT7_dVg * dVgsteff_dVd;
10349  dT7_dVb = -Vdseff * dPigcd_dVb - Pigcd * dVdseff_dVb + dT7_dVg * dVgsteff_dVb;
10350  dT7_dVg *= dVgsteff_dVg;
10351  dT7_dVb *= dVbseff_dVb;
10352  T8 = T7 * T7 + 2.0e-4;
10353  dT8_dVg = 2.0 * T7;
10354  dT8_dVd = dT8_dVg * dT7_dVd;
10355  dT8_dVb = dT8_dVg * dT7_dVb;
10356  dT8_dVg *= dT7_dVg;
10357 
10358  if (T7 > CONSTEXP_THRESHOLD)
10359  {
10360  T9 = CONSTMAX_EXP;
10361  dT9_dVg = dT9_dVd = dT9_dVb = 0.0;
10362  }
10363  else if (T7 < -CONSTEXP_THRESHOLD)
10364  {
10365  T9 = CONSTMIN_EXP;
10366  dT9_dVg = dT9_dVd = dT9_dVb = 0.0;
10367  }
10368  else
10369  {
10370  T9 = exp(T7);
10371  dT9_dVg = T9 * dT7_dVg;
10372  dT9_dVd = T9 * dT7_dVd;
10373  dT9_dVb = T9 * dT7_dVb;
10374  }
10375 
10376  T0 = T8 * T8;
10377  T1 = T9 - 1.0 + 1.0e-4;
10378  T10 = (T1 - T7) / T8;
10379  dT10_dVg = (dT9_dVg - dT7_dVg - T10 * dT8_dVg) / T8;
10380  dT10_dVd = (dT9_dVd - dT7_dVd - T10 * dT8_dVd) / T8;
10381  dT10_dVb = (dT9_dVb - dT7_dVb - T10 * dT8_dVb) / T8;
10382 
10383  Igcs = Igc * T10;
10384  dIgcs_dVg = dIgc_dVg * T10 + Igc * dT10_dVg;
10385  dIgcs_dVd = dIgc_dVd * T10 + Igc * dT10_dVd;
10386  dIgcs_dVb = dIgc_dVb * T10 + Igc * dT10_dVb;
10387 
10388  T1 = T9 - 1.0 - 1.0e-4;
10389  T10 = (T7 * T9 - T1) / T8;
10390  dT10_dVg = (dT7_dVg * T9 + (T7 - 1.0) * dT9_dVg
10391  - T10 * dT8_dVg) / T8;
10392  dT10_dVd = (dT7_dVd * T9 + (T7 - 1.0) * dT9_dVd
10393  - T10 * dT8_dVd) / T8;
10394  dT10_dVb = (dT7_dVb * T9 + (T7 - 1.0) * dT9_dVb
10395  - T10 * dT8_dVb) / T8;
10396  Igcd = Igc * T10;
10397  dIgcd_dVg = dIgc_dVg * T10 + Igc * dT10_dVg;
10398  dIgcd_dVd = dIgc_dVd * T10 + Igc * dT10_dVd;
10399  dIgcd_dVb = dIgc_dVb * T10 + Igc * dT10_dVb;
10400 
10401  // Igcs = Igcs;
10402  gIgcsg = dIgcs_dVg;
10403  gIgcsd = dIgcs_dVd;
10404  gIgcsb = dIgcs_dVb * dVbseff_dVb;
10405  // Igcd = Igcd;
10406  gIgcdg = dIgcd_dVg;
10407  gIgcdd = dIgcd_dVd;
10408  gIgcdb = dIgcd_dVb * dVbseff_dVb;
10409 
10410  T0 = vgs - (paramPtr->vfbsd + paramPtr->vfbsdoff);
10411  vgs_eff = sqrt(T0 * T0 + 1.0e-4);
10412  dvgs_eff_dvg = T0 / vgs_eff;
10413 
10414  T2 = vgs * vgs_eff;
10415  dT2_dVg = vgs * dvgs_eff_dvg + vgs_eff;
10416  T11 = paramPtr->AechvbEdgeS;
10417  T12 = paramPtr->BechvbEdge;
10418  T3 = paramPtr->aigs * paramPtr->cigs
10419  - paramPtr->bigs;
10420  T4 = paramPtr->bigs * paramPtr->cigs;
10421  T5 = T12 * (paramPtr->aigs + T3 * vgs_eff
10422  - T4 * vgs_eff * vgs_eff);
10423  if (T5 > CONSTEXP_THRESHOLD)
10424  {
10425  T6 = CONSTMAX_EXP;
10426  dT6_dVg = 0.0;
10427  }
10428  else if (T5 < -CONSTEXP_THRESHOLD)
10429  {
10430  T6 = CONSTMIN_EXP;
10431  dT6_dVg = 0.0;
10432  }
10433  else
10434  {
10435  T6 = exp(T5);
10436  dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgs_eff)
10437  * dvgs_eff_dvg;
10438  }
10439  Igs = T11 * T2 * T6;
10440  dIgs_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10441  dIgs_dVs = -dIgs_dVg;
10442 
10443  T0 = vgd - (paramPtr->vfbsd + paramPtr->vfbsdoff);
10444  vgd_eff = sqrt(T0 * T0 + 1.0e-4);
10445  dvgd_eff_dvg = T0 / vgd_eff;
10446 
10447  T2 = vgd * vgd_eff;
10448  dT2_dVg = vgd * dvgd_eff_dvg + vgd_eff;
10449  T11 = paramPtr->AechvbEdgeD;
10450  T3 = paramPtr->aigd * paramPtr->cigd
10451  - paramPtr->bigd;
10452  T4 = paramPtr->bigd * paramPtr->cigd;
10453  T5 = T12 * (paramPtr->aigd + T3 * vgd_eff
10454  - T4 * vgd_eff * vgd_eff);
10455  if (T5 > CONSTEXP_THRESHOLD)
10456  {
10457  T6 = CONSTMAX_EXP;
10458  dT6_dVg = 0.0;
10459  }
10460  else if (T5 < -CONSTEXP_THRESHOLD)
10461  {
10462  T6 = CONSTMIN_EXP;
10463  dT6_dVg = 0.0;
10464  }
10465  else
10466  {
10467  T6 = exp(T5);
10468  dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgd_eff) * dvgd_eff_dvg;
10469  }
10470  Igd = T11 * T2 * T6;
10471  dIgd_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10472  dIgd_dVd = -dIgd_dVg;
10473 
10474  //Igs = Igs;
10475  gIgsg = dIgs_dVg;
10476  gIgss = dIgs_dVs;
10477  //Igd = Igd;
10478  gIgdg = dIgd_dVg;
10479  gIgdd = dIgd_dVd;
10480 
10481  }
10482  else
10483  {
10484  Igcs = gIgcsg = gIgcsd = gIgcsb = 0.0;
10485  Igcd = gIgcdg = gIgcdd = gIgcdb = 0.0;
10486  Igs = gIgsg = gIgss = 0.0;
10487  Igd = gIgdg = gIgdd = 0.0;
10488  }
10489 
10490  if (model_.igbMod)
10491  {
10492  T0 = tmp * paramPtr->nigbacc;
10493  T1 = -Vgs_eff + Vbseff + Vfb;
10494  VxNVt = T1 / T0;
10495  if (VxNVt > CONSTEXP_THRESHOLD)
10496  {
10497  Vaux = T1;
10498  dVaux_dVg = -dVgs_eff_dVg;
10499  dVaux_dVb = 1.0;
10500  }
10501  else if (VxNVt < -CONSTEXP_THRESHOLD)
10502  {
10503  Vaux = T0 * log(1.0 + CONSTMIN_EXP);
10504  dVaux_dVg = dVaux_dVb = 0.0;
10505  }
10506  else
10507  {
10508  ExpVxNVt = exp(VxNVt);
10509  Vaux = T0 * log(1.0 + ExpVxNVt);
10510  dVaux_dVb = ExpVxNVt / (1.0 + ExpVxNVt);
10511  dVaux_dVg = -dVaux_dVb * dVgs_eff_dVg;
10512  }
10513 
10514  T2 = (Vgs_eff - Vbseff) * Vaux;
10515  dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg;
10516  dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb;
10517 
10518  T11 = 4.97232e-7 * paramPtr->weff
10520  T12 = -7.45669e11 * toxe;
10521  T3 = paramPtr->aigbacc * paramPtr->cigbacc
10522  - paramPtr->bigbacc;
10523  T4 = paramPtr->bigbacc * paramPtr->cigbacc;
10524  T5 = T12 * (paramPtr->aigbacc + T3 * Voxacc
10525  - T4 * Voxacc * Voxacc);
10526 
10527  if (T5 > CONSTEXP_THRESHOLD)
10528  {
10529  T6 = CONSTMAX_EXP;
10530  dT6_dVg = dT6_dVb = 0.0;
10531  }
10532  else if (T5 < -CONSTEXP_THRESHOLD)
10533  {
10534  T6 = CONSTMIN_EXP;
10535  dT6_dVg = dT6_dVb = 0.0;
10536  }
10537  else
10538  {
10539  T6 = exp(T5);
10540  dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxacc);
10541  dT6_dVb = dT6_dVg * dVoxacc_dVb;
10542  dT6_dVg *= dVoxacc_dVg;
10543  }
10544 
10545  Igbacc = T11 * T2 * T6;
10546  dIgbacc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10547  dIgbacc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb);
10548 
10549 
10550  T0 = tmp * paramPtr->nigbinv;
10551  T1 = Voxdepinv - paramPtr->eigbinv;
10552  VxNVt = T1 / T0;
10553  if (VxNVt > CONSTEXP_THRESHOLD)
10554  {
10555  Vaux = T1;
10556  dVaux_dVg = dVoxdepinv_dVg;
10557  dVaux_dVd = dVoxdepinv_dVd;
10558  dVaux_dVb = dVoxdepinv_dVb;
10559  }
10560  else if (VxNVt < -CONSTEXP_THRESHOLD)
10561  {
10562  Vaux = T0 * log(1.0 + CONSTMIN_EXP);
10563  dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0;
10564  }
10565  else
10566  {
10567  ExpVxNVt = exp(VxNVt);
10568  Vaux = T0 * log(1.0 + ExpVxNVt);
10569  dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt);
10570  dVaux_dVd = dVaux_dVg * dVoxdepinv_dVd;
10571  dVaux_dVb = dVaux_dVg * dVoxdepinv_dVb;
10572  dVaux_dVg *= dVoxdepinv_dVg;
10573  }
10574 
10575  T2 = (Vgs_eff - Vbseff) * Vaux;
10576  dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg;
10577  dT2_dVd = (Vgs_eff - Vbseff) * dVaux_dVd;
10578  dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb;
10579 
10580  T11 *= 0.75610;
10581  T12 *= 1.31724;
10582  T3 = paramPtr->aigbinv * paramPtr->cigbinv
10583  - paramPtr->bigbinv;
10584  T4 = paramPtr->bigbinv * paramPtr->cigbinv;
10585  T5 = T12 * (paramPtr->aigbinv + T3 * Voxdepinv
10586  - T4 * Voxdepinv * Voxdepinv);
10587 
10588  if (T5 > CONSTEXP_THRESHOLD)
10589  {
10590  T6 = CONSTMAX_EXP;
10591  dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10592  }
10593  else if (T5 < -CONSTEXP_THRESHOLD)
10594  {
10595  T6 = CONSTMIN_EXP;
10596  dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10597  }
10598  else
10599  {
10600  T6 = exp(T5);
10601  dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv);
10602  dT6_dVd = dT6_dVg * dVoxdepinv_dVd;
10603  dT6_dVb = dT6_dVg * dVoxdepinv_dVb;
10604  dT6_dVg *= dVoxdepinv_dVg;
10605  }
10606 
10607  Igbinv = T11 * T2 * T6;
10608  dIgbinv_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10609  dIgbinv_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd);
10610  dIgbinv_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb);
10611 
10612  Igb = Igbinv + Igbacc;
10613  gIgbg = dIgbinv_dVg + dIgbacc_dVg;
10614  gIgbd = dIgbinv_dVd;
10615  gIgbb = (dIgbinv_dVb + dIgbacc_dVb) * dVbseff_dVb;
10616  }
10617  else
10618  {
10619  Igb = gIgbg = gIgbd = gIgbs = gIgbb = 0.0;
10620  } // End of Gate current
10621 
10622  if (nf != 1.0)
10623  {
10624  cdrain *= nf;
10625  gds *= nf;
10626  gm *= nf;
10627  gmbs *= nf;
10628  IdovVds *= nf;
10629 
10630  gbbs *= nf;
10631  gbgs *= nf;
10632  gbds *= nf;
10633  csub *= nf;
10634 
10635  Igidl *= nf;
10636  ggidld *= nf;
10637  ggidlg *= nf;
10638  ggidlb *= nf;
10639 
10640  Igisl *= nf;
10641  ggisls *= nf;
10642  ggislg *= nf;
10643  ggislb *= nf;
10644 
10645  Igcs *= nf;
10646  gIgcsg *= nf;
10647  gIgcsd *= nf;
10648  gIgcsb *= nf;
10649  Igcd *= nf;
10650  gIgcdg *= nf;
10651  gIgcdd *= nf;
10652  gIgcdb *= nf;
10653 
10654  Igs *= nf;
10655  gIgsg *= nf;
10656  gIgss *= nf;
10657  Igd *= nf;
10658  gIgdg *= nf;
10659  gIgdd *= nf;
10660 
10661  Igb *= nf;
10662  gIgbg *= nf;
10663  gIgbd *= nf;
10664  gIgbb *= nf;
10665  }
10666 
10667  ggidls = -(ggidld + ggidlg + ggidlb);
10668  ggisld = -(ggisls + ggislg + ggislb);
10669  gIgbs = -(gIgbg + gIgbd + gIgbb);
10670  gIgcss = -(gIgcsg + gIgcsd + gIgcsb);
10671  gIgcds = -(gIgcdg + gIgcdd + gIgcdb);
10672  cd = cdrain;
10673 
10674  if (model_.tnoiMod == 0)
10675  {
10676  Abulk = Abulk0 * paramPtr->abulkCVfactor;
10677  Vdsat = Vgsteff / Abulk;
10678  T0 = Vdsat - Vds - CONSTDELTA_4;
10679  T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_4 * Vdsat);
10680  if (T0 >= 0.0)
10681  {
10682  Vdseff = Vdsat - 0.5 * (T0 + T1);
10683  }
10684  else
10685  {
10686  T3 = (CONSTDELTA_4 + CONSTDELTA_4) / (T1 - T0);
10687  T4 = 1.0 - T3;
10688  T5 = Vdsat * T3 / (T1 - T0);
10689  Vdseff = Vdsat * T4;
10690  }
10691  if (Vds == 0.0)
10692  {
10693  Vdseff = 0.0;
10694  }
10695 
10696  T0 = Abulk * Vdseff;
10697  T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20);
10698  T2 = Vdseff / T1;
10699  T3 = T0 * T2;
10700  qinv = Coxeff * paramPtr->weffCV * nf
10701  * paramPtr->leffCV
10702  * (Vgsteff - 0.5 * T0 + Abulk * T3);
10703  }
10704 
10705  // C-V begins
10706 
10707  if ((model_.xpart < 0) || (!ChargeComputationNeeded))
10708  {
10709  qgate = qdrn = qsrc = qbulk = 0.0;
10710  cggb = cgsb = cgdb = 0.0;
10711  cdgb = cdsb = cddb = 0.0;
10712  cbgb = cbsb = cbdb = 0.0;
10713  csgb = cssb = csdb = 0.0;
10714  cgbb = csbb = cdbb = cbbb = 0.0;
10715  cqdb = cqsb = cqgb = cqbb = 0.0;
10716  gtau = 0.0;
10717  }
10718  else if (model_.capMod == 0)
10719  {
10720  if (Vbseff < 0.0)
10721  {
10722  Vbseff = Vbs;
10723  dVbseff_dVb = 1.0;
10724  }
10725  else
10726  {
10727  Vbseff = paramPtr->phi - Phis;
10728  dVbseff_dVb = -dPhis_dVb;
10729  }
10730 
10731  Vfb = paramPtr->vfbcv;
10732  Vth = Vfb + paramPtr->phi + paramPtr->k1ox * sqrtPhis;
10733  Vgst = Vgs_eff - Vth;
10734  dVth_dVb = paramPtr->k1ox * dsqrtPhis_dVb;
10735  dVgst_dVb = -dVth_dVb;
10736  dVgst_dVg = dVgs_eff_dVg;
10737 
10739  Arg1 = Vgs_eff - Vbseff - Vfb;
10740 
10741  if (Arg1 <= 0.0)
10742  {
10743  qgate = CoxWL * Arg1;
10744  qbulk = -qgate;
10745  qdrn = 0.0;
10746 
10747  cggb = CoxWL * dVgs_eff_dVg;
10748  cgdb = 0.0;
10749  cgsb = CoxWL * (dVbseff_dVb - dVgs_eff_dVg);
10750 
10751  cdgb = 0.0;
10752  cddb = 0.0;
10753  cdsb = 0.0;
10754 
10755  cbgb = -CoxWL * dVgs_eff_dVg;
10756  cbdb = 0.0;
10757  cbsb = -cgsb;
10758  } // Arg1 <= 0.0, end of accumulation
10759  else if (Vgst <= 0.0)
10760  {
10761  T1 = 0.5 * paramPtr->k1ox;
10762  T2 = sqrt(T1 * T1 + Arg1);
10763  qgate = CoxWL * paramPtr->k1ox * (T2 - T1);
10764  qbulk = -qgate;
10765  qdrn = 0.0;
10766 
10767  T0 = CoxWL * T1 / T2;
10768  cggb = T0 * dVgs_eff_dVg;
10769  cgdb = 0.0;
10770  cgsb = T0 * (dVbseff_dVb - dVgs_eff_dVg);
10771 
10772  cdgb = 0.0;
10773  cddb = 0.0;
10774  cdsb = 0.0;
10775 
10776  cbgb = -cggb;
10777  cbdb = 0.0;
10778  cbsb = -cgsb;
10779  } // Vgst <= 0.0, end of depletion
10780  else
10781  {
10782  One_Third_CoxWL = CoxWL / 3.0;
10783  Two_Third_CoxWL = 2.0 * One_Third_CoxWL;
10784 
10785  AbulkCV = Abulk0 * paramPtr->abulkCVfactor;
10786  dAbulkCV_dVb = paramPtr->abulkCVfactor * dAbulk0_dVb;
10787  Vdsat = Vgst / AbulkCV;
10788  dVdsat_dVg = dVgs_eff_dVg / AbulkCV;
10789  dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)/ AbulkCV;
10790 
10791  if (model_.xpart > 0.5)
10792  {
10793  // 0/100 Charge partition model
10794  if (Vdsat <= Vds)
10795  { // saturation region
10796  T1 = Vdsat / 3.0;
10797  qgate = CoxWL * (Vgs_eff - Vfb
10798  - paramPtr->phi - T1);
10799  T2 = -Two_Third_CoxWL * Vgst;
10800  qbulk = -(qgate + T2);
10801  qdrn = 0.0;
10802 
10803  cggb = One_Third_CoxWL * (3.0
10804  - dVdsat_dVg) * dVgs_eff_dVg;
10805  T2 = -One_Third_CoxWL * dVdsat_dVb;
10806  cgsb = -(cggb + T2);
10807  cgdb = 0.0;
10808 
10809  cdgb = 0.0;
10810  cddb = 0.0;
10811  cdsb = 0.0;
10812 
10813  cbgb = -(cggb
10814  - Two_Third_CoxWL * dVgs_eff_dVg);
10815  T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
10816  cbsb = -(cbgb + T3);
10817  cbdb = 0.0;
10818  }
10819  else
10820  { // linear region
10821  Alphaz = Vgst / Vdsat;
10822  T1 = 2.0 * Vdsat - Vds;
10823  T2 = Vds / (3.0 * T1);
10824  T3 = T2 * Vds;
10825  T9 = 0.25 * CoxWL;
10826  T4 = T9 * Alphaz;
10827  T7 = 2.0 * Vds - T1 - 3.0 * T3;
10828  T8 = T3 - T1 - 2.0 * Vds;
10829  qgate = CoxWL * (Vgs_eff - Vfb
10830  - paramPtr->phi - 0.5 * (Vds - T3));
10831  T10 = T4 * T8;
10832  qdrn = T4 * T7;
10833  qbulk = -(qgate + qdrn + T10);
10834 
10835  T5 = T3 / T1;
10836  cggb = CoxWL * (1.0 - T5 * dVdsat_dVg)
10837  * dVgs_eff_dVg;
10838  T11 = -CoxWL * T5 * dVdsat_dVb;
10839  cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5);
10840  cgsb = -(cggb + T11 + cgdb);
10841  T6 = 1.0 / Vdsat;
10842  dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
10843  dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
10844  T7 = T9 * T7;
10845  T8 = T9 * T8;
10846  T9 = 2.0 * T4 * (1.0 - 3.0 * T5);
10847  cdgb = (T7 * dAlphaz_dVg - T9 * dVdsat_dVg) * dVgs_eff_dVg;
10848  T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb;
10849  cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5);
10850  cdsb = -(cdgb + T12 + cddb);
10851 
10852  T9 = 2.0 * T4 * (1.0 + T5);
10853  T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg)
10854  * dVgs_eff_dVg;
10855  T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb;
10856  T12 = T4 * (2.0 * T2 + T5 - 1.0);
10857  T0 = -(T10 + T11 + T12);
10858 
10859  cbgb = -(cggb + cdgb + T10);
10860  cbdb = -(cgdb + cddb + T12);
10861  cbsb = -(cgsb + cdsb + T0);
10862  }
10863  }
10864  else if (model_.xpart < 0.5)
10865  { // 40/60 Charge partition model
10866  if (Vds >= Vdsat)
10867  { // saturation region
10868  T1 = Vdsat / 3.0;
10869  qgate = CoxWL * (Vgs_eff - Vfb - paramPtr->phi - T1);
10870  T2 = -Two_Third_CoxWL * Vgst;
10871  qbulk = -(qgate + T2);
10872  qdrn = 0.4 * T2;
10873 
10874  cggb = One_Third_CoxWL * (3.0 - dVdsat_dVg) * dVgs_eff_dVg;
10875  T2 = -One_Third_CoxWL * dVdsat_dVb;
10876  cgsb = -(cggb + T2);
10877  cgdb = 0.0;
10878 
10879  T3 = 0.4 * Two_Third_CoxWL;
10880  cdgb = -T3 * dVgs_eff_dVg;
10881  cddb = 0.0;
10882  T4 = T3 * dVth_dVb; cdsb = -(T4 + cdgb);
10883 
10884  cbgb = -(cggb - Two_Third_CoxWL * dVgs_eff_dVg);
10885  T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
10886  cbsb = -(cbgb + T3);
10887  cbdb = 0.0;
10888  }
10889  else
10890  { // linear region
10891  Alphaz = Vgst / Vdsat;
10892  T1 = 2.0 * Vdsat - Vds;
10893  T2 = Vds / (3.0 * T1);
10894  T3 = T2 * Vds;
10895  T9 = 0.25 * CoxWL;
10896  T4 = T9 * Alphaz;
10897  qgate = CoxWL * (Vgs_eff - Vfb - paramPtr->phi
10898  - 0.5 * (Vds - T3));
10899 
10900  T5 = T3 / T1;
10901  cggb = CoxWL * (1.0 - T5 * dVdsat_dVg)
10902  * dVgs_eff_dVg;
10903  tmp = -CoxWL * T5 * dVdsat_dVb;
10904  cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5);
10905  cgsb = -(cggb
10906  + cgdb + tmp);
10907 
10908  T6 = 1.0 / Vdsat;
10909  dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
10910  dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
10911 
10912  T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds
10913  + 1.2 * Vds * Vds;
10914  T8 = T2 / T1;
10915  T7 = Vds - T1 - T8 * T6;
10916  qdrn = T4 * T7;
10917  T7 *= T9;
10918  tmp = T8 / T1;
10919  tmp1 = T4 * (2.0 - 4.0 * tmp * T6
10920  + T8 * (16.0 * Vdsat - 6.0 * Vds));
10921 
10922  cdgb = (T7 * dAlphaz_dVg - tmp1
10923  * dVdsat_dVg) * dVgs_eff_dVg;
10924  T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb;
10925  cddb = T4 * (2.0 - (1.0 / (3.0 * T1
10926  * T1) + 2.0 * tmp) * T6 + T8
10927  * (6.0 * Vdsat - 2.4 * Vds));
10928  cdsb = -(cdgb + T10 + cddb);
10929 
10930  T7 = 2.0 * (T1 + T3);
10931  qbulk = -(qgate - T4 * T7);
10932  T7 *= T9;
10933  T0 = 4.0 * T4 * (1.0 - T5);
10934  T12 = (-T7 * dAlphaz_dVg - cdgb
10935  - T0 * dVdsat_dVg) * dVgs_eff_dVg;
10936  T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb;
10937  T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) - cddb;
10938  tmp = -(T10 + T11 + T12);
10939 
10940  cbgb = -(cggb + cdgb + T12);
10941  cbdb = -(cgdb + cddb + T10);
10942  cbsb = -(cgsb + cdsb + tmp);
10943  }
10944  }
10945  else
10946  { // 50/50 partitioning
10947  if (Vds >= Vdsat)
10948  { // saturation region
10949  T1 = Vdsat / 3.0;
10950  qgate = CoxWL * (Vgs_eff - Vfb
10951  - paramPtr->phi - T1);
10952  T2 = -Two_Third_CoxWL * Vgst;
10953  qbulk = -(qgate + T2);
10954  qdrn = 0.5 * T2;
10955 
10956  cggb = One_Third_CoxWL * (3.0
10957  - dVdsat_dVg) * dVgs_eff_dVg;
10958  T2 = -One_Third_CoxWL * dVdsat_dVb;
10959  cgsb = -(cggb + T2);
10960  cgdb = 0.0;
10961 
10962  cdgb = -One_Third_CoxWL * dVgs_eff_dVg;
10963  cddb = 0.0;
10964  T4 = One_Third_CoxWL * dVth_dVb;
10965  cdsb = -(T4 + cdgb);
10966 
10967  cbgb = -(cggb
10968  - Two_Third_CoxWL * dVgs_eff_dVg);
10969  T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
10970  cbsb = -(cbgb + T3);
10971  cbdb = 0.0;
10972  }
10973  else
10974  { // linear region
10975  Alphaz = Vgst / Vdsat;
10976  T1 = 2.0 * Vdsat - Vds;
10977  T2 = Vds / (3.0 * T1);
10978  T3 = T2 * Vds;
10979  T9 = 0.25 * CoxWL;
10980  T4 = T9 * Alphaz;
10981  qgate = CoxWL * (Vgs_eff - Vfb - paramPtr->phi
10982  - 0.5 * (Vds - T3));
10983 
10984  T5 = T3 / T1;
10985  cggb = CoxWL * (1.0 - T5 * dVdsat_dVg)
10986  * dVgs_eff_dVg;
10987  tmp = -CoxWL * T5 * dVdsat_dVb;
10988  cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5);
10989  cgsb = -(cggb + cgdb + tmp);
10990 
10991  T6 = 1.0 / Vdsat;
10992  dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
10993  dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
10994 
10995  T7 = T1 + T3;
10996  qdrn = -T4 * T7;
10997  qbulk = - (qgate + qdrn + qdrn);
10998  T7 *= T9;
10999  T0 = T4 * (2.0 * T5 - 2.0);
11000 
11001  cdgb = (T0 * dVdsat_dVg - T7 * dAlphaz_dVg) * dVgs_eff_dVg;
11002  T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb;
11003  cddb = T4 * (1.0 - 2.0 * T2 - T5);
11004  cdsb = -(cdgb + T12 + cddb);
11005 
11006  cbgb = -(cggb + 2.0 * cdgb);
11007  cbdb = -(cgdb + 2.0 * cddb);
11008  cbsb = -(cgsb + 2.0 * cdsb);
11009  } // end of linear region
11010  } // end of 50/50 partition
11011  } // end of inversion
11012  } // end of capMod=0
11013  else
11014  {
11015  if (Vbseff < 0.0)
11016  {
11017  VbseffCV = Vbseff;
11018  dVbseffCV_dVb = 1.0;
11019  }
11020  else
11021  {
11022  VbseffCV = paramPtr->phi - Phis;
11023  dVbseffCV_dVb = -dPhis_dVb;
11024  }
11025 
11027  * paramPtr->leffCV * nf;
11028 
11029  if (model_.cvchargeMod == 0)
11030  {
11031  // Seperate VgsteffCV with noff and voffcv
11032  noff = n * paramPtr->noff;
11033  dnoff_dVd = paramPtr->noff * dn_dVd;
11034  dnoff_dVb = paramPtr->noff * dn_dVb;
11035  T0 = Vtm * noff;
11036  voffcv = paramPtr->voffcv;
11037  VgstNVt = (Vgst - voffcv) / T0;
11038 
11039  if (VgstNVt > CONSTEXP_THRESHOLD)
11040  {
11041  Vgsteff = Vgst - voffcv;
11042  dVgsteff_dVg = dVgs_eff_dVg;
11043  dVgsteff_dVd = -dVth_dVd;
11044  dVgsteff_dVb = -dVth_dVb;
11045  }
11046  else if (VgstNVt < -CONSTEXP_THRESHOLD)
11047  {
11048  Vgsteff = T0 * log(1.0 + CONSTMIN_EXP);
11049  dVgsteff_dVg = 0.0;
11050  dVgsteff_dVd = Vgsteff / noff;
11051  dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb;
11052  dVgsteff_dVd *= dnoff_dVd;
11053  }
11054  else
11055  {
11056  ExpVgst = exp(VgstNVt);
11057  Vgsteff = T0 * log(1.0 + ExpVgst);
11058  dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst);
11059  dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv)
11060  / noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd;
11061  dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv)
11062  / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb;
11063  dVgsteff_dVg *= dVgs_eff_dVg;
11064  }
11065  // End of VgsteffCV for cvchargeMod = 0
11066  }
11067  else
11068  {
11069  T0 = n * Vtm;
11070  T1 = paramPtr->mstarcv * Vgst;
11071  T2 = T1 / T0;
11072  if (T2 > CONSTEXP_THRESHOLD)
11073  {
11074  T10 = T1;
11075  dT10_dVg = paramPtr->mstarcv * dVgs_eff_dVg;
11076  dT10_dVd = -dVth_dVd * paramPtr->mstarcv;
11077  dT10_dVb = -dVth_dVb * paramPtr->mstarcv;
11078  }
11079  else if (T2 < -CONSTEXP_THRESHOLD)
11080  {
11081  T10 = Vtm * log(1.0 + CONSTMIN_EXP);
11082  dT10_dVg = 0.0;
11083  dT10_dVd = T10 * dn_dVd;
11084  dT10_dVb = T10 * dn_dVb;
11085  T10 *= n;
11086  }
11087  else
11088  {
11089  ExpVgst = exp(T2);
11090  T3 = Vtm * log(1.0 + ExpVgst);
11091  T10 = n * T3;
11092  dT10_dVg = paramPtr->mstarcv * ExpVgst / (1.0 + ExpVgst);
11093  dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n);
11094  dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n);
11095  dT10_dVg *= dVgs_eff_dVg;
11096  }
11097 
11098  T1 = paramPtr->voffcbncv - (1.0 - paramPtr->mstarcv) * Vgst;
11099  T2 = T1 / T0;
11100  if (T2 < -CONSTEXP_THRESHOLD)
11101  {
11103  T9 = paramPtr->mstarcv + T3 * n;
11104  dT9_dVg = 0.0;
11105  dT9_dVd = dn_dVd * T3;
11106  dT9_dVb = dn_dVb * T3;
11107  }
11108  else if (T2 > CONSTEXP_THRESHOLD)
11109  {
11111  T9 = paramPtr->mstarcv + T3 * n;
11112  dT9_dVg = 0.0;
11113  dT9_dVd = dn_dVd * T3;
11114  dT9_dVb = dn_dVb * T3;
11115  }
11116  else
11117  {
11118  ExpVgst = exp(T2);
11119  T3 = model_.coxe / paramPtr->cdep0;
11120  T4 = T3 * ExpVgst;
11121  T5 = T1 * T4 / T0;
11122  T9 = paramPtr->mstarcv + n * T4;
11123  dT9_dVg = T3 * (paramPtr->mstarcv - 1.0) * ExpVgst / Vtm;
11124  dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb;
11125  dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd;
11126  dT9_dVg *= dVgs_eff_dVg;
11127  }
11128 
11129  Vgsteff = T10 / T9;
11130  T11 = T9 * T9;
11131  dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11;
11132  dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11;
11133  dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11;
11134  // End of VgsteffCV for cvchargeMod = 1
11135  }
11136 
11137 
11138 
11139  if (model_.capMod == 1)
11140  {
11141  Vfb = vfbzb;
11142  V3 = Vfb - Vgs_eff + VbseffCV - CONSTDELTA_3;
11143  if (Vfb <= 0.0)
11144  {
11145  T0 = sqrt(V3 * V3 - 4.0 * CONSTDELTA_3 * Vfb);
11146  }
11147  else
11148  {
11149  T0 = sqrt(V3 * V3 + 4.0 * CONSTDELTA_3 * Vfb);
11150  }
11151 
11152  T1 = 0.5 * (1.0 + V3 / T0);
11153  Vfbeff = Vfb - 0.5 * (V3 + T0);
11154  dVfbeff_dVg = T1 * dVgs_eff_dVg;
11155  dVfbeff_dVb = -T1 * dVbseffCV_dVb;
11156  Qac0 = CoxWL * (Vfbeff - Vfb);
11157  dQac0_dVg = CoxWL * dVfbeff_dVg;
11158  dQac0_dVb = CoxWL * dVfbeff_dVb;
11159 
11160  T0 = 0.5 * paramPtr->k1ox;
11161  T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff;
11162  if (paramPtr->k1ox == 0.0)
11163  {
11164  T1 = 0.0;
11165  T2 = 0.0;
11166  }
11167  else if (T3 < 0.0)
11168  {
11169  T1 = T0 + T3 / paramPtr->k1ox;
11170  T2 = CoxWL;
11171  }
11172  else
11173  {
11174  T1 = sqrt(T0 * T0 + T3);
11175  T2 = CoxWL * T0 / T1;
11176  }
11177 
11178  Qsub0 = CoxWL * paramPtr->k1ox * (T1 - T0);
11179 
11180  dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg);
11181  dQsub0_dVd = -T2 * dVgsteff_dVd;
11182  dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb
11183  + dVgsteff_dVb);
11184 
11185  AbulkCV = Abulk0 * paramPtr->abulkCVfactor;
11186  dAbulkCV_dVb = paramPtr->abulkCVfactor * dAbulk0_dVb;
11187  VdsatCV = Vgsteff / AbulkCV;
11188 
11189  T0 = VdsatCV - Vds - CONSTDELTA_4;
11190  dT0_dVg = 1.0 / AbulkCV;
11191  dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV;
11192  T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_4 * VdsatCV);
11193  dT1_dVg = (T0 + CONSTDELTA_4 + CONSTDELTA_4) / T1;
11194  dT1_dVd = -T0 / T1;
11195  dT1_dVb = dT1_dVg * dT0_dVb;
11196  dT1_dVg *= dT0_dVg;
11197  if (T0 >= 0.0)
11198  {
11199  VdseffCV = VdsatCV - 0.5 * (T0 + T1);
11200  dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg);
11201  dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd);
11202  dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb);
11203  }
11204  else
11205  {
11206  T3 = (CONSTDELTA_4 + CONSTDELTA_4) / (T1 - T0);
11207  T4 = 1.0 - T3;
11208  T5 = VdsatCV * T3 / (T1 - T0);
11209  VdseffCV = VdsatCV * T4;
11210  dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg);
11211  dVdseffCV_dVd = T5 * (dT1_dVd + 1.0);
11212  dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb;
11213  }
11214 
11215  if (Vds == 0.0)
11216  {
11217  VdseffCV = 0.0;
11218  dVdseffCV_dVg = 0.0;
11219  dVdseffCV_dVb = 0.0;
11220  }
11221 
11222  T0 = AbulkCV * VdseffCV;
11223  T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20);
11224  T2 = VdseffCV / T1;
11225  T3 = T0 * T2;
11226 
11227  T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV);
11228  T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5);
11229  T6 = 12.0 * T2 * T2 * Vgsteff;
11230 
11231  qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3);
11232  Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg);
11233  Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd;
11234  Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11235  + Cgg1 * dVgsteff_dVb;
11236  Cgg1 *= dVgsteff_dVg;
11237 
11238  T7 = 1.0 - AbulkCV;
11239  qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3);
11240  T4 = -T7 * (T4 - 1.0);
11241  T5 = -T7 * T5;
11242  T6 = -(T7 * T6 + (0.5 * VdseffCV - T3));
11243  Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg);
11244  Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd;
11245  Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11246  + Cbg1 * dVgsteff_dVb;
11247  Cbg1 *= dVgsteff_dVg;
11248 
11249  if (model_.xpart > 0.5)
11250  { // 0/100 Charge petition model
11251  T1 = T1 + T1;
11252  qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0
11253  - T0 * T0 / T1);
11254  T7 = (4.0 * Vgsteff - T0) / (T1 * T1);
11255  T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1));
11256  T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7);
11257  T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7);
11258  Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg);
11259  Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd;
11260  Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11261  + Csg * dVgsteff_dVb;
11262  Csg *= dVgsteff_dVg;
11263  }
11264  else if (model_.xpart < 0.5)
11265  { // 40/60 Charge petition model
11266  T1 = T1 / 12.0;
11267  T2 = 0.5 * CoxWL / (T1 * T1);
11268  T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff
11269  * (Vgsteff - 4.0 * T0 / 3.0))
11270  - 2.0 * T0 * T0 * T0 / 15.0;
11271  qsrc = -T2 * T3;
11272  T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0)
11273  + 0.4 * T0 * T0;
11274  T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0
11275  * Vgsteff - 8.0 * T0 / 3.0)
11276  + 2.0 * T0 * T0 / 3.0);
11277  T5 = (qsrc / T1 + T2 * T7) * AbulkCV;
11278  T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV);
11279  Csg = (T4 + T5 * dVdseffCV_dVg);
11280  Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd;
11281  Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11282  + Csg * dVgsteff_dVb;
11283  Csg *= dVgsteff_dVg;
11284  }
11285  else
11286  { // 50/50 Charge petition model
11287  qsrc = -0.5 * (qgate + qbulk);
11288  Csg = -0.5 * (Cgg1 + Cbg1);
11289  Csb = -0.5 * (Cgb1 + Cbb1);
11290  Csd = -0.5 * (Cgd1 + Cbd1);
11291  }
11292 
11293  qgate += Qac0 + Qsub0;
11294  qbulk -= (Qac0 + Qsub0);
11295  qdrn = -(qgate + qbulk + qsrc);
11296 
11297  Cgg = dQac0_dVg + dQsub0_dVg + Cgg1;
11298  Cgd = dQsub0_dVd + Cgd1;
11299  Cgb = dQac0_dVb + dQsub0_dVb + Cgb1;
11300 
11301  Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg;
11302  Cbd = Cbd1 - dQsub0_dVd;
11303  Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb;
11304 
11305  Cgb *= dVbseff_dVb;
11306  Cbb *= dVbseff_dVb;
11307  Csb *= dVbseff_dVb;
11308 
11309  cggb = Cgg;
11310  cgsb = -(Cgg + Cgd + Cgb);
11311  cgdb = Cgd;
11312  cdgb = -(Cgg + Cbg + Csg);
11313  cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb
11314  + Csg + Csd + Csb);
11315  cddb = -(Cgd + Cbd + Csd);
11316  cbgb = Cbg;
11317  cbsb = -(Cbg + Cbd + Cbb);
11318  cbdb = Cbd;
11319  }
11320  // Charge-Thickness capMod (CTM) begins
11321  else if (model_.capMod == 2)
11322  {
11323  V3 = vfbzb - Vgs_eff + VbseffCV - CONSTDELTA_3;
11324  if (vfbzb <= 0.0)
11325  T0 = sqrt(V3 * V3 - 4.0 * CONSTDELTA_3 * vfbzb);
11326  else
11327  T0 = sqrt(V3 * V3 + 4.0 * CONSTDELTA_3 * vfbzb);
11328 
11329  T1 = 0.5 * (1.0 + V3 / T0);
11330  Vfbeff = vfbzb - 0.5 * (V3 + T0);
11331  dVfbeff_dVg = T1 * dVgs_eff_dVg;
11332  dVfbeff_dVb = -T1 * dVbseffCV_dVb;
11333 
11334  Cox = model_.coxp;
11335  Tox = 1.0e8 * model_.toxp;
11336  T0 = (Vgs_eff - VbseffCV - vfbzb) / Tox;
11337  dT0_dVg = dVgs_eff_dVg / Tox;
11338  dT0_dVb = -dVbseffCV_dVb / Tox;
11339 
11340  tmp = T0 * paramPtr->acde;
11341  if ((-CONSTEXP_THRESHOLD < tmp) && (tmp < CONSTEXP_THRESHOLD))
11342  {
11343  Tcen = paramPtr->ldeb * exp(tmp);
11344  dTcen_dVg = paramPtr->acde * Tcen;
11345  dTcen_dVb = dTcen_dVg * dT0_dVb;
11346  dTcen_dVg *= dT0_dVg;
11347  }
11348  else if (tmp <= -CONSTEXP_THRESHOLD)
11349  {
11350  Tcen = paramPtr->ldeb * CONSTMIN_EXP;
11351  dTcen_dVg = dTcen_dVb = 0.0;
11352  }
11353  else
11354  {
11355  Tcen = paramPtr->ldeb * CONSTMAX_EXP;
11356  dTcen_dVg = dTcen_dVb = 0.0;
11357  }
11358 
11359  LINK = 1.0e-3 * model_.toxp;
11360  V3 = paramPtr->ldeb - Tcen - LINK;
11361  V4 = sqrt(V3 * V3 + 4.0 * LINK * paramPtr->ldeb);
11362  Tcen = paramPtr->ldeb - 0.5 * (V3 + V4);
11363  T1 = 0.5 * (1.0 + V3 / V4);
11364  dTcen_dVg *= T1;
11365  dTcen_dVb *= T1;
11366 
11367  Ccen = epssub / Tcen;
11368  T2 = Cox / (Cox + Ccen);
11369  Coxeff = T2 * Ccen;
11370  T3 = -Ccen / Tcen;
11371  dCoxeff_dVg = T2 * T2 * T3;
11372  dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb;
11373  dCoxeff_dVg *= dTcen_dVg;
11374  CoxWLcen = CoxWL * Coxeff / model_.coxe;
11375 
11376  Qac0 = CoxWLcen * (Vfbeff - vfbzb);
11377  QovCox = Qac0 / Coxeff;
11378  dQac0_dVg = CoxWLcen * dVfbeff_dVg
11379  + QovCox * dCoxeff_dVg;
11380  dQac0_dVb = CoxWLcen * dVfbeff_dVb
11381  + QovCox * dCoxeff_dVb;
11382 
11383  T0 = 0.5 * paramPtr->k1ox;
11384  T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff;
11385  if (paramPtr->k1ox == 0.0)
11386  {
11387  T1 = 0.0;
11388  T2 = 0.0;
11389  }
11390  else if (T3 < 0.0)
11391  {
11392  T1 = T0 + T3 / paramPtr->k1ox;
11393  T2 = CoxWLcen;
11394  }
11395  else
11396  {
11397  T1 = sqrt(T0 * T0 + T3);
11398  T2 = CoxWLcen * T0 / T1;
11399  }
11400 
11401  Qsub0 = CoxWLcen * paramPtr->k1ox * (T1 - T0);
11402  QovCox = Qsub0 / Coxeff;
11403  dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg)
11404  + QovCox * dCoxeff_dVg;
11405  dQsub0_dVd = -T2 * dVgsteff_dVd;
11406  dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb)
11407  + QovCox * dCoxeff_dVb;
11408 
11409  // Gate-bias dependent delta Phis begins
11410  if (paramPtr->k1ox <= 0.0)
11411  { Denomi = 0.25 * paramPtr->moin * Vtm;
11412  T0 = 0.5 * paramPtr->sqrtPhi;
11413  }
11414  else
11415  { Denomi = paramPtr->moin * Vtm
11416  * paramPtr->k1ox * paramPtr->k1ox;
11417  T0 = paramPtr->k1ox * paramPtr->sqrtPhi;
11418  }
11419  T1 = 2.0 * T0 + Vgsteff;
11420 
11421  DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi);
11422  dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff);
11423  // End of delta Phis
11424 
11425  // VgDP = Vgsteff - DeltaPhi
11426  T0 = Vgsteff - DeltaPhi - 0.001;
11427  dT0_dVg = 1.0 - dDeltaPhi_dVg;
11428  T1 = sqrt(T0 * T0 + Vgsteff * 0.004);
11429  VgDP = 0.5 * (T0 + T1);
11430  dVgDP_dVg = 0.5 * (dT0_dVg + (T0 * dT0_dVg + 0.002) / T1);
11431 
11432  Tox += Tox; // WDLiu: Tcen reevaluated below due to different Vgsteff
11433  T0 = (Vgsteff + vtfbphi2) / Tox;
11434  tmp = exp(model_.bdos * 0.7 * log(T0));
11435  T1 = 1.0 + tmp;
11436  T2 = model_.bdos * 0.7 * tmp / (T0 * Tox);
11437  Tcen = model_.ados * 1.9e-9 / T1;
11438  dTcen_dVg = -Tcen * T2 / T1;
11439  dTcen_dVd = dTcen_dVg * dVgsteff_dVd;
11440  dTcen_dVb = dTcen_dVg * dVgsteff_dVb;
11441  dTcen_dVg *= dVgsteff_dVg;
11442 
11443  Ccen = epssub / Tcen;
11444  T0 = Cox / (Cox + Ccen);
11445  Coxeff = T0 * Ccen;
11446  T1 = -Ccen / Tcen;
11447  dCoxeff_dVg = T0 * T0 * T1;
11448  dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd;
11449  dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb;
11450  dCoxeff_dVg *= dTcen_dVg;
11451  CoxWLcen = CoxWL * Coxeff / model_.coxe;
11452 
11453  AbulkCV = Abulk0 * paramPtr->abulkCVfactor;
11454  dAbulkCV_dVb = paramPtr->abulkCVfactor * dAbulk0_dVb;
11455  VdsatCV = VgDP / AbulkCV;
11456 
11457  T0 = VdsatCV - Vds - CONSTDELTA_4;
11458  dT0_dVg = dVgDP_dVg / AbulkCV;
11459  dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV;
11460  T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_4 * VdsatCV);
11461  dT1_dVg = (T0 + CONSTDELTA_4 + CONSTDELTA_4) / T1;
11462  dT1_dVd = -T0 / T1;
11463  dT1_dVb = dT1_dVg * dT0_dVb;
11464  dT1_dVg *= dT0_dVg;
11465  if (T0 >= 0.0)
11466  {
11467  VdseffCV = VdsatCV - 0.5 * (T0 + T1);
11468  dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg);
11469  dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd);
11470  dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb);
11471  }
11472  else
11473  {
11474  T3 = (CONSTDELTA_4 + CONSTDELTA_4) / (T1 - T0);
11475  T4 = 1.0 - T3;
11476  T5 = VdsatCV * T3 / (T1 - T0);
11477  VdseffCV = VdsatCV * T4;
11478  dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg);
11479  dVdseffCV_dVd = T5 * (dT1_dVd + 1.0);
11480  dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb;
11481  }
11482 
11483  if (Vds == 0.0)
11484  {
11485  VdseffCV = 0.0;
11486  dVdseffCV_dVg = 0.0;
11487  dVdseffCV_dVb = 0.0;
11488  }
11489 
11490  T0 = AbulkCV * VdseffCV;
11491  T1 = VgDP;
11492  T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20);
11493  T3 = T0 / T2;
11494  T4 = 1.0 - 12.0 * T3 * T3;
11495  T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5);
11496  T6 = T5 * VdseffCV / AbulkCV;
11497 
11498  qgate = CoxWLcen * (T1 - T0 * (0.5 - T3));
11499  QovCox = qgate / Coxeff;
11500  Cgg1 = CoxWLcen * (T4 * dVgDP_dVg
11501  + T5 * dVdseffCV_dVg);
11502  Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1
11503  * dVgsteff_dVd + QovCox * dCoxeff_dVd;
11504  Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11505  + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb;
11506  Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg;
11507 
11508 
11509  T7 = 1.0 - AbulkCV;
11510  T8 = T2 * T2;
11511  T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV);
11512  T10 = T9 * dVgDP_dVg;
11513  T11 = -T7 * T5 / AbulkCV;
11514  T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2));
11515 
11516  qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2);
11517  QovCox = qbulk / Coxeff;
11518  Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg);
11519  Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1
11520  * dVgsteff_dVd + QovCox * dCoxeff_dVd;
11521  Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb)
11522  + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb;
11523  Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg;
11524 
11525  if (model_.xpart > 0.5)
11526  {
11527  // 0/100 partition
11528  qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0
11529  - 0.5 * T0 * T0 / T2);
11530  QovCox = qsrc / Coxeff;
11531  T2 += T2;
11532  T3 = T2 * T2;
11533  T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3);
11534  T4 = -(0.5 + 24.0 * T0 * T0 / T3) * dVgDP_dVg;
11535  T5 = T7 * AbulkCV;
11536  T6 = T7 * VdseffCV;
11537 
11538  Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg);
11539  Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd
11540  + QovCox * dCoxeff_dVd;
11541  Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11542  + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb;
11543  Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg;
11544  }
11545  else if (model_.xpart < 0.5)
11546  {
11547  // 40/60 partition
11548  T2 = T2 / 12.0;
11549  T3 = 0.5 * CoxWLcen / (T2 * T2);
11550  T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0
11551  * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0;
11552  qsrc = -T3 * T4;
11553  QovCox = qsrc / Coxeff;
11554  T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0;
11555  T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0
11556  * T0 / 3.0) + 2.0 * T0 * T0 / 3.0);
11557  T6 = AbulkCV * (qsrc / T2 + T3 * T8);
11558  T7 = T6 * VdseffCV / AbulkCV;
11559 
11560  Csg = T5 * dVgDP_dVg + T6 * dVdseffCV_dVg;
11561  Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd
11562  + QovCox * dCoxeff_dVd;
11563  Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb
11564  + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb;
11565  Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg;
11566  }
11567  else
11568  {
11569  // 50/50 partition
11570  qsrc = -0.5 * qgate;
11571  Csg = -0.5 * Cgg1;
11572  Csd = -0.5 * Cgd1;
11573  Csb = -0.5 * Cgb1;
11574  }
11575 
11576  qgate += Qac0 + Qsub0 - qbulk;
11577  qbulk -= (Qac0 + Qsub0);
11578  qdrn = -(qgate + qbulk + qsrc);
11579 
11580  Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg;
11581  Cbd = Cbd1 - dQsub0_dVd;
11582  Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb;
11583 
11584  Cgg = Cgg1 - Cbg;
11585  Cgd = Cgd1 - Cbd;
11586  Cgb = Cgb1 - Cbb;
11587 
11588  Cgb *= dVbseff_dVb;
11589  Cbb *= dVbseff_dVb;
11590  Csb *= dVbseff_dVb;
11591 
11592  cggb = Cgg;
11593  cgsb = -(Cgg + Cgd + Cgb);
11594  cgdb = Cgd;
11595  cdgb = -(Cgg + Cbg + Csg);
11596  cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb
11597  + Csg + Csd + Csb);
11598  cddb = -(Cgd + Cbd + Csd);
11599  cbgb = Cbg;
11600  cbsb = -(Cbg + Cbd + Cbb);
11601  cbdb = Cbd;
11602  } // End of CTM
11603  }
11604 
11605  csgb = - cggb - cdgb - cbgb;
11606  csdb = - cgdb - cddb - cbdb;
11607  cssb = - cgsb - cdsb - cbsb;
11608  cgbb = - cgdb - cggb - cgsb;
11609  cdbb = - cddb - cdgb - cdsb;
11610  cbbb = - cbgb - cbdb - cbsb;
11611  csbb = - cgbb - cdbb - cbbb;
11612  // These three lines are commented out because in SPICE they're
11613  // here->BSIM4qgate = qgate
11614  // and used only for bypass. It's pointless to do this here:
11615  // qgate = qgate;
11616  // qbulk = qbulk;
11617  // qdrn = qdrn;
11618  // This line in spice is actually:
11619  // here->BSIM4qsrc = -(qgate + qbulk + qdrn);
11620  // and that saved version is *never used* --- let's not overwrite
11621  // our regular qsrc this way. Don't think it matters, but it's not
11622  // what spice is doing here.
11623  // qsrc = -(qgate + qbulk + qdrn);
11624 
11625  // NQS begins
11626  if ((trnqsMod) || (acnqsMod))
11627  {
11628  qchqs = qcheq = -(qbulk + qgate);
11629  cqgb = -(cggb + cbgb);
11630  cqdb = -(cgdb + cbdb);
11631  cqsb = -(cgsb + cbsb);
11632  cqbb = -(cqgb + cqdb + cqsb);
11633 
11635  * paramPtr->leffCV;
11636  T1 = gcrg / CoxWL; // 1 / tau
11637  gtau = T1 * ScalingFactor;
11638 
11639  if (acnqsMod)
11640  {
11641  taunet = 1.0 / T1;
11642  }
11643 
11644 #if 0
11645  *(ckt->CKTstate0 + qcheq) = qcheq;
11646  if (ckt->CKTmode & MODEINITTRAN)
11647  {
11648  *(ckt->CKTstate1 + qcheq) = *(ckt->CKTstate0 + qcheq);
11649  }
11650  if (trnqsMod)
11651  {
11652  error = NIintegrate(ckt, &geq, &ceq, 0.0, qcheq);
11653  if (error)
11654  {
11655  return(error);
11656  }
11657  }
11658 #endif
11659  }
11660 
11661  // Calculate junction C-V
11663  {
11664  czbd = model_.DunitAreaTempJctCap * Adeff; // bug fix
11665  czbs = model_.SunitAreaTempJctCap * Aseff;
11668  * paramPtr->weffCJ * nf;
11671  * paramPtr->weffCJ * nf;
11672 
11676 
11680 
11681  // Source Bulk Junction
11682  if (vbs_jct == 0.0)
11683  {
11684  qbs = 0.0;
11685  capbs = czbs + czbssw + czbsswg;
11686  }
11687  else if (vbs_jct < 0.0)
11688  {
11689  if (czbs > 0.0)
11690  {
11691  arg = 1.0 - vbs_jct / model_.PhiBS;
11692  if (MJS == 0.5)
11693  {
11694  sarg = 1.0 / sqrt(arg);
11695  }
11696  else
11697  {
11698  sarg = exp(-MJS * log(arg));
11699  }
11700  qbs = model_.PhiBS * czbs * (1.0 - arg * sarg) / (1.0 - MJS);
11701  capbs = czbs * sarg;
11702  }
11703  else
11704  {
11705  qbs = 0.0;
11706  capbs = 0.0;
11707  }
11708  if (czbssw > 0.0)
11709  {
11710  arg = 1.0 - vbs_jct / model_.PhiBSWS;
11711  if (MJSWS == 0.5)
11712  {
11713  sarg = 1.0 / sqrt(arg);
11714  }
11715  else
11716  {
11717  sarg = exp(-MJSWS * log(arg));
11718  }
11719  qbs += model_.PhiBSWS * czbssw
11720  * (1.0 - arg * sarg) / (1.0 - MJSWS);
11721  capbs += czbssw * sarg;
11722  }
11723  if (czbsswg > 0.0)
11724  {
11725  arg = 1.0 - vbs_jct / model_.PhiBSWGS;
11726  if (MJSWGS == 0.5)
11727  {
11728  sarg = 1.0 / sqrt(arg);
11729  }
11730  else
11731  {
11732  sarg = exp(-MJSWGS * log(arg));
11733  }
11734  qbs += model_.PhiBSWGS * czbsswg * (1.0 - arg * sarg) / (1.0 - MJSWGS);
11735  capbs += czbsswg * sarg;
11736  }
11737  }
11738  else
11739  {
11740  T0 = czbs + czbssw + czbsswg;
11741  T1 = vbs_jct * (czbs * MJS / model_.PhiBS + czbssw * MJSWS
11742  / model_.PhiBSWS + czbsswg * MJSWGS / model_.PhiBSWGS);
11743 
11744  qbs = vbs_jct * (T0 + 0.5 * T1);
11745  capbs = T0 + T1;
11746  }
11747 
11748  // Drain Bulk Junction
11749  if (vbd_jct == 0.0)
11750  {
11751  qbd = 0.0;
11752  capbd = czbd + czbdsw + czbdswg;
11753  }
11754  else if (vbd_jct < 0.0)
11755  {
11756  if (czbd > 0.0)
11757  {
11758  arg = 1.0 - vbd_jct / model_.PhiBD;
11759  if (MJD == 0.5)
11760  {
11761  sarg = 1.0 / sqrt(arg);
11762  }
11763  else
11764  {
11765  sarg = exp(-MJD * log(arg));
11766  }
11767  qbd = model_.PhiBD* czbd * (1.0 - arg * sarg) / (1.0 - MJD);
11768  capbd = czbd * sarg;
11769  }
11770  else
11771  {
11772  qbd = 0.0;
11773  capbd = 0.0;
11774  }
11775  if (czbdsw > 0.0)
11776  {
11777  arg = 1.0 - vbd_jct / model_.PhiBSWD;
11778  if (MJSWD == 0.5)
11779  {
11780  sarg = 1.0 / sqrt(arg);
11781  }
11782  else
11783  {
11784  sarg = exp(-MJSWD * log(arg));
11785  }
11786  qbd += model_.PhiBSWD * czbdsw
11787  * (1.0 - arg * sarg) / (1.0 - MJSWD);
11788  capbd += czbdsw * sarg;
11789  }
11790  if (czbdswg > 0.0)
11791  {
11792  arg = 1.0 - vbd_jct / model_.PhiBSWGD;
11793  if (MJSWGD == 0.5)
11794  sarg = 1.0 / sqrt(arg);
11795  else
11796  sarg = exp(-MJSWGD * log(arg));
11797  qbd += model_.PhiBSWGD * czbdswg
11798  * (1.0 - arg * sarg) / (1.0 - MJSWGD);
11799  capbd += czbdswg * sarg;
11800  }
11801  }
11802  else
11803  {
11804  T0 = czbd + czbdsw + czbdswg;
11805  T1 = vbd_jct * (czbd * MJD / model_.PhiBD + czbdsw * MJSWD
11806  / model_.PhiBSWD + czbdswg * MJSWGD / model_.PhiBSWGD);
11807  qbd = vbd_jct * (T0 + 0.5 * T1);
11808  capbd = T0 + T1;
11809  }
11810  } // ChargeComputation
11811 
11812  if (rgateMod == 3)
11813  {
11814  vgdx = vgmd;
11815  vgsx = vgms;
11816  }
11817  else // For rgateMod == 0, 1 and 2
11818  {
11819  vgdx = vgd;
11820  vgsx = vgs;
11821  }
11822 
11823  // gate resistor model currents. It is not necessary to calculate these
11824  // directly in spice3f5, but it is necessary in Xyce.
11825  Igate = IgateMid = 0.0;
11826  Igate_Jdxp = IgateMid_Jdxp = 0.0;
11827  if(rgateMod == 1)
11828  {
11829  Igate = grgeltd * (Vgegp);
11830  // Igate_Jdxp = - grgeltd * ((Vgegp-Vgegp_orig));
11831  }
11832  else if(rgateMod == 2)
11833  {
11834  Igate = (gcrg) * (Vgegp);
11835  // Igate_Jdxp = - gcrg * ((Vgegp-Vgegp_orig));
11836  }
11837  else if(rgateMod == 3)
11838  {
11839  Igate = grgeltd * (Vgegm);
11840  IgateMid = gcrg * (Vgmgp);
11841 
11842  // Igate_Jdxp = - grgeltd * (Vgegm-Vgegm_orig);
11843  // IgateMid_Jdxp = - gcrg * (Vgmgp-Vgmgp_orig);
11844  }
11845 
11846  if (model_.capMod == 0)
11847  {
11848  cgdo = paramPtr->cgdo;
11849  qgdo = paramPtr->cgdo * vgdx;
11850  cgso = paramPtr->cgso;
11851  qgso = paramPtr->cgso * vgsx;
11852  }
11853  else // For both capMod == 1 and 2
11854  {
11855  T0 = vgdx + CONSTDELTA_1;
11856  T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_1);
11857  T2 = 0.5 * (T0 - T1);
11858 
11859  T3 = paramPtr->weffCV * paramPtr->cgdl;
11860  T4 = sqrt(1.0 - 4.0 * T2 / paramPtr->ckappad);
11861  cgdo = paramPtr->cgdo + T3 - T3 * (1.0 - 1.0 / T4)
11862  * (0.5 - 0.5 * T0 / T1);
11863  qgdo = (paramPtr->cgdo + T3) * vgdx - T3 * (T2
11864  + 0.5 * paramPtr->ckappad * (T4 - 1.0));
11865 
11866  T0 = vgsx + CONSTDELTA_1;
11867  T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_1);
11868  T2 = 0.5 * (T0 - T1);
11869  T3 = paramPtr->weffCV * paramPtr->cgsl;
11870  T4 = sqrt(1.0 - 4.0 * T2 / paramPtr->ckappas);
11871  cgso = paramPtr->cgso + T3 - T3 * (1.0 - 1.0 / T4)
11872  * (0.5 - 0.5 * T0 / T1);
11873  qgso = (paramPtr->cgso + T3) * vgsx - T3 * (T2
11874  + 0.5 * paramPtr->ckappas * (T4 - 1.0));
11875  }
11876 
11877  if (nf != 1.0)
11878  {
11879  cgdo *= nf;
11880  cgso *= nf;
11881  qgdo *= nf;
11882  qgso *= nf;
11883  }
11884  // This silliness unnecessary, conversion from spice's
11885  // here->BSIM4cgdo = cgdo;
11886  // that stuff only needed for bypass
11887  // cgdo = cgdo;
11888  // qgdo = qgdo;
11889  // cgso = cgso;
11890  // qgso = qgso;
11891 
11894 
11895  // Setting up a few currents for the RHS load:
11896  if (model_.rdsMod == 1)
11897  {
11898  Idrain = gdtot * Vddp;
11899  Isource = gstot * Vssp;
11900  }
11901  else
11902  {
11905  }
11906 
11907  // More terms that Spice leaves out because of its formulation, but which
11908  // Xyce absolutely needs in the RHS.
11909  if (model_.rbodyMod != 0)
11910  {
11911  Idbb = grbdb * Vdbb;
11912  Idbbp = grbpd * Vdbbp;
11913  Isbb = grbsb * Vsbb;
11914  Isbbp = grbps * Vsbbp;
11915  Ibpb = grbpb * Vbpb;
11916  }
11917 
11918  return bsuccess;
11919 }
11920 
11921 //-----------------------------------------------------------------------------
11922 // Function : Instance::updatePrimaryState
11923 //
11924 // Purpose : This function sets up the primaray state variables into
11925 // the primary state vector.
11926 //
11927 // These variables include qbulk, qgate, qdrn and, in the
11928 // event that nqsMod=1, qcdump and qcheq.
11929 //
11930 // Special Notes :
11931 // Scope : public
11932 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
11933 // Creation Date : 11/25/06
11934 //-----------------------------------------------------------------------------
11936 {
11937  bool bsuccess = true;
11938 
11939  double * staVec = extData.nextStaVectorRawPtr;
11940 
11941 #ifdef Xyce_DEBUG_DEVICE
11942  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
11943  {
11944  Xyce::dout() << subsection_divider << std::endl;
11945  Xyce::dout() << " Begin of updatePrimaryState. \n";
11946  Xyce::dout() << std::endl;
11947  }
11948 #endif
11949 
11950  bsuccess = updateIntermediateVars ();
11951 
11952  // voltage drops:
11953  double * stoVec = extData.nextStoVectorRawPtr;
11954  stoVec[li_store_vbd] = vbd;
11955  stoVec[li_store_vbs] = vbs;
11956  stoVec[li_store_vgs] = vgs;
11957  stoVec[li_store_vds] = vds;
11958  stoVec[li_store_vges] = vges;
11959  stoVec[li_store_vgms] = vgms;
11960  stoVec[li_store_vdes] = vdes;
11961  stoVec[li_store_vses] = vses;
11962  stoVec[li_store_vdbs] = vdbs;
11963  stoVec[li_store_vsbs] = vsbs;
11964  stoVec[li_store_vdbd] = vdbd;
11965  stoVec[li_store_von] = von;
11966 
11967  // intrinsic capacitors:
11968  // Note the wierdness --- we have a "qg", "qb" and "qd" state variable,
11969  // but no corresponding instance variable --- they are all calculated from
11970  // other quantities that are NOT stored in the instance. We use them
11971  // only in their derivative forms, cqg, cqb, and cqd.
11972  qg = staVec[li_state_qg ] = qgate;
11973  qd = staVec[li_state_qd ] = qdrn-qbd;
11974 
11975  if (!rbodyMod)
11976  {
11977  qb =staVec[li_state_qb ] = qbulk+qbd+qbs;
11978  }
11979  else
11980  {
11981  qb = staVec[li_state_qb ] = qbulk;
11982  }
11983 
11984  if (rgateMod == 3)
11985  {
11986  staVec[li_state_qgmid] = qgmid;
11987  }
11988 
11989  // parasitic capacitors:
11990  if (rbodyMod)
11991  {
11992  staVec[li_state_qbs] = qbs;
11993  staVec[li_state_qbd] = qbd;
11994  }
11995 
11996  if( trnqsMod )
11997  {
11998  staVec[li_state_qcheq] = qcheq;
11999  staVec[li_state_qcdump] = qdef * ScalingFactor;
12000  }
12001 
12002  // if this is the first newton step of the first time step
12003  // of the transient simulation, we need to enforce that the
12004  // time derivatives w.r.t. charge are zero. This is to maintain 3f5
12005  // compatibility. ERK.
12006 
12007  // Note: I think this kind of thing is enforced (or should be enforced,
12008  // anyway) at the time integration level. So I'm not sure this step is
12009  // really needed, at least for new-DAE. Derivatives out of the DCOP
12010  // are supposed to be zero at the first newton step.
12011 
12012  if (!(getSolverState().dcopFlag) && getSolverState().initTranFlag && getSolverState().newtonIter==0)
12013  {
12014  // re-set the state vector pointer that we are using to the "current"
12015  // pointer, rather than the "next" pointer.
12016  double * currStaVec = extData.currStaVectorRawPtr;
12017 
12018  // intrinsic capacitors:
12019  currStaVec[li_state_qg ] = qgate;
12020  currStaVec[li_state_qd ] = qdrn-qbd;
12021  if (!rbodyMod)
12022  {
12023  currStaVec[li_state_qb ] = qbulk+qbd+qbs;
12024  }
12025  else
12026  {
12027  currStaVec[li_state_qb ] = qbulk;
12028  }
12029 
12030  if (rgateMod == 3)
12031  {
12032  currStaVec[li_state_qgmid] = qgmid;
12033  }
12034 
12035  // parasitic capacitors:
12036  if (rbodyMod)
12037  {
12038  currStaVec[li_state_qbs] = qbs;
12039  currStaVec[li_state_qbd] = qbd;
12040  }
12041 
12042  if( trnqsMod )
12043  {
12044  currStaVec[li_state_qcheq] = qcheq;
12045  currStaVec[li_state_qcdump] = qdef * ScalingFactor;
12046  }
12047  }
12048 
12049  return bsuccess;
12050 }
12051 
12052 //-----------------------------------------------------------------------------
12053 // Function : Instance::loadDAEQVector
12054 //
12055 // Purpose : Loads the Q-vector contributions for a single
12056 // bsim4 instance.
12057 //
12058 // Special Notes : The "Q" vector is part of a standard DAE formalism in
12059 // which the system of equations is represented as:
12060 //
12061 // f(x) = dQ(x)/dt + F(x) - B(t) = 0
12062 //
12063 // Scope : public
12064 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
12065 // Creation Date : 11/25/06
12066 //-----------------------------------------------------------------------------
12068 {
12069  bool bsuccess=true;
12070 
12071  double * qVec = extData.daeQVectorRawPtr;
12072  double * dQdxdVp = extData.dQdxdVpVectorRawPtr;
12073 
12074 #ifdef Xyce_DEBUG_DEVICE
12075  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
12076  {
12077  Xyce::dout() << subsection_divider << std::endl;
12078  Xyce::dout() << " MOSFET BSIM4 loadDAEQVector " << std::endl;
12079  Xyce::dout() << " name = " << getName() << std::endl;
12080  Xyce::dout().width(28); Xyce::dout().precision(20); Xyce::dout().setf(std::ios::scientific);
12081  Xyce::dout() << " " << std::endl;
12082  }
12083 #endif
12084 
12086 
12087  double Qeqqg = 0.0; // gate charge
12088  double Qeqqb = 0.0; // bulk charge
12089  double Qeqqd = 0.0; // drain charge
12090  double Qeqqgmid = 0.0; //
12091  double Qeqqjs = 0.0; // source-junction charge
12092  double Qeqqjd = 0.0; // drain-junction charge
12093  double Qqdef = 0.0; // nqs-related charge.
12094  double Qqcheq = 0.0; // nqs-related charge.
12095 
12096  if (model_.dtype > 0)
12097  {
12098  Qeqqg = qg;
12099  Qeqqd = qd;
12100  Qeqqb = qb;
12101 
12102  if (trnqsMod)
12103  {
12104  Qqdef = qdef;
12105  Qqcheq = qcheq;
12106  }
12107 
12108  if (rbodyMod)
12109  {
12110  Qeqqjs = qbs;
12111  Qeqqjd = qbd;
12112  }
12113 
12114  if (rgateMod == 3)
12115  {
12116  Qeqqgmid = qgmid;
12117  }
12118  }
12119  else
12120  {
12121  Qeqqg = -qg;
12122  Qeqqd = -qd;
12123  Qeqqb = -qb;
12124 
12125  if (trnqsMod)
12126  {
12127  Qqdef = -qdef;
12128  Qqcheq = -qcheq;
12129  }
12130 
12131  if (rbodyMod)
12132  {
12133  Qeqqjs = -qbs;
12134  Qeqqjd = -qbd;
12135  }
12136 
12137  if (rgateMod == 3)
12138  {
12139  Qeqqgmid = -qgmid;
12140  }
12141  }
12142 
12143  // Loading q-vector:
12144  qVec[li_DrainPrime] += -(-Qeqqd)*numberParallel;
12145  qVec[li_GatePrime] -= -(Qeqqg)*numberParallel;
12146 
12147  if (rgateMod == 3)
12148  {
12149  qVec[li_GateMid] -= -(+Qeqqgmid)*numberParallel;
12150  }
12151 
12152  if (!rbodyMod)
12153  {
12154  qVec[li_BodyPrime] += -(-Qeqqb)*numberParallel;
12155  qVec[li_SourcePrime] += -(+Qeqqg + Qeqqb + Qeqqd + Qeqqgmid)*numberParallel;
12156  }
12157  else
12158  {
12159  qVec[li_DrainBody] -= -(Qeqqjd)*numberParallel;
12160  qVec[li_BodyPrime] += -(-Qeqqb)*numberParallel;
12161  qVec[li_SourceBody] -= -(Qeqqjs)*numberParallel;
12162  qVec[li_SourcePrime] += -(Qeqqd + Qeqqg + Qeqqb + Qeqqjd + Qeqqjs + Qeqqgmid)*numberParallel;
12163  }
12164 
12165  if (trnqsMod)
12166  {
12167  qVec[li_Charge] += -(Qqcheq - Qqdef)*numberParallel;
12168  }
12169 
12170  // limiter section
12172  {
12173  dQdxdVp[li_DrainPrime] += (-Qeqqd_Jdxp)*numberParallel;
12174  dQdxdVp[li_GatePrime] -= (Qeqqg_Jdxp)*numberParallel;
12175 
12176  if (rgateMod == 3)
12177  {
12178  dQdxdVp[li_GateMid] -= (+Qeqqgmid_Jdxp)*numberParallel;
12179  }
12180 
12181  if (!rbodyMod)
12182  {
12183  dQdxdVp[li_BodyPrime] += (-Qeqqb_Jdxp)*numberParallel;
12185  }
12186  else
12187  {
12188  dQdxdVp[li_DrainBody] -= (Qeqqjd_Jdxp)*numberParallel;
12189  dQdxdVp[li_BodyPrime] += (-Qeqqb_Jdxp)*numberParallel;
12190  dQdxdVp[li_SourceBody] -= (+Qeqqjs_Jdxp)*numberParallel;
12192  }
12193 
12194  if (trnqsMod)
12195  {
12196  dQdxdVp[li_Charge] += (Qqcheq_Jdxp)*numberParallel;
12197  }
12198  }
12199 
12200  return bsuccess;
12201 }
12202 
12203 //-----------------------------------------------------------------------------
12204 // Function : Instance::auxChargeCalculations
12205 //
12206 // Purpose : This function does some final "cleanup" calculations
12207 // having to do with the capacitors.
12208 //
12209 // Special Notes : About all this function really does is set up some
12210 // voltlim terms, and some unused nqs stuff.
12211 //
12212 // Scope : public
12213 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
12214 // Creation Date : 11/25/06
12215 //-----------------------------------------------------------------------------
12217 {
12218  double T0, T1;
12219 
12221  {
12222  sxpart = (1.0 - (dxpart = (mode > 0) ? 0.4 : 0.6));
12225  Qeqqg_Jdxp=0.0;
12226  Qeqqd_Jdxp=0.0;
12227  Qeqqb_Jdxp=0.0;
12228  Qeqqgmid_Jdxp=0.0;
12229  Qeqqjs_Jdxp = 0.0;
12230  Qeqqjd_Jdxp = 0.0;
12231 
12232  if (trnqsMod)
12233  {
12235  * paramPtr->leffCV;
12236  T1 = gcrg / CoxWL;
12237  gtau = T1 * ScalingFactor;
12238  }
12239  else
12240  {
12241  gtau = 0.0;
12242  }
12243  }
12244  else // ChargeComputation is needed
12245  {
12246 
12247  Qeqqg_Jdxp = 0.0;
12248  if (!origFlag)
12249  {
12250  Qeqqg_Jdxp = - CAPcggb * (vgb-vgb_orig)
12251  + CAPcgdb * (vbd-vbd_orig)
12252  + CAPcgsb * (vbs-vbs_orig);
12253  }
12254 
12255  Qeqqd_Jdxp = 0.0;
12256  if (!origFlag)
12257  {
12258  Qeqqd_Jdxp = - CAPcdgb * (vgb-vgb_orig)
12259  - CAPcdgmb * (vgmb-vgmb_orig)
12260  + (CAPcddb + CAPcdbdb) * (vbd-vbd_orig)
12262  + CAPcdsb * (vbs-vbs_orig);
12263  }
12264 
12265  Qeqqb_Jdxp = 0.0;
12266  if (!origFlag)
12267  {
12268  Qeqqb_Jdxp = - CAPcbgb * (vgb-vgb_orig)
12269  - CAPcbgmb * (vgmb-vgmb_orig)
12270  + CAPcbdb * (vbd-vbd_orig)
12271  + CAPcbsb * (vbs-vbs_orig);
12272  }
12273 
12274  if (rgateMod == 3)
12275  {
12276  Qeqqgmid_Jdxp = 0.0;
12277  if (!origFlag)
12278  {
12280  + CAPcgmsb * (vbs-vbs_orig)
12281  - CAPcgmgmb * (vgmb-vgmb_orig);
12282  }
12283  }
12284  else
12285  {
12286  Qeqqgmid_Jdxp = 0.0;
12287  }
12288 
12289  if (rbodyMod)
12290  {
12291  Qeqqjs_Jdxp = 0.0;
12292  Qeqqjd_Jdxp = 0.0;
12293  if (!origFlag)
12294  {
12297  }
12298  }
12299 
12300  if (trnqsMod)
12301  {
12302  // Not sure if these nqs-related terms are correct.
12303  T0 = ggtg * (vgb-vgb_orig) - ggtd * (vbd-vbd_orig) - ggts * (vbs-vbs_orig);
12304 
12305  //ceqqg += 0.0;
12306  Qeqqg_Jdxp += T0;
12307  T1 = qdef * gtau;
12308 
12309  //ceqqd -= 0.0;
12310  Qeqqd_Jdxp -= dxpart * T0
12311  + T1 * (ddxpart_dVg * (vgb-vgb_orig)
12312  - ddxpart_dVd * (vbd-vbd_orig)
12313  - ddxpart_dVs * (vbs-vbs_orig));
12314 
12315  cqdef = cqcdump - gqdef * qdef;
12316 
12317  //cqcheq = cqcheq; // redundant..
12318  Qqcheq_Jdxp = -(
12319  CAPcqgb * (vgb-vgb_orig)
12320  - CAPcqdb * (vbd-vbd_orig)
12321  - CAPcqsb * (vbs-vbs_orig)) + T0;
12322  }
12323 
12324 #if 0
12325  if (ckt->CKTmode & MODEINITTRAN)
12326  {
12327  *(ckt->CKTstate1 + cqb) = *(ckt->CKTstate0 + cqb);
12328  *(ckt->CKTstate1 + cqg) = *(ckt->CKTstate0 + cqg);
12329  *(ckt->CKTstate1 + cqd) = *(ckt->CKTstate0 + cqd);
12330 
12331  if (rgateMod == 3)
12332  {
12333  *(ckt->CKTstate1 + cqgmid) = *(ckt->CKTstate0 + cqgmid);
12334  }
12335 
12336  if (rbodyMod)
12337  {
12338  *(ckt->CKTstate1 + cqbs) = *(ckt->CKTstate0 + cqbs);
12339  *(ckt->CKTstate1 + cqbd) = *(ckt->CKTstate0 + cqbd);
12340  }
12341  }
12342 #endif
12343 
12344  } // !ChargeComputationNeeded
12345 
12346  return true;
12347 }
12348 
12349 //-----------------------------------------------------------------------------
12350 // Function : Instance::setupCapacitors_newDAE ()
12351 // Purpose :
12352 // Special Notes :
12353 // Scope : public
12354 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
12355 // Creation Date : 11/25/06
12356 //-----------------------------------------------------------------------------
12358 {
12359  if (mode > 0)
12360  {
12361  if (trnqsMod == 0)
12362  {
12363  if (rgateMod == 3)
12364  {
12365  CAPcgmgmb = (cgdo + cgso + paramPtr->cgbo) ;
12366  CAPcgmdb = -cgdo ;
12367  CAPcgmsb = -cgso ;
12368  CAPcgmbb = -paramPtr->cgbo ;
12369 
12370  CAPcdgmb = CAPcgmdb;
12371  CAPcsgmb = CAPcgmsb;
12372  CAPcbgmb = CAPcgmbb;
12373 
12374  CAPcggb = cggb ;
12375  CAPcgdb = cgdb ;
12376  CAPcgsb = cgsb ;
12377  CAPcgbb = -(CAPcggb + CAPcgdb + CAPcgsb);
12378 
12379  CAPcdgb = cdgb ;
12380  CAPcsgb = -(cggb + cbgb + cdgb) ;
12381  CAPcbgb = cbgb ;
12382  }
12383  else
12384  {
12385  CAPcggb = (cggb + cgdo + cgso + paramPtr->cgbo ) ;
12386  CAPcgdb = (cgdb - cgdo) ;
12387  CAPcgsb = (cgsb - cgso) ;
12388  CAPcgbb = -(CAPcggb + CAPcgdb + CAPcgsb);
12389 
12390  CAPcdgb = (cdgb - cgdo) ;
12391  CAPcsgb = -(cggb + cbgb + cdgb + cgso) ;
12392  CAPcbgb = (cbgb - paramPtr->cgbo) ;
12393 
12394  CAPcdgmb = CAPcsgmb = CAPcbgmb = 0.0;
12395 
12396  }
12397  CAPcddb = (cddb + capbd + cgdo) ;
12398  CAPcdsb = cdsb ;
12399 
12400  CAPcsdb = -(cgdb + cbdb + cddb) ;
12401  CAPcssb = (capbs + cgso - (cgsb + cbsb + cdsb)) ;
12402 
12403  if (!rbodyMod)
12404  {
12405  CAPcdbb = -(CAPcdgb + CAPcddb + CAPcdsb + CAPcdgmb);
12406  CAPcsbb = -(CAPcsgb + CAPcsdb + CAPcssb + CAPcsgmb);
12407  CAPcbdb = (cbdb - capbd) ;
12408  CAPcbsb = (cbsb - capbs) ;
12409  CAPcdbdb = 0.0; CAPcsbsb = 0.0;
12410  }
12411  else
12412  {
12413  CAPcdbb = -(cddb + cdgb + cdsb) ;
12414  CAPcsbb = -(CAPcsgb + CAPcsdb + CAPcssb + CAPcsgmb) + capbs ;
12415  CAPcbdb = cbdb ;
12416  CAPcbsb = cbsb ;
12417 
12418  CAPcdbdb = -capbd ;
12419  CAPcsbsb = -capbs ;
12420  }
12421  CAPcbbb = -(CAPcbdb + CAPcbgb + CAPcbsb + CAPcbgmb);
12422 
12423  }
12424  else
12425  {
12426  CAPcqgb = cqgb ;
12427  CAPcqdb = cqdb ;
12428  CAPcqsb = cqsb ;
12429  CAPcqbb = cqbb ;
12430 
12431 
12432  if (rgateMod == 3)
12433  {
12434  CAPcgmgmb = (cgdo + cgso + paramPtr->cgbo) ;
12435  CAPcgmdb = -cgdo ;
12436  CAPcgmsb = -cgso ;
12437  CAPcgmbb = -paramPtr->cgbo ;
12438 
12439  CAPcdgmb = CAPcgmdb;
12440  CAPcsgmb = CAPcgmsb;
12441  CAPcbgmb = CAPcgmbb;
12442 
12443  CAPcdgb = CAPcsgb = CAPcbgb = 0.0;
12444  CAPcggb = CAPcgdb = CAPcgsb = CAPcgbb = 0.0;
12445 
12446  }
12447  else
12448  {
12449  CAPcggb = (cgdo + cgso + paramPtr->cgbo ) ;
12450  CAPcgdb = -cgdo ;
12451  CAPcgsb = -cgso ;
12452  CAPcgbb = -paramPtr->cgbo ;
12453 
12454  CAPcdgb = CAPcgdb;
12455  CAPcsgb = CAPcgsb;
12456  CAPcbgb = CAPcgbb;
12457  CAPcdgmb = CAPcsgmb = CAPcbgmb = 0.0;
12458 
12459  }
12460 
12461  CAPcddb = (capbd + cgdo) ;
12462  CAPcdsb = CAPcsdb = 0.0;
12463  CAPcssb = (capbs + cgso) ;
12464 
12465  if (!rbodyMod)
12466  {
12467  CAPcdbb = -(CAPcdgb + CAPcddb + CAPcdgmb);
12468  CAPcsbb = -(CAPcsgb + CAPcssb + CAPcsgmb);
12469  CAPcbdb = -capbd ;
12470  CAPcbsb = -capbs ;
12471  CAPcdbdb = 0.0; CAPcsbsb = 0.0;
12472  }
12473  else
12474  {
12475  CAPcdbb = CAPcsbb = CAPcbdb = CAPcbsb = 0.0;
12476  CAPcdbdb = -capbd ;
12477  CAPcsbsb = -capbs ;
12478  }
12479  CAPcbbb = -(CAPcbdb + CAPcbgb + CAPcbsb + CAPcbgmb);
12480  }
12481  }
12482  else
12483  {
12484  if (trnqsMod == 0)
12485  {
12486  if (rgateMod == 3)
12487  {
12488  CAPcgmgmb = (cgdo + cgso + paramPtr->cgbo) ;
12489  CAPcgmdb = -cgdo ;
12490  CAPcgmsb = -cgso ;
12491  CAPcgmbb = -paramPtr->cgbo ;
12492 
12493  CAPcdgmb = CAPcgmdb;
12494  CAPcsgmb = CAPcgmsb;
12495  CAPcbgmb = CAPcgmbb;
12496 
12497  CAPcggb = cggb ;
12498  CAPcgdb = cgsb ;
12499  CAPcgsb = cgdb ;
12500  CAPcgbb = -(CAPcggb + CAPcgdb + CAPcgsb);
12501 
12502  CAPcdgb = -(cggb + cbgb + cdgb) ;
12503  CAPcsgb = cdgb ;
12504  CAPcbgb = cbgb ;
12505 
12506  }
12507  else
12508  {
12509  CAPcggb = (cggb + cgdo + cgso + paramPtr->cgbo ) ;
12510  CAPcgdb = (cgsb - cgdo) ;
12511  CAPcgsb = (cgdb - cgso) ;
12512  CAPcgbb = -(CAPcggb + CAPcgdb + CAPcgsb);
12513 
12514  CAPcdgb = -(cggb + cbgb + cdgb + cgdo) ;
12515  CAPcsgb = (cdgb - cgso) ;
12516  CAPcbgb = (cbgb - paramPtr->cgbo) ;
12517 
12518  CAPcdgmb = CAPcsgmb = CAPcbgmb = 0.0;
12519 
12520  }
12521  CAPcddb = (capbd + cgdo - (cgsb + cbsb + cdsb)) ;
12522  CAPcdsb = -(cgdb + cbdb + cddb) ;
12523 
12524  CAPcsdb = cdsb ;
12525  CAPcssb = (cddb + capbs + cgso) ;
12526 
12527  if (!rbodyMod)
12528  {
12529  CAPcdbb = -(CAPcdgb + CAPcddb + CAPcdsb + CAPcdgmb);
12530  CAPcsbb = -(CAPcsgb + CAPcsdb + CAPcssb + CAPcsgmb);
12531  CAPcbdb = (cbsb - capbd) ;
12532  CAPcbsb = (cbdb - capbs) ;
12533  CAPcdbdb = 0.0; CAPcsbsb = 0.0;
12534  }
12535  else
12536  {
12537  CAPcdbb = -(CAPcdgb + CAPcddb + CAPcdsb + CAPcdgmb) + capbd ;
12538  CAPcsbb = -(cddb + cdgb + cdsb) ;
12539  CAPcbdb = cbsb ;
12540  CAPcbsb = cbdb ;
12541  CAPcdbdb = -capbd ;
12542  CAPcsbsb = -capbs ;
12543  }
12544  CAPcbbb = -(CAPcbgb + CAPcbdb + CAPcbsb + CAPcbgmb);
12545  }
12546  else
12547  {
12548 
12549  CAPcqgb = cqgb ;
12550  CAPcqdb = cqsb ;
12551  CAPcqsb = cqdb ;
12552  CAPcqbb = cqbb ;
12553 
12554 
12555  if (rgateMod == 3)
12556  {
12557  CAPcgmgmb = (cgdo + cgso + paramPtr->cgbo) ;
12558  CAPcgmdb = -cgdo ;
12559  CAPcgmsb = -cgso ;
12560  CAPcgmbb = -paramPtr->cgbo ;
12561 
12562  CAPcdgmb = CAPcgmdb;
12563  CAPcsgmb = CAPcgmsb;
12564  CAPcbgmb = CAPcgmbb;
12565 
12566  CAPcdgb = CAPcsgb = CAPcbgb = 0.0;
12567  CAPcggb = CAPcgdb = CAPcgsb = CAPcgbb = 0.0;
12568 
12569  }
12570  else
12571  {
12572  CAPcggb = (cgdo + cgso + paramPtr->cgbo ) ;
12573  CAPcgdb = -cgdo ;
12574  CAPcgsb = -cgso ;
12575  CAPcgbb = -paramPtr->cgbo ;
12576 
12577  CAPcdgb = CAPcgdb;
12578  CAPcsgb = CAPcgsb;
12579  CAPcbgb = CAPcgbb;
12580  CAPcdgmb = CAPcsgmb = CAPcbgmb = 0.0;
12581 
12582  }
12583 
12584  CAPcddb = (capbd + cgdo) ;
12585  CAPcdsb = CAPcsdb = 0.0;
12586  CAPcssb = (capbs + cgso) ;
12587  if (!rbodyMod)
12588  {
12589  CAPcdbb = -(CAPcdgb + CAPcddb + CAPcdgmb);
12590  CAPcsbb = -(CAPcsgb + CAPcssb + CAPcsgmb);
12591  CAPcbdb = -capbd ;
12592  CAPcbsb = -capbs ;
12593  CAPcdbdb = 0.0; CAPcsbsb = 0.0;
12594  }
12595  else
12596  {
12597  CAPcdbb = CAPcsbb = CAPcbdb = CAPcbsb = 0.0;
12598  CAPcdbdb = -capbd ;
12599  CAPcsbsb = -capbs ;
12600  }
12601  CAPcbbb = -(CAPcbdb + CAPcbgb + CAPcbsb + CAPcbgmb);
12602  }
12603  }
12604 
12605  return true;
12606 }
12607 
12608 //-----------------------------------------------------------------------------
12609 // Function : Instance::setupCapacitors_oldDAE ()
12610 // Purpose :
12611 // Special Notes :
12612 // Scope : public
12613 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
12614 // Creation Date : 12/17/06
12615 //-----------------------------------------------------------------------------
12617 {
12618  double ag0 = getSolverState().pdt;
12619  double T0;
12620 
12621  // ERK. 12/17/2006.
12622  // It is necessary to set ag0=0.0, because for the first time step out of
12623  // the DCOP, all the time derivatives are forced to be zero. Thus, all
12624  // their derivatives should also be zero. If it wasn't for that, then ag0
12625  // could always be pdt. (it used to be, before the -jacobian_test capability).
12626  if (!(getSolverState().dcopFlag) && getSolverState().initTranFlag && getSolverState().newtonIter==0)
12627  {
12628  ag0 = 0.0;
12629  }
12630 
12631  if (mode > 0)
12632  {
12633  if (trnqsMod == 0)
12634  {
12635  qdrn -= qgdo;
12636  if (rgateMod == 3)
12637  {
12638  gcgmgmb = (cgdo + cgso + paramPtr->cgbo) * ag0;
12639  gcgmdb = -cgdo * ag0;
12640  gcgmsb = -cgso * ag0;
12641  gcgmbb = -paramPtr->cgbo * ag0;
12642 
12643  gcdgmb = gcgmdb;
12644  gcsgmb = gcgmsb;
12645  gcbgmb = gcgmbb;
12646 
12647  gcggb = cggb * ag0;
12648  gcgdb = cgdb * ag0;
12649  gcgsb = cgsb * ag0;
12650  gcgbb = -(gcggb + gcgdb + gcgsb);
12651 
12652  gcdgb = cdgb * ag0;
12653  gcsgb = -(cggb + cbgb + cdgb) * ag0;
12654  gcbgb = cbgb * ag0;
12655 
12656  qgmb = paramPtr->cgbo * vgmb;
12657  qgmid = qgdo + qgso + qgmb;
12658  qbulk -= qgmb;
12659  qsrc = -(qgate + qgmid + qbulk + qdrn);
12660  }
12661  else
12662  {
12663  gcggb = (cggb + cgdo + cgso + paramPtr->cgbo ) * ag0;
12664  gcgdb = (cgdb - cgdo) * ag0;
12665  gcgsb = (cgsb - cgso) * ag0;
12666  gcgbb = -(gcggb + gcgdb + gcgsb);
12667 
12668  gcdgb = (cdgb - cgdo) * ag0;
12669  gcsgb = -(cggb + cbgb + cdgb + cgso) * ag0;
12670  gcbgb = (cbgb - paramPtr->cgbo) * ag0;
12671 
12672  gcdgmb = gcsgmb = gcbgmb = 0.0;
12673 
12674  qgb = paramPtr->cgbo * vgb;
12675  qgate += qgdo + qgso + qgb;
12676  qbulk -= qgb;
12677  qsrc = -(qgate + qbulk + qdrn);
12678  }
12679  gcddb = (cddb + capbd + cgdo) * ag0;
12680  gcdsb = cdsb * ag0;
12681 
12682  gcsdb = -(cgdb + cbdb + cddb) * ag0;
12683  gcssb = (capbs + cgso - (cgsb + cbsb + cdsb)) * ag0;
12684 
12685  if (!rbodyMod)
12686  {
12687  gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb);
12688  gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb);
12689  gcbdb = (cbdb - capbd) * ag0;
12690  gcbsb = (cbsb - capbs) * ag0;
12691  gcdbdb = 0.0; gcsbsb = 0.0;
12692  }
12693  else
12694  {
12695  gcdbb = -(cddb + cdgb + cdsb) * ag0;
12696  gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb) + capbs * ag0;
12697  gcbdb = cbdb * ag0;
12698  gcbsb = cbsb * ag0;
12699 
12700  gcdbdb = -capbd * ag0;
12701  gcsbsb = -capbs * ag0;
12702  }
12703  gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb);
12704 
12705  ggtg = ggtd = ggtb = ggts = 0.0;
12706  sxpart = 0.6;
12707  dxpart = 0.4;
12710  }
12711  else
12712  {
12713  qcheq = qchqs;
12715  * paramPtr->leffCV;
12716  T0 = qdef * ScalingFactor / CoxWL;
12717 
12718  ggtg = gtg = T0 * gcrgg;
12719  ggtd = gtd = T0 * gcrgd;
12720  ggts = gts = T0 * gcrgs;
12721  ggtb = gtb = T0 * gcrgb;
12722  gqdef = ScalingFactor * ag0;
12723 
12724  gcqgb = cqgb * ag0;
12725  gcqdb = cqdb * ag0;
12726  gcqsb = cqsb * ag0;
12727  gcqbb = cqbb * ag0;
12728 
12729  if (fabs(qcheq) <= 1.0e-5 * CoxWL)
12730  {
12731  if (model_.xpart < 0.5)
12732  {
12733  dxpart = 0.4;
12734  }
12735  else if (model_.xpart > 0.5)
12736  {
12737  dxpart = 0.0;
12738  }
12739  else
12740  {
12741  dxpart = 0.5;
12742  }
12744  = ddxpart_dVs = 0.0;
12745  }
12746  else
12747  {
12748  dxpart = qdrn / qcheq;
12749  Cdd = cddb;
12750  Csd = -(cgdb + cddb
12751  + cbdb);
12752  ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq;
12753  Cdg = cdgb;
12754  Csg = -(cggb + cdgb
12755  + cbgb);
12756  ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq;
12757 
12758  Cds = cdsb;
12759  Css = -(cgsb + cdsb
12760  + cbsb);
12761  ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq;
12762 
12764  }
12765  sxpart = 1.0 - dxpart;
12770 
12771  if (rgateMod == 3)
12772  {
12773  gcgmgmb = (cgdo + cgso + paramPtr->cgbo) * ag0;
12774  gcgmdb = -cgdo * ag0;
12775  gcgmsb = -cgso * ag0;
12776  gcgmbb = -paramPtr->cgbo * ag0;
12777 
12778  gcdgmb = gcgmdb;
12779  gcsgmb = gcgmsb;
12780  gcbgmb = gcgmbb;
12781 
12782  gcdgb = gcsgb = gcbgb = 0.0;
12783  gcggb = gcgdb = gcgsb = gcgbb = 0.0;
12784 
12785  qgmb = paramPtr->cgbo * vgmb;
12786  qgmid = qgdo + qgso + qgmb;
12787  qgate = 0.0;
12788  qbulk = -qgmb;
12789  qdrn = -qgdo;
12790  qsrc = -(qgmid + qbulk + qdrn);
12791  }
12792  else
12793  {
12794  gcggb = (cgdo + cgso + paramPtr->cgbo ) * ag0;
12795  gcgdb = -cgdo * ag0;
12796  gcgsb = -cgso * ag0;
12797  gcgbb = -paramPtr->cgbo * ag0;
12798 
12799  gcdgb = gcgdb;
12800  gcsgb = gcgsb;
12801  gcbgb = gcgbb;
12802  gcdgmb = gcsgmb = gcbgmb = 0.0;
12803 
12804  qgb = paramPtr->cgbo * vgb;
12805  qgate = qgdo + qgso + qgb;
12806  qbulk = -qgb;
12807  qdrn = -qgdo;
12808  qsrc = -(qgate + qbulk + qdrn);
12809  }
12810 
12811  gcddb = (capbd + cgdo) * ag0;
12812  gcdsb = gcsdb = 0.0;
12813  gcssb = (capbs + cgso) * ag0;
12814 
12815  if (!rbodyMod)
12816  {
12817  gcdbb = -(gcdgb + gcddb + gcdgmb);
12818  gcsbb = -(gcsgb + gcssb + gcsgmb);
12819  gcbdb = -capbd * ag0;
12820  gcbsb = -capbs * ag0;
12821  gcdbdb = 0.0; gcsbsb = 0.0;
12822  }
12823  else
12824  {
12825  gcdbb = gcsbb = gcbdb = gcbsb = 0.0;
12826  gcdbdb = -capbd * ag0;
12827  gcsbsb = -capbs * ag0;
12828  }
12829  gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb);
12830  }
12831  }
12832  else
12833  {
12834  if (trnqsMod == 0)
12835  {
12836  qsrc = qdrn - qgso;
12837  if (rgateMod == 3)
12838  {
12839  gcgmgmb = (cgdo + cgso + paramPtr->cgbo) * ag0;
12840  gcgmdb = -cgdo * ag0;
12841  gcgmsb = -cgso * ag0;
12842  gcgmbb = -paramPtr->cgbo * ag0;
12843 
12844  gcdgmb = gcgmdb;
12845  gcsgmb = gcgmsb;
12846  gcbgmb = gcgmbb;
12847 
12848  gcggb = cggb * ag0;
12849  gcgdb = cgsb * ag0;
12850  gcgsb = cgdb * ag0;
12851  gcgbb = -(gcggb + gcgdb + gcgsb);
12852 
12853  gcdgb = -(cggb + cbgb + cdgb) * ag0;
12854  gcsgb = cdgb * ag0;
12855  gcbgb = cbgb * ag0;
12856 
12857  qgmb = paramPtr->cgbo * vgmb;
12858  qgmid = qgdo + qgso + qgmb;
12859  qbulk -= qgmb;
12860  qdrn = -(qgate + qgmid + qbulk + qsrc);
12861  }
12862  else
12863  {
12864  gcggb = (cggb + cgdo + cgso + paramPtr->cgbo ) * ag0;
12865  gcgdb = (cgsb - cgdo) * ag0;
12866  gcgsb = (cgdb - cgso) * ag0;
12867  gcgbb = -(gcggb + gcgdb + gcgsb);
12868 
12869  gcdgb = -(cggb + cbgb + cdgb + cgdo) * ag0;
12870  gcsgb = (cdgb - cgso) * ag0;
12871  gcbgb = (cbgb - paramPtr->cgbo) * ag0;
12872 
12873  gcdgmb = gcsgmb = gcbgmb = 0.0;
12874 
12875  qgb = paramPtr->cgbo * vgb;
12876  qgate += qgdo + qgso + qgb;
12877  qbulk -= qgb;
12878  qdrn = -(qgate + qbulk + qsrc);
12879  }
12880  gcddb = (capbd + cgdo - (cgsb + cbsb + cdsb)) * ag0;
12881  gcdsb = -(cgdb + cbdb + cddb) * ag0;
12882 
12883  gcsdb = cdsb * ag0;
12884  gcssb = (cddb + capbs + cgso) * ag0;
12885 
12886  if (!rbodyMod)
12887  {
12888  gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb);
12889  gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb);
12890  gcbdb = (cbsb - capbd) * ag0;
12891  gcbsb = (cbdb - capbs) * ag0;
12892  gcdbdb = 0.0; gcsbsb = 0.0;
12893  }
12894  else
12895  {
12896  gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb) + capbd * ag0;
12897  gcsbb = -(cddb + cdgb + cdsb) * ag0;
12898  gcbdb = cbsb * ag0;
12899  gcbsb = cbdb * ag0;
12900  gcdbdb = -capbd * ag0;
12901  gcsbsb = -capbs * ag0;
12902  }
12903  gcbbb = -(gcbgb + gcbdb + gcbsb + gcbgmb);
12904 
12905  ggtg = ggtd = ggtb = ggts = 0.0;
12906  sxpart = 0.4;
12907  dxpart = 0.6;
12910  }
12911  else
12912  {
12913  qcheq = qchqs;
12915  * paramPtr->leffCV;
12916  T0 = qdef * ScalingFactor / CoxWL;
12917  ggtg = gtg = T0 * gcrgg;
12918  ggts = gts = T0 * gcrgd;
12919  ggtd = gtd = T0 * gcrgs;
12920  ggtb = gtb = T0 * gcrgb;
12921  gqdef = ScalingFactor * ag0;
12922 
12923  gcqgb = cqgb * ag0;
12924  gcqdb = cqsb * ag0;
12925  gcqsb = cqdb * ag0;
12926  gcqbb = cqbb * ag0;
12927 
12928  if (fabs(qcheq) <= 1.0e-5 * CoxWL)
12929  {
12930  if (model_.xpart < 0.5)
12931  {
12932  sxpart = 0.4;
12933  }
12934  else if (model_.xpart > 0.5)
12935  {
12936  sxpart = 0.0;
12937  }
12938  else
12939  {
12940  sxpart = 0.5;
12941  }
12943  }
12944  else
12945  {
12946  sxpart = qdrn / qcheq;
12947  Css = cddb;
12948  Cds = -(cgdb + cddb
12949  + cbdb);
12950  dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq;
12951  Csg = cdgb;
12952  Cdg = -(cggb + cdgb
12953  + cbgb);
12954  dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq;
12955 
12956  Csd = cdsb;
12957  Cdd = -(cgsb + cdsb
12958  + cbsb);
12959  dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq;
12960 
12962  }
12963  dxpart = 1.0 - sxpart;
12968 
12969  if (rgateMod == 3)
12970  {
12971  gcgmgmb = (cgdo + cgso + paramPtr->cgbo) * ag0;
12972  gcgmdb = -cgdo * ag0;
12973  gcgmsb = -cgso * ag0;
12974  gcgmbb = -paramPtr->cgbo * ag0;
12975 
12976  gcdgmb = gcgmdb;
12977  gcsgmb = gcgmsb;
12978  gcbgmb = gcgmbb;
12979 
12980  gcdgb = gcsgb = gcbgb = 0.0;
12981  gcggb = gcgdb = gcgsb = gcgbb = 0.0;
12982 
12983  qgmb = paramPtr->cgbo * vgmb;
12984  qgmid = qgdo + qgso + qgmb;
12985  qgate = 0.0;
12986  qbulk = -qgmb;
12987  qdrn = -qgdo;
12988  qsrc = -qgso;
12989  }
12990  else
12991  {
12992  gcggb = (cgdo + cgso + paramPtr->cgbo ) * ag0;
12993  gcgdb = -cgdo * ag0;
12994  gcgsb = -cgso * ag0;
12995  gcgbb = -paramPtr->cgbo * ag0;
12996 
12997  gcdgb = gcgdb;
12998  gcsgb = gcgsb;
12999  gcbgb = gcgbb;
13000  gcdgmb = gcsgmb = gcbgmb = 0.0;
13001 
13002  qgb = paramPtr->cgbo * vgb;
13003  qgate = qgdo + qgso + qgb;
13004  qbulk = -qgb;
13005  qdrn = -qgdo;
13006  qsrc = -qgso;
13007  }
13008 
13009  gcddb = (capbd + cgdo) * ag0;
13010  gcdsb = gcsdb = 0.0;
13011  gcssb = (capbs + cgso) * ag0;
13012  if (!rbodyMod)
13013  {
13014  gcdbb = -(gcdgb + gcddb + gcdgmb);
13015  gcsbb = -(gcsgb + gcssb + gcsgmb);
13016  gcbdb = -capbd * ag0;
13017  gcbsb = -capbs * ag0;
13018  gcdbdb = 0.0; gcsbsb = 0.0;
13019  }
13020  else
13021  {
13022  gcdbb = gcsbb = gcbdb = gcbsb = 0.0;
13023  gcdbdb = -capbd * ag0;
13024  gcsbsb = -capbs * ag0;
13025  }
13026  gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb);
13027  }
13028  }
13029 
13030  return true;
13031 }
13032 
13033 //-----------------------------------------------------------------------------
13034 // Function : Instance::loadDAEFVector
13035 //
13036 // Purpose : Loads the F-vector contributions for a single
13037 // bsim4 instance.
13038 //
13039 // Special Notes : See the special notes for loadDAEFVector.
13040 //
13041 // Scope : public
13042 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
13043 // Creation Date : 11/25/06
13044 //-----------------------------------------------------------------------------
13046 {
13047  bool bsuccess = true;
13048 
13049  double * fVec = extData.daeFVectorRawPtr;
13050  double * dFdxdVp = extData.dFdxdVpVectorRawPtr;
13051 
13052 #ifdef Xyce_DEBUG_DEVICE
13053  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
13054  {
13055  Xyce::dout() << std::endl << subsection_divider << std::endl;
13056  Xyce::dout() << " Begin of Instance::loadDAEFVector. ";
13057  Xyce::dout() << " origFlag = " << origFlag << " name = " << getName() << std::endl;
13058 
13059  Xyce::dout().width(28); Xyce::dout().precision(20); Xyce::dout().setf(std::ios::scientific);
13060  Xyce::dout() << " " << std::endl;
13061  }
13062 #endif
13063 
13064 #if 1
13065  setupFVectorVars ();
13066 #else
13067  double ceqdrn_Jdxp(0.0), ceqbd_Jdxp(0.0), ceqbs_Jdxp(0.0);
13068  double Istoteq_Jdxp(0.0), Idtoteq_Jdxp(0.0);
13069  double Ibtoteq_Jdxp(0.0), Igtoteq_Jdxp(0.0);
13070  double ceqgcrg_Jdxp(0.0), ceqgstot_Jdxp(0.0), ceqgdtot_Jdxp(0.0);
13071  double ceqjs_Jdxp(0.0), ceqjd_Jdxp(0.0);
13072  double T0;
13073 
13074  if (mode >= 0)
13075  {
13076  Gm = gm;
13077  Gmbs = gmbs;
13078  FwdSum = Gm + Gmbs;
13079  RevSum = 0.0;
13080 
13081  ceqdrn = model_.dtype * cdrain;
13083  (-gds * (vds-vds_orig)
13084  -Gm * (vgs-vgs_orig)
13085  -Gmbs * (vbs-vbs_orig));
13086 
13087  ceqbd = model_.dtype * (csub + Igidl);
13088  ceqbd_Jdxp = model_.dtype * (
13089  - (gbds + ggidld) * (vds-vds_orig)
13090  - (gbgs + ggidlg) * (vgs-vgs_orig)
13091  - (gbbs + ggidlb) * (vbs-vbs_orig));
13092 
13093  ceqbs = model_.dtype * Igisl;
13094  ceqbs_Jdxp = model_.dtype * (
13095  + ggisls * (vds-vds_orig)
13096  - ggislg * (vgd-vgd_orig)
13097  - ggislb * (vbd-vbd_orig));
13098 
13099  gbbdp = -(gbds);
13100  gbbsp = gbds + gbgs + gbbs;
13101 
13102  gbdpg = gbgs;
13103  gbdpdp = gbds;
13104  gbdpb = gbbs;
13105  gbdpsp = -(gbdpg + gbdpdp + gbdpb);
13106 
13107  gbspg = 0.0;
13108  gbspdp = 0.0;
13109  gbspb = 0.0;
13110  gbspsp = 0.0;
13111 
13112  if (model_.igcMod)
13113  {
13114  gIstotg = gIgsg + gIgcsg;
13115  gIstotd = gIgcsd;
13116  gIstots = gIgss + gIgcss;
13117  gIstotb = gIgcsb;
13118  Istoteq = model_.dtype * (Igs + Igcs);
13119  Istoteq_Jdxp = model_.dtype * (
13120  - gIstotg * (vgs-vgs_orig)
13121  - gIgcsd * (vds-vds_orig)
13122  - gIgcsb * (vbs-vbs_orig));
13123 
13124  gIdtotg = gIgdg + gIgcdg;
13125  gIdtotd = gIgdd + gIgcdd;
13126  gIdtots = gIgcds;
13127  gIdtotb = gIgcdb;
13128  Idtoteq = model_.dtype * (Igd + Igcd);
13129  Idtoteq_Jdxp = model_.dtype * (
13130  - gIgdg * (vgd-vgd_orig)
13131  - gIgcdg * (vgs-vgs_orig)
13132  - gIgcdd * (vds-vds_orig)
13133  - gIgcdb * (vbs-vbs_orig));
13134  }
13135  else
13136  {
13137  gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0;
13138  gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0;
13139  Istoteq_Jdxp = 0.0;
13140  Idtoteq_Jdxp = 0.0;
13141  }
13142 
13143  if (model_.igbMod)
13144  {
13145  gIbtotg = gIgbg;
13146  gIbtotd = gIgbd;
13147  gIbtots = gIgbs;
13148  gIbtotb = gIgbb;
13149  Ibtoteq = model_.dtype * Igb;
13150  Ibtoteq_Jdxp = model_.dtype * (
13151  - gIgbg * (vgs-vgs_orig)
13152  - gIgbd * (vds-vds_orig)
13153  - gIgbb * (vbs-vbs_orig));
13154  }
13155  else
13156  {
13157  gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0;
13158  Ibtoteq_Jdxp = 0.0;
13159  }
13160 
13161  if ((model_.igcMod != 0) || (model_.igbMod != 0))
13162  {
13164  gIgtotd = gIstotd + gIdtotd + gIbtotd ;
13168  Igtoteq_Jdxp = Istoteq_Jdxp + Idtoteq_Jdxp + Ibtoteq_Jdxp;
13169  }
13170  else
13171  {
13172  gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0;
13173  Igtoteq_Jdxp = 0.0;
13174  }
13175 
13176 
13177  if (rgateMod == 2)
13178  {
13179  T0 = vges - vgs;
13180  }
13181  else if (rgateMod == 3)
13182  {
13183  T0 = vgms - vgs;
13184  }
13185 
13186  if (rgateMod > 1)
13187  {
13188  gcrgd = gcrgd * T0;
13189  gcrgg = gcrgg * T0;
13190  gcrgs = gcrgs * T0;
13191  gcrgb = gcrgb * T0;
13192  ceqgcrg = 0.0;
13193  ceqgcrg_Jdxp = -(
13194  gcrgd * (vds-vds_orig)
13195  + gcrgg * (vgs-vgs_orig)
13196  + gcrgb * (vbs-vbs_orig));
13197  gcrgg -= gcrg;
13198  //gcrg = gcrg;
13199  }
13200  else
13201  {
13202  ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0;
13203  ceqgcrg_Jdxp = 0.0;
13204  }
13205  }
13206  else
13207  {
13208  Gm = -gm;
13209  Gmbs = -gmbs;
13210  FwdSum = 0.0;
13211  RevSum = -(Gm + Gmbs);
13212 
13213  ceqdrn = -model_.dtype * cdrain;
13214  ceqdrn_Jdxp = -model_.dtype * (
13215  + gds * (vds-vds_orig)
13216  + Gm * (vgd-vgd_orig)
13217  + Gmbs * (vbd-vbd_orig));
13218 
13219  ceqbs = model_.dtype * (csub + Igisl);
13220  ceqbs_Jdxp = model_.dtype * (
13221  + (gbds + ggisls) * (vds-vds_orig)
13222  - (gbgs + ggislg) * (vgd-vgd_orig)
13223  - (gbbs + ggislb) * (vbd-vbd_orig));
13224  ceqbd = model_.dtype * Igidl;
13225  ceqbd_Jdxp = model_.dtype * (
13226  - ggidld * (vds-vds_orig)
13227  - ggidlg * (vgs-vgs_orig)
13228  - ggidlb * (vbs-vbs_orig));
13229 
13230  gbbsp = -(gbds);
13231  gbbdp = gbds + gbgs + gbbs;
13232 
13233  gbdpg = 0.0;
13234  gbdpsp = 0.0;
13235  gbdpb = 0.0;
13236  gbdpdp = 0.0;
13237 
13238  gbspg = gbgs;
13239  gbspsp = gbds;
13240  gbspb = gbbs;
13241  gbspdp = -(gbspg + gbspsp + gbspb);
13242 
13243  if (model_.igcMod)
13244  {
13245  gIstotg = gIgsg + gIgcdg;
13246  gIstotd = gIgcds;
13247  gIstots = gIgss + gIgcdd;
13248  gIstotb = gIgcdb;
13249  Istoteq = model_.dtype * (Igs + Igcd);
13250  Istoteq_Jdxp = model_.dtype * (
13251  - gIgsg * (vgs-vgs_orig)
13252  - gIgcdg * (vgd-vgd_orig)
13253  + gIgcdd * (vds-vds_orig)
13254  - gIgcdb * (vbd-vbd_orig));
13255 
13256  gIdtotg = gIgdg + gIgcsg;
13257  gIdtotd = gIgdd + gIgcss;
13258  gIdtots = gIgcsd;
13259  gIdtotb = gIgcsb;
13260  Idtoteq = model_.dtype * (Igd + Igcs);
13261  Idtoteq_Jdxp = model_.dtype * (
13262  - (gIgdg + gIgcsg) * (vgd-vgd_orig)
13263  + gIgcsd * (vds-vds_orig)
13264  - gIgcsb * (vbd-vbd_orig));
13265  }
13266  else
13267  {
13268  gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0;
13269  gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0;
13270  Istoteq_Jdxp = 0.0;
13271  Idtoteq_Jdxp = 0.0;
13272  }
13273 
13274  if (model_.igbMod)
13275  {
13276  gIbtotg = gIgbg;
13277  gIbtotd = gIgbs;
13278  gIbtots = gIgbd;
13279  gIbtotb = gIgbb;
13280  Ibtoteq = model_.dtype * Igb;
13281  Ibtoteq_Jdxp = model_.dtype * (
13282  - gIgbg * (vgd-vgd_orig)
13283  + gIgbd * (vds-vds_orig)
13284  - gIgbb * (vbd-vbd_orig));
13285  }
13286  else
13287  {
13288  gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0;
13289  Ibtoteq_Jdxp = 0.0;
13290  }
13291 
13292  if ((model_.igcMod != 0) || (model_.igbMod != 0))
13293  {
13295  gIgtotd = gIstotd + gIdtotd + gIbtotd ;
13299  Igtoteq_Jdxp = Istoteq_Jdxp + Idtoteq_Jdxp + Ibtoteq_Jdxp;
13300  }
13301  else
13302  {
13303  gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0;
13304  Igtoteq_Jdxp = 0.0;
13305  }
13306 
13307  if (rgateMod == 2)
13308  {
13309  T0 = vges - vgs;
13310  }
13311  else if (rgateMod == 3)
13312  {
13313  T0 = vgms - vgs;
13314  }
13315 
13316  if (rgateMod > 1)
13317  {
13318  double tmp_gcrgd = gcrgd;
13319  gcrgd = gcrgs * T0;
13320  gcrgg = gcrgg * T0;
13321  gcrgs = tmp_gcrgd * T0;
13322  gcrgb = gcrgb * T0;
13323  ceqgcrg = 0.0;
13324  ceqgcrg_Jdxp = -(
13325  gcrgg * (vgd-vgd_orig)
13326  - gcrgs * (vds-vds_orig)
13327  + gcrgb * (vbd-vbd_orig));
13328  gcrgg -= gcrg;
13329  //gcrg = gcrg;
13330  }
13331  else
13332  {
13333  ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0;
13334  }
13335  }
13336 
13337  if (model_.rdsMod == 1)
13338  {
13339  ceqgstot = 0.0;
13340  ceqgstot_Jdxp = model_.dtype * (
13341  gstotd * (vds-vds_orig)
13342  + gstotg * (vgs-vgs_orig)
13343  + gstotb * (vbs-vbs_orig));
13344  gstots = gstots - gstot;
13345 
13346  ceqgdtot = 0.0;
13347  ceqgdtot_Jdxp = -model_.dtype * (
13348  gdtotd * (vds-vds_orig)
13349  + gdtotg * (vgs-vgs_orig)
13350  + gdtotb * (vbs-vbs_orig));
13351  gdtotd = gdtotd - gdtot;
13352  }
13353  else
13354  {
13355  gstot = gstotd = gstotg = gstots = gstotb = ceqgstot = 0.0;
13356  gdtot = gdtotd = gdtotg = gdtots = gdtotb = ceqgdtot = 0.0;
13357  ceqgstot_Jdxp = 0.0;
13358  ceqgdtot_Jdxp = 0.0;
13359  }
13360 
13361  if (model_.dtype > 0)
13362  {
13363  ceqjs = (cbs);
13364  ceqjs_Jdxp = (- gbs * (vbs_jct-vbs_jct_orig));
13365  ceqjd = (cbd);
13366  ceqjd_Jdxp = (- gbd * (vbd_jct-vbd_jct_orig));
13367  }
13368  else
13369  {
13370  ceqjs = -(cbs);
13372  ceqjd = -(cbd);
13373  ceqjd_Jdxp = (gbd * (vbd_jct-vbd_jct_orig));
13374  ceqgcrg = -ceqgcrg;
13375 
13377  }
13378 
13379 #endif
13380 
13381  // Loading F-vector
13383  fVec[li_GatePrime] -= -(-ceqgcrg + Igtoteq)*numberParallel;
13384 
13385  if (rgateMod == 1)
13386  {
13387  fVec[li_GateExt ] -= -(Igate)*numberParallel;
13388  fVec[li_GatePrime] += -(Igate)*numberParallel;
13389  }
13390  else if (rgateMod == 2)
13391  {
13392  fVec[li_GateExt] -= -(Igate + ceqgcrg)*numberParallel;
13393  fVec[li_GatePrime] += -(Igate)*numberParallel;
13394  }
13395  else if (rgateMod == 3)
13396  {
13397  fVec[li_GateExt] -= -(Igate)*numberParallel;
13399  fVec[li_GatePrime] += -(IgateMid)*numberParallel;
13400  }
13401 
13402  if (!rbodyMod)
13403  {
13406  }
13407  else
13408  {
13409  fVec[li_DrainBody] -= -(ceqjd + Idbb + Idbbp)*numberParallel;
13410  fVec[li_BodyPrime] += -(ceqbd + ceqbs + Ibtoteq +
13412  fVec[li_Body] += - (Isbb + Idbb + Ibpb)*numberParallel;
13413  fVec[li_SourceBody] -= -(ceqjs + Isbb + Isbbp)*numberParallel;
13415  }
13416 
13417  if (model_.rdsMod)
13418  {
13419  fVec[li_Drain] += -(-ceqgdtot)*numberParallel;
13420  fVec[li_Source] += -(ceqgstot)*numberParallel;
13422  fVec[li_SourcePrime] += -(-ceqgstot)*numberParallel;
13423  }
13424 
13425  // Idrain, Isource are linear terminal resistor currents
13427  {
13428  fVec[li_Drain] += -(-Idrain)*numberParallel;
13429  fVec[li_DrainPrime] += -(Idrain)*numberParallel;
13430  }
13431 
13433  {
13434  fVec[li_Source] += -(-Isource)*numberParallel;
13435  fVec[li_SourcePrime] += -(+Isource)*numberParallel;
13436  }
13437 
13438  // Initial condition support
13440  {
13441  double coef = extData.nextSolVectorRawPtr[li_Ibs];
13442  fVec[li_Body] += coef;
13443  fVec[li_Source] += -coef;
13444  double cVs = extData.nextSolVectorRawPtr[li_Source];
13445  double cVb = extData.nextSolVectorRawPtr[li_Body];
13446  fVec[li_Ibs] += (cVb-cVs-icVBS);
13447  }
13448 
13450  {
13451  double coef = extData.nextSolVectorRawPtr[li_Ids];
13452  fVec[li_Drain] += coef;
13453  fVec[li_Source] += -coef;
13454  double cVs = extData.nextSolVectorRawPtr[li_Source];
13455  double cVd = extData.nextSolVectorRawPtr[li_Drain];
13456  fVec[li_Ids] += (cVd-cVs-icVDS);
13457  }
13458 
13460  {
13461  double coef = extData.nextSolVectorRawPtr[li_Igs];
13462  fVec[li_GateExt] += coef;
13463  fVec[li_Source] += -coef;
13464  double cVs = extData.nextSolVectorRawPtr[li_Source];
13465  double cVg = extData.nextSolVectorRawPtr[li_GateExt];
13466  fVec[li_Igs] += (cVg-cVs-icVGS);
13467  }
13468 
13469  // limiter section
13471  {
13472  dFdxdVp[li_DrainPrime] += (ceqjd_Jdxp - ceqbd_Jdxp - ceqdrn_Jdxp + Idtoteq_Jdxp)*numberParallel;
13474 
13475  if (rgateMod == 1)
13476  {
13477  dFdxdVp[li_GateExt ] -= (Igate_Jdxp)*numberParallel;
13478  dFdxdVp[li_GatePrime] += (Igate_Jdxp)*numberParallel;
13479  }
13480  else if (rgateMod == 2)
13481  {
13483  dFdxdVp[li_GatePrime] += (Igate_Jdxp)*numberParallel;
13484  }
13485  else if (rgateMod == 3)
13486  {
13487  dFdxdVp[li_GateExt] -= (Igate_Jdxp)*numberParallel;
13490  }
13491 
13492  if (!rbodyMod)
13493  {
13494  dFdxdVp[li_BodyPrime] += (ceqbd_Jdxp + ceqbs_Jdxp - ceqjd_Jdxp - ceqjs_Jdxp + Ibtoteq_Jdxp)*numberParallel;
13495  dFdxdVp[li_SourcePrime] += (ceqdrn_Jdxp - ceqbs_Jdxp + ceqjs_Jdxp + Istoteq_Jdxp)*numberParallel;
13496  }
13497  else
13498  {
13499  dFdxdVp[li_DrainBody] -= (ceqjd_Jdxp)*numberParallel;
13500  dFdxdVp[li_BodyPrime] += (ceqbd_Jdxp + ceqbs_Jdxp + Ibtoteq_Jdxp)*numberParallel;
13501  dFdxdVp[li_SourceBody] -= (ceqjs_Jdxp )*numberParallel;
13502  dFdxdVp[li_SourcePrime] += (ceqdrn_Jdxp - ceqbs_Jdxp + ceqjs_Jdxp + Istoteq_Jdxp)*numberParallel;
13503  }
13504 
13505  if (model_.rdsMod)
13506  {
13507  dFdxdVp[li_Drain] -= (ceqgdtot_Jdxp)*numberParallel;
13508  dFdxdVp[li_Source] += (ceqgstot_Jdxp)*numberParallel;
13511  }
13512  }
13513 
13514  return bsuccess;
13515 }
13516 
13517 //-----------------------------------------------------------------------------
13518 // Function : Instance::
13519 // Purpose :
13520 // Special Notes :
13521 // Scope : public
13522 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
13523 // Creation Date : 12/01/08
13524 //-----------------------------------------------------------------------------
13526 {
13527  ceqdrn_Jdxp=0.0; ceqbd_Jdxp=0.0; ceqbs_Jdxp=0.0;
13528  Istoteq_Jdxp=0.0; Idtoteq_Jdxp=0.0;
13529  Ibtoteq_Jdxp=0.0; Igtoteq_Jdxp=0.0;
13531  ceqjs_Jdxp=0.0; ceqjd_Jdxp=0.0;
13532  T0=0.0;
13533 
13534  if (mode >= 0)
13535  {
13536  Gm = gm;
13537  Gmbs = gmbs;
13538  FwdSum = Gm + Gmbs;
13539  RevSum = 0.0;
13540 
13541  ceqdrn = model_.dtype * cdrain;
13543  (-gds * (vds-vds_orig)
13544  -Gm * (vgs-vgs_orig)
13545  -Gmbs * (vbs-vbs_orig));
13546 
13547  ceqbd = model_.dtype * (csub + Igidl);
13548  ceqbd_Jdxp = model_.dtype * (
13549  - (gbds + ggidld) * (vds-vds_orig)
13550  - (gbgs + ggidlg) * (vgs-vgs_orig)
13551  - (gbbs + ggidlb) * (vbs-vbs_orig));
13552 
13553  ceqbs = model_.dtype * Igisl;
13554  ceqbs_Jdxp = model_.dtype * (
13555  + ggisls * (vds-vds_orig)
13556  - ggislg * (vgd-vgd_orig)
13557  - ggislb * (vbd-vbd_orig));
13558 
13559  gbbdp = -(gbds);
13560  gbbsp = gbds + gbgs + gbbs;
13561 
13562  gbdpg = gbgs;
13563  gbdpdp = gbds;
13564  gbdpb = gbbs;
13565  gbdpsp = -(gbdpg + gbdpdp + gbdpb);
13566 
13567  gbspg = 0.0;
13568  gbspdp = 0.0;
13569  gbspb = 0.0;
13570  gbspsp = 0.0;
13571 
13572  if (model_.igcMod)
13573  {
13574  gIstotg = gIgsg + gIgcsg;
13575  gIstotd = gIgcsd;
13576  gIstots = gIgss + gIgcss;
13577  gIstotb = gIgcsb;
13578  Istoteq = model_.dtype * (Igs + Igcs);
13579  Istoteq_Jdxp = model_.dtype * (
13580  - gIstotg * (vgs-vgs_orig)
13581  - gIgcsd * (vds-vds_orig)
13582  - gIgcsb * (vbs-vbs_orig));
13583 
13584  gIdtotg = gIgdg + gIgcdg;
13585  gIdtotd = gIgdd + gIgcdd;
13586  gIdtots = gIgcds;
13587  gIdtotb = gIgcdb;
13588  Idtoteq = model_.dtype * (Igd + Igcd);
13589  Idtoteq_Jdxp = model_.dtype * (
13590  - gIgdg * (vgd-vgd_orig)
13591  - gIgcdg * (vgs-vgs_orig)
13592  - gIgcdd * (vds-vds_orig)
13593  - gIgcdb * (vbs-vbs_orig));
13594  }
13595  else
13596  {
13597  gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0;
13598  gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0;
13599  Istoteq_Jdxp = 0.0;
13600  Idtoteq_Jdxp = 0.0;
13601  }
13602 
13603  if (model_.igbMod)
13604  {
13605  gIbtotg = gIgbg;
13606  gIbtotd = gIgbd;
13607  gIbtots = gIgbs;
13608  gIbtotb = gIgbb;
13609  Ibtoteq = model_.dtype * Igb;
13610  Ibtoteq_Jdxp = model_.dtype * (
13611  - gIgbg * (vgs-vgs_orig)
13612  - gIgbd * (vds-vds_orig)
13613  - gIgbb * (vbs-vbs_orig));
13614  }
13615  else
13616  {
13617  gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0;
13618  Ibtoteq_Jdxp = 0.0;
13619  }
13620 
13621  if ((model_.igcMod != 0) || (model_.igbMod != 0))
13622  {
13624  gIgtotd = gIstotd + gIdtotd + gIbtotd ;
13629  }
13630  else
13631  {
13632  gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0;
13633  Igtoteq_Jdxp = 0.0;
13634  }
13635 
13636 
13637  if (rgateMod == 2)
13638  {
13639  T0 = vges - vgs;
13640  }
13641  else if (rgateMod == 3)
13642  {
13643  T0 = vgms - vgs;
13644  }
13645 
13646  if (rgateMod > 1)
13647  {
13648  gcrgd = gcrgd * T0;
13649  gcrgg = gcrgg * T0;
13650  gcrgs = gcrgs * T0;
13651  gcrgb = gcrgb * T0;
13652  ceqgcrg = 0.0;
13653  ceqgcrg_Jdxp = -(
13654  gcrgd * (vds-vds_orig)
13655  + gcrgg * (vgs-vgs_orig)
13656  + gcrgb * (vbs-vbs_orig));
13657  gcrgg -= gcrg;
13658  //gcrg = gcrg;
13659  }
13660  else
13661  {
13662  ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0;
13663  ceqgcrg_Jdxp = 0.0;
13664  }
13665  }
13666  else
13667  {
13668  Gm = -gm;
13669  Gmbs = -gmbs;
13670  FwdSum = 0.0;
13671  RevSum = -(Gm + Gmbs);
13672 
13673  ceqdrn = -model_.dtype * cdrain;
13674  ceqdrn_Jdxp = -model_.dtype * (
13675  + gds * (vds-vds_orig)
13676  + Gm * (vgd-vgd_orig)
13677  + Gmbs * (vbd-vbd_orig));
13678 
13679  ceqbs = model_.dtype * (csub + Igisl);
13680  ceqbs_Jdxp = model_.dtype * (
13681  + (gbds + ggisls) * (vds-vds_orig)
13682  - (gbgs + ggislg) * (vgd-vgd_orig)
13683  - (gbbs + ggislb) * (vbd-vbd_orig));
13684  ceqbd = model_.dtype * Igidl;
13685  ceqbd_Jdxp = model_.dtype * (
13686  - ggidld * (vds-vds_orig)
13687  - ggidlg * (vgs-vgs_orig)
13688  - ggidlb * (vbs-vbs_orig));
13689 
13690  gbbsp = -(gbds);
13691  gbbdp = gbds + gbgs + gbbs;
13692 
13693  gbdpg = 0.0;
13694  gbdpsp = 0.0;
13695  gbdpb = 0.0;
13696  gbdpdp = 0.0;
13697 
13698  gbspg = gbgs;
13699  gbspsp = gbds;
13700  gbspb = gbbs;
13701  gbspdp = -(gbspg + gbspsp + gbspb);
13702 
13703  if (model_.igcMod)
13704  {
13705  gIstotg = gIgsg + gIgcdg;
13706  gIstotd = gIgcds;
13707  gIstots = gIgss + gIgcdd;
13708  gIstotb = gIgcdb;
13709  Istoteq = model_.dtype * (Igs + Igcd);
13710  Istoteq_Jdxp = model_.dtype * (
13711  - gIgsg * (vgs-vgs_orig)
13712  - gIgcdg * (vgd-vgd_orig)
13713  + gIgcdd * (vds-vds_orig)
13714  - gIgcdb * (vbd-vbd_orig));
13715 
13716  gIdtotg = gIgdg + gIgcsg;
13717  gIdtotd = gIgdd + gIgcss;
13718  gIdtots = gIgcsd;
13719  gIdtotb = gIgcsb;
13720  Idtoteq = model_.dtype * (Igd + Igcs);
13721  Idtoteq_Jdxp = model_.dtype * (
13722  - (gIgdg + gIgcsg) * (vgd-vgd_orig)
13723  + gIgcsd * (vds-vds_orig)
13724  - gIgcsb * (vbd-vbd_orig));
13725  }
13726  else
13727  {
13728  gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0;
13729  gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0;
13730  Istoteq_Jdxp = 0.0;
13731  Idtoteq_Jdxp = 0.0;
13732  }
13733 
13734  if (model_.igbMod)
13735  {
13736  gIbtotg = gIgbg;
13737  gIbtotd = gIgbs;
13738  gIbtots = gIgbd;
13739  gIbtotb = gIgbb;
13740  Ibtoteq = model_.dtype * Igb;
13741  Ibtoteq_Jdxp = model_.dtype * (
13742  - gIgbg * (vgd-vgd_orig)
13743  + gIgbd * (vds-vds_orig)
13744  - gIgbb * (vbd-vbd_orig));
13745  }
13746  else
13747  {
13748  gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0;
13749  Ibtoteq_Jdxp = 0.0;
13750  }
13751 
13752  if ((model_.igcMod != 0) || (model_.igbMod != 0))
13753  {
13755  gIgtotd = gIstotd + gIdtotd + gIbtotd ;
13760  }
13761  else
13762  {
13763  gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0;
13764  Igtoteq_Jdxp = 0.0;
13765  }
13766 
13767  if (rgateMod == 2)
13768  {
13769  T0 = vges - vgs;
13770  }
13771  else if (rgateMod == 3)
13772  {
13773  T0 = vgms - vgs;
13774  }
13775 
13776  if (rgateMod > 1)
13777  {
13778  double tmp_gcrgd = gcrgd;
13779  gcrgd = gcrgs * T0;
13780  gcrgg = gcrgg * T0;
13781  gcrgs = tmp_gcrgd * T0;
13782  gcrgb = gcrgb * T0;
13783  ceqgcrg = 0.0;
13784  ceqgcrg_Jdxp = -(
13785  gcrgg * (vgd-vgd_orig)
13786  - gcrgs * (vds-vds_orig)
13787  + gcrgb * (vbd-vbd_orig));
13788  gcrgg -= gcrg;
13789  //gcrg = gcrg;
13790  }
13791  else
13792  {
13793  ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0;
13794  }
13795  }
13796 
13797  if (model_.rdsMod == 1)
13798  {
13799  ceqgstot = 0.0;
13800  ceqgstot_Jdxp = model_.dtype * (
13801  gstotd * (vds-vds_orig)
13802  + gstotg * (vgs-vgs_orig)
13803  + gstotb * (vbs-vbs_orig));
13804  gstots = gstots - gstot;
13805 
13806  ceqgdtot = 0.0;
13807  ceqgdtot_Jdxp = -model_.dtype * (
13808  gdtotd * (vds-vds_orig)
13809  + gdtotg * (vgs-vgs_orig)
13810  + gdtotb * (vbs-vbs_orig));
13811  gdtotd = gdtotd - gdtot;
13812  }
13813  else
13814  {
13815  gstot = gstotd = gstotg = gstots = gstotb = ceqgstot = 0.0;
13816  gdtot = gdtotd = gdtotg = gdtots = gdtotb = ceqgdtot = 0.0;
13817  ceqgstot_Jdxp = 0.0;
13818  ceqgdtot_Jdxp = 0.0;
13819  }
13820 
13821  if (model_.dtype > 0)
13822  {
13823  ceqjs = (cbs);
13824  ceqjs_Jdxp = (- gbs * (vbs_jct-vbs_jct_orig));
13825  ceqjd = (cbd);
13826  ceqjd_Jdxp = (- gbd * (vbd_jct-vbd_jct_orig));
13827  }
13828  else
13829  {
13830  ceqjs = -(cbs);
13832  ceqjd = -(cbd);
13834  ceqgcrg = -ceqgcrg;
13835 
13837  }
13838 }
13839 
13840 //-----------------------------------------------------------------------------
13841 // Function : Instance::loadDAEdQdx
13842 //
13843 // Purpose : Loads the Q-vector contributions for a single
13844 // bsim4 instance.
13845 //
13846 // Special Notes : The "Q" vector is part of a standard DAE formalism in
13847 // which the system of equations is represented as:
13848 //
13849 // f(x) = dQ(x)/dt + F(x) - B(t) = 0
13850 //
13851 // Scope : public
13852 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
13853 // Creation Date : 11/25/06
13854 //-----------------------------------------------------------------------------
13856 {
13857  bool bsuccess = true;
13858 
13859  if (!(getSolverState().dcopFlag) && getSolverState().initTranFlag && getSolverState().newtonIter==0)
13860  {
13861  // do nothing, as for this special case q is always zero.
13862  }
13863  else
13864  {
13865  N_LAS_Matrix & dQdx = *(extData.dQdxMatrixPtr);
13866 
13867 #ifdef Xyce_DEBUG_DEVICE
13869  {
13870  Xyce::dout() << std::endl << subsection_divider << std::endl;
13871  Xyce::dout() << " name = " << getName() << std::endl;
13872  }
13873 #endif
13874 
13875  if (rgateMod == 1)
13876  {
13881  } // WDLiu: CAPcrg already subtracted from all CAPcrgg below
13882  else if (rgateMod == 2)
13883  {
13888  }
13889  else if (rgateMod == 3)
13890  {
13891  dQdx[li_GateMid][GMgm] += (+ CAPcgmgmb)*numberParallel;
13892 
13893  dQdx[li_GateMid][GMdp] += (CAPcgmdb)*numberParallel;
13894  dQdx[li_GateMid][GMsp] += (CAPcgmsb)*numberParallel;
13895  dQdx[li_GateMid][GMbp] += (CAPcgmbb)*numberParallel;
13896 
13900 
13905  }
13906  else
13907  {
13912  }
13913 
13915 
13916  dQdx[li_DrainPrime][DPgp] += (+ CAPcdgb)*numberParallel;
13917 
13918  dQdx[li_DrainPrime][DPsp] -= (- CAPcdsb)*numberParallel;
13919 
13920  dQdx[li_DrainPrime][DPbp] -= (- CAPcdbb)*numberParallel;
13921 
13922 
13923  dQdx[li_SourcePrime][SPdp] -= (- CAPcsdb)*numberParallel;
13924 
13926 
13928 
13929  dQdx[li_SourcePrime][SPbp] -= (- CAPcsbb)*numberParallel;
13930 
13935 
13936  if (rbodyMod)
13937  {
13940 
13942  dQdx[li_DrainBody][DBdb] += (- CAPcdbdb)*numberParallel;
13943 
13945  dQdx[li_SourceBody][SBsb] += (- CAPcsbsb)*numberParallel;
13946  }
13947 
13948  if (trnqsMod)
13949  {
13950  dQdx[li_Charge][Qgp] += (- CAPcqgb)*numberParallel;
13951  dQdx[li_Charge][Qdp] += (- CAPcqdb)*numberParallel;
13952  dQdx[li_Charge][Qsp] += (- CAPcqsb)*numberParallel;
13953  dQdx[li_Charge][Qbp] += (- CAPcqbb)*numberParallel;
13954  }
13955  }
13956 
13957  return bsuccess;
13958 }
13959 
13960 //-----------------------------------------------------------------------------
13961 // Function : Instance::loadDAEdFdx ()
13962 //
13963 // Purpose : Loads the F-vector contributions for a single
13964 // bsim4 instance.
13965 //
13966 // Special Notes :
13967 //
13968 // Scope : public
13969 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
13970 // Creation Date : 11/25/06
13971 //-----------------------------------------------------------------------------
13973 {
13974  bool bsuccess = true;
13975  N_LAS_Matrix & dFdx = *(extData.dFdxMatrixPtr);
13976 
13977 #ifdef Xyce_DEBUG_DEVICE
13979  {
13980  Xyce::dout() << std::endl << subsection_divider << std::endl;
13981  Xyce::dout() << "Instance::loadDAEdFdx";
13982  Xyce::dout() << " name = " << getName() << std::endl;
13983  }
13984 #endif
13985 
13986  if (!rbodyMod)
13987  {
13988  gjbd = gbd;
13989  gjbs = gbs;
13990  }
13991  else
13992  {
13993  gjbd = gjbs = 0.0;
13994  }
13995 
13996  if (!model_.rdsMod)
13997  {
14000  }
14001  else
14002  {
14003  gdpr = gspr = 0.0;
14004  }
14005 
14006  geltd = grgeltd;
14007 
14008  double T1 = qdef * gtau;
14009 
14010  if (rgateMod == 1)
14011  {
14012  dFdx[li_GateExt][GEge] += (geltd)*numberParallel;
14013  dFdx[li_GateExt][GEgp] -= (geltd)*numberParallel;
14014  dFdx[li_GatePrime][GPge] -= (geltd)*numberParallel;
14015  dFdx[li_GatePrime][GPgp] += (+ geltd - ggtg + gIgtotg)*numberParallel;
14016  dFdx[li_GatePrime][GPdp] += (- ggtd + gIgtotd)*numberParallel;
14017  dFdx[li_GatePrime][GPsp] += (- ggts + gIgtots)*numberParallel;
14018  dFdx[li_GatePrime][GPbp] += (- ggtb + gIgtotb)*numberParallel;
14019  } // WDLiu: gcrg already subtracted from all gcrgg below
14020  else if (rgateMod == 2)
14021  {
14022  dFdx[li_GateExt][GEge] += (gcrg)*numberParallel;
14023  dFdx[li_GateExt][GEgp] += (gcrgg)*numberParallel;
14024  dFdx[li_GateExt][GEdp] += (gcrgd)*numberParallel;
14025  dFdx[li_GateExt][GEsp] += (gcrgs)*numberParallel;
14026  dFdx[li_GateExt][GEbp] += (gcrgb)*numberParallel;
14027 
14028  dFdx[li_GatePrime][GPge] -= (gcrg)*numberParallel;
14029  dFdx[li_GatePrime][GPgp] += (- gcrgg - ggtg + gIgtotg)*numberParallel;
14030  dFdx[li_GatePrime][GPdp] += (- gcrgd - ggtd + gIgtotd)*numberParallel;
14031  dFdx[li_GatePrime][GPsp] += (- gcrgs - ggts + gIgtots)*numberParallel;
14032  dFdx[li_GatePrime][GPbp] += (- gcrgb - ggtb + gIgtotb)*numberParallel;
14033  }
14034  else if (rgateMod == 3)
14035  {
14036  dFdx[li_GateExt][GEge] += (geltd)*numberParallel;
14037  dFdx[li_GateExt][GEgm] -= (geltd)*numberParallel;
14038  dFdx[li_GateMid][GMge] -= (geltd)*numberParallel;
14039  dFdx[li_GateMid][GMgm] += (geltd + gcrg)*numberParallel;
14040 
14041  dFdx[li_GateMid][GMdp] += (gcrgd)*numberParallel;
14042  dFdx[li_GateMid][GMgp] += (gcrgg)*numberParallel;
14043  dFdx[li_GateMid][GMsp] += (gcrgs)*numberParallel;
14044  dFdx[li_GateMid][GMbp] += (gcrgb)*numberParallel;
14045 
14046  dFdx[li_GatePrime][GPgm] -= (gcrg)*numberParallel;
14047 
14048  dFdx[li_GatePrime][GPgp] += (- gcrgg - ggtg + gIgtotg)*numberParallel;
14049  dFdx[li_GatePrime][GPdp] += (- gcrgd - ggtd + gIgtotd)*numberParallel;
14050  dFdx[li_GatePrime][GPsp] += (- gcrgs - ggts + gIgtots)*numberParallel;
14051  dFdx[li_GatePrime][GPbp] += (- gcrgb - ggtb + gIgtotb)*numberParallel;
14052  }
14053  else
14054  {
14055  dFdx[li_GatePrime][GPgp] += (- ggtg + gIgtotg)*numberParallel;
14056  dFdx[li_GatePrime][GPdp] += (- ggtd + gIgtotd)*numberParallel;
14057  dFdx[li_GatePrime][GPsp] += (- ggts + gIgtots)*numberParallel;
14058  dFdx[li_GatePrime][GPbp] += (- ggtb + gIgtotb)*numberParallel;
14059  }
14060 
14061  if (model_.rdsMod)
14062  {
14063  dFdx[li_Drain][Dgp] += (gdtotg)*numberParallel;
14064  dFdx[li_Drain][Dsp] += (gdtots)*numberParallel;
14065  dFdx[li_Drain][Dbp] += (gdtotb)*numberParallel;
14066  dFdx[li_Source][Sdp] += (gstotd)*numberParallel;
14067  dFdx[li_Source][Sgp] += (gstotg)*numberParallel;
14068  dFdx[li_Source][Sbp] += (gstotb)*numberParallel;
14069  }
14070 
14071  dFdx[li_DrainPrime][DPdp] += (gdpr + gds + gbd + T1 * ddxpart_dVd
14073 
14074  dFdx[li_DrainPrime][DPd] -= (gdpr + gdtot)*numberParallel;
14075  dFdx[li_DrainPrime][DPgp] += (Gm - gdtotg + gbdpg - gIdtotg
14076  + dxpart * ggtg + T1 * ddxpart_dVg)*numberParallel;
14077 
14078  dFdx[li_DrainPrime][DPsp] -= (gds + gdtots - dxpart * ggts + gIdtots
14080 
14081  dFdx[li_DrainPrime][DPbp] -= (gjbd + gdtotb - Gmbs - gbdpb + gIdtotb
14082  - T1 * ddxpart_dVb - dxpart * ggtb)*numberParallel;
14083 
14084  dFdx[li_Drain][Ddp] -= (gdpr - gdtotd)*numberParallel;
14085  dFdx[li_Drain][Dd] += (gdpr + gdtot)*numberParallel;
14086 
14087  dFdx[li_SourcePrime][SPdp] -= (gds + gstotd + RevSum - gbspdp
14089 
14090  dFdx[li_SourcePrime][SPgp] += (- Gm - gstotg + gbspg + sxpart * ggtg
14092 
14093  dFdx[li_SourcePrime][SPsp] += (gspr + gds + gbs + T1 * dsxpart_dVs
14095 
14096  dFdx[li_SourcePrime][SPs] -= (gspr + gstot)*numberParallel;
14097 
14098  dFdx[li_SourcePrime][SPbp] -= (gjbs + gstotb + Gmbs - gbspb - sxpart * ggtb
14100 
14101  dFdx[li_Source][Ssp] -= (gspr - gstots)*numberParallel;
14102  dFdx[li_Source][Ss] += (gspr + gstot)*numberParallel;
14103 
14104  dFdx[li_BodyPrime][BPdp] += (- gjbd + gbbdp - gIbtotd)*numberParallel;
14105  dFdx[li_BodyPrime][BPgp] += (- gbgs - gIbtotg)*numberParallel;
14106  dFdx[li_BodyPrime][BPsp] += (- gjbs + gbbsp - gIbtots)*numberParallel;
14107  dFdx[li_BodyPrime][BPbp] += (gjbd + gjbs - gbbs - gIbtotb)*numberParallel;
14108 
14109  //ggidld = (ggidld)*numberParallel;
14110  //ggidlg = (ggidlg)*numberParallel;
14111  //ggidlb = (ggidlb)*numberParallel;
14112  //ggislg = (ggislg)*numberParallel;
14113  //ggisls = (ggisls)*numberParallel;
14114  //ggislb = (ggislb)*numberParallel;
14115 
14116  // stamp gidl
14121  dFdx[li_BodyPrime][BPdp] -= (ggidld)*numberParallel;
14122  dFdx[li_BodyPrime][BPgp] -= (ggidlg)*numberParallel;
14123  dFdx[li_BodyPrime][BPsp] += ((ggidlg + ggidld + ggidlb))*numberParallel;
14124  dFdx[li_BodyPrime][BPbp] -= (ggidlb)*numberParallel;
14125  // stamp gisl
14130  dFdx[li_BodyPrime][BPdp] += ((ggislg + ggisls + ggislb))*numberParallel;
14131  dFdx[li_BodyPrime][BPgp] -= (ggislg)*numberParallel;
14132  dFdx[li_BodyPrime][BPsp] -= (ggisls)*numberParallel;
14133  dFdx[li_BodyPrime][BPbp] -= (ggislb)*numberParallel;
14134 
14135 
14136  if (rbodyMod)
14137  {
14138  dFdx[li_DrainPrime][DPdb] += (- gbd)*numberParallel;
14139  dFdx[li_SourcePrime][SPsb] -= (gbs)*numberParallel;
14140 
14141  dFdx[li_DrainBody][DBdp] += (- gbd)*numberParallel;
14142  dFdx[li_DrainBody][DBdb] += (gbd + grbpd + grbdb)*numberParallel;
14143  dFdx[li_DrainBody][DBbp] -= (grbpd)*numberParallel;
14144  dFdx[li_DrainBody][DBb] -= (grbdb)*numberParallel;
14145 
14146  dFdx[li_BodyPrime][BPdb] -= (grbpd)*numberParallel;
14147  dFdx[li_BodyPrime][BPb] -= (grbpb)*numberParallel;
14148  dFdx[li_BodyPrime][BPsb] -= (grbps)*numberParallel;
14149  dFdx[li_BodyPrime][BPbp] += (grbpd + grbps + grbpb)*numberParallel;
14150  // WDLiu: (gcbbb - gbbs) already added to BPbpPtr
14151 
14152  dFdx[li_SourceBody][SBsp] += (- gbs)*numberParallel;
14153  dFdx[li_SourceBody][SBbp] -= (grbps)*numberParallel;
14154  dFdx[li_SourceBody][SBb] -= (grbsb)*numberParallel;
14155  dFdx[li_SourceBody][SBsb] += (gbs + grbps + grbsb)*numberParallel;
14156 
14157  dFdx[li_Body][Bdb] -= (grbdb)*numberParallel;
14158  dFdx[li_Body][Bbp] -= (grbpb)*numberParallel;
14159  dFdx[li_Body][Bsb] -= (grbsb)*numberParallel;
14160  dFdx[li_Body][Bb] += (grbsb + grbdb + grbpb)*numberParallel;
14161  }
14162 
14163  if (trnqsMod)
14164  {
14165  dFdx[li_Charge][Qq] += (gqdef + gtau)*numberParallel;
14166  dFdx[li_Charge][Qgp] += (ggtg)*numberParallel;
14167  dFdx[li_Charge][Qdp] += (ggtd)*numberParallel;
14168  dFdx[li_Charge][Qsp] += (ggts)*numberParallel;
14169  dFdx[li_Charge][Qbp] += (ggtb)*numberParallel;
14170 
14171  dFdx[li_DrainPrime][DPq] += (dxpart * gtau)*numberParallel;
14173  dFdx[li_GatePrime][GPq] -= (gtau)*numberParallel;
14174  }
14175 
14176 
14177  // Initial Conditions:
14178  if (icVBSGiven)
14179  {
14180  if (getSolverState().dcopFlag)
14181  {
14182  dFdx[li_Body][Bibs] += 1.0;
14183  dFdx[li_Source][Sibs] += -1.0;
14184  dFdx[li_Ibs][IBSb] += 1.0;
14185  dFdx[li_Ibs][IBSs] += -1.0;
14186  }
14187  else
14188  {
14189  dFdx[li_Ibs][IBSibs] = 1.0;
14190  }
14191  }
14192 
14193  if (icVDSGiven)
14194  {
14195  if (getSolverState().dcopFlag)
14196  {
14197  dFdx[li_Drain][Dids] += 1.0;
14198  dFdx[li_Source][Sids] += -1.0;
14199  dFdx[li_Ids][IDSd] += 1.0;
14200  dFdx[li_Ids][IDSs] += -1.0;
14201  }
14202  else
14203  {
14204  dFdx[li_Ids][IDSids] = 1.0;
14205  }
14206  }
14207 
14208  if (icVGSGiven)
14209  {
14210  if (getSolverState().dcopFlag)
14211  {dFdx[li_GateExt][GEigs] += 1.0;
14212  dFdx[li_Source][Sigs] += -1.0;
14213  dFdx[li_Igs][IGSg] += 1.0;
14214  dFdx[li_Igs][IGSs] += -1.0;
14215  }
14216  else
14217  {
14218  dFdx[li_Igs][IGSigs] = 1.0;
14219  }
14220  }
14221 
14222  return bsuccess;
14223 }
14224 
14225 //-----------------------------------------------------------------------------
14226 // Function : Instance::setIC
14227 // Purpose :
14228 // Special Notes :
14229 // Scope : public
14230 // Creator : Eric R. Keiter, SNL, Electrical and Microsystems Modeling
14231 // Creation Date : 11/25/06
14232 //-----------------------------------------------------------------------------
14234 {
14235  bool bsuccess = true;
14236 
14237 
14238  return bsuccess;
14239 }
14240 
14241 //-----------------------------------------------------------------------------
14242 // Function : Instance:polyDepletion
14243 // Purpose : Function to compute poly depletion effect .
14244 //
14245 // Special Notes : Vgs_arg is named to distinguish it from the instance
14246 // variable, Vgs.
14247 //
14248 // Scope : public
14249 // Creator : Eric Keiter,SNL
14250 // Creation Date : 11/25/06
14251 //-----------------------------------------------------------------------------
14252 int Instance::polyDepletion( double phi, double ngate,
14253  double epsgate,
14254  double coxe, double Vgs_arg,
14255  double & Vgs_eff,
14256  double & dVgs_eff_dVg)
14257 {
14258  double T1(0.0), T2(0.0), T3(0.0), T4(0.0), T5(0.0), T6(0.0), T7(0.0), T8(0.0);
14259 
14260  // CONSTQ = 1.6021918e-19
14261  // CONSTEPSSI = 1.03594e-10
14262  // Poly Gate Si Depletion Effect
14263  if ((ngate > 1.0e18) && (ngate < 1.0e25) && (Vgs_arg > phi) && (epsgate!=0))
14264  {
14265  T1 = 1.0e6 * CONSTQ * epsgate * ngate / (coxe * coxe);
14266  T8 = Vgs_arg - phi;
14267  T4 = sqrt(1.0 + 2.0 * T8 / T1);
14268  T2 = 2.0 * T8 / (T4 + 1.0);
14269  T3 = 0.5 * T2 * T2 / T1; // T3 = Vpoly
14270  T7 = 1.12 - T3 - 0.05;
14271  T6 = sqrt(T7 * T7 + 0.224);
14272  T5 = 1.12 - 0.5 * (T7 + T6);
14273  Vgs_eff = Vgs_arg - T5;
14274  dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6);
14275  }
14276  else
14277  {
14278  Vgs_eff = Vgs_arg;
14279  dVgs_eff_dVg = 1.0;
14280  }
14281  return(0);
14282 }
14283 
14284 //-----------------------------------------------------------------------------
14285 // Function : Instance:DioIjthVjmEval
14286 // Purpose :
14287 // Special Notes :
14288 // Scope : public
14289 // Creator : Eric Keiter,SNL
14290 // Creation Date : 11/25/06
14291 //-----------------------------------------------------------------------------
14293  (double Nvtm, double Ijth, double Isb, double XExpBV, double & Vjm)
14294 {
14295  double Tb(0.0), Tc(0.0), EVjmovNv(0.0);
14296 
14297  Tc = XExpBV;
14298  Tb = 1.0 + Ijth / Isb - Tc;
14299  EVjmovNv = 0.5 * (Tb + sqrt(Tb * Tb + 4.0 * Tc));
14300  Vjm = Nvtm * log(EVjmovNv);
14301 
14302  return 0;
14303 }
14304 
14305 //
14306 // WDLiu:
14307 // This subroutine is a special module to process the geometry dependent
14308 // parasitics for BSIM4, which calculates Ps, Pd, As, Ad, and Rs and Rd
14309 // for multi-fingers and varous GEO and RGEO options.
14310 //
14311 //-----------------------------------------------------------------------------
14312 // Function : Instance::NumFingerDiff
14313 // Purpose :
14314 //
14315 // Special Notes : nf_arg is named to distinguish it from the
14316 // instance variable nf.
14317 //
14318 // Scope : public
14319 // Creator : Eric Keiter,SNL
14320 // Creation Date : 11/25/06
14321 //-----------------------------------------------------------------------------
14323  (double nf_arg, int minSD,
14324  double & nuIntD, double & nuEndD, double & nuIntS, double & nuEndS)
14325 {
14326  int NF = static_cast<int>(nf_arg);
14327 
14328  if ((NF%2) != 0)
14329  {
14330  nuEndD = nuEndS = 1.0;
14331  nuIntD = nuIntS = 2.0 * Xycemax((nf_arg - 1.0) / 2.0, 0.0);
14332  }
14333  else
14334  {
14335  if (minSD == 1) // minimize # of source
14336  {
14337  nuEndD = 2.0;
14338  nuIntD = 2.0 * Xycemax((nf_arg / 2.0 - 1.0), 0.0);
14339  nuEndS = 0.0;
14340  nuIntS = nf_arg;
14341  }
14342  else
14343  {
14344  nuEndD = 0.0;
14345  nuIntD = nf_arg;
14346  nuEndS = 2.0;
14347  nuIntS = 2.0 * Xycemax((nf_arg / 2.0 - 1.0), 0.0);
14348  }
14349  }
14350  return 0;
14351 }
14352 
14353 //-----------------------------------------------------------------------------
14354 // Function : Instance::PAeffGeo
14355 // Purpose :
14356 //
14357 // Special Notes : nf_arg is named to distinguish it from the
14358 // instance variable nf.
14359 //
14360 // Scope : public
14361 // Creator : Eric Keiter,SNL
14362 // Creation Date : 11/25/06
14363 //-----------------------------------------------------------------------------
14365  (double nf_arg, int geo, int minSD,
14366  double Weffcj, double DMCG, double DMCI, double DMDG,
14367  double & Ps, double & Pd, double & As, double & Ad)
14368 {
14369  double T0(0.0), T1(0.0), T2(0.0);
14370  double ADiso(0.0), ADsha(0.0), ADmer(0.0), ASiso(0.0), ASsha(0.0), ASmer(0.0);
14371  double PDiso(0.0), PDsha(0.0), PDmer(0.0), PSiso(0.0), PSsha(0.0), PSmer(0.0);
14372  double nuIntD (0.0), nuEndD (0.0), nuIntS (0.0), nuEndS (0.0);
14373 
14374  if (geo < 9) // For geo = 9 and 10, the numbers of S/D diffusions already known
14375  NumFingerDiff(nf_arg, minSD, nuIntD, nuEndD, nuIntS, nuEndS);
14376 
14377  T0 = DMCG + DMCI;
14378  T1 = DMCG + DMCG;
14379  T2 = DMDG + DMDG;
14380 
14381  PSiso = PDiso = T0 + T0 + Weffcj;
14382  PSsha = PDsha = T1;
14383  PSmer = PDmer = T2;
14384 
14385  ASiso = ADiso = T0 * Weffcj;
14386  ASsha = ADsha = DMCG * Weffcj;
14387  ASmer = ADmer = DMDG * Weffcj;
14388 
14389  switch(geo)
14390  {
14391  case 0:
14392  Ps = nuEndS * PSiso + nuIntS * PSsha;
14393  Pd = nuEndD * PDiso + nuIntD * PDsha;
14394  As = nuEndS * ASiso + nuIntS * ASsha;
14395  Ad = nuEndD * ADiso + nuIntD * ADsha;
14396  break;
14397  case 1:
14398  Ps = nuEndS * PSiso + nuIntS * PSsha;
14399  Pd = (nuEndD + nuIntD) * PDsha;
14400  As = nuEndS * ASiso + nuIntS * ASsha;
14401  Ad = (nuEndD + nuIntD) * ADsha;
14402  break;
14403  case 2:
14404  Ps = (nuEndS + nuIntS) * PSsha;
14405  Pd = nuEndD * PDiso + nuIntD * PDsha;
14406  As = (nuEndS + nuIntS) * ASsha;
14407  Ad = nuEndD * ADiso + nuIntD * ADsha;
14408  break;
14409  case 3:
14410  Ps = (nuEndS + nuIntS) * PSsha;
14411  Pd = (nuEndD + nuIntD) * PDsha;
14412  As = (nuEndS + nuIntS) * ASsha;
14413  Ad = (nuEndD + nuIntD) * ADsha;
14414  break;
14415  case 4:
14416  Ps = nuEndS * PSiso + nuIntS * PSsha;
14417  Pd = nuEndD * PDmer + nuIntD * PDsha;
14418  As = nuEndS * ASiso + nuIntS * ASsha;
14419  Ad = nuEndD * ADmer + nuIntD * ADsha;
14420  break;
14421  case 5:
14422  Ps = (nuEndS + nuIntS) * PSsha;
14423  Pd = nuEndD * PDmer + nuIntD * PDsha;
14424  As = (nuEndS + nuIntS) * ASsha;
14425  Ad = nuEndD * ADmer + nuIntD * ADsha;
14426  break;
14427  case 6:
14428  Ps = nuEndS * PSmer + nuIntS * PSsha;
14429  Pd = nuEndD * PDiso + nuIntD * PDsha;
14430  As = nuEndS * ASmer + nuIntS * ASsha;
14431  Ad = nuEndD * ADiso + nuIntD * ADsha;
14432  break;
14433  case 7:
14434  Ps = nuEndS * PSmer + nuIntS * PSsha;
14435  Pd = (nuEndD + nuIntD) * PDsha;
14436  As = nuEndS * ASmer + nuIntS * ASsha;
14437  Ad = (nuEndD + nuIntD) * ADsha;
14438  break;
14439  case 8:
14440  Ps = nuEndS * PSmer + nuIntS * PSsha;
14441  Pd = nuEndD * PDmer + nuIntD * PDsha;
14442  As = nuEndS * ASmer + nuIntS * ASsha;
14443  Ad = nuEndD * ADmer + nuIntD * ADsha;
14444  break;
14445  case 9: // geo = 9 and 10 happen only when nf_arg = even
14446  Ps = PSiso + (nf_arg - 1.0) * PSsha;
14447  Pd = nf_arg * PDsha;
14448  As = ASiso + (nf_arg - 1.0) * ASsha;
14449  Ad = nf_arg * ADsha;
14450  break;
14451  case 10:
14452  Ps = nf_arg * PSsha;
14453  Pd = PDiso + (nf_arg - 1.0) * PDsha;
14454  As = nf_arg * ASsha;
14455  Ad = ADiso + (nf_arg - 1.0) * ADsha;
14456  break;
14457  default:
14458  UserWarning(*this) << "Specified GEO not matched\n";
14459  }
14460 
14461  return 0;
14462 }
14463 
14464 
14465 //-----------------------------------------------------------------------------
14466 // Function : Instance::RdseffGeo
14467 // Purpose :
14468 // Special Notes :
14469 // Scope : public
14470 // Creator : Eric Keiter,SNL
14471 // Creation Date : 11/25/06
14472 //-----------------------------------------------------------------------------
14474  (double nf_arg,
14475  int geo, int rgeo, int minSD,
14476  double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG,
14477  int Type, double & Rtot)
14478 {
14479  std::string msg="";
14480  double Rint(0.0), Rend (0.0);
14481  double nuIntD (0.0), nuEndD (0.0), nuIntS (0.0), nuEndS (0.0);
14482 
14483  if (geo < 9) // since geo = 9 and 10 only happen when nf_arg = even
14484  {
14485  NumFingerDiff(nf_arg, minSD, nuIntD, nuEndD, nuIntS, nuEndS);
14486 
14487  // Internal S/D resistance -- assume shared S or D and all wide contacts
14488  if (Type == 1)
14489  {
14490  if (nuIntS == 0.0)
14491  Rint = 0.0;
14492  else
14493  Rint = Rsh * DMCG / ( Weffcj * nuIntS);
14494  }
14495  else
14496  {
14497  if (nuIntD == 0.0)
14498  Rint = 0.0;
14499  else
14500  Rint = Rsh * DMCG / ( Weffcj * nuIntD);
14501  }
14502  }
14503 
14504  // End S/D resistance -- geo dependent
14505  switch(geo)
14506  { case 0:
14507  if (Type == 1) RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, rgeo, 1, Rend);
14508  else RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, rgeo, 0, Rend);
14509  break;
14510  case 1:
14511  if (Type == 1) RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, rgeo, 1, Rend);
14512  else RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndD), rgeo, 0, Rend);
14513  break;
14514  case 2:
14515  if (Type == 1) RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndS), rgeo, 1, Rend);
14516  else RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, rgeo, 0, Rend);
14517  break;
14518  case 3:
14519  if (Type == 1) RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndS), rgeo, 1, Rend);
14520  else RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndD), rgeo, 0, Rend);
14521  break;
14522  case 4:
14523  if (Type == 1) RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, rgeo, 1, Rend);
14524  else Rend = Rsh * DMDG / Weffcj;
14525  break;
14526  case 5:
14527  if (Type == 1) RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndS), rgeo, 1, Rend);
14528  else Rend = Rsh * DMDG / (Weffcj * nuEndD);
14529  break;
14530  case 6:
14531  if (Type == 1) Rend = Rsh * DMDG / Weffcj;
14532  else RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, rgeo, 0, Rend);
14533  break;
14534  case 7:
14535  if (Type == 1) Rend = Rsh * DMDG / (Weffcj * nuEndS);
14536  else RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndD), rgeo, 0, Rend);
14537  break;
14538  case 8:
14539  Rend = Rsh * DMDG / Weffcj;
14540  break;
14541  case 9: // all wide contacts assumed for geo = 9 and 10
14542  if (Type == 1)
14543  {
14544  Rend = 0.5 * Rsh * DMCG / Weffcj;
14545  if (nf_arg == 2.0)
14546  Rint = 0.0;
14547  else
14548  Rint = Rsh * DMCG / (Weffcj * (nf_arg - 2.0));
14549  }
14550  else
14551  {
14552  Rend = 0.0;
14553  Rint = Rsh * DMCG / (Weffcj * nf_arg);
14554  }
14555  break;
14556  case 10:
14557  if (Type == 1)
14558  {
14559  Rend = 0.0;
14560  Rint = Rsh * DMCG / (Weffcj * nf_arg);
14561  }
14562  else
14563  {
14564  Rend = 0.5 * Rsh * DMCG / Weffcj;;
14565  if (nf_arg == 2.0)
14566  Rint = 0.0;
14567  else
14568  Rint = Rsh * DMCG / (Weffcj * (nf_arg - 2.0));
14569  }
14570  break;
14571  default:
14572  UserWarning(*this) << "Specified GEO not matched\n";
14573  }
14574 
14575  if (Rint <= 0.0)
14576  Rtot = Rend;
14577  else if (Rend <= 0.0)
14578  Rtot = Rint;
14579  else
14580  Rtot = Rint * Rend / (Rint + Rend);
14581 
14582  if(Rtot==0.0)
14583  {
14584  UserWarning(*this) << "Zero resistance returned from RdseffGeo\n";
14585  }
14586 
14587  return 0;
14588 }
14589 
14590 
14591 //-----------------------------------------------------------------------------
14592 // Function : Instance::RdsEndIso
14593 // Purpose :
14594 // Special Notes :
14595 // Scope : public
14596 // Creator : Eric Keiter,SNL
14597 // Creation Date : 11/25/06
14598 //-----------------------------------------------------------------------------
14600  (double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG,
14601  double nuEnd, int rgeo, int Type, double & Rend)
14602 {
14603  std::string msg="";
14604  if (Type == 1)
14605  {
14606  switch(rgeo)
14607  {
14608  case 1:
14609  case 2:
14610  case 5:
14611  if (nuEnd == 0.0)
14612  Rend = 0.0;
14613  else
14614  Rend = Rsh * DMCG / (Weffcj * nuEnd);
14615  break;
14616  case 3:
14617  case 4:
14618  case 6:
14619  if ((DMCG + DMCI) == 0.0)
14620  msg = "(DMCG + DMCI) can not be equal to zero\n";
14621  if (nuEnd == 0.0)
14622  Rend = 0.0;
14623  else
14624  Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI));
14625  break;
14626  default:
14627  UserWarning(*this) << "Specified RGEO not matched\n";
14628  }
14629  }
14630  else
14631  {
14632  switch(rgeo)
14633  {
14634  case 1:
14635  case 3:
14636  case 7:
14637  if (nuEnd == 0.0)
14638  Rend = 0.0;
14639  else
14640  Rend = Rsh * DMCG / (Weffcj * nuEnd);
14641  break;
14642  case 2:
14643  case 4:
14644  case 8:
14645  if ((DMCG + DMCI) == 0.0)
14646  msg = "(DMCG + DMCI) can not be equal to zero\n";
14647  if (nuEnd == 0.0)
14648  Rend = 0.0;
14649  else
14650  Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI));
14651  break;
14652  default:
14653  UserWarning(*this) << "Specified RGEO not matched\n";
14654  }
14655  }
14656  return 0;
14657 }
14658 
14659 
14660 //-----------------------------------------------------------------------------
14661 // Function : Instance::RdsEndSha
14662 // Purpose :
14663 // Special Notes :
14664 // Scope : public
14665 // Creator : Eric Keiter,SNL
14666 // Creation Date : 11/25/06
14667 //-----------------------------------------------------------------------------
14669  (double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG,
14670  int rgeo, int Type, double nuEnd, double & Rend)
14671 {
14672  std::string msg = "";
14673  if (Type == 1)
14674  {
14675  switch(rgeo)
14676  {
14677  case 1:
14678  case 2:
14679  case 5:
14680  if (nuEnd == 0.0)
14681  Rend = 0.0;
14682  else
14683  Rend = Rsh * DMCG / (Weffcj * nuEnd);
14684  break;
14685  case 3:
14686  case 4:
14687  case 6:
14688  if (DMCG == 0.0)
14689  msg = "DMCG can not be equal to zero\n";
14690  if (nuEnd == 0.0)
14691  Rend = 0.0;
14692  else
14693  Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG);
14694  break;
14695  default:
14696  UserWarning(*this) << "Specified RGEO not matched\n";
14697  }
14698  }
14699  else
14700  {
14701  switch(rgeo)
14702  {
14703  case 1:
14704  case 3:
14705  case 7:
14706  if (nuEnd == 0.0)
14707  Rend = 0.0;
14708  else
14709  Rend = Rsh * DMCG / (Weffcj * nuEnd);
14710  break;
14711  case 2:
14712  case 4:
14713  case 8:
14714  if (DMCG == 0.0)
14715  msg = "DMCG can not be equal to zero\n";
14716  if (nuEnd == 0.0)
14717  Rend = 0.0;
14718  else
14719  Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG);
14720  break;
14721  default:
14722  UserWarning(*this) << "Specified RGEO = %d not matched\n";
14723  }
14724  }
14725  return 0;
14726 }
14727 
14728 // Additional Declarations
14729 
14730 // Class Model
14731 
14732 //-----------------------------------------------------------------------------
14733 // Function : Model::processParams
14734 // Purpose :
14735 // Special Notes :
14736 // Scope : public
14737 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
14738 // Creation Date : 11/25/06
14739 //-----------------------------------------------------------------------------
14741 {
14742  std::string msg;
14743 
14744  if (SbulkJctPotential < 0.1)
14745  {
14746  SbulkJctPotential = 0.1;
14747  UserWarning(*this) << "Given pbs is less than 0.1. Pbs is set to 0.1";
14748  }
14749  if (SsidewallJctPotential < 0.1)
14750  {
14751  SsidewallJctPotential = 0.1;
14752  UserWarning(*this) << "Given pbsws is less than 0.1. Pbsws is set to 0.1";
14753  }
14754  if (SGatesidewallJctPotential < 0.1)
14755  {
14757  UserWarning(*this) << "Given pbswgs is less than 0.1. Pbswgs is set to 0.1";
14758  }
14759 
14760  if (DbulkJctPotential < 0.1)
14761  {
14762  DbulkJctPotential = 0.1;
14763  UserWarning(*this) << "Given pbd is less than 0.1. Pbd is set to 0.1";
14764  }
14765  if (DsidewallJctPotential < 0.1)
14766  {
14767  DsidewallJctPotential = 0.1;
14768  UserWarning(*this) << "Given pbswd is less than 0.1. Pbswd is set to 0.1";
14769  }
14770  if (DGatesidewallJctPotential < 0.1)
14771  {
14773  UserWarning(*this) << "Given pbswgd is less than 0.1. Pbswgd is set to 0.1";
14774  }
14775 
14776  // If there are any time dependent parameters, set their values at for
14777  // the current time.
14778 
14779  return true;
14780 }
14781 
14782 //----------------------------------------------------------------------------
14783 // Function : Model::processInstanceParams
14784 // Purpose :
14785 // Special Notes :
14786 // Scope : public
14787 // Creator : Eric Keiter, SNL
14788 // Creation Date : 11/25/06
14789 //----------------------------------------------------------------------------
14791 {
14792 
14793  std::vector<Instance*>::iterator iter;
14794  std::vector<Instance*>::iterator first = instanceContainer.begin();
14795  std::vector<Instance*>::iterator last = instanceContainer.end();
14796 
14797  for (iter=first; iter!=last; ++iter)
14798  {
14799  (*iter)->processParams();
14800  }
14801 
14802  return true;
14803 }
14804 
14805 
14806 //-----------------------------------------------------------------------------
14807 // Function : Model::Model
14808 // Purpose : model block constructor
14809 // Special Notes :
14810 // Scope : public
14811 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
14812 // Creation Date : 11/25/06
14813 //-----------------------------------------------------------------------------
14815  const Configuration & configuration,
14816  const ModelBlock & MB,
14817  const FactoryBlock & factory_block)
14818  : DeviceModel(MB, configuration.getModelParameters(), factory_block),
14819  modType (0),
14820  dtype (CONSTNMOS),
14821  mobMod(0),
14822  capMod(0),
14823  dioMod(0),
14824  trnqsMod(0),
14825  acnqsMod(0),
14826  fnoiMod(0),
14827  tnoiMod(0),
14828  rdsMod(0),
14829  rbodyMod(0),
14830  rgateMod(0),
14831  perMod(0),
14832  geoMod(0),
14833  igcMod(0),
14834  igbMod(0),
14835  tempMod(0),
14836  binUnit(0),
14837  paramChk(0),
14838  version("4.6.1"),
14839  toxe(0.0),
14840  toxp(0.0),
14841  toxm(0.0),
14842  dtox(0.0),
14843  epsrox(0.0),
14844  cdsc(0.0),
14845  cdscb(0.0),
14846  cdscd(0.0),
14847  cit(0.0),
14848  nfactor(0.0),
14849  xj(0.0),
14850  vsat(0.0),
14851  at(0.0),
14852  a0(0.0),
14853  ags(0.0),
14854  a1(0.0),
14855  a2(0.0),
14856  keta(0.0),
14857  nsub(0.0),
14858  ndep(0.0),
14859  nsd(0.0),
14860  phin(0.0),
14861  ngate(0.0),
14862  gamma1(0.0),
14863  gamma2(0.0),
14864  vbx(0.0),
14865  vbm(0.0),
14866  xt(0.0),
14867  k1(0.0),
14868  kt1(0.0),
14869  kt1l(0.0),
14870  kt2(0.0),
14871  k2(0.0),
14872  k3(0.0),
14873  k3b(0.0),
14874  w0(0.0),
14875  dvtp0(0.0),
14876  dvtp1(0.0),
14877  lpe0(0.0),
14878  lpeb(0.0),
14879  dvt0(0.0),
14880  dvt1(0.0),
14881  dvt2(0.0),
14882  dvt0w(0.0),
14883  dvt1w(0.0),
14884  dvt2w(0.0),
14885  drout(0.0),
14886  dsub(0.0),
14887  vth0(0.0),
14888  eu(0.0),
14889  ua(0.0),
14890  ua1(0.0),
14891  ub(0.0),
14892  ub1(0.0),
14893  uc(0.0),
14894  uc1(0.0),
14895  ud(0.0),
14896  ud1(0.0),
14897  up(0.0),
14898  lp(0.0),
14899  u0(0.0),
14900  ute(0.0),
14901  voff(0.0),
14902  tvoff(0.0),
14903  minv(0.0),
14904  voffl(0.0),
14905  delta(0.0),
14906  rdsw(0.0),
14907  rdswmin(0.0),
14908  rdwmin(0.0),
14909  rswmin(0.0),
14910  rsw(0.0),
14911  rdw(0.0),
14912  prwg(0.0),
14913  prwb(0.0),
14914  prt(0.0),
14915  eta0(0.0),
14916  etab(0.0),
14917  pclm(0.0),
14918  pdibl1(0.0),
14919  pdibl2(0.0),
14920  pdiblb(0.0),
14921  fprout(0.0),
14922  pdits(0.0),
14923  pditsd(0.0),
14924  pditsl(0.0),
14925  pscbe1(0.0),
14926  pscbe2(0.0),
14927  pvag(0.0),
14928  wr(0.0),
14929  dwg(0.0),
14930  dwb(0.0),
14931  b0(0.0),
14932  b1(0.0),
14933  alpha0(0.0),
14934  alpha1(0.0),
14935  beta0(0.0),
14936  agidl(0.0),
14937  bgidl(0.0),
14938  cgidl(0.0),
14939  egidl(0.0),
14940  aigc(0.0),
14941  bigc(0.0),
14942  cigc(0.0),
14943  aigsd(0.0),
14944  bigsd(0.0),
14945  cigsd(0.0),
14946  aigbacc(0.0),
14947  bigbacc(0.0),
14948  cigbacc(0.0),
14949  aigbinv(0.0),
14950  bigbinv(0.0),
14951  cigbinv(0.0),
14952  nigc(0.0),
14953  nigbacc(0.0),
14954  nigbinv(0.0),
14955  ntox(0.0),
14956  eigbinv(0.0),
14957  pigcd(0.0),
14958  poxedge(0.0),
14959  toxref(0.0),
14960  ijthdfwd(0.0),
14961  ijthsfwd(0.0),
14962  ijthdrev(0.0),
14963  ijthsrev(0.0),
14964  xjbvd(0.0),
14965  xjbvs(0.0),
14966  bvd(0.0),
14967  bvs(0.0),
14968  jtss(0.0),
14969  jtsd(0.0),
14970  jtssws(0.0),
14971  jtsswd(0.0),
14972  jtsswgs(0.0),
14973  jtsswgd(0.0),
14974  njts(0.0),
14975  njtssw(0.0),
14976  njtsswg(0.0),
14977  xtss(0.0),
14978  xtsd(0.0),
14979  xtssws(0.0),
14980  xtsswd(0.0),
14981  xtsswgs(0.0),
14982  xtsswgd(0.0),
14983  tnjts(0.0),
14984  tnjtssw(0.0),
14985  tnjtsswg(0.0),
14986  vtss(0.0),
14987  vtsd(0.0),
14988  vtssws(0.0),
14989  vtsswd(0.0),
14990  vtsswgs(0.0),
14991  vtsswgd(0.0),
14992 
14993  xrcrg1(0.0),
14994  xrcrg2(0.0),
14995  lambda(0.0),
14996  vtl(0.0),
14997  lc(0.0),
14998  xn(0.0),
14999  vfbsdoff(0.0), // S/D flatband offset voltage
15000  lintnoi(0.0), // lint offset for noise calculation
15001  tvfbsdoff(0.0),
15002 
15003  vfb(0.0),
15004  gbmin(0.0),
15005  rbdb(0.0),
15006  rbsb(0.0),
15007  rbpb(0.0),
15008  rbps(0.0),
15009  rbpd(0.0),
15010 
15011  rbps0(0.0),
15012  rbpsl(0.0),
15013  rbpsw(0.0),
15014  rbpsnf(0.0),
15015 
15016  rbpd0(0.0),
15017  rbpdl(0.0),
15018  rbpdw(0.0),
15019  rbpdnf(0.0),
15020 
15021  rbpbx0(0.0),
15022  rbpbxl(0.0),
15023  rbpbxw(0.0),
15024  rbpbxnf(0.0),
15025  rbpby0(0.0),
15026  rbpbyl(0.0),
15027  rbpbyw(0.0),
15028  rbpbynf(0.0),
15029 
15030  rbsbx0(0.0),
15031  rbsby0(0.0),
15032  rbdbx0(0.0),
15033  rbdby0(0.0),
15034 
15035  rbsdbxl(0.0),
15036  rbsdbxw(0.0),
15037  rbsdbxnf(0.0),
15038  rbsdbyl(0.0),
15039  rbsdbyw(0.0),
15040  rbsdbynf(0.0),
15041 
15042  tnoia(0.0),
15043  tnoib(0.0),
15044  rnoia(0.0),
15045  rnoib(0.0),
15046  ntnoi(0.0),
15047 
15048  // CV model and Parasitics
15049  cgsl(0.0),
15050  cgdl(0.0),
15051  ckappas(0.0),
15052  ckappad(0.0),
15053  cf(0.0),
15054  vfbcv(0.0),
15055  clc(0.0),
15056  cle(0.0),
15057  dwc(0.0),
15058  dlc(0.0),
15059  xw(0.0),
15060  xl(0.0),
15061  dlcig(0.0),
15062  dwj(0.0),
15063  noff(0.0),
15064  voffcv(0.0),
15065  acde(0.0),
15066  moin(0.0),
15067  tcj(0.0),
15068  tcjsw(0.0),
15069  tcjswg(0.0),
15070  tpb(0.0),
15071  tpbsw(0.0),
15072  tpbswg(0.0),
15073  dmcg(0.0),
15074  dmci(0.0),
15075  dmdg(0.0),
15076  dmcgt(0.0),
15077  xgw(0.0),
15078  xgl(0.0),
15079  rshg(0.0),
15080  ngcon(0.0),
15081 
15082  // Length Dependence
15083  lcdsc(0.0),
15084  lcdscb(0.0),
15085  lcdscd(0.0),
15086  lcit(0.0),
15087  lnfactor(0.0),
15088  lxj(0.0),
15089  lvsat(0.0),
15090  lat(0.0),
15091  la0(0.0),
15092  lags(0.0),
15093  la1(0.0),
15094  la2(0.0),
15095  lketa(0.0),
15096  lnsub(0.0),
15097  lndep(0.0),
15098  lnsd(0.0),
15099  lphin(0.0),
15100  lngate(0.0),
15101  lgamma1(0.0),
15102  lgamma2(0.0),
15103  lvbx(0.0),
15104  lvbm(0.0),
15105  lxt(0.0),
15106  lk1(0.0),
15107  lkt1(0.0),
15108  lkt1l(0.0),
15109  lkt2(0.0),
15110  lk2(0.0),
15111  lk3(0.0),
15112  lk3b(0.0),
15113  lw0(0.0),
15114  ldvtp0(0.0),
15115  ldvtp1(0.0),
15116  llpe0(0.0),
15117  llpeb(0.0),
15118  ldvt0(0.0),
15119  ldvt1(0.0),
15120  ldvt2(0.0),
15121  ldvt0w(0.0),
15122  ldvt1w(0.0),
15123  ldvt2w(0.0),
15124  ldrout(0.0),
15125  ldsub(0.0),
15126  lvth0(0.0),
15127  lua(0.0),
15128  lua1(0.0),
15129  lub(0.0),
15130  lub1(0.0),
15131  luc(0.0),
15132  luc1(0.0),
15133  lud(0.0),
15134  lud1(0.0),
15135  lup(0.0),
15136  llp(0.0),
15137  lu0(0.0),
15138  leu(0.0),
15139  lute(0.0),
15140  lvoff(0.0),
15141  ltvoff(0.0),
15142  lminv(0.0),
15143  ldelta(0.0),
15144  lrdsw(0.0),
15145  lrsw(0.0),
15146  lrdw(0.0),
15147  lprwg(0.0),
15148  lprwb(0.0),
15149  lprt(0.0),
15150  leta0(0.0),
15151  letab(0.0),
15152  lpclm(0.0),
15153  lpdibl1(0.0),
15154  lpdibl2(0.0),
15155  lpdiblb(0.0),
15156  lfprout(0.0),
15157  lpdits(0.0),
15158  lpditsd(0.0),
15159  lpscbe1(0.0),
15160  lpscbe2(0.0),
15161  lpvag(0.0),
15162  lwr(0.0),
15163  ldwg(0.0),
15164  ldwb(0.0),
15165  lb0(0.0),
15166  lb1(0.0),
15167  lalpha0(0.0),
15168  lalpha1(0.0),
15169  lbeta0(0.0),
15170  lvfb(0.0),
15171  lagidl(0.0),
15172  lbgidl(0.0),
15173  lcgidl(0.0),
15174  legidl(0.0),
15175  laigc(0.0),
15176  lbigc(0.0),
15177  lcigc(0.0),
15178  laigsd(0.0),
15179  lbigsd(0.0),
15180  lcigsd(0.0),
15181  laigbacc(0.0),
15182  lbigbacc(0.0),
15183  lcigbacc(0.0),
15184  laigbinv(0.0),
15185  lbigbinv(0.0),
15186  lcigbinv(0.0),
15187  lnigc(0.0),
15188  lnigbacc(0.0),
15189  lnigbinv(0.0),
15190  lntox(0.0),
15191  leigbinv(0.0),
15192  lpigcd(0.0),
15193  lpoxedge(0.0),
15194  lxrcrg1(0.0),
15195  lxrcrg2(0.0),
15196  llambda(0.0),
15197  lvtl(0.0),
15198  lxn(0.0),
15199  lvfbsdoff(0.0),
15200  ltvfbsdoff(0.0),
15201 
15202  // CV model
15203  lcgsl(0.0),
15204  lcgdl(0.0),
15205  lckappas(0.0),
15206  lckappad(0.0),
15207  lcf(0.0),
15208  lclc(0.0),
15209  lcle(0.0),
15210  lvfbcv(0.0),
15211  lnoff(0.0),
15212  lvoffcv(0.0),
15213  lacde(0.0),
15214  lmoin(0.0),
15215 
15216  // Width Dependence
15217  wcdsc(0.0),
15218  wcdscb(0.0),
15219  wcdscd(0.0),
15220  wcit(0.0),
15221  wnfactor(0.0),
15222  wxj(0.0),
15223  wvsat(0.0),
15224  wat(0.0),
15225  wa0(0.0),
15226  wags(0.0),
15227  wa1(0.0),
15228  wa2(0.0),
15229  wketa(0.0),
15230  wnsub(0.0),
15231  wndep(0.0),
15232  wnsd(0.0),
15233  wphin(0.0),
15234  wngate(0.0),
15235  wgamma1(0.0),
15236  wgamma2(0.0),
15237  wvbx(0.0),
15238  wvbm(0.0),
15239  wxt(0.0),
15240  wk1(0.0),
15241  wkt1(0.0),
15242  wkt1l(0.0),
15243  wkt2(0.0),
15244  wk2(0.0),
15245  wk3(0.0),
15246  wk3b(0.0),
15247  ww0(0.0),
15248  wdvtp0(0.0),
15249  wdvtp1(0.0),
15250  wlpe0(0.0),
15251  wlpeb(0.0),
15252  wdvt0(0.0),
15253  wdvt1(0.0),
15254  wdvt2(0.0),
15255  wdvt0w(0.0),
15256  wdvt1w(0.0),
15257  wdvt2w(0.0),
15258  wdrout(0.0),
15259  wdsub(0.0),
15260  wvth0(0.0),
15261  wua(0.0),
15262  wua1(0.0),
15263  wub(0.0),
15264  wub1(0.0),
15265  wuc(0.0),
15266  wuc1(0.0),
15267  wud(0.0),
15268  wud1(0.0),
15269  wup(0.0),
15270  wlp(0.0),
15271  wu0(0.0),
15272  weu(0.0),
15273  wute(0.0),
15274  wvoff(0.0),
15275  wtvoff(0.0),
15276  wminv(0.0),
15277  wdelta(0.0),
15278  wrdsw(0.0),
15279  wrsw(0.0),
15280  wrdw(0.0),
15281  wprwg(0.0),
15282  wprwb(0.0),
15283  wprt(0.0),
15284  weta0(0.0),
15285  wetab(0.0),
15286  wpclm(0.0),
15287  wpdibl1(0.0),
15288  wpdibl2(0.0),
15289  wpdiblb(0.0),
15290  wfprout(0.0),
15291  wpdits(0.0),
15292  wpditsd(0.0),
15293  wpscbe1(0.0),
15294  wpscbe2(0.0),
15295  wpvag(0.0),
15296  wwr(0.0),
15297  wdwg(0.0),
15298  wdwb(0.0),
15299  wb0(0.0),
15300  wb1(0.0),
15301  walpha0(0.0),
15302  walpha1(0.0),
15303  wbeta0(0.0),
15304  wvfb(0.0),
15305  wagidl(0.0),
15306  wbgidl(0.0),
15307  wcgidl(0.0),
15308  wegidl(0.0),
15309  waigc(0.0),
15310  wbigc(0.0),
15311  wcigc(0.0),
15312  waigsd(0.0),
15313  wbigsd(0.0),
15314  wcigsd(0.0),
15315  waigbacc(0.0),
15316  wbigbacc(0.0),
15317  wcigbacc(0.0),
15318  waigbinv(0.0),
15319  wbigbinv(0.0),
15320  wcigbinv(0.0),
15321  wnigc(0.0),
15322  wnigbacc(0.0),
15323  wnigbinv(0.0),
15324  wntox(0.0),
15325  weigbinv(0.0),
15326  wpigcd(0.0),
15327  wpoxedge(0.0),
15328  wxrcrg1(0.0),
15329  wxrcrg2(0.0),
15330  wlambda(0.0),
15331  wvtl(0.0),
15332  wxn(0.0),
15333  wvfbsdoff(0.0),
15334  wtvfbsdoff(0.0),
15335 
15336  // CV model
15337  wcgsl(0.0),
15338  wcgdl(0.0),
15339  wckappas(0.0),
15340  wckappad(0.0),
15341  wcf(0.0),
15342  wclc(0.0),
15343  wcle(0.0),
15344  wvfbcv(0.0),
15345  wnoff(0.0),
15346  wvoffcv(0.0),
15347  wacde(0.0),
15348  wmoin(0.0),
15349 
15350  // Cross-term Dependence
15351  pcdsc(0.0),
15352  pcdscb(0.0),
15353  pcdscd(0.0),
15354  pcit(0.0),
15355  pnfactor(0.0),
15356  pxj(0.0),
15357  pvsat(0.0),
15358  pat(0.0),
15359  pa0(0.0),
15360  pags(0.0),
15361  pa1(0.0),
15362  pa2(0.0),
15363  pketa(0.0),
15364  pnsub(0.0),
15365  pndep(0.0),
15366  pnsd(0.0),
15367  pphin(0.0),
15368  pngate(0.0),
15369  pgamma1(0.0),
15370  pgamma2(0.0),
15371  pvbx(0.0),
15372  pvbm(0.0),
15373  pxt(0.0),
15374  pk1(0.0),
15375  pkt1(0.0),
15376  pkt1l(0.0),
15377  pkt2(0.0),
15378  pk2(0.0),
15379  pk3(0.0),
15380  pk3b(0.0),
15381  pw0(0.0),
15382  pdvtp0(0.0),
15383  pdvtp1(0.0),
15384  plpe0(0.0),
15385  plpeb(0.0),
15386  pdvt0(0.0),
15387  pdvt1(0.0),
15388  pdvt2(0.0),
15389  pdvt0w(0.0),
15390  pdvt1w(0.0),
15391  pdvt2w(0.0),
15392  pdrout(0.0),
15393  pdsub(0.0),
15394  pvth0(0.0),
15395  pua(0.0),
15396  pua1(0.0),
15397  pub(0.0),
15398  pub1(0.0),
15399  puc(0.0),
15400  puc1(0.0),
15401  pud(0.0),
15402  pud1(0.0),
15403  pup(0.0),
15404  plp(0.0),
15405  pu0(0.0),
15406  peu(0.0),
15407  pute(0.0),
15408  pvoff(0.0),
15409  ptvoff(0.0),
15410  pminv(0.0),
15411  pdelta(0.0),
15412  prdsw(0.0),
15413  prsw(0.0),
15414  prdw(0.0),
15415  pprwg(0.0),
15416  pprwb(0.0),
15417  pprt(0.0),
15418  peta0(0.0),
15419  petab(0.0),
15420  ppclm(0.0),
15421  ppdibl1(0.0),
15422  ppdibl2(0.0),
15423  ppdiblb(0.0),
15424  pfprout(0.0),
15425  ppdits(0.0),
15426  ppditsd(0.0),
15427  ppscbe1(0.0),
15428  ppscbe2(0.0),
15429  ppvag(0.0),
15430  pwr(0.0),
15431  pdwg(0.0),
15432  pdwb(0.0),
15433  pb0(0.0),
15434  pb1(0.0),
15435  palpha0(0.0),
15436  palpha1(0.0),
15437  pbeta0(0.0),
15438  pvfb(0.0),
15439  pagidl(0.0),
15440  pbgidl(0.0),
15441  pcgidl(0.0),
15442  pegidl(0.0),
15443  paigc(0.0),
15444  pbigc(0.0),
15445  pcigc(0.0),
15446  paigsd(0.0),
15447  pbigsd(0.0),
15448  pcigsd(0.0),
15449  paigbacc(0.0),
15450  pbigbacc(0.0),
15451  pcigbacc(0.0),
15452  paigbinv(0.0),
15453  pbigbinv(0.0),
15454  pcigbinv(0.0),
15455  pnigc(0.0),
15456  pnigbacc(0.0),
15457  pnigbinv(0.0),
15458  pntox(0.0),
15459  peigbinv(0.0),
15460  ppigcd(0.0),
15461  ppoxedge(0.0),
15462  pxrcrg1(0.0),
15463  pxrcrg2(0.0),
15464  plambda(0.0),
15465  pvtl(0.0),
15466  pxn(0.0),
15467  pvfbsdoff(0.0),
15468  ptvfbsdoff(0.0),
15469 
15470  // CV model
15471  pcgsl(0.0),
15472  pcgdl(0.0),
15473  pckappas(0.0),
15474  pckappad(0.0),
15475  pcf(0.0),
15476  pclc(0.0),
15477  pcle(0.0),
15478  pvfbcv(0.0),
15479  pnoff(0.0),
15480  pvoffcv(0.0),
15481  pacde(0.0),
15482  pmoin(0.0),
15483 
15484  tnom(0.0),
15485  cgso(0.0),
15486  cgdo(0.0),
15487  cgbo(0.0),
15488  xpart(0.0),
15489  cFringOut(0.0),
15490  cFringMax(0.0),
15491 
15492  sheetResistance(0.0),
15493  SjctSatCurDensity(0.0),
15494  DjctSatCurDensity(0.0),
15495  SjctSidewallSatCurDensity(0.0),
15496  DjctSidewallSatCurDensity(0.0),
15497  SjctGateSidewallSatCurDensity(0.0),
15498  DjctGateSidewallSatCurDensity(0.0),
15499  SbulkJctPotential(0.0),
15500  DbulkJctPotential(0.0),
15501  SbulkJctBotGradingCoeff(0.0),
15502  DbulkJctBotGradingCoeff(0.0),
15503  SbulkJctSideGradingCoeff(0.0),
15504  DbulkJctSideGradingCoeff(0.0),
15505  SbulkJctGateSideGradingCoeff(0.0),
15506  DbulkJctGateSideGradingCoeff(0.0),
15507  SsidewallJctPotential(0.0),
15508  DsidewallJctPotential(0.0),
15509  SGatesidewallJctPotential(0.0),
15510  DGatesidewallJctPotential(0.0),
15511  SunitAreaJctCap(0.0),
15512  DunitAreaJctCap(0.0),
15513  SunitLengthSidewallJctCap(0.0),
15514  DunitLengthSidewallJctCap(0.0),
15515  SunitLengthGateSidewallJctCap(0.0),
15516  DunitLengthGateSidewallJctCap(0.0),
15517  SjctEmissionCoeff(0.0),
15518  DjctEmissionCoeff(0.0),
15519  SjctTempExponent(0.0),
15520  DjctTempExponent(0.0),
15521  njtsstemp(0.0),
15522  njtsswstemp(0.0),
15523  njtsswgstemp(0.0),
15524  njtsdtemp(0.0),
15525  njtsswdtemp(0.0),
15526  njtsswgdtemp(0.0),
15527 
15528 
15529  Lint(0.0),
15530  Ll(0.0),
15531  Llc(0.0),
15532  Lln(0.0),
15533  Lw(0.0),
15534  Lwc(0.0),
15535  Lwn(0.0),
15536  Lwl(0.0),
15537  Lwlc(0.0),
15538  Lmin(0.0),
15539  Lmax(0.0),
15540 
15541  Wint(0.0),
15542  Wl(0.0),
15543  Wlc(0.0),
15544  Wln(0.0),
15545  Ww(0.0),
15546  Wwc(0.0),
15547  Wwn(0.0),
15548  Wwl(0.0),
15549  Wwlc(0.0),
15550  Wmin(0.0),
15551  Wmax(0.0),
15552 
15553  // added for stress effect
15554  saref(0.0),
15555  sbref(0.0),
15556  wlod(0.0),
15557  ku0(0.0),
15558  kvsat(0.0),
15559  kvth0(0.0),
15560  tku0(0.0),
15561  llodku0(0.0),
15562  wlodku0(0.0),
15563  llodvth(0.0),
15564  wlodvth(0.0),
15565  lku0(0.0),
15566  wku0(0.0),
15567  pku0(0.0),
15568  lkvth0(0.0),
15569  wkvth0(0.0),
15570  pkvth0(0.0),
15571  stk2(0.0),
15572  lodk2(0.0),
15573  steta0(0.0),
15574  lodeta0(0.0),
15575 
15576  web(0.0),
15577  wec(0.0),
15578  kvth0we(0.0),
15579  k2we(0.0),
15580  ku0we(0.0),
15581  scref(0.0),
15582  wpemod(0.0),
15583  lkvth0we(0.0),
15584  lk2we(0.0),
15585  lku0we(0.0),
15586  wkvth0we(0.0),
15587  wk2we(0.0),
15588  wku0we(0.0),
15589  pkvth0we(0.0),
15590  pk2we(0.0),
15591  pku0we(0.0),
15592 
15593 // Pre-calculated constants
15594 // move to size-dependent param
15595  vtm(0.0),
15596  vtm0(0.0),
15597  coxe(0.0),
15598  coxp(0.0),
15599  cof1(0.0),
15600  cof2(0.0),
15601  cof3(0.0),
15602  cof4(0.0),
15603  vcrit(0.0),
15604  factor1(0.0),
15605  PhiBS(0.0),
15606  PhiBSWS(0.0),
15607  PhiBSWGS(0.0),
15608  SjctTempSatCurDensity(0.0),
15609  SjctSidewallTempSatCurDensity(0.0),
15610  SjctGateSidewallTempSatCurDensity(0.0),
15611  PhiBD(0.0),
15612  PhiBSWD(0.0),
15613  PhiBSWGD(0.0),
15614  DjctTempSatCurDensity(0.0),
15615  DjctSidewallTempSatCurDensity(0.0),
15616  DjctGateSidewallTempSatCurDensity(0.0),
15617  SunitAreaTempJctCap(0.0),
15618  DunitAreaTempJctCap(0.0),
15619  SunitLengthSidewallTempJctCap(0.0),
15620  DunitLengthSidewallTempJctCap(0.0),
15621  SunitLengthGateSidewallTempJctCap(0.0),
15622  DunitLengthGateSidewallTempJctCap(0.0),
15623 
15624  oxideTrapDensityA(0.0),
15625  oxideTrapDensityB(0.0),
15626  oxideTrapDensityC(0.0),
15627  em(0.0),
15628  ef(0.0),
15629  af(0.0),
15630  kf(0.0),
15631  ni(0.0),
15632  Vtm0(0.0),
15633 
15634  vtlGiven(false),
15635  ndepGiven(false),
15636  gamma1Given(false),
15637  k1Given(false),
15638  k2Given(false),
15639  nsubGiven(false),
15640  xtGiven(false),
15641  vbxGiven(false),
15642  gamma2Given(false),
15643  vfbGiven(false),
15644  vth0Given(false),
15645  rbps0Given(false),
15646  rbpd0Given(false),
15647  rbsbx0Given(false),
15648  rbsby0Given(false),
15649  rbdbx0Given(false),
15650  rbdby0Given(false),
15651  lambdaGiven(false),
15652  pigcdGiven(false),
15653  toxeGiven(false),
15654  toxpGiven(false),
15655  dtoxGiven(false),
15656  cgdoGiven(false),
15657  dlcGiven(false),
15658  cgsoGiven(false),
15659  cgboGiven(false)
15660 
15661 {
15662  if (getType() != "")
15663  {
15664  if (getType() == "NMOS") {
15665  dtype = CONSTNMOS;
15666  }
15667  else if (getType() == "PMOS") {
15668  dtype = CONSTPMOS;
15669  }
15670  else
15671  {
15672  UserError0(*this) << "Could not recognize the type for model " << getName();
15673  }
15674  }
15675 
15676 
15677  // Set params to constant default values:
15678  setDefaultParams ();
15679 
15680  // Set params according to .model line and constant defaults from metadata:
15681  setModParams (MB.params);
15682 
15683  // Set any non-constant parameter defaults:
15684  if (!given("TNOM"))
15686 
15687  // Calculate any parameters specified as expressions:
15688 
15690 
15691  // calculate dependent (ie computed) params
15692  if (!given("TOXP") )
15693  toxp = toxe;
15694  if (!given("TOXM") )
15695  toxm = toxe;
15696  if (!given("DSUB") )
15697  dsub = drout;
15698 
15699  if (!given("VTH0") )
15700  vth0 = (dtype == CONSTNMOS) ? 0.7 : -0.7;
15701 
15702  if (!given("VDDEOT"))
15703  vddeot= (dtype == CONSTNMOS)?1.5:-1.5;
15704  if (!given("EU"))
15705  eu =(dtype == CONSTNMOS) ? 1.67 : 1.0;;
15706  if (!given("UA"))
15707  ua =(mobMod == 2) ? 1.0E-15 : 1.0E-9; // UNIT M/V
15708  if (!given("UC"))
15709  uc = (mobMod == 1) ? -0.0465 : -0.0465E-9;
15710  if (!given("UC1"))
15711  uc1 =(mobMod == 1) ? -0.056 : -0.056E-9;
15712  if (!given("U0"))
15713  u0 = (dtype == CONSTNMOS) ? 0.067 : 0.025;
15714  if (!given("AIGC"))
15715  aigc =(dtype == CONSTNMOS) ? 1.36E-2 : 9.80E-3;
15716  if (!given("BIGC"))
15717  bigc =(dtype == CONSTNMOS) ? 1.71E-3 : 7.59E-4;
15718  if (!given("CIGC"))
15719  cigc = (dtype == CONSTNMOS) ? 0.075 : 0.03;
15720  if (given("AIGSD"))
15721  {
15722  aigs = aigd = aigsd;
15723  }
15724  else
15725  {
15726  aigsd = (dtype == CONSTNMOS) ? 1.36E-2 : 9.80E-3;
15727  if (!given("AIGS"))
15728  aigs = aigsd;
15729  if (!given("AIGD"))
15730  aigd = aigsd;
15731  }
15732 
15733  if (given("BIGSD"))
15734  {
15735  bigs = bigd = bigsd;
15736  }
15737  else
15738  {
15739  bigsd = (dtype == CONSTNMOS) ? 1.71E-3 : 7.59E-4;
15740  if (!given("BIGS"))
15741  bigs = bigsd;
15742  if (!given("BIGD"))
15743  bigd = bigsd;
15744  }
15745  if (given("CIGSD"))
15746  {
15747  cigs=cigd=cigsd;
15748  }
15749  else
15750  {
15751  cigsd = (dtype == CONSTNMOS) ? 0.075 : 0.03;
15752  if (!given("CIGS"))
15753  cigs=cigsd;
15754  if (!given("CIGD"))
15755  cigd=cigsd;
15756  }
15757  if (!given("IJTHDFWD"))
15758  ijthdfwd = ijthsfwd;
15759  if (!given("IJTHDREV"))
15760  ijthdrev = ijthsrev;
15761  if (!given("XJBVD"))
15762  xjbvd = xjbvs;
15763  if (!given("BVD"))
15764  bvd = bvs;
15765  if (!given("CKAPPAD"))
15766  ckappad = ckappas;
15767  if (!given("DMCI"))
15768  dmci = dmcg;
15769  if (!given("LLC"))
15770  Llc = Ll;
15771  if (!given("LWC"))
15772  Lwc = Lw;
15773  if (!given("LWLC"))
15774  Lwlc = Lwl;
15775  if (!given("WLC"))
15776  Wlc = Wl;
15777  if (!given("WWC"))
15778  Wwc = Ww;
15779  if (!given("WWLC"))
15780  Wwlc = Wwl;
15781  if (!given("DWC"))
15782  dwc = Wint;
15783  if (!given("DLC"))
15784  dlc = Lint;
15785 
15786  if (!given("AGISL"))
15787  {
15788  if (given("AGIDL"))
15789  agisl=agidl;
15790  // otherwise our initializer took care of it already
15791  }
15792  if (!given("BGISL"))
15793  {
15794  if (given("BGIDL"))
15795  bgisl=bgidl;
15796  }
15797  if (!given("CGISL"))
15798  {
15799  if (given("CGIDL"))
15800  cgisl=cgidl;
15801  }
15802  if (!given("EGISL"))
15803  {
15804  if (given("EGIDL"))
15805  egisl=egidl;
15806  }
15807 
15808  if (!given("DLCIG"))
15809  dlcig = Lint;
15810  if (!given("DLCIGD"))
15811  {
15812  if (!given("DLCIG"))
15813  dlcigd = Lint;
15814  else
15815  dlcigd = dlcig;
15816  }
15817  if (!given("DWJ"))
15818  dwj = dwc;
15819 
15820 
15821 
15822 
15823  // The seemingly unnecessary and absurd parentheses around CONSTEPS0/M_PI
15824  // turned out to be necessary for getting this statement to evaluate properly
15825  // on Windows with Intel compilers. Bleah.
15826  if (!given("CF"))
15827  cf = 2.0 * epsrox * ((CONSTEPS0) / (M_PI)) * log(1.0 + 0.4E-6 / toxe);
15828 
15829  if (!given("JSD"))
15831  if (!given("JSWD"))
15833  if (!given("JSWGD"))
15835  if (!given("PBD"))
15837  if (!given("NJD"))
15839  if (!given("XTID"))
15841  if (!given("MJD"))
15843  if (!given("MJSWD"))
15845  if (!given("MJSWGS"))
15847  if (!given("MJSWGD"))
15849  if (!given("PBSWD"))
15851  if (!given("PBSWGS"))
15853  if (!given("PBSWGD"))
15855  if (!given("CJD"))
15857  if (!given("CJSWD"))
15859  if (!given("CJSWGS"))
15861  if (!given("CJSWGD"))
15863 
15864  if (!given("JTSD"))
15865  jtsd = jtss;
15866  if (!given("JTSSWD"))
15867  jtsswd = jtssws;
15868  if (!given("JTSSWGD"))
15869  jtsswgd = jtsswgs;
15870 
15871  if (!given("NJTSD"))
15872  {
15873  if (given("NJTS"))
15874  njtsd = njts;
15875  }
15876  if (!given("NJTSSWD"))
15877  {
15878  if (given("NJTSSW"))
15879  njtsswd = njtssw;
15880  }
15881  if (!given("NJTSSWGD"))
15882  {
15883  if (given("NJTSSWG"))
15884  njtsswgd = njtsswg;
15885  }
15886 
15887  if (!given("XTSD"))
15888  xtsd = xtss;
15889  if (!given("XTSSWD"))
15890  xtsswd = xtssws;
15891  if (!given("XTSSWGD"))
15892  xtsswgd = xtsswgs;
15893 
15894  if (!given("TNJTSD"))
15895  {
15896  if (given("TNJTS"))
15897  tnjtsd = tnjts;
15898  }
15899  if (!given("TNJTSSWD"))
15900  {
15901  if (given("TNJTSSW"))
15902  tnjtsswd = tnjtssw;
15903  }
15904  if (!given("TNJTSSWGD"))
15905  {
15906  if (given("TNJTSSWG"))
15907  tnjtsswgd = tnjtsswg;
15908  }
15909 
15910  if (!given("VTSD"))
15911  vtsd = vtss;
15912  if (!given("VTSSWD"))
15913  vtsswd = vtssws;
15914  if (!given("VTSSWGD"))
15915  vtsswgd = vtsswgs;
15916 
15917  if (!given("LAGISL"))
15918  {
15919  if (given("LAGIDL"))
15920  lagisl = lagidl;
15921  }
15922  if (!given("LBGISL"))
15923  {
15924  if (given("LBGIDL"))
15925  lbgisl = lbgidl;
15926  }
15927  if (!given("LCGISL"))
15928  {
15929  if (given("LCGIDL"))
15930  lcgisl = lcgidl;
15931  }
15932  if (!given("LEGISL"))
15933  {
15934  if (given("LEGIDL"))
15935  legisl = legidl;
15936  }
15937 
15938  // This is ugly, ugly, ugly.
15939  // This stuff is all the "else" clauses from the spice code, which are
15940  // all like this:
15941  // if (given("xxxsd") && (given(xxxs) || given(xxxd)))
15942  // {
15943  // set not-given things to constants
15944  // }
15945  // else
15946  // {
15947  // set the s and d versions to the sd version
15948  // }
15949  // But we set the constants in the ParTable stuff, so all that is left is
15950  // the else. So I negated the conditional and left only the stuff in the
15951  // else.
15952  // TVR 1 Aug 07
15953  //
15954  if (!(!given("AIGSD") && (given("AIGS") || given("AIGD"))))
15955  {
15956  laigs = laigd = laigsd;
15957  }
15958  if (!(!given("BIGSD") && (given("BIGS") || given("BIGD"))))
15959  {
15960  lbigs = lbigd = lbigsd;
15961  }
15962  if (!(!given("CIGSD") && (given("CIGS") || given("CIGD"))))
15963  {
15964  lcigs = lcigd = lcigsd;
15965  }
15966 
15967  if (!given("WAGISL"))
15968  {
15969  if (given("WAGIDL"))
15970  wagisl = wagidl;
15971  }
15972  if (!given("WBGISL"))
15973  {
15974  if (given("WBGIDL"))
15975  wbgisl = wbgidl;
15976  }
15977  if (!given("WCGISL"))
15978  {
15979  if (given("WCGIDL"))
15980  wcgisl = wcgidl;
15981  }
15982  if (!given("WEGISL"))
15983  {
15984  if (given("WEGIDL"))
15985  wegisl = wegidl;
15986  }
15987 
15988  // See above, under "ugly, ugly, ugly"
15989  if (!(!given("AIGSD") && (given("AIGS") || given("AIGD"))))
15990  {
15991  waigs = waigd = waigsd;
15992  }
15993  if (!(!given("BIGSD") && (given("BIGS") || given("BIGD"))))
15994  {
15995  wbigs = wbigd = wbigsd;
15996  }
15997  if (!(!given("CIGSD") && (given("CIGS") || given("CIGD"))))
15998  {
15999  wcigs = wcigd = wcigsd;
16000  }
16001 
16002  if (!given("PAGISL"))
16003  {
16004  if (given("PAGIDL"))
16005  pagisl = pagidl;
16006  }
16007  if (!given("PBGISL"))
16008  {
16009  if (given("PBGIDL"))
16010  pbgisl = pbgidl;
16011  }
16012  if (!given("PCGISL"))
16013  {
16014  if (given("PCGIDL"))
16015  pcgisl = pcgidl;
16016  }
16017  if (!given("PEGISL"))
16018  {
16019  if (given("PEGIDL"))
16020  pegisl = pegidl;
16021  }
16022 
16023  // Vide supra, re "ugly"
16024  if (!(!given("AIGSD") && (given("AIGS") || given("AIGD"))))
16025  {
16026  paigs = paigd = paigsd;
16027  }
16028  if (!(!given("BIGSD") && (given("BIGS") || given("BIGD"))))
16029  {
16030  pbigs = pbigd = pbigsd;
16031  }
16032  if (!(!given("CIGSD") && (given("CIGS") || given("CIGD"))))
16033  {
16034  pcigs = pcigd = pcigsd;
16035  }
16036 
16037  if (!given("NOIA"))
16038  {
16039  if (dtype == CONSTNMOS)
16040  oxideTrapDensityA = 6.25e41;
16041  else
16042  oxideTrapDensityA= 6.188e40;
16043  }
16044  if (!given("NOIB"))
16045  {
16046  if (dtype == CONSTNMOS)
16047  oxideTrapDensityB = 3.125e26;
16048  else
16049  oxideTrapDensityB = 1.5e25;
16050  }
16051  if (!given("NOIC"))
16052  {
16053  oxideTrapDensityC = 8.75e9;
16054  }
16055 
16056  processParams ();
16057 }
16058 
16059 //-----------------------------------------------------------------------------
16060 // Function : Model::~Model
16061 // Purpose : destructor
16062 // Special Notes :
16063 // Scope : public
16064 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
16065 // Creation Date : 11/25/06
16066 //-----------------------------------------------------------------------------
16068 {
16069  std::list<SizeDependParam*>::iterator it_dpL =
16070  sizeDependParamList.begin();
16071  std::list<SizeDependParam*>::iterator end_dpL =
16072  sizeDependParamList.end();
16073  for( ; it_dpL != end_dpL; ++it_dpL )
16074  delete (*it_dpL);
16075 
16076  sizeDependParamList.clear ();
16077 
16078  std::vector<Instance*>::iterator iter;
16079  std::vector<Instance*>::iterator first = instanceContainer.begin();
16080  std::vector<Instance*>::iterator last = instanceContainer.end();
16081 
16082  for (iter=first; iter!=last; ++iter)
16083  {
16084  delete (*iter);
16085  }
16086 
16087 }
16088 
16089 //-----------------------------------------------------------------------------
16090 // Function : Model::printOutInstances
16091 // Purpose : debugging tool.
16092 // Special Notes :
16093 // Scope : public
16094 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
16095 // Creation Date : 11/25/06
16096 //-----------------------------------------------------------------------------
16097 std::ostream &Model::printOutInstances(std::ostream &os) const
16098 {
16099  std::vector<Instance*>::const_iterator iter;
16100  std::vector<Instance*>::const_iterator first = instanceContainer.begin();
16101  std::vector<Instance*>::const_iterator last = instanceContainer.end();
16102 
16103  int i;
16104  os << std::endl;
16105  os << " name model name Parameters" << std::endl;
16106 
16107  for (i=0, iter=first; iter!=last; ++iter,++i)
16108  {
16109  os << " " << i << ": " << (*iter)->getName() << "\t";
16110  os << getName();
16111  os << std::endl;
16112  }
16113 
16114  os << std::endl;
16115 
16116  return os;
16117 }
16118 
16119 //-----------------------------------------------------------------------------
16120 // Function : Model::forEachInstance
16121 // Purpose :
16122 // Special Notes :
16123 // Scope : public
16124 // Creator : David Baur
16125 // Creation Date : 2/4/2014
16126 //-----------------------------------------------------------------------------
16127 /// Apply a device instance "op" to all instances associated with this
16128 /// model
16129 ///
16130 /// @param[in] op Operator to apply to all instances.
16131 ///
16132 ///
16133 void Model::forEachInstance(DeviceInstanceOp &op) const /* override */
16134 {
16135  for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
16136  op(*it);
16137 }
16138 
16139 
16140 
16141 //----------------------------------------------------------------------------
16142 // Function : Model::clearTemperatureData
16143 //
16144 // Purpose : This is mainly here to delete rid of the size
16145 // dependent parameters, which are also temperature dependent.
16146 //
16147 // Special Notes : This is called right before the circuit temperature is
16148 // changed.
16149 //
16150 // Scope : public
16151 // Creator : Eric R. Keiter, SNL
16152 // Creation Date : 11/25/06
16153 //----------------------------------------------------------------------------
16155 {
16156  std::list<SizeDependParam*>::iterator it_dpL =
16157  sizeDependParamList.begin();
16158  std::list<SizeDependParam*>::iterator end_dpL =
16159  sizeDependParamList.end();
16160  for( ; it_dpL != end_dpL; ++it_dpL )
16161  delete (*it_dpL);
16162 
16163  sizeDependParamList.clear ();
16164 
16165  return true;
16166 }
16167 
16168 //-----------------------------------------------------------------------------
16169 // MOSFET_B4 Master functions:
16170 //-----------------------------------------------------------------------------
16171 
16172 //-----------------------------------------------------------------------------
16173 // Function : Master::updateState
16174 // Purpose :
16175 // Special Notes :
16176 // Scope : public
16177 // Creator : Eric Keiter, SNL
16178 // Creation Date : 11/26/08
16179 //-----------------------------------------------------------------------------
16180 bool Master::updateState (double * solVec, double * staVec, double * stoVec)
16181 {
16182  bool bsuccess = true;
16183 
16184 #ifdef _OMP
16185 #pragma omp parallel for
16186 #endif
16187  for (InstanceVector::const_iterator it = getInstanceBegin(); it != getInstanceEnd(); ++it)
16188  {
16189  Instance & mi = *(*it);
16190 
16191  bool btmp = mi.updateIntermediateVars ();
16192  bsuccess = bsuccess && btmp;
16193 
16194  // voltage drops:
16195  double * stoVec = mi.extData.nextStoVectorRawPtr;
16196  stoVec[mi.li_store_vbd] = mi.vbd;
16197  stoVec[mi.li_store_vbs] = mi.vbs;
16198  stoVec[mi.li_store_vgs] = mi.vgs;
16199  stoVec[mi.li_store_vds] = mi.vds;
16200  stoVec[mi.li_store_vges] = mi.vges;
16201  stoVec[mi.li_store_vgms] = mi.vgms;
16202  stoVec[mi.li_store_vdes] = mi.vdes;
16203  stoVec[mi.li_store_vses] = mi.vses;
16204  stoVec[mi.li_store_vdbs] = mi.vdbs;
16205  stoVec[mi.li_store_vsbs] = mi.vsbs;
16206  stoVec[mi.li_store_vdbd] = mi.vdbd;
16207  stoVec[mi.li_store_von] = mi.von;
16208 
16209  // intrinsic capacitors:
16210  // Note the wierdness --- we have a "qg", "qb" and "qd" state variable,
16211  // but no corresponding instance variable --- they are all calculated from
16212  // other quantities that are NOT stored in the instance. We use them
16213  // only in their derivative forms, cqg, cqb, and cqd.
16214  mi.qg = staVec[mi.li_state_qg ] = mi.qgate;
16215  mi.qd = staVec[mi.li_state_qd ] = mi.qdrn-mi.qbd;
16216 
16217  if (!mi.rbodyMod)
16218  {
16219  mi.qb =staVec[mi.li_state_qb ] = mi.qbulk+mi.qbd+mi.qbs;
16220  }
16221  else
16222  {
16223  mi.qb = staVec[mi.li_state_qb ] = mi.qbulk;
16224  }
16225 
16226  if (mi.rgateMod == 3)
16227  {
16228  staVec[mi.li_state_qgmid] = mi.qgmid;
16229  }
16230 
16231  // parasitic capacitors:
16232  if (mi.rbodyMod)
16233  {
16234  staVec[mi.li_state_qbs] = mi.qbs;
16235  staVec[mi.li_state_qbd] = mi.qbd;
16236  }
16237 
16238  if( mi.trnqsMod )
16239  {
16240  staVec[mi.li_state_qcheq] = mi.qcheq;
16241  staVec[mi.li_state_qcdump] = mi.qdef * mi.ScalingFactor;
16242  }
16243 
16244  // if this is the first newton step of the first time step
16245  // of the transient simulation, we need to enforce that the
16246  // time derivatives w.r.t. charge are zero. This is to maintain 3f5
16247  // compatibility. ERK.
16248 
16249  // Note: I think this kind of thing is enforced (or should be enforced,
16250  // anyway) at the time integration level. So I'm not sure this step is
16251  // really needed, at least for new-DAE. Derivatives out of the DCOP
16252  // are supposed to be zero at the first newton step.
16253 
16254  if (!(getSolverState().dcopFlag) && getSolverState().initTranFlag && getSolverState().newtonIter==0)
16255  {
16256  // re-set the state vector pointer that we are using to the "current"
16257  // pointer, rather than the "next" pointer.
16258  double * currStaVec = mi.extData.currStaVectorRawPtr;
16259 
16260  // intrinsic capacitors:
16261  currStaVec[mi.li_state_qg ] = mi.qgate;
16262  currStaVec[mi.li_state_qd ] = mi.qdrn-mi.qbd;
16263  if (!mi.rbodyMod)
16264  {
16265  currStaVec[mi.li_state_qb ] = mi.qbulk+mi.qbd+mi.qbs;
16266  }
16267  else
16268  {
16269  currStaVec[mi.li_state_qb ] = mi.qbulk;
16270  }
16271 
16272  if (mi.rgateMod == 3)
16273  {
16274  currStaVec[mi.li_state_qgmid] = mi.qgmid;
16275  }
16276 
16277  // parasitic capacitors:
16278  if (mi.rbodyMod)
16279  {
16280  currStaVec[mi.li_state_qbs] = mi.qbs;
16281  currStaVec[mi.li_state_qbd] = mi.qbd;
16282  }
16283 
16284  if( mi.trnqsMod )
16285  {
16286  currStaVec[mi.li_state_qcheq] = mi.qcheq;
16287  currStaVec[mi.li_state_qcdump] = mi.qdef * mi.ScalingFactor;
16288  }
16289  }
16290  }
16291 
16292  return bsuccess;
16293 }
16294 
16295 //-----------------------------------------------------------------------------
16296 // Function : Master::loadDAEVectors
16297 // Purpose :
16298 // Special Notes :
16299 // Scope : public
16300 // Creator : Eric Keiter, SNL
16301 // Creation Date : 11/26/08
16302 //-----------------------------------------------------------------------------
16303 bool Master::loadDAEVectors (double * solVec, double * fVec, double *qVec, double * bVec, double * storeLeadF, double * storeLeadQ)
16304 {
16305  for (InstanceVector::const_iterator it = getInstanceBegin(); it != getInstanceEnd(); ++it)
16306  {
16307  Instance & mi = *(*it);
16308 
16309  double * dFdxdVp = mi.extData.dFdxdVpVectorRawPtr;
16310  double * dQdxdVp = mi.extData.dQdxdVpVectorRawPtr;
16311  double coef(0.0);
16312 
16313  mi.setupFVectorVars ();
16314 
16315  // Loading F-vector
16316  fVec[mi.li_DrainPrime] += -(mi.ceqjd - mi.ceqbd - mi.ceqdrn + mi.Idtoteq)*mi.numberParallel;
16317  fVec[mi.li_GatePrime] -= -(-mi.ceqgcrg + mi.Igtoteq)*mi.numberParallel;
16318 
16319  if (mi.rgateMod == 1)
16320  {
16321  fVec[mi.li_GateExt ] -= -(mi.Igate)*mi.numberParallel;
16322  fVec[mi.li_GatePrime] += -(mi.Igate)*mi.numberParallel;
16323  }
16324  else if (mi.rgateMod == 2)
16325  {
16326  fVec[mi.li_GateExt] -= -(mi.Igate + mi.ceqgcrg)*mi.numberParallel;
16327  fVec[mi.li_GatePrime] += -(mi.Igate)*mi.numberParallel;
16328  }
16329  else if (mi.rgateMod == 3)
16330  {
16331  fVec[mi.li_GateExt] -= -(mi.Igate)*mi.numberParallel;
16332  fVec[mi.li_GateMid] -= -(mi.IgateMid - mi.Igate + mi.ceqgcrg)*mi.numberParallel;
16333  fVec[mi.li_GatePrime] += -(mi.IgateMid)*mi.numberParallel;
16334  }
16335 
16336  if (!mi.rbodyMod)
16337  {
16338  fVec[mi.li_BodyPrime] += -(mi.ceqbd + mi.ceqbs - mi.ceqjd - mi.ceqjs + mi.Ibtoteq)*mi.numberParallel;
16339  fVec[mi.li_SourcePrime] += -(mi.ceqdrn - mi.ceqbs + mi.ceqjs + mi.Istoteq)*mi.numberParallel;
16340  }
16341  else
16342  {
16343  fVec[mi.li_DrainBody] -= -(mi.ceqjd + mi.Idbb + mi.Idbbp)*mi.numberParallel;
16344  fVec[mi.li_BodyPrime] += -(mi.ceqbd + mi.ceqbs + mi.Ibtoteq +
16345  mi.Idbbp + mi.Isbbp - mi.Ibpb)*mi.numberParallel;
16346  fVec[mi.li_Body] += - (mi.Isbb + mi.Idbb + mi.Ibpb)*mi.numberParallel;
16347  fVec[mi.li_SourceBody] -= -(mi.ceqjs + mi.Isbb + mi.Isbbp)*mi.numberParallel;
16348  fVec[mi.li_SourcePrime] += -(mi.ceqdrn - mi.ceqbs + mi.ceqjs + mi.Istoteq)*mi.numberParallel;
16349  }
16350 
16351  if (mi.getModel().rdsMod)
16352  {
16353  fVec[mi.li_Drain] += -(-mi.ceqgdtot)*mi.numberParallel;
16354  fVec[mi.li_Source] += -(mi.ceqgstot)*mi.numberParallel;
16355  fVec[mi.li_DrainPrime] += -(mi.ceqgdtot)*mi.numberParallel;
16356  fVec[mi.li_SourcePrime] += -(-mi.ceqgstot)*mi.numberParallel;
16357  }
16358 
16359  // Idrain, Isource are linear terminal resistor currents
16360  if (mi.drainMOSFET_B4Exists)
16361  {
16362  fVec[mi.li_Drain] += -(-mi.Idrain)*mi.numberParallel;
16363  fVec[mi.li_DrainPrime] += -(mi.Idrain)*mi.numberParallel;
16364  }
16365 
16366  if (mi.sourceMOSFET_B4Exists)
16367  {
16368  fVec[mi.li_Source] += -(-mi.Isource)*mi.numberParallel;
16369  fVec[mi.li_SourcePrime] += -(+mi.Isource)*mi.numberParallel;
16370  }
16371 
16372  // Initial condition support:
16373  if (getSolverState().dcopFlag && mi.icVBSGiven)
16374  {
16375  coef = mi.extData.nextSolVectorRawPtr[mi.li_Ibs];
16376  fVec[mi.li_Body] += coef;
16377  fVec[mi.li_Source] += -coef;
16378  double cVs = mi.extData.nextSolVectorRawPtr[mi.li_Source];
16379  double cVb = mi.extData.nextSolVectorRawPtr[mi.li_Body];
16380  fVec[mi.li_Ibs] += (cVb-cVs-mi.icVBS);
16381  }
16382 
16383  if (getSolverState().dcopFlag && mi.icVDSGiven)
16384  {
16385  coef = mi.extData.nextSolVectorRawPtr[mi.li_Ids];
16386  fVec[mi.li_Drain] += coef;
16387  fVec[mi.li_Source] += -coef;
16388  double cVs = mi.extData.nextSolVectorRawPtr[mi.li_Source];
16389  double cVd = mi.extData.nextSolVectorRawPtr[mi.li_Drain];
16390  fVec[mi.li_Ids] += (cVd-cVs-mi.icVDS);
16391  }
16392 
16393  if (getSolverState().dcopFlag && mi.icVGSGiven)
16394  {
16395  coef = mi.extData.nextSolVectorRawPtr[mi.li_Igs];
16396  fVec[mi.li_GateExt] += coef;
16397  fVec[mi.li_Source] += -coef;
16398  double cVs = mi.extData.nextSolVectorRawPtr[mi.li_Source];
16399  double cVg = mi.extData.nextSolVectorRawPtr[mi.li_GateExt];
16400  fVec[mi.li_Igs] += (cVg-cVs-mi.icVGS);
16401  }
16402 
16403  // limiter section
16405  {
16406  dFdxdVp[mi.li_DrainPrime] += (mi.ceqjd_Jdxp - mi.ceqbd_Jdxp - mi.ceqdrn_Jdxp + mi.Idtoteq_Jdxp)*mi.numberParallel;
16407  dFdxdVp[mi.li_GatePrime] -= (- mi.ceqgcrg_Jdxp + mi.Igtoteq_Jdxp)*mi.numberParallel;
16408 
16409  if (mi.rgateMod == 1)
16410  {
16411  dFdxdVp[mi.li_GateExt ] -= (mi.Igate_Jdxp)*mi.numberParallel;
16412  dFdxdVp[mi.li_GatePrime] += (mi.Igate_Jdxp)*mi.numberParallel;
16413  }
16414  else if (mi.rgateMod == 2)
16415  {
16416  dFdxdVp[mi.li_GateExt] -= (mi.Igate_Jdxp + mi.ceqgcrg_Jdxp)*mi.numberParallel;
16417  dFdxdVp[mi.li_GatePrime] += (mi.Igate_Jdxp)*mi.numberParallel;
16418  }
16419  else if (mi.rgateMod == 3)
16420  {
16421  dFdxdVp[mi.li_GateExt] -= (mi.Igate_Jdxp)*mi.numberParallel;
16422  dFdxdVp[mi.li_GateMid] -= (mi.IgateMid_Jdxp - mi.Igate_Jdxp + mi.ceqgcrg_Jdxp)*mi.numberParallel;
16423  dFdxdVp[mi.li_GatePrime] += (mi.IgateMid_Jdxp)*mi.numberParallel;
16424  }
16425 
16426  if (!mi.rbodyMod)
16427  {
16428  dFdxdVp[mi.li_BodyPrime] += (mi.ceqbd_Jdxp + mi.ceqbs_Jdxp - mi.ceqjd_Jdxp - mi.ceqjs_Jdxp + mi.Ibtoteq_Jdxp)*mi.numberParallel;
16429  dFdxdVp[mi.li_SourcePrime] += (mi.ceqdrn_Jdxp - mi.ceqbs_Jdxp + mi.ceqjs_Jdxp + mi.Istoteq_Jdxp)*mi.numberParallel;
16430  }
16431  else
16432  {
16433  dFdxdVp[mi.li_DrainBody] -= (mi.ceqjd_Jdxp)*mi.numberParallel;
16434  dFdxdVp[mi.li_BodyPrime] += (mi.ceqbd_Jdxp + mi.ceqbs_Jdxp + mi.Ibtoteq_Jdxp)*mi.numberParallel;
16435  dFdxdVp[mi.li_SourceBody] -= (mi.ceqjs_Jdxp )*mi.numberParallel;
16436  dFdxdVp[mi.li_SourcePrime] += (mi.ceqdrn_Jdxp - mi.ceqbs_Jdxp + mi.ceqjs_Jdxp + mi.Istoteq_Jdxp)*mi.numberParallel;
16437  }
16438 
16439  if (mi.getModel().rdsMod)
16440  {
16441  dFdxdVp[mi.li_Drain] -= (mi.ceqgdtot_Jdxp)*mi.numberParallel;
16442  dFdxdVp[mi.li_Source] += (mi.ceqgstot_Jdxp)*mi.numberParallel;
16443  dFdxdVp[mi.li_DrainPrime] += (mi.ceqgdtot_Jdxp)*mi.numberParallel;
16444  dFdxdVp[mi.li_SourcePrime] -= (mi.ceqgstot_Jdxp)*mi.numberParallel;
16445  }
16446  }
16447 
16448  // Loading Q-vector
16449  mi.auxChargeCalculations ();
16450 
16451  double Qeqqg = 0.0; // gate charge
16452  double Qeqqb = 0.0; // bulk charge
16453  double Qeqqd = 0.0; // drain charge
16454  double Qeqqgmid = 0.0; //
16455  double Qeqqjs = 0.0; // source-junction charge
16456  double Qeqqjd = 0.0; // drain-junction charge
16457  double Qqdef = 0.0; // nqs-related charge.
16458  double Qqcheq = 0.0; // nqs-related charge.
16459 
16460  if (mi.getModel().dtype > 0)
16461  {
16462  Qeqqg = mi.qg;
16463  Qeqqd = mi.qd;
16464  Qeqqb = mi.qb;
16465 
16466  if (mi.trnqsMod)
16467  {
16468  Qqdef = mi.qdef;
16469  Qqcheq = mi.qcheq;
16470  }
16471 
16472  if (mi.rbodyMod)
16473  {
16474  Qeqqjs = mi.qbs;
16475  Qeqqjd = mi.qbd;
16476  }
16477 
16478  if (mi.rgateMod == 3)
16479  {
16480  Qeqqgmid = mi.qgmid;
16481  }
16482  }
16483  else
16484  {
16485  Qeqqg = -mi.qg;
16486  Qeqqd = -mi.qd;
16487  Qeqqb = -mi.qb;
16488 
16489  if (mi.trnqsMod)
16490  {
16491  Qqdef = -mi.qdef;
16492  Qqcheq = -mi.qcheq;
16493  }
16494 
16495  if (mi.rbodyMod)
16496  {
16497  Qeqqjs = -mi.qbs;
16498  Qeqqjd = -mi.qbd;
16499  }
16500 
16501  if (mi.rgateMod == 3)
16502  {
16503  Qeqqgmid = -mi.qgmid;
16504  }
16505  }
16506 
16507  // Loading q-vector:
16508 
16509  qVec[mi.li_DrainPrime] += -(-Qeqqd)*mi.numberParallel;
16510 
16511  qVec[mi.li_GatePrime] -= -(Qeqqg)*mi.numberParallel;
16512 
16513  if (mi.rgateMod == 3)
16514  {
16515  qVec[mi.li_GateMid] -= -(+Qeqqgmid)*mi.numberParallel;
16516  }
16517 
16518  if (!mi.rbodyMod)
16519  {
16520  qVec[mi.li_BodyPrime] += -(-Qeqqb)*mi.numberParallel;
16521  qVec[mi.li_SourcePrime] += -(+Qeqqg + Qeqqb + Qeqqd + Qeqqgmid)*mi.numberParallel;
16522  }
16523  else
16524  {
16525  qVec[mi.li_DrainBody] -= -(Qeqqjd)*mi.numberParallel;
16526  qVec[mi.li_BodyPrime] += -(-Qeqqb)*mi.numberParallel;
16527  qVec[mi.li_SourceBody] -= -(Qeqqjs)*mi.numberParallel;
16528  qVec[mi.li_SourcePrime] += -(Qeqqd + Qeqqg + Qeqqb + Qeqqjd + Qeqqjs + Qeqqgmid)*mi.numberParallel;
16529  }
16530 
16531  if (mi.trnqsMod)
16532  {
16533  qVec[mi.li_Charge] += -(Qqcheq - Qqdef)*mi.numberParallel;
16534  }
16535 
16536  // limiter section
16538  {
16539  dQdxdVp[mi.li_DrainPrime] += (-mi.Qeqqd_Jdxp)*mi.numberParallel;
16540  dQdxdVp[mi.li_GatePrime] -= (mi.Qeqqg_Jdxp)*mi.numberParallel;
16541 
16542  if (mi.rgateMod == 3)
16543  {
16544  dQdxdVp[mi.li_GateMid] -= (+mi.Qeqqgmid_Jdxp)*mi.numberParallel;
16545  }
16546 
16547  if (!mi.rbodyMod)
16548  {
16549  dQdxdVp[mi.li_BodyPrime] += (-mi.Qeqqb_Jdxp)*mi.numberParallel;
16550  dQdxdVp[mi.li_SourcePrime] += (+mi.Qeqqg_Jdxp + mi.Qeqqb_Jdxp + mi.Qeqqd_Jdxp + mi.Qeqqgmid_Jdxp)*mi.numberParallel;
16551  }
16552  else
16553  {
16554  dQdxdVp[mi.li_DrainBody] -= (mi.Qeqqjd_Jdxp)*mi.numberParallel;
16555  dQdxdVp[mi.li_BodyPrime] += (-mi.Qeqqb_Jdxp)*mi.numberParallel;
16556  dQdxdVp[mi.li_SourceBody] -= (+mi.Qeqqjs_Jdxp)*mi.numberParallel;
16557  dQdxdVp[mi.li_SourcePrime] += (+mi.Qeqqd_Jdxp + mi.Qeqqg_Jdxp + mi.Qeqqb_Jdxp + mi.Qeqqjd_Jdxp + mi.Qeqqjs_Jdxp + mi.Qeqqgmid_Jdxp)*mi.numberParallel;
16558  }
16559 
16560  if (mi.trnqsMod)
16561  {
16562  dQdxdVp[mi.li_Charge] += (mi.Qqcheq_Jdxp)*mi.numberParallel;
16563  }
16564  }
16565  }
16566  return true;
16567 }
16568 
16569 //-----------------------------------------------------------------------------
16570 // Function : Master::loadDAEMatrices
16571 // Purpose :
16572 // Special Notes :
16573 // Scope : public
16574 // Creator : Eric Keiter, SNL
16575 // Creation Date : 11/26/08
16576 //-----------------------------------------------------------------------------
16577 bool Master::loadDAEMatrices (N_LAS_Matrix & dFdx, N_LAS_Matrix & dQdx)
16578 {
16579  for (InstanceVector::const_iterator it = getInstanceBegin(); it != getInstanceEnd(); ++it)
16580  {
16581  Instance & mi = *(*it);
16582 
16583  // F-matrix:
16584  if (!mi.rbodyMod)
16585  {
16586  mi.gjbd = mi.gbd;
16587  mi.gjbs = mi.gbs;
16588  }
16589  else
16590  {
16591  mi.gjbd = mi.gjbs = 0.0;
16592  }
16593 
16594  if (!mi.getModel().rdsMod)
16595  {
16596  mi.gdpr = mi.drainConductance;
16597  mi.gspr = mi.sourceConductance;
16598  }
16599  else
16600  {
16601  mi.gdpr = mi.gspr = 0.0;
16602  }
16603 
16604  mi.geltd = mi.grgeltd;
16605 
16606  double T1 = mi.qdef * mi.gtau;
16607 
16608 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
16609  if (mi.rgateMod == 1)
16610  {
16611  *mi.f_GEgePtr += (mi.geltd)*mi.numberParallel;
16612  *mi.f_GEgpPtr -= (mi.geltd)*mi.numberParallel;
16613  *mi.f_GPgePtr -= (mi.geltd)*mi.numberParallel;
16614  *mi.f_GPgpPtr += (+ mi.geltd - mi.ggtg + mi.gIgtotg)*mi.numberParallel;
16615  *mi.f_GPdpPtr += (- mi.ggtd + mi.gIgtotd)*mi.numberParallel;
16616  *mi.f_GPspPtr += (- mi.ggts + mi.gIgtots)*mi.numberParallel;
16617  *mi.f_GPbpPtr += (- mi.ggtb + mi.gIgtotb)*mi.numberParallel;
16618  } // WDLiu: gcrg already subtracted from all gcrgg below
16619  else if (mi.rgateMod == 2)
16620  {
16621  *mi.f_GEgePtr += (mi.gcrg)*mi.numberParallel;
16622  *mi.f_GEgpPtr += (mi.gcrgg)*mi.numberParallel;
16623  *mi.f_GEdpPtr += (mi.gcrgd)*mi.numberParallel;
16624  *mi.f_GEspPtr += (mi.gcrgs)*mi.numberParallel;
16625  *mi.f_GEbpPtr += (mi.gcrgb)*mi.numberParallel;
16626 
16627  *mi.f_GPgePtr -= (mi.gcrg)*mi.numberParallel;
16628  *mi.f_GPgpPtr += (- mi.gcrgg - mi.ggtg + mi.gIgtotg)*mi.numberParallel;
16629  *mi.f_GPdpPtr += (- mi.gcrgd - mi.ggtd + mi.gIgtotd)*mi.numberParallel;
16630  *mi.f_GPspPtr += (- mi.gcrgs - mi.ggts + mi.gIgtots)*mi.numberParallel;
16631  *mi.f_GPbpPtr += (- mi.gcrgb - mi.ggtb + mi.gIgtotb)*mi.numberParallel;
16632  }
16633  else if (mi.rgateMod == 3)
16634  {
16635  *mi.f_GEgePtr += (mi.geltd)*mi.numberParallel;
16636  *mi.f_GEgmPtr -= (mi.geltd)*mi.numberParallel;
16637  *mi.f_GMgePtr -= (mi.geltd)*mi.numberParallel;
16638  *mi.f_GMgmPtr += (mi.geltd + mi.gcrg)*mi.numberParallel;
16639 
16640  *mi.f_GMdpPtr += (mi.gcrgd)*mi.numberParallel;
16641  *mi.f_GMgpPtr += (mi.gcrgg)*mi.numberParallel;
16642  *mi.f_GMspPtr += (mi.gcrgs)*mi.numberParallel;
16643  *mi.f_GMbpPtr += (mi.gcrgb)*mi.numberParallel;
16644 
16645  *mi.f_GPgmPtr -= (mi.gcrg)*mi.numberParallel;
16646 
16647  *mi.f_GPgpPtr += (- mi.gcrgg - mi.ggtg + mi.gIgtotg)*mi.numberParallel;
16648  *mi.f_GPdpPtr += (- mi.gcrgd - mi.ggtd + mi.gIgtotd)*mi.numberParallel;
16649  *mi.f_GPspPtr += (- mi.gcrgs - mi.ggts + mi.gIgtots)*mi.numberParallel;
16650  *mi.f_GPbpPtr += (- mi.gcrgb - mi.ggtb + mi.gIgtotb)*mi.numberParallel;
16651  }
16652  else
16653  {
16654  *mi.f_GPgpPtr += (- mi.ggtg + mi.gIgtotg)*mi.numberParallel;
16655  *mi.f_GPdpPtr += (- mi.ggtd + mi.gIgtotd)*mi.numberParallel;
16656  *mi.f_GPspPtr += (- mi.ggts + mi.gIgtots)*mi.numberParallel;
16657  *mi.f_GPbpPtr += (- mi.ggtb + mi.gIgtotb)*mi.numberParallel;
16658  }
16659 
16660  if (mi.getModel().rdsMod)
16661  {
16662  *mi.f_DgpPtr += (mi.gdtotg)*mi.numberParallel;
16663  *mi.f_DspPtr += (mi.gdtots)*mi.numberParallel;
16664  *mi.f_DbpPtr += (mi.gdtotb)*mi.numberParallel;
16665  *mi.f_SdpPtr += (mi.gstotd)*mi.numberParallel;
16666  *mi.f_SgpPtr += (mi.gstotg)*mi.numberParallel;
16667  *mi.f_SbpPtr += (mi.gstotb)*mi.numberParallel;
16668  }
16669 
16670 
16671  *mi.f_DPdpPtr += (mi.gdpr + mi.gds + mi.gbd + T1 * mi.ddxpart_dVd
16672  - mi.gdtotd + mi.RevSum + mi.gbdpdp + mi.dxpart * mi.ggtd - mi.gIdtotd)*mi.numberParallel;
16673 
16674 
16675  *mi.f_DPdPtr -= (mi.gdpr + mi.gdtot)*mi.numberParallel;
16676 
16677  *mi.f_DPgpPtr += (mi.Gm - mi.gdtotg + mi.gbdpg - mi.gIdtotg
16678  + mi.dxpart * mi.ggtg + T1 * mi.ddxpart_dVg)*mi.numberParallel;
16679 
16680 
16681  *mi.f_DPspPtr -= (mi.gds + mi.gdtots - mi.dxpart * mi.ggts + mi.gIdtots
16682  - T1 * mi.ddxpart_dVs + mi.FwdSum - mi.gbdpsp)*mi.numberParallel;
16683 
16684 
16685  *mi.f_DPbpPtr -= (mi.gjbd + mi.gdtotb - mi.Gmbs - mi.gbdpb + mi.gIdtotb
16686  - T1 * mi.ddxpart_dVb - mi.dxpart * mi.ggtb)*mi.numberParallel;
16687 
16688 
16689  *mi.f_DdpPtr -= (mi.gdpr - mi.gdtotd)*mi.numberParallel;
16690 
16691  *mi.f_DdPtr += (mi.gdpr + mi.gdtot)*mi.numberParallel;
16692 
16693 
16694  *mi.f_SPdpPtr -= (mi.gds + mi.gstotd + mi.RevSum - mi.gbspdp
16695  - T1 * mi.dsxpart_dVd - mi.sxpart * mi.ggtd + mi.gIstotd)*mi.numberParallel;
16696 
16697 
16698  *mi.f_SPgpPtr += (- mi.Gm - mi.gstotg + mi.gbspg + mi.sxpart * mi.ggtg
16699  + T1 * mi.dsxpart_dVg - mi.gIstotg)*mi.numberParallel;
16700 
16701 
16702  *mi.f_SPspPtr += (mi.gspr + mi.gds + mi.gbs + T1 * mi.dsxpart_dVs
16703  - mi.gstots + mi.FwdSum + mi.gbspsp + mi.sxpart * mi.ggts - mi.gIstots)*mi.numberParallel;
16704 
16705 
16706  *mi.f_SPsPtr -= (mi.gspr + mi.gstot)*mi.numberParallel;
16707 
16708 
16709  *mi.f_SPbpPtr -= (mi.gjbs + mi.gstotb + mi.Gmbs - mi.gbspb - mi.sxpart * mi.ggtb
16710  - T1 * mi.dsxpart_dVb + mi.gIstotb)*mi.numberParallel;
16711 
16712 
16713  *mi.f_SspPtr -= (mi.gspr - mi.gstots)*mi.numberParallel;
16714 
16715  *mi.f_SsPtr += (mi.gspr + mi.gstot)*mi.numberParallel;
16716 
16717 
16718  *mi.f_BPdpPtr += (- mi.gjbd + mi.gbbdp - mi.gIbtotd)*mi.numberParallel;
16719 
16720  *mi.f_BPgpPtr += (- mi.gbgs - mi.gIbtotg)*mi.numberParallel;
16721 
16722  *mi.f_BPspPtr += (- mi.gjbs + mi.gbbsp - mi.gIbtots)*mi.numberParallel;
16723 
16724  *mi.f_BPbpPtr += (mi.gjbd + mi.gjbs - mi.gbbs - mi.gIbtotb)*mi.numberParallel;
16725 
16726  //ggidld = (ggidld)*mi.numberParallel;
16727  //ggidlg = (ggidlg)*mi.numberParallel;
16728  //ggidlb = (ggidlb)*mi.numberParallel;
16729  //ggislg = (ggislg)*mi.numberParallel;
16730  //ggisls = (ggisls)*mi.numberParallel;
16731  //ggislb = (ggislb)*mi.numberParallel;
16732 
16733  // stamp gidl
16734 
16735  *mi.f_DPdpPtr += (mi.ggidld)*mi.numberParallel;
16736 
16737  *mi.f_DPgpPtr += (mi.ggidlg)*mi.numberParallel;
16738 
16739  *mi.f_DPspPtr -= ((mi.ggidlg + mi.ggidld + mi.ggidlb))*mi.numberParallel;
16740 
16741  *mi.f_DPbpPtr += (mi.ggidlb)*mi.numberParallel;
16742 
16743  *mi.f_BPdpPtr -= (mi.ggidld)*mi.numberParallel;
16744 
16745  *mi.f_BPgpPtr -= (mi.ggidlg)*mi.numberParallel;
16746 
16747  *mi.f_BPspPtr += ((mi.ggidlg + mi.ggidld + mi.ggidlb))*mi.numberParallel;
16748 
16749  *mi.f_BPbpPtr -= (mi.ggidlb)*mi.numberParallel;
16750  // stamp gisl
16751 
16752  *mi.f_SPdpPtr -= ((mi.ggisls + mi.ggislg + mi.ggislb))*mi.numberParallel;
16753 
16754  *mi.f_SPgpPtr += (mi.ggislg)*mi.numberParallel;
16755 
16756  *mi.f_SPspPtr += (mi.ggisls)*mi.numberParallel;
16757 
16758  *mi.f_SPbpPtr += (mi.ggislb)*mi.numberParallel;
16759 
16760  *mi.f_BPdpPtr += ((mi.ggislg + mi.ggisls + mi.ggislb))*mi.numberParallel;
16761 
16762  *mi.f_BPgpPtr -= (mi.ggislg)*mi.numberParallel;
16763 
16764  *mi.f_BPspPtr -= (mi.ggisls)*mi.numberParallel;
16765 
16766  *mi.f_BPbpPtr -= (mi.ggislb)*mi.numberParallel;
16767 
16768 
16769  if (mi.rbodyMod)
16770  {
16771  *mi.f_DPdbPtr += (- mi.gbd)*mi.numberParallel;
16772  *mi.f_SPsbPtr -= (mi.gbs)*mi.numberParallel;
16773 
16774  *mi.f_DBdpPtr += (- mi.gbd)*mi.numberParallel;
16775  *mi.f_DBdbPtr += (mi.gbd + mi.grbpd + mi.grbdb)*mi.numberParallel;
16776  *mi.f_DBbpPtr -= (mi.grbpd)*mi.numberParallel;
16777  *mi.f_DBbPtr -= (mi.grbdb)*mi.numberParallel;
16778 
16779  *mi.f_BPdbPtr -= (mi.grbpd)*mi.numberParallel;
16780  *mi.f_BPbPtr -= (mi.grbpb)*mi.numberParallel;
16781  *mi.f_BPsbPtr -= (mi.grbps)*mi.numberParallel;
16782  *mi.f_BPbpPtr += (mi.grbpd + mi.grbps + mi.grbpb)*mi.numberParallel;
16783  // WDLiu: (gcbbb - gbbs) already added to mi.BPbpPtr
16784 
16785  *mi.f_SBspPtr += (- mi.gbs)*mi.numberParallel;
16786  *mi.f_SBbpPtr -= (mi.grbps)*mi.numberParallel;
16787  *mi.f_SBbPtr -= (mi.grbsb)*mi.numberParallel;
16788  *mi.f_SBsbPtr += (mi.gbs + mi.grbps + mi.grbsb)*mi.numberParallel;
16789 
16790  *mi.f_BdbPtr -= (mi.grbdb)*mi.numberParallel;
16791  *mi.f_BbpPtr -= (mi.grbpb)*mi.numberParallel;
16792  *mi.f_BsbPtr -= (mi.grbsb)*mi.numberParallel;
16793  *mi.f_BbPtr += (mi.grbsb + mi.grbdb + mi.grbpb)*mi.numberParallel;
16794  }
16795 
16796  if (mi.trnqsMod)
16797  {
16798  *mi.f_QqPtr += (mi.gqdef + mi.gtau)*mi.numberParallel;
16799  *mi.f_QgpPtr += (mi.ggtg)*mi.numberParallel;
16800  *mi.f_QdpPtr += (mi.ggtd)*mi.numberParallel;
16801  *mi.f_QspPtr += (mi.ggts)*mi.numberParallel;
16802  *mi.f_QbpPtr += (mi.ggtb)*mi.numberParallel;
16803 
16804  *mi.f_DPqPtr += (mi.dxpart * mi.gtau)*mi.numberParallel;
16805  *mi.f_SPqPtr += (mi.sxpart * mi.gtau)*mi.numberParallel;
16806  *mi.f_GPqPtr -= (mi.gtau)*mi.numberParallel;
16807  }
16808 
16809  // Initial Conditions:
16810  if (mi.icVBSGiven)
16811  {
16812  if (getSolverState().dcopFlag)
16813  {
16814  *mi.f_BibsPtr += 1.0;
16815  *mi.f_SibsPtr += -1.0;
16816  *mi.f_IBSbPtr += 1.0;
16817  *mi.f_IBSsPtr += -1.0;
16818  }
16819  else
16820  {
16821  *mi.f_IBSibsPtr = 1.0;
16822  }
16823  }
16824 
16825  if (mi.icVDSGiven)
16826  {
16827  if (getSolverState().dcopFlag)
16828  {
16829  *mi.f_DidsPtr += 1.0;
16830  *mi.f_SidsPtr += -1.0;
16831  *mi.f_IDSdPtr += 1.0;
16832  *mi.f_IDSsPtr += -1.0;
16833  }
16834  else
16835  {
16836  *mi.f_IDSidsPtr = 1.0;
16837  }
16838  }
16839 
16840  if (mi.icVGSGiven)
16841  {
16842  if (getSolverState().dcopFlag)
16843  {
16844  *mi.f_GEigsPtr += 1.0;
16845  *mi.f_SigsPtr += -1.0;
16846  *mi.f_IGSgPtr += 1.0;
16847  *mi.f_IGSsPtr += -1.0;
16848  }
16849  else
16850  {
16851  *mi.f_IGSigsPtr = 1.0;
16852  }
16853  }
16854 
16855 #else
16856  if (mi.rgateMod == 1)
16857  {
16858  dFdx[mi.li_GateExt][mi.GEge] += (mi.geltd)*mi.numberParallel;
16859  dFdx[mi.li_GateExt][mi.GEgp] -= (mi.geltd)*mi.numberParallel;
16860  dFdx[mi.li_GatePrime][mi.GPge] -= (mi.geltd)*mi.numberParallel;
16861  dFdx[mi.li_GatePrime][mi.GPgp] += (+ mi.geltd - mi.ggtg + mi.gIgtotg)*mi.numberParallel;
16862  dFdx[mi.li_GatePrime][mi.GPdp] += (- mi.ggtd + mi.gIgtotd)*mi.numberParallel;
16863  dFdx[mi.li_GatePrime][mi.GPsp] += (- mi.ggts + mi.gIgtots)*mi.numberParallel;
16864  dFdx[mi.li_GatePrime][mi.GPbp] += (- mi.ggtb + mi.gIgtotb)*mi.numberParallel;
16865  } // WDLiu: gcrg already subtracted from all gcrgg below
16866  else if (mi.rgateMod == 2)
16867  {
16868  dFdx[mi.li_GateExt][mi.GEge] += (mi.gcrg)*mi.numberParallel;
16869  dFdx[mi.li_GateExt][mi.GEgp] += (mi.gcrgg)*mi.numberParallel;
16870  dFdx[mi.li_GateExt][mi.GEdp] += (mi.gcrgd)*mi.numberParallel;
16871  dFdx[mi.li_GateExt][mi.GEsp] += (mi.gcrgs)*mi.numberParallel;
16872  dFdx[mi.li_GateExt][mi.GEbp] += (mi.gcrgb)*mi.numberParallel;
16873 
16874  dFdx[mi.li_GatePrime][mi.GPge] -= (mi.gcrg)*mi.numberParallel;
16875  dFdx[mi.li_GatePrime][mi.GPgp] += (- mi.gcrgg - mi.ggtg + mi.gIgtotg)*mi.numberParallel;
16876  dFdx[mi.li_GatePrime][mi.GPdp] += (- mi.gcrgd - mi.ggtd + mi.gIgtotd)*mi.numberParallel;
16877  dFdx[mi.li_GatePrime][mi.GPsp] += (- mi.gcrgs - mi.ggts + mi.gIgtots)*mi.numberParallel;
16878  dFdx[mi.li_GatePrime][mi.GPbp] += (- mi.gcrgb - mi.ggtb + mi.gIgtotb)*mi.numberParallel;
16879  }
16880  else if (mi.rgateMod == 3)
16881  {
16882  dFdx[mi.li_GateExt][mi.GEge] += (mi.geltd)*mi.numberParallel;
16883  dFdx[mi.li_GateExt][mi.GEgm] -= (mi.geltd)*mi.numberParallel;
16884  dFdx[mi.li_GateMid][mi.GMge] -= (mi.geltd)*mi.numberParallel;
16885  dFdx[mi.li_GateMid][mi.GMgm] += (mi.geltd + mi.gcrg)*mi.numberParallel;
16886 
16887  dFdx[mi.li_GateMid][mi.GMdp] += (mi.gcrgd)*mi.numberParallel;
16888  dFdx[mi.li_GateMid][mi.GMgp] += (mi.gcrgg)*mi.numberParallel;
16889  dFdx[mi.li_GateMid][mi.GMsp] += (mi.gcrgs)*mi.numberParallel;
16890  dFdx[mi.li_GateMid][mi.GMbp] += (mi.gcrgb)*mi.numberParallel;
16891 
16892  dFdx[mi.li_GatePrime][mi.GPgm] -= (mi.gcrg)*mi.numberParallel;
16893 
16894  dFdx[mi.li_GatePrime][mi.GPgp] += (- mi.gcrgg - mi.ggtg + mi.gIgtotg)*mi.numberParallel;
16895  dFdx[mi.li_GatePrime][mi.GPdp] += (- mi.gcrgd - mi.ggtd + mi.gIgtotd)*mi.numberParallel;
16896  dFdx[mi.li_GatePrime][mi.GPsp] += (- mi.gcrgs - mi.ggts + mi.gIgtots)*mi.numberParallel;
16897  dFdx[mi.li_GatePrime][mi.GPbp] += (- mi.gcrgb - mi.ggtb + mi.gIgtotb)*mi.numberParallel;
16898  }
16899  else
16900  {
16901  dFdx[mi.li_GatePrime][mi.GPgp] += (- mi.ggtg + mi.gIgtotg)*mi.numberParallel;
16902  dFdx[mi.li_GatePrime][mi.GPdp] += (- mi.ggtd + mi.gIgtotd)*mi.numberParallel;
16903  dFdx[mi.li_GatePrime][mi.GPsp] += (- mi.ggts + mi.gIgtots)*mi.numberParallel;
16904  dFdx[mi.li_GatePrime][mi.GPbp] += (- mi.ggtb + mi.gIgtotb)*mi.numberParallel;
16905  }
16906 
16907  if (mi.getModel().rdsMod)
16908  {
16909  dFdx[mi.li_Drain][mi.Dgp] += (mi.gdtotg)*mi.numberParallel;
16910  dFdx[mi.li_Drain][mi.Dsp] += (mi.gdtots)*mi.numberParallel;
16911  dFdx[mi.li_Drain][mi.Dbp] += (mi.gdtotb)*mi.numberParallel;
16912  dFdx[mi.li_Source][mi.Sdp] += (mi.gstotd)*mi.numberParallel;
16913  dFdx[mi.li_Source][mi.Sgp] += (mi.gstotg)*mi.numberParallel;
16914  dFdx[mi.li_Source][mi.Sbp] += (mi.gstotb)*mi.numberParallel;
16915  }
16916 
16917 
16918  dFdx[mi.li_DrainPrime][mi.DPdp] += (mi.gdpr + mi.gds + mi.gbd + T1 * mi.ddxpart_dVd
16919  - mi.gdtotd + mi.RevSum + mi.gbdpdp + mi.dxpart * mi.ggtd - mi.gIdtotd)*mi.numberParallel;
16920 
16921 
16922  dFdx[mi.li_DrainPrime][mi.DPd] -= (mi.gdpr + mi.gdtot)*mi.numberParallel;
16923 
16924  dFdx[mi.li_DrainPrime][mi.DPgp] += (mi.Gm - mi.gdtotg + mi.gbdpg - mi.gIdtotg
16925  + mi.dxpart * mi.ggtg + T1 * mi.ddxpart_dVg)*mi.numberParallel;
16926 
16927 
16928  dFdx[mi.li_DrainPrime][mi.DPsp] -= (mi.gds + mi.gdtots - mi.dxpart * mi.ggts + mi.gIdtots
16929  - T1 * mi.ddxpart_dVs + mi.FwdSum - mi.gbdpsp)*mi.numberParallel;
16930 
16931 
16932  dFdx[mi.li_DrainPrime][mi.DPbp] -= (mi.gjbd + mi.gdtotb - mi.Gmbs - mi.gbdpb + mi.gIdtotb
16933  - T1 * mi.ddxpart_dVb - mi.dxpart * mi.ggtb)*mi.numberParallel;
16934 
16935 
16936  dFdx[mi.li_Drain][mi.Ddp] -= (mi.gdpr - mi.gdtotd)*mi.numberParallel;
16937 
16938  dFdx[mi.li_Drain][mi.Dd] += (mi.gdpr + mi.gdtot)*mi.numberParallel;
16939 
16940 
16941  dFdx[mi.li_SourcePrime][mi.SPdp] -= (mi.gds + mi.gstotd + mi.RevSum - mi.gbspdp
16942  - T1 * mi.dsxpart_dVd - mi.sxpart * mi.ggtd + mi.gIstotd)*mi.numberParallel;
16943 
16944 
16945  dFdx[mi.li_SourcePrime][mi.SPgp] += (- mi.Gm - mi.gstotg + mi.gbspg + mi.sxpart * mi.ggtg
16946  + T1 * mi.dsxpart_dVg - mi.gIstotg)*mi.numberParallel;
16947 
16948 
16949  dFdx[mi.li_SourcePrime][mi.SPsp] += (mi.gspr + mi.gds + mi.gbs + T1 * mi.dsxpart_dVs
16950  - mi.gstots + mi.FwdSum + mi.gbspsp + mi.sxpart * mi.ggts - mi.gIstots)*mi.numberParallel;
16951 
16952 
16953  dFdx[mi.li_SourcePrime][mi.SPs] -= (mi.gspr + mi.gstot)*mi.numberParallel;
16954 
16955 
16956  dFdx[mi.li_SourcePrime][mi.SPbp] -= (mi.gjbs + mi.gstotb + mi.Gmbs - mi.gbspb - mi.sxpart * mi.ggtb
16957  - T1 * mi.dsxpart_dVb + mi.gIstotb)*mi.numberParallel;
16958 
16959 
16960  dFdx[mi.li_Source][mi.Ssp] -= (mi.gspr - mi.gstots)*mi.numberParallel;
16961 
16962  dFdx[mi.li_Source][mi.Ss] += (mi.gspr + mi.gstot)*mi.numberParallel;
16963 
16964 
16965  dFdx[mi.li_BodyPrime][mi.BPdp] += (- mi.gjbd + mi.gbbdp - mi.gIbtotd)*mi.numberParallel;
16966 
16967  dFdx[mi.li_BodyPrime][mi.BPgp] += (- mi.gbgs - mi.gIbtotg)*mi.numberParallel;
16968 
16969  dFdx[mi.li_BodyPrime][mi.BPsp] += (- mi.gjbs + mi.gbbsp - mi.gIbtots)*mi.numberParallel;
16970 
16971  dFdx[mi.li_BodyPrime][mi.BPbp] += (mi.gjbd + mi.gjbs - mi.gbbs - mi.gIbtotb)*mi.numberParallel;
16972 
16973  //ggidld = (ggidld)*mi.numberParallel;
16974  //ggidlg = (ggidlg)*mi.numberParallel;
16975  //ggidlb = (ggidlb)*mi.numberParallel;
16976  //ggislg = (ggislg)*mi.numberParallel;
16977  //ggisls = (ggisls)*mi.numberParallel;
16978  //ggislb = (ggislb)*mi.numberParallel;
16979 
16980  // stamp gidl
16981 
16982  dFdx[mi.li_DrainPrime][mi.DPdp] += (mi.ggidld)*mi.numberParallel;
16983 
16984  dFdx[mi.li_DrainPrime][mi.DPgp] += (mi.ggidlg)*mi.numberParallel;
16985 
16986  dFdx[mi.li_DrainPrime][mi.DPsp] -= ((mi.ggidlg + mi.ggidld + mi.ggidlb))*mi.numberParallel;
16987 
16988  dFdx[mi.li_DrainPrime][mi.DPbp] += (mi.ggidlb)*mi.numberParallel;
16989 
16990  dFdx[mi.li_BodyPrime][mi.BPdp] -= (mi.ggidld)*mi.numberParallel;
16991 
16992  dFdx[mi.li_BodyPrime][mi.BPgp] -= (mi.ggidlg)*mi.numberParallel;
16993 
16994  dFdx[mi.li_BodyPrime][mi.BPsp] += ((mi.ggidlg + mi.ggidld + mi.ggidlb))*mi.numberParallel;
16995 
16996  dFdx[mi.li_BodyPrime][mi.BPbp] -= (mi.ggidlb)*mi.numberParallel;
16997  // stamp gisl
16998 
16999  dFdx[mi.li_SourcePrime][mi.SPdp] -= ((mi.ggisls + mi.ggislg + mi.ggislb))*mi.numberParallel;
17000 
17001  dFdx[mi.li_SourcePrime][mi.SPgp] += (mi.ggislg)*mi.numberParallel;
17002 
17003  dFdx[mi.li_SourcePrime][mi.SPsp] += (mi.ggisls)*mi.numberParallel;
17004 
17005  dFdx[mi.li_SourcePrime][mi.SPbp] += (mi.ggislb)*mi.numberParallel;
17006 
17007  dFdx[mi.li_BodyPrime][mi.BPdp] += ((mi.ggislg + mi.ggisls + mi.ggislb))*mi.numberParallel;
17008 
17009  dFdx[mi.li_BodyPrime][mi.BPgp] -= (mi.ggislg)*mi.numberParallel;
17010 
17011  dFdx[mi.li_BodyPrime][mi.BPsp] -= (mi.ggisls)*mi.numberParallel;
17012 
17013  dFdx[mi.li_BodyPrime][mi.BPbp] -= (mi.ggislb)*mi.numberParallel;
17014 
17015 
17016  if (mi.rbodyMod)
17017  {
17018  dFdx[mi.li_DrainPrime][mi.DPdb] += (- mi.gbd)*mi.numberParallel;
17019  dFdx[mi.li_SourcePrime][mi.SPsb] -= (mi.gbs)*mi.numberParallel;
17020 
17021  dFdx[mi.li_DrainBody][mi.DBdp] += (- mi.gbd)*mi.numberParallel;
17022  dFdx[mi.li_DrainBody][mi.DBdb] += (mi.gbd + mi.grbpd + mi.grbdb)*mi.numberParallel;
17023  dFdx[mi.li_DrainBody][mi.DBbp] -= (mi.grbpd)*mi.numberParallel;
17024  dFdx[mi.li_DrainBody][mi.DBb] -= (mi.grbdb)*mi.numberParallel;
17025 
17026  dFdx[mi.li_BodyPrime][mi.BPdb] -= (mi.grbpd)*mi.numberParallel;
17027  dFdx[mi.li_BodyPrime][mi.BPb] -= (mi.grbpb)*mi.numberParallel;
17028  dFdx[mi.li_BodyPrime][mi.BPsb] -= (mi.grbps)*mi.numberParallel;
17029  dFdx[mi.li_BodyPrime][mi.BPbp] += (mi.grbpd + mi.grbps + mi.grbpb)*mi.numberParallel;
17030  // WDLiu: (gcbbb - gbbs) already added to mi.BPbpPtr
17031 
17032  dFdx[mi.li_SourceBody][mi.SBsp] += (- mi.gbs)*mi.numberParallel;
17033  dFdx[mi.li_SourceBody][mi.SBbp] -= (mi.grbps)*mi.numberParallel;
17034  dFdx[mi.li_SourceBody][mi.SBb] -= (mi.grbsb)*mi.numberParallel;
17035  dFdx[mi.li_SourceBody][mi.SBsb] += (mi.gbs + mi.grbps + mi.grbsb)*mi.numberParallel;
17036 
17037  dFdx[mi.li_Body][mi.Bdb] -= (mi.grbdb)*mi.numberParallel;
17038  dFdx[mi.li_Body][mi.Bbp] -= (mi.grbpb)*mi.numberParallel;
17039  dFdx[mi.li_Body][mi.Bsb] -= (mi.grbsb)*mi.numberParallel;
17040  dFdx[mi.li_Body][mi.Bb] += (mi.grbsb + mi.grbdb + mi.grbpb)*mi.numberParallel;
17041  }
17042 
17043  if (mi.trnqsMod)
17044  {
17045  dFdx[mi.li_Charge][mi.Qq] += (mi.gqdef + mi.gtau)*mi.numberParallel;
17046  dFdx[mi.li_Charge][mi.Qgp] += (mi.ggtg)*mi.numberParallel;
17047  dFdx[mi.li_Charge][mi.Qdp] += (mi.ggtd)*mi.numberParallel;
17048  dFdx[mi.li_Charge][mi.Qsp] += (mi.ggts)*mi.numberParallel;
17049  dFdx[mi.li_Charge][mi.Qbp] += (mi.ggtb)*mi.numberParallel;
17050 
17051  dFdx[mi.li_DrainPrime][mi.DPq] += (mi.dxpart * mi.gtau)*mi.numberParallel;
17052  dFdx[mi.li_SourcePrime][mi.SPq] += (mi.sxpart * mi.gtau)*mi.numberParallel;
17053  dFdx[mi.li_GatePrime][mi.GPq] -= (mi.gtau)*mi.numberParallel;
17054  }
17055 
17056  // Initial Conditions:
17057  if (mi.icVBSGiven)
17058  {
17059  if (getSolverState().dcopFlag)
17060  {
17061  dFdx[mi.li_Body][mi.Bibs] += 1.0;
17062  dFdx[mi.li_Source][mi.Sibs] += -1.0;
17063  dFdx[mi.li_Ibs][mi.IBSb] += 1.0;
17064  dFdx[mi.li_Ibs][mi.IBSs] += -1.0;
17065  }
17066  else
17067  {
17068  dFdx[mi.li_Ibs][mi.IBSibs] = 1.0;
17069  }
17070  }
17071 
17072  if (mi.icVDSGiven)
17073  {
17074  if (getSolverState().dcopFlag)
17075  {
17076  dFdx[mi.li_Drain][mi.Dids] += 1.0;
17077  dFdx[mi.li_Source][mi.Sids] += -1.0;
17078  dFdx[mi.li_Ids][mi.IDSd] += 1.0;
17079  dFdx[mi.li_Ids][mi.IDSs] += -1.0;
17080  }
17081  else
17082  {
17083  dFdx[mi.li_Ids][mi.IDSids] = 1.0;
17084  }
17085  }
17086 
17087  if (mi.icVGSGiven)
17088  {
17089  if (getSolverState().dcopFlag)
17090  {
17091  dFdx[mi.li_GateExt][mi.GEigs] += 1.0;
17092  dFdx[mi.li_Source][mi.Sigs] += -1.0;
17093  dFdx[mi.li_Igs][mi.IGSg] += 1.0;
17094  dFdx[mi.li_Igs][mi.IGSs] += -1.0;
17095  }
17096  else
17097  {
17098  dFdx[mi.li_Igs][mi.IGSigs] = 1.0;
17099  }
17100  }
17101 
17102 #endif
17103  // Q-matrix:
17105  {
17106  // do nothing, as for this special case q is always zero.
17107  }
17108  else
17109  {
17110  // These are only used for the nqsMod variation
17111  // which isn't currently implemented
17112 
17113 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
17114 
17115  if (mi.rgateMod == 1)
17116  {
17117  *mi.q_GPgpPtr += (mi.CAPcggb)*mi.numberParallel;
17118  *mi.q_GPdpPtr += (mi.CAPcgdb)*mi.numberParallel;
17119  *mi.q_GPspPtr += (mi.CAPcgsb)*mi.numberParallel;
17120  *mi.q_GPbpPtr += (mi.CAPcgbb)*mi.numberParallel;
17121  } // WDLiu: CAPcrg already subtracted from all CAPcrgg below
17122  else if (mi.rgateMod == 2)
17123  {
17124  *mi.q_GPgpPtr += (mi.CAPcggb)*mi.numberParallel;
17125  *mi.q_GPdpPtr += (mi.CAPcgdb)*mi.numberParallel;
17126  *mi.q_GPspPtr += (mi.CAPcgsb)*mi.numberParallel;
17127  *mi.q_GPbpPtr += (mi.CAPcgbb)*mi.numberParallel;
17128  }
17129  else if (mi.rgateMod == 3)
17130  {
17131  *mi.q_GMgmPtr += (+ mi.CAPcgmgmb)*mi.numberParallel;
17132 
17133  *mi.q_GMdpPtr += (mi.CAPcgmdb)*mi.numberParallel;
17134  *mi.q_GMspPtr += (mi.CAPcgmsb)*mi.numberParallel;
17135  *mi.q_GMbpPtr += (mi.CAPcgmbb)*mi.numberParallel;
17136 
17137  *mi.q_DPgmPtr += (mi.CAPcdgmb)*mi.numberParallel;
17138  *mi.q_SPgmPtr += (mi.CAPcsgmb)*mi.numberParallel;
17139  *mi.q_BPgmPtr += (mi.CAPcbgmb)*mi.numberParallel;
17140 
17141  *mi.q_GPgpPtr += (mi.CAPcggb)*mi.numberParallel;
17142  *mi.q_GPdpPtr += (mi.CAPcgdb)*mi.numberParallel;
17143  *mi.q_GPspPtr += (mi.CAPcgsb)*mi.numberParallel;
17144  *mi.q_GPbpPtr += (mi.CAPcgbb)*mi.numberParallel;
17145  }
17146  else
17147  {
17148  *mi.q_GPgpPtr += (mi.CAPcggb)*mi.numberParallel;
17149  *mi.q_GPdpPtr += (mi.CAPcgdb)*mi.numberParallel;
17150  *mi.q_GPspPtr += (mi.CAPcgsb)*mi.numberParallel;
17151  *mi.q_GPbpPtr += (mi.CAPcgbb)*mi.numberParallel;
17152  }
17153 
17154  *mi.q_DPdpPtr += (mi.CAPcddb)*mi.numberParallel;
17155  *mi.q_DPgpPtr += (+ mi.CAPcdgb)*mi.numberParallel;
17156  *mi.q_DPspPtr -= (- mi.CAPcdsb)*mi.numberParallel;
17157  *mi.q_DPbpPtr -= (- mi.CAPcdbb)*mi.numberParallel;
17158 
17159  *mi.q_SPdpPtr -= (- mi.CAPcsdb)*mi.numberParallel;
17160  *mi.q_SPgpPtr += (mi.CAPcsgb)*mi.numberParallel;
17161  *mi.q_SPspPtr += (mi.CAPcssb)*mi.numberParallel;
17162  *mi.q_SPbpPtr -= (- mi.CAPcsbb)*mi.numberParallel;
17163 
17164  *mi.q_BPdpPtr += (mi.CAPcbdb)*mi.numberParallel;
17165  *mi.q_BPgpPtr += (mi.CAPcbgb)*mi.numberParallel;
17166  *mi.q_BPspPtr += (mi.CAPcbsb)*mi.numberParallel;
17167  *mi.q_BPbpPtr += (mi.CAPcbbb)*mi.numberParallel;
17168 
17169  if (mi.rbodyMod)
17170  {
17171  *mi.q_DPdbPtr += (mi.CAPcdbdb)*mi.numberParallel;
17172  *mi.q_SPsbPtr -= (- mi.CAPcsbsb)*mi.numberParallel;
17173 
17174  *mi.q_DBdpPtr += (mi.CAPcdbdb)*mi.numberParallel;
17175  *mi.q_DBdbPtr += (- mi.CAPcdbdb)*mi.numberParallel;
17176 
17177  *mi.q_SBspPtr += (mi.CAPcsbsb)*mi.numberParallel;
17178  *mi.q_SBsbPtr += (- mi.CAPcsbsb)*mi.numberParallel;
17179  }
17180 
17181  if (mi.trnqsMod)
17182  {
17183  *mi.q_QgpPtr += (- mi.CAPcqgb)*mi.numberParallel;
17184  *mi.q_QdpPtr += (- mi.CAPcqdb)*mi.numberParallel;
17185  *mi.q_QspPtr += (- mi.CAPcqsb)*mi.numberParallel;
17186  *mi.q_QbpPtr += (- mi.CAPcqbb)*mi.numberParallel;
17187  }
17188 
17189 #else
17190  if (mi.rgateMod == 1)
17191  {
17192  dQdx[mi.li_GatePrime][mi.GPgp] += (mi.CAPcggb)*mi.numberParallel;
17193  dQdx[mi.li_GatePrime][mi.GPdp] += (mi.CAPcgdb)*mi.numberParallel;
17194  dQdx[mi.li_GatePrime][mi.GPsp] += (mi.CAPcgsb)*mi.numberParallel;
17195  dQdx[mi.li_GatePrime][mi.GPbp] += (mi.CAPcgbb)*mi.numberParallel;
17196  } // WDLiu: CAPcrg already subtracted from all CAPcrgg below
17197  else if (mi.rgateMod == 2)
17198  {
17199  dQdx[mi.li_GatePrime][mi.GPgp] += (mi.CAPcggb)*mi.numberParallel;
17200  dQdx[mi.li_GatePrime][mi.GPdp] += (mi.CAPcgdb)*mi.numberParallel;
17201  dQdx[mi.li_GatePrime][mi.GPsp] += (mi.CAPcgsb)*mi.numberParallel;
17202  dQdx[mi.li_GatePrime][mi.GPbp] += (mi.CAPcgbb)*mi.numberParallel;
17203  }
17204  else if (mi.rgateMod == 3)
17205  {
17206  dQdx[mi.li_GateMid][mi.GMgm] += (+ mi.CAPcgmgmb)*mi.numberParallel;
17207 
17208  dQdx[mi.li_GateMid][mi.GMdp] += (mi.CAPcgmdb)*mi.numberParallel;
17209  dQdx[mi.li_GateMid][mi.GMsp] += (mi.CAPcgmsb)*mi.numberParallel;
17210  dQdx[mi.li_GateMid][mi.GMbp] += (mi.CAPcgmbb)*mi.numberParallel;
17211 
17212  dQdx[mi.li_DrainPrime][mi.DPgm] += (mi.CAPcdgmb)*mi.numberParallel;
17213  dQdx[mi.li_SourcePrime][mi.SPgm] += (mi.CAPcsgmb)*mi.numberParallel;
17214  dQdx[mi.li_BodyPrime][mi.BPgm] += (mi.CAPcbgmb)*mi.numberParallel;
17215 
17216  dQdx[mi.li_GatePrime][mi.GPgp] += (mi.CAPcggb)*mi.numberParallel;
17217  dQdx[mi.li_GatePrime][mi.GPdp] += (mi.CAPcgdb)*mi.numberParallel;
17218  dQdx[mi.li_GatePrime][mi.GPsp] += (mi.CAPcgsb)*mi.numberParallel;
17219  dQdx[mi.li_GatePrime][mi.GPbp] += (mi.CAPcgbb)*mi.numberParallel;
17220  }
17221  else
17222  {
17223  dQdx[mi.li_GatePrime][mi.GPgp] += (mi.CAPcggb)*mi.numberParallel;
17224  dQdx[mi.li_GatePrime][mi.GPdp] += (mi.CAPcgdb)*mi.numberParallel;
17225  dQdx[mi.li_GatePrime][mi.GPsp] += (mi.CAPcgsb)*mi.numberParallel;
17226  dQdx[mi.li_GatePrime][mi.GPbp] += (mi.CAPcgbb)*mi.numberParallel;
17227  }
17228 
17229  dQdx[mi.li_DrainPrime][mi.DPdp] += (mi.CAPcddb)*mi.numberParallel;
17230  dQdx[mi.li_DrainPrime][mi.DPgp] += (+ mi.CAPcdgb)*mi.numberParallel;
17231  dQdx[mi.li_DrainPrime][mi.DPsp] -= (- mi.CAPcdsb)*mi.numberParallel;
17232  dQdx[mi.li_DrainPrime][mi.DPbp] -= (- mi.CAPcdbb)*mi.numberParallel;
17233 
17234  dQdx[mi.li_SourcePrime][mi.SPdp] -= (- mi.CAPcsdb)*mi.numberParallel;
17235  dQdx[mi.li_SourcePrime][mi.SPgp] += (mi.CAPcsgb)*mi.numberParallel;
17236  dQdx[mi.li_SourcePrime][mi.SPsp] += (mi.CAPcssb)*mi.numberParallel;
17237  dQdx[mi.li_SourcePrime][mi.SPbp] -= (- mi.CAPcsbb)*mi.numberParallel;
17238 
17239  dQdx[mi.li_BodyPrime][mi.BPdp] += (mi.CAPcbdb)*mi.numberParallel;
17240  dQdx[mi.li_BodyPrime][mi.BPgp] += (mi.CAPcbgb)*mi.numberParallel;
17241  dQdx[mi.li_BodyPrime][mi.BPsp] += (mi.CAPcbsb)*mi.numberParallel;
17242  dQdx[mi.li_BodyPrime][mi.BPbp] += (mi.CAPcbbb)*mi.numberParallel;
17243 
17244  if (mi.rbodyMod)
17245  {
17246  dQdx[mi.li_DrainPrime][mi.DPdb] += (mi.CAPcdbdb)*mi.numberParallel;
17247  dQdx[mi.li_SourcePrime][mi.SPsb] -= (- mi.CAPcsbsb)*mi.numberParallel;
17248 
17249  dQdx[mi.li_DrainBody][mi.DBdp] += (mi.CAPcdbdb)*mi.numberParallel;
17250  dQdx[mi.li_DrainBody][mi.DBdb] += (- mi.CAPcdbdb)*mi.numberParallel;
17251 
17252  dQdx[mi.li_SourceBody][mi.SBsp] += (mi.CAPcsbsb)*mi.numberParallel;
17253  dQdx[mi.li_SourceBody][mi.SBsb] += (- mi.CAPcsbsb)*mi.numberParallel;
17254  }
17255 
17256  if (mi.trnqsMod)
17257  {
17258  dQdx[mi.li_Charge][mi.Qgp] += (- mi.CAPcqgb)*mi.numberParallel;
17259  dQdx[mi.li_Charge][mi.Qdp] += (- mi.CAPcqdb)*mi.numberParallel;
17260  dQdx[mi.li_Charge][mi.Qsp] += (- mi.CAPcqsb)*mi.numberParallel;
17261  dQdx[mi.li_Charge][mi.Qbp] += (- mi.CAPcqbb)*mi.numberParallel;
17262  }
17263 
17264 #endif
17265  }
17266  }
17267  return true;
17268 }
17269 
17270 Device *Traits::factory(const Configuration &configuration, const FactoryBlock &factory_block)
17271 {
17272 
17273  return new Master(configuration, factory_block, factory_block.solverState_, factory_block.deviceOptions_);
17274 }
17275 
17277 {
17279  .registerDevice("m", 14)
17280  .registerDevice("m", 54)
17281  .registerModelType("pmos", 14)
17282  .registerModelType("nmos", 14)
17283  .registerModelType("pmos", 54)
17284  .registerModelType("nmos", 54);
17285 }
17286 
17287 } // namespace MOSFET_B4
17288 } // namespace Device
17289 } // namespace Xyce