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