Xyce  6.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
N_DEV_MOSFET_B3SOI.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_B3SOI.C,v $
27 //
28 // Purpose : This file implements the B3SOI MOSFET model. It
29 // is intended to be compatible with the Berkeley SPICE
30 // (3f5) version, B3SOI version 3.2.
31 //
32 // Special Notes :
33 //
34 //
35 // Creator : Dave Shirley
36 //
37 // Creation Date : 05/20/04
38 //
39 // Revision Information:
40 // ---------------------
41 //
42 // Revision Number: $Revision: 1.318.2.4 $
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 #include <sstream>
66 
67 // ---------- Xyce Includes ----------
68 
69 #include <N_DEV_Const.h>
70 #include <N_DEV_DeviceOptions.h>
71 #include <N_DEV_ExternData.h>
72 #include <N_DEV_MOSFET_B3SOI.h>
73 #include <N_DEV_MatrixLoadData.h>
74 #include <N_DEV_SolverState.h>
75 #include <N_DEV_Message.h>
76 #include <N_ERH_ErrorMgr.h>
77 
78 #include <N_DEV_MOSFET1.h>
79 
80 #include <N_LAS_Matrix.h>
81 #include <N_LAS_Vector.h>
82 
83 namespace Xyce {
84 namespace Device {
85 
86 
87 namespace MOSFET_B3SOI {
88 
89 
91 {
92  p.addPar ("L", 5.0e-6, false, NO_DEP,
94  NULL, U_METER, CAT_GEOMETRY, "Channel length");
95 
96  p.addPar ("W", 5.0e-6, false, NO_DEP,
98  NULL, U_METER, CAT_GEOMETRY, "Channel width");
99 
100  p.addPar ("AD", 0.0, false, NO_DEP,
102  NULL, U_METER2, CAT_GEOMETRY, "Drain diffusion area");
103 
104  p.addPar ("AS", 0.0, false, NO_DEP,
106  NULL, U_METER2, CAT_GEOMETRY, "Source diffusion area");
107 
108  p.addPar ("NRD", 1.0, false, NO_DEP,
110  NULL, U_SQUARES, CAT_GEOMETRY, "Multiplier for RSH to yield parasitic resistance of drain");
111 
112  p.addPar ("NRS", 1.0, false, NO_DEP,
114  NULL, U_SQUARES, CAT_GEOMETRY, "Multiplier for RSH to yield parasitic resistance of source");
115 
116  p.addPar ("PD", 0.0, false, NO_DEP,
118  NULL, U_METER, CAT_GEOMETRY, "Drain diffusion perimeter");
119 
120  p.addPar ("PS", 0.0, false, NO_DEP,
122  NULL, U_METER, CAT_GEOMETRY, "Source diffusion perimeter");
123 
124  p.addPar ("IC1", 0.0, false,NO_DEP,
127  U_VOLT, CAT_VOLT, "Initial condition on Vds");
128 
129  p.addPar ("IC2", 0.0, false,NO_DEP,
132  U_VOLT, CAT_VOLT, "Initial condition on Vgs");
133 
134  p.addPar ("IC3", 0.0, false,NO_DEP,
137  U_VOLT, CAT_VOLT, "Initial condition on Vbs");
138 
139  p.addPar ("IC4", 0.0, false,NO_DEP,
142  U_VOLT, CAT_VOLT, "Initial condition on Ves");
143 
144  p.addPar ("IC5", 0.0, false,NO_DEP,
147  U_VOLT, CAT_VOLT, "Initial condition on Vps");
148 
149  p.addPar ("TEMP", 27.0, false,TIME_DEP,
151  NULL, STANDARD, CAT_NONE, "Device temperature");
152 
153  p.addPar ("RTH0", 0.0, false, NO_DEP,
155  NULL, U_OHM, CAT_TEMP, "normalized thermal resistance");
156 
157  p.addPar ("CTH0", 0.0, false, NO_DEP,
159  NULL, U_FARAD, CAT_TEMP, "Thermal capacitance");
160 
161  p.addPar ("NRB", 1.0, false, NO_DEP,
163  NULL, U_NONE, CAT_GEOMETRY, "Number of squares in body");
164 
165  p.addPar ("FRBODY", 1.0, false,NO_DEP,
167  NULL, U_NONE, CAT_GEOMETRY, "Layout dependent body-resistance coefficient");
168 
169  p.addPar ("NBC", 0.0, false, NO_DEP,
171  NULL, U_NONE, CAT_GEOMETRY, "Number of body contact isolation edge");
172 
173  p.addPar ("NSEG", 1.0, false, NO_DEP,
175  NULL, U_NONE, CAT_GEOMETRY, "Number segments for width partitioning");
176 
177  p.addPar ("PDBCP", 0.0, false, NO_DEP,
179  NULL, U_METER, CAT_GEOMETRY, "Perimeter length for bc parasitics at drain side");
180 
181  p.addPar ("PSBCP", 0.0, false, NO_DEP,
183  NULL, U_METER, CAT_GEOMETRY, "Perimeter length for bc parasitics at source side");
184 
185  p.addPar ("AGBCP", 0.0, false, NO_DEP,
187  NULL, U_METER2, CAT_GEOMETRY, "Gate to body overlap area for bc parasitics");
188 
189  p.addPar ("AEBCP", 0.0, false, NO_DEP,
191  NULL, U_METER2, CAT_GEOMETRY, "Substrate to body overlap area for bc prasitics");
192 
193  p.addPar ("VBSUSR", 0.0, false,NO_DEP,
195  NULL, U_VOLT, CAT_DC, "Vbs specified by user");
196 
197  p.addPar ("M", 1.0, false, NO_DEP,
199  NULL, U_NONE, CAT_CONTROL, "Multiplier for M devices connected in parallel");
200 
201  // Set up non-double precision variables:
202  p.addPar ("OFF",false,false, NO_DEP,
204  NULL, U_LOGIC, CAT_VOLT,
205  "Initial condition of no voltage drops accross device");
206 
207  p.addPar ("BJTOFF", 0, false, NO_DEP,
209  U_LOGIC, CAT_NONE, "BJT on/off flag");
210  p.addPar ("DEBUG", 0, false, NO_DEP,
212  U_LOGIC, CAT_NONE, "BJT on/off flag");
213  p.addPar ("SOIMOD", 0, false, NO_DEP,
215  U_NONE, CAT_CONTROL, "SIO model selector, SOIMOD=0: BSIMPD, SOIMOD=1: undefined model for PD and FE, SOIMOD=2: ideal FD");
216  p.addPar ("TNODEOUT", 0, false, NO_DEP,
218  U_LOGIC, CAT_NONE, "Flag indicating external temp node");
219  p.addPar ("RGATEMOD", 0, false, NO_DEP,
221  U_NONE, CAT_RF, "Gate resistance model selector");
222  p.addPar ("VLDEBUG", false, false, NO_DEP,
224  U_LOGIC, CAT_NONE, "");
225  // This tells the parser that IC1 - IC5 are to be input as a vector of "IC"
226  p.makeVector ("IC", 5);
227 }
228 
230 {
231  // Set up double precision variables:
232  p.addPar ("TOX", 100.0e-10, false, NO_DEP,
234  NULL, U_METER, CAT_GEOMETRY, "Gate oxide thickness");
235 
236  p.addPar ("TOXM", 0.0, false, NO_DEP,
238  NULL, U_METER, CAT_PROCESS, "Gate oxide thickness used in extraction");
239 
240  p.addPar ("DTOXCV", 0.0, false, NO_DEP,
242  NULL, U_METER, CAT_NONE, "Delta oxide thickness in meters in CapMod3");
243 
244  p.addPar ("CDSC", 2.4e-4, false, NO_DEP,
246  NULL, U_FARADMM2, CAT_DC, "Drain/source to channel coupling capacitance");
247 
248  p.addPar ("CDSCB", 0.0, false, NO_DEP,
250  NULL, U_FVM1MM2, CAT_DC, "Body-bias sensitivity of CDSC");
251 
252  p.addPar ("CDSCD", 0.0, false, NO_DEP,
254  NULL, U_FVM1MM2, CAT_DC, "Drain-bias sensitivity of CDSC");
255 
256  p.addPar ("CIT", 0.0, false, NO_DEP,
258  NULL, U_FARADMM2, CAT_DC, "Interface trap capacitance");
259 
260  p.addPar ("NFACTOR", 1.0, false, NO_DEP,
262  NULL, U_NONE, CAT_DC, "Subthreshold swing factor");
263 
264  p.addPar ("VSAT", 8.0e4, false, NO_DEP,
266  NULL, U_MSM1, CAT_DC, "Saturation velocity at temp = TNOM");
267 
268  p.addPar ("AT", 3.3e4, false, NO_DEP,
270  NULL, U_MSM1, CAT_TEMP, "Temperature coefficient for saturation velocity");
271 
272  p.addPar ("A0", 1.0, false, NO_DEP,
274  NULL, U_NONE, CAT_DC, "Bulk charge effect coefficient for channel length");
275 
276  p.addPar ("AGS", 0.0, false, NO_DEP,
278  NULL, U_VOLTM1, CAT_DC, "Gate-bias coefficient of abulk");
279 
280  p.addPar ("A1", 0.0, false, NO_DEP,
282  NULL, U_VOLTM1, CAT_DC, "First non-saturation effect parameter");
283 
284  p.addPar ("A2", 1.0, false, NO_DEP,
286  NULL, U_NONE, CAT_DC, "Second non-saturation factor");
287 
288  p.addPar ("KETA", -0.6, false, NO_DEP,
290  NULL, U_VOLTM1, CAT_DC, "Body-bias coefficient of bulk charge effect");
291 
292  p.addPar ("NSUB", 6.0e16, false, NO_DEP,
294  NULL, U_CMM3, CAT_DOPING, "Substrate doping density");
295 
296  p.addPar ("NCH", 1.7e17, false, NO_DEP,
299  U_CMM3, CAT_PROCESS, "Channel doping concentration");
300 
301  p.addPar ("NGATE", 0.0, false, NO_DEP,
303  NULL, U_CMM3, CAT_DC, "Poly gate doping concentration");
304 
305  p.addPar ("GAMMA1", 0.0, false, NO_DEP,
308  U_VOLTH, CAT_PROCESS, "Body effect coefficient near the surface");
309 
310  p.addPar ("GAMMA2", 0.0, false, NO_DEP,
313  U_VOLTH, CAT_PROCESS, "Body effect coefficient in the bulk");
314 
315  p.addPar ("VBX", 0.0, false, NO_DEP,
318  U_VOLT, CAT_PROCESS, "Vbs at which the depetion region = XT");
319 
320  p.addPar ("VBM", -3.0, false, NO_DEP,
323  U_VOLT, CAT_DC, "Maximum applied body-bias in threshold voltage calculation");
324 
325  p.addPar ("XT", 1.55e-7, false, NO_DEP,
328  U_METER, CAT_PROCESS, "Doping depth");
329 
330  p.addPar ("K1", 0.53, false, NO_DEP,
333  U_VOLTH, CAT_DC, "First-order body effect coefficient");
334 
335  p.addPar ("KT1", -0.11, false, NO_DEP,
337  NULL, U_VOLT, CAT_TEMP, "Themperature coefficient for threshold voltage");
338 
339  p.addPar ("KT1L", 0.0, false, NO_DEP,
341  NULL, U_VM, CAT_TEMP, "Channel length dependence of the temerature coefficient for the threshold voltage");
342 
343  p.addPar ("KT2", 0.022, false, NO_DEP,
345  NULL, U_NONE, CAT_TEMP, "Body-bias coefficient fo the threshold voltage temperature effect");
346 
347  p.addPar ("K2", -0.0186, false, NO_DEP,
350  U_NONE, CAT_DC, "second-order body effect coefficient");
351 
352  p.addPar ("K3", 0.0, false, NO_DEP,
354  NULL, U_NONE, CAT_DC, "Narrow width coefficient");
355 
356  p.addPar ("K3B", 0.0, false, NO_DEP,
358  NULL, U_VOLTM1, CAT_DC, "Body effect coefficient of K3");
359 
360  p.addPar ("W0", 2.5e-6, false, NO_DEP,
362  NULL, U_METER, CAT_DC, "Narrow-width paameter");
363 
364  p.addPar ("NLX", 1.74e-7, false, NO_DEP,
366  NULL, U_METER, CAT_DC, "Lateral non-uniform doping parameter");
367 
368  p.addPar ("DVT0", 2.2, false, NO_DEP,
370  NULL, U_NONE, CAT_DC, "First coefficient of short-channel effect effect on threshold voltage");
371 
372  p.addPar ("DVT1", 0.53, false, NO_DEP,
374  NULL, U_NONE, CAT_DC, "Second coefficient of short-channel effect effect on threshold voltage");
375 
376  p.addPar ("DVT2", -0.032, false, NO_DEP,
378  NULL, U_VOLTM1, CAT_DC, "Body-bias coefficient of short-channel effect effect on threshold voltage");
379 
380  p.addPar ("DVT0W", 0.0, false, NO_DEP,
382  NULL, U_METERM1, CAT_DC, "First coefficient of narrow-width effect effect on threshold voltage for small channel length");
383 
384  p.addPar ("DVT1W", 5.3e6, false, NO_DEP,
386  NULL, U_METERM1, CAT_DC, "Second coefficient of narrow-width effect effect on threshold voltage for small channel length");
387 
388  p.addPar ("DVT2W", -0.032, false, NO_DEP,
390  NULL, U_VOLTM1, CAT_DC, "Body-bias coefficient of narrow-width effect effect on threshold voltage for small channel length");
391 
392  p.addPar ("DROUT", 0.56, false, NO_DEP,
394  NULL, U_NONE, CAT_DC, "L-depedance Coefficient of the DIBL correction parameter in Rout");
395 
396  p.addPar ("DSUB", 0.0, false, NO_DEP,
398  NULL, U_NONE, CAT_DC, "DIBL coefficient exponent in subthreshhold region");
399 
400  p.addPar ("UA", 2.25e-9, false, NO_DEP,
402  NULL, U_MVM1, CAT_DC, "First-order mobility degradation coefficient");
403 
404  p.addPar ("UA1", 4.31e-9, false, NO_DEP,
406  NULL, U_MVM1, CAT_TEMP, "Temperature coefficient for UA");
407 
408  p.addPar ("UB", 5.87e-19, false, NO_DEP,
410  NULL, U_M2VM2, CAT_DC, "First-order mobility degradation coefficient");
411 
412  p.addPar ("UB1", -7.61e-18, false, NO_DEP,
414  NULL, U_M2VM2, CAT_TEMP, "Temperature coefficient for UB");
415 
416  p.addPar ("UC", 0.0, false, NO_DEP,
418  NULL, U_MVM2, CAT_DC, "Body effect of mobility degridation coefficient");
419 
420  p.addPar ("UC1", 0.0, false, NO_DEP,
422  NULL, U_MVM2DEGCM1, CAT_TEMP, "Temperature coefficient for UC");
423 
424  p.addPar ("U0", 0.0, false, NO_DEP,
426  NULL,
427  U_CMM2VM1SM1, CAT_PROCESS, "Surface mobility");
428 
429  p.addPar ("UTE", -1.5, false, NO_DEP,
431  NULL, U_NONE, CAT_TEMP, "Mobility temerature exponent");
432 
433  p.addPar ("VOFF", -0.08, false, NO_DEP,
435  NULL, U_VOLT, CAT_DC, "Offset voltage in the subthreshold region at large W and L");
436 
437  p.addPar ("TNOM", 0.0, false, NO_DEP,
439  NULL, STANDARD, CAT_NONE, "");
440 
441  p.addPar ("CGSO", 0.0, false, NO_DEP,
443  NULL, U_FARADMM1, CAT_CAP, "Non-LLD region source-gate overlap capacitance per unit channel length");
444 
445  p.addPar ("CGDO", 0.0, false, NO_DEP,
447  NULL, U_FARADMM1, CAT_CAP, "Non-LLD region drain-gate overlap capacitance per unit channel length");
448 
449  p.addPar ("XPART", 0.0, false, NO_DEP,
451  NULL, U_NONE, CAT_CAP, "Charge partitioning rate flag");
452 
453  p.addPar ("DELTA", 0.01, false, NO_DEP,
455  NULL, U_VOLT, CAT_DC, "Effective Vds parameter");
456 
457  p.addPar ("RSH", 0.0, false, MIN_RES,
459  NULL, U_OHM, CAT_RES, "Drain, source diffusion sheet resistance");
460 
461  p.addPar ("RDSW", 100.0, false, NO_DEP,
463  NULL, U_OHMMICRON, CAT_DC, "Parasitic resistance per unit width");
464 
465  p.addPar ("PRWG", 0.0, false, NO_DEP,
467  NULL, U_VOLTM1, CAT_DC, "Gate-bias effect coefficient of RDSW");
468 
469  p.addPar ("PRWB", 0.0, false, NO_DEP,
471  NULL, U_VOLTMH, CAT_DC, "Body effect coefficient of RDSW");
472 
473  p.addPar ("PRT", 0.0, false, NO_DEP,
475  NULL, U_OHMMICRON, CAT_TEMP, "Temerature coefficient for RDSW");
476 
477  p.addPar ("ETA0", 0.08, false, NO_DEP,
479  NULL, U_NONE, CAT_DC, "DIBL coefficient in subthreshold region");
480 
481  p.addPar ("ETAB", -0.07, false, NO_DEP,
483  NULL, U_VOLTM1, CAT_DC, "Body-bias coefficient for the subthreshold DIBL effect");
484 
485  p.addPar ("PCLM", 1.3, false, NO_DEP,
487  NULL, U_NONE, CAT_DC, "Channel length modulation parameter");
488 
489  p.addPar ("PDIBLC1", 0.39, false, NO_DEP,
491  NULL, U_NONE, CAT_DC, "First output resistance DIBL effect correction parameter");
492 
493  p.addPar ("PDIBLC2", 0.0086, false, NO_DEP,
495  NULL, U_NONE, CAT_DC, "Second output resistance DIBL effect correction parameter");
496 
497  p.addPar ("PDIBLCB", 0.0, false, NO_DEP,
499  NULL, U_VOLTM1, CAT_DC, "Body effect coefficient of DIBL correction parameter");
500 
501  p.addPar ("PVAG", 0.0, false, NO_DEP,
503  NULL, U_NONE, CAT_DC, "Gate dependence of early voltage");
504 
505  p.addPar ("SHMOD", 0.0, false, NO_DEP,
507  NULL, U_NONE, CAT_CONTROL, "Flag for self-heating, 0-no self-heating, 1-self-heating");
508 
509  p.addPar ("TBOX", 3.0e-7, false, NO_DEP,
511  NULL, U_METER, CAT_PROCESS, "Buried oxide thickness");
512 
513  p.addPar ("TSI", 1.0e-7, false, NO_DEP,
515  NULL, U_METER, CAT_PROCESS, "Silicon film thickness");
516 
517  p.addPar ("XJ", 0.0, false, NO_DEP,
519  NULL, U_METER, CAT_GEOMETRY, "Junction depth");
520 
521  p.addPar ("RTH0", 0.0, false, NO_DEP,
523  NULL, U_OHMMM1, CAT_TEMP, "Thermal resistance per unit width");
524 
525  p.addPar ("CTH0", 1.0e-5, false, NO_DEP,
527  NULL, U_FARADMM1, CAT_TEMP, "Thermal capacitance per unit width");
528 
529  p.addPar ("NGIDL", 1.2, false, NO_DEP,
531  NULL, U_VOLT, CAT_DC, "GIDL Vds enhancement coefficient");
532 
533  p.addPar ("AGIDL", 0.0, false, NO_DEP,
535  NULL, U_OHMM1, CAT_DC, "GIDL constant");
536 
537  p.addPar ("BGIDL", 0.0, false, NO_DEP,
539  NULL, U_VMM1, CAT_DC, "GIDL exponential coefficient");
540 
541  p.addPar ("NDIODE", 1.0, false, NO_DEP,
543  NULL, U_NONE, CAT_DC, "Diode non-ideality factor");
544 
545  p.addPar ("XBJT", 1.0, false, NO_DEP,
547  NULL, U_NONE, CAT_TEMP, "Power dependence of JBJT on temperature");
548 
549  p.addPar ("XDIF", 0.0, false, NO_DEP,
551  NULL, U_NONE, CAT_TEMP, "Power dependence of JDIF on temperature");
552 
553  p.addPar ("XREC", 1.0, false, NO_DEP,
555  NULL, U_NONE, CAT_TEMP, "Power dependence of JREC on temperature");
556 
557  p.addPar ("XTUN", 0.0, false, NO_DEP,
559  NULL, U_NONE, CAT_TEMP, "Power dependence of JTUN on temperature");
560 
561  p.addPar ("PBSWG", 0.7, false, NO_DEP,
563  NULL, U_VOLT, CAT_CAP, "Source/drain gate sidewall junction built-in potential");
564 
565  p.addPar ("MJSWG", 0.5, false, NO_DEP,
567  NULL, U_NONE, CAT_CAP, "Source/grain gate sidewall junction capacitance grading coeficient");
568 
569  p.addPar ("CJSWG", 1.0e-10, false, NO_DEP,
571  NULL, U_FARADMM1, CAT_CAP, "Source/grain gate sidewall junction capacitance per unit width");
572 
573  p.addPar ("LINT", 0.0, false, NO_DEP,
575  NULL, U_METER, CAT_DC, "Length of offset fiting parameter from I-V without bias");
576 
577  p.addPar ("LL", 0.0, false, NO_DEP,
579  NULL, U_MEXPLL, CAT_GEOMETRY, "Coefficient of length dependence for length offset");
580 
581  p.addPar ("LLC", 0.0, false, NO_DEP,
583  NULL, U_MEXPLL, CAT_GEOMETRY, "Coefficient of length dependence for CV channel length offset");
584 
585  p.addPar ("LLN", 1.0, false, NO_DEP,
587  NULL, U_NONE, CAT_GEOMETRY, "Power of length dependence for length offset");
588 
589  p.addPar ("LW", 0.0, false, NO_DEP,
591  NULL, U_MEXPLW, CAT_GEOMETRY, "Coefficient of width dependence for length offset");
592 
593  p.addPar ("LWC", 0.0, false, NO_DEP,
595  NULL, U_MEXPLW, CAT_GEOMETRY, "Coefficient of width dependence for channel length offset");
596 
597  p.addPar ("LWN", 1.0, false, NO_DEP,
599  NULL, U_NONE, CAT_GEOMETRY, "Power of width dependence for length offset");
600 
601  p.addPar ("LWL", 0.0, false, NO_DEP,
603  NULL, U_MEXPLLLW, CAT_GEOMETRY, "Coefficient of length and width cross term for length offset");
604 
605  p.addPar ("LWLC", 0.0, false, NO_DEP,
607  NULL, U_MEXPLLLW, CAT_GEOMETRY, "Coefficient of length and width dependence for CV channel length offset");
608 
609  p.addPar ("WR", 1.0, false, NO_DEP,
611  NULL, U_NONE, CAT_DC, "Width offset from Weff for Rds Calculation");
612 
613  p.addPar ("WINT", 0.0, false, NO_DEP,
615  NULL, U_METER, CAT_DC, "Width-offset fitting parameter from I-V without bias");
616 
617  p.addPar ("DWG", 0.0, false, NO_DEP,
619  NULL, U_MVMH, CAT_DC, "Coefficient of gate depedence of Weff");
620 
621  p.addPar ("DWB", 0.0, false, NO_DEP,
623  NULL, U_MVMH, CAT_DC, "Coefficient of substrate body bias dependence of Weff");
624 
625  p.addPar ("WL", 0.0, false, NO_DEP,
627  NULL, U_MEXPWL, CAT_GEOMETRY, "Coefficient of length dependence for width offset");
628 
629  p.addPar ("WLC", 0.0, false, NO_DEP,
631  NULL, U_MEXPWL, CAT_GEOMETRY, "Coefficient of length dependence for CV channel width offset");
632 
633  p.addPar ("WLN", 1.0, false, NO_DEP,
635  NULL, U_NONE, CAT_GEOMETRY, "Power of length dependece of width offset");
636 
637  p.addPar ("WW", 0.0, false, NO_DEP,
639  NULL, U_MEXPWW, CAT_GEOMETRY, "Coefficient of width dependence for width offset");
640 
641  p.addPar ("WWC", 0.0, false, NO_DEP,
643  NULL, U_MEXPWW, CAT_GEOMETRY, "Coefficient of width dependence for CV channel width offset");
644 
645  p.addPar ("WWN", 1.0, false, NO_DEP,
647  NULL, U_NONE, CAT_GEOMETRY, "Power of width dependence of width offset");
648 
649  p.addPar ("WWL", 0.0, false, NO_DEP,
651  NULL, U_MEXPWLWW, CAT_GEOMETRY, "Coefficient of length and width cross term for width offset");
652 
653  p.addPar ("WWLC", 0.0, false, NO_DEP,
655  NULL, U_MEXPWLWW, CAT_GEOMETRY, "Coefficient of length and width dependence for CV channel width offset");
656 
657  p.addPar ("B0", 0.0, false, NO_DEP,
659  NULL, U_METER, CAT_DC, "Bulk charge effect coefficient for channel width");
660 
661  p.addPar ("B1", 0.0, false, NO_DEP,
663  NULL, U_METER, CAT_DC, "Bulk charge effect offset");
664 
665  p.addPar ("CGSL", 0.0, false, NO_DEP,
667  NULL, U_FARADMM1, CAT_CAP, "Light-doped source-gate region overlap capacitance");
668 
669  p.addPar ("CGDL", 0.0, false, NO_DEP,
671  NULL, U_FARADMM1, CAT_CAP, "Light-doped drain-gate region overlap capacitance");
672 
673  p.addPar ("CKAPPA", 0.6, false, NO_DEP,
675  NULL, U_FARADMM1, CAT_CAP, "Coefficient for lightly doped region overlap capacitance fireing field capacitance");
676 
677  p.addPar ("CF", 0.0, false, NO_DEP,
679  NULL, U_FARADMM1, CAT_CAP, "Firing field capacitance");
680 
681  p.addPar ("CLC", 0.1e-7, false,NO_DEP,
683  NULL, U_METER, CAT_CAP, "Constant term for short-channel model");
684 
685  p.addPar ("CLE", 0.0, false, NO_DEP,
687  NULL, U_NONE, CAT_CAP, "Exponetial term for the short-channel model");
688 
689  p.addPar ("DWC", 0.0, false, NO_DEP,
691  NULL, U_METER, CAT_CAP, "Width offset fitting parameter from C-V");
692 
693  p.addPar ("DLC", 0.0, false, NO_DEP,
695  NULL, U_METER, CAT_CAP, "Length offset fitting parameter from C-V");
696 
697  p.addPar ("ALPHA0", 0.0, false, NO_DEP,
699  NULL, U_MVM1, CAT_DC, "First parameter of impact-ionization current");
700 
701  p.addPar ("NOIA", 0.0, false, NO_DEP,
703  NULL, U_NONE, CAT_FLICKER, "Noise parameter a");
704 
705  p.addPar ("NOIB", 0.0, false, NO_DEP,
707  NULL, U_NONE, CAT_FLICKER, "Noise parameter b");
708 
709  p.addPar ("NOIC", 8.75e9, false, NO_DEP,
711  NULL, U_NONE, CAT_FLICKER, "Noise parameter c");
712 
713  p.addPar ("FNOIMOD", 1.0, false, NO_DEP,
715  NULL, U_NONE, CAT_NONE, "Flicker noise model selector");
716 
717  p.addPar ("TNOIMOD", 0.0, false, NO_DEP,
719  NULL, U_NONE, CAT_NONE, "Thermal noise model selector");
720 
721  p.addPar ("TNOIA", 1.5, false, NO_DEP,
723  NULL, U_NONE, CAT_NONE, "Thermal noise parameter");
724 
725  p.addPar ("TNOIB", 3.5, false, NO_DEP,
727  NULL, U_NONE, CAT_NONE, "Thermal noise parameter");
728 
729  p.addPar ("RNOIA", 0.577, false, NO_DEP,
731  NULL, U_NONE, CAT_NONE, "Thermal noise coefficient");
732 
733  p.addPar ("RNOIB", 0.37, false, NO_DEP,
735  NULL, U_NONE, CAT_NONE, "Thermal noise coefficient");
736 
737  p.addPar ("NTNOI", 1.0, false, NO_DEP,
739  NULL, U_NONE, CAT_NONE, "Thermal noise parameter");
740 
741  p.addPar ("EM", 4.1e7, false, NO_DEP,
743  NULL, U_VMM1, CAT_FLICKER, "Saturation field");
744 
745  p.addPar ("EF", 1.0, false, NO_DEP,
747  NULL, U_NONE, CAT_FLICKER, "Flicker exponent");
748 
749  p.addPar ("AF", 1.0, false, NO_DEP,
751  NULL, U_NONE, CAT_FLICKER, "Flicker noise exponent");
752 
753  p.addPar ("KF", 0.0, false, NO_DEP,
755  NULL, U_NONE, CAT_FLICKER, "Flicker noise coefficient");
756 
757  p.addPar ("NOIF", 1.0, false, NO_DEP,
759  NULL, U_NONE, CAT_NONE, "Floating body excess noise ideality factor");
760 
761  p.addPar ("K1W1", 0.0, false, NO_DEP,
763  NULL, U_METER, CAT_DC, "First body effect width depenent parameter");
764 
765  p.addPar ("K1W2", 0.0, false, NO_DEP,
767  NULL, U_METER, CAT_DC, "Second body effect width depenent parameter");
768 
769  p.addPar ("KETAS", 0.0, false, NO_DEP,
771  NULL, U_VOLT, CAT_DC, "Surface potential adjustment for bulk charge effect");
772 
773  p.addPar ("DWBC", 0.0, false, NO_DEP,
775  NULL, U_METER, CAT_DC, "Width offset for body contact isolation edge");
776 
777  p.addPar ("BETA0", 0.0, false, NO_DEP,
779  NULL, U_VOLT, CAT_DC, "Second parameter of impact-ionization current");
780 
781  p.addPar ("BETA1", 0.0, false, NO_DEP,
783  NULL, U_NONE, CAT_DC, "Second Vds dependent parameter of impact ionizatin current");
784 
785  p.addPar ("BETA2", 0.1, false, NO_DEP,
787  NULL, U_VOLT, CAT_DC, "Third Vds dependent parameter of impact ionizatin current");
788 
789  p.addPar ("VDSATII0", 0.9, false, NO_DEP,
791  NULL, U_VOLT, CAT_DC, "Normal drain saturatio voltage at threshold for impact ionization current");
792 
793  p.addPar ("TII", 0.0, false, NO_DEP,
795  NULL, U_NONE, CAT_DC, "Temperature dependent parameter for impact ionization current");
796 
797  p.addPar ("LII", 0.0, false, NO_DEP,
799  NULL, U_NONE, CAT_DC, "Channel length dependent parameter at threshold for impact ionization current");
800 
801  p.addPar ("SII0", 0.5, false, NO_DEP,
803  NULL, U_VOLTM1, CAT_DC, "First Vgs dependent parameter of impact ionizatin current");
804 
805  p.addPar ("SII1", 0.1, false, NO_DEP,
807  NULL, U_VOLTM1, CAT_DC, "Second Vgs dependent parameter of impact ionizatin current");
808 
809  p.addPar ("SII2", 0.0, false, NO_DEP,
811  NULL, U_NONE, CAT_DC, "Third Vgs dependent parameter of impact ionizatin current");
812 
813  p.addPar ("SIID", 0.0, false, NO_DEP,
815  NULL, U_VOLTM1, CAT_DC, "Vds dependent parameter of drain saturation voltage for impact ionizatin current");
816 
817  p.addPar ("FBJTII", 0.0, false, NO_DEP,
819  NULL, U_NONE, CAT_DC, "Fraction of bipolar current affecting the impact ionization");
820 
821  p.addPar ("ESATII", 1.0e7, false, NO_DEP,
823  NULL, U_VMM1, CAT_DC, "Saturation channel electric field for impact ionization current");
824 
825  p.addPar ("NTUN", 10.0, false, NO_DEP,
827  NULL, U_NONE, CAT_DC, "Reverse tunneling non-ideality factor");
828 
829  p.addPar ("NRECF0", 2.0, false, NO_DEP,
831  NULL, U_NONE, CAT_DC, "Recombination non-ideality factor at foward bias");
832 
833  p.addPar ("NRECR0", 10.0, false, NO_DEP,
835  NULL, U_NONE, CAT_DC, "Recombination non-ideality factor at reverse bias");
836 
837  p.addPar ("ISBJT", 1.0e-6, false, NO_DEP,
839  NULL, U_AMPMM2, CAT_DC, "BJT injection saturation current");
840 
841  p.addPar ("ISDIF", 0.0, false, NO_DEP,
843  NULL, U_AMPMM2, CAT_DC, "BOdy to source/drain injection saturation current");
844 
845  p.addPar ("ISREC", 1.0e-5, false, NO_DEP,
847  NULL, U_AMPMM2, CAT_DC, "Recombinatin in depletion saturation current");
848 
849  p.addPar ("ISTUN", 0.0, false, NO_DEP,
851  NULL, U_AMPMM2, CAT_DC, "Reverse tunneling saturation current");
852 
853  p.addPar ("LN", 2.0e-6, false, NO_DEP,
855  NULL, U_METER, CAT_DC, "Electron/hole diffusion length");
856 
857  p.addPar ("VREC0", 0.0, false, NO_DEP,
859  NULL, U_VOLT, CAT_DC, "Voltage dependent parameter for recombination current");
860 
861  p.addPar ("VTUN0", 0.0, false, NO_DEP,
863  NULL, U_VOLT, CAT_DC, "Voltage dependent parameter for tunneling current");
864 
865  p.addPar ("NBJT", 1.0, false, NO_DEP,
867  NULL, U_NONE, CAT_DC, "Power coefficient of channel length");
868 
869  p.addPar ("LBJT0", 2.0e-7, false, NO_DEP,
871  NULL, U_METER, CAT_DC, "Reference channel length for bipolar current");
872 
873  p.addPar ("LDIF0", 1.0, false, NO_DEP,
875  NULL, U_NONE, CAT_CAP, "Channel length dependency coefficient of diffusion capacitance");
876 
877  p.addPar ("VABJT", 10.0, false, NO_DEP,
879  NULL, U_VOLT, CAT_DC, "Early voltage for bipolar current");
880 
881  p.addPar ("AELY", 0.0, false, NO_DEP,
883  NULL, U_VMM1, CAT_DC, "Channel length dependency of early voltage for bipolar current");
884 
885  p.addPar ("AHLI", 0.0, false, NO_DEP,
887  NULL, U_NONE, CAT_DC, "High level injection parameter for bipolar current");
888 
889  p.addPar ("RBODY", 0.0, false, NO_DEP,
891  NULL, U_OSQM1, CAT_DC, "Intrinsic body contact sheet resistance");
892 
893  p.addPar ("RBSH", 0.0, false, NO_DEP,
895  NULL, U_OSQM1, CAT_DC, "Intrinsic body contact sheet resistance");
896 
897  p.addPar ("CGEO", 0.0, false, NO_DEP,
899  NULL, U_FARADMM1, CAT_CAP, "Gate substrate overlap capacitance per unit channel length");
900 
901  p.addPar ("TT", 1.0e-12, false, NO_DEP,
903  NULL, U_SECOND, CAT_CAP, "Diffusion capacitance transit time coefficient");
904 
905  p.addPar ("NDIF", -1.0, false, NO_DEP,
907  NULL, U_NONE, CAT_CAP, "Power coefficient of channel length dependency for diffusion capacitance");
908 
909  p.addPar ("VSDFB", 0.0, false, NO_DEP,
912  U_VOLT, CAT_CAP, "Sorce/Drain bottom diffusion capacitance flatband voltage");
913 
914  p.addPar ("VSDTH", 0.0, false, NO_DEP,
917  U_VOLT, CAT_CAP, "Sorce/Drain bottom diffusion capacitance threshold voltage");
918 
919  p.addPar ("CSDMIN", 0.0, false, NO_DEP,
922  U_VOLT, CAT_CAP, "Sorce/Drain bottom diffusion minimum capacitance");
923 
924  p.addPar ("ASD", 0.3, false, NO_DEP,
926  NULL, U_NONE, CAT_CAP, "Sorce/Drain bottom diffusion smoothing parameter");
927 
928  p.addPar ("CSDESW", 0.0, false, NO_DEP,
930  NULL, U_FARADMM1, CAT_CAP, "Sorce/Drain sidewall fringing capacitance per unit length");
931 
932  p.addPar ("NTRECF", 0.0, false, NO_DEP,
934  NULL, U_NONE, CAT_TEMP, "Temperature coefficient for NRECF");
935 
936  p.addPar ("NTRECR", 0.0, false, NO_DEP,
938  NULL, U_NONE, CAT_TEMP, "Temperature coefficient for NRECR");
939 
940  p.addPar ("DLCB", 0.0, false, NO_DEP,
942  NULL, U_METER, CAT_CAP, "Length offset fitting parameter for body charge");
943 
944  p.addPar ("FBODY", 1.0, false, NO_DEP,
946  NULL, U_NONE, CAT_CAP, "Scaling factor for body charge");
947 
948  p.addPar ("TCJSWG", 0.0, false, NO_DEP,
950  NULL, U_KM1, CAT_TEMP, "Temperature coefficient of Cjswg");
951 
952  p.addPar ("TPBSWG", 0.0, false, NO_DEP,
954  NULL, U_VKM1, CAT_TEMP, "Temperature coefficient of Pbswg");
955 
956  p.addPar ("ACDE", 1.0, false, NO_DEP,
958  NULL, U_MVM1, CAT_CAP, "Exponetial coefficient for charge thickness in capmod = 3 for accumulation and depletion regions");
959 
960  p.addPar ("MOIN", 15.0, false, NO_DEP,
962  NULL, U_NONE, CAT_CAP, "Coefficient for the gate-bias dependent surface potential");
963 
964  p.addPar ("NOFF", 1.0, false, NO_DEP,
966  NULL, U_NONE, CAT_CAP, "CV parameter in Vgsteff, CV for weak to strong inversion");
967 
968  p.addPar ("DELVT", 0.0, false, NO_DEP,
970  NULL, U_VOLT, CAT_CAP, "Threshold voltage adjust for C-V");
971 
972  p.addPar ("KB1", 1.0, false, NO_DEP,
974  NULL, U_NONE, CAT_NONE, "Scaling factor for backgate charge");
975 
976  p.addPar ("DLBG", 0.0, false, NO_DEP,
978  NULL, U_METER, CAT_CAP, "Length offset fitting parameter for backgate charge");
979 
980  p.addPar ("IGCMOD", 0.0, false, NO_DEP,
982  NULL, U_NONE, CAT_NONE, "Gate-channel tunneling current model selector");
983 
984  p.addPar ("TOXQM", 0.0, false, NO_DEP,
986  NULL, U_METER, CAT_TUNNEL, "Oxide thickness for Igb calculation");
987 
988  p.addPar ("WTH0", 0.0, false, NO_DEP,
990  NULL, U_METER, CAT_TEMP, "Minimum width for thermal resistance calculation");
991 
992  p.addPar ("RHALO", 1.0e15, false, NO_DEP,
994  NULL, U_OHMMM1, CAT_DC, "Body halo sheet resistance");
995 
996  p.addPar ("NTOX", 1.0, false, NO_DEP,
998  NULL, U_NONE, CAT_TUNNEL, "Power term of gate current");
999 
1000  p.addPar ("TOXREF", 2.5e-9, false, NO_DEP,
1002  NULL, U_METER, CAT_TUNNEL, "Target oxide thickness");
1003 
1004  p.addPar ("EBG", 1.2, false, NO_DEP,
1006  NULL, U_VOLT, CAT_TUNNEL, "Effective bandgap in gate current calculation");
1007 
1008  p.addPar ("VEVB", 0.075, false, NO_DEP,
1010  NULL, U_NONE, CAT_TUNNEL, "Vaux parameter for valence band electron tunneling");
1011 
1012  p.addPar ("ALPHAGB1", 0.35, false, NO_DEP,
1014  NULL, U_VOLTM1, CAT_TUNNEL, "First Vox dependent parameter for gate current in inversion");
1015 
1016  p.addPar ("BETAGB1", 0.03, false, NO_DEP,
1018  NULL, U_VOLTM2, CAT_TUNNEL, "Second Vox dependent parameter for gate current in inversion");
1019 
1020  p.addPar ("VGB1", 300.0, false, NO_DEP,
1022  NULL, U_VOLT, CAT_TUNNEL, "Third Vox dependent parameter for gate current in inversion");
1023 
1024  p.addPar ("VECB", 0.026, false, NO_DEP,
1026  NULL, U_NONE, CAT_TUNNEL, "Vaux parameter for conduction band electron tunneling");
1027 
1028  p.addPar ("ALPHAGB2", 0.43, false, NO_DEP,
1030  NULL, U_VOLTM1, CAT_TUNNEL, "First Vox dependent parameter for gate current in accumulation");
1031 
1032  p.addPar ("BETAGB2", 0.05, false, NO_DEP,
1034  NULL, U_VOLTM2, CAT_TUNNEL, "First Vox dependent parameter for gate current in accumulation");
1035 
1036  p.addPar ("VGB2", 17.0, false, NO_DEP,
1038  NULL, U_VOLT, CAT_TUNNEL, "Third Vox dependent parameter for gate current in accumulation");
1039 
1040  p.addPar ("VOXH", 0.0, false, NO_DEP,
1042  NULL, U_NONE, CAT_NONE, "The limit of Vox in gate current calculation");
1043 
1044  p.addPar ("DELTAVOX", 0.0, false, NO_DEP,
1046  NULL, U_NONE, CAT_NONE, "The smoothing parameter in the Vox smoothing function");
1047 
1048  p.addPar ("AIGC", 0.0, false, NO_DEP,
1050  NULL, U_FHGMHSMVM1, CAT_CURRENT, "Parameter for Igc");
1051 
1052  p.addPar ("BIGC", 0.0, false, NO_DEP,
1054  NULL, U_FHGMHSMVM1, CAT_CURRENT, "Parameter for Igc");
1055 
1056  p.addPar ("CIGC", 0.0, false, NO_DEP,
1058  NULL, U_VOLTM1, CAT_CURRENT, "Parameter for Igc");
1059 
1060  p.addPar ("AIGSD", 0.0, false, NO_DEP,
1062  NULL, U_FHGMHSMVM1, CAT_CURRENT, "Parameter for Igs,d");
1063 
1064  p.addPar ("BIGSD", 0.0, false, NO_DEP,
1066  NULL, U_FHGMHSMVM1, CAT_CURRENT, "Parameter for Igs,d");
1067 
1068  p.addPar ("CIGSD", 0.0, false, NO_DEP,
1070  NULL, U_VOLTM1, CAT_CURRENT, "Parameter for Igs,d");
1071 
1072  p.addPar ("NIGC", 1.0, false, NO_DEP,
1074  NULL, U_NONE, CAT_CURRENT, "Parameter for Igc slope");
1075 
1076  p.addPar ("PIGCD", 1.0, false, NO_DEP,
1078  NULL, U_NONE, CAT_CURRENT, "Parameter for Igc partition");
1079 
1080  p.addPar ("POXEDGE", 1.0, false, NO_DEP,
1082  NULL, U_NONE, CAT_NONE, "Factor for the gate edge Tox");
1083 
1084  p.addPar ("DLCIG", 0.0, false, NO_DEP,
1086  NULL, U_VOLTM1, CAT_CURRENT, "Delta L for Ig model");
1087 
1088  p.addPar ("VBS0PD", 0.0, false, NO_DEP,
1090  NULL, U_NONE, CAT_NONE, "Upper bound of built-in potential lowering for FD operation");
1091 
1092  p.addPar ("VBS0FD", 0.5, false, NO_DEP,
1094  NULL, U_VOLT, CAT_NONE, "Lower bound of built-in potential lowering for FD operation");
1095 
1096  p.addPar ("VBSA", 0.0, false, NO_DEP,
1098  NULL, U_VOLT, CAT_VBI, "Offset voltage due to non-idealities");
1099 
1100  p.addPar ("NOFFFD", 1.0, false, NO_DEP,
1102  NULL, U_NONE, CAT_VBI, "Smoothing parameter in FD module");
1103 
1104  p.addPar ("VOFFFD", 0.0, false, NO_DEP,
1106  NULL, U_VOLT, CAT_VBI, "Smoothing parameter in FD module");
1107 
1108  p.addPar ("K1B", 1.0, false, NO_DEP,
1110  NULL, U_NONE, CAT_VBI, "First backgate body effect parameter");
1111 
1112  p.addPar ("K2B", 0.0, false, NO_DEP,
1114  NULL, U_NONE, CAT_VBI, "Second backgate body effect parameter for short channel effect");
1115 
1116  p.addPar ("DK2B", 0.0, false, NO_DEP,
1118  NULL, U_NONE, CAT_VBI, "Third backgate body effect parameter for short channel effect");
1119 
1120  p.addPar ("DVBD0", 0.0, false, NO_DEP,
1122  NULL, U_NONE, CAT_VBI, "First short channel effect parameter in FD module");
1123 
1124  p.addPar ("DVBD1", 0.0, false, NO_DEP,
1126  NULL, U_NONE, CAT_VBI, "Second short channel effect parameter in FD module");
1127 
1128  p.addPar ("MOINFD", 1e3, false, NO_DEP,
1130  NULL, U_NONE, CAT_VBI, "Gate bias dependance coefficient of surface potential in FD module");
1131 
1132  p.addPar ("XRCRG1", 12.0, false, NO_DEP,
1134  NULL, U_NONE, CAT_RF, "Parameter for distributed channel resistance effect for intrinsic input resistance");
1135 
1136  p.addPar ("XRCRG2", 1.0, false, NO_DEP,
1138  NULL, U_NONE, CAT_RF, "Parameter to account for the excess channel diffusion resistance for intrinsic input resistance");
1139 
1140  p.addPar ("RSHG", 0.1, false, NO_DEP,
1142  NULL, U_NONE, CAT_NONE, "Gate sheet resistance");
1143 
1144  p.addPar ("NGCON", 1.0, false, NO_DEP,
1146  NULL, U_NONE, CAT_RF, "Number of gate contacts");
1147 
1148  p.addPar ("XGW", 0.0, false, NO_DEP,
1150  NULL, U_METER, CAT_RF, "Distance from the gate contact to the channel edge");
1151 
1152  p.addPar ("XGL", 0.0, false, NO_DEP,
1154  NULL, U_METER, CAT_RF, "Offset of the gate length due to variations in patterning");
1155 
1156  p.addPar ("LXJ", 0.0, false, NO_DEP,
1158  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of xj");
1159 
1160  p.addPar ("LALPHAGB1", 0.0, false, NO_DEP,
1162  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of ALPHAGB1");
1163 
1164  p.addPar ("LBETAGB1", 0.0, false, NO_DEP,
1166  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of BETAGB1");
1167 
1168  p.addPar ("LALPHAGB2", 0.0, false, NO_DEP,
1170  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of ALPHAGB2");
1171 
1172  p.addPar ("LBETAGB2", 0.0, false, NO_DEP,
1174  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of BETAGB2");
1175 
1176  p.addPar ("LCGSL", 0.0, false, NO_DEP,
1178  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of CGSL");
1179 
1180  p.addPar ("LCGDL", 0.0, false, NO_DEP,
1182  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of CGDL");
1183 
1184  p.addPar ("LCKAPPA", 0.0, false, NO_DEP,
1186  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of CKAPPA");
1187 
1188  p.addPar ("LNDIF", 0.0, false, NO_DEP,
1190  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of NDIF");
1191 
1192  p.addPar ("LUTE", 0.0, false, NO_DEP,
1194  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of UTE");
1195 
1196  p.addPar ("LKT1", 0.0, false, NO_DEP,
1198  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of KT1");
1199 
1200  p.addPar ("LKT1L", 0.0, false, NO_DEP,
1202  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of KT1L");
1203 
1204  p.addPar ("LKT2", 0.0, false, NO_DEP,
1206  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of KT2");
1207 
1208  p.addPar ("LUA1", 0.0, false, NO_DEP,
1210  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of UA1");
1211 
1212  p.addPar ("LUB1", 0.0, false, NO_DEP,
1214  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of UB1");
1215 
1216  p.addPar ("LUC1", 0.0, false, NO_DEP,
1218  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of UC1");
1219 
1220  p.addPar ("LAT", 0.0, false, NO_DEP,
1222  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of at");
1223 
1224  p.addPar ("LPRT", 0.0, false, NO_DEP,
1226  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of PRT");
1227 
1228  p.addPar ("LNTRECF", 0.0, false, NO_DEP,
1230  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of NTRECF");
1231 
1232  p.addPar ("LNTRECR", 0.0, false, NO_DEP,
1234  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of NTRECR");
1235 
1236  p.addPar ("LXBJT", 0.0, false, NO_DEP,
1238  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of XBJT");
1239 
1240  p.addPar ("LXDIF", 0.0, false, NO_DEP,
1242  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of CDIF");
1243 
1244  p.addPar ("LXREC", 0.0, false, NO_DEP,
1246  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of XREC");
1247 
1248  p.addPar ("LXTUN", 0.0, false, NO_DEP,
1250  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of XTUN");
1251 
1252  p.addPar ("LAIGC", 0.0, false, NO_DEP,
1254  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of AIGC");
1255 
1256  p.addPar ("LBIGC", 0.0, false, NO_DEP,
1258  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of BIGC");
1259 
1260  p.addPar ("LCIGC", 0.0, false, NO_DEP,
1262  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of CIGC");
1263 
1264  p.addPar ("LAIGSD", 0.0, false, NO_DEP,
1266  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of AIGSD");
1267 
1268  p.addPar ("LBIGSD", 0.0, false, NO_DEP,
1270  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of BIGSD");
1271 
1272  p.addPar ("LCIGSD", 0.0, false, NO_DEP,
1274  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of CIGSD");
1275 
1276  p.addPar ("LNIGC", 0.0, false, NO_DEP,
1278  NULL, U_METER, CAT_DEPENDENCY, "Length dependence of NIGC");
1279 
1280  p.addPar ("LPIGCD", 0.0, false, NO_DEP,
1282  NULL, U_NONE, CAT_DEPENDENCY, "Length dependence of PIGCD");
1283 
1284  p.addPar ("LPOXEDGE", 0.0, false, NO_DEP,
1286  NULL, U_METER, CAT_DEPENDENCY, "Length dependence of POXEDGE");
1287 
1288  p.addPar ("LNCH", 0.0, false, NO_DEP,
1290  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of nch");
1291 
1292  p.addPar ("LNSUB", 0.0, false, NO_DEP,
1294  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of nsub");
1295 
1296  p.addPar ("LNGATE", 0.0, false, NO_DEP,
1298  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of ngate");
1299 
1300  p.addPar ("LVTH0", 0.0, false, NO_DEP,
1302  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of VT0");
1303 
1304  p.addPar ("LK1", 0.0, false, NO_DEP,
1306  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of K1");
1307 
1308  p.addPar ("LK1W1", 0.0, false, NO_DEP,
1310  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of K1W1");
1311 
1312  p.addPar ("LK1W2", 0.0, false, NO_DEP,
1314  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of K1W2");
1315 
1316  p.addPar ("LK2", 0.0, false, NO_DEP,
1318  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of K2");
1319 
1320  p.addPar ("LK3", 0.0, false, NO_DEP,
1322  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of K3");
1323 
1324  p.addPar ("LK3B", 0.0, false, NO_DEP,
1326  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of K3B");
1327 
1328  p.addPar ("LKB1", 0.0, false, NO_DEP,
1330  NULL, U_METER, CAT_DEPENDENCY, "Length dependence of KB1");
1331 
1332  p.addPar ("LW0", 0.0, false, NO_DEP,
1334  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of W0");
1335 
1336  p.addPar ("LNLX", 0.0, false, NO_DEP,
1338  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of NLX");
1339 
1340  p.addPar ("LDVT0", 0.0, false, NO_DEP,
1342  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of DVT0");
1343 
1344  p.addPar ("LDVT1", 0.0, false, NO_DEP,
1346  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of DVT1");
1347 
1348  p.addPar ("LDVT2", 0.0, false, NO_DEP,
1350  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of DVT2");
1351 
1352  p.addPar ("LDVT0W", 0.0, false, NO_DEP,
1354  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of DVT0W");
1355 
1356  p.addPar ("LDVT1W", 0.0, false, NO_DEP,
1358  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of DVT1W");
1359 
1360  p.addPar ("LDVT2W", 0.0, false, NO_DEP,
1362  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of DVT2W");
1363 
1364  p.addPar ("LU0", 0.0, false, NO_DEP,
1366  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of U0");
1367 
1368  p.addPar ("LUA", 0.0, false, NO_DEP,
1370  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of UA");
1371 
1372  p.addPar ("LUB", 0.0, false, NO_DEP,
1374  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of UB");
1375 
1376  p.addPar ("LUC", 0.0, false, NO_DEP,
1378  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of UC");
1379 
1380  p.addPar ("LVSAT", 0.0, false, NO_DEP,
1382  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of vsat");
1383 
1384  p.addPar ("LA0", 0.0, false, NO_DEP,
1386  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of a0");
1387 
1388  p.addPar ("LAGS", 0.0, false, NO_DEP,
1390  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of ags");
1391 
1392  p.addPar ("LB0", 0.0, false, NO_DEP,
1394  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of B0");
1395 
1396  p.addPar ("LB1", 0.0, false, NO_DEP,
1398  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of B1");
1399 
1400  p.addPar ("LKETA", 0.0, false, NO_DEP,
1402  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of keta");
1403 
1404  p.addPar ("LKETAS", 0.0, false, NO_DEP,
1406  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of KETAS");
1407 
1408  p.addPar ("LA1", 0.0, false, NO_DEP,
1410  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of a1");
1411 
1412  p.addPar ("LA2", 0.0, false, NO_DEP,
1414  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of a2");
1415 
1416  p.addPar ("LRDSW", 0.0, false, NO_DEP,
1418  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of RDSW");
1419 
1420  p.addPar ("LPRWB", 0.0, false, NO_DEP,
1422  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of PRWB");
1423 
1424  p.addPar ("LPRWG", 0.0, false, NO_DEP,
1426  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of PRWG");
1427 
1428  p.addPar ("LWR", 0.0, false, NO_DEP,
1430  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of WR");
1431 
1432  p.addPar ("LNFACTOR", 0.0, false, NO_DEP,
1434  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of nfactor");
1435 
1436  p.addPar ("LDWG", 0.0, false, NO_DEP,
1438  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of DWG");
1439 
1440  p.addPar ("LDWB", 0.0, false, NO_DEP,
1442  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of DWB");
1443 
1444  p.addPar ("LVOFF", 0.0, false, NO_DEP,
1446  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of VOFF");
1447 
1448  p.addPar ("LETA0", 0.0, false, NO_DEP,
1450  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of ETA0");
1451 
1452  p.addPar ("LETAB", 0.0, false, NO_DEP,
1454  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of ETAB");
1455 
1456  p.addPar ("LDSUB", 0.0, false, NO_DEP,
1458  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of LDSUB");
1459 
1460  p.addPar ("LCIT", 0.0, false, NO_DEP,
1462  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of cit");
1463 
1464  p.addPar ("LCDSC", 0.0, false, NO_DEP,
1466  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of cdsc");
1467 
1468  p.addPar ("LCDSCB", 0.0, false, NO_DEP,
1470  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of cdscb");
1471 
1472  p.addPar ("LCDSCD", 0.0, false, NO_DEP,
1474  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of cdscd");
1475 
1476  p.addPar ("LPCLM", 0.0, false, NO_DEP,
1478  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of PCLM");
1479 
1480  p.addPar ("LPDIBLC1", 0.0, false, NO_DEP,
1482  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of PDIBLC1");
1483 
1484  p.addPar ("LPDIBLC2", 0.0, false, NO_DEP,
1486  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of PDIBLC2");
1487 
1488  p.addPar ("LPDIBLCB", 0.0, false, NO_DEP,
1490  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of PDIBLCB");
1491 
1492  p.addPar ("LDROUT", 0.0, false, NO_DEP,
1494  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of DROUT");
1495 
1496  p.addPar ("LPVAG", 0.0, false, NO_DEP,
1498  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of PVAG");
1499 
1500  p.addPar ("LDELTA", 0.0, false, NO_DEP,
1502  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of DELTA");
1503 
1504  p.addPar ("LALPHA0", 0.0, false, NO_DEP,
1506  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of ALPHA0");
1507 
1508  p.addPar ("LFBJTII", 0.0, false, NO_DEP,
1510  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of FBJTII");
1511 
1512  p.addPar ("LBETA0", 0.0, false, NO_DEP,
1514  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of BETA0");
1515 
1516  p.addPar ("LBETA1", 0.0, false, NO_DEP,
1518  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of BETA1");
1519 
1520  p.addPar ("LBETA2", 0.0, false, NO_DEP,
1522  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of BETA2");
1523 
1524  p.addPar ("LVDSATII0", 0.0, false, NO_DEP,
1526  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of VDSATII0");
1527 
1528  p.addPar ("LLII", 0.0, false, NO_DEP,
1530  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of LII");
1531 
1532  p.addPar ("LESATII", 0.0, false, NO_DEP,
1534  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of ESATII");
1535 
1536  p.addPar ("LSII0", 0.0, false, NO_DEP,
1538  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of SII0");
1539 
1540  p.addPar ("LSII1", 0.0, false, NO_DEP,
1542  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of SII1");
1543 
1544  p.addPar ("LSII2", 0.0, false, NO_DEP,
1546  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of SII2");
1547 
1548  p.addPar ("LSIID", 0.0, false, NO_DEP,
1550  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of SIID");
1551 
1552  p.addPar ("LAGIDL", 0.0, false, NO_DEP,
1554  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of AGIDL");
1555 
1556  p.addPar ("LBGIDL", 0.0, false, NO_DEP,
1558  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of BGIDL");
1559 
1560  p.addPar ("LNGIDL", 0.0, false, NO_DEP,
1562  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of NGIDL");
1563 
1564  p.addPar ("LNTUN", 0.0, false, NO_DEP,
1566  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of NTUN");
1567 
1568  p.addPar ("LNDIODE", 0.0, false, NO_DEP,
1570  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of NDIODE");
1571 
1572  p.addPar ("LNRECF0", 0.0, false, NO_DEP,
1574  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of NRECF0");
1575 
1576  p.addPar ("LNRECR0", 0.0, false, NO_DEP,
1578  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of NRECR0");
1579 
1580  p.addPar ("LISBJT", 0.0, false, NO_DEP,
1582  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of ISBJT");
1583 
1584  p.addPar ("LISDIF", 0.0, false, NO_DEP,
1586  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of ISDIF");
1587 
1588  p.addPar ("LISREC", 0.0, false, NO_DEP,
1590  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of ISREC");
1591 
1592  p.addPar ("LISTUN", 0.0, false, NO_DEP,
1594  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of ISTUN");
1595 
1596  p.addPar ("LVREC0", 0.0, false, NO_DEP,
1598  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of VREC0");
1599 
1600  p.addPar ("LVTUN0", 0.0, false, NO_DEP,
1602  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of VTUN0");
1603 
1604  p.addPar ("LNBJT", 0.0, false, NO_DEP,
1606  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of NBJT");
1607 
1608  p.addPar ("LLBJT0", 0.0, false, NO_DEP,
1610  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of LBJT0");
1611 
1612  p.addPar ("LVABJT", 0.0, false, NO_DEP,
1614  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of VABJT");
1615 
1616  p.addPar ("LAELY", 0.0, false, NO_DEP,
1618  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of AELY");
1619 
1620  p.addPar ("LAHLI", 0.0, false, NO_DEP,
1622  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of AHLI");
1623 
1624  p.addPar ("LVSDFB", 0.0, false, NO_DEP,
1626  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of VSDFB");
1627 
1628  p.addPar ("LVSDTH", 0.0, false, NO_DEP,
1630  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of VSDTH");
1631 
1632  p.addPar ("LDELVT", 0.0, false, NO_DEP,
1634  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of DELVT");
1635 
1636  p.addPar ("LACDE", 0.0, false, NO_DEP,
1638  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of ACDE");
1639 
1640  p.addPar ("LMOIN", 0.0, false, NO_DEP,
1642  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of MOIN");
1643 
1644  p.addPar ("LNOFF", 0.0, false, NO_DEP,
1646  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of NOFF");
1647 
1648  p.addPar ("LXRCRG1", 0.0, false, NO_DEP,
1650  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of XRCRG1");
1651 
1652  p.addPar ("LXRCRG2", 0.0, false, NO_DEP,
1654  NULL, U_INVALID, CAT_DEPENDENCY, "Length dependence of XRCRG2");
1655 
1656  p.addPar ("WXJ", 0.0, false, NO_DEP,
1658  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of XJ");
1659 
1660  p.addPar ("WALPHAGB1", 0.0, false, NO_DEP,
1662  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of ALPHAGB1");
1663 
1664  p.addPar ("WBETAGB1", 0.0, false, NO_DEP,
1666  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of BETAGB1");
1667 
1668  p.addPar ("WALPHAGB2", 0.0, false, NO_DEP,
1670  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of ALPHAGB2");
1671 
1672  p.addPar ("WBETAGB2", 0.0, false, NO_DEP,
1674  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of BETAGB2");
1675 
1676  p.addPar ("WCGSL", 0.0, false, NO_DEP,
1678  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of CGSL");
1679 
1680  p.addPar ("WCGDL", 0.0, false, NO_DEP,
1682  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of CGDL");
1683 
1684  p.addPar ("WCKAPPA", 0.0, false, NO_DEP,
1686  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of CKAPPA");
1687 
1688  p.addPar ("WNDIF", 0.0, false, NO_DEP,
1690  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of NDIF");
1691 
1692  p.addPar ("WUTE", 0.0, false, NO_DEP,
1694  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of UTE");
1695 
1696  p.addPar ("WKT1", 0.0, false, NO_DEP,
1698  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of KT1");
1699 
1700  p.addPar ("WKT1L", 0.0, false, NO_DEP,
1702  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of KT1L");
1703 
1704  p.addPar ("WKT2", 0.0, false, NO_DEP,
1706  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of KT2");
1707 
1708  p.addPar ("WUA1", 0.0, false, NO_DEP,
1710  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of UA1");
1711 
1712  p.addPar ("WUB1", 0.0, false, NO_DEP,
1714  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of UB1");
1715 
1716  p.addPar ("WUC1", 0.0, false, NO_DEP,
1718  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of UC1");
1719 
1720  p.addPar ("WAT", 0.0, false, NO_DEP,
1722  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of AT");
1723 
1724  p.addPar ("WPRT", 0.0, false, NO_DEP,
1726  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of PRT");
1727 
1728  p.addPar ("WNTRECF", 0.0, false, NO_DEP,
1730  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of NTRECF");
1731 
1732  p.addPar ("WNTRECR", 0.0, false, NO_DEP,
1734  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of NTRECR");
1735 
1736  p.addPar ("WXBJT", 0.0, false, NO_DEP,
1738  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of XBIT");
1739 
1740  p.addPar ("WXDIF", 0.0, false, NO_DEP,
1742  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of XDIF");
1743 
1744  p.addPar ("WXREC", 0.0, false, NO_DEP,
1746  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of XREC");
1747 
1748  p.addPar ("WXTUN", 0.0, false, NO_DEP,
1750  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of XTUN");
1751 
1752  p.addPar ("WAIGC", 0.0, false, NO_DEP,
1754  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of AIGC");
1755 
1756  p.addPar ("WBIGC", 0.0, false, NO_DEP,
1758  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of BIGC");
1759 
1760  p.addPar ("WCIGC", 0.0, false, NO_DEP,
1762  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of CIGC");
1763 
1764  p.addPar ("WAIGSD", 0.0, false, NO_DEP,
1766  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of AIGSD");
1767 
1768  p.addPar ("WBIGSD", 0.0, false, NO_DEP,
1770  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of BIGSD");
1771 
1772  p.addPar ("WCIGSD", 0.0, false, NO_DEP,
1774  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of CIGSD");
1775 
1776  p.addPar ("WNIGC", 0.0, false, NO_DEP,
1778  NULL, U_METER, CAT_DEPENDENCY, "Width dependence of NIGC");
1779 
1780  p.addPar ("WPIGCD", 0.0, false, NO_DEP,
1782  NULL, U_NONE, CAT_DEPENDENCY, "Width dependence of PIGCD");
1783 
1784  p.addPar ("WPOXEDGE", 0.0, false, NO_DEP,
1786  NULL, U_METER, CAT_DEPENDENCY, "Width dependence of POXEDGE");
1787 
1788  p.addPar ("WNCH", 0.0, false, NO_DEP,
1790  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of NCH");
1791 
1792  p.addPar ("WNSUB", 0.0, false, NO_DEP,
1794  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of NSUB");
1795 
1796  p.addPar ("WNGATE", 0.0, false, NO_DEP,
1798  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of NGATE");
1799 
1800  p.addPar ("WVTH0", 0.0, false, NO_DEP,
1802  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of VTO");
1803 
1804  p.addPar ("WK1", 0.0, false, NO_DEP,
1806  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of K1");
1807 
1808  p.addPar ("WK1W1", 0.0, false, NO_DEP,
1810  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of K1W1");
1811 
1812  p.addPar ("WK1W2", 0.0, false, NO_DEP,
1814  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of K1W2");
1815 
1816  p.addPar ("WK2", 0.0, false, NO_DEP,
1818  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of K2");
1819 
1820  p.addPar ("WK3", 0.0, false, NO_DEP,
1822  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of K3");
1823 
1824  p.addPar ("WK3B", 0.0, false, NO_DEP,
1826  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of K3B");
1827 
1828  p.addPar ("WKB1", 0.0, false, NO_DEP,
1830  NULL, U_METER, CAT_DEPENDENCY, "Width dependence of KB1");
1831 
1832  p.addPar ("WW0", 0.0, false, NO_DEP,
1834  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of W0");
1835 
1836  p.addPar ("WNLX", 0.0, false, NO_DEP,
1838  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of NLX");
1839 
1840  p.addPar ("WDVT0", 0.0, false, NO_DEP,
1842  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of DVT0");
1843 
1844  p.addPar ("WDVT1", 0.0, false, NO_DEP,
1846  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of DVT1");
1847 
1848  p.addPar ("WDVT2", 0.0, false, NO_DEP,
1850  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of DVT2");
1851 
1852  p.addPar ("WDVT0W", 0.0, false, NO_DEP,
1854  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of DVT0W");
1855 
1856  p.addPar ("WDVT1W", 0.0, false, NO_DEP,
1858  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of DVT1W");
1859 
1860  p.addPar ("WDVT2W", 0.0, false, NO_DEP,
1862  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of DVT2W");
1863 
1864  p.addPar ("WU0", 0.0, false, NO_DEP,
1866  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of U0");
1867 
1868  p.addPar ("WUA", 0.0, false, NO_DEP,
1870  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of UA");
1871 
1872  p.addPar ("WUB", 0.0, false, NO_DEP,
1874  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of UB");
1875 
1876  p.addPar ("WUC", 0.0, false, NO_DEP,
1878  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of UC");
1879 
1880  p.addPar ("WVSAT", 0.0, false, NO_DEP,
1882  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of VSAT");
1883 
1884  p.addPar ("WA0", 0.0, false, NO_DEP,
1886  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of A0");
1887 
1888  p.addPar ("WAGS", 0.0, false, NO_DEP,
1890  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of AGS");
1891 
1892  p.addPar ("WB0", 0.0, false, NO_DEP,
1894  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of B0");
1895 
1896  p.addPar ("WB1", 0.0, false, NO_DEP,
1898  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of B1");
1899 
1900  p.addPar ("WKETA", 0.0, false, NO_DEP,
1902  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of KETA");
1903 
1904  p.addPar ("WKETAS", 0.0, false, NO_DEP,
1906  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of KETAS");
1907 
1908  p.addPar ("WA1", 0.0, false, NO_DEP,
1910  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of A1");
1911 
1912  p.addPar ("WA2", 0.0, false, NO_DEP,
1914  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of A2");
1915 
1916  p.addPar ("WRDSW", 0.0, false, NO_DEP,
1918  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of RDSW");
1919 
1920  p.addPar ("WPRWB", 0.0, false, NO_DEP,
1922  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of PRWB");
1923 
1924  p.addPar ("WPRWG", 0.0, false, NO_DEP,
1926  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of PRWG");
1927 
1928  p.addPar ("WWR", 0.0, false, NO_DEP,
1930  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of WR");
1931 
1932  p.addPar ("WNFACTOR", 0.0, false, NO_DEP,
1934  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of NFACTOR");
1935 
1936  p.addPar ("WDWG", 0.0, false, NO_DEP,
1938  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of WG");
1939 
1940  p.addPar ("WDWB", 0.0, false, NO_DEP,
1942  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of DWB");
1943 
1944  p.addPar ("WVOFF", 0.0, false, NO_DEP,
1946  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of VOFF");
1947 
1948  p.addPar ("WETA0", 0.0, false, NO_DEP,
1950  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of ETA0");
1951 
1952  p.addPar ("WETAB", 0.0, false, NO_DEP,
1954  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of ETAB");
1955 
1956  p.addPar ("WDSUB", 0.0, false, NO_DEP,
1958  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of DSUB");
1959 
1960  p.addPar ("WCIT", 0.0, false, NO_DEP,
1962  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of CIT");
1963 
1964  p.addPar ("WCDSC", 0.0, false, NO_DEP,
1966  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of CDSC");
1967 
1968  p.addPar ("WCDSCB", 0.0, false, NO_DEP,
1970  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of CDSCB");
1971 
1972  p.addPar ("WCDSCD", 0.0, false, NO_DEP,
1974  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of CDSCD");
1975 
1976  p.addPar ("WPCLM", 0.0, false, NO_DEP,
1978  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of PCLM");
1979 
1980  p.addPar ("WPDIBLC1", 0.0, false, NO_DEP,
1982  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of PDIBLC1");
1983 
1984  p.addPar ("WPDIBLC2", 0.0, false, NO_DEP,
1986  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of PDIBLC2");
1987 
1988  p.addPar ("WPDIBLCB", 0.0, false, NO_DEP,
1990  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of PDIBLCB");
1991 
1992  p.addPar ("WDROUT", 0.0, false, NO_DEP,
1994  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of DROUT");
1995 
1996  p.addPar ("WPVAG", 0.0, false, NO_DEP,
1998  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of PVAG");
1999 
2000  p.addPar ("WDELTA", 0.0, false, NO_DEP,
2002  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of DELTA");
2003 
2004  p.addPar ("WALPHA0", 0.0, false, NO_DEP,
2006  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of ALPHA0");
2007 
2008  p.addPar ("WFBJTII", 0.0, false, NO_DEP,
2010  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of FBJTII");
2011 
2012  p.addPar ("WBETA0", 0.0, false, NO_DEP,
2014  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of BETA0");
2015 
2016  p.addPar ("WBETA1", 0.0, false, NO_DEP,
2018  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of BETA1");
2019 
2020  p.addPar ("WBETA2", 0.0, false, NO_DEP,
2022  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of BETA2");
2023 
2024  p.addPar ("WVDSATII0", 0.0, false, NO_DEP,
2026  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of VDSATII0");
2027 
2028  p.addPar ("WLII", 0.0, false, NO_DEP,
2030  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of LII");
2031 
2032  p.addPar ("WESATII", 0.0, false, NO_DEP,
2034  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of ESATII");
2035 
2036  p.addPar ("WSII0", 0.0, false, NO_DEP,
2038  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of SII0");
2039 
2040  p.addPar ("WSII1", 0.0, false, NO_DEP,
2042  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of SII1");
2043 
2044  p.addPar ("WSII2", 0.0, false, NO_DEP,
2046  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of SII2");
2047 
2048  p.addPar ("WSIID", 0.0, false, NO_DEP,
2050  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of SIID");
2051 
2052  p.addPar ("WAGIDL", 0.0, false, NO_DEP,
2054  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of AGIDL");
2055 
2056  p.addPar ("WBGIDL", 0.0, false, NO_DEP,
2058  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of BGIDL");
2059 
2060  p.addPar ("WNGIDL", 0.0, false, NO_DEP,
2062  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of NGIDL");
2063 
2064  p.addPar ("WNTUN", 0.0, false, NO_DEP,
2066  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of NTUN");
2067 
2068  p.addPar ("WNDIODE", 0.0, false, NO_DEP,
2070  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of NDIODE");
2071 
2072  p.addPar ("WNRECF0", 0.0, false, NO_DEP,
2074  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of NRECF0");
2075 
2076  p.addPar ("WNRECR0", 0.0, false, NO_DEP,
2078  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of NRECR0");
2079 
2080  p.addPar ("WISBJT", 0.0, false, NO_DEP,
2082  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of ISBJT");
2083 
2084  p.addPar ("WISDIF", 0.0, false, NO_DEP,
2086  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of ISDIF");
2087 
2088  p.addPar ("WISREC", 0.0, false, NO_DEP,
2090  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of ISREC");
2091 
2092  p.addPar ("WISTUN", 0.0, false, NO_DEP,
2094  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of ISTUN");
2095 
2096  p.addPar ("WVREC0", 0.0, false, NO_DEP,
2098  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of VREC0");
2099 
2100  p.addPar ("WVTUN0", 0.0, false, NO_DEP,
2102  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of VTUN0");
2103 
2104  p.addPar ("WNBJT", 0.0, false, NO_DEP,
2106  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of NBJT");
2107 
2108  p.addPar ("WLBJT0", 0.0, false, NO_DEP,
2110  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of LBJT0");
2111 
2112  p.addPar ("WVABJT", 0.0, false, NO_DEP,
2114  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of VABJT");
2115 
2116  p.addPar ("WAELY", 0.0, false, NO_DEP,
2118  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of AELY");
2119 
2120  p.addPar ("WAHLI", 0.0, false, NO_DEP,
2122  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of AHLI");
2123 
2124  p.addPar ("WVSDFB", 0.0, false, NO_DEP,
2126  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of VSDFB");
2127 
2128  p.addPar ("WVSDTH", 0.0, false, NO_DEP,
2130  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of VSDTH");
2131 
2132  p.addPar ("WDELVT", 0.0, false, NO_DEP,
2134  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of DELVT");
2135 
2136  p.addPar ("WACDE", 0.0, false, NO_DEP,
2138  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of ACDE");
2139 
2140  p.addPar ("WMOIN", 0.0, false, NO_DEP,
2142  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of MOIN");
2143 
2144  p.addPar ("WNOFF", 0.0, false, NO_DEP,
2146  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of NOFF");
2147 
2148  p.addPar ("WXRCRG1", 0.0, false, NO_DEP,
2150  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of XRCRG1");
2151 
2152  p.addPar ("WXRCRG2", 0.0, false, NO_DEP,
2154  NULL, U_INVALID, CAT_DEPENDENCY, "Width dependence of XRCRG2");
2155 
2156  p.addPar ("PXJ", 0.0, false, NO_DEP,
2158  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of XJ");
2159 
2160  p.addPar ("PALPHAGB1", 0.0, false, NO_DEP,
2162  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of ALPHAGB1");
2163 
2164  p.addPar ("PBETAGB1", 0.0, false, NO_DEP,
2166  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of BETAGB1");
2167 
2168  p.addPar ("PALPHAGB2", 0.0, false, NO_DEP,
2170  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of ALPHAGB2");
2171 
2172  p.addPar ("PBETAGB2", 0.0, false, NO_DEP,
2174  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of BETAGB2");
2175 
2176  p.addPar ("PCGSL", 0.0, false, NO_DEP,
2178  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of CGSL");
2179 
2180  p.addPar ("PCGDL", 0.0, false, NO_DEP,
2182  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of CGDL");
2183 
2184  p.addPar ("PCKAPPA", 0.0, false, NO_DEP,
2186  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of CKAPPA");
2187 
2188  p.addPar ("PNDIF", 0.0, false, NO_DEP,
2190  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of NDIF");
2191 
2192  p.addPar ("PUTE", 0.0, false, NO_DEP,
2194  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of UTE");
2195 
2196  p.addPar ("PKT1", 0.0, false, NO_DEP,
2198  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of KT1");
2199 
2200  p.addPar ("PKT1L", 0.0, false, NO_DEP,
2202  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of KT1L");
2203 
2204  p.addPar ("PKT2", 0.0, false, NO_DEP,
2206  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of KT2");
2207 
2208  p.addPar ("PUA1", 0.0, false, NO_DEP,
2210  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of UA1");
2211 
2212  p.addPar ("PUB1", 0.0, false, NO_DEP,
2214  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of UB1");
2215 
2216  p.addPar ("PUC1", 0.0, false, NO_DEP,
2218  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of UC1");
2219 
2220  p.addPar ("PAT", 0.0, false, NO_DEP,
2222  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of AT");
2223 
2224  p.addPar ("PPRT", 0.0, false, NO_DEP,
2226  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of PRT");
2227 
2228  p.addPar ("PNTRECF", 0.0, false, NO_DEP,
2230  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of NTRECF");
2231 
2232  p.addPar ("PNTRECR", 0.0, false, NO_DEP,
2234  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of NTRECR");
2235 
2236  p.addPar ("PXBJT", 0.0, false, NO_DEP,
2238  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of XBJT");
2239 
2240  p.addPar ("PXDIF", 0.0, false, NO_DEP,
2242  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of XDIF");
2243 
2244  p.addPar ("PXREC", 0.0, false, NO_DEP,
2246  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of XREC");
2247 
2248  p.addPar ("PXTUN", 0.0, false, NO_DEP,
2250  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of XTUN");
2251 
2252  p.addPar ("PAIGC", 0.0, false, NO_DEP,
2254  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of AIGC");
2255 
2256  p.addPar ("PBIGC", 0.0, false, NO_DEP,
2258  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of BIGC");
2259 
2260  p.addPar ("PCIGC", 0.0, false, NO_DEP,
2262  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of CIGC");
2263 
2264  p.addPar ("PAIGSD", 0.0, false, NO_DEP,
2266  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of AIGSD");
2267 
2268  p.addPar ("PBIGSD", 0.0, false, NO_DEP,
2270  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of BIGSD");
2271 
2272  p.addPar ("PCIGSD", 0.0, false, NO_DEP,
2274  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of CIGSD");
2275 
2276  p.addPar ("PNIGC", 0.0, false, NO_DEP,
2278  NULL, U_METER2, CAT_DEPENDENCY, "Cross-term dependence of NIGC");
2279 
2280  p.addPar ("PPIGCD", 0.0, false, NO_DEP,
2282  NULL, U_NONE, CAT_DEPENDENCY, "Cross-term dependence of PIGCD");
2283 
2284  p.addPar ("PPOXEDGE", 0.0, false, NO_DEP,
2286  NULL, U_METER2, CAT_DEPENDENCY, "Cross-term dependence of OXEDGE");
2287 
2288  p.addPar ("PNCH", 0.0, false, NO_DEP,
2290  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of NCH");
2291 
2292  p.addPar ("PNSUB", 0.0, false, NO_DEP,
2294  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of NSUB");
2295 
2296  p.addPar ("PNGATE", 0.0, false, NO_DEP,
2298  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of NGATE");
2299 
2300  p.addPar ("PVTH0", 0.0, false, NO_DEP,
2302  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of VT0");
2303 
2304  p.addPar ("PK1", 0.0, false, NO_DEP,
2306  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of K1");
2307 
2308  p.addPar ("PK1W1", 0.0, false, NO_DEP,
2310  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of K1W1");
2311 
2312  p.addPar ("PK1W2", 0.0, false, NO_DEP,
2314  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of K1W2");
2315 
2316  p.addPar ("PK2", 0.0, false, NO_DEP,
2318  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of K2");
2319 
2320  p.addPar ("PK3", 0.0, false, NO_DEP,
2322  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of K3");
2323 
2324  p.addPar ("PK3B", 0.0, false, NO_DEP,
2326  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of K3B");
2327 
2328  p.addPar ("PKB1", 0.0, false, NO_DEP,
2330  NULL, U_METER2, CAT_DEPENDENCY, "Cross-term dependence of KB1");
2331 
2332  p.addPar ("PW0", 0.0, false, NO_DEP,
2334  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of W0");
2335 
2336  p.addPar ("PNLX", 0.0, false, NO_DEP,
2338  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of NLX");
2339 
2340  p.addPar ("PDVT0", 0.0, false, NO_DEP,
2342  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of DVT0");
2343 
2344  p.addPar ("PDVT1", 0.0, false, NO_DEP,
2346  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of DVT1");
2347 
2348  p.addPar ("PDVT2", 0.0, false, NO_DEP,
2350  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of DVT2");
2351 
2352  p.addPar ("PDVT0W", 0.0, false, NO_DEP,
2354  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of DVT0W");
2355 
2356  p.addPar ("PDVT1W", 0.0, false, NO_DEP,
2358  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of DVT1W");
2359 
2360  p.addPar ("PDVT2W", 0.0, false, NO_DEP,
2362  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of DVT2W");
2363 
2364  p.addPar ("PU0", 0.0, false, NO_DEP,
2366  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of U0");
2367 
2368  p.addPar ("PUA", 0.0, false, NO_DEP,
2370  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of UA");
2371 
2372  p.addPar ("PUB", 0.0, false, NO_DEP,
2374  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of UB");
2375 
2376  p.addPar ("PUC", 0.0, false, NO_DEP,
2378  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of UC");
2379 
2380  p.addPar ("PVSAT", 0.0, false, NO_DEP,
2382  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of VSAT");
2383 
2384  p.addPar ("PA0", 0.0, false, NO_DEP,
2386  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of A0");
2387 
2388  p.addPar ("PAGS", 0.0, false, NO_DEP,
2390  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of AGS");
2391 
2392  p.addPar ("PB0", 0.0, false, NO_DEP,
2394  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of B0");
2395 
2396  p.addPar ("PB1", 0.0, false, NO_DEP,
2398  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of B1");
2399 
2400  p.addPar ("PKETA", 0.0, false, NO_DEP,
2402  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of KETA");
2403 
2404  p.addPar ("PKETAS", 0.0, false, NO_DEP,
2406  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of KETAS");
2407 
2408  p.addPar ("PA1", 0.0, false, NO_DEP,
2410  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of A1");
2411 
2412  p.addPar ("PA2", 0.0, false, NO_DEP,
2414  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of A2");
2415 
2416  p.addPar ("PRDSW", 0.0, false, NO_DEP,
2418  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of RDSW");
2419 
2420  p.addPar ("PPRWB", 0.0, false, NO_DEP,
2422  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of PRWB");
2423 
2424  p.addPar ("PPRWG", 0.0, false, NO_DEP,
2426  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of PRWG");
2427 
2428  p.addPar ("PWR", 0.0, false, NO_DEP,
2430  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of WR");
2431 
2432  p.addPar ("PNFACTOR", 0.0, false, NO_DEP,
2434  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of NFACTOR");
2435 
2436  p.addPar ("PDWG", 0.0, false, NO_DEP,
2438  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of DWG");
2439 
2440  p.addPar ("PDWB", 0.0, false, NO_DEP,
2442  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of DWB");
2443 
2444  p.addPar ("PVOFF", 0.0, false, NO_DEP,
2446  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of VOFF");
2447 
2448  p.addPar ("PETA0", 0.0, false, NO_DEP,
2450  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of ETA0");
2451 
2452  p.addPar ("PETAB", 0.0, false, NO_DEP,
2454  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of ETAB");
2455 
2456  p.addPar ("PDSUB", 0.0, false, NO_DEP,
2458  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of DSUB");
2459 
2460  p.addPar ("PCIT", 0.0, false, NO_DEP,
2462  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of CIT");
2463 
2464  p.addPar ("PCDSC", 0.0, false, NO_DEP,
2466  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of CDSC");
2467 
2468  p.addPar ("PCDSCB", 0.0, false, NO_DEP,
2470  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of CDSCB");
2471 
2472  p.addPar ("PCDSCD", 0.0, false, NO_DEP,
2474  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of CDSCD");
2475 
2476  p.addPar ("PPCLM", 0.0, false, NO_DEP,
2478  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of PCLM");
2479 
2480  p.addPar ("PPDIBLC1", 0.0, false, NO_DEP,
2482  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of PDIBLC1");
2483 
2484  p.addPar ("PPDIBLC2", 0.0, false, NO_DEP,
2486  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of PDIBLC2");
2487 
2488  p.addPar ("PPDIBLCB", 0.0, false, NO_DEP,
2490  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of PDIBLCB");
2491 
2492  p.addPar ("PDROUT", 0.0, false, NO_DEP,
2494  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of DROUT");
2495 
2496  p.addPar ("PPVAG", 0.0, false, NO_DEP,
2498  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of PVAG");
2499 
2500  p.addPar ("PDELTA", 0.0, false, NO_DEP,
2502  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of DELTA");
2503 
2504  p.addPar ("PALPHA0", 0.0, false, NO_DEP,
2506  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of ALPHA0");
2507 
2508  p.addPar ("PFBJTII", 0.0, false, NO_DEP,
2510  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of FBJTII");
2511 
2512  p.addPar ("PBETA0", 0.0, false, NO_DEP,
2514  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of BETA0");
2515 
2516  p.addPar ("PBETA1", 0.0, false, NO_DEP,
2518  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of BETA1");
2519 
2520  p.addPar ("PBETA2", 0.0, false, NO_DEP,
2522  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of BETA2");
2523 
2524  p.addPar ("PVDSATII0", 0.0, false, NO_DEP,
2526  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of VDSATII0");
2527 
2528  p.addPar ("PLII", 0.0, false, NO_DEP,
2530  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of LII");
2531 
2532  p.addPar ("PESATII", 0.0, false, NO_DEP,
2534  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of ESATII");
2535 
2536  p.addPar ("PSII0", 0.0, false, NO_DEP,
2538  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of SII0");
2539 
2540  p.addPar ("PSII1", 0.0, false, NO_DEP,
2542  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of SII1");
2543 
2544  p.addPar ("PSII2", 0.0, false, NO_DEP,
2546  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of SII2");
2547 
2548  p.addPar ("PSIID", 0.0, false, NO_DEP,
2550  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of SIID");
2551 
2552  p.addPar ("PAGIDL", 0.0, false, NO_DEP,
2554  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of AGIDL");
2555 
2556  p.addPar ("PBGIDL", 0.0, false, NO_DEP,
2558  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of BGIDL");
2559 
2560  p.addPar ("PNGIDL", 0.0, false, NO_DEP,
2562  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of NGIDL");
2563 
2564  p.addPar ("PNTUN", 0.0, false, NO_DEP,
2566  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of NTON");
2567 
2568  p.addPar ("PNDIODE", 0.0, false, NO_DEP,
2570  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of NDIODE");
2571 
2572  p.addPar ("PNRECF0", 0.0, false, NO_DEP,
2574  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of NRECF0");
2575 
2576  p.addPar ("PNRECR0", 0.0, false, NO_DEP,
2578  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of NRECR0");
2579 
2580  p.addPar ("PISBJT", 0.0, false, NO_DEP,
2582  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of ISBJT");
2583 
2584  p.addPar ("PISDIF", 0.0, false, NO_DEP,
2586  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of ISDIF");
2587 
2588  p.addPar ("PISREC", 0.0, false, NO_DEP,
2590  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of ISREC");
2591 
2592  p.addPar ("PISTUN", 0.0, false, NO_DEP,
2594  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of ISTUN");
2595 
2596  p.addPar ("PVREC0", 0.0, false, NO_DEP,
2598  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of VREC0");
2599 
2600  p.addPar ("PVTUN0", 0.0, false, NO_DEP,
2602  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of VTUN0");
2603 
2604  p.addPar ("PNBJT", 0.0, false, NO_DEP,
2606  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of NBJT");
2607 
2608  p.addPar ("PLBJT0", 0.0, false, NO_DEP,
2610  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of LBJT0");
2611 
2612  p.addPar ("PVABJT", 0.0, false, NO_DEP,
2614  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of VABJT");
2615 
2616  p.addPar ("PAELY", 0.0, false, NO_DEP,
2618  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of AELY");
2619 
2620  p.addPar ("PAHLI", 0.0, false, NO_DEP,
2622  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of AHLI");
2623 
2624  p.addPar ("PVSDFB", 0.0, false, NO_DEP,
2626  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of VSDFB");
2627 
2628  p.addPar ("PVSDTH", 0.0, false, NO_DEP,
2630  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of VSDTH");
2631 
2632  p.addPar ("PDELVT", 0.0, false, NO_DEP,
2634  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of DELVT");
2635 
2636  p.addPar ("PACDE", 0.0, false, NO_DEP,
2638  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of ACDE");
2639 
2640  p.addPar ("PMOIN", 0.0, false, NO_DEP,
2642  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of MOIN");
2643 
2644  p.addPar ("PNOFF", 0.0, false, NO_DEP,
2646  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of NOFF");
2647 
2648  p.addPar ("PXRCRG1", 0.0, false, NO_DEP,
2650  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of XRCRG1");
2651 
2652  p.addPar ("PXRCRG2", 0.0, false, NO_DEP,
2654  NULL, U_INVALID, CAT_DEPENDENCY, "Cross-term dependence of XRCRG2");
2655 
2656  p.addPar ("L", 5.0e-6, false, NO_DEP,
2658  NULL, U_METER, CAT_GEOMETRY, "Channel length");
2659 
2660  p.addPar ("W", 5.0e-6, false, NO_DEP,
2662  NULL, U_METER, CAT_GEOMETRY, "Channel width");
2663 
2664  p.addPar ("LMAX", 1.0, false, NO_DEP,
2666  NULL, U_METER, CAT_BIN, "Maximum channel length");
2667 
2668  p.addPar ("LMIN", 0.0, false, NO_DEP,
2670  NULL, U_METER, CAT_BIN, "Minimum channel length");
2671 
2672  p.addPar ("WMAX", 1.0, false, NO_DEP,
2674  NULL, U_METER, CAT_BIN, "Maximum channel width");
2675 
2676  p.addPar ("WMIN", 0.0, false, NO_DEP,
2678  NULL, U_METER, CAT_BIN, "Minimum channel width");
2679 
2680  p.addPar ("IGMOD", 0.0, false, NO_DEP,
2683  U_NONE, CAT_TUNNEL, "Gate current model selector");
2684 
2685  p.addPar ("IGBMOD", 0.0, false, NO_DEP,
2688  U_NONE, CAT_NONE, "Flicker noise model selector");
2689 
2690  p.addPar ("VTHO", 0.0, false, NO_DEP,
2693  U_NONE, CAT_NONE, "Threshold voltage");
2694 
2695  p.addPar ("VTH0", 0.0, false, NO_DEP,
2698  U_VOLT, CAT_DC, "Threshold voltage at Vbs = 0 for large L");
2699 
2700  // Set up non-double precision variables:
2701  p.addPar ("VERSION", "3.2", &MOSFET_B3SOI::Model::version)
2702  .setCategory(CAT_CONTROL)
2703  .setDescription("Version number");
2704  p.addPar ("CAPMOD", 2, &MOSFET_B3SOI::Model::capMod)
2705  .setCategory(CAT_CONTROL)
2706  .setDescription("Flag for capacitance models");
2707  p.addPar ("MOBMOD", 1, &MOSFET_B3SOI::Model::mobMod)
2708  .setCategory(CAT_CONTROL)
2709  .setDescription("Mobility model selector");
2710  p.addPar ("PARAMCHK", 0, &MOSFET_B3SOI::Model::paramChk)
2711  .setCategory(CAT_CONTROL)
2712  .setDescription("Parameter value check");
2713  p.addPar ("BINUNIT", 1, &MOSFET_B3SOI::Model::binUnit)
2714  .setCategory(CAT_CONTROL)
2715  .setDescription("Binning unit selector");
2716  p.addPar ("SOIMOD", 0, &MOSFET_B3SOI::Model::soiMod)
2717  .setCategory(CAT_VBI)
2718  .setDescription("SIO model selector, SOIMOD=0: BSIMPD, SOIMOD=1: undefined model for PD and FE, SOIMOD=2: ideal FD");
2719  p.addPar ("RGATEMOD", 0, &MOSFET_B3SOI::Model::rgateMod)
2720  .setCategory(CAT_RF)
2721  .setDescription("Gate resistance model selector");
2722  p.addPar ("BUG1830FIX", 0, &MOSFET_B3SOI::Model::bug1830fix)
2723  .setCategory(CAT_RF)
2724  .setDescription("Voltage limter fix for bug 1830");
2725 
2726  // Thermal model setup:
2728 }
2729 
2730 
2731 // static jacobian maps:
2732 
2733 std::vector< std::vector< std::vector<int> > > Instance::jacStamp_v;
2734 std::vector< std::vector<int> > Instance::jacMap_v;
2735 std::vector< std::vector< std::vector<int> > > Instance::jacMap2_v;
2736 
2737 // pre-processor macros. Note: usually, numerical constants such as
2738 // EPSOX come from Const.h. The constants listed here are intended
2739 // to be used for debugging and comparing to the original spice3f5 code.
2740 //
2741 // Note2: While the initial intent of these internally defined constants was
2742 // SOI debugging, the SOI is relatively unstable device, numerically.
2743 // For now, leaving the constants the same as in Spice3, although this
2744 // will cause some compiler complaints.
2745 //
2746 // Once someone takes the time to check the SOI results and stability in
2747 // detail, the spice3 constants will be commented out.
2748 
2749 #define Xyce_USE_BSIMSOI_CONST 1
2750 
2751 #ifdef Xyce_USE_BSIMSOI_CONST
2752 #define CONSTEPSOX (3.453133e-11)
2753 #define CONSTEPSSI (1.03594e-10)
2754 
2755 #ifdef CONSTQ // if this is defined, we need to undef it to avoid compiler warnings
2756 #undef CONSTQ
2757 #endif
2758 #define CONSTQ (1.60219e-19)
2759 
2760 #ifdef CONSTKoverQ // if this is defined, we need to undef it to avoid compiler warnings
2761 #undef CONSTKoverQ
2762 #endif
2763 #define CONSTKoverQ (8.617087e-5) // Kb / q
2764 
2765 #ifdef CONSTEg300 // if this is defined, we need to undef it to avoid compiler warnings
2766 #undef CONSTEg300
2767 #endif
2768 #define CONSTEg300 (1.115) // energy gap at 300K
2769 
2770 #define CONSTboltz (1.3806226e-23)
2771 
2772 #ifdef M_PI // if this is defined, we need to undef it to avoid compiler warnings
2773 #undef M_PI
2774 #endif
2775 #define M_PI (3.141592654)
2776 
2777 #endif // Xyce_USE_BSIMSOI_CONST
2778 
2779 #define DELTA_1 0.02
2780 #define DELTA_2 0.02
2781 #define DELTA_3 0.02
2782 // Original is 0.02, for matching IBM model, change to 0.08
2783 #define DELTA_3_SOI 0.08
2784 #define DELTA_4 0.02
2785 #define DELT_Vbseff 0.005
2786 #define DELTA_VFB 0.02
2787 #define OFF_Vbsitf 0.02 // v3.1
2788 
2789 #define MAX_EXPL 2.688117142e+43
2790 #define MIN_EXPL 3.720075976e-44
2791 #define EXPL_THRESHOLD 100.0
2792 #define DEXP(A,B) { \
2793  if (A > EXPL_THRESHOLD) { \
2794  B = MAX_EXPL*(1.0+(A)-EXPL_THRESHOLD); \
2795  } else if (A < -EXPL_THRESHOLD) { \
2796  B = MIN_EXPL; \
2797  } else { \
2798  B = exp(A); \
2799  } \
2800  }
2801 #define CEXP(A,B,C) { \
2802  if (A > EXPL_THRESHOLD) { \
2803  B = MAX_EXPL*(1.0+(A)-EXPL_THRESHOLD); \
2804  C = MAX_EXPL; \
2805  } else if (A < -EXPL_THRESHOLD) { \
2806  B = MIN_EXPL; \
2807  C = 0; \
2808  } else { \
2809  B = exp(A); \
2810  C = B; \
2811  } \
2812  }
2813 
2814 // Class Instance
2815 //-----------------------------------------------------------------------------
2816 // Function : Instance::processParams
2817 // Purpose :
2818 // Special Notes :
2819 // Scope : public
2820 // Creator : Dave Shirley
2821 // Creation Date : 05/20/04
2822 //-----------------------------------------------------------------------------
2824 {
2825 
2826  // now set the temperature related stuff.
2828 
2829  return true;
2830 }
2831 
2832 //-----------------------------------------------------------------------------
2833 // Function : Instance::Instance
2834 // Purpose : instance block constructor
2835 // Special Notes :
2836 // Scope : public
2837 // Creator : Dave Shirley
2838 // Creation Date : 05/20/04
2839 //-----------------------------------------------------------------------------
2841  const Configuration & configuration,
2842  const InstanceBlock & IB,
2843  Model &model,
2844  const FactoryBlock & factory_block)
2845  : DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
2846  model_ (model),
2847  paramPtr (NULL),
2848  dNode (0),
2849  gNode (0),
2850  sNode (0),
2851  eNode (0),
2852  pNode (0),
2853  pNodeMappedToB (false),
2854  bNode (0),
2855  tNode (0),
2856  dNodePrime (0),
2857  sNodePrime (0),
2858  gNodePrime (0),
2859  gNodeMid (0),
2860  jacID (0),
2861  ueff (0.0),
2862  thetavth (0.0),
2863  von (0.0),
2864  vdsat (0.0),
2865  cgdo (0.0),
2866  cgso (0.0),
2867  l (0.0),
2868  w (0.0),
2869  numberParallel (0.0),
2870  drainArea (0.0),
2871  sourceArea (0.0),
2872  drainSquares (1.0),
2873  sourceSquares (1.0),
2874  drainPerimeter (0.0),
2875  sourcePerimeter (0.0),
2876  drainConductance (0.0),
2877  FwdSum (0.0),
2878  gbbb (0.0),
2879  gbbdp (0.0),
2880  gbbe (0.0),
2881  gbbg (0.0),
2882  gbbsp (0.0),
2883  gbbT (0.0),
2884  gcbdb (0.0),
2885  gcbeb (0.0),
2886  gcbgb (0.0),
2887  gcbsb (0.0),
2888  gcbT (0.0),
2889  gcddb (0.0),
2890  gcdeb (0.0),
2891  gcdgb (0.0),
2892  gcdgmb (0.0),
2893  gcdsb (0.0),
2894  gcdT (0.0),
2895  gcedb (0.0),
2896  gceeb (0.0),
2897  gcegb (0.0),
2898  gcegmb (0.0),
2899  gcesb (0.0),
2900  gceT (0.0),
2901  gcgbb (0.0),
2902  gcgdb (0.0),
2903  gcgeb (0.0),
2904  gcggb (0.0),
2905  gcgmdb (0.0),
2906  gcgmeb (0.0),
2907  gcgmgmb (0.0),
2908  gcgmsb (0.0),
2909  gcgsb (0.0),
2910  gcgT (0.0),
2911  gcrg (0.0),
2912  gcrgb (0.0),
2913  gcrgd (0.0),
2914  gcrgg (0.0),
2915  gcrgs (0.0),
2916  gcrg_jac (0.0),
2917  gcrgb_jac (0.0),
2918  gcrgd_jac (0.0),
2919  gcrgg_jac (0.0),
2920  gcrgs_jac (0.0),
2921  gcsdb (0.0),
2922  gcseb (0.0),
2923  gcsgb (0.0),
2924  gcsgmb (0.0),
2925  gcssb (0.0),
2926  gcsT (0.0),
2927  gcTt (0.0),
2928  gddpb (0.0),
2929  gddpdp (0.0),
2930  gddpe (0.0),
2931  gddpg (0.0),
2932  gddpsp (0.0),
2933  gddpT (0.0),
2934  gds (0.0),
2935  geltd (0.0),
2936  gigb (0.0),
2937  gigd (0.0),
2938  gige (0.0),
2939  gigg (0.0),
2940  gigs (0.0),
2941  gigT (0.0),
2942  gigb_jac (0.0),
2943  gigd_jac (0.0),
2944  gige_jac (0.0),
2945  gigg_jac (0.0),
2946  gigs_jac (0.0),
2947  gigT_jac (0.0),
2948  gIdtotb (0.0),
2949  gIgtotb (0.0),
2950  gIgtotd (0.0),
2951  gIgtotg (0.0),
2952  gIgtots (0.0),
2953  gIstotb (0.0),
2954  gIstotd (0.0),
2955  gIstotg (0.0),
2956  gIstots (0.0),
2957  gppb (0.0),
2958  gppp (0.0),
2959  gsspb (0.0),
2960  gsspdp (0.0),
2961  gsspe (0.0),
2962  gsspg (0.0),
2963  gsspsp (0.0),
2964  gsspT (0.0),
2965  gTtb (0.0),
2966  gTtdp (0.0),
2967  gTte (0.0),
2968  gTtg (0.0),
2969  gTtsp (0.0),
2970  gTtt (0.0),
2971  Gm (0.0),
2972  Gmbs (0.0),
2973  Gme (0.0),
2974  Gmin (0.0),
2975  GmT (0.0),
2976  RevSum (0.0),
2977  sourceConductance (0.0),
2978  gIdtotg (0.0),
2979  gIdtotd (0.0),
2980  gIdtots (0.0),
2981  rbodyext (0.0),
2982  csesw (0.0),
2983  dt4 (0.0),
2984  st4 (0.0),
2985  cdmin (0.0),
2986  cdbox (0.0),
2987  csbox (0.0),
2988  csmin (0.0),
2989  grgeltd (0.0),
2990  phi (0.0),
2991  cdesw (0.0),
2992  mode (0),
2993  bjtoff (0),
2994  debugMod (0),
2995  OFF (false),
2996  rth0 (0.0),
2997  cth0 (0.0),
2998  bodySquares (0.0),
2999  frbody (0.0),
3000  soiMod (0),
3001  nbc (0.0),
3002  nseg (0.0),
3003  pdbcp (0.0),
3004  psbcp (0.0),
3005  agbcp (0.0),
3006  aebcp (0.0),
3007  vbsusr (0.0),
3008  tnodeout (0),
3009  rgateMod (0),
3010  cdrain (0.0),
3011  gIgsg (0.0),
3012  gIgss (0.0),
3013  gIgcdg (0.0),
3014  gIgcds (0.0),
3015  gIgcdd (0.0),
3016  gIgcdb (0.0),
3017  Igs (0.0),
3018  Igcd (0.0),
3019  gIgdg (0.0),
3020  gIgcsg (0.0),
3021  gIgdd (0.0),
3022  gIgcss (0.0),
3023  gIgcsd (0.0),
3024  gIgcsb (0.0),
3025  Igd (0.0),
3026  Igcs (0.0),
3027  qinv (0.0),
3028  cb (0.0),
3029  cd (0.0),
3030  cbd (0.0),
3031  gm (0.0),
3032  gmbs (0.0),
3033  gbbs (0.0),
3034  gbgs (0.0),
3035  gbds (0.0),
3036  cggb (0.0),
3037  cgdb (0.0),
3038  cgsb (0.0),
3039  cbgb (0.0),
3040  cbdb (0.0),
3041  cbsb (0.0),
3042  cdgb (0.0),
3043  cddb (0.0),
3044  cdsb (0.0),
3045  qbulk (0.0),
3046  icVDS (0.0),
3047  icVGS (0.0),
3048  icVBS (0.0),
3049  icVES (0.0),
3050  icVPS (0.0),
3051 
3052  ChargeComputationNeeded (true),
3053  selfheat (false),
3054  bodyMod (0),
3055  floating (0),
3056  dxpart (0.0),
3057  sxpart (0.0),
3058  cdreq (0.0),
3059  ceqbd (0.0),
3060  ceqbs (0.0),
3061  qgdo (0.0),
3062  qgso (0.0),
3063  qgd (0.0),
3064  qgs (0.0),
3065  qge (0.0),
3066  qgme (0.0),
3067  qgate (0.0),
3068  qbody (0.0),
3069  qdrn (0.0),
3070  qsub (0.0),
3071  qsrc (0.0),
3072  ceqbody (0.0),
3073  ceqgate (0.0),
3074  ceqgcrg (0.0),
3075  ceqqe (0.0),
3076  ceqqgmid (0.0),
3077  ceqbodcon (0.0),
3078  ceqth (0.0),
3079  ceqqth (0.0),
3080  Igtoteq (0.0),
3081  Idtoteq (0.0),
3082  Istoteq (0.0),
3083  dVgst_dVg (0.0),
3084  dVgst_dVb (0.0),
3085  dVgs_eff_dVg (0.0),
3086  dDeltaPhi_dVg (0.0),
3087  dDeltaPhi_dVd (0.0),
3088  dDeltaPhi_dVb (0.0),
3089  cqdrn (0.0),
3090  cqgate (0.0),
3091  cqsub (0.0),
3092  cqbody (0.0),
3093  cqtemp (0.0),
3094  vtm (0.0),
3095  temp (0.0),
3096  Vd (0.0),
3097  Vg (0.0),
3098  Vs (0.0),
3099  Ve (0.0),
3100  Vp (0.0),
3101  Vb (0.0),
3102  Vsp (0.0),
3103  Vdp (0.0),
3104  Vgp (0.0),
3105  Vgm (0.0),
3106  Idrain (0.0),
3107  Isource (0.0),
3108  Igate (0.0),
3109  IgateMid (0.0),
3110  vgb (0.0),
3111  vgd (0.0),
3112  ceqqd (0.0),
3113  ceqqb (0.0),
3114  ceqqg (0.0),
3115  ceqqg_Jdxp (0.0),
3116  ceqqb_Jdxp (0.0),
3117  ceqqd_Jdxp (0.0),
3118  ceqqe_Jdxp (0.0),
3119  ceqqth_Jdxp (0.0),
3120  ceqqgmid_Jdxp (0.0),
3121  cdreq_Jdxp (0.0),
3122  Idtoteq_Jdxp (0.0),
3123  Istoteq_Jdxp (0.0),
3124  Igtoteq_Jdxp (0.0),
3125  cbodcon_Jdxp (0.0),
3126  ceqbody_Jdxp (0.0),
3127  ceqgate_Jdxp (0.0),
3128  ceqbs_Jdxp (0.0),
3129  ceqbd_Jdxp (0.0),
3130  ceqbodcon_Jdxp (0.0),
3131  ceqgcrg_Jdxp (0.0),
3132  Idrain_Jdxp (0.0),
3133  Isource_Jdxp (0.0),
3134  Igate_Jdxp (0.0),
3135  IgateMid_Jdxp (0.0),
3136  ceqth_Jdxp (0.0),
3137  vbd (0.0),
3138  vbs (0.0),
3139  vps (0.0),
3140  vpd (0.0),
3141  ved (0.0),
3142  veb (0.0),
3143  ves (0.0),
3144  vgs (0.0),
3145  vge (0.0),
3146  vds (0.0),
3147  vged (0.0),
3148  vgmd (0.0),
3149  vgme (0.0),
3150  vgmb (0.0),
3151  vg (0.0),
3152  vd (0.0),
3153  vs (0.0),
3154  vp (0.0),
3155  ve (0.0),
3156  deltemp (0.0),
3157  delTemp (0.0),
3158  TempRatioMinus1 (0.0),
3159  vges (0.0),
3160  vgms (0.0),
3161  vbd_orig (0.0),
3162  vbs_orig (0.0),
3163  vps_orig (0.0),
3164  vpd_orig (0.0),
3165  ves_orig (0.0),
3166  ved_orig (0.0),
3167  vgs_orig (0.0),
3168  vds_orig (0.0),
3169  delTemp_orig (0.0),
3170  vges_orig (0.0),
3171  vgms_orig (0.0),
3172  vgd_orig (0.0),
3173  Vds (0.0),
3174  Vgs (0.0),
3175  Vbs (0.0),
3176  Vbd (0.0),
3177  Ves (0.0),
3178  Vps (0.0),
3179  Vds_orig (0.0),
3180  Vgs_orig (0.0),
3181  Vbs_orig (0.0),
3182  Vbd_orig (0.0),
3183  Ves_orig (0.0),
3184  Vps_orig (0.0),
3185  Vd_orig (0.0),
3186  Vg_orig (0.0),
3187  Vs_orig (0.0),
3188  Ve_orig (0.0),
3189  Vb_orig (0.0),
3190  Vp_orig (0.0),
3191  Vsp_orig (0.0),
3192  Vdp_orig (0.0),
3193  Vgp_orig (0.0),
3194  Vgm_orig (0.0),
3195  Vgsteff (0.0),
3196  Vdseff (0.0),
3197  ni (0.0),
3198  Abulk (0.0),
3199  vbseff (0.0),
3200  nstar (0.0),
3201  rds (0.0),
3202  AbovVgst2Vtm (0.0),
3203  ids (0.0),
3204  igidl (0.0),
3205  ic (0.0),
3206  ig (0.0),
3207  itun (0.0),
3208  ibs (0.0),
3209  ibd (0.0),
3210  iii (0.0),
3211  ibp (0.0),
3212  gbpbs (0.0),
3213  gbpps (0.0),
3214  gbpT (0.0),
3215  cbodcon (0.0),
3216  gme (0.0),
3217  gmT (0.0),
3218  gtempg (0.0),
3219  gtempb (0.0),
3220  gtempe (0.0),
3221  gtempT (0.0),
3222  gtempd (0.0),
3223  cth (0.0),
3224  cjs (0.0),
3225  cjd (0.0),
3226  cbody (0.0),
3227  cgate (0.0),
3228  gjdb (0.0),
3229  gjdd (0.0),
3230  gjdg (0.0),
3231  gjde (0.0),
3232  gjdT (0.0),
3233  gjsb (0.0),
3234  gjsd (0.0),
3235  gjsg (0.0),
3236  gjsT (0.0),
3237  gbes (0.0),
3238  gbps (0.0),
3239  gbT (0.0),
3240  cgT (0.0),
3241  cbT (0.0),
3242  ceT (0.0),
3243  cdT (0.0),
3244  cbeb (0.0),
3245  ceeb (0.0),
3246  cdeb (0.0),
3247  qse (0.0),
3248  qde (0.0),
3249  qbf (0.0),
3250  qjs (0.0),
3251  qjd (0.0),
3252  cbb (0.0),
3253  cbg (0.0),
3254  gcse (0.0),
3255  gcde (0.0),
3256  qb (0.0),
3257  qg (0.0),
3258  qd (0.0),
3259  qe (0.0),
3260  qgmid (0.0),
3261  qth (0.0),
3262  wdiosCV_NoSwap (0.0),
3263  wdiodCV_NoSwap (0.0),
3264  CAPcgmgmb (0.0),
3265  CAPcgmdb (0.0),
3266  CAPcgmsb (0.0),
3267  CAPcgmeb (0.0),
3268  CAPcdgmb (0.0),
3269  CAPcsgmb (0.0),
3270  CAPcegmb (0.0),
3271  CAPcggb (0.0),
3272  CAPcgdb (0.0),
3273  CAPcgsb (0.0),
3274  CAPcgeb (0.0),
3275  CAPcgbb (0.0),
3276  CAPcdgb (0.0),
3277  CAPcegb (0.0),
3278  CAPcsgb (0.0),
3279  CAPcbgb (0.0),
3280  CAPcddb (0.0),
3281  CAPcdsb (0.0),
3282  CAPcdeb (0.0),
3283  CAPcdT (0.0),
3284  CAPcsdb (0.0),
3285  CAPcssb (0.0),
3286  CAPcseb (0.0),
3287  CAPcsT (0.0),
3288  CAPcgT (0.0),
3289  CAPcbdb (0.0),
3290  CAPcbsb (0.0),
3291  CAPcbeb (0.0),
3292  CAPcbT (0.0),
3293  CAPcedb (0.0),
3294  CAPcesb (0.0),
3295  CAPceeb (0.0),
3296  CAPceT (0.0),
3297  CAPcTt (0.0),
3298  Qeqqg (0.0),
3299  Qeqqb (0.0),
3300  Qeqqd (0.0),
3301  Qeqqe (0.0),
3302  Qeqqth (0.0),
3303  Qeqqgmid (0.0),
3304  Qeqqg_Jdxp (0.0),
3305  Qeqqb_Jdxp (0.0),
3306  Qeqqd_Jdxp (0.0),
3307  Qeqqe_Jdxp (0.0),
3308  Qeqqth_Jdxp (0.0),
3309  Qeqqgmid_Jdxp (0.0),
3310  li_store_vbd (0),
3311  li_store_vbs (0),
3312  li_store_vgs (0),
3313  li_store_vds (0),
3314  li_store_ves (0),
3315  li_store_vps (0),
3316  li_store_vg (0),
3317  li_store_vd (0),
3318  li_store_vs (0),
3319  li_store_vp (0),
3320  li_store_ve (0),
3321  li_store_deltemp (0),
3322  li_store_vges (0),
3323  li_store_vgms (0),
3324  li_store_vgp (0),
3325  li_store_vgm (0),
3326  li_store_dev_id (0),
3327  li_store_dev_ig (0),
3328  li_store_dev_is (0),
3329  li_store_dev_ie (0),
3330  li_store_dev_ib (0),
3331 
3332  li_state_qb (0),
3333  li_state_qg (0),
3334  li_state_qd (0),
3335  li_state_qe (0),
3336  li_state_qgmid (0),
3337  li_state_qth (0),
3338  li_Drain (0),
3339  li_Gate (0),
3340  li_Source (0),
3341  li_Substrate (0),
3342  li_ExtBody (0),
3343  li_Body (0),
3344  li_Temperature (0),
3345  li_DrainPrime (0),
3346  li_SourcePrime (0),
3347  li_GatePrime (0),
3348  li_GateMid (0),
3349  li_Ids (0),
3350  li_Igs (0),
3351  li_Ibs (0),
3352  li_Ies (0),
3353  li_Ips (0),
3354  ADrainEquDrainNodeOffset (0),
3355  ADrainEquDrainPrimeNodeOffset (0),
3356  ADrainEquIdsOffset (0),
3357  AGateEquGateNodeOffset (0),
3358  AGateEquBodyNodeOffset (0),
3359  AGateEquDrainPrimeNodeOffset (0),
3360  AGateEquSourcePrimeNodeOffset (0),
3361  AGateEquGatePrimeNodeOffset (0),
3362  AGateEquGateMidNodeOffset (0),
3363  AGateEquIgsOffset (0),
3364  ASourceEquSourceNodeOffset (0),
3365  ASourceEquSourcePrimeNodeOffset (0),
3366  ASourceEquIdsOffset (0),
3367  ASourceEquIgsOffset (0),
3368  ASourceEquIbsOffset (0),
3369  ASourceEquIesOffset (0),
3370  ASourceEquIpsOffset (0),
3371  ASubstrateEquSubstrateNodeOffset (0),
3372  ASubstrateEquBodyNodeOffset (0),
3373  ASubstrateEquTemperatureNodeOffset (0),
3374  ASubstrateEquDrainPrimeNodeOffset (0),
3375  ASubstrateEquSourcePrimeNodeOffset (0),
3376  ASubstrateEquGatePrimeNodeOffset (0),
3377  ASubstrateEquGateMidNodeOffset (0),
3378  ASubstrateEquIesOffset (0),
3379  AExtBodyEquExtBodyNodeOffset (0),
3380  AExtBodyEquBodyNodeOffset (0),
3381  AExtBodyEquIpsOffset (0),
3382  ABodyEquSubstrateNodeOffset (0),
3383  ABodyEquExtBodyNodeOffset (0),
3384  ABodyEquBodyNodeOffset (0),
3385  ABodyEquTemperatureNodeOffset (0),
3386  ABodyEquDrainPrimeNodeOffset (0),
3387  ABodyEquSourcePrimeNodeOffset (0),
3388  ABodyEquGatePrimeNodeOffset (0),
3389  ABodyEquIbsOffset (0),
3390  ATemperatureEquSubstrateNodeOffset (0),
3391  ATemperatureEquBodyNodeOffset (0),
3392  ATemperatureEquTemperatureNodeOffset (0),
3393  ATemperatureEquDrainPrimeNodeOffset (0),
3394  ATemperatureEquSourcePrimeNodeOffset (0),
3395  ATemperatureEquGatePrimeNodeOffset (0),
3396  ADrainPrimeEquDrainNodeOffset (0),
3397  ADrainPrimeEquSubstrateNodeOffset (0),
3398  ADrainPrimeEquBodyNodeOffset (0),
3399  ADrainPrimeEquTemperatureNodeOffset (0),
3400  ADrainPrimeEquDrainPrimeNodeOffset (0),
3401  ADrainPrimeEquSourcePrimeNodeOffset (0),
3402  ADrainPrimeEquGatePrimeNodeOffset (0),
3403  ADrainPrimeEquGateMidNodeOffset (0),
3404  ASourcePrimeEquSourceNodeOffset (0),
3405  ASourcePrimeEquSubstrateNodeOffset (0),
3406  ASourcePrimeEquBodyNodeOffset (0),
3407  ASourcePrimeEquTemperatureNodeOffset (0),
3408  ASourcePrimeEquDrainPrimeNodeOffset (0),
3409  ASourcePrimeEquSourcePrimeNodeOffset (0),
3410  ASourcePrimeEquGatePrimeNodeOffset (0),
3411  ASourcePrimeEquGateMidNodeOffset (0),
3412  AGatePrimeEquGateNodeOffset (0),
3413  AGatePrimeEquSubstrateNodeOffset (0),
3414  AGatePrimeEquBodyNodeOffset (0),
3415  AGatePrimeEquTemperatureNodeOffset (0),
3416  AGatePrimeEquDrainPrimeNodeOffset (0),
3417  AGatePrimeEquSourcePrimeNodeOffset (0),
3418  AGatePrimeEquGatePrimeNodeOffset (0),
3419  AGatePrimeEquGateMidNodeOffset (0),
3420  AGateMidEquGateNodeOffset (0),
3421  AGateMidEquSubstrateNodeOffset (0),
3422  AGateMidEquBodyNodeOffset (0),
3423  AGateMidEquDrainPrimeNodeOffset (0),
3424  AGateMidEquSourcePrimeNodeOffset (0),
3425  AGateMidEquGatePrimeNodeOffset (0),
3426  AGateMidEquGateMidNodeOffset (0),
3427  icVDSEquVdOffset (0),
3428  icVDSEquVsOffset (0),
3429  icVDSEquIdsOffset (0),
3430  icVGSEquVgOffset (0),
3431  icVGSEquVsOffset (0),
3432  icVGSEquIgsOffset (0),
3433  icVBSEquVsOffset (0),
3434  icVBSEquVbOffset (0),
3435  icVBSEquIbsOffset (0),
3436  icVESEquVeOffset (0),
3437  icVESEquVsOffset (0),
3438  icVESEquIesOffset (0),
3439  icVPSEquVpOffset (0),
3440  icVPSEquVsOffset (0),
3441  icVPSEquIpsOffset (0),
3442 
3444  // Jacobian Matrix f-Ptrs:
3445 // drain row:
3446  f_DrainEquDrainNodePtr(0),
3447  f_DrainEquDrainPrimeNodePtr(0),
3448  f_DrainEquIdsPtr(0),
3449 
3450 // gate row:
3451  f_GateEquGateNodePtr(0),
3452  f_GateEquBodyNodePtr(0),
3453  f_GateEquDrainPrimeNodePtr(0),
3454  f_GateEquSourcePrimeNodePtr(0),
3455  f_GateEquGatePrimeNodePtr(0),
3456  f_GateEquGateMidNodePtr(0),
3457  f_GateEquIgsPtr(0),
3458 
3459 // source row:
3460  f_SourceEquSourceNodePtr(0),
3461  f_SourceEquSourcePrimeNodePtr(0),
3462  f_SourceEquIdsPtr(0),
3463  f_SourceEquIgsPtr(0),
3464  f_SourceEquIbsPtr(0),
3465  f_SourceEquIesPtr(0),
3466  f_SourceEquIpsPtr(0),
3467 
3468 // substrate row:
3469  f_SubstrateEquSubstrateNodePtr(0),
3470  f_SubstrateEquBodyNodePtr(0),
3471  f_SubstrateEquTemperatureNodePtr(0),
3472  f_SubstrateEquDrainPrimeNodePtr(0),
3473  f_SubstrateEquSourcePrimeNodePtr(0),
3474  f_SubstrateEquGatePrimeNodePtr(0),
3475  f_SubstrateEquGateMidNodePtr(0),
3476  f_SubstrateEquIesPtr(0),
3477 
3478 // external body row:
3479  f_ExtBodyEquExtBodyNodePtr(0),
3480  f_ExtBodyEquBodyNodePtr(0),
3481  f_ExtBodyEquIpsPtr(0),
3482 
3483 // body row:
3484  f_BodyEquSubstrateNodePtr(0),
3485  f_BodyEquExtBodyNodePtr(0),
3486  f_BodyEquBodyNodePtr(0),
3487  f_BodyEquTemperatureNodePtr(0),
3488  f_BodyEquDrainPrimeNodePtr(0),
3489  f_BodyEquSourcePrimeNodePtr(0),
3490  f_BodyEquGatePrimeNodePtr(0),
3491  f_BodyEquIbsPtr(0),
3492 
3493 // temperature row:
3494  f_TemperatureEquSubstrateNodePtr(0),
3495  f_TemperatureEquBodyNodePtr(0),
3496  f_TemperatureEquTemperatureNodePtr(0),
3497  f_TemperatureEquDrainPrimeNodePtr(0),
3498  f_TemperatureEquSourcePrimeNodePtr(0),
3499  f_TemperatureEquGatePrimeNodePtr(0),
3500 
3501 // drain' row:
3502  f_DrainPrimeEquDrainNodePtr(0),
3503  f_DrainPrimeEquSubstrateNodePtr(0),
3504  f_DrainPrimeEquBodyNodePtr(0),
3505  f_DrainPrimeEquTemperatureNodePtr(0),
3506  f_DrainPrimeEquDrainPrimeNodePtr(0),
3507  f_DrainPrimeEquSourcePrimeNodePtr(0),
3508  f_DrainPrimeEquGatePrimeNodePtr(0),
3509  f_DrainPrimeEquGateMidNodePtr(0),
3510 
3511 // source' row:
3512  f_SourcePrimeEquSourceNodePtr(0),
3513  f_SourcePrimeEquSubstrateNodePtr(0),
3514  f_SourcePrimeEquBodyNodePtr(0),
3515  f_SourcePrimeEquTemperatureNodePtr(0),
3516  f_SourcePrimeEquDrainPrimeNodePtr(0),
3517  f_SourcePrimeEquSourcePrimeNodePtr(0),
3518  f_SourcePrimeEquGatePrimeNodePtr(0),
3519  f_SourcePrimeEquGateMidNodePtr(0),
3520 
3521 // gate' row:
3522  f_GatePrimeEquGateNodePtr(0),
3523  f_GatePrimeEquSubstrateNodePtr(0),
3524  f_GatePrimeEquBodyNodePtr(0),
3525  f_GatePrimeEquTemperatureNodePtr(0),
3526  f_GatePrimeEquDrainPrimeNodePtr(0),
3527  f_GatePrimeEquSourcePrimeNodePtr(0),
3528  f_GatePrimeEquGatePrimeNodePtr(0),
3529  f_GatePrimeEquGateMidNodePtr(0),
3530 
3531 // gate mid row:
3532  f_GateMidEquGateNodePtr(0),
3533  f_GateMidEquSubstrateNodePtr(0),
3534  f_GateMidEquBodyNodePtr(0),
3535  f_GateMidEquDrainPrimeNodePtr(0),
3536  f_GateMidEquSourcePrimeNodePtr(0),
3537  f_GateMidEquGatePrimeNodePtr(0),
3538  f_GateMidEquGateMidNodePtr(0),
3539 
3540  // These offset are for the voltage sources that represent initial
3541  // conditions on Vds, Vgs, Vbs, Ves and Vps
3542 
3543  // f_icVDS
3544  f_icVDSEquVsPtr(0),
3545  f_icVDSEquVdPtr(0),
3546  f_icVDSEquIdsPtr(0),
3547 
3548  // f_icVGS
3549  f_icVGSEquVsPtr(0),
3550  f_icVGSEquVgPtr(0),
3551  f_icVGSEquIgsPtr(0),
3552 
3553  // f_icVBS
3554  f_icVBSEquVsPtr(0),
3555  f_icVBSEquVbPtr(0),
3556  f_icVBSEquIbsPtr(0),
3557 
3558  // f_icVES
3559  f_icVESEquVsPtr(0),
3560  f_icVESEquVePtr(0),
3561  f_icVESEquIesPtr(0),
3562 
3563  // f_icVPS
3564  f_icVPSEquVsPtr(0),
3565  f_icVPSEquVpPtr(0),
3566  f_icVPSEquIpsPtr(0),
3567 
3568  // Jacobian Matrix q-Ptrs:
3569 
3570 // drain row:
3571  q_DrainEquDrainNodePtr(0),
3572  q_DrainEquDrainPrimeNodePtr(0),
3573  q_DrainEquIdsPtr(0),
3574 
3575 // gate row:
3576  q_GateEquGateNodePtr(0),
3577  q_GateEquBodyNodePtr(0),
3578  q_GateEquDrainPrimeNodePtr(0),
3579  q_GateEquSourcePrimeNodePtr(0),
3580  q_GateEquGatePrimeNodePtr(0),
3581  q_GateEquGateMidNodePtr(0),
3582  q_GateEquIgsPtr(0),
3583 
3584 // source row:
3585  q_SourceEquSourceNodePtr(0),
3586  q_SourceEquSourcePrimeNodePtr(0),
3587  q_SourceEquIdsPtr(0),
3588  q_SourceEquIgsPtr(0),
3589  q_SourceEquIbsPtr(0),
3590  q_SourceEquIesPtr(0),
3591  q_SourceEquIpsPtr(0),
3592 
3593 // substrate row:
3594  q_SubstrateEquSubstrateNodePtr(0),
3595  q_SubstrateEquBodyNodePtr(0),
3596  q_SubstrateEquTemperatureNodePtr(0),
3597  q_SubstrateEquDrainPrimeNodePtr(0),
3598  q_SubstrateEquSourcePrimeNodePtr(0),
3599  q_SubstrateEquGatePrimeNodePtr(0),
3600  q_SubstrateEquGateMidNodePtr(0),
3601  q_SubstrateEquIesPtr(0),
3602 
3603 // external body row:
3604  q_ExtBodyEquExtBodyNodePtr(0),
3605  q_ExtBodyEquBodyNodePtr(0),
3606  q_ExtBodyEquIpsPtr(0),
3607 
3608 // body row:
3609  q_BodyEquSubstrateNodePtr(0),
3610  q_BodyEquExtBodyNodePtr(0),
3611  q_BodyEquBodyNodePtr(0),
3612  q_BodyEquTemperatureNodePtr(0),
3613  q_BodyEquDrainPrimeNodePtr(0),
3614  q_BodyEquSourcePrimeNodePtr(0),
3615  q_BodyEquGatePrimeNodePtr(0),
3616  q_BodyEquIbsPtr(0),
3617 
3618 // temperature row:
3619  q_TemperatureEquSubstrateNodePtr(0),
3620  q_TemperatureEquBodyNodePtr(0),
3621  q_TemperatureEquTemperatureNodePtr(0),
3622  q_TemperatureEquDrainPrimeNodePtr(0),
3623  q_TemperatureEquSourcePrimeNodePtr(0),
3624  q_TemperatureEquGatePrimeNodePtr(0),
3625 
3626 // drain' row:
3627  q_DrainPrimeEquDrainNodePtr(0),
3628  q_DrainPrimeEquSubstrateNodePtr(0),
3629  q_DrainPrimeEquBodyNodePtr(0),
3630  q_DrainPrimeEquTemperatureNodePtr(0),
3631  q_DrainPrimeEquDrainPrimeNodePtr(0),
3632  q_DrainPrimeEquSourcePrimeNodePtr(0),
3633  q_DrainPrimeEquGatePrimeNodePtr(0),
3634  q_DrainPrimeEquGateMidNodePtr(0),
3635 
3636 // source' row:
3637  q_SourcePrimeEquSourceNodePtr(0),
3638  q_SourcePrimeEquSubstrateNodePtr(0),
3639  q_SourcePrimeEquBodyNodePtr(0),
3640  q_SourcePrimeEquTemperatureNodePtr(0),
3641  q_SourcePrimeEquDrainPrimeNodePtr(0),
3642  q_SourcePrimeEquSourcePrimeNodePtr(0),
3643  q_SourcePrimeEquGatePrimeNodePtr(0),
3644  q_SourcePrimeEquGateMidNodePtr(0),
3645 
3646 // gate' row:
3647  q_GatePrimeEquGateNodePtr(0),
3648  q_GatePrimeEquSubstrateNodePtr(0),
3649  q_GatePrimeEquBodyNodePtr(0),
3650  q_GatePrimeEquTemperatureNodePtr(0),
3651  q_GatePrimeEquDrainPrimeNodePtr(0),
3652  q_GatePrimeEquSourcePrimeNodePtr(0),
3653  q_GatePrimeEquGatePrimeNodePtr(0),
3654  q_GatePrimeEquGateMidNodePtr(0),
3655 
3656 // gate mid row:
3657  q_GateMidEquGateNodePtr(0),
3658  q_GateMidEquSubstrateNodePtr(0),
3659  q_GateMidEquBodyNodePtr(0),
3660  q_GateMidEquDrainPrimeNodePtr(0),
3661  q_GateMidEquSourcePrimeNodePtr(0),
3662  q_GateMidEquGatePrimeNodePtr(0),
3663  q_GateMidEquGateMidNodePtr(0),
3664 
3665  // These offset are for the voltage sources that represent initial
3666  // conditions on Vds, Vgs, Vbs, Ves and Vps
3667 
3668  // q_icVDS
3669  q_icVDSEquVsPtr(0),
3670  q_icVDSEquVdPtr(0),
3671  q_icVDSEquIdsPtr(0),
3672 
3673  // q_icVGS
3674  q_icVGSEquVsPtr(0),
3675  q_icVGSEquVgPtr(0),
3676  q_icVGSEquIgsPtr(0),
3677 
3678  // q_icVBS
3679  q_icVBSEquVsPtr(0),
3680  q_icVBSEquVbPtr(0),
3681  q_icVBSEquIbsPtr(0),
3682 
3683  // q_icVES
3684  q_icVESEquVsPtr(0),
3685  q_icVESEquVePtr(0),
3686  q_icVESEquIesPtr(0),
3687 
3688  // q_icVPS
3689  q_icVPSEquVsPtr(0),
3690  q_icVPSEquVpPtr(0),
3691  q_icVPSEquIpsPtr(0),
3692 #endif
3693 
3694  vlDebug (false),
3695  blockHomotopyID (0),
3696  randomPerturb (0.0)
3697 {
3698  int i,j,k;
3699 
3700  numExtVars = IB.numExtVars;
3701 
3702  // Set params to constant default values:
3703  setDefaultParams ();
3704 
3705  // Set params according to instance line and constant defaults from metadata:
3706  setParams (IB.params);
3707 
3708  // Set any non-constant parameter defaults:
3709  if (!given("TEMP"))
3710  temp = getDeviceOptions().temp.getImmutableValue<double>();
3711  if (!given("L"))
3712  l =model_.model_l;
3713  if (!given("W"))
3714  w =model_.model_w;
3715  if (!given("RGATEMOD"))
3717  if (!given("SOIMOD"))
3718  soiMod = model_.soiMod;
3719 
3720  if (!given("RTH0"))
3721  rth0 = model_.rth0;
3722  if (!given("CTH0"))
3723  cth0 = model_.cth0;
3724 
3725  double Qsi, Vbs0t;
3726  Qsi = CONSTQ * model_.npeak
3727  * (1.0 + model_.nlx / l) * 1e6 * model_.tsi;
3728  Vbs0t = 0.8 - 0.5 * Qsi / model_.csi + model_.vbsa;
3729 
3730  selfheat = (model_.shMod == 1) && (rth0 != 0);
3731 
3732  if (soiMod == 3) /* auto selection */
3733  {
3734  if (Vbs0t > model_.vbs0fd)
3735  {
3736  soiMod = 2; /* ideal FD mode */
3737  }
3738  else
3739  {
3740  if (Vbs0t < model_.vbs0pd)
3741  {
3742  soiMod = 0; /* BSIMPD */
3743  }
3744  else
3745  {
3746  soiMod = 1;
3747  }
3748  }
3749  }
3750 
3751  // Calculate any parameters specified as expressions:
3753 
3754  // calculate dependent (ie computed) params and check for errors:
3755  //
3756  if (getDeviceOptions().verboseLevel > 0 && (l > model_.Lmax || l < model_.Lmin))
3757  {
3758  UserError0(*this)<< "Channel length " << l << " out of specified range ("
3759  << model_.Lmin << " , " << model_.Lmax << ")";
3760  }
3761 
3762  if (getDeviceOptions().verboseLevel > 0 && (w > model_.Wmax || w < model_.Wmin))
3763  {
3764  UserError0(*this) << "Channel width " << w << " out of specified range ("
3765  << model_.Wmin << " , " << model_.Wmax << ")";
3766  }
3767 
3768  // The next block of code determines which of the nodes (solution variables)
3769  // need to be present. The "Node" variables, like dNode and gNode, use
3770  // the following convention:
3771  //
3772  // 0 - does not exist
3773  // 1 - exists as an internal node
3774  // 2 - exists as an external node
3775  //
3776  if (numExtVars < 4 || (numExtVars < 5 && given("TNODEOUT")))
3777  {
3778  if (given("TNODEOUT"))
3779  UserError0(*this) << "Less than 5 external nodes with tnodeout set";
3780  else
3781  UserError0(*this) << "Less than 4 external nodes without tnodeout set";
3782  }
3783  if (numExtVars > 7 || (numExtVars > 6 && !given("TNODEOUT")))
3784  {
3785  if (given("TNODEOUT"))
3786  UserError0(*this) << "Over 7 nodes with tnodeout set";
3787  else
3788  UserError0(*this) <<"Over 6 nodes without tnodeout set";
3789  }
3790 
3791  numIntVars = 0;
3792  floating = 0;
3793  dNode = 2;
3794  gNode = 2;
3795  sNode = 2;
3796  eNode = 2;
3797  bNode = 0;
3798  pNode = 0;
3799  pNodeMappedToB = false;
3800  tNode = 0;
3801  dNodePrime = 0;
3802  sNodePrime = 0;
3803  gNodePrime = 0;
3804  gNodeMid = 0;
3805 
3806  processParams ();
3807 
3808  if (model_.sheetResistance > 0.0)
3809  {
3810  if (sourceSquares > 0.0)
3811  {
3812  sNodePrime = 1;
3813  ++numIntVars;
3814  }
3815  if (drainSquares > 0.0)
3816  {
3817  dNodePrime = 1;
3818  ++numIntVars;
3819  }
3820  }
3821 
3822  if (rgateMod >= 1)
3823  {
3824  gNodePrime = 1;
3825  ++numIntVars;
3826  }
3827 
3828  if (rgateMod == 3)
3829  {
3830  gNodeMid = 1;
3831  ++numIntVars;
3832  }
3833 
3834  if (soiMod == 2) // v3.2
3835  {
3836  bodyMod = 0;
3837  bNode = 0; // body node, does not exist
3838  pNode = 0; // p-node(ExtBody) does not exist.
3839  } // For ideal FD, body contact is disabled and no body node
3840  else
3841  {
3842  if (numExtVars == 4) // floating body case -- 4-node
3843  {
3844  bNode = 1; // internal
3845  pNode = 0; // does not exist
3846  ++numIntVars;
3847  floating = 1;
3848  bodyMod = 0;
3849  }
3850  else // the 5th Node has been assigned
3851  {
3852  if (!given("TNODEOUT"))
3853  {
3854  if (numExtVars == 5) // 5-node body tie, bNode has not been assigned
3855  {
3856  if ((model_.rbody == 0.0) && (model_.rbsh == 0.0))
3857  { // ideal body tie, pNode is not used
3858  bodyMod = 2;
3859  bNode = 2; // body node, exists as external variable
3860  pNode = 0; // p-node(ExtBody) does not exist.
3861  pNodeMappedToB = true; // but is mapped onto B
3862  }
3863  else
3864  { // nonideal body tie
3865  bodyMod = 1;
3866  bNode = 1; // body node, exists as internal variable
3867  pNode = 2; // p-node(ExtBody) exists as external variable
3868  ++numIntVars;
3869  }
3870  }
3871  else // 6-node body tie, bNode has been assigned
3872  {
3873  bodyMod = 1;
3874  bNode = 2; // body node exists and is internal
3875  pNode = 2; // pnode (ExtBody) exists and is external
3876 
3877  // error test - make sure body resistor has a nonzero value
3878  if ((model_.rbody == 0.0) && (model_.rbsh == 0.0))
3879  {
3880  UserWarning0(*this) << "Model parameter rbody is 0, setting to 1";
3881 
3882  model_.rbody = 1.;
3883  }
3884  }
3885  }
3886  else
3887  { // t-node assigned
3888  tNode = 2;
3889  if (numExtVars == 5)
3890  { // 4 nodes & t-node, floating body
3891  bNode = 1; // internal
3892  pNode = 0; // does not exist
3893  ++numIntVars;
3894  floating = 1;
3895  bodyMod = 0;
3896  }
3897  else
3898  { // 5 or 6 nodes & t-node, body-contact device
3899  if (numExtVars == 6)
3900  { // 5 nodes & tnode
3901  if ((model_.rbody == 0.0) && (model_.rbsh == 0.0))
3902  { // ideal body tie, pNode is not used
3903  bNode = 2; // external
3904  pNode = 0; // doesn't exist
3905  pNodeMappedToB = true; // P and B nodes are the same
3906  bodyMod = 2;
3907  }
3908  else
3909  { // nonideal body tie
3910  bNode = 1; // internal
3911  pNode = 2; // external
3912  ++numIntVars;
3913  bodyMod = 1;
3914  }
3915  }
3916  else
3917  { // 6 nodes & t-node
3918  bodyMod = 1;
3919  bNode = 2; // external
3920  pNode = 2; // external
3921 
3922  // error test - make sure body resistor has a nonzero value
3923  if ((model_.rbody == 0.0) && (model_.rbsh == 0.0))
3924  {
3925  UserWarning0(*this) << "Model parameter rbody is 0, setting to 1";
3926 
3927  model_.rbody = 1.;
3928  }
3929  }
3930  }
3931  }
3932  }
3933  }
3934 
3935  if (selfheat && tNode == 0)
3936  {
3937  tNode = 1;
3938  ++numIntVars;
3939  }
3940 
3941  if (tNode == 2 && bNode == 1) {
3942  if (pNode == 0)
3943  {
3944  P_index = 6;
3945  B_index = 5;
3946  T_index = 4;
3947  }
3948  else
3949  {
3950  P_index = 4;
3951  B_index = 6;
3952  T_index = 5;
3953  }
3954  }
3955  else
3956  {
3957  P_index = 4;
3958  B_index = 5;
3959  T_index = 6;
3960  }
3961 
3962 // The T node is either present or not, and is really not a normal node, but
3963 // rather is a stand alone node that is connected to ground by a thermal
3964 // resistance and capacitance. It is treated specially and is the highest
3965 // order term in the indexing of the various jacobians.
3966 
3967  if (tNode == 0)
3968  {
3969  i = 24;
3970  }
3971  else
3972  {
3973  if (B_index == 6)
3974  i = 72;
3975  else if (P_index == 6)
3976  i = 84;
3977  else
3978  i = 0;
3979  }
3980 
3981 // Similarly, the P or B nodes can either be present or not. In the fully
3982 // depleted model they are not present. Their presence or lack there of
3983 // is used to indicate which chunk of jacobians/maps are to be used.
3984 
3985  if (pNode == 0 && bNode == 0)
3986  {
3987  j = 4;
3988  i = 48+i/2;
3989  }
3990  else
3991  {
3992  if (T_index == 6)
3993  j = 8;
3994  else
3995  j = 4;
3996  }
3997 
3998 // Note that gNodeMid can only be present when gNodePrime is present so there
3999 // are three possibilities for the gate node configuration. The others which
4000 // follow are the standard presence or absense of the prime node depending
4001 // on whether a lead resistance exists.
4002 
4003  if (gNodeMid == 0)
4004  {
4005  i += j;
4006  if (gNodePrime == 0)
4007  i += j;
4008  }
4009  j /= 2;
4010  if (sNodePrime == 0)
4011  i += j;
4012  j /= 2;
4013  if (dNodePrime == 0)
4014  i += j;
4015  j /= 2;
4016  if (pNode == 0 || bNode == 0)
4017  i += j;
4018 
4019  jacID = i;
4020 
4021  // update numIntVars for any specified initial conditions
4022  if (icVDSGiven) ++numIntVars;
4023  if (icVGSGiven) ++numIntVars;
4024  if (icVBSGiven) ++numIntVars;
4025  if (icVESGiven) ++numIntVars;
4026  // Spice model documentation says to ignore icVPS if
4027  // there isn't a p terminal.
4028  if (pNode != 0)
4029  {
4030  if (icVPSGiven) ++numIntVars;
4031  }
4032 
4033  if (!given("AD")) {drainArea = getDeviceOptions().defad;}
4034  if (!given("AS")) {sourceArea = getDeviceOptions().defas;}
4035 
4036  // process source/drain series resistance
4038  if (drainConductance > 0.0)
4040  else
4041  drainConductance = 0.0;
4042 
4044  if (sourceConductance > 0.0)
4046  else
4047  sourceConductance = 0.0;
4048 
4049  devConMap.resize(numExtVars);
4050  devConMap[0] = 3;
4051  devConMap[1] = 2;
4052  devConMap[2] = 3;
4053  devConMap[3] = 1;
4054  k = 4;
4055  if (bNode == 2)
4056  {
4057  devConMap[k++] = 3;
4058  if (pNode ==2)
4059  devConMap[k++] = 3;
4060  if (tNode == 2)
4061  devConMap[k++] = 4;
4062  }
4063  else
4064  {
4065  if (tNode == 2)
4066  devConMap[k++] = 4;
4067  if (pNode == 2)
4068  devConMap[k++] = 3;
4069  }
4070  if (k != numExtVars)
4071  {
4072  std::cerr << std::endl;
4073  std::cerr << "numExtVars = " << numExtVars << std::endl;
4074  std::cerr << "numIntVars = " << numIntVars << std::endl;
4075  std::cerr << "dNode = " << dNode << std::endl;
4076  std::cerr << "gNode = " << gNode << std::endl;
4077  std::cerr << "sNode = " << sNode << std::endl;
4078  std::cerr << "eNode = " << eNode << std::endl;
4079  std::cerr << "bNode = " << bNode << std::endl;
4080  std::cerr << "pNode = " << pNode << std::endl;
4081  std::cerr << "tNode = " << tNode << std::endl;
4082  std::cerr << "dNodePrime = " << dNodePrime << std::endl;
4083  std::cerr << "sNodePrime = " << sNodePrime << std::endl;
4084  std::cerr << "gNodePrime = " << gNodePrime << std::endl;
4085  std::cerr << "gNodeMid = " << gNodeMid << std::endl;
4086  std::string msg = "Instance::Instance: Internal error in lead connectivity";
4087 
4088  N_ERH_ErrorMgr::report ( N_ERH_ErrorMgr::DEV_FATAL,msg);
4089  }
4090 
4091  setNumStoreVars(16);
4092  numStateVars = 6;
4093  numLeadCurrentStoreVars = 5; // drain, gate, source, ext & base lead currents
4094 
4095  blockHomotopyID =
4096  devSupport.getGainScaleBlockID(getDeviceOptions().numGainScaleBlocks);
4097  randomPerturb =
4099 
4100  setupJacStamp();
4101 
4102 #ifdef Xyce_DEBUG_DEVICE
4103  debugOutputModelParams();
4104 #endif
4105 }
4106 
4107 //-----------------------------------------------------------------------------
4108 // Function : Instance::setupJacStamp
4109 // Purpose : Sets up the static jac stamps.
4110 //
4111 // Special Notes : This stuff was originally in the constructor, but it is
4112 // complex enough to require its own function. Also, it
4113 // may be a better choice to call this at a later time than
4114 // the constructor, especially as the constructor will
4115 // get called multiple times (once by the IO package, and once
4116 // by topology).
4117 //
4118 // Scope : public
4119 // Creator : Eric Keiter
4120 // Creation Date : 07/13/08
4121 //-----------------------------------------------------------------------------
4123 {
4124  int c, d, off, i, j, k, m, i_b, j_b, k_b, sz, t;
4125  int row1, row2, dest, n_swap, top;
4126 
4127 // The jacobian stamps come in 96 varieties. These are derived from the maximum
4128 // sized jacobian and stored in the stamp and map vectors in the following
4129 // chunks, based on certain nodes being present or missing:
4130 
4131 // 0-23 Full jacobian
4132 // 24-47 Temperature node missing (no self heating)
4133 // 48-59 P and B nodes missing (fully depleted, soiMod = 2)
4134 // 60-71 Temperature, P, and B nodes missing (no self heating, fully depleted)
4135 // 72-83 Temperature external, Body is internal, Ext Body is external.
4136 // Special case where the positions of T and B must be switched so that
4137 // all the external nodes come before the internal nodes.
4138 // 84-95 Temperature external, Body is internal, Ext Body is missing.
4139 // Special case where the positions of T and P must be switched so that
4140 // all the external nodes come before the internal nodes.
4141 
4142 // Each chunk is then broken into three sub chunks based on which gate model
4143 // is used. The gate model defines which gate nodes are present. The three
4144 // possibilities are shown with the range of jacobian indicies given for the
4145 // full jacobian base as an example:
4146 
4147 // 0-7 Gmid and Gprime both present
4148 // 8-15 Gprime present, Gmid merged with G node
4149 // 16-23 Gmid and Gprime both merged with G node
4150 
4151 // These in turn are similarly subdivided into two chunks, the higher of which
4152 // has the Sprime node merged with S
4153 
4154 // These in turn are similarly subdivided into two chunks, the higher of which
4155 // has the Dprime node merged with D
4156 
4157 // Finally, for the chunks with 24 members there is a final subdivision
4158 // depending on whether P and B are to be merged. For the chunks starting at
4159 // 48, 60, and 72 P and B are not merged. For the chunk starting at 84, P and
4160 // B are always merged.
4161 
4162  if (jacStamp_v.empty() )
4163  {
4164 
4165 // ----------------------------------------------------------------------------
4166 // |NZ| | |
4167 // | | |V_d V_g V_s V_e V_p V_b Temp V_d' V_s' V_g' V_gm |
4168 // ----------------------------------------------------------------------------
4169 // | 2|KCL_d | a b |
4170 // | 6|KCL_g | c d e f g h |
4171 // | 2|KCL_s | i j |
4172 // | 7|KCL_e | k l m n o p q |
4173 // | 2|KCL_p | r s |
4174 // | 7|KCL_b | t u v w x y z |
4175 // | 6|Temp | A B C D E F |
4176 // | 8|KCL_d'| G H I J K L M N |
4177 // | 8|KCL_s'| O P Q R S T U V |
4178 // | 8|KCL_g'| W X Y Z aa bb cc dd |
4179 // | 7|KCL_gm| ee ff gg hh ii jj kk |
4180 // ----------------------------------------------------------------------------
4181 
4182  jacMap_v.resize(96);
4183  jacMap2_v.resize(96);
4184 
4185  jacStamp_v.resize(96);
4186  jacStamp_v[0].resize(11);
4187  jacStamp_v[0][0].resize(2);
4188  jacStamp_v[0][0][0] = 0;
4189  jacStamp_v[0][0][1] = 7;
4190  jacStamp_v[0][1].resize(6);
4191  jacStamp_v[0][1][0] = 1;
4192  jacStamp_v[0][1][1] = 5;
4193  jacStamp_v[0][1][2] = 7;
4194  jacStamp_v[0][1][3] = 8;
4195  jacStamp_v[0][1][4] = 9;
4196  jacStamp_v[0][1][5] = 10;
4197  jacStamp_v[0][2].resize(2);
4198  jacStamp_v[0][2][0] = 2;
4199  jacStamp_v[0][2][1] = 8;
4200  jacStamp_v[0][3].resize(7);
4201  jacStamp_v[0][3][0] = 3;
4202  jacStamp_v[0][3][1] = 5;
4203  jacStamp_v[0][3][2] = 6;
4204  jacStamp_v[0][3][3] = 7;
4205  jacStamp_v[0][3][4] = 8;
4206  jacStamp_v[0][3][5] = 9;
4207  jacStamp_v[0][3][6] = 10;
4208  jacStamp_v[0][4].resize(2);
4209  jacStamp_v[0][4][0] = 4;
4210  jacStamp_v[0][4][1] = 5;
4211  jacStamp_v[0][5].resize(7);
4212  jacStamp_v[0][5][0] = 3;
4213  jacStamp_v[0][5][1] = 4;
4214  jacStamp_v[0][5][2] = 5;
4215  jacStamp_v[0][5][3] = 6;
4216  jacStamp_v[0][5][4] = 7;
4217  jacStamp_v[0][5][5] = 8;
4218  jacStamp_v[0][5][6] = 9;
4219  jacStamp_v[0][6].resize(6);
4220  jacStamp_v[0][6][0] = 3;
4221  jacStamp_v[0][6][1] = 5;
4222  jacStamp_v[0][6][2] = 6;
4223  jacStamp_v[0][6][3] = 7;
4224  jacStamp_v[0][6][4] = 8;
4225  jacStamp_v[0][6][5] = 9;
4226  jacStamp_v[0][7].resize(8);
4227  jacStamp_v[0][7][0] = 0;
4228  jacStamp_v[0][7][1] = 3;
4229  jacStamp_v[0][7][2] = 5;
4230  jacStamp_v[0][7][3] = 6;
4231  jacStamp_v[0][7][4] = 7;
4232  jacStamp_v[0][7][5] = 8;
4233  jacStamp_v[0][7][6] = 9;
4234  jacStamp_v[0][7][7] = 10;
4235  jacStamp_v[0][8].resize(8);
4236  jacStamp_v[0][8][0] = 2;
4237  jacStamp_v[0][8][1] = 3;
4238  jacStamp_v[0][8][2] = 5;
4239  jacStamp_v[0][8][3] = 6;
4240  jacStamp_v[0][8][4] = 7;
4241  jacStamp_v[0][8][5] = 8;
4242  jacStamp_v[0][8][6] = 9;
4243  jacStamp_v[0][8][7] = 10;
4244  jacStamp_v[0][9].resize(8);
4245  jacStamp_v[0][9][0] = 1;
4246  jacStamp_v[0][9][1] = 3;
4247  jacStamp_v[0][9][2] = 5;
4248  jacStamp_v[0][9][3] = 6;
4249  jacStamp_v[0][9][4] = 7;
4250  jacStamp_v[0][9][5] = 8;
4251  jacStamp_v[0][9][6] = 9;
4252  jacStamp_v[0][9][7] = 10;
4253  jacStamp_v[0][10].resize(7);
4254  jacStamp_v[0][10][0] = 1;
4255  jacStamp_v[0][10][1] = 3;
4256  jacStamp_v[0][10][2] = 5;
4257  jacStamp_v[0][10][3] = 7;
4258  jacStamp_v[0][10][4] = 8;
4259  jacStamp_v[0][10][5] = 9;
4260  jacStamp_v[0][10][6] = 10;
4261 
4262 // Map zero now contains the maximum sized jacobian stamp. The others will be
4263 // generated by removal of row/cols and by using jacStampMap to combine
4264 // row/cols corresponding to combining nodes in the usual way.
4265 
4266 // Stamp 24 omits rol/col 6 (T) from the original
4267 
4268  jacStamp_v[24].resize(10);
4269  j = 0;
4270  for (i=0 ; i<11 ; ++i)
4271  {
4272  if (i != 6)
4273  {
4274  jacStamp_v[24][j].clear();
4275  for (k=0 ; k<jacStamp_v[0][i].size() ; ++k)
4276  {
4277  if (jacStamp_v[0][i][k] < 6)
4278  jacStamp_v[24][j].push_back(jacStamp_v[0][i][k]);
4279  else if (jacStamp_v[0][i][k] > 6)
4280  jacStamp_v[24][j].push_back(jacStamp_v[0][i][k]-1);
4281  }
4282  ++j;
4283  }
4284  }
4285 
4286 // Stamp 72 swaps row/col 5 (B) with 6 (T) to make external vars come first
4287 // Stamp 84 swaps row/col 4 (P) with 6 (T) to make external vars come first
4288 // Stamp 73 is used as a temporary for this case
4289 
4290  for (c=0 ; c<2 ; ++c)
4291  {
4292  row1 = 5-c;
4293  row2 = 6;
4294  dest = 72+c;
4295  jacStamp_v[dest].resize(11);
4296  for (i=0 ; i<11 ; ++i)
4297  {
4298  if (i == row1)
4299  j = row2;
4300  else if (i == row2)
4301  j = row1;
4302  else
4303  j = i;
4304  jacStamp_v[dest][i].clear();
4305  for (k=0 ; k<jacStamp_v[0][j].size() ; ++k)
4306  {
4307  if (jacStamp_v[0][j][k] == row1)
4308  jacStamp_v[dest][i].push_back(row2);
4309  else if (jacStamp_v[0][j][k] == row2)
4310  jacStamp_v[dest][i].push_back(row1);
4311  else
4312  jacStamp_v[dest][i].push_back(jacStamp_v[0][j][k]);
4313  }
4314  n_swap = 1;
4315  while (n_swap > 0)
4316  {
4317  n_swap = 0;
4318  for (k=0 ; k<jacStamp_v[0][j].size()-1 ; ++k)
4319  {
4320  if (jacStamp_v[dest][i][k] > jacStamp_v[dest][i][k+1])
4321  {
4322  t = jacStamp_v[dest][i][k];
4323  jacStamp_v[dest][i][k] = jacStamp_v[dest][i][k+1];
4324  jacStamp_v[dest][i][k+1] = t;
4325  ++n_swap;
4326  }
4327  }
4328  }
4329  }
4330  }
4331 
4332 // Now, 84 is generated from 73. This is done by combining 5 (B) and 6 (P)
4333 
4334  jacMap_v[73].clear();
4335  jacStampMap (jacStamp_v[73], jacMap_v[73], jacMap2_v[73],
4336  jacStamp_v[84], jacMap_v[84], jacMap2_v[84], 6, 5, 11);
4337 
4338 // Finally, clean up temporary back to virgin state in case this matters
4339  for (i=0 ; i<11 ; ++i)
4340  jacStamp_v[73][i].clear();
4341  jacStamp_v[73].clear();
4342  jacMap_v[73].clear();
4343  jacMap2_v[73].clear();
4344 
4345 // Stamp 48 omits 4 (P) and 5 (B) from the original
4346 // Stamp 60 omits 4 (P) and 5 (B) from 24, which omitted 6 (T)
4347 
4348  for (c=0 ; c<2 ; ++c)
4349  {
4350  jacStamp_v[48+12*c].resize(9-c);
4351  j = 0;
4352  for (i=0 ; i<11 ; ++i)
4353  {
4354  if (i != 4 && i != 5 && (c != 1 || i != 10))
4355  {
4356  jacStamp_v[48+12*c][j].clear();
4357  for (k=0 ; k<jacStamp_v[24*c][i].size() ; ++k)
4358  {
4359  if (jacStamp_v[24*c][i][k] < 4)
4360  jacStamp_v[48+12*c][j].push_back(jacStamp_v[24*c][i][k]);
4361  else if (jacStamp_v[24*c][i][k] > 5)
4362  jacStamp_v[48+12*c][j].push_back(jacStamp_v[24*c][i][k]-2);
4363  }
4364  ++j;
4365  }
4366  }
4367  }
4368 
4369  for (c=0 ; c<6 ; ++c)
4370  {
4371  if (c >= 2)
4372  {
4373  off = 48+(c-2)*12;
4374  d = 2;
4375  }
4376  else
4377  {
4378  off = c*24;
4379  d = 1;
4380  }
4381  if (c == 4)
4382  {
4383  sz = 11;
4384  top = sz;
4385  }
4386  else if (c == 5)
4387  {
4388  sz = 11;
4389  top = 10;
4390  }
4391  else
4392  {
4393  sz = 11-c;
4394  top = sz;
4395  }
4396  if (c != 5)
4397  jacMap_v[off].clear();
4398  for (i=0 ; i<3 ; ++i)
4399  {
4400  i_b = 8*i/d;
4401  if (i >= 1)
4402  jacStampMap (jacStamp_v[off+i_b-8/d],
4403  jacMap_v[off+i_b-8/d], jacMap2_v[off+i_b-8/d],
4404  jacStamp_v[off+i_b],
4405  jacMap_v[off+i_b], jacMap2_v[off+i_b], top-i, 1, sz);
4406  for (j=0 ; j<2 ; ++j)
4407  {
4408  if (j == 1)
4409  jacStampMap (jacStamp_v[off+i_b],
4410  jacMap_v[off+i_b], jacMap2_v[off+i_b],
4411  jacStamp_v[off+i_b+4/d],
4412  jacMap_v[off+i_b+4/d], jacMap2_v[off+i_b+4/d],
4413  top-3, 2, sz);
4414  j_b = i_b+4*j/d;
4415  for (k=0 ; k<2 ; ++k)
4416  {
4417  if (k == 1)
4418  {
4419  jacStampMap (jacStamp_v[off+j_b],
4420  jacMap_v[off+j_b], jacMap2_v[off+j_b],
4421  jacStamp_v[off+j_b+2/d],
4422  jacMap_v[off+j_b+2/d], jacMap2_v[off+j_b+2/d],
4423  top-4, 0, sz);
4424  }
4425  if (d == 1) {
4426  k_b = j_b+2*k;
4427  for (m=0 ; m<2 ; ++m)
4428  {
4429  if (m == 1)
4430  jacStampMap (jacStamp_v[off+k_b],
4431  jacMap_v[off+k_b], jacMap2_v[off+k_b],
4432  jacStamp_v[off+k_b+1],
4433  jacMap_v[off+k_b+1], jacMap2_v[off+k_b+1],
4434  5, 4, sz);
4435  }
4436  }
4437  }
4438  }
4439  }
4440  }
4441  }
4442 
4443  // If the user has specified an initial condition for this instance,
4444  // then we'll make an instance specific jacobian stamp (otherwise
4445  // we have to generate 5 times the number of jacobian stamps already
4446  // done above.
4447 
4449  {
4450  // allocate all the rows we'll need
4451  int numRows = jacStamp_v[ jacID ].size();
4452  int numRowsMap = jacMap_v[ jacID ].size();
4453 
4454  // since not all the initial conditions may be present, we need
4455  // to calculate what the row/column numbers will be for the new
4456  // variables.
4457  int icVDSRow = 0;
4458  int icVGSRow = 0;
4459  int icVBSRow = 0;
4460  int icVESRow = 0;
4461  int icVPSRow = 0;
4462  int lastRow = numRows;
4463  int numExtraRows = 0;
4464 
4465  // we can update numRows for the new total number of rows
4466  numExtraRows += ( icVDSGiven ? 1 : 0 ) +
4467  ( icVGSGiven ? 1 : 0 ) +
4468  ( icVBSGiven ? 1 : 0 ) +
4469  ( icVESGiven ? 1 : 0 ) +
4470  ( icVPSGiven ? 1 : 0 );
4471  numRows += numExtraRows;
4472  numRowsMap += numExtraRows;
4473 
4474  // While we at it we'll add up how many extra terms we'll need in
4475  // each row
4476  std::vector< int > additionalValues( numRows, 0 );
4477 
4478  if( icVDSGiven )
4479  {
4480  icVDSRow = lastRow;
4481  ++lastRow;
4482  additionalValues[ 0 ] += 1; // KCL_d connection
4483  additionalValues[ 2 ] += 1; // KCL_s connection
4484  additionalValues[ icVDSRow ] += 3; // branch equation terms
4485  }
4486 
4487  if( icVGSGiven )
4488  {
4489  icVGSRow = lastRow;
4490  ++lastRow;
4491  additionalValues[ 1 ] += 1; // KCL_g connection
4492  additionalValues[ 2 ] += 1; // KCL_s connection
4493  additionalValues[ icVGSRow ] += 3; // branch equation terms
4494  }
4495 
4496  if( icVBSGiven )
4497  {
4498  icVBSRow = lastRow;
4499  ++lastRow;
4500  additionalValues[ 5 ] += 1; // KCL_b connection
4501  additionalValues[ 2 ] += 1; // KCL_s connection
4502  additionalValues[ icVBSRow ] += 3; // branch equation terms
4503  }
4504 
4505  if( icVESGiven )
4506  {
4507  icVESRow = lastRow;
4508  ++lastRow;
4509  additionalValues[ 3 ] += 1; // KCL_e connection
4510  additionalValues[ 2 ] += 1; // KCL_s connection
4511  additionalValues[ icVESRow ] += 3; // branch equation terms
4512  }
4513 
4514  if( icVPSGiven )
4515  {
4516  icVPSRow = lastRow;
4517  ++lastRow;
4518  additionalValues[ 4 ] += 1; // KCL_p connection
4519  additionalValues[ 2 ] += 1; // KCL_s connection
4520  additionalValues[ icVPSRow ] += 3; // branch equation terms
4521  }
4522 
4523  // now resize the jacStampIC for the right number of rows.
4524  jacStampIC.resize( numRows );
4525 
4526  // resize each row and copy the normal jacstamp over
4527  for ( int rw=0; rw < numRows; ++rw )
4528  {
4529  int numNonZeros = 0;
4530  if( rw < jacStamp_v[ jacID ].size() )
4531  {
4532  numNonZeros = jacStamp_v[jacID][rw].size() +
4533  additionalValues[rw];
4534 
4535  // copy this row of the jacStamp
4536  jacStampIC[rw].resize( numNonZeros );
4537  copy(jacStamp_v[jacID][rw].begin(), jacStamp_v[jacID][rw].end(),
4538  jacStampIC[rw].begin() );
4539 
4540  // sanity check to ensure that the copy stl function didn't act
4541  // as an insert operation
4542  assert( numNonZeros == jacStampIC[rw].size() );
4543  }
4544  else
4545  {
4546  numNonZeros = additionalValues[ rw ];
4547  jacStampIC[rw].resize( numNonZeros );
4548  }
4549  }
4550 
4551  // resize each map row and copy current map over
4552  // can't do this during the loop above because the map's may have extra
4553  // rows in them if some rows and columns have been combined.
4554  jacMapIC.resize( numRowsMap );
4555  jacMapIC2.resize( numRowsMap );
4556 
4557  // this offset lets us easily add to the jacStamp and the maps
4558  // when the maps have more rows than the jacStamp.
4559  int mapRowOffset = jacMapIC2.size() - jacStampIC.size() ;
4560 
4561  for( int rw=0; rw < numRowsMap; ++rw )
4562  {
4563  int numNonZeros = 0;
4564  if( rw < jacMap_v[ jacID ].size() )
4565  {
4566  numNonZeros = jacMap2_v[ jacID ][rw].size();
4567  if( rw < jacStamp_v[ jacID ].size() )
4568  numNonZeros += additionalValues[ rw ];
4569 
4570  // copy this row of the jacStampMap2
4571  jacMapIC2[rw].resize( numNonZeros );
4572  copy(jacMap2_v[jacID][rw].begin(), jacMap2_v[jacID][rw].end(),
4573  jacMapIC2[rw].begin() );
4574 
4575  // copy jacMap_v[ jacID ][rw] as well
4576  jacMapIC[rw] = jacMap_v[jacID][rw];
4577  }
4578  else
4579  {
4580  numNonZeros = 3;
4581  jacMapIC2[rw].resize( numNonZeros );
4582  jacMapIC[rw] = rw - mapRowOffset;
4583  }
4584  }
4585 
4586  // fix up rows with new data in them, and the map2 as well
4587  if( icVDSGiven )
4588  {
4589  int offset = jacStampIC[0].size() - 1; // only one term could have
4590  int mapOffset = jacMapIC2[0].size() - 1; // been added here.
4591 
4592  // coupling to KCL_d row
4593  jacStampIC[0][ offset ] = icVDSRow;
4594  jacMapIC2 [0][ mapOffset ] = offset;
4595 
4596  // coupling to KCL_s row
4597  offset = jacStampIC[2].size() - 1
4598  - ( icVGSGiven ? 1 : 0 ) - ( icVBSGiven ? 1 : 0 )
4599  - ( icVESGiven ? 1 : 0 ) - ( icVPSGiven ? 1 : 0 );
4600  mapOffset = offset - jacStampIC[2].size() + jacMapIC2[2].size();
4601  jacStampIC[2][ offset ] = icVDSRow;
4602  jacMapIC2 [2][ mapOffset ] = offset;
4603 
4604  // extra row for icVDS
4605  jacStampIC[icVDSRow][0] = 0;
4606  jacStampIC[icVDSRow][1] = 2;
4607  jacStampIC[icVDSRow][2] = icVDSRow;
4608  jacMapIC2 [icVDSRow + mapRowOffset ][0] = 0;
4609  jacMapIC2 [icVDSRow + mapRowOffset ][1] = 1;
4610  jacMapIC2 [icVDSRow + mapRowOffset ][2] = 2;
4611  }
4612 
4613  if( icVGSGiven )
4614  {
4615  int offset = jacStampIC[1].size() - 1; // only one term could have
4616  int mapOffset = jacMapIC2[1].size() - 1; // been added here.
4617 
4618  // coupling to KCL_g row
4619  jacStampIC[1][ offset ] = icVGSRow;
4620  jacMapIC2 [1][ mapOffset ] = offset;
4621 
4622  // coupling to KCL_s row
4623  offset = jacStampIC[2].size() - 1 - ( icVBSGiven ? 1 : 0 )
4624  - ( icVESGiven ? 1 : 0 ) - ( icVPSGiven ? 1 : 0 );
4625  mapOffset = offset - jacStampIC[2].size() + jacMapIC2[2].size();
4626  jacStampIC[2][ offset ] = icVGSRow;
4627  jacMapIC2 [2][ mapOffset ] = offset;
4628 
4629  // extra row for icVGS
4630  jacStampIC[icVGSRow][0] = 1;
4631  jacStampIC[icVGSRow][1] = 2;
4632  jacStampIC[icVGSRow][2] = icVGSRow;
4633  jacMapIC2 [icVGSRow + mapRowOffset ][0] = 0;
4634  jacMapIC2 [icVGSRow + mapRowOffset ][1] = 1;
4635  jacMapIC2 [icVGSRow + mapRowOffset ][2] = 2;
4636  }
4637 
4638  if( icVBSGiven )
4639  {
4640  int offset = jacStampIC[5].size() - 1; // only one term could have
4641  int mapOffset = jacMapIC2[5].size() - 1; // been added here.
4642 
4643  // coupling to KCL_b row
4644  jacStampIC[5][ offset ] = icVBSRow;
4645  jacMapIC2 [5][ mapOffset ] = offset;
4646 
4647  // coupling to KCL_s row
4648  offset = jacStampIC[2].size() - 1 -
4649  ( icVESGiven ? 1 : 0) + ( icVPSGiven ? 1 : 0 );
4650  mapOffset = offset - jacStampIC[2].size() + jacMapIC2[2].size();
4651  jacStampIC[2][ offset ] = icVBSRow;
4652  jacMapIC2 [2][ mapOffset ] = offset;
4653 
4654  // extra row for icVBS
4655  jacStampIC[icVBSRow][0] = 5;
4656  jacStampIC[icVBSRow][1] = 2;
4657  jacStampIC[icVBSRow][2] = icVBSRow;
4658  jacMapIC2 [icVBSRow + mapRowOffset ][0] = 0;
4659  jacMapIC2 [icVBSRow + mapRowOffset ][1] = 1;
4660  jacMapIC2 [icVBSRow + mapRowOffset ][2] = 2;
4661  }
4662 
4663  if( icVESGiven )
4664  {
4665  int offset = jacStampIC[3].size() - 1; // only one term could have
4666  int mapOffset = jacMapIC2[3].size() - 1; // been added here.
4667 
4668  // coupling to KCL_e row
4669  jacStampIC[3][ offset ] = icVESRow;
4670  jacMapIC2 [3][ mapOffset ] = offset;
4671 
4672  // coupling to KCL_s row
4673  offset = jacStampIC[2].size() - 1 - ( icVPSGiven ? 1 : 0 );
4674  mapOffset = offset - jacStampIC[2].size() + jacMapIC2[2].size();
4675  jacStampIC[2][ offset ] = icVESRow;
4676  jacMapIC2 [2][ mapOffset ] = offset;
4677 
4678  // extra row for icVES
4679  jacStampIC[icVESRow][0] = 3;
4680  jacStampIC[icVESRow][1] = 2;
4681  jacStampIC[icVESRow][2] = icVESRow;
4682  jacMapIC2 [icVESRow + mapRowOffset ][0] = 0;
4683  jacMapIC2 [icVESRow + mapRowOffset ][1] = 1;
4684  jacMapIC2 [icVESRow + mapRowOffset ][2] = 2;
4685  }
4686 
4687  if( icVPSGiven )
4688  {
4689  int offset = jacStampIC[4].size() - 1; // only one term could have
4690  int mapOffset = jacMapIC2[4].size() - 1; // been added here.
4691 
4692  // coupling to KCL_p row
4693  jacStampIC[4][ offset ] = icVPSRow;
4694  jacMapIC2 [4][ mapOffset ] = offset;
4695 
4696  // coupling to KCL_s row
4697  offset = jacStampIC[2].size() - 1;
4698  mapOffset = offset - jacStampIC[2].size() + jacMapIC2[2].size();
4699  jacStampIC[2][ offset ] = icVPSRow;
4700  jacMapIC2 [2][ mapOffset ] = offset;
4701 
4702  // extra row for icVPS
4703  jacStampIC[icVPSRow][0] = 4;
4704  jacStampIC[icVPSRow][1] = 2;
4705  jacStampIC[icVPSRow][2] = icVPSRow;
4706  jacMapIC2 [icVGSRow + mapRowOffset ][0] = 0;
4707  jacMapIC2 [icVGSRow + mapRowOffset ][1] = 1;
4708  jacMapIC2 [icVGSRow + mapRowOffset ][2] = 2;
4709  }
4710 
4711 #ifdef Xyce_DEBUG_DEVICE
4712  if (getDeviceOptions().debugLevel > 0)
4713  {
4714  Xyce::dout() << "Original jacobian stamp before IC's added" << std::endl;
4715  for( int rw=0; rw < jacStamp_v[ jacID ].size() ; ++rw )
4716  {
4717  Xyce::dout() << "jacStamp_v[ " << jacID << " ][ " << rw << "] = { " ;
4718  for( int cl=0; cl < jacStamp_v[ jacID ][rw].size(); ++cl )
4719  {
4720  Xyce::dout() << jacStamp_v[ jacID ][rw][cl];
4721  if( cl != (jacStamp_v[ jacID ][rw].size()-1) )
4722  {
4723  Xyce::dout() << ", ";
4724  }
4725  }
4726  Xyce::dout() << "}" << std::endl;
4727  }
4728  Xyce::dout() << std::endl;
4729 
4730  Xyce::dout() << "And as viewed through the maps" << std::endl;
4731  for( int rw=0; rw < jacMap_v[ jacID ].size() ; ++rw )
4732  {
4733  Xyce::dout() << "jacStampIC[ " << jacID << " ][ " << jacMap_v[jacID][rw]
4734  << "] = { " ;
4735  for( int cl=0; cl < jacMap2_v[ jacID ][rw].size(); ++cl )
4736  {
4737  Xyce::dout() << jacStamp_v[jacID][jacMap_v[jacID][rw]][jacMap2_v[jacID][rw][cl]];
4738  if( cl != (jacMap2_v[ jacID ][rw].size()-1) )
4739  {
4740  Xyce::dout() << ", ";
4741  }
4742  }
4743  Xyce::dout() << "}" << std::endl;
4744  }
4745  Xyce::dout() << std::endl;
4746 
4747 
4748  Xyce::dout() << "jacobian stamp including initial conditions: " << std::endl
4749  << "icVDSRow = " << icVDSRow << std::endl
4750  << "icVGSRow = " << icVGSRow << std::endl
4751  << "icVBSRow = " << icVBSRow << std::endl
4752  << "icVESRow = " << icVESRow << std::endl
4753  << "icVPSRow = " << icVPSRow << std::endl;
4754  for( int rw=0; rw < jacStampIC.size() ; ++rw )
4755  {
4756  Xyce::dout() << "jacStampIC[ " << rw << "] = { " ;
4757  for( int cl=0; cl < jacStampIC[rw].size(); ++cl )
4758  {
4759  Xyce::dout() << jacStampIC[rw][cl];
4760  if( cl != (jacStampIC[rw].size()-1) )
4761  {
4762  Xyce::dout() << ", ";
4763  }
4764  }
4765  Xyce::dout() << "}" << std::endl;
4766  }
4767  Xyce::dout() << std::endl;
4768 
4769  Xyce::dout() << "And as viewed through the maps" << std::endl;
4770  for( int rw=0; rw < jacMapIC.size() ; ++rw )
4771  {
4772  Xyce::dout() << "jacStampIC[ " << jacMapIC[rw] << "] = { " ;
4773  for( int cl=0; cl < jacMapIC2[rw].size(); ++cl )
4774  {
4775  Xyce::dout() << jacStampIC[ jacMapIC[rw] ][ jacMapIC2[rw][cl] ];
4776  if( cl != (jacMapIC2[rw].size()-1) )
4777  {
4778  Xyce::dout() << ", ";
4779  }
4780  }
4781  Xyce::dout() << "}" << std::endl;
4782  }
4783  Xyce::dout() << std::endl;
4784  }
4785 
4786 #endif // Xyce_DEBUG_DEVICE
4787 
4788  }
4789 }
4790 
4791 #ifdef Xyce_DEBUG_DEVICE
4792 //-----------------------------------------------------------------------------
4793 // Function : Instance::debugOutputModelParams
4794 // Purpose :
4795 // Special Notes :
4796 // Scope : public
4797 // Creator : Eric Keiter
4798 // Creation Date : 07/13/08
4799 //-----------------------------------------------------------------------------
4800 void Instance::debugOutputModelParams()
4801 {
4802  if (getDeviceOptions().debugLevel > 0)
4803  {
4804  Xyce::dout() << Xyce::section_divider
4805  <<std::endl;
4806  Xyce::dout() << "Instance: constructor: "<< getName() <<std::endl;
4807  Xyce::dout() << "Model Params: " << std::endl;
4808  Xyce::dout() << "capMod = " << model_.capMod << std::endl;
4809  Xyce::dout() << "mobMod = " << model_.mobMod << std::endl;
4810  Xyce::dout() << "paramChk = " << model_.paramChk << std::endl;
4811  Xyce::dout() << "binUnit = " << model_.binUnit << std::endl;
4812  Xyce::dout() << "version = " << model_.version << std::endl;
4813  Xyce::dout() << "tox = " << model_.tox << std::endl;
4814  Xyce::dout() << "toxm = " << model_.toxm << std::endl;
4815  Xyce::dout() << "dtoxcv = " << model_.dtoxcv << std::endl;
4816  Xyce::dout() << "cdsc = " << model_.cdsc << std::endl;
4817  Xyce::dout() << "cdscb = " << model_.cdscb << std::endl;
4818  Xyce::dout() << "cdscd = " << model_.cdscd << std::endl;
4819  Xyce::dout() << "cit = " << model_.cit << std::endl;
4820  Xyce::dout() << "nfactor = " << model_.nfactor << std::endl;
4821  Xyce::dout() << "vsat = " << model_.vsat << std::endl;
4822  Xyce::dout() << "at = " << model_.at << std::endl;
4823  Xyce::dout() << "a0 = " << model_.a0 << std::endl;
4824  Xyce::dout() << "ags = " << model_.ags << std::endl;
4825  Xyce::dout() << "a1 = " << model_.a1 << std::endl;
4826  Xyce::dout() << "a2 = " << model_.a2 << std::endl;
4827  Xyce::dout() << "keta = " << model_.keta << std::endl;
4828  Xyce::dout() << "nsub = " << model_.nsub << std::endl;
4829  Xyce::dout() << "npeak = " << model_.npeak << std::endl;
4830  Xyce::dout() << "ngate = " << model_.ngate << std::endl;
4831  Xyce::dout() << "gamma1 = " << model_.gamma1 << std::endl;
4832  Xyce::dout() << "gamma2 = " << model_.gamma2 << std::endl;
4833  Xyce::dout() << "vbx = " << model_.vbx << std::endl;
4834  Xyce::dout() << "vbm = " << model_.vbm << std::endl;
4835  Xyce::dout() << "xt = " << model_.xt << std::endl;
4836  Xyce::dout() << "k1 = " << model_.k1 << std::endl;
4837  Xyce::dout() << "kt1 = " << model_.kt1 << std::endl;
4838  Xyce::dout() << "kt1l = " << model_.kt1l << std::endl;
4839  Xyce::dout() << "kt2 = " << model_.kt2 << std::endl;
4840  Xyce::dout() << "k2 = " << model_.k2 << std::endl;
4841  Xyce::dout() << "k3 = " << model_.k3 << std::endl;
4842  Xyce::dout() << "k3b = " << model_.k3b << std::endl;
4843  Xyce::dout() << "w0 = " << model_.w0 << std::endl;
4844  Xyce::dout() << "nlx = " << model_.nlx << std::endl;
4845  Xyce::dout() << "dvt0 = " << model_.dvt0 << std::endl;
4846  Xyce::dout() << "dvt1 = " << model_.dvt1 << std::endl;
4847  Xyce::dout() << "dvt2 = " << model_.dvt2 << std::endl;
4848  Xyce::dout() << "dvt0w = " << model_.dvt0w << std::endl;
4849  Xyce::dout() << "dvt1w = " << model_.dvt1w << std::endl;
4850  Xyce::dout() << "dvt2w = " << model_.dvt2w << std::endl;
4851  Xyce::dout() << "drout = " << model_.drout << std::endl;
4852  Xyce::dout() << "dsub = " << model_.dsub << std::endl;
4853  Xyce::dout() << "vth0= " << model_.vth0 << std::endl;
4854  Xyce::dout() << "ua = " << model_.ua << std::endl;
4855  Xyce::dout() << "ua1 = " << model_.ua1 << std::endl;
4856  Xyce::dout() << "ub = " << model_.ub << std::endl;
4857  Xyce::dout() << "ub1 = " << model_.ub1 << std::endl;
4858  Xyce::dout() << "uc = " << model_.uc << std::endl;
4859  Xyce::dout() << "uc1 = " << model_.uc1 << std::endl;
4860  Xyce::dout() << "u0 = " << model_.u0 << std::endl;
4861  Xyce::dout() << "ute = " << model_.ute << std::endl;
4862  Xyce::dout() << "voff = " << model_.voff << std::endl;
4863  Xyce::dout() << "tnom = " << model_.tnom << std::endl;
4864  Xyce::dout() << "cgso = " << model_.cgso << std::endl;
4865  Xyce::dout() << "cgdo = " << model_.cgdo << std::endl;
4866  Xyce::dout() << "xpart = " << model_.xpart << std::endl;
4867  Xyce::dout() << "delta = " << model_.delta << std::endl;
4868  Xyce::dout() << "sheetResistance = " << model_.sheetResistance << std::endl;
4869  Xyce::dout() << "rdsw = " << model_.rdsw << std::endl;
4870  Xyce::dout() << "prwg = " << model_.prwg << std::endl;
4871  Xyce::dout() << "prwb = " << model_.prwb << std::endl;
4872  Xyce::dout() << "prt = " << model_.prt << std::endl;
4873  Xyce::dout() << "eta0 = " << model_.eta0 << std::endl;
4874  Xyce::dout() << "etab = " << model_.etab << std::endl;
4875  Xyce::dout() << "pclm = " << model_.pclm << std::endl;
4876  Xyce::dout() << "pdibl1 = " << model_.pdibl1 << std::endl;
4877  Xyce::dout() << "pdibl2 = " << model_.pdibl2 << std::endl;
4878  Xyce::dout() << "pdiblb = " << model_.pdiblb << std::endl;
4879  Xyce::dout() << "pvag = " << model_.pvag << std::endl;
4880  Xyce::dout() << "shMod = " << model_.shMod << std::endl;
4881  Xyce::dout() << "tbox = " << model_.tbox << std::endl;
4882  Xyce::dout() << "tsi = " << model_.tsi << std::endl;
4883  Xyce::dout() << "xj = " << model_.xj << std::endl;
4884  Xyce::dout() << "rth0 = " << model_.rth0 << std::endl;
4885  Xyce::dout() << "cth0 = " << model_.cth0 << std::endl;
4886  Xyce::dout() << "ngidl = " << model_.ngidl << std::endl;
4887  Xyce::dout() << "agidl = " << model_.agidl << std::endl;
4888  Xyce::dout() << "bgidl = " << model_.bgidl << std::endl;
4889  Xyce::dout() << "ndiode = " << model_.ndiode << std::endl;
4890  Xyce::dout() << "xbjt = " << model_.xbjt << std::endl;
4891  Xyce::dout() << "xdif = " << model_.xdif << std::endl;
4892  Xyce::dout() << "xrec = " << model_.xrec << std::endl;
4893  Xyce::dout() << "xtun = " << model_.xtun << std::endl;
4894  Xyce::dout() << "GatesidewallJctPotential = " << model_.GatesidewallJctPotential << std::endl;
4895  Xyce::dout() << "bodyJctGateSideGradingCoeff = " << model_.bodyJctGateSideGradingCoeff << std::endl;
4896  Xyce::dout() << "unitLengthGateSidewallJctCap = " << model_.unitLengthGateSidewallJctCap << std::endl;
4897  Xyce::dout() << "Lint = " << model_.Lint << std::endl;
4898  Xyce::dout() << "Ll = " << model_.Ll << std::endl;
4899  Xyce::dout() << "Llc = " << model_.Llc << std::endl;
4900  Xyce::dout() << "Lln = " << model_.Lln << std::endl;
4901  Xyce::dout() << "Lw = " << model_.Lw << std::endl;
4902  Xyce::dout() << "Lwc = " << model_.Lwc << std::endl;
4903  Xyce::dout() << "Lwn = " << model_.Lwn << std::endl;
4904  Xyce::dout() << "Lwl = " << model_.Lwl << std::endl;
4905  Xyce::dout() << "Lwlc = " << model_.Lwlc << std::endl;
4906  Xyce::dout() << "wr = " << model_.wr << std::endl;
4907  Xyce::dout() << "Wint = " << model_.Wint << std::endl;
4908  Xyce::dout() << "dwg = " << model_.dwg << std::endl;
4909  Xyce::dout() << "dwb = " << model_.dwb << std::endl;
4910  Xyce::dout() << "Wl = " << model_.Wl << std::endl;
4911  Xyce::dout() << "Wlc = " << model_.Wlc << std::endl;
4912  Xyce::dout() << "Wln = " << model_.Wln << std::endl;
4913  Xyce::dout() << "Ww = " << model_.Ww << std::endl;
4914  Xyce::dout() << "Wwc = " << model_.Wwc << std::endl;
4915  Xyce::dout() << "Wwn = " << model_.Wwn << std::endl;
4916  Xyce::dout() << "Wwl = " << model_.Wwl << std::endl;
4917  Xyce::dout() << "Wwlc = " << model_.Wwlc << std::endl;
4918  Xyce::dout() << "b0 = " << model_.b0 << std::endl;
4919  Xyce::dout() << "b1 = " << model_.b1 << std::endl;
4920  Xyce::dout() << "cgsl = " << model_.cgsl << std::endl;
4921  Xyce::dout() << "cgdl = " << model_.cgdl << std::endl;
4922  Xyce::dout() << "ckappa = " << model_.ckappa << std::endl;
4923  Xyce::dout() << "cf = " << model_.cf << std::endl;
4924  Xyce::dout() << "clc = " << model_.clc << std::endl;
4925  Xyce::dout() << "cle = " << model_.cle << std::endl;
4926  Xyce::dout() << "dwc = " << model_.dwc << std::endl;
4927  Xyce::dout() << "dlc = " << model_.dlc << std::endl;
4928  Xyce::dout() << "alpha0 = " << model_.alpha0 << std::endl;
4929  Xyce::dout() << "oxideTrapDensityA = " << model_.oxideTrapDensityA << std::endl;
4930  Xyce::dout() << "oxideTrapDensityB = " << model_.oxideTrapDensityB << std::endl;
4931  Xyce::dout() << "oxideTrapDensityC = " << model_.oxideTrapDensityC << std::endl;
4932  Xyce::dout() << "fnoiMod = " << model_.fnoiMod << std::endl;
4933  Xyce::dout() << "tnoiMod = " << model_.tnoiMod << std::endl;
4934  Xyce::dout() << "tnoia = " << model_.tnoia << std::endl;
4935  Xyce::dout() << "tnoib = " << model_.tnoib << std::endl;
4936  Xyce::dout() << "rnoia = " << model_.rnoia << std::endl;
4937  Xyce::dout() << "rnoib = " << model_.rnoib << std::endl;
4938  Xyce::dout() << "ntnoi = " << model_.ntnoi << std::endl;
4939  Xyce::dout() << "em = " << model_.em << std::endl;
4940  Xyce::dout() << "ef = " << model_.ef << std::endl;
4941  Xyce::dout() << "af = " << model_.af << std::endl;
4942  Xyce::dout() << "kf = " << model_.kf << std::endl;
4943  Xyce::dout() << "noif = " << model_.noif << std::endl;
4944  Xyce::dout() << "k1w1 = " << model_.k1w1 << std::endl;
4945  Xyce::dout() << "k1w2 = " << model_.k1w2 << std::endl;
4946  Xyce::dout() << "ketas = " << model_.ketas << std::endl;
4947  Xyce::dout() << "dwbc = " << model_.dwbc << std::endl;
4948  Xyce::dout() << "beta0 = " << model_.beta0 << std::endl;
4949  Xyce::dout() << "beta1 = " << model_.beta1 << std::endl;
4950  Xyce::dout() << "beta2 = " << model_.beta2 << std::endl;
4951  Xyce::dout() << "vdsatii0 = " << model_.vdsatii0 << std::endl;
4952  Xyce::dout() << "tii = " << model_.tii << std::endl;
4953  Xyce::dout() << "lii = " << model_.lii << std::endl;
4954  Xyce::dout() << "sii0 = " << model_.sii0 << std::endl;
4955  Xyce::dout() << "sii1 = " << model_.sii1 << std::endl;
4956  Xyce::dout() << "sii2 = " << model_.sii2 << std::endl;
4957  Xyce::dout() << "siid = " << model_.siid << std::endl;
4958  Xyce::dout() << "fbjtii = " << model_.fbjtii << std::endl;
4959  Xyce::dout() << "esatii = " << model_.esatii << std::endl;
4960  Xyce::dout() << "ntun = " << model_.ntun << std::endl;
4961  Xyce::dout() << "nrecf0 = " << model_.nrecf0 << std::endl;
4962  Xyce::dout() << "nrecr0 = " << model_.nrecr0 << std::endl;
4963  Xyce::dout() << "isbjt = " << model_.isbjt << std::endl;
4964  Xyce::dout() << "isdif = " << model_.isdif << std::endl;
4965  Xyce::dout() << "isrec = " << model_.isrec << std::endl;
4966  Xyce::dout() << "istun = " << model_.istun << std::endl;
4967  Xyce::dout() << "ln = " << model_.ln << std::endl;
4968  Xyce::dout() << "vrec0 = " << model_.vrec0 << std::endl;
4969  Xyce::dout() << "vtun0 = " << model_.vtun0 << std::endl;
4970  Xyce::dout() << "nbjt = " << model_.nbjt << std::endl;
4971  Xyce::dout() << "lbjt0 = " << model_.lbjt0 << std::endl;
4972  Xyce::dout() << "ldif0 = " << model_.ldif0 << std::endl;
4973  Xyce::dout() << "vabjt = " << model_.vabjt << std::endl;
4974  Xyce::dout() << "aely = " << model_.aely << std::endl;
4975  Xyce::dout() << "ahli = " << model_.ahli << std::endl;
4976  Xyce::dout() << "rbody = " << model_.rbody << std::endl;
4977  Xyce::dout() << "rbsh = " << model_.rbsh << std::endl;
4978  Xyce::dout() << "cgeo = " << model_.cgeo << std::endl;
4979  Xyce::dout() << "tt = " << model_.tt << std::endl;
4980  Xyce::dout() << "ndif = " << model_.ndif << std::endl;
4981  Xyce::dout() << "vsdfb = " << model_.vsdfb << std::endl;
4982  Xyce::dout() << "vsdth = " << model_.vsdth << std::endl;
4983  Xyce::dout() << "csdmin = " << model_.csdmin << std::endl;
4984  Xyce::dout() << "asd = " << model_.asd << std::endl;
4985  Xyce::dout() << "csdesw = " << model_.csdesw << std::endl;
4986  Xyce::dout() << "ntrecf = " << model_.ntrecf << std::endl;
4987  Xyce::dout() << "ntrecr = " << model_.ntrecr << std::endl;
4988  Xyce::dout() << "dlcb = " << model_.dlcb << std::endl;
4989  Xyce::dout() << "fbody = " << model_.fbody << std::endl;
4990  Xyce::dout() << "tcjswg = " << model_.tcjswg << std::endl;
4991  Xyce::dout() << "tpbswg = " << model_.tpbswg << std::endl;
4992  Xyce::dout() << "acde = " << model_.acde << std::endl;
4993  Xyce::dout() << "moin = " << model_.moin << std::endl;
4994  Xyce::dout() << "noff = " << model_.noff << std::endl;
4995  Xyce::dout() << "delvt = " << model_.delvt << std::endl;
4996  Xyce::dout() << "kb1 = " << model_.kb1 << std::endl;
4997  Xyce::dout() << "dlbg = " << model_.dlbg << std::endl;
4998  Xyce::dout() << "igbMod = " << model_.igbMod << std::endl;
4999  Xyce::dout() << "igcMod= " << model_.igcMod << std::endl;
5000  Xyce::dout() << "toxqm = " << model_.toxqm << std::endl;
5001  Xyce::dout() << "wth0 = " << model_.wth0 << std::endl;
5002  Xyce::dout() << "rhalo = " << model_.rhalo << std::endl;
5003  Xyce::dout() << "ntox = " << model_.ntox << std::endl;
5004  Xyce::dout() << "toxref = " << model_.toxref << std::endl;
5005  Xyce::dout() << "ebg = " << model_.ebg << std::endl;
5006  Xyce::dout() << "vevb = " << model_.vevb << std::endl;
5007  Xyce::dout() << "alphaGB1 = " << model_.alphaGB1 << std::endl;
5008  Xyce::dout() << "betaGB1 = " << model_.betaGB1 << std::endl;
5009  Xyce::dout() << "vgb1 = " << model_.vgb1 << std::endl;
5010  Xyce::dout() << "vecb = " << model_.vecb << std::endl;
5011  Xyce::dout() << "alphaGB2 = " << model_.alphaGB2 << std::endl;
5012  Xyce::dout() << "betaGB2 = " << model_.betaGB2 << std::endl;
5013  Xyce::dout() << "vgb2 = " << model_.vgb2 << std::endl;
5014  Xyce::dout() << "voxh = " << model_.voxh << std::endl;
5015  Xyce::dout() << "deltavox = " << model_.deltavox << std::endl;
5016  Xyce::dout() << "aigc = " << model_.aigc << std::endl;
5017  Xyce::dout() << "bigc = " << model_.bigc << std::endl;
5018  Xyce::dout() << "cigc = " << model_.cigc << std::endl;
5019  Xyce::dout() << "aigsd = " << model_.aigsd << std::endl;
5020  Xyce::dout() << "bigsd = " << model_.bigsd << std::endl;
5021  Xyce::dout() << "cigsd = " << model_.cigsd << std::endl;
5022  Xyce::dout() << "nigc = " << model_.nigc << std::endl;
5023  Xyce::dout() << "pigcd = " << model_.pigcd << std::endl;
5024  Xyce::dout() << "poxedge = " << model_.poxedge << std::endl;
5025  Xyce::dout() << "dlcig = " << model_.dlcig << std::endl;
5026  Xyce::dout() << "soiMod = " << model_.soiMod << std::endl;
5027  Xyce::dout() << "vbs0pd = " << model_.vbs0pd << std::endl;
5028  Xyce::dout() << "vbs0fd = " << model_.vbs0fd << std::endl;
5029  Xyce::dout() << "vbsa = " << model_.vbsa << std::endl;
5030  Xyce::dout() << "nofffd = " << model_.nofffd << std::endl;
5031  Xyce::dout() << "vofffd = " << model_.vofffd << std::endl;
5032  Xyce::dout() << "k1b = " << model_.k1b << std::endl;
5033  Xyce::dout() << "k2b = " << model_.k2b << std::endl;
5034  Xyce::dout() << "dk2b = " << model_.dk2b << std::endl;
5035  Xyce::dout() << "dvbd0 = " << model_.dvbd0 << std::endl;
5036  Xyce::dout() << "dvbd1 = " << model_.dvbd1 << std::endl;
5037  Xyce::dout() << "moinFD = " << model_.moinFD << std::endl;
5038  Xyce::dout() << "rgateMod = " << model_.rgateMod << std::endl;
5039  Xyce::dout() << "xrcrg1 = " << model_.xrcrg1 << std::endl;
5040  Xyce::dout() << "xrcrg2 = " << model_.xrcrg2 << std::endl;
5041  Xyce::dout() << "rshg = " << model_.rshg << std::endl;
5042  Xyce::dout() << "ngcon = " << model_.ngcon << std::endl;
5043  Xyce::dout() << "xgw = " << model_.xgw << std::endl;
5044  Xyce::dout() << "xgl = " << model_.xgl << std::endl;
5045  Xyce::dout() << "lxj = " << model_.lxj << std::endl;
5046  Xyce::dout() << "lalphaGB1 = " << model_.lalphaGB1 << std::endl;
5047  Xyce::dout() << "lbetaGB1 = " << model_.lbetaGB1 << std::endl;
5048  Xyce::dout() << "lalphaGB2 = " << model_.lalphaGB2 << std::endl;
5049  Xyce::dout() << "lbetaGB2 = " << model_.lbetaGB2 << std::endl;
5050  Xyce::dout() << "lcgsl = " << model_.lcgsl << std::endl;
5051  Xyce::dout() << "lcgdl = " << model_.lcgdl << std::endl;
5052  Xyce::dout() << "lckappa = " << model_.lckappa << std::endl;
5053  Xyce::dout() << "lndif = " << model_.lndif << std::endl;
5054  Xyce::dout() << "lute = " << model_.lute << std::endl;
5055  Xyce::dout() << "lkt1 = " << model_.lkt1 << std::endl;
5056  Xyce::dout() << "lkt1l = " << model_.lkt1l << std::endl;
5057  Xyce::dout() << "lkt2 = " << model_.lkt2 << std::endl;
5058  Xyce::dout() << "lua1 = " << model_.lua1 << std::endl;
5059  Xyce::dout() << "lub1 = " << model_.lub1 << std::endl;
5060  Xyce::dout() << "luc1 = " << model_.luc1 << std::endl;
5061  Xyce::dout() << "lat = " << model_.lat << std::endl;
5062  Xyce::dout() << "lprt = " << model_.lprt << std::endl;
5063  Xyce::dout() << "lntrecf = " << model_.lntrecf << std::endl;
5064  Xyce::dout() << "lntrecr = " << model_.lntrecr << std::endl;
5065  Xyce::dout() << "lxbjt = " << model_.lxbjt << std::endl;
5066  Xyce::dout() << "lxdif = " << model_.lxdif << std::endl;
5067  Xyce::dout() << "lxrec = " << model_.lxrec << std::endl;
5068  Xyce::dout() << "lxtun = " << model_.lxtun << std::endl;
5069  Xyce::dout() << "laigc = " << model_.laigc << std::endl;
5070  Xyce::dout() << "lbigc = " << model_.lbigc << std::endl;
5071  Xyce::dout() << "lcigc = " << model_.lcigc << std::endl;
5072  Xyce::dout() << "laigsd = " << model_.laigsd << std::endl;
5073  Xyce::dout() << "lbigsd = " << model_.lbigsd << std::endl;
5074  Xyce::dout() << "lcigsd = " << model_.lcigsd << std::endl;
5075  Xyce::dout() << "lnigc = " << model_.lnigc << std::endl;
5076  Xyce::dout() << "lpigcd = " << model_.lpigcd << std::endl;
5077  Xyce::dout() << "lpoxedge = " << model_.lpoxedge << std::endl;
5078  Xyce::dout() << "lnpeak = " << model_.lnpeak << std::endl;
5079  Xyce::dout() << "lnsub = " << model_.lnsub << std::endl;
5080  Xyce::dout() << "lngate = " << model_.lngate << std::endl;
5081  Xyce::dout() << "lvth0 = " << model_.lvth0 << std::endl;
5082  Xyce::dout() << "lk1 = " << model_.lk1 << std::endl;
5083  Xyce::dout() << "lk1w1 = " << model_.lk1w1 << std::endl;
5084  Xyce::dout() << "lk1w2 = " << model_.lk1w2 << std::endl;
5085  Xyce::dout() << "lk2 = " << model_.lk2 << std::endl;
5086  Xyce::dout() << "lk3 = " << model_.lk3 << std::endl;
5087  Xyce::dout() << "lk3b = " << model_.lk3b << std::endl;
5088  Xyce::dout() << "lkb1 = " << model_.lkb1 << std::endl;
5089  Xyce::dout() << "lw0 = " << model_.lw0 << std::endl;
5090  Xyce::dout() << "lnlx = " << model_.lnlx << std::endl;
5091  Xyce::dout() << "ldvt0 = " << model_.ldvt0 << std::endl;
5092  Xyce::dout() << "ldvt1 = " << model_.ldvt1 << std::endl;
5093  Xyce::dout() << "ldvt2 = " << model_.ldvt2 << std::endl;
5094  Xyce::dout() << "ldvt0w = " << model_.ldvt0w << std::endl;
5095  Xyce::dout() << "ldvt1w = " << model_.ldvt1w << std::endl;
5096  Xyce::dout() << "ldvt2w = " << model_.ldvt2w << std::endl;
5097  Xyce::dout() << "lu0 = " << model_.lu0 << std::endl;
5098  Xyce::dout() << "lua = " << model_.lua << std::endl;
5099  Xyce::dout() << "lub = " << model_.lub << std::endl;
5100  Xyce::dout() << "luc = " << model_.luc << std::endl;
5101  Xyce::dout() << "lvsat = " << model_.lvsat << std::endl;
5102  Xyce::dout() << "la0 = " << model_.la0 << std::endl;
5103  Xyce::dout() << "lags = " << model_.lags << std::endl;
5104  Xyce::dout() << "lb0 = " << model_.lb0 << std::endl;
5105  Xyce::dout() << "lb1 = " << model_.lb1 << std::endl;
5106  Xyce::dout() << "lketa = " << model_.lketa << std::endl;
5107  Xyce::dout() << "lketas = " << model_.lketas << std::endl;
5108  Xyce::dout() << "la1 = " << model_.la1 << std::endl;
5109  Xyce::dout() << "la2 = " << model_.la2 << std::endl;
5110  Xyce::dout() << "lrdsw = " << model_.lrdsw << std::endl;
5111  Xyce::dout() << "lprwb = " << model_.lprwb << std::endl;
5112  Xyce::dout() << "lprwg = " << model_.lprwg << std::endl;
5113  Xyce::dout() << "lwr = " << model_.lwr << std::endl;
5114  Xyce::dout() << "lnfactor = " << model_.lnfactor << std::endl;
5115  Xyce::dout() << "ldwg = " << model_.ldwg << std::endl;
5116  Xyce::dout() << "ldwb = " << model_.ldwb << std::endl;
5117  Xyce::dout() << "lvoff = " << model_.lvoff << std::endl;
5118  Xyce::dout() << "leta0 = " << model_.leta0 << std::endl;
5119  Xyce::dout() << "letab = " << model_.letab << std::endl;
5120  Xyce::dout() << "ldsub = " << model_.ldsub << std::endl;
5121  Xyce::dout() << "lcit = " << model_.lcit << std::endl;
5122  Xyce::dout() << "lcdsc = " << model_.lcdsc << std::endl;
5123  Xyce::dout() << "lcdscb = " << model_.lcdscb << std::endl;
5124  Xyce::dout() << "lcdscd = " << model_.lcdscd << std::endl;
5125  Xyce::dout() << "lpclm = " << model_.lpclm << std::endl;
5126  Xyce::dout() << "lpdibl1 = " << model_.lpdibl1 << std::endl;
5127  Xyce::dout() << "lpdibl2 = " << model_.lpdibl2 << std::endl;
5128  Xyce::dout() << "lpdiblb = " << model_.lpdiblb << std::endl;
5129  Xyce::dout() << "ldrout = " << model_.ldrout << std::endl;
5130  Xyce::dout() << "lpvag = " << model_.lpvag << std::endl;
5131  Xyce::dout() << "ldelta = " << model_.ldelta << std::endl;
5132  Xyce::dout() << "lalpha0 = " << model_.lalpha0 << std::endl;
5133  Xyce::dout() << "lfbjtii = " << model_.lfbjtii << std::endl;
5134  Xyce::dout() << "lbeta0 = " << model_.lbeta0 << std::endl;
5135  Xyce::dout() << "lbeta1 = " << model_.lbeta1 << std::endl;
5136  Xyce::dout() << "lbeta2 = " << model_.lbeta2 << std::endl;
5137  Xyce::dout() << "lvdsatii0 = " << model_.lvdsatii0 << std::endl;
5138  Xyce::dout() << "llii = " << model_.llii << std::endl;
5139  Xyce::dout() << "lesatii = " << model_.lesatii << std::endl;
5140  Xyce::dout() << "lsii0 = " << model_.lsii0 << std::endl;
5141  Xyce::dout() << "lsii1 = " << model_.lsii1 << std::endl;
5142  Xyce::dout() << "lsii2 = " << model_.lsii2 << std::endl;
5143  Xyce::dout() << "lsiid = " << model_.lsiid << std::endl;
5144  Xyce::dout() << "lagidl = " << model_.lagidl << std::endl;
5145  Xyce::dout() << "lbgidl = " << model_.lbgidl << std::endl;
5146  Xyce::dout() << "lngidl = " << model_.lngidl << std::endl;
5147  Xyce::dout() << "lntun = " << model_.lntun << std::endl;
5148  Xyce::dout() << "lndiode = " << model_.lndiode << std::endl;
5149  Xyce::dout() << "lnrecf0 = " << model_.lnrecf0 << std::endl;
5150  Xyce::dout() << "lnrecr0 = " << model_.lnrecr0 << std::endl;
5151  Xyce::dout() << "lisbjt = " << model_.lisbjt << std::endl;
5152  Xyce::dout() << "lisdif = " << model_.lisdif << std::endl;
5153  Xyce::dout() << "lisrec = " << model_.lisrec << std::endl;
5154  Xyce::dout() << "listun = " << model_.listun << std::endl;
5155  Xyce::dout() << "lvrec0 = " << model_.lvrec0 << std::endl;
5156  Xyce::dout() << "lvtun0 = " << model_.lvtun0 << std::endl;
5157  Xyce::dout() << "lnbjt = " << model_.lnbjt << std::endl;
5158  Xyce::dout() << "llbjt0 = " << model_.llbjt0 << std::endl;
5159  Xyce::dout() << "lvabjt = " << model_.lvabjt << std::endl;
5160  Xyce::dout() << "laely = " << model_.laely << std::endl;
5161  Xyce::dout() << "lahli = " << model_.lahli << std::endl;
5162  Xyce::dout() << "lvsdfb = " << model_.lvsdfb << std::endl;
5163  Xyce::dout() << "lvsdth = " << model_.lvsdth << std::endl;
5164  Xyce::dout() << "ldelvt = " << model_.ldelvt << std::endl;
5165  Xyce::dout() << "lacde = " << model_.lacde << std::endl;
5166  Xyce::dout() << "lmoin = " << model_.lmoin << std::endl;
5167  Xyce::dout() << "lnoff = " << model_.lnoff << std::endl;
5168  Xyce::dout() << "lxrcrg1 = " << model_.lxrcrg1 << std::endl;
5169  Xyce::dout() << "lxrcrg2 = " << model_.lxrcrg2 << std::endl;
5170  Xyce::dout() << "wxj = " << model_.wxj << std::endl;
5171  Xyce::dout() << "walphaGB1 = " << model_.walphaGB1 << std::endl;
5172  Xyce::dout() << "wbetaGB1 = " << model_.wbetaGB1 << std::endl;
5173  Xyce::dout() << "walphaGB2 = " << model_.walphaGB2 << std::endl;
5174  Xyce::dout() << "wbetaGB2 = " << model_.wbetaGB2 << std::endl;
5175  Xyce::dout() << "wcgsl = " << model_.wcgsl << std::endl;
5176  Xyce::dout() << "wcgdl = " << model_.wcgdl << std::endl;
5177  Xyce::dout() << "wckappa = " << model_.wckappa << std::endl;
5178  Xyce::dout() << "wndif = " << model_.wndif << std::endl;
5179  Xyce::dout() << "wute = " << model_.wute << std::endl;
5180  Xyce::dout() << "wkt1 = " << model_.wkt1 << std::endl;
5181  Xyce::dout() << "wkt1l = " << model_.wkt1l << std::endl;
5182  Xyce::dout() << "wkt2 = " << model_.wkt2 << std::endl;
5183  Xyce::dout() << "wua1 = " << model_.wua1 << std::endl;
5184  Xyce::dout() << "wub1 = " << model_.wub1 << std::endl;
5185  Xyce::dout() << "wuc1 = " << model_.wuc1 << std::endl;
5186  Xyce::dout() << "wat = " << model_.wat << std::endl;
5187  Xyce::dout() << "wprt = " << model_.wprt << std::endl;
5188  Xyce::dout() << "wntrecf = " << model_.wntrecf << std::endl;
5189  Xyce::dout() << "wntrecr = " << model_.wntrecr << std::endl;
5190  Xyce::dout() << "wxbjt = " << model_.wxbjt << std::endl;
5191  Xyce::dout() << "wxdif = " << model_.wxdif << std::endl;
5192  Xyce::dout() << "wxrec = " << model_.wxrec << std::endl;
5193  Xyce::dout() << "wxtun = " << model_.wxtun << std::endl;
5194  Xyce::dout() << "waigc = " << model_.waigc << std::endl;
5195  Xyce::dout() << "wbigc = " << model_.wbigc << std::endl;
5196  Xyce::dout() << "wcigc = " << model_.wcigc << std::endl;
5197  Xyce::dout() << "waigsd = " << model_.waigsd << std::endl;
5198  Xyce::dout() << "wbigsd = " << model_.wbigsd << std::endl;
5199  Xyce::dout() << "wcigsd = " << model_.wcigsd << std::endl;
5200  Xyce::dout() << "wnigc = " << model_.wnigc << std::endl;
5201  Xyce::dout() << "wpigcd = " << model_.wpigcd << std::endl;
5202  Xyce::dout() << "wpoxedge = " << model_.wpoxedge << std::endl;
5203  Xyce::dout() << "wnpeak = " << model_.wnpeak << std::endl;
5204  Xyce::dout() << "wnsub = " << model_.wnsub << std::endl;
5205  Xyce::dout() << "wngate = " << model_.wngate << std::endl;
5206  Xyce::dout() << "wvth0 = " << model_.wvth0 << std::endl;
5207  Xyce::dout() << "wk1 = " << model_.wk1 << std::endl;
5208  Xyce::dout() << "wk1w1 = " << model_.wk1w1 << std::endl;
5209  Xyce::dout() << "wk1w2 = " << model_.wk1w2 << std::endl;
5210  Xyce::dout() << "wk2 = " << model_.wk2 << std::endl;
5211  Xyce::dout() << "wk3 = " << model_.wk3 << std::endl;
5212  Xyce::dout() << "wk3b = " << model_.wk3b << std::endl;
5213  Xyce::dout() << "wkb1 = " << model_.wkb1 << std::endl;
5214  Xyce::dout() << "ww0 = " << model_.ww0 << std::endl;
5215  Xyce::dout() << "wnlx = " << model_.wnlx << std::endl;
5216  Xyce::dout() << "wdvt0 = " << model_.wdvt0 << std::endl;
5217  Xyce::dout() << "wdvt1 = " << model_.wdvt1 << std::endl;
5218  Xyce::dout() << "wdvt2 = " << model_.wdvt2 << std::endl;
5219  Xyce::dout() << "wdvt0w = " << model_.wdvt0w << std::endl;
5220  Xyce::dout() << "wdvt1w = " << model_.wdvt1w << std::endl;
5221  Xyce::dout() << "wdvt2w = " << model_.wdvt2w << std::endl;
5222  Xyce::dout() << "wu0 = " << model_.wu0 << std::endl;
5223  Xyce::dout() << "wua = " << model_.wua << std::endl;
5224  Xyce::dout() << "wub = " << model_.wub << std::endl;
5225  Xyce::dout() << "wuc = " << model_.wuc << std::endl;
5226  Xyce::dout() << "wvsat = " << model_.wvsat << std::endl;
5227  Xyce::dout() << "wa0 = " << model_.wa0 << std::endl;
5228  Xyce::dout() << "wags = " << model_.wags << std::endl;
5229  Xyce::dout() << "wb0 = " << model_.wb0 << std::endl;
5230  Xyce::dout() << "wb1 = " << model_.wb1 << std::endl;
5231  Xyce::dout() << "wketa = " << model_.wketa << std::endl;
5232  Xyce::dout() << "wketas = " << model_.wketas << std::endl;
5233  Xyce::dout() << "wa1 = " << model_.wa1 << std::endl;
5234  Xyce::dout() << "wa2 = " << model_.wa2 << std::endl;
5235  Xyce::dout() << "wrdsw= " << model_.wrdsw << std::endl;
5236  Xyce::dout() << "wprwb = " << model_.wprwb << std::endl;
5237  Xyce::dout() << "wprwg = " << model_.wprwg << std::endl;
5238  Xyce::dout() << "wwr = " << model_.wwr << std::endl;
5239  Xyce::dout() << "wnfactor = " << model_.wnfactor << std::endl;
5240  Xyce::dout() << "wdwg = " << model_.wdwg << std::endl;
5241  Xyce::dout() << "wdwb = " << model_.wdwb << std::endl;
5242  Xyce::dout() << "wvoff = " << model_.wvoff << std::endl;
5243  Xyce::dout() << "weta0 = " << model_.weta0 << std::endl;
5244  Xyce::dout() << "wetab = " << model_.wetab << std::endl;
5245  Xyce::dout() << "wdsub = " << model_.wdsub << std::endl;
5246  Xyce::dout() << "wcit = " << model_.wcit << std::endl;
5247  Xyce::dout() << "wcdsc = " << model_.wcdsc << std::endl;
5248  Xyce::dout() << "wcdscb = " << model_.wcdscb << std::endl;
5249  Xyce::dout() << "wcdscd = " << model_.wcdscd << std::endl;
5250  Xyce::dout() << "wpclm = " << model_.wpclm << std::endl;
5251  Xyce::dout() << "wpdibl1 = " << model_.wpdibl1 << std::endl;
5252  Xyce::dout() << "wpdibl2 = " << model_.wpdibl2 << std::endl;
5253  Xyce::dout() << "wpdiblb = " << model_.wpdiblb << std::endl;
5254  Xyce::dout() << "wdrout = " << model_.wdrout << std::endl;
5255  Xyce::dout() << "wpvag = " << model_.wpvag << std::endl;
5256  Xyce::dout() << "wdelta = " << model_.wdelta << std::endl;
5257  Xyce::dout() << "walpha0 = " << model_.walpha0 << std::endl;
5258  Xyce::dout() << "wfbjtii = " << model_.wfbjtii << std::endl;
5259  Xyce::dout() << "wbeta0 = " << model_.wbeta0 << std::endl;
5260  Xyce::dout() << "wbeta1 = " << model_.wbeta1 << std::endl;
5261  Xyce::dout() << "wbeta2 = " << model_.wbeta2 << std::endl;
5262  Xyce::dout() << "wvdsatii0 = " << model_.wvdsatii0 << std::endl;
5263  Xyce::dout() << "wlii = " << model_.wlii << std::endl;
5264  Xyce::dout() << "wesatii = " << model_.wesatii << std::endl;
5265  Xyce::dout() << "wsii0 = " << model_.wsii0 << std::endl;
5266  Xyce::dout() << "wsii1 = " << model_.wsii1 << std::endl;
5267  Xyce::dout() << "wsii2 = " << model_.wsii2 << std::endl;
5268  Xyce::dout() << "wsiid = " << model_.wsiid << std::endl;
5269  Xyce::dout() << "wagidl = " << model_.wagidl << std::endl;
5270  Xyce::dout() << "wbgidl = " << model_.wbgidl << std::endl;
5271  Xyce::dout() << "wngidl = " << model_.wngidl << std::endl;
5272  Xyce::dout() << "wntun = " << model_.wntun << std::endl;
5273  Xyce::dout() << "wndiode = " << model_.wndiode << std::endl;
5274  Xyce::dout() << "wnrecf0 = " << model_.wnrecf0 << std::endl;
5275  Xyce::dout() << "wnrecr0 = " << model_.wnrecr0 << std::endl;
5276  Xyce::dout() << "wisbjt = " << model_.wisbjt << std::endl;
5277  Xyce::dout() << "wisdif = " << model_.wisdif << std::endl;
5278  Xyce::dout() << "wisrec = " << model_.wisrec << std::endl;
5279  Xyce::dout() << "wistun = " << model_.wistun << std::endl;
5280  Xyce::dout() << "wvrec0 = " << model_.wvrec0 << std::endl;
5281  Xyce::dout() << "wvtun0 = " << model_.wvtun0 << std::endl;
5282  Xyce::dout() << "wnbjt = " << model_.wnbjt << std::endl;
5283  Xyce::dout() << "wlbjt0 = " << model_.wlbjt0 << std::endl;
5284  Xyce::dout() << "wvabjt = " << model_.wvabjt << std::endl;
5285  Xyce::dout() << "waely = " << model_.waely << std::endl;
5286  Xyce::dout() << "wahli = " << model_.wahli << std::endl;
5287  Xyce::dout() << "wvsdfb = " << model_.wvsdfb << std::endl;
5288  Xyce::dout() << "wvsdth = " << model_.wvsdth << std::endl;
5289  Xyce::dout() << "wdelvt = " << model_.wdelvt << std::endl;
5290  Xyce::dout() << "wacde = " << model_.wacde << std::endl;
5291  Xyce::dout() << "wmoin = " << model_.wmoin << std::endl;
5292  Xyce::dout() << "wnoff = " << model_.wnoff << std::endl;
5293  Xyce::dout() << "wxrcrg1 = " << model_.wxrcrg1 << std::endl;
5294  Xyce::dout() << "wxrcrg2 = " << model_.wxrcrg2 << std::endl;
5295  Xyce::dout() << "pxj = " << model_.pxj << std::endl;
5296  Xyce::dout() << "palphaGB1 = " << model_.palphaGB1 << std::endl;
5297  Xyce::dout() << "pbetaGB1 = " << model_.pbetaGB1 << std::endl;
5298  Xyce::dout() << "palphaGB2 = " << model_.palphaGB2 << std::endl;
5299  Xyce::dout() << "pbetaGB2 = " << model_.pbetaGB2 << std::endl;
5300  Xyce::dout() << "pcgsl = " << model_.pcgsl << std::endl;
5301  Xyce::dout() << "pcgdl = " << model_.pcgdl << std::endl;
5302  Xyce::dout() << "pckappa = " << model_.pckappa << std::endl;
5303  Xyce::dout() << "pndif = " << model_.pndif << std::endl;
5304  Xyce::dout() << "pute = " << model_.pute << std::endl;
5305  Xyce::dout() << "pkt1 = " << model_.pkt1 << std::endl;
5306  Xyce::dout() << "pkt1l = " << model_.pkt1l << std::endl;
5307  Xyce::dout() << "pkt2 = " << model_.pkt2 << std::endl;
5308  Xyce::dout() << "pua1 = " << model_.pua1 << std::endl;
5309  Xyce::dout() << "pub1 = " << model_.pub1 << std::endl;
5310  Xyce::dout() << "puc1 = " << model_.puc1 << std::endl;
5311  Xyce::dout() << "pat = " << model_.pat << std::endl;
5312  Xyce::dout() << "pprt = " << model_.pprt << std::endl;
5313  Xyce::dout() << "pntrecf = " << model_.pntrecf << std::endl;
5314  Xyce::dout() << "pntrecr = " << model_.pntrecr << std::endl;
5315  Xyce::dout() << "pxbjt = " << model_.pxbjt << std::endl;
5316  Xyce::dout() << "pxdif = " << model_.pxdif << std::endl;
5317  Xyce::dout() << "pxrec = " << model_.pxrec << std::endl;
5318  Xyce::dout() << "pxtun = " << model_.pxtun << std::endl;
5319  Xyce::dout() << "paigc = " << model_.paigc << std::endl;
5320  Xyce::dout() << "pbigc = " << model_.pbigc << std::endl;
5321  Xyce::dout() << "pcigc = " << model_.pcigc << std::endl;
5322  Xyce::dout() << "paigsd = " << model_.paigsd << std::endl;
5323  Xyce::dout() << "pbigsd = " << model_.pbigsd << std::endl;
5324  Xyce::dout() << "pcigsd = " << model_.pcigsd << std::endl;
5325  Xyce::dout() << "pnigc = " << model_.pnigc << std::endl;
5326  Xyce::dout() << "ppigcd = " << model_.ppigcd << std::endl;
5327  Xyce::dout() << "ppoxedge = " << model_.ppoxedge << std::endl;
5328  Xyce::dout() << "pnpeak = " << model_.pnpeak << std::endl;
5329  Xyce::dout() << "pnsub = " << model_.pnsub << std::endl;
5330  Xyce::dout() << "pngate = " << model_.pngate << std::endl;
5331  Xyce::dout() << "pvth0 = " << model_.pvth0 << std::endl;
5332  Xyce::dout() << "pk1 = " << model_.pk1 << std::endl;
5333  Xyce::dout() << "pk1w1 = " << model_.pk1w1 << std::endl;
5334  Xyce::dout() << "pk1w2 = " << model_.pk1w2 << std::endl;
5335  Xyce::dout() << "pk2 = " << model_.pk2 << std::endl;
5336  Xyce::dout() << "pk3 = " << model_.pk3 << std::endl;
5337  Xyce::dout() << "pk3b = " << model_.pk3b << std::endl;
5338  Xyce::dout() << "pkb1 = " << model_.pkb1 << std::endl;
5339  Xyce::dout() << "pw0 = " << model_.pw0 << std::endl;
5340  Xyce::dout() << "pnlx = " << model_.pnlx << std::endl;
5341  Xyce::dout() << "pdvt0 = " << model_.pdvt0 << std::endl;
5342  Xyce::dout() << "pdvt1 = " << model_.pdvt1 << std::endl;
5343  Xyce::dout() << "pdvt2 = " << model_.pdvt2 << std::endl;
5344  Xyce::dout() << "pdvt0w = " << model_.pdvt0w << std::endl;
5345  Xyce::dout() << "pdvt1w = " << model_.pdvt1w << std::endl;
5346  Xyce::dout() << "pdvt2w = " << model_.pdvt2w << std::endl;
5347  Xyce::dout() << "pu0 = " << model_.pu0 << std::endl;
5348  Xyce::dout() << "pua = " << model_.pua << std::endl;
5349  Xyce::dout() << "pub = " << model_.pub << std::endl;
5350  Xyce::dout() << "puc = " << model_.puc << std::endl;
5351  Xyce::dout() << "pvsat = " << model_.pvsat << std::endl;
5352  Xyce::dout() << "pa0 = " << model_.pa0 << std::endl;
5353  Xyce::dout() << "pags = " << model_.pags << std::endl;
5354  Xyce::dout() << "pb0 = " << model_.pb0 << std::endl;
5355  Xyce::dout() << "pb1 = " << model_.pb1 << std::endl;
5356  Xyce::dout() << "pketa = " << model_.pketa << std::endl;
5357  Xyce::dout() << "pketas = " << model_.pketas << std::endl;
5358  Xyce::dout() << "pa1 = " << model_.pa1 << std::endl;
5359  Xyce::dout() << "pa2 = " << model_.pa2 << std::endl;
5360  Xyce::dout() << "prdsw = " << model_.prdsw << std::endl;
5361  Xyce::dout() << "pprwb = " << model_.pprwb << std::endl;
5362  Xyce::dout() << "pprwg = " << model_.pprwg << std::endl;
5363  Xyce::dout() << "pwr = " << model_.pwr << std::endl;
5364  Xyce::dout() << "pnfactor = " << model_.pnfactor << std::endl;
5365  Xyce::dout() << "pdwg = " << model_.pdwg << std::endl;
5366  Xyce::dout() << "pdwb = " << model_.pdwb << std::endl;
5367  Xyce::dout() << "pvoff= " << model_.pvoff << std::endl;
5368  Xyce::dout() << "peta0 = " << model_.peta0 << std::endl;
5369  Xyce::dout() << "petab = " << model_.petab << std::endl;
5370  Xyce::dout() << "pdsub = " << model_.pdsub << std::endl;
5371  Xyce::dout() << "pcit = " << model_.pcit << std::endl;
5372  Xyce::dout() << "pcdsc = " << model_.pcdsc << std::endl;
5373  Xyce::dout() << "pcdscb = " << model_.pcdscb << std::endl;
5374  Xyce::dout() << "pcdscd = " << model_.pcdscd << std::endl;
5375  Xyce::dout() << "ppclm = " << model_.ppclm << std::endl;
5376  Xyce::dout() << "ppdibl1 = " << model_.ppdibl1 << std::endl;
5377  Xyce::dout() << "ppdibl2 = " << model_.ppdibl2 << std::endl;
5378  Xyce::dout() << "ppdiblb = " << model_.ppdiblb << std::endl;
5379  Xyce::dout() << "pdrout = " << model_.pdrout << std::endl;
5380  Xyce::dout() << "ppvag = " << model_.ppvag << std::endl;
5381  Xyce::dout() << "pdelta = " << model_.pdelta << std::endl;
5382  Xyce::dout() << "palpha0 = " << model_.palpha0 << std::endl;
5383  Xyce::dout() << "pfbjtii = " << model_.pfbjtii << std::endl;
5384  Xyce::dout() << "pbeta0 = " << model_.pbeta0 << std::endl;
5385  Xyce::dout() << "pbeta1 = " << model_.pbeta1 << std::endl;
5386  Xyce::dout() << "pbeta2 = " << model_.pbeta2 << std::endl;
5387  Xyce::dout() << "pvdsatii0 = " << model_.pvdsatii0 << std::endl;
5388  Xyce::dout() << "plii = " << model_.plii << std::endl;
5389  Xyce::dout() << "pesatii = " << model_.pesatii << std::endl;
5390  Xyce::dout() << "psii0 = " << model_.psii0 << std::endl;
5391  Xyce::dout() << "psii1 = " << model_.psii1 << std::endl;
5392  Xyce::dout() << "psii2 = " << model_.psii2 << std::endl;
5393  Xyce::dout() << "psiid = " << model_.psiid << std::endl;
5394  Xyce::dout() << "pagidl = " << model_.pagidl << std::endl;
5395  Xyce::dout() << "pbgidl = " << model_.pbgidl << std::endl;
5396  Xyce::dout() << "pngidl= " << model_.pngidl << std::endl;
5397  Xyce::dout() << "pntun = " << model_.pntun << std::endl;
5398  Xyce::dout() << "pndiode = " << model_.pndiode << std::endl;
5399  Xyce::dout() << "pnrecf0 = " << model_.pnrecf0 << std::endl;
5400  Xyce::dout() << "pnrecr0 = " << model_.pnrecr0 << std::endl;
5401  Xyce::dout() << "pisbjt = " << model_.pisbjt << std::endl;
5402  Xyce::dout() << "pisdif = " << model_.pisdif << std::endl;
5403  Xyce::dout() << "pisrec = " << model_.pisrec << std::endl;
5404  Xyce::dout() << "pistun = " << model_.pistun << std::endl;
5405  Xyce::dout() << "pvrec0 = " << model_.pvrec0 << std::endl;
5406  Xyce::dout() << "pvtun0 = " << model_.pvtun0 << std::endl;
5407  Xyce::dout() << "pnbjt = " << model_.pnbjt << std::endl;
5408  Xyce::dout() << "plbjt0 = " << model_.plbjt0 << std::endl;
5409  Xyce::dout() << "pvabjt = " << model_.pvabjt << std::endl;
5410  Xyce::dout() << "paely = " << model_.paely << std::endl;
5411  Xyce::dout() << "pahli = " << model_.pahli << std::endl;
5412  Xyce::dout() << "pvsdfb = " << model_.pvsdfb << std::endl;
5413  Xyce::dout() << "pvsdth = " << model_.pvsdth << std::endl;
5414  Xyce::dout() << "pdelvt = " << model_.pdelvt << std::endl;
5415  Xyce::dout() << "pacde = " << model_.pacde << std::endl;
5416  Xyce::dout() << "pmoin = " << model_.pmoin << std::endl;
5417  Xyce::dout() << "pnoff = " << model_.pnoff << std::endl;
5418  Xyce::dout() << "pxrcrg1 = " << model_.pxrcrg1 << std::endl;
5419  Xyce::dout() << "pxrcrg2 = " << model_.pxrcrg2 << std::endl;
5420 
5421  Xyce::dout() << std::endl;
5422  Xyce::dout() << "Instance Params: " << std::endl;
5423  Xyce::dout() << "l: " << l << std::endl;
5424  Xyce::dout() << "w: " << w << std::endl;
5425  Xyce::dout() << "drainArea: " << drainArea << std::endl;
5426  Xyce::dout() << "sourceArea: " << sourceArea << std::endl;
5427  Xyce::dout() << "drainSquares: " << drainSquares << std::endl;
5428  Xyce::dout() << "sourceSquares: " << sourceSquares << std::endl;
5429  Xyce::dout() << "drainPerimeter: " << drainPerimeter << std::endl;
5430  Xyce::dout() << "sourcePerimeter: " << sourcePerimeter << std::endl;
5431  Xyce::dout() << "icVBS: " << icVBS << std::endl;
5432  Xyce::dout() << "icVDS: " << icVDS << std::endl;
5433  Xyce::dout() << "icVGS: " << icVGS << std::endl;
5434  Xyce::dout() << "bjtoff: " << bjtoff << std::endl;
5435  Xyce::dout() << "debugMod: " << debugMod << std::endl;
5436  Xyce::dout() << "rth0: " << rth0 << std::endl;
5437  Xyce::dout() << "cth0: " << cth0 << std::endl;
5438  Xyce::dout() << "bodySquares: " << bodySquares << std::endl;
5439  Xyce::dout() << "frbody: " << frbody << std::endl;
5440  Xyce::dout() << "soiMod: " << soiMod << std::endl;
5441  Xyce::dout() << "nbc: " << nbc << std::endl;
5442  Xyce::dout() << "nseg: " << nseg << std::endl;
5443  Xyce::dout() << "pdbcp: " << pdbcp << std::endl;
5444  Xyce::dout() << "psbcp: " << psbcp << std::endl;
5445  Xyce::dout() << "agbcp: " << agbcp << std::endl;
5446  Xyce::dout() << "aebcp: " << aebcp << std::endl;
5447  Xyce::dout() << "vbsusr: " << vbsusr << std::endl;
5448  Xyce::dout() << "tnodeout: " << tnodeout << std::endl;
5449  Xyce::dout() << "rgateMod: " << rgateMod << std::endl;
5450  Xyce::dout() << "numberParallel: " << numberParallel << std::endl;
5451  }
5452 }
5453 #endif
5454 
5455 
5456 //-----------------------------------------------------------------------------
5457 // Function : Instance::~Instance
5458 // Purpose : destructor
5459 // Special Notes :
5460 // Scope : public
5461 // Creator : Dave Shirley
5462 // Creation Date : 05/20/04
5463 //-----------------------------------------------------------------------------
5465 {
5466 #ifndef REUSE_PARAMPTR
5467  if (paramPtr != static_cast<SizeDependParam *> (NULL))
5468  delete paramPtr;
5469 #endif
5470 }
5471 
5472 //-----------------------------------------------------------------------------
5473 // Function : Instance::registerLIDs
5474 // Purpose :
5475 // Special Notes :
5476 // Scope : public
5477 // Creator : Robert Hoekstra, SNL, Parallel Computational Sciences
5478 // Creation Date : 05/20/04
5479 //-----------------------------------------------------------------------------
5480 void Instance::registerLIDs( const std::vector<int> & intLIDVecRef,
5481  const std::vector<int> & extLIDVecRef )
5482 {
5483 
5484  numIntVars = 0;
5485  if (tNode == 1)
5486  ++numIntVars;
5487  if (bNode == 1)
5488  ++numIntVars;
5489  if (dNodePrime == 1)
5490  ++numIntVars;
5491  if (sNodePrime == 1)
5492  ++numIntVars;
5493  if (gNodePrime == 1)
5494  ++numIntVars;
5495  if (gNodeMid == 1)
5496  ++numIntVars;
5497 
5498  if (icVDSGiven) ++numIntVars;
5499  if (icVGSGiven) ++numIntVars;
5500  if (icVBSGiven) ++numIntVars;
5501  if (icVESGiven) ++numIntVars;
5502  // Spice model documentation says to ignore icVPS if
5503  // there isn't a p terminal.
5504  if (pNode != 0)
5505  {
5506  if (icVPSGiven) ++numIntVars;
5507  }
5508 
5509  AssertLIDs(intLIDVecRef.size() == numIntVars);
5510  AssertLIDs(extLIDVecRef.size() == numExtVars);
5511 
5512 #ifdef Xyce_DEBUG_DEVICE
5513  if (getDeviceOptions().debugLevel > 0)
5514  {
5515  Xyce::dout() << section_divider << std::endl;
5516  Xyce::dout() << " In Instance::register LIDs\n\n";
5517  Xyce::dout() << " name = " << getName() << std::endl;
5518  Xyce::dout() << " number of internal variables: " << numIntVars << std::endl;
5519  Xyce::dout() << " number of external variables: " << numExtVars << std::endl;
5520 
5521  int i1;
5522  for (i1=0;i1<numIntVars;++i1)
5523  {
5524  Xyce::dout() << "int["<<i1<<"] = " << intLIDVecRef[i1] << std::endl;
5525  }
5526  Xyce::dout() << std::endl;
5527  for (i1=0;i1<numExtVars;++i1)
5528  {
5529  Xyce::dout() << "ext["<<i1<<"] = " << extLIDVecRef[i1] << std::endl;
5530  }
5531  }
5532 #endif
5533 
5534  // copy over the global ID lists.
5535  intLIDVec = intLIDVecRef;
5536  extLIDVec = extLIDVecRef;
5537 
5538  // now use these lists to obtain the indices into the
5539  // linear algebra entities. This assumes an order.
5540  // For the matrix indices, first do the rows.
5541 
5542  int intLoc = 0;
5543  int extLoc = 0;
5544 
5545  li_Drain = extLIDVec[extLoc++];
5546  li_Gate = extLIDVec[extLoc++];
5547  li_Source = extLIDVec[extLoc++];
5548  li_Substrate = extLIDVec[extLoc++];
5549 
5550  // Note: In SPICE, the "extBody" is called the p-node.
5551  if (pNode == 2)
5552  li_ExtBody = extLIDVec[extLoc++];
5553  else
5554  li_ExtBody = -1;
5555 
5556  if (bNode == 1)
5557  li_Body = intLIDVec[intLoc++];
5558  else if (bNode == 2)
5559  li_Body = extLIDVec[extLoc++];
5560  else
5561  li_Body = -1;
5562 
5563  // correct mistake in original Xyce implementation.
5564  // Use of orthogonal flag necessary to avoid impacting jacstamp set-up.
5565  if (pNodeMappedToB)
5566  li_ExtBody = li_Body;
5567 
5568  if (tNode == 1)
5569  li_Temperature = intLIDVec[intLoc++];
5570  else if (tNode == 2)
5571  li_Temperature = extLIDVec[extLoc++];
5572  else
5573  li_Temperature = -1;
5574 
5575  if (dNodePrime == 1)
5576  li_DrainPrime = intLIDVec[intLoc++];
5577  else
5579 
5580  if (sNodePrime == 1)
5581  li_SourcePrime = intLIDVec[intLoc++];
5582  else
5584 
5585  if (gNodePrime == 1)
5586  li_GatePrime = intLIDVec[intLoc++];
5587  else
5589 
5590  if (gNodeMid == 1)
5591  li_GateMid = intLIDVec[intLoc++];
5592  else
5593  li_GateMid = li_Gate;
5594 
5595  if( icVDSGiven )
5596  {
5597  if( li_Drain == li_Source )
5598  {
5599  DevelFatal(*this).in("Instance::registerLIDs")
5600  << "Tried to specify an initial condition on V_Drain_Source when Drain and Source nodes are the same node";
5601  }
5602  li_Ids = intLIDVec[intLoc++];
5603  }
5604 
5605  if( icVGSGiven )
5606  {
5607  if( li_Gate == li_Source )
5608  {
5609  DevelFatal(*this).in("Instance::registerLIDs")
5610  << "Tried to specify an initial condition on V_Gate_Source when Gate and Source nodes are the same node";
5611  }
5612  li_Igs = intLIDVec[intLoc++];
5613  }
5614 
5615  if( icVBSGiven )
5616  {
5617  if( (li_Body == li_Source) || (li_Body == -1) )
5618  {
5619  DevelFatal(*this).in("Instance::registerLIDs")
5620  << "Tried to specify an initial condition on V_Body_Source when Body and Source nodes are the same node, or"
5621  << "when Body node does not exist";
5622  }
5623  li_Ibs = intLIDVec[intLoc++];
5624  }
5625 
5626  if( icVESGiven )
5627  {
5628  if( li_Substrate == li_Source )
5629  {
5630  DevelFatal(*this).in("Instance::registerLIDs")
5631  << "Tried to specify an initial condition on V_Substrate_Source when Substrate and Source nodes are the same node";
5632  }
5633  li_Ies = intLIDVec[intLoc++];
5634  }
5635  if( icVPSGiven )
5636  {
5637  if( (li_ExtBody == li_Source) || (li_ExtBody == -1) )
5638  {
5639  DevelFatal(*this).in("Instance::registerLIDs")
5640  << "Tried to specify an initial condition on V_ExtBody_Source when External Body and Source nodes are the same node, "
5641  << "or when External Body node does not exist.";
5642  }
5643  li_Ips = intLIDVec[intLoc++];
5644  }
5645 
5646 #ifdef Xyce_DEBUG_DEVICE
5647  if (getDeviceOptions().debugLevel > 0)
5648  {
5649  Xyce::dout() << "\n local variable indices:\n";
5650  Xyce::dout() << " li_Drain = " << li_Drain << std::endl;
5651  Xyce::dout() << " li_Gate = " << li_Gate << std::endl;
5652  Xyce::dout() << " li_Source = " << li_Source << std::endl;
5653  Xyce::dout() << " li_Substrate = " << li_Substrate << std::endl;
5654  Xyce::dout() << " li_ExtBody = " << li_ExtBody << std::endl;
5655  Xyce::dout() << " li_Body = " << li_Body << std::endl;
5656  Xyce::dout() << " li_Temperature = " << li_Temperature << std::endl;
5657  Xyce::dout() << " li_DrainPrime = " << li_DrainPrime << std::endl;
5658  Xyce::dout() << " li_SourcePrime = " << li_SourcePrime << std::endl;
5659  Xyce::dout() << " li_GatePrime = " << li_GatePrime << std::endl;
5660  Xyce::dout() << " li_GateMid = " << li_GateMid << std::endl;
5661  if (icVDSGiven)
5662  Xyce::dout() << " li_Ids = " << li_Ids << std::endl;
5663 
5664  if (icVGSGiven)
5665  Xyce::dout() << " li_Igs = " << li_Igs << std::endl;
5666 
5667  if (icVBSGiven)
5668  Xyce::dout() << " li_Ibs = " << li_Ibs << std::endl;
5669 
5670  if (icVESGiven)
5671  Xyce::dout() << " li_Ies = " << li_Ies << std::endl;
5672 
5673  if (icVPSGiven)
5674  Xyce::dout() << " li_Ips = " << li_Ips << std::endl;
5675 
5676  Xyce::dout() << section_divider << std::endl;
5677  }
5678 #endif
5679 
5680 }
5681 
5682 //-----------------------------------------------------------------------------
5683 // Function : Instance::getIntNameMap
5684 // Purpose :
5685 // Special Notes :
5686 // Scope : public
5687 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
5688 // Creation Date : 05/13/05
5689 //-----------------------------------------------------------------------------
5690 std::map<int,std::string> & Instance::getIntNameMap ()
5691 {
5692  // set up the internal name map, if it hasn't been already.
5693  if (intNameMap.empty ())
5694  {
5695  // set up the internal names map
5696  std::string tmpstr;
5697  if (bNode == 1)
5698  {
5699  tmpstr = getName()+"_Body";
5700  spiceInternalName (tmpstr);
5701  intNameMap[li_Body] = tmpstr;
5702  }
5703  if (tNode == 1)
5704  {
5705  tmpstr = getName()+"_Temp";
5706  spiceInternalName (tmpstr);
5707  intNameMap[li_Temperature] = tmpstr;
5708  }
5709  if (dNodePrime == 1)
5710  {
5711  tmpstr = getName()+"_drain";
5712  spiceInternalName (tmpstr);
5713  intNameMap[li_DrainPrime] = tmpstr;
5714  }
5715  if (sNodePrime == 1)
5716  {
5717  tmpstr = getName()+"_source";
5718  spiceInternalName (tmpstr);
5719  intNameMap[li_SourcePrime] = tmpstr;
5720  }
5721  if (gNodePrime == 1)
5722  {
5723  tmpstr = getName()+"_gate";
5724  spiceInternalName (tmpstr);
5725  intNameMap[li_GatePrime] = tmpstr;
5726  }
5727  if (gNodeMid == 1)
5728  {
5729  tmpstr = getName()+"_midgate";
5730  spiceInternalName (tmpstr);
5731  intNameMap[li_GateMid] = tmpstr;
5732  }
5733  if (icVDSGiven)
5734  {
5735  tmpstr = getName()+"_branch_DS";
5736  spiceInternalName (tmpstr);
5737  intNameMap[li_Ids] = tmpstr;
5738  }
5739  if (icVGSGiven)
5740  {
5741  tmpstr = getName()+"_branch_GS";
5742  spiceInternalName (tmpstr);
5743  intNameMap[li_Igs] = tmpstr;
5744  }
5745  if (icVBSGiven)
5746  {
5747  tmpstr = getName()+"_branch_BS";
5748  spiceInternalName (tmpstr);
5749  intNameMap[li_Ibs] = tmpstr;
5750  }
5751  if (icVESGiven)
5752  {
5753  tmpstr = getName()+"_branch_ES";
5754  spiceInternalName (tmpstr);
5755  intNameMap[li_Ies] = tmpstr;
5756  }
5757  // Spice model documentation says to ignore icVPS if
5758  // there isn't a p terminal.
5759  if (pNode != 0)
5760  {
5761  if (icVPSGiven)
5762  {
5763  tmpstr = getName()+"_branch_PS";
5764  spiceInternalName (tmpstr);
5765  intNameMap[li_Ips] = tmpstr;
5766  }
5767  }
5768 
5769  }
5770 
5771  return intNameMap;
5772 }
5773 
5774 
5775 //-----------------------------------------------------------------------------
5776 // Function : Instance::getStoreNameMap
5777 // Purpose :
5778 // Special Notes :
5779 // Scope : public
5780 // Creator : Richard Schiek, Electrical Systems Modeling
5781 // Creation Date : 4/4/2013
5782 //-----------------------------------------------------------------------------
5783 std::map<int,std::string> & Instance::getStoreNameMap ()
5784 {
5785  // set up the internal name map, if it hasn't been already.
5786  if( loadLeadCurrent && storeNameMap.empty ())
5787  {
5788  // change subcircuitname:devicetype_deviceName to
5789  // devicetype:subcircuitName:deviceName
5790  std::string modName(getName());
5791  spiceInternalName(modName);
5792  std::string tmpstr;
5793  tmpstr = modName+":DEV_ID";
5794  storeNameMap[ li_store_dev_id ] = tmpstr;
5795  tmpstr = modName+":DEV_IG";
5796  storeNameMap[ li_store_dev_ig ] = tmpstr;
5797  tmpstr = modName+":DEV_IS";
5798  storeNameMap[ li_store_dev_is ] = tmpstr;
5799  tmpstr = modName+":DEV_IE";
5800  storeNameMap[ li_store_dev_ie ] = tmpstr;
5801  tmpstr = modName+":DEV_IB";
5802  storeNameMap[ li_store_dev_ib ] = tmpstr;
5803  }
5804 
5805  return storeNameMap;
5806 }
5807 
5808 
5809 //-----------------------------------------------------------------------------
5810 // Function : Instance::registerStateLIDs
5811 // Purpose :
5812 // Special Notes :
5813 // Scope : public
5814 // Creator : Robert Hoekstra, SNL, Parallel Computational Sciences
5815 // Creation Date : 05/20/04
5816 //-----------------------------------------------------------------------------
5818  const std::vector<int> & staLIDVecRef )
5819 {
5820  AssertLIDs(staLIDVecRef.size() == numStateVars);
5821 
5822 #ifdef Xyce_DEBUG_DEVICE
5823 
5824  if (getDeviceOptions().debugLevel > 0)
5825  {
5826  Xyce::dout() << std::endl;
5827  Xyce::dout() << section_divider << std::endl;
5828  Xyce::dout() << " In Instance::registerStateLIDs\n\n";
5829  Xyce::dout() << " name = " << getName() << std::endl;
5830  Xyce::dout() << " Number of State LIDs: " << numStateVars << std::endl;
5831  }
5832 #endif
5833 
5834  // Copy over the global ID lists:
5835  staLIDVec = staLIDVecRef;
5836 
5837  int n = 0;
5838  // intrinsic capacitors
5839  li_state_qb = staLIDVec[n++];
5840  li_state_qg = staLIDVec[n++];
5841  li_state_qd = staLIDVec[n++];
5842  li_state_qe = staLIDVec[n++];
5843  li_state_qgmid = staLIDVec[n++];
5844  li_state_qth = staLIDVec[n++];
5845 
5846 #ifdef Xyce_DEBUG_DEVICE
5847  if (getDeviceOptions().debugLevel > 0)
5848  {
5849  Xyce::dout() << " Local State indices:" << std::endl;
5850  Xyce::dout() << std::endl;
5851 
5852  Xyce::dout() << " li_state_qb = " << li_state_qb << std::endl;
5853  Xyce::dout() << " li_state_qg = " << li_state_qg << std::endl;
5854  Xyce::dout() << " li_state_qd = " << li_state_qd << std::endl;
5855  Xyce::dout() << " li_state_qe = " << li_state_qe << std::endl;
5856  Xyce::dout() << " li_state_qgmid = " << li_state_qgmid << std::endl;
5857  Xyce::dout() << " li_state_qth = " << li_state_qth << std::endl;
5858  Xyce::dout() << std::endl;
5859  Xyce::dout() << section_divider << std::endl;
5860  }
5861 #endif
5862 
5863 }
5864 
5865 //-----------------------------------------------------------------------------
5866 // Function : Instance::registerStoreLIDs
5867 // Purpose :
5868 // Special Notes :
5869 // Scope : public
5870 // Creator : Eric Keiter
5871 // Creation Date :
5872 //-----------------------------------------------------------------------------
5874  const std::vector<int> & stoLIDVecRef )
5875 {
5876  AssertLIDs(stoLIDVecRef.size() == getNumStoreVars());
5877 
5878  // Copy over the global ID lists:
5879  stoLIDVec = stoLIDVecRef;
5880 
5881  int n = 0;
5882  // voltage drops
5883  li_store_vbd = stoLIDVec[n++];
5884  li_store_vbs = stoLIDVec[n++];
5885  li_store_vgs = stoLIDVec[n++];
5886  li_store_vds = stoLIDVec[n++];
5887  li_store_ves = stoLIDVec[n++];
5888  li_store_vps = stoLIDVec[n++];
5889 
5890  li_store_vg = stoLIDVec[n++];
5891  li_store_vd = stoLIDVec[n++];
5892  li_store_vs = stoLIDVec[n++];
5893  li_store_vp = stoLIDVec[n++];
5894  li_store_ve = stoLIDVec[n++];
5895  li_store_vgp = stoLIDVec[n++];
5896  li_store_vgm = stoLIDVec[n++];
5897  li_store_deltemp = stoLIDVec[n++];
5898 
5899  li_store_vges = stoLIDVec[n++];
5900  li_store_vgms = stoLIDVec[n++];
5901 
5902  if( loadLeadCurrent )
5903  {
5904  li_store_dev_id = stoLIDVec[n++];
5905  li_store_dev_ig = stoLIDVec[n++];
5906  li_store_dev_is = stoLIDVec[n++];
5907  li_store_dev_ie = stoLIDVec[n++];
5908  li_store_dev_ib = stoLIDVec[n++];
5909  }
5910 }
5911 
5912 //-----------------------------------------------------------------------------
5913 // Function : Instance::jacobianStamp
5914 // Purpose :
5915 // Special Notes :
5916 // Scope : public
5917 // Creator : Robert Hoekstra, SNL, Parallel Computational Sciences
5918 // Creation Date : 05/20/04
5919 //-----------------------------------------------------------------------------
5920 const std::vector< std::vector<int> > & Instance::jacobianStamp() const
5921 {
5923  {
5924  return jacStampIC;
5925  }
5926 
5927  return jacStamp_v[jacID];
5928 }
5929 
5930 //-----------------------------------------------------------------------------
5931 // Function : Instance::registerJacLIDs
5932 // Purpose :
5933 // Special Notes :
5934 // Scope : public
5935 // Creator : Robert Hoekstra, SNL, Parallel Computational Sciences
5936 // Creation Date : 05/20/04
5937 //-----------------------------------------------------------------------------
5939  const std::vector< std::vector<int> > & jacLIDVec )
5940 {
5941  DeviceInstance::registerJacLIDs( jacLIDVec );
5942  std::vector<int> map;
5943  std::vector< std::vector<int> > map2;
5944 
5945  // these are used to helpe us pluck the LID's from the right spot
5946  // without adding a lot of new code to each jacID condition below
5947  int lastDrainIndex = 0;
5948  int lastGateIndex = 0;
5949  int lastBodyIndex = 0;
5950  int lastSourceIndex = 0;
5951  int lastSubstrateIndex = 0;
5952  int lastExtBodyIndex = 0;
5953  int lastRowUsed = 0;
5954 
5956  {
5957  map = jacMapIC;
5958  map2 = jacMapIC2;
5959  }
5960  else
5961  {
5962  map = jacMap_v[jacID];
5963  map2 = jacMap2_v[jacID];
5964  }
5965 
5966  if (jacID < 24)
5967  {
5968  ADrainEquDrainNodeOffset = jacLIDVec[map[0]][map2[0][0]];
5969  ADrainEquDrainPrimeNodeOffset = jacLIDVec[map[0]][map2[0][1]];
5970 
5971  AGateEquGateNodeOffset = jacLIDVec[map[1]][map2[1][0]];
5972  AGateEquBodyNodeOffset = jacLIDVec[map[1]][map2[1][1]];
5973  AGateEquDrainPrimeNodeOffset = jacLIDVec[map[1]][map2[1][2]];
5974  AGateEquSourcePrimeNodeOffset = jacLIDVec[map[1]][map2[1][3]];
5975  AGateEquGatePrimeNodeOffset = jacLIDVec[map[1]][map2[1][4]];
5976  AGateEquGateMidNodeOffset = jacLIDVec[map[1]][map2[1][5]];
5977 
5978  ASourceEquSourceNodeOffset = jacLIDVec[map[2]][map2[2][0]];
5979  ASourceEquSourcePrimeNodeOffset = jacLIDVec[map[2]][map2[2][1]];
5980 
5981  ASubstrateEquSubstrateNodeOffset = jacLIDVec[map[3]][map2[3][0]];
5982  ASubstrateEquBodyNodeOffset = jacLIDVec[map[3]][map2[3][1]];
5983  ASubstrateEquTemperatureNodeOffset = jacLIDVec[map[3]][map2[3][2]];
5984  ASubstrateEquDrainPrimeNodeOffset = jacLIDVec[map[3]][map2[3][3]];
5985  ASubstrateEquSourcePrimeNodeOffset = jacLIDVec[map[3]][map2[3][4]];
5986  ASubstrateEquGatePrimeNodeOffset = jacLIDVec[map[3]][map2[3][5]];
5987  ASubstrateEquGateMidNodeOffset = jacLIDVec[map[3]][map2[3][6]];
5988 
5989  AExtBodyEquExtBodyNodeOffset = jacLIDVec[map[4]][map2[4][0]];
5990  AExtBodyEquBodyNodeOffset = jacLIDVec[map[4]][map2[4][1]];
5991 
5992  ABodyEquSubstrateNodeOffset = jacLIDVec[map[5]][map2[5][0]];
5993  ABodyEquExtBodyNodeOffset = jacLIDVec[map[5]][map2[5][1]];
5994  ABodyEquBodyNodeOffset = jacLIDVec[map[5]][map2[5][2]];
5995  ABodyEquTemperatureNodeOffset = jacLIDVec[map[5]][map2[5][3]];
5996  ABodyEquDrainPrimeNodeOffset = jacLIDVec[map[5]][map2[5][4]];
5997  ABodyEquSourcePrimeNodeOffset = jacLIDVec[map[5]][map2[5][5]];
5998  ABodyEquGatePrimeNodeOffset = jacLIDVec[map[5]][map2[5][6]];
5999 
6000  ATemperatureEquSubstrateNodeOffset = jacLIDVec[map[6]][map2[6][0]];
6001  ATemperatureEquBodyNodeOffset = jacLIDVec[map[6]][map2[6][1]];
6002  ATemperatureEquTemperatureNodeOffset = jacLIDVec[map[6]][map2[6][2]];
6003  ATemperatureEquDrainPrimeNodeOffset = jacLIDVec[map[6]][map2[6][3]];
6004  ATemperatureEquSourcePrimeNodeOffset = jacLIDVec[map[6]][map2[6][4]];
6005  ATemperatureEquGatePrimeNodeOffset = jacLIDVec[map[6]][map2[6][5]];
6006 
6007  ADrainPrimeEquDrainNodeOffset = jacLIDVec[map[7]][map2[7][0]];
6008  ADrainPrimeEquSubstrateNodeOffset = jacLIDVec[map[7]][map2[7][1]];
6009  ADrainPrimeEquBodyNodeOffset = jacLIDVec[map[7]][map2[7][2]];
6010  ADrainPrimeEquTemperatureNodeOffset = jacLIDVec[map[7]][map2[7][3]];
6011  ADrainPrimeEquDrainPrimeNodeOffset = jacLIDVec[map[7]][map2[7][4]];
6012  ADrainPrimeEquSourcePrimeNodeOffset = jacLIDVec[map[7]][map2[7][5]];
6013  ADrainPrimeEquGatePrimeNodeOffset = jacLIDVec[map[7]][map2[7][6]];
6014  ADrainPrimeEquGateMidNodeOffset = jacLIDVec[map[7]][map2[7][7]];
6015 
6016  ASourcePrimeEquSourceNodeOffset = jacLIDVec[map[8]][map2[8][0]];
6017  ASourcePrimeEquSubstrateNodeOffset = jacLIDVec[map[8]][map2[8][1]];
6018  ASourcePrimeEquBodyNodeOffset = jacLIDVec[map[8]][map2[8][2]];
6019  ASourcePrimeEquTemperatureNodeOffset = jacLIDVec[map[8]][map2[8][3]];
6020  ASourcePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[8]][map2[8][4]];
6021  ASourcePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[8]][map2[8][5]];
6022  ASourcePrimeEquGatePrimeNodeOffset = jacLIDVec[map[8]][map2[8][6]];
6023  ASourcePrimeEquGateMidNodeOffset = jacLIDVec[map[8]][map2[8][7]];
6024 
6025  AGatePrimeEquGateNodeOffset = jacLIDVec[map[9]][map2[9][0]];
6026  AGatePrimeEquSubstrateNodeOffset = jacLIDVec[map[9]][map2[9][1]];
6027  AGatePrimeEquBodyNodeOffset = jacLIDVec[map[9]][map2[9][2]];
6028  AGatePrimeEquTemperatureNodeOffset = jacLIDVec[map[9]][map2[9][3]];
6029  AGatePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[9]][map2[9][4]];
6030  AGatePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[9]][map2[9][5]];
6031  AGatePrimeEquGatePrimeNodeOffset = jacLIDVec[map[9]][map2[9][6]];
6032  AGatePrimeEquGateMidNodeOffset = jacLIDVec[map[9]][map2[9][7]];
6033 
6034  AGateMidEquGateNodeOffset = jacLIDVec[map[10]][map2[10][0]];
6035  AGateMidEquSubstrateNodeOffset = jacLIDVec[map[10]][map2[10][1]];
6036  AGateMidEquBodyNodeOffset = jacLIDVec[map[10]][map2[10][2]];
6037  AGateMidEquDrainPrimeNodeOffset = jacLIDVec[map[10]][map2[10][3]];
6038  AGateMidEquSourcePrimeNodeOffset = jacLIDVec[map[10]][map2[10][4]];
6039  AGateMidEquGatePrimeNodeOffset = jacLIDVec[map[10]][map2[10][5]];
6040  AGateMidEquGateMidNodeOffset = jacLIDVec[map[10]][map2[10][6]];
6041 
6042  lastDrainIndex = 1;
6043  lastGateIndex = 5;
6044  lastBodyIndex = 6;
6045  lastSourceIndex = 1;
6046  lastSubstrateIndex = 6;
6047  lastExtBodyIndex = 1;
6048  lastRowUsed = 10;
6049  }
6050  else if (jacID >= 24 && jacID < 48)
6051  {
6052  ADrainEquDrainNodeOffset = jacLIDVec[map[0]][map2[0][0]];
6053  ADrainEquDrainPrimeNodeOffset = jacLIDVec[map[0]][map2[0][1]];
6054 
6055  AGateEquGateNodeOffset = jacLIDVec[map[1]][map2[1][0]];
6056  AGateEquBodyNodeOffset = jacLIDVec[map[1]][map2[1][1]];
6057  AGateEquDrainPrimeNodeOffset = jacLIDVec[map[1]][map2[1][2]];
6058  AGateEquSourcePrimeNodeOffset = jacLIDVec[map[1]][map2[1][3]];
6059  AGateEquGatePrimeNodeOffset = jacLIDVec[map[1]][map2[1][4]];
6060  AGateEquGateMidNodeOffset = jacLIDVec[map[1]][map2[1][5]];
6061 
6062  ASourceEquSourceNodeOffset = jacLIDVec[map[2]][map2[2][0]];
6063  ASourceEquSourcePrimeNodeOffset = jacLIDVec[map[2]][map2[2][1]];
6064 
6065  ASubstrateEquSubstrateNodeOffset = jacLIDVec[map[3]][map2[3][0]];
6066  ASubstrateEquBodyNodeOffset = jacLIDVec[map[3]][map2[3][1]];
6067  ASubstrateEquDrainPrimeNodeOffset = jacLIDVec[map[3]][map2[3][2]];
6068  ASubstrateEquSourcePrimeNodeOffset = jacLIDVec[map[3]][map2[3][3]];
6069  ASubstrateEquGatePrimeNodeOffset = jacLIDVec[map[3]][map2[3][4]];
6070  ASubstrateEquGateMidNodeOffset = jacLIDVec[map[3]][map2[3][5]];
6071 
6072  AExtBodyEquExtBodyNodeOffset = jacLIDVec[map[4]][map2[4][0]];
6073  AExtBodyEquBodyNodeOffset = jacLIDVec[map[4]][map2[4][1]];
6074 
6075  ABodyEquSubstrateNodeOffset = jacLIDVec[map[5]][map2[5][0]];
6076  ABodyEquExtBodyNodeOffset = jacLIDVec[map[5]][map2[5][1]];
6077  ABodyEquBodyNodeOffset = jacLIDVec[map[5]][map2[5][2]];
6078  ABodyEquDrainPrimeNodeOffset = jacLIDVec[map[5]][map2[5][3]];
6079  ABodyEquSourcePrimeNodeOffset = jacLIDVec[map[5]][map2[5][4]];
6080  ABodyEquGatePrimeNodeOffset = jacLIDVec[map[5]][map2[5][5]];
6081 
6082  ADrainPrimeEquDrainNodeOffset = jacLIDVec[map[6]][map2[6][0]];
6083  ADrainPrimeEquSubstrateNodeOffset = jacLIDVec[map[6]][map2[6][1]];
6084  ADrainPrimeEquBodyNodeOffset = jacLIDVec[map[6]][map2[6][2]];
6085  ADrainPrimeEquDrainPrimeNodeOffset = jacLIDVec[map[6]][map2[6][3]];
6086  ADrainPrimeEquSourcePrimeNodeOffset = jacLIDVec[map[6]][map2[6][4]];
6087  ADrainPrimeEquGatePrimeNodeOffset = jacLIDVec[map[6]][map2[6][5]];
6088  ADrainPrimeEquGateMidNodeOffset = jacLIDVec[map[6]][map2[6][6]];
6089 
6090  ASourcePrimeEquSourceNodeOffset = jacLIDVec[map[7]][map2[7][0]];
6091  ASourcePrimeEquSubstrateNodeOffset = jacLIDVec[map[7]][map2[7][1]];
6092  ASourcePrimeEquBodyNodeOffset = jacLIDVec[map[7]][map2[7][2]];
6093  ASourcePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[7]][map2[7][3]];
6094  ASourcePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[7]][map2[7][4]];
6095  ASourcePrimeEquGatePrimeNodeOffset = jacLIDVec[map[7]][map2[7][5]];
6096  ASourcePrimeEquGateMidNodeOffset = jacLIDVec[map[7]][map2[7][6]];
6097 
6098  AGatePrimeEquGateNodeOffset = jacLIDVec[map[8]][map2[8][0]];
6099  AGatePrimeEquSubstrateNodeOffset = jacLIDVec[map[8]][map2[8][1]];
6100  AGatePrimeEquBodyNodeOffset = jacLIDVec[map[8]][map2[8][2]];
6101  AGatePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[8]][map2[8][3]];
6102  AGatePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[8]][map2[8][4]];
6103  AGatePrimeEquGatePrimeNodeOffset = jacLIDVec[map[8]][map2[8][5]];
6104  AGatePrimeEquGateMidNodeOffset = jacLIDVec[map[8]][map2[8][6]];
6105 
6106  AGateMidEquGateNodeOffset = jacLIDVec[map[9]][map2[9][0]];
6107  AGateMidEquSubstrateNodeOffset = jacLIDVec[map[9]][map2[9][1]];
6108  AGateMidEquBodyNodeOffset = jacLIDVec[map[9]][map2[9][2]];
6109  AGateMidEquDrainPrimeNodeOffset = jacLIDVec[map[9]][map2[9][3]];
6110  AGateMidEquSourcePrimeNodeOffset = jacLIDVec[map[9]][map2[9][4]];
6111  AGateMidEquGatePrimeNodeOffset = jacLIDVec[map[9]][map2[9][5]];
6112  AGateMidEquGateMidNodeOffset = jacLIDVec[map[9]][map2[9][6]];
6113 
6114  lastDrainIndex = 1;
6115  lastGateIndex = 5;
6116  lastBodyIndex = 5;
6117  lastSourceIndex = 1;
6118  lastSubstrateIndex = 5;
6119  lastExtBodyIndex = 1;
6120  lastRowUsed = 9;
6121  }
6122  else if (jacID >= 48 && jacID < 60)
6123  {
6124  ADrainEquDrainNodeOffset = jacLIDVec[map[0]][map2[0][0]];
6125  ADrainEquDrainPrimeNodeOffset = jacLIDVec[map[0]][map2[0][1]];
6126 
6127  AGateEquGateNodeOffset = jacLIDVec[map[1]][map2[1][0]];
6128  AGateEquDrainPrimeNodeOffset = jacLIDVec[map[1]][map2[1][1]];
6129  AGateEquSourcePrimeNodeOffset = jacLIDVec[map[1]][map2[1][2]];
6130  AGateEquGatePrimeNodeOffset = jacLIDVec[map[1]][map2[1][3]];
6131  AGateEquGateMidNodeOffset = jacLIDVec[map[1]][map2[1][4]];
6132 
6133  ASourceEquSourceNodeOffset = jacLIDVec[map[2]][map2[2][0]];
6134  ASourceEquSourcePrimeNodeOffset = jacLIDVec[map[2]][map2[2][1]];
6135 
6136  ASubstrateEquSubstrateNodeOffset = jacLIDVec[map[3]][map2[3][0]];
6137  ASubstrateEquTemperatureNodeOffset = jacLIDVec[map[3]][map2[3][1]];
6138  ASubstrateEquDrainPrimeNodeOffset = jacLIDVec[map[3]][map2[3][2]];
6139  ASubstrateEquSourcePrimeNodeOffset = jacLIDVec[map[3]][map2[3][3]];
6140  ASubstrateEquGatePrimeNodeOffset = jacLIDVec[map[3]][map2[3][4]];
6141  ASubstrateEquGateMidNodeOffset = jacLIDVec[map[3]][map2[3][5]];
6142 
6143  ATemperatureEquSubstrateNodeOffset = jacLIDVec[map[4]][map2[4][0]];
6144  ATemperatureEquTemperatureNodeOffset = jacLIDVec[map[4]][map2[4][1]];
6145  ATemperatureEquDrainPrimeNodeOffset = jacLIDVec[map[4]][map2[4][2]];
6146  ATemperatureEquSourcePrimeNodeOffset = jacLIDVec[map[4]][map2[4][3]];
6147  ATemperatureEquGatePrimeNodeOffset = jacLIDVec[map[4]][map2[4][4]];
6148 
6149  ADrainPrimeEquDrainNodeOffset = jacLIDVec[map[5]][map2[5][0]];
6150  ADrainPrimeEquSubstrateNodeOffset = jacLIDVec[map[5]][map2[5][1]];
6151  ADrainPrimeEquTemperatureNodeOffset = jacLIDVec[map[5]][map2[5][2]];
6152  ADrainPrimeEquDrainPrimeNodeOffset = jacLIDVec[map[5]][map2[5][3]];
6153  ADrainPrimeEquSourcePrimeNodeOffset = jacLIDVec[map[5]][map2[5][4]];
6154  ADrainPrimeEquGatePrimeNodeOffset = jacLIDVec[map[5]][map2[5][5]];
6155  ADrainPrimeEquGateMidNodeOffset = jacLIDVec[map[5]][map2[5][6]];
6156 
6157  ASourcePrimeEquSourceNodeOffset = jacLIDVec[map[6]][map2[6][0]];
6158  ASourcePrimeEquSubstrateNodeOffset = jacLIDVec[map[6]][map2[6][1]];
6159  ASourcePrimeEquTemperatureNodeOffset = jacLIDVec[map[6]][map2[6][2]];
6160  ASourcePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[6]][map2[6][3]];
6161  ASourcePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[6]][map2[6][4]];
6162  ASourcePrimeEquGatePrimeNodeOffset = jacLIDVec[map[6]][map2[6][5]];
6163  ASourcePrimeEquGateMidNodeOffset = jacLIDVec[map[6]][map2[6][6]];
6164 
6165  AGatePrimeEquGateNodeOffset = jacLIDVec[map[7]][map2[7][0]];
6166  AGatePrimeEquSubstrateNodeOffset = jacLIDVec[map[7]][map2[7][1]];
6167  AGatePrimeEquTemperatureNodeOffset = jacLIDVec[map[7]][map2[7][2]];
6168  AGatePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[7]][map2[7][3]];
6169  AGatePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[7]][map2[7][4]];
6170  AGatePrimeEquGatePrimeNodeOffset = jacLIDVec[map[7]][map2[7][5]];
6171  AGatePrimeEquGateMidNodeOffset = jacLIDVec[map[7]][map2[7][6]];
6172 
6173  AGateMidEquGateNodeOffset = jacLIDVec[map[8]][map2[8][0]];
6174  AGateMidEquSubstrateNodeOffset = jacLIDVec[map[8]][map2[8][1]];
6175  AGateMidEquDrainPrimeNodeOffset = jacLIDVec[map[8]][map2[8][2]];
6176  AGateMidEquSourcePrimeNodeOffset = jacLIDVec[map[8]][map2[8][3]];
6177  AGateMidEquGatePrimeNodeOffset = jacLIDVec[map[8]][map2[8][4]];
6178  AGateMidEquGateMidNodeOffset = jacLIDVec[map[8]][map2[8][5]];
6179 
6180  lastDrainIndex = 1;
6181  lastGateIndex = 4;
6182  lastBodyIndex = 0;
6183  lastSourceIndex = 1;
6184  lastSubstrateIndex = 5;
6185  lastExtBodyIndex = 0;
6186  lastRowUsed = 8;
6187  }
6188  else if (jacID >= 60 && jacID < 72)
6189  {
6190  ADrainEquDrainNodeOffset = jacLIDVec[map[0]][map2[0][0]];
6191  ADrainEquDrainPrimeNodeOffset = jacLIDVec[map[0]][map2[0][1]];
6192 
6193  AGateEquGateNodeOffset = jacLIDVec[map[1]][map2[1][0]];
6194  AGateEquDrainPrimeNodeOffset = jacLIDVec[map[1]][map2[1][1]];
6195  AGateEquSourcePrimeNodeOffset = jacLIDVec[map[1]][map2[1][2]];
6196  AGateEquGatePrimeNodeOffset = jacLIDVec[map[1]][map2[1][3]];
6197  AGateEquGateMidNodeOffset = jacLIDVec[map[1]][map2[1][4]];
6198 
6199  ASourceEquSourceNodeOffset = jacLIDVec[map[2]][map2[2][0]];
6200  ASourceEquSourcePrimeNodeOffset = jacLIDVec[map[2]][map2[2][1]];
6201 
6202  ASubstrateEquSubstrateNodeOffset = jacLIDVec[map[3]][map2[3][0]];
6203  ASubstrateEquDrainPrimeNodeOffset = jacLIDVec[map[3]][map2[3][1]];
6204  ASubstrateEquSourcePrimeNodeOffset = jacLIDVec[map[3]][map2[3][2]];
6205  ASubstrateEquGatePrimeNodeOffset = jacLIDVec[map[3]][map2[3][3]];
6206  ASubstrateEquGateMidNodeOffset = jacLIDVec[map[3]][map2[3][4]];
6207 
6208  ADrainPrimeEquDrainNodeOffset = jacLIDVec[map[4]][map2[4][0]];
6209  ADrainPrimeEquSubstrateNodeOffset = jacLIDVec[map[4]][map2[4][1]];
6210  ADrainPrimeEquDrainPrimeNodeOffset = jacLIDVec[map[4]][map2[4][2]];
6211  ADrainPrimeEquSourcePrimeNodeOffset = jacLIDVec[map[4]][map2[4][3]];
6212  ADrainPrimeEquGatePrimeNodeOffset = jacLIDVec[map[4]][map2[4][4]];
6213  ADrainPrimeEquGateMidNodeOffset = jacLIDVec[map[4]][map2[4][5]];
6214 
6215  ASourcePrimeEquSourceNodeOffset = jacLIDVec[map[5]][map2[5][0]];
6216  ASourcePrimeEquSubstrateNodeOffset = jacLIDVec[map[5]][map2[5][1]];
6217  ASourcePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[5]][map2[5][2]];
6218  ASourcePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[5]][map2[5][3]];
6219  ASourcePrimeEquGatePrimeNodeOffset = jacLIDVec[map[5]][map2[5][4]];
6220  ASourcePrimeEquGateMidNodeOffset = jacLIDVec[map[5]][map2[5][5]];
6221 
6222  AGatePrimeEquGateNodeOffset = jacLIDVec[map[6]][map2[6][0]];
6223  AGatePrimeEquSubstrateNodeOffset = jacLIDVec[map[6]][map2[6][1]];
6224  AGatePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[6]][map2[6][2]];
6225  AGatePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[6]][map2[6][3]];
6226  AGatePrimeEquGatePrimeNodeOffset = jacLIDVec[map[6]][map2[6][4]];
6227  AGatePrimeEquGateMidNodeOffset = jacLIDVec[map[6]][map2[6][5]];
6228 
6229  AGateMidEquGateNodeOffset = jacLIDVec[map[7]][map2[7][0]];
6230  AGateMidEquSubstrateNodeOffset = jacLIDVec[map[7]][map2[7][1]];
6231  AGateMidEquDrainPrimeNodeOffset = jacLIDVec[map[7]][map2[7][2]];
6232  AGateMidEquSourcePrimeNodeOffset = jacLIDVec[map[7]][map2[7][3]];
6233  AGateMidEquGatePrimeNodeOffset = jacLIDVec[map[7]][map2[7][4]];
6234  AGateMidEquGateMidNodeOffset = jacLIDVec[map[7]][map2[7][5]];
6235 
6236  lastDrainIndex = 1;
6237  lastGateIndex = 4;
6238  lastBodyIndex = 0;
6239  lastSourceIndex = 1;
6240  lastSubstrateIndex = 4;
6241  lastExtBodyIndex = 0;
6242  lastRowUsed = 7;
6243  }
6244  else if (jacID >= 72 && jacID < 84)
6245  {
6246  ADrainEquDrainNodeOffset = jacLIDVec[map[0]][map2[0][0]];
6247  ADrainEquDrainPrimeNodeOffset = jacLIDVec[map[0]][map2[0][1]];
6248 
6249  AGateEquGateNodeOffset = jacLIDVec[map[1]][map2[1][0]];
6250  AGateEquBodyNodeOffset = jacLIDVec[map[1]][map2[1][1]];
6251  AGateEquDrainPrimeNodeOffset = jacLIDVec[map[1]][map2[1][2]];
6252  AGateEquSourcePrimeNodeOffset = jacLIDVec[map[1]][map2[1][3]];
6253  AGateEquGatePrimeNodeOffset = jacLIDVec[map[1]][map2[1][4]];
6254  AGateEquGateMidNodeOffset = jacLIDVec[map[1]][map2[1][5]];
6255 
6256  ASourceEquSourceNodeOffset = jacLIDVec[map[2]][map2[2][0]];
6257  ASourceEquSourcePrimeNodeOffset = jacLIDVec[map[2]][map2[2][1]];
6258 
6259  ASubstrateEquSubstrateNodeOffset = jacLIDVec[map[3]][map2[3][0]];
6260  ASubstrateEquTemperatureNodeOffset = jacLIDVec[map[3]][map2[3][1]];
6261  ASubstrateEquBodyNodeOffset = jacLIDVec[map[3]][map2[3][2]];
6262  ASubstrateEquDrainPrimeNodeOffset = jacLIDVec[map[3]][map2[3][3]];
6263  ASubstrateEquSourcePrimeNodeOffset = jacLIDVec[map[3]][map2[3][4]];
6264  ASubstrateEquGatePrimeNodeOffset = jacLIDVec[map[3]][map2[3][5]];
6265  ASubstrateEquGateMidNodeOffset = jacLIDVec[map[3]][map2[3][6]];
6266 
6267  AExtBodyEquExtBodyNodeOffset = jacLIDVec[map[4]][map2[4][0]];
6268  AExtBodyEquBodyNodeOffset = jacLIDVec[map[4]][map2[4][1]];
6269 
6270  ATemperatureEquSubstrateNodeOffset = jacLIDVec[map[5]][map2[5][0]];
6271  ATemperatureEquTemperatureNodeOffset = jacLIDVec[map[5]][map2[5][1]];
6272  ATemperatureEquBodyNodeOffset = jacLIDVec[map[5]][map2[5][2]];
6273  ATemperatureEquDrainPrimeNodeOffset = jacLIDVec[map[5]][map2[5][3]];
6274  ATemperatureEquSourcePrimeNodeOffset = jacLIDVec[map[5]][map2[5][4]];
6275  ATemperatureEquGatePrimeNodeOffset = jacLIDVec[map[5]][map2[5][5]];
6276 
6277  ABodyEquSubstrateNodeOffset = jacLIDVec[map[6]][map2[6][0]];
6278  ABodyEquExtBodyNodeOffset = jacLIDVec[map[6]][map2[6][1]];
6279  ABodyEquTemperatureNodeOffset = jacLIDVec[map[6]][map2[6][2]];
6280  ABodyEquBodyNodeOffset = jacLIDVec[map[6]][map2[6][3]];
6281  ABodyEquDrainPrimeNodeOffset = jacLIDVec[map[6]][map2[6][4]];
6282  ABodyEquSourcePrimeNodeOffset = jacLIDVec[map[6]][map2[6][5]];
6283  ABodyEquGatePrimeNodeOffset = jacLIDVec[map[6]][map2[6][6]];
6284 
6285  ADrainPrimeEquDrainNodeOffset = jacLIDVec[map[7]][map2[7][0]];
6286  ADrainPrimeEquSubstrateNodeOffset = jacLIDVec[map[7]][map2[7][1]];
6287  ADrainPrimeEquTemperatureNodeOffset = jacLIDVec[map[7]][map2[7][2]];
6288  ADrainPrimeEquBodyNodeOffset = jacLIDVec[map[7]][map2[7][3]];
6289  ADrainPrimeEquDrainPrimeNodeOffset = jacLIDVec[map[7]][map2[7][4]];
6290  ADrainPrimeEquSourcePrimeNodeOffset = jacLIDVec[map[7]][map2[7][5]];
6291  ADrainPrimeEquGatePrimeNodeOffset = jacLIDVec[map[7]][map2[7][6]];
6292  ADrainPrimeEquGateMidNodeOffset = jacLIDVec[map[7]][map2[7][7]];
6293 
6294  ASourcePrimeEquSourceNodeOffset = jacLIDVec[map[8]][map2[8][0]];
6295  ASourcePrimeEquSubstrateNodeOffset = jacLIDVec[map[8]][map2[8][1]];
6296  ASourcePrimeEquTemperatureNodeOffset = jacLIDVec[map[8]][map2[8][2]];
6297  ASourcePrimeEquBodyNodeOffset = jacLIDVec[map[8]][map2[8][3]];
6298  ASourcePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[8]][map2[8][4]];
6299  ASourcePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[8]][map2[8][5]];
6300  ASourcePrimeEquGatePrimeNodeOffset = jacLIDVec[map[8]][map2[8][6]];
6301  ASourcePrimeEquGateMidNodeOffset = jacLIDVec[map[8]][map2[8][7]];
6302 
6303  AGatePrimeEquGateNodeOffset = jacLIDVec[map[9]][map2[9][0]];
6304  AGatePrimeEquSubstrateNodeOffset = jacLIDVec[map[9]][map2[9][1]];
6305  AGatePrimeEquTemperatureNodeOffset = jacLIDVec[map[9]][map2[9][2]];
6306  AGatePrimeEquBodyNodeOffset = jacLIDVec[map[9]][map2[9][3]];
6307  AGatePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[9]][map2[9][4]];
6308  AGatePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[9]][map2[9][5]];
6309  AGatePrimeEquGatePrimeNodeOffset = jacLIDVec[map[9]][map2[9][6]];
6310  AGatePrimeEquGateMidNodeOffset = jacLIDVec[map[9]][map2[9][7]];
6311 
6312  AGateMidEquGateNodeOffset = jacLIDVec[map[10]][map2[10][0]];
6313  AGateMidEquSubstrateNodeOffset = jacLIDVec[map[10]][map2[10][1]];
6314  AGateMidEquBodyNodeOffset = jacLIDVec[map[10]][map2[10][2]];
6315  AGateMidEquDrainPrimeNodeOffset = jacLIDVec[map[10]][map2[10][3]];
6316  AGateMidEquSourcePrimeNodeOffset = jacLIDVec[map[10]][map2[10][4]];
6317  AGateMidEquGatePrimeNodeOffset = jacLIDVec[map[10]][map2[10][5]];
6318  AGateMidEquGateMidNodeOffset = jacLIDVec[map[10]][map2[10][6]];
6319 
6320  lastDrainIndex = 1;
6321  lastGateIndex = 5;
6322  lastBodyIndex = 6;
6323  lastSourceIndex = 1;
6324  lastSubstrateIndex = 6;
6325  lastExtBodyIndex = 1;
6326  lastRowUsed = 10;
6327  }
6328  else if (jacID >= 84 && jacID < 96)
6329  {
6330  ADrainEquDrainNodeOffset = jacLIDVec[map[0]][map2[0][0]];
6331  ADrainEquDrainPrimeNodeOffset = jacLIDVec[map[0]][map2[0][1]];
6332 
6333  AGateEquGateNodeOffset = jacLIDVec[map[1]][map2[1][0]];
6334  AGateEquBodyNodeOffset = jacLIDVec[map[1]][map2[1][1]];
6335  AGateEquDrainPrimeNodeOffset = jacLIDVec[map[1]][map2[1][2]];
6336  AGateEquSourcePrimeNodeOffset = jacLIDVec[map[1]][map2[1][3]];
6337  AGateEquGatePrimeNodeOffset = jacLIDVec[map[1]][map2[1][4]];
6338  AGateEquGateMidNodeOffset = jacLIDVec[map[1]][map2[1][5]];
6339 
6340  ASourceEquSourceNodeOffset = jacLIDVec[map[2]][map2[2][0]];
6341  ASourceEquSourcePrimeNodeOffset = jacLIDVec[map[2]][map2[2][1]];
6342 
6343  ASubstrateEquSubstrateNodeOffset = jacLIDVec[map[3]][map2[3][0]];
6344  ASubstrateEquTemperatureNodeOffset = jacLIDVec[map[3]][map2[3][1]];
6345  ASubstrateEquBodyNodeOffset = jacLIDVec[map[3]][map2[3][2]];
6346  ASubstrateEquDrainPrimeNodeOffset = jacLIDVec[map[3]][map2[3][3]];
6347  ASubstrateEquSourcePrimeNodeOffset = jacLIDVec[map[3]][map2[3][4]];
6348  ASubstrateEquGatePrimeNodeOffset = jacLIDVec[map[3]][map2[3][5]];
6349  ASubstrateEquGateMidNodeOffset = jacLIDVec[map[3]][map2[3][6]];
6350 
6351  ATemperatureEquSubstrateNodeOffset = jacLIDVec[map[4]][map2[4][0]];
6352  ATemperatureEquTemperatureNodeOffset = jacLIDVec[map[4]][map2[4][1]];
6353  ATemperatureEquBodyNodeOffset = jacLIDVec[map[4]][map2[4][2]];
6354  ATemperatureEquDrainPrimeNodeOffset = jacLIDVec[map[4]][map2[4][3]];
6355  ATemperatureEquSourcePrimeNodeOffset = jacLIDVec[map[4]][map2[4][4]];
6356  ATemperatureEquGatePrimeNodeOffset = jacLIDVec[map[4]][map2[4][5]];
6357 
6358  ABodyEquSubstrateNodeOffset = jacLIDVec[map[5]][map2[5][0]];
6359  ABodyEquTemperatureNodeOffset = jacLIDVec[map[5]][map2[5][1]];
6360  ABodyEquBodyNodeOffset = jacLIDVec[map[5]][map2[5][2]];
6361 
6362  ABodyEquExtBodyNodeOffset = jacLIDVec[map[5]][map2[5][3]];
6363  ABodyEquDrainPrimeNodeOffset = jacLIDVec[map[5]][map2[5][4]];
6364  ABodyEquSourcePrimeNodeOffset = jacLIDVec[map[5]][map2[5][5]];
6365  ABodyEquGatePrimeNodeOffset = jacLIDVec[map[5]][map2[5][6]];
6366 
6367  AExtBodyEquBodyNodeOffset = jacLIDVec[map[6]][map2[6][0]];
6368  AExtBodyEquExtBodyNodeOffset = jacLIDVec[map[6]][map2[6][1]];
6369 
6370  ADrainPrimeEquDrainNodeOffset = jacLIDVec[map[7]][map2[7][0]];
6371  ADrainPrimeEquSubstrateNodeOffset = jacLIDVec[map[7]][map2[7][1]];
6372  ADrainPrimeEquTemperatureNodeOffset = jacLIDVec[map[7]][map2[7][2]];
6373  ADrainPrimeEquBodyNodeOffset = jacLIDVec[map[7]][map2[7][3]];
6374  ADrainPrimeEquDrainPrimeNodeOffset = jacLIDVec[map[7]][map2[7][4]];
6375  ADrainPrimeEquSourcePrimeNodeOffset = jacLIDVec[map[7]][map2[7][5]];
6376  ADrainPrimeEquGatePrimeNodeOffset = jacLIDVec[map[7]][map2[7][6]];
6377  ADrainPrimeEquGateMidNodeOffset = jacLIDVec[map[7]][map2[7][7]];
6378 
6379  ASourcePrimeEquSourceNodeOffset = jacLIDVec[map[8]][map2[8][0]];
6380  ASourcePrimeEquSubstrateNodeOffset = jacLIDVec[map[8]][map2[8][1]];
6381  ASourcePrimeEquTemperatureNodeOffset = jacLIDVec[map[8]][map2[8][2]];
6382  ASourcePrimeEquBodyNodeOffset = jacLIDVec[map[8]][map2[8][3]];
6383  ASourcePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[8]][map2[8][4]];
6384  ASourcePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[8]][map2[8][5]];
6385  ASourcePrimeEquGatePrimeNodeOffset = jacLIDVec[map[8]][map2[8][6]];
6386  ASourcePrimeEquGateMidNodeOffset = jacLIDVec[map[8]][map2[8][7]];
6387 
6388  AGatePrimeEquGateNodeOffset = jacLIDVec[map[9]][map2[9][0]];
6389  AGatePrimeEquSubstrateNodeOffset = jacLIDVec[map[9]][map2[9][1]];
6390  AGatePrimeEquTemperatureNodeOffset = jacLIDVec[map[9]][map2[9][2]];
6391  AGatePrimeEquBodyNodeOffset = jacLIDVec[map[9]][map2[9][3]];
6392  AGatePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[9]][map2[9][4]];
6393  AGatePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[9]][map2[9][5]];
6394  AGatePrimeEquGatePrimeNodeOffset = jacLIDVec[map[9]][map2[9][6]];
6395  AGatePrimeEquGateMidNodeOffset = jacLIDVec[map[9]][map2[9][7]];
6396 
6397  AGateMidEquGateNodeOffset = jacLIDVec[map[10]][map2[10][0]];
6398  AGateMidEquSubstrateNodeOffset = jacLIDVec[map[10]][map2[10][1]];
6399  AGateMidEquBodyNodeOffset = jacLIDVec[map[10]][map2[10][2]];
6400  AGateMidEquDrainPrimeNodeOffset = jacLIDVec[map[10]][map2[10][3]];
6401  AGateMidEquSourcePrimeNodeOffset = jacLIDVec[map[10]][map2[10][4]];
6402  AGateMidEquGatePrimeNodeOffset = jacLIDVec[map[10]][map2[10][5]];
6403  AGateMidEquGateMidNodeOffset = jacLIDVec[map[10]][map2[10][6]];
6404 
6405  lastDrainIndex = 1;
6406  lastGateIndex = 5;
6407  lastBodyIndex = 6;
6408  lastSourceIndex = 1;
6409  lastSubstrateIndex = 6;
6410  lastExtBodyIndex = 1;
6411  lastRowUsed = 10;
6412  }
6413  else
6414  {
6415  std::string msg = "Instance::registerJacLIDs:";
6416  msg += "jacID out of supported range";
6417  N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, msg);
6418  }
6419 
6420  int extraVars = 0;
6421  if( icVDSGiven )
6422  {
6423  ++extraVars;
6424  ADrainEquIdsOffset = jacLIDVec[map[0]][map2[0][lastDrainIndex+1]];
6425  ASourceEquIdsOffset = jacLIDVec[map[2]][map2[2][lastSourceIndex+extraVars]];;
6426  icVDSEquVdOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][0]];
6427  icVDSEquVsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][1]];
6428  icVDSEquIdsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][2]];
6429  }
6430  if( icVGSGiven )
6431  {
6432  ++extraVars;
6433  AGateEquIgsOffset = jacLIDVec[map[1]][map2[1][lastGateIndex+1]];
6434  ASourceEquIgsOffset = jacLIDVec[map[2]][map2[2][lastSourceIndex+extraVars]];
6435  icVGSEquVgOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][0]];
6436  icVGSEquVsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][1]];
6437  icVGSEquIgsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][2]];
6438  }
6439  if( icVBSGiven )
6440  {
6441  ++extraVars;
6442  ABodyEquIbsOffset = jacLIDVec[map[5]][map2[5][lastBodyIndex+1]];
6443  ASourceEquIbsOffset = jacLIDVec[map[2]][map2[2][lastSourceIndex+extraVars]];
6444  icVBSEquVbOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][0]];
6445  icVBSEquVsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][1]];
6446  icVBSEquIbsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][2]];
6447  }
6448  if( icVESGiven )
6449  {
6450  ++extraVars;
6451  ASubstrateEquIesOffset = jacLIDVec[map[3]][map2[3][lastSubstrateIndex+1]];
6452  ASourceEquIesOffset = jacLIDVec[map[2]][map2[2][lastSourceIndex+extraVars]];
6453  icVESEquVeOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][0]];
6454  icVESEquVsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][1]];
6455  icVESEquIesOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][2]];
6456  }
6457  if( icVPSGiven )
6458  {
6459  ++extraVars;
6460  AExtBodyEquIpsOffset = jacLIDVec[map[4]][map2[4][lastExtBodyIndex+1]];
6461  ASourceEquIpsOffset = jacLIDVec[map[2]][map2[2][lastSourceIndex+extraVars]];
6462  icVPSEquVpOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][0]];
6463  icVPSEquVsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][1]];
6464  icVPSEquIpsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][2]];
6465  }
6466 
6467 }
6468 
6469 //-----------------------------------------------------------------------------
6470 // Function : Instance::setupPointers
6471 // Purpose :
6472 // Special Notes :
6473 // Scope : public
6474 // Creator : Eric Keiter, SNL
6475 // Creation Date : 01/07/09
6476 //-----------------------------------------------------------------------------
6478 {
6479 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
6480  N_LAS_Matrix & dFdx = *(extData.dFdxMatrixPtr);
6481  N_LAS_Matrix & dQdx = *(extData.dQdxMatrixPtr);
6482 
6483  // F-matrix:
6484  if (rgateMod == 1)
6485  {
6489  // It seems that this should be here, but it shouldn't.
6490  // The mi.geltd term is added into the G'-G' element later down in this
6491  // routine
6492  //
6493  // f_GatePrime][AGatePrimeEquGatePrimeNodePtr = &(dFdx[li_GatePrime][AGatePrimeEquGatePrimeNodeOffset]);
6494  }
6495  else if (rgateMod == 2)
6496  {
6502  if (soiMod != 2)
6504  }
6505  else if (rgateMod == 3)
6506  {
6514 
6515  if (soiMod != 2)
6516  {
6518  }
6519 
6521  }
6522  if (soiMod != 0)
6523  {
6526  if (soiMod != 2)
6527  {
6530  }
6531  }
6532 
6533  if (soiMod != 2)
6534  {
6535  if (rgateMod == 0 || rgateMod == 1)
6536  {
6538  }
6539  else
6540  {
6542  }
6550  }
6551  if (rgateMod == 0)
6552  {
6556  }
6557  else if (rgateMod == 1)
6558  {
6562  }
6563  else
6564  {
6568  }
6581  if (bodyMod == 1)
6582  {
6586  }
6587  if (selfheat)
6588  {
6591 
6597  if (soiMod != 0)
6598  {
6600  }
6601  if (bNode > 0)
6602  {
6605  }
6606  }
6607  if( icVDSGiven )
6608  {
6609 
6610 
6615 
6616 
6617 
6619 
6620  }
6621 
6622  if( icVGSGiven )
6623  {
6624 
6625 
6630 
6631 
6632 
6634 
6635  }
6636 
6637  if( icVBSGiven )
6638  {
6639 
6640 
6645 
6646 
6647 
6649 
6650  }
6651 
6652  if( icVESGiven )
6653  {
6654 
6655 
6660 
6661 
6662 
6664 
6665  }
6666 
6667  if( icVPSGiven )
6668  {
6669 
6670 
6675 
6676 
6677 
6679 
6680  }
6681 
6682 
6683  // Q-matrix:
6684  if (rgateMod == 3)
6685  {
6688 
6691 
6693 
6696  }
6697 
6699 
6704  if (soiMod != 2)
6705  {
6707  if (rgateMod == 0 || rgateMod == 1)
6708  {
6710  }
6711  else
6712  {
6714  }
6722  }
6724  if (rgateMod == 0)
6725  {
6729  }
6730  else if (rgateMod == 1)
6731  {
6735  }
6736  else
6737  {
6741  }
6745 
6749 
6750  if (selfheat)
6751  {
6757 
6758  if (bNode > 0)
6759  {
6761  }
6762  }
6763 #endif
6764 }
6765 
6766 //-----------------------------------------------------------------------------
6767 // Function : Instance::updateTemperature
6768 // Purpose : This updates all the instance-owned paramters which
6769 // are temperature dependent.
6770 //
6771 // Special Notes :
6772 // Scope : public
6773 // Creator : Dave Shirley
6774 // Creation Date : 05/20/04
6775 //-----------------------------------------------------------------------------
6776 bool Instance::updateTemperature (const double & temp_tmp)
6777 {
6778 
6779 double tmp, tmp1, tmp2, T0, T1, T2, T3, T4, T5, Ldrn, Wdrn;
6780 double TempRatio, Inv_L, Inv_W, Inv_LW, Tnom;
6781 double SDphi, SDgamma;
6782 double tmp3, T7, Eg;
6783 
6784 #ifdef Xyce_DEBUG_DEVICE
6785  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
6786  {
6787  Xyce::dout() << std::endl << subsection_divider << std::endl;
6788  Xyce::dout() << "Instance::updateTemperature\n";
6789  Xyce::dout() << "name = " << getName() << std::endl;
6790  }
6791 #endif
6792 
6793  // first set the instance temperature to the new temperature:
6794  if (temp_tmp != -999.0) temp = temp_tmp;
6795 
6797  {
6798  // make sure interpolation doesn't take any resistance negative
6799  if (model_.sheetResistance < 0.0) model_.sheetResistance = 0.0;
6800  if (model_.rshg < 0.0) model_.rshg = 0.0;
6801 
6802  // some params may have changed during interpolation
6804  }
6805 
6806  Tnom = model_.tnom;
6807  TempRatio = temp/Tnom;
6808 
6809  vtm = CONSTKoverQ * temp;
6810  Eg = 1.16 - 7.02e-4 * temp * temp / (temp + 1108.0);
6811  ni = CONSTNi0 * (temp / CONSTREFTEMP) * sqrt(temp / CONSTREFTEMP)
6812  * exp(21.5565981 - Eg / (2.0 * vtm));
6813 
6815 
6816 #ifdef REUSE_PARAMPTR
6817  // This next block determines whether or not to use the model
6818  // size dependent parameters, or those of the instance. If we are
6819  // using the instance, we may have to allocate the structure.
6820 
6821  std::list<SizeDependParam*>::iterator it_dpL =
6822  model_.sizeDependParamList.begin();
6823  std::list<SizeDependParam*>::iterator end_dpL =
6825 
6826  paramPtr = NULL;
6827 
6828  for( ; it_dpL != end_dpL; ++it_dpL ) {
6829  if( (*it_dpL)->Length == l && (*it_dpL)->Width == w &&
6830  (*it_dpL)->Rth0 == rth0 && (*it_dpL)->Cth0 == cth0) {
6831  paramPtr = (*it_dpL);
6832  break;
6833  }
6834  }
6835 
6836  if ( paramPtr != NULL )
6837  {
6838  }
6839  else
6840  {
6841  paramPtr = new SizeDependParam ();
6842 
6843  model_.sizeDependParamList.push_back( paramPtr );
6844 #else
6845  if (paramPtr == static_cast<SizeDependParam *> (NULL))
6846  paramPtr = new SizeDependParam ();
6847 #endif
6848 
6849  paramPtr->referenceTemperature = temp_tmp;
6850 
6851  Ldrn = l;
6852  Wdrn = w;
6853  paramPtr->Length = Ldrn;
6854  paramPtr->Width = Wdrn;
6855  paramPtr->Rth0 = rth0;
6856  paramPtr->Cth0 = cth0;
6857 
6858  T0 = pow(Ldrn, model_.Lln);
6859  T1 = pow(Wdrn, model_.Lwn);
6860  tmp1 = model_.Ll / T0 + model_.Lw / T1
6861  + model_.Lwl / (T0 * T1);
6862  paramPtr->dl = model_.Lint + tmp1;
6863 
6864 // v2.2.3
6865  tmp1 = model_.Llc / T0 + model_.Lwc / T1
6866  + model_.Lwlc / (T0 * T1);
6867  paramPtr->dlc = model_.dlc + tmp1;
6868 
6869 // v3.0
6870  paramPtr->dlcig = model_.dlcig + tmp1;
6871 
6872 
6873  T2 = pow(Ldrn, model_.Wln);
6874  T3 = pow(Wdrn, model_.Wwn);
6875  tmp2 = model_.Wl / T2 + model_.Ww / T3
6876  + model_.Wwl / (T2 * T3);
6877  paramPtr->dw = model_.Wint + tmp2;
6878 
6879 // v2.2.3
6880  tmp2 = model_.Wlc / T2 + model_.Wwc / T3
6881  + model_.Wwlc / (T2 * T3);
6882  paramPtr->dwc = model_.dwc + tmp2;
6883 
6884 
6885  paramPtr->leff = l - 2.0 * paramPtr->dl;
6886  if (paramPtr->leff <= 0.0)
6887  {
6888  UserError0(*this) << "Effective channel length <= 0";
6889  }
6890 
6891  paramPtr->weff = w - nbc * model_.dwbc
6892  - (2.0 - nbc) * paramPtr->dw;
6893  if (paramPtr->weff <= 0.0)
6894  {
6895  UserError0(*this) << "Effective channel width <= 0";
6896  }
6897 
6900 
6901  paramPtr->leffCV = l - 2.0 * paramPtr->dlc;
6902  if (paramPtr->leffCV <= 0.0)
6903  {
6904  UserError0(*this) << "Effective channel length for C-V <= 0";
6905  }
6906 
6907  paramPtr->weffCV = w - nbc * model_.dwbc
6908  - (2.0 - nbc) * paramPtr->dwc;
6909  if (paramPtr->weffCV <= 0.0)
6910  {
6911  UserError0(*this) << "Effective channel width for C-V <= 0";
6912  }
6913 
6916 
6917  paramPtr->leffCVb = l - 2.0 * paramPtr->dlc - model_.dlcb;
6918  if (paramPtr->leffCVb <= 0.0)
6919  {
6920  UserError0(*this) << "Effective channel length for C-V (body) <= 0";
6921  }
6922 
6924  if (paramPtr->leffCVbg <= 0.0)
6925  {
6926  UserError0(*this) << "Effective channel length for C-V (backgate) <= 0";
6927  }
6928 
6929 
6930  /* Not binned - START */
6933  paramPtr->vbx = model_.vbx;
6934  paramPtr->vbm = model_.vbm;
6935  paramPtr->xt = model_.xt;
6936  /* Not binned - END */
6937 
6938  /* CV model */
6939  paramPtr->cf = model_.cf;
6940  paramPtr->clc = model_.clc;
6941  paramPtr->cle = model_.cle;
6942 
6943  paramPtr->abulkCVfactor = 1.0 + pow((paramPtr->clc / paramPtr->leff),
6944  paramPtr->cle);
6945 
6946  /* Added for binning - START */
6947  if (model_.binUnit == 1)
6948  { Inv_L = 1.0e-6 / paramPtr->leff;
6949  Inv_W = 1.0e-6 / paramPtr->weff;
6950  Inv_LW = 1.0e-12 / (paramPtr->leff
6951  * paramPtr->weff);
6952  }
6953  else
6954  { Inv_L = 1.0 / paramPtr->leff;
6955  Inv_W = 1.0 / paramPtr->weff;
6956  Inv_LW = 1.0 / (paramPtr->leff
6957  * paramPtr->weff);
6958  }
6960  + model_.lnpeak * Inv_L
6961  + model_.wnpeak * Inv_W
6962  + model_.pnpeak * Inv_LW;
6964  + model_.lnsub * Inv_L
6965  + model_.wnsub * Inv_W
6966  + model_.pnsub * Inv_LW;
6968  + model_.lngate * Inv_L
6969  + model_.wngate * Inv_W
6970  + model_.pngate * Inv_LW;
6972  + model_.lvth0 * Inv_L
6973  + model_.wvth0 * Inv_W
6974  + model_.pvth0 * Inv_LW;
6975  paramPtr->k1 = model_.k1
6976  + model_.lk1 * Inv_L
6977  + model_.wk1 * Inv_W
6978  + model_.pk1 * Inv_LW;
6979  paramPtr->k2 = model_.k2
6980  + model_.lk2 * Inv_L
6981  + model_.wk2 * Inv_W
6982  + model_.pk2 * Inv_LW;
6984  + model_.lk1w1 * Inv_L
6985  + model_.wk1w1 * Inv_W
6986  + model_.pk1w1 * Inv_LW;
6988  + model_.lk1w2 * Inv_L
6989  + model_.wk1w2 * Inv_W
6990  + model_.pk1w2 * Inv_LW;
6991  paramPtr->k3 = model_.k3
6992  + model_.lk3 * Inv_L
6993  + model_.wk3 * Inv_W
6994  + model_.pk3 * Inv_LW;
6995  paramPtr->k3b = model_.k3b
6996  + model_.lk3b * Inv_L
6997  + model_.wk3b * Inv_W
6998  + model_.pk3b * Inv_LW;
6999  paramPtr->kb1 = model_.kb1
7000  + model_.lkb1 * Inv_L
7001  + model_.wkb1 * Inv_W
7002  + model_.pkb1 * Inv_LW;
7003  paramPtr->w0 = model_.w0
7004  + model_.lw0 * Inv_L
7005  + model_.ww0 * Inv_W
7006  + model_.pw0 * Inv_LW;
7007  paramPtr->nlx = model_.nlx
7008  + model_.lnlx * Inv_L
7009  + model_.wnlx * Inv_W
7010  + model_.pnlx * Inv_LW;
7012  + model_.ldvt0 * Inv_L
7013  + model_.wdvt0 * Inv_W
7014  + model_.pdvt0 * Inv_LW;
7016  + model_.ldvt1 * Inv_L
7017  + model_.wdvt1 * Inv_W
7018  + model_.pdvt1 * Inv_LW;
7020  + model_.ldvt2 * Inv_L
7021  + model_.wdvt2 * Inv_W
7022  + model_.pdvt2 * Inv_LW;
7024  + model_.ldvt0w * Inv_L
7025  + model_.wdvt0w * Inv_W
7026  + model_.pdvt0w * Inv_LW;
7028  + model_.ldvt1w * Inv_L
7029  + model_.wdvt1w * Inv_W
7030  + model_.pdvt1w * Inv_LW;
7032  + model_.ldvt2w * Inv_L
7033  + model_.wdvt2w * Inv_W
7034  + model_.pdvt2w * Inv_LW;
7035  paramPtr->u0 = model_.u0
7036  + model_.lu0 * Inv_L
7037  + model_.wu0 * Inv_W
7038  + model_.pu0 * Inv_LW;
7039  paramPtr->ua = model_.ua
7040  + model_.lua * Inv_L
7041  + model_.wua * Inv_W
7042  + model_.pua * Inv_LW;
7043  paramPtr->ub = model_.ub
7044  + model_.lub * Inv_L
7045  + model_.wub * Inv_W
7046  + model_.pub * Inv_LW;
7047  paramPtr->uc = model_.uc
7048  + model_.luc * Inv_L
7049  + model_.wuc * Inv_W
7050  + model_.puc * Inv_LW;
7052  + model_.lvsat * Inv_L
7053  + model_.wvsat * Inv_W
7054  + model_.pvsat * Inv_LW;
7055  paramPtr->a0 = model_.a0
7056  + model_.la0 * Inv_L
7057  + model_.wa0 * Inv_W
7058  + model_.pa0 * Inv_LW;
7059  paramPtr->ags = model_.ags
7060  + model_.lags * Inv_L
7061  + model_.wags * Inv_W
7062  + model_.pags * Inv_LW;
7063  paramPtr->b0 = model_.b0
7064  + model_.lb0 * Inv_L
7065  + model_.wb0 * Inv_W
7066  + model_.pb0 * Inv_LW;
7067  paramPtr->b1 = model_.b1
7068  + model_.lb1 * Inv_L
7069  + model_.wb1 * Inv_W
7070  + model_.pb1 * Inv_LW;
7072  + model_.lketa * Inv_L
7073  + model_.wketa * Inv_W
7074  + model_.pketa * Inv_LW;
7076  + model_.lketas * Inv_L
7077  + model_.wketas * Inv_W
7078  + model_.pketas * Inv_LW;
7079  paramPtr->a1 = model_.a1
7080  + model_.la1 * Inv_L
7081  + model_.wa1 * Inv_W
7082  + model_.pa1 * Inv_LW;
7083  paramPtr->a2 = model_.a2
7084  + model_.la2 * Inv_L
7085  + model_.wa2 * Inv_W
7086  + model_.pa2 * Inv_LW;
7088  + model_.lrdsw * Inv_L
7089  + model_.wrdsw * Inv_W
7090  + model_.prdsw * Inv_LW;
7092  + model_.lprwb * Inv_L
7093  + model_.wprwb * Inv_W
7094  + model_.pprwb * Inv_LW;
7096  + model_.lprwg * Inv_L
7097  + model_.wprwg * Inv_W
7098  + model_.pprwg * Inv_LW;
7099  paramPtr->wr = model_.wr
7100  + model_.lwr * Inv_L
7101  + model_.wwr * Inv_W
7102  + model_.pwr * Inv_LW;
7104  + model_.lnfactor * Inv_L
7105  + model_.wnfactor * Inv_W
7106  + model_.pnfactor * Inv_LW;
7107  paramPtr->dwg = model_.dwg
7108  + model_.ldwg * Inv_L
7109  + model_.wdwg * Inv_W
7110  + model_.pdwg * Inv_LW;
7111  paramPtr->dwb = model_.dwb
7112  + model_.ldwb * Inv_L
7113  + model_.wdwb * Inv_W
7114  + model_.pdwb * Inv_LW;
7116  + model_.lvoff * Inv_L
7117  + model_.wvoff * Inv_W
7118  + model_.pvoff * Inv_LW;
7120  + model_.leta0 * Inv_L
7121  + model_.weta0 * Inv_W
7122  + model_.peta0 * Inv_LW;
7124  + model_.letab * Inv_L
7125  + model_.wetab * Inv_W
7126  + model_.petab * Inv_LW;
7128  + model_.ldsub * Inv_L
7129  + model_.wdsub * Inv_W
7130  + model_.pdsub * Inv_LW;
7131  paramPtr->cit = model_.cit
7132  + model_.lcit * Inv_L
7133  + model_.wcit * Inv_W
7134  + model_.pcit * Inv_LW;
7136  + model_.lcdsc * Inv_L
7137  + model_.wcdsc * Inv_W
7138  + model_.pcdsc * Inv_LW;
7140  + model_.lcdscb * Inv_L
7141  + model_.wcdscb * Inv_W
7142  + model_.pcdscb * Inv_LW;
7144  + model_.lcdscd * Inv_L
7145  + model_.wcdscd * Inv_W
7146  + model_.pcdscd * Inv_LW;
7148  + model_.lpclm * Inv_L
7149  + model_.wpclm * Inv_W
7150  + model_.ppclm * Inv_LW;
7152  + model_.lpdibl1 * Inv_L
7153  + model_.wpdibl1 * Inv_W
7154  + model_.ppdibl1 * Inv_LW;
7156  + model_.lpdibl2 * Inv_L
7157  + model_.wpdibl2 * Inv_W
7158  + model_.ppdibl2 * Inv_LW;
7160  + model_.lpdiblb * Inv_L
7161  + model_.wpdiblb * Inv_W
7162  + model_.ppdiblb * Inv_LW;
7164  + model_.ldrout * Inv_L
7165  + model_.wdrout * Inv_W
7166  + model_.pdrout * Inv_LW;
7168  + model_.lpvag * Inv_L
7169  + model_.wpvag * Inv_W
7170  + model_.ppvag * Inv_LW;
7172  + model_.ldelta * Inv_L
7173  + model_.wdelta * Inv_W
7174  + model_.pdelta * Inv_LW;
7176  + model_.lalpha0 * Inv_L
7177  + model_.walpha0 * Inv_W
7178  + model_.palpha0 * Inv_LW;
7180  + model_.lfbjtii * Inv_L
7181  + model_.wfbjtii * Inv_W
7182  + model_.pfbjtii * Inv_LW;
7184  + model_.lbeta0 * Inv_L
7185  + model_.wbeta0 * Inv_W
7186  + model_.pbeta0 * Inv_LW;
7188  + model_.lbeta1 * Inv_L
7189  + model_.wbeta1 * Inv_W
7190  + model_.pbeta1 * Inv_LW;
7192  + model_.lbeta2 * Inv_L
7193  + model_.wbeta2 * Inv_W
7194  + model_.pbeta2 * Inv_LW;
7196  + model_.lvdsatii0 * Inv_L
7197  + model_.wvdsatii0 * Inv_W
7198  + model_.pvdsatii0 * Inv_LW;
7199  paramPtr->lii = model_.lii
7200  + model_.llii * Inv_L
7201  + model_.wlii * Inv_W
7202  + model_.plii * Inv_LW;
7204  + model_.lesatii * Inv_L
7205  + model_.wesatii * Inv_W
7206  + model_.pesatii * Inv_LW;
7208  + model_.lsii0 * Inv_L
7209  + model_.wsii0 * Inv_W
7210  + model_.psii0 * Inv_LW;
7212  + model_.lsii1 * Inv_L
7213  + model_.wsii1 * Inv_W
7214  + model_.psii1 * Inv_LW;
7216  + model_.lsii2 * Inv_L
7217  + model_.wsii2 * Inv_W
7218  + model_.psii2 * Inv_LW;
7220  + model_.lsiid * Inv_L
7221  + model_.wsiid * Inv_W
7222  + model_.psiid * Inv_LW;
7224  + model_.lagidl * Inv_L
7225  + model_.wagidl * Inv_W
7226  + model_.pagidl * Inv_LW;
7228  + model_.lbgidl * Inv_L
7229  + model_.wbgidl * Inv_W
7230  + model_.pbgidl * Inv_LW;
7232  + model_.lngidl * Inv_L
7233  + model_.wngidl * Inv_W
7234  + model_.pngidl * Inv_LW;
7236  + model_.lntun * Inv_L
7237  + model_.wntun * Inv_W
7238  + model_.pntun * Inv_LW;
7240  + model_.lndiode * Inv_L
7241  + model_.wndiode * Inv_W
7242  + model_.pndiode * Inv_LW;
7244  + model_.lnrecf0 * Inv_L
7245  + model_.wnrecf0 * Inv_W
7246  + model_.pnrecf0 * Inv_LW;
7248  + model_.lnrecr0 * Inv_L
7249  + model_.wnrecr0 * Inv_W
7250  + model_.pnrecr0 * Inv_LW;
7252  + model_.lisbjt * Inv_L
7253  + model_.wisbjt * Inv_W
7254  + model_.pisbjt * Inv_LW;
7256  + model_.lisdif * Inv_L
7257  + model_.wisdif * Inv_W
7258  + model_.pisdif * Inv_LW;
7260  + model_.lisrec * Inv_L
7261  + model_.wisrec * Inv_W
7262  + model_.pisrec * Inv_LW;
7264  + model_.listun * Inv_L
7265  + model_.wistun * Inv_W
7266  + model_.pistun * Inv_LW;
7268  + model_.lvrec0 * Inv_L
7269  + model_.wvrec0 * Inv_W
7270  + model_.pvrec0 * Inv_LW;
7272  + model_.lvtun0 * Inv_L
7273  + model_.wvtun0 * Inv_W
7274  + model_.pvtun0 * Inv_LW;
7276  + model_.lnbjt * Inv_L
7277  + model_.wnbjt * Inv_W
7278  + model_.pnbjt * Inv_LW;
7280  + model_.llbjt0 * Inv_L
7281  + model_.wlbjt0 * Inv_W
7282  + model_.plbjt0 * Inv_LW;
7284  + model_.lvabjt * Inv_L
7285  + model_.wvabjt * Inv_W
7286  + model_.pvabjt * Inv_LW;
7288  + model_.laely * Inv_L
7289  + model_.waely * Inv_W
7290  + model_.paely * Inv_LW;
7292  + model_.lahli * Inv_L
7293  + model_.wahli * Inv_W
7294  + model_.pahli * Inv_LW;
7295 
7296 
7297  paramPtr->xj = model_.xj
7298  + model_.lxj * Inv_L
7299  + model_.wxj * Inv_W
7300  + model_.pxj * Inv_LW;
7302  + model_.lalphaGB1 * Inv_L
7303  + model_.walphaGB1 * Inv_W
7304  + model_.palphaGB1 * Inv_LW;
7306  + model_.lalphaGB2 * Inv_L
7307  + model_.walphaGB2 * Inv_W
7308  + model_.palphaGB2 * Inv_LW;
7310  + model_.lbetaGB1* Inv_L
7311  + model_.wbetaGB1 * Inv_W
7312  + model_.pbetaGB1 * Inv_LW;
7314  + model_.lbetaGB2 * Inv_L
7315  + model_.wbetaGB2 * Inv_W
7316  + model_.pbetaGB2 * Inv_LW;
7318  + model_.lndif * Inv_L
7319  + model_.wndif * Inv_W
7320  + model_.pndif * Inv_LW;
7322  + model_.lntrecf* Inv_L
7323  + model_.wntrecf * Inv_W
7324  + model_.pntrecf * Inv_LW;
7326  + model_.lntrecr * Inv_L
7327  + model_.wntrecr * Inv_W
7328  + model_.pntrecr * Inv_LW;
7330  + model_.lxbjt * Inv_L
7331  + model_.wxbjt * Inv_W
7332  + model_.pxbjt * Inv_LW;
7334  + model_.lxdif* Inv_L
7335  + model_.wxdif * Inv_W
7336  + model_.pxdif * Inv_LW;
7338  + model_.lxrec * Inv_L
7339  + model_.wxrec * Inv_W
7340  + model_.pxrec * Inv_LW;
7342  + model_.lxtun * Inv_L
7343  + model_.wxtun * Inv_W
7344  + model_.pxtun * Inv_LW;
7346  + model_.lcgdl * Inv_L
7347  + model_.wcgdl * Inv_W
7348  + model_.pcgdl * Inv_LW;
7350  + model_.lcgsl * Inv_L
7351  + model_.wcgsl * Inv_W
7352  + model_.pcgsl * Inv_LW;
7354  + model_.lckappa * Inv_L
7355  + model_.wckappa * Inv_W
7356  + model_.pckappa * Inv_LW;
7357  paramPtr->ute = model_.ute
7358  + model_.lute * Inv_L
7359  + model_.wute * Inv_W
7360  + model_.pute * Inv_LW;
7361  paramPtr->kt1 = model_.kt1
7362  + model_.lkt1 * Inv_L
7363  + model_.wkt1 * Inv_W
7364  + model_.pkt1 * Inv_LW;
7365  paramPtr->kt2 = model_.kt2
7366  + model_.lkt2 * Inv_L
7367  + model_.wkt2 * Inv_W
7368  + model_.pkt2 * Inv_LW;
7370  + model_.lkt1l * Inv_L
7371  + model_.wkt1l * Inv_W
7372  + model_.pkt1l * Inv_LW;
7373  paramPtr->ua1 = model_.ua1
7374  + model_.lua1 * Inv_L
7375  + model_.wua1 * Inv_W
7376  + model_.pua1 * Inv_LW;
7377  paramPtr->ub1 = model_.ub1
7378  + model_.lub1* Inv_L
7379  + model_.wub1 * Inv_W
7380  + model_.pub1 * Inv_LW;
7381  paramPtr->uc1 = model_.uc1
7382  + model_.luc1 * Inv_L
7383  + model_.wuc1 * Inv_W
7384  + model_.puc1 * Inv_LW;
7385  paramPtr->at = model_.at
7386  + model_.lat * Inv_L
7387  + model_.wat * Inv_W
7388  + model_.pat * Inv_LW;
7389  paramPtr->prt = model_.prt
7390  + model_.lprt * Inv_L
7391  + model_.wprt * Inv_W
7392  + model_.pprt * Inv_LW;
7393 
7394 
7396  + model_.lnigc * Inv_L
7397  + model_.wnigc * Inv_W
7398  + model_.pnigc * Inv_LW;
7400  + model_.laigc * Inv_L
7401  + model_.waigc * Inv_W
7402  + model_.paigc * Inv_LW;
7404  + model_.lbigc * Inv_L
7405  + model_.wbigc * Inv_W
7406  + model_.pbigc * Inv_LW;
7408  + model_.lcigc * Inv_L
7409  + model_.wcigc * Inv_W
7410  + model_.pcigc * Inv_LW;
7412  + model_.laigsd * Inv_L
7413  + model_.waigsd * Inv_W
7414  + model_.paigsd * Inv_LW;
7416  + model_.lbigsd * Inv_L
7417  + model_.wbigsd * Inv_W
7418  + model_.pbigsd * Inv_LW;
7420  + model_.lcigsd * Inv_L
7421  + model_.wcigsd * Inv_W
7422  + model_.pcigsd * Inv_LW;
7424  + model_.lpigcd * Inv_L
7425  + model_.wpigcd * Inv_W
7426  + model_.ppigcd * Inv_LW;
7428  + model_.lpoxedge * Inv_L
7429  + model_.wpoxedge * Inv_W
7430  + model_.ppoxedge * Inv_LW;
7431 // v3.0
7432 
7433 // v3.1 wanh added for RF
7435  + model_.lxrcrg1 * Inv_L
7436  + model_.wxrcrg1 * Inv_W
7437  + model_.pxrcrg1 * Inv_LW;
7439  + model_.lxrcrg2 * Inv_L
7440  + model_.wxrcrg2 * Inv_W
7441  + model_.pxrcrg2 * Inv_LW;
7442 // v3.1 wanh added for RF end
7443 
7444 
7445  // CV model
7447  + model_.lvsdfb * Inv_L
7448  + model_.wvsdfb * Inv_W
7449  + model_.pvsdfb * Inv_LW;
7451  + model_.lvsdth * Inv_L
7452  + model_.wvsdth * Inv_W
7453  + model_.pvsdth * Inv_LW;
7455  + model_.ldelvt * Inv_L
7456  + model_.wdelvt * Inv_W
7457  + model_.pdelvt * Inv_LW;
7459  + model_.lacde * Inv_L
7460  + model_.wacde * Inv_W
7461  + model_.pacde * Inv_LW;
7462  paramPtr->acde = paramPtr->acde *
7463  pow((paramPtr->npeak / 2.0e16), -0.25);
7464  // v3.2 bug fix
7465 
7467  + model_.lmoin * Inv_L
7468  + model_.wmoin * Inv_W
7469  + model_.pmoin * Inv_LW;
7471  + model_.lnoff * Inv_L
7472  + model_.wnoff * Inv_W
7473  + model_.pnoff * Inv_LW; // v3.2
7474  /* Added for binning - END */
7475 
7476  T0 = (TempRatio - 1.0);
7477 
7478  paramPtr->uatemp = paramPtr->ua; /* save ua, ub, and uc for b3soild.c */
7479  paramPtr->ubtemp = paramPtr->ub;
7480  paramPtr->uctemp = paramPtr->uc;
7481  paramPtr->rds0denom = pow(paramPtr->weff * 1E6, paramPtr->wr);
7482 
7483 
7484 /* v2.2 release */
7486  * nseg;
7488  / nseg;
7489 
7490 /* v2.2.2 adding layout-dependent Frbody multiplier */
7492  / (2 * model_.rbody + model_.rhalo * paramPtr->leff)
7493  * paramPtr->weff / nseg;
7494 
7496  model_.ntox) /
7498 /* v2.2 release */
7499 
7500 
7501  paramPtr->ua = paramPtr->ua + paramPtr->ua1 * T0;
7502  paramPtr->ub = paramPtr->ub + paramPtr->ub1 * T0;
7503  paramPtr->uc = paramPtr->uc + paramPtr->uc1 * T0;
7504  if (paramPtr->u0 > 1.0)
7505  paramPtr->u0 = paramPtr->u0 / 1.0e4;
7506 
7508  * pow(TempRatio, paramPtr->ute);
7510  * T0;
7511  paramPtr->rds0 = (paramPtr->rdsw + paramPtr->prt * T0)
7512  / pow(paramPtr->weff * 1E6, paramPtr->wr);
7513 
7514  if (!checkModel ())
7515  {
7516  UserError0(*this) << "Problem detected during B3SOIV3 parameter check";
7517  }
7518 
7520  * paramPtr->wdiodCV;
7522  * paramPtr->wdiosCV;
7523 
7525  * paramPtr->leffCV;
7526 
7527 
7529  { T0 = paramPtr->gamma1 * model_.cox;
7530  paramPtr->npeak = 3.021E22 * T0 * T0;
7531  }
7532 
7533 
7534  T4 = CONSTEg300 / vtm * (TempRatio - 1.0);
7535  T7 = paramPtr->xbjt * T4 / paramPtr->ndiode;
7536  DEXP(T7, T0);
7537  T7 = paramPtr->xdif * T4 / paramPtr->ndiode;
7538  DEXP(T7, T1);
7539  T7 = paramPtr->xrec * T4 / paramPtr->nrecf0;
7540  DEXP(T7, T2);
7541 
7542  /* v2.2.2 bug fix */
7543  paramPtr->ahli0 = paramPtr->ahli * T0;
7544 
7545  paramPtr->jbjt = paramPtr->isbjt * T0;
7546  paramPtr->jdif = paramPtr->isdif * T1;
7547  paramPtr->jrec = paramPtr->isrec * T2;
7548 
7549  T7 = paramPtr->xtun * (TempRatio - 1);
7550  DEXP(T7, T0);
7551  paramPtr->jtun = paramPtr->istun * T0;
7552 
7553 
7554  if (paramPtr->nsub > 0)
7555  paramPtr->vfbb = -model_.dtype * vtm *
7556  log(paramPtr->npeak/ paramPtr->nsub);
7557  else
7558  paramPtr->vfbb = -model_.dtype * vtm *
7559  log(-paramPtr->npeak* paramPtr->nsub/
7560  (ni*ni));
7561 
7562  if (!model_.vsdfbGiven)
7563  {
7564  if (paramPtr->nsub > 0)
7565  paramPtr->vsdfb = -model_.dtype * (vtm*log(1e20 *
7566  paramPtr->nsub /
7567  (ni*ni)) - 0.3);
7568  else if (paramPtr->nsub < 0)
7569  paramPtr->vsdfb = -model_.dtype * (vtm*log(-1e20 /
7570  paramPtr->nsub) + 0.3);
7571  }
7572 
7573  /* Phi & Gamma */
7574  SDphi = 2.0*vtm*log(fabs(paramPtr->nsub) / ni);
7575  SDgamma = 5.753e-12 * sqrt(fabs(paramPtr->nsub)) / model_.cbox;
7576 
7577  if (!model_.vsdthGiven)
7578  {
7579  if ( ((paramPtr->nsub > 0) && (model_.dtype > 0)) ||
7580  ((paramPtr->nsub < 0) && (model_.dtype < 0)) )
7581  paramPtr->vsdth = paramPtr->vsdfb + SDphi +
7582  SDgamma * sqrt(SDphi);
7583  else
7584  paramPtr->vsdth = paramPtr->vsdfb - SDphi -
7585  SDgamma * sqrt(SDphi);
7586  }
7587 
7588  if (!model_.csdminGiven)
7589  {
7590  /* Cdmin */
7591  tmp = sqrt(2.0 * CONSTEPSSI * SDphi / (CONSTQ *
7592  fabs(paramPtr->nsub) * 1.0e6));
7593  tmp1 = CONSTEPSSI / tmp;
7594  model_.csdmin = tmp1 * model_.cbox /
7595  (tmp1 + model_.cbox);
7596  }
7597 
7598 
7599  paramPtr->phi = 2.0 * vtm * log(paramPtr->npeak / ni);
7600 
7601  paramPtr->sqrtPhi = sqrt(paramPtr->phi);
7603 
7604  paramPtr->Xdep0 = sqrt(2.0 * CONSTEPSSI / (CONSTQ
7605  * paramPtr->npeak * 1.0e6))
7606  * paramPtr->sqrtPhi;
7607  paramPtr->sqrtXdep0 = sqrt(paramPtr->Xdep0);
7608  paramPtr->litl = sqrt(3.0 * paramPtr->xj
7609  * model_.tox);
7610  paramPtr->vbi = vtm * log(1.0e20
7611  * paramPtr->npeak / (ni*ni));
7612  paramPtr->cdep0 = sqrt(CONSTQ * CONSTEPSSI
7613  * paramPtr->npeak * 1.0e6 / 2.0
7614  / paramPtr->phi);
7615 
7616 // v3.0
7617  if (paramPtr->ngate > 0.0)
7618  { paramPtr->vfbsd = model_.Vtm0 * log(paramPtr->ngate
7619  / 1.0e20);
7620  }
7621  else
7622  paramPtr->vfbsd = 0.0;
7623 
7624  paramPtr->ToxRatio = exp(model_.ntox
7625  * log(model_.toxref /model_.toxqm))
7628  * log(model_.toxref
7629  / (model_.toxqm * paramPtr->poxedge)))
7630  / model_.toxqm / model_.toxqm
7632  paramPtr->Aechvb = (model_.dtype==CONSTNMOS)?4.97232e-7:3.42537e-7;
7633  paramPtr->Bechvb = (model_.dtype==CONSTNMOS)?7.45669e11:1.16645e12;
7635  * paramPtr->dlcig * paramPtr->ToxRatioEdge; // v3.1 bug fix
7639  * paramPtr->ToxRatio; // v3.1 bug fix
7640  paramPtr->Bechvb *= -model_.toxqm;
7641 // v3.0
7642 
7643  if (model_.k1Given || model_.k2Given)
7644  {
7645  if (!model_.k1Given)
7646  {
7647  UserWarning(*this) << "k1 should be specified with k2.";
7648 
7649  paramPtr->k1 = 0.53;
7650  }
7651  if (!model_.k2Given)
7652  {
7653  UserWarning(*this) << "k2 should be specified with k1.";
7654  paramPtr->k2 = -0.0186;
7655  }
7656  if (model_.xtGiven)
7657  {
7658  UserWarning(*this) << "xt is ignored because k1 or k2 is given.";
7659  }
7660  if (model_.vbxGiven)
7661  {
7662  UserWarning(*this) << "vbx is ignored because k1 or k2 is given.";
7663  }
7664  if (model_.vbmGiven)
7665  {
7666  UserWarning(*this) << "vbm is ignored because k1 or k2 is given.";
7667  }
7668  if (model_.gamma1Given)
7669  {
7670  UserWarning(*this) << "gamma1 ignored because k1 or k2 is given.";
7671  }
7672  if (model_.gamma2Given)
7673  {
7674  UserWarning(*this) << "gamma2 ignored because k1 or k2 is given.";
7675  }
7676  }
7677  else
7678  {
7679  if (!model_.vbxGiven)
7680  paramPtr->vbx = paramPtr->phi - 7.7348e-4
7681  * paramPtr->npeak
7682  * paramPtr->xt * paramPtr->xt;
7683  if (paramPtr->vbx > 0.0)
7684  paramPtr->vbx = -paramPtr->vbx;
7685  if (paramPtr->vbm > 0.0)
7686  paramPtr->vbm = -paramPtr->vbm;
7687 
7688  if (!model_.gamma1Given)
7689  paramPtr->gamma1 = 5.753e-12
7690  * sqrt(paramPtr->npeak)
7691  / model_.cox;
7692  if (!model_.gamma2Given)
7693  paramPtr->gamma2 = 5.753e-12
7694  * sqrt(paramPtr->nsub)
7695  / model_.cox;
7696 
7697  T0 = paramPtr->gamma1 - paramPtr->gamma2;
7698  T1 = sqrt(paramPtr->phi - paramPtr->vbx)
7699  - paramPtr->sqrtPhi;
7700  T2 = sqrt(paramPtr->phi * (paramPtr->phi
7701  - paramPtr->vbm)) - paramPtr->phi;
7702  paramPtr->k2 = T0 * T1 / (2.0 * T2 + paramPtr->vbm);
7703  paramPtr->k1 = paramPtr->gamma2 - 2.0
7704  * paramPtr->k2 * sqrt(paramPtr->phi
7705  - paramPtr->vbm);
7706  }
7707 
7708  if (paramPtr->k2 < 0.0)
7709  { T0 = 0.5 * paramPtr->k1 / paramPtr->k2;
7710  paramPtr->vbsc = 0.9 * (paramPtr->phi - T0 * T0);
7711  if (paramPtr->vbsc > -3.0)
7712  paramPtr->vbsc = -3.0;
7713  else if (paramPtr->vbsc < -30.0)
7714  paramPtr->vbsc = -30.0;
7715  }
7716  else
7717  { paramPtr->vbsc = -30.0;
7718  }
7719  if (paramPtr->vbsc > paramPtr->vbm)
7720  paramPtr->vbsc = paramPtr->vbm;
7721 
7722  if ((T0 = paramPtr->weff + paramPtr->k1w2) < 1e-8)
7723  T0 = 1e-8;
7724  paramPtr->k1eff = paramPtr->k1 * (1 + paramPtr->k1w1/T0);
7725 
7726  if (model_.vth0Given)
7728  - paramPtr->phi - paramPtr->k1eff
7729  * paramPtr->sqrtPhi;
7730  }
7731  else
7732  { paramPtr->vfb = -1.0;
7734  + paramPtr->phi + paramPtr->k1eff
7735  * paramPtr->sqrtPhi);
7736  }
7737 
7738 // v3.2
7740  paramPtr->k2 *= model_.tox / model_.toxm;
7741 
7742 
7743  T1 = sqrt(CONSTEPSSI / CONSTEPSOX * model_.tox
7744  * paramPtr->Xdep0);
7745  T0 = exp(-0.5 * paramPtr->dsub * paramPtr->leff / T1);
7746  paramPtr->theta0vb0 = (T0 + 2.0 * T0 * T0);
7747 
7748  T0 = exp(-0.5 * paramPtr->drout * paramPtr->leff / T1);
7749  T2 = (T0 + 2.0 * T0 * T0);
7751  + paramPtr->pdibl2;
7752 #ifdef REUSE_PARAMPTR
7753  }
7754 #endif
7755 
7760 
7761  if ( ((paramPtr->nsub > 0) && (model_.dtype > 0)) ||
7762  ((paramPtr->nsub < 0) && (model_.dtype < 0)) )
7763  {
7764  T0 = paramPtr->vsdth - paramPtr->vsdfb;
7765  paramPtr->sdt1 = paramPtr->vsdfb + model_.asd * T0;
7766  T1 = csbox - csmin;
7767  T2 = T1 / T0 / T0;
7768  paramPtr->st2 = T2 / model_.asd;
7769  paramPtr->st3 = T2 /( 1 - model_.asd);
7770  st4 = T0 * T1 * (1 + model_.asd) / 3
7771  - csmin * paramPtr->vsdfb;
7772 
7773  T1 = cdbox - cdmin;
7774  T2 = T1 / T0 / T0;
7775  paramPtr->dt2 = T2 / model_.asd;
7776  paramPtr->dt3 = T2 /( 1 - model_.asd);
7777  dt4 = T0 * T1 * (1 + model_.asd) / 3
7778  - cdmin * paramPtr->vsdfb;
7779  } else
7780  {
7781  T0 = paramPtr->vsdfb - paramPtr->vsdth;
7782  paramPtr->sdt1 = paramPtr->vsdth + model_.asd * T0;
7783  T1 = csmin - csbox;
7784  T2 = T1 / T0 / T0;
7785  paramPtr->st2 = T2 / model_.asd;
7786  paramPtr->st3 = T2 /( 1 - model_.asd);
7787  st4 = T0 * T1 * (1 + model_.asd) / 3
7788  - csbox * paramPtr->vsdth;
7789 
7790  T1 = cdmin - cdbox;
7791  T2 = T1 / T0 / T0;
7792  paramPtr->dt2 = T2 / model_.asd;
7793  paramPtr->dt3 = T2 /( 1 - model_.asd);
7794  dt4 = T0 * T1 * (1 + model_.asd) / 3
7795  - cdbox * paramPtr->vsdth;
7796  }
7797 
7798  /* v2.2.2 bug fix */
7799  T0 = model_.csdesw * log(1 + model_.tsi /
7800  model_.tbox);
7801  T1 = sourcePerimeter - w;
7802  if (T1 > 0.0)
7803  csesw = T0 * T1;
7804  else
7805  csesw = 0.0;
7806  T1 = drainPerimeter - w;
7807  if (T1 > 0.0)
7808  cdesw = T0 * T1;
7809  else
7810  cdesw = 0.0;
7811 
7812  phi = paramPtr->phi;
7813  cgso = paramPtr->cgso;
7814  cgdo = paramPtr->cgdo;
7815 
7816 /* v2.0 release */
7817  if (model_.ln < 1e-15) model_.ln = 1e-15;
7818  T0 = -0.5 * paramPtr->leff * paramPtr->leff /
7819  model_.ln / model_.ln;
7820  DEXP(T0,T1);
7821  paramPtr->arfabjt = T1;
7822 
7823  T0 = paramPtr->lbjt0 * (1.0 / paramPtr->leff + 1.0 / model_.ln);
7824  paramPtr->lratio = pow(T0,paramPtr->nbjt);
7825  paramPtr->lratiodif = 1.0 + model_.ldif0 * pow(T0,paramPtr->ndif);
7826 
7827  if ((paramPtr->vearly = paramPtr->vabjt + paramPtr->aely*paramPtr->leff) < 1)
7828  paramPtr->vearly = 1;
7829 
7830  /* vfbzb calculation for capMod 3 */
7831  tmp = sqrt(paramPtr->Xdep0);
7832  tmp1 = paramPtr->vbi - paramPtr->phi;
7833  tmp2 = model_.factor1 * tmp;
7834 
7835  T0 = -0.5 * paramPtr->dvt1w * paramPtr->weff
7836  * paramPtr->leff / tmp2;
7837  if (T0 > -EXPL_THRESHOLD)
7838  { T1 = exp(T0);
7839  T2 = T1 * (1.0 + 2.0 * T1);
7840  }
7841  else
7842  { T1 = MIN_EXPL;
7843  T2 = T1 * (1.0 + 2.0 * T1);
7844  }
7845  T0 = paramPtr->dvt0w * T2;
7846  T2 = T0 * tmp1;
7847 
7848  T0 = -0.5 * paramPtr->dvt1 * paramPtr->leff / tmp2;
7849  if (T0 > -EXPL_THRESHOLD)
7850  { T1 = exp(T0);
7851  T3 = T1 * (1.0 + 2.0 * T1);
7852  }
7853  else
7854  { T1 = MIN_EXPL;
7855  T3 = T1 * (1.0 + 2.0 * T1);
7856  }
7857  T3 = paramPtr->dvt0 * T3 * tmp1;
7858 
7859 /* v2.2.3 */
7860  T4 = (model_.tox - model_.dtoxcv) * paramPtr->phi
7861  / (paramPtr->weff + paramPtr->w0);
7862 
7863  T0 = sqrt(1.0 + paramPtr->nlx / paramPtr->leff);
7864  T5 = paramPtr->k1eff * (T0 - 1.0) * paramPtr->sqrtPhi
7865  + (paramPtr->kt1 + paramPtr->kt1l / paramPtr->leff)
7866  * (TempRatio - 1.0);
7867 
7868  tmp3 = model_.dtype * paramPtr->vth0
7869  - T2 - T3 + paramPtr->k3 * T4 + T5;
7870  paramPtr->vfbzb = tmp3 - paramPtr->phi - paramPtr->k1eff
7871  * paramPtr->sqrtPhi;
7872  /* End of vfbzb */
7873 
7874 
7875 // v3.2
7877  * (1.0 + paramPtr->nlx / paramPtr->leff)
7878  * 1e6 * model_.tsi;
7879 
7880 
7881 // v3.1 wanh added for RF
7883  +paramPtr->weff/nseg / 3.0 / model_.ngcon) /
7884  (model_.ngcon * (l - model_.xgl));
7885  if (grgeltd > 0.0)
7886  grgeltd = 1.0 / grgeltd;
7887  else
7888  { grgeltd = 1.0e3; // mho
7889  if (rgateMod !=0)
7890  {
7891  UserWarning(*this) << "The gate conductance reset to 1.0e3 mho.";
7892  }
7893  }
7894 // v3.1 wanh added for RF end
7895 
7896  paramPtr->ldeb = sqrt(CONSTEPSSI * model_.Vtm0 /
7897  (CONSTQ * paramPtr->npeak * 1.0e6)) / 3.0;
7898 
7899  return true;
7900 }
7901 
7902 //-----------------------------------------------------------------------------
7903 // Function : Instance::updateIntermediateVars
7904 // Purpose :
7905 // Special Notes :
7906 // Scope : public
7907 // Creator : Dave Shirley
7908 // Creation Date : 05/20/04
7909 //-----------------------------------------------------------------------------
7911 {
7912  bool bsuccess = true;
7913 
7914  double VgstNVt, ExpVgst;
7915 
7916  double arg;
7917 
7918  double Vfbeff, dVfbeff_dVd, dVfbeff_dVg, dVfbeff_dVrg, dVfbeff_dVb;
7919  double dVfbeff_dT, V3, V4;
7920  double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVfb_dT;
7921 
7922  double MJSWG;
7923 
7924  double qinoi;
7925  double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd;
7926  double sqrtPhisExt, dsqrtPhisExt_dVb;
7927  double Vgst;
7928 
7929  double Vtm;
7930  double n, dn_dVb, dn_dVd, noff, dnoff_dVd, dnoff_dVb;
7931  double ExpArg, V0, CoxWLcen, QovCox, LINK;
7932  double CoxWLb, CoxWLcenb;
7933  double DeltaPhi;
7934 
7935  double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVd, dTcen_dVb;
7936  double Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVd, dCoxeff_dVb;
7937  double dTcen_dT, dCoxeff_dT, dCoxWLcenb_dT;
7938  double Denomi ,dDenomi_dVg ,dDenomi_dVd ,dDenomi_dVb ,dDenomi_dT;
7939  double Ce1b ,Ce1e, Ce1T;
7940  double CbT, CsT, CgT;
7941 
7942  double Giie, dRatio_dVe;
7943  double Vdsatii0, dVdsatii0_dT;
7944  double VgsStep, dVgsStep_dT;
7945  double Vdsatii;
7946  double Vdiff, dVdiff_dVg, dVdiff_dVb, dVdiff_dVd, dVdiff_dVe, dVdiff_dT;
7947  double Ratio, dRatio_dVg, dRatio_dVb, dRatio_dVd, dRatio_dT;
7948  double Gbpbs, Gbpps;
7949  double qinv_local;
7950  double qjs_local, gcjsbs, gcjsT;
7951  double qjd_local, gcjdbs, gcjdds, gcjdT;
7952  double cjsbs, cjdbs, dcjdbs_dT, dcjsbs_dT;
7953  double PhiBSWG, dPhiBSWG_dT;
7954  double darg_dT, ddT3_dVb_dT;
7955 
7956  double gbbp;
7957 
7958  double OxideRatio, Vaux, dVaux_dVg, dVaux_dVd, dVaux_dVb;
7959  double Igb, dIgb_dVg, dIgb_dVd, dIgb_dVb, dIgb_dVe, dIgb_dT;
7960  double Ibs, Ibd;
7961 
7962  double Ibs1 ,dIbs1_dVb ,dIbs1_dT;
7963  double Ibs2 ,dIbs2_dVb ,dIbs2_dT;
7964  double Ibs3 ,dIbs3_dVb ,dIbs3_dVd, dIbs3_dT;
7965  double Ibs4 ,dIbs4_dVb ,dIbs4_dT;
7966  double Ibd1 ,dIbd1_dVb ,dIbd1_dVd ,dIbd1_dT;
7967  double Ibd2 ,dIbd2_dVb ,dIbd2_dVd ,dIbd2_dT;
7968  double Ibd3 ,dIbd3_dVb ,dIbd3_dVd ,dIbd3_dT;
7969  double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT;
7970  double Igc, dIgc_dVg, dIgc_dVd, dIgc_dVb;
7971  double Igs_local, dIgs_dVg, dIgs_dVs, Igd_local, dIgd_dVg, dIgd_dVd;
7972  double Igcs_local, dIgcs_dVg, dIgcs_dVd, dIgcs_dVb;
7973  double Igcd_local, dIgcd_dVg, dIgcd_dVd, dIgcd_dVb;
7974  double Igb1, dIgb1_dVg, dIgb1_dVd, dIgb1_dVb, dIgb1_dT, dIgb1_dVe;
7975  double Igb2, dIgb2_dVg, dIgb2_dVd, dIgb2_dVb, dIgb2_dT;
7976 
7977  double vgs_eff, dvgs_eff_dvg, vgd_eff, dvgd_eff_dvg;
7978  double dT0_dVox, Voxeff, dVoxeff_dVox, dVox_dT, dVaux_dT;
7979 
7980  double Vgb, dVgb_dVg, dVgb_dVb, Vox, dVox_dVg, dVox_dVd, dVox_dVb;
7981  double dT1_dVe, dT5_dVe, dVox_dVe, dVoxdepinv_dVe, dVaux_dVe;
7982  double Voxacc, dVoxacc_dVg, dVoxacc_dVd, dVoxacc_dVb;
7983  double Voxdepinv, dVoxdepinv_dVg, dVoxdepinv_dVb, dVoxdepinv_dVd;
7984  double dVoxdepinv_dT, VxNVt, ExpVxNVt;
7985 
7986  double Gjsd=0.0, Gjsb=0.0, GjsT=0.0, Gjdd=0.0, Gjdb=0.0, GjdT=0.0;
7987  double Ien, dIen_dT, Iendif, dIendif_dT;
7988  double Ibsdif, dIbsdif_dVb, dIbsdif_dT;
7989  double Ibddif, dIbddif_dVb, dIbddif_dVd, dIbddif_dT;
7990  double Ehlis, dEhlis_dVb, dEhlis_dT;
7991  double EhlisFactor, dEhlisFactor_dVb, dEhlisFactor_dT;
7992  double Ehlid, dEhlid_dVb, dEhlid_dVd, dEhlid_dT;
7993  double EhlidFactor, dEhlidFactor_dVb, dEhlidFactor_dVd, dEhlidFactor_dT;
7994  double E2ndFactor, dE2ndFactor_dVb, dE2ndFactor_dVd, dE2ndFactor_dT;
7995 
7996  double ExpVbsNVtm, dExpVbsNVtm_dVb, dExpVbsNVtm_dT;
7997  double ExpVbdNVtm, dExpVbdNVtm_dVb, dExpVbdNVtm_dVd, dExpVbdNVtm_dT;
7998 
7999  double ueff_local, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT;
8000  double Esat;
8001 
8002  double Vdsat;
8003 
8004  double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dT;
8005 
8006  double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat;
8007  double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dT;
8008  double Va, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT;
8009  double WTsi, NVtm1, NVtm2;
8010  double Ic;
8011  double dNVtm1_dT;
8012  double WsTsi, WdTsi;
8013  double NVtmf, NVtmr, dNVtmf_dT, dNVtmr_dT;
8014 
8015  double Ibp, Iii, Gcd, Gcb, GcT;
8016  double Giid=0.0, Giig=0.0, Giib=0.0, GiiT=0.0;
8017 
8018  double Vbseff, dVbseff_dVb;
8019 
8020  double CoxWL;
8021  double Idgidl, Gdgidld, Gdgidlg, Isgidl, Gsgidlg;
8022 
8023  double K1, Cbox, CboxWL, Vesfb;
8024  double T0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dVe;
8025  double T1, dT1_dVg, dT1_dVd, dT1_dVb;
8026  double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dVe;
8027  double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dT;
8028  double T4, dT4_dVd, dT4_dVb, dT4_dT;
8029  double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dT;
8030  double T6, dT6_dVg, dT6_dVd, dT6_dVb, dT6_dT;
8031  double T7;
8032  double T8, dT8_dVd;
8033  double T9, dT9_dVd;
8034  double T10, dT10_dVb, dT10_dVd;
8035  double T11, T12;
8036  double dT10_dT, dT11_dT, DioMax;
8037 
8038  double T13, T14;
8039  double dT11_dVb, dT13_dVb, dT14_dVb;
8040 
8041  double tmp, Abulk_local, dAbulk_dVb, Abulk0, dAbulk0_dVb;
8042 
8043  double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dT;
8044  double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dT;
8045 
8046  double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb;
8047  double Delt_vth, dDelt_vth_dVb;
8048 
8049  double Theta0, dTheta0_dVb;
8050  double T3zb, lt1zb, ltwzb, Theta0zb;
8051  double Delt_vthzb, dDelt_vthzb_dT;
8052  double DeltVthwzb, dDeltVthwzb_dT;
8053  double DeltVthtempzb, dDeltVthtempzb_dT;
8054  double Vthzb, dVthzb_dT, Vfbzb, dVfbzb_dT;
8055 
8056 
8057  double Temp, TempRatio, dTempRatio_dT, tmp1, tmp2, tmp3, tmp4;
8058 
8059  // Temp-dependent values for self heating
8060  double phi_local;
8061  double ni_local, Eg, vbi, dvbi_dT, vfbb, dvfbb_dT, sqrtPhi, Xdep0;
8062  double Ahli, dAhli_dT, jbjt, jdif, jrec, djbjt_dT, djdif_dT, djrec_dT;
8063  double jtun, djtun_dT, u0temp, du0temp_dT, vsattemp, dvsattemp_dT;
8064  double rds0, drds0_dT, ua, ub, uc, dua_dT, dub_dT, duc_dT;
8065  double dni_dT, dT7_dT, dT0_dT, dT0_dT7, dT1_dT, dT1_dT7;
8066  double dT2_dT, dT2_dT7;
8067 
8068  double Vbs0, dVbs0_dVg, dVbs0_dVd, dVbs0_dVe, dVbs0_dT;
8069  double Vbs0mos, dVbs0mos_dVe, dVbs0mos_dT;
8070  double Vbsmos, dVbsmos_dVg, dVbsmos_dVd, dVbsmos_dVb, dVbsmos_dVe, dVbsmos_dT;
8071 
8072  double wdios, wdiod, wdiosCV, wdiodCV;
8073 
8074  double Vbp, dVbp_dVb, dVtm_dT;
8075  double Vbsh, dVbsh_dVb;
8076  double dDelt_vth_dT;
8077  double DeltVthw, dDeltVthw_dVb, dDeltVthw_dT, DeltVthtemp, dDeltVthtemp_dT;
8078  double VthFD, dVthFD_dVd, dVthFD_dVb, dVthFD_dVe, dVthFD_dT;
8079  double VtgsFD, ExpVtgsFD, VgstFD, ExpVgstFD;
8080  double VtgseffFD, dVtgseffFD_dVd, dVtgseffFD_dVg, dVtgseffFD_dVe;
8081  double dVtgseffFD_dT;
8082  double Vbsitf, dVbsitf_dVg, dVbsitf_dVd, dVbsitf_dVb, dVbsitf_dVe, dVbsitf_dT;
8083  double PhiFD, dPhiFD_dVg, dPhiFD_dVd, dPhiFD_dVe, dPhiFD_dT;
8084  double PhiON, dPhiON_dVg, dPhiON_dVd, dPhiON_dVe, dPhiON_dT;
8085  double dVbsh_dVg, dVbsh_dVd, dVbsh_dVe, dVbsh_dT;
8086  double VgsteffFD, dVgsteffFD_dVd, dVgsteffFD_dVg, dVgsteffFD_dVe;
8087  double dVgsteffFD_dT;
8088  double dVgsteff_dVe, dVbseff_dVg, dVbseff_dVd, dVbseff_dVe, dVbseff_dT;
8089  double Vbs0t, dVbs0t_dVg, dVbs0t_dVd, dVbs0t_dVe, dVbs0t_dT;
8090  double Vgsteff_local, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb, dVgsteff_dT;
8091  double Vdseff_local, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dT;
8092  double dVgst_dVd, dVth_dT, dVgst2Vtm_dT;
8093 
8094  double DIBL_Sft, dDIBL_Sft_dVd, dDIBL_Sft_dVb;
8095 
8096  double Lambda, dLambda_dVg;
8097 
8098  double a1;
8099 
8100  double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb;
8101  double diffVds;
8102 
8103  double dAbulk_dVg;
8104  double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb, dbeta_dT;
8105  double gche, dgche_dVg, dgche_dVd, dgche_dVb, dgche_dT;
8106  double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb, dfgche1_dT;
8107  double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb, dfgche2_dT;
8108  double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb, dIdl_dT;
8109  double Gm0, Gds0, Gmb0, GmT0;
8110  double Ids;
8111 
8112  double Gds, Gmb;
8113 
8114  double CoxWovL;
8115  double Rds, dRds_dVg, dRds_dVb, dRds_dT, WVCox, WVCoxRds;
8116  double Vgst2Vtm, VdsatCV;
8117 
8118 //not used double dVdsatCV_dVg, dVdsatCV_dVb;
8119 
8120  double Leff, Weff, dWeff_dVg, dWeff_dVb;
8121  double AbulkCV, dAbulkCV_dVb;
8122 
8123  double Qe1 , dQe1_dVb, dQe1_dVe, dQe1_dT;
8124 
8125  double Csg(0.0), Csd(0.0), Csb(0.0), Cbg(0.0), Cbd(0.0), Cbb(0.0);
8126  double Cgb(0.0), Cgg(0.0), Cgd(0.0);
8127  double Cgg1(0.0), Cgb1(0.0), Cgd1(0.0), Cbg1(0.0), Cbb1(0.0), Cbd1(0.0);
8128  double Csg1(0.0), Csd1(0.0), Csb1(0.0);
8129 
8130  double Qac0, Qsub0;
8131  double dQac0_dVg, dQac0_dVb, dQac0_dVd, dQac0_dVrg, dQac0_dT;
8132  double dQsub0_dVg, dQsub0_dVd, dQsub0_dVb, dQsub0_dVrg, dQsub0_dT;
8133 
8134  // These are needed for voltage limiting, no need for them to be instance
8135  // variables:
8136  double vg_old, vd_old, vp_old, ve_old, vgp_old, vgm_old, vs_old, delTemp_old;
8137  double vbd_old, vbs_old, vds_old;
8138 
8139 
8140  // Don't do charge computations in DC sweeps.
8141  if (getSolverState().tranopFlag || getSolverState().acopFlag || getSolverState().transientFlag)
8142  {
8143  ChargeComputationNeeded = true;
8144  }
8145  else
8146  {
8147  ChargeComputationNeeded = false;
8148  }
8149 
8150  // this block of variables were originally set up as local function variables
8151  // but they've been moved to the instance class.
8152  qgdo = 0.0;
8153  qgso = 0.0;
8154  qgd = 0.0;
8155  qgs = 0.0;
8156  qge = 0.0;
8157  qgme = 0.0;
8158  qgate = 0.0;
8159  qbody = 0.0;
8160  qdrn = 0.0;
8161  qsub = 0.0;
8162  qsrc = 0.0;
8163 
8164  // end of b3ld.c parameters.
8165 
8166 #ifdef Xyce_DEBUG_DEVICE
8167  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
8168  {
8169  Xyce::dout() << subsection_divider << std::endl;
8170  Xyce::dout() << " In updateIntermediateVars\n";
8171  Xyce::dout() << " name = " << getName();
8172  Xyce::dout() << " model name = " << model_.getName();
8173  Xyce::dout() <<" dtype is " << model_.dtype << std::endl;
8174  Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
8175  Xyce::dout() << " " << std::endl;
8176  }
8177 #endif
8178 
8179  int Check = 0; // The limiter function sets this to 1 if it changes things
8180 
8181  // The first block of code in b3ld.c basically sets up, locally,
8182  // what the load function should use as values for the various solution
8183  // variables. There is a series of IF statements which are dependent
8184  // upon the mode. (transient, initializing transient, operating point,
8185  // small signal, etc.). Xyce treats the operating point and transient
8186  // calculation in the same way, from the device's point of view, and
8187  // we don't support any of the other modes. Therefore most of these
8188  // mode options are not here - only the transient mode stuff.
8189 
8190  // First get some of the needed solution variables:
8191  Vd = 0.0;
8192  Vg = 0.0;
8193  Vs = 0.0;
8194  Ve = 0.0;
8195  Vp = 0.0;
8196  Vb = 0.0;
8197  delTemp = 0.0;
8198  Vsp = 0.0;
8199  Vdp = 0.0;
8200  Vgp = 0.0;
8201  Vgm = 0.0;
8202 
8204  // possible source of confusion: Original SPICE b3soi calls this "GE" for
8205  // "Gate External", we call it Gate
8209 
8210  if(li_Body != -1) {
8212  }
8213  if(li_ExtBody != -1)
8215  if(li_Temperature != -1)
8219  // Possible source of confusion: Original Spice calls this Gate, we call
8220  // it GatePrime to be consistent with our usage in other devices
8221  // (Prime means internal, unadorned means external)
8224 
8225  // orig variables, nodal version:
8226  Vd_orig = Vd;
8227  Vg_orig = Vg;
8228  Vs_orig = Vs;
8229  Ve_orig = Ve;
8230  Vb_orig = Vb;
8231  Vp_orig = Vp;
8232  Vsp_orig = Vsp;
8233  Vdp_orig = Vdp;
8234  Vgp_orig = Vgp;
8235  Vgm_orig = Vgm;
8236 
8237 #ifdef Xyce_DEBUG_DEVICE
8239  {
8240  Xyce::dout().precision(18);
8241  Xyce::dout() << std::endl;
8242  Xyce::dout() << getName() << " Blim: Vd = " << Vd << std::endl;
8243  Xyce::dout() << getName() << " Blim: Vg = " << Vg << std::endl;
8244  Xyce::dout() << getName() << " Blim: Vs = " << Vs << std::endl;
8245  Xyce::dout() << getName() << " Blim: Ve = " << Ve << std::endl;
8246  Xyce::dout() << getName() << " Blim: Vb = " << Vb << std::endl;
8247  Xyce::dout() << getName() << " Blim: Vp = " << Vp << std::endl;
8248  Xyce::dout() << getName() << " Blim:delTemp = " << delTemp << std::endl;
8249  Xyce::dout() << getName() << " Blim: Vsp = " << Vsp << std::endl;
8250  Xyce::dout() << getName() << " Blim: Vdp = " << Vdp << std::endl;
8251  Xyce::dout() << getName() << " Blim: Vgp = " << Vgp << std::endl;
8252  Xyce::dout() << getName() << " Blim: Vgm = " << Vgm << std::endl;
8253  Xyce::dout() << std::endl;
8254  }
8255 #endif
8256 
8257  // modified from b3ld: (see lines 221-230)
8258  vbs = model_.dtype * (Vb - Vsp);
8259  vps = model_.dtype * (Vp - Vsp);
8260  vgs = model_.dtype * (Vgp- Vsp);
8261  ves = model_.dtype * (Ve - Vsp);
8262  vds = model_.dtype * (Vdp- Vsp);
8263  vges = model_.dtype * (Vg - Vsp);
8264  vgms = model_.dtype * (Vgm - Vsp);
8265 
8266  vbd = vbs - vds;
8267  vgd = vgs - vds;
8268  ved = ves - vds;
8269 
8270 #ifdef Xyce_DEBUG_DEVICE
8272  {
8273  Xyce::dout().precision(18);
8274  Xyce::dout() << std::endl;
8275  Xyce::dout() << getName() << " Blim: vbs = " << vbs << std::endl;
8276  Xyce::dout() << getName() << " Blim: vbd = " << vbd << std::endl;
8277  Xyce::dout() << getName() << " Blim: vps = " << vps << std::endl;
8278  Xyce::dout() << getName() << " Blim: vpd = " << vpd << std::endl;
8279  Xyce::dout() << getName() << " Blim: vgs = " << vgs << std::endl;
8280  Xyce::dout() << getName() << " Blim: vds = " << vds << std::endl;
8281  Xyce::dout() << getName() << " Blim: ves = " << ves << std::endl;
8282  Xyce::dout() << getName() << " Blim: ved = " << ved << std::endl;
8283  Xyce::dout() << getName() << " Blim: vgd = " << vgd << std::endl;
8284  Xyce::dout() << getName() << " Blim: vges = " << vges<< std::endl;
8285  Xyce::dout() << getName() << " Blim: vgms = " << vgms<< std::endl;
8286  }
8287 #endif
8288 
8289  origFlag = 1;
8290  vbs_orig = vbs;
8291  vbd_orig = vbd;
8292  vps_orig = vps;
8293  vpd_orig = vpd;
8294  vgs_orig = vgs;
8295  vds_orig = vds;
8296  ves_orig = ves;
8297  ved_orig = ved;
8298  vgd_orig = vgd;
8299  vges_orig = vges;
8300  vgms_orig = vgms;
8302 
8303  // note initJctFlag will only be true for dcop.
8304  if (getSolverState().initJctFlag && !OFF && getDeviceOptions().voltageLimiterFlag)
8305  {
8306  if (getSolverState().inputOPFlag)
8307  {
8308  N_LAS_Vector * flagSolVectorPtr = extData.flagSolVectorPtr;
8309  if ((*flagSolVectorPtr)[li_Drain] == 0 || (*flagSolVectorPtr)[li_Gate] == 0 ||
8310  (*flagSolVectorPtr)[li_Source] == 0 || (*flagSolVectorPtr)[li_Substrate] == 0 ||
8311  (*flagSolVectorPtr)[li_DrainPrime] == 0 || (*flagSolVectorPtr)[li_GatePrime] == 0 ||
8312  (*flagSolVectorPtr)[li_SourcePrime] == 0 || (*flagSolVectorPtr)[li_GateMid] == 0 ||
8313  (li_Body != -1 && (*flagSolVectorPtr)[li_Body] == 0) ||
8314  (li_ExtBody != -1 && (*flagSolVectorPtr)[li_ExtBody] == 0) ||
8315  (li_Temperature != -1 && (*flagSolVectorPtr)[li_Temperature] == 0) )
8316  {
8317  vbs = 0.0;
8318  vgs = model_.dtype*0.1 + paramPtr->vth0;
8319  vds = 0.0;
8320  ves = 0.0;
8321  vps = 0.0;
8322  vpd = 0.0;
8323  vges = vgms = vgs;
8324  origFlag = 0;
8325  }
8326  }
8327  else
8328  {
8329  vgs = model_.dtype*0.1 + paramPtr->vth0;
8330  vges = vgms = vgs;
8331  origFlag = 0;
8332  }
8333  }
8334  else if ((getSolverState().initFixFlag || getSolverState().initJctFlag) && OFF)
8335  {
8336  delTemp = vps = vbs = vgs = vds = ves = 0.0;
8337  Vg = Vd = Vs = Vp = Ve = 0.0;
8338 
8339  vges = vgms = 0.0;
8340  }
8341 
8342  if (getSolverState().newtonIter == 0)
8343  {
8344 
8345  if (!getSolverState().dcopFlag || (getSolverState().locaEnabledFlag && getSolverState().dcopFlag))
8346  // ie, first newton step of a transient time step or DCOP continuation step.
8347  {
8348  // if not dcop, then state vector has final drops of last nonlinear step
8349  // of most recent successful time step. Use those as our "old" values
8350  // for limiting
8358  delTemp_old = (extData.currStoVectorRawPtr)[li_store_deltemp];
8359 
8360  // old voltage drops needed for second round of limiting
8364  }
8365  else // first newton step of DCOP.
8366  {
8367  vg_old = Vg;
8368  vd_old = Vdp;
8369  vs_old = Vsp;
8370  vp_old = Vp;
8371  ve_old = Ve;
8372  vgp_old = Vgp;
8373  vgm_old = Vgm;
8374  delTemp_old = delTemp;
8375 
8376  // old voltage drops
8377  vds_old = vds;
8378  vbs_old = vbs;
8379  vbd_old = vbd;
8380  }
8381  }
8382  else
8383  {
8391  delTemp_old = (extData.nextStoVectorRawPtr)[li_store_deltemp];
8392 
8393  // old voltage drops needed for second round of limiting
8397  }
8398 
8399  // B3SOI does limiting in a very different manner than any of the other
8400  // SPICE/Xyce devices did. Instead of limiting junction voltages and
8401  // preventing them from swinging too much, B3SOI limits actual voltage
8402  // nodes directly.
8403  // The impact of this on Xyce voltage limiting is significant:
8404  // The most straightforward way to apply Xyce style voltage limiting is
8405  // to apply the jacobian directly to the delta-x resulting from the
8406  // voltage node changes. But since most of the B3SOI code that could work
8407  // with limiting was written to use voltage drop changes instead, we're
8408  // gonna try to cheat.
8409  // We'll limit the individual nodes as B3SOI does, then recalculate the
8410  // drops. We have already saved the drops from the input solution vector
8411  // in the _orig variables. So now everywhere that spice does something
8412  // like:
8413  // RightHandSideTerm = current-conductance*voltagedrop
8414  // we can do
8415  // RightHandSideTerm = current;
8416  // RightHandSideTerm_Jdxp = conductance*(voltagedrop-voltagedrop_orig);
8417 
8419  && !(getSolverState().initFixFlag && OFF))
8420  {
8421  Vg = B3SOIlimit(Vg, vg_old, 3.0, &Check);
8422  Vdp = B3SOIlimit(Vdp, vd_old, 3.0, &Check);
8423  Vsp = B3SOIlimit(Vsp, vs_old, 3.0, &Check);
8424  Vp = B3SOIlimit(Vp, vp_old, 3.0, &Check);
8425  Ve = B3SOIlimit(Ve, ve_old, 3.0, &Check);
8426  Vgp = B3SOIlimit(Vgp, vgp_old, 3.0, &Check);
8427  Vgm = B3SOIlimit(Vgm, vgm_old, 3.0, &Check);
8428  if (Check == 1) // something changed, recalculate the drops
8429  {
8430 
8431  // Note that vbs is NOT recalculated! In SPICE b3soi vbs is calculated
8432  // from the unlimited b and sp nodes
8433  vps = model_.dtype * (Vp - Vsp);
8434  vgs = model_.dtype * (Vgp- Vsp);
8435  ves = model_.dtype * (Ve - Vsp);
8436  vds = model_.dtype * (Vdp- Vsp);
8437  vges = model_.dtype * (Vg - Vsp);
8438  vgms = model_.dtype * (Vgm - Vsp);
8439 
8440  vbd = vbs - vds;
8441  vgd = vgs - vds;
8442  ved = ves - vds;
8443  origFlag = 0;
8444  }
8445 
8446  } // getDeviceOptions().voltageLimiterFlag
8447 
8448  // ALL Bypass code removed by TVR --- we never, ever use it, and it just
8449  // clutters the code
8450 
8451  // There is now a second round of limiting-related stuff in the SPICE B3SOI:
8452  // In spice3F5 version there are additional lines here but they calculate
8453  // junk that is only used in bypass, which we never do
8454 
8456  {
8457  if (vds_old >= 0) // normal mode
8458  {
8459  T0 = vbs_old;
8460 
8461  if ( model_.bug1830fix != 0)
8462  {
8463  T1 = vbd_old;
8464  }
8465 
8466  }
8467  else // reverse
8468  {
8469  T0 = vbd_old;
8470 
8471  if ( model_.bug1830fix != 0)
8472  {
8473  T1 = vbs_old;
8474  }
8475 
8476  }
8477 
8478  if (vds >= 0)
8479  {
8480  vbs = B3SOIlimit(vbs, T0, 0.2, &Check);
8481  vbd = vbs - vds;
8482 
8483  if ( model_.bug1830fix != 0)
8484  {
8485  //vbd = B3SOIlimit(vbd, T1, 0.2, &Check);
8486  vbd = B3SOIlimit(vbd, vbd_old, 0.2, &Check);
8487  }
8488 
8489  Vb = model_.dtype*vbs+Vsp;
8490  }
8491  else
8492  {
8493  vbd = B3SOIlimit(vbd,T0,0.2,&Check);
8494  vbs = vbd+vds;
8495 
8496  if ( model_.bug1830fix != 0)
8497  {
8498  //vbs = B3SOIlimit(vbs, T1, 0.2, &Check);
8499  vbs = B3SOIlimit(vbs, vbs_old, 0.2, &Check);
8500  }
8501 
8502  Vb = model_.dtype*vbs+Vdp;
8503  }
8504 
8505  delTemp = B3SOIlimit(delTemp, delTemp_old, 5.0, &Check);
8506 
8507  if (Check == 1) origFlag = 0;
8508 
8509 #ifdef Xyce_DEBUG_DEVICE
8510  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
8511  {
8512  Xyce::dout() << std::endl;
8513  Xyce::dout().precision(18);
8514  Xyce::dout() << std::endl;
8515  Xyce::dout() << getName() << " Alim: Vd = " << Vd << std::endl;
8516  Xyce::dout() << getName() << " Alim: Vg = " << Vg << std::endl;
8517  Xyce::dout() << getName() << " Alim: Vs = " << Vs << std::endl;
8518  Xyce::dout() << getName() << " Alim: Ve = " << Ve << std::endl;
8519  Xyce::dout() << getName() << " Alim: Vb = " << Vb << std::endl;
8520  Xyce::dout() << getName() << " Alim: Vp = " << Vp << std::endl;
8521  Xyce::dout() << getName() << " Alim:delTemp = " << delTemp << std::endl;
8522  Xyce::dout() << getName() << " Alim: Vsp = " << Vsp << std::endl;
8523  Xyce::dout() << getName() << " Alim: Vdp = " << Vdp << std::endl;
8524  Xyce::dout() << getName() << " Alim: Vgp = " << Vgp << std::endl;
8525  Xyce::dout() << getName() << " Alim: Vgm = " << Vgm << std::endl;
8526 
8527  Xyce::dout() << getName() << " Alim: vbs = " << vbs << std::endl;
8528  Xyce::dout() << getName() << " Alim: vps = " << vps << std::endl;
8529  Xyce::dout() << getName() << " Alim: vgs = " << vgs << std::endl;
8530  Xyce::dout() << getName() << " Alim: ves = " << ves << std::endl;
8531  Xyce::dout() << getName() << " Alim: vds = " << vds << std::endl;
8532  Xyce::dout() << getName() << " Alim: vges = " <<vges << std::endl;
8533  Xyce::dout() << getName() << " Alim: vgms = " <<vgms << std::endl;
8534 
8535  Xyce::dout() << getName() << " Alim: vbd = " << vbd << std::endl;
8536 
8537  Xyce::dout() << getName() << " Alim: T0 = " << vbd << std::endl;
8538  Xyce::dout() << std::endl;
8539  Xyce::dout() << std::endl;
8540 
8541  Xyce::dout() <<getName()<<" Vg_orig = " << Vg_orig << std::endl;
8542  Xyce::dout() <<getName()<<" Vs_orig = " << Vs_orig << std::endl;
8543  Xyce::dout() <<getName()<<" Ve_orig = " << Ve_orig << std::endl;
8544  Xyce::dout() <<getName()<<" Vb_orig = " << Vb_orig << std::endl;
8545  Xyce::dout() <<getName()<<" Vp_orig = " << Vp_orig << std::endl;
8546  Xyce::dout() <<getName()<<" Vsp_orig = " << Vsp_orig << std::endl;
8547  Xyce::dout() <<getName()<<" Vdp_orig = " << Vdp_orig << std::endl;
8548  Xyce::dout() <<getName()<<" Vgp_orig = " << Vgp_orig << std::endl;
8549  Xyce::dout() <<getName()<<" Vgm_orig = " << Vgm_orig << std::endl;
8550  Xyce::dout() << std::endl;
8551  Xyce::dout() <<getName()<<" vbs_orig = " << vbs_orig << std::endl;
8552  Xyce::dout() <<getName()<<" vbd_orig = " << vbd_orig << std::endl;
8553  Xyce::dout() <<getName()<<" vps_orig = " << vps_orig << std::endl;
8554  Xyce::dout() <<getName()<<" vpd_orig = " << vpd_orig << std::endl;
8555  Xyce::dout() <<getName()<<" vgs_orig = " << vgs_orig << std::endl;
8556  Xyce::dout() <<getName()<<" vds_orig = " << vds_orig << std::endl;
8557  Xyce::dout() <<getName()<<" ves_orig = " << ves_orig << std::endl;
8558  Xyce::dout() <<getName()<<" ved_orig = " << ved_orig << std::endl;
8559  Xyce::dout() <<getName()<<" vgd_orig = " << vgd_orig << std::endl;
8560  Xyce::dout() <<getName()<<" vges_orig = " << vges_orig << std::endl;
8561  Xyce::dout() <<getName()<<" vgms_orig = " << vgms_orig << std::endl;
8562  Xyce::dout() <<getName()<<" delTemp_orig = " << delTemp_orig << std::endl;
8563  }
8564 #endif
8565  }
8566 
8567  // Finished with what would have been the series of CKTmode
8568  // IF statements...
8569 
8570  // Calculate temperature dependent values for self-heating effect
8571  Temp = delTemp + temp;
8572  dTempRatio_dT = 1 / model_.tnom;
8573  TempRatio = Temp * dTempRatio_dT;
8574 
8575  if (selfheat)
8576  {
8577  Vtm = CONSTKoverQ * Temp;
8578 
8579  T0 = 1108.0 + Temp;
8580  T5 = Temp * Temp;
8581  Eg = 1.16 - 7.02e-4 * T5 / T0;
8582  T1 = ((7.02e-4 * T5) - T0 * (14.04e-4 * Temp)) / T0 / T0;
8583  // T1 = dEg / dT
8584 
8585  T2 = 1.9230584e-4;
8586  // T2 = 1 / 300.15^(3/2)
8587  T5 = sqrt(Temp);
8588  T3 = 1.45e10 * Temp * T5 * T2;
8589  T4 = exp(21.5565981 - Eg / (2.0 * Vtm));
8590  ni_local = T3 * T4;
8591  dni_dT = 2.175e10 * T2 * T5 * T4 + T3 * T4 *
8592  (-Vtm * T1 + Eg * CONSTKoverQ) / (2.0 * Vtm * Vtm);
8593 
8594  T0 = log(1.0e20 * paramPtr->npeak / (ni_local * ni_local));
8595  vbi = Vtm * T0;
8596  dvbi_dT = CONSTKoverQ * T0 + Vtm * (-2.0 * dni_dT / ni_local);
8597 
8598  if (paramPtr->nsub > 0)
8599  {
8600  T0 = log(paramPtr->npeak / paramPtr->nsub);
8601  vfbb = -model_.dtype * Vtm * T0;
8602  dvfbb_dT = -model_.dtype * CONSTKoverQ * T0;
8603  }
8604  else
8605  {
8606  T0 = log(-paramPtr->npeak * paramPtr->nsub / ni_local / ni_local);
8607  vfbb = -model_.dtype * Vtm * T0;
8608  dvfbb_dT = -model_.dtype *
8609  (CONSTKoverQ * T0 - Vtm * 2.0 * dni_dT / ni_local);
8610  }
8611 
8612  // phi_local = 2.0 * Vtm * log(paramPtr->npeak / ni_local);
8613  phi_local = phi;
8614  sqrtPhi = sqrt(phi_local);
8615  Xdep0 = sqrt(2.0 * CONSTEPSSI/(CONSTQ * paramPtr->npeak * 1.0e6))
8616  * sqrtPhi;
8617 
8618  // Save the values below for phi_local calculation in B3SOIaccept()
8619  vtm = Vtm;
8620  ni = ni_local;
8621 
8622  T3 = TempRatio - 1.0;
8623  T8 = 1/ model_.tnom;
8624  T4 = CONSTEg300 / Vtm * T3;
8625  dT4_dT = CONSTEg300 / Vtm / Vtm * (Vtm * T8 - T3 * CONSTKoverQ);
8626 
8627  T7 = paramPtr->xbjt * T4 / paramPtr->ndiode;
8628  dT7_dT = paramPtr->xbjt * dT4_dT / paramPtr->ndiode;
8629  CEXP(T7, T0, dT0_dT7);
8630  dT0_dT = dT0_dT7 * dT7_dT;
8631 
8632  if (paramPtr->xbjt == paramPtr->xdif)
8633  {
8634  T1 = T0;
8635  dT1_dT = dT0_dT;
8636  }
8637  else
8638  {
8639  T7 = paramPtr->xdif * T4 / paramPtr->ndiode;
8640  dT7_dT = paramPtr->xdif * dT4_dT / paramPtr->ndiode;
8641  CEXP(T7, T1, dT1_dT7);
8642  dT1_dT = dT1_dT7 * dT7_dT;
8643  }
8644 
8645  T7 = paramPtr->xrec * T4 / paramPtr->nrecf0;
8646  dT7_dT = paramPtr->xrec * dT4_dT / paramPtr->nrecf0;
8647  CEXP(T7, T2, dT2_dT7);
8648  dT2_dT = dT2_dT7 * dT7_dT;
8649 
8650  /* high level injection */
8651  Ahli = paramPtr->ahli * T0;
8652  dAhli_dT = paramPtr->ahli * dT0_dT;
8653 
8654  jbjt = paramPtr->isbjt * T0;
8655  jdif = paramPtr->isdif * T1;
8656  jrec = paramPtr->isrec * T2;
8657  djbjt_dT = paramPtr->isbjt * dT0_dT;
8658  djdif_dT = paramPtr->isdif * dT1_dT;
8659  djrec_dT = paramPtr->isrec * dT2_dT;
8660 
8661  T7 = paramPtr->xtun * T3;
8662  dT7_dT = paramPtr->xtun * T8;
8663  CEXP(T7, T0, dT0_dT7);
8664  dT0_dT = dT0_dT7 * dT7_dT;
8665  jtun = paramPtr->istun * T0;
8666  djtun_dT = paramPtr->istun * dT0_dT;
8667 
8668  u0temp = paramPtr->u0 * pow(TempRatio, paramPtr->ute);
8669  du0temp_dT = paramPtr->u0 * paramPtr->ute *
8670  pow(TempRatio, paramPtr->ute - 1.0) * T8;
8671 
8672  vsattemp = paramPtr->vsat - paramPtr->at * T3;
8673  dvsattemp_dT = -paramPtr->at * T8;
8674 
8675  rds0 = (paramPtr->rdsw + paramPtr->prt * T3) / paramPtr->rds0denom;
8676  drds0_dT = paramPtr->prt / paramPtr->rds0denom * T8;
8677 
8678  ua = paramPtr->uatemp + paramPtr->ua1 * T3;
8679  ub = paramPtr->ubtemp + paramPtr->ub1 * T3;
8680  uc = paramPtr->uctemp + paramPtr->uc1 * T3;
8681  dua_dT = paramPtr->ua1 * T8;
8682  dub_dT = paramPtr->ub1 * T8;
8683  duc_dT = paramPtr->uc1 * T8;
8684  }
8685  else
8686  {
8687  Vtm = CONSTKoverQ * temp;
8688  vbi = paramPtr->vbi;
8689  vfbb = paramPtr->vfbb;
8690  phi_local = paramPtr->phi;
8691  sqrtPhi = paramPtr->sqrtPhi;
8692  Xdep0 = paramPtr->Xdep0;
8693  jbjt = paramPtr->jbjt;
8694  jdif = paramPtr->jdif;
8695  jrec = paramPtr->jrec;
8696  jtun = paramPtr->jtun;
8697 
8698  // v2.2.2 bug fix
8699  Ahli = paramPtr->ahli0;
8700 
8701  u0temp = paramPtr->u0temp;
8702  vsattemp = paramPtr->vsattemp;
8703  rds0 = paramPtr->rds0;
8704  ua = paramPtr->ua;
8705  ub = paramPtr->ub;
8706  uc = paramPtr->uc;
8707  dni_dT = dvbi_dT = dvfbb_dT = djbjt_dT = djdif_dT = 0.0;
8708  djrec_dT = djtun_dT = du0temp_dT = dvsattemp_dT = 0.0;
8709  drds0_dT = dua_dT = dub_dT = duc_dT = 0.0;
8710  dAhli_dT = 0;
8711  }
8712 
8713  // TempRatio used for Vth and mobility
8714  if (selfheat)
8715  {
8716  TempRatioMinus1 = Temp / model_.tnom - 1.0;
8717  }
8718  else
8719  {
8720  TempRatioMinus1 = temp / model_.tnom - 1.0;
8721  }
8722 
8723  // file: b3ld.c line: 937
8724  // determine DC current and derivatives
8725  vbd = vbs - vds;
8726  vgd = vgs - vds;
8727  vgb = vgs - vbs;
8728  ved = ves - vds;
8729  veb = ves - vbs;
8730  vge = vgs - ves;
8731  vpd = vps - vds;
8732 
8733  vged = vges - vds;
8734  vgmd = vgms - vds;
8735  vgme = vgms - ves;
8736  vgmb = vgms - vbs; // v3.2 bug fix
8737 
8738 // v3.1 bug fix
8741 
8742  // This stuff impacts voltage limiting! Be careful!
8743  // It changes the meanings of things under the covers, so we must be
8744  // consistent
8745  if (vds >= 0.0)
8746  { // normal mode
8747  mode = 1;
8748  Vds = vds;
8749  Vds_orig = vds_orig;
8750  Vgs = vgs;
8751  Vgs_orig = vgs_orig;
8752  Vbs = vbs;
8753  Vbs_orig = vbs_orig;
8754  Vbd = vbd;
8755  Vbd_orig = vbd_orig;
8756  Ves = ves;
8757  Ves_orig = ves_orig;
8758  Vps = vps;
8759  Vps_orig = Vps_orig;
8760 
8761  wdios = paramPtr->wdios;
8762  wdiod = paramPtr->wdiod;
8763  wdiosCV = paramPtr->wdiosCV;
8764  wdiodCV = paramPtr->wdiodCV;
8765  }
8766  else
8767  { // inverse mode
8768  mode = -1;
8769  Vds = -vds;
8770  Vds_orig = -vds_orig;
8771  Vgs = vgd;
8772  Vgs_orig = vgd_orig;
8773  Vbs = vbd;
8774  Vbs_orig = vbd_orig;
8775  Vbd = vbs;
8776  Vbd_orig = vbs_orig;
8777  Ves = ved;
8778  Ves_orig = ved_orig;
8779  Vps = vpd;
8780  Vps_orig = vpd_orig;
8781 
8782  wdios = paramPtr->wdiod;
8783  wdiod = paramPtr->wdios;
8784  wdiosCV = paramPtr->wdiodCV;
8785  wdiodCV = paramPtr->wdiosCV;
8786  }
8787 
8788  // mosfet continuation.
8789  // This idea is based, loosely, on a paper by Jaijeet
8790  // Rosychowdhury. If the artificial parameter flag has been enabled,
8791  // modify Vds and Vgs.
8792 #ifdef Xyce_DEBUG_DEVICE
8794  {
8795  Xyce::dout() << "HOMOTOPY INFO: gainscale = "
8796  << getSolverState().gainScale[blockHomotopyID] << std::endl;
8797  Xyce::dout() << "HOMOTOPY INFO: before vds = " << Vds << std::endl;
8798  Xyce::dout() << "HOMOTOPY INFO: before vgst = " << Vgs << std::endl;
8799  Xyce::dout() << "vgstConst= " << getDeviceOptions().vgstConst << std::endl;
8800  }
8801 #endif
8802  if (getSolverState().artParameterFlag)
8803  {
8804  double alpha = getSolverState().gainScale[blockHomotopyID];
8805  if (getDeviceOptions().staggerGainScale)
8806  {
8807  alpha *= (0.3 * randomPerturb + 1.0);
8808  if (alpha > 1.0)
8809  {
8810  alpha = 1.0;
8811  }
8812  }
8813  double vgstConst = getDeviceOptions().vgstConst;
8814  if (getDeviceOptions().randomizeVgstConst)
8815  {
8816  vgstConst *= randomPerturb;
8817  }
8818 
8819  Vds = devSupport.contVds (Vds, getSolverState().nltermScale,
8820  getDeviceOptions().vdsScaleMin);
8821  Vgs = devSupport.contVgst(Vgs, alpha, vgstConst);
8822  }
8823 #ifdef Xyce_DEBUG_DEVICE
8824  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
8825  {
8826  Xyce::dout() << "HOMOTOPY INFO: after vds = " << Vds << std::endl;
8827  Xyce::dout() << "HOMOTOPY INFO: after vgst = " << Vgs << std::endl;
8828  }
8829 #endif
8830  // end of mosfet continuation block.
8831 
8832  Vesfb = Ves - vfbb;
8833  Cbox = model_.cbox;
8834  K1 = paramPtr->k1eff;
8835 
8836 // Poly Gate Si Depletion Effect
8837  T0 = paramPtr->vfb + phi_local;
8838  if ((paramPtr->ngate > 1.e18) && (paramPtr->ngate < 1.e25) && (Vgs > T0))
8839  // added to avoid the problem caused by ngate
8840  { T1 = 1.0e6 * CONSTQ * CONSTEPSSI * paramPtr->ngate
8841  / (model_.cox * model_.cox);
8842  T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1);
8843  T2 = T1 * (T4 - 1.0);
8844  T3 = 0.5 * T2 * T2 / T1; // T3 = Vpoly
8845  T7 = 1.12 - T3 - 0.05;
8846  T6 = sqrt(T7 * T7 + 0.224);
8847  T5 = 1.12 - 0.5 * (T7 + T6);
8848  Vgs_eff = Vgs - T5;
8849  dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6);
8850  }
8851  else
8852  { Vgs_eff = Vgs;
8853  dVgs_eff_dVg = 1.0;
8854  }
8855 
8856  Leff = paramPtr->leff;
8857 
8858  if (selfheat)
8859  {
8860  Vtm = CONSTKoverQ * Temp;
8861  dVtm_dT = CONSTKoverQ;
8862  }
8863  else {
8864  dVtm_dT = 0.0;
8865  }
8866 
8867  V0 = vbi - phi_local;
8868 
8869 
8870 // begin of v3.0 block addition
8871 // B/S built-in potential lowering calculation
8872  if (soiMod == 0) // BSIMPD - v3.2
8873  {
8874  Vbsmos = Vbs;
8875  dVbsmos_dVg = 0.0;
8876  dVbsmos_dVd = 0.0;
8877  dVbsmos_dVb = 1.0;
8878  dVbsmos_dVe = 0.0;
8879  if (selfheat) dVbsmos_dT = 0.0;
8880  else dVbsmos_dT = 0.0;
8881 
8882  Vbp = Vbs - Vps;
8883  dVbp_dVb = 1;
8884  }
8885  else // soiMod = 1 or 2: adding FD module on top of BSIMPD
8886  {
8887  // prepare Vbs0 & Vbs0mos for VthFD calculation
8888  T0 = -model_.dvbd1 * paramPtr->leff / paramPtr->litl;
8889  T1 = model_.dvbd0 * (exp(0.5*T0) + 2*exp(T0));
8890  T2 = T1 * (vbi - phi_local);
8891  T3 = 0.5 * paramPtr->qsi / model_.csi; // v3.2
8892  Vbs0t = phi_local - T3 + model_.vbsa + T2;
8893  if (selfheat)
8894  dVbs0t_dT = T1 * dvbi_dT;
8895  else
8896  dVbs0t_dT = 0.0;
8897 
8898  T0 = 1 + model_.csi / Cbox;
8899  T3 = -model_.dk2b * paramPtr->leff / paramPtr->litl;
8900  T5 = model_.k2b * (exp(0.5*T3) + 2*exp(T3));
8901  T1 = (model_.k1b - T5) / T0;
8902  T2 = T1 * Vesfb;
8903  T4 = 1.0/(1 + Cbox / model_.csi);
8904  Vbs0 = T4 * Vbs0t + T2;
8905  dVbs0_dVe = T1;
8906  if (selfheat)
8907  dVbs0_dT = T4 * dVbs0t_dT - T1 * dvfbb_dT;
8908  else
8909  dVbs0_dT = 0.0;
8910 
8911 
8912  // zero field body potential calc
8913  T1 = Vbs0t - Vbs0 - 0.005;
8914  T2 = sqrt(T1 * T1 + (2.5e-5));
8915  T3 = 0.5 * (T1 + T2);
8916  T4 = T3 * model_.csi / paramPtr->qsi; // v3.2
8917  Vbs0mos = Vbs0 - 0.5 * T3 * T4;
8918  T5 = 0.5 * T4 * (1 + T1 / T2);
8919  dVbs0mos_dVe = dVbs0_dVe * (1 + T5);
8920  if (selfheat)
8921  dVbs0mos_dT = dVbs0_dT * (1 + T5) - T5 * dVbs0t_dT;
8922  else
8923  dVbs0mos_dT = 0.0;
8924 
8925 
8926  // set the upperbound of Vbs0mos to be phi_local for sqrt calc.
8927  T1 = phi_local - 0.02;
8928  T2 = T1 - Vbs0mos - 0.005;
8929  T3 = sqrt(T2 * T2 + 4.0 * 0.005);
8930  Vbs0mos = T1 - 0.5 * (T2 + T3);
8931  T4 = 0.5 * (1 + T2 / T3);
8932  dVbs0mos_dVe = T4 * dVbs0mos_dVe;
8933  if (selfheat)
8934  dVbs0mos_dT = T4 * dVbs0mos_dT;
8935  else dVbs0mos_dT = 0.0;
8936 
8937 
8938  // VthFD calculation
8939  Phis = phi_local - Vbs0mos;
8940  dPhis_dVb = -1; // w.r.t Vbs0mos
8941  sqrtPhis = sqrt(Phis);
8942  dsqrtPhis_dVb = -0.5 / sqrtPhis;
8943  Xdep = Xdep0 * sqrtPhis / sqrtPhi;
8944  dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb;
8945  T3 = sqrt(Xdep);
8946 
8947  T0 = paramPtr->dvt2 * Vbs0mos;
8948  if (T0 >= - 0.5)
8949  { T1 = 1.0 + T0;
8950  T2 = paramPtr->dvt2 ;
8951  }
8952  else // Added to avoid any discontinuity problems caused by dvt2
8953  { T4 = 1.0 / (3.0 + 8.0 * T0);
8954  T1 = (1.0 + 3.0 * T0) * T4;
8955  T2 = paramPtr->dvt2 * T4 * T4 ;
8956  }
8957  lt1 = model_.factor1 * T3 * T1;
8958  dlt1_dVb =model_.factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
8959 
8960  T0 = paramPtr->dvt2w * Vbs0mos;
8961  if (T0 >= - 0.5)
8962  { T1 = 1.0 + T0;
8963  T2 = paramPtr->dvt2w ;
8964  }
8965  else // Added to avoid any discontinuity problems caused by dvt2w
8966  { T4 = 1.0 / (3.0 + 8.0 * T0);
8967  T1 = (1.0 + 3.0 * T0) * T4;
8968  T2 = paramPtr->dvt2w * T4 * T4 ;
8969  }
8970  ltw= model_.factor1 * T3 * T1;
8971  dltw_dVb=model_.factor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
8972 
8973  T0 = -0.5 * paramPtr->dvt1 * Leff / lt1;
8974  if (T0 > -EXPL_THRESHOLD)
8975  { T1 = exp(T0);
8976  Theta0 = T1 * (1.0 + 2.0 * T1);
8977  dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb;
8978  dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb;
8979  }
8980  else
8981  { T1 = MIN_EXPL;
8982  Theta0 = T1 * (1.0 + 2.0 * T1);
8983  dTheta0_dVb = 0.0;
8984  }
8985 
8986  thetavth = paramPtr->dvt0 * Theta0;
8987  Delt_vth = thetavth * V0;
8988  dDelt_vth_dVb = paramPtr->dvt0 * dTheta0_dVb * V0;
8989  if (selfheat) dDelt_vth_dT = thetavth * dvbi_dT;
8990  else dDelt_vth_dT = 0.0;
8991 
8992  T0 = -0.5 * paramPtr->dvt1w * paramPtr->weff * Leff / ltw;
8993  if (T0 > -EXPL_THRESHOLD)
8994  { T1 = exp(T0);
8995  T2 = T1 * (1.0 + 2.0 * T1);
8996  dT1_dVb = -T0 / ltw * T1 * dltw_dVb;
8997  dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb;
8998  }
8999  else
9000  { T1 = MIN_EXPL;
9001  T2 = T1 * (1.0 + 2.0 * T1);
9002  dT2_dVb = 0.0;
9003  }
9004 
9005  T0 = paramPtr->dvt0w * T2;
9006  DeltVthw = T0 * V0;
9007  dDeltVthw_dVb = paramPtr->dvt0w * dT2_dVb * V0;
9008  if (selfheat) dDeltVthw_dT = T0 * dvbi_dT;
9009  else dDeltVthw_dT = 0.0;
9010 
9011  T0 = sqrt(1.0 + paramPtr->nlx / Leff);
9012  T1 = (paramPtr->kt1 + paramPtr->kt1l / Leff
9013  + paramPtr->kt2 * Vbs0mos);
9014  DeltVthtemp = paramPtr->k1eff * (T0 - 1.0) * sqrtPhi + T1
9015  * TempRatioMinus1;
9016  if (selfheat)
9017  dDeltVthtemp_dT = T1 / model_.tnom;
9018  else
9019  dDeltVthtemp_dT = 0.0;
9020 
9021  tmp2 = model_.tox * phi_local
9022  / (paramPtr->weff + paramPtr->w0);
9023 
9024  T3 = paramPtr->eta0 + paramPtr->etab * Vbs0mos;
9025  if (T3 < 1.0e-4) // avoid discontinuity problems caused by etab
9026  { T9 = 1.0 / (3.0 - 2.0e4 * T3);
9027  T3 = (2.0e-4 - T3) * T9;
9028  T4 = T9 * T9 * paramPtr->etab;
9029  dT3_dVb = T4 ;
9030  }
9031  else
9032  {
9033  dT3_dVb = paramPtr->etab ;
9034  }
9035  DIBL_Sft = T3 * paramPtr->theta0vb0 * Vds;
9036  dDIBL_Sft_dVd = paramPtr->theta0vb0 * T3;
9037  dDIBL_Sft_dVb = paramPtr->theta0vb0 * Vds * dT3_dVb;
9038 
9039  VthFD = model_.dtype * paramPtr->vth0 + paramPtr->k1eff
9040  * (sqrtPhis - sqrtPhi) - paramPtr->k2
9041  * Vbs0mos- Delt_vth - DeltVthw +(paramPtr->k3 + paramPtr->k3b
9042  * Vbs0mos) * tmp2 + DeltVthtemp - DIBL_Sft;
9043 
9044  T6 = paramPtr->k3b * tmp2 - paramPtr->k2
9046  dVthFD_dVb = paramPtr->k1eff * dsqrtPhis_dVb
9047  - dDelt_vth_dVb - dDeltVthw_dVb
9048  + T6 - dDIBL_Sft_dVb; // this is actually dVth_dVbs0mos
9049  dVthFD_dVe = dVthFD_dVb * dVbs0mos_dVe;
9050  dVthFD_dVd = -dDIBL_Sft_dVd;
9051  if (selfheat)
9052  dVthFD_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT
9053  + dVthFD_dVb * dVbs0mos_dT;
9054  else dVthFD_dT = 0.0;
9055 
9056 
9057  // VtgseffFD calculation for PhiFD
9058  VtgsFD = VthFD - Vgs_eff;
9059  T10 = model_.nofffd * Vtm;
9060  CEXP((VtgsFD - model_.vofffd)/ T10, ExpVtgsFD, T0);
9061  VtgseffFD = T10 * log(1.0 + ExpVtgsFD);
9062  T0 /= (1.0 + ExpVtgsFD);
9063  dVtgseffFD_dVd = T0 * dVthFD_dVd;
9064  dVtgseffFD_dVg = -T0 * dVgs_eff_dVg;
9065  dVtgseffFD_dVe = T0 * dVthFD_dVe;
9066  if (selfheat)
9067  dVtgseffFD_dT = T0 * (dVthFD_dT - (VtgsFD - model_.vofffd)
9068  / Temp) + VtgseffFD/Temp;
9069  else dVtgseffFD_dT = 0.0;
9070 
9071 
9072  // surface potential modeling at strong inversion: PhiON
9073  VgstFD = Vgs_eff - VthFD;
9074  CEXP((VgstFD - model_.vofffd)/ T10, ExpVgstFD, T0);
9075  VgsteffFD = T10 * log(1.0 + ExpVgstFD);
9076  T0 /= (1.0 + ExpVgstFD);
9077  dVgsteffFD_dVd = -T0 * dVthFD_dVd;
9078  dVgsteffFD_dVg = T0 * dVgs_eff_dVg;
9079  dVgsteffFD_dVe = -T0 * dVthFD_dVe;
9080  if (selfheat)
9081  dVgsteffFD_dT = T0 * (-dVthFD_dT - (VgstFD - model_.vofffd)
9082  / Temp) + VgsteffFD/Temp;
9083  else dVgsteffFD_dT = 0.0;
9084 
9085 
9086  T1 = model_.moinFD*paramPtr->k1eff*Vtm*Vtm;
9087  if (selfheat) dT1_dT = 2*T1/Temp;
9088  else dT1_dT=0.0;
9089 
9090  T2 = VgsteffFD+ 2*paramPtr->k1eff*sqrt(phi_local);
9091  dT2_dVg = dVgsteffFD_dVg;
9092  dT2_dVd = dVgsteffFD_dVd;
9093  dT2_dVe = dVgsteffFD_dVe;
9094  if (selfheat) dT2_dT = dVgsteffFD_dT;
9095  else dT2_dT = 0.0;
9096 
9097  T0 = 1+ VgsteffFD * T2 / T1;
9098  dT0_dVg = (VgsteffFD * dT2_dVg + T2 * dVgsteffFD_dVg) / T1;
9099  dT0_dVd = (VgsteffFD * dT2_dVd + T2 * dVgsteffFD_dVd) / T1;
9100  dT0_dVe = (VgsteffFD * dT2_dVe + T2 * dVgsteffFD_dVe) / T1;
9101  if (selfheat)
9102  dT0_dT = (VgsteffFD * (dT2_dT - T2/T1 * dT1_dT) + T2
9103  * dVgsteffFD_dT) / T1;
9104  else dT0_dT = 0.0;
9105 
9106 
9107  PhiON = phi_local + Vtm* log(T0) ;
9108  dPhiON_dVg = Vtm* dT0_dVg/T0 ;
9109  dPhiON_dVd = Vtm* dT0_dVd/T0 ;
9110  dPhiON_dVe = Vtm* dT0_dVe/T0 ;
9111  if (selfheat)
9112  dPhiON_dT = Vtm* dT0_dT/T0 + (PhiON-phi_local)/Temp ;
9113  else dPhiON_dT = 0.0;
9114 
9115 
9116  // surface potential from subthreshold to inversion: PhiFD
9117  T0 = model_.cox / (model_.cox +
9118  1.0/(1.0/model_.csi + 1.0/Cbox));
9119  PhiFD = PhiON - T0 * VtgseffFD;
9120  dPhiFD_dVg = dPhiON_dVg - T0 * dVtgseffFD_dVg;
9121  dPhiFD_dVd = dPhiON_dVd - T0 * dVtgseffFD_dVd;
9122  dPhiFD_dVe = dPhiON_dVe - T0 * dVtgseffFD_dVe;
9123  if (selfheat)
9124  dPhiFD_dT = dPhiON_dT - T0 * dVtgseffFD_dT;
9125  else dPhiFD_dT = 0;
9126 
9127 
9128  // built-in potential lowering: Vbs0
9129  T0 = -model_.dvbd1 * paramPtr->leff / paramPtr->litl;
9130  T1 = model_.dvbd0 * (exp(0.5*T0) + 2*exp(T0));
9131  T2 = T1 * (vbi - phi_local);
9132  T3 = 0.5 * paramPtr->qsi / model_.csi; // v3.2
9133  Vbs0t = PhiFD - T3 + model_.vbsa + T2;
9134  dVbs0t_dVg = dPhiFD_dVg;
9135  dVbs0t_dVd = dPhiFD_dVd;
9136  dVbs0t_dVe = dPhiFD_dVe;
9137  if (selfheat)
9138  dVbs0t_dT = dPhiFD_dT + T1 * dvbi_dT;
9139  else dVbs0t_dT = 0;
9140 
9141 
9142  T0 = 1 + model_.csi / Cbox;
9143  T3 = -model_.dk2b * paramPtr->leff / paramPtr->litl;
9144  T5 = model_.k2b * (exp(0.5*T3) + 2*exp(T3));
9145  T1 = (model_.k1b - T5) / T0;
9146  T2 = T1 * Vesfb;
9147  T0 = 1.0/(1 + Cbox / model_.csi);
9148  Vbs0 = T0 * Vbs0t + T2;
9149  dVbs0_dVg = T0 * dVbs0t_dVg;
9150  dVbs0_dVd = T0 * dVbs0t_dVd;
9151  dVbs0_dVe = T0 * dVbs0t_dVe + T1;
9152  if (selfheat)
9153  dVbs0_dT = T0 * dVbs0t_dT - T1 * dvfbb_dT;
9154  else
9155  dVbs0_dT = 0.0;
9156 
9157 
9158  // set lowerbound of Vbs (from SPICE) to Vbs0: Vbsitf
9159  // (Vbs at back interface)
9160  if (soiMod == 2) // v3.2 - v3.1 ideal FD: Vbsitf is pinned at Vbs0
9161  {
9162  Vbs = Vbsitf = Vbs0 + OFF_Vbsitf;
9163  dVbsitf_dVg = dVbs0_dVg;
9164  dVbsitf_dVd = dVbs0_dVd;
9165  dVbsitf_dVe = dVbs0_dVe;
9166  dVbsitf_dVb = 0.0;
9167  if (selfheat) dVbsitf_dT = dVbs0_dT;
9168  else dVbsitf_dT = 0;
9169  }
9170  else // soiMod = 1
9171  {
9172  T1 = Vbs - (Vbs0 + OFF_Vbsitf) - 0.01;
9173  T2 = sqrt(T1*T1 + 0.0001);
9174  T3 = 0.5 * (1 + T1/T2);
9175  Vbsitf = (Vbs0 + OFF_Vbsitf) + 0.5 * (T1 + T2);
9176  dVbsitf_dVg = (1 - T3) * dVbs0_dVg;
9177  dVbsitf_dVd = (1 - T3) * dVbs0_dVd;
9178  dVbsitf_dVe = (1 - T3) * dVbs0_dVe;
9179  dVbsitf_dVb = T3 ;
9180  if (selfheat) dVbsitf_dT = (1 - T3) * dVbs0_dT;
9181  else dVbsitf_dT = 0.0;
9182  }
9183 
9184  // Based on Vbsitf, calculate zero-field body potential for MOS: Vbsmos
9185  T1 = Vbs0t - Vbsitf - 0.005;
9186  T2 = sqrt(T1 * T1 + (2.5e-5));
9187  T3 = 0.5 * (T1 + T2);
9188  T4 = T3 * model_.csi / paramPtr->qsi; // v3.2
9189  Vbsmos = Vbsitf - 0.5 * T3 * T4;
9190  T5 = 0.5 * T4 * (1 + T1 / T2);
9191  dVbsmos_dVg = dVbsitf_dVg * (1 + T5) - T5 * dVbs0t_dVg;
9192  dVbsmos_dVd = dVbsitf_dVd * (1 + T5) - T5 * dVbs0t_dVd;
9193  dVbsmos_dVb = dVbsitf_dVb * (1 + T5);
9194  dVbsmos_dVe = dVbsitf_dVe * (1 + T5) - T5 * dVbs0t_dVe;
9195  if (selfheat)
9196  dVbsmos_dT = dVbsitf_dT * (1 + T5) - T5 * dVbs0t_dT;
9197  else
9198  dVbsmos_dT = 0.0;
9199  // Vbsmos should be used in MOS after some limiting (Vbseff)
9200 
9201 
9202  Vbp = Vbs - Vps;
9203  dVbp_dVb = 1;
9204  }
9205 // end of v3.0 block edition
9206 
9207 // v3.0 modification
9208  // T2 is Vbsmos limited above Vbsc=-5
9209  T0 = Vbsmos + 5 - 0.001;
9210  T1 = sqrt(T0 * T0 - 0.004 * (-5));
9211  T2 = (-5) + 0.5 * (T0 + T1);
9212  dT2_dVb = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVb;
9213  dT2_dVg = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVg;
9214  dT2_dVd = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVd;
9215  dT2_dVe = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVe;
9216  if (selfheat) dT2_dT = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dT;
9217  else dT2_dT = 0.0;
9218 
9219  // Vbsh is T2 limited below 1.5
9220  T0 = 1.5;
9221  T1 = T0 - T2 - 0.002;
9222  T3 = sqrt(T1 * T1 + 0.008 * T0);
9223  Vbsh = T0 - 0.5 * (T1 + T3);
9224  dVbsh_dVb = 0.5 * (1.0 + T1 / T3) * dT2_dVb;
9225  dVbsh_dVg = 0.5 * (1.0 + T1 / T3) * dT2_dVg;
9226  dVbsh_dVd = 0.5 * (1.0 + T1 / T3) * dT2_dVd;
9227  dVbsh_dVe = 0.5 * (1.0 + T1 / T3) * dT2_dVe;
9228  if (selfheat) dVbsh_dT = 0.5 * (1.0 + T1 / T3) * dT2_dT;
9229  else dVbsh_dT = 0.0;
9230 
9231  // Vbseff is Vbsh limited to 0.95*phi_local
9232  T0 = 0.95 * phi_local;
9233  T1 = T0 - Vbsh - 0.002;
9234  T2 = sqrt(T1 * T1 + 0.008 * T0);
9235  Vbseff = T0 - 0.5 * (T1 + T2);
9236  dVbseff_dVb = 0.5 * (1.0 + T1 / T2) * dVbsh_dVb;
9237  dVbseff_dVg = 0.5 * (1.0 + T1 / T2) * dVbsh_dVg;
9238  dVbseff_dVd = 0.5 * (1.0 + T1 / T2) * dVbsh_dVd;
9239  dVbseff_dVe = 0.5 * (1.0 + T1 / T2) * dVbsh_dVe;
9240  if (selfheat) dVbseff_dT = 0.5 * (1.0 + T1 / T2) * dVbsh_dT;
9241  else dVbseff_dT = 0.0;
9242  vbseff = Vbseff; // SPICE sol.
9243 
9244 // end of v3.0 modification
9245 
9246  // Below all the variables refer to Vbseff
9247  if (dVbseff_dVb < 1e-20) {
9248  dVbseff_dVb = 1e-20;
9249  dVbsh_dVb *= 1e20;
9250  }
9251  else
9252  dVbsh_dVb /= dVbseff_dVb;
9253 
9254  Phis = phi_local - Vbseff;
9255  dPhis_dVb = -1;
9256  sqrtPhis = sqrt(Phis);
9257  dsqrtPhis_dVb = -0.5 / sqrtPhis;
9258 
9259  Xdep = Xdep0 * sqrtPhis / sqrtPhi;
9260  dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb;
9261 
9262  // Vth Calculation
9263  T3 = sqrt(Xdep);
9264 
9265  T0 = paramPtr->dvt2 * Vbseff;
9266  if (T0 >= - 0.5)
9267  { T1 = 1.0 + T0;
9268  T2 = paramPtr->dvt2 ;
9269  }
9270  else
9271  // Added to avoid any discontinuity problems caused by dvt2
9272  { T4 = 1.0 / (3.0 + 8.0 * T0);
9273  T1 = (1.0 + 3.0 * T0) * T4;
9274  T2 = paramPtr->dvt2 * T4 * T4 ;
9275  }
9276  lt1 = model_.factor1 * T3 * T1;
9277  dlt1_dVb =model_.factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
9278 
9279  T0 = paramPtr->dvt2w * Vbseff;
9280  if (T0 >= - 0.5)
9281  { T1 = 1.0 + T0;
9282  T2 = paramPtr->dvt2w ;
9283  }
9284  else
9285  // Added to avoid any discontinuity problems caused by dvt2w
9286  { T4 = 1.0 / (3.0 + 8.0 * T0);
9287  T1 = (1.0 + 3.0 * T0) * T4;
9288  T2 = paramPtr->dvt2w * T4 * T4 ;
9289  }
9290  ltw= model_.factor1 * T3 * T1;
9291  dltw_dVb=model_.factor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
9292 
9293  T0 = -0.5 * paramPtr->dvt1 * Leff / lt1;
9294  if (T0 > -EXPL_THRESHOLD)
9295  { T1 = exp(T0);
9296  Theta0 = T1 * (1.0 + 2.0 * T1);
9297  dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb;
9298  dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb;
9299  }
9300  else
9301  { T1 = MIN_EXPL;
9302  Theta0 = T1 * (1.0 + 2.0 * T1);
9303  dTheta0_dVb = 0.0;
9304  }
9305 
9306  thetavth = paramPtr->dvt0 * Theta0;
9307  Delt_vth = thetavth * V0;
9308  dDelt_vth_dVb = paramPtr->dvt0 * dTheta0_dVb * V0;
9309  if (selfheat) dDelt_vth_dT = thetavth * dvbi_dT;
9310  else dDelt_vth_dT = 0.0;
9311 
9312  T0 = -0.5 * paramPtr->dvt1w * paramPtr->weff * Leff / ltw;
9313  if (T0 > -EXPL_THRESHOLD)
9314  { T1 = exp(T0);
9315  T2 = T1 * (1.0 + 2.0 * T1);
9316  dT1_dVb = -T0 / ltw * T1 * dltw_dVb;
9317  dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb;
9318  }
9319  else
9320  { T1 = MIN_EXPL;
9321  T2 = T1 * (1.0 + 2.0 * T1);
9322  dT2_dVb = 0.0;
9323  }
9324 
9325  T0 = paramPtr->dvt0w * T2;
9326  DeltVthw = T0 * V0;
9327  dDeltVthw_dVb = paramPtr->dvt0w * dT2_dVb * V0;
9328  if (selfheat) dDeltVthw_dT = T0 * dvbi_dT;
9329  else dDeltVthw_dT = 0.0;
9330 
9331  T0 = sqrt(1.0 + paramPtr->nlx / Leff);
9332  T1 = (paramPtr->kt1 + paramPtr->kt1l / Leff
9333  + paramPtr->kt2 * Vbseff);
9334  DeltVthtemp = paramPtr->k1eff * (T0 - 1.0) * sqrtPhi
9335  + T1 * TempRatioMinus1;
9336  if (selfheat)
9337  dDeltVthtemp_dT = T1 / model_.tnom;
9338  else
9339  dDeltVthtemp_dT = 0.0;
9340 
9341  tmp2 = model_.tox * phi_local
9342  / (paramPtr->weff + paramPtr->w0);
9343 
9344  T3 = paramPtr->eta0 + paramPtr->etab * Vbseff;
9345  if (T3 < 1.0e-4) // avoid discontinuity problems caused by etab
9346  { T9 = 1.0 / (3.0 - 2.0e4 * T3);
9347  T3 = (2.0e-4 - T3) * T9;
9348  T4 = T9 * T9 * paramPtr->etab;
9349  dT3_dVb = T4 ;
9350  }
9351  else
9352  {
9353  dT3_dVb = paramPtr->etab ;
9354  }
9355  DIBL_Sft = T3 * paramPtr->theta0vb0 * Vds;
9356  dDIBL_Sft_dVd = paramPtr->theta0vb0 * T3;
9357  dDIBL_Sft_dVb = paramPtr->theta0vb0 * Vds * dT3_dVb;
9358 
9359  T9 = 2.2361 / sqrtPhi;
9360  sqrtPhisExt = sqrtPhis - T9 * (Vbsh - Vbseff);
9361  dsqrtPhisExt_dVb = dsqrtPhis_dVb - T9 * (dVbsh_dVb - 1);
9362 
9363  Vth = model_.dtype * paramPtr->vth0 + paramPtr->k1eff
9364  * (sqrtPhisExt - sqrtPhi) - paramPtr->k2
9365  * Vbseff- Delt_vth - DeltVthw +(paramPtr->k3 + paramPtr->k3b
9366  * Vbseff) * tmp2 + DeltVthtemp - DIBL_Sft;
9367  von = Vth;
9368 
9369  T6 = paramPtr->k3b * tmp2 - paramPtr->k2
9371  dVth_dVb = paramPtr->k1eff * dsqrtPhisExt_dVb
9372  - dDelt_vth_dVb - dDeltVthw_dVb
9373  + T6 - dDIBL_Sft_dVb;
9374  // this is actually dVth_dVbseff
9375 
9376  dVth_dVd = -dDIBL_Sft_dVd;
9377  if (selfheat)
9378  dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT;
9379  else
9380  dVth_dT = 0.0;
9381 
9382  // dVthzb_dT calculation
9383  if ((model_.capMod == 3) && (selfheat == 1)) {
9384  T3zb = sqrt(Xdep0);
9385  ltwzb = lt1zb = model_.factor1 * T3zb;
9386 
9387  T0 = -0.5 * paramPtr->dvt1 * Leff / lt1zb;
9388  if (T0 > -EXPL_THRESHOLD)
9389  { T1 = exp(T0);
9390  Theta0zb = T1 * (1.0 + 2.0 * T1);
9391  }
9392  else
9393  { T1 = MIN_EXPL;
9394  Theta0zb = T1 * (1.0 + 2.0 * T1);
9395  }
9396  Delt_vthzb = paramPtr->dvt0 * Theta0zb * V0;
9397  dDelt_vthzb_dT = paramPtr->dvt0 * Theta0zb * dvbi_dT;
9398 
9399  T0 = -0.5 * paramPtr->dvt1w * paramPtr->weff * Leff / ltwzb;
9400  if (T0 > -EXPL_THRESHOLD)
9401  { T1 = exp(T0);
9402  T2 = T1 * (1.0 + 2.0 * T1);
9403  }
9404  else
9405  { T1 = MIN_EXPL;
9406  T2 = T1 * (1.0 + 2.0 * T1);
9407  }
9408  T0 = paramPtr->dvt0w * T2;
9409  DeltVthwzb = T0 * V0;
9410  dDeltVthwzb_dT = T0 * dvbi_dT;
9411 
9412  T0 = sqrt(1.0 + paramPtr->nlx / Leff);
9413  T1 = (paramPtr->kt1 + paramPtr->kt1l / Leff);
9414  DeltVthtempzb = paramPtr->k1eff * (T0 - 1.0) * sqrtPhi
9415  + T1 * TempRatioMinus1;
9416  dDeltVthtempzb_dT = T1 / model_.tnom;
9417 
9418  Vthzb = model_.dtype * paramPtr->vth0
9419  - Delt_vthzb - DeltVthwzb + paramPtr->k3 * tmp2
9420  + DeltVthtempzb;
9421  dVthzb_dT = dDeltVthtempzb_dT - dDelt_vthzb_dT - dDeltVthwzb_dT;
9422  }
9423 
9424 // Calculate nstar v3.2
9425  nstar = vtm / CONSTQ * (model_.cox + CONSTEPSSI /
9426  Xdep + paramPtr->cit);
9427 // Calculate n
9428  T2 = paramPtr->nfactor * CONSTEPSSI / Xdep;
9429  dT2_dVb = - T2 / Xdep * dXdep_dVb;
9430 
9431  T3 = paramPtr->cdsc + paramPtr->cdscb * Vbseff
9432  + paramPtr->cdscd * Vds;
9433  dT3_dVb = paramPtr->cdscb;
9434  dT3_dVd = paramPtr->cdscd;
9435 
9436  T4 = (T2 + T3 * Theta0 + paramPtr->cit) / model_.cox;
9437  dT4_dVb = (dT2_dVb + Theta0 * dT3_dVb + dTheta0_dVb * T3)
9438  / model_.cox;
9439  dT4_dVd = Theta0 * dT3_dVd / model_.cox;
9440 
9441  if (T4 >= -0.5)
9442  { n = 1.0 + T4;
9443  dn_dVb = dT4_dVb;
9444  dn_dVd = dT4_dVd;
9445  }
9446  else
9447  // avoid discontinuity problems caused by T4 *
9448  { T0 = 1.0 / (3.0 + 8.0 * T4);
9449  n = (1.0 + 3.0 * T4) * T0;
9450  T0 *= T0;
9451  dn_dVb = T0 * dT4_dVb;
9452  dn_dVd = T0 * dT4_dVd;
9453  }
9454 
9455 // Effective Vgst (Vgsteff_local) Calculation
9456 
9457  Vgst = Vgs_eff - Vth;
9459  dVgst_dVd = -dVth_dVd;
9460  dVgst_dVb = -dVth_dVb;
9461 
9462  T10 = 2.0 * n * Vtm;
9463  VgstNVt = Vgst / T10;
9464  ExpArg = (2.0 * paramPtr->voff - Vgst) / T10;
9465 
9466 
9467  // MCJ: Very small Vgst
9468  if (VgstNVt > EXPL_THRESHOLD)
9469  { Vgsteff_local = Vgst;
9470  // T0 is dVgsteff_dVbseff
9471  T0 = -dVth_dVb;
9472  dVgsteff_dVg = dVgs_eff_dVg + T0 * dVbseff_dVg; // v3.0
9473  dVgsteff_dVd = -dVth_dVd + T0 * dVbseff_dVd; // v3.0
9474  dVgsteff_dVb = T0 * dVbseff_dVb;
9475  dVgsteff_dVe = T0 * dVbseff_dVe; // v3.0
9476  if (selfheat)
9477  dVgsteff_dT = -dVth_dT + T0 * dVbseff_dT; // v3.0
9478  else
9479  dVgsteff_dT = 0.0;
9480  }
9481  else if (ExpArg > EXPL_THRESHOLD)
9482  { T0 = (Vgst - paramPtr->voff) / (n * Vtm);
9483  ExpVgst = exp(T0);
9484  Vgsteff_local = Vtm * paramPtr->cdep0 / model_.cox * ExpVgst;
9485  T3 = Vgsteff_local / (n * Vtm) ;
9486  // T1 is dVgsteff_dVbseff
9487  T1 = -T3 * (dVth_dVb + T0 * Vtm * dn_dVb);
9488  dVgsteff_dVg = T3 * dVgs_eff_dVg+ T1 * dVbseff_dVg; // v3.0
9489  dVgsteff_dVd = -T3 * (dVth_dVd + T0 * Vtm * dn_dVd)+
9490  T1 * dVbseff_dVd; // v3.0
9491  dVgsteff_dVe = T1 * dVbseff_dVe; // v3.0
9492  dVgsteff_dVb = T1 * dVbseff_dVb;
9493  if (selfheat)
9494  dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * n)
9495  + Vgsteff_local / Temp+ T1 * dVbseff_dT; // v3.0
9496  else
9497  dVgsteff_dT = 0.0;
9498  }
9499  else
9500  { ExpVgst = exp(VgstNVt);
9501  T1 = T10 * log(1.0 + ExpVgst);
9502 
9503  dT1_dVg = ExpVgst / (1.0 + ExpVgst);
9504  dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb)
9505  + T1 / n * dn_dVb;
9506  dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd)
9507  + T1 / n * dn_dVd;
9508  T3 = (1.0 / Temp);
9509  if (selfheat)
9510  dT1_dT = -dT1_dVg * (dVth_dT + Vgst * T3) + T1 * T3;
9511  else
9512  dT1_dT = 0.0;
9513 
9514  dT2_dVg = -model_.cox / (Vtm * paramPtr->cdep0) * exp(ExpArg);
9515  T2 = 1.0 - T10 * dT2_dVg;
9516  dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd)
9517  + (T2 - 1.0) / n * dn_dVd;
9518  dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm * ExpArg * dn_dVb)
9519  + (T2 - 1.0) / n * dn_dVb;
9520  if (selfheat)
9521  dT2_dT = -dT2_dVg * (dVth_dT - ExpArg * T10 * T3);
9522  else
9523  dT2_dT = 0.0;
9524 
9525  Vgsteff_local = T1 / T2;
9526  T3 = T2 * T2;
9527  // T4 is dVgsteff_dVbseff
9528  T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3;
9529  dVgsteff_dVb = T4 * dVbseff_dVb;
9530  dVgsteff_dVe = T4 * dVbseff_dVe; // v3.0
9531  dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3 * dVgs_eff_dVg
9532  + T4 * dVbseff_dVg; // v3.0
9533  dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3 +
9534  T4 * dVbseff_dVd; // v3.0
9535  if (selfheat)
9536  dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) / T3 +
9537  T4 * dVbseff_dT; // v3.0
9538  else
9539  dVgsteff_dT = 0.0;
9540  }
9541  Vgst2Vtm = Vgsteff_local + 2.0 * Vtm;
9542  if (selfheat)
9543  dVgst2Vtm_dT = dVgsteff_dT + 2.0 * dVtm_dT; // v3.1.1 bug fix
9544  else dVgst2Vtm_dT = 0.0;
9545  Vgsteff = Vgsteff_local; // v2.2.3 bug fix
9546 
9547 // Calculate Effective Channel Geometry
9548  T9 = sqrtPhis - sqrtPhi;
9549  Weff = paramPtr->weff - (2.0 - nbc) *
9550  (paramPtr->dwg * Vgsteff_local + paramPtr->dwb * T9);
9551  dWeff_dVg = -(2.0 - nbc) * paramPtr->dwg;
9552  dWeff_dVb = -(2.0 - nbc) * paramPtr->dwb * dsqrtPhis_dVb;
9553 
9554  if (Weff < 2.0e-8) // to avoid the discontinuity problem due to Weff
9555  { T0 = 1.0 / (6.0e-8 - 2.0 * Weff);
9556  Weff = 2.0e-8 * (4.0e-8 - Weff) * T0;
9557  T0 *= T0 * 4.0e-16;
9558  dWeff_dVg *= T0;
9559  dWeff_dVb *= T0;
9560  }
9561 
9562  T0 = paramPtr->prwg * Vgsteff_local + paramPtr->prwb * T9;
9563  if (T0 >= -0.9)
9564  { Rds = rds0 * (1.0 + T0);
9565  dRds_dVg = rds0 * paramPtr->prwg;
9566  dRds_dVb = rds0 * paramPtr->prwb * dsqrtPhis_dVb;
9567 
9568  if (selfheat && (Rds!=0.0)) dRds_dT = (1.0 + T0) * drds0_dT;
9569  else dRds_dT = 0.0;
9570  }
9571  else
9572  // to avoid the discontinuity problem due to prwg and prwb
9573  { T1 = 1.0 / (17.0 + 20.0 * T0);
9574  Rds = rds0 * (0.8 + T0) * T1;
9575  T1 *= T1;
9576  dRds_dVg = rds0 * paramPtr->prwg * T1;
9577  dRds_dVb = rds0 * paramPtr->prwb * dsqrtPhis_dVb * T1;
9578 
9579  if (selfheat && (Rds!=0.0)) dRds_dT = (0.8 + T0) * T1 * drds0_dT;
9580  else dRds_dT = 0.0;
9581  }
9582  rds = Rds; // v2.2.3 bug fix
9583 
9584 // Calculate Abulk_local
9585  if (paramPtr->a0 == 0.0) {
9586  Abulk0 = Abulk_local = 1.0;
9587  dAbulk0_dVb = dAbulk_dVg = dAbulk_dVb = 0.0;
9588  }
9589  else {
9590  T10 = paramPtr->keta * Vbsh;
9591  if (T10 >= -0.9) {
9592  T11 = 1.0 / (1.0 + T10);
9593  dT11_dVb = -paramPtr->keta * T11 * T11 * dVbsh_dVb;
9594  }
9595  else { // added to avoid the problems caused by Keta
9596  T12 = 1.0 / (0.8 + T10);
9597  T11 = (17.0 + 20.0 * T10) * T12;
9598  dT11_dVb = -paramPtr->keta * T12 * T12 * dVbsh_dVb;
9599  }
9600 
9601 // v3.0 bug fix
9602  T10 = phi_local + paramPtr->ketas;
9603 
9604  T13 = (Vbsh * T11) / T10;
9605  dT13_dVb = (Vbsh * dT11_dVb + T11 * dVbsh_dVb) / T10;
9606 
9607  // limit 1/sqrt(1-T13) to 6, starting at T13=0.96
9608  if (T13 < 0.96) {
9609  T14 = 1 / sqrt(1-T13);
9610  T10 = 0.5 * T14 / (1-T13);
9611  dT14_dVb = T10 * dT13_dVb;
9612  }
9613  else {
9614  T11 = 1.0 / (1.0 - 1.043406*T13);
9615  T14 = (6.00167 - 6.26044 * T13) * T11;
9616  T10 = 0.001742 * T11 * T11;
9617  dT14_dVb = T10 * dT13_dVb;
9618  }
9619 
9620 // v3.0 bug fix
9621  T10 = 0.5 * paramPtr->k1eff / sqrt(phi_local + paramPtr->ketas);
9622 
9623  T1 = T10 * T14;
9624  dT1_dVb = T10 * dT14_dVb;
9625 
9626  T9 = sqrt(paramPtr->xj * Xdep);
9627  tmp1 = Leff + 2.0 * T9;
9628  T5 = Leff / tmp1;
9629  tmp2 = paramPtr->a0 * T5;
9630  tmp3 = paramPtr->weff + paramPtr->b1;
9631  tmp4 = paramPtr->b0 / tmp3;
9632  T2 = tmp2 + tmp4;
9633  dT2_dVb = -T9 * tmp2 / tmp1 / Xdep * dXdep_dVb;
9634  T6 = T5 * T5;
9635  T7 = T5 * T6;
9636 
9637  Abulk0 = 1 + T1 * T2;
9638  dAbulk0_dVb = T1 * dT2_dVb + T2 * dT1_dVb;
9639 
9640  T8 = paramPtr->ags * paramPtr->a0 * T7;
9641  dAbulk_dVg = -T1 * T8;
9642  Abulk_local = Abulk0 + dAbulk_dVg * Vgsteff_local;
9643 
9644  dAbulk_dVb = dAbulk0_dVb
9645  - T8 * Vgsteff_local * (dT1_dVb + 3.0 * T1 * dT2_dVb / tmp2);
9646  }
9647 
9648  if (Abulk0 < 0.01)
9649  {
9650  T9 = 1.0 / (3.0 - 200.0 * Abulk0);
9651  Abulk0 = (0.02 - Abulk0) * T9;
9652  dAbulk0_dVb *= T9 * T9;
9653  }
9654 
9655  if (Abulk_local < 0.01)
9656  {
9657  T9 = 1.0 / (3.0 - 200.0 * Abulk_local);
9658  Abulk_local = (0.02 - Abulk_local) * T9;
9659  dAbulk_dVb *= T9 * T9;
9660  T10 = T9 * T9; // 3.2 bug fix
9661  dAbulk_dVg *= T10; // 3.2 bug fix
9662  }
9663 
9664  Abulk = Abulk_local; // v3.2 for noise
9665 
9666 // Mobility calculation
9667  if (model_.mobMod == 1)
9668  { T0 = Vgsteff_local + Vth + Vth;
9669  T2 = ua + uc * Vbseff;
9670  T3 = T0 / model_.tox;
9671  T5 = T3 * (T2 + ub * T3);
9672  dDenomi_dVg = (T2 + 2.0 * ub * T3) / model_.tox;
9673  dDenomi_dVd = dDenomi_dVg * 2 * dVth_dVd;
9674  dDenomi_dVb = dDenomi_dVg * 2 * dVth_dVb + uc * T3 ;
9675  if (selfheat)
9676  dDenomi_dT = dDenomi_dVg * 2 * dVth_dT
9677  + (dua_dT + Vbseff * duc_dT + dub_dT * T3 ) * T3;
9678  else
9679  dDenomi_dT = 0.0;
9680  }
9681  else if (model_.mobMod == 2)
9682  { T5 = Vgsteff_local / model_.tox * (ua + uc * Vbseff
9683  + ub * Vgsteff_local / model_.tox);
9684  dDenomi_dVg = (ua + uc * Vbseff + 2.0 * ub * Vgsteff_local
9685  / model_.tox) / model_.tox;
9686  dDenomi_dVd = 0.0;
9687  dDenomi_dVb = Vgsteff_local * uc / model_.tox ;
9688  if (selfheat)
9689  dDenomi_dT = Vgsteff_local / model_.tox * (dua_dT + Vbseff
9690  * duc_dT + dub_dT * Vgsteff_local / model_.tox);
9691  else
9692  dDenomi_dT = 0.0;
9693  }
9694  else // mobMod == 3
9695  { T0 = Vgsteff_local + Vth + Vth;
9696  T2 = 1.0 + uc * Vbseff;
9697  T3 = T0 / model_.tox;
9698  T4 = T3 * (ua + ub * T3);
9699  T5 = T4 * T2;
9700  dDenomi_dVg = (ua + 2.0 * ub * T3) * T2 / model_.tox;
9701  dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd;
9702  dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + uc * T4 ;
9703  if (selfheat)
9704  dDenomi_dT = dDenomi_dVg * 2.0 * dVth_dT + (dua_dT + dub_dT * T3)
9705  * T3 * T2 + T4 * Vbseff * duc_dT;
9706  else
9707  dDenomi_dT = 0.0;
9708  }
9709 
9710  if (T5 >= -0.8)
9711  { Denomi = 1.0 + T5;
9712  }
9713  else // Added to avoid the discontinuity problem caused by ua and ub
9714  { T9 = 1.0 / (7.0 + 10.0 * T5);
9715  Denomi = (0.6 + T5) * T9;
9716  T9 *= T9;
9717  dDenomi_dVg *= T9;
9718  dDenomi_dVd *= T9;
9719  dDenomi_dVb *= T9;
9720  if (selfheat) dDenomi_dT *= T9;
9721  else dDenomi_dT = 0.0;
9722  }
9723 
9724  ueff = ueff_local = u0temp / Denomi;
9725  T9 = -ueff_local / Denomi;
9726  dueff_dVg = T9 * dDenomi_dVg;
9727  dueff_dVd = T9 * dDenomi_dVd;
9728  dueff_dVb = T9 * dDenomi_dVb;
9729  if (selfheat) dueff_dT = T9 * dDenomi_dT + du0temp_dT / Denomi;
9730  else dueff_dT = 0.0;
9731 
9732 // Saturation Drain Voltage Vdsat
9733  WVCox = Weff * vsattemp * model_.cox;
9734  WVCoxRds = WVCox * Rds;
9735 
9736 //dWVCoxRds_dT = WVCox * dRds_dT
9737 // + Weff * model_.cox * Rds * dvsattemp_dT;
9738 
9739  Esat = 2.0 * vsattemp / ueff_local;
9740  EsatL = Esat * Leff;
9741  T0 = -EsatL /ueff_local;
9742  dEsatL_dVg = T0 * dueff_dVg;
9743  dEsatL_dVd = T0 * dueff_dVd;
9744  dEsatL_dVb = T0 * dueff_dVb;
9745  if (selfheat)
9746  dEsatL_dT = T0 * dueff_dT + EsatL / vsattemp * dvsattemp_dT;
9747  else
9748  dEsatL_dT = 0.0;
9749 
9750  // Sqrt()
9751  a1 = paramPtr->a1;
9752  if (a1 == 0.0)
9753  { Lambda = paramPtr->a2;
9754  dLambda_dVg = 0.0;
9755  }
9756  else if (a1 > 0.0)
9757 // Added to avoid the discontinuity problem caused by a1 and a2 (Lambda)
9758  { T0 = 1.0 - paramPtr->a2;
9759  T1 = T0 - paramPtr->a1 * Vgsteff_local - 0.0001;
9760  T2 = sqrt(T1 * T1 + 0.0004 * T0);
9761  Lambda = paramPtr->a2 + T0 - 0.5 * (T1 + T2);
9762  dLambda_dVg = 0.5 * paramPtr->a1 * (1.0 + T1 / T2);
9763  }
9764  else
9765  { T1 = paramPtr->a2 + paramPtr->a1 * Vgsteff_local - 0.0001;
9766  T2 = sqrt(T1 * T1 + 0.0004 * paramPtr->a2);
9767  Lambda = 0.5 * (T1 + T2);
9768  dLambda_dVg = 0.5 * paramPtr->a1 * (1.0 + T1 / T2);
9769  }
9770 
9771  AbovVgst2Vtm = Abulk_local /Vgst2Vtm; // v2.2.3 bug fix
9772 
9773  if (Rds > 0)
9774  { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff;
9775  tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff;
9776  }
9777  else
9778  { tmp2 = dWeff_dVg / Weff;
9779  tmp3 = dWeff_dVb / Weff;
9780  }
9781  if ((Rds == 0.0) && (Lambda == 1.0))
9782  { T0 = 1.0 / (Abulk_local * EsatL + Vgst2Vtm);
9783  tmp1 = 0.0;
9784  T1 = T0 * T0;
9785  T2 = Vgst2Vtm * T0;
9786  T3 = EsatL * Vgst2Vtm;
9787  Vdsat = T3 * T0;
9788 
9789  dT0_dVg = -(Abulk_local * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1;
9790  dT0_dVd = -(Abulk_local * dEsatL_dVd) * T1;
9791  dT0_dVb = -(Abulk_local * dEsatL_dVb + EsatL * dAbulk_dVb) * T1;
9792  if (selfheat)
9793  dT0_dT = -(Abulk_local * dEsatL_dT + dVgst2Vtm_dT) * T1;
9794  else dT0_dT = 0.0;
9795 
9796  dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0;
9797  dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd;
9798  dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb;
9799  if (selfheat)
9800  dVdsat_dT = T3 * dT0_dT + T2 * dEsatL_dT
9801  + EsatL * T0 * dVgst2Vtm_dT;
9802  else dVdsat_dT = 0.0;
9803  }
9804  else
9805  { tmp1 = dLambda_dVg / (Lambda * Lambda);
9806  T9 = Abulk_local * WVCoxRds;
9807  T8 = Abulk_local * T9;
9808  T7 = Vgst2Vtm * T9;
9809  T6 = Vgst2Vtm * WVCoxRds;
9810  T0 = 2.0 * Abulk_local * (T9 - 1.0 + 1.0 / Lambda);
9811  dT0_dVg = 2.0 * (T8 * tmp2 - Abulk_local * tmp1
9812  + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg);
9813 // this is equivalent to one below, but simpler
9814 // dT0_dVb = 2.0 * (T8 * tmp3 + (2.0 * T9 + 1.0 /
9815 // Lambda - 1.0) * dAbulk_dVg);
9816  dT0_dVb = 2.0 * (T8 * (2.0 / Abulk_local * dAbulk_dVb + tmp3)
9817  + (1.0 / Lambda - 1.0) * dAbulk_dVb);
9818  dT0_dVd = 0.0;
9819 
9820  if (selfheat)
9821  {
9822  if (Rds!=0.0)
9823  tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp;
9824  else
9825  tmp4 = dvsattemp_dT / vsattemp;
9826 
9827  dT0_dT = 2.0 * T8 * tmp4;
9828 
9829  } else tmp4 = dT0_dT = 0.0;
9830 
9831  T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk_local * EsatL + 3.0 * T7;
9832 
9833  dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1
9834  + Abulk_local * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9
9835  + T7 * tmp2 + T6 * dAbulk_dVg);
9836  dT1_dVb = Abulk_local * dEsatL_dVb + EsatL * dAbulk_dVb
9837  + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3);
9838  dT1_dVd = Abulk_local * dEsatL_dVd;
9839 
9840  if (selfheat)
9841  {
9842  tmp4 += dVgst2Vtm_dT / Vgst2Vtm;
9843  dT1_dT = (2.0 / Lambda - 1.0) * dVgst2Vtm_dT + Abulk_local
9844  * dEsatL_dT + 3.0 * T7 * tmp4;
9845  } else
9846  dT1_dT = 0.0;
9847 
9848  T2 = Vgst2Vtm * (EsatL + 2.0 * T6);
9849  dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg
9850  + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2);
9851  dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3);
9852  dT2_dVd = Vgst2Vtm * dEsatL_dVd;
9853  if (selfheat)
9854  dT2_dT = Vgst2Vtm * dEsatL_dT + EsatL * dVgst2Vtm_dT
9855  + 2.0 * T6 * (dVgst2Vtm_dT + Vgst2Vtm * tmp4);
9856  else
9857  dT2_dT = 0.0;
9858 
9859  T3 = sqrt(T1 * T1 - 2.0 * T0 * T2);
9860  Vdsat = (T1 - T3) / T0;
9861 
9862  dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2
9863  - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0;
9864  dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2
9865  - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0;
9866  dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0;
9867  if (selfheat)
9868  dVdsat_dT = (dT1_dT - (T1 * dT1_dT - dT0_dT * T2
9869  - T0 * dT2_dT) / T3 - Vdsat * dT0_dT) / T0;
9870  else dVdsat_dT = 0.0;
9871  }
9872  vdsat = Vdsat;
9873 
9874 // Effective Vds (Vdseff_local) Calculation
9875  T1 = Vdsat - Vds - paramPtr->delta;
9876  dT1_dVg = dVdsat_dVg;
9877  dT1_dVd = dVdsat_dVd - 1.0;
9878  dT1_dVb = dVdsat_dVb;
9879  dT1_dT = dVdsat_dT;
9880 
9881  T2 = sqrt(T1 * T1 + 4.0 * paramPtr->delta * Vdsat);
9882  T0 = T1 / T2;
9883  T3 = 2.0 * paramPtr->delta / T2;
9884  dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg;
9885  dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd;
9886  dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb;
9887  if (selfheat)
9888  dT2_dT = T0 * dT1_dT + T3 * dVdsat_dT;
9889  else
9890  dT2_dT = 0.0;
9891 
9892  Vdseff_local = Vdsat - 0.5 * (T1 + T2);
9893  dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg);
9894  dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd);
9895  dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb);
9896 
9897  if (selfheat)
9898  dVdseff_dT = dVdsat_dT - 0.5 * (dT1_dT + dT2_dT);
9899  else
9900  dVdseff_dT = 0.0;
9901 
9902  if (Vdseff_local > Vds)
9903  Vdseff_local = Vds; // This code is added to fixed the problem
9904  // caused by computer precision when
9905  // Vds is very close to Vdseff_local.
9906  diffVds = Vds - Vdseff_local;
9907  Vdseff = Vdseff_local; // v2.2.3 bug fix
9908 
9909 // Calculate VAsat
9910  tmp4 = 1.0 - 0.5 * Abulk_local * Vdsat / Vgst2Vtm;
9911  T9 = WVCoxRds * Vgsteff_local;
9912  T8 = T9 / Vgst2Vtm;
9913  T0 = EsatL + Vdsat + 2.0 * T9 * tmp4;
9914 
9915  T7 = 2.0 * WVCoxRds * tmp4;
9916  dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff_local)
9917  - T8 * (Abulk_local * dVdsat_dVg - Abulk_local * Vdsat / Vgst2Vtm
9918  + Vdsat * dAbulk_dVg);
9919  dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff_local
9920  - T8 * (dAbulk_dVb * Vdsat + Abulk_local * dVdsat_dVb);
9921  dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk_local * dVdsat_dVd;
9922 
9923  if (selfheat)
9924  {
9925  if (Rds!=0.0)
9926  tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp;
9927  else
9928  tmp4 = dvsattemp_dT / vsattemp;
9929  dT0_dT = dEsatL_dT + dVdsat_dT + T7 * tmp4 * Vgsteff_local - T8 *
9930  (Abulk_local * dVdsat_dT - Abulk_local * Vdsat * dVgst2Vtm_dT
9931  / Vgst2Vtm);
9932  } else
9933  dT0_dT = 0.0;
9934 
9935  T9 = WVCoxRds * Abulk_local;
9936  T1 = 2.0 / Lambda - 1.0 + T9;
9937  dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk_local * tmp2 + dAbulk_dVg);
9938  dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3;
9939  if (selfheat)
9940  dT1_dT = T9 * tmp4;
9941  else
9942  dT1_dT = 0.0;
9943 
9944  Vasat = T0 / T1;
9945  dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1;
9946  dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1;
9947  dVasat_dVd = dT0_dVd / T1;
9948  if (selfheat)
9949  dVasat_dT = (dT0_dT - Vasat * dT1_dT) / T1;
9950  else
9951  dVasat_dT = 0.0;
9952 
9953 // Calculate VACLM
9954  if ((paramPtr->pclm > 0.0) && (diffVds > 1.0e-10))
9955  { T0 = 1.0 / (paramPtr->pclm * Abulk_local * paramPtr->litl);
9956  dT0_dVb = -T0 / Abulk_local * dAbulk_dVb;
9957  dT0_dVg = -T0 / Abulk_local * dAbulk_dVg;
9958 
9959  T2 = Vgsteff_local / EsatL;
9960  T1 = Leff * (Abulk_local + T2);
9961  dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg);
9962  dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL);
9963  dT1_dVd = -T2 * dEsatL_dVd / Esat;
9964  if (selfheat)
9965  dT1_dT = -T2 * dEsatL_dT / Esat;
9966  else
9967  dT1_dT = 0.0;
9968 
9969  T9 = T0 * T1;
9970  VACLM = T9 * diffVds;
9971  dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg
9972  + T1 * diffVds * dT0_dVg;
9973  dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds
9974  - T9 * dVdseff_dVb;
9975  dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd);
9976  if (selfheat)
9977  dVACLM_dT = T0 * dT1_dT * diffVds - T9 * dVdseff_dT;
9978  else
9979  dVACLM_dT = 0.0;
9980  }
9981  else
9982  { VACLM = MAX_EXPL;
9983  dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = dVACLM_dT = 0.0;
9984  }
9985 
9986 // Calculate VADIBL
9987  if (paramPtr->thetaRout > 0.0)
9988  { T8 = Abulk_local * Vdsat;
9989  T0 = Vgst2Vtm * T8;
9990  T1 = Vgst2Vtm + T8;
9991  dT0_dVg = Vgst2Vtm * Abulk_local * dVdsat_dVg + T8
9992  + Vgst2Vtm * Vdsat * dAbulk_dVg;
9993  dT1_dVg = 1.0 + Abulk_local * dVdsat_dVg + Vdsat * dAbulk_dVg;
9994  dT1_dVb = dAbulk_dVb * Vdsat + Abulk_local * dVdsat_dVb;
9995  dT0_dVb = Vgst2Vtm * dT1_dVb;
9996  dT1_dVd = Abulk_local * dVdsat_dVd;
9997  dT0_dVd = Vgst2Vtm * dT1_dVd;
9998  if (selfheat)
9999  {
10000  dT0_dT = dVgst2Vtm_dT * T8 + Abulk_local * Vgst2Vtm * dVdsat_dT;
10001  dT1_dT = dVgst2Vtm_dT + Abulk_local * dVdsat_dT;
10002  } else
10003  dT0_dT = dT1_dT = 0.0;
10004 
10005  T9 = T1 * T1;
10006  T2 = paramPtr->thetaRout;
10007  VADIBL = (Vgst2Vtm - T0 / T1) / T2;
10008  dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2;
10009  dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2;
10010  dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2;
10011  if (selfheat)
10012  dVADIBL_dT = (dVgst2Vtm_dT - dT0_dT/T1 + T0*dT1_dT/T9) / T2;
10013  else
10014  dVADIBL_dT = 0.0;
10015 
10016  T7 = paramPtr->pdiblb * Vbseff;
10017  if (T7 >= -0.9)
10018  { T3 = 1.0 / (1.0 + T7);
10019  VADIBL *= T3;
10020  dVADIBL_dVg *= T3;
10021  dVADIBL_dVb = (dVADIBL_dVb - VADIBL * paramPtr->pdiblb) * T3;
10022  dVADIBL_dVd *= T3;
10023  if (selfheat) dVADIBL_dT *= T3;
10024  else dVADIBL_dT = 0.0;
10025  }
10026  else
10027 // Added to avoid the discontinuity problem caused by pdiblcb
10028  { T4 = 1.0 / (0.8 + T7);
10029  T3 = (17.0 + 20.0 * T7) * T4;
10030  dVADIBL_dVg *= T3;
10031  dVADIBL_dVb = dVADIBL_dVb * T3
10032  - VADIBL * paramPtr->pdiblb * T4 * T4;
10033  dVADIBL_dVd *= T3;
10034  if (selfheat) dVADIBL_dT *= T3;
10035  else dVADIBL_dT = 0.0;
10036  VADIBL *= T3;
10037  }
10038  }
10039  else
10040  { VADIBL = MAX_EXPL;
10041  dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = dVADIBL_dT = 0.0;
10042  }
10043 
10044 // Calculate VA
10045 
10046  T8 = paramPtr->pvag / EsatL;
10047  T9 = T8 * Vgsteff_local;
10048  if (T9 > -0.9)
10049  { T0 = 1.0 + T9;
10050  dT0_dVg = T8 * (1.0 - Vgsteff_local * dEsatL_dVg / EsatL);
10051  dT0_dVb = -T9 * dEsatL_dVb / EsatL;
10052  dT0_dVd = -T9 * dEsatL_dVd / EsatL;
10053  if (selfheat)
10054  dT0_dT = -T9 * dEsatL_dT / EsatL;
10055  else
10056  dT0_dT = 0.0;
10057  }
10058  else // Added to avoid the discontinuity problems caused by pvag
10059  { T1 = 1.0 / (17.0 + 20.0 * T9);
10060  T0 = (0.8 + T9) * T1;
10061  T1 *= T1;
10062  dT0_dVg = T8 * (1.0 - Vgsteff_local * dEsatL_dVg / EsatL) * T1;
10063 
10064  T9 *= T1 / EsatL;
10065  dT0_dVb = -T9 * dEsatL_dVb;
10066  dT0_dVd = -T9 * dEsatL_dVd;
10067  if (selfheat)
10068  dT0_dT = -T9 * dEsatL_dT;
10069  else
10070  dT0_dT = 0.0;
10071  }
10072 
10073  tmp1 = VACLM * VACLM;
10074  tmp2 = VADIBL * VADIBL;
10075  tmp3 = VACLM + VADIBL;
10076 
10077  T1 = VACLM * VADIBL / tmp3;
10078  tmp3 *= tmp3;
10079  dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3;
10080  dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3;
10081  dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3;
10082  if (selfheat)
10083  dT1_dT = (tmp1 * dVADIBL_dT + tmp2 * dVACLM_dT ) / tmp3;
10084  else
10085  dT1_dT = 0.0;
10086 
10087  Va = Vasat + T0 * T1;
10088  dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg;
10089  dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd;
10090  dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb;
10091  if (selfheat)
10092  dVa_dT = dVasat_dT + T1 * dT0_dT + T0 * dT1_dT;
10093  else
10094  dVa_dT = 0.0;
10095 
10096 // Calculate Ids
10097  CoxWovL = model_.cox * Weff / Leff;
10098  beta = ueff_local * CoxWovL;
10099  dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff ;
10100  dbeta_dVd = CoxWovL * dueff_dVd;
10101  dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff ;
10102  if (selfheat) dbeta_dT = CoxWovL * dueff_dT;
10103  else dbeta_dT = 0.0;
10104 
10105  T0 = 1.0 - 0.5 * Abulk_local * Vdseff_local / Vgst2Vtm;
10106  dT0_dVg = -0.5 * (Abulk_local * dVdseff_dVg
10107  - Abulk_local * Vdseff_local / Vgst2Vtm + Vdseff_local
10108  * dAbulk_dVg) / Vgst2Vtm;
10109  dT0_dVd = -0.5 * Abulk_local * dVdseff_dVd / Vgst2Vtm;
10110  dT0_dVb = -0.5 * (Abulk_local * dVdseff_dVb + dAbulk_dVb *
10111  Vdseff_local) / Vgst2Vtm;
10112  if (selfheat)
10113  dT0_dT = -0.5 * (Abulk_local * dVdseff_dT
10114  - Abulk_local * Vdseff_local / Vgst2Vtm
10115  * dVgst2Vtm_dT) / Vgst2Vtm;
10116  else
10117  dT0_dT = 0.0;
10118 
10119  fgche1 = Vgsteff_local * T0;
10120  dfgche1_dVg = Vgsteff_local * dT0_dVg + T0;
10121  dfgche1_dVd = Vgsteff_local * dT0_dVd;
10122  dfgche1_dVb = Vgsteff_local * dT0_dVb;
10123  if (selfheat) dfgche1_dT = Vgsteff_local * dT0_dT;
10124  else dfgche1_dT = 0.0;
10125 
10126  T9 = Vdseff_local / EsatL;
10127  fgche2 = 1.0 + T9;
10128  dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL;
10129  dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL;
10130  dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL;
10131  if (selfheat)
10132  dfgche2_dT = (dVdseff_dT - T9 * dEsatL_dT) / EsatL;
10133  else
10134  dfgche2_dT = 0.0;
10135 
10136  gche = beta * fgche1 / fgche2;
10137 
10138  dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg
10139  - gche * dfgche2_dVg) / fgche2;
10140  dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd
10141  - gche * dfgche2_dVd) / fgche2;
10142  dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb
10143  - gche * dfgche2_dVb) / fgche2;
10144  if (selfheat)
10145  dgche_dT = (beta * dfgche1_dT + fgche1 * dbeta_dT
10146  - gche * dfgche2_dT) / fgche2;
10147  else
10148  dgche_dT = 0.0;
10149 
10150  T0 = 1.0 + gche * Rds;
10151  T9 = Vdseff_local / T0;
10152  Idl = gche * T9;
10153 
10154 // Whoa, these formulas for the derivatives of Idl are convoluted,
10155 // but I verified them to be correct
10156 
10157  dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0
10158  - Idl * gche / T0 * dRds_dVg ;
10159  dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0;
10160  dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb
10161  - Idl * dRds_dVb * gche) / T0;
10162  if (selfheat)
10163  dIdl_dT = (gche * dVdseff_dT + T9 * dgche_dT
10164  - Idl * dRds_dT * gche) / T0;
10165  else
10166  dIdl_dT = 0.0;
10167 
10168  T9 = diffVds / Va;
10169  T0 = 1.0 + T9;
10170  ids = Ids = Idl * T0 / nseg;
10171 
10172  Gm0 = T0 * dIdl_dVg - Idl * ( dVdseff_dVg + T9 * dVa_dVg) / Va;
10173  Gmb0 = T0 * dIdl_dVb - Idl * ( dVdseff_dVb + T9 * dVa_dVb) / Va;
10174  Gds0 = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - T9 * dVa_dVd) / Va;
10175 
10176  // v3.1 wanh added for RF
10177  tmp1 = Gds0 + Gm0 * dVgsteff_dVd;
10178  tmp2 = Gmb0 + Gm0 * dVgsteff_dVb;
10179  tmp3 = Gm0;
10180  // v3.1 wanh added for RF end
10181 
10182  if (selfheat)
10183  GmT0 = T0 * dIdl_dT - Idl * (dVdseff_dT + T9 * dVa_dT) / Va;
10184  else
10185  GmT0 = 0.0;
10186 
10187 // This includes all dependencies from Vgsteff_local, Vbseff
10188 
10189  Gm = (Gm0 * dVgsteff_dVg+ Gmb0 * dVbseff_dVg) / nseg; // v3.0
10190  Gmb = (Gm0 * dVgsteff_dVb + Gmb0 * dVbseff_dVb) / nseg;
10191  Gds = (Gm0 * dVgsteff_dVd+ Gmb0 * dVbseff_dVd + Gds0) / nseg;
10192  Gme = (Gm0 * dVgsteff_dVe + Gmb0 * dVbseff_dVe) / nseg; // v3.0
10193  if (selfheat)
10194  GmT = (Gm0 * dVgsteff_dT+ Gmb0 * dVbseff_dT + GmT0) / nseg;
10195  else
10196  GmT = 0.0;
10197 
10198 // v3.1
10199  if (soiMod != 2) // v3.2
10200  {
10201  // calculate GIDL current
10202  T0 = 3 * model_.tox;
10203  // For drain side
10204  T1 = (Vds - Vgs_eff - paramPtr->ngidl) / T0;
10205  if ((paramPtr->agidl <= 0.0) || (paramPtr->bgidl <= 0.0) ||
10206  (T1 <= 0.0))
10207  { Idgidl = Gdgidld = Gdgidlg = 0.0;
10208  }
10209  else {
10210  dT1_dVd = 1 / T0;
10211  dT1_dVg = - dT1_dVd * dVgs_eff_dVg;
10212  T2 = paramPtr->bgidl / T1;
10213  if (T2 < EXPL_THRESHOLD)
10214  {
10215  Idgidl = wdiod * paramPtr->agidl * T1 * exp(-T2);
10216  T3 = Idgidl / T1 * (T2 + 1);
10217  Gdgidld = T3 * dT1_dVd;
10218  Gdgidlg = T3 * dT1_dVg;
10219  } else
10220  {
10221  T3 = wdiod * paramPtr->agidl * MIN_EXPL;
10222  Idgidl = T3 * T1 ;
10223  Gdgidld = T3 * dT1_dVd;
10224  Gdgidlg = T3 * dT1_dVg;
10225  }
10226  }
10227  igidl = Idgidl;
10228 
10229  // For source side
10230  T1 = (- Vgs_eff - paramPtr->ngidl) / T0;
10231  if ((paramPtr->agidl <= 0.0) || (paramPtr->bgidl <= 0.0)
10232  || (T1 <= 0.0))
10233  { Isgidl = Gsgidlg = 0;
10234  }
10235  else
10236  {
10237  dT1_dVg = - dVgs_eff_dVg / T0;
10238  T2 = paramPtr->bgidl / T1;
10239  if (T2 < EXPL_THRESHOLD)
10240  {
10241  Isgidl = wdios * paramPtr->agidl * T1 * exp(-T2);
10242  T3 = Isgidl / T1 * (T2 + 1);
10243  Gsgidlg = T3 * dT1_dVg;
10244  } else
10245  {
10246  T3 = wdios * paramPtr->agidl * MIN_EXPL;
10247  Isgidl = T3 * T1 ;
10248  Gsgidlg = T3 * dT1_dVg;
10249  }
10250  }
10251 
10252  // calculate diode and BJT current
10253  WsTsi = wdios * model_.tsi;
10254  WdTsi = wdiod * model_.tsi;
10255 
10256  NVtm1 = Vtm * paramPtr->ndiode;
10257  if (selfheat)
10258  dNVtm1_dT = paramPtr->ndiode * dVtm_dT;
10259  else
10260  dNVtm1_dT = 0;
10261 
10262  T0 = Vbs / NVtm1;
10263  dT0_dVb = 1.0 / NVtm1;
10264  if (selfheat)
10265  dT0_dT = -Vbs / NVtm1 / NVtm1 * dNVtm1_dT;
10266  else
10267  dT0_dT = 0;
10268  CEXP(T0, ExpVbsNVtm, T1);
10269  dExpVbsNVtm_dVb = T1 * dT0_dVb;
10270  if (selfheat)
10271  dExpVbsNVtm_dT = T1 * dT0_dT;
10272  else
10273  dExpVbsNVtm_dT = 0;
10274 
10275  T0 = Vbd / NVtm1;
10276  dT0_dVb = 1.0 / NVtm1;
10277  dT0_dVd = -dT0_dVb;
10278  if (selfheat)
10279  dT0_dT = -Vbd / NVtm1 / NVtm1 * dNVtm1_dT;
10280  else
10281  dT0_dT = 0;
10282  CEXP(T0, ExpVbdNVtm, T1);
10283  dExpVbdNVtm_dVb = T1 * dT0_dVb;
10284  dExpVbdNVtm_dVd = -dExpVbdNVtm_dVb;
10285  if (selfheat)
10286  dExpVbdNVtm_dT = T1 * dT0_dT;
10287  else
10288  dExpVbdNVtm_dT = 0;
10289 
10290  // Ibs1 / Ibd1 : diffusion current
10291  if (jdif == 0) {
10292  Ibs1 = dIbs1_dVb = dIbs1_dT = Ibd1 = dIbd1_dVb
10293  = dIbd1_dVd = dIbd1_dT = 0;
10294  }
10295  else {
10296  T0 = WsTsi * jdif;
10297  if (selfheat)
10298  dT0_dT = WsTsi * djdif_dT;
10299  else
10300  dT0_dT = 0;
10301  Ibs1 = T0 * (ExpVbsNVtm - 1);
10302  dIbs1_dVb = T0 * dExpVbsNVtm_dVb;
10303  if (selfheat)
10304  dIbs1_dT = T0 * dExpVbsNVtm_dT + (ExpVbsNVtm - 1) * dT0_dT;
10305  else
10306  dIbs1_dT = 0;
10307 
10308  T0 = WdTsi * jdif;
10309  if (selfheat)
10310  dT0_dT = WdTsi * djdif_dT;
10311  else
10312  dT0_dT = 0;
10313  Ibd1 = T0 * (ExpVbdNVtm - 1);
10314  dIbd1_dVb = T0 * dExpVbdNVtm_dVb;
10315  dIbd1_dVd = -dIbd1_dVb;
10316  if (selfheat)
10317  dIbd1_dT = T0 * dExpVbdNVtm_dT + (ExpVbdNVtm -1) * dT0_dT;
10318  else
10319  dIbd1_dT = 0;
10320  }
10321 
10322  // Ibs2:recombination/trap-assisted tunneling current
10323  NVtmf = 0.026 * paramPtr->nrecf0
10324  * (1 + paramPtr->ntrecf * (TempRatio - 1));
10325  NVtmr = 0.026 * paramPtr->nrecr0 // v2.2.2 bug fix
10326  * (1 + paramPtr->ntrecr * (TempRatio - 1));
10327  if (selfheat) {
10328  dNVtmf_dT = paramPtr->nrecf0 * 0.026
10329  * paramPtr->ntrecf * dTempRatio_dT;
10330  dNVtmr_dT = paramPtr->nrecr0 * 0.026 // v2.2.2 bug fix
10331  * paramPtr->ntrecr * dTempRatio_dT;
10332  }
10333  else
10334  dNVtmf_dT = dNVtmr_dT = 0;
10335 
10336  if (jrec == 0) {
10337  Ibs2 = dIbs2_dVb = dIbs2_dT = 0;
10338  Ibd2 = dIbd2_dVb = dIbd2_dVd = dIbd2_dT = 0;
10339  }
10340  else {
10341  // forward bias
10342  T0 = Vbs / NVtmf;
10343  CEXP(T0,T10,T2);
10344  T4 = 1 / NVtmf;
10345  dT10_dVb = T4 * T2;
10346  if (selfheat)
10347  dT10_dT = - T4 * T2 * Vbs / NVtmf * dNVtmf_dT ;
10348  else dT10_dT = 0.0;
10349 
10350  // reverse bias
10351  if ((paramPtr->vrec0 - Vbs) < 1e-3) {
10352 
10353  // v2.2.3 bug fix
10354  T1 = 1e3;
10355  T0 = -Vbs / NVtmr * paramPtr->vrec0 * T1;
10356  T11 = -exp(T0);
10357 
10358  dT11_dVb = dT11_dT = 0;
10359  }
10360  else {
10361  T1 = 1 / (paramPtr->vrec0 - Vbs);
10362  T0 = -Vbs / NVtmr * paramPtr->vrec0 * T1;
10363  dT0_dVb = -paramPtr->vrec0 / NVtmr * (T1 + Vbs * T1 * T1) ;
10364  if (selfheat)
10365  dT0_dT = -T0 / NVtmr * dNVtmr_dT;
10366  else dT0_dT = 0;
10367 
10368  CEXP(T0, T11, T2);
10369  T11 = -T11;
10370  dT11_dVb = -T2 * dT0_dVb;
10371  if (selfheat)
10372  dT11_dT = -T2 * dT0_dT;
10373  else dT11_dT = 0;
10374  }
10375  T3 = WsTsi * jrec;
10376  Ibs2 = T3 * (T10 + T11);
10377  dIbs2_dVb = T3 * (dT10_dVb + dT11_dVb);
10378  if (selfheat)
10379  dIbs2_dT = T3 * (dT10_dT + dT11_dT) + WsTsi * (T10 + T11)
10380  * djrec_dT;
10381  else dIbs2_dT = 0;
10382 
10383  // Ibd2
10384  T0 = Vbd / NVtmf;
10385  CEXP(T0,T10,T2);
10386  T4 = 1 / NVtmf;
10387  dT10_dVb = T4 * T2;
10388  if (selfheat)
10389  {
10390  dT10_dT = - T4 * T2 * Vbd / NVtmf * dNVtmf_dT ;
10391  }
10392  else
10393  {
10394  dT10_dT = 0.0;
10395  }
10396 
10397  if ((paramPtr->vrec0 - Vbd) < 1e-3) {
10398 
10399  // v2.2.3 bug fix
10400  T1 = 1e3;
10401  T0 = -Vbd / NVtmr * paramPtr->vrec0 * T1;
10402  T11 = -exp(T0);
10403 
10404  dT11_dVb = dT11_dT = 0;
10405  }
10406  else {
10407  T1 = 1 / (paramPtr->vrec0 - Vbd);
10408  T0 = -Vbd / NVtmr * paramPtr->vrec0 * T1;
10409  dT0_dVb = -paramPtr->vrec0 / NVtmr * (T1 + Vbd * T1 * T1) ;
10410  if (selfheat)
10411  dT0_dT = -T0 / NVtmr * dNVtmr_dT;
10412  else
10413  dT0_dT = 0;
10414  CEXP(T0, T11, T2);
10415  T11 = - T11;
10416  dT11_dVb = -T2 * dT0_dVb;
10417  if (selfheat)
10418  dT11_dT = -T2 * dT0_dT;
10419  else
10420  dT11_dT = 0;
10421  }
10422  T3 = WdTsi * jrec;
10423  Ibd2 = T3 * (T10 + T11);
10424  dIbd2_dVb = T3 * (dT10_dVb + dT11_dVb);
10425 
10426  dIbd2_dVd = -dIbd2_dVb;
10427  if (selfheat)
10428  dIbd2_dT = T3 * (dT10_dT + dT11_dT) + WdTsi * (T10 + T11)
10429  * djrec_dT;
10430  else
10431  dIbd2_dT = 0;
10432  }
10433 
10434  // Ibs3/Ibd3: recombination current in neutral body
10435  WTsi = paramPtr->weff / nseg * model_.tsi;
10436  if (jbjt == 0.0)
10437  {
10438  Ibs3 = dIbs3_dVb = dIbs3_dVd = dIbs3_dT = 0.0;
10439  Ibd3 = dIbd3_dVb = dIbd3_dVd = dIbd3_dT = 0.0;
10440  Ibsdif = dIbsdif_dVb = dIbsdif_dT = 0;
10441  Ibddif = dIbddif_dVb = dIbddif_dVd = dIbddif_dT = 0;
10442  ic = Ic = Gcd = Gcb = GcT = 0.0;
10443  }
10444  else {
10445  Ien = WTsi * jbjt * paramPtr->lratio;
10446  if (selfheat)
10447  dIen_dT = WTsi * djbjt_dT * paramPtr->lratio;
10448  else
10449  dIen_dT = 0;
10450 
10451  // high level injection of source side
10452  if ((Ehlis = Ahli * (ExpVbsNVtm - 1)) < 1e-5) {
10453  Ehlis = dEhlis_dVb = dEhlis_dT = 0;
10454  EhlisFactor = 1;
10455  dEhlisFactor_dVb = dEhlisFactor_dT = 0;
10456  }
10457  else {
10458  dEhlis_dVb = Ahli * dExpVbsNVtm_dVb;
10459  if (selfheat)
10460  dEhlis_dT = Ahli * dExpVbsNVtm_dT + (ExpVbsNVtm - 1) * dAhli_dT;
10461  else
10462  dEhlis_dT = 0;
10463  EhlisFactor = 1.0 / sqrt(1 + Ehlis);
10464  T0 = -0.5 * EhlisFactor / (1 + Ehlis);
10465  dEhlisFactor_dVb = T0 * dEhlis_dVb;
10466  if (selfheat)
10467  dEhlisFactor_dT = T0 * dEhlis_dT;
10468  else
10469  dEhlisFactor_dT = 0;
10470  }
10471 
10472  // high level injection of drain side
10473  if ((Ehlid = Ahli * (ExpVbdNVtm - 1)) < 1e-5) {
10474  Ehlid = dEhlid_dVb = dEhlid_dVd = dEhlid_dT = 0;
10475  EhlidFactor = 1;
10476  dEhlidFactor_dVb = dEhlidFactor_dVd = dEhlidFactor_dT = 0;
10477  }
10478  else {
10479  dEhlid_dVb = Ahli * dExpVbdNVtm_dVb;
10480  dEhlid_dVd = -dEhlid_dVb;
10481  if (selfheat)
10482  dEhlid_dT = Ahli * dExpVbdNVtm_dT + (ExpVbdNVtm - 1) * dAhli_dT;
10483  else
10484  dEhlid_dT = 0;
10485  EhlidFactor = 1.0 / sqrt(1 + Ehlid);
10486  T0 = -0.5 * EhlidFactor / (1 + Ehlid);
10487  dEhlidFactor_dVb = T0 * dEhlid_dVb;
10488  dEhlidFactor_dVd = -dEhlidFactor_dVb;
10489  if (selfheat)
10490  dEhlidFactor_dT = T0 * dEhlid_dT;
10491  else
10492  dEhlidFactor_dT = 0;
10493  }
10494 
10495 
10496  // v3.1.1 bug fix for Ibjt(L) discontinuity
10497  T0 = 1 - paramPtr->arfabjt;
10498  T1 = T0 * Ien;
10499  if (selfheat)
10500  dT1_dT = T0 * dIen_dT;
10501  else
10502  dT1_dT = 0;
10503 
10504  Ibs3 = T1 * (ExpVbsNVtm - 1) * EhlisFactor;
10505  dIbs3_dVb = T1 * (dExpVbsNVtm_dVb * EhlisFactor
10506  + (ExpVbsNVtm - 1) * dEhlisFactor_dVb);
10507  dIbs3_dVd = 0;
10508  if (selfheat)
10509  dIbs3_dT = dT1_dT * (ExpVbsNVtm - 1) * EhlisFactor
10510  + T1 * (dExpVbsNVtm_dT * EhlisFactor
10511  + (ExpVbsNVtm - 1) * dEhlisFactor_dT);
10512  else
10513  dIbs3_dT = 0.0;
10514 
10515  Ibd3 = T1 * (ExpVbdNVtm - 1) * EhlidFactor;
10516  dIbd3_dVb = T1 * (dExpVbdNVtm_dVb * EhlidFactor
10517  + (ExpVbdNVtm - 1) * dEhlidFactor_dVb);
10518  dIbd3_dVd = -dIbd3_dVb;
10519  if (selfheat)
10520  dIbd3_dT = dT1_dT * (ExpVbdNVtm - 1) * EhlidFactor
10521  + T1 * (dExpVbdNVtm_dT * EhlidFactor
10522  + (ExpVbdNVtm - 1) * dEhlidFactor_dT);
10523  else
10524  dIbd3_dT = 0.0;
10525 
10526 
10527  // effective diffusion current for capacitance calcu.
10528  Iendif = WTsi * jbjt * paramPtr->lratiodif;
10529  if (selfheat)
10530  dIendif_dT = WTsi * djbjt_dT * paramPtr->lratiodif;
10531  else
10532  dIendif_dT = 0;
10533 
10534  Ibsdif = Iendif * (ExpVbsNVtm - 1) * EhlisFactor;
10535  dIbsdif_dVb = Iendif * (dExpVbsNVtm_dVb * EhlisFactor
10536  + (ExpVbsNVtm - 1) * dEhlisFactor_dVb);
10537  if (selfheat)
10538  dIbsdif_dT = dIendif_dT * (ExpVbsNVtm - 1) * EhlisFactor
10539  + Iendif * (dExpVbsNVtm_dT * EhlisFactor
10540  + (ExpVbsNVtm - 1) * dEhlisFactor_dT);
10541  else
10542  dIbsdif_dT = 0;
10543 
10544  Ibddif = Iendif * (ExpVbdNVtm - 1) * EhlidFactor;
10545  dIbddif_dVb = Iendif * (dExpVbdNVtm_dVb * EhlidFactor
10546  + (ExpVbdNVtm - 1) * dEhlidFactor_dVb);
10547  dIbddif_dVd = -dIbddif_dVb;
10548  if (selfheat)
10549  dIbddif_dT = dIendif_dT * (ExpVbdNVtm - 1) * EhlidFactor
10550  + Iendif * (dExpVbdNVtm_dT * EhlidFactor
10551  + (ExpVbdNVtm - 1) * dEhlidFactor_dT);
10552  else
10553  dIbddif_dT = 0;
10554 
10555  // Ic: Bjt collector current
10556  if ((bjtoff == 1) || (Vds == 0.0)) {
10557  ic = Ic = Gcd = Gcb = GcT = 0.0;
10558  }
10559  else {
10560  // second order effects
10561  T0 = 1 + (Vbs + Vbd) / paramPtr->vearly;
10562  dT0_dVb = 2.0 / paramPtr->vearly;
10563  dT0_dVd = -1.0 / paramPtr->vearly;
10564 
10565  T1 = Ehlis + Ehlid;
10566  dT1_dVb = dEhlis_dVb + dEhlid_dVb;
10567  dT1_dVd = dEhlid_dVd;
10568  if (selfheat)
10569  dT1_dT = dEhlis_dT + dEhlid_dT;
10570  else
10571  dT1_dT = 0;
10572 
10573  T3 = sqrt(T0 * T0 + 4 * T1);
10574  dT3_dVb = 0.5 / T3 * (2 * T0 * dT0_dVb + 4 * dT1_dVb);
10575  dT3_dVd = 0.5 / T3 * (2 * T0 * dT0_dVd + 4 * dT1_dVd);
10576  if (selfheat)
10577  dT3_dT = 2 * dT1_dT / T3;
10578  else
10579  dT3_dT = 0;
10580 
10581  T2 = (T0 + T3) / 2.0;
10582  dT2_dVb = (dT0_dVb + dT3_dVb) / 2.0;
10583  dT2_dVd = (dT0_dVd + dT3_dVd) / 2.0;
10584  if (selfheat)
10585  dT2_dT = dT3_dT /2.0;
10586  else
10587  dT2_dT = 0;
10588 
10589  if (T2 < .1)
10590  {
10591  E2ndFactor = 10.0;
10592  dE2ndFactor_dVb = dE2ndFactor_dVd = dE2ndFactor_dT = 0;
10593  }
10594 
10595  else {
10596  E2ndFactor = 1.0 / T2;
10597  dE2ndFactor_dVb = -E2ndFactor / T2 * dT2_dVb;
10598  dE2ndFactor_dVd = -E2ndFactor / T2 * dT2_dVd;
10599  if (selfheat)
10600  dE2ndFactor_dT = -E2ndFactor / T2 * dT2_dT;
10601  else
10602  dE2ndFactor_dT = 0;
10603  }
10604 
10605  T0 = paramPtr->arfabjt * Ien;
10606  if (selfheat)
10607  dT0_dT = paramPtr->arfabjt * dIen_dT;
10608  else
10609  dT0_dT = 0;
10610  ic = Ic
10611  = T0 * (ExpVbsNVtm - ExpVbdNVtm) * E2ndFactor;
10612  Gcb = T0 * ((dExpVbsNVtm_dVb - dExpVbdNVtm_dVb) * E2ndFactor
10613  + (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dVb);
10614  Gcd = T0 * (-dExpVbdNVtm_dVd * E2ndFactor
10615  + (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dVd);
10616  if (selfheat)
10617  GcT = T0 * (dExpVbsNVtm_dT - dExpVbdNVtm_dT) * E2ndFactor
10618  + dT0_dT * (ExpVbsNVtm - ExpVbdNVtm) * E2ndFactor
10619  + T0 * (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dT;
10620  else
10621  GcT = 0;
10622  }
10623  }
10624 
10625  // Ibs4/Ibd4 : tunneling
10626  NVtm2 = 0.026 * paramPtr->ntun;
10627  if (jtun == 0)
10628  { Ibs4 = Ibd4 = dIbs4_dVb = dIbs4_dT = dIbd4_dVb
10629  = dIbd4_dVd = dIbd4_dT = 0;
10630  } else
10631  {
10632  if ((paramPtr->vtun0 - Vbs) < 1e-3)
10633  {
10634  // v2.2.3 bug fix
10635  T1=1e3;
10636  T0 = -Vbs / NVtm2 * paramPtr->vtun0 * T1;
10637  T1 = exp(T0);
10638  T3 = WsTsi * jtun;
10639  Ibs4 = T3 * (1- T1);
10640 
10641  dIbs4_dVb = dIbs4_dT = 0;
10642  }
10643  else {
10644  T1 = 1 / (paramPtr->vtun0 - Vbs);
10645  T0 = -Vbs / NVtm2 * paramPtr->vtun0 * T1;
10646  dT0_dVb = -paramPtr->vtun0 / NVtm2 * (T1 + Vbs * T1 * T1) ;
10647 
10648  CEXP(T0, T1, T2);
10649  T3 = WsTsi * jtun;
10650  Ibs4 = T3 * (1- T1);
10651  dIbs4_dVb = -T3 * T2 * dT0_dVb;
10652  if (selfheat)
10653  dIbs4_dT = (1 - T1) * WsTsi * djtun_dT;
10654  else
10655  dIbs4_dT = 0;
10656  }
10657 
10658  if ((paramPtr->vtun0 - Vbd) < 1e-3)
10659  {
10660  // v2.2.3 bug fix
10661  T1=1e3;
10662  T0 = -Vbd / NVtm2 * paramPtr->vtun0 * T1;
10663  T1 = exp(T0);
10664  T3 = WdTsi * jtun;
10665  Ibd4 = T3 * (1- T1);
10666 
10667  dIbd4_dVb = dIbd4_dT = 0;
10668  dIbd4_dVd = 0;
10669  }
10670  else
10671  {
10672  T1 = 1 / (paramPtr->vtun0 - Vbd);
10673  T0 = -Vbd / NVtm2 * paramPtr->vtun0 * T1;
10674  dT0_dVb = -paramPtr->vtun0 / NVtm2 * (T1 + Vbd * T1 * T1) ;
10675 
10676  CEXP(T0, T1, T2);
10677  T3 = WdTsi * jtun;
10678  Ibd4 = T3 * (1- T1);
10679  dIbd4_dVb = -T3 * T2 * dT0_dVb;
10680 
10681  dIbd4_dVd = -dIbd4_dVb;
10682 
10683  if (selfheat)
10684  dIbd4_dT = (1 - T1) * WdTsi * djtun_dT;
10685  else dIbd4_dT = 0;
10686  }
10687  }
10688 
10689  itun = - Ibd3 - Ibd4;
10690  ibs = Ibs = Ibs1 + Ibs2 + Ibs3 + Ibs4;
10691  ibd = Ibd = Ibd1 + Ibd2 + Ibd3 + Ibd4;
10692 
10693  Gjsb = dIbs1_dVb + dIbs2_dVb + dIbs3_dVb + dIbs4_dVb;
10694  Gjsd = dIbs3_dVd;
10695  if (selfheat)
10696  GjsT = dIbs1_dT + dIbs2_dT + dIbs3_dT + dIbs4_dT;
10697  else
10698  GjsT = 0.0;
10699 
10700  Gjdb = dIbd1_dVb + dIbd2_dVb + dIbd3_dVb + dIbd4_dVb;
10701 
10702  Gjdd = dIbd1_dVd + dIbd2_dVd + dIbd3_dVd + dIbd4_dVd;
10703  if (selfheat)
10704  GjdT = dIbd1_dT + dIbd2_dT + dIbd3_dT + dIbd4_dT;
10705  else
10706  GjdT = 0.0;
10707 
10708  }
10709  else // v3.1 soiMod=2: ideal FD
10710  {
10711  igidl= Idgidl = Gdgidld = Gdgidlg = 0.0;
10712  Isgidl = Gsgidlg = 0;
10713 
10714  itun = 0;
10715  ibs = Ibs = 0;
10716  ibd = Ibd = 0;
10717  ic = Ic = Gcd = Gcb = GcT = 0.0;
10718 
10719  Gjsb = 0;
10720  Gjsd = 0;
10721  GjsT = 0;
10722 
10723  Gjdb = 0;
10724  Gjdd = 0;
10725  GjdT = 0;
10726  }
10727 
10728  // v3.0: gate-tunneling
10729  if ((model_.igbMod != 0) || (model_.igcMod != 0)) {
10730  Vgb = Vgs_eff - Vbs;
10731  dVgb_dVg = dVgs_eff_dVg;
10732  dVgb_dVb = -1;
10733 
10734  // Calculate Vox first
10735  Vfb = model_.dtype * paramPtr->vth0 - phi_local
10736  - paramPtr->k1eff * sqrtPhi;
10737 
10738  T3 = Vfb - Vgs_eff + Vbs - DELTA_3;
10739  dT3_dVg = -dVgs_eff_dVg;
10740  dT3_dVd = 0;
10741  dT3_dVb = 1;
10742 
10743  if (Vfb <= 0.0) {
10744  T0 = sqrt(T3 * T3 - 4.0 * DELTA_3 * Vfb);
10745  dT0_dVg = 1.0/(2.0 * T0) * 2.0*T3 * dT3_dVg;
10746  dT0_dVb = 0.5*(1.0/T0) * 2.0*T3 * dT3_dVb;
10747  }
10748  else {
10749  T0 = sqrt(T3 * T3 + 4.0 * DELTA_3 * Vfb);
10750  dT0_dVg = 1.0/(2.0 * T0) * 2.0*T3 * dT3_dVg;
10751  dT0_dVb = 0.5*(1.0/T0) * 2.0*T3 * dT3_dVb;
10752  }
10753 
10754  Vfbeff = Vfb - 0.5 * (T3 + T0);
10755  dVfbeff_dVg = -0.5 * (dT3_dVg + dT0_dVg);
10756  dVfbeff_dVb = -0.5 * (dT3_dVb + dT0_dVb);
10757 
10758  Voxacc = Vfb - Vfbeff;
10759  dVoxacc_dVg = -dVfbeff_dVg;
10760  dVoxacc_dVd = 0.0;
10761  dVoxacc_dVb = -dVfbeff_dVb;
10762  if (Voxacc < 0.0)
10763  Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0;
10764 
10765  T0 = Vgs_eff - Vgsteff_local - Vfbeff - Vbseff;
10766  dT0_dVg = dVgs_eff_dVg - dVgsteff_dVg - dVfbeff_dVg
10767  - dVbseff_dVg; // v3.0
10768  dT0_dVd = -dVgsteff_dVd - dVbseff_dVd; // v3.0
10769  dT0_dVb = -dVgsteff_dVb - dVfbeff_dVb - dVbseff_dVb;
10770  dT0_dVe = -dVgsteff_dVe - dVbseff_dVe;
10771 
10772  if (selfheat)
10773  dT0_dT = -dVgsteff_dT - dVbseff_dT; // v3.0
10774 
10775  if (paramPtr->k1eff == 0.0) {
10776  Voxdepinv = dVoxdepinv_dVg
10777  = dVoxdepinv_dVd
10778  = dVoxdepinv_dVb
10779  = dVoxdepinv_dT
10780  = 0.0;
10781  } else {
10782  if (T0 < 0.0) {
10783  T1 = T0/paramPtr->k1eff;
10784  dT1_dVg = dT0_dVg/paramPtr->k1eff;
10785  dT1_dVd = dT0_dVd/paramPtr->k1eff;
10786  dT1_dVb = dT0_dVb/paramPtr->k1eff;
10787  dT1_dVe = dT0_dVe/paramPtr->k1eff; // v3.0
10788  if (selfheat) dT1_dT = dT0_dT/paramPtr->k1eff;
10789  }
10790  else {
10791  T1 = paramPtr->k1eff/2*(-1 + sqrt(1 +
10792  4*T0/paramPtr->k1eff/paramPtr->k1eff));
10793  T2 = paramPtr->k1eff/2 *
10794  0.5/sqrt(1 + 4*T0/paramPtr->k1eff
10795  /paramPtr->k1eff) *
10797  dT1_dVg = T2 * dT0_dVg;
10798  dT1_dVd = T2 * dT0_dVd;
10799  dT1_dVb = T2 * dT0_dVb;
10800  dT1_dVe = T2 * dT0_dVe; // v3.0
10801  if (selfheat)
10802  dT1_dT = T2 * dT0_dT;
10803  }
10804 
10805  Voxdepinv = Vgs_eff - (T1*T1 + Vbs) - Vfb;
10806  dVoxdepinv_dVg = dVgs_eff_dVg - (2.0*T1*dT1_dVg);
10807  dVoxdepinv_dVd = -(2.0*T1*dT1_dVd);
10808  dVoxdepinv_dVb = -(2.0*T1*dT1_dVb + 1);
10809  dVoxdepinv_dVe = -(2.0*T1*dT1_dVe); // v3.0
10810  if (selfheat)
10811  dVoxdepinv_dT = -(2.0*T1*dT1_dT);
10812  }
10813  }
10814 
10815 
10816  // gate-channel tunneling component
10817  if (model_.igcMod)
10818  { T0 = Vtm * paramPtr->nigc;
10819  VxNVt = (Vgs_eff - model_.dtype * paramPtr->vth0) / T0;
10820  // Vth instead of Vth0 may be used
10821  if (VxNVt > EXPL_THRESHOLD)
10822  { Vaux = Vgs_eff - model_.dtype * paramPtr->vth0;
10823  dVaux_dVg = dVgs_eff_dVg;
10824  dVaux_dVd = 0.0;
10825  dVaux_dVb = 0.0;
10826  }
10827  else if (VxNVt < -EXPL_THRESHOLD)
10828  { Vaux = T0 * log(1.0 + MIN_EXPL);
10829  dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0;
10830  }
10831  else
10832  { ExpVxNVt = exp(VxNVt);
10833  Vaux = T0 * log(1.0 + ExpVxNVt);
10834  dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt);
10835  dVaux_dVd = -dVaux_dVg * 0.0;
10836  dVaux_dVb = -dVaux_dVg * 0.0;
10837  dVaux_dVg *= dVgs_eff_dVg;
10838  }
10839 
10840  T2 = Vgs_eff * Vaux;
10841  dT2_dVg = dVgs_eff_dVg * Vaux + Vgs_eff * dVaux_dVg;
10842  dT2_dVd = Vgs_eff * dVaux_dVd;
10843  dT2_dVb = Vgs_eff * dVaux_dVb;
10844 
10845  T11 = paramPtr->Aechvb;
10846  T12 = paramPtr->Bechvb;
10847  T3 = paramPtr->aigc * paramPtr->cigc - paramPtr->bigc;
10848  T4 = paramPtr->bigc * paramPtr->cigc;
10849  T5 = T12 * (paramPtr->aigc + T3 * Voxdepinv
10850  - T4 * Voxdepinv * Voxdepinv);
10851 
10852  if (T5 > EXPL_THRESHOLD)
10853  { T6 = MAX_EXPL;
10854  dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10855  }
10856  else if (T5 < -EXPL_THRESHOLD)
10857  { T6 = MIN_EXPL;
10858  dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10859  }
10860  else
10861  { T6 = exp(T5);
10862  dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv);
10863  dT6_dVd = dT6_dVg * dVoxdepinv_dVd;
10864  dT6_dVb = dT6_dVg * dVoxdepinv_dVb;
10865  dT6_dVg *= dVoxdepinv_dVg;
10866  }
10867 
10868  Igc = T11 * T2 * T6;
10869  dIgc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10870  dIgc_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd);
10871  dIgc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb);
10872 
10873  T7 = -paramPtr->pigcd * Vds;
10874  T8 = T7 * T7 + 2.0e-4;
10875  dT8_dVd = -2.0 * paramPtr->pigcd * T7;
10876  if (T7 > EXPL_THRESHOLD)
10877  { T9 = MAX_EXPL;
10878  dT9_dVd = 0.0;
10879  }
10880  else if (T7 < -EXPL_THRESHOLD)
10881  { T9 = MIN_EXPL;
10882  dT9_dVd = 0.0;
10883  }
10884  else
10885  { T9 = exp(T7);
10886  dT9_dVd = -T9 * paramPtr->pigcd;
10887  }
10888 
10889  T0 = T8 * T8;
10890  T1 = T9 - 1.0 + 1.0e-4;
10891  T10 = (T1 - T7) / T8;
10892  dT10_dVd = ((paramPtr->pigcd + dT9_dVd) * T8
10893  - (T1 - T7) * dT8_dVd) / T0;
10894  Igcs_local = Igc * T10;
10895  dIgcs_dVg = dIgc_dVg * T10;
10896  dIgcs_dVd = dIgc_dVd * T10 + Igc * dT10_dVd;
10897  dIgcs_dVb = dIgc_dVb * T10;
10898 
10899  T1 = T9 - 1.0 - 1.0e-4;
10900  T10 = (T7 * T9 - T1) / T8;
10901  dT10_dVd = (-paramPtr->pigcd * T9 + (T7 - 1.0)
10902  * dT9_dVd - T10 * dT8_dVd) / T8;
10903  Igcd_local = Igc * T10;
10904  dIgcd_dVg = dIgc_dVg * T10;
10905  dIgcd_dVd = dIgc_dVd * T10 + Igc * dT10_dVd;
10906  dIgcd_dVb = dIgc_dVb * T10;
10907 
10908  Igcs = Igcs_local;
10909  gIgcsg = dIgcs_dVg;
10910  gIgcsd = dIgcs_dVd;
10911  gIgcsb = dIgcs_dVb * dVbseff_dVb;
10912  Igcd = Igcd_local;
10913  gIgcdg = dIgcd_dVg;
10914  gIgcdd = dIgcd_dVd;
10915  gIgcdb = dIgcd_dVb * dVbseff_dVb;
10916 
10917 
10918  T0 = vgs - paramPtr->vfbsd;
10919  vgs_eff = sqrt(T0 * T0 + 1.0e-4);
10920  dvgs_eff_dvg = T0 / vgs_eff;
10921 
10922  T2 = vgs * vgs_eff;
10923  dT2_dVg = vgs * dvgs_eff_dvg + vgs_eff;
10924  T11 = paramPtr->AechvbEdge;
10925  T12 = paramPtr->BechvbEdge;
10926  T3 = paramPtr->aigsd * paramPtr->cigsd
10927  - paramPtr->bigsd;
10928  T4 = paramPtr->bigsd * paramPtr->cigsd;
10929  T5 = T12 * (paramPtr->aigsd + T3 * vgs_eff - T4 *
10930  vgs_eff * vgs_eff);
10931  if (T5 > EXPL_THRESHOLD)
10932  { T6 = MAX_EXPL;
10933  dT6_dVg = 0.0;
10934  }
10935  else if (T5 < -EXPL_THRESHOLD)
10936  { T6 = MIN_EXPL;
10937  dT6_dVg = 0.0;
10938  }
10939  else
10940  { T6 = exp(T5);
10941  dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgs_eff)
10942  * dvgs_eff_dvg;
10943  }
10944  Igs_local = T11 * T2 * T6;
10945  dIgs_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10946  dIgs_dVs = -dIgs_dVg;
10947 
10948 
10949  T0 = vgd - paramPtr->vfbsd;
10950  vgd_eff = sqrt(T0 * T0 + 1.0e-4);
10951  dvgd_eff_dvg = T0 / vgd_eff;
10952 
10953  T2 = vgd * vgd_eff;
10954  dT2_dVg = vgd * dvgd_eff_dvg + vgd_eff;
10955  T5 = T12 * (paramPtr->aigsd + T3 * vgd_eff
10956  - T4 * vgd_eff * vgd_eff);
10957  if (T5 > EXPL_THRESHOLD)
10958  { T6 = MAX_EXPL;
10959  dT6_dVg = 0.0;
10960  }
10961  else if (T5 < -EXPL_THRESHOLD)
10962  { T6 = MIN_EXPL;
10963  dT6_dVg = 0.0;
10964  }
10965  else
10966  { T6 = exp(T5);
10967  dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgd_eff)
10968  * dvgd_eff_dvg;
10969  }
10970  Igd_local = T11 * T2 * T6;
10971  dIgd_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10972  dIgd_dVd = -dIgd_dVg;
10973 
10974  Igs = Igs_local;
10975  gIgsg = dIgs_dVg;
10976  gIgss = dIgs_dVs;
10977  Igd = Igd_local;
10978  gIgdg = dIgd_dVg;
10979  gIgdd = dIgd_dVd;
10980  }
10981  else
10982  { Igcs = gIgcsg = gIgcsd = gIgcsb = 0.0;
10983  Igcd = gIgcdg = gIgcdd = gIgcdb = 0.0;
10984  Igs = gIgsg = gIgss = 0.0;
10985  Igd = gIgdg = gIgdd = 0.0;
10986  }
10987 
10988  gIgcss = -(gIgcsg + gIgcsd + gIgcsb);
10989  gIgcds = -(gIgcdg + gIgcdd + gIgcdb);
10990 
10991 
10992  // gate-body tunneling component
10993  if ((model_.igbMod!= 0) && (soiMod != 2)) // v3.2
10994  // v3.1: the Igb calculation is skipped for the ideal FD mode
10995  {
10996  OxideRatio = paramPtr->oxideRatio;
10997 
10998  Vox = Voxdepinv;
10999  // Voxeff is Vox limited below Voxh
11000  T0 = model_.voxh;
11001  T1 = T0 - Vox - model_.deltavox;
11002  T3 = sqrt(T1 * T1 + 4*model_.deltavox * T0);
11003  Voxeff = T0 - 0.5 * (T1 + T3);
11004  dVoxeff_dVox = 0.5 * (1.0 + T1 / T3);
11005 
11006  Vox = Voxeff;
11007  dVox_dVg = dVoxdepinv_dVg * dVoxeff_dVox;
11008  dVox_dVd = dVoxdepinv_dVd * dVoxeff_dVox;
11009  dVox_dVb = dVoxdepinv_dVb * dVoxeff_dVox;
11010  dVox_dVe = dVoxdepinv_dVe * dVoxeff_dVox; // v3.0
11011  dVox_dT = dVoxdepinv_dT * dVoxeff_dVox;
11012 
11013 
11014  T0 = (Vox - model_.ebg)/model_.vevb;
11015  if (selfheat)
11016  dT0_dT = dVox_dT /model_.vevb;
11017 
11018  CEXP(T0, T1, T2); // T1=exp(T0), T2=dT1_dT0
11019  if (selfheat)
11020  dT1_dT = T2 * dT0_dT;
11021 
11022  Vaux = model_.vevb * log(1 + T1);
11023  dVaux_dVg = T2 / (1 + T1) * dVox_dVg;
11024  dVaux_dVd = T2 / (1 + T1) * dVox_dVd;
11025  dVaux_dVb = T2 / (1 + T1) * dVox_dVb;
11026  dVaux_dVe = T2 / (1 + T1) * dVox_dVe; // v3.0
11027  if (selfheat)
11028  dVaux_dT = T2 / (1 + T1) * dVox_dT;
11029 
11030  if (model_.vgb1 != 0) {
11031  T0 = 1 - Vox / model_.vgb1;
11032  dT0_dVox = -1.0/model_.vgb1;
11033  if (selfheat)
11034  dT0_dT = -dVox_dT / model_.vgb1;
11035  } else {
11036  T0 = 1;
11037  dT0_dVox = dT0_dT = 0.0;
11038  }
11039 
11040  if (T0 < 0.01) {
11041  T0 = 0.01;
11042  dT0_dVox = dT0_dT = 0.0;
11043  }
11044 
11045  // v2.2.3 bug fix
11046  T1 = Leff * Weff * 3.7622e-7 * OxideRatio / nseg;
11047 
11048  T2 = -3.1051e10 * model_.toxqm;
11049  T3 = paramPtr->alphaGB1;
11050  T4 = paramPtr->betaGB1;
11051 
11052  T6 = T2*(T3 - T4 * Vox) / T0;
11053  if (selfheat) dT6_dT = -T2 * T4 * dVox_dT / T0 - T6/T0 * dT0_dT;
11054 
11055  CEXP(T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */
11056  dT5_dVg = -T7 * dVox_dVg * T2 / T0 * (T4 + (T3 - T4 * Vox)
11057  / T0 * dT0_dVox);
11058  dT5_dVd = -T7 * dVox_dVd * T2 / T0 * (T4 + (T3 - T4 * Vox)
11059  / T0 * dT0_dVox);
11060  dT5_dVb = -T7 * dVox_dVb * T2 / T0 * (T4 + (T3 - T4 * Vox)
11061  / T0 * dT0_dVox);
11062  dT5_dVe = -T7 * dVox_dVe * T2 / T0 * (T4 + (T3 - T4 * Vox)
11063  / T0 * dT0_dVox); // v3.0
11064  if (selfheat)
11065  dT5_dT = T7 * dT6_dT;
11066 
11067  Igb1 = T1 * Vgb * Vaux * T5;
11068  dIgb1_dVg = T1 * (Vgb*Vaux*dT5_dVg + dVgb_dVg*Vaux*T5 +
11069  Vgb*T5*dVaux_dVg);
11070  dIgb1_dVd = T1 * (Vgb*Vaux*dT5_dVd + Vgb*T5*dVaux_dVd);
11071  dIgb1_dVb = T1 * (Vgb*Vaux*dT5_dVb + dVgb_dVb*Vaux*T5 +
11072  Vgb*T5*dVaux_dVb);
11073  dIgb1_dVe = T1 * (Vgb*Vaux*dT5_dVe + Vgb*T5*dVaux_dVe); // v3.0
11074  if (selfheat)
11075  dIgb1_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT);
11076  else dIgb1_dT = 0.0;
11077 
11078 
11079  Vox = Voxacc;
11080  // Voxeff is Vox limited below Voxh
11081  T0 = model_.voxh;
11082  T1 = T0 - Vox - model_.deltavox;
11083  T3 = sqrt(T1 * T1 + 4*model_.deltavox * T0);
11084  Voxeff = T0 - 0.5 * (T1 + T3);
11085  dVoxeff_dVox = 0.5 * (1.0 + T1 / T3);
11086 
11087  Vox = Voxeff;
11088  dVox_dVg = dVoxacc_dVg * dVoxeff_dVox;
11089  dVox_dVd = dVoxacc_dVd * dVoxeff_dVox;
11090  dVox_dVb = dVoxacc_dVb * dVoxeff_dVox;
11091  dVox_dT = 0;
11092 
11093  T0 = (-Vgb+(Vfb))/model_.vecb;
11094  if (selfheat)
11095  dT0_dT = 0;
11096 
11097  CEXP(T0, T1, T2); // T1=exp(T0), T2=dT1_dT0
11098  if (selfheat)
11099  dT1_dT = 0;
11100 
11101  Vaux = model_.vecb* log(1 + T1);
11102  dVaux_dVg = -T2 / (1 + T1);
11103  dVaux_dVd = 0;
11104  dVaux_dVb = -dVaux_dVg;
11105  if (selfheat)
11106  dVaux_dT = 0;
11107 
11108  if (model_.vgb2 != 0) {
11109  T0 = 1 - Vox / model_.vgb2;
11110  dT0_dVox = -1.0/model_.vgb2;
11111  if (selfheat) dT0_dT = -dVox_dT / model_.vgb2;
11112  } else {
11113  T0 = 1;
11114  dT0_dVox = dT0_dT =0.0;
11115  }
11116 
11117  if (T0 < 0.01) {
11118  T0 = 0.01;
11119  dT0_dVox = dT0_dT =0.0;
11120  }
11121 
11122  // v2.2.3 bug fix
11123  T1 = Leff * Weff * 4.9758e-7 * OxideRatio / nseg;
11124 
11125  T2 = -2.357e10 * model_.toxqm;
11126  T3 = paramPtr->alphaGB2;
11127  T4 = paramPtr->betaGB2;
11128 
11129  T6 = T2*(T3 - T4 * Vox) / T0;
11130  if (selfheat) dT6_dT = -T2 * T4 * dVox_dT / T0 - T6/T0 * dT0_dT;
11131 
11132  CEXP(T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */
11133  dT5_dVg = -T7 * dVox_dVg * T2 / T0 * (T4 + (T3 - T4 * Vox)
11134  / T0 * dT0_dVox);
11135  dT5_dVd = -T7 * dVox_dVd * T2 / T0 * (T4 + (T3 - T4 * Vox)
11136  / T0 * dT0_dVox);
11137  dT5_dVb = -T7 * dVox_dVb * T2 / T0 * (T4 + (T3 - T4 * Vox)
11138  / T0 * dT0_dVox);
11139  if (selfheat)
11140  dT5_dT = T7 * dT6_dT;
11141 
11142  Igb2 = T1 * Vgb * Vaux * T5;
11143  dIgb2_dVg = T1 * (Vgb*Vaux*dT5_dVg + dVgb_dVg*Vaux*T5 +
11144  Vgb*T5*dVaux_dVg);
11145  dIgb2_dVd = T1 * (Vgb*Vaux*dT5_dVd + Vgb*T5*dVaux_dVd);
11146  dIgb2_dVb = T1 * (Vgb*Vaux*dT5_dVb + dVgb_dVb*Vaux*T5 +
11147  Vgb*T5*dVaux_dVb);
11148  if (selfheat)
11149  dIgb2_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT);
11150  else dIgb2_dT = 0.0;
11151 
11152 
11153  // Igb1 dominates in inversion region,
11154  // while Igb2 doninates in accumulation
11155  // v2.2.3 bug fix for residue at low Vgb
11156  if (Vgb >= 0)
11157  {
11158  Igb = Igb1;
11159  dIgb_dVg = dIgb1_dVg;
11160  dIgb_dVd = dIgb1_dVd;
11161  dIgb_dVb = dIgb1_dVb;
11162  dIgb_dVe = dIgb1_dVe; // v3.0
11163  dIgb_dT = dIgb1_dT;
11164  }
11165  else
11166  {
11167  Igb = Igb2;
11168  dIgb_dVg = dIgb2_dVg;
11169  dIgb_dVd = dIgb2_dVd;
11170  dIgb_dVb = dIgb2_dVb;
11171  dIgb_dVe = 0; // v3.0
11172  dIgb_dT = dIgb2_dT;
11173  }
11174 
11175  }
11176  else {
11177  Igb = 0.0;
11178  dIgb_dVg = 0.0;
11179  dIgb_dVd = 0.0;
11180  dIgb_dVb = 0.0;
11181  dIgb_dVe = 0.0; // v3.0
11182  dIgb_dT = 0.0;
11183  }
11184 
11185  ig = Igb;
11186  gigg = dIgb_dVg;
11187  gigd = dIgb_dVd;
11188  gigb = dIgb_dVb;
11189  gige = dIgb_dVe; // v3.0
11190  gigs = -(dIgb_dVg + dIgb_dVd + dIgb_dVb + dIgb_dVe);
11191  gigT = dIgb_dT;
11192  // end of gate-body tunneling
11193  // end of v3.0 gate-tunneling
11194 
11195  // v3.1
11196 
11197  if (soiMod != 2) // v3.2
11198  {
11199  // calculate substrate current Iii
11200  if (paramPtr->alpha0 <= 0.0) {
11201  Giig = Giib = Giid = GiiT = 0.0;
11202  Giie = 0; // v3.0
11203  iii = Iii = 0.0;
11204  }
11205  else {
11206  Vdsatii0 = paramPtr->vdsatii0 * (1 + model_.tii * (TempRatio-1.0))
11207  - paramPtr->lii / Leff;
11208  if (selfheat)
11209  dVdsatii0_dT = paramPtr->vdsatii0 * model_.tii * dTempRatio_dT;
11210  else
11211  dVdsatii0_dT = 0;
11212 
11213  // Calculate VgsStep
11214  T0 = paramPtr->esatii * Leff;
11215  // v3.0 bug fix: T0 is dimentionless (i.e., scaled by 1V)
11216  T1 = paramPtr->sii0 * T0 / (1.0 + T0);
11217 
11218  T0 = 1 / (1 + paramPtr->sii1 * Vgsteff_local);
11219  if (selfheat)
11220  dT0_dT = - paramPtr->sii1 * T0 * T0 *dVgsteff_dT;
11221  else
11222  dT0_dT = 0;
11223  T3 = T0 + paramPtr->sii2;
11224  T4 = Vgst * paramPtr->sii1 * T0 * T0;
11225  T2 = Vgst * T3;
11226  dT2_dVg = T3 * (dVgst_dVg - dVth_dVb * dVbseff_dVg) - T4
11227  * dVgsteff_dVg; // v3.0
11228  dT2_dVb = T3 * dVgst_dVb * dVbseff_dVb - T4 * dVgsteff_dVb;
11229  dT2_dVe = T3 * dVgst_dVb * dVbseff_dVe - T4 * dVgsteff_dVe; // v3.0
11230  dT2_dVd = T3 * (dVgst_dVd - dVth_dVb * dVbseff_dVd) - T4
11231  * dVgsteff_dVd; // v3.0
11232  if (selfheat)
11233  dT2_dT = -(dVth_dT + dVth_dVb * dVbseff_dT) * T3
11234  + Vgst * dT0_dT; // v3.0
11235  else dT2_dT = 0;
11236 
11237 
11238  T3 = 1 / (1 + paramPtr->siid * Vds);
11239  dT3_dVd = - paramPtr->siid * T3 * T3;
11240 
11241  VgsStep = T1 * T2 * T3;
11242  if (selfheat)
11243  dVgsStep_dT = T1 * T3 * dT2_dT;
11244  else dVgsStep_dT = 0;
11245  Vdsatii = Vdsatii0 + VgsStep;
11246  Vdiff = Vds - Vdsatii;
11247  dVdiff_dVg = - T1 * T3 * dT2_dVg;
11248  dVdiff_dVb = - T1 * T3 * dT2_dVb;
11249  dVdiff_dVe = - T1 * T3 * dT2_dVe; // v3.0
11250  dVdiff_dVd = 1.0 - T1 * (T3 * dT2_dVd + T2 * dT3_dVd);
11251  if (selfheat)
11252  dVdiff_dT = -(dVdsatii0_dT + dVgsStep_dT);
11253  else dVdiff_dT = 0;
11254 
11255  T0 = paramPtr->beta2 + paramPtr->beta1 * Vdiff
11256  + paramPtr->beta0 * Vdiff * Vdiff;
11257  if (T0 < 1e-5)
11258  {
11259  T0 = 1e-5;
11260  dT0_dVg = dT0_dVd = dT0_dVb = dT0_dT = 0.0;
11261  dT0_dVe = 0; /* v3.0 */
11262  }
11263  else
11264  {
11265  T1 = paramPtr->beta1 + 2 * paramPtr->beta0 * Vdiff;
11266  dT0_dVg = T1 * dVdiff_dVg;
11267  dT0_dVb = T1 * dVdiff_dVb;
11268  dT0_dVd = T1 * dVdiff_dVd;
11269  dT0_dVe = T1 * dVdiff_dVe; // v3.0
11270  if (selfheat)
11271  dT0_dT = T1 * dVdiff_dT;
11272  else
11273  dT0_dT = 0;
11274  }
11275 
11276  if ((T0 < Vdiff / EXPL_THRESHOLD) && (Vdiff > 0.0)) {
11277  Ratio = paramPtr->alpha0 * MAX_EXPL;
11278  dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0;
11279  dRatio_dVe = 0; /* v3.0 */
11280  }
11281  else if ((T0 < -Vdiff / EXPL_THRESHOLD) && (Vdiff < 0.0)) {
11282  Ratio = paramPtr->alpha0 * MIN_EXPL;
11283  dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0;
11284  dRatio_dVe = 0; /* v3.0 */
11285  }
11286  else {
11287  Ratio = paramPtr->alpha0 * exp(Vdiff / T0);
11288  T1 = Ratio / T0 / T0;
11289  dRatio_dVg = T1 * (T0 * dVdiff_dVg - Vdiff * dT0_dVg);
11290  dRatio_dVb = T1 * (T0 * dVdiff_dVb - Vdiff * dT0_dVb);
11291  dRatio_dVd = T1 * (T0 * dVdiff_dVd - Vdiff * dT0_dVd);
11292  /* v3.0 */
11293  dRatio_dVe = T1 * (T0 * dVdiff_dVe - Vdiff * dT0_dVe);
11294 
11295  if (selfheat)
11296  dRatio_dT = T1 * (T0 * dVdiff_dT - Vdiff * dT0_dT);
11297  else
11298  dRatio_dT = 0;
11299  }
11300 
11301  // Avoid too high ratio
11302  if (Ratio > 10.0) {
11303  Ratio = 10.0;
11304  dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0;
11305  dRatio_dVe = 0; /* v3.0 */
11306  }
11307 
11308  T0 = Ids + paramPtr->fbjtii * Ic;
11309  iii = Iii = Ratio * T0;
11310  Giig = Ratio * Gm + T0 * dRatio_dVg;
11311  Giib = Ratio * (Gmb + paramPtr->fbjtii * Gcb)
11312  + T0 * dRatio_dVb;
11313  Giid = Ratio * (Gds + paramPtr->fbjtii * Gcd)
11314  + T0 * dRatio_dVd;
11315  // v3.0
11316  Giie = Ratio * Gme + T0 * dRatio_dVe;
11317 
11318  if (selfheat)
11319  GiiT = Ratio * (GmT + paramPtr->fbjtii * GcT)
11320  + T0 * dRatio_dT;
11321  else
11322  GiiT = 0.0;
11323  } // alpha0 <= 0
11324 
11325 
11326  // Current through body resistor
11327  // Current going out is +ve
11328  if ((bodyMod == 0) || (bodyMod == 2))
11329  {
11330  Ibp = Gbpbs = Gbpps = 0.0;
11331  }
11332  else
11333  { // bodyMod == 1
11334  if (paramPtr->rbody < 1e-3) // 3.2 bug fix
11335  {
11336  if (rbodyext <= 1e-3) // 3.2 bug fix
11337  T0 = 1.0 / 1e-3; // 3.2 bug fix
11338  else
11339  T0 = 1.0 / rbodyext;
11340  Ibp = Vbp * T0;
11341  Gbpbs = T0 * dVbp_dVb;
11342  Gbpps = -T0 * dVbp_dVb;
11343  }
11344  else
11345  {
11346  Gbpbs = 1.0 / (paramPtr->rbody + rbodyext);
11347  Ibp = Vbp * Gbpbs;
11348  Gbpps = - Gbpbs;
11349  }
11350 
11351  } // soiMod != 2
11352 
11353  ibp = Ibp;
11354  gbpbs = Gbpbs;
11355  gbpps = Gbpps;
11356  gbpT = 0.0;
11357 
11358 // spice has:
11359 // cbodcon = Ibp - (Gbpbs * Vbs + Gbpps * Vps);
11360 
11361  cbodcon = Ibp;
11362  cbodcon_Jdxp = 0.0;
11363  cbodcon_Jdxp = - (Gbpbs * (Vbs-Vbs_orig) + Gbpps * (Vps-Vps_orig));
11364  }
11365  else // v3.1 soiMod=2: ideal FD
11366  {
11367  Giig = Giib = Giid = Giie = GiiT = 0.0;
11368  iii = Iii = 0.0;
11369 
11370  ibp = Ibp = 0.0;
11371  gbpbs = 0.0;
11372  gbpps = gbpT = cbodcon = 0.0;
11373  cbodcon_Jdxp = 0.0;
11374  Gbpbs = Gbpps = 0.0;
11375  }
11376  // v3.1
11377 
11378  // Current going out of drainprime node into the drain of device
11379  // "node" means the SPICE circuit node
11380 
11381 
11382  cdrain = Ids + Ic;
11383  cd = Ids + Ic - Ibd + Iii + Idgidl;
11384  cb = Ibs + Ibd + Ibp - Iii - Idgidl - Isgidl - Igb;
11385  gds = Gds + Gcd;
11386  gm = Gm;
11387  gmbs = Gmb + Gcb;
11388  // v3.0
11389  gme = Gme;
11390 
11391  // v3.1 wanh added Rg for RF
11392  // Calculate Rg
11393  if (rgateMod >1)
11394  { T9 = paramPtr->xrcrg2 * vtm;
11395  T0 = T9 *beta;
11396  dT0_dVd = (dbeta_dVd + dbeta_dVg * dVgsteff_dVd) * T9;
11397  dT0_dVb = (dbeta_dVb + dbeta_dVg * dVgsteff_dVb) * T9;
11398  dT0_dVg = dbeta_dVg * T9;
11399 
11400  gcrg = paramPtr->xrcrg1 * (T0 + Ids);
11401  gcrgd = paramPtr->xrcrg1 * (dT0_dVd +tmp1);
11402  gcrgb = paramPtr->xrcrg1 * (dT0_dVb +tmp2)
11403  * dVbseff_dVb;
11404  gcrgg = paramPtr->xrcrg1 * (dT0_dVg +tmp3)
11405  * dVgsteff_dVg;
11406 
11407  if (rgateMod == 2)
11408  { T10 = grgeltd * grgeltd;
11409  T11 = grgeltd + gcrg;
11410  gcrg = grgeltd * gcrg / T11;
11411  T12 = T10 / T11 /T11;
11412  gcrgg *= T12;
11413  gcrgd *= T12;
11414  gcrgb *= T12;
11415  }
11416 
11417  gcrgs = -(gcrgg + gcrgd + gcrgb);
11418  }
11419  // v3.1 wanh added Rg for RF end
11420 
11421  if (selfheat)
11422  gmT = GmT + GcT;
11423  else
11424  gmT = 0.0;
11425 
11426  // note that sign is switched because power flows out
11427  // of device into the temperature node.
11428  // Currently ommit self-heating due to bipolar current
11429  // because it can cause convergence problem
11430 
11431  gtempg = -Gm * Vds;
11432  gtempb = -Gmb * Vds;
11433  // v3.0
11434  gtempe = -Gme * Vds;
11435 
11436  gtempT = -GmT * Vds;
11437  gtempd = -Gds * Vds - Ids;
11438 
11439 // spice has:
11440 // cth = - Ids * Vds - model_.dtype * (gtempg * Vgs + gtempb * Vbs
11441 // + gtempe * Ves + gtempd * Vds) - gtempT * delTemp; // v3.0
11442 
11443  cth = - Ids * Vds;
11444  cth_Jdxp = 0.0;
11446  +gtempb * (Vbs-Vbs_orig)
11447  +gtempe * (Ves-Ves_orig)
11448  +gtempd * (Vds-Vds_orig))
11450 
11451 
11452  // Body current which flows into drainprime node from the drain of device
11453 
11454  gjdb = Gjdb - Giib;
11455  gjdd = Gjdd - (Giid + Gdgidld);
11456  gjdg = - (Giig + Gdgidlg);
11457  // v3.0
11458  gjde = - Giie;
11459 
11460  if (selfheat) gjdT = GjdT - GiiT;
11461  else gjdT = 0.0;
11462 
11463  cjd = Ibd - Iii - Idgidl;
11464  cjd_Jdxp = 0.0;
11465  cjd_Jdxp = -(gjdb*(Vbs-Vbs_orig)
11466  + gjdd*(Vds-Vds_orig)
11467  + gjdg*(Vgs-Vgs_orig)
11468  + gjde*(Ves-Ves_orig)
11469  + gjdT*(delTemp-delTemp_orig));
11470 
11471  // Body current which flows into sourceprime node from the source of device
11472  gjsb = Gjsb;
11473  gjsd = Gjsd;
11474  gjsg = - Gsgidlg;
11475  if (selfheat) gjsT = GjsT;
11476  else gjsT = 0.0;
11477 
11478  cjs = Ibs - Isgidl;
11479  cjs_Jdxp = 0.0;
11480  cjs_Jdxp = -(gjsb*(Vbs-Vbs_orig)
11481  + gjsd*(Vds-Vds_orig)
11482  + gjsg*(Vgs-Vgs_orig)
11483  + gjsT*(delTemp-delTemp_orig));
11484 
11485  // Current flowing into body node
11486 
11487  gbbs = Giib - Gjsb - Gjdb - Gbpbs;
11488  gbgs = Giig + Gdgidlg + Gsgidlg;
11489  gbds = Giid + Gdgidld - Gjsd - Gjdd;
11490  // v3.0
11491  gbes = Giie;
11492 
11493  gbps = - Gbpps;
11494  if (selfheat)
11495  gbT = GiiT - GjsT - GjdT;
11496  else
11497  gbT = 0.0;
11498 
11499 // spice has:
11500 // cbody = Iii + Idgidl + Isgidl - Ibs - Ibd - Ibp + Igb
11501 // - ( (gbbs + dIgb_dVb) * Vbs
11502 // + (gbgs + dIgb_dVg) * Vgs
11503 // + (gbds + dIgb_dVd) * Vds
11504 // + gbps * Vps
11505 // + (gbes + dIgb_dVe) * Ves
11506 // + (gbT + dIgb_dT) * delTemp); // v3.0
11507 //
11508  cbody_Jdxp = 0.0;
11509  cbody = Iii + Idgidl + Isgidl - Ibs - Ibd - Ibp + Igb;
11510  cbody_Jdxp = -( (gbbs + dIgb_dVb) * (Vbs - Vbs_orig)
11511  +(gbgs + dIgb_dVg) * (Vgs - Vgs_orig)
11512  +(gbds + dIgb_dVd) * (Vds - Vds_orig)
11513  +gbps * (Vps - Vps_orig)
11514  +(gbes + dIgb_dVe) * (Ves - Ves_orig)
11515  +(gbT + dIgb_dT) * (delTemp - delTemp_orig));
11516 
11517 // spice has:
11518 // cgate = Igb - (dIgb_dVb * Vbs + dIgb_dVe * Ves + dIgb_dVg
11519 // * Vgs + dIgb_dVd * Vds + dIgb_dT * delTemp); // v3.0
11520 
11521  cgate_Jdxp = 0.0;
11522  cgate = Igb;
11523  cgate_Jdxp = -(dIgb_dVb * (Vbs - Vbs_orig) +
11524  dIgb_dVe * (Ves - Ves_orig) +
11525  dIgb_dVg * (Vgs - Vgs_orig) +
11526  dIgb_dVd * (Vds - Vds_orig) +
11527  dIgb_dT * (delTemp - delTemp_orig));
11528 
11529  // Calculate Qinv for Noise analysis
11530 
11531  T1 = Vgsteff_local * (1.0 - 0.5 * Abulk_local * Vdseff_local / Vgst2Vtm);
11532  qinv = -model_.cox * paramPtr->weff * Leff * T1;
11533 
11534  // Begin CV (charge) model
11535 
11536  if ((model_.xpart < 0) || (!ChargeComputationNeeded))
11537  { qgate = qdrn = qsrc = qbody = qsub = 0.0; // v2.2.3 bug fix
11538  cggb = cgsb = cgdb = 0.0;
11539  cdgb = cdsb = cddb = 0.0;
11540  cbgb = cbsb = cbdb = 0.0;
11541  Qsub0 = 0;
11542  Qac0 = 0;
11543  qjs_local = 0;
11544  qjd_local = 0;
11545  goto finished;
11546  }
11547  else
11548  {
11549  CoxWL = model_.cox * (paramPtr->weffCV / nseg
11550  * paramPtr->leffCV + agbcp);
11551  CoxWLb = model_.fbody * model_.cox
11552  * (paramPtr->weffCV / nseg
11553  * paramPtr->leffCVb + agbcp);
11554 
11555 
11556  // v3.2 Seperate VgsteffCV with noff
11557  noff = n * paramPtr->noff;
11558  dnoff_dVd = paramPtr->noff * dn_dVd;
11559  dnoff_dVb = paramPtr->noff * dn_dVb;
11560 
11561  if ((VgstNVt > -EXPL_THRESHOLD) && (VgstNVt < EXPL_THRESHOLD))
11562  {
11563  ExpVgst *= ExpVgst;
11564  ExpVgst *= exp( -(paramPtr->delvt / (noff * Vtm)));
11565  Vgsteff_local = noff * Vtm * log(1.0 + ExpVgst);
11566  T0 = ExpVgst / (1.0 + ExpVgst);
11567  T1 = -T0 * (dVth_dVb + (Vgst-paramPtr->delvt) / noff * dnoff_dVb)
11568  + Vgsteff_local / noff * dnoff_dVb;
11569  dVgsteff_dVd = -T0 * (dVth_dVd + dVth_dVb*dVbseff_dVd + Vgst / noff
11570  * dnoff_dVd) + Vgsteff_local / noff * dnoff_dVd;
11571  dVgsteff_dVg = T0 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg);
11572  dVgsteff_dVb = T1 * dVbseff_dVb;
11573  dVgsteff_dVe = T1 * dVbseff_dVe;
11574  if (selfheat)
11575  dVgsteff_dT = -T0 * (dVth_dT+dVth_dVb*dVbseff_dT
11576  + (Vgst - paramPtr->delvt) / Temp)
11577  + Vgsteff_local / Temp;
11578  else
11579  dVgsteff_dT = 0.0;
11580  }
11581  // v3.2
11582 
11583 
11584  if (model_.capMod == 2)
11585  {
11586 
11587  // v3.1
11588  if (soiMod == 2) // v3.2 - ideal FD
11589  {
11590  Qac0 = dQac0_dVrg = dQac0_dVd = dQac0_dVb = dQac0_dT = 0.0;
11591  Qsub0 = dQsub0_dVrg = dQsub0_dVg = dQsub0_dVd
11592  = dQsub0_dVb = dQsub0_dT = 0.0;
11593  }
11594  else // soiMod = 0 or 1
11595  {
11596  Vfb = Vth - phi_local - paramPtr->k1eff * sqrtPhis
11597  + paramPtr->delvt;
11598  dVfb_dVb = dVth_dVb - paramPtr->k1eff * dsqrtPhis_dVb;
11599  dVfb_dVd = dVth_dVd;
11600  dVfb_dT = dVth_dT;
11601 
11602  V3 = Vfb - Vgs_eff + Vbseff - DELTA_3_SOI;
11603  if (Vfb <= 0.0)
11604  { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3_SOI * Vfb);
11605  T2 = -DELTA_3_SOI / T0;
11606  }
11607  else
11608  { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3_SOI * Vfb);
11609  T2 = DELTA_3_SOI / T0;
11610  }
11611 
11612  T1 = 0.5 * (1.0 + V3 / T0);
11613  Vfbeff = Vfb - 0.5 * (V3 + T0);
11614  dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd;
11615  dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - T1;
11616  dVfbeff_dVrg = T1 * dVgs_eff_dVg;
11617  if (selfheat)
11618  dVfbeff_dT = (1.0 - T1 - T2) * dVfb_dT;
11619  else
11620  dVfbeff_dT = 0.0;
11621 
11622  Qac0 = CoxWLb * (Vfbeff - Vfb);
11623  dQac0_dVrg = CoxWLb * dVfbeff_dVrg;
11624  dQac0_dVd = CoxWLb * (dVfbeff_dVd - dVfb_dVd);
11625  dQac0_dVb = CoxWLb * (dVfbeff_dVb - dVfb_dVb);
11626  if (selfheat)
11627  dQac0_dT = CoxWLb * (dVfbeff_dT - dVfb_dT);
11628  else
11629  dQac0_dT = 0.0;
11630 
11631  T0 = 0.5 * K1;
11632  T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff_local;
11633  if (paramPtr->k1eff == 0.0)
11634  { T1 = 0.0;
11635  T2 = 0.0;
11636  }
11637  else if (T3 < 0.0)
11638  { T1 = T0 + T3 / paramPtr->k1eff;
11639  T2 = CoxWLb;
11640  }
11641  else
11642  { T1 = sqrt(T0 * T0 + T3);
11643  T2 = CoxWLb * T0 / T1;
11644  }
11645 
11646  Qsub0 = CoxWLb * K1 * (T1 - T0);
11647  dQsub0_dVrg = T2 * (dVgs_eff_dVg - dVfbeff_dVrg);
11648  dQsub0_dVg = -T2;
11649  dQsub0_dVd = -T2 * dVfbeff_dVd;
11650  dQsub0_dVb = -T2 * (dVfbeff_dVb + 1);
11651  if (selfheat)
11652  dQsub0_dT = -T2 * dVfbeff_dT;
11653  else
11654  dQsub0_dT = 0.0;
11655  }
11656  // v3.1
11657 
11658 
11659  AbulkCV = Abulk0 * paramPtr->abulkCVfactor;
11660  dAbulkCV_dVb = paramPtr->abulkCVfactor * dAbulk0_dVb;
11661 
11662  VdsatCV = Vgsteff_local / AbulkCV;
11663 //not used dVdsatCV_dVg = 1.0 / AbulkCV;
11664 //not used dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV;
11665 
11666  V4 = VdsatCV - Vds - DELTA_4;
11667  T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV);
11668  VdseffCV = VdsatCV - 0.5 * (V4 + T0);
11669  T1 = 0.5 * (1.0 + V4 / T0);
11670  T2 = DELTA_4 / T0;
11671  T3 = (1.0 - T1 - T2) / AbulkCV;
11672  dVdseffCV_dVg = T3;
11673  dVdseffCV_dVd = T1;
11674  dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb;
11675 
11676 
11677  // v3.1
11678  if (soiMod == 2) // v3.2 - ideal FD
11679  {
11680  qbulk = Cbg1 = Cbd1 = Cbb1 = 0;
11681  }
11682  else
11683  {
11684  T0 = AbulkCV * VdseffCV;
11685  T1 = 12.0 * (Vgsteff_local - 0.5 * T0 + 1e-20);
11686  T2 = VdseffCV / T1;
11687  T3 = T0 * T2;
11688  T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV);
11689  T5 = (6.0 * T0 * (4.0 * Vgsteff_local- T0) / (T1 * T1) - 0.5);
11690  T6 = 12.0 * T2 * T2 * Vgsteff_local;
11691 
11692  T7 = 1.0 - AbulkCV;
11693  qbulk = CoxWLb * T7 * (0.5 * VdseffCV - T3);
11694  T4 = -T7 * (T4 - 1.0);
11695  T5 = -T7 * T5;
11696  T6 = -(T7 * T6 + (0.5 * VdseffCV - T3));
11697 
11698  Cbg1 = CoxWLb * (T4 + T5 * dVdseffCV_dVg);
11699  Cbd1 = CoxWLb * T5 * dVdseffCV_dVd ;
11700  Cbb1 = CoxWLb * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb);
11701  }
11702  // v3.1
11703 
11704 
11705  // Total inversion charge
11706  T0 = AbulkCV * VdseffCV;
11707  T1 = 12.0 * (Vgsteff_local - 0.5 * T0 + 1e-20);
11708 // T2 = VdseffCV / T1;
11709  T2 = T0 / T1;
11710  T3 = T0 * T2;
11711 
11712 // T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV);
11713 // T5 = (6.0 * T0 * (4.0 * Vgsteff_local - T0) / (T1 * T1) - 0.5);
11714 // T6 = 12.0 * T2 * T2 * Vgsteff_local;
11715  T4 = (1.0 - 12.0 * T2 * T2); //bug fix by wanh
11716  T7 = T2 * (2.0 + 6.0 * T2) - 0.5; //bug fix by wanh
11717 
11718  T5 = T7 * AbulkCV;
11719  T6 = T7 * VdseffCV;
11720 
11721 // qinv_local = CoxWL * (Vgsteff_local - 0.5 * VdseffCV + T3);
11722  qinv_local = CoxWL * (Vgsteff_local - 0.5 * T0 + T3);
11723 
11724  qinv = -qinv_local; // for noise v3.2
11725 
11726  Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg);
11727  Cgd1 = CoxWL * T5 * dVdseffCV_dVd;
11728  Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb);
11729 
11730  // Inversion charge partitioning into S / D
11731  if (model_.xpart > 0.5)
11732  { // 0/100 Charge partition model
11733  T1 = T1 + T1;
11734  qsrc = -CoxWL * (0.5 * Vgsteff_local + 0.25 * T0
11735  - T0 * T0 / T1);
11736  T7 = (4.0 * Vgsteff_local - T0) / (T1 * T1);
11737  T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1));
11738  T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7);
11739  T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7);
11740  Csg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg);
11741  Csd1 = CoxWL * T5 * dVdseffCV_dVd;
11742  Csb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb);
11743 
11744  }
11745  else if (model_.xpart < 0.5)
11746  { // 40/60 Charge partition model
11747  T1 = T1 / 12.0;
11748  T2 = 0.5 * CoxWL / (T1 * T1);
11749  T3 = Vgsteff_local * (2.0 * T0 * T0 / 3.0 + Vgsteff_local
11750  * (Vgsteff_local - 4.0 * T0 / 3.0))
11751  - 2.0 * T0 * T0 * T0 / 15.0;
11752  qsrc = -T2 * T3;
11753  T7 = 4.0 / 3.0 * Vgsteff_local * (Vgsteff_local - T0)
11754  + 0.4 * T0 * T0;
11755  T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff_local * (3.0
11756  * Vgsteff_local - 8.0 * T0 / 3.0) + 2.0 * T0 * T0 / 3.0);
11757  T5 = (qsrc / T1 + T2 * T7) * AbulkCV;
11758  T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV);
11759  Csg1 = T4 + T5 * dVdseffCV_dVg;
11760  Csd1 = T5 * dVdseffCV_dVd;
11761  Csb1 = T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb;
11762  }
11763  else
11764  { // 50/50 Charge partition model
11765  qsrc = - 0.5 * (qinv_local + qbulk);
11766  Csg1 = - 0.5 * (Cgg1 + Cbg1);
11767  Csb1 = - 0.5 * (Cgb1 + Cbb1);
11768  Csd1 = - 0.5 * (Cgd1 + Cbd1);
11769  }
11770 
11771 
11772 
11773  // Backgate charge
11774  // v3.1
11775  if (soiMod == 2) // v3.2 - ideal FD
11776  {
11777  Qe1 = dQe1_dVb = dQe1_dVe = dQe1_dT = 0;
11778  }
11779  else // soiMod = 0 or 1
11780  {
11781  CboxWL = paramPtr->kb1 * model_.fbody * Cbox
11782  * (paramPtr->weffCV / nseg
11783  * paramPtr->leffCVbg + aebcp);
11784  Qe1 = CboxWL * (Vesfb - Vbs);
11785  dQe1_dVb = -CboxWL;
11786  dQe1_dVe = CboxWL;
11787  if (selfheat)
11788  dQe1_dT = -CboxWL * dvfbb_dT;
11789  else
11790  dQe1_dT = 0;
11791  }
11792  // v3.1
11793 
11794 
11795  qgate = qinv_local + Qac0 + Qsub0;
11796  qbody = (qbulk - Qac0 - Qsub0 - Qe1);
11797  qsub = Qe1;
11798  qdrn = -(qgate + qsrc + qbody + qsub);
11799 
11800  // This transform all the dependency on Vgsteff_local, Vbseff
11801  // into real ones
11802  Ce1b = dQe1_dVb;
11803  Ce1e = dQe1_dVe;
11804 
11805  Csg = Csg1 * dVgsteff_dVg;
11806  Csd = Csd1 + Csg1 * dVgsteff_dVd;
11807  Csb = Csg1 * dVgsteff_dVb + Csb1 * dVbseff_dVb;
11808  if (selfheat)
11809  CsT = Csg1 * dVgsteff_dT;
11810  else
11811  CsT = 0.0;
11812 
11813  Cgg = (Cgg1 + dQsub0_dVg) * dVgsteff_dVg
11814  + dQac0_dVrg + dQsub0_dVrg;
11815  Cgd = (Cgg1 + dQsub0_dVg) * dVgsteff_dVd + Cgd1
11816  + dQac0_dVd + dQsub0_dVd;
11817  Cgb = (Cgg1 + dQsub0_dVg) * dVgsteff_dVb
11818  + (Cgb1 + dQsub0_dVb + dQac0_dVb) * dVbseff_dVb;
11819  if (selfheat)
11820  CgT = (Cgg1 + dQsub0_dVg) * dVgsteff_dT + dQac0_dT + dQsub0_dT;
11821  else
11822  CgT = 0.0;
11823 
11824  Cbg = (Cbg1 - dQsub0_dVg) * dVgsteff_dVg - dQac0_dVrg - dQsub0_dVrg;
11825  Cbd = (Cbg1 - dQsub0_dVg) * dVgsteff_dVd + Cbd1 - dQac0_dVd
11826  - dQsub0_dVd;
11827  Cbb = (Cbg1 - dQsub0_dVg) * dVgsteff_dVb - dQe1_dVb
11828  + (Cbb1 - dQsub0_dVb - dQac0_dVb) * dVbseff_dVb;
11829  if (selfheat)
11830  CbT = (Cbg1 - dQsub0_dVg) * dVgsteff_dT - dQac0_dT - dQsub0_dT
11831  - dQe1_dT;
11832  else
11833  CbT = 0.0;
11834 
11835 
11836  cggb = Cgg ;
11837  cgsb = - (Cgg + Cgd + Cgb);
11838  cgdb = Cgd;
11839  cgT = CgT;
11840 
11841  cbgb = Cbg;
11842  cbsb = -(Cbg + Cbd + Cbb) + Ce1e;
11843  cbdb = Cbd;
11844  cbeb = - Ce1e ;
11845  cbT = CbT;
11846 
11847  ceeb = Ce1e ;
11848  ceT = dQe1_dT;
11849 
11850  cdgb = -(Cgg + Cbg + Csg);
11851  cddb = -(Cgd + Cbd + Csd);
11852  cdeb = 0;
11853  cdT = -(CgT + CbT + CsT) - dQe1_dT;
11854  cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb
11855  + Csg + Csd + Csb) + Ce1b;
11856  } // End of if capMod == 2
11857 
11858  else if (model_.capMod == 3)
11859  {
11860 
11861  dVgsteff_dVb /= dVbseff_dVb;
11862  Cox = 3.453133e-11 / (model_.tox - model_.dtoxcv); //v2.2.3
11863  CoxWL *= model_.tox/ (model_.tox - model_.dtoxcv);
11864  CoxWLb *= model_.tox/ (model_.tox - model_.dtoxcv);
11865  Tox = 1.0e8 * (model_.tox - model_.dtoxcv);
11866 
11867 
11868  // v3.1
11869  if (soiMod == 2) // v3.2 - ideal FD
11870  {
11871  Qac0 = dQac0_dVg = dQac0_dVb = dQac0_dT = 0.0;
11872  Qsub0 = dQsub0_dVg = dQsub0_dVd = dQsub0_dVb = dQsub0_dT = 0.0;
11873  }
11874  else // soiMod = 0 or 1
11875  {
11876  if (selfheat) {
11877  Vfbzb = Vthzb - phi_local - paramPtr->k1eff * sqrtPhi
11878  + paramPtr->delvt;
11879  dVfbzb_dT = dVthzb_dT;
11880  }
11881  else {
11882  Vfbzb = paramPtr->vfbzb + paramPtr->delvt;
11883  dVfbzb_dT = 0;
11884  }
11885 
11886  V3 = Vfbzb - Vgs_eff + Vbseff - DELTA_3;
11887  if (Vfbzb <= 0.0)
11888  { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfbzb);
11889  T2 = -DELTA_3 / T0;
11890  }
11891  else
11892  { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfbzb);
11893  T2 = DELTA_3 / T0;
11894  }
11895 
11896  T1 = 0.5 * (1.0 + V3 / T0);
11897  Vfbeff = Vfbzb - 0.5 * (V3 + T0);
11898  dVfbeff_dVg = T1 * dVgs_eff_dVg;
11899  dVfbeff_dVb = -T1;
11900  if (selfheat)
11901  dVfbeff_dT = (1.0 - T1 - T2) * dVfbzb_dT;
11902  else
11903  dVfbeff_dT = 0.0;
11904 
11905 
11906  T0 = (Vgs_eff - Vbseff - Vfbzb) / Tox;
11907  dT0_dVg = dVgs_eff_dVg / Tox;
11908  dT0_dVb = -1.0 / Tox;
11909 
11910  tmp = T0 * paramPtr->acde;
11911  if ((-EXPL_THRESHOLD < tmp) && (tmp < EXPL_THRESHOLD))
11912  { Tcen = paramPtr->ldeb * exp(tmp);
11913  dTcen_dVg = paramPtr->acde * Tcen;
11914  dTcen_dVb = dTcen_dVg * dT0_dVb;
11915  dTcen_dVg *= dT0_dVg;
11916  if (selfheat)
11917  dTcen_dT = -Tcen * paramPtr->acde * dVfbzb_dT / Tox;
11918  else
11919  dTcen_dT = 0;
11920  }
11921  else if (tmp <= -EXPL_THRESHOLD)
11922  { Tcen = paramPtr->ldeb * MIN_EXPL;
11923  dTcen_dVg = dTcen_dVb = dTcen_dT = 0.0;
11924  }
11925  else
11926  { Tcen = paramPtr->ldeb * MAX_EXPL;
11927  dTcen_dVg = dTcen_dVb = dTcen_dT = 0.0;
11928  }
11929 
11930  LINK = 1.0e-3 * (model_.tox - model_.dtoxcv); // v2.2.3
11931  V3 = paramPtr->ldeb - Tcen - LINK;
11932  V4 = sqrt(V3 * V3 + 4.0 * LINK * paramPtr->ldeb);
11933  Tcen = paramPtr->ldeb - 0.5 * (V3 + V4);
11934  T1 = 0.5 * (1.0 + V3 / V4);
11935  dTcen_dVg *= T1;
11936  dTcen_dVb *= T1;
11937  if (selfheat)
11938  dTcen_dT *= T1;
11939  else
11940  dTcen_dT = 0;
11941 
11942  Ccen = CONSTEPSSI / Tcen;
11943  T2 = Cox / (Cox + Ccen);
11944  Coxeff = T2 * Ccen;
11945  T3 = -Ccen / Tcen;
11946  dCoxeff_dVg = T2 * T2 * T3;
11947  dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb;
11948  dCoxeff_dVg *= dTcen_dVg;
11949  if (selfheat)
11950  dCoxeff_dT = T3 * dTcen_dT * (T2 - Coxeff / (Cox + Ccen));
11951  else
11952  dCoxeff_dT = 0;
11953  CoxWLcenb = CoxWLb * Coxeff / Cox;
11954  if (selfheat)
11955  dCoxWLcenb_dT = CoxWLb * dCoxeff_dT / Cox;
11956  else
11957  dCoxWLcenb_dT = 0;
11958 
11959  Qac0 = CoxWLcenb * (Vfbeff - Vfbzb);
11960  QovCox = Qac0 / Coxeff;
11961  dQac0_dVg = CoxWLcenb * dVfbeff_dVg
11962  + QovCox * dCoxeff_dVg;
11963  dQac0_dVb = CoxWLcenb * dVfbeff_dVb
11964  + QovCox * dCoxeff_dVb;
11965  if (selfheat)
11966  dQac0_dT = CoxWLcenb * (dVfbeff_dT - dVfbzb_dT)
11967  + dCoxWLcenb_dT * (Vfbeff - Vfbzb);
11968  else
11969  dQac0_dT = 0.0;
11970 
11971  T0 = 0.5 * paramPtr->k1eff;
11972  T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff_local;
11973  if (paramPtr->k1eff == 0.0)
11974  { T1 = 0.0;
11975  T2 = 0.0;
11976  }
11977  else if (T3 < 0.0)
11978  { T1 = T0 + T3 / paramPtr->k1eff;
11979  T2 = CoxWLcenb;
11980  }
11981  else
11982  { T1 = sqrt(T0 * T0 + T3);
11983  T2 = CoxWLcenb * T0 / T1;
11984  }
11985 
11986  Qsub0 = CoxWLcenb * paramPtr->k1eff * (T1 - T0);
11987  QovCox = Qsub0 / Coxeff;
11988  dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg)
11989  + QovCox * dCoxeff_dVg;
11990  dQsub0_dVd = -T2 * dVgsteff_dVd;
11991  dQsub0_dVb = -T2 * (dVfbeff_dVb + 1 + dVgsteff_dVb)
11992  + QovCox * dCoxeff_dVb;
11993  if (selfheat)
11994  dQsub0_dT = -T2 * (dVfbeff_dT + dVgsteff_dT)
11995  + dCoxWLcenb_dT * paramPtr->k1eff * (T1 - T0);
11996  else
11997  dQsub0_dT = 0.0;
11998  }
11999  // v3.1
12000 
12001 
12002  // Gate-bias dependent delta Phis begins
12003  if (paramPtr->k1eff <= 0.0)
12004  { Denomi = 0.25 * paramPtr->moin * Vtm;
12005  T0 = 0.5 * paramPtr->sqrtPhi;
12006  }
12007  else
12008  { Denomi = paramPtr->moin * Vtm
12009  * paramPtr->k1eff * paramPtr->k1eff;
12010  T0 = paramPtr->k1eff * paramPtr->sqrtPhi;
12011  }
12012  T1 = 2.0 * T0 + Vgsteff_local;
12013 
12014  DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff_local / Denomi);
12015  dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff_local);
12016  dDeltaPhi_dVd = dDeltaPhi_dVg * dVgsteff_dVd;
12017  dDeltaPhi_dVb = dDeltaPhi_dVg * dVgsteff_dVb;
12018  // End of delta Phis
12019 
12020 
12021  // v3.1.1 bug fix for discontinuity
12022  T3 = 4.0 * (Vth - Vfbzb - phi_local);
12023  T2 = sqrt(T3*T3 + 0.0001);
12024  T5 = 0.5 * (1 + T3/T2);
12025  T4 = 0.5 * (T3 + T2);
12026 
12027  Tox += Tox;
12028  T0 = (Vgsteff_local + T4) / Tox;
12029  tmp = exp(0.7 * log(T0));
12030  T1 = 1.0 + tmp;
12031  T2 = 0.7 * tmp / (T0 * Tox);
12032  Tcen = 1.9e-9 / T1;
12033  dTcen_dVg = -Tcen * T2 / T1;
12034  dTcen_dVd = dTcen_dVg * (T5 * 4.0 * dVth_dVd + dVgsteff_dVd);
12035  dTcen_dVb = dTcen_dVg * (T5 * 4.0 * dVth_dVb + dVgsteff_dVb);
12036  dTcen_dVg *= dVgsteff_dVg;
12037  if (selfheat)
12038  dTcen_dT = -Tcen * T2 / T1
12039  * (T5 * 4.0 * (dVth_dT - dVfbzb_dT) + dVgsteff_dT);
12040  else
12041  dTcen_dT = 0;
12042 
12043 
12044  Ccen = CONSTEPSSI / Tcen;
12045  T0 = Cox / (Cox + Ccen);
12046  Coxeff = T0 * Ccen;
12047  T1 = -Ccen / Tcen;
12048  dCoxeff_dVg = T0 * T0 * T1;
12049  dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd;
12050  dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb;
12051  dCoxeff_dVg *= dTcen_dVg;
12052  if (selfheat)
12053  dCoxeff_dT = T1 * dTcen_dT * (T0 - Coxeff / (Cox + Ccen));
12054  else dCoxeff_dT = 0;
12055  CoxWLcen = CoxWL * Coxeff / Cox;
12056  CoxWLcenb = CoxWLb * Coxeff / Cox;
12057 
12058  AbulkCV = Abulk0 * paramPtr->abulkCVfactor;
12059  dAbulkCV_dVb = paramPtr->abulkCVfactor * dAbulk0_dVb;
12060  VdsatCV = (Vgsteff_local - DeltaPhi) / AbulkCV;
12061  V4 = VdsatCV - Vds - DELTA_4;
12062  T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV);
12063  VdseffCV = VdsatCV - 0.5 * (V4 + T0);
12064  T1 = 0.5 * (1.0 + V4 / T0);
12065  T2 = DELTA_4 / T0;
12066  T3 = (1.0 - T1 - T2) / AbulkCV;
12067  T4 = T3 * ( 1.0 - dDeltaPhi_dVg);
12068  dVdseffCV_dVg = T4;
12069  dVdseffCV_dVd = T1;
12070  dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb;
12071 
12072  T0 = AbulkCV * VdseffCV;
12073  T1 = Vgsteff_local - DeltaPhi;
12074  T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20);
12075  T3 = T0 / T2;
12076  T4 = 1.0 - 12.0 * T3 * T3;
12077  T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5);
12078  T6 = T5 * VdseffCV / AbulkCV;
12079 
12080  qinv_local = qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3));
12081  QovCox = qgate / Coxeff;
12082  Cgg1 = CoxWLcen * (T4 * (1.0 - dDeltaPhi_dVg)
12083  + T5 * dVdseffCV_dVg);
12084  Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1
12085  * dVgsteff_dVd + QovCox * dCoxeff_dVd;
12086  Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
12087  + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb;
12088  Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg;
12089 
12090 
12091  // v3.1
12092  if (soiMod == 2) // v3.2 - ideal FD
12093  {
12094  qbulk = Cbg1 = Cbd1 = Cbb1 = Cbg1 = 0;
12095  }
12096  else // soiMod = 0 or 1
12097  {
12098  T7 = 1.0 - AbulkCV;
12099  T8 = T2 * T2;
12100  T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV);
12101  T10 = T9 * (1.0 - dDeltaPhi_dVg);
12102  T11 = -T7 * T5 / AbulkCV;
12103  T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2));
12104 
12105  qbulk = CoxWLcenb * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2);
12106  QovCox = qbulk / Coxeff;
12107  Cbg1 = CoxWLcenb * (T10 + T11 * dVdseffCV_dVg);
12108  Cbd1 = CoxWLcenb * T11 * dVdseffCV_dVd + Cbg1
12109  * dVgsteff_dVd + QovCox * dCoxeff_dVd;
12110  Cbb1 = CoxWLcenb * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb)
12111  + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb;
12112  Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg;
12113  }
12114  // v3.1
12115 
12116 
12117  if (model_.xpart > 0.5)
12118  { // 0/100 partition
12119  qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0
12120  - 0.5 * T0 * T0 / T2);
12121  QovCox = qsrc / Coxeff;
12122  T2 += T2;
12123  T3 = T2 * T2;
12124  T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3);
12125  T4 = -(0.5 + 24.0 * T0 * T0 / T3) * (1.0 - dDeltaPhi_dVg);
12126  T5 = T7 * AbulkCV;
12127  T6 = T7 * VdseffCV;
12128 
12129  Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg);
12130  Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd
12131  + QovCox * dCoxeff_dVd;
12132  Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
12133  + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb;
12134  Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg;
12135  }
12136  else if (model_.xpart < 0.5)
12137  { // 40/60 partition
12138  T2 = T2 / 12.0;
12139  T3 = 0.5 * CoxWLcen / (T2 * T2);
12140  T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0
12141  * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0;
12142  qsrc = -T3 * T4;
12143  QovCox = qsrc / Coxeff;
12144  T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0;
12145  T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0
12146  * T0 / 3.0) + 2.0 * T0 * T0 / 3.0);
12147  T6 = AbulkCV * (qsrc / T2 + T3 * T8);
12148  T7 = T6 * VdseffCV / AbulkCV;
12149 
12150  Csg = T5 * (1.0 - dDeltaPhi_dVg) + T6 * dVdseffCV_dVg;
12151  Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd
12152  + QovCox * dCoxeff_dVd;
12153  Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb
12154  + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb;
12155  Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg;
12156  }
12157  else
12158  { // 50/50 partition
12159  qsrc = -0.5 * qgate;
12160  Csg = -0.5 * Cgg1;
12161  Csd = -0.5 * Cgd1;
12162  Csb = -0.5 * Cgb1;
12163  }
12164 
12165 
12166  // Backgate charge
12167  // v3.1
12168  if (soiMod == 2) // v3.2 - ideal FD
12169  {
12170  Qe1 = Ce1b = Ce1e = Ce1T = dQe1_dT = 0;
12171  }
12172  else // soiMod = 0 or 1
12173  {
12174  CboxWL = paramPtr->kb1 * model_.fbody * Cbox
12175  * (paramPtr->weffCV / nseg
12176  * paramPtr->leffCVbg + aebcp);
12177  Qe1 = CboxWL * (Vesfb - Vbs);
12178  Ce1b = dQe1_dVb = -CboxWL;
12179  Ce1e = dQe1_dVe = CboxWL;
12180  if (selfheat)
12181  Ce1T = dQe1_dT = -CboxWL * dvfbb_dT;
12182  else
12183  Ce1T = dQe1_dT = 0.0;
12184  }
12185  // v3.1
12186 
12187 
12188  qgate += Qac0 + Qsub0 - qbulk;
12189  qbody = qbulk - Qac0 - Qsub0 - Qe1;
12190  qsub = Qe1;
12191  qdrn = -(qgate + qbody + qsub + qsrc);
12192 
12193  Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg;
12194  Cbd = Cbd1 - dQsub0_dVd;
12195  Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb - Ce1b / dVbseff_dVb;
12196  if (selfheat)
12197  CbT = Cbg1 * dVgsteff_dT - dQac0_dT
12198  - dQsub0_dT - dQe1_dT;
12199  else
12200  CbT = 0.0;
12201 
12202  Cgg = Cgg1 - Cbg;
12203  Cgd = Cgd1 - Cbd;
12204  Cgb = Cgb1 - Cbb - Ce1b / dVbseff_dVb;
12205  if (selfheat)
12206  CgT = Cgg1 * dVgsteff_dT + dQac0_dT + dQsub0_dT;
12207  else
12208  CgT = 0.0;
12209 
12210  Cgb *= dVbseff_dVb;
12211  Cbb *= dVbseff_dVb;
12212  Csb *= dVbseff_dVb;
12213  if (selfheat)
12214  CsT = Csg * dVgsteff_dT;
12215  else
12216  CsT = 0.0;
12217 
12218  cggb = Cgg;
12219  cgsb = -(Cgg + Cgd + Cgb);
12220  cgdb = Cgd;
12221  cgT = CgT;
12222 
12223  cbgb = Cbg;
12224  cbsb = -(Cbg + Cbd + Cbb)
12225  + Ce1e;
12226  cbdb = Cbd;
12227  cbeb = -Ce1e;
12228  cbT = CbT;
12229 
12230  ceT = Ce1T;
12231  ceeb = Ce1e ;
12232 
12233  cdgb = -(Cgg + Cbg + Csg);
12234  cddb = -(Cgd + Cbd + Csd);
12235  cdeb = 0;
12236  cdT = -(CgT+CbT+CsT) - Ce1T;
12237  cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb
12238  + Csg + Csd + Csb) + Ce1b;
12239  qinv = -qinoi;
12240 
12241  } // End of if capMod ==3
12242  }
12243 
12244  finished: // returning Values to Calling Routine
12245 
12246  //
12247  // COMPUTE EQUIVALENT DRAIN CURRENT SOURCE
12248  //
12249 
12250 
12252  {
12253  // Intrinsic S/D junction charge
12254  // v3.1
12255  if (soiMod == 2) // v3.2 - ideal FD
12256  {
12257  qjs_local = qjd_local = 0.0;
12258  gcjdds = gcjdbs = gcjdT = 0.0;
12259  gcjsbs = gcjsT = 0.0;
12260  }
12261  else // soiMod = 0 or 1
12262  {
12263  PhiBSWG = model_.GatesidewallJctPotential;
12264  dPhiBSWG_dT = -model_.tpbswg;
12265  PhiBSWG += dPhiBSWG_dT * (Temp - model_.tnom);
12267 
12269  * wdiosCV * model_.tsi / 1e-7;
12270  dcjsbs_dT = cjsbs * model_.tcjswg;
12271  cjsbs += dcjsbs_dT * (Temp - model_.tnom);
12272 
12274  * wdiodCV * model_.tsi / 1e-7;
12275  dcjdbs_dT = cjdbs * model_.tcjswg;
12276  cjdbs += dcjdbs_dT * (Temp - model_.tnom);
12277 
12278  DioMax = 0.9 * (PhiBSWG);
12279 
12280  arg = 1.0 - (Vbs > DioMax ? DioMax : Vbs) / PhiBSWG;
12281 
12282  if (selfheat)
12283  darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT;
12284 
12285  if (MJSWG == 0.5) {
12286  dT3_dVb = 1.0 / sqrt(arg);
12287 
12288  if (selfheat) ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT;
12289  }
12290  else {
12291  dT3_dVb = exp(-MJSWG * log(arg));
12292 
12293  if (selfheat) ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT;
12294  }
12295  T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG);
12296 
12297  if (selfheat)
12298  dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG)
12299  - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG
12300  / (1.0 - MJSWG);
12301 
12302  if (Vbs > DioMax)
12303  T3 += dT3_dVb * (Vbs - DioMax);
12304 
12305  qjs_local = cjsbs * T3 + model_.tt * Ibsdif;
12306  gcjsbs = cjsbs * dT3_dVb + model_.tt * dIbsdif_dVb;
12307 
12308  if (selfheat)
12309  gcjsT = model_.tt * dIbsdif_dT + dcjsbs_dT * T3
12310  + dT3_dT * cjsbs;
12311  else
12312  gcjsT = 0.0;
12313 
12314 
12315  arg = 1.0 - (Vbd > DioMax ? DioMax : Vbd) / PhiBSWG;
12316 
12317  if (selfheat)
12318  darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT;
12319 
12320  if (MJSWG == 0.5) {
12321  dT3_dVb = 1.0 / sqrt(arg);
12322 
12323  if (selfheat) ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT;
12324  }
12325  else {
12326  dT3_dVb = exp(-MJSWG * log(arg));
12327 
12328  if (selfheat) ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT;
12329  }
12330  T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG);
12331 
12332  if (selfheat)
12333  dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG)
12334  - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG
12335  / (1.0 - MJSWG);
12336 
12337  if (Vbd > DioMax)
12338  T3 += dT3_dVb * (Vbd - DioMax);
12339 
12340  dT3_dVd = -dT3_dVb;
12341 
12342  qjd_local = cjdbs * T3 + model_.tt * Ibddif;
12343  gcjdbs = cjdbs * dT3_dVb + model_.tt * dIbddif_dVb;
12344  gcjdds = cjdbs * dT3_dVd + model_.tt * dIbddif_dVd;
12345 
12346  if (selfheat)
12347  gcjdT = model_.tt * dIbddif_dT + dcjdbs_dT * T3
12348  + dT3_dT * cjdbs;
12349  else
12350  gcjdT = 0.0;
12351  }
12352  // v3.1
12353 
12354  qdrn -= qjd_local;
12355  qbody += (qjs_local + qjd_local);
12356  qsrc = -(qgate + qbody + qdrn + qsub);
12357 
12358  // Update the conductance
12359  cddb -= gcjdds;
12360  cdT -= gcjdT;
12361  cdsb += gcjdds + gcjdbs;
12362 
12363  cbdb += (gcjdds);
12364  cbT += (gcjdT + gcjsT);
12365  cbsb -= (gcjdds + gcjdbs + gcjsbs);
12366 
12367  // Extrinsic Bottom S/D to substrate charge
12368  T10 = -model_.dtype * ves;
12369  // T10 is vse without dtype conversion
12370  T11 = model_.dtype * (vds - ves);
12371  // T11 is vde without dtype conversion
12372 
12373  if (model_.csdmin != 0.0)
12374  {
12375  if ( ((paramPtr->nsub > 0) && (model_.dtype > 0)) ||
12376  ((paramPtr->nsub < 0) && (model_.dtype < 0)) )
12377  {
12378  if (T10 < paramPtr->vsdfb)
12379  { qse = csbox * (T10 - paramPtr->vsdfb);
12380  gcse = csbox;
12381  }
12382  else if (T10 < paramPtr->sdt1)
12383  { T0 = T10 - paramPtr->vsdfb;
12384  T1 = T0 * T0;
12385  qse = T0 * (csbox - paramPtr->st2 / 3 * T1) ;
12386  gcse = csbox - paramPtr->st2 * T1;
12387  }
12388  else if (T10 < paramPtr->vsdth)
12389  { T0 = T10 - paramPtr->vsdth;
12390  T1 = T0 * T0;
12391  qse = csmin * T10 + st4 + paramPtr->st3 / 3 * T0 * T1;
12392  gcse = csmin + paramPtr->st3 * T1;
12393  }
12394  else
12395  { qse = csmin * T10 + st4;
12396  gcse = csmin;
12397  }
12398  } else
12399  {
12400  if (T10 < paramPtr->vsdth)
12401  { qse = csmin * (T10 - paramPtr->vsdth);
12402  gcse = csmin;
12403  }
12404  else if (T10 < paramPtr->sdt1)
12405  { T0 = T10 - paramPtr->vsdth;
12406  T1 = T0 * T0;
12407  qse = T0 * (csmin - paramPtr->st2 / 3 * T1) ;
12408  gcse = csmin - paramPtr->st2 * T1;
12409  }
12410  else if (T10 < paramPtr->vsdfb)
12411  { T0 = T10 - paramPtr->vsdfb;
12412  T1 = T0 * T0;
12413  qse = csbox * T10 + st4 + paramPtr->st3 / 3 * T0 * T1;
12414  gcse = csbox + paramPtr->st3 * T1;
12415  }
12416  else
12417  { qse = csbox * T10 + st4;
12418  gcse = csbox;
12419  }
12420  }
12421 
12422  if ( ((paramPtr->nsub > 0) && (model_.dtype > 0)) ||
12423  ((paramPtr->nsub < 0) && (model_.dtype < 0)) )
12424  {
12425  if (T11 < paramPtr->vsdfb)
12426  { qde = cdbox * (T11 - paramPtr->vsdfb);
12427  gcde = cdbox;
12428  }
12429  else if (T11 < paramPtr->sdt1)
12430  { T0 = T11 - paramPtr->vsdfb;
12431  T1 = T0 * T0;
12432  qde = T0 * (cdbox - paramPtr->dt2 / 3 * T1) ;
12433  gcde = cdbox - paramPtr->dt2 * T1;
12434  }
12435  else if (T11 < paramPtr->vsdth)
12436  { T0 = T11 - paramPtr->vsdth;
12437  T1 = T0 * T0;
12438  qde = cdmin * T11 + dt4 + paramPtr->dt3 / 3 * T0 * T1;
12439  gcde = cdmin + paramPtr->dt3 * T1;
12440  }
12441  else
12442  { qde = cdmin * T11 + dt4;
12443  gcde = cdmin;
12444  }
12445  } else
12446  {
12447  if (T11 < paramPtr->vsdth)
12448  { qde = cdmin * (T11 - paramPtr->vsdth);
12449  gcde = cdmin;
12450  }
12451  else if (T11 < paramPtr->sdt1)
12452  { T0 = T11 - paramPtr->vsdth;
12453  T1 = T0 * T0;
12454  qde = T0 * (cdmin - paramPtr->dt2 / 3 * T1) ;
12455  gcde = cdmin - paramPtr->dt2 * T1;
12456  }
12457  else if (T11 < paramPtr->vsdfb)
12458  { T0 = T11 - paramPtr->vsdfb;
12459  T1 = T0 * T0;
12460  qde = cdbox * T11 + dt4 + paramPtr->dt3 / 3 * T0 * T1;
12461  gcde = cdbox + paramPtr->dt3 * T1;
12462  }
12463  else
12464  { qde = cdbox * T11 + dt4;
12465  gcde = cdbox;
12466  }
12467  }
12468  }
12469  else {
12470  qse = csbox * T10;
12471  gcse = csbox;
12472  qde = cdbox * T11;
12473  gcde = cdbox;
12474  }
12475 
12476  // Extrinsic : Sidewall fringing S/D charge
12477  qse += csesw * T10;
12478  gcse += csesw;
12479  qde += cdesw * T11;
12480  gcde += cdesw;
12481 
12482  // All charge are mutliplied with dtype at the end, but qse and qde
12483  // have true polarity => so pre-mutliplied with dtype
12484  qse *= model_.dtype;
12485  qde *= model_.dtype;
12486  }
12487 
12488  cbb = Cbb;
12489  cbd = Cbd;
12490  cbg = Cbg;
12491  qbf = -Qsub0 - Qac0;
12492  qjs = qjs_local;
12493  qjd = qjd_local;
12494 
12495  // Setting up a few currents for the RHS load:
12496  // Note: Vdp and Vsp get limited, but Vd and Vs do not.
12497  if (dNodePrime == 1) // if drain resistor exists
12498  {
12499  Idrain = drainConductance * (Vd - Vdp);
12500  Idrain_Jdxp = 0.0;
12501 
12502  // no limit on Vd, just Vdp
12503  Idrain_Jdxp = - drainConductance * ( - (Vdp-Vdp_orig));
12504  }
12505 
12506  if (sNodePrime == 1) // if source resistor exists
12507  {
12508  Isource = sourceConductance * (Vs - Vsp);
12509  Isource_Jdxp = 0.0;
12510 
12511  // no limit on Vs, just Vsp
12512  Isource_Jdxp = - sourceConductance * ( - (Vsp-Vsp_orig));
12513  }
12514 
12515  if (selfheat)
12516  Ith = delTemp/paramPtr->rth;
12517  else
12518  Ith = 0;
12519 
12520  Igate = IgateMid = 0.0;
12521  if(rgateMod == 1)
12522  {
12523  Igate = grgeltd * (Vg - Vgp);
12524  Igate_Jdxp = 0.0;
12525 
12526  Igate_Jdxp = - grgeltd * ((Vg-Vg_orig) - (Vgp-Vgp_orig));
12527  }
12528  else if(rgateMod == 2)
12529  {
12530  // gcrg is already the combined conductance of Rgeltd and Rii
12531  // No need to calculate jdxp here, because in fact ceqgcrg's jdxp
12532  // already handles it. This is not the case for rgateMod==1
12533  Igate = (gcrg) * (Vg - Vgp);
12534  Igate_Jdxp = 0.0;
12535  }
12536  else if(rgateMod == 3)
12537  {
12538  // Need to check this --- might need some Jdxp terms for Igate, but
12539  // not for IgateMid, whose Jdxp terms are already in ceqgcrg
12540  Igate = grgeltd * (Vg - Vgm);
12541  IgateMid = gcrg * (Vgm - Vgp);
12542  Igate_Jdxp = 0.0;
12543  }
12544 
12545  // There is a spice3f5 convergence check that would happen here.
12546  // (line 2404) skipping...
12547 
12548  // In 3f5, loading a bunch of things into the state vector at this point.
12549  // (line 2433) skipping...
12550 
12551  // The following lines of charge computation are necessary in this routine,
12552  // and can't be deferred to auxChargeCalculations: TVR ADDITION
12553 
12555 
12556  if (mode >= 0)
12557  { Gm = gm;
12558  Gmbs = gmbs;
12559  Gme = gme;
12560 
12561  GmT = model_.dtype * gmT;
12562 
12563  FwdSum = Gm + Gmbs + Gme; // v3.0
12564  RevSum = 0.0;
12565 
12566 // spice has:
12567 // cdreq = model_.dtype * (cdrain - gds * vds
12568 // - Gm * vgs - Gmbs * vbs - Gme * ves) - GmT * delTemp;
12569 
12570  cdreq_Jdxp = 0.0;
12571  cdreq = model_.dtype * cdrain;
12572  cdreq_Jdxp = model_.dtype *
12573  (-gds * (vds-vds_orig)
12574  -Gm * (vgs-vgs_orig)
12575  -Gmbs * (vbs-vbs_orig)
12576  -Gme * (ves-ves_orig))
12577  -GmT * (delTemp-delTemp_orig);
12578 
12579  // ceqbs now is compatible with cdreq, ie. going in is +ve
12580  // Equivalent current source from the diode
12581  ceqbs = cjs;
12582  ceqbd = cjd;
12583 
12584  ceqbs_Jdxp = cjs_Jdxp;
12585  ceqbd_Jdxp = cjd_Jdxp;
12586 
12587  // Current going in is +ve
12588  ceqbody = -cbody;
12590 
12591  ceqgate = cgate;
12593 
12594  gigg_jac = gigg;
12595  gigb_jac = gigb;
12596  gige_jac = gige; // v3.0
12597  gigs_jac = gigs;
12598  gigd_jac = gigd;
12599  gigT_jac = model_.dtype * gigT;
12600 
12601  ceqth = cth;
12602  ceqth_Jdxp = cth_Jdxp;
12603  ceqbodcon = cbodcon;
12605 
12606  gbbg = -gbgs;
12607  gbbdp = -gbds;
12608  gbbb = -gbbs;
12609  gbbp = -gbps;
12610  gbbT = -model_.dtype * gbT; // v3.0
12611  gbbe = -gbes;
12612  gbbsp = - ( gbbg + gbbdp + gbbb + gbbp + gbbe);
12613 
12614  gddpg = -gjdg;
12615  gddpdp = -gjdd;
12616  gddpb = -gjdb;
12617  gddpT = -model_.dtype * gjdT; // v3.0
12618  gddpe = -gjde;
12619  gddpsp = - ( gddpg + gddpdp + gddpb + gddpe);
12620 
12621  gsspg = -gjsg;
12622  gsspdp = -gjsd;
12623  gsspb = -gjsb;
12624  gsspT = -model_.dtype * gjsT; // v3.0
12625  gsspe = 0.0;
12626  gsspsp = - (gsspg + gsspdp + gsspb + gsspe);
12627 
12628  gppb = -gbpbs;
12629  gppp = -gbpps;
12630 
12631  gTtg = gtempg;
12632  gTtb = gtempb;
12633  gTtdp = gtempd;
12634  gTtt = gtempT;
12635 
12636  // v3.0
12637  gTte = gtempe;
12638  gTtsp = - (gTtg + gTtb + gTtdp + gTte);
12639 
12640 
12641  // v3.0
12642  if (model_.igcMod)
12643  { gIstotg = gIgsg + gIgcsg;
12644  gIstotd = gIgcsd;
12645  gIstots = gIgss + gIgcss;
12646  gIstotb = gIgcsb;
12647 // Istoteq = model_.dtype * (Igs + Igcs
12648 // - gIstotg * vgs - gIgcsd * vds - gIgcsb * vbs);
12649 
12650  Istoteq_Jdxp = 0.0;
12651  Istoteq = model_.dtype * (Igs + Igcs);
12652  // NOTE: mimicing spice, we don't use the "Vgs/Vds/Vbs" versions
12654  (- gIstotg * (vgs-vgs_orig)
12655  - gIgcsd * (vds-vds_orig)
12656  - gIgcsb * (vbs-vbs_orig));
12657 
12658  gIdtotg = gIgdg + gIgcdg;
12659  gIdtotd = gIgdd + gIgcdd;
12660  gIdtots = gIgcds;
12661  gIdtotb = gIgcdb;
12662 // Idtoteq = model_.dtype * (Igd + Igcd
12663 // - gIgdg * vgd - gIgcdg * vgs - gIgcdd * vds - gIgcdb * vbs);
12664 
12665  Idtoteq_Jdxp = 0.0;
12666  Idtoteq = model_.dtype * (Igd + Igcd);
12667  // NOTE: mimicing SPICE, we use the original vgd/vgs/vds not
12668  // the "mode aware" "Vgs/Vds" etc.
12670  (- gIgdg * (vgd-vgd_orig)
12671  - gIgcdg * (vgs-vgs_orig)
12672  - gIgcdd * (vds-vds_orig)
12673  - gIgcdb * (vbs-vbs_orig));
12674 
12675  gIgtotg = gIstotg + gIdtotg;
12676  gIgtotd = gIstotd + gIdtotd;
12677  gIgtots = gIstots + gIdtots;
12678  gIgtotb = gIstotb + gIdtotb;
12679  Igtoteq = Istoteq + Idtoteq;
12680  Igtoteq_Jdxp = 0.0;
12682  }
12683  else
12684  { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0;
12685  gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0;
12686 
12687  gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0;
12688  }
12689 
12690  // v3.1 wanh added for RF
12691  if (rgateMod == 2)
12692  T0 = vges - vgs;
12693  else if (rgateMod == 3)
12694  T0 = vgms - vgs;
12695  if (rgateMod > 1)
12696  {
12697  gcrgd_jac = gcrgd * T0;
12698  gcrgg_jac = gcrgg * T0;
12699  gcrgs_jac = gcrgs * T0;
12700  gcrgb_jac = gcrgb * T0;
12701 
12702 // ceqgcrg = -(gcrgd_jac * vds + gcrgg_jac * vgs + gcrgb_jac * vbs);
12703 
12704  ceqgcrg_Jdxp = 0.0;
12705  ceqgcrg = 0.0;
12706  ceqgcrg_Jdxp = -(gcrgd_jac * (vds - vds_orig) +
12707  gcrgg_jac * (vgs - vgs_orig) +
12708  gcrgb_jac * (vbs - vbs_orig));
12709 
12710  gcrgg_jac -= gcrg;
12711  gcrg_jac = gcrg;
12712  }
12713  else
12715  = gcrgs_jac = gcrgb_jac = 0.0;
12716  // v3.1 wanh added for RF end
12717 
12718  } // end of mode>=0
12719 
12720  else
12721  { Gm = -gm;
12722  Gmbs = -gmbs;
12723  Gme = -gme; // v3.0
12724 
12725  GmT = -model_.dtype * gmT;
12726  FwdSum = 0.0;
12727  RevSum = -(Gm + Gmbs + Gme); // v3.0
12728 
12729 
12730  // v3.1 bug fix
12731 // cdreq = -model_.dtype * (cdrain + gds*vds + Gm * vgd
12732 // + Gmbs * vbd + Gme * (ves - vds)) - GmT * delTemp;
12733 
12734  cdreq_Jdxp = 0.0;
12735  cdreq = -model_.dtype * cdrain;
12736  cdreq_Jdxp = -model_.dtype * (gds * (vds-vds_orig)
12737  +Gm * (vgd-vgd_orig)
12738  +Gmbs * (vbd-vbd_orig)
12739  +Gme * (ves-ves_orig-(vds-vds_orig))
12740  -GmT * (delTemp-delTemp_orig));
12741 
12742  ceqbs = cjd;
12743  ceqbd = cjs;
12744 
12745  ceqbs_Jdxp = cjd_Jdxp;
12746  ceqbd_Jdxp = cjs_Jdxp;
12747 
12748  // Current going in is +ve
12749  ceqbody = -cbody;
12751 
12752  ceqgate = cgate;
12754 
12755  gigg_jac = gigg;
12756  gigb_jac = gigb;
12757  gige_jac = gige; // v3.0
12758  gigs_jac = gigd;
12759  gigd_jac = gigs;
12760  gigT_jac = model_.dtype * gigT;
12761 
12762  ceqth = cth;
12763  ceqth_Jdxp = cth_Jdxp;
12764  ceqbodcon = cbodcon;
12766 
12767  gbbg = -gbgs;
12768  gbbb = -gbbs;
12769  gbbp = -gbps;
12770  gbbsp = -gbds;
12771  gbbT = -model_.dtype * gbT;
12772  gbbe = -gbes; // v3.0
12773  gbbdp = - ( gbbg + gbbsp + gbbb + gbbp + gbbe);
12774 
12775  gddpg = -gjsg;
12776  gddpsp = -gjsd;
12777  gddpb = -gjsb;
12778  gddpT = -model_.dtype * gjsT;
12779  gddpe = 0.0; // v3.0
12780  gddpdp = - (gddpg + gddpsp + gddpb + gddpe);
12781 
12782  gsspg = -gjdg;
12783  gsspsp = -gjdd;
12784  gsspb = -gjdb;
12785  gsspT = -model_.dtype * gjdT; // v3.0
12786  gsspe = -gjde;
12787  gsspdp = - ( gsspg + gsspsp + gsspb + gsspe);
12788 
12789  gppb = -gbpbs;
12790  gppp = -gbpps;
12791 
12792  gTtg = gtempg;
12793  gTtb = gtempb;
12794  gTtsp = gtempd;
12795  gTtt = gtempT;
12796 
12797  // v3.0
12798  gTte = gtempe;
12799  gTtdp = - (gTtg + gTtb + gTtsp + gTte);
12800 
12801  // v3.0
12802  if (model_.igcMod)
12803  { gIstotg = gIgsg + gIgcdg;
12804  gIstotd = gIgcds;
12805  gIstots = gIgss + gIgcdd;
12806  gIstotb = gIgcdb;
12807 // Istoteq = model_.dtype * (Igs + Igcd
12808 // - gIgsg * vgs - gIgcdg * vgd + gIgcdd * vds - gIgcdb * vbd);
12809 
12810  Istoteq_Jdxp = 0.0;
12811  Istoteq = model_.dtype * (Igs + Igcd);
12813  (- gIgsg * (vgs-vgs_orig)
12814  - gIgcdg * (vgd-vgd_orig)
12815  + gIgcdd * (vds-vds_orig)
12816  - gIgcdb * (vbd-vbd_orig));
12817 
12818 
12819  gIdtotg = gIgdg + gIgcsg;
12820  gIdtotd = gIgdd + gIgcss;
12821  gIdtots = gIgcsd;
12822  gIdtotb = gIgcsb;
12823 // Idtoteq = model_.dtype * (Igd + Igcs
12824 // - (gIgdg + gIgcsg) * vgd + gIgcsd * vds - gIgcsb * vbd);
12825 
12826  Idtoteq_Jdxp = 0.0;
12827  Idtoteq = model_.dtype * (Igd + Igcs);
12829  (- (gIgdg + gIgcsg) * (vgd-vgd_orig)
12830  + gIgcsd * (vds-vds_orig)
12831  - gIgcsb * (vbd-vbd_orig));
12832 
12833  gIgtotg = gIstotg + gIdtotg;
12834  gIgtotd = gIstotd + gIdtotd;
12835  gIgtots = gIstots + gIdtots;
12836  gIgtotb = gIstotb + gIdtotb;
12837  Igtoteq = Istoteq + Idtoteq;
12838 
12839  Igtoteq_Jdxp = 0;
12841  }
12842  else
12843  { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0;
12844  gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0;
12845 
12846  gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0;
12847  }
12848 
12849  // v3.1 wanh added for RF
12850  if (rgateMod == 2)
12851  T0 = vges - vgs;
12852  else if (rgateMod == 3)
12853  T0 = vgms - vgs;
12854  if (rgateMod > 1)
12855  {
12856  gcrgd_jac = gcrgs * T0;
12857  gcrgg_jac = gcrgg * T0;
12858  gcrgs_jac = gcrgd * T0;
12859  gcrgb_jac = gcrgb * T0;
12860 
12861  // ceqgcrg = -(gcrgg_jac * vgd - gcrgs_jac * vds + gcrgb_jac * vbd);
12862  ceqgcrg_Jdxp = 0.0;
12863  ceqgcrg = 0.0;
12864  ceqgcrg_Jdxp = -(gcrgg_jac * (vgd - vgd_orig) -
12865  gcrgs_jac * (vds - vds_orig) +
12866  gcrgb_jac * (vbd - vbd_orig));
12867 
12868  gcrgg_jac -= gcrg;
12869  gcrg_jac = gcrg;
12870  }
12871  else
12872  {
12874  = gcrgs_jac = gcrgb_jac = 0.0;
12875  }
12876  // v3.1 wanh added for RF end
12877 
12878  } // end of soimod<0
12879 
12880  return bsuccess;
12881 }
12882 
12883 //-----------------------------------------------------------------------------
12884 // Function : Instance::B3SOIlimit
12885 // Purpose : Limits the per-iteration change of absolute voltage values
12886 //
12887 // Special Notes :
12888 // Scope : public
12889 // Creator : Dave Shirley
12890 // Creation Date : 05/20/04
12891 //-----------------------------------------------------------------------------
12892 double Instance::B3SOIlimit(double vnew, double vold,
12893  double limit, int *check)
12894 {
12895  double T0, T1;
12896  T0 = vnew - vold;
12897  T1 = fabs(T0);
12898  if (T1 > limit)
12899  {
12900  if (T0 > 0.0)
12901  {
12902  vnew = vold + limit;
12903  }
12904  else
12905  {
12906  vnew = vold - limit;
12907  }
12908  *check = 1;
12909  }
12910  return vnew;
12911 }
12912 
12913 //-----------------------------------------------------------------------------
12914 // Function : Instance::setupCapacitors_oldDAE
12915 // Purpose :
12916 //
12917 // Special Notes : This was taken from updateIntermediateVars.
12918 // This function calculates capacitance *conductances*.
12919 // (C/dt terms), and also the charge variables:
12920 // qb, qg, qe, qd, qth, qgmid
12921 //
12922 // Another way of looking at this function - this is analogous
12923 // to all the capacitor-related code that gets executed
12924 // in the SPICE3 SOI device, prior to the NIintegrate
12925 // functions being called.
12926 //
12927 // In the old-dae form, this function needs to be called
12928 // before charges can be put into the state vector
12929 // (in updatePrimaryState).
12930 //
12931 // Scope : public
12932 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
12933 // Creation Date : 02/25/05
12934 //-----------------------------------------------------------------------------
12936 {
12937  bool bsuccess = true;
12938 
12939  // these are temporary local variables.
12940  double T0, T1, T2, T3, T4;
12941  double cgdo_local;
12942  double cgso_local;
12943  double ag0 = getSolverState().pdt;
12944 
12945  // ERK. 12/17/2006.
12946  // It is necessary to set ag0=0.0, because for the first time step out of
12947  // the DCOP, all the time derivatives are forced to be zero. Thus, all
12948  // their derivatives should also be zero. If it wasn't for that, then ag0
12949  // could always be pdt. (it used to be, before the -jacobian_test capability).
12950  if (!(getSolverState().dcopFlag) && getSolverState().initTranFlag && getSolverState().newtonIter==0)
12951  {
12952  ag0 = 0.0;
12953  }
12954 
12956  {
12957 
12958  T0 = vgd + DELTA_1;
12959  if (rgateMod == 3) T0 = vgmd + DELTA_1; /* v3.2 bug fix */
12960  T1 = sqrt(T0 * T0 + 4.0 * DELTA_1);
12961  T2 = 0.5 * (T0 - T1);
12962 
12963  /* v2.2.3 bug fix */
12964  T3 = wdiodCV_NoSwap * paramPtr->cgdl; /* v3.1 bug fix */
12965 
12966  T4 = sqrt(1.0 - 4.0 * T2 / paramPtr->ckappa);
12967  cgdo_local = paramPtr->cgdo + T3 - T3 * (1.0 - 1.0 / T4)
12968  * (0.5 - 0.5 * T0 / T1);
12969  qgdo = (paramPtr->cgdo + T3) * vgd - T3 * (T2
12970  + 0.5 * paramPtr->ckappa * (T4 - 1.0));
12971 
12972  if (rgateMod == 3) {
12973  qgdo = (paramPtr->cgdo + T3) * vgmd - T3 * (T2
12974  + 0.5 * paramPtr->ckappa * (T4 - 1.0));
12975  } /* v3.2 bug fix */
12976 
12977  T0 = vgs + DELTA_1;
12978  if (rgateMod == 3) T0 = vgms + DELTA_1; /* v3.2 bug fix */
12979  T1 = sqrt(T0 * T0 + 4.0 * DELTA_1);
12980  T2 = 0.5 * (T0 - T1);
12981 
12982  /* v2.2.3 bug fix */
12983  T3 = wdiosCV_NoSwap * paramPtr->cgsl; /* v3.1 bug fix */
12984 
12985  T4 = sqrt(1.0 - 4.0 * T2 / paramPtr->ckappa);
12986  cgso_local = paramPtr->cgso + T3 - T3 * (1.0 - 1.0 / T4)
12987  * (0.5 - 0.5 * T0 / T1);
12988  qgso = (paramPtr->cgso + T3) * vgs - T3 * (T2
12989  + 0.5 * paramPtr->ckappa * (T4 - 1.0));
12990 
12991  if (rgateMod == 3) {
12992  qgso = (paramPtr->cgso + T3) * vgms - T3 * (T2
12993  + 0.5 * paramPtr->ckappa * (T4 - 1.0));
12994  } /* v3.2 bug fix */
12995 
12996  if (mode > 0)
12997  {
12998 
12999  /* v3.1 wanh added for RF */
13000  if (rgateMod == 3)
13001  {
13002  gcgmgmb = (cgdo_local + cgso_local + paramPtr->cgeo) * ag0;
13003 
13004  gcgmdb = -cgdo_local * ag0;
13005  gcgmsb = -cgso_local * ag0;
13006  gcgmeb = -paramPtr->cgeo * ag0;
13007  gcdgmb = gcgmdb;
13008  gcsgmb = gcgmsb;
13009  gcegmb = gcgmeb;
13010 
13011  gcggb = cggb * ag0;
13012  gcgdb = cgdb * ag0;
13013  gcgsb = cgsb * ag0;
13014  gcgeb = 0 ;/*v3.1 wanh changed*/
13015  gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb);
13016 
13017  gcdgb = cdgb * ag0;
13018  gcegb = gcgeb; /*v3.1 wanh added*/
13019  gcsgb = -(cggb + cbgb + cdgb) * ag0 - gcegb;
13020  gcbgb = cbgb * ag0;
13021 
13022  qgd = qgdo;
13023  qgs = qgso;
13024  qge = 0; /* v3.1 wanh changed */
13025 
13026  qgme = paramPtr->cgeo * vgme;
13027  qgmid = qgdo + qgso + qgme;
13028  qgate += qge;
13029  qbody -= 0;
13030  qdrn += qde - qgd;
13031  qsub -= qgme + qse + qde;
13032  qsrc = -(qgate + qgmid + qbody + qdrn + qsub);
13033  }
13034  else
13035  {
13036  gcggb = (cggb + cgdo_local + cgso_local + paramPtr->cgeo) * ag0;
13037  gcgdb = (cgdb - cgdo_local) * ag0;
13038  gcgsb = (cgsb - cgso_local) * ag0;
13039  gcgeb = (-paramPtr->cgeo) *ag0;
13040  gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb);
13041 
13042  gcegb = (- paramPtr->cgeo) * ag0;
13043  gcdgb = (cdgb - cgdo_local) * ag0;
13044  gcsgb = -(cggb + cbgb
13045  + cdgb + cgso_local) * ag0;
13046  gcbgb = cbgb * ag0;
13047 
13048  gcdgmb = gcsgmb = gcegmb = 0.0;
13049  gcgmdb = gcgmsb = gcgmeb = 0.0;
13050 
13051  /* Lump the overlap capacitance and S/D parasitics */
13052  qgd = qgdo;
13053  qgs = qgso;
13054  qge = paramPtr->cgeo * vge;
13055  qgate += qgd + qgs + qge;
13056  qdrn += qde - qgd;
13057  qsub -= qge + qse + qde;
13058  qsrc = -(qgate + qbody + qdrn + qsub);
13059  }
13060 
13061  gcddb = (cddb + cgdo_local + gcde) * ag0;
13062  gcdsb = cdsb * ag0;
13063  gcdeb = (cdeb - gcde) * ag0;
13064  gcdT = model_.dtype * cdT * ag0;
13065 
13066  gcsdb = -(cgdb + cbdb + cddb) * ag0;
13067  gcssb = (cgso_local + gcse - (cgsb + cbsb + cdsb)) * ag0;
13068  gcseb = -(gcse + cbeb + cdeb + ceeb) * ag0;
13069  gcsT = - model_.dtype * (cgT + cbT + cdT + ceT) * ag0;
13070 
13071  gcgT = model_.dtype * cgT * ag0;
13072 
13073  gcbdb = cbdb * ag0;
13074  gcbsb = cbsb * ag0;
13075  gcbeb = cbeb * ag0;
13076  gcbT = model_.dtype * cbT * ag0;
13077 
13078  gcedb = (- gcde) * ag0;
13079  gcesb = (- gcse) * ag0;
13080  gceeb = (gcse + gcde +
13081  ceeb + paramPtr->cgeo) * ag0;
13082 
13083  gceT = model_.dtype * ceT * ag0;
13084 
13085  gcTt = paramPtr->cth * ag0;
13086 
13087  sxpart = 0.6;
13088  dxpart = 0.4;
13089 
13090 
13091  /* v3.1 wanh moved the following original code ahead */
13092  /* Lump the overlap capacitance and S/D parasitics */
13093  /* qgd = qgdo;
13094  qgs = qgso;
13095  qge = paramPtr->cgeo * vge;
13096  qgate += qgd + qgs + qge;
13097  qdrn += qde - qgd;
13098  qsub -= qge + qse + qde;
13099  qsrc = -(qgate + qbody + qdrn + qsub);
13100  */
13101  /* v3.1 wanh end */
13102 
13103  }
13104 
13105  else
13106  {
13107  if (rgateMod == 3)
13108  {
13109  gcgmgmb = (cgdo_local + cgso_local + paramPtr->cgeo) * ag0;
13110  gcgmdb = -cgdo_local * ag0;
13111  gcgmsb = -cgso_local * ag0;
13112  gcgmeb = -paramPtr->cgeo * ag0;
13113  gcdgmb = gcgmdb;
13114  gcsgmb = gcgmsb;
13115  gcegmb = gcgmeb;
13116 
13117  gcggb = cggb * ag0;
13118  gcgsb = cgdb * ag0;
13119  gcgdb = cgsb * ag0;
13120  gcgeb = 0; /* v3.1 wanh changed */
13121  gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); /* v3.1 wanh added gcgeb */
13122 
13123  gcsgb = cdgb * ag0;
13124  gcegb = gcgeb; /* v3.1 wanh added */
13125  gcdgb = -(cggb + cbgb
13126  + cdgb) * ag0 - gcegb; /*v3.1 wanh added gcegb*/
13127  gcbgb = cbgb * ag0;
13128 
13129  qgd = qgdo;
13130  qgs = qgso;
13131  qge = 0; /* v3.1 wanh changed */
13132  qgme = paramPtr->cgeo * vgme;
13133  qgmid = qgdo + qgso + qgme;
13134  qgate += qge;
13135  qbody -= 0;
13136  qsrc = qdrn - qgs + qse;
13137  qsub -= qgme + qse + qde;
13138  qdrn = -(qgate + qgmid + qbody + qsrc + qsub);
13139  }
13140  else
13141  {
13142  gcggb = (cggb + cgdo_local + cgso_local + paramPtr->cgeo) * ag0;
13143  gcgdb = (cgsb - cgdo_local) * ag0;
13144  gcgsb = (cgdb - cgso_local) * ag0;
13145  gcgeb = (- paramPtr->cgeo) * ag0;
13146  gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); /*wanh added gcgbb*/
13147 
13148  gcegb = gcgeb; /* v3.1 wanh added */
13149  gcsgb = (cdgb - cgso_local) * ag0;
13150  gcdgb = -(cggb + cbgb + cdgb + cgdo_local) * ag0;
13151  gcdgmb = gcsgmb = gcegmb = 0.0;
13152  gcgmdb = gcgmsb = gcgmeb = 0.0;
13153 
13154  /* Lump the overlap capacitance and S/D parasitics */
13155  qgd = qgdo;
13156  qgs = qgso;
13157  qge = paramPtr->cgeo * vge;
13158  qgate += qgd + qgs + qge;
13159  qsrc = qdrn - qgs + qse;
13160  qsub -= qge + qse + qde;
13161  qdrn = -(qgate + qbody + qsrc + qsub);
13162  }
13163 
13164  gcssb = (cddb + cgso_local + gcse) * ag0;
13165  gcsdb = cdsb * ag0;
13166  gcseb = (cdeb - gcse) * ag0;
13167  gcsT = model_.dtype * cdT * ag0;
13168  gcdsb = -(cgdb + cbdb + cddb) * ag0;
13169  gcddb = (cgdo_local + gcde - (cgsb + cbsb
13170  + cdsb)) * ag0;
13171  gcdeb = -(gcde + cbeb + cdeb
13172  + ceeb) * ag0;
13173  gcdT = - model_.dtype * (cgT + cbT
13174  + cdT + ceT) * ag0;
13175 
13176  gcgT = model_.dtype * cgT * ag0;
13177 
13178  gcbgb = cbgb * ag0;
13179  gcbsb = cbdb * ag0;
13180  gcbdb = cbsb * ag0;
13181  gcbeb = cbeb * ag0;
13182  gcbT = model_.dtype * cbT * ag0;
13183 
13184  /* gcegb = (-paramPtr->cgeo) * ag0; V3.2 bug fix */
13185  gcesb = (- gcse) * ag0;
13186  gcedb = (- gcde) * ag0;
13187  gceeb = (ceeb + paramPtr->cgeo +
13188  gcse + gcde) * ag0;
13189  gceT = model_.dtype * ceT * ag0;
13190 
13191  gcTt = paramPtr->cth * ag0;
13192 
13193  dxpart = 0.6;
13194  sxpart = 0.4;
13195 
13196 
13197  /* v3.1 wanh moved the following code ahead */
13198  /* Lump the overlap capacitance */
13199  /*
13200  qgd = qgdo;
13201  gs = qgso;
13202  qge = paramPtr->cgeo * vge;
13203  qgate += qgd + qgs + qge;
13204  qsrc = qdrn - qgs + qse;
13205  qsub -= qge + qse + qde;
13206  qdrn = -(qgate + qbody + qsrc + qsub);
13207  */
13208  /* v3.1 wanh end*/
13209 
13210 
13211  }
13212 
13213  cgdo = cgdo_local;
13214  cgso = cgso_local;
13215 
13216  qe = qsub;
13217  qg = qgate;
13218  qd = qdrn;
13219  qb = qbody;
13220  if ((model_.shMod == 1) && (rth0!=0.0))
13221  qth = paramPtr->cth * delTemp;
13222  if (rgateMod == 3)
13223  qgmid = qgmid;
13224  /* 3.1 bug fix */
13225  }
13226  else // !chargeComputationNeeded
13227  {
13228  // initialize some stuff to 0
13229  // Original spice comment: v3.1 wanh added for RF
13230  gcgmgmb = gcgmdb = gcgmsb = gcgmeb = 0.0;
13231  gcdgmb = gcsgmb = gcegmb = 0.0;
13232  gcgbb = 0.0;
13233  }
13234  // END TVR ADDITION
13235 
13236  return bsuccess;
13237 }
13238 
13239 
13240 //-----------------------------------------------------------------------------
13241 // Function : Instance::updatePrimaryState
13242 //
13243 // Purpose : This function sets up the primaray state variables into
13244 // the primary state vector.
13245 //
13246 // Special Notes :
13247 // Scope : public
13248 // Creator : Dave Shirley
13249 // Creation Date : 05/20/04
13250 //-----------------------------------------------------------------------------
13252 {
13253  bool bsuccess = true;
13254  double * staVec = extData.nextStaVectorRawPtr;
13255  double * stoVec = extData.nextStoVectorRawPtr;
13256 
13257  bsuccess = updateIntermediateVars ();
13258 
13259  // voltage drops:
13260  stoVec[li_store_vbd] = vbd;
13261  stoVec[li_store_vbs] = vbs;
13262  stoVec[li_store_vgs] = vgs;
13263  stoVec[li_store_vds] = vds;
13264  stoVec[li_store_ves] = ves;
13265  stoVec[li_store_vps] = vps;
13266 
13267  stoVec[li_store_vgp] = Vgp;
13268  stoVec[li_store_vd] = Vdp;
13269  stoVec[li_store_vs] = Vsp;
13270  stoVec[li_store_vp] = Vp;
13271  stoVec[li_store_ve] = Ve;
13272  stoVec[li_store_vg] = Vg;
13273  stoVec[li_store_vgm] = Vgm;
13274  stoVec[li_store_deltemp] = delTemp;
13275 
13276  stoVec[li_store_vges] = vges;
13277  stoVec[li_store_vgms] = vgms;
13278 
13279  // intrinsic capacitors:
13280  staVec[li_state_qb] = qb;
13281  staVec[li_state_qg] = qg;
13282  staVec[li_state_qd] = qd;
13283  staVec[li_state_qe] = qe;
13284  staVec[li_state_qgmid] = qgmid;
13285  staVec[li_state_qth] = qth;
13286 
13287  // if this is the first newton step of the first time step
13288  // of the transient simulation, we need to enforce that the
13289  // time derivatives w.r.t. charge are zero. This is to maintain 3f5
13290  // compatibility. ERK.
13291 
13292  // Note: I think this kind of thing is enforced (or should be enforced,
13293  // anyway) at the time integration level. So I'm not sure this step is
13294  // really needed, at least for new-DAE. Derivatives out of the DCOP
13295  // are supposed to be zero at the first newton step.
13296 
13297  if (!(getSolverState().dcopFlag) && getSolverState().initTranFlag && getSolverState().newtonIter==0)
13298  {
13299  // re-set the state vector pointer that we are using to the "current"
13300  // pointer, rather than the "next" pointer.
13301  double * currStaVec = extData.currStaVectorRawPtr;
13302 
13303  // intrinsic capacitors:
13304  currStaVec[li_state_qb] = qb;
13305  currStaVec[li_state_qg] = qg;
13306  currStaVec[li_state_qd] = qd;
13307  currStaVec[li_state_qe] = qe;
13308  currStaVec[li_state_qgmid] = qgmid;
13309  currStaVec[li_state_qth] = qth;
13310  }
13311 
13312  return bsuccess;
13313 }
13314 
13315 //-----------------------------------------------------------------------------
13316 // Function : Instance::loadDAEQVector
13317 //
13318 // Purpose : Loads the Q-vector contributions for a single
13319 // voltage source instance.
13320 //
13321 // Special Notes : The "Q" vector is part of a standard DAE formalism in
13322 // which the system of equations is represented as:
13323 //
13324 // f(x) = dQ(x)/dt + F(x) + B(t) = 0
13325 //
13326 // Scope : public
13327 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
13328 // Creation Date : 02/19/05
13329 //-----------------------------------------------------------------------------
13331 {
13333 
13334  double * qVec = extData.daeQVectorRawPtr;
13335  double * dQdxdVpPtr = extData.dQdxdVpVectorRawPtr;
13336 
13337  double Coef_body=0.0;
13338  double Coef_extBody=0.0;
13339  double Coef_gate=0.0;
13340  double Coef_gatePrime=0.0;
13341  double Coef_gateMid=0.0;
13342  double Coef_drainPrime=0.0;
13343  double Coef_sourcePrime=0.0;
13344  double Coef_substrate=0.0;
13345  double Coef_temp=0.0;
13346 
13347  if (soiMod != 2)
13348  {
13349  Coef_body -= (model_.dtype*(Qeqqb))* numberParallel;
13350  }
13351 
13352  Coef_gatePrime -= (model_.dtype*(Qeqqg))* numberParallel;
13353 
13354  Coef_drainPrime += (model_.dtype*(-Qeqqd)) * numberParallel;
13355 
13356  Coef_sourcePrime += ( + model_.dtype*(+ Qeqqg + Qeqqb
13357  + Qeqqd + Qeqqe + Qeqqgmid)) * numberParallel;
13358 
13359  Coef_substrate -= model_.dtype*Qeqqe * numberParallel;
13360 
13361  if (rgateMod == 3)
13362  {
13363  Coef_gateMid -= model_.dtype*(Qeqqgmid) * numberParallel;
13364  }
13365 
13366  if (selfheat)
13367  {
13368  Coef_temp -= (Qeqqth) * numberParallel;
13369  }
13370 
13371  ////////////////////////////////////////////////////////////////////////
13372  // Now place all the calculated values in the Q vector.
13373 
13374  if(li_Body != -1)
13375  {
13376  qVec[li_Body ] -= Coef_body;
13377  }
13378  if(li_ExtBody != -1)
13379  {
13380  qVec[li_ExtBody ] -= Coef_extBody;
13381  }
13382 
13383  qVec[li_Gate ] -= Coef_gate;
13384  qVec[li_GatePrime ] -= Coef_gatePrime;
13385  qVec[li_GateMid ] -= Coef_gateMid;
13386  qVec[li_DrainPrime ] -= Coef_drainPrime;
13387  qVec[li_SourcePrime] -= Coef_sourcePrime;
13388  qVec[li_Substrate ] -= Coef_substrate;
13389 
13390  if(li_Temperature != -1)
13391  {
13392  qVec[li_Temperature] -= Coef_temp;
13393  }
13394 
13395  if( loadLeadCurrent )
13396  {
13397  double * storeLeadQ = extData.storeLeadCurrQCompRawPtr;
13398  storeLeadQ[li_store_dev_id] = 0.0;
13399  storeLeadQ[li_store_dev_ig] = -Coef_gate;
13400  storeLeadQ[li_store_dev_is] = 0.0;
13401  storeLeadQ[li_store_dev_ie] = -Coef_substrate;
13402  if(li_Body != -1)
13403  {
13404  storeLeadQ[li_store_dev_ib] = -Coef_body;
13405  }
13406  }
13407 
13408  ////////////////////////////////////////////////////////////////////////
13409  // Voltage limiting section:
13410  double Coef_body_Jdxp = 0.0;
13411  double Coef_extBody_Jdxp = 0.0;
13412  double Coef_gate_Jdxp = 0.0;
13413  double Coef_gatePrime_Jdxp = 0.0;
13414  double Coef_gateMid_Jdxp = 0.0;
13415  double Coef_drainPrime_Jdxp = 0.0;
13416  double Coef_sourcePrime_Jdxp = 0.0;
13417  double Coef_substrate_Jdxp = 0.0;
13418  double Coef_temp_Jdxp = 0.0;
13419 
13421  {
13422  if (soiMod != 2)
13423  {
13424  Coef_body_Jdxp -=
13426  }
13427 
13428  Coef_gatePrime_Jdxp -=
13430 
13431  Coef_drainPrime_Jdxp +=
13433 
13434  Coef_sourcePrime_Jdxp += (+model_.dtype*(Qeqqg_Jdxp + Qeqqb_Jdxp
13436  ) * numberParallel;
13437 
13438  Coef_substrate_Jdxp -= model_.dtype*Qeqqe_Jdxp * numberParallel;
13439 
13440  if (rgateMod == 3)
13441  {
13442  Coef_gateMid_Jdxp -=
13443  model_.dtype*(Qeqqgmid_Jdxp) * numberParallel;
13444  }
13445 
13446  if (selfheat)
13447  {
13448  Coef_temp_Jdxp -= (Qeqqth_Jdxp ) * numberParallel;
13449  }
13450 
13451  if(li_Body != -1)
13452  {
13453  dQdxdVpPtr[li_Body ] += Coef_body_Jdxp;
13454  }
13455  if(li_ExtBody != -1)
13456  {
13457  dQdxdVpPtr[li_ExtBody ] += Coef_extBody_Jdxp;
13458  }
13459  dQdxdVpPtr[li_Gate ] += Coef_gate_Jdxp;
13460  dQdxdVpPtr[li_GatePrime ] += Coef_gatePrime_Jdxp;
13461  dQdxdVpPtr[li_GateMid ] += Coef_gateMid_Jdxp;
13462  dQdxdVpPtr[li_DrainPrime ] += Coef_drainPrime_Jdxp;
13463  dQdxdVpPtr[li_SourcePrime] += Coef_sourcePrime_Jdxp;
13464  dQdxdVpPtr[li_Substrate ] += Coef_substrate_Jdxp;
13465 
13466  if(li_Temperature != -1)
13467  {
13468  dQdxdVpPtr[li_Temperature] += Coef_temp_Jdxp;
13469  }
13470  }
13471 
13472  return true;
13473 }
13474 
13475 //-----------------------------------------------------------------------------
13476 // Function : Instance::loadDAEFVector
13477 //
13478 // Purpose : Loads the F-vector contributions for a single
13479 // B3SOI instance.
13480 //
13481 // Special Notes :
13482 //
13483 // Scope : public
13484 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
13485 // Creation Date : 02/19/05
13486 //-----------------------------------------------------------------------------
13488 {
13489  double * fVec = extData.daeFVectorRawPtr;
13490  double * dFdxdVpPtr = extData.dFdxdVpVectorRawPtr;
13491 
13492 #ifdef Xyce_DEBUG_DEVICE
13493  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
13494  {
13495  Xyce::dout() << subsection_divider << std::endl;
13496  Xyce::dout() << " Instance::loadDAEFVector" << std::endl;
13497  Xyce::dout() << " name = " << getName() <<std::endl;
13498  Xyce::dout().width(28); Xyce::dout().precision(20); Xyce::dout().setf(std::ios::scientific);
13499  Xyce::dout() << " " << std::endl;
13500  }
13501 #endif
13502 
13503  double Coef_body=0.0;
13504  double Coef_extBody=0.0;
13505  double Coef_gate=0.0;
13506  double Coef_gatePrime=0.0;
13507  double Coef_gateMid=0.0;
13508  double Coef_drain=0.0;
13509  double Coef_drainPrime=0.0;
13510  double Coef_source=0.0;
13511  double Coef_sourcePrime=0.0;
13512  double Coef_substrate=0.0;
13513  double Coef_temp=0.0;
13514 
13515  Gmin = getDeviceOptions().gmin * 1e-6;
13516  geltd = grgeltd;
13517 
13518  // I have elected to add in the Gmin-based Jdxp terms right here.
13519  // In adding them, I've made use of the fact that whether we need voltage
13520  // limiting or not, we have to add Gmin*somedrop. If we need voltage
13521  // limiting, we have to add in Gmin*(somedrop-somedrop_orig) with the
13522  // opposite sign. I've simplified that down to the single term that
13523  // remains, which is correct even if voltage limiting is not needed
13524  // --- TVR
13525 
13526  double iGmin_bs = model_.dtype*(Gmin*vbs_orig);
13527  double iGmin_gd = model_.dtype*(Gmin*vgd_orig);
13528 
13529  if (soiMod != 2)
13530  {
13531  Coef_body -= (model_.dtype*(ceqbody)
13532  + iGmin_bs)* numberParallel;
13533  }
13534 
13535  Coef_gatePrime -= (model_.dtype*(ceqgate - ceqgcrg)
13536  + Igtoteq + iGmin_gd)* numberParallel;
13537 
13538  Coef_drainPrime += (model_.dtype*(ceqbd) - cdreq + Idtoteq
13539  + Idrain + iGmin_gd) * numberParallel;
13540 
13541  Coef_sourcePrime += (cdreq
13542  + model_.dtype*(ceqbs)
13543  + Istoteq + Isource + iGmin_bs) * numberParallel;
13544 
13545  if (rgateMod == 2)
13546  {
13547  Coef_gate -= model_.dtype*ceqgcrg * numberParallel;
13548  }
13549  else if (rgateMod == 3)
13550  {
13551  Coef_gateMid -= model_.dtype*(ceqgcrg) * numberParallel;
13552  }
13553 
13554  if (bodyMod == 1)
13555  {
13556  Coef_extBody += model_.dtype*ceqbodcon * numberParallel;
13557  }
13558 
13559  if (selfheat)
13560  {
13561  Coef_temp -= (ceqth + Ith) * numberParallel;
13562  }
13563 
13564  ////////////////////////////////////////////////////////////////////////
13565  // This next section deals with linear resistor currents (mostly) that
13566  // would not be part of the spice3f5 RHS load.
13567  //
13568  // These include the source and drain load resistors, the body tie
13569  // resistor and the various options for gate resistors.
13570  //
13571  // Isource and Idrain correspond to the linear load resistors.
13572 
13573  if (sNodePrime == 1) Coef_source -= Isource * numberParallel;
13574  if (dNodePrime == 1) Coef_drain -= Idrain * numberParallel;
13575 
13576  // Note: extra body nodes were already handled, above.
13577 
13578  // Handle extra gate nodes, if they exist.
13579  // rgateMod==0 no gate resistor.
13580  // rgateMod==1 linear gate resistor
13581  // rgateMod==2 nonlinear gate resistor
13582  // rgateMod==3 2 gate resistors, in series.
13583  //
13584  if (rgateMod > 0)
13585  {
13586  Coef_gate -= Igate * numberParallel;
13587  if (rgateMod == 3)
13588  {
13589  Coef_gateMid -= (IgateMid - Igate) * numberParallel;
13590  Coef_gatePrime += IgateMid * numberParallel;
13591  }
13592  else
13593  {
13594  Coef_gatePrime += Igate * numberParallel;
13595  }
13596  }
13597 
13598  // Now place all the calculated values in the RHS vector.
13599  if(li_Body != -1)
13600  {
13601  fVec[li_Body ] -= Coef_body;
13602  }
13603  if(li_ExtBody != -1)
13604  {
13605  fVec[li_ExtBody ] -= Coef_extBody;
13606  }
13607  fVec[li_Gate ] -= Coef_gate;
13608  fVec[li_GatePrime ] -= Coef_gatePrime;
13609  fVec[li_GateMid ] -= Coef_gateMid;
13610  fVec[li_Drain ] -= Coef_drain;
13611  fVec[li_DrainPrime ] -= Coef_drainPrime;
13612  fVec[li_Source ] -= Coef_source;
13613  fVec[li_SourcePrime] -= Coef_sourcePrime;
13614  fVec[li_Substrate ] -= Coef_substrate;
13615 
13616  if(li_Temperature != -1)
13617  {
13618  fVec[li_Temperature] -= Coef_temp;
13619  }
13620 
13621  if( loadLeadCurrent )
13622  {
13623  double * storeLeadF = extData.nextStoVectorRawPtr;
13624  storeLeadF[li_store_dev_id] = -Coef_drain;
13625  storeLeadF[li_store_dev_ig] = -Coef_gate;
13626  storeLeadF[li_store_dev_is] = -Coef_source;
13627  storeLeadF[li_store_dev_ie] = -Coef_substrate;
13628  if(li_Body != -1)
13629  {
13630  storeLeadF[li_store_dev_ib] = -Coef_body;
13631  }
13632  else
13633  {
13634  storeLeadF[li_store_dev_ib] = 0.0;
13635  }
13636  }
13637 
13639  {
13640  if ( icVDSGiven )
13641  {
13642  if ( icVDSGiven )
13643  {
13644  double coef = (extData.nextSolVectorRawPtr)[li_Ids];
13645  fVec[li_Drain] += coef;
13646  fVec[li_Source] += -coef;
13647  if( loadLeadCurrent )
13648  {
13649  double * storeLeadF = extData.nextStoVectorRawPtr;
13650  storeLeadF[li_store_dev_id] = coef;
13651  storeLeadF[li_store_dev_is] = coef;
13652  }
13653  double cVs = (extData.nextSolVectorRawPtr)[li_Source];
13654  double cVd = (extData.nextSolVectorRawPtr)[li_Drain];
13655  fVec[li_Ids] += (cVd - cVs - icVDS);
13656  }
13657  if ( icVGSGiven )
13658  {
13659  double coef = (extData.nextSolVectorRawPtr)[li_Igs];
13660  fVec[li_Gate] += coef;
13661  fVec[li_Source] += -coef;
13662  if( loadLeadCurrent )
13663  {
13664  double * storeLeadF = extData.nextStoVectorRawPtr;
13665  storeLeadF[li_store_dev_ig] = coef;
13666  storeLeadF[li_store_dev_is] = coef;
13667  }
13668  double cVs = (extData.nextSolVectorRawPtr)[li_Source];
13669  double cVg = (extData.nextSolVectorRawPtr)[li_Gate];
13670  fVec[li_Igs] += (cVg - cVs - icVGS);
13671  }
13672  if ( icVBSGiven )
13673  {
13674  double coef = (extData.nextSolVectorRawPtr)[li_Ibs];
13675  fVec[li_Body] += coef;
13676  fVec[li_Source] += -coef;
13677  if( loadLeadCurrent )
13678  {
13679  double * storeLeadF = extData.nextStoVectorRawPtr;
13680  storeLeadF[li_store_dev_ib] = coef;
13681  storeLeadF[li_store_dev_is] = coef;
13682  }
13683  double cVs = (extData.nextSolVectorRawPtr)[li_Source];
13684  double cVb = (extData.nextSolVectorRawPtr)[li_Body];
13685  fVec[li_Ibs] += (cVb - cVs - icVBS);
13686  }
13687  if ( icVESGiven )
13688  {
13689  double coef = (extData.nextSolVectorRawPtr)[li_Ies];
13690  fVec[li_Substrate] += coef;
13691  fVec[li_Source] += -coef;
13692  if( loadLeadCurrent )
13693  {
13694  double * storeLeadF = extData.nextStoVectorRawPtr;
13695  storeLeadF[li_store_dev_ie] = coef;
13696  storeLeadF[li_store_dev_is] = coef;
13697  }
13698  double cVs = (extData.nextSolVectorRawPtr)[li_Source];
13699  double cVe = (extData.nextSolVectorRawPtr)[li_Substrate];
13700  fVec[li_Ies] += (cVe - cVs - icVES);
13701  }
13702  if ( icVPSGiven )
13703  {
13704  double coef = (extData.nextSolVectorRawPtr)[li_Ips];
13705  fVec[li_ExtBody] += coef;
13706  fVec[li_Source] += -coef;
13707  if( loadLeadCurrent )
13708  {
13709  double * storeLeadF = extData.nextStoVectorRawPtr;
13710  // this may need a separate store var if the internal and external body
13711  // nodes are not just connected by a resistor
13712  storeLeadF[li_store_dev_ib] = coef;
13713  storeLeadF[li_store_dev_is] = coef;
13714  }
13715  double cVs = (extData.nextSolVectorRawPtr)[li_Source];
13716  double cVp = (extData.nextSolVectorRawPtr)[li_ExtBody];
13717  fVec[li_Ies] += (cVp - cVs - icVPS);
13718  }
13719  }
13720  }
13721 
13722  // Set up the Jdxp vector:
13723  double Coef_body_Jdxp = 0.0;
13724  double Coef_extBody_Jdxp = 0.0;
13725  double Coef_gate_Jdxp = 0.0;
13726  double Coef_gatePrime_Jdxp = 0.0;
13727  double Coef_gateMid_Jdxp = 0.0;
13728  double Coef_drain_Jdxp = 0.0;
13729  double Coef_drainPrime_Jdxp = 0.0;
13730  double Coef_source_Jdxp = 0.0;
13731  double Coef_sourcePrime_Jdxp = 0.0;
13732  double Coef_substrate_Jdxp = 0.0;
13733  double Coef_temp_Jdxp = 0.0;
13734 
13735  double iGmin_bs_Jdxp = model_.dtype*Gmin*(vbs-vbs_orig);
13736  double iGmin_gd_Jdxp = model_.dtype*Gmin*(vgd-vgd_orig);
13737 
13739  {
13740  if (soiMod != 2)
13741  {
13742  Coef_body_Jdxp -=
13744  - iGmin_bs_Jdxp)* numberParallel;
13745  }
13746 
13747  Coef_gatePrime_Jdxp -=
13749  + Igtoteq_Jdxp - iGmin_gd_Jdxp)* numberParallel;
13750 
13751  Coef_drainPrime_Jdxp +=
13754  + Idrain_Jdxp - iGmin_gd_Jdxp) * numberParallel;
13755 
13756  Coef_sourcePrime_Jdxp += (cdreq_Jdxp
13757  + model_.dtype*(ceqbs_Jdxp)
13758  + Istoteq_Jdxp
13759  + Isource_Jdxp - iGmin_bs_Jdxp
13760  ) * numberParallel;
13761 
13762  Coef_substrate_Jdxp -= model_.dtype*ceqqe_Jdxp * numberParallel;
13763 
13764  if (rgateMod == 2)
13765  {
13766  Coef_gate_Jdxp -=
13768  }
13769  else if (rgateMod == 3)
13770  {
13771  Coef_gateMid_Jdxp -=
13772  model_.dtype*(ceqgcrg_Jdxp) * numberParallel;
13773  }
13774 
13775  if (bodyMod == 1)
13776  {
13777  Coef_extBody_Jdxp += model_.dtype*ceqbodcon_Jdxp * numberParallel;
13778  }
13779 
13780  if (selfheat)
13781  {
13782  Coef_temp_Jdxp -= ( ceqth_Jdxp ) * numberParallel;
13783  }
13784 
13785  if (sNodePrime == 1) Coef_source_Jdxp -= Isource_Jdxp * numberParallel;
13786  if (dNodePrime == 1) Coef_drain_Jdxp -= Idrain_Jdxp * numberParallel;
13787 
13788  if (rgateMod > 0)
13789  {
13790  Coef_gate_Jdxp -= Igate_Jdxp * numberParallel;
13791  if (rgateMod == 3)
13792  {
13793  Coef_gateMid_Jdxp -= (IgateMid_Jdxp - Igate_Jdxp) * numberParallel;
13794  Coef_gatePrime_Jdxp += IgateMid_Jdxp * numberParallel;
13795  }
13796  else
13797  {
13798  Coef_gatePrime_Jdxp += Igate_Jdxp * numberParallel;
13799  }
13800  }
13801 
13802  if(li_Body != -1)
13803  {
13804  dFdxdVpPtr[li_Body ] += Coef_body_Jdxp;
13805  }
13806  if(li_ExtBody != -1)
13807  {
13808  dFdxdVpPtr[li_ExtBody ] += Coef_extBody_Jdxp;
13809  }
13810  dFdxdVpPtr[li_Gate ] += Coef_gate_Jdxp;
13811  dFdxdVpPtr[li_GatePrime ] += Coef_gatePrime_Jdxp;
13812  dFdxdVpPtr[li_GateMid ] += Coef_gateMid_Jdxp;
13813  dFdxdVpPtr[li_Drain ] += Coef_drain_Jdxp;
13814  dFdxdVpPtr[li_DrainPrime ] += Coef_drainPrime_Jdxp;
13815  dFdxdVpPtr[li_Source ] += Coef_source_Jdxp;
13816  dFdxdVpPtr[li_SourcePrime] += Coef_sourcePrime_Jdxp;
13817  dFdxdVpPtr[li_Substrate ] += Coef_substrate_Jdxp;
13818 
13819  if(li_Temperature != -1)
13820  {
13821  dFdxdVpPtr[li_Temperature] += Coef_temp_Jdxp;
13822  }
13823  }
13824 
13825  return true;
13826 }
13827 
13828 //-----------------------------------------------------------------------------
13829 // Function : Instance::setupCapacitors_newDAE
13830 // Purpose :
13831 //
13832 // Special Notes : This function is identical to setupCapacitors_oldDAE,
13833 // except that in that function, capacitance
13834 // *conductances*. (C/dt terms) are set up, whereas in
13835 // this function, just capacitances (C).
13836 //
13837 // As a result, a lot of gc* variables have been replaced
13838 // with a lot of CAPc* variables. Also, ag0 isn't used
13839 // in this function, whereas it is used in the old-DAE
13840 // version.
13841 //
13842 // This function also sets up the charge variables:
13843 // qb, qg, qe, qd, qth, qgmid
13844 //
13845 // Another way of looking at this function - this is analogous
13846 // to all the capacitor-related code that gets executed
13847 // in the SPICE3 SOI device, prior to the NIintegrate
13848 // functions being called.
13849 //
13850 // Scope : public
13851 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
13852 // Creation Date : 02/23/05
13853 //-----------------------------------------------------------------------------
13855 {
13856  // these are temporary local variables.
13857  double T0, T1, T2, T3, T4;
13858  double cgdo_local;
13859  double cgso_local;
13860 
13862  {
13863  T0 = vgd + DELTA_1;
13864  if (rgateMod == 3) T0 = vgmd + DELTA_1; /* v3.2 bug fix */
13865  T1 = sqrt(T0 * T0 + 4.0 * DELTA_1);
13866  T2 = 0.5 * (T0 - T1);
13867 
13868  /* v2.2.3 bug fix */
13869  T3 = wdiodCV_NoSwap * paramPtr->cgdl; /* v3.1 bug fix */
13870 
13871  T4 = sqrt(1.0 - 4.0 * T2 / paramPtr->ckappa);
13872  cgdo_local = paramPtr->cgdo + T3 - T3 * (1.0 - 1.0 / T4)
13873  * (0.5 - 0.5 * T0 / T1);
13874  qgdo = (paramPtr->cgdo + T3) * vgd - T3 * (T2
13875  + 0.5 * paramPtr->ckappa * (T4 - 1.0));
13876 
13877  if (rgateMod == 3) {
13878  qgdo = (paramPtr->cgdo + T3) * vgmd - T3 * (T2
13879  + 0.5 * paramPtr->ckappa * (T4 - 1.0));
13880  } /* v3.2 bug fix */
13881 
13882  T0 = vgs + DELTA_1;
13883  if (rgateMod == 3) T0 = vgms + DELTA_1; /* v3.2 bug fix */
13884  T1 = sqrt(T0 * T0 + 4.0 * DELTA_1);
13885  T2 = 0.5 * (T0 - T1);
13886 
13887  /* v2.2.3 bug fix */
13888  T3 = wdiosCV_NoSwap * paramPtr->cgsl; /* v3.1 bug fix */
13889 
13890  T4 = sqrt(1.0 - 4.0 * T2 / paramPtr->ckappa);
13891  cgso_local = paramPtr->cgso + T3 - T3 * (1.0 - 1.0 / T4)
13892  * (0.5 - 0.5 * T0 / T1);
13893  qgso = (paramPtr->cgso + T3) * vgs - T3 * (T2
13894  + 0.5 * paramPtr->ckappa * (T4 - 1.0));
13895 
13896  if (rgateMod == 3) {
13897  qgso = (paramPtr->cgso + T3) * vgms - T3 * (T2
13898  + 0.5 * paramPtr->ckappa * (T4 - 1.0));
13899  } /* v3.2 bug fix */
13900 
13901  if (mode > 0)
13902  {
13903 
13904  /* v3.1 wanh added for RF */
13905  if (rgateMod == 3)
13906  {
13907  CAPcgmgmb = (cgdo_local + cgso_local + paramPtr->cgeo);
13908 
13909  CAPcgmdb = -cgdo_local;
13910  CAPcgmsb = -cgso_local;
13911  CAPcgmeb = -paramPtr->cgeo;
13912  CAPcdgmb = CAPcgmdb;
13913  CAPcsgmb = CAPcgmsb;
13914  CAPcegmb = CAPcgmeb;
13915 
13916  CAPcggb = cggb;
13917  CAPcgdb = cgdb;
13918  CAPcgsb = cgsb;
13919  CAPcgeb = 0 ;/*v3.1 wanh changed*/
13920  CAPcgbb = -(CAPcggb + CAPcgdb + CAPcgsb + CAPcgeb);
13921 
13922  CAPcdgb = cdgb;
13923  CAPcegb = CAPcgeb; /*v3.1 wanh added*/
13924  CAPcsgb = -(cggb + cbgb + cdgb) - CAPcegb;
13925  CAPcbgb = cbgb;
13926 
13927  qgd = qgdo;
13928  qgs = qgso;
13929  qge = 0; /* v3.1 wanh changed */
13930 
13931  qgme = paramPtr->cgeo * vgme;
13932  qgmid = qgdo + qgso + qgme;
13933  qgate += qge;
13934  qbody -= 0;
13935  qdrn += qde - qgd;
13936  qsub -= qgme + qse + qde;
13937  qsrc = -(qgate + qgmid + qbody + qdrn + qsub);
13938  }
13939  else
13940  {
13941  CAPcggb = (cggb + cgdo_local + cgso_local + paramPtr->cgeo);
13942  CAPcgdb = (cgdb - cgdo_local);
13943  CAPcgsb = (cgsb - cgso_local);
13944  CAPcgeb = (-paramPtr->cgeo);
13945  CAPcgbb = -(CAPcggb + CAPcgdb + CAPcgsb + CAPcgeb);
13946 
13947  CAPcegb = (- paramPtr->cgeo);
13948  CAPcdgb = (cdgb - cgdo_local);
13949  CAPcsgb = -(cggb + cbgb
13950  + cdgb + cgso_local);
13951  CAPcbgb = cbgb;
13952 
13953  CAPcdgmb = CAPcsgmb = CAPcegmb = 0.0;
13954  CAPcgmdb = CAPcgmsb = CAPcgmeb = 0.0;
13955 
13956  /* Lump the overlap capacitance and S/D parasitics */
13957  qgd = qgdo;
13958  qgs = qgso;
13959  qge = paramPtr->cgeo * vge;
13960  qgate += qgd + qgs + qge;
13961  qdrn += qde - qgd;
13962  qsub -= qge + qse + qde;
13963  qsrc = -(qgate + qbody + qdrn + qsub);
13964  }
13965 
13966  CAPcddb = (cddb + cgdo_local + gcde);
13967  CAPcdsb = cdsb;
13968  CAPcdeb = (cdeb - gcde);
13969  CAPcdT = model_.dtype * cdT;
13970 
13971  CAPcsdb = -(cgdb + cbdb + cddb);
13972  CAPcssb = (cgso_local + gcse - (cgsb + cbsb + cdsb));
13973  CAPcseb = -(gcse + cbeb + cdeb + ceeb);
13974  CAPcsT = - model_.dtype * (cgT + cbT + cdT + ceT);
13975 
13976  CAPcgT = model_.dtype * cgT;
13977 
13978  CAPcbdb = cbdb;
13979  CAPcbsb = cbsb;
13980  CAPcbeb = cbeb;
13981  CAPcbT = model_.dtype * cbT;
13982 
13983  CAPcedb = (- gcde);
13984  CAPcesb = (- gcse);
13985  CAPceeb = (gcse + gcde +
13986  ceeb + paramPtr->cgeo);
13987 
13988  CAPceT = model_.dtype * ceT;
13989 
13990  CAPcTt = paramPtr->cth;
13991 
13992  sxpart = 0.6;
13993  dxpart = 0.4;
13994 
13995 
13996  /* v3.1 wanh moved the following original code ahead */
13997  /* Lump the overlap capacitance and S/D parasitics */
13998  /* qgd = qgdo;
13999  qgs = qgso;
14000  qge = paramPtr->cgeo * vge;
14001  qgate += qgd + qgs + qge;
14002  qdrn += qde - qgd;
14003  qsub -= qge + qse + qde;
14004  qsrc = -(qgate + qbody + qdrn + qsub);
14005  */
14006  /* v3.1 wanh end */
14007 
14008  }
14009 
14010  else
14011  {
14012  if (rgateMod == 3)
14013  {
14014  CAPcgmgmb = (cgdo_local + cgso_local + paramPtr->cgeo);
14015  CAPcgmdb = -cgdo_local;
14016  CAPcgmsb = -cgso_local;
14017  CAPcgmeb = -paramPtr->cgeo;
14018  CAPcdgmb = CAPcgmdb;
14019  CAPcsgmb = CAPcgmsb;
14020  CAPcegmb = CAPcgmeb;
14021 
14022  CAPcggb = cggb;
14023  CAPcgsb = cgdb;
14024  CAPcgdb = cgsb;
14025  CAPcgeb = 0; /* v3.1 wanh changed */
14026  CAPcgbb = -(CAPcggb + CAPcgdb + CAPcgsb + CAPcgeb); /* v3.1 wanh added gcgeb */
14027 
14028  CAPcsgb = cdgb;
14029  CAPcegb = CAPcgeb; /* v3.1 wanh added */
14030  CAPcdgb = -(cggb + cbgb
14031  + cdgb) - CAPcegb; /*v3.1 wanh added gcegb*/
14032  CAPcbgb = cbgb;
14033 
14034  qgd = qgdo;
14035  qgs = qgso;
14036  qge = 0; /* v3.1 wanh changed */
14037  qgme = paramPtr->cgeo * vgme;
14038  qgmid = qgdo + qgso + qgme;
14039  qgate += qge;
14040  qbody -= 0;
14041  qsrc = qdrn - qgs + qse;
14042  qsub -= qgme + qse + qde;
14043  qdrn = -(qgate + qgmid + qbody + qsrc + qsub);
14044  }
14045  else
14046  {
14047  CAPcggb = (cggb + cgdo_local + cgso_local + paramPtr->cgeo);
14048  CAPcgdb = (cgsb - cgdo_local);
14049  CAPcgsb = (cgdb - cgso_local);
14050  CAPcgeb = (- paramPtr->cgeo);
14051  CAPcgbb = -(CAPcggb + CAPcgdb + CAPcgsb + CAPcgeb); /*wanh added gcgbb*/
14052 
14053  CAPcegb = CAPcgeb; /* v3.1 wanh added */
14054  CAPcsgb = (cdgb - cgso_local);
14055  CAPcdgb = -(cggb + cbgb + cdgb + cgdo_local);
14056  CAPcdgmb = CAPcsgmb = CAPcegmb = 0.0;
14057  CAPcgmdb = CAPcgmsb = CAPcgmeb = 0.0;
14058 
14059  /* Lump the overlap capacitance and S/D parasitics */
14060  qgd = qgdo;
14061  qgs = qgso;
14062  qge = paramPtr->cgeo * vge;
14063  qgate += qgd + qgs + qge;
14064  qsrc = qdrn - qgs + qse;
14065  qsub -= qge + qse + qde;
14066  qdrn = -(qgate + qbody + qsrc + qsub);
14067  }
14068 
14069  CAPcssb = (cddb + cgso_local + gcse);
14070  CAPcsdb = cdsb;
14071  CAPcseb = (cdeb - gcse);
14072  CAPcsT = model_.dtype * cdT;
14073  CAPcdsb = -(cgdb + cbdb + cddb);
14074  CAPcddb = (cgdo_local + gcde - (cgsb + cbsb
14075  + cdsb));
14076  CAPcdeb = -(gcde + cbeb + cdeb + ceeb);
14077  CAPcdT = - model_.dtype * (cgT + cbT
14078  + cdT + ceT);
14079 
14080  CAPcgT = model_.dtype * cgT;
14081 
14082  CAPcbgb = cbgb;
14083  CAPcbsb = cbdb;
14084  CAPcbdb = cbsb;
14085  CAPcbeb = cbeb;
14086  CAPcbT = model_.dtype * cbT;
14087 
14088  /* CAPcegb = (-paramPtr->cgeo); V3.2 bug fix */
14089  CAPcesb = (- gcse);
14090  CAPcedb = (- gcde);
14091  CAPceeb = (ceeb + paramPtr->cgeo + gcse + gcde);
14092  CAPceT = model_.dtype * ceT;
14093 
14094  CAPcTt = paramPtr->cth;
14095 
14096  dxpart = 0.6;
14097  sxpart = 0.4;
14098 
14099 
14100  /* v3.1 wanh moved the following code ahead */
14101  /* Lump the overlap capacitance */
14102  /*
14103  qgd = qgdo;
14104  gs = qgso;
14105  qge = paramPtr->cgeo * vge;
14106  qgate += qgd + qgs + qge;
14107  qsrc = qdrn - qgs + qse;
14108  qsub -= qge + qse + qde;
14109  qdrn = -(qgate + qbody + qsrc + qsub);
14110  */
14111  /* v3.1 wanh end*/
14112 
14113 
14114  }
14115 
14116  cgdo = cgdo_local;
14117  cgso = cgso_local;
14118 
14119  qe = qsub;
14120  qg = qgate;
14121  qd = qdrn;
14122  qb = qbody;
14123  if ((model_.shMod == 1) && (rth0!=0.0))
14124  qth = paramPtr->cth * delTemp;
14125  if (rgateMod == 3)
14126  qgmid = qgmid;
14127  /* 3.1 bug fix */
14128  }
14129  else
14130  {
14131  // initialize some stuff to 0
14132  // Original spice comment: v3.1 wanh added for RF
14133  CAPcgmgmb = CAPcgmdb = CAPcgmsb = CAPcgmeb = 0.0;
14134  CAPcdgmb = CAPcsgmb = CAPcegmb = 0.0;
14135  CAPcgbb = 0.0;
14136  }
14137  // END TVR ADDITION
14138 
14139  return true;
14140 }
14141 
14142 //-----------------------------------------------------------------------------
14143 // Function : Instance::auxChargeCalculations
14144 // Purpose :
14145 //
14146 // Special Notes :
14147 // Another way of looking at this function - this is analogous
14148 // to the capacitor-related code that gets executed in the SPICE3
14149 // SOI device, after the NIintegrate functions have been called.
14150 //
14151 // About all this function really does is set up some
14152 // voltlim terms.
14153 // It really is only here to provide capacitor-related
14154 // voltage limiter terms for the QVector load.
14155 //
14156 // Scope : public
14157 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
14158 // Creation Date : 02/23/05
14159 //-----------------------------------------------------------------------------
14161 {
14162  bool bsuccess = true;
14163  double vgb_orig, vgmb_orig, veb_orig;
14164 
14166  {
14167  sxpart = (1.0 - (dxpart = (mode > 0) ? 0.4 : 0.6));
14168  }
14169  else // ChargeComputation is needed
14170  {
14171  Qeqqg = qg;
14172  Qeqqb = qb;
14173  Qeqqd = qd;
14174  Qeqqe = qe;
14175  Qeqqth = qth;
14176  Qeqqgmid = qgmid;
14177 
14178  // Note - in the SPICE version of the SOI, the variables B3SOIcd and
14179  // B3SOIcb contain capacitor current contributions. So, one might
14180  // think that equivalent charge variables should be set up here
14181  // (Qcd, Qcb, etc). This isn't necessary, it turns out. cd and
14182  // cb are only used in SPICE's convergence and bypass analysis, and
14183  // are not ever loaded (directly or indirectly) into the SPICE
14184  // rhs vector.
14185 
14186  // evaluate equivalent charge current
14187  vgb_orig = vgs_orig - vbs_orig;
14188  vgmb_orig = vgms_orig - vbs_orig;
14189  veb_orig = ves_orig - vbs_orig;
14190 
14191 // ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs
14192 // - gcgeb * veb - gcgT * delTemp;
14193 
14194  Qeqqg_Jdxp = 0.0;
14195  if (!origFlag)
14196  {
14197  Qeqqg_Jdxp = - CAPcggb * (vgb-vgb_orig)
14198  + CAPcgdb * (vbd-vbd_orig)
14199  + CAPcgsb * (vbs-vbs_orig)
14200  + CAPcgeb * (veb-veb_orig)
14201  + CAPcgT * (delTemp-delTemp_orig);
14202  }
14203 
14204 // ceqqb = cqbody - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs
14205 // - gcbeb * veb - gcbT * delTemp;
14206 
14207  Qeqqb_Jdxp = 0.0;
14208  if (!origFlag)
14209  {
14210  Qeqqb_Jdxp = - CAPcbgb * (vgb-vgb_orig)
14211  + CAPcbdb * (vbd-vbd_orig)
14212  + CAPcbsb * (vbs-vbs_orig)
14213  - CAPcbeb * (veb-veb_orig)
14214  - CAPcbT * (delTemp-delTemp_orig);
14215  }
14216 
14217 // ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs
14218 // - gcdeb * veb - gcdT * delTemp -gcdgmb * vgmb;
14219 
14220  Qeqqd_Jdxp = 0.0;
14221  if (!origFlag)
14222  {
14223  Qeqqd_Jdxp = - CAPcdgb * (vgb-vgb_orig)
14224  + CAPcddb * (vbd-vbd_orig)
14225  + CAPcdsb * (vbs-vbs_orig)
14226  - CAPcdeb * (veb-veb_orig)
14228  -CAPcdgmb * (vgmb-vgmb_orig);
14229  }
14230 
14231 // ceqqe = cqsub - gcegb * vgb + gcedb * vbd + gcesb * vbs
14232 // - gceeb * veb - gceT * delTemp - gcegmb * vgmb;
14233 
14234  Qeqqe_Jdxp = 0.0;
14235  if (!origFlag)
14236  {
14237  Qeqqe_Jdxp = - CAPcegb * (vgb-vgb_orig)
14238  + CAPcedb * (vbd-vbd_orig)
14239  + CAPcesb * (vbs-vbs_orig)
14240  - CAPceeb * (veb-veb_orig)
14242  -CAPcegmb * (vgmb-vgmb_orig);
14243  }
14244 
14245 // ceqqth = cqtemp - gcTt * delTemp;
14246 
14247  Qeqqth_Jdxp = 0.0;
14248  if (!origFlag)
14249  {
14251  }
14252 
14253  if (rgateMod == 3)
14254  {
14255 // ceqqgmid = *(ckt->CKTstate0 + cqgmid)
14256 // + gcgmdb * vbd + gcgmsb * vbs - gcgmgmb * vgmb;
14257 
14258  Qeqqgmid_Jdxp = 0.0;
14259  if (!origFlag)
14260  {
14262  + CAPcgmsb * (vbs-vbs_orig)
14263  - CAPcgmgmb * (vgmb-vgmb_orig);
14264  }
14265  }
14266  else
14267  {
14268  Qeqqgmid_Jdxp = 0.0;
14269  }
14270  } // !ChargeComputationNeeded
14271 
14272  return bsuccess;
14273 }
14274 
14275 //-----------------------------------------------------------------------------
14276 // Function : Instance::loadDAEdQdx
14277 //
14278 // Purpose : Loads the Q-vector contributions for a single
14279 // B3SOI instance.
14280 //
14281 // Special Notes : The "Q" vector is part of a standard DAE formalism in
14282 // which the system of equations is represented as:
14283 //
14284 // f(x) = dQ(x)/dt + F(x) - B(t) = 0
14285 //
14286 // Scope : public
14287 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
14288 // Creation Date : 02/19/05
14289 //-----------------------------------------------------------------------------
14291 {
14292  N_LAS_Matrix & dQdx = *(extData.dQdxMatrixPtr);
14293 
14294  if (rgateMod == 3)
14295  {
14299  += (CAPcgmdb)*numberParallel;
14300 
14302  += (CAPcgmsb)*numberParallel;
14305 
14308 
14313  }
14314 
14317 
14326  if (soiMod != 2)
14327  {
14329  -= (CAPcegb + CAPcedb + CAPcesb + CAPceeb + CAPcegmb)*numberParallel;
14330  if (rgateMod == 0 || rgateMod == 1)
14331  {
14333  -= (+CAPcggb + CAPcgdb + CAPcgsb + CAPcgeb)*numberParallel;
14334  }
14335  else
14336  {
14338  += (+ CAPcgbb)*numberParallel;
14339  }
14345  += (+ CAPcbeb)*numberParallel;
14347  += (+ CAPcbgb)*numberParallel;
14349  += (+ CAPcbdb)*numberParallel;
14351  += (CAPcbsb)*numberParallel;
14353  += (-CAPcbgb - CAPcbdb - CAPcbsb - CAPcbeb)*numberParallel;
14354  }
14357  if (rgateMod == 0)
14358  {
14360  += (CAPcggb)*numberParallel;
14362  += (CAPcgdb)*numberParallel;
14364  += (CAPcgsb)*numberParallel;
14365  }
14366  else if (rgateMod == 1)
14367  {
14369  += (CAPcggb)*numberParallel;
14371  += (CAPcgdb)*numberParallel;
14373  += (CAPcgsb)*numberParallel;
14374  }
14375  else
14376  {
14378  += (CAPcggb)*numberParallel;
14380  += (CAPcgdb)*numberParallel;
14382  += (CAPcgsb)*numberParallel;
14383  }
14385  += ((CAPcdgb))*numberParallel;
14387  += ((CAPcddb) )*numberParallel;
14389  -= ((-CAPcdsb) )*numberParallel;
14390 
14392  += (CAPcsgb)*numberParallel;
14394  -= (-CAPcsdb )*numberParallel;
14396  += ((CAPcssb) )*numberParallel;
14397 
14398  if (selfheat)
14399  {
14401  += (CAPcdT)*numberParallel;
14403  += (CAPcsT)*numberParallel;
14407  += (CAPcgT)*numberParallel;
14409  += (CAPcTt)*numberParallel;
14410 
14411  if (bNode > 0)
14412  {
14414  += (CAPcbT)*numberParallel;
14415  }
14416  }
14417 
14418  return true;
14419 }
14420 
14421 //-----------------------------------------------------------------------------
14422 // Function : Instance::loadDAEdFdx ()
14423 //
14424 // Purpose : Loads the F-vector contributions for a single
14425 // resistor instance.
14426 //
14427 // Special Notes : The F-vector is an algebraic constaint.
14428 //
14429 // Scope : public
14430 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
14431 // Creation Date : 02/19/05
14432 //-----------------------------------------------------------------------------
14434 {
14435  N_LAS_Matrix & dFdx = *(extData.dFdxMatrixPtr);
14436 
14437  if (rgateMod == 1)
14438  {
14440  += geltd*numberParallel;
14442  -= geltd*numberParallel;
14444  -= geltd*numberParallel;
14445  // It seems that this should be here, but it shouldn't.
14446  // The geltd term is added into the G'-G' element later down in this
14447  // routine
14448  //
14449  // dFdx[li_GatePrime][AGatePrimeEquGatePrimeNodeOffset]
14450  // += geltd*numberParallel;
14451  }
14452  else if (rgateMod == 2)
14453  {
14464  if (soiMod != 2)
14467  }
14468  else if (rgateMod == 3)
14469  {
14471  += geltd*numberParallel;
14473  += -geltd*numberParallel;
14475  += -geltd*numberParallel;
14477  += (geltd + gcrg_jac)*numberParallel;
14479  += (gcrgd_jac)*numberParallel;
14483  += (gcrgs_jac)*numberParallel;
14484 
14485  if (soiMod != 2)
14486  {
14489  }
14490 
14493  }
14494  if (soiMod != 0)
14495  {
14497  += (Gme + gddpe)*numberParallel;
14499  += (gsspe - Gme)*numberParallel;
14500  if (soiMod != 2)
14501  {
14506  }
14507  }
14508 
14509  if (soiMod != 2)
14510  {
14511  if (rgateMod == 0 || rgateMod == 1)
14512  {
14515  }
14516  else
14517  {
14520  }
14522  -= ((-gddpb - Gmbs) + gIdtotb)*numberParallel;
14524  -= ((-gsspb + Gmbs) + Gmin + gIstotb)*numberParallel;
14526  += (gbbe)*numberParallel;
14528  += (-gigg + gbbg)*numberParallel;
14530  += (-gigd_jac + gbbdp)*numberParallel;
14532  += (gbbsp - Gmin - gigs)*numberParallel;
14534  += (-gigb_jac + gbbb + Gmin)*numberParallel;
14535  }
14536  if (rgateMod == 0)
14537  {
14539  += (gigg + Gmin + gIgtotg)*numberParallel;
14543  += (gigs + gIgtots)*numberParallel;
14544  }
14545  else if (rgateMod == 1)
14546  {
14550  += (gigd - Gmin + gIgtotd)*numberParallel;
14553  }
14554  else
14555  {
14562  }
14564  += ((Gm) + gddpg - Gmin - gIdtotg)*numberParallel;
14568  -= ((-gddpsp + gds + FwdSum) + gIdtots)*numberParallel;
14572  += (-Gm + gsspg - gIstotg)*numberParallel;
14574  -= (gds - gsspdp + RevSum + gIstotd)*numberParallel;
14587  if (bodyMod == 1)
14588  {
14590  -= gppp*numberParallel;
14592  += gppb*numberParallel;
14594  += gppp*numberParallel;
14595  }
14596  if (selfheat)
14597  {
14599  += (GmT + gddpT)*numberParallel;
14601  += (-GmT + gsspT)*numberParallel;
14602 
14604  += (gigT_jac)*numberParallel;
14606  += (gTtt + 1/paramPtr->rth)*numberParallel;
14608  += gTtg*numberParallel;
14610  += gTtdp*numberParallel;
14612  += gTtsp*numberParallel;
14613  if (soiMod != 0)
14614  {
14616  += gTte*numberParallel;
14617  }
14618  if (bNode > 0)
14619  {
14621  += (gbbT - gigT_jac)*numberParallel;
14623  += gTtb*numberParallel;
14624  }
14625  }
14626  if( icVDSGiven )
14627  {
14628  if( getSolverState().dcopFlag )
14629  {
14630  dFdx[li_Drain][ADrainEquIdsOffset] += 1.0;
14631  dFdx[li_Source][ASourceEquIdsOffset] -= 1.0;
14632  dFdx[li_Ids][icVDSEquVdOffset] += 1.0;
14633  dFdx[li_Ids][icVDSEquVsOffset] -= 1.0;
14634  }
14635  else
14636  {
14637  dFdx[li_Ids][icVDSEquIdsOffset] += 1.0;
14638  }
14639  }
14640 
14641  if( icVGSGiven )
14642  {
14643  if( getSolverState().dcopFlag )
14644  {
14645  dFdx[li_Gate][AGateEquIgsOffset] += 1.0;
14646  dFdx[li_Source][ASourceEquIgsOffset] -= 1.0;
14647  dFdx[li_Igs][icVGSEquVgOffset] += 1.0;
14648  dFdx[li_Igs][icVGSEquVsOffset] -= 1.0;
14649  }
14650  else
14651  {
14652  dFdx[li_Igs][icVGSEquIgsOffset] += 1.0;
14653  }
14654  }
14655 
14656  if( icVBSGiven )
14657  {
14658  if( getSolverState().dcopFlag )
14659  {
14660  dFdx[li_Body][ABodyEquIbsOffset] += 1.0;
14661  dFdx[li_Source][ASourceEquIbsOffset] -= 1.0;
14662  dFdx[li_Ibs][icVBSEquVbOffset] += 1.0;
14663  dFdx[li_Ibs][icVBSEquVsOffset] -= 1.0;
14664  }
14665  else
14666  {
14667  dFdx[li_Ibs][icVBSEquIbsOffset] += 1.0;
14668  }
14669  }
14670 
14671  if( icVESGiven )
14672  {
14673  if( getSolverState().dcopFlag )
14674  {
14675  dFdx[li_Substrate][ASubstrateEquIesOffset] += 1.0;
14676  dFdx[li_Source][ASourceEquIesOffset] -= 1.0;
14677  dFdx[li_Ies][icVESEquVeOffset] += 1.0;
14678  dFdx[li_Ies][icVESEquVsOffset] -= 1.0;
14679  }
14680  else
14681  {
14682  dFdx[li_Ies][icVESEquIesOffset] += 1.0;
14683  }
14684  }
14685 
14686  if( icVPSGiven )
14687  {
14688  if( getSolverState().dcopFlag )
14689  {
14690  dFdx[li_ExtBody][AExtBodyEquIpsOffset] += 1.0;
14691  dFdx[li_Source][ASourceEquIpsOffset] -= 1.0;
14692  dFdx[li_Ips][icVPSEquVpOffset] += 1.0;
14693  dFdx[li_Ips][icVPSEquVsOffset] -= 1.0;
14694  }
14695  else
14696  {
14697  dFdx[li_Ips][icVPSEquIpsOffset] += 1.0;
14698  }
14699  }
14700 
14701  return true;
14702 }
14703 
14704 //-----------------------------------------------------------------------------
14705 // Function : Instance:loadMatrix
14706 //
14707 // Purpose : The contents of this function were in the
14708 // loadAnalyticJacobian function previously. I moved them to
14709 // this new function as a debug exercise, b/c I needed to
14710 // load more than one matrix, as a debug tool.
14711 // Special Notes :
14712 // Scope : private
14713 // Creator : Eric Keiter, 9233
14714 // Creation Date : 01/06/05
14715 //-----------------------------------------------------------------------------
14716 bool Instance::loadMatrix (N_LAS_Matrix & JMat)
14717 {
14718  bool bsuccess = true;
14719 
14720  if (rgateMod == 1)
14721  {
14723  += geltd*numberParallel;
14725  -= geltd*numberParallel;
14727  -= geltd*numberParallel;
14728  // It seems that this should be here, but it shouldn't.
14729  // The geltd term is added into the G'-G' element later down in this
14730  // routine
14731  //
14732  // (JMat)[li_GatePrime][AGatePrimeEquGatePrimeNodeOffset]
14733  // += geltd*numberParallel;
14734  }
14735  else if (rgateMod == 2)
14736  {
14747  if (soiMod != 2)
14750  }
14751  else if (rgateMod == 3)
14752  {
14754  += geltd*numberParallel;
14756  += -geltd*numberParallel;
14758  += -geltd*numberParallel;
14769  if (soiMod != 2)
14770  {
14773  }
14782  }
14783  if (soiMod != 0)
14784  {
14786  += (Gme + gddpe)*numberParallel;
14788  += (gsspe - Gme)*numberParallel;
14789  if (soiMod != 2)
14790  {
14795  }
14796  }
14798  += gcedb*numberParallel;
14800  += gcesb*numberParallel;
14802  += gcdeb*numberParallel;
14804  += gcseb*numberParallel;
14806  += gcegb*numberParallel;
14808  += gcgeb*numberParallel;
14809  if (soiMod != 2)
14810  {
14812  -= (gcegb + gcedb + gcesb + gceeb + gcegmb)*numberParallel;
14813  if (rgateMod == 0 || rgateMod == 1)
14814  {
14817  }
14818  else
14819  {
14822  }
14824  -= ((-gddpb - Gmbs + gcdgb + gcddb + gcdeb + gcdsb) + gcdgmb + gIdtotb)*numberParallel;
14826  -= ((-gsspb + Gmbs + gcsgb + gcsdb + gcseb + gcssb) + gcsgmb + Gmin + gIstotb)*numberParallel;
14828  += (gbbe + gcbeb)*numberParallel;
14830  += (-gigg_jac + gcbgb + gbbg)*numberParallel;
14832  += (-gigd_jac + gcbdb + gbbdp)*numberParallel;
14834  += (gcbsb + gbbsp - Gmin - gigs_jac)*numberParallel;
14836  += (-gigb_jac + gbbb - gcbgb - gcbdb - gcbsb - gcbeb + Gmin)*numberParallel;
14837  }
14839  += gceeb*numberParallel;
14840  if (rgateMod == 0)
14841  {
14848  }
14849  else if (rgateMod == 1)
14850  {
14857  }
14858  else
14859  {
14866  }
14868  += ((Gm + gcdgb) + gddpg - Gmin - gIdtotg)*numberParallel;
14872  -= ((-gddpsp + gds + FwdSum - gcdsb) + gIdtots)*numberParallel;
14876  += (gcsgb - Gm + gsspg - gIstotg)*numberParallel;
14891  if (bodyMod == 1)
14892  {
14894  -= gppp*numberParallel;
14896  += gppb*numberParallel;
14898  += gppp*numberParallel;
14899  }
14900  if (selfheat)
14901  {
14903  += (GmT + gddpT + gcdT)*numberParallel;
14905  += (-GmT + gsspT + gcsT)*numberParallel;
14907  += gceT*numberParallel;
14909  += (gcgT + gigT_jac)*numberParallel;
14911  += (gTtt + 1/paramPtr->rth + gcTt)*numberParallel;
14913  += gTtg*numberParallel;
14915  += gTtdp*numberParallel;
14917  += gTtsp*numberParallel;
14918  if (soiMod != 0)
14919  {
14921  += gTte*numberParallel;
14922  }
14923  if (bNode > 0)
14924  {
14926  += (gbbT + gcbT - gigT_jac)*numberParallel;
14928  += gTtb*numberParallel;
14929  }
14930  }
14931 
14932  if( icVDSGiven )
14933  {
14934  if( getSolverState().dcopFlag )
14935  {
14936  (JMat)[li_Drain][ADrainEquIdsOffset] += 1.0;
14937  (JMat)[li_Source][ASourceEquIdsOffset] -= 1.0;
14938  (JMat)[li_Ids][icVDSEquVdOffset] += 1.0;
14939  (JMat)[li_Ids][icVDSEquVsOffset] -= 1.0;
14940  }
14941  else
14942  {
14943  (JMat)[li_Ids][icVDSEquIdsOffset] += 1.0;
14944  }
14945  }
14946 
14947  if( icVGSGiven )
14948  {
14949  if( getSolverState().dcopFlag )
14950  {
14951  (JMat)[li_Gate][AGateEquIgsOffset] += 1.0;
14952  (JMat)[li_Source][ASourceEquIgsOffset] -= 1.0;
14953  (JMat)[li_Igs][icVGSEquVgOffset] += 1.0;
14954  (JMat)[li_Igs][icVGSEquVsOffset] -= 1.0;
14955  }
14956  else
14957  {
14958  (JMat)[li_Igs][icVGSEquIgsOffset] += 1.0;
14959  }
14960  }
14961 
14962  if( icVBSGiven )
14963  {
14964  if( getSolverState().dcopFlag )
14965  {
14966  (JMat)[li_Body][ABodyEquIbsOffset] += 1.0;
14967  (JMat)[li_Source][ASourceEquIbsOffset] -= 1.0;
14968  (JMat)[li_Ibs][icVBSEquVbOffset] += 1.0;
14969  (JMat)[li_Ibs][icVBSEquVsOffset] -= 1.0;
14970  }
14971  else
14972  {
14973  (JMat)[li_Ibs][icVBSEquIbsOffset] += 1.0;
14974  }
14975  }
14976 
14977  if( icVESGiven )
14978  {
14979  if( getSolverState().dcopFlag )
14980  {
14981  (JMat)[li_Substrate][ASubstrateEquIesOffset] += 1.0;
14982  (JMat)[li_Source][ASourceEquIesOffset] -= 1.0;
14983  (JMat)[li_Ies][icVESEquVeOffset] += 1.0;
14984  (JMat)[li_Ies][icVESEquVsOffset] -= 1.0;
14985  }
14986  else
14987  {
14988  (JMat)[li_Ies][icVESEquIesOffset] += 1.0;
14989  }
14990  }
14991 
14992  if( icVPSGiven )
14993  {
14994  if( getSolverState().dcopFlag )
14995  {
14996  (JMat)[li_ExtBody][AExtBodyEquIpsOffset] += 1.0;
14997  (JMat)[li_Source][ASourceEquIpsOffset] -= 1.0;
14998  (JMat)[li_Ips][icVPSEquVpOffset] += 1.0;
14999  (JMat)[li_Ips][icVPSEquVsOffset] -= 1.0;
15000  }
15001  else
15002  {
15003  (JMat)[li_Ips][icVPSEquIpsOffset] += 1.0;
15004  }
15005  }
15006 
15007  return bsuccess;
15008 }
15009 
15010 //-----------------------------------------------------------------------------
15011 // Function : Instance:checkModel
15012 // Purpose :
15013 // Special Notes :
15014 // Scope : private
15015 // Creator : Dave Shirley
15016 // Creation Date : 08/04/04
15017 //-----------------------------------------------------------------------------
15018 
15020 {
15021  bool bsuccess = true;
15022 
15023  if (paramPtr->nlx < -paramPtr->leff)
15024  {
15025  UserError(*this) << "Nlx = " << paramPtr->nlx << " is less than -Leff";
15026  bsuccess = false;
15027  }
15028  if (model_.tox <= 0.0)
15029  {
15030  UserError(*this) << "Tox = " << model_.tox << " is not positive.";
15031  bsuccess = false;
15032  }
15033  if (model_.toxm <= 0.0)
15034  {
15035  UserError(*this) << "Toxm = " << model_.toxm << " is not positive.";
15036  bsuccess = false;
15037  }
15038  if (model_.tox - model_.dtoxcv <= 0.0)
15039  {
15040  UserError(*this) << "Tox - dtoxcv = " << model_.tox - model_.dtoxcv << " is not positive.";
15041  bsuccess = false;
15042  }
15043  if (model_.tbox <= 0.0)
15044  {
15045  UserError(*this) << "Tbox = " << model_.tbox << " is not positive.";
15046  bsuccess = false;
15047  }
15048  if (paramPtr->npeak <= 0.0)
15049  {
15050  UserError(*this) << "Nch = " << paramPtr->npeak << " is not positive.";
15051  bsuccess = false;
15052  }
15053  if (paramPtr->ngate < 0.0)
15054  {
15055  UserError(*this) << "Ngate = " << paramPtr->ngate << " is not positive.";
15056  bsuccess = false;
15057  }
15058  if (paramPtr->ngate > 1.e25)
15059  {
15060  UserError(*this) << "Ngate = %" << paramPtr->ngate << " is not positive.";
15061  bsuccess = false;
15062  }
15063  if (paramPtr->dvt1 < 0.0)
15064  {
15065  UserError(*this) << "Dvt1 = " << paramPtr->dvt1 << " is negative.";
15066  bsuccess = false;
15067  }
15068  if (paramPtr->dvt1w < 0.0)
15069  {
15070  UserError(*this) << "Dvt1w = " << paramPtr->dvt1w << " is negative.";
15071  bsuccess = false;
15072  }
15073  if (paramPtr->w0 == -paramPtr->weff)
15074  {
15075  UserError(*this) << "(W0 + Weff) = 0 causing divided-by-zero.\n";
15076  bsuccess = false;
15077  }
15078  if (paramPtr->dsub < 0.0)
15079  {
15080  UserError(*this) << "Dsub = " << paramPtr->dsub << " is negative.";
15081  bsuccess = false;
15082  }
15083  if (paramPtr->b1 == -paramPtr->weff)
15084  {
15085  UserError(*this) << "(B1 + Weff) = 0 causing divided-by-zero.\n";
15086  bsuccess = false;
15087  }
15088  if (paramPtr->u0temp <= 0.0)
15089  {
15090  UserError(*this) << "u0 at current temperature = " << paramPtr->u0temp << " is not positive.";
15091  bsuccess = false;
15092  }
15093  if (paramPtr->delta < 0.0)
15094  {
15095  UserError(*this) << "Delta = " << paramPtr->delta << " is not positive.";
15096  bsuccess = false;
15097  }
15098  if (paramPtr->vsattemp <= 0.0)
15099  {
15100  UserError(*this) << "Vsat at current temperature = " << paramPtr->vsattemp << " is not positive.";
15101  bsuccess = false;
15102  }
15103  if (paramPtr->pclm <= 0.0)
15104  {
15105  UserError(*this) << "Pclm = " << paramPtr->pclm << " is not positive.";
15106  bsuccess = false;
15107  }
15108  if (paramPtr->drout < 0.0)
15109  {
15110  UserError(*this) << "Drout = " << paramPtr->drout << " is negative.";
15111  bsuccess = false;
15112  }
15114  {
15115  if (drainPerimeter < paramPtr->weff)
15116  {
15117  if (getDeviceOptions().verboseLevel > 0)
15118  {
15119  UserWarning(*this) << "Pd = " << drainPerimeter << " is less than W.";
15120  }
15122  }
15123 
15124  if (sourcePerimeter < paramPtr->weff)
15125  {
15126  if (getDeviceOptions().verboseLevel > 0)
15127  {
15128  UserWarning(*this) << "Ps = " << sourcePerimeter << " is less than W.";
15129  }
15131  }
15132  }
15133  if (paramPtr->clc < 0.0)
15134  {
15135  UserError(*this) << "Clc = " << paramPtr->clc << " is negative.";
15136  bsuccess = false;
15137  }
15138 
15139  if (getDeviceOptions().verboseLevel > 0)
15140  {
15141  if (paramPtr->noff < 0.1)
15142  {
15143  UserWarning(*this) << "Noff = " << paramPtr->noff << " is too small.";
15144  }
15145  if (paramPtr->noff > 4.0)
15146  {
15147  UserWarning(*this) << "Noff = " << paramPtr->noff << " is too large.";
15148  }
15149  if (paramPtr->moin < 5.0)
15150  {
15151  UserWarning(*this) << "Moin = " << paramPtr->moin << " is too small.";
15152  }
15153  if (paramPtr->moin > 25.0)
15154  {
15155  UserWarning(*this) << "Moin = " << paramPtr->moin << " is too large.";
15156  }
15157  if (model_.moinFD < 5.0)
15158  {
15159  UserWarning(*this) << "MoinFD = " << model_.moinFD << " is too small.";
15160  }
15161  if (model_.capMod == 3) {
15162  if (paramPtr->acde < 0.1)
15163  {
15164  UserWarning(*this) << "Acde = " << paramPtr->acde << " is too small.";
15165  }
15166  if (paramPtr->acde > 1.6)
15167  {
15168  UserWarning(*this) << "Acde = " << paramPtr->acde << " is too large.";
15169  }
15170  }
15171  }
15172  if (model_.paramChk ==1)
15173  {
15174  if (paramPtr->leff <= 5.0e-8)
15175  {
15176  UserWarning(*this) << "Leff = " << paramPtr->leff << " may be too small.";
15177  }
15178  if (paramPtr->leffCV <= 5.0e-8)
15179  {
15180  UserWarning(*this) << "Leff for CV = " << paramPtr->leffCV << " may be too small.";
15181  }
15182  if (paramPtr->weff <= 1.0e-7)
15183  {
15184  UserWarning(*this) << "Weff = " << paramPtr->weff << " may be too small.";
15185  }
15186  if (paramPtr->weffCV <= 1.0e-7)
15187  {
15188  UserWarning(*this) << "Weff for CV = " << paramPtr->weffCV << " may be too small.";
15189  }
15190  if (paramPtr->nlx < 0.0)
15191  {
15192  UserWarning(*this) << "Nlx = " << paramPtr->nlx << " is negative.";
15193  }
15194  if (model_.tox < 1.0e-9)
15195  {
15196  UserWarning(*this) << "Tox = " << model_.tox << " is less than 10A.";
15197  }
15198  if (paramPtr->npeak <= 1.0e15)
15199  {
15200  UserWarning(*this) << "Nch = " << paramPtr->npeak << " may be too small.";
15201  }
15202  else if (paramPtr->npeak >= 1.0e21)
15203  {
15204  UserWarning(*this) << "Nch = " << paramPtr->npeak << " may be too large.";
15205  }
15206  if (fabs(paramPtr->nsub) >= 1.0e21)
15207  {
15208  UserWarning(*this) << "Nsub = " << paramPtr->nsub << " may be too large.";
15209  }
15210  if ((paramPtr->ngate > 0.0) && (paramPtr->ngate <= 1.e18))
15211  {
15212  UserWarning(*this) << "Ngate = " << paramPtr->ngate << " is less than 1.E18cm^-3.";
15213  }
15214  if (paramPtr->dvt0 < 0.0)
15215  {
15216  UserWarning(*this) << "Dvt0 = " << paramPtr->dvt0 << " is negative.";
15217  }
15218  if (fabs(1.0e-6 / (paramPtr->w0 + paramPtr->weff)) > 10.0)
15219  {
15220  UserWarning(*this) << "(W0 + Weff) may be too small.";
15221  }
15222 
15223  if (paramPtr->nfactor < 0.0)
15224  {
15225  UserWarning(*this) << "Nfactor = " << paramPtr->nfactor << " is negative.";
15226  }
15227 
15228  if (paramPtr->cdsc < 0.0)
15229  {
15230  UserWarning(*this) << "Cdsc = " << paramPtr->cdsc << " is negative.";
15231  }
15232 
15233  if (paramPtr->cdscd < 0.0)
15234  {
15235  UserWarning(*this) << "Cdscd = " << paramPtr->cdscd << " is negative.";
15236  }
15237 
15238  if (paramPtr->eta0 < 0.0)
15239  {
15240  UserWarning(*this) << "Eta0 = " << paramPtr->eta0 << " is negative.";
15241  }
15242 
15243  if (fabs(1.0e-6 / (paramPtr->b1 + paramPtr->weff)) > 10.0)
15244  {
15245  UserWarning(*this) << "(B1 + Weff) may be too small.";
15246  }
15247 
15248  if (paramPtr->a2 < 0.01)
15249  {
15250  UserWarning(*this) << "A2 = " << paramPtr->a2 << " is too small. Set to 0.01";
15251  paramPtr->a2 = 0.01;
15252  }
15253 
15254  else if (paramPtr->a2 > 1.0)
15255  {
15256  UserWarning(*this) << "A2 = " << paramPtr->a2 << " is larger than 1. A2 is set to 1 and A1 is set to 0.";
15257  paramPtr->a2 = 1.0;
15258  paramPtr->a1 = 0.0;
15259  }
15260 
15261  if (paramPtr->rdsw < 0.0)
15262  {
15263  UserWarning(*this) << "Rdsw = " << paramPtr->rdsw << " is negative. Set to zero.";
15264  paramPtr->rdsw = 0.0;
15265  paramPtr->rds0 = 0.0;
15266  }
15267 
15268  else if ((paramPtr->rds0 > 0.0) && (paramPtr->rds0 < 0.001))
15269  {
15270  UserWarning(*this) << "Rds at current temperature = " << paramPtr->rds0 << " is less than 0.001 ohm. Set to zero.";
15271  paramPtr->rds0 = 0.0;
15272  }
15273 
15274  if (paramPtr->vsattemp < 1.0e3)
15275  {
15276  UserWarning(*this) << "Vsat at current temperature = " << paramPtr->vsattemp << " may be too small.";
15277  }
15278 
15279  if (paramPtr->pdibl1 < 0.0)
15280  {
15281  UserWarning(*this) << "Pdibl1 = " << paramPtr->pdibl1 << " is negative.";
15282  }
15283 
15284  if (paramPtr->pdibl2 < 0.0)
15285  {
15286  UserWarning(*this) << "Pdibl2 = " << paramPtr->pdibl2 << " is negative.";
15287  }
15288 
15289  if (model_.cgdo < 0.0)
15290  {
15291  UserWarning(*this) << "cgdo = " << model_.cgdo << " is negative. Set to zero.";
15292  model_.cgdo = 0.0;
15293  }
15294 
15295  if (model_.cgso < 0.0)
15296  {
15297  UserWarning(*this) << "cgso = " << model_.cgso << " is negative. Set to zero.";
15298  model_.cgso = 0.0;
15299  }
15300 
15301  if (model_.cgeo < 0.0)
15302  {
15303  UserWarning(*this) << "cgeo = " << model_.cgeo << " is negative. Set to zero.";
15304  model_.cgeo = 0.0;
15305  }
15306 
15307  if (model_.ntun < 0.0)
15308  {
15309  UserWarning(*this) << "Ntun = " << model_.ntun << " is negative.";
15310  }
15311 
15312  if (model_.ndiode < 0.0)
15313  {
15314  UserWarning(*this) << "Ndiode = " << model_.ndiode << " is negative.";
15315  }
15316 
15317  if (model_.isbjt < 0.0)
15318  {
15319  UserWarning(*this) << "Isbjt = " << model_.isbjt << " is negative.";
15320  }
15321 
15322  if (model_.isdif < 0.0)
15323  {
15324  UserWarning(*this) << "Isdif = " << model_.isdif << " is negative.";
15325  }
15326 
15327  if (model_.isrec < 0.0)
15328  {
15329  UserWarning(*this) << "Isrec = " << model_.isrec << " is negative.";
15330  }
15331 
15332  if (model_.istun < 0.0)
15333  {
15334  UserWarning(*this) << "Istun = " << model_.istun << " is negative.";
15335  }
15336 
15337  if (model_.tt < 0.0)
15338  {
15339  UserWarning(*this) << "Tt = " << model_.tt << " is negative.";
15340  }
15341 
15342  if (model_.csdmin < 0.0)
15343  {
15344  UserWarning(*this) << "Csdmin = " << model_.csdmin << " is negative.";
15345  }
15346 
15347  if (model_.csdesw < 0.0)
15348  {
15349  UserWarning(*this) << "Csdesw = " << model_.csdesw << " is negative.";
15350  }
15351 
15352  if (model_.asd < 0.0)
15353  {
15354  UserWarning(*this) << "Asd = " << model_.asd << " should be within (0, 1).";
15355  }
15356 
15357  if (model_.rth0 < 0.0)
15358  {
15359  UserWarning(*this) << "Rth0 = " << model_.rth0 << " is negative.";
15360  }
15361 
15362  if (model_.cth0 < 0.0)
15363  {
15364  UserWarning(*this) << "Cth0 = " << model_.cth0 << " is negative.";
15365  }
15366 
15367  if (model_.rbody < 0.0)
15368  {
15369  UserWarning(*this) << "Rbody = " << model_.rbody << " is negative.";
15370  }
15371 
15372  if (model_.rbsh < 0.0)
15373  {
15374  UserWarning(*this) << "Rbsh = " << model_.rbsh << " is negative.";
15375  }
15376 
15377  if (paramPtr->nigc <= 0.0)
15378  {
15379  UserError(*this) << "nigc = " << paramPtr->nigc << " is non-positive.";
15380  bsuccess = false;
15381  }
15382 
15383  if (paramPtr->poxedge <= 0.0)
15384  {
15385  UserError(*this) << "poxedge = " << paramPtr->poxedge << " is non-positive.";
15386  bsuccess = false;
15387  }
15388 
15389  if (paramPtr->pigcd <= 0.0)
15390  {
15391  UserError(*this) << "pigcd = " << paramPtr->pigcd << " is non-positive.";
15392 
15393  }
15394 
15395  if (model_.wth0 < 0.0)
15396  {
15397  UserWarning(*this) << " Wth0 = " << model_.wth0 << " is negative.";
15398  }
15399 
15400  if (model_.rhalo < 0.0)
15401  {
15402  UserWarning(*this) << " Rhalo = " << model_.rhalo << " is negative.";
15403  }
15404 
15405  if (model_.ntox < 0.0)
15406  {
15407  UserWarning(*this) << " Ntox = " << model_.ntox << " is negative.";
15408  }
15409 
15410  if (model_.toxref < 0.0)
15411  {
15412  UserWarning(*this) << " Toxref = " << model_.toxref << " is negative.";
15413  bsuccess = false;
15414  }
15415 
15416  if (model_.ebg < 0.0)
15417  {
15418  UserWarning(*this) << " Ebg = " << model_.ebg << " is negative.";
15419  }
15420 
15421  if (model_.vevb < 0.0)
15422  {
15423  UserWarning(*this) << " Vevb = " << model_.vevb << " is negative.";
15424  }
15425 
15426  if (paramPtr->alphaGB1 < 0.0)
15427  {
15428  UserWarning(*this) << " AlphaGB1 = " << paramPtr->alphaGB1 << " is negative.";
15429  }
15430 
15431  if (paramPtr->betaGB1 < 0.0)
15432  {
15433  UserWarning(*this) << " BetaGB1 = " << paramPtr->betaGB1 << " is negative.";
15434  }
15435 
15436  if (model_.vgb1 < 0.0)
15437  {
15438  UserWarning(*this) << " Vgb1 = " << model_.vgb1 << " is negative.";
15439  }
15440 
15441  if (model_.vecb < 0.0)
15442  {
15443  UserWarning(*this) << " Vecb = " << model_.vecb << " is negative.";
15444  }
15445 
15446  if (paramPtr->alphaGB2 < 0.0)
15447  {
15448  UserWarning(*this) << " AlphaGB2 = " << paramPtr->alphaGB2 << " is negative.";
15449  }
15450 
15451  if (paramPtr->betaGB2 < 0.0)
15452  {
15453  UserWarning(*this) << " BetaGB2 = " << paramPtr->betaGB2 << " is negative.";
15454  }
15455 
15456  if (model_.vgb2 < 0.0)
15457  {
15458  UserWarning(*this) << " Vgb2 = " << model_.vgb2 << " is negative.";
15459  }
15460 
15461  if (model_.toxqm <= 0.0)
15462  {
15463  UserError(*this) << "Toxqm = " << model_.toxqm << " is not positive.";
15464  bsuccess = false;
15465  }
15466 
15467  if (model_.voxh < 0.0)
15468  {
15469  UserWarning(*this) << " Voxh = " << model_.voxh << " is negative.";
15470  }
15471 
15472  if (model_.deltavox <= 0.0)
15473  {
15474  UserError(*this) << "Deltavox = " << model_.deltavox << " is not positive.";
15475  }
15476 
15477  if (model_.k1w1 < 0.0)
15478  {
15479  UserWarning(*this) << " K1w1 = " << model_.k1w1 << " is negative.";
15480  }
15481 
15482  if (model_.k1w2 < 0.0)
15483  {
15484  UserWarning(*this) << " K1w2 = " << model_.k1w2 << " is negative.";
15485  }
15486 
15487  if (model_.ketas < 0.0)
15488  {
15489  UserWarning(*this) << " Ketas = " << model_.ketas << " is negative.";
15490  }
15491 
15492  if (model_.dwbc < 0.0)
15493  {
15494  UserWarning(*this) << " Dwbc = " << model_.dwbc << " is negative.";
15495  }
15496 
15497  if (model_.beta0 < 0.0)
15498  {
15499  UserWarning(*this) << " Beta0 = " << model_.beta0 << " is negative.";
15500  }
15501 
15502  if (model_.beta1 < 0.0)
15503  {
15504  UserWarning(*this) << " Beta1 = " << model_.beta1 << " is negative.";
15505  }
15506 
15507  if (model_.beta2 < 0.0)
15508  {
15509  UserWarning(*this) << " Beta2 = " << model_.beta2 << " is negative.";
15510  }
15511 
15512  if (model_.tii < 0.0)
15513  {
15514  UserWarning(*this) << " Tii = " << model_.tii << " is negative.";
15515  }
15516 
15517  if (model_.lii < 0.0)
15518  {
15519  UserWarning(*this) << " Lii = " << model_.lii << " is negative.";
15520  }
15521 
15522  if (model_.sii1 < 0.0)
15523  {
15524  UserWarning(*this) << " Sii1 = " << model_.sii1 << " is negative.";
15525  }
15526 
15527  if (model_.sii2 < 0.0)
15528  {
15529  UserWarning(*this) << " Sii2 = " << model_.sii1 << " is negative.";
15530  }
15531 
15532  if (model_.siid < 0.0)
15533  {
15534  UserWarning(*this) << " Siid = " << model_.siid << " is negative.";
15535  }
15536 
15537  if (model_.fbjtii < 0.0)
15538  {
15539  UserWarning(*this) << " fbjtii = " << model_.fbjtii << " is negative.";
15540  }
15541 
15542  if (model_.vrec0 < 0.0)
15543  {
15544  UserWarning(*this) << " Vrec0 = " << model_.vrec0 << " is negative.";
15545  }
15546 
15547  if (model_.vtun0 < 0.0)
15548  {
15549  UserWarning(*this) << " Vtun0 = " << model_.vtun0 << " is negative.";
15550  }
15551 
15552  if (model_.nbjt < 0.0)
15553  {
15554  UserWarning(*this) << " Nbjt = " << model_.nbjt << " is negative.";
15555  }
15556 
15557  if (model_.aely < 0.0)
15558  {
15559  UserWarning(*this) << " Aely = " << model_.aely << " is negative.";
15560  }
15561 
15562  if (model_.ahli < 0.0)
15563  {
15564  UserWarning(*this) << " Ahli = " << model_.ahli << " is negative.";
15565  }
15566 
15567  if (model_.rbody < 0.0)
15568  {
15569  UserWarning(*this) << " Rbody = " << model_.rbody << " is negative.";
15570  }
15571 
15572  if (model_.rbsh < 0.0)
15573  {
15574  UserWarning(*this) << " Rbsh = " << model_.rbsh << " is negative.";
15575  }
15576 
15577  if (paramPtr->ntrecf < 0.0)
15578  {
15579  UserWarning(*this) << " Ntrecf = " << paramPtr->ntrecf << " is negative.";
15580  }
15581 
15582  if (paramPtr->ntrecr < 0.0)
15583  {
15584  UserWarning(*this) << " Ntrecr = " << paramPtr->ntrecr << " is negative.";
15585  }
15586 
15587  if (model_.tcjswg < 0.0)
15588  {
15589  UserWarning(*this) << " Tcjswg = " << model_.tcjswg << " is negative.";
15590  }
15591 
15592  if (model_.tpbswg < 0.0)
15593  {
15594  UserWarning(*this) << " Tpbswg = " << model_.tpbswg << " is negative.";
15595  }
15596 
15597  if ((model_.acde < 0.1) || (model_.acde > 1.6))
15598  {
15599  UserWarning(*this) << " Acde = " << model_.acde << " is out of range.";
15600  }
15601 
15602  if ((model_.moin < 5.0)||(model_.moin > 25.0))
15603  {
15604  UserWarning(*this) << " Moin = " << model_.moin << " is out of range.";
15605  }
15606 
15607  if (model_.dlbg < 0.0)
15608  {
15609  UserWarning(*this) << " dlbg = " << model_.dlbg << " is negative.";
15610  }
15611 
15612 
15613  if (model_.agidl < 0.0)
15614  {
15615  UserWarning(*this) << " Agidl = " << model_.agidl << " is negative.";
15616  }
15617 
15618  if (model_.bgidl < 0.0)
15619  {
15620  UserWarning(*this) << " Bgidl = " << model_.bgidl << " is negative.";
15621  }
15622 
15623  if (model_.ngidl < 0.0)
15624  {
15625  UserWarning(*this) << " Ngidl = " << model_.ngidl << " is negative.";
15626  }
15627 
15628  if (model_.esatii < 0.0)
15629  {
15630  UserWarning(*this) << "Esatii = " << model_.esatii << " should be within (0, 1).";
15631  }
15632 
15633 
15634  if (paramPtr->xj > model_.tsi)
15635  {
15636  UserWarning(*this) << "Xj = " << paramPtr->xj << " is thicker than Tsi = " << model_.tsi << ".";
15637  }
15638 
15639  if (model_.capMod < 2)
15640  {
15641  UserWarning(*this) << "capMod < 2 is not supported by BSIM3SOI.";
15642  }
15643  }
15644 
15645  return bsuccess;
15646 }
15647 
15648 
15649 //-----------------------------------------------------------------------------
15650 // Function : Instance::setIC
15651 // Purpose :
15652 // Special Notes :
15653 // Scope : public
15654 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
15655 // Creation Date : 01/10/02
15656 //-----------------------------------------------------------------------------
15658 {
15659  bool bsuccess = true;
15660 
15661  if( icVDSGiven )
15662  {
15665  }
15666 
15667  if( icVGSGiven )
15668  {
15671  }
15672 
15673  if( icVBSGiven )
15674  {
15677  }
15678 
15679  if( icVESGiven )
15680  {
15683  }
15684 
15685  if( icVPSGiven )
15686  {
15689  }
15690 
15691  return bsuccess;
15692 }
15693 
15694 // Class Model
15695 //-----------------------------------------------------------------------------
15696 // Function : Model::processParams
15697 // Purpose :
15698 // Special Notes :
15699 // Scope : public
15700 // Creator : Dave Shirley
15701 // Creation Date : 05/20/04
15702 //-----------------------------------------------------------------------------
15704 {
15705 
15706  if (!given("DSUB"))
15707  dsub = drout;
15708  if (!given("XJ"))
15709  xj = tsi;
15710  if (!given("XDIF"))
15711  xdif = xbjt;
15712  if (!given("DWC"))
15713  dwc = Wint;
15714  if (!given("DLC"))
15715  dlc = Lint;
15716  if (!given("DLCIG"))
15717  dlcig = Lint;
15718 
15719  vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14));
15720  factor1 = sqrt(CONSTEPSSI / CONSTEPSOX * tox);
15721 
15722  Vtm0 = CONSTKoverQ * tnom;
15723  Eg0 = CONSTEg0 - CONSTalphaEg * tnom * tnom / (tnom + CONSTbetaEg);
15724  ni = CONSTNi0 * (tnom / CONSTREFTEMP) * sqrt(tnom / CONSTREFTEMP)
15725  * exp(21.5565981 - Eg0 / (2.0 * Vtm0));
15726  cbox = 3.453133e-11 / tbox;
15727  csi = 1.03594e-10 / tsi;
15728 
15729  return true;
15730 }
15731 
15732 //----------------------------------------------------------------------------
15733 // Function : Model::processInstanceParams
15734 // Purpose :
15735 // Special Notes :
15736 // Scope : public
15737 // Creator : Dave Shirely, PSSI
15738 // Creation Date : 03/23/06
15739 //----------------------------------------------------------------------------
15741 {
15742  std::vector<Instance*>::iterator iter;
15743  std::vector<Instance*>::iterator first = instanceContainer.begin();
15744  std::vector<Instance*>::iterator last = instanceContainer.end();
15745 
15746  for (iter=first; iter!=last; ++iter)
15747  {
15748  (*iter)->processParams();
15749  }
15750 
15751  return true;
15752 }
15753 
15754 //-----------------------------------------------------------------------------
15755 // Function : Model::Model
15756 // Purpose : model block constructor
15757 // Special Notes :
15758 // Scope : public
15759 // Creator : Dave Shirley
15760 // Creation Date : 05/20/04
15761 //-----------------------------------------------------------------------------
15763  const Configuration & configuration,
15764  const ModelBlock & MB,
15765  const FactoryBlock & factory_block)
15766  : DeviceModel(MB, configuration.getModelParameters(), factory_block),
15767  version ("3.2"),
15768  dtype (CONSTNMOS),
15769  cbox (0.0),
15770  csi (0.0),
15771  mobMod (0),
15772  capMod (0),
15773  binUnit (0),
15774  paramChk (0),
15775  model_l (0.0),
15776  model_w (0.0),
15777  Lmax (0.0),
15778  Lmin (0.0),
15779  Wmax (0.0),
15780  Wmin (0.0),
15781  dtoxcv (0.0),
15782  npeak (0.0),
15783  pdibl1 (0.0),
15784  pdibl2 (0.0),
15785  pdiblb (0.0),
15786  shMod (0.0),
15787  tbox (0.0),
15788  tsi (0.0),
15789  rth0 (0.0),
15790  cth0 (0.0),
15791  ngidl (0.0),
15792  agidl (0.0),
15793  bgidl (0.0),
15794  ndiode (0.0),
15795  xbjt (0.0),
15796  xdif (0.0),
15797  xrec (0.0),
15798  xtun (0.0),
15799  bodyJctGateSideGradingCoeff (0.0),
15800  fnoiMod (0.0),
15801  tnoiMod (0.0),
15802  tnoia (0.0),
15803  tnoib (0.0),
15804  rnoia (0.0),
15805  rnoib (0.0),
15806  ntnoi (0.0),
15807  noif (0.0),
15808  k1w1 (0.0),
15809  k1w2 (0.0),
15810  ketas (0.0),
15811  dwbc (0.0),
15812  beta1 (0.0),
15813  beta2 (0.0),
15814  vdsatii0 (0.0),
15815  tii (0.0),
15816  lii (0.0),
15817  sii0 (0.0),
15818  sii1 (0.0),
15819  sii2 (0.0),
15820  siid (0.0),
15821  fbjtii (0.0),
15822  esatii (0.0),
15823  ntun (0.0),
15824  nrecf0 (0.0),
15825  nrecr0 (0.0),
15826  isbjt (0.0),
15827  isdif (0.0),
15828  isrec (0.0),
15829  istun (0.0),
15830  ln (0.0),
15831  vrec0 (0.0),
15832  vtun0 (0.0),
15833  nbjt (0.0),
15834  lbjt0 (0.0),
15835  ldif0 (0.0),
15836  vabjt (0.0),
15837  aely (0.0),
15838  ahli (0.0),
15839  rbody (0.0),
15840  rbsh (0.0),
15841  cgeo (0.0),
15842  tt (0.0),
15843  ndif (0.0),
15844  vsdfb (0.0),
15845  vsdth (0.0),
15846  csdmin (0.0),
15847  asd (0.0),
15848  csdesw (0.0),
15849  ntrecf (0.0),
15850  ntrecr (0.0),
15851  dlcb (0.0),
15852  fbody (0.0),
15853  delvt (0.0),
15854  kb1 (0.0),
15855  dlbg (0.0),
15856  igbMod (0.0),
15857  igcMod (0.0),
15858  toxqm (0.0),
15859  wth0 (0.0),
15860  rhalo (0.0),
15861  ntox (0.0),
15862  toxref (0.0),
15863  ebg (0.0),
15864  vevb (0.0),
15865  alphaGB1 (0.0),
15866  betaGB1 (0.0),
15867  vgb1 (0.0),
15868  vecb (0.0),
15869  alphaGB2 (0.0),
15870  betaGB2 (0.0),
15871  vgb2 (0.0),
15872  voxh (0.0),
15873  deltavox (0.0),
15874  aigc (0.0),
15875  bigc (0.0),
15876  cigc (0.0),
15877  aigsd (0.0),
15878  bigsd (0.0),
15879  cigsd (0.0),
15880  nigc (0.0),
15881  pigcd (0.0),
15882  poxedge (0.0),
15883  dlcig (0.0),
15884  soiMod (0),
15885  vbs0pd (0.0),
15886  vbs0fd (0.0),
15887  vbsa (0.0),
15888  nofffd (0.0),
15889  vofffd (0.0),
15890  k1b (0.0),
15891  k2b (0.0),
15892  dk2b (0.0),
15893  dvbd0 (0.0),
15894  dvbd1 (0.0),
15895  moinFD (0.0),
15896  rgateMod (0),
15897  bug1830fix (0),
15898  xrcrg1 (0.0),
15899  xrcrg2 (0.0),
15900  rshg (0.0),
15901  ngcon (0.0),
15902  xgw (0.0),
15903  xgl (0.0),
15904  lalphaGB1 (0.0),
15905  lbetaGB1 (0.0),
15906  lalphaGB2 (0.0),
15907  lbetaGB2 (0.0),
15908  lndif (0.0),
15909  lntrecf (0.0),
15910  lntrecr (0.0),
15911  lxbjt (0.0),
15912  lxdif (0.0),
15913  lxrec (0.0),
15914  lxtun (0.0),
15915  laigc (0.0),
15916  lbigc (0.0),
15917  lcigc (0.0),
15918  laigsd (0.0),
15919  lbigsd (0.0),
15920  lcigsd (0.0),
15921  lnigc (0.0),
15922  lpigcd (0.0),
15923  lpoxedge (0.0),
15924  lnpeak (0.0),
15925  lk1w1 (0.0),
15926  lk1w2 (0.0),
15927  lketas (0.0),
15928  lpdibl1 (0.0),
15929  lpdibl2 (0.0),
15930  lpdiblb (0.0),
15931  lfbjtii (0.0),
15932  lbeta1 (0.0),
15933  lbeta2 (0.0),
15934  lvdsatii0 (0.0),
15935  llii (0.0),
15936  lesatii (0.0),
15937  lsii0 (0.0),
15938  lsii1 (0.0),
15939  lsii2 (0.0),
15940  lsiid (0.0),
15941  lkb1 (0.0),
15942  lagidl (0.0),
15943  lbgidl (0.0),
15944  lngidl (0.0),
15945  lntun (0.0),
15946  lndiode (0.0),
15947  lnrecf0 (0.0),
15948  lnrecr0 (0.0),
15949  lisbjt (0.0),
15950  lisdif (0.0),
15951  lisrec (0.0),
15952  listun (0.0),
15953  lvrec0 (0.0),
15954  lvtun0 (0.0),
15955  lnbjt (0.0),
15956  llbjt0 (0.0),
15957  lvabjt (0.0),
15958  laely (0.0),
15959  lahli (0.0),
15960  lvsdfb (0.0),
15961  lvsdth (0.0),
15962  ldelvt (0.0),
15963  lxrcrg1 (0.0),
15964  lxrcrg2 (0.0),
15965  walphaGB1 (0.0),
15966  wbetaGB1 (0.0),
15967  walphaGB2 (0.0),
15968  wbetaGB2 (0.0),
15969  wndif (0.0),
15970  wntrecf (0.0),
15971  wntrecr (0.0),
15972  wxbjt (0.0),
15973  wxdif (0.0),
15974  wxrec (0.0),
15975  wxtun (0.0),
15976  waigc (0.0),
15977  wbigc (0.0),
15978  wcigc (0.0),
15979  waigsd (0.0),
15980  wbigsd (0.0),
15981  wcigsd (0.0),
15982  wnigc (0.0),
15983  wpigcd (0.0),
15984  wpoxedge (0.0),
15985  wnpeak (0.0),
15986  wk1w1 (0.0),
15987  wk1w2 (0.0),
15988  wkb1 (0.0),
15989  wketas (0.0),
15990  wpdibl1 (0.0),
15991  wpdibl2 (0.0),
15992  wpdiblb (0.0),
15993  wfbjtii (0.0),
15994  wbeta1 (0.0),
15995  wbeta2 (0.0),
15996  wvdsatii0 (0.0),
15997  wlii (0.0),
15998  wesatii (0.0),
15999  wsii0 (0.0),
16000  wsii1 (0.0),
16001  wsii2 (0.0),
16002  wsiid (0.0),
16003  wagidl (0.0),
16004  wbgidl (0.0),
16005  wngidl (0.0),
16006  wntun (0.0),
16007  wndiode (0.0),
16008  wnrecf0 (0.0),
16009  wnrecr0 (0.0),
16010  wisbjt (0.0),
16011  wisdif (0.0),
16012  wisrec (0.0),
16013  wistun (0.0),
16014  wvrec0 (0.0),
16015  wvtun0 (0.0),
16016  wnbjt (0.0),
16017  wlbjt0 (0.0),
16018  wvabjt (0.0),
16019  waely (0.0),
16020  wahli (0.0),
16021  wvsdfb (0.0),
16022  wvsdth (0.0),
16023  wdelvt (0.0),
16024  wxrcrg1 (0.0),
16025  wxrcrg2 (0.0),
16026  palphaGB1 (0.0),
16027  pbetaGB1 (0.0),
16028  palphaGB2 (0.0),
16029  pbetaGB2 (0.0),
16030  pndif (0.0),
16031  pntrecf (0.0),
16032  pntrecr (0.0),
16033  pxbjt (0.0),
16034  pxdif (0.0),
16035  pxrec (0.0),
16036  pxtun (0.0),
16037  paigc (0.0),
16038  pbigc (0.0),
16039  pcigc (0.0),
16040  paigsd (0.0),
16041  pbigsd (0.0),
16042  pcigsd (0.0),
16043  pnigc (0.0),
16044  ppigcd (0.0),
16045  ppoxedge (0.0),
16046  pnpeak (0.0),
16047  pk1w1 (0.0),
16048  pk1w2 (0.0),
16049  pkb1 (0.0),
16050  pketas (0.0),
16051  ppdibl1 (0.0),
16052  ppdibl2 (0.0),
16053  ppdiblb (0.0),
16054  pfbjtii (0.0),
16055  pbeta1 (0.0),
16056  pbeta2 (0.0),
16057  pvdsatii0 (0.0),
16058  plii (0.0),
16059  pesatii (0.0),
16060  psii0 (0.0),
16061  psii1 (0.0),
16062  psii2 (0.0),
16063  psiid (0.0),
16064  pagidl (0.0),
16065  pbgidl (0.0),
16066  pngidl (0.0),
16067  pntun (0.0),
16068  pndiode (0.0),
16069  pnrecf0 (0.0),
16070  pnrecr0 (0.0),
16071  pisbjt (0.0),
16072  pisdif (0.0),
16073  pisrec (0.0),
16074  pistun (0.0),
16075  pvrec0 (0.0),
16076  pvtun0 (0.0),
16077  pnbjt (0.0),
16078  plbjt0 (0.0),
16079  pvabjt (0.0),
16080  paely (0.0),
16081  pahli (0.0),
16082  pvsdfb (0.0),
16083  pvsdth (0.0),
16084  pdelvt (0.0),
16085  pxrcrg1 (0.0),
16086  pxrcrg2 (0.0),
16087  npeakGiven (false),
16088  csdminGiven (false),
16089  vsdthGiven (false),
16090  vsdfbGiven (false),
16091  gamma1Given (false),
16092  gamma2Given (false),
16093  vbxGiven (false),
16094  vbmGiven (false),
16095  xtGiven (false),
16096  k1Given (false),
16097  k2Given (false),
16098  vcrit (0.0),
16099  vtm (0.0),
16100  tox (0.0),
16101  toxm (0.0),
16102  cdsc (0.0),
16103  cdscb (0.0),
16104  cdscd (0.0),
16105  cit (0.0),
16106  nfactor (0.0),
16107  xj (0.0),
16108  vsat (0.0),
16109  at (0.0),
16110  a0 (0.0),
16111  ags (0.0),
16112  a1 (0.0),
16113  a2 (0.0),
16114  keta (0.0),
16115  nsub (0.0),
16116  ngate (0.0),
16117  gamma1 (0.0),
16118  gamma2 (0.0),
16119  vbx (0.0),
16120  vbm (0.0),
16121  xt (0.0),
16122  k1 (0.0),
16123  kt1 (0.0),
16124  kt1l (0.0),
16125  kt2 (0.0),
16126  k2 (0.0),
16127  k3 (0.0),
16128  k3b (0.0),
16129  w0 (0.0),
16130  nlx (0.0),
16131  dvt0 (0.0),
16132  dvt1 (0.0),
16133  dvt2 (0.0),
16134  dvt0w (0.0),
16135  dvt1w (0.0),
16136  dvt2w (0.0),
16137  drout (0.0),
16138  dsub (0.0),
16139  vth0 (0.0),
16140  ua (0.0),
16141  ua1 (0.0),
16142  ub (0.0),
16143  ub1 (0.0),
16144  uc (0.0),
16145  uc1 (0.0),
16146  u0 (0.0),
16147  ute (0.0),
16148  voff (0.0),
16149  delta (0.0),
16150  rdsw (0.0),
16151  prwg (0.0),
16152  prwb (0.0),
16153  prt (0.0),
16154  eta0 (0.0),
16155  etab (0.0),
16156  pclm (0.0),
16157  pvag (0.0),
16158  wr (0.0),
16159  dwg (0.0),
16160  dwb (0.0),
16161  b0 (0.0),
16162  b1 (0.0),
16163  alpha0 (0.0),
16164  beta0 (0.0),
16165  cgsl (0.0),
16166  cgdl (0.0),
16167  ckappa (0.0),
16168  cf (0.0),
16169  clc (0.0),
16170  cle (0.0),
16171  dwc (0.0),
16172  dlc (0.0),
16173  noff (0.0),
16174  acde (0.0),
16175  moin (0.0),
16176  tcjswg (0.0),
16177  tpbswg (0.0),
16178  lcdsc (0.0),
16179  lcdscb (0.0),
16180  lcdscd (0.0),
16181  lcit (0.0),
16182  lnfactor (0.0),
16183  lxj (0.0),
16184  lvsat (0.0),
16185  lat (0.0),
16186  la0 (0.0),
16187  lags (0.0),
16188  la1 (0.0),
16189  la2 (0.0),
16190  lketa (0.0),
16191  lnsub (0.0),
16192  lngate (0.0),
16193  lk1 (0.0),
16194  lkt1 (0.0),
16195  lkt1l (0.0),
16196  lkt2 (0.0),
16197  lk2 (0.0),
16198  lk3 (0.0),
16199  lk3b (0.0),
16200  lw0 (0.0),
16201  lnlx (0.0),
16202  ldvt0 (0.0),
16203  ldvt1 (0.0),
16204  ldvt2 (0.0),
16205  ldvt0w (0.0),
16206  ldvt1w (0.0),
16207  ldvt2w (0.0),
16208  ldrout (0.0),
16209  ldsub (0.0),
16210  lvth0 (0.0),
16211  lua (0.0),
16212  lua1 (0.0),
16213  lub (0.0),
16214  lub1 (0.0),
16215  luc (0.0),
16216  luc1 (0.0),
16217  lu0 (0.0),
16218  lute (0.0),
16219  lvoff (0.0),
16220  ldelta (0.0),
16221  lrdsw (0.0),
16222  lprwg (0.0),
16223  lprwb (0.0),
16224  lprt (0.0),
16225  leta0 (0.0),
16226  letab (0.0),
16227  lpclm (0.0),
16228  lpvag (0.0),
16229  lwr (0.0),
16230  ldwg (0.0),
16231  ldwb (0.0),
16232  lb0 (0.0),
16233  lb1 (0.0),
16234  lalpha0 (0.0),
16235  lbeta0 (0.0),
16236  lcgsl (0.0),
16237  lcgdl (0.0),
16238  lckappa (0.0),
16239  lnoff (0.0),
16240  lacde (0.0),
16241  lmoin (0.0),
16242  wcdsc (0.0),
16243  wcdscb (0.0),
16244  wcdscd (0.0),
16245  wcit (0.0),
16246  wnfactor (0.0),
16247  wxj (0.0),
16248  wvsat (0.0),
16249  wat (0.0),
16250  wa0 (0.0),
16251  wags (0.0),
16252  wa1 (0.0),
16253  wa2 (0.0),
16254  wketa (0.0),
16255  wnsub (0.0),
16256  wngate (0.0),
16257  wk1 (0.0),
16258  wkt1 (0.0),
16259  wkt1l (0.0),
16260  wkt2 (0.0),
16261  wk2 (0.0),
16262  wk3 (0.0),
16263  wk3b (0.0),
16264  ww0 (0.0),
16265  wnlx (0.0),
16266  wdvt0 (0.0),
16267  wdvt1 (0.0),
16268  wdvt2 (0.0),
16269  wdvt0w (0.0),
16270  wdvt1w (0.0),
16271  wdvt2w (0.0),
16272  wdrout (0.0),
16273  wdsub (0.0),
16274  wvth0 (0.0),
16275  wua (0.0),
16276  wua1 (0.0),
16277  wub (0.0),
16278  wub1 (0.0),
16279  wuc (0.0),
16280  wuc1 (0.0),
16281  wu0 (0.0),
16282  wute (0.0),
16283  wvoff (0.0),
16284  wdelta (0.0),
16285  wrdsw (0.0),
16286  wprwg (0.0),
16287  wprwb (0.0),
16288  wprt (0.0),
16289  weta0 (0.0),
16290  wetab (0.0),
16291  wpclm (0.0),
16292  wpvag (0.0),
16293  wwr (0.0),
16294  wdwg (0.0),
16295  wdwb (0.0),
16296  wb0 (0.0),
16297  wb1 (0.0),
16298  walpha0 (0.0),
16299  wbeta0 (0.0),
16300  wcgsl (0.0),
16301  wcgdl (0.0),
16302  wckappa (0.0),
16303  wnoff (0.0),
16304  wacde (0.0),
16305  wmoin (0.0),
16306  pcdsc (0.0),
16307  pcdscb (0.0),
16308  pcdscd (0.0),
16309  pcit (0.0),
16310  pnfactor (0.0),
16311  pxj (0.0),
16312  pvsat (0.0),
16313  pat (0.0),
16314  pa0 (0.0),
16315  pags (0.0),
16316  pa1 (0.0),
16317  pa2 (0.0),
16318  pketa (0.0),
16319  pnsub (0.0),
16320  pngate (0.0),
16321  pk1 (0.0),
16322  pkt1 (0.0),
16323  pkt1l (0.0),
16324  pkt2 (0.0),
16325  pk2 (0.0),
16326  pk3 (0.0),
16327  pk3b (0.0),
16328  pw0 (0.0),
16329  pnlx (0.0),
16330  pdvt0 (0.0),
16331  pdvt1 (0.0),
16332  pdvt2 (0.0),
16333  pdvt0w (0.0),
16334  pdvt1w (0.0),
16335  pdvt2w (0.0),
16336  pdrout (0.0),
16337  pdsub (0.0),
16338  pvth0 (0.0),
16339  pua (0.0),
16340  pua1 (0.0),
16341  pub (0.0),
16342  pub1 (0.0),
16343  puc (0.0),
16344  puc1 (0.0),
16345  pu0 (0.0),
16346  pute (0.0),
16347  pvoff (0.0),
16348  pdelta (0.0),
16349  prdsw (0.0),
16350  pprwg (0.0),
16351  pprwb (0.0),
16352  pprt (0.0),
16353  peta0 (0.0),
16354  petab (0.0),
16355  ppclm (0.0),
16356  ppvag (0.0),
16357  pwr (0.0),
16358  pdwg (0.0),
16359  pdwb (0.0),
16360  pb0 (0.0),
16361  pb1 (0.0),
16362  palpha0 (0.0),
16363  pbeta0 (0.0),
16364  pcgsl (0.0),
16365  pcgdl (0.0),
16366  pckappa (0.0),
16367  pnoff (0.0),
16368  pacde (0.0),
16369  pmoin (0.0),
16370  tnom (0.0),
16371  cgso (0.0),
16372  cgdo (0.0),
16373  xpart (0.0),
16374  sheetResistance (0.0),
16375  GatesidewallJctPotential (0.0),
16376  unitLengthGateSidewallJctCap (0.0),
16377  Lint (0.0),
16378  Ll (0.0),
16379  Llc (0.0),
16380  Lln (0.0),
16381  Lw (0.0),
16382  Lwc (0.0),
16383  Lwn (0.0),
16384  Lwl (0.0),
16385  Lwlc (0.0),
16386  Wint (0.0),
16387  Wl (0.0),
16388  Wlc (0.0),
16389  Wln (0.0),
16390  Ww (0.0),
16391  Wwc (0.0),
16392  Wwn (0.0),
16393  Wwl (0.0),
16394  Wwlc (0.0),
16395  cox (0.0),
16396  factor1 (0.0),
16397  oxideTrapDensityA (0.0),
16398  oxideTrapDensityB (0.0),
16399  oxideTrapDensityC (0.0),
16400  em (0.0),
16401  ef (0.0),
16402  af (0.0),
16403  kf (0.0),
16404  vth0Given (false),
16405  igbModGiven (false),
16406  Vtm0 (0.0),
16407  Eg0 (0.0),
16408  ni (0.0)
16409 {
16410  if (getType() != "")
16411  {
16412  if (getType() == "NMOS") {
16413  dtype = CONSTNMOS;
16414  }
16415  else if (getType() == "PMOS") {
16416  dtype = CONSTPMOS;
16417  }
16418  else
16419  {
16420  UserError0(*this) << "Could not recognize the type for model " << getName();
16421  }
16422  }
16423 
16424  // Set params to constant default values:
16425  setDefaultParams ();
16426 
16427  // Set params according to .model line and constant defaults from metadata:
16428  setModParams (MB.params);
16429 
16430  // Set any non-constant parameter defaults:
16431 
16432 #ifdef Xyce_B3SOI_USE_DEFL
16433  if (!model_lGiven)
16435  if (!model_wGiven)
16437 #endif
16438 
16439  if (!given("TNOM"))
16441  if (!given("TOXM"))
16442  toxm = tox; /* v3.2 */
16443  if (!given("TOXQM"))
16444  toxqm = tox;
16445  if (!given("CF"))
16446  cf = 2.0 * CONSTEPSOX / M_PI * log(1.0 + 0.4e-6 / tox);
16447  if (!vth0Given)
16448  vth0 = (dtype == CONSTNMOS) ? 0.7 : -0.7;
16449  if (!given("UC"))
16450  uc = (mobMod == 3) ? -0.0465 : -0.0465e-9;
16451  if (!given("UC1"))
16452  uc1 = (mobMod == 3) ? -0.056 : -0.056e-9;
16453  if (!given("U0"))
16454  u0 = (dtype == CONSTNMOS) ? 0.067 : 0.025;
16455  if (!given("VOXH"))
16456  voxh = 5.0;
16457  if (!given("DELTAVOX"))
16458  deltavox = 0.005;
16459  if (!given("AIGC"))
16460  aigc = (dtype == CONSTNMOS) ? 0.43 : 0.31;
16461  if (!given("BIGC"))
16462  bigc = (dtype == CONSTNMOS) ? 0.054 : 0.024;
16463  if (!given("CIGC"))
16464  cigc = (dtype == CONSTNMOS) ? 0.075 : 0.03;
16465  if (!given("AIGSD"))
16466  aigsd = (dtype == CONSTNMOS) ? 0.43 : 0.31;
16467  if (!given("BIGSD"))
16468  bigsd = (dtype == CONSTNMOS) ? 0.054 : 0.024;
16469  if (!given("CIGSD"))
16470  cigsd = (dtype == CONSTNMOS) ? 0.075 : 0.03;
16471  if (!given("NOIA"))
16472  {
16473  if (dtype == CONSTNMOS)
16474  oxideTrapDensityA = 6.25e41;
16475  else
16476  oxideTrapDensityA=6.188e40;
16477  }
16478  if (!given("NOIB"))
16479  {
16480  if (dtype == CONSTNMOS)
16481  oxideTrapDensityB = 3.125e26;
16482  else
16483  oxideTrapDensityB = 1.5e25;
16484  }
16485 
16486  // PMC It is assumed tox does not change in any temperature
16487  // interpolation done in Instance::updateTemperature()
16488  cox = 3.453133e-11 / tox;
16489  if (!given("CGDO"))
16490  {
16491  if (given("DLC") && (dlc > 0.0))
16492  cgdo = dlc * cox - cgdl ;
16493  else
16494  cgdo = 0.6 * xj * cox;
16495  }
16496  if (!given("CGSO"))
16497  {
16498  if (given("DLC") && (dlc > 0.0))
16499  cgso = dlc * cox - cgsl ;
16500  else
16501  cgso = 0.6 * xj * cox;
16502  }
16503 
16504  // Calculate any parameters specified as expressions:
16505 
16507 
16508  // calculate dependent (ie computed) params and check for errors:
16509 
16510  if ((soiMod != 0) && (soiMod != 1) && (soiMod != 2) && (soiMod != 3))
16511  {
16512  soiMod = 0;
16513  UserWarning(*this) << "soiMod has been set to its default value: 0";
16514  }
16515  else if ((rgateMod != 0) && (rgateMod != 1) && (rgateMod != 2) && (rgateMod != 3))
16516  {
16517  rgateMod = 0;
16518  UserWarning(*this) << "gateMod has been set to its default value: 0";
16519  }
16520  if ((fnoiMod != 0) && (fnoiMod != 1))
16521  {
16522  fnoiMod = 1;
16523  UserWarning(*this) << "noiMod has been set to default value: 1";
16524  }
16525  if ((tnoiMod != 0) && (tnoiMod != 1))
16526  {
16527  tnoiMod = 0;
16528  UserWarning(*this) << "tnoiMod has been set to default value: 0";
16529  }
16530  if (GatesidewallJctPotential < 0.1)
16531  {
16533  UserWarning(*this) << "Given pbswg is less than 0.1. Pbswg is set to 0.1.\n";
16534  }
16535  sizeDependParamList.clear();
16536 
16537  processParams ();
16538 }
16539 
16540 //-----------------------------------------------------------------------------
16541 // Function : Model::~Model
16542 // Purpose : destructor
16543 // Special Notes :
16544 // Scope : public
16545 // Creator : Dave Shirley
16546 // Creation Date : 05/20/04
16547 //-----------------------------------------------------------------------------
16549 {
16550  std::list<SizeDependParam*>::iterator it_dpL =
16551  sizeDependParamList.begin();
16552  std::list<SizeDependParam*>::iterator end_dpL =
16553  sizeDependParamList.end();
16554  for( ; it_dpL != end_dpL; ++it_dpL )
16555  delete (*it_dpL);
16556 
16557  sizeDependParamList.clear ();
16558 
16559  std::vector<Instance*>::iterator iter;
16560  std::vector<Instance*>::iterator first = instanceContainer.begin();
16561  std::vector<Instance*>::iterator last = instanceContainer.end();
16562 
16563  for (iter=first; iter!=last; ++iter)
16564  {
16565  delete (*iter);
16566  }
16567 }
16568 
16569 
16570 //-----------------------------------------------------------------------------
16571 // Function : Model::printOutInstances
16572 // Purpose : debugging tool.
16573 // Special Notes :
16574 // Scope : public
16575 // Creator : Dave Shirley
16576 // Creation Date : 05/20/04
16577 //-----------------------------------------------------------------------------
16578 std::ostream &Model::printOutInstances(std::ostream &os) const
16579 {
16580  std::vector<Instance*>::const_iterator iter;
16581  std::vector<Instance*>::const_iterator first = instanceContainer.begin();
16582  std::vector<Instance*>::const_iterator last = instanceContainer.end();
16583 
16584  int i;
16585  os << std::endl;
16586  os << " name modelName Parameters" << std::endl;
16587 
16588  for (i=0, iter=first; iter!=last; ++iter,++i)
16589  {
16590  os << " " << i << ": " << (*iter)->getName() << "\t";
16591  os << getName();
16592  os << std::endl;
16593  }
16594 
16595  os << std::endl;
16596 
16597  return os;
16598 }
16599 
16600 //-----------------------------------------------------------------------------
16601 // Function : Model::forEachInstance
16602 // Purpose :
16603 // Special Notes :
16604 // Scope : public
16605 // Creator : David Baur
16606 // Creation Date : 2/4/2014
16607 //-----------------------------------------------------------------------------
16608 /// Apply a device instance "op" to all instances associated with this
16609 /// model
16610 ///
16611 /// @param[in] op Operator to apply to all instances.
16612 ///
16613 ///
16614 void Model::forEachInstance(DeviceInstanceOp &op) const /* override */
16615 {
16616  for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
16617  op(*it);
16618 }
16619 
16620 
16621 
16622 //----------------------------------------------------------------------------
16623 // Function : Model::clearTemperatureData
16624 //
16625 // Purpose : This is mainly here to delete rid of the size
16626 // dependent parameters, which are also temperature dependent.
16627 //
16628 // Special Notes : This is called right before the circuit temperature is
16629 // changed.
16630 //
16631 // Scope : public
16632 // Creator : Eric R. Keiter, 9233, computation sciences
16633 // Creation Date : 03/08/2005
16634 //----------------------------------------------------------------------------
16636 {
16637  std::list<SizeDependParam*>::iterator it_dpL =
16638  sizeDependParamList.begin();
16639 
16640  std::list<SizeDependParam*>::iterator end_dpL =
16641  sizeDependParamList.end();
16642 
16643  for( ; it_dpL != end_dpL; ++it_dpL )
16644  delete (*it_dpL);
16645 
16646  sizeDependParamList.clear ();
16647 
16648  return true;
16649 }
16650 
16651 //-----------------------------------------------------------------------------
16652 // MOSFET B3SOI Master functions:
16653 //-----------------------------------------------------------------------------
16654 
16655 //-----------------------------------------------------------------------------
16656 // Function : Master::updateState
16657 // Purpose :
16658 // Special Notes :
16659 // Scope : public
16660 // Creator : Eric Keiter, SNL
16661 // Creation Date : 01/06/09
16662 //-----------------------------------------------------------------------------
16663 bool Master::updateState (double * solVec, double * staVec, double * stoVec)
16664 {
16665  bool bsuccess = true;
16666 
16667  for (InstanceVector::const_iterator it = getInstanceBegin(); it != getInstanceEnd(); ++it)
16668  {
16669  Instance & mi = *(*it);
16670 
16671  double * stoVec = mi.extData.nextStoVectorRawPtr;
16672 
16673  // save voltage drops
16674  bool btmp = mi.updateIntermediateVars ();
16675  bsuccess = bsuccess && btmp;
16676 
16677  // voltage drops:
16678  stoVec[mi.li_store_vbd] = mi.vbd;
16679  stoVec[mi.li_store_vbs] = mi.vbs;
16680  stoVec[mi.li_store_vgs] = mi.vgs;
16681  stoVec[mi.li_store_vds] = mi.vds;
16682  stoVec[mi.li_store_ves] = mi.ves;
16683  stoVec[mi.li_store_vps] = mi.vps;
16684 
16685  stoVec[mi.li_store_vgp] = mi.Vgp;
16686  stoVec[mi.li_store_vd] = mi.Vdp;
16687  stoVec[mi.li_store_vs] = mi.Vsp;
16688  stoVec[mi.li_store_vp] = mi.Vp;
16689  stoVec[mi.li_store_ve] = mi.Ve;
16690  stoVec[mi.li_store_vg] = mi.Vg;
16691  stoVec[mi.li_store_vgm] = mi.Vgm;
16692  stoVec[mi.li_store_deltemp] = mi.delTemp;
16693 
16694  stoVec[mi.li_store_vges] = mi.vges;
16695  stoVec[mi.li_store_vgms] = mi.vgms;
16696 
16697  // intrinsic capacitors:
16698  staVec[mi.li_state_qb] = mi.qb;
16699  staVec[mi.li_state_qg] = mi.qg;
16700  staVec[mi.li_state_qd] = mi.qd;
16701  staVec[mi.li_state_qe] = mi.qe;
16702  staVec[mi.li_state_qgmid] = mi.qgmid;
16703  staVec[mi.li_state_qth] = mi.qth;
16704 
16705  // if this is the first newton step of the first time step
16706  // of the transient simulation, we need to enforce that the
16707  // time derivatives w.r.t. charge are zero. This is to maintain 3f5
16708  // compatibility. ERK.
16709 
16710  // Note: I think this kind of thing is enforced (or should be enforced,
16711  // anyway) at the time integration level. So I'm not sure this step is
16712  // really needed, at least for new-DAE. Derivatives out of the DCOP
16713  // are supposed to be zero at the first newton step.
16714 
16715  if (!(getSolverState().dcopFlag) && getSolverState().initTranFlag && getSolverState().newtonIter==0)
16716  {
16717  double * currStaVec = mi.extData.currStaVectorRawPtr;
16718 
16719  // intrinsic capacitors:
16720  currStaVec[mi.li_state_qb] = mi.qb;
16721  currStaVec[mi.li_state_qg] = mi.qg;
16722  currStaVec[mi.li_state_qd] = mi.qd;
16723  currStaVec[mi.li_state_qe] = mi.qe;
16724  currStaVec[mi.li_state_qgmid] = mi.qgmid;
16725  currStaVec[mi.li_state_qth] = mi.qth;
16726  }
16727  }
16728 // }
16729 
16730  return bsuccess;
16731 }
16732 
16733 //-----------------------------------------------------------------------------
16734 // Function : Master::loadDAEVectors
16735 // Purpose :
16736 // Special Notes :
16737 // Scope : public
16738 // Creator : Eric Keiter, SNL
16739 // Creation Date : 01/06/09
16740 //-----------------------------------------------------------------------------
16741 bool Master::loadDAEVectors (double * solVec, double * fVec, double *qVec, double * storeLeadF, double * storeLeadQ)
16742 {
16743  for (InstanceVector::const_iterator it = getInstanceBegin(); it != getInstanceEnd(); ++it)
16744  {
16745  Instance & mi = *(*it);
16746 
16747  double * dFdxdVp = mi.extData.dFdxdVpVectorRawPtr;
16748  double * dQdxdVp = mi.extData.dQdxdVpVectorRawPtr;
16749 
16750  // load F:
16751 
16752  double Coef_f_body=0.0;
16753  double Coef_f_extBody=0.0;
16754  double Coef_f_gate=0.0;
16755  double Coef_f_gatePrime=0.0;
16756  double Coef_f_gateMid=0.0;
16757  double Coef_f_drain=0.0;
16758  double Coef_f_drainPrime=0.0;
16759  double Coef_f_source=0.0;
16760  double Coef_f_sourcePrime=0.0;
16761  double Coef_f_substrate=0.0;
16762  double Coef_f_temp=0.0;
16763 
16764  mi.Gmin = getDeviceOptions().gmin * 1e-6;
16765  mi.geltd = mi.grgeltd;
16766 
16767  // I have elected to add in the Gmin-based Jdxp terms right here.
16768  // In adding them, I've made use of the fact that whether we need voltage
16769  // limiting or not, we have to add Gmin*somedrop. If we need voltage
16770  // limiting, we have to add in Gmin*(somedrop-somedrop_orig) with the
16771  // opposite sign. I've simplified that down to the single term that
16772  // remains, which is correct even if voltage limiting is not needed
16773  // --- TVR
16774 
16775  double iGmin_bs = mi.model_.dtype*(mi.Gmin*mi.vbs_orig);
16776  double iGmin_gd = mi.model_.dtype*(mi.Gmin*mi.vgd_orig);
16777 
16778  if (mi.soiMod != 2)
16779  {
16780  Coef_f_body -= (mi.model_.dtype*(mi.ceqbody)
16781  + iGmin_bs)* mi.numberParallel;
16782  }
16783 
16784  Coef_f_gatePrime -= (mi.model_.dtype*(mi.ceqgate - mi.ceqgcrg)
16785  + mi.Igtoteq + iGmin_gd)* mi.numberParallel;
16786 
16787  Coef_f_drainPrime += (mi.model_.dtype*(mi.ceqbd) - mi.cdreq + mi.Idtoteq
16788  + mi.Idrain + iGmin_gd) * mi.numberParallel;
16789 
16790  Coef_f_sourcePrime += (mi.cdreq
16791  + mi.model_.dtype*(mi.ceqbs)
16792  + mi.Istoteq + mi.Isource + iGmin_bs) * mi.numberParallel;
16793 
16794  if (mi.rgateMod == 2)
16795  {
16796  Coef_f_gate -= mi.model_.dtype*mi.ceqgcrg * mi.numberParallel;
16797  }
16798  else if (mi.rgateMod == 3)
16799  {
16800  Coef_f_gateMid -= mi.model_.dtype*(mi.ceqgcrg) * mi.numberParallel;
16801  }
16802 
16803  if (mi.bodyMod == 1)
16804  {
16805  Coef_f_extBody += mi.model_.dtype*mi.ceqbodcon * mi.numberParallel;
16806  }
16807 
16808  if (mi.selfheat)
16809  {
16810  Coef_f_temp -= (mi.ceqth + mi.Ith) * mi.numberParallel;
16811  }
16812 
16813  ////////////////////////////////////////////////////////////////////////
16814  // This next section deals with linear resistor currents (mostly) that
16815  // would not be part of the spice3f5 RHS load.
16816  //
16817  // These include the source and drain load resistors, the body tie
16818  // resistor and the various options for gate resistors.
16819  //
16820  // Isource and Idrain correspond to the linear load resistors.
16821 
16822  if (mi.sNodePrime == 1) Coef_f_source -= mi.Isource * mi.numberParallel;
16823  if (mi.dNodePrime == 1) Coef_f_drain -= mi.Idrain * mi.numberParallel;
16824 
16825  // Note: extra body nodes were already handled, above.
16826 
16827  // Handle extra gate nodes, if they exist.
16828  // mi.rgateMod==0 no gate resistor.
16829  // mi.rgateMod==1 linear gate resistor
16830  // mi.rgateMod==2 nonlinear gate resistor
16831  // mi.rgateMod==3 2 gate resistors, in series.
16832  //
16833  if (mi.rgateMod > 0)
16834  {
16835  Coef_f_gate -= mi.Igate * mi.numberParallel;
16836  if (mi.rgateMod == 3)
16837  {
16838  Coef_f_gateMid -= (mi.IgateMid - mi.Igate) * mi.numberParallel;
16839  Coef_f_gatePrime += mi.IgateMid * mi.numberParallel;
16840  }
16841  else
16842  {
16843  Coef_f_gatePrime += mi.Igate * mi.numberParallel;
16844  }
16845  }
16846 
16847  // Now place all the calculated values in the RHS vector.
16848  if(mi.li_Body != -1)
16849  {
16850  fVec[mi.li_Body ] -= Coef_f_body;
16851  }
16852  if(mi.li_ExtBody != -1)
16853  {
16854  fVec[mi.li_ExtBody ] -= Coef_f_extBody;
16855  }
16856  fVec[mi.li_Gate ] -= Coef_f_gate;
16857  fVec[mi.li_GatePrime ] -= Coef_f_gatePrime;
16858  fVec[mi.li_GateMid ] -= Coef_f_gateMid;
16859  fVec[mi.li_Drain ] -= Coef_f_drain;
16860  fVec[mi.li_DrainPrime ] -= Coef_f_drainPrime;
16861  fVec[mi.li_Source ] -= Coef_f_source;
16862  fVec[mi.li_SourcePrime] -= Coef_f_sourcePrime;
16863  fVec[mi.li_Substrate ] -= Coef_f_substrate;
16864 
16865  if(mi.li_Temperature != -1)
16866  {
16867  fVec[mi.li_Temperature] -= Coef_f_temp;
16868  }
16869 
16870  if( mi.loadLeadCurrent )
16871  {
16872 
16873  if( mi.dNodePrime != 1 )
16874  {
16875  // drain prime is the same as drain so add in its contribution
16876  storeLeadF[mi.li_store_dev_id] = -Coef_f_drain - Coef_f_drainPrime;
16877  }
16878  else
16879  {
16880  storeLeadF[mi.li_store_dev_id] = -Coef_f_drain;
16881  }
16882  if( mi.gNodePrime != 1 )
16883  {
16884  // gate prime is the same as gate so add in its contribution
16885  storeLeadF[mi.li_store_dev_ig] = -Coef_f_gate - Coef_f_gatePrime;
16886  }
16887  else
16888  {
16889  storeLeadF[mi.li_store_dev_ig] = -Coef_f_gate;
16890  }
16891  if( mi.sNodePrime != 1 )
16892  {
16893  // source prime is the same as source so add in its contribution
16894  storeLeadF[mi.li_store_dev_is] = -Coef_f_source - Coef_f_sourcePrime;
16895  }
16896  else
16897  {
16898  storeLeadF[mi.li_store_dev_is] = -Coef_f_source;
16899  }
16900 
16901  storeLeadF[mi.li_store_dev_ie] = -Coef_f_substrate;
16902  if(mi.li_Body != -1)
16903  {
16904  storeLeadF[mi.li_store_dev_ib] = -Coef_f_body;
16905  }
16906  else
16907  {
16908  storeLeadF[mi.li_store_dev_ib] = 0.0;
16909  }
16910  }
16911 
16912  if( getSolverState().dcopFlag && mi.icVDSGiven )
16913  {
16914  if ( mi.icVDSGiven )
16915  {
16916  double coef = (mi.extData.nextSolVectorRawPtr)[mi.li_Ids];
16917  fVec[mi.li_Drain] += coef;
16918  fVec[mi.li_Source] += -coef;
16919  if( mi.loadLeadCurrent )
16920  {
16921  storeLeadF[mi.li_store_dev_id] = coef;
16922  storeLeadF[mi.li_store_dev_is] = -coef;
16923  }
16924  double cVs = (mi.extData.nextSolVectorRawPtr)[mi.li_Source];
16925  double cVd = (mi.extData.nextSolVectorRawPtr)[mi.li_Drain];
16926  fVec[mi.li_Ids] += (cVd - cVs - mi.icVDS);
16927  }
16928  if ( mi.icVGSGiven )
16929  {
16930  double coef = (mi.extData.nextSolVectorRawPtr)[mi.li_Igs];
16931  fVec[mi.li_Gate] += coef;
16932  fVec[mi.li_Source] += -coef;
16933  if( mi.loadLeadCurrent )
16934  {
16935  storeLeadF[mi.li_store_dev_ig] = coef;
16936  storeLeadF[mi.li_store_dev_is] = -coef;
16937  }
16938  double cVs = (mi.extData.nextSolVectorRawPtr)[mi.li_Source];
16939  double cVg = (mi.extData.nextSolVectorRawPtr)[mi.li_Gate];
16940  fVec[mi.li_Igs] += (cVg - cVs - mi.icVGS);
16941  }
16942  if ( mi.icVBSGiven )
16943  {
16944  double coef = (mi.extData.nextSolVectorRawPtr)[mi.li_Ibs];
16945  fVec[mi.li_Body] += coef;
16946  fVec[mi.li_Source] += -coef;
16947  if( mi.loadLeadCurrent )
16948  {
16949  storeLeadF[mi.li_store_dev_ib] = coef;
16950  storeLeadF[mi.li_store_dev_is] = -coef;
16951  }
16952  double cVs = (mi.extData.nextSolVectorRawPtr)[mi.li_Source];
16953  double cVb = (mi.extData.nextSolVectorRawPtr)[mi.li_Body];
16954  fVec[mi.li_Ibs] += (cVb - cVs - mi.icVBS);
16955  }
16956  if ( mi.icVESGiven )
16957  {
16958  double coef = (mi.extData.nextSolVectorRawPtr)[mi.li_Ies];
16959  fVec[mi.li_Substrate] += coef;
16960  fVec[mi.li_Source] += -coef;
16961  if( mi.loadLeadCurrent )
16962  {
16963  storeLeadF[mi.li_store_dev_ie] = coef;
16964  storeLeadF[mi.li_store_dev_is] = -coef;
16965  }
16966  double cVs = (mi.extData.nextSolVectorRawPtr)[mi.li_Source];
16967  double cVe = (mi.extData.nextSolVectorRawPtr)[mi.li_Substrate];
16968  fVec[mi.li_Ies] += (cVe - cVs - mi.icVES);
16969  }
16970  if ( mi.icVPSGiven )
16971  {
16972  double coef = (mi.extData.nextSolVectorRawPtr)[mi.li_Ips];
16973  fVec[mi.li_ExtBody] += coef;
16974  fVec[mi.li_Source] += -coef;
16975  if( mi.loadLeadCurrent )
16976  {
16977  storeLeadF[mi.li_store_dev_ib] = coef;
16978  storeLeadF[mi.li_store_dev_is] = -coef;
16979  }
16980  double cVs = (mi.extData.nextSolVectorRawPtr)[mi.li_Source];
16981  double cVp = (mi.extData.nextSolVectorRawPtr)[mi.li_ExtBody];
16982  fVec[mi.li_Ies] += (cVp - cVs - mi.icVPS);
16983  }
16984  }
16985 
16986  // Set up the Jdxp vector:
16987  double Coef_f_body_Jdxp = 0.0;
16988  double Coef_f_extBody_Jdxp = 0.0;
16989  double Coef_f_gate_Jdxp = 0.0;
16990  double Coef_f_gatePrime_Jdxp = 0.0;
16991  double Coef_f_gateMid_Jdxp = 0.0;
16992  double Coef_f_drain_Jdxp = 0.0;
16993  double Coef_f_drainPrime_Jdxp = 0.0;
16994  double Coef_f_source_Jdxp = 0.0;
16995  double Coef_f_sourcePrime_Jdxp = 0.0;
16996  double Coef_f_substrate_Jdxp = 0.0;
16997  double Coef_f_temp_Jdxp = 0.0;
16998 
16999  double iGmin_bs_Jdxp = mi.model_.dtype*mi.Gmin*(mi.vbs-mi.vbs_orig);
17000  double iGmin_gd_Jdxp = mi.model_.dtype*mi.Gmin*(mi.vgd-mi.vgd_orig);
17001 
17003  {
17004  if (mi.soiMod != 2)
17005  {
17006  Coef_f_body_Jdxp -=
17007  (mi.model_.dtype*(mi.ceqbody_Jdxp )
17008  - iGmin_bs_Jdxp)* mi.numberParallel;
17009  }
17010 
17011  Coef_f_gatePrime_Jdxp -=
17012  (mi.model_.dtype*(mi.ceqgate_Jdxp - mi.ceqgcrg_Jdxp)
17013  + mi.Igtoteq_Jdxp - iGmin_gd_Jdxp)* mi.numberParallel;
17014 
17015  Coef_f_drainPrime_Jdxp +=
17016  (mi.model_.dtype*(mi.ceqbd_Jdxp)
17017  - mi.cdreq_Jdxp + mi.Idtoteq_Jdxp
17018  + mi.Idrain_Jdxp - iGmin_gd_Jdxp) * mi.numberParallel;
17019 
17020  Coef_f_sourcePrime_Jdxp += (mi.cdreq_Jdxp
17021  + mi.model_.dtype*(mi.ceqbs_Jdxp)
17022  + mi.Istoteq_Jdxp
17023  + mi.Isource_Jdxp - iGmin_bs_Jdxp
17024  ) * mi.numberParallel;
17025 
17026  Coef_f_substrate_Jdxp -= mi.model_.dtype*mi.ceqqe_Jdxp * mi.numberParallel;
17027 
17028  if (mi.rgateMod == 2)
17029  {
17030  Coef_f_gate_Jdxp -=
17032  }
17033  else if (mi.rgateMod == 3)
17034  {
17035  Coef_f_gateMid_Jdxp -=
17036  mi.model_.dtype*(mi.ceqgcrg_Jdxp) * mi.numberParallel;
17037  }
17038 
17039  if (mi.bodyMod == 1)
17040  {
17041  Coef_f_extBody_Jdxp += mi.model_.dtype*mi.ceqbodcon_Jdxp * mi.numberParallel;
17042  }
17043 
17044  if (mi.selfheat)
17045  {
17046  Coef_f_temp_Jdxp -= ( mi.ceqth_Jdxp ) * mi.numberParallel;
17047  }
17048 
17049  if (mi.sNodePrime == 1) Coef_f_source_Jdxp -= mi.Isource_Jdxp * mi.numberParallel;
17050  if (mi.dNodePrime == 1) Coef_f_drain_Jdxp -= mi.Idrain_Jdxp * mi.numberParallel;
17051 
17052  if (mi.rgateMod > 0)
17053  {
17054  Coef_f_gate_Jdxp -= mi.Igate_Jdxp * mi.numberParallel;
17055  if (mi.rgateMod == 3)
17056  {
17057  Coef_f_gateMid_Jdxp -= (mi.IgateMid_Jdxp - mi.Igate_Jdxp) * mi.numberParallel;
17058  Coef_f_gatePrime_Jdxp += mi.IgateMid_Jdxp * mi.numberParallel;
17059  }
17060  else
17061  {
17062  Coef_f_gatePrime_Jdxp += mi.Igate_Jdxp * mi.numberParallel;
17063  }
17064  }
17065 
17066  if(mi.li_Body != -1)
17067  {
17068  dFdxdVp[mi.li_Body ] += Coef_f_body_Jdxp;
17069  }
17070  if(mi.li_ExtBody != -1)
17071  {
17072  dFdxdVp[mi.li_ExtBody ] += Coef_f_extBody_Jdxp;
17073  }
17074  dFdxdVp[mi.li_Gate ] += Coef_f_gate_Jdxp;
17075  dFdxdVp[mi.li_GatePrime ] += Coef_f_gatePrime_Jdxp;
17076  dFdxdVp[mi.li_GateMid ] += Coef_f_gateMid_Jdxp;
17077  dFdxdVp[mi.li_Drain ] += Coef_f_drain_Jdxp;
17078  dFdxdVp[mi.li_DrainPrime ] += Coef_f_drainPrime_Jdxp;
17079  dFdxdVp[mi.li_Source ] += Coef_f_source_Jdxp;
17080  dFdxdVp[mi.li_SourcePrime] += Coef_f_sourcePrime_Jdxp;
17081  dFdxdVp[mi.li_Substrate ] += Coef_f_substrate_Jdxp;
17082  if(mi.li_Temperature != -1)
17083  {
17084  dFdxdVp[mi.li_Temperature] += Coef_f_temp_Jdxp;
17085  }
17086  }
17087 
17088  // load Q:
17089 
17090  mi.auxChargeCalculations ();
17091 
17092  double Coef_q_body=0.0;
17093  double Coef_q_extBody=0.0;
17094  double Coef_q_gate=0.0;
17095  double Coef_q_gatePrime=0.0;
17096  double Coef_q_gateMid=0.0;
17097  double Coef_q_drainPrime=0.0;
17098  double Coef_q_sourcePrime=0.0;
17099  double Coef_q_substrate=0.0;
17100  double Coef_q_temp=0.0;
17101 
17102  if (mi.soiMod != 2)
17103  {
17104  Coef_q_body -= (mi.model_.dtype*(mi.Qeqqb))* mi.numberParallel;
17105  }
17106 
17107  Coef_q_gatePrime -= (mi.model_.dtype*(mi.Qeqqg))* mi.numberParallel;
17108 
17109  Coef_q_drainPrime += (mi.model_.dtype*(-mi.Qeqqd)) * mi.numberParallel;
17110 
17111  Coef_q_sourcePrime += ( + mi.model_.dtype*(+ mi.Qeqqg + mi.Qeqqb
17112  + mi.Qeqqd + mi.Qeqqe + mi.Qeqqgmid)) * mi.numberParallel;
17113 
17114  Coef_q_substrate -= mi.model_.dtype*mi.Qeqqe * mi.numberParallel;
17115 
17116  if (mi.rgateMod == 3)
17117  {
17118  Coef_q_gateMid -= mi.model_.dtype*(mi.Qeqqgmid) * mi.numberParallel;
17119  }
17120 
17121  if (mi.selfheat)
17122  {
17123  Coef_q_temp -= (mi.Qeqqth) * mi.numberParallel;
17124  }
17125 
17126  ////////////////////////////////////////////////////////////////////////
17127  // Now place all the calculated values in the Q vector.
17128 
17129  if(mi.li_Body != -1)
17130  {
17131  qVec[mi.li_Body ] -= Coef_q_body;
17132  }
17133  if(mi.li_ExtBody != -1)
17134  {
17135  qVec[mi.li_ExtBody ] -= Coef_q_extBody;
17136  }
17137  qVec[mi.li_Gate ] -= Coef_q_gate;
17138  qVec[mi.li_GatePrime ] -= Coef_q_gatePrime;
17139  qVec[mi.li_GateMid ] -= Coef_q_gateMid;
17140  qVec[mi.li_DrainPrime ] -= Coef_q_drainPrime;
17141  qVec[mi.li_SourcePrime] -= Coef_q_sourcePrime;
17142  qVec[mi.li_Substrate ] -= Coef_q_substrate;
17143  if(mi.li_Temperature != -1)
17144  {
17145  qVec[mi.li_Temperature] -= Coef_q_temp;
17146  }
17147 
17148  if( mi.loadLeadCurrent )
17149  {
17150 
17151  if( mi.dNodePrime != 1 )
17152  {
17153  // drain prime is the same as drain so add in its contribution
17154  storeLeadQ[mi.li_store_dev_id] = -Coef_q_drainPrime;
17155  }
17156  else
17157  {
17158  storeLeadQ[mi.li_store_dev_id] = 0;
17159  }
17160  if( mi.gNodePrime != 1 )
17161  {
17162  // gate prime is the same as gate so add in its contribution
17163  storeLeadQ[mi.li_store_dev_ig] = -Coef_q_gate - Coef_q_gatePrime;
17164  }
17165  else
17166  {
17167  storeLeadQ[mi.li_store_dev_ig] = -Coef_q_gate;
17168  }
17169  if( mi.sNodePrime != 1 )
17170  {
17171  // source prime is the same as source so add in its contribution
17172  storeLeadQ[mi.li_store_dev_is] = -Coef_q_sourcePrime;
17173  }
17174  else
17175  {
17176  storeLeadQ[mi.li_store_dev_is] = 0.0;
17177  }
17178  storeLeadQ[mi.li_store_dev_ie] = -Coef_q_substrate;
17179  if(mi.li_Body != -1)
17180  {
17181  storeLeadQ[mi.li_store_dev_ib] = -Coef_q_body;
17182  }
17183  }
17184 
17185  ////////////////////////////////////////////////////////////////////////
17186  // Voltage limiting section:
17187  double Coef_q_body_Jdxp = 0.0;
17188  double Coef_q_extBody_Jdxp = 0.0;
17189  double Coef_q_gate_Jdxp = 0.0;
17190  double Coef_q_gatePrime_Jdxp = 0.0;
17191  double Coef_q_gateMid_Jdxp = 0.0;
17192  double Coef_q_drainPrime_Jdxp = 0.0;
17193  double Coef_q_sourcePrime_Jdxp = 0.0;
17194  double Coef_q_substrate_Jdxp = 0.0;
17195  double Coef_q_temp_Jdxp = 0.0;
17196 
17198  {
17199  if (mi.soiMod != 2)
17200  {
17201  Coef_q_body_Jdxp -=
17202  (mi.model_.dtype*(mi.Qeqqb_Jdxp))* mi.numberParallel;
17203  }
17204 
17205  Coef_q_gatePrime_Jdxp -=
17206  (mi.model_.dtype*(mi.Qeqqg_Jdxp))* mi.numberParallel;
17207 
17208  Coef_q_drainPrime_Jdxp +=
17209  (mi.model_.dtype*(- mi.Qeqqd_Jdxp)) * mi.numberParallel;
17210 
17211  Coef_q_sourcePrime_Jdxp += (+mi.model_.dtype*(mi.Qeqqg_Jdxp + mi.Qeqqb_Jdxp
17212  + mi.Qeqqd_Jdxp + mi.Qeqqe_Jdxp + mi.Qeqqgmid_Jdxp)
17213  ) * mi.numberParallel;
17214 
17215  Coef_q_substrate_Jdxp -= mi.model_.dtype*mi.Qeqqe_Jdxp * mi.numberParallel;
17216 
17217  if (mi.rgateMod == 3)
17218  {
17219  Coef_q_gateMid_Jdxp -=
17221  }
17222 
17223  if (mi.selfheat)
17224  {
17225  Coef_q_temp_Jdxp -= (mi.Qeqqth_Jdxp ) * mi.numberParallel;
17226  }
17227 
17228  if(mi.li_Body != -1)
17229  {
17230  dQdxdVp[mi.li_Body ] += Coef_q_body_Jdxp;
17231  }
17232  if(mi.li_ExtBody != -1)
17233  {
17234  dQdxdVp[mi.li_ExtBody ] += Coef_q_extBody_Jdxp;
17235  }
17236  dQdxdVp[mi.li_Gate ] += Coef_q_gate_Jdxp;
17237  dQdxdVp[mi.li_GatePrime ] += Coef_q_gatePrime_Jdxp;
17238  dQdxdVp[mi.li_GateMid ] += Coef_q_gateMid_Jdxp;
17239  dQdxdVp[mi.li_DrainPrime ] += Coef_q_drainPrime_Jdxp;
17240  dQdxdVp[mi.li_SourcePrime] += Coef_q_sourcePrime_Jdxp;
17241  dQdxdVp[mi.li_Substrate ] += Coef_q_substrate_Jdxp;
17242  if(mi.li_Temperature != -1)
17243  {
17244  dQdxdVp[mi.li_Temperature] += Coef_q_temp_Jdxp;
17245  }
17246  }
17247 
17248  }
17249 
17250  return true;
17251 }
17252 
17253 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
17254 //-----------------------------------------------------------------------------
17255 // Function : Master::loadDAEMatrices
17256 // Purpose :
17257 // Special Notes :
17258 // Scope : public
17259 // Creator : Eric Keiter, SNL
17260 // Creation Date : 01/06/09
17261 //-----------------------------------------------------------------------------
17262 bool Master::loadDAEMatrices (N_LAS_Matrix & dFdx, N_LAS_Matrix & dQdx)
17263 {
17264 #ifdef _OMP
17265 #pragma omp parallel for
17266 #endif
17267  for (InstanceVector::const_iterator it = getInstanceBegin(); it != getInstanceEnd(); ++it)
17268  {
17269  Instance & mi = *(*it);
17270 
17271  // F-matrix:
17272  if (mi.rgateMod == 1)
17273  {
17274 
17276  += mi.geltd*mi.numberParallel;
17277 
17279  -= mi.geltd*mi.numberParallel;
17280 
17282  -= mi.geltd*mi.numberParallel;
17283  // It seems that this should be here, but it shouldn't.
17284  // The mi.geltd term is added into the G'-G' element later down in this
17285  // routine
17286  //
17287  // *mi.f_GatePrime][mi.AGatePrimeEquGatePrimeNodePtr
17288  // += mi.geltd*mi.numberParallel;
17289  }
17290  else if (mi.rgateMod == 2)
17291  {
17292 
17294  += mi.gcrg_jac*mi.numberParallel;
17295 
17297  += mi.gcrgg_jac*mi.numberParallel;
17298 
17300  += mi.gcrgd_jac*mi.numberParallel;
17301 
17303  += mi.gcrgs_jac*mi.numberParallel;
17304 
17306  -= mi.gcrg_jac*mi.numberParallel;
17307  if (mi.soiMod != 2)
17308  {
17310  += mi.gcrgb_jac*mi.numberParallel;
17311  }
17312  }
17313  else if (mi.rgateMod == 3)
17314  {
17315 
17317  += mi.geltd*mi.numberParallel;
17318 
17320  += -mi.geltd*mi.numberParallel;
17321 
17323  += -mi.geltd*mi.numberParallel;
17324 
17326  += (mi.geltd + mi.gcrg_jac)*mi.numberParallel;
17327 
17329  += (mi.gcrgd_jac)*mi.numberParallel;
17330 
17332  += mi.gcrgg_jac*mi.numberParallel;
17333 
17335  += (mi.gcrgs_jac)*mi.numberParallel;
17336 
17337  if (mi.soiMod != 2)
17338  {
17340  += mi.gcrgb_jac*mi.numberParallel;
17341  }
17342 
17343 
17345  -= mi.gcrg_jac*mi.numberParallel;
17346  }
17347  if (mi.soiMod != 0)
17348  {
17349 
17351  += (mi.Gme + mi.gddpe)*mi.numberParallel;
17352 
17354  += (mi.gsspe - mi.Gme)*mi.numberParallel;
17355  if (mi.soiMod != 2)
17356  {
17358  += mi.gige_jac*mi.numberParallel;
17360  -= mi.gige_jac*mi.numberParallel;
17361  }
17362  }
17363 
17364  if (mi.soiMod != 2)
17365  {
17366  if (mi.rgateMod == 0 || mi.rgateMod == 1)
17367  {
17369  -= (-mi.gigb_jac - mi.gIgtotb)*mi.numberParallel;
17370  }
17371  else
17372  {
17374  += (mi.gigb_jac +mi.gIgtotb - mi.gcrgb_jac)*mi.numberParallel;
17375  }
17376 
17378  -= ((-mi.gddpb - mi.Gmbs) + mi.gIdtotb)*mi.numberParallel;
17379 
17381  -= ((-mi.gsspb + mi.Gmbs) + mi.Gmin + mi.gIstotb)*mi.numberParallel;
17382 
17384  += (mi.gbbe)*mi.numberParallel;
17385 
17387  += (-mi.gigg + mi.gbbg)*mi.numberParallel;
17388 
17390  += (-mi.gigd_jac + mi.gbbdp)*mi.numberParallel;
17391 
17393  += (mi.gbbsp - mi.Gmin - mi.gigs)*mi.numberParallel;
17394 
17396  += (-mi.gigb_jac + mi.gbbb + mi.Gmin)*mi.numberParallel;
17397  }
17398  if (mi.rgateMod == 0)
17399  {
17400 
17402  += (mi.gigg + mi.Gmin + mi.gIgtotg)*mi.numberParallel;
17403 
17405  += (mi.gigd_jac - mi.Gmin + mi.gIgtotd)*mi.numberParallel;
17406 
17408  += (mi.gigs + mi.gIgtots)*mi.numberParallel;
17409  }
17410  else if (mi.rgateMod == 1)
17411  {
17412 
17414  += (mi.gigg_jac + mi.Gmin + mi.gIgtotg + mi.geltd)*mi.numberParallel;
17415 
17417  += (mi.gigd - mi.Gmin + mi.gIgtotd)*mi.numberParallel;
17418 
17420  += (mi.gigs_jac + mi.gIgtots)*mi.numberParallel;
17421  }
17422  else
17423  {
17424 
17426  += (mi.gigg + mi.Gmin + mi.gIgtotg - mi.gcrgg_jac)*mi.numberParallel;
17427 
17429  += (mi.gigd_jac - mi.Gmin + mi.gIgtotd - mi.gcrgd_jac)*mi.numberParallel;
17430 
17432  += (mi.gigs + mi.gIgtots - mi.gcrgs_jac)*mi.numberParallel;
17433  }
17434 
17436  += ((mi.Gm) + mi.gddpg - mi.Gmin - mi.gIdtotg)*mi.numberParallel;
17437 
17439  += ((mi.drainConductance + mi.gds + mi.gddpdp + mi.RevSum) + mi.Gmin - mi.gIdtotd)*mi.numberParallel;
17440 
17442  -= ((-mi.gddpsp + mi.gds + mi.FwdSum) + mi.gIdtots)*mi.numberParallel;
17443 
17445  += -mi.drainConductance*mi.numberParallel;
17446 
17448  += (-mi.Gm + mi.gsspg - mi.gIstotg)*mi.numberParallel;
17449 
17451  -= (mi.gds - mi.gsspdp + mi.RevSum + mi.gIstotd)*mi.numberParallel;
17452 
17454  += ((mi.sourceConductance + mi.gds + mi.gsspsp + mi.FwdSum) + mi.Gmin - mi.gIstots)*mi.numberParallel;
17455 
17458 
17461 
17464 
17467 
17470  if (mi.bodyMod == 1)
17471  {
17472 
17474  -= mi.gppp*mi.numberParallel;
17475 
17477  += mi.gppb*mi.numberParallel;
17478 
17480  += mi.gppp*mi.numberParallel;
17481  }
17482  if (mi.selfheat)
17483  {
17484 
17486  += (mi.GmT + mi.gddpT)*mi.numberParallel;
17487 
17489  += (-mi.GmT + mi.gsspT)*mi.numberParallel;
17490 
17491 
17493  += (mi.gigT_jac)*mi.numberParallel;
17494 
17496  += (mi.gTtt + 1/mi.paramPtr->rth)*mi.numberParallel;
17497 
17499  += mi.gTtg*mi.numberParallel;
17500 
17502  += mi.gTtdp*mi.numberParallel;
17503 
17505  += mi.gTtsp*mi.numberParallel;
17506  if (mi.soiMod != 0)
17507  {
17509  += mi.gTte*mi.numberParallel;
17510  }
17511  if (mi.bNode > 0)
17512  {
17514  += (mi.gbbT - mi.gigT_jac)*mi.numberParallel;
17516  += mi.gTtb*mi.numberParallel;
17517  }
17518  }
17519  if( mi.icVDSGiven )
17520  {
17521  if( getSolverState().dcopFlag )
17522  {
17523  *mi.f_DrainEquIdsPtr += 1.0;
17524  *mi.f_SourceEquIdsPtr -= 1.0;
17525  *mi.f_icVDSEquVdPtr += 1.0;
17526  *mi.f_icVDSEquVsPtr -= 1.0;
17527  }
17528  else
17529  {
17530  *mi.f_icVDSEquIdsPtr += 1.0;
17531  }
17532  }
17533 
17534  if( mi.icVGSGiven )
17535  {
17536  if( getSolverState().dcopFlag )
17537  {
17538  *mi.f_GateEquIgsPtr += 1.0;
17539  *mi.f_SourceEquIgsPtr -= 1.0;
17540  *mi.f_icVGSEquVgPtr += 1.0;
17541  *mi.f_icVGSEquVsPtr -= 1.0;
17542  }
17543  else
17544  {
17545  *mi.f_icVGSEquIgsPtr += 1.0;
17546  }
17547  }
17548 
17549  if( mi.icVBSGiven )
17550  {
17551  if( getSolverState().dcopFlag )
17552  {
17553  *mi.f_BodyEquIbsPtr += 1.0;
17554  *mi.f_SourceEquIbsPtr -= 1.0;
17555  *mi.f_icVBSEquVbPtr += 1.0;
17556  *mi.f_icVBSEquVsPtr -= 1.0;
17557  }
17558  else
17559  {
17560  *mi.f_icVBSEquIbsPtr += 1.0;
17561  }
17562  }
17563 
17564  if( mi.icVESGiven )
17565  {
17566  if( getSolverState().dcopFlag )
17567  {
17568  *mi.f_SubstrateEquIesPtr += 1.0;
17569  *mi.f_SourceEquIesPtr -= 1.0;
17570  *mi.f_icVESEquVePtr += 1.0;
17571  *mi.f_icVESEquVsPtr -= 1.0;
17572  }
17573  else
17574  {
17575  *mi.f_icVESEquIesPtr += 1.0;
17576  }
17577  }
17578 
17579  if( mi.icVPSGiven )
17580  {
17581  if( getSolverState().dcopFlag )
17582  {
17583  *mi.f_ExtBodyEquIpsPtr += 1.0;
17584  *mi.f_SourceEquIpsPtr -= 1.0;
17585  *mi.f_icVPSEquVpPtr += 1.0;
17586  *mi.f_icVPSEquVsPtr -= 1.0;
17587  }
17588  else
17589  {
17590  *mi.f_icVPSEquIpsPtr += 1.0;
17591  }
17592  }
17593 
17594 
17595  // Q-matrix:
17596 
17597  if (mi.rgateMod == 3)
17598  {
17599 
17601  += (mi.CAPcgmgmb)*mi.numberParallel;
17602 
17604  += (mi.CAPcgmdb)*mi.numberParallel;
17605 
17606 
17608  += (mi.CAPcgmsb)*mi.numberParallel;
17609 
17611  += mi.CAPcgmeb*mi.numberParallel;
17612 
17613 
17615  += mi.CAPcdgmb*mi.numberParallel;
17616 
17617 
17619  += mi.CAPcsgmb*mi.numberParallel;
17620 
17622  += mi.CAPcegmb*mi.numberParallel;
17623  }
17624 
17625 
17627  += mi.CAPcedb*mi.numberParallel;
17628 
17629 
17631  += mi.CAPcdeb*mi.numberParallel;
17632 
17634  += mi.CAPcseb*mi.numberParallel;
17635 
17637  += mi.CAPcegb*mi.numberParallel;
17638 
17640  += mi.CAPcgeb*mi.numberParallel;
17641  if (mi.soiMod != 2)
17642  {
17643 
17645  -= (mi.CAPcegb + mi.CAPcedb + mi.CAPcesb + mi.CAPceeb + mi.CAPcegmb)*mi.numberParallel;
17646  if (mi.rgateMod == 0 || mi.rgateMod == 1)
17647  {
17649  -= (+mi.CAPcggb + mi.CAPcgdb + mi.CAPcgsb + mi.CAPcgeb)*mi.numberParallel;
17650  }
17651  else
17652  {
17654  += (+ mi.CAPcgbb)*mi.numberParallel;
17655  }
17656 
17658  -= ((+ mi.CAPcdgb + mi.CAPcddb + mi.CAPcdeb + mi.CAPcdsb) + mi.CAPcdgmb)*mi.numberParallel;
17659 
17661  -= ((+ mi.CAPcsgb + mi.CAPcsdb + mi.CAPcseb + mi.CAPcssb) + mi.CAPcsgmb)*mi.numberParallel;
17662 
17664  += (+ mi.CAPcbeb)*mi.numberParallel;
17665 
17667  += (+ mi.CAPcbgb)*mi.numberParallel;
17668 
17670  += (+ mi.CAPcbdb)*mi.numberParallel;
17671 
17673  += (mi.CAPcbsb)*mi.numberParallel;
17674 
17676  += (-mi.CAPcbgb - mi.CAPcbdb - mi.CAPcbsb - mi.CAPcbeb)*mi.numberParallel;
17677  }
17678 
17680  += mi.CAPceeb*mi.numberParallel;
17681  if (mi.rgateMod == 0)
17682  {
17683 
17685  += (mi.CAPcggb)*mi.numberParallel;
17686 
17688  += (mi.CAPcgdb)*mi.numberParallel;
17689 
17691  += (mi.CAPcgsb)*mi.numberParallel;
17692  }
17693  else if (mi.rgateMod == 1)
17694  {
17695 
17697  += (mi.CAPcggb)*mi.numberParallel;
17698 
17700  += (mi.CAPcgdb)*mi.numberParallel;
17701 
17703  += (mi.CAPcgsb)*mi.numberParallel;
17704  }
17705  else
17706  {
17707 
17709  += (mi.CAPcggb)*mi.numberParallel;
17710 
17712  += (mi.CAPcgdb)*mi.numberParallel;
17713 
17715  += (mi.CAPcgsb)*mi.numberParallel;
17716  }
17717 
17719  += ((mi.CAPcdgb))*mi.numberParallel;
17720 
17722  += ((mi.CAPcddb) )*mi.numberParallel;
17723 
17725  -= ((-mi.CAPcdsb) )*mi.numberParallel;
17726 
17727 
17729  += (mi.CAPcsgb)*mi.numberParallel;
17730 
17732  -= (-mi.CAPcsdb )*mi.numberParallel;
17733 
17735  += ((mi.CAPcssb) )*mi.numberParallel;
17736 
17737  if (mi.selfheat)
17738  {
17739 
17741  += (mi.CAPcdT)*mi.numberParallel;
17742 
17744  += (mi.CAPcsT)*mi.numberParallel;
17745 
17747  += mi.CAPceT*mi.numberParallel;
17748 
17750  += (mi.CAPcgT)*mi.numberParallel;
17751 
17753  += (mi.CAPcTt)*mi.numberParallel;
17754 
17755  if (mi.bNode > 0)
17756  {
17758  += (mi.CAPcbT)*mi.numberParallel;
17759  }
17760  }
17761  }
17762  return true;
17763 }
17764 #else
17765 //-----------------------------------------------------------------------------
17766 // Function : Master::loadDAEMatrices
17767 // Purpose :
17768 // Special Notes :
17769 // Scope : public
17770 // Creator : Eric Keiter, SNL
17771 // Creation Date : 01/06/09
17772 //-----------------------------------------------------------------------------
17773 bool Master::loadDAEMatrices (N_LAS_Matrix & dFdx, N_LAS_Matrix & dQdx)
17774 {
17775  int sizeInstances = instanceContainer_.size();
17776 
17777 #ifdef _OMP
17778 #pragma omp parallel for
17779 #endif
17780  for (int i=0; i<sizeInstances; ++i)
17781  {
17782  Instance & mi = *(instanceContainer_.at(i));
17783 
17784  // F-matrix:
17785  if (mi.rgateMod == 1)
17786  {
17787 
17788  dFdx[mi.li_Gate][mi.AGateEquGateNodeOffset]
17789  += mi.geltd*mi.numberParallel;
17790 
17792  -= mi.geltd*mi.numberParallel;
17793 
17795  -= mi.geltd*mi.numberParallel;
17796  // It seems that this should be here, but it shouldn't.
17797  // The mi.geltd term is added into the G'-G' element later down in this
17798  // routine
17799  //
17800  // dFdx[mi.li_GatePrime][mi.AGatePrimeEquGatePrimeNodeOffset]
17801  // += mi.geltd*mi.numberParallel;
17802  }
17803  else if (mi.rgateMod == 2)
17804  {
17805 
17806  dFdx[mi.li_Gate][mi.AGateEquGateNodeOffset]
17807  += mi.gcrg_jac*mi.numberParallel;
17808 
17810  += mi.gcrgg_jac*mi.numberParallel;
17811 
17813  += mi.gcrgd_jac*mi.numberParallel;
17814 
17816  += mi.gcrgs_jac*mi.numberParallel;
17817 
17819  -= mi.gcrg_jac*mi.numberParallel;
17820  if (mi.soiMod != 2)
17821  {
17822  dFdx[mi.li_Gate][mi.AGateEquBodyNodeOffset]
17823  += mi.gcrgb_jac*mi.numberParallel;
17824  }
17825  }
17826  else if (mi.rgateMod == 3)
17827  {
17828 
17829  dFdx[mi.li_Gate][mi.AGateEquGateNodeOffset]
17830  += mi.geltd*mi.numberParallel;
17831 
17832  dFdx[mi.li_Gate][mi.AGateEquGateMidNodeOffset]
17833  += -mi.geltd*mi.numberParallel;
17834 
17836  += -mi.geltd*mi.numberParallel;
17837 
17839  += (mi.geltd + mi.gcrg_jac)*mi.numberParallel;
17840 
17842  += (mi.gcrgd_jac)*mi.numberParallel;
17843 
17845  += mi.gcrgg_jac*mi.numberParallel;
17846 
17848  += (mi.gcrgs_jac)*mi.numberParallel;
17849 
17850  if (mi.soiMod != 2)
17851  {
17853  += mi.gcrgb_jac*mi.numberParallel;
17854  }
17855 
17856 
17858  -= mi.gcrg_jac*mi.numberParallel;
17859  }
17860  if (mi.soiMod != 0)
17861  {
17862 
17864  += (mi.Gme + mi.gddpe)*mi.numberParallel;
17865 
17867  += (mi.gsspe - mi.Gme)*mi.numberParallel;
17868  if (mi.soiMod != 2)
17869  {
17871  += mi.gige_jac*mi.numberParallel;
17873  -= mi.gige_jac*mi.numberParallel;
17874  }
17875  }
17876 
17877  if (mi.soiMod != 2)
17878  {
17879  if (mi.rgateMod == 0 || mi.rgateMod == 1)
17880  {
17882  -= (-mi.gigb_jac - mi.gIgtotb)*mi.numberParallel;
17883  }
17884  else
17885  {
17887  += (mi.gigb_jac +mi.gIgtotb - mi.gcrgb_jac)*mi.numberParallel;
17888  }
17889 
17891  -= ((-mi.gddpb - mi.Gmbs) + mi.gIdtotb)*mi.numberParallel;
17892 
17894  -= ((-mi.gsspb + mi.Gmbs) + mi.Gmin + mi.gIstotb)*mi.numberParallel;
17895 
17897  += (mi.gbbe)*mi.numberParallel;
17898 
17900  += (-mi.gigg + mi.gbbg)*mi.numberParallel;
17901 
17903  += (-mi.gigd_jac + mi.gbbdp)*mi.numberParallel;
17904 
17906  += (mi.gbbsp - mi.Gmin - mi.gigs)*mi.numberParallel;
17907 
17908  dFdx[mi.li_Body][mi.ABodyEquBodyNodeOffset]
17909  += (-mi.gigb_jac + mi.gbbb + mi.Gmin)*mi.numberParallel;
17910  }
17911  if (mi.rgateMod == 0)
17912  {
17913 
17915  += (mi.gigg + mi.Gmin + mi.gIgtotg)*mi.numberParallel;
17916 
17918  += (mi.gigd_jac - mi.Gmin + mi.gIgtotd)*mi.numberParallel;
17919 
17921  += (mi.gigs + mi.gIgtots)*mi.numberParallel;
17922  }
17923  else if (mi.rgateMod == 1)
17924  {
17925 
17927  += (mi.gigg_jac + mi.Gmin + mi.gIgtotg + mi.geltd)*mi.numberParallel;
17928 
17930  += (mi.gigd - mi.Gmin + mi.gIgtotd)*mi.numberParallel;
17931 
17933  += (mi.gigs_jac + mi.gIgtots)*mi.numberParallel;
17934  }
17935  else
17936  {
17937 
17939  += (mi.gigg + mi.Gmin + mi.gIgtotg - mi.gcrgg_jac)*mi.numberParallel;
17940 
17942  += (mi.gigd_jac - mi.Gmin + mi.gIgtotd - mi.gcrgd_jac)*mi.numberParallel;
17943 
17945  += (mi.gigs + mi.gIgtots - mi.gcrgs_jac)*mi.numberParallel;
17946  }
17947 
17949  += ((mi.Gm) + mi.gddpg - mi.Gmin - mi.gIdtotg)*mi.numberParallel;
17950 
17952  += ((mi.drainConductance + mi.gds + mi.gddpdp + mi.RevSum) + mi.Gmin - mi.gIdtotd)*mi.numberParallel;
17953 
17955  -= ((-mi.gddpsp + mi.gds + mi.FwdSum) + mi.gIdtots)*mi.numberParallel;
17956 
17958  += -mi.drainConductance*mi.numberParallel;
17959 
17961  += (-mi.Gm + mi.gsspg - mi.gIstotg)*mi.numberParallel;
17962 
17964  -= (mi.gds - mi.gsspdp + mi.RevSum + mi.gIstotd)*mi.numberParallel;
17965 
17967  += ((mi.sourceConductance + mi.gds + mi.gsspsp + mi.FwdSum) + mi.Gmin - mi.gIstots)*mi.numberParallel;
17968 
17971 
17972  dFdx[mi.li_Drain][mi.ADrainEquDrainNodeOffset]
17974 
17977 
17980 
17983  if (mi.bodyMod == 1)
17984  {
17985 
17986  dFdx[mi.li_Body][mi.ABodyEquExtBodyNodeOffset]
17987  -= mi.gppp*mi.numberParallel;
17988 
17990  += mi.gppb*mi.numberParallel;
17991 
17993  += mi.gppp*mi.numberParallel;
17994  }
17995  if (mi.selfheat)
17996  {
17997 
17999  += (mi.GmT + mi.gddpT)*mi.numberParallel;
18000 
18002  += (-mi.GmT + mi.gsspT)*mi.numberParallel;
18003 
18004 
18006  += (mi.gigT_jac)*mi.numberParallel;
18007 
18009  += (mi.gTtt + 1/mi.paramPtr->rth)*mi.numberParallel;
18010 
18012  += mi.gTtg*mi.numberParallel;
18013 
18015  += mi.gTtdp*mi.numberParallel;
18016 
18018  += mi.gTtsp*mi.numberParallel;
18019  if (mi.soiMod != 0)
18020  {
18022  += mi.gTte*mi.numberParallel;
18023  }
18024  if (mi.bNode > 0)
18025  {
18027  += (mi.gbbT - mi.gigT_jac)*mi.numberParallel;
18029  += mi.gTtb*mi.numberParallel;
18030  }
18031  }
18032  if( mi.icVDSGiven )
18033  {
18034  if( getSolverState().dcopFlag )
18035  {
18036  dFdx[mi.li_Drain][mi.ADrainEquIdsOffset] += 1.0;
18037  dFdx[mi.li_Source][mi.ASourceEquIdsOffset] -= 1.0;
18038  dFdx[mi.li_Ids][mi.icVDSEquVdOffset] += 1.0;
18039  dFdx[mi.li_Ids][mi.icVDSEquVsOffset] -= 1.0;
18040  }
18041  else
18042  {
18043  dFdx[mi.li_Ids][mi.icVDSEquIdsOffset] += 1.0;
18044  }
18045  }
18046 
18047  if( mi.icVGSGiven )
18048  {
18049  if( getSolverState().dcopFlag )
18050  {
18051  dFdx[mi.li_Gate][mi.AGateEquIgsOffset] += 1.0;
18052  dFdx[mi.li_Source][mi.ASourceEquIgsOffset] -= 1.0;
18053  dFdx[mi.li_Igs][mi.icVGSEquVgOffset] += 1.0;
18054  dFdx[mi.li_Igs][mi.icVGSEquVsOffset] -= 1.0;
18055  }
18056  else
18057  {
18058  dFdx[mi.li_Igs][mi.icVGSEquIgsOffset] += 1.0;
18059  }
18060  }
18061 
18062  if( mi.icVBSGiven )
18063  {
18064  if( getSolverState().dcopFlag )
18065  {
18066  dFdx[mi.li_Body][mi.ABodyEquIbsOffset] += 1.0;
18067  dFdx[mi.li_Source][mi.ASourceEquIbsOffset] -= 1.0;
18068  dFdx[mi.li_Ibs][mi.icVBSEquVbOffset] += 1.0;
18069  dFdx[mi.li_Ibs][mi.icVBSEquVsOffset] -= 1.0;
18070  }
18071  else
18072  {
18073  dFdx[mi.li_Ibs][mi.icVBSEquIbsOffset] += 1.0;
18074  }
18075  }
18076 
18077  if( mi.icVESGiven )
18078  {
18079  if( getSolverState().dcopFlag )
18080  {
18081  dFdx[mi.li_Substrate][mi.ASubstrateEquIesOffset] += 1.0;
18082  dFdx[mi.li_Source][mi.ASourceEquIesOffset] -= 1.0;
18083  dFdx[mi.li_Ies][mi.icVESEquVeOffset] += 1.0;
18084  dFdx[mi.li_Ies][mi.icVESEquVsOffset] -= 1.0;
18085  }
18086  else
18087  {
18088  dFdx[mi.li_Ies][mi.icVESEquIesOffset] += 1.0;
18089  }
18090  }
18091 
18092  if( mi.icVPSGiven )
18093  {
18094  if( getSolverState().dcopFlag )
18095  {
18096  dFdx[mi.li_ExtBody][mi.AExtBodyEquIpsOffset] += 1.0;
18097  dFdx[mi.li_Source][mi.ASourceEquIpsOffset] -= 1.0;
18098  dFdx[mi.li_Ips][mi.icVPSEquVpOffset] += 1.0;
18099  dFdx[mi.li_Ips][mi.icVPSEquVsOffset] -= 1.0;
18100  }
18101  else
18102  {
18103  dFdx[mi.li_Ips][mi.icVPSEquIpsOffset] += 1.0;
18104  }
18105  }
18106 
18107 
18108  // Q-matrix:
18109 
18110  if (mi.rgateMod == 3)
18111  {
18112 
18114  += (mi.CAPcgmgmb)*mi.numberParallel;
18115 
18117  += (mi.CAPcgmdb)*mi.numberParallel;
18118 
18119 
18121  += (mi.CAPcgmsb)*mi.numberParallel;
18122 
18124  += mi.CAPcgmeb*mi.numberParallel;
18125 
18126 
18128  += mi.CAPcdgmb*mi.numberParallel;
18129 
18130 
18132  += mi.CAPcsgmb*mi.numberParallel;
18133 
18135  += mi.CAPcegmb*mi.numberParallel;
18136  }
18137 
18138 
18140  += mi.CAPcedb*mi.numberParallel;
18141 
18142 
18144  += mi.CAPcdeb*mi.numberParallel;
18145 
18147  += mi.CAPcseb*mi.numberParallel;
18148 
18150  += mi.CAPcegb*mi.numberParallel;
18151 
18153  += mi.CAPcgeb*mi.numberParallel;
18154  if (mi.soiMod != 2)
18155  {
18156 
18158  -= (mi.CAPcegb + mi.CAPcedb + mi.CAPcesb + mi.CAPceeb + mi.CAPcegmb)*mi.numberParallel;
18159  if (mi.rgateMod == 0 || mi.rgateMod == 1)
18160  {
18162  -= (+mi.CAPcggb + mi.CAPcgdb + mi.CAPcgsb + mi.CAPcgeb)*mi.numberParallel;
18163  }
18164  else
18165  {
18167  += (+ mi.CAPcgbb)*mi.numberParallel;
18168  }
18169 
18171  -= ((+ mi.CAPcdgb + mi.CAPcddb + mi.CAPcdeb + mi.CAPcdsb) + mi.CAPcdgmb)*mi.numberParallel;
18172 
18174  -= ((+ mi.CAPcsgb + mi.CAPcsdb + mi.CAPcseb + mi.CAPcssb) + mi.CAPcsgmb)*mi.numberParallel;
18175 
18177  += (+ mi.CAPcbeb)*mi.numberParallel;
18178 
18180  += (+ mi.CAPcbgb)*mi.numberParallel;
18181 
18183  += (+ mi.CAPcbdb)*mi.numberParallel;
18184 
18186  += (mi.CAPcbsb)*mi.numberParallel;
18187 
18188  dQdx[mi.li_Body][mi.ABodyEquBodyNodeOffset]
18189  += (-mi.CAPcbgb - mi.CAPcbdb - mi.CAPcbsb - mi.CAPcbeb)*mi.numberParallel;
18190  }
18191 
18193  += mi.CAPceeb*mi.numberParallel;
18194  if (mi.rgateMod == 0)
18195  {
18196 
18198  += (mi.CAPcggb)*mi.numberParallel;
18199 
18201  += (mi.CAPcgdb)*mi.numberParallel;
18202 
18204  += (mi.CAPcgsb)*mi.numberParallel;
18205  }
18206  else if (mi.rgateMod == 1)
18207  {
18208 
18210  += (mi.CAPcggb)*mi.numberParallel;
18211 
18213  += (mi.CAPcgdb)*mi.numberParallel;
18214 
18216  += (mi.CAPcgsb)*mi.numberParallel;
18217  }
18218  else
18219  {
18220 
18222  += (mi.CAPcggb)*mi.numberParallel;
18223 
18225  += (mi.CAPcgdb)*mi.numberParallel;
18226 
18228  += (mi.CAPcgsb)*mi.numberParallel;
18229  }
18230 
18232  += ((mi.CAPcdgb))*mi.numberParallel;
18233 
18235  += ((mi.CAPcddb) )*mi.numberParallel;
18236 
18238  -= ((-mi.CAPcdsb) )*mi.numberParallel;
18239 
18240 
18242  += (mi.CAPcsgb)*mi.numberParallel;
18243 
18245  -= (-mi.CAPcsdb )*mi.numberParallel;
18246 
18248  += ((mi.CAPcssb) )*mi.numberParallel;
18249 
18250  if (mi.selfheat)
18251  {
18252 
18254  += (mi.CAPcdT)*mi.numberParallel;
18255 
18257  += (mi.CAPcsT)*mi.numberParallel;
18258 
18260  += mi.CAPceT*mi.numberParallel;
18261 
18263  += (mi.CAPcgT)*mi.numberParallel;
18264 
18266  += (mi.CAPcTt)*mi.numberParallel;
18267 
18268  if (mi.bNode > 0)
18269  {
18271  += (mi.CAPcbT)*mi.numberParallel;
18272  }
18273  }
18274  }
18275  return true;
18276 }
18277 #endif
18278 
18279 Device *Traits::factory(const Configuration &configuration, const FactoryBlock &factory_block)
18280 {
18281 
18282  return new Master(configuration, factory_block, factory_block.solverState_, factory_block.deviceOptions_);
18283 }
18284 
18286 {
18288  .registerDevice("m", 10)
18289  .registerDevice("m", 57)
18290  .registerModelType("pmos", 10)
18291  .registerModelType("nmos", 10)
18292  .registerModelType("pmos", 57)
18293  .registerModelType("nmos", 57);
18294 }
18295 
18296 } // namespace Resistor
18297 } // namespace Device
18298 } // namespace Xyce