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.100.2.3 $
43 //
44 //
45 // Current Owner : $Author: tvrusso $
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  {
5143  // set up the internal names map
5144  std::string tmpstr;
5146  {
5147  tmpstr = getName()+"_drainprime";
5148  spiceInternalName (tmpstr);
5149  intNameMap[ li_DrainPrime ] = tmpstr;
5150  }
5151 
5153  {
5154  tmpstr = getName()+"_sourceprime";
5155  spiceInternalName (tmpstr);
5156  intNameMap[ li_SourcePrime ] = tmpstr;
5157  }
5158 
5159  if (rgateMod>0)
5160  {
5161  tmpstr = getName()+"_GatePrime";
5162  spiceInternalName (tmpstr);
5163  intNameMap[ li_GatePrime] = tmpstr;
5164  }
5165 
5166  if (rgateMod==3)
5167  {
5168  tmpstr = getName()+"_MidGate";
5169  spiceInternalName (tmpstr);
5170  intNameMap[ li_GateMid] = tmpstr;
5171  }
5172 
5173  if (rbodyMod)
5174  {
5175  tmpstr = getName()+"_body";
5176  spiceInternalName (tmpstr);
5177  intNameMap[ li_Body] = tmpstr;
5178 
5179  tmpstr = getName()+"_SourceBody";
5180  spiceInternalName (tmpstr);
5181  intNameMap[ li_SourceBody ] = tmpstr;
5182 
5183  tmpstr = getName()+"_DrainBody";
5184  spiceInternalName (tmpstr);
5185  intNameMap[ li_DrainPrime ] = tmpstr;
5186  }
5187 
5188  if (trnqsMod)
5189  {
5190  tmpstr = getName()+"_charge";
5191  spiceInternalName (tmpstr);
5192  intNameMap[li_Charge] = tmpstr;
5193  }
5194 
5195  if (icVDSGiven)
5196  {
5197  tmpstr = getName()+"_branch_DS";
5198  spiceInternalName (tmpstr);
5199  intNameMap[li_Ids] = tmpstr;
5200  }
5201  if (icVGSGiven)
5202  {
5203  tmpstr = getName()+"_branch_GS";
5204  spiceInternalName (tmpstr);
5205  intNameMap[li_Igs] = tmpstr;
5206  }
5207  if (icVBSGiven)
5208  {
5209  tmpstr = getName()+"_branch_BS";
5210  spiceInternalName (tmpstr);
5211  intNameMap[li_Ibs] = tmpstr;
5212  }
5213  }
5214 
5215  return intNameMap;
5216 }
5217 
5218 //-----------------------------------------------------------------------------
5219 // Function : Instance::registerStateLIDs
5220 // Purpose :
5221 // Special Notes :
5222 // Scope : public
5223 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
5224 // Creation Date : 11/25/06
5225 //-----------------------------------------------------------------------------
5226 void Instance::registerStateLIDs( const std::vector<int> & staLIDVecRef )
5227 {
5228  AssertLIDs(staLIDVecRef.size() == numStateVars);
5229 
5230  if (DEBUG_DEVICE && getDeviceOptions().debugLevel > 0)
5231  {
5232  Xyce::dout() << std::endl
5233  << section_divider << std::endl
5234  << " In Instance::registerStateLIDs" << std::endl
5235  << " name = " << getName() << std::endl
5236  << " Number of State LIDs: " << staLIDVecRef.size() << std::endl;
5237  }
5238 
5239  // Copy over the global ID lists:
5240  staLIDVec = staLIDVecRef;
5241 
5242  int lid=0;
5243  // Intrinsic capacitors:
5244  li_state_qb = staLIDVec[lid++];
5245  li_state_qg = staLIDVec[lid++];
5246  li_state_qd = staLIDVec[lid++];
5247 
5248  if (rgateMod == 3)
5249  {
5250  li_state_qgmid = staLIDVec[lid++];
5251  }
5252 
5253  // Parasitic capacitors:
5254  if (rbodyMod)
5255  {
5256  li_state_qbs = staLIDVec[lid++];
5257  li_state_qbd = staLIDVec[lid++];
5258  }
5259 
5260  if( trnqsMod )
5261  {
5262  li_state_qcheq = staLIDVec[lid++];
5263  li_state_qcdump = staLIDVec[lid++];
5264  }
5265 
5266 #ifdef Xyce_DEBUG_DEVICE
5267  if (getDeviceOptions().debugLevel > 0)
5268  {
5269  Xyce::dout() << " Local State indices:" << std::endl;
5270  Xyce::dout() << std::endl;
5271  Xyce::dout() << " li_state_qb = " << li_state_qb << std::endl;
5272  Xyce::dout() << " li_state_qg = " << li_state_qg << std::endl;
5273  Xyce::dout() << " li_state_qd = " << li_state_qd << std::endl;
5274  Xyce::dout() << " li_state_qbs = " << li_state_qbs << std::endl;
5275  Xyce::dout() << " li_state_qbd = " << li_state_qbd << std::endl;
5276  Xyce::dout() << " li_state_qcheq = " << li_state_qcheq << std::endl;
5277  Xyce::dout() << " li_state_qcdump = " << li_state_qcdump << std::endl;
5278  Xyce::dout() << std::endl;
5279  Xyce::dout() << section_divider << std::endl;
5280  }
5281 #endif
5282 
5283 }
5284 
5285 //-----------------------------------------------------------------------------
5286 // Function : Instance::registerStoreLIDs
5287 // Purpose :
5288 // Special Notes :
5289 // Scope : public
5290 // Creator : Eric Keiter, SNL
5291 // Creation Date : 12/9/11
5292 //-----------------------------------------------------------------------------
5293 void Instance::registerStoreLIDs( const std::vector<int> & stoLIDVecRef )
5294 {
5295  AssertLIDs(stoLIDVecRef.size() == getNumStoreVars());
5296 
5297  // Copy over the global ID lists:
5298  stoLIDVec = stoLIDVecRef;
5299 
5300  int lid=0;
5301  // Voltage drops:
5302  li_store_vbd = stoLIDVec[lid++];
5303  li_store_vbs = stoLIDVec[lid++];
5304  li_store_vgs = stoLIDVec[lid++];
5305  li_store_vds = stoLIDVec[lid++];
5306  li_store_vges = stoLIDVec[lid++];
5307  li_store_vgms = stoLIDVec[lid++];
5308  li_store_vdes = stoLIDVec[lid++];
5309  li_store_vses = stoLIDVec[lid++];
5310  li_store_vdbs = stoLIDVec[lid++];
5311  li_store_vsbs = stoLIDVec[lid++];
5312  li_store_vdbd = stoLIDVec[lid++];
5313  li_store_vged = stoLIDVec[lid++];
5314  li_store_vgmd = stoLIDVec[lid++];
5315  li_store_von = stoLIDVec[lid++];
5316 }
5317 
5318 //-----------------------------------------------------------------------------
5319 // Function : Instance::jacobianStamp
5320 // Purpose :
5321 // Special Notes :
5322 // Scope : public
5323 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
5324 // Creation Date : 11/25/06
5325 //-----------------------------------------------------------------------------
5326 const std::vector< std::vector<int> > & Instance::jacobianStamp() const
5327 {
5328  return jacStamp;
5329 }
5330 
5331 //-----------------------------------------------------------------------------
5332 // Function : Instance::registerJacLIDs
5333 // Purpose :
5334 // Special Notes :
5335 // Scope : public
5336 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
5337 // Creation Date : 11/25/06
5338 //-----------------------------------------------------------------------------
5339 void Instance::registerJacLIDs( const std::vector< std::vector<int> > & jacLIDVec )
5340 {
5341  DeviceInstance::registerJacLIDs( jacLIDVec );
5342  std::vector<int> & map = jacMap;
5343  std::vector< std::vector<int> > & map2 = jacMap2;;
5344 
5345  Dd = jacLIDVec[map[0]][map2[0][0]];
5346  Ddp = jacLIDVec[map[0]][map2[0][1]];
5347  Dsp = jacLIDVec[map[0]][map2[0][2]];
5348  Dgp = jacLIDVec[map[0]][map2[0][3]];
5349  Dbp = jacLIDVec[map[0]][map2[0][4]];
5350  if (icVDSGiven)
5351  {
5352  Dids = jacLIDVec[map[0]][map2[0][5]];
5353  }
5354 
5355  GEge = jacLIDVec[map[1]][map2[1][0]];
5356  GEdp = jacLIDVec[map[1]][map2[1][1]];
5357  GEsp = jacLIDVec[map[1]][map2[1][2]];
5358  GEgp = jacLIDVec[map[1]][map2[1][3]];
5359  GEgm = jacLIDVec[map[1]][map2[1][4]];
5360  GEbp = jacLIDVec[map[1]][map2[1][5]];
5361  if (icVGSGiven)
5362  {
5363  GEigs = jacLIDVec[map[1]][map2[1][6]];
5364  }
5365 
5366  Ss = jacLIDVec[map[2]][map2[2][0]];
5367  Sdp = jacLIDVec[map[2]][map2[2][1]];
5368  Ssp = jacLIDVec[map[2]][map2[2][2]];
5369  Sgp = jacLIDVec[map[2]][map2[2][3]];
5370  Sbp = jacLIDVec[map[2]][map2[2][4]];
5371  int currentCol=5;
5372  // these must be assigned in the same order that they were set up
5373  // in the jacstamp set-up in the constructor
5374  if (icVBSGiven)
5375  {
5376  Sibs = jacLIDVec[map[2]][map2[2][currentCol++]];
5377  }
5378  if (icVDSGiven)
5379  {
5380  Sids = jacLIDVec[map[2]][map2[2][currentCol++]];
5381  }
5382  if (icVGSGiven)
5383  {
5384  Sigs = jacLIDVec[map[2]][map2[2][currentCol++]];
5385  }
5386 
5387  Bb = jacLIDVec[map[3]][map2[3][0]];
5388  Bbp = jacLIDVec[map[3]][map2[3][1]];
5389  Bsb = jacLIDVec[map[3]][map2[3][2]];
5390  Bdb = jacLIDVec[map[3]][map2[3][3]];
5391  if (icVBSGiven)
5392  {
5393  Bibs = jacLIDVec[map[3]][map2[3][4]];
5394  }
5395 
5396  DPd = jacLIDVec[map[4]][map2[4][0]];
5397  DPdp = jacLIDVec[map[4]][map2[4][1]];
5398  DPsp = jacLIDVec[map[4]][map2[4][2]];
5399  DPgp = jacLIDVec[map[4]][map2[4][3]];
5400  DPgm = jacLIDVec[map[4]][map2[4][4]];
5401  DPbp = jacLIDVec[map[4]][map2[4][5]];
5402  DPdb = jacLIDVec[map[4]][map2[4][6]];
5403  if( trnqsMod )
5404  {
5405  DPq = jacLIDVec[map[4]][map2[4][7]];
5406  }
5407 
5408  SPs = jacLIDVec[map[5]][map2[5][0]];
5409  SPdp = jacLIDVec[map[5]][map2[5][1]];
5410  SPsp = jacLIDVec[map[5]][map2[5][2]];
5411  SPgp = jacLIDVec[map[5]][map2[5][3]];
5412  SPgm = jacLIDVec[map[5]][map2[5][4]];
5413  SPbp = jacLIDVec[map[5]][map2[5][5]];
5414  SPsb = jacLIDVec[map[5]][map2[5][6]];
5415 
5416  if( trnqsMod )
5417  {
5418  SPq = jacLIDVec[map[5]][map2[5][7]];
5419  }
5420 
5421  GPge = jacLIDVec[map[6]][map2[6][0]];
5422  GPdp = jacLIDVec[map[6]][map2[6][1]];
5423  GPsp = jacLIDVec[map[6]][map2[6][2]];
5424  GPgp = jacLIDVec[map[6]][map2[6][3]];
5425  GPgm = jacLIDVec[map[6]][map2[6][4]];
5426  GPbp = jacLIDVec[map[6]][map2[6][5]];
5427 
5428  if( trnqsMod )
5429  {
5430  GPq = jacLIDVec[map[6]][map2[1][6]];
5431  }
5432 
5433  GMge = jacLIDVec[map[7]][map2[7][0]];
5434  GMdp = jacLIDVec[map[7]][map2[7][1]];
5435  GMsp = jacLIDVec[map[7]][map2[7][2]];
5436  GMgp = jacLIDVec[map[7]][map2[7][3]];
5437  GMgm = jacLIDVec[map[7]][map2[7][4]];
5438  GMbp = jacLIDVec[map[7]][map2[7][5]];
5439 
5440  BPb = jacLIDVec[map[8]][map2[8][0]];
5441  BPdp = jacLIDVec[map[8]][map2[8][1]];
5442  BPsp = jacLIDVec[map[8]][map2[8][2]];
5443  BPgp = jacLIDVec[map[8]][map2[8][3]];
5444  BPgm = jacLIDVec[map[8]][map2[8][4]];
5445  BPbp = jacLIDVec[map[8]][map2[8][5]];
5446  BPsb = jacLIDVec[map[8]][map2[8][6]];
5447  BPdb = jacLIDVec[map[8]][map2[8][7]];
5448 
5449  SBb = jacLIDVec[map[9]][map2[9][0]];
5450  SBsp = jacLIDVec[map[9]][map2[9][1]];
5451  SBbp = jacLIDVec[map[9]][map2[9][2]];
5452  SBsb = jacLIDVec[map[9]][map2[9][3]];
5453 
5454  DBb = jacLIDVec[map[10]][map2[10][0]];
5455  DBdp = jacLIDVec[map[10]][map2[10][1]];
5456  DBbp = jacLIDVec[map[10]][map2[10][2]];
5457  DBdb = jacLIDVec[map[10]][map2[10][3]];
5458 
5459  int currentRow=11;
5460  // Optional nqs row:
5461  if( trnqsMod )
5462  {
5463  Qdp = jacLIDVec[map[currentRow]][map2[currentRow][0]];
5464  Qsp = jacLIDVec[map[currentRow]][map2[currentRow][1]];
5465  Qgp = jacLIDVec[map[currentRow]][map2[currentRow][2]];
5466  Qbp = jacLIDVec[map[currentRow]][map2[currentRow][3]];
5467  Qq = jacLIDVec[map[currentRow]][map2[currentRow][4]];
5468  currentRow++;
5469  }
5470 
5471  if (icVBSGiven)
5472  {
5473  IBSs = jacLIDVec[map[currentRow]][map2[currentRow][0]];
5474  IBSb = jacLIDVec[map[currentRow]][map2[currentRow][1]];
5475  IBSibs = jacLIDVec[map[currentRow]][map2[currentRow][2]];
5476  currentRow++;
5477  }
5478 
5479  if (icVDSGiven)
5480  {
5481  IDSd = jacLIDVec[map[currentRow]][map2[currentRow][0]];
5482  IDSs = jacLIDVec[map[currentRow]][map2[currentRow][1]];
5483  IDSids = jacLIDVec[map[currentRow]][map2[currentRow][2]];
5484  currentRow++;
5485  }
5486 
5487  if (icVGSGiven)
5488  {
5489  IGSg = jacLIDVec[map[currentRow]][map2[currentRow][0]];
5490  IGSs = jacLIDVec[map[currentRow]][map2[currentRow][1]];
5491  IGSigs = jacLIDVec[map[currentRow]][map2[currentRow][2]];
5492  currentRow++;
5493  }
5494 
5495  return;
5496 }
5497 
5498 //-----------------------------------------------------------------------------
5499 // Function : Instance::setupPointers
5500 // Purpose :
5501 // Special Notes :
5502 // Scope : public
5503 // Creator : Eric Keiter, SNL
5504 // Creation Date : 12/01/08
5505 //-----------------------------------------------------------------------------
5507 {
5508 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
5509  N_LAS_Matrix & dFdx = *(extData.dFdxMatrixPtr);
5510  N_LAS_Matrix & dQdx = *(extData.dQdxMatrixPtr);
5511 
5512  f_DdPtr = &(dFdx[li_Drain][Dd ]); q_DdPtr = &(dQdx[li_Drain][Dd ]);
5513  f_DdpPtr = &(dFdx[li_Drain][Ddp ]); q_DdpPtr = &(dQdx[li_Drain][Ddp ]);
5514  f_DspPtr = &(dFdx[li_Drain][Dsp ]); q_DspPtr = &(dQdx[li_Drain][Dsp ]);
5515  f_DgpPtr = &(dFdx[li_Drain][Dgp ]); q_DgpPtr = &(dQdx[li_Drain][Dgp ]);
5516  f_DbpPtr = &(dFdx[li_Drain][Dbp ]); q_DbpPtr = &(dQdx[li_Drain][Dbp ]);
5517  if (icVDSGiven)
5518  {
5519  f_DidsPtr = &(dFdx[li_Drain][Dids]);
5520  }
5521 
5522  f_GEgePtr = &(dFdx[li_GateExt][GEge ]); q_GEgePtr = &(dQdx[li_GateExt][GEge ]);
5523  f_GEdpPtr = &(dFdx[li_GateExt][GEdp ]); q_GEdpPtr = &(dQdx[li_GateExt][GEdp ]);
5524  f_GEspPtr = &(dFdx[li_GateExt][GEsp ]); q_GEspPtr = &(dQdx[li_GateExt][GEsp ]);
5525  f_GEgpPtr = &(dFdx[li_GateExt][GEgp ]); q_GEgpPtr = &(dQdx[li_GateExt][GEgp ]);
5526  f_GEgmPtr = &(dFdx[li_GateExt][GEgm ]); q_GEgmPtr = &(dQdx[li_GateExt][GEgm ]);
5527  f_GEbpPtr = &(dFdx[li_GateExt][GEbp ]); q_GEbpPtr = &(dQdx[li_GateExt][GEbp ]);
5528  if (icVGSGiven)
5529  {
5530  f_GEigsPtr = &(dFdx[li_GateExt][GEigs]);
5531  }
5532 
5533  f_SsPtr = &(dFdx[li_Source][Ss ]); q_SsPtr = &(dQdx[li_Source][Ss ]);
5534  f_SdpPtr = &(dFdx[li_Source][Sdp ]); q_SdpPtr = &(dQdx[li_Source][Sdp ]);
5535  f_SspPtr = &(dFdx[li_Source][Ssp ]); q_SspPtr = &(dQdx[li_Source][Ssp ]);
5536  f_SgpPtr = &(dFdx[li_Source][Sgp ]); q_SgpPtr = &(dQdx[li_Source][Sgp ]);
5537  f_SbpPtr = &(dFdx[li_Source][Sbp ]); q_SbpPtr = &(dQdx[li_Source][Sbp ]);
5538  if (icVBSGiven)
5539  {
5540  f_SibsPtr = &(dFdx[li_Source][Sibs]);
5541  }
5542  if (icVDSGiven)
5543  {
5544  f_SidsPtr = &(dFdx[li_Source][Sids]);
5545  }
5546  if (icVGSGiven)
5547  {
5548  f_SigsPtr = &(dFdx[li_Source][Sigs]);
5549  }
5550 
5551  f_BbPtr = &(dFdx[li_Body][Bb ]); q_BbPtr = &(dQdx[li_Body][Bb ]);
5552  f_BbpPtr = &(dFdx[li_Body][Bbp ]); q_BbpPtr = &(dQdx[li_Body][Bbp ]);
5553  f_BsbPtr = &(dFdx[li_Body][Bsb ]); q_BsbPtr = &(dQdx[li_Body][Bsb ]);
5554  f_BdbPtr = &(dFdx[li_Body][Bdb ]); q_BdbPtr = &(dQdx[li_Body][Bdb ]);
5555  if (icVBSGiven)
5556  {
5557  f_BibsPtr = &(dFdx[li_Body][Bibs]);
5558  }
5559 
5560  f_DPdPtr = &(dFdx[li_DrainPrime][DPd ]); q_DPdPtr = &(dQdx[li_DrainPrime][DPd ]);
5561  f_DPdpPtr = &(dFdx[li_DrainPrime][DPdp ]); q_DPdpPtr = &(dQdx[li_DrainPrime][DPdp ]);
5562  f_DPspPtr = &(dFdx[li_DrainPrime][DPsp ]); q_DPspPtr = &(dQdx[li_DrainPrime][DPsp ]);
5563  f_DPgpPtr = &(dFdx[li_DrainPrime][DPgp ]); q_DPgpPtr = &(dQdx[li_DrainPrime][DPgp ]);
5564  f_DPgmPtr = &(dFdx[li_DrainPrime][DPgm ]); q_DPgmPtr = &(dQdx[li_DrainPrime][DPgm ]);
5565  f_DPbpPtr = &(dFdx[li_DrainPrime][DPbp ]); q_DPbpPtr = &(dQdx[li_DrainPrime][DPbp ]);
5566  f_DPdbPtr = &(dFdx[li_DrainPrime][DPdb ]); q_DPdbPtr = &(dQdx[li_DrainPrime][DPdb ]);
5567  if( trnqsMod )
5568  {
5569  f_DPqPtr = &(dFdx[li_DrainPrime][DPq ]); q_DPqPtr = &(dQdx[li_DrainPrime][DPq ]);
5570  }
5571 
5572  f_SPsPtr = &(dFdx[li_SourcePrime][SPs ]); q_SPsPtr = &(dQdx[li_SourcePrime][SPs ]);
5573  f_SPdpPtr = &(dFdx[li_SourcePrime][SPdp ]); q_SPdpPtr = &(dQdx[li_SourcePrime][SPdp ]);
5574  f_SPspPtr = &(dFdx[li_SourcePrime][SPsp ]); q_SPspPtr = &(dQdx[li_SourcePrime][SPsp ]);
5575  f_SPgpPtr = &(dFdx[li_SourcePrime][SPgp ]); q_SPgpPtr = &(dQdx[li_SourcePrime][SPgp ]);
5576  f_SPgmPtr = &(dFdx[li_SourcePrime][SPgm ]); q_SPgmPtr = &(dQdx[li_SourcePrime][SPgm ]);
5577  f_SPbpPtr = &(dFdx[li_SourcePrime][SPbp ]); q_SPbpPtr = &(dQdx[li_SourcePrime][SPbp ]);
5578  f_SPsbPtr = &(dFdx[li_SourcePrime][SPsb ]); q_SPsbPtr = &(dQdx[li_SourcePrime][SPsb ]);
5579 
5580  if( trnqsMod )
5581  {
5582  f_SPqPtr = &(dFdx[li_SourcePrime][SPq ]); q_SPqPtr = &(dQdx[li_SourcePrime][SPq ]);
5583  }
5584 
5585  f_GPgePtr = &(dFdx[li_GatePrime][GPge ]); q_GPgePtr = &(dQdx[li_GatePrime][GPge ]);
5586  f_GPdpPtr = &(dFdx[li_GatePrime][GPdp ]); q_GPdpPtr = &(dQdx[li_GatePrime][GPdp ]);
5587  f_GPspPtr = &(dFdx[li_GatePrime][GPsp ]); q_GPspPtr = &(dQdx[li_GatePrime][GPsp ]);
5588  f_GPgpPtr = &(dFdx[li_GatePrime][GPgp ]); q_GPgpPtr = &(dQdx[li_GatePrime][GPgp ]);
5589  f_GPgmPtr = &(dFdx[li_GatePrime][GPgm ]); q_GPgmPtr = &(dQdx[li_GatePrime][GPgm ]);
5590  f_GPbpPtr = &(dFdx[li_GatePrime][GPbp ]); q_GPbpPtr = &(dQdx[li_GatePrime][GPbp ]);
5591 
5592  if( trnqsMod )
5593  {
5594  f_GPqPtr = &(dFdx[li_GatePrime][GPq ]); q_GPqPtr = &(dQdx[li_GatePrime][GPq ]);
5595  }
5596 
5597  f_GMgePtr = &(dFdx[li_GateMid][GMge ]); q_GMgePtr = &(dQdx[li_GateMid][GMge ]);
5598  f_GMdpPtr = &(dFdx[li_GateMid][GMdp ]); q_GMdpPtr = &(dQdx[li_GateMid][GMdp ]);
5599  f_GMspPtr = &(dFdx[li_GateMid][GMsp ]); q_GMspPtr = &(dQdx[li_GateMid][GMsp ]);
5600  f_GMgpPtr = &(dFdx[li_GateMid][GMgp ]); q_GMgpPtr = &(dQdx[li_GateMid][GMgp ]);
5601  f_GMgmPtr = &(dFdx[li_GateMid][GMgm ]); q_GMgmPtr = &(dQdx[li_GateMid][GMgm ]);
5602  f_GMbpPtr = &(dFdx[li_GateMid][GMbp ]); q_GMbpPtr = &(dQdx[li_GateMid][GMbp ]);
5603 
5604  f_BPbPtr = &(dFdx[li_BodyPrime][BPb ]); q_BPbPtr = &(dQdx[li_BodyPrime][BPb ]);
5605  f_BPdpPtr = &(dFdx[li_BodyPrime][BPdp ]); q_BPdpPtr = &(dQdx[li_BodyPrime][BPdp ]);
5606  f_BPspPtr = &(dFdx[li_BodyPrime][BPsp ]); q_BPspPtr = &(dQdx[li_BodyPrime][BPsp ]);
5607  f_BPgpPtr = &(dFdx[li_BodyPrime][BPgp ]); q_BPgpPtr = &(dQdx[li_BodyPrime][BPgp ]);
5608  f_BPgmPtr = &(dFdx[li_BodyPrime][BPgm ]); q_BPgmPtr = &(dQdx[li_BodyPrime][BPgm ]);
5609  f_BPbpPtr = &(dFdx[li_BodyPrime][BPbp ]); q_BPbpPtr = &(dQdx[li_BodyPrime][BPbp ]);
5610  f_BPsbPtr = &(dFdx[li_BodyPrime][BPsb ]); q_BPsbPtr = &(dQdx[li_BodyPrime][BPsb ]);
5611  f_BPdbPtr = &(dFdx[li_BodyPrime][BPdb ]); q_BPdbPtr = &(dQdx[li_BodyPrime][BPdb ]);
5612 
5613  f_SBbPtr = &(dFdx[li_SourceBody][SBb ]); q_SBbPtr = &(dQdx[li_SourceBody][SBb ]);
5614  f_SBspPtr = &(dFdx[li_SourceBody][SBsp ]); q_SBspPtr = &(dQdx[li_SourceBody][SBsp ]);
5615  f_SBbpPtr = &(dFdx[li_SourceBody][SBbp ]); q_SBbpPtr = &(dQdx[li_SourceBody][SBbp ]);
5616  f_SBsbPtr = &(dFdx[li_SourceBody][SBsb ]); q_SBsbPtr = &(dQdx[li_SourceBody][SBsb ]);
5617 
5618  f_DBbPtr = &(dFdx[li_DrainBody][DBb ]); q_DBbPtr = &(dQdx[li_DrainBody][DBb ]);
5619  f_DBdpPtr = &(dFdx[li_DrainBody][DBdp ]); q_DBdpPtr = &(dQdx[li_DrainBody][DBdp ]);
5620  f_DBbpPtr = &(dFdx[li_DrainBody][DBbp ]); q_DBbpPtr = &(dQdx[li_DrainBody][DBbp ]);
5621  f_DBdbPtr = &(dFdx[li_DrainBody][DBdb ]); q_DBdbPtr = &(dQdx[li_DrainBody][DBdb ]);
5622 
5623  // Optional nqs row:
5624  if( trnqsMod )
5625  {
5626  f_QdpPtr = &(dFdx[li_Charge][Qdp ]); q_QdpPtr = &(dQdx[li_Charge][Qdp ]);
5627  f_QspPtr = &(dFdx[li_Charge][Qsp ]); q_QspPtr = &(dQdx[li_Charge][Qsp ]);
5628  f_QgpPtr = &(dFdx[li_Charge][Qgp ]); q_QgpPtr = &(dQdx[li_Charge][Qgp ]);
5629  f_QbpPtr = &(dFdx[li_Charge][Qbp ]); q_QbpPtr = &(dQdx[li_Charge][Qbp ]);
5630  f_QqPtr = &(dFdx[li_Charge][Qq ]); q_QqPtr = &(dQdx[li_Charge][Qq ]);
5631  }
5632  if (icVBSGiven)
5633  {
5634  f_IBSbPtr = &(dFdx[li_Ibs][IBSb]);
5635  f_IBSsPtr = &(dFdx[li_Ibs][IBSs]);
5636  f_IBSibsPtr = &(dFdx[li_Ibs][IBSibs]);
5637  }
5638  if (icVDSGiven)
5639  {
5640  f_IDSdPtr = &(dFdx[li_Ids][IDSd]);
5641  f_IDSsPtr = &(dFdx[li_Ids][IDSs]);
5642  f_IDSidsPtr = &(dFdx[li_Ids][IDSids]);
5643  }
5644  if (icVGSGiven)
5645  {
5646  f_IGSgPtr = &(dFdx[li_Igs][IGSg]);
5647  f_IGSsPtr = &(dFdx[li_Igs][IGSs]);
5648  f_IGSigsPtr = &(dFdx[li_Igs][IGSigs]);
5649  }
5650 
5651 #endif
5652 }
5653 
5654 //-----------------------------------------------------------------------------
5655 // Function : Instance::updateTemperature
5656 // Purpose : This updates all the instance-owned paramters which
5657 // are temperature dependent.
5658 //
5659 // Special Notes : Annoyingly, some model-owned parameters need to be
5660 // tweaked here because of how the SPICE code is set up.
5661 //
5662 // Scope : public
5663 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
5664 // Creation Date : 11/25/06
5665 //-----------------------------------------------------------------------------
5666 bool Instance::updateTemperature (const double & temp_tmp)
5667 {
5668  std::string msg="";
5669 
5670  double tmp(0.0), tmp1(0.0), tmp2(0.0), tmp3(0.0), Eg(0.0), Eg0(0.0), ni,epssub;
5671  double T0(0.0), T1(0.0);
5672  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);
5673  double delTemp(0.0), TRatio(0.0), Inv_L(0.0), Inv_W(0.0), Inv_LW(0.0), Vtm0, Tnom(0.0);
5674  double dumPs(0.0), dumPd(0.0), dumAs(0.0), dumAd(0.0), PowWeffWr(0.0);
5675  double Nvtms(0.0), Nvtmd(0.0), SourceSatCurrent(0.0), DrainSatCurrent(0.0);
5676  double T10(0.0);
5677  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);
5678  double W_tmp(0.0), Inv_ODeff(0.0), OD_offset(0.0), dk2_lod(0.0), deta0_lod(0.0);
5679  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);
5680  double kvsat(0.0), wlod(0.0), sceff(0.0), Wdrn(0.0);
5681  double V0, lt1, ltw, Theta0, Delt_vth, TempRatio, Vth_NarrowW, Lpe_Vb, Vth;
5682  double n, Vgsteff, Vgs_eff, toxpf, toxpi, Tcen, toxe, epsrox, vddeot;
5683 
5684  int niter;
5685 
5686  bool bsuccess = true;
5687 
5688 #ifdef Xyce_DEBUG_DEVICE
5689  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
5690  {
5691  Xyce::dout() << std::endl << subsection_divider << std::endl;
5692  Xyce::dout() << "Instance::updateTemperature\n";
5693  Xyce::dout() << "name = " << getName() << std::endl;
5694  }
5695 #endif
5696 
5697  // first set the instance temperature to the new temperature:
5698  if (temp_tmp != -999.0) temp = temp_tmp;
5699 
5700  Tnom = model_.tnom;
5701  TRatio = temp/Tnom;
5702 
5703  ///////////////////////////////////////////////////////////////////////////////
5704  // Model-specific stuff:
5705  // This is kludgey - the model-specific stuff should be handled in a model function.
5706  // Some of this used to be in the model class's processParams, but was
5707  // moved back here because it makes updating from new spice BSIM4 code
5708  // less painful, even though it makes no sense here.
5709  //
5710 
5711  if (model_.mtrlMod == 0)
5712  {
5713  if ((model_.toxeGiven) && (model_.toxpGiven) &&
5714  (model_.dtoxGiven) &&
5715  (model_.toxe != (model_.toxp +model_.dtox)))
5716  {
5717  UserWarning(*this) << "toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored";
5718  }
5719  else if ((model_.toxeGiven) && (!model_.toxpGiven))
5720  {
5722  }
5723  else if ((!model_.toxeGiven) && (model_.toxpGiven))
5724  {
5726  }
5727  }
5728 
5729  if (model_.mtrlMod)
5730  {
5731  epsrox = 3.9;
5732  toxe = model_.eot;
5733  epssub = CONSTEPS0 * model_.epsrsub;
5734  }
5735  else
5736  {
5737  epsrox = model_.epsrox;
5738  toxe = model_.toxe;
5739  epssub = CONSTEPSSI;
5740  }
5741 
5742 
5743  model_.coxe = epsrox * CONSTEPS0 / toxe;
5744  if (model_.mtrlMod == 0)
5746 
5747  if (!model_.cgdoGiven)
5748  {
5749  if (model_.dlcGiven && (model_.dlc > 0.0))
5750  {
5752  }
5753  else
5754  {
5755  model_.cgdo = 0.6 * model_.xj * model_.coxe;
5756  }
5757  }
5758 
5759  if (!model_.cgsoGiven)
5760  {
5761  if (model_.dlcGiven && (model_.dlc > 0.0))
5762  {
5764  }
5765  else
5766  {
5767  model_.cgso = 0.6 * model_.xj * model_.coxe;
5768  }
5769  }
5770  if (!model_.cgboGiven)
5771  {
5772  model_.cgbo = 2.0 * model_.dwc * model_.coxe;
5773  }
5774 
5775  model_.vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14));
5776  model_.factor1 = sqrt(epssub / (epsrox * CONSTEPS0) * toxe);
5777 
5778  Vtm0 = model_.vtm0 = CONSTKboQ * Tnom;
5779 
5780  if (model_.mtrlMod == 0)
5781  {
5782  Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0);
5783  ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15)
5784  * exp(21.5565981 - Eg0 / (2.0 * Vtm0));
5785  }
5786  else
5787  {
5788  Eg0 = model_.bg0sub - model_.tbgasub * Tnom * Tnom
5789  / (Tnom + model_.tbgbsub);
5790  T0 = model_.bg0sub - model_.tbgasub * 90090.0225
5791  / (300.15 + model_.tbgbsub);
5792  ni = model_.ni0sub * (Tnom / 300.15) * sqrt(Tnom / 300.15)
5793  * exp((T0 - Eg0) / (2.0 * Vtm0));
5794  }
5795 
5796  model_.Eg0 = Eg0;
5797  model_.vtm = CONSTKboQ * temp;
5798  if (model_.mtrlMod == 0)
5799  {
5800  Eg = 1.16 - 7.02e-4 * temp * temp / (temp + 1108.0);
5801  }
5802  else
5803  {
5804  Eg = model_.bg0sub - model_.tbgasub * temp * temp
5805  / (temp + model_.tbgbsub);
5806  }
5807 
5808  if (temp != Tnom)
5809  {
5810  T0 = Eg0 / Vtm0 - Eg / model_.vtm;
5811  T1 = log(temp / Tnom);
5812  T2 = T0 + model_.SjctTempExponent * T1;
5813  T3 = exp(T2 / model_.SjctEmissionCoeff);
5815 
5818 
5821 
5822  T2 = T0 + model_.DjctTempExponent * T1;
5823  T3 = exp(T2 / model_.DjctEmissionCoeff);
5824 
5826 
5829 
5832 
5833  }
5834  else
5835  {
5838 
5841 
5843 
5846 
5849  }
5850 
5851  if (model_.SjctTempSatCurDensity < 0.0)
5853 
5856 
5859 
5860  if (model_.DjctTempSatCurDensity < 0.0)
5862 
5865 
5868 
5869  // Temperature dependence of D/B and S/B diode capacitance begins
5870  delTemp = temp - Tnom;
5871  T0 = model_.tcj * delTemp;
5872  if (T0 >= -1.0)
5873  { model_.SunitAreaTempJctCap = model_.SunitAreaJctCap *(1.0 + T0); //bug_fix -JX
5875  }
5876  else
5877  {
5878  if (model_.SunitAreaJctCap > 0.0)
5879  {
5881  UserWarning(*this) << "Temperature effect has caused cjs to be negative. Cjs is clamped to zero";
5882 
5883  }
5884  if (model_.DunitAreaJctCap > 0.0)
5885  {
5887  UserWarning(*this) << "Temperature effect has caused cjd to be negative. Cjd is clamped to zero";
5888  }
5889  }
5890 
5891  T0 = model_.tcjsw * delTemp;
5892  if (T0 >= -1.0)
5893  {
5896  }
5897  else
5898  {
5900  {
5902  UserWarning(*this) << "Temperature effect has caused cjsws to be negative. Cjsws is clamped to zero";
5903  }
5905  {
5907  UserWarning(*this) << "Temperature effect has caused cjswd to be negative. Cjswd is clamped to zero";
5908  }
5909  }
5910 
5911  T0 = model_.tcjswg * delTemp;
5912  if (T0 >= -1.0)
5913  {
5916  }
5917  else
5918  {
5920  {
5922  UserWarning(*this) << "Temperature effect has caused cjswgs to be negative. Cjswgs is clamped to zero";
5923  }
5925  {
5927  UserWarning(*this) << "Temperature effect has caused cjswgd to be negative. Cjswgd is clamped to zero";
5928  }
5929  }
5930 
5932 
5933  if (model_.PhiBS < 0.01)
5934  {
5935  model_.PhiBS = 0.01;
5936  UserWarning(*this) << "Temperature effect has caused pbs to be less than 0.01. Pbs is clamped to 0.01";
5937  }
5938 
5940  if (model_.PhiBD < 0.01)
5941  {
5942  model_.PhiBD = 0.01;
5943  UserWarning(*this) << "Temperature effect has caused pbd to be less than 0.01. Pbd is clamped to 0.01";
5944  }
5945 
5947  if (model_.PhiBSWS <= 0.01)
5948  {
5949  model_.PhiBSWS = 0.01;
5950  UserWarning(*this) << "Temperature effect has caused pbsws to be less than 0.01. Pbsws is clamped to 0.01";
5951  }
5952 
5954  if (model_.PhiBSWD <= 0.01)
5955  {
5956  model_.PhiBSWD = 0.01;
5957  UserWarning(*this) << "Temperature effect has caused pbswd to be less than 0.01. Pbswd is clamped to 0.01";
5958  }
5959 
5961  if (model_.PhiBSWGS <= 0.01)
5962  {
5963  model_.PhiBSWGS = 0.01;
5964  UserWarning(*this) << "Temperature effect has caused pbswgs to be less than 0.01. Pbswgs is clamped to 0.01";
5965  }
5966 
5968  if (model_.PhiBSWGD <= 0.01)
5969  {
5970  model_.PhiBSWGD = 0.01;
5971  UserWarning(*this) << "Temperature effect has caused pbswgd to be less than 0.01. Pbswgd is clamped to 0.01";
5972  } // End of junction capacitance
5973 
5974 
5975  if (model_.ijthdfwd <= 0.0)
5976  {
5977  model_.ijthdfwd = 0.1;
5978  UserWarning(*this) << "Ijthdfwd reset to " << model_.ijthdfwd;
5979  }
5980  if (model_.ijthsfwd <= 0.0)
5981  {
5982  model_.ijthsfwd = 0.1;
5983  UserWarning(*this) << "Ijthsfwd reset to " << model_.ijthsfwd;
5984  }
5985  if (model_.ijthdrev <= 0.0)
5986  {
5987  model_.ijthdrev = 0.1;
5988  UserWarning(*this) << "Ijthdrev reset to " << model_.ijthdrev;
5989  }
5990  if (model_.ijthsrev <= 0.0)
5991  {
5992  model_.ijthsrev = 0.1;
5993  UserWarning(*this) << "Ijthsrev reset to " << model_.ijthsrev;
5994  }
5995 
5996  if ((model_.xjbvd <= 0.0) && (model_.dioMod == 2))
5997  {
5998  model_.xjbvd = 1.0;
5999  UserWarning(*this) << "Xjbvd reset to " << model_.xjbvd;
6000  }
6001  else if ((model_.xjbvd < 0.0) && (model_.dioMod == 0))
6002  {
6003  model_.xjbvd = 1.0;
6004  UserWarning(*this) << "Xjbvd reset to " << model_.xjbvd;
6005  }
6006 
6007  if (model_.bvd <= 0.0)
6008  {
6009  model_.bvd = 10.0;
6010  UserWarning(*this) << "BVD reset to " << model_.bvd;
6011  }
6012 
6013  if ((model_.xjbvs <= 0.0) && (model_.dioMod == 2))
6014  {
6015  model_.xjbvs = 1.0;
6016  UserWarning(*this) << "Xjbvs reset to " << model_.xjbvs;
6017  }
6018  else if ((model_.xjbvs < 0.0) && (model_.dioMod == 0))
6019  {
6020  model_.xjbvs = 1.0;
6021  UserWarning(*this) << "Xjbvs reset to " << model_.xjbvs;
6022  }
6023 
6024  if (model_.bvs <= 0.0)
6025  {
6026  model_.bvs = 10.0;
6027  UserWarning(*this) << "BVS reset to " << model_.bvs;
6028  }
6029 
6030 
6031  ///////////////////////////////////////////////////////////////////////////////
6032  // Instance stuff:
6033  // (loop through all the instances of the model)
6034 
6035  // stress effect
6036  Ldrn = l;
6037  Wdrn = w / nf;
6038 
6039  // This next block determines whether or not to use a previously allocated
6040  // set of size dependent parameters. These are stored in a list that is
6041  // owned by the model. If the values for length and width match those of
6042  // a previously allocated set, then use the old set. If not, allocate a new set.
6043 
6044  std::list<SizeDependParam*>::iterator it_dpL =
6045  model_.sizeDependParamList.begin();
6046  std::list<SizeDependParam*>::iterator end_dpL =
6048 
6049  paramPtr = NULL;
6050 
6051  for( ; it_dpL != end_dpL; ++it_dpL )
6052  {
6053  if( ((*it_dpL)->Length == l)
6054  && ((*it_dpL)->Width == w)
6055  && ((*it_dpL)->NFinger == nf) )
6056  {
6057  paramPtr = (*it_dpL);
6058  }
6059  }
6060 
6061  // This was inside of the "Size_Not_Found" if-statement, but that
6062  // won't work here - it winds up being uninitialized whenever the
6063  // size pointer is found
6064  Lnew = l + model_.xl ;
6065  Wnew = w / nf + model_.xw;
6066 
6067  if ( paramPtr != NULL )
6068  {
6069  }
6070  else
6071  {
6072  paramPtr = new SizeDependParam ();
6073 
6074  model_.sizeDependParamList.push_back( paramPtr );
6075  paramPtr->referenceTemperature = temp_tmp;
6076 
6077  //paramPtr->pNext = NULL;
6078 
6079  paramPtr->Length = l;
6080  paramPtr->Width = w;
6081  paramPtr->NFinger = nf;
6082  //Lnew = l + model_.xl ;
6083  //Wnew = w / nf + model_.xw;
6084 
6085  T0 = pow(Lnew, model_.Lln);
6086  T1 = pow(Wnew, model_.Lwn);
6087  tmp1 = model_.Ll / T0 + model_.Lw / T1
6088  + model_.Lwl / (T0 * T1);
6089  paramPtr->dl = model_.Lint + tmp1;
6090  tmp2 = model_.Llc / T0 + model_.Lwc / T1
6091  + model_.Lwlc / (T0 * T1);
6092  paramPtr->dlc = model_.dlc + tmp2;
6093 
6094  T2 = pow(Lnew, model_.Wln);
6095  T3 = pow(Wnew, model_.Wwn);
6096  tmp1 = model_.Wl / T2 + model_.Ww / T3
6097  + model_.Wwl / (T2 * T3);
6098  paramPtr->dw = model_.Wint + tmp1;
6099  tmp2 = model_.Wlc / T2 + model_.Wwc / T3
6100  + model_.Wwlc / (T2 * T3);
6101  paramPtr->dwc = model_.dwc + tmp2;
6102  paramPtr->dwj = model_.dwj + tmp2;
6103 
6104  paramPtr->leff = Lnew - 2.0 * paramPtr->dl;
6105 
6106  if (paramPtr->leff <= 0.0)
6107  {
6108  UserError0(*this) << "mosfet " << getName() << " model " << model_.getName()
6109  << " Effective channel length <= 0";
6110  }
6111 
6112  paramPtr->weff = Wnew - 2.0 * paramPtr->dw;
6113  if (paramPtr->weff <= 0.0)
6114  {
6115  UserError0(*this) << "mosfet " << getName() << " model " << model_.getName()
6116  << " Effective channel width <= 0";
6117  }
6118 
6119  paramPtr->leffCV = Lnew - 2.0 * paramPtr->dlc;
6120  if (paramPtr->leffCV <= 0.0)
6121  {
6122  UserError0(*this) << "mosfet " << getName() << " model " << model_.getName()
6123  << " Effective channel length for C-V <= 0";
6124  }
6125 
6126  paramPtr->weffCV = Wnew - 2.0 * paramPtr->dwc;
6127  if (paramPtr->weffCV <= 0.0)
6128  {
6129  UserError0(*this) << "mosfet " << getName() << " model " << model_.getName()
6130  << " Effective channel width for C-V <= 0";
6131  }
6132 
6133  paramPtr->weffCJ = Wnew - 2.0 * paramPtr->dwj;
6134  if (paramPtr->weffCJ <= 0.0)
6135  {
6136  UserError0(*this) << "mosfet " << getName() << " model " << model_.getName()
6137  << " Effective channel width for S/D junctions <= 0";
6138  }
6139 
6140 
6141  if (model_.binUnit == 1)
6142  {
6143  Inv_L = 1.0e-6 / paramPtr->leff;
6144  Inv_W = 1.0e-6 / paramPtr->weff;
6145  Inv_LW = 1.0e-12 / (paramPtr->leff * paramPtr->weff);
6146  }
6147  else
6148  {
6149  Inv_L = 1.0 / paramPtr->leff;
6150  Inv_W = 1.0 / paramPtr->weff;
6151  Inv_LW = 1.0 / (paramPtr->leff * paramPtr->weff);
6152  }
6154  + model_.lcdsc * Inv_L
6155  + model_.wcdsc * Inv_W
6156  + model_.pcdsc * Inv_LW;
6158  + model_.lcdscb * Inv_L
6159  + model_.wcdscb * Inv_W
6160  + model_.pcdscb * Inv_LW;
6161 
6163  + model_.lcdscd * Inv_L
6164  + model_.wcdscd * Inv_W
6165  + model_.pcdscd * Inv_LW;
6166 
6167  paramPtr->cit = model_.cit
6168  + model_.lcit * Inv_L
6169  + model_.wcit * Inv_W
6170  + model_.pcit * Inv_LW;
6172  + model_.lnfactor * Inv_L
6173  + model_.wnfactor * Inv_W
6174  + model_.pnfactor * Inv_LW;
6175  paramPtr->xj = model_.xj
6176  + model_.lxj * Inv_L
6177  + model_.wxj * Inv_W
6178  + model_.pxj * Inv_LW;
6180  + model_.lvsat * Inv_L
6181  + model_.wvsat * Inv_W
6182  + model_.pvsat * Inv_LW;
6183  paramPtr->at = model_.at
6184  + model_.lat * Inv_L
6185  + model_.wat * Inv_W
6186  + model_.pat * Inv_LW;
6187  paramPtr->a0 = model_.a0
6188  + model_.la0 * Inv_L
6189  + model_.wa0 * Inv_W
6190  + model_.pa0 * Inv_LW;
6191 
6192  paramPtr->ags = model_.ags
6193  + model_.lags * Inv_L
6194  + model_.wags * Inv_W
6195  + model_.pags * Inv_LW;
6196 
6197  paramPtr->a1 = model_.a1
6198  + model_.la1 * Inv_L
6199  + model_.wa1 * Inv_W
6200  + model_.pa1 * Inv_LW;
6201  paramPtr->a2 = model_.a2
6202  + model_.la2 * Inv_L
6203  + model_.wa2 * Inv_W
6204  + model_.pa2 * Inv_LW;
6206  + model_.lketa * Inv_L
6207  + model_.wketa * Inv_W
6208  + model_.pketa * Inv_LW;
6210  + model_.lnsub * Inv_L
6211  + model_.wnsub * Inv_W
6212  + model_.pnsub * Inv_LW;
6214  + model_.lndep * Inv_L
6215  + model_.wndep * Inv_W
6216  + model_.pndep * Inv_LW;
6217  paramPtr->nsd = model_.nsd
6218  + model_.lnsd * Inv_L
6219  + model_.wnsd * Inv_W
6220  + model_.pnsd * Inv_LW;
6222  + model_.lphin * Inv_L
6223  + model_.wphin * Inv_W
6224  + model_.pphin * Inv_LW;
6226  + model_.lngate * Inv_L
6227  + model_.wngate * Inv_W
6228  + model_.pngate * Inv_LW;
6230  + model_.lgamma1 * Inv_L
6231  + model_.wgamma1 * Inv_W
6232  + model_.pgamma1 * Inv_LW;
6234  + model_.lgamma2 * Inv_L
6235  + model_.wgamma2 * Inv_W
6236  + model_.pgamma2 * Inv_LW;
6237  paramPtr->vbx = model_.vbx
6238  + model_.lvbx * Inv_L
6239  + model_.wvbx * Inv_W
6240  + model_.pvbx * Inv_LW;
6241  paramPtr->vbm = model_.vbm
6242  + model_.lvbm * Inv_L
6243  + model_.wvbm * Inv_W
6244  + model_.pvbm * Inv_LW;
6245  paramPtr->xt = model_.xt
6246  + model_.lxt * Inv_L
6247  + model_.wxt * Inv_W
6248  + model_.pxt * Inv_LW;
6249  paramPtr->vfb = model_.vfb
6250  + model_.lvfb * Inv_L
6251  + model_.wvfb * Inv_W
6252  + model_.pvfb * Inv_LW;
6253  paramPtr->k1 = model_.k1
6254  + model_.lk1 * Inv_L
6255  + model_.wk1 * Inv_W
6256  + model_.pk1 * Inv_LW;
6257  paramPtr->kt1 = model_.kt1
6258  + model_.lkt1 * Inv_L
6259  + model_.wkt1 * Inv_W
6260  + model_.pkt1 * Inv_LW;
6262  + model_.lkt1l * Inv_L
6263  + model_.wkt1l * Inv_W
6264  + model_.pkt1l * Inv_LW;
6265  paramPtr->k2 = model_.k2
6266  + model_.lk2 * Inv_L
6267  + model_.wk2 * Inv_W
6268  + model_.pk2 * Inv_LW;
6269  paramPtr->kt2 = model_.kt2
6270  + model_.lkt2 * Inv_L
6271  + model_.wkt2 * Inv_W
6272  + model_.pkt2 * Inv_LW;
6273  paramPtr->k3 = model_.k3
6274  + model_.lk3 * Inv_L
6275  + model_.wk3 * Inv_W
6276  + model_.pk3 * Inv_LW;
6277  paramPtr->k3b = model_.k3b
6278  + model_.lk3b * Inv_L
6279  + model_.wk3b * Inv_W
6280  + model_.pk3b * Inv_LW;
6281  paramPtr->w0 = model_.w0
6282  + model_.lw0 * Inv_L
6283  + model_.ww0 * Inv_W
6284  + model_.pw0 * Inv_LW;
6286  + model_.llpe0 * Inv_L
6287  + model_.wlpe0 * Inv_W
6288  + model_.plpe0 * Inv_LW;
6290  + model_.llpeb * Inv_L
6291  + model_.wlpeb * Inv_W
6292  + model_.plpeb * Inv_LW;
6294  + model_.ldvtp0 * Inv_L
6295  + model_.wdvtp0 * Inv_W
6296  + model_.pdvtp0 * Inv_LW;
6298  + model_.ldvtp1 * Inv_L
6299  + model_.wdvtp1 * Inv_W
6300  + model_.pdvtp1 * Inv_LW;
6302  + model_.ldvt0 * Inv_L
6303  + model_.wdvt0 * Inv_W
6304  + model_.pdvt0 * Inv_LW;
6306  + model_.ldvt1 * Inv_L
6307  + model_.wdvt1 * Inv_W
6308  + model_.pdvt1 * Inv_LW;
6310  + model_.ldvt2 * Inv_L
6311  + model_.wdvt2 * Inv_W
6312  + model_.pdvt2 * Inv_LW;
6314  + model_.ldvt0w * Inv_L
6315  + model_.wdvt0w * Inv_W
6316  + model_.pdvt0w * Inv_LW;
6318  + model_.ldvt1w * Inv_L
6319  + model_.wdvt1w * Inv_W
6320  + model_.pdvt1w * Inv_LW;
6322  + model_.ldvt2w * Inv_L
6323  + model_.wdvt2w * Inv_W
6324  + model_.pdvt2w * Inv_LW;
6326  + model_.ldrout * Inv_L
6327  + model_.wdrout * Inv_W
6328  + model_.pdrout * Inv_LW;
6330  + model_.ldsub * Inv_L
6331  + model_.wdsub * Inv_W
6332  + model_.pdsub * Inv_LW;
6334  + model_.lvth0 * Inv_L
6335  + model_.wvth0 * Inv_W
6336  + model_.pvth0 * Inv_LW;
6337  paramPtr->ua = model_.ua
6338  + model_.lua * Inv_L
6339  + model_.wua * Inv_W
6340  + model_.pua * Inv_LW;
6341  paramPtr->ua1 = model_.ua1
6342  + model_.lua1 * Inv_L
6343  + model_.wua1 * Inv_W
6344  + model_.pua1 * Inv_LW;
6345  paramPtr->ub = model_.ub
6346  + model_.lub * Inv_L
6347  + model_.wub * Inv_W
6348  + model_.pub * Inv_LW;
6349  paramPtr->ub1 = model_.ub1
6350  + model_.lub1 * Inv_L
6351  + model_.wub1 * Inv_W
6352  + model_.pub1 * Inv_LW;
6353  paramPtr->uc = model_.uc
6354  + model_.luc * Inv_L
6355  + model_.wuc * Inv_W
6356  + model_.puc * Inv_LW;
6357  paramPtr->uc1 = model_.uc1
6358  + model_.luc1 * Inv_L
6359  + model_.wuc1 * Inv_W
6360  + model_.puc1 * Inv_LW;
6361  paramPtr->ud = model_.ud
6362  + model_.lud * Inv_L
6363  + model_.wud * Inv_W
6364  + model_.pud * Inv_LW;
6365  paramPtr->ud1 = model_.ud1
6366  + model_.lud1 * Inv_L
6367  + model_.wud1 * Inv_W
6368  + model_.pud1 * Inv_LW;
6369  paramPtr->up = model_.up
6370  + model_.lup * Inv_L
6371  + model_.wup * Inv_W
6372  + model_.pup * Inv_LW;
6373  paramPtr->lp = model_.lp
6374  + model_.llp * Inv_L
6375  + model_.wlp * Inv_W
6376  + model_.plp * Inv_LW;
6377  paramPtr->eu = model_.eu
6378  + model_.leu * Inv_L
6379  + model_.weu * Inv_W
6380  + model_.peu * Inv_LW;
6381  paramPtr->u0 = model_.u0
6382  + model_.lu0 * Inv_L
6383  + model_.wu0 * Inv_W
6384  + model_.pu0 * Inv_LW;
6385  paramPtr->ute = model_.ute
6386  + model_.lute * Inv_L
6387  + model_.wute * Inv_W
6388  + model_.pute * Inv_LW;
6390  + model_.lvoff * Inv_L
6391  + model_.wvoff * Inv_W
6392  + model_.pvoff * Inv_LW;
6394  + model_.ltvoff * Inv_L
6395  + model_.wtvoff * Inv_W
6396  + model_.ptvoff * Inv_LW;
6398  + model_.lminv * Inv_L
6399  + model_.wminv * Inv_W
6400  + model_.pminv * Inv_LW;
6402  + model_.lminvcv * Inv_L
6403  + model_.wminvcv * Inv_W
6404  + model_.pminvcv * Inv_LW;
6406  + model_.lfprout * Inv_L
6407  + model_.wfprout * Inv_W
6408  + model_.pfprout * Inv_LW;
6410  + model_.lpdits * Inv_L
6411  + model_.wpdits * Inv_W
6412  + model_.ppdits * Inv_LW;
6414  + model_.lpditsd * Inv_L
6415  + model_.wpditsd * Inv_W
6416  + model_.ppditsd * Inv_LW;
6418  + model_.ldelta * Inv_L
6419  + model_.wdelta * Inv_W
6420  + model_.pdelta * Inv_LW;
6422  + model_.lrdsw * Inv_L
6423  + model_.wrdsw * Inv_W
6424  + model_.prdsw * Inv_LW;
6425  paramPtr->rdw = model_.rdw
6426  + model_.lrdw * Inv_L
6427  + model_.wrdw * Inv_W
6428  + model_.prdw * Inv_LW;
6429  paramPtr->rsw = model_.rsw
6430  + model_.lrsw * Inv_L
6431  + model_.wrsw * Inv_W
6432  + model_.prsw * Inv_LW;
6434  + model_.lprwg * Inv_L
6435  + model_.wprwg * Inv_W
6436  + model_.pprwg * Inv_LW;
6438  + model_.lprwb * Inv_L
6439  + model_.wprwb * Inv_W
6440  + model_.pprwb * Inv_LW;
6441  paramPtr->prt = model_.prt
6442  + model_.lprt * Inv_L
6443  + model_.wprt * Inv_W
6444  + model_.pprt * Inv_LW;
6446  + model_.leta0 * Inv_L
6447  + model_.weta0 * Inv_W
6448  + model_.peta0 * Inv_LW;
6450  + model_.letab * Inv_L
6451  + model_.wetab * Inv_W
6452  + model_.petab * Inv_LW;
6454  + model_.lpclm * Inv_L
6455  + model_.wpclm * Inv_W
6456  + model_.ppclm * Inv_LW;
6458  + model_.lpdibl1 * Inv_L
6459  + model_.wpdibl1 * Inv_W
6460  + model_.ppdibl1 * Inv_LW;
6462  + model_.lpdibl2 * Inv_L
6463  + model_.wpdibl2 * Inv_W
6464  + model_.ppdibl2 * Inv_LW;
6466  + model_.lpdiblb * Inv_L
6467  + model_.wpdiblb * Inv_W
6468  + model_.ppdiblb * Inv_LW;
6470  + model_.lpscbe1 * Inv_L
6471  + model_.wpscbe1 * Inv_W
6472  + model_.ppscbe1 * Inv_LW;
6474  + model_.lpscbe2 * Inv_L
6475  + model_.wpscbe2 * Inv_W
6476  + model_.ppscbe2 * Inv_LW;
6478  + model_.lpvag * Inv_L
6479  + model_.wpvag * Inv_W
6480  + model_.ppvag * Inv_LW;
6481  paramPtr->wr = model_.wr
6482  + model_.lwr * Inv_L
6483  + model_.wwr * Inv_W
6484  + model_.pwr * Inv_LW;
6485  paramPtr->dwg = model_.dwg
6486  + model_.ldwg * Inv_L
6487  + model_.wdwg * Inv_W
6488  + model_.pdwg * Inv_LW;
6489  paramPtr->dwb = model_.dwb
6490  + model_.ldwb * Inv_L
6491  + model_.wdwb * Inv_W
6492  + model_.pdwb * Inv_LW;
6493  paramPtr->b0 = model_.b0
6494  + model_.lb0 * Inv_L
6495  + model_.wb0 * Inv_W
6496  + model_.pb0 * Inv_LW;
6497  paramPtr->b1 = model_.b1
6498  + model_.lb1 * Inv_L
6499  + model_.wb1 * Inv_W
6500  + model_.pb1 * Inv_LW;
6502  + model_.lalpha0 * Inv_L
6503  + model_.walpha0 * Inv_W
6504  + model_.palpha0 * Inv_LW;
6506  + model_.lalpha1 * Inv_L
6507  + model_.walpha1 * Inv_W
6508  + model_.palpha1 * Inv_LW;
6510  + model_.lbeta0 * Inv_L
6511  + model_.wbeta0 * Inv_W
6512  + model_.pbeta0 * Inv_LW;
6514  + model_.lagidl * Inv_L
6515  + model_.wagidl * Inv_W
6516  + model_.pagidl * Inv_LW;
6518  + model_.lbgidl * Inv_L
6519  + model_.wbgidl * Inv_W
6520  + model_.pbgidl * Inv_LW;
6522  + model_.lcgidl * Inv_L
6523  + model_.wcgidl * Inv_W
6524  + model_.pcgidl * Inv_LW;
6526  + model_.legidl * Inv_L
6527  + model_.wegidl * Inv_W
6528  + model_.pegidl * Inv_LW;
6530  + model_.lagisl * Inv_L
6531  + model_.wagisl * Inv_W
6532  + model_.pagisl * Inv_LW;
6534  + model_.lbgisl * Inv_L
6535  + model_.wbgisl * Inv_W
6536  + model_.pbgisl * Inv_LW;
6538  + model_.lcgisl * Inv_L
6539  + model_.wcgisl * Inv_W
6540  + model_.pcgisl * Inv_LW;
6542  + model_.legisl * Inv_L
6543  + model_.wegisl * Inv_W
6544  + model_.pegisl * Inv_LW;
6546  + model_.laigc * Inv_L
6547  + model_.waigc * Inv_W
6548  + model_.paigc * Inv_LW;
6550  + model_.lbigc * Inv_L
6551  + model_.wbigc * Inv_W
6552  + model_.pbigc * Inv_LW;
6554  + model_.lcigc * Inv_L
6555  + model_.wcigc * Inv_W
6556  + model_.pcigc * Inv_LW;
6558  + model_.laigs * Inv_L
6559  + model_.waigs * Inv_W
6560  + model_.paigs * Inv_LW;
6562  + model_.lbigs * Inv_L
6563  + model_.wbigs * Inv_W
6564  + model_.pbigs * Inv_LW;
6566  + model_.lcigs * Inv_L
6567  + model_.wcigs * Inv_W
6568  + model_.pcigs * Inv_LW;
6570  + model_.laigd * Inv_L
6571  + model_.waigd * Inv_W
6572  + model_.paigd * Inv_LW;
6574  + model_.lbigd * Inv_L
6575  + model_.wbigd * Inv_W
6576  + model_.pbigd * Inv_LW;
6578  + model_.lcigd * Inv_L
6579  + model_.wcigd * Inv_W
6580  + model_.pcigd * Inv_LW;
6582  + model_.laigbacc * Inv_L
6583  + model_.waigbacc * Inv_W
6584  + model_.paigbacc * Inv_LW;
6586  + model_.lbigbacc * Inv_L
6587  + model_.wbigbacc * Inv_W
6588  + model_.pbigbacc * Inv_LW;
6590  + model_.lcigbacc * Inv_L
6591  + model_.wcigbacc * Inv_W
6592  + model_.pcigbacc * Inv_LW;
6594  + model_.laigbinv * Inv_L
6595  + model_.waigbinv * Inv_W
6596  + model_.paigbinv * Inv_LW;
6598  + model_.lbigbinv * Inv_L
6599  + model_.wbigbinv * Inv_W
6600  + model_.pbigbinv * Inv_LW;
6602  + model_.lcigbinv * Inv_L
6603  + model_.wcigbinv * Inv_W
6604  + model_.pcigbinv * Inv_LW;
6606  + model_.lnigc * Inv_L
6607  + model_.wnigc * Inv_W
6608  + model_.pnigc * Inv_LW;
6610  + model_.lnigbacc * Inv_L
6611  + model_.wnigbacc * Inv_W
6612  + model_.pnigbacc * Inv_LW;
6614  + model_.lnigbinv * Inv_L
6615  + model_.wnigbinv * Inv_W
6616  + model_.pnigbinv * Inv_LW;
6618  + model_.lntox * Inv_L
6619  + model_.wntox * Inv_W
6620  + model_.pntox * Inv_LW;
6622  + model_.leigbinv * Inv_L
6623  + model_.weigbinv * Inv_W
6624  + model_.peigbinv * Inv_LW;
6626  + model_.lpigcd * Inv_L
6627  + model_.wpigcd * Inv_W
6628  + model_.ppigcd * Inv_LW;
6630  + model_.lpoxedge * Inv_L
6631  + model_.wpoxedge * Inv_W
6632  + model_.ppoxedge * Inv_LW;
6634  + model_.lxrcrg1 * Inv_L
6635  + model_.wxrcrg1 * Inv_W
6636  + model_.pxrcrg1 * Inv_LW;
6638  + model_.lxrcrg2 * Inv_L
6639  + model_.wxrcrg2 * Inv_W
6640  + model_.pxrcrg2 * Inv_LW;
6642  + model_.llambda * Inv_L
6643  + model_.wlambda * Inv_W
6644  + model_.plambda * Inv_LW;
6645  paramPtr->vtl = model_.vtl
6646  + model_.lvtl * Inv_L
6647  + model_.wvtl * Inv_W
6648  + model_.pvtl * Inv_LW;
6649  paramPtr->xn = model_.xn
6650  + model_.lxn * Inv_L
6651  + model_.wxn * Inv_W
6652  + model_.pxn * Inv_LW;
6654  + model_.lvfbsdoff * Inv_L
6655  + model_.wvfbsdoff * Inv_W
6656  + model_.pvfbsdoff * Inv_LW;
6658  + model_.ltvfbsdoff * Inv_L
6659  + model_.wtvfbsdoff * Inv_W
6660  + model_.ptvfbsdoff * Inv_LW;
6661 
6663  + model_.lcgsl * Inv_L
6664  + model_.wcgsl * Inv_W
6665  + model_.pcgsl * Inv_LW;
6667  + model_.lcgdl * Inv_L
6668  + model_.wcgdl * Inv_W
6669  + model_.pcgdl * Inv_LW;
6671  + model_.lckappas * Inv_L
6672  + model_.wckappas * Inv_W
6673  + model_.pckappas * Inv_LW;
6675  + model_.lckappad * Inv_L
6676  + model_.wckappad * Inv_W
6677  + model_.pckappad * Inv_LW;
6678  paramPtr->cf = model_.cf
6679  + model_.lcf * Inv_L
6680  + model_.wcf * Inv_W
6681  + model_.pcf * Inv_LW;
6682  paramPtr->clc = model_.clc
6683  + model_.lclc * Inv_L
6684  + model_.wclc * Inv_W
6685  + model_.pclc * Inv_LW;
6686  paramPtr->cle = model_.cle
6687  + model_.lcle * Inv_L
6688  + model_.wcle * Inv_W
6689  + model_.pcle * Inv_LW;
6691  + model_.lvfbcv * Inv_L
6692  + model_.wvfbcv * Inv_W
6693  + model_.pvfbcv * Inv_LW;
6695  + model_.lacde * Inv_L
6696  + model_.wacde * Inv_W
6697  + model_.pacde * Inv_LW;
6699  + model_.lmoin * Inv_L
6700  + model_.wmoin * Inv_W
6701  + model_.pmoin * Inv_LW;
6703  + model_.lnoff * Inv_L
6704  + model_.wnoff * Inv_W
6705  + model_.pnoff * Inv_LW;
6707  + model_.lvoffcv * Inv_L
6708  + model_.wvoffcv * Inv_W
6709  + model_.pvoffcv * Inv_LW;
6711  + model_.lkvth0we * Inv_L
6712  + model_.wkvth0we * Inv_W
6713  + model_.pkvth0we * Inv_LW;
6715  + model_.lk2we * Inv_L
6716  + model_.wk2we * Inv_W
6717  + model_.pk2we * Inv_LW;
6719  + model_.lku0we * Inv_L
6720  + model_.wku0we * Inv_W
6721  + model_.pku0we * Inv_LW;
6722 
6723  paramPtr->abulkCVfactor = 1.0 + pow((paramPtr->clc / paramPtr->leffCV), paramPtr->cle);
6724 
6725  T0 = (TRatio - 1.0);
6726 
6727  PowWeffWr = pow(paramPtr->weffCJ * 1.0e6, paramPtr->wr) * nf;
6728 
6729  T1 = T2 = T3 = T4 = 0.0;
6730  if(model_.tempMod == 0)
6731  {
6732  paramPtr->ua = paramPtr->ua + paramPtr->ua1 * T0;
6733  paramPtr->ub = paramPtr->ub + paramPtr->ub1 * T0;
6734  paramPtr->uc = paramPtr->uc + paramPtr->uc1 * T0;
6735  paramPtr->ud = paramPtr->ud + paramPtr->ud1 * T0;
6737  T10 = paramPtr->prt * T0;
6738  if(model_.rdsMod)
6739  {
6740  // External Rd(V)
6741  T1 = paramPtr->rdw + T10;
6742  T2 = model_.rdwmin + T10;
6743  // External Rs(V)
6744  T3 = paramPtr->rsw + T10;
6745  T4 = model_.rswmin + T10;
6746  }
6747  // Internal Rds(V) in IV
6748  paramPtr->rds0 = (paramPtr->rdsw + T10) * nf / PowWeffWr;
6749  paramPtr->rdswmin = (model_.rdswmin + T10) * nf / PowWeffWr;
6750  }
6751  else
6752  { // tempMod = 1, 2
6753  paramPtr->ua = paramPtr->ua * (1.0 + paramPtr->ua1 * delTemp) ;
6754  paramPtr->ub = paramPtr->ub * (1.0 + paramPtr->ub1 * delTemp);
6755  paramPtr->uc = paramPtr->uc * (1.0 + paramPtr->uc1 * delTemp);
6756  paramPtr->ud = paramPtr->ud * (1.0 + paramPtr->ud1 * delTemp);
6757  paramPtr->vsattemp = paramPtr->vsat * (1.0 - paramPtr->at * delTemp);
6758  T10 = 1.0 + paramPtr->prt * delTemp;
6759  if(model_.rdsMod)
6760  {
6761  // External Rd(V)
6762  T1 = paramPtr->rdw * T10;
6763  T2 = model_.rdwmin * T10;
6764  // External Rs(V)
6765  T3 = paramPtr->rsw * T10;
6766  T4 = model_.rswmin * T10;
6767  }
6768  // Internal Rds(V) in IV
6769  paramPtr->rds0 = paramPtr->rdsw * T10 * nf / PowWeffWr;
6770  paramPtr->rdswmin = model_.rdswmin * T10 * nf / PowWeffWr;
6771  }
6772  if (T1 < 0.0)
6773  {
6774  T1 = 0.0;
6775  UserWarning(*this) << "Rdw at current temperature is negative; set to 0";
6776  }
6777  if (T2 < 0.0)
6778  {
6779  T2 = 0.0;
6780  UserWarning(*this) << "Rdwmin at current temperature is negative; set to 0";
6781  }
6782  paramPtr->rd0 = T1 / PowWeffWr;
6783  paramPtr->rdwmin = T2 / PowWeffWr;
6784  if (T3 < 0.0)
6785  {
6786  T3 = 0.0;
6787  UserWarning(*this) << "Rsw at current temperature is negative; set to 0";
6788  }
6789  if (T4 < 0.0)
6790  {
6791  T4 = 0.0;
6792  UserWarning(*this) << "Rswmin at current temperature is negative; set to 0";
6793  }
6794  paramPtr->rs0 = T3 / PowWeffWr;
6795  paramPtr->rswmin = T4 / PowWeffWr;
6796 
6797  if (paramPtr->u0 > 1.0)
6798  paramPtr->u0 = paramPtr->u0 / 1.0e4;
6799 
6800  // mobility channel length dependence
6801  T5 = 1.0 - paramPtr->up * exp( - paramPtr->leff / paramPtr->lp);
6802  paramPtr->u0temp = paramPtr->u0 * T5
6803  * pow(TRatio, paramPtr->ute);
6804  if (paramPtr->eu < 0.0)
6805  {
6806  paramPtr->eu = 0.0;
6807  UserWarning(*this) << "eu has been negative; reset to 0.0";
6808  }
6809 
6810  paramPtr->vfbsdoff = paramPtr->vfbsdoff * (1.0 + paramPtr->tvfbsdoff * delTemp);
6811  paramPtr->voff = paramPtr->voff * (1.0 + paramPtr->tvoff * delTemp);
6812 
6813  // Source End Velocity Limit
6814  if((model_.vtlGiven) && (model_.vtl > 0.0) )
6815  {
6816  if(model_.lc < 0.0) paramPtr->lc = 0.0;
6817  else paramPtr->lc = model_.lc ;
6818  T0 = paramPtr->leff / (paramPtr->xn * paramPtr->leff + paramPtr->lc);
6819  paramPtr->tfactor = (1.0 - T0) / (1.0 + T0 );
6820  }
6821 
6825 
6827  {
6828  T0 = paramPtr->gamma1 * model_.coxe;
6829  paramPtr->ndep = 3.01248e22 * T0 * T0;
6830  }
6831 
6832  paramPtr->phi = Vtm0 * log(paramPtr->ndep / ni) + paramPtr->phin + 0.4;
6833 
6834  paramPtr->sqrtPhi = sqrt(paramPtr->phi);
6836 
6837  paramPtr->Xdep0 = sqrt(2.0 * epssub / (Charge_q
6838  * paramPtr->ndep * 1.0e6))
6839  * paramPtr->sqrtPhi;
6840 
6841  paramPtr->sqrtXdep0 = sqrt(paramPtr->Xdep0);
6842 
6843  if (model_.mtrlMod == 0)
6844  {
6845  paramPtr->litl = sqrt(3.0 * paramPtr->xj * toxe);
6846  }
6847  else
6848  {
6849  paramPtr->litl = sqrt(model_.epsrsub/epsrox * paramPtr->xj * toxe);
6850  }
6851 
6852  paramPtr->vbi = Vtm0 * log(paramPtr->nsd * paramPtr->ndep / (ni * ni));
6853 
6854  if (model_.mtrlMod == 0)
6855  {
6856  if (paramPtr->ngate > 0.0)
6857  { paramPtr->vfbsd = Vtm0 * log(paramPtr->ngate
6858  / paramPtr->nsd);
6859  }
6860  else
6861  paramPtr->vfbsd = 0.0;
6862  }
6863  else
6864  {
6865  T0 = Vtm0 * log(paramPtr->nsd/ni);
6866  T1 = 0.5 * Eg0;
6867  if(T0 > T1)
6868  T0 = T1;
6869  T2 = model_.easub + T1 - model_.dtype * T0;
6870  paramPtr->vfbsd = model_.phig - T2;
6871  }
6872 
6873  paramPtr->cdep0 = sqrt(Charge_q * epssub
6874  * paramPtr->ndep * 1.0e6 / 2.0 / paramPtr->phi);
6875 
6876  paramPtr->ToxRatio = exp(paramPtr->ntox
6877  * log(model_.toxref / toxe))
6878  / toxe / toxe;
6879 
6881  * log(model_.toxref
6882  / (toxe * paramPtr->poxedge)))
6883  / toxe / toxe
6885 
6886  paramPtr->Aechvb = (model_.dtype == CONSTNMOS) ? 4.97232e-7 : 3.42537e-7;
6887  paramPtr->Bechvb = (model_.dtype == CONSTNMOS) ? 7.45669e11 : 1.16645e12;
6893  * model_.toxe * paramPtr->poxedge;
6895  * paramPtr->ToxRatio;
6896  paramPtr->Bechvb *= -toxe;
6897 
6898 
6899  paramPtr->mstar = 0.5 + atan(paramPtr->minv) / M_PI;
6900  paramPtr->mstarcv = 0.5 + atan(paramPtr->minvcv) / M_PI;
6903 
6904  paramPtr->ldeb = sqrt(epssub * Vtm0 / (Charge_q
6905  * paramPtr->ndep * 1.0e6)) / 3.0;
6906  paramPtr->acde *= pow((paramPtr->ndep / 2.0e16), -0.25);
6907 
6908 
6909  if (model_.k1Given || model_.k2Given)
6910  {
6911  if (!model_.k1Given)
6912  {
6913  UserWarning(*this) << "k1 should be specified with k2";
6914  paramPtr->k1 = 0.53;
6915  }
6916  if (!model_.k2Given)
6917  {
6918  UserWarning(*this) << "k2 should be specified with k1";
6919  paramPtr->k2 = -0.0186;
6920  }
6921  if (model_.nsubGiven)
6922  {
6923  UserWarning(*this) << "nsub is ignored because k1 or k2 is given";
6924  }
6925  if (model_.xtGiven)
6926  {
6927  UserWarning(*this) << "xt is ignored because k1 or k2 is given";
6928  }
6929  if (model_.vbxGiven)
6930  {
6931  UserWarning(*this) << "vbx is ignored because k1 or k2 is given";
6932  }
6933  if (model_.gamma1Given)
6934  {
6935  UserWarning(*this) << "gamma1 is ignored because k1 or k2 is given";
6936  }
6937  if (model_.gamma2Given)
6938  {
6939  UserWarning(*this) << "gamma2 is ignored because k1 or k2 is given";
6940  }
6941  }
6942  else
6943  {
6944  if (!model_.vbxGiven)
6945  paramPtr->vbx = paramPtr->phi - 7.7348e-4
6946  * paramPtr->ndep * paramPtr->xt * paramPtr->xt;
6947 
6948  if (paramPtr->vbx > 0.0)
6949  paramPtr->vbx = -paramPtr->vbx;
6950  if (paramPtr->vbm > 0.0)
6951  paramPtr->vbm = -paramPtr->vbm;
6952 
6953  if (!model_.gamma1Given)
6954  paramPtr->gamma1 = 5.753e-12
6955  * sqrt(paramPtr->ndep) / model_.coxe;
6956 
6957  if (!model_.gamma2Given)
6958  paramPtr->gamma2 = 5.753e-12
6959  * sqrt(paramPtr->nsub) / model_.coxe;
6960 
6962 
6963  T1 = sqrt(paramPtr->phi - paramPtr->vbx) - paramPtr->sqrtPhi;
6964 
6965  T2 = sqrt(paramPtr->phi * (paramPtr->phi - paramPtr->vbm)) - paramPtr->phi;
6966 
6967  paramPtr->k2 = T0 * T1 / (2.0 * T2 + paramPtr->vbm);
6968 
6969  paramPtr->k1 = paramPtr->gamma2 - 2.0
6970  * paramPtr->k2 * sqrt(paramPtr->phi - paramPtr->vbm);
6971  }
6972 
6973  if (!model_.vfbGiven)
6974  {
6975  if (model_.vth0Given)
6977  - paramPtr->phi - paramPtr->k1
6978  * paramPtr->sqrtPhi;
6979  }
6980  else
6981  {
6982  if ((model_.mtrlMod) && (model_.phigGiven) &&
6983  (model_.nsubGiven))
6984  {
6985  T0 = Vtm0 * log(paramPtr->nsub/ni);
6986  T1 = 0.5 * Eg0;
6987  if(T0 > T1)
6988  T0 = T1;
6989  T2 = model_.easub + T1 + model_.dtype * T0;
6990  paramPtr->vfb = model_.phig - T2;
6991  }
6992  else
6993  {
6994  paramPtr->vfb = -1.0;
6995  }
6996  }
6997  }
6998  if (!model_.vth0Given)
6999  {
7001  + paramPtr->phi + paramPtr->k1
7002  * paramPtr->sqrtPhi);
7003  }
7004 
7005  paramPtr->k1ox = paramPtr->k1 * toxe / model_.toxm;
7006 
7007  tmp = sqrt(epssub / (epsrox * CONSTEPS0)
7008  * toxe * paramPtr->Xdep0);
7009 
7010  T0 = paramPtr->dsub * paramPtr->leff / tmp;
7011  if (T0 < CONSTEXP_THRESHOLD)
7012  {
7013  T1 = exp(T0);
7014  T2 = T1 - 1.0;
7015  T3 = T2 * T2;
7016  T4 = T3 + 2.0 * T1 * CONSTMIN_EXP;
7017  paramPtr->theta0vb0 = T1 / T4;
7018  }
7019  else
7020  {
7021  paramPtr->theta0vb0 = 1.0 / (CONSTMAX_EXP - 2.0);
7022  }
7023 
7024  T0 = paramPtr->drout * paramPtr->leff / tmp;
7025  if (T0 < CONSTEXP_THRESHOLD)
7026  {
7027  T1 = exp(T0);
7028  T2 = T1 - 1.0;
7029  T3 = T2 * T2;
7030  T4 = T3 + 2.0 * T1 * CONSTMIN_EXP;
7031  T5 = T1 / T4;
7032  }
7033  else
7034  T5 = 1.0 / (CONSTMAX_EXP - 2.0); // 3.0 * CONSTMIN_EXP omitted
7035 
7037 
7038  tmp = sqrt(paramPtr->Xdep0);
7039  tmp1 = paramPtr->vbi - paramPtr->phi;
7040  tmp2 = model_.factor1 * tmp;
7041 
7042  T0 = paramPtr->dvt1w * paramPtr->weff * paramPtr->leff / tmp2;
7043 
7044  if (T0 < CONSTEXP_THRESHOLD)
7045  {
7046  T1 = exp(T0);
7047  T2 = T1 - 1.0;
7048  T3 = T2 * T2;
7049  T4 = T3 + 2.0 * T1 * CONSTMIN_EXP;
7050  T8 = T1 / T4;
7051  }
7052  else
7053  {
7054  T8 = 1.0 / (CONSTMAX_EXP - 2.0);
7055  }
7056 
7057  T0 = paramPtr->dvt0w * T8;
7058  T8 = T0 * tmp1;
7059 
7060  T0 = paramPtr->dvt1 * paramPtr->leff / tmp2;
7061  if (T0 < CONSTEXP_THRESHOLD)
7062  {
7063  T1 = exp(T0);
7064  T2 = T1 - 1.0;
7065  T3 = T2 * T2;
7066  T4 = T3 + 2.0 * T1 * CONSTMIN_EXP;
7067  T9 = T1 / T4;
7068  }
7069  else
7070  T9 = 1.0 / (CONSTMAX_EXP - 2.0);
7071  T9 = paramPtr->dvt0 * T9 * tmp1;
7072 
7073  T4 = toxe * paramPtr->phi
7074  / (paramPtr->weff + paramPtr->w0);
7075 
7076  T0 = sqrt(1.0 + paramPtr->lpe0 / paramPtr->leff);
7077  if((model_.tempMod == 1) || (model_.tempMod == 0))
7078  T3 = (paramPtr->kt1 + paramPtr->kt1l / paramPtr->leff)
7079  * (TRatio - 1.0);
7080  if(model_.tempMod == 2)
7081  T3 = - paramPtr->kt1 * (TRatio - 1.0);
7082 
7083  T5 = paramPtr->k1ox * (T0 - 1.0) * paramPtr->sqrtPhi + T3;
7084 
7086  = - T8 - T9 + paramPtr->k3 * T4 + T5 - paramPtr->phi - paramPtr->k1 * paramPtr->sqrtPhi;
7087 
7088  // stress effect
7089 
7090  wlod = model_.wlod;
7091  if (model_.wlod < 0.0)
7092  {
7093  UserWarning(*this) << "WLOD =is less than 0. 0.0 is used";
7094  wlod = 0.0;
7095  }
7096  T0 = pow(Lnew, model_.llodku0);
7097  W_tmp = Wnew + wlod;
7098  T1 = pow(W_tmp, model_.wlodku0);
7099  tmp1 = model_.lku0 / T0 + model_.wku0 / T1
7100  + model_.pku0 / (T0 * T1);
7101  paramPtr->ku0 = 1.0 + tmp1;
7102 
7103  T0 = pow(Lnew, model_.llodvth);
7104  T1 = pow(W_tmp, model_.wlodvth);
7105  tmp1 = model_.lkvth0 / T0 + model_.wkvth0 / T1
7106  + model_.pkvth0 / (T0 * T1);
7107  paramPtr->kvth0 = 1.0 + tmp1;
7109 
7110  T0 = (TRatio - 1.0);
7111  paramPtr->ku0temp = paramPtr->ku0 * (1.0 + model_.tku0 *T0) + DELTA;
7112 
7113  Inv_saref = 1.0/(model_.saref + 0.5*Ldrn);
7114  Inv_sbref = 1.0/(model_.sbref + 0.5*Ldrn);
7115  paramPtr->inv_od_ref = Inv_saref + Inv_sbref;
7117 
7118  } // End of size if-statement
7119 
7120  // stress effect
7121  if( (sa > 0.0) && (sb > 0.0) &&
7122  ((nf == 1.0) || ((nf > 1.0) && (sd > 0.0))) )
7123  {
7124  Inv_sa = 0;
7125  Inv_sb = 0;
7126 
7127  kvsat = model_.kvsat;
7128  if (model_.kvsat < -1.0 )
7129  {
7130  UserWarning(*this) << "KVSAT is too small; -1.0 is used";
7131  kvsat = -1.0;
7132  }
7133  if (model_.kvsat > 1.0)
7134  {
7135  UserWarning(*this) << "KVSAT is too big; 1.0 is used";
7136  kvsat = 1.0;
7137  }
7138 
7139  int i=0;
7140  for(i = 0; i < nf; i++)
7141  {
7142  T0 = 1.0 / nf / (sa + 0.5*Ldrn + i * (sd +Ldrn));
7143  T1 = 1.0 / nf / (sb + 0.5*Ldrn + i * (sd +Ldrn));
7144  Inv_sa += T0;
7145  Inv_sb += T1;
7146  }
7147  Inv_ODeff = Inv_sa + Inv_sb;
7148  rho = model_.ku0 / paramPtr->ku0temp * Inv_ODeff;
7149  T0 = (1.0 + rho)/(1.0 + paramPtr->rho_ref);
7150  u0temp = paramPtr->u0temp * T0;
7151 
7152  T1 = (1.0 + kvsat * rho)/(1.0 + kvsat * paramPtr->rho_ref);
7153  vsattemp = paramPtr->vsattemp * T1;
7154 
7155  OD_offset = Inv_ODeff - paramPtr->inv_od_ref;
7156  dvth0_lod = model_.kvth0 / paramPtr->kvth0 * OD_offset;
7157  dk2_lod = model_.stk2 / pow(paramPtr->kvth0, model_.lodk2) *
7158  OD_offset;
7159  deta0_lod = model_.steta0 / pow(paramPtr->kvth0, model_.lodeta0) *
7160  OD_offset;
7161  vth0 = paramPtr->vth0 + dvth0_lod;
7162 
7163  eta0 = paramPtr->eta0 + deta0_lod;
7164  k2 = paramPtr->k2 + dk2_lod;
7165  }
7166  else
7167  {
7168  u0temp = paramPtr->u0temp;
7169  vth0 = paramPtr->vth0;
7171  eta0 = paramPtr->eta0;
7172  k2 = paramPtr->k2;
7173  }
7174 
7175  // Well Proximity Effect
7176  if (model_.wpemod)
7177  {
7178  if( (!scaGiven) && (!scbGiven) && (!sccGiven) )
7179  {
7180  if((scGiven) && (sc > 0.0) )
7181  {
7182  T1 = sc + Wdrn;
7183  T2 = 1.0 / model_.scref;
7184  sca = model_.scref * model_.scref / (sc * T1);
7185  scb = ( (0.1 * sc + 0.01 * model_.scref)
7186  * exp(-10.0 * sc * T2)
7187  - (0.1 * T1 + 0.01 * model_.scref)
7188  * exp(-10.0 * T1 * T2) ) / Wdrn;
7189  scc = ( (0.05 * sc + 0.0025 * model_.scref)
7190  * exp(-20.0 * sc * T2)
7191  - (0.05 * T1 + 0.0025 * model_.scref)
7192  * exp(-20.0 * T1 * T2) ) / Wdrn;
7193  }
7194  else
7195  {
7196  UserWarning(*this) << "No WPE as none of SCA, SCB, SCC, SC is given and/or SC not positive";
7197  }
7198  }
7199  sceff = sca + model_.web * scb
7200  + model_.wec * scc;
7201  vth0 += paramPtr->kvth0we * sceff;
7202  k2 += paramPtr->k2we * sceff;
7203  T3 = 1.0 + paramPtr->ku0we * sceff;
7204  if (T3 <= 0.0)
7205  {
7206  T3 = 0.0;
7207  UserWarning(*this) << "ku0we = %g is negatively too high. Negative mobility!";
7208  }
7209  u0temp *= T3;
7210  }
7211 
7212  // adding delvto
7213  vth0 += delvto;
7214  vfb = paramPtr->vfb + model_.dtype * delvto;
7215 
7216  // Instance variables calculation
7217  T3 = model_.dtype * vth0
7218  - vfb - paramPtr->phi;
7219  T4 = T3 + T3;
7220  T5 = 2.5 * T3;
7221  vtfbphi1 = (model_.dtype == CONSTNMOS) ? T4 : T5;
7222  if (vtfbphi1 < 0.0)
7223  vtfbphi1 = 0.0;
7224 
7225  vtfbphi2 = 4.0 * T3;
7226  if (vtfbphi2 < 0.0)
7227  vtfbphi2 = 0.0;
7228 
7229  if (k2 < 0.0)
7230  {
7231  T0 = 0.5 * paramPtr->k1 / k2;
7232  vbsc = 0.9 * (paramPtr->phi - T0 * T0);
7233  if (vbsc > -3.0)
7234  vbsc = -3.0;
7235  else if (vbsc < -30.0)
7236  vbsc = -30.0;
7237  }
7238  else
7239  vbsc = -30.0;
7240  if (vbsc > paramPtr->vbm)
7241  vbsc = paramPtr->vbm;
7242  k2ox = k2 * toxe
7243  / model_.toxm;
7244 
7246  + model_.dtype * vth0 ;
7247 
7248  cgso = paramPtr->cgso;
7249  cgdo = paramPtr->cgdo;
7250 
7251  lnl = log(paramPtr->leff * 1.0e6);
7252  lnw = log(paramPtr->weff * 1.0e6);
7253  lnnf = log(nf);
7254 
7255  bodymode = 5;
7256  if( ( !model_.rbps0Given) || ( !model_.rbpd0Given) )
7257  bodymode = 1;
7258  else
7259  if( (!model_.rbsbx0Given && !model_.rbsby0Given) ||
7261  bodymode = 3;
7262 
7263  if(rbodyMod == 2)
7264  {
7265  if (bodymode == 5)
7266  {
7267  rbsbx = exp( log(model_.rbsbx0) + model_.rbsdbxl * lnl +
7268  model_.rbsdbxw * lnw + model_.rbsdbxnf * lnnf );
7269  rbsby = exp( log(model_.rbsby0) + model_.rbsdbyl * lnl +
7270  model_.rbsdbyw * lnw + model_.rbsdbynf * lnnf );
7271  rbsb = rbsbx * rbsby / (rbsbx + rbsby);
7272 
7273 
7274  rbdbx = exp( log(model_.rbdbx0) + model_.rbsdbxl * lnl +
7275  model_.rbsdbxw * lnw + model_.rbsdbxnf * lnnf );
7276  rbdby = exp( log(model_.rbdby0) + model_.rbsdbyl * lnl +
7277  model_.rbsdbyw * lnw + model_.rbsdbynf * lnnf );
7278  rbdb = rbdbx * rbdby / (rbdbx + rbdby);
7279  }
7280 
7281  if ((bodymode == 3)|| (bodymode == 5))
7282  {
7283  rbps = exp( log(model_.rbps0) + model_.rbpsl * lnl +
7284  model_.rbpsw * lnw + model_.rbpsnf * lnnf );
7285  rbpd = exp( log(model_.rbpd0) + model_.rbpdl * lnl +
7286  model_.rbpdw * lnw + model_.rbpdnf * lnnf );
7287  }
7288 
7289  rbpbx = exp( log(model_.rbpbx0) + model_.rbpbxl * lnl +
7290  model_.rbpbxw * lnw + model_.rbpbxnf * lnnf );
7291  rbpby = exp( log(model_.rbpby0) + model_.rbpbyl * lnl +
7292  model_.rbpbyw * lnw + model_.rbpbynf * lnnf );
7293  rbpb = rbpbx*rbpby/(rbpbx + rbpby);
7294  }
7295 
7296 
7297  if ((rbodyMod == 1 ) || ((rbodyMod == 2 ) && (bodymode == 5)) )
7298  {
7299  if (rbdb < 1.0e-3) grbdb = 1.0e3; // in mho
7300  else grbdb = model_.gbmin + 1.0 / rbdb;
7301 
7302  if (rbpb < 1.0e-3) grbpb = 1.0e3;
7303  else grbpb = model_.gbmin + 1.0 / rbpb;
7304 
7305  if (rbps < 1.0e-3) grbps = 1.0e3;
7306  else grbps = model_.gbmin + 1.0 / rbps;
7307 
7308  if (rbsb < 1.0e-3) grbsb = 1.0e3;
7309  else grbsb = model_.gbmin + 1.0 / rbsb;
7310 
7311  if (rbpd < 1.0e-3) grbpd = 1.0e3;
7312  else grbpd = model_.gbmin + 1.0 / rbpd;
7313 
7314  }
7315 
7316  if((rbodyMod == 2) && (bodymode == 3))
7317  {
7318  grbdb = grbsb = model_.gbmin;
7319 
7320  if (rbpb < 1.0e-3) grbpb = 1.0e3;
7321  else grbpb = model_.gbmin + 1.0 / rbpb;
7322 
7323  if (rbps < 1.0e-3) grbps = 1.0e3;
7324  else grbps = model_.gbmin + 1.0 / rbps;
7325 
7326  if (rbpd < 1.0e-3) grbpd = 1.0e3;
7327  else grbpd = model_.gbmin + 1.0 / rbpd;
7328  }
7329 
7330  if((rbodyMod == 2) && (bodymode == 1))
7331  {
7332  grbdb = grbsb = model_.gbmin;
7333  grbps = grbpd = 1.0e3;
7334  if (rbpb < 1.0e-3)
7335  {
7336  grbpb = 1.0e3;
7337  }
7338  else
7339  {
7340  grbpb = model_.gbmin + 1.0 / rbpb;
7341  }
7342  }
7343 
7344  // Process geomertry dependent parasitics
7345  grgeltd = model_.rshg * (xgw
7346  + paramPtr->weffCJ / 3.0 / ngcon) /
7347  (ngcon * nf * (Lnew - model_.xgl));
7348 
7349  if (grgeltd > 0.0)
7350  {
7351  grgeltd = 1.0 / grgeltd;
7352  }
7353  else
7354  {
7355  grgeltd = 1.0e3; // mho
7356  if (rgateMod != 0)
7357  {
7358  UserWarning(*this) << "The gate conductance reset to 1.0e3 mho";
7359  }
7360  }
7361 
7363  DMCIeff = model_.dmci;
7365 
7367  {
7368  if (model_.perMod == 0)
7370  else
7372  }
7373  else
7374  {
7375  PAeffGeo(nf, geoMod, min,
7377  (Pseff), dumPd, dumAs, dumAd);
7378  }
7379 
7380  if (drainPerimeterGiven)
7381  {
7382  if (model_.perMod == 0)
7384  else
7386  }
7387  else
7388  {
7389  PAeffGeo(nf, geoMod, min,
7391  dumPs, (Pdeff), dumAs, dumAd);
7392  }
7393 
7394  if (sourceAreaGiven)
7395  Aseff = sourceArea;
7396  else
7397  PAeffGeo(nf, geoMod, min,
7399  dumPs, dumPd, (Aseff), dumAd);
7400 
7401  if (drainAreaGiven)
7402  Adeff = drainArea;
7403  else
7404  PAeffGeo(nf, geoMod, min,
7406  dumPs, dumPd, dumAs, (Adeff));
7407 
7408  // Processing S/D resistance and conductance below
7410  {
7411  sourceConductance = 0.0;
7412  if(sourceSquaresGiven)
7413  {
7415  }
7416  else if (rgeoMod > 0)
7417  {
7418  RdseffGeo(nf, geoMod,
7419  rgeoMod, min,
7422  }
7423  else
7424  {
7425  sourceConductance = 0.0;
7426  }
7427 
7428  if (sourceConductance > 0.0)
7429  {
7431  }
7432  else
7433  {
7434  sourceConductance = 1.0e3; // mho
7435  UserWarning(*this) << "Source conductance reset to 1.0e3 mho";
7436  }
7437  }
7438  else
7439  {
7440  sourceConductance = 0.0;
7441  }
7442 
7444  {
7445  drainConductance = 0.0;
7446  if(drainSquaresGiven)
7447  {
7449  }
7450  else if (rgeoMod > 0)
7451  {
7455  }
7456  else
7457  {
7458  drainConductance = 0.0;
7459  }
7460 
7461  if (drainConductance > 0.0)
7462  {
7464  }
7465  else
7466  {
7467  drainConductance = 1.0e3; // mho
7468  UserWarning(*this) << "Drain conductance reset to 1.0e3 mho";
7469  }
7470  }
7471  else
7472  {
7473  drainConductance = 0.0;
7474  }
7475 
7476  // End of Rsd processing
7477 
7478  Nvtms = model_.vtm * model_.SjctEmissionCoeff;
7479  if ((Aseff <= 0.0) && (Pseff <= 0.0))
7480  {
7481  SourceSatCurrent = 1.0e-14;
7482  }
7483  else
7484  {
7485  SourceSatCurrent = Aseff * model_.SjctTempSatCurDensity
7487  + paramPtr->weffCJ * nf
7489  }
7490 
7491  if (SourceSatCurrent > 0.0)
7492  {
7493  switch(model_.dioMod)
7494  {
7495  case 0:
7496  if ((model_.bvs / Nvtms) > CONSTEXP_THRESHOLD)
7498  else
7499  XExpBVS = model_.xjbvs * exp(-model_.bvs / Nvtms);
7500  break;
7501  case 1:
7502  DioIjthVjmEval(Nvtms, model_.ijthsfwd, SourceSatCurrent,
7503  0.0, (vjsmFwd));
7504  IVjsmFwd = SourceSatCurrent * exp(vjsmFwd / Nvtms);
7505  break;
7506  case 2:
7507  if ((model_.bvs / Nvtms) > CONSTEXP_THRESHOLD)
7508  {
7510  tmp = CONSTMIN_EXP;
7511  }
7512  else
7513  {
7514  XExpBVS = exp(-model_.bvs / Nvtms);
7515  tmp = XExpBVS;
7516  XExpBVS *= model_.xjbvs;
7517  }
7518 
7519  DioIjthVjmEval(Nvtms, model_.ijthsfwd, SourceSatCurrent,
7520  XExpBVS, (vjsmFwd));
7521  T0 = exp(vjsmFwd / Nvtms);
7522  IVjsmFwd = SourceSatCurrent * (T0 - XExpBVS / T0
7523  + XExpBVS - 1.0);
7524  SslpFwd = SourceSatCurrent
7525  * (T0 + XExpBVS / T0) / Nvtms;
7526 
7527  T2 = model_.ijthsrev / SourceSatCurrent;
7528  if (T2 < 1.0)
7529  {
7530  T2 = 10.0;
7531  UserWarning(*this) << "ijthsrev too small and set to 10 times IsbSat";
7532  }
7533  vjsmRev = -model_.bvs
7534  - Nvtms * log((T2 - 1.0) / model_.xjbvs);
7535  T1 = model_.xjbvs * exp(-(model_.bvs
7536  + vjsmRev) / Nvtms);
7537  IVjsmRev = SourceSatCurrent * (1.0 + T1);
7538  SslpRev = -SourceSatCurrent * T1 / Nvtms;
7539  break;
7540  default:
7541  UserError(*this) << "Specified dioMod not matched. dioMod = " << model_.dioMod;
7542  }
7543  }
7544 
7545  Nvtmd = model_.vtm * model_.DjctEmissionCoeff;
7546  if ((Adeff <= 0.0) && (Pdeff <= 0.0))
7547  {
7548  DrainSatCurrent = 1.0e-14;
7549  }
7550  else
7551  {
7552  DrainSatCurrent = Adeff * model_.DjctTempSatCurDensity
7554  + paramPtr->weffCJ * nf
7556  }
7557 
7558  if (DrainSatCurrent > 0.0)
7559  {
7560  switch(model_.dioMod)
7561  {
7562  case 0:
7563  if ((model_.bvd / Nvtmd) > CONSTEXP_THRESHOLD)
7565  else
7566  XExpBVD = model_.xjbvd * exp(-model_.bvd / Nvtmd);
7567  break;
7568  case 1:
7569  DioIjthVjmEval(Nvtmd, model_.ijthdfwd, DrainSatCurrent,
7570  0.0, (vjdmFwd));
7571  IVjdmFwd = DrainSatCurrent * exp(vjdmFwd / Nvtmd);
7572  break;
7573  case 2:
7574  if ((model_.bvd / Nvtmd) > CONSTEXP_THRESHOLD)
7576  tmp = CONSTMIN_EXP;
7577  }
7578  else
7579  { XExpBVD = exp(-model_.bvd / Nvtmd);
7580  tmp = XExpBVD;
7581  XExpBVD *= model_.xjbvd;
7582  }
7583 
7584  DioIjthVjmEval(Nvtmd, model_.ijthdfwd, DrainSatCurrent,
7585  XExpBVD, (vjdmFwd));
7586  T0 = exp(vjdmFwd / Nvtmd);
7587  IVjdmFwd = DrainSatCurrent * (T0 - XExpBVD / T0 + XExpBVD - 1.0);
7588  DslpFwd = DrainSatCurrent * (T0 + XExpBVD / T0) / Nvtmd;
7589 
7590  T2 = model_.ijthdrev / DrainSatCurrent;
7591  if (T2 < 1.0)
7592  {
7593  T2 = 10.0;
7594  UserWarning(*this) << "ijthdrev too small and set to 10 times IdbSat";
7595  }
7596  vjdmRev = -model_.bvd
7597  - Nvtmd * log((T2 - 1.0) / model_.xjbvd); // bugfix
7598  T1 = model_.xjbvd * exp(-(model_.bvd
7599  + vjdmRev) / Nvtmd);
7600  IVjdmRev = DrainSatCurrent * (1.0 + T1);
7601  DslpRev = -DrainSatCurrent * T1 / Nvtmd;
7602  break;
7603  default:
7604  UserError(*this) << "Specified dioMod not matched. dioMod = " << model_.dioMod;
7605  }
7606  }
7607 
7608  // GEDL current reverse bias
7609  T0 = (TRatio - 1.0);
7610  model_.njtsstemp = model_.njts * (1.0 + model_.tnjts * T0);
7613  model_.njtsdtemp = model_.njtsd * (1.0 + model_.tnjtsd * T0);
7616 
7617  T7 = Eg0 / model_.vtm * T0;
7618 
7619  T9 = model_.xtss * T7;
7620  DEXP2(T9, T1);
7621  T9 = model_.xtsd * T7;
7622  DEXP2(T9, T2);
7623  T9 = model_.xtssws * T7;
7624  DEXP2(T9, T3);
7625  T9 = model_.xtsswd * T7;
7626  DEXP2(T9, T4);
7627  T9 = model_.xtsswgs * T7;
7628  DEXP2(T9, T5);
7629  T9 = model_.xtsswgd * T7;
7630  DEXP2(T9, T6);
7631 
7632  T10 = paramPtr->weffCJ * nf;
7637  SswgTempRevSatCur = T5 * T10 * model_.jtsswgs;
7638  DswgTempRevSatCur = T6 * T10 * model_.jtsswgd;
7639 
7640  if(model_.mtrlMod)
7641  {
7642  /* Calculate TOXP from EOT */
7643 
7644  /* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */
7645  tmp2 = vfb + paramPtr->phi;
7646  vddeot = model_.dtype * model_.vddeot;
7648  if ((paramPtr->ngate > 1.0e18) && (paramPtr->ngate < 1.0e25)
7649  && (vddeot > tmp2) && (T0!=0))
7650  {
7651  T1 = 1.0e6 * CONSTQ * T0 * paramPtr->ngate /
7652  (model_.coxe * model_.coxe);
7653  T8 = vddeot - tmp2;
7654  T4 = sqrt(1.0 + 2.0 * T8 / T1);
7655  T2 = 2.0 * T8 / (T4 + 1.0);
7656  T3 = 0.5 * T2 * T2 / T1;
7657  T7 = 1.12 - T3 - 0.05;
7658  T6 = sqrt(T7 * T7 + 0.224);
7659  T5 = 1.12 - 0.5 * (T7 + T6);
7660  Vgs_eff = vddeot - T5;
7661  }
7662  else
7663  Vgs_eff = vddeot;
7664 
7665  /* Calculate Vth @ Vds=Vbs=0 */
7666  V0 = paramPtr->vbi - paramPtr->phi;
7667  lt1 = model_.factor1* paramPtr->sqrtXdep0;
7668  ltw = lt1;
7669  T0 = paramPtr->dvt1 * paramPtr->leff / lt1;
7670  if (T0 < CONSTEXP_THRESHOLD)
7671  {
7672  T1 = exp(T0);
7673  T2 = T1 - 1.0;
7674  T3 = T2 * T2;
7675  T4 = T3 + 2.0 * T1 * CONSTMIN_EXP;
7676  Theta0 = T1 / T4;
7677  }
7678  else
7679  Theta0 = 1.0 / (CONSTMAX_EXP - 2.0);
7680  Delt_vth = paramPtr->dvt0 * Theta0 * V0;
7681  T0 = paramPtr->dvt1w * paramPtr->weff * paramPtr->leff / ltw;
7682  if (T0 < CONSTEXP_THRESHOLD)
7683  { T1 = exp(T0);
7684  T2 = T1 - 1.0;
7685  T3 = T2 * T2;
7686  T4 = T3 + 2.0 * T1 * CONSTMIN_EXP;
7687  T5 = T1 / T4;
7688  }
7689  else
7690  T5 = 1.0 / (CONSTMAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */
7691  T2 = paramPtr->dvt0w * T5 * V0;
7692  TempRatio = temp / model_.tnom - 1.0;
7693  T0 = sqrt(1.0 + paramPtr->lpe0 / paramPtr->leff);
7694  T1 = paramPtr->k1ox * (T0 - 1.0) * paramPtr->sqrtPhi
7695  + (paramPtr->kt1 + paramPtr->kt1l / paramPtr->leff) * TempRatio;
7696  Vth_NarrowW = toxe * paramPtr->phi
7697  / (paramPtr->weff + paramPtr->w0);
7698  Lpe_Vb = sqrt(1.0 + paramPtr->lpeb / paramPtr->leff);
7699  Vth = model_.dtype * vth0 +
7700  (paramPtr->k1ox - paramPtr->k1)*paramPtr->sqrtPhi*Lpe_Vb
7701  - Delt_vth - T2 + paramPtr->k3 * Vth_NarrowW + T1;
7702 
7703  /* Calculate n */
7704  tmp1 = epssub / paramPtr->Xdep0;
7705  nstar = model_.vtm / Charge_q *
7706  (model_.coxe + tmp1 + paramPtr->cit);
7707  tmp2 = paramPtr->nfactor * tmp1;
7708  tmp3 = (tmp2 + paramPtr->cdsc * Theta0 + paramPtr->cit) / model_.coxe;
7709  if (tmp3 >= -0.5)
7710  n = 1.0 + tmp3;
7711  else
7712  {
7713  T0 = 1.0 / (3.0 + 8.0 * tmp3);
7714  n = (1.0 + 3.0 * tmp3) * T0;
7715  }
7716 
7717  /* Vth correction for Pocket implant */
7718  if (paramPtr->dvtp0 > 0.0)
7719  {
7720  T3 = paramPtr->leff + paramPtr->dvtp0 * 2.0;
7721  if (model_.tempMod < 2)
7722  T4 = model_.vtm * log(paramPtr->leff / T3);
7723  else
7724  T4 = model_.vtm0 * log(paramPtr->leff / T3);
7725  Vth -= n * T4;
7726  }
7727  Vgsteff = Vgs_eff-Vth;
7728  /* calculating Toxp */
7729  niter = 0;
7730  toxpf = toxe;
7731  do
7732  {
7733  toxpi = toxpf;
7734  tmp2 = 2.0e8 * toxpf;
7735  T0 = (Vgsteff + vtfbphi2) / tmp2;
7736  T1 = 1.0 + exp(model_.bdos * 0.7 * log(T0));
7737  Tcen = model_.ados * 1.9e-9 / T1;
7738  toxpf = toxe - epsrox/model_.epsrsub * Tcen;
7739  niter++;
7740  } while ((niter<=4)&&(fabs(toxpf-toxpi)>1e-12));
7741  model_.toxp = toxpf;
7742  model_.coxp = epsrox * CONSTEPS0 / model_.toxp;
7743  }
7744 
7745 #if 0
7746  if (checkModel(model, here, ckt))
7747  { IFuid namarray[2];
7748  namarray[0] = model_.name;
7749  namarray[1] = name;
7750  (*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during .5.0 parameter checking for %s in model %s", namarray);
7751  return(E_BADPARM);
7752  }
7753 #endif
7754 
7755  ///////////////////////////////////////////////////////////////////////////////
7756 
7757  updateTemperatureCalled_ = true;
7758 
7759  return bsuccess;
7760 }
7761 
7762 //-----------------------------------------------------------------------------
7763 // Function : Instance::updateIntermediateVars
7764 // Purpose :
7765 // Special Notes :
7766 // Scope : public
7767 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
7768 // Creation Date : 11/25/06
7769 //-----------------------------------------------------------------------------
7771 {
7772  bool bsuccess = true;
7773 
7774  // begin the b4ld.c parameters:
7775  double dgstot_dvd(0.0), dgstot_dvg(0.0), dgstot_dvs(0.0), dgstot_dvb(0.0);
7776  double dgdtot_dvd(0.0), dgdtot_dvg(0.0), dgdtot_dvs(0.0), dgdtot_dvb(0.0);
7777  double Rs(0.0), Rd(0.0);
7778  double dRs_dvg(0.0), dRd_dvg(0.0), dRs_dvb(0.0), dRd_dvb(0.0);
7779  double dT0_dvg(0.0), dT1_dvb(0.0), dT3_dvg(0.0), dT3_dvb(0.0);
7780 
7781  double vgd_old(0.0), vsbd_old(0.0), vsbd(0.0);
7782  double SourceSatCurrent(0.0), DrainSatCurrent(0.0);
7783  double VgstNVt(0.0), ExpVgst(0.0);
7784  double czbd(0.0), czbdsw(0.0), czbdswg(0.0),
7785  czbs(0.0), czbssw(0.0), czbsswg(0.0);
7786  double evbd(0.0), evbs(0.0), arg(0.0), sarg(0.0);
7787  double Vfbeff(0.0), dVfbeff_dVg(0.0), dVfbeff_dVb(0.0), V3(0.0), V4(0.0);
7788  double MJD(0.0), MJSWD(0.0), MJSWGD(0.0);
7789  double MJS(0.0), MJSWS(0.0), MJSWGS(0.0);
7790  double Ggidld(0.0), Ggidlg(0.0), Ggidlb(0.0);
7791  double Voxacc(0.0), dVoxacc_dVg(0.0), dVoxacc_dVb(0.0);
7792  double Voxdepinv(0.0);
7793  double dVoxdepinv_dVg(0.0), dVoxdepinv_dVd(0.0), dVoxdepinv_dVb(0.0);
7794  double VxNVt(0.0), ExpVxNVt(0.0);
7795  double Vaux(0.0), dVaux_dVg(0.0), dVaux_dVd(0.0), dVaux_dVb(0.0);
7796  double Igc(0.0), dIgc_dVg(0.0), dIgc_dVd(0.0), dIgc_dVb(0.0);
7797  double dIgcs_dVg(0.0), dIgcs_dVd(0.0), dIgcs_dVb(0.0);
7798  double dIgcd_dVg(0.0), dIgcd_dVd(0.0), dIgcd_dVb(0.0);
7799  double dIgs_dVg(0.0), dIgs_dVs(0.0), dIgd_dVg(0.0), dIgd_dVd(0.0);
7800  double Igbacc(0.0), dIgbacc_dVg(0.0);
7801  double dIgbacc_dVb(0.0);
7802  double Igbinv(0.0), dIgbinv_dVg(0.0), dIgbinv_dVd(0.0), dIgbinv_dVb(0.0);
7803  double Pigcd(0.0), dPigcd_dVg(0.0), dPigcd_dVd(0.0), dPigcd_dVb(0.0);
7804 
7805  double Vgs_eff(0.0), Vfb(0.0);
7806  double Vth_NarrowW(0.0);
7807  double Phis(0.0), dPhis_dVb(0.0), sqrtPhis(0.0), dsqrtPhis_dVb(0.0);
7808  double Vth(0.0), dVth_dVb(0.0), dVth_dVd(0.0);
7809  double Vgst(0.0), dVgst_dVg(0.0), dVgst_dVb(0.0), dVgs_eff_dVg(0.0);
7810  double Nvtms(0.0), Nvtmd(0.0);
7811  double Vtm(0.0), Vtm0(0.0);
7812  double n(0.0), dn_dVb(0.0), dn_dVd(0.0), voffcv (0.0);
7813  double noff(0.0), dnoff_dVd(0.0), dnoff_dVb(0.0);
7814  double CoxWLcen(0.0), QovCox(0.0), LINK(0.0), V0(0.0);
7815  double DeltaPhi(0.0), dDeltaPhi_dVg(0.0), VgDP(0.0), dVgDP_dVg(0.0);
7816  double Cox(0.0), Tox(0.0);
7817  double Tcen(0.0), dTcen_dVg(0.0), dTcen_dVd(0.0), dTcen_dVb(0.0);
7818  double Ccen(0.0);
7819  double Coxeff(0.0), dCoxeff_dVd(0.0), dCoxeff_dVg(0.0), dCoxeff_dVb(0.0);
7820  double Denomi(0.0), dDenomi_dVg(0.0), dDenomi_dVd(0.0), dDenomi_dVb(0.0);
7821  double dueff_dVg(0.0), dueff_dVd(0.0), dueff_dVb(0.0);
7822  double Esat(0.0);
7823  double Vdsat(0.0);
7824  double dEsatL_dVg(0.0), dEsatL_dVd(0.0), dEsatL_dVb(0.0);
7825  double dVdsat_dVg(0.0), dVdsat_dVb(0.0);
7826  double dVdsat_dVd(0.0), Vasat(0.0), dAlphaz_dVg(0.0), dAlphaz_dVb(0.0);
7827  double dVasat_dVg(0.0), dVasat_dVb(0.0);
7828  double dVasat_dVd(0.0), Va(0.0), dVa_dVd(0.0), dVa_dVg(0.0), dVa_dVb(0.0);
7829  double Vbseff(0.0), dVbseff_dVb(0.0), VbseffCV(0.0), dVbseffCV_dVb(0.0);
7830  double Arg1(0.0), One_Third_CoxWL(0.0), Two_Third_CoxWL(0.0), Alphaz(0.0);
7831 
7832  double T0,dT0_dVg(0.0), dT0_dVd(0.0), dT0_dVb(0.0);
7833  double T1,dT1_dVg(0.0), dT1_dVd(0.0), dT1_dVb(0.0);
7834 
7835  double T2(0.0), dT2_dVg(0.0), dT2_dVd(0.0), dT2_dVb(0.0);
7836  double T3(0.0), dT3_dVg(0.0), dT3_dVd(0.0), dT3_dVb(0.0);
7837  double T4(0.0), dT4_dVd(0.0), dT4_dVb(0.0);
7838  double T5(0.0), dT5_dVg(0.0), dT5_dVd(0.0), dT5_dVb(0.0);
7839  double T6(0.0), dT6_dVg(0.0), dT6_dVd(0.0), dT6_dVb(0.0);
7840  double T7(0.0), dT7_dVg(0.0), dT7_dVd(0.0), dT7_dVb(0.0);
7841  double T8(0.0), dT8_dVg(0.0), dT8_dVd(0.0), dT8_dVb(0.0);
7842  double T9(0.0), dT9_dVg(0.0), dT9_dVd(0.0), dT9_dVb(0.0);
7843  double T10(0.0), dT10_dVg(0.0), dT10_dVb(0.0), dT10_dVd(0.0);
7844  double T11(0.0), T12(0.0), T13(0.0), T14(0.0);
7845  double tmp(0.0);
7846  double dAbulk_dVb(0.0), Abulk0(0.0), dAbulk0_dVb(0.0);
7847  double Cclm(0.0), dCclm_dVg(0.0), dCclm_dVd(0.0), dCclm_dVb(0.0);
7848  double FP(0.0), dFP_dVg(0.0);
7849  double PvagTerm(0.0), dPvagTerm_dVg(0.0);
7850  double dPvagTerm_dVd(0.0), dPvagTerm_dVb(0.0);
7851  double VADITS(0.0), dVADITS_dVg(0.0), dVADITS_dVd(0.0);
7852  double Lpe_Vb(0.0);
7853  double dDITS_Sft_dVb(0.0), dDITS_Sft_dVd(0.0);
7854  double VACLM(0.0), dVACLM_dVg(0.0), dVACLM_dVd(0.0), dVACLM_dVb(0.0);
7855  double VADIBL(0.0), dVADIBL_dVg(0.0), dVADIBL_dVd(0.0), dVADIBL_dVb(0.0);
7856  double Xdep(0.0), dXdep_dVb(0.0);
7857  double lt1(0.0), dlt1_dVb(0.0), ltw(0.0), dltw_dVb(0.0);
7858  double Delt_vth(0.0), dDelt_vth_dVb(0.0);
7859  double Theta0(0.0), dTheta0_dVb(0.0);
7860 
7861  double TempRatio(0.0), tmp1(0.0), tmp2(0.0), tmp3(0.0), tmp4(0.0);
7862  double DIBL_Sft(0.0), dDIBL_Sft_dVd(0.0);
7863  double Lambda(0.0), dLambda_dVg(0.0);
7864  double a1(0.0);
7865 
7866  double dVgsteff_dVg(0.0), dVgsteff_dVd(0.0), dVgsteff_dVb(0.0);
7867  double dVdseff_dVg(0.0), dVdseff_dVd(0.0), dVdseff_dVb(0.0);
7868  double VdseffCV(0.0),
7869  dVdseffCV_dVg(0.0), dVdseffCV_dVd(0.0), dVdseffCV_dVb(0.0);
7870  double diffVds(0.0);
7871  double dAbulk_dVg(0.0);
7872  double beta(0.0), dbeta_dVg(0.0), dbeta_dVd(0.0), dbeta_dVb(0.0);
7873  double gche(0.0), dgche_dVg(0.0), dgche_dVd(0.0), dgche_dVb(0.0);
7874  double fgche1(0.0), dfgche1_dVg(0.0), dfgche1_dVd(0.0), dfgche1_dVb(0.0);
7875  double fgche2(0.0), dfgche2_dVg(0.0), dfgche2_dVd(0.0), dfgche2_dVb(0.0);
7876  double Idl(0.0), dIdl_dVg(0.0), dIdl_dVd(0.0), dIdl_dVb(0.0);
7877  double Idsa(0.0), dIdsa_dVg(0.0), dIdsa_dVd(0.0), dIdsa_dVb(0.0);
7878  double Ids(0.0), Gmb(0.0);
7879  double devbs_dvb(0.0), devbd_dvb(0.0);
7880  double Isub(0.0), Gbd(0.0), Gbg(0.0), Gbb(0.0), Gds(0.0);
7881  double VASCBE(0.0), dVASCBE_dVg(0.0), dVASCBE_dVd(0.0), dVASCBE_dVb(0.0);
7882  double CoxeffWovL(0.0);
7883  double Rds(0.0), dRds_dVg(0.0), dRds_dVb(0.0), WVCox(0.0), WVCoxRds(0.0);
7884  double Vgst2Vtm(0.0), VdsatCV(0.0);
7885  double Leff(0.0), Weff(0.0), dWeff_dVg(0.0), dWeff_dVb(0.0);
7886  double AbulkCV(0.0), dAbulkCV_dVb(0.0);
7887 
7888  double Cgg1(0.0), Cgb1(0.0), Cgd1(0.0), Cbg1(0.0), Cbb1(0.0), Cbd1(0.0);
7889  double Qac0(0.0), Qsub0(0.0);
7890  double dQac0_dVg(0.0), dQac0_dVb(0.0);
7891  double dQsub0_dVg(0.0), dQsub0_dVd(0.0), dQsub0_dVb(0.0);
7892  double Ggislg(0.0), Ggislb(0.0), Ggisls(0.0);
7893  double Nvtmrss(0.0), Nvtmrssws(0.0), Nvtmrsswgs(0.0);
7894  double Nvtmrsd(0.0), Nvtmrsswd(0.0), Nvtmrsswgd(0.0);
7895 
7896  double vs(0.0), Fsevl(0.0);
7897  double dvs_dVg(0.0), dvs_dVd(0.0), dvs_dVb(0.0), dFsevl_dVg(0.0);
7898  double dFsevl_dVd(0.0), dFsevl_dVb(0.0);
7899  double vgdx(0.0), vgsx(0.0),epssub(0.0),toxe(0.0),epsrox(0.0);
7900  double von_local(0.0);
7901 
7902  // end b4ld.c parameters
7903 
7904  ScalingFactor = 1.0e-9;
7905 
7906  // Don't do charge computations in DC sweeps.
7907  if (getSolverState().tranopFlag || getSolverState().acopFlag || getSolverState().transientFlag)
7908  {
7909  ChargeComputationNeeded = true;
7910  }
7911  else
7912  {
7913  ChargeComputationNeeded = false;
7914  }
7915 
7916 #ifdef Xyce_DEBUG_DEVICE
7917  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
7918  {
7919  Xyce::dout() << subsection_divider << std::endl;
7920  Xyce::dout() << " Instance::updateIntermediateVars\n";
7921  Xyce::dout() << " name = " << getName();
7922  Xyce::dout() << " model name = " << model_.getName();
7923  Xyce::dout() <<" dtype is " << model_.dtype << std::endl;
7924  Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
7925  Xyce::dout() << " " << std::endl;
7926  }
7927 #endif
7928 
7929  int Check = 0;
7930  int Check1 = 0;
7931  int Check2 = 0;
7932 
7933  limitedFlag=false;
7934 
7935  // The first block of code in b4ld.c basically sets up, locally,
7936  // what the load function should use as values for the various solution
7937  // variables. There is a series of IF statements which are dependent
7938  // upon the mode. (transient, initializing transient, operating point,
7939  // small signal, etc.). Xyce treats the operating point and transient
7940  // calculation in the same way, from the device's point of view, and
7941  // we don't support any of the other modes. Therefore most of these
7942  // mode options are not here - only the transient mode stuff.
7943 
7944  // First get some of the needed solution variables:
7945  Vd = 0.0;
7946  Vs = 0.0;
7947  Vb = 0.0;
7948  Vsp = 0.0;
7949  Vdp = 0.0;
7950  Vgp = 0.0;
7951  Vbp = 0.0;
7952  Vge = 0.0;
7953  Vgm = 0.0;
7954  Vdb = 0.0;
7955  Vsb = 0.0;
7956  Qtotal = 0.0;
7957 
7963 
7967 
7968  if (li_GateMid >= 0) // only true for rgateMod==3
7969  {
7971  }
7972 
7975 
7976  if (trnqsMod)
7977  {
7979  }
7980  else
7981  {
7982  Qtotal = 0.0;
7983  }
7984 
7985  Vddp = Vd - Vdp;
7986  Vssp = Vs - Vsp;
7987  //Vbsp = Vb - Vsp;
7988  //Vbdp = Vb - Vdp;
7989  //Vgsp = Vg - Vsp;
7990  //Vgdp = Vg - Vdp;
7991  //Vgb = Vg - Vb;
7992 
7993  //Vdpsp = Vdp - Vsp;
7994 
7995  // substrate network:
7996  Vdbb = Vdb - Vb;
7997  Vdbbp = Vdb - Vbp;
7998  Vsbb = Vsb - Vb;
7999  Vsbbp = Vsb - Vbp;
8000  Vbpb = Vbp - Vb;
8001 
8002  // modified from b4ld:
8003  vds = model_.dtype * (Vdp - Vsp);
8004  vgs = model_.dtype * (Vgp - Vsp);
8005  vbs = model_.dtype * (Vbp - Vsp);
8006  vges = model_.dtype * (Vge - Vsp);
8007  vgms = model_.dtype * (Vgm - Vsp);
8008  vdbs = model_.dtype * (Vdb - Vsp);
8009  vsbs = model_.dtype * (Vsb - Vsp);
8010  vses = model_.dtype * (Vs - Vsp);
8011  vdes = model_.dtype * (Vd - Vsp);
8012  qdef = model_.dtype * (Qtotal);
8013 
8014  vbd = vbs - vds;
8015  vdbd = vdbs - vds;
8016  vgd = vgs - vds;
8017  vged = vges - vds;
8018  vgmd = vgms - vds;
8019  vgmb = vgms - vbs;
8020  vdbd = vdbs - vds;
8021 
8022  vbs_jct = (!rbodyMod) ? vbs : vsbs;
8023  vbd_jct = (!rbodyMod) ? vbd : vdbd;
8024 
8025  // Set up the linear resistors. Use type to "un-type" them:
8026  // Vgegp = model_.dtype *(vges-vgs);
8027  // Vgegm = model_.dtype *(vges-vgms);
8028  // Vgmgp = Vgegp-Vgegm;
8029  Vgegp = Vge - Vgp;
8030  Vgegm = Vge - Vgm;
8031  Vgmgp = Vgm - Vgp;
8032 
8033  origFlag = 1;
8034 
8035  vbd_orig = vbd;
8036  vbs_orig = vbs;
8037  vgs_orig = vgs;
8038  vds_orig = vds;
8039  vgd_orig = vgd;
8040  vges_orig = vges;
8041  vgms_orig = vgms;
8042  vdes_orig = vdes;
8043  vses_orig = vses;
8044  vdbs_orig = vdbs;
8045  vsbs_orig = vsbs;
8046  vdbd_orig = vdbd;
8047  vged_orig = vged;
8048  vgmd_orig = vgmd;
8051  vgmb_orig = vgmb;
8052  vgb_orig = vgb;
8053 
8054  Vgegp_orig = Vgegp;
8055  Vgegm_orig = Vgegm;
8056  Vgmgp_orig = Vgmgp;
8057 
8058  // What follows is a block of code designed to impose some limits,
8059  // or initial conditions on the junction voltages. Initial conditions
8060  // should only be imposed on the first Newton step of an operating point.
8061  //
8062  // The first possible limit on the junction voltages has to do with
8063  // limiting the percent change of junction voltages between Newton
8064  // iterations. The second has to do with avoiding extra floating point
8065  // operations in the event that the device has in some sense converged
8066  // (aka BYPASS). Although the primary point of BYPASS is to reduce
8067  // neccessary work, it also seems to reduce the number of Newton iterations.
8068  //
8069  // NOTE: We do not support BYPASS.
8070  //
8071  // The "old" variables should be the values for the previous
8072  // Newton iteration, if indeed there was a previous Newton
8073  // iteration. If not, just set the old values equal to
8074  // the current ones.
8075  //
8076 
8077  // set an initial condition if appropriate:
8079  {
8081  {
8082  N_LAS_Vector * flagSolVectorPtr = extData.flagSolVectorPtr;
8083  if ((*flagSolVectorPtr)[li_Drain] == 0 ||
8084  (*flagSolVectorPtr)[li_GateExt] == 0 ||
8085  (*flagSolVectorPtr)[li_Source] == 0 ||
8086  (*flagSolVectorPtr)[li_Body] == 0 ||
8087  (*flagSolVectorPtr)[li_DrainPrime] == 0 ||
8088  (*flagSolVectorPtr)[li_GatePrime] == 0 ||
8089  (*flagSolVectorPtr)[li_GateMid] == 0 ||
8090  (*flagSolVectorPtr)[li_SourcePrime] == 0 ||
8091  (*flagSolVectorPtr)[li_BodyPrime] == 0 ||
8092  (*flagSolVectorPtr)[li_DrainBody] == 0 ||
8093  (*flagSolVectorPtr)[li_SourceBody] == 0 ||
8094  (*flagSolVectorPtr)[li_Charge] == 0 )
8095  {
8096  vds = 0.1;
8097  vdes = 0.11;
8098  vses = -0.01;
8099  vgs = vges = vgms = model_.dtype * vth0 + 0.1;
8100  origFlag = 0;
8101  }
8102  }
8103  else
8104  {
8105  vds = 0.1;
8106  vdes = 0.11;
8107  vses = -0.01;
8108  vgs = vges = vgms = model_.dtype * vth0 + 0.1;
8109  origFlag = 0;
8110  }
8111  vbs = vdbs = vsbs = 0.0;
8112  vbd = vbs - vds;
8113  vdbd = vdbs - vds;
8114  vgd = vgs - vds;
8115  vged = vges-vds;
8116  vgmd = vgms-vds;
8117  //origFlag = 0;
8118  }
8119  else if ((getSolverState().initFixFlag || getSolverState().initJctFlag) && OFF)
8120  {
8121  vds = vgs = vbs = vges = vgms = 0.0;
8122  vds = vsbs = vdes = vses = qdef = 0.0;
8123  }
8124 
8125 
8126  if (getSolverState().newtonIter == 0)
8127  {
8128  newtonIterOld = 0;
8129 
8131  // ie, first newton step of a transient time step or DCOP continuation step.
8132  {
8146  von_local = (extData.currStoVectorRawPtr)[li_store_von];
8147  }
8148  else
8149  { // no history
8150  vbd_old = vbd;
8151  vbs_old = vbs;
8152  vgs_old = vgs;
8153  vds_old = vds;
8154  vges_old = vges;
8155  vgms_old = vgms;
8156  vdes_old = vdes;
8157  vses_old = vses;
8158  vdbs_old = vdbs;
8159  vsbs_old = vsbs;
8160  vdbd_old = vdbd;
8161  vged_old = vged;
8162  vgmd_old = vgmd;
8163  von_local = 0.0;
8164  }
8165  }
8166  else
8167  {
8181  von_local = (extData.nextStoVectorRawPtr)[li_store_von];
8182  }
8183 
8184  vgd_old = vgs_old - vds_old;
8185 
8186  // This next block performs checks on the junction voltages and
8187  // imposes limits on them if they are too big.
8188  // Note: In the level=1 von is multiplied by dtype. Here it is not. They
8189  // are both right.
8190 
8192  {
8193 
8194 #ifdef Xyce_DEBUG_DEVICE
8196  {
8197  Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
8198  Xyce::dout() << " von_local = " << von_local << std::endl;
8199  Xyce::dout() << " CONSTvt0 = " << CONSTvt0 << std::endl;
8200  Xyce::dout() << " vcrit = " << model_.vcrit << std::endl;
8201  Xyce::dout().width(3);
8202  Xyce::dout() << getSolverState().newtonIter;
8203  Xyce::dout().width(5);Xyce::dout() << getName();
8204  Xyce::dout() << " old :";
8205  Xyce::dout()<<" vgs:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8206  Xyce::dout() << vgs_old;
8207  Xyce::dout()<<" vds:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8208  Xyce::dout() << vds_old;
8209  Xyce::dout()<<" vbs:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8210  Xyce::dout() << vbs_old;
8211  Xyce::dout()<<" vbd:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8212  Xyce::dout() << vbd_old;
8213  Xyce::dout()<<" vges:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8214  Xyce::dout() << vges_old;
8215  Xyce::dout()<<" vgms:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8216  Xyce::dout() << vgms_old;
8217  Xyce::dout()<<" vged:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8218  Xyce::dout() << vged_old;
8219  Xyce::dout()<<" vgmd:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8220  Xyce::dout() << vgmd_old << std::endl;
8221  Xyce::dout().width(3);
8222  Xyce::dout() << getSolverState().newtonIter;
8223  Xyce::dout().width(5);Xyce::dout() << getName();
8224  Xyce::dout() << " Blim:";
8225  Xyce::dout()<<" vgs:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8226  Xyce::dout() << vgs;
8227  Xyce::dout()<<" vds:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8228  Xyce::dout() << vds;
8229  Xyce::dout()<<" vbs:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8230  Xyce::dout() << vbs;
8231  Xyce::dout()<<" vbd:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8232  Xyce::dout() << vbd;
8233  Xyce::dout()<<" vges:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8234  Xyce::dout() << vges;
8235  Xyce::dout()<<" vgms:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8236  Xyce::dout() << vgms;
8237  Xyce::dout()<<" vged:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8238  Xyce::dout() << vged;
8239  Xyce::dout()<<" vgmd:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8240  Xyce::dout() << vgmd << std::endl;
8241  Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
8242  }
8243 #endif
8244 
8245  // only do this if we are beyond the first Newton iteration. On the
8246  // first newton iteration, the "old" values are from a previous time
8247  // step.
8248 
8249  if (getSolverState().newtonIter >= 0 && !(getSolverState().initJctFlag))
8250  {
8251  if (vds_old >= 0.0)
8252  {
8253  vgs = devSupport.fetlim(vgs, vgs_old, von_local);
8254  vds = vgs - vgd;
8255  vds = devSupport.limvds(vds, vds_old);
8256  vgd = vgs - vds;
8257  if (rgateMod == 3)
8258  {
8259  vges = devSupport.fetlim(vges, vges_old, von_local);
8260  vgms = devSupport.fetlim(vgms, vgms_old, von_local);
8261  }
8262  else if ((rgateMod == 1) || (rgateMod == 2))
8263  {
8264  vges = devSupport.fetlim(vges, vges_old, von_local);
8265  vged = vges - vds;
8266  }
8267 
8268  if (model_.rdsMod)
8269  {
8272  }
8273  }
8274  else
8275  {
8276  vgd = devSupport.fetlim(vgd, vgd_old, von_local);
8277  vds = vgs - vgd;
8278  vds = -devSupport.limvds(-vds, -vds_old);
8279  vgs = vgd + vds;
8280 
8281  if (rgateMod == 3)
8282  {
8283  vged = devSupport.fetlim(vged, vged_old, von_local);
8284  vges = vged + vds;
8285  vgmd = devSupport.fetlim(vgmd, vgmd_old, von_local);
8286  vgms = vgmd + vds;
8287  }
8288  if ((rgateMod == 1) || (rgateMod == 2))
8289  {
8290  vged = devSupport.fetlim(vged, vged_old, von_local);
8291  vges = vged + vds;
8292  }
8293 
8294  if (model_.rdsMod)
8295  {
8298  }
8299  }
8300 
8301  if (vds >= 0.0)
8302  {
8303  vbs = devSupport.pnjlim(vbs, vbs_old,
8304  CONSTvt0, model_.vcrit, &Check);
8305  vbd = vbs - vds;
8306  if (rbodyMod)
8307  {
8309  CONSTvt0, model_.vcrit, &Check1);
8310  vdbd = vdbs - vds;
8312  CONSTvt0, model_.vcrit, &Check2);
8313  if ((Check1 != 0) || (Check2 != 0))
8314  {
8315  Check = 1;
8316  }
8317  }
8318  }
8319  else
8320  {
8322  CONSTvt0, model_.vcrit, &Check);
8323  vbs = vbd + vds;
8324  if (rbodyMod)
8325  {
8327  CONSTvt0, model_.vcrit, &Check1);
8328  vdbs = vdbd + vds;
8329  vsbd_old = vsbs_old - vds_old;
8330  vsbd = vsbs - vds;
8331  vsbd = devSupport.pnjlim(vsbd, vsbd_old, CONSTvt0, model_.vcrit, &Check2);
8332  vsbs = vsbd + vds;
8333  if ((Check1 != 0) || (Check2 != 0))
8334  {
8335  Check = 1;
8336  }
8337  }
8338  }
8339  }
8340 
8341 #if 0 // relying on check doesn't work.
8342  if (Check == 1)
8343  {
8344  origFlag = 0;
8345  }
8346 #endif
8347  // for convergence testing:
8348  if (Check == 1) limitedFlag=true;
8349 
8350  double machprec= N_UTL_MachineDependentParams::MachinePrecision();
8351 
8352 #if 0
8353  if (vbd_orig != vbd || vbs_orig != vbs || vgs_orig != vgs ||
8354  vds_orig != vds || vgd_orig != vgd || vges_orig != vges ||
8355  vgms_orig != vgms || vdes_orig != vdes || vses_orig != vses ||
8356  vdbs_orig != vdbs || vsbs_orig != vsbs || vdbd_orig != vdbd ||
8358  vgmb_orig != vgmb || vgb_orig != vgb || vged_orig != vged ||
8359  vgmd_orig != vgmd)
8360 #else
8361  if (
8362  fabs( vbd_orig - vbd) > machprec ||
8363  fabs( vbs_orig - vbs) > machprec ||
8364  fabs( vgs_orig - vgs) > machprec ||
8365  fabs( vds_orig - vds) > machprec ||
8366  fabs( vgd_orig - vgd) > machprec ||
8367  fabs( vges_orig - vges) > machprec ||
8368  fabs( vgms_orig - vgms) > machprec ||
8369  fabs( vdes_orig - vdes) > machprec ||
8370  fabs( vses_orig - vses) > machprec ||
8371  fabs( vdbs_orig - vdbs) > machprec ||
8372  fabs( vsbs_orig - vsbs) > machprec ||
8373  fabs( vdbd_orig - vdbd) > machprec ||
8374  fabs( vbs_jct_orig - vbs_jct) > machprec ||
8375  fabs( vbd_jct_orig - vbd_jct) > machprec ||
8376  fabs( vgmb_orig - vgmb) > machprec ||
8377  fabs( vgb_orig - vgb) > machprec ||
8378  fabs( vged_orig - vged) > machprec ||
8379  fabs( vgmd_orig - vgmd) > machprec )
8380 #endif
8381  {
8382  origFlag = 0;
8383  }
8384 
8385  } // getDeviceOptions().voltageLimiterFlag
8386 
8387  // update the "old" variables:
8388  if (getSolverState().newtonIter != 0 && getSolverState().newtonIter != newtonIterOld)
8389  {
8391  }
8392 
8393  // Calculate DC currents and their derivatives
8394  vbd = vbs - vds;
8395  vgd = vgs - vds;
8396  vgb = vgs - vbs;
8397  vged = vges - vds;
8398  vgmd = vgms - vds;
8399  vgmb = vgms - vbs;
8400  vdbd = vdbs - vds;
8401 
8402  vbs_jct = (!rbodyMod) ? vbs : vsbs;
8403  vbd_jct = (!rbodyMod) ? vbd : vdbd;
8404 
8405  // gate model voltage drops.
8406  // These are linear resistors, so no "type" parameter.
8407  // As these are being derived from limited "typed" junction
8408  // voltages, like vges, type is necessary to undo type.
8409  // Vgegp = model_.dtype *(vges-vgs);
8410  // Vgegm = model_.dtype *(vges-vgms);
8411  // Vgmgp = Vgegp-Vgegm;
8412 
8413 #ifdef Xyce_DEBUG_DEVICE
8415  {
8417  {
8418  Xyce::dout().width(3);
8419  Xyce::dout() << getSolverState().newtonIter;
8420  Xyce::dout().width(5);Xyce::dout() << getName();
8421  Xyce::dout() << " Alim:";
8422  Xyce::dout()<<" vgs:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8423  Xyce::dout() << vgs << "(diff="<<vgs-vgs_orig<<")";
8424  Xyce::dout()<<" vds:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8425  Xyce::dout() << vds << "(diff="<<vds-vds_orig<<")";
8426  Xyce::dout()<<" vbs:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8427  Xyce::dout() << vbs<< "(diff="<<vbs-vbs_orig<<")";
8428  Xyce::dout()<<" vbd:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8429  Xyce::dout() << vbd<< "(diff="<<vbd-vbd_orig<<")";
8430  Xyce::dout()<<" vges:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8431  Xyce::dout() << vges<< "(diff="<<vges-vges_orig<<")";
8432  Xyce::dout()<<" vgms:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8433  Xyce::dout() << vgms<< "(diff="<<vgms-vgms_orig<<")";
8434  Xyce::dout()<<" vged:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8435  Xyce::dout() << vged<< "(diff="<<vged-vged_orig<<")";
8436  Xyce::dout()<<" vgmd:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8437  Xyce::dout() << vgmd<< "(diff="<<vgmd-vgmd_orig<<")";
8438  Xyce::dout()<<" vbs_jct:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8439  Xyce::dout() << vbs_jct<< "(diff="<<vbs_jct-vbs_jct_orig<<")";
8440  Xyce::dout()<<" vbd_jct:";//Xyce::dout().width(10);Xyce::dout().precision(3);Xyce::dout().setf(std::ios::scientific);
8441  Xyce::dout() << vbd_jct<< "(diff="<<vbd_jct-vbd_jct_orig<<")";
8442  if (origFlag) Xyce::dout() << " SAME";
8443  else Xyce::dout() << " DIFF";
8444  Xyce::dout() << std::endl;
8445  Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
8446  }
8447  }
8448 #endif
8449 
8450  // Source/drain junction diode DC model begins
8451  Nvtms = model_.vtm * model_.SjctEmissionCoeff;
8452  if ((Aseff <= 0.0) && (Pseff <= 0.0))
8453  {
8454  SourceSatCurrent = 1.0e-14;
8455  }
8456  else
8457  {
8458  SourceSatCurrent = Aseff * model_.SjctTempSatCurDensity
8460  + paramPtr->weffCJ * nf
8462  }
8463 
8464  if (SourceSatCurrent <= 0.0)
8465  {
8467  cbs = gbs * vbs_jct;
8468  }
8469  else
8470  {
8471  switch(model_.dioMod)
8472  {
8473  case 0:
8474  evbs = exp(vbs_jct / Nvtms);
8475  T1 = model_.xjbvs * exp(-(model_.bvs + vbs_jct) / Nvtms);
8476  // WDLiu: Magic T1 in this form; different from beta.
8477  gbs = SourceSatCurrent * (evbs + T1) / Nvtms + getDeviceOptions().gmin;
8478  cbs = SourceSatCurrent * (evbs + XExpBVS
8479  - T1 - 1.0) + getDeviceOptions().gmin * vbs_jct;
8480  break;
8481  case 1:
8482  T2 = vbs_jct / Nvtms;
8483  if (T2 < -CONSTEXP_THRESHOLD)
8484  {
8486  cbs = SourceSatCurrent * (CONSTMIN_EXP - 1.0)
8488  }
8489  else if (vbs_jct <= vjsmFwd)
8490  {
8491  evbs = exp(T2);
8492  gbs = SourceSatCurrent * evbs / Nvtms + getDeviceOptions().gmin;
8493  cbs = SourceSatCurrent * (evbs - 1.0)
8495  }
8496  else
8497  {
8498  T0 = IVjsmFwd / Nvtms;
8499  gbs = T0 + getDeviceOptions().gmin;
8500  cbs = IVjsmFwd - SourceSatCurrent + T0
8502  }
8503  break;
8504  case 2:
8505  if (vbs_jct < vjsmRev)
8506  {
8507  T0 = vbs_jct / Nvtms;
8508  if (T0 < -CONSTEXP_THRESHOLD)
8509  {
8510  evbs = CONSTMIN_EXP;
8511  devbs_dvb = 0.0;
8512  }
8513  else
8514  {
8515  evbs = exp(T0);
8516  devbs_dvb = evbs / Nvtms;
8517  }
8518 
8519  T1 = evbs - 1.0;
8520  T2 = IVjsmRev + SslpRev * (vbs_jct - vjsmRev);
8521  gbs = devbs_dvb * T2 + T1 * SslpRev + getDeviceOptions().gmin;
8522  cbs = T1 * T2 + getDeviceOptions().gmin * vbs_jct;
8523  }
8524  else if (vbs_jct <= vjsmFwd)
8525  {
8526  T0 = vbs_jct / Nvtms;
8527  if (T0 < -CONSTEXP_THRESHOLD)
8528  {
8529  evbs = CONSTMIN_EXP;
8530  devbs_dvb = 0.0;
8531  }
8532  else
8533  {
8534  evbs = exp(T0);
8535  devbs_dvb = evbs / Nvtms;
8536  }
8537 
8538  T1 = (model_.bvs + vbs_jct) / Nvtms;
8539  if (T1 > CONSTEXP_THRESHOLD)
8540  {
8541  T2 = CONSTMIN_EXP;
8542  T3 = 0.0;
8543  }
8544  else
8545  {
8546  T2 = exp(-T1);
8547  T3 = -T2 /Nvtms;
8548  }
8549  gbs = SourceSatCurrent * (devbs_dvb - model_.xjbvs * T3)
8550  + getDeviceOptions().gmin;
8551  cbs = SourceSatCurrent * (evbs + XExpBVS - 1.0
8552  - model_.xjbvs * T2)
8554  }
8555  else
8556  {
8558  cbs = IVjsmFwd + SslpFwd * (vbs_jct
8560  }
8561  break;
8562  default: break;
8563  }
8564  }
8565 
8566  Nvtmd = model_.vtm * model_.DjctEmissionCoeff;
8567  if ((Adeff <= 0.0) && (Pdeff <= 0.0))
8568  {
8569  DrainSatCurrent = 1.0e-14;
8570  }
8571  else
8572  {
8573  DrainSatCurrent = Adeff * model_.DjctTempSatCurDensity
8575  + paramPtr->weffCJ * nf
8577  }
8578 
8579  if (DrainSatCurrent <= 0.0)
8580  {
8582  cbd = gbd * vbd_jct;
8583  }
8584  else
8585  {
8586  switch(model_.dioMod)
8587  {
8588  case 0:
8589  evbd = exp(vbd_jct / Nvtmd);
8590  T1 = model_.xjbvd * exp(-(model_.bvd + vbd_jct) / Nvtmd);
8591  // WDLiu: Magic T1 in this form; different from beta.
8592  gbd = DrainSatCurrent * (evbd + T1) / Nvtmd + getDeviceOptions().gmin;
8593  cbd = DrainSatCurrent * (evbd + XExpBVD
8594  - T1 - 1.0) + getDeviceOptions().gmin * vbd_jct;
8595  break;
8596  case 1:
8597  T2 = vbd_jct / Nvtmd;
8598  if (T2 < -CONSTEXP_THRESHOLD)
8599  {
8601  cbd = DrainSatCurrent * (CONSTMIN_EXP - 1.0)
8603  }
8604  else if (vbd_jct <= vjdmFwd)
8605  {
8606  evbd = exp(T2);
8607  gbd = DrainSatCurrent * evbd / Nvtmd + getDeviceOptions().gmin;
8608  cbd = DrainSatCurrent * (evbd - 1.0)
8610  }
8611  else
8612  {
8613  T0 = IVjdmFwd / Nvtmd;
8614  gbd = T0 + getDeviceOptions().gmin;
8615  cbd = IVjdmFwd - DrainSatCurrent + T0
8617  }
8618  break;
8619  case 2:
8620  if (vbd_jct < vjdmRev)
8621  {
8622  T0 = vbd_jct / Nvtmd;
8623  if (T0 < -CONSTEXP_THRESHOLD)
8624  {
8625  evbd = CONSTMIN_EXP;
8626  devbd_dvb = 0.0;
8627  }
8628  else
8629  {
8630  evbd = exp(T0);
8631  devbd_dvb = evbd / Nvtmd;
8632  }
8633 
8634  T1 = evbd - 1.0;
8635  T2 = IVjdmRev + DslpRev * (vbd_jct - vjdmRev);
8636  gbd = devbd_dvb * T2 + T1 * DslpRev + getDeviceOptions().gmin;
8637  cbd = T1 * T2 + getDeviceOptions().gmin * vbd_jct;
8638  }
8639  else if (vbd_jct <= vjdmFwd)
8640  {
8641  T0 = vbd_jct / Nvtmd;
8642  if (T0 < -CONSTEXP_THRESHOLD)
8643  {
8644  evbd = CONSTMIN_EXP;
8645  devbd_dvb = 0.0;
8646  }
8647  else
8648  {
8649  evbd = exp(T0);
8650  devbd_dvb = evbd / Nvtmd;
8651  }
8652 
8653  T1 = (model_.bvd + vbd_jct) / Nvtmd;
8654  if (T1 > CONSTEXP_THRESHOLD)
8655  {
8656  T2 = CONSTMIN_EXP;
8657  T3 = 0.0;
8658  }
8659  else
8660  {
8661  T2 = exp(-T1);
8662  T3 = -T2 /Nvtmd;
8663  }
8664  gbd = DrainSatCurrent * (devbd_dvb - model_.xjbvd * T3)
8665  + getDeviceOptions().gmin;
8666  cbd = DrainSatCurrent * (evbd + XExpBVD - 1.0
8667  - model_.xjbvd * T2) + getDeviceOptions().gmin * vbd_jct;
8668  }
8669  else
8670  {
8672  cbd = IVjdmFwd + DslpFwd * (vbd_jct
8674  }
8675  break;
8676  default: break;
8677  }
8678  }
8679 
8680  /* trap-assisted tunneling and recombination current for reverse bias */
8681  Nvtmrssws = model_.vtm0 * model_.njtsswstemp;
8682  Nvtmrsswgs = model_.vtm0 * model_.njtsswgstemp;
8683  Nvtmrss = model_.vtm0 * model_.njtsstemp;
8684  Nvtmrsswd = model_.vtm0 * model_.njtsswdtemp;
8685  Nvtmrsswgd = model_.vtm0 * model_.njtsswgdtemp;
8686  Nvtmrsd = model_.vtm0 * model_.njtsdtemp;
8687 
8688  if ((model_.vtss - vbs_jct) < (model_.vtss * 1e-3))
8689  {
8690  T9 = 1.0e3;
8691  T0 = - vbs_jct / Nvtmrss * T9;
8692  DEXP(T0, T1, T10);
8693  dT1_dVb = T10 / Nvtmrss * T9;
8694  }
8695  else
8696  {
8697  T9 = 1.0 / (model_.vtss - vbs_jct);
8698  T0 = -vbs_jct / Nvtmrss * model_.vtss * T9;
8699  dT0_dVb = model_.vtss / Nvtmrss * (T9 + vbs_jct * T9 * T9) ;
8700  DEXP(T0, T1, T10);
8701  dT1_dVb = T10 * dT0_dVb;
8702  }
8703 
8704  if ((model_.vtsd - vbd_jct) < (model_.vtsd * 1e-3) )
8705  {
8706  T9 = 1.0e3;
8707  T0 = -vbd_jct / Nvtmrsd * T9;
8708  DEXP(T0, T2, T10);
8709  dT2_dVb = T10 / Nvtmrsd * T9;
8710  }
8711  else
8712  {
8713  T9 = 1.0 / (model_.vtsd - vbd_jct);
8714  T0 = -vbd_jct / Nvtmrsd * model_.vtsd * T9;
8715  dT0_dVb = model_.vtsd / Nvtmrsd * (T9 + vbd_jct * T9 * T9) ;
8716  DEXP(T0, T2, T10);
8717  dT2_dVb = T10 * dT0_dVb;
8718  }
8719 
8720  if ((model_.vtssws - vbs_jct) < (model_.vtssws * 1e-3) )
8721  {
8722  T9 = 1.0e3;
8723  T0 = -vbs_jct / Nvtmrssws * T9;
8724  DEXP(T0, T3, T10);
8725  dT3_dVb = T10 / Nvtmrssws * T9;
8726  }
8727  else
8728  {
8729  T9 = 1.0 / (model_.vtssws - vbs_jct);
8730  T0 = -vbs_jct / Nvtmrssws * model_.vtssws * T9;
8731  dT0_dVb = model_.vtssws / Nvtmrssws * (T9 + vbs_jct * T9 * T9) ;
8732  DEXP(T0, T3, T10);
8733  dT3_dVb = T10 * dT0_dVb;
8734  }
8735 
8736  if ((model_.vtsswd - vbd_jct) < (model_.vtsswd * 1e-3) )
8737  {
8738  T9 = 1.0e3;
8739  T0 = -vbd_jct / Nvtmrsswd * T9;
8740  DEXP(T0, T4, T10);
8741  dT4_dVb = T10 / Nvtmrsswd * T9;
8742  }
8743  else
8744  {
8745  T9 = 1.0 / (model_.vtsswd - vbd_jct);
8746  T0 = -vbd_jct / Nvtmrsswd * model_.vtsswd * T9;
8747  dT0_dVb = model_.vtsswd / Nvtmrsswd * (T9 + vbd_jct * T9 * T9) ;
8748  DEXP(T0, T4, T10);
8749  dT4_dVb = T10 * dT0_dVb;
8750  }
8751 
8752  if ((model_.vtsswgs - vbs_jct) < (model_.vtsswgs * 1e-3) )
8753  {
8754  T9 = 1.0e3;
8755  T0 = -vbs_jct / Nvtmrsswgs * T9;
8756  DEXP(T0, T5, T10);
8757  dT5_dVb = T10 / Nvtmrsswgs * T9;
8758  }
8759  else
8760  {
8761  T9 = 1.0 / (model_.vtsswgs - vbs_jct);
8762  T0 = -vbs_jct / Nvtmrsswgs * model_.vtsswgs * T9;
8763  dT0_dVb = model_.vtsswgs / Nvtmrsswgs * (T9 + vbs_jct * T9 * T9) ;
8764  DEXP(T0, T5, T10);
8765  dT5_dVb = T10 * dT0_dVb;
8766  }
8767 
8768  if ((model_.vtsswgd - vbd_jct) < (model_.vtsswgd * 1e-3) )
8769  {
8770  T9 = 1.0e3;
8771  T0 = -vbd_jct / Nvtmrsswgd * T9;
8772  DEXP(T0, T6, T10);
8773  dT6_dVb = T10 / Nvtmrsswgd * T9;
8774  }
8775  else
8776  {
8777  T9 = 1.0 / (model_.vtsswgd - vbd_jct);
8778  T0 = -vbd_jct / Nvtmrsswgd * model_.vtsswgd * T9;
8779  dT0_dVb = model_.vtsswgd / Nvtmrsswgd * (T9 + vbd_jct * T9 * T9) ;
8780  DEXP(T0, T6, T10);
8781  dT6_dVb = T10 * dT0_dVb;
8782  }
8783 
8784  gbs += SjctTempRevSatCur * dT1_dVb
8785  + SswTempRevSatCur * dT3_dVb
8786  + SswgTempRevSatCur * dT5_dVb;
8787  cbs -= SjctTempRevSatCur * (T1 - 1.0)
8788  + SswTempRevSatCur * (T3 - 1.0)
8789  + SswgTempRevSatCur * (T5 - 1.0);
8790  gbd += DjctTempRevSatCur * dT2_dVb
8791  + DswTempRevSatCur * dT4_dVb
8792  + DswgTempRevSatCur * dT6_dVb;
8793  cbd -= DjctTempRevSatCur * (T2 - 1.0)
8794  + DswTempRevSatCur * (T4 - 1.0)
8795  + DswgTempRevSatCur * (T6 - 1.0);
8796 
8797  // End of diode DC model
8798 
8799  if (vds >= 0.0)
8800  {
8801  mode = 1;
8802  Vds = vds;
8803  Vgs = vgs;
8804  Vbs = vbs;
8805  Vdb = vds - vbs; // WDLiu: for GIDL
8806  }
8807  else
8808  {
8809  mode = -1;
8810  Vds = -vds;
8811  Vgs = vgd;
8812  Vbs = vbd;
8813  Vdb = -vbs;
8814  }
8815 
8816  // dunga
8817  if(model_.mtrlMod)
8818  {
8819  epsrox = 3.9;
8820  toxe = model_.eot;
8821  epssub = CONSTEPS0 * model_.epsrsub;
8822  }
8823  else
8824  {
8825  epsrox = model_.epsrox;
8826  toxe = model_.toxe;
8827  epssub = CONSTEPSSI;
8828  }
8829 
8830  /////////////////////////////////////////////////////////////////////////////
8831  // mosfet continuation.
8832  // This idea is based, loosely, on a paper by Jaijeet
8833  // Rosychowdhury. If the artificial parameter flag has been enabled,
8834  // modify Vds and Vgs.
8835 #ifdef Xyce_DEBUG_DEVICE
8836  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
8837  {
8838  Xyce::dout() << "HOMOTOPY INFO: gainscale = "
8839  << getSolverState().gainScale[blockHomotopyID] << std::endl;
8840  Xyce::dout() << "HOMOTOPY INFO: before vds = " << Vds << std::endl;
8841  Xyce::dout() << "HOMOTOPY INFO: before vgst = " << Vgs << std::endl;
8842  }
8843 #endif
8844  if (getSolverState().artParameterFlag)
8845  {
8846 
8847  double alpha = getSolverState().gainScale[blockHomotopyID];
8848  if (getDeviceOptions().staggerGainScale)
8849  {
8850  alpha *= (0.3 * randomPerturb + 1.0);
8851  if (alpha > 1.0)
8852  {
8853  alpha = 1.0;
8854  }
8855  }
8856  double vgstConst = getDeviceOptions().vgstConst;
8857  if (getDeviceOptions().randomizeVgstConst)
8858  {
8859  vgstConst *= randomPerturb;
8860  }
8861 
8862  Vds = devSupport.contVds (Vds,getSolverState().nltermScale,getDeviceOptions().vdsScaleMin);
8863  Vgs = devSupport.contVgst(Vgs, alpha, vgstConst);
8864  }
8865 #ifdef Xyce_DEBUG_DEVICE
8866  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
8867  {
8868  Xyce::dout() << "HOMOTOPY INFO: after vds = " << Vds << std::endl;
8869  Xyce::dout() << "HOMOTOPY INFO: after vgst = " << Vgs << std::endl;
8870  }
8871 #endif
8872  // end of mosfet continuation block.
8873  /////////////////////////////////////////////////////////////////////////////
8874 
8875  T0 = Vbs - vbsc - 0.001;
8876  T1 = sqrt(T0 * T0 - 0.004 * vbsc);
8877  if (T0 >= 0.0)
8878  {
8879  Vbseff = vbsc + 0.5 * (T0 + T1);
8880  dVbseff_dVb = 0.5 * (1.0 + T0 / T1);
8881  }
8882  else
8883  {
8884  T2 = -0.002 / (T1 - T0);
8885  Vbseff = vbsc * (1.0 + T2);
8886  dVbseff_dVb = T2 * vbsc / T1;
8887  }
8888 
8889  // JX: Correction to forward body bias
8890  T9 = 0.95 * paramPtr->phi;
8891  T0 = T9 - Vbseff - 0.001;
8892  T1 = sqrt(T0 * T0 + 0.004 * T9);
8893  Vbseff = T9 - 0.5 * (T0 + T1);
8894  dVbseff_dVb *= 0.5 * (1.0 + T0 / T1);
8895 
8896  Phis = paramPtr->phi - Vbseff;
8897  dPhis_dVb = -1.0;
8898  sqrtPhis = sqrt(Phis);
8899  dsqrtPhis_dVb = -0.5 / sqrtPhis;
8900 
8901  Xdep = paramPtr->Xdep0 * sqrtPhis / paramPtr->sqrtPhi;
8902  dXdep_dVb = (paramPtr->Xdep0 / paramPtr->sqrtPhi) * dsqrtPhis_dVb;
8903 
8904  Leff = paramPtr->leff;
8905  Vtm = model_.vtm;
8906  Vtm0 = model_.vtm0;
8907 
8908  // Vth Calculation
8909  T3 = sqrt(Xdep);
8910  V0 = paramPtr->vbi - paramPtr->phi;
8911 
8912  T0 = paramPtr->dvt2 * Vbseff;
8913  if (T0 >= - 0.5)
8914  {
8915  T1 = 1.0 + T0;
8916  T2 = paramPtr->dvt2;
8917  }
8918  else
8919  {
8920  T4 = 1.0 / (3.0 + 8.0 * T0);
8921  T1 = (1.0 + 3.0 * T0) * T4;
8922  T2 = paramPtr->dvt2 * T4 * T4;
8923  }
8924  lt1 = model_.factor1 * T3 * T1;
8925  dlt1_dVb = model_.factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
8926 
8927  T0 = paramPtr->dvt2w * Vbseff;
8928  if (T0 >= - 0.5)
8929  {
8930  T1 = 1.0 + T0;
8931  T2 = paramPtr->dvt2w;
8932  }
8933  else
8934  {
8935  T4 = 1.0 / (3.0 + 8.0 * T0);
8936  T1 = (1.0 + 3.0 * T0) * T4;
8937  T2 = paramPtr->dvt2w * T4 * T4;
8938  }
8939  ltw = model_.factor1 * T3 * T1;
8940  dltw_dVb = model_.factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
8941 
8942  T0 = paramPtr->dvt1 * Leff / lt1;
8943  if (T0 < CONSTEXP_THRESHOLD)
8944  {
8945  T1 = exp(T0);
8946  T2 = T1 - 1.0;
8947  T3 = T2 * T2;
8948  T4 = T3 + 2.0 * T1 * CONSTMIN_EXP;
8949  Theta0 = T1 / T4;
8950  dT1_dVb = -T0 * T1 * dlt1_dVb / lt1;
8951  dTheta0_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 + CONSTMIN_EXP)) / T4 / T4;
8952  }
8953  else
8954  {
8955  Theta0 = 1.0 / (CONSTMAX_EXP - 2.0); // 3.0 * CONSTMIN_EXP omitted
8956  dTheta0_dVb = 0.0;
8957  }
8958  thetavth = paramPtr->dvt0 * Theta0;
8959  Delt_vth = thetavth * V0;
8960  dDelt_vth_dVb = paramPtr->dvt0 * dTheta0_dVb * V0;
8961 
8962  T0 = paramPtr->dvt1w * paramPtr->weff * Leff / ltw;
8963  if (T0 < CONSTEXP_THRESHOLD)
8964  {
8965  T1 = exp(T0);
8966  T2 = T1 - 1.0;
8967  T3 = T2 * T2;
8968  T4 = T3 + 2.0 * T1 * CONSTMIN_EXP;
8969  T5 = T1 / T4;
8970  dT1_dVb = -T0 * T1 * dltw_dVb / ltw;
8971  dT5_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 + CONSTMIN_EXP)) / T4 / T4;
8972  }
8973  else
8974  {
8975  T5 = 1.0 / (CONSTMAX_EXP - 2.0); // 3.0 * CONSTMIN_EXP omitted
8976  dT5_dVb = 0.0;
8977  }
8978 
8979  T0 = paramPtr->dvt0w * T5;
8980  T2 = T0 * V0;
8981  dT2_dVb = paramPtr->dvt0w * dT5_dVb * V0;
8982 
8983  TempRatio = temp / model_.tnom - 1.0;
8984  T0 = sqrt(1.0 + paramPtr->lpe0 / Leff);
8985  T1 = paramPtr->k1ox * (T0 - 1.0) * paramPtr->sqrtPhi
8986  + (paramPtr->kt1 + paramPtr->kt1l / Leff
8987  + paramPtr->kt2 * Vbseff) * TempRatio;
8988  Vth_NarrowW = toxe * paramPtr->phi
8989  / (paramPtr->weff + paramPtr->w0);
8990 
8991  T3 = eta0 + paramPtr->etab * Vbseff;
8992  if (T3 < 1.0e-4)
8993  {
8994  T9 = 1.0 / (3.0 - 2.0e4 * T3);
8995  T3 = (2.0e-4 - T3) * T9;
8996  T4 = T9 * T9;
8997  }
8998  else
8999  {
9000  T4 = 1.0;
9001  }
9002  dDIBL_Sft_dVd = T3 * paramPtr->theta0vb0;
9003  DIBL_Sft = dDIBL_Sft_dVd * Vds;
9004 
9005  Lpe_Vb = sqrt(1.0 + paramPtr->lpeb / Leff);
9006 
9007  Vth = model_.dtype * vth0 + (paramPtr->k1ox * sqrtPhis
9008  - paramPtr->k1 * paramPtr->sqrtPhi) * Lpe_Vb
9009  - k2ox * Vbseff - Delt_vth - T2 + (paramPtr->k3
9010  + paramPtr->k3b * Vbseff) * Vth_NarrowW + T1 - DIBL_Sft;
9011 
9012  dVth_dVb = Lpe_Vb * paramPtr->k1ox * dsqrtPhis_dVb - k2ox
9013  - dDelt_vth_dVb - dT2_dVb + paramPtr->k3b * Vth_NarrowW
9014  - paramPtr->etab * Vds * paramPtr->theta0vb0 * T4
9015  + paramPtr->kt2 * TempRatio;
9016  dVth_dVd = -dDIBL_Sft_dVd;
9017 
9018 
9019  // Calculate n
9020  tmp1 = epssub / Xdep;
9021  nstar = model_.vtm / CONSTQ * (model_.coxe + tmp1 + paramPtr->cit);
9022  tmp2 = paramPtr->nfactor * tmp1;
9023  tmp3 = paramPtr->cdsc + paramPtr->cdscb * Vbseff
9024  + paramPtr->cdscd * Vds;
9025  tmp4 = (tmp2 + tmp3 * Theta0 + paramPtr->cit) / model_.coxe;
9026  if (tmp4 >= -0.5)
9027  {
9028  n = 1.0 + tmp4;
9029  dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb
9030  + paramPtr->cdscb * Theta0) / model_.coxe;
9031  dn_dVd = paramPtr->cdscd * Theta0 / model_.coxe;
9032  }
9033  else
9034  {
9035  T0 = 1.0 / (3.0 + 8.0 * tmp4);
9036  n = (1.0 + 3.0 * tmp4) * T0;
9037  T0 *= T0;
9038  dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb
9039  + paramPtr->cdscb * Theta0) / model_.coxe * T0;
9040  dn_dVd = paramPtr->cdscd * Theta0 / model_.coxe * T0;
9041  }
9042 
9043 
9044  // Vth correction for Pocket implant
9045  if (paramPtr->dvtp0 > 0.0)
9046  {
9047  T0 = -paramPtr->dvtp1 * Vds;
9048  if (T0 < -CONSTEXP_THRESHOLD)
9049  {
9050  T2 = CONSTMIN_EXP;
9051  dT2_dVd = 0.0;
9052  }
9053  else
9054  {
9055  T2 = exp(T0);
9056  dT2_dVd = -paramPtr->dvtp1 * T2;
9057  }
9058 
9059  T3 = Leff + paramPtr->dvtp0 * (1.0 + T2);
9060  dT3_dVd = paramPtr->dvtp0 * dT2_dVd;
9061  if (model_.tempMod < 2)
9062  {
9063  T4 = Vtm * log(Leff / T3);
9064  dT4_dVd = -Vtm * dT3_dVd / T3;
9065  }
9066  else
9067  {
9068  T4 = model_.vtm0 * log(Leff / T3);
9069  dT4_dVd = -model_.vtm0 * dT3_dVd / T3;
9070  }
9071  dDITS_Sft_dVd = dn_dVd * T4 + n * dT4_dVd;
9072  dDITS_Sft_dVb = T4 * dn_dVb;
9073 
9074  Vth -= n * T4;
9075  dVth_dVd -= dDITS_Sft_dVd;
9076  dVth_dVb -= dDITS_Sft_dVb;
9077  }
9078  von = Vth;
9079 
9080  // Poly Gate Si Depletion Effect
9081  T0 = vfb + paramPtr->phi;
9082  if(model_.mtrlMod == 0)
9083  T1 = CONSTEPSSI;
9084  else
9085  T1 = model_.epsrgate * CONSTEPS0;
9086 
9089 
9092 
9093  if(mode>0)
9094  {
9095  Vgs_eff = vgs_eff;
9096  dVgs_eff_dVg = dvgs_eff_dvg;
9097  }
9098  else
9099  {
9100  Vgs_eff = vgd_eff;
9101  dVgs_eff_dVg = dvgd_eff_dvg;
9102  }
9103  vgs_eff = vgs_eff;
9104  vgd_eff = vgd_eff;
9107 
9108  Vgst = Vgs_eff - Vth;
9109 
9110  // Calculate Vgsteff
9111  T0 = n * Vtm;
9112  T1 = paramPtr->mstar * Vgst;
9113  T2 = T1 / T0;
9114  if (T2 > CONSTEXP_THRESHOLD)
9115  {
9116  T10 = T1;
9117  dT10_dVg = paramPtr->mstar * dVgs_eff_dVg;
9118  dT10_dVd = -dVth_dVd * paramPtr->mstar;
9119  dT10_dVb = -dVth_dVb * paramPtr->mstar;
9120  }
9121  else if (T2 < -CONSTEXP_THRESHOLD)
9122  {
9123  T10 = Vtm * log(1.0 + CONSTMIN_EXP);
9124  dT10_dVg = 0.0;
9125  dT10_dVd = T10 * dn_dVd;
9126  dT10_dVb = T10 * dn_dVb;
9127  T10 *= n;
9128  }
9129  else
9130  {
9131  ExpVgst = exp(T2);
9132  T3 = Vtm * log(1.0 + ExpVgst);
9133  T10 = n * T3;
9134  dT10_dVg = paramPtr->mstar * ExpVgst / (1.0 + ExpVgst);
9135  dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n);
9136  dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n);
9137  dT10_dVg *= dVgs_eff_dVg;
9138  }
9139 
9140  T1 = paramPtr->voffcbn - (1.0 - paramPtr->mstar) * Vgst;
9141  T2 = T1 / T0;
9142 
9143  if (T2 < -CONSTEXP_THRESHOLD)
9144  {
9146  T9 = paramPtr->mstar + T3 * n;
9147  dT9_dVg = 0.0;
9148  dT9_dVd = dn_dVd * T3;
9149  dT9_dVb = dn_dVb * T3;
9150  }
9151  else if (T2 > CONSTEXP_THRESHOLD)
9152  {
9154  T9 = paramPtr->mstar + T3 * n;
9155  dT9_dVg = 0.0;
9156  dT9_dVd = dn_dVd * T3;
9157  dT9_dVb = dn_dVb * T3;
9158  }
9159  else
9160  {
9161  ExpVgst = exp(T2);
9162  T3 = model_.coxe / paramPtr->cdep0;
9163  T4 = T3 * ExpVgst;
9164  T5 = T1 * T4 / T0;
9165  T9 = paramPtr->mstar + n * T4;
9166  dT9_dVg = T3 * (paramPtr->mstar - 1.0) * ExpVgst / Vtm;
9167  dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb;
9168  dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd;
9169  dT9_dVg *= dVgs_eff_dVg;
9170  }
9171 
9172  Vgsteff = T10 / T9;
9173  T11 = T9 * T9;
9174  dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11;
9175  dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11;
9176  dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11;
9177 
9178  // Calculate Effective Channel Geometry
9179  T9 = sqrtPhis - paramPtr->sqrtPhi;
9180  Weff = paramPtr->weff - 2.0 * (paramPtr->dwg * Vgsteff
9181  + paramPtr->dwb * T9);
9182  dWeff_dVg = -2.0 * paramPtr->dwg;
9183  dWeff_dVb = -2.0 * paramPtr->dwb * dsqrtPhis_dVb;
9184 
9185  if (Weff < 2.0e-8) // to avoid the discontinuity problem due to Weff
9186  {
9187  T0 = 1.0 / (6.0e-8 - 2.0 * Weff);
9188  Weff = 2.0e-8 * (4.0e-8 - Weff) * T0;
9189  T0 *= T0 * 4.0e-16;
9190  dWeff_dVg *= T0;
9191  dWeff_dVb *= T0;
9192  }
9193 
9194  if (model_.rdsMod == 1)
9195  {
9196  Rds = dRds_dVg = dRds_dVb = 0.0;
9197  }
9198  else
9199  {
9200  T0 = 1.0 + paramPtr->prwg * Vgsteff;
9201  dT0_dVg = -paramPtr->prwg / T0 / T0;
9202  T1 = paramPtr->prwb * T9;
9203  dT1_dVb = paramPtr->prwb * dsqrtPhis_dVb;
9204 
9205  T2 = 1.0 / T0 + T1;
9206  T3 = T2 + sqrt(T2 * T2 + 0.01); // 0.01 = 4.0 * 0.05 * 0.05
9207  dT3_dVg = 1.0 + T2 / (T3 - T2);
9208  dT3_dVb = dT3_dVg * dT1_dVb;
9209  dT3_dVg *= dT0_dVg;
9210 
9211  T4 = paramPtr->rds0 * 0.5;
9212  Rds = paramPtr->rdswmin + T3 * T4;
9213  dRds_dVg = T4 * dT3_dVg;
9214  dRds_dVb = T4 * dT3_dVb;
9215 
9216  if (Rds > 0.0)
9217  {
9218  grdsw = 1.0 / Rds;
9219  }
9220  else
9221  {
9222  grdsw = 0.0;
9223  }
9224  }
9225 
9226  // Calculate Abulk
9227  T9 = 0.5 * paramPtr->k1ox * Lpe_Vb / sqrtPhis;
9228  T1 = T9 + k2ox - paramPtr->k3b * Vth_NarrowW;
9229  dT1_dVb = -T9 / sqrtPhis * dsqrtPhis_dVb;
9230 
9231  T9 = sqrt(paramPtr->xj * Xdep);
9232  tmp1 = Leff + 2.0 * T9;
9233  T5 = Leff / tmp1;
9234  tmp2 = paramPtr->a0 * T5;
9235  tmp3 = paramPtr->weff + paramPtr->b1;
9236  tmp4 = paramPtr->b0 / tmp3;
9237  T2 = tmp2 + tmp4;
9238  dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb;
9239  T6 = T5 * T5;
9240  T7 = T5 * T6;
9241 
9242  Abulk0 = 1.0 + T1 * T2;
9243  dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb;
9244 
9245  T8 = paramPtr->ags * paramPtr->a0 * T7;
9246  dAbulk_dVg = -T1 * T8;
9247  Abulk = Abulk0 + dAbulk_dVg * Vgsteff;
9248  dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb + 3.0 * T1 * dT2_dVb);
9249 
9250  if (Abulk0 < 0.1) // added to avoid the problems caused by Abulk0
9251  {
9252  T9 = 1.0 / (3.0 - 20.0 * Abulk0);
9253  Abulk0 = (0.2 - Abulk0) * T9;
9254  dAbulk0_dVb *= T9 * T9;
9255  }
9256 
9257  if (Abulk < 0.1)
9258  {
9259  T9 = 1.0 / (3.0 - 20.0 * Abulk);
9260  Abulk = (0.2 - Abulk) * T9;
9261  T10 = T9 * T9;
9262  dAbulk_dVb *= T10;
9263  dAbulk_dVg *= T10;
9264  }
9265  Abulk = Abulk;
9266 
9267  T2 = paramPtr->keta * Vbseff;
9268  if (T2 >= -0.9)
9269  {
9270  T0 = 1.0 / (1.0 + T2);
9271  dT0_dVb = -paramPtr->keta * T0 * T0;
9272  }
9273  else
9274  {
9275  T1 = 1.0 / (0.8 + T2);
9276  T0 = (17.0 + 20.0 * T2) * T1;
9277  dT0_dVb = -paramPtr->keta * T1 * T1;
9278  }
9279 
9280  dAbulk_dVg *= T0;
9281  dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb;
9282  dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb;
9283  Abulk *= T0;
9284  Abulk0 *= T0;
9285 
9286  // Mobility calculation
9287  if (model_.mtrlMod)
9288  T14 = 2.0 * model_.dtype *(model_.phig - model_.easub - 0.5*model_.Eg0 + 0.45);
9289  else
9290  T14 = 0.0;
9291 
9292  if (model_.mobMod == 0)
9293  { T0 = Vgsteff + Vth + Vth - T14;
9294  T2 = paramPtr->ua + paramPtr->uc * Vbseff;
9295  T3 = T0 / toxe;
9296  T12 = sqrt(Vth * Vth + 0.0001);
9297  T9 = 1.0/(Vgsteff + 2*T12);
9298  T10 = T9*toxe;
9299  T8 = paramPtr->ud * T10 * T10 * Vth;
9300  T6 = T8 * Vth;
9301  T5 = T3 * (T2 + paramPtr->ub * T3) + T6;
9302  T7 = - 2.0 * T6 * T9;
9303  T11 = T7 * Vth/T12;
9304  dDenomi_dVg = (T2 + 2.0 * paramPtr->ub * T3) / toxe;
9305  T13 = 2.0 * (dDenomi_dVg + T11 + T8);
9306  dDenomi_dVd = T13 * dVth_dVd;
9307  dDenomi_dVb = T13 * dVth_dVb + paramPtr->uc * T3;
9308  dDenomi_dVg+= T7;
9309  }
9310  else if (model_.mobMod == 1)
9311  { T0 = Vgsteff + Vth + Vth - T14;
9312  T2 = 1.0 + paramPtr->uc * Vbseff;
9313  T3 = T0 / toxe;
9314  T4 = T3 * (paramPtr->ua + paramPtr->ub * T3);
9315  T12 = sqrt(Vth * Vth + 0.0001);
9316  T9 = 1.0/(Vgsteff + 2*T12);
9317  T10 = T9*toxe;
9318  T8 = paramPtr->ud * T10 * T10 * Vth;
9319  T6 = T8 * Vth;
9320  T5 = T4 * T2 + T6;
9321  T7 = - 2.0 * T6 * T9;
9322  T11 = T7 * Vth/T12;
9323  dDenomi_dVg = (paramPtr->ua + 2.0 * paramPtr->ub * T3) * T2 / toxe;
9324  T13 = 2.0 * (dDenomi_dVg + T11 + T8);
9325  dDenomi_dVd = T13 * dVth_dVd;
9326  dDenomi_dVb = T13 * dVth_dVb + paramPtr->uc * T4;
9327  dDenomi_dVg+= T7;
9328  }
9329  else
9330  { T0 = (Vgsteff + vtfbphi1) / toxe;
9331  T1 = exp(paramPtr->eu * log(T0));
9332  dT1_dVg = T1 * paramPtr->eu / T0 / toxe;
9333  T2 = paramPtr->ua + paramPtr->uc * Vbseff;
9334  T3 = T0 / toxe;
9335  T12 = sqrt(Vth * Vth + 0.0001);
9336  T9 = 1.0/(Vgsteff + 2*T12);
9337  T10 = T9*toxe;
9338  T8 = paramPtr->ud * T10 * T10 * Vth;
9339  T6 = T8 * Vth;
9340  T5 = T1 * T2 + T6;
9341  T7 = - 2.0 * T6 * T9;
9342  T11 = T7 * Vth/T12;
9343  dDenomi_dVg = T2 * dT1_dVg + T7;
9344  T13 = 2.0 * (T11 + T8);
9345  dDenomi_dVd = T13 * dVth_dVd;
9346  dDenomi_dVb = T13 * dVth_dVb + T1 * paramPtr->uc;
9347  }
9348 
9349  if (T5 >= -0.8)
9350  {
9351  Denomi = 1.0 + T5;
9352  }
9353  else
9354  {
9355  T9 = 1.0 / (7.0 + 10.0 * T5);
9356  Denomi = (0.6 + T5) * T9;
9357  T9 *= T9;
9358  dDenomi_dVg *= T9;
9359  dDenomi_dVd *= T9;
9360  dDenomi_dVb *= T9;
9361  }
9362 
9363  ueff = ueff = u0temp / Denomi;
9364  T9 = -ueff / Denomi;
9365  dueff_dVg = T9 * dDenomi_dVg;
9366  dueff_dVd = T9 * dDenomi_dVd;
9367  dueff_dVb = T9 * dDenomi_dVb;
9368 
9369  // Saturation Drain Voltage Vdsat
9370  WVCox = Weff * vsattemp * model_.coxe;
9371  WVCoxRds = WVCox * Rds;
9372 
9373  Esat = 2.0 * vsattemp / ueff;
9374  EsatL = EsatL = Esat * Leff;
9375  T0 = -EsatL /ueff;
9376  dEsatL_dVg = T0 * dueff_dVg;
9377  dEsatL_dVd = T0 * dueff_dVd;
9378  dEsatL_dVb = T0 * dueff_dVb;
9379 
9380  // Sqrt()
9381  a1 = paramPtr->a1;
9382  if (a1 == 0.0)
9383  {
9384  Lambda = paramPtr->a2;
9385  dLambda_dVg = 0.0;
9386  }
9387  else if (a1 > 0.0)
9388  {
9389  T0 = 1.0 - paramPtr->a2;
9390  T1 = T0 - paramPtr->a1 * Vgsteff - 0.0001;
9391  T2 = sqrt(T1 * T1 + 0.0004 * T0);
9392  Lambda = paramPtr->a2 + T0 - 0.5 * (T1 + T2);
9393  dLambda_dVg = 0.5 * paramPtr->a1 * (1.0 + T1 / T2);
9394  }
9395  else
9396  {
9397  T1 = paramPtr->a2 + paramPtr->a1 * Vgsteff - 0.0001;
9398  T2 = sqrt(T1 * T1 + 0.0004 * paramPtr->a2);
9399  Lambda = 0.5 * (T1 + T2);
9400  dLambda_dVg = 0.5 * paramPtr->a1 * (1.0 + T1 / T2);
9401  }
9402 
9403  Vgst2Vtm = Vgsteff + 2.0 * Vtm;
9404  if (Rds > 0)
9405  {
9406  tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff;
9407  tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff;
9408  }
9409  else
9410  {
9411  tmp2 = dWeff_dVg / Weff;
9412  tmp3 = dWeff_dVb / Weff;
9413  }
9414  if ((Rds == 0.0) && (Lambda == 1.0))
9415  {
9416  T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm);
9417  tmp1 = 0.0;
9418  T1 = T0 * T0;
9419  T2 = Vgst2Vtm * T0;
9420  T3 = EsatL * Vgst2Vtm;
9421  Vdsat = T3 * T0;
9422 
9423  dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1;
9424  dT0_dVd = -(Abulk * dEsatL_dVd) * T1;
9425  dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1;
9426 
9427  dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0;
9428  dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd;
9429  dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb;
9430  }
9431  else
9432  {
9433  tmp1 = dLambda_dVg / (Lambda * Lambda);
9434  T9 = Abulk * WVCoxRds;
9435  T8 = Abulk * T9;
9436  T7 = Vgst2Vtm * T9;
9437  T6 = Vgst2Vtm * WVCoxRds;
9438  T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda);
9439  dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1
9440  + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg);
9441 
9442  dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3)
9443  + (1.0 / Lambda - 1.0) * dAbulk_dVb);
9444  dT0_dVd = 0.0;
9445  T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7;
9446 
9447  dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1
9448  + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9
9449  + T7 * tmp2 + T6 * dAbulk_dVg);
9450  dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb
9451  + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3);
9452  dT1_dVd = Abulk * dEsatL_dVd;
9453 
9454  T2 = Vgst2Vtm * (EsatL + 2.0 * T6);
9455  dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg
9456  + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2);
9457  dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3);
9458  dT2_dVd = Vgst2Vtm * dEsatL_dVd;
9459 
9460  T3 = sqrt(T1 * T1 - 2.0 * T0 * T2);
9461  Vdsat = (T1 - T3) / T0;
9462 
9463  dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg))
9464  / T3;
9465  dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd))
9466  / T3;
9467  dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb))
9468  / T3;
9469 
9470  dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2
9471  - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0;
9472  dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2
9473  - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0;
9474  dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0;
9475  }
9476  vdsat = Vdsat;
9477 
9478  // Calculate Vdseff
9479  T1 = Vdsat - Vds - paramPtr->delta;
9480  dT1_dVg = dVdsat_dVg;
9481  dT1_dVd = dVdsat_dVd - 1.0;
9482  dT1_dVb = dVdsat_dVb;
9483 
9484  T2 = sqrt(T1 * T1 + 4.0 * paramPtr->delta * Vdsat);
9485  T0 = T1 / T2;
9486  T9 = 2.0 * paramPtr->delta;
9487  T3 = T9 / T2;
9488  dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg;
9489  dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd;
9490  dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb;
9491 
9492  if (T1 >= 0.0)
9493  {
9494  Vdseff = Vdsat - 0.5 * (T1 + T2);
9495  dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg);
9496  dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd);
9497  dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb);
9498  }
9499  else
9500  {
9501  T4 = T9 / (T2 - T1);
9502  T5 = 1.0 - T4;
9503  T6 = Vdsat * T4 / (T2 - T1);
9504  Vdseff = Vdsat * T5;
9505  dVdseff_dVg = dVdsat_dVg * T5 + T6 * (dT2_dVg - dT1_dVg);
9506  dVdseff_dVd = dVdsat_dVd * T5 + T6 * (dT2_dVd - dT1_dVd);
9507  dVdseff_dVb = dVdsat_dVb * T5 + T6 * (dT2_dVb - dT1_dVb);
9508  }
9509 
9510  if (Vds == 0.0)
9511  {
9512  Vdseff = 0.0;
9513  dVdseff_dVg = 0.0;
9514  dVdseff_dVb = 0.0;
9515  }
9516 
9517  if (Vdseff > Vds)
9518  {
9519  Vdseff = Vds;
9520  }
9521 
9522  diffVds = Vds - Vdseff;
9523  Vdseff = Vdseff;
9524 
9525  // Velocity Overshoot
9526  if((model_.lambdaGiven) && (model_.lambda > 0.0) )
9527  {
9528  T1 = Leff * ueff;
9529  T2 = paramPtr->lambda / T1;
9530  T3 = -T2 / T1 * Leff;
9531  dT2_dVd = T3 * dueff_dVd;
9532  dT2_dVg = T3 * dueff_dVg;
9533  dT2_dVb = T3 * dueff_dVb;
9534  T5 = 1.0 / (Esat * paramPtr->litl);
9535  T4 = -T5 / EsatL;
9536  dT5_dVg = dEsatL_dVg * T4;
9537  dT5_dVd = dEsatL_dVd * T4;
9538  dT5_dVb = dEsatL_dVb * T4;
9539  T6 = 1.0 + diffVds * T5;
9540  dT6_dVg = dT5_dVg * diffVds - dVdseff_dVg * T5;
9541  dT6_dVd = dT5_dVd * diffVds + (1.0 - dVdseff_dVd) * T5;
9542  dT6_dVb = dT5_dVb * diffVds - dVdseff_dVb * T5;
9543  T7 = 2.0 / (T6 * T6 + 1.0);
9544  T8 = 1.0 - T7;
9545  T9 = T6 * T7 * T7;
9546  dT8_dVg = T9 * dT6_dVg;
9547  dT8_dVd = T9 * dT6_dVd;
9548  dT8_dVb = T9 * dT6_dVb;
9549  T10 = 1.0 + T2 * T8;
9550  dT10_dVg = dT2_dVg * T8 + T2 * dT8_dVg;
9551  dT10_dVd = dT2_dVd * T8 + T2 * dT8_dVd;
9552  dT10_dVb = dT2_dVb * T8 + T2 * dT8_dVb;
9553  if(T10 == 1.0)
9554  {
9555  dT10_dVg = dT10_dVd = dT10_dVb = 0.0;
9556  }
9557 
9558  dEsatL_dVg *= T10;
9559  dEsatL_dVg += EsatL * dT10_dVg;
9560  dEsatL_dVd *= T10;
9561  dEsatL_dVd += EsatL * dT10_dVd;
9562  dEsatL_dVb *= T10;
9563  dEsatL_dVb += EsatL * dT10_dVb;
9564  EsatL *= T10;
9565  EsatL = EsatL;
9566  }
9567 
9568  // Calculate Vasat
9569  tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm;
9570  T9 = WVCoxRds * Vgsteff;
9571  T8 = T9 / Vgst2Vtm;
9572  T0 = EsatL + Vdsat + 2.0 * T9 * tmp4;
9573 
9574  T7 = 2.0 * WVCoxRds * tmp4;
9575  dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff)
9576  - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm
9577  + Vdsat * dAbulk_dVg);
9578 
9579  dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff
9580  - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb);
9581  dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd;
9582 
9583  T9 = WVCoxRds * Abulk;
9584  T1 = 2.0 / Lambda - 1.0 + T9;
9585  dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg);
9586  dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3;
9587 
9588  Vasat = T0 / T1;
9589  dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1;
9590  dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1;
9591  dVasat_dVd = dT0_dVd / T1;
9592 
9593  // Calculate Idl first
9594  tmp1 = vtfbphi2;
9595  tmp2 = 2.0e8 * model_.toxp;
9596  dT0_dVg = 1.0 / tmp2;
9597  T0 = (Vgsteff + tmp1) * dT0_dVg;
9598 
9599  tmp3 = exp(model_.bdos * 0.7 * log(T0));
9600  T1 = 1.0 + tmp3;
9601  T2 = model_.bdos * 0.7 * tmp3 / T0;
9602  Tcen = model_.ados * 1.9e-9 / T1;
9603  dTcen_dVg = -Tcen * T2 * dT0_dVg / T1;
9604 
9605  Coxeff = epssub * model_.coxp / (epssub + model_.coxp * Tcen);
9606  dCoxeff_dVg = -Coxeff * Coxeff * dTcen_dVg / epssub;
9607 
9608  CoxeffWovL = Coxeff * Weff / Leff;
9609  beta = ueff * CoxeffWovL;
9610  T3 = ueff / Leff;
9611  dbeta_dVg = CoxeffWovL * dueff_dVg + T3
9612  * (Weff * dCoxeff_dVg + Coxeff * dWeff_dVg);
9613  dbeta_dVd = CoxeffWovL * dueff_dVd;
9614  dbeta_dVb = CoxeffWovL * dueff_dVb + T3 * Coxeff * dWeff_dVb;
9615 
9616  AbovVgst2Vtm = Abulk / Vgst2Vtm;
9617  T0 = 1.0 - 0.5 * Vdseff * AbovVgst2Vtm;
9618  dT0_dVg = -0.5 * (Abulk * dVdseff_dVg
9619  - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm;
9620  dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm;
9621  dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) / Vgst2Vtm;
9622 
9623  fgche1 = Vgsteff * T0;
9624  dfgche1_dVg = Vgsteff * dT0_dVg + T0;
9625  dfgche1_dVd = Vgsteff * dT0_dVd;
9626  dfgche1_dVb = Vgsteff * dT0_dVb;
9627 
9628  T9 = Vdseff / EsatL;
9629  fgche2 = 1.0 + T9;
9630  dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL;
9631  dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL;
9632  dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL;
9633 
9634  gche = beta * fgche1 / fgche2;
9635  dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg
9636  - gche * dfgche2_dVg) / fgche2;
9637  dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd
9638  - gche * dfgche2_dVd) / fgche2;
9639  dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb
9640  - gche * dfgche2_dVb) / fgche2;
9641 
9642  T0 = 1.0 + gche * Rds;
9643  Idl = gche / T0;
9644  T1 = (1.0 - Idl * Rds) / T0;
9645  T2 = Idl * Idl;
9646  dIdl_dVg = T1 * dgche_dVg - T2 * dRds_dVg;
9647  dIdl_dVd = T1 * dgche_dVd;
9648  dIdl_dVb = T1 * dgche_dVb - T2 * dRds_dVb;
9649 
9650  // Calculate degradation factor due to pocket implant
9651  if (paramPtr->fprout <= 0.0)
9652  {
9653  FP = 1.0;
9654  dFP_dVg = 0.0;
9655  }
9656  else
9657  {
9658  T9 = paramPtr->fprout * sqrt(Leff) / Vgst2Vtm;
9659  FP = 1.0 / (1.0 + T9);
9660  dFP_dVg = FP * FP * T9 / Vgst2Vtm;
9661  }
9662 
9663  // Calculate VACLM
9664  T8 = paramPtr->pvag / EsatL;
9665  T9 = T8 * Vgsteff;
9666  if (T9 > -0.9)
9667  {
9668  PvagTerm = 1.0 + T9;
9669  dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL);
9670  dPvagTerm_dVb = -T9 * dEsatL_dVb / EsatL;
9671  dPvagTerm_dVd = -T9 * dEsatL_dVd / EsatL;
9672  }
9673  else
9674  {
9675  T4 = 1.0 / (17.0 + 20.0 * T9);
9676  PvagTerm = (0.8 + T9) * T4;
9677  T4 *= T4;
9678  dPvagTerm_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T4;
9679  T9 *= T4 / EsatL;
9680  dPvagTerm_dVb = -T9 * dEsatL_dVb;
9681  dPvagTerm_dVd = -T9 * dEsatL_dVd;
9682  }
9683 
9684  if ((paramPtr->pclm > CONSTMIN_EXP) && (diffVds > 1.0e-10))
9685  {
9686  T0 = 1.0 + Rds * Idl;
9687  dT0_dVg = dRds_dVg * Idl + Rds * dIdl_dVg;
9688  dT0_dVd = Rds * dIdl_dVd;
9689  dT0_dVb = dRds_dVb * Idl + Rds * dIdl_dVb;
9690 
9691  T2 = Vdsat / Esat;
9692  T1 = Leff + T2;
9693  dT1_dVg = (dVdsat_dVg - T2 * dEsatL_dVg / Leff) / Esat;
9694  dT1_dVd = (dVdsat_dVd - T2 * dEsatL_dVd / Leff) / Esat;
9695  dT1_dVb = (dVdsat_dVb - T2 * dEsatL_dVb / Leff) / Esat;
9696 
9697  Cclm = FP * PvagTerm * T0 * T1 / (paramPtr->pclm * paramPtr->litl);
9698  dCclm_dVg = Cclm * (dFP_dVg / FP + dPvagTerm_dVg / PvagTerm
9699  + dT0_dVg / T0 + dT1_dVg / T1);
9700  dCclm_dVb = Cclm * (dPvagTerm_dVb / PvagTerm + dT0_dVb / T0
9701  + dT1_dVb / T1);
9702  dCclm_dVd = Cclm * (dPvagTerm_dVd / PvagTerm + dT0_dVd / T0
9703  + dT1_dVd / T1);
9704  VACLM = Cclm * diffVds;
9705 
9706  dVACLM_dVg = dCclm_dVg * diffVds - dVdseff_dVg * Cclm;
9707  dVACLM_dVb = dCclm_dVb * diffVds - dVdseff_dVb * Cclm;
9708  dVACLM_dVd = dCclm_dVd * diffVds + (1.0 - dVdseff_dVd) * Cclm;
9709  }
9710  else
9711  {
9712  VACLM = Cclm = CONSTMAX_EXP;
9713  dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0;
9714  dCclm_dVd = dCclm_dVg = dCclm_dVb = 0.0;
9715  }
9716 
9717  // Calculate VADIBL
9719  {
9720  T8 = Abulk * Vdsat;
9721  T0 = Vgst2Vtm * T8;
9722  dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8
9723  + Vgst2Vtm * Vdsat * dAbulk_dVg;
9724  dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb);
9725  dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd;
9726 
9727  T1 = Vgst2Vtm + T8;
9728  dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg;
9729  dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat;
9730  dT1_dVd = Abulk * dVdsat_dVd;
9731 
9732  T9 = T1 * T1;
9733  T2 = paramPtr->thetaRout;
9734  VADIBL = (Vgst2Vtm - T0 / T1) / T2;
9735  dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2;
9736  dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2;
9737  dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2;
9738 
9739  T7 = paramPtr->pdiblb * Vbseff;
9740  if (T7 >= -0.9)
9741  {
9742  T3 = 1.0 / (1.0 + T7);
9743  VADIBL *= T3;
9744  dVADIBL_dVg *= T3;
9745  dVADIBL_dVb = (dVADIBL_dVb - VADIBL * paramPtr->pdiblb) * T3;
9746  dVADIBL_dVd *= T3;
9747  }
9748  else
9749  {
9750  T4 = 1.0 / (0.8 + T7);
9751  T3 = (17.0 + 20.0 * T7) * T4;
9752  dVADIBL_dVg *= T3;
9753  dVADIBL_dVb = dVADIBL_dVb * T3
9754  - VADIBL * paramPtr->pdiblb * T4 * T4;
9755  dVADIBL_dVd *= T3;
9756  VADIBL *= T3;
9757  }
9758 
9759  dVADIBL_dVg = dVADIBL_dVg * PvagTerm + VADIBL * dPvagTerm_dVg;
9760  dVADIBL_dVb = dVADIBL_dVb * PvagTerm + VADIBL * dPvagTerm_dVb;
9761  dVADIBL_dVd = dVADIBL_dVd * PvagTerm + VADIBL * dPvagTerm_dVd;
9762  VADIBL *= PvagTerm;
9763  }
9764  else
9765  {
9766  VADIBL = CONSTMAX_EXP;
9767  dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0;
9768  }
9769 
9770  // Calculate Va
9771  Va = Vasat + VACLM;
9772  dVa_dVg = dVasat_dVg + dVACLM_dVg;
9773  dVa_dVb = dVasat_dVb + dVACLM_dVb;
9774  dVa_dVd = dVasat_dVd + dVACLM_dVd;
9775 
9776  // Calculate VADITS
9777  T0 = paramPtr->pditsd * Vds;
9778  if (T0 > CONSTEXP_THRESHOLD)
9779  {
9780  T1 = CONSTMAX_EXP;
9781  dT1_dVd = 0;
9782  }
9783  else
9784  {
9785  T1 = exp(T0);
9786  dT1_dVd = T1 * paramPtr->pditsd;
9787  }
9788 
9789  if (paramPtr->pdits > CONSTMIN_EXP)
9790  {
9791  T2 = 1.0 + model_.pditsl * Leff;
9792  VADITS = (1.0 + T2 * T1) / paramPtr->pdits;
9793  dVADITS_dVg = VADITS * dFP_dVg;
9794  dVADITS_dVd = FP * T2 * dT1_dVd / paramPtr->pdits;
9795  VADITS *= FP;
9796  }
9797  else
9798  {
9799  VADITS = CONSTMAX_EXP;
9800  dVADITS_dVg = dVADITS_dVd = 0;
9801  }
9802 
9803  // Calculate VASCBE
9804  if (paramPtr->pscbe2 > 0.0)
9805  {
9806  if (diffVds > paramPtr->pscbe1 * paramPtr->litl / CONSTEXP_THRESHOLD)
9807  {
9808  T0 = paramPtr->pscbe1 * paramPtr->litl / diffVds;
9809  VASCBE = Leff * exp(T0) / paramPtr->pscbe2;
9810  T1 = T0 * VASCBE / diffVds;
9811  dVASCBE_dVg = T1 * dVdseff_dVg;
9812  dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd);
9813  dVASCBE_dVb = T1 * dVdseff_dVb;
9814  }
9815  else
9816  {
9817  VASCBE = CONSTMAX_EXP * Leff/paramPtr->pscbe2;
9818  dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0;
9819  }
9820  }
9821  else
9822  {
9823  VASCBE = CONSTMAX_EXP;
9824  dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0;
9825  }
9826 
9827  // Add DIBL to Ids
9828  T9 = diffVds / VADIBL;
9829  T0 = 1.0 + T9;
9830  Idsa = Idl * T0;
9831  dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVADIBL_dVg) / VADIBL;
9832  dIdsa_dVd = T0 * dIdl_dVd + Idl
9833  * (1.0 - dVdseff_dVd - T9 * dVADIBL_dVd) / VADIBL;
9834  dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVADIBL_dVb) / VADIBL;
9835 
9836  // Add DITS to Ids
9837  T9 = diffVds / VADITS;
9838  T0 = 1.0 + T9;
9839  dIdsa_dVg = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVADITS_dVg) / VADITS;
9840  dIdsa_dVd = T0 * dIdsa_dVd + Idsa * (1.0 - dVdseff_dVd - T9 * dVADITS_dVd) / VADITS;
9841  dIdsa_dVb = T0 * dIdsa_dVb - Idsa * dVdseff_dVb / VADITS;
9842  Idsa *= T0;
9843 
9844  // Add CLM to Ids
9845  T0 = log(Va / Vasat);
9846  dT0_dVg = dVa_dVg / Va - dVasat_dVg / Vasat;
9847  dT0_dVb = dVa_dVb / Va - dVasat_dVb / Vasat;
9848  dT0_dVd = dVa_dVd / Va - dVasat_dVd / Vasat;
9849  T1 = T0 / Cclm;
9850  T9 = 1.0 + T1;
9851  dT9_dVg = (dT0_dVg - T1 * dCclm_dVg) / Cclm;
9852  dT9_dVb = (dT0_dVb - T1 * dCclm_dVb) / Cclm;
9853  dT9_dVd = (dT0_dVd - T1 * dCclm_dVd) / Cclm;
9854 
9855  dIdsa_dVg = dIdsa_dVg * T9 + Idsa * dT9_dVg;
9856  dIdsa_dVb = dIdsa_dVb * T9 + Idsa * dT9_dVb;
9857  dIdsa_dVd = dIdsa_dVd * T9 + Idsa * dT9_dVd;
9858  Idsa *= T9;
9859 
9860  // Substrate current begins
9861  tmp = paramPtr->alpha0 + paramPtr->alpha1 * Leff;
9862  if ((tmp <= 0.0) || (paramPtr->beta0 <= 0.0))
9863  {
9864  Isub = Gbd = Gbb = Gbg = 0.0;
9865  }
9866  else
9867  {
9868  T2 = tmp / Leff;
9869  if (diffVds > paramPtr->beta0 / CONSTEXP_THRESHOLD)
9870  {
9871  T0 = -paramPtr->beta0 / diffVds;
9872  T1 = T2 * diffVds * exp(T0);
9873  T3 = T1 / diffVds * (T0 - 1.0);
9874  dT1_dVg = T3 * dVdseff_dVg;
9875  dT1_dVd = T3 * (dVdseff_dVd - 1.0);
9876  dT1_dVb = T3 * dVdseff_dVb;
9877  }
9878  else
9879  {
9880  T3 = T2 * CONSTMIN_EXP;
9881  T1 = T3 * diffVds;
9882  dT1_dVg = -T3 * dVdseff_dVg;
9883  dT1_dVd = T3 * (1.0 - dVdseff_dVd);
9884  dT1_dVb = -T3 * dVdseff_dVb;
9885  }
9886  T4 = Idsa * Vdseff;
9887  Isub = T1 * T4;
9888  Gbg = T1 * (dIdsa_dVg * Vdseff + Idsa * dVdseff_dVg)
9889  + T4 * dT1_dVg;
9890  Gbd = T1 * (dIdsa_dVd * Vdseff + Idsa * dVdseff_dVd)
9891  + T4 * dT1_dVd;
9892  Gbb = T1 * (dIdsa_dVb * Vdseff + Idsa * dVdseff_dVb)
9893  + T4 * dT1_dVb;
9894 
9895  Gbd += Gbg * dVgsteff_dVd;
9896  Gbb += Gbg * dVgsteff_dVb;
9897  Gbg *= dVgsteff_dVg;
9898  Gbb *= dVbseff_dVb;
9899  }
9900  csub = Isub;
9901  gbbs = Gbb;
9902  gbgs = Gbg;
9903  gbds = Gbd;
9904 
9905  // Add SCBE to Ids
9906  T9 = diffVds / VASCBE;
9907  T0 = 1.0 + T9;
9908  Ids = Idsa * T0;
9909 
9910  Gm = T0 * dIdsa_dVg - Idsa
9911  * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE;
9912  Gds = T0 * dIdsa_dVd + Idsa
9913  * (1.0 - dVdseff_dVd - T9 * dVASCBE_dVd) / VASCBE;
9914  Gmb = T0 * dIdsa_dVb - Idsa
9915  * (dVdseff_dVb + T9 * dVASCBE_dVb) / VASCBE;
9916 
9917 
9918  tmp1 = Gds + Gm * dVgsteff_dVd;
9919  tmp2 = Gmb + Gm * dVgsteff_dVb;
9920  tmp3 = Gm;
9921 
9922  Gm = (Ids * dVdseff_dVg + Vdseff * tmp3) * dVgsteff_dVg;
9923  Gds = Ids * (dVdseff_dVd + dVdseff_dVg * dVgsteff_dVd)
9924  + Vdseff * tmp1;
9925  Gmb = (Ids * (dVdseff_dVb + dVdseff_dVg * dVgsteff_dVb)
9926  + Vdseff * tmp2) * dVbseff_dVb;
9927 
9928  cdrain = Ids * Vdseff;
9929 
9930  // Source End Velocity Limit
9931  if((model_.vtlGiven) && (model_.vtl > 0.0) )
9932  {
9933  T12 = 1.0 / Leff / CoxeffWovL;
9934  T11 = T12 / Vgsteff;
9935  T10 = -T11 / Vgsteff;
9936  vs = cdrain * T11; // vs
9937  dvs_dVg = Gm * T11 + cdrain * T10 * dVgsteff_dVg;
9938  dvs_dVd = Gds * T11 + cdrain * T10 * dVgsteff_dVd;
9939  dvs_dVb = Gmb * T11 + cdrain * T10 * dVgsteff_dVb;
9940  T0 = 2 * CONSTMM;
9941  T1 = vs / (paramPtr->vtl * paramPtr->tfactor);
9942 
9943  if(T1 > 0.0)
9944  {
9945  T2 = 1.0 + exp(T0 * log(T1));
9946  T3 = (T2 - 1.0) * T0 / vs;
9947  Fsevl = 1.0 / exp(log(T2)/ T0);
9948  dT2_dVg = T3 * dvs_dVg;
9949  dT2_dVd = T3 * dvs_dVd;
9950  dT2_dVb = T3 * dvs_dVb;
9951  T4 = -1.0 / T0 * Fsevl / T2;
9952  dFsevl_dVg = T4 * dT2_dVg;
9953  dFsevl_dVd = T4 * dT2_dVd;
9954  dFsevl_dVb = T4 * dT2_dVb;
9955  }
9956  else
9957  {
9958  Fsevl = 1.0;
9959  dFsevl_dVg = 0.0;
9960  dFsevl_dVd = 0.0;
9961  dFsevl_dVb = 0.0;
9962  }
9963  Gm *=Fsevl;
9964  Gm += cdrain * dFsevl_dVg;
9965  Gmb *=Fsevl;
9966  Gmb += cdrain * dFsevl_dVb;
9967  Gds *=Fsevl;
9968  Gds += cdrain * dFsevl_dVd;
9969 
9970  cdrain *= Fsevl;
9971  }
9972 
9973  gds = Gds;
9974  gm = Gm;
9975  gmbs = Gmb;
9976  IdovVds = Ids;
9977  if( IdovVds <= 1.0e-9) IdovVds = 1.0e-9;
9978 
9979  // Calculate Rg
9980  if ((rgateMod > 1) || (trnqsMod != 0) || (acnqsMod != 0))
9981  {
9982  T9 = paramPtr->xrcrg2 * model_.vtm;
9983  T0 = T9 * beta;
9984  dT0_dVd = (dbeta_dVd + dbeta_dVg * dVgsteff_dVd) * T9;
9985  dT0_dVb = (dbeta_dVb + dbeta_dVg * dVgsteff_dVb) * T9;
9986  dT0_dVg = dbeta_dVg * T9;
9987 
9988  gcrg = paramPtr->xrcrg1 * ( T0 + Ids);
9989  gcrgd = paramPtr->xrcrg1 * (dT0_dVd + tmp1);
9990  gcrgb = paramPtr->xrcrg1 * (dT0_dVb + tmp2)
9991  * dVbseff_dVb;
9992  gcrgg = paramPtr->xrcrg1 * (dT0_dVg + tmp3)
9993  * dVgsteff_dVg;
9994 
9995  if (nf != 1.0)
9996  {
9997  gcrg *= nf;
9998  gcrgg *= nf;
9999  gcrgd *= nf;
10000  gcrgb *= nf;
10001  }
10002 
10003  if (rgateMod == 2)
10004  {
10005  T10 = grgeltd * grgeltd;
10006  T11 = grgeltd + gcrg;
10007  gcrg = grgeltd * gcrg / T11;
10008  T12 = T10 / T11 / T11;
10009  gcrgg *= T12;
10010  gcrgd *= T12;
10011  gcrgb *= T12;
10012  }
10013  gcrgs = -(gcrgg + gcrgd + gcrgb);
10014  }
10015 
10016  // Calculate bias-dependent external S/D resistance
10017  if (model_.rdsMod)
10018  { // Rs(V)
10019  T0 = vgs - paramPtr->vfbsd;
10020  T1 = sqrt(T0 * T0 + 1.0e-4);
10021  vgs_eff = 0.5 * (T0 + T1);
10022  dvgs_eff_dvg = vgs_eff / T1;
10023 
10024  T0 = 1.0 + paramPtr->prwg * vgs_eff;
10025  dT0_dvg = -paramPtr->prwg / T0 / T0 * dvgs_eff_dvg;
10026  T1 = -paramPtr->prwb * vbs;
10027  dT1_dvb = -paramPtr->prwb;
10028 
10029  T2 = 1.0 / T0 + T1;
10030  T3 = T2 + sqrt(T2 * T2 + 0.01);
10031  dT3_dvg = T3 / (T3 - T2);
10032  dT3_dvb = dT3_dvg * dT1_dvb;
10033  dT3_dvg *= dT0_dvg;
10034 
10035  T4 = paramPtr->rs0 * 0.5;
10036  Rs = paramPtr->rswmin + T3 * T4;
10037  dRs_dvg = T4 * dT3_dvg;
10038  dRs_dvb = T4 * dT3_dvb;
10039 
10040  T0 = 1.0 + sourceConductance * Rs;
10042  T0 = -gstot * gstot;
10043  dgstot_dvd = 0.0; // place holder
10044  dgstot_dvg = T0 * dRs_dvg;
10045  dgstot_dvb = T0 * dRs_dvb;
10046  dgstot_dvs = -(dgstot_dvg + dgstot_dvb + dgstot_dvd);
10047 
10048  // Rd(V)
10049  T0 = vgd - paramPtr->vfbsd;
10050  T1 = sqrt(T0 * T0 + 1.0e-4);
10051  vgd_eff = 0.5 * (T0 + T1);
10052  dvgd_eff_dvg = vgd_eff / T1;
10053 
10054  T0 = 1.0 + paramPtr->prwg * vgd_eff;
10055  dT0_dvg = -paramPtr->prwg / T0 / T0 * dvgd_eff_dvg;
10056  T1 = -paramPtr->prwb * vbd;
10057  dT1_dvb = -paramPtr->prwb;
10058 
10059  T2 = 1.0 / T0 + T1;
10060  T3 = T2 + sqrt(T2 * T2 + 0.01);
10061  dT3_dvg = T3 / (T3 - T2);
10062  dT3_dvb = dT3_dvg * dT1_dvb;
10063  dT3_dvg *= dT0_dvg;
10064 
10065  T4 = paramPtr->rd0 * 0.5;
10066  Rd = paramPtr->rdwmin + T3 * T4;
10067  dRd_dvg = T4 * dT3_dvg;
10068  dRd_dvb = T4 * dT3_dvb;
10069 
10070  T0 = 1.0 + drainConductance * Rd;
10072  T0 = -gdtot * gdtot;
10073  dgdtot_dvs = 0.0;
10074  dgdtot_dvg = T0 * dRd_dvg;
10075  dgdtot_dvb = T0 * dRd_dvb;
10076  dgdtot_dvd = -(dgdtot_dvg + dgdtot_dvb + dgdtot_dvs);
10077 
10078  gstotd = vses * dgstot_dvd;
10079  gstotg = vses * dgstot_dvg;
10080  gstots = vses * dgstot_dvs;
10081  gstotb = vses * dgstot_dvb;
10082 
10083  T2 = vdes - vds;
10084  gdtotd = T2 * dgdtot_dvd;
10085  gdtotg = T2 * dgdtot_dvg;
10086  gdtots = T2 * dgdtot_dvs;
10087  gdtotb = T2 * dgdtot_dvb;
10088  }
10089  else // WDLiu: for bypass
10090  {
10091  gstot = gstotd = gstotg = 0.0;
10092  gstots = gstotb = 0.0;
10093  gdtot = gdtotd = gdtotg = 0.0;
10094  gdtots = gdtotb = 0.0;
10095  }
10096 
10097  // Calculate GIDL current
10098  vgs_eff = vgs_eff;
10100  if (model_.mtrlMod == 0)
10101  {
10102  T0 = 3.0 * toxe;
10103  }
10104  else
10105  {
10106  T0 = model_.epsrsub * toxe / epsrox;
10107  }
10108 
10109  if(model_.mtrlMod ==0)
10110  T1 = (vds - vgs_eff - paramPtr->egidl ) / T0;
10111  else
10112  T1 = (vds - vgs_eff - paramPtr->egidl + paramPtr->vfbsd) / T0;
10113 
10114  if ((paramPtr->agidl <= 0.0) || (paramPtr->bgidl <= 0.0)
10115  || (T1 <= 0.0) || (paramPtr->cgidl <= 0.0) || (vbd > 0.0))
10116  {
10117  Igidl = Ggidld = Ggidlg = Ggidlb = 0.0;
10118  }
10119  else
10120  {
10121  dT1_dVd = 1.0 / T0;
10122  dT1_dVg = -dvgs_eff_dvg * dT1_dVd;
10123  T2 = paramPtr->bgidl / T1;
10124  if (T2 < 100.0)
10125  {
10126  Igidl = paramPtr->agidl * paramPtr->weffCJ * T1 * exp(-T2);
10127  T3 = Igidl * (1.0 + T2) / T1;
10128  Ggidld = T3 * dT1_dVd;
10129  Ggidlg = T3 * dT1_dVg;
10130  }
10131  else
10132  {
10133  Igidl = paramPtr->agidl * paramPtr->weffCJ * 3.720075976e-44;
10134  Ggidld = Igidl * dT1_dVd;
10135  Ggidlg = Igidl * dT1_dVg;
10136  Igidl *= T1;
10137  }
10138 
10139  T4 = vbd * vbd;
10140  T5 = -vbd * T4;
10141  T6 = paramPtr->cgidl + T5;
10142  T7 = T5 / T6;
10143  T8 = 3.0 * paramPtr->cgidl * T4 / T6 / T6;
10144  Ggidld = Ggidld * T7 + Igidl * T8;
10145  Ggidlg = Ggidlg * T7;
10146  Ggidlb = -Igidl * T8;
10147  Igidl *= T7;
10148  }
10149  Igidl = Igidl;
10150  ggidld = Ggidld;
10151  ggidlg = Ggidlg;
10152  ggidlb = Ggidlb;
10153 
10154  // Calculate GISL current
10155  vgd_eff = vgd_eff;
10157 
10158  if (model_.mtrlMod == 0)
10159  {
10160  T1 = (-vds - vgd_eff - paramPtr->egisl ) / T0;
10161  }
10162  else
10163  {
10164  T1 = (-vds - vgd_eff - paramPtr->egisl + paramPtr->vfbsd ) / T0;
10165  }
10166 
10167  if ((paramPtr->agisl <= 0.0) || (paramPtr->bgisl <= 0.0)
10168  || (T1 <= 0.0) || (paramPtr->cgisl <= 0.0) || (vbs > 0.0))
10169  {
10170  Igisl = Ggisls = Ggislg = Ggislb = 0.0;
10171  }
10172  else
10173  {
10174  dT1_dVd = 1.0 / T0;
10175  dT1_dVg = -dvgd_eff_dvg * dT1_dVd;
10176  T2 = paramPtr->bgisl / T1;
10177  if (T2 < 100.0)
10178  {
10179  Igisl = paramPtr->agisl * paramPtr->weffCJ * T1 * exp(-T2);
10180  T3 = Igisl * (1.0 + T2) / T1;
10181  Ggisls = T3 * dT1_dVd;
10182  Ggislg = T3 * dT1_dVg;
10183  }
10184  else
10185  {
10186  Igisl = paramPtr->agisl * paramPtr->weffCJ * 3.720075976e-44;
10187  Ggisls = Igisl * dT1_dVd;
10188  Ggislg = Igisl * dT1_dVg;
10189  Igisl *= T1;
10190  }
10191 
10192  T4 = vbs * vbs;
10193  T5 = -vbs * T4;
10194  T6 = paramPtr->cgisl + T5;
10195  T7 = T5 / T6;
10196  T8 = 3.0 * paramPtr->cgisl * T4 / T6 / T6;
10197  Ggisls = Ggisls * T7 + Igisl * T8;
10198  Ggislg = Ggislg * T7;
10199  Ggislb = -Igisl * T8;
10200  Igisl *= T7;
10201  }
10202  Igisl = Igisl;
10203  ggisls = Ggisls;
10204  ggislg = Ggislg;
10205  ggislb = Ggislb;
10206 
10207 
10208  // Calculate gate tunneling current
10209  if ((model_.igcMod != 0) || (model_.igbMod != 0))
10210  {
10211  Vfb = vfbzb;
10212  V3 = Vfb - Vgs_eff + Vbseff - CONSTDELTA_3;
10213  if (Vfb <= 0.0)
10214  T0 = sqrt(V3 * V3 - 4.0 * CONSTDELTA_3 * Vfb);
10215  else
10216  T0 = sqrt(V3 * V3 + 4.0 * CONSTDELTA_3 * Vfb);
10217  T1 = 0.5 * (1.0 + V3 / T0);
10218  Vfbeff = Vfb - 0.5 * (V3 + T0);
10219  dVfbeff_dVg = T1 * dVgs_eff_dVg;
10220  dVfbeff_dVb = -T1; // WDLiu: -No surprise? No. -Good!
10221 
10222  Voxacc = Vfb - Vfbeff;
10223  dVoxacc_dVg = -dVfbeff_dVg;
10224  dVoxacc_dVb = -dVfbeff_dVb;
10225  if (Voxacc < 0.0) // WDLiu: Avoiding numerical instability.
10226  {
10227  Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0;
10228  }
10229 
10230  T0 = 0.5 * paramPtr->k1ox;
10231  T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff;
10232  if (paramPtr->k1ox == 0.0)
10233  {
10234  Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd = dVoxdepinv_dVb = 0.0;
10235  }
10236  else if (T3 < 0.0)
10237  {
10238  Voxdepinv = -T3;
10239  dVoxdepinv_dVg = -dVgs_eff_dVg + dVfbeff_dVg + dVgsteff_dVg;
10240  dVoxdepinv_dVd = dVgsteff_dVd;
10241  dVoxdepinv_dVb = dVfbeff_dVb + 1.0 + dVgsteff_dVb;
10242  }
10243  else
10244  {
10245  T1 = sqrt(T0 * T0 + T3);
10246  T2 = T0 / T1;
10247  Voxdepinv = paramPtr->k1ox * (T1 - T0);
10248  dVoxdepinv_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg);
10249  dVoxdepinv_dVd = -T2 * dVgsteff_dVd;
10250  dVoxdepinv_dVb = -T2 * (dVfbeff_dVb + 1.0 + dVgsteff_dVb);
10251  }
10252 
10253  Voxdepinv += Vgsteff;
10254  dVoxdepinv_dVg += dVgsteff_dVg;
10255  dVoxdepinv_dVd += dVgsteff_dVd;
10256  dVoxdepinv_dVb += dVgsteff_dVb;
10257  }
10258 
10259  if(model_.tempMod < 2)
10260  {
10261  tmp = Vtm;
10262  }
10263  else // model_.tempMod = 2
10264  {
10265  tmp = Vtm0;
10266  }
10267 
10268  if (model_.igcMod)
10269  {
10270  T0 = tmp * paramPtr->nigc;
10271  if(model_.igcMod == 1)
10272  {
10273  VxNVt = (Vgs_eff - model_.dtype * vth0) / T0;
10274  if (VxNVt > CONSTEXP_THRESHOLD)
10275  {
10276  Vaux = Vgs_eff - model_.dtype * vth0;
10277  dVaux_dVg = dVgs_eff_dVg;
10278  dVaux_dVd = 0.0;
10279  dVaux_dVb = 0.0;
10280  }
10281  }
10282  else if (model_.igcMod == 2)
10283  {
10284  VxNVt = (Vgs_eff - von) / T0;
10285  if (VxNVt > CONSTEXP_THRESHOLD)
10286  {
10287  Vaux = Vgs_eff - von;
10288  dVaux_dVg = dVgs_eff_dVg;
10289  dVaux_dVd = -dVth_dVd;
10290  dVaux_dVb = -dVth_dVb;
10291  }
10292  }
10293 
10294  if (VxNVt < -CONSTEXP_THRESHOLD)
10295  {
10296  Vaux = T0 * log(1.0 + CONSTMIN_EXP);
10297  dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0;
10298  }
10299  else if ((VxNVt >= -CONSTEXP_THRESHOLD) && (VxNVt <= CONSTEXP_THRESHOLD))
10300  {
10301  ExpVxNVt = exp(VxNVt);
10302  Vaux = T0 * log(1.0 + ExpVxNVt);
10303  dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt);
10304  if(model_.igcMod == 1)
10305  {
10306  dVaux_dVd = 0.0;
10307  dVaux_dVb = 0.0;
10308  }
10309  else if (model_.igcMod == 2)
10310  {
10311  dVaux_dVd = -dVgs_eff_dVg * dVth_dVd;
10312  dVaux_dVb = -dVgs_eff_dVg * dVth_dVb;
10313  }
10314  dVaux_dVg *= dVgs_eff_dVg;
10315  }
10316 
10317  T2 = Vgs_eff * Vaux;
10318  dT2_dVg = dVgs_eff_dVg * Vaux + Vgs_eff * dVaux_dVg;
10319  dT2_dVd = Vgs_eff * dVaux_dVd;
10320  dT2_dVb = Vgs_eff * dVaux_dVb;
10321 
10322  T11 = paramPtr->Aechvb;
10323  T12 = paramPtr->Bechvb;
10324  T3 = paramPtr->aigc * paramPtr->cigc
10325  - paramPtr->bigc;
10326  T4 = paramPtr->bigc * paramPtr->cigc;
10327  T5 = T12 * (paramPtr->aigc + T3 * Voxdepinv
10328  - T4 * Voxdepinv * Voxdepinv);
10329 
10330  if (T5 > CONSTEXP_THRESHOLD)
10331  {
10332  T6 = CONSTMAX_EXP;
10333  dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10334  }
10335  else if (T5 < -CONSTEXP_THRESHOLD)
10336  {
10337  T6 = CONSTMIN_EXP;
10338  dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10339  }
10340  else
10341  {
10342  T6 = exp(T5);
10343  dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv);
10344  dT6_dVd = dT6_dVg * dVoxdepinv_dVd;
10345  dT6_dVb = dT6_dVg * dVoxdepinv_dVb;
10346  dT6_dVg *= dVoxdepinv_dVg;
10347  }
10348 
10349  Igc = T11 * T2 * T6;
10350  dIgc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10351  dIgc_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd);
10352  dIgc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb);
10353 
10354  if (model_.pigcdGiven)
10355  {
10356  Pigcd = paramPtr->pigcd;
10357  dPigcd_dVg = dPigcd_dVd = dPigcd_dVb = 0.0;
10358  }
10359  else
10360  {
10361  T11 = paramPtr->Bechvb * toxe;
10362  T12 = Vgsteff + 1.0e-20;
10363  T13 = T11 / T12 / T12;
10364  T14 = -T13 / T12;
10365  Pigcd = T13 * (1.0 - 0.5 * Vdseff / T12);
10366  dPigcd_dVg = T14 * (2.0 + 0.5 * (dVdseff_dVg
10367  - 3.0 * Vdseff / T12));
10368  dPigcd_dVd = 0.5 * T14 * dVdseff_dVd;
10369  dPigcd_dVb = 0.5 * T14 * dVdseff_dVb;
10370  }
10371 
10372  T7 = -Pigcd * Vdseff; // bugfix
10373  dT7_dVg = -Vdseff * dPigcd_dVg - Pigcd * dVdseff_dVg;
10374  dT7_dVd = -Vdseff * dPigcd_dVd - Pigcd * dVdseff_dVd + dT7_dVg * dVgsteff_dVd;
10375  dT7_dVb = -Vdseff * dPigcd_dVb - Pigcd * dVdseff_dVb + dT7_dVg * dVgsteff_dVb;
10376  dT7_dVg *= dVgsteff_dVg;
10377  dT7_dVb *= dVbseff_dVb;
10378  T8 = T7 * T7 + 2.0e-4;
10379  dT8_dVg = 2.0 * T7;
10380  dT8_dVd = dT8_dVg * dT7_dVd;
10381  dT8_dVb = dT8_dVg * dT7_dVb;
10382  dT8_dVg *= dT7_dVg;
10383 
10384  if (T7 > CONSTEXP_THRESHOLD)
10385  {
10386  T9 = CONSTMAX_EXP;
10387  dT9_dVg = dT9_dVd = dT9_dVb = 0.0;
10388  }
10389  else if (T7 < -CONSTEXP_THRESHOLD)
10390  {
10391  T9 = CONSTMIN_EXP;
10392  dT9_dVg = dT9_dVd = dT9_dVb = 0.0;
10393  }
10394  else
10395  {
10396  T9 = exp(T7);
10397  dT9_dVg = T9 * dT7_dVg;
10398  dT9_dVd = T9 * dT7_dVd;
10399  dT9_dVb = T9 * dT7_dVb;
10400  }
10401 
10402  T0 = T8 * T8;
10403  T1 = T9 - 1.0 + 1.0e-4;
10404  T10 = (T1 - T7) / T8;
10405  dT10_dVg = (dT9_dVg - dT7_dVg - T10 * dT8_dVg) / T8;
10406  dT10_dVd = (dT9_dVd - dT7_dVd - T10 * dT8_dVd) / T8;
10407  dT10_dVb = (dT9_dVb - dT7_dVb - T10 * dT8_dVb) / T8;
10408 
10409  Igcs = Igc * T10;
10410  dIgcs_dVg = dIgc_dVg * T10 + Igc * dT10_dVg;
10411  dIgcs_dVd = dIgc_dVd * T10 + Igc * dT10_dVd;
10412  dIgcs_dVb = dIgc_dVb * T10 + Igc * dT10_dVb;
10413 
10414  T1 = T9 - 1.0 - 1.0e-4;
10415  T10 = (T7 * T9 - T1) / T8;
10416  dT10_dVg = (dT7_dVg * T9 + (T7 - 1.0) * dT9_dVg
10417  - T10 * dT8_dVg) / T8;
10418  dT10_dVd = (dT7_dVd * T9 + (T7 - 1.0) * dT9_dVd
10419  - T10 * dT8_dVd) / T8;
10420  dT10_dVb = (dT7_dVb * T9 + (T7 - 1.0) * dT9_dVb
10421  - T10 * dT8_dVb) / T8;
10422  Igcd = Igc * T10;
10423  dIgcd_dVg = dIgc_dVg * T10 + Igc * dT10_dVg;
10424  dIgcd_dVd = dIgc_dVd * T10 + Igc * dT10_dVd;
10425  dIgcd_dVb = dIgc_dVb * T10 + Igc * dT10_dVb;
10426 
10427  // Igcs = Igcs;
10428  gIgcsg = dIgcs_dVg;
10429  gIgcsd = dIgcs_dVd;
10430  gIgcsb = dIgcs_dVb * dVbseff_dVb;
10431  // Igcd = Igcd;
10432  gIgcdg = dIgcd_dVg;
10433  gIgcdd = dIgcd_dVd;
10434  gIgcdb = dIgcd_dVb * dVbseff_dVb;
10435 
10436  T0 = vgs - (paramPtr->vfbsd + paramPtr->vfbsdoff);
10437  vgs_eff = sqrt(T0 * T0 + 1.0e-4);
10438  dvgs_eff_dvg = T0 / vgs_eff;
10439 
10440  T2 = vgs * vgs_eff;
10441  dT2_dVg = vgs * dvgs_eff_dvg + vgs_eff;
10442  T11 = paramPtr->AechvbEdgeS;
10443  T12 = paramPtr->BechvbEdge;
10444  T3 = paramPtr->aigs * paramPtr->cigs
10445  - paramPtr->bigs;
10446  T4 = paramPtr->bigs * paramPtr->cigs;
10447  T5 = T12 * (paramPtr->aigs + T3 * vgs_eff
10448  - T4 * vgs_eff * vgs_eff);
10449  if (T5 > CONSTEXP_THRESHOLD)
10450  {
10451  T6 = CONSTMAX_EXP;
10452  dT6_dVg = 0.0;
10453  }
10454  else if (T5 < -CONSTEXP_THRESHOLD)
10455  {
10456  T6 = CONSTMIN_EXP;
10457  dT6_dVg = 0.0;
10458  }
10459  else
10460  {
10461  T6 = exp(T5);
10462  dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgs_eff)
10463  * dvgs_eff_dvg;
10464  }
10465  Igs = T11 * T2 * T6;
10466  dIgs_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10467  dIgs_dVs = -dIgs_dVg;
10468 
10469  T0 = vgd - (paramPtr->vfbsd + paramPtr->vfbsdoff);
10470  vgd_eff = sqrt(T0 * T0 + 1.0e-4);
10471  dvgd_eff_dvg = T0 / vgd_eff;
10472 
10473  T2 = vgd * vgd_eff;
10474  dT2_dVg = vgd * dvgd_eff_dvg + vgd_eff;
10475  T11 = paramPtr->AechvbEdgeD;
10476  T3 = paramPtr->aigd * paramPtr->cigd
10477  - paramPtr->bigd;
10478  T4 = paramPtr->bigd * paramPtr->cigd;
10479  T5 = T12 * (paramPtr->aigd + T3 * vgd_eff
10480  - T4 * vgd_eff * vgd_eff);
10481  if (T5 > CONSTEXP_THRESHOLD)
10482  {
10483  T6 = CONSTMAX_EXP;
10484  dT6_dVg = 0.0;
10485  }
10486  else if (T5 < -CONSTEXP_THRESHOLD)
10487  {
10488  T6 = CONSTMIN_EXP;
10489  dT6_dVg = 0.0;
10490  }
10491  else
10492  {
10493  T6 = exp(T5);
10494  dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgd_eff) * dvgd_eff_dvg;
10495  }
10496  Igd = T11 * T2 * T6;
10497  dIgd_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10498  dIgd_dVd = -dIgd_dVg;
10499 
10500  //Igs = Igs;
10501  gIgsg = dIgs_dVg;
10502  gIgss = dIgs_dVs;
10503  //Igd = Igd;
10504  gIgdg = dIgd_dVg;
10505  gIgdd = dIgd_dVd;
10506 
10507  }
10508  else
10509  {
10510  Igcs = gIgcsg = gIgcsd = gIgcsb = 0.0;
10511  Igcd = gIgcdg = gIgcdd = gIgcdb = 0.0;
10512  Igs = gIgsg = gIgss = 0.0;
10513  Igd = gIgdg = gIgdd = 0.0;
10514  }
10515 
10516  if (model_.igbMod)
10517  {
10518  T0 = tmp * paramPtr->nigbacc;
10519  T1 = -Vgs_eff + Vbseff + Vfb;
10520  VxNVt = T1 / T0;
10521  if (VxNVt > CONSTEXP_THRESHOLD)
10522  {
10523  Vaux = T1;
10524  dVaux_dVg = -dVgs_eff_dVg;
10525  dVaux_dVb = 1.0;
10526  }
10527  else if (VxNVt < -CONSTEXP_THRESHOLD)
10528  {
10529  Vaux = T0 * log(1.0 + CONSTMIN_EXP);
10530  dVaux_dVg = dVaux_dVb = 0.0;
10531  }
10532  else
10533  {
10534  ExpVxNVt = exp(VxNVt);
10535  Vaux = T0 * log(1.0 + ExpVxNVt);
10536  dVaux_dVb = ExpVxNVt / (1.0 + ExpVxNVt);
10537  dVaux_dVg = -dVaux_dVb * dVgs_eff_dVg;
10538  }
10539 
10540  T2 = (Vgs_eff - Vbseff) * Vaux;
10541  dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg;
10542  dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb;
10543 
10544  T11 = 4.97232e-7 * paramPtr->weff
10546  T12 = -7.45669e11 * toxe;
10547  T3 = paramPtr->aigbacc * paramPtr->cigbacc
10548  - paramPtr->bigbacc;
10549  T4 = paramPtr->bigbacc * paramPtr->cigbacc;
10550  T5 = T12 * (paramPtr->aigbacc + T3 * Voxacc
10551  - T4 * Voxacc * Voxacc);
10552 
10553  if (T5 > CONSTEXP_THRESHOLD)
10554  {
10555  T6 = CONSTMAX_EXP;
10556  dT6_dVg = dT6_dVb = 0.0;
10557  }
10558  else if (T5 < -CONSTEXP_THRESHOLD)
10559  {
10560  T6 = CONSTMIN_EXP;
10561  dT6_dVg = dT6_dVb = 0.0;
10562  }
10563  else
10564  {
10565  T6 = exp(T5);
10566  dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxacc);
10567  dT6_dVb = dT6_dVg * dVoxacc_dVb;
10568  dT6_dVg *= dVoxacc_dVg;
10569  }
10570 
10571  Igbacc = T11 * T2 * T6;
10572  dIgbacc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10573  dIgbacc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb);
10574 
10575 
10576  T0 = tmp * paramPtr->nigbinv;
10577  T1 = Voxdepinv - paramPtr->eigbinv;
10578  VxNVt = T1 / T0;
10579  if (VxNVt > CONSTEXP_THRESHOLD)
10580  {
10581  Vaux = T1;
10582  dVaux_dVg = dVoxdepinv_dVg;
10583  dVaux_dVd = dVoxdepinv_dVd;
10584  dVaux_dVb = dVoxdepinv_dVb;
10585  }
10586  else if (VxNVt < -CONSTEXP_THRESHOLD)
10587  {
10588  Vaux = T0 * log(1.0 + CONSTMIN_EXP);
10589  dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0;
10590  }
10591  else
10592  {
10593  ExpVxNVt = exp(VxNVt);
10594  Vaux = T0 * log(1.0 + ExpVxNVt);
10595  dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt);
10596  dVaux_dVd = dVaux_dVg * dVoxdepinv_dVd;
10597  dVaux_dVb = dVaux_dVg * dVoxdepinv_dVb;
10598  dVaux_dVg *= dVoxdepinv_dVg;
10599  }
10600 
10601  T2 = (Vgs_eff - Vbseff) * Vaux;
10602  dT2_dVg = dVgs_eff_dVg * Vaux + (Vgs_eff - Vbseff) * dVaux_dVg;
10603  dT2_dVd = (Vgs_eff - Vbseff) * dVaux_dVd;
10604  dT2_dVb = -Vaux + (Vgs_eff - Vbseff) * dVaux_dVb;
10605 
10606  T11 *= 0.75610;
10607  T12 *= 1.31724;
10608  T3 = paramPtr->aigbinv * paramPtr->cigbinv
10609  - paramPtr->bigbinv;
10610  T4 = paramPtr->bigbinv * paramPtr->cigbinv;
10611  T5 = T12 * (paramPtr->aigbinv + T3 * Voxdepinv
10612  - T4 * Voxdepinv * Voxdepinv);
10613 
10614  if (T5 > CONSTEXP_THRESHOLD)
10615  {
10616  T6 = CONSTMAX_EXP;
10617  dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10618  }
10619  else if (T5 < -CONSTEXP_THRESHOLD)
10620  {
10621  T6 = CONSTMIN_EXP;
10622  dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10623  }
10624  else
10625  {
10626  T6 = exp(T5);
10627  dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv);
10628  dT6_dVd = dT6_dVg * dVoxdepinv_dVd;
10629  dT6_dVb = dT6_dVg * dVoxdepinv_dVb;
10630  dT6_dVg *= dVoxdepinv_dVg;
10631  }
10632 
10633  Igbinv = T11 * T2 * T6;
10634  dIgbinv_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10635  dIgbinv_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd);
10636  dIgbinv_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb);
10637 
10638  Igb = Igbinv + Igbacc;
10639  gIgbg = dIgbinv_dVg + dIgbacc_dVg;
10640  gIgbd = dIgbinv_dVd;
10641  gIgbb = (dIgbinv_dVb + dIgbacc_dVb) * dVbseff_dVb;
10642  }
10643  else
10644  {
10645  Igb = gIgbg = gIgbd = gIgbs = gIgbb = 0.0;
10646  } // End of Gate current
10647 
10648  if (nf != 1.0)
10649  {
10650  cdrain *= nf;
10651  gds *= nf;
10652  gm *= nf;
10653  gmbs *= nf;
10654  IdovVds *= nf;
10655 
10656  gbbs *= nf;
10657  gbgs *= nf;
10658  gbds *= nf;
10659  csub *= nf;
10660 
10661  Igidl *= nf;
10662  ggidld *= nf;
10663  ggidlg *= nf;
10664  ggidlb *= nf;
10665 
10666  Igisl *= nf;
10667  ggisls *= nf;
10668  ggislg *= nf;
10669  ggislb *= nf;
10670 
10671  Igcs *= nf;
10672  gIgcsg *= nf;
10673  gIgcsd *= nf;
10674  gIgcsb *= nf;
10675  Igcd *= nf;
10676  gIgcdg *= nf;
10677  gIgcdd *= nf;
10678  gIgcdb *= nf;
10679 
10680  Igs *= nf;
10681  gIgsg *= nf;
10682  gIgss *= nf;
10683  Igd *= nf;
10684  gIgdg *= nf;
10685  gIgdd *= nf;
10686 
10687  Igb *= nf;
10688  gIgbg *= nf;
10689  gIgbd *= nf;
10690  gIgbb *= nf;
10691  }
10692 
10693  ggidls = -(ggidld + ggidlg + ggidlb);
10694  ggisld = -(ggisls + ggislg + ggislb);
10695  gIgbs = -(gIgbg + gIgbd + gIgbb);
10696  gIgcss = -(gIgcsg + gIgcsd + gIgcsb);
10697  gIgcds = -(gIgcdg + gIgcdd + gIgcdb);
10698  cd = cdrain;
10699 
10700  if (model_.tnoiMod == 0)
10701  {
10702  Abulk = Abulk0 * paramPtr->abulkCVfactor;
10703  Vdsat = Vgsteff / Abulk;
10704  T0 = Vdsat - Vds - CONSTDELTA_4;
10705  T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_4 * Vdsat);
10706  if (T0 >= 0.0)
10707  {
10708  Vdseff = Vdsat - 0.5 * (T0 + T1);
10709  }
10710  else
10711  {
10712  T3 = (CONSTDELTA_4 + CONSTDELTA_4) / (T1 - T0);
10713  T4 = 1.0 - T3;
10714  T5 = Vdsat * T3 / (T1 - T0);
10715  Vdseff = Vdsat * T4;
10716  }
10717  if (Vds == 0.0)
10718  {
10719  Vdseff = 0.0;
10720  }
10721 
10722  T0 = Abulk * Vdseff;
10723  T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20);
10724  T2 = Vdseff / T1;
10725  T3 = T0 * T2;
10726  qinv = Coxeff * paramPtr->weffCV * nf
10727  * paramPtr->leffCV
10728  * (Vgsteff - 0.5 * T0 + Abulk * T3);
10729  }
10730 
10731  // C-V begins
10732 
10733  if ((model_.xpart < 0) || (!ChargeComputationNeeded))
10734  {
10735  qgate = qdrn = qsrc = qbulk = 0.0;
10736  cggb = cgsb = cgdb = 0.0;
10737  cdgb = cdsb = cddb = 0.0;
10738  cbgb = cbsb = cbdb = 0.0;
10739  csgb = cssb = csdb = 0.0;
10740  cgbb = csbb = cdbb = cbbb = 0.0;
10741  cqdb = cqsb = cqgb = cqbb = 0.0;
10742  gtau = 0.0;
10743  }
10744  else if (model_.capMod == 0)
10745  {
10746  if (Vbseff < 0.0)
10747  {
10748  Vbseff = Vbs;
10749  dVbseff_dVb = 1.0;
10750  }
10751  else
10752  {
10753  Vbseff = paramPtr->phi - Phis;
10754  dVbseff_dVb = -dPhis_dVb;
10755  }
10756 
10757  Vfb = paramPtr->vfbcv;
10758  Vth = Vfb + paramPtr->phi + paramPtr->k1ox * sqrtPhis;
10759  Vgst = Vgs_eff - Vth;
10760  dVth_dVb = paramPtr->k1ox * dsqrtPhis_dVb;
10761  dVgst_dVb = -dVth_dVb;
10762  dVgst_dVg = dVgs_eff_dVg;
10763 
10765  Arg1 = Vgs_eff - Vbseff - Vfb;
10766 
10767  if (Arg1 <= 0.0)
10768  {
10769  qgate = CoxWL * Arg1;
10770  qbulk = -qgate;
10771  qdrn = 0.0;
10772 
10773  cggb = CoxWL * dVgs_eff_dVg;
10774  cgdb = 0.0;
10775  cgsb = CoxWL * (dVbseff_dVb - dVgs_eff_dVg);
10776 
10777  cdgb = 0.0;
10778  cddb = 0.0;
10779  cdsb = 0.0;
10780 
10781  cbgb = -CoxWL * dVgs_eff_dVg;
10782  cbdb = 0.0;
10783  cbsb = -cgsb;
10784  } // Arg1 <= 0.0, end of accumulation
10785  else if (Vgst <= 0.0)
10786  {
10787  T1 = 0.5 * paramPtr->k1ox;
10788  T2 = sqrt(T1 * T1 + Arg1);
10789  qgate = CoxWL * paramPtr->k1ox * (T2 - T1);
10790  qbulk = -qgate;
10791  qdrn = 0.0;
10792 
10793  T0 = CoxWL * T1 / T2;
10794  cggb = T0 * dVgs_eff_dVg;
10795  cgdb = 0.0;
10796  cgsb = T0 * (dVbseff_dVb - dVgs_eff_dVg);
10797 
10798  cdgb = 0.0;
10799  cddb = 0.0;
10800  cdsb = 0.0;
10801 
10802  cbgb = -cggb;
10803  cbdb = 0.0;
10804  cbsb = -cgsb;
10805  } // Vgst <= 0.0, end of depletion
10806  else
10807  {
10808  One_Third_CoxWL = CoxWL / 3.0;
10809  Two_Third_CoxWL = 2.0 * One_Third_CoxWL;
10810 
10811  AbulkCV = Abulk0 * paramPtr->abulkCVfactor;
10812  dAbulkCV_dVb = paramPtr->abulkCVfactor * dAbulk0_dVb;
10813  Vdsat = Vgst / AbulkCV;
10814  dVdsat_dVg = dVgs_eff_dVg / AbulkCV;
10815  dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)/ AbulkCV;
10816 
10817  if (model_.xpart > 0.5)
10818  {
10819  // 0/100 Charge partition model
10820  if (Vdsat <= Vds)
10821  { // saturation region
10822  T1 = Vdsat / 3.0;
10823  qgate = CoxWL * (Vgs_eff - Vfb
10824  - paramPtr->phi - T1);
10825  T2 = -Two_Third_CoxWL * Vgst;
10826  qbulk = -(qgate + T2);
10827  qdrn = 0.0;
10828 
10829  cggb = One_Third_CoxWL * (3.0
10830  - dVdsat_dVg) * dVgs_eff_dVg;
10831  T2 = -One_Third_CoxWL * dVdsat_dVb;
10832  cgsb = -(cggb + T2);
10833  cgdb = 0.0;
10834 
10835  cdgb = 0.0;
10836  cddb = 0.0;
10837  cdsb = 0.0;
10838 
10839  cbgb = -(cggb
10840  - Two_Third_CoxWL * dVgs_eff_dVg);
10841  T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
10842  cbsb = -(cbgb + T3);
10843  cbdb = 0.0;
10844  }
10845  else
10846  { // linear region
10847  Alphaz = Vgst / Vdsat;
10848  T1 = 2.0 * Vdsat - Vds;
10849  T2 = Vds / (3.0 * T1);
10850  T3 = T2 * Vds;
10851  T9 = 0.25 * CoxWL;
10852  T4 = T9 * Alphaz;
10853  T7 = 2.0 * Vds - T1 - 3.0 * T3;
10854  T8 = T3 - T1 - 2.0 * Vds;
10855  qgate = CoxWL * (Vgs_eff - Vfb
10856  - paramPtr->phi - 0.5 * (Vds - T3));
10857  T10 = T4 * T8;
10858  qdrn = T4 * T7;
10859  qbulk = -(qgate + qdrn + T10);
10860 
10861  T5 = T3 / T1;
10862  cggb = CoxWL * (1.0 - T5 * dVdsat_dVg)
10863  * dVgs_eff_dVg;
10864  T11 = -CoxWL * T5 * dVdsat_dVb;
10865  cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5);
10866  cgsb = -(cggb + T11 + cgdb);
10867  T6 = 1.0 / Vdsat;
10868  dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
10869  dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
10870  T7 = T9 * T7;
10871  T8 = T9 * T8;
10872  T9 = 2.0 * T4 * (1.0 - 3.0 * T5);
10873  cdgb = (T7 * dAlphaz_dVg - T9 * dVdsat_dVg) * dVgs_eff_dVg;
10874  T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb;
10875  cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5);
10876  cdsb = -(cdgb + T12 + cddb);
10877 
10878  T9 = 2.0 * T4 * (1.0 + T5);
10879  T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg)
10880  * dVgs_eff_dVg;
10881  T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb;
10882  T12 = T4 * (2.0 * T2 + T5 - 1.0);
10883  T0 = -(T10 + T11 + T12);
10884 
10885  cbgb = -(cggb + cdgb + T10);
10886  cbdb = -(cgdb + cddb + T12);
10887  cbsb = -(cgsb + cdsb + T0);
10888  }
10889  }
10890  else if (model_.xpart < 0.5)
10891  { // 40/60 Charge partition model
10892  if (Vds >= Vdsat)
10893  { // saturation region
10894  T1 = Vdsat / 3.0;
10895  qgate = CoxWL * (Vgs_eff - Vfb - paramPtr->phi - T1);
10896  T2 = -Two_Third_CoxWL * Vgst;
10897  qbulk = -(qgate + T2);
10898  qdrn = 0.4 * T2;
10899 
10900  cggb = One_Third_CoxWL * (3.0 - dVdsat_dVg) * dVgs_eff_dVg;
10901  T2 = -One_Third_CoxWL * dVdsat_dVb;
10902  cgsb = -(cggb + T2);
10903  cgdb = 0.0;
10904 
10905  T3 = 0.4 * Two_Third_CoxWL;
10906  cdgb = -T3 * dVgs_eff_dVg;
10907  cddb = 0.0;
10908  T4 = T3 * dVth_dVb; cdsb = -(T4 + cdgb);
10909 
10910  cbgb = -(cggb - Two_Third_CoxWL * dVgs_eff_dVg);
10911  T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
10912  cbsb = -(cbgb + T3);
10913  cbdb = 0.0;
10914  }
10915  else
10916  { // linear region
10917  Alphaz = Vgst / Vdsat;
10918  T1 = 2.0 * Vdsat - Vds;
10919  T2 = Vds / (3.0 * T1);
10920  T3 = T2 * Vds;
10921  T9 = 0.25 * CoxWL;
10922  T4 = T9 * Alphaz;
10923  qgate = CoxWL * (Vgs_eff - Vfb - paramPtr->phi
10924  - 0.5 * (Vds - T3));
10925 
10926  T5 = T3 / T1;
10927  cggb = CoxWL * (1.0 - T5 * dVdsat_dVg)
10928  * dVgs_eff_dVg;
10929  tmp = -CoxWL * T5 * dVdsat_dVb;
10930  cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5);
10931  cgsb = -(cggb
10932  + cgdb + tmp);
10933 
10934  T6 = 1.0 / Vdsat;
10935  dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
10936  dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
10937 
10938  T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds
10939  + 1.2 * Vds * Vds;
10940  T8 = T2 / T1;
10941  T7 = Vds - T1 - T8 * T6;
10942  qdrn = T4 * T7;
10943  T7 *= T9;
10944  tmp = T8 / T1;
10945  tmp1 = T4 * (2.0 - 4.0 * tmp * T6
10946  + T8 * (16.0 * Vdsat - 6.0 * Vds));
10947 
10948  cdgb = (T7 * dAlphaz_dVg - tmp1
10949  * dVdsat_dVg) * dVgs_eff_dVg;
10950  T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb;
10951  cddb = T4 * (2.0 - (1.0 / (3.0 * T1
10952  * T1) + 2.0 * tmp) * T6 + T8
10953  * (6.0 * Vdsat - 2.4 * Vds));
10954  cdsb = -(cdgb + T10 + cddb);
10955 
10956  T7 = 2.0 * (T1 + T3);
10957  qbulk = -(qgate - T4 * T7);
10958  T7 *= T9;
10959  T0 = 4.0 * T4 * (1.0 - T5);
10960  T12 = (-T7 * dAlphaz_dVg - cdgb
10961  - T0 * dVdsat_dVg) * dVgs_eff_dVg;
10962  T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb;
10963  T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) - cddb;
10964  tmp = -(T10 + T11 + T12);
10965 
10966  cbgb = -(cggb + cdgb + T12);
10967  cbdb = -(cgdb + cddb + T10);
10968  cbsb = -(cgsb + cdsb + tmp);
10969  }
10970  }
10971  else
10972  { // 50/50 partitioning
10973  if (Vds >= Vdsat)
10974  { // saturation region
10975  T1 = Vdsat / 3.0;
10976  qgate = CoxWL * (Vgs_eff - Vfb
10977  - paramPtr->phi - T1);
10978  T2 = -Two_Third_CoxWL * Vgst;
10979  qbulk = -(qgate + T2);
10980  qdrn = 0.5 * T2;
10981 
10982  cggb = One_Third_CoxWL * (3.0
10983  - dVdsat_dVg) * dVgs_eff_dVg;
10984  T2 = -One_Third_CoxWL * dVdsat_dVb;
10985  cgsb = -(cggb + T2);
10986  cgdb = 0.0;
10987 
10988  cdgb = -One_Third_CoxWL * dVgs_eff_dVg;
10989  cddb = 0.0;
10990  T4 = One_Third_CoxWL * dVth_dVb;
10991  cdsb = -(T4 + cdgb);
10992 
10993  cbgb = -(cggb
10994  - Two_Third_CoxWL * dVgs_eff_dVg);
10995  T3 = -(T2 + Two_Third_CoxWL * dVth_dVb);
10996  cbsb = -(cbgb + T3);
10997  cbdb = 0.0;
10998  }
10999  else
11000  { // linear region
11001  Alphaz = Vgst / Vdsat;
11002  T1 = 2.0 * Vdsat - Vds;
11003  T2 = Vds / (3.0 * T1);
11004  T3 = T2 * Vds;
11005  T9 = 0.25 * CoxWL;
11006  T4 = T9 * Alphaz;
11007  qgate = CoxWL * (Vgs_eff - Vfb - paramPtr->phi
11008  - 0.5 * (Vds - T3));
11009 
11010  T5 = T3 / T1;
11011  cggb = CoxWL * (1.0 - T5 * dVdsat_dVg)
11012  * dVgs_eff_dVg;
11013  tmp = -CoxWL * T5 * dVdsat_dVb;
11014  cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5);
11015  cgsb = -(cggb + cgdb + tmp);
11016 
11017  T6 = 1.0 / Vdsat;
11018  dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg);
11019  dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb);
11020 
11021  T7 = T1 + T3;
11022  qdrn = -T4 * T7;
11023  qbulk = - (qgate + qdrn + qdrn);
11024  T7 *= T9;
11025  T0 = T4 * (2.0 * T5 - 2.0);
11026 
11027  cdgb = (T0 * dVdsat_dVg - T7 * dAlphaz_dVg) * dVgs_eff_dVg;
11028  T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb;
11029  cddb = T4 * (1.0 - 2.0 * T2 - T5);
11030  cdsb = -(cdgb + T12 + cddb);
11031 
11032  cbgb = -(cggb + 2.0 * cdgb);
11033  cbdb = -(cgdb + 2.0 * cddb);
11034  cbsb = -(cgsb + 2.0 * cdsb);
11035  } // end of linear region
11036  } // end of 50/50 partition
11037  } // end of inversion
11038  } // end of capMod=0
11039  else
11040  {
11041  if (Vbseff < 0.0)
11042  {
11043  VbseffCV = Vbseff;
11044  dVbseffCV_dVb = 1.0;
11045  }
11046  else
11047  {
11048  VbseffCV = paramPtr->phi - Phis;
11049  dVbseffCV_dVb = -dPhis_dVb;
11050  }
11051 
11053  * paramPtr->leffCV * nf;
11054 
11055  if (model_.cvchargeMod == 0)
11056  {
11057  // Seperate VgsteffCV with noff and voffcv
11058  noff = n * paramPtr->noff;
11059  dnoff_dVd = paramPtr->noff * dn_dVd;
11060  dnoff_dVb = paramPtr->noff * dn_dVb;
11061  T0 = Vtm * noff;
11062  voffcv = paramPtr->voffcv;
11063  VgstNVt = (Vgst - voffcv) / T0;
11064 
11065  if (VgstNVt > CONSTEXP_THRESHOLD)
11066  {
11067  Vgsteff = Vgst - voffcv;
11068  dVgsteff_dVg = dVgs_eff_dVg;
11069  dVgsteff_dVd = -dVth_dVd;
11070  dVgsteff_dVb = -dVth_dVb;
11071  }
11072  else if (VgstNVt < -CONSTEXP_THRESHOLD)
11073  {
11074  Vgsteff = T0 * log(1.0 + CONSTMIN_EXP);
11075  dVgsteff_dVg = 0.0;
11076  dVgsteff_dVd = Vgsteff / noff;
11077  dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb;
11078  dVgsteff_dVd *= dnoff_dVd;
11079  }
11080  else
11081  {
11082  ExpVgst = exp(VgstNVt);
11083  Vgsteff = T0 * log(1.0 + ExpVgst);
11084  dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst);
11085  dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv)
11086  / noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd;
11087  dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv)
11088  / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb;
11089  dVgsteff_dVg *= dVgs_eff_dVg;
11090  }
11091  // End of VgsteffCV for cvchargeMod = 0
11092  }
11093  else
11094  {
11095  T0 = n * Vtm;
11096  T1 = paramPtr->mstarcv * Vgst;
11097  T2 = T1 / T0;
11098  if (T2 > CONSTEXP_THRESHOLD)
11099  {
11100  T10 = T1;
11101  dT10_dVg = paramPtr->mstarcv * dVgs_eff_dVg;
11102  dT10_dVd = -dVth_dVd * paramPtr->mstarcv;
11103  dT10_dVb = -dVth_dVb * paramPtr->mstarcv;
11104  }
11105  else if (T2 < -CONSTEXP_THRESHOLD)
11106  {
11107  T10 = Vtm * log(1.0 + CONSTMIN_EXP);
11108  dT10_dVg = 0.0;
11109  dT10_dVd = T10 * dn_dVd;
11110  dT10_dVb = T10 * dn_dVb;
11111  T10 *= n;
11112  }
11113  else
11114  {
11115  ExpVgst = exp(T2);
11116  T3 = Vtm * log(1.0 + ExpVgst);
11117  T10 = n * T3;
11118  dT10_dVg = paramPtr->mstarcv * ExpVgst / (1.0 + ExpVgst);
11119  dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n);
11120  dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n);
11121  dT10_dVg *= dVgs_eff_dVg;
11122  }
11123 
11124  T1 = paramPtr->voffcbncv - (1.0 - paramPtr->mstarcv) * Vgst;
11125  T2 = T1 / T0;
11126  if (T2 < -CONSTEXP_THRESHOLD)
11127  {
11129  T9 = paramPtr->mstarcv + T3 * n;
11130  dT9_dVg = 0.0;
11131  dT9_dVd = dn_dVd * T3;
11132  dT9_dVb = dn_dVb * T3;
11133  }
11134  else if (T2 > CONSTEXP_THRESHOLD)
11135  {
11137  T9 = paramPtr->mstarcv + T3 * n;
11138  dT9_dVg = 0.0;
11139  dT9_dVd = dn_dVd * T3;
11140  dT9_dVb = dn_dVb * T3;
11141  }
11142  else
11143  {
11144  ExpVgst = exp(T2);
11145  T3 = model_.coxe / paramPtr->cdep0;
11146  T4 = T3 * ExpVgst;
11147  T5 = T1 * T4 / T0;
11148  T9 = paramPtr->mstarcv + n * T4;
11149  dT9_dVg = T3 * (paramPtr->mstarcv - 1.0) * ExpVgst / Vtm;
11150  dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb;
11151  dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd;
11152  dT9_dVg *= dVgs_eff_dVg;
11153  }
11154 
11155  Vgsteff = T10 / T9;
11156  T11 = T9 * T9;
11157  dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11;
11158  dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11;
11159  dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11;
11160  // End of VgsteffCV for cvchargeMod = 1
11161  }
11162 
11163 
11164 
11165  if (model_.capMod == 1)
11166  {
11167  Vfb = vfbzb;
11168  V3 = Vfb - Vgs_eff + VbseffCV - CONSTDELTA_3;
11169  if (Vfb <= 0.0)
11170  {
11171  T0 = sqrt(V3 * V3 - 4.0 * CONSTDELTA_3 * Vfb);
11172  }
11173  else
11174  {
11175  T0 = sqrt(V3 * V3 + 4.0 * CONSTDELTA_3 * Vfb);
11176  }
11177 
11178  T1 = 0.5 * (1.0 + V3 / T0);
11179  Vfbeff = Vfb - 0.5 * (V3 + T0);
11180  dVfbeff_dVg = T1 * dVgs_eff_dVg;
11181  dVfbeff_dVb = -T1 * dVbseffCV_dVb;
11182  Qac0 = CoxWL * (Vfbeff - Vfb);
11183  dQac0_dVg = CoxWL * dVfbeff_dVg;
11184  dQac0_dVb = CoxWL * dVfbeff_dVb;
11185 
11186  T0 = 0.5 * paramPtr->k1ox;
11187  T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff;
11188  if (paramPtr->k1ox == 0.0)
11189  {
11190  T1 = 0.0;
11191  T2 = 0.0;
11192  }
11193  else if (T3 < 0.0)
11194  {
11195  T1 = T0 + T3 / paramPtr->k1ox;
11196  T2 = CoxWL;
11197  }
11198  else
11199  {
11200  T1 = sqrt(T0 * T0 + T3);
11201  T2 = CoxWL * T0 / T1;
11202  }
11203 
11204  Qsub0 = CoxWL * paramPtr->k1ox * (T1 - T0);
11205 
11206  dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg);
11207  dQsub0_dVd = -T2 * dVgsteff_dVd;
11208  dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb
11209  + dVgsteff_dVb);
11210 
11211  AbulkCV = Abulk0 * paramPtr->abulkCVfactor;
11212  dAbulkCV_dVb = paramPtr->abulkCVfactor * dAbulk0_dVb;
11213  VdsatCV = Vgsteff / AbulkCV;
11214 
11215  T0 = VdsatCV - Vds - CONSTDELTA_4;
11216  dT0_dVg = 1.0 / AbulkCV;
11217  dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV;
11218  T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_4 * VdsatCV);
11219  dT1_dVg = (T0 + CONSTDELTA_4 + CONSTDELTA_4) / T1;
11220  dT1_dVd = -T0 / T1;
11221  dT1_dVb = dT1_dVg * dT0_dVb;
11222  dT1_dVg *= dT0_dVg;
11223  if (T0 >= 0.0)
11224  {
11225  VdseffCV = VdsatCV - 0.5 * (T0 + T1);
11226  dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg);
11227  dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd);
11228  dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb);
11229  }
11230  else
11231  {
11232  T3 = (CONSTDELTA_4 + CONSTDELTA_4) / (T1 - T0);
11233  T4 = 1.0 - T3;
11234  T5 = VdsatCV * T3 / (T1 - T0);
11235  VdseffCV = VdsatCV * T4;
11236  dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg);
11237  dVdseffCV_dVd = T5 * (dT1_dVd + 1.0);
11238  dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb;
11239  }
11240 
11241  if (Vds == 0.0)
11242  {
11243  VdseffCV = 0.0;
11244  dVdseffCV_dVg = 0.0;
11245  dVdseffCV_dVb = 0.0;
11246  }
11247 
11248  T0 = AbulkCV * VdseffCV;
11249  T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20);
11250  T2 = VdseffCV / T1;
11251  T3 = T0 * T2;
11252 
11253  T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV);
11254  T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5);
11255  T6 = 12.0 * T2 * T2 * Vgsteff;
11256 
11257  qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3);
11258  Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg);
11259  Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd;
11260  Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11261  + Cgg1 * dVgsteff_dVb;
11262  Cgg1 *= dVgsteff_dVg;
11263 
11264  T7 = 1.0 - AbulkCV;
11265  qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3);
11266  T4 = -T7 * (T4 - 1.0);
11267  T5 = -T7 * T5;
11268  T6 = -(T7 * T6 + (0.5 * VdseffCV - T3));
11269  Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg);
11270  Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd;
11271  Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11272  + Cbg1 * dVgsteff_dVb;
11273  Cbg1 *= dVgsteff_dVg;
11274 
11275  if (model_.xpart > 0.5)
11276  { // 0/100 Charge petition model
11277  T1 = T1 + T1;
11278  qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0
11279  - T0 * T0 / T1);
11280  T7 = (4.0 * Vgsteff - T0) / (T1 * T1);
11281  T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1));
11282  T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7);
11283  T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7);
11284  Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg);
11285  Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd;
11286  Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11287  + Csg * dVgsteff_dVb;
11288  Csg *= dVgsteff_dVg;
11289  }
11290  else if (model_.xpart < 0.5)
11291  { // 40/60 Charge petition model
11292  T1 = T1 / 12.0;
11293  T2 = 0.5 * CoxWL / (T1 * T1);
11294  T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff
11295  * (Vgsteff - 4.0 * T0 / 3.0))
11296  - 2.0 * T0 * T0 * T0 / 15.0;
11297  qsrc = -T2 * T3;
11298  T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0)
11299  + 0.4 * T0 * T0;
11300  T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0
11301  * Vgsteff - 8.0 * T0 / 3.0)
11302  + 2.0 * T0 * T0 / 3.0);
11303  T5 = (qsrc / T1 + T2 * T7) * AbulkCV;
11304  T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV);
11305  Csg = (T4 + T5 * dVdseffCV_dVg);
11306  Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd;
11307  Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11308  + Csg * dVgsteff_dVb;
11309  Csg *= dVgsteff_dVg;
11310  }
11311  else
11312  { // 50/50 Charge petition model
11313  qsrc = -0.5 * (qgate + qbulk);
11314  Csg = -0.5 * (Cgg1 + Cbg1);
11315  Csb = -0.5 * (Cgb1 + Cbb1);
11316  Csd = -0.5 * (Cgd1 + Cbd1);
11317  }
11318 
11319  qgate += Qac0 + Qsub0;
11320  qbulk -= (Qac0 + Qsub0);
11321  qdrn = -(qgate + qbulk + qsrc);
11322 
11323  Cgg = dQac0_dVg + dQsub0_dVg + Cgg1;
11324  Cgd = dQsub0_dVd + Cgd1;
11325  Cgb = dQac0_dVb + dQsub0_dVb + Cgb1;
11326 
11327  Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg;
11328  Cbd = Cbd1 - dQsub0_dVd;
11329  Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb;
11330 
11331  Cgb *= dVbseff_dVb;
11332  Cbb *= dVbseff_dVb;
11333  Csb *= dVbseff_dVb;
11334 
11335  cggb = Cgg;
11336  cgsb = -(Cgg + Cgd + Cgb);
11337  cgdb = Cgd;
11338  cdgb = -(Cgg + Cbg + Csg);
11339  cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb
11340  + Csg + Csd + Csb);
11341  cddb = -(Cgd + Cbd + Csd);
11342  cbgb = Cbg;
11343  cbsb = -(Cbg + Cbd + Cbb);
11344  cbdb = Cbd;
11345  }
11346  // Charge-Thickness capMod (CTM) begins
11347  else if (model_.capMod == 2)
11348  {
11349  V3 = vfbzb - Vgs_eff + VbseffCV - CONSTDELTA_3;
11350  if (vfbzb <= 0.0)
11351  T0 = sqrt(V3 * V3 - 4.0 * CONSTDELTA_3 * vfbzb);
11352  else
11353  T0 = sqrt(V3 * V3 + 4.0 * CONSTDELTA_3 * vfbzb);
11354 
11355  T1 = 0.5 * (1.0 + V3 / T0);
11356  Vfbeff = vfbzb - 0.5 * (V3 + T0);
11357  dVfbeff_dVg = T1 * dVgs_eff_dVg;
11358  dVfbeff_dVb = -T1 * dVbseffCV_dVb;
11359 
11360  Cox = model_.coxp;
11361  Tox = 1.0e8 * model_.toxp;
11362  T0 = (Vgs_eff - VbseffCV - vfbzb) / Tox;
11363  dT0_dVg = dVgs_eff_dVg / Tox;
11364  dT0_dVb = -dVbseffCV_dVb / Tox;
11365 
11366  tmp = T0 * paramPtr->acde;
11367  if ((-CONSTEXP_THRESHOLD < tmp) && (tmp < CONSTEXP_THRESHOLD))
11368  {
11369  Tcen = paramPtr->ldeb * exp(tmp);
11370  dTcen_dVg = paramPtr->acde * Tcen;
11371  dTcen_dVb = dTcen_dVg * dT0_dVb;
11372  dTcen_dVg *= dT0_dVg;
11373  }
11374  else if (tmp <= -CONSTEXP_THRESHOLD)
11375  {
11376  Tcen = paramPtr->ldeb * CONSTMIN_EXP;
11377  dTcen_dVg = dTcen_dVb = 0.0;
11378  }
11379  else
11380  {
11381  Tcen = paramPtr->ldeb * CONSTMAX_EXP;
11382  dTcen_dVg = dTcen_dVb = 0.0;
11383  }
11384 
11385  LINK = 1.0e-3 * model_.toxp;
11386  V3 = paramPtr->ldeb - Tcen - LINK;
11387  V4 = sqrt(V3 * V3 + 4.0 * LINK * paramPtr->ldeb);
11388  Tcen = paramPtr->ldeb - 0.5 * (V3 + V4);
11389  T1 = 0.5 * (1.0 + V3 / V4);
11390  dTcen_dVg *= T1;
11391  dTcen_dVb *= T1;
11392 
11393  Ccen = epssub / Tcen;
11394  T2 = Cox / (Cox + Ccen);
11395  Coxeff = T2 * Ccen;
11396  T3 = -Ccen / Tcen;
11397  dCoxeff_dVg = T2 * T2 * T3;
11398  dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb;
11399  dCoxeff_dVg *= dTcen_dVg;
11400  CoxWLcen = CoxWL * Coxeff / model_.coxe;
11401 
11402  Qac0 = CoxWLcen * (Vfbeff - vfbzb);
11403  QovCox = Qac0 / Coxeff;
11404  dQac0_dVg = CoxWLcen * dVfbeff_dVg
11405  + QovCox * dCoxeff_dVg;
11406  dQac0_dVb = CoxWLcen * dVfbeff_dVb
11407  + QovCox * dCoxeff_dVb;
11408 
11409  T0 = 0.5 * paramPtr->k1ox;
11410  T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff;
11411  if (paramPtr->k1ox == 0.0)
11412  {
11413  T1 = 0.0;
11414  T2 = 0.0;
11415  }
11416  else if (T3 < 0.0)
11417  {
11418  T1 = T0 + T3 / paramPtr->k1ox;
11419  T2 = CoxWLcen;
11420  }
11421  else
11422  {
11423  T1 = sqrt(T0 * T0 + T3);
11424  T2 = CoxWLcen * T0 / T1;
11425  }
11426 
11427  Qsub0 = CoxWLcen * paramPtr->k1ox * (T1 - T0);
11428  QovCox = Qsub0 / Coxeff;
11429  dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg)
11430  + QovCox * dCoxeff_dVg;
11431  dQsub0_dVd = -T2 * dVgsteff_dVd;
11432  dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb)
11433  + QovCox * dCoxeff_dVb;
11434 
11435  // Gate-bias dependent delta Phis begins
11436  if (paramPtr->k1ox <= 0.0)
11437  { Denomi = 0.25 * paramPtr->moin * Vtm;
11438  T0 = 0.5 * paramPtr->sqrtPhi;
11439  }
11440  else
11441  { Denomi = paramPtr->moin * Vtm
11442  * paramPtr->k1ox * paramPtr->k1ox;
11443  T0 = paramPtr->k1ox * paramPtr->sqrtPhi;
11444  }
11445  T1 = 2.0 * T0 + Vgsteff;
11446 
11447  DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi);
11448  dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff);
11449  // End of delta Phis
11450 
11451  // VgDP = Vgsteff - DeltaPhi
11452  T0 = Vgsteff - DeltaPhi - 0.001;
11453  dT0_dVg = 1.0 - dDeltaPhi_dVg;
11454  T1 = sqrt(T0 * T0 + Vgsteff * 0.004);
11455  VgDP = 0.5 * (T0 + T1);
11456  dVgDP_dVg = 0.5 * (dT0_dVg + (T0 * dT0_dVg + 0.002) / T1);
11457 
11458  Tox += Tox; // WDLiu: Tcen reevaluated below due to different Vgsteff
11459  T0 = (Vgsteff + vtfbphi2) / Tox;
11460  tmp = exp(model_.bdos * 0.7 * log(T0));
11461  T1 = 1.0 + tmp;
11462  T2 = model_.bdos * 0.7 * tmp / (T0 * Tox);
11463  Tcen = model_.ados * 1.9e-9 / T1;
11464  dTcen_dVg = -Tcen * T2 / T1;
11465  dTcen_dVd = dTcen_dVg * dVgsteff_dVd;
11466  dTcen_dVb = dTcen_dVg * dVgsteff_dVb;
11467  dTcen_dVg *= dVgsteff_dVg;
11468 
11469  Ccen = epssub / Tcen;
11470  T0 = Cox / (Cox + Ccen);
11471  Coxeff = T0 * Ccen;
11472  T1 = -Ccen / Tcen;
11473  dCoxeff_dVg = T0 * T0 * T1;
11474  dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd;
11475  dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb;
11476  dCoxeff_dVg *= dTcen_dVg;
11477  CoxWLcen = CoxWL * Coxeff / model_.coxe;
11478 
11479  AbulkCV = Abulk0 * paramPtr->abulkCVfactor;
11480  dAbulkCV_dVb = paramPtr->abulkCVfactor * dAbulk0_dVb;
11481  VdsatCV = VgDP / AbulkCV;
11482 
11483  T0 = VdsatCV - Vds - CONSTDELTA_4;
11484  dT0_dVg = dVgDP_dVg / AbulkCV;
11485  dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV;
11486  T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_4 * VdsatCV);
11487  dT1_dVg = (T0 + CONSTDELTA_4 + CONSTDELTA_4) / T1;
11488  dT1_dVd = -T0 / T1;
11489  dT1_dVb = dT1_dVg * dT0_dVb;
11490  dT1_dVg *= dT0_dVg;
11491  if (T0 >= 0.0)
11492  {
11493  VdseffCV = VdsatCV - 0.5 * (T0 + T1);
11494  dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg);
11495  dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd);
11496  dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb);
11497  }
11498  else
11499  {
11500  T3 = (CONSTDELTA_4 + CONSTDELTA_4) / (T1 - T0);
11501  T4 = 1.0 - T3;
11502  T5 = VdsatCV * T3 / (T1 - T0);
11503  VdseffCV = VdsatCV * T4;
11504  dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg);
11505  dVdseffCV_dVd = T5 * (dT1_dVd + 1.0);
11506  dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb;
11507  }
11508 
11509  if (Vds == 0.0)
11510  {
11511  VdseffCV = 0.0;
11512  dVdseffCV_dVg = 0.0;
11513  dVdseffCV_dVb = 0.0;
11514  }
11515 
11516  T0 = AbulkCV * VdseffCV;
11517  T1 = VgDP;
11518  T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20);
11519  T3 = T0 / T2;
11520  T4 = 1.0 - 12.0 * T3 * T3;
11521  T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5);
11522  T6 = T5 * VdseffCV / AbulkCV;
11523 
11524  qgate = CoxWLcen * (T1 - T0 * (0.5 - T3));
11525  QovCox = qgate / Coxeff;
11526  Cgg1 = CoxWLcen * (T4 * dVgDP_dVg
11527  + T5 * dVdseffCV_dVg);
11528  Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1
11529  * dVgsteff_dVd + QovCox * dCoxeff_dVd;
11530  Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11531  + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb;
11532  Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg;
11533 
11534 
11535  T7 = 1.0 - AbulkCV;
11536  T8 = T2 * T2;
11537  T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV);
11538  T10 = T9 * dVgDP_dVg;
11539  T11 = -T7 * T5 / AbulkCV;
11540  T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2));
11541 
11542  qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2);
11543  QovCox = qbulk / Coxeff;
11544  Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg);
11545  Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1
11546  * dVgsteff_dVd + QovCox * dCoxeff_dVd;
11547  Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb)
11548  + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb;
11549  Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg;
11550 
11551  if (model_.xpart > 0.5)
11552  {
11553  // 0/100 partition
11554  qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0
11555  - 0.5 * T0 * T0 / T2);
11556  QovCox = qsrc / Coxeff;
11557  T2 += T2;
11558  T3 = T2 * T2;
11559  T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3);
11560  T4 = -(0.5 + 24.0 * T0 * T0 / T3) * dVgDP_dVg;
11561  T5 = T7 * AbulkCV;
11562  T6 = T7 * VdseffCV;
11563 
11564  Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg);
11565  Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd
11566  + QovCox * dCoxeff_dVd;
11567  Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
11568  + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb;
11569  Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg;
11570  }
11571  else if (model_.xpart < 0.5)
11572  {
11573  // 40/60 partition
11574  T2 = T2 / 12.0;
11575  T3 = 0.5 * CoxWLcen / (T2 * T2);
11576  T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0
11577  * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0;
11578  qsrc = -T3 * T4;
11579  QovCox = qsrc / Coxeff;
11580  T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0;
11581  T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0
11582  * T0 / 3.0) + 2.0 * T0 * T0 / 3.0);
11583  T6 = AbulkCV * (qsrc / T2 + T3 * T8);
11584  T7 = T6 * VdseffCV / AbulkCV;
11585 
11586  Csg = T5 * dVgDP_dVg + T6 * dVdseffCV_dVg;
11587  Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd
11588  + QovCox * dCoxeff_dVd;
11589  Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb
11590  + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb;
11591  Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg;
11592  }
11593  else
11594  {
11595  // 50/50 partition
11596  qsrc = -0.5 * qgate;
11597  Csg = -0.5 * Cgg1;
11598  Csd = -0.5 * Cgd1;
11599  Csb = -0.5 * Cgb1;
11600  }
11601 
11602  qgate += Qac0 + Qsub0 - qbulk;
11603  qbulk -= (Qac0 + Qsub0);
11604  qdrn = -(qgate + qbulk + qsrc);
11605 
11606  Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg;
11607  Cbd = Cbd1 - dQsub0_dVd;
11608  Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb;
11609 
11610  Cgg = Cgg1 - Cbg;
11611  Cgd = Cgd1 - Cbd;
11612  Cgb = Cgb1 - Cbb;
11613 
11614  Cgb *= dVbseff_dVb;
11615  Cbb *= dVbseff_dVb;
11616  Csb *= dVbseff_dVb;
11617 
11618  cggb = Cgg;
11619  cgsb = -(Cgg + Cgd + Cgb);
11620  cgdb = Cgd;
11621  cdgb = -(Cgg + Cbg + Csg);
11622  cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb
11623  + Csg + Csd + Csb);
11624  cddb = -(Cgd + Cbd + Csd);
11625  cbgb = Cbg;
11626  cbsb = -(Cbg + Cbd + Cbb);
11627  cbdb = Cbd;
11628  } // End of CTM
11629  }
11630 
11631  csgb = - cggb - cdgb - cbgb;
11632  csdb = - cgdb - cddb - cbdb;
11633  cssb = - cgsb - cdsb - cbsb;
11634  cgbb = - cgdb - cggb - cgsb;
11635  cdbb = - cddb - cdgb - cdsb;
11636  cbbb = - cbgb - cbdb - cbsb;
11637  csbb = - cgbb - cdbb - cbbb;
11638  // These three lines are commented out because in SPICE they're
11639  // here->BSIM4qgate = qgate
11640  // and used only for bypass. It's pointless to do this here:
11641  // qgate = qgate;
11642  // qbulk = qbulk;
11643  // qdrn = qdrn;
11644  // This line in spice is actually:
11645  // here->BSIM4qsrc = -(qgate + qbulk + qdrn);
11646  // and that saved version is *never used* --- let's not overwrite
11647  // our regular qsrc this way. Don't think it matters, but it's not
11648  // what spice is doing here.
11649  // qsrc = -(qgate + qbulk + qdrn);
11650 
11651  // NQS begins
11652  if ((trnqsMod) || (acnqsMod))
11653  {
11654  qchqs = qcheq = -(qbulk + qgate);
11655  cqgb = -(cggb + cbgb);
11656  cqdb = -(cgdb + cbdb);
11657  cqsb = -(cgsb + cbsb);
11658  cqbb = -(cqgb + cqdb + cqsb);
11659 
11661  * paramPtr->leffCV;
11662  T1 = gcrg / CoxWL; // 1 / tau
11663  gtau = T1 * ScalingFactor;
11664 
11665  if (acnqsMod)
11666  {
11667  taunet = 1.0 / T1;
11668  }
11669 
11670 #if 0
11671  *(ckt->CKTstate0 + qcheq) = qcheq;
11672  if (ckt->CKTmode & MODEINITTRAN)
11673  {
11674  *(ckt->CKTstate1 + qcheq) = *(ckt->CKTstate0 + qcheq);
11675  }
11676  if (trnqsMod)
11677  {
11678  error = NIintegrate(ckt, &geq, &ceq, 0.0, qcheq);
11679  if (error)
11680  {
11681  return(error);
11682  }
11683  }
11684 #endif
11685  }
11686 
11687  // Calculate junction C-V
11689  {
11690  czbd = model_.DunitAreaTempJctCap * Adeff; // bug fix
11691  czbs = model_.SunitAreaTempJctCap * Aseff;
11694  * paramPtr->weffCJ * nf;
11697  * paramPtr->weffCJ * nf;
11698 
11702 
11706 
11707  // Source Bulk Junction
11708  if (vbs_jct == 0.0)
11709  {
11710  qbs = 0.0;
11711  capbs = czbs + czbssw + czbsswg;
11712  }
11713  else if (vbs_jct < 0.0)
11714  {
11715  if (czbs > 0.0)
11716  {
11717  arg = 1.0 - vbs_jct / model_.PhiBS;
11718  if (MJS == 0.5)
11719  {
11720  sarg = 1.0 / sqrt(arg);
11721  }
11722  else
11723  {
11724  sarg = exp(-MJS * log(arg));
11725  }
11726  qbs = model_.PhiBS * czbs * (1.0 - arg * sarg) / (1.0 - MJS);
11727  capbs = czbs * sarg;
11728  }
11729  else
11730  {
11731  qbs = 0.0;
11732  capbs = 0.0;
11733  }
11734  if (czbssw > 0.0)
11735  {
11736  arg = 1.0 - vbs_jct / model_.PhiBSWS;
11737  if (MJSWS == 0.5)
11738  {
11739  sarg = 1.0 / sqrt(arg);
11740  }
11741  else
11742  {
11743  sarg = exp(-MJSWS * log(arg));
11744  }
11745  qbs += model_.PhiBSWS * czbssw
11746  * (1.0 - arg * sarg) / (1.0 - MJSWS);
11747  capbs += czbssw * sarg;
11748  }
11749  if (czbsswg > 0.0)
11750  {
11751  arg = 1.0 - vbs_jct / model_.PhiBSWGS;
11752  if (MJSWGS == 0.5)
11753  {
11754  sarg = 1.0 / sqrt(arg);
11755  }
11756  else
11757  {
11758  sarg = exp(-MJSWGS * log(arg));
11759  }
11760  qbs += model_.PhiBSWGS * czbsswg * (1.0 - arg * sarg) / (1.0 - MJSWGS);
11761  capbs += czbsswg * sarg;
11762  }
11763  }
11764  else
11765  {
11766  T0 = czbs + czbssw + czbsswg;
11767  T1 = vbs_jct * (czbs * MJS / model_.PhiBS + czbssw * MJSWS
11768  / model_.PhiBSWS + czbsswg * MJSWGS / model_.PhiBSWGS);
11769 
11770  qbs = vbs_jct * (T0 + 0.5 * T1);
11771  capbs = T0 + T1;
11772  }
11773 
11774  // Drain Bulk Junction
11775  if (vbd_jct == 0.0)
11776  {
11777  qbd = 0.0;
11778  capbd = czbd + czbdsw + czbdswg;
11779  }
11780  else if (vbd_jct < 0.0)
11781  {
11782  if (czbd > 0.0)
11783  {
11784  arg = 1.0 - vbd_jct / model_.PhiBD;
11785  if (MJD == 0.5)
11786  {
11787  sarg = 1.0 / sqrt(arg);
11788  }
11789  else
11790  {
11791  sarg = exp(-MJD * log(arg));
11792  }
11793  qbd = model_.PhiBD* czbd * (1.0 - arg * sarg) / (1.0 - MJD);
11794  capbd = czbd * sarg;
11795  }
11796  else
11797  {
11798  qbd = 0.0;
11799  capbd = 0.0;
11800  }
11801  if (czbdsw > 0.0)
11802  {
11803  arg = 1.0 - vbd_jct / model_.PhiBSWD;
11804  if (MJSWD == 0.5)
11805  {
11806  sarg = 1.0 / sqrt(arg);
11807  }
11808  else
11809  {
11810  sarg = exp(-MJSWD * log(arg));
11811  }
11812  qbd += model_.PhiBSWD * czbdsw
11813  * (1.0 - arg * sarg) / (1.0 - MJSWD);
11814  capbd += czbdsw * sarg;
11815  }
11816  if (czbdswg > 0.0)
11817  {
11818  arg = 1.0 - vbd_jct / model_.PhiBSWGD;
11819  if (MJSWGD == 0.5)
11820  sarg = 1.0 / sqrt(arg);
11821  else
11822  sarg = exp(-MJSWGD * log(arg));
11823  qbd += model_.PhiBSWGD * czbdswg
11824  * (1.0 - arg * sarg) / (1.0 - MJSWGD);
11825  capbd += czbdswg * sarg;
11826  }
11827  }
11828  else
11829  {
11830  T0 = czbd + czbdsw + czbdswg;
11831  T1 = vbd_jct * (czbd * MJD / model_.PhiBD + czbdsw * MJSWD
11832  / model_.PhiBSWD + czbdswg * MJSWGD / model_.PhiBSWGD);
11833  qbd = vbd_jct * (T0 + 0.5 * T1);
11834  capbd = T0 + T1;
11835  }
11836  } // ChargeComputation
11837 
11838  if (rgateMod == 3)
11839  {
11840  vgdx = vgmd;
11841  vgsx = vgms;
11842  }
11843  else // For rgateMod == 0, 1 and 2
11844  {
11845  vgdx = vgd;
11846  vgsx = vgs;
11847  }
11848 
11849  // gate resistor model currents. It is not necessary to calculate these
11850  // directly in spice3f5, but it is necessary in Xyce.
11851  Igate = IgateMid = 0.0;
11852  Igate_Jdxp = IgateMid_Jdxp = 0.0;
11853  if(rgateMod == 1)
11854  {
11855  Igate = grgeltd * (Vgegp);
11856  // Igate_Jdxp = - grgeltd * ((Vgegp-Vgegp_orig));
11857  }
11858  else if(rgateMod == 2)
11859  {
11860  Igate = (gcrg) * (Vgegp);
11861  // Igate_Jdxp = - gcrg * ((Vgegp-Vgegp_orig));
11862  }
11863  else if(rgateMod == 3)
11864  {
11865  Igate = grgeltd * (Vgegm);
11866  IgateMid = gcrg * (Vgmgp);
11867 
11868  // Igate_Jdxp = - grgeltd * (Vgegm-Vgegm_orig);
11869  // IgateMid_Jdxp = - gcrg * (Vgmgp-Vgmgp_orig);
11870  }
11871 
11872  if (model_.capMod == 0)
11873  {
11874  cgdo = paramPtr->cgdo;
11875  qgdo = paramPtr->cgdo * vgdx;
11876  cgso = paramPtr->cgso;
11877  qgso = paramPtr->cgso * vgsx;
11878  }
11879  else // For both capMod == 1 and 2
11880  {
11881  T0 = vgdx + CONSTDELTA_1;
11882  T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_1);
11883  T2 = 0.5 * (T0 - T1);
11884 
11885  T3 = paramPtr->weffCV * paramPtr->cgdl;
11886  T4 = sqrt(1.0 - 4.0 * T2 / paramPtr->ckappad);
11887  cgdo = paramPtr->cgdo + T3 - T3 * (1.0 - 1.0 / T4)
11888  * (0.5 - 0.5 * T0 / T1);
11889  qgdo = (paramPtr->cgdo + T3) * vgdx - T3 * (T2
11890  + 0.5 * paramPtr->ckappad * (T4 - 1.0));
11891 
11892  T0 = vgsx + CONSTDELTA_1;
11893  T1 = sqrt(T0 * T0 + 4.0 * CONSTDELTA_1);
11894  T2 = 0.5 * (T0 - T1);
11895  T3 = paramPtr->weffCV * paramPtr->cgsl;
11896  T4 = sqrt(1.0 - 4.0 * T2 / paramPtr->ckappas);
11897  cgso = paramPtr->cgso + T3 - T3 * (1.0 - 1.0 / T4)
11898  * (0.5 - 0.5 * T0 / T1);
11899  qgso = (paramPtr->cgso + T3) * vgsx - T3 * (T2
11900  + 0.5 * paramPtr->ckappas * (T4 - 1.0));
11901  }
11902 
11903  if (nf != 1.0)
11904  {
11905  cgdo *= nf;
11906  cgso *= nf;
11907  qgdo *= nf;
11908  qgso *= nf;
11909  }
11910  // This silliness unnecessary, conversion from spice's
11911  // here->BSIM4cgdo = cgdo;
11912  // that stuff only needed for bypass
11913  // cgdo = cgdo;
11914  // qgdo = qgdo;
11915  // cgso = cgso;
11916  // qgso = qgso;
11917 
11920 
11921  // Setting up a few currents for the RHS load:
11922  if (model_.rdsMod == 1)
11923  {
11924  Idrain = gdtot * Vddp;
11925  Isource = gstot * Vssp;
11926  }
11927  else
11928  {
11931  }
11932 
11933  // More terms that Spice leaves out because of its formulation, but which
11934  // Xyce absolutely needs in the RHS.
11935  if (model_.rbodyMod != 0)
11936  {
11937  Idbb = grbdb * Vdbb;
11938  Idbbp = grbpd * Vdbbp;
11939  Isbb = grbsb * Vsbb;
11940  Isbbp = grbps * Vsbbp;
11941  Ibpb = grbpb * Vbpb;
11942  }
11943 
11944  return bsuccess;
11945 }
11946 
11947 //-----------------------------------------------------------------------------
11948 // Function : Instance::updatePrimaryState
11949 //
11950 // Purpose : This function sets up the primaray state variables into
11951 // the primary state vector.
11952 //
11953 // These variables include qbulk, qgate, qdrn and, in the
11954 // event that nqsMod=1, qcdump and qcheq.
11955 //
11956 // Special Notes :
11957 // Scope : public
11958 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
11959 // Creation Date : 11/25/06
11960 //-----------------------------------------------------------------------------
11962 {
11963  bool bsuccess = true;
11964 
11965  double * staVec = extData.nextStaVectorRawPtr;
11966 
11967 #ifdef Xyce_DEBUG_DEVICE
11968  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
11969  {
11970  Xyce::dout() << subsection_divider << std::endl;
11971  Xyce::dout() << " Begin of updatePrimaryState. \n";
11972  Xyce::dout() << std::endl;
11973  }
11974 #endif
11975 
11976  bsuccess = updateIntermediateVars ();
11977 
11978  // voltage drops:
11979  double * stoVec = extData.nextStoVectorRawPtr;
11980  stoVec[li_store_vbd] = vbd;
11981  stoVec[li_store_vbs] = vbs;
11982  stoVec[li_store_vgs] = vgs;
11983  stoVec[li_store_vds] = vds;
11984  stoVec[li_store_vges] = vges;
11985  stoVec[li_store_vgms] = vgms;
11986  stoVec[li_store_vdes] = vdes;
11987  stoVec[li_store_vses] = vses;
11988  stoVec[li_store_vdbs] = vdbs;
11989  stoVec[li_store_vsbs] = vsbs;
11990  stoVec[li_store_vdbd] = vdbd;
11991  stoVec[li_store_von] = von;
11992 
11993  // intrinsic capacitors:
11994  // Note the wierdness --- we have a "qg", "qb" and "qd" state variable,
11995  // but no corresponding instance variable --- they are all calculated from
11996  // other quantities that are NOT stored in the instance. We use them
11997  // only in their derivative forms, cqg, cqb, and cqd.
11998  qg = staVec[li_state_qg ] = qgate;
11999  qd = staVec[li_state_qd ] = qdrn-qbd;
12000 
12001  if (!rbodyMod)
12002  {
12003  qb =staVec[li_state_qb ] = qbulk+qbd+qbs;
12004  }
12005  else
12006  {
12007  qb = staVec[li_state_qb ] = qbulk;
12008  }
12009 
12010  if (rgateMod == 3)
12011  {
12012  staVec[li_state_qgmid] = qgmid;
12013  }
12014 
12015  // parasitic capacitors:
12016  if (rbodyMod)
12017  {
12018  staVec[li_state_qbs] = qbs;
12019  staVec[li_state_qbd] = qbd;
12020  }
12021 
12022  if( trnqsMod )
12023  {
12024  staVec[li_state_qcheq] = qcheq;
12025  staVec[li_state_qcdump] = qdef * ScalingFactor;
12026  }
12027 
12028  // if this is the first newton step of the first time step
12029  // of the transient simulation, we need to enforce that the
12030  // time derivatives w.r.t. charge are zero. This is to maintain 3f5
12031  // compatibility. ERK.
12032 
12033  // Note: I think this kind of thing is enforced (or should be enforced,
12034  // anyway) at the time integration level. So I'm not sure this step is
12035  // really needed, at least for new-DAE. Derivatives out of the DCOP
12036  // are supposed to be zero at the first newton step.
12037 
12038  if (!(getSolverState().dcopFlag) && getSolverState().initTranFlag && getSolverState().newtonIter==0)
12039  {
12040  // re-set the state vector pointer that we are using to the "current"
12041  // pointer, rather than the "next" pointer.
12042  double * currStaVec = extData.currStaVectorRawPtr;
12043 
12044  // intrinsic capacitors:
12045  currStaVec[li_state_qg ] = qgate;
12046  currStaVec[li_state_qd ] = qdrn-qbd;
12047  if (!rbodyMod)
12048  {
12049  currStaVec[li_state_qb ] = qbulk+qbd+qbs;
12050  }
12051  else
12052  {
12053  currStaVec[li_state_qb ] = qbulk;
12054  }
12055 
12056  if (rgateMod == 3)
12057  {
12058  currStaVec[li_state_qgmid] = qgmid;
12059  }
12060 
12061  // parasitic capacitors:
12062  if (rbodyMod)
12063  {
12064  currStaVec[li_state_qbs] = qbs;
12065  currStaVec[li_state_qbd] = qbd;
12066  }
12067 
12068  if( trnqsMod )
12069  {
12070  currStaVec[li_state_qcheq] = qcheq;
12071  currStaVec[li_state_qcdump] = qdef * ScalingFactor;
12072  }
12073  }
12074 
12075  return bsuccess;
12076 }
12077 
12078 //-----------------------------------------------------------------------------
12079 // Function : Instance::loadDAEQVector
12080 //
12081 // Purpose : Loads the Q-vector contributions for a single
12082 // bsim4 instance.
12083 //
12084 // Special Notes : The "Q" vector is part of a standard DAE formalism in
12085 // which the system of equations is represented as:
12086 //
12087 // f(x) = dQ(x)/dt + F(x) - B(t) = 0
12088 //
12089 // Scope : public
12090 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
12091 // Creation Date : 11/25/06
12092 //-----------------------------------------------------------------------------
12094 {
12095  bool bsuccess=true;
12096 
12097  double * qVec = extData.daeQVectorRawPtr;
12098  double * dQdxdVp = extData.dQdxdVpVectorRawPtr;
12099 
12100 #ifdef Xyce_DEBUG_DEVICE
12101  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
12102  {
12103  Xyce::dout() << subsection_divider << std::endl;
12104  Xyce::dout() << " MOSFET BSIM4 loadDAEQVector " << std::endl;
12105  Xyce::dout() << " name = " << getName() << std::endl;
12106  Xyce::dout().width(28); Xyce::dout().precision(20); Xyce::dout().setf(std::ios::scientific);
12107  Xyce::dout() << " " << std::endl;
12108  }
12109 #endif
12110 
12112 
12113  double Qeqqg = 0.0; // gate charge
12114  double Qeqqb = 0.0; // bulk charge
12115  double Qeqqd = 0.0; // drain charge
12116  double Qeqqgmid = 0.0; //
12117  double Qeqqjs = 0.0; // source-junction charge
12118  double Qeqqjd = 0.0; // drain-junction charge
12119  double Qqdef = 0.0; // nqs-related charge.
12120  double Qqcheq = 0.0; // nqs-related charge.
12121 
12122  if (model_.dtype > 0)
12123  {
12124  Qeqqg = qg;
12125  Qeqqd = qd;
12126  Qeqqb = qb;
12127 
12128  if (trnqsMod)
12129  {
12130  Qqdef = qdef;
12131  Qqcheq = qcheq;
12132  }
12133 
12134  if (rbodyMod)
12135  {
12136  Qeqqjs = qbs;
12137  Qeqqjd = qbd;
12138  }
12139 
12140  if (rgateMod == 3)
12141  {
12142  Qeqqgmid = qgmid;
12143  }
12144  }
12145  else
12146  {
12147  Qeqqg = -qg;
12148  Qeqqd = -qd;
12149  Qeqqb = -qb;
12150 
12151  if (trnqsMod)
12152  {
12153  Qqdef = -qdef;
12154  Qqcheq = -qcheq;
12155  }
12156 
12157  if (rbodyMod)
12158  {
12159  Qeqqjs = -qbs;
12160  Qeqqjd = -qbd;
12161  }
12162 
12163  if (rgateMod == 3)
12164  {
12165  Qeqqgmid = -qgmid;
12166  }
12167  }
12168 
12169  // Loading q-vector:
12170  qVec[li_DrainPrime] += -(-Qeqqd)*numberParallel;
12171  qVec[li_GatePrime] -= -(Qeqqg)*numberParallel;
12172 
12173  if (rgateMod == 3)
12174  {
12175  qVec[li_GateMid] -= -(+Qeqqgmid)*numberParallel;
12176  }
12177 
12178  if (!rbodyMod)
12179  {
12180  qVec[li_BodyPrime] += -(-Qeqqb)*numberParallel;
12181  qVec[li_SourcePrime] += -(+Qeqqg + Qeqqb + Qeqqd + Qeqqgmid)*numberParallel;
12182  }
12183  else
12184  {
12185  qVec[li_DrainBody] -= -(Qeqqjd)*numberParallel;
12186  qVec[li_BodyPrime] += -(-Qeqqb)*numberParallel;
12187  qVec[li_SourceBody] -= -(Qeqqjs)*numberParallel;
12188  qVec[li_SourcePrime] += -(Qeqqd + Qeqqg + Qeqqb + Qeqqjd + Qeqqjs + Qeqqgmid)*numberParallel;
12189  }
12190 
12191  if (trnqsMod)
12192  {
12193  qVec[li_Charge] += -(Qqcheq - Qqdef)*numberParallel;
12194  }
12195 
12196  // limiter section
12198  {
12199  dQdxdVp[li_DrainPrime] += (-Qeqqd_Jdxp)*numberParallel;
12200  dQdxdVp[li_GatePrime] -= (Qeqqg_Jdxp)*numberParallel;
12201 
12202  if (rgateMod == 3)
12203  {
12204  dQdxdVp[li_GateMid] -= (+Qeqqgmid_Jdxp)*numberParallel;
12205  }
12206 
12207  if (!rbodyMod)
12208  {
12209  dQdxdVp[li_BodyPrime] += (-Qeqqb_Jdxp)*numberParallel;
12211  }
12212  else
12213  {
12214  dQdxdVp[li_DrainBody] -= (Qeqqjd_Jdxp)*numberParallel;
12215  dQdxdVp[li_BodyPrime] += (-Qeqqb_Jdxp)*numberParallel;
12216  dQdxdVp[li_SourceBody] -= (+Qeqqjs_Jdxp)*numberParallel;
12218  }
12219 
12220  if (trnqsMod)
12221  {
12222  dQdxdVp[li_Charge] += (Qqcheq_Jdxp)*numberParallel;
12223  }
12224  }
12225 
12226  return bsuccess;
12227 }
12228 
12229 //-----------------------------------------------------------------------------
12230 // Function : Instance::auxChargeCalculations
12231 //
12232 // Purpose : This function does some final "cleanup" calculations
12233 // having to do with the capacitors.
12234 //
12235 // Special Notes : About all this function really does is set up some
12236 // voltlim terms, and some unused nqs stuff.
12237 //
12238 // Scope : public
12239 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
12240 // Creation Date : 11/25/06
12241 //-----------------------------------------------------------------------------
12243 {
12244  double T0, T1;
12245 
12247  {
12248  sxpart = (1.0 - (dxpart = (mode > 0) ? 0.4 : 0.6));
12251  Qeqqg_Jdxp=0.0;
12252  Qeqqd_Jdxp=0.0;
12253  Qeqqb_Jdxp=0.0;
12254  Qeqqgmid_Jdxp=0.0;
12255  Qeqqjs_Jdxp = 0.0;
12256  Qeqqjd_Jdxp = 0.0;
12257 
12258  if (trnqsMod)
12259  {
12261  * paramPtr->leffCV;
12262  T1 = gcrg / CoxWL;
12263  gtau = T1 * ScalingFactor;
12264  }
12265  else
12266  {
12267  gtau = 0.0;
12268  }
12269  }
12270  else // ChargeComputation is needed
12271  {
12272 
12273  Qeqqg_Jdxp = 0.0;
12274  if (!origFlag)
12275  {
12276  Qeqqg_Jdxp = - CAPcggb * (vgb-vgb_orig)
12277  + CAPcgdb * (vbd-vbd_orig)
12278  + CAPcgsb * (vbs-vbs_orig);
12279  }
12280 
12281  Qeqqd_Jdxp = 0.0;
12282  if (!origFlag)
12283  {
12284  Qeqqd_Jdxp = - CAPcdgb * (vgb-vgb_orig)
12285  - CAPcdgmb * (vgmb-vgmb_orig)
12286  + (CAPcddb + CAPcdbdb) * (vbd-vbd_orig)
12288  + CAPcdsb * (vbs-vbs_orig);
12289  }
12290 
12291  Qeqqb_Jdxp = 0.0;
12292  if (!origFlag)
12293  {
12294  Qeqqb_Jdxp = - CAPcbgb * (vgb-vgb_orig)
12295  - CAPcbgmb * (vgmb-vgmb_orig)
12296  + CAPcbdb * (vbd-vbd_orig)
12297  + CAPcbsb * (vbs-vbs_orig);
12298  }
12299 
12300  if (rgateMod == 3)
12301  {
12302  Qeqqgmid_Jdxp = 0.0;
12303  if (!origFlag)
12304  {
12306  + CAPcgmsb * (vbs-vbs_orig)
12307  - CAPcgmgmb * (vgmb-vgmb_orig);
12308  }
12309  }
12310  else
12311  {
12312  Qeqqgmid_Jdxp = 0.0;
12313  }
12314 
12315  if (rbodyMod)
12316  {
12317  Qeqqjs_Jdxp = 0.0;
12318  Qeqqjd_Jdxp = 0.0;
12319  if (!origFlag)
12320  {
12323  }
12324  }
12325 
12326  if (trnqsMod)
12327  {
12328  // Not sure if these nqs-related terms are correct.
12329  T0 = ggtg * (vgb-vgb_orig) - ggtd * (vbd-vbd_orig) - ggts * (vbs-vbs_orig);
12330 
12331  //ceqqg += 0.0;
12332  Qeqqg_Jdxp += T0;
12333  T1 = qdef * gtau;
12334 
12335  //ceqqd -= 0.0;
12336  Qeqqd_Jdxp -= dxpart * T0
12337  + T1 * (ddxpart_dVg * (vgb-vgb_orig)
12338  - ddxpart_dVd * (vbd-vbd_orig)
12339  - ddxpart_dVs * (vbs-vbs_orig));
12340 
12341  cqdef = cqcdump - gqdef * qdef;
12342 
12343  //cqcheq = cqcheq; // redundant..
12344  Qqcheq_Jdxp = -(
12345  CAPcqgb * (vgb-vgb_orig)
12346  - CAPcqdb * (vbd-vbd_orig)
12347  - CAPcqsb * (vbs-vbs_orig)) + T0;
12348  }
12349 
12350 #if 0
12351  if (ckt->CKTmode & MODEINITTRAN)
12352  {
12353  *(ckt->CKTstate1 + cqb) = *(ckt->CKTstate0 + cqb);
12354  *(ckt->CKTstate1 + cqg) = *(ckt->CKTstate0 + cqg);
12355  *(ckt->CKTstate1 + cqd) = *(ckt->CKTstate0 + cqd);
12356 
12357  if (rgateMod == 3)
12358  {
12359  *(ckt->CKTstate1 + cqgmid) = *(ckt->CKTstate0 + cqgmid);
12360  }
12361 
12362  if (rbodyMod)
12363  {
12364  *(ckt->CKTstate1 + cqbs) = *(ckt->CKTstate0 + cqbs);
12365  *(ckt->CKTstate1 + cqbd) = *(ckt->CKTstate0 + cqbd);
12366  }
12367  }
12368 #endif
12369 
12370  } // !ChargeComputationNeeded
12371 
12372  return true;
12373 }
12374 
12375 //-----------------------------------------------------------------------------
12376 // Function : Instance::setupCapacitors_newDAE ()
12377 // Purpose :
12378 // Special Notes :
12379 // Scope : public
12380 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
12381 // Creation Date : 11/25/06
12382 //-----------------------------------------------------------------------------
12384 {
12385  if (mode > 0)
12386  {
12387  if (trnqsMod == 0)
12388  {
12389  if (rgateMod == 3)
12390  {
12391  CAPcgmgmb = (cgdo + cgso + paramPtr->cgbo) ;
12392  CAPcgmdb = -cgdo ;
12393  CAPcgmsb = -cgso ;
12394  CAPcgmbb = -paramPtr->cgbo ;
12395 
12396  CAPcdgmb = CAPcgmdb;
12397  CAPcsgmb = CAPcgmsb;
12398  CAPcbgmb = CAPcgmbb;
12399 
12400  CAPcggb = cggb ;
12401  CAPcgdb = cgdb ;
12402  CAPcgsb = cgsb ;
12403  CAPcgbb = -(CAPcggb + CAPcgdb + CAPcgsb);
12404 
12405  CAPcdgb = cdgb ;
12406  CAPcsgb = -(cggb + cbgb + cdgb) ;
12407  CAPcbgb = cbgb ;
12408  }
12409  else
12410  {
12411  CAPcggb = (cggb + cgdo + cgso + paramPtr->cgbo ) ;
12412  CAPcgdb = (cgdb - cgdo) ;
12413  CAPcgsb = (cgsb - cgso) ;
12414  CAPcgbb = -(CAPcggb + CAPcgdb + CAPcgsb);
12415 
12416  CAPcdgb = (cdgb - cgdo) ;
12417  CAPcsgb = -(cggb + cbgb + cdgb + cgso) ;
12418  CAPcbgb = (cbgb - paramPtr->cgbo) ;
12419 
12420  CAPcdgmb = CAPcsgmb = CAPcbgmb = 0.0;
12421 
12422  }
12423  CAPcddb = (cddb + capbd + cgdo) ;
12424  CAPcdsb = cdsb ;
12425 
12426  CAPcsdb = -(cgdb + cbdb + cddb) ;
12427  CAPcssb = (capbs + cgso - (cgsb + cbsb + cdsb)) ;
12428 
12429  if (!rbodyMod)
12430  {
12431  CAPcdbb = -(CAPcdgb + CAPcddb + CAPcdsb + CAPcdgmb);
12432  CAPcsbb = -(CAPcsgb + CAPcsdb + CAPcssb + CAPcsgmb);
12433  CAPcbdb = (cbdb - capbd) ;
12434  CAPcbsb = (cbsb - capbs) ;
12435  CAPcdbdb = 0.0; CAPcsbsb = 0.0;
12436  }
12437  else
12438  {
12439  CAPcdbb = -(cddb + cdgb + cdsb) ;
12440  CAPcsbb = -(CAPcsgb + CAPcsdb + CAPcssb + CAPcsgmb) + capbs ;
12441  CAPcbdb = cbdb ;
12442  CAPcbsb = cbsb ;
12443 
12444  CAPcdbdb = -capbd ;
12445  CAPcsbsb = -capbs ;
12446  }
12447  CAPcbbb = -(CAPcbdb + CAPcbgb + CAPcbsb + CAPcbgmb);
12448 
12449  }
12450  else
12451  {
12452  CAPcqgb = cqgb ;
12453  CAPcqdb = cqdb ;
12454  CAPcqsb = cqsb ;
12455  CAPcqbb = cqbb ;
12456 
12457 
12458  if (rgateMod == 3)
12459  {
12460  CAPcgmgmb = (cgdo + cgso + paramPtr->cgbo) ;
12461  CAPcgmdb = -cgdo ;
12462  CAPcgmsb = -cgso ;
12463  CAPcgmbb = -paramPtr->cgbo ;
12464 
12465  CAPcdgmb = CAPcgmdb;
12466  CAPcsgmb = CAPcgmsb;
12467  CAPcbgmb = CAPcgmbb;
12468 
12469  CAPcdgb = CAPcsgb = CAPcbgb = 0.0;
12470  CAPcggb = CAPcgdb = CAPcgsb = CAPcgbb = 0.0;
12471 
12472  }
12473  else
12474  {
12475  CAPcggb = (cgdo + cgso + paramPtr->cgbo ) ;
12476  CAPcgdb = -cgdo ;
12477  CAPcgsb = -cgso ;
12478  CAPcgbb = -paramPtr->cgbo ;
12479 
12480  CAPcdgb = CAPcgdb;
12481  CAPcsgb = CAPcgsb;
12482  CAPcbgb = CAPcgbb;
12483  CAPcdgmb = CAPcsgmb = CAPcbgmb = 0.0;
12484 
12485  }
12486 
12487  CAPcddb = (capbd + cgdo) ;
12488  CAPcdsb = CAPcsdb = 0.0;
12489  CAPcssb = (capbs + cgso) ;
12490 
12491  if (!rbodyMod)
12492  {
12493  CAPcdbb = -(CAPcdgb + CAPcddb + CAPcdgmb);
12494  CAPcsbb = -(CAPcsgb + CAPcssb + CAPcsgmb);
12495  CAPcbdb = -capbd ;
12496  CAPcbsb = -capbs ;
12497  CAPcdbdb = 0.0; CAPcsbsb = 0.0;
12498  }
12499  else
12500  {
12501  CAPcdbb = CAPcsbb = CAPcbdb = CAPcbsb = 0.0;
12502  CAPcdbdb = -capbd ;
12503  CAPcsbsb = -capbs ;
12504  }
12505  CAPcbbb = -(CAPcbdb + CAPcbgb + CAPcbsb + CAPcbgmb);
12506  }
12507  }
12508  else
12509  {
12510  if (trnqsMod == 0)
12511  {
12512  if (rgateMod == 3)
12513  {
12514  CAPcgmgmb = (cgdo + cgso + paramPtr->cgbo) ;
12515  CAPcgmdb = -cgdo ;
12516  CAPcgmsb = -cgso ;
12517  CAPcgmbb = -paramPtr->cgbo ;
12518 
12519  CAPcdgmb = CAPcgmdb;
12520  CAPcsgmb = CAPcgmsb;
12521  CAPcbgmb = CAPcgmbb;
12522 
12523  CAPcggb = cggb ;
12524  CAPcgdb = cgsb ;
12525  CAPcgsb = cgdb ;
12526  CAPcgbb = -(CAPcggb + CAPcgdb + CAPcgsb);
12527 
12528  CAPcdgb = -(cggb + cbgb + cdgb) ;
12529  CAPcsgb = cdgb ;
12530  CAPcbgb = cbgb ;
12531 
12532  }
12533  else
12534  {
12535  CAPcggb = (cggb + cgdo + cgso + paramPtr->cgbo ) ;
12536  CAPcgdb = (cgsb - cgdo) ;
12537  CAPcgsb = (cgdb - cgso) ;
12538  CAPcgbb = -(CAPcggb + CAPcgdb + CAPcgsb);
12539 
12540  CAPcdgb = -(cggb + cbgb + cdgb + cgdo) ;
12541  CAPcsgb = (cdgb - cgso) ;
12542  CAPcbgb = (cbgb - paramPtr->cgbo) ;
12543 
12544  CAPcdgmb = CAPcsgmb = CAPcbgmb = 0.0;
12545 
12546  }
12547  CAPcddb = (capbd + cgdo - (cgsb + cbsb + cdsb)) ;
12548  CAPcdsb = -(cgdb + cbdb + cddb) ;
12549 
12550  CAPcsdb = cdsb ;
12551  CAPcssb = (cddb + capbs + cgso) ;
12552 
12553  if (!rbodyMod)
12554  {
12555  CAPcdbb = -(CAPcdgb + CAPcddb + CAPcdsb + CAPcdgmb);
12556  CAPcsbb = -(CAPcsgb + CAPcsdb + CAPcssb + CAPcsgmb);
12557  CAPcbdb = (cbsb - capbd) ;
12558  CAPcbsb = (cbdb - capbs) ;
12559  CAPcdbdb = 0.0; CAPcsbsb = 0.0;
12560  }
12561  else
12562  {
12563  CAPcdbb = -(CAPcdgb + CAPcddb + CAPcdsb + CAPcdgmb) + capbd ;
12564  CAPcsbb = -(cddb + cdgb + cdsb) ;
12565  CAPcbdb = cbsb ;
12566  CAPcbsb = cbdb ;
12567  CAPcdbdb = -capbd ;
12568  CAPcsbsb = -capbs ;
12569  }
12570  CAPcbbb = -(CAPcbgb + CAPcbdb + CAPcbsb + CAPcbgmb);
12571  }
12572  else
12573  {
12574 
12575  CAPcqgb = cqgb ;
12576  CAPcqdb = cqsb ;
12577  CAPcqsb = cqdb ;
12578  CAPcqbb = cqbb ;
12579 
12580 
12581  if (rgateMod == 3)
12582  {
12583  CAPcgmgmb = (cgdo + cgso + paramPtr->cgbo) ;
12584  CAPcgmdb = -cgdo ;
12585  CAPcgmsb = -cgso ;
12586  CAPcgmbb = -paramPtr->cgbo ;
12587 
12588  CAPcdgmb = CAPcgmdb;
12589  CAPcsgmb = CAPcgmsb;
12590  CAPcbgmb = CAPcgmbb;
12591 
12592  CAPcdgb = CAPcsgb = CAPcbgb = 0.0;
12593  CAPcggb = CAPcgdb = CAPcgsb = CAPcgbb = 0.0;
12594 
12595  }
12596  else
12597  {
12598  CAPcggb = (cgdo + cgso + paramPtr->cgbo ) ;
12599  CAPcgdb = -cgdo ;
12600  CAPcgsb = -cgso ;
12601  CAPcgbb = -paramPtr->cgbo ;
12602 
12603  CAPcdgb = CAPcgdb;
12604  CAPcsgb = CAPcgsb;
12605  CAPcbgb = CAPcgbb;
12606  CAPcdgmb = CAPcsgmb = CAPcbgmb = 0.0;
12607 
12608  }
12609 
12610  CAPcddb = (capbd + cgdo) ;
12611  CAPcdsb = CAPcsdb = 0.0;
12612  CAPcssb = (capbs + cgso) ;
12613  if (!rbodyMod)
12614  {
12615  CAPcdbb = -(CAPcdgb + CAPcddb + CAPcdgmb);
12616  CAPcsbb = -(CAPcsgb + CAPcssb + CAPcsgmb);
12617  CAPcbdb = -capbd ;
12618  CAPcbsb = -capbs ;
12619  CAPcdbdb = 0.0; CAPcsbsb = 0.0;
12620  }
12621  else
12622  {
12623  CAPcdbb = CAPcsbb = CAPcbdb = CAPcbsb = 0.0;
12624  CAPcdbdb = -capbd ;
12625  CAPcsbsb = -capbs ;
12626  }
12627  CAPcbbb = -(CAPcbdb + CAPcbgb + CAPcbsb + CAPcbgmb);
12628  }
12629  }
12630 
12631  return true;
12632 }
12633 
12634 //-----------------------------------------------------------------------------
12635 // Function : Instance::setupCapacitors_oldDAE ()
12636 // Purpose :
12637 // Special Notes :
12638 // Scope : public
12639 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
12640 // Creation Date : 12/17/06
12641 //-----------------------------------------------------------------------------
12643 {
12644  double ag0 = getSolverState().pdt;
12645  double T0;
12646 
12647  // ERK. 12/17/2006.
12648  // It is necessary to set ag0=0.0, because for the first time step out of
12649  // the DCOP, all the time derivatives are forced to be zero. Thus, all
12650  // their derivatives should also be zero. If it wasn't for that, then ag0
12651  // could always be pdt. (it used to be, before the -jacobian_test capability).
12652  if (!(getSolverState().dcopFlag) && getSolverState().initTranFlag && getSolverState().newtonIter==0)
12653  {
12654  ag0 = 0.0;
12655  }
12656 
12657  if (mode > 0)
12658  {
12659  if (trnqsMod == 0)
12660  {
12661  qdrn -= qgdo;
12662  if (rgateMod == 3)
12663  {
12664  gcgmgmb = (cgdo + cgso + paramPtr->cgbo) * ag0;
12665  gcgmdb = -cgdo * ag0;
12666  gcgmsb = -cgso * ag0;
12667  gcgmbb = -paramPtr->cgbo * ag0;
12668 
12669  gcdgmb = gcgmdb;
12670  gcsgmb = gcgmsb;
12671  gcbgmb = gcgmbb;
12672 
12673  gcggb = cggb * ag0;
12674  gcgdb = cgdb * ag0;
12675  gcgsb = cgsb * ag0;
12676  gcgbb = -(gcggb + gcgdb + gcgsb);
12677 
12678  gcdgb = cdgb * ag0;
12679  gcsgb = -(cggb + cbgb + cdgb) * ag0;
12680  gcbgb = cbgb * ag0;
12681 
12682  qgmb = paramPtr->cgbo * vgmb;
12683  qgmid = qgdo + qgso + qgmb;
12684  qbulk -= qgmb;
12685  qsrc = -(qgate + qgmid + qbulk + qdrn);
12686  }
12687  else
12688  {
12689  gcggb = (cggb + cgdo + cgso + paramPtr->cgbo ) * ag0;
12690  gcgdb = (cgdb - cgdo) * ag0;
12691  gcgsb = (cgsb - cgso) * ag0;
12692  gcgbb = -(gcggb + gcgdb + gcgsb);
12693 
12694  gcdgb = (cdgb - cgdo) * ag0;
12695  gcsgb = -(cggb + cbgb + cdgb + cgso) * ag0;
12696  gcbgb = (cbgb - paramPtr->cgbo) * ag0;
12697 
12698  gcdgmb = gcsgmb = gcbgmb = 0.0;
12699 
12700  qgb = paramPtr->cgbo * vgb;
12701  qgate += qgdo + qgso + qgb;
12702  qbulk -= qgb;
12703  qsrc = -(qgate + qbulk + qdrn);
12704  }
12705  gcddb = (cddb + capbd + cgdo) * ag0;
12706  gcdsb = cdsb * ag0;
12707 
12708  gcsdb = -(cgdb + cbdb + cddb) * ag0;
12709  gcssb = (capbs + cgso - (cgsb + cbsb + cdsb)) * ag0;
12710 
12711  if (!rbodyMod)
12712  {
12713  gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb);
12714  gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb);
12715  gcbdb = (cbdb - capbd) * ag0;
12716  gcbsb = (cbsb - capbs) * ag0;
12717  gcdbdb = 0.0; gcsbsb = 0.0;
12718  }
12719  else
12720  {
12721  gcdbb = -(cddb + cdgb + cdsb) * ag0;
12722  gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb) + capbs * ag0;
12723  gcbdb = cbdb * ag0;
12724  gcbsb = cbsb * ag0;
12725 
12726  gcdbdb = -capbd * ag0;
12727  gcsbsb = -capbs * ag0;
12728  }
12729  gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb);
12730 
12731  ggtg = ggtd = ggtb = ggts = 0.0;
12732  sxpart = 0.6;
12733  dxpart = 0.4;
12736  }
12737  else
12738  {
12739  qcheq = qchqs;
12741  * paramPtr->leffCV;
12742  T0 = qdef * ScalingFactor / CoxWL;
12743 
12744  ggtg = gtg = T0 * gcrgg;
12745  ggtd = gtd = T0 * gcrgd;
12746  ggts = gts = T0 * gcrgs;
12747  ggtb = gtb = T0 * gcrgb;
12748  gqdef = ScalingFactor * ag0;
12749 
12750  gcqgb = cqgb * ag0;
12751  gcqdb = cqdb * ag0;
12752  gcqsb = cqsb * ag0;
12753  gcqbb = cqbb * ag0;
12754 
12755  if (fabs(qcheq) <= 1.0e-5 * CoxWL)
12756  {
12757  if (model_.xpart < 0.5)
12758  {
12759  dxpart = 0.4;
12760  }
12761  else if (model_.xpart > 0.5)
12762  {
12763  dxpart = 0.0;
12764  }
12765  else
12766  {
12767  dxpart = 0.5;
12768  }
12770  = ddxpart_dVs = 0.0;
12771  }
12772  else
12773  {
12774  dxpart = qdrn / qcheq;
12775  Cdd = cddb;
12776  Csd = -(cgdb + cddb
12777  + cbdb);
12778  ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq;
12779  Cdg = cdgb;
12780  Csg = -(cggb + cdgb
12781  + cbgb);
12782  ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq;
12783 
12784  Cds = cdsb;
12785  Css = -(cgsb + cdsb
12786  + cbsb);
12787  ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq;
12788 
12790  }
12791  sxpart = 1.0 - dxpart;
12796 
12797  if (rgateMod == 3)
12798  {
12799  gcgmgmb = (cgdo + cgso + paramPtr->cgbo) * ag0;
12800  gcgmdb = -cgdo * ag0;
12801  gcgmsb = -cgso * ag0;
12802  gcgmbb = -paramPtr->cgbo * ag0;
12803 
12804  gcdgmb = gcgmdb;
12805  gcsgmb = gcgmsb;
12806  gcbgmb = gcgmbb;
12807 
12808  gcdgb = gcsgb = gcbgb = 0.0;
12809  gcggb = gcgdb = gcgsb = gcgbb = 0.0;
12810 
12811  qgmb = paramPtr->cgbo * vgmb;
12812  qgmid = qgdo + qgso + qgmb;
12813  qgate = 0.0;
12814  qbulk = -qgmb;
12815  qdrn = -qgdo;
12816  qsrc = -(qgmid + qbulk + qdrn);
12817  }
12818  else
12819  {
12820  gcggb = (cgdo + cgso + paramPtr->cgbo ) * ag0;
12821  gcgdb = -cgdo * ag0;
12822  gcgsb = -cgso * ag0;
12823  gcgbb = -paramPtr->cgbo * ag0;
12824 
12825  gcdgb = gcgdb;
12826  gcsgb = gcgsb;
12827  gcbgb = gcgbb;
12828  gcdgmb = gcsgmb = gcbgmb = 0.0;
12829 
12830  qgb = paramPtr->cgbo * vgb;
12831  qgate = qgdo + qgso + qgb;
12832  qbulk = -qgb;
12833  qdrn = -qgdo;
12834  qsrc = -(qgate + qbulk + qdrn);
12835  }
12836 
12837  gcddb = (capbd + cgdo) * ag0;
12838  gcdsb = gcsdb = 0.0;
12839  gcssb = (capbs + cgso) * ag0;
12840 
12841  if (!rbodyMod)
12842  {
12843  gcdbb = -(gcdgb + gcddb + gcdgmb);
12844  gcsbb = -(gcsgb + gcssb + gcsgmb);
12845  gcbdb = -capbd * ag0;
12846  gcbsb = -capbs * ag0;
12847  gcdbdb = 0.0; gcsbsb = 0.0;
12848  }
12849  else
12850  {
12851  gcdbb = gcsbb = gcbdb = gcbsb = 0.0;
12852  gcdbdb = -capbd * ag0;
12853  gcsbsb = -capbs * ag0;
12854  }
12855  gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb);
12856  }
12857  }
12858  else
12859  {
12860  if (trnqsMod == 0)
12861  {
12862  qsrc = qdrn - qgso;
12863  if (rgateMod == 3)
12864  {
12865  gcgmgmb = (cgdo + cgso + paramPtr->cgbo) * ag0;
12866  gcgmdb = -cgdo * ag0;
12867  gcgmsb = -cgso * ag0;
12868  gcgmbb = -paramPtr->cgbo * ag0;
12869 
12870  gcdgmb = gcgmdb;
12871  gcsgmb = gcgmsb;
12872  gcbgmb = gcgmbb;
12873 
12874  gcggb = cggb * ag0;
12875  gcgdb = cgsb * ag0;
12876  gcgsb = cgdb * ag0;
12877  gcgbb = -(gcggb + gcgdb + gcgsb);
12878 
12879  gcdgb = -(cggb + cbgb + cdgb) * ag0;
12880  gcsgb = cdgb * ag0;
12881  gcbgb = cbgb * ag0;
12882 
12883  qgmb = paramPtr->cgbo * vgmb;
12884  qgmid = qgdo + qgso + qgmb;
12885  qbulk -= qgmb;
12886  qdrn = -(qgate + qgmid + qbulk + qsrc);
12887  }
12888  else
12889  {
12890  gcggb = (cggb + cgdo + cgso + paramPtr->cgbo ) * ag0;
12891  gcgdb = (cgsb - cgdo) * ag0;
12892  gcgsb = (cgdb - cgso) * ag0;
12893  gcgbb = -(gcggb + gcgdb + gcgsb);
12894 
12895  gcdgb = -(cggb + cbgb + cdgb + cgdo) * ag0;
12896  gcsgb = (cdgb - cgso) * ag0;
12897  gcbgb = (cbgb - paramPtr->cgbo) * ag0;
12898 
12899  gcdgmb = gcsgmb = gcbgmb = 0.0;
12900 
12901  qgb = paramPtr->cgbo * vgb;
12902  qgate += qgdo + qgso + qgb;
12903  qbulk -= qgb;
12904  qdrn = -(qgate + qbulk + qsrc);
12905  }
12906  gcddb = (capbd + cgdo - (cgsb + cbsb + cdsb)) * ag0;
12907  gcdsb = -(cgdb + cbdb + cddb) * ag0;
12908 
12909  gcsdb = cdsb * ag0;
12910  gcssb = (cddb + capbs + cgso) * ag0;
12911 
12912  if (!rbodyMod)
12913  {
12914  gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb);
12915  gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb);
12916  gcbdb = (cbsb - capbd) * ag0;
12917  gcbsb = (cbdb - capbs) * ag0;
12918  gcdbdb = 0.0; gcsbsb = 0.0;
12919  }
12920  else
12921  {
12922  gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb) + capbd * ag0;
12923  gcsbb = -(cddb + cdgb + cdsb) * ag0;
12924  gcbdb = cbsb * ag0;
12925  gcbsb = cbdb * ag0;
12926  gcdbdb = -capbd * ag0;
12927  gcsbsb = -capbs * ag0;
12928  }
12929  gcbbb = -(gcbgb + gcbdb + gcbsb + gcbgmb);
12930 
12931  ggtg = ggtd = ggtb = ggts = 0.0;
12932  sxpart = 0.4;
12933  dxpart = 0.6;
12936  }
12937  else
12938  {
12939  qcheq = qchqs;
12941  * paramPtr->leffCV;
12942  T0 = qdef * ScalingFactor / CoxWL;
12943  ggtg = gtg = T0 * gcrgg;
12944  ggts = gts = T0 * gcrgd;
12945  ggtd = gtd = T0 * gcrgs;
12946  ggtb = gtb = T0 * gcrgb;
12947  gqdef = ScalingFactor * ag0;
12948 
12949  gcqgb = cqgb * ag0;
12950  gcqdb = cqsb * ag0;
12951  gcqsb = cqdb * ag0;
12952  gcqbb = cqbb * ag0;
12953 
12954  if (fabs(qcheq) <= 1.0e-5 * CoxWL)
12955  {
12956  if (model_.xpart < 0.5)
12957  {
12958  sxpart = 0.4;
12959  }
12960  else if (model_.xpart > 0.5)
12961  {
12962  sxpart = 0.0;
12963  }
12964  else
12965  {
12966  sxpart = 0.5;
12967  }
12969  }
12970  else
12971  {
12972  sxpart = qdrn / qcheq;
12973  Css = cddb;
12974  Cds = -(cgdb + cddb
12975  + cbdb);
12976  dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq;
12977  Csg = cdgb;
12978  Cdg = -(cggb + cdgb
12979  + cbgb);
12980  dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq;
12981 
12982  Csd = cdsb;
12983  Cdd = -(cgsb + cdsb
12984  + cbsb);
12985  dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq;
12986 
12988  }
12989  dxpart = 1.0 - sxpart;
12994 
12995  if (rgateMod == 3)
12996  {
12997  gcgmgmb = (cgdo + cgso + paramPtr->cgbo) * ag0;
12998  gcgmdb = -cgdo * ag0;
12999  gcgmsb = -cgso * ag0;
13000  gcgmbb = -paramPtr->cgbo * ag0;
13001 
13002  gcdgmb = gcgmdb;
13003  gcsgmb = gcgmsb;
13004  gcbgmb = gcgmbb;
13005 
13006  gcdgb = gcsgb = gcbgb = 0.0;
13007  gcggb = gcgdb = gcgsb = gcgbb = 0.0;
13008 
13009  qgmb = paramPtr->cgbo * vgmb;
13010  qgmid = qgdo + qgso + qgmb;
13011  qgate = 0.0;
13012  qbulk = -qgmb;
13013  qdrn = -qgdo;
13014  qsrc = -qgso;
13015  }
13016  else
13017  {
13018  gcggb = (cgdo + cgso + paramPtr->cgbo ) * ag0;
13019  gcgdb = -cgdo * ag0;
13020  gcgsb = -cgso * ag0;
13021  gcgbb = -paramPtr->cgbo * ag0;
13022 
13023  gcdgb = gcgdb;
13024  gcsgb = gcgsb;
13025  gcbgb = gcgbb;
13026  gcdgmb = gcsgmb = gcbgmb = 0.0;
13027 
13028  qgb = paramPtr->cgbo * vgb;
13029  qgate = qgdo + qgso + qgb;
13030  qbulk = -qgb;
13031  qdrn = -qgdo;
13032  qsrc = -qgso;
13033  }
13034 
13035  gcddb = (capbd + cgdo) * ag0;
13036  gcdsb = gcsdb = 0.0;
13037  gcssb = (capbs + cgso) * ag0;
13038  if (!rbodyMod)
13039  {
13040  gcdbb = -(gcdgb + gcddb + gcdgmb);
13041  gcsbb = -(gcsgb + gcssb + gcsgmb);
13042  gcbdb = -capbd * ag0;
13043  gcbsb = -capbs * ag0;
13044  gcdbdb = 0.0; gcsbsb = 0.0;
13045  }
13046  else
13047  {
13048  gcdbb = gcsbb = gcbdb = gcbsb = 0.0;
13049  gcdbdb = -capbd * ag0;
13050  gcsbsb = -capbs * ag0;
13051  }
13052  gcbbb = -(gcbdb + gcbgb + gcbsb + gcbgmb);
13053  }
13054  }
13055 
13056  return true;
13057 }
13058 
13059 //-----------------------------------------------------------------------------
13060 // Function : Instance::loadDAEFVector
13061 //
13062 // Purpose : Loads the F-vector contributions for a single
13063 // bsim4 instance.
13064 //
13065 // Special Notes : See the special notes for loadDAEFVector.
13066 //
13067 // Scope : public
13068 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
13069 // Creation Date : 11/25/06
13070 //-----------------------------------------------------------------------------
13072 {
13073  bool bsuccess = true;
13074 
13075  double * fVec = extData.daeFVectorRawPtr;
13076  double * dFdxdVp = extData.dFdxdVpVectorRawPtr;
13077 
13078 #ifdef Xyce_DEBUG_DEVICE
13079  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
13080  {
13081  Xyce::dout() << std::endl << subsection_divider << std::endl;
13082  Xyce::dout() << " Begin of Instance::loadDAEFVector. ";
13083  Xyce::dout() << " origFlag = " << origFlag << " name = " << getName() << std::endl;
13084 
13085  Xyce::dout().width(28); Xyce::dout().precision(20); Xyce::dout().setf(std::ios::scientific);
13086  Xyce::dout() << " " << std::endl;
13087  }
13088 #endif
13089 
13090 #if 1
13091  setupFVectorVars ();
13092 #else
13093  double ceqdrn_Jdxp(0.0), ceqbd_Jdxp(0.0), ceqbs_Jdxp(0.0);
13094  double Istoteq_Jdxp(0.0), Idtoteq_Jdxp(0.0);
13095  double Ibtoteq_Jdxp(0.0), Igtoteq_Jdxp(0.0);
13096  double ceqgcrg_Jdxp(0.0), ceqgstot_Jdxp(0.0), ceqgdtot_Jdxp(0.0);
13097  double ceqjs_Jdxp(0.0), ceqjd_Jdxp(0.0);
13098  double T0;
13099 
13100  if (mode >= 0)
13101  {
13102  Gm = gm;
13103  Gmbs = gmbs;
13104  FwdSum = Gm + Gmbs;
13105  RevSum = 0.0;
13106 
13107  ceqdrn = model_.dtype * cdrain;
13109  (-gds * (vds-vds_orig)
13110  -Gm * (vgs-vgs_orig)
13111  -Gmbs * (vbs-vbs_orig));
13112 
13113  ceqbd = model_.dtype * (csub + Igidl);
13114  ceqbd_Jdxp = model_.dtype * (
13115  - (gbds + ggidld) * (vds-vds_orig)
13116  - (gbgs + ggidlg) * (vgs-vgs_orig)
13117  - (gbbs + ggidlb) * (vbs-vbs_orig));
13118 
13119  ceqbs = model_.dtype * Igisl;
13120  ceqbs_Jdxp = model_.dtype * (
13121  + ggisls * (vds-vds_orig)
13122  - ggislg * (vgd-vgd_orig)
13123  - ggislb * (vbd-vbd_orig));
13124 
13125  gbbdp = -(gbds);
13126  gbbsp = gbds + gbgs + gbbs;
13127 
13128  gbdpg = gbgs;
13129  gbdpdp = gbds;
13130  gbdpb = gbbs;
13131  gbdpsp = -(gbdpg + gbdpdp + gbdpb);
13132 
13133  gbspg = 0.0;
13134  gbspdp = 0.0;
13135  gbspb = 0.0;
13136  gbspsp = 0.0;
13137 
13138  if (model_.igcMod)
13139  {
13140  gIstotg = gIgsg + gIgcsg;
13141  gIstotd = gIgcsd;
13142  gIstots = gIgss + gIgcss;
13143  gIstotb = gIgcsb;
13144  Istoteq = model_.dtype * (Igs + Igcs);
13145  Istoteq_Jdxp = model_.dtype * (
13146  - gIstotg * (vgs-vgs_orig)
13147  - gIgcsd * (vds-vds_orig)
13148  - gIgcsb * (vbs-vbs_orig));
13149 
13150  gIdtotg = gIgdg + gIgcdg;
13151  gIdtotd = gIgdd + gIgcdd;
13152  gIdtots = gIgcds;
13153  gIdtotb = gIgcdb;
13154  Idtoteq = model_.dtype * (Igd + Igcd);
13155  Idtoteq_Jdxp = model_.dtype * (
13156  - gIgdg * (vgd-vgd_orig)
13157  - gIgcdg * (vgs-vgs_orig)
13158  - gIgcdd * (vds-vds_orig)
13159  - gIgcdb * (vbs-vbs_orig));
13160  }
13161  else
13162  {
13163  gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0;
13164  gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0;
13165  Istoteq_Jdxp = 0.0;
13166  Idtoteq_Jdxp = 0.0;
13167  }
13168 
13169  if (model_.igbMod)
13170  {
13171  gIbtotg = gIgbg;
13172  gIbtotd = gIgbd;
13173  gIbtots = gIgbs;
13174  gIbtotb = gIgbb;
13175  Ibtoteq = model_.dtype * Igb;
13176  Ibtoteq_Jdxp = model_.dtype * (
13177  - gIgbg * (vgs-vgs_orig)
13178  - gIgbd * (vds-vds_orig)
13179  - gIgbb * (vbs-vbs_orig));
13180  }
13181  else
13182  {
13183  gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0;
13184  Ibtoteq_Jdxp = 0.0;
13185  }
13186 
13187  if ((model_.igcMod != 0) || (model_.igbMod != 0))
13188  {
13190  gIgtotd = gIstotd + gIdtotd + gIbtotd ;
13194  Igtoteq_Jdxp = Istoteq_Jdxp + Idtoteq_Jdxp + Ibtoteq_Jdxp;
13195  }
13196  else
13197  {
13198  gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0;
13199  Igtoteq_Jdxp = 0.0;
13200  }
13201 
13202 
13203  if (rgateMod == 2)
13204  {
13205  T0 = vges - vgs;
13206  }
13207  else if (rgateMod == 3)
13208  {
13209  T0 = vgms - vgs;
13210  }
13211 
13212  if (rgateMod > 1)
13213  {
13214  gcrgd = gcrgd * T0;
13215  gcrgg = gcrgg * T0;
13216  gcrgs = gcrgs * T0;
13217  gcrgb = gcrgb * T0;
13218  ceqgcrg = 0.0;
13219  ceqgcrg_Jdxp = -(
13220  gcrgd * (vds-vds_orig)
13221  + gcrgg * (vgs-vgs_orig)
13222  + gcrgb * (vbs-vbs_orig));
13223  gcrgg -= gcrg;
13224  //gcrg = gcrg;
13225  }
13226  else
13227  {
13228  ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0;
13229  ceqgcrg_Jdxp = 0.0;
13230  }
13231  }
13232  else
13233  {
13234  Gm = -gm;
13235  Gmbs = -gmbs;
13236  FwdSum = 0.0;
13237  RevSum = -(Gm + Gmbs);
13238 
13239  ceqdrn = -model_.dtype * cdrain;
13240  ceqdrn_Jdxp = -model_.dtype * (
13241  + gds * (vds-vds_orig)
13242  + Gm * (vgd-vgd_orig)
13243  + Gmbs * (vbd-vbd_orig));
13244 
13245  ceqbs = model_.dtype * (csub + Igisl);
13246  ceqbs_Jdxp = model_.dtype * (
13247  + (gbds + ggisls) * (vds-vds_orig)
13248  - (gbgs + ggislg) * (vgd-vgd_orig)
13249  - (gbbs + ggislb) * (vbd-vbd_orig));
13250  ceqbd = model_.dtype * Igidl;
13251  ceqbd_Jdxp = model_.dtype * (
13252  - ggidld * (vds-vds_orig)
13253  - ggidlg * (vgs-vgs_orig)
13254  - ggidlb * (vbs-vbs_orig));
13255 
13256  gbbsp = -(gbds);
13257  gbbdp = gbds + gbgs + gbbs;
13258 
13259  gbdpg = 0.0;
13260  gbdpsp = 0.0;
13261  gbdpb = 0.0;
13262  gbdpdp = 0.0;
13263 
13264  gbspg = gbgs;
13265  gbspsp = gbds;
13266  gbspb = gbbs;
13267  gbspdp = -(gbspg + gbspsp + gbspb);
13268 
13269  if (model_.igcMod)
13270  {
13271  gIstotg = gIgsg + gIgcdg;
13272  gIstotd = gIgcds;
13273  gIstots = gIgss + gIgcdd;
13274  gIstotb = gIgcdb;
13275  Istoteq = model_.dtype * (Igs + Igcd);
13276  Istoteq_Jdxp = model_.dtype * (
13277  - gIgsg * (vgs-vgs_orig)
13278  - gIgcdg * (vgd-vgd_orig)
13279  + gIgcdd * (vds-vds_orig)
13280  - gIgcdb * (vbd-vbd_orig));
13281 
13282  gIdtotg = gIgdg + gIgcsg;
13283  gIdtotd = gIgdd + gIgcss;
13284  gIdtots = gIgcsd;
13285  gIdtotb = gIgcsb;
13286  Idtoteq = model_.dtype * (Igd + Igcs);
13287  Idtoteq_Jdxp = model_.dtype * (
13288  - (gIgdg + gIgcsg) * (vgd-vgd_orig)
13289  + gIgcsd * (vds-vds_orig)
13290  - gIgcsb * (vbd-vbd_orig));
13291  }
13292  else
13293  {
13294  gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0;
13295  gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0;
13296  Istoteq_Jdxp = 0.0;
13297  Idtoteq_Jdxp = 0.0;
13298  }
13299 
13300  if (model_.igbMod)
13301  {
13302  gIbtotg = gIgbg;
13303  gIbtotd = gIgbs;
13304  gIbtots = gIgbd;
13305  gIbtotb = gIgbb;
13306  Ibtoteq = model_.dtype * Igb;
13307  Ibtoteq_Jdxp = model_.dtype * (
13308  - gIgbg * (vgd-vgd_orig)
13309  + gIgbd * (vds-vds_orig)
13310  - gIgbb * (vbd-vbd_orig));
13311  }
13312  else
13313  {
13314  gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0;
13315  Ibtoteq_Jdxp = 0.0;
13316  }
13317 
13318  if ((model_.igcMod != 0) || (model_.igbMod != 0))
13319  {
13321  gIgtotd = gIstotd + gIdtotd + gIbtotd ;
13325  Igtoteq_Jdxp = Istoteq_Jdxp + Idtoteq_Jdxp + Ibtoteq_Jdxp;
13326  }
13327  else
13328  {
13329  gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0;
13330  Igtoteq_Jdxp = 0.0;
13331  }
13332 
13333  if (rgateMod == 2)
13334  {
13335  T0 = vges - vgs;
13336  }
13337  else if (rgateMod == 3)
13338  {
13339  T0 = vgms - vgs;
13340  }
13341 
13342  if (rgateMod > 1)
13343  {
13344  double tmp_gcrgd = gcrgd;
13345  gcrgd = gcrgs * T0;
13346  gcrgg = gcrgg * T0;
13347  gcrgs = tmp_gcrgd * T0;
13348  gcrgb = gcrgb * T0;
13349  ceqgcrg = 0.0;
13350  ceqgcrg_Jdxp = -(
13351  gcrgg * (vgd-vgd_orig)
13352  - gcrgs * (vds-vds_orig)
13353  + gcrgb * (vbd-vbd_orig));
13354  gcrgg -= gcrg;
13355  //gcrg = gcrg;
13356  }
13357  else
13358  {
13359  ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0;
13360  }
13361  }
13362 
13363  if (model_.rdsMod == 1)
13364  {
13365  ceqgstot = 0.0;
13366  ceqgstot_Jdxp = model_.dtype * (
13367  gstotd * (vds-vds_orig)
13368  + gstotg * (vgs-vgs_orig)
13369  + gstotb * (vbs-vbs_orig));
13370  gstots = gstots - gstot;
13371 
13372  ceqgdtot = 0.0;
13373  ceqgdtot_Jdxp = -model_.dtype * (
13374  gdtotd * (vds-vds_orig)
13375  + gdtotg * (vgs-vgs_orig)
13376  + gdtotb * (vbs-vbs_orig));
13377  gdtotd = gdtotd - gdtot;
13378  }
13379  else
13380  {
13381  gstot = gstotd = gstotg = gstots = gstotb = ceqgstot = 0.0;
13382  gdtot = gdtotd = gdtotg = gdtots = gdtotb = ceqgdtot = 0.0;
13383  ceqgstot_Jdxp = 0.0;
13384  ceqgdtot_Jdxp = 0.0;
13385  }
13386 
13387  if (model_.dtype > 0)
13388  {
13389  ceqjs = (cbs);
13390  ceqjs_Jdxp = (- gbs * (vbs_jct-vbs_jct_orig));
13391  ceqjd = (cbd);
13392  ceqjd_Jdxp = (- gbd * (vbd_jct-vbd_jct_orig));
13393  }
13394  else
13395  {
13396  ceqjs = -(cbs);
13398  ceqjd = -(cbd);
13399  ceqjd_Jdxp = (gbd * (vbd_jct-vbd_jct_orig));
13400  ceqgcrg = -ceqgcrg;
13401 
13403  }
13404 
13405 #endif
13406 
13407  // Loading F-vector
13409  fVec[li_GatePrime] -= -(-ceqgcrg + Igtoteq)*numberParallel;
13410 
13411  if (rgateMod == 1)
13412  {
13413  fVec[li_GateExt ] -= -(Igate)*numberParallel;
13414  fVec[li_GatePrime] += -(Igate)*numberParallel;
13415  }
13416  else if (rgateMod == 2)
13417  {
13418  fVec[li_GateExt] -= -(Igate + ceqgcrg)*numberParallel;
13419  fVec[li_GatePrime] += -(Igate)*numberParallel;
13420  }
13421  else if (rgateMod == 3)
13422  {
13423  fVec[li_GateExt] -= -(Igate)*numberParallel;
13425  fVec[li_GatePrime] += -(IgateMid)*numberParallel;
13426  }
13427 
13428  if (!rbodyMod)
13429  {
13432  }
13433  else
13434  {
13435  fVec[li_DrainBody] -= -(ceqjd + Idbb + Idbbp)*numberParallel;
13436  fVec[li_BodyPrime] += -(ceqbd + ceqbs + Ibtoteq +
13438  fVec[li_Body] += - (Isbb + Idbb + Ibpb)*numberParallel;
13439  fVec[li_SourceBody] -= -(ceqjs + Isbb + Isbbp)*numberParallel;
13441  }
13442 
13443  if (model_.rdsMod)
13444  {
13445  fVec[li_Drain] += -(-ceqgdtot)*numberParallel;
13446  fVec[li_Source] += -(ceqgstot)*numberParallel;
13448  fVec[li_SourcePrime] += -(-ceqgstot)*numberParallel;
13449  }
13450 
13451  // Idrain, Isource are linear terminal resistor currents
13453  {
13454  fVec[li_Drain] += -(-Idrain)*numberParallel;
13455  fVec[li_DrainPrime] += -(Idrain)*numberParallel;
13456  }
13457 
13459  {
13460  fVec[li_Source] += -(-Isource)*numberParallel;
13461  fVec[li_SourcePrime] += -(+Isource)*numberParallel;
13462  }
13463 
13464  // Initial condition support
13466  {
13467  double coef = extData.nextSolVectorRawPtr[li_Ibs];
13468  fVec[li_Body] += coef;
13469  fVec[li_Source] += -coef;
13470  double cVs = extData.nextSolVectorRawPtr[li_Source];
13471  double cVb = extData.nextSolVectorRawPtr[li_Body];
13472  fVec[li_Ibs] += (cVb-cVs-icVBS);
13473  }
13474 
13476  {
13477  double coef = extData.nextSolVectorRawPtr[li_Ids];
13478  fVec[li_Drain] += coef;
13479  fVec[li_Source] += -coef;
13480  double cVs = extData.nextSolVectorRawPtr[li_Source];
13481  double cVd = extData.nextSolVectorRawPtr[li_Drain];
13482  fVec[li_Ids] += (cVd-cVs-icVDS);
13483  }
13484 
13486  {
13487  double coef = extData.nextSolVectorRawPtr[li_Igs];
13488  fVec[li_GateExt] += coef;
13489  fVec[li_Source] += -coef;
13490  double cVs = extData.nextSolVectorRawPtr[li_Source];
13491  double cVg = extData.nextSolVectorRawPtr[li_GateExt];
13492  fVec[li_Igs] += (cVg-cVs-icVGS);
13493  }
13494 
13495  // limiter section
13497  {
13498  dFdxdVp[li_DrainPrime] += (ceqjd_Jdxp - ceqbd_Jdxp - ceqdrn_Jdxp + Idtoteq_Jdxp)*numberParallel;
13500 
13501  if (rgateMod == 1)
13502  {
13503  dFdxdVp[li_GateExt ] -= (Igate_Jdxp)*numberParallel;
13504  dFdxdVp[li_GatePrime] += (Igate_Jdxp)*numberParallel;
13505  }
13506  else if (rgateMod == 2)
13507  {
13509  dFdxdVp[li_GatePrime] += (Igate_Jdxp)*numberParallel;
13510  }
13511  else if (rgateMod == 3)
13512  {
13513  dFdxdVp[li_GateExt] -= (Igate_Jdxp)*numberParallel;
13516  }
13517 
13518  if (!rbodyMod)
13519  {
13520  dFdxdVp[li_BodyPrime] += (ceqbd_Jdxp + ceqbs_Jdxp - ceqjd_Jdxp - ceqjs_Jdxp + Ibtoteq_Jdxp)*numberParallel;
13521  dFdxdVp[li_SourcePrime] += (ceqdrn_Jdxp - ceqbs_Jdxp + ceqjs_Jdxp + Istoteq_Jdxp)*numberParallel;
13522  }
13523  else
13524  {
13525  dFdxdVp[li_DrainBody] -= (ceqjd_Jdxp)*numberParallel;
13526  dFdxdVp[li_BodyPrime] += (ceqbd_Jdxp + ceqbs_Jdxp + Ibtoteq_Jdxp)*numberParallel;
13527  dFdxdVp[li_SourceBody] -= (ceqjs_Jdxp )*numberParallel;
13528  dFdxdVp[li_SourcePrime] += (ceqdrn_Jdxp - ceqbs_Jdxp + ceqjs_Jdxp + Istoteq_Jdxp)*numberParallel;
13529  }
13530 
13531  if (model_.rdsMod)
13532  {
13533  dFdxdVp[li_Drain] -= (ceqgdtot_Jdxp)*numberParallel;
13534  dFdxdVp[li_Source] += (ceqgstot_Jdxp)*numberParallel;
13537  }
13538  }
13539 
13540  return bsuccess;
13541 }
13542 
13543 //-----------------------------------------------------------------------------
13544 // Function : Instance::
13545 // Purpose :
13546 // Special Notes :
13547 // Scope : public
13548 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
13549 // Creation Date : 12/01/08
13550 //-----------------------------------------------------------------------------
13552 {
13553  ceqdrn_Jdxp=0.0; ceqbd_Jdxp=0.0; ceqbs_Jdxp=0.0;
13554  Istoteq_Jdxp=0.0; Idtoteq_Jdxp=0.0;
13555  Ibtoteq_Jdxp=0.0; Igtoteq_Jdxp=0.0;
13557  ceqjs_Jdxp=0.0; ceqjd_Jdxp=0.0;
13558  T0=0.0;
13559 
13560  if (mode >= 0)
13561  {
13562  Gm = gm;
13563  Gmbs = gmbs;
13564  FwdSum = Gm + Gmbs;
13565  RevSum = 0.0;
13566 
13567  ceqdrn = model_.dtype * cdrain;
13569  (-gds * (vds-vds_orig)
13570  -Gm * (vgs-vgs_orig)
13571  -Gmbs * (vbs-vbs_orig));
13572 
13573  ceqbd = model_.dtype * (csub + Igidl);
13574  ceqbd_Jdxp = model_.dtype * (
13575  - (gbds + ggidld) * (vds-vds_orig)
13576  - (gbgs + ggidlg) * (vgs-vgs_orig)
13577  - (gbbs + ggidlb) * (vbs-vbs_orig));
13578 
13579  ceqbs = model_.dtype * Igisl;
13580  ceqbs_Jdxp = model_.dtype * (
13581  + ggisls * (vds-vds_orig)
13582  - ggislg * (vgd-vgd_orig)
13583  - ggislb * (vbd-vbd_orig));
13584 
13585  gbbdp = -(gbds);
13586  gbbsp = gbds + gbgs + gbbs;
13587 
13588  gbdpg = gbgs;
13589  gbdpdp = gbds;
13590  gbdpb = gbbs;
13591  gbdpsp = -(gbdpg + gbdpdp + gbdpb);
13592 
13593  gbspg = 0.0;
13594  gbspdp = 0.0;
13595  gbspb = 0.0;
13596  gbspsp = 0.0;
13597 
13598  if (model_.igcMod)
13599  {
13600  gIstotg = gIgsg + gIgcsg;
13601  gIstotd = gIgcsd;
13602  gIstots = gIgss + gIgcss;
13603  gIstotb = gIgcsb;
13604  Istoteq = model_.dtype * (Igs + Igcs);
13605  Istoteq_Jdxp = model_.dtype * (
13606  - gIstotg * (vgs-vgs_orig)
13607  - gIgcsd * (vds-vds_orig)
13608  - gIgcsb * (vbs-vbs_orig));
13609 
13610  gIdtotg = gIgdg + gIgcdg;
13611  gIdtotd = gIgdd + gIgcdd;
13612  gIdtots = gIgcds;
13613  gIdtotb = gIgcdb;
13614  Idtoteq = model_.dtype * (Igd + Igcd);
13615  Idtoteq_Jdxp = model_.dtype * (
13616  - gIgdg * (vgd-vgd_orig)
13617  - gIgcdg * (vgs-vgs_orig)
13618  - gIgcdd * (vds-vds_orig)
13619  - gIgcdb * (vbs-vbs_orig));
13620  }
13621  else
13622  {
13623  gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0;
13624  gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0;
13625  Istoteq_Jdxp = 0.0;
13626  Idtoteq_Jdxp = 0.0;
13627  }
13628 
13629  if (model_.igbMod)
13630  {
13631  gIbtotg = gIgbg;
13632  gIbtotd = gIgbd;
13633  gIbtots = gIgbs;
13634  gIbtotb = gIgbb;
13635  Ibtoteq = model_.dtype * Igb;
13636  Ibtoteq_Jdxp = model_.dtype * (
13637  - gIgbg * (vgs-vgs_orig)
13638  - gIgbd * (vds-vds_orig)
13639  - gIgbb * (vbs-vbs_orig));
13640  }
13641  else
13642  {
13643  gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0;
13644  Ibtoteq_Jdxp = 0.0;
13645  }
13646 
13647  if ((model_.igcMod != 0) || (model_.igbMod != 0))
13648  {
13650  gIgtotd = gIstotd + gIdtotd + gIbtotd ;
13655  }
13656  else
13657  {
13658  gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0;
13659  Igtoteq_Jdxp = 0.0;
13660  }
13661 
13662 
13663  if (rgateMod == 2)
13664  {
13665  T0 = vges - vgs;
13666  }
13667  else if (rgateMod == 3)
13668  {
13669  T0 = vgms - vgs;
13670  }
13671 
13672  if (rgateMod > 1)
13673  {
13674  gcrgd = gcrgd * T0;
13675  gcrgg = gcrgg * T0;
13676  gcrgs = gcrgs * T0;
13677  gcrgb = gcrgb * T0;
13678  ceqgcrg = 0.0;
13679  ceqgcrg_Jdxp = -(
13680  gcrgd * (vds-vds_orig)
13681  + gcrgg * (vgs-vgs_orig)
13682  + gcrgb * (vbs-vbs_orig));
13683  gcrgg -= gcrg;
13684  //gcrg = gcrg;
13685  }
13686  else
13687  {
13688  ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0;
13689  ceqgcrg_Jdxp = 0.0;
13690  }
13691  }
13692  else
13693  {
13694  Gm = -gm;
13695  Gmbs = -gmbs;
13696  FwdSum = 0.0;
13697  RevSum = -(Gm + Gmbs);
13698 
13699  ceqdrn = -model_.dtype * cdrain;
13700  ceqdrn_Jdxp = -model_.dtype * (
13701  + gds * (vds-vds_orig)
13702  + Gm * (vgd-vgd_orig)
13703  + Gmbs * (vbd-vbd_orig));
13704 
13705  ceqbs = model_.dtype * (csub + Igisl);
13706  ceqbs_Jdxp = model_.dtype * (
13707  + (gbds + ggisls) * (vds-vds_orig)
13708  - (gbgs + ggislg) * (vgd-vgd_orig)
13709  - (gbbs + ggislb) * (vbd-vbd_orig));
13710  ceqbd = model_.dtype * Igidl;
13711  ceqbd_Jdxp = model_.dtype * (
13712  - ggidld * (vds-vds_orig)
13713  - ggidlg * (vgs-vgs_orig)
13714  - ggidlb * (vbs-vbs_orig));
13715 
13716  gbbsp = -(gbds);
13717  gbbdp = gbds + gbgs + gbbs;
13718 
13719  gbdpg = 0.0;
13720  gbdpsp = 0.0;
13721  gbdpb = 0.0;
13722  gbdpdp = 0.0;
13723 
13724  gbspg = gbgs;
13725  gbspsp = gbds;
13726  gbspb = gbbs;
13727  gbspdp = -(gbspg + gbspsp + gbspb);
13728 
13729  if (model_.igcMod)
13730  {
13731  gIstotg = gIgsg + gIgcdg;
13732  gIstotd = gIgcds;
13733  gIstots = gIgss + gIgcdd;
13734  gIstotb = gIgcdb;
13735  Istoteq = model_.dtype * (Igs + Igcd);
13736  Istoteq_Jdxp = model_.dtype * (
13737  - gIgsg * (vgs-vgs_orig)
13738  - gIgcdg * (vgd-vgd_orig)
13739  + gIgcdd * (vds-vds_orig)
13740  - gIgcdb * (vbd-vbd_orig));
13741 
13742  gIdtotg = gIgdg + gIgcsg;
13743  gIdtotd = gIgdd + gIgcss;
13744  gIdtots = gIgcsd;
13745  gIdtotb = gIgcsb;
13746  Idtoteq = model_.dtype * (Igd + Igcs);
13747  Idtoteq_Jdxp = model_.dtype * (
13748  - (gIgdg + gIgcsg) * (vgd-vgd_orig)
13749  + gIgcsd * (vds-vds_orig)
13750  - gIgcsb * (vbd-vbd_orig));
13751  }
13752  else
13753  {
13754  gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0;
13755  gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0;
13756  Istoteq_Jdxp = 0.0;
13757  Idtoteq_Jdxp = 0.0;
13758  }
13759 
13760  if (model_.igbMod)
13761  {
13762  gIbtotg = gIgbg;
13763  gIbtotd = gIgbs;
13764  gIbtots = gIgbd;
13765  gIbtotb = gIgbb;
13766  Ibtoteq = model_.dtype * Igb;
13767  Ibtoteq_Jdxp = model_.dtype * (
13768  - gIgbg * (vgd-vgd_orig)
13769  + gIgbd * (vds-vds_orig)
13770  - gIgbb * (vbd-vbd_orig));
13771  }
13772  else
13773  {
13774  gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0;
13775  Ibtoteq_Jdxp = 0.0;
13776  }
13777 
13778  if ((model_.igcMod != 0) || (model_.igbMod != 0))
13779  {
13781  gIgtotd = gIstotd + gIdtotd + gIbtotd ;
13786  }
13787  else
13788  {
13789  gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0;
13790  Igtoteq_Jdxp = 0.0;
13791  }
13792 
13793  if (rgateMod == 2)
13794  {
13795  T0 = vges - vgs;
13796  }
13797  else if (rgateMod == 3)
13798  {
13799  T0 = vgms - vgs;
13800  }
13801 
13802  if (rgateMod > 1)
13803  {
13804  double tmp_gcrgd = gcrgd;
13805  gcrgd = gcrgs * T0;
13806  gcrgg = gcrgg * T0;
13807  gcrgs = tmp_gcrgd * T0;
13808  gcrgb = gcrgb * T0;
13809  ceqgcrg = 0.0;
13810  ceqgcrg_Jdxp = -(
13811  gcrgg * (vgd-vgd_orig)
13812  - gcrgs * (vds-vds_orig)
13813  + gcrgb * (vbd-vbd_orig));
13814  gcrgg -= gcrg;
13815  //gcrg = gcrg;
13816  }
13817  else
13818  {
13819  ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0;
13820  }
13821  }
13822 
13823  if (model_.rdsMod == 1)
13824  {
13825  ceqgstot = 0.0;
13826  ceqgstot_Jdxp = model_.dtype * (
13827  gstotd * (vds-vds_orig)
13828  + gstotg * (vgs-vgs_orig)
13829  + gstotb * (vbs-vbs_orig));
13830  gstots = gstots - gstot;
13831 
13832  ceqgdtot = 0.0;
13833  ceqgdtot_Jdxp = -model_.dtype * (
13834  gdtotd * (vds-vds_orig)
13835  + gdtotg * (vgs-vgs_orig)
13836  + gdtotb * (vbs-vbs_orig));
13837  gdtotd = gdtotd - gdtot;
13838  }
13839  else
13840  {
13841  gstot = gstotd = gstotg = gstots = gstotb = ceqgstot = 0.0;
13842  gdtot = gdtotd = gdtotg = gdtots = gdtotb = ceqgdtot = 0.0;
13843  ceqgstot_Jdxp = 0.0;
13844  ceqgdtot_Jdxp = 0.0;
13845  }
13846 
13847  if (model_.dtype > 0)
13848  {
13849  ceqjs = (cbs);
13850  ceqjs_Jdxp = (- gbs * (vbs_jct-vbs_jct_orig));
13851  ceqjd = (cbd);
13852  ceqjd_Jdxp = (- gbd * (vbd_jct-vbd_jct_orig));
13853  }
13854  else
13855  {
13856  ceqjs = -(cbs);
13858  ceqjd = -(cbd);
13860  ceqgcrg = -ceqgcrg;
13861 
13863  }
13864 }
13865 
13866 //-----------------------------------------------------------------------------
13867 // Function : Instance::loadDAEdQdx
13868 //
13869 // Purpose : Loads the Q-vector contributions for a single
13870 // bsim4 instance.
13871 //
13872 // Special Notes : The "Q" vector is part of a standard DAE formalism in
13873 // which the system of equations is represented as:
13874 //
13875 // f(x) = dQ(x)/dt + F(x) - B(t) = 0
13876 //
13877 // Scope : public
13878 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
13879 // Creation Date : 11/25/06
13880 //-----------------------------------------------------------------------------
13882 {
13883  bool bsuccess = true;
13884 
13885  if (!(getSolverState().dcopFlag) && getSolverState().initTranFlag && getSolverState().newtonIter==0)
13886  {
13887  // do nothing, as for this special case q is always zero.
13888  }
13889  else
13890  {
13891  N_LAS_Matrix & dQdx = *(extData.dQdxMatrixPtr);
13892 
13893 #ifdef Xyce_DEBUG_DEVICE
13895  {
13896  Xyce::dout() << std::endl << subsection_divider << std::endl;
13897  Xyce::dout() << " name = " << getName() << std::endl;
13898  }
13899 #endif
13900 
13901  if (rgateMod == 1)
13902  {
13907  } // WDLiu: CAPcrg already subtracted from all CAPcrgg below
13908  else if (rgateMod == 2)
13909  {
13914  }
13915  else if (rgateMod == 3)
13916  {
13917  dQdx[li_GateMid][GMgm] += (+ CAPcgmgmb)*numberParallel;
13918 
13919  dQdx[li_GateMid][GMdp] += (CAPcgmdb)*numberParallel;
13920  dQdx[li_GateMid][GMsp] += (CAPcgmsb)*numberParallel;
13921  dQdx[li_GateMid][GMbp] += (CAPcgmbb)*numberParallel;
13922 
13926 
13931  }
13932  else
13933  {
13938  }
13939 
13941 
13942  dQdx[li_DrainPrime][DPgp] += (+ CAPcdgb)*numberParallel;
13943 
13944  dQdx[li_DrainPrime][DPsp] -= (- CAPcdsb)*numberParallel;
13945 
13946  dQdx[li_DrainPrime][DPbp] -= (- CAPcdbb)*numberParallel;
13947 
13948 
13949  dQdx[li_SourcePrime][SPdp] -= (- CAPcsdb)*numberParallel;
13950 
13952 
13954 
13955  dQdx[li_SourcePrime][SPbp] -= (- CAPcsbb)*numberParallel;
13956 
13961 
13962  if (rbodyMod)
13963  {
13966 
13968  dQdx[li_DrainBody][DBdb] += (- CAPcdbdb)*numberParallel;
13969 
13971  dQdx[li_SourceBody][SBsb] += (- CAPcsbsb)*numberParallel;
13972  }
13973 
13974  if (trnqsMod)
13975  {
13976  dQdx[li_Charge][Qgp] += (- CAPcqgb)*numberParallel;
13977  dQdx[li_Charge][Qdp] += (- CAPcqdb)*numberParallel;
13978  dQdx[li_Charge][Qsp] += (- CAPcqsb)*numberParallel;
13979  dQdx[li_Charge][Qbp] += (- CAPcqbb)*numberParallel;
13980  }
13981  }
13982 
13983  return bsuccess;
13984 }
13985 
13986 //-----------------------------------------------------------------------------
13987 // Function : Instance::loadDAEdFdx ()
13988 //
13989 // Purpose : Loads the F-vector contributions for a single
13990 // bsim4 instance.
13991 //
13992 // Special Notes :
13993 //
13994 // Scope : public
13995 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
13996 // Creation Date : 11/25/06
13997 //-----------------------------------------------------------------------------
13999 {
14000  bool bsuccess = true;
14001  N_LAS_Matrix & dFdx = *(extData.dFdxMatrixPtr);
14002 
14003 #ifdef Xyce_DEBUG_DEVICE
14005  {
14006  Xyce::dout() << std::endl << subsection_divider << std::endl;
14007  Xyce::dout() << "Instance::loadDAEdFdx";
14008  Xyce::dout() << " name = " << getName() << std::endl;
14009  }
14010 #endif
14011 
14012  if (!rbodyMod)
14013  {
14014  gjbd = gbd;
14015  gjbs = gbs;
14016  }
14017  else
14018  {
14019  gjbd = gjbs = 0.0;
14020  }
14021 
14022  if (!model_.rdsMod)
14023  {
14026  }
14027  else
14028  {
14029  gdpr = gspr = 0.0;
14030  }
14031 
14032  geltd = grgeltd;
14033 
14034  double T1 = qdef * gtau;
14035 
14036  if (rgateMod == 1)
14037  {
14038  dFdx[li_GateExt][GEge] += (geltd)*numberParallel;
14039  dFdx[li_GateExt][GEgp] -= (geltd)*numberParallel;
14040  dFdx[li_GatePrime][GPge] -= (geltd)*numberParallel;
14041  dFdx[li_GatePrime][GPgp] += (+ geltd - ggtg + gIgtotg)*numberParallel;
14042  dFdx[li_GatePrime][GPdp] += (- ggtd + gIgtotd)*numberParallel;
14043  dFdx[li_GatePrime][GPsp] += (- ggts + gIgtots)*numberParallel;
14044  dFdx[li_GatePrime][GPbp] += (- ggtb + gIgtotb)*numberParallel;
14045  } // WDLiu: gcrg already subtracted from all gcrgg below
14046  else if (rgateMod == 2)
14047  {
14048  dFdx[li_GateExt][GEge] += (gcrg)*numberParallel;
14049  dFdx[li_GateExt][GEgp] += (gcrgg)*numberParallel;
14050  dFdx[li_GateExt][GEdp] += (gcrgd)*numberParallel;
14051  dFdx[li_GateExt][GEsp] += (gcrgs)*numberParallel;
14052  dFdx[li_GateExt][GEbp] += (gcrgb)*numberParallel;
14053 
14054  dFdx[li_GatePrime][GPge] -= (gcrg)*numberParallel;
14055  dFdx[li_GatePrime][GPgp] += (- gcrgg - ggtg + gIgtotg)*numberParallel;
14056  dFdx[li_GatePrime][GPdp] += (- gcrgd - ggtd + gIgtotd)*numberParallel;
14057  dFdx[li_GatePrime][GPsp] += (- gcrgs - ggts + gIgtots)*numberParallel;
14058  dFdx[li_GatePrime][GPbp] += (- gcrgb - ggtb + gIgtotb)*numberParallel;
14059  }
14060  else if (rgateMod == 3)
14061  {
14062  dFdx[li_GateExt][GEge] += (geltd)*numberParallel;
14063  dFdx[li_GateExt][GEgm] -= (geltd)*numberParallel;
14064  dFdx[li_GateMid][GMge] -= (geltd)*numberParallel;
14065  dFdx[li_GateMid][GMgm] += (geltd + gcrg)*numberParallel;
14066 
14067  dFdx[li_GateMid][GMdp] += (gcrgd)*numberParallel;
14068  dFdx[li_GateMid][GMgp] += (gcrgg)*numberParallel;
14069  dFdx[li_GateMid][GMsp] += (gcrgs)*numberParallel;
14070  dFdx[li_GateMid][GMbp] += (gcrgb)*numberParallel;
14071 
14072  dFdx[li_GatePrime][GPgm] -= (gcrg)*numberParallel;
14073 
14074  dFdx[li_GatePrime][GPgp] += (- gcrgg - ggtg + gIgtotg)*numberParallel;
14075  dFdx[li_GatePrime][GPdp] += (- gcrgd - ggtd + gIgtotd)*numberParallel;
14076  dFdx[li_GatePrime][GPsp] += (- gcrgs - ggts + gIgtots)*numberParallel;
14077  dFdx[li_GatePrime][GPbp] += (- gcrgb - ggtb + gIgtotb)*numberParallel;
14078  }
14079  else
14080  {
14081  dFdx[li_GatePrime][GPgp] += (- ggtg + gIgtotg)*numberParallel;
14082  dFdx[li_GatePrime][GPdp] += (- ggtd + gIgtotd)*numberParallel;
14083  dFdx[li_GatePrime][GPsp] += (- ggts + gIgtots)*numberParallel;
14084  dFdx[li_GatePrime][GPbp] += (- ggtb + gIgtotb)*numberParallel;
14085  }
14086 
14087  if (model_.rdsMod)
14088  {
14089  dFdx[li_Drain][Dgp] += (gdtotg)*numberParallel;
14090  dFdx[li_Drain][Dsp] += (gdtots)*numberParallel;
14091  dFdx[li_Drain][Dbp] += (gdtotb)*numberParallel;
14092  dFdx[li_Source][Sdp] += (gstotd)*numberParallel;
14093  dFdx[li_Source][Sgp] += (gstotg)*numberParallel;
14094  dFdx[li_Source][Sbp] += (gstotb)*numberParallel;
14095  }
14096 
14097  dFdx[li_DrainPrime][DPdp] += (gdpr + gds + gbd + T1 * ddxpart_dVd
14099 
14100  dFdx[li_DrainPrime][DPd] -= (gdpr + gdtot)*numberParallel;
14101  dFdx[li_DrainPrime][DPgp] += (Gm - gdtotg + gbdpg - gIdtotg
14102  + dxpart * ggtg + T1 * ddxpart_dVg)*numberParallel;
14103 
14104  dFdx[li_DrainPrime][DPsp] -= (gds + gdtots - dxpart * ggts + gIdtots
14106 
14107  dFdx[li_DrainPrime][DPbp] -= (gjbd + gdtotb - Gmbs - gbdpb + gIdtotb
14108  - T1 * ddxpart_dVb - dxpart * ggtb)*numberParallel;
14109 
14110  dFdx[li_Drain][Ddp] -= (gdpr - gdtotd)*numberParallel;
14111  dFdx[li_Drain][Dd] += (gdpr + gdtot)*numberParallel;
14112 
14113  dFdx[li_SourcePrime][SPdp] -= (gds + gstotd + RevSum - gbspdp
14115 
14116  dFdx[li_SourcePrime][SPgp] += (- Gm - gstotg + gbspg + sxpart * ggtg
14118 
14119  dFdx[li_SourcePrime][SPsp] += (gspr + gds + gbs + T1 * dsxpart_dVs
14121 
14122  dFdx[li_SourcePrime][SPs] -= (gspr + gstot)*numberParallel;
14123 
14124  dFdx[li_SourcePrime][SPbp] -= (gjbs + gstotb + Gmbs - gbspb - sxpart * ggtb
14126 
14127  dFdx[li_Source][Ssp] -= (gspr - gstots)*numberParallel;
14128  dFdx[li_Source][Ss] += (gspr + gstot)*numberParallel;
14129 
14130  dFdx[li_BodyPrime][BPdp] += (- gjbd + gbbdp - gIbtotd)*numberParallel;
14131  dFdx[li_BodyPrime][BPgp] += (- gbgs - gIbtotg)*numberParallel;
14132  dFdx[li_BodyPrime][BPsp] += (- gjbs + gbbsp - gIbtots)*numberParallel;
14133  dFdx[li_BodyPrime][BPbp] += (gjbd + gjbs - gbbs - gIbtotb)*numberParallel;
14134 
14135  //ggidld = (ggidld)*numberParallel;
14136  //ggidlg = (ggidlg)*numberParallel;
14137  //ggidlb = (ggidlb)*numberParallel;
14138  //ggislg = (ggislg)*numberParallel;
14139  //ggisls = (ggisls)*numberParallel;
14140  //ggislb = (ggislb)*numberParallel;
14141 
14142  // stamp gidl
14147  dFdx[li_BodyPrime][BPdp] -= (ggidld)*numberParallel;
14148  dFdx[li_BodyPrime][BPgp] -= (ggidlg)*numberParallel;
14149  dFdx[li_BodyPrime][BPsp] += ((ggidlg + ggidld + ggidlb))*numberParallel;
14150  dFdx[li_BodyPrime][BPbp] -= (ggidlb)*numberParallel;
14151  // stamp gisl
14156  dFdx[li_BodyPrime][BPdp] += ((ggislg + ggisls + ggislb))*numberParallel;
14157  dFdx[li_BodyPrime][BPgp] -= (ggislg)*numberParallel;
14158  dFdx[li_BodyPrime][BPsp] -= (ggisls)*numberParallel;
14159  dFdx[li_BodyPrime][BPbp] -= (ggislb)*numberParallel;
14160 
14161 
14162  if (rbodyMod)
14163  {
14164  dFdx[li_DrainPrime][DPdb] += (- gbd)*numberParallel;
14165  dFdx[li_SourcePrime][SPsb] -= (gbs)*numberParallel;
14166 
14167  dFdx[li_DrainBody][DBdp] += (- gbd)*numberParallel;
14168  dFdx[li_DrainBody][DBdb] += (gbd + grbpd + grbdb)*numberParallel;
14169  dFdx[li_DrainBody][DBbp] -= (grbpd)*numberParallel;
14170  dFdx[li_DrainBody][DBb] -= (grbdb)*numberParallel;
14171 
14172  dFdx[li_BodyPrime][BPdb] -= (grbpd)*numberParallel;
14173  dFdx[li_BodyPrime][BPb] -= (grbpb)*numberParallel;
14174  dFdx[li_BodyPrime][BPsb] -= (grbps)*numberParallel;
14175  dFdx[li_BodyPrime][BPbp] += (grbpd + grbps + grbpb)*numberParallel;
14176  // WDLiu: (gcbbb - gbbs) already added to BPbpPtr
14177 
14178  dFdx[li_SourceBody][SBsp] += (- gbs)*numberParallel;
14179  dFdx[li_SourceBody][SBbp] -= (grbps)*numberParallel;
14180  dFdx[li_SourceBody][SBb] -= (grbsb)*numberParallel;
14181  dFdx[li_SourceBody][SBsb] += (gbs + grbps + grbsb)*numberParallel;
14182 
14183  dFdx[li_Body][Bdb] -= (grbdb)*numberParallel;
14184  dFdx[li_Body][Bbp] -= (grbpb)*numberParallel;
14185  dFdx[li_Body][Bsb] -= (grbsb)*numberParallel;
14186  dFdx[li_Body][Bb] += (grbsb + grbdb + grbpb)*numberParallel;
14187  }
14188 
14189  if (trnqsMod)
14190  {
14191  dFdx[li_Charge][Qq] += (gqdef + gtau)*numberParallel;
14192  dFdx[li_Charge][Qgp] += (ggtg)*numberParallel;
14193  dFdx[li_Charge][Qdp] += (ggtd)*numberParallel;
14194  dFdx[li_Charge][Qsp] += (ggts)*numberParallel;
14195  dFdx[li_Charge][Qbp] += (ggtb)*numberParallel;
14196 
14197  dFdx[li_DrainPrime][DPq] += (dxpart * gtau)*numberParallel;
14199  dFdx[li_GatePrime][GPq] -= (gtau)*numberParallel;
14200  }
14201 
14202 
14203  // Initial Conditions:
14204  if (icVBSGiven)
14205  {
14206  if (getSolverState().dcopFlag)
14207  {
14208  dFdx[li_Body][Bibs] += 1.0;
14209  dFdx[li_Source][Sibs] += -1.0;
14210  dFdx[li_Ibs][IBSb] += 1.0;
14211  dFdx[li_Ibs][IBSs] += -1.0;
14212  }
14213  else
14214  {
14215  dFdx[li_Ibs][IBSibs] = 1.0;
14216  }
14217  }
14218 
14219  if (icVDSGiven)
14220  {
14221  if (getSolverState().dcopFlag)
14222  {
14223  dFdx[li_Drain][Dids] += 1.0;
14224  dFdx[li_Source][Sids] += -1.0;
14225  dFdx[li_Ids][IDSd] += 1.0;
14226  dFdx[li_Ids][IDSs] += -1.0;
14227  }
14228  else
14229  {
14230  dFdx[li_Ids][IDSids] = 1.0;
14231  }
14232  }
14233 
14234  if (icVGSGiven)
14235  {
14236  if (getSolverState().dcopFlag)
14237  {dFdx[li_GateExt][GEigs] += 1.0;
14238  dFdx[li_Source][Sigs] += -1.0;
14239  dFdx[li_Igs][IGSg] += 1.0;
14240  dFdx[li_Igs][IGSs] += -1.0;
14241  }
14242  else
14243  {
14244  dFdx[li_Igs][IGSigs] = 1.0;
14245  }
14246  }
14247 
14248  return bsuccess;
14249 }
14250 
14251 //-----------------------------------------------------------------------------
14252 // Function : Instance::setIC
14253 // Purpose :
14254 // Special Notes :
14255 // Scope : public
14256 // Creator : Eric R. Keiter, SNL, Electrical and Microsystems Modeling
14257 // Creation Date : 11/25/06
14258 //-----------------------------------------------------------------------------
14260 {
14261  bool bsuccess = true;
14262 
14263 
14264  return bsuccess;
14265 }
14266 
14267 //-----------------------------------------------------------------------------
14268 // Function : Instance:polyDepletion
14269 // Purpose : Function to compute poly depletion effect .
14270 //
14271 // Special Notes : Vgs_arg is named to distinguish it from the instance
14272 // variable, Vgs.
14273 //
14274 // Scope : public
14275 // Creator : Eric Keiter,SNL
14276 // Creation Date : 11/25/06
14277 //-----------------------------------------------------------------------------
14278 int Instance::polyDepletion( double phi, double ngate,
14279  double epsgate,
14280  double coxe, double Vgs_arg,
14281  double & Vgs_eff,
14282  double & dVgs_eff_dVg)
14283 {
14284  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);
14285 
14286  // CONSTQ = 1.6021918e-19
14287  // CONSTEPSSI = 1.03594e-10
14288  // Poly Gate Si Depletion Effect
14289  if ((ngate > 1.0e18) && (ngate < 1.0e25) && (Vgs_arg > phi) && (epsgate!=0))
14290  {
14291  T1 = 1.0e6 * CONSTQ * epsgate * ngate / (coxe * coxe);
14292  T8 = Vgs_arg - phi;
14293  T4 = sqrt(1.0 + 2.0 * T8 / T1);
14294  T2 = 2.0 * T8 / (T4 + 1.0);
14295  T3 = 0.5 * T2 * T2 / T1; // T3 = Vpoly
14296  T7 = 1.12 - T3 - 0.05;
14297  T6 = sqrt(T7 * T7 + 0.224);
14298  T5 = 1.12 - 0.5 * (T7 + T6);
14299  Vgs_eff = Vgs_arg - T5;
14300  dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6);
14301  }
14302  else
14303  {
14304  Vgs_eff = Vgs_arg;
14305  dVgs_eff_dVg = 1.0;
14306  }
14307  return(0);
14308 }
14309 
14310 //-----------------------------------------------------------------------------
14311 // Function : Instance:DioIjthVjmEval
14312 // Purpose :
14313 // Special Notes :
14314 // Scope : public
14315 // Creator : Eric Keiter,SNL
14316 // Creation Date : 11/25/06
14317 //-----------------------------------------------------------------------------
14319  (double Nvtm, double Ijth, double Isb, double XExpBV, double & Vjm)
14320 {
14321  double Tb(0.0), Tc(0.0), EVjmovNv(0.0);
14322 
14323  Tc = XExpBV;
14324  Tb = 1.0 + Ijth / Isb - Tc;
14325  EVjmovNv = 0.5 * (Tb + sqrt(Tb * Tb + 4.0 * Tc));
14326  Vjm = Nvtm * log(EVjmovNv);
14327 
14328  return 0;
14329 }
14330 
14331 //
14332 // WDLiu:
14333 // This subroutine is a special module to process the geometry dependent
14334 // parasitics for BSIM4, which calculates Ps, Pd, As, Ad, and Rs and Rd
14335 // for multi-fingers and varous GEO and RGEO options.
14336 //
14337 //-----------------------------------------------------------------------------
14338 // Function : Instance::NumFingerDiff
14339 // Purpose :
14340 //
14341 // Special Notes : nf_arg is named to distinguish it from the
14342 // instance variable nf.
14343 //
14344 // Scope : public
14345 // Creator : Eric Keiter,SNL
14346 // Creation Date : 11/25/06
14347 //-----------------------------------------------------------------------------
14349  (double nf_arg, int minSD,
14350  double & nuIntD, double & nuEndD, double & nuIntS, double & nuEndS)
14351 {
14352  int NF = static_cast<int>(nf_arg);
14353 
14354  if ((NF%2) != 0)
14355  {
14356  nuEndD = nuEndS = 1.0;
14357  nuIntD = nuIntS = 2.0 * Xycemax((nf_arg - 1.0) / 2.0, 0.0);
14358  }
14359  else
14360  {
14361  if (minSD == 1) // minimize # of source
14362  {
14363  nuEndD = 2.0;
14364  nuIntD = 2.0 * Xycemax((nf_arg / 2.0 - 1.0), 0.0);
14365  nuEndS = 0.0;
14366  nuIntS = nf_arg;
14367  }
14368  else
14369  {
14370  nuEndD = 0.0;
14371  nuIntD = nf_arg;
14372  nuEndS = 2.0;
14373  nuIntS = 2.0 * Xycemax((nf_arg / 2.0 - 1.0), 0.0);
14374  }
14375  }
14376  return 0;
14377 }
14378 
14379 //-----------------------------------------------------------------------------
14380 // Function : Instance::PAeffGeo
14381 // Purpose :
14382 //
14383 // Special Notes : nf_arg is named to distinguish it from the
14384 // instance variable nf.
14385 //
14386 // Scope : public
14387 // Creator : Eric Keiter,SNL
14388 // Creation Date : 11/25/06
14389 //-----------------------------------------------------------------------------
14391  (double nf_arg, int geo, int minSD,
14392  double Weffcj, double DMCG, double DMCI, double DMDG,
14393  double & Ps, double & Pd, double & As, double & Ad)
14394 {
14395  double T0(0.0), T1(0.0), T2(0.0);
14396  double ADiso(0.0), ADsha(0.0), ADmer(0.0), ASiso(0.0), ASsha(0.0), ASmer(0.0);
14397  double PDiso(0.0), PDsha(0.0), PDmer(0.0), PSiso(0.0), PSsha(0.0), PSmer(0.0);
14398  double nuIntD (0.0), nuEndD (0.0), nuIntS (0.0), nuEndS (0.0);
14399 
14400  if (geo < 9) // For geo = 9 and 10, the numbers of S/D diffusions already known
14401  NumFingerDiff(nf_arg, minSD, nuIntD, nuEndD, nuIntS, nuEndS);
14402 
14403  T0 = DMCG + DMCI;
14404  T1 = DMCG + DMCG;
14405  T2 = DMDG + DMDG;
14406 
14407  PSiso = PDiso = T0 + T0 + Weffcj;
14408  PSsha = PDsha = T1;
14409  PSmer = PDmer = T2;
14410 
14411  ASiso = ADiso = T0 * Weffcj;
14412  ASsha = ADsha = DMCG * Weffcj;
14413  ASmer = ADmer = DMDG * Weffcj;
14414 
14415  switch(geo)
14416  {
14417  case 0:
14418  Ps = nuEndS * PSiso + nuIntS * PSsha;
14419  Pd = nuEndD * PDiso + nuIntD * PDsha;
14420  As = nuEndS * ASiso + nuIntS * ASsha;
14421  Ad = nuEndD * ADiso + nuIntD * ADsha;
14422  break;
14423  case 1:
14424  Ps = nuEndS * PSiso + nuIntS * PSsha;
14425  Pd = (nuEndD + nuIntD) * PDsha;
14426  As = nuEndS * ASiso + nuIntS * ASsha;
14427  Ad = (nuEndD + nuIntD) * ADsha;
14428  break;
14429  case 2:
14430  Ps = (nuEndS + nuIntS) * PSsha;
14431  Pd = nuEndD * PDiso + nuIntD * PDsha;
14432  As = (nuEndS + nuIntS) * ASsha;
14433  Ad = nuEndD * ADiso + nuIntD * ADsha;
14434  break;
14435  case 3:
14436  Ps = (nuEndS + nuIntS) * PSsha;
14437  Pd = (nuEndD + nuIntD) * PDsha;
14438  As = (nuEndS + nuIntS) * ASsha;
14439  Ad = (nuEndD + nuIntD) * ADsha;
14440  break;
14441  case 4:
14442  Ps = nuEndS * PSiso + nuIntS * PSsha;
14443  Pd = nuEndD * PDmer + nuIntD * PDsha;
14444  As = nuEndS * ASiso + nuIntS * ASsha;
14445  Ad = nuEndD * ADmer + nuIntD * ADsha;
14446  break;
14447  case 5:
14448  Ps = (nuEndS + nuIntS) * PSsha;
14449  Pd = nuEndD * PDmer + nuIntD * PDsha;
14450  As = (nuEndS + nuIntS) * ASsha;
14451  Ad = nuEndD * ADmer + nuIntD * ADsha;
14452  break;
14453  case 6:
14454  Ps = nuEndS * PSmer + nuIntS * PSsha;
14455  Pd = nuEndD * PDiso + nuIntD * PDsha;
14456  As = nuEndS * ASmer + nuIntS * ASsha;
14457  Ad = nuEndD * ADiso + nuIntD * ADsha;
14458  break;
14459  case 7:
14460  Ps = nuEndS * PSmer + nuIntS * PSsha;
14461  Pd = (nuEndD + nuIntD) * PDsha;
14462  As = nuEndS * ASmer + nuIntS * ASsha;
14463  Ad = (nuEndD + nuIntD) * ADsha;
14464  break;
14465  case 8:
14466  Ps = nuEndS * PSmer + nuIntS * PSsha;
14467  Pd = nuEndD * PDmer + nuIntD * PDsha;
14468  As = nuEndS * ASmer + nuIntS * ASsha;
14469  Ad = nuEndD * ADmer + nuIntD * ADsha;
14470  break;
14471  case 9: // geo = 9 and 10 happen only when nf_arg = even
14472  Ps = PSiso + (nf_arg - 1.0) * PSsha;
14473  Pd = nf_arg * PDsha;
14474  As = ASiso + (nf_arg - 1.0) * ASsha;
14475  Ad = nf_arg * ADsha;
14476  break;
14477  case 10:
14478  Ps = nf_arg * PSsha;
14479  Pd = PDiso + (nf_arg - 1.0) * PDsha;
14480  As = nf_arg * ASsha;
14481  Ad = ADiso + (nf_arg - 1.0) * ADsha;
14482  break;
14483  default:
14484  UserWarning(*this) << "Specified GEO not matched\n";
14485  }
14486 
14487  return 0;
14488 }
14489 
14490 
14491 //-----------------------------------------------------------------------------
14492 // Function : Instance::RdseffGeo
14493 // Purpose :
14494 // Special Notes :
14495 // Scope : public
14496 // Creator : Eric Keiter,SNL
14497 // Creation Date : 11/25/06
14498 //-----------------------------------------------------------------------------
14500  (double nf_arg,
14501  int geo, int rgeo, int minSD,
14502  double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG,
14503  int Type, double & Rtot)
14504 {
14505  std::string msg="";
14506  double Rint(0.0), Rend (0.0);
14507  double nuIntD (0.0), nuEndD (0.0), nuIntS (0.0), nuEndS (0.0);
14508 
14509  if (geo < 9) // since geo = 9 and 10 only happen when nf_arg = even
14510  {
14511  NumFingerDiff(nf_arg, minSD, nuIntD, nuEndD, nuIntS, nuEndS);
14512 
14513  // Internal S/D resistance -- assume shared S or D and all wide contacts
14514  if (Type == 1)
14515  {
14516  if (nuIntS == 0.0)
14517  Rint = 0.0;
14518  else
14519  Rint = Rsh * DMCG / ( Weffcj * nuIntS);
14520  }
14521  else
14522  {
14523  if (nuIntD == 0.0)
14524  Rint = 0.0;
14525  else
14526  Rint = Rsh * DMCG / ( Weffcj * nuIntD);
14527  }
14528  }
14529 
14530  // End S/D resistance -- geo dependent
14531  switch(geo)
14532  { case 0:
14533  if (Type == 1) RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, rgeo, 1, Rend);
14534  else RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, rgeo, 0, Rend);
14535  break;
14536  case 1:
14537  if (Type == 1) RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, rgeo, 1, Rend);
14538  else RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndD), rgeo, 0, Rend);
14539  break;
14540  case 2:
14541  if (Type == 1) RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndS), rgeo, 1, Rend);
14542  else RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, rgeo, 0, Rend);
14543  break;
14544  case 3:
14545  if (Type == 1) RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndS), rgeo, 1, Rend);
14546  else RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndD), rgeo, 0, Rend);
14547  break;
14548  case 4:
14549  if (Type == 1) RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, rgeo, 1, Rend);
14550  else Rend = Rsh * DMDG / Weffcj;
14551  break;
14552  case 5:
14553  if (Type == 1) RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndS), rgeo, 1, Rend);
14554  else Rend = Rsh * DMDG / (Weffcj * nuEndD);
14555  break;
14556  case 6:
14557  if (Type == 1) Rend = Rsh * DMDG / Weffcj;
14558  else RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndD, rgeo, 0, Rend);
14559  break;
14560  case 7:
14561  if (Type == 1) Rend = Rsh * DMDG / (Weffcj * nuEndS);
14562  else RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, static_cast<int>(nuEndD), rgeo, 0, Rend);
14563  break;
14564  case 8:
14565  Rend = Rsh * DMDG / Weffcj;
14566  break;
14567  case 9: // all wide contacts assumed for geo = 9 and 10
14568  if (Type == 1)
14569  {
14570  Rend = 0.5 * Rsh * DMCG / Weffcj;
14571  if (nf_arg == 2.0)
14572  Rint = 0.0;
14573  else
14574  Rint = Rsh * DMCG / (Weffcj * (nf_arg - 2.0));
14575  }
14576  else
14577  {
14578  Rend = 0.0;
14579  Rint = Rsh * DMCG / (Weffcj * nf_arg);
14580  }
14581  break;
14582  case 10:
14583  if (Type == 1)
14584  {
14585  Rend = 0.0;
14586  Rint = Rsh * DMCG / (Weffcj * nf_arg);
14587  }
14588  else
14589  {
14590  Rend = 0.5 * Rsh * DMCG / Weffcj;;
14591  if (nf_arg == 2.0)
14592  Rint = 0.0;
14593  else
14594  Rint = Rsh * DMCG / (Weffcj * (nf_arg - 2.0));
14595  }
14596  break;
14597  default:
14598  UserWarning(*this) << "Specified GEO not matched\n";
14599  }
14600 
14601  if (Rint <= 0.0)
14602  Rtot = Rend;
14603  else if (Rend <= 0.0)
14604  Rtot = Rint;
14605  else
14606  Rtot = Rint * Rend / (Rint + Rend);
14607 
14608  if(Rtot==0.0)
14609  {
14610  UserWarning(*this) << "Zero resistance returned from RdseffGeo\n";
14611  }
14612 
14613  return 0;
14614 }
14615 
14616 
14617 //-----------------------------------------------------------------------------
14618 // Function : Instance::RdsEndIso
14619 // Purpose :
14620 // Special Notes :
14621 // Scope : public
14622 // Creator : Eric Keiter,SNL
14623 // Creation Date : 11/25/06
14624 //-----------------------------------------------------------------------------
14626  (double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG,
14627  double nuEnd, int rgeo, int Type, double & Rend)
14628 {
14629  std::string msg="";
14630  if (Type == 1)
14631  {
14632  switch(rgeo)
14633  {
14634  case 1:
14635  case 2:
14636  case 5:
14637  if (nuEnd == 0.0)
14638  Rend = 0.0;
14639  else
14640  Rend = Rsh * DMCG / (Weffcj * nuEnd);
14641  break;
14642  case 3:
14643  case 4:
14644  case 6:
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  else
14657  {
14658  switch(rgeo)
14659  {
14660  case 1:
14661  case 3:
14662  case 7:
14663  if (nuEnd == 0.0)
14664  Rend = 0.0;
14665  else
14666  Rend = Rsh * DMCG / (Weffcj * nuEnd);
14667  break;
14668  case 2:
14669  case 4:
14670  case 8:
14671  if ((DMCG + DMCI) == 0.0)
14672  msg = "(DMCG + DMCI) can not be equal to zero\n";
14673  if (nuEnd == 0.0)
14674  Rend = 0.0;
14675  else
14676  Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI));
14677  break;
14678  default:
14679  UserWarning(*this) << "Specified RGEO not matched\n";
14680  }
14681  }
14682  return 0;
14683 }
14684 
14685 
14686 //-----------------------------------------------------------------------------
14687 // Function : Instance::RdsEndSha
14688 // Purpose :
14689 // Special Notes :
14690 // Scope : public
14691 // Creator : Eric Keiter,SNL
14692 // Creation Date : 11/25/06
14693 //-----------------------------------------------------------------------------
14695  (double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG,
14696  int rgeo, int Type, double nuEnd, double & Rend)
14697 {
14698  std::string msg = "";
14699  if (Type == 1)
14700  {
14701  switch(rgeo)
14702  {
14703  case 1:
14704  case 2:
14705  case 5:
14706  if (nuEnd == 0.0)
14707  Rend = 0.0;
14708  else
14709  Rend = Rsh * DMCG / (Weffcj * nuEnd);
14710  break;
14711  case 3:
14712  case 4:
14713  case 6:
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 not matched\n";
14723  }
14724  }
14725  else
14726  {
14727  switch(rgeo)
14728  {
14729  case 1:
14730  case 3:
14731  case 7:
14732  if (nuEnd == 0.0)
14733  Rend = 0.0;
14734  else
14735  Rend = Rsh * DMCG / (Weffcj * nuEnd);
14736  break;
14737  case 2:
14738  case 4:
14739  case 8:
14740  if (DMCG == 0.0)
14741  msg = "DMCG can not be equal to zero\n";
14742  if (nuEnd == 0.0)
14743  Rend = 0.0;
14744  else
14745  Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG);
14746  break;
14747  default:
14748  UserWarning(*this) << "Specified RGEO = %d not matched\n";
14749  }
14750  }
14751  return 0;
14752 }
14753 
14754 // Additional Declarations
14755 
14756 // Class Model
14757 
14758 //-----------------------------------------------------------------------------
14759 // Function : Model::processParams
14760 // Purpose :
14761 // Special Notes :
14762 // Scope : public
14763 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
14764 // Creation Date : 11/25/06
14765 //-----------------------------------------------------------------------------
14767 {
14768  std::string msg;
14769 
14770  if (SbulkJctPotential < 0.1)
14771  {
14772  SbulkJctPotential = 0.1;
14773  UserWarning(*this) << "Given pbs is less than 0.1. Pbs is set to 0.1";
14774  }
14775  if (SsidewallJctPotential < 0.1)
14776  {
14777  SsidewallJctPotential = 0.1;
14778  UserWarning(*this) << "Given pbsws is less than 0.1. Pbsws is set to 0.1";
14779  }
14780  if (SGatesidewallJctPotential < 0.1)
14781  {
14783  UserWarning(*this) << "Given pbswgs is less than 0.1. Pbswgs is set to 0.1";
14784  }
14785 
14786  if (DbulkJctPotential < 0.1)
14787  {
14788  DbulkJctPotential = 0.1;
14789  UserWarning(*this) << "Given pbd is less than 0.1. Pbd is set to 0.1";
14790  }
14791  if (DsidewallJctPotential < 0.1)
14792  {
14793  DsidewallJctPotential = 0.1;
14794  UserWarning(*this) << "Given pbswd is less than 0.1. Pbswd is set to 0.1";
14795  }
14796  if (DGatesidewallJctPotential < 0.1)
14797  {
14799  UserWarning(*this) << "Given pbswgd is less than 0.1. Pbswgd is set to 0.1";
14800  }
14801 
14802  // If there are any time dependent parameters, set their values at for
14803  // the current time.
14804 
14805  return true;
14806 }
14807 
14808 //----------------------------------------------------------------------------
14809 // Function : Model::processInstanceParams
14810 // Purpose :
14811 // Special Notes :
14812 // Scope : public
14813 // Creator : Eric Keiter, SNL
14814 // Creation Date : 11/25/06
14815 //----------------------------------------------------------------------------
14817 {
14818 
14819  std::vector<Instance*>::iterator iter;
14820  std::vector<Instance*>::iterator first = instanceContainer.begin();
14821  std::vector<Instance*>::iterator last = instanceContainer.end();
14822 
14823  for (iter=first; iter!=last; ++iter)
14824  {
14825  (*iter)->processParams();
14826  }
14827 
14828  return true;
14829 }
14830 
14831 
14832 //-----------------------------------------------------------------------------
14833 // Function : Model::Model
14834 // Purpose : model block constructor
14835 // Special Notes :
14836 // Scope : public
14837 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
14838 // Creation Date : 11/25/06
14839 //-----------------------------------------------------------------------------
14841  const Configuration & configuration,
14842  const ModelBlock & MB,
14843  const FactoryBlock & factory_block)
14844  : DeviceModel(MB, configuration.getModelParameters(), factory_block),
14845  modType (0),
14846  dtype (CONSTNMOS),
14847  mobMod(0),
14848  capMod(0),
14849  dioMod(0),
14850  trnqsMod(0),
14851  acnqsMod(0),
14852  fnoiMod(0),
14853  tnoiMod(0),
14854  rdsMod(0),
14855  rbodyMod(0),
14856  rgateMod(0),
14857  perMod(0),
14858  geoMod(0),
14859  igcMod(0),
14860  igbMod(0),
14861  tempMod(0),
14862  binUnit(0),
14863  paramChk(0),
14864  version("4.6.1"),
14865  toxe(0.0),
14866  toxp(0.0),
14867  toxm(0.0),
14868  dtox(0.0),
14869  epsrox(0.0),
14870  cdsc(0.0),
14871  cdscb(0.0),
14872  cdscd(0.0),
14873  cit(0.0),
14874  nfactor(0.0),
14875  xj(0.0),
14876  vsat(0.0),
14877  at(0.0),
14878  a0(0.0),
14879  ags(0.0),
14880  a1(0.0),
14881  a2(0.0),
14882  keta(0.0),
14883  nsub(0.0),
14884  ndep(0.0),
14885  nsd(0.0),
14886  phin(0.0),
14887  ngate(0.0),
14888  gamma1(0.0),
14889  gamma2(0.0),
14890  vbx(0.0),
14891  vbm(0.0),
14892  xt(0.0),
14893  k1(0.0),
14894  kt1(0.0),
14895  kt1l(0.0),
14896  kt2(0.0),
14897  k2(0.0),
14898  k3(0.0),
14899  k3b(0.0),
14900  w0(0.0),
14901  dvtp0(0.0),
14902  dvtp1(0.0),
14903  lpe0(0.0),
14904  lpeb(0.0),
14905  dvt0(0.0),
14906  dvt1(0.0),
14907  dvt2(0.0),
14908  dvt0w(0.0),
14909  dvt1w(0.0),
14910  dvt2w(0.0),
14911  drout(0.0),
14912  dsub(0.0),
14913  vth0(0.0),
14914  eu(0.0),
14915  ua(0.0),
14916  ua1(0.0),
14917  ub(0.0),
14918  ub1(0.0),
14919  uc(0.0),
14920  uc1(0.0),
14921  ud(0.0),
14922  ud1(0.0),
14923  up(0.0),
14924  lp(0.0),
14925  u0(0.0),
14926  ute(0.0),
14927  voff(0.0),
14928  tvoff(0.0),
14929  minv(0.0),
14930  voffl(0.0),
14931  delta(0.0),
14932  rdsw(0.0),
14933  rdswmin(0.0),
14934  rdwmin(0.0),
14935  rswmin(0.0),
14936  rsw(0.0),
14937  rdw(0.0),
14938  prwg(0.0),
14939  prwb(0.0),
14940  prt(0.0),
14941  eta0(0.0),
14942  etab(0.0),
14943  pclm(0.0),
14944  pdibl1(0.0),
14945  pdibl2(0.0),
14946  pdiblb(0.0),
14947  fprout(0.0),
14948  pdits(0.0),
14949  pditsd(0.0),
14950  pditsl(0.0),
14951  pscbe1(0.0),
14952  pscbe2(0.0),
14953  pvag(0.0),
14954  wr(0.0),
14955  dwg(0.0),
14956  dwb(0.0),
14957  b0(0.0),
14958  b1(0.0),
14959  alpha0(0.0),
14960  alpha1(0.0),
14961  beta0(0.0),
14962  agidl(0.0),
14963  bgidl(0.0),
14964  cgidl(0.0),
14965  egidl(0.0),
14966  aigc(0.0),
14967  bigc(0.0),
14968  cigc(0.0),
14969  aigsd(0.0),
14970  bigsd(0.0),
14971  cigsd(0.0),
14972  aigbacc(0.0),
14973  bigbacc(0.0),
14974  cigbacc(0.0),
14975  aigbinv(0.0),
14976  bigbinv(0.0),
14977  cigbinv(0.0),
14978  nigc(0.0),
14979  nigbacc(0.0),
14980  nigbinv(0.0),
14981  ntox(0.0),
14982  eigbinv(0.0),
14983  pigcd(0.0),
14984  poxedge(0.0),
14985  toxref(0.0),
14986  ijthdfwd(0.0),
14987  ijthsfwd(0.0),
14988  ijthdrev(0.0),
14989  ijthsrev(0.0),
14990  xjbvd(0.0),
14991  xjbvs(0.0),
14992  bvd(0.0),
14993  bvs(0.0),
14994  jtss(0.0),
14995  jtsd(0.0),
14996  jtssws(0.0),
14997  jtsswd(0.0),
14998  jtsswgs(0.0),
14999  jtsswgd(0.0),
15000  njts(0.0),
15001  njtssw(0.0),
15002  njtsswg(0.0),
15003  xtss(0.0),
15004  xtsd(0.0),
15005  xtssws(0.0),
15006  xtsswd(0.0),
15007  xtsswgs(0.0),
15008  xtsswgd(0.0),
15009  tnjts(0.0),
15010  tnjtssw(0.0),
15011  tnjtsswg(0.0),
15012  vtss(0.0),
15013  vtsd(0.0),
15014  vtssws(0.0),
15015  vtsswd(0.0),
15016  vtsswgs(0.0),
15017  vtsswgd(0.0),
15018 
15019  xrcrg1(0.0),
15020  xrcrg2(0.0),
15021  lambda(0.0),
15022  vtl(0.0),
15023  lc(0.0),
15024  xn(0.0),
15025  vfbsdoff(0.0), // S/D flatband offset voltage
15026  lintnoi(0.0), // lint offset for noise calculation
15027  tvfbsdoff(0.0),
15028 
15029  vfb(0.0),
15030  gbmin(0.0),
15031  rbdb(0.0),
15032  rbsb(0.0),
15033  rbpb(0.0),
15034  rbps(0.0),
15035  rbpd(0.0),
15036 
15037  rbps0(0.0),
15038  rbpsl(0.0),
15039  rbpsw(0.0),
15040  rbpsnf(0.0),
15041 
15042  rbpd0(0.0),
15043  rbpdl(0.0),
15044  rbpdw(0.0),
15045  rbpdnf(0.0),
15046 
15047  rbpbx0(0.0),
15048  rbpbxl(0.0),
15049  rbpbxw(0.0),
15050  rbpbxnf(0.0),
15051  rbpby0(0.0),
15052  rbpbyl(0.0),
15053  rbpbyw(0.0),
15054  rbpbynf(0.0),
15055 
15056  rbsbx0(0.0),
15057  rbsby0(0.0),
15058  rbdbx0(0.0),
15059  rbdby0(0.0),
15060 
15061  rbsdbxl(0.0),
15062  rbsdbxw(0.0),
15063  rbsdbxnf(0.0),
15064  rbsdbyl(0.0),
15065  rbsdbyw(0.0),
15066  rbsdbynf(0.0),
15067 
15068  tnoia(0.0),
15069  tnoib(0.0),
15070  rnoia(0.0),
15071  rnoib(0.0),
15072  ntnoi(0.0),
15073 
15074  // CV model and Parasitics
15075  cgsl(0.0),
15076  cgdl(0.0),
15077  ckappas(0.0),
15078  ckappad(0.0),
15079  cf(0.0),
15080  vfbcv(0.0),
15081  clc(0.0),
15082  cle(0.0),
15083  dwc(0.0),
15084  dlc(0.0),
15085  xw(0.0),
15086  xl(0.0),
15087  dlcig(0.0),
15088  dwj(0.0),
15089  noff(0.0),
15090  voffcv(0.0),
15091  acde(0.0),
15092  moin(0.0),
15093  tcj(0.0),
15094  tcjsw(0.0),
15095  tcjswg(0.0),
15096  tpb(0.0),
15097  tpbsw(0.0),
15098  tpbswg(0.0),
15099  dmcg(0.0),
15100  dmci(0.0),
15101  dmdg(0.0),
15102  dmcgt(0.0),
15103  xgw(0.0),
15104  xgl(0.0),
15105  rshg(0.0),
15106  ngcon(0.0),
15107 
15108  // Length Dependence
15109  lcdsc(0.0),
15110  lcdscb(0.0),
15111  lcdscd(0.0),
15112  lcit(0.0),
15113  lnfactor(0.0),
15114  lxj(0.0),
15115  lvsat(0.0),
15116  lat(0.0),
15117  la0(0.0),
15118  lags(0.0),
15119  la1(0.0),
15120  la2(0.0),
15121  lketa(0.0),
15122  lnsub(0.0),
15123  lndep(0.0),
15124  lnsd(0.0),
15125  lphin(0.0),
15126  lngate(0.0),
15127  lgamma1(0.0),
15128  lgamma2(0.0),
15129  lvbx(0.0),
15130  lvbm(0.0),
15131  lxt(0.0),
15132  lk1(0.0),
15133  lkt1(0.0),
15134  lkt1l(0.0),
15135  lkt2(0.0),
15136  lk2(0.0),
15137  lk3(0.0),
15138  lk3b(0.0),
15139  lw0(0.0),
15140  ldvtp0(0.0),
15141  ldvtp1(0.0),
15142  llpe0(0.0),
15143  llpeb(0.0),
15144  ldvt0(0.0),
15145  ldvt1(0.0),
15146  ldvt2(0.0),
15147  ldvt0w(0.0),
15148  ldvt1w(0.0),
15149  ldvt2w(0.0),
15150  ldrout(0.0),
15151  ldsub(0.0),
15152  lvth0(0.0),
15153  lua(0.0),
15154  lua1(0.0),
15155  lub(0.0),
15156  lub1(0.0),
15157  luc(0.0),
15158  luc1(0.0),
15159  lud(0.0),
15160  lud1(0.0),
15161  lup(0.0),
15162  llp(0.0),
15163  lu0(0.0),
15164  leu(0.0),
15165  lute(0.0),
15166  lvoff(0.0),
15167  ltvoff(0.0),
15168  lminv(0.0),
15169  ldelta(0.0),
15170  lrdsw(0.0),
15171  lrsw(0.0),
15172  lrdw(0.0),
15173  lprwg(0.0),
15174  lprwb(0.0),
15175  lprt(0.0),
15176  leta0(0.0),
15177  letab(0.0),
15178  lpclm(0.0),
15179  lpdibl1(0.0),
15180  lpdibl2(0.0),
15181  lpdiblb(0.0),
15182  lfprout(0.0),
15183  lpdits(0.0),
15184  lpditsd(0.0),
15185  lpscbe1(0.0),
15186  lpscbe2(0.0),
15187  lpvag(0.0),
15188  lwr(0.0),
15189  ldwg(0.0),
15190  ldwb(0.0),
15191  lb0(0.0),
15192  lb1(0.0),
15193  lalpha0(0.0),
15194  lalpha1(0.0),
15195  lbeta0(0.0),
15196  lvfb(0.0),
15197  lagidl(0.0),
15198  lbgidl(0.0),
15199  lcgidl(0.0),
15200  legidl(0.0),
15201  laigc(0.0),
15202  lbigc(0.0),
15203  lcigc(0.0),
15204  laigsd(0.0),
15205  lbigsd(0.0),
15206  lcigsd(0.0),
15207  laigbacc(0.0),
15208  lbigbacc(0.0),
15209  lcigbacc(0.0),
15210  laigbinv(0.0),
15211  lbigbinv(0.0),
15212  lcigbinv(0.0),
15213  lnigc(0.0),
15214  lnigbacc(0.0),
15215  lnigbinv(0.0),
15216  lntox(0.0),
15217  leigbinv(0.0),
15218  lpigcd(0.0),
15219  lpoxedge(0.0),
15220  lxrcrg1(0.0),
15221  lxrcrg2(0.0),
15222  llambda(0.0),
15223  lvtl(0.0),
15224  lxn(0.0),
15225  lvfbsdoff(0.0),
15226  ltvfbsdoff(0.0),
15227 
15228  // CV model
15229  lcgsl(0.0),
15230  lcgdl(0.0),
15231  lckappas(0.0),
15232  lckappad(0.0),
15233  lcf(0.0),
15234  lclc(0.0),
15235  lcle(0.0),
15236  lvfbcv(0.0),
15237  lnoff(0.0),
15238  lvoffcv(0.0),
15239  lacde(0.0),
15240  lmoin(0.0),
15241 
15242  // Width Dependence
15243  wcdsc(0.0),
15244  wcdscb(0.0),
15245  wcdscd(0.0),
15246  wcit(0.0),
15247  wnfactor(0.0),
15248  wxj(0.0),
15249  wvsat(0.0),
15250  wat(0.0),
15251  wa0(0.0),
15252  wags(0.0),
15253  wa1(0.0),
15254  wa2(0.0),
15255  wketa(0.0),
15256  wnsub(0.0),
15257  wndep(0.0),
15258  wnsd(0.0),
15259  wphin(0.0),
15260  wngate(0.0),
15261  wgamma1(0.0),
15262  wgamma2(0.0),
15263  wvbx(0.0),
15264  wvbm(0.0),
15265  wxt(0.0),
15266  wk1(0.0),
15267  wkt1(0.0),
15268  wkt1l(0.0),
15269  wkt2(0.0),
15270  wk2(0.0),
15271  wk3(0.0),
15272  wk3b(0.0),
15273  ww0(0.0),
15274  wdvtp0(0.0),
15275  wdvtp1(0.0),
15276  wlpe0(0.0),
15277  wlpeb(0.0),
15278  wdvt0(0.0),
15279  wdvt1(0.0),
15280  wdvt2(0.0),
15281  wdvt0w(0.0),
15282  wdvt1w(0.0),
15283  wdvt2w(0.0),
15284  wdrout(0.0),
15285  wdsub(0.0),
15286  wvth0(0.0),
15287  wua(0.0),
15288  wua1(0.0),
15289  wub(0.0),
15290  wub1(0.0),
15291  wuc(0.0),
15292  wuc1(0.0),
15293  wud(0.0),
15294  wud1(0.0),
15295  wup(0.0),
15296  wlp(0.0),
15297  wu0(0.0),
15298  weu(0.0),
15299  wute(0.0),
15300  wvoff(0.0),
15301  wtvoff(0.0),
15302  wminv(0.0),
15303  wdelta(0.0),
15304  wrdsw(0.0),
15305  wrsw(0.0),
15306  wrdw(0.0),
15307  wprwg(0.0),
15308  wprwb(0.0),
15309  wprt(0.0),
15310  weta0(0.0),
15311  wetab(0.0),
15312  wpclm(0.0),
15313  wpdibl1(0.0),
15314  wpdibl2(0.0),
15315  wpdiblb(0.0),
15316  wfprout(0.0),
15317  wpdits(0.0),
15318  wpditsd(0.0),
15319  wpscbe1(0.0),
15320  wpscbe2(0.0),
15321  wpvag(0.0),
15322  wwr(0.0),
15323  wdwg(0.0),
15324  wdwb(0.0),
15325  wb0(0.0),
15326  wb1(0.0),
15327  walpha0(0.0),
15328  walpha1(0.0),
15329  wbeta0(0.0),
15330  wvfb(0.0),
15331  wagidl(0.0),
15332  wbgidl(0.0),
15333  wcgidl(0.0),
15334  wegidl(0.0),
15335  waigc(0.0),
15336  wbigc(0.0),
15337  wcigc(0.0),
15338  waigsd(0.0),
15339  wbigsd(0.0),
15340  wcigsd(0.0),
15341  waigbacc(0.0),
15342  wbigbacc(0.0),
15343  wcigbacc(0.0),
15344  waigbinv(0.0),
15345  wbigbinv(0.0),
15346  wcigbinv(0.0),
15347  wnigc(0.0),
15348  wnigbacc(0.0),
15349  wnigbinv(0.0),
15350  wntox(0.0),
15351  weigbinv(0.0),
15352  wpigcd(0.0),
15353  wpoxedge(0.0),
15354  wxrcrg1(0.0),
15355  wxrcrg2(0.0),
15356  wlambda(0.0),
15357  wvtl(0.0),
15358  wxn(0.0),
15359  wvfbsdoff(0.0),
15360  wtvfbsdoff(0.0),
15361 
15362  // CV model
15363  wcgsl(0.0),
15364  wcgdl(0.0),
15365  wckappas(0.0),
15366  wckappad(0.0),
15367  wcf(0.0),
15368  wclc(0.0),
15369  wcle(0.0),
15370  wvfbcv(0.0),
15371  wnoff(0.0),
15372  wvoffcv(0.0),
15373  wacde(0.0),
15374  wmoin(0.0),
15375 
15376  // Cross-term Dependence
15377  pcdsc(0.0),
15378  pcdscb(0.0),
15379  pcdscd(0.0),
15380  pcit(0.0),
15381  pnfactor(0.0),
15382  pxj(0.0),
15383  pvsat(0.0),
15384  pat(0.0),
15385  pa0(0.0),
15386  pags(0.0),
15387  pa1(0.0),
15388  pa2(0.0),
15389  pketa(0.0),
15390  pnsub(0.0),
15391  pndep(0.0),
15392  pnsd(0.0),
15393  pphin(0.0),
15394  pngate(0.0),
15395  pgamma1(0.0),
15396  pgamma2(0.0),
15397  pvbx(0.0),
15398  pvbm(0.0),
15399  pxt(0.0),
15400  pk1(0.0),
15401  pkt1(0.0),
15402  pkt1l(0.0),
15403  pkt2(0.0),
15404  pk2(0.0),
15405  pk3(0.0),
15406  pk3b(0.0),
15407  pw0(0.0),
15408  pdvtp0(0.0),
15409  pdvtp1(0.0),
15410  plpe0(0.0),
15411  plpeb(0.0),
15412  pdvt0(0.0),
15413  pdvt1(0.0),
15414  pdvt2(0.0),
15415  pdvt0w(0.0),
15416  pdvt1w(0.0),
15417  pdvt2w(0.0),
15418  pdrout(0.0),
15419  pdsub(0.0),
15420  pvth0(0.0),
15421  pua(0.0),
15422  pua1(0.0),
15423  pub(0.0),
15424  pub1(0.0),
15425  puc(0.0),
15426  puc1(0.0),
15427  pud(0.0),
15428  pud1(0.0),
15429  pup(0.0),
15430  plp(0.0),
15431  pu0(0.0),
15432  peu(0.0),
15433  pute(0.0),
15434  pvoff(0.0),
15435  ptvoff(0.0),
15436  pminv(0.0),
15437  pdelta(0.0),
15438  prdsw(0.0),
15439  prsw(0.0),
15440  prdw(0.0),
15441  pprwg(0.0),
15442  pprwb(0.0),
15443  pprt(0.0),
15444  peta0(0.0),
15445  petab(0.0),
15446  ppclm(0.0),
15447  ppdibl1(0.0),
15448  ppdibl2(0.0),
15449  ppdiblb(0.0),
15450  pfprout(0.0),
15451  ppdits(0.0),
15452  ppditsd(0.0),
15453  ppscbe1(0.0),
15454  ppscbe2(0.0),
15455  ppvag(0.0),
15456  pwr(0.0),
15457  pdwg(0.0),
15458  pdwb(0.0),
15459  pb0(0.0),
15460  pb1(0.0),
15461  palpha0(0.0),
15462  palpha1(0.0),
15463  pbeta0(0.0),
15464  pvfb(0.0),
15465  pagidl(0.0),
15466  pbgidl(0.0),
15467  pcgidl(0.0),
15468  pegidl(0.0),
15469  paigc(0.0),
15470  pbigc(0.0),
15471  pcigc(0.0),
15472  paigsd(0.0),
15473  pbigsd(0.0),
15474  pcigsd(0.0),
15475  paigbacc(0.0),
15476  pbigbacc(0.0),
15477  pcigbacc(0.0),
15478  paigbinv(0.0),
15479  pbigbinv(0.0),
15480  pcigbinv(0.0),
15481  pnigc(0.0),
15482  pnigbacc(0.0),
15483  pnigbinv(0.0),
15484  pntox(0.0),
15485  peigbinv(0.0),
15486  ppigcd(0.0),
15487  ppoxedge(0.0),
15488  pxrcrg1(0.0),
15489  pxrcrg2(0.0),
15490  plambda(0.0),
15491  pvtl(0.0),
15492  pxn(0.0),
15493  pvfbsdoff(0.0),
15494  ptvfbsdoff(0.0),
15495 
15496  // CV model
15497  pcgsl(0.0),
15498  pcgdl(0.0),
15499  pckappas(0.0),
15500  pckappad(0.0),
15501  pcf(0.0),
15502  pclc(0.0),
15503  pcle(0.0),
15504  pvfbcv(0.0),
15505  pnoff(0.0),
15506  pvoffcv(0.0),
15507  pacde(0.0),
15508  pmoin(0.0),
15509 
15510  tnom(0.0),
15511  cgso(0.0),
15512  cgdo(0.0),
15513  cgbo(0.0),
15514  xpart(0.0),
15515  cFringOut(0.0),
15516  cFringMax(0.0),
15517 
15518  sheetResistance(0.0),
15519  SjctSatCurDensity(0.0),
15520  DjctSatCurDensity(0.0),
15521  SjctSidewallSatCurDensity(0.0),
15522  DjctSidewallSatCurDensity(0.0),
15523  SjctGateSidewallSatCurDensity(0.0),
15524  DjctGateSidewallSatCurDensity(0.0),
15525  SbulkJctPotential(0.0),
15526  DbulkJctPotential(0.0),
15527  SbulkJctBotGradingCoeff(0.0),
15528  DbulkJctBotGradingCoeff(0.0),
15529  SbulkJctSideGradingCoeff(0.0),
15530  DbulkJctSideGradingCoeff(0.0),
15531  SbulkJctGateSideGradingCoeff(0.0),
15532  DbulkJctGateSideGradingCoeff(0.0),
15533  SsidewallJctPotential(0.0),
15534  DsidewallJctPotential(0.0),
15535  SGatesidewallJctPotential(0.0),
15536  DGatesidewallJctPotential(0.0),
15537  SunitAreaJctCap(0.0),
15538  DunitAreaJctCap(0.0),
15539  SunitLengthSidewallJctCap(0.0),
15540  DunitLengthSidewallJctCap(0.0),
15541  SunitLengthGateSidewallJctCap(0.0),
15542  DunitLengthGateSidewallJctCap(0.0),
15543  SjctEmissionCoeff(0.0),
15544  DjctEmissionCoeff(0.0),
15545  SjctTempExponent(0.0),
15546  DjctTempExponent(0.0),
15547  njtsstemp(0.0),
15548  njtsswstemp(0.0),
15549  njtsswgstemp(0.0),
15550  njtsdtemp(0.0),
15551  njtsswdtemp(0.0),
15552  njtsswgdtemp(0.0),
15553 
15554 
15555  Lint(0.0),
15556  Ll(0.0),
15557  Llc(0.0),
15558  Lln(0.0),
15559  Lw(0.0),
15560  Lwc(0.0),
15561  Lwn(0.0),
15562  Lwl(0.0),
15563  Lwlc(0.0),
15564  Lmin(0.0),
15565  Lmax(0.0),
15566 
15567  Wint(0.0),
15568  Wl(0.0),
15569  Wlc(0.0),
15570  Wln(0.0),
15571  Ww(0.0),
15572  Wwc(0.0),
15573  Wwn(0.0),
15574  Wwl(0.0),
15575  Wwlc(0.0),
15576  Wmin(0.0),
15577  Wmax(0.0),
15578 
15579  // added for stress effect
15580  saref(0.0),
15581  sbref(0.0),
15582  wlod(0.0),
15583  ku0(0.0),
15584  kvsat(0.0),
15585  kvth0(0.0),
15586  tku0(0.0),
15587  llodku0(0.0),
15588  wlodku0(0.0),
15589  llodvth(0.0),
15590  wlodvth(0.0),
15591  lku0(0.0),
15592  wku0(0.0),
15593  pku0(0.0),
15594  lkvth0(0.0),
15595  wkvth0(0.0),
15596  pkvth0(0.0),
15597  stk2(0.0),
15598  lodk2(0.0),
15599  steta0(0.0),
15600  lodeta0(0.0),
15601 
15602  web(0.0),
15603  wec(0.0),
15604  kvth0we(0.0),
15605  k2we(0.0),
15606  ku0we(0.0),
15607  scref(0.0),
15608  wpemod(0.0),
15609  lkvth0we(0.0),
15610  lk2we(0.0),
15611  lku0we(0.0),
15612  wkvth0we(0.0),
15613  wk2we(0.0),
15614  wku0we(0.0),
15615  pkvth0we(0.0),
15616  pk2we(0.0),
15617  pku0we(0.0),
15618 
15619 // Pre-calculated constants
15620 // move to size-dependent param
15621  vtm(0.0),
15622  vtm0(0.0),
15623  coxe(0.0),
15624  coxp(0.0),
15625  cof1(0.0),
15626  cof2(0.0),
15627  cof3(0.0),
15628  cof4(0.0),
15629  vcrit(0.0),
15630  factor1(0.0),
15631  PhiBS(0.0),
15632  PhiBSWS(0.0),
15633  PhiBSWGS(0.0),
15634  SjctTempSatCurDensity(0.0),
15635  SjctSidewallTempSatCurDensity(0.0),
15636  SjctGateSidewallTempSatCurDensity(0.0),
15637  PhiBD(0.0),
15638  PhiBSWD(0.0),
15639  PhiBSWGD(0.0),
15640  DjctTempSatCurDensity(0.0),
15641  DjctSidewallTempSatCurDensity(0.0),
15642  DjctGateSidewallTempSatCurDensity(0.0),
15643  SunitAreaTempJctCap(0.0),
15644  DunitAreaTempJctCap(0.0),
15645  SunitLengthSidewallTempJctCap(0.0),
15646  DunitLengthSidewallTempJctCap(0.0),
15647  SunitLengthGateSidewallTempJctCap(0.0),
15648  DunitLengthGateSidewallTempJctCap(0.0),
15649 
15650  oxideTrapDensityA(0.0),
15651  oxideTrapDensityB(0.0),
15652  oxideTrapDensityC(0.0),
15653  em(0.0),
15654  ef(0.0),
15655  af(0.0),
15656  kf(0.0),
15657  ni(0.0),
15658  Vtm0(0.0),
15659 
15660  vtlGiven(false),
15661  ndepGiven(false),
15662  gamma1Given(false),
15663  k1Given(false),
15664  k2Given(false),
15665  nsubGiven(false),
15666  xtGiven(false),
15667  vbxGiven(false),
15668  gamma2Given(false),
15669  vfbGiven(false),
15670  vth0Given(false),
15671  rbps0Given(false),
15672  rbpd0Given(false),
15673  rbsbx0Given(false),
15674  rbsby0Given(false),
15675  rbdbx0Given(false),
15676  rbdby0Given(false),
15677  lambdaGiven(false),
15678  pigcdGiven(false),
15679  toxeGiven(false),
15680  toxpGiven(false),
15681  dtoxGiven(false),
15682  cgdoGiven(false),
15683  dlcGiven(false),
15684  cgsoGiven(false),
15685  cgboGiven(false)
15686 
15687 {
15688  if (getType() != "")
15689  {
15690  if (getType() == "NMOS") {
15691  dtype = CONSTNMOS;
15692  }
15693  else if (getType() == "PMOS") {
15694  dtype = CONSTPMOS;
15695  }
15696  else
15697  {
15698  UserError0(*this) << "Could not recognize the type for model " << getName();
15699  }
15700  }
15701 
15702 
15703  // Set params to constant default values:
15704  setDefaultParams ();
15705 
15706  // Set params according to .model line and constant defaults from metadata:
15707  setModParams (MB.params);
15708 
15709  // Set any non-constant parameter defaults:
15710  if (!given("TNOM"))
15712 
15713  // Calculate any parameters specified as expressions:
15714 
15716 
15717  // calculate dependent (ie computed) params
15718  if (!given("TOXP") )
15719  toxp = toxe;
15720  if (!given("TOXM") )
15721  toxm = toxe;
15722  if (!given("DSUB") )
15723  dsub = drout;
15724 
15725  if (!given("VTH0") )
15726  vth0 = (dtype == CONSTNMOS) ? 0.7 : -0.7;
15727 
15728  if (!given("VDDEOT"))
15729  vddeot= (dtype == CONSTNMOS)?1.5:-1.5;
15730  if (!given("EU"))
15731  eu =(dtype == CONSTNMOS) ? 1.67 : 1.0;;
15732  if (!given("UA"))
15733  ua =(mobMod == 2) ? 1.0E-15 : 1.0E-9; // UNIT M/V
15734  if (!given("UC"))
15735  uc = (mobMod == 1) ? -0.0465 : -0.0465E-9;
15736  if (!given("UC1"))
15737  uc1 =(mobMod == 1) ? -0.056 : -0.056E-9;
15738  if (!given("U0"))
15739  u0 = (dtype == CONSTNMOS) ? 0.067 : 0.025;
15740  if (!given("AIGC"))
15741  aigc =(dtype == CONSTNMOS) ? 1.36E-2 : 9.80E-3;
15742  if (!given("BIGC"))
15743  bigc =(dtype == CONSTNMOS) ? 1.71E-3 : 7.59E-4;
15744  if (!given("CIGC"))
15745  cigc = (dtype == CONSTNMOS) ? 0.075 : 0.03;
15746  if (given("AIGSD"))
15747  {
15748  aigs = aigd = aigsd;
15749  }
15750  else
15751  {
15752  aigsd = (dtype == CONSTNMOS) ? 1.36E-2 : 9.80E-3;
15753  if (!given("AIGS"))
15754  aigs = aigsd;
15755  if (!given("AIGD"))
15756  aigd = aigsd;
15757  }
15758 
15759  if (given("BIGSD"))
15760  {
15761  bigs = bigd = bigsd;
15762  }
15763  else
15764  {
15765  bigsd = (dtype == CONSTNMOS) ? 1.71E-3 : 7.59E-4;
15766  if (!given("BIGS"))
15767  bigs = bigsd;
15768  if (!given("BIGD"))
15769  bigd = bigsd;
15770  }
15771  if (given("CIGSD"))
15772  {
15773  cigs=cigd=cigsd;
15774  }
15775  else
15776  {
15777  cigsd = (dtype == CONSTNMOS) ? 0.075 : 0.03;
15778  if (!given("CIGS"))
15779  cigs=cigsd;
15780  if (!given("CIGD"))
15781  cigd=cigsd;
15782  }
15783  if (!given("IJTHDFWD"))
15784  ijthdfwd = ijthsfwd;
15785  if (!given("IJTHDREV"))
15786  ijthdrev = ijthsrev;
15787  if (!given("XJBVD"))
15788  xjbvd = xjbvs;
15789  if (!given("BVD"))
15790  bvd = bvs;
15791  if (!given("CKAPPAD"))
15792  ckappad = ckappas;
15793  if (!given("DMCI"))
15794  dmci = dmcg;
15795  if (!given("LLC"))
15796  Llc = Ll;
15797  if (!given("LWC"))
15798  Lwc = Lw;
15799  if (!given("LWLC"))
15800  Lwlc = Lwl;
15801  if (!given("WLC"))
15802  Wlc = Wl;
15803  if (!given("WWC"))
15804  Wwc = Ww;
15805  if (!given("WWLC"))
15806  Wwlc = Wwl;
15807  if (!given("DWC"))
15808  dwc = Wint;
15809  if (!given("DLC"))
15810  dlc = Lint;
15811 
15812  if (!given("AGISL"))
15813  {
15814  if (given("AGIDL"))
15815  agisl=agidl;
15816  // otherwise our initializer took care of it already
15817  }
15818  if (!given("BGISL"))
15819  {
15820  if (given("BGIDL"))
15821  bgisl=bgidl;
15822  }
15823  if (!given("CGISL"))
15824  {
15825  if (given("CGIDL"))
15826  cgisl=cgidl;
15827  }
15828  if (!given("EGISL"))
15829  {
15830  if (given("EGIDL"))
15831  egisl=egidl;
15832  }
15833 
15834  if (!given("DLCIG"))
15835  dlcig = Lint;
15836  if (!given("DLCIGD"))
15837  {
15838  if (!given("DLCIG"))
15839  dlcigd = Lint;
15840  else
15841  dlcigd = dlcig;
15842  }
15843  if (!given("DWJ"))
15844  dwj = dwc;
15845 
15846 
15847 
15848 
15849  // The seemingly unnecessary and absurd parentheses around CONSTEPS0/M_PI
15850  // turned out to be necessary for getting this statement to evaluate properly
15851  // on Windows with Intel compilers. Bleah.
15852  if (!given("CF"))
15853  cf = 2.0 * epsrox * ((CONSTEPS0) / (M_PI)) * log(1.0 + 0.4E-6 / toxe);
15854 
15855  if (!given("JSD"))
15857  if (!given("JSWD"))
15859  if (!given("JSWGD"))
15861  if (!given("PBD"))
15863  if (!given("NJD"))
15865  if (!given("XTID"))
15867  if (!given("MJD"))
15869  if (!given("MJSWD"))
15871  if (!given("MJSWGS"))
15873  if (!given("MJSWGD"))
15875  if (!given("PBSWD"))
15877  if (!given("PBSWGS"))
15879  if (!given("PBSWGD"))
15881  if (!given("CJD"))
15883  if (!given("CJSWD"))
15885  if (!given("CJSWGS"))
15887  if (!given("CJSWGD"))
15889 
15890  if (!given("JTSD"))
15891  jtsd = jtss;
15892  if (!given("JTSSWD"))
15893  jtsswd = jtssws;
15894  if (!given("JTSSWGD"))
15895  jtsswgd = jtsswgs;
15896 
15897  if (!given("NJTSD"))
15898  {
15899  if (given("NJTS"))
15900  njtsd = njts;
15901  }
15902  if (!given("NJTSSWD"))
15903  {
15904  if (given("NJTSSW"))
15905  njtsswd = njtssw;
15906  }
15907  if (!given("NJTSSWGD"))
15908  {
15909  if (given("NJTSSWG"))
15910  njtsswgd = njtsswg;
15911  }
15912 
15913  if (!given("XTSD"))
15914  xtsd = xtss;
15915  if (!given("XTSSWD"))
15916  xtsswd = xtssws;
15917  if (!given("XTSSWGD"))
15918  xtsswgd = xtsswgs;
15919 
15920  if (!given("TNJTSD"))
15921  {
15922  if (given("TNJTS"))
15923  tnjtsd = tnjts;
15924  }
15925  if (!given("TNJTSSWD"))
15926  {
15927  if (given("TNJTSSW"))
15928  tnjtsswd = tnjtssw;
15929  }
15930  if (!given("TNJTSSWGD"))
15931  {
15932  if (given("TNJTSSWG"))
15933  tnjtsswgd = tnjtsswg;
15934  }
15935 
15936  if (!given("VTSD"))
15937  vtsd = vtss;
15938  if (!given("VTSSWD"))
15939  vtsswd = vtssws;
15940  if (!given("VTSSWGD"))
15941  vtsswgd = vtsswgs;
15942 
15943  if (!given("LAGISL"))
15944  {
15945  if (given("LAGIDL"))
15946  lagisl = lagidl;
15947  }
15948  if (!given("LBGISL"))
15949  {
15950  if (given("LBGIDL"))
15951  lbgisl = lbgidl;
15952  }
15953  if (!given("LCGISL"))
15954  {
15955  if (given("LCGIDL"))
15956  lcgisl = lcgidl;
15957  }
15958  if (!given("LEGISL"))
15959  {
15960  if (given("LEGIDL"))
15961  legisl = legidl;
15962  }
15963 
15964  // This is ugly, ugly, ugly.
15965  // This stuff is all the "else" clauses from the spice code, which are
15966  // all like this:
15967  // if (given("xxxsd") && (given(xxxs) || given(xxxd)))
15968  // {
15969  // set not-given things to constants
15970  // }
15971  // else
15972  // {
15973  // set the s and d versions to the sd version
15974  // }
15975  // But we set the constants in the ParTable stuff, so all that is left is
15976  // the else. So I negated the conditional and left only the stuff in the
15977  // else.
15978  // TVR 1 Aug 07
15979  //
15980  if (!(!given("AIGSD") && (given("AIGS") || given("AIGD"))))
15981  {
15982  laigs = laigd = laigsd;
15983  }
15984  if (!(!given("BIGSD") && (given("BIGS") || given("BIGD"))))
15985  {
15986  lbigs = lbigd = lbigsd;
15987  }
15988  if (!(!given("CIGSD") && (given("CIGS") || given("CIGD"))))
15989  {
15990  lcigs = lcigd = lcigsd;
15991  }
15992 
15993  if (!given("WAGISL"))
15994  {
15995  if (given("WAGIDL"))
15996  wagisl = wagidl;
15997  }
15998  if (!given("WBGISL"))
15999  {
16000  if (given("WBGIDL"))
16001  wbgisl = wbgidl;
16002  }
16003  if (!given("WCGISL"))
16004  {
16005  if (given("WCGIDL"))
16006  wcgisl = wcgidl;
16007  }
16008  if (!given("WEGISL"))
16009  {
16010  if (given("WEGIDL"))
16011  wegisl = wegidl;
16012  }
16013 
16014  // See above, under "ugly, ugly, ugly"
16015  if (!(!given("AIGSD") && (given("AIGS") || given("AIGD"))))
16016  {
16017  waigs = waigd = waigsd;
16018  }
16019  if (!(!given("BIGSD") && (given("BIGS") || given("BIGD"))))
16020  {
16021  wbigs = wbigd = wbigsd;
16022  }
16023  if (!(!given("CIGSD") && (given("CIGS") || given("CIGD"))))
16024  {
16025  wcigs = wcigd = wcigsd;
16026  }
16027 
16028  if (!given("PAGISL"))
16029  {
16030  if (given("PAGIDL"))
16031  pagisl = pagidl;
16032  }
16033  if (!given("PBGISL"))
16034  {
16035  if (given("PBGIDL"))
16036  pbgisl = pbgidl;
16037  }
16038  if (!given("PCGISL"))
16039  {
16040  if (given("PCGIDL"))
16041  pcgisl = pcgidl;
16042  }
16043  if (!given("PEGISL"))
16044  {
16045  if (given("PEGIDL"))
16046  pegisl = pegidl;
16047  }
16048 
16049  // Vide supra, re "ugly"
16050  if (!(!given("AIGSD") && (given("AIGS") || given("AIGD"))))
16051  {
16052  paigs = paigd = paigsd;
16053  }
16054  if (!(!given("BIGSD") && (given("BIGS") || given("BIGD"))))
16055  {
16056  pbigs = pbigd = pbigsd;
16057  }
16058  if (!(!given("CIGSD") && (given("CIGS") || given("CIGD"))))
16059  {
16060  pcigs = pcigd = pcigsd;
16061  }
16062 
16063  if (!given("NOIA"))
16064  {
16065  if (dtype == CONSTNMOS)
16066  oxideTrapDensityA = 6.25e41;
16067  else
16068  oxideTrapDensityA= 6.188e40;
16069  }
16070  if (!given("NOIB"))
16071  {
16072  if (dtype == CONSTNMOS)
16073  oxideTrapDensityB = 3.125e26;
16074  else
16075  oxideTrapDensityB = 1.5e25;
16076  }
16077  if (!given("NOIC"))
16078  {
16079  oxideTrapDensityC = 8.75e9;
16080  }
16081 
16082  processParams ();
16083 }
16084 
16085 //-----------------------------------------------------------------------------
16086 // Function : Model::~Model
16087 // Purpose : destructor
16088 // Special Notes :
16089 // Scope : public
16090 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
16091 // Creation Date : 11/25/06
16092 //-----------------------------------------------------------------------------
16094 {
16095  std::list<SizeDependParam*>::iterator it_dpL =
16096  sizeDependParamList.begin();
16097  std::list<SizeDependParam*>::iterator end_dpL =
16098  sizeDependParamList.end();
16099  for( ; it_dpL != end_dpL; ++it_dpL )
16100  delete (*it_dpL);
16101 
16102  sizeDependParamList.clear ();
16103 
16104  std::vector<Instance*>::iterator iter;
16105  std::vector<Instance*>::iterator first = instanceContainer.begin();
16106  std::vector<Instance*>::iterator last = instanceContainer.end();
16107 
16108  for (iter=first; iter!=last; ++iter)
16109  {
16110  delete (*iter);
16111  }
16112 
16113 }
16114 
16115 //-----------------------------------------------------------------------------
16116 // Function : Model::printOutInstances
16117 // Purpose : debugging tool.
16118 // Special Notes :
16119 // Scope : public
16120 // Creator : Eric Keiter, SNL, Electrical and Microsystems Modeling
16121 // Creation Date : 11/25/06
16122 //-----------------------------------------------------------------------------
16123 std::ostream &Model::printOutInstances(std::ostream &os) const
16124 {
16125  std::vector<Instance*>::const_iterator iter;
16126  std::vector<Instance*>::const_iterator first = instanceContainer.begin();
16127  std::vector<Instance*>::const_iterator last = instanceContainer.end();
16128 
16129  int i;
16130  os << std::endl;
16131  os << " name model name Parameters" << std::endl;
16132 
16133  for (i=0, iter=first; iter!=last; ++iter,++i)
16134  {
16135  os << " " << i << ": " << (*iter)->getName() << "\t";
16136  os << getName();
16137  os << std::endl;
16138  }
16139 
16140  os << std::endl;
16141 
16142  return os;
16143 }
16144 
16145 //-----------------------------------------------------------------------------
16146 // Function : Model::forEachInstance
16147 // Purpose :
16148 // Special Notes :
16149 // Scope : public
16150 // Creator : David Baur
16151 // Creation Date : 2/4/2014
16152 //-----------------------------------------------------------------------------
16153 /// Apply a device instance "op" to all instances associated with this
16154 /// model
16155 ///
16156 /// @param[in] op Operator to apply to all instances.
16157 ///
16158 ///
16159 void Model::forEachInstance(DeviceInstanceOp &op) const /* override */
16160 {
16161  for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
16162  op(*it);
16163 }
16164 
16165 
16166 
16167 //----------------------------------------------------------------------------
16168 // Function : Model::clearTemperatureData
16169 //
16170 // Purpose : This is mainly here to delete rid of the size
16171 // dependent parameters, which are also temperature dependent.
16172 //
16173 // Special Notes : This is called right before the circuit temperature is
16174 // changed.
16175 //
16176 // Scope : public
16177 // Creator : Eric R. Keiter, SNL
16178 // Creation Date : 11/25/06
16179 //----------------------------------------------------------------------------
16181 {
16182  std::list<SizeDependParam*>::iterator it_dpL =
16183  sizeDependParamList.begin();
16184  std::list<SizeDependParam*>::iterator end_dpL =
16185  sizeDependParamList.end();
16186  for( ; it_dpL != end_dpL; ++it_dpL )
16187  delete (*it_dpL);
16188 
16189  sizeDependParamList.clear ();
16190 
16191  return true;
16192 }
16193 
16194 //-----------------------------------------------------------------------------
16195 // MOSFET_B4 Master functions:
16196 //-----------------------------------------------------------------------------
16197 
16198 //-----------------------------------------------------------------------------
16199 // Function : Master::updateState
16200 // Purpose :
16201 // Special Notes :
16202 // Scope : public
16203 // Creator : Eric Keiter, SNL
16204 // Creation Date : 11/26/08
16205 //-----------------------------------------------------------------------------
16206 bool Master::updateState (double * solVec, double * staVec, double * stoVec)
16207 {
16208  bool bsuccess = true;
16209 
16210 #ifdef _OMP
16211 #pragma omp parallel for
16212 #endif
16213  for (InstanceVector::const_iterator it = getInstanceBegin(); it != getInstanceEnd(); ++it)
16214  {
16215  Instance & mi = *(*it);
16216 
16217  bool btmp = mi.updateIntermediateVars ();
16218  bsuccess = bsuccess && btmp;
16219 
16220  // voltage drops:
16221  double * stoVec = mi.extData.nextStoVectorRawPtr;
16222  stoVec[mi.li_store_vbd] = mi.vbd;
16223  stoVec[mi.li_store_vbs] = mi.vbs;
16224  stoVec[mi.li_store_vgs] = mi.vgs;
16225  stoVec[mi.li_store_vds] = mi.vds;
16226  stoVec[mi.li_store_vges] = mi.vges;
16227  stoVec[mi.li_store_vgms] = mi.vgms;
16228  stoVec[mi.li_store_vdes] = mi.vdes;
16229  stoVec[mi.li_store_vses] = mi.vses;
16230  stoVec[mi.li_store_vdbs] = mi.vdbs;
16231  stoVec[mi.li_store_vsbs] = mi.vsbs;
16232  stoVec[mi.li_store_vdbd] = mi.vdbd;
16233  stoVec[mi.li_store_von] = mi.von;
16234 
16235  // intrinsic capacitors:
16236  // Note the wierdness --- we have a "qg", "qb" and "qd" state variable,
16237  // but no corresponding instance variable --- they are all calculated from
16238  // other quantities that are NOT stored in the instance. We use them
16239  // only in their derivative forms, cqg, cqb, and cqd.
16240  mi.qg = staVec[mi.li_state_qg ] = mi.qgate;
16241  mi.qd = staVec[mi.li_state_qd ] = mi.qdrn-mi.qbd;
16242 
16243  if (!mi.rbodyMod)
16244  {
16245  mi.qb =staVec[mi.li_state_qb ] = mi.qbulk+mi.qbd+mi.qbs;
16246  }
16247  else
16248  {
16249  mi.qb = staVec[mi.li_state_qb ] = mi.qbulk;
16250  }
16251 
16252  if (mi.rgateMod == 3)
16253  {
16254  staVec[mi.li_state_qgmid] = mi.qgmid;
16255  }
16256 
16257  // parasitic capacitors:
16258  if (mi.rbodyMod)
16259  {
16260  staVec[mi.li_state_qbs] = mi.qbs;
16261  staVec[mi.li_state_qbd] = mi.qbd;
16262  }
16263 
16264  if( mi.trnqsMod )
16265  {
16266  staVec[mi.li_state_qcheq] = mi.qcheq;
16267  staVec[mi.li_state_qcdump] = mi.qdef * mi.ScalingFactor;
16268  }
16269 
16270  // if this is the first newton step of the first time step
16271  // of the transient simulation, we need to enforce that the
16272  // time derivatives w.r.t. charge are zero. This is to maintain 3f5
16273  // compatibility. ERK.
16274 
16275  // Note: I think this kind of thing is enforced (or should be enforced,
16276  // anyway) at the time integration level. So I'm not sure this step is
16277  // really needed, at least for new-DAE. Derivatives out of the DCOP
16278  // are supposed to be zero at the first newton step.
16279 
16280  if (!(getSolverState().dcopFlag) && getSolverState().initTranFlag && getSolverState().newtonIter==0)
16281  {
16282  // re-set the state vector pointer that we are using to the "current"
16283  // pointer, rather than the "next" pointer.
16284  double * currStaVec = mi.extData.currStaVectorRawPtr;
16285 
16286  // intrinsic capacitors:
16287  currStaVec[mi.li_state_qg ] = mi.qgate;
16288  currStaVec[mi.li_state_qd ] = mi.qdrn-mi.qbd;
16289  if (!mi.rbodyMod)
16290  {
16291  currStaVec[mi.li_state_qb ] = mi.qbulk+mi.qbd+mi.qbs;
16292  }
16293  else
16294  {
16295  currStaVec[mi.li_state_qb ] = mi.qbulk;
16296  }
16297 
16298  if (mi.rgateMod == 3)
16299  {
16300  currStaVec[mi.li_state_qgmid] = mi.qgmid;
16301  }
16302 
16303  // parasitic capacitors:
16304  if (mi.rbodyMod)
16305  {
16306  currStaVec[mi.li_state_qbs] = mi.qbs;
16307  currStaVec[mi.li_state_qbd] = mi.qbd;
16308  }
16309 
16310  if( mi.trnqsMod )
16311  {
16312  currStaVec[mi.li_state_qcheq] = mi.qcheq;
16313  currStaVec[mi.li_state_qcdump] = mi.qdef * mi.ScalingFactor;
16314  }
16315  }
16316  }
16317 
16318  return bsuccess;
16319 }
16320 
16321 //-----------------------------------------------------------------------------
16322 // Function : Master::loadDAEVectors
16323 // Purpose :
16324 // Special Notes :
16325 // Scope : public
16326 // Creator : Eric Keiter, SNL
16327 // Creation Date : 11/26/08
16328 //-----------------------------------------------------------------------------
16329 bool Master::loadDAEVectors (double * solVec, double * fVec, double *qVec, double * storeLeadF, double * storeLeadQ)
16330 {
16331  for (InstanceVector::const_iterator it = getInstanceBegin(); it != getInstanceEnd(); ++it)
16332  {
16333  Instance & mi = *(*it);
16334 
16335  double * dFdxdVp = mi.extData.dFdxdVpVectorRawPtr;
16336  double * dQdxdVp = mi.extData.dQdxdVpVectorRawPtr;
16337  double coef(0.0);
16338 
16339  mi.setupFVectorVars ();
16340 
16341  // Loading F-vector
16342  fVec[mi.li_DrainPrime] += -(mi.ceqjd - mi.ceqbd - mi.ceqdrn + mi.Idtoteq)*mi.numberParallel;
16343  fVec[mi.li_GatePrime] -= -(-mi.ceqgcrg + mi.Igtoteq)*mi.numberParallel;
16344 
16345  if (mi.rgateMod == 1)
16346  {
16347  fVec[mi.li_GateExt ] -= -(mi.Igate)*mi.numberParallel;
16348  fVec[mi.li_GatePrime] += -(mi.Igate)*mi.numberParallel;
16349  }
16350  else if (mi.rgateMod == 2)
16351  {
16352  fVec[mi.li_GateExt] -= -(mi.Igate + mi.ceqgcrg)*mi.numberParallel;
16353  fVec[mi.li_GatePrime] += -(mi.Igate)*mi.numberParallel;
16354  }
16355  else if (mi.rgateMod == 3)
16356  {
16357  fVec[mi.li_GateExt] -= -(mi.Igate)*mi.numberParallel;
16358  fVec[mi.li_GateMid] -= -(mi.IgateMid - mi.Igate + mi.ceqgcrg)*mi.numberParallel;
16359  fVec[mi.li_GatePrime] += -(mi.IgateMid)*mi.numberParallel;
16360  }
16361 
16362  if (!mi.rbodyMod)
16363  {
16364  fVec[mi.li_BodyPrime] += -(mi.ceqbd + mi.ceqbs - mi.ceqjd - mi.ceqjs + mi.Ibtoteq)*mi.numberParallel;
16365  fVec[mi.li_SourcePrime] += -(mi.ceqdrn - mi.ceqbs + mi.ceqjs + mi.Istoteq)*mi.numberParallel;
16366  }
16367  else
16368  {
16369  fVec[mi.li_DrainBody] -= -(mi.ceqjd + mi.Idbb + mi.Idbbp)*mi.numberParallel;
16370  fVec[mi.li_BodyPrime] += -(mi.ceqbd + mi.ceqbs + mi.Ibtoteq +
16371  mi.Idbbp + mi.Isbbp - mi.Ibpb)*mi.numberParallel;
16372  fVec[mi.li_Body] += - (mi.Isbb + mi.Idbb + mi.Ibpb)*mi.numberParallel;
16373  fVec[mi.li_SourceBody] -= -(mi.ceqjs + mi.Isbb + mi.Isbbp)*mi.numberParallel;
16374  fVec[mi.li_SourcePrime] += -(mi.ceqdrn - mi.ceqbs + mi.ceqjs + mi.Istoteq)*mi.numberParallel;
16375  }
16376 
16377  if (mi.getModel().rdsMod)
16378  {
16379  fVec[mi.li_Drain] += -(-mi.ceqgdtot)*mi.numberParallel;
16380  fVec[mi.li_Source] += -(mi.ceqgstot)*mi.numberParallel;
16381  fVec[mi.li_DrainPrime] += -(mi.ceqgdtot)*mi.numberParallel;
16382  fVec[mi.li_SourcePrime] += -(-mi.ceqgstot)*mi.numberParallel;
16383  }
16384 
16385  // Idrain, Isource are linear terminal resistor currents
16386  if (mi.drainMOSFET_B4Exists)
16387  {
16388  fVec[mi.li_Drain] += -(-mi.Idrain)*mi.numberParallel;
16389  fVec[mi.li_DrainPrime] += -(mi.Idrain)*mi.numberParallel;
16390  }
16391 
16392  if (mi.sourceMOSFET_B4Exists)
16393  {
16394  fVec[mi.li_Source] += -(-mi.Isource)*mi.numberParallel;
16395  fVec[mi.li_SourcePrime] += -(+mi.Isource)*mi.numberParallel;
16396  }
16397 
16398  // Initial condition support:
16399  if (getSolverState().dcopFlag && mi.icVBSGiven)
16400  {
16401  coef = mi.extData.nextSolVectorRawPtr[mi.li_Ibs];
16402  fVec[mi.li_Body] += coef;
16403  fVec[mi.li_Source] += -coef;
16404  double cVs = mi.extData.nextSolVectorRawPtr[mi.li_Source];
16405  double cVb = mi.extData.nextSolVectorRawPtr[mi.li_Body];
16406  fVec[mi.li_Ibs] += (cVb-cVs-mi.icVBS);
16407  }
16408 
16409  if (getSolverState().dcopFlag && mi.icVDSGiven)
16410  {
16411  coef = mi.extData.nextSolVectorRawPtr[mi.li_Ids];
16412  fVec[mi.li_Drain] += coef;
16413  fVec[mi.li_Source] += -coef;
16414  double cVs = mi.extData.nextSolVectorRawPtr[mi.li_Source];
16415  double cVd = mi.extData.nextSolVectorRawPtr[mi.li_Drain];
16416  fVec[mi.li_Ids] += (cVd-cVs-mi.icVDS);
16417  }
16418 
16419  if (getSolverState().dcopFlag && mi.icVGSGiven)
16420  {
16421  coef = mi.extData.nextSolVectorRawPtr[mi.li_Igs];
16422  fVec[mi.li_GateExt] += coef;
16423  fVec[mi.li_Source] += -coef;
16424  double cVs = mi.extData.nextSolVectorRawPtr[mi.li_Source];
16425  double cVg = mi.extData.nextSolVectorRawPtr[mi.li_GateExt];
16426  fVec[mi.li_Igs] += (cVg-cVs-mi.icVGS);
16427  }
16428 
16429  // limiter section
16431  {
16432  dFdxdVp[mi.li_DrainPrime] += (mi.ceqjd_Jdxp - mi.ceqbd_Jdxp - mi.ceqdrn_Jdxp + mi.Idtoteq_Jdxp)*mi.numberParallel;
16433  dFdxdVp[mi.li_GatePrime] -= (- mi.ceqgcrg_Jdxp + mi.Igtoteq_Jdxp)*mi.numberParallel;
16434 
16435  if (mi.rgateMod == 1)
16436  {
16437  dFdxdVp[mi.li_GateExt ] -= (mi.Igate_Jdxp)*mi.numberParallel;
16438  dFdxdVp[mi.li_GatePrime] += (mi.Igate_Jdxp)*mi.numberParallel;
16439  }
16440  else if (mi.rgateMod == 2)
16441  {
16442  dFdxdVp[mi.li_GateExt] -= (mi.Igate_Jdxp + mi.ceqgcrg_Jdxp)*mi.numberParallel;
16443  dFdxdVp[mi.li_GatePrime] += (mi.Igate_Jdxp)*mi.numberParallel;
16444  }
16445  else if (mi.rgateMod == 3)
16446  {
16447  dFdxdVp[mi.li_GateExt] -= (mi.Igate_Jdxp)*mi.numberParallel;
16448  dFdxdVp[mi.li_GateMid] -= (mi.IgateMid_Jdxp - mi.Igate_Jdxp + mi.ceqgcrg_Jdxp)*mi.numberParallel;
16449  dFdxdVp[mi.li_GatePrime] += (mi.IgateMid_Jdxp)*mi.numberParallel;
16450  }
16451 
16452  if (!mi.rbodyMod)
16453  {
16454  dFdxdVp[mi.li_BodyPrime] += (mi.ceqbd_Jdxp + mi.ceqbs_Jdxp - mi.ceqjd_Jdxp - mi.ceqjs_Jdxp + mi.Ibtoteq_Jdxp)*mi.numberParallel;
16455  dFdxdVp[mi.li_SourcePrime] += (mi.ceqdrn_Jdxp - mi.ceqbs_Jdxp + mi.ceqjs_Jdxp + mi.Istoteq_Jdxp)*mi.numberParallel;
16456  }
16457  else
16458  {
16459  dFdxdVp[mi.li_DrainBody] -= (mi.ceqjd_Jdxp)*mi.numberParallel;
16460  dFdxdVp[mi.li_BodyPrime] += (mi.ceqbd_Jdxp + mi.ceqbs_Jdxp + mi.Ibtoteq_Jdxp)*mi.numberParallel;
16461  dFdxdVp[mi.li_SourceBody] -= (mi.ceqjs_Jdxp )*mi.numberParallel;
16462  dFdxdVp[mi.li_SourcePrime] += (mi.ceqdrn_Jdxp - mi.ceqbs_Jdxp + mi.ceqjs_Jdxp + mi.Istoteq_Jdxp)*mi.numberParallel;
16463  }
16464 
16465  if (mi.getModel().rdsMod)
16466  {
16467  dFdxdVp[mi.li_Drain] -= (mi.ceqgdtot_Jdxp)*mi.numberParallel;
16468  dFdxdVp[mi.li_Source] += (mi.ceqgstot_Jdxp)*mi.numberParallel;
16469  dFdxdVp[mi.li_DrainPrime] += (mi.ceqgdtot_Jdxp)*mi.numberParallel;
16470  dFdxdVp[mi.li_SourcePrime] -= (mi.ceqgstot_Jdxp)*mi.numberParallel;
16471  }
16472  }
16473 
16474  // Loading Q-vector
16475  mi.auxChargeCalculations ();
16476 
16477  double Qeqqg = 0.0; // gate charge
16478  double Qeqqb = 0.0; // bulk charge
16479  double Qeqqd = 0.0; // drain charge
16480  double Qeqqgmid = 0.0; //
16481  double Qeqqjs = 0.0; // source-junction charge
16482  double Qeqqjd = 0.0; // drain-junction charge
16483  double Qqdef = 0.0; // nqs-related charge.
16484  double Qqcheq = 0.0; // nqs-related charge.
16485 
16486  if (mi.getModel().dtype > 0)
16487  {
16488  Qeqqg = mi.qg;
16489  Qeqqd = mi.qd;
16490  Qeqqb = mi.qb;
16491 
16492  if (mi.trnqsMod)
16493  {
16494  Qqdef = mi.qdef;
16495  Qqcheq = mi.qcheq;
16496  }
16497 
16498  if (mi.rbodyMod)
16499  {
16500  Qeqqjs = mi.qbs;
16501  Qeqqjd = mi.qbd;
16502  }
16503 
16504  if (mi.rgateMod == 3)
16505  {
16506  Qeqqgmid = mi.qgmid;
16507  }
16508  }
16509  else
16510  {
16511  Qeqqg = -mi.qg;
16512  Qeqqd = -mi.qd;
16513  Qeqqb = -mi.qb;
16514 
16515  if (mi.trnqsMod)
16516  {
16517  Qqdef = -mi.qdef;
16518  Qqcheq = -mi.qcheq;
16519  }
16520 
16521  if (mi.rbodyMod)
16522  {
16523  Qeqqjs = -mi.qbs;
16524  Qeqqjd = -mi.qbd;
16525  }
16526 
16527  if (mi.rgateMod == 3)
16528  {
16529  Qeqqgmid = -mi.qgmid;
16530  }
16531  }
16532 
16533  // Loading q-vector:
16534 
16535  qVec[mi.li_DrainPrime] += -(-Qeqqd)*mi.numberParallel;
16536 
16537  qVec[mi.li_GatePrime] -= -(Qeqqg)*mi.numberParallel;
16538 
16539  if (mi.rgateMod == 3)
16540  {
16541  qVec[mi.li_GateMid] -= -(+Qeqqgmid)*mi.numberParallel;
16542  }
16543 
16544  if (!mi.rbodyMod)
16545  {
16546  qVec[mi.li_BodyPrime] += -(-Qeqqb)*mi.numberParallel;
16547  qVec[mi.li_SourcePrime] += -(+Qeqqg + Qeqqb + Qeqqd + Qeqqgmid)*mi.numberParallel;
16548  }
16549  else
16550  {
16551  qVec[mi.li_DrainBody] -= -(Qeqqjd)*mi.numberParallel;
16552  qVec[mi.li_BodyPrime] += -(-Qeqqb)*mi.numberParallel;
16553  qVec[mi.li_SourceBody] -= -(Qeqqjs)*mi.numberParallel;
16554  qVec[mi.li_SourcePrime] += -(Qeqqd + Qeqqg + Qeqqb + Qeqqjd + Qeqqjs + Qeqqgmid)*mi.numberParallel;
16555  }
16556 
16557  if (mi.trnqsMod)
16558  {
16559  qVec[mi.li_Charge] += -(Qqcheq - Qqdef)*mi.numberParallel;
16560  }
16561 
16562  // limiter section
16564  {
16565  dQdxdVp[mi.li_DrainPrime] += (-mi.Qeqqd_Jdxp)*mi.numberParallel;
16566  dQdxdVp[mi.li_GatePrime] -= (mi.Qeqqg_Jdxp)*mi.numberParallel;
16567 
16568  if (mi.rgateMod == 3)
16569  {
16570  dQdxdVp[mi.li_GateMid] -= (+mi.Qeqqgmid_Jdxp)*mi.numberParallel;
16571  }
16572 
16573  if (!mi.rbodyMod)
16574  {
16575  dQdxdVp[mi.li_BodyPrime] += (-mi.Qeqqb_Jdxp)*mi.numberParallel;
16576  dQdxdVp[mi.li_SourcePrime] += (+mi.Qeqqg_Jdxp + mi.Qeqqb_Jdxp + mi.Qeqqd_Jdxp + mi.Qeqqgmid_Jdxp)*mi.numberParallel;
16577  }
16578  else
16579  {
16580  dQdxdVp[mi.li_DrainBody] -= (mi.Qeqqjd_Jdxp)*mi.numberParallel;
16581  dQdxdVp[mi.li_BodyPrime] += (-mi.Qeqqb_Jdxp)*mi.numberParallel;
16582  dQdxdVp[mi.li_SourceBody] -= (+mi.Qeqqjs_Jdxp)*mi.numberParallel;
16583  dQdxdVp[mi.li_SourcePrime] += (+mi.Qeqqd_Jdxp + mi.Qeqqg_Jdxp + mi.Qeqqb_Jdxp + mi.Qeqqjd_Jdxp + mi.Qeqqjs_Jdxp + mi.Qeqqgmid_Jdxp)*mi.numberParallel;
16584  }
16585 
16586  if (mi.trnqsMod)
16587  {
16588  dQdxdVp[mi.li_Charge] += (mi.Qqcheq_Jdxp)*mi.numberParallel;
16589  }
16590  }
16591  }
16592  return true;
16593 }
16594 
16595 //-----------------------------------------------------------------------------
16596 // Function : Master::loadDAEMatrices
16597 // Purpose :
16598 // Special Notes :
16599 // Scope : public
16600 // Creator : Eric Keiter, SNL
16601 // Creation Date : 11/26/08
16602 //-----------------------------------------------------------------------------
16603 bool Master::loadDAEMatrices (N_LAS_Matrix & dFdx, N_LAS_Matrix & dQdx)
16604 {
16605  for (InstanceVector::const_iterator it = getInstanceBegin(); it != getInstanceEnd(); ++it)
16606  {
16607  Instance & mi = *(*it);
16608 
16609  // F-matrix:
16610  if (!mi.rbodyMod)
16611  {
16612  mi.gjbd = mi.gbd;
16613  mi.gjbs = mi.gbs;
16614  }
16615  else
16616  {
16617  mi.gjbd = mi.gjbs = 0.0;
16618  }
16619 
16620  if (!mi.getModel().rdsMod)
16621  {
16622  mi.gdpr = mi.drainConductance;
16623  mi.gspr = mi.sourceConductance;
16624  }
16625  else
16626  {
16627  mi.gdpr = mi.gspr = 0.0;
16628  }
16629 
16630  mi.geltd = mi.grgeltd;
16631 
16632  double T1 = mi.qdef * mi.gtau;
16633 
16634 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
16635  if (mi.rgateMod == 1)
16636  {
16637  *mi.f_GEgePtr += (mi.geltd)*mi.numberParallel;
16638  *mi.f_GEgpPtr -= (mi.geltd)*mi.numberParallel;
16639  *mi.f_GPgePtr -= (mi.geltd)*mi.numberParallel;
16640  *mi.f_GPgpPtr += (+ mi.geltd - mi.ggtg + mi.gIgtotg)*mi.numberParallel;
16641  *mi.f_GPdpPtr += (- mi.ggtd + mi.gIgtotd)*mi.numberParallel;
16642  *mi.f_GPspPtr += (- mi.ggts + mi.gIgtots)*mi.numberParallel;
16643  *mi.f_GPbpPtr += (- mi.ggtb + mi.gIgtotb)*mi.numberParallel;
16644  } // WDLiu: gcrg already subtracted from all gcrgg below
16645  else if (mi.rgateMod == 2)
16646  {
16647  *mi.f_GEgePtr += (mi.gcrg)*mi.numberParallel;
16648  *mi.f_GEgpPtr += (mi.gcrgg)*mi.numberParallel;
16649  *mi.f_GEdpPtr += (mi.gcrgd)*mi.numberParallel;
16650  *mi.f_GEspPtr += (mi.gcrgs)*mi.numberParallel;
16651  *mi.f_GEbpPtr += (mi.gcrgb)*mi.numberParallel;
16652 
16653  *mi.f_GPgePtr -= (mi.gcrg)*mi.numberParallel;
16654  *mi.f_GPgpPtr += (- mi.gcrgg - mi.ggtg + mi.gIgtotg)*mi.numberParallel;
16655  *mi.f_GPdpPtr += (- mi.gcrgd - mi.ggtd + mi.gIgtotd)*mi.numberParallel;
16656  *mi.f_GPspPtr += (- mi.gcrgs - mi.ggts + mi.gIgtots)*mi.numberParallel;
16657  *mi.f_GPbpPtr += (- mi.gcrgb - mi.ggtb + mi.gIgtotb)*mi.numberParallel;
16658  }
16659  else if (mi.rgateMod == 3)
16660  {
16661  *mi.f_GEgePtr += (mi.geltd)*mi.numberParallel;
16662  *mi.f_GEgmPtr -= (mi.geltd)*mi.numberParallel;
16663  *mi.f_GMgePtr -= (mi.geltd)*mi.numberParallel;
16664  *mi.f_GMgmPtr += (mi.geltd + mi.gcrg)*mi.numberParallel;
16665 
16666  *mi.f_GMdpPtr += (mi.gcrgd)*mi.numberParallel;
16667  *mi.f_GMgpPtr += (mi.gcrgg)*mi.numberParallel;
16668  *mi.f_GMspPtr += (mi.gcrgs)*mi.numberParallel;
16669  *mi.f_GMbpPtr += (mi.gcrgb)*mi.numberParallel;
16670 
16671  *mi.f_GPgmPtr -= (mi.gcrg)*mi.numberParallel;
16672 
16673  *mi.f_GPgpPtr += (- mi.gcrgg - mi.ggtg + mi.gIgtotg)*mi.numberParallel;
16674  *mi.f_GPdpPtr += (- mi.gcrgd - mi.ggtd + mi.gIgtotd)*mi.numberParallel;
16675  *mi.f_GPspPtr += (- mi.gcrgs - mi.ggts + mi.gIgtots)*mi.numberParallel;
16676  *mi.f_GPbpPtr += (- mi.gcrgb - mi.ggtb + mi.gIgtotb)*mi.numberParallel;
16677  }
16678  else
16679  {
16680  *mi.f_GPgpPtr += (- mi.ggtg + mi.gIgtotg)*mi.numberParallel;
16681  *mi.f_GPdpPtr += (- mi.ggtd + mi.gIgtotd)*mi.numberParallel;
16682  *mi.f_GPspPtr += (- mi.ggts + mi.gIgtots)*mi.numberParallel;
16683  *mi.f_GPbpPtr += (- mi.ggtb + mi.gIgtotb)*mi.numberParallel;
16684  }
16685 
16686  if (mi.getModel().rdsMod)
16687  {
16688  *mi.f_DgpPtr += (mi.gdtotg)*mi.numberParallel;
16689  *mi.f_DspPtr += (mi.gdtots)*mi.numberParallel;
16690  *mi.f_DbpPtr += (mi.gdtotb)*mi.numberParallel;
16691  *mi.f_SdpPtr += (mi.gstotd)*mi.numberParallel;
16692  *mi.f_SgpPtr += (mi.gstotg)*mi.numberParallel;
16693  *mi.f_SbpPtr += (mi.gstotb)*mi.numberParallel;
16694  }
16695 
16696 
16697  *mi.f_DPdpPtr += (mi.gdpr + mi.gds + mi.gbd + T1 * mi.ddxpart_dVd
16698  - mi.gdtotd + mi.RevSum + mi.gbdpdp + mi.dxpart * mi.ggtd - mi.gIdtotd)*mi.numberParallel;
16699 
16700 
16701  *mi.f_DPdPtr -= (mi.gdpr + mi.gdtot)*mi.numberParallel;
16702 
16703  *mi.f_DPgpPtr += (mi.Gm - mi.gdtotg + mi.gbdpg - mi.gIdtotg
16704  + mi.dxpart * mi.ggtg + T1 * mi.ddxpart_dVg)*mi.numberParallel;
16705 
16706 
16707  *mi.f_DPspPtr -= (mi.gds + mi.gdtots - mi.dxpart * mi.ggts + mi.gIdtots
16708  - T1 * mi.ddxpart_dVs + mi.FwdSum - mi.gbdpsp)*mi.numberParallel;
16709 
16710 
16711  *mi.f_DPbpPtr -= (mi.gjbd + mi.gdtotb - mi.Gmbs - mi.gbdpb + mi.gIdtotb
16712  - T1 * mi.ddxpart_dVb - mi.dxpart * mi.ggtb)*mi.numberParallel;
16713 
16714 
16715  *mi.f_DdpPtr -= (mi.gdpr - mi.gdtotd)*mi.numberParallel;
16716 
16717  *mi.f_DdPtr += (mi.gdpr + mi.gdtot)*mi.numberParallel;
16718 
16719 
16720  *mi.f_SPdpPtr -= (mi.gds + mi.gstotd + mi.RevSum - mi.gbspdp
16721  - T1 * mi.dsxpart_dVd - mi.sxpart * mi.ggtd + mi.gIstotd)*mi.numberParallel;
16722 
16723 
16724  *mi.f_SPgpPtr += (- mi.Gm - mi.gstotg + mi.gbspg + mi.sxpart * mi.ggtg
16725  + T1 * mi.dsxpart_dVg - mi.gIstotg)*mi.numberParallel;
16726 
16727 
16728  *mi.f_SPspPtr += (mi.gspr + mi.gds + mi.gbs + T1 * mi.dsxpart_dVs
16729  - mi.gstots + mi.FwdSum + mi.gbspsp + mi.sxpart * mi.ggts - mi.gIstots)*mi.numberParallel;
16730 
16731 
16732  *mi.f_SPsPtr -= (mi.gspr + mi.gstot)*mi.numberParallel;
16733 
16734 
16735  *mi.f_SPbpPtr -= (mi.gjbs + mi.gstotb + mi.Gmbs - mi.gbspb - mi.sxpart * mi.ggtb
16736  - T1 * mi.dsxpart_dVb + mi.gIstotb)*mi.numberParallel;
16737 
16738 
16739  *mi.f_SspPtr -= (mi.gspr - mi.gstots)*mi.numberParallel;
16740 
16741  *mi.f_SsPtr += (mi.gspr + mi.gstot)*mi.numberParallel;
16742 
16743 
16744  *mi.f_BPdpPtr += (- mi.gjbd + mi.gbbdp - mi.gIbtotd)*mi.numberParallel;
16745 
16746  *mi.f_BPgpPtr += (- mi.gbgs - mi.gIbtotg)*mi.numberParallel;
16747 
16748  *mi.f_BPspPtr += (- mi.gjbs + mi.gbbsp - mi.gIbtots)*mi.numberParallel;
16749 
16750  *mi.f_BPbpPtr += (mi.gjbd + mi.gjbs - mi.gbbs - mi.gIbtotb)*mi.numberParallel;
16751 
16752  //ggidld = (ggidld)*mi.numberParallel;
16753  //ggidlg = (ggidlg)*mi.numberParallel;
16754  //ggidlb = (ggidlb)*mi.numberParallel;
16755  //ggislg = (ggislg)*mi.numberParallel;
16756  //ggisls = (ggisls)*mi.numberParallel;
16757  //ggislb = (ggislb)*mi.numberParallel;
16758 
16759  // stamp gidl
16760 
16761  *mi.f_DPdpPtr += (mi.ggidld)*mi.numberParallel;
16762 
16763  *mi.f_DPgpPtr += (mi.ggidlg)*mi.numberParallel;
16764 
16765  *mi.f_DPspPtr -= ((mi.ggidlg + mi.ggidld + mi.ggidlb))*mi.numberParallel;
16766 
16767  *mi.f_DPbpPtr += (mi.ggidlb)*mi.numberParallel;
16768 
16769  *mi.f_BPdpPtr -= (mi.ggidld)*mi.numberParallel;
16770 
16771  *mi.f_BPgpPtr -= (mi.ggidlg)*mi.numberParallel;
16772 
16773  *mi.f_BPspPtr += ((mi.ggidlg + mi.ggidld + mi.ggidlb))*mi.numberParallel;
16774 
16775  *mi.f_BPbpPtr -= (mi.ggidlb)*mi.numberParallel;
16776  // stamp gisl
16777 
16778  *mi.f_SPdpPtr -= ((mi.ggisls + mi.ggislg + mi.ggislb))*mi.numberParallel;
16779 
16780  *mi.f_SPgpPtr += (mi.ggislg)*mi.numberParallel;
16781 
16782  *mi.f_SPspPtr += (mi.ggisls)*mi.numberParallel;
16783 
16784  *mi.f_SPbpPtr += (mi.ggislb)*mi.numberParallel;
16785 
16786  *mi.f_BPdpPtr += ((mi.ggislg + mi.ggisls + mi.ggislb))*mi.numberParallel;
16787 
16788  *mi.f_BPgpPtr -= (mi.ggislg)*mi.numberParallel;
16789 
16790  *mi.f_BPspPtr -= (mi.ggisls)*mi.numberParallel;
16791 
16792  *mi.f_BPbpPtr -= (mi.ggislb)*mi.numberParallel;
16793 
16794 
16795  if (mi.rbodyMod)
16796  {
16797  *mi.f_DPdbPtr += (- mi.gbd)*mi.numberParallel;
16798  *mi.f_SPsbPtr -= (mi.gbs)*mi.numberParallel;
16799 
16800  *mi.f_DBdpPtr += (- mi.gbd)*mi.numberParallel;
16801  *mi.f_DBdbPtr += (mi.gbd + mi.grbpd + mi.grbdb)*mi.numberParallel;
16802  *mi.f_DBbpPtr -= (mi.grbpd)*mi.numberParallel;
16803  *mi.f_DBbPtr -= (mi.grbdb)*mi.numberParallel;
16804 
16805  *mi.f_BPdbPtr -= (mi.grbpd)*mi.numberParallel;
16806  *mi.f_BPbPtr -= (mi.grbpb)*mi.numberParallel;
16807  *mi.f_BPsbPtr -= (mi.grbps)*mi.numberParallel;
16808  *mi.f_BPbpPtr += (mi.grbpd + mi.grbps + mi.grbpb)*mi.numberParallel;
16809  // WDLiu: (gcbbb - gbbs) already added to mi.BPbpPtr
16810 
16811  *mi.f_SBspPtr += (- mi.gbs)*mi.numberParallel;
16812  *mi.f_SBbpPtr -= (mi.grbps)*mi.numberParallel;
16813  *mi.f_SBbPtr -= (mi.grbsb)*mi.numberParallel;
16814  *mi.f_SBsbPtr += (mi.gbs + mi.grbps + mi.grbsb)*mi.numberParallel;
16815 
16816  *mi.f_BdbPtr -= (mi.grbdb)*mi.numberParallel;
16817  *mi.f_BbpPtr -= (mi.grbpb)*mi.numberParallel;
16818  *mi.f_BsbPtr -= (mi.grbsb)*mi.numberParallel;
16819  *mi.f_BbPtr += (mi.grbsb + mi.grbdb + mi.grbpb)*mi.numberParallel;
16820  }
16821 
16822  if (mi.trnqsMod)
16823  {
16824  *mi.f_QqPtr += (mi.gqdef + mi.gtau)*mi.numberParallel;
16825  *mi.f_QgpPtr += (mi.ggtg)*mi.numberParallel;
16826  *mi.f_QdpPtr += (mi.ggtd)*mi.numberParallel;
16827  *mi.f_QspPtr += (mi.ggts)*mi.numberParallel;
16828  *mi.f_QbpPtr += (mi.ggtb)*mi.numberParallel;
16829 
16830  *mi.f_DPqPtr += (mi.dxpart * mi.gtau)*mi.numberParallel;
16831  *mi.f_SPqPtr += (mi.sxpart * mi.gtau)*mi.numberParallel;
16832  *mi.f_GPqPtr -= (mi.gtau)*mi.numberParallel;
16833  }
16834 
16835  // Initial Conditions:
16836  if (mi.icVBSGiven)
16837  {
16838  if (getSolverState().dcopFlag)
16839  {
16840  *mi.f_BibsPtr += 1.0;
16841  *mi.f_SibsPtr += -1.0;
16842  *mi.f_IBSbPtr += 1.0;
16843  *mi.f_IBSsPtr += -1.0;
16844  }
16845  else
16846  {
16847  *mi.f_IBSibsPtr = 1.0;
16848  }
16849  }
16850 
16851  if (mi.icVDSGiven)
16852  {
16853  if (getSolverState().dcopFlag)
16854  {
16855  *mi.f_DidsPtr += 1.0;
16856  *mi.f_SidsPtr += -1.0;
16857  *mi.f_IDSdPtr += 1.0;
16858  *mi.f_IDSsPtr += -1.0;
16859  }
16860  else
16861  {
16862  *mi.f_IDSidsPtr = 1.0;
16863  }
16864  }
16865 
16866  if (mi.icVGSGiven)
16867  {
16868  if (getSolverState().dcopFlag)
16869  {
16870  *mi.f_GEigsPtr += 1.0;
16871  *mi.f_SigsPtr += -1.0;
16872  *mi.f_IGSgPtr += 1.0;
16873  *mi.f_IGSsPtr += -1.0;
16874  }
16875  else
16876  {
16877  *mi.f_IGSigsPtr = 1.0;
16878  }
16879  }
16880 
16881 #else
16882  if (mi.rgateMod == 1)
16883  {
16884  dFdx[mi.li_GateExt][mi.GEge] += (mi.geltd)*mi.numberParallel;
16885  dFdx[mi.li_GateExt][mi.GEgp] -= (mi.geltd)*mi.numberParallel;
16886  dFdx[mi.li_GatePrime][mi.GPge] -= (mi.geltd)*mi.numberParallel;
16887  dFdx[mi.li_GatePrime][mi.GPgp] += (+ mi.geltd - mi.ggtg + mi.gIgtotg)*mi.numberParallel;
16888  dFdx[mi.li_GatePrime][mi.GPdp] += (- mi.ggtd + mi.gIgtotd)*mi.numberParallel;
16889  dFdx[mi.li_GatePrime][mi.GPsp] += (- mi.ggts + mi.gIgtots)*mi.numberParallel;
16890  dFdx[mi.li_GatePrime][mi.GPbp] += (- mi.ggtb + mi.gIgtotb)*mi.numberParallel;
16891  } // WDLiu: gcrg already subtracted from all gcrgg below
16892  else if (mi.rgateMod == 2)
16893  {
16894  dFdx[mi.li_GateExt][mi.GEge] += (mi.gcrg)*mi.numberParallel;
16895  dFdx[mi.li_GateExt][mi.GEgp] += (mi.gcrgg)*mi.numberParallel;
16896  dFdx[mi.li_GateExt][mi.GEdp] += (mi.gcrgd)*mi.numberParallel;
16897  dFdx[mi.li_GateExt][mi.GEsp] += (mi.gcrgs)*mi.numberParallel;
16898  dFdx[mi.li_GateExt][mi.GEbp] += (mi.gcrgb)*mi.numberParallel;
16899 
16900  dFdx[mi.li_GatePrime][mi.GPge] -= (mi.gcrg)*mi.numberParallel;
16901  dFdx[mi.li_GatePrime][mi.GPgp] += (- mi.gcrgg - mi.ggtg + mi.gIgtotg)*mi.numberParallel;
16902  dFdx[mi.li_GatePrime][mi.GPdp] += (- mi.gcrgd - mi.ggtd + mi.gIgtotd)*mi.numberParallel;
16903  dFdx[mi.li_GatePrime][mi.GPsp] += (- mi.gcrgs - mi.ggts + mi.gIgtots)*mi.numberParallel;
16904  dFdx[mi.li_GatePrime][mi.GPbp] += (- mi.gcrgb - mi.ggtb + mi.gIgtotb)*mi.numberParallel;
16905  }
16906  else if (mi.rgateMod == 3)
16907  {
16908  dFdx[mi.li_GateExt][mi.GEge] += (mi.geltd)*mi.numberParallel;
16909  dFdx[mi.li_GateExt][mi.GEgm] -= (mi.geltd)*mi.numberParallel;
16910  dFdx[mi.li_GateMid][mi.GMge] -= (mi.geltd)*mi.numberParallel;
16911  dFdx[mi.li_GateMid][mi.GMgm] += (mi.geltd + mi.gcrg)*mi.numberParallel;
16912 
16913  dFdx[mi.li_GateMid][mi.GMdp] += (mi.gcrgd)*mi.numberParallel;
16914  dFdx[mi.li_GateMid][mi.GMgp] += (mi.gcrgg)*mi.numberParallel;
16915  dFdx[mi.li_GateMid][mi.GMsp] += (mi.gcrgs)*mi.numberParallel;
16916  dFdx[mi.li_GateMid][mi.GMbp] += (mi.gcrgb)*mi.numberParallel;
16917 
16918  dFdx[mi.li_GatePrime][mi.GPgm] -= (mi.gcrg)*mi.numberParallel;
16919 
16920  dFdx[mi.li_GatePrime][mi.GPgp] += (- mi.gcrgg - mi.ggtg + mi.gIgtotg)*mi.numberParallel;
16921  dFdx[mi.li_GatePrime][mi.GPdp] += (- mi.gcrgd - mi.ggtd + mi.gIgtotd)*mi.numberParallel;
16922  dFdx[mi.li_GatePrime][mi.GPsp] += (- mi.gcrgs - mi.ggts + mi.gIgtots)*mi.numberParallel;
16923  dFdx[mi.li_GatePrime][mi.GPbp] += (- mi.gcrgb - mi.ggtb + mi.gIgtotb)*mi.numberParallel;
16924  }
16925  else
16926  {
16927  dFdx[mi.li_GatePrime][mi.GPgp] += (- mi.ggtg + mi.gIgtotg)*mi.numberParallel;
16928  dFdx[mi.li_GatePrime][mi.GPdp] += (- mi.ggtd + mi.gIgtotd)*mi.numberParallel;
16929  dFdx[mi.li_GatePrime][mi.GPsp] += (- mi.ggts + mi.gIgtots)*mi.numberParallel;
16930  dFdx[mi.li_GatePrime][mi.GPbp] += (- mi.ggtb + mi.gIgtotb)*mi.numberParallel;
16931  }
16932 
16933  if (mi.getModel().rdsMod)
16934  {
16935  dFdx[mi.li_Drain][mi.Dgp] += (mi.gdtotg)*mi.numberParallel;
16936  dFdx[mi.li_Drain][mi.Dsp] += (mi.gdtots)*mi.numberParallel;
16937  dFdx[mi.li_Drain][mi.Dbp] += (mi.gdtotb)*mi.numberParallel;
16938  dFdx[mi.li_Source][mi.Sdp] += (mi.gstotd)*mi.numberParallel;
16939  dFdx[mi.li_Source][mi.Sgp] += (mi.gstotg)*mi.numberParallel;
16940  dFdx[mi.li_Source][mi.Sbp] += (mi.gstotb)*mi.numberParallel;
16941  }
16942 
16943 
16944  dFdx[mi.li_DrainPrime][mi.DPdp] += (mi.gdpr + mi.gds + mi.gbd + T1 * mi.ddxpart_dVd
16945  - mi.gdtotd + mi.RevSum + mi.gbdpdp + mi.dxpart * mi.ggtd - mi.gIdtotd)*mi.numberParallel;
16946 
16947 
16948  dFdx[mi.li_DrainPrime][mi.DPd] -= (mi.gdpr + mi.gdtot)*mi.numberParallel;
16949 
16950  dFdx[mi.li_DrainPrime][mi.DPgp] += (mi.Gm - mi.gdtotg + mi.gbdpg - mi.gIdtotg
16951  + mi.dxpart * mi.ggtg + T1 * mi.ddxpart_dVg)*mi.numberParallel;
16952 
16953 
16954  dFdx[mi.li_DrainPrime][mi.DPsp] -= (mi.gds + mi.gdtots - mi.dxpart * mi.ggts + mi.gIdtots
16955  - T1 * mi.ddxpart_dVs + mi.FwdSum - mi.gbdpsp)*mi.numberParallel;
16956 
16957 
16958  dFdx[mi.li_DrainPrime][mi.DPbp] -= (mi.gjbd + mi.gdtotb - mi.Gmbs - mi.gbdpb + mi.gIdtotb
16959  - T1 * mi.ddxpart_dVb - mi.dxpart * mi.ggtb)*mi.numberParallel;
16960 
16961 
16962  dFdx[mi.li_Drain][mi.Ddp] -= (mi.gdpr - mi.gdtotd)*mi.numberParallel;
16963 
16964  dFdx[mi.li_Drain][mi.Dd] += (mi.gdpr + mi.gdtot)*mi.numberParallel;
16965 
16966 
16967  dFdx[mi.li_SourcePrime][mi.SPdp] -= (mi.gds + mi.gstotd + mi.RevSum - mi.gbspdp
16968  - T1 * mi.dsxpart_dVd - mi.sxpart * mi.ggtd + mi.gIstotd)*mi.numberParallel;
16969 
16970 
16971  dFdx[mi.li_SourcePrime][mi.SPgp] += (- mi.Gm - mi.gstotg + mi.gbspg + mi.sxpart * mi.ggtg
16972  + T1 * mi.dsxpart_dVg - mi.gIstotg)*mi.numberParallel;
16973 
16974 
16975  dFdx[mi.li_SourcePrime][mi.SPsp] += (mi.gspr + mi.gds + mi.gbs + T1 * mi.dsxpart_dVs
16976  - mi.gstots + mi.FwdSum + mi.gbspsp + mi.sxpart * mi.ggts - mi.gIstots)*mi.numberParallel;
16977 
16978 
16979  dFdx[mi.li_SourcePrime][mi.SPs] -= (mi.gspr + mi.gstot)*mi.numberParallel;
16980 
16981 
16982  dFdx[mi.li_SourcePrime][mi.SPbp] -= (mi.gjbs + mi.gstotb + mi.Gmbs - mi.gbspb - mi.sxpart * mi.ggtb
16983  - T1 * mi.dsxpart_dVb + mi.gIstotb)*mi.numberParallel;
16984 
16985 
16986  dFdx[mi.li_Source][mi.Ssp] -= (mi.gspr - mi.gstots)*mi.numberParallel;
16987 
16988  dFdx[mi.li_Source][mi.Ss] += (mi.gspr + mi.gstot)*mi.numberParallel;
16989 
16990 
16991  dFdx[mi.li_BodyPrime][mi.BPdp] += (- mi.gjbd + mi.gbbdp - mi.gIbtotd)*mi.numberParallel;
16992 
16993  dFdx[mi.li_BodyPrime][mi.BPgp] += (- mi.gbgs - mi.gIbtotg)*mi.numberParallel;
16994 
16995  dFdx[mi.li_BodyPrime][mi.BPsp] += (- mi.gjbs + mi.gbbsp - mi.gIbtots)*mi.numberParallel;
16996 
16997  dFdx[mi.li_BodyPrime][mi.BPbp] += (mi.gjbd + mi.gjbs - mi.gbbs - mi.gIbtotb)*mi.numberParallel;
16998 
16999  //ggidld = (ggidld)*mi.numberParallel;
17000  //ggidlg = (ggidlg)*mi.numberParallel;
17001  //ggidlb = (ggidlb)*mi.numberParallel;
17002  //ggislg = (ggislg)*mi.numberParallel;
17003  //ggisls = (ggisls)*mi.numberParallel;
17004  //ggislb = (ggislb)*mi.numberParallel;
17005 
17006  // stamp gidl
17007 
17008  dFdx[mi.li_DrainPrime][mi.DPdp] += (mi.ggidld)*mi.numberParallel;
17009 
17010  dFdx[mi.li_DrainPrime][mi.DPgp] += (mi.ggidlg)*mi.numberParallel;
17011 
17012  dFdx[mi.li_DrainPrime][mi.DPsp] -= ((mi.ggidlg + mi.ggidld + mi.ggidlb))*mi.numberParallel;
17013 
17014  dFdx[mi.li_DrainPrime][mi.DPbp] += (mi.ggidlb)*mi.numberParallel;
17015 
17016  dFdx[mi.li_BodyPrime][mi.BPdp] -= (mi.ggidld)*mi.numberParallel;
17017 
17018  dFdx[mi.li_BodyPrime][mi.BPgp] -= (mi.ggidlg)*mi.numberParallel;
17019 
17020  dFdx[mi.li_BodyPrime][mi.BPsp] += ((mi.ggidlg + mi.ggidld + mi.ggidlb))*mi.numberParallel;
17021 
17022  dFdx[mi.li_BodyPrime][mi.BPbp] -= (mi.ggidlb)*mi.numberParallel;
17023  // stamp gisl
17024 
17025  dFdx[mi.li_SourcePrime][mi.SPdp] -= ((mi.ggisls + mi.ggislg + mi.ggislb))*mi.numberParallel;
17026 
17027  dFdx[mi.li_SourcePrime][mi.SPgp] += (mi.ggislg)*mi.numberParallel;
17028 
17029  dFdx[mi.li_SourcePrime][mi.SPsp] += (mi.ggisls)*mi.numberParallel;
17030 
17031  dFdx[mi.li_SourcePrime][mi.SPbp] += (mi.ggislb)*mi.numberParallel;
17032 
17033  dFdx[mi.li_BodyPrime][mi.BPdp] += ((mi.ggislg + mi.ggisls + mi.ggislb))*mi.numberParallel;
17034 
17035  dFdx[mi.li_BodyPrime][mi.BPgp] -= (mi.ggislg)*mi.numberParallel;
17036 
17037  dFdx[mi.li_BodyPrime][mi.BPsp] -= (mi.ggisls)*mi.numberParallel;
17038 
17039  dFdx[mi.li_BodyPrime][mi.BPbp] -= (mi.ggislb)*mi.numberParallel;
17040 
17041 
17042  if (mi.rbodyMod)
17043  {
17044  dFdx[mi.li_DrainPrime][mi.DPdb] += (- mi.gbd)*mi.numberParallel;
17045  dFdx[mi.li_SourcePrime][mi.SPsb] -= (mi.gbs)*mi.numberParallel;
17046 
17047  dFdx[mi.li_DrainBody][mi.DBdp] += (- mi.gbd)*mi.numberParallel;
17048  dFdx[mi.li_DrainBody][mi.DBdb] += (mi.gbd + mi.grbpd + mi.grbdb)*mi.numberParallel;
17049  dFdx[mi.li_DrainBody][mi.DBbp] -= (mi.grbpd)*mi.numberParallel;
17050  dFdx[mi.li_DrainBody][mi.DBb] -= (mi.grbdb)*mi.numberParallel;
17051 
17052  dFdx[mi.li_BodyPrime][mi.BPdb] -= (mi.grbpd)*mi.numberParallel;
17053  dFdx[mi.li_BodyPrime][mi.BPb] -= (mi.grbpb)*mi.numberParallel;
17054  dFdx[mi.li_BodyPrime][mi.BPsb] -= (mi.grbps)*mi.numberParallel;
17055  dFdx[mi.li_BodyPrime][mi.BPbp] += (mi.grbpd + mi.grbps + mi.grbpb)*mi.numberParallel;
17056  // WDLiu: (gcbbb - gbbs) already added to mi.BPbpPtr
17057 
17058  dFdx[mi.li_SourceBody][mi.SBsp] += (- mi.gbs)*mi.numberParallel;
17059  dFdx[mi.li_SourceBody][mi.SBbp] -= (mi.grbps)*mi.numberParallel;
17060  dFdx[mi.li_SourceBody][mi.SBb] -= (mi.grbsb)*mi.numberParallel;
17061  dFdx[mi.li_SourceBody][mi.SBsb] += (mi.gbs + mi.grbps + mi.grbsb)*mi.numberParallel;
17062 
17063  dFdx[mi.li_Body][mi.Bdb] -= (mi.grbdb)*mi.numberParallel;
17064  dFdx[mi.li_Body][mi.Bbp] -= (mi.grbpb)*mi.numberParallel;
17065  dFdx[mi.li_Body][mi.Bsb] -= (mi.grbsb)*mi.numberParallel;
17066  dFdx[mi.li_Body][mi.Bb] += (mi.grbsb + mi.grbdb + mi.grbpb)*mi.numberParallel;
17067  }
17068 
17069  if (mi.trnqsMod)
17070  {
17071  dFdx[mi.li_Charge][mi.Qq] += (mi.gqdef + mi.gtau)*mi.numberParallel;
17072  dFdx[mi.li_Charge][mi.Qgp] += (mi.ggtg)*mi.numberParallel;
17073  dFdx[mi.li_Charge][mi.Qdp] += (mi.ggtd)*mi.numberParallel;
17074  dFdx[mi.li_Charge][mi.Qsp] += (mi.ggts)*mi.numberParallel;
17075  dFdx[mi.li_Charge][mi.Qbp] += (mi.ggtb)*mi.numberParallel;
17076 
17077  dFdx[mi.li_DrainPrime][mi.DPq] += (mi.dxpart * mi.gtau)*mi.numberParallel;
17078  dFdx[mi.li_SourcePrime][mi.SPq] += (mi.sxpart * mi.gtau)*mi.numberParallel;
17079  dFdx[mi.li_GatePrime][mi.GPq] -= (mi.gtau)*mi.numberParallel;
17080  }
17081 
17082  // Initial Conditions:
17083  if (mi.icVBSGiven)
17084  {
17085  if (getSolverState().dcopFlag)
17086  {
17087  dFdx[mi.li_Body][mi.Bibs] += 1.0;
17088  dFdx[mi.li_Source][mi.Sibs] += -1.0;
17089  dFdx[mi.li_Ibs][mi.IBSb] += 1.0;
17090  dFdx[mi.li_Ibs][mi.IBSs] += -1.0;
17091  }
17092  else
17093  {
17094  dFdx[mi.li_Ibs][mi.IBSibs] = 1.0;
17095  }
17096  }
17097 
17098  if (mi.icVDSGiven)
17099  {
17100  if (getSolverState().dcopFlag)
17101  {
17102  dFdx[mi.li_Drain][mi.Dids] += 1.0;
17103  dFdx[mi.li_Source][mi.Sids] += -1.0;
17104  dFdx[mi.li_Ids][mi.IDSd] += 1.0;
17105  dFdx[mi.li_Ids][mi.IDSs] += -1.0;
17106  }
17107  else
17108  {
17109  dFdx[mi.li_Ids][mi.IDSids] = 1.0;
17110  }
17111  }
17112 
17113  if (mi.icVGSGiven)
17114  {
17115  if (getSolverState().dcopFlag)
17116  {
17117  dFdx[mi.li_GateExt][mi.GEigs] += 1.0;
17118  dFdx[mi.li_Source][mi.Sigs] += -1.0;
17119  dFdx[mi.li_Igs][mi.IGSg] += 1.0;
17120  dFdx[mi.li_Igs][mi.IGSs] += -1.0;
17121  }
17122  else
17123  {
17124  dFdx[mi.li_Igs][mi.IGSigs] = 1.0;
17125  }
17126  }
17127 
17128 #endif
17129  // Q-matrix:
17131  {
17132  // do nothing, as for this special case q is always zero.
17133  }
17134  else
17135  {
17136  // These are only used for the nqsMod variation
17137  // which isn't currently implemented
17138 
17139 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
17140 
17141  if (mi.rgateMod == 1)
17142  {
17143  *mi.q_GPgpPtr += (mi.CAPcggb)*mi.numberParallel;
17144  *mi.q_GPdpPtr += (mi.CAPcgdb)*mi.numberParallel;
17145  *mi.q_GPspPtr += (mi.CAPcgsb)*mi.numberParallel;
17146  *mi.q_GPbpPtr += (mi.CAPcgbb)*mi.numberParallel;
17147  } // WDLiu: CAPcrg already subtracted from all CAPcrgg below
17148  else if (mi.rgateMod == 2)
17149  {
17150  *mi.q_GPgpPtr += (mi.CAPcggb)*mi.numberParallel;
17151  *mi.q_GPdpPtr += (mi.CAPcgdb)*mi.numberParallel;
17152  *mi.q_GPspPtr += (mi.CAPcgsb)*mi.numberParallel;
17153  *mi.q_GPbpPtr += (mi.CAPcgbb)*mi.numberParallel;
17154  }
17155  else if (mi.rgateMod == 3)
17156  {
17157  *mi.q_GMgmPtr += (+ mi.CAPcgmgmb)*mi.numberParallel;
17158 
17159  *mi.q_GMdpPtr += (mi.CAPcgmdb)*mi.numberParallel;
17160  *mi.q_GMspPtr += (mi.CAPcgmsb)*mi.numberParallel;
17161  *mi.q_GMbpPtr += (mi.CAPcgmbb)*mi.numberParallel;
17162 
17163  *mi.q_DPgmPtr += (mi.CAPcdgmb)*mi.numberParallel;
17164  *mi.q_SPgmPtr += (mi.CAPcsgmb)*mi.numberParallel;
17165  *mi.q_BPgmPtr += (mi.CAPcbgmb)*mi.numberParallel;
17166 
17167  *mi.q_GPgpPtr += (mi.CAPcggb)*mi.numberParallel;
17168  *mi.q_GPdpPtr += (mi.CAPcgdb)*mi.numberParallel;
17169  *mi.q_GPspPtr += (mi.CAPcgsb)*mi.numberParallel;
17170  *mi.q_GPbpPtr += (mi.CAPcgbb)*mi.numberParallel;
17171  }
17172  else
17173  {
17174  *mi.q_GPgpPtr += (mi.CAPcggb)*mi.numberParallel;
17175  *mi.q_GPdpPtr += (mi.CAPcgdb)*mi.numberParallel;
17176  *mi.q_GPspPtr += (mi.CAPcgsb)*mi.numberParallel;
17177  *mi.q_GPbpPtr += (mi.CAPcgbb)*mi.numberParallel;
17178  }
17179 
17180  *mi.q_DPdpPtr += (mi.CAPcddb)*mi.numberParallel;
17181  *mi.q_DPgpPtr += (+ mi.CAPcdgb)*mi.numberParallel;
17182  *mi.q_DPspPtr -= (- mi.CAPcdsb)*mi.numberParallel;
17183  *mi.q_DPbpPtr -= (- mi.CAPcdbb)*mi.numberParallel;
17184 
17185  *mi.q_SPdpPtr -= (- mi.CAPcsdb)*mi.numberParallel;
17186  *mi.q_SPgpPtr += (mi.CAPcsgb)*mi.numberParallel;
17187  *mi.q_SPspPtr += (mi.CAPcssb)*mi.numberParallel;
17188  *mi.q_SPbpPtr -= (- mi.CAPcsbb)*mi.numberParallel;
17189 
17190  *mi.q_BPdpPtr += (mi.CAPcbdb)*mi.numberParallel;
17191  *mi.q_BPgpPtr += (mi.CAPcbgb)*mi.numberParallel;
17192  *mi.q_BPspPtr += (mi.CAPcbsb)*mi.numberParallel;
17193  *mi.q_BPbpPtr += (mi.CAPcbbb)*mi.numberParallel;
17194 
17195  if (mi.rbodyMod)
17196  {
17197  *mi.q_DPdbPtr += (mi.CAPcdbdb)*mi.numberParallel;
17198  *mi.q_SPsbPtr -= (- mi.CAPcsbsb)*mi.numberParallel;
17199 
17200  *mi.q_DBdpPtr += (mi.CAPcdbdb)*mi.numberParallel;
17201  *mi.q_DBdbPtr += (- mi.CAPcdbdb)*mi.numberParallel;
17202 
17203  *mi.q_SBspPtr += (mi.CAPcsbsb)*mi.numberParallel;
17204  *mi.q_SBsbPtr += (- mi.CAPcsbsb)*mi.numberParallel;
17205  }
17206 
17207  if (mi.trnqsMod)
17208  {
17209  *mi.q_QgpPtr += (- mi.CAPcqgb)*mi.numberParallel;
17210  *mi.q_QdpPtr += (- mi.CAPcqdb)*mi.numberParallel;
17211  *mi.q_QspPtr += (- mi.CAPcqsb)*mi.numberParallel;
17212  *mi.q_QbpPtr += (- mi.CAPcqbb)*mi.numberParallel;
17213  }
17214 
17215 #else
17216  if (mi.rgateMod == 1)
17217  {
17218  dQdx[mi.li_GatePrime][mi.GPgp] += (mi.CAPcggb)*mi.numberParallel;
17219  dQdx[mi.li_GatePrime][mi.GPdp] += (mi.CAPcgdb)*mi.numberParallel;
17220  dQdx[mi.li_GatePrime][mi.GPsp] += (mi.CAPcgsb)*mi.numberParallel;
17221  dQdx[mi.li_GatePrime][mi.GPbp] += (mi.CAPcgbb)*mi.numberParallel;
17222  } // WDLiu: CAPcrg already subtracted from all CAPcrgg below
17223  else if (mi.rgateMod == 2)
17224  {
17225  dQdx[mi.li_GatePrime][mi.GPgp] += (mi.CAPcggb)*mi.numberParallel;
17226  dQdx[mi.li_GatePrime][mi.GPdp] += (mi.CAPcgdb)*mi.numberParallel;
17227  dQdx[mi.li_GatePrime][mi.GPsp] += (mi.CAPcgsb)*mi.numberParallel;
17228  dQdx[mi.li_GatePrime][mi.GPbp] += (mi.CAPcgbb)*mi.numberParallel;
17229  }
17230  else if (mi.rgateMod == 3)
17231  {
17232  dQdx[mi.li_GateMid][mi.GMgm] += (+ mi.CAPcgmgmb)*mi.numberParallel;
17233 
17234  dQdx[mi.li_GateMid][mi.GMdp] += (mi.CAPcgmdb)*mi.numberParallel;
17235  dQdx[mi.li_GateMid][mi.GMsp] += (mi.CAPcgmsb)*mi.numberParallel;
17236  dQdx[mi.li_GateMid][mi.GMbp] += (mi.CAPcgmbb)*mi.numberParallel;
17237 
17238  dQdx[mi.li_DrainPrime][mi.DPgm] += (mi.CAPcdgmb)*mi.numberParallel;
17239  dQdx[mi.li_SourcePrime][mi.SPgm] += (mi.CAPcsgmb)*mi.numberParallel;
17240  dQdx[mi.li_BodyPrime][mi.BPgm] += (mi.CAPcbgmb)*mi.numberParallel;
17241 
17242  dQdx[mi.li_GatePrime][mi.GPgp] += (mi.CAPcggb)*mi.numberParallel;
17243  dQdx[mi.li_GatePrime][mi.GPdp] += (mi.CAPcgdb)*mi.numberParallel;
17244  dQdx[mi.li_GatePrime][mi.GPsp] += (mi.CAPcgsb)*mi.numberParallel;
17245  dQdx[mi.li_GatePrime][mi.GPbp] += (mi.CAPcgbb)*mi.numberParallel;
17246  }
17247  else
17248  {
17249  dQdx[mi.li_GatePrime][mi.GPgp] += (mi.CAPcggb)*mi.numberParallel;
17250  dQdx[mi.li_GatePrime][mi.GPdp] += (mi.CAPcgdb)*mi.numberParallel;
17251  dQdx[mi.li_GatePrime][mi.GPsp] += (mi.CAPcgsb)*mi.numberParallel;
17252  dQdx[mi.li_GatePrime][mi.GPbp] += (mi.CAPcgbb)*mi.numberParallel;
17253  }
17254 
17255  dQdx[mi.li_DrainPrime][mi.DPdp] += (mi.CAPcddb)*mi.numberParallel;
17256  dQdx[mi.li_DrainPrime][mi.DPgp] += (+ mi.CAPcdgb)*mi.numberParallel;
17257  dQdx[mi.li_DrainPrime][mi.DPsp] -= (- mi.CAPcdsb)*mi.numberParallel;
17258  dQdx[mi.li_DrainPrime][mi.DPbp] -= (- mi.CAPcdbb)*mi.numberParallel;
17259 
17260  dQdx[mi.li_SourcePrime][mi.SPdp] -= (- mi.CAPcsdb)*mi.numberParallel;
17261  dQdx[mi.li_SourcePrime][mi.SPgp] += (mi.CAPcsgb)*mi.numberParallel;
17262  dQdx[mi.li_SourcePrime][mi.SPsp] += (mi.CAPcssb)*mi.numberParallel;
17263  dQdx[mi.li_SourcePrime][mi.SPbp] -= (- mi.CAPcsbb)*mi.numberParallel;
17264 
17265  dQdx[mi.li_BodyPrime][mi.BPdp] += (mi.CAPcbdb)*mi.numberParallel;
17266  dQdx[mi.li_BodyPrime][mi.BPgp] += (mi.CAPcbgb)*mi.numberParallel;
17267  dQdx[mi.li_BodyPrime][mi.BPsp] += (mi.CAPcbsb)*mi.numberParallel;
17268  dQdx[mi.li_BodyPrime][mi.BPbp] += (mi.CAPcbbb)*mi.numberParallel;
17269 
17270  if (mi.rbodyMod)
17271  {
17272  dQdx[mi.li_DrainPrime][mi.DPdb] += (mi.CAPcdbdb)*mi.numberParallel;
17273  dQdx[mi.li_SourcePrime][mi.SPsb] -= (- mi.CAPcsbsb)*mi.numberParallel;
17274 
17275  dQdx[mi.li_DrainBody][mi.DBdp] += (mi.CAPcdbdb)*mi.numberParallel;
17276  dQdx[mi.li_DrainBody][mi.DBdb] += (- mi.CAPcdbdb)*mi.numberParallel;
17277 
17278  dQdx[mi.li_SourceBody][mi.SBsp] += (mi.CAPcsbsb)*mi.numberParallel;
17279  dQdx[mi.li_SourceBody][mi.SBsb] += (- mi.CAPcsbsb)*mi.numberParallel;
17280  }
17281 
17282  if (mi.trnqsMod)
17283  {
17284  dQdx[mi.li_Charge][mi.Qgp] += (- mi.CAPcqgb)*mi.numberParallel;
17285  dQdx[mi.li_Charge][mi.Qdp] += (- mi.CAPcqdb)*mi.numberParallel;
17286  dQdx[mi.li_Charge][mi.Qsp] += (- mi.CAPcqsb)*mi.numberParallel;
17287  dQdx[mi.li_Charge][mi.Qbp] += (- mi.CAPcqbb)*mi.numberParallel;
17288  }
17289 
17290 #endif
17291  }
17292  }
17293  return true;
17294 }
17295 
17296 Device *Traits::factory(const Configuration &configuration, const FactoryBlock &factory_block)
17297 {
17298 
17299  return new Master(configuration, factory_block, factory_block.solverState_, factory_block.deviceOptions_);
17300 }
17301 
17303 {
17305  .registerDevice("m", 14)
17306  .registerDevice("m", 54)
17307  .registerModelType("pmos", 14)
17308  .registerModelType("nmos", 14)
17309  .registerModelType("pmos", 54)
17310  .registerModelType("nmos", 54);
17311 }
17312 
17313 } // namespace MOSFET_B4
17314 } // namespace Device
17315 } // namespace Xyce