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.322 $
43 //
44 //
45 // Current Owner : $Author: erkeite $
46 //-------------------------------------------------------------------------
47 
48 #include <Xyce_config.h>
49 
50 
51 // ---------- Standard Includes ----------
52 
53 #ifdef HAVE_CSTDIO
54 #include <cstdio>
55 #else
56 #include <stdio.h>
57 #endif
58 
59 #ifdef HAVE_CMATH
60 #include <cmath>
61 #else
62 #include <math.h>
63 #endif
64 
65 #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  if (bNode == 1)
5696  {
5698  }
5699  if (tNode == 1)
5700  {
5702  }
5703  if (dNodePrime == 1)
5704  {
5706  }
5707  if (sNodePrime == 1)
5708  {
5710  }
5711  if (gNodePrime == 1)
5712  {
5714  }
5715  if (gNodeMid == 1)
5716  {
5718  }
5719  if (icVDSGiven)
5720  {
5721  intNameMap[li_Ids] = spiceInternalName(getName(), "branch_DS");
5722  }
5723  if (icVGSGiven)
5724  {
5725  intNameMap[li_Igs] = spiceInternalName(getName(), "branch_GS");
5726  }
5727  if (icVBSGiven)
5728  {
5729  intNameMap[li_Ibs] = spiceInternalName(getName(), "branch_BS");
5730  }
5731  if (icVESGiven)
5732  {
5733  intNameMap[li_Ies] = spiceInternalName(getName(), "branch_ES");
5734  }
5735  // Spice model documentation says to ignore icVPS if
5736  // there isn't a p terminal.
5737  if (pNode != 0)
5738  {
5739  if (icVPSGiven)
5740  {
5741  intNameMap[li_Ips] = spiceInternalName(getName(), "branch_PS");
5742  }
5743  }
5744 
5745  }
5746 
5747  return intNameMap;
5748 }
5749 
5750 
5751 //-----------------------------------------------------------------------------
5752 // Function : Instance::getStoreNameMap
5753 // Purpose :
5754 // Special Notes :
5755 // Scope : public
5756 // Creator : Richard Schiek, Electrical Systems Modeling
5757 // Creation Date : 4/4/2013
5758 //-----------------------------------------------------------------------------
5759 std::map<int,std::string> & Instance::getStoreNameMap ()
5760 {
5761  // set up the internal name map, if it hasn't been already.
5762  if( loadLeadCurrent && storeNameMap.empty ())
5763  {
5769  }
5770 
5771  return storeNameMap;
5772 }
5773 
5774 
5775 //-----------------------------------------------------------------------------
5776 // Function : Instance::registerStateLIDs
5777 // Purpose :
5778 // Special Notes :
5779 // Scope : public
5780 // Creator : Robert Hoekstra, SNL, Parallel Computational Sciences
5781 // Creation Date : 05/20/04
5782 //-----------------------------------------------------------------------------
5784  const std::vector<int> & staLIDVecRef )
5785 {
5786  AssertLIDs(staLIDVecRef.size() == numStateVars);
5787 
5788 #ifdef Xyce_DEBUG_DEVICE
5789 
5790  if (getDeviceOptions().debugLevel > 0)
5791  {
5792  Xyce::dout() << std::endl;
5793  Xyce::dout() << section_divider << std::endl;
5794  Xyce::dout() << " In Instance::registerStateLIDs\n\n";
5795  Xyce::dout() << " name = " << getName() << std::endl;
5796  Xyce::dout() << " Number of State LIDs: " << numStateVars << std::endl;
5797  }
5798 #endif
5799 
5800  // Copy over the global ID lists:
5801  staLIDVec = staLIDVecRef;
5802 
5803  int n = 0;
5804  // intrinsic capacitors
5805  li_state_qb = staLIDVec[n++];
5806  li_state_qg = staLIDVec[n++];
5807  li_state_qd = staLIDVec[n++];
5808  li_state_qe = staLIDVec[n++];
5809  li_state_qgmid = staLIDVec[n++];
5810  li_state_qth = staLIDVec[n++];
5811 
5812 #ifdef Xyce_DEBUG_DEVICE
5813  if (getDeviceOptions().debugLevel > 0)
5814  {
5815  Xyce::dout() << " Local State indices:" << std::endl;
5816  Xyce::dout() << std::endl;
5817 
5818  Xyce::dout() << " li_state_qb = " << li_state_qb << std::endl;
5819  Xyce::dout() << " li_state_qg = " << li_state_qg << std::endl;
5820  Xyce::dout() << " li_state_qd = " << li_state_qd << std::endl;
5821  Xyce::dout() << " li_state_qe = " << li_state_qe << std::endl;
5822  Xyce::dout() << " li_state_qgmid = " << li_state_qgmid << std::endl;
5823  Xyce::dout() << " li_state_qth = " << li_state_qth << std::endl;
5824  Xyce::dout() << std::endl;
5825  Xyce::dout() << section_divider << std::endl;
5826  }
5827 #endif
5828 
5829 }
5830 
5831 //-----------------------------------------------------------------------------
5832 // Function : Instance::registerStoreLIDs
5833 // Purpose :
5834 // Special Notes :
5835 // Scope : public
5836 // Creator : Eric Keiter
5837 // Creation Date :
5838 //-----------------------------------------------------------------------------
5840  const std::vector<int> & stoLIDVecRef )
5841 {
5842  AssertLIDs(stoLIDVecRef.size() == getNumStoreVars());
5843 
5844  // Copy over the global ID lists:
5845  stoLIDVec = stoLIDVecRef;
5846 
5847  int n = 0;
5848  // voltage drops
5849  li_store_vbd = stoLIDVec[n++];
5850  li_store_vbs = stoLIDVec[n++];
5851  li_store_vgs = stoLIDVec[n++];
5852  li_store_vds = stoLIDVec[n++];
5853  li_store_ves = stoLIDVec[n++];
5854  li_store_vps = stoLIDVec[n++];
5855 
5856  li_store_vg = stoLIDVec[n++];
5857  li_store_vd = stoLIDVec[n++];
5858  li_store_vs = stoLIDVec[n++];
5859  li_store_vp = stoLIDVec[n++];
5860  li_store_ve = stoLIDVec[n++];
5861  li_store_vgp = stoLIDVec[n++];
5862  li_store_vgm = stoLIDVec[n++];
5863  li_store_deltemp = stoLIDVec[n++];
5864 
5865  li_store_vges = stoLIDVec[n++];
5866  li_store_vgms = stoLIDVec[n++];
5867 
5868  if( loadLeadCurrent )
5869  {
5870  li_store_dev_id = stoLIDVec[n++];
5871  li_store_dev_ig = stoLIDVec[n++];
5872  li_store_dev_is = stoLIDVec[n++];
5873  li_store_dev_ie = stoLIDVec[n++];
5874  li_store_dev_ib = stoLIDVec[n++];
5875  }
5876 }
5877 
5878 //-----------------------------------------------------------------------------
5879 // Function : Instance::jacobianStamp
5880 // Purpose :
5881 // Special Notes :
5882 // Scope : public
5883 // Creator : Robert Hoekstra, SNL, Parallel Computational Sciences
5884 // Creation Date : 05/20/04
5885 //-----------------------------------------------------------------------------
5886 const std::vector< std::vector<int> > & Instance::jacobianStamp() const
5887 {
5889  {
5890  return jacStampIC;
5891  }
5892 
5893  return jacStamp_v[jacID];
5894 }
5895 
5896 //-----------------------------------------------------------------------------
5897 // Function : Instance::registerJacLIDs
5898 // Purpose :
5899 // Special Notes :
5900 // Scope : public
5901 // Creator : Robert Hoekstra, SNL, Parallel Computational Sciences
5902 // Creation Date : 05/20/04
5903 //-----------------------------------------------------------------------------
5905  const std::vector< std::vector<int> > & jacLIDVec )
5906 {
5907  DeviceInstance::registerJacLIDs( jacLIDVec );
5908  std::vector<int> map;
5909  std::vector< std::vector<int> > map2;
5910 
5911  // these are used to helpe us pluck the LID's from the right spot
5912  // without adding a lot of new code to each jacID condition below
5913  int lastDrainIndex = 0;
5914  int lastGateIndex = 0;
5915  int lastBodyIndex = 0;
5916  int lastSourceIndex = 0;
5917  int lastSubstrateIndex = 0;
5918  int lastExtBodyIndex = 0;
5919  int lastRowUsed = 0;
5920 
5922  {
5923  map = jacMapIC;
5924  map2 = jacMapIC2;
5925  }
5926  else
5927  {
5928  map = jacMap_v[jacID];
5929  map2 = jacMap2_v[jacID];
5930  }
5931 
5932  if (jacID < 24)
5933  {
5934  ADrainEquDrainNodeOffset = jacLIDVec[map[0]][map2[0][0]];
5935  ADrainEquDrainPrimeNodeOffset = jacLIDVec[map[0]][map2[0][1]];
5936 
5937  AGateEquGateNodeOffset = jacLIDVec[map[1]][map2[1][0]];
5938  AGateEquBodyNodeOffset = jacLIDVec[map[1]][map2[1][1]];
5939  AGateEquDrainPrimeNodeOffset = jacLIDVec[map[1]][map2[1][2]];
5940  AGateEquSourcePrimeNodeOffset = jacLIDVec[map[1]][map2[1][3]];
5941  AGateEquGatePrimeNodeOffset = jacLIDVec[map[1]][map2[1][4]];
5942  AGateEquGateMidNodeOffset = jacLIDVec[map[1]][map2[1][5]];
5943 
5944  ASourceEquSourceNodeOffset = jacLIDVec[map[2]][map2[2][0]];
5945  ASourceEquSourcePrimeNodeOffset = jacLIDVec[map[2]][map2[2][1]];
5946 
5947  ASubstrateEquSubstrateNodeOffset = jacLIDVec[map[3]][map2[3][0]];
5948  ASubstrateEquBodyNodeOffset = jacLIDVec[map[3]][map2[3][1]];
5949  ASubstrateEquTemperatureNodeOffset = jacLIDVec[map[3]][map2[3][2]];
5950  ASubstrateEquDrainPrimeNodeOffset = jacLIDVec[map[3]][map2[3][3]];
5951  ASubstrateEquSourcePrimeNodeOffset = jacLIDVec[map[3]][map2[3][4]];
5952  ASubstrateEquGatePrimeNodeOffset = jacLIDVec[map[3]][map2[3][5]];
5953  ASubstrateEquGateMidNodeOffset = jacLIDVec[map[3]][map2[3][6]];
5954 
5955  AExtBodyEquExtBodyNodeOffset = jacLIDVec[map[4]][map2[4][0]];
5956  AExtBodyEquBodyNodeOffset = jacLIDVec[map[4]][map2[4][1]];
5957 
5958  ABodyEquSubstrateNodeOffset = jacLIDVec[map[5]][map2[5][0]];
5959  ABodyEquExtBodyNodeOffset = jacLIDVec[map[5]][map2[5][1]];
5960  ABodyEquBodyNodeOffset = jacLIDVec[map[5]][map2[5][2]];
5961  ABodyEquTemperatureNodeOffset = jacLIDVec[map[5]][map2[5][3]];
5962  ABodyEquDrainPrimeNodeOffset = jacLIDVec[map[5]][map2[5][4]];
5963  ABodyEquSourcePrimeNodeOffset = jacLIDVec[map[5]][map2[5][5]];
5964  ABodyEquGatePrimeNodeOffset = jacLIDVec[map[5]][map2[5][6]];
5965 
5966  ATemperatureEquSubstrateNodeOffset = jacLIDVec[map[6]][map2[6][0]];
5967  ATemperatureEquBodyNodeOffset = jacLIDVec[map[6]][map2[6][1]];
5968  ATemperatureEquTemperatureNodeOffset = jacLIDVec[map[6]][map2[6][2]];
5969  ATemperatureEquDrainPrimeNodeOffset = jacLIDVec[map[6]][map2[6][3]];
5970  ATemperatureEquSourcePrimeNodeOffset = jacLIDVec[map[6]][map2[6][4]];
5971  ATemperatureEquGatePrimeNodeOffset = jacLIDVec[map[6]][map2[6][5]];
5972 
5973  ADrainPrimeEquDrainNodeOffset = jacLIDVec[map[7]][map2[7][0]];
5974  ADrainPrimeEquSubstrateNodeOffset = jacLIDVec[map[7]][map2[7][1]];
5975  ADrainPrimeEquBodyNodeOffset = jacLIDVec[map[7]][map2[7][2]];
5976  ADrainPrimeEquTemperatureNodeOffset = jacLIDVec[map[7]][map2[7][3]];
5977  ADrainPrimeEquDrainPrimeNodeOffset = jacLIDVec[map[7]][map2[7][4]];
5978  ADrainPrimeEquSourcePrimeNodeOffset = jacLIDVec[map[7]][map2[7][5]];
5979  ADrainPrimeEquGatePrimeNodeOffset = jacLIDVec[map[7]][map2[7][6]];
5980  ADrainPrimeEquGateMidNodeOffset = jacLIDVec[map[7]][map2[7][7]];
5981 
5982  ASourcePrimeEquSourceNodeOffset = jacLIDVec[map[8]][map2[8][0]];
5983  ASourcePrimeEquSubstrateNodeOffset = jacLIDVec[map[8]][map2[8][1]];
5984  ASourcePrimeEquBodyNodeOffset = jacLIDVec[map[8]][map2[8][2]];
5985  ASourcePrimeEquTemperatureNodeOffset = jacLIDVec[map[8]][map2[8][3]];
5986  ASourcePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[8]][map2[8][4]];
5987  ASourcePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[8]][map2[8][5]];
5988  ASourcePrimeEquGatePrimeNodeOffset = jacLIDVec[map[8]][map2[8][6]];
5989  ASourcePrimeEquGateMidNodeOffset = jacLIDVec[map[8]][map2[8][7]];
5990 
5991  AGatePrimeEquGateNodeOffset = jacLIDVec[map[9]][map2[9][0]];
5992  AGatePrimeEquSubstrateNodeOffset = jacLIDVec[map[9]][map2[9][1]];
5993  AGatePrimeEquBodyNodeOffset = jacLIDVec[map[9]][map2[9][2]];
5994  AGatePrimeEquTemperatureNodeOffset = jacLIDVec[map[9]][map2[9][3]];
5995  AGatePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[9]][map2[9][4]];
5996  AGatePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[9]][map2[9][5]];
5997  AGatePrimeEquGatePrimeNodeOffset = jacLIDVec[map[9]][map2[9][6]];
5998  AGatePrimeEquGateMidNodeOffset = jacLIDVec[map[9]][map2[9][7]];
5999 
6000  AGateMidEquGateNodeOffset = jacLIDVec[map[10]][map2[10][0]];
6001  AGateMidEquSubstrateNodeOffset = jacLIDVec[map[10]][map2[10][1]];
6002  AGateMidEquBodyNodeOffset = jacLIDVec[map[10]][map2[10][2]];
6003  AGateMidEquDrainPrimeNodeOffset = jacLIDVec[map[10]][map2[10][3]];
6004  AGateMidEquSourcePrimeNodeOffset = jacLIDVec[map[10]][map2[10][4]];
6005  AGateMidEquGatePrimeNodeOffset = jacLIDVec[map[10]][map2[10][5]];
6006  AGateMidEquGateMidNodeOffset = jacLIDVec[map[10]][map2[10][6]];
6007 
6008  lastDrainIndex = 1;
6009  lastGateIndex = 5;
6010  lastBodyIndex = 6;
6011  lastSourceIndex = 1;
6012  lastSubstrateIndex = 6;
6013  lastExtBodyIndex = 1;
6014  lastRowUsed = 10;
6015  }
6016  else if (jacID >= 24 && jacID < 48)
6017  {
6018  ADrainEquDrainNodeOffset = jacLIDVec[map[0]][map2[0][0]];
6019  ADrainEquDrainPrimeNodeOffset = jacLIDVec[map[0]][map2[0][1]];
6020 
6021  AGateEquGateNodeOffset = jacLIDVec[map[1]][map2[1][0]];
6022  AGateEquBodyNodeOffset = jacLIDVec[map[1]][map2[1][1]];
6023  AGateEquDrainPrimeNodeOffset = jacLIDVec[map[1]][map2[1][2]];
6024  AGateEquSourcePrimeNodeOffset = jacLIDVec[map[1]][map2[1][3]];
6025  AGateEquGatePrimeNodeOffset = jacLIDVec[map[1]][map2[1][4]];
6026  AGateEquGateMidNodeOffset = jacLIDVec[map[1]][map2[1][5]];
6027 
6028  ASourceEquSourceNodeOffset = jacLIDVec[map[2]][map2[2][0]];
6029  ASourceEquSourcePrimeNodeOffset = jacLIDVec[map[2]][map2[2][1]];
6030 
6031  ASubstrateEquSubstrateNodeOffset = jacLIDVec[map[3]][map2[3][0]];
6032  ASubstrateEquBodyNodeOffset = jacLIDVec[map[3]][map2[3][1]];
6033  ASubstrateEquDrainPrimeNodeOffset = jacLIDVec[map[3]][map2[3][2]];
6034  ASubstrateEquSourcePrimeNodeOffset = jacLIDVec[map[3]][map2[3][3]];
6035  ASubstrateEquGatePrimeNodeOffset = jacLIDVec[map[3]][map2[3][4]];
6036  ASubstrateEquGateMidNodeOffset = jacLIDVec[map[3]][map2[3][5]];
6037 
6038  AExtBodyEquExtBodyNodeOffset = jacLIDVec[map[4]][map2[4][0]];
6039  AExtBodyEquBodyNodeOffset = jacLIDVec[map[4]][map2[4][1]];
6040 
6041  ABodyEquSubstrateNodeOffset = jacLIDVec[map[5]][map2[5][0]];
6042  ABodyEquExtBodyNodeOffset = jacLIDVec[map[5]][map2[5][1]];
6043  ABodyEquBodyNodeOffset = jacLIDVec[map[5]][map2[5][2]];
6044  ABodyEquDrainPrimeNodeOffset = jacLIDVec[map[5]][map2[5][3]];
6045  ABodyEquSourcePrimeNodeOffset = jacLIDVec[map[5]][map2[5][4]];
6046  ABodyEquGatePrimeNodeOffset = jacLIDVec[map[5]][map2[5][5]];
6047 
6048  ADrainPrimeEquDrainNodeOffset = jacLIDVec[map[6]][map2[6][0]];
6049  ADrainPrimeEquSubstrateNodeOffset = jacLIDVec[map[6]][map2[6][1]];
6050  ADrainPrimeEquBodyNodeOffset = jacLIDVec[map[6]][map2[6][2]];
6051  ADrainPrimeEquDrainPrimeNodeOffset = jacLIDVec[map[6]][map2[6][3]];
6052  ADrainPrimeEquSourcePrimeNodeOffset = jacLIDVec[map[6]][map2[6][4]];
6053  ADrainPrimeEquGatePrimeNodeOffset = jacLIDVec[map[6]][map2[6][5]];
6054  ADrainPrimeEquGateMidNodeOffset = jacLIDVec[map[6]][map2[6][6]];
6055 
6056  ASourcePrimeEquSourceNodeOffset = jacLIDVec[map[7]][map2[7][0]];
6057  ASourcePrimeEquSubstrateNodeOffset = jacLIDVec[map[7]][map2[7][1]];
6058  ASourcePrimeEquBodyNodeOffset = jacLIDVec[map[7]][map2[7][2]];
6059  ASourcePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[7]][map2[7][3]];
6060  ASourcePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[7]][map2[7][4]];
6061  ASourcePrimeEquGatePrimeNodeOffset = jacLIDVec[map[7]][map2[7][5]];
6062  ASourcePrimeEquGateMidNodeOffset = jacLIDVec[map[7]][map2[7][6]];
6063 
6064  AGatePrimeEquGateNodeOffset = jacLIDVec[map[8]][map2[8][0]];
6065  AGatePrimeEquSubstrateNodeOffset = jacLIDVec[map[8]][map2[8][1]];
6066  AGatePrimeEquBodyNodeOffset = jacLIDVec[map[8]][map2[8][2]];
6067  AGatePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[8]][map2[8][3]];
6068  AGatePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[8]][map2[8][4]];
6069  AGatePrimeEquGatePrimeNodeOffset = jacLIDVec[map[8]][map2[8][5]];
6070  AGatePrimeEquGateMidNodeOffset = jacLIDVec[map[8]][map2[8][6]];
6071 
6072  AGateMidEquGateNodeOffset = jacLIDVec[map[9]][map2[9][0]];
6073  AGateMidEquSubstrateNodeOffset = jacLIDVec[map[9]][map2[9][1]];
6074  AGateMidEquBodyNodeOffset = jacLIDVec[map[9]][map2[9][2]];
6075  AGateMidEquDrainPrimeNodeOffset = jacLIDVec[map[9]][map2[9][3]];
6076  AGateMidEquSourcePrimeNodeOffset = jacLIDVec[map[9]][map2[9][4]];
6077  AGateMidEquGatePrimeNodeOffset = jacLIDVec[map[9]][map2[9][5]];
6078  AGateMidEquGateMidNodeOffset = jacLIDVec[map[9]][map2[9][6]];
6079 
6080  lastDrainIndex = 1;
6081  lastGateIndex = 5;
6082  lastBodyIndex = 5;
6083  lastSourceIndex = 1;
6084  lastSubstrateIndex = 5;
6085  lastExtBodyIndex = 1;
6086  lastRowUsed = 9;
6087  }
6088  else if (jacID >= 48 && jacID < 60)
6089  {
6090  ADrainEquDrainNodeOffset = jacLIDVec[map[0]][map2[0][0]];
6091  ADrainEquDrainPrimeNodeOffset = jacLIDVec[map[0]][map2[0][1]];
6092 
6093  AGateEquGateNodeOffset = jacLIDVec[map[1]][map2[1][0]];
6094  AGateEquDrainPrimeNodeOffset = jacLIDVec[map[1]][map2[1][1]];
6095  AGateEquSourcePrimeNodeOffset = jacLIDVec[map[1]][map2[1][2]];
6096  AGateEquGatePrimeNodeOffset = jacLIDVec[map[1]][map2[1][3]];
6097  AGateEquGateMidNodeOffset = jacLIDVec[map[1]][map2[1][4]];
6098 
6099  ASourceEquSourceNodeOffset = jacLIDVec[map[2]][map2[2][0]];
6100  ASourceEquSourcePrimeNodeOffset = jacLIDVec[map[2]][map2[2][1]];
6101 
6102  ASubstrateEquSubstrateNodeOffset = jacLIDVec[map[3]][map2[3][0]];
6103  ASubstrateEquTemperatureNodeOffset = jacLIDVec[map[3]][map2[3][1]];
6104  ASubstrateEquDrainPrimeNodeOffset = jacLIDVec[map[3]][map2[3][2]];
6105  ASubstrateEquSourcePrimeNodeOffset = jacLIDVec[map[3]][map2[3][3]];
6106  ASubstrateEquGatePrimeNodeOffset = jacLIDVec[map[3]][map2[3][4]];
6107  ASubstrateEquGateMidNodeOffset = jacLIDVec[map[3]][map2[3][5]];
6108 
6109  ATemperatureEquSubstrateNodeOffset = jacLIDVec[map[4]][map2[4][0]];
6110  ATemperatureEquTemperatureNodeOffset = jacLIDVec[map[4]][map2[4][1]];
6111  ATemperatureEquDrainPrimeNodeOffset = jacLIDVec[map[4]][map2[4][2]];
6112  ATemperatureEquSourcePrimeNodeOffset = jacLIDVec[map[4]][map2[4][3]];
6113  ATemperatureEquGatePrimeNodeOffset = jacLIDVec[map[4]][map2[4][4]];
6114 
6115  ADrainPrimeEquDrainNodeOffset = jacLIDVec[map[5]][map2[5][0]];
6116  ADrainPrimeEquSubstrateNodeOffset = jacLIDVec[map[5]][map2[5][1]];
6117  ADrainPrimeEquTemperatureNodeOffset = jacLIDVec[map[5]][map2[5][2]];
6118  ADrainPrimeEquDrainPrimeNodeOffset = jacLIDVec[map[5]][map2[5][3]];
6119  ADrainPrimeEquSourcePrimeNodeOffset = jacLIDVec[map[5]][map2[5][4]];
6120  ADrainPrimeEquGatePrimeNodeOffset = jacLIDVec[map[5]][map2[5][5]];
6121  ADrainPrimeEquGateMidNodeOffset = jacLIDVec[map[5]][map2[5][6]];
6122 
6123  ASourcePrimeEquSourceNodeOffset = jacLIDVec[map[6]][map2[6][0]];
6124  ASourcePrimeEquSubstrateNodeOffset = jacLIDVec[map[6]][map2[6][1]];
6125  ASourcePrimeEquTemperatureNodeOffset = jacLIDVec[map[6]][map2[6][2]];
6126  ASourcePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[6]][map2[6][3]];
6127  ASourcePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[6]][map2[6][4]];
6128  ASourcePrimeEquGatePrimeNodeOffset = jacLIDVec[map[6]][map2[6][5]];
6129  ASourcePrimeEquGateMidNodeOffset = jacLIDVec[map[6]][map2[6][6]];
6130 
6131  AGatePrimeEquGateNodeOffset = jacLIDVec[map[7]][map2[7][0]];
6132  AGatePrimeEquSubstrateNodeOffset = jacLIDVec[map[7]][map2[7][1]];
6133  AGatePrimeEquTemperatureNodeOffset = jacLIDVec[map[7]][map2[7][2]];
6134  AGatePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[7]][map2[7][3]];
6135  AGatePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[7]][map2[7][4]];
6136  AGatePrimeEquGatePrimeNodeOffset = jacLIDVec[map[7]][map2[7][5]];
6137  AGatePrimeEquGateMidNodeOffset = jacLIDVec[map[7]][map2[7][6]];
6138 
6139  AGateMidEquGateNodeOffset = jacLIDVec[map[8]][map2[8][0]];
6140  AGateMidEquSubstrateNodeOffset = jacLIDVec[map[8]][map2[8][1]];
6141  AGateMidEquDrainPrimeNodeOffset = jacLIDVec[map[8]][map2[8][2]];
6142  AGateMidEquSourcePrimeNodeOffset = jacLIDVec[map[8]][map2[8][3]];
6143  AGateMidEquGatePrimeNodeOffset = jacLIDVec[map[8]][map2[8][4]];
6144  AGateMidEquGateMidNodeOffset = jacLIDVec[map[8]][map2[8][5]];
6145 
6146  lastDrainIndex = 1;
6147  lastGateIndex = 4;
6148  lastBodyIndex = 0;
6149  lastSourceIndex = 1;
6150  lastSubstrateIndex = 5;
6151  lastExtBodyIndex = 0;
6152  lastRowUsed = 8;
6153  }
6154  else if (jacID >= 60 && jacID < 72)
6155  {
6156  ADrainEquDrainNodeOffset = jacLIDVec[map[0]][map2[0][0]];
6157  ADrainEquDrainPrimeNodeOffset = jacLIDVec[map[0]][map2[0][1]];
6158 
6159  AGateEquGateNodeOffset = jacLIDVec[map[1]][map2[1][0]];
6160  AGateEquDrainPrimeNodeOffset = jacLIDVec[map[1]][map2[1][1]];
6161  AGateEquSourcePrimeNodeOffset = jacLIDVec[map[1]][map2[1][2]];
6162  AGateEquGatePrimeNodeOffset = jacLIDVec[map[1]][map2[1][3]];
6163  AGateEquGateMidNodeOffset = jacLIDVec[map[1]][map2[1][4]];
6164 
6165  ASourceEquSourceNodeOffset = jacLIDVec[map[2]][map2[2][0]];
6166  ASourceEquSourcePrimeNodeOffset = jacLIDVec[map[2]][map2[2][1]];
6167 
6168  ASubstrateEquSubstrateNodeOffset = jacLIDVec[map[3]][map2[3][0]];
6169  ASubstrateEquDrainPrimeNodeOffset = jacLIDVec[map[3]][map2[3][1]];
6170  ASubstrateEquSourcePrimeNodeOffset = jacLIDVec[map[3]][map2[3][2]];
6171  ASubstrateEquGatePrimeNodeOffset = jacLIDVec[map[3]][map2[3][3]];
6172  ASubstrateEquGateMidNodeOffset = jacLIDVec[map[3]][map2[3][4]];
6173 
6174  ADrainPrimeEquDrainNodeOffset = jacLIDVec[map[4]][map2[4][0]];
6175  ADrainPrimeEquSubstrateNodeOffset = jacLIDVec[map[4]][map2[4][1]];
6176  ADrainPrimeEquDrainPrimeNodeOffset = jacLIDVec[map[4]][map2[4][2]];
6177  ADrainPrimeEquSourcePrimeNodeOffset = jacLIDVec[map[4]][map2[4][3]];
6178  ADrainPrimeEquGatePrimeNodeOffset = jacLIDVec[map[4]][map2[4][4]];
6179  ADrainPrimeEquGateMidNodeOffset = jacLIDVec[map[4]][map2[4][5]];
6180 
6181  ASourcePrimeEquSourceNodeOffset = jacLIDVec[map[5]][map2[5][0]];
6182  ASourcePrimeEquSubstrateNodeOffset = jacLIDVec[map[5]][map2[5][1]];
6183  ASourcePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[5]][map2[5][2]];
6184  ASourcePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[5]][map2[5][3]];
6185  ASourcePrimeEquGatePrimeNodeOffset = jacLIDVec[map[5]][map2[5][4]];
6186  ASourcePrimeEquGateMidNodeOffset = jacLIDVec[map[5]][map2[5][5]];
6187 
6188  AGatePrimeEquGateNodeOffset = jacLIDVec[map[6]][map2[6][0]];
6189  AGatePrimeEquSubstrateNodeOffset = jacLIDVec[map[6]][map2[6][1]];
6190  AGatePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[6]][map2[6][2]];
6191  AGatePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[6]][map2[6][3]];
6192  AGatePrimeEquGatePrimeNodeOffset = jacLIDVec[map[6]][map2[6][4]];
6193  AGatePrimeEquGateMidNodeOffset = jacLIDVec[map[6]][map2[6][5]];
6194 
6195  AGateMidEquGateNodeOffset = jacLIDVec[map[7]][map2[7][0]];
6196  AGateMidEquSubstrateNodeOffset = jacLIDVec[map[7]][map2[7][1]];
6197  AGateMidEquDrainPrimeNodeOffset = jacLIDVec[map[7]][map2[7][2]];
6198  AGateMidEquSourcePrimeNodeOffset = jacLIDVec[map[7]][map2[7][3]];
6199  AGateMidEquGatePrimeNodeOffset = jacLIDVec[map[7]][map2[7][4]];
6200  AGateMidEquGateMidNodeOffset = jacLIDVec[map[7]][map2[7][5]];
6201 
6202  lastDrainIndex = 1;
6203  lastGateIndex = 4;
6204  lastBodyIndex = 0;
6205  lastSourceIndex = 1;
6206  lastSubstrateIndex = 4;
6207  lastExtBodyIndex = 0;
6208  lastRowUsed = 7;
6209  }
6210  else if (jacID >= 72 && jacID < 84)
6211  {
6212  ADrainEquDrainNodeOffset = jacLIDVec[map[0]][map2[0][0]];
6213  ADrainEquDrainPrimeNodeOffset = jacLIDVec[map[0]][map2[0][1]];
6214 
6215  AGateEquGateNodeOffset = jacLIDVec[map[1]][map2[1][0]];
6216  AGateEquBodyNodeOffset = jacLIDVec[map[1]][map2[1][1]];
6217  AGateEquDrainPrimeNodeOffset = jacLIDVec[map[1]][map2[1][2]];
6218  AGateEquSourcePrimeNodeOffset = jacLIDVec[map[1]][map2[1][3]];
6219  AGateEquGatePrimeNodeOffset = jacLIDVec[map[1]][map2[1][4]];
6220  AGateEquGateMidNodeOffset = jacLIDVec[map[1]][map2[1][5]];
6221 
6222  ASourceEquSourceNodeOffset = jacLIDVec[map[2]][map2[2][0]];
6223  ASourceEquSourcePrimeNodeOffset = jacLIDVec[map[2]][map2[2][1]];
6224 
6225  ASubstrateEquSubstrateNodeOffset = jacLIDVec[map[3]][map2[3][0]];
6226  ASubstrateEquTemperatureNodeOffset = jacLIDVec[map[3]][map2[3][1]];
6227  ASubstrateEquBodyNodeOffset = jacLIDVec[map[3]][map2[3][2]];
6228  ASubstrateEquDrainPrimeNodeOffset = jacLIDVec[map[3]][map2[3][3]];
6229  ASubstrateEquSourcePrimeNodeOffset = jacLIDVec[map[3]][map2[3][4]];
6230  ASubstrateEquGatePrimeNodeOffset = jacLIDVec[map[3]][map2[3][5]];
6231  ASubstrateEquGateMidNodeOffset = jacLIDVec[map[3]][map2[3][6]];
6232 
6233  AExtBodyEquExtBodyNodeOffset = jacLIDVec[map[4]][map2[4][0]];
6234  AExtBodyEquBodyNodeOffset = jacLIDVec[map[4]][map2[4][1]];
6235 
6236  ATemperatureEquSubstrateNodeOffset = jacLIDVec[map[5]][map2[5][0]];
6237  ATemperatureEquTemperatureNodeOffset = jacLIDVec[map[5]][map2[5][1]];
6238  ATemperatureEquBodyNodeOffset = jacLIDVec[map[5]][map2[5][2]];
6239  ATemperatureEquDrainPrimeNodeOffset = jacLIDVec[map[5]][map2[5][3]];
6240  ATemperatureEquSourcePrimeNodeOffset = jacLIDVec[map[5]][map2[5][4]];
6241  ATemperatureEquGatePrimeNodeOffset = jacLIDVec[map[5]][map2[5][5]];
6242 
6243  ABodyEquSubstrateNodeOffset = jacLIDVec[map[6]][map2[6][0]];
6244  ABodyEquExtBodyNodeOffset = jacLIDVec[map[6]][map2[6][1]];
6245  ABodyEquTemperatureNodeOffset = jacLIDVec[map[6]][map2[6][2]];
6246  ABodyEquBodyNodeOffset = jacLIDVec[map[6]][map2[6][3]];
6247  ABodyEquDrainPrimeNodeOffset = jacLIDVec[map[6]][map2[6][4]];
6248  ABodyEquSourcePrimeNodeOffset = jacLIDVec[map[6]][map2[6][5]];
6249  ABodyEquGatePrimeNodeOffset = jacLIDVec[map[6]][map2[6][6]];
6250 
6251  ADrainPrimeEquDrainNodeOffset = jacLIDVec[map[7]][map2[7][0]];
6252  ADrainPrimeEquSubstrateNodeOffset = jacLIDVec[map[7]][map2[7][1]];
6253  ADrainPrimeEquTemperatureNodeOffset = jacLIDVec[map[7]][map2[7][2]];
6254  ADrainPrimeEquBodyNodeOffset = jacLIDVec[map[7]][map2[7][3]];
6255  ADrainPrimeEquDrainPrimeNodeOffset = jacLIDVec[map[7]][map2[7][4]];
6256  ADrainPrimeEquSourcePrimeNodeOffset = jacLIDVec[map[7]][map2[7][5]];
6257  ADrainPrimeEquGatePrimeNodeOffset = jacLIDVec[map[7]][map2[7][6]];
6258  ADrainPrimeEquGateMidNodeOffset = jacLIDVec[map[7]][map2[7][7]];
6259 
6260  ASourcePrimeEquSourceNodeOffset = jacLIDVec[map[8]][map2[8][0]];
6261  ASourcePrimeEquSubstrateNodeOffset = jacLIDVec[map[8]][map2[8][1]];
6262  ASourcePrimeEquTemperatureNodeOffset = jacLIDVec[map[8]][map2[8][2]];
6263  ASourcePrimeEquBodyNodeOffset = jacLIDVec[map[8]][map2[8][3]];
6264  ASourcePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[8]][map2[8][4]];
6265  ASourcePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[8]][map2[8][5]];
6266  ASourcePrimeEquGatePrimeNodeOffset = jacLIDVec[map[8]][map2[8][6]];
6267  ASourcePrimeEquGateMidNodeOffset = jacLIDVec[map[8]][map2[8][7]];
6268 
6269  AGatePrimeEquGateNodeOffset = jacLIDVec[map[9]][map2[9][0]];
6270  AGatePrimeEquSubstrateNodeOffset = jacLIDVec[map[9]][map2[9][1]];
6271  AGatePrimeEquTemperatureNodeOffset = jacLIDVec[map[9]][map2[9][2]];
6272  AGatePrimeEquBodyNodeOffset = jacLIDVec[map[9]][map2[9][3]];
6273  AGatePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[9]][map2[9][4]];
6274  AGatePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[9]][map2[9][5]];
6275  AGatePrimeEquGatePrimeNodeOffset = jacLIDVec[map[9]][map2[9][6]];
6276  AGatePrimeEquGateMidNodeOffset = jacLIDVec[map[9]][map2[9][7]];
6277 
6278  AGateMidEquGateNodeOffset = jacLIDVec[map[10]][map2[10][0]];
6279  AGateMidEquSubstrateNodeOffset = jacLIDVec[map[10]][map2[10][1]];
6280  AGateMidEquBodyNodeOffset = jacLIDVec[map[10]][map2[10][2]];
6281  AGateMidEquDrainPrimeNodeOffset = jacLIDVec[map[10]][map2[10][3]];
6282  AGateMidEquSourcePrimeNodeOffset = jacLIDVec[map[10]][map2[10][4]];
6283  AGateMidEquGatePrimeNodeOffset = jacLIDVec[map[10]][map2[10][5]];
6284  AGateMidEquGateMidNodeOffset = jacLIDVec[map[10]][map2[10][6]];
6285 
6286  lastDrainIndex = 1;
6287  lastGateIndex = 5;
6288  lastBodyIndex = 6;
6289  lastSourceIndex = 1;
6290  lastSubstrateIndex = 6;
6291  lastExtBodyIndex = 1;
6292  lastRowUsed = 10;
6293  }
6294  else if (jacID >= 84 && jacID < 96)
6295  {
6296  ADrainEquDrainNodeOffset = jacLIDVec[map[0]][map2[0][0]];
6297  ADrainEquDrainPrimeNodeOffset = jacLIDVec[map[0]][map2[0][1]];
6298 
6299  AGateEquGateNodeOffset = jacLIDVec[map[1]][map2[1][0]];
6300  AGateEquBodyNodeOffset = jacLIDVec[map[1]][map2[1][1]];
6301  AGateEquDrainPrimeNodeOffset = jacLIDVec[map[1]][map2[1][2]];
6302  AGateEquSourcePrimeNodeOffset = jacLIDVec[map[1]][map2[1][3]];
6303  AGateEquGatePrimeNodeOffset = jacLIDVec[map[1]][map2[1][4]];
6304  AGateEquGateMidNodeOffset = jacLIDVec[map[1]][map2[1][5]];
6305 
6306  ASourceEquSourceNodeOffset = jacLIDVec[map[2]][map2[2][0]];
6307  ASourceEquSourcePrimeNodeOffset = jacLIDVec[map[2]][map2[2][1]];
6308 
6309  ASubstrateEquSubstrateNodeOffset = jacLIDVec[map[3]][map2[3][0]];
6310  ASubstrateEquTemperatureNodeOffset = jacLIDVec[map[3]][map2[3][1]];
6311  ASubstrateEquBodyNodeOffset = jacLIDVec[map[3]][map2[3][2]];
6312  ASubstrateEquDrainPrimeNodeOffset = jacLIDVec[map[3]][map2[3][3]];
6313  ASubstrateEquSourcePrimeNodeOffset = jacLIDVec[map[3]][map2[3][4]];
6314  ASubstrateEquGatePrimeNodeOffset = jacLIDVec[map[3]][map2[3][5]];
6315  ASubstrateEquGateMidNodeOffset = jacLIDVec[map[3]][map2[3][6]];
6316 
6317  ATemperatureEquSubstrateNodeOffset = jacLIDVec[map[4]][map2[4][0]];
6318  ATemperatureEquTemperatureNodeOffset = jacLIDVec[map[4]][map2[4][1]];
6319  ATemperatureEquBodyNodeOffset = jacLIDVec[map[4]][map2[4][2]];
6320  ATemperatureEquDrainPrimeNodeOffset = jacLIDVec[map[4]][map2[4][3]];
6321  ATemperatureEquSourcePrimeNodeOffset = jacLIDVec[map[4]][map2[4][4]];
6322  ATemperatureEquGatePrimeNodeOffset = jacLIDVec[map[4]][map2[4][5]];
6323 
6324  ABodyEquSubstrateNodeOffset = jacLIDVec[map[5]][map2[5][0]];
6325  ABodyEquTemperatureNodeOffset = jacLIDVec[map[5]][map2[5][1]];
6326  ABodyEquBodyNodeOffset = jacLIDVec[map[5]][map2[5][2]];
6327 
6328  ABodyEquExtBodyNodeOffset = jacLIDVec[map[5]][map2[5][3]];
6329  ABodyEquDrainPrimeNodeOffset = jacLIDVec[map[5]][map2[5][4]];
6330  ABodyEquSourcePrimeNodeOffset = jacLIDVec[map[5]][map2[5][5]];
6331  ABodyEquGatePrimeNodeOffset = jacLIDVec[map[5]][map2[5][6]];
6332 
6333  AExtBodyEquBodyNodeOffset = jacLIDVec[map[6]][map2[6][0]];
6334  AExtBodyEquExtBodyNodeOffset = jacLIDVec[map[6]][map2[6][1]];
6335 
6336  ADrainPrimeEquDrainNodeOffset = jacLIDVec[map[7]][map2[7][0]];
6337  ADrainPrimeEquSubstrateNodeOffset = jacLIDVec[map[7]][map2[7][1]];
6338  ADrainPrimeEquTemperatureNodeOffset = jacLIDVec[map[7]][map2[7][2]];
6339  ADrainPrimeEquBodyNodeOffset = jacLIDVec[map[7]][map2[7][3]];
6340  ADrainPrimeEquDrainPrimeNodeOffset = jacLIDVec[map[7]][map2[7][4]];
6341  ADrainPrimeEquSourcePrimeNodeOffset = jacLIDVec[map[7]][map2[7][5]];
6342  ADrainPrimeEquGatePrimeNodeOffset = jacLIDVec[map[7]][map2[7][6]];
6343  ADrainPrimeEquGateMidNodeOffset = jacLIDVec[map[7]][map2[7][7]];
6344 
6345  ASourcePrimeEquSourceNodeOffset = jacLIDVec[map[8]][map2[8][0]];
6346  ASourcePrimeEquSubstrateNodeOffset = jacLIDVec[map[8]][map2[8][1]];
6347  ASourcePrimeEquTemperatureNodeOffset = jacLIDVec[map[8]][map2[8][2]];
6348  ASourcePrimeEquBodyNodeOffset = jacLIDVec[map[8]][map2[8][3]];
6349  ASourcePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[8]][map2[8][4]];
6350  ASourcePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[8]][map2[8][5]];
6351  ASourcePrimeEquGatePrimeNodeOffset = jacLIDVec[map[8]][map2[8][6]];
6352  ASourcePrimeEquGateMidNodeOffset = jacLIDVec[map[8]][map2[8][7]];
6353 
6354  AGatePrimeEquGateNodeOffset = jacLIDVec[map[9]][map2[9][0]];
6355  AGatePrimeEquSubstrateNodeOffset = jacLIDVec[map[9]][map2[9][1]];
6356  AGatePrimeEquTemperatureNodeOffset = jacLIDVec[map[9]][map2[9][2]];
6357  AGatePrimeEquBodyNodeOffset = jacLIDVec[map[9]][map2[9][3]];
6358  AGatePrimeEquDrainPrimeNodeOffset = jacLIDVec[map[9]][map2[9][4]];
6359  AGatePrimeEquSourcePrimeNodeOffset = jacLIDVec[map[9]][map2[9][5]];
6360  AGatePrimeEquGatePrimeNodeOffset = jacLIDVec[map[9]][map2[9][6]];
6361  AGatePrimeEquGateMidNodeOffset = jacLIDVec[map[9]][map2[9][7]];
6362 
6363  AGateMidEquGateNodeOffset = jacLIDVec[map[10]][map2[10][0]];
6364  AGateMidEquSubstrateNodeOffset = jacLIDVec[map[10]][map2[10][1]];
6365  AGateMidEquBodyNodeOffset = jacLIDVec[map[10]][map2[10][2]];
6366  AGateMidEquDrainPrimeNodeOffset = jacLIDVec[map[10]][map2[10][3]];
6367  AGateMidEquSourcePrimeNodeOffset = jacLIDVec[map[10]][map2[10][4]];
6368  AGateMidEquGatePrimeNodeOffset = jacLIDVec[map[10]][map2[10][5]];
6369  AGateMidEquGateMidNodeOffset = jacLIDVec[map[10]][map2[10][6]];
6370 
6371  lastDrainIndex = 1;
6372  lastGateIndex = 5;
6373  lastBodyIndex = 6;
6374  lastSourceIndex = 1;
6375  lastSubstrateIndex = 6;
6376  lastExtBodyIndex = 1;
6377  lastRowUsed = 10;
6378  }
6379  else
6380  {
6381  std::string msg = "Instance::registerJacLIDs:";
6382  msg += "jacID out of supported range";
6383  N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, msg);
6384  }
6385 
6386  int extraVars = 0;
6387  if( icVDSGiven )
6388  {
6389  ++extraVars;
6390  ADrainEquIdsOffset = jacLIDVec[map[0]][map2[0][lastDrainIndex+1]];
6391  ASourceEquIdsOffset = jacLIDVec[map[2]][map2[2][lastSourceIndex+extraVars]];;
6392  icVDSEquVdOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][0]];
6393  icVDSEquVsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][1]];
6394  icVDSEquIdsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][2]];
6395  }
6396  if( icVGSGiven )
6397  {
6398  ++extraVars;
6399  AGateEquIgsOffset = jacLIDVec[map[1]][map2[1][lastGateIndex+1]];
6400  ASourceEquIgsOffset = jacLIDVec[map[2]][map2[2][lastSourceIndex+extraVars]];
6401  icVGSEquVgOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][0]];
6402  icVGSEquVsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][1]];
6403  icVGSEquIgsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][2]];
6404  }
6405  if( icVBSGiven )
6406  {
6407  ++extraVars;
6408  ABodyEquIbsOffset = jacLIDVec[map[5]][map2[5][lastBodyIndex+1]];
6409  ASourceEquIbsOffset = jacLIDVec[map[2]][map2[2][lastSourceIndex+extraVars]];
6410  icVBSEquVbOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][0]];
6411  icVBSEquVsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][1]];
6412  icVBSEquIbsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][2]];
6413  }
6414  if( icVESGiven )
6415  {
6416  ++extraVars;
6417  ASubstrateEquIesOffset = jacLIDVec[map[3]][map2[3][lastSubstrateIndex+1]];
6418  ASourceEquIesOffset = jacLIDVec[map[2]][map2[2][lastSourceIndex+extraVars]];
6419  icVESEquVeOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][0]];
6420  icVESEquVsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][1]];
6421  icVESEquIesOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][2]];
6422  }
6423  if( icVPSGiven )
6424  {
6425  ++extraVars;
6426  AExtBodyEquIpsOffset = jacLIDVec[map[4]][map2[4][lastExtBodyIndex+1]];
6427  ASourceEquIpsOffset = jacLIDVec[map[2]][map2[2][lastSourceIndex+extraVars]];
6428  icVPSEquVpOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][0]];
6429  icVPSEquVsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][1]];
6430  icVPSEquIpsOffset = jacLIDVec[map[lastRowUsed+extraVars]][map2[lastRowUsed+extraVars][2]];
6431  }
6432 
6433 }
6434 
6435 //-----------------------------------------------------------------------------
6436 // Function : Instance::setupPointers
6437 // Purpose :
6438 // Special Notes :
6439 // Scope : public
6440 // Creator : Eric Keiter, SNL
6441 // Creation Date : 01/07/09
6442 //-----------------------------------------------------------------------------
6444 {
6445 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
6446  N_LAS_Matrix & dFdx = *(extData.dFdxMatrixPtr);
6447  N_LAS_Matrix & dQdx = *(extData.dQdxMatrixPtr);
6448 
6449  // F-matrix:
6450  if (rgateMod == 1)
6451  {
6455  // It seems that this should be here, but it shouldn't.
6456  // The mi.geltd term is added into the G'-G' element later down in this
6457  // routine
6458  //
6459  // f_GatePrime][AGatePrimeEquGatePrimeNodePtr = &(dFdx[li_GatePrime][AGatePrimeEquGatePrimeNodeOffset]);
6460  }
6461  else if (rgateMod == 2)
6462  {
6468  if (soiMod != 2)
6470  }
6471  else if (rgateMod == 3)
6472  {
6480 
6481  if (soiMod != 2)
6482  {
6484  }
6485 
6487  }
6488  if (soiMod != 0)
6489  {
6492  if (soiMod != 2)
6493  {
6496  }
6497  }
6498 
6499  if (soiMod != 2)
6500  {
6501  if (rgateMod == 0 || rgateMod == 1)
6502  {
6504  }
6505  else
6506  {
6508  }
6516  }
6517  if (rgateMod == 0)
6518  {
6522  }
6523  else if (rgateMod == 1)
6524  {
6528  }
6529  else
6530  {
6534  }
6547  if (bodyMod == 1)
6548  {
6552  }
6553  if (selfheat)
6554  {
6557 
6563  if (soiMod != 0)
6564  {
6566  }
6567  if (bNode > 0)
6568  {
6571  }
6572  }
6573  if( icVDSGiven )
6574  {
6575 
6576 
6581 
6582 
6583 
6585 
6586  }
6587 
6588  if( icVGSGiven )
6589  {
6590 
6591 
6596 
6597 
6598 
6600 
6601  }
6602 
6603  if( icVBSGiven )
6604  {
6605 
6606 
6611 
6612 
6613 
6615 
6616  }
6617 
6618  if( icVESGiven )
6619  {
6620 
6621 
6626 
6627 
6628 
6630 
6631  }
6632 
6633  if( icVPSGiven )
6634  {
6635 
6636 
6641 
6642 
6643 
6645 
6646  }
6647 
6648 
6649  // Q-matrix:
6650  if (rgateMod == 3)
6651  {
6654 
6657 
6659 
6662  }
6663 
6665 
6670  if (soiMod != 2)
6671  {
6673  if (rgateMod == 0 || rgateMod == 1)
6674  {
6676  }
6677  else
6678  {
6680  }
6688  }
6690  if (rgateMod == 0)
6691  {
6695  }
6696  else if (rgateMod == 1)
6697  {
6701  }
6702  else
6703  {
6707  }
6711 
6715 
6716  if (selfheat)
6717  {
6723 
6724  if (bNode > 0)
6725  {
6727  }
6728  }
6729 #endif
6730 }
6731 
6732 //-----------------------------------------------------------------------------
6733 // Function : Instance::updateTemperature
6734 // Purpose : This updates all the instance-owned paramters which
6735 // are temperature dependent.
6736 //
6737 // Special Notes :
6738 // Scope : public
6739 // Creator : Dave Shirley
6740 // Creation Date : 05/20/04
6741 //-----------------------------------------------------------------------------
6742 bool Instance::updateTemperature (const double & temp_tmp)
6743 {
6744 
6745 double tmp, tmp1, tmp2, T0, T1, T2, T3, T4, T5, Ldrn, Wdrn;
6746 double TempRatio, Inv_L, Inv_W, Inv_LW, Tnom;
6747 double SDphi, SDgamma;
6748 double tmp3, T7, Eg;
6749 
6750 #ifdef Xyce_DEBUG_DEVICE
6751  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
6752  {
6753  Xyce::dout() << std::endl << subsection_divider << std::endl;
6754  Xyce::dout() << "Instance::updateTemperature\n";
6755  Xyce::dout() << "name = " << getName() << std::endl;
6756  }
6757 #endif
6758 
6759  // first set the instance temperature to the new temperature:
6760  if (temp_tmp != -999.0) temp = temp_tmp;
6761 
6763  {
6764  // make sure interpolation doesn't take any resistance negative
6765  if (model_.sheetResistance < 0.0) model_.sheetResistance = 0.0;
6766  if (model_.rshg < 0.0) model_.rshg = 0.0;
6767 
6768  // some params may have changed during interpolation
6770  }
6771 
6772  Tnom = model_.tnom;
6773  TempRatio = temp/Tnom;
6774 
6775  vtm = CONSTKoverQ * temp;
6776  Eg = 1.16 - 7.02e-4 * temp * temp / (temp + 1108.0);
6777  ni = CONSTNi0 * (temp / CONSTREFTEMP) * sqrt(temp / CONSTREFTEMP)
6778  * exp(21.5565981 - Eg / (2.0 * vtm));
6779 
6781 
6782 #ifdef REUSE_PARAMPTR
6783  // This next block determines whether or not to use the model
6784  // size dependent parameters, or those of the instance. If we are
6785  // using the instance, we may have to allocate the structure.
6786 
6787  std::list<SizeDependParam*>::iterator it_dpL =
6788  model_.sizeDependParamList.begin();
6789  std::list<SizeDependParam*>::iterator end_dpL =
6791 
6792  paramPtr = NULL;
6793 
6794  for( ; it_dpL != end_dpL; ++it_dpL ) {
6795  if( (*it_dpL)->Length == l && (*it_dpL)->Width == w &&
6796  (*it_dpL)->Rth0 == rth0 && (*it_dpL)->Cth0 == cth0) {
6797  paramPtr = (*it_dpL);
6798  break;
6799  }
6800  }
6801 
6802  if ( paramPtr != NULL )
6803  {
6804  }
6805  else
6806  {
6807  paramPtr = new SizeDependParam ();
6808 
6809  model_.sizeDependParamList.push_back( paramPtr );
6810 #else
6811  if (paramPtr == static_cast<SizeDependParam *> (NULL))
6812  paramPtr = new SizeDependParam ();
6813 #endif
6814 
6815  paramPtr->referenceTemperature = temp_tmp;
6816 
6817  Ldrn = l;
6818  Wdrn = w;
6819  paramPtr->Length = Ldrn;
6820  paramPtr->Width = Wdrn;
6821  paramPtr->Rth0 = rth0;
6822  paramPtr->Cth0 = cth0;
6823 
6824  T0 = pow(Ldrn, model_.Lln);
6825  T1 = pow(Wdrn, model_.Lwn);
6826  tmp1 = model_.Ll / T0 + model_.Lw / T1
6827  + model_.Lwl / (T0 * T1);
6828  paramPtr->dl = model_.Lint + tmp1;
6829 
6830 // v2.2.3
6831  tmp1 = model_.Llc / T0 + model_.Lwc / T1
6832  + model_.Lwlc / (T0 * T1);
6833  paramPtr->dlc = model_.dlc + tmp1;
6834 
6835 // v3.0
6836  paramPtr->dlcig = model_.dlcig + tmp1;
6837 
6838 
6839  T2 = pow(Ldrn, model_.Wln);
6840  T3 = pow(Wdrn, model_.Wwn);
6841  tmp2 = model_.Wl / T2 + model_.Ww / T3
6842  + model_.Wwl / (T2 * T3);
6843  paramPtr->dw = model_.Wint + tmp2;
6844 
6845 // v2.2.3
6846  tmp2 = model_.Wlc / T2 + model_.Wwc / T3
6847  + model_.Wwlc / (T2 * T3);
6848  paramPtr->dwc = model_.dwc + tmp2;
6849 
6850 
6851  paramPtr->leff = l - 2.0 * paramPtr->dl;
6852  if (paramPtr->leff <= 0.0)
6853  {
6854  UserError0(*this) << "Effective channel length <= 0";
6855  }
6856 
6857  paramPtr->weff = w - nbc * model_.dwbc
6858  - (2.0 - nbc) * paramPtr->dw;
6859  if (paramPtr->weff <= 0.0)
6860  {
6861  UserError0(*this) << "Effective channel width <= 0";
6862  }
6863 
6866 
6867  paramPtr->leffCV = l - 2.0 * paramPtr->dlc;
6868  if (paramPtr->leffCV <= 0.0)
6869  {
6870  UserError0(*this) << "Effective channel length for C-V <= 0";
6871  }
6872 
6873  paramPtr->weffCV = w - nbc * model_.dwbc
6874  - (2.0 - nbc) * paramPtr->dwc;
6875  if (paramPtr->weffCV <= 0.0)
6876  {
6877  UserError0(*this) << "Effective channel width for C-V <= 0";
6878  }
6879 
6882 
6883  paramPtr->leffCVb = l - 2.0 * paramPtr->dlc - model_.dlcb;
6884  if (paramPtr->leffCVb <= 0.0)
6885  {
6886  UserError0(*this) << "Effective channel length for C-V (body) <= 0";
6887  }
6888 
6890  if (paramPtr->leffCVbg <= 0.0)
6891  {
6892  UserError0(*this) << "Effective channel length for C-V (backgate) <= 0";
6893  }
6894 
6895 
6896  /* Not binned - START */
6899  paramPtr->vbx = model_.vbx;
6900  paramPtr->vbm = model_.vbm;
6901  paramPtr->xt = model_.xt;
6902  /* Not binned - END */
6903 
6904  /* CV model */
6905  paramPtr->cf = model_.cf;
6906  paramPtr->clc = model_.clc;
6907  paramPtr->cle = model_.cle;
6908 
6909  paramPtr->abulkCVfactor = 1.0 + pow((paramPtr->clc / paramPtr->leff),
6910  paramPtr->cle);
6911 
6912  /* Added for binning - START */
6913  if (model_.binUnit == 1)
6914  { Inv_L = 1.0e-6 / paramPtr->leff;
6915  Inv_W = 1.0e-6 / paramPtr->weff;
6916  Inv_LW = 1.0e-12 / (paramPtr->leff
6917  * paramPtr->weff);
6918  }
6919  else
6920  { Inv_L = 1.0 / paramPtr->leff;
6921  Inv_W = 1.0 / paramPtr->weff;
6922  Inv_LW = 1.0 / (paramPtr->leff
6923  * paramPtr->weff);
6924  }
6926  + model_.lnpeak * Inv_L
6927  + model_.wnpeak * Inv_W
6928  + model_.pnpeak * Inv_LW;
6930  + model_.lnsub * Inv_L
6931  + model_.wnsub * Inv_W
6932  + model_.pnsub * Inv_LW;
6934  + model_.lngate * Inv_L
6935  + model_.wngate * Inv_W
6936  + model_.pngate * Inv_LW;
6938  + model_.lvth0 * Inv_L
6939  + model_.wvth0 * Inv_W
6940  + model_.pvth0 * Inv_LW;
6941  paramPtr->k1 = model_.k1
6942  + model_.lk1 * Inv_L
6943  + model_.wk1 * Inv_W
6944  + model_.pk1 * Inv_LW;
6945  paramPtr->k2 = model_.k2
6946  + model_.lk2 * Inv_L
6947  + model_.wk2 * Inv_W
6948  + model_.pk2 * Inv_LW;
6950  + model_.lk1w1 * Inv_L
6951  + model_.wk1w1 * Inv_W
6952  + model_.pk1w1 * Inv_LW;
6954  + model_.lk1w2 * Inv_L
6955  + model_.wk1w2 * Inv_W
6956  + model_.pk1w2 * Inv_LW;
6957  paramPtr->k3 = model_.k3
6958  + model_.lk3 * Inv_L
6959  + model_.wk3 * Inv_W
6960  + model_.pk3 * Inv_LW;
6961  paramPtr->k3b = model_.k3b
6962  + model_.lk3b * Inv_L
6963  + model_.wk3b * Inv_W
6964  + model_.pk3b * Inv_LW;
6965  paramPtr->kb1 = model_.kb1
6966  + model_.lkb1 * Inv_L
6967  + model_.wkb1 * Inv_W
6968  + model_.pkb1 * Inv_LW;
6969  paramPtr->w0 = model_.w0
6970  + model_.lw0 * Inv_L
6971  + model_.ww0 * Inv_W
6972  + model_.pw0 * Inv_LW;
6973  paramPtr->nlx = model_.nlx
6974  + model_.lnlx * Inv_L
6975  + model_.wnlx * Inv_W
6976  + model_.pnlx * Inv_LW;
6978  + model_.ldvt0 * Inv_L
6979  + model_.wdvt0 * Inv_W
6980  + model_.pdvt0 * Inv_LW;
6982  + model_.ldvt1 * Inv_L
6983  + model_.wdvt1 * Inv_W
6984  + model_.pdvt1 * Inv_LW;
6986  + model_.ldvt2 * Inv_L
6987  + model_.wdvt2 * Inv_W
6988  + model_.pdvt2 * Inv_LW;
6990  + model_.ldvt0w * Inv_L
6991  + model_.wdvt0w * Inv_W
6992  + model_.pdvt0w * Inv_LW;
6994  + model_.ldvt1w * Inv_L
6995  + model_.wdvt1w * Inv_W
6996  + model_.pdvt1w * Inv_LW;
6998  + model_.ldvt2w * Inv_L
6999  + model_.wdvt2w * Inv_W
7000  + model_.pdvt2w * Inv_LW;
7001  paramPtr->u0 = model_.u0
7002  + model_.lu0 * Inv_L
7003  + model_.wu0 * Inv_W
7004  + model_.pu0 * Inv_LW;
7005  paramPtr->ua = model_.ua
7006  + model_.lua * Inv_L
7007  + model_.wua * Inv_W
7008  + model_.pua * Inv_LW;
7009  paramPtr->ub = model_.ub
7010  + model_.lub * Inv_L
7011  + model_.wub * Inv_W
7012  + model_.pub * Inv_LW;
7013  paramPtr->uc = model_.uc
7014  + model_.luc * Inv_L
7015  + model_.wuc * Inv_W
7016  + model_.puc * Inv_LW;
7018  + model_.lvsat * Inv_L
7019  + model_.wvsat * Inv_W
7020  + model_.pvsat * Inv_LW;
7021  paramPtr->a0 = model_.a0
7022  + model_.la0 * Inv_L
7023  + model_.wa0 * Inv_W
7024  + model_.pa0 * Inv_LW;
7025  paramPtr->ags = model_.ags
7026  + model_.lags * Inv_L
7027  + model_.wags * Inv_W
7028  + model_.pags * Inv_LW;
7029  paramPtr->b0 = model_.b0
7030  + model_.lb0 * Inv_L
7031  + model_.wb0 * Inv_W
7032  + model_.pb0 * Inv_LW;
7033  paramPtr->b1 = model_.b1
7034  + model_.lb1 * Inv_L
7035  + model_.wb1 * Inv_W
7036  + model_.pb1 * Inv_LW;
7038  + model_.lketa * Inv_L
7039  + model_.wketa * Inv_W
7040  + model_.pketa * Inv_LW;
7042  + model_.lketas * Inv_L
7043  + model_.wketas * Inv_W
7044  + model_.pketas * Inv_LW;
7045  paramPtr->a1 = model_.a1
7046  + model_.la1 * Inv_L
7047  + model_.wa1 * Inv_W
7048  + model_.pa1 * Inv_LW;
7049  paramPtr->a2 = model_.a2
7050  + model_.la2 * Inv_L
7051  + model_.wa2 * Inv_W
7052  + model_.pa2 * Inv_LW;
7054  + model_.lrdsw * Inv_L
7055  + model_.wrdsw * Inv_W
7056  + model_.prdsw * Inv_LW;
7058  + model_.lprwb * Inv_L
7059  + model_.wprwb * Inv_W
7060  + model_.pprwb * Inv_LW;
7062  + model_.lprwg * Inv_L
7063  + model_.wprwg * Inv_W
7064  + model_.pprwg * Inv_LW;
7065  paramPtr->wr = model_.wr
7066  + model_.lwr * Inv_L
7067  + model_.wwr * Inv_W
7068  + model_.pwr * Inv_LW;
7070  + model_.lnfactor * Inv_L
7071  + model_.wnfactor * Inv_W
7072  + model_.pnfactor * Inv_LW;
7073  paramPtr->dwg = model_.dwg
7074  + model_.ldwg * Inv_L
7075  + model_.wdwg * Inv_W
7076  + model_.pdwg * Inv_LW;
7077  paramPtr->dwb = model_.dwb
7078  + model_.ldwb * Inv_L
7079  + model_.wdwb * Inv_W
7080  + model_.pdwb * Inv_LW;
7082  + model_.lvoff * Inv_L
7083  + model_.wvoff * Inv_W
7084  + model_.pvoff * Inv_LW;
7086  + model_.leta0 * Inv_L
7087  + model_.weta0 * Inv_W
7088  + model_.peta0 * Inv_LW;
7090  + model_.letab * Inv_L
7091  + model_.wetab * Inv_W
7092  + model_.petab * Inv_LW;
7094  + model_.ldsub * Inv_L
7095  + model_.wdsub * Inv_W
7096  + model_.pdsub * Inv_LW;
7097  paramPtr->cit = model_.cit
7098  + model_.lcit * Inv_L
7099  + model_.wcit * Inv_W
7100  + model_.pcit * Inv_LW;
7102  + model_.lcdsc * Inv_L
7103  + model_.wcdsc * Inv_W
7104  + model_.pcdsc * Inv_LW;
7106  + model_.lcdscb * Inv_L
7107  + model_.wcdscb * Inv_W
7108  + model_.pcdscb * Inv_LW;
7110  + model_.lcdscd * Inv_L
7111  + model_.wcdscd * Inv_W
7112  + model_.pcdscd * Inv_LW;
7114  + model_.lpclm * Inv_L
7115  + model_.wpclm * Inv_W
7116  + model_.ppclm * Inv_LW;
7118  + model_.lpdibl1 * Inv_L
7119  + model_.wpdibl1 * Inv_W
7120  + model_.ppdibl1 * Inv_LW;
7122  + model_.lpdibl2 * Inv_L
7123  + model_.wpdibl2 * Inv_W
7124  + model_.ppdibl2 * Inv_LW;
7126  + model_.lpdiblb * Inv_L
7127  + model_.wpdiblb * Inv_W
7128  + model_.ppdiblb * Inv_LW;
7130  + model_.ldrout * Inv_L
7131  + model_.wdrout * Inv_W
7132  + model_.pdrout * Inv_LW;
7134  + model_.lpvag * Inv_L
7135  + model_.wpvag * Inv_W
7136  + model_.ppvag * Inv_LW;
7138  + model_.ldelta * Inv_L
7139  + model_.wdelta * Inv_W
7140  + model_.pdelta * Inv_LW;
7142  + model_.lalpha0 * Inv_L
7143  + model_.walpha0 * Inv_W
7144  + model_.palpha0 * Inv_LW;
7146  + model_.lfbjtii * Inv_L
7147  + model_.wfbjtii * Inv_W
7148  + model_.pfbjtii * Inv_LW;
7150  + model_.lbeta0 * Inv_L
7151  + model_.wbeta0 * Inv_W
7152  + model_.pbeta0 * Inv_LW;
7154  + model_.lbeta1 * Inv_L
7155  + model_.wbeta1 * Inv_W
7156  + model_.pbeta1 * Inv_LW;
7158  + model_.lbeta2 * Inv_L
7159  + model_.wbeta2 * Inv_W
7160  + model_.pbeta2 * Inv_LW;
7162  + model_.lvdsatii0 * Inv_L
7163  + model_.wvdsatii0 * Inv_W
7164  + model_.pvdsatii0 * Inv_LW;
7165  paramPtr->lii = model_.lii
7166  + model_.llii * Inv_L
7167  + model_.wlii * Inv_W
7168  + model_.plii * Inv_LW;
7170  + model_.lesatii * Inv_L
7171  + model_.wesatii * Inv_W
7172  + model_.pesatii * Inv_LW;
7174  + model_.lsii0 * Inv_L
7175  + model_.wsii0 * Inv_W
7176  + model_.psii0 * Inv_LW;
7178  + model_.lsii1 * Inv_L
7179  + model_.wsii1 * Inv_W
7180  + model_.psii1 * Inv_LW;
7182  + model_.lsii2 * Inv_L
7183  + model_.wsii2 * Inv_W
7184  + model_.psii2 * Inv_LW;
7186  + model_.lsiid * Inv_L
7187  + model_.wsiid * Inv_W
7188  + model_.psiid * Inv_LW;
7190  + model_.lagidl * Inv_L
7191  + model_.wagidl * Inv_W
7192  + model_.pagidl * Inv_LW;
7194  + model_.lbgidl * Inv_L
7195  + model_.wbgidl * Inv_W
7196  + model_.pbgidl * Inv_LW;
7198  + model_.lngidl * Inv_L
7199  + model_.wngidl * Inv_W
7200  + model_.pngidl * Inv_LW;
7202  + model_.lntun * Inv_L
7203  + model_.wntun * Inv_W
7204  + model_.pntun * Inv_LW;
7206  + model_.lndiode * Inv_L
7207  + model_.wndiode * Inv_W
7208  + model_.pndiode * Inv_LW;
7210  + model_.lnrecf0 * Inv_L
7211  + model_.wnrecf0 * Inv_W
7212  + model_.pnrecf0 * Inv_LW;
7214  + model_.lnrecr0 * Inv_L
7215  + model_.wnrecr0 * Inv_W
7216  + model_.pnrecr0 * Inv_LW;
7218  + model_.lisbjt * Inv_L
7219  + model_.wisbjt * Inv_W
7220  + model_.pisbjt * Inv_LW;
7222  + model_.lisdif * Inv_L
7223  + model_.wisdif * Inv_W
7224  + model_.pisdif * Inv_LW;
7226  + model_.lisrec * Inv_L
7227  + model_.wisrec * Inv_W
7228  + model_.pisrec * Inv_LW;
7230  + model_.listun * Inv_L
7231  + model_.wistun * Inv_W
7232  + model_.pistun * Inv_LW;
7234  + model_.lvrec0 * Inv_L
7235  + model_.wvrec0 * Inv_W
7236  + model_.pvrec0 * Inv_LW;
7238  + model_.lvtun0 * Inv_L
7239  + model_.wvtun0 * Inv_W
7240  + model_.pvtun0 * Inv_LW;
7242  + model_.lnbjt * Inv_L
7243  + model_.wnbjt * Inv_W
7244  + model_.pnbjt * Inv_LW;
7246  + model_.llbjt0 * Inv_L
7247  + model_.wlbjt0 * Inv_W
7248  + model_.plbjt0 * Inv_LW;
7250  + model_.lvabjt * Inv_L
7251  + model_.wvabjt * Inv_W
7252  + model_.pvabjt * Inv_LW;
7254  + model_.laely * Inv_L
7255  + model_.waely * Inv_W
7256  + model_.paely * Inv_LW;
7258  + model_.lahli * Inv_L
7259  + model_.wahli * Inv_W
7260  + model_.pahli * Inv_LW;
7261 
7262 
7263  paramPtr->xj = model_.xj
7264  + model_.lxj * Inv_L
7265  + model_.wxj * Inv_W
7266  + model_.pxj * Inv_LW;
7268  + model_.lalphaGB1 * Inv_L
7269  + model_.walphaGB1 * Inv_W
7270  + model_.palphaGB1 * Inv_LW;
7272  + model_.lalphaGB2 * Inv_L
7273  + model_.walphaGB2 * Inv_W
7274  + model_.palphaGB2 * Inv_LW;
7276  + model_.lbetaGB1* Inv_L
7277  + model_.wbetaGB1 * Inv_W
7278  + model_.pbetaGB1 * Inv_LW;
7280  + model_.lbetaGB2 * Inv_L
7281  + model_.wbetaGB2 * Inv_W
7282  + model_.pbetaGB2 * Inv_LW;
7284  + model_.lndif * Inv_L
7285  + model_.wndif * Inv_W
7286  + model_.pndif * Inv_LW;
7288  + model_.lntrecf* Inv_L
7289  + model_.wntrecf * Inv_W
7290  + model_.pntrecf * Inv_LW;
7292  + model_.lntrecr * Inv_L
7293  + model_.wntrecr * Inv_W
7294  + model_.pntrecr * Inv_LW;
7296  + model_.lxbjt * Inv_L
7297  + model_.wxbjt * Inv_W
7298  + model_.pxbjt * Inv_LW;
7300  + model_.lxdif* Inv_L
7301  + model_.wxdif * Inv_W
7302  + model_.pxdif * Inv_LW;
7304  + model_.lxrec * Inv_L
7305  + model_.wxrec * Inv_W
7306  + model_.pxrec * Inv_LW;
7308  + model_.lxtun * Inv_L
7309  + model_.wxtun * Inv_W
7310  + model_.pxtun * Inv_LW;
7312  + model_.lcgdl * Inv_L
7313  + model_.wcgdl * Inv_W
7314  + model_.pcgdl * Inv_LW;
7316  + model_.lcgsl * Inv_L
7317  + model_.wcgsl * Inv_W
7318  + model_.pcgsl * Inv_LW;
7320  + model_.lckappa * Inv_L
7321  + model_.wckappa * Inv_W
7322  + model_.pckappa * Inv_LW;
7323  paramPtr->ute = model_.ute
7324  + model_.lute * Inv_L
7325  + model_.wute * Inv_W
7326  + model_.pute * Inv_LW;
7327  paramPtr->kt1 = model_.kt1
7328  + model_.lkt1 * Inv_L
7329  + model_.wkt1 * Inv_W
7330  + model_.pkt1 * Inv_LW;
7331  paramPtr->kt2 = model_.kt2
7332  + model_.lkt2 * Inv_L
7333  + model_.wkt2 * Inv_W
7334  + model_.pkt2 * Inv_LW;
7336  + model_.lkt1l * Inv_L
7337  + model_.wkt1l * Inv_W
7338  + model_.pkt1l * Inv_LW;
7339  paramPtr->ua1 = model_.ua1
7340  + model_.lua1 * Inv_L
7341  + model_.wua1 * Inv_W
7342  + model_.pua1 * Inv_LW;
7343  paramPtr->ub1 = model_.ub1
7344  + model_.lub1* Inv_L
7345  + model_.wub1 * Inv_W
7346  + model_.pub1 * Inv_LW;
7347  paramPtr->uc1 = model_.uc1
7348  + model_.luc1 * Inv_L
7349  + model_.wuc1 * Inv_W
7350  + model_.puc1 * Inv_LW;
7351  paramPtr->at = model_.at
7352  + model_.lat * Inv_L
7353  + model_.wat * Inv_W
7354  + model_.pat * Inv_LW;
7355  paramPtr->prt = model_.prt
7356  + model_.lprt * Inv_L
7357  + model_.wprt * Inv_W
7358  + model_.pprt * Inv_LW;
7359 
7360 
7362  + model_.lnigc * Inv_L
7363  + model_.wnigc * Inv_W
7364  + model_.pnigc * Inv_LW;
7366  + model_.laigc * Inv_L
7367  + model_.waigc * Inv_W
7368  + model_.paigc * Inv_LW;
7370  + model_.lbigc * Inv_L
7371  + model_.wbigc * Inv_W
7372  + model_.pbigc * Inv_LW;
7374  + model_.lcigc * Inv_L
7375  + model_.wcigc * Inv_W
7376  + model_.pcigc * Inv_LW;
7378  + model_.laigsd * Inv_L
7379  + model_.waigsd * Inv_W
7380  + model_.paigsd * Inv_LW;
7382  + model_.lbigsd * Inv_L
7383  + model_.wbigsd * Inv_W
7384  + model_.pbigsd * Inv_LW;
7386  + model_.lcigsd * Inv_L
7387  + model_.wcigsd * Inv_W
7388  + model_.pcigsd * Inv_LW;
7390  + model_.lpigcd * Inv_L
7391  + model_.wpigcd * Inv_W
7392  + model_.ppigcd * Inv_LW;
7394  + model_.lpoxedge * Inv_L
7395  + model_.wpoxedge * Inv_W
7396  + model_.ppoxedge * Inv_LW;
7397 // v3.0
7398 
7399 // v3.1 wanh added for RF
7401  + model_.lxrcrg1 * Inv_L
7402  + model_.wxrcrg1 * Inv_W
7403  + model_.pxrcrg1 * Inv_LW;
7405  + model_.lxrcrg2 * Inv_L
7406  + model_.wxrcrg2 * Inv_W
7407  + model_.pxrcrg2 * Inv_LW;
7408 // v3.1 wanh added for RF end
7409 
7410 
7411  // CV model
7413  + model_.lvsdfb * Inv_L
7414  + model_.wvsdfb * Inv_W
7415  + model_.pvsdfb * Inv_LW;
7417  + model_.lvsdth * Inv_L
7418  + model_.wvsdth * Inv_W
7419  + model_.pvsdth * Inv_LW;
7421  + model_.ldelvt * Inv_L
7422  + model_.wdelvt * Inv_W
7423  + model_.pdelvt * Inv_LW;
7425  + model_.lacde * Inv_L
7426  + model_.wacde * Inv_W
7427  + model_.pacde * Inv_LW;
7428  paramPtr->acde = paramPtr->acde *
7429  pow((paramPtr->npeak / 2.0e16), -0.25);
7430  // v3.2 bug fix
7431 
7433  + model_.lmoin * Inv_L
7434  + model_.wmoin * Inv_W
7435  + model_.pmoin * Inv_LW;
7437  + model_.lnoff * Inv_L
7438  + model_.wnoff * Inv_W
7439  + model_.pnoff * Inv_LW; // v3.2
7440  /* Added for binning - END */
7441 
7442  T0 = (TempRatio - 1.0);
7443 
7444  paramPtr->uatemp = paramPtr->ua; /* save ua, ub, and uc for b3soild.c */
7445  paramPtr->ubtemp = paramPtr->ub;
7446  paramPtr->uctemp = paramPtr->uc;
7447  paramPtr->rds0denom = pow(paramPtr->weff * 1E6, paramPtr->wr);
7448 
7449 
7450 /* v2.2 release */
7452  * nseg;
7454  / nseg;
7455 
7456 /* v2.2.2 adding layout-dependent Frbody multiplier */
7458  / (2 * model_.rbody + model_.rhalo * paramPtr->leff)
7459  * paramPtr->weff / nseg;
7460 
7462  model_.ntox) /
7464 /* v2.2 release */
7465 
7466 
7467  paramPtr->ua = paramPtr->ua + paramPtr->ua1 * T0;
7468  paramPtr->ub = paramPtr->ub + paramPtr->ub1 * T0;
7469  paramPtr->uc = paramPtr->uc + paramPtr->uc1 * T0;
7470  if (paramPtr->u0 > 1.0)
7471  paramPtr->u0 = paramPtr->u0 / 1.0e4;
7472 
7474  * pow(TempRatio, paramPtr->ute);
7476  * T0;
7477  paramPtr->rds0 = (paramPtr->rdsw + paramPtr->prt * T0)
7478  / pow(paramPtr->weff * 1E6, paramPtr->wr);
7479 
7480  if (!checkModel ())
7481  {
7482  UserError0(*this) << "Problem detected during B3SOIV3 parameter check";
7483  }
7484 
7486  * paramPtr->wdiodCV;
7488  * paramPtr->wdiosCV;
7489 
7491  * paramPtr->leffCV;
7492 
7493 
7495  { T0 = paramPtr->gamma1 * model_.cox;
7496  paramPtr->npeak = 3.021E22 * T0 * T0;
7497  }
7498 
7499 
7500  T4 = CONSTEg300 / vtm * (TempRatio - 1.0);
7501  T7 = paramPtr->xbjt * T4 / paramPtr->ndiode;
7502  DEXP(T7, T0);
7503  T7 = paramPtr->xdif * T4 / paramPtr->ndiode;
7504  DEXP(T7, T1);
7505  T7 = paramPtr->xrec * T4 / paramPtr->nrecf0;
7506  DEXP(T7, T2);
7507 
7508  /* v2.2.2 bug fix */
7509  paramPtr->ahli0 = paramPtr->ahli * T0;
7510 
7511  paramPtr->jbjt = paramPtr->isbjt * T0;
7512  paramPtr->jdif = paramPtr->isdif * T1;
7513  paramPtr->jrec = paramPtr->isrec * T2;
7514 
7515  T7 = paramPtr->xtun * (TempRatio - 1);
7516  DEXP(T7, T0);
7517  paramPtr->jtun = paramPtr->istun * T0;
7518 
7519 
7520  if (paramPtr->nsub > 0)
7521  paramPtr->vfbb = -model_.dtype * vtm *
7522  log(paramPtr->npeak/ paramPtr->nsub);
7523  else
7524  paramPtr->vfbb = -model_.dtype * vtm *
7525  log(-paramPtr->npeak* paramPtr->nsub/
7526  (ni*ni));
7527 
7528  if (!model_.vsdfbGiven)
7529  {
7530  if (paramPtr->nsub > 0)
7531  paramPtr->vsdfb = -model_.dtype * (vtm*log(1e20 *
7532  paramPtr->nsub /
7533  (ni*ni)) - 0.3);
7534  else if (paramPtr->nsub < 0)
7535  paramPtr->vsdfb = -model_.dtype * (vtm*log(-1e20 /
7536  paramPtr->nsub) + 0.3);
7537  }
7538 
7539  /* Phi & Gamma */
7540  SDphi = 2.0*vtm*log(fabs(paramPtr->nsub) / ni);
7541  SDgamma = 5.753e-12 * sqrt(fabs(paramPtr->nsub)) / model_.cbox;
7542 
7543  if (!model_.vsdthGiven)
7544  {
7545  if ( ((paramPtr->nsub > 0) && (model_.dtype > 0)) ||
7546  ((paramPtr->nsub < 0) && (model_.dtype < 0)) )
7547  paramPtr->vsdth = paramPtr->vsdfb + SDphi +
7548  SDgamma * sqrt(SDphi);
7549  else
7550  paramPtr->vsdth = paramPtr->vsdfb - SDphi -
7551  SDgamma * sqrt(SDphi);
7552  }
7553 
7554  if (!model_.csdminGiven)
7555  {
7556  /* Cdmin */
7557  tmp = sqrt(2.0 * CONSTEPSSI * SDphi / (CONSTQ *
7558  fabs(paramPtr->nsub) * 1.0e6));
7559  tmp1 = CONSTEPSSI / tmp;
7560  model_.csdmin = tmp1 * model_.cbox /
7561  (tmp1 + model_.cbox);
7562  }
7563 
7564 
7565  paramPtr->phi = 2.0 * vtm * log(paramPtr->npeak / ni);
7566 
7567  paramPtr->sqrtPhi = sqrt(paramPtr->phi);
7569 
7570  paramPtr->Xdep0 = sqrt(2.0 * CONSTEPSSI / (CONSTQ
7571  * paramPtr->npeak * 1.0e6))
7572  * paramPtr->sqrtPhi;
7573  paramPtr->sqrtXdep0 = sqrt(paramPtr->Xdep0);
7574  paramPtr->litl = sqrt(3.0 * paramPtr->xj
7575  * model_.tox);
7576  paramPtr->vbi = vtm * log(1.0e20
7577  * paramPtr->npeak / (ni*ni));
7578  paramPtr->cdep0 = sqrt(CONSTQ * CONSTEPSSI
7579  * paramPtr->npeak * 1.0e6 / 2.0
7580  / paramPtr->phi);
7581 
7582 // v3.0
7583  if (paramPtr->ngate > 0.0)
7584  { paramPtr->vfbsd = model_.Vtm0 * log(paramPtr->ngate
7585  / 1.0e20);
7586  }
7587  else
7588  paramPtr->vfbsd = 0.0;
7589 
7590  paramPtr->ToxRatio = exp(model_.ntox
7591  * log(model_.toxref /model_.toxqm))
7594  * log(model_.toxref
7595  / (model_.toxqm * paramPtr->poxedge)))
7596  / model_.toxqm / model_.toxqm
7598  paramPtr->Aechvb = (model_.dtype==CONSTNMOS)?4.97232e-7:3.42537e-7;
7599  paramPtr->Bechvb = (model_.dtype==CONSTNMOS)?7.45669e11:1.16645e12;
7601  * paramPtr->dlcig * paramPtr->ToxRatioEdge; // v3.1 bug fix
7605  * paramPtr->ToxRatio; // v3.1 bug fix
7606  paramPtr->Bechvb *= -model_.toxqm;
7607 // v3.0
7608 
7609  if (model_.k1Given || model_.k2Given)
7610  {
7611  if (!model_.k1Given)
7612  {
7613  UserWarning(*this) << "k1 should be specified with k2.";
7614 
7615  paramPtr->k1 = 0.53;
7616  }
7617  if (!model_.k2Given)
7618  {
7619  UserWarning(*this) << "k2 should be specified with k1.";
7620  paramPtr->k2 = -0.0186;
7621  }
7622  if (model_.xtGiven)
7623  {
7624  UserWarning(*this) << "xt is ignored because k1 or k2 is given.";
7625  }
7626  if (model_.vbxGiven)
7627  {
7628  UserWarning(*this) << "vbx is ignored because k1 or k2 is given.";
7629  }
7630  if (model_.vbmGiven)
7631  {
7632  UserWarning(*this) << "vbm is ignored because k1 or k2 is given.";
7633  }
7634  if (model_.gamma1Given)
7635  {
7636  UserWarning(*this) << "gamma1 ignored because k1 or k2 is given.";
7637  }
7638  if (model_.gamma2Given)
7639  {
7640  UserWarning(*this) << "gamma2 ignored because k1 or k2 is given.";
7641  }
7642  }
7643  else
7644  {
7645  if (!model_.vbxGiven)
7646  paramPtr->vbx = paramPtr->phi - 7.7348e-4
7647  * paramPtr->npeak
7648  * paramPtr->xt * paramPtr->xt;
7649  if (paramPtr->vbx > 0.0)
7650  paramPtr->vbx = -paramPtr->vbx;
7651  if (paramPtr->vbm > 0.0)
7652  paramPtr->vbm = -paramPtr->vbm;
7653 
7654  if (!model_.gamma1Given)
7655  paramPtr->gamma1 = 5.753e-12
7656  * sqrt(paramPtr->npeak)
7657  / model_.cox;
7658  if (!model_.gamma2Given)
7659  paramPtr->gamma2 = 5.753e-12
7660  * sqrt(paramPtr->nsub)
7661  / model_.cox;
7662 
7663  T0 = paramPtr->gamma1 - paramPtr->gamma2;
7664  T1 = sqrt(paramPtr->phi - paramPtr->vbx)
7665  - paramPtr->sqrtPhi;
7666  T2 = sqrt(paramPtr->phi * (paramPtr->phi
7667  - paramPtr->vbm)) - paramPtr->phi;
7668  paramPtr->k2 = T0 * T1 / (2.0 * T2 + paramPtr->vbm);
7669  paramPtr->k1 = paramPtr->gamma2 - 2.0
7670  * paramPtr->k2 * sqrt(paramPtr->phi
7671  - paramPtr->vbm);
7672  }
7673 
7674  if (paramPtr->k2 < 0.0)
7675  { T0 = 0.5 * paramPtr->k1 / paramPtr->k2;
7676  paramPtr->vbsc = 0.9 * (paramPtr->phi - T0 * T0);
7677  if (paramPtr->vbsc > -3.0)
7678  paramPtr->vbsc = -3.0;
7679  else if (paramPtr->vbsc < -30.0)
7680  paramPtr->vbsc = -30.0;
7681  }
7682  else
7683  { paramPtr->vbsc = -30.0;
7684  }
7685  if (paramPtr->vbsc > paramPtr->vbm)
7686  paramPtr->vbsc = paramPtr->vbm;
7687 
7688  if ((T0 = paramPtr->weff + paramPtr->k1w2) < 1e-8)
7689  T0 = 1e-8;
7690  paramPtr->k1eff = paramPtr->k1 * (1 + paramPtr->k1w1/T0);
7691 
7692  if (model_.vth0Given)
7694  - paramPtr->phi - paramPtr->k1eff
7695  * paramPtr->sqrtPhi;
7696  }
7697  else
7698  { paramPtr->vfb = -1.0;
7700  + paramPtr->phi + paramPtr->k1eff
7701  * paramPtr->sqrtPhi);
7702  }
7703 
7704 // v3.2
7706  paramPtr->k2 *= model_.tox / model_.toxm;
7707 
7708 
7709  T1 = sqrt(CONSTEPSSI / CONSTEPSOX * model_.tox
7710  * paramPtr->Xdep0);
7711  T0 = exp(-0.5 * paramPtr->dsub * paramPtr->leff / T1);
7712  paramPtr->theta0vb0 = (T0 + 2.0 * T0 * T0);
7713 
7714  T0 = exp(-0.5 * paramPtr->drout * paramPtr->leff / T1);
7715  T2 = (T0 + 2.0 * T0 * T0);
7717  + paramPtr->pdibl2;
7718 #ifdef REUSE_PARAMPTR
7719  }
7720 #endif
7721 
7726 
7727  if ( ((paramPtr->nsub > 0) && (model_.dtype > 0)) ||
7728  ((paramPtr->nsub < 0) && (model_.dtype < 0)) )
7729  {
7730  T0 = paramPtr->vsdth - paramPtr->vsdfb;
7731  paramPtr->sdt1 = paramPtr->vsdfb + model_.asd * T0;
7732  T1 = csbox - csmin;
7733  T2 = T1 / T0 / T0;
7734  paramPtr->st2 = T2 / model_.asd;
7735  paramPtr->st3 = T2 /( 1 - model_.asd);
7736  st4 = T0 * T1 * (1 + model_.asd) / 3
7737  - csmin * paramPtr->vsdfb;
7738 
7739  T1 = cdbox - cdmin;
7740  T2 = T1 / T0 / T0;
7741  paramPtr->dt2 = T2 / model_.asd;
7742  paramPtr->dt3 = T2 /( 1 - model_.asd);
7743  dt4 = T0 * T1 * (1 + model_.asd) / 3
7744  - cdmin * paramPtr->vsdfb;
7745  } else
7746  {
7747  T0 = paramPtr->vsdfb - paramPtr->vsdth;
7748  paramPtr->sdt1 = paramPtr->vsdth + model_.asd * T0;
7749  T1 = csmin - csbox;
7750  T2 = T1 / T0 / T0;
7751  paramPtr->st2 = T2 / model_.asd;
7752  paramPtr->st3 = T2 /( 1 - model_.asd);
7753  st4 = T0 * T1 * (1 + model_.asd) / 3
7754  - csbox * paramPtr->vsdth;
7755 
7756  T1 = cdmin - cdbox;
7757  T2 = T1 / T0 / T0;
7758  paramPtr->dt2 = T2 / model_.asd;
7759  paramPtr->dt3 = T2 /( 1 - model_.asd);
7760  dt4 = T0 * T1 * (1 + model_.asd) / 3
7761  - cdbox * paramPtr->vsdth;
7762  }
7763 
7764  /* v2.2.2 bug fix */
7765  T0 = model_.csdesw * log(1 + model_.tsi /
7766  model_.tbox);
7767  T1 = sourcePerimeter - w;
7768  if (T1 > 0.0)
7769  csesw = T0 * T1;
7770  else
7771  csesw = 0.0;
7772  T1 = drainPerimeter - w;
7773  if (T1 > 0.0)
7774  cdesw = T0 * T1;
7775  else
7776  cdesw = 0.0;
7777 
7778  phi = paramPtr->phi;
7779  cgso = paramPtr->cgso;
7780  cgdo = paramPtr->cgdo;
7781 
7782 /* v2.0 release */
7783  if (model_.ln < 1e-15) model_.ln = 1e-15;
7784  T0 = -0.5 * paramPtr->leff * paramPtr->leff /
7785  model_.ln / model_.ln;
7786  DEXP(T0,T1);
7787  paramPtr->arfabjt = T1;
7788 
7789  T0 = paramPtr->lbjt0 * (1.0 / paramPtr->leff + 1.0 / model_.ln);
7790  paramPtr->lratio = pow(T0,paramPtr->nbjt);
7791  paramPtr->lratiodif = 1.0 + model_.ldif0 * pow(T0,paramPtr->ndif);
7792 
7793  if ((paramPtr->vearly = paramPtr->vabjt + paramPtr->aely*paramPtr->leff) < 1)
7794  paramPtr->vearly = 1;
7795 
7796  /* vfbzb calculation for capMod 3 */
7797  tmp = sqrt(paramPtr->Xdep0);
7798  tmp1 = paramPtr->vbi - paramPtr->phi;
7799  tmp2 = model_.factor1 * tmp;
7800 
7801  T0 = -0.5 * paramPtr->dvt1w * paramPtr->weff
7802  * paramPtr->leff / tmp2;
7803  if (T0 > -EXPL_THRESHOLD)
7804  { T1 = exp(T0);
7805  T2 = T1 * (1.0 + 2.0 * T1);
7806  }
7807  else
7808  { T1 = MIN_EXPL;
7809  T2 = T1 * (1.0 + 2.0 * T1);
7810  }
7811  T0 = paramPtr->dvt0w * T2;
7812  T2 = T0 * tmp1;
7813 
7814  T0 = -0.5 * paramPtr->dvt1 * paramPtr->leff / tmp2;
7815  if (T0 > -EXPL_THRESHOLD)
7816  { T1 = exp(T0);
7817  T3 = T1 * (1.0 + 2.0 * T1);
7818  }
7819  else
7820  { T1 = MIN_EXPL;
7821  T3 = T1 * (1.0 + 2.0 * T1);
7822  }
7823  T3 = paramPtr->dvt0 * T3 * tmp1;
7824 
7825 /* v2.2.3 */
7826  T4 = (model_.tox - model_.dtoxcv) * paramPtr->phi
7827  / (paramPtr->weff + paramPtr->w0);
7828 
7829  T0 = sqrt(1.0 + paramPtr->nlx / paramPtr->leff);
7830  T5 = paramPtr->k1eff * (T0 - 1.0) * paramPtr->sqrtPhi
7831  + (paramPtr->kt1 + paramPtr->kt1l / paramPtr->leff)
7832  * (TempRatio - 1.0);
7833 
7834  tmp3 = model_.dtype * paramPtr->vth0
7835  - T2 - T3 + paramPtr->k3 * T4 + T5;
7836  paramPtr->vfbzb = tmp3 - paramPtr->phi - paramPtr->k1eff
7837  * paramPtr->sqrtPhi;
7838  /* End of vfbzb */
7839 
7840 
7841 // v3.2
7843  * (1.0 + paramPtr->nlx / paramPtr->leff)
7844  * 1e6 * model_.tsi;
7845 
7846 
7847 // v3.1 wanh added for RF
7849  +paramPtr->weff/nseg / 3.0 / model_.ngcon) /
7850  (model_.ngcon * (l - model_.xgl));
7851  if (grgeltd > 0.0)
7852  grgeltd = 1.0 / grgeltd;
7853  else
7854  { grgeltd = 1.0e3; // mho
7855  if (rgateMod !=0)
7856  {
7857  UserWarning(*this) << "The gate conductance reset to 1.0e3 mho.";
7858  }
7859  }
7860 // v3.1 wanh added for RF end
7861 
7862  paramPtr->ldeb = sqrt(CONSTEPSSI * model_.Vtm0 /
7863  (CONSTQ * paramPtr->npeak * 1.0e6)) / 3.0;
7864 
7865  return true;
7866 }
7867 
7868 //-----------------------------------------------------------------------------
7869 // Function : Instance::updateIntermediateVars
7870 // Purpose :
7871 // Special Notes :
7872 // Scope : public
7873 // Creator : Dave Shirley
7874 // Creation Date : 05/20/04
7875 //-----------------------------------------------------------------------------
7877 {
7878  bool bsuccess = true;
7879 
7880  double VgstNVt, ExpVgst;
7881 
7882  double arg;
7883 
7884  double Vfbeff, dVfbeff_dVd, dVfbeff_dVg, dVfbeff_dVrg, dVfbeff_dVb;
7885  double dVfbeff_dT, V3, V4;
7886  double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVfb_dT;
7887 
7888  double MJSWG;
7889 
7890  double qinoi;
7891  double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd;
7892  double sqrtPhisExt, dsqrtPhisExt_dVb;
7893  double Vgst;
7894 
7895  double Vtm;
7896  double n, dn_dVb, dn_dVd, noff, dnoff_dVd, dnoff_dVb;
7897  double ExpArg, V0, CoxWLcen, QovCox, LINK;
7898  double CoxWLb, CoxWLcenb;
7899  double DeltaPhi;
7900 
7901  double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVd, dTcen_dVb;
7902  double Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVd, dCoxeff_dVb;
7903  double dTcen_dT, dCoxeff_dT, dCoxWLcenb_dT;
7904  double Denomi ,dDenomi_dVg ,dDenomi_dVd ,dDenomi_dVb ,dDenomi_dT;
7905  double Ce1b ,Ce1e, Ce1T;
7906  double CbT, CsT, CgT;
7907 
7908  double Giie, dRatio_dVe;
7909  double Vdsatii0, dVdsatii0_dT;
7910  double VgsStep, dVgsStep_dT;
7911  double Vdsatii;
7912  double Vdiff, dVdiff_dVg, dVdiff_dVb, dVdiff_dVd, dVdiff_dVe, dVdiff_dT;
7913  double Ratio, dRatio_dVg, dRatio_dVb, dRatio_dVd, dRatio_dT;
7914  double Gbpbs, Gbpps;
7915  double qinv_local;
7916  double qjs_local, gcjsbs, gcjsT;
7917  double qjd_local, gcjdbs, gcjdds, gcjdT;
7918  double cjsbs, cjdbs, dcjdbs_dT, dcjsbs_dT;
7919  double PhiBSWG, dPhiBSWG_dT;
7920  double darg_dT, ddT3_dVb_dT;
7921 
7922  double gbbp;
7923 
7924  double OxideRatio, Vaux, dVaux_dVg, dVaux_dVd, dVaux_dVb;
7925  double Igb, dIgb_dVg, dIgb_dVd, dIgb_dVb, dIgb_dVe, dIgb_dT;
7926  double Ibs, Ibd;
7927 
7928  double Ibs1 ,dIbs1_dVb ,dIbs1_dT;
7929  double Ibs2 ,dIbs2_dVb ,dIbs2_dT;
7930  double Ibs3 ,dIbs3_dVb ,dIbs3_dVd, dIbs3_dT;
7931  double Ibs4 ,dIbs4_dVb ,dIbs4_dT;
7932  double Ibd1 ,dIbd1_dVb ,dIbd1_dVd ,dIbd1_dT;
7933  double Ibd2 ,dIbd2_dVb ,dIbd2_dVd ,dIbd2_dT;
7934  double Ibd3 ,dIbd3_dVb ,dIbd3_dVd ,dIbd3_dT;
7935  double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT;
7936  double Igc, dIgc_dVg, dIgc_dVd, dIgc_dVb;
7937  double Igs_local, dIgs_dVg, dIgs_dVs, Igd_local, dIgd_dVg, dIgd_dVd;
7938  double Igcs_local, dIgcs_dVg, dIgcs_dVd, dIgcs_dVb;
7939  double Igcd_local, dIgcd_dVg, dIgcd_dVd, dIgcd_dVb;
7940  double Igb1, dIgb1_dVg, dIgb1_dVd, dIgb1_dVb, dIgb1_dT, dIgb1_dVe;
7941  double Igb2, dIgb2_dVg, dIgb2_dVd, dIgb2_dVb, dIgb2_dT;
7942 
7943  double vgs_eff, dvgs_eff_dvg, vgd_eff, dvgd_eff_dvg;
7944  double dT0_dVox, Voxeff, dVoxeff_dVox, dVox_dT, dVaux_dT;
7945 
7946  double Vgb, dVgb_dVg, dVgb_dVb, Vox, dVox_dVg, dVox_dVd, dVox_dVb;
7947  double dT1_dVe, dT5_dVe, dVox_dVe, dVoxdepinv_dVe, dVaux_dVe;
7948  double Voxacc, dVoxacc_dVg, dVoxacc_dVd, dVoxacc_dVb;
7949  double Voxdepinv, dVoxdepinv_dVg, dVoxdepinv_dVb, dVoxdepinv_dVd;
7950  double dVoxdepinv_dT, VxNVt, ExpVxNVt;
7951 
7952  double Gjsd=0.0, Gjsb=0.0, GjsT=0.0, Gjdd=0.0, Gjdb=0.0, GjdT=0.0;
7953  double Ien, dIen_dT, Iendif, dIendif_dT;
7954  double Ibsdif, dIbsdif_dVb, dIbsdif_dT;
7955  double Ibddif, dIbddif_dVb, dIbddif_dVd, dIbddif_dT;
7956  double Ehlis, dEhlis_dVb, dEhlis_dT;
7957  double EhlisFactor, dEhlisFactor_dVb, dEhlisFactor_dT;
7958  double Ehlid, dEhlid_dVb, dEhlid_dVd, dEhlid_dT;
7959  double EhlidFactor, dEhlidFactor_dVb, dEhlidFactor_dVd, dEhlidFactor_dT;
7960  double E2ndFactor, dE2ndFactor_dVb, dE2ndFactor_dVd, dE2ndFactor_dT;
7961 
7962  double ExpVbsNVtm, dExpVbsNVtm_dVb, dExpVbsNVtm_dT;
7963  double ExpVbdNVtm, dExpVbdNVtm_dVb, dExpVbdNVtm_dVd, dExpVbdNVtm_dT;
7964 
7965  double ueff_local, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT;
7966  double Esat;
7967 
7968  double Vdsat;
7969 
7970  double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dT;
7971 
7972  double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat;
7973  double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dT;
7974  double Va, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT;
7975  double WTsi, NVtm1, NVtm2;
7976  double Ic;
7977  double dNVtm1_dT;
7978  double WsTsi, WdTsi;
7979  double NVtmf, NVtmr, dNVtmf_dT, dNVtmr_dT;
7980 
7981  double Ibp, Iii, Gcd, Gcb, GcT;
7982  double Giid=0.0, Giig=0.0, Giib=0.0, GiiT=0.0;
7983 
7984  double Vbseff, dVbseff_dVb;
7985 
7986  double CoxWL;
7987  double Idgidl, Gdgidld, Gdgidlg, Isgidl, Gsgidlg;
7988 
7989  double K1, Cbox, CboxWL, Vesfb;
7990  double T0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dVe;
7991  double T1, dT1_dVg, dT1_dVd, dT1_dVb;
7992  double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dVe;
7993  double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dT;
7994  double T4, dT4_dVd, dT4_dVb, dT4_dT;
7995  double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dT;
7996  double T6, dT6_dVg, dT6_dVd, dT6_dVb, dT6_dT;
7997  double T7;
7998  double T8, dT8_dVd;
7999  double T9, dT9_dVd;
8000  double T10, dT10_dVb, dT10_dVd;
8001  double T11, T12;
8002  double dT10_dT, dT11_dT, DioMax;
8003 
8004  double T13, T14;
8005  double dT11_dVb, dT13_dVb, dT14_dVb;
8006 
8007  double tmp, Abulk_local, dAbulk_dVb, Abulk0, dAbulk0_dVb;
8008 
8009  double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dT;
8010  double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dT;
8011 
8012  double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb;
8013  double Delt_vth, dDelt_vth_dVb;
8014 
8015  double Theta0, dTheta0_dVb;
8016  double T3zb, lt1zb, ltwzb, Theta0zb;
8017  double Delt_vthzb, dDelt_vthzb_dT;
8018  double DeltVthwzb, dDeltVthwzb_dT;
8019  double DeltVthtempzb, dDeltVthtempzb_dT;
8020  double Vthzb, dVthzb_dT, Vfbzb, dVfbzb_dT;
8021 
8022 
8023  double Temp, TempRatio, dTempRatio_dT, tmp1, tmp2, tmp3, tmp4;
8024 
8025  // Temp-dependent values for self heating
8026  double phi_local;
8027  double ni_local, Eg, vbi, dvbi_dT, vfbb, dvfbb_dT, sqrtPhi, Xdep0;
8028  double Ahli, dAhli_dT, jbjt, jdif, jrec, djbjt_dT, djdif_dT, djrec_dT;
8029  double jtun, djtun_dT, u0temp, du0temp_dT, vsattemp, dvsattemp_dT;
8030  double rds0, drds0_dT, ua, ub, uc, dua_dT, dub_dT, duc_dT;
8031  double dni_dT, dT7_dT, dT0_dT, dT0_dT7, dT1_dT, dT1_dT7;
8032  double dT2_dT, dT2_dT7;
8033 
8034  double Vbs0, dVbs0_dVg, dVbs0_dVd, dVbs0_dVe, dVbs0_dT;
8035  double Vbs0mos, dVbs0mos_dVe, dVbs0mos_dT;
8036  double Vbsmos, dVbsmos_dVg, dVbsmos_dVd, dVbsmos_dVb, dVbsmos_dVe, dVbsmos_dT;
8037 
8038  double wdios, wdiod, wdiosCV, wdiodCV;
8039 
8040  double Vbp, dVbp_dVb, dVtm_dT;
8041  double Vbsh, dVbsh_dVb;
8042  double dDelt_vth_dT;
8043  double DeltVthw, dDeltVthw_dVb, dDeltVthw_dT, DeltVthtemp, dDeltVthtemp_dT;
8044  double VthFD, dVthFD_dVd, dVthFD_dVb, dVthFD_dVe, dVthFD_dT;
8045  double VtgsFD, ExpVtgsFD, VgstFD, ExpVgstFD;
8046  double VtgseffFD, dVtgseffFD_dVd, dVtgseffFD_dVg, dVtgseffFD_dVe;
8047  double dVtgseffFD_dT;
8048  double Vbsitf, dVbsitf_dVg, dVbsitf_dVd, dVbsitf_dVb, dVbsitf_dVe, dVbsitf_dT;
8049  double PhiFD, dPhiFD_dVg, dPhiFD_dVd, dPhiFD_dVe, dPhiFD_dT;
8050  double PhiON, dPhiON_dVg, dPhiON_dVd, dPhiON_dVe, dPhiON_dT;
8051  double dVbsh_dVg, dVbsh_dVd, dVbsh_dVe, dVbsh_dT;
8052  double VgsteffFD, dVgsteffFD_dVd, dVgsteffFD_dVg, dVgsteffFD_dVe;
8053  double dVgsteffFD_dT;
8054  double dVgsteff_dVe, dVbseff_dVg, dVbseff_dVd, dVbseff_dVe, dVbseff_dT;
8055  double Vbs0t, dVbs0t_dVg, dVbs0t_dVd, dVbs0t_dVe, dVbs0t_dT;
8056  double Vgsteff_local, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb, dVgsteff_dT;
8057  double Vdseff_local, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dT;
8058  double dVgst_dVd, dVth_dT, dVgst2Vtm_dT;
8059 
8060  double DIBL_Sft, dDIBL_Sft_dVd, dDIBL_Sft_dVb;
8061 
8062  double Lambda, dLambda_dVg;
8063 
8064  double a1;
8065 
8066  double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb;
8067  double diffVds;
8068 
8069  double dAbulk_dVg;
8070  double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb, dbeta_dT;
8071  double gche, dgche_dVg, dgche_dVd, dgche_dVb, dgche_dT;
8072  double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb, dfgche1_dT;
8073  double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb, dfgche2_dT;
8074  double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb, dIdl_dT;
8075  double Gm0, Gds0, Gmb0, GmT0;
8076  double Ids;
8077 
8078  double Gds, Gmb;
8079 
8080  double CoxWovL;
8081  double Rds, dRds_dVg, dRds_dVb, dRds_dT, WVCox, WVCoxRds;
8082  double Vgst2Vtm, VdsatCV;
8083 
8084 //not used double dVdsatCV_dVg, dVdsatCV_dVb;
8085 
8086  double Leff, Weff, dWeff_dVg, dWeff_dVb;
8087  double AbulkCV, dAbulkCV_dVb;
8088 
8089  double Qe1 , dQe1_dVb, dQe1_dVe, dQe1_dT;
8090 
8091  double Csg(0.0), Csd(0.0), Csb(0.0), Cbg(0.0), Cbd(0.0), Cbb(0.0);
8092  double Cgb(0.0), Cgg(0.0), Cgd(0.0);
8093  double Cgg1(0.0), Cgb1(0.0), Cgd1(0.0), Cbg1(0.0), Cbb1(0.0), Cbd1(0.0);
8094  double Csg1(0.0), Csd1(0.0), Csb1(0.0);
8095 
8096  double Qac0, Qsub0;
8097  double dQac0_dVg, dQac0_dVb, dQac0_dVd, dQac0_dVrg, dQac0_dT;
8098  double dQsub0_dVg, dQsub0_dVd, dQsub0_dVb, dQsub0_dVrg, dQsub0_dT;
8099 
8100  // These are needed for voltage limiting, no need for them to be instance
8101  // variables:
8102  double vg_old, vd_old, vp_old, ve_old, vgp_old, vgm_old, vs_old, delTemp_old;
8103  double vbd_old, vbs_old, vds_old;
8104 
8105 
8106  // Don't do charge computations in DC sweeps.
8107  if (getSolverState().tranopFlag || getSolverState().acopFlag || getSolverState().transientFlag)
8108  {
8109  ChargeComputationNeeded = true;
8110  }
8111  else
8112  {
8113  ChargeComputationNeeded = false;
8114  }
8115 
8116  // this block of variables were originally set up as local function variables
8117  // but they've been moved to the instance class.
8118  qgdo = 0.0;
8119  qgso = 0.0;
8120  qgd = 0.0;
8121  qgs = 0.0;
8122  qge = 0.0;
8123  qgme = 0.0;
8124  qgate = 0.0;
8125  qbody = 0.0;
8126  qdrn = 0.0;
8127  qsub = 0.0;
8128  qsrc = 0.0;
8129 
8130  // end of b3ld.c parameters.
8131 
8132 #ifdef Xyce_DEBUG_DEVICE
8133  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
8134  {
8135  Xyce::dout() << subsection_divider << std::endl;
8136  Xyce::dout() << " In updateIntermediateVars\n";
8137  Xyce::dout() << " name = " << getName();
8138  Xyce::dout() << " model name = " << model_.getName();
8139  Xyce::dout() <<" dtype is " << model_.dtype << std::endl;
8140  Xyce::dout().width(21); Xyce::dout().precision(13); Xyce::dout().setf(std::ios::scientific);
8141  Xyce::dout() << " " << std::endl;
8142  }
8143 #endif
8144 
8145  int Check = 0; // The limiter function sets this to 1 if it changes things
8146 
8147  // The first block of code in b3ld.c basically sets up, locally,
8148  // what the load function should use as values for the various solution
8149  // variables. There is a series of IF statements which are dependent
8150  // upon the mode. (transient, initializing transient, operating point,
8151  // small signal, etc.). Xyce treats the operating point and transient
8152  // calculation in the same way, from the device's point of view, and
8153  // we don't support any of the other modes. Therefore most of these
8154  // mode options are not here - only the transient mode stuff.
8155 
8156  // First get some of the needed solution variables:
8157  Vd = 0.0;
8158  Vg = 0.0;
8159  Vs = 0.0;
8160  Ve = 0.0;
8161  Vp = 0.0;
8162  Vb = 0.0;
8163  delTemp = 0.0;
8164  Vsp = 0.0;
8165  Vdp = 0.0;
8166  Vgp = 0.0;
8167  Vgm = 0.0;
8168 
8170  // possible source of confusion: Original SPICE b3soi calls this "GE" for
8171  // "Gate External", we call it Gate
8175 
8176  if(li_Body != -1) {
8178  }
8179  if(li_ExtBody != -1)
8181  if(li_Temperature != -1)
8185  // Possible source of confusion: Original Spice calls this Gate, we call
8186  // it GatePrime to be consistent with our usage in other devices
8187  // (Prime means internal, unadorned means external)
8190 
8191  // orig variables, nodal version:
8192  Vd_orig = Vd;
8193  Vg_orig = Vg;
8194  Vs_orig = Vs;
8195  Ve_orig = Ve;
8196  Vb_orig = Vb;
8197  Vp_orig = Vp;
8198  Vsp_orig = Vsp;
8199  Vdp_orig = Vdp;
8200  Vgp_orig = Vgp;
8201  Vgm_orig = Vgm;
8202 
8203 #ifdef Xyce_DEBUG_DEVICE
8205  {
8206  Xyce::dout().precision(18);
8207  Xyce::dout() << std::endl;
8208  Xyce::dout() << getName() << " Blim: Vd = " << Vd << std::endl;
8209  Xyce::dout() << getName() << " Blim: Vg = " << Vg << std::endl;
8210  Xyce::dout() << getName() << " Blim: Vs = " << Vs << std::endl;
8211  Xyce::dout() << getName() << " Blim: Ve = " << Ve << std::endl;
8212  Xyce::dout() << getName() << " Blim: Vb = " << Vb << std::endl;
8213  Xyce::dout() << getName() << " Blim: Vp = " << Vp << std::endl;
8214  Xyce::dout() << getName() << " Blim:delTemp = " << delTemp << std::endl;
8215  Xyce::dout() << getName() << " Blim: Vsp = " << Vsp << std::endl;
8216  Xyce::dout() << getName() << " Blim: Vdp = " << Vdp << std::endl;
8217  Xyce::dout() << getName() << " Blim: Vgp = " << Vgp << std::endl;
8218  Xyce::dout() << getName() << " Blim: Vgm = " << Vgm << std::endl;
8219  Xyce::dout() << std::endl;
8220  }
8221 #endif
8222 
8223  // modified from b3ld: (see lines 221-230)
8224  vbs = model_.dtype * (Vb - Vsp);
8225  vps = model_.dtype * (Vp - Vsp);
8226  vgs = model_.dtype * (Vgp- Vsp);
8227  ves = model_.dtype * (Ve - Vsp);
8228  vds = model_.dtype * (Vdp- Vsp);
8229  vges = model_.dtype * (Vg - Vsp);
8230  vgms = model_.dtype * (Vgm - Vsp);
8231 
8232  vbd = vbs - vds;
8233  vgd = vgs - vds;
8234  ved = ves - vds;
8235 
8236 #ifdef Xyce_DEBUG_DEVICE
8238  {
8239  Xyce::dout().precision(18);
8240  Xyce::dout() << std::endl;
8241  Xyce::dout() << getName() << " Blim: vbs = " << vbs << std::endl;
8242  Xyce::dout() << getName() << " Blim: vbd = " << vbd << std::endl;
8243  Xyce::dout() << getName() << " Blim: vps = " << vps << std::endl;
8244  Xyce::dout() << getName() << " Blim: vpd = " << vpd << std::endl;
8245  Xyce::dout() << getName() << " Blim: vgs = " << vgs << std::endl;
8246  Xyce::dout() << getName() << " Blim: vds = " << vds << std::endl;
8247  Xyce::dout() << getName() << " Blim: ves = " << ves << std::endl;
8248  Xyce::dout() << getName() << " Blim: ved = " << ved << std::endl;
8249  Xyce::dout() << getName() << " Blim: vgd = " << vgd << std::endl;
8250  Xyce::dout() << getName() << " Blim: vges = " << vges<< std::endl;
8251  Xyce::dout() << getName() << " Blim: vgms = " << vgms<< std::endl;
8252  }
8253 #endif
8254 
8255  origFlag = 1;
8256  vbs_orig = vbs;
8257  vbd_orig = vbd;
8258  vps_orig = vps;
8259  vpd_orig = vpd;
8260  vgs_orig = vgs;
8261  vds_orig = vds;
8262  ves_orig = ves;
8263  ved_orig = ved;
8264  vgd_orig = vgd;
8265  vges_orig = vges;
8266  vgms_orig = vgms;
8268 
8269  // note initJctFlag will only be true for dcop.
8270  if (getSolverState().initJctFlag && !OFF && getDeviceOptions().voltageLimiterFlag)
8271  {
8272  if (getSolverState().inputOPFlag)
8273  {
8274  N_LAS_Vector * flagSolVectorPtr = extData.flagSolVectorPtr;
8275  if ((*flagSolVectorPtr)[li_Drain] == 0 || (*flagSolVectorPtr)[li_Gate] == 0 ||
8276  (*flagSolVectorPtr)[li_Source] == 0 || (*flagSolVectorPtr)[li_Substrate] == 0 ||
8277  (*flagSolVectorPtr)[li_DrainPrime] == 0 || (*flagSolVectorPtr)[li_GatePrime] == 0 ||
8278  (*flagSolVectorPtr)[li_SourcePrime] == 0 || (*flagSolVectorPtr)[li_GateMid] == 0 ||
8279  (li_Body != -1 && (*flagSolVectorPtr)[li_Body] == 0) ||
8280  (li_ExtBody != -1 && (*flagSolVectorPtr)[li_ExtBody] == 0) ||
8281  (li_Temperature != -1 && (*flagSolVectorPtr)[li_Temperature] == 0) )
8282  {
8283  vbs = 0.0;
8284  vgs = model_.dtype*0.1 + paramPtr->vth0;
8285  vds = 0.0;
8286  ves = 0.0;
8287  vps = 0.0;
8288  vpd = 0.0;
8289  vges = vgms = vgs;
8290  origFlag = 0;
8291  }
8292  }
8293  else
8294  {
8295  vgs = model_.dtype*0.1 + paramPtr->vth0;
8296  vges = vgms = vgs;
8297  origFlag = 0;
8298  }
8299  }
8300  else if ((getSolverState().initFixFlag || getSolverState().initJctFlag) && OFF)
8301  {
8302  delTemp = vps = vbs = vgs = vds = ves = 0.0;
8303  Vg = Vd = Vs = Vp = Ve = 0.0;
8304 
8305  vges = vgms = 0.0;
8306  }
8307 
8308  if (getSolverState().newtonIter == 0)
8309  {
8310 
8311  if (!getSolverState().dcopFlag || (getSolverState().locaEnabledFlag && getSolverState().dcopFlag))
8312  // ie, first newton step of a transient time step or DCOP continuation step.
8313  {
8314  // if not dcop, then state vector has final drops of last nonlinear step
8315  // of most recent successful time step. Use those as our "old" values
8316  // for limiting
8324  delTemp_old = (extData.currStoVectorRawPtr)[li_store_deltemp];
8325 
8326  // old voltage drops needed for second round of limiting
8330  }
8331  else // first newton step of DCOP.
8332  {
8333  vg_old = Vg;
8334  vd_old = Vdp;
8335  vs_old = Vsp;
8336  vp_old = Vp;
8337  ve_old = Ve;
8338  vgp_old = Vgp;
8339  vgm_old = Vgm;
8340  delTemp_old = delTemp;
8341 
8342  // old voltage drops
8343  vds_old = vds;
8344  vbs_old = vbs;
8345  vbd_old = vbd;
8346  }
8347  }
8348  else
8349  {
8357  delTemp_old = (extData.nextStoVectorRawPtr)[li_store_deltemp];
8358 
8359  // old voltage drops needed for second round of limiting
8363  }
8364 
8365  // B3SOI does limiting in a very different manner than any of the other
8366  // SPICE/Xyce devices did. Instead of limiting junction voltages and
8367  // preventing them from swinging too much, B3SOI limits actual voltage
8368  // nodes directly.
8369  // The impact of this on Xyce voltage limiting is significant:
8370  // The most straightforward way to apply Xyce style voltage limiting is
8371  // to apply the jacobian directly to the delta-x resulting from the
8372  // voltage node changes. But since most of the B3SOI code that could work
8373  // with limiting was written to use voltage drop changes instead, we're
8374  // gonna try to cheat.
8375  // We'll limit the individual nodes as B3SOI does, then recalculate the
8376  // drops. We have already saved the drops from the input solution vector
8377  // in the _orig variables. So now everywhere that spice does something
8378  // like:
8379  // RightHandSideTerm = current-conductance*voltagedrop
8380  // we can do
8381  // RightHandSideTerm = current;
8382  // RightHandSideTerm_Jdxp = conductance*(voltagedrop-voltagedrop_orig);
8383 
8385  && !(getSolverState().initFixFlag && OFF))
8386  {
8387  Vg = B3SOIlimit(Vg, vg_old, 3.0, &Check);
8388  Vdp = B3SOIlimit(Vdp, vd_old, 3.0, &Check);
8389  Vsp = B3SOIlimit(Vsp, vs_old, 3.0, &Check);
8390  Vp = B3SOIlimit(Vp, vp_old, 3.0, &Check);
8391  Ve = B3SOIlimit(Ve, ve_old, 3.0, &Check);
8392  Vgp = B3SOIlimit(Vgp, vgp_old, 3.0, &Check);
8393  Vgm = B3SOIlimit(Vgm, vgm_old, 3.0, &Check);
8394  if (Check == 1) // something changed, recalculate the drops
8395  {
8396 
8397  // Note that vbs is NOT recalculated! In SPICE b3soi vbs is calculated
8398  // from the unlimited b and sp nodes
8399  vps = model_.dtype * (Vp - Vsp);
8400  vgs = model_.dtype * (Vgp- Vsp);
8401  ves = model_.dtype * (Ve - Vsp);
8402  vds = model_.dtype * (Vdp- Vsp);
8403  vges = model_.dtype * (Vg - Vsp);
8404  vgms = model_.dtype * (Vgm - Vsp);
8405 
8406  vbd = vbs - vds;
8407  vgd = vgs - vds;
8408  ved = ves - vds;
8409  origFlag = 0;
8410  }
8411 
8412  } // getDeviceOptions().voltageLimiterFlag
8413 
8414  // ALL Bypass code removed by TVR --- we never, ever use it, and it just
8415  // clutters the code
8416 
8417  // There is now a second round of limiting-related stuff in the SPICE B3SOI:
8418  // In spice3F5 version there are additional lines here but they calculate
8419  // junk that is only used in bypass, which we never do
8420 
8422  {
8423  if (vds_old >= 0) // normal mode
8424  {
8425  T0 = vbs_old;
8426 
8427  if ( model_.bug1830fix != 0)
8428  {
8429  T1 = vbd_old;
8430  }
8431 
8432  }
8433  else // reverse
8434  {
8435  T0 = vbd_old;
8436 
8437  if ( model_.bug1830fix != 0)
8438  {
8439  T1 = vbs_old;
8440  }
8441 
8442  }
8443 
8444  if (vds >= 0)
8445  {
8446  vbs = B3SOIlimit(vbs, T0, 0.2, &Check);
8447  vbd = vbs - vds;
8448 
8449  if ( model_.bug1830fix != 0)
8450  {
8451  //vbd = B3SOIlimit(vbd, T1, 0.2, &Check);
8452  vbd = B3SOIlimit(vbd, vbd_old, 0.2, &Check);
8453  }
8454 
8455  Vb = model_.dtype*vbs+Vsp;
8456  }
8457  else
8458  {
8459  vbd = B3SOIlimit(vbd,T0,0.2,&Check);
8460  vbs = vbd+vds;
8461 
8462  if ( model_.bug1830fix != 0)
8463  {
8464  //vbs = B3SOIlimit(vbs, T1, 0.2, &Check);
8465  vbs = B3SOIlimit(vbs, vbs_old, 0.2, &Check);
8466  }
8467 
8468  Vb = model_.dtype*vbs+Vdp;
8469  }
8470 
8471  delTemp = B3SOIlimit(delTemp, delTemp_old, 5.0, &Check);
8472 
8473  if (Check == 1) origFlag = 0;
8474 
8475 #ifdef Xyce_DEBUG_DEVICE
8476  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
8477  {
8478  Xyce::dout() << std::endl;
8479  Xyce::dout().precision(18);
8480  Xyce::dout() << std::endl;
8481  Xyce::dout() << getName() << " Alim: Vd = " << Vd << std::endl;
8482  Xyce::dout() << getName() << " Alim: Vg = " << Vg << std::endl;
8483  Xyce::dout() << getName() << " Alim: Vs = " << Vs << std::endl;
8484  Xyce::dout() << getName() << " Alim: Ve = " << Ve << std::endl;
8485  Xyce::dout() << getName() << " Alim: Vb = " << Vb << std::endl;
8486  Xyce::dout() << getName() << " Alim: Vp = " << Vp << std::endl;
8487  Xyce::dout() << getName() << " Alim:delTemp = " << delTemp << std::endl;
8488  Xyce::dout() << getName() << " Alim: Vsp = " << Vsp << std::endl;
8489  Xyce::dout() << getName() << " Alim: Vdp = " << Vdp << std::endl;
8490  Xyce::dout() << getName() << " Alim: Vgp = " << Vgp << std::endl;
8491  Xyce::dout() << getName() << " Alim: Vgm = " << Vgm << std::endl;
8492 
8493  Xyce::dout() << getName() << " Alim: vbs = " << vbs << std::endl;
8494  Xyce::dout() << getName() << " Alim: vps = " << vps << std::endl;
8495  Xyce::dout() << getName() << " Alim: vgs = " << vgs << std::endl;
8496  Xyce::dout() << getName() << " Alim: ves = " << ves << std::endl;
8497  Xyce::dout() << getName() << " Alim: vds = " << vds << std::endl;
8498  Xyce::dout() << getName() << " Alim: vges = " <<vges << std::endl;
8499  Xyce::dout() << getName() << " Alim: vgms = " <<vgms << std::endl;
8500 
8501  Xyce::dout() << getName() << " Alim: vbd = " << vbd << std::endl;
8502 
8503  Xyce::dout() << getName() << " Alim: T0 = " << vbd << std::endl;
8504  Xyce::dout() << std::endl;
8505  Xyce::dout() << std::endl;
8506 
8507  Xyce::dout() <<getName()<<" Vg_orig = " << Vg_orig << std::endl;
8508  Xyce::dout() <<getName()<<" Vs_orig = " << Vs_orig << std::endl;
8509  Xyce::dout() <<getName()<<" Ve_orig = " << Ve_orig << std::endl;
8510  Xyce::dout() <<getName()<<" Vb_orig = " << Vb_orig << std::endl;
8511  Xyce::dout() <<getName()<<" Vp_orig = " << Vp_orig << std::endl;
8512  Xyce::dout() <<getName()<<" Vsp_orig = " << Vsp_orig << std::endl;
8513  Xyce::dout() <<getName()<<" Vdp_orig = " << Vdp_orig << std::endl;
8514  Xyce::dout() <<getName()<<" Vgp_orig = " << Vgp_orig << std::endl;
8515  Xyce::dout() <<getName()<<" Vgm_orig = " << Vgm_orig << std::endl;
8516  Xyce::dout() << std::endl;
8517  Xyce::dout() <<getName()<<" vbs_orig = " << vbs_orig << std::endl;
8518  Xyce::dout() <<getName()<<" vbd_orig = " << vbd_orig << std::endl;
8519  Xyce::dout() <<getName()<<" vps_orig = " << vps_orig << std::endl;
8520  Xyce::dout() <<getName()<<" vpd_orig = " << vpd_orig << std::endl;
8521  Xyce::dout() <<getName()<<" vgs_orig = " << vgs_orig << std::endl;
8522  Xyce::dout() <<getName()<<" vds_orig = " << vds_orig << std::endl;
8523  Xyce::dout() <<getName()<<" ves_orig = " << ves_orig << std::endl;
8524  Xyce::dout() <<getName()<<" ved_orig = " << ved_orig << std::endl;
8525  Xyce::dout() <<getName()<<" vgd_orig = " << vgd_orig << std::endl;
8526  Xyce::dout() <<getName()<<" vges_orig = " << vges_orig << std::endl;
8527  Xyce::dout() <<getName()<<" vgms_orig = " << vgms_orig << std::endl;
8528  Xyce::dout() <<getName()<<" delTemp_orig = " << delTemp_orig << std::endl;
8529  }
8530 #endif
8531  }
8532 
8533  // Finished with what would have been the series of CKTmode
8534  // IF statements...
8535 
8536  // Calculate temperature dependent values for self-heating effect
8537  Temp = delTemp + temp;
8538  dTempRatio_dT = 1 / model_.tnom;
8539  TempRatio = Temp * dTempRatio_dT;
8540 
8541  if (selfheat)
8542  {
8543  Vtm = CONSTKoverQ * Temp;
8544 
8545  T0 = 1108.0 + Temp;
8546  T5 = Temp * Temp;
8547  Eg = 1.16 - 7.02e-4 * T5 / T0;
8548  T1 = ((7.02e-4 * T5) - T0 * (14.04e-4 * Temp)) / T0 / T0;
8549  // T1 = dEg / dT
8550 
8551  T2 = 1.9230584e-4;
8552  // T2 = 1 / 300.15^(3/2)
8553  T5 = sqrt(Temp);
8554  T3 = 1.45e10 * Temp * T5 * T2;
8555  T4 = exp(21.5565981 - Eg / (2.0 * Vtm));
8556  ni_local = T3 * T4;
8557  dni_dT = 2.175e10 * T2 * T5 * T4 + T3 * T4 *
8558  (-Vtm * T1 + Eg * CONSTKoverQ) / (2.0 * Vtm * Vtm);
8559 
8560  T0 = log(1.0e20 * paramPtr->npeak / (ni_local * ni_local));
8561  vbi = Vtm * T0;
8562  dvbi_dT = CONSTKoverQ * T0 + Vtm * (-2.0 * dni_dT / ni_local);
8563 
8564  if (paramPtr->nsub > 0)
8565  {
8566  T0 = log(paramPtr->npeak / paramPtr->nsub);
8567  vfbb = -model_.dtype * Vtm * T0;
8568  dvfbb_dT = -model_.dtype * CONSTKoverQ * T0;
8569  }
8570  else
8571  {
8572  T0 = log(-paramPtr->npeak * paramPtr->nsub / ni_local / ni_local);
8573  vfbb = -model_.dtype * Vtm * T0;
8574  dvfbb_dT = -model_.dtype *
8575  (CONSTKoverQ * T0 - Vtm * 2.0 * dni_dT / ni_local);
8576  }
8577 
8578  // phi_local = 2.0 * Vtm * log(paramPtr->npeak / ni_local);
8579  phi_local = phi;
8580  sqrtPhi = sqrt(phi_local);
8581  Xdep0 = sqrt(2.0 * CONSTEPSSI/(CONSTQ * paramPtr->npeak * 1.0e6))
8582  * sqrtPhi;
8583 
8584  // Save the values below for phi_local calculation in B3SOIaccept()
8585  vtm = Vtm;
8586  ni = ni_local;
8587 
8588  T3 = TempRatio - 1.0;
8589  T8 = 1/ model_.tnom;
8590  T4 = CONSTEg300 / Vtm * T3;
8591  dT4_dT = CONSTEg300 / Vtm / Vtm * (Vtm * T8 - T3 * CONSTKoverQ);
8592 
8593  T7 = paramPtr->xbjt * T4 / paramPtr->ndiode;
8594  dT7_dT = paramPtr->xbjt * dT4_dT / paramPtr->ndiode;
8595  CEXP(T7, T0, dT0_dT7);
8596  dT0_dT = dT0_dT7 * dT7_dT;
8597 
8598  if (paramPtr->xbjt == paramPtr->xdif)
8599  {
8600  T1 = T0;
8601  dT1_dT = dT0_dT;
8602  }
8603  else
8604  {
8605  T7 = paramPtr->xdif * T4 / paramPtr->ndiode;
8606  dT7_dT = paramPtr->xdif * dT4_dT / paramPtr->ndiode;
8607  CEXP(T7, T1, dT1_dT7);
8608  dT1_dT = dT1_dT7 * dT7_dT;
8609  }
8610 
8611  T7 = paramPtr->xrec * T4 / paramPtr->nrecf0;
8612  dT7_dT = paramPtr->xrec * dT4_dT / paramPtr->nrecf0;
8613  CEXP(T7, T2, dT2_dT7);
8614  dT2_dT = dT2_dT7 * dT7_dT;
8615 
8616  /* high level injection */
8617  Ahli = paramPtr->ahli * T0;
8618  dAhli_dT = paramPtr->ahli * dT0_dT;
8619 
8620  jbjt = paramPtr->isbjt * T0;
8621  jdif = paramPtr->isdif * T1;
8622  jrec = paramPtr->isrec * T2;
8623  djbjt_dT = paramPtr->isbjt * dT0_dT;
8624  djdif_dT = paramPtr->isdif * dT1_dT;
8625  djrec_dT = paramPtr->isrec * dT2_dT;
8626 
8627  T7 = paramPtr->xtun * T3;
8628  dT7_dT = paramPtr->xtun * T8;
8629  CEXP(T7, T0, dT0_dT7);
8630  dT0_dT = dT0_dT7 * dT7_dT;
8631  jtun = paramPtr->istun * T0;
8632  djtun_dT = paramPtr->istun * dT0_dT;
8633 
8634  u0temp = paramPtr->u0 * pow(TempRatio, paramPtr->ute);
8635  du0temp_dT = paramPtr->u0 * paramPtr->ute *
8636  pow(TempRatio, paramPtr->ute - 1.0) * T8;
8637 
8638  vsattemp = paramPtr->vsat - paramPtr->at * T3;
8639  dvsattemp_dT = -paramPtr->at * T8;
8640 
8641  rds0 = (paramPtr->rdsw + paramPtr->prt * T3) / paramPtr->rds0denom;
8642  drds0_dT = paramPtr->prt / paramPtr->rds0denom * T8;
8643 
8644  ua = paramPtr->uatemp + paramPtr->ua1 * T3;
8645  ub = paramPtr->ubtemp + paramPtr->ub1 * T3;
8646  uc = paramPtr->uctemp + paramPtr->uc1 * T3;
8647  dua_dT = paramPtr->ua1 * T8;
8648  dub_dT = paramPtr->ub1 * T8;
8649  duc_dT = paramPtr->uc1 * T8;
8650  }
8651  else
8652  {
8653  Vtm = CONSTKoverQ * temp;
8654  vbi = paramPtr->vbi;
8655  vfbb = paramPtr->vfbb;
8656  phi_local = paramPtr->phi;
8657  sqrtPhi = paramPtr->sqrtPhi;
8658  Xdep0 = paramPtr->Xdep0;
8659  jbjt = paramPtr->jbjt;
8660  jdif = paramPtr->jdif;
8661  jrec = paramPtr->jrec;
8662  jtun = paramPtr->jtun;
8663 
8664  // v2.2.2 bug fix
8665  Ahli = paramPtr->ahli0;
8666 
8667  u0temp = paramPtr->u0temp;
8668  vsattemp = paramPtr->vsattemp;
8669  rds0 = paramPtr->rds0;
8670  ua = paramPtr->ua;
8671  ub = paramPtr->ub;
8672  uc = paramPtr->uc;
8673  dni_dT = dvbi_dT = dvfbb_dT = djbjt_dT = djdif_dT = 0.0;
8674  djrec_dT = djtun_dT = du0temp_dT = dvsattemp_dT = 0.0;
8675  drds0_dT = dua_dT = dub_dT = duc_dT = 0.0;
8676  dAhli_dT = 0;
8677  }
8678 
8679  // TempRatio used for Vth and mobility
8680  if (selfheat)
8681  {
8682  TempRatioMinus1 = Temp / model_.tnom - 1.0;
8683  }
8684  else
8685  {
8686  TempRatioMinus1 = temp / model_.tnom - 1.0;
8687  }
8688 
8689  // file: b3ld.c line: 937
8690  // determine DC current and derivatives
8691  vbd = vbs - vds;
8692  vgd = vgs - vds;
8693  vgb = vgs - vbs;
8694  ved = ves - vds;
8695  veb = ves - vbs;
8696  vge = vgs - ves;
8697  vpd = vps - vds;
8698 
8699  vged = vges - vds;
8700  vgmd = vgms - vds;
8701  vgme = vgms - ves;
8702  vgmb = vgms - vbs; // v3.2 bug fix
8703 
8704 // v3.1 bug fix
8707 
8708  // This stuff impacts voltage limiting! Be careful!
8709  // It changes the meanings of things under the covers, so we must be
8710  // consistent
8711  if (vds >= 0.0)
8712  { // normal mode
8713  mode = 1;
8714  Vds = vds;
8715  Vds_orig = vds_orig;
8716  Vgs = vgs;
8717  Vgs_orig = vgs_orig;
8718  Vbs = vbs;
8719  Vbs_orig = vbs_orig;
8720  Vbd = vbd;
8721  Vbd_orig = vbd_orig;
8722  Ves = ves;
8723  Ves_orig = ves_orig;
8724  Vps = vps;
8725  Vps_orig = Vps_orig;
8726 
8727  wdios = paramPtr->wdios;
8728  wdiod = paramPtr->wdiod;
8729  wdiosCV = paramPtr->wdiosCV;
8730  wdiodCV = paramPtr->wdiodCV;
8731  }
8732  else
8733  { // inverse mode
8734  mode = -1;
8735  Vds = -vds;
8736  Vds_orig = -vds_orig;
8737  Vgs = vgd;
8738  Vgs_orig = vgd_orig;
8739  Vbs = vbd;
8740  Vbs_orig = vbd_orig;
8741  Vbd = vbs;
8742  Vbd_orig = vbs_orig;
8743  Ves = ved;
8744  Ves_orig = ved_orig;
8745  Vps = vpd;
8746  Vps_orig = vpd_orig;
8747 
8748  wdios = paramPtr->wdiod;
8749  wdiod = paramPtr->wdios;
8750  wdiosCV = paramPtr->wdiodCV;
8751  wdiodCV = paramPtr->wdiosCV;
8752  }
8753 
8754  // mosfet continuation.
8755  // This idea is based, loosely, on a paper by Jaijeet
8756  // Rosychowdhury. If the artificial parameter flag has been enabled,
8757  // modify Vds and Vgs.
8758 #ifdef Xyce_DEBUG_DEVICE
8760  {
8761  Xyce::dout() << "HOMOTOPY INFO: gainscale = "
8762  << getSolverState().gainScale[blockHomotopyID] << std::endl;
8763  Xyce::dout() << "HOMOTOPY INFO: before vds = " << Vds << std::endl;
8764  Xyce::dout() << "HOMOTOPY INFO: before vgst = " << Vgs << std::endl;
8765  Xyce::dout() << "vgstConst= " << getDeviceOptions().vgstConst << std::endl;
8766  }
8767 #endif
8768  if (getSolverState().artParameterFlag)
8769  {
8770  double alpha = getSolverState().gainScale[blockHomotopyID];
8771  if (getDeviceOptions().staggerGainScale)
8772  {
8773  alpha *= (0.3 * randomPerturb + 1.0);
8774  if (alpha > 1.0)
8775  {
8776  alpha = 1.0;
8777  }
8778  }
8779  double vgstConst = getDeviceOptions().vgstConst;
8780  if (getDeviceOptions().randomizeVgstConst)
8781  {
8782  vgstConst *= randomPerturb;
8783  }
8784 
8785  Vds = devSupport.contVds (Vds, getSolverState().nltermScale,
8786  getDeviceOptions().vdsScaleMin);
8787  Vgs = devSupport.contVgst(Vgs, alpha, vgstConst);
8788  }
8789 #ifdef Xyce_DEBUG_DEVICE
8790  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
8791  {
8792  Xyce::dout() << "HOMOTOPY INFO: after vds = " << Vds << std::endl;
8793  Xyce::dout() << "HOMOTOPY INFO: after vgst = " << Vgs << std::endl;
8794  }
8795 #endif
8796  // end of mosfet continuation block.
8797 
8798  Vesfb = Ves - vfbb;
8799  Cbox = model_.cbox;
8800  K1 = paramPtr->k1eff;
8801 
8802 // Poly Gate Si Depletion Effect
8803  T0 = paramPtr->vfb + phi_local;
8804  if ((paramPtr->ngate > 1.e18) && (paramPtr->ngate < 1.e25) && (Vgs > T0))
8805  // added to avoid the problem caused by ngate
8806  { T1 = 1.0e6 * CONSTQ * CONSTEPSSI * paramPtr->ngate
8807  / (model_.cox * model_.cox);
8808  T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1);
8809  T2 = T1 * (T4 - 1.0);
8810  T3 = 0.5 * T2 * T2 / T1; // T3 = Vpoly
8811  T7 = 1.12 - T3 - 0.05;
8812  T6 = sqrt(T7 * T7 + 0.224);
8813  T5 = 1.12 - 0.5 * (T7 + T6);
8814  Vgs_eff = Vgs - T5;
8815  dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6);
8816  }
8817  else
8818  { Vgs_eff = Vgs;
8819  dVgs_eff_dVg = 1.0;
8820  }
8821 
8822  Leff = paramPtr->leff;
8823 
8824  if (selfheat)
8825  {
8826  Vtm = CONSTKoverQ * Temp;
8827  dVtm_dT = CONSTKoverQ;
8828  }
8829  else {
8830  dVtm_dT = 0.0;
8831  }
8832 
8833  V0 = vbi - phi_local;
8834 
8835 
8836 // begin of v3.0 block addition
8837 // B/S built-in potential lowering calculation
8838  if (soiMod == 0) // BSIMPD - v3.2
8839  {
8840  Vbsmos = Vbs;
8841  dVbsmos_dVg = 0.0;
8842  dVbsmos_dVd = 0.0;
8843  dVbsmos_dVb = 1.0;
8844  dVbsmos_dVe = 0.0;
8845  if (selfheat) dVbsmos_dT = 0.0;
8846  else dVbsmos_dT = 0.0;
8847 
8848  Vbp = Vbs - Vps;
8849  dVbp_dVb = 1;
8850  }
8851  else // soiMod = 1 or 2: adding FD module on top of BSIMPD
8852  {
8853  // prepare Vbs0 & Vbs0mos for VthFD calculation
8854  T0 = -model_.dvbd1 * paramPtr->leff / paramPtr->litl;
8855  T1 = model_.dvbd0 * (exp(0.5*T0) + 2*exp(T0));
8856  T2 = T1 * (vbi - phi_local);
8857  T3 = 0.5 * paramPtr->qsi / model_.csi; // v3.2
8858  Vbs0t = phi_local - T3 + model_.vbsa + T2;
8859  if (selfheat)
8860  dVbs0t_dT = T1 * dvbi_dT;
8861  else
8862  dVbs0t_dT = 0.0;
8863 
8864  T0 = 1 + model_.csi / Cbox;
8865  T3 = -model_.dk2b * paramPtr->leff / paramPtr->litl;
8866  T5 = model_.k2b * (exp(0.5*T3) + 2*exp(T3));
8867  T1 = (model_.k1b - T5) / T0;
8868  T2 = T1 * Vesfb;
8869  T4 = 1.0/(1 + Cbox / model_.csi);
8870  Vbs0 = T4 * Vbs0t + T2;
8871  dVbs0_dVe = T1;
8872  if (selfheat)
8873  dVbs0_dT = T4 * dVbs0t_dT - T1 * dvfbb_dT;
8874  else
8875  dVbs0_dT = 0.0;
8876 
8877 
8878  // zero field body potential calc
8879  T1 = Vbs0t - Vbs0 - 0.005;
8880  T2 = sqrt(T1 * T1 + (2.5e-5));
8881  T3 = 0.5 * (T1 + T2);
8882  T4 = T3 * model_.csi / paramPtr->qsi; // v3.2
8883  Vbs0mos = Vbs0 - 0.5 * T3 * T4;
8884  T5 = 0.5 * T4 * (1 + T1 / T2);
8885  dVbs0mos_dVe = dVbs0_dVe * (1 + T5);
8886  if (selfheat)
8887  dVbs0mos_dT = dVbs0_dT * (1 + T5) - T5 * dVbs0t_dT;
8888  else
8889  dVbs0mos_dT = 0.0;
8890 
8891 
8892  // set the upperbound of Vbs0mos to be phi_local for sqrt calc.
8893  T1 = phi_local - 0.02;
8894  T2 = T1 - Vbs0mos - 0.005;
8895  T3 = sqrt(T2 * T2 + 4.0 * 0.005);
8896  Vbs0mos = T1 - 0.5 * (T2 + T3);
8897  T4 = 0.5 * (1 + T2 / T3);
8898  dVbs0mos_dVe = T4 * dVbs0mos_dVe;
8899  if (selfheat)
8900  dVbs0mos_dT = T4 * dVbs0mos_dT;
8901  else dVbs0mos_dT = 0.0;
8902 
8903 
8904  // VthFD calculation
8905  Phis = phi_local - Vbs0mos;
8906  dPhis_dVb = -1; // w.r.t Vbs0mos
8907  sqrtPhis = sqrt(Phis);
8908  dsqrtPhis_dVb = -0.5 / sqrtPhis;
8909  Xdep = Xdep0 * sqrtPhis / sqrtPhi;
8910  dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb;
8911  T3 = sqrt(Xdep);
8912 
8913  T0 = paramPtr->dvt2 * Vbs0mos;
8914  if (T0 >= - 0.5)
8915  { T1 = 1.0 + T0;
8916  T2 = paramPtr->dvt2 ;
8917  }
8918  else // Added to avoid any discontinuity problems caused by dvt2
8919  { T4 = 1.0 / (3.0 + 8.0 * T0);
8920  T1 = (1.0 + 3.0 * T0) * T4;
8921  T2 = paramPtr->dvt2 * T4 * T4 ;
8922  }
8923  lt1 = model_.factor1 * T3 * T1;
8924  dlt1_dVb =model_.factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
8925 
8926  T0 = paramPtr->dvt2w * Vbs0mos;
8927  if (T0 >= - 0.5)
8928  { T1 = 1.0 + T0;
8929  T2 = paramPtr->dvt2w ;
8930  }
8931  else // Added to avoid any discontinuity problems caused by dvt2w
8932  { T4 = 1.0 / (3.0 + 8.0 * T0);
8933  T1 = (1.0 + 3.0 * T0) * T4;
8934  T2 = paramPtr->dvt2w * T4 * T4 ;
8935  }
8936  ltw= model_.factor1 * T3 * T1;
8937  dltw_dVb=model_.factor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
8938 
8939  T0 = -0.5 * paramPtr->dvt1 * Leff / lt1;
8940  if (T0 > -EXPL_THRESHOLD)
8941  { T1 = exp(T0);
8942  Theta0 = T1 * (1.0 + 2.0 * T1);
8943  dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb;
8944  dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb;
8945  }
8946  else
8947  { T1 = MIN_EXPL;
8948  Theta0 = T1 * (1.0 + 2.0 * T1);
8949  dTheta0_dVb = 0.0;
8950  }
8951 
8952  thetavth = paramPtr->dvt0 * Theta0;
8953  Delt_vth = thetavth * V0;
8954  dDelt_vth_dVb = paramPtr->dvt0 * dTheta0_dVb * V0;
8955  if (selfheat) dDelt_vth_dT = thetavth * dvbi_dT;
8956  else dDelt_vth_dT = 0.0;
8957 
8958  T0 = -0.5 * paramPtr->dvt1w * paramPtr->weff * Leff / ltw;
8959  if (T0 > -EXPL_THRESHOLD)
8960  { T1 = exp(T0);
8961  T2 = T1 * (1.0 + 2.0 * T1);
8962  dT1_dVb = -T0 / ltw * T1 * dltw_dVb;
8963  dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb;
8964  }
8965  else
8966  { T1 = MIN_EXPL;
8967  T2 = T1 * (1.0 + 2.0 * T1);
8968  dT2_dVb = 0.0;
8969  }
8970 
8971  T0 = paramPtr->dvt0w * T2;
8972  DeltVthw = T0 * V0;
8973  dDeltVthw_dVb = paramPtr->dvt0w * dT2_dVb * V0;
8974  if (selfheat) dDeltVthw_dT = T0 * dvbi_dT;
8975  else dDeltVthw_dT = 0.0;
8976 
8977  T0 = sqrt(1.0 + paramPtr->nlx / Leff);
8978  T1 = (paramPtr->kt1 + paramPtr->kt1l / Leff
8979  + paramPtr->kt2 * Vbs0mos);
8980  DeltVthtemp = paramPtr->k1eff * (T0 - 1.0) * sqrtPhi + T1
8981  * TempRatioMinus1;
8982  if (selfheat)
8983  dDeltVthtemp_dT = T1 / model_.tnom;
8984  else
8985  dDeltVthtemp_dT = 0.0;
8986 
8987  tmp2 = model_.tox * phi_local
8988  / (paramPtr->weff + paramPtr->w0);
8989 
8990  T3 = paramPtr->eta0 + paramPtr->etab * Vbs0mos;
8991  if (T3 < 1.0e-4) // avoid discontinuity problems caused by etab
8992  { T9 = 1.0 / (3.0 - 2.0e4 * T3);
8993  T3 = (2.0e-4 - T3) * T9;
8994  T4 = T9 * T9 * paramPtr->etab;
8995  dT3_dVb = T4 ;
8996  }
8997  else
8998  {
8999  dT3_dVb = paramPtr->etab ;
9000  }
9001  DIBL_Sft = T3 * paramPtr->theta0vb0 * Vds;
9002  dDIBL_Sft_dVd = paramPtr->theta0vb0 * T3;
9003  dDIBL_Sft_dVb = paramPtr->theta0vb0 * Vds * dT3_dVb;
9004 
9005  VthFD = model_.dtype * paramPtr->vth0 + paramPtr->k1eff
9006  * (sqrtPhis - sqrtPhi) - paramPtr->k2
9007  * Vbs0mos- Delt_vth - DeltVthw +(paramPtr->k3 + paramPtr->k3b
9008  * Vbs0mos) * tmp2 + DeltVthtemp - DIBL_Sft;
9009 
9010  T6 = paramPtr->k3b * tmp2 - paramPtr->k2
9012  dVthFD_dVb = paramPtr->k1eff * dsqrtPhis_dVb
9013  - dDelt_vth_dVb - dDeltVthw_dVb
9014  + T6 - dDIBL_Sft_dVb; // this is actually dVth_dVbs0mos
9015  dVthFD_dVe = dVthFD_dVb * dVbs0mos_dVe;
9016  dVthFD_dVd = -dDIBL_Sft_dVd;
9017  if (selfheat)
9018  dVthFD_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT
9019  + dVthFD_dVb * dVbs0mos_dT;
9020  else dVthFD_dT = 0.0;
9021 
9022 
9023  // VtgseffFD calculation for PhiFD
9024  VtgsFD = VthFD - Vgs_eff;
9025  T10 = model_.nofffd * Vtm;
9026  CEXP((VtgsFD - model_.vofffd)/ T10, ExpVtgsFD, T0);
9027  VtgseffFD = T10 * log(1.0 + ExpVtgsFD);
9028  T0 /= (1.0 + ExpVtgsFD);
9029  dVtgseffFD_dVd = T0 * dVthFD_dVd;
9030  dVtgseffFD_dVg = -T0 * dVgs_eff_dVg;
9031  dVtgseffFD_dVe = T0 * dVthFD_dVe;
9032  if (selfheat)
9033  dVtgseffFD_dT = T0 * (dVthFD_dT - (VtgsFD - model_.vofffd)
9034  / Temp) + VtgseffFD/Temp;
9035  else dVtgseffFD_dT = 0.0;
9036 
9037 
9038  // surface potential modeling at strong inversion: PhiON
9039  VgstFD = Vgs_eff - VthFD;
9040  CEXP((VgstFD - model_.vofffd)/ T10, ExpVgstFD, T0);
9041  VgsteffFD = T10 * log(1.0 + ExpVgstFD);
9042  T0 /= (1.0 + ExpVgstFD);
9043  dVgsteffFD_dVd = -T0 * dVthFD_dVd;
9044  dVgsteffFD_dVg = T0 * dVgs_eff_dVg;
9045  dVgsteffFD_dVe = -T0 * dVthFD_dVe;
9046  if (selfheat)
9047  dVgsteffFD_dT = T0 * (-dVthFD_dT - (VgstFD - model_.vofffd)
9048  / Temp) + VgsteffFD/Temp;
9049  else dVgsteffFD_dT = 0.0;
9050 
9051 
9052  T1 = model_.moinFD*paramPtr->k1eff*Vtm*Vtm;
9053  if (selfheat) dT1_dT = 2*T1/Temp;
9054  else dT1_dT=0.0;
9055 
9056  T2 = VgsteffFD+ 2*paramPtr->k1eff*sqrt(phi_local);
9057  dT2_dVg = dVgsteffFD_dVg;
9058  dT2_dVd = dVgsteffFD_dVd;
9059  dT2_dVe = dVgsteffFD_dVe;
9060  if (selfheat) dT2_dT = dVgsteffFD_dT;
9061  else dT2_dT = 0.0;
9062 
9063  T0 = 1+ VgsteffFD * T2 / T1;
9064  dT0_dVg = (VgsteffFD * dT2_dVg + T2 * dVgsteffFD_dVg) / T1;
9065  dT0_dVd = (VgsteffFD * dT2_dVd + T2 * dVgsteffFD_dVd) / T1;
9066  dT0_dVe = (VgsteffFD * dT2_dVe + T2 * dVgsteffFD_dVe) / T1;
9067  if (selfheat)
9068  dT0_dT = (VgsteffFD * (dT2_dT - T2/T1 * dT1_dT) + T2
9069  * dVgsteffFD_dT) / T1;
9070  else dT0_dT = 0.0;
9071 
9072 
9073  PhiON = phi_local + Vtm* log(T0) ;
9074  dPhiON_dVg = Vtm* dT0_dVg/T0 ;
9075  dPhiON_dVd = Vtm* dT0_dVd/T0 ;
9076  dPhiON_dVe = Vtm* dT0_dVe/T0 ;
9077  if (selfheat)
9078  dPhiON_dT = Vtm* dT0_dT/T0 + (PhiON-phi_local)/Temp ;
9079  else dPhiON_dT = 0.0;
9080 
9081 
9082  // surface potential from subthreshold to inversion: PhiFD
9083  T0 = model_.cox / (model_.cox +
9084  1.0/(1.0/model_.csi + 1.0/Cbox));
9085  PhiFD = PhiON - T0 * VtgseffFD;
9086  dPhiFD_dVg = dPhiON_dVg - T0 * dVtgseffFD_dVg;
9087  dPhiFD_dVd = dPhiON_dVd - T0 * dVtgseffFD_dVd;
9088  dPhiFD_dVe = dPhiON_dVe - T0 * dVtgseffFD_dVe;
9089  if (selfheat)
9090  dPhiFD_dT = dPhiON_dT - T0 * dVtgseffFD_dT;
9091  else dPhiFD_dT = 0;
9092 
9093 
9094  // built-in potential lowering: Vbs0
9095  T0 = -model_.dvbd1 * paramPtr->leff / paramPtr->litl;
9096  T1 = model_.dvbd0 * (exp(0.5*T0) + 2*exp(T0));
9097  T2 = T1 * (vbi - phi_local);
9098  T3 = 0.5 * paramPtr->qsi / model_.csi; // v3.2
9099  Vbs0t = PhiFD - T3 + model_.vbsa + T2;
9100  dVbs0t_dVg = dPhiFD_dVg;
9101  dVbs0t_dVd = dPhiFD_dVd;
9102  dVbs0t_dVe = dPhiFD_dVe;
9103  if (selfheat)
9104  dVbs0t_dT = dPhiFD_dT + T1 * dvbi_dT;
9105  else dVbs0t_dT = 0;
9106 
9107 
9108  T0 = 1 + model_.csi / Cbox;
9109  T3 = -model_.dk2b * paramPtr->leff / paramPtr->litl;
9110  T5 = model_.k2b * (exp(0.5*T3) + 2*exp(T3));
9111  T1 = (model_.k1b - T5) / T0;
9112  T2 = T1 * Vesfb;
9113  T0 = 1.0/(1 + Cbox / model_.csi);
9114  Vbs0 = T0 * Vbs0t + T2;
9115  dVbs0_dVg = T0 * dVbs0t_dVg;
9116  dVbs0_dVd = T0 * dVbs0t_dVd;
9117  dVbs0_dVe = T0 * dVbs0t_dVe + T1;
9118  if (selfheat)
9119  dVbs0_dT = T0 * dVbs0t_dT - T1 * dvfbb_dT;
9120  else
9121  dVbs0_dT = 0.0;
9122 
9123 
9124  // set lowerbound of Vbs (from SPICE) to Vbs0: Vbsitf
9125  // (Vbs at back interface)
9126  if (soiMod == 2) // v3.2 - v3.1 ideal FD: Vbsitf is pinned at Vbs0
9127  {
9128  Vbs = Vbsitf = Vbs0 + OFF_Vbsitf;
9129  dVbsitf_dVg = dVbs0_dVg;
9130  dVbsitf_dVd = dVbs0_dVd;
9131  dVbsitf_dVe = dVbs0_dVe;
9132  dVbsitf_dVb = 0.0;
9133  if (selfheat) dVbsitf_dT = dVbs0_dT;
9134  else dVbsitf_dT = 0;
9135  }
9136  else // soiMod = 1
9137  {
9138  T1 = Vbs - (Vbs0 + OFF_Vbsitf) - 0.01;
9139  T2 = sqrt(T1*T1 + 0.0001);
9140  T3 = 0.5 * (1 + T1/T2);
9141  Vbsitf = (Vbs0 + OFF_Vbsitf) + 0.5 * (T1 + T2);
9142  dVbsitf_dVg = (1 - T3) * dVbs0_dVg;
9143  dVbsitf_dVd = (1 - T3) * dVbs0_dVd;
9144  dVbsitf_dVe = (1 - T3) * dVbs0_dVe;
9145  dVbsitf_dVb = T3 ;
9146  if (selfheat) dVbsitf_dT = (1 - T3) * dVbs0_dT;
9147  else dVbsitf_dT = 0.0;
9148  }
9149 
9150  // Based on Vbsitf, calculate zero-field body potential for MOS: Vbsmos
9151  T1 = Vbs0t - Vbsitf - 0.005;
9152  T2 = sqrt(T1 * T1 + (2.5e-5));
9153  T3 = 0.5 * (T1 + T2);
9154  T4 = T3 * model_.csi / paramPtr->qsi; // v3.2
9155  Vbsmos = Vbsitf - 0.5 * T3 * T4;
9156  T5 = 0.5 * T4 * (1 + T1 / T2);
9157  dVbsmos_dVg = dVbsitf_dVg * (1 + T5) - T5 * dVbs0t_dVg;
9158  dVbsmos_dVd = dVbsitf_dVd * (1 + T5) - T5 * dVbs0t_dVd;
9159  dVbsmos_dVb = dVbsitf_dVb * (1 + T5);
9160  dVbsmos_dVe = dVbsitf_dVe * (1 + T5) - T5 * dVbs0t_dVe;
9161  if (selfheat)
9162  dVbsmos_dT = dVbsitf_dT * (1 + T5) - T5 * dVbs0t_dT;
9163  else
9164  dVbsmos_dT = 0.0;
9165  // Vbsmos should be used in MOS after some limiting (Vbseff)
9166 
9167 
9168  Vbp = Vbs - Vps;
9169  dVbp_dVb = 1;
9170  }
9171 // end of v3.0 block edition
9172 
9173 // v3.0 modification
9174  // T2 is Vbsmos limited above Vbsc=-5
9175  T0 = Vbsmos + 5 - 0.001;
9176  T1 = sqrt(T0 * T0 - 0.004 * (-5));
9177  T2 = (-5) + 0.5 * (T0 + T1);
9178  dT2_dVb = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVb;
9179  dT2_dVg = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVg;
9180  dT2_dVd = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVd;
9181  dT2_dVe = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVe;
9182  if (selfheat) dT2_dT = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dT;
9183  else dT2_dT = 0.0;
9184 
9185  // Vbsh is T2 limited below 1.5
9186  T0 = 1.5;
9187  T1 = T0 - T2 - 0.002;
9188  T3 = sqrt(T1 * T1 + 0.008 * T0);
9189  Vbsh = T0 - 0.5 * (T1 + T3);
9190  dVbsh_dVb = 0.5 * (1.0 + T1 / T3) * dT2_dVb;
9191  dVbsh_dVg = 0.5 * (1.0 + T1 / T3) * dT2_dVg;
9192  dVbsh_dVd = 0.5 * (1.0 + T1 / T3) * dT2_dVd;
9193  dVbsh_dVe = 0.5 * (1.0 + T1 / T3) * dT2_dVe;
9194  if (selfheat) dVbsh_dT = 0.5 * (1.0 + T1 / T3) * dT2_dT;
9195  else dVbsh_dT = 0.0;
9196 
9197  // Vbseff is Vbsh limited to 0.95*phi_local
9198  T0 = 0.95 * phi_local;
9199  T1 = T0 - Vbsh - 0.002;
9200  T2 = sqrt(T1 * T1 + 0.008 * T0);
9201  Vbseff = T0 - 0.5 * (T1 + T2);
9202  dVbseff_dVb = 0.5 * (1.0 + T1 / T2) * dVbsh_dVb;
9203  dVbseff_dVg = 0.5 * (1.0 + T1 / T2) * dVbsh_dVg;
9204  dVbseff_dVd = 0.5 * (1.0 + T1 / T2) * dVbsh_dVd;
9205  dVbseff_dVe = 0.5 * (1.0 + T1 / T2) * dVbsh_dVe;
9206  if (selfheat) dVbseff_dT = 0.5 * (1.0 + T1 / T2) * dVbsh_dT;
9207  else dVbseff_dT = 0.0;
9208  vbseff = Vbseff; // SPICE sol.
9209 
9210 // end of v3.0 modification
9211 
9212  // Below all the variables refer to Vbseff
9213  if (dVbseff_dVb < 1e-20) {
9214  dVbseff_dVb = 1e-20;
9215  dVbsh_dVb *= 1e20;
9216  }
9217  else
9218  dVbsh_dVb /= dVbseff_dVb;
9219 
9220  Phis = phi_local - Vbseff;
9221  dPhis_dVb = -1;
9222  sqrtPhis = sqrt(Phis);
9223  dsqrtPhis_dVb = -0.5 / sqrtPhis;
9224 
9225  Xdep = Xdep0 * sqrtPhis / sqrtPhi;
9226  dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb;
9227 
9228  // Vth Calculation
9229  T3 = sqrt(Xdep);
9230 
9231  T0 = paramPtr->dvt2 * Vbseff;
9232  if (T0 >= - 0.5)
9233  { T1 = 1.0 + T0;
9234  T2 = paramPtr->dvt2 ;
9235  }
9236  else
9237  // Added to avoid any discontinuity problems caused by dvt2
9238  { T4 = 1.0 / (3.0 + 8.0 * T0);
9239  T1 = (1.0 + 3.0 * T0) * T4;
9240  T2 = paramPtr->dvt2 * T4 * T4 ;
9241  }
9242  lt1 = model_.factor1 * T3 * T1;
9243  dlt1_dVb =model_.factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
9244 
9245  T0 = paramPtr->dvt2w * Vbseff;
9246  if (T0 >= - 0.5)
9247  { T1 = 1.0 + T0;
9248  T2 = paramPtr->dvt2w ;
9249  }
9250  else
9251  // Added to avoid any discontinuity problems caused by dvt2w
9252  { T4 = 1.0 / (3.0 + 8.0 * T0);
9253  T1 = (1.0 + 3.0 * T0) * T4;
9254  T2 = paramPtr->dvt2w * T4 * T4 ;
9255  }
9256  ltw= model_.factor1 * T3 * T1;
9257  dltw_dVb=model_.factor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2);
9258 
9259  T0 = -0.5 * paramPtr->dvt1 * Leff / lt1;
9260  if (T0 > -EXPL_THRESHOLD)
9261  { T1 = exp(T0);
9262  Theta0 = T1 * (1.0 + 2.0 * T1);
9263  dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb;
9264  dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb;
9265  }
9266  else
9267  { T1 = MIN_EXPL;
9268  Theta0 = T1 * (1.0 + 2.0 * T1);
9269  dTheta0_dVb = 0.0;
9270  }
9271 
9272  thetavth = paramPtr->dvt0 * Theta0;
9273  Delt_vth = thetavth * V0;
9274  dDelt_vth_dVb = paramPtr->dvt0 * dTheta0_dVb * V0;
9275  if (selfheat) dDelt_vth_dT = thetavth * dvbi_dT;
9276  else dDelt_vth_dT = 0.0;
9277 
9278  T0 = -0.5 * paramPtr->dvt1w * paramPtr->weff * Leff / ltw;
9279  if (T0 > -EXPL_THRESHOLD)
9280  { T1 = exp(T0);
9281  T2 = T1 * (1.0 + 2.0 * T1);
9282  dT1_dVb = -T0 / ltw * T1 * dltw_dVb;
9283  dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb;
9284  }
9285  else
9286  { T1 = MIN_EXPL;
9287  T2 = T1 * (1.0 + 2.0 * T1);
9288  dT2_dVb = 0.0;
9289  }
9290 
9291  T0 = paramPtr->dvt0w * T2;
9292  DeltVthw = T0 * V0;
9293  dDeltVthw_dVb = paramPtr->dvt0w * dT2_dVb * V0;
9294  if (selfheat) dDeltVthw_dT = T0 * dvbi_dT;
9295  else dDeltVthw_dT = 0.0;
9296 
9297  T0 = sqrt(1.0 + paramPtr->nlx / Leff);
9298  T1 = (paramPtr->kt1 + paramPtr->kt1l / Leff
9299  + paramPtr->kt2 * Vbseff);
9300  DeltVthtemp = paramPtr->k1eff * (T0 - 1.0) * sqrtPhi
9301  + T1 * TempRatioMinus1;
9302  if (selfheat)
9303  dDeltVthtemp_dT = T1 / model_.tnom;
9304  else
9305  dDeltVthtemp_dT = 0.0;
9306 
9307  tmp2 = model_.tox * phi_local
9308  / (paramPtr->weff + paramPtr->w0);
9309 
9310  T3 = paramPtr->eta0 + paramPtr->etab * Vbseff;
9311  if (T3 < 1.0e-4) // avoid discontinuity problems caused by etab
9312  { T9 = 1.0 / (3.0 - 2.0e4 * T3);
9313  T3 = (2.0e-4 - T3) * T9;
9314  T4 = T9 * T9 * paramPtr->etab;
9315  dT3_dVb = T4 ;
9316  }
9317  else
9318  {
9319  dT3_dVb = paramPtr->etab ;
9320  }
9321  DIBL_Sft = T3 * paramPtr->theta0vb0 * Vds;
9322  dDIBL_Sft_dVd = paramPtr->theta0vb0 * T3;
9323  dDIBL_Sft_dVb = paramPtr->theta0vb0 * Vds * dT3_dVb;
9324 
9325  T9 = 2.2361 / sqrtPhi;
9326  sqrtPhisExt = sqrtPhis - T9 * (Vbsh - Vbseff);
9327  dsqrtPhisExt_dVb = dsqrtPhis_dVb - T9 * (dVbsh_dVb - 1);
9328 
9329  Vth = model_.dtype * paramPtr->vth0 + paramPtr->k1eff
9330  * (sqrtPhisExt - sqrtPhi) - paramPtr->k2
9331  * Vbseff- Delt_vth - DeltVthw +(paramPtr->k3 + paramPtr->k3b
9332  * Vbseff) * tmp2 + DeltVthtemp - DIBL_Sft;
9333  von = Vth;
9334 
9335  T6 = paramPtr->k3b * tmp2 - paramPtr->k2
9337  dVth_dVb = paramPtr->k1eff * dsqrtPhisExt_dVb
9338  - dDelt_vth_dVb - dDeltVthw_dVb
9339  + T6 - dDIBL_Sft_dVb;
9340  // this is actually dVth_dVbseff
9341 
9342  dVth_dVd = -dDIBL_Sft_dVd;
9343  if (selfheat)
9344  dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT;
9345  else
9346  dVth_dT = 0.0;
9347 
9348  // dVthzb_dT calculation
9349  if ((model_.capMod == 3) && (selfheat == 1)) {
9350  T3zb = sqrt(Xdep0);
9351  ltwzb = lt1zb = model_.factor1 * T3zb;
9352 
9353  T0 = -0.5 * paramPtr->dvt1 * Leff / lt1zb;
9354  if (T0 > -EXPL_THRESHOLD)
9355  { T1 = exp(T0);
9356  Theta0zb = T1 * (1.0 + 2.0 * T1);
9357  }
9358  else
9359  { T1 = MIN_EXPL;
9360  Theta0zb = T1 * (1.0 + 2.0 * T1);
9361  }
9362  Delt_vthzb = paramPtr->dvt0 * Theta0zb * V0;
9363  dDelt_vthzb_dT = paramPtr->dvt0 * Theta0zb * dvbi_dT;
9364 
9365  T0 = -0.5 * paramPtr->dvt1w * paramPtr->weff * Leff / ltwzb;
9366  if (T0 > -EXPL_THRESHOLD)
9367  { T1 = exp(T0);
9368  T2 = T1 * (1.0 + 2.0 * T1);
9369  }
9370  else
9371  { T1 = MIN_EXPL;
9372  T2 = T1 * (1.0 + 2.0 * T1);
9373  }
9374  T0 = paramPtr->dvt0w * T2;
9375  DeltVthwzb = T0 * V0;
9376  dDeltVthwzb_dT = T0 * dvbi_dT;
9377 
9378  T0 = sqrt(1.0 + paramPtr->nlx / Leff);
9379  T1 = (paramPtr->kt1 + paramPtr->kt1l / Leff);
9380  DeltVthtempzb = paramPtr->k1eff * (T0 - 1.0) * sqrtPhi
9381  + T1 * TempRatioMinus1;
9382  dDeltVthtempzb_dT = T1 / model_.tnom;
9383 
9384  Vthzb = model_.dtype * paramPtr->vth0
9385  - Delt_vthzb - DeltVthwzb + paramPtr->k3 * tmp2
9386  + DeltVthtempzb;
9387  dVthzb_dT = dDeltVthtempzb_dT - dDelt_vthzb_dT - dDeltVthwzb_dT;
9388  }
9389 
9390 // Calculate nstar v3.2
9391  nstar = vtm / CONSTQ * (model_.cox + CONSTEPSSI /
9392  Xdep + paramPtr->cit);
9393 // Calculate n
9394  T2 = paramPtr->nfactor * CONSTEPSSI / Xdep;
9395  dT2_dVb = - T2 / Xdep * dXdep_dVb;
9396 
9397  T3 = paramPtr->cdsc + paramPtr->cdscb * Vbseff
9398  + paramPtr->cdscd * Vds;
9399  dT3_dVb = paramPtr->cdscb;
9400  dT3_dVd = paramPtr->cdscd;
9401 
9402  T4 = (T2 + T3 * Theta0 + paramPtr->cit) / model_.cox;
9403  dT4_dVb = (dT2_dVb + Theta0 * dT3_dVb + dTheta0_dVb * T3)
9404  / model_.cox;
9405  dT4_dVd = Theta0 * dT3_dVd / model_.cox;
9406 
9407  if (T4 >= -0.5)
9408  { n = 1.0 + T4;
9409  dn_dVb = dT4_dVb;
9410  dn_dVd = dT4_dVd;
9411  }
9412  else
9413  // avoid discontinuity problems caused by T4 *
9414  { T0 = 1.0 / (3.0 + 8.0 * T4);
9415  n = (1.0 + 3.0 * T4) * T0;
9416  T0 *= T0;
9417  dn_dVb = T0 * dT4_dVb;
9418  dn_dVd = T0 * dT4_dVd;
9419  }
9420 
9421 // Effective Vgst (Vgsteff_local) Calculation
9422 
9423  Vgst = Vgs_eff - Vth;
9425  dVgst_dVd = -dVth_dVd;
9426  dVgst_dVb = -dVth_dVb;
9427 
9428  T10 = 2.0 * n * Vtm;
9429  VgstNVt = Vgst / T10;
9430  ExpArg = (2.0 * paramPtr->voff - Vgst) / T10;
9431 
9432 
9433  // MCJ: Very small Vgst
9434  if (VgstNVt > EXPL_THRESHOLD)
9435  { Vgsteff_local = Vgst;
9436  // T0 is dVgsteff_dVbseff
9437  T0 = -dVth_dVb;
9438  dVgsteff_dVg = dVgs_eff_dVg + T0 * dVbseff_dVg; // v3.0
9439  dVgsteff_dVd = -dVth_dVd + T0 * dVbseff_dVd; // v3.0
9440  dVgsteff_dVb = T0 * dVbseff_dVb;
9441  dVgsteff_dVe = T0 * dVbseff_dVe; // v3.0
9442  if (selfheat)
9443  dVgsteff_dT = -dVth_dT + T0 * dVbseff_dT; // v3.0
9444  else
9445  dVgsteff_dT = 0.0;
9446  }
9447  else if (ExpArg > EXPL_THRESHOLD)
9448  { T0 = (Vgst - paramPtr->voff) / (n * Vtm);
9449  ExpVgst = exp(T0);
9450  Vgsteff_local = Vtm * paramPtr->cdep0 / model_.cox * ExpVgst;
9451  T3 = Vgsteff_local / (n * Vtm) ;
9452  // T1 is dVgsteff_dVbseff
9453  T1 = -T3 * (dVth_dVb + T0 * Vtm * dn_dVb);
9454  dVgsteff_dVg = T3 * dVgs_eff_dVg+ T1 * dVbseff_dVg; // v3.0
9455  dVgsteff_dVd = -T3 * (dVth_dVd + T0 * Vtm * dn_dVd)+
9456  T1 * dVbseff_dVd; // v3.0
9457  dVgsteff_dVe = T1 * dVbseff_dVe; // v3.0
9458  dVgsteff_dVb = T1 * dVbseff_dVb;
9459  if (selfheat)
9460  dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * n)
9461  + Vgsteff_local / Temp+ T1 * dVbseff_dT; // v3.0
9462  else
9463  dVgsteff_dT = 0.0;
9464  }
9465  else
9466  { ExpVgst = exp(VgstNVt);
9467  T1 = T10 * log(1.0 + ExpVgst);
9468 
9469  dT1_dVg = ExpVgst / (1.0 + ExpVgst);
9470  dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb)
9471  + T1 / n * dn_dVb;
9472  dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd)
9473  + T1 / n * dn_dVd;
9474  T3 = (1.0 / Temp);
9475  if (selfheat)
9476  dT1_dT = -dT1_dVg * (dVth_dT + Vgst * T3) + T1 * T3;
9477  else
9478  dT1_dT = 0.0;
9479 
9480  dT2_dVg = -model_.cox / (Vtm * paramPtr->cdep0) * exp(ExpArg);
9481  T2 = 1.0 - T10 * dT2_dVg;
9482  dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd)
9483  + (T2 - 1.0) / n * dn_dVd;
9484  dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm * ExpArg * dn_dVb)
9485  + (T2 - 1.0) / n * dn_dVb;
9486  if (selfheat)
9487  dT2_dT = -dT2_dVg * (dVth_dT - ExpArg * T10 * T3);
9488  else
9489  dT2_dT = 0.0;
9490 
9491  Vgsteff_local = T1 / T2;
9492  T3 = T2 * T2;
9493  // T4 is dVgsteff_dVbseff
9494  T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3;
9495  dVgsteff_dVb = T4 * dVbseff_dVb;
9496  dVgsteff_dVe = T4 * dVbseff_dVe; // v3.0
9497  dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3 * dVgs_eff_dVg
9498  + T4 * dVbseff_dVg; // v3.0
9499  dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3 +
9500  T4 * dVbseff_dVd; // v3.0
9501  if (selfheat)
9502  dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) / T3 +
9503  T4 * dVbseff_dT; // v3.0
9504  else
9505  dVgsteff_dT = 0.0;
9506  }
9507  Vgst2Vtm = Vgsteff_local + 2.0 * Vtm;
9508  if (selfheat)
9509  dVgst2Vtm_dT = dVgsteff_dT + 2.0 * dVtm_dT; // v3.1.1 bug fix
9510  else dVgst2Vtm_dT = 0.0;
9511  Vgsteff = Vgsteff_local; // v2.2.3 bug fix
9512 
9513 // Calculate Effective Channel Geometry
9514  T9 = sqrtPhis - sqrtPhi;
9515  Weff = paramPtr->weff - (2.0 - nbc) *
9516  (paramPtr->dwg * Vgsteff_local + paramPtr->dwb * T9);
9517  dWeff_dVg = -(2.0 - nbc) * paramPtr->dwg;
9518  dWeff_dVb = -(2.0 - nbc) * paramPtr->dwb * dsqrtPhis_dVb;
9519 
9520  if (Weff < 2.0e-8) // to avoid the discontinuity problem due to Weff
9521  { T0 = 1.0 / (6.0e-8 - 2.0 * Weff);
9522  Weff = 2.0e-8 * (4.0e-8 - Weff) * T0;
9523  T0 *= T0 * 4.0e-16;
9524  dWeff_dVg *= T0;
9525  dWeff_dVb *= T0;
9526  }
9527 
9528  T0 = paramPtr->prwg * Vgsteff_local + paramPtr->prwb * T9;
9529  if (T0 >= -0.9)
9530  { Rds = rds0 * (1.0 + T0);
9531  dRds_dVg = rds0 * paramPtr->prwg;
9532  dRds_dVb = rds0 * paramPtr->prwb * dsqrtPhis_dVb;
9533 
9534  if (selfheat && (Rds!=0.0)) dRds_dT = (1.0 + T0) * drds0_dT;
9535  else dRds_dT = 0.0;
9536  }
9537  else
9538  // to avoid the discontinuity problem due to prwg and prwb
9539  { T1 = 1.0 / (17.0 + 20.0 * T0);
9540  Rds = rds0 * (0.8 + T0) * T1;
9541  T1 *= T1;
9542  dRds_dVg = rds0 * paramPtr->prwg * T1;
9543  dRds_dVb = rds0 * paramPtr->prwb * dsqrtPhis_dVb * T1;
9544 
9545  if (selfheat && (Rds!=0.0)) dRds_dT = (0.8 + T0) * T1 * drds0_dT;
9546  else dRds_dT = 0.0;
9547  }
9548  rds = Rds; // v2.2.3 bug fix
9549 
9550 // Calculate Abulk_local
9551  if (paramPtr->a0 == 0.0) {
9552  Abulk0 = Abulk_local = 1.0;
9553  dAbulk0_dVb = dAbulk_dVg = dAbulk_dVb = 0.0;
9554  }
9555  else {
9556  T10 = paramPtr->keta * Vbsh;
9557  if (T10 >= -0.9) {
9558  T11 = 1.0 / (1.0 + T10);
9559  dT11_dVb = -paramPtr->keta * T11 * T11 * dVbsh_dVb;
9560  }
9561  else { // added to avoid the problems caused by Keta
9562  T12 = 1.0 / (0.8 + T10);
9563  T11 = (17.0 + 20.0 * T10) * T12;
9564  dT11_dVb = -paramPtr->keta * T12 * T12 * dVbsh_dVb;
9565  }
9566 
9567 // v3.0 bug fix
9568  T10 = phi_local + paramPtr->ketas;
9569 
9570  T13 = (Vbsh * T11) / T10;
9571  dT13_dVb = (Vbsh * dT11_dVb + T11 * dVbsh_dVb) / T10;
9572 
9573  // limit 1/sqrt(1-T13) to 6, starting at T13=0.96
9574  if (T13 < 0.96) {
9575  T14 = 1 / sqrt(1-T13);
9576  T10 = 0.5 * T14 / (1-T13);
9577  dT14_dVb = T10 * dT13_dVb;
9578  }
9579  else {
9580  T11 = 1.0 / (1.0 - 1.043406*T13);
9581  T14 = (6.00167 - 6.26044 * T13) * T11;
9582  T10 = 0.001742 * T11 * T11;
9583  dT14_dVb = T10 * dT13_dVb;
9584  }
9585 
9586 // v3.0 bug fix
9587  T10 = 0.5 * paramPtr->k1eff / sqrt(phi_local + paramPtr->ketas);
9588 
9589  T1 = T10 * T14;
9590  dT1_dVb = T10 * dT14_dVb;
9591 
9592  T9 = sqrt(paramPtr->xj * Xdep);
9593  tmp1 = Leff + 2.0 * T9;
9594  T5 = Leff / tmp1;
9595  tmp2 = paramPtr->a0 * T5;
9596  tmp3 = paramPtr->weff + paramPtr->b1;
9597  tmp4 = paramPtr->b0 / tmp3;
9598  T2 = tmp2 + tmp4;
9599  dT2_dVb = -T9 * tmp2 / tmp1 / Xdep * dXdep_dVb;
9600  T6 = T5 * T5;
9601  T7 = T5 * T6;
9602 
9603  Abulk0 = 1 + T1 * T2;
9604  dAbulk0_dVb = T1 * dT2_dVb + T2 * dT1_dVb;
9605 
9606  T8 = paramPtr->ags * paramPtr->a0 * T7;
9607  dAbulk_dVg = -T1 * T8;
9608  Abulk_local = Abulk0 + dAbulk_dVg * Vgsteff_local;
9609 
9610  dAbulk_dVb = dAbulk0_dVb
9611  - T8 * Vgsteff_local * (dT1_dVb + 3.0 * T1 * dT2_dVb / tmp2);
9612  }
9613 
9614  if (Abulk0 < 0.01)
9615  {
9616  T9 = 1.0 / (3.0 - 200.0 * Abulk0);
9617  Abulk0 = (0.02 - Abulk0) * T9;
9618  dAbulk0_dVb *= T9 * T9;
9619  }
9620 
9621  if (Abulk_local < 0.01)
9622  {
9623  T9 = 1.0 / (3.0 - 200.0 * Abulk_local);
9624  Abulk_local = (0.02 - Abulk_local) * T9;
9625  dAbulk_dVb *= T9 * T9;
9626  T10 = T9 * T9; // 3.2 bug fix
9627  dAbulk_dVg *= T10; // 3.2 bug fix
9628  }
9629 
9630  Abulk = Abulk_local; // v3.2 for noise
9631 
9632 // Mobility calculation
9633  if (model_.mobMod == 1)
9634  { T0 = Vgsteff_local + Vth + Vth;
9635  T2 = ua + uc * Vbseff;
9636  T3 = T0 / model_.tox;
9637  T5 = T3 * (T2 + ub * T3);
9638  dDenomi_dVg = (T2 + 2.0 * ub * T3) / model_.tox;
9639  dDenomi_dVd = dDenomi_dVg * 2 * dVth_dVd;
9640  dDenomi_dVb = dDenomi_dVg * 2 * dVth_dVb + uc * T3 ;
9641  if (selfheat)
9642  dDenomi_dT = dDenomi_dVg * 2 * dVth_dT
9643  + (dua_dT + Vbseff * duc_dT + dub_dT * T3 ) * T3;
9644  else
9645  dDenomi_dT = 0.0;
9646  }
9647  else if (model_.mobMod == 2)
9648  { T5 = Vgsteff_local / model_.tox * (ua + uc * Vbseff
9649  + ub * Vgsteff_local / model_.tox);
9650  dDenomi_dVg = (ua + uc * Vbseff + 2.0 * ub * Vgsteff_local
9651  / model_.tox) / model_.tox;
9652  dDenomi_dVd = 0.0;
9653  dDenomi_dVb = Vgsteff_local * uc / model_.tox ;
9654  if (selfheat)
9655  dDenomi_dT = Vgsteff_local / model_.tox * (dua_dT + Vbseff
9656  * duc_dT + dub_dT * Vgsteff_local / model_.tox);
9657  else
9658  dDenomi_dT = 0.0;
9659  }
9660  else // mobMod == 3
9661  { T0 = Vgsteff_local + Vth + Vth;
9662  T2 = 1.0 + uc * Vbseff;
9663  T3 = T0 / model_.tox;
9664  T4 = T3 * (ua + ub * T3);
9665  T5 = T4 * T2;
9666  dDenomi_dVg = (ua + 2.0 * ub * T3) * T2 / model_.tox;
9667  dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd;
9668  dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + uc * T4 ;
9669  if (selfheat)
9670  dDenomi_dT = dDenomi_dVg * 2.0 * dVth_dT + (dua_dT + dub_dT * T3)
9671  * T3 * T2 + T4 * Vbseff * duc_dT;
9672  else
9673  dDenomi_dT = 0.0;
9674  }
9675 
9676  if (T5 >= -0.8)
9677  { Denomi = 1.0 + T5;
9678  }
9679  else // Added to avoid the discontinuity problem caused by ua and ub
9680  { T9 = 1.0 / (7.0 + 10.0 * T5);
9681  Denomi = (0.6 + T5) * T9;
9682  T9 *= T9;
9683  dDenomi_dVg *= T9;
9684  dDenomi_dVd *= T9;
9685  dDenomi_dVb *= T9;
9686  if (selfheat) dDenomi_dT *= T9;
9687  else dDenomi_dT = 0.0;
9688  }
9689 
9690  ueff = ueff_local = u0temp / Denomi;
9691  T9 = -ueff_local / Denomi;
9692  dueff_dVg = T9 * dDenomi_dVg;
9693  dueff_dVd = T9 * dDenomi_dVd;
9694  dueff_dVb = T9 * dDenomi_dVb;
9695  if (selfheat) dueff_dT = T9 * dDenomi_dT + du0temp_dT / Denomi;
9696  else dueff_dT = 0.0;
9697 
9698 // Saturation Drain Voltage Vdsat
9699  WVCox = Weff * vsattemp * model_.cox;
9700  WVCoxRds = WVCox * Rds;
9701 
9702 //dWVCoxRds_dT = WVCox * dRds_dT
9703 // + Weff * model_.cox * Rds * dvsattemp_dT;
9704 
9705  Esat = 2.0 * vsattemp / ueff_local;
9706  EsatL = Esat * Leff;
9707  T0 = -EsatL /ueff_local;
9708  dEsatL_dVg = T0 * dueff_dVg;
9709  dEsatL_dVd = T0 * dueff_dVd;
9710  dEsatL_dVb = T0 * dueff_dVb;
9711  if (selfheat)
9712  dEsatL_dT = T0 * dueff_dT + EsatL / vsattemp * dvsattemp_dT;
9713  else
9714  dEsatL_dT = 0.0;
9715 
9716  // Sqrt()
9717  a1 = paramPtr->a1;
9718  if (a1 == 0.0)
9719  { Lambda = paramPtr->a2;
9720  dLambda_dVg = 0.0;
9721  }
9722  else if (a1 > 0.0)
9723 // Added to avoid the discontinuity problem caused by a1 and a2 (Lambda)
9724  { T0 = 1.0 - paramPtr->a2;
9725  T1 = T0 - paramPtr->a1 * Vgsteff_local - 0.0001;
9726  T2 = sqrt(T1 * T1 + 0.0004 * T0);
9727  Lambda = paramPtr->a2 + T0 - 0.5 * (T1 + T2);
9728  dLambda_dVg = 0.5 * paramPtr->a1 * (1.0 + T1 / T2);
9729  }
9730  else
9731  { T1 = paramPtr->a2 + paramPtr->a1 * Vgsteff_local - 0.0001;
9732  T2 = sqrt(T1 * T1 + 0.0004 * paramPtr->a2);
9733  Lambda = 0.5 * (T1 + T2);
9734  dLambda_dVg = 0.5 * paramPtr->a1 * (1.0 + T1 / T2);
9735  }
9736 
9737  AbovVgst2Vtm = Abulk_local /Vgst2Vtm; // v2.2.3 bug fix
9738 
9739  if (Rds > 0)
9740  { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff;
9741  tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff;
9742  }
9743  else
9744  { tmp2 = dWeff_dVg / Weff;
9745  tmp3 = dWeff_dVb / Weff;
9746  }
9747  if ((Rds == 0.0) && (Lambda == 1.0))
9748  { T0 = 1.0 / (Abulk_local * EsatL + Vgst2Vtm);
9749  tmp1 = 0.0;
9750  T1 = T0 * T0;
9751  T2 = Vgst2Vtm * T0;
9752  T3 = EsatL * Vgst2Vtm;
9753  Vdsat = T3 * T0;
9754 
9755  dT0_dVg = -(Abulk_local * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1;
9756  dT0_dVd = -(Abulk_local * dEsatL_dVd) * T1;
9757  dT0_dVb = -(Abulk_local * dEsatL_dVb + EsatL * dAbulk_dVb) * T1;
9758  if (selfheat)
9759  dT0_dT = -(Abulk_local * dEsatL_dT + dVgst2Vtm_dT) * T1;
9760  else dT0_dT = 0.0;
9761 
9762  dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0;
9763  dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd;
9764  dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb;
9765  if (selfheat)
9766  dVdsat_dT = T3 * dT0_dT + T2 * dEsatL_dT
9767  + EsatL * T0 * dVgst2Vtm_dT;
9768  else dVdsat_dT = 0.0;
9769  }
9770  else
9771  { tmp1 = dLambda_dVg / (Lambda * Lambda);
9772  T9 = Abulk_local * WVCoxRds;
9773  T8 = Abulk_local * T9;
9774  T7 = Vgst2Vtm * T9;
9775  T6 = Vgst2Vtm * WVCoxRds;
9776  T0 = 2.0 * Abulk_local * (T9 - 1.0 + 1.0 / Lambda);
9777  dT0_dVg = 2.0 * (T8 * tmp2 - Abulk_local * tmp1
9778  + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg);
9779 // this is equivalent to one below, but simpler
9780 // dT0_dVb = 2.0 * (T8 * tmp3 + (2.0 * T9 + 1.0 /
9781 // Lambda - 1.0) * dAbulk_dVg);
9782  dT0_dVb = 2.0 * (T8 * (2.0 / Abulk_local * dAbulk_dVb + tmp3)
9783  + (1.0 / Lambda - 1.0) * dAbulk_dVb);
9784  dT0_dVd = 0.0;
9785 
9786  if (selfheat)
9787  {
9788  if (Rds!=0.0)
9789  tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp;
9790  else
9791  tmp4 = dvsattemp_dT / vsattemp;
9792 
9793  dT0_dT = 2.0 * T8 * tmp4;
9794 
9795  } else tmp4 = dT0_dT = 0.0;
9796 
9797  T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk_local * EsatL + 3.0 * T7;
9798 
9799  dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1
9800  + Abulk_local * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9
9801  + T7 * tmp2 + T6 * dAbulk_dVg);
9802  dT1_dVb = Abulk_local * dEsatL_dVb + EsatL * dAbulk_dVb
9803  + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3);
9804  dT1_dVd = Abulk_local * dEsatL_dVd;
9805 
9806  if (selfheat)
9807  {
9808  tmp4 += dVgst2Vtm_dT / Vgst2Vtm;
9809  dT1_dT = (2.0 / Lambda - 1.0) * dVgst2Vtm_dT + Abulk_local
9810  * dEsatL_dT + 3.0 * T7 * tmp4;
9811  } else
9812  dT1_dT = 0.0;
9813 
9814  T2 = Vgst2Vtm * (EsatL + 2.0 * T6);
9815  dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg
9816  + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2);
9817  dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3);
9818  dT2_dVd = Vgst2Vtm * dEsatL_dVd;
9819  if (selfheat)
9820  dT2_dT = Vgst2Vtm * dEsatL_dT + EsatL * dVgst2Vtm_dT
9821  + 2.0 * T6 * (dVgst2Vtm_dT + Vgst2Vtm * tmp4);
9822  else
9823  dT2_dT = 0.0;
9824 
9825  T3 = sqrt(T1 * T1 - 2.0 * T0 * T2);
9826  Vdsat = (T1 - T3) / T0;
9827 
9828  dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2
9829  - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0;
9830  dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2
9831  - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0;
9832  dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0;
9833  if (selfheat)
9834  dVdsat_dT = (dT1_dT - (T1 * dT1_dT - dT0_dT * T2
9835  - T0 * dT2_dT) / T3 - Vdsat * dT0_dT) / T0;
9836  else dVdsat_dT = 0.0;
9837  }
9838  vdsat = Vdsat;
9839 
9840 // Effective Vds (Vdseff_local) Calculation
9841  T1 = Vdsat - Vds - paramPtr->delta;
9842  dT1_dVg = dVdsat_dVg;
9843  dT1_dVd = dVdsat_dVd - 1.0;
9844  dT1_dVb = dVdsat_dVb;
9845  dT1_dT = dVdsat_dT;
9846 
9847  T2 = sqrt(T1 * T1 + 4.0 * paramPtr->delta * Vdsat);
9848  T0 = T1 / T2;
9849  T3 = 2.0 * paramPtr->delta / T2;
9850  dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg;
9851  dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd;
9852  dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb;
9853  if (selfheat)
9854  dT2_dT = T0 * dT1_dT + T3 * dVdsat_dT;
9855  else
9856  dT2_dT = 0.0;
9857 
9858  Vdseff_local = Vdsat - 0.5 * (T1 + T2);
9859  dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg);
9860  dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd);
9861  dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb);
9862 
9863  if (selfheat)
9864  dVdseff_dT = dVdsat_dT - 0.5 * (dT1_dT + dT2_dT);
9865  else
9866  dVdseff_dT = 0.0;
9867 
9868  if (Vdseff_local > Vds)
9869  Vdseff_local = Vds; // This code is added to fixed the problem
9870  // caused by computer precision when
9871  // Vds is very close to Vdseff_local.
9872  diffVds = Vds - Vdseff_local;
9873  Vdseff = Vdseff_local; // v2.2.3 bug fix
9874 
9875 // Calculate VAsat
9876  tmp4 = 1.0 - 0.5 * Abulk_local * Vdsat / Vgst2Vtm;
9877  T9 = WVCoxRds * Vgsteff_local;
9878  T8 = T9 / Vgst2Vtm;
9879  T0 = EsatL + Vdsat + 2.0 * T9 * tmp4;
9880 
9881  T7 = 2.0 * WVCoxRds * tmp4;
9882  dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff_local)
9883  - T8 * (Abulk_local * dVdsat_dVg - Abulk_local * Vdsat / Vgst2Vtm
9884  + Vdsat * dAbulk_dVg);
9885  dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff_local
9886  - T8 * (dAbulk_dVb * Vdsat + Abulk_local * dVdsat_dVb);
9887  dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk_local * dVdsat_dVd;
9888 
9889  if (selfheat)
9890  {
9891  if (Rds!=0.0)
9892  tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp;
9893  else
9894  tmp4 = dvsattemp_dT / vsattemp;
9895  dT0_dT = dEsatL_dT + dVdsat_dT + T7 * tmp4 * Vgsteff_local - T8 *
9896  (Abulk_local * dVdsat_dT - Abulk_local * Vdsat * dVgst2Vtm_dT
9897  / Vgst2Vtm);
9898  } else
9899  dT0_dT = 0.0;
9900 
9901  T9 = WVCoxRds * Abulk_local;
9902  T1 = 2.0 / Lambda - 1.0 + T9;
9903  dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk_local * tmp2 + dAbulk_dVg);
9904  dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3;
9905  if (selfheat)
9906  dT1_dT = T9 * tmp4;
9907  else
9908  dT1_dT = 0.0;
9909 
9910  Vasat = T0 / T1;
9911  dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1;
9912  dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1;
9913  dVasat_dVd = dT0_dVd / T1;
9914  if (selfheat)
9915  dVasat_dT = (dT0_dT - Vasat * dT1_dT) / T1;
9916  else
9917  dVasat_dT = 0.0;
9918 
9919 // Calculate VACLM
9920  if ((paramPtr->pclm > 0.0) && (diffVds > 1.0e-10))
9921  { T0 = 1.0 / (paramPtr->pclm * Abulk_local * paramPtr->litl);
9922  dT0_dVb = -T0 / Abulk_local * dAbulk_dVb;
9923  dT0_dVg = -T0 / Abulk_local * dAbulk_dVg;
9924 
9925  T2 = Vgsteff_local / EsatL;
9926  T1 = Leff * (Abulk_local + T2);
9927  dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg);
9928  dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL);
9929  dT1_dVd = -T2 * dEsatL_dVd / Esat;
9930  if (selfheat)
9931  dT1_dT = -T2 * dEsatL_dT / Esat;
9932  else
9933  dT1_dT = 0.0;
9934 
9935  T9 = T0 * T1;
9936  VACLM = T9 * diffVds;
9937  dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg
9938  + T1 * diffVds * dT0_dVg;
9939  dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds
9940  - T9 * dVdseff_dVb;
9941  dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd);
9942  if (selfheat)
9943  dVACLM_dT = T0 * dT1_dT * diffVds - T9 * dVdseff_dT;
9944  else
9945  dVACLM_dT = 0.0;
9946  }
9947  else
9948  { VACLM = MAX_EXPL;
9949  dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = dVACLM_dT = 0.0;
9950  }
9951 
9952 // Calculate VADIBL
9953  if (paramPtr->thetaRout > 0.0)
9954  { T8 = Abulk_local * Vdsat;
9955  T0 = Vgst2Vtm * T8;
9956  T1 = Vgst2Vtm + T8;
9957  dT0_dVg = Vgst2Vtm * Abulk_local * dVdsat_dVg + T8
9958  + Vgst2Vtm * Vdsat * dAbulk_dVg;
9959  dT1_dVg = 1.0 + Abulk_local * dVdsat_dVg + Vdsat * dAbulk_dVg;
9960  dT1_dVb = dAbulk_dVb * Vdsat + Abulk_local * dVdsat_dVb;
9961  dT0_dVb = Vgst2Vtm * dT1_dVb;
9962  dT1_dVd = Abulk_local * dVdsat_dVd;
9963  dT0_dVd = Vgst2Vtm * dT1_dVd;
9964  if (selfheat)
9965  {
9966  dT0_dT = dVgst2Vtm_dT * T8 + Abulk_local * Vgst2Vtm * dVdsat_dT;
9967  dT1_dT = dVgst2Vtm_dT + Abulk_local * dVdsat_dT;
9968  } else
9969  dT0_dT = dT1_dT = 0.0;
9970 
9971  T9 = T1 * T1;
9972  T2 = paramPtr->thetaRout;
9973  VADIBL = (Vgst2Vtm - T0 / T1) / T2;
9974  dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2;
9975  dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2;
9976  dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2;
9977  if (selfheat)
9978  dVADIBL_dT = (dVgst2Vtm_dT - dT0_dT/T1 + T0*dT1_dT/T9) / T2;
9979  else
9980  dVADIBL_dT = 0.0;
9981 
9982  T7 = paramPtr->pdiblb * Vbseff;
9983  if (T7 >= -0.9)
9984  { T3 = 1.0 / (1.0 + T7);
9985  VADIBL *= T3;
9986  dVADIBL_dVg *= T3;
9987  dVADIBL_dVb = (dVADIBL_dVb - VADIBL * paramPtr->pdiblb) * T3;
9988  dVADIBL_dVd *= T3;
9989  if (selfheat) dVADIBL_dT *= T3;
9990  else dVADIBL_dT = 0.0;
9991  }
9992  else
9993 // Added to avoid the discontinuity problem caused by pdiblcb
9994  { T4 = 1.0 / (0.8 + T7);
9995  T3 = (17.0 + 20.0 * T7) * T4;
9996  dVADIBL_dVg *= T3;
9997  dVADIBL_dVb = dVADIBL_dVb * T3
9998  - VADIBL * paramPtr->pdiblb * T4 * T4;
9999  dVADIBL_dVd *= T3;
10000  if (selfheat) dVADIBL_dT *= T3;
10001  else dVADIBL_dT = 0.0;
10002  VADIBL *= T3;
10003  }
10004  }
10005  else
10006  { VADIBL = MAX_EXPL;
10007  dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = dVADIBL_dT = 0.0;
10008  }
10009 
10010 // Calculate VA
10011 
10012  T8 = paramPtr->pvag / EsatL;
10013  T9 = T8 * Vgsteff_local;
10014  if (T9 > -0.9)
10015  { T0 = 1.0 + T9;
10016  dT0_dVg = T8 * (1.0 - Vgsteff_local * dEsatL_dVg / EsatL);
10017  dT0_dVb = -T9 * dEsatL_dVb / EsatL;
10018  dT0_dVd = -T9 * dEsatL_dVd / EsatL;
10019  if (selfheat)
10020  dT0_dT = -T9 * dEsatL_dT / EsatL;
10021  else
10022  dT0_dT = 0.0;
10023  }
10024  else // Added to avoid the discontinuity problems caused by pvag
10025  { T1 = 1.0 / (17.0 + 20.0 * T9);
10026  T0 = (0.8 + T9) * T1;
10027  T1 *= T1;
10028  dT0_dVg = T8 * (1.0 - Vgsteff_local * dEsatL_dVg / EsatL) * T1;
10029 
10030  T9 *= T1 / EsatL;
10031  dT0_dVb = -T9 * dEsatL_dVb;
10032  dT0_dVd = -T9 * dEsatL_dVd;
10033  if (selfheat)
10034  dT0_dT = -T9 * dEsatL_dT;
10035  else
10036  dT0_dT = 0.0;
10037  }
10038 
10039  tmp1 = VACLM * VACLM;
10040  tmp2 = VADIBL * VADIBL;
10041  tmp3 = VACLM + VADIBL;
10042 
10043  T1 = VACLM * VADIBL / tmp3;
10044  tmp3 *= tmp3;
10045  dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3;
10046  dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3;
10047  dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3;
10048  if (selfheat)
10049  dT1_dT = (tmp1 * dVADIBL_dT + tmp2 * dVACLM_dT ) / tmp3;
10050  else
10051  dT1_dT = 0.0;
10052 
10053  Va = Vasat + T0 * T1;
10054  dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg;
10055  dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd;
10056  dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb;
10057  if (selfheat)
10058  dVa_dT = dVasat_dT + T1 * dT0_dT + T0 * dT1_dT;
10059  else
10060  dVa_dT = 0.0;
10061 
10062 // Calculate Ids
10063  CoxWovL = model_.cox * Weff / Leff;
10064  beta = ueff_local * CoxWovL;
10065  dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff ;
10066  dbeta_dVd = CoxWovL * dueff_dVd;
10067  dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff ;
10068  if (selfheat) dbeta_dT = CoxWovL * dueff_dT;
10069  else dbeta_dT = 0.0;
10070 
10071  T0 = 1.0 - 0.5 * Abulk_local * Vdseff_local / Vgst2Vtm;
10072  dT0_dVg = -0.5 * (Abulk_local * dVdseff_dVg
10073  - Abulk_local * Vdseff_local / Vgst2Vtm + Vdseff_local
10074  * dAbulk_dVg) / Vgst2Vtm;
10075  dT0_dVd = -0.5 * Abulk_local * dVdseff_dVd / Vgst2Vtm;
10076  dT0_dVb = -0.5 * (Abulk_local * dVdseff_dVb + dAbulk_dVb *
10077  Vdseff_local) / Vgst2Vtm;
10078  if (selfheat)
10079  dT0_dT = -0.5 * (Abulk_local * dVdseff_dT
10080  - Abulk_local * Vdseff_local / Vgst2Vtm
10081  * dVgst2Vtm_dT) / Vgst2Vtm;
10082  else
10083  dT0_dT = 0.0;
10084 
10085  fgche1 = Vgsteff_local * T0;
10086  dfgche1_dVg = Vgsteff_local * dT0_dVg + T0;
10087  dfgche1_dVd = Vgsteff_local * dT0_dVd;
10088  dfgche1_dVb = Vgsteff_local * dT0_dVb;
10089  if (selfheat) dfgche1_dT = Vgsteff_local * dT0_dT;
10090  else dfgche1_dT = 0.0;
10091 
10092  T9 = Vdseff_local / EsatL;
10093  fgche2 = 1.0 + T9;
10094  dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL;
10095  dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL;
10096  dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL;
10097  if (selfheat)
10098  dfgche2_dT = (dVdseff_dT - T9 * dEsatL_dT) / EsatL;
10099  else
10100  dfgche2_dT = 0.0;
10101 
10102  gche = beta * fgche1 / fgche2;
10103 
10104  dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg
10105  - gche * dfgche2_dVg) / fgche2;
10106  dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd
10107  - gche * dfgche2_dVd) / fgche2;
10108  dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb
10109  - gche * dfgche2_dVb) / fgche2;
10110  if (selfheat)
10111  dgche_dT = (beta * dfgche1_dT + fgche1 * dbeta_dT
10112  - gche * dfgche2_dT) / fgche2;
10113  else
10114  dgche_dT = 0.0;
10115 
10116  T0 = 1.0 + gche * Rds;
10117  T9 = Vdseff_local / T0;
10118  Idl = gche * T9;
10119 
10120 // Whoa, these formulas for the derivatives of Idl are convoluted,
10121 // but I verified them to be correct
10122 
10123  dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0
10124  - Idl * gche / T0 * dRds_dVg ;
10125  dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0;
10126  dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb
10127  - Idl * dRds_dVb * gche) / T0;
10128  if (selfheat)
10129  dIdl_dT = (gche * dVdseff_dT + T9 * dgche_dT
10130  - Idl * dRds_dT * gche) / T0;
10131  else
10132  dIdl_dT = 0.0;
10133 
10134  T9 = diffVds / Va;
10135  T0 = 1.0 + T9;
10136  ids = Ids = Idl * T0 / nseg;
10137 
10138  Gm0 = T0 * dIdl_dVg - Idl * ( dVdseff_dVg + T9 * dVa_dVg) / Va;
10139  Gmb0 = T0 * dIdl_dVb - Idl * ( dVdseff_dVb + T9 * dVa_dVb) / Va;
10140  Gds0 = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - T9 * dVa_dVd) / Va;
10141 
10142  // v3.1 wanh added for RF
10143  tmp1 = Gds0 + Gm0 * dVgsteff_dVd;
10144  tmp2 = Gmb0 + Gm0 * dVgsteff_dVb;
10145  tmp3 = Gm0;
10146  // v3.1 wanh added for RF end
10147 
10148  if (selfheat)
10149  GmT0 = T0 * dIdl_dT - Idl * (dVdseff_dT + T9 * dVa_dT) / Va;
10150  else
10151  GmT0 = 0.0;
10152 
10153 // This includes all dependencies from Vgsteff_local, Vbseff
10154 
10155  Gm = (Gm0 * dVgsteff_dVg+ Gmb0 * dVbseff_dVg) / nseg; // v3.0
10156  Gmb = (Gm0 * dVgsteff_dVb + Gmb0 * dVbseff_dVb) / nseg;
10157  Gds = (Gm0 * dVgsteff_dVd+ Gmb0 * dVbseff_dVd + Gds0) / nseg;
10158  Gme = (Gm0 * dVgsteff_dVe + Gmb0 * dVbseff_dVe) / nseg; // v3.0
10159  if (selfheat)
10160  GmT = (Gm0 * dVgsteff_dT+ Gmb0 * dVbseff_dT + GmT0) / nseg;
10161  else
10162  GmT = 0.0;
10163 
10164 // v3.1
10165  if (soiMod != 2) // v3.2
10166  {
10167  // calculate GIDL current
10168  T0 = 3 * model_.tox;
10169  // For drain side
10170  T1 = (Vds - Vgs_eff - paramPtr->ngidl) / T0;
10171  if ((paramPtr->agidl <= 0.0) || (paramPtr->bgidl <= 0.0) ||
10172  (T1 <= 0.0))
10173  { Idgidl = Gdgidld = Gdgidlg = 0.0;
10174  }
10175  else {
10176  dT1_dVd = 1 / T0;
10177  dT1_dVg = - dT1_dVd * dVgs_eff_dVg;
10178  T2 = paramPtr->bgidl / T1;
10179  if (T2 < EXPL_THRESHOLD)
10180  {
10181  Idgidl = wdiod * paramPtr->agidl * T1 * exp(-T2);
10182  T3 = Idgidl / T1 * (T2 + 1);
10183  Gdgidld = T3 * dT1_dVd;
10184  Gdgidlg = T3 * dT1_dVg;
10185  } else
10186  {
10187  T3 = wdiod * paramPtr->agidl * MIN_EXPL;
10188  Idgidl = T3 * T1 ;
10189  Gdgidld = T3 * dT1_dVd;
10190  Gdgidlg = T3 * dT1_dVg;
10191  }
10192  }
10193  igidl = Idgidl;
10194 
10195  // For source side
10196  T1 = (- Vgs_eff - paramPtr->ngidl) / T0;
10197  if ((paramPtr->agidl <= 0.0) || (paramPtr->bgidl <= 0.0)
10198  || (T1 <= 0.0))
10199  { Isgidl = Gsgidlg = 0;
10200  }
10201  else
10202  {
10203  dT1_dVg = - dVgs_eff_dVg / T0;
10204  T2 = paramPtr->bgidl / T1;
10205  if (T2 < EXPL_THRESHOLD)
10206  {
10207  Isgidl = wdios * paramPtr->agidl * T1 * exp(-T2);
10208  T3 = Isgidl / T1 * (T2 + 1);
10209  Gsgidlg = T3 * dT1_dVg;
10210  } else
10211  {
10212  T3 = wdios * paramPtr->agidl * MIN_EXPL;
10213  Isgidl = T3 * T1 ;
10214  Gsgidlg = T3 * dT1_dVg;
10215  }
10216  }
10217 
10218  // calculate diode and BJT current
10219  WsTsi = wdios * model_.tsi;
10220  WdTsi = wdiod * model_.tsi;
10221 
10222  NVtm1 = Vtm * paramPtr->ndiode;
10223  if (selfheat)
10224  dNVtm1_dT = paramPtr->ndiode * dVtm_dT;
10225  else
10226  dNVtm1_dT = 0;
10227 
10228  T0 = Vbs / NVtm1;
10229  dT0_dVb = 1.0 / NVtm1;
10230  if (selfheat)
10231  dT0_dT = -Vbs / NVtm1 / NVtm1 * dNVtm1_dT;
10232  else
10233  dT0_dT = 0;
10234  CEXP(T0, ExpVbsNVtm, T1);
10235  dExpVbsNVtm_dVb = T1 * dT0_dVb;
10236  if (selfheat)
10237  dExpVbsNVtm_dT = T1 * dT0_dT;
10238  else
10239  dExpVbsNVtm_dT = 0;
10240 
10241  T0 = Vbd / NVtm1;
10242  dT0_dVb = 1.0 / NVtm1;
10243  dT0_dVd = -dT0_dVb;
10244  if (selfheat)
10245  dT0_dT = -Vbd / NVtm1 / NVtm1 * dNVtm1_dT;
10246  else
10247  dT0_dT = 0;
10248  CEXP(T0, ExpVbdNVtm, T1);
10249  dExpVbdNVtm_dVb = T1 * dT0_dVb;
10250  dExpVbdNVtm_dVd = -dExpVbdNVtm_dVb;
10251  if (selfheat)
10252  dExpVbdNVtm_dT = T1 * dT0_dT;
10253  else
10254  dExpVbdNVtm_dT = 0;
10255 
10256  // Ibs1 / Ibd1 : diffusion current
10257  if (jdif == 0) {
10258  Ibs1 = dIbs1_dVb = dIbs1_dT = Ibd1 = dIbd1_dVb
10259  = dIbd1_dVd = dIbd1_dT = 0;
10260  }
10261  else {
10262  T0 = WsTsi * jdif;
10263  if (selfheat)
10264  dT0_dT = WsTsi * djdif_dT;
10265  else
10266  dT0_dT = 0;
10267  Ibs1 = T0 * (ExpVbsNVtm - 1);
10268  dIbs1_dVb = T0 * dExpVbsNVtm_dVb;
10269  if (selfheat)
10270  dIbs1_dT = T0 * dExpVbsNVtm_dT + (ExpVbsNVtm - 1) * dT0_dT;
10271  else
10272  dIbs1_dT = 0;
10273 
10274  T0 = WdTsi * jdif;
10275  if (selfheat)
10276  dT0_dT = WdTsi * djdif_dT;
10277  else
10278  dT0_dT = 0;
10279  Ibd1 = T0 * (ExpVbdNVtm - 1);
10280  dIbd1_dVb = T0 * dExpVbdNVtm_dVb;
10281  dIbd1_dVd = -dIbd1_dVb;
10282  if (selfheat)
10283  dIbd1_dT = T0 * dExpVbdNVtm_dT + (ExpVbdNVtm -1) * dT0_dT;
10284  else
10285  dIbd1_dT = 0;
10286  }
10287 
10288  // Ibs2:recombination/trap-assisted tunneling current
10289  NVtmf = 0.026 * paramPtr->nrecf0
10290  * (1 + paramPtr->ntrecf * (TempRatio - 1));
10291  NVtmr = 0.026 * paramPtr->nrecr0 // v2.2.2 bug fix
10292  * (1 + paramPtr->ntrecr * (TempRatio - 1));
10293  if (selfheat) {
10294  dNVtmf_dT = paramPtr->nrecf0 * 0.026
10295  * paramPtr->ntrecf * dTempRatio_dT;
10296  dNVtmr_dT = paramPtr->nrecr0 * 0.026 // v2.2.2 bug fix
10297  * paramPtr->ntrecr * dTempRatio_dT;
10298  }
10299  else
10300  dNVtmf_dT = dNVtmr_dT = 0;
10301 
10302  if (jrec == 0) {
10303  Ibs2 = dIbs2_dVb = dIbs2_dT = 0;
10304  Ibd2 = dIbd2_dVb = dIbd2_dVd = dIbd2_dT = 0;
10305  }
10306  else {
10307  // forward bias
10308  T0 = Vbs / NVtmf;
10309  CEXP(T0,T10,T2);
10310  T4 = 1 / NVtmf;
10311  dT10_dVb = T4 * T2;
10312  if (selfheat)
10313  dT10_dT = - T4 * T2 * Vbs / NVtmf * dNVtmf_dT ;
10314  else dT10_dT = 0.0;
10315 
10316  // reverse bias
10317  if ((paramPtr->vrec0 - Vbs) < 1e-3) {
10318 
10319  // v2.2.3 bug fix
10320  T1 = 1e3;
10321  T0 = -Vbs / NVtmr * paramPtr->vrec0 * T1;
10322  T11 = -exp(T0);
10323 
10324  dT11_dVb = dT11_dT = 0;
10325  }
10326  else {
10327  T1 = 1 / (paramPtr->vrec0 - Vbs);
10328  T0 = -Vbs / NVtmr * paramPtr->vrec0 * T1;
10329  dT0_dVb = -paramPtr->vrec0 / NVtmr * (T1 + Vbs * T1 * T1) ;
10330  if (selfheat)
10331  dT0_dT = -T0 / NVtmr * dNVtmr_dT;
10332  else dT0_dT = 0;
10333 
10334  CEXP(T0, T11, T2);
10335  T11 = -T11;
10336  dT11_dVb = -T2 * dT0_dVb;
10337  if (selfheat)
10338  dT11_dT = -T2 * dT0_dT;
10339  else dT11_dT = 0;
10340  }
10341  T3 = WsTsi * jrec;
10342  Ibs2 = T3 * (T10 + T11);
10343  dIbs2_dVb = T3 * (dT10_dVb + dT11_dVb);
10344  if (selfheat)
10345  dIbs2_dT = T3 * (dT10_dT + dT11_dT) + WsTsi * (T10 + T11)
10346  * djrec_dT;
10347  else dIbs2_dT = 0;
10348 
10349  // Ibd2
10350  T0 = Vbd / NVtmf;
10351  CEXP(T0,T10,T2);
10352  T4 = 1 / NVtmf;
10353  dT10_dVb = T4 * T2;
10354  if (selfheat)
10355  {
10356  dT10_dT = - T4 * T2 * Vbd / NVtmf * dNVtmf_dT ;
10357  }
10358  else
10359  {
10360  dT10_dT = 0.0;
10361  }
10362 
10363  if ((paramPtr->vrec0 - Vbd) < 1e-3) {
10364 
10365  // v2.2.3 bug fix
10366  T1 = 1e3;
10367  T0 = -Vbd / NVtmr * paramPtr->vrec0 * T1;
10368  T11 = -exp(T0);
10369 
10370  dT11_dVb = dT11_dT = 0;
10371  }
10372  else {
10373  T1 = 1 / (paramPtr->vrec0 - Vbd);
10374  T0 = -Vbd / NVtmr * paramPtr->vrec0 * T1;
10375  dT0_dVb = -paramPtr->vrec0 / NVtmr * (T1 + Vbd * T1 * T1) ;
10376  if (selfheat)
10377  dT0_dT = -T0 / NVtmr * dNVtmr_dT;
10378  else
10379  dT0_dT = 0;
10380  CEXP(T0, T11, T2);
10381  T11 = - T11;
10382  dT11_dVb = -T2 * dT0_dVb;
10383  if (selfheat)
10384  dT11_dT = -T2 * dT0_dT;
10385  else
10386  dT11_dT = 0;
10387  }
10388  T3 = WdTsi * jrec;
10389  Ibd2 = T3 * (T10 + T11);
10390  dIbd2_dVb = T3 * (dT10_dVb + dT11_dVb);
10391 
10392  dIbd2_dVd = -dIbd2_dVb;
10393  if (selfheat)
10394  dIbd2_dT = T3 * (dT10_dT + dT11_dT) + WdTsi * (T10 + T11)
10395  * djrec_dT;
10396  else
10397  dIbd2_dT = 0;
10398  }
10399 
10400  // Ibs3/Ibd3: recombination current in neutral body
10401  WTsi = paramPtr->weff / nseg * model_.tsi;
10402  if (jbjt == 0.0)
10403  {
10404  Ibs3 = dIbs3_dVb = dIbs3_dVd = dIbs3_dT = 0.0;
10405  Ibd3 = dIbd3_dVb = dIbd3_dVd = dIbd3_dT = 0.0;
10406  Ibsdif = dIbsdif_dVb = dIbsdif_dT = 0;
10407  Ibddif = dIbddif_dVb = dIbddif_dVd = dIbddif_dT = 0;
10408  ic = Ic = Gcd = Gcb = GcT = 0.0;
10409  }
10410  else {
10411  Ien = WTsi * jbjt * paramPtr->lratio;
10412  if (selfheat)
10413  dIen_dT = WTsi * djbjt_dT * paramPtr->lratio;
10414  else
10415  dIen_dT = 0;
10416 
10417  // high level injection of source side
10418  if ((Ehlis = Ahli * (ExpVbsNVtm - 1)) < 1e-5) {
10419  Ehlis = dEhlis_dVb = dEhlis_dT = 0;
10420  EhlisFactor = 1;
10421  dEhlisFactor_dVb = dEhlisFactor_dT = 0;
10422  }
10423  else {
10424  dEhlis_dVb = Ahli * dExpVbsNVtm_dVb;
10425  if (selfheat)
10426  dEhlis_dT = Ahli * dExpVbsNVtm_dT + (ExpVbsNVtm - 1) * dAhli_dT;
10427  else
10428  dEhlis_dT = 0;
10429  EhlisFactor = 1.0 / sqrt(1 + Ehlis);
10430  T0 = -0.5 * EhlisFactor / (1 + Ehlis);
10431  dEhlisFactor_dVb = T0 * dEhlis_dVb;
10432  if (selfheat)
10433  dEhlisFactor_dT = T0 * dEhlis_dT;
10434  else
10435  dEhlisFactor_dT = 0;
10436  }
10437 
10438  // high level injection of drain side
10439  if ((Ehlid = Ahli * (ExpVbdNVtm - 1)) < 1e-5) {
10440  Ehlid = dEhlid_dVb = dEhlid_dVd = dEhlid_dT = 0;
10441  EhlidFactor = 1;
10442  dEhlidFactor_dVb = dEhlidFactor_dVd = dEhlidFactor_dT = 0;
10443  }
10444  else {
10445  dEhlid_dVb = Ahli * dExpVbdNVtm_dVb;
10446  dEhlid_dVd = -dEhlid_dVb;
10447  if (selfheat)
10448  dEhlid_dT = Ahli * dExpVbdNVtm_dT + (ExpVbdNVtm - 1) * dAhli_dT;
10449  else
10450  dEhlid_dT = 0;
10451  EhlidFactor = 1.0 / sqrt(1 + Ehlid);
10452  T0 = -0.5 * EhlidFactor / (1 + Ehlid);
10453  dEhlidFactor_dVb = T0 * dEhlid_dVb;
10454  dEhlidFactor_dVd = -dEhlidFactor_dVb;
10455  if (selfheat)
10456  dEhlidFactor_dT = T0 * dEhlid_dT;
10457  else
10458  dEhlidFactor_dT = 0;
10459  }
10460 
10461 
10462  // v3.1.1 bug fix for Ibjt(L) discontinuity
10463  T0 = 1 - paramPtr->arfabjt;
10464  T1 = T0 * Ien;
10465  if (selfheat)
10466  dT1_dT = T0 * dIen_dT;
10467  else
10468  dT1_dT = 0;
10469 
10470  Ibs3 = T1 * (ExpVbsNVtm - 1) * EhlisFactor;
10471  dIbs3_dVb = T1 * (dExpVbsNVtm_dVb * EhlisFactor
10472  + (ExpVbsNVtm - 1) * dEhlisFactor_dVb);
10473  dIbs3_dVd = 0;
10474  if (selfheat)
10475  dIbs3_dT = dT1_dT * (ExpVbsNVtm - 1) * EhlisFactor
10476  + T1 * (dExpVbsNVtm_dT * EhlisFactor
10477  + (ExpVbsNVtm - 1) * dEhlisFactor_dT);
10478  else
10479  dIbs3_dT = 0.0;
10480 
10481  Ibd3 = T1 * (ExpVbdNVtm - 1) * EhlidFactor;
10482  dIbd3_dVb = T1 * (dExpVbdNVtm_dVb * EhlidFactor
10483  + (ExpVbdNVtm - 1) * dEhlidFactor_dVb);
10484  dIbd3_dVd = -dIbd3_dVb;
10485  if (selfheat)
10486  dIbd3_dT = dT1_dT * (ExpVbdNVtm - 1) * EhlidFactor
10487  + T1 * (dExpVbdNVtm_dT * EhlidFactor
10488  + (ExpVbdNVtm - 1) * dEhlidFactor_dT);
10489  else
10490  dIbd3_dT = 0.0;
10491 
10492 
10493  // effective diffusion current for capacitance calcu.
10494  Iendif = WTsi * jbjt * paramPtr->lratiodif;
10495  if (selfheat)
10496  dIendif_dT = WTsi * djbjt_dT * paramPtr->lratiodif;
10497  else
10498  dIendif_dT = 0;
10499 
10500  Ibsdif = Iendif * (ExpVbsNVtm - 1) * EhlisFactor;
10501  dIbsdif_dVb = Iendif * (dExpVbsNVtm_dVb * EhlisFactor
10502  + (ExpVbsNVtm - 1) * dEhlisFactor_dVb);
10503  if (selfheat)
10504  dIbsdif_dT = dIendif_dT * (ExpVbsNVtm - 1) * EhlisFactor
10505  + Iendif * (dExpVbsNVtm_dT * EhlisFactor
10506  + (ExpVbsNVtm - 1) * dEhlisFactor_dT);
10507  else
10508  dIbsdif_dT = 0;
10509 
10510  Ibddif = Iendif * (ExpVbdNVtm - 1) * EhlidFactor;
10511  dIbddif_dVb = Iendif * (dExpVbdNVtm_dVb * EhlidFactor
10512  + (ExpVbdNVtm - 1) * dEhlidFactor_dVb);
10513  dIbddif_dVd = -dIbddif_dVb;
10514  if (selfheat)
10515  dIbddif_dT = dIendif_dT * (ExpVbdNVtm - 1) * EhlidFactor
10516  + Iendif * (dExpVbdNVtm_dT * EhlidFactor
10517  + (ExpVbdNVtm - 1) * dEhlidFactor_dT);
10518  else
10519  dIbddif_dT = 0;
10520 
10521  // Ic: Bjt collector current
10522  if ((bjtoff == 1) || (Vds == 0.0)) {
10523  ic = Ic = Gcd = Gcb = GcT = 0.0;
10524  }
10525  else {
10526  // second order effects
10527  T0 = 1 + (Vbs + Vbd) / paramPtr->vearly;
10528  dT0_dVb = 2.0 / paramPtr->vearly;
10529  dT0_dVd = -1.0 / paramPtr->vearly;
10530 
10531  T1 = Ehlis + Ehlid;
10532  dT1_dVb = dEhlis_dVb + dEhlid_dVb;
10533  dT1_dVd = dEhlid_dVd;
10534  if (selfheat)
10535  dT1_dT = dEhlis_dT + dEhlid_dT;
10536  else
10537  dT1_dT = 0;
10538 
10539  T3 = sqrt(T0 * T0 + 4 * T1);
10540  dT3_dVb = 0.5 / T3 * (2 * T0 * dT0_dVb + 4 * dT1_dVb);
10541  dT3_dVd = 0.5 / T3 * (2 * T0 * dT0_dVd + 4 * dT1_dVd);
10542  if (selfheat)
10543  dT3_dT = 2 * dT1_dT / T3;
10544  else
10545  dT3_dT = 0;
10546 
10547  T2 = (T0 + T3) / 2.0;
10548  dT2_dVb = (dT0_dVb + dT3_dVb) / 2.0;
10549  dT2_dVd = (dT0_dVd + dT3_dVd) / 2.0;
10550  if (selfheat)
10551  dT2_dT = dT3_dT /2.0;
10552  else
10553  dT2_dT = 0;
10554 
10555  if (T2 < .1)
10556  {
10557  E2ndFactor = 10.0;
10558  dE2ndFactor_dVb = dE2ndFactor_dVd = dE2ndFactor_dT = 0;
10559  }
10560 
10561  else {
10562  E2ndFactor = 1.0 / T2;
10563  dE2ndFactor_dVb = -E2ndFactor / T2 * dT2_dVb;
10564  dE2ndFactor_dVd = -E2ndFactor / T2 * dT2_dVd;
10565  if (selfheat)
10566  dE2ndFactor_dT = -E2ndFactor / T2 * dT2_dT;
10567  else
10568  dE2ndFactor_dT = 0;
10569  }
10570 
10571  T0 = paramPtr->arfabjt * Ien;
10572  if (selfheat)
10573  dT0_dT = paramPtr->arfabjt * dIen_dT;
10574  else
10575  dT0_dT = 0;
10576  ic = Ic
10577  = T0 * (ExpVbsNVtm - ExpVbdNVtm) * E2ndFactor;
10578  Gcb = T0 * ((dExpVbsNVtm_dVb - dExpVbdNVtm_dVb) * E2ndFactor
10579  + (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dVb);
10580  Gcd = T0 * (-dExpVbdNVtm_dVd * E2ndFactor
10581  + (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dVd);
10582  if (selfheat)
10583  GcT = T0 * (dExpVbsNVtm_dT - dExpVbdNVtm_dT) * E2ndFactor
10584  + dT0_dT * (ExpVbsNVtm - ExpVbdNVtm) * E2ndFactor
10585  + T0 * (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dT;
10586  else
10587  GcT = 0;
10588  }
10589  }
10590 
10591  // Ibs4/Ibd4 : tunneling
10592  NVtm2 = 0.026 * paramPtr->ntun;
10593  if (jtun == 0)
10594  { Ibs4 = Ibd4 = dIbs4_dVb = dIbs4_dT = dIbd4_dVb
10595  = dIbd4_dVd = dIbd4_dT = 0;
10596  } else
10597  {
10598  if ((paramPtr->vtun0 - Vbs) < 1e-3)
10599  {
10600  // v2.2.3 bug fix
10601  T1=1e3;
10602  T0 = -Vbs / NVtm2 * paramPtr->vtun0 * T1;
10603  T1 = exp(T0);
10604  T3 = WsTsi * jtun;
10605  Ibs4 = T3 * (1- T1);
10606 
10607  dIbs4_dVb = dIbs4_dT = 0;
10608  }
10609  else {
10610  T1 = 1 / (paramPtr->vtun0 - Vbs);
10611  T0 = -Vbs / NVtm2 * paramPtr->vtun0 * T1;
10612  dT0_dVb = -paramPtr->vtun0 / NVtm2 * (T1 + Vbs * T1 * T1) ;
10613 
10614  CEXP(T0, T1, T2);
10615  T3 = WsTsi * jtun;
10616  Ibs4 = T3 * (1- T1);
10617  dIbs4_dVb = -T3 * T2 * dT0_dVb;
10618  if (selfheat)
10619  dIbs4_dT = (1 - T1) * WsTsi * djtun_dT;
10620  else
10621  dIbs4_dT = 0;
10622  }
10623 
10624  if ((paramPtr->vtun0 - Vbd) < 1e-3)
10625  {
10626  // v2.2.3 bug fix
10627  T1=1e3;
10628  T0 = -Vbd / NVtm2 * paramPtr->vtun0 * T1;
10629  T1 = exp(T0);
10630  T3 = WdTsi * jtun;
10631  Ibd4 = T3 * (1- T1);
10632 
10633  dIbd4_dVb = dIbd4_dT = 0;
10634  dIbd4_dVd = 0;
10635  }
10636  else
10637  {
10638  T1 = 1 / (paramPtr->vtun0 - Vbd);
10639  T0 = -Vbd / NVtm2 * paramPtr->vtun0 * T1;
10640  dT0_dVb = -paramPtr->vtun0 / NVtm2 * (T1 + Vbd * T1 * T1) ;
10641 
10642  CEXP(T0, T1, T2);
10643  T3 = WdTsi * jtun;
10644  Ibd4 = T3 * (1- T1);
10645  dIbd4_dVb = -T3 * T2 * dT0_dVb;
10646 
10647  dIbd4_dVd = -dIbd4_dVb;
10648 
10649  if (selfheat)
10650  dIbd4_dT = (1 - T1) * WdTsi * djtun_dT;
10651  else dIbd4_dT = 0;
10652  }
10653  }
10654 
10655  itun = - Ibd3 - Ibd4;
10656  ibs = Ibs = Ibs1 + Ibs2 + Ibs3 + Ibs4;
10657  ibd = Ibd = Ibd1 + Ibd2 + Ibd3 + Ibd4;
10658 
10659  Gjsb = dIbs1_dVb + dIbs2_dVb + dIbs3_dVb + dIbs4_dVb;
10660  Gjsd = dIbs3_dVd;
10661  if (selfheat)
10662  GjsT = dIbs1_dT + dIbs2_dT + dIbs3_dT + dIbs4_dT;
10663  else
10664  GjsT = 0.0;
10665 
10666  Gjdb = dIbd1_dVb + dIbd2_dVb + dIbd3_dVb + dIbd4_dVb;
10667 
10668  Gjdd = dIbd1_dVd + dIbd2_dVd + dIbd3_dVd + dIbd4_dVd;
10669  if (selfheat)
10670  GjdT = dIbd1_dT + dIbd2_dT + dIbd3_dT + dIbd4_dT;
10671  else
10672  GjdT = 0.0;
10673 
10674  }
10675  else // v3.1 soiMod=2: ideal FD
10676  {
10677  igidl= Idgidl = Gdgidld = Gdgidlg = 0.0;
10678  Isgidl = Gsgidlg = 0;
10679 
10680  itun = 0;
10681  ibs = Ibs = 0;
10682  ibd = Ibd = 0;
10683  ic = Ic = Gcd = Gcb = GcT = 0.0;
10684 
10685  Gjsb = 0;
10686  Gjsd = 0;
10687  GjsT = 0;
10688 
10689  Gjdb = 0;
10690  Gjdd = 0;
10691  GjdT = 0;
10692  }
10693 
10694  // v3.0: gate-tunneling
10695  if ((model_.igbMod != 0) || (model_.igcMod != 0)) {
10696  Vgb = Vgs_eff - Vbs;
10697  dVgb_dVg = dVgs_eff_dVg;
10698  dVgb_dVb = -1;
10699 
10700  // Calculate Vox first
10701  Vfb = model_.dtype * paramPtr->vth0 - phi_local
10702  - paramPtr->k1eff * sqrtPhi;
10703 
10704  T3 = Vfb - Vgs_eff + Vbs - DELTA_3;
10705  dT3_dVg = -dVgs_eff_dVg;
10706  dT3_dVd = 0;
10707  dT3_dVb = 1;
10708 
10709  if (Vfb <= 0.0) {
10710  T0 = sqrt(T3 * T3 - 4.0 * DELTA_3 * Vfb);
10711  dT0_dVg = 1.0/(2.0 * T0) * 2.0*T3 * dT3_dVg;
10712  dT0_dVb = 0.5*(1.0/T0) * 2.0*T3 * dT3_dVb;
10713  }
10714  else {
10715  T0 = sqrt(T3 * T3 + 4.0 * DELTA_3 * Vfb);
10716  dT0_dVg = 1.0/(2.0 * T0) * 2.0*T3 * dT3_dVg;
10717  dT0_dVb = 0.5*(1.0/T0) * 2.0*T3 * dT3_dVb;
10718  }
10719 
10720  Vfbeff = Vfb - 0.5 * (T3 + T0);
10721  dVfbeff_dVg = -0.5 * (dT3_dVg + dT0_dVg);
10722  dVfbeff_dVb = -0.5 * (dT3_dVb + dT0_dVb);
10723 
10724  Voxacc = Vfb - Vfbeff;
10725  dVoxacc_dVg = -dVfbeff_dVg;
10726  dVoxacc_dVd = 0.0;
10727  dVoxacc_dVb = -dVfbeff_dVb;
10728  if (Voxacc < 0.0)
10729  Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0;
10730 
10731  T0 = Vgs_eff - Vgsteff_local - Vfbeff - Vbseff;
10732  dT0_dVg = dVgs_eff_dVg - dVgsteff_dVg - dVfbeff_dVg
10733  - dVbseff_dVg; // v3.0
10734  dT0_dVd = -dVgsteff_dVd - dVbseff_dVd; // v3.0
10735  dT0_dVb = -dVgsteff_dVb - dVfbeff_dVb - dVbseff_dVb;
10736  dT0_dVe = -dVgsteff_dVe - dVbseff_dVe;
10737 
10738  if (selfheat)
10739  dT0_dT = -dVgsteff_dT - dVbseff_dT; // v3.0
10740 
10741  if (paramPtr->k1eff == 0.0) {
10742  Voxdepinv = dVoxdepinv_dVg
10743  = dVoxdepinv_dVd
10744  = dVoxdepinv_dVb
10745  = dVoxdepinv_dT
10746  = 0.0;
10747  } else {
10748  if (T0 < 0.0) {
10749  T1 = T0/paramPtr->k1eff;
10750  dT1_dVg = dT0_dVg/paramPtr->k1eff;
10751  dT1_dVd = dT0_dVd/paramPtr->k1eff;
10752  dT1_dVb = dT0_dVb/paramPtr->k1eff;
10753  dT1_dVe = dT0_dVe/paramPtr->k1eff; // v3.0
10754  if (selfheat) dT1_dT = dT0_dT/paramPtr->k1eff;
10755  }
10756  else {
10757  T1 = paramPtr->k1eff/2*(-1 + sqrt(1 +
10758  4*T0/paramPtr->k1eff/paramPtr->k1eff));
10759  T2 = paramPtr->k1eff/2 *
10760  0.5/sqrt(1 + 4*T0/paramPtr->k1eff
10761  /paramPtr->k1eff) *
10763  dT1_dVg = T2 * dT0_dVg;
10764  dT1_dVd = T2 * dT0_dVd;
10765  dT1_dVb = T2 * dT0_dVb;
10766  dT1_dVe = T2 * dT0_dVe; // v3.0
10767  if (selfheat)
10768  dT1_dT = T2 * dT0_dT;
10769  }
10770 
10771  Voxdepinv = Vgs_eff - (T1*T1 + Vbs) - Vfb;
10772  dVoxdepinv_dVg = dVgs_eff_dVg - (2.0*T1*dT1_dVg);
10773  dVoxdepinv_dVd = -(2.0*T1*dT1_dVd);
10774  dVoxdepinv_dVb = -(2.0*T1*dT1_dVb + 1);
10775  dVoxdepinv_dVe = -(2.0*T1*dT1_dVe); // v3.0
10776  if (selfheat)
10777  dVoxdepinv_dT = -(2.0*T1*dT1_dT);
10778  }
10779  }
10780 
10781 
10782  // gate-channel tunneling component
10783  if (model_.igcMod)
10784  { T0 = Vtm * paramPtr->nigc;
10785  VxNVt = (Vgs_eff - model_.dtype * paramPtr->vth0) / T0;
10786  // Vth instead of Vth0 may be used
10787  if (VxNVt > EXPL_THRESHOLD)
10788  { Vaux = Vgs_eff - model_.dtype * paramPtr->vth0;
10789  dVaux_dVg = dVgs_eff_dVg;
10790  dVaux_dVd = 0.0;
10791  dVaux_dVb = 0.0;
10792  }
10793  else if (VxNVt < -EXPL_THRESHOLD)
10794  { Vaux = T0 * log(1.0 + MIN_EXPL);
10795  dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0;
10796  }
10797  else
10798  { ExpVxNVt = exp(VxNVt);
10799  Vaux = T0 * log(1.0 + ExpVxNVt);
10800  dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt);
10801  dVaux_dVd = -dVaux_dVg * 0.0;
10802  dVaux_dVb = -dVaux_dVg * 0.0;
10803  dVaux_dVg *= dVgs_eff_dVg;
10804  }
10805 
10806  T2 = Vgs_eff * Vaux;
10807  dT2_dVg = dVgs_eff_dVg * Vaux + Vgs_eff * dVaux_dVg;
10808  dT2_dVd = Vgs_eff * dVaux_dVd;
10809  dT2_dVb = Vgs_eff * dVaux_dVb;
10810 
10811  T11 = paramPtr->Aechvb;
10812  T12 = paramPtr->Bechvb;
10813  T3 = paramPtr->aigc * paramPtr->cigc - paramPtr->bigc;
10814  T4 = paramPtr->bigc * paramPtr->cigc;
10815  T5 = T12 * (paramPtr->aigc + T3 * Voxdepinv
10816  - T4 * Voxdepinv * Voxdepinv);
10817 
10818  if (T5 > EXPL_THRESHOLD)
10819  { T6 = MAX_EXPL;
10820  dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10821  }
10822  else if (T5 < -EXPL_THRESHOLD)
10823  { T6 = MIN_EXPL;
10824  dT6_dVg = dT6_dVd = dT6_dVb = 0.0;
10825  }
10826  else
10827  { T6 = exp(T5);
10828  dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv);
10829  dT6_dVd = dT6_dVg * dVoxdepinv_dVd;
10830  dT6_dVb = dT6_dVg * dVoxdepinv_dVb;
10831  dT6_dVg *= dVoxdepinv_dVg;
10832  }
10833 
10834  Igc = T11 * T2 * T6;
10835  dIgc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10836  dIgc_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd);
10837  dIgc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb);
10838 
10839  T7 = -paramPtr->pigcd * Vds;
10840  T8 = T7 * T7 + 2.0e-4;
10841  dT8_dVd = -2.0 * paramPtr->pigcd * T7;
10842  if (T7 > EXPL_THRESHOLD)
10843  { T9 = MAX_EXPL;
10844  dT9_dVd = 0.0;
10845  }
10846  else if (T7 < -EXPL_THRESHOLD)
10847  { T9 = MIN_EXPL;
10848  dT9_dVd = 0.0;
10849  }
10850  else
10851  { T9 = exp(T7);
10852  dT9_dVd = -T9 * paramPtr->pigcd;
10853  }
10854 
10855  T0 = T8 * T8;
10856  T1 = T9 - 1.0 + 1.0e-4;
10857  T10 = (T1 - T7) / T8;
10858  dT10_dVd = ((paramPtr->pigcd + dT9_dVd) * T8
10859  - (T1 - T7) * dT8_dVd) / T0;
10860  Igcs_local = Igc * T10;
10861  dIgcs_dVg = dIgc_dVg * T10;
10862  dIgcs_dVd = dIgc_dVd * T10 + Igc * dT10_dVd;
10863  dIgcs_dVb = dIgc_dVb * T10;
10864 
10865  T1 = T9 - 1.0 - 1.0e-4;
10866  T10 = (T7 * T9 - T1) / T8;
10867  dT10_dVd = (-paramPtr->pigcd * T9 + (T7 - 1.0)
10868  * dT9_dVd - T10 * dT8_dVd) / T8;
10869  Igcd_local = Igc * T10;
10870  dIgcd_dVg = dIgc_dVg * T10;
10871  dIgcd_dVd = dIgc_dVd * T10 + Igc * dT10_dVd;
10872  dIgcd_dVb = dIgc_dVb * T10;
10873 
10874  Igcs = Igcs_local;
10875  gIgcsg = dIgcs_dVg;
10876  gIgcsd = dIgcs_dVd;
10877  gIgcsb = dIgcs_dVb * dVbseff_dVb;
10878  Igcd = Igcd_local;
10879  gIgcdg = dIgcd_dVg;
10880  gIgcdd = dIgcd_dVd;
10881  gIgcdb = dIgcd_dVb * dVbseff_dVb;
10882 
10883 
10884  T0 = vgs - paramPtr->vfbsd;
10885  vgs_eff = sqrt(T0 * T0 + 1.0e-4);
10886  dvgs_eff_dvg = T0 / vgs_eff;
10887 
10888  T2 = vgs * vgs_eff;
10889  dT2_dVg = vgs * dvgs_eff_dvg + vgs_eff;
10890  T11 = paramPtr->AechvbEdge;
10891  T12 = paramPtr->BechvbEdge;
10892  T3 = paramPtr->aigsd * paramPtr->cigsd
10893  - paramPtr->bigsd;
10894  T4 = paramPtr->bigsd * paramPtr->cigsd;
10895  T5 = T12 * (paramPtr->aigsd + T3 * vgs_eff - T4 *
10896  vgs_eff * vgs_eff);
10897  if (T5 > EXPL_THRESHOLD)
10898  { T6 = MAX_EXPL;
10899  dT6_dVg = 0.0;
10900  }
10901  else if (T5 < -EXPL_THRESHOLD)
10902  { T6 = MIN_EXPL;
10903  dT6_dVg = 0.0;
10904  }
10905  else
10906  { T6 = exp(T5);
10907  dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgs_eff)
10908  * dvgs_eff_dvg;
10909  }
10910  Igs_local = T11 * T2 * T6;
10911  dIgs_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10912  dIgs_dVs = -dIgs_dVg;
10913 
10914 
10915  T0 = vgd - paramPtr->vfbsd;
10916  vgd_eff = sqrt(T0 * T0 + 1.0e-4);
10917  dvgd_eff_dvg = T0 / vgd_eff;
10918 
10919  T2 = vgd * vgd_eff;
10920  dT2_dVg = vgd * dvgd_eff_dvg + vgd_eff;
10921  T5 = T12 * (paramPtr->aigsd + T3 * vgd_eff
10922  - T4 * vgd_eff * vgd_eff);
10923  if (T5 > EXPL_THRESHOLD)
10924  { T6 = MAX_EXPL;
10925  dT6_dVg = 0.0;
10926  }
10927  else if (T5 < -EXPL_THRESHOLD)
10928  { T6 = MIN_EXPL;
10929  dT6_dVg = 0.0;
10930  }
10931  else
10932  { T6 = exp(T5);
10933  dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgd_eff)
10934  * dvgd_eff_dvg;
10935  }
10936  Igd_local = T11 * T2 * T6;
10937  dIgd_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg);
10938  dIgd_dVd = -dIgd_dVg;
10939 
10940  Igs = Igs_local;
10941  gIgsg = dIgs_dVg;
10942  gIgss = dIgs_dVs;
10943  Igd = Igd_local;
10944  gIgdg = dIgd_dVg;
10945  gIgdd = dIgd_dVd;
10946  }
10947  else
10948  { Igcs = gIgcsg = gIgcsd = gIgcsb = 0.0;
10949  Igcd = gIgcdg = gIgcdd = gIgcdb = 0.0;
10950  Igs = gIgsg = gIgss = 0.0;
10951  Igd = gIgdg = gIgdd = 0.0;
10952  }
10953 
10954  gIgcss = -(gIgcsg + gIgcsd + gIgcsb);
10955  gIgcds = -(gIgcdg + gIgcdd + gIgcdb);
10956 
10957 
10958  // gate-body tunneling component
10959  if ((model_.igbMod!= 0) && (soiMod != 2)) // v3.2
10960  // v3.1: the Igb calculation is skipped for the ideal FD mode
10961  {
10962  OxideRatio = paramPtr->oxideRatio;
10963 
10964  Vox = Voxdepinv;
10965  // Voxeff is Vox limited below Voxh
10966  T0 = model_.voxh;
10967  T1 = T0 - Vox - model_.deltavox;
10968  T3 = sqrt(T1 * T1 + 4*model_.deltavox * T0);
10969  Voxeff = T0 - 0.5 * (T1 + T3);
10970  dVoxeff_dVox = 0.5 * (1.0 + T1 / T3);
10971 
10972  Vox = Voxeff;
10973  dVox_dVg = dVoxdepinv_dVg * dVoxeff_dVox;
10974  dVox_dVd = dVoxdepinv_dVd * dVoxeff_dVox;
10975  dVox_dVb = dVoxdepinv_dVb * dVoxeff_dVox;
10976  dVox_dVe = dVoxdepinv_dVe * dVoxeff_dVox; // v3.0
10977  dVox_dT = dVoxdepinv_dT * dVoxeff_dVox;
10978 
10979 
10980  T0 = (Vox - model_.ebg)/model_.vevb;
10981  if (selfheat)
10982  dT0_dT = dVox_dT /model_.vevb;
10983 
10984  CEXP(T0, T1, T2); // T1=exp(T0), T2=dT1_dT0
10985  if (selfheat)
10986  dT1_dT = T2 * dT0_dT;
10987 
10988  Vaux = model_.vevb * log(1 + T1);
10989  dVaux_dVg = T2 / (1 + T1) * dVox_dVg;
10990  dVaux_dVd = T2 / (1 + T1) * dVox_dVd;
10991  dVaux_dVb = T2 / (1 + T1) * dVox_dVb;
10992  dVaux_dVe = T2 / (1 + T1) * dVox_dVe; // v3.0
10993  if (selfheat)
10994  dVaux_dT = T2 / (1 + T1) * dVox_dT;
10995 
10996  if (model_.vgb1 != 0) {
10997  T0 = 1 - Vox / model_.vgb1;
10998  dT0_dVox = -1.0/model_.vgb1;
10999  if (selfheat)
11000  dT0_dT = -dVox_dT / model_.vgb1;
11001  } else {
11002  T0 = 1;
11003  dT0_dVox = dT0_dT = 0.0;
11004  }
11005 
11006  if (T0 < 0.01) {
11007  T0 = 0.01;
11008  dT0_dVox = dT0_dT = 0.0;
11009  }
11010 
11011  // v2.2.3 bug fix
11012  T1 = Leff * Weff * 3.7622e-7 * OxideRatio / nseg;
11013 
11014  T2 = -3.1051e10 * model_.toxqm;
11015  T3 = paramPtr->alphaGB1;
11016  T4 = paramPtr->betaGB1;
11017 
11018  T6 = T2*(T3 - T4 * Vox) / T0;
11019  if (selfheat) dT6_dT = -T2 * T4 * dVox_dT / T0 - T6/T0 * dT0_dT;
11020 
11021  CEXP(T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */
11022  dT5_dVg = -T7 * dVox_dVg * T2 / T0 * (T4 + (T3 - T4 * Vox)
11023  / T0 * dT0_dVox);
11024  dT5_dVd = -T7 * dVox_dVd * T2 / T0 * (T4 + (T3 - T4 * Vox)
11025  / T0 * dT0_dVox);
11026  dT5_dVb = -T7 * dVox_dVb * T2 / T0 * (T4 + (T3 - T4 * Vox)
11027  / T0 * dT0_dVox);
11028  dT5_dVe = -T7 * dVox_dVe * T2 / T0 * (T4 + (T3 - T4 * Vox)
11029  / T0 * dT0_dVox); // v3.0
11030  if (selfheat)
11031  dT5_dT = T7 * dT6_dT;
11032 
11033  Igb1 = T1 * Vgb * Vaux * T5;
11034  dIgb1_dVg = T1 * (Vgb*Vaux*dT5_dVg + dVgb_dVg*Vaux*T5 +
11035  Vgb*T5*dVaux_dVg);
11036  dIgb1_dVd = T1 * (Vgb*Vaux*dT5_dVd + Vgb*T5*dVaux_dVd);
11037  dIgb1_dVb = T1 * (Vgb*Vaux*dT5_dVb + dVgb_dVb*Vaux*T5 +
11038  Vgb*T5*dVaux_dVb);
11039  dIgb1_dVe = T1 * (Vgb*Vaux*dT5_dVe + Vgb*T5*dVaux_dVe); // v3.0
11040  if (selfheat)
11041  dIgb1_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT);
11042  else dIgb1_dT = 0.0;
11043 
11044 
11045  Vox = Voxacc;
11046  // Voxeff is Vox limited below Voxh
11047  T0 = model_.voxh;
11048  T1 = T0 - Vox - model_.deltavox;
11049  T3 = sqrt(T1 * T1 + 4*model_.deltavox * T0);
11050  Voxeff = T0 - 0.5 * (T1 + T3);
11051  dVoxeff_dVox = 0.5 * (1.0 + T1 / T3);
11052 
11053  Vox = Voxeff;
11054  dVox_dVg = dVoxacc_dVg * dVoxeff_dVox;
11055  dVox_dVd = dVoxacc_dVd * dVoxeff_dVox;
11056  dVox_dVb = dVoxacc_dVb * dVoxeff_dVox;
11057  dVox_dT = 0;
11058 
11059  T0 = (-Vgb+(Vfb))/model_.vecb;
11060  if (selfheat)
11061  dT0_dT = 0;
11062 
11063  CEXP(T0, T1, T2); // T1=exp(T0), T2=dT1_dT0
11064  if (selfheat)
11065  dT1_dT = 0;
11066 
11067  Vaux = model_.vecb* log(1 + T1);
11068  dVaux_dVg = -T2 / (1 + T1);
11069  dVaux_dVd = 0;
11070  dVaux_dVb = -dVaux_dVg;
11071  if (selfheat)
11072  dVaux_dT = 0;
11073 
11074  if (model_.vgb2 != 0) {
11075  T0 = 1 - Vox / model_.vgb2;
11076  dT0_dVox = -1.0/model_.vgb2;
11077  if (selfheat) dT0_dT = -dVox_dT / model_.vgb2;
11078  } else {
11079  T0 = 1;
11080  dT0_dVox = dT0_dT =0.0;
11081  }
11082 
11083  if (T0 < 0.01) {
11084  T0 = 0.01;
11085  dT0_dVox = dT0_dT =0.0;
11086  }
11087 
11088  // v2.2.3 bug fix
11089  T1 = Leff * Weff * 4.9758e-7 * OxideRatio / nseg;
11090 
11091  T2 = -2.357e10 * model_.toxqm;
11092  T3 = paramPtr->alphaGB2;
11093  T4 = paramPtr->betaGB2;
11094 
11095  T6 = T2*(T3 - T4 * Vox) / T0;
11096  if (selfheat) dT6_dT = -T2 * T4 * dVox_dT / T0 - T6/T0 * dT0_dT;
11097 
11098  CEXP(T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */
11099  dT5_dVg = -T7 * dVox_dVg * T2 / T0 * (T4 + (T3 - T4 * Vox)
11100  / T0 * dT0_dVox);
11101  dT5_dVd = -T7 * dVox_dVd * T2 / T0 * (T4 + (T3 - T4 * Vox)
11102  / T0 * dT0_dVox);
11103  dT5_dVb = -T7 * dVox_dVb * T2 / T0 * (T4 + (T3 - T4 * Vox)
11104  / T0 * dT0_dVox);
11105  if (selfheat)
11106  dT5_dT = T7 * dT6_dT;
11107 
11108  Igb2 = T1 * Vgb * Vaux * T5;
11109  dIgb2_dVg = T1 * (Vgb*Vaux*dT5_dVg + dVgb_dVg*Vaux*T5 +
11110  Vgb*T5*dVaux_dVg);
11111  dIgb2_dVd = T1 * (Vgb*Vaux*dT5_dVd + Vgb*T5*dVaux_dVd);
11112  dIgb2_dVb = T1 * (Vgb*Vaux*dT5_dVb + dVgb_dVb*Vaux*T5 +
11113  Vgb*T5*dVaux_dVb);
11114  if (selfheat)
11115  dIgb2_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT);
11116  else dIgb2_dT = 0.0;
11117 
11118 
11119  // Igb1 dominates in inversion region,
11120  // while Igb2 doninates in accumulation
11121  // v2.2.3 bug fix for residue at low Vgb
11122  if (Vgb >= 0)
11123  {
11124  Igb = Igb1;
11125  dIgb_dVg = dIgb1_dVg;
11126  dIgb_dVd = dIgb1_dVd;
11127  dIgb_dVb = dIgb1_dVb;
11128  dIgb_dVe = dIgb1_dVe; // v3.0
11129  dIgb_dT = dIgb1_dT;
11130  }
11131  else
11132  {
11133  Igb = Igb2;
11134  dIgb_dVg = dIgb2_dVg;
11135  dIgb_dVd = dIgb2_dVd;
11136  dIgb_dVb = dIgb2_dVb;
11137  dIgb_dVe = 0; // v3.0
11138  dIgb_dT = dIgb2_dT;
11139  }
11140 
11141  }
11142  else {
11143  Igb = 0.0;
11144  dIgb_dVg = 0.0;
11145  dIgb_dVd = 0.0;
11146  dIgb_dVb = 0.0;
11147  dIgb_dVe = 0.0; // v3.0
11148  dIgb_dT = 0.0;
11149  }
11150 
11151  ig = Igb;
11152  gigg = dIgb_dVg;
11153  gigd = dIgb_dVd;
11154  gigb = dIgb_dVb;
11155  gige = dIgb_dVe; // v3.0
11156  gigs = -(dIgb_dVg + dIgb_dVd + dIgb_dVb + dIgb_dVe);
11157  gigT = dIgb_dT;
11158  // end of gate-body tunneling
11159  // end of v3.0 gate-tunneling
11160 
11161  // v3.1
11162 
11163  if (soiMod != 2) // v3.2
11164  {
11165  // calculate substrate current Iii
11166  if (paramPtr->alpha0 <= 0.0) {
11167  Giig = Giib = Giid = GiiT = 0.0;
11168  Giie = 0; // v3.0
11169  iii = Iii = 0.0;
11170  }
11171  else {
11172  Vdsatii0 = paramPtr->vdsatii0 * (1 + model_.tii * (TempRatio-1.0))
11173  - paramPtr->lii / Leff;
11174  if (selfheat)
11175  dVdsatii0_dT = paramPtr->vdsatii0 * model_.tii * dTempRatio_dT;
11176  else
11177  dVdsatii0_dT = 0;
11178 
11179  // Calculate VgsStep
11180  T0 = paramPtr->esatii * Leff;
11181  // v3.0 bug fix: T0 is dimentionless (i.e., scaled by 1V)
11182  T1 = paramPtr->sii0 * T0 / (1.0 + T0);
11183 
11184  T0 = 1 / (1 + paramPtr->sii1 * Vgsteff_local);
11185  if (selfheat)
11186  dT0_dT = - paramPtr->sii1 * T0 * T0 *dVgsteff_dT;
11187  else
11188  dT0_dT = 0;
11189  T3 = T0 + paramPtr->sii2;
11190  T4 = Vgst * paramPtr->sii1 * T0 * T0;
11191  T2 = Vgst * T3;
11192  dT2_dVg = T3 * (dVgst_dVg - dVth_dVb * dVbseff_dVg) - T4
11193  * dVgsteff_dVg; // v3.0
11194  dT2_dVb = T3 * dVgst_dVb * dVbseff_dVb - T4 * dVgsteff_dVb;
11195  dT2_dVe = T3 * dVgst_dVb * dVbseff_dVe - T4 * dVgsteff_dVe; // v3.0
11196  dT2_dVd = T3 * (dVgst_dVd - dVth_dVb * dVbseff_dVd) - T4
11197  * dVgsteff_dVd; // v3.0
11198  if (selfheat)
11199  dT2_dT = -(dVth_dT + dVth_dVb * dVbseff_dT) * T3
11200  + Vgst * dT0_dT; // v3.0
11201  else dT2_dT = 0;
11202 
11203 
11204  T3 = 1 / (1 + paramPtr->siid * Vds);
11205  dT3_dVd = - paramPtr->siid * T3 * T3;
11206 
11207  VgsStep = T1 * T2 * T3;
11208  if (selfheat)
11209  dVgsStep_dT = T1 * T3 * dT2_dT;
11210  else dVgsStep_dT = 0;
11211  Vdsatii = Vdsatii0 + VgsStep;
11212  Vdiff = Vds - Vdsatii;
11213  dVdiff_dVg = - T1 * T3 * dT2_dVg;
11214  dVdiff_dVb = - T1 * T3 * dT2_dVb;
11215  dVdiff_dVe = - T1 * T3 * dT2_dVe; // v3.0
11216  dVdiff_dVd = 1.0 - T1 * (T3 * dT2_dVd + T2 * dT3_dVd);
11217  if (selfheat)
11218  dVdiff_dT = -(dVdsatii0_dT + dVgsStep_dT);
11219  else dVdiff_dT = 0;
11220 
11221  T0 = paramPtr->beta2 + paramPtr->beta1 * Vdiff
11222  + paramPtr->beta0 * Vdiff * Vdiff;
11223  if (T0 < 1e-5)
11224  {
11225  T0 = 1e-5;
11226  dT0_dVg = dT0_dVd = dT0_dVb = dT0_dT = 0.0;
11227  dT0_dVe = 0; /* v3.0 */
11228  }
11229  else
11230  {
11231  T1 = paramPtr->beta1 + 2 * paramPtr->beta0 * Vdiff;
11232  dT0_dVg = T1 * dVdiff_dVg;
11233  dT0_dVb = T1 * dVdiff_dVb;
11234  dT0_dVd = T1 * dVdiff_dVd;
11235  dT0_dVe = T1 * dVdiff_dVe; // v3.0
11236  if (selfheat)
11237  dT0_dT = T1 * dVdiff_dT;
11238  else
11239  dT0_dT = 0;
11240  }
11241 
11242  if ((T0 < Vdiff / EXPL_THRESHOLD) && (Vdiff > 0.0)) {
11243  Ratio = paramPtr->alpha0 * MAX_EXPL;
11244  dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0;
11245  dRatio_dVe = 0; /* v3.0 */
11246  }
11247  else if ((T0 < -Vdiff / EXPL_THRESHOLD) && (Vdiff < 0.0)) {
11248  Ratio = paramPtr->alpha0 * MIN_EXPL;
11249  dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0;
11250  dRatio_dVe = 0; /* v3.0 */
11251  }
11252  else {
11253  Ratio = paramPtr->alpha0 * exp(Vdiff / T0);
11254  T1 = Ratio / T0 / T0;
11255  dRatio_dVg = T1 * (T0 * dVdiff_dVg - Vdiff * dT0_dVg);
11256  dRatio_dVb = T1 * (T0 * dVdiff_dVb - Vdiff * dT0_dVb);
11257  dRatio_dVd = T1 * (T0 * dVdiff_dVd - Vdiff * dT0_dVd);
11258  /* v3.0 */
11259  dRatio_dVe = T1 * (T0 * dVdiff_dVe - Vdiff * dT0_dVe);
11260 
11261  if (selfheat)
11262  dRatio_dT = T1 * (T0 * dVdiff_dT - Vdiff * dT0_dT);
11263  else
11264  dRatio_dT = 0;
11265  }
11266 
11267  // Avoid too high ratio
11268  if (Ratio > 10.0) {
11269  Ratio = 10.0;
11270  dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0;
11271  dRatio_dVe = 0; /* v3.0 */
11272  }
11273 
11274  T0 = Ids + paramPtr->fbjtii * Ic;
11275  iii = Iii = Ratio * T0;
11276  Giig = Ratio * Gm + T0 * dRatio_dVg;
11277  Giib = Ratio * (Gmb + paramPtr->fbjtii * Gcb)
11278  + T0 * dRatio_dVb;
11279  Giid = Ratio * (Gds + paramPtr->fbjtii * Gcd)
11280  + T0 * dRatio_dVd;
11281  // v3.0
11282  Giie = Ratio * Gme + T0 * dRatio_dVe;
11283 
11284  if (selfheat)
11285  GiiT = Ratio * (GmT + paramPtr->fbjtii * GcT)
11286  + T0 * dRatio_dT;
11287  else
11288  GiiT = 0.0;
11289  } // alpha0 <= 0
11290 
11291 
11292  // Current through body resistor
11293  // Current going out is +ve
11294  if ((bodyMod == 0) || (bodyMod == 2))
11295  {
11296  Ibp = Gbpbs = Gbpps = 0.0;
11297  }
11298  else
11299  { // bodyMod == 1
11300  if (paramPtr->rbody < 1e-3) // 3.2 bug fix
11301  {
11302  if (rbodyext <= 1e-3) // 3.2 bug fix
11303  T0 = 1.0 / 1e-3; // 3.2 bug fix
11304  else
11305  T0 = 1.0 / rbodyext;
11306  Ibp = Vbp * T0;
11307  Gbpbs = T0 * dVbp_dVb;
11308  Gbpps = -T0 * dVbp_dVb;
11309  }
11310  else
11311  {
11312  Gbpbs = 1.0 / (paramPtr->rbody + rbodyext);
11313  Ibp = Vbp * Gbpbs;
11314  Gbpps = - Gbpbs;
11315  }
11316 
11317  } // soiMod != 2
11318 
11319  ibp = Ibp;
11320  gbpbs = Gbpbs;
11321  gbpps = Gbpps;
11322  gbpT = 0.0;
11323 
11324 // spice has:
11325 // cbodcon = Ibp - (Gbpbs * Vbs + Gbpps * Vps);
11326 
11327  cbodcon = Ibp;
11328  cbodcon_Jdxp = 0.0;
11329  cbodcon_Jdxp = - (Gbpbs * (Vbs-Vbs_orig) + Gbpps * (Vps-Vps_orig));
11330  }
11331  else // v3.1 soiMod=2: ideal FD
11332  {
11333  Giig = Giib = Giid = Giie = GiiT = 0.0;
11334  iii = Iii = 0.0;
11335 
11336  ibp = Ibp = 0.0;
11337  gbpbs = 0.0;
11338  gbpps = gbpT = cbodcon = 0.0;
11339  cbodcon_Jdxp = 0.0;
11340  Gbpbs = Gbpps = 0.0;
11341  }
11342  // v3.1
11343 
11344  // Current going out of drainprime node into the drain of device
11345  // "node" means the SPICE circuit node
11346 
11347 
11348  cdrain = Ids + Ic;
11349  cd = Ids + Ic - Ibd + Iii + Idgidl;
11350  cb = Ibs + Ibd + Ibp - Iii - Idgidl - Isgidl - Igb;
11351  gds = Gds + Gcd;
11352  gm = Gm;
11353  gmbs = Gmb + Gcb;
11354  // v3.0
11355  gme = Gme;
11356 
11357  // v3.1 wanh added Rg for RF
11358  // Calculate Rg
11359  if (rgateMod >1)
11360  { T9 = paramPtr->xrcrg2 * vtm;
11361  T0 = T9 *beta;
11362  dT0_dVd = (dbeta_dVd + dbeta_dVg * dVgsteff_dVd) * T9;
11363  dT0_dVb = (dbeta_dVb + dbeta_dVg * dVgsteff_dVb) * T9;
11364  dT0_dVg = dbeta_dVg * T9;
11365 
11366  gcrg = paramPtr->xrcrg1 * (T0 + Ids);
11367  gcrgd = paramPtr->xrcrg1 * (dT0_dVd +tmp1);
11368  gcrgb = paramPtr->xrcrg1 * (dT0_dVb +tmp2)
11369  * dVbseff_dVb;
11370  gcrgg = paramPtr->xrcrg1 * (dT0_dVg +tmp3)
11371  * dVgsteff_dVg;
11372 
11373  if (rgateMod == 2)
11374  { T10 = grgeltd * grgeltd;
11375  T11 = grgeltd + gcrg;
11376  gcrg = grgeltd * gcrg / T11;
11377  T12 = T10 / T11 /T11;
11378  gcrgg *= T12;
11379  gcrgd *= T12;
11380  gcrgb *= T12;
11381  }
11382 
11383  gcrgs = -(gcrgg + gcrgd + gcrgb);
11384  }
11385  // v3.1 wanh added Rg for RF end
11386 
11387  if (selfheat)
11388  gmT = GmT + GcT;
11389  else
11390  gmT = 0.0;
11391 
11392  // note that sign is switched because power flows out
11393  // of device into the temperature node.
11394  // Currently ommit self-heating due to bipolar current
11395  // because it can cause convergence problem
11396 
11397  gtempg = -Gm * Vds;
11398  gtempb = -Gmb * Vds;
11399  // v3.0
11400  gtempe = -Gme * Vds;
11401 
11402  gtempT = -GmT * Vds;
11403  gtempd = -Gds * Vds - Ids;
11404 
11405 // spice has:
11406 // cth = - Ids * Vds - model_.dtype * (gtempg * Vgs + gtempb * Vbs
11407 // + gtempe * Ves + gtempd * Vds) - gtempT * delTemp; // v3.0
11408 
11409  cth = - Ids * Vds;
11410  cth_Jdxp = 0.0;
11412  +gtempb * (Vbs-Vbs_orig)
11413  +gtempe * (Ves-Ves_orig)
11414  +gtempd * (Vds-Vds_orig))
11416 
11417 
11418  // Body current which flows into drainprime node from the drain of device
11419 
11420  gjdb = Gjdb - Giib;
11421  gjdd = Gjdd - (Giid + Gdgidld);
11422  gjdg = - (Giig + Gdgidlg);
11423  // v3.0
11424  gjde = - Giie;
11425 
11426  if (selfheat) gjdT = GjdT - GiiT;
11427  else gjdT = 0.0;
11428 
11429  cjd = Ibd - Iii - Idgidl;
11430  cjd_Jdxp = 0.0;
11431  cjd_Jdxp = -(gjdb*(Vbs-Vbs_orig)
11432  + gjdd*(Vds-Vds_orig)
11433  + gjdg*(Vgs-Vgs_orig)
11434  + gjde*(Ves-Ves_orig)
11435  + gjdT*(delTemp-delTemp_orig));
11436 
11437  // Body current which flows into sourceprime node from the source of device
11438  gjsb = Gjsb;
11439  gjsd = Gjsd;
11440  gjsg = - Gsgidlg;
11441  if (selfheat) gjsT = GjsT;
11442  else gjsT = 0.0;
11443 
11444  cjs = Ibs - Isgidl;
11445  cjs_Jdxp = 0.0;
11446  cjs_Jdxp = -(gjsb*(Vbs-Vbs_orig)
11447  + gjsd*(Vds-Vds_orig)
11448  + gjsg*(Vgs-Vgs_orig)
11449  + gjsT*(delTemp-delTemp_orig));
11450 
11451  // Current flowing into body node
11452 
11453  gbbs = Giib - Gjsb - Gjdb - Gbpbs;
11454  gbgs = Giig + Gdgidlg + Gsgidlg;
11455  gbds = Giid + Gdgidld - Gjsd - Gjdd;
11456  // v3.0
11457  gbes = Giie;
11458 
11459  gbps = - Gbpps;
11460  if (selfheat)
11461  gbT = GiiT - GjsT - GjdT;
11462  else
11463  gbT = 0.0;
11464 
11465 // spice has:
11466 // cbody = Iii + Idgidl + Isgidl - Ibs - Ibd - Ibp + Igb
11467 // - ( (gbbs + dIgb_dVb) * Vbs
11468 // + (gbgs + dIgb_dVg) * Vgs
11469 // + (gbds + dIgb_dVd) * Vds
11470 // + gbps * Vps
11471 // + (gbes + dIgb_dVe) * Ves
11472 // + (gbT + dIgb_dT) * delTemp); // v3.0
11473 //
11474  cbody_Jdxp = 0.0;
11475  cbody = Iii + Idgidl + Isgidl - Ibs - Ibd - Ibp + Igb;
11476  cbody_Jdxp = -( (gbbs + dIgb_dVb) * (Vbs - Vbs_orig)
11477  +(gbgs + dIgb_dVg) * (Vgs - Vgs_orig)
11478  +(gbds + dIgb_dVd) * (Vds - Vds_orig)
11479  +gbps * (Vps - Vps_orig)
11480  +(gbes + dIgb_dVe) * (Ves - Ves_orig)
11481  +(gbT + dIgb_dT) * (delTemp - delTemp_orig));
11482 
11483 // spice has:
11484 // cgate = Igb - (dIgb_dVb * Vbs + dIgb_dVe * Ves + dIgb_dVg
11485 // * Vgs + dIgb_dVd * Vds + dIgb_dT * delTemp); // v3.0
11486 
11487  cgate_Jdxp = 0.0;
11488  cgate = Igb;
11489  cgate_Jdxp = -(dIgb_dVb * (Vbs - Vbs_orig) +
11490  dIgb_dVe * (Ves - Ves_orig) +
11491  dIgb_dVg * (Vgs - Vgs_orig) +
11492  dIgb_dVd * (Vds - Vds_orig) +
11493  dIgb_dT * (delTemp - delTemp_orig));
11494 
11495  // Calculate Qinv for Noise analysis
11496 
11497  T1 = Vgsteff_local * (1.0 - 0.5 * Abulk_local * Vdseff_local / Vgst2Vtm);
11498  qinv = -model_.cox * paramPtr->weff * Leff * T1;
11499 
11500  // Begin CV (charge) model
11501 
11502  if ((model_.xpart < 0) || (!ChargeComputationNeeded))
11503  { qgate = qdrn = qsrc = qbody = qsub = 0.0; // v2.2.3 bug fix
11504  cggb = cgsb = cgdb = 0.0;
11505  cdgb = cdsb = cddb = 0.0;
11506  cbgb = cbsb = cbdb = 0.0;
11507  Qsub0 = 0;
11508  Qac0 = 0;
11509  qjs_local = 0;
11510  qjd_local = 0;
11511  goto finished;
11512  }
11513  else
11514  {
11515  CoxWL = model_.cox * (paramPtr->weffCV / nseg
11516  * paramPtr->leffCV + agbcp);
11517  CoxWLb = model_.fbody * model_.cox
11518  * (paramPtr->weffCV / nseg
11519  * paramPtr->leffCVb + agbcp);
11520 
11521 
11522  // v3.2 Seperate VgsteffCV with noff
11523  noff = n * paramPtr->noff;
11524  dnoff_dVd = paramPtr->noff * dn_dVd;
11525  dnoff_dVb = paramPtr->noff * dn_dVb;
11526 
11527  if ((VgstNVt > -EXPL_THRESHOLD) && (VgstNVt < EXPL_THRESHOLD))
11528  {
11529  ExpVgst *= ExpVgst;
11530  ExpVgst *= exp( -(paramPtr->delvt / (noff * Vtm)));
11531  Vgsteff_local = noff * Vtm * log(1.0 + ExpVgst);
11532  T0 = ExpVgst / (1.0 + ExpVgst);
11533  T1 = -T0 * (dVth_dVb + (Vgst-paramPtr->delvt) / noff * dnoff_dVb)
11534  + Vgsteff_local / noff * dnoff_dVb;
11535  dVgsteff_dVd = -T0 * (dVth_dVd + dVth_dVb*dVbseff_dVd + Vgst / noff
11536  * dnoff_dVd) + Vgsteff_local / noff * dnoff_dVd;
11537  dVgsteff_dVg = T0 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg);
11538  dVgsteff_dVb = T1 * dVbseff_dVb;
11539  dVgsteff_dVe = T1 * dVbseff_dVe;
11540  if (selfheat)
11541  dVgsteff_dT = -T0 * (dVth_dT+dVth_dVb*dVbseff_dT
11542  + (Vgst - paramPtr->delvt) / Temp)
11543  + Vgsteff_local / Temp;
11544  else
11545  dVgsteff_dT = 0.0;
11546  }
11547  // v3.2
11548 
11549 
11550  if (model_.capMod == 2)
11551  {
11552 
11553  // v3.1
11554  if (soiMod == 2) // v3.2 - ideal FD
11555  {
11556  Qac0 = dQac0_dVrg = dQac0_dVd = dQac0_dVb = dQac0_dT = 0.0;
11557  Qsub0 = dQsub0_dVrg = dQsub0_dVg = dQsub0_dVd
11558  = dQsub0_dVb = dQsub0_dT = 0.0;
11559  }
11560  else // soiMod = 0 or 1
11561  {
11562  Vfb = Vth - phi_local - paramPtr->k1eff * sqrtPhis
11563  + paramPtr->delvt;
11564  dVfb_dVb = dVth_dVb - paramPtr->k1eff * dsqrtPhis_dVb;
11565  dVfb_dVd = dVth_dVd;
11566  dVfb_dT = dVth_dT;
11567 
11568  V3 = Vfb - Vgs_eff + Vbseff - DELTA_3_SOI;
11569  if (Vfb <= 0.0)
11570  { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3_SOI * Vfb);
11571  T2 = -DELTA_3_SOI / T0;
11572  }
11573  else
11574  { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3_SOI * Vfb);
11575  T2 = DELTA_3_SOI / T0;
11576  }
11577 
11578  T1 = 0.5 * (1.0 + V3 / T0);
11579  Vfbeff = Vfb - 0.5 * (V3 + T0);
11580  dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd;
11581  dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - T1;
11582  dVfbeff_dVrg = T1 * dVgs_eff_dVg;
11583  if (selfheat)
11584  dVfbeff_dT = (1.0 - T1 - T2) * dVfb_dT;
11585  else
11586  dVfbeff_dT = 0.0;
11587 
11588  Qac0 = CoxWLb * (Vfbeff - Vfb);
11589  dQac0_dVrg = CoxWLb * dVfbeff_dVrg;
11590  dQac0_dVd = CoxWLb * (dVfbeff_dVd - dVfb_dVd);
11591  dQac0_dVb = CoxWLb * (dVfbeff_dVb - dVfb_dVb);
11592  if (selfheat)
11593  dQac0_dT = CoxWLb * (dVfbeff_dT - dVfb_dT);
11594  else
11595  dQac0_dT = 0.0;
11596 
11597  T0 = 0.5 * K1;
11598  T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff_local;
11599  if (paramPtr->k1eff == 0.0)
11600  { T1 = 0.0;
11601  T2 = 0.0;
11602  }
11603  else if (T3 < 0.0)
11604  { T1 = T0 + T3 / paramPtr->k1eff;
11605  T2 = CoxWLb;
11606  }
11607  else
11608  { T1 = sqrt(T0 * T0 + T3);
11609  T2 = CoxWLb * T0 / T1;
11610  }
11611 
11612  Qsub0 = CoxWLb * K1 * (T1 - T0);
11613  dQsub0_dVrg = T2 * (dVgs_eff_dVg - dVfbeff_dVrg);
11614  dQsub0_dVg = -T2;
11615  dQsub0_dVd = -T2 * dVfbeff_dVd;
11616  dQsub0_dVb = -T2 * (dVfbeff_dVb + 1);
11617  if (selfheat)
11618  dQsub0_dT = -T2 * dVfbeff_dT;
11619  else
11620  dQsub0_dT = 0.0;
11621  }
11622  // v3.1
11623 
11624 
11625  AbulkCV = Abulk0 * paramPtr->abulkCVfactor;
11626  dAbulkCV_dVb = paramPtr->abulkCVfactor * dAbulk0_dVb;
11627 
11628  VdsatCV = Vgsteff_local / AbulkCV;
11629 //not used dVdsatCV_dVg = 1.0 / AbulkCV;
11630 //not used dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV;
11631 
11632  V4 = VdsatCV - Vds - DELTA_4;
11633  T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV);
11634  VdseffCV = VdsatCV - 0.5 * (V4 + T0);
11635  T1 = 0.5 * (1.0 + V4 / T0);
11636  T2 = DELTA_4 / T0;
11637  T3 = (1.0 - T1 - T2) / AbulkCV;
11638  dVdseffCV_dVg = T3;
11639  dVdseffCV_dVd = T1;
11640  dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb;
11641 
11642 
11643  // v3.1
11644  if (soiMod == 2) // v3.2 - ideal FD
11645  {
11646  qbulk = Cbg1 = Cbd1 = Cbb1 = 0;
11647  }
11648  else
11649  {
11650  T0 = AbulkCV * VdseffCV;
11651  T1 = 12.0 * (Vgsteff_local - 0.5 * T0 + 1e-20);
11652  T2 = VdseffCV / T1;
11653  T3 = T0 * T2;
11654  T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV);
11655  T5 = (6.0 * T0 * (4.0 * Vgsteff_local- T0) / (T1 * T1) - 0.5);
11656  T6 = 12.0 * T2 * T2 * Vgsteff_local;
11657 
11658  T7 = 1.0 - AbulkCV;
11659  qbulk = CoxWLb * T7 * (0.5 * VdseffCV - T3);
11660  T4 = -T7 * (T4 - 1.0);
11661  T5 = -T7 * T5;
11662  T6 = -(T7 * T6 + (0.5 * VdseffCV - T3));
11663 
11664  Cbg1 = CoxWLb * (T4 + T5 * dVdseffCV_dVg);
11665  Cbd1 = CoxWLb * T5 * dVdseffCV_dVd ;
11666  Cbb1 = CoxWLb * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb);
11667  }
11668  // v3.1
11669 
11670 
11671  // Total inversion charge
11672  T0 = AbulkCV * VdseffCV;
11673  T1 = 12.0 * (Vgsteff_local - 0.5 * T0 + 1e-20);
11674 // T2 = VdseffCV / T1;
11675  T2 = T0 / T1;
11676  T3 = T0 * T2;
11677 
11678 // T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV);
11679 // T5 = (6.0 * T0 * (4.0 * Vgsteff_local - T0) / (T1 * T1) - 0.5);
11680 // T6 = 12.0 * T2 * T2 * Vgsteff_local;
11681  T4 = (1.0 - 12.0 * T2 * T2); //bug fix by wanh
11682  T7 = T2 * (2.0 + 6.0 * T2) - 0.5; //bug fix by wanh
11683 
11684  T5 = T7 * AbulkCV;
11685  T6 = T7 * VdseffCV;
11686 
11687 // qinv_local = CoxWL * (Vgsteff_local - 0.5 * VdseffCV + T3);
11688  qinv_local = CoxWL * (Vgsteff_local - 0.5 * T0 + T3);
11689 
11690  qinv = -qinv_local; // for noise v3.2
11691 
11692  Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg);
11693  Cgd1 = CoxWL * T5 * dVdseffCV_dVd;
11694  Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb);
11695 
11696  // Inversion charge partitioning into S / D
11697  if (model_.xpart > 0.5)
11698  { // 0/100 Charge partition model
11699  T1 = T1 + T1;
11700  qsrc = -CoxWL * (0.5 * Vgsteff_local + 0.25 * T0
11701  - T0 * T0 / T1);
11702  T7 = (4.0 * Vgsteff_local - T0) / (T1 * T1);
11703  T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1));
11704  T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7);
11705  T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7);
11706  Csg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg);
11707  Csd1 = CoxWL * T5 * dVdseffCV_dVd;
11708  Csb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb);
11709 
11710  }
11711  else if (model_.xpart < 0.5)
11712  { // 40/60 Charge partition model
11713  T1 = T1 / 12.0;
11714  T2 = 0.5 * CoxWL / (T1 * T1);
11715  T3 = Vgsteff_local * (2.0 * T0 * T0 / 3.0 + Vgsteff_local
11716  * (Vgsteff_local - 4.0 * T0 / 3.0))
11717  - 2.0 * T0 * T0 * T0 / 15.0;
11718  qsrc = -T2 * T3;
11719  T7 = 4.0 / 3.0 * Vgsteff_local * (Vgsteff_local - T0)
11720  + 0.4 * T0 * T0;
11721  T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff_local * (3.0
11722  * Vgsteff_local - 8.0 * T0 / 3.0) + 2.0 * T0 * T0 / 3.0);
11723  T5 = (qsrc / T1 + T2 * T7) * AbulkCV;
11724  T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV);
11725  Csg1 = T4 + T5 * dVdseffCV_dVg;
11726  Csd1 = T5 * dVdseffCV_dVd;
11727  Csb1 = T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb;
11728  }
11729  else
11730  { // 50/50 Charge partition model
11731  qsrc = - 0.5 * (qinv_local + qbulk);
11732  Csg1 = - 0.5 * (Cgg1 + Cbg1);
11733  Csb1 = - 0.5 * (Cgb1 + Cbb1);
11734  Csd1 = - 0.5 * (Cgd1 + Cbd1);
11735  }
11736 
11737 
11738 
11739  // Backgate charge
11740  // v3.1
11741  if (soiMod == 2) // v3.2 - ideal FD
11742  {
11743  Qe1 = dQe1_dVb = dQe1_dVe = dQe1_dT = 0;
11744  }
11745  else // soiMod = 0 or 1
11746  {
11747  CboxWL = paramPtr->kb1 * model_.fbody * Cbox
11748  * (paramPtr->weffCV / nseg
11749  * paramPtr->leffCVbg + aebcp);
11750  Qe1 = CboxWL * (Vesfb - Vbs);
11751  dQe1_dVb = -CboxWL;
11752  dQe1_dVe = CboxWL;
11753  if (selfheat)
11754  dQe1_dT = -CboxWL * dvfbb_dT;
11755  else
11756  dQe1_dT = 0;
11757  }
11758  // v3.1
11759 
11760 
11761  qgate = qinv_local + Qac0 + Qsub0;
11762  qbody = (qbulk - Qac0 - Qsub0 - Qe1);
11763  qsub = Qe1;
11764  qdrn = -(qgate + qsrc + qbody + qsub);
11765 
11766  // This transform all the dependency on Vgsteff_local, Vbseff
11767  // into real ones
11768  Ce1b = dQe1_dVb;
11769  Ce1e = dQe1_dVe;
11770 
11771  Csg = Csg1 * dVgsteff_dVg;
11772  Csd = Csd1 + Csg1 * dVgsteff_dVd;
11773  Csb = Csg1 * dVgsteff_dVb + Csb1 * dVbseff_dVb;
11774  if (selfheat)
11775  CsT = Csg1 * dVgsteff_dT;
11776  else
11777  CsT = 0.0;
11778 
11779  Cgg = (Cgg1 + dQsub0_dVg) * dVgsteff_dVg
11780  + dQac0_dVrg + dQsub0_dVrg;
11781  Cgd = (Cgg1 + dQsub0_dVg) * dVgsteff_dVd + Cgd1
11782  + dQac0_dVd + dQsub0_dVd;
11783  Cgb = (Cgg1 + dQsub0_dVg) * dVgsteff_dVb
11784  + (Cgb1 + dQsub0_dVb + dQac0_dVb) * dVbseff_dVb;
11785  if (selfheat)
11786  CgT = (Cgg1 + dQsub0_dVg) * dVgsteff_dT + dQac0_dT + dQsub0_dT;
11787  else
11788  CgT = 0.0;
11789 
11790  Cbg = (Cbg1 - dQsub0_dVg) * dVgsteff_dVg - dQac0_dVrg - dQsub0_dVrg;
11791  Cbd = (Cbg1 - dQsub0_dVg) * dVgsteff_dVd + Cbd1 - dQac0_dVd
11792  - dQsub0_dVd;
11793  Cbb = (Cbg1 - dQsub0_dVg) * dVgsteff_dVb - dQe1_dVb
11794  + (Cbb1 - dQsub0_dVb - dQac0_dVb) * dVbseff_dVb;
11795  if (selfheat)
11796  CbT = (Cbg1 - dQsub0_dVg) * dVgsteff_dT - dQac0_dT - dQsub0_dT
11797  - dQe1_dT;
11798  else
11799  CbT = 0.0;
11800 
11801 
11802  cggb = Cgg ;
11803  cgsb = - (Cgg + Cgd + Cgb);
11804  cgdb = Cgd;
11805  cgT = CgT;
11806 
11807  cbgb = Cbg;
11808  cbsb = -(Cbg + Cbd + Cbb) + Ce1e;
11809  cbdb = Cbd;
11810  cbeb = - Ce1e ;
11811  cbT = CbT;
11812 
11813  ceeb = Ce1e ;
11814  ceT = dQe1_dT;
11815 
11816  cdgb = -(Cgg + Cbg + Csg);
11817  cddb = -(Cgd + Cbd + Csd);
11818  cdeb = 0;
11819  cdT = -(CgT + CbT + CsT) - dQe1_dT;
11820  cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb
11821  + Csg + Csd + Csb) + Ce1b;
11822  } // End of if capMod == 2
11823 
11824  else if (model_.capMod == 3)
11825  {
11826 
11827  dVgsteff_dVb /= dVbseff_dVb;
11828  Cox = 3.453133e-11 / (model_.tox - model_.dtoxcv); //v2.2.3
11829  CoxWL *= model_.tox/ (model_.tox - model_.dtoxcv);
11830  CoxWLb *= model_.tox/ (model_.tox - model_.dtoxcv);
11831  Tox = 1.0e8 * (model_.tox - model_.dtoxcv);
11832 
11833 
11834  // v3.1
11835  if (soiMod == 2) // v3.2 - ideal FD
11836  {
11837  Qac0 = dQac0_dVg = dQac0_dVb = dQac0_dT = 0.0;
11838  Qsub0 = dQsub0_dVg = dQsub0_dVd = dQsub0_dVb = dQsub0_dT = 0.0;
11839  }
11840  else // soiMod = 0 or 1
11841  {
11842  if (selfheat) {
11843  Vfbzb = Vthzb - phi_local - paramPtr->k1eff * sqrtPhi
11844  + paramPtr->delvt;
11845  dVfbzb_dT = dVthzb_dT;
11846  }
11847  else {
11848  Vfbzb = paramPtr->vfbzb + paramPtr->delvt;
11849  dVfbzb_dT = 0;
11850  }
11851 
11852  V3 = Vfbzb - Vgs_eff + Vbseff - DELTA_3;
11853  if (Vfbzb <= 0.0)
11854  { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfbzb);
11855  T2 = -DELTA_3 / T0;
11856  }
11857  else
11858  { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfbzb);
11859  T2 = DELTA_3 / T0;
11860  }
11861 
11862  T1 = 0.5 * (1.0 + V3 / T0);
11863  Vfbeff = Vfbzb - 0.5 * (V3 + T0);
11864  dVfbeff_dVg = T1 * dVgs_eff_dVg;
11865  dVfbeff_dVb = -T1;
11866  if (selfheat)
11867  dVfbeff_dT = (1.0 - T1 - T2) * dVfbzb_dT;
11868  else
11869  dVfbeff_dT = 0.0;
11870 
11871 
11872  T0 = (Vgs_eff - Vbseff - Vfbzb) / Tox;
11873  dT0_dVg = dVgs_eff_dVg / Tox;
11874  dT0_dVb = -1.0 / Tox;
11875 
11876  tmp = T0 * paramPtr->acde;
11877  if ((-EXPL_THRESHOLD < tmp) && (tmp < EXPL_THRESHOLD))
11878  { Tcen = paramPtr->ldeb * exp(tmp);
11879  dTcen_dVg = paramPtr->acde * Tcen;
11880  dTcen_dVb = dTcen_dVg * dT0_dVb;
11881  dTcen_dVg *= dT0_dVg;
11882  if (selfheat)
11883  dTcen_dT = -Tcen * paramPtr->acde * dVfbzb_dT / Tox;
11884  else
11885  dTcen_dT = 0;
11886  }
11887  else if (tmp <= -EXPL_THRESHOLD)
11888  { Tcen = paramPtr->ldeb * MIN_EXPL;
11889  dTcen_dVg = dTcen_dVb = dTcen_dT = 0.0;
11890  }
11891  else
11892  { Tcen = paramPtr->ldeb * MAX_EXPL;
11893  dTcen_dVg = dTcen_dVb = dTcen_dT = 0.0;
11894  }
11895 
11896  LINK = 1.0e-3 * (model_.tox - model_.dtoxcv); // v2.2.3
11897  V3 = paramPtr->ldeb - Tcen - LINK;
11898  V4 = sqrt(V3 * V3 + 4.0 * LINK * paramPtr->ldeb);
11899  Tcen = paramPtr->ldeb - 0.5 * (V3 + V4);
11900  T1 = 0.5 * (1.0 + V3 / V4);
11901  dTcen_dVg *= T1;
11902  dTcen_dVb *= T1;
11903  if (selfheat)
11904  dTcen_dT *= T1;
11905  else
11906  dTcen_dT = 0;
11907 
11908  Ccen = CONSTEPSSI / Tcen;
11909  T2 = Cox / (Cox + Ccen);
11910  Coxeff = T2 * Ccen;
11911  T3 = -Ccen / Tcen;
11912  dCoxeff_dVg = T2 * T2 * T3;
11913  dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb;
11914  dCoxeff_dVg *= dTcen_dVg;
11915  if (selfheat)
11916  dCoxeff_dT = T3 * dTcen_dT * (T2 - Coxeff / (Cox + Ccen));
11917  else
11918  dCoxeff_dT = 0;
11919  CoxWLcenb = CoxWLb * Coxeff / Cox;
11920  if (selfheat)
11921  dCoxWLcenb_dT = CoxWLb * dCoxeff_dT / Cox;
11922  else
11923  dCoxWLcenb_dT = 0;
11924 
11925  Qac0 = CoxWLcenb * (Vfbeff - Vfbzb);
11926  QovCox = Qac0 / Coxeff;
11927  dQac0_dVg = CoxWLcenb * dVfbeff_dVg
11928  + QovCox * dCoxeff_dVg;
11929  dQac0_dVb = CoxWLcenb * dVfbeff_dVb
11930  + QovCox * dCoxeff_dVb;
11931  if (selfheat)
11932  dQac0_dT = CoxWLcenb * (dVfbeff_dT - dVfbzb_dT)
11933  + dCoxWLcenb_dT * (Vfbeff - Vfbzb);
11934  else
11935  dQac0_dT = 0.0;
11936 
11937  T0 = 0.5 * paramPtr->k1eff;
11938  T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff_local;
11939  if (paramPtr->k1eff == 0.0)
11940  { T1 = 0.0;
11941  T2 = 0.0;
11942  }
11943  else if (T3 < 0.0)
11944  { T1 = T0 + T3 / paramPtr->k1eff;
11945  T2 = CoxWLcenb;
11946  }
11947  else
11948  { T1 = sqrt(T0 * T0 + T3);
11949  T2 = CoxWLcenb * T0 / T1;
11950  }
11951 
11952  Qsub0 = CoxWLcenb * paramPtr->k1eff * (T1 - T0);
11953  QovCox = Qsub0 / Coxeff;
11954  dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg)
11955  + QovCox * dCoxeff_dVg;
11956  dQsub0_dVd = -T2 * dVgsteff_dVd;
11957  dQsub0_dVb = -T2 * (dVfbeff_dVb + 1 + dVgsteff_dVb)
11958  + QovCox * dCoxeff_dVb;
11959  if (selfheat)
11960  dQsub0_dT = -T2 * (dVfbeff_dT + dVgsteff_dT)
11961  + dCoxWLcenb_dT * paramPtr->k1eff * (T1 - T0);
11962  else
11963  dQsub0_dT = 0.0;
11964  }
11965  // v3.1
11966 
11967 
11968  // Gate-bias dependent delta Phis begins
11969  if (paramPtr->k1eff <= 0.0)
11970  { Denomi = 0.25 * paramPtr->moin * Vtm;
11971  T0 = 0.5 * paramPtr->sqrtPhi;
11972  }
11973  else
11974  { Denomi = paramPtr->moin * Vtm
11975  * paramPtr->k1eff * paramPtr->k1eff;
11976  T0 = paramPtr->k1eff * paramPtr->sqrtPhi;
11977  }
11978  T1 = 2.0 * T0 + Vgsteff_local;
11979 
11980  DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff_local / Denomi);
11981  dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff_local);
11982  dDeltaPhi_dVd = dDeltaPhi_dVg * dVgsteff_dVd;
11983  dDeltaPhi_dVb = dDeltaPhi_dVg * dVgsteff_dVb;
11984  // End of delta Phis
11985 
11986 
11987  // v3.1.1 bug fix for discontinuity
11988  T3 = 4.0 * (Vth - Vfbzb - phi_local);
11989  T2 = sqrt(T3*T3 + 0.0001);
11990  T5 = 0.5 * (1 + T3/T2);
11991  T4 = 0.5 * (T3 + T2);
11992 
11993  Tox += Tox;
11994  T0 = (Vgsteff_local + T4) / Tox;
11995  tmp = exp(0.7 * log(T0));
11996  T1 = 1.0 + tmp;
11997  T2 = 0.7 * tmp / (T0 * Tox);
11998  Tcen = 1.9e-9 / T1;
11999  dTcen_dVg = -Tcen * T2 / T1;
12000  dTcen_dVd = dTcen_dVg * (T5 * 4.0 * dVth_dVd + dVgsteff_dVd);
12001  dTcen_dVb = dTcen_dVg * (T5 * 4.0 * dVth_dVb + dVgsteff_dVb);
12002  dTcen_dVg *= dVgsteff_dVg;
12003  if (selfheat)
12004  dTcen_dT = -Tcen * T2 / T1
12005  * (T5 * 4.0 * (dVth_dT - dVfbzb_dT) + dVgsteff_dT);
12006  else
12007  dTcen_dT = 0;
12008 
12009 
12010  Ccen = CONSTEPSSI / Tcen;
12011  T0 = Cox / (Cox + Ccen);
12012  Coxeff = T0 * Ccen;
12013  T1 = -Ccen / Tcen;
12014  dCoxeff_dVg = T0 * T0 * T1;
12015  dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd;
12016  dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb;
12017  dCoxeff_dVg *= dTcen_dVg;
12018  if (selfheat)
12019  dCoxeff_dT = T1 * dTcen_dT * (T0 - Coxeff / (Cox + Ccen));
12020  else dCoxeff_dT = 0;
12021  CoxWLcen = CoxWL * Coxeff / Cox;
12022  CoxWLcenb = CoxWLb * Coxeff / Cox;
12023 
12024  AbulkCV = Abulk0 * paramPtr->abulkCVfactor;
12025  dAbulkCV_dVb = paramPtr->abulkCVfactor * dAbulk0_dVb;
12026  VdsatCV = (Vgsteff_local - DeltaPhi) / AbulkCV;
12027  V4 = VdsatCV - Vds - DELTA_4;
12028  T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV);
12029  VdseffCV = VdsatCV - 0.5 * (V4 + T0);
12030  T1 = 0.5 * (1.0 + V4 / T0);
12031  T2 = DELTA_4 / T0;
12032  T3 = (1.0 - T1 - T2) / AbulkCV;
12033  T4 = T3 * ( 1.0 - dDeltaPhi_dVg);
12034  dVdseffCV_dVg = T4;
12035  dVdseffCV_dVd = T1;
12036  dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb;
12037 
12038  T0 = AbulkCV * VdseffCV;
12039  T1 = Vgsteff_local - DeltaPhi;
12040  T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20);
12041  T3 = T0 / T2;
12042  T4 = 1.0 - 12.0 * T3 * T3;
12043  T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5);
12044  T6 = T5 * VdseffCV / AbulkCV;
12045 
12046  qinv_local = qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3));
12047  QovCox = qgate / Coxeff;
12048  Cgg1 = CoxWLcen * (T4 * (1.0 - dDeltaPhi_dVg)
12049  + T5 * dVdseffCV_dVg);
12050  Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1
12051  * dVgsteff_dVd + QovCox * dCoxeff_dVd;
12052  Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
12053  + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb;
12054  Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg;
12055 
12056 
12057  // v3.1
12058  if (soiMod == 2) // v3.2 - ideal FD
12059  {
12060  qbulk = Cbg1 = Cbd1 = Cbb1 = Cbg1 = 0;
12061  }
12062  else // soiMod = 0 or 1
12063  {
12064  T7 = 1.0 - AbulkCV;
12065  T8 = T2 * T2;
12066  T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV);
12067  T10 = T9 * (1.0 - dDeltaPhi_dVg);
12068  T11 = -T7 * T5 / AbulkCV;
12069  T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2));
12070 
12071  qbulk = CoxWLcenb * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2);
12072  QovCox = qbulk / Coxeff;
12073  Cbg1 = CoxWLcenb * (T10 + T11 * dVdseffCV_dVg);
12074  Cbd1 = CoxWLcenb * T11 * dVdseffCV_dVd + Cbg1
12075  * dVgsteff_dVd + QovCox * dCoxeff_dVd;
12076  Cbb1 = CoxWLcenb * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb)
12077  + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb;
12078  Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg;
12079  }
12080  // v3.1
12081 
12082 
12083  if (model_.xpart > 0.5)
12084  { // 0/100 partition
12085  qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0
12086  - 0.5 * T0 * T0 / T2);
12087  QovCox = qsrc / Coxeff;
12088  T2 += T2;
12089  T3 = T2 * T2;
12090  T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3);
12091  T4 = -(0.5 + 24.0 * T0 * T0 / T3) * (1.0 - dDeltaPhi_dVg);
12092  T5 = T7 * AbulkCV;
12093  T6 = T7 * VdseffCV;
12094 
12095  Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg);
12096  Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd
12097  + QovCox * dCoxeff_dVd;
12098  Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)
12099  + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb;
12100  Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg;
12101  }
12102  else if (model_.xpart < 0.5)
12103  { // 40/60 partition
12104  T2 = T2 / 12.0;
12105  T3 = 0.5 * CoxWLcen / (T2 * T2);
12106  T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0
12107  * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0;
12108  qsrc = -T3 * T4;
12109  QovCox = qsrc / Coxeff;
12110  T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0;
12111  T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0
12112  * T0 / 3.0) + 2.0 * T0 * T0 / 3.0);
12113  T6 = AbulkCV * (qsrc / T2 + T3 * T8);
12114  T7 = T6 * VdseffCV / AbulkCV;
12115 
12116  Csg = T5 * (1.0 - dDeltaPhi_dVg) + T6 * dVdseffCV_dVg;
12117  Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd
12118  + QovCox * dCoxeff_dVd;
12119  Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb
12120  + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb;
12121  Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg;
12122  }
12123  else
12124  { // 50/50 partition
12125  qsrc = -0.5 * qgate;
12126  Csg = -0.5 * Cgg1;
12127  Csd = -0.5 * Cgd1;
12128  Csb = -0.5 * Cgb1;
12129  }
12130 
12131 
12132  // Backgate charge
12133  // v3.1
12134  if (soiMod == 2) // v3.2 - ideal FD
12135  {
12136  Qe1 = Ce1b = Ce1e = Ce1T = dQe1_dT = 0;
12137  }
12138  else // soiMod = 0 or 1
12139  {
12140  CboxWL = paramPtr->kb1 * model_.fbody * Cbox
12141  * (paramPtr->weffCV / nseg
12142  * paramPtr->leffCVbg + aebcp);
12143  Qe1 = CboxWL * (Vesfb - Vbs);
12144  Ce1b = dQe1_dVb = -CboxWL;
12145  Ce1e = dQe1_dVe = CboxWL;
12146  if (selfheat)
12147  Ce1T = dQe1_dT = -CboxWL * dvfbb_dT;
12148  else
12149  Ce1T = dQe1_dT = 0.0;
12150  }
12151  // v3.1
12152 
12153 
12154  qgate += Qac0 + Qsub0 - qbulk;
12155  qbody = qbulk - Qac0 - Qsub0 - Qe1;
12156  qsub = Qe1;
12157  qdrn = -(qgate + qbody + qsub + qsrc);
12158 
12159  Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg;
12160  Cbd = Cbd1 - dQsub0_dVd;
12161  Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb - Ce1b / dVbseff_dVb;
12162  if (selfheat)
12163  CbT = Cbg1 * dVgsteff_dT - dQac0_dT
12164  - dQsub0_dT - dQe1_dT;
12165  else
12166  CbT = 0.0;
12167 
12168  Cgg = Cgg1 - Cbg;
12169  Cgd = Cgd1 - Cbd;
12170  Cgb = Cgb1 - Cbb - Ce1b / dVbseff_dVb;
12171  if (selfheat)
12172  CgT = Cgg1 * dVgsteff_dT + dQac0_dT + dQsub0_dT;
12173  else
12174  CgT = 0.0;
12175 
12176  Cgb *= dVbseff_dVb;
12177  Cbb *= dVbseff_dVb;
12178  Csb *= dVbseff_dVb;
12179  if (selfheat)
12180  CsT = Csg * dVgsteff_dT;
12181  else
12182  CsT = 0.0;
12183 
12184  cggb = Cgg;
12185  cgsb = -(Cgg + Cgd + Cgb);
12186  cgdb = Cgd;
12187  cgT = CgT;
12188 
12189  cbgb = Cbg;
12190  cbsb = -(Cbg + Cbd + Cbb)
12191  + Ce1e;
12192  cbdb = Cbd;
12193  cbeb = -Ce1e;
12194  cbT = CbT;
12195 
12196  ceT = Ce1T;
12197  ceeb = Ce1e ;
12198 
12199  cdgb = -(Cgg + Cbg + Csg);
12200  cddb = -(Cgd + Cbd + Csd);
12201  cdeb = 0;
12202  cdT = -(CgT+CbT+CsT) - Ce1T;
12203  cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb
12204  + Csg + Csd + Csb) + Ce1b;
12205  qinv = -qinoi;
12206 
12207  } // End of if capMod ==3
12208  }
12209 
12210  finished: // returning Values to Calling Routine
12211 
12212  //
12213  // COMPUTE EQUIVALENT DRAIN CURRENT SOURCE
12214  //
12215 
12216 
12218  {
12219  // Intrinsic S/D junction charge
12220  // v3.1
12221  if (soiMod == 2) // v3.2 - ideal FD
12222  {
12223  qjs_local = qjd_local = 0.0;
12224  gcjdds = gcjdbs = gcjdT = 0.0;
12225  gcjsbs = gcjsT = 0.0;
12226  }
12227  else // soiMod = 0 or 1
12228  {
12229  PhiBSWG = model_.GatesidewallJctPotential;
12230  dPhiBSWG_dT = -model_.tpbswg;
12231  PhiBSWG += dPhiBSWG_dT * (Temp - model_.tnom);
12233 
12235  * wdiosCV * model_.tsi / 1e-7;
12236  dcjsbs_dT = cjsbs * model_.tcjswg;
12237  cjsbs += dcjsbs_dT * (Temp - model_.tnom);
12238 
12240  * wdiodCV * model_.tsi / 1e-7;
12241  dcjdbs_dT = cjdbs * model_.tcjswg;
12242  cjdbs += dcjdbs_dT * (Temp - model_.tnom);
12243 
12244  DioMax = 0.9 * (PhiBSWG);
12245 
12246  arg = 1.0 - (Vbs > DioMax ? DioMax : Vbs) / PhiBSWG;
12247 
12248  if (selfheat)
12249  darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT;
12250 
12251  if (MJSWG == 0.5) {
12252  dT3_dVb = 1.0 / sqrt(arg);
12253 
12254  if (selfheat) ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT;
12255  }
12256  else {
12257  dT3_dVb = exp(-MJSWG * log(arg));
12258 
12259  if (selfheat) ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT;
12260  }
12261  T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG);
12262 
12263  if (selfheat)
12264  dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG)
12265  - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG
12266  / (1.0 - MJSWG);
12267 
12268  if (Vbs > DioMax)
12269  T3 += dT3_dVb * (Vbs - DioMax);
12270 
12271  qjs_local = cjsbs * T3 + model_.tt * Ibsdif;
12272  gcjsbs = cjsbs * dT3_dVb + model_.tt * dIbsdif_dVb;
12273 
12274  if (selfheat)
12275  gcjsT = model_.tt * dIbsdif_dT + dcjsbs_dT * T3
12276  + dT3_dT * cjsbs;
12277  else
12278  gcjsT = 0.0;
12279 
12280 
12281  arg = 1.0 - (Vbd > DioMax ? DioMax : Vbd) / PhiBSWG;
12282 
12283  if (selfheat)
12284  darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT;
12285 
12286  if (MJSWG == 0.5) {
12287  dT3_dVb = 1.0 / sqrt(arg);
12288 
12289  if (selfheat) ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT;
12290  }
12291  else {
12292  dT3_dVb = exp(-MJSWG * log(arg));
12293 
12294  if (selfheat) ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT;
12295  }
12296  T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG);
12297 
12298  if (selfheat)
12299  dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG)
12300  - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG
12301  / (1.0 - MJSWG);
12302 
12303  if (Vbd > DioMax)
12304  T3 += dT3_dVb * (Vbd - DioMax);
12305 
12306  dT3_dVd = -dT3_dVb;
12307 
12308  qjd_local = cjdbs * T3 + model_.tt * Ibddif;
12309  gcjdbs = cjdbs * dT3_dVb + model_.tt * dIbddif_dVb;
12310  gcjdds = cjdbs * dT3_dVd + model_.tt * dIbddif_dVd;
12311 
12312  if (selfheat)
12313  gcjdT = model_.tt * dIbddif_dT + dcjdbs_dT * T3
12314  + dT3_dT * cjdbs;
12315  else
12316  gcjdT = 0.0;
12317  }
12318  // v3.1
12319 
12320  qdrn -= qjd_local;
12321  qbody += (qjs_local + qjd_local);
12322  qsrc = -(qgate + qbody + qdrn + qsub);
12323 
12324  // Update the conductance
12325  cddb -= gcjdds;
12326  cdT -= gcjdT;
12327  cdsb += gcjdds + gcjdbs;
12328 
12329  cbdb += (gcjdds);
12330  cbT += (gcjdT + gcjsT);
12331  cbsb -= (gcjdds + gcjdbs + gcjsbs);
12332 
12333  // Extrinsic Bottom S/D to substrate charge
12334  T10 = -model_.dtype * ves;
12335  // T10 is vse without dtype conversion
12336  T11 = model_.dtype * (vds - ves);
12337  // T11 is vde without dtype conversion
12338 
12339  if (model_.csdmin != 0.0)
12340  {
12341  if ( ((paramPtr->nsub > 0) && (model_.dtype > 0)) ||
12342  ((paramPtr->nsub < 0) && (model_.dtype < 0)) )
12343  {
12344  if (T10 < paramPtr->vsdfb)
12345  { qse = csbox * (T10 - paramPtr->vsdfb);
12346  gcse = csbox;
12347  }
12348  else if (T10 < paramPtr->sdt1)
12349  { T0 = T10 - paramPtr->vsdfb;
12350  T1 = T0 * T0;
12351  qse = T0 * (csbox - paramPtr->st2 / 3 * T1) ;
12352  gcse = csbox - paramPtr->st2 * T1;
12353  }
12354  else if (T10 < paramPtr->vsdth)
12355  { T0 = T10 - paramPtr->vsdth;
12356  T1 = T0 * T0;
12357  qse = csmin * T10 + st4 + paramPtr->st3 / 3 * T0 * T1;
12358  gcse = csmin + paramPtr->st3 * T1;
12359  }
12360  else
12361  { qse = csmin * T10 + st4;
12362  gcse = csmin;
12363  }
12364  } else
12365  {
12366  if (T10 < paramPtr->vsdth)
12367  { qse = csmin * (T10 - paramPtr->vsdth);
12368  gcse = csmin;
12369  }
12370  else if (T10 < paramPtr->sdt1)
12371  { T0 = T10 - paramPtr->vsdth;
12372  T1 = T0 * T0;
12373  qse = T0 * (csmin - paramPtr->st2 / 3 * T1) ;
12374  gcse = csmin - paramPtr->st2 * T1;
12375  }
12376  else if (T10 < paramPtr->vsdfb)
12377  { T0 = T10 - paramPtr->vsdfb;
12378  T1 = T0 * T0;
12379  qse = csbox * T10 + st4 + paramPtr->st3 / 3 * T0 * T1;
12380  gcse = csbox + paramPtr->st3 * T1;
12381  }
12382  else
12383  { qse = csbox * T10 + st4;
12384  gcse = csbox;
12385  }
12386  }
12387 
12388  if ( ((paramPtr->nsub > 0) && (model_.dtype > 0)) ||
12389  ((paramPtr->nsub < 0) && (model_.dtype < 0)) )
12390  {
12391  if (T11 < paramPtr->vsdfb)
12392  { qde = cdbox * (T11 - paramPtr->vsdfb);
12393  gcde = cdbox;
12394  }
12395  else if (T11 < paramPtr->sdt1)
12396  { T0 = T11 - paramPtr->vsdfb;
12397  T1 = T0 * T0;
12398  qde = T0 * (cdbox - paramPtr->dt2 / 3 * T1) ;
12399  gcde = cdbox - paramPtr->dt2 * T1;
12400  }
12401  else if (T11 < paramPtr->vsdth)
12402  { T0 = T11 - paramPtr->vsdth;
12403  T1 = T0 * T0;
12404  qde = cdmin * T11 + dt4 + paramPtr->dt3 / 3 * T0 * T1;
12405  gcde = cdmin + paramPtr->dt3 * T1;
12406  }
12407  else
12408  { qde = cdmin * T11 + dt4;
12409  gcde = cdmin;
12410  }
12411  } else
12412  {
12413  if (T11 < paramPtr->vsdth)
12414  { qde = cdmin * (T11 - paramPtr->vsdth);
12415  gcde = cdmin;
12416  }
12417  else if (T11 < paramPtr->sdt1)
12418  { T0 = T11 - paramPtr->vsdth;
12419  T1 = T0 * T0;
12420  qde = T0 * (cdmin - paramPtr->dt2 / 3 * T1) ;
12421  gcde = cdmin - paramPtr->dt2 * T1;
12422  }
12423  else if (T11 < paramPtr->vsdfb)
12424  { T0 = T11 - paramPtr->vsdfb;
12425  T1 = T0 * T0;
12426  qde = cdbox * T11 + dt4 + paramPtr->dt3 / 3 * T0 * T1;
12427  gcde = cdbox + paramPtr->dt3 * T1;
12428  }
12429  else
12430  { qde = cdbox * T11 + dt4;
12431  gcde = cdbox;
12432  }
12433  }
12434  }
12435  else {
12436  qse = csbox * T10;
12437  gcse = csbox;
12438  qde = cdbox * T11;
12439  gcde = cdbox;
12440  }
12441 
12442  // Extrinsic : Sidewall fringing S/D charge
12443  qse += csesw * T10;
12444  gcse += csesw;
12445  qde += cdesw * T11;
12446  gcde += cdesw;
12447 
12448  // All charge are mutliplied with dtype at the end, but qse and qde
12449  // have true polarity => so pre-mutliplied with dtype
12450  qse *= model_.dtype;
12451  qde *= model_.dtype;
12452  }
12453 
12454  cbb = Cbb;
12455  cbd = Cbd;
12456  cbg = Cbg;
12457  qbf = -Qsub0 - Qac0;
12458  qjs = qjs_local;
12459  qjd = qjd_local;
12460 
12461  // Setting up a few currents for the RHS load:
12462  // Note: Vdp and Vsp get limited, but Vd and Vs do not.
12463  if (dNodePrime == 1) // if drain resistor exists
12464  {
12465  Idrain = drainConductance * (Vd - Vdp);
12466  Idrain_Jdxp = 0.0;
12467 
12468  // no limit on Vd, just Vdp
12469  Idrain_Jdxp = - drainConductance * ( - (Vdp-Vdp_orig));
12470  }
12471 
12472  if (sNodePrime == 1) // if source resistor exists
12473  {
12474  Isource = sourceConductance * (Vs - Vsp);
12475  Isource_Jdxp = 0.0;
12476 
12477  // no limit on Vs, just Vsp
12478  Isource_Jdxp = - sourceConductance * ( - (Vsp-Vsp_orig));
12479  }
12480 
12481  if (selfheat)
12482  Ith = delTemp/paramPtr->rth;
12483  else
12484  Ith = 0;
12485 
12486  Igate = IgateMid = 0.0;
12487  if(rgateMod == 1)
12488  {
12489  Igate = grgeltd * (Vg - Vgp);
12490  Igate_Jdxp = 0.0;
12491 
12492  Igate_Jdxp = - grgeltd * ((Vg-Vg_orig) - (Vgp-Vgp_orig));
12493  }
12494  else if(rgateMod == 2)
12495  {
12496  // gcrg is already the combined conductance of Rgeltd and Rii
12497  // No need to calculate jdxp here, because in fact ceqgcrg's jdxp
12498  // already handles it. This is not the case for rgateMod==1
12499  Igate = (gcrg) * (Vg - Vgp);
12500  Igate_Jdxp = 0.0;
12501  }
12502  else if(rgateMod == 3)
12503  {
12504  // Need to check this --- might need some Jdxp terms for Igate, but
12505  // not for IgateMid, whose Jdxp terms are already in ceqgcrg
12506  Igate = grgeltd * (Vg - Vgm);
12507  IgateMid = gcrg * (Vgm - Vgp);
12508  Igate_Jdxp = 0.0;
12509  }
12510 
12511  // There is a spice3f5 convergence check that would happen here.
12512  // (line 2404) skipping...
12513 
12514  // In 3f5, loading a bunch of things into the state vector at this point.
12515  // (line 2433) skipping...
12516 
12517  // The following lines of charge computation are necessary in this routine,
12518  // and can't be deferred to auxChargeCalculations: TVR ADDITION
12519 
12521 
12522  if (mode >= 0)
12523  { Gm = gm;
12524  Gmbs = gmbs;
12525  Gme = gme;
12526 
12527  GmT = model_.dtype * gmT;
12528 
12529  FwdSum = Gm + Gmbs + Gme; // v3.0
12530  RevSum = 0.0;
12531 
12532 // spice has:
12533 // cdreq = model_.dtype * (cdrain - gds * vds
12534 // - Gm * vgs - Gmbs * vbs - Gme * ves) - GmT * delTemp;
12535 
12536  cdreq_Jdxp = 0.0;
12537  cdreq = model_.dtype * cdrain;
12538  cdreq_Jdxp = model_.dtype *
12539  (-gds * (vds-vds_orig)
12540  -Gm * (vgs-vgs_orig)
12541  -Gmbs * (vbs-vbs_orig)
12542  -Gme * (ves-ves_orig))
12543  -GmT * (delTemp-delTemp_orig);
12544 
12545  // ceqbs now is compatible with cdreq, ie. going in is +ve
12546  // Equivalent current source from the diode
12547  ceqbs = cjs;
12548  ceqbd = cjd;
12549 
12550  ceqbs_Jdxp = cjs_Jdxp;
12551  ceqbd_Jdxp = cjd_Jdxp;
12552 
12553  // Current going in is +ve
12554  ceqbody = -cbody;
12556 
12557  ceqgate = cgate;
12559 
12560  gigg_jac = gigg;
12561  gigb_jac = gigb;
12562  gige_jac = gige; // v3.0
12563  gigs_jac = gigs;
12564  gigd_jac = gigd;
12565  gigT_jac = model_.dtype * gigT;
12566 
12567  ceqth = cth;
12568  ceqth_Jdxp = cth_Jdxp;
12569  ceqbodcon = cbodcon;
12571 
12572  gbbg = -gbgs;
12573  gbbdp = -gbds;
12574  gbbb = -gbbs;
12575  gbbp = -gbps;
12576  gbbT = -model_.dtype * gbT; // v3.0
12577  gbbe = -gbes;
12578  gbbsp = - ( gbbg + gbbdp + gbbb + gbbp + gbbe);
12579 
12580  gddpg = -gjdg;
12581  gddpdp = -gjdd;
12582  gddpb = -gjdb;
12583  gddpT = -model_.dtype * gjdT; // v3.0
12584  gddpe = -gjde;
12585  gddpsp = - ( gddpg + gddpdp + gddpb + gddpe);
12586 
12587  gsspg = -gjsg;
12588  gsspdp = -gjsd;
12589  gsspb = -gjsb;
12590  gsspT = -model_.dtype * gjsT; // v3.0
12591  gsspe = 0.0;
12592  gsspsp = - (gsspg + gsspdp + gsspb + gsspe);
12593 
12594  gppb = -gbpbs;
12595  gppp = -gbpps;
12596 
12597  gTtg = gtempg;
12598  gTtb = gtempb;
12599  gTtdp = gtempd;
12600  gTtt = gtempT;
12601 
12602  // v3.0
12603  gTte = gtempe;
12604  gTtsp = - (gTtg + gTtb + gTtdp + gTte);
12605 
12606 
12607  // v3.0
12608  if (model_.igcMod)
12609  { gIstotg = gIgsg + gIgcsg;
12610  gIstotd = gIgcsd;
12611  gIstots = gIgss + gIgcss;
12612  gIstotb = gIgcsb;
12613 // Istoteq = model_.dtype * (Igs + Igcs
12614 // - gIstotg * vgs - gIgcsd * vds - gIgcsb * vbs);
12615 
12616  Istoteq_Jdxp = 0.0;
12617  Istoteq = model_.dtype * (Igs + Igcs);
12618  // NOTE: mimicing spice, we don't use the "Vgs/Vds/Vbs" versions
12620  (- gIstotg * (vgs-vgs_orig)
12621  - gIgcsd * (vds-vds_orig)
12622  - gIgcsb * (vbs-vbs_orig));
12623 
12624  gIdtotg = gIgdg + gIgcdg;
12625  gIdtotd = gIgdd + gIgcdd;
12626  gIdtots = gIgcds;
12627  gIdtotb = gIgcdb;
12628 // Idtoteq = model_.dtype * (Igd + Igcd
12629 // - gIgdg * vgd - gIgcdg * vgs - gIgcdd * vds - gIgcdb * vbs);
12630 
12631  Idtoteq_Jdxp = 0.0;
12632  Idtoteq = model_.dtype * (Igd + Igcd);
12633  // NOTE: mimicing SPICE, we use the original vgd/vgs/vds not
12634  // the "mode aware" "Vgs/Vds" etc.
12636  (- gIgdg * (vgd-vgd_orig)
12637  - gIgcdg * (vgs-vgs_orig)
12638  - gIgcdd * (vds-vds_orig)
12639  - gIgcdb * (vbs-vbs_orig));
12640 
12641  gIgtotg = gIstotg + gIdtotg;
12642  gIgtotd = gIstotd + gIdtotd;
12643  gIgtots = gIstots + gIdtots;
12644  gIgtotb = gIstotb + gIdtotb;
12645  Igtoteq = Istoteq + Idtoteq;
12646  Igtoteq_Jdxp = 0.0;
12648  }
12649  else
12650  { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0;
12651  gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0;
12652 
12653  gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0;
12654  }
12655 
12656  // v3.1 wanh added for RF
12657  if (rgateMod == 2)
12658  T0 = vges - vgs;
12659  else if (rgateMod == 3)
12660  T0 = vgms - vgs;
12661  if (rgateMod > 1)
12662  {
12663  gcrgd_jac = gcrgd * T0;
12664  gcrgg_jac = gcrgg * T0;
12665  gcrgs_jac = gcrgs * T0;
12666  gcrgb_jac = gcrgb * T0;
12667 
12668 // ceqgcrg = -(gcrgd_jac * vds + gcrgg_jac * vgs + gcrgb_jac * vbs);
12669 
12670  ceqgcrg_Jdxp = 0.0;
12671  ceqgcrg = 0.0;
12672  ceqgcrg_Jdxp = -(gcrgd_jac * (vds - vds_orig) +
12673  gcrgg_jac * (vgs - vgs_orig) +
12674  gcrgb_jac * (vbs - vbs_orig));
12675 
12676  gcrgg_jac -= gcrg;
12677  gcrg_jac = gcrg;
12678  }
12679  else
12681  = gcrgs_jac = gcrgb_jac = 0.0;
12682  // v3.1 wanh added for RF end
12683 
12684  } // end of mode>=0
12685 
12686  else
12687  { Gm = -gm;
12688  Gmbs = -gmbs;
12689  Gme = -gme; // v3.0
12690 
12691  GmT = -model_.dtype * gmT;
12692  FwdSum = 0.0;
12693  RevSum = -(Gm + Gmbs + Gme); // v3.0
12694 
12695 
12696  // v3.1 bug fix
12697 // cdreq = -model_.dtype * (cdrain + gds*vds + Gm * vgd
12698 // + Gmbs * vbd + Gme * (ves - vds)) - GmT * delTemp;
12699 
12700  cdreq_Jdxp = 0.0;
12701  cdreq = -model_.dtype * cdrain;
12702  cdreq_Jdxp = -model_.dtype * (gds * (vds-vds_orig)
12703  +Gm * (vgd-vgd_orig)
12704  +Gmbs * (vbd-vbd_orig)
12705  +Gme * (ves-ves_orig-(vds-vds_orig))
12706  -GmT * (delTemp-delTemp_orig));
12707 
12708  ceqbs = cjd;
12709  ceqbd = cjs;
12710 
12711  ceqbs_Jdxp = cjd_Jdxp;
12712  ceqbd_Jdxp = cjs_Jdxp;
12713 
12714  // Current going in is +ve
12715  ceqbody = -cbody;
12717 
12718  ceqgate = cgate;
12720 
12721  gigg_jac = gigg;
12722  gigb_jac = gigb;
12723  gige_jac = gige; // v3.0
12724  gigs_jac = gigd;
12725  gigd_jac = gigs;
12726  gigT_jac = model_.dtype * gigT;
12727 
12728  ceqth = cth;
12729  ceqth_Jdxp = cth_Jdxp;
12730  ceqbodcon = cbodcon;
12732 
12733  gbbg = -gbgs;
12734  gbbb = -gbbs;
12735  gbbp = -gbps;
12736  gbbsp = -gbds;
12737  gbbT = -model_.dtype * gbT;
12738  gbbe = -gbes; // v3.0
12739  gbbdp = - ( gbbg + gbbsp + gbbb + gbbp + gbbe);
12740 
12741  gddpg = -gjsg;
12742  gddpsp = -gjsd;
12743  gddpb = -gjsb;
12744  gddpT = -model_.dtype * gjsT;
12745  gddpe = 0.0; // v3.0
12746  gddpdp = - (gddpg + gddpsp + gddpb + gddpe);
12747 
12748  gsspg = -gjdg;
12749  gsspsp = -gjdd;
12750  gsspb = -gjdb;
12751  gsspT = -model_.dtype * gjdT; // v3.0
12752  gsspe = -gjde;
12753  gsspdp = - ( gsspg + gsspsp + gsspb + gsspe);
12754 
12755  gppb = -gbpbs;
12756  gppp = -gbpps;
12757 
12758  gTtg = gtempg;
12759  gTtb = gtempb;
12760  gTtsp = gtempd;
12761  gTtt = gtempT;
12762 
12763  // v3.0
12764  gTte = gtempe;
12765  gTtdp = - (gTtg + gTtb + gTtsp + gTte);
12766 
12767  // v3.0
12768  if (model_.igcMod)
12769  { gIstotg = gIgsg + gIgcdg;
12770  gIstotd = gIgcds;
12771  gIstots = gIgss + gIgcdd;
12772  gIstotb = gIgcdb;
12773 // Istoteq = model_.dtype * (Igs + Igcd
12774 // - gIgsg * vgs - gIgcdg * vgd + gIgcdd * vds - gIgcdb * vbd);
12775 
12776  Istoteq_Jdxp = 0.0;
12777  Istoteq = model_.dtype * (Igs + Igcd);
12779  (- gIgsg * (vgs-vgs_orig)
12780  - gIgcdg * (vgd-vgd_orig)
12781  + gIgcdd * (vds-vds_orig)
12782  - gIgcdb * (vbd-vbd_orig));
12783 
12784 
12785  gIdtotg = gIgdg + gIgcsg;
12786  gIdtotd = gIgdd + gIgcss;
12787  gIdtots = gIgcsd;
12788  gIdtotb = gIgcsb;
12789 // Idtoteq = model_.dtype * (Igd + Igcs
12790 // - (gIgdg + gIgcsg) * vgd + gIgcsd * vds - gIgcsb * vbd);
12791 
12792  Idtoteq_Jdxp = 0.0;
12793  Idtoteq = model_.dtype * (Igd + Igcs);
12795  (- (gIgdg + gIgcsg) * (vgd-vgd_orig)
12796  + gIgcsd * (vds-vds_orig)
12797  - gIgcsb * (vbd-vbd_orig));
12798 
12799  gIgtotg = gIstotg + gIdtotg;
12800  gIgtotd = gIstotd + gIdtotd;
12801  gIgtots = gIstots + gIdtots;
12802  gIgtotb = gIstotb + gIdtotb;
12803  Igtoteq = Istoteq + Idtoteq;
12804 
12805  Igtoteq_Jdxp = 0;
12807  }
12808  else
12809  { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0;
12810  gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0;
12811 
12812  gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0;
12813  }
12814 
12815  // v3.1 wanh added for RF
12816  if (rgateMod == 2)
12817  T0 = vges - vgs;
12818  else if (rgateMod == 3)
12819  T0 = vgms - vgs;
12820  if (rgateMod > 1)
12821  {
12822  gcrgd_jac = gcrgs * T0;
12823  gcrgg_jac = gcrgg * T0;
12824  gcrgs_jac = gcrgd * T0;
12825  gcrgb_jac = gcrgb * T0;
12826 
12827  // ceqgcrg = -(gcrgg_jac * vgd - gcrgs_jac * vds + gcrgb_jac * vbd);
12828  ceqgcrg_Jdxp = 0.0;
12829  ceqgcrg = 0.0;
12830  ceqgcrg_Jdxp = -(gcrgg_jac * (vgd - vgd_orig) -
12831  gcrgs_jac * (vds - vds_orig) +
12832  gcrgb_jac * (vbd - vbd_orig));
12833 
12834  gcrgg_jac -= gcrg;
12835  gcrg_jac = gcrg;
12836  }
12837  else
12838  {
12840  = gcrgs_jac = gcrgb_jac = 0.0;
12841  }
12842  // v3.1 wanh added for RF end
12843 
12844  } // end of soimod<0
12845 
12846  return bsuccess;
12847 }
12848 
12849 //-----------------------------------------------------------------------------
12850 // Function : Instance::B3SOIlimit
12851 // Purpose : Limits the per-iteration change of absolute voltage values
12852 //
12853 // Special Notes :
12854 // Scope : public
12855 // Creator : Dave Shirley
12856 // Creation Date : 05/20/04
12857 //-----------------------------------------------------------------------------
12858 double Instance::B3SOIlimit(double vnew, double vold,
12859  double limit, int *check)
12860 {
12861  double T0, T1;
12862  T0 = vnew - vold;
12863  T1 = fabs(T0);
12864  if (T1 > limit)
12865  {
12866  if (T0 > 0.0)
12867  {
12868  vnew = vold + limit;
12869  }
12870  else
12871  {
12872  vnew = vold - limit;
12873  }
12874  *check = 1;
12875  }
12876  return vnew;
12877 }
12878 
12879 //-----------------------------------------------------------------------------
12880 // Function : Instance::setupCapacitors_oldDAE
12881 // Purpose :
12882 //
12883 // Special Notes : This was taken from updateIntermediateVars.
12884 // This function calculates capacitance *conductances*.
12885 // (C/dt terms), and also the charge variables:
12886 // qb, qg, qe, qd, qth, qgmid
12887 //
12888 // Another way of looking at this function - this is analogous
12889 // to all the capacitor-related code that gets executed
12890 // in the SPICE3 SOI device, prior to the NIintegrate
12891 // functions being called.
12892 //
12893 // In the old-dae form, this function needs to be called
12894 // before charges can be put into the state vector
12895 // (in updatePrimaryState).
12896 //
12897 // Scope : public
12898 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
12899 // Creation Date : 02/25/05
12900 //-----------------------------------------------------------------------------
12902 {
12903  bool bsuccess = true;
12904 
12905  // these are temporary local variables.
12906  double T0, T1, T2, T3, T4;
12907  double cgdo_local;
12908  double cgso_local;
12909  double ag0 = getSolverState().pdt;
12910 
12911  // ERK. 12/17/2006.
12912  // It is necessary to set ag0=0.0, because for the first time step out of
12913  // the DCOP, all the time derivatives are forced to be zero. Thus, all
12914  // their derivatives should also be zero. If it wasn't for that, then ag0
12915  // could always be pdt. (it used to be, before the -jacobian_test capability).
12916  if (!(getSolverState().dcopFlag) && getSolverState().initTranFlag && getSolverState().newtonIter==0)
12917  {
12918  ag0 = 0.0;
12919  }
12920 
12922  {
12923 
12924  T0 = vgd + DELTA_1;
12925  if (rgateMod == 3) T0 = vgmd + DELTA_1; /* v3.2 bug fix */
12926  T1 = sqrt(T0 * T0 + 4.0 * DELTA_1);
12927  T2 = 0.5 * (T0 - T1);
12928 
12929  /* v2.2.3 bug fix */
12930  T3 = wdiodCV_NoSwap * paramPtr->cgdl; /* v3.1 bug fix */
12931 
12932  T4 = sqrt(1.0 - 4.0 * T2 / paramPtr->ckappa);
12933  cgdo_local = paramPtr->cgdo + T3 - T3 * (1.0 - 1.0 / T4)
12934  * (0.5 - 0.5 * T0 / T1);
12935  qgdo = (paramPtr->cgdo + T3) * vgd - T3 * (T2
12936  + 0.5 * paramPtr->ckappa * (T4 - 1.0));
12937 
12938  if (rgateMod == 3) {
12939  qgdo = (paramPtr->cgdo + T3) * vgmd - T3 * (T2
12940  + 0.5 * paramPtr->ckappa * (T4 - 1.0));
12941  } /* v3.2 bug fix */
12942 
12943  T0 = vgs + DELTA_1;
12944  if (rgateMod == 3) T0 = vgms + DELTA_1; /* v3.2 bug fix */
12945  T1 = sqrt(T0 * T0 + 4.0 * DELTA_1);
12946  T2 = 0.5 * (T0 - T1);
12947 
12948  /* v2.2.3 bug fix */
12949  T3 = wdiosCV_NoSwap * paramPtr->cgsl; /* v3.1 bug fix */
12950 
12951  T4 = sqrt(1.0 - 4.0 * T2 / paramPtr->ckappa);
12952  cgso_local = paramPtr->cgso + T3 - T3 * (1.0 - 1.0 / T4)
12953  * (0.5 - 0.5 * T0 / T1);
12954  qgso = (paramPtr->cgso + T3) * vgs - T3 * (T2
12955  + 0.5 * paramPtr->ckappa * (T4 - 1.0));
12956 
12957  if (rgateMod == 3) {
12958  qgso = (paramPtr->cgso + T3) * vgms - T3 * (T2
12959  + 0.5 * paramPtr->ckappa * (T4 - 1.0));
12960  } /* v3.2 bug fix */
12961 
12962  if (mode > 0)
12963  {
12964 
12965  /* v3.1 wanh added for RF */
12966  if (rgateMod == 3)
12967  {
12968  gcgmgmb = (cgdo_local + cgso_local + paramPtr->cgeo) * ag0;
12969 
12970  gcgmdb = -cgdo_local * ag0;
12971  gcgmsb = -cgso_local * ag0;
12972  gcgmeb = -paramPtr->cgeo * ag0;
12973  gcdgmb = gcgmdb;
12974  gcsgmb = gcgmsb;
12975  gcegmb = gcgmeb;
12976 
12977  gcggb = cggb * ag0;
12978  gcgdb = cgdb * ag0;
12979  gcgsb = cgsb * ag0;
12980  gcgeb = 0 ;/*v3.1 wanh changed*/
12981  gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb);
12982 
12983  gcdgb = cdgb * ag0;
12984  gcegb = gcgeb; /*v3.1 wanh added*/
12985  gcsgb = -(cggb + cbgb + cdgb) * ag0 - gcegb;
12986  gcbgb = cbgb * ag0;
12987 
12988  qgd = qgdo;
12989  qgs = qgso;
12990  qge = 0; /* v3.1 wanh changed */
12991 
12992  qgme = paramPtr->cgeo * vgme;
12993  qgmid = qgdo + qgso + qgme;
12994  qgate += qge;
12995  qbody -= 0;
12996  qdrn += qde - qgd;
12997  qsub -= qgme + qse + qde;
12998  qsrc = -(qgate + qgmid + qbody + qdrn + qsub);
12999  }
13000  else
13001  {
13002  gcggb = (cggb + cgdo_local + cgso_local + paramPtr->cgeo) * ag0;
13003  gcgdb = (cgdb - cgdo_local) * ag0;
13004  gcgsb = (cgsb - cgso_local) * ag0;
13005  gcgeb = (-paramPtr->cgeo) *ag0;
13006  gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb);
13007 
13008  gcegb = (- paramPtr->cgeo) * ag0;
13009  gcdgb = (cdgb - cgdo_local) * ag0;
13010  gcsgb = -(cggb + cbgb
13011  + cdgb + cgso_local) * ag0;
13012  gcbgb = cbgb * ag0;
13013 
13014  gcdgmb = gcsgmb = gcegmb = 0.0;
13015  gcgmdb = gcgmsb = gcgmeb = 0.0;
13016 
13017  /* Lump the overlap capacitance and S/D parasitics */
13018  qgd = qgdo;
13019  qgs = qgso;
13020  qge = paramPtr->cgeo * vge;
13021  qgate += qgd + qgs + qge;
13022  qdrn += qde - qgd;
13023  qsub -= qge + qse + qde;
13024  qsrc = -(qgate + qbody + qdrn + qsub);
13025  }
13026 
13027  gcddb = (cddb + cgdo_local + gcde) * ag0;
13028  gcdsb = cdsb * ag0;
13029  gcdeb = (cdeb - gcde) * ag0;
13030  gcdT = model_.dtype * cdT * ag0;
13031 
13032  gcsdb = -(cgdb + cbdb + cddb) * ag0;
13033  gcssb = (cgso_local + gcse - (cgsb + cbsb + cdsb)) * ag0;
13034  gcseb = -(gcse + cbeb + cdeb + ceeb) * ag0;
13035  gcsT = - model_.dtype * (cgT + cbT + cdT + ceT) * ag0;
13036 
13037  gcgT = model_.dtype * cgT * ag0;
13038 
13039  gcbdb = cbdb * ag0;
13040  gcbsb = cbsb * ag0;
13041  gcbeb = cbeb * ag0;
13042  gcbT = model_.dtype * cbT * ag0;
13043 
13044  gcedb = (- gcde) * ag0;
13045  gcesb = (- gcse) * ag0;
13046  gceeb = (gcse + gcde +
13047  ceeb + paramPtr->cgeo) * ag0;
13048 
13049  gceT = model_.dtype * ceT * ag0;
13050 
13051  gcTt = paramPtr->cth * ag0;
13052 
13053  sxpart = 0.6;
13054  dxpart = 0.4;
13055 
13056 
13057  /* v3.1 wanh moved the following original code ahead */
13058  /* Lump the overlap capacitance and S/D parasitics */
13059  /* qgd = qgdo;
13060  qgs = qgso;
13061  qge = paramPtr->cgeo * vge;
13062  qgate += qgd + qgs + qge;
13063  qdrn += qde - qgd;
13064  qsub -= qge + qse + qde;
13065  qsrc = -(qgate + qbody + qdrn + qsub);
13066  */
13067  /* v3.1 wanh end */
13068 
13069  }
13070 
13071  else
13072  {
13073  if (rgateMod == 3)
13074  {
13075  gcgmgmb = (cgdo_local + cgso_local + paramPtr->cgeo) * ag0;
13076  gcgmdb = -cgdo_local * ag0;
13077  gcgmsb = -cgso_local * ag0;
13078  gcgmeb = -paramPtr->cgeo * ag0;
13079  gcdgmb = gcgmdb;
13080  gcsgmb = gcgmsb;
13081  gcegmb = gcgmeb;
13082 
13083  gcggb = cggb * ag0;
13084  gcgsb = cgdb * ag0;
13085  gcgdb = cgsb * ag0;
13086  gcgeb = 0; /* v3.1 wanh changed */
13087  gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); /* v3.1 wanh added gcgeb */
13088 
13089  gcsgb = cdgb * ag0;
13090  gcegb = gcgeb; /* v3.1 wanh added */
13091  gcdgb = -(cggb + cbgb
13092  + cdgb) * ag0 - gcegb; /*v3.1 wanh added gcegb*/
13093  gcbgb = cbgb * ag0;
13094 
13095  qgd = qgdo;
13096  qgs = qgso;
13097  qge = 0; /* v3.1 wanh changed */
13098  qgme = paramPtr->cgeo * vgme;
13099  qgmid = qgdo + qgso + qgme;
13100  qgate += qge;
13101  qbody -= 0;
13102  qsrc = qdrn - qgs + qse;
13103  qsub -= qgme + qse + qde;
13104  qdrn = -(qgate + qgmid + qbody + qsrc + qsub);
13105  }
13106  else
13107  {
13108  gcggb = (cggb + cgdo_local + cgso_local + paramPtr->cgeo) * ag0;
13109  gcgdb = (cgsb - cgdo_local) * ag0;
13110  gcgsb = (cgdb - cgso_local) * ag0;
13111  gcgeb = (- paramPtr->cgeo) * ag0;
13112  gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); /*wanh added gcgbb*/
13113 
13114  gcegb = gcgeb; /* v3.1 wanh added */
13115  gcsgb = (cdgb - cgso_local) * ag0;
13116  gcdgb = -(cggb + cbgb + cdgb + cgdo_local) * ag0;
13117  gcdgmb = gcsgmb = gcegmb = 0.0;
13118  gcgmdb = gcgmsb = gcgmeb = 0.0;
13119 
13120  /* Lump the overlap capacitance and S/D parasitics */
13121  qgd = qgdo;
13122  qgs = qgso;
13123  qge = paramPtr->cgeo * vge;
13124  qgate += qgd + qgs + qge;
13125  qsrc = qdrn - qgs + qse;
13126  qsub -= qge + qse + qde;
13127  qdrn = -(qgate + qbody + qsrc + qsub);
13128  }
13129 
13130  gcssb = (cddb + cgso_local + gcse) * ag0;
13131  gcsdb = cdsb * ag0;
13132  gcseb = (cdeb - gcse) * ag0;
13133  gcsT = model_.dtype * cdT * ag0;
13134  gcdsb = -(cgdb + cbdb + cddb) * ag0;
13135  gcddb = (cgdo_local + gcde - (cgsb + cbsb
13136  + cdsb)) * ag0;
13137  gcdeb = -(gcde + cbeb + cdeb
13138  + ceeb) * ag0;
13139  gcdT = - model_.dtype * (cgT + cbT
13140  + cdT + ceT) * ag0;
13141 
13142  gcgT = model_.dtype * cgT * ag0;
13143 
13144  gcbgb = cbgb * ag0;
13145  gcbsb = cbdb * ag0;
13146  gcbdb = cbsb * ag0;
13147  gcbeb = cbeb * ag0;
13148  gcbT = model_.dtype * cbT * ag0;
13149 
13150  /* gcegb = (-paramPtr->cgeo) * ag0; V3.2 bug fix */
13151  gcesb = (- gcse) * ag0;
13152  gcedb = (- gcde) * ag0;
13153  gceeb = (ceeb + paramPtr->cgeo +
13154  gcse + gcde) * ag0;
13155  gceT = model_.dtype * ceT * ag0;
13156 
13157  gcTt = paramPtr->cth * ag0;
13158 
13159  dxpart = 0.6;
13160  sxpart = 0.4;
13161 
13162 
13163  /* v3.1 wanh moved the following code ahead */
13164  /* Lump the overlap capacitance */
13165  /*
13166  qgd = qgdo;
13167  gs = qgso;
13168  qge = paramPtr->cgeo * vge;
13169  qgate += qgd + qgs + qge;
13170  qsrc = qdrn - qgs + qse;
13171  qsub -= qge + qse + qde;
13172  qdrn = -(qgate + qbody + qsrc + qsub);
13173  */
13174  /* v3.1 wanh end*/
13175 
13176 
13177  }
13178 
13179  cgdo = cgdo_local;
13180  cgso = cgso_local;
13181 
13182  qe = qsub;
13183  qg = qgate;
13184  qd = qdrn;
13185  qb = qbody;
13186  if ((model_.shMod == 1) && (rth0!=0.0))
13187  qth = paramPtr->cth * delTemp;
13188  if (rgateMod == 3)
13189  qgmid = qgmid;
13190  /* 3.1 bug fix */
13191  }
13192  else // !chargeComputationNeeded
13193  {
13194  // initialize some stuff to 0
13195  // Original spice comment: v3.1 wanh added for RF
13196  gcgmgmb = gcgmdb = gcgmsb = gcgmeb = 0.0;
13197  gcdgmb = gcsgmb = gcegmb = 0.0;
13198  gcgbb = 0.0;
13199  }
13200  // END TVR ADDITION
13201 
13202  return bsuccess;
13203 }
13204 
13205 
13206 //-----------------------------------------------------------------------------
13207 // Function : Instance::updatePrimaryState
13208 //
13209 // Purpose : This function sets up the primaray state variables into
13210 // the primary state vector.
13211 //
13212 // Special Notes :
13213 // Scope : public
13214 // Creator : Dave Shirley
13215 // Creation Date : 05/20/04
13216 //-----------------------------------------------------------------------------
13218 {
13219  bool bsuccess = true;
13220  double * staVec = extData.nextStaVectorRawPtr;
13221  double * stoVec = extData.nextStoVectorRawPtr;
13222 
13223  bsuccess = updateIntermediateVars ();
13224 
13225  // voltage drops:
13226  stoVec[li_store_vbd] = vbd;
13227  stoVec[li_store_vbs] = vbs;
13228  stoVec[li_store_vgs] = vgs;
13229  stoVec[li_store_vds] = vds;
13230  stoVec[li_store_ves] = ves;
13231  stoVec[li_store_vps] = vps;
13232 
13233  stoVec[li_store_vgp] = Vgp;
13234  stoVec[li_store_vd] = Vdp;
13235  stoVec[li_store_vs] = Vsp;
13236  stoVec[li_store_vp] = Vp;
13237  stoVec[li_store_ve] = Ve;
13238  stoVec[li_store_vg] = Vg;
13239  stoVec[li_store_vgm] = Vgm;
13240  stoVec[li_store_deltemp] = delTemp;
13241 
13242  stoVec[li_store_vges] = vges;
13243  stoVec[li_store_vgms] = vgms;
13244 
13245  // intrinsic capacitors:
13246  staVec[li_state_qb] = qb;
13247  staVec[li_state_qg] = qg;
13248  staVec[li_state_qd] = qd;
13249  staVec[li_state_qe] = qe;
13250  staVec[li_state_qgmid] = qgmid;
13251  staVec[li_state_qth] = qth;
13252 
13253  // if this is the first newton step of the first time step
13254  // of the transient simulation, we need to enforce that the
13255  // time derivatives w.r.t. charge are zero. This is to maintain 3f5
13256  // compatibility. ERK.
13257 
13258  // Note: I think this kind of thing is enforced (or should be enforced,
13259  // anyway) at the time integration level. So I'm not sure this step is
13260  // really needed, at least for new-DAE. Derivatives out of the DCOP
13261  // are supposed to be zero at the first newton step.
13262 
13263  if (!(getSolverState().dcopFlag) && getSolverState().initTranFlag && getSolverState().newtonIter==0)
13264  {
13265  // re-set the state vector pointer that we are using to the "current"
13266  // pointer, rather than the "next" pointer.
13267  double * currStaVec = extData.currStaVectorRawPtr;
13268 
13269  // intrinsic capacitors:
13270  currStaVec[li_state_qb] = qb;
13271  currStaVec[li_state_qg] = qg;
13272  currStaVec[li_state_qd] = qd;
13273  currStaVec[li_state_qe] = qe;
13274  currStaVec[li_state_qgmid] = qgmid;
13275  currStaVec[li_state_qth] = qth;
13276  }
13277 
13278  return bsuccess;
13279 }
13280 
13281 //-----------------------------------------------------------------------------
13282 // Function : Instance::loadDAEQVector
13283 //
13284 // Purpose : Loads the Q-vector contributions for a single
13285 // voltage source instance.
13286 //
13287 // Special Notes : The "Q" vector is part of a standard DAE formalism in
13288 // which the system of equations is represented as:
13289 //
13290 // f(x) = dQ(x)/dt + F(x) + B(t) = 0
13291 //
13292 // Scope : public
13293 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
13294 // Creation Date : 02/19/05
13295 //-----------------------------------------------------------------------------
13297 {
13299 
13300  double * qVec = extData.daeQVectorRawPtr;
13301  double * dQdxdVpPtr = extData.dQdxdVpVectorRawPtr;
13302 
13303  double Coef_body=0.0;
13304  double Coef_extBody=0.0;
13305  double Coef_gate=0.0;
13306  double Coef_gatePrime=0.0;
13307  double Coef_gateMid=0.0;
13308  double Coef_drainPrime=0.0;
13309  double Coef_sourcePrime=0.0;
13310  double Coef_substrate=0.0;
13311  double Coef_temp=0.0;
13312 
13313  if (soiMod != 2)
13314  {
13315  Coef_body -= (model_.dtype*(Qeqqb))* numberParallel;
13316  }
13317 
13318  Coef_gatePrime -= (model_.dtype*(Qeqqg))* numberParallel;
13319 
13320  Coef_drainPrime += (model_.dtype*(-Qeqqd)) * numberParallel;
13321 
13322  Coef_sourcePrime += ( + model_.dtype*(+ Qeqqg + Qeqqb
13323  + Qeqqd + Qeqqe + Qeqqgmid)) * numberParallel;
13324 
13325  Coef_substrate -= model_.dtype*Qeqqe * numberParallel;
13326 
13327  if (rgateMod == 3)
13328  {
13329  Coef_gateMid -= model_.dtype*(Qeqqgmid) * numberParallel;
13330  }
13331 
13332  if (selfheat)
13333  {
13334  Coef_temp -= (Qeqqth) * numberParallel;
13335  }
13336 
13337  ////////////////////////////////////////////////////////////////////////
13338  // Now place all the calculated values in the Q vector.
13339 
13340  if(li_Body != -1)
13341  {
13342  qVec[li_Body ] -= Coef_body;
13343  }
13344  if(li_ExtBody != -1)
13345  {
13346  qVec[li_ExtBody ] -= Coef_extBody;
13347  }
13348 
13349  qVec[li_Gate ] -= Coef_gate;
13350  qVec[li_GatePrime ] -= Coef_gatePrime;
13351  qVec[li_GateMid ] -= Coef_gateMid;
13352  qVec[li_DrainPrime ] -= Coef_drainPrime;
13353  qVec[li_SourcePrime] -= Coef_sourcePrime;
13354  qVec[li_Substrate ] -= Coef_substrate;
13355 
13356  if(li_Temperature != -1)
13357  {
13358  qVec[li_Temperature] -= Coef_temp;
13359  }
13360 
13361  if( loadLeadCurrent )
13362  {
13363  double * storeLeadQ = extData.storeLeadCurrQCompRawPtr;
13364  storeLeadQ[li_store_dev_id] = 0.0;
13365  storeLeadQ[li_store_dev_ig] = -Coef_gate;
13366  storeLeadQ[li_store_dev_is] = 0.0;
13367  storeLeadQ[li_store_dev_ie] = -Coef_substrate;
13368  if(li_Body != -1)
13369  {
13370  storeLeadQ[li_store_dev_ib] = -Coef_body;
13371  }
13372  }
13373 
13374  ////////////////////////////////////////////////////////////////////////
13375  // Voltage limiting section:
13376  double Coef_body_Jdxp = 0.0;
13377  double Coef_extBody_Jdxp = 0.0;
13378  double Coef_gate_Jdxp = 0.0;
13379  double Coef_gatePrime_Jdxp = 0.0;
13380  double Coef_gateMid_Jdxp = 0.0;
13381  double Coef_drainPrime_Jdxp = 0.0;
13382  double Coef_sourcePrime_Jdxp = 0.0;
13383  double Coef_substrate_Jdxp = 0.0;
13384  double Coef_temp_Jdxp = 0.0;
13385 
13387  {
13388  if (soiMod != 2)
13389  {
13390  Coef_body_Jdxp -=
13392  }
13393 
13394  Coef_gatePrime_Jdxp -=
13396 
13397  Coef_drainPrime_Jdxp +=
13399 
13400  Coef_sourcePrime_Jdxp += (+model_.dtype*(Qeqqg_Jdxp + Qeqqb_Jdxp
13402  ) * numberParallel;
13403 
13404  Coef_substrate_Jdxp -= model_.dtype*Qeqqe_Jdxp * numberParallel;
13405 
13406  if (rgateMod == 3)
13407  {
13408  Coef_gateMid_Jdxp -=
13409  model_.dtype*(Qeqqgmid_Jdxp) * numberParallel;
13410  }
13411 
13412  if (selfheat)
13413  {
13414  Coef_temp_Jdxp -= (Qeqqth_Jdxp ) * numberParallel;
13415  }
13416 
13417  if(li_Body != -1)
13418  {
13419  dQdxdVpPtr[li_Body ] += Coef_body_Jdxp;
13420  }
13421  if(li_ExtBody != -1)
13422  {
13423  dQdxdVpPtr[li_ExtBody ] += Coef_extBody_Jdxp;
13424  }
13425  dQdxdVpPtr[li_Gate ] += Coef_gate_Jdxp;
13426  dQdxdVpPtr[li_GatePrime ] += Coef_gatePrime_Jdxp;
13427  dQdxdVpPtr[li_GateMid ] += Coef_gateMid_Jdxp;
13428  dQdxdVpPtr[li_DrainPrime ] += Coef_drainPrime_Jdxp;
13429  dQdxdVpPtr[li_SourcePrime] += Coef_sourcePrime_Jdxp;
13430  dQdxdVpPtr[li_Substrate ] += Coef_substrate_Jdxp;
13431 
13432  if(li_Temperature != -1)
13433  {
13434  dQdxdVpPtr[li_Temperature] += Coef_temp_Jdxp;
13435  }
13436  }
13437 
13438  return true;
13439 }
13440 
13441 //-----------------------------------------------------------------------------
13442 // Function : Instance::loadDAEFVector
13443 //
13444 // Purpose : Loads the F-vector contributions for a single
13445 // B3SOI instance.
13446 //
13447 // Special Notes :
13448 //
13449 // Scope : public
13450 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
13451 // Creation Date : 02/19/05
13452 //-----------------------------------------------------------------------------
13454 {
13455  double * fVec = extData.daeFVectorRawPtr;
13456  double * dFdxdVpPtr = extData.dFdxdVpVectorRawPtr;
13457 
13458 #ifdef Xyce_DEBUG_DEVICE
13459  if (getDeviceOptions().debugLevel > 0 && getSolverState().debugTimeFlag)
13460  {
13461  Xyce::dout() << subsection_divider << std::endl;
13462  Xyce::dout() << " Instance::loadDAEFVector" << std::endl;
13463  Xyce::dout() << " name = " << getName() <<std::endl;
13464  Xyce::dout().width(28); Xyce::dout().precision(20); Xyce::dout().setf(std::ios::scientific);
13465  Xyce::dout() << " " << std::endl;
13466  }
13467 #endif
13468 
13469  double Coef_body=0.0;
13470  double Coef_extBody=0.0;
13471  double Coef_gate=0.0;
13472  double Coef_gatePrime=0.0;
13473  double Coef_gateMid=0.0;
13474  double Coef_drain=0.0;
13475  double Coef_drainPrime=0.0;
13476  double Coef_source=0.0;
13477  double Coef_sourcePrime=0.0;
13478  double Coef_substrate=0.0;
13479  double Coef_temp=0.0;
13480 
13481  Gmin = getDeviceOptions().gmin * 1e-6;
13482  geltd = grgeltd;
13483 
13484  // I have elected to add in the Gmin-based Jdxp terms right here.
13485  // In adding them, I've made use of the fact that whether we need voltage
13486  // limiting or not, we have to add Gmin*somedrop. If we need voltage
13487  // limiting, we have to add in Gmin*(somedrop-somedrop_orig) with the
13488  // opposite sign. I've simplified that down to the single term that
13489  // remains, which is correct even if voltage limiting is not needed
13490  // --- TVR
13491 
13492  double iGmin_bs = model_.dtype*(Gmin*vbs_orig);
13493  double iGmin_gd = model_.dtype*(Gmin*vgd_orig);
13494 
13495  if (soiMod != 2)
13496  {
13497  Coef_body -= (model_.dtype*(ceqbody)
13498  + iGmin_bs)* numberParallel;
13499  }
13500 
13501  Coef_gatePrime -= (model_.dtype*(ceqgate - ceqgcrg)
13502  + Igtoteq + iGmin_gd)* numberParallel;
13503 
13504  Coef_drainPrime += (model_.dtype*(ceqbd) - cdreq + Idtoteq
13505  + Idrain + iGmin_gd) * numberParallel;
13506 
13507  Coef_sourcePrime += (cdreq
13508  + model_.dtype*(ceqbs)
13509  + Istoteq + Isource + iGmin_bs) * numberParallel;
13510 
13511  if (rgateMod == 2)
13512  {
13513  Coef_gate -= model_.dtype*ceqgcrg * numberParallel;
13514  }
13515  else if (rgateMod == 3)
13516  {
13517  Coef_gateMid -= model_.dtype*(ceqgcrg) * numberParallel;
13518  }
13519 
13520  if (bodyMod == 1)
13521  {
13522  Coef_extBody += model_.dtype*ceqbodcon * numberParallel;
13523  }
13524 
13525  if (selfheat)
13526  {
13527  Coef_temp -= (ceqth + Ith) * numberParallel;
13528  }
13529 
13530  ////////////////////////////////////////////////////////////////////////
13531  // This next section deals with linear resistor currents (mostly) that
13532  // would not be part of the spice3f5 RHS load.
13533  //
13534  // These include the source and drain load resistors, the body tie
13535  // resistor and the various options for gate resistors.
13536  //
13537  // Isource and Idrain correspond to the linear load resistors.
13538 
13539  if (sNodePrime == 1) Coef_source -= Isource * numberParallel;
13540  if (dNodePrime == 1) Coef_drain -= Idrain * numberParallel;
13541 
13542  // Note: extra body nodes were already handled, above.
13543 
13544  // Handle extra gate nodes, if they exist.
13545  // rgateMod==0 no gate resistor.
13546  // rgateMod==1 linear gate resistor
13547  // rgateMod==2 nonlinear gate resistor
13548  // rgateMod==3 2 gate resistors, in series.
13549  //
13550  if (rgateMod > 0)
13551  {
13552  Coef_gate -= Igate * numberParallel;
13553  if (rgateMod == 3)
13554  {
13555  Coef_gateMid -= (IgateMid - Igate) * numberParallel;
13556  Coef_gatePrime += IgateMid * numberParallel;
13557  }
13558  else
13559  {
13560  Coef_gatePrime += Igate * numberParallel;
13561  }
13562  }
13563 
13564  // Now place all the calculated values in the RHS vector.
13565  if(li_Body != -1)
13566  {
13567  fVec[li_Body ] -= Coef_body;
13568  }
13569  if(li_ExtBody != -1)
13570  {
13571  fVec[li_ExtBody ] -= Coef_extBody;
13572  }
13573  fVec[li_Gate ] -= Coef_gate;
13574  fVec[li_GatePrime ] -= Coef_gatePrime;
13575  fVec[li_GateMid ] -= Coef_gateMid;
13576  fVec[li_Drain ] -= Coef_drain;
13577  fVec[li_DrainPrime ] -= Coef_drainPrime;
13578  fVec[li_Source ] -= Coef_source;
13579  fVec[li_SourcePrime] -= Coef_sourcePrime;
13580  fVec[li_Substrate ] -= Coef_substrate;
13581 
13582  if(li_Temperature != -1)
13583  {
13584  fVec[li_Temperature] -= Coef_temp;
13585  }
13586 
13587  if( loadLeadCurrent )
13588  {
13589  double * storeLeadF = extData.nextStoVectorRawPtr;
13590  storeLeadF[li_store_dev_id] = -Coef_drain;
13591  storeLeadF[li_store_dev_ig] = -Coef_gate;
13592  storeLeadF[li_store_dev_is] = -Coef_source;
13593  storeLeadF[li_store_dev_ie] = -Coef_substrate;
13594  if(li_Body != -1)
13595  {
13596  storeLeadF[li_store_dev_ib] = -Coef_body;
13597  }
13598  else
13599  {
13600  storeLeadF[li_store_dev_ib] = 0.0;
13601  }
13602  }
13603 
13605  {
13606  if ( icVDSGiven )
13607  {
13608  if ( icVDSGiven )
13609  {
13610  double coef = (extData.nextSolVectorRawPtr)[li_Ids];
13611  fVec[li_Drain] += coef;
13612  fVec[li_Source] += -coef;
13613  if( loadLeadCurrent )
13614  {
13615  double * storeLeadF = extData.nextStoVectorRawPtr;
13616  storeLeadF[li_store_dev_id] = coef;
13617  storeLeadF[li_store_dev_is] = coef;
13618  }
13619  double cVs = (extData.nextSolVectorRawPtr)[li_Source];
13620  double cVd = (extData.nextSolVectorRawPtr)[li_Drain];
13621  fVec[li_Ids] += (cVd - cVs - icVDS);
13622  }
13623  if ( icVGSGiven )
13624  {
13625  double coef = (extData.nextSolVectorRawPtr)[li_Igs];
13626  fVec[li_Gate] += coef;
13627  fVec[li_Source] += -coef;
13628  if( loadLeadCurrent )
13629  {
13630  double * storeLeadF = extData.nextStoVectorRawPtr;
13631  storeLeadF[li_store_dev_ig] = coef;
13632  storeLeadF[li_store_dev_is] = coef;
13633  }
13634  double cVs = (extData.nextSolVectorRawPtr)[li_Source];
13635  double cVg = (extData.nextSolVectorRawPtr)[li_Gate];
13636  fVec[li_Igs] += (cVg - cVs - icVGS);
13637  }
13638  if ( icVBSGiven )
13639  {
13640  double coef = (extData.nextSolVectorRawPtr)[li_Ibs];
13641  fVec[li_Body] += coef;
13642  fVec[li_Source] += -coef;
13643  if( loadLeadCurrent )
13644  {
13645  double * storeLeadF = extData.nextStoVectorRawPtr;
13646  storeLeadF[li_store_dev_ib] = coef;
13647  storeLeadF[li_store_dev_is] = coef;
13648  }
13649  double cVs = (extData.nextSolVectorRawPtr)[li_Source];
13650  double cVb = (extData.nextSolVectorRawPtr)[li_Body];
13651  fVec[li_Ibs] += (cVb - cVs - icVBS);
13652  }
13653  if ( icVESGiven )
13654  {
13655  double coef = (extData.nextSolVectorRawPtr)[li_Ies];
13656  fVec[li_Substrate] += coef;
13657  fVec[li_Source] += -coef;
13658  if( loadLeadCurrent )
13659  {
13660  double * storeLeadF = extData.nextStoVectorRawPtr;
13661  storeLeadF[li_store_dev_ie] = coef;
13662  storeLeadF[li_store_dev_is] = coef;
13663  }
13664  double cVs = (extData.nextSolVectorRawPtr)[li_Source];
13665  double cVe = (extData.nextSolVectorRawPtr)[li_Substrate];
13666  fVec[li_Ies] += (cVe - cVs - icVES);
13667  }
13668  if ( icVPSGiven )
13669  {
13670  double coef = (extData.nextSolVectorRawPtr)[li_Ips];
13671  fVec[li_ExtBody] += coef;
13672  fVec[li_Source] += -coef;
13673  if( loadLeadCurrent )
13674  {
13675  double * storeLeadF = extData.nextStoVectorRawPtr;
13676  // this may need a separate store var if the internal and external body
13677  // nodes are not just connected by a resistor
13678  storeLeadF[li_store_dev_ib] = coef;
13679  storeLeadF[li_store_dev_is] = coef;
13680  }
13681  double cVs = (extData.nextSolVectorRawPtr)[li_Source];
13682  double cVp = (extData.nextSolVectorRawPtr)[li_ExtBody];
13683  fVec[li_Ies] += (cVp - cVs - icVPS);
13684  }
13685  }
13686  }
13687 
13688  // Set up the Jdxp vector:
13689  double Coef_body_Jdxp = 0.0;
13690  double Coef_extBody_Jdxp = 0.0;
13691  double Coef_gate_Jdxp = 0.0;
13692  double Coef_gatePrime_Jdxp = 0.0;
13693  double Coef_gateMid_Jdxp = 0.0;
13694  double Coef_drain_Jdxp = 0.0;
13695  double Coef_drainPrime_Jdxp = 0.0;
13696  double Coef_source_Jdxp = 0.0;
13697  double Coef_sourcePrime_Jdxp = 0.0;
13698  double Coef_substrate_Jdxp = 0.0;
13699  double Coef_temp_Jdxp = 0.0;
13700 
13701  double iGmin_bs_Jdxp = model_.dtype*Gmin*(vbs-vbs_orig);
13702  double iGmin_gd_Jdxp = model_.dtype*Gmin*(vgd-vgd_orig);
13703 
13705  {
13706  if (soiMod != 2)
13707  {
13708  Coef_body_Jdxp -=
13710  - iGmin_bs_Jdxp)* numberParallel;
13711  }
13712 
13713  Coef_gatePrime_Jdxp -=
13715  + Igtoteq_Jdxp - iGmin_gd_Jdxp)* numberParallel;
13716 
13717  Coef_drainPrime_Jdxp +=
13720  + Idrain_Jdxp - iGmin_gd_Jdxp) * numberParallel;
13721 
13722  Coef_sourcePrime_Jdxp += (cdreq_Jdxp
13723  + model_.dtype*(ceqbs_Jdxp)
13724  + Istoteq_Jdxp
13725  + Isource_Jdxp - iGmin_bs_Jdxp
13726  ) * numberParallel;
13727 
13728  Coef_substrate_Jdxp -= model_.dtype*ceqqe_Jdxp * numberParallel;
13729 
13730  if (rgateMod == 2)
13731  {
13732  Coef_gate_Jdxp -=
13734  }
13735  else if (rgateMod == 3)
13736  {
13737  Coef_gateMid_Jdxp -=
13738  model_.dtype*(ceqgcrg_Jdxp) * numberParallel;
13739  }
13740 
13741  if (bodyMod == 1)
13742  {
13743  Coef_extBody_Jdxp += model_.dtype*ceqbodcon_Jdxp * numberParallel;
13744  }
13745 
13746  if (selfheat)
13747  {
13748  Coef_temp_Jdxp -= ( ceqth_Jdxp ) * numberParallel;
13749  }
13750 
13751  if (sNodePrime == 1) Coef_source_Jdxp -= Isource_Jdxp * numberParallel;
13752  if (dNodePrime == 1) Coef_drain_Jdxp -= Idrain_Jdxp * numberParallel;
13753 
13754  if (rgateMod > 0)
13755  {
13756  Coef_gate_Jdxp -= Igate_Jdxp * numberParallel;
13757  if (rgateMod == 3)
13758  {
13759  Coef_gateMid_Jdxp -= (IgateMid_Jdxp - Igate_Jdxp) * numberParallel;
13760  Coef_gatePrime_Jdxp += IgateMid_Jdxp * numberParallel;
13761  }
13762  else
13763  {
13764  Coef_gatePrime_Jdxp += Igate_Jdxp * numberParallel;
13765  }
13766  }
13767 
13768  if(li_Body != -1)
13769  {
13770  dFdxdVpPtr[li_Body ] += Coef_body_Jdxp;
13771  }
13772  if(li_ExtBody != -1)
13773  {
13774  dFdxdVpPtr[li_ExtBody ] += Coef_extBody_Jdxp;
13775  }
13776  dFdxdVpPtr[li_Gate ] += Coef_gate_Jdxp;
13777  dFdxdVpPtr[li_GatePrime ] += Coef_gatePrime_Jdxp;
13778  dFdxdVpPtr[li_GateMid ] += Coef_gateMid_Jdxp;
13779  dFdxdVpPtr[li_Drain ] += Coef_drain_Jdxp;
13780  dFdxdVpPtr[li_DrainPrime ] += Coef_drainPrime_Jdxp;
13781  dFdxdVpPtr[li_Source ] += Coef_source_Jdxp;
13782  dFdxdVpPtr[li_SourcePrime] += Coef_sourcePrime_Jdxp;
13783  dFdxdVpPtr[li_Substrate ] += Coef_substrate_Jdxp;
13784 
13785  if(li_Temperature != -1)
13786  {
13787  dFdxdVpPtr[li_Temperature] += Coef_temp_Jdxp;
13788  }
13789  }
13790 
13791  return true;
13792 }
13793 
13794 //-----------------------------------------------------------------------------
13795 // Function : Instance::setupCapacitors_newDAE
13796 // Purpose :
13797 //
13798 // Special Notes : This function is identical to setupCapacitors_oldDAE,
13799 // except that in that function, capacitance
13800 // *conductances*. (C/dt terms) are set up, whereas in
13801 // this function, just capacitances (C).
13802 //
13803 // As a result, a lot of gc* variables have been replaced
13804 // with a lot of CAPc* variables. Also, ag0 isn't used
13805 // in this function, whereas it is used in the old-DAE
13806 // version.
13807 //
13808 // This function also sets up the charge variables:
13809 // qb, qg, qe, qd, qth, qgmid
13810 //
13811 // Another way of looking at this function - this is analogous
13812 // to all the capacitor-related code that gets executed
13813 // in the SPICE3 SOI device, prior to the NIintegrate
13814 // functions being called.
13815 //
13816 // Scope : public
13817 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
13818 // Creation Date : 02/23/05
13819 //-----------------------------------------------------------------------------
13821 {
13822  // these are temporary local variables.
13823  double T0, T1, T2, T3, T4;
13824  double cgdo_local;
13825  double cgso_local;
13826 
13828  {
13829  T0 = vgd + DELTA_1;
13830  if (rgateMod == 3) T0 = vgmd + DELTA_1; /* v3.2 bug fix */
13831  T1 = sqrt(T0 * T0 + 4.0 * DELTA_1);
13832  T2 = 0.5 * (T0 - T1);
13833 
13834  /* v2.2.3 bug fix */
13835  T3 = wdiodCV_NoSwap * paramPtr->cgdl; /* v3.1 bug fix */
13836 
13837  T4 = sqrt(1.0 - 4.0 * T2 / paramPtr->ckappa);
13838  cgdo_local = paramPtr->cgdo + T3 - T3 * (1.0 - 1.0 / T4)
13839  * (0.5 - 0.5 * T0 / T1);
13840  qgdo = (paramPtr->cgdo + T3) * vgd - T3 * (T2
13841  + 0.5 * paramPtr->ckappa * (T4 - 1.0));
13842 
13843  if (rgateMod == 3) {
13844  qgdo = (paramPtr->cgdo + T3) * vgmd - T3 * (T2
13845  + 0.5 * paramPtr->ckappa * (T4 - 1.0));
13846  } /* v3.2 bug fix */
13847 
13848  T0 = vgs + DELTA_1;
13849  if (rgateMod == 3) T0 = vgms + DELTA_1; /* v3.2 bug fix */
13850  T1 = sqrt(T0 * T0 + 4.0 * DELTA_1);
13851  T2 = 0.5 * (T0 - T1);
13852 
13853  /* v2.2.3 bug fix */
13854  T3 = wdiosCV_NoSwap * paramPtr->cgsl; /* v3.1 bug fix */
13855 
13856  T4 = sqrt(1.0 - 4.0 * T2 / paramPtr->ckappa);
13857  cgso_local = paramPtr->cgso + T3 - T3 * (1.0 - 1.0 / T4)
13858  * (0.5 - 0.5 * T0 / T1);
13859  qgso = (paramPtr->cgso + T3) * vgs - T3 * (T2
13860  + 0.5 * paramPtr->ckappa * (T4 - 1.0));
13861 
13862  if (rgateMod == 3) {
13863  qgso = (paramPtr->cgso + T3) * vgms - T3 * (T2
13864  + 0.5 * paramPtr->ckappa * (T4 - 1.0));
13865  } /* v3.2 bug fix */
13866 
13867  if (mode > 0)
13868  {
13869 
13870  /* v3.1 wanh added for RF */
13871  if (rgateMod == 3)
13872  {
13873  CAPcgmgmb = (cgdo_local + cgso_local + paramPtr->cgeo);
13874 
13875  CAPcgmdb = -cgdo_local;
13876  CAPcgmsb = -cgso_local;
13877  CAPcgmeb = -paramPtr->cgeo;
13878  CAPcdgmb = CAPcgmdb;
13879  CAPcsgmb = CAPcgmsb;
13880  CAPcegmb = CAPcgmeb;
13881 
13882  CAPcggb = cggb;
13883  CAPcgdb = cgdb;
13884  CAPcgsb = cgsb;
13885  CAPcgeb = 0 ;/*v3.1 wanh changed*/
13886  CAPcgbb = -(CAPcggb + CAPcgdb + CAPcgsb + CAPcgeb);
13887 
13888  CAPcdgb = cdgb;
13889  CAPcegb = CAPcgeb; /*v3.1 wanh added*/
13890  CAPcsgb = -(cggb + cbgb + cdgb) - CAPcegb;
13891  CAPcbgb = cbgb;
13892 
13893  qgd = qgdo;
13894  qgs = qgso;
13895  qge = 0; /* v3.1 wanh changed */
13896 
13897  qgme = paramPtr->cgeo * vgme;
13898  qgmid = qgdo + qgso + qgme;
13899  qgate += qge;
13900  qbody -= 0;
13901  qdrn += qde - qgd;
13902  qsub -= qgme + qse + qde;
13903  qsrc = -(qgate + qgmid + qbody + qdrn + qsub);
13904  }
13905  else
13906  {
13907  CAPcggb = (cggb + cgdo_local + cgso_local + paramPtr->cgeo);
13908  CAPcgdb = (cgdb - cgdo_local);
13909  CAPcgsb = (cgsb - cgso_local);
13910  CAPcgeb = (-paramPtr->cgeo);
13911  CAPcgbb = -(CAPcggb + CAPcgdb + CAPcgsb + CAPcgeb);
13912 
13913  CAPcegb = (- paramPtr->cgeo);
13914  CAPcdgb = (cdgb - cgdo_local);
13915  CAPcsgb = -(cggb + cbgb
13916  + cdgb + cgso_local);
13917  CAPcbgb = cbgb;
13918 
13919  CAPcdgmb = CAPcsgmb = CAPcegmb = 0.0;
13920  CAPcgmdb = CAPcgmsb = CAPcgmeb = 0.0;
13921 
13922  /* Lump the overlap capacitance and S/D parasitics */
13923  qgd = qgdo;
13924  qgs = qgso;
13925  qge = paramPtr->cgeo * vge;
13926  qgate += qgd + qgs + qge;
13927  qdrn += qde - qgd;
13928  qsub -= qge + qse + qde;
13929  qsrc = -(qgate + qbody + qdrn + qsub);
13930  }
13931 
13932  CAPcddb = (cddb + cgdo_local + gcde);
13933  CAPcdsb = cdsb;
13934  CAPcdeb = (cdeb - gcde);
13935  CAPcdT = model_.dtype * cdT;
13936 
13937  CAPcsdb = -(cgdb + cbdb + cddb);
13938  CAPcssb = (cgso_local + gcse - (cgsb + cbsb + cdsb));
13939  CAPcseb = -(gcse + cbeb + cdeb + ceeb);
13940  CAPcsT = - model_.dtype * (cgT + cbT + cdT + ceT);
13941 
13942  CAPcgT = model_.dtype * cgT;
13943 
13944  CAPcbdb = cbdb;
13945  CAPcbsb = cbsb;
13946  CAPcbeb = cbeb;
13947  CAPcbT = model_.dtype * cbT;
13948 
13949  CAPcedb = (- gcde);
13950  CAPcesb = (- gcse);
13951  CAPceeb = (gcse + gcde +
13952  ceeb + paramPtr->cgeo);
13953 
13954  CAPceT = model_.dtype * ceT;
13955 
13956  CAPcTt = paramPtr->cth;
13957 
13958  sxpart = 0.6;
13959  dxpart = 0.4;
13960 
13961 
13962  /* v3.1 wanh moved the following original code ahead */
13963  /* Lump the overlap capacitance and S/D parasitics */
13964  /* qgd = qgdo;
13965  qgs = qgso;
13966  qge = paramPtr->cgeo * vge;
13967  qgate += qgd + qgs + qge;
13968  qdrn += qde - qgd;
13969  qsub -= qge + qse + qde;
13970  qsrc = -(qgate + qbody + qdrn + qsub);
13971  */
13972  /* v3.1 wanh end */
13973 
13974  }
13975 
13976  else
13977  {
13978  if (rgateMod == 3)
13979  {
13980  CAPcgmgmb = (cgdo_local + cgso_local + paramPtr->cgeo);
13981  CAPcgmdb = -cgdo_local;
13982  CAPcgmsb = -cgso_local;
13983  CAPcgmeb = -paramPtr->cgeo;
13984  CAPcdgmb = CAPcgmdb;
13985  CAPcsgmb = CAPcgmsb;
13986  CAPcegmb = CAPcgmeb;
13987 
13988  CAPcggb = cggb;
13989  CAPcgsb = cgdb;
13990  CAPcgdb = cgsb;
13991  CAPcgeb = 0; /* v3.1 wanh changed */
13992  CAPcgbb = -(CAPcggb + CAPcgdb + CAPcgsb + CAPcgeb); /* v3.1 wanh added gcgeb */
13993 
13994  CAPcsgb = cdgb;
13995  CAPcegb = CAPcgeb; /* v3.1 wanh added */
13996  CAPcdgb = -(cggb + cbgb
13997  + cdgb) - CAPcegb; /*v3.1 wanh added gcegb*/
13998  CAPcbgb = cbgb;
13999 
14000  qgd = qgdo;
14001  qgs = qgso;
14002  qge = 0; /* v3.1 wanh changed */
14003  qgme = paramPtr->cgeo * vgme;
14004  qgmid = qgdo + qgso + qgme;
14005  qgate += qge;
14006  qbody -= 0;
14007  qsrc = qdrn - qgs + qse;
14008  qsub -= qgme + qse + qde;
14009  qdrn = -(qgate + qgmid + qbody + qsrc + qsub);
14010  }
14011  else
14012  {
14013  CAPcggb = (cggb + cgdo_local + cgso_local + paramPtr->cgeo);
14014  CAPcgdb = (cgsb - cgdo_local);
14015  CAPcgsb = (cgdb - cgso_local);
14016  CAPcgeb = (- paramPtr->cgeo);
14017  CAPcgbb = -(CAPcggb + CAPcgdb + CAPcgsb + CAPcgeb); /*wanh added gcgbb*/
14018 
14019  CAPcegb = CAPcgeb; /* v3.1 wanh added */
14020  CAPcsgb = (cdgb - cgso_local);
14021  CAPcdgb = -(cggb + cbgb + cdgb + cgdo_local);
14022  CAPcdgmb = CAPcsgmb = CAPcegmb = 0.0;
14023  CAPcgmdb = CAPcgmsb = CAPcgmeb = 0.0;
14024 
14025  /* Lump the overlap capacitance and S/D parasitics */
14026  qgd = qgdo;
14027  qgs = qgso;
14028  qge = paramPtr->cgeo * vge;
14029  qgate += qgd + qgs + qge;
14030  qsrc = qdrn - qgs + qse;
14031  qsub -= qge + qse + qde;
14032  qdrn = -(qgate + qbody + qsrc + qsub);
14033  }
14034 
14035  CAPcssb = (cddb + cgso_local + gcse);
14036  CAPcsdb = cdsb;
14037  CAPcseb = (cdeb - gcse);
14038  CAPcsT = model_.dtype * cdT;
14039  CAPcdsb = -(cgdb + cbdb + cddb);
14040  CAPcddb = (cgdo_local + gcde - (cgsb + cbsb
14041  + cdsb));
14042  CAPcdeb = -(gcde + cbeb + cdeb + ceeb);
14043  CAPcdT = - model_.dtype * (cgT + cbT
14044  + cdT + ceT);
14045 
14046  CAPcgT = model_.dtype * cgT;
14047 
14048  CAPcbgb = cbgb;
14049  CAPcbsb = cbdb;
14050  CAPcbdb = cbsb;
14051  CAPcbeb = cbeb;
14052  CAPcbT = model_.dtype * cbT;
14053 
14054  /* CAPcegb = (-paramPtr->cgeo); V3.2 bug fix */
14055  CAPcesb = (- gcse);
14056  CAPcedb = (- gcde);
14057  CAPceeb = (ceeb + paramPtr->cgeo + gcse + gcde);
14058  CAPceT = model_.dtype * ceT;
14059 
14060  CAPcTt = paramPtr->cth;
14061 
14062  dxpart = 0.6;
14063  sxpart = 0.4;
14064 
14065 
14066  /* v3.1 wanh moved the following code ahead */
14067  /* Lump the overlap capacitance */
14068  /*
14069  qgd = qgdo;
14070  gs = qgso;
14071  qge = paramPtr->cgeo * vge;
14072  qgate += qgd + qgs + qge;
14073  qsrc = qdrn - qgs + qse;
14074  qsub -= qge + qse + qde;
14075  qdrn = -(qgate + qbody + qsrc + qsub);
14076  */
14077  /* v3.1 wanh end*/
14078 
14079 
14080  }
14081 
14082  cgdo = cgdo_local;
14083  cgso = cgso_local;
14084 
14085  qe = qsub;
14086  qg = qgate;
14087  qd = qdrn;
14088  qb = qbody;
14089  if ((model_.shMod == 1) && (rth0!=0.0))
14090  qth = paramPtr->cth * delTemp;
14091  if (rgateMod == 3)
14092  qgmid = qgmid;
14093  /* 3.1 bug fix */
14094  }
14095  else
14096  {
14097  // initialize some stuff to 0
14098  // Original spice comment: v3.1 wanh added for RF
14099  CAPcgmgmb = CAPcgmdb = CAPcgmsb = CAPcgmeb = 0.0;
14100  CAPcdgmb = CAPcsgmb = CAPcegmb = 0.0;
14101  CAPcgbb = 0.0;
14102  }
14103  // END TVR ADDITION
14104 
14105  return true;
14106 }
14107 
14108 //-----------------------------------------------------------------------------
14109 // Function : Instance::auxChargeCalculations
14110 // Purpose :
14111 //
14112 // Special Notes :
14113 // Another way of looking at this function - this is analogous
14114 // to the capacitor-related code that gets executed in the SPICE3
14115 // SOI device, after the NIintegrate functions have been called.
14116 //
14117 // About all this function really does is set up some
14118 // voltlim terms.
14119 // It really is only here to provide capacitor-related
14120 // voltage limiter terms for the QVector load.
14121 //
14122 // Scope : public
14123 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
14124 // Creation Date : 02/23/05
14125 //-----------------------------------------------------------------------------
14127 {
14128  bool bsuccess = true;
14129  double vgb_orig, vgmb_orig, veb_orig;
14130 
14132  {
14133  sxpart = (1.0 - (dxpart = (mode > 0) ? 0.4 : 0.6));
14134  }
14135  else // ChargeComputation is needed
14136  {
14137  Qeqqg = qg;
14138  Qeqqb = qb;
14139  Qeqqd = qd;
14140  Qeqqe = qe;
14141  Qeqqth = qth;
14142  Qeqqgmid = qgmid;
14143 
14144  // Note - in the SPICE version of the SOI, the variables B3SOIcd and
14145  // B3SOIcb contain capacitor current contributions. So, one might
14146  // think that equivalent charge variables should be set up here
14147  // (Qcd, Qcb, etc). This isn't necessary, it turns out. cd and
14148  // cb are only used in SPICE's convergence and bypass analysis, and
14149  // are not ever loaded (directly or indirectly) into the SPICE
14150  // rhs vector.
14151 
14152  // evaluate equivalent charge current
14153  vgb_orig = vgs_orig - vbs_orig;
14154  vgmb_orig = vgms_orig - vbs_orig;
14155  veb_orig = ves_orig - vbs_orig;
14156 
14157 // ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs
14158 // - gcgeb * veb - gcgT * delTemp;
14159 
14160  Qeqqg_Jdxp = 0.0;
14161  if (!origFlag)
14162  {
14163  Qeqqg_Jdxp = - CAPcggb * (vgb-vgb_orig)
14164  + CAPcgdb * (vbd-vbd_orig)
14165  + CAPcgsb * (vbs-vbs_orig)
14166  + CAPcgeb * (veb-veb_orig)
14167  + CAPcgT * (delTemp-delTemp_orig);
14168  }
14169 
14170 // ceqqb = cqbody - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs
14171 // - gcbeb * veb - gcbT * delTemp;
14172 
14173  Qeqqb_Jdxp = 0.0;
14174  if (!origFlag)
14175  {
14176  Qeqqb_Jdxp = - CAPcbgb * (vgb-vgb_orig)
14177  + CAPcbdb * (vbd-vbd_orig)
14178  + CAPcbsb * (vbs-vbs_orig)
14179  - CAPcbeb * (veb-veb_orig)
14180  - CAPcbT * (delTemp-delTemp_orig);
14181  }
14182 
14183 // ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs
14184 // - gcdeb * veb - gcdT * delTemp -gcdgmb * vgmb;
14185 
14186  Qeqqd_Jdxp = 0.0;
14187  if (!origFlag)
14188  {
14189  Qeqqd_Jdxp = - CAPcdgb * (vgb-vgb_orig)
14190  + CAPcddb * (vbd-vbd_orig)
14191  + CAPcdsb * (vbs-vbs_orig)
14192  - CAPcdeb * (veb-veb_orig)
14194  -CAPcdgmb * (vgmb-vgmb_orig);
14195  }
14196 
14197 // ceqqe = cqsub - gcegb * vgb + gcedb * vbd + gcesb * vbs
14198 // - gceeb * veb - gceT * delTemp - gcegmb * vgmb;
14199 
14200  Qeqqe_Jdxp = 0.0;
14201  if (!origFlag)
14202  {
14203  Qeqqe_Jdxp = - CAPcegb * (vgb-vgb_orig)
14204  + CAPcedb * (vbd-vbd_orig)
14205  + CAPcesb * (vbs-vbs_orig)
14206  - CAPceeb * (veb-veb_orig)
14208  -CAPcegmb * (vgmb-vgmb_orig);
14209  }
14210 
14211 // ceqqth = cqtemp - gcTt * delTemp;
14212 
14213  Qeqqth_Jdxp = 0.0;
14214  if (!origFlag)
14215  {
14217  }
14218 
14219  if (rgateMod == 3)
14220  {
14221 // ceqqgmid = *(ckt->CKTstate0 + cqgmid)
14222 // + gcgmdb * vbd + gcgmsb * vbs - gcgmgmb * vgmb;
14223 
14224  Qeqqgmid_Jdxp = 0.0;
14225  if (!origFlag)
14226  {
14228  + CAPcgmsb * (vbs-vbs_orig)
14229  - CAPcgmgmb * (vgmb-vgmb_orig);
14230  }
14231  }
14232  else
14233  {
14234  Qeqqgmid_Jdxp = 0.0;
14235  }
14236  } // !ChargeComputationNeeded
14237 
14238  return bsuccess;
14239 }
14240 
14241 //-----------------------------------------------------------------------------
14242 // Function : Instance::loadDAEdQdx
14243 //
14244 // Purpose : Loads the Q-vector contributions for a single
14245 // B3SOI instance.
14246 //
14247 // Special Notes : The "Q" vector is part of a standard DAE formalism in
14248 // which the system of equations is represented as:
14249 //
14250 // f(x) = dQ(x)/dt + F(x) - B(t) = 0
14251 //
14252 // Scope : public
14253 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
14254 // Creation Date : 02/19/05
14255 //-----------------------------------------------------------------------------
14257 {
14258  N_LAS_Matrix & dQdx = *(extData.dQdxMatrixPtr);
14259 
14260  if (rgateMod == 3)
14261  {
14265  += (CAPcgmdb)*numberParallel;
14266 
14268  += (CAPcgmsb)*numberParallel;
14271 
14274 
14279  }
14280 
14283 
14292  if (soiMod != 2)
14293  {
14295  -= (CAPcegb + CAPcedb + CAPcesb + CAPceeb + CAPcegmb)*numberParallel;
14296  if (rgateMod == 0 || rgateMod == 1)
14297  {
14299  -= (+CAPcggb + CAPcgdb + CAPcgsb + CAPcgeb)*numberParallel;
14300  }
14301  else
14302  {
14304  += (+ CAPcgbb)*numberParallel;
14305  }
14311  += (+ CAPcbeb)*numberParallel;
14313  += (+ CAPcbgb)*numberParallel;
14315  += (+ CAPcbdb)*numberParallel;
14317  += (CAPcbsb)*numberParallel;
14319  += (-CAPcbgb - CAPcbdb - CAPcbsb - CAPcbeb)*numberParallel;
14320  }
14323  if (rgateMod == 0)
14324  {
14326  += (CAPcggb)*numberParallel;
14328  += (CAPcgdb)*numberParallel;
14330  += (CAPcgsb)*numberParallel;
14331  }
14332  else if (rgateMod == 1)
14333  {
14335  += (CAPcggb)*numberParallel;
14337  += (CAPcgdb)*numberParallel;
14339  += (CAPcgsb)*numberParallel;
14340  }
14341  else
14342  {
14344  += (CAPcggb)*numberParallel;
14346  += (CAPcgdb)*numberParallel;
14348  += (CAPcgsb)*numberParallel;
14349  }
14351  += ((CAPcdgb))*numberParallel;
14353  += ((CAPcddb) )*numberParallel;
14355  -= ((-CAPcdsb) )*numberParallel;
14356 
14358  += (CAPcsgb)*numberParallel;
14360  -= (-CAPcsdb )*numberParallel;
14362  += ((CAPcssb) )*numberParallel;
14363 
14364  if (selfheat)
14365  {
14367  += (CAPcdT)*numberParallel;
14369  += (CAPcsT)*numberParallel;
14373  += (CAPcgT)*numberParallel;
14375  += (CAPcTt)*numberParallel;
14376 
14377  if (bNode > 0)
14378  {
14380  += (CAPcbT)*numberParallel;
14381  }
14382  }
14383 
14384  return true;
14385 }
14386 
14387 //-----------------------------------------------------------------------------
14388 // Function : Instance::loadDAEdFdx ()
14389 //
14390 // Purpose : Loads the F-vector contributions for a single
14391 // resistor instance.
14392 //
14393 // Special Notes : The F-vector is an algebraic constaint.
14394 //
14395 // Scope : public
14396 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
14397 // Creation Date : 02/19/05
14398 //-----------------------------------------------------------------------------
14400 {
14401  N_LAS_Matrix & dFdx = *(extData.dFdxMatrixPtr);
14402 
14403  if (rgateMod == 1)
14404  {
14406  += geltd*numberParallel;
14408  -= geltd*numberParallel;
14410  -= geltd*numberParallel;
14411  // It seems that this should be here, but it shouldn't.
14412  // The geltd term is added into the G'-G' element later down in this
14413  // routine
14414  //
14415  // dFdx[li_GatePrime][AGatePrimeEquGatePrimeNodeOffset]
14416  // += geltd*numberParallel;
14417  }
14418  else if (rgateMod == 2)
14419  {
14430  if (soiMod != 2)
14433  }
14434  else if (rgateMod == 3)
14435  {
14437  += geltd*numberParallel;
14439  += -geltd*numberParallel;
14441  += -geltd*numberParallel;
14443  += (geltd + gcrg_jac)*numberParallel;
14445  += (gcrgd_jac)*numberParallel;
14449  += (gcrgs_jac)*numberParallel;
14450 
14451  if (soiMod != 2)
14452  {
14455  }
14456 
14459  }
14460  if (soiMod != 0)
14461  {
14463  += (Gme + gddpe)*numberParallel;
14465  += (gsspe - Gme)*numberParallel;
14466  if (soiMod != 2)
14467  {
14472  }
14473  }
14474 
14475  if (soiMod != 2)
14476  {
14477  if (rgateMod == 0 || rgateMod == 1)
14478  {
14481  }
14482  else
14483  {
14486  }
14488  -= ((-gddpb - Gmbs) + gIdtotb)*numberParallel;
14490  -= ((-gsspb + Gmbs) + Gmin + gIstotb)*numberParallel;
14492  += (gbbe)*numberParallel;
14494  += (-gigg + gbbg)*numberParallel;
14496  += (-gigd_jac + gbbdp)*numberParallel;
14498  += (gbbsp - Gmin - gigs)*numberParallel;
14500  += (-gigb_jac + gbbb + Gmin)*numberParallel;
14501  }
14502  if (rgateMod == 0)
14503  {
14505  += (gigg + Gmin + gIgtotg)*numberParallel;
14509  += (gigs + gIgtots)*numberParallel;
14510  }
14511  else if (rgateMod == 1)
14512  {
14516  += (gigd - Gmin + gIgtotd)*numberParallel;
14519  }
14520  else
14521  {
14528  }
14530  += ((Gm) + gddpg - Gmin - gIdtotg)*numberParallel;
14534  -= ((-gddpsp + gds + FwdSum) + gIdtots)*numberParallel;
14538  += (-Gm + gsspg - gIstotg)*numberParallel;
14540  -= (gds - gsspdp + RevSum + gIstotd)*numberParallel;
14553  if (bodyMod == 1)
14554  {
14556  -= gppp*numberParallel;
14558  += gppb*numberParallel;
14560  += gppp*numberParallel;
14561  }
14562  if (selfheat)
14563  {
14565  += (GmT + gddpT)*numberParallel;
14567  += (-GmT + gsspT)*numberParallel;
14568 
14570  += (gigT_jac)*numberParallel;
14572  += (gTtt + 1/paramPtr->rth)*numberParallel;
14574  += gTtg*numberParallel;
14576  += gTtdp*numberParallel;
14578  += gTtsp*numberParallel;
14579  if (soiMod != 0)
14580  {
14582  += gTte*numberParallel;
14583  }
14584  if (bNode > 0)
14585  {
14587  += (gbbT - gigT_jac)*numberParallel;
14589  += gTtb*numberParallel;
14590  }
14591  }
14592  if( icVDSGiven )
14593  {
14594  if( getSolverState().dcopFlag )
14595  {
14596  dFdx[li_Drain][ADrainEquIdsOffset] += 1.0;
14597  dFdx[li_Source][ASourceEquIdsOffset] -= 1.0;
14598  dFdx[li_Ids][icVDSEquVdOffset] += 1.0;
14599  dFdx[li_Ids][icVDSEquVsOffset] -= 1.0;
14600  }
14601  else
14602  {
14603  dFdx[li_Ids][icVDSEquIdsOffset] += 1.0;
14604  }
14605  }
14606 
14607  if( icVGSGiven )
14608  {
14609  if( getSolverState().dcopFlag )
14610  {
14611  dFdx[li_Gate][AGateEquIgsOffset] += 1.0;
14612  dFdx[li_Source][ASourceEquIgsOffset] -= 1.0;
14613  dFdx[li_Igs][icVGSEquVgOffset] += 1.0;
14614  dFdx[li_Igs][icVGSEquVsOffset] -= 1.0;
14615  }
14616  else
14617  {
14618  dFdx[li_Igs][icVGSEquIgsOffset] += 1.0;
14619  }
14620  }
14621 
14622  if( icVBSGiven )
14623  {
14624  if( getSolverState().dcopFlag )
14625  {
14626  dFdx[li_Body][ABodyEquIbsOffset] += 1.0;
14627  dFdx[li_Source][ASourceEquIbsOffset] -= 1.0;
14628  dFdx[li_Ibs][icVBSEquVbOffset] += 1.0;
14629  dFdx[li_Ibs][icVBSEquVsOffset] -= 1.0;
14630  }
14631  else
14632  {
14633  dFdx[li_Ibs][icVBSEquIbsOffset] += 1.0;
14634  }
14635  }
14636 
14637  if( icVESGiven )
14638  {
14639  if( getSolverState().dcopFlag )
14640  {
14641  dFdx[li_Substrate][ASubstrateEquIesOffset] += 1.0;
14642  dFdx[li_Source][ASourceEquIesOffset] -= 1.0;
14643  dFdx[li_Ies][icVESEquVeOffset] += 1.0;
14644  dFdx[li_Ies][icVESEquVsOffset] -= 1.0;
14645  }
14646  else
14647  {
14648  dFdx[li_Ies][icVESEquIesOffset] += 1.0;
14649  }
14650  }
14651 
14652  if( icVPSGiven )
14653  {
14654  if( getSolverState().dcopFlag )
14655  {
14656  dFdx[li_ExtBody][AExtBodyEquIpsOffset] += 1.0;
14657  dFdx[li_Source][ASourceEquIpsOffset] -= 1.0;
14658  dFdx[li_Ips][icVPSEquVpOffset] += 1.0;
14659  dFdx[li_Ips][icVPSEquVsOffset] -= 1.0;
14660  }
14661  else
14662  {
14663  dFdx[li_Ips][icVPSEquIpsOffset] += 1.0;
14664  }
14665  }
14666 
14667  return true;
14668 }
14669 
14670 //-----------------------------------------------------------------------------
14671 // Function : Instance:loadMatrix
14672 //
14673 // Purpose : The contents of this function were in the
14674 // loadAnalyticJacobian function previously. I moved them to
14675 // this new function as a debug exercise, b/c I needed to
14676 // load more than one matrix, as a debug tool.
14677 // Special Notes :
14678 // Scope : private
14679 // Creator : Eric Keiter, 9233
14680 // Creation Date : 01/06/05
14681 //-----------------------------------------------------------------------------
14682 bool Instance::loadMatrix (N_LAS_Matrix & JMat)
14683 {
14684  bool bsuccess = true;
14685 
14686  if (rgateMod == 1)
14687  {
14689  += geltd*numberParallel;
14691  -= geltd*numberParallel;
14693  -= geltd*numberParallel;
14694  // It seems that this should be here, but it shouldn't.
14695  // The geltd term is added into the G'-G' element later down in this
14696  // routine
14697  //
14698  // (JMat)[li_GatePrime][AGatePrimeEquGatePrimeNodeOffset]
14699  // += geltd*numberParallel;
14700  }
14701  else if (rgateMod == 2)
14702  {
14713  if (soiMod != 2)
14716  }
14717  else if (rgateMod == 3)
14718  {
14720  += geltd*numberParallel;
14722  += -geltd*numberParallel;
14724  += -geltd*numberParallel;
14735  if (soiMod != 2)
14736  {
14739  }
14748  }
14749  if (soiMod != 0)
14750  {
14752  += (Gme + gddpe)*numberParallel;
14754  += (gsspe - Gme)*numberParallel;
14755  if (soiMod != 2)
14756  {
14761  }
14762  }
14764  += gcedb*numberParallel;
14766  += gcesb*numberParallel;
14768  += gcdeb*numberParallel;
14770  += gcseb*numberParallel;
14772  += gcegb*numberParallel;
14774  += gcgeb*numberParallel;
14775  if (soiMod != 2)
14776  {
14778  -= (gcegb + gcedb + gcesb + gceeb + gcegmb)*numberParallel;
14779  if (rgateMod == 0 || rgateMod == 1)
14780  {
14783  }
14784  else
14785  {
14788  }
14790  -= ((-gddpb - Gmbs + gcdgb + gcddb + gcdeb + gcdsb) + gcdgmb + gIdtotb)*numberParallel;
14792  -= ((-gsspb + Gmbs + gcsgb + gcsdb + gcseb + gcssb) + gcsgmb + Gmin + gIstotb)*numberParallel;
14794  += (gbbe + gcbeb)*numberParallel;
14796  += (-gigg_jac + gcbgb + gbbg)*numberParallel;
14798  += (-gigd_jac + gcbdb + gbbdp)*numberParallel;
14800  += (gcbsb + gbbsp - Gmin - gigs_jac)*numberParallel;
14802  += (-gigb_jac + gbbb - gcbgb - gcbdb - gcbsb - gcbeb + Gmin)*numberParallel;
14803  }
14805  += gceeb*numberParallel;
14806  if (rgateMod == 0)
14807  {
14814  }
14815  else if (rgateMod == 1)
14816  {
14823  }
14824  else
14825  {
14832  }
14834  += ((Gm + gcdgb) + gddpg - Gmin - gIdtotg)*numberParallel;
14838  -= ((-gddpsp + gds + FwdSum - gcdsb) + gIdtots)*numberParallel;
14842  += (gcsgb - Gm + gsspg - gIstotg)*numberParallel;
14857  if (bodyMod == 1)
14858  {
14860  -= gppp*numberParallel;
14862  += gppb*numberParallel;
14864  += gppp*numberParallel;
14865  }
14866  if (selfheat)
14867  {
14869  += (GmT + gddpT + gcdT)*numberParallel;
14871  += (-GmT + gsspT + gcsT)*numberParallel;
14873  += gceT*numberParallel;
14875  += (gcgT + gigT_jac)*numberParallel;
14877  += (gTtt + 1/paramPtr->rth + gcTt)*numberParallel;
14879  += gTtg*numberParallel;
14881  += gTtdp*numberParallel;
14883  += gTtsp*numberParallel;
14884  if (soiMod != 0)
14885  {
14887  += gTte*numberParallel;
14888  }
14889  if (bNode > 0)
14890  {
14892  += (gbbT + gcbT - gigT_jac)*numberParallel;
14894  += gTtb*numberParallel;
14895  }
14896  }
14897 
14898  if( icVDSGiven )
14899  {
14900  if( getSolverState().dcopFlag )
14901  {
14902  (JMat)[li_Drain][ADrainEquIdsOffset] += 1.0;
14903  (JMat)[li_Source][ASourceEquIdsOffset] -= 1.0;
14904  (JMat)[li_Ids][icVDSEquVdOffset] += 1.0;
14905  (JMat)[li_Ids][icVDSEquVsOffset] -= 1.0;
14906  }
14907  else
14908  {
14909  (JMat)[li_Ids][icVDSEquIdsOffset] += 1.0;
14910  }
14911  }
14912 
14913  if( icVGSGiven )
14914  {
14915  if( getSolverState().dcopFlag )
14916  {
14917  (JMat)[li_Gate][AGateEquIgsOffset] += 1.0;
14918  (JMat)[li_Source][ASourceEquIgsOffset] -= 1.0;
14919  (JMat)[li_Igs][icVGSEquVgOffset] += 1.0;
14920  (JMat)[li_Igs][icVGSEquVsOffset] -= 1.0;
14921  }
14922  else
14923  {
14924  (JMat)[li_Igs][icVGSEquIgsOffset] += 1.0;
14925  }
14926  }
14927 
14928  if( icVBSGiven )
14929  {
14930  if( getSolverState().dcopFlag )
14931  {
14932  (JMat)[li_Body][ABodyEquIbsOffset] += 1.0;
14933  (JMat)[li_Source][ASourceEquIbsOffset] -= 1.0;
14934  (JMat)[li_Ibs][icVBSEquVbOffset] += 1.0;
14935  (JMat)[li_Ibs][icVBSEquVsOffset] -= 1.0;
14936  }
14937  else
14938  {
14939  (JMat)[li_Ibs][icVBSEquIbsOffset] += 1.0;
14940  }
14941  }
14942 
14943  if( icVESGiven )
14944  {
14945  if( getSolverState().dcopFlag )
14946  {
14947  (JMat)[li_Substrate][ASubstrateEquIesOffset] += 1.0;
14948  (JMat)[li_Source][ASourceEquIesOffset] -= 1.0;
14949  (JMat)[li_Ies][icVESEquVeOffset] += 1.0;
14950  (JMat)[li_Ies][icVESEquVsOffset] -= 1.0;
14951  }
14952  else
14953  {
14954  (JMat)[li_Ies][icVESEquIesOffset] += 1.0;
14955  }
14956  }
14957 
14958  if( icVPSGiven )
14959  {
14960  if( getSolverState().dcopFlag )
14961  {
14962  (JMat)[li_ExtBody][AExtBodyEquIpsOffset] += 1.0;
14963  (JMat)[li_Source][ASourceEquIpsOffset] -= 1.0;
14964  (JMat)[li_Ips][icVPSEquVpOffset] += 1.0;
14965  (JMat)[li_Ips][icVPSEquVsOffset] -= 1.0;
14966  }
14967  else
14968  {
14969  (JMat)[li_Ips][icVPSEquIpsOffset] += 1.0;
14970  }
14971  }
14972 
14973  return bsuccess;
14974 }
14975 
14976 //-----------------------------------------------------------------------------
14977 // Function : Instance:checkModel
14978 // Purpose :
14979 // Special Notes :
14980 // Scope : private
14981 // Creator : Dave Shirley
14982 // Creation Date : 08/04/04
14983 //-----------------------------------------------------------------------------
14984 
14986 {
14987  bool bsuccess = true;
14988 
14989  if (paramPtr->nlx < -paramPtr->leff)
14990  {
14991  UserError(*this) << "Nlx = " << paramPtr->nlx << " is less than -Leff";
14992  bsuccess = false;
14993  }
14994  if (model_.tox <= 0.0)
14995  {
14996  UserError(*this) << "Tox = " << model_.tox << " is not positive.";
14997  bsuccess = false;
14998  }
14999  if (model_.toxm <= 0.0)
15000  {
15001  UserError(*this) << "Toxm = " << model_.toxm << " is not positive.";
15002  bsuccess = false;
15003  }
15004  if (model_.tox - model_.dtoxcv <= 0.0)
15005  {
15006  UserError(*this) << "Tox - dtoxcv = " << model_.tox - model_.dtoxcv << " is not positive.";
15007  bsuccess = false;
15008  }
15009  if (model_.tbox <= 0.0)
15010  {
15011  UserError(*this) << "Tbox = " << model_.tbox << " is not positive.";
15012  bsuccess = false;
15013  }
15014  if (paramPtr->npeak <= 0.0)
15015  {
15016  UserError(*this) << "Nch = " << paramPtr->npeak << " is not positive.";
15017  bsuccess = false;
15018  }
15019  if (paramPtr->ngate < 0.0)
15020  {
15021  UserError(*this) << "Ngate = " << paramPtr->ngate << " is not positive.";
15022  bsuccess = false;
15023  }
15024  if (paramPtr->ngate > 1.e25)
15025  {
15026  UserError(*this) << "Ngate = %" << paramPtr->ngate << " is not positive.";
15027  bsuccess = false;
15028  }
15029  if (paramPtr->dvt1 < 0.0)
15030  {
15031  UserError(*this) << "Dvt1 = " << paramPtr->dvt1 << " is negative.";
15032  bsuccess = false;
15033  }
15034  if (paramPtr->dvt1w < 0.0)
15035  {
15036  UserError(*this) << "Dvt1w = " << paramPtr->dvt1w << " is negative.";
15037  bsuccess = false;
15038  }
15039  if (paramPtr->w0 == -paramPtr->weff)
15040  {
15041  UserError(*this) << "(W0 + Weff) = 0 causing divided-by-zero.\n";
15042  bsuccess = false;
15043  }
15044  if (paramPtr->dsub < 0.0)
15045  {
15046  UserError(*this) << "Dsub = " << paramPtr->dsub << " is negative.";
15047  bsuccess = false;
15048  }
15049  if (paramPtr->b1 == -paramPtr->weff)
15050  {
15051  UserError(*this) << "(B1 + Weff) = 0 causing divided-by-zero.\n";
15052  bsuccess = false;
15053  }
15054  if (paramPtr->u0temp <= 0.0)
15055  {
15056  UserError(*this) << "u0 at current temperature = " << paramPtr->u0temp << " is not positive.";
15057  bsuccess = false;
15058  }
15059  if (paramPtr->delta < 0.0)
15060  {
15061  UserError(*this) << "Delta = " << paramPtr->delta << " is not positive.";
15062  bsuccess = false;
15063  }
15064  if (paramPtr->vsattemp <= 0.0)
15065  {
15066  UserError(*this) << "Vsat at current temperature = " << paramPtr->vsattemp << " is not positive.";
15067  bsuccess = false;
15068  }
15069  if (paramPtr->pclm <= 0.0)
15070  {
15071  UserError(*this) << "Pclm = " << paramPtr->pclm << " is not positive.";
15072  bsuccess = false;
15073  }
15074  if (paramPtr->drout < 0.0)
15075  {
15076  UserError(*this) << "Drout = " << paramPtr->drout << " is negative.";
15077  bsuccess = false;
15078  }
15080  {
15081  if (drainPerimeter < paramPtr->weff)
15082  {
15083  if (getDeviceOptions().verboseLevel > 0)
15084  {
15085  UserWarning(*this) << "Pd = " << drainPerimeter << " is less than W.";
15086  }
15088  }
15089 
15090  if (sourcePerimeter < paramPtr->weff)
15091  {
15092  if (getDeviceOptions().verboseLevel > 0)
15093  {
15094  UserWarning(*this) << "Ps = " << sourcePerimeter << " is less than W.";
15095  }
15097  }
15098  }
15099  if (paramPtr->clc < 0.0)
15100  {
15101  UserError(*this) << "Clc = " << paramPtr->clc << " is negative.";
15102  bsuccess = false;
15103  }
15104 
15105  if (getDeviceOptions().verboseLevel > 0)
15106  {
15107  if (paramPtr->noff < 0.1)
15108  {
15109  UserWarning(*this) << "Noff = " << paramPtr->noff << " is too small.";
15110  }
15111  if (paramPtr->noff > 4.0)
15112  {
15113  UserWarning(*this) << "Noff = " << paramPtr->noff << " is too large.";
15114  }
15115  if (paramPtr->moin < 5.0)
15116  {
15117  UserWarning(*this) << "Moin = " << paramPtr->moin << " is too small.";
15118  }
15119  if (paramPtr->moin > 25.0)
15120  {
15121  UserWarning(*this) << "Moin = " << paramPtr->moin << " is too large.";
15122  }
15123  if (model_.moinFD < 5.0)
15124  {
15125  UserWarning(*this) << "MoinFD = " << model_.moinFD << " is too small.";
15126  }
15127  if (model_.capMod == 3) {
15128  if (paramPtr->acde < 0.1)
15129  {
15130  UserWarning(*this) << "Acde = " << paramPtr->acde << " is too small.";
15131  }
15132  if (paramPtr->acde > 1.6)
15133  {
15134  UserWarning(*this) << "Acde = " << paramPtr->acde << " is too large.";
15135  }
15136  }
15137  }
15138  if (model_.paramChk ==1)
15139  {
15140  if (paramPtr->leff <= 5.0e-8)
15141  {
15142  UserWarning(*this) << "Leff = " << paramPtr->leff << " may be too small.";
15143  }
15144  if (paramPtr->leffCV <= 5.0e-8)
15145  {
15146  UserWarning(*this) << "Leff for CV = " << paramPtr->leffCV << " may be too small.";
15147  }
15148  if (paramPtr->weff <= 1.0e-7)
15149  {
15150  UserWarning(*this) << "Weff = " << paramPtr->weff << " may be too small.";
15151  }
15152  if (paramPtr->weffCV <= 1.0e-7)
15153  {
15154  UserWarning(*this) << "Weff for CV = " << paramPtr->weffCV << " may be too small.";
15155  }
15156  if (paramPtr->nlx < 0.0)
15157  {
15158  UserWarning(*this) << "Nlx = " << paramPtr->nlx << " is negative.";
15159  }
15160  if (model_.tox < 1.0e-9)
15161  {
15162  UserWarning(*this) << "Tox = " << model_.tox << " is less than 10A.";
15163  }
15164  if (paramPtr->npeak <= 1.0e15)
15165  {
15166  UserWarning(*this) << "Nch = " << paramPtr->npeak << " may be too small.";
15167  }
15168  else if (paramPtr->npeak >= 1.0e21)
15169  {
15170  UserWarning(*this) << "Nch = " << paramPtr->npeak << " may be too large.";
15171  }
15172  if (fabs(paramPtr->nsub) >= 1.0e21)
15173  {
15174  UserWarning(*this) << "Nsub = " << paramPtr->nsub << " may be too large.";
15175  }
15176  if ((paramPtr->ngate > 0.0) && (paramPtr->ngate <= 1.e18))
15177  {
15178  UserWarning(*this) << "Ngate = " << paramPtr->ngate << " is less than 1.E18cm^-3.";
15179  }
15180  if (paramPtr->dvt0 < 0.0)
15181  {
15182  UserWarning(*this) << "Dvt0 = " << paramPtr->dvt0 << " is negative.";
15183  }
15184  if (fabs(1.0e-6 / (paramPtr->w0 + paramPtr->weff)) > 10.0)
15185  {
15186  UserWarning(*this) << "(W0 + Weff) may be too small.";
15187  }
15188 
15189  if (paramPtr->nfactor < 0.0)
15190  {
15191  UserWarning(*this) << "Nfactor = " << paramPtr->nfactor << " is negative.";
15192  }
15193 
15194  if (paramPtr->cdsc < 0.0)
15195  {
15196  UserWarning(*this) << "Cdsc = " << paramPtr->cdsc << " is negative.";
15197  }
15198 
15199  if (paramPtr->cdscd < 0.0)
15200  {
15201  UserWarning(*this) << "Cdscd = " << paramPtr->cdscd << " is negative.";
15202  }
15203 
15204  if (paramPtr->eta0 < 0.0)
15205  {
15206  UserWarning(*this) << "Eta0 = " << paramPtr->eta0 << " is negative.";
15207  }
15208 
15209  if (fabs(1.0e-6 / (paramPtr->b1 + paramPtr->weff)) > 10.0)
15210  {
15211  UserWarning(*this) << "(B1 + Weff) may be too small.";
15212  }
15213 
15214  if (paramPtr->a2 < 0.01)
15215  {
15216  UserWarning(*this) << "A2 = " << paramPtr->a2 << " is too small. Set to 0.01";
15217  paramPtr->a2 = 0.01;
15218  }
15219 
15220  else if (paramPtr->a2 > 1.0)
15221  {
15222  UserWarning(*this) << "A2 = " << paramPtr->a2 << " is larger than 1. A2 is set to 1 and A1 is set to 0.";
15223  paramPtr->a2 = 1.0;
15224  paramPtr->a1 = 0.0;
15225  }
15226 
15227  if (paramPtr->rdsw < 0.0)
15228  {
15229  UserWarning(*this) << "Rdsw = " << paramPtr->rdsw << " is negative. Set to zero.";
15230  paramPtr->rdsw = 0.0;
15231  paramPtr->rds0 = 0.0;
15232  }
15233 
15234  else if ((paramPtr->rds0 > 0.0) && (paramPtr->rds0 < 0.001))
15235  {
15236  UserWarning(*this) << "Rds at current temperature = " << paramPtr->rds0 << " is less than 0.001 ohm. Set to zero.";
15237  paramPtr->rds0 = 0.0;
15238  }
15239 
15240  if (paramPtr->vsattemp < 1.0e3)
15241  {
15242  UserWarning(*this) << "Vsat at current temperature = " << paramPtr->vsattemp << " may be too small.";
15243  }
15244 
15245  if (paramPtr->pdibl1 < 0.0)
15246  {
15247  UserWarning(*this) << "Pdibl1 = " << paramPtr->pdibl1 << " is negative.";
15248  }
15249 
15250  if (paramPtr->pdibl2 < 0.0)
15251  {
15252  UserWarning(*this) << "Pdibl2 = " << paramPtr->pdibl2 << " is negative.";
15253  }
15254 
15255  if (model_.cgdo < 0.0)
15256  {
15257  UserWarning(*this) << "cgdo = " << model_.cgdo << " is negative. Set to zero.";
15258  model_.cgdo = 0.0;
15259  }
15260 
15261  if (model_.cgso < 0.0)
15262  {
15263  UserWarning(*this) << "cgso = " << model_.cgso << " is negative. Set to zero.";
15264  model_.cgso = 0.0;
15265  }
15266 
15267  if (model_.cgeo < 0.0)
15268  {
15269  UserWarning(*this) << "cgeo = " << model_.cgeo << " is negative. Set to zero.";
15270  model_.cgeo = 0.0;
15271  }
15272 
15273  if (model_.ntun < 0.0)
15274  {
15275  UserWarning(*this) << "Ntun = " << model_.ntun << " is negative.";
15276  }
15277 
15278  if (model_.ndiode < 0.0)
15279  {
15280  UserWarning(*this) << "Ndiode = " << model_.ndiode << " is negative.";
15281  }
15282 
15283  if (model_.isbjt < 0.0)
15284  {
15285  UserWarning(*this) << "Isbjt = " << model_.isbjt << " is negative.";
15286  }
15287 
15288  if (model_.isdif < 0.0)
15289  {
15290  UserWarning(*this) << "Isdif = " << model_.isdif << " is negative.";
15291  }
15292 
15293  if (model_.isrec < 0.0)
15294  {
15295  UserWarning(*this) << "Isrec = " << model_.isrec << " is negative.";
15296  }
15297 
15298  if (model_.istun < 0.0)
15299  {
15300  UserWarning(*this) << "Istun = " << model_.istun << " is negative.";
15301  }
15302 
15303  if (model_.tt < 0.0)
15304  {
15305  UserWarning(*this) << "Tt = " << model_.tt << " is negative.";
15306  }
15307 
15308  if (model_.csdmin < 0.0)
15309  {
15310  UserWarning(*this) << "Csdmin = " << model_.csdmin << " is negative.";
15311  }
15312 
15313  if (model_.csdesw < 0.0)
15314  {
15315  UserWarning(*this) << "Csdesw = " << model_.csdesw << " is negative.";
15316  }
15317 
15318  if (model_.asd < 0.0)
15319  {
15320  UserWarning(*this) << "Asd = " << model_.asd << " should be within (0, 1).";
15321  }
15322 
15323  if (model_.rth0 < 0.0)
15324  {
15325  UserWarning(*this) << "Rth0 = " << model_.rth0 << " is negative.";
15326  }
15327 
15328  if (model_.cth0 < 0.0)
15329  {
15330  UserWarning(*this) << "Cth0 = " << model_.cth0 << " is negative.";
15331  }
15332 
15333  if (model_.rbody < 0.0)
15334  {
15335  UserWarning(*this) << "Rbody = " << model_.rbody << " is negative.";
15336  }
15337 
15338  if (model_.rbsh < 0.0)
15339  {
15340  UserWarning(*this) << "Rbsh = " << model_.rbsh << " is negative.";
15341  }
15342 
15343  if (paramPtr->nigc <= 0.0)
15344  {
15345  UserError(*this) << "nigc = " << paramPtr->nigc << " is non-positive.";
15346  bsuccess = false;
15347  }
15348 
15349  if (paramPtr->poxedge <= 0.0)
15350  {
15351  UserError(*this) << "poxedge = " << paramPtr->poxedge << " is non-positive.";
15352  bsuccess = false;
15353  }
15354 
15355  if (paramPtr->pigcd <= 0.0)
15356  {
15357  UserError(*this) << "pigcd = " << paramPtr->pigcd << " is non-positive.";
15358 
15359  }
15360 
15361  if (model_.wth0 < 0.0)
15362  {
15363  UserWarning(*this) << " Wth0 = " << model_.wth0 << " is negative.";
15364  }
15365 
15366  if (model_.rhalo < 0.0)
15367  {
15368  UserWarning(*this) << " Rhalo = " << model_.rhalo << " is negative.";
15369  }
15370 
15371  if (model_.ntox < 0.0)
15372  {
15373  UserWarning(*this) << " Ntox = " << model_.ntox << " is negative.";
15374  }
15375 
15376  if (model_.toxref < 0.0)
15377  {
15378  UserWarning(*this) << " Toxref = " << model_.toxref << " is negative.";
15379  bsuccess = false;
15380  }
15381 
15382  if (model_.ebg < 0.0)
15383  {
15384  UserWarning(*this) << " Ebg = " << model_.ebg << " is negative.";
15385  }
15386 
15387  if (model_.vevb < 0.0)
15388  {
15389  UserWarning(*this) << " Vevb = " << model_.vevb << " is negative.";
15390  }
15391 
15392  if (paramPtr->alphaGB1 < 0.0)
15393  {
15394  UserWarning(*this) << " AlphaGB1 = " << paramPtr->alphaGB1 << " is negative.";
15395  }
15396 
15397  if (paramPtr->betaGB1 < 0.0)
15398  {
15399  UserWarning(*this) << " BetaGB1 = " << paramPtr->betaGB1 << " is negative.";
15400  }
15401 
15402  if (model_.vgb1 < 0.0)
15403  {
15404  UserWarning(*this) << " Vgb1 = " << model_.vgb1 << " is negative.";
15405  }
15406 
15407  if (model_.vecb < 0.0)
15408  {
15409  UserWarning(*this) << " Vecb = " << model_.vecb << " is negative.";
15410  }
15411 
15412  if (paramPtr->alphaGB2 < 0.0)
15413  {
15414  UserWarning(*this) << " AlphaGB2 = " << paramPtr->alphaGB2 << " is negative.";
15415  }
15416 
15417  if (paramPtr->betaGB2 < 0.0)
15418  {
15419  UserWarning(*this) << " BetaGB2 = " << paramPtr->betaGB2 << " is negative.";
15420  }
15421 
15422  if (model_.vgb2 < 0.0)
15423  {
15424  UserWarning(*this) << " Vgb2 = " << model_.vgb2 << " is negative.";
15425  }
15426 
15427  if (model_.toxqm <= 0.0)
15428  {
15429  UserError(*this) << "Toxqm = " << model_.toxqm << " is not positive.";
15430  bsuccess = false;
15431  }
15432 
15433  if (model_.voxh < 0.0)
15434  {
15435  UserWarning(*this) << " Voxh = " << model_.voxh << " is negative.";
15436  }
15437 
15438  if (model_.deltavox <= 0.0)
15439  {
15440  UserError(*this) << "Deltavox = " << model_.deltavox << " is not positive.";
15441  }
15442 
15443  if (model_.k1w1 < 0.0)
15444  {
15445  UserWarning(*this) << " K1w1 = " << model_.k1w1 << " is negative.";
15446  }
15447 
15448  if (model_.k1w2 < 0.0)
15449  {
15450  UserWarning(*this) << " K1w2 = " << model_.k1w2 << " is negative.";
15451  }
15452 
15453  if (model_.ketas < 0.0)
15454  {
15455  UserWarning(*this) << " Ketas = " << model_.ketas << " is negative.";
15456  }
15457 
15458  if (model_.dwbc < 0.0)
15459  {
15460  UserWarning(*this) << " Dwbc = " << model_.dwbc << " is negative.";
15461  }
15462 
15463  if (model_.beta0 < 0.0)
15464  {
15465  UserWarning(*this) << " Beta0 = " << model_.beta0 << " is negative.";
15466  }
15467 
15468  if (model_.beta1 < 0.0)
15469  {
15470  UserWarning(*this) << " Beta1 = " << model_.beta1 << " is negative.";
15471  }
15472 
15473  if (model_.beta2 < 0.0)
15474  {
15475  UserWarning(*this) << " Beta2 = " << model_.beta2 << " is negative.";
15476  }
15477 
15478  if (model_.tii < 0.0)
15479  {
15480  UserWarning(*this) << " Tii = " << model_.tii << " is negative.";
15481  }
15482 
15483  if (model_.lii < 0.0)
15484  {
15485  UserWarning(*this) << " Lii = " << model_.lii << " is negative.";
15486  }
15487 
15488  if (model_.sii1 < 0.0)
15489  {
15490  UserWarning(*this) << " Sii1 = " << model_.sii1 << " is negative.";
15491  }
15492 
15493  if (model_.sii2 < 0.0)
15494  {
15495  UserWarning(*this) << " Sii2 = " << model_.sii1 << " is negative.";
15496  }
15497 
15498  if (model_.siid < 0.0)
15499  {
15500  UserWarning(*this) << " Siid = " << model_.siid << " is negative.";
15501  }
15502 
15503  if (model_.fbjtii < 0.0)
15504  {
15505  UserWarning(*this) << " fbjtii = " << model_.fbjtii << " is negative.";
15506  }
15507 
15508  if (model_.vrec0 < 0.0)
15509  {
15510  UserWarning(*this) << " Vrec0 = " << model_.vrec0 << " is negative.";
15511  }
15512 
15513  if (model_.vtun0 < 0.0)
15514  {
15515  UserWarning(*this) << " Vtun0 = " << model_.vtun0 << " is negative.";
15516  }
15517 
15518  if (model_.nbjt < 0.0)
15519  {
15520  UserWarning(*this) << " Nbjt = " << model_.nbjt << " is negative.";
15521  }
15522 
15523  if (model_.aely < 0.0)
15524  {
15525  UserWarning(*this) << " Aely = " << model_.aely << " is negative.";
15526  }
15527 
15528  if (model_.ahli < 0.0)
15529  {
15530  UserWarning(*this) << " Ahli = " << model_.ahli << " is negative.";
15531  }
15532 
15533  if (model_.rbody < 0.0)
15534  {
15535  UserWarning(*this) << " Rbody = " << model_.rbody << " is negative.";
15536  }
15537 
15538  if (model_.rbsh < 0.0)
15539  {
15540  UserWarning(*this) << " Rbsh = " << model_.rbsh << " is negative.";
15541  }
15542 
15543  if (paramPtr->ntrecf < 0.0)
15544  {
15545  UserWarning(*this) << " Ntrecf = " << paramPtr->ntrecf << " is negative.";
15546  }
15547 
15548  if (paramPtr->ntrecr < 0.0)
15549  {
15550  UserWarning(*this) << " Ntrecr = " << paramPtr->ntrecr << " is negative.";
15551  }
15552 
15553  if (model_.tcjswg < 0.0)
15554  {
15555  UserWarning(*this) << " Tcjswg = " << model_.tcjswg << " is negative.";
15556  }
15557 
15558  if (model_.tpbswg < 0.0)
15559  {
15560  UserWarning(*this) << " Tpbswg = " << model_.tpbswg << " is negative.";
15561  }
15562 
15563  if ((model_.acde < 0.1) || (model_.acde > 1.6))
15564  {
15565  UserWarning(*this) << " Acde = " << model_.acde << " is out of range.";
15566  }
15567 
15568  if ((model_.moin < 5.0)||(model_.moin > 25.0))
15569  {
15570  UserWarning(*this) << " Moin = " << model_.moin << " is out of range.";
15571  }
15572 
15573  if (model_.dlbg < 0.0)
15574  {
15575  UserWarning(*this) << " dlbg = " << model_.dlbg << " is negative.";
15576  }
15577 
15578 
15579  if (model_.agidl < 0.0)
15580  {
15581  UserWarning(*this) << " Agidl = " << model_.agidl << " is negative.";
15582  }
15583 
15584  if (model_.bgidl < 0.0)
15585  {
15586  UserWarning(*this) << " Bgidl = " << model_.bgidl << " is negative.";
15587  }
15588 
15589  if (model_.ngidl < 0.0)
15590  {
15591  UserWarning(*this) << " Ngidl = " << model_.ngidl << " is negative.";
15592  }
15593 
15594  if (model_.esatii < 0.0)
15595  {
15596  UserWarning(*this) << "Esatii = " << model_.esatii << " should be within (0, 1).";
15597  }
15598 
15599 
15600  if (paramPtr->xj > model_.tsi)
15601  {
15602  UserWarning(*this) << "Xj = " << paramPtr->xj << " is thicker than Tsi = " << model_.tsi << ".";
15603  }
15604 
15605  if (model_.capMod < 2)
15606  {
15607  UserWarning(*this) << "capMod < 2 is not supported by BSIM3SOI.";
15608  }
15609  }
15610 
15611  return bsuccess;
15612 }
15613 
15614 
15615 //-----------------------------------------------------------------------------
15616 // Function : Instance::setIC
15617 // Purpose :
15618 // Special Notes :
15619 // Scope : public
15620 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
15621 // Creation Date : 01/10/02
15622 //-----------------------------------------------------------------------------
15624 {
15625  bool bsuccess = true;
15626 
15627  if( icVDSGiven )
15628  {
15631  }
15632 
15633  if( icVGSGiven )
15634  {
15637  }
15638 
15639  if( icVBSGiven )
15640  {
15643  }
15644 
15645  if( icVESGiven )
15646  {
15649  }
15650 
15651  if( icVPSGiven )
15652  {
15655  }
15656 
15657  return bsuccess;
15658 }
15659 
15660 // Class Model
15661 //-----------------------------------------------------------------------------
15662 // Function : Model::processParams
15663 // Purpose :
15664 // Special Notes :
15665 // Scope : public
15666 // Creator : Dave Shirley
15667 // Creation Date : 05/20/04
15668 //-----------------------------------------------------------------------------
15670 {
15671 
15672  if (!given("DSUB"))
15673  dsub = drout;
15674  if (!given("XJ"))
15675  xj = tsi;
15676  if (!given("XDIF"))
15677  xdif = xbjt;
15678  if (!given("DWC"))
15679  dwc = Wint;
15680  if (!given("DLC"))
15681  dlc = Lint;
15682  if (!given("DLCIG"))
15683  dlcig = Lint;
15684 
15685  vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14));
15686  factor1 = sqrt(CONSTEPSSI / CONSTEPSOX * tox);
15687 
15688  Vtm0 = CONSTKoverQ * tnom;
15689  Eg0 = CONSTEg0 - CONSTalphaEg * tnom * tnom / (tnom + CONSTbetaEg);
15690  ni = CONSTNi0 * (tnom / CONSTREFTEMP) * sqrt(tnom / CONSTREFTEMP)
15691  * exp(21.5565981 - Eg0 / (2.0 * Vtm0));
15692  cbox = 3.453133e-11 / tbox;
15693  csi = 1.03594e-10 / tsi;
15694 
15695  return true;
15696 }
15697 
15698 //----------------------------------------------------------------------------
15699 // Function : Model::processInstanceParams
15700 // Purpose :
15701 // Special Notes :
15702 // Scope : public
15703 // Creator : Dave Shirely, PSSI
15704 // Creation Date : 03/23/06
15705 //----------------------------------------------------------------------------
15707 {
15708  std::vector<Instance*>::iterator iter;
15709  std::vector<Instance*>::iterator first = instanceContainer.begin();
15710  std::vector<Instance*>::iterator last = instanceContainer.end();
15711 
15712  for (iter=first; iter!=last; ++iter)
15713  {
15714  (*iter)->processParams();
15715  }
15716 
15717  return true;
15718 }
15719 
15720 //-----------------------------------------------------------------------------
15721 // Function : Model::Model
15722 // Purpose : model block constructor
15723 // Special Notes :
15724 // Scope : public
15725 // Creator : Dave Shirley
15726 // Creation Date : 05/20/04
15727 //-----------------------------------------------------------------------------
15729  const Configuration & configuration,
15730  const ModelBlock & MB,
15731  const FactoryBlock & factory_block)
15732  : DeviceModel(MB, configuration.getModelParameters(), factory_block),
15733  version ("3.2"),
15734  dtype (CONSTNMOS),
15735  cbox (0.0),
15736  csi (0.0),
15737  mobMod (0),
15738  capMod (0),
15739  binUnit (0),
15740  paramChk (0),
15741  model_l (0.0),
15742  model_w (0.0),
15743  Lmax (0.0),
15744  Lmin (0.0),
15745  Wmax (0.0),
15746  Wmin (0.0),
15747  dtoxcv (0.0),
15748  npeak (0.0),
15749  pdibl1 (0.0),
15750  pdibl2 (0.0),
15751  pdiblb (0.0),
15752  shMod (0.0),
15753  tbox (0.0),
15754  tsi (0.0),
15755  rth0 (0.0),
15756  cth0 (0.0),
15757  ngidl (0.0),
15758  agidl (0.0),
15759  bgidl (0.0),
15760  ndiode (0.0),
15761  xbjt (0.0),
15762  xdif (0.0),
15763  xrec (0.0),
15764  xtun (0.0),
15765  bodyJctGateSideGradingCoeff (0.0),
15766  fnoiMod (0.0),
15767  tnoiMod (0.0),
15768  tnoia (0.0),
15769  tnoib (0.0),
15770  rnoia (0.0),
15771  rnoib (0.0),
15772  ntnoi (0.0),
15773  noif (0.0),
15774  k1w1 (0.0),
15775  k1w2 (0.0),
15776  ketas (0.0),
15777  dwbc (0.0),
15778  beta1 (0.0),
15779  beta2 (0.0),
15780  vdsatii0 (0.0),
15781  tii (0.0),
15782  lii (0.0),
15783  sii0 (0.0),
15784  sii1 (0.0),
15785  sii2 (0.0),
15786  siid (0.0),
15787  fbjtii (0.0),
15788  esatii (0.0),
15789  ntun (0.0),
15790  nrecf0 (0.0),
15791  nrecr0 (0.0),
15792  isbjt (0.0),
15793  isdif (0.0),
15794  isrec (0.0),
15795  istun (0.0),
15796  ln (0.0),
15797  vrec0 (0.0),
15798  vtun0 (0.0),
15799  nbjt (0.0),
15800  lbjt0 (0.0),
15801  ldif0 (0.0),
15802  vabjt (0.0),
15803  aely (0.0),
15804  ahli (0.0),
15805  rbody (0.0),
15806  rbsh (0.0),
15807  cgeo (0.0),
15808  tt (0.0),
15809  ndif (0.0),
15810  vsdfb (0.0),
15811  vsdth (0.0),
15812  csdmin (0.0),
15813  asd (0.0),
15814  csdesw (0.0),
15815  ntrecf (0.0),
15816  ntrecr (0.0),
15817  dlcb (0.0),
15818  fbody (0.0),
15819  delvt (0.0),
15820  kb1 (0.0),
15821  dlbg (0.0),
15822  igbMod (0.0),
15823  igcMod (0.0),
15824  toxqm (0.0),
15825  wth0 (0.0),
15826  rhalo (0.0),
15827  ntox (0.0),
15828  toxref (0.0),
15829  ebg (0.0),
15830  vevb (0.0),
15831  alphaGB1 (0.0),
15832  betaGB1 (0.0),
15833  vgb1 (0.0),
15834  vecb (0.0),
15835  alphaGB2 (0.0),
15836  betaGB2 (0.0),
15837  vgb2 (0.0),
15838  voxh (0.0),
15839  deltavox (0.0),
15840  aigc (0.0),
15841  bigc (0.0),
15842  cigc (0.0),
15843  aigsd (0.0),
15844  bigsd (0.0),
15845  cigsd (0.0),
15846  nigc (0.0),
15847  pigcd (0.0),
15848  poxedge (0.0),
15849  dlcig (0.0),
15850  soiMod (0),
15851  vbs0pd (0.0),
15852  vbs0fd (0.0),
15853  vbsa (0.0),
15854  nofffd (0.0),
15855  vofffd (0.0),
15856  k1b (0.0),
15857  k2b (0.0),
15858  dk2b (0.0),
15859  dvbd0 (0.0),
15860  dvbd1 (0.0),
15861  moinFD (0.0),
15862  rgateMod (0),
15863  bug1830fix (0),
15864  xrcrg1 (0.0),
15865  xrcrg2 (0.0),
15866  rshg (0.0),
15867  ngcon (0.0),
15868  xgw (0.0),
15869  xgl (0.0),
15870  lalphaGB1 (0.0),
15871  lbetaGB1 (0.0),
15872  lalphaGB2 (0.0),
15873  lbetaGB2 (0.0),
15874  lndif (0.0),
15875  lntrecf (0.0),
15876  lntrecr (0.0),
15877  lxbjt (0.0),
15878  lxdif (0.0),
15879  lxrec (0.0),
15880  lxtun (0.0),
15881  laigc (0.0),
15882  lbigc (0.0),
15883  lcigc (0.0),
15884  laigsd (0.0),
15885  lbigsd (0.0),
15886  lcigsd (0.0),
15887  lnigc (0.0),
15888  lpigcd (0.0),
15889  lpoxedge (0.0),
15890  lnpeak (0.0),
15891  lk1w1 (0.0),
15892  lk1w2 (0.0),
15893  lketas (0.0),
15894  lpdibl1 (0.0),
15895  lpdibl2 (0.0),
15896  lpdiblb (0.0),
15897  lfbjtii (0.0),
15898  lbeta1 (0.0),
15899  lbeta2 (0.0),
15900  lvdsatii0 (0.0),
15901  llii (0.0),
15902  lesatii (0.0),
15903  lsii0 (0.0),
15904  lsii1 (0.0),
15905  lsii2 (0.0),
15906  lsiid (0.0),
15907  lkb1 (0.0),
15908  lagidl (0.0),
15909  lbgidl (0.0),
15910  lngidl (0.0),
15911  lntun (0.0),
15912  lndiode (0.0),
15913  lnrecf0 (0.0),
15914  lnrecr0 (0.0),
15915  lisbjt (0.0),
15916  lisdif (0.0),
15917  lisrec (0.0),
15918  listun (0.0),
15919  lvrec0 (0.0),
15920  lvtun0 (0.0),
15921  lnbjt (0.0),
15922  llbjt0 (0.0),
15923  lvabjt (0.0),
15924  laely (0.0),
15925  lahli (0.0),
15926  lvsdfb (0.0),
15927  lvsdth (0.0),
15928  ldelvt (0.0),
15929  lxrcrg1 (0.0),
15930  lxrcrg2 (0.0),
15931  walphaGB1 (0.0),
15932  wbetaGB1 (0.0),
15933  walphaGB2 (0.0),
15934  wbetaGB2 (0.0),
15935  wndif (0.0),
15936  wntrecf (0.0),
15937  wntrecr (0.0),
15938  wxbjt (0.0),
15939  wxdif (0.0),
15940  wxrec (0.0),
15941  wxtun (0.0),
15942  waigc (0.0),
15943  wbigc (0.0),
15944  wcigc (0.0),
15945  waigsd (0.0),
15946  wbigsd (0.0),
15947  wcigsd (0.0),
15948  wnigc (0.0),
15949  wpigcd (0.0),
15950  wpoxedge (0.0),
15951  wnpeak (0.0),
15952  wk1w1 (0.0),
15953  wk1w2 (0.0),
15954  wkb1 (0.0),
15955  wketas (0.0),
15956  wpdibl1 (0.0),
15957  wpdibl2 (0.0),
15958  wpdiblb (0.0),
15959  wfbjtii (0.0),
15960  wbeta1 (0.0),
15961  wbeta2 (0.0),
15962  wvdsatii0 (0.0),
15963  wlii (0.0),
15964  wesatii (0.0),
15965  wsii0 (0.0),
15966  wsii1 (0.0),
15967  wsii2 (0.0),
15968  wsiid (0.0),
15969  wagidl (0.0),
15970  wbgidl (0.0),
15971  wngidl (0.0),
15972  wntun (0.0),
15973  wndiode (0.0),
15974  wnrecf0 (0.0),
15975  wnrecr0 (0.0),
15976  wisbjt (0.0),
15977  wisdif (0.0),
15978  wisrec (0.0),
15979  wistun (0.0),
15980  wvrec0 (0.0),
15981  wvtun0 (0.0),
15982  wnbjt (0.0),
15983  wlbjt0 (0.0),
15984  wvabjt (0.0),
15985  waely (0.0),
15986  wahli (0.0),
15987  wvsdfb (0.0),
15988  wvsdth (0.0),
15989  wdelvt (0.0),
15990  wxrcrg1 (0.0),
15991  wxrcrg2 (0.0),
15992  palphaGB1 (0.0),
15993  pbetaGB1 (0.0),
15994  palphaGB2 (0.0),
15995  pbetaGB2 (0.0),
15996  pndif (0.0),
15997  pntrecf (0.0),
15998  pntrecr (0.0),
15999  pxbjt (0.0),
16000  pxdif (0.0),
16001  pxrec (0.0),
16002  pxtun (0.0),
16003  paigc (0.0),
16004  pbigc (0.0),
16005  pcigc (0.0),
16006  paigsd (0.0),
16007  pbigsd (0.0),
16008  pcigsd (0.0),
16009  pnigc (0.0),
16010  ppigcd (0.0),
16011  ppoxedge (0.0),
16012  pnpeak (0.0),
16013  pk1w1 (0.0),
16014  pk1w2 (0.0),
16015  pkb1 (0.0),
16016  pketas (0.0),
16017  ppdibl1 (0.0),
16018  ppdibl2 (0.0),
16019  ppdiblb (0.0),
16020  pfbjtii (0.0),
16021  pbeta1 (0.0),
16022  pbeta2 (0.0),
16023  pvdsatii0 (0.0),
16024  plii (0.0),
16025  pesatii (0.0),
16026  psii0 (0.0),
16027  psii1 (0.0),
16028  psii2 (0.0),
16029  psiid (0.0),
16030  pagidl (0.0),
16031  pbgidl (0.0),
16032  pngidl (0.0),
16033  pntun (0.0),
16034  pndiode (0.0),
16035  pnrecf0 (0.0),
16036  pnrecr0 (0.0),
16037  pisbjt (0.0),
16038  pisdif (0.0),
16039  pisrec (0.0),
16040  pistun (0.0),
16041  pvrec0 (0.0),
16042  pvtun0 (0.0),
16043  pnbjt (0.0),
16044  plbjt0 (0.0),
16045  pvabjt (0.0),
16046  paely (0.0),
16047  pahli (0.0),
16048  pvsdfb (0.0),
16049  pvsdth (0.0),
16050  pdelvt (0.0),
16051  pxrcrg1 (0.0),
16052  pxrcrg2 (0.0),
16053  npeakGiven (false),
16054  csdminGiven (false),
16055  vsdthGiven (false),
16056  vsdfbGiven (false),
16057  gamma1Given (false),
16058  gamma2Given (false),
16059  vbxGiven (false),
16060  vbmGiven (false),
16061  xtGiven (false),
16062  k1Given (false),
16063  k2Given (false),
16064  vcrit (0.0),
16065  vtm (0.0),
16066  tox (0.0),
16067  toxm (0.0),
16068  cdsc (0.0),
16069  cdscb (0.0),
16070  cdscd (0.0),
16071  cit (0.0),
16072  nfactor (0.0),
16073  xj (0.0),
16074  vsat (0.0),
16075  at (0.0),
16076  a0 (0.0),
16077  ags (0.0),
16078  a1 (0.0),
16079  a2 (0.0),
16080  keta (0.0),
16081  nsub (0.0),
16082  ngate (0.0),
16083  gamma1 (0.0),
16084  gamma2 (0.0),
16085  vbx (0.0),
16086  vbm (0.0),
16087  xt (0.0),
16088  k1 (0.0),
16089  kt1 (0.0),
16090  kt1l (0.0),
16091  kt2 (0.0),
16092  k2 (0.0),
16093  k3 (0.0),
16094  k3b (0.0),
16095  w0 (0.0),
16096  nlx (0.0),
16097  dvt0 (0.0),
16098  dvt1 (0.0),
16099  dvt2 (0.0),
16100  dvt0w (0.0),
16101  dvt1w (0.0),
16102  dvt2w (0.0),
16103  drout (0.0),
16104  dsub (0.0),
16105  vth0 (0.0),
16106  ua (0.0),
16107  ua1 (0.0),
16108  ub (0.0),
16109  ub1 (0.0),
16110  uc (0.0),
16111  uc1 (0.0),
16112  u0 (0.0),
16113  ute (0.0),
16114  voff (0.0),
16115  delta (0.0),
16116  rdsw (0.0),
16117  prwg (0.0),
16118  prwb (0.0),
16119  prt (0.0),
16120  eta0 (0.0),
16121  etab (0.0),
16122  pclm (0.0),
16123  pvag (0.0),
16124  wr (0.0),
16125  dwg (0.0),
16126  dwb (0.0),
16127  b0 (0.0),
16128  b1 (0.0),
16129  alpha0 (0.0),
16130  beta0 (0.0),
16131  cgsl (0.0),
16132  cgdl (0.0),
16133  ckappa (0.0),
16134  cf (0.0),
16135  clc (0.0),
16136  cle (0.0),
16137  dwc (0.0),
16138  dlc (0.0),
16139  noff (0.0),
16140  acde (0.0),
16141  moin (0.0),
16142  tcjswg (0.0),
16143  tpbswg (0.0),
16144  lcdsc (0.0),
16145  lcdscb (0.0),
16146  lcdscd (0.0),
16147  lcit (0.0),
16148  lnfactor (0.0),
16149  lxj (0.0),
16150  lvsat (0.0),
16151  lat (0.0),
16152  la0 (0.0),
16153  lags (0.0),
16154  la1 (0.0),
16155  la2 (0.0),
16156  lketa (0.0),
16157  lnsub (0.0),
16158  lngate (0.0),
16159  lk1 (0.0),
16160  lkt1 (0.0),
16161  lkt1l (0.0),
16162  lkt2 (0.0),
16163  lk2 (0.0),
16164  lk3 (0.0),
16165  lk3b (0.0),
16166  lw0 (0.0),
16167  lnlx (0.0),
16168  ldvt0 (0.0),
16169  ldvt1 (0.0),
16170  ldvt2 (0.0),
16171  ldvt0w (0.0),
16172  ldvt1w (0.0),
16173  ldvt2w (0.0),
16174  ldrout (0.0),
16175  ldsub (0.0),
16176  lvth0 (0.0),
16177  lua (0.0),
16178  lua1 (0.0),
16179  lub (0.0),
16180  lub1 (0.0),
16181  luc (0.0),
16182  luc1 (0.0),
16183  lu0 (0.0),
16184  lute (0.0),
16185  lvoff (0.0),
16186  ldelta (0.0),
16187  lrdsw (0.0),
16188  lprwg (0.0),
16189  lprwb (0.0),
16190  lprt (0.0),
16191  leta0 (0.0),
16192  letab (0.0),
16193  lpclm (0.0),
16194  lpvag (0.0),
16195  lwr (0.0),
16196  ldwg (0.0),
16197  ldwb (0.0),
16198  lb0 (0.0),
16199  lb1 (0.0),
16200  lalpha0 (0.0),
16201  lbeta0 (0.0),
16202  lcgsl (0.0),
16203  lcgdl (0.0),
16204  lckappa (0.0),
16205  lnoff (0.0),
16206  lacde (0.0),
16207  lmoin (0.0),
16208  wcdsc (0.0),
16209  wcdscb (0.0),
16210  wcdscd (0.0),
16211  wcit (0.0),
16212  wnfactor (0.0),
16213  wxj (0.0),
16214  wvsat (0.0),
16215  wat (0.0),
16216  wa0 (0.0),
16217  wags (0.0),
16218  wa1 (0.0),
16219  wa2 (0.0),
16220  wketa (0.0),
16221  wnsub (0.0),
16222  wngate (0.0),
16223  wk1 (0.0),
16224  wkt1 (0.0),
16225  wkt1l (0.0),
16226  wkt2 (0.0),
16227  wk2 (0.0),
16228  wk3 (0.0),
16229  wk3b (0.0),
16230  ww0 (0.0),
16231  wnlx (0.0),
16232  wdvt0 (0.0),
16233  wdvt1 (0.0),
16234  wdvt2 (0.0),
16235  wdvt0w (0.0),
16236  wdvt1w (0.0),
16237  wdvt2w (0.0),
16238  wdrout (0.0),
16239  wdsub (0.0),
16240  wvth0 (0.0),
16241  wua (0.0),
16242  wua1 (0.0),
16243  wub (0.0),
16244  wub1 (0.0),
16245  wuc (0.0),
16246  wuc1 (0.0),
16247  wu0 (0.0),
16248  wute (0.0),
16249  wvoff (0.0),
16250  wdelta (0.0),
16251  wrdsw (0.0),
16252  wprwg (0.0),
16253  wprwb (0.0),
16254  wprt (0.0),
16255  weta0 (0.0),
16256  wetab (0.0),
16257  wpclm (0.0),
16258  wpvag (0.0),
16259  wwr (0.0),
16260  wdwg (0.0),
16261  wdwb (0.0),
16262  wb0 (0.0),
16263  wb1 (0.0),
16264  walpha0 (0.0),
16265  wbeta0 (0.0),
16266  wcgsl (0.0),
16267  wcgdl (0.0),
16268  wckappa (0.0),
16269  wnoff (0.0),
16270  wacde (0.0),
16271  wmoin (0.0),
16272  pcdsc (0.0),
16273  pcdscb (0.0),
16274  pcdscd (0.0),
16275  pcit (0.0),
16276  pnfactor (0.0),
16277  pxj (0.0),
16278  pvsat (0.0),
16279  pat (0.0),
16280  pa0 (0.0),
16281  pags (0.0),
16282  pa1 (0.0),
16283  pa2 (0.0),
16284  pketa (0.0),
16285  pnsub (0.0),
16286  pngate (0.0),
16287  pk1 (0.0),
16288  pkt1 (0.0),
16289  pkt1l (0.0),
16290  pkt2 (0.0),
16291  pk2 (0.0),
16292  pk3 (0.0),
16293  pk3b (0.0),
16294  pw0 (0.0),
16295  pnlx (0.0),
16296  pdvt0 (0.0),
16297  pdvt1 (0.0),
16298  pdvt2 (0.0),
16299  pdvt0w (0.0),
16300  pdvt1w (0.0),
16301  pdvt2w (0.0),
16302  pdrout (0.0),
16303  pdsub (0.0),
16304  pvth0 (0.0),
16305  pua (0.0),
16306  pua1 (0.0),
16307  pub (0.0),
16308  pub1 (0.0),
16309  puc (0.0),
16310  puc1 (0.0),
16311  pu0 (0.0),
16312  pute (0.0),
16313  pvoff (0.0),
16314  pdelta (0.0),
16315  prdsw (0.0),
16316  pprwg (0.0),
16317  pprwb (0.0),
16318  pprt (0.0),
16319  peta0 (0.0),
16320  petab (0.0),
16321  ppclm (0.0),
16322  ppvag (0.0),
16323  pwr (0.0),
16324  pdwg (0.0),
16325  pdwb (0.0),
16326  pb0 (0.0),
16327  pb1 (0.0),
16328  palpha0 (0.0),
16329  pbeta0 (0.0),
16330  pcgsl (0.0),
16331  pcgdl (0.0),
16332  pckappa (0.0),
16333  pnoff (0.0),
16334  pacde (0.0),
16335  pmoin (0.0),
16336  tnom (0.0),
16337  cgso (0.0),
16338  cgdo (0.0),
16339  xpart (0.0),
16340  sheetResistance (0.0),
16341  GatesidewallJctPotential (0.0),
16342  unitLengthGateSidewallJctCap (0.0),
16343  Lint (0.0),
16344  Ll (0.0),
16345  Llc (0.0),
16346  Lln (0.0),
16347  Lw (0.0),
16348  Lwc (0.0),
16349  Lwn (0.0),
16350  Lwl (0.0),
16351  Lwlc (0.0),
16352  Wint (0.0),
16353  Wl (0.0),
16354  Wlc (0.0),
16355  Wln (0.0),
16356  Ww (0.0),
16357  Wwc (0.0),
16358  Wwn (0.0),
16359  Wwl (0.0),
16360  Wwlc (0.0),
16361  cox (0.0),
16362  factor1 (0.0),
16363  oxideTrapDensityA (0.0),
16364  oxideTrapDensityB (0.0),
16365  oxideTrapDensityC (0.0),
16366  em (0.0),
16367  ef (0.0),
16368  af (0.0),
16369  kf (0.0),
16370  vth0Given (false),
16371  igbModGiven (false),
16372  Vtm0 (0.0),
16373  Eg0 (0.0),
16374  ni (0.0)
16375 {
16376  if (getType() != "")
16377  {
16378  if (getType() == "NMOS") {
16379  dtype = CONSTNMOS;
16380  }
16381  else if (getType() == "PMOS") {
16382  dtype = CONSTPMOS;
16383  }
16384  else
16385  {
16386  UserError0(*this) << "Could not recognize the type for model " << getName();
16387  }
16388  }
16389 
16390  // Set params to constant default values:
16391  setDefaultParams ();
16392 
16393  // Set params according to .model line and constant defaults from metadata:
16394  setModParams (MB.params);
16395 
16396  // Set any non-constant parameter defaults:
16397 
16398 #ifdef Xyce_B3SOI_USE_DEFL
16399  if (!model_lGiven)
16401  if (!model_wGiven)
16403 #endif
16404 
16405  if (!given("TNOM"))
16407  if (!given("TOXM"))
16408  toxm = tox; /* v3.2 */
16409  if (!given("TOXQM"))
16410  toxqm = tox;
16411  if (!given("CF"))
16412  cf = 2.0 * CONSTEPSOX / M_PI * log(1.0 + 0.4e-6 / tox);
16413  if (!vth0Given)
16414  vth0 = (dtype == CONSTNMOS) ? 0.7 : -0.7;
16415  if (!given("UC"))
16416  uc = (mobMod == 3) ? -0.0465 : -0.0465e-9;
16417  if (!given("UC1"))
16418  uc1 = (mobMod == 3) ? -0.056 : -0.056e-9;
16419  if (!given("U0"))
16420  u0 = (dtype == CONSTNMOS) ? 0.067 : 0.025;
16421  if (!given("VOXH"))
16422  voxh = 5.0;
16423  if (!given("DELTAVOX"))
16424  deltavox = 0.005;
16425  if (!given("AIGC"))
16426  aigc = (dtype == CONSTNMOS) ? 0.43 : 0.31;
16427  if (!given("BIGC"))
16428  bigc = (dtype == CONSTNMOS) ? 0.054 : 0.024;
16429  if (!given("CIGC"))
16430  cigc = (dtype == CONSTNMOS) ? 0.075 : 0.03;
16431  if (!given("AIGSD"))
16432  aigsd = (dtype == CONSTNMOS) ? 0.43 : 0.31;
16433  if (!given("BIGSD"))
16434  bigsd = (dtype == CONSTNMOS) ? 0.054 : 0.024;
16435  if (!given("CIGSD"))
16436  cigsd = (dtype == CONSTNMOS) ? 0.075 : 0.03;
16437  if (!given("NOIA"))
16438  {
16439  if (dtype == CONSTNMOS)
16440  oxideTrapDensityA = 6.25e41;
16441  else
16442  oxideTrapDensityA=6.188e40;
16443  }
16444  if (!given("NOIB"))
16445  {
16446  if (dtype == CONSTNMOS)
16447  oxideTrapDensityB = 3.125e26;
16448  else
16449  oxideTrapDensityB = 1.5e25;
16450  }
16451 
16452  // PMC It is assumed tox does not change in any temperature
16453  // interpolation done in Instance::updateTemperature()
16454  cox = 3.453133e-11 / tox;
16455  if (!given("CGDO"))
16456  {
16457  if (given("DLC") && (dlc > 0.0))
16458  cgdo = dlc * cox - cgdl ;
16459  else
16460  cgdo = 0.6 * xj * cox;
16461  }
16462  if (!given("CGSO"))
16463  {
16464  if (given("DLC") && (dlc > 0.0))
16465  cgso = dlc * cox - cgsl ;
16466  else
16467  cgso = 0.6 * xj * cox;
16468  }
16469 
16470  // Calculate any parameters specified as expressions:
16471 
16473 
16474  // calculate dependent (ie computed) params and check for errors:
16475 
16476  if ((soiMod != 0) && (soiMod != 1) && (soiMod != 2) && (soiMod != 3))
16477  {
16478  soiMod = 0;
16479  UserWarning(*this) << "soiMod has been set to its default value: 0";
16480  }
16481  else if ((rgateMod != 0) && (rgateMod != 1) && (rgateMod != 2) && (rgateMod != 3))
16482  {
16483  rgateMod = 0;
16484  UserWarning(*this) << "gateMod has been set to its default value: 0";
16485  }
16486  if ((fnoiMod != 0) && (fnoiMod != 1))
16487  {
16488  fnoiMod = 1;
16489  UserWarning(*this) << "noiMod has been set to default value: 1";
16490  }
16491  if ((tnoiMod != 0) && (tnoiMod != 1))
16492  {
16493  tnoiMod = 0;
16494  UserWarning(*this) << "tnoiMod has been set to default value: 0";
16495  }
16496  if (GatesidewallJctPotential < 0.1)
16497  {
16499  UserWarning(*this) << "Given pbswg is less than 0.1. Pbswg is set to 0.1.\n";
16500  }
16501  sizeDependParamList.clear();
16502 
16503  processParams ();
16504 }
16505 
16506 //-----------------------------------------------------------------------------
16507 // Function : Model::~Model
16508 // Purpose : destructor
16509 // Special Notes :
16510 // Scope : public
16511 // Creator : Dave Shirley
16512 // Creation Date : 05/20/04
16513 //-----------------------------------------------------------------------------
16515 {
16516  std::list<SizeDependParam*>::iterator it_dpL =
16517  sizeDependParamList.begin();
16518  std::list<SizeDependParam*>::iterator end_dpL =
16519  sizeDependParamList.end();
16520  for( ; it_dpL != end_dpL; ++it_dpL )
16521  delete (*it_dpL);
16522 
16523  sizeDependParamList.clear ();
16524 
16525  std::vector<Instance*>::iterator iter;
16526  std::vector<Instance*>::iterator first = instanceContainer.begin();
16527  std::vector<Instance*>::iterator last = instanceContainer.end();
16528 
16529  for (iter=first; iter!=last; ++iter)
16530  {
16531  delete (*iter);
16532  }
16533 }
16534 
16535 
16536 //-----------------------------------------------------------------------------
16537 // Function : Model::printOutInstances
16538 // Purpose : debugging tool.
16539 // Special Notes :
16540 // Scope : public
16541 // Creator : Dave Shirley
16542 // Creation Date : 05/20/04
16543 //-----------------------------------------------------------------------------
16544 std::ostream &Model::printOutInstances(std::ostream &os) const
16545 {
16546  std::vector<Instance*>::const_iterator iter;
16547  std::vector<Instance*>::const_iterator first = instanceContainer.begin();
16548  std::vector<Instance*>::const_iterator last = instanceContainer.end();
16549 
16550  int i;
16551  os << std::endl;
16552  os << " name modelName Parameters" << std::endl;
16553 
16554  for (i=0, iter=first; iter!=last; ++iter,++i)
16555  {
16556  os << " " << i << ": " << (*iter)->getName() << "\t";
16557  os << getName();
16558  os << std::endl;
16559  }
16560 
16561  os << std::endl;
16562 
16563  return os;
16564 }
16565 
16566 //-----------------------------------------------------------------------------
16567 // Function : Model::forEachInstance
16568 // Purpose :
16569 // Special Notes :
16570 // Scope : public
16571 // Creator : David Baur
16572 // Creation Date : 2/4/2014
16573 //-----------------------------------------------------------------------------
16574 /// Apply a device instance "op" to all instances associated with this
16575 /// model
16576 ///
16577 /// @param[in] op Operator to apply to all instances.
16578 ///
16579 ///
16580 void Model::forEachInstance(DeviceInstanceOp &op) const /* override */
16581 {
16582  for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
16583  op(*it);
16584 }
16585 
16586 
16587 
16588 //----------------------------------------------------------------------------
16589 // Function : Model::clearTemperatureData
16590 //
16591 // Purpose : This is mainly here to delete rid of the size
16592 // dependent parameters, which are also temperature dependent.
16593 //
16594 // Special Notes : This is called right before the circuit temperature is
16595 // changed.
16596 //
16597 // Scope : public
16598 // Creator : Eric R. Keiter, 9233, computation sciences
16599 // Creation Date : 03/08/2005
16600 //----------------------------------------------------------------------------
16602 {
16603  std::list<SizeDependParam*>::iterator it_dpL =
16604  sizeDependParamList.begin();
16605 
16606  std::list<SizeDependParam*>::iterator end_dpL =
16607  sizeDependParamList.end();
16608 
16609  for( ; it_dpL != end_dpL; ++it_dpL )
16610  delete (*it_dpL);
16611 
16612  sizeDependParamList.clear ();
16613 
16614  return true;
16615 }
16616 
16617 //-----------------------------------------------------------------------------
16618 // MOSFET B3SOI Master functions:
16619 //-----------------------------------------------------------------------------
16620 
16621 //-----------------------------------------------------------------------------
16622 // Function : Master::updateState
16623 // Purpose :
16624 // Special Notes :
16625 // Scope : public
16626 // Creator : Eric Keiter, SNL
16627 // Creation Date : 01/06/09
16628 //-----------------------------------------------------------------------------
16629 bool Master::updateState (double * solVec, double * staVec, double * stoVec)
16630 {
16631  bool bsuccess = true;
16632 
16633  for (InstanceVector::const_iterator it = getInstanceBegin(); it != getInstanceEnd(); ++it)
16634  {
16635  Instance & mi = *(*it);
16636 
16637  double * stoVec = mi.extData.nextStoVectorRawPtr;
16638 
16639  // save voltage drops
16640  bool btmp = mi.updateIntermediateVars ();
16641  bsuccess = bsuccess && btmp;
16642 
16643  // voltage drops:
16644  stoVec[mi.li_store_vbd] = mi.vbd;
16645  stoVec[mi.li_store_vbs] = mi.vbs;
16646  stoVec[mi.li_store_vgs] = mi.vgs;
16647  stoVec[mi.li_store_vds] = mi.vds;
16648  stoVec[mi.li_store_ves] = mi.ves;
16649  stoVec[mi.li_store_vps] = mi.vps;
16650 
16651  stoVec[mi.li_store_vgp] = mi.Vgp;
16652  stoVec[mi.li_store_vd] = mi.Vdp;
16653  stoVec[mi.li_store_vs] = mi.Vsp;
16654  stoVec[mi.li_store_vp] = mi.Vp;
16655  stoVec[mi.li_store_ve] = mi.Ve;
16656  stoVec[mi.li_store_vg] = mi.Vg;
16657  stoVec[mi.li_store_vgm] = mi.Vgm;
16658  stoVec[mi.li_store_deltemp] = mi.delTemp;
16659 
16660  stoVec[mi.li_store_vges] = mi.vges;
16661  stoVec[mi.li_store_vgms] = mi.vgms;
16662 
16663  // intrinsic capacitors:
16664  staVec[mi.li_state_qb] = mi.qb;
16665  staVec[mi.li_state_qg] = mi.qg;
16666  staVec[mi.li_state_qd] = mi.qd;
16667  staVec[mi.li_state_qe] = mi.qe;
16668  staVec[mi.li_state_qgmid] = mi.qgmid;
16669  staVec[mi.li_state_qth] = mi.qth;
16670 
16671  // if this is the first newton step of the first time step
16672  // of the transient simulation, we need to enforce that the
16673  // time derivatives w.r.t. charge are zero. This is to maintain 3f5
16674  // compatibility. ERK.
16675 
16676  // Note: I think this kind of thing is enforced (or should be enforced,
16677  // anyway) at the time integration level. So I'm not sure this step is
16678  // really needed, at least for new-DAE. Derivatives out of the DCOP
16679  // are supposed to be zero at the first newton step.
16680 
16681  if (!(getSolverState().dcopFlag) && getSolverState().initTranFlag && getSolverState().newtonIter==0)
16682  {
16683  double * currStaVec = mi.extData.currStaVectorRawPtr;
16684 
16685  // intrinsic capacitors:
16686  currStaVec[mi.li_state_qb] = mi.qb;
16687  currStaVec[mi.li_state_qg] = mi.qg;
16688  currStaVec[mi.li_state_qd] = mi.qd;
16689  currStaVec[mi.li_state_qe] = mi.qe;
16690  currStaVec[mi.li_state_qgmid] = mi.qgmid;
16691  currStaVec[mi.li_state_qth] = mi.qth;
16692  }
16693  }
16694 // }
16695 
16696  return bsuccess;
16697 }
16698 
16699 //-----------------------------------------------------------------------------
16700 // Function : Master::loadDAEVectors
16701 // Purpose :
16702 // Special Notes :
16703 // Scope : public
16704 // Creator : Eric Keiter, SNL
16705 // Creation Date : 01/06/09
16706 //-----------------------------------------------------------------------------
16707 bool Master::loadDAEVectors (double * solVec, double * fVec, double *qVec, double * bVec, double * storeLeadF, double * storeLeadQ)
16708 {
16709  for (InstanceVector::const_iterator it = getInstanceBegin(); it != getInstanceEnd(); ++it)
16710  {
16711  Instance & mi = *(*it);
16712 
16713  double * dFdxdVp = mi.extData.dFdxdVpVectorRawPtr;
16714  double * dQdxdVp = mi.extData.dQdxdVpVectorRawPtr;
16715 
16716  // load F:
16717 
16718  double Coef_f_body=0.0;
16719  double Coef_f_extBody=0.0;
16720  double Coef_f_gate=0.0;
16721  double Coef_f_gatePrime=0.0;
16722  double Coef_f_gateMid=0.0;
16723  double Coef_f_drain=0.0;
16724  double Coef_f_drainPrime=0.0;
16725  double Coef_f_source=0.0;
16726  double Coef_f_sourcePrime=0.0;
16727  double Coef_f_substrate=0.0;
16728  double Coef_f_temp=0.0;
16729 
16730  mi.Gmin = getDeviceOptions().gmin * 1e-6;
16731  mi.geltd = mi.grgeltd;
16732 
16733  // I have elected to add in the Gmin-based Jdxp terms right here.
16734  // In adding them, I've made use of the fact that whether we need voltage
16735  // limiting or not, we have to add Gmin*somedrop. If we need voltage
16736  // limiting, we have to add in Gmin*(somedrop-somedrop_orig) with the
16737  // opposite sign. I've simplified that down to the single term that
16738  // remains, which is correct even if voltage limiting is not needed
16739  // --- TVR
16740 
16741  double iGmin_bs = mi.model_.dtype*(mi.Gmin*mi.vbs_orig);
16742  double iGmin_gd = mi.model_.dtype*(mi.Gmin*mi.vgd_orig);
16743 
16744  if (mi.soiMod != 2)
16745  {
16746  Coef_f_body -= (mi.model_.dtype*(mi.ceqbody)
16747  + iGmin_bs)* mi.numberParallel;
16748  }
16749 
16750  Coef_f_gatePrime -= (mi.model_.dtype*(mi.ceqgate - mi.ceqgcrg)
16751  + mi.Igtoteq + iGmin_gd)* mi.numberParallel;
16752 
16753  Coef_f_drainPrime += (mi.model_.dtype*(mi.ceqbd) - mi.cdreq + mi.Idtoteq
16754  + mi.Idrain + iGmin_gd) * mi.numberParallel;
16755 
16756  Coef_f_sourcePrime += (mi.cdreq
16757  + mi.model_.dtype*(mi.ceqbs)
16758  + mi.Istoteq + mi.Isource + iGmin_bs) * mi.numberParallel;
16759 
16760  if (mi.rgateMod == 2)
16761  {
16762  Coef_f_gate -= mi.model_.dtype*mi.ceqgcrg * mi.numberParallel;
16763  }
16764  else if (mi.rgateMod == 3)
16765  {
16766  Coef_f_gateMid -= mi.model_.dtype*(mi.ceqgcrg) * mi.numberParallel;
16767  }
16768 
16769  if (mi.bodyMod == 1)
16770  {
16771  Coef_f_extBody += mi.model_.dtype*mi.ceqbodcon * mi.numberParallel;
16772  }
16773 
16774  if (mi.selfheat)
16775  {
16776  Coef_f_temp -= (mi.ceqth + mi.Ith) * mi.numberParallel;
16777  }
16778 
16779  ////////////////////////////////////////////////////////////////////////
16780  // This next section deals with linear resistor currents (mostly) that
16781  // would not be part of the spice3f5 RHS load.
16782  //
16783  // These include the source and drain load resistors, the body tie
16784  // resistor and the various options for gate resistors.
16785  //
16786  // Isource and Idrain correspond to the linear load resistors.
16787 
16788  if (mi.sNodePrime == 1) Coef_f_source -= mi.Isource * mi.numberParallel;
16789  if (mi.dNodePrime == 1) Coef_f_drain -= mi.Idrain * mi.numberParallel;
16790 
16791  // Note: extra body nodes were already handled, above.
16792 
16793  // Handle extra gate nodes, if they exist.
16794  // mi.rgateMod==0 no gate resistor.
16795  // mi.rgateMod==1 linear gate resistor
16796  // mi.rgateMod==2 nonlinear gate resistor
16797  // mi.rgateMod==3 2 gate resistors, in series.
16798  //
16799  if (mi.rgateMod > 0)
16800  {
16801  Coef_f_gate -= mi.Igate * mi.numberParallel;
16802  if (mi.rgateMod == 3)
16803  {
16804  Coef_f_gateMid -= (mi.IgateMid - mi.Igate) * mi.numberParallel;
16805  Coef_f_gatePrime += mi.IgateMid * mi.numberParallel;
16806  }
16807  else
16808  {
16809  Coef_f_gatePrime += mi.Igate * mi.numberParallel;
16810  }
16811  }
16812 
16813  // Now place all the calculated values in the RHS vector.
16814  if(mi.li_Body != -1)
16815  {
16816  fVec[mi.li_Body ] -= Coef_f_body;
16817  }
16818  if(mi.li_ExtBody != -1)
16819  {
16820  fVec[mi.li_ExtBody ] -= Coef_f_extBody;
16821  }
16822  fVec[mi.li_Gate ] -= Coef_f_gate;
16823  fVec[mi.li_GatePrime ] -= Coef_f_gatePrime;
16824  fVec[mi.li_GateMid ] -= Coef_f_gateMid;
16825  fVec[mi.li_Drain ] -= Coef_f_drain;
16826  fVec[mi.li_DrainPrime ] -= Coef_f_drainPrime;
16827  fVec[mi.li_Source ] -= Coef_f_source;
16828  fVec[mi.li_SourcePrime] -= Coef_f_sourcePrime;
16829  fVec[mi.li_Substrate ] -= Coef_f_substrate;
16830 
16831  if(mi.li_Temperature != -1)
16832  {
16833  fVec[mi.li_Temperature] -= Coef_f_temp;
16834  }
16835 
16836  if( mi.loadLeadCurrent )
16837  {
16838 
16839  if( mi.dNodePrime != 1 )
16840  {
16841  // drain prime is the same as drain so add in its contribution
16842  storeLeadF[mi.li_store_dev_id] = -Coef_f_drain - Coef_f_drainPrime;
16843  }
16844  else
16845  {
16846  storeLeadF[mi.li_store_dev_id] = -Coef_f_drain;
16847  }
16848  if( mi.gNodePrime != 1 )
16849  {
16850  // gate prime is the same as gate so add in its contribution
16851  storeLeadF[mi.li_store_dev_ig] = -Coef_f_gate - Coef_f_gatePrime;
16852  }
16853  else
16854  {
16855  storeLeadF[mi.li_store_dev_ig] = -Coef_f_gate;
16856  }
16857  if( mi.sNodePrime != 1 )
16858  {
16859  // source prime is the same as source so add in its contribution
16860  storeLeadF[mi.li_store_dev_is] = -Coef_f_source - Coef_f_sourcePrime;
16861  }
16862  else
16863  {
16864  storeLeadF[mi.li_store_dev_is] = -Coef_f_source;
16865  }
16866 
16867  storeLeadF[mi.li_store_dev_ie] = -Coef_f_substrate;
16868  if(mi.li_Body != -1)
16869  {
16870  storeLeadF[mi.li_store_dev_ib] = -Coef_f_body;
16871  }
16872  else
16873  {
16874  storeLeadF[mi.li_store_dev_ib] = 0.0;
16875  }
16876  }
16877 
16878  if( getSolverState().dcopFlag && mi.icVDSGiven )
16879  {
16880  if ( mi.icVDSGiven )
16881  {
16882  double coef = (mi.extData.nextSolVectorRawPtr)[mi.li_Ids];
16883  fVec[mi.li_Drain] += coef;
16884  fVec[mi.li_Source] += -coef;
16885  if( mi.loadLeadCurrent )
16886  {
16887  storeLeadF[mi.li_store_dev_id] = coef;
16888  storeLeadF[mi.li_store_dev_is] = -coef;
16889  }
16890  double cVs = (mi.extData.nextSolVectorRawPtr)[mi.li_Source];
16891  double cVd = (mi.extData.nextSolVectorRawPtr)[mi.li_Drain];
16892  fVec[mi.li_Ids] += (cVd - cVs - mi.icVDS);
16893  }
16894  if ( mi.icVGSGiven )
16895  {
16896  double coef = (mi.extData.nextSolVectorRawPtr)[mi.li_Igs];
16897  fVec[mi.li_Gate] += coef;
16898  fVec[mi.li_Source] += -coef;
16899  if( mi.loadLeadCurrent )
16900  {
16901  storeLeadF[mi.li_store_dev_ig] = coef;
16902  storeLeadF[mi.li_store_dev_is] = -coef;
16903  }
16904  double cVs = (mi.extData.nextSolVectorRawPtr)[mi.li_Source];
16905  double cVg = (mi.extData.nextSolVectorRawPtr)[mi.li_Gate];
16906  fVec[mi.li_Igs] += (cVg - cVs - mi.icVGS);
16907  }
16908  if ( mi.icVBSGiven )
16909  {
16910  double coef = (mi.extData.nextSolVectorRawPtr)[mi.li_Ibs];
16911  fVec[mi.li_Body] += coef;
16912  fVec[mi.li_Source] += -coef;
16913  if( mi.loadLeadCurrent )
16914  {
16915  storeLeadF[mi.li_store_dev_ib] = coef;
16916  storeLeadF[mi.li_store_dev_is] = -coef;
16917  }
16918  double cVs = (mi.extData.nextSolVectorRawPtr)[mi.li_Source];
16919  double cVb = (mi.extData.nextSolVectorRawPtr)[mi.li_Body];
16920  fVec[mi.li_Ibs] += (cVb - cVs - mi.icVBS);
16921  }
16922  if ( mi.icVESGiven )
16923  {
16924  double coef = (mi.extData.nextSolVectorRawPtr)[mi.li_Ies];
16925  fVec[mi.li_Substrate] += coef;
16926  fVec[mi.li_Source] += -coef;
16927  if( mi.loadLeadCurrent )
16928  {
16929  storeLeadF[mi.li_store_dev_ie] = coef;
16930  storeLeadF[mi.li_store_dev_is] = -coef;
16931  }
16932  double cVs = (mi.extData.nextSolVectorRawPtr)[mi.li_Source];
16933  double cVe = (mi.extData.nextSolVectorRawPtr)[mi.li_Substrate];
16934  fVec[mi.li_Ies] += (cVe - cVs - mi.icVES);
16935  }
16936  if ( mi.icVPSGiven )
16937  {
16938  double coef = (mi.extData.nextSolVectorRawPtr)[mi.li_Ips];
16939  fVec[mi.li_ExtBody] += coef;
16940  fVec[mi.li_Source] += -coef;
16941  if( mi.loadLeadCurrent )
16942  {
16943  storeLeadF[mi.li_store_dev_ib] = coef;
16944  storeLeadF[mi.li_store_dev_is] = -coef;
16945  }
16946  double cVs = (mi.extData.nextSolVectorRawPtr)[mi.li_Source];
16947  double cVp = (mi.extData.nextSolVectorRawPtr)[mi.li_ExtBody];
16948  fVec[mi.li_Ies] += (cVp - cVs - mi.icVPS);
16949  }
16950  }
16951 
16952  // Set up the Jdxp vector:
16953  double Coef_f_body_Jdxp = 0.0;
16954  double Coef_f_extBody_Jdxp = 0.0;
16955  double Coef_f_gate_Jdxp = 0.0;
16956  double Coef_f_gatePrime_Jdxp = 0.0;
16957  double Coef_f_gateMid_Jdxp = 0.0;
16958  double Coef_f_drain_Jdxp = 0.0;
16959  double Coef_f_drainPrime_Jdxp = 0.0;
16960  double Coef_f_source_Jdxp = 0.0;
16961  double Coef_f_sourcePrime_Jdxp = 0.0;
16962  double Coef_f_substrate_Jdxp = 0.0;
16963  double Coef_f_temp_Jdxp = 0.0;
16964 
16965  double iGmin_bs_Jdxp = mi.model_.dtype*mi.Gmin*(mi.vbs-mi.vbs_orig);
16966  double iGmin_gd_Jdxp = mi.model_.dtype*mi.Gmin*(mi.vgd-mi.vgd_orig);
16967 
16969  {
16970  if (mi.soiMod != 2)
16971  {
16972  Coef_f_body_Jdxp -=
16973  (mi.model_.dtype*(mi.ceqbody_Jdxp )
16974  - iGmin_bs_Jdxp)* mi.numberParallel;
16975  }
16976 
16977  Coef_f_gatePrime_Jdxp -=
16978  (mi.model_.dtype*(mi.ceqgate_Jdxp - mi.ceqgcrg_Jdxp)
16979  + mi.Igtoteq_Jdxp - iGmin_gd_Jdxp)* mi.numberParallel;
16980 
16981  Coef_f_drainPrime_Jdxp +=
16982  (mi.model_.dtype*(mi.ceqbd_Jdxp)
16983  - mi.cdreq_Jdxp + mi.Idtoteq_Jdxp
16984  + mi.Idrain_Jdxp - iGmin_gd_Jdxp) * mi.numberParallel;
16985 
16986  Coef_f_sourcePrime_Jdxp += (mi.cdreq_Jdxp
16987  + mi.model_.dtype*(mi.ceqbs_Jdxp)
16988  + mi.Istoteq_Jdxp
16989  + mi.Isource_Jdxp - iGmin_bs_Jdxp
16990  ) * mi.numberParallel;
16991 
16992  Coef_f_substrate_Jdxp -= mi.model_.dtype*mi.ceqqe_Jdxp * mi.numberParallel;
16993 
16994  if (mi.rgateMod == 2)
16995  {
16996  Coef_f_gate_Jdxp -=
16998  }
16999  else if (mi.rgateMod == 3)
17000  {
17001  Coef_f_gateMid_Jdxp -=
17002  mi.model_.dtype*(mi.ceqgcrg_Jdxp) * mi.numberParallel;
17003  }
17004 
17005  if (mi.bodyMod == 1)
17006  {
17007  Coef_f_extBody_Jdxp += mi.model_.dtype*mi.ceqbodcon_Jdxp * mi.numberParallel;
17008  }
17009 
17010  if (mi.selfheat)
17011  {
17012  Coef_f_temp_Jdxp -= ( mi.ceqth_Jdxp ) * mi.numberParallel;
17013  }
17014 
17015  if (mi.sNodePrime == 1) Coef_f_source_Jdxp -= mi.Isource_Jdxp * mi.numberParallel;
17016  if (mi.dNodePrime == 1) Coef_f_drain_Jdxp -= mi.Idrain_Jdxp * mi.numberParallel;
17017 
17018  if (mi.rgateMod > 0)
17019  {
17020  Coef_f_gate_Jdxp -= mi.Igate_Jdxp * mi.numberParallel;
17021  if (mi.rgateMod == 3)
17022  {
17023  Coef_f_gateMid_Jdxp -= (mi.IgateMid_Jdxp - mi.Igate_Jdxp) * mi.numberParallel;
17024  Coef_f_gatePrime_Jdxp += mi.IgateMid_Jdxp * mi.numberParallel;
17025  }
17026  else
17027  {
17028  Coef_f_gatePrime_Jdxp += mi.Igate_Jdxp * mi.numberParallel;
17029  }
17030  }
17031 
17032  if(mi.li_Body != -1)
17033  {
17034  dFdxdVp[mi.li_Body ] += Coef_f_body_Jdxp;
17035  }
17036  if(mi.li_ExtBody != -1)
17037  {
17038  dFdxdVp[mi.li_ExtBody ] += Coef_f_extBody_Jdxp;
17039  }
17040  dFdxdVp[mi.li_Gate ] += Coef_f_gate_Jdxp;
17041  dFdxdVp[mi.li_GatePrime ] += Coef_f_gatePrime_Jdxp;
17042  dFdxdVp[mi.li_GateMid ] += Coef_f_gateMid_Jdxp;
17043  dFdxdVp[mi.li_Drain ] += Coef_f_drain_Jdxp;
17044  dFdxdVp[mi.li_DrainPrime ] += Coef_f_drainPrime_Jdxp;
17045  dFdxdVp[mi.li_Source ] += Coef_f_source_Jdxp;
17046  dFdxdVp[mi.li_SourcePrime] += Coef_f_sourcePrime_Jdxp;
17047  dFdxdVp[mi.li_Substrate ] += Coef_f_substrate_Jdxp;
17048  if(mi.li_Temperature != -1)
17049  {
17050  dFdxdVp[mi.li_Temperature] += Coef_f_temp_Jdxp;
17051  }
17052  }
17053 
17054  // load Q:
17055 
17056  mi.auxChargeCalculations ();
17057 
17058  double Coef_q_body=0.0;
17059  double Coef_q_extBody=0.0;
17060  double Coef_q_gate=0.0;
17061  double Coef_q_gatePrime=0.0;
17062  double Coef_q_gateMid=0.0;
17063  double Coef_q_drainPrime=0.0;
17064  double Coef_q_sourcePrime=0.0;
17065  double Coef_q_substrate=0.0;
17066  double Coef_q_temp=0.0;
17067 
17068  if (mi.soiMod != 2)
17069  {
17070  Coef_q_body -= (mi.model_.dtype*(mi.Qeqqb))* mi.numberParallel;
17071  }
17072 
17073  Coef_q_gatePrime -= (mi.model_.dtype*(mi.Qeqqg))* mi.numberParallel;
17074 
17075  Coef_q_drainPrime += (mi.model_.dtype*(-mi.Qeqqd)) * mi.numberParallel;
17076 
17077  Coef_q_sourcePrime += ( + mi.model_.dtype*(+ mi.Qeqqg + mi.Qeqqb
17078  + mi.Qeqqd + mi.Qeqqe + mi.Qeqqgmid)) * mi.numberParallel;
17079 
17080  Coef_q_substrate -= mi.model_.dtype*mi.Qeqqe * mi.numberParallel;
17081 
17082  if (mi.rgateMod == 3)
17083  {
17084  Coef_q_gateMid -= mi.model_.dtype*(mi.Qeqqgmid) * mi.numberParallel;
17085  }
17086 
17087  if (mi.selfheat)
17088  {
17089  Coef_q_temp -= (mi.Qeqqth) * mi.numberParallel;
17090  }
17091 
17092  ////////////////////////////////////////////////////////////////////////
17093  // Now place all the calculated values in the Q vector.
17094 
17095  if(mi.li_Body != -1)
17096  {
17097  qVec[mi.li_Body ] -= Coef_q_body;
17098  }
17099  if(mi.li_ExtBody != -1)
17100  {
17101  qVec[mi.li_ExtBody ] -= Coef_q_extBody;
17102  }
17103  qVec[mi.li_Gate ] -= Coef_q_gate;
17104  qVec[mi.li_GatePrime ] -= Coef_q_gatePrime;
17105  qVec[mi.li_GateMid ] -= Coef_q_gateMid;
17106  qVec[mi.li_DrainPrime ] -= Coef_q_drainPrime;
17107  qVec[mi.li_SourcePrime] -= Coef_q_sourcePrime;
17108  qVec[mi.li_Substrate ] -= Coef_q_substrate;
17109  if(mi.li_Temperature != -1)
17110  {
17111  qVec[mi.li_Temperature] -= Coef_q_temp;
17112  }
17113 
17114  if( mi.loadLeadCurrent )
17115  {
17116 
17117  if( mi.dNodePrime != 1 )
17118  {
17119  // drain prime is the same as drain so add in its contribution
17120  storeLeadQ[mi.li_store_dev_id] = -Coef_q_drainPrime;
17121  }
17122  else
17123  {
17124  storeLeadQ[mi.li_store_dev_id] = 0;
17125  }
17126  if( mi.gNodePrime != 1 )
17127  {
17128  // gate prime is the same as gate so add in its contribution
17129  storeLeadQ[mi.li_store_dev_ig] = -Coef_q_gate - Coef_q_gatePrime;
17130  }
17131  else
17132  {
17133  storeLeadQ[mi.li_store_dev_ig] = -Coef_q_gate;
17134  }
17135  if( mi.sNodePrime != 1 )
17136  {
17137  // source prime is the same as source so add in its contribution
17138  storeLeadQ[mi.li_store_dev_is] = -Coef_q_sourcePrime;
17139  }
17140  else
17141  {
17142  storeLeadQ[mi.li_store_dev_is] = 0.0;
17143  }
17144  storeLeadQ[mi.li_store_dev_ie] = -Coef_q_substrate;
17145  if(mi.li_Body != -1)
17146  {
17147  storeLeadQ[mi.li_store_dev_ib] = -Coef_q_body;
17148  }
17149  }
17150 
17151  ////////////////////////////////////////////////////////////////////////
17152  // Voltage limiting section:
17153  double Coef_q_body_Jdxp = 0.0;
17154  double Coef_q_extBody_Jdxp = 0.0;
17155  double Coef_q_gate_Jdxp = 0.0;
17156  double Coef_q_gatePrime_Jdxp = 0.0;
17157  double Coef_q_gateMid_Jdxp = 0.0;
17158  double Coef_q_drainPrime_Jdxp = 0.0;
17159  double Coef_q_sourcePrime_Jdxp = 0.0;
17160  double Coef_q_substrate_Jdxp = 0.0;
17161  double Coef_q_temp_Jdxp = 0.0;
17162 
17164  {
17165  if (mi.soiMod != 2)
17166  {
17167  Coef_q_body_Jdxp -=
17168  (mi.model_.dtype*(mi.Qeqqb_Jdxp))* mi.numberParallel;
17169  }
17170 
17171  Coef_q_gatePrime_Jdxp -=
17172  (mi.model_.dtype*(mi.Qeqqg_Jdxp))* mi.numberParallel;
17173 
17174  Coef_q_drainPrime_Jdxp +=
17175  (mi.model_.dtype*(- mi.Qeqqd_Jdxp)) * mi.numberParallel;
17176 
17177  Coef_q_sourcePrime_Jdxp += (+mi.model_.dtype*(mi.Qeqqg_Jdxp + mi.Qeqqb_Jdxp
17178  + mi.Qeqqd_Jdxp + mi.Qeqqe_Jdxp + mi.Qeqqgmid_Jdxp)
17179  ) * mi.numberParallel;
17180 
17181  Coef_q_substrate_Jdxp -= mi.model_.dtype*mi.Qeqqe_Jdxp * mi.numberParallel;
17182 
17183  if (mi.rgateMod == 3)
17184  {
17185  Coef_q_gateMid_Jdxp -=
17187  }
17188 
17189  if (mi.selfheat)
17190  {
17191  Coef_q_temp_Jdxp -= (mi.Qeqqth_Jdxp ) * mi.numberParallel;
17192  }
17193 
17194  if(mi.li_Body != -1)
17195  {
17196  dQdxdVp[mi.li_Body ] += Coef_q_body_Jdxp;
17197  }
17198  if(mi.li_ExtBody != -1)
17199  {
17200  dQdxdVp[mi.li_ExtBody ] += Coef_q_extBody_Jdxp;
17201  }
17202  dQdxdVp[mi.li_Gate ] += Coef_q_gate_Jdxp;
17203  dQdxdVp[mi.li_GatePrime ] += Coef_q_gatePrime_Jdxp;
17204  dQdxdVp[mi.li_GateMid ] += Coef_q_gateMid_Jdxp;
17205  dQdxdVp[mi.li_DrainPrime ] += Coef_q_drainPrime_Jdxp;
17206  dQdxdVp[mi.li_SourcePrime] += Coef_q_sourcePrime_Jdxp;
17207  dQdxdVp[mi.li_Substrate ] += Coef_q_substrate_Jdxp;
17208  if(mi.li_Temperature != -1)
17209  {
17210  dQdxdVp[mi.li_Temperature] += Coef_q_temp_Jdxp;
17211  }
17212  }
17213 
17214  }
17215 
17216  return true;
17217 }
17218 
17219 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
17220 //-----------------------------------------------------------------------------
17221 // Function : Master::loadDAEMatrices
17222 // Purpose :
17223 // Special Notes :
17224 // Scope : public
17225 // Creator : Eric Keiter, SNL
17226 // Creation Date : 01/06/09
17227 //-----------------------------------------------------------------------------
17228 bool Master::loadDAEMatrices (N_LAS_Matrix & dFdx, N_LAS_Matrix & dQdx)
17229 {
17230 #ifdef _OMP
17231 #pragma omp parallel for
17232 #endif
17233  for (InstanceVector::const_iterator it = getInstanceBegin(); it != getInstanceEnd(); ++it)
17234  {
17235  Instance & mi = *(*it);
17236 
17237  // F-matrix:
17238  if (mi.rgateMod == 1)
17239  {
17240 
17242  += mi.geltd*mi.numberParallel;
17243 
17245  -= mi.geltd*mi.numberParallel;
17246 
17248  -= mi.geltd*mi.numberParallel;
17249  // It seems that this should be here, but it shouldn't.
17250  // The mi.geltd term is added into the G'-G' element later down in this
17251  // routine
17252  //
17253  // *mi.f_GatePrime][mi.AGatePrimeEquGatePrimeNodePtr
17254  // += mi.geltd*mi.numberParallel;
17255  }
17256  else if (mi.rgateMod == 2)
17257  {
17258 
17260  += mi.gcrg_jac*mi.numberParallel;
17261 
17263  += mi.gcrgg_jac*mi.numberParallel;
17264 
17266  += mi.gcrgd_jac*mi.numberParallel;
17267 
17269  += mi.gcrgs_jac*mi.numberParallel;
17270 
17272  -= mi.gcrg_jac*mi.numberParallel;
17273  if (mi.soiMod != 2)
17274  {
17276  += mi.gcrgb_jac*mi.numberParallel;
17277  }
17278  }
17279  else if (mi.rgateMod == 3)
17280  {
17281 
17283  += mi.geltd*mi.numberParallel;
17284 
17286  += -mi.geltd*mi.numberParallel;
17287 
17289  += -mi.geltd*mi.numberParallel;
17290 
17292  += (mi.geltd + mi.gcrg_jac)*mi.numberParallel;
17293 
17295  += (mi.gcrgd_jac)*mi.numberParallel;
17296 
17298  += mi.gcrgg_jac*mi.numberParallel;
17299 
17301  += (mi.gcrgs_jac)*mi.numberParallel;
17302 
17303  if (mi.soiMod != 2)
17304  {
17306  += mi.gcrgb_jac*mi.numberParallel;
17307  }
17308 
17309 
17311  -= mi.gcrg_jac*mi.numberParallel;
17312  }
17313  if (mi.soiMod != 0)
17314  {
17315 
17317  += (mi.Gme + mi.gddpe)*mi.numberParallel;
17318 
17320  += (mi.gsspe - mi.Gme)*mi.numberParallel;
17321  if (mi.soiMod != 2)
17322  {
17324  += mi.gige_jac*mi.numberParallel;
17326  -= mi.gige_jac*mi.numberParallel;
17327  }
17328  }
17329 
17330  if (mi.soiMod != 2)
17331  {
17332  if (mi.rgateMod == 0 || mi.rgateMod == 1)
17333  {
17335  -= (-mi.gigb_jac - mi.gIgtotb)*mi.numberParallel;
17336  }
17337  else
17338  {
17340  += (mi.gigb_jac +mi.gIgtotb - mi.gcrgb_jac)*mi.numberParallel;
17341  }
17342 
17344  -= ((-mi.gddpb - mi.Gmbs) + mi.gIdtotb)*mi.numberParallel;
17345 
17347  -= ((-mi.gsspb + mi.Gmbs) + mi.Gmin + mi.gIstotb)*mi.numberParallel;
17348 
17350  += (mi.gbbe)*mi.numberParallel;
17351 
17353  += (-mi.gigg + mi.gbbg)*mi.numberParallel;
17354 
17356  += (-mi.gigd_jac + mi.gbbdp)*mi.numberParallel;
17357 
17359  += (mi.gbbsp - mi.Gmin - mi.gigs)*mi.numberParallel;
17360 
17362  += (-mi.gigb_jac + mi.gbbb + mi.Gmin)*mi.numberParallel;
17363  }
17364  if (mi.rgateMod == 0)
17365  {
17366 
17368  += (mi.gigg + mi.Gmin + mi.gIgtotg)*mi.numberParallel;
17369 
17371  += (mi.gigd_jac - mi.Gmin + mi.gIgtotd)*mi.numberParallel;
17372 
17374  += (mi.gigs + mi.gIgtots)*mi.numberParallel;
17375  }
17376  else if (mi.rgateMod == 1)
17377  {
17378 
17380  += (mi.gigg_jac + mi.Gmin + mi.gIgtotg + mi.geltd)*mi.numberParallel;
17381 
17383  += (mi.gigd - mi.Gmin + mi.gIgtotd)*mi.numberParallel;
17384 
17386  += (mi.gigs_jac + mi.gIgtots)*mi.numberParallel;
17387  }
17388  else
17389  {
17390 
17392  += (mi.gigg + mi.Gmin + mi.gIgtotg - mi.gcrgg_jac)*mi.numberParallel;
17393 
17395  += (mi.gigd_jac - mi.Gmin + mi.gIgtotd - mi.gcrgd_jac)*mi.numberParallel;
17396 
17398  += (mi.gigs + mi.gIgtots - mi.gcrgs_jac)*mi.numberParallel;
17399  }
17400 
17402  += ((mi.Gm) + mi.gddpg - mi.Gmin - mi.gIdtotg)*mi.numberParallel;
17403 
17405  += ((mi.drainConductance + mi.gds + mi.gddpdp + mi.RevSum) + mi.Gmin - mi.gIdtotd)*mi.numberParallel;
17406 
17408  -= ((-mi.gddpsp + mi.gds + mi.FwdSum) + mi.gIdtots)*mi.numberParallel;
17409 
17411  += -mi.drainConductance*mi.numberParallel;
17412 
17414  += (-mi.Gm + mi.gsspg - mi.gIstotg)*mi.numberParallel;
17415 
17417  -= (mi.gds - mi.gsspdp + mi.RevSum + mi.gIstotd)*mi.numberParallel;
17418 
17420  += ((mi.sourceConductance + mi.gds + mi.gsspsp + mi.FwdSum) + mi.Gmin - mi.gIstots)*mi.numberParallel;
17421 
17424 
17427 
17430 
17433 
17436  if (mi.bodyMod == 1)
17437  {
17438 
17440  -= mi.gppp*mi.numberParallel;
17441 
17443  += mi.gppb*mi.numberParallel;
17444 
17446  += mi.gppp*mi.numberParallel;
17447  }
17448  if (mi.selfheat)
17449  {
17450 
17452  += (mi.GmT + mi.gddpT)*mi.numberParallel;
17453 
17455  += (-mi.GmT + mi.gsspT)*mi.numberParallel;
17456 
17457 
17459  += (mi.gigT_jac)*mi.numberParallel;
17460 
17462  += (mi.gTtt + 1/mi.paramPtr->rth)*mi.numberParallel;
17463 
17465  += mi.gTtg*mi.numberParallel;
17466 
17468  += mi.gTtdp*mi.numberParallel;
17469 
17471  += mi.gTtsp*mi.numberParallel;
17472  if (mi.soiMod != 0)
17473  {
17475  += mi.gTte*mi.numberParallel;
17476  }
17477  if (mi.bNode > 0)
17478  {
17480  += (mi.gbbT - mi.gigT_jac)*mi.numberParallel;
17482  += mi.gTtb*mi.numberParallel;
17483  }
17484  }
17485  if( mi.icVDSGiven )
17486  {
17487  if( getSolverState().dcopFlag )
17488  {
17489  *mi.f_DrainEquIdsPtr += 1.0;
17490  *mi.f_SourceEquIdsPtr -= 1.0;
17491  *mi.f_icVDSEquVdPtr += 1.0;
17492  *mi.f_icVDSEquVsPtr -= 1.0;
17493  }
17494  else
17495  {
17496  *mi.f_icVDSEquIdsPtr += 1.0;
17497  }
17498  }
17499 
17500  if( mi.icVGSGiven )
17501  {
17502  if( getSolverState().dcopFlag )
17503  {
17504  *mi.f_GateEquIgsPtr += 1.0;
17505  *mi.f_SourceEquIgsPtr -= 1.0;
17506  *mi.f_icVGSEquVgPtr += 1.0;
17507  *mi.f_icVGSEquVsPtr -= 1.0;
17508  }
17509  else
17510  {
17511  *mi.f_icVGSEquIgsPtr += 1.0;
17512  }
17513  }
17514 
17515  if( mi.icVBSGiven )
17516  {
17517  if( getSolverState().dcopFlag )
17518  {
17519  *mi.f_BodyEquIbsPtr += 1.0;
17520  *mi.f_SourceEquIbsPtr -= 1.0;
17521  *mi.f_icVBSEquVbPtr += 1.0;
17522  *mi.f_icVBSEquVsPtr -= 1.0;
17523  }
17524  else
17525  {
17526  *mi.f_icVBSEquIbsPtr += 1.0;
17527  }
17528  }
17529 
17530  if( mi.icVESGiven )
17531  {
17532  if( getSolverState().dcopFlag )
17533  {
17534  *mi.f_SubstrateEquIesPtr += 1.0;
17535  *mi.f_SourceEquIesPtr -= 1.0;
17536  *mi.f_icVESEquVePtr += 1.0;
17537  *mi.f_icVESEquVsPtr -= 1.0;
17538  }
17539  else
17540  {
17541  *mi.f_icVESEquIesPtr += 1.0;
17542  }
17543  }
17544 
17545  if( mi.icVPSGiven )
17546  {
17547  if( getSolverState().dcopFlag )
17548  {
17549  *mi.f_ExtBodyEquIpsPtr += 1.0;
17550  *mi.f_SourceEquIpsPtr -= 1.0;
17551  *mi.f_icVPSEquVpPtr += 1.0;
17552  *mi.f_icVPSEquVsPtr -= 1.0;
17553  }
17554  else
17555  {
17556  *mi.f_icVPSEquIpsPtr += 1.0;
17557  }
17558  }
17559 
17560 
17561  // Q-matrix:
17562 
17563  if (mi.rgateMod == 3)
17564  {
17565 
17567  += (mi.CAPcgmgmb)*mi.numberParallel;
17568 
17570  += (mi.CAPcgmdb)*mi.numberParallel;
17571 
17572 
17574  += (mi.CAPcgmsb)*mi.numberParallel;
17575 
17577  += mi.CAPcgmeb*mi.numberParallel;
17578 
17579 
17581  += mi.CAPcdgmb*mi.numberParallel;
17582 
17583 
17585  += mi.CAPcsgmb*mi.numberParallel;
17586 
17588  += mi.CAPcegmb*mi.numberParallel;
17589  }
17590 
17591 
17593  += mi.CAPcedb*mi.numberParallel;
17594 
17595 
17597  += mi.CAPcdeb*mi.numberParallel;
17598 
17600  += mi.CAPcseb*mi.numberParallel;
17601 
17603  += mi.CAPcegb*mi.numberParallel;
17604 
17606  += mi.CAPcgeb*mi.numberParallel;
17607  if (mi.soiMod != 2)
17608  {
17609 
17611  -= (mi.CAPcegb + mi.CAPcedb + mi.CAPcesb + mi.CAPceeb + mi.CAPcegmb)*mi.numberParallel;
17612  if (mi.rgateMod == 0 || mi.rgateMod == 1)
17613  {
17615  -= (+mi.CAPcggb + mi.CAPcgdb + mi.CAPcgsb + mi.CAPcgeb)*mi.numberParallel;
17616  }
17617  else
17618  {
17620  += (+ mi.CAPcgbb)*mi.numberParallel;
17621  }
17622 
17624  -= ((+ mi.CAPcdgb + mi.CAPcddb + mi.CAPcdeb + mi.CAPcdsb) + mi.CAPcdgmb)*mi.numberParallel;
17625 
17627  -= ((+ mi.CAPcsgb + mi.CAPcsdb + mi.CAPcseb + mi.CAPcssb) + mi.CAPcsgmb)*mi.numberParallel;
17628 
17630  += (+ mi.CAPcbeb)*mi.numberParallel;
17631 
17633  += (+ mi.CAPcbgb)*mi.numberParallel;
17634 
17636  += (+ mi.CAPcbdb)*mi.numberParallel;
17637 
17639  += (mi.CAPcbsb)*mi.numberParallel;
17640 
17642  += (-mi.CAPcbgb - mi.CAPcbdb - mi.CAPcbsb - mi.CAPcbeb)*mi.numberParallel;
17643  }
17644 
17646  += mi.CAPceeb*mi.numberParallel;
17647  if (mi.rgateMod == 0)
17648  {
17649 
17651  += (mi.CAPcggb)*mi.numberParallel;
17652 
17654  += (mi.CAPcgdb)*mi.numberParallel;
17655 
17657  += (mi.CAPcgsb)*mi.numberParallel;
17658  }
17659  else if (mi.rgateMod == 1)
17660  {
17661 
17663  += (mi.CAPcggb)*mi.numberParallel;
17664 
17666  += (mi.CAPcgdb)*mi.numberParallel;
17667 
17669  += (mi.CAPcgsb)*mi.numberParallel;
17670  }
17671  else
17672  {
17673 
17675  += (mi.CAPcggb)*mi.numberParallel;
17676 
17678  += (mi.CAPcgdb)*mi.numberParallel;
17679 
17681  += (mi.CAPcgsb)*mi.numberParallel;
17682  }
17683 
17685  += ((mi.CAPcdgb))*mi.numberParallel;
17686 
17688  += ((mi.CAPcddb) )*mi.numberParallel;
17689 
17691  -= ((-mi.CAPcdsb) )*mi.numberParallel;
17692 
17693 
17695  += (mi.CAPcsgb)*mi.numberParallel;
17696 
17698  -= (-mi.CAPcsdb )*mi.numberParallel;
17699 
17701  += ((mi.CAPcssb) )*mi.numberParallel;
17702 
17703  if (mi.selfheat)
17704  {
17705 
17707  += (mi.CAPcdT)*mi.numberParallel;
17708 
17710  += (mi.CAPcsT)*mi.numberParallel;
17711 
17713  += mi.CAPceT*mi.numberParallel;
17714 
17716  += (mi.CAPcgT)*mi.numberParallel;
17717 
17719  += (mi.CAPcTt)*mi.numberParallel;
17720 
17721  if (mi.bNode > 0)
17722  {
17724  += (mi.CAPcbT)*mi.numberParallel;
17725  }
17726  }
17727  }
17728  return true;
17729 }
17730 #else
17731 //-----------------------------------------------------------------------------
17732 // Function : Master::loadDAEMatrices
17733 // Purpose :
17734 // Special Notes :
17735 // Scope : public
17736 // Creator : Eric Keiter, SNL
17737 // Creation Date : 01/06/09
17738 //-----------------------------------------------------------------------------
17739 bool Master::loadDAEMatrices (N_LAS_Matrix & dFdx, N_LAS_Matrix & dQdx)
17740 {
17741  int sizeInstances = instanceContainer_.size();
17742 
17743 #ifdef _OMP
17744 #pragma omp parallel for
17745 #endif
17746  for (int i=0; i<sizeInstances; ++i)
17747  {
17748  Instance & mi = *(instanceContainer_.at(i));
17749 
17750  // F-matrix:
17751  if (mi.rgateMod == 1)
17752  {
17753 
17754  dFdx[mi.li_Gate][mi.AGateEquGateNodeOffset]
17755  += mi.geltd*mi.numberParallel;
17756 
17758  -= mi.geltd*mi.numberParallel;
17759 
17761  -= mi.geltd*mi.numberParallel;
17762  // It seems that this should be here, but it shouldn't.
17763  // The mi.geltd term is added into the G'-G' element later down in this
17764  // routine
17765  //
17766  // dFdx[mi.li_GatePrime][mi.AGatePrimeEquGatePrimeNodeOffset]
17767  // += mi.geltd*mi.numberParallel;
17768  }
17769  else if (mi.rgateMod == 2)
17770  {
17771 
17772  dFdx[mi.li_Gate][mi.AGateEquGateNodeOffset]
17773  += mi.gcrg_jac*mi.numberParallel;
17774 
17776  += mi.gcrgg_jac*mi.numberParallel;
17777 
17779  += mi.gcrgd_jac*mi.numberParallel;
17780 
17782  += mi.gcrgs_jac*mi.numberParallel;
17783 
17785  -= mi.gcrg_jac*mi.numberParallel;
17786  if (mi.soiMod != 2)
17787  {
17788  dFdx[mi.li_Gate][mi.AGateEquBodyNodeOffset]
17789  += mi.gcrgb_jac*mi.numberParallel;
17790  }
17791  }
17792  else if (mi.rgateMod == 3)
17793  {
17794 
17795  dFdx[mi.li_Gate][mi.AGateEquGateNodeOffset]
17796  += mi.geltd*mi.numberParallel;
17797 
17798  dFdx[mi.li_Gate][mi.AGateEquGateMidNodeOffset]
17799  += -mi.geltd*mi.numberParallel;
17800 
17802  += -mi.geltd*mi.numberParallel;
17803 
17805  += (mi.geltd + mi.gcrg_jac)*mi.numberParallel;
17806 
17808  += (mi.gcrgd_jac)*mi.numberParallel;
17809 
17811  += mi.gcrgg_jac*mi.numberParallel;
17812 
17814  += (mi.gcrgs_jac)*mi.numberParallel;
17815 
17816  if (mi.soiMod != 2)
17817  {
17819  += mi.gcrgb_jac*mi.numberParallel;
17820  }
17821 
17822 
17824  -= mi.gcrg_jac*mi.numberParallel;
17825  }
17826  if (mi.soiMod != 0)
17827  {
17828 
17830  += (mi.Gme + mi.gddpe)*mi.numberParallel;
17831 
17833  += (mi.gsspe - mi.Gme)*mi.numberParallel;
17834  if (mi.soiMod != 2)
17835  {
17837  += mi.gige_jac*mi.numberParallel;
17839  -= mi.gige_jac*mi.numberParallel;
17840  }
17841  }
17842 
17843  if (mi.soiMod != 2)
17844  {
17845  if (mi.rgateMod == 0 || mi.rgateMod == 1)
17846  {
17848  -= (-mi.gigb_jac - mi.gIgtotb)*mi.numberParallel;
17849  }
17850  else
17851  {
17853  += (mi.gigb_jac +mi.gIgtotb - mi.gcrgb_jac)*mi.numberParallel;
17854  }
17855 
17857  -= ((-mi.gddpb - mi.Gmbs) + mi.gIdtotb)*mi.numberParallel;
17858 
17860  -= ((-mi.gsspb + mi.Gmbs) + mi.Gmin + mi.gIstotb)*mi.numberParallel;
17861 
17863  += (mi.gbbe)*mi.numberParallel;
17864 
17866  += (-mi.gigg + mi.gbbg)*mi.numberParallel;
17867 
17869  += (-mi.gigd_jac + mi.gbbdp)*mi.numberParallel;
17870 
17872  += (mi.gbbsp - mi.Gmin - mi.gigs)*mi.numberParallel;
17873 
17874  dFdx[mi.li_Body][mi.ABodyEquBodyNodeOffset]
17875  += (-mi.gigb_jac + mi.gbbb + mi.Gmin)*mi.numberParallel;
17876  }
17877  if (mi.rgateMod == 0)
17878  {
17879 
17881  += (mi.gigg + mi.Gmin + mi.gIgtotg)*mi.numberParallel;
17882 
17884  += (mi.gigd_jac - mi.Gmin + mi.gIgtotd)*mi.numberParallel;
17885 
17887  += (mi.gigs + mi.gIgtots)*mi.numberParallel;
17888  }
17889  else if (mi.rgateMod == 1)
17890  {
17891 
17893  += (mi.gigg_jac + mi.Gmin + mi.gIgtotg + mi.geltd)*mi.numberParallel;
17894 
17896  += (mi.gigd - mi.Gmin + mi.gIgtotd)*mi.numberParallel;
17897 
17899  += (mi.gigs_jac + mi.gIgtots)*mi.numberParallel;
17900  }
17901  else
17902  {
17903 
17905  += (mi.gigg + mi.Gmin + mi.gIgtotg - mi.gcrgg_jac)*mi.numberParallel;
17906 
17908  += (mi.gigd_jac - mi.Gmin + mi.gIgtotd - mi.gcrgd_jac)*mi.numberParallel;
17909 
17911  += (mi.gigs + mi.gIgtots - mi.gcrgs_jac)*mi.numberParallel;
17912  }
17913 
17915  += ((mi.Gm) + mi.gddpg - mi.Gmin - mi.gIdtotg)*mi.numberParallel;
17916 
17918  += ((mi.drainConductance + mi.gds + mi.gddpdp + mi.RevSum) + mi.Gmin - mi.gIdtotd)*mi.numberParallel;
17919 
17921  -= ((-mi.gddpsp + mi.gds + mi.FwdSum) + mi.gIdtots)*mi.numberParallel;
17922 
17924  += -mi.drainConductance*mi.numberParallel;
17925 
17927  += (-mi.Gm + mi.gsspg - mi.gIstotg)*mi.numberParallel;
17928 
17930  -= (mi.gds - mi.gsspdp + mi.RevSum + mi.gIstotd)*mi.numberParallel;
17931 
17933  += ((mi.sourceConductance + mi.gds + mi.gsspsp + mi.FwdSum) + mi.Gmin - mi.gIstots)*mi.numberParallel;
17934 
17937 
17938  dFdx[mi.li_Drain][mi.ADrainEquDrainNodeOffset]
17940 
17943 
17946 
17949  if (mi.bodyMod == 1)
17950  {
17951 
17952  dFdx[mi.li_Body][mi.ABodyEquExtBodyNodeOffset]
17953  -= mi.gppp*mi.numberParallel;
17954 
17956  += mi.gppb*mi.numberParallel;
17957 
17959  += mi.gppp*mi.numberParallel;
17960  }
17961  if (mi.selfheat)
17962  {
17963 
17965  += (mi.GmT + mi.gddpT)*mi.numberParallel;
17966 
17968  += (-mi.GmT + mi.gsspT)*mi.numberParallel;
17969 
17970 
17972  += (mi.gigT_jac)*mi.numberParallel;
17973 
17975  += (mi.gTtt + 1/mi.paramPtr->rth)*mi.numberParallel;
17976 
17978  += mi.gTtg*mi.numberParallel;
17979 
17981  += mi.gTtdp*mi.numberParallel;
17982 
17984  += mi.gTtsp*mi.numberParallel;
17985  if (mi.soiMod != 0)
17986  {
17988  += mi.gTte*mi.numberParallel;
17989  }
17990  if (mi.bNode > 0)
17991  {
17993  += (mi.gbbT - mi.gigT_jac)*mi.numberParallel;
17995  += mi.gTtb*mi.numberParallel;
17996  }
17997  }
17998  if( mi.icVDSGiven )
17999  {
18000  if( getSolverState().dcopFlag )
18001  {
18002  dFdx[mi.li_Drain][mi.ADrainEquIdsOffset] += 1.0;
18003  dFdx[mi.li_Source][mi.ASourceEquIdsOffset] -= 1.0;
18004  dFdx[mi.li_Ids][mi.icVDSEquVdOffset] += 1.0;
18005  dFdx[mi.li_Ids][mi.icVDSEquVsOffset] -= 1.0;
18006  }
18007  else
18008  {
18009  dFdx[mi.li_Ids][mi.icVDSEquIdsOffset] += 1.0;
18010  }
18011  }
18012 
18013  if( mi.icVGSGiven )
18014  {
18015  if( getSolverState().dcopFlag )
18016  {
18017  dFdx[mi.li_Gate][mi.AGateEquIgsOffset] += 1.0;
18018  dFdx[mi.li_Source][mi.ASourceEquIgsOffset] -= 1.0;
18019  dFdx[mi.li_Igs][mi.icVGSEquVgOffset] += 1.0;
18020  dFdx[mi.li_Igs][mi.icVGSEquVsOffset] -= 1.0;
18021  }
18022  else
18023  {
18024  dFdx[mi.li_Igs][mi.icVGSEquIgsOffset] += 1.0;
18025  }
18026  }
18027 
18028  if( mi.icVBSGiven )
18029  {
18030  if( getSolverState().dcopFlag )
18031  {
18032  dFdx[mi.li_Body][mi.ABodyEquIbsOffset] += 1.0;
18033  dFdx[mi.li_Source][mi.ASourceEquIbsOffset] -= 1.0;
18034  dFdx[mi.li_Ibs][mi.icVBSEquVbOffset] += 1.0;
18035  dFdx[mi.li_Ibs][mi.icVBSEquVsOffset] -= 1.0;
18036  }
18037  else
18038  {
18039  dFdx[mi.li_Ibs][mi.icVBSEquIbsOffset] += 1.0;
18040  }
18041  }
18042 
18043  if( mi.icVESGiven )
18044  {
18045  if( getSolverState().dcopFlag )
18046  {
18047  dFdx[mi.li_Substrate][mi.ASubstrateEquIesOffset] += 1.0;
18048  dFdx[mi.li_Source][mi.ASourceEquIesOffset] -= 1.0;
18049  dFdx[mi.li_Ies][mi.icVESEquVeOffset] += 1.0;
18050  dFdx[mi.li_Ies][mi.icVESEquVsOffset] -= 1.0;
18051  }
18052  else
18053  {
18054  dFdx[mi.li_Ies][mi.icVESEquIesOffset] += 1.0;
18055  }
18056  }
18057 
18058  if( mi.icVPSGiven )
18059  {
18060  if( getSolverState().dcopFlag )
18061  {
18062  dFdx[mi.li_ExtBody][mi.AExtBodyEquIpsOffset] += 1.0;
18063  dFdx[mi.li_Source][mi.ASourceEquIpsOffset] -= 1.0;
18064  dFdx[mi.li_Ips][mi.icVPSEquVpOffset] += 1.0;
18065  dFdx[mi.li_Ips][mi.icVPSEquVsOffset] -= 1.0;
18066  }
18067  else
18068  {
18069  dFdx[mi.li_Ips][mi.icVPSEquIpsOffset] += 1.0;
18070  }
18071  }
18072 
18073 
18074  // Q-matrix:
18075 
18076  if (mi.rgateMod == 3)
18077  {
18078 
18080  += (mi.CAPcgmgmb)*mi.numberParallel;
18081 
18083  += (mi.CAPcgmdb)*mi.numberParallel;
18084 
18085 
18087  += (mi.CAPcgmsb)*mi.numberParallel;
18088 
18090  += mi.CAPcgmeb*mi.numberParallel;
18091 
18092 
18094  += mi.CAPcdgmb*mi.numberParallel;
18095 
18096 
18098  += mi.CAPcsgmb*mi.numberParallel;
18099 
18101  += mi.CAPcegmb*mi.numberParallel;
18102  }
18103 
18104 
18106  += mi.CAPcedb*mi.numberParallel;
18107 
18108 
18110  += mi.CAPcdeb*mi.numberParallel;
18111 
18113  += mi.CAPcseb*mi.numberParallel;
18114 
18116  += mi.CAPcegb*mi.numberParallel;
18117 
18119  += mi.CAPcgeb*mi.numberParallel;
18120  if (mi.soiMod != 2)
18121  {
18122 
18124  -= (mi.CAPcegb + mi.CAPcedb + mi.CAPcesb + mi.CAPceeb + mi.CAPcegmb)*mi.numberParallel;
18125  if (mi.rgateMod == 0 || mi.rgateMod == 1)
18126  {
18128  -= (+mi.CAPcggb + mi.CAPcgdb + mi.CAPcgsb + mi.CAPcgeb)*mi.numberParallel;
18129  }
18130  else
18131  {
18133  += (+ mi.CAPcgbb)*mi.numberParallel;
18134  }
18135 
18137  -= ((+ mi.CAPcdgb + mi.CAPcddb + mi.CAPcdeb + mi.CAPcdsb) + mi.CAPcdgmb)*mi.numberParallel;
18138 
18140  -= ((+ mi.CAPcsgb + mi.CAPcsdb + mi.CAPcseb + mi.CAPcssb) + mi.CAPcsgmb)*mi.numberParallel;
18141 
18143  += (+ mi.CAPcbeb)*mi.numberParallel;
18144 
18146  += (+ mi.CAPcbgb)*mi.numberParallel;
18147 
18149  += (+ mi.CAPcbdb)*mi.numberParallel;
18150 
18152  += (mi.CAPcbsb)*mi.numberParallel;
18153 
18154  dQdx[mi.li_Body][mi.ABodyEquBodyNodeOffset]
18155  += (-mi.CAPcbgb - mi.CAPcbdb - mi.CAPcbsb - mi.CAPcbeb)*mi.numberParallel;
18156  }
18157 
18159  += mi.CAPceeb*mi.numberParallel;
18160  if (mi.rgateMod == 0)
18161  {
18162 
18164  += (mi.CAPcggb)*mi.numberParallel;
18165 
18167  += (mi.CAPcgdb)*mi.numberParallel;
18168 
18170  += (mi.CAPcgsb)*mi.numberParallel;
18171  }
18172  else if (mi.rgateMod == 1)
18173  {
18174 
18176  += (mi.CAPcggb)*mi.numberParallel;
18177 
18179  += (mi.CAPcgdb)*mi.numberParallel;
18180 
18182  += (mi.CAPcgsb)*mi.numberParallel;
18183  }
18184  else
18185  {
18186 
18188  += (mi.CAPcggb)*mi.numberParallel;
18189 
18191  += (mi.CAPcgdb)*mi.numberParallel;
18192 
18194  += (mi.CAPcgsb)*mi.numberParallel;
18195  }
18196 
18198  += ((mi.CAPcdgb))*mi.numberParallel;
18199 
18201  += ((mi.CAPcddb) )*mi.numberParallel;
18202 
18204  -= ((-mi.CAPcdsb) )*mi.numberParallel;
18205 
18206 
18208  += (mi.CAPcsgb)*mi.numberParallel;
18209 
18211  -= (-mi.CAPcsdb )*mi.numberParallel;
18212 
18214  += ((mi.CAPcssb) )*mi.numberParallel;
18215 
18216  if (mi.selfheat)
18217  {
18218 
18220  += (mi.CAPcdT)*mi.numberParallel;
18221 
18223  += (mi.CAPcsT)*mi.numberParallel;
18224 
18226  += mi.CAPceT*mi.numberParallel;
18227 
18229  += (mi.CAPcgT)*mi.numberParallel;
18230 
18232  += (mi.CAPcTt)*mi.numberParallel;
18233 
18234  if (mi.bNode > 0)
18235  {
18237  += (mi.CAPcbT)*mi.numberParallel;
18238  }
18239  }
18240  }
18241  return true;
18242 }
18243 #endif
18244 
18245 Device *Traits::factory(const Configuration &configuration, const FactoryBlock &factory_block)
18246 {
18247 
18248  return new Master(configuration, factory_block, factory_block.solverState_, factory_block.deviceOptions_);
18249 }
18250 
18252 {
18254  .registerDevice("m", 10)
18255  .registerDevice("m", 57)
18256  .registerModelType("pmos", 10)
18257  .registerModelType("nmos", 10)
18258  .registerModelType("pmos", 57)
18259  .registerModelType("nmos", 57);
18260 }
18261 
18262 } // namespace Resistor
18263 } // namespace Device
18264 } // namespace Xyce