1 /***********************************************************************
2 
3  HiSIM (Hiroshima University STARC IGFET Model)
4  Copyright (C) 2014 Hiroshima University & STARC
5 
6  MODEL NAME : HiSIM_HV
7  ( VERSION : 2  SUBVERSION : 2  REVISION : 0 )
8  Model Parameter 'VERSION' : 2.20
9  FILE : hsmhveval.c
10 
11  DATE : 2014.6.11
12 
13  released by
14                 Hiroshima University &
15                 Semiconductor Technology Academic Research Center (STARC)
16 ***********************************************************************/
17 
18 /**********************************************************************
19 
20 The following source code, and all copyrights, trade secrets or other
21 intellectual property rights in and to the source code in its entirety,
22 is owned by the Hiroshima University and the STARC organization.
23 
24 All users need to follow the "HISIM_HV Distribution Statement and
25 Copyright Notice" attached to HiSIM_HV model.
26 
27 -----HISIM_HV Distribution Statement and Copyright Notice--------------
28 
29 Software is distributed as is, completely without warranty or service
30 support. Hiroshima University or STARC and its employees are not liable
31 for the condition or performance of the software.
32 
33 Hiroshima University and STARC own the copyright and grant users a perpetual,
34 irrevocable, worldwide, non-exclusive, royalty-free license with respect
35 to the software as set forth below.
36 
37 Hiroshima University and STARC hereby disclaims all implied warranties.
38 
39 Hiroshima University and STARC grant the users the right to modify, copy,
40 and redistribute the software and documentation, both within the user's
41 organization and externally, subject to the following restrictions
42 
43 1. The users agree not to charge for Hiroshima University and STARC code
44 itself but may charge for additions, extensions, or support.
45 
46 2. In any product based on the software, the users agree to acknowledge
47 Hiroshima University and STARC that developed the software. This
48 acknowledgment shall appear in the product documentation.
49 
50 3. The users agree to reproduce any copyright notice which appears on
51 the software on any copy or modification of such made available
52 to others."
53 
54 Toshimasa Asahara, President, Hiroshima University
55 Mitiko Miura-Mattausch, Professor, Hiroshima University
56 Katsuhiro Shimohigashi, President&CEO, STARC
57 June 2008 (revised October 2011)
58 *************************************************************************/
59 
60 /*********************************************************************
61 * Memorandum on programming
62 *
63 * (1) Bias (x: b|d|g)
64 *     . vxs : Input arguments: Outer branch voltages.
65 *     . vxsi: Input arguments: Inner branch voltages.
66 *     . deltemp: Input argument: delta temperature.
67 *     . Vxse: Internal name for outer branch voltages.
68 *     . Vxs:  Internal name for inner branch voltages.
69 *     . Vbscl:Inner bulk source voltage is clamped within a specified region.
70 *     . Y_dVxs denotes the partial derivative of Y w.r.t. Vxs.
71 *     . Y_dVxse denotes the partial derivative of Y w.r.t. Vxse.
72 *     . Y_dT denotes derivatives with respect to deltemp.
73 *
74 * (2) Device Mode
75 *     . Normal mode (Vds>=0 for nMOS) is assumed.
76 *     . The sign of Vdse is assumed to be changed simultaneously, if the sign of Vds is changed;
77 *       hence Vdse may become negative even thogh Vds >=0.
78 *     . In case of reverse mode, parent routines have to properly
79 *       transform or interchange inputs and outputs except ones
80 *       related to junction diodes, which are regarded as being
81 *       fixed to the nodal S/D.
82 *
83 * (3) Modification for symmetry at Vds=0
84 *     . Vxsz: Modified bias. (x: b|d|g)
85 *     . Ps0z: Modified Ps0.
86 *     . The following variables are calculated as a function of
87 *       modified biases or potential.
88 *         Tox, Cox, (-- with quantum effect)
89 *         Vth*, dVth*, dPpg, Igate, Igidl, Igisl.
90 *     . The following variables are calculated using a transform
91 *       function.
92 *         Lred
93 *
94 * (4) Zones and Cases (terminology)
95 *
96 *       Chi:=beta*(Ps0-Vbs)=       0    3    5
97 *
98 *                      Zone:    A  | D1 | D2 | D3
99 *                                  |
100 *                    (accumulation)|(depletion)
101 *                                  |
102 *                      Vgs =     Vgs_fb                Vth
103 *                                              /       /
104 *                      Case:    Nonconductive / Conductive
105 *                                            /
106 *             VgVt:=Qn0/Cox=             VgVt_small
107 *
108 *     . Ids is regarded as zero in zone-A.
109 *     . Procedure to calculate Psl and dependent variables is
110 *       omitted in the nonconductive case. Ids and Qi are regarded
111 *       as zero in this case.
112 *
113 *********************************************************************/
114 
115 /*===========================================================*
116 * Preamble.
117 *=================*/
118 /*---------------------------------------------------*
119 * Header files.
120 *-----------------*/
121 #include "ngspice/ngspice.h"
122 #ifdef __STDC__
123 /* #include <ieeefp.h> */
124 #endif
125 
126 
127 /*-----------------------------------*
128 * HiSIM macros
129 *-----------------*/
130 #include "hisimhv2.h"
131 #include "hsmhv2evalenv.h"
132 #define C_IDD_MIN    1.0e-15
133 #define C_sub_delta 0.1 /* CHECK! */
134 #define C_sub_delta2 1.0e-9 /* CHECK! */
135 #define C_gidl_delta 0.5
136 
137 /* local variables used in macro functions */
138 static double TMF0 , TMF1 , TMF2 , TMF3 , TMF4 ;
139 
140 /*===========================================================*
141 * Exp() for PGD.
142 * - ExpLim(-3)=0
143 *=================*/
144 
145 #define Fn_ExpLim( y , x , dx ) { \
146     if ( (x) < -3.0 ) { \
147       dx = 0.0 ; \
148       y = 0.0 ; \
149     } else if ( (x) < 0.0 ) { \
150       dx =  1.0 + (x) * ( 2 * (1.0/3.0) + (x) * 3 * (1.0/27.0) )  ; \
151       y = 1.0 + (x) * ( 1.0 + (x) * ( (1.0/3.0) + (x) * (1.0/27.0) ) ) ; \
152     } else { \
153       dx =  1.0 + (x) * ( 2 * (1.0/3.0) + (x) * ( 3 * 0.0402052934513951 \
154                 + (x) * 4 * 0.148148111111111 ) ) ; \
155       y = 1.0 + (x) * ( 1.0 + (x) * ( (1.0/3.0) + (x) * ( 0.0402052934513951 \
156               + (x) * 0.148148111111111 ) ) ) ; \
157     } \
158 }
159 
160 /*===========================================================*
161 * Macro Functions for ceiling/flooring/symmetrization.
162 *=================*/
163 
164 /*---------------------------------------------------*
165 * smoothUpper: ceiling.
166 *      y = xmax - 0.5 ( arg + sqrt( arg^2 + 4 xmax delta ) )
167 *    arg = xmax - x - delta
168 *-----------------*/
169 
170 #define Fn_SU( y , x , xmax , delta , dx ) { \
171     TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
172     TMF2 = 4.0 * ( xmax ) * ( delta) ; \
173     TMF2 = TMF2 > 0.0 ?  TMF2 : - ( TMF2 ) ; \
174     TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
175     dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
176     y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
177   }
178 
179 #define Fn_SU2( y , x , xmax , delta , dy_dx , dy_dxmax ) { \
180     TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
181     TMF2 = 4.0 * ( xmax ) * ( delta) ; \
182     TMF2 = TMF2 > 0.0 ?  TMF2 : - ( TMF2 ) ; \
183     TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
184     dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
185     dy_dxmax = 0.5 * ( 1.0 - ( TMF1 + 2.0 * delta ) / TMF2 ) ; \
186     y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
187   }
188 
189 
190 /*---------------------------------------------------*
191 * smoothLower: flooring.
192 *      y = xmin + 0.5 ( arg + sqrt( arg^2 + 4 xmin delta ) )
193 *    arg = x - xmin - delta
194 *-----------------*/
195 
196 #define Fn_SL( y , x , xmin , delta , dx ) { \
197     TMF1 = ( x ) - ( xmin ) - ( delta ) ; \
198     TMF2 = 4.0 * ( xmin ) * ( delta ) ; \
199     TMF2 = TMF2 > 0.0 ?  TMF2 : - ( TMF2 ) ; \
200     TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
201     dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
202     y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \
203   }
204 
205 #define Fn_SL2( y , x , xmin , delta , dy_dx, dy_dxmin ) { \
206     TMF1 = ( x ) - ( xmin ) - ( delta ) ; \
207     TMF2 = 4.0 * ( xmin ) * ( delta ) ; \
208     TMF2 = TMF2 > 0.0 ?  TMF2 : - ( TMF2 ) ; \
209     TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
210     dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
211     dy_dxmin = 0.5 * ( 1.0 - ( TMF1 - 2.0 * delta ) / TMF2 ) ; \
212     y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \
213   }
214 
215 /*---------------------------------------------------*
216 * smoothZero: flooring to zero.
217 *      y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) )
218 *-----------------*/
219 
220 #define Fn_SZ( y , x , delta , dx ) { \
221     TMF2 = sqrt ( ( x ) *  ( x ) + 4.0 * ( delta ) * ( delta) ) ; \
222     dx = 0.5 * ( 1.0 + ( x ) / TMF2 ) ; \
223     y = 0.5 * ( ( x ) + TMF2 ) ; \
224     if( y < 0.0 ) { y=0.0; dx=0.0; } \
225   }
226 
227 
228 /*---------------------------------------------------*
229 * CeilingPow: ceiling for positive x, flooring for negative x.
230 *      y = x * xmax / ( x^{2m} + xmax^{2m} )^{1/(2m)}
231 * note:
232 *   - xmax has to be positive.
233 *   - -xmax < y < xmax.
234 *   - dy/dx|_{x=0} = 1.
235 *-----------------*/
236 
237 #define Fn_CP( y , x , xmax , pw , dx ) { \
238   double x2 = (x) * (x) ; \
239   double xmax2 = (xmax) * (xmax) ; \
240   double xp = 1.0 , xmp = 1.0 ; \
241   int   m =0, mm =0; \
242   double arg =0.0, dnm =0.0; \
243   for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \
244   arg = xp + xmp ; \
245   dnm = arg ; \
246   if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \
247     if ( pw == 1 ) { mm = 1 ; \
248     } else if ( pw == 2 ) { mm = 2 ; \
249     } else if ( pw == 4 ) { mm = 3 ; \
250     } else if ( pw == 8 ) { mm = 4 ; } \
251     for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \
252   } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \
253   dnm = 1.0 / dnm ; \
254   y = (x) * (xmax) * dnm ; \
255   dx = (xmax) * xmp * dnm / arg ; \
256 }
257 
258 #define Fn_SU_CP2( y , x , xmax , delta , pw , dx , dxmax ) { \
259  if(x > xmax - delta && delta >= 0.0) { \
260    TMF1 = x - xmax + delta ; \
261    Fn_CP( TMF0 , TMF1 , delta , pw , dx )  \
262    y = xmax - delta + TMF0 ; \
263    dx = dx ; \
264    dxmax = 1.0-dx ; \
265  } else { \
266    y = x ; \
267    dx = 1.0 ; \
268    dxmax = 0.0 ; \
269  } \
270 }
271 
272 #define Fn_CP2( y , x , xmax , pw , dx , dxmax ) {      \
273   double x2 = (x) * (x) ; \
274   double xmax2 = (xmax) * (xmax) ; \
275   double xp = 1.0 , xmp = 1.0 ; \
276   int   m =0, mm =0; \
277   double arg =0.0, dnm =0.0; \
278   for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \
279   arg = xp + xmp ; \
280   dnm = arg ; \
281   if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \
282     if ( pw == 1 ) { mm = 1 ; \
283     } else if ( pw == 2 ) { mm = 2 ; \
284     } else if ( pw == 4 ) { mm = 3 ; \
285     } else if ( pw == 8 ) { mm = 4 ; } \
286     for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \
287   } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \
288   dnm = 1.0 / dnm ; \
289   y = (x) * (xmax) * dnm ; \
290   dx = (xmax) * xmp * dnm / arg ; \
291   dxmax = (x) * xp * dnm / arg ; \
292 }
293 
294 #define Fn_SU_CP3( y , x , xmax , delta , pw , dx , dxmax , ddelta ) { \
295  if(x > xmax - delta && delta >= 0.0) { \
296    TMF1 = x - xmax + delta ; \
297    Fn_CP2( TMF0 , TMF1 , delta , pw , dx , ddelta )     \
298    y = xmax - delta + TMF0 ; \
299    dx = dx ; \
300    dxmax = 1.0-dx ; \
301    ddelta = -1.0+dx+ddelta; \
302  } else { \
303    y = x ; \
304    dx = 1.0 ; \
305    dxmax = 0.0 ; \
306    ddelta = 0.0 ; \
307  } \
308 }
309 
310 #define Fn_SL_CP3( y , x , xmin , delta , pw , dx , dxmin, ddelta) { \
311  if(x < xmin + delta && delta >= 0.0) { \
312    TMF1 = xmin + delta - x ; \
313    Fn_CP2( TMF0 , TMF1 , delta , pw , dx , ddelta )  \
314    y = xmin + delta - TMF0 ; \
315    dx = dx ; \
316    dxmin = 1.0-dx ; \
317    ddelta = 1.0-dx-ddelta; \
318  } else { \
319    y = x ; \
320    dx = 1.0 ; \
321    dxmin = 0.0 ; \
322    ddelta = 0.0 ; \
323  } \
324 }
325 
326 #define Fn_SU_CP( y , x , xmax , delta , pw , dx ) { \
327  if(x > xmax - delta && delta >= 0.0) { \
328    TMF1 = x - xmax + delta ; \
329    Fn_CP( TMF0 , TMF1 , delta , pw , dx )  \
330    y = xmax - delta + TMF0 ; \
331    dx = dx ; \
332  } else { \
333    y = x ; \
334    dx = 1.0 ; \
335  } \
336 }
337 
338 
339 #define Fn_SL_CP2( y , x , xmin , delta , pw , dx , dxmin) { \
340  if(x < xmin + delta && delta >= 0.0) { \
341    TMF1 = xmin + delta - x ; \
342    Fn_CP( TMF0 , TMF1 , delta , pw , dx )  \
343    y = xmin + delta - TMF0 ; \
344    dx = dx ; \
345    dxmin = 1.0-dx ; \
346  } else { \
347    y = x ; \
348    dx = 1.0 ; \
349    dxmin = 0.0 ; \
350  } \
351 }
352 
353 #define Fn_SL_CP( y , x , xmin , delta , pw , dx ) { \
354  if(x < xmin + delta && delta >= 0.0) { \
355    TMF1 = xmin + delta - x ; \
356    Fn_CP( TMF0 , TMF1 , delta , pw , dx )  \
357    y = xmin + delta - TMF0 ; \
358    dx = dx ; \
359  } else { \
360    y = x ; \
361    dx = 1.0 ; \
362  } \
363 }
364 
365 
366 
367 /*---------------------------------------------------*
368 * Declining function using a polynomial.
369 *-----------------*/
370 
371 #define Fn_DclPoly4( y , x , dx ) { \
372   TMF2 = (x) * (x) ; \
373   TMF3 = TMF2 * (x) ; \
374   TMF4 = TMF2 * TMF2 ; \
375   y = 1.0 / ( 1.0 + (x) + TMF2 + TMF3 + TMF4 ) ; \
376   dx = - ( 1.0 + 2.0 * (x) + 3.0 * TMF2 + 4.0 * TMF3 )  * y * y  ; \
377 }
378 
379 #define Fn_DclPoly6( y , x , dx ) { \
380   TMF2 = (x) * (x) ; \
381   TMF3 = TMF2 * (x) ; \
382   TMF4 = TMF2 * TMF2 ; \
383   TMF5 = TMF2 * TMF3 ; \
384   TMF6 = TMF3 * TMF3 ; \
385   y = 1.0 / ( 1.0 + (x) + TMF2 + TMF3 + TMF4 + TMF5 + TMF6 ) ; \
386   dx = - ( 1.0 + 2.0 * (x) + 3.0 * TMF2 + 4.0 * TMF3 \
387          + 5.0 * TMF4 + 6.0 * TMF5 )  * y * y  ; \
388 }
389 
390 /*---------------------------------------------------*
391 * "smoothUpper" using a polynomial
392 *-----------------*/
393 
394 #define Fn_SUPoly4( y , x , xmax , dx ) { \
395  TMF1 = (x) / xmax ; \
396  Fn_DclPoly4( y , TMF1 , dx ) ; \
397  y = xmax * ( 1.0 - y ) ; \
398  dx = - dx ; \
399 }
400 
401 
402 #define Fn_SUPoly4m( y , x , xmax , dx , dxmax ) { \
403  TMF1 = (x) / xmax ; \
404  Fn_DclPoly4( TMF0 , TMF1 , dx ) ; \
405  y = xmax * ( 1.0 - TMF0 ) ; \
406  dxmax = 1.0 - TMF0 + TMF1 * dx ; \
407  dx = - dx ; \
408 }
409 
410 
411 #define Fn_SUPoly6m( y , x , xmax , dx , dxmax ) { \
412  TMF1 = (x) / xmax ; \
413  Fn_DclPoly6( TMF0 , TMF1 , dx ) ; \
414  y = xmax * ( 1.0 - TMF0 ) ; \
415  dxmax = 1.0 - TMF0 + TMF1 * dx ; \
416  dx = - dx ; \
417 }
418 
419 /*---------------------------------------------------*
420 * SymAdd: evaluate additional term for symmetry.
421 *-----------------*/
422 
423 #define Fn_SymAdd( y , x , add0 , dx ) \
424 { \
425     TMF1 = 2.0 * ( x ) / ( add0 ) ; \
426     TMF2 = 1.0 + TMF1 * ( (1.0/2) + TMF1 * ( (1.0/6) \
427                + TMF1 * ( (1.0/24) + TMF1 * ( (1.0/120) \
428                + TMF1 * ( (1.0/720) + TMF1 * (1.0/5040) ) ) ) ) ) ; \
429     TMF3 = (1.0/2) + TMF1 * ( (1.0/3) \
430                + TMF1 * ( (1.0/8) + TMF1 * ( (1.0/30) \
431                + TMF1 * ( (1.0/144) + TMF1 * (1.0/840) ) ) ) ) ; \
432     y = add0 / TMF2 ; \
433     dx = - 2.0 * TMF3 / ( TMF2 * TMF2 ) ; \
434 }
435 
436 
437 
438 /*===========================================================*
439 * Function hsmhvevaluate.
440 *=================*/
HSMHV2evaluate(double Vdse,double Vgse,double Vbse,double Vds,double Vgs,double Vbs,double vbs_jct,double vbd_jct,double Vsubs,double Vddp,double deltemp,HSMHV2instance * here,HSMHV2model * model,CKTcircuit * ckt)441 int HSMHV2evaluate
442 (
443  double        Vdse, /* external branch voltage ( Vds >= 0 are assumed -> Vdse might be negative.) */
444  double        Vgse, /* external branch voltage */
445  double        Vbse, /* external branch voltage */
446  double        Vds, /* inner branch voltage */
447  double        Vgs, /* inner branch voltage */
448  double        Vbs, /* inner branch voltage */
449  double        vbs_jct,
450  double        vbd_jct,
451  double        Vsubs, /* substrate-source voltage */
452  double        Vddp, /* drain-drainPrime voltage */
453  double        deltemp,
454  HSMHV2instance *here,
455  HSMHV2model    *model,
456  CKTcircuit   *ckt
457  )
458 {
459   HSMHV2binningParam *pParam = &here->pParam ;
460   HSMHV2modelMKSParam *modelMKS = &model->modelMKS ;
461 /*  HSMHV2hereMKSParam  *hereMKS = &here->hereMKS ;*/
462   /*-----------------------------------*
463    * Constants for Smoothing functions
464    *---------------*/
465   const double vth_dlt = 1.0e-3 ;
466   /*  const double cclmmdf = 1.0e-2 ;*/
467   const double cclmmdf = 1.0e-1 ;
468   const double C_cm2m  = 1.0e-2 ;
469   const double qme_dlt = 1.0e-9 * C_cm2m ;
470   const double rdsl2_dlt = 10.0e-3 * C_cm2m ;
471   const double rdsu2_dlt = 50.0e-6 * C_cm2m ;
472   const double rdsz_dlt  = 0.1e-3 * C_cm2m ;
473 /*  const double qme2_dlt = 5.0e-2 ;*/
474   const double eef_dlt = 1.0e-2 / C_cm2m ;
475   const double sti2_dlt = 2.0e-3 ;
476   const double pol_dlt = 5.0e-2 ;
477 /*  const double psia2_dlt = 5.0e-3 ;*/
478   const double psisti_dlt = 5.0e-3 ;
479 
480   /*---------------------------------------------------*
481    * Local variables.
482    *-----------------*/
483   /* Constants ----------------------- */
484   const int lp_s0_max = 20 ;
485   const int lp_sl_max = 40 ;
486   const int lp_se_max = 150 ;
487 
488   const double dP_max  = 0.1e0 ;
489   const double ps_conv = 1.0e-12 ;
490   const double ps_conv2 = 1.0e-10 ;
491 
492   /* double  ps_conv = 1.0e-13 ;*/
493   const double gs_conv = 1.0e-8 ;
494   /** depletion **/
495   const double znbd3 = 3.0e0 ;
496   const double znbd5 = 5.0e0 ;
497   const double cn_nc3 = C_SQRT_2 / 108e0 ;
498   /* 5-degree, contact:Chi=5 */
499   const double cn_nc51 =  0.707106781186548 ; /* sqrt(2)/2 */
500   const double cn_nc52 = -0.117851130197758 ; /* -sqrt(2)/12 */
501   const double cn_nc53 =  0.0178800506338833 ; /* (187 - 112*sqrt(2))/1600 */
502   const double cn_nc54 = -0.00163730162779191 ; /* (-131 + 88*sqrt(2))/4000 */
503   const double cn_nc55 =  6.36964918866352e-5 ; /* (1509-1040*sqrt(2))/600000 */
504   /** inversion **/
505   /* 3-degree polynomial approx for ( exp[Chi]-1 )^{1/2} */
506   const double cn_im53 =  2.9693154855770998e-1 ;
507   const double cn_im54 = -7.0536542840097616e-2 ;
508   const double cn_im55 =  6.1152888951331797e-3 ;
509   /** initial guess **/
510   const double c_ps0ini_2 = 8.0e-4 ;
511   const double c_pslini_1 = 0.3e0 ;
512   const double c_pslini_2 = 3.0e-2 ;
513 
514   const double VgVt_small = 1.0e-12 ;
515   /* const double Vbs_min = model->HSMHV2_vbsmin ; */
516   /* const double Vds_max = 10.5e0 ; */
517   /* const double Vgs_max = 10.5e0 ; */
518   const double epsm10 = 10.0e0 * C_EPS_M ;
519   const double small = 1.0e-25 ;
520   const double small2= 1e-12 ;      /* for Ra(Vdse) dependence */
521   const double c_exp_2 = 7.38905609893065 ;
522   const double large_arg = 80 ; // log(1.0e100) ;
523 
524   double Vbs_max = 0.8e0, Vbs_max_dT =0.0 ;
525   double Vbs_bnd = 0.4e0, Vbs_bnd_dT =0.0 ; /* start point of positive Vbs bending */
526   double Gdsmin = 0.0 ;
527 
528   /* Internal flags  --------------------*/
529   int flg_err = 0 ;   /* error level */
530   int flg_rsrd = 0 ;  /* Flag for handling Rs and Rd */
531   /* int flg_iprv = 0 ;  */ /* Flag for initial guess of Ids  -> not necessary any more */
532   int flg_pprv = 0 ;  /* Flag for initial guesses of Ps0 and Pds */
533   int flg_noqi =0;    /* Flag for the cases regarding Qi=Qd=0 */
534   /* int flg_vbsc = 0 ; */ /* Flag for Vbs confining  -> not necessary any more */
535   int flg_info = 0 ;
536   int flg_conv = 0 ;  /* Flag for Poisson loop convergence */
537   int flg_qme = 0 ;   /* Flag for QME */
538   int flg_nqs=0 ;     /* Flag for NQS calculation */
539 
540   /* Important Variables in HiSIM -------*/
541   /* confined bias */
542   double Vbscl=0.0, Vbscl_dVbs=0.0, Vbscl_dT=0.0, Vbscl_dVbs_dVbs = 0.0, Vbscl_dVbs_dT = 0.0 ;
543   double Vgp =0.0, Vgp_dVbs =0.0, Vgp_dVds =0.0, Vgp_dVgs =0.0, Vgp_dT =0.0 ;
544   double Vgs_fb =0.0 ;
545   /* Ps0 : surface potential at the source side */
546   double Ps0 =0.0, Ps0_dVbs =0.0, Ps0_dVds =0.0, Ps0_dVgs =0.0, Ps0_dT =0.0 ;
547   double Ps0_ini =0.0 ;
548   double Ps0_iniA =0.0, Ps0_iniA_dVxb =0.0, Ps0_iniA_dVgb =0.0, Ps0_iniA_dT =0.0 ;
549   double Ps0_iniB =0.0, Ps0_iniB_dVxb =0.0, Ps0_iniB_dVgb =0.0, Ps0_iniB_dT =0.0 ;
550   /* Psl : surface potential at the drain side */
551   double Psl =0.0, Psl_dVbs =0.0, Psl_dVds =0.0, Psl_dVgs =0.0, Psl_dT =0.0 ;
552   double Psl_lim =0.0, dPlim =0.0 ;
553   /* Pds := Psl - Ps0 */
554   double Pds = 0.0, Pds_dVbs = 0.0, Pds_dVds = 0.0, Pds_dVgs  =0.0, Pds_dT =0.0 ;
555   double Pds_ini =0.0 ;
556   double Pds_max =0.0 ;
557   /* iteration numbers of Ps0 and Psl equations. */
558   int lp_s0 = 0 , lp_sl = 0 ;
559   /* Xi0 := beta * ( Ps0 - Vbs ) - 1. */
560   double Xi0 =0.0, Xi0_dVbs =0.0, Xi0_dVds =0.0, Xi0_dVgs =0.0, Xi0_dT =0.0 ;
561   double Xi0p12 =0.0, Xi0p12_dVbs =0.0, Xi0p12_dVds =0.0, Xi0p12_dVgs =0.0, Xi0p12_dT =0.0 ;
562   double Xi0p32 =0.0, Xi0p32_dVbs =0.0, Xi0p32_dVds =0.0, Xi0p32_dVgs =0.0, Xi0p32_dT =0.0 ;
563   /* Xil := beta * ( Psl - Vbs ) - 1. */
564   double Xil =0.0,    Xil_dVbs =0.0,    Xil_dVds =0.0,    Xil_dVgs =0.0,    Xil_dT =0.0 ;
565   double Xilp12 =0.0, Xilp12_dVbs =0.0, Xilp12_dVds =0.0, Xilp12_dVgs =0.0, Xilp12_dT =0.0 ;
566   double Xilp32 =0.0, Xilp32_dVbs =0.0, Xilp32_dVds =0.0, Xilp32_dVgs =0.0, Xilp32_dT =0.0 ;
567   /* modified bias and potential for sym.*/
568   double Vbsz =0.0,  Vbsz_dVbs =0.0,  Vbsz_dVds =0.0,  Vbsz_dT =0.0 ;
569   double Vdsz =0.0,  Vdsz_dVbs =0.0,  Vdsz_dVds =0.0,  Vdsz_dT =0.0 ;
570   double Vgsz =0.0,  Vgsz_dVbs =0.0,  Vgsz_dVds =0.0,  Vgsz_dVgs =0.0, Vgsz_dT =0.0  ;
571   double Vzadd =0.0, Vzadd_dVbs =0.0, Vzadd_dVds = 0.0, Vzadd_dT = 0.0 ;
572   double Ps0z =0.0,  Ps0z_dVbs =0.0,  Ps0z_dVds =0.0,  Ps0z_dVgs =0.0,  Ps0z_dT =0.0 ;
573   double Pzadd =0.0, Pzadd_dVbs =0.0, Pzadd_dVds =0.0, Pzadd_dVgs =0.0, Pzadd_dT =0.0 ;
574 
575   /* IBPC */
576   double dVbsIBPC =0.0, dVbsIBPC_dVbs =0.0, dVbsIBPC_dVds =0.0, dVbsIBPC_dVgs =0.0, dVbsIBPC_dT =0.0 , dVbsIBPC_dVddp =0.0 ;
577   double dG3 =0.0,      dG3_dVbs =0.0,      dG3_dVds =0.0,      dG3_dVgs =0.0,      dG3_dT =0.0 ,      dG3_dVddp =0.0 ;
578   double dG4 =0.0,      dG4_dVbs =0.0,      dG4_dVds =0.0,      dG4_dVgs =0.0,      dG4_dT =0.0 ,      dG4_dVddp =0.0 ;
579   double dIdd =0.0,     dIdd_dVbs =0.0,     dIdd_dVds =0.0,     dIdd_dVgs =0.0,     dIdd_dT =0.0 ,     dIdd_dVddp =0.0 ;
580 
581   double betaWL =0.0, betaWL_dVbs =0.0, betaWL_dVds =0.0, betaWL_dVgs =0.0, betaWL_dT =0.0 ;
582 
583   /* Chi := beta * ( Ps{0/l} - Vbs ) */
584   double Chi =0.0, Chi_dVbs =0.0, Chi_dVds =0.0, Chi_dVgs =0.0, Chi_dT =0.0 ;
585   /* Rho := beta * ( Psl - Vds ) */
586   double Rho =0.0, Rho_dT =0.0 ;
587   /* threshold voltage */
588   double Vth =0.0 ;
589   double Vth0 =0.0, Vth0_dVb =0.0, Vth0_dVd =0.0, Vth0_dVg =0.0, Vth0_dT =0.0 ;
590   /* variation of threshold voltage */
591   double dVth =0.0, dVth_dVb =0.0, dVth_dVd =0.0, dVth_dVg =0.0, dVth_dT = 0.0 ;
592   double dVth0 =0.0 ;
593   double dVth0_dVb =0.0, dVth0_dVd =0.0, dVth0_dVg =0.0, dVth0_dT =0.0 ;
594   double dVthSC =0.0 ;
595   double dVthSC_dVb =0.0, dVthSC_dVd =0.0, dVthSC_dVg =0.0, dVthSC_dT =0.0 ;
596   double Pb20b =0.0, Pb20b_dVg =0.0, Pb20b_dVb =0.0, Pb20b_dVd =0.0, Pb20b_dT =0.0 ;
597   double dVthW =0.0, dVthW_dVb =0.0, dVthW_dVd =0.0, dVthW_dVg =0.0, dVthW_dT =0.0 ;
598   /* Alpha and related parameters */
599   double Alpha =0.0, Alpha_dVbs =0.0, Alpha_dVds =0.0, Alpha_dVgs =0.0, Alpha_dT =0.0 ;
600   double Achi =0.0,  Achi_dVbs =0.0,  Achi_dVds =0.0,  Achi_dVgs =0.0,  Achi_dT =0.0 ;
601   double VgVt =0.0,  VgVt_dVbs =0.0,  VgVt_dVds =0.0,  VgVt_dVgs =0.0,  VgVt_dT =0.0 ;
602   double Pslsat =0.0 ;
603   double Vdsat =0.0 ;
604   double VdsatS =0.0, VdsatS_dVbs =0.0, VdsatS_dVds =0.0, VdsatS_dVgs =0.0, VdsatS_dT =0.0 ;
605   double Delta =0.0 ;
606   /* Q_B and capacitances */
607   double Qb =0.0,  Qb_dVbs =0.0,  Qb_dVds =0.0,  Qb_dVgs =0.0,  Qb_dT=0.0 ;
608   double Qbu =0.0, Qbu_dVbs =0.0, Qbu_dVds =0.0, Qbu_dVgs =0.0, Qbu_dT =0.0 ;
609   /* Q_I and capacitances */
610   double Qi =0.0,  Qi_dVbs =0.0,  Qi_dVds =0.0,  Qi_dVgs =0.0,  Qi_dT=0.0 ;
611   double Qiu =0.0, Qiu_dVbs =0.0, Qiu_dVds =0.0, Qiu_dVgs =0.0, Qiu_dT =0.0 ;
612   /* Q_D and capacitances */
613   double Qd =0.0,  Qd_dVbs =0.0,  Qd_dVds =0.0,  Qd_dVgs =0.0,  Qd_dT =0.0 ;
614   /* channel current */
615   double Ids =0.0,  Ids_dVbs =0.0,  Ids_dVds =0.0,  Ids_dVgs =0.0,  Ids_dT =0.0, Ids_dRa =0.0 ;
616   double Ids0 =0.0, Ids0_dVbs =0.0, Ids0_dVds =0.0, Ids0_dVgs =0.0, Ids0_dT =0.0 ;
617   /* STI */
618   double dVthSCSTI =0.0, dVthSCSTI_dVg =0.0, dVthSCSTI_dVd =0.0, dVthSCSTI_dVb =0.0, dVthSCSTI_dT =0.0 ;
619   double Vgssti =0.0,    Vgssti_dVbs =0.0,   Vgssti_dVds =0.0,   Vgssti_dVgs =0.0,   Vgssti_dT =0.0 ;
620   double costi0 =0.0 ;
621   double costi1 =0.0, costi1_dT =0.0 ;
622   double costi3 =0.0, costi3_dVb =0.0,    costi3_dVd =0.0,    costi3_dVg =0.0,    costi3_dT =0.0 ;
623   double              costi3_dVb_c3 =0.0, costi3_dVd_c3 =0.0, costi3_dVg_c3 =0.0, costi3_dT_c3 =0.0 ;
624   double costi4 =0.0, costi4_dT =0.0 ;
625   double costi5 =0.0, costi5_dT =0.0 ;
626   double costi6 =0.0, costi6_dT =0.0 ;
627   double costi7 =0.0, costi7_dT =0.0 ;
628   double Psasti =0.0, Psasti_dVbs =0.0, Psasti_dVds =0.0, Psasti_dVgs =0.0, Psasti_dT =0.0 ;
629   double Psbsti =0.0, Psbsti_dVbs =0.0, Psbsti_dVds =0.0, Psbsti_dVgs =0.0, Psbsti_dT =0.0 ;
630   double Psab =0.0,   Psab_dVbs =0.0,   Psab_dVds =0.0,   Psab_dVgs =0.0,   Psab_dT =0.0 ;
631   double Psti =0.0,   Psti_dVbs =0.0,   Psti_dVds =0.0,   Psti_dVgs =0.0,   Psti_dT =0.0 ;
632   double sq1sti =0.0, sq1sti_dVbs =0.0, sq1sti_dVds =0.0, sq1sti_dVgs =0.0, sq1sti_dT =0.0 ;
633   double sq2sti =0.0, sq2sti_dVbs =0.0, sq2sti_dVds =0.0, sq2sti_dVgs =0.0, sq2sti_dT =0.0 ;
634   double Qn0sti =0.0, Qn0sti_dVbs =0.0, Qn0sti_dVds =0.0, Qn0sti_dVgs =0.0, Qn0sti_dT =0.0 ;
635   double Idssti =0.0, Idssti_dVbs =0.0, Idssti_dVds =0.0, Idssti_dVgs =0.0, Idssti_dT=0.0 ;
636   /* constants */
637   double beta =0.0,     beta_dT =0.0 ;
638   double beta_inv =0.0, beta_inv_dT =0.0 ;
639   double beta2 =0.0 ;
640   double Pb2 =0.0,      Pb2_dT =0.0 ;
641   double Pb20 =0.0 ;
642   double Pb2c =0.0 ;
643   double Vfb =0.0 ;
644   double c_eox =0.0 ;
645   double Leff =0.0, Weff =0.0, WeffLD_nf =0.0 ;
646   double Ldrift0 =0.0 ;
647   double q_Nsub =0.0 ;
648   /* PART-1 */
649   /* Accumulation zone */
650   double Psa =0.0 ;
651   double Psa_dVbs =0.0, Psa_dVds =0.0, Psa_dVgs =0.0, Psa_dT =0.0 ;
652   /* CLM*/
653   double Psdl =0.0, Psdl_dVbs =0.0, Psdl_dVds =0.0, Psdl_dVgs =0.0, Psdl_dT =0.0 ;
654   double Lred =0.0, Lred_dVbs =0.0, Lred_dVds =0.0, Lred_dVgs =0.0, Lred_dT =0.0 ;
655   double Lch =0.0,  Lch_dVbs =0.0,  Lch_dVds =0.0,  Lch_dVgs =0.0,  Lch_dT =0.0 ;
656   double Wd =0.0,   Wd_dVbs =0.0,   Wd_dVds =0.0,   Wd_dVgs =0.0,   Wd_dT =0.0 ;
657   double Aclm =0.0 ;
658   /* Pocket Implant */
659   double Vthp=0.0,   Vthp_dVb=0.0,   Vthp_dVd=0.0,   Vthp_dVg =0.0,   Vthp_dT =0.0 ;
660   double dVthLP=0.0, dVthLP_dVb=0.0, dVthLP_dVd=0.0, dVthLP_dVg =0.0, dVthLP_dT =0.0 ;
661   double bs12=0.0,   bs12_dVb=0.0,   bs12_dVd =0.0,  bs12_dVg =0.0, bs12_dT =0.0 ;
662   double Qbmm=0.0,   Qbmm_dVb=0.0,   Qbmm_dVd =0.0,  Qbmm_dVg =0.0, Qbmm_dT =0.0 ;
663   double dqb=0.0,    dqb_dVb=0.0,    dqb_dVg=0.0,    dqb_dVd =0.0,  dqb_dT =0.0 ;
664   double Vdx=0.0,    Vdx_dVbs=0.0,   Vdx_dT=0.0 ;
665   double Vdx2=0.0,   Vdx2_dVbs=0.0,  Vdx2_dT=0.0 ;
666   double Pbsum=0.0,  Pbsum_dVb=0.0,  Pbsum_dVd=0.0,  Pbsum_dVg =0.0,  Pbsum_dT =0.0 ;
667   double sqrt_Pbsum =0.0 ;
668   /* Poly-Depletion Effect */
669   const double pol_b = 1.0 ;
670   double dPpg =0.0,  dPpg_dVb =0.0,  dPpg_dVd =0.0,  dPpg_dVg =0.0,   dPpg_dT = 0.0 ;
671   /* Quantum Effect */
672   double Tox =0.0,     Tox_dVb =0.0,     Tox_dVd =0.0,     Tox_dVg =0.0,  Tox_dT =0.0 ;
673   double dTox =0.0,    dTox_dVb =0.0,    dTox_dVd =0.0,    dTox_dVg =0.0, dTox_dT =0.0  ;
674   double Cox =0.0,     Cox_dVb =0.0,     Cox_dVd =0.0,     Cox_dVg =0.0,  Cox_dT =0.0 ;
675   double Cox_inv =0.0, Cox_inv_dVb =0.0, Cox_inv_dVd =0.0, Cox_inv_dVg =0.0, Cox_inv_dT =0.0 ;
676   double Tox0 =0.0,    Cox0 =0.0,        Cox0_inv =0.0 ;
677   double Vthq=0.0,     Vthq_dVb =0.0,    Vthq_dVd =0.0 ;
678   /* Igate , Igidl , Igisl */
679   const double igate_dlt = 1.0e-2 / C_cm2m ;
680   const double gidlvds_dlt = 1.0e-5 ;
681   const double gidla = 100.0 ;
682   double Psdlz =0.0, Psdlz_dVbs =0.0, Psdlz_dVds =0.0, Psdlz_dVgs =0.0, Psdlz_dT =0.0 ;
683   double Egp12 =0.0, Egp12_dT =0.0 ;
684   double Egp32 =0.0, Egp32_dT =0.0 ;
685   double E1 =0.0,    E1_dVb =0.0,     E1_dVd =0.0,     E1_dVg =0.0,     E1_dT =0.0 ;
686   double Etun =0.0,  Etun_dVbs =0.0,  Etun_dVds =0.0,  Etun_dVgs =0.0,  Etun_dT =0.0 ;
687   double Vdsp=0.0,   Vdsp_dVd =0.0 ;
688   double Egidl =0.0, Egidl_dVb =0.0,  Egidl_dVd =0.0,  Egidl_dVg =0.0,  Egidl_dT =0.0 ;
689   double Egisl =0.0, Egisl_dVb =0.0,  Egisl_dVd =0.0,  Egisl_dVg =0.0,  Egisl_dT =0.0 ;
690   double Igate =0.0, Igate_dVbs =0.0, Igate_dVds =0.0, Igate_dVgs =0.0, Igate_dT =0.0 ;
691   double Igs =0.0,   Igs_dVbs =0.0,   Igs_dVds =0.0,   Igs_dVgs =0.0,   Igs_dT =0.0 ;
692   double Igd =0.0,   Igd_dVbs =0.0,   Igd_dVds =0.0,   Igd_dVgs =0.0,   Igd_dT =0.0 ;
693   double Igb =0.0,   Igb_dVbs =0.0,   Igb_dVds =0.0,   Igb_dVgs =0.0,   Igb_dT =0.0 ;
694   double Igidl =0.0, Igidl_dVbs =0.0, Igidl_dVds =0.0, Igidl_dVgs =0.0, Igidl_dT =0.0 ;
695   double Igisl =0.0, Igisl_dVbs =0.0, Igisl_dVds =0.0, Igisl_dVgs =0.0, Igisl_dT =0.0 ;
696   double Vdb =0.0, Vsb =0.0 ;
697   /* connecting function */
698   double FD2 =0.0,    FD2_dVbs =0.0,    FD2_dVds =0.0,    FD2_dVgs =0.0,    FD2_dT =0.0 ;
699   double FMDVDS =0.0, FMDVDS_dVbs =0.0, FMDVDS_dVds =0.0, FMDVDS_dVgs =0.0, FMDVDS_dT =0.0 ;
700 
701   double cnst0 =0.0,  cnst0_dT =0.0;
702   double cnst1 =0.0,  cnst1_dT =0.0;
703   double cnstCoxi =0.0, cnstCoxi_dVb =0.0, cnstCoxi_dVd =0.0, cnstCoxi_dVg =0.0, cnstCoxi_dT =0.0 ;
704   double fac1 =0.0,     fac1_dVbs =0.0,    fac1_dVds =0.0,    fac1_dVgs =0.0,    fac1_dT =0.0 ;
705   double fac1p2 =0.0,   fac1p2_dT =0.0 ;
706   double fs01 =0.0, fs01_dVbs =0.0, fs01_dVds =0.0, fs01_dVgs =0.0, fs01_dT =0.0, fs01_dPs0 =0.0 ;
707   double fs02 =0.0, fs02_dVbs =0.0, fs02_dVds =0.0, fs02_dVgs =0.0, fs02_dT =0.0, fs02_dPs0 =0.0 ;
708   double fsl1 =0.0, fsl1_dVbs =0.0, fsl1_dVds =0.0, fsl1_dVgs =0.0, fsl1_dT =0.0, fsl1_dPsl =0.0 ;
709   double fsl2 =0.0, fsl2_dVbs =0.0, fsl2_dVds =0.0, fsl2_dVgs =0.0, fsl2_dT =0.0, fsl2_dPsl =0.0 ;
710   double cfs1 =0.0, cfs1_dT =0.0 ;
711   double fb =0.0,   fb_dChi =0.0 ;
712   double fi =0.0,   fi_dChi =0.0 ;
713   double exp_Chi =0.0,     exp_Chi_dT =0.0 ;
714   double exp_Rho =0.0,     exp_Rho_dT =0.0 ;
715   double exp_bVbs =0.0,    exp_bVbs_dT =0.0 ;
716   double exp_bVbsVds =0.0, exp_bVbsVds_dT =0.0 ;
717   double exp_bPs0 =0.0,    exp_bPs0_dT =0.0 ;
718   double Fs0 =0.0,         Fs0_dPs0 =0.0 ;
719   double Fsl =0.0,         Fsl_dPsl =0.0 ;
720   double dPs0 =0.0,        dPsl =0.0 ;
721   double Qn0 =0.0,   Qn0_dVbs =0.0,   Qn0_dVds =0.0,   Qn0_dVgs =0.0,   Qn0_dT =0.0 ;
722   double Qb0 =0.0,   Qb0_dVb =0.0,    Qb0_dVd =0.0,    Qb0_dVg =0.0,    Qb0_dT =0.0 ;
723   double Qbnm =0.0,  Qbnm_dVbs =0.0,  Qbnm_dVds =0.0,  Qbnm_dVgs =0.0,  Qbnm_dT =0.0 ;
724   double DtPds =0.0, DtPds_dVbs =0.0, DtPds_dVds =0.0, DtPds_dVgs =0.0, DtPds_dT =0.0 ;
725   double Qinm =0.0,  Qinm_dVbs =0.0,  Qinm_dVds =0.0,  Qinm_dVgs =0.0,  Qinm_dT =0.0 ;
726   double Qidn =0.0,  Qidn_dVbs =0.0,  Qidn_dVds =0.0,  Qidn_dVgs =0.0,  Qidn_dT =0.0 ;
727   double Qdnm =0.0,  Qdnm_dVbs =0.0,  Qdnm_dVds =0.0,  Qdnm_dVgs =0.0,  Qdnm_dT =0.0 ;
728   double Qddn =0.0,  Qddn_dVbs =0.0,  Qddn_dVds =0.0,  Qddn_dVgs =0.0,  Qddn_dT =0.0 ;
729   double Quot =0.0 ;
730   double Qdrat =0.5, Qdrat_dVbs =0.0, Qdrat_dVds =0.0, Qdrat_dVgs =0.0, Qdrat_dT =0.0 ;
731   double Idd =0.0,   Idd_dVbs =0.0,   Idd_dVds =0.0,   Idd_dVgs =0.0,   Idd_dT =0.0 ;
732   double Idd1 =0.0,  Idd1_dVbs =0.0,  Idd1_dVds =0.0,  Idd1_dVgs =0.0,  Idd1_dT =0.0 ;
733   double Fdd =0.0,   Fdd_dVbs =0.0,   Fdd_dVds =0.0,   Fdd_dVgs =0.0,   Fdd_dT =0.0 ;
734   double Eeff =0.0,  Eeff_dVbs =0.0,  Eeff_dVds =0.0,  Eeff_dVgs =0.0,  Eeff_dT =0.0 ;
735   double Rns =0.0,   Rns_dT =0.0 ;
736   double Mu = 0.0,   Mu_dVbs =0.0,    Mu_dVds =0.0,    Mu_dVgs =0.0,    Mu_dT =0.0 ;
737   double Muun =0.0,  Muun_dVbs =0.0,  Muun_dVds =0.0,  Muun_dVgs =0.0,  Muun_dT =0.0 ;
738   double Ey =0.0,    Ey_dVbs =0.0,    Ey_dVds =0.0,    Ey_dVgs =0.0,    Ey_dT =0.0 ;
739   double Em =0.0,    Em_dVbs =0.0,    Em_dVds =0.0,    Em_dVgs =0.0,    Em_dT =0.0 ;
740   double Vmax =0.0,  Vmax_dT =0.0 ;
741   double Eta =0.0,   Eta_dVbs =0.0,   Eta_dVds =0.0,   Eta_dVgs =0.0,   Eta_dT =0.0 ;
742   double Eta1 =0.0,    Eta1_dT =0.0 ;
743   double Eta1p12 =0.0, Eta1p12_dT =0.0 ;
744   double Eta1p32 =0.0, Eta1p32_dT =0.0 ;
745   double Eta1p52 =0.0, Eta1p52_dT =0.0 ;
746   double Zeta12 =0.0,  Zeta12_dT =0.0 ;
747   double Zeta32 =0.0,  Zeta32_dT =0.0 ;
748   double Zeta52 =0.0,  Zeta52_dT =0.0 ;
749   double F00 =0.0,   F00_dVbs =0.0,   F00_dVds =0.0,   F00_dVgs =0.0,   F00_dT =0.0 ;
750   double F10 =0.0,   F10_dVbs =0.0,   F10_dVds =0.0,   F10_dVgs =0.0,   F10_dT =0.0 ;
751   double F30 =0.0,   F30_dVbs =0.0,   F30_dVds =0.0,   F30_dVgs =0.0,   F30_dT =0.0 ;
752   double F11 =0.0,   F11_dVbs =0.0,   F11_dVds =0.0,   F11_dVgs =0.0,   F11_dT =0.0 ;
753   double Vgs_min =0.0 ;
754   double Ps0_min =0.0, Ps0_min_dVbs =0.0, Ps0_min_dVds =0.0, Ps0_min_dVgs =0.0, Ps0_min_dT =0.0 ;
755   double Acn =0.0,   Acn_dVbs =0.0,   Acn_dVds =0.0,   Acn_dVgs =0.0,   Acn_dT =0.0 ;
756   double Acd =0.0,   Acd_dVbs =0.0,   Acd_dVds =0.0,   Acd_dVgs =0.0,   Acd_dT =0.0 ;
757   double Ac1 =0.0,   Ac1_dVbs =0.0,   Ac1_dVds =0.0,   Ac1_dVgs =0.0,   Ac1_dT =0.0 ;
758   double Ac2 =0.0,   Ac2_dVbs =0.0,   Ac2_dVds =0.0,   Ac2_dVgs =0.0,   Ac2_dT =0.0 ;
759   double Ac3 =0.0,   Ac3_dVbs =0.0,   Ac3_dVds =0.0,   Ac3_dVgs =0.0,   Ac3_dT =0.0 ;
760   double Ac4 =0.0,   Ac4_dVbs =0.0,   Ac4_dVds =0.0,   Ac4_dVgs =0.0,   Ac4_dT =0.0 ;
761   double Ac31 =0.0,  Ac31_dVbs =0.0,  Ac31_dVds =0.0,  Ac31_dVgs =0.0,  Ac31_dT =0.0 ;
762   double Ac41 =0.0,                                                     Ac41_dT =0.0 ;
763   double ninvd_dT =0.0 ;
764   /* PART-2 (Isub) */
765   double Isub =0.0,      Isub_dVbs =0.0,     Isub_dVds =0.0,     Isub_dVgs =0.0,     Isub_dT=0.0 ;
766   double IsubLD =0.0,      IsubLD_dVbs =0.0,     IsubLD_dVds =0.0,     IsubLD_dVgs =0.0,     IsubLD_dT=0.0 ;
767   double IsubLD_dVddp = 0.0 ;
768   double Psislsat =0.0,  Psislsat_dVb =0.0,  Psislsat_dVd =0.0,  Psislsat_dVg =0.0,  Psislsat_dT =0.0 ;
769   double Psisubsat =0.0, Psisubsat_dVb =0.0, Psisubsat_dVd =0.0, Psisubsat_dVg =0.0, Psisubsat_dT =0.0 ;
770   double Ifn =0.0,       Ifn_dVb =0.0,       Ifn_dVd=0.0,        Ifn_dVg=0.0,        Ifn_dT = 0.0 ;
771   double Eg12=0.0,       Eg32 =0.0 ;
772   /* PART-3 (overlap) */
773   /* const double cov_dlt = 1.0e-1 ; */
774   /* const double covvgmax = 5.0 ;   */
775   double cov_slp =0.0, cov_mag =0.0 ;
776   double Qgos =0.0,    Qgos_dVbs =0.0,  Qgos_dVds =0.0,  Qgos_dVgs =0.0,  Qgos_dT =0.0 ;
777   double Qgod =0.0,    Qgod_dVbs =0.0,  Qgod_dVds =0.0,  Qgod_dVgs =0.0,  Qgod_dT =0.0 ;
778   double Qgbo =0.0,    Qgbo_dVbs =0.0,  Qgbo_dVds =0.0,  Qgbo_dVgs =0.0,  Qgbo_dT = 0.0 ;
779   double Cgdo =0.0,    Cgso =0.0,       Cgbo_loc =0.0 ;
780   double Qgso =0.0,    Qgso_dVbse =0.0, Qgso_dVdse =0.0, Qgso_dVgse =0.0 ;
781   double Qgdo =0.0,    Qgdo_dVbse =0.0, Qgdo_dVdse =0.0, Qgdo_dVgse =0.0 ;
782   /* fringe capacitance */
783   double Qfd =0.0,     Cfd =0.0 ;
784   double Qfs =0.0,     Cfs =0.0 ;
785   /* Cqy */
786   double Ec =0.0,      Ec_dVbs =0.0,    Ec_dVds =0.0,    Ec_dVgs =0.0,    Ec_dT =0.0 ;
787   double Pslk =0.0,    Pslk_dVbs =0.0,  Pslk_dVds =0.0,  Pslk_dVgs =0.0,  Pslk_dT =0.0 ;
788   double Qy =0.0,      Qy_dVbs =0.0,    Qy_dVds =0.0,    Qy_dVgs =0.0,    Qy_dT =0.0  ;
789 
790   /* PART-5 (NQS) */
791   double tau =0.0,  tau_dVbs=0.0,  tau_dVds=0.0,  tau_dVgs =0.0,  tau_dT=0.0  ;
792   double taub =0.0, taub_dVbs=0.0, taub_dVds=0.0, taub_dVgs =0.0, taub_dT =0.0 ;
793   /* PART-6 (noise) */
794   /* 1/f */
795   double NFalp =0.0, NFtrp =0.0, Cit =0.0, Nflic =0.0 ;
796   /* thermal */
797   double Eyd =0.0, Mu_Ave= 0.0, Nthrml =0.0, Mud_hoso =0.0 ;
798   /* induced gate noise ( Part 0/3 ) */
799   double kusai00 =0.0, kusaidd =0.0, kusaiL =0.0, kusai00L =0.0 ;
800   int flg_ign = 0 ;
801   double sqrtkusaiL =0.0, kusai_ig =0.0, gds0_ign =0.0, gds0_h2 =0.0, GAMMA =0.0, crl_f =0.0 ;
802   const double c_sqrt_15 =3.872983346207417e0 ; /* sqrt(15) */
803   const double Cox_small =1.0e-6 ;
804   const double c_16o135 =1.185185185185185e-1 ; /* 16/135 */
805   double Nign0 =0.0, MuModA =0.0, MuModB =0.0, correct_w1 =0.0 ;
806 
807   /* usage of previously calculated values */
808   double vtol_pprv =1.01e-1 ;
809   double Vbsc_dif  =0.0, Vdsc_dif =0.0,  Vgsc_dif =0.0,  sum_vdif =0.0 ;
810   double Vbsc_dif2 =0.0, Vdsc_dif2 =0.0, Vgsc_dif2 =0.0, sum_vdif2 =0.0 ;
811   double dVbs =0.0,      dVds =0.0,      dVgs =0.0 ;
812 
813   /* temporary vars. & derivatives*/
814   double TX =0.0, TX_dVbs =0.0, TX_dVds =0.0, TX_dVgs =0.0, TX_dT =0.0 ;
815   double TY =0.0, TY_dVbs =0.0, TY_dVds =0.0, TY_dVgs =0.0, TY_dT =0.0 ;
816   double T0 =0.0, T0_dVb =0.0, T0_dVd =0.0, T0_dVg =0.0, T0_dT =0.0 ;
817   double T1 =0.0, T1_dVb =0.0, T1_dVd =0.0, T1_dVg =0.0, T1_dT =0.0, T1_dVdse_eff =0.0 ;
818   double T2 =0.0, T2_dVb =0.0, T2_dVd =0.0, T2_dVg =0.0, T2_dT =0.0 ;
819   double T3 =0.0, T3_dVb =0.0, T3_dVd =0.0, T3_dVg =0.0, T3_dT =0.0 ;
820   double T4 =0.0, T4_dVb =0.0, T4_dVd =0.0, T4_dVg =0.0, T4_dT =0.0 ;
821   double T5 =0.0, T5_dVb =0.0, T5_dVd =0.0, T5_dVg =0.0, T5_dT =0.0 ;
822   double T6 =0.0, T6_dVb =0.0, T6_dVd =0.0, T6_dVg =0.0, T6_dT =0.0 ;
823   double T7 =0.0, T7_dVb =0.0, T7_dVd =0.0, T7_dVg =0.0, T7_dT =0.0 ;
824   double T8 =0.0, T8_dVb =0.0, T8_dVd =0.0, T8_dVg =0.0, T8_dT =0.0 ;
825   double T9 =0.0, T9_dVb =0.0, T9_dVd =0.0, T9_dVg =0.0, T9_dT =0.0, T9_dVdse_eff =0.0 ;
826   double T10 =0.0, T10_dVb =0.0, T10_dVd =0.0, T10_dVg =0.0, T10_dT =0.0 ;
827   double T11 =0.0,                                           T11_dT =0.0 ;
828   double T12 =0.0;
829   double T15 =0.0, T16 =0.0, T17 =0.0 ;
830   double T4_dVb_dT, T5_dVb_dT, T6_dVb_dT, T7_dVb_dT ;
831   double T1_dVddp = 0.0 , T2_dVddp = 0.0 ;
832   double T0_dVddp = 0.0 , T3_dVddp = 0.0, T4_dVddp = 0.0 ;
833 
834 
835   int    flg_zone =0 ;
836 
837   /* Vdseff */
838   double Vdseff =0.0, Vdseff_dVbs =0.0, Vdseff_dVds =0.0, Vdseff_dVgs =0.0, Vdseff_dT =0.0 ;
839   double Vdsorg =0.0 ;
840 
841   /* D/S Overlap Charges: Qovd/Qovs */
842   double CVDSOVER =0.0 ;
843   double Qovdext =0.0, Qovdext_dVbse =0.0, Qovdext_dVdse =0.0, Qovdext_dVgse =0.0, Qovdext_dT =0.0 ;
844   double Qovsext =0.0, Qovsext_dVbse =0.0, Qovsext_dVdse =0.0, Qovsext_dVgse =0.0, Qovsext_dT =0.0 ;
845   double Qovd =0.0,    Qovd_dVbs =0.0,     Qovd_dVds =0.0,     Qovd_dVgs =0.0,     Qovd_dT =0.0 ;
846   double Qovs =0.0,    Qovs_dVbs =0.0,     Qovs_dVds =0.0,     Qovs_dVgs =0.0,     Qovs_dT =0.0 ;
847   double QbuLD =0.0,   QbuLD_dVbs =0.0,    QbuLD_dVds =0.0,    QbuLD_dVgs =0.0,    QbuLD_dT =0.0 ;
848   double QbdLD =0.0,   QbdLD_dVbs =0.0,    QbdLD_dVds =0.0,    QbdLD_dVgs =0.0,    QbdLD_dT =0.0 ;
849   double QbsLD =0.0,   QbsLD_dVbs =0.0,    QbsLD_dVds =0.0,    QbsLD_dVgs =0.0,    QbsLD_dT =0.0 ;
850   double QodAD =0.0,   QodAD_dVbs =0.0,    QodAD_dVds =0.0,    QodAD_dVgs =0.0,    QodAD_dT =0.0 ;
851   double QosAD =0.0,   QosAD_dVbs =0.0,    QosAD_dVds =0.0,    QosAD_dVgs =0.0,    QosAD_dT =0.0 ;
852   double QbdLDext =0.0, QbdLDext_dVbse =0.0, QbdLDext_dVdse =0.0, QbdLDext_dVgse =0.0, QbdLDext_dT =0.0 ;
853   double QbsLDext =0.0, QbsLDext_dVbse =0.0, QbsLDext_dVdse =0.0, QbsLDext_dVgse =0.0, QbsLDext_dT =0.0 ;
854 
855   /* Vgsz for SCE and PGD */
856   double Vbsz2 =0.0,   Vbsz2_dVbs =0.0,    Vbsz2_dVds =0.0,    Vbsz2_dVgs =0.0 , Vbsz2_dT =0.0;
857 
858   /* Multiplication factor * number of gate fingers */
859   double Mfactor = here->HSMHV2_m ;
860 
861 
862   /*-----------------------------------------------------------*
863    * HiSIM-HV
864    *-----------------*/
865   /* bias-dependent Rd, Rs */
866   double Rdrift =0.0,  Rdrift_dVbse =0.0,  Rdrift_dVdse =0.0,  Rdrift_dVgse =0.0,  Rdrift_dT =0.0 ;
867   double Rsdrift =0.0, Rsdrift_dVbse =0.0, Rsdrift_dVdse =0.0, Rsdrift_dVgse =0.0, Rsdrift_dT =0.0 ;
868   double Rd =0.0,      Rd_dVbse =0.0,      Rd_dVdse =0.0,      Rd_dVgse =0.0,      Rd_dT =0.0 ;
869   double Rs =0.0,      Rs_dVbse =0.0,      Rs_dVdse =0.0,      Rs_dVgse =0.0,      Rs_dT =0.0 ;
870   double Ra =0.0,      Ra_dVbse =0.0,      Ra_dVdse =0.0,      Ra_dVgse =0.0 ;
871   double               Ra_dVbs =0.0,       Ra_dVds =0.0,       Ra_dVgs =0.0 ;
872   double               Ra_dVdse_eff =0.0 ;
873   const double delta_rd = 10e-3 * C_cm2m ;
874   const double Ra_N = 20.0;	/* smoothing parameter for Ra */
875   const double Res_min = 1.0e-4 ;
876   double Rd0_dT =0.0,  Rs0_dT =0.0,        Rdvd_dT =0.0,       Rsvd_dT =0.0 ;
877   double Vdse_eff =0.0, Vdse_eff_dVbse =0.0, Vdse_eff_dVdse =0.0, Vdse_eff_dVgse =0.0,
878                         Vdse_eff_dVbs  =0.0, Vdse_eff_dVds  =0.0, Vdse_eff_dVgs  =0.0 ;
879   double VdseModeNML =0.0, VdseModeRVS =0.0 ;
880   double Vbsegmt =0.0, Vdsegmt =0.0, Vgsegmt =0.0 ;
881   double Vbserev =0.0, Vdserev =0.0, Vgserev =0.0 ;
882   double Ra_alpha,     Ra_beta ;
883 
884   /* modified external biases for symmetry */
885   double Vzadd_ext_dVd = 0.0 ;
886   double Vdserevz = 0.0, Vdserevz_dVd = 0.0 ;
887   double Vgserevz = 0.0, Vgserevz_dVd = 0.0 ;
888   double Vbserevz = 0.0, Vbserevz_dVd = 0.0 ;
889 
890   /* Substrate Effect */
891   const double RDVSUB =  model->HSMHV2_rdvsub ;
892   const double RDVDSUB = model->HSMHV2_rdvdsub ;
893   const double DDRIFT =  model->HSMHV2_ddrift ;
894   const double VBISUB =  model->HSMHV2_vbisub ;
895   const double NSUBSUB = modelMKS->HSMHV2_nsubsub ;
896   double Vsubsrev = 0.0 ;
897   double Wdep = 0.0, Wdep_dVdserev = 0.0, Wdep_dVsubsrev = 0.0 ;
898   double T1_dVdserev = 0.0, T1_dVsubsrev = 0.0, T6_dVdserev = 0.0, T6_dVsubsrev = 0.0 ;
899   double Rs_dVsubs = 0.0, Rd_dVsubs = 0.0, Rdrift_dVsubs = 0.0, Rsdrift_dVsubs = 0.0 ;
900 
901 
902   /* temperature-dependent variables for SHE model */
903   double TTEMP =0.0, TTEMP0 =0.0 ;
904   double Tdiff0 = 0.0, Tdiff0_2 = 0.0, Tdiff = 0.0, Tdiff_2 = 0.0 ;
905   double Eg =0.0,    Eg_dT =0.0 ;
906   double Nin =0.0,   Nin_dT =0.0 ;
907 
908   /* Qover 5/1 ckt-bias use */
909   double Vgbgmt =0.0, Vgbgmt_dVbs =0.0, Vgbgmt_dVds =0.0, Vgbgmt_dVgs =0.0 ;
910   double Vxbgmt =0.0, Vxbgmt_dVbs =0.0, Vxbgmt_dVds =0.0, Vxbgmt_dVgs =0.0 ;
911   double Vxbgmtcl =0.0, Vxbgmtcl_dVxbgmt =0.0, Vxbgmtcl_dT =0.0 ;
912 
913   double ModeNML =0.0, ModeRVS =0.0 ;
914 
915   double QsuLD =0.0, QsuLD_dVbs =0.0, QsuLD_dVds =0.0, QsuLD_dVgs =0.0, QsuLD_dT =0.0 ;
916   double QiuLD =0.0, QiuLD_dVbs =0.0, QiuLD_dVds =0.0, QiuLD_dVgs =0.0, QiuLD_dT =0.0 ;
917   double QidLD =0.0, QidLD_dVbs =0.0, QidLD_dVds =0.0, QidLD_dVgs =0.0, QidLD_dT =0.0 ;
918   double QisLD =0.0, QisLD_dVbs =0.0, QisLD_dVds =0.0, QisLD_dVgs =0.0, QisLD_dT =0.0 ;
919   double QidLDext =0.0, QidLDext_dVbse =0.0, QidLDext_dVdse =0.0, QidLDext_dVgse =0.0, QidLDext_dT =0.0 ;
920   double QisLDext =0.0, QisLDext_dVbse =0.0, QisLDext_dVdse =0.0, QisLDext_dVgse =0.0, QisLDext_dT =0.0 ;
921 
922   /* Self heating */
923   double mphn0_dT =0.0 ;
924   double cnst0over_dT =0.0 ;
925   double cnst0overs_dT =0.0 ;
926   double Temp_dif =0.0 ;
927   /* for SCE */
928   double ptovr_dT =0.0 ;
929 
930   /* IBPC */
931   double IdsIBPC =0.0, IdsIBPC_dVbs =0.0, IdsIBPC_dVds =0.0, IdsIBPC_dVgs =0.0, IdsIBPC_dT =0.0, IdsIBPC_dVddp =0.0 ;
932 
933   /* Qover */
934   int flg_ovzone = 0 ;
935   double VgpLD =0.0, VgpLD_dVgb =0.0 ;
936   double Vgb_fb_LD =0.0 ;
937   double Ac31_dVgb =0.0, Ac31_dVxb =0.0 ;
938   double Ac1_dVgb =0.0, Ac1_dVxb =0.0 ;
939   double Ac2_dVgb =0.0, Ac2_dVxb =0.0 ;
940   double Ac3_dVgb =0.0, Ac3_dVxb =0.0 ;
941   double Acn_dVgb =0.0, Acn_dVxb =0.0 ;
942   double Acd_dVgb =0.0, Acd_dVxb =0.0 ;
943   double Chi_dVgb =0.0, Chi_dVxb =0.0 ;
944   double Psa_dVgb =0.0, Psa_dVxb =0.0 ;
945   double QsuLD_dVgb =0.0, QsuLD_dVxb =0.0 ;
946   double QbuLD_dVgb =0.0, QbuLD_dVxb =0.0 ;
947   double fs02_dVgb =0.0, fs02_dVxb =0.0 ;
948   double TX_dVgb =0.0, TX_dVxb =0.0 ;
949   double TY_dVgb =0.0, TY_dVxb =0.0 ;
950   double Ps0LD =0.0,   Ps0LD_dVgb =0.0, Ps0LD_dVxb =0.0, Ps0LD_dT =0.0 ;
951   double Ps0LD_dVds =0.0, Ps0LD_dVgs =0.0, Ps0LD_dVbs =0.0 ;
952   double Pb2over =0.0,                                   Pb2over_dT =0.0 ;
953   double cnst1over =0.0, cnst1over_dT =0.0 ;
954 
955   int flg_overgiven =0 ;
956   int Coovlps =0,   Coovlpd =0 ;
957   double Lovers =0.0, Loverd =0.0 ;
958   double Novers =0.0, Noverd =0.0 ;
959   double Nover_func =0.0 ;
960   double cnst0over_func =0.0, cnst0over_func_dT =0.0 ;
961   /* Qover Analytical Model */
962   int lp_ld;
963   double Ta = 9.3868e-3, Tb = -0.1047839 ;
964   double Tc,                   Tc_dT ;
965   double Td, Td_dVxb, Td_dVgb, Td_dT ;
966   double Tv, Tv_dVxb, Tv_dVgb, Tv_dT ;
967   double Tu, Tu_dVxb, Tu_dVgb, Tu_dT ;
968   double Tp,                   Tp_dT ;
969   double Tq, Tq_dVxb, Tq_dVgb, Tq_dT ;
970   double     T1_dVxb, T1_dVgb ;
971   double     T5_dVxb, T5_dVgb ;
972   double VgpLD_shift, VgpLD_shift_dT ;
973   double VgpLD_shift_dVgb, VgpLD_shift_dVxb, exp_bVbs_dVxb ;
974   double gamma, gamma_dVxb, gamma_dT ;
975   double psi  , psi_dVgb  , psi_dVxb  , psi_dT ;
976   double Chi_A, Chi_A_dVgb, Chi_A_dVxb, Chi_A_dT ;
977   double Chi_B, Chi_B_dVgb, Chi_B_dVxb, Chi_B_dT ;
978 
979   double psi_B =0.0, arg_B =0.0 ;
980   double Chi_1 =0.0,   Chi_1_dVgb =0.0,   Chi_1_dVxb =0.0,   Chi_1_dT =0.0 ;
981 
982   /* global variables for depletion mode MOSFET */
983   double Pb2n_dT, Vbipn_dT = 0.0, depmphn0_dT = 0.0, depVmax_dT = 0.0 ;
984   double Qiu_noi, Qi_noi ;
985 
986 
987   /*================ Start of executable code.=================*/
988 
989 
990   if (here->HSMHV2_mode == HiSIM_NORMAL_MODE) {
991     ModeNML = 1.0 ;
992     ModeRVS = 0.0 ;
993   } else {
994     ModeNML = 0.0 ;
995     ModeRVS = 1.0 ;
996   }
997 
998   T1 = Vdse + Vgse + Vbse + Vds + Vgs + Vbs + vbd_jct + vbs_jct ;
999   if ( ! finite (T1) ) {
1000     fprintf (stderr ,
1001        "*** warning(HiSIM_HV(%s)): Unacceptable Bias(es).\n",model->HSMHV2modName ) ;
1002     fprintf (stderr , "----- bias information (HiSIM_HV)\n" ) ;
1003     fprintf (stderr , "name: %s\n" , here->HSMHV2name ) ;
1004     fprintf (stderr , "states: %d\n" , here->HSMHV2states ) ;
1005     fprintf (stderr , "Vdse= %.3e Vgse=%.3e Vbse=%.3e\n"
1006             , Vdse , Vgse , Vbse ) ;
1007     fprintf (stderr , "Vdsi= %.3e Vgsi=%.3e Vbsi=%.3e\n"
1008             , Vds , Vgs , Vbs ) ;
1009     fprintf (stderr , "vbs_jct= %12.5e vbd_jct= %12.5e\n"
1010             , vbs_jct , vbd_jct ) ;
1011     fprintf (stderr , "vd= %.3e vs= %.3e vdp= %.3e vgp= %.3e vbp= %.3e vsp= %.3e\n"
1012             , *( ckt->CKTrhsOld + here->HSMHV2dNode )
1013             , *( ckt->CKTrhsOld + here->HSMHV2sNode )
1014             , *( ckt->CKTrhsOld + here->HSMHV2dNodePrime )
1015             , *( ckt->CKTrhsOld + here->HSMHV2gNodePrime )
1016             , *( ckt->CKTrhsOld + here->HSMHV2bNodePrime )
1017             , *( ckt->CKTrhsOld + here->HSMHV2sNodePrime )  ) ;
1018     fprintf (stderr , "----- bias information (end)\n" ) ;
1019     return ( HiSIM_ERROR ) ;
1020   }
1021 
1022   flg_info = model->HSMHV2_info ;
1023   flg_nqs = model->HSMHV2_conqs ;
1024 
1025   /*-----------------------------------------------------------*
1026    * Start of the routine. (label)
1027    *-----------------*/
1028 /* start_of_routine: */
1029 
1030   /*-----------------------------------------------------------*
1031    * Temperature dependent constants.
1032    *-----------------*/
1033   if ( here->HSMHV2tempNode > 0 && pParam->HSMHV2_rth0 != 0.0 ) {
1034 
1035 #define HSMHV2EVAL
1036 #include "hsmhv2temp_eval.h"
1037 
1038   } else {
1039     beta = here->HSMHV2_beta ;
1040     TTEMP       = ckt->CKTtemp ;
1041     if ( here->HSMHV2_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV2_dtemp ; }
1042     Eg_dT       = 0.0 ;
1043     beta_dT     = 0.0 ;
1044     beta_inv_dT = 0.0 ;
1045     mphn0_dT    = 0.0 ;
1046     ptovr_dT    = 0.0 ;
1047     Vmax_dT     = 0.0 ;
1048     Pb2_dT      = 0.0 ;
1049     cnst0_dT    = 0.0 ;
1050     cnst1_dT    = 0.0 ;
1051     Nin_dT      = 0.0 ;
1052 
1053     /* depletion MOS */
1054     Pb2n_dT     = 0.0 ;
1055     Vbipn_dT    = 0.0 ;
1056     depmphn0_dT    = 0.0 ;
1057     depVmax_dT     = 0.0 ;
1058 
1059   }
1060 
1061   /* Inverse of the thermal voltage */
1062   beta_inv = here->HSMHV2_beta_inv ;
1063   beta2 = here->HSMHV2_beta2 ;
1064 
1065   /* Bandgap */
1066   Egp12 = here->HSMHV2_egp12 ;
1067   Egp32 = here->HSMHV2_egp32 ;
1068 
1069   /* Metallurgical channel geometry */
1070   Leff = here->HSMHV2_leff ;
1071   Weff = here->HSMHV2_weff ;
1072   WeffLD_nf = here->HSMHV2_weff_ld * here->HSMHV2_nf ;
1073 
1074   Ldrift0 = here->HSMHV2_ldrift1 +  here->HSMHV2_ldrift2 ;
1075 
1076   /* Flat band voltage */
1077   Vfb = pParam->HSMHV2_vfbc ;
1078 
1079   /* Surface impurity profile */
1080   q_Nsub = here->HSMHV2_qnsub ;
1081 
1082   /* satulation Velocity */
1083   Vmax = here->HSMHV2_vmax ;
1084 
1085 
1086   /* 2 phi_B */
1087   Pb2 = here->HSMHV2_pb2 ;
1088   Pb20 = here->HSMHV2_pb20 ;
1089   Pb2c = here->HSMHV2_pb2c ;
1090 
1091   /* Coefficient of the F function for bulk charge */
1092   cnst0 = here->HSMHV2_cnst0 ;
1093 
1094   /* cnst1: n_{p0} / p_{p0} */
1095   cnst1 = here->HSMHV2_cnst1 ;
1096 
1097   /* c_eox: Permitivity in ox  */
1098   c_eox = here->HSMHV2_cecox ;
1099 
1100   /* Tox and Cox without QME */
1101   Tox0 = model->HSMHV2_tox ;
1102   Cox0 = c_eox / Tox0 ;
1103   Cox0_inv = 1.0 / Cox0 ;
1104 
1105   /* for calculation of Ps0_min */
1106   Vgs_min = model->HSMHV2_type * model->HSMHV2_vgsmin ;
1107 
1108   /*---------------------------------------------------*
1109    * Determine clamping limits for too large Vbs (internal).
1110    *-----------------*/
1111 
1112   Fn_SU( T1 , Pb2  - model->HSMHV2_vzadd0 , Vbs_max , 0.1 , T0 ) ;
1113   Vbs_max = T1 ;
1114   Vbs_max_dT = Pb2_dT * T0 ;
1115 
1116   if ( Pb20 - model->HSMHV2_vzadd0 < Vbs_max ) {
1117     Vbs_max = Pb20 - model->HSMHV2_vzadd0 ;
1118     Vbs_max_dT = 0.0 ;
1119   }
1120   if ( Pb2c - model->HSMHV2_vzadd0 < Vbs_max ) {
1121     Vbs_max = Pb2c - model->HSMHV2_vzadd0 ;
1122     Vbs_max_dT = 0.0 ;
1123   }
1124 
1125   if ( Vbs_bnd > Vbs_max * 0.5 ) {
1126     Vbs_bnd = 0.5 * Vbs_max ;
1127     Vbs_bnd_dT = 0.5 * Vbs_max_dT ;
1128   }
1129 
1130 
1131   if (here->HSMHV2_rs > 0.0 || here->HSMHV2_rd > 0.0) {
1132     if ( model->HSMHV2_corsrd == 1 ) flg_rsrd  = 1 ;
1133     if ( model->HSMHV2_corsrd == 2 ) flg_rsrd  = 2 ;
1134     if ( model->HSMHV2_corsrd == 3 ) flg_rsrd  = 3 ;
1135   }
1136 
1137   /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1138    * PART-1: Basic device characteristics.
1139    *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
1140   /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
1141    * Prepare for potential initial guesses using previous values
1142    *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
1143 
1144   flg_pprv = 0 ;
1145 
1146   if ( here->HSMHV2_called >= 1 ) {
1147 
1148     Vbsc_dif = Vbs - here->HSMHV2_vbsc_prv ;
1149     Vdsc_dif = Vds - here->HSMHV2_vdsc_prv ;
1150     Vgsc_dif = Vgs- here->HSMHV2_vgsc_prv ;
1151 
1152     sum_vdif  = fabs( Vbsc_dif ) + fabs( Vdsc_dif )
1153               + fabs( Vgsc_dif ) ;
1154 
1155     if ( model->HSMHV2_copprv >= 1 && sum_vdif <= vtol_pprv  &&
1156          here->HSMHV2_mode * here->HSMHV2_mode_prv > 0 ) { flg_pprv = 1 ;}
1157 
1158     if ( here->HSMHV2_called >= 2 && flg_pprv == 1 ) {
1159       Vbsc_dif2 = here->HSMHV2_vbsc_prv - here->HSMHV2_vbsc_prv2 ;
1160       Vdsc_dif2 = here->HSMHV2_vdsc_prv - here->HSMHV2_vdsc_prv2 ;
1161       Vgsc_dif2 = here->HSMHV2_vgsc_prv - here->HSMHV2_vgsc_prv2 ;
1162       sum_vdif2 = fabs( Vbsc_dif2 ) + fabs( Vdsc_dif2 )
1163                   + fabs( Vgsc_dif2 ) ;
1164       if ( epsm10 < sum_vdif2 && sum_vdif2 <= vtol_pprv &&
1165            here->HSMHV2_mode_prv * here->HSMHV2_mode_prv2 > 0 ) { flg_pprv = 2 ; }
1166     }
1167     Temp_dif = TTEMP - here->HSMHV2_temp_prv ;
1168 
1169   } else {
1170 
1171     Vbsc_dif = 0.0 ;
1172     Vdsc_dif = 0.0 ;
1173     Vgsc_dif = 0.0 ;
1174     sum_vdif = 0.0 ;
1175     Vbsc_dif2 = 0.0 ;
1176     Vdsc_dif2 = 0.0 ;
1177     Vgsc_dif2 = 0.0 ;
1178     sum_vdif2 = 0.0 ;
1179     flg_pprv = 0 ;
1180     Temp_dif = 0.0 ;
1181   }
1182 
1183   dVbs = Vbsc_dif ;
1184   dVds = Vdsc_dif ;
1185   dVgs = Vgsc_dif ;
1186 
1187   if ( flg_pprv >= 1 ) {
1188     Ps0 = here->HSMHV2_ps0_prv ;
1189     Ps0_dVbs = here->HSMHV2_ps0_dvbs_prv ;
1190     Ps0_dVds = here->HSMHV2_ps0_dvds_prv ;
1191     Ps0_dVgs = here->HSMHV2_ps0_dvgs_prv ;
1192 
1193     Pds = here->HSMHV2_pds_prv ;
1194     Pds_dVbs = here->HSMHV2_pds_dvbs_prv ;
1195     Pds_dVds = here->HSMHV2_pds_dvds_prv ;
1196     Pds_dVgs = here->HSMHV2_pds_dvgs_prv ;
1197   }
1198 
1199   if( here->HSMHV2_cordrift == 1 && here->HSMHV2subNode >= 0 ) {
1200     /*----------------------------------------------------------*
1201      * Considering these special cases:
1202      * ( here->HSMHV2_mode == HiSIM_NORMAL_MODE  && Vdse < 0.0 )
1203      * ( here->HSMHV2_mode == HiSIM_REVERSE_MODE && Vdse < 0.0 )
1204      *----------------------------------------------------------*/
1205 
1206     Vdsegmt = here->HSMHV2_mode * Vdse ; /* geometrical outer bias */
1207     if ( Vdsegmt >= 0.0 ) { /* vdse normal mode */
1208       Vdserev = Vdsegmt ;
1209       Vsubsrev = Vsubs ;
1210     } else { /* vdse reverse mode */
1211       Vdserev = - Vdsegmt ;
1212       Vsubsrev = Vsubs - Vdsegmt ;
1213     }
1214     here->HSMHV2_Vsubsrev = Vsubsrev ;
1215 
1216     /*-----------------------------------------------------------*
1217      * Vxserevz: Modified bias introduced to realize symmetry at Vds=0.
1218      *-----------------*/
1219     Fn_SymAdd( Vzadd , Vdserev / 2 , model->HSMHV2_vzadd0 , T2 ) ;
1220     Vzadd_ext_dVd = T2 / 2 ;
1221     if ( Vzadd < ps_conv ) {
1222       Vzadd = ps_conv ;
1223       Vzadd_ext_dVd = 0.0 ;
1224     }
1225     Vdserevz = Vdserev + 2.0 * Vzadd ;
1226     Vdserevz_dVd = 1.0 + 2.0 * Vzadd_ext_dVd ;
1227     here->HSMHV2_Vdserevz = Vdserevz ;
1228     here->HSMHV2_Vdserevz_dVd = Vdserevz_dVd ;
1229 
1230   }
1231 
1232   if ( flg_rsrd == 1 || flg_rsrd == 3 ) {
1233 
1234     /*----------------------------------------------------------*
1235      * Considering these special cases:
1236      * ( here->HSMHV2_mode == HiSIM_NORMAL_MODE  && Vdse < 0.0 )
1237      * ( here->HSMHV2_mode == HiSIM_REVERSE_MODE && Vdse < 0.0 )
1238      *----------------------------------------------------------*/
1239 
1240     Vdsegmt = here->HSMHV2_mode * Vdse ; /* geometrical outer bias */
1241     Vgsegmt = Vgse - ModeRVS * Vdse ;   /* geometrical outer bias */
1242     Vbsegmt = Vbse - ModeRVS * Vdse ;   /* geometrical outer bias */
1243     if ( Vdsegmt >= 0.0 ) { /* vdse normal mode */
1244       VdseModeNML = 1 ;
1245       VdseModeRVS = 0 ;
1246       Vdserev = Vdsegmt ;
1247       Vgserev = Vgsegmt ;
1248       Vbserev = Vbsegmt ;
1249       Vsubsrev = Vsubs ;
1250     } else { /* vdse reverse mode */
1251       VdseModeNML = 0 ;
1252       VdseModeRVS = 1 ;
1253       Vdserev = - Vdsegmt ;
1254       Vgserev = Vgsegmt - Vdsegmt ;
1255       Vbserev = Vbsegmt - Vdsegmt ;
1256       Vsubsrev = Vsubs - Vdsegmt ;
1257     }
1258 
1259     if ( here->HSMHV2_rdvd > 0.0 || here->HSMHV2_rsvd > 0.0 || pParam->HSMHV2_rdvg11 > 0.0 || pParam->HSMHV2_rdvb > 0.0 || here->HSMHV2subNode >= 0 ) {
1260       /*-----------------------------------------------------------*
1261        * Vxserevz: Modified bias introduced to realize symmetry at Vds=0.
1262        *-----------------*/
1263       Fn_SymAdd( Vzadd , Vdserev / 2 , model->HSMHV2_vzadd0 , T2 ) ;
1264       Vzadd_ext_dVd = T2 / 2 ;
1265       if ( Vzadd < ps_conv ) {
1266 	Vzadd = ps_conv ;
1267 	Vzadd_ext_dVd = 0.0 ;
1268       }
1269       Vdserevz = Vdserev + 2.0 * Vzadd ;
1270       Vdserevz_dVd = 1.0 + 2.0 * Vzadd_ext_dVd ;
1271       Vgserevz = Vgserev + Vzadd ;
1272       Vgserevz_dVd = Vzadd_ext_dVd ;
1273       Vbserevz = Vbserev + Vzadd ;
1274       Vbserevz_dVd = Vzadd_ext_dVd ;
1275 
1276       /* bias-dependent Rdrift for HVMOS/LDMOS */
1277 
1278       if ( model->HSMHV2_cosym == 1 || VdseModeNML == 1 ) { /* HVMOS or normal mode LDMOS: */
1279       /* ... Vdse dependence             */
1280       T1     = VdseModeNML * here->HSMHV2_rd + VdseModeRVS * here->HSMHV2_rs ;
1281       T1_dT  = VdseModeNML * Rd0_dT         + VdseModeRVS * Rs0_dT ;
1282       T0     = VdseModeNML * here->HSMHV2_rdvd + VdseModeRVS * here->HSMHV2_rsvd ;
1283       T0_dT  = VdseModeNML * Rdvd_dT          + VdseModeRVS * Rsvd_dT ;
1284       T4     = T1 + T0 * Vdserevz ;
1285       T4_dVd = T0 * Vdserevz_dVd ;
1286       T4_dT  = T1_dT + T0_dT * Vdserevz ;
1287 
1288       /* ... Vgse dependence             */
1289       T10 = model->HSMHV2_rdvg12 + small ;
1290       T1     =   T4     * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz   / T10 ) ) ;
1291       T1_dVd =   T4_dVd * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz   / T10 ) )
1292 	       + T4     *         pParam->HSMHV2_rdvg11 * (     - Vgserevz_dVd / T10 ) ;
1293       T1_dVg =   T4     *         pParam->HSMHV2_rdvg11 * (     - 1.0     ) / T10 ;
1294       T1_dT  =   T4_dT  * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz   / T10 ) ) ;
1295       Fn_SL2( T2 , T1 , T4 , rdsl2_dlt , T0 , T5 ) ;
1296       T2_dVd = T0 * T1_dVd + T5 * T4_dVd ;
1297       T2_dVg = T0 * T1_dVg ;
1298       T2_dT  = T0 * T1_dT  + T5 * T4_dT ;
1299 
1300       T3     = T4     * ( 1.0 + pParam->HSMHV2_rdvg11 ) ;
1301       T3_dVd = T4_dVd * ( 1.0 + pParam->HSMHV2_rdvg11 ) ;
1302       T3_dT  = T4_dT  * ( 1.0 + pParam->HSMHV2_rdvg11 ) ;
1303       Fn_SU2( Rdrift , T2 , T3 , rdsu2_dlt , T0, T5 ) ;
1304       Rdrift_dVdse = T0 * T2_dVd + T5 * T3_dVd ;
1305       Rdrift_dVgse = T0 * T2_dVg ;
1306       Rdrift_dT  = T0 * T2_dT  + T5 * T3_dT ;
1307 
1308       /* ... Vbse dependence             */
1309       T1 = 1.0 - pParam->HSMHV2_rdvb * Vbserevz ;
1310       T1_dVb = - pParam->HSMHV2_rdvb ;
1311       T1_dVd = - pParam->HSMHV2_rdvb * Vbserevz_dVd ;
1312       Fn_SZ( T3 , T1 , rdsz_dlt , T4 ) ;
1313       T3 += small ;
1314       T3_dVb = T4 * T1_dVb ;
1315       T3_dVd = T4 * T1_dVd ;
1316       T0           = Rdrift ;
1317       Rdrift       = Rdrift       * T3 ;
1318       Rdrift_dVdse = Rdrift_dVdse * T3 + T0 * T3_dVd ;
1319       Rdrift_dVgse = Rdrift_dVgse * T3 ;
1320       Rdrift_dVbse =                   + T0 * T3_dVb ;
1321       Rdrift_dT    = Rdrift_dT    * T3 ;
1322 
1323       } else { /* reverse mode LDMOS: */
1324 	Rdrift =       here->HSMHV2_rs ;
1325 	Rdrift_dVdse = 0.0 ;
1326 	Rdrift_dVgse = 0.0 ;
1327 	Rdrift_dVbse = 0.0 ;
1328 	Rdrift_dT =    Rs0_dT ;
1329       }
1330 
1331 
1332       /* Rsdrift */
1333       T4    = ( VdseModeNML * here->HSMHV2_rs + VdseModeRVS * here->HSMHV2_rd ) ;
1334       T4_dT = VdseModeNML * Rs0_dT         + VdseModeRVS * Rd0_dT ;
1335       T4_dVd = 0.0 ;
1336 
1337       if ( model->HSMHV2_cosym == 1 || VdseModeRVS == 1 ) { /* HVMOS or reverse mode LDMOS: */
1338 	/* ... Vdse dependence             */
1339 	T0     = VdseModeNML * here->HSMHV2_rsvd + VdseModeRVS * here->HSMHV2_rdvd ;
1340 	T0_dT  = VdseModeNML * Rsvd_dT          + VdseModeRVS * Rdvd_dT ;
1341 	T4 = T4 + T0 * ( 2.0 * model->HSMHV2_vzadd0 ) ;
1342 	T4_dT = T4_dT + T0_dT * ( 2.0 * model->HSMHV2_vzadd0 ) ;
1343 
1344 	/* ... Vgse dependence             */
1345         T10 = model->HSMHV2_rdvg12 + small ;
1346 	T1     =   T4     * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz   / T10 ) ) ;
1347 	T1_dVd =   T4_dVd * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz   / T10 ) )
1348 	         + T4     *         pParam->HSMHV2_rdvg11 * (     - Vgserevz_dVd / T10 ) ;
1349 	T1_dVg =   T4     *         pParam->HSMHV2_rdvg11 * (     - 1.0     ) / T10 ;
1350 	T1_dT  =   T4_dT  * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz   / T10 ) ) ;
1351 	Fn_SL2( T2 , T1 , T4 , rdsl2_dlt , T0 , T5 ) ;
1352 	T2_dVd = T0 * T1_dVd + T5 * T4_dVd ;
1353 	T2_dVg = T0 * T1_dVg ;
1354 	T2_dT  = T0 * T1_dT  + T5 * T4_dT ;
1355 
1356 	T3     = T4     * ( 1.0 + pParam->HSMHV2_rdvg11 ) ;
1357 	T3_dVd = T4_dVd * ( 1.0 + pParam->HSMHV2_rdvg11 ) ;
1358 	T3_dT  = T4_dT  * ( 1.0 + pParam->HSMHV2_rdvg11 ) ;
1359        Fn_SU2( Rsdrift , T2 , T3 , rdsu2_dlt , T0, T5 ) ;
1360 	Rsdrift_dVdse = T0 * T2_dVd + T5 * T3_dVd ;
1361 	Rsdrift_dVgse = T0 * T2_dVg ;
1362 	Rsdrift_dT  = T0 * T2_dT  + T5 * T3_dT ;
1363 
1364 	/* ... Vbse dependence             */
1365 	T1 = 1.0 - pParam->HSMHV2_rdvb * Vbserevz ;
1366 	T1_dVb = - pParam->HSMHV2_rdvb ;
1367 	T1_dVd = - pParam->HSMHV2_rdvb * Vbserevz_dVd ;
1368 	Fn_SZ( T3 , T1 , rdsz_dlt , T4 ) ;
1369         T3 += small ;
1370 	T3_dVb = T4 * T1_dVb ;
1371 	T3_dVd = T4 * T1_dVd ;
1372 	T0            = Rsdrift ;
1373 	Rsdrift       = Rsdrift       * T3 ;
1374 	Rsdrift_dVdse = Rsdrift_dVdse * T3 + T0 * T3_dVd ;
1375 	Rsdrift_dVgse = Rsdrift_dVgse * T3 ;
1376 	Rsdrift_dVbse =                   + T0 * T3_dVb ;
1377 	Rsdrift_dT    = Rsdrift_dT    * T3 ;
1378       } else { /* LDMOS normal mode: */
1379 	  Rsdrift =       here->HSMHV2_rs ;
1380 	  Rsdrift_dVdse = 0.0 ;
1381 	  Rsdrift_dVgse = 0.0 ;
1382 	  Rsdrift_dVbse = 0.0 ;
1383 	  Rsdrift_dT =    Rs0_dT ;
1384       }
1385 
1386 
1387       if ( here->HSMHV2subNode >= 0 && model->HSMHV2_cosym == 0 &&
1388          ( pParam->HSMHV2_nover * ( NSUBSUB + pParam->HSMHV2_nover ) ) > 0 ) {
1389        /* external substrate node exists && LDMOS case: */
1390 	/* Substrate Effect */
1391 	T0 = VBISUB - RDVDSUB * Vdserevz - RDVSUB * Vsubsrev ;
1392 	Fn_SZ( T1, T0, 10.0, T2 ) ;
1393         T1 += epsm10 ;
1394 
1395 	T1_dVdserev  = - RDVDSUB * Vdserevz_dVd * T2 ;
1396 	T1_dVsubsrev = - RDVSUB  * T2 ;
1397 
1398 	T0 = NSUBSUB / ( pParam->HSMHV2_nover * ( NSUBSUB + pParam->HSMHV2_nover ) ) ;
1399 	T4 = 2 * C_ESI / C_QE * T0 ;
1400 	Wdep = sqrt ( T4 * T1 ) + small ;
1401 	Wdep_dVdserev =  0.5 * T4 * T1_dVdserev  / Wdep ;
1402 	Wdep_dVsubsrev = 0.5 * T4 * T1_dVsubsrev / Wdep ;
1403 
1404 	Fn_SU( Wdep, Wdep, DDRIFT, C_sub_delta * DDRIFT, T0 ) ;
1405 	Wdep_dVdserev *=  T0 ;
1406 	Wdep_dVsubsrev *= T0 ;
1407 
1408 	T0 = DDRIFT - Wdep ;
1409 	Fn_SZ( T0, T0, C_sub_delta2, T2 ) ;
1410         T0 += epsm10;
1411 	T6 = Ldrift0 / T0 ;
1412 	T6_dVdserev =  T2 * Wdep_dVdserev  * T6 / T0 ;
1413 	T6_dVsubsrev = T2 * Wdep_dVsubsrev * T6 / T0 ;
1414 
1415 	if ( VdseModeNML == 1 ) { /* Vdse normal mode: */
1416 	  T0 = Rdrift ;
1417 	  Rdrift       = T0           * T6 ;
1418 	  Rdrift_dVdse = Rdrift_dVdse * T6  +  T0 * T6_dVdserev ;
1419 	  Rdrift_dVgse = Rdrift_dVgse * T6 ;
1420 	  Rdrift_dVbse = Rdrift_dVbse * T6 ;
1421 	  Rdrift_dVsubs=                       T0 * T6_dVsubsrev ;
1422 	  Rdrift_dT    = Rdrift_dT    * T6 ;
1423 	} else { /* Vdse reverse mode: */
1424 	  T0 = Rsdrift ;
1425 	  Rsdrift =       T0            * T6 ;
1426 	  Rsdrift_dVdse = Rsdrift_dVdse * T6  +  T0 * T6_dVdserev ;
1427 	  Rsdrift_dVgse = Rsdrift_dVgse * T6 ;
1428 	  Rsdrift_dVbse = Rsdrift_dVbse * T6 ;
1429 	  Rsdrift_dVsubs =                       T0 * T6_dVsubsrev ;
1430 	  Rsdrift_dT =    Rsdrift_dT    * T6 ;
1431 	}
1432       }
1433 
1434       Rd = Rdrift ;
1435       Rd_dVgse = Rdrift_dVgse ;
1436       Rd_dVdse = Rdrift_dVdse ;
1437       Rd_dVbse = Rdrift_dVbse ;
1438       Rd_dVsubs = Rdrift_dVsubs ;
1439       Rd_dT    = Rdrift_dT ;
1440       Rs = Rsdrift ;
1441       Rs_dVgse = Rsdrift_dVgse ;
1442       Rs_dVdse = Rsdrift_dVdse ;
1443       Rs_dVbse = Rsdrift_dVbse ;
1444       Rs_dVsubs = Rsdrift_dVsubs ;
1445       Rs_dT    = Rsdrift_dT ;
1446 
1447     } else { /* bias-independent Rs/Rd */
1448       Rd = VdseModeNML * here->HSMHV2_rd + VdseModeRVS * here->HSMHV2_rs ;
1449       Rd_dT = VdseModeNML * Rd0_dT      + VdseModeRVS * Rs0_dT ;
1450       Rs = VdseModeNML * here->HSMHV2_rs + VdseModeRVS * here->HSMHV2_rd ;
1451       Rs_dT = VdseModeNML * Rs0_dT      + VdseModeRVS * Rd0_dT ;
1452     }
1453 
1454     /* Weff dependence of the resistances */
1455     Rd = Rd  /  WeffLD_nf ;
1456     Rd_dVgse /= WeffLD_nf ;
1457     Rd_dVdse /= WeffLD_nf ;
1458     Rd_dVbse /= WeffLD_nf ;
1459     Rd_dVsubs /= WeffLD_nf ;
1460     Rd_dT    /= WeffLD_nf ;
1461     Rs =  Rs /  WeffLD_nf ;
1462     Rs_dVgse /= WeffLD_nf ;
1463     Rs_dVdse /= WeffLD_nf ;
1464     Rs_dVbse /= WeffLD_nf ;
1465     Rs_dVsubs /= WeffLD_nf ;
1466     Rs_dT    /= WeffLD_nf ;
1467 
1468     /* Sheet resistances are added. */
1469     Rd += VdseModeNML * here->HSMHV2_rd0 + VdseModeRVS * here->HSMHV2_rs0 ;
1470     Rs += VdseModeNML * here->HSMHV2_rs0 + VdseModeRVS * here->HSMHV2_rd0 ;
1471 
1472     /* Re-stamps for hsmhvnoi.c */
1473     /* Please see hsmhvnoi.c */
1474     T0 = VdseModeNML * Rd + VdseModeRVS * Rs ; /* mode-dependent --> geometrical */
1475     if ( T0 > Res_min && model->HSMHV2_cothrml != 0 ) here->HSMHV2drainConductance = Mfactor / T0 ;
1476     else here->HSMHV2drainConductance = 0.0 ;
1477     T0 = VdseModeNML * Rs + VdseModeRVS * Rd ; /* mode-dependent --> geometrical */
1478     if ( T0 > Res_min && model->HSMHV2_cothrml != 0 ) here->HSMHV2sourceConductance = Mfactor / T0 ;
1479     else here->HSMHV2sourceConductance = 0.0 ;
1480 
1481   } /* end of case flg_rsrd=1 or flg_rsrd=3 */
1482 
1483 
1484     /* Clamping for Vbs > Vbs_bnd */
1485     if ( Vbs > Vbs_bnd ) {
1486       T1 = Vbs - Vbs_bnd ;
1487       T2 = Vbs_max - Vbs_bnd ;
1488       T1_dT = - Vbs_bnd_dT ;
1489       T2_dT = Vbs_max_dT - Vbs_bnd_dT ;
1490 
1491       Fn_SUPoly4m( TY , T1 , T2 , Vbscl_dVbs , T0 ) ;
1492       TY_dT = T1_dT * Vbscl_dVbs + T2_dT * T0 ;
1493 
1494       Vbscl    = Vbs_bnd    + TY ;
1495       Vbscl_dT = Vbs_bnd_dT + TY_dT ;
1496 
1497       T3 = 1 / T2 ;
1498 
1499       /* x/xmax */
1500       T4 = T1 * T3 ;
1501       T4_dVb = T3 ;
1502       T4_dT = T1_dT * T3 - T1*T3*T3*T2_dT;
1503       T4_dVb_dT = -T3*T3*T2_dT ;
1504 
1505       T5 = T4 * T4;
1506       T5_dVb = 2 * T4_dVb * T4 ;
1507       T5_dT = 2.0*T4*T4_dT;
1508       T5_dVb_dT = 2 * T4_dVb_dT * T4 + 2 * T4_dVb * T4_dT ;
1509       T15 = 2 * T4_dVb * T4_dVb ; /* T15 = T5_dVb_dVb */
1510 
1511       T6 = T4 * T5 ;
1512       T6_dVb = T4_dVb * T5 + T4 * T5_dVb ;
1513       T6_dT = T4_dT * T5 + T4 * T5_dT ;
1514       T6_dVb_dT = T4_dVb_dT * T5 + T4_dVb * T5_dT + T4_dT * T5_dVb + T4*T5_dVb_dT ;
1515       T16 = T4_dVb * T5_dVb + T4_dVb * T5_dVb + T4 * T15 ; /* T16 = T6_dVb_dVb */
1516 
1517       /* T7 = Z  T7_dVb = dZ_dVb  T17 = dZ_dVb_dVb */
1518       T7 = 1 + T4 + T5 + T6 + T5 * T5 ;
1519       T7_dVb = T4_dVb + T5_dVb + T6_dVb + 2 * T5_dVb * T5 ;
1520       T7_dT = T4_dT + T5_dT + T6_dT + 2 * T5_dT * T5 ;
1521       T7_dVb_dT = T4_dVb_dT + T5_dVb_dT + T6_dVb_dT + 2 * T5_dVb_dT * T5 + 2 * T5_dVb * T5_dT ;
1522       T17 = T15 + T16 + 2 * T15 * T5 + 2 * T5_dVb * T5_dVb ;
1523 
1524       T8 = T7 * T7 ;
1525       T8_dVb = 2 * T7_dVb * T7 ;
1526       T8_dT = 2 * T7_dT * T7 ;
1527 
1528       T9 = 1 / T8 ;
1529       T9_dVb = - T8_dVb * T9 * T9 ;
1530       T9_dT = - T8_dT * T9 * T9 ;
1531 
1532       Vbscl_dVbs = T2 * T7_dVb * T9 ;
1533       Vbscl_dVbs_dT = T2_dT * T7_dVb * T9 + T2*(T7_dVb_dT * T9+ T7_dVb * T9_dT);
1534       Vbscl_dVbs_dVbs = T2 * ( T17 * T9 + T7_dVb * T9_dVb ) ;
1535     }  else {
1536       Vbscl      = Vbs ;
1537       Vbscl_dVbs = 1.0 ;
1538       Vbscl_dT   = 0.0 ;
1539       Vbscl_dVbs_dVbs = 0.0 ;
1540     }
1541 
1542     /*-----------------------------------------------------------*
1543      * Vxsz: Modified bias introduced to realize symmetry at Vds=0.
1544      *-----------------*/
1545 
1546 
1547     T1 = Vbscl_dVbs * Vds / 2 ;
1548     Fn_SymAdd(  Vzadd , T1 , model->HSMHV2_vzadd0 , T2 ) ;
1549     Vzadd_dVbs = T2 * Vbscl_dVbs_dVbs * Vds / 2 ;
1550     Vzadd_dT = T2 * Vbscl_dVbs_dT * Vds / 2 ;
1551     T2 *= Vbscl_dVbs / 2 ;
1552     Vzadd_dVds = T2 ;
1553 
1554     if ( Vzadd < ps_conv ) {
1555       Vzadd = ps_conv ;
1556       Vzadd_dVds = 0.0 ;
1557       Vzadd_dVbs = 0.0 ;
1558       Vzadd_dT = 0.0 ;
1559     }
1560 
1561     Vbsz      = Vbscl + Vzadd ;
1562     Vbsz_dVbs = Vbscl_dVbs + Vzadd_dVbs ;
1563     Vbsz_dVds = Vzadd_dVds ;
1564     Vbsz_dT   = Vbscl_dT + Vzadd_dT;
1565 
1566     Vdsz = Vds + 2.0 * Vzadd ;
1567     Vdsz_dVbs = 2.0 * Vzadd_dVbs ;
1568     Vdsz_dVds = 1.0 + 2.0 * Vzadd_dVds ;
1569     Vdsz_dT = 2.0 * Vzadd_dT ;
1570 
1571     Vgsz = Vgs + Vzadd ;
1572     Vgsz_dVbs = Vzadd_dVbs ;
1573     Vgsz_dVgs = 1.0 ;
1574     Vgsz_dVds = Vzadd_dVds ;
1575     Vgsz_dT = Vzadd_dT ;
1576 
1577     /*---------------------------------------------------*
1578      * Factor of modification for symmetry.
1579      *-----------------*/
1580 
1581     T1 = here->HSMHV2_qnsub_esi * Cox0_inv * Cox0_inv ;
1582     T2 = Vgs - Vfb ;
1583     T3 = 1 + 2.0 / T1 * ( T2 - 1.0 / here->HSMHV2_betatnom - Vbscl ) ;
1584 
1585     Fn_SZ( T4 , T3 , 1e-3 , T5 ) ;
1586     T4 += small ;
1587     TX = sqrt( T4 ) ;
1588     Pslsat = T2 + T1 * ( 1.0 - TX ) ;
1589     VdsatS = Pslsat - Pb2c ;
1590     Fn_SL( VdsatS , VdsatS , 0.1 , 5e-2 , T6 ) ;
1591 
1592     VdsatS_dVbs = ( TX ? (T6 * T5 / TX * Vbscl_dVbs) : 0.0 ) ;
1593     VdsatS_dVds = 0.0 ;
1594     VdsatS_dVgs = ( TX ? (T6 * ( 1.0 - T5 / TX )) : 0.0 ) ;
1595     VdsatS_dT = (TX ? (T6* T5/TX * Vbscl_dT) : 0) ;
1596 
1597     T1 = Vds / VdsatS ;
1598     Fn_SUPoly4( TX , T1 , 1.0 , T0 ) ;
1599     FMDVDS = TX * TX ;
1600     T2 = 2 * TX * T0 ;
1601     T3 = T2 / ( VdsatS * VdsatS ) ;
1602     FMDVDS_dVbs = T3 * ( - Vds * VdsatS_dVbs ) ;
1603     FMDVDS_dVds = T3 * ( 1.0 * VdsatS - Vds * VdsatS_dVds ) ;
1604     FMDVDS_dVgs = T3 * ( - Vds * VdsatS_dVgs ) ;
1605     FMDVDS_dT = T3 * ( - Vds * VdsatS_dT ) ;
1606 
1607     /*-----------------------------------------------------------*
1608      * Quantum effect
1609      *-----------------*/
1610     if ( model->HSMHV2_flg_qme == 0 ) {
1611       flg_qme = 0 ;
1612     } else {
1613       flg_qme = 1 ;
1614     }
1615 
1616     T1 = here->HSMHV2_2qnsub_esi ;
1617     T2 = sqrt( T1 * Pb20 ) ;
1618     Vthq = Pb20 + Vfb + T2 * Cox0_inv ;
1619     Vthq_dVb = 0.0 ;
1620     Vthq_dVd = 0.0 ;
1621 
1622     if ( flg_qme == 0 ) {
1623       Tox = Tox0 ;
1624       Tox_dVb = 0.0 ;
1625       Tox_dVd = 0.0 ;
1626       Tox_dVg = 0.0 ;
1627       Tox_dT = 0.0 ;
1628 
1629       Cox = Cox0 ;
1630       Cox_dVb = 0.0 ;
1631       Cox_dVd = 0.0 ;
1632       Cox_dVg = 0.0 ;
1633       Cox_dT = 0.0 ;
1634 
1635       Cox_inv  = Cox0_inv ;
1636       Cox_inv_dVb = 0.0 ;
1637       Cox_inv_dVd = 0.0 ;
1638       Cox_inv_dVg = 0.0 ;
1639       Cox_inv_dT = 0.0 ;
1640 
1641       T0 = cnst0 * cnst0 * Cox_inv ;
1642       cnstCoxi = T0 * Cox_inv ;
1643       cnstCoxi_dVb = 0.0 ;
1644       cnstCoxi_dVd = 0.0 ;
1645       cnstCoxi_dVg = 0.0 ;
1646       cnstCoxi_dT = 2.0 * cnst0 * cnst0_dT * Cox_inv * Cox_inv ;
1647 
1648     } else {
1649 
1650       T5     = Vgs  - Vbs - Vthq + model->HSMHV2_qme2 ;
1651       T5_dVb = -1.0 - Vthq_dVb ;
1652       T5_dVd =      - Vthq_dVd ;
1653       T5_dVg =  1.0 ;
1654       T5_dT =  0.0 ;
1655 
1656       Fn_SZ( T2 , T5 , qme_dlt, T3) ;
1657       T2 = T2 + small ;
1658       T2_dVb = T3 * T5_dVb ;
1659       T2_dVd = T3 * T5_dVd ;
1660       T2_dVg = T3 * T5_dVg ;
1661       T2_dT = T3 * T5_dT ;
1662 
1663       T3 = 1.0 /  T2 ;
1664       T7 = -1.0 / ( T2 * T2 ) ;
1665       T3_dVb = T7 * T2_dVb ;
1666       T3_dVd = T7 * T2_dVd ;
1667       T3_dVg = T7 * T2_dVg ;
1668       T3_dT = T7 * T2_dT ;
1669 
1670       T4 = 2.0 * fabs(Vthq) ;
1671       T6 = T5 - Vgs + Vfb ;
1672       if(T6 > T4) { T4 = T6; }
1673 
1674       Fn_SU( T2 , T3 , 1.0 / T4  , qme_dlt, T6 ) ;
1675       T2_dVb = T6 * T3_dVb ;
1676       T2_dVd = T6 * T3_dVd ;
1677       T2_dVg = T6 * T3_dVg ;
1678       T2_dT = T6 * T3_dT ;
1679 
1680       dTox = model->HSMHV2_qme1 * T2 + model->HSMHV2_qme3 ;
1681       T7   = model->HSMHV2_qme1 ;
1682       dTox_dVb = T7 * T2_dVb ;
1683       dTox_dVd = T7 * T2_dVd ;
1684       dTox_dVg = T7 * T2_dVg ;
1685       dTox_dT = T7 * T2_dT ;
1686 
1687       if ( dTox * 1.0e12 < Tox0 ) {
1688         dTox = 0.0 ;
1689         dTox_dVb = 0.0 ;
1690         dTox_dVd = 0.0 ;
1691         dTox_dVg = 0.0 ;
1692         dTox_dT = 0.0 ;
1693         flg_qme = 0 ;
1694       }
1695 
1696       Tox = Tox0 + dTox ;
1697       Tox_dVb = dTox_dVb ;
1698       Tox_dVd = dTox_dVd ;
1699       Tox_dVg = dTox_dVg ;
1700       Tox_dT = dTox_dT ;
1701 
1702       Cox = c_eox / Tox ;
1703       T1  = - c_eox / ( Tox * Tox ) ;
1704       Cox_dVb = T1 * Tox_dVb ;
1705       Cox_dVd = T1 * Tox_dVd ;
1706       Cox_dVg = T1 * Tox_dVg ;
1707       Cox_dT = T1 * Tox_dT ;
1708 
1709       Cox_inv  = Tox / c_eox ;
1710       T1  = 1.0 / c_eox ;
1711       Cox_inv_dVb = T1 * Tox_dVb ;
1712       Cox_inv_dVd = T1 * Tox_dVd ;
1713       Cox_inv_dVg = T1 * Tox_dVg ;
1714       Cox_inv_dT = T1 * Tox_dT ;
1715 
1716       T0 = cnst0 * cnst0 * Cox_inv ;
1717       cnstCoxi = T0 * Cox_inv ;
1718       T1 = 2.0 * T0 ;
1719       cnstCoxi_dVb = T1 * Cox_inv_dVb ;
1720       cnstCoxi_dVd = T1 * Cox_inv_dVd ;
1721       cnstCoxi_dVg = T1 * Cox_inv_dVg ;
1722       cnstCoxi_dT = 2.0 * cnst0 * cnst0_dT * Cox_inv * Cox_inv + T1 * Cox_inv_dT;
1723     }
1724 
1725     /*---------------------------------------------------*
1726      * Vbsz2 : Vbs for dVth
1727      *-----------------*/
1728     Vbsz2 = Vbsz ;
1729     Vbsz2_dVbs =  Vbsz_dVbs ;
1730     Vbsz2_dVds = Vbsz_dVds ;
1731     Vbsz2_dVgs = 0.0  ;
1732     Vbsz2_dT = Vbsz_dT ;
1733 
1734     /*---------------------------------------------------*
1735      * Vthp : Vth with pocket.
1736      *-----------------*/
1737     T1 = here->HSMHV2_2qnsub_esi ;
1738     Qb0 = sqrt (T1 * (Pb20 - Vbsz2)) ;
1739     T2 = 0.5 * T1 / Qb0 ;
1740     Qb0_dVb = T2 * (- Vbsz2_dVbs) ;
1741     Qb0_dVd = T2 * (- Vbsz2_dVds) ;
1742     Qb0_dVg = T2 * (- Vbsz2_dVgs) ;
1743     Qb0_dT = T2 * (- Vbsz2_dT) ;
1744 
1745     Vthp = Pb20 + Vfb + Qb0 * Cox_inv + here->HSMHV2_ptovr;
1746     Vthp_dVb = Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ;
1747     Vthp_dVd = Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ;
1748     Vthp_dVg = Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ;
1749     Vthp_dT = Qb0_dT * Cox_inv + Qb0 * Cox_inv_dT + ptovr_dT ;
1750 
1751     Pb20b = Pb20 ;
1752     Pb20b_dVb = 0.0 ;
1753     Pb20b_dVd = 0.0 ;
1754     Pb20b_dVg = 0.0 ;
1755     Pb20b_dT  = 0.0 ;
1756 
1757     T0 = 0.95 ;
1758     T1 = T0 * Pb20b - Vbsz2 - 1.0e-3 ;
1759     T1_dVb = T0 * Pb20b_dVb - Vbsz2_dVbs ;
1760     T1_dVd = T0 * Pb20b_dVd - Vbsz2_dVds ;
1761     T1_dVg = T0 * Pb20b_dVg - Vbsz2_dVgs ;
1762     T1_dT = T0 * Pb20b_dT - Vbsz2_dT ;
1763     T2 = sqrt (T1 * T1 + 4.0 * T0 * Pb20b * 1.0e-3) ;
1764     T3 = T0 * Pb20b - 0.5 * (T1 + T2) ;
1765     T4 = 2.0 * T0 * 1.0e-3 ;
1766     T5 = T1 / T2 ;
1767     T6 = T4 / T2 ;
1768     T3_dVb = T0 * Pb20b_dVb
1769            - 0.5 * (T1_dVb + (T1_dVb * T5 + T6 * Pb20b_dVb ) ) ;
1770     T3_dVd = T0 * Pb20b_dVd
1771            - 0.5 * (T1_dVd + (T1_dVd * T5 + T6 * Pb20b_dVd ) ) ;
1772     T3_dVg = T0 * Pb20b_dVg
1773            - 0.5 * (T1_dVg + (T1_dVg * T5 + T6 * Pb20b_dVg ) ) ;
1774     T3_dT = T0 * Pb20b_dT
1775            - 0.5 * (T1_dT + (T1_dT * T5 + T6 * Pb20b_dT ) ) ;
1776     Pbsum = Pb20b - T3 ;
1777     Pbsum_dVb = Pb20b_dVb - T3_dVb ;
1778     Pbsum_dVd = Pb20b_dVd - T3_dVd ;
1779     Pbsum_dVg = Pb20b_dVg - T3_dVg ;
1780     Pbsum_dT = Pb20b_dT - T3_dT ;
1781 
1782     if( model->HSMHV2_codep ) {
1783        Pbsum = Pbsum + model->HSMHV2_depeta * Vdsz ;
1784        Pbsum_dVb = Pbsum_dVb + model->HSMHV2_depeta * Vdsz_dVbs ;
1785        Pbsum_dVd = Pbsum_dVd + model->HSMHV2_depeta * Vdsz_dVds ;
1786     }
1787 
1788     sqrt_Pbsum = sqrt( Pbsum ) ;
1789 
1790     /*-------------------------------------------*
1791      * dVthLP : Short-channel effect induced by pocket.
1792      * - Vth0 : Vth without pocket.
1793      *-----------------*/
1794     if ( model->HSMHV2_lp != 0.0 ) {
1795       T1 = here->HSMHV2_2qnsub_esi ;
1796       T2 = model->HSMHV2_bs2 - Vbsz2 ;
1797       T3 = T2 + small ;
1798       T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ;
1799       T5 = 0.5 * (T3 + T4) ;
1800       T6 = 0.5 * (1.0 + T3 / T4) ;
1801       T5_dVb = - Vbsz2_dVbs * T6 ;
1802       T5_dVd = - Vbsz2_dVds * T6 ;
1803       T5_dVg = - Vbsz2_dVgs * T6 ;
1804       T5_dT = - Vbsz2_dT * T6 ;
1805       T7 = 1.0 / T5 ;
1806       bs12 = model->HSMHV2_bs1 * T7 ;
1807       T8 = - bs12 * T7 ;
1808       bs12_dVb = T8 * T5_dVb ;
1809       bs12_dVd = T8 * T5_dVd ;
1810       bs12_dVg = T8 * T5_dVg ;
1811       bs12_dT = T8 * T5_dT ;
1812       Fn_SU( T10 , Vbsz2 + bs12, 0.93 * Pb20, vth_dlt, T0) ;
1813       Qbmm = sqrt (T1 * (Pb20 - T10 )) ;
1814       T9 = T0 / Qbmm ;
1815       Qbmm_dVb = 0.5 * T1 * - (Vbsz2_dVbs + bs12_dVb) * T9 ;
1816       Qbmm_dVd = 0.5 * T1 * - (Vbsz2_dVds + bs12_dVd) * T9 ;
1817       Qbmm_dVg = 0.5 * T1 * - (Vbsz2_dVgs + bs12_dVg) * T9 ;
1818       Qbmm_dT = 0.5 * T1 * - (Vbsz2_dT + bs12_dT) * T9 ;
1819 
1820       dqb = (Qb0 - Qbmm) * Cox_inv ;
1821       dqb_dVb = Vthp_dVb - Qbmm_dVb * Cox_inv - Qbmm * Cox_inv_dVb ;
1822       dqb_dVd = Vthp_dVd - Qbmm_dVd * Cox_inv - Qbmm * Cox_inv_dVd ;
1823       dqb_dVg = Vthp_dVg - Qbmm_dVg * Cox_inv - Qbmm * Cox_inv_dVg ;
1824       dqb_dT  = Qb0_dT  * Cox_inv + Qb0 * Cox_inv_dT - Qbmm_dT * Cox_inv - Qbmm * Cox_inv_dT ;
1825 
1826       T1 = 2.0 * C_QE * here->HSMHV2_nsubc * C_ESI ;
1827       T2 = sqrt( T1 * ( Pb2c - Vbsz2 ) ) ;
1828       Vth0 = Pb2c + Vfb + T2 * Cox_inv ;
1829       T3 = 0.5 * T1 / T2 * Cox_inv ;
1830       Vth0_dVb = T3 * ( - Vbsz2_dVbs ) + T2 * Cox_inv_dVb ;
1831       Vth0_dVd = T3 * ( - Vbsz2_dVds ) + T2 * Cox_inv_dVd ;
1832       Vth0_dVg = T3 * ( - Vbsz2_dVgs ) + T2 * Cox_inv_dVg ;
1833       Vth0_dT = T3 * ( - Vbsz2_dT ) + T2 * Cox_inv_dT ;
1834 
1835       T1 = C_ESI * Cox_inv ;
1836       T2 = here->HSMHV2_wdplp ;
1837       T4 = 1.0e0 / ( model->HSMHV2_lp * model->HSMHV2_lp ) ;
1838       T5 = 2.0e0 * ( model->HSMHV2_vbi - Pb20b ) * T1 * T2 * T4 ;
1839       dVth0 = T5 * sqrt_Pbsum ;
1840       T6 = 0.5 * T5 / sqrt_Pbsum ;
1841       T7 = 2.0e0 * ( model->HSMHV2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ;
1842       T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ;
1843       dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
1844       dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
1845       dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
1846       dVth0_dT = T6 * Pbsum_dT + T7 * Cox_inv_dT + T8 * Pb20b_dT ;
1847 
1848       T1 = Vthp - Vth0 ;
1849       T1_dVb = Vthp_dVb - Vth0_dVb ;
1850       T2 = pParam->HSMHV2_scp1 + pParam->HSMHV2_scp3 * Pbsum / model->HSMHV2_lp ;
1851       T2_dVb = pParam->HSMHV2_scp3 * Pbsum_dVb / model->HSMHV2_lp ;
1852       T3 = T2 + pParam->HSMHV2_scp2 * Vdsz ;
1853       T3_dVb = T2_dVb + pParam->HSMHV2_scp2 * Vdsz_dVbs ;
1854 
1855 
1856       Vdx = model->HSMHV2_scp21 + Vdsz ;
1857       Vdx_dVbs = Vdsz_dVbs ;
1858       Vdx_dT = Vdsz_dT ;
1859       Vdx2 = Vdx * Vdx ;
1860       Vdx2_dVbs = 2 * Vdx_dVbs * Vdx ;
1861       Vdx2_dT = 2 * Vdx_dT * Vdx ;
1862 
1863       dVthLP = T1 * dVth0 * T3 + dqb - here->HSMHV2_msc / Vdx2 ;
1864       dVthLP_dVb = T1_dVb * dVth0 * T3 + T1 * dVth0_dVb * T3 +  T1 * dVth0 * T3_dVb
1865                    + dqb_dVb + here->HSMHV2_msc / Vdx2 /Vdx2 *Vdx2_dVbs;
1866       T4 = T1 * dVth0 * pParam->HSMHV2_scp3 / model->HSMHV2_lp ;
1867       dVthLP_dVd = (Vthp_dVd - Vth0_dVd) * dVth0 * T3 + T1 * dVth0_dVd * T3
1868                      + T4 * Pbsum_dVd
1869                      + T1 * dVth0 * pParam->HSMHV2_scp2 * Vdsz_dVds
1870                      + dqb_dVd
1871                  + 2.0e0 * here->HSMHV2_msc * Vdx * Vdsz_dVds / ( Vdx2 * Vdx2 ) ;
1872       dVthLP_dVg = (Vthp_dVg - Vth0_dVg) * dVth0 * T3 + T1 * dVth0_dVg * T3
1873                      + T4 * Pbsum_dVg + dqb_dVg ;
1874       dVthLP_dT = (Vthp_dT - Vth0_dT) * dVth0 * T3 + T1 * dVth0_dT * T3
1875                      + T4 * Pbsum_dT
1876                      + T1 * dVth0 * pParam->HSMHV2_scp2 * Vdsz_dT
1877                      + dqb_dT
1878                  + 2.0e0 * here->HSMHV2_msc * Vdx * Vdsz_dT / ( Vdx2 * Vdx2 );
1879     } else {
1880       dVthLP = 0.0e0 ;
1881       dVthLP_dVb = 0.0e0 ;
1882       dVthLP_dVd = 0.0e0 ;
1883       dVthLP_dVg = 0.0e0 ;
1884       dVthLP_dT = 0.0e0 ;
1885     }
1886 
1887     /*---------------------------------------------------*
1888      * dVthSC : Short-channel effect induced by Vds.
1889      *-----------------*/
1890     T1 = C_ESI * Cox_inv ;
1891     T2 = here->HSMHV2_wdpl ;
1892     T3 = here->HSMHV2_lgate - model->HSMHV2_parl2 ;
1893     T4 = 1.0e0 / ( T3 * T3 ) ;
1894     T5 = 2.0e0 * ( model->HSMHV2_vbi - Pb20b ) * T1 * T2 * T4 ;
1895 
1896     dVth0 = T5 * sqrt_Pbsum ;
1897 
1898     T6 = T5 / 2.0 / sqrt_Pbsum ;
1899     T7 = 2.0e0 * ( model->HSMHV2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ;
1900     T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ;
1901     dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
1902     dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
1903     dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
1904     dVth0_dT = T6 * Pbsum_dT  + T7 * Cox_inv_dT + T8 * Pb20b_dT ;
1905 
1906     T1 = pParam->HSMHV2_sc3 / here->HSMHV2_lgate ;
1907     T4 = pParam->HSMHV2_sc1 + T1 * Pbsum ;
1908     T4_dVb = T1 * Pbsum_dVb ;
1909     T4_dVd = T1 * Pbsum_dVd ;
1910     T4_dVg = T1 * Pbsum_dVg ;
1911     T4_dT = T1 * Pbsum_dT ;
1912 
1913     T5 = T4 + pParam->HSMHV2_sc2 * Vdsz * ( 1.0 +  model->HSMHV2_sc4 * Pbsum );
1914     T5_dVb = T4_dVb + pParam->HSMHV2_sc2 * Vdsz * model->HSMHV2_sc4 * Pbsum_dVb
1915              + pParam->HSMHV2_sc2 * Vdsz_dVbs * model->HSMHV2_sc4 * Pbsum;
1916     T5_dVd = T4_dVd + pParam->HSMHV2_sc2 * Vdsz_dVds * ( 1.0 + model->HSMHV2_sc4 * Pbsum )
1917              + pParam->HSMHV2_sc2 * Vdsz * model->HSMHV2_sc4 * Pbsum_dVd;
1918     T5_dVg = T4_dVg + pParam->HSMHV2_sc2 * Vdsz * model->HSMHV2_sc4 * Pbsum_dVg;
1919     T5_dT  = T4_dT  + pParam->HSMHV2_sc2 * Vdsz * model->HSMHV2_sc4 * Pbsum_dT
1920             + pParam->HSMHV2_sc2 * Vdsz_dT * model->HSMHV2_sc4 * Pbsum;
1921 
1922 
1923     dVthSC = dVth0 * T5 ;
1924     dVthSC_dVb = dVth0_dVb * T5 + dVth0 * T5_dVb ;
1925     dVthSC_dVd = dVth0_dVd * T5 + dVth0 * T5_dVd ;
1926     dVthSC_dVg = dVth0_dVg * T5 + dVth0 * T5_dVg ;
1927     dVthSC_dT  = dVth0_dT  * T5 + dVth0 * T5_dT ;
1928 
1929     /*---------------------------------------------------*
1930      * dVthW : narrow-channel effect.
1931      *-----------------*/
1932     T1 = 1.0 / Cox ;
1933     T2 = T1 * T1 ;
1934     T3 = 1.0 / ( Cox +  pParam->HSMHV2_wfc / Weff ) ;
1935     T4 = T3 * T3 ;
1936     T5 = T1 - T3 ;
1937     T6 = Qb0 * ( T2 - T4 ) ;
1938 
1939     dVthW = Qb0 * T5 + pParam->HSMHV2_wvth0 / here->HSMHV2_wg ;
1940     dVthW_dVb = Qb0_dVb * T5 - Cox_dVb * T6 ;
1941     dVthW_dVd = Qb0_dVd * T5 - Cox_dVd * T6 ;
1942     dVthW_dVg =              - Cox_dVg * T6 ;
1943     dVthW_dT = Qb0_dT * T5 - Cox_dT * T6 ;
1944 
1945     /*---------------------------------------------------*
1946      * dVth : Total variation.
1947      * - Positive dVth means the decrease in Vth.
1948      *-----------------*/
1949     dVth = dVthSC + dVthLP + dVthW + here->HSMHV2_dVthsm ;
1950     dVth_dVb = dVthSC_dVb + dVthLP_dVb + dVthW_dVb ;
1951     dVth_dVd = dVthSC_dVd + dVthLP_dVd + dVthW_dVd ;
1952     dVth_dVg = dVthSC_dVg + dVthLP_dVg + dVthW_dVg ;
1953     dVth_dT = dVthSC_dT + dVthLP_dT + dVthW_dT ;
1954 
1955     /*---------------------------------------------------*
1956      * Vth : Threshold voltagei for OP.
1957      *-----------------*/
1958     T2 = sqrt( here->HSMHV2_2qnsub_esi * (Pb2-Vbsz) ) ;
1959     Vth = Pb2 + Vfb + T2 * Cox0_inv - dVth ;
1960 
1961     /*-----------------------------------------------------------*
1962      * Constants in the equation of Ps0 .
1963      *-----------------*/
1964 
1965     fac1 = cnst0 * Cox_inv ;
1966     fac1_dVbs = cnst0 * Cox_inv_dVb ;
1967     fac1_dVds = cnst0 * Cox_inv_dVd ;
1968     fac1_dVgs = cnst0 * Cox_inv_dVg ;
1969     fac1_dT = Cox_inv * cnst0_dT ;
1970 
1971     fac1p2 = fac1 * fac1 ;
1972     fac1p2_dT = 2.0 * fac1 * fac1_dT ;
1973 
1974     /*---------------------------------------------------*
1975      * Poly-Depletion Effect
1976      *-----------------*/
1977 
1978     dPpg = 0.0 ;
1979     dPpg_dVb = 0.0 ;
1980     dPpg_dVd = 0.0 ;
1981     dPpg_dVg = 0.0 ;
1982     dPpg_dT  = 0.0 ;
1983 
1984     if ( here->HSMHV2_flg_pgd == 1 ) {
1985 
1986       T7 = Vgsz ;
1987       T7_dVb =  Vgsz_dVbs ;
1988       T7_dVd =  Vgsz_dVds ;
1989       T7_dVg =  Vgsz_dVgs ;
1990       T7_dT  =  Vgsz_dT  ;
1991 
1992       T0 = here->HSMHV2_cnstpgd ;
1993 
1994       T3 = T7 - model->HSMHV2_pgd2 ;
1995       T3_dVb = T7_dVb ;
1996       T3_dVd = T7_dVd ;
1997       T3_dVg = T7_dVg ;
1998       T3_dT = T7_dT ;
1999 
2000       Fn_ExpLim( dPpg , T3 , T6 ) ;
2001       dPpg_dVb = T6 * T3_dVb ;
2002       dPpg_dVd = T6 * T3_dVd ;
2003       dPpg_dVg = T6 * T3_dVg ;
2004       dPpg_dT = T6 * T3_dT ;
2005 
2006       Fn_SZ( dPpg , dPpg - 1.0 , pol_dlt , T6 ) ;
2007       dPpg_dVb *= T6 ;
2008       dPpg_dVd *= T6 ;
2009       dPpg_dVg *= T6 ;
2010       dPpg_dT *= T6 ;
2011 
2012       dPpg *= T0 ;
2013       dPpg_dVb *= T0 ;
2014       dPpg_dVd *= T0 ;
2015       dPpg_dVg *= T0 ;
2016       dPpg_dT *= T0 ;
2017 
2018       Fn_SU( dPpg , dPpg , pol_b , pol_dlt , T9 ) ;
2019       dPpg_dVb *= T9 ;
2020       dPpg_dVd *= T9 ;
2021       dPpg_dVg *= T9 ;
2022       dPpg_dT *= T9 ;
2023 
2024     }
2025 
2026     /*---------------------------------------------------*
2027      * Vgp : Effective gate bias with SCE & RSCE & flatband.
2028      *-----------------*/
2029     Vgp = Vgs - Vfb + dVth - dPpg ;
2030     Vgp_dVbs = dVth_dVb - dPpg_dVb ;
2031     Vgp_dVds = dVth_dVd - dPpg_dVd ;
2032     Vgp_dVgs = 1.0e0 + dVth_dVg - dPpg_dVg ;
2033     Vgp_dT = dVth_dT - dPpg_dT ;
2034 
2035 
2036     /*---------------------------------------------------*
2037      * Vgs_fb : Actual flatband voltage taking account Vbscl.
2038      * - note: if Vgs == Vgs_fb then Vgp == Ps0 == Vbscl .
2039      *------------------*/
2040     Vgs_fb = Vfb - dVth + dPpg + Vbscl ;
2041 
2042     if( model->HSMHV2_codep == 1 ) {
2043 
2044     /*---------------------------------------------------*
2045      * depletion mode MOSFET
2046      *------------------*/
2047 
2048 #include "hsmhv2eval_dep.h"
2049 
2050     } else {
2051 
2052     /*---------------------------------------------------*
2053      * normal mode MOSFET
2054      *------------------*/
2055 
2056       /*-----------------------------------------------------------*
2057        * Accumulation zone. (zone-A)
2058        * - evaluate basic characteristics and exit from this part.
2059        *-----------------*/
2060 
2061       if ( Vgs < Vgs_fb ) {
2062 
2063         flg_zone = -1 ;
2064 
2065        /*---------------------------------------------------*
2066         * Evaluation of Ps0.
2067         * - Psa : Analytical solution of
2068         *             Cox( Vgp - Psa ) = cnst0 * Qacc
2069         *         where Qacc is the 3-degree series of (fdep)^{1/2}.
2070         *         The unkown is transformed to Chi=beta(Ps0-Vbs).
2071         * - Ps0_min : |Ps0_min| when Vbs=0.
2072         *-----------------*/
2073        /* Ps0_min: approx. solution of Poisson equation at Vgs_min */
2074        /*          ( easy to improve, if necessary  )              */
2075 //     Ps0_min = here->HSMHV2_eg - Pb2 ;
2076 //     Ps0_min_dT = Eg_dT - Pb2_dT ;
2077         Ps0_min = 2.0 * beta_inv * log(-Vgs_min/fac1) ;
2078         Ps0_min_dVds = -2.0 * beta_inv * fac1_dVds / fac1 ;
2079         Ps0_min_dVgs = -2.0 * beta_inv * fac1_dVgs / fac1 ;
2080         Ps0_min_dVbs = -2.0 * beta_inv * fac1_dVbs / fac1 ;
2081         Ps0_min_dT   = -2.0 * beta_inv * fac1_dT   / fac1 + beta * Ps0_min * beta_inv_dT;
2082 
2083 
2084         TX = beta * ( Vgp - Vbscl ) ;
2085         TX_dVbs = beta * ( Vgp_dVbs - Vbscl_dVbs ) ;
2086         TX_dVds = beta * Vgp_dVds ;
2087         TX_dVgs = beta * Vgp_dVgs ;
2088         TX_dT   = beta_dT * ( Vgp - Vbscl ) + beta * ( Vgp_dT - Vbscl_dT );
2089 
2090         T1 = 1.0 / ( beta * cnst0 ) ;
2091         TY = T1 * Cox ;
2092         TY_dVbs = T1 * Cox_dVb ;
2093         TY_dVds = T1 * Cox_dVd ;
2094         TY_dVgs = T1 * Cox_dVg ;
2095         T1_dT = - T1 / ( beta * cnst0 ) * ( beta_dT * cnst0 + beta * cnst0_dT ) ;
2096         TY_dT = T1_dT * Cox ;
2097 
2098         Ac41 = 2.0 + 3.0 * C_SQRT_2 * TY ;
2099 
2100         Ac4 = 8.0 * Ac41 * Ac41 * Ac41 ;
2101         T1 = 72.0 * Ac41 * Ac41 * C_SQRT_2 ;
2102         Ac4_dVbs = T1 * TY_dVbs ;
2103         Ac4_dVds = T1 * TY_dVds ;
2104         Ac4_dVgs = T1 * TY_dVgs ;
2105         Ac4_dT = T1 * TY_dT ;
2106 
2107         T4 = ( TX - 2.0 ) ;
2108         T5 = 9.0 * TY * T4 ;
2109         T5_dVb = 9.0 * ( TY_dVbs * T4 + TY * TX_dVbs ) ;
2110         T5_dVd = 9.0 * ( TY_dVds * T4 + TY * TX_dVds ) ;
2111         T5_dVg = 9.0 * ( TY_dVgs * T4 + TY * TX_dVgs ) ;
2112         T5_dT = 9.0 * ( TY_dT * T4 + TY * TX_dT ) ;
2113 
2114 
2115         Ac31 = 7.0 * C_SQRT_2 - T5 ;
2116         Ac31_dVbs = -T5_dVb ;
2117         Ac31_dVds = -T5_dVd ;
2118         Ac31_dVgs = -T5_dVg ;
2119         Ac31_dT = -T5_dT ;
2120 
2121         Ac3 = Ac31 * Ac31 ;
2122         T1 = 2.0 * Ac31 ;
2123         Ac3_dVbs = T1 * Ac31_dVbs ;
2124         Ac3_dVds = T1 * Ac31_dVds ;
2125         Ac3_dVgs = T1 * Ac31_dVgs ;
2126         Ac3_dT   = T1 * Ac31_dT ;
2127 
2128         Ac2 = sqrt( Ac4 + Ac3 ) ;
2129         T1 = 0.5 / Ac2 ;
2130         Ac2_dVbs = T1 * ( Ac4_dVbs + Ac3_dVbs ) ;
2131         Ac2_dVds = T1 * ( Ac4_dVds + Ac3_dVds ) ;
2132         Ac2_dVgs = T1 * ( Ac4_dVgs + Ac3_dVgs ) ;
2133         Ac2_dT = T1 * ( Ac4_dT + Ac3_dT ) ;
2134 
2135 
2136         Ac1 = -7.0 * C_SQRT_2 + Ac2 + T5 ;
2137         Ac1_dVbs = Ac2_dVbs + T5_dVb ;
2138         Ac1_dVds = Ac2_dVds + T5_dVd ;
2139         Ac1_dVgs = Ac2_dVgs + T5_dVg ;
2140         Ac1_dT   = Ac2_dT + T5_dT ;
2141 
2142         Acd = Fn_Pow( Ac1 , C_1o3 ) ;
2143         T1 = C_1o3 / ( Acd * Acd ) ;
2144         Acd_dVbs = Ac1_dVbs * T1 ;
2145         Acd_dVds = Ac1_dVds * T1 ;
2146         Acd_dVgs = Ac1_dVgs * T1 ;
2147         Acd_dT = Ac1_dT * T1 ;
2148 
2149         Acn = -4.0 * C_SQRT_2 - 12.0 * TY + 2.0 * Acd + C_SQRT_2 * Acd * Acd ;
2150         T1 = 2.0 + 2.0 * C_SQRT_2 * Acd ;
2151         Acn_dVbs = - 12.0 * TY_dVbs + T1 * Acd_dVbs ;
2152         Acn_dVds = - 12.0 * TY_dVds + T1 * Acd_dVds ;
2153         Acn_dVgs = - 12.0 * TY_dVgs + T1 * Acd_dVgs ;
2154         Acn_dT = - 12.0 * TY_dT + T1 * Acd_dT ;
2155 
2156 
2157         T1 = 1.0 / Acd ;
2158         Chi = Acn * T1 ;
2159         Chi_dVbs = ( Acn_dVbs - Chi * Acd_dVbs ) * T1 ;
2160         Chi_dVds = ( Acn_dVds - Chi * Acd_dVds ) * T1 ;
2161         Chi_dVgs = ( Acn_dVgs - Chi * Acd_dVgs ) * T1 ;
2162         Chi_dT = ( Acn_dT - Chi * Acd_dT ) * T1 ;
2163 
2164 
2165         Psa = Chi * beta_inv + Vbscl ;
2166         Psa_dVbs = Chi_dVbs * beta_inv + Vbscl_dVbs ;
2167         Psa_dVds = Chi_dVds * beta_inv ;
2168         Psa_dVgs = Chi_dVgs * beta_inv ;
2169         Psa_dT = Chi_dT * beta_inv + Chi * beta_inv_dT + Vbscl_dT;
2170 
2171         T1 = Psa - Vbscl ;
2172         T1_dVb = Psa_dVbs - Vbscl_dVbs ;
2173         T1_dVd = Psa_dVds ;
2174         T1_dVg = Psa_dVgs ;
2175         T1_dT   = Psa_dT - Vbscl_dT ;
2176 
2177         T2 = T1 / Ps0_min ;
2178         T2_dVb = ( T1_dVb * Ps0_min - T1 * Ps0_min_dVbs ) / ( Ps0_min * Ps0_min ) ;
2179         T2_dVd = ( T1_dVd * Ps0_min - T1 * Ps0_min_dVds ) / ( Ps0_min * Ps0_min ) ;
2180         T2_dVg = ( T1_dVg * Ps0_min - T1 * Ps0_min_dVgs ) / ( Ps0_min * Ps0_min ) ;
2181         T2_dT  = ( T1_dT  * Ps0_min - T1 * Ps0_min_dT   ) / ( Ps0_min * Ps0_min ) ;
2182 
2183         T3 = sqrt( 1.0 + ( T2 * T2 ) ) ;
2184         T3_dVb = 1.0 / T3 * T2 * T2_dVb ;
2185         T3_dVd = 1.0 / T3 * T2 * T2_dVd ;
2186         T3_dVg = 1.0 / T3 * T2 * T2_dVg ;
2187         T3_dT  = 1.0 / T3 * T2 * T2_dT  ;
2188 
2189         Ps0 = T1 / T3 + Vbscl ;
2190         T9 = 1.0 / ( T3 * T3 ) ;
2191         Ps0_dVbs = T9 * ( ( Psa_dVbs - Vbscl_dVbs ) * T3 - T1 * T3_dVb ) + Vbscl_dVbs ;
2192         Ps0_dVds = T9 * ( Psa_dVds * T3 - T1 * T3_dVd ) ;
2193         Ps0_dVgs = T9 * ( Psa_dVgs * T3 - T1 * T3_dVg ) ;
2194         Ps0_dT   = T9 * ( ( Psa_dT - Vbscl_dT )* T3 - T1 * T3_dT ) + Vbscl_dT;
2195 
2196       /*---------------------------------------------------*
2197        * Characteristics.
2198        *-----------------*/
2199         Psl = Ps0 ;
2200         Psl_dVbs = Ps0_dVbs ;
2201         Psl_dVds = Ps0_dVds ;
2202         Psl_dVgs = Ps0_dVgs ;
2203         Psl_dT   = Ps0_dT ;
2204        /** (reminder)
2205         Psdl = Psl ;
2206         Psdl_dVbs = Psl_dVbs ;
2207         Psdl_dVds = Psl_dVds ;
2208         Psdl_dVgs = Psl_dVgs ;
2209         **/
2210         Pds = 0.0 ;
2211         Pds_dVbs = 0.0 ;
2212         Pds_dVds = 0.0 ;
2213         Pds_dVgs = 0.0 ;
2214         Pds_dT = 0.0 ;
2215 
2216         T2 = ( Vgp - Ps0 ) ;
2217         T2_dT = Vgp_dT - Ps0_dT ;
2218 
2219         Qbu = Cox * T2 ;
2220         Qbu_dVbs = Cox * ( Vgp_dVbs - Ps0_dVbs ) + Cox_dVb * T2 ;
2221         Qbu_dVds = Cox * ( Vgp_dVds - Ps0_dVds ) + Cox_dVd * T2 ;
2222         Qbu_dVgs = Cox * ( Vgp_dVgs - Ps0_dVgs ) + Cox_dVg * T2 ;
2223         Qbu_dT   = Cox * T2_dT ;
2224 
2225         Qiu = 0.0e0 ;
2226         Qiu_dVbs = 0.0e0 ;
2227         Qiu_dVds = 0.0e0 ;
2228         Qiu_dVgs = 0.0e0 ;
2229         Qiu_dT = 0.0e0 ;
2230 
2231         Qdrat = 0.0e0 ;
2232         Qdrat_dVbs = 0.0e0 ;
2233         Qdrat_dVds = 0.0e0 ;
2234         Qdrat_dVgs = 0.0e0 ;
2235         Qdrat_dT = 0.0 ;
2236 
2237         Lred = 0.0e0 ;
2238         Lred_dVbs = 0.0e0 ;
2239         Lred_dVds = 0.0e0 ;
2240         Lred_dVgs = 0.0e0 ;
2241         Lred_dT = 0.0e0 ;
2242 
2243         Ids = 0.0e0 ;
2244         Ids_dVbs = 0.0e0 ;
2245         Ids_dVds = 0.0e0 ;
2246         Ids_dVgs = 0.0e0 ;
2247         Ids_dT =  0.0e0 ;
2248 
2249         VgVt = 0.0 ;
2250 
2251         flg_noqi = 1 ;
2252 
2253         goto end_of_part_1 ;
2254       }
2255 
2256      /*-----------------------------------------------------------*
2257       * Initial guess for Ps0.
2258       *-----------------*/
2259 
2260      /*---------------------------------------------------*
2261       * Ps0_iniA: solution of subthreshold equation assuming zone-D1/D2.
2262       *-----------------*/
2263       TX = 1.0e0 + 4.0e0
2264         * ( beta * ( Vgp - Vbscl ) - 1.0e0 ) / ( fac1p2 * beta2 ) ;
2265       TX = Fn_Max( TX , epsm10 ) ;
2266       Ps0_iniA = Vgp + fac1p2 * beta * 0.5 * ( 1.0e0 - sqrt( TX ) ) ;
2267 
2268      /* use analytical value in subthreshold region. */
2269       if ( Vgs < ( Vfb + Vth ) * 0.5 ) {
2270           flg_pprv = 0 ;
2271       }
2272 
2273 
2274       if ( flg_pprv >= 1 ) {
2275        /*---------------------------------------------------*
2276         * Use previous value.
2277         *-----------------*/
2278 
2279         T1  = Ps0_dVbs * dVbs + Ps0_dVds * dVds  + Ps0_dVgs * dVgs ;
2280         Ps0_ini  = Ps0 + T1 ;
2281 
2282         T2 = here->HSMHV2_ps0_dtemp_prv * Temp_dif ;
2283         if ( fabs( T1 + T2 ) < dP_max ) { Ps0_ini += T2 ; }
2284 
2285         if ( flg_pprv == 2 ) {
2286           /* TX_dVxs = d^2 Ps0 / d Vxs^2 here */
2287           if ( Vbsc_dif2 > epsm10 ) {
2288             TX_dVbs = ( here->HSMHV2_ps0_dvbs_prv - here->HSMHV2_ps0_dvbs_prv2 )
2289                   / Vbsc_dif2 ;
2290           } else {
2291             TX_dVbs = 0.0 ;
2292           }
2293           if ( Vdsc_dif2 > epsm10 ) {
2294             TX_dVds = ( here->HSMHV2_ps0_dvds_prv - here->HSMHV2_ps0_dvds_prv2 )
2295                   / Vdsc_dif2 ;
2296           } else {
2297             TX_dVds = 0.0 ;
2298           }
2299           if ( Vgsc_dif2 > epsm10 ) {
2300             TX_dVgs = ( here->HSMHV2_ps0_dvgs_prv - here->HSMHV2_ps0_dvgs_prv2 )
2301                   / Vgsc_dif2 ;
2302           } else {
2303             TX_dVgs = 0.0 ;
2304           }
2305           T2 = ( dVbs * dVbs ) / 2 * TX_dVbs
2306              + ( dVds * dVds ) / 2 * TX_dVds
2307              + ( dVgs * dVgs ) / 2 * TX_dVgs ;
2308 
2309           if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) {
2310             Ps0_ini += T2 ;
2311           } else {
2312             flg_pprv = 1 ;
2313           }
2314         }
2315 
2316         T1 = Ps0_ini - Ps0 ;
2317         if ( T1 < - dP_max || T1 > dP_max ) {
2318           flg_pprv = 0 ; /* flag changes to analytical */
2319         } else {
2320           Ps0_iniA = Fn_Max( Ps0_ini , Ps0_iniA ) ;
2321         }
2322       } /* end of (flg_pprv >=1) if-block */
2323 
2324       if ( flg_pprv == 0 ) {
2325 
2326        /*---------------------------------------------------*
2327         * Analytical initial guess.
2328         *-----------------*/
2329        /*-------------------------------------------*
2330         * Common part.
2331         *-----------------*/
2332         Chi = beta * ( Ps0_iniA - Vbscl ) ;
2333 
2334         if ( Chi < znbd3 ) {
2335          /*-----------------------------------*
2336           * zone-D1/D2
2337           * - Ps0_ini is the analytical solution of Qs=Qb0 with
2338           *   Qb0 being approximated to 3-degree polynomial.
2339           *-----------------*/
2340           TY = beta * ( Vgp - Vbscl ) ;
2341           T1 = 1.0e0 / ( cn_nc3 * beta * fac1 ) ;
2342           T2 = 81.0 + 3.0 * T1 ;
2343           T3 = -2916.0 - 81.0 * T1 + 27.0 * T1 * TY ;
2344           T4 = 1458.0 - 81.0 * ( 54.0 + T1 ) + 27.0 * T1 * TY ;
2345           T4 = T4 * T4 ;
2346           T5 = Fn_Pow( T3 + sqrt( 4 * T2 * T2 * T2 + T4 ) , C_1o3 ) ;
2347           TX = 3.0 - ( C_2p_1o3 * T2 ) / ( 3.0 * T5 )
2348              + 1 / ( 3.0 * C_2p_1o3 ) * T5 ;
2349 
2350           Ps0_iniA = TX * beta_inv + Vbscl ;
2351           Ps0_ini = Ps0_iniA ;
2352 
2353         } else if ( Vgs <= Vth ) {
2354          /*-----------------------------------*
2355           * Weak inversion zone.
2356           *-----------------*/
2357           Ps0_ini = Ps0_iniA ;
2358 
2359         } else {
2360          /*-----------------------------------*
2361           * Strong inversion zone.
2362           * - Ps0_iniB : upper bound.
2363           *-----------------*/
2364           T1 = 1.0 / cnst1 / cnstCoxi ;
2365           T2 = T1 * Vgp * Vgp ;
2366           T3 = beta + 2.0 / Vgp ;
2367 
2368           Ps0_iniB = log( T2 ) / T3 ;
2369 
2370           Fn_SU( Ps0_ini , Ps0_iniA, Ps0_iniB, c_ps0ini_2, T1) ;
2371         }
2372       }
2373 
2374       TX = Vbscl + ps_conv / 2 ;
2375       if ( Ps0_ini < TX ) Ps0_ini = TX ;
2376 
2377 
2378      /*---------------------------------------------------*
2379       * Assign initial guess.
2380       *-----------------*/
2381       Ps0 = Ps0_ini ;
2382       Psl_lim = Ps0_iniA ;
2383 
2384 
2385      /*---------------------------------------------------*
2386       * Calculation of Ps0. (beginning of Newton loop)
2387       * - Fs0 : Fs0 = 0 is the equation to be solved.
2388       * - dPs0 : correction value.
2389       *-----------------*/
2390       exp_bVbs = exp( beta * Vbscl ) ;
2391       cfs1 = cnst1 * exp_bVbs ;
2392 
2393       flg_conv = 0 ;
2394       for ( lp_s0 = 1 ; lp_s0 <= lp_s0_max + 1 ; lp_s0 ++ ) {
2395 
2396         Chi = beta * ( Ps0 - Vbscl ) ;
2397 
2398         if ( Chi < znbd5 ) {
2399          /*-------------------------------------------*
2400           * zone-D1/D2.  (Ps0)
2401           * - Qb0 is approximated to 5-degree polynomial.
2402           *-----------------*/
2403           fi = Chi * Chi * Chi
2404             * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ;
2405           fi_dChi = Chi * Chi
2406             * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ;
2407 
2408           fs01 = cfs1 * fi * fi ;
2409           fs01_dPs0 = cfs1 * beta * 2 * fi * fi_dChi ;
2410 
2411           fb = Chi * ( cn_nc51
2412             + Chi * ( cn_nc52
2413             + Chi * ( cn_nc53
2414             + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ;
2415           fb_dChi = cn_nc51
2416             + Chi * ( 2 * cn_nc52
2417             + Chi * ( 3 * cn_nc53
2418             + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ;
2419 
2420           fs02 = sqrt( fb * fb + fs01 ) ;
2421           fs02_dPs0 = ( beta * fb_dChi * 2 * fb + fs01_dPs0 ) / ( fs02 + fs02 ) ;
2422 
2423         } else {
2424          /*-------------------------------------------*
2425           * zone-D3.  (Ps0)
2426           *-----------------*/
2427           if ( Chi < large_arg ) { /* avoid exp_Chi to become extremely large */
2428             exp_Chi = exp( Chi ) ;
2429             fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ;
2430             fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ;
2431           } else {
2432             exp_bPs0 = exp( beta*Ps0 ) ;
2433             fs01     = cnst1 * ( exp_bPs0 - exp_bVbs ) ;
2434             fs01_dPs0 = cnst1 * beta * exp_bPs0 ;
2435           }
2436           fs02 = sqrt( Chi - 1.0 + fs01 ) ;
2437           fs02_dPs0 = ( beta + fs01_dPs0 ) / ( fs02 + fs02 ) ;
2438         } /* end of if ( Chi ... ) else block */
2439 
2440         Fs0 = Vgp - Ps0 - fac1 * fs02 ;
2441         Fs0_dPs0 = - 1.0e0 - fac1 * fs02_dPs0 ;
2442 
2443         if ( flg_conv == 1 ) break ;
2444 
2445         dPs0 = - Fs0 / Fs0_dPs0 ;
2446 
2447        /*-------------------------------------------*
2448         * Update Ps0 .
2449         * - clamped to Vbscl if Ps0 < Vbscl .
2450         *-----------------*/
2451         dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Ps0))) ;
2452         if ( fabs( dPs0 ) > dPlim ) dPs0 = dPlim * Fn_Sgn( dPs0 ) ;
2453 
2454         Ps0 = Ps0 + dPs0 ;
2455 
2456 //      TX = Vbscl + ps_conv / 2 ;
2457 //      if ( Ps0 < TX ) Ps0 = TX ;
2458 
2459        /*-------------------------------------------*
2460         * Check convergence.
2461         * NOTE: This condition may be too rigid.
2462         *-----------------*/
2463         if ( fabs( dPs0 ) <= ps_conv && fabs( Fs0 ) <= gs_conv ) {
2464           flg_conv = 1 ;
2465         }
2466 
2467       } /* end of Ps0 Newton loop */
2468 
2469      /* Reduce loop count to exclude the sweep for derivative calculation */
2470       lp_s0 -- ;
2471 
2472      /*-------------------------------------------*
2473       * Procedure for diverged case.
2474       *-----------------*/
2475       if ( flg_conv == 0 ) {
2476         fprintf( stderr ,
2477                "*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Ps0)\n", model->HSMHV2modName ) ;
2478         fprintf( stderr ,
2479                " Vbse   = %7.3f Vdse = %7.3f Vgse = %7.3f\n" ,
2480                Vbse , Vdse , Vgse ) ;
2481         if ( flg_info >= 2 ) {
2482           printf( "*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Ps0)\n", model->HSMHV2modName ) ;
2483         }
2484       }
2485 
2486      /*---------------------------------------------------*
2487       * Evaluate derivatives of  Ps0.
2488       * - note: Here, fs01_dVbs and fs02_dVbs are derivatives
2489       *   w.r.t. explicit Vbs. So, Ps0 in the fs01 and fs02
2490       *   expressions is regarded as a constant.
2491       *-----------------*/
2492      /* self heating */
2493       Chi_dT = beta_dT *( Ps0 - Vbscl ) - beta * Vbscl_dT ;
2494       exp_bVbs_dT = ( beta_dT * Vbscl + beta * Vbscl_dT ) * exp_bVbs ;
2495       cfs1_dT     = exp_bVbs * cnst1_dT + exp_bVbs_dT * cnst1 ;
2496 
2497      /* derivatives of fs0* w.r.t. explicit Vbs */
2498       if ( Chi < znbd5 ) {
2499         fs01_dVbs = cfs1 * beta * fi * ( fi - 2 * fi_dChi ) * Vbscl_dVbs ;
2500         fs01_dT = cfs1 * 2 * fi * fi_dChi * Chi_dT + fi * fi * cfs1_dT ;
2501         T2 = 1.0e0 / ( fs02 + fs02 ) ;
2502         fs02_dVbs = ( - beta * Vbscl_dVbs * fb_dChi * 2 * fb + fs01_dVbs ) * T2 ;
2503         fs02_dT = ( 2 * fb * fb_dChi * Chi_dT + fs01_dT ) * T2 ;
2504       } else {
2505         if ( Chi < large_arg ) {
2506           fs01_dVbs   = - cfs1 * beta * Vbscl_dVbs ;
2507           exp_Chi_dT  = exp_Chi * Chi_dT ;
2508           fs01_dT     = ( exp_Chi - 1.0e0 ) * cfs1_dT + cfs1 * exp_Chi_dT ;
2509         } else {
2510           fs01_dVbs   = - cfs1 * beta * Vbscl_dVbs ;
2511           exp_bPs0_dT = exp_bPs0 * Ps0 * beta_dT ;
2512           fs01_dT     = cnst1_dT*(exp_bPs0-exp_bVbs) + cnst1*(exp_bPs0_dT-exp_bVbs_dT) ;
2513         }
2514         T2 = 0.5e0 / fs02 ;
2515         fs02_dVbs = ( - beta * Vbscl_dVbs + fs01_dVbs ) * T2 ;
2516         fs02_dT = T2 * ( Chi_dT + fs01_dT ) ;
2517       }
2518 
2519       T1 = 1.0 / Fs0_dPs0 ;
2520       Ps0_dVbs = - ( Vgp_dVbs - ( fac1 * fs02_dVbs + fac1_dVbs * fs02 ) ) * T1 ;
2521       Ps0_dVds = - ( Vgp_dVds -                      fac1_dVds * fs02   ) * T1 ;
2522       Ps0_dVgs = - ( Vgp_dVgs -                      fac1_dVgs * fs02   ) * T1 ;
2523       Ps0_dT =   - ( Vgp_dT   - ( fac1 * fs02_dT   + fac1_dT   * fs02 ) ) * T1 ;
2524 
2525       Chi_dT = beta_dT *( Ps0 - Vbscl ) + beta * ( Ps0_dT - Vbscl_dT ) ;
2526 
2527       if ( Chi < znbd5 ) {
2528 
2529        /*-------------------------------------------*
2530         * zone-D1/D2. (Ps0)
2531         * Xi0 := fdep0^2 = fb * fb  [D1,D2]
2532         *-----------------*/
2533         Xi0 = fb * fb + epsm10 ;
2534         T1 = 2 * fb * fb_dChi * beta ;
2535         Xi0_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ;
2536         Xi0_dVds = T1 * Ps0_dVds ;
2537         Xi0_dVgs = T1 * Ps0_dVgs ;
2538         Xi0_dT = 2 * fb * fb_dChi * Chi_dT ;
2539 
2540         Xi0p12 = fb + epsm10 ;
2541         T1 = fb_dChi * beta ;
2542         Xi0p12_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ;
2543         Xi0p12_dVds = T1 * Ps0_dVds ;
2544         Xi0p12_dVgs = T1 * Ps0_dVgs ;
2545         Xi0p12_dT = fb_dChi * Chi_dT ;
2546 
2547         Xi0p32 = fb * fb * fb + epsm10 ;
2548         T1 = 3 * fb * fb * fb_dChi * beta ;
2549         Xi0p32_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ;
2550         Xi0p32_dVds = T1 * Ps0_dVds ;
2551         Xi0p32_dVgs = T1 * Ps0_dVgs ;
2552         Xi0p32_dT = 3 * fb * fb * fb_dChi * Chi_dT ;
2553 
2554         fs01_dT = cfs1 * 2 * fi * fi_dChi * Chi_dT + fi * fi * cfs1_dT ;
2555         fs02_dT = ( 2 * fb * fb_dChi * Chi_dT + fs01_dT ) * T2 ;
2556 
2557       } else {
2558 
2559        /*-------------------------------------------*
2560         * zone-D3. (Ps0)
2561         *-----------------*/
2562         flg_zone = 3 ;
2563         flg_noqi = 0 ;
2564 
2565        /*-----------------------------------*
2566         * Xi0 := fdep0^2 = Chi - 1 = beta * ( Ps0 - Vbscl ) - 1 [D3]
2567         *-----------------*/
2568         Xi0 = Chi - 1.0e0 ;
2569         Xi0_dVbs = beta * ( Ps0_dVbs - Vbscl_dVbs ) ;
2570         Xi0_dVds = beta * Ps0_dVds ;
2571         Xi0_dVgs = beta * Ps0_dVgs ;
2572         Xi0_dT = Chi_dT ;
2573 
2574         Xi0p12 = sqrt( Xi0 ) ;
2575         T1 = 0.5e0 / Xi0p12 ;
2576         Xi0p12_dVbs = T1 * Xi0_dVbs ;
2577         Xi0p12_dVds = T1 * Xi0_dVds ;
2578         Xi0p12_dVgs = T1 * Xi0_dVgs ;
2579         Xi0p12_dT = T1 * Xi0_dT ;
2580 
2581         Xi0p32 = Xi0 * Xi0p12 ;
2582         T1 = 1.5e0 * Xi0p12 ;
2583         Xi0p32_dVbs = T1 * Xi0_dVbs ;
2584         Xi0p32_dVds = T1 * Xi0_dVds ;
2585         Xi0p32_dVgs = T1 * Xi0_dVgs ;
2586         Xi0p32_dT = T1 * Xi0_dT ;
2587 
2588         if ( Chi < large_arg ) {
2589           exp_Chi_dT = exp_Chi * Chi_dT ;
2590           fs01_dT = ( exp_Chi - 1.0e0 ) * cfs1_dT + cfs1 * exp_Chi_dT ;
2591         } else {
2592           exp_bPs0_dT = exp_bPs0 * (beta_dT * Ps0 + beta * Ps0_dT) ;
2593           fs01_dT     = cnst1_dT*(exp_bPs0-exp_bVbs) + cnst1*(exp_bPs0_dT-exp_bVbs_dT) ;
2594         }
2595         fs02_dT = T2 * ( Chi_dT + fs01_dT ) ;
2596 
2597       } /* end of if ( Chi  ... ) block */
2598 
2599      /*-----------------------------------------------------------*
2600       * - Recalculate the derivatives of fs01 and fs02.
2601       * note: fs01  = cnst1 * exp( Vbs ) * ( exp( Chi ) - Chi - 1.0e0 ) ;
2602       *       fs02  = sqrt( Xi0 + fs01 ) ;
2603       *-----------------*/
2604       fs01_dVbs = Ps0_dVbs * fs01_dPs0 + fs01_dVbs ;
2605       fs01_dVds = Ps0_dVds * fs01_dPs0 ;
2606       fs01_dVgs = Ps0_dVgs * fs01_dPs0 ;
2607       fs02_dVbs = Ps0_dVbs * fs02_dPs0 + fs02_dVbs ;
2608       fs02_dVds = Ps0_dVds * fs02_dPs0 ;
2609       fs02_dVgs = Ps0_dVgs * fs02_dPs0 ;
2610 
2611      /*-----------------------------------------------------------*
2612       * Qb0 : Qb at source side.
2613       * Qn0 : Qi at source side.
2614       *-----------------*/
2615 
2616       Qb0 = cnst0 * Xi0p12 ;
2617       Qb0_dVb = cnst0 * Xi0p12_dVbs ;
2618       Qb0_dVd = cnst0 * Xi0p12_dVds ;
2619       Qb0_dVg = cnst0 * Xi0p12_dVgs ;
2620       Qb0_dT = cnst0 * Xi0p12_dT + cnst0_dT * Xi0p12 ;
2621 
2622       T1 = 1.0 / ( fs02 + Xi0p12 ) ;
2623       Qn0 = cnst0 * fs01 * T1 ;
2624       T1_dT = - T1 * T1 * ( fs02_dT + Xi0p12_dT ) ;
2625       Qn0_dT = cnst0 * ( fs01 * T1_dT + T1 * fs01_dT ) + fs01 * T1 * cnst0_dT ;
2626 
2627       T2 = 1.0 / ( fs01 + small ) ;
2628 
2629       Qn0_dVbs = Qn0 * ( fs01_dVbs * T2 - ( fs02_dVbs + Xi0p12_dVbs ) * T1 ) ;
2630       Qn0_dVds = Qn0 * ( fs01_dVds * T2 - ( fs02_dVds + Xi0p12_dVds ) * T1 ) ;
2631       Qn0_dVgs = Qn0 * ( fs01_dVgs * T2 - ( fs02_dVgs + Xi0p12_dVgs ) * T1 ) ;
2632 
2633 
2634      /*-----------------------------------------------------------*
2635       * zone-D1 and D2
2636       *-----------------*/
2637       if ( Chi < znbd5 ) {
2638         if ( Chi < znbd3 ) {
2639          /*-------------------------------------------*
2640           * zone-D1. (Ps0)
2641           *-----------------*/
2642           flg_zone = 1 ;
2643           flg_noqi = 1 ; /** !! to be revisited !! **/
2644 
2645           Qiu = Qn0 ;
2646           Qiu_dVbs = Qn0_dVbs ;
2647           Qiu_dVds = Qn0_dVds ;
2648           Qiu_dVgs = Qn0_dVgs ;
2649           Qiu_dT = Qn0_dT;
2650 
2651           Qbu = Qb0 ;
2652           Qbu_dVbs = Qb0_dVb ;
2653           Qbu_dVds = Qb0_dVd ;
2654           Qbu_dVgs = Qb0_dVg ;
2655           Qbu_dT = Qb0_dT ;
2656 
2657           Qdrat = 0.5 ;
2658           Qdrat_dVbs = 0.0 ;
2659           Qdrat_dVds = 0.0 ;
2660           Qdrat_dVgs = 0.0 ;
2661           Qdrat_dT = 0.0;
2662 
2663           Lred = 0.0e0 ;
2664           Lred_dVbs = 0.0e0 ;
2665           Lred_dVds = 0.0e0 ;
2666           Lred_dVgs = 0.0e0 ;
2667           Lred_dT = 0.0e0 ;
2668 
2669         /** (reminder)
2670          *Psdl = Psl ;
2671          *Psdl_dVbs = Psl_dVbs ;
2672          *Psdl_dVds = Psl_dVds ;
2673          *Psdl_dVgs = Psl_dVgs ;
2674          **/
2675 
2676         } else {
2677          /*-------------------------------------------*
2678           * zone-D2 (Ps0)
2679           *-----------------*/
2680 
2681           flg_zone = 2 ;
2682           flg_noqi = 0 ;
2683          /*-----------------------------------------------------------*
2684           * FD2 : connecting function for zone-D2.
2685           * - Qiu, Qbu, Qdrat and Lred should be interpolated later.
2686           *-----------------*/
2687           T1 = 1.0 / ( znbd5 - znbd3 ) ;
2688           TX = T1 * ( Chi - znbd3 ) ;
2689           TX_dVbs = beta * T1 * ( Ps0_dVbs - Vbscl_dVbs ) ;
2690           TX_dVds = beta * T1 * Ps0_dVds ;
2691           TX_dVgs = beta * T1 * Ps0_dVgs ;
2692           TX_dT = T1 * Chi_dT ;
2693 
2694           FD2 = TX * TX * TX * ( 10.0 + TX * ( -15.0 + TX * 6.0 ) ) ;
2695           T4 = TX * TX * ( 30.0 + TX * ( -60.0 + TX * 30.0 ) ) ;
2696 
2697           FD2_dVbs = T4 * TX_dVbs ;
2698           FD2_dVds = T4 * TX_dVds ;
2699           FD2_dVgs = T4 * TX_dVgs ;
2700           FD2_dT = T4 * TX_dT ;
2701 
2702 
2703         } /* end of zone-D2 */
2704       }
2705 
2706 
2707      /*---------------------------------------------------*
2708       * VgVt : Vgp - Vth_qi. ( Vth_qi is Vth for Qi evaluation. )
2709       *-----------------*/
2710       VgVt = Qn0 * Cox_inv ;
2711       VgVt_dVbs = Qn0_dVbs * Cox_inv + Qn0 * Cox_inv_dVb ;
2712       VgVt_dVds = Qn0_dVds * Cox_inv + Qn0 * Cox_inv_dVd ;
2713       VgVt_dVgs = Qn0_dVgs * Cox_inv + Qn0 * Cox_inv_dVg ;
2714       VgVt_dT = Qn0_dT * Cox_inv ;
2715 
2716      /*-----------------------------------------------------------*
2717       * make Qi=Qd=Ids=0 if VgVt <= VgVt_small
2718       *-----------------*/
2719       if ( VgVt <= VgVt_small ) {
2720         flg_zone = 4 ;
2721         flg_noqi = 1 ;
2722 
2723         Psl = Ps0 ;
2724         Psl_dVbs = Ps0_dVbs ;
2725         Psl_dVds = Ps0_dVds ;
2726         Psl_dVgs = Ps0_dVgs ;
2727         Psl_dT = Ps0_dT ;
2728 
2729        /** (reminder)
2730        *Psdl = Psl ;
2731        *Psdl_dVbs = Psl_dVbs ;
2732        *Psdl_dVds = Psl_dVds ;
2733        *Psdl_dVgs = Psl_dVgs ;
2734        **/
2735 
2736         Pds = 0.0 ;
2737         Pds_dVbs = 0.0 ;
2738         Pds_dVds = 0.0 ;
2739         Pds_dVgs = 0.0 ;
2740         Pds_dT = 0.0 ;
2741 
2742         Qbu = Qb0 ;
2743         Qbu_dVbs = Qb0_dVb ;
2744         Qbu_dVds = Qb0_dVd ;
2745         Qbu_dVgs = Qb0_dVg ;
2746         Qbu_dT = Qb0_dT ;
2747 
2748         Qiu = 0.0 ;
2749         Qiu_dVbs = 0.0 ;
2750         Qiu_dVds = 0.0 ;
2751         Qiu_dVgs = 0.0 ;
2752         Qiu_dT = 0.0 ;
2753 
2754         Qdrat = 0.5 ;
2755         Qdrat_dVbs = 0.0 ;
2756         Qdrat_dVds = 0.0 ;
2757         Qdrat_dVgs = 0.0 ;
2758         Qdrat_dT = 0.0 ;
2759 
2760         Lred = 0.0 ;
2761         Lred_dVbs = 0.0 ;
2762         Lred_dVds = 0.0 ;
2763         Lred_dVgs = 0.0 ;
2764         Lred_dT = 0.0 ;
2765 
2766         Ids = 0.0e0 ;
2767         Ids_dVbs = 0.0e0 ;
2768         Ids_dVds = 0.0e0 ;
2769         Ids_dVgs = 0.0e0 ;
2770         Ids_dT =  0.0e0 ;
2771 
2772         goto end_of_part_1 ;
2773       }
2774 
2775      /*-----------------------------------------------------------*
2776       * Start point of Psl (= Ps0 + Pds) calculation. (label)
2777       *-----------------*/
2778 /*    start_of_Psl: */
2779 
2780 
2781      /* Vdseff (begin) */
2782       Vdsorg = Vds ;
2783 
2784       T2 = here->HSMHV2_qnsub_esi / ( Cox * Cox ) ;
2785       T4 = - 2.0e0 * T2 / Cox ;
2786       T2_dVb = T4 * Cox_dVb ;
2787       T2_dVd = T4 * Cox_dVd ;
2788       T2_dVg = T4 * Cox_dVg ;
2789       T2_dT  = T4 * Cox_dT  ;
2790 
2791       T0 = Vgp - beta_inv - Vbsz ;
2792       T0_dT = Vgp_dT - beta_inv_dT - Vbsz_dT ;
2793       Fn_SZ( T9, 1.0e0 + 2.0e0 / T2 * T0, 1e-3, TX ) ;
2794       T9 += small ;
2795       T3 = sqrt( T9 ) ;
2796       T4 = 0.5e0 / T3 ;
2797       T5 = 1.0e0 / ( T2 * T2 ) ;
2798       T6 = T4 * 2.0e0 * T5 * TX ;
2799       T7 = T6 * T0 ;
2800       T8 = T6 * T2 ;
2801       T3_dVb = - T2_dVb * T7 + T8 * ( Vgp_dVbs - Vbsz_dVbs ) ;
2802       T3_dVd = - T2_dVd * T7 + T8 * ( Vgp_dVds - Vbsz_dVds ) ;
2803       T3_dVg = - T2_dVg * T7 + T8 * Vgp_dVgs ;
2804       T3_dT  = - T2_dT  * T7 + T8 * T0_dT ;
2805 
2806       T10 = Vgp + T2 * ( 1.0e0 - T3 ) ;
2807       T10_dVb = Vgp_dVbs + T2_dVb * ( 1.0e0 - T3 ) - T2 * T3_dVb ;
2808       T10_dVd = Vgp_dVds + T2_dVd * ( 1.0e0 - T3 ) - T2 * T3_dVd ;
2809       T10_dVg = Vgp_dVgs + T2_dVg * ( 1.0e0 - T3 ) - T2 * T3_dVg ;
2810       T10_dT  = Vgp_dT   + T2_dT  * ( 1.0e0 - T3 ) - T2 * T3_dT ;
2811       Fn_SZ( T10 , T10 , 0.01 , T0 ) ;
2812       T10 += epsm10 ;
2813       T10_dVb *= T0 ;
2814       T10_dVd *= T0 ;
2815       T10_dVg *= T0 ;
2816       T10_dT *=  T0 ;
2817 
2818       T1 = Vds / T10 ;
2819       T2 = Fn_Pow( T1 , here->HSMHV2_ddlt - 1.0e0 ) ;
2820       T7 = T2 * T1 ;
2821       T0 = here->HSMHV2_ddlt * T2 / ( T10 * T10 ) ;
2822       T7_dVb = T0 * ( - Vds * T10_dVb ) ;
2823       T7_dVd = T0 * ( T10 - Vds * T10_dVd ) ;
2824       T7_dVg = T0 * ( - Vds * T10_dVg ) ;
2825       T7_dT =  T0 * ( - Vds * T10_dT ) ;
2826 
2827       T3 = 1.0 + T7 ;
2828       T4 = Fn_Pow( T3 , 1.0 / here->HSMHV2_ddlt - 1.0 ) ;
2829       T6 = T4 * T3 ;
2830       T0 = T4 / here->HSMHV2_ddlt ;
2831       T6_dVb = T0 * T7_dVb ;
2832       T6_dVd = T0 * T7_dVd ;
2833       T6_dVg = T0 * T7_dVg ;
2834       T6_dT =  T0 * T7_dT ;
2835 
2836       Vdseff = Vds / T6 ;
2837       T0 = 1.0 / ( T6 * T6 ) ;
2838       Vdseff_dVbs =      - Vds * T6_dVb   * T0 ;
2839       Vdseff_dVds = ( T6 - Vds * T6_dVd ) * T0 ;
2840       Vdseff_dVgs =      - Vds * T6_dVg   * T0 ;
2841       Vdseff_dT =        - Vds * T6_dT    * T0 ;
2842 
2843       Vds = Vdseff ;
2844      /* Vdseff (end) */
2845 
2846 
2847       exp_bVbsVds = exp( beta * ( Vbscl - Vds ) ) ;
2848       exp_bVbsVds_dT = ( beta_dT * ( Vbscl - Vds ) + beta * (Vbscl_dT - Vdseff_dT) ) * exp_bVbsVds ;
2849 
2850 
2851      /*---------------------------------------------------*
2852       * Skip Psl calculation when Vds is very small.
2853       *-----------------*/
2854       if ( Vds <  0.0 ) {
2855         Pds = 0.0 ;
2856         Psl = Ps0 ;
2857 //      flg_conv = 1 ;
2858         goto start_of_loopl ;
2859       }
2860 
2861      /*-----------------------------------------------------------*
2862       * Initial guess for Pds ( = Psl - Ps0 ).
2863       *-----------------*/
2864       if ( flg_pprv >= 1  ) {
2865        /*---------------------------------------------------*
2866         * Use previous value.
2867         *-----------------*/
2868 
2869         T1  = Pds_dVbs * dVbs + Pds_dVds * dVds  + Pds_dVgs * dVgs ;
2870         Pds_ini  = Pds + T1 ;
2871 
2872        /* self heating */
2873         T2 = here->HSMHV2_pds_dtemp_prv * Temp_dif ;
2874         if ( fabs( T1 + T2 ) < dP_max ) { Pds_ini += T2 ; }
2875 
2876         if ( flg_pprv == 2 ) {
2877           /* TX_dVxs = d^2 Pds / d Vxs^2 here */
2878           if ( Vbsc_dif2 > epsm10 ) {
2879             TX_dVbs = ( here->HSMHV2_pds_dvbs_prv - here->HSMHV2_pds_dvbs_prv2 )
2880                     / Vbsc_dif2 ;
2881           } else {
2882             TX_dVbs = 0.0 ;
2883           }
2884           if ( Vdsc_dif2 > epsm10 ) {
2885             TX_dVds = ( here->HSMHV2_pds_dvds_prv - here->HSMHV2_pds_dvds_prv2 )
2886                   / Vdsc_dif2 ;
2887           } else {
2888             TX_dVds = 0.0 ;
2889           }
2890           if ( Vgsc_dif2 > epsm10 ) {
2891             TX_dVgs = ( here->HSMHV2_pds_dvgs_prv - here->HSMHV2_pds_dvgs_prv2 )
2892                   / Vgsc_dif2 ;
2893           } else {
2894             TX_dVgs = 0.0 ;
2895           }
2896           T2 = ( dVbs * dVbs ) / 2 * TX_dVbs
2897              + ( dVds * dVds ) / 2 * TX_dVds
2898              + ( dVgs * dVgs ) / 2 * TX_dVgs ;
2899 
2900           if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) {
2901             Pds_ini += T2 ;
2902           } else {
2903             flg_pprv = 1 ;
2904           }
2905         }
2906 
2907         T1 = Pds_ini - Pds ;
2908         if ( T1 < - dP_max || T1 > dP_max ) flg_pprv = 0 ; /* flag changes */
2909 
2910       } /* end of (flg_pprv>=1) if-block */
2911 
2912       if ( flg_pprv == 0 ) {
2913        /*---------------------------------------------------*
2914         * Analytical initial guess.
2915         *-----------------*/
2916         Pds_max = Fn_Max( Psl_lim - Ps0 , 0.0e0 ) ;
2917 
2918         Fn_SU( Pds_ini , Vds, (1.0e0 + c_pslini_1) * Pds_max, c_pslini_2, T1 ) ;
2919         Pds_ini = Fn_Min( Pds_ini , Pds_max ) ;
2920       }
2921 
2922       if ( Pds_ini < 0.0 ) Pds_ini = 0.0 ;
2923       else if ( Pds_ini > Vds ) Pds_ini = Vds ;
2924 
2925 
2926      /*---------------------------------------------------*
2927       * Assign initial guess.
2928       *-----------------*/
2929       Pds = Pds_ini ;
2930       Psl = Ps0 + Pds ;
2931 
2932      /*---------------------------------------------------*
2933       * Calculation of Psl by solving Poisson eqn.
2934       * (beginning of Newton loop)
2935       * - Fsl : Fsl = 0 is the equation to be solved.
2936       * - dPsl : correction value.
2937       *-----------------*/
2938       flg_conv = 0 ;
2939 
2940      /*---------------------------------------------------*
2941       * start of Psl calculation. (label)
2942       *-----------------*/
2943 start_of_loopl:
2944 
2945       for ( lp_sl = 1 ; lp_sl <= lp_sl_max + 1 ; lp_sl ++ ) {
2946 
2947         Chi = beta * ( Psl - Vbscl ) ;
2948 
2949         if ( Chi  < znbd5 ) {
2950           /*-------------------------------------------*
2951            * zone-D2.  (Psl)
2952            * - Qb0 is approximated to 5-degree polynomial.
2953            *-----------------*/
2954 
2955           fi = Chi * Chi * Chi
2956             * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ;
2957           fi_dChi = Chi * Chi
2958             * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ;
2959 
2960           cfs1 = cnst1 * exp_bVbsVds ;
2961 
2962           fsl1 = cfs1 * fi * fi ;
2963           fsl1_dPsl = cfs1 * beta * 2 * fi * fi_dChi ;
2964 
2965           fb = Chi * ( cn_nc51
2966             + Chi * ( cn_nc52
2967             + Chi * ( cn_nc53
2968             + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ;
2969           fb_dChi = cn_nc51
2970             + Chi * ( 2 * cn_nc52
2971             + Chi * ( 3 * cn_nc53
2972             + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ;
2973 
2974           fsl2 = sqrt( fb * fb + fsl1 ) ;
2975           fsl2_dPsl = ( beta * fb_dChi * 2 * fb + fsl1_dPsl ) / ( fsl2 + fsl2 ) ;
2976 
2977         } else {
2978          /*-------------------------------------------*
2979           * zone-D3.  (Psl)
2980           *-----------------*/
2981           Rho = beta * ( Psl - Vds ) ;
2982           exp_Rho = exp( Rho ) ;
2983 
2984           fsl1 = cnst1 * ( exp_Rho - exp_bVbsVds ) ;
2985           fsl1_dPsl = cnst1 * beta * ( exp_Rho ) ;
2986           Xil = Chi - 1.0e0 ;
2987           fsl2 = sqrt( Xil + fsl1 ) ;
2988           fsl2_dPsl = ( beta + fsl1_dPsl ) / ( fsl2 + fsl2 ) ;
2989         }
2990 
2991         Fsl = Vgp - Psl - fac1 * fsl2 ;
2992         Fsl_dPsl = - 1.0e0 - fac1 * fsl2_dPsl ;
2993 
2994         if ( flg_conv == 1 ) break ;
2995 
2996         dPsl = - Fsl / Fsl_dPsl ;
2997 
2998        /*-------------------------------------------*
2999         * Update Psl .
3000         * - clamped to Vbscl if Psl < Vbscl .
3001         *-----------------*/
3002         dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Psl))) ;
3003         if ( fabs( dPsl ) > dPlim ) dPsl = dPlim * Fn_Sgn( dPsl ) ;
3004            Psl = Psl + dPsl ;
3005 
3006 
3007        /*-------------------------------------------*
3008         * Check convergence.
3009         * NOTE: This condition may be too rigid.
3010         *-----------------*/
3011         if ( fabs( dPsl ) <= ps_conv && fabs( Fsl ) <= gs_conv ) {
3012           flg_conv = 1 ;
3013         }
3014       } /* end of Psl Newton loop */
3015 
3016      /* Reduce loop count to exclude derivative calculation sweep */
3017       lp_sl -- ;
3018 
3019      /*-------------------------------------------*
3020       * Procedure for diverged case.
3021       *-----------------*/
3022       if ( flg_conv == 0 ) {
3023         fprintf( stderr ,
3024                "*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Psl)\n", model->HSMHV2modName ) ;
3025         fprintf( stderr ,
3026                " Vbse   = %7.3f Vdse = %7.3f Vgse = %7.3f\n" ,
3027                Vbse , Vdse , Vgse ) ;
3028         if ( flg_info >= 2 ) {
3029           printf("*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Psl)\n", model->HSMHV2modName ) ;
3030         }
3031       }
3032 
3033 
3034      /*---------------------------------------------------*
3035       * Evaluate derivatives of  Psl.
3036       * - note: Here, fsl1_dVbs and fsl2_dVbs are derivatives
3037       *   w.r.t. explicit Vbscl. So, Psl in the fsl1 and fsl2
3038       *   expressions is regarded as a constant.
3039       *-----------------*/
3040       Chi_dT = ( Psl - Vbscl ) * beta_dT - Vbscl_dT * beta ;
3041 
3042       if ( Chi < znbd5 ) {
3043         T1 = cfs1 * beta * fi ;
3044         fsl1_dVbs = T1 * ( ( Vbscl_dVbs - Vdseff_dVbs ) * fi - 2.0 * fi_dChi * Vbscl_dVbs ) ;
3045         fsl1_dVds = - T1 * fi * Vdseff_dVds ;
3046         fsl1_dVgs = - T1 * fi * Vdseff_dVgs ;
3047         cfs1_dT = exp_bVbsVds * cnst1_dT + cnst1 * exp_bVbsVds_dT ;
3048         fsl1_dT = fi * fi * cfs1_dT + 2 * cfs1 * fi * fi_dChi * Chi_dT ;
3049         T2 =  0.5 / fsl2 ;
3050         fsl2_dVbs = ( - beta * fb_dChi * 2 * fb * Vbscl_dVbs + fsl1_dVbs ) * T2 ;
3051         fsl2_dVds = fsl1_dVds * T2 ;
3052         fsl2_dVgs = fsl1_dVgs * T2 ;
3053         fsl2_dT = ( 2 * fb * fb_dChi * Chi_dT + fsl1_dT ) * T2 ;
3054       } else {
3055         Rho_dT = beta_dT * ( Psl - Vds ) - beta * Vdseff_dT ;
3056         exp_Rho_dT = Rho_dT * exp_Rho ;
3057 
3058         T1 = cnst1 * beta ;
3059         fsl1_dVbs = - T1 * ( exp_Rho * Vdseff_dVbs
3060                          + ( Vbscl_dVbs - Vdseff_dVbs ) * exp_bVbsVds );
3061         fsl1_dVds = - T1 * Vdseff_dVds * ( exp_Rho - exp_bVbsVds );
3062         fsl1_dVgs =   T1 * Vdseff_dVgs * ( - exp_Rho + exp_bVbsVds );
3063         fsl1_dT = cnst1 * ( exp_Rho_dT - exp_bVbsVds_dT ) + cnst1_dT * ( exp_Rho - exp_bVbsVds ) ;
3064         T2 = 0.5e0 / fsl2 ;
3065         fsl2_dVbs = ( - beta * Vbscl_dVbs + fsl1_dVbs ) * T2 ;
3066         fsl2_dVds = ( fsl1_dVds ) * T2 ;
3067         fsl2_dVgs = ( fsl1_dVgs ) * T2 ;
3068         fsl2_dT = ( Chi_dT + fsl1_dT ) * T2 ;
3069       }
3070 
3071       T1 = 1.0 / Fsl_dPsl ;
3072       Psl_dVbs = - ( Vgp_dVbs - ( fac1 * fsl2_dVbs + fac1_dVbs * fsl2 ) ) * T1 ;
3073       Psl_dVds = - ( Vgp_dVds - ( fac1 * fsl2_dVds + fac1_dVds * fsl2 ) ) * T1 ;
3074       Psl_dVgs = - ( Vgp_dVgs - ( fac1 * fsl2_dVgs + fac1_dVgs * fsl2 ) ) * T1 ;
3075       Psl_dT =   - ( Vgp_dT   - ( fac1 * fsl2_dT   + fac1_dT   * fsl2 ) ) * T1 ;
3076 
3077       Chi_dT = ( Psl - Vbscl ) * beta_dT + beta * ( Psl_dT - Vbscl_dT );
3078       exp_Chi_dT = exp_Chi * Chi_dT ;
3079 
3080 
3081       if ( Chi < znbd5 ) {
3082        /*-------------------------------------------*
3083         * zone-D1/D2. (Psl)
3084         *-----------------*/
3085         Xil = fb * fb + epsm10 ;
3086         T1 = 2 * fb * fb_dChi * beta ;
3087         Xil_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ;
3088         Xil_dVds = T1 * Psl_dVds ;
3089         Xil_dVgs = T1 * Psl_dVgs ;
3090         Xil_dT = 2 * fb * fb_dChi * Chi_dT ;
3091 
3092         Xilp12 = fb + epsm10 ;
3093         T1 = fb_dChi * beta ;
3094         Xilp12_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ;
3095         Xilp12_dVds = T1 * Psl_dVds ;
3096         Xilp12_dVgs = T1 * Psl_dVgs ;
3097         Xilp12_dT = fb_dChi * Chi_dT ;
3098 
3099         Xilp32 = fb * fb * fb + epsm10 ;
3100         T1 = 3 * fb * fb * fb_dChi * beta ;
3101         Xilp32_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ;
3102         Xilp32_dVds = T1 * Psl_dVds ;
3103         Xilp32_dVgs = T1 * Psl_dVgs ;
3104         Xilp32_dT = 3 * fb * fb * fb_dChi * Chi_dT ;
3105 
3106       } else {
3107        /*-------------------------------------------*
3108         * zone-D3. (Psl)
3109         *-----------------*/
3110 
3111         Xil = Chi - 1.0e0 ;
3112         Xil_dVbs = beta * ( Psl_dVbs - Vbscl_dVbs ) ;
3113         Xil_dVds = beta * Psl_dVds ;
3114         Xil_dVgs = beta * Psl_dVgs ;
3115         Xil_dT = Chi_dT ;
3116 
3117         Xilp12 = sqrt( Xil ) ;
3118         T1 = 0.5e0 / Xilp12 ;
3119         Xilp12_dVbs = T1 * Xil_dVbs ;
3120         Xilp12_dVds = T1 * Xil_dVds ;
3121         Xilp12_dVgs = T1 * Xil_dVgs ;
3122         Xilp12_dT = T1 * Xil_dT ;
3123 
3124         Xilp32 = Xil * Xilp12 ;
3125         T1 = 1.5e0 * Xilp12 ;
3126         Xilp32_dVbs = T1 * Xil_dVbs ;
3127         Xilp32_dVds = T1 * Xil_dVds ;
3128         Xilp32_dVgs = T1 * Xil_dVgs ;
3129         Xilp32_dT = T1 * Xil_dT ;
3130 
3131       }
3132 
3133 
3134      /*---------------------------------------------------*
3135       * Assign Pds.
3136       *-----------------*/
3137       Pds = Psl - Ps0 ;
3138 
3139    /* if ( Pds < ps_conv ) { */
3140       if ( Pds < 0.0 ) { /* take care of numerical noise */
3141         Pds = 0.0 ;
3142         Psl = Ps0 ;
3143       }
3144 
3145       Pds_dVbs = Psl_dVbs - Ps0_dVbs ;
3146       Pds_dVds = Psl_dVds - Ps0_dVds ;
3147       Pds_dVgs = Psl_dVgs - Ps0_dVgs ;
3148       Pds_dT = Psl_dT - Ps0_dT ;
3149 
3150      /* if ( Pds < ps_conv ) { */
3151       if ( Pds < 0.0 ) {
3152         Pds_dVbs = 0.0 ;
3153         Pds_dVgs = 0.0 ;
3154         Psl_dVbs = Ps0_dVbs ;
3155         Psl_dVgs = Ps0_dVgs ;
3156         Pds_dT = 0.0 ;
3157         Psl_dT = Ps0_dT ;
3158       }
3159 
3160       /* Vdseff */
3161       Vds = Vdsorg;
3162 
3163      /*-----------------------------------------------------------*
3164       * Evaluate Idd.
3165       * - Eta : substantial variable of QB'/Pds and Idd/Pds.
3166       * - note: Eta   = 4 * GAMMA_{hisim_0}
3167       *-----------------*/
3168       T1 = beta / Xi0 ;
3169       Eta = T1 * Pds ;
3170       T2 = Eta * beta_inv ;
3171       Eta_dVbs = T1 * ( Pds_dVbs - Xi0_dVbs * T2 ) ;
3172       Eta_dVds = T1 * ( Pds_dVds - Xi0_dVds * T2 ) ;
3173       Eta_dVgs = T1 * ( Pds_dVgs - Xi0_dVgs * T2 ) ;
3174       T1_dT = ( beta_dT * Xi0 - beta * Xi0_dT ) / Xi0 / Xi0 ;
3175       Eta_dT = T1_dT * Pds + T1 * Pds_dT ;
3176 
3177      /* ( Eta + 1 )^n */
3178       Eta1 = Eta + 1.0e0 ;
3179       Eta1p12 = sqrt( Eta1 ) ;
3180       Eta1p32 = Eta1p12 * Eta1 ;
3181       Eta1p52 = Eta1p32 * Eta1 ;
3182       Eta1_dT = Eta_dT ;
3183       Eta1p12_dT = 0.5e0 / Eta1p12 * Eta1_dT ;
3184       Eta1p32_dT = Eta1p12_dT * Eta1 + Eta1p12 * Eta1_dT ;
3185       Eta1p52_dT = Eta1p32_dT * Eta1 + Eta1p32 * Eta1_dT ;
3186 
3187      /* 1 / ( ( Eta + 1 )^n + 1 ) */
3188       Zeta12 = 1.0e0 / ( Eta1p12 + 1.0e0 ) ;
3189       Zeta32 = 1.0e0 / ( Eta1p32 + 1.0e0 ) ;
3190       Zeta52 = 1.0e0 / ( Eta1p52 + 1.0e0 ) ;
3191       Zeta12_dT = - 1.0e0 / ( Eta1p12 + 1.0e0 ) / ( Eta1p12 + 1.0e0 ) * Eta1p12_dT ;
3192       Zeta32_dT = - 1.0e0 / ( Eta1p32 + 1.0e0 ) / ( Eta1p32 + 1.0e0 ) * Eta1p32_dT ;
3193       Zeta52_dT = - 1.0e0 / ( Eta1p52 + 1.0e0 ) / ( Eta1p52 + 1.0e0 ) * Eta1p52_dT ;
3194 
3195      /*---------------------------------------------------*
3196       * F00 := PS00/Pds (n=1/2)
3197       *-----------------*/
3198       F00 = Zeta12 / Xi0p12 ;
3199       T3 = - 1 / Xi0  ;
3200       T4 = - 0.5e0 / Eta1p12 * F00 ;
3201       T5 = Zeta12 * T3 ;
3202       T6 = Zeta12 * T4 ;
3203       F00_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ;
3204       F00_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ;
3205       F00_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ;
3206       F00_dT = ( Zeta12_dT * Xi0p12 - Zeta12 * Xi0p12_dT ) / Xi0p12 / Xi0p12 ;
3207 
3208      /*---------------------------------------------------*
3209       * F10 := PS10/Pds (n=3/2)
3210       *-----------------*/
3211       T1 = 3.0e0 + Eta * ( 3.0e0 + Eta ) ;
3212       F10 = C_2o3 * Xi0p12 * Zeta32 * T1 ;
3213       T2 = 3.0e0 + Eta * 2.0e0 ;
3214       T3 = C_2o3 * T1 ;
3215       T4 = - 1.5e0 * Eta1p12 * F10 + C_2o3 * Xi0p12 * T2 ;
3216       T5 = Zeta32 * T3 ;
3217       T6 = Zeta32 * T4 ;
3218       F10_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ;
3219       F10_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ;
3220       F10_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ;
3221       T1_dT = Eta_dT * ( 3.0e0 + Eta ) + Eta * Eta_dT ;
3222       F10_dT = C_2o3 * Xi0p12 * Zeta32 * T1_dT
3223         + C_2o3 * T1 * ( Xi0p12 * Zeta32_dT + Zeta32 * Xi0p12_dT ) ;
3224 
3225      /*---------------------------------------------------*
3226       * F30 := PS30/Pds (n=5/2)
3227       *-----------------*/
3228       T1 = 5e0 + Eta * ( 10e0 + Eta * ( 10e0 + Eta * ( 5e0 + Eta ) ) ) ;
3229       F30 = 4e0 / ( 15e0 * beta ) * Xi0p32 * Zeta52 * T1 ;
3230       T2 = 10e0 + Eta * ( 20e0 + Eta * ( 15e0 + Eta * 4e0 ) ) ;
3231       T3 = 4e0 / ( 15e0 * beta ) * T1 ;
3232       T4 = - ( 5e0 / 2e0 ) * Eta1p32 * F30 + 4e0 / ( 15e0 * beta ) * Xi0p32 * T2 ;
3233       T5 = Zeta52 * T3 ;
3234       T6 = Zeta52 * T4 ;
3235       F30_dVbs = ( Xi0p32_dVbs * T5 + Eta_dVbs * T6 ) ;
3236       F30_dVds = ( Xi0p32_dVds * T5 + Eta_dVds * T6 ) ;
3237       F30_dVgs = ( Xi0p32_dVgs * T5 + Eta_dVgs * T6 ) ;
3238       T1_dT = ( 10e0 + 20e0 * Eta + 15e0 * Eta * Eta + 4e0 * Eta * Eta * Eta ) * Eta_dT ;
3239       F30_dT = 4e0 / 15e0 * beta_inv_dT * ( Xi0p32 * Zeta52 * T1 )
3240         + 4e0 / 15e0 * beta_inv * ( Xi0p32_dT * Zeta52 * T1 + Xi0p32 * Zeta52_dT * T1 + Xi0p32 * Zeta52 * T1_dT ) ;
3241 
3242      /*---------------------------------------------------*
3243       * F11 := PS11/Pds.
3244       *-----------------*/
3245       F11 = Ps0 * F10 + C_2o3 * beta_inv * Xilp32 - F30 ;
3246       T1 = C_2o3 * beta_inv ;
3247       F11_dVbs = Ps0_dVbs * F10 + Ps0 * F10_dVbs
3248         + T1 * Xilp32_dVbs - F30_dVbs ;
3249       F11_dVds = Ps0_dVds * F10 + Ps0 * F10_dVds
3250         + T1 * Xilp32_dVds - F30_dVds ;
3251       F11_dVgs = Ps0_dVgs * F10 + Ps0 * F10_dVgs
3252         + T1 * Xilp32_dVgs - F30_dVgs ;
3253       F11_dT = Ps0_dT * F10 + Ps0 * F10_dT
3254         + C_2o3 *( beta_inv_dT * Xilp32 + beta_inv * Xilp32_dT ) - F30_dT ;
3255 
3256      /*---------------------------------------------------*
3257       * Fdd := Idd/Pds.
3258       *-----------------*/
3259       T1 = Vgp + beta_inv - 0.5e0 * ( 2.0e0 * Ps0 + Pds ) ;
3260       T2 = - F10 + F00 ;
3261       T3 = beta * Cox ;
3262       T4 = beta * cnst0 ;
3263       Fdd = T3 * T1 + T4 * T2 ;
3264       Fdd_dVbs = T3 * ( Vgp_dVbs - Ps0_dVbs - 0.5e0 * Pds_dVbs )
3265         + beta * Cox_dVb * T1 + T4 * ( - F10_dVbs + F00_dVbs ) ;
3266       Fdd_dVds = T3 * ( Vgp_dVds - Ps0_dVds - 0.5e0 * Pds_dVds )
3267         + beta * Cox_dVd * T1 + T4 * ( - F10_dVds + F00_dVds ) ;
3268       Fdd_dVgs = T3 * ( Vgp_dVgs - Ps0_dVgs - 0.5e0 * Pds_dVgs )
3269         + beta * Cox_dVg * T1 + T4 * ( - F10_dVgs + F00_dVgs ) ;
3270       T1_dT = Vgp_dT + beta_inv_dT - 0.5e0 * ( 2.0e0 * Ps0_dT + Pds_dT ) ;
3271       T2_dT = -F10_dT + F00_dT ;
3272       T3_dT = Cox * beta_dT ;
3273       T4_dT = beta * cnst0_dT + cnst0 * beta_dT ;
3274       Fdd_dT = T1 * T3_dT + T3 * T1_dT + T2 * T4_dT + T4 * T2_dT ;
3275 
3276 
3277      /*---------------------------------------------------*
3278       *  Idd:
3279       *-----------------*/
3280       Idd = Pds * Fdd ;
3281       Idd_dVbs = Pds_dVbs * Fdd + Pds * Fdd_dVbs ;
3282       Idd_dVds = Pds_dVds * Fdd + Pds * Fdd_dVds ;
3283       Idd_dVgs = Pds_dVgs * Fdd + Pds * Fdd_dVgs ;
3284       Idd_dT = Fdd * Pds_dT + Pds * Fdd_dT ;
3285 
3286      /*-----------------------------------------------------------*
3287       * Skip CLM and integrated charges if zone==D1
3288       *-----------------*/
3289       if( flg_zone == 1 ) {
3290         goto start_of_mobility ;
3291       }
3292 
3293      /*-----------------------------------------------------------*
3294       * Channel Length Modulation. Lred: \Delta L
3295       *-----------------*/
3296       if( pParam->HSMHV2_clm2 < epsm10 && pParam->HSMHV2_clm3 < epsm10 ) {
3297         Lred = 0.0e0 ;
3298         Lred_dVbs = 0.0e0 ;
3299         Lred_dVds = 0.0e0 ;
3300         Lred_dVgs = 0.0e0 ;
3301         Lred_dT = 0.0e0 ;
3302 
3303         Psdl = Psl ;
3304         Psdl_dVbs = Psl_dVbs ;
3305         Psdl_dVds = Psl_dVds ;
3306         Psdl_dVgs = Psl_dVgs ;
3307         Psdl_dT = Psl_dT ;
3308 
3309         if ( Psdl > Ps0 + Vds - epsm10 ) {
3310           Psdl = Ps0 + Vds - epsm10 ;
3311           Psdl_dVbs = Ps0_dVbs ;
3312           Psdl_dVds = Ps0_dVds + 1.0 ;
3313           Psdl_dVgs = Ps0_dVgs ;
3314           Psdl_dT = Ps0_dT ;
3315         }
3316 
3317       } else {
3318         T1 = here->HSMHV2_wdpl ;
3319         T8 = sqrt (Psl - Vbscl) ;
3320         Wd = T1 * T8 ;
3321         T9 = 0.5 * T1 / T8 ;
3322         Wd_dVbs = T9 * (Psl_dVbs - Vbscl_dVbs) ;
3323         Wd_dVds = T9 * Psl_dVds ;
3324         Wd_dVgs = T9 * Psl_dVgs ;
3325         Wd_dT = T9 * (Psl_dT - Vbscl_dT) ;
3326 
3327         T0 = 1.0 / Wd ;
3328         T1 = Qn0 * T0 ;
3329         T2 = pParam->HSMHV2_clm3 * T1 ;
3330         T3 = pParam->HSMHV2_clm3 * T0 ;
3331         T2_dVb = T3 * (Qn0_dVbs - T1 * Wd_dVbs) ;
3332         T2_dVd = T3 * (Qn0_dVds - T1 * Wd_dVds) ;
3333         T2_dVg = T3 * (Qn0_dVgs - T1 * Wd_dVgs) ;
3334         T2_dT = T3 * (Qn0_dT - T1 * Wd_dT) ;
3335 
3336         T5 = pParam->HSMHV2_clm2 * q_Nsub + T2 ;
3337         T1 = 1.0 / T5 ;
3338         T4 = C_ESI * T1 ;
3339         T4_dVb = - T4 * T2_dVb * T1 ;
3340         T4_dVd = - T4 * T2_dVd * T1 ;
3341         T4_dVg = - T4 * T2_dVg * T1 ;
3342         T4_dT = -T4 * T2_dT * T1 ;
3343 
3344         T1 = (1.0e0 - pParam->HSMHV2_clm1) ;
3345         Psdl = pParam->HSMHV2_clm1 * (Vds + Ps0) + T1 * Psl ;
3346         Psdl_dVbs = pParam->HSMHV2_clm1 * Ps0_dVbs + T1 * Psl_dVbs ;
3347         Psdl_dVds = pParam->HSMHV2_clm1 * (1.0 + Ps0_dVds) + T1 * Psl_dVds ;
3348         Psdl_dVgs = pParam->HSMHV2_clm1 * Ps0_dVgs + T1 * Psl_dVgs ;
3349         Psdl_dT = pParam->HSMHV2_clm1 * Ps0_dT + T1 * Psl_dT ;
3350 
3351         if ( Psdl > Ps0 + Vds - epsm10 ) {
3352           Psdl = Ps0 + Vds - epsm10 ;
3353           Psdl_dVbs = Ps0_dVbs ;
3354           Psdl_dVds = Ps0_dVds + 1.0 ;
3355           Psdl_dVgs = Ps0_dVgs ;
3356           Psdl_dT = Ps0_dT ;
3357         }
3358         T6 = Psdl - Psl ;
3359         T6_dVb = Psdl_dVbs - Psl_dVbs ;
3360         T6_dVd = Psdl_dVds - Psl_dVds ;
3361         T6_dVg = Psdl_dVgs - Psl_dVgs ;
3362         T6_dT = Psdl_dT - Psl_dT ;
3363 
3364         T3 = beta * Qn0 ;
3365         T1 = 1.0 / T3 ;
3366         T5 = Idd * T1 ;
3367         T3_dT = beta * Qn0_dT + beta_dT * Qn0 ;
3368         T1_dT = - T1 * T1 * T3_dT ;
3369         T5_dT = Idd_dT * T1 + Idd * T1_dT ;
3370         T2 = T5 * beta ;
3371         T5_dVb = (Idd_dVbs - T2 * Qn0_dVbs) * T1 ;
3372         T5_dVd = (Idd_dVds - T2 * Qn0_dVds) * T1 ;
3373         T5_dVg = (Idd_dVgs - T2 * Qn0_dVgs) * T1 ;
3374 
3375         T10 = q_Nsub / C_ESI ;
3376         T1 = 1.0e5 ;
3377         T2 = 1.0 / Leff ;
3378         T11 = (2.0 * T5 + 2.0 * T10 * T6 * T4 + T1 * T4) * T2 ;
3379         T3 = T2 * T4 ;
3380         T7 = T11 * T4 ;
3381         T7_dVb = (2.0 * T5_dVb + 2.0 * T10 * (T6_dVb * T4 + T6 * T4_dVb) + T1 * T4_dVb) * T3 + T11 * T4_dVb ;
3382         T7_dVd = (2.0 * T5_dVd + 2.0 * T10 * (T6_dVd * T4 + T6 * T4_dVd) + T1 * T4_dVd) * T3 + T11 * T4_dVd ;
3383         T7_dVg = (2.0 * T5_dVg + 2.0 * T10 * (T6_dVg * T4 + T6 * T4_dVg) + T1 * T4_dVg) * T3 + T11 * T4_dVg ;
3384         T7_dT = (2.0 * T5_dT + 2.0 * T10 * ( T6_dT * T4 + T6 * T4_dT ) + T1 * T4_dT ) * T3 + T11 * T4_dT ;
3385 
3386         T11 = 4.0 * (2.0 * T10 * T6 + T1) ;
3387         T1 = 8.0 * T10 * T4 * T4 ;
3388         T2 = 2.0 * T11 * T4 ;
3389         T8 = T11 * T4 * T4 ;
3390         T8_dVb = ( T1 * T6_dVb + T2 * T4_dVb) ;
3391         T8_dVd = ( T1 * T6_dVd + T2 * T4_dVd) ;
3392         T8_dVg = ( T1 * T6_dVg + T2 * T4_dVg) ;
3393         T8_dT = ( T1 * T6_dT + T2 * T4_dT) ;
3394 
3395         T9 = sqrt (T7 * T7 + T8);
3396         T1 = 1.0 / T9 ;
3397         T2 = T7 * T1 ;
3398         T3 = 0.5 * T1 ;
3399         T9_dVb = (T2 * T7_dVb + T3 * T8_dVb) ;
3400         T9_dVd = (T2 * T7_dVd + T3 * T8_dVd) ;
3401         T9_dVg = (T2 * T7_dVg + T3 * T8_dVg) ;
3402         T9_dT = (T2 * T7_dT + T3 * T8_dT) ;
3403 
3404         Lred = 0.5 * (- T7 + T9) ;
3405         Lred_dVbs = 0.5 * (- T7_dVb + T9_dVb) ;
3406         Lred_dVds = 0.5 * (- T7_dVd + T9_dVd) ;
3407         Lred_dVgs = 0.5 * (- T7_dVg + T9_dVg) ;
3408         Lred_dT = 0.5 * (- T7_dT + T9_dT ) ;
3409        /*---------------------------------------------------*
3410         * Modify Lred for symmetry.
3411         *-----------------*/
3412         T1 = Lred ;
3413         Lred = FMDVDS * T1 ;
3414         Lred_dVbs = FMDVDS_dVbs * T1 + FMDVDS * Lred_dVbs ;
3415         Lred_dVds = FMDVDS_dVds * T1 + FMDVDS * Lred_dVds ;
3416         Lred_dVgs = FMDVDS_dVgs * T1 + FMDVDS * Lred_dVgs ;
3417         Lred_dT = FMDVDS_dT * T1 + FMDVDS * Lred_dT ;
3418       }
3419 
3420      /* CLM5 & CLM6 */
3421       Lred *= here->HSMHV2_clmmod ;
3422       Lred_dVbs *= here->HSMHV2_clmmod ;
3423       Lred_dVds *= here->HSMHV2_clmmod ;
3424       Lred_dVgs *= here->HSMHV2_clmmod ;
3425       Lred_dT *= here->HSMHV2_clmmod ;
3426 
3427      /*---------------------------------------------------*
3428       * Qbu : -Qb in unit area.
3429       *-----------------*/
3430       T1 = Vgp + beta_inv ;
3431       T2 = T1 * F10 - F11 ;
3432       T1_dT = Vgp_dT + beta_inv_dT ;
3433       T2_dT = T1_dT * F10 + T1 * F10_dT - F11_dT ;
3434 
3435       Qbnm = cnst0 * ( cnst0 * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds )
3436                    + Cox * T2 ) ;
3437       Qbnm_dVbs = cnst0 * ( cnst0 * ( - Xi0_dVbs - 0.5e0 * beta * Pds_dVbs )
3438                           + Cox * ( Vgp_dVbs * F10 + T1 * F10_dVbs - F11_dVbs )
3439                           + Cox_dVb * T2 ) ;
3440       Qbnm_dVds = cnst0 * ( cnst0 * ( - Xi0_dVds - 0.5e0 * beta * Pds_dVds )
3441                           + Cox * ( Vgp_dVds * F10 + T1 * F10_dVds - F11_dVds )
3442                           + Cox_dVd * T2 ) ;
3443       Qbnm_dVgs = cnst0 * ( cnst0 * ( - Xi0_dVgs - 0.5e0 * beta * Pds_dVgs )
3444                           + Cox * ( Vgp_dVgs * F10 + T1 * F10_dVgs - F11_dVgs )
3445                           + Cox_dVg * T2 ) ;
3446       Qbnm_dT = cnst0_dT * ( cnst0 * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds )
3447                            + Cox * T2 )
3448         + cnst0 * ( cnst0_dT * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds )
3449                   + cnst0 * ( - Xi0_dT - 0.5 * beta_dT * Pds - 0.5 * beta * Pds_dT )
3450                   + Cox * T2_dT );
3451 
3452       T1 = beta ;
3453       Qbu = T1 * Qbnm / Fdd  ;
3454       T2 = T1 / ( Fdd * Fdd ) ;
3455       Qbu_dVbs = T2 * ( Fdd * Qbnm_dVbs - Qbnm * Fdd_dVbs ) ;
3456       Qbu_dVds = T2 * ( Fdd * Qbnm_dVds - Qbnm * Fdd_dVds ) ;
3457       Qbu_dVgs = T2 * ( Fdd * Qbnm_dVgs - Qbnm * Fdd_dVgs ) ;
3458       T1_dT = beta_dT ;
3459       Qbu_dT = ( Fdd * ( T1_dT * Qbnm + T1 * Qbnm_dT ) - T1 * Qbnm * Fdd_dT ) / ( Fdd * Fdd ) ;
3460 
3461 
3462      /*---------------------------------------------------*
3463       * preparation for Qi and Qd.
3464       * - DtPds: Delta * Pds ;
3465       * - Achi: (1+Delta) * Pds ;
3466       *-----------------*/
3467       T1 = 2.0e0 * fac1 ;
3468       DtPds = T1 * ( F10 - Xi0p12 ) ;
3469       T2 = 2.0 * ( F10 - Xi0p12 ) ;
3470       DtPds_dVbs  = T1 * ( F10_dVbs - Xi0p12_dVbs )
3471                 + T2 * fac1_dVbs ;
3472       DtPds_dVds  = T1 * ( F10_dVds - Xi0p12_dVds )
3473                 + T2 * fac1_dVds ;
3474       DtPds_dVgs  = T1 * ( F10_dVgs - Xi0p12_dVgs )
3475                 + T2 * fac1_dVgs ;
3476       T1_dT = 2.0e0 * fac1_dT ;
3477       DtPds_dT = T1_dT * ( F10 - Xi0p12 ) + T1 * ( F10_dT -Xi0p12_dT ) ;
3478 
3479       Achi = Pds + DtPds ;
3480       Achi_dVbs = Pds_dVbs + DtPds_dVbs ;
3481       Achi_dVds = Pds_dVds + DtPds_dVds ;
3482       Achi_dVgs = Pds_dVgs + DtPds_dVgs ;
3483       Achi_dT = Pds_dT + DtPds_dT ;
3484 
3485      /*-----------------------------------------------------------*
3486       * Alpha : parameter to evaluate charges.
3487       * - Achi: (1+Delta) * Pds ;
3488       * - clamped to 0 if Alpha < 0.
3489       *-----------------*/
3490       T1 = 1.0 / VgVt ;
3491       T2 = Achi * T1 ;
3492       T3 = 1.0e0 - T2 ;
3493       TX = 1.0 - T3 ;
3494       Fn_CP( TY , TX , 1.0 , 4 , T4 ) ;
3495       Alpha = 1.0 - TY ;
3496       T5 = T1 * T4 ;
3497       Alpha_dVbs = - ( Achi_dVbs - T2 * VgVt_dVbs ) * T5 ;
3498       Alpha_dVds = - ( Achi_dVds - T2 * VgVt_dVds ) * T5 ;
3499       Alpha_dVgs = - ( Achi_dVgs - T2 * VgVt_dVgs ) * T5 ;
3500       Alpha_dT = - ( Achi_dT - T2 * VgVt_dT ) * T5 ;
3501 
3502 
3503      /*-----------------------------------------------------------*
3504       * Qiu : -Qi in unit area.
3505       *-----------------*/
3506 
3507       Qinm = 1.0e0 + Alpha * ( 1.0e0 + Alpha ) ;
3508       T1 = 1.0e0 + Alpha + Alpha ;
3509       Qinm_dVbs = Alpha_dVbs * T1 ;
3510       Qinm_dVds = Alpha_dVds * T1 ;
3511       Qinm_dVgs = Alpha_dVgs * T1 ;
3512       Qinm_dT = Alpha_dT * T1 ;
3513 
3514       Qidn = Fn_Max( 1.0e0 + Alpha , epsm10 ) ;
3515       Qidn_dVbs = Alpha_dVbs ;
3516       Qidn_dVds = Alpha_dVds ;
3517       Qidn_dVgs = Alpha_dVgs ;
3518       Qidn_dT = Alpha_dT ;
3519 
3520       T1 = C_2o3 * VgVt * Qinm / Qidn ;
3521       Qiu = T1 * Cox ;
3522       T2 = 1.0 / VgVt ;
3523       T3 = 1.0 / Qinm ;
3524       T4 = 1.0 / Qidn ;
3525       Qiu_dVbs = Qiu * ( VgVt_dVbs * T2 + Qinm_dVbs * T3 - Qidn_dVbs * T4 )
3526              + T1 * Cox_dVb ;
3527       Qiu_dVds = Qiu * ( VgVt_dVds * T2 + Qinm_dVds * T3 - Qidn_dVds * T4)
3528              + T1 * Cox_dVd ;
3529       Qiu_dVgs = Qiu * ( VgVt_dVgs * T2 + Qinm_dVgs * T3 - Qidn_dVgs * T4)
3530              + T1 * Cox_dVg ;
3531       T1_dT = C_2o3 * ( Qidn * ( VgVt_dT * Qinm + VgVt * Qinm_dT ) - Qidn_dT * VgVt * Qinm )
3532         / ( Qidn * Qidn ) ;
3533       Qiu_dT = Cox * T1_dT ;
3534 
3535 
3536      /*-----------------------------------------------------------*
3537       * Qdrat : Qd/Qi
3538       *-----------------*/
3539       Qdnm = 0.5e0 + Alpha ;
3540       Qdnm_dVbs = Alpha_dVbs ;
3541       Qdnm_dVds = Alpha_dVds ;
3542       Qdnm_dVgs = Alpha_dVgs ;
3543       Qdnm_dT = Alpha_dT ;
3544 
3545       Qddn = Qidn * Qinm ;
3546       Qddn_dVbs = Qidn_dVbs * Qinm + Qidn * Qinm_dVbs ;
3547       Qddn_dVds = Qidn_dVds * Qinm + Qidn * Qinm_dVds ;
3548       Qddn_dVgs = Qidn_dVgs * Qinm + Qidn * Qinm_dVgs ;
3549       Qddn_dT = Qidn_dT * Qinm + Qidn * Qinm_dT ;
3550 
3551       Quot = 0.4e0 * Qdnm  / Qddn ;
3552       Qdrat = 0.6e0 - Quot ;
3553 
3554       if ( Qdrat <= 0.5e0 ) {
3555         T1 = 1.0 / Qddn ;
3556         T2 = 1.0 / Qdnm ;
3557         Qdrat_dVbs = Quot * ( Qddn_dVbs * T1 - Qdnm_dVbs * T2 ) ;
3558         Qdrat_dVds = Quot * ( Qddn_dVds * T1 - Qdnm_dVds * T2 ) ;
3559         Qdrat_dVgs = Quot * ( Qddn_dVgs * T1 - Qdnm_dVgs * T2 ) ;
3560         Qdrat_dT = Quot * ( Qddn_dT * T1 - Qdnm_dT * T2 ) ;
3561       } else {
3562         Qdrat = 0.5e0 ;
3563         Qdrat_dVbs = 0.0e0 ;
3564         Qdrat_dVds = 0.0e0 ;
3565         Qdrat_dVgs = 0.0e0 ;
3566         Qdrat_dT = 0.0e0 ;
3567 
3568       }
3569 
3570 
3571      /*-----------------------------------------------------------*
3572       * Interpolate charges and CLM for zone-D2.
3573       *-----------------*/
3574 
3575       if ( flg_zone == 2 ) {
3576         T1 = Qbu ;
3577         Qbu = FD2 * Qbu + ( 1.0 - FD2 ) * Qb0 ;
3578         Qbu_dVbs = FD2 * Qbu_dVbs + FD2_dVbs * T1
3579           + ( 1.0 - FD2 ) * Qb0_dVb - FD2_dVbs * Qb0 ;
3580         Qbu_dVds = FD2 * Qbu_dVds + FD2_dVds * T1
3581           + ( 1.0 - FD2 ) * Qb0_dVd - FD2_dVds * Qb0 ;
3582         Qbu_dVgs = FD2 * Qbu_dVgs + FD2_dVgs * T1
3583           + ( 1.0 - FD2 ) * Qb0_dVg - FD2_dVgs * Qb0 ;
3584         Qbu_dT = FD2 * Qbu_dT + FD2_dT * T1
3585           + ( 1.0 - FD2 ) * Qb0_dT - FD2_dT * Qb0 ;
3586 
3587         if ( Qbu < 0.0 ) {
3588           Qbu = 0.0 ;
3589           Qbu_dVbs = 0.0 ;
3590           Qbu_dVds = 0.0 ;
3591           Qbu_dVgs = 0.0 ;
3592           Qbu_dT = 0.0 ;
3593         }
3594         T1 = Qiu ;
3595         Qiu = FD2 * Qiu + ( 1.0 - FD2 ) * Qn0 ;
3596         Qiu_dVbs = FD2 * Qiu_dVbs + FD2_dVbs * T1
3597           + ( 1.0 - FD2 ) * Qn0_dVbs - FD2_dVbs * Qn0 ;
3598         Qiu_dVds = FD2 * Qiu_dVds + FD2_dVds * T1
3599           + ( 1.0 - FD2 ) * Qn0_dVds - FD2_dVds * Qn0 ;
3600         Qiu_dVgs = FD2 * Qiu_dVgs + FD2_dVgs * T1
3601           + ( 1.0 - FD2 ) * Qn0_dVgs - FD2_dVgs * Qn0 ;
3602         Qiu_dT = FD2 * Qiu_dT + FD2_dT * T1
3603           + ( 1.0 - FD2 ) * Qn0_dT - FD2_dT * Qn0 ;
3604 
3605         if ( Qiu < 0.0 ) {
3606           Qiu = 0.0 ;
3607           Qiu_dVbs = 0.0 ;
3608           Qiu_dVds = 0.0 ;
3609           Qiu_dVgs = 0.0 ;
3610           Qiu_dT = 0.0 ;
3611         }
3612 
3613         T1 = Qdrat ;
3614         Qdrat = FD2 * Qdrat + ( 1.0 - FD2 ) * 0.5e0 ;
3615         Qdrat_dVbs = FD2 * Qdrat_dVbs + FD2_dVbs * T1 - FD2_dVbs * 0.5e0 ;
3616         Qdrat_dVds = FD2 * Qdrat_dVds + FD2_dVds * T1 - FD2_dVds * 0.5e0 ;
3617         Qdrat_dVgs = FD2 * Qdrat_dVgs + FD2_dVgs * T1 - FD2_dVgs * 0.5e0 ;
3618         Qdrat_dT = FD2 * Qdrat_dT + FD2_dT * T1 - FD2_dT * 0.5e0 ;
3619 
3620         /* note: Lred=0 in zone-D1 */
3621         T1 = Lred ;
3622         Lred = FD2 * Lred ;
3623         Lred_dVbs = FD2 * Lred_dVbs + FD2_dVbs * T1 ;
3624         Lred_dVds = FD2 * Lred_dVds + FD2_dVds * T1 ;
3625         Lred_dVgs = FD2 * Lred_dVgs + FD2_dVgs * T1 ;
3626         Lred_dT = FD2 * Lred_dT + FD2_dT * T1 ;
3627 
3628       } /* end of flg_zone==2 if-block */
3629 
3630 
3631 start_of_mobility:
3632 
3633       Lch = Leff - Lred ;
3634       if ( Lch < 1.0e-9 ) {
3635         fprintf ( stderr , "*** warning(HiSIM_HV(%s)): actual channel length is too small. (Lch=%e[m])\n" ,  model->HSMHV2modName, Lch ) ;
3636         fprintf ( stderr , "                    CLM5 and/or CLM6 might be too large.\n" ) ;
3637         Lch = 1.0e-9 ; Lch_dVbs = Lch_dVds = Lch_dVgs = 0.0 ;
3638         Lch_dT = 0.0 ;
3639       } else { Lch_dVbs = - Lred_dVbs ; Lch_dVds = - Lred_dVds ; Lch_dVgs = - Lred_dVgs ;
3640         Lch_dT = - Lred_dT ;
3641       }
3642 
3643      /*-----------------------------------------------------------*
3644       * Muun : universal mobility.  (CGS unit)
3645       *-----------------*/
3646 
3647       T1 = here->HSMHV2_ndep_o_esi ;
3648       T2 = here->HSMHV2_ninv_o_esi ;
3649 
3650       T0 = here->HSMHV2_ninvd ;
3651       T4 = 1.0 + ( Psl - Ps0 ) * T0 ;
3652       T4_dVb = ( Psl_dVbs - Ps0_dVbs ) * T0 ;
3653       T4_dVd = ( Psl_dVds - Ps0_dVds ) * T0 ;
3654       T4_dVg = ( Psl_dVgs - Ps0_dVgs ) * T0 ;
3655       T4_dT =  ( Psl_dT - Ps0_dT )     * T0 + ( Psl - Ps0 ) * ninvd_dT ;
3656 
3657       T5     = T1 * Qbu      + T2 * Qiu ;
3658       T5_dVb = T1 * Qbu_dVbs + T2 * Qiu_dVbs ;
3659       T5_dVd = T1 * Qbu_dVds + T2 * Qiu_dVds ;
3660       T5_dVg = T1 * Qbu_dVgs + T2 * Qiu_dVgs ;
3661       T5_dT  = T1 * Qbu_dT   + T2 * Qiu_dT   ;
3662 
3663       T3     = T5 / T4 ;
3664       T3_dVb = ( - T4_dVb * T5 + T4 * T5_dVb ) / T4 / T4 ;
3665       T3_dVd = ( - T4_dVd * T5 + T4 * T5_dVd ) / T4 / T4 ;
3666       T3_dVg = ( - T4_dVg * T5 + T4 * T5_dVg ) / T4 / T4 ;
3667       T3_dT  = ( - T4_dT  * T5 + T4 * T5_dT  ) / T4 / T4 ;
3668 
3669       Eeff = T3 ;
3670       Eeff_dVbs = T3_dVb ;
3671       Eeff_dVds = T3_dVd ;
3672       Eeff_dVgs = T3_dVg ;
3673       Eeff_dT  = T3_dT ;
3674 
3675       T5 = Fn_Pow( Eeff , model->HSMHV2_mueph0 - 1.0e0 ) ;
3676       T8 = T5 * Eeff ;
3677       T7 = Fn_Pow( Eeff , here->HSMHV2_muesr - 1.0e0 ) ;
3678       T6 = T7 * Eeff ;
3679       T8_dT = model->HSMHV2_mueph0 * T5 * Eeff_dT ;
3680       T6_dT = here->HSMHV2_muesr * T7 * Eeff_dT ;
3681 
3682       T9 = C_QE * C_m2cm_p2 ;
3683       Rns = Qiu / T9 ;
3684       Rns_dT = Qiu_dT / T9 ;
3685 
3686       T1 = 1.0e0 / ( pParam->HSMHV2_muecb0 + pParam->HSMHV2_muecb1 * Rns / 1.0e11 )
3687         + here->HSMHV2_mphn0 * T8 + T6 / pParam->HSMHV2_muesr1 ;
3688 
3689 
3690       T1_dT =  - 1.0e0 / ( pParam->HSMHV2_muecb0 + pParam->HSMHV2_muecb1 * Rns / 1.0e11 )
3691         / ( pParam->HSMHV2_muecb0 + pParam->HSMHV2_muecb1 * Rns / 1.0e11 )
3692         * pParam->HSMHV2_muecb1 * Rns_dT / 1.0e11
3693         + here->HSMHV2_mphn0 * T8_dT + mphn0_dT * T8 + T6_dT / pParam->HSMHV2_muesr1 ;
3694 
3695       Muun = 1.0e0 / T1 ;
3696       Muun_dT = - Muun / T1 * T1_dT ;
3697 
3698       T1 = 1.0e0 / ( T1 * T1 ) ;
3699       T2 = pParam->HSMHV2_muecb0 + pParam->HSMHV2_muecb1 * Rns / 1.0e11 ;
3700       T2 = 1.0e0 / ( T2 * T2 ) ;
3701       T3 = here->HSMHV2_mphn1 * T5 ;
3702       T4 = here->HSMHV2_muesr * T7 / pParam->HSMHV2_muesr1 ;
3703       T5 = - 1.0e-11 * pParam->HSMHV2_muecb1 / C_QE * T2 / C_m2cm_p2 ;
3704       Muun_dVbs = - ( T5 * Qiu_dVbs
3705                     + Eeff_dVbs * T3 + Eeff_dVbs * T4 ) * T1 ;
3706       Muun_dVds = - ( T5 * Qiu_dVds
3707                     + Eeff_dVds * T3 + Eeff_dVds * T4 ) * T1 ;
3708       Muun_dVgs = - ( T5 * Qiu_dVgs
3709                     + Eeff_dVgs * T3 + Eeff_dVgs * T4 ) * T1 ;
3710 
3711      /*  Change to MKS unit */
3712       Muun      /= C_m2cm_p2 ;
3713       Muun_dT   /= C_m2cm_p2 ;
3714       Muun_dVbs /= C_m2cm_p2 ;
3715       Muun_dVds /= C_m2cm_p2 ;
3716       Muun_dVgs /= C_m2cm_p2 ;
3717 
3718      /*-----------------------------------------------------------*
3719       * Mu : mobility
3720       *-----------------*/
3721       T2 = beta * (Qn0 + small) * Lch ;
3722 
3723 
3724       T1 = 1.0e0 / T2 ;
3725       T3 = T1 * T1 ;
3726       T4 =  - beta * T3 ;
3727       T5 = T4 * Lch ;
3728       T6 = T4 * (Qn0 + small) ;
3729       T1_dVb = ( T5 * Qn0_dVbs + T6 * Lch_dVbs) ;
3730       T1_dVd = ( T5 * Qn0_dVds + T6 * Lch_dVds) ;
3731       T1_dVg = ( T5 * Qn0_dVgs + T6 * Lch_dVgs) ;
3732       T2_dT = beta_dT * (Qn0 + small) * Lch + beta * Qn0_dT * Lch + beta * (Qn0 + small) * Lch_dT ;
3733       T1_dT = - T1 / T2 * T2_dT ;
3734 
3735       TY = Idd * T1 ;
3736       TY_dVbs = Idd_dVbs * T1 + Idd * T1_dVb ;
3737       TY_dVds = Idd_dVds * T1 + Idd * T1_dVd ;
3738       TY_dVgs = Idd_dVgs * T1 + Idd * T1_dVg ;
3739       TY_dT = Idd_dT * T1 + Idd * T1_dT ;
3740 
3741       T2 = 0.2 * Vmax /  Muun ;
3742       T3 = - T2 / Muun ;
3743       T2_dVb = T3 * Muun_dVbs ;
3744       T2_dVd = T3 * Muun_dVds ;
3745       T2_dVg = T3 * Muun_dVgs ;
3746       T2_dT = 0.2 * ( Vmax_dT * Muun - Muun_dT * Vmax )/ ( Muun * Muun ) ;
3747 
3748       Ey = sqrt( TY * TY + T2 * T2 ) ;
3749       T4 = 1.0 / Ey ;
3750       Ey_dVbs = T4 * ( TY * TY_dVbs + T2 * T2_dVb ) ;
3751       Ey_dVds = T4 * ( TY * TY_dVds + T2 * T2_dVd ) ;
3752       Ey_dVgs = T4 * ( TY * TY_dVgs + T2 * T2_dVg ) ;
3753       Ey_dT = T4 * ( TY * TY_dT + T2 * T2_dT ) ;
3754 
3755       Em = Muun * Ey ;
3756       Em_dVbs = Muun_dVbs * Ey + Muun * Ey_dVbs ;
3757       Em_dVds = Muun_dVds * Ey + Muun * Ey_dVds ;
3758       Em_dVgs = Muun_dVgs * Ey + Muun * Ey_dVgs ;
3759       Em_dT = Ey * Muun_dT + Ey_dT * Muun ;
3760 
3761       T1  = Em / Vmax ;
3762       T1_dT = ( Em_dT * Vmax - Vmax_dT * Em ) / ( Vmax * Vmax );
3763 
3764      /* note: model->HSMHV2_bb = 2 (electron) ;1 (hole) */
3765       if ( 1.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 1.0e0 + epsm10 ) {
3766         T3 = 1.0e0 ;
3767         T3_dT = 0.0e0 ;
3768       } else if ( 2.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 2.0e0 + epsm10 ) {
3769         T3 = T1 ;
3770         T3_dT = T1_dT ;
3771       } else {
3772         T3 = Fn_Pow( T1 , model->HSMHV2_bb - 1.0e0 ) ;
3773         T3_dT = ( model->HSMHV2_bb - 1.0e0 )* Fn_Pow( T1 , model->HSMHV2_bb - 2.0e0 ) * T1_dT ;
3774       }
3775       T2 = T1 * T3 ;
3776       T4 = 1.0e0 + T2 ;
3777       T2_dT = T1 * T3_dT + T3 * T1_dT ;
3778       T4_dT = T2_dT ;
3779 
3780       if ( 1.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 1.0e0 + epsm10 ) {
3781         T5 = 1.0 / T4 ;
3782         T6 = T5 / T4 ;
3783         T5_dT = - T5 * T5 * T4_dT ;
3784         T6_dT = T5 * T5 * ( T5_dT * T4 - T5 * T4_dT ) ;
3785       } else if ( 2.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 2.0e0 + epsm10 ) {
3786         T5 = 1.0 / sqrt( T4 ) ;
3787           T6 = T5 / T4 ;
3788         T5_dT = - 0.5e0 / ( T4 * sqrt(T4)) * T4_dT ;
3789         T6_dT = ( T5_dT * T4 - T5 * T4_dT ) / T4 / T4 ;
3790       } else {
3791         T6 = Fn_Pow( T4 , ( - 1.0e0 / model->HSMHV2_bb - 1.0e0 ) ) ;
3792         T5 = T4 * T6 ;
3793         T6_dT =( - 1.0e0 / model->HSMHV2_bb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / model->HSMHV2_bb - 2.0e0 ) ) * T4_dT ;
3794         T5_dT = T4_dT * T6 + T4 * T6_dT ;
3795       }
3796 
3797       T7 = Muun / Vmax * T6 * T3 ;
3798 
3799       Mu = Muun * T5 ;
3800       Mu_dVbs = Muun_dVbs * T5 - T7 * Em_dVbs ;
3801       Mu_dVds = Muun_dVds * T5 - T7 * Em_dVds ;
3802       Mu_dVgs = Muun_dVgs * T5 - T7 * Em_dVgs ;
3803       Mu_dT = Muun_dT * T5 + Muun * T5_dT ;
3804 
3805 /*  end_of_mobility : */
3806 
3807      /*-----------------------------------------------------------*
3808       * Ids: channel current.
3809       *-----------------*/
3810       betaWL = here->HSMHV2_weff_nf * beta_inv / Lch ;
3811       T1 = - betaWL / Lch ;
3812       betaWL_dVbs = T1 * Lch_dVbs ;
3813       betaWL_dVds = T1 * Lch_dVds ;
3814       betaWL_dVgs = T1 * Lch_dVgs ;
3815       betaWL_dT = here->HSMHV2_weff_nf * ( beta_inv_dT * Lch - beta_inv * Lch_dT ) / ( Lch * Lch ) ;
3816 
3817       Ids0 = betaWL * Idd * Mu ;
3818       T1 = betaWL * Idd ;
3819       T2 = Idd * Mu ;
3820       T3 = Mu * betaWL ;
3821       Ids0_dVbs = T3 * Idd_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ;
3822       Ids0_dVds = T3 * Idd_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ;
3823       Ids0_dVgs = T3 * Idd_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ;
3824       Ids0_dT = T3 * Idd_dT + T1 * Mu_dT + T2 * betaWL_dT ;
3825 
3826      /*-----------------------------------------------------------*
3827       * Adding parasitic components to the channel current.
3828       *-----------------*/
3829       if( model->HSMHV2_ptl != 0 ){
3830         T1 =  0.5 * ( Vds - Pds ) ;
3831         Fn_SymAdd( T6 , T1 , 0.01 , T2 ) ;
3832         T2 *= 0.5 ;
3833         T6_dVb = T2 * ( - Pds_dVbs ) ;
3834         T6_dVd = T2 * ( 1.0 - Pds_dVds ) ;
3835         T6_dVg = T2 * ( - Pds_dVgs ) ;
3836         T6_dT = T2 * ( - Pds_dT ) ;
3837 
3838         T1     = 1.1 - ( Ps0 + T6 );
3839         T1_dVb =     - ( Ps0_dVbs + T6_dVb );
3840         T1_dVd =     - ( Ps0_dVds + T6_dVd );
3841         T1_dVg =     - ( Ps0_dVgs + T6_dVg );
3842         T1_dT =     - ( Ps0_dT + T6_dT );
3843 
3844         Fn_SZ( T2 , T1 , 0.05 , T0 ) ;
3845         T2 += small ;
3846         T2_dVb = T1_dVb * T0 ;
3847         T2_dVd = T1_dVd * T0 ;
3848         T2_dVg = T1_dVg * T0 ;
3849         T2_dT = T1_dT * T0 ;
3850 
3851         T0 = beta * here->HSMHV2_ptl0 ;
3852         T0_dT = beta_dT * here->HSMHV2_ptl0 ;
3853         T3 = Cox * T0 ;
3854         T3_dVb = Cox_dVb * T0 ;
3855         T3_dVd = Cox_dVd * T0 ;
3856         T3_dVg = Cox_dVg * T0 ;
3857         T3_dT = Cox_dT * T0 + Cox * T0_dT ;
3858         T0 = pow( T2 , model->HSMHV2_ptp ) ;
3859         T9     = T3 * T0 ;
3860         T9_dVb = T3 * model->HSMHV2_ptp * T0 / T2 * T2_dVb + T3_dVb * T0 ;
3861         T9_dVd = T3 * model->HSMHV2_ptp * T0 / T2 * T2_dVd + T3_dVd * T0 ;
3862         T9_dVg = T3 * model->HSMHV2_ptp * T0 / T2 * T2_dVg + T3_dVg * T0 ;
3863         T9_dT = T3 * model->HSMHV2_ptp * T0 / T2 * T2_dT + T3_dT * T0 ;
3864 
3865 
3866         T4 = 1.0 + Vdsz * model->HSMHV2_pt2 ;
3867         T4_dVb = Vdsz_dVbs * model->HSMHV2_pt2 ;
3868         T4_dVd = Vdsz_dVds * model->HSMHV2_pt2 ;
3869         T4_dVg = 0.0 ;
3870         T4_dT = Vdsz_dT * model->HSMHV2_pt2 ;
3871 
3872         T0 = here->HSMHV2_pt40 ;
3873         T5 = Ps0 + T6 - Vbsz ;
3874         T5_dVb = Ps0_dVbs + T6_dVb - Vbsz_dVbs ;
3875         T5_dVd = Ps0_dVds + T6_dVd - Vbsz_dVds ;
3876         T5_dVg = Ps0_dVgs + T6_dVg ;
3877         T5_dT = Ps0_dT + T6_dT - Vbsz_dT ;
3878         T4 += Vdsz * T0 * T5 ;
3879         T4_dVb += Vdsz * T0 * T5_dVb + Vdsz_dVbs * T0 * T5 ;
3880         T4_dVd += Vdsz * T0 * T5_dVd + Vdsz_dVds * T0 * T5 ;
3881         T4_dVg += Vdsz * T0 * T5_dVg ;
3882         T4_dT += Vdsz * T0 * T5_dT + Vdsz_dT * T0 * T5 ;
3883 
3884         T6     = T9     * T4 ;
3885         T9_dVb = T9_dVb * T4 + T9 * T4_dVb ;
3886         T9_dVd = T9_dVd * T4 + T9 * T4_dVd ;
3887         T9_dVg = T9_dVg * T4 + T9 * T4_dVg ;
3888         T9_dT = T9_dT * T4 + T9 * T4_dT ;
3889         T9     = T6 ;
3890 
3891       }else{
3892         T9 = 0.0 ;
3893         T9_dVb = 0.0 ;
3894         T9_dVd = 0.0 ;
3895         T9_dVg = 0.0 ;
3896         T9_dT = 0.0 ;
3897       }
3898 
3899 
3900       if( model->HSMHV2_gdl != 0 ){
3901         T1 = beta * here->HSMHV2_gdl0 ;
3902         T1_dT = beta_dT * here->HSMHV2_gdl0 ;
3903         T2 = Cox * T1 ;
3904         T2_dVb = Cox_dVb * T1 ;
3905         T2_dVd = Cox_dVd * T1 ;
3906         T2_dVg = Cox_dVg * T1 ;
3907         T2_dT = Cox_dT * T1 + Cox * T1_dT ;
3908         T8     = T2 * Vdsz ;
3909         T8_dVb = T2_dVb * Vdsz + T2 * Vdsz_dVbs ;
3910         T8_dVd = T2_dVd * Vdsz + T2 * Vdsz_dVds ;
3911         T8_dVg = T2_dVg * Vdsz ;
3912         T8_dT = T2_dT * Vdsz + T2 * Vdsz_dT ;
3913       }else{
3914         T8 = 0.0 ;
3915         T8_dVb = 0.0 ;
3916         T8_dVd = 0.0 ;
3917         T8_dVg = 0.0 ;
3918         T8_dT = 0.0 ;
3919       }
3920 
3921       if ( ( T9 + T8 ) > 0.0 ) {
3922         Idd1 = Pds * ( T9 + T8 ) ;
3923         Idd1_dVbs = Pds_dVbs * ( T9 + T8 ) + Pds * ( T9_dVb + T8_dVb ) ;
3924         Idd1_dVds = Pds_dVds * ( T9 + T8 ) + Pds * ( T9_dVd + T8_dVd ) ;
3925         Idd1_dVgs = Pds_dVgs * ( T9 + T8 ) + Pds * ( T9_dVg + T8_dVg ) ;
3926         Idd1_dT = Pds_dT * ( T9 + T8 ) + Pds * ( T9_dT + T8_dT ) ;
3927 
3928         Ids0 += betaWL * Idd1 * Mu ;
3929         T1 = betaWL * Idd1 ;
3930         T2 = Idd1 * Mu ;
3931         T3 = Mu * betaWL ;
3932         Ids0_dVbs += T3 * Idd1_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ;
3933         Ids0_dVds += T3 * Idd1_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ;
3934         Ids0_dVgs += T3 * Idd1_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ;
3935         Ids0_dT += T3 * Idd1_dT + T1 * Mu_dT + T2 * betaWL_dT ;
3936       }
3937       /* note: rpock procedure was removed. */
3938       if( flg_rsrd == 2 || flg_rsrd == 3 ){
3939         if( model->HSMHV2_rd20 > 0.0 ){
3940           T4 = here->HSMHV2_rd23 ;
3941           T1 = pParam->HSMHV2_rd24 * ( Vgse - model->HSMHV2_rd25 ) ;
3942           T1_dVg = pParam->HSMHV2_rd24 ;
3943 
3944           Fn_SL( T2 , T1 , T4 , delta_rd , T0 ) ;
3945           T2_dVg = T1_dVg * T0 ;
3946           T3 = T4 * ( model->HSMHV2_rd20 + 1.0 ) ;
3947           Fn_SU( T7 , T2 , T3 , delta_rd , T0 ) ;
3948           T7_dVg = T2_dVg * T0 ;
3949 
3950         }else{
3951           T7 = here->HSMHV2_rd23;
3952           T7_dVg = 0.0e0 ;
3953         }
3954 
3955        /* after testing we can remove Vdse_eff_dVbs, Vdse_eff_dVds, Vdse_eff_dVgs
3956          and Vdse_eff_dVbse, Vdse_eff_dVgse                                      */
3957         if (Vdse >= 0.0) {
3958           Vdse_eff = Vdse ;
3959          /* Vdse_eff_dVbs  = 0.0 ; */
3960          /* Vdse_eff_dVds  = 0.0 ; */
3961          /* Vdse_eff_dVgs  = 0.0 ; */
3962          /* Vdse_eff_dVbse = 0.0 ; */
3963           Vdse_eff_dVdse = 1.0 ;
3964          /* Vdse_eff_dVgse = 0.0 ; */
3965         } else {
3966           Vdse_eff = 0.0 ;
3967          /* Vdse_eff_dVbs  = 0.0 ; */
3968          /* Vdse_eff_dVds  = 0.0 ; */
3969          /* Vdse_eff_dVgs  = 0.0 ; */
3970          /* Vdse_eff_dVbse = 0.0 ; */
3971           Vdse_eff_dVdse = 0.0 ;
3972          /* Vdse_eff_dVgse = 0.0 ; */
3973         }
3974 
3975        /* smoothing of Ra for Vdse_eff close to zero */
3976        /* ... smoothing parameter is Ra_N            */
3977         if (Vdse_eff < Ra_N * small2) {
3978           Ra_alpha = pow( Ra_N+1.0 , model->HSMHV2_rd21-1.0 )
3979                      * (Ra_N+1.0-0.5*model->HSMHV2_rd21*Ra_N)
3980                      * pow( small2,model->HSMHV2_rd21 );
3981           Ra_beta = 0.5*model->HSMHV2_rd21
3982                     * pow( Ra_N+1.0 , model->HSMHV2_rd21-1.0 ) / Ra_N
3983                     * pow( small2, model->HSMHV2_rd21-2.0 );
3984           T1 = Ra_alpha + Ra_beta*Vdse_eff*Vdse_eff;
3985           T1_dVdse_eff = 2.0 * Ra_beta * Vdse_eff;
3986         } else {
3987           T1           = pow( Vdse_eff + small2 , model->HSMHV2_rd21 ) ;
3988           T1_dVdse_eff = model->HSMHV2_rd21 * pow( Vdse_eff + small2 , model->HSMHV2_rd21 - 1.0 ) ;
3989         }
3990 
3991         T9           = pow( Vdse_eff + small2 , model->HSMHV2_rd22d ) ;
3992         T9_dVdse_eff = model->HSMHV2_rd22d * pow( Vdse_eff + small2 , model->HSMHV2_rd22d - 1.0 ) ;
3993 
3994         Ra           = ( T7 * T1 + Vbse * pParam->HSMHV2_rd22 * T9 ) / here->HSMHV2_weff_nf ;
3995         Ra_dVdse_eff = ( T7 * T1_dVdse_eff + Vbse * pParam->HSMHV2_rd22 * T9_dVdse_eff ) / here->HSMHV2_weff_nf ;
3996         Ra_dVbs      =  Ra_dVdse_eff * Vdse_eff_dVbs ;
3997         Ra_dVds      =  Ra_dVdse_eff * Vdse_eff_dVds ;
3998         Ra_dVgs      =  Ra_dVdse_eff * Vdse_eff_dVgs  + T7_dVg * T1 / here->HSMHV2_weff_nf ;
3999         Ra_dVbse     =  Ra_dVdse_eff * Vdse_eff_dVbse + pParam->HSMHV2_rd22 * T9 / here->HSMHV2_weff_nf ;
4000         Ra_dVdse     =  Ra_dVdse_eff * Vdse_eff_dVdse ;
4001         Ra_dVgse     =  Ra_dVdse_eff * Vdse_eff_dVgse ;
4002 
4003         T0 = Ra * Ids0 ;
4004         T0_dVb = Ra_dVbs * Ids0 + Ra * Ids0_dVbs ;
4005         T0_dVd = Ra_dVds * Ids0 + Ra * Ids0_dVds ;
4006         T0_dVg = Ra_dVgs * Ids0 + Ra * Ids0_dVgs ;
4007         T0_dT  =                  Ra * Ids0_dT ;
4008 
4009         T1 = Vds + small2 ;
4010         T2 = 1.0 / T1 ;
4011         T3 = 1.0 + T0 * T2 ;
4012         T3_dVb = T0_dVb * T2 ;
4013         T3_dVd = ( T0_dVd * T1 - T0 ) * T2 * T2 ;
4014         T3_dVg = T0_dVg  * T2 ;
4015         T3_dT = T0_dT * T2 ;
4016 
4017         T4 = 1.0 / T3 ;
4018         Ids = Ids0 * T4 ;
4019         T5 = T4 * T4 ;
4020         Ids_dVbs = ( Ids0_dVbs * T3 - Ids0 * T3_dVb ) * T5 ;
4021         Ids_dVds = ( Ids0_dVds * T3 - Ids0 * T3_dVd ) * T5 ;
4022         Ids_dVgs = ( Ids0_dVgs * T3 - Ids0 * T3_dVg ) * T5 ;
4023         Ids_dT = ( Ids0_dT * T3 - Ids0 * T3_dT ) * T5 ;
4024         Ids_dRa = - Ids * Ids / ( Vds + small ) ;
4025 
4026       } else {
4027         Ids = Ids0 ;
4028         Ids_dVbs = Ids0_dVbs ;
4029         Ids_dVds = Ids0_dVds ;
4030         Ids_dVgs = Ids0_dVgs ;
4031         Ids_dT = Ids0_dT ;
4032         Ra = 0.0 ;
4033         Ra_dVbs = Ra_dVds = Ra_dVgs = 0.0 ;
4034         Ra_dVbse = Ra_dVdse = Ra_dVgse = 0.0 ;
4035         Ids_dRa = 0.0 ;
4036       }
4037      /* just for testing  -- can be removed */
4038      /* if (!(ckt->CKTmode & MODEINITPRED))
4039        printf("rrb %e %e %e %e %e %e\n",ckt->CKTtime,here->HSMHV2_mode*Vdse,Ra,Ra_dVdse,
4040                                        Vdse_eff,Vdse_eff_dVdse) ; */
4041 
4042      /* if ( Pds < ps_conv ) { */
4043       if ( Pds < 0.0 ) {
4044         Ids_dVbs = 0.0 ;
4045         Ids_dVgs = 0.0 ;
4046         Ids_dT = 0.0 ;
4047       }
4048 
4049       Ids += Gdsmin * Vds ;
4050       Ids_dVds += Gdsmin ;
4051 
4052 
4053      /*-----------------------------------------------------------*
4054       * STI
4055       *-----------------*/
4056       if ( model->HSMHV2_coisti != 0 ) {
4057         /*---------------------------------------------------*
4058          * dVthSCSTI : Short-channel effect induced by Vds (STI).
4059          *-----------------*/
4060         T1 = C_ESI * Cox_inv ;
4061         T2 = here->HSMHV2_wdpl ;
4062         T3 =  here->HSMHV2_lgatesm - model->HSMHV2_parl2 ;
4063         T4 = 1.0 / (T3 * T3) ;
4064         T5 = 2.0 * (model->HSMHV2_vbi - Pb20b) * T1 * T2 * T4 ;
4065 
4066         dVth0 = T5 * sqrt_Pbsum ;
4067         T6 = T5 * 0.5 / sqrt_Pbsum ;
4068         T7 = 2.0 * (model->HSMHV2_vbi - Pb20b) * C_ESI * T2 * T4 * sqrt_Pbsum ;
4069         T8 = - 2.0 * T1 * T2 * T4 * sqrt_Pbsum ;
4070         dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
4071         dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
4072         dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
4073         dVth0_dT = T6 * Pbsum_dT + T8 * Pb20b_dT ;
4074 
4075         T4 = pParam->HSMHV2_scsti1 ;
4076         T6 = pParam->HSMHV2_scsti2 ;
4077         T1  = T4 + T6 * Vdsz ;
4078         dVthSCSTI = dVth0 * T1 ;
4079         dVthSCSTI_dVb = dVth0_dVb * T1 + dVth0 * T6 * Vdsz_dVbs ;
4080         dVthSCSTI_dVd = dVth0_dVd * T1 + dVth0 * T6 * Vdsz_dVds ;
4081         dVthSCSTI_dVg = dVth0_dVg * T1 ;
4082         dVthSCSTI_dT  = dVth0_dT * T1  + dVth0 * T6 * Vdsz_dT ;
4083 
4084         T1 = pParam->HSMHV2_vthsti - model->HSMHV2_vdsti * Vds ;
4085         T1_dVd = - model->HSMHV2_vdsti ;
4086 
4087         Vgssti = Vgsz - Vfb + T1 + dVthSCSTI ;
4088         Vgssti_dVbs = Vgsz_dVbs + dVthSCSTI_dVb ;
4089         Vgssti_dVds = Vgsz_dVds + T1_dVd + dVthSCSTI_dVd ;
4090         Vgssti_dVgs = Vgsz_dVgs + dVthSCSTI_dVg ;
4091         Vgssti_dT   = Vgsz_dT   + dVthSCSTI_dT ;
4092 
4093         costi0 = here->HSMHV2_costi0 ;
4094         costi1 = here->HSMHV2_costi1 ;
4095 
4096         costi3 = here->HSMHV2_costi0_p2 * Cox_inv * Cox_inv ;
4097         T1 = 2.0 * here->HSMHV2_costi0_p2 * Cox_inv ;
4098         costi3_dVb = T1 * Cox_inv_dVb ;
4099         costi3_dVd = T1 * Cox_inv_dVd ;
4100         costi3_dVg = T1 * Cox_inv_dVg ;
4101         costi3_dT = 2 * here->HSMHV2_costi0 * here->HSMHV2_costi00 * 0.5 / sqrt(here->HSMHV2_beta_inv) * beta_inv_dT * Cox_inv * Cox_inv ;
4102         T2 = 1.0 / costi3 ;
4103         costi3_dVb_c3 = costi3_dVb * T2 ;
4104         costi3_dVd_c3 = costi3_dVd * T2 ;
4105         costi3_dVg_c3 = costi3_dVg * T2 ;
4106         costi3_dT_c3 = costi3_dT * T2 ;
4107 
4108         costi4 = costi3 * beta * 0.5 ;
4109         costi4_dT = ( costi3_dT * beta + costi3 * beta_dT ) * 0.5 ;
4110         costi5 = costi4 * beta * 2.0 ;
4111         costi5_dT = ( costi4_dT * beta + costi4 * beta_dT ) * 2.0 ;
4112 
4113         T11 = beta * 0.25 ;
4114         T11_dT = beta_dT * 0.25 ;
4115         T10 = beta_inv - costi3 * T11 + Vfb - pParam->HSMHV2_vthsti - dVthSCSTI + small ;
4116         T10_dVb = - T11 * costi3_dVb - dVthSCSTI_dVb ;
4117         T10_dVd = - T11 * costi3_dVd - dVthSCSTI_dVd ;
4118         T10_dVg = - T11 * costi3_dVg - dVthSCSTI_dVg ;
4119         T10_dT = beta_inv_dT - ( costi3_dT * T11 + costi3 * T11_dT ) - dVthSCSTI_dT ;
4120 
4121         T1 = Vgsz - T10 - psisti_dlt ;
4122         T1_dVb = Vgsz_dVbs - T10_dVb ;
4123         T1_dVd = Vgsz_dVds - T10_dVd ;
4124         T1_dVg = Vgsz_dVgs - T10_dVg ;
4125         T1_dT = Vgsz_dT - T10_dT ;
4126         T0 = Fn_Sgn(T10) ;
4127         T2 = sqrt (T1 * T1 + T0 * 4.0 * T10 * psisti_dlt) ;
4128         T3 = T10 + 0.5 * (T1 + T2) - Vfb + pParam->HSMHV2_vthsti + dVthSCSTI - Vbsz ;
4129         T3_dVb = T10_dVb + 0.5 * (T1_dVb + (T1 * T1_dVb + T0 * 2.0 * T10_dVb * psisti_dlt) / T2)
4130           + dVthSCSTI_dVb - Vbsz_dVbs ;
4131         T3_dVd = T10_dVd + 0.5 * (T1_dVd + (T1 * T1_dVd + T0 * 2.0 * T10_dVd * psisti_dlt) / T2)
4132           + dVthSCSTI_dVd - Vbsz_dVds ;
4133         T3_dVg = T10_dVg + 0.5 * (T1_dVg + (T1 * T1_dVg + T0 * 2.0 * T10_dVg * psisti_dlt) / T2)
4134           + dVthSCSTI_dVg ;
4135         T3_dT = T10_dT + 0.5 * (T1_dT + (T1 * T1_dT + T0 * 2.0 * T10_dT * psisti_dlt) / T2)
4136           + dVthSCSTI_dT  - Vbsz_dT ;
4137 
4138         T4 = beta * T3 - 1.0 ;
4139         T4_dT = beta_dT * T3 + beta * T3_dT ;
4140         T5 = 4.0 / costi5 ;
4141         T5_dT = - 4.0 / ( costi5 * costi5 ) * costi5_dT ;
4142         T1 = 1.0 + T4 * T5 ;
4143         T6 = beta * T5 ;
4144         T7 = T4 * T5 ;
4145         T1_dVb = (T6 * T3_dVb - T7 * costi3_dVb_c3) ;
4146         T1_dVd = (T6 * T3_dVd - T7 * costi3_dVd_c3) ;
4147         T1_dVg = (T6 * T3_dVg - T7 * costi3_dVg_c3) ;
4148         T1_dT = T4_dT * T5 + T4 * T5_dT ;
4149         Fn_SZ( T1 , T1, 1.0e-2, T2) ;
4150         T1 += small ;
4151         T1_dVb *= T2 ;
4152         T1_dVd *= T2 ;
4153         T1_dVg *= T2 ;
4154         T1_dT *= T2 ;
4155         costi6 = sqrt(T1) ;
4156         costi6_dT = 0.5 / sqrt(T1) * T1_dT ;
4157         T0 = costi4 * (1.0 - costi6) ;
4158         T0_dT = costi4_dT * (1.0 - costi6) + costi4 * ( - costi6_dT ) ;
4159         Psasti = Vgssti + T0 ;
4160         T2 = 0.5 * costi4 / costi6 ;
4161         Psasti_dVbs = Vgssti_dVbs + costi3_dVb_c3 * T0 - T2 * T1_dVb ;
4162         Psasti_dVds = Vgssti_dVds + costi3_dVd_c3 * T0 - T2 * T1_dVd ;
4163         Psasti_dVgs = Vgssti_dVgs + costi3_dVg_c3 * T0 - T2 * T1_dVg ;
4164         Psasti_dT = Vgssti_dT + T0_dT ;
4165 
4166         T0 = 1.0 / (beta + 2.0 / (Vgssti + small)) ;
4167         T0_dT = - 1.0 / ((beta + 2.0 / (Vgssti + small)) * (beta + 2.0 / (Vgssti + small))) * ( beta_dT - 2 / ((Vgssti + small) * (Vgssti + small)) * Vgssti_dT );
4168         Psbsti = log (1.0 / costi1 / costi3 * (Vgssti * Vgssti)) * T0 ;
4169         T1 = 1 / costi1 / costi3 * (Vgssti * Vgssti) ;
4170 
4171         costi1_dT = 2 * here->HSMHV2_nin * Nin_dT * here->HSMHV2_nsti_p2 ;
4172 
4173         T1_dT = ( - 1 / costi1 / costi1 * costi1_dT / costi3 - 1 / costi3 / costi3 * costi3_dT / costi1 ) * Vgssti * Vgssti + 1 / costi1 / costi3 * 2 * Vgssti * Vgssti_dT ;
4174         T2 = 2.0 * T0 / (Vgssti + small) ;
4175         T3 = Psbsti / (Vgssti + small) ;
4176         Psbsti_dVbs = T2 * (Vgssti_dVbs - 0.5 * costi3_dVb_c3 * Vgssti
4177                                 + T3 * Vgssti_dVbs ) ;
4178         Psbsti_dVds = T2 * (Vgssti_dVds - 0.5 * costi3_dVd_c3 * Vgssti
4179                                 + T3 * Vgssti_dVds ) ;
4180         Psbsti_dVgs = T2 * (Vgssti_dVgs - 0.5 * costi3_dVg_c3 * Vgssti
4181                                 + T3 * Vgssti_dVgs ) ;
4182         Psbsti_dT = 1 / T1 * T1_dT * T0 + log( T1 ) * T0_dT ;
4183 
4184         Psab = Psbsti - Psasti - sti2_dlt ;
4185         Psab_dVbs = Psbsti_dVbs - Psasti_dVbs ;
4186         Psab_dVds = Psbsti_dVds - Psasti_dVds ;
4187         Psab_dVgs = Psbsti_dVgs - Psasti_dVgs ;
4188         Psab_dT = Psbsti_dT - Psasti_dT ;
4189         T0 = sqrt (Psab * Psab + 4.0 * sti2_dlt * Psbsti) ;
4190         Psti = Psbsti - 0.5 * (Psab + T0) ;
4191         T1 = 1.0 / T0 ;
4192         Psti_dVbs = Psbsti_dVbs
4193           - 0.5 * ( Psab_dVbs
4194                 + ( Psab * Psab_dVbs + 2.0 * sti2_dlt * Psbsti_dVbs ) * T1 ) ;
4195         Psti_dVds = Psbsti_dVds
4196           - 0.5 * ( Psab_dVds
4197                 + ( Psab * Psab_dVds + 2.0 * sti2_dlt * Psbsti_dVds ) * T1 ) ;
4198         Psti_dVgs = Psbsti_dVgs
4199           - 0.5 * ( Psab_dVgs
4200                 + ( Psab * Psab_dVgs + 2.0 * sti2_dlt * Psbsti_dVgs ) * T1 ) ;
4201         Psti_dT = Psbsti_dT
4202           - 0.5 * ( Psab_dT
4203                 + ( Psab * Psab_dT + 2.0 * sti2_dlt * Psbsti_dT ) * T1 ) ;
4204 
4205         T0 = costi1 * exp (beta * Psti) ;
4206         T0_dT = costi1_dT * exp(beta * Psti) + costi1 * exp(beta * Psti) * ( beta_dT * Psti + beta * Psti_dT ) ;
4207         T1 = beta * (Psti - Vbsz) - 1.0 + T0 ;
4208         T1_dVb = beta * ((Psti_dVbs - Vbsz_dVbs) + T0 * Psti_dVbs) ;
4209         T1_dVd = beta * ((Psti_dVds - Vbsz_dVds) + T0 * Psti_dVds) ;
4210         T1_dVg = beta * (Psti_dVgs + T0 * Psti_dVgs) ;
4211         T1_dT = beta_dT * (Psti - Vbsz) + beta * (Psti_dT - Vbsz_dT) + T0_dT ;
4212         Fn_SZ ( T1 , T1, 1.0e-2, T0) ;
4213         T1 += small ;
4214         T1_dVb *= T0 ;
4215         T1_dVd *= T0 ;
4216         T1_dVg *= T0 ;
4217         T1_dT *= T0 ;
4218         sq1sti = sqrt (T1);
4219         T2 = 0.5 / sq1sti ;
4220         sq1sti_dVbs = T2 * T1_dVb ;
4221         sq1sti_dVds = T2 * T1_dVd ;
4222         sq1sti_dVgs = T2 * T1_dVg ;
4223         sq1sti_dT = T2 * T1_dT ;
4224 
4225         T1 = beta * (Psti - Vbsz) - 1.0;
4226         T1_dVb = beta * (Psti_dVbs - Vbsz_dVbs) ;
4227         T1_dVd = beta * (Psti_dVds - Vbsz_dVds) ;
4228         T1_dVg = beta * Psti_dVgs ;
4229         T1_dT = beta_dT * ( Psti - Vbsz ) + beta * (Psti_dT - Vbsz_dT) ;
4230         Fn_SZ( T1 , T1, 1.0e-2, T0) ;
4231         T1 += small ;
4232         T1_dVb *= T0 ;
4233         T1_dVd *= T0 ;
4234         T1_dVg *= T0 ;
4235         T1_dT *= T0 ;
4236         sq2sti = sqrt (T1);
4237         T2 = 0.5 / sq2sti ;
4238         sq2sti_dVbs = T2 * T1_dVb ;
4239         sq2sti_dVds = T2 * T1_dVd ;
4240         sq2sti_dVgs = T2 * T1_dVg ;
4241         sq2sti_dT = T2 * T1_dT ;
4242 
4243         Qn0sti = costi0 * (sq1sti - sq2sti) ;
4244         Qn0sti_dVbs = costi0 * (sq1sti_dVbs - sq2sti_dVbs) ;
4245         Qn0sti_dVds = costi0 * (sq1sti_dVds - sq2sti_dVds) ;
4246         Qn0sti_dVgs = costi0 * (sq1sti_dVgs - sq2sti_dVgs) ;
4247         Qn0sti_dT = costi0 * (sq1sti_dT - sq2sti_dT) + here->HSMHV2_costi00 * 0.5 / sqrt( here->HSMHV2_beta_inv ) * beta_inv_dT * (sq1sti - sq2sti) ;
4248 
4249        /* T1: Vdsatsti */
4250         T1 = Psasti - Psti ;
4251         T1_dVb = Psasti_dVbs - Psti_dVbs ;
4252         T1_dVd = Psasti_dVds - Psti_dVds ;
4253         T1_dVg = Psasti_dVgs - Psti_dVgs ;
4254         T1_dT = Psasti_dT - Psti_dT ;
4255 
4256         Fn_SZ( T1 , T1 , 1.0e-1 , T2 ) ;
4257         T1 += small ;
4258         T1_dVb *= T2 ;
4259         T1_dVd *= T2 ;
4260         T1_dVg *= T2 ;
4261         T1_dT *= T2 ;
4262 
4263         TX = Vds / T1 ;
4264         T2 = 1.0 / ( T1 * T1 ) ;
4265         TX_dVbs = T2 * ( - Vds * T1_dVb ) ;
4266         TX_dVds = T2 * ( T1 - Vds * T1_dVd ) ;
4267         TX_dVgs = T2 * ( - Vds * T1_dVg ) ;
4268         TX_dT = T2 * ( - Vds * T1_dT ) ;
4269 
4270         Fn_CP( TY , TX , 1.0 , 4 , T2 ) ;
4271         TY_dVbs = T2 * TX_dVbs ;
4272         TY_dVds = T2 * TX_dVds ;
4273         TY_dVgs = T2 * TX_dVgs ;
4274         TY_dT = T2 * TX_dT ;
4275 
4276         costi7 = 2.0 * here->HSMHV2_wsti * here->HSMHV2_nf * beta_inv ;
4277         costi7_dT = 2.0 * here->HSMHV2_wsti * here->HSMHV2_nf * beta_inv_dT ;
4278         T1 = Lch ;
4279         Idssti = costi7 * Mu * Qn0sti * TY / T1 ;
4280         T3 = 1.0 / T1 ;
4281         T4 = Mu * Qn0sti * TY / T1 / T1 ;
4282         T5 = Mu * Qn0sti ;
4283         Idssti_dVbs = costi7 * (((Mu_dVbs * Qn0sti + Mu * Qn0sti_dVbs) * TY
4284                                +  T5 * TY_dVbs ) * T3
4285                               - Lch_dVbs * T4 ) ;
4286         Idssti_dVds = costi7 * (((Mu_dVds * Qn0sti + Mu * Qn0sti_dVds) * TY
4287                                +  T5 * TY_dVds ) * T3
4288                               - Lch_dVds * T4 ) ;
4289         Idssti_dVgs = costi7 * (((Mu_dVgs * Qn0sti + Mu * Qn0sti_dVgs) * TY
4290                                +  T5 * TY_dVgs ) * T3
4291                               - Lch_dVgs * T4 ) ;
4292         Idssti_dT = costi7 * (((Mu_dT * Qn0sti + Mu * Qn0sti_dT) * TY
4293                                +  T5 * TY_dT ) * T3
4294                               - Lch_dT * T4 ) + costi7_dT * Mu * Qn0sti * TY / T1 ;
4295 
4296         Ids = Ids + Idssti ;
4297         Ids_dVbs = Ids_dVbs + Idssti_dVbs ;
4298         Ids_dVds = Ids_dVds + Idssti_dVds ;
4299         Ids_dVgs = Ids_dVgs + Idssti_dVgs ;
4300         Ids_dT  = Ids_dT  + Idssti_dT ;
4301 
4302       }
4303 
4304      /*----------------------------------------------------------*
4305       * induced gate noise. ( Part 1/3 )
4306       *----------------------*/
4307       if ( model->HSMHV2_coign != 0 && model->HSMHV2_cothrml != 0 && model->HSMHV2_codep==0 ) {
4308         kusai00 = VgVt * VgVt ;
4309         kusaidd = 2.0e0 * beta_inv * Cox_inv * Idd ;
4310         kusaiL = kusai00 - kusaidd ;
4311         Fn_SZ( kusai00 , kusai00 , 1.0e-3 , T0 ) ;
4312         kusai00 += small ;
4313         Fn_SZ( kusaiL , kusaiL , 1.0e-3 , T0 ) ;
4314         kusaiL  += small ;
4315         kusai00L = kusai00 - kusaiL ;
4316         if ( Qn0 < epsm10 || kusai00L < epsm10 ) flg_ign = 0 ;
4317         else flg_ign = 1 ;
4318       }
4319 
4320      /*-----------------------------------------------------------*
4321       * End of PART-1. (label)
4322       *-----------------*/
4323  end_of_part_1:
4324 
4325 
4326      /*-----------------------------------------------------------*
4327       * Implicit quantities related to Alpha.
4328       *-----------------*/
4329       if ( flg_noqi == 0 && VgVt > VgVt_small ) {
4330         Delta = fac1 * beta / ( 2 * Xi0p12 ) ;
4331         Pslsat = VgVt / ( 1.0 + Delta ) + Ps0 ;
4332       } else {
4333         Pslsat = 0.0 ;
4334       }
4335       Vdsat = Pslsat - Pb2 ;
4336       if ( Vdsat < 0.0 ) {
4337         Vdsat = 0.0 ;
4338       }
4339 
4340      // Qiu for noise calc.
4341       Qiu_noi = Qiu ;
4342 
4343     }  // end of normal mode MOSFET
4344 
4345    /*----------------------------------------------------------*
4346     * Evaluate integrated charges in unit [C].
4347     *----------------------*/
4348 
4349     T1 = - here->HSMHV2_weffcv_nf * Leff ;
4350 
4351     Qb = T1 * Qbu ;
4352     Qb_dVbs = T1 * Qbu_dVbs ;
4353     Qb_dVds = T1 * Qbu_dVds ;
4354     Qb_dVgs = T1 * Qbu_dVgs ;
4355     Qb_dT  = T1 * Qbu_dT ;
4356 
4357     Qi = T1 * Qiu ;
4358     Qi_dVbs = T1 * Qiu_dVbs ;
4359     Qi_dVds = T1 * Qiu_dVds ;
4360     Qi_dVgs = T1 * Qiu_dVgs ;
4361     Qi_dT  = T1 * Qiu_dT ;
4362 
4363     Qd = Qi * Qdrat ;
4364     Qd_dVbs = Qi_dVbs * Qdrat + Qi * Qdrat_dVbs ;
4365     Qd_dVds = Qi_dVds * Qdrat + Qi * Qdrat_dVds ;
4366     Qd_dVgs = Qi_dVgs * Qdrat + Qi * Qdrat_dVgs ;
4367     Qd_dT  = Qi_dT * Qdrat + Qi * Qdrat_dT ;
4368 
4369     // Qiu for noise calc.
4370     Qi_noi = T1*Qiu_noi ;
4371 
4372 
4373     /*-----------------------------------------------------------*
4374      * Modified potential for symmetry.
4375      *-----------------*/
4376     T1 =  ( Vds - Pds ) / 2 ;
4377     Fn_SymAdd( Pzadd , T1 , model->HSMHV2_pzadd0 , T2 ) ;
4378     T2 /= 2 ;
4379     Pzadd_dVbs = T2 * ( - Pds_dVbs ) ;
4380     Pzadd_dVds = T2 * ( 1.0 - Pds_dVds ) ;
4381     Pzadd_dVgs = T2 * ( - Pds_dVgs ) ;
4382     Pzadd_dT = T2 * ( -Pds_dT );
4383 
4384 
4385     if ( Pzadd  < epsm10 ) {
4386       Pzadd = epsm10 ;
4387       Pzadd_dVbs = 0.0 ;
4388       Pzadd_dVds = 0.0 ;
4389       Pzadd_dVgs = 0.0 ;
4390       Pzadd_dT = 0.0 ;
4391     }
4392 
4393     Ps0z = Ps0 + Pzadd ;
4394     Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ;
4395     Ps0z_dVds = Ps0_dVds + Pzadd_dVds ;
4396     Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ;
4397     Ps0z_dT = Ps0_dT + Pzadd_dT ;
4398 
4399 
4400     /*-----------------------------------------------------------*
4401      * Channel leakage current.
4402      *-----------------*/
4403 
4404     Ids += Weff/Leff * model->HSMHV2_gdsleak * Vds ;
4405     Ids_dVds += Weff/Leff * model->HSMHV2_gdsleak ;
4406 
4407 
4408   /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4409    * PART-2: Substrate / gate / leak currents
4410    *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
4411 
4412   /*-----------------------------------------------------------*
4413    * Isub : substrate current induced by impact ionization.
4414    *-----------------*/
4415 
4416   if ( model->HSMHV2_coisub == 0 ) {
4417    /* Accumulation zone or nonconductive case, in which Ids==0. */
4418     Isub = 0.0e0 ;
4419     Isub_dVbs = Isub_dVds = Isub_dVgs = 0.0e0 ;
4420     Isub_dT = 0.0;
4421   } else {
4422    /*-------------------------------------------*
4423     * Conductive case.
4424     *-----------------*/
4425     if ( pParam->HSMHV2_sub1 > 0.0e0 && pParam->HSMHV2_vmax > 0.0e0 ) {
4426       T0 = here->HSMHV2_vg2const ;
4427       T1 = T0 * Vgp ;
4428       T1_dVd = T0 * Vgp_dVds ;
4429       T1_dVg = T0 * Vgp_dVgs ;
4430       T1_dVb = T0 * Vgp_dVbs ;
4431       T1_dT  = T0 * Vgp_dT   ;
4432 
4433       T7 = Cox0 * Cox0 ;
4434       T8 = here->HSMHV2_qnsub_esi ;
4435       T3 = T8 / T7 ;
4436 
4437       T9 = 2.0 / T8 ;
4438       T4 = T9 * T7 ;
4439 
4440       T2 = here->HSMHV2_xvbs ;
4441       T5 = T1 - beta_inv - T2 * Vbsz ;
4442       T5_dVd = T1_dVd - T2 * Vbsz_dVds;
4443       T5_dVg = T1_dVg ;
4444       T5_dVb = T1_dVb - T2 * Vbsz_dVbs;
4445       T5_dT  = - beta_inv_dT + T1_dT  - T2 * Vbsz_dT ;
4446 
4447       T6 = 1.0 + T4 * T5 ;
4448       T6_dVd = T4 * T5_dVd ;
4449       T6_dVg = T4 * T5_dVg ;
4450       T6_dVb = T4 * T5_dVb ;
4451       T6_dT = T4 * T5_dT ;
4452       Fn_SZ( T6 , T6, 1.0e-3, T9) ;
4453       T6 += small ;
4454       T6_dVd *= T9 ;
4455       T6_dVg *= T9 ;
4456       T6_dVb *= T9 ;
4457       T6_dT *= T9 ;
4458       T6 = sqrt( T6 ) ;
4459       T9 = 0.5 / T6 ;
4460       T6_dVd = T9 * T6_dVd ;
4461       T6_dVg = T9 * T6_dVg ;
4462       T6_dVb = T9 * T6_dVb ;
4463       T6_dT = T9 * T6_dT ;
4464 
4465       Psislsat = T1 + T3 * ( 1.0 - T6 ) ;
4466       Psislsat_dVd = T1_dVd - T3 * T6_dVd ;
4467       Psislsat_dVg = T1_dVg - T3 * T6_dVg ;
4468       Psislsat_dVb = T1_dVb - T3 * T6_dVb ;
4469       Psislsat_dT  = T1_dT  - T3 * T6_dT ;
4470 
4471       T2 = here->HSMHV2_lgate / (here->HSMHV2_xgate + here->HSMHV2_lgate) ;
4472 
4473       Psisubsat = pParam->HSMHV2_svds * Vdsz + Ps0z - T2 * Psislsat ;
4474       Psisubsat_dVd = pParam->HSMHV2_svds * Vdsz_dVds + Ps0z_dVds - T2 * Psislsat_dVd ;
4475       Psisubsat_dVg = Ps0z_dVgs - T2 * Psislsat_dVg ;
4476       Psisubsat_dVb =  pParam->HSMHV2_svds * Vdsz_dVbs + Ps0z_dVbs - T2 * Psislsat_dVb ;
4477       Psisubsat_dT  =  pParam->HSMHV2_svds * Vdsz_dT   + Ps0z_dT   - T2 * Psislsat_dT  ;
4478       Fn_SZ( Psisubsat , Psisubsat, 1.0e-3, T9 ) ;
4479       Psisubsat += small ;
4480       Psisubsat_dVd *= T9 ;
4481       Psisubsat_dVg *= T9 ;
4482       Psisubsat_dVb *= T9 ;
4483       Psisubsat_dT *= T9 ;
4484 
4485       T5 = here->HSMHV2_xsub1 ;
4486       T6 = here->HSMHV2_xsub2 ;
4487       T2 = exp( - T6 / Psisubsat ) ;
4488       T3 = T2 * T6 / ( Psisubsat * Psisubsat ) ;
4489       T2_dVd = T3 * Psisubsat_dVd ;
4490       T2_dVg = T3 * Psisubsat_dVg ;
4491       T2_dVb = T3 * Psisubsat_dVb ;
4492       T2_dT = T3 * Psisubsat_dT ;
4493 
4494       Isub = T5 * Psisubsat * Ids * T2 ;
4495       Isub_dVds =  T5 * ( Psisubsat_dVd * Ids * T2
4496                         + Psisubsat * Ids_dVds * T2
4497                         + Psisubsat * Ids * T2_dVd ) ;
4498       Isub_dVgs =  T5 * ( Psisubsat_dVg * Ids * T2
4499                         + Psisubsat * Ids_dVgs * T2
4500                         + Psisubsat * Ids * T2_dVg ) ;
4501       Isub_dVbs =  T5 * ( Psisubsat_dVb * Ids * T2
4502                         + Psisubsat * Ids_dVbs * T2
4503                         + Psisubsat * Ids * T2_dVb ) ;
4504       Isub_dT =  T5 * ( Psisubsat_dT * Ids * T2
4505                         + Psisubsat * Ids_dT * T2
4506                         + Psisubsat * Ids * T2_dT ) ;
4507 
4508     } else {
4509       Isub = 0.0e0 ;
4510       Isub_dVbs = Isub_dVds = Isub_dVgs = 0.0e0 ;
4511       Isub_dT  = 0.0e0 ;
4512     } /* end of if ( pParam->HSMHV2_sub1 ... ) else block. */
4513 
4514     /*---------------------------------------------------*
4515      * Impact-Ionization Current in the Drift Region
4516      *-----------------*/
4517     T8 = here->HSMHV2_subld1 ;
4518     if ( T8 != 0.0 ) {
4519       T0 = Vddp ;
4520       T0_dVb = 0.0e0 ;
4521       T0_dVd = 0.0e0 ;
4522       T0_dVg = 0.0e0 ;
4523       T0_dT =  0.0e0   ;
4524       T0_dVddp = 1.0e0 ;
4525 
4526       Fn_SZ( T0, T0, 1e-6, T1 ) ;
4527       T0_dVb *= T1 ;
4528       T0_dVd *= T1 ;
4529       T0_dVg *= T1 ;
4530       T0_dT  *= T1 ;
4531       T0_dVddp *= T1 ;
4532 
4533       T1 = sqrt( VgVt + small  ) ;
4534       T3 = 1.0 / ( 2.0 * T1 ) ;
4535       T1_dVb = VgVt_dVbs * T3  ;
4536       T1_dVd = VgVt_dVds * T3  ;
4537       T1_dVg = VgVt_dVgs * T3  ;
4538       T1_dT  = VgVt_dT * T3  ;
4539 
4540       T4 = T0 - model->HSMHV2_xpvdth * ( 1.0 + model->HSMHV2_xpvdthg * Vgs ) ;
4541       T4_dVb = T0_dVb ;
4542       T4_dVd = T0_dVd ;
4543       T4_dVg = T0_dVg - model->HSMHV2_xpvdth * model->HSMHV2_xpvdthg ;
4544       T4_dT = T0_dT ;
4545       T4_dVddp = T0_dVddp ;
4546 
4547       Fn_SZ( T4, T4, 1.0e-2, T9 ) ;
4548       T4 += small ;
4549       T4_dVb *= T9 ;
4550       T4_dVd *= T9 ;
4551       T4_dVg *= T9 ;
4552       T4_dT *= T9 ;
4553       T4_dVddp *= T9 ;
4554 
4555       T10 = here->HSMHV2_xpdv * model->HSMHV2_xldld * exp( - 1.0e0 / T4 ) ;
4556       T11 = T10 * ( 1.0 + 1.0 / T4 ) ;
4557       T3 = T4 * T10 ;
4558       T3_dVb = T4_dVb * T11 ;
4559       T3_dVd = T4_dVd * T11 ;
4560       T3_dVg = T4_dVg * T11 ;
4561       T3_dT  = T4_dT  * T11 ;
4562       T3_dVddp = T4_dVddp * T11 ;
4563 
4564       T0 = T0 - T3 ;
4565       T0_dVb = T0_dVb - T3_dVb ;
4566       T0_dVd = T0_dVd - T3_dVd ;
4567       T0_dVg = T0_dVg - T3_dVg ;
4568       T0_dT = T0_dT - T3_dT ;
4569       T0_dVddp = T0_dVddp - T3_dVddp ;
4570 
4571       Fn_SZ( T0, T0, 1.0e-2 , T9 ) ;
4572       T0 += small;
4573       T0_dVb *= T9 ;
4574       T0_dVd *= T9 ;
4575       T0_dVg *= T9 ;
4576       T0_dT *= T9 ;
4577       T0_dVddp *= T9 ;
4578 
4579       T4 = 1.0 / ( T0 * T1 ) ;
4580       T7 = Ldrift0 * modelMKS->HSMHV2_subld2 ;
4581       T2= exp( - T7 * T4 );
4582       T6 = T7 * T2 * T4 * T4 ;
4583       T2_dVb = ( T0_dVb * T1 + T0 * T1_dVb ) * T6  ;
4584       T2_dVd = ( T0_dVd * T1 + T0 * T1_dVd ) * T6  ;
4585       T2_dVg = ( T0_dVg * T1 + T0 * T1_dVg ) * T6  ;
4586       T2_dT = ( T0_dT * T1 + T0 * T1_dT ) * T6  ;
4587       T2_dVddp = T0_dVddp * T1 * T6 ;
4588 
4589       IsubLD = T8 * Ids * T0 * T2 ;
4590       IsubLD_dVbs = T8 * ( Ids_dVbs * T0 * T2 + Ids * T0_dVb * T2 + Ids * T0 * T2_dVb ) ;
4591       IsubLD_dVds = T8 * ( Ids_dVds * T0 * T2 + Ids * T0_dVd * T2 + Ids * T0 * T2_dVd ) ;
4592       IsubLD_dVgs = T8 * ( Ids_dVgs * T0 * T2 + Ids * T0_dVg * T2 + Ids * T0 * T2_dVg ) ;
4593       IsubLD_dT = T8 * ( Ids_dT * T0 * T2 + Ids * T0_dT * T2 + Ids * T0 * T2_dT ) ;
4594       IsubLD_dVddp = T8 * Ids * (T0_dVddp * T2 + T0 * T2_dVddp ) ;
4595     }
4596 
4597   }
4598 
4599 
4600     /*---------------------------------------------------*
4601      * Impact-Ionization Induced Bulk Potential Change (IBPC)
4602      *-----------------*/
4603   if ( (Isub + IsubLD) > 0e0 && here->HSMHV2_ibpc1 != 0e0 && model->HSMHV2_codep==0 ) {
4604 
4605     /* delta Vbs */
4606     T0 = 1e0 + pParam->HSMHV2_ibpc2 * dVth ;
4607     T1 = Isub + IsubLD ;
4608     dVbsIBPC = here->HSMHV2_ibpc1 * T0 * T1 ;
4609     dVbsIBPC_dVbs = here->HSMHV2_ibpc1 * ( pParam->HSMHV2_ibpc2 * dVth_dVb * T1 + T0 * ( Isub_dVbs + IsubLD_dVbs ) ) ;
4610     dVbsIBPC_dVds = here->HSMHV2_ibpc1 * ( pParam->HSMHV2_ibpc2 * dVth_dVd * T1 + T0 * ( Isub_dVds + IsubLD_dVds ) ) ;
4611     dVbsIBPC_dVgs = here->HSMHV2_ibpc1 * ( pParam->HSMHV2_ibpc2 * dVth_dVg * T1 + T0 * ( Isub_dVgs + IsubLD_dVgs ) ) ;
4612     dVbsIBPC_dT   = here->HSMHV2_ibpc1 * ( pParam->HSMHV2_ibpc2 * dVth_dT  * T1 + T0 * ( Isub_dT   + IsubLD_dT ) ) ;
4613     dVbsIBPC_dVddp = here->HSMHV2_ibpc1 * T0 * IsubLD_dVddp ;
4614 
4615     /* dG3 & dG4 */
4616     T10 = 1e0 / Xi0 ;
4617     T10_dT = - T10 / Xi0 * Xi0_dT ;
4618     T1 = beta * dVbsIBPC * T10 ;
4619     T11 = T10 * T10;
4620     T1_dVb = beta * ( dVbsIBPC_dVbs * Xi0 - dVbsIBPC * Xi0_dVbs ) * T11 ;
4621     T1_dVd = beta * ( dVbsIBPC_dVds * Xi0 - dVbsIBPC * Xi0_dVds ) * T11 ;
4622     T1_dVg = beta * ( dVbsIBPC_dVgs * Xi0 - dVbsIBPC * Xi0_dVgs ) * T11 ;
4623     T1_dT = beta_dT * dVbsIBPC * T10 + beta * dVbsIBPC_dT * T10 + beta * dVbsIBPC * T10_dT ;
4624     T1_dVddp = beta * dVbsIBPC_dVddp * T10 ;
4625 
4626 
4627     T10 = 1e0 / Xil ;
4628     T10_dT = - T10 / Xil * Xil_dT ;
4629     T2 = beta * dVbsIBPC * T10 ;
4630     T11 = T10 * T10;
4631     T2_dVb = beta * ( dVbsIBPC_dVbs * Xil - dVbsIBPC * Xil_dVbs ) * T11 ;
4632     T2_dVd = beta * ( dVbsIBPC_dVds * Xil - dVbsIBPC * Xil_dVds ) * T11 ;
4633     T2_dVg = beta * ( dVbsIBPC_dVgs * Xil - dVbsIBPC * Xil_dVgs ) * T11 ;
4634     T2_dT = beta_dT * dVbsIBPC * T10 + beta * dVbsIBPC_dT * T10 + beta * dVbsIBPC * T10_dT ;
4635     T2_dVddp = beta * dVbsIBPC_dVddp * T10 ;
4636 
4637 
4638     dG3 = cnst0 * ( Xilp32 * T2 - Xi0p32 * T1 ) ;
4639     dG3_dVbs = cnst0 * ( Xilp32_dVbs * T2 + Xilp32 * T2_dVb - Xi0p32_dVbs * T1 - Xi0p32 * T1_dVb ) ;
4640     dG3_dVds = cnst0 * ( Xilp32_dVds * T2 + Xilp32 * T2_dVd - Xi0p32_dVds * T1 - Xi0p32 * T1_dVd ) ;
4641     dG3_dVgs = cnst0 * ( Xilp32_dVgs * T2 + Xilp32 * T2_dVg - Xi0p32_dVgs * T1 - Xi0p32 * T1_dVg ) ;
4642     dG3_dT =  cnst0 * ( Xilp32_dT * T2 + Xilp32 * T2_dT - Xi0p32_dT * T1 - Xi0p32 * T1_dT )
4643       + cnst0_dT * ( Xilp32 * T2 - Xi0p32 * T1 ) ;
4644     dG3_dVddp = cnst0 * ( Xilp32 * T2_dVddp - Xi0p32 * T1_dVddp ) ;
4645 
4646     dG4 = cnst0 * 0.5 * ( - Xilp12 * T2 + Xi0p12 * T1 ) ;
4647     dG4_dVbs = cnst0 * 0.5 * ( - Xilp12_dVbs * T2 - Xilp12 * T2_dVb + Xi0p12_dVbs * T1 + Xi0p12 * T1_dVb ) ;
4648     dG4_dVds = cnst0 * 0.5 * ( - Xilp12_dVds * T2 - Xilp12 * T2_dVd + Xi0p12_dVds * T1 + Xi0p12 * T1_dVd ) ;
4649     dG4_dVgs = cnst0 * 0.5 * ( - Xilp12_dVgs * T2 - Xilp12 * T2_dVg + Xi0p12_dVgs * T1 + Xi0p12 * T1_dVg ) ;
4650     dG4_dT   = cnst0 * 0.5 * ( - Xilp12_dT   * T2 - Xilp12 * T2_dT  + Xi0p12_dT   * T1 + Xi0p12 * T1_dT  )
4651       + cnst0_dT *0.5 *  ( - Xilp12 * T2 + Xi0p12 * T1 ) ;
4652     dG4_dVddp = cnst0 * 0.5 * ( - Xilp12 * T2_dVddp + Xi0p12 * T1_dVddp ) ;
4653 
4654     /* Add IBPC current into Ids */
4655     dIdd = dG3 + dG4 ;
4656     dIdd_dVbs = dG3_dVbs + dG4_dVbs ;
4657     dIdd_dVds = dG3_dVds + dG4_dVds ;
4658     dIdd_dVgs = dG3_dVgs + dG4_dVgs ;
4659     dIdd_dT = dG3_dT + dG4_dT ;
4660     dIdd_dVddp = dG3_dVddp + dG4_dVddp ;
4661 
4662     IdsIBPC = betaWL * dIdd * Mu ;
4663     IdsIBPC_dVbs = betaWL * ( Mu * dIdd_dVbs + dIdd * Mu_dVbs ) + betaWL_dVbs * Mu * dIdd ;
4664     IdsIBPC_dVds = betaWL * ( Mu * dIdd_dVds + dIdd * Mu_dVds ) + betaWL_dVds * Mu * dIdd ;
4665     IdsIBPC_dVgs = betaWL * ( Mu * dIdd_dVgs + dIdd * Mu_dVgs ) + betaWL_dVgs * Mu * dIdd ;
4666     IdsIBPC_dT  = betaWL * ( Mu * dIdd_dT   + dIdd * Mu_dT   ) + betaWL_dT   * Mu * dIdd ;
4667     IdsIBPC_dVddp = betaWL * dIdd_dVddp * Mu ;
4668 
4669   } /* End if (IBPC) */
4670 
4671   T3 = 1 / TTEMP ;
4672   T0 =- model->HSMHV2_igtemp2 * T3 * T3
4673           - 2 * model->HSMHV2_igtemp3 * T3 * T3 * T3   ;
4674   Egp12_dT = 0.5 * T0 / Egp12;
4675   Egp32_dT = 1.5 * T0 * Egp12;
4676 
4677   /*-----------------------------------------------------------*
4678    * Igate : Gate current induced by tunneling.
4679    *-----------------*/
4680   if ( model->HSMHV2_coiigs != 0 ) {
4681     /* Igate */
4682     if ( flg_noqi == 0 ) {
4683       Psdlz = Ps0z + Vdsz - epsm10 ;
4684       Psdlz_dVbs = Ps0z_dVbs + Vdsz_dVbs ;
4685       Psdlz_dVds = Ps0z_dVds + Vdsz_dVds ;
4686       Psdlz_dVgs = Ps0z_dVgs ;
4687       Psdlz_dT   = Ps0z_dT ;
4688 
4689       T1 = Vgsz - Vfb + modelMKS->HSMHV2_gleak4 * (dVth - dPpg) * Leff - Psdlz * pParam->HSMHV2_gleak3 ;
4690       T3 = modelMKS->HSMHV2_gleak4 * Leff ;
4691       T1_dVg = Vgsz_dVgs + T3 * (dVth_dVg - dPpg_dVg) - Psdlz_dVgs * pParam->HSMHV2_gleak3 ;
4692       T1_dVd = Vgsz_dVds + T3 * (dVth_dVd - dPpg_dVd)  - Psdlz_dVds * pParam->HSMHV2_gleak3 ;
4693       T1_dVb = Vgsz_dVbs + T3 * ( dVth_dVb - dPpg_dVb )  - Psdlz_dVbs * pParam->HSMHV2_gleak3 ;
4694       T1_dT  = Vgsz_dT   + T3 * ( dVth_dT - dPpg_dT )  - Psdlz_dT * pParam->HSMHV2_gleak3 ;
4695 
4696       T3 = 2.0 * T1 ;
4697       T1_dVg = T3 * T1_dVg ;
4698       T1_dVd = T3 * T1_dVd ;
4699       T1_dVb = T3 * T1_dVb ;
4700       T1_dT = T3 * T1_dT ;
4701       T1 *= T1 ;
4702 
4703       T3 = 1.0 / Tox0 ;
4704       T2 = T1 * T3 ;
4705       T2_dVg = (T1_dVg ) * T3 ;
4706       T2_dVd = (T1_dVd ) * T3 ;
4707       T2_dVb = (T1_dVb ) * T3 ;
4708       T2_dT = T1_dT * T3 ;
4709 
4710       T3 = 1.0 / modelMKS->HSMHV2_gleak5 ;
4711       T7 = 1.0 + Ey * T3 ;
4712       T7_dVg = Ey_dVgs * T3 ;
4713       T7_dVd = Ey_dVds * T3 ;
4714       T7_dVb = Ey_dVbs * T3 ;
4715       T7_dT = Ey_dT * T3 ;
4716 
4717       Etun = T2 * T7 ;
4718       Etun_dVgs = T2_dVg * T7 + T7_dVg * T2 ;
4719       Etun_dVds = T2_dVd * T7 + T7_dVd * T2 ;
4720       Etun_dVbs = T2_dVb * T7 + T7_dVb * T2 ;
4721       Etun_dT = T2_dT * T7 + T7_dT * T2 ;
4722 
4723       Fn_SZ( Etun , Etun , igate_dlt , T5 ) ;
4724       Etun_dVgs *= T5 ;
4725       Etun_dVds *= T5 ;
4726       Etun_dVbs *= T5 ;
4727       Etun_dT *= T5 ;
4728 
4729       Fn_SZ( T3 , Vgsz , 1.0e-3 , T4 ) ;
4730       T3 -= model->HSMHV2_vzadd0 ;
4731       T3_dVb = 0.5 * (Vgsz_dVbs + Vgsz * Vgsz_dVbs/TMF2);
4732       TX = T3 / cclmmdf ;
4733       TX_dVbs = T3_dVb / cclmmdf ;
4734       T2 = 1.0 +  TX * TX ;
4735       T2_dVb = 2 * TX_dVbs * TX ;
4736       T1 = 1.0 - 1.0 / T2 ;
4737       T1_dVb = T2_dVb / T2 / T2 ;
4738       T1_dVg = 2.0 * TX * T4 / ( T2 * T2 * cclmmdf ) ;
4739       T1_dVd = T1_dVg * Vgsz_dVds ;
4740       Etun_dVgs = T1 * Etun_dVgs + Etun * T1_dVg ;
4741       Etun_dVds = T1 * Etun_dVds + Etun * T1_dVd ;
4742       Etun_dVbs = Etun_dVbs * T1 + Etun * T1_dVb ;
4743       Etun_dT *= T1 ;
4744       Etun *= T1 ;
4745 
4746       T0 = Leff * here->HSMHV2_weff_nf ;
4747       T7 = modelMKS->HSMHV2_gleak7 / (modelMKS->HSMHV2_gleak7 + T0) ;
4748 
4749       T6 = pParam->HSMHV2_gleak6 ;
4750       T9 = T6 / (T6 + Vdsz) ;
4751       T9_dVb = - T9 / (T6 + Vdsz) * Vdsz_dVbs ;
4752       T9_dVd = - T9 / (T6 + Vdsz) * Vdsz_dVds ;
4753 
4754       T4 = 1 / (Etun + small ) ;
4755       T1 = - pParam->HSMHV2_gleak2 * Egp32 * T4 ;
4756       T3 =  pParam->HSMHV2_gleak2 * T4 * T4;
4757       T1_dT =  T3 * (Egp32 * Etun_dT  - Egp32_dT * (Etun + small ))  ;
4758 
4759       if ( T1 < - EXP_THR ) {
4760         Igate = 0.0 ;
4761         Igate_dVbs = Igate_dVds = Igate_dVgs = Igate_dT = 0.0 ;
4762       } else {
4763         T2 = exp ( T1 ) ;
4764         T2_dT = T1_dT * T2 ;
4765 
4766         T3 = pParam->HSMHV2_gleak1 / Egp12 * C_QE * T0 ;
4767         T3_dT = - Egp12_dT * pParam->HSMHV2_gleak1 / Egp12 / Egp12 * C_QE * T0 ;
4768 
4769 	T5 = 1 / cnst0 ;
4770 	T6 =  sqrt ((Qiu + Cox0 * VgVt_small )* T5 ) ;
4771 	T6_dT = ( ( ( cnst0 * Qiu_dT - cnst0_dT * ( Qiu + Cox0 * VgVt_small ) ) * T5 * T5 ) ) / T6 * 0.5 ;
4772         T4 =  T2 * T3 * T6 ;
4773         T4_dT =  T2_dT * T3 * T6 + T2 * T3_dT * T6 +  T2 * T3 * T6_dT;
4774         T5 = T4 * Etun ;
4775         T6 = 0.5 * Etun / (Qiu + Cox0 * VgVt_small ) ;
4776         T10 = T5 * Etun ;
4777         T10_dVb = T5 * (2.0 * Etun_dVbs - T1 * Etun_dVbs + T6 * Qiu_dVbs) ;
4778         T10_dVd = T5 * (2.0 * Etun_dVds - T1 * Etun_dVds + T6 * Qiu_dVds) ;
4779         T10_dVg = T5 * (2.0 * Etun_dVgs - T1 * Etun_dVgs + T6 * Qiu_dVgs) ;
4780 	T10_dT = 2 * T5 * Etun_dT + T4_dT * Etun * Etun ;
4781 
4782         Igate = T7 * T9 * T10 ;
4783         Igate_dVbs = T7 * (T9 * T10_dVb + T9_dVb * T10) ;
4784         Igate_dVds = T7 * (T9_dVd * T10 + T9 * T10_dVd) ;
4785         Igate_dVgs = T7 * T9 * T10_dVg ;
4786         Igate_dT = T7 * T9 * T10_dT ;
4787       }
4788     }
4789 
4790     /* Igs */
4791       T0 = - pParam->HSMHV2_glksd2 * Vgs + modelMKS->HSMHV2_glksd3 ;
4792       T2 = exp (Tox0 * T0);
4793       T2_dVg = (- Tox0 * pParam->HSMHV2_glksd2) * T2;
4794 
4795       T0 = Vgs / Tox0 / Tox0 ;
4796       T3 = Vgs * T0 ;
4797       T3_dVg = 2.0 * T0 * (1.0 ) ;
4798       T4 = pParam->HSMHV2_glksd1 / 1.0e6 * here->HSMHV2_weff_nf ;
4799       Igs = T4 * T2 * T3 ;
4800       Igs_dVgs = T4 * (T2_dVg * T3 + T2 * T3_dVg) ;
4801       Igs_dVds = 0.0 ;
4802       Igs_dVbs = 0.0 ;
4803       Igs_dT =   0.0 ;
4804 
4805       if ( Vgs >= 0.0e0 ){
4806         Igs *= -1.0 ;
4807         Igs_dVgs *= -1.0 ;
4808         Igs_dVds *= -1.0 ;
4809         Igs_dVbs *= -1.0 ;
4810       }
4811 
4812 
4813     /* Igd */
4814       T1 = Vgs - Vds ;
4815       T0 = - pParam->HSMHV2_glksd2 * T1 + modelMKS->HSMHV2_glksd3 ;
4816       T2 = exp (Tox0 * T0);
4817       T2_dVg = (- Tox0 * pParam->HSMHV2_glksd2) * T2;
4818       T2_dVd = (+ Tox0 * pParam->HSMHV2_glksd2) * T2;
4819       T2_dVb = 0.0 ;
4820 
4821       T0 = T1 / Tox0 / Tox0 ;
4822       T3 = T1 * T0 ;
4823       T3_dVg = 2.0 * T0 ;
4824       T3_dVd = - 2.0 * T0 ;
4825       T3_dVb = 0.0 ;
4826       T4 = pParam->HSMHV2_glksd1 / 1.0e6 * here->HSMHV2_weff_nf ;
4827       Igd = T4 * T2 * T3 ;
4828       Igd_dVgs = T4 * (T2_dVg * T3 + T2 * T3_dVg) ;
4829       Igd_dVds = T4 * (T2_dVd * T3 + T2 * T3_dVd) ;
4830       Igd_dVbs = 0.0 ;
4831       Igd_dT =   0.0 ;
4832 
4833       if( T1 >= 0.0e0 ){
4834         Igd  *= -1.0 ;
4835         Igd_dVgs *= -1.0 ;
4836         Igd_dVds *= -1.0 ;
4837         Igd_dVbs *= -1.0 ;
4838       }
4839 
4840 
4841     /* Igb */
4842       Etun = ( - ( Vgs - Vbs ) + Vfb + model->HSMHV2_glkb3 ) / Tox0 ;
4843       Etun_dVgs = - 1.0 / Tox0 ;
4844       Etun_dVds = 0.0 ;
4845       Etun_dVbs =   1.0 / Tox0 ;
4846 
4847       Fn_SZ( Etun , Etun, igate_dlt, T5) ;
4848       Etun += small ;
4849       Etun_dVgs *= T5 ;
4850       Etun_dVbs *= T5 ;
4851 
4852       T1 = - pParam->HSMHV2_glkb2 / Etun ;
4853       if ( T1 < - EXP_THR ) {
4854         Igb = 0.0 ;
4855         Igb_dVgs = Igb_dVds = Igb_dVbs = Igb_dT = 0.0 ;
4856       } else {
4857         T2 = exp ( T1 );
4858         T3 =  pParam->HSMHV2_glkb2 / ( Etun * Etun ) * T2 ;
4859         T2_dVg = T3 * Etun_dVgs ;
4860 	T2_dVb = T3 * Etun_dVbs ;
4861 
4862         T3 = pParam->HSMHV2_glkb1 * here->HSMHV2_weff_nf * Leff ;
4863         Igb = T3 * Etun * Etun * T2 ;
4864         Igb_dVgs = T3 * (2.0 * Etun * Etun_dVgs * T2 + Etun * Etun * T2_dVg);
4865         Igb_dVds = 0.0 ;
4866 	Igb_dVbs = T3 * (2.0 * Etun * Etun_dVbs * T2 + Etun * Etun * T2_dVb);
4867 	Igb_dT = 0.0;
4868       }
4869 
4870       /* Ifn: Fowler-Nordheim tunneling current */
4871       Eg12 = here->HSMHV2_sqrt_eg ;
4872       Eg32 = here->HSMHV2_eg * Eg12 ;
4873       T2 = - ( pParam->HSMHV2_fvbs * Vbsz - Vgsz + dVthSC + dVthLP - pParam->HSMHV2_fn3 ) / Tox0 ;
4874       T2_dVd = - ( pParam->HSMHV2_fvbs * Vbsz_dVds - Vgsz_dVds + dVthSC_dVd + dVthLP_dVd
4875                    ) / Tox0 ;
4876       T2_dVg = - ( - Vgsz_dVgs + dVthSC_dVg + dVthLP_dVg
4877                    ) / Tox0 ;
4878       T2_dVb = - ( pParam->HSMHV2_fvbs * Vbsz_dVbs -Vgsz_dVbs + dVthSC_dVb + dVthLP_dVb
4879                    ) / Tox0 ;
4880       T2_dT = - (  pParam->HSMHV2_fvbs * Vbsz_dT   -Vgsz_dT   + dVthSC_dT + dVthLP_dT
4881                    ) / Tox0 ;
4882 
4883       T0 = T2 * T2 ;
4884       T1 = pParam->HSMHV2_fn2 * Eg32 ;
4885       T1_dT = 1.5 * Eg_dT * pParam->HSMHV2_fn2 * Eg12 ;
4886       T3 = - T1 / T2  ;
4887       if ( T3 < - EXP_THR ) {
4888         T5 = 0.0 ;
4889         T5_dVd = T5_dVg = T5_dVb = T5_dT = 0.0 ;
4890 
4891       } else {
4892         T5 = exp( T3 ) ;
4893         T5_dVd = T5 * T1 * T2_dVd / T0 ;
4894         T5_dVg = T5 * T1 * T2_dVg / T0 ;
4895         T5_dVb = T5 * T1 * T2_dVb / T0 ;
4896         T5_dT = T5 * T1 * T2_dT / T0 ;
4897       }
4898 
4899       T4 = C_QE * pParam->HSMHV2_fn1 * here->HSMHV2_weff_nf * here->HSMHV2_lgate / Eg12 ;
4900       T4_dT = (- 0.5) * Eg_dT * T4 / here->HSMHV2_eg ;
4901       if ( 2e0 * T2 + T1 < 0e0 ){
4902         Ifn = 0.25e0 * T4 * T1 * T1 * c_exp_2 ; /* minimum value */
4903         Ifn_dVd = 0e0 ;
4904         Ifn_dVg = 0e0 ;
4905         Ifn_dVb = 0e0 ;
4906         Ifn_dT = 0.25e0 * T4_dT * T1 * T1 * c_exp_2 ;
4907       } else {
4908         Ifn = T4 * T0 * T5 ;
4909         Ifn_dVd = T4 * ( 2.0 * T2 * T2_dVd * T5 + T0 * T5_dVd ) ;
4910         Ifn_dVg = T4 * ( 2.0 * T2 * T2_dVg * T5 + T0 * T5_dVg ) ;
4911         Ifn_dVb = T4 * ( 2.0 * T2 * T2_dVb * T5 + T0 * T5_dVb ) ;
4912         Ifn_dT = T4 * ( 2.0 * T2 * T2_dT * T5 + T0 * T5_dT ) +T4_dT * T0 * T5;
4913       }
4914       Igb -= Ifn ;
4915       Igb_dVbs -= Ifn_dVb ;
4916       Igb_dVds -= Ifn_dVd ;
4917       Igb_dVgs -= Ifn_dVg ;
4918       Igb_dT -= Ifn_dT ;
4919   } /* if ( model->HSMHV2_coiigs == 0 ) */
4920 
4921 
4922   /*-----------------------------------------------------------*
4923    * Vdsp : Vds modification for GIDL/GISL
4924    *-----------------*/
4925   if ( model->HSMHV2_cogidl != 0 ) {
4926     T1 = Vds * (1.0 - gidla * Vds) - gidlvds_dlt ;
4927     T2 = sqrt (T1 * T1 + 4.0 * gidlvds_dlt * Vds) ;
4928     Vdsp = Vds - 0.5 * (T1 + T2) ;
4929     T3 = 1.0 - 2.0 * gidla * Vds ;
4930     Vdsp_dVd = 1.0 - 0.5 * (T3 + (T1 * T3 + 2.0 * gidlvds_dlt) / T2) ;
4931   }
4932 
4933   /*-----------------------------------------------------------*
4934    * Igidl : GIDL
4935    *-----------------*/
4936   if( model->HSMHV2_cogidl == 0 ){
4937     Igidl = 0.0e0 ;
4938     Igidl_dVbs = 0.0e0 ;
4939     Igidl_dVds = 0.0e0 ;
4940     Igidl_dVgs = 0.0e0 ;
4941     Igidl_dT = 0.0e0 ;
4942   } else {
4943     T1 = model->HSMHV2_gidl3 * (Vdsp + model->HSMHV2_gidl4) - Vgs + (dVthSC + dVthLP) * model->HSMHV2_gidl5 ;
4944     T1_dT = (dVthSC_dT + dVthLP_dT) * model->HSMHV2_gidl5 ;
4945     T2 = 1.0 / Tox0 ;
4946     E1 = T1 * T2 ;
4947     E1_dVb = ((model->HSMHV2_gidl5 * (dVthSC_dVb + dVthLP_dVb)) ) * T2 ;
4948     E1_dVd = ((model->HSMHV2_gidl3 * Vdsp_dVd) + model->HSMHV2_gidl5 * (dVthSC_dVd + dVthLP_dVd)) * T2 ;
4949     E1_dVg = (-1.0 + model->HSMHV2_gidl5 * (dVthSC_dVg + dVthLP_dVg) ) * T2 ;
4950     E1_dT = T1_dT * T2 ;
4951 
4952     Fn_SZ( Egidl , E1, eef_dlt, T5) ;
4953     Egidl_dVb = T5 * E1_dVb ;
4954     Egidl_dVd = T5 * E1_dVd ;
4955     Egidl_dVg = T5 * E1_dVg ;
4956     Egidl_dT = T5 * E1_dT ;
4957 
4958     T3 = 1 / (Egidl + small) ;
4959     T0 = - pParam->HSMHV2_gidl2 * Egp32 * T3 ;
4960     T0_dT = - pParam->HSMHV2_gidl2 * T3 *( Egp32_dT - Egidl_dT * T3 * Egp32 )  ;
4961     if ( T0 < - EXP_THR ) {
4962       Igidl = 0.0 ;
4963       Igidl_dVbs = Igidl_dVds = Igidl_dVgs = Igidl_dT = 0.0 ;
4964     } else {
4965       T1 = exp ( T0 ) ;
4966       T1_dT = T0_dT * T1 ;
4967       T2 = pParam->HSMHV2_gidl1 / Egp12 * C_QE * here->HSMHV2_weff_nf ;
4968       T2_dT = - Egp12_dT * pParam->HSMHV2_gidl1 / Egp12 / Egp12 * C_QE * here->HSMHV2_weff_nf ;
4969       Igidl = T2 * Egidl * Egidl * T1 ;
4970       T3 = T2 * T1 * Egidl * (2.0 + pParam->HSMHV2_gidl2 * Egp32 * Egidl / (Egidl + small) / (Egidl + small)) ;
4971       Igidl_dVbs = T3 * Egidl_dVb ;
4972       Igidl_dVds = T3 * Egidl_dVd ;
4973       Igidl_dVgs = T3 * Egidl_dVg ;
4974       Igidl_dT = T2 * T1 * Egidl * 2.0 * Egidl_dT  +  T2 * Egidl * Egidl * T1_dT + T2_dT * Egidl * Egidl * T1;
4975     }
4976 
4977     /* bug-fix */
4978     Vdb = Vds - Vbs ;
4979     if ( Vdb > 0.0 ) {
4980       T2 = Vdb * Vdb ;
4981       T4 = T2 * Vdb ;
4982       T0 = T4 + C_gidl_delta ;
4983       T5 = T4 / T0 ;
4984       T7 = ( 3.0 * T2 * T0 - T4 * 3.0 * T2 ) / ( T0 * T0 ) ; /* == T5_dVdb */
4985       Igidl_dVbs = Igidl_dVbs * T5 + Igidl * T7 * ( - 1.0 ) ; /* Vdb_dVbs = -1 */
4986       Igidl_dVds = Igidl_dVds * T5 + Igidl * T7 * ( + 1.0 ) ; /* Vdb_dVds = +1 */
4987       Igidl_dVgs = Igidl_dVgs * T5 ; /* Vdb_dVgs = 0 */
4988       Igidl_dT =   Igidl_dT   * T5 ; /* Vdb_dT   = 0 */
4989       Igidl *= T5 ;
4990     } else {
4991       Igidl = 0.0 ;
4992       Igidl_dVbs = Igidl_dVds = Igidl_dVgs = Igidl_dT = 0.0 ;
4993     }
4994   }
4995 
4996 
4997   /*-----------------------------------------------------------*
4998    * Igisl : GISL
4999    *-----------------*/
5000   if( model->HSMHV2_cogidl == 0){
5001     Igisl = 0.0e0 ;
5002     Igisl_dVbs = 0.0e0 ;
5003     Igisl_dVds = 0.0e0 ;
5004     Igisl_dVgs = 0.0e0 ;
5005     Igisl_dT = 0.0e0 ;
5006   } else {
5007     T1 = model->HSMHV2_gidl3 * ( - Vdsp + model->HSMHV2_gidl4 )
5008       - ( Vgs - Vdsp ) + ( dVthSC + dVthLP ) * model->HSMHV2_gidl5 ;
5009 
5010     T1_dT = ( dVthSC_dT + dVthLP_dT ) * model->HSMHV2_gidl5 ;
5011     T2 = 1.0 / Tox0 ;
5012     E1 = T1 * T2 ;
5013     E1_dVb = ((model->HSMHV2_gidl5 * (dVthSC_dVb + dVthLP_dVb)) ) * T2 ;
5014     E1_dVd = (((1.0-model->HSMHV2_gidl3 ) * Vdsp_dVd) + model->HSMHV2_gidl5 * (dVthSC_dVd + dVthLP_dVd)) * T2 ;
5015     E1_dVg = (-1.0 + model->HSMHV2_gidl5 * (dVthSC_dVg + dVthLP_dVg) ) * T2 ;
5016     E1_dT = T1_dT * T2 ;
5017 
5018     Fn_SZ( Egisl , E1, eef_dlt, T5) ;
5019     Egisl_dVb = T5 * E1_dVb ;
5020     Egisl_dVd = T5 * E1_dVd ;
5021     Egisl_dVg = T5 * E1_dVg ;
5022     Egisl_dT = T5 * E1_dT ;
5023 
5024     T3 =  1  / (Egisl + small) ;
5025     T0 = - pParam->HSMHV2_gidl2 * Egp32 * T3 ;
5026     T0_dT = - pParam->HSMHV2_gidl2 * T3 * ( Egp32_dT - Egisl_dT * T3 * Egp32 )  ;
5027     if ( T0 < - EXP_THR ) {
5028       Igisl = 0.0 ;
5029       Igisl_dVbs = Igisl_dVds = Igisl_dVgs = Igisl_dT = 0.0 ;
5030     } else {
5031       T1 = exp ( T0 ) ;
5032       T1_dT = T0_dT * T1 ;
5033       T3 = 1 / Egp12 ;
5034       T2 = pParam->HSMHV2_gidl1 * T3 * C_QE * here->HSMHV2_weff_nf ;
5035       T2_dT = - pParam->HSMHV2_gidl1 * Egp12_dT * T3 * T3 * C_QE * here->HSMHV2_weff_nf ;
5036       Igisl = T2 * Egisl * Egisl * T1 ;
5037       T3 = T2 * T1 * Egisl * (2.0 + pParam->HSMHV2_gidl2 * Egp32 * Egisl / (Egisl + small) / (Egisl + small)) ;
5038       Igisl_dVbs = T3 * Egisl_dVb ;
5039       Igisl_dVds = T3 * Egisl_dVd ;
5040       Igisl_dVgs = T3 * Egisl_dVg ;
5041       Igisl_dT = T2 * T1 * Egisl * 2.0 * Egisl_dT + T2_dT * Egisl * Egisl * T1 + T2 * Egisl * Egisl * T1_dT ;
5042     }
5043 
5044     /* bug-fix */
5045     Vsb = - Vbs ;
5046     if ( Vsb > 0.0 ) {
5047       T2 = Vsb * Vsb ;
5048       T4 = T2 * Vsb ;
5049       T0 = T4 + C_gidl_delta ;
5050       T5 = T4 / T0 ;
5051       T7 = ( 3.0 * T2 * T0 - T4 * 3.0 * T2 ) / ( T0 * T0 ) ; /* == T5_dVsb */
5052       Igisl_dVbs = Igisl_dVbs * T5 + Igisl * T7 * ( - 1.0 ) ; /* Vsb_dVbs = -1 */
5053       Igisl_dVds = Igisl_dVds * T5 ; /* Vsb_dVds = 0 */
5054       Igisl_dVgs = Igisl_dVgs * T5 ; /* Vsb_dVgs = 0 */
5055       Igisl_dT =   Igisl_dT   * T5 ; /* Vsb_dT   = 0 */
5056       Igisl *= T5 ;
5057     } else {
5058       Igisl = 0.0 ;
5059       Igisl_dVbs = Igisl_dVds = Igisl_dVgs = Igisl_dT = 0.0 ;
5060     }
5061   }
5062 
5063 
5064   /*-----------------------------------------------------------*
5065    * End of PART-2. (label)
5066    *-----------------*/
5067 /* end_of_part_2: */
5068 
5069 
5070   /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5071    * PART-3: Overlap charge
5072    *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
5073   Aclm = pParam->HSMHV2_clm1 ;
5074   if ( flg_noqi != 0 ) {
5075     /*-------------------------------------------*
5076      * Calculation of Psdl for cases of flg_noqi==1.
5077      *-----------------*/
5078     Psdl = Aclm * (Vds + Ps0) + (1.0e0 - Aclm) * Psl ;
5079     Psdl_dVbs = Aclm * Ps0_dVbs + (1.0e0 - Aclm) * Psl_dVbs ;
5080     Psdl_dVds = Aclm * (1.0e0 + Ps0_dVds) + (1.0e0 - Aclm) * Psl_dVds ;
5081     Psdl_dVgs = Aclm * Ps0_dVgs + (1.0e0 - Aclm) * Psl_dVgs ;
5082     if ( Psdl > Ps0 + Vds - epsm10 ) {
5083       Psdl = Ps0 + Vds - epsm10 ;
5084       Psdl_dVbs = Ps0_dVbs ;
5085       Psdl_dVds = Ps0_dVds + 1.0 ;
5086       Psdl_dVgs = Ps0_dVgs ;
5087     }
5088 
5089     if (model->HSMHV2_xqy !=0) {
5090       Ec = 0.0e0 ;
5091       Ec_dVbs =0.0e0 ;
5092       Ec_dVds =0.0e0 ;
5093       Ec_dVgs =0.0e0 ;
5094       Ec_dT =0.0e0 ;
5095     }
5096   } else {
5097     /* Ec is removed from Lred calc. part */
5098     if (model->HSMHV2_xqy !=0) {
5099       if ( Idd < C_IDD_MIN ) {
5100         Ec = 0.0e0 ;
5101         Ec_dVbs =0.0e0 ;
5102         Ec_dVds =0.0e0 ;
5103         Ec_dVgs =0.0e0 ;
5104       } else {
5105       T1 =  beta_inv / Leff ;
5106       T1_dT = beta_inv_dT / Leff ;
5107       T2 = 1.0 / Qn0 ;
5108       T3 = T2 * T2 ;
5109       Ec = Idd * T1 * T2 ;
5110       Ec_dVbs = T1 * (Idd_dVbs * T2 - Idd * Qn0_dVbs * T3 ) ;
5111       Ec_dVds = T1 * (Idd_dVds * T2 - Idd * Qn0_dVds * T3 ) ;
5112       Ec_dVgs = T1 * (Idd_dVgs * T2 - Idd * Qn0_dVgs * T3 ) ;
5113       Ec_dT = T1 * (Idd_dT * T2 - Idd * Qn0_dT * T3 )
5114             + T1_dT * Idd * T2 ;
5115       }
5116     }
5117   }
5118 
5119   /*-----------------------------------------------------------*
5120    * Overlap charges
5121    *-----------------*/
5122   Coovlps = (int)ModeNML * model->HSMHV2_coovlps + (int)ModeRVS * model->HSMHV2_coovlp ;
5123   Coovlpd = (int)ModeRVS * model->HSMHV2_coovlps + (int)ModeNML * model->HSMHV2_coovlp ;
5124   Lovers = ModeNML * here->HSMHV2_lovers + ModeRVS * here->HSMHV2_loverld ;
5125   Loverd = ModeRVS * here->HSMHV2_lovers + ModeNML * here->HSMHV2_loverld ;
5126   Novers = ModeNML * pParam->HSMHV2_novers + ModeRVS * pParam->HSMHV2_nover ;
5127   Noverd = ModeRVS * pParam->HSMHV2_novers + ModeNML * pParam->HSMHV2_nover ;
5128   CVDSOVER = pParam->HSMHV2_cvdsover ;
5129 
5130   /*---------------------------------------------------*
5131    * Source side (mode-dependent)
5132    *-----------------*/
5133   /*-----------------------------------*
5134   * Constant capacitance model
5135   *-----------------*/
5136   if ( Coovlps == 0 ) {
5137     flg_overgiven = ( (int)ModeNML * model->HSMHV2_cgso_Given
5138                     + (int)ModeRVS * model->HSMHV2_cgdo_Given  ) ;
5139     if ( flg_overgiven ) {
5140       Cgso = ModeNML * pParam->HSMHV2_cgso + ModeRVS * pParam->HSMHV2_cgdo ;
5141       Cgso *= - here->HSMHV2_weffcv_nf ;
5142     } else {
5143       Cgso = - Cox0 * Lovers * here->HSMHV2_weffcv_nf ;
5144     }
5145 
5146     Qgso = - Cgso * Vgse ;
5147     Qgso_dVbse = 0.0 ;
5148     Qgso_dVdse = 0.0 ;
5149     Qgso_dVgse = - Cgso ;
5150 
5151   /*-----------------------------------*
5152    * Simplified model
5153    *-----------------*/
5154   } else { /* Coovlps != 0 begin */
5155     if ( Lovers > 0.0 && Novers == 0.0 ){
5156       cov_slp = modelMKS->HSMHV2_ovslp ;
5157       cov_mag = model->HSMHV2_ovmag ;
5158       T1 = Cox0 * here->HSMHV2_weffcv_nf ;
5159       T4 = cov_slp * T1 * ( cov_mag + Vgs ) ;
5160       T4_dVg = cov_slp * T1 ;
5161       T4_dVd = 0.0 ;
5162       T5 = Lovers * T1 ;
5163       T9 = 1.2e0 - Ps0 ;
5164       Qgos = Vgs * T5 - T4 * T9 ;
5165       Qgos_dVbs =      T4 * Ps0_dVbs ;
5166       Qgos_dVds =      T4 * Ps0_dVds - T9 * T4_dVd ;
5167       Qgos_dVgs = T5 + T4 * Ps0_dVgs - T9 * T4_dVg ;
5168       Qgos_dT  = T4 * Ps0_dT;
5169 
5170   /*-----------------------------------*
5171    * Surface potential model
5172    *------------------------*/
5173   } else if ( Lovers > 0.0 && Novers >= 0.0 ) {
5174 
5175     Vgbgmt = Vgs - Vbs ;
5176     Vgbgmt_dVbs = -1.0 ;
5177     Vgbgmt_dVds = 0.0 ;
5178     Vgbgmt_dVgs = 1.0 ;
5179     Vxbgmt = - Vbs + epsm10 ;
5180     Vxbgmt_dVbs = -1.0 ;
5181     Vxbgmt_dVds = 0.0 ;
5182     Vxbgmt_dVgs = 0.0 ;
5183 
5184     Nover_func = Novers ;
5185     cnst0over_func =    ModeNML * here->HSMHV2_cnst0overs + ModeRVS * here->HSMHV2_cnst0over ;
5186     cnst0over_func_dT = ModeNML * cnst0overs_dT         + ModeRVS * cnst0over_dT ;
5187 
5188 #include "hsmhv2eval_qover.h"
5189 
5190 
5191     if (here->HSMHV2_mode != HiSIM_NORMAL_MODE) {
5192     here->HSMHV2_Ps0LD      = Ps0LD ;
5193     here->HSMHV2_Ps0LD_dVds = - Ps0LD_dVds - Ps0LD_dVgs - Ps0LD_dVbs;
5194     here->HSMHV2_Ps0LD_dVgs = Ps0LD_dVgs ;
5195     here->HSMHV2_Ps0LD_dVbs = Ps0LD_dVbs ;
5196     here->HSMHV2_Ps0LD_dTi  = Ps0LD_dT ;
5197     here->HSMHV2_QbuLD      = QbuLD ;
5198     here->HSMHV2_QbuLD_dVds = - QbuLD_dVds - QbuLD_dVgs - QbuLD_dVbs;
5199     here->HSMHV2_QbuLD_dVgs = QbuLD_dVgs ;
5200     here->HSMHV2_QbuLD_dVbs = QbuLD_dVbs ;
5201     here->HSMHV2_QbuLD_dTi  = QbuLD_dT ;
5202     QosAD = - model->HSMHV2_qovadd * ( Vds - Pds ) ;
5203     T3    =   model->HSMHV2_qovadd ;
5204     QosAD_dVgs =  T3 *  Pds_dVgs ;
5205     QosAD_dVds =  T3 * (Pds_dVds - 1.0) ;
5206     QosAD_dVbs =  T3 *  Pds_dVbs ;
5207     QosAD_dT   =  T3 *  Pds_dT   ;
5208     }else{
5209     QosAD = QosAD_dVgs = QosAD_dVds = QosAD_dVbs = QosAD_dT = 0.0 ;
5210     }
5211 
5212     T4 = here->HSMHV2_weffcv_nf * Lovers * ( 1 - CVDSOVER ) ;
5213 
5214     Qovs =  T4 * ( QsuLD + QosAD ) ;
5215     Qovs_dVbs = T4 * ( QsuLD_dVbs + QosAD_dVbs ) ;
5216     Qovs_dVds = T4 * ( QsuLD_dVds + QosAD_dVds ) ;
5217     Qovs_dVgs = T4 * ( QsuLD_dVgs + QosAD_dVgs ) ;
5218     Qovs_dT   = T4 * ( QsuLD_dT   + QosAD_dT ) ;
5219 
5220     QisLD = T4 * QiuLD ;
5221     QisLD_dVbs = T4 * QiuLD_dVbs ;
5222     QisLD_dVds = T4 * QiuLD_dVds ;
5223     QisLD_dVgs = T4 * QiuLD_dVgs ;
5224     QisLD_dT = T4 * QiuLD_dT     ;
5225 
5226     QbsLD = T4 * ( QbuLD + QosAD ) ;
5227     QbsLD_dVbs = T4 * ( QbuLD_dVbs + QosAD_dVbs ) ;
5228     QbsLD_dVds = T4 * ( QbuLD_dVds + QosAD_dVds ) ;
5229     QbsLD_dVgs = T4 * ( QbuLD_dVgs + QosAD_dVgs ) ;
5230     QbsLD_dT   = T4 * ( QbuLD_dT   + QosAD_dT ) ;
5231 
5232 
5233 
5234     if ( CVDSOVER != 0.0 ) { /* Qovsext begin */
5235       Vgbgmt = Vgse - Vbse ;
5236       Vgbgmt_dVbs = -1.0 ;
5237       Vgbgmt_dVds = 0.0 ;
5238       Vgbgmt_dVgs = 1.0 ;
5239       Vxbgmt = - Vbse + epsm10 ;
5240       Vxbgmt_dVbs = -1.0 ;
5241       Vxbgmt_dVds = 0.0 ;
5242       Vxbgmt_dVgs = 0.0 ;
5243 
5244 #include "hsmhv2eval_qover.h"
5245 
5246       T4 = here->HSMHV2_weffcv_nf * Lovers * CVDSOVER ;
5247       Qovsext =  T4 * QsuLD ;
5248       Qovsext_dVdse = T4 * QsuLD_dVds ;
5249       Qovsext_dVgse = T4 * QsuLD_dVgs ;
5250       Qovsext_dVbse = T4 * QsuLD_dVbs ;
5251       Qovsext_dT   = T4 * QsuLD_dT ;
5252 
5253       QisLDext = T4 * QiuLD ;
5254       QisLDext_dVbse = T4 * QiuLD_dVbs ;
5255       QisLDext_dVdse = T4 * QiuLD_dVds ;
5256       QisLDext_dVgse = T4 * QiuLD_dVgs ;
5257       QisLDext_dT = T4 * QiuLD_dT ;
5258 
5259       QbsLDext = T4 * QbuLD ;
5260       QbsLDext_dVbse = T4 * QbuLD_dVbs ;
5261       QbsLDext_dVdse = T4 * QbuLD_dVds ;
5262       QbsLDext_dVgse = T4 * QbuLD_dVgs ;
5263       QbsLDext_dT = T4 * QbuLD_dT ;
5264 
5265     } /* Qovsext end */
5266 
5267   }
5268 
5269     /*-----------------------------------*
5270      * Additional constant capacitance model
5271      *-----------------*/
5272     flg_overgiven = ( (int)ModeNML * model->HSMHV2_cgso_Given
5273 	             + (int)ModeRVS * model->HSMHV2_cgdo_Given  ) ;
5274     if ( flg_overgiven ) {
5275       Cgso  = ModeNML * pParam->HSMHV2_cgso + ModeRVS * pParam->HSMHV2_cgdo ;
5276       Cgso *= - here->HSMHV2_weffcv_nf ;
5277     }
5278     Qgso = - Cgso * Vgse ;
5279     Qgso_dVbse = 0.0 ;
5280     Qgso_dVdse = 0.0 ;
5281     Qgso_dVgse = - Cgso ;
5282   } /* Coovlps != 0 end */
5283 
5284   /*---------------------------------------------------*
5285    * Drain side (mode-dependent)
5286    *-----------------*/
5287   /*-----------------------------------*
5288   * Constant capacitance model
5289   *-----------------*/
5290   if ( Coovlpd == 0 ) {
5291     flg_overgiven = ( (int)ModeRVS * model->HSMHV2_cgso_Given
5292                     + (int)ModeNML * model->HSMHV2_cgdo_Given  ) ;
5293     if ( flg_overgiven ) {
5294       Cgdo = ModeRVS * pParam->HSMHV2_cgso + ModeNML * pParam->HSMHV2_cgdo ;
5295       Cgdo *= - here->HSMHV2_weffcv_nf ;
5296     } else {
5297       Cgdo = - Cox0 * Loverd * here->HSMHV2_weffcv_nf ;
5298     }
5299 
5300     Qgdo = - Cgdo * (Vgse - Vdse) ;
5301     Qgdo_dVbse = 0.0 ;
5302     Qgdo_dVdse = Cgdo ;
5303     Qgdo_dVgse = - Cgdo ;
5304 
5305   /*-----------------------------------*
5306    * Simplified model
5307    *-----------------*/
5308   } else { /* Coovlpd != 0 begin */
5309     if ( Loverd > 0.0 && Noverd == 0.0 ){
5310       cov_slp = modelMKS->HSMHV2_ovslp ;
5311       cov_mag = model->HSMHV2_ovmag ;
5312       T1 = Cox0 * here->HSMHV2_weffcv_nf ;
5313       T4 = cov_slp * T1 * ( cov_mag + Vgs - Vds ) ;
5314 	  T4_dVg = cov_slp * T1 ;
5315 	  T4_dVd = - cov_slp * T1 ;
5316 	  T5 = Loverd * T1 ;
5317 	  T9 = 1.2e0 + Vds - Psl ;
5318 	  Qgod = ( Vgs - Vds ) * T5 - T4 * T9 ;
5319           Qgod_dVbs =      + T4 * Psl_dVbs ;
5320           Qgod_dVds = - T5 + T4 * ( -1.0 + Psl_dVds ) - T9 * T4_dVd ;
5321           Qgod_dVgs = + T5 + T4 * Psl_dVgs - T9 * T4_dVg ;
5322           Qgod_dT  = T4 * Psl_dT;
5323 
5324 
5325   /*-----------------------------------*
5326    * Surface potential model
5327    *------------------------*/
5328   } else if ( Loverd > 0.0 && Noverd >= 0.0 ) {
5329 
5330     Vgbgmt = Vgs - Vbs ;
5331     Vgbgmt_dVbs = -1.0 ;
5332     Vgbgmt_dVds = 0.0 ;
5333     Vgbgmt_dVgs = 1.0 ;
5334     Vxbgmt = Vds - Vbs + epsm10 ;
5335     Vxbgmt_dVbs = -1.0 ;
5336     Vxbgmt_dVds = 1.0 ;
5337     Vxbgmt_dVgs = 0.0 ;
5338 
5339     Nover_func = Noverd ;
5340     cnst0over_func =    ModeNML * here->HSMHV2_cnst0over + ModeRVS * here->HSMHV2_cnst0overs ;
5341     cnst0over_func_dT = ModeNML * cnst0over_dT         + ModeRVS * cnst0overs_dT ;
5342 
5343 #include "hsmhv2eval_qover.h"
5344 
5345 
5346     if (here->HSMHV2_mode == HiSIM_NORMAL_MODE) {
5347     here->HSMHV2_Ps0LD      = Ps0LD ;
5348     here->HSMHV2_Ps0LD_dVds = Ps0LD_dVds ;
5349     here->HSMHV2_Ps0LD_dVgs = Ps0LD_dVgs ;
5350     here->HSMHV2_Ps0LD_dVbs = Ps0LD_dVbs ;
5351     here->HSMHV2_Ps0LD_dTi  = Ps0LD_dT ;
5352     here->HSMHV2_QbuLD      = QbuLD ;
5353     here->HSMHV2_QbuLD_dVds = QbuLD_dVds ;
5354     here->HSMHV2_QbuLD_dVgs = QbuLD_dVgs ;
5355     here->HSMHV2_QbuLD_dVbs = QbuLD_dVbs ;
5356     here->HSMHV2_QbuLD_dTi  = QbuLD_dT ;
5357     QodAD =   model->HSMHV2_qovadd * ( Vds - Pds ) ;
5358     T3    = - model->HSMHV2_qovadd ;
5359     QodAD_dVgs =  T3 *  Pds_dVgs ;
5360     QodAD_dVds =  T3 * (Pds_dVds - 1.0) ;
5361     QodAD_dVbs =  T3 *  Pds_dVbs ;
5362     QodAD_dT   =  T3 *  Pds_dT ;
5363     }else{
5364     QodAD = QodAD_dVgs = QodAD_dVds = QodAD_dVbs = QodAD_dT = 0.0 ;
5365     }
5366 
5367     T4 = here->HSMHV2_weffcv_nf * Loverd * ( 1 - CVDSOVER ) ;
5368 
5369     Qovd =  T4 * ( QsuLD + QodAD ) ;
5370     Qovd_dVbs = T4 * ( QsuLD_dVbs + QodAD_dVbs ) ;
5371     Qovd_dVds = T4 * ( QsuLD_dVds + QodAD_dVds ) ;
5372     Qovd_dVgs = T4 * ( QsuLD_dVgs + QodAD_dVgs ) ;
5373     Qovd_dT   = T4 * ( QsuLD_dT   + QodAD_dT ) ;
5374 
5375     QidLD = T4 * QiuLD ;
5376     QidLD_dVbs = T4 * QiuLD_dVbs ;
5377     QidLD_dVds = T4 * QiuLD_dVds ;
5378     QidLD_dVgs = T4 * QiuLD_dVgs ;
5379     QidLD_dT   = T4 * QiuLD_dT   ;
5380 
5381     QbdLD = T4 * ( QbuLD + QodAD ) ;
5382     QbdLD_dVbs = T4 * ( QbuLD_dVbs + QodAD_dVbs ) ;
5383     QbdLD_dVds = T4 * ( QbuLD_dVds + QodAD_dVds ) ;
5384     QbdLD_dVgs = T4 * ( QbuLD_dVgs + QodAD_dVgs ) ;
5385     QbdLD_dT   = T4 * ( QbuLD_dT   + QodAD_dT ) ;
5386 
5387 
5388     if ( CVDSOVER != 0.0 ) { /* Qovdext begin */
5389       Vgbgmt = Vgse - Vbse ;
5390       Vgbgmt_dVbs = -1.0 ;
5391       Vgbgmt_dVds = 0.0 ;
5392       Vgbgmt_dVgs = 1.0 ;
5393       Vxbgmt = Vdse - Vbse + epsm10 ;
5394       Vxbgmt_dVbs = -1.0 ;
5395       Vxbgmt_dVds = 1.0 ;
5396       Vxbgmt_dVgs = 0.0 ;
5397 
5398 #include "hsmhv2eval_qover.h"
5399 
5400       T4 = here->HSMHV2_weffcv_nf * Loverd * CVDSOVER ;
5401       Qovdext =  T4 * QsuLD ;
5402       Qovdext_dVdse = T4 * QsuLD_dVds ;
5403       Qovdext_dVgse = T4 * QsuLD_dVgs ;
5404       Qovdext_dVbse = T4 * QsuLD_dVbs ;
5405       Qovdext_dT   = T4 * QsuLD_dT ;
5406 
5407       QidLDext = T4 * QiuLD ;
5408       QidLDext_dVbse = T4 * QiuLD_dVbs ;
5409       QidLDext_dVdse = T4 * QiuLD_dVds ;
5410       QidLDext_dVgse = T4 * QiuLD_dVgs ;
5411       QidLDext_dT = T4 * QiuLD_dT ;
5412 
5413       QbdLDext = T4 * QbuLD ;
5414       QbdLDext_dVbse = T4 * QbuLD_dVbs ;
5415       QbdLDext_dVdse= T4 * QbuLD_dVds ;
5416       QbdLDext_dVgse= T4 * QbuLD_dVgs ;
5417       QbdLDext_dT = T4 * QbuLD_dT ;
5418 
5419     } /* Qovdext end */
5420 
5421   }
5422     /*-----------------------------------*
5423      * Additional constant capacitance model
5424      *-----------------*/
5425     flg_overgiven = ( (int)ModeRVS * model->HSMHV2_cgso_Given
5426                     + (int)ModeNML * model->HSMHV2_cgdo_Given  ) ;
5427     if ( flg_overgiven ) {
5428       Cgdo  = ModeRVS * pParam->HSMHV2_cgso + ModeNML * pParam->HSMHV2_cgdo ;
5429       Cgdo *= - here->HSMHV2_weffcv_nf ;
5430     }
5431     Qgdo = - Cgdo * (Vgse - Vdse) ;
5432     Qgdo_dVbse = 0.0 ;
5433     Qgdo_dVdse = Cgdo ;
5434     Qgdo_dVgse = - Cgdo ;
5435   } /* Coovlpd != 0 end */
5436 
5437   /*-------------------------------------------*
5438    * Gate/Bulk overlap charge: Qgbo
5439    *-----------------*/
5440   Cgbo_loc = - pParam->HSMHV2_cgbo * here->HSMHV2_lgate ;
5441   Qgbo = - Cgbo_loc * (Vgs -Vbs) ;
5442   Qgbo_dVgs = - Cgbo_loc ;
5443   Qgbo_dVbs =   Cgbo_loc ;
5444   Qgbo_dVds = 0.0 ;
5445 
5446   /*---------------------------------------------------*
5447    * Lateral-field-induced capacitance.
5448    *-----------------*/
5449   if ( model->HSMHV2_xqy == 0 ){
5450     Qy = 0.0e0 ;
5451     Qy_dVds = 0.0e0 ;
5452     Qy_dVgs = 0.0e0 ;
5453     Qy_dVbs = 0.0e0 ;
5454     Qy_dT = 0.0e0 ;
5455   } else {
5456     Pslk = Ec * Leff + Ps0 ;
5457     Pslk_dVbs = Ec_dVbs * Leff + Ps0_dVbs;
5458     Pslk_dVds = Ec_dVds * Leff + Ps0_dVds;
5459     Pslk_dVgs = Ec_dVgs * Leff + Ps0_dVgs;
5460     Pslk_dT = Ec_dT * Leff + Ps0_dT;
5461 
5462     T1 = Aclm * ( Vds + Ps0 ) + ( 1.0e0 - Aclm ) * Pslk ;
5463     T1_dVb = Aclm * (  Ps0_dVbs ) + ( 1.0e0 - Aclm ) * Pslk_dVbs ;
5464     T1_dVd = Aclm * ( 1.0 + Ps0_dVds ) + ( 1.0e0 - Aclm ) * Pslk_dVds ;
5465     T1_dVg = Aclm * (  Ps0_dVgs ) + ( 1.0e0 - Aclm ) * Pslk_dVgs ;
5466     T1_dT = Aclm * ( Ps0_dT ) + ( 1.0e0 - Aclm ) * Pslk_dT ;
5467     T10 = here->HSMHV2_wdpl ;
5468     T3 = T10 * 1.3 ;
5469     T2 = C_ESI * here->HSMHV2_weffcv_nf * T3 ;
5470     Qy =  - ( ( Ps0 + Vds  - T1 ) / model->HSMHV2_xqy ) * T2 ;
5471     Qy_dVds =  - ( ( Ps0_dVds + 1.0e0 - T1_dVd ) / model->HSMHV2_xqy ) * T2 ;
5472     Qy_dVgs =  - ( ( Ps0_dVgs  - T1_dVg ) / model->HSMHV2_xqy ) * T2 ;
5473     Qy_dVbs =  - ( ( Ps0_dVbs  - T1_dVb ) / model->HSMHV2_xqy ) * T2 ;
5474     Qy_dT =  - ( ( Ps0_dT - T1_dT ) / model->HSMHV2_xqy ) * T2 ;
5475   }
5476 
5477   if ( model->HSMHV2_xqy1 != 0.0 ){
5478     Qy += here->HSMHV2_cqyb0 * Vbs ;
5479     Qy_dVbs += here->HSMHV2_cqyb0 ;
5480   }
5481 
5482   /*---------------------------------------------------*
5483    * Fringing capacitance.
5484    *-----------------*/
5485   Cfd = here->HSMHV2_cfrng ;
5486   Cfs = here->HSMHV2_cfrng ;
5487   Qfd = Cfd * ( Vgse - Vdse ) ;
5488   Qfs = Cfs * Vgse ;
5489 
5490   /*-----------------------------------------------------------*
5491    * End of PART-3. (label)
5492    *-----------------*/
5493 
5494 /* end_of_part_3: */
5495 
5496   /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5497    * PART-4: Substrate-source/drain junction diode.
5498    *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
5499 
5500    /* move to hsmhveval_dio.c */
5501 
5502 
5503   /*-----------------------------------------------------------*
5504    * End of PART-4. (label)
5505    *-----------------*/
5506 
5507 /* end_of_part_4: */
5508 
5509 
5510 
5511   /*-----------------------------------------------------------*
5512    * PART-5: NQS. (label)
5513    *-----------------*/
5514   if (flg_nqs) {
5515     if(ckt->CKTmode & MODETRAN){
5516       if( ckt->CKTmode & MODEINITTRAN ){
5517 
5518         tau  = tau_dVds  = tau_dVgs  = tau_dVbs  = tau_dT  = 0.0 ;
5519         taub = taub_dVds = taub_dVgs = taub_dVbs = taub_dT = 0.0 ;
5520 
5521       } else {
5522         /* tau for inversion charge */
5523         if (flg_noqi == 0) {
5524           T12 = model->HSMHV2_dly1;
5525           T10 = model->HSMHV2_dly2;
5526 
5527           T3 = Lch ;
5528           T1 = T10 * T12 * T3 * T3 ;
5529           T2 = Mu * VgVt * T12 + T10 * T3 * T3 + small ;
5530           tau = T1 / T2 ;
5531 
5532           T1_dVg = T10 * T12 * 2.0 * T3 * Lch_dVgs ;
5533           T1_dVd = T10 * T12 * 2.0 * T3 * Lch_dVds ;
5534           T1_dVb = T10 * T12 * 2.0 * T3 * Lch_dVbs ;
5535           T1_dT = T10 * T12 * 2.0 * T3 * Lch_dT ;
5536 
5537           T2_dVg = T12 * Mu_dVgs * VgVt
5538             + T12 * Mu * VgVt_dVgs + T10 * 2.0 * T3 * Lch_dVgs ;
5539           T2_dVd = T12 * Mu_dVds * VgVt
5540             + T12 * Mu * VgVt_dVds + T10 * 2.0 * T3 * Lch_dVds ;
5541           T2_dVb = T12 * Mu_dVbs * VgVt
5542             + T12 * Mu * VgVt_dVbs + T10 * 2.0 * T3 * Lch_dVbs ;
5543           T2_dT = T12 * Mu_dT * VgVt
5544             + T12 * Mu * VgVt_dT + T10 * 2.0 * T3 * Lch_dT ;
5545 
5546           T4 = 1.0 / T2 ;
5547           tau_dVgs = ( T1_dVg - tau * T2_dVg ) * T4 ;
5548           tau_dVds = ( T1_dVd - tau * T2_dVd ) * T4 ;
5549           tau_dVbs = ( T1_dVb - tau * T2_dVb ) * T4 ;
5550           tau_dT =   ( T1_dT  - tau * T2_dT  ) * T4 ;
5551        } else {
5552           tau = model->HSMHV2_dly1 ;
5553           tau_dVgs = tau_dVds = tau_dVbs = tau_dT = 0.0 ;
5554         }
5555 
5556         T1 = ckt->CKTdelta ;
5557 
5558         /* tau for bulk charge */
5559         T2 = modelMKS->HSMHV2_dly3 ;
5560         taub = T2 * Cox ;
5561         taub_dVgs = T2 * Cox_dVg ;
5562         taub_dVds = T2 * Cox_dVd ;
5563         taub_dVbs = T2 * Cox_dVb ;
5564         taub_dT   = 0.0          ;
5565 
5566       }
5567     } else { /* !(CKT_mode & MODETRAN) */
5568 
5569       tau  = tau_dVds  = tau_dVgs  = tau_dVbs  = tau_dT  = 0.0 ;
5570       taub = taub_dVds = taub_dVgs = taub_dVbs = taub_dT = 0.0 ;
5571     }
5572   }
5573 
5574   if ( flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG)) ) { /* ACNQS */
5575 
5576     if (flg_noqi == 0) {
5577       T12 = model->HSMHV2_dly1 ;
5578       T10 = model->HSMHV2_dly2 ;
5579 
5580       T3 = Lch ;
5581       T1 = T12 * T10 * T3 * T3 ;
5582       T2 = Mu * VgVt * T12 + T10 * T3 * T3 + small ;
5583       tau = T1 / T2 ;
5584 
5585       T1_dVg = T10 * T12 * 2.0 * T3 * Lch_dVgs ;
5586       T1_dVd = T10 * T12 * 2.0 * T3 * Lch_dVds ;
5587       T1_dVb = T10 * T12 * 2.0 * T3 * Lch_dVbs ;
5588       T1_dT = T10 * T12 * 2.0 * T3 * Lch_dT ;
5589 
5590       T2_dVg = T12 * Mu_dVgs * VgVt + T12 * Mu * VgVt_dVgs
5591         + T10 * 2.0 * T3 * Lch_dVgs ;
5592       T2_dVd = T12 * Mu_dVds * VgVt + T12 * Mu * VgVt_dVds
5593         + T10 * 2.0 * T3 * Lch_dVds ;
5594       T2_dVb = T12 * Mu_dVbs * VgVt + T12 * Mu * VgVt_dVbs
5595         + T10 * 2.0 * T3 * Lch_dVbs ;
5596       T2_dT = T12 * Mu_dT * VgVt + T12 * Mu * VgVt_dT
5597         + T10 * 2.0 * T3 * Lch_dT ;
5598 
5599       T4 = 1.0 / T2 ;
5600       tau_dVgs = (T1_dVg - tau * T2_dVg) * T4 ;
5601       tau_dVds = (T1_dVd - tau * T2_dVd) * T4 ;
5602       tau_dVbs = (T1_dVb - tau * T2_dVb) * T4 ;
5603       tau_dT = (T1_dT - tau * T2_dT) * T4 ;
5604     } else {
5605       tau = model->HSMHV2_dly1 ;
5606       tau_dVgs = tau_dVds = tau_dVbs = tau_dT = 0.0 ;
5607     }
5608 
5609     T2 = modelMKS->HSMHV2_dly3 ;
5610     taub = T2 * Cox;
5611     taub_dVgs = T2 * Cox_dVg ;
5612     taub_dVds = T2 * Cox_dVd ;
5613     taub_dVbs = T2 * Cox_dVb ;
5614     taub_dT   = 0.0 ;
5615   }
5616 
5617   /*-----------------------------------------------------------*
5618    * End of PART-5. (label)
5619    *-----------------*/
5620 /* end_of_part_5: */
5621 
5622   /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5623    * PART-6: Noise Calculation.
5624    *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
5625 
5626   /*-----------------------------------------------------------*
5627    * 1/f noise.
5628    *-----------------*/
5629   if ( model->HSMHV2_coflick != 0 && !flg_noqi ) {
5630 
5631     NFalp = pParam->HSMHV2_nfalp ;
5632     NFtrp = pParam->HSMHV2_nftrp ;
5633     Cit = modelMKS->HSMHV2_cit ;
5634 
5635     T1 = Qn0 / C_QE ;
5636     T2 = ( Cox + Qn0 / ( Ps0 - Vbscl ) + Cit ) * beta_inv / C_QE ;
5637     T3 = -2.0E0 * Qi_noi / C_QE / Lch / here->HSMHV2_weff_nf - T1 ;
5638     if ( T3 != T1 ) {
5639       T4 = 1.0E0 / ( T1 + T2 ) / ( T3 + T2 ) + 2.0E0 * NFalp * Ey * Mu / ( T3 - T1 )
5640         * log( ( T3 + T2 ) / ( T1 + T2 ) ) + NFalp * Ey * Mu * NFalp * Ey * Mu ;
5641     }  else {
5642       T4 = 1.0 / ( T1 + T2 ) / ( T3 + T2 ) + 2.0 * NFalp * Ey * Mu / ( T1 + T2 )
5643         + NFalp * Ey * Mu * NFalp * Ey * Mu;
5644     }
5645     Nflic = Ids * Ids * NFtrp / ( Lch * beta * here->HSMHV2_weff_nf ) * T4 ;
5646   } else {
5647     Nflic = 0.0 ;
5648   }
5649 
5650   /*-----------------------------------------------------------*
5651    * thermal noise.
5652    *-----------------*/
5653   if ( model->HSMHV2_cothrml != 0 && !flg_noqi && model->HSMHV2_codep==0 ) {
5654 
5655     Eyd = ( Psdl - Ps0 ) / Lch + small ;
5656     T12 = Muun * Eyd / 1.0e7 ;
5657     /* note: model->HSMHV2_bb = 2 (electron) ;1 (hole) */
5658     if ( 1.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 1.0e0 + epsm10 ) {
5659       T7  = 1.0e0 ;
5660     } else if ( 2.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 2.0e0 + epsm10 ) {
5661       T7  = T12 ;
5662     } else {
5663       T7  = Fn_Pow( Eyd, model->HSMHV2_bb - 1.0e0 ) ;
5664     }
5665     T8 = T12 * T7 ;
5666     T9 = 1.0e0 + T8 ;
5667     T10 = Fn_Pow( T9, ( - 1.0e0 / model->HSMHV2_bb - 1.0e0 ) ) ;
5668     T11 = T9 * T10 ;
5669     Mud_hoso = Muun * T11 ;
5670     Mu_Ave = ( Mu + Mud_hoso ) / 2.0 ;
5671 
5672     /* Sid_h = GAMMA * 4.0 * C_KB * model->HSMHV2_temp * gds0_h2; */
5673     T0 = Alpha * Alpha ;
5674     Nthrml  = here->HSMHV2_weff_nf * Cox * VgVt * Mu
5675       * ( ( 1e0 + 3e0 * Alpha + 6e0 * T0 ) * Mud_hoso * Mud_hoso
5676           + ( 3e0 + 4e0 * Alpha + 3e0 * T0 ) * Mud_hoso * Mu
5677           + ( 6e0 + 3e0 * Alpha + T0 ) * Mu * Mu )
5678       / ( 15e0 * Lch * ( 1e0 + Alpha ) * Mu_Ave * Mu_Ave ) ;
5679   } else {
5680     Nthrml = 0e0 ;
5681   }
5682 
5683 
5684   /*----------------------------------------------------------*
5685    * induced gate noise. ( Part 2/3 )
5686    *----------------------*/
5687   if ( model->HSMHV2_coign != 0 && model->HSMHV2_cothrml != 0 && flg_ign == 1 && !flg_noqi && model->HSMHV2_codep==0) {
5688     sqrtkusaiL = sqrt( kusaiL ) ;
5689     T2 = VgVt + sqrtkusaiL ;
5690     T3 = kusai00 * kusai00 ;
5691     T4 = kusaiL * kusaiL ;
5692     T5 = 42.0e0 * kusai00 * kusaiL ;
5693     T5 += 4.0e0 * ( T3 + T4 ) ;
5694     T5 += 20.0e0 * sqrtkusaiL * VgVt * ( kusai00 + kusaiL ) ;
5695     T10 = T2 * T2 ;
5696     T10 *= T10 ;
5697     kusai_ig = T5 / ( T10 * T2 ) ; /* Induced Gate Noise parameter */
5698     gds0_ign = here->HSMHV2_weff_nf / Lch * Mu * Cox ;
5699     gds0_h2 = gds0_ign * VgVt ;
5700     GAMMA = Nthrml / gds0_h2 ;
5701     T7 = kusai00 + 4.0e0 * VgVt * sqrtkusaiL + kusaiL ;
5702     /* cross-correlation coefficient (= Sigid/sqrt(Sig*Sid) ) */
5703     crl_f = c_sqrt_15 * kusai00L * T7
5704       / ( 6.0e0 * T2 * sqrt( GAMMA * T2 * VgVt * T5 ) ) ;
5705   }
5706 
5707 
5708   /*-----------------------------------------------------------*
5709    * End of PART-6. (label)
5710    *-----------------*/
5711 /* end_of_part_6: */
5712 
5713 
5714   /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5715    * PART-7: Evaluation of outputs.
5716    *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
5717 
5718   /*---------------------------------------------------*
5719    * Extrapolate quantities if external biases are out of bounds.
5720    * -> not necessary here
5721    *-----------------*/
5722 
5723   /*-----------------------------------------------------------*
5724    * Warn negative conductance.
5725    * - T1 ( = d Ids / d Vds ) is the derivative w.r.t. circuit bias.
5726    *-----------------*/
5727   T1 = ModeNML * Ids_dVds + ModeRVS * ( Ids_dVbs + Ids_dVds + Ids_dVgs ) ;
5728 
5729   if ( flg_info >= 1 &&
5730        (Ids_dVbs < 0.0 || T1 < 0.0 || Ids_dVgs < 0.0) ) {
5731     printf( "*** warning(HiSIM_HV(%s)): Negative Conductance\n", model->HSMHV2modName ) ;
5732     printf( " type = %d  mode = %d\n" , model->HSMHV2_type , here->HSMHV2_mode ) ;
5733     printf( " Vbs = %12.5e Vds = %12.5e Vgse= %12.5e\n" ,
5734             Vbs , Vds , Vgs ) ;
5735     printf( " Ids_dVbs   = %12.5e\n" , Ids_dVbs ) ;
5736     printf( " Ids_dVds   = %12.5e\n" , T1 ) ;
5737     printf( " Ids_dVgs   = %12.5e\n" , Ids_dVgs ) ;
5738   }
5739 
5740 
5741   /*-----------------------------------------------------------*
5742    * Assign outputs.
5743    *-----------------*/
5744 
5745 
5746   /*---------------------------------------------------*
5747    * Channel current and conductances.
5748    *-----------------*/
5749   here->HSMHV2_ids  = Mfactor * Ids ;
5750   here->HSMHV2_dIds_dVdsi = Mfactor * Ids_dVds ;
5751   here->HSMHV2_dIds_dVgsi = Mfactor * Ids_dVgs ;
5752   here->HSMHV2_dIds_dVbsi = Mfactor * Ids_dVbs ;
5753   here->HSMHV2_dIds_dTi   = Mfactor * Ids_dT  ;
5754 
5755   here->HSMHV2_idsibpc  = Mfactor * IdsIBPC ;
5756   here->HSMHV2_dIdsIBPC_dVdsi = Mfactor * IdsIBPC_dVds ;
5757   here->HSMHV2_dIdsIBPC_dVgsi = Mfactor * IdsIBPC_dVgs ;
5758   here->HSMHV2_dIdsIBPC_dVbsi = Mfactor * IdsIBPC_dVbs ;
5759   here->HSMHV2_dIdsIBPC_dTi   = Mfactor * IdsIBPC_dT  ;
5760   here->HSMHV2_dIdsIBPC_dVddp = Mfactor * IdsIBPC_dVddp  ;
5761 
5762 
5763   /* -------------------------------------*
5764    * Intrinsic charges / capacitances.
5765    *-----------------*/
5766   if (flg_nqs) { /* for flat handling of NQS: the NQS charges are added in hsmhvld */
5767 
5768     here->HSMHV2_qg = 0.0 ;
5769     here->HSMHV2_qd = 0.0 ;
5770     here->HSMHV2_qs = 0.0 ;
5771 
5772     here->HSMHV2_qdp = 0.0 ;
5773     here->HSMHV2_qsp = 0.0 ;
5774 
5775     here->HSMHV2_dqdp_dVdse = 0.0 ;
5776     here->HSMHV2_dqdp_dVgse = 0.0 ;
5777     here->HSMHV2_dqdp_dVbse = 0.0 ;
5778     here->HSMHV2_dqdp_dTi   = 0.0 ;
5779     here->HSMHV2_dqsp_dVdse = 0.0 ;
5780     here->HSMHV2_dqsp_dVgse = 0.0 ;
5781     here->HSMHV2_dqsp_dVbse = 0.0 ;
5782     here->HSMHV2_dqsp_dTi   = 0.0 ;
5783 
5784     here->HSMHV2_dQdi_dVdsi = 0.0 ;
5785     here->HSMHV2_dQdi_dVgsi = 0.0 ;
5786     here->HSMHV2_dQdi_dVbsi = 0.0 ;
5787     here->HSMHV2_dQdi_dTi   = 0.0 ;
5788     here->HSMHV2_dQg_dVdsi  = 0.0 ;
5789     here->HSMHV2_dQg_dVgsi  = 0.0 ;
5790     here->HSMHV2_dQg_dVbsi  = 0.0 ;
5791     here->HSMHV2_dQg_dTi    = 0.0 ;
5792     here->HSMHV2_dQb_dVdsi  = 0.0 ;
5793     here->HSMHV2_dQb_dVgsi  = 0.0 ;
5794     here->HSMHV2_dQb_dVbsi  = 0.0 ;
5795     here->HSMHV2_dQb_dTi    = 0.0 ;
5796 
5797     here->HSMHV2_qgext = 0.0 ;
5798     here->HSMHV2_qdext = 0.0 ;
5799     here->HSMHV2_qsext = 0.0 ;
5800 
5801     here->HSMHV2_dQdext_dVdse = 0.0 ;
5802     here->HSMHV2_dQdext_dVgse = 0.0 ;
5803     here->HSMHV2_dQdext_dVbse = 0.0 ;
5804     here->HSMHV2_dQdext_dTi   = 0.0 ;
5805     here->HSMHV2_dQgext_dVdse = 0.0 ;
5806     here->HSMHV2_dQgext_dVgse = 0.0 ;
5807     here->HSMHV2_dQgext_dVbse = 0.0 ;
5808     here->HSMHV2_dQgext_dTi   = 0.0 ;
5809     here->HSMHV2_dQbext_dVdse = 0.0 ;
5810     here->HSMHV2_dQbext_dVgse = 0.0 ;
5811     here->HSMHV2_dQbext_dVbse = 0.0 ;
5812     here->HSMHV2_dQbext_dTi   = 0.0 ;
5813     here->HSMHV2_tau       = tau ;
5814     here->HSMHV2_tau_dVgsi = tau_dVgs ;
5815     here->HSMHV2_tau_dVdsi = tau_dVds ;
5816     here->HSMHV2_tau_dVbsi = tau_dVbs ;
5817     here->HSMHV2_tau_dTi   = tau_dT   ;
5818 
5819     here->HSMHV2_taub       = taub ;
5820     here->HSMHV2_taub_dVgsi = taub_dVgs ;
5821     here->HSMHV2_taub_dVdsi = taub_dVds ;
5822     here->HSMHV2_taub_dVbsi = taub_dVbs ;
5823     here->HSMHV2_taub_dTi   = taub_dT   ;
5824 
5825     here->HSMHV2_Xd       = Qdrat;
5826     here->HSMHV2_Xd_dVgsi = Qdrat_dVgs ;
5827     here->HSMHV2_Xd_dVdsi = Qdrat_dVds ;
5828     here->HSMHV2_Xd_dVbsi = Qdrat_dVbs ;
5829     here->HSMHV2_Xd_dTi   = Qdrat_dT   ;
5830 
5831     here->HSMHV2_Qbulk       = Mfactor * Qb ;
5832     here->HSMHV2_Qbulk_dVgsi = Mfactor * Qb_dVgs ;
5833     here->HSMHV2_Qbulk_dVdsi = Mfactor * Qb_dVds ;
5834     here->HSMHV2_Qbulk_dVbsi = Mfactor * Qb_dVbs ;
5835     here->HSMHV2_Qbulk_dTi   = Mfactor * Qb_dT  ;
5836 
5837     here->HSMHV2_Qi       = Mfactor * Qi ;
5838     here->HSMHV2_Qi_dVgsi = Mfactor * Qi_dVgs ;
5839     here->HSMHV2_Qi_dVdsi = Mfactor * Qi_dVds ;
5840     here->HSMHV2_Qi_dVbsi = Mfactor * Qi_dVbs ;
5841     here->HSMHV2_Qi_dTi   = Mfactor * Qi_dT  ;
5842 
5843   } else  { /* QS */
5844 
5845     here->HSMHV2_qg = Mfactor * - (Qb + Qi) ;
5846     here->HSMHV2_qd = Mfactor * Qd ;
5847     here->HSMHV2_qs = Mfactor * ( Qi - Qd ) ;
5848     here->HSMHV2_qdp = 0.0 ;
5849     here->HSMHV2_qsp = 0.0 ;
5850 
5851     here->HSMHV2_dqdp_dVdse = 0.0 ;
5852     here->HSMHV2_dqdp_dVgse = 0.0 ;
5853     here->HSMHV2_dqdp_dVbse = 0.0 ;
5854     here->HSMHV2_dqdp_dTi   = 0.0 ;
5855     here->HSMHV2_dqsp_dVdse = 0.0 ;
5856     here->HSMHV2_dqsp_dVgse = 0.0 ;
5857     here->HSMHV2_dqsp_dVbse = 0.0 ;
5858     here->HSMHV2_dqsp_dTi   = 0.0 ;
5859 
5860     here->HSMHV2_qgext = 0.0 ;
5861     here->HSMHV2_qdext = 0.0 ;
5862     here->HSMHV2_qsext = 0.0 ;
5863 
5864     here->HSMHV2_dQdext_dVdse = 0.0 ;
5865     here->HSMHV2_dQdext_dVgse = 0.0 ;
5866     here->HSMHV2_dQdext_dVbse = 0.0 ;
5867     here->HSMHV2_dQdext_dTi   = 0.0 ;
5868     here->HSMHV2_dQgext_dVdse = 0.0 ;
5869     here->HSMHV2_dQgext_dVgse = 0.0 ;
5870     here->HSMHV2_dQgext_dVbse = 0.0 ;
5871     here->HSMHV2_dQgext_dTi   = 0.0 ;
5872     here->HSMHV2_dQbext_dVdse = 0.0 ;
5873     here->HSMHV2_dQbext_dVgse = 0.0 ;
5874     here->HSMHV2_dQbext_dVbse = 0.0 ;
5875     here->HSMHV2_dQbext_dTi   = 0.0 ;
5876     here->HSMHV2_dQdi_dVdsi = Mfactor * Qd_dVds ;
5877     here->HSMHV2_dQdi_dVgsi = Mfactor * Qd_dVgs ;
5878     here->HSMHV2_dQdi_dVbsi = Mfactor * Qd_dVbs ;
5879     here->HSMHV2_dQdi_dTi   = Mfactor * Qd_dT  ;
5880     here->HSMHV2_dQg_dVdsi  = Mfactor * ( - Qb_dVds - Qi_dVds ) ;
5881     here->HSMHV2_dQg_dVgsi  = Mfactor * ( - Qb_dVgs - Qi_dVgs ) ;
5882     here->HSMHV2_dQg_dVbsi  = Mfactor * ( - Qb_dVbs - Qi_dVbs ) ;
5883     here->HSMHV2_dQg_dTi    = Mfactor * ( - Qb_dT  - Qi_dT  ) ;
5884     here->HSMHV2_dQb_dVdsi  = Mfactor * Qb_dVds ;
5885     here->HSMHV2_dQb_dVgsi  = Mfactor * Qb_dVgs ;
5886     here->HSMHV2_dQb_dVbsi  = Mfactor * Qb_dVbs ;
5887     here->HSMHV2_dQb_dTi    = Mfactor * Qb_dT  ;
5888   }
5889 
5890   /*---------------------------------------------------*
5891    * Add S/D overlap charges/capacitances to intrinsic ones.
5892    * - NOTE: This function depends on coadov, a control option.
5893    *-----------------*/
5894   if ( model->HSMHV2_coadov == 1 ) {
5895       here->HSMHV2_qg += Mfactor * ( Qgod + Qgos + Qgbo + Qy - Qovd - Qovs ) ;
5896       here->HSMHV2_qd += Mfactor * ( - Qgod - Qy + QbdLD ) ;
5897       here->HSMHV2_qs += Mfactor * ( - Qgos      + QbsLD ) ;
5898 
5899       here->HSMHV2_qdp += Mfactor * ( - Qfd - Qgdo ) ;
5900       here->HSMHV2_qsp += Mfactor * ( - Qfs - Qgso ) ;
5901 
5902       here->HSMHV2_cddo        = Mfactor * ( - Qgod_dVds - Qy_dVds + QbdLD_dVds ) ;
5903       here->HSMHV2_dQdi_dVdsi +=     here->HSMHV2_cddo ;
5904       here->HSMHV2_cdgo        = Mfactor * ( - Qgod_dVgs - Qy_dVgs + QbdLD_dVgs ) ;
5905       here->HSMHV2_dQdi_dVgsi +=     here->HSMHV2_cdgo ;
5906       here->HSMHV2_cdbo        = Mfactor * ( - Qgod_dVbs - Qy_dVbs + QbdLD_dVbs ) ;
5907       here->HSMHV2_dQdi_dVbsi +=     here->HSMHV2_cdbo ;
5908       here->HSMHV2_dQdi_dTi   += Mfactor * ( - Qgod_dT  - Qy_dT  + QbdLD_dT  ) ;
5909       here->HSMHV2_cgdo        = Mfactor * (   Qgod_dVds + Qgos_dVds + Qgbo_dVds + Qy_dVds - Qovd_dVds - Qovs_dVds  ) ;
5910       here->HSMHV2_dQg_dVdsi  +=     here->HSMHV2_cgdo ;
5911       here->HSMHV2_cggo        = Mfactor * (   Qgod_dVgs + Qgos_dVgs + Qgbo_dVgs + Qy_dVgs - Qovd_dVgs - Qovs_dVgs  ) ;
5912       here->HSMHV2_dQg_dVgsi  +=     here->HSMHV2_cggo ;
5913       here->HSMHV2_cgbo        = Mfactor * (   Qgod_dVbs + Qgos_dVbs + Qgbo_dVbs + Qy_dVbs - Qovd_dVbs - Qovs_dVbs  ) ;
5914       here->HSMHV2_dQg_dVbsi  +=     here->HSMHV2_cgbo ;
5915       here->HSMHV2_dQg_dTi    += Mfactor * (   Qgod_dT  + Qgos_dT  + Qgbo_dT  + Qy_dT  - Qovd_dT  - Qovs_dT   ) ;
5916       here->HSMHV2_cbdo        = Mfactor * ( - Qgbo_dVds + QidLD_dVds + QisLD_dVds ) ;
5917       here->HSMHV2_dQb_dVdsi  +=     here->HSMHV2_cbdo ;
5918       here->HSMHV2_cbgo        = Mfactor * ( - Qgbo_dVgs + QidLD_dVgs + QisLD_dVgs ) ;
5919       here->HSMHV2_dQb_dVgsi  +=     here->HSMHV2_cbgo ;
5920       here->HSMHV2_cbbo        = Mfactor * ( - Qgbo_dVbs + QidLD_dVbs + QisLD_dVbs ) ;
5921       here->HSMHV2_dQb_dVbsi  +=     here->HSMHV2_cbbo ;
5922       here->HSMHV2_dQb_dTi    += Mfactor * ( - Qgbo_dT  + QidLD_dT  + QisLD_dT  ) ;
5923 
5924       /* for fringing capacitances */
5925       here->HSMHV2_dqdp_dVdse += Mfactor * (   Cfd - Qgdo_dVdse ) ;
5926       here->HSMHV2_dqdp_dVgse += Mfactor * ( - Cfd - Qgdo_dVgse ) ;
5927       here->HSMHV2_dqdp_dVbse += Mfactor * (       - Qgdo_dVbse ) ;
5928       here->HSMHV2_dqdp_dTi   += 0.0 ;
5929       here->HSMHV2_dqsp_dVdse += Mfactor * (       - Qgso_dVdse ) ;
5930       here->HSMHV2_dqsp_dVgse += Mfactor * ( - Cfs - Qgso_dVgse ) ;
5931       here->HSMHV2_dqsp_dVbse += Mfactor * (       - Qgso_dVbse ) ;
5932       here->HSMHV2_dqsp_dTi   += 0.0 ;
5933 
5934       here->HSMHV2_qgext += Mfactor * ( - Qovdext - Qovsext ) ;
5935       here->HSMHV2_qdext += Mfactor * QbdLDext ;
5936       here->HSMHV2_qsext += Mfactor * QbsLDext ;
5937 
5938       here->HSMHV2_dQdext_dVdse += Mfactor * ( QbdLDext_dVdse ) ;
5939       here->HSMHV2_dQdext_dVgse += Mfactor * ( QbdLDext_dVgse ) ;
5940       here->HSMHV2_dQdext_dVbse += Mfactor * ( QbdLDext_dVbse ) ;
5941       here->HSMHV2_dQdext_dTi   += Mfactor * ( QbdLDext_dT  ) ;
5942       here->HSMHV2_dQgext_dVdse += Mfactor * ( - Qovdext_dVdse - Qovsext_dVdse  ) ;
5943       here->HSMHV2_dQgext_dVgse += Mfactor * ( - Qovdext_dVgse - Qovsext_dVgse  ) ;
5944       here->HSMHV2_dQgext_dVbse += Mfactor * ( - Qovdext_dVbse - Qovsext_dVbse  ) ;
5945       here->HSMHV2_dQgext_dTi   += Mfactor * ( - Qovdext_dT    - Qovsext_dT ) ;
5946       here->HSMHV2_dQbext_dVdse += Mfactor * ( QidLDext_dVdse + QisLDext_dVdse ) ;
5947       here->HSMHV2_dQbext_dVgse += Mfactor * ( QidLDext_dVgse + QisLDext_dVgse ) ;
5948       here->HSMHV2_dQbext_dVbse += Mfactor * ( QidLDext_dVbse + QisLDext_dVbse ) ;
5949       here->HSMHV2_dQbext_dTi   += Mfactor * ( QidLDext_dT    + QisLDext_dT ) ;
5950 
5951   }
5952   here->HSMHV2_dQsi_dVdsi = - (here->HSMHV2_dQdi_dVdsi + here->HSMHV2_dQg_dVdsi + here->HSMHV2_dQb_dVdsi) ;
5953   here->HSMHV2_dQsi_dVgsi = - (here->HSMHV2_dQdi_dVgsi + here->HSMHV2_dQg_dVgsi + here->HSMHV2_dQb_dVgsi) ;
5954   here->HSMHV2_dQsi_dVbsi = - (here->HSMHV2_dQdi_dVbsi + here->HSMHV2_dQg_dVbsi + here->HSMHV2_dQb_dVbsi) ;
5955   here->HSMHV2_dQsi_dTi   = - (here->HSMHV2_dQdi_dTi   + here->HSMHV2_dQg_dTi   + here->HSMHV2_dQb_dTi  ) ;
5956 
5957   here->HSMHV2_dQsext_dVdse = - (here->HSMHV2_dQdext_dVdse + here->HSMHV2_dQgext_dVdse + here->HSMHV2_dQbext_dVdse) ;
5958   here->HSMHV2_dQsext_dVgse = - (here->HSMHV2_dQdext_dVgse + here->HSMHV2_dQgext_dVgse + here->HSMHV2_dQbext_dVgse) ;
5959   here->HSMHV2_dQsext_dVbse = - (here->HSMHV2_dQdext_dVbse + here->HSMHV2_dQgext_dVbse + here->HSMHV2_dQbext_dVbse) ;
5960   here->HSMHV2_dQsext_dTi   = - (here->HSMHV2_dQdext_dTi   + here->HSMHV2_dQgext_dTi   + here->HSMHV2_dQbext_dTi  ) ;
5961 
5962   /*---------------------------------------------------*
5963    * Substrate/gate/leak currents.
5964    *-----------------*/
5965 
5966   here->HSMHV2_isub = Mfactor * Isub ;
5967   here->HSMHV2_dIsub_dVdsi = Mfactor * Isub_dVds ;
5968   here->HSMHV2_dIsub_dVgsi = Mfactor * Isub_dVgs ;
5969   here->HSMHV2_dIsub_dVbsi = Mfactor * Isub_dVbs ;
5970   here->HSMHV2_dIsub_dTi   = Mfactor * Isub_dT  ;
5971 
5972   here->HSMHV2_isubld = Mfactor * IsubLD ;
5973   here->HSMHV2_dIsubLD_dVdsi = Mfactor * IsubLD_dVds ;
5974   here->HSMHV2_dIsubLD_dVgsi = Mfactor * IsubLD_dVgs ;
5975   here->HSMHV2_dIsubLD_dVbsi = Mfactor * IsubLD_dVbs ;
5976   here->HSMHV2_dIsubLD_dTi   = Mfactor * IsubLD_dT  ;
5977   here->HSMHV2_dIsubLD_dVddp = Mfactor * IsubLD_dVddp ;
5978 
5979   here->HSMHV2_igb   = Mfactor * -Igb ;
5980   here->HSMHV2_dIgb_dVdsi = - Mfactor * Igb_dVds ;
5981   here->HSMHV2_dIgb_dVgsi = - Mfactor * Igb_dVgs ;
5982   here->HSMHV2_dIgb_dVbsi = - Mfactor * Igb_dVbs ;
5983   here->HSMHV2_dIgb_dTi   = - Mfactor * Igb_dT  ;
5984 
5985   if (here->HSMHV2_mode == HiSIM_NORMAL_MODE) {
5986     here->HSMHV2_igd   = Mfactor * ( model->HSMHV2_glpart1 * Igate - Igd ) ;
5987   } else {
5988     here->HSMHV2_igd   = Mfactor * ( (1.0e0 - model->HSMHV2_glpart1 ) * Igate - Igs ) ;
5989   }
5990 
5991   if (here->HSMHV2_mode == HiSIM_NORMAL_MODE) {
5992     here->HSMHV2_igs   = Mfactor * ( (1.0e0  - model->HSMHV2_glpart1) * Igate - Igs ) ;
5993   } else {
5994     here->HSMHV2_igs   = Mfactor * ( model->HSMHV2_glpart1 * Igate - Igd ) ;
5995   }
5996 
5997   /* note: here->HSMHV2_igd and here->HSMHV2_igs are already subjected to mode handling,
5998      while the following derivatives here->HSMHV2_dIgd_dVdsi, ... are not! */
5999   here->HSMHV2_dIgd_dVdsi = Mfactor * ( model->HSMHV2_glpart1 * Igate_dVds - Igd_dVds ) ;
6000   here->HSMHV2_dIgd_dVgsi = Mfactor * ( model->HSMHV2_glpart1 * Igate_dVgs - Igd_dVgs ) ;
6001   here->HSMHV2_dIgd_dVbsi = Mfactor * ( model->HSMHV2_glpart1 * Igate_dVbs - Igd_dVbs ) ;
6002   here->HSMHV2_dIgd_dTi   = Mfactor * ( model->HSMHV2_glpart1 * Igate_dT  - Igd_dT  ) ;
6003   here->HSMHV2_dIgs_dVdsi = Mfactor * ( (1.0 - model->HSMHV2_glpart1) * Igate_dVds - Igs_dVds ) ;
6004   here->HSMHV2_dIgs_dVgsi = Mfactor * ( (1.0 - model->HSMHV2_glpart1) * Igate_dVgs - Igs_dVgs ) ;
6005   here->HSMHV2_dIgs_dVbsi = Mfactor * ( (1.0 - model->HSMHV2_glpart1) * Igate_dVbs - Igs_dVbs ) ;
6006   here->HSMHV2_dIgs_dTi   = Mfactor * ( (1.0 - model->HSMHV2_glpart1) * Igate_dT  - Igs_dT  ) ;
6007 
6008   here->HSMHV2_igidl    = Mfactor * Igidl ;
6009   here->HSMHV2_dIgidl_dVdsi = Mfactor * Igidl_dVds ;
6010   here->HSMHV2_dIgidl_dVgsi = Mfactor * Igidl_dVgs ;
6011   here->HSMHV2_dIgidl_dVbsi = Mfactor * Igidl_dVbs ;
6012   here->HSMHV2_dIgidl_dTi   = Mfactor * Igidl_dT  ;
6013 
6014   here->HSMHV2_igisl    = Mfactor * Igisl ;
6015   here->HSMHV2_dIgisl_dVdsi = Mfactor * Igisl_dVds ;
6016   here->HSMHV2_dIgisl_dVgsi = Mfactor * Igisl_dVgs ;
6017   here->HSMHV2_dIgisl_dVbsi = Mfactor * Igisl_dVbs ;
6018   here->HSMHV2_dIgisl_dTi   = Mfactor * Igisl_dT  ;
6019 
6020   /*---------------------------------------------------*
6021    * Von, Vdsat.
6022    *-----------------*/
6023   here->HSMHV2_von = Vth ;
6024   here->HSMHV2_vdsat = Vdsat ;
6025 
6026 
6027 
6028 
6029   /*-----------------------------------------------------------*
6030    * Warn floating-point exceptions.
6031    * - Function finite() in libm is called.
6032    * - Go to start with info==5.
6033    *-----------------*/
6034   T1 = here->HSMHV2_ids + here->HSMHV2_dIds_dVdsi + here->HSMHV2_dIds_dVgsi + here->HSMHV2_dIds_dVbsi ;
6035   T1 = T1 + here->HSMHV2_qd - (here->HSMHV2_dQdi_dVdsi + here->HSMHV2_dQdi_dVgsi + here->HSMHV2_dQdi_dVbsi) ;
6036   if ( ! finite (T1) ) {
6037     flg_err = 1 ;
6038     fprintf (stderr ,
6039              "*** warning(HiSIM_HV(%s)): FP-exception (PART-1)\n", model->HSMHV2modName ) ;
6040     if ( flg_info >= 1 ) {
6041       printf ( "*** warning(HiSIM_HV(%s)): FP-exception\n", model->HSMHV2modName) ;
6042       printf ( "Ids   = %e\n" , here->HSMHV2_ids ) ;
6043       printf ( "Gmbs  = %e\n" , here->HSMHV2_dIds_dVbsi ) ;
6044       printf ( "Gds   = %e\n" , here->HSMHV2_dIds_dVdsi ) ;
6045       printf ( "Gm    = %e\n" , here->HSMHV2_dIds_dVgsi ) ;
6046       printf ( "Qd    = %e\n" , here->HSMHV2_qd  ) ;
6047       printf ( "Cds   = %e\n" , -(here->HSMHV2_dQdi_dVdsi
6048                                                  + here->HSMHV2_dQdi_dVgsi
6049                                                  + here->HSMHV2_dQdi_dVbsi) ) ;
6050     }
6051   }
6052 
6053   T1 = here->HSMHV2_isub + here->HSMHV2_dIsub_dVbsi + here->HSMHV2_dIsub_dVdsi + here->HSMHV2_dIsub_dVgsi ;
6054   if ( ! finite (T1) ) {
6055     flg_err = 1 ;
6056     fprintf (stderr ,
6057              "*** warning(HiSIM_HV(%s)): FP-exception (PART-2)\n", model->HSMHV2modName) ;
6058     if ( flg_info >= 1 ) {
6059       printf ("*** warning(HiSIM_HV(%s)): FP-exception\n", model->HSMHV2modName) ;
6060     }
6061   }
6062 
6063   T1 = here->HSMHV2_dQg_dVdsi + here->HSMHV2_dQg_dVgsi + here->HSMHV2_dQg_dVbsi ;
6064   if ( ! finite (T1) ) {
6065     flg_err = 1 ;
6066     fprintf(stderr ,
6067             "*** warning(HiSIM_HV(%s)): FP-exception (PART-3)\n", model->HSMHV2modName) ;
6068     if ( flg_info >= 1 ) {
6069       printf ("*** warning(HiSIM_HV(%s)): FP-exception\n", model->HSMHV2modName) ;
6070     }
6071   }
6072 
6073 
6074   /*-----------------------------------------------------------*
6075    * Exit for error case.
6076    *-----------------*/
6077   if ( flg_err != 0 ) {
6078     fprintf (stderr , "----- bias information (HiSIM_HV)\n") ;
6079     fprintf (stderr , "name: %s\n" , here->HSMHV2name ) ;
6080     fprintf (stderr , "states: %d\n" , here->HSMHV2states ) ;
6081     fprintf (stderr , "Vdse= %.3e Vgse=%.3e Vbse=%.3e\n"
6082             , Vdse , Vgse , Vbse ) ;
6083     fprintf (stderr , "Vdsi= %.3e Vgsi=%.3e Vbsi=%.3e\n"
6084             , Vds , Vgs , Vbs ) ;
6085     fprintf (stderr , "vbs_jct= %12.5e vbd_jct= %12.5e\n"
6086             , vbs_jct , vbd_jct ) ;
6087     fprintf (stderr , "vd= %.3e vs= %.3e vdp= %.3e vgp= %.3e vbp= %.3e vsp= %.3e\n"
6088             , *( ckt->CKTrhsOld + here->HSMHV2dNode )
6089             , *( ckt->CKTrhsOld + here->HSMHV2sNode )
6090             , *( ckt->CKTrhsOld + here->HSMHV2dNodePrime )
6091             , *( ckt->CKTrhsOld + here->HSMHV2gNodePrime )
6092             , *( ckt->CKTrhsOld + here->HSMHV2bNodePrime )
6093             , *( ckt->CKTrhsOld + here->HSMHV2sNodePrime )  ) ;
6094     fprintf (stderr , "----- bias information (end)\n" ) ;
6095     return ( HiSIM_ERROR ) ;
6096   }
6097 
6098 
6099   /*-----------------------------------------------------------*
6100    * Noise.
6101    *-----------------*/
6102   here->HSMHV2_noiflick = Mfactor * Nflic ;
6103   here->HSMHV2_noithrml = Mfactor * Nthrml ;
6104 
6105   /*----------------------------------------------------------*
6106    * induced gate noise. ( Part 3/3 )
6107    *----------------------*/
6108   if ( model->HSMHV2_coign != 0 && model->HSMHV2_cothrml != 0 && flg_ign == 1 && !flg_noqi && model->HSMHV2_codep==0 ) {
6109     T0 = Cox_small * Cox * here->HSMHV2_weff_nf * Leff ;
6110     T1 = -( here->HSMHV2_dQg_dVdsi + here->HSMHV2_dQg_dVgsi + here->HSMHV2_dQg_dVbsi ) / Mfactor ; /* NQS case is not supported. */
6111     if( - T1 > T0 ){
6112       Nign0 = c_16o135 * C_QE * beta_inv * T1 * T1 / gds0_ign ;
6113       if ( kusai00L > epsm10 && Vds > epsm10 ) {
6114     MuModA = Muun / Mu ;
6115     MuModB = ( Muun / Mud_hoso - MuModA ) / Vds ;
6116     correct_w1 = MuModA + C_2o3 * MuModB
6117       * ( kusai00 + VgVt * sqrtkusaiL + kusaiL )
6118       / ( VgVt + sqrtkusaiL ) ;
6119       } else {
6120     correct_w1 = Muun / Mud_hoso ;
6121       }
6122       here->HSMHV2_noiigate = Mfactor * Nign0 * kusai_ig * correct_w1 ;
6123       here->HSMHV2_noicross = crl_f ;
6124       if ( here->HSMHV2_noiigate < 0.0 ) here->HSMHV2_noiigate = 0.0e0 ;
6125     }else{
6126       here->HSMHV2_noiigate = 0.0e0 ;
6127       here->HSMHV2_noicross = 0.0e0 ;
6128     }
6129   }else{
6130     here->HSMHV2_noiigate = 0.0e0 ;
6131     here->HSMHV2_noicross = 0.0e0 ;
6132   }
6133 
6134   /*-----------------------------------------------------------*
6135    * Store values for next calculation.
6136    *-----------------*/
6137 
6138   /* Internal biases */
6139   if ( here->HSMHV2_called >= 1 ) {
6140     here->HSMHV2_vbsc_prv2 = here->HSMHV2_vbsc_prv ;
6141     here->HSMHV2_vdsc_prv2 = here->HSMHV2_vdsc_prv ;
6142     here->HSMHV2_vgsc_prv2 = here->HSMHV2_vgsc_prv ;
6143     here->HSMHV2_mode_prv2 = here->HSMHV2_mode_prv ;
6144   }
6145   here->HSMHV2_vbsc_prv = Vbs ;
6146   here->HSMHV2_vdsc_prv = Vds ;
6147   here->HSMHV2_vgsc_prv = Vgs ;
6148   here->HSMHV2_mode_prv = here->HSMHV2_mode ;
6149   here->HSMHV2_temp_prv = TTEMP ;
6150 
6151   /* Surface potentials and derivatives w.r.t. internal biases */
6152   if ( here->HSMHV2_called >= 1 ) {
6153     here->HSMHV2_ps0_prv2 = here->HSMHV2_ps0_prv ;
6154     here->HSMHV2_ps0_dvbs_prv2 = here->HSMHV2_ps0_dvbs_prv ;
6155     here->HSMHV2_ps0_dvds_prv2 = here->HSMHV2_ps0_dvds_prv ;
6156     here->HSMHV2_ps0_dvgs_prv2 = here->HSMHV2_ps0_dvgs_prv ;
6157     here->HSMHV2_pds_prv2 = here->HSMHV2_pds_prv ;
6158     here->HSMHV2_pds_dvbs_prv2 = here->HSMHV2_pds_dvbs_prv ;
6159     here->HSMHV2_pds_dvds_prv2 = here->HSMHV2_pds_dvds_prv ;
6160     here->HSMHV2_pds_dvgs_prv2 = here->HSMHV2_pds_dvgs_prv ;
6161   }
6162 
6163   here->HSMHV2_ps0_prv = Ps0 ;
6164   here->HSMHV2_ps0_dvbs_prv = Ps0_dVbs ;
6165   here->HSMHV2_ps0_dvds_prv = Ps0_dVds ;
6166   here->HSMHV2_ps0_dvgs_prv = Ps0_dVgs ;
6167   here->HSMHV2_ps0_dtemp_prv = Ps0_dT ;
6168   here->HSMHV2_pds_prv = Pds ;
6169   here->HSMHV2_pds_dvbs_prv = Pds_dVbs ;
6170   here->HSMHV2_pds_dvds_prv = Pds_dVds ;
6171   here->HSMHV2_pds_dvgs_prv = Pds_dVgs ;
6172   here->HSMHV2_pds_dtemp_prv = Pds_dT ;
6173 
6174 
6175   /* derivatives of channel current w.r.t. external bias (only due to Ra-dependencies!) */
6176   here->HSMHV2_dIds_dVdse = Ids_dRa * Ra_dVdse * Mfactor ;
6177   here->HSMHV2_dIds_dVgse = Ids_dRa * Ra_dVgse * Mfactor ;
6178   here->HSMHV2_dIds_dVbse = Ids_dRa * Ra_dVbse * Mfactor ;
6179 
6180   if ( VdseModeNML > 0.0 ) {
6181     here->HSMHV2_Rd = Rd / Mfactor ;
6182     here->HSMHV2_dRd_dVdse = Rd_dVdse / Mfactor ;
6183     here->HSMHV2_dRd_dVgse = Rd_dVgse / Mfactor ;
6184     here->HSMHV2_dRd_dVbse = Rd_dVbse / Mfactor ;
6185     here->HSMHV2_dRd_dVsubs = Rd_dVsubs / Mfactor ;
6186     here->HSMHV2_dRd_dTi   = Rd_dT / Mfactor ;
6187     here->HSMHV2_Rs = Rs / Mfactor ;
6188     here->HSMHV2_dRs_dVdse = Rs_dVdse / Mfactor ;
6189     here->HSMHV2_dRs_dVgse = Rs_dVgse / Mfactor ;
6190     here->HSMHV2_dRs_dVbse = Rs_dVbse / Mfactor ;
6191     here->HSMHV2_dRs_dVsubs = Rs_dVsubs / Mfactor ;
6192     here->HSMHV2_dRs_dTi   = Rs_dT / Mfactor ;
6193   } else {
6194     here->HSMHV2_Rd = Rs / Mfactor ;
6195     here->HSMHV2_dRd_dVdse = - ( Rs_dVdse + Rs_dVgse + Rs_dVbse + Rs_dVsubs ) / Mfactor ;
6196     here->HSMHV2_dRd_dVgse = Rs_dVgse / Mfactor ;
6197     here->HSMHV2_dRd_dVbse = Rs_dVbse / Mfactor ;
6198     here->HSMHV2_dRd_dVsubs = Rs_dVsubs / Mfactor ;
6199     here->HSMHV2_dRd_dTi   = Rs_dT / Mfactor ;
6200     here->HSMHV2_Rs = Rd / Mfactor ;
6201     here->HSMHV2_dRs_dVdse = - ( Rd_dVdse + Rd_dVgse + Rd_dVbse + Rd_dVsubs ) / Mfactor ;
6202     here->HSMHV2_dRs_dVgse = Rd_dVgse / Mfactor ;
6203     here->HSMHV2_dRs_dVbse = Rd_dVbse / Mfactor ;
6204     here->HSMHV2_dRs_dVsubs = Rd_dVsubs / Mfactor ;
6205     here->HSMHV2_dRs_dTi   = Rd_dT / Mfactor ;
6206   }
6207   /* Clamping to Res_min */
6208   if(here->HSMHV2_Rd < Res_min) {
6209      here->HSMHV2_Rd = Res_min ;
6210      here->HSMHV2_dRd_dVdse  = 0.0 ;
6211      here->HSMHV2_dRd_dVgse  = 0.0 ;
6212      here->HSMHV2_dRd_dVbse  = 0.0 ;
6213      here->HSMHV2_dRd_dVsubs = 0.0 ;
6214      here->HSMHV2_dRd_dTi    = 0.0 ;
6215   }
6216   if(here->HSMHV2_Rs < Res_min) {
6217      here->HSMHV2_Rs = Res_min ;
6218      here->HSMHV2_dRs_dVdse  = 0.0 ;
6219      here->HSMHV2_dRs_dVgse  = 0.0 ;
6220      here->HSMHV2_dRs_dVbse  = 0.0 ;
6221      here->HSMHV2_dRs_dVsubs = 0.0 ;
6222      here->HSMHV2_dRs_dTi    = 0.0 ;
6223   }
6224 
6225   /*-----------------------------------------------------------*
6226    * End of PART-7. (label)
6227    *-----------------*/
6228 /* end_of_part_7: */
6229 
6230   /*-----------------------------------------------------------*
6231    * Bottom of hsmhveval.
6232    *-----------------*/
6233 
6234   return ( HiSIM_OK ) ;
6235 
6236 } /* end of hsmhveval */
6237