1 /***********************************************************************
2 
3  HiSIM (Hiroshima University STARC IGFET Model)
4  Copyright (C) 2014 Hiroshima University & STARC
5 
6  MODEL NAME : HiSIM
7  ( VERSION : 2  SUBVERSION : 8  REVISION : 0 )
8 
9  FILE : hsm2eval.c
10 
11  Date : 2014.6.5
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 "HiSIM2 Distribution Statement and
25 Copyright Notice" attached to HiSIM2 model.
26 
27 -----HiSIM2 Distribution Statement and Copyright Notice--------------
28 
29 Software is distributed as is, completely without warranty or service
30 support. Hiroshima University or STARC and its employees are not liable
31 for the condition or performance of the software.
32 
33 Hiroshima University and STARC own the copyright and grant users a perpetual,
34 irrevocable, worldwide, non-exclusive, royalty-free license with respect
35 to the software as set forth below.
36 
37 Hiroshima University and STARC hereby disclaim all implied warranties.
38 
39 Hiroshima University and STARC grant the users the right to modify, copy,
40 and redistribute the software and documentation, both within the user's
41 organization and externally, subject to the following restrictions
42 
43 1. The users agree not to charge for Hiroshima University and STARC code
44 itself but may charge for additions, extensions, or support.
45 
46 2. In any product based on the software, the users agree to acknowledge
47 Hiroshima University and STARC that developed the software. This
48 acknowledgment shall appear in the product documentation.
49 
50 3. The users agree to reproduce any copyright notice which appears on
51 the software on any copy or modification of such made available
52 to others."
53 
54 
55 *************************************************************************/
56 
57 /*********************************************************************
58 * Memorandum on programming
59 *
60 * (1) Bias (x: b|d|g)
61 *     . vxs : Input argument.
62 *     . Vxse: External bias taking account device type (pMOS->nMOS).
63 *     . Vxsc: Confined bias within a specified region.
64 *     . Vxs : Internal bias.
65 *     . Y_dVxs denotes the partial derivative of Y w.r.t. Vxs.
66 *
67 * (2) Device Mode
68 *     . Normal mode (Vds>0 for nMOS) is assumed.
69 *     . In case of reverse mode, parent routines have to properly
70 *       transform or interchange inputs and outputs except ones
71 *       related to junction diodes, which are regarded as being
72 *       fixed to the nodal S/D.
73 *
74 * (3) Modification for symmetry at Vds=0
75 *     . Vxsz: Modified bias. (x: b|d|g)
76 *     . Ps0z: Modified Ps0.
77 *     . The following variables are calculated as a function of
78 *       modified biases or potential.
79 *         Tox, Cox, (-- with quantum effect)
80 *         Vth*, dVth*, dPpg, Igate, Igidl, Igisl.
81 *     . The following variables are calculated using a transform
82 *       function.
83 *         Lred
84 *
85 * (4) Zones and Cases (terminology)
86 *
87 *       Chi:=beta*(Ps0-Vbs)=       0    3    5
88 *
89 *                      Zone:    A  | D1 | D2 | D3
90 *                                  |
91 *                    (accumulation)|(depletion)
92 *                                  |
93 *                      Vgs =     Vgs_fb                Vth
94 *                                              /       /
95 *                      Case:    Nonconductive / Conductive
96 *                                            /
97 *             VgVt:=Qn0/Cox=             VgVt_small
98 *
99 *     . Ids is regarded as zero in zone-A.
100 *     . Procedure to calculate Psl and dependent variables is
101 *       omitted in the nonconductive case. Ids and Qi are regarded
102 *       as zero in this case.
103 *
104 *********************************************************************/
105 
106 /*===========================================================*
107 * Preamble.
108 *=================*/
109 /*---------------------------------------------------*
110 * Header files.
111 *-----------------*/
112 #include "ngspice/ngspice.h"
113 #ifdef __STDC__
114 /* #include <ieeefp.h> */
115 #endif
116 #include "ngspice/cktdefs.h"
117 
118 /*-----------------------------------*
119 * HiSIM macros
120 *-----------------*/
121 #include "hisim2.h"
122 #include "hsm2evalenv.h"
123 
124 /*-----------------------------------*
125 * HiSIM constants
126 *-----------------*/
127 #define C_sce_dlt (1.0e-2)
128 #define C_gidl_delta 0.5
129 #define C_PSLK_DELTA 1e-3     /* delta for Pslk smoothing */
130 #define C_PSLK_SHIFT 1.0      /* constant value for temporary shift */
131 #define C_IDD_MIN    1.0e-15
132 
133 /*===========================================================*
134 * pow
135 *=================*/
136 #ifdef POW_TO_EXP_AND_LOG
137 #define Fn_Pow( x , y )  ( (x==0.0) ? 0.0 : exp( (y) * log( x ) ) )
138 #else
139 #define Fn_Pow( x , y )  ( (x==0.0) ? 0.0 : pow( x , y ) )
140 #endif
141 
142 /*===========================================================*
143 * Exp() for PGD.
144 * - ExpLim(-3)=0
145 *=================*/
146 
147 #define Fn_ExpLim( y , x , dx ) { \
148     if ( (x) < -3.0 ) { \
149       dx = 0.0 ; \
150       y = 0.0 ; \
151     } else if ( (x) < 0.0 ) { \
152       dx =  1.0 + (x) * ( 2 * (1.0/3.0) + (x) * 3 * (1.0/27.0) )  ; \
153       y = 1.0 + (x) * ( 1.0 + (x) * ( (1.0/3.0) + (x) * (1.0/27.0) ) ) ; \
154     } else { \
155       dx =  1.0 + (x) * ( 2 * (1.0/3.0) + (x) * ( 3 * 0.0402052934513951 \
156                 + (x) * 4 * 0.148148111111111 ) ) ; \
157       y = 1.0 + (x) * ( 1.0 + (x) * ( (1.0/3.0) + (x) * ( 0.0402052934513951 \
158               + (x) * 0.148148111111111 ) ) ) ; \
159     } \
160 }
161 
162 /*===========================================================*
163 * Ceiling, smoothing functions.
164 *=================*/
165 /*---------------------------------------------------*
166 * smoothUpper: ceiling.
167 *      y = xmax - 0.5 ( arg + sqrt( arg^2 + 4 xmax delta ) )
168 *    arg = xmax - x - delta
169 *-----------------*/
170 
171 #define Fn_SU( y , x , xmax , delta , dx ) { \
172     double TMF1, TMF2; \
173     TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
174     TMF2 = 4.0 * ( xmax ) * ( delta) ; \
175     TMF2 = TMF2 > 0.0 ?  TMF2 : - ( TMF2 ) ; \
176     TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
177     dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
178     y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
179   }
180 
181 #define Fn_SU2( y , x , xmax , delta , dy_dx , dy_dxmax ) { \
182     double TMF1, TMF2; \
183     TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
184     TMF2 = 4.0 * ( xmax ) * ( delta) ; \
185     TMF2 = TMF2 > 0.0 ?  TMF2 : - ( TMF2 ) ; \
186     TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
187     dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
188     dy_dxmax = 0.5 * ( 1.0 - ( TMF1 + 2.0 * delta ) / TMF2 ) ; \
189     y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
190   }
191 
192 /*---------------------------------------------------*
193 * smoothLower: flooring.
194 *      y = xmin + 0.5 ( arg + sqrt( arg^2 + 4 xmin delta ) )
195 *    arg = x - xmin - delta
196 *-----------------*/
197 
198 #define Fn_SL( y , x , xmin , delta , dx ) { \
199     double TMF1, TMF2; \
200     TMF1 = ( x ) - ( xmin ) - ( delta ) ; \
201     TMF2 = 4.0 * ( xmin ) * ( delta ) ; \
202     TMF2 = TMF2 > 0.0 ?  TMF2 : - ( TMF2 ) ; \
203     TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
204     dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
205     y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \
206   }
207 
208 /*---------------------------------------------------*
209 * smoothZero: flooring to zero.
210 *      y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) )
211 *-----------------*/
212 
213 #define Fn_SZ( y , x , delta , dx ) { \
214     double TMF2; \
215     TMF2 = sqrt ( ( x ) *  ( x ) + 4.0 * ( delta ) * ( delta) ) ; \
216     dx = 0.5 * ( 1.0 + ( x ) / TMF2 ) ; \
217     y = 0.5 * ( ( x ) + TMF2 ) ; \
218     if( y < 0.0 ) { y=0.0; dx=0.0; } \
219   }
220 #if 0
221 /*---------------------------------------------------*
222 * smoothZero: flooring to zero.
223 *      y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) )
224 *-----------------*/
225 static double smoothZero
226 (
227  double x,
228  double delta,
229  double *dx
230  )
231 {
232   double sqr = sqrt ( x * x + 4.0 * delta * delta) ;
233   if (dx) *dx = 0.5 * ( 1.0 + x / sqr ) ;
234   return 0.5 * ( x + sqr ) ;
235 }
236 /*---------------------------------------------------*
237 * CeilingPow: ceiling for positive x, flooring for negative x.
238 *      y = x * xmax / ( x^{2m} + xmax^{2m} )^{1/(2m)}
239 * note:
240 *   - xmax has to be positive.
241 *   - -xmax < y < xmax.
242 *   - dy/dx|_{x=0} = 1.
243 *-----------------*/
244 static double CeilingPow
245 (
246  double x,
247  double xmax,
248  int    pw,
249  double *dx
250  )
251 {
252   double x2 = x * x ;
253   double xmax2 = xmax * xmax ;
254   double xp = 1.0 , xmp = 1.0 ;
255   int   m , mm ;
256   double arg , dnm ;
257   double result ;
258 
259   for ( m = 0 ; m < pw ; m ++ ) {
260     xp *= x2 ;
261     xmp *= xmax2 ;
262   }
263   arg = xp + xmp ;
264   dnm = arg ;
265   if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) {
266     if ( pw == 1 ) {
267         mm = 1 ;
268     } else if ( pw == 2 ) {
269         mm = 2 ;
270     } else if ( pw == 4 ) {
271         mm = 3 ;
272     } else if ( pw == 8 ) {
273         mm = 4 ;
274     }
275     for ( m = 0 ; m < mm ; m ++ ) {
276         dnm = sqrt( dnm ) ;
277     }
278   } else {
279         dnm = pow( dnm , 1.0 / ( 2.0 * pw ) ) ;
280   }
281   dnm = 1.0 / dnm ;
282   result = x * xmax * dnm ;
283   (*dx) = xmax * xmp * dnm / arg ;
284   return result ;
285 }
286 #endif
287 /*---------------------------------------------------*
288 * CeilingPow: ceiling for positive x, flooring for negative x.
289 *      y = x * xmax / ( x^{2m} + xmax^{2m} )^{1/(2m)}
290 * note:
291 *   - xmax has to be positive.
292 *   - -xmax < y < xmax.
293 *   - dy/dx|_{x=0} = 1.
294 *-----------------*/
295 
296 #define Fn_CP( y , x , xmax , pw , dx ) { \
297   double x2 = (x) * (x) ; \
298   double xmax2 = (xmax) * (xmax) ; \
299   double xp = 1.0 , xmp = 1.0 ; \
300   int   m , mm ; \
301   double arg_cp , dnm ; \
302   for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \
303   arg_cp = xp + xmp ; \
304   dnm = arg_cp ; \
305   if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \
306     if ( pw == 1 ) { mm = 1 ; \
307     } else if ( pw == 2 ) { mm = 2 ; \
308     } else if ( pw == 4 ) { mm = 3 ; \
309     } else if ( pw == 8 ) { mm = 4 ; } \
310     for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \
311   } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \
312   dnm = 1.0 / dnm ; \
313   y = (x) * (xmax) * dnm ; \
314   dx = (xmax) * xmp * dnm / arg_cp ; \
315 }
316 
317 #define Fn_SU_CP2( y , x , xmax , delta , pw , dx , dxmax ) { \
318  if(x > xmax - delta && delta >= 0.0) { \
319    double TMF0, TMF1; \
320    TMF1 = x - xmax + delta ; \
321    Fn_CP( TMF0 , TMF1 , delta , pw , dx )  \
322    y = xmax - delta + TMF0 ; \
323    dx = dx ; \
324    dxmax = 1.0-dx ; \
325  } else { \
326    y = x ; \
327    dx = 1.0 ; \
328    dxmax = 0.0 ; \
329  } \
330 }
331 
332 #define Fn_CP2( y , x , xmax , pw , dx , dxmax ) {      \
333   double x2 = (x) * (x) ; \
334   double xmax2 = (xmax) * (xmax) ; \
335   double xp = 1.0 , xmp = 1.0 ; \
336   int   m =0, mm =0; \
337   double arg_cp2 =0.0, dnm =0.0; \
338   for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \
339   arg_cp2 = xp + xmp ; \
340   dnm = arg_cp2 ; \
341   if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \
342     if ( pw == 1 ) { mm = 1 ; \
343     } else if ( pw == 2 ) { mm = 2 ; \
344     } else if ( pw == 4 ) { mm = 3 ; \
345     } else if ( pw == 8 ) { mm = 4 ; } \
346     for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \
347   } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \
348   dnm = 1.0 / dnm ; \
349   y = (x) * (xmax) * dnm ; \
350   dx = (xmax) * xmp * dnm / arg_cp2 ; \
351   dxmax = (x) * xp * dnm / arg_cp2 ; \
352 }
353 
354 #define Fn_SU_CP3( y , x , xmax , delta , pw , dx , dxmax , ddelta ) { \
355  if(x > xmax - delta && delta >= 0.0) { \
356    double TMF0, TMF1; \
357    TMF1 = x - xmax + delta ; \
358    Fn_CP2( TMF0 , TMF1 , delta , pw , dx , ddelta )     \
359    y = xmax - delta + TMF0 ; \
360    dx = dx ; \
361    dxmax = 1.0-dx ; \
362    ddelta = -1.0+dx+ddelta; \
363  } else { \
364    y = x ; \
365    dx = 1.0 ; \
366    dxmax = 0.0 ; \
367    ddelta = 0.0 ; \
368  } \
369 }
370 
371 #define Fn_SU_CP( y , x , xmax , delta , pw , dx ) { \
372  if(x > xmax - delta && delta >= 0.0) { \
373    double TMF0, TMF1; \
374    TMF1 = x - xmax + delta ; \
375    Fn_CP( TMF0 , TMF1 , delta , pw , dx )  \
376    y = xmax - delta + TMF0 ; \
377    dx = dx ; \
378  } else { \
379    y = x ; \
380    dx = 1.0 ; \
381  } \
382 }
383 
384 #define Fn_SL_CP2( y , x , xmin , delta , pw , dx , dxmin) { \
385  if(x < xmin + delta && delta >= 0.0) { \
386    double TMF0, TMF1; \
387    TMF1 = xmin + delta - x ; \
388    Fn_CP( TMF0 , TMF1 , delta , pw , dx )  \
389    y = xmin + delta - TMF0 ; \
390    dx = dx ; \
391    dxmin = 1.0-dx ; \
392  } else { \
393    y = x ; \
394    dx = 1.0 ; \
395    dxmin = 0.0 ; \
396  } \
397 }
398 #define Fn_SL_CP( y , x , xmin , delta , pw , dx ) { \
399  if(x < xmin + delta && delta >= 0.0) { \
400    double TMF0, TMF1; \
401    TMF1 = xmin + delta - x ; \
402    Fn_CP( TMF0 , TMF1 , delta , pw , dx )  \
403    y = xmin + delta - TMF0 ; \
404    dx = dx ; \
405  } else { \
406    y = x ; \
407    dx = 1.0 ; \
408  } \
409 }
410 
411 
412 
413 /*===========================================================*
414 * Functions for symmetry.
415 *=================*/
416 
417 /*---------------------------------------------------*
418 * Declining function using a polynomial.
419 *-----------------*/
420 
421 #define Fn_DclPoly4( y , x , dx ) { \
422   double TMF2, TMF3, TMF4; \
423   TMF2 = (x) * (x) ; \
424   TMF3 = TMF2 * (x) ; \
425   TMF4 = TMF2 * TMF2 ; \
426   y = 1.0 / ( 1.0 + (x) + TMF2 + TMF3 + TMF4 ) ; \
427   dx = - ( 1.0 + 2.0 * (x) + 3.0 * TMF2 + 4.0 * TMF3 )  * y * y  ; \
428 }
429 
430 /*---------------------------------------------------*
431 * "smoothUpper" uasing a polynomial
432 *-----------------*/
433 
434 #define Fn_SUPoly4( y , x , xmax , dx ) { \
435  double TMF1; \
436  TMF1 = (x) / xmax ; \
437  Fn_DclPoly4( y , TMF1 , dx ) ; \
438  y = xmax * ( 1.0 - y ) ; \
439  dx = - dx ; \
440 }
441 
442 #define Fn_SUPoly4m( y , x , xmax , dx , dxmax ) { \
443  double TMF0, TMF1; \
444  TMF1 = (x) / xmax ; \
445  Fn_DclPoly4( TMF0 , TMF1 , dx ) ; \
446  y = xmax * ( 1.0 - TMF0 ) ; \
447  dxmax = 1.0 - TMF0 + TMF1 * dx ; \
448  dx = - dx ; \
449 }
450 
451 
452 /*---------------------------------------------------*
453 * SymAdd: evaluate additional term for symmetry.
454 *-----------------*/
455 
456 #define Fn_SymAdd( y , x , add0 , dx ) \
457 { \
458     double TMF1, TMF2, TMF3; \
459     TMF1 = 2.0 * ( x ) / ( add0 ) ; \
460     TMF2 = 1.0 + TMF1 * ( (1.0/2) + TMF1 * ( (1.0/6) \
461                + TMF1 * ( (1.0/24) + TMF1 * ( (1.0/120) \
462                + TMF1 * ( (1.0/720) + TMF1 * (1.0/5040) ) ) ) ) ) ; \
463     TMF3 = (1.0/2) + TMF1 * ( (1.0/3) \
464                + TMF1 * ( (1.0/8) + TMF1 * ( (1.0/30) \
465                + TMF1 * ( (1.0/144) + TMF1 * (1.0/840) ) ) ) ) ; \
466     y = add0 / TMF2 ; \
467     dx = - 2.0 * TMF3 / ( TMF2 * TMF2 ) ; \
468 }
469 
470 /*===========================================================*
471 * Function hsm2evaluate.
472 *=================*/
HSM2evaluate(double vds,double vgs,double vbs,double vbs_jct,double vbd_jct,HSM2instance * here,HSM2model * model,CKTcircuit * ckt)473 int HSM2evaluate
474 (
475  double        vds,
476  double        vgs,
477  double        vbs,
478  double        vbs_jct,
479  double        vbd_jct,
480  HSM2instance *here,
481  HSM2model    *model,
482  CKTcircuit   *ckt
483  )
484 {
485   HSM2binningParam *pParam = &here->pParam ;
486   HSM2modelMKSParam *modelMKS = &model->modelMKS ;
487   /*-----------------------------------*
488    * Constants for Smoothing functions
489    *---------------*/
490   const double vth_dlt = 1.0e-3 ;
491   /*  const double cclmmdf = 1.0e-2 ;*/
492   const double cclmmdf = 1.0e-1 ;
493   const double qme_dlt = 1.0e-4 ;
494   const double eef_dlt = 1.0e-2 * C_m2cm ;
495   const double sti2_dlt = 2.0e-3 ;
496   const double pol_dlt = 5.0e-2 ;
497 //const double psia_dlt = 1.0e-3 ;
498 //const double psia2_dlt = 5.0e-3 ;
499   const double psisti_dlt = 5.0e-3 ;
500 //const double jct_dlt = 1.0e-2 ;
501 
502   /*---------------------------------------------------*
503    * Local variables.
504    *-----------------*/
505   /* Constants ----------------------- */
506   const int lp_s0_max = 20 ;
507   const int lp_sl_max = 20 ;
508   const int lp_se_max = 150 ;
509 
510   int lp_bs_max = 10 ;
511   const double Ids_tol = 1.0e-10 ;
512   const double Ids_maxvar = 1.0e-1 ;
513   const double dP_max  = 0.1e0 ;
514   const double ps_conv = 5.0e-13 ;
515   const double ps_conv2 = 1.0e-10 ;
516 
517   /* double  ps_conv = 1.0e-13 ;*/
518   const double gs_conv = 1.0e-8 ;
519   const double mini_current = 1.0e-15 ;
520   /** depletion **/
521   const double znbd3 = 3.0e0 ;
522   const double znbd5 = 5.0e0 ;
523   const double cn_nc3 = C_SQRT_2 / 108e0 ;
524   /* 5-degree, contact:Chi=5 */
525   const double cn_nc51 =  0.707106781186548 ; /* sqrt(2)/2 */
526   const double cn_nc52 = -0.117851130197758 ; /* -sqrt(2)/12 */
527   const double cn_nc53 =  0.0178800506338833 ; /* (187 - 112*sqrt(2))/1600 */
528   const double cn_nc54 = -0.00163730162779191 ; /* (-131 + 88*sqrt(2))/4000 */
529   const double cn_nc55 =  6.36964918866352e-5 ; /* (1509-1040*sqrt(2))/600000 */
530   /** inversion **/
531   /* 3-degree polynomial approx for ( exp[Chi]-1 )^{1/2} */
532   const double cn_im53 =  2.9693154855770998e-1 ;
533   const double cn_im54 = -7.0536542840097616e-2 ;
534   const double cn_im55 =  6.1152888951331797e-3 ;
535   /** initial guess **/
536   const double c_ps0ini_2 = 8.0e-4 ;
537   const double c_pslini_1 = 0.3e0 ;
538   const double c_pslini_2 = 3.0e-2 ;
539 
540   const double VgVt_small = 1.0e-12 ;
541   const double Vbs_min = -10.5e0 ;
542   const double epsm10 = 10.0e0 * C_EPS_M ;
543   const double small = 1.0e-50 ;
544   const double small2 = 1.0e-12 ;  /* for Qover */
545 
546   double Vbs_max = 0.8e0 ;
547   double Vbs_bnd = 0.4e0 ; /* start point of positive Vbs bending */
548   double Gdsmin = 0.0 ;
549   double Gjmin = ckt->CKTgmin ;
550 
551   /* Internal flags  --------------------*/
552   int flg_err = 0 ;  /* error level */
553   int flg_rsrd = 0 ; /* Flag for bias loop accounting Rs and Rd */
554   int flg_iprv = 0 ; /* Flag for initial guess of Ids */
555   int flg_pprv = 0 ; /* Flag for initial guesses of Ps0 and Pds */
556   int flg_noqi =0;     /* Flag for the cases regarding Qi=Qd=0 */
557   int flg_vbsc = 0 ; /* Flag for Vbs confining */
558   int flg_info = 0 ;
559   int flg_conv = 0 ; /* Flag for Poisson loop convergence */
560   int flg_qme = 0 ; /* Flag for QME */
561 
562   /* flag for NQS calculation */
563   int flg_nqs=0 ;
564 
565   /* Important Variables in HiSIM -------*/
566   /* external bias */
567   double Vbse =0.0, Vdse =0.0, Vgse =0.0 ;
568   /* confine bias */
569   double Vbsc =0.0, Vdsc =0.0, Vgsc =0.0 ;
570   double Vbsc_dVbse =1.0, Vbsc_dVbse_dVbs =0.0 ;
571   /* internal bias */
572   double Vbs =0.0, Vds =0.0, Vgs =0.0, Vdb =0.0, Vsb =0.0 ;
573   double Vbs_dVbse = 1.0 , Vbs_dVdse = 0.0 , Vbs_dVgse = 0.0 ;
574   double Vds_dVbse = 0.0 , Vds_dVdse = 1.0 , Vds_dVgse = 0.0 ;
575   double Vgs_dVbse = 0.0 , Vgs_dVdse = 0.0 , Vgs_dVgse = 1.0 ;
576   double Vgp =0.0 ;
577   double Vgp_dVbs =0.0, Vgp_dVds =0.0, Vgp_dVgs =0.0 ;
578   double Vgs_fb =0.0 ;
579   /* Ps0 : surface potential at the source side */
580   double Ps0 =0.0 ;
581   double Ps0_dVbs =0.0, Ps0_dVds =0.0, Ps0_dVgs =0.0 ;
582   double Ps0_ini =0.0, Ps0_iniA =0.0, Ps0_iniB =0.0 ;
583   /* Psl : surface potential at the drain side */
584   double Psl =0.0 ;
585   double Psl_dVbs =0.0, Psl_dVds =0.0, Psl_dVgs =0.0 ;
586   double Psl_lim =0.0, dPlim =0.0 ;
587   /* Pds := Psl - Ps0 */
588   double Pds = 0.0 , Pdsz = 0.0 ;
589   double Pds_dVbs = 0.0, Pds_dVds = 0.0 , Pds_dVgs  = 0.0 ;
590   double Pdsz_dVbs = 0.0, Pdsz_dVds = 0.0 , Pdsz_dVgs  = 0.0 ;
591   double Pds_ini =0.0 ;
592   double Pds_max =0.0 ;
593   /* iteration numbers of Ps0 and Psl equations. */
594   int lp_s0 = 0 , lp_sl = 0 ;
595   /* Xi0 := beta * ( Ps0 - Vbs ) - 1. */
596   double Xi0 =0.0 ;
597   double Xi0_dVbs =0.0, Xi0_dVds =0.0, Xi0_dVgs =0.0 ;
598   double Xi0p12 =0.0 ;
599   double Xi0p12_dVbs =0.0, Xi0p12_dVds =0.0, Xi0p12_dVgs =0.0 ;
600   double Xi0p32 =0.0 ;
601   /* Xil := beta * ( Psl - Vbs ) - 1. */
602   double Xilp12 =0.0 ;
603   double Xilp32 =0.0 ;
604   double Xil =0.0 ;
605   /* modified bias and potential for sym.*/
606   double Vbsz =0.0, Vdsz =0.0, Vgsz =0.0 ;
607   double Vbsz_dVbs =0.0, Vbsz_dVds =0.0 ;
608   double Vdsz_dVds =0.0, Vdsz_dVbs =0.0 ;
609   double Vgsz_dVgs =0.0, Vgsz_dVbs =0.0, Vgsz_dVds =0.0 ;
610   double Vzadd =0.0, Vzadd_dVds =0.0,  Vzadd_dVbs =0.0 ;
611   double Ps0z =0.0, Ps0z_dVbs =0.0, Ps0z_dVds =0.0, Ps0z_dVgs =0.0 ;
612   double Pzadd =0.0, Pzadd_dVbs =0.0, Pzadd_dVds =0.0, Pzadd_dVgs =0.0 ;
613   double Vgpz = 0.0 , Vgpz_dVbs = 0.0 , Vgpz_dVds = 0.0 , Vgpz_dVgs = 0.0 ; /* (tmp) */
614 
615   /* IBPC */
616   double dVbsIBPC =0.0, dVbsIBPC_dVbs =0.0, dVbsIBPC_dVds =0.0, dVbsIBPC_dVgs =0.0 ;
617   double betaWL =0.0, betaWL_dVbs =0.0, betaWL_dVds =0.0, betaWL_dVgs =0.0 ;
618   double Xi0p32_dVbs =0.0, Xi0p32_dVds =0.0, Xi0p32_dVgs =0.0 ;
619   double Xil_dVbs =0.0, Xil_dVds =0.0, Xil_dVgs =0.0 ;
620   double Xilp12_dVbs =0.0, Xilp12_dVds =0.0, Xilp12_dVgs =0.0 ;
621   double Xilp32_dVbs =0.0, Xilp32_dVds =0.0, Xilp32_dVgs =0.0 ;
622   double dG3 =0.0, dG3_dVbs =0.0, dG3_dVds =0.0, dG3_dVgs =0.0 ;
623   double dG4 =0.0, dG4_dVbs =0.0, dG4_dVds =0.0, dG4_dVgs =0.0 ;
624   double dIdd =0.0, dIdd_dVbs =0.0, dIdd_dVds =0.0, dIdd_dVgs =0.0 ;
625 
626   /* Chi := beta * ( Ps{0/l} - Vbs ) */
627   double Chi =0.0 ;
628   double Chi_dVbs =0.0, Chi_dVds =0.0, Chi_dVgs =0.0 ;
629   /* Rho := beta * ( Psl - Vds ) */
630   double Rho =0.0 ;
631   /* threshold voltage */
632   double Vth =0.0 ;
633   double Vth0 =0.0 ;
634   double Vth0_dVb =0.0, Vth0_dVd =0.0, Vth0_dVg =0.0 ;
635   /* variation of threshold voltage */
636   double dVth =0.0 ;
637   double dVth_dVb =0.0, dVth_dVd =0.0, dVth_dVg =0.0 ;
638   double dVth0 =0.0 ;
639   double dVth0_dVb =0.0, dVth0_dVd =0.0, dVth0_dVg =0.0 ;
640   double dVthSC =0.0 ;
641   double dVthSC_dVb =0.0, dVthSC_dVd =0.0, dVthSC_dVg =0.0 ;
642   double Pb20b =0.0 ;
643   double Pb20b_dVg =0.0, Pb20b_dVb =0.0, Pb20b_dVd =0.0 ;
644   double dVthW =0.0 ;
645   double dVthW_dVb =0.0, dVthW_dVd =0.0, dVthW_dVg =0.0 ;
646   /* Alpha and related parameters */
647   double Alpha =0.0 ;
648   double Alpha_dVbs =0.0, Alpha_dVds =0.0, Alpha_dVgs =0.0 ;
649   double Achi =0.0 ;
650   double Achi_dVbs =0.0, Achi_dVds =0.0, Achi_dVgs =0.0 ;
651   double VgVt = 0.0 ;
652   double VgVt_dVbs = 0.0, VgVt_dVds = 0.0, VgVt_dVgs = 0.0 ;
653   double Pslsat = 0.0 ;
654   double Vdsat = 0.0 ;
655   double VdsatS = 0.0 ;
656   double VdsatS_dVbs = 0.0, VdsatS_dVds = 0.0, VdsatS_dVgs = 0.0 ;
657   double Delta =0.0 ;
658   /* Q_B and capacitances */
659   double Qb =0.0, Qb_dVbs =0.0, Qb_dVds =0.0, Qb_dVgs =0.0 ;
660   double Qb_dVbse =0.0, Qb_dVdse =0.0, Qb_dVgse =0.0 ;
661   double Qbu = 0.0 , Qbu_dVbs = 0.0 , Qbu_dVds = 0.0 , Qbu_dVgs = 0.0 ;
662   /* Q_I and capacitances */
663   double Qi =0.0, Qi_dVbs =0.0, Qi_dVds =0.0, Qi_dVgs =0.0 ;
664   double Qi_dVbse =0.0, Qi_dVdse =0.0, Qi_dVgse =0.0 ;
665   double Qiu = 0.0 , Qiu_dVbs = 0.0 , Qiu_dVds = 0.0 , Qiu_dVgs = 0.0 ;
666   /* Q_D and capacitances */
667   double Qd =0.0, Qd_dVbs =0.0, Qd_dVds =0.0, Qd_dVgs =0.0 ;
668   double Qd_dVbse =0.0, Qd_dVdse =0.0, Qd_dVgse =0.0 ;
669   double qd_dVgse=0.0, qd_dVdse=0.0, qd_dVbse=0.0, qd_dVsse =0.0 ;
670   /* channel current */
671   double Ids =0.0 ;
672   double Ids_dVbs =0.0, Ids_dVds =0.0, Ids_dVgs =0.0 ;
673   double Ids_dVbse =0.0, Ids_dVdse =0.0, Ids_dVgse =0.0 ;
674   double Ids0 =0.0 ;
675   double Ids0_dVbs =0.0, Ids0_dVds =0.0, Ids0_dVgs =0.0 ;
676   /* STI */
677   double dVthSCSTI =0.0 ;
678   double dVthSCSTI_dVg =0.0, dVthSCSTI_dVd =0.0, dVthSCSTI_dVb =0.0 ;
679   double Vgssti =0.0 ;
680   double Vgssti_dVbs =0.0, Vgssti_dVds =0.0, Vgssti_dVgs =0.0 ;
681   double costi0 =0.0, costi1 =0.0, costi3 =0.0 ;
682   double costi4 =0.0, costi5 =0.0, costi6 =0.0, costi7 =0.0 ;
683   double costi3_dVb =0.0, costi3_dVd=0.0, costi3_dVg =0.0 ;
684   double costi3_dVb_c3 =0.0, costi3_dVd_c3=0.0, costi3_dVg_c3 =0.0 ;
685   double Psasti =0.0 ;
686   double Psasti_dVbs =0.0, Psasti_dVds =0.0, Psasti_dVgs =0.0 ;
687   double Psbsti =0.0 ;
688   double Psbsti_dVbs =0.0, Psbsti_dVds =0.0, Psbsti_dVgs =0.0 ;
689   double Psab =0.0 ;
690   double Psab_dVbs =0.0, Psab_dVds =0.0, Psab_dVgs =0.0 ;
691   double Psti =0.0 ;
692   double Psti_dVbs =0.0, Psti_dVds =0.0, Psti_dVgs =0.0 ;
693   double sq1sti =0.0 ;
694   double sq1sti_dVbs =0.0, sq1sti_dVds =0.0, sq1sti_dVgs =0.0 ;
695   double sq2sti =0.0 ;
696   double sq2sti_dVbs =0.0, sq2sti_dVds =0.0, sq2sti_dVgs =0.0 ;
697   double Qn0sti =0.0 ;
698   double Qn0sti_dVbs =0.0, Qn0sti_dVds =0.0, Qn0sti_dVgs =0.0 ;
699   double Idssti =0.0 ;
700   double Idssti_dVbs =0.0, Idssti_dVds =0.0, Idssti_dVgs =0.0 ;
701   /* constants */
702   double beta =0.0, beta_inv =0.0 ;
703   double beta2 =0.0 ;
704   double Pb2 =0.0 ;
705   double Pb20 =0.0 ;
706   double Pb2c =0.0 ;
707   double Vfb =0.0 ;
708   double c_eox =0.0 ;
709   double Leff=0.0, Weff =0.0 ;
710   double q_Nsub =0.0 ;
711   /* PART-1 */
712   /* Accumulation zone */
713   double Psa =0.0 ;
714   double Psa_dVbs =0.0, Psa_dVds =0.0, Psa_dVgs =0.0 ;
715   /* CLM*/
716   double Psdl =0.0, Psdl_dVbs =0.0, Psdl_dVds =0.0, Psdl_dVgs =0.0 ;
717   double Lred =0.0, Lred_dVbs =0.0, Lred_dVds =0.0, Lred_dVgs =0.0 ;
718   double Lch =0.0, Lch_dVbs =0.0, Lch_dVds =0.0, Lch_dVgs =0.0 ;
719   double Wd =0.0, Wd_dVbs =0.0, Wd_dVds =0.0, Wd_dVgs =0.0 ;
720   double Aclm =0.0 ;
721   /* Pocket Implant */
722   double Vthp=0.0, Vthp_dVb=0.0, Vthp_dVd=0.0, Vthp_dVg =0.0 ;
723   double dVthLP=0.0, dVthLP_dVb=0.0, dVthLP_dVd=0.0, dVthLP_dVg =0.0 ;
724   double bs12=0.0, bs12_dVb=0.0, bs12_dVd =0.0, bs12_dVg =0.0 ;
725   double Qbmm=0.0, Qbmm_dVb=0.0, Qbmm_dVd =0.0, Qbmm_dVg =0.0 ;
726   double dqb=0.0, dqb_dVb=0.0, dqb_dVg=0.0, dqb_dVd =0.0 ;
727   double Vdx=0.0, Vdx2 =0.0 ;
728   double Vdx_dVbs =0.0, Vdx2_dVbs =0.0 ;
729   double Pbsum=0.0, sqrt_Pbsum =0.0 ;
730   double Pbsum_dVb=0.0, Pbsum_dVd=0.0, Pbsum_dVg =0.0 ;
731   /* Poly-Depletion Effect */
732   const double pol_b = 1.0 ;
733   double dPpg =0.0, dPpg_dVb =0.0, dPpg_dVd =0.0, dPpg_dVg =0.0;
734   /* Quantum Effect */
735   double Tox =0.0, Tox_dVb =0.0, Tox_dVd =0.0, Tox_dVg =0.0 ;
736   double dTox =0.0, dTox_dVb =0.0, dTox_dVd =0.0, dTox_dVg =0.0 ;
737   double Cox =0.0, Cox_dVb =0.0, Cox_dVd =0.0, Cox_dVg =0.0 ;
738   double Cox_inv =0.0, Cox_inv_dVb =0.0, Cox_inv_dVd =0.0, Cox_inv_dVg =0.0 ;
739   double Tox0 =0.0, Cox0 =0.0, Cox0_inv =0.0 ;
740   double Vthq=0.0, Vthq_dVb =0.0, Vthq_dVd =0.0 ;
741   /* Igate , Igidl , Igisl */
742   const double igate_dlt = 1.0e-2 ;
743   double Psdlz =0.0, Psdlz_dVbs =0.0, Psdlz_dVds =0.0, Psdlz_dVgs =0.0 ;
744   double Egp12 =0.0, Egp32 =0.0 ;
745   double E1 =0.0, E1_dVb =0.0, E1_dVd =0.0, E1_dVg =0.0 ;
746   double Qb0Cox =0.0, Qb0Cox_dVb =0.0, Qb0Cox_dVd =0.0, Qb0Cox_dVg =0.0 ;
747   double Etun =0.0, Etun_dVbs =0.0, Etun_dVds =0.0, Etun_dVgs =0.0 ;
748   double Egidl =0.0, Egidl_dVb =0.0, Egidl_dVd =0.0, Egidl_dVg =0.0 ;
749   double Egisl =0.0, Egisl_dVb =0.0, Egisl_dVd =0.0, Egisl_dVg =0.0 ;
750   double Igate =0.0, Igate_dVbs =0.0, Igate_dVds =0.0, Igate_dVgs =0.0 ;
751   double Igate_dVbse =0.0, Igate_dVdse =0.0, Igate_dVgse =0.0 ;
752   double Igs =0.0, Igd =0.0, Igb =0.0 ;
753   double Igs_dVbs =0.0, Igs_dVds =0.0, Igs_dVgs =0.0 ;
754   double Igs_dVbse =0.0, Igs_dVdse =0.0, Igs_dVgse =0.0 ;
755   double Igd_dVbs =0.0, Igd_dVds =0.0, Igd_dVgs =0.0 ;
756   double Igd_dVbse =0.0, Igd_dVdse =0.0, Igd_dVgse =0.0 ;
757   double Igb_dVbs =0.0, Igb_dVds =0.0, Igb_dVgs =0.0 ;
758   double Igb_dVbse =0.0, Igb_dVdse =0.0, Igb_dVgse =0.0 ;
759   double Igidl =0.0, Igidl_dVbs =0.0, Igidl_dVds =0.0, Igidl_dVgs =0.0 ;
760   double Igidl_dVbse =0.0, Igidl_dVdse =0.0, Igidl_dVgse =0.0 ;
761   double Igisl =0.0, Igisl_dVbs =0.0, Igisl_dVds =0.0, Igisl_dVgs =0.0 ;
762   double Igisl_dVbse =0.0, Igisl_dVdse =0.0, Igisl_dVgse =0.0 ;
763   /* connecting function */
764   double FD2 =0.0, FD2_dVbs =0.0, FD2_dVds =0.0, FD2_dVgs =0.0 ;
765   double FMDVDS =0.0, FMDVDS_dVbs =0.0, FMDVDS_dVds =0.0, FMDVDS_dVgs =0.0 ;
766 
767   double cnst0 =0.0, cnst1 =0.0 ;
768   double cnstCoxi =0.0 , cnstCoxi_dVg =0.0 , cnstCoxi_dVd =0.0 , cnstCoxi_dVb =0.0 ;
769   double fac1 =0.0 ;
770   double fac1_dVbs =0.0, fac1_dVds =0.0, fac1_dVgs =0.0 ;
771   double fac1p2 =0.0 ;
772   double fs01 =0.0 ;
773   double fs01_dPs0 =0.0 ;
774   double fs01_dVbs =0.0, fs01_dVds =0.0, fs01_dVgs =0.0 ;
775   double fs02 =0.0 ;
776   double fs02_dPs0 =0.0 ;
777   double fs02_dVbs =0.0, fs02_dVds =0.0, fs02_dVgs =0.0 ;
778   double fsl1 =0.0 ;
779   double fsl1_dPsl =0.0 ;
780   double fsl1_dVbs =0.0, fsl1_dVds =0.0, fsl1_dVgs =0.0; /* Vdseff */
781   double fsl2 =0.0 ;
782   double fsl2_dPsl =0.0 ;
783   double fsl2_dVbs =0.0, fsl2_dVds =0.0, fsl2_dVgs =0.0; /* Vdseff */
784   double cfs1 =0.0 ;
785   double fb =0.0, fb_dChi =0.0 ;
786   double fi =0.0, fi_dChi =0.0 ;
787   double exp_Chi =0.0, exp_Rho =0.0, exp_bVbs =0.0, exp_bVbsVds =0.0 ;
788   double Fs0=0.0, Fsl =0.0 ;
789   double Fs0_dPs0 =0.0, Fsl_dPsl =0.0 ;
790   double dPs0 =0.0, dPsl =0.0 ;
791   double Qn0 = 0.0e0 ;
792   double Qn0_dVbs =0.0, Qn0_dVds =0.0, Qn0_dVgs =0.0 ;
793   double Qb0 =0.0 ;
794   double Qb0_dVb =0.0, Qb0_dVd =0.0, Qb0_dVg =0.0 ;
795   double Qbnm =0.0 ;
796   double Qbnm_dVbs =0.0, Qbnm_dVds =0.0, Qbnm_dVgs =0.0 ;
797   double DtPds =0.0 ;
798   double DtPds_dVbs =0.0, DtPds_dVds =0.0, DtPds_dVgs =0.0 ;
799   double Qinm =0.0 ;
800   double Qinm_dVbs =0.0, Qinm_dVds =0.0, Qinm_dVgs =0.0 ;
801   double Qidn =0.0 ;
802   double Qidn_dVbs =0.0, Qidn_dVds =0.0, Qidn_dVgs =0.0 ;
803   double Qdnm =0.0 ;
804   double Qdnm_dVbs =0.0, Qdnm_dVds =0.0, Qdnm_dVgs =0.0 ;
805   double Qddn =0.0 ;
806   double Qddn_dVbs =0.0, Qddn_dVds =0.0, Qddn_dVgs =0.0 ;
807   double Quot =0.0 ;
808   double Qdrat = 0.5 ;
809   double Qdrat_dVbs = 0.0 , Qdrat_dVds = 0.0, Qdrat_dVgs = 0.0 ;
810   double Qdrat_dVbse =0.0, Qdrat_dVdse =0.0, Qdrat_dVgse =0.0 ;
811   double Idd =0.0 ;
812   double Idd_dVbs =0.0, Idd_dVds =0.0, Idd_dVgs =0.0 ;
813   double Fdd =0.0 ;
814   double Fdd_dVbs =0.0, Fdd_dVds =0.0, Fdd_dVgs =0.0 ;
815   double Eeff =0.0 ;
816   double Eeff_dVbs =0.0, Eeff_dVds =0.0, Eeff_dVgs =0.0 ;
817   double Rns =0.0 ;
818   double Mu = 0.0 ;
819   double Mu_dVbs =0.0, Mu_dVds =0.0, Mu_dVgs =0.0 ;
820   double Muun =0.0, Muun_dVbs =0.0, Muun_dVds =0.0, Muun_dVgs =0.0 ;
821   double Ey = 0e0 ;
822   double Ey_dVbs =0.0, Ey_dVds =0.0, Ey_dVgs =0.0 ;
823   double Em =0.0 ;
824   double Em_dVbs =0.0, Em_dVds =0.0, Em_dVgs =0.0 ;
825   double Vmax =0.0 ;
826   double Eta =0.0 ;
827   double Eta_dVbs =0.0, Eta_dVds =0.0, Eta_dVgs =0.0 ;
828   double Eta1 =0.0, Eta1p12 =0.0, Eta1p32 =0.0, Eta1p52 =0.0 ;
829   double Zeta12 =0.0, Zeta32 =0.0, Zeta52 =0.0 ;
830   double F00 =0.0 ;
831   double F00_dVbs =0.0, F00_dVds =0.0, F00_dVgs =0.0 ;
832   double F10 =0.0 ;
833   double F10_dVbs =0.0, F10_dVds =0.0, F10_dVgs =0.0 ;
834   double F30 =0.0 ;
835   double F30_dVbs =0.0, F30_dVds =0.0, F30_dVgs =0.0 ;
836   double F11 =0.0 ;
837   double F11_dVbs =0.0, F11_dVds =0.0, F11_dVgs =0.0 ;
838   double Ps0_min =0.0 ;
839   double Ps0_min_dVbs =0.0, Ps0_min_dVds =0.0, Ps0_min_dVgs =0.0 ;
840   double Acn =0.0, Acd =0.0, Ac1 =0.0, Ac2 =0.0, Ac3 =0.0, Ac4 =0.0, Ac31 =0.0, Ac41 =0.0 ;
841   double Acn_dVbs =0.0, Acn_dVds =0.0, Acn_dVgs =0.0 ;
842   double Acd_dVbs =0.0, Acd_dVds =0.0, Acd_dVgs =0.0 ;
843   double Ac1_dVbs =0.0, Ac1_dVds =0.0, Ac1_dVgs =0.0 ;
844   double Ac2_dVbs =0.0, Ac2_dVds =0.0, Ac2_dVgs =0.0 ;
845   double Ac3_dVbs =0.0, Ac3_dVds =0.0, Ac3_dVgs =0.0 ;
846   double Ac4_dVbs =0.0, Ac4_dVds =0.0, Ac4_dVgs =0.0 ;
847   double Ac31_dVbs =0.0, Ac31_dVds =0.0, Ac31_dVgs =0.0 ;
848   /* PART-2 (Isub) */
849   double Isub =0.0 ;
850   double Isub_dVbs =0.0, Isub_dVds =0.0, Isub_dVgs =0.0 ;
851   double Isub_dVbse =0.0, Isub_dVdse =0.0, Isub_dVgse =0.0 ;
852   double Psislsat=0.0, Psisubsat =0.0 ;
853   double Psislsat_dVd=0.0, Psislsat_dVg=0.0, Psislsat_dVb =0.0 ;
854   double Psisubsat_dVd=0.0, Psisubsat_dVg=0.0, Psisubsat_dVb =0.0 ;
855   /* PART-3 (overlap) */
856   double cov_slp =0.0, cov_mag =0.0, covvg =0.0, covvg_dVgs =0.0 ;
857   double Lov =0.0 ;
858   double Qgos = 0.0, Qgos_dVbs = 0.0, Qgos_dVds = 0.0, Qgos_dVgs = 0.0 ;
859   double Qgos_dVbse =0.0, Qgos_dVdse =0.0, Qgos_dVgse =0.0 ;
860   double Qgod = 0.0, Qgod_dVbs = 0.0, Qgod_dVds = 0.0, Qgod_dVgs = 0.0 ;
861   double Qgod_dVbse =0.0, Qgod_dVdse =0.0, Qgod_dVgse =0.0 ;
862 
863   int flg_overgiven =0 ;
864 
865   double Qgbo =0.0, Qgbo_dVbs =0.0, Qgbo_dVds =0.0, Qgbo_dVgs =0.0 ;
866   double Qgbo_dVbse =0.0, Qgbo_dVdse =0.0, Qgbo_dVgse =0.0 ;
867   double Cggo = 0.0 , Cgdo = 0.0 , Cgso = 0.0 , Cgbo = 0.0 , Cgbo_loc=0.0 ;
868   /* fringing capacitance */
869   double Cf =0.0 ;
870   double Qfd =0.0, Qfs =0.0 ;
871   /* Cqy */
872   double Ec =0.0, Ec_dVbs =0.0, Ec_dVds =0.0, Ec_dVgs =0.0 ;
873   double Pslk =0.0, Pslk_dVbs =0.0, Pslk_dVds =0.0, Pslk_dVgs =0.0 ;
874   double Qy =0.0 ;
875   double Cqyd=0.0, Cqyg=0.0, Cqys=0.0, Cqyb =0.0 ;
876   double Qy_dVbs =0.0, Qy_dVds =0.0, Qy_dVgs=0.0 ;
877   double Qy_dVbse =0.0, Qy_dVdse=0.0, Qy_dVgse=0.0 ;
878   double Qys=0.0, Qys_dVbse =0.0, Qys_dVdse=0.0, Qys_dVgse=0.0 ;
879   /* PART-4 (junction diode) */
880   double Ibs =0.0, Ibd =0.0, Gbs =0.0, Gbd =0.0, Gbse =0.0, Gbde =0.0 ;
881   /* junction capacitance */
882   double Qbs =0.0, Qbd =0.0, Capbs =0.0, Capbd =0.0, Capbse =0.0, Capbde =0.0 ;
883   double czbd =0.0, czbdsw =0.0, czbdswg =0.0, czbs =0.0, czbssw =0.0, czbsswg =0.0 ;
884   double arg =0.0, sarg =0.0 ;
885   /* PART-5 (NQS) */
886   double tau=0.0, Qi_prev =0.0;
887   double tau_dVgs=0.0, tau_dVds=0.0, tau_dVbs =0.0 ;
888   double tau_dVgse=0.0, tau_dVdse=0.0, tau_dVbse =0.0 ;
889   double Qi_nqs =0.0 ;
890   double Qi_dVbs_nqs=0.0, Qi_dVds_nqs=0.0, Qi_dVgs_nqs =0.0 ;
891   double Qi_dVbse_nqs=0.0, Qi_dVdse_nqs=0.0, Qi_dVgse_nqs =0.0 ;
892   double taub=0.0, Qb_prev =0.0;
893   double taub_dVgs=0.0, taub_dVds=0.0, taub_dVbs =0.0 ;
894   double taub_dVgse=0.0, taub_dVdse=0.0, taub_dVbse =0.0 ;
895   double Qb_nqs =0.0 ;
896   double Qb_dVbs_nqs=0.0, Qb_dVds_nqs=0.0, Qb_dVgs_nqs =0.0 ;
897   double Qb_dVbse_nqs=0.0, Qb_dVdse_nqs=0.0, Qb_dVgse_nqs =0.0 ;
898   /* PART-6 (noise) */
899   /* 1/f */
900   double NFalp =0.0, NFtrp =0.0, Cit =0.0, Nflic =0.0 ;
901   double Qi_noi =0.0 , Qiu_noi =0.0 ;
902   /* thermal */
903   double Eyd=0.0, Mu_Ave=0.0, Nthrml=0.0, Mud_hoso =0.0 ;
904   /* induced gate noise ( Part 0/3 ) */
905   double kusai00 =0.0, kusaidd =0.0, kusaiL =0.0, kusai00L =0.0 ;
906   int flg_ign = 0 ;
907   double sqrtkusaiL =0.0, kusai_ig =0.0, gds0_ign =0.0, gds0_h2 =0.0, GAMMA =0.0, crl_f =0.0 ;
908   const double c_sqrt_15 = 3.872983346207417e0 ; /* sqrt(15) */
909   const double Cox_small = 1.0e-6 ;
910   const double c_16o135 = 1.185185185185185e-1 ; /* 16/135 */
911   double Nign0 =0.0, MuModA =0.0, MuModB =0.0, correct_w1 =0.0 ;
912 
913   /* Bias iteration accounting Rs/Rd */
914   int lp_bs =0 ;
915   double Ids_last =0.0 ;
916   double vtol_iprv = 2.0e-1 ;
917   double vtol_pprv = 1.01e-1 ;
918   double Vbsc_dif =0.0, Vdsc_dif =0.0, Vgsc_dif =0.0, sum_vdif =0.0 ;
919   double Vbsc_dif2 =0.0, Vdsc_dif2 =0.0, Vgsc_dif2 =0.0, sum_vdif2 =0.0 ;
920   double Rs =0.0, Rd =0.0 ;
921   double Fbs =0.0, Fds =0.0, Fgs =0.0 ;
922   double DJ =0.0, DJI =0.0 ;
923   double JI11 =0.0, JI12 =0.0, JI13 =0.0, JI21 =0.0, JI22 =0.0, JI23 =0.0, JI31 =0.0, JI32 =0.0, JI33 =0.0 ;
924   double dVbs =0.0, dVds =0.0, dVgs =0.0 ;
925   double dV_sum =0.0 ;
926   /* temporary vars. */
927   double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9 = 0.0, T10 = 0.0, T11 = 0.0, T12 ;
928   double TX =0.0, TX_dVbs =0.0, TX_dVds =0.0, TX_dVgs =0.0 ;
929   double TY =0.0, TY_dVbs =0.0, TY_dVds =0.0, TY_dVgs =0.0 ;
930   double T1_dVb =0.0, T1_dVd =0.0, T1_dVg =0.0 ;
931   double T2_dVb =0.0, T2_dVd =0.0, T2_dVg =0.0 ;
932   double T3_dVb =0.0, T3_dVd =0.0, T3_dVg =0.0 ;
933   double T4_dVb =0.0, T4_dVd =0.0, T4_dVg =0.0 ;
934   double T5_dVb =0.0, T5_dVd =0.0, T5_dVg =0.0 ;
935   double T6_dVb =0.0, T6_dVd =0.0, T6_dVg =0.0 ;
936   double T7_dVb =0.0, T7_dVd =0.0, T7_dVg =0.0 ;
937   double T8_dVb =0.0, T8_dVd =0.0, T8_dVg =0.0 ;
938   double T9_dVb =0.0, T9_dVd =0.0, T9_dVg =0.0 ;
939   double T10_dVb =0.0, T10_dVd =0.0, T10_dVg =0.0 ;
940   double T15, T16, T17 ;
941 
942   int   flg_zone = 0 ;
943 
944   /* Vdseff */
945   double Vdseff =0.0, Vdsorg =0.0 ;
946   double Vdseff_dVbs =0.0, Vdseff_dVds =0.0, Vdseff_dVgs =0.0 ;
947 
948   /* G/S and G/D Overlap Charges: Qovs/Qovd */
949   double Qovd = 0.0, Qovd_dVbse = 0.0, Qovd_dVdse = 0.0, Qovd_dVgse = 0.0 ;
950   double Qovd_dVbs = 0.0, Qovd_dVds = 0.0, Qovd_dVgs = 0.0 ;
951   double Qovs = 0.0, Qovs_dVbse = 0.0, Qovs_dVdse = 0.0, Qovs_dVgse = 0.0 ;
952   double Qovs_dVbs = 0.0, Qovs_dVds = 0.0, Qovs_dVgs = 0.0 ;
953   int    lcover = 0, flg_ovloops = 0, flg_ovloopd = 0 ;
954   int    flg_overs = 0, flg_overd = 0 ;
955   double VgpLD =0.0 ;
956   double QbdLD = 0.0 , QbdLD_dVbs = 0.0 , QbdLD_dVds = 0.0 , QbdLD_dVgs = 0.0 ;
957   double QidLD = 0.0 , QidLD_dVbs = 0.0 , QidLD_dVds = 0.0 , QidLD_dVgs = 0.0 ;
958   double QbsLD = 0.0 , QbsLD_dVbs = 0.0 , QbsLD_dVds = 0.0 , QbsLD_dVgs = 0.0 ;
959   double QisLD = 0.0 , QisLD_dVbs = 0.0 , QisLD_dVds = 0.0 , QisLD_dVgs = 0.0 ;
960   double QbdLD_dVbse = 0.0 , QbdLD_dVdse = 0.0 , QbdLD_dVgse = 0.0 ;
961   double QidLD_dVbse = 0.0 , QidLD_dVdse = 0.0 , QidLD_dVgse = 0.0 ;
962   double QbsLD_dVbse = 0.0 , QbsLD_dVdse = 0.0 , QbsLD_dVgse = 0.0 ;
963   double QisLD_dVbse = 0.0 , QisLD_dVdse = 0.0 , QisLD_dVgse = 0.0 ;
964   double QbuLD = 0.0 , QbuLD_dVbs = 0.0 , QbuLD_dVds = 0.0 , QbuLD_dVgs = 0.0 ;
965   double QsuLD = 0.0 , QsuLD_dVbs = 0.0 , QsuLD_dVds = 0.0 , QsuLD_dVgs = 0.0 ;
966   double QiuLD = 0.0 , QiuLD_dVbs = 0.0 , QiuLD_dVds = 0.0 , QiuLD_dVgs = 0.0 ;
967   double Ps0LD = 0.0 , Ps0LD_dVds = 0.0 ;
968   double QbuLD_dVxb = 0.0 , QbuLD_dVgb = 0.0 ;
969   double QsuLD_dVxb = 0.0 , QsuLD_dVgb = 0.0 ;
970   int   flg_ovzone = 0 ;
971 
972   /* Vgsz for SCE and PGD */
973   double Vbsz2 =0.0, Vbsz2_dVbs =0.0, Vbsz2_dVds =0.0, Vbsz2_dVgs =0.0 ;
974 
975   /* Multiplication factor of a MOSFET instance */
976   double M = 1.0 ;
977 
978   /* Mode flag ( = 0 | 1 )  */
979   double ModeNML =0.0, ModeRVS =0.0 ;
980 
981   /* For Gate Leak Current Partitioning */
982   double GLPART1 ;
983   double GLPART1_dVgs=0.0, GLPART1_dVds=0.0, GLPART1_dVbs =0.0;
984   double GLPART1_dVgse=0.0, GLPART1_dVdse=0.0, GLPART1_dVbse =0.0;
985 
986   /* IBPC */
987   double IdsIBPC = 0.0 ;
988   double IdsIBPC_dVbs = 0.0 , IdsIBPC_dVds = 0.0 , IdsIBPC_dVgs = 0.0 ;
989   double IdsIBPC_dVbse = 0.0 , IdsIBPC_dVdse = 0.0 , IdsIBPC_dVgse = 0.0 ;
990 
991   /* Overlap Charge: Qover */
992   double Vbsgmt =0.0, Vdsgmt =0.0, Vgsgmt =0.0, Vdbgmt =0.0, Vgbgmt =0.0, Vsbgmt =0.0, Vxbgmt =0.0 ;
993   double Vxbgmtcl = 0.0, Vxbgmtcl_dVxbgmt = 0.0 ;
994 
995   double Pb2over =0.0 ;
996 
997   /* Qover Iterative and Analytical Model */
998   const double large_arg = 80 ;
999   int lp_ld =0 ;
1000   double T1_dVxb=0.0, T1_dVgb=0.0, T5_dVxb=0.0, T5_dVgb =0.0 ;
1001   double Vgb_fb_LD=0.0,  VgpLD_dVgb =0.0 ;
1002   double VgpLD_shift=0.0, VgpLD_shift_dVxb=0.0, VgpLD_shift_dVgb =0.0 ;
1003   double TX_dVxb=0.0, TX_dVgb=0.0, TY_dVxb=0.0, TY_dVgb =0.0 ;
1004   double Ac1_dVxb=0.0, Ac1_dVgb=0.0, Ac2_dVxb=0.0, Ac2_dVgb =0.0 ;
1005   double Ac3_dVxb=0.0, Ac3_dVgb=0.0, Ac31_dVxb=0.0, Ac31_dVgb =0.0;
1006   double Acd_dVxb=0.0, Acd_dVgb=0.0, Acn_dVxb=0.0, Acn_dVgb =0.0;
1007   double Ta = 9.3868e-3, Tb = -0.1047839 ;
1008   double Tc=0.0, Tp =0.0 ;
1009   double Td=0.0, Td_dVxb=0.0, Td_dVgb =0.0 ;
1010   double Tq=0.0, Tq_dVxb=0.0, Tq_dVgb =0.0 ;
1011   double Tu=0.0, Tu_dVxb=0.0, Tu_dVgb =0.0 ;
1012   double Tv=0.0, Tv_dVxb=0.0, Tv_dVgb =0.0 ;
1013   double exp_bVbs_dVxb=0.0, exp_bPs0 =0.0 ;
1014   double cnst1over =0.0;
1015   double gamma=0.0, gamma_dVxb =0.0;
1016   double Chi_dVxb=0.0, Chi_dVgb =0.0 ;
1017   double Chi_A=0.0, Chi_A_dVxb=0.0, Chi_A_dVgb =0.0 ;
1018   double Chi_B=0.0, Chi_B_dVxb=0.0, Chi_B_dVgb =0.0 ;
1019   double Chi_1=0.0, Chi_1_dVxb=0.0, Chi_1_dVgb =0.0 ;
1020   double psi_B=0.0, arg_B =0.0 ;
1021   double psi=0.0, psi_dVgb=0.0, psi_dVxb =0.0 ;
1022   double Ps0_iniA_dVxb=0.0, Ps0_iniA_dVgb =0.0 ;
1023   double Ps0_iniB_dVxb=0.0, Ps0_iniB_dVgb =0.0 ;
1024   double Psa_dVxb=0.0, Psa_dVgb=0.0, Ps0LD_dVxb=0.0, Ps0LD_dVgb =0.0 ;
1025   double fs02_dVxb=0.0, fs02_dVgb =0.0 ;
1026 
1027   /* SCE LOOP */
1028   double A =0.0, A_dVgs=0.0, A_dVds=0.0, A_dVbs =0.0 ;
1029   int    NNN =0 ;
1030   double PS0_SCE=0 ,  PS0_SCE_dVgs = 0 ,  PS0_SCE_dVds = 0 ,  PS0_SCE_dVbs = 0 ;
1031   double PS0Z_SCE=0 , PS0Z_SCE_dVgs = 0 , PS0Z_SCE_dVds = 0 , PS0Z_SCE_dVbs = 0 ;
1032    /* double arg0 = 0.01 , arg1 = 0.04 ; */
1033    double arg0 = 0.01 ;
1034    double arg2 = here->HSM2_2qnsub_esi * 1.0e-4 ;
1035    int MAX_LOOP_SCE =0 ;
1036 
1037   int codqb = 0 ;
1038   int corecip = model->HSM2_corecip ;
1039   int START_OF_SCE_LOOP = 1 , end_of_part_1 = 0 ;
1040 
1041 
1042   /* modify Qy in accumulation region */
1043   double Aclm_eff=0.0, Aclm_eff_dVds=0.0, Aclm_eff_dVgs=0.0, Aclm_eff_dVbs =0.0 ;
1044 
1045   double Idd1 =0.0, Idd1_dVbs =0.0,  Idd1_dVgs =0.0,  Idd1_dVds =0.0 ;
1046 
1047   double tcjbs=0.0, tcjbssw=0.0, tcjbsswg=0.0,
1048          tcjbd=0.0, tcjbdsw=0.0, tcjbdswg=0.0 ;
1049   double TTEMP =0.0 ;
1050 
1051   double PS0_SCE_tol = 4.0e-7 ;
1052   double PS0_SCE_deriv_tol = 1.0e-8 ;
1053   double Ps0_ini_dVds  =0.0,  Ps0_ini_dVgs =0.0, Ps0_ini_dVbs  =0.0 ;
1054   double Ps0_iniA_dVds =0.0, Ps0_iniA_dVgs =0.0, Ps0_iniA_dVbs =0.0 ;
1055   double Ps0_iniB_dVds =0.0, Ps0_iniB_dVgs =0.0, Ps0_iniB_dVbs =0.0 ;
1056 
1057   double A_dPS0Z = 0.0,      dqb_dPS0Z = 0.0,    dVth_dPS0Z = 0.0,   dVth0_dPS0Z = 0.0,
1058          dVthLP_dPS0Z = 0.0, dVthSC_dPS0Z = 0.0, Qbmm_dPS0Z = 0.0,
1059          Vgp_dPS0Z = 0.0,    Vgpz_dPS0Z = 0.0,                       Vthp_dPS0Z = 0.0,
1060          Vth0_dPS0Z = 0.0 ;
1061   double T1_dPS0Z=0.0,           T3_dPS0Z=0.0,           T4_dPS0Z=0.0,           T5_dPS0Z=0.0,
1062          T6_dPS0Z=0.0,           T7_dPS0Z=0.0,           T8_dPS0Z=0.0,           T9_dPS0Z=0.0,
1063          T10_dPS0Z=0.0,          TX_dPS0Z =0.0 ;
1064   double Ac1_dPS0Z=0.0,          Ac2_dPS0Z=0.0,          Ac3_dPS0Z=0.0,          Ac31_dPS0Z=0.0,
1065          Acd_dPS0Z=0.0,          Acn_dPS0Z=0.0,          Chi_dPS0Z=0.0,          Psa_dPS0Z =0.0 ;
1066   double Fs0_dPS0Z=0.0,          Fsl_dPS0Z=0.0,          Ps0_dPS0Z=0.0,          Psl_dPS0Z=0.0,
1067          Pds_dPS0Z=0.0,          Pzadd_dPS0Z=0.0,        Ps0z_dPS0Z =0.0 ;
1068   double G=0.0,                  delta_PS0Z_SCE=0.0,     delta_PS0Z_SCE_dVds=0.0,
1069          delta_PS0Z_SCE_dVgs=0.0, delta_PS0Z_SCE_dVbs =0.0 ;
1070 
1071 
1072   double Vgs_min =0.0 ;
1073 
1074 
1075   /*================ Start of executable code.=================*/
1076 
1077   if (here->HSM2_mode == HiSIM_NORMAL_MODE) {
1078     ModeNML = 1.0 ;
1079     ModeRVS = 0.0 ;
1080   } else {
1081     ModeNML = 0.0 ;
1082     ModeRVS = 1.0 ;
1083   }
1084 
1085   T1 = vbs + vds + vgs + vbd_jct + vbs_jct ;
1086   if ( ! finite (T1) ) {
1087     fprintf (stderr ,
1088        "*** warning(HiSIM): Unacceptable Bias(es).\n" ) ;
1089     fprintf (stderr , "----- bias information (HiSIM)\n" ) ;
1090     fprintf (stderr , "name: %s\n" , here->HSM2name ) ;
1091     fprintf (stderr , "states: %d\n" , here->HSM2states ) ;
1092     fprintf (stderr , "vds= %12.5e vgs=%12.5e vbs=%12.5e\n"
1093             , vds , vgs , vbs ) ;
1094     fprintf (stderr , "vbs_jct= %12.5e vbd_jct= %12.5e\n"
1095             , vbs_jct , vbd_jct ) ;
1096     fprintf (stderr , "vd= %12.5e vg= %12.5e vb= %12.5e vs= %12.5e\n"
1097             , *( ckt->CKTrhsOld + here->HSM2dNodePrime )
1098             , *( ckt->CKTrhsOld + here->HSM2gNodePrime )
1099             , *( ckt->CKTrhsOld + here->HSM2bNodePrime )
1100             , *( ckt->CKTrhsOld + here->HSM2sNodePrime )  ) ;
1101     if ( here->HSM2_called >= 1 ) {
1102       fprintf (stderr , "vdsc_prv= %12.5e vgsc_prv=%12.5e vbsc_prv=%12.5e\n"
1103               , here->HSM2_vdsc_prv , here->HSM2_vgsc_prv
1104               , here->HSM2_vbsc_prv ) ;
1105     }
1106     fprintf (stderr , "----- bias information (end)\n" ) ;
1107     return ( HiSIM_ERROR ) ;
1108   }
1109 
1110   flg_info = model->HSM2_info ;
1111   flg_nqs = model->HSM2_conqs ;
1112 
1113   /*-----------------------------------------------------------*
1114    * Start of the routine. (label)
1115    *-----------------*/
1116 /*start_of_routine:*/
1117 
1118   TTEMP = ckt->CKTtemp ;
1119   if ( here->HSM2_dtemp_Given ) { TTEMP = TTEMP + here->HSM2_dtemp ; }
1120 
1121   beta = here->HSM2_beta ;
1122 
1123   /* Inverse of the thermal voltage */
1124   beta_inv = here->HSM2_beta_inv ;
1125   beta2 = here->HSM2_beta2 ;
1126 
1127   /* Bandgap */
1128   Egp12 = here->HSM2_egp12 ;
1129   Egp32 = here->HSM2_egp32 ;
1130 
1131   /* Metallurgical channel geometry */
1132   Leff = here->HSM2_leff ;
1133   Weff = here->HSM2_weff ;
1134 
1135   /* Flat band voltage */
1136   Vfb = pParam->HSM2_vfbc ;
1137 
1138   /* Surface impurity profile */
1139   q_Nsub = here->HSM2_qnsub ;
1140 
1141   /* Velocity Temperature Dependence */
1142   Vmax = here->HSM2_vmax ;
1143 
1144   /* 2 phi_B */
1145   Pb2 = here->HSM2_pb2 ;
1146   Pb20 = here->HSM2_pb20 ;
1147   Pb2c = here->HSM2_pb2c ;
1148 
1149   /* Coefficient of the F function for bulk charge */
1150   cnst0 = here->HSM2_cnst0 ;
1151 
1152   /* cnst1: n_{p0} / p_{p0} */
1153   cnst1 = here->HSM2_cnst1 ;
1154 
1155   /* c_eox: Permitivity in ox  */
1156   c_eox = here->HSM2_cecox ;
1157 
1158   /* Tox and Cox without QME */
1159    Tox0 = model->HSM2_tox ;
1160    Cox0 = c_eox / Tox0 ;
1161    Cox0_inv = 1.0 / Cox0 ;
1162 
1163   /* for calculation of Ps0_min */
1164   Vgs_min = model->HSM2_type * model->HSM2_Vgsmin ;
1165 
1166   /*-----------------------------------------------------------*
1167    * Exchange bias conditions according to MOS type.
1168    * - Vxse are external biases for HiSIM. ( type=NMOS , Vds >= 0
1169    *   are assumed.)
1170    *-----------------*/
1171   Vbse = vbs ;
1172   Vdse = vds ;
1173   Vgse = vgs ;
1174 
1175   /*---------------------------------------------------*
1176    * Clamp too large biases.
1177    * -note: Quantities are extrapolated in PART-5.
1178    *-----------------*/
1179 
1180   if ( Pb2 - model->HSM2_vzadd0 < Vbs_max ) {
1181     Vbs_max = Pb2 - model->HSM2_vzadd0 ;
1182   }
1183   if ( Pb20 - model->HSM2_vzadd0 < Vbs_max ) {
1184     Vbs_max = Pb20 - model->HSM2_vzadd0 ;
1185   }
1186   if ( Pb2c - model->HSM2_vzadd0 < Vbs_max ) {
1187     Vbs_max = Pb2c - model->HSM2_vzadd0 ;
1188   }
1189 
1190   if ( Vbs_bnd > Vbs_max * 0.5 ) {
1191     Vbs_bnd = 0.5 * Vbs_max ;
1192   }
1193 
1194   if ( Vbse > Vbs_bnd ) {
1195     flg_vbsc = 1 ;
1196     T1 = Vbse - Vbs_bnd ;
1197     T2 = Vbs_max - Vbs_bnd ;
1198     Fn_SUPoly4m( TY , T1 , T2 , Vbsc_dVbse , T0 ) ;
1199     Vbsc = Vbs_bnd + TY ;
1200 
1201     T3 = 1 / T2 ;
1202     /* x/xmax */
1203     T4 = T1 * T3 ;
1204     T4_dVb = T3 ;
1205 
1206     T5 = T4 * T4;
1207     T5_dVb = 2 * T4_dVb * T4 ;
1208     T15 = 2 * T4_dVb * T4_dVb ; /* T15 = T5_dVb_dVb */
1209 
1210     T6 = T4 * T5 ;
1211     T6_dVb = T4_dVb * T5 + T4 * T5_dVb ;
1212     T16 = T4_dVb * T5_dVb + T4_dVb * T5_dVb + T4 * T15 ; /* T16 = T6_dVb_dVb */
1213 
1214     /* T7 = Z  T7_dVb = dZ_dVb  T17 = dZ_dVb_dVb */
1215     T7 = 1 + T4 + T5 + T6 + T5 * T5 ;
1216     T7_dVb = T4_dVb + T5_dVb + T6_dVb + 2 * T5_dVb * T5 ;
1217     T17 = T15 + T16 + 2 * T15 * T5 + 2 * T5_dVb * T5_dVb ;
1218 
1219     T8 = T7 * T7 ;
1220     T8_dVb = 2 * T7_dVb * T7 ;
1221 
1222     T9 = 1 / T8 ;
1223     T9_dVb = - T8_dVb * T9 * T9 ;
1224 
1225     Vbsc_dVbse = T2 * T7_dVb * T9 ;
1226     Vbsc_dVbse_dVbs = T2 * ( T17 * T9 + T7_dVb * T9_dVb ) ;
1227 
1228   }  else if ( Vbse < Vbs_min ) {
1229     flg_vbsc = -1 ;
1230     Vbsc = Vbs_min ;
1231     Vbsc_dVbse_dVbs = 0.0 ;
1232   }  else {
1233     flg_vbsc =  0 ;
1234     Vbsc = Vbse ;
1235     Vbsc_dVbse = 1.0 ;
1236     Vbsc_dVbse_dVbs = 0.0 ;
1237   }
1238 
1239   Vdsc = Vdse ;
1240   Vgsc = Vgse ;
1241 
1242   if (here->HSM2_rs > 0.0 || here->HSM2_rd > 0.0) {
1243     if ( model->HSM2_corsrd == 1 ) flg_rsrd  = 1 ;
1244     if ( model->HSM2_corsrd == 2 ) flg_rsrd  = 2 ;
1245   }
1246 
1247   /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1248    * PART-1: Basic device characteristics.
1249    *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
1250   /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
1251    * Prepare for potential initial guesses using previous values
1252    *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
1253 
1254   flg_pprv = 0 ;
1255 
1256   if ( here->HSM2_called >= 1 ) {
1257 
1258     Vbsc_dif = Vbsc - here->HSM2_vbsc_prv ;
1259     Vdsc_dif = Vdsc - here->HSM2_vdsc_prv ;
1260     Vgsc_dif = Vgsc - here->HSM2_vgsc_prv ;
1261 
1262     sum_vdif  = fabs( Vbsc_dif ) + fabs( Vdsc_dif )
1263               + fabs( Vgsc_dif ) ;
1264 
1265     if ( model->HSM2_copprv >= 1 && sum_vdif <= vtol_pprv  &&
1266          here->HSM2_mode * here->HSM2_mode_prv > 0 ) { flg_pprv = 1 ;}
1267 
1268     if ( here->HSM2_called >= 2 && flg_pprv == 1 ) {
1269       Vbsc_dif2 = here->HSM2_vbsc_prv - here->HSM2_vbsc_prv2 ;
1270       Vdsc_dif2 = here->HSM2_vdsc_prv - here->HSM2_vdsc_prv2 ;
1271       Vgsc_dif2 = here->HSM2_vgsc_prv - here->HSM2_vgsc_prv2 ;
1272       sum_vdif2  = fabs( Vbsc_dif2 ) + fabs( Vdsc_dif2 )
1273                 + fabs( Vgsc_dif2 ) ;
1274       if ( epsm10 < sum_vdif2 && sum_vdif2 <= vtol_pprv &&
1275            here->HSM2_mode_prv * here->HSM2_mode_prv2 > 0 ) { flg_pprv = 2 ; }
1276     }
1277   } else {
1278     Vbsc_dif = 0.0 ;
1279     Vdsc_dif = 0.0 ;
1280     Vgsc_dif = 0.0 ;
1281     sum_vdif = 0.0 ;
1282     Vbsc_dif2 = 0.0 ;
1283     Vdsc_dif2 = 0.0 ;
1284     Vgsc_dif2 = 0.0 ;
1285     sum_vdif2 = 0.0 ;
1286     flg_iprv = 0 ;
1287     flg_pprv = 0 ;
1288   }
1289 
1290   dVbs = Vbsc_dif ;
1291   dVds = Vdsc_dif ;
1292   dVgs = Vgsc_dif ;
1293 
1294   if ( flg_pprv >= 1 ) {
1295     Ps0 = here->HSM2_ps0_prv ;
1296     Ps0_dVbs = here->HSM2_ps0_dvbs_prv ;
1297     Ps0_dVds = here->HSM2_ps0_dvds_prv ;
1298     Ps0_dVgs = here->HSM2_ps0_dvgs_prv ;
1299 
1300     Pds = here->HSM2_pds_prv ;
1301     Pds_dVbs = here->HSM2_pds_dvbs_prv ;
1302     Pds_dVds = here->HSM2_pds_dvds_prv ;
1303     Pds_dVgs = here->HSM2_pds_dvgs_prv ;
1304   }
1305 
1306 
1307   /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
1308    * Bias loop: iteration to solve the system of equations of
1309    *            the small circuit taking into account Rs and Rd.
1310    * - Vxs are internal (or effective) biases.
1311    * - Equations:
1312    *     Vbs = Vbsc - Rs * Ids
1313    *     Vds = Vdsc - ( Rs + Rd ) * Ids
1314    *     Vgs = Vgsc - Rs * Ids
1315    *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
1316 
1317   if ( flg_rsrd == 1 ) {
1318 
1319     if (here->HSM2_mode == HiSIM_NORMAL_MODE) {
1320       Rs  = here->HSM2_rs ;
1321       Rd  = here->HSM2_rd ;
1322     } else {
1323       Rs  = here->HSM2_rd ;
1324       Rd  = here->HSM2_rs ;
1325     }
1326 
1327     if ( here->HSM2_called >= 1 ) {
1328 
1329       if ( model->HSM2_coiprv >= 1 &&
1330            0.0 < sum_vdif && sum_vdif <= vtol_iprv ) { flg_iprv = 1 ;}
1331     }
1332 
1333     /*-----------------------------------------------------------*
1334      * Initial guesses using the previous values.
1335      *-----------------*/
1336     if ( flg_iprv == 1 ) {
1337       here->HSM2_ids_dvbs_prv = Fn_Max( 0.0 , here->HSM2_ids_dvbs_prv ) ;
1338       here->HSM2_ids_dvds_prv = Fn_Max( 0.0 , here->HSM2_ids_dvds_prv ) ;
1339       here->HSM2_ids_dvgs_prv = Fn_Max( 0.0 , here->HSM2_ids_dvgs_prv ) ;
1340 
1341       dVbs = Vbsc_dif * ( 1.0 - 1.0 / ( 1.0 + Rs * here->HSM2_ids_dvbs_prv ) ) ;
1342       dVds = Vdsc_dif * ( 1.0 - 1.0 / ( 1.0 + ( Rs + Rd ) * here->HSM2_ids_dvds_prv ) ) ;
1343       dVgs = Vgsc_dif * ( 1.0 - 1.0 / ( 1.0 + Rs * here->HSM2_ids_dvgs_prv ) ) ;
1344 
1345       Ids = here->HSM2_ids_prv
1346           + here->HSM2_ids_dvbs_prv * dVbs
1347           + here->HSM2_ids_dvds_prv * dVds
1348           + here->HSM2_ids_dvgs_prv * dVgs ;
1349 
1350       T1  = ( Ids - here->HSM2_ids_prv ) ;
1351       T2  = fabs( T1 ) ;
1352       if ( Ids_maxvar * here->HSM2_ids_prv < T2 ) {
1353             Ids = here->HSM2_ids_prv * ( 1.0 + Fn_Sgn( T1 ) * Ids_maxvar ) ;
1354       }
1355       if ( Ids < 0 ) Ids = 0.0 ;
1356 
1357     } else {
1358       Ids = 0.0 ;
1359       if ( flg_pprv >= 1 ) {
1360         dVbs = Vbsc_dif ;
1361         dVds = Vdsc_dif ;
1362         dVgs = Vgsc_dif ;
1363       }
1364     } /* end of flg_iprv if-blocks */
1365 
1366     Vbs = Vbsc - Ids * Rs ;
1367     Vds = Vdsc - Ids * ( Rs + Rd ) ;
1368     if ( Vds * Vdsc <= 0.0 ) { Vds = 0.0 ; }
1369 
1370     Vgs = Vgsc - Ids * Rs ;
1371 
1372   } else {
1373     lp_bs_max = 1 ;
1374     Ids = 0.0 ;
1375     Vbs = Vbsc ;
1376     Vds = Vdsc ;
1377     Vgs = Vgsc ;
1378   } /* end of flg_rsrd if-blocks */
1379 
1380 
1381   if( model->HSM2_codep == 1 ) {
1382     /*---------------------------------------------------*
1383      * CODEP=1 : Depletion mode MOSFET
1384      *-----------------*/
1385 
1386     /*-----------------------------------------------------------*
1387      * Vxsz: Modified bias introduced to realize symmetry at Vds=0.
1388      *-----------------*/
1389 
1390     T1 = Vbsc_dVbse * Vds / 2 ;
1391     Fn_SymAdd(  Vzadd , T1 , model->HSM2_vzadd0 , T2 ) ;
1392     Vzadd_dVbs = T2 * Vbsc_dVbse_dVbs * Vds / 2 ;
1393     T2 *= Vbsc_dVbse / 2 ;
1394     Vzadd_dVds = T2 ;
1395 
1396     if ( Vzadd < ps_conv ) {
1397          Vzadd = ps_conv ;
1398          Vzadd_dVds = 0.0 ;
1399          Vzadd_dVbs = 0.0 ;
1400     }
1401 
1402     Vbsz = Vbs + Vzadd ;
1403     Vbsz_dVbs = 1.0 ;
1404     Vbsz_dVds = Vzadd_dVds ;
1405 
1406     Vdsz = Vds + 2.0 * Vzadd ;
1407     Vdsz_dVbs = 0.0 ;
1408     Vdsz_dVds = 1.0 + 2.0 * Vzadd_dVds ;
1409 
1410     Vgsz = Vgs + Vzadd ;
1411     Vgsz_dVgs = 1.0 ;
1412     Vgsz_dVbs = 0.0 ;
1413     Vgsz_dVds = Vzadd_dVds ;
1414 
1415 
1416     /*---------------------------------------------------*
1417      * Factor of modification for symmetry.
1418      *-----------------*/
1419 
1420     T1 = here->HSM2_qnsub_esi * Cox0_inv * Cox0_inv ;
1421     T2 = Vgs - Vfb ;
1422     T3 = 1 + 2.0 / T1 * ( T2 - beta_inv - Vbs ) ;
1423     Fn_SZ( T4 , T3 , 1e-3 , T5 ) ;
1424     TX = sqrt( T4 ) ;
1425     Pslsat = T2 + T1 * ( 1.0 - TX ) ;
1426     VdsatS = Pslsat - Pb2 ;
1427     Fn_SL( VdsatS , VdsatS , 0.1 , 5e-2 , T6 ) ;
1428 
1429     VdsatS_dVbs = ( TX ? (T6 * T5 / TX ) : 0.0 ) ;
1430     VdsatS_dVds = 0.0 ;
1431     VdsatS_dVgs = ( TX ? (T6 * ( 1.0 - T5 / TX )) : 0.0 ) ;
1432 
1433 
1434     T1 = Vds / VdsatS ;
1435     Fn_SUPoly4( TX , T1 , 1.0 , T0 ) ;
1436     FMDVDS = TX * TX ;
1437     T2 = 2 * TX * T0 ;
1438     T3 = T2 / ( VdsatS * VdsatS ) ;
1439     FMDVDS_dVbs = T3 * ( - Vds * VdsatS_dVbs ) ;
1440     FMDVDS_dVds = T3 * ( 1.0 * VdsatS - Vds * VdsatS_dVds ) ;
1441     FMDVDS_dVgs = T3 * ( - Vds * VdsatS_dVgs ) ;
1442 
1443     /*-----------------------------------------------------------*
1444      * Quantum effect
1445      *-----------------*/
1446     if ( model->HSM2_flg_qme == 0 ) {
1447       flg_qme = 0 ;
1448     } else {
1449       flg_qme = 1 ;
1450     }
1451 
1452 
1453     T1 = here->HSM2_2qnsub_esi ;
1454     T2 = sqrt( T1 * Pb20 ) ;
1455     Vthq = Pb20 + Vfb + T2 * Cox0_inv ;
1456     Vthq_dVb = 0.0 ;
1457     Vthq_dVd = 0.0 ;
1458 
1459     if ( flg_qme == 0 ) {
1460       Tox = Tox0 ;
1461       Tox_dVb = 0.0 ;
1462       Tox_dVd = 0.0 ;
1463       Tox_dVg = 0.0 ;
1464 
1465       Cox = Cox0 ;
1466       Cox_dVb = 0.0 ;
1467       Cox_dVd = 0.0 ;
1468       Cox_dVg = 0.0 ;
1469 
1470       Cox_inv  = Cox0_inv ;
1471       Cox_inv_dVb = 0.0 ;
1472       Cox_inv_dVd = 0.0 ;
1473       Cox_inv_dVg = 0.0 ;
1474 
1475       T0 = cnst0 * cnst0 * Cox_inv ;
1476       cnstCoxi = T0 * Cox_inv ;
1477       cnstCoxi_dVb = 0.0 ;
1478       cnstCoxi_dVd = 0.0 ;
1479       cnstCoxi_dVg = 0.0 ;
1480 
1481     } else {
1482 
1483       T5     = Vgs  - Vbs - Vthq + model->HSM2_qme2 ;
1484       T5_dVb = -1.0 - Vthq_dVb ;
1485       T5_dVd =      - Vthq_dVd ;
1486       T5_dVg =  1.0 ;
1487       Fn_SZ( T2 , T5 , qme_dlt, T3) ;
1488       T2 = T2 + small ;
1489       T2_dVb = T3 * T5_dVb ;
1490       T2_dVd = T3 * T5_dVd ;
1491       T2_dVg = T3 * T5_dVg ;
1492 
1493       T3 = 1.0 /  T2 ;
1494       T7 = -1.0 / ( T2 * T2 ) ;
1495       T3_dVb = T7 * T2_dVb ;
1496       T3_dVd = T7 * T2_dVd ;
1497       T3_dVg = T7 * T2_dVg ;
1498 
1499       T4 = 2.0 * fabs(Vthq) ;
1500       T6 = Vfb - Vthq + model->HSM2_qme2 ;
1501       if(T6 > T4) { T4 = T6; }
1502 
1503       Fn_SU( T2 , T3 , 1.0 / T4  , qme_dlt, T6 ) ;
1504       T2_dVb = T6 * T3_dVb ;
1505       T2_dVd = T6 * T3_dVd ;
1506       T2_dVg = T6 * T3_dVg ;
1507 
1508       dTox = model->HSM2_qme1 * T2 + model->HSM2_qme3 ;
1509       T7   = model->HSM2_qme1 ;
1510       dTox_dVb = T7 * T2_dVb ;
1511       dTox_dVd = T7 * T2_dVd ;
1512       dTox_dVg = T7 * T2_dVg ;
1513 
1514       if ( dTox * 1.0e12 < Tox0 ) {
1515         dTox = 0.0 ;
1516 	dTox_dVb = 0.0 ;
1517         dTox_dVd = 0.0 ;
1518         dTox_dVg = 0.0 ;
1519         flg_qme = 0 ;
1520       }
1521 
1522       Tox = Tox0 + dTox ;
1523       Tox_dVb = dTox_dVb ;
1524       Tox_dVd = dTox_dVd ;
1525       Tox_dVg = dTox_dVg ;
1526 
1527       Cox = c_eox / Tox ;
1528       T1  = - c_eox / ( Tox * Tox ) ;
1529       Cox_dVb = T1 * Tox_dVb ;
1530       Cox_dVd = T1 * Tox_dVd ;
1531       Cox_dVg = T1 * Tox_dVg ;
1532 
1533       Cox_inv  = Tox / c_eox ;
1534       T1  = 1.0 / c_eox ;
1535       Cox_inv_dVb = T1 * Tox_dVb ;
1536       Cox_inv_dVd = T1 * Tox_dVd ;
1537       Cox_inv_dVg = T1 * Tox_dVg ;
1538 
1539       T0 = cnst0 * cnst0 * Cox_inv ;
1540       cnstCoxi = T0 * Cox_inv ;
1541       T1 = 2.0 * T0 ;
1542       cnstCoxi_dVb = T1 * Cox_inv_dVb ;
1543       cnstCoxi_dVd = T1 * Cox_inv_dVd ;
1544       cnstCoxi_dVg = T1 * Cox_inv_dVg ;
1545     }
1546 
1547 
1548     fac1 = cnst0 * Cox_inv ;
1549     fac1_dVds = cnst0 * Cox_inv_dVd ;
1550     fac1_dVgs = cnst0 * Cox_inv_dVg ;
1551     fac1_dVbs = cnst0 * Cox_inv_dVb ;
1552     fac1p2 = fac1 * fac1 ;
1553 
1554     /* Ps0_min: approx. solution of Poisson equation at Vgs_min */
1555     /*          ( easy to improve, if necessary  )              */
1556     Ps0_min = 2.0 * beta_inv * log(-Vgs_min/fac1) ;
1557     Ps0_min_dVds = -2.0 * beta_inv * fac1_dVds / fac1 ;
1558     Ps0_min_dVgs = -2.0 * beta_inv * fac1_dVgs / fac1 ;
1559     Ps0_min_dVbs = -2.0 * beta_inv * fac1_dVbs / fac1 ;
1560 
1561 
1562     /*---------------------------------------------------*
1563      * Vbsz2 : Vbs for dVth
1564      *-----------------*/
1565     Vbsz2 = Vbsz ;
1566     Vbsz2_dVbs = Vbsz_dVbs ;
1567     Vbsz2_dVds = Vbsz_dVds ;
1568     Vbsz2_dVgs = 0.0 ;
1569 
1570     /*---------------------------------------------------*
1571      * Vthp : Vth with pocket.
1572      *-----------------*/
1573     T1 = here->HSM2_2qnsub_esi ;
1574     Qb0 = sqrt (T1 * (Pb20 - Vbsz2)) ;
1575     T2 = 0.5 * T1 / Qb0 ;
1576     Qb0_dVb = T2 * (- Vbsz2_dVbs) ;
1577     Qb0_dVd = T2 * (- Vbsz2_dVds) ;
1578     Qb0_dVg = T2 * (- Vbsz2_dVgs) ;
1579 
1580     Vthp = Pb20 + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr;
1581     Vthp_dVb = Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ;
1582     Vthp_dVd = Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ;
1583     Vthp_dVg = Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ;
1584 
1585     Pb20b = Pb20 ;
1586     Pb20b_dVb = 0.0 ;
1587     Pb20b_dVd = 0.0 ;
1588     Pb20b_dVg = 0.0 ;
1589 
1590     T0 = 0.95 ;
1591     T1 = T0 * Pb20b - Vbsz2 - 1.0e-3 ;
1592     T1_dVb = T0 * Pb20b_dVb - Vbsz2_dVbs ;
1593     T1_dVd = T0 * Pb20b_dVd - Vbsz2_dVds ;
1594     T1_dVg = T0 * Pb20b_dVg - Vbsz2_dVgs ;
1595     T2 = sqrt (T1 * T1 + 4.0 * T0 * Pb20b * 1.0e-3) ;
1596     T3 = T0 * Pb20b - 0.5 * (T1 + T2) ;
1597     T4 = 2.0 * T0 * 1.0e-3 ;
1598     T5 = T1 / T2 ;
1599     T6 = T4 / T2 ;
1600     T3_dVb = T0 * Pb20b_dVb
1601            - 0.5 * (T1_dVb + (T1_dVb * T5 + T6 * Pb20b_dVb ) ) ;
1602     T3_dVd = T0 * Pb20b_dVd
1603            - 0.5 * (T1_dVd + (T1_dVd * T5 + T6 * Pb20b_dVd ) ) ;
1604     T3_dVg = T0 * Pb20b_dVg
1605            - 0.5 * (T1_dVg + (T1_dVg * T5 + T6 * Pb20b_dVg ) ) ;
1606     Pbsum = Pb20b - T3 ;
1607     Pbsum_dVb = Pb20b_dVb - T3_dVb ;
1608     Pbsum_dVd = Pb20b_dVd - T3_dVd ;
1609     Pbsum_dVg = Pb20b_dVg - T3_dVg ;
1610 
1611     if( model->HSM2_codep ) {
1612        Pbsum = Pbsum + model->HSM2_depeta * Vdsz ;
1613        Pbsum_dVb = Pbsum_dVb + model->HSM2_depeta * Vdsz_dVbs ;
1614        Pbsum_dVd = Pbsum_dVd + model->HSM2_depeta * Vdsz_dVds ;
1615     }
1616 
1617     sqrt_Pbsum = sqrt( Pbsum ) ;
1618 
1619     /*-------------------------------------------*
1620      * dVthLP : Short-channel effect induced by pocket.
1621      * - Vth0 : Vth without pocket.
1622      *-----------------*/
1623     if ( model->HSM2_lp != 0.0 ) {
1624       T1 = here->HSM2_2qnsub_esi ;
1625       T2 = model->HSM2_bs2 - Vbsz2 ;
1626       T3 = T2 + small ;
1627       T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ;
1628       T5 = 0.5 * (T3 + T4) ;
1629       T6 = 0.5 * (1.0 + T3 / T4) ;
1630       T5_dVb = - Vbsz2_dVbs * T6 ;
1631       T5_dVd = - Vbsz2_dVds * T6 ;
1632       T5_dVg = - Vbsz2_dVgs * T6 ;
1633       T7 = 1.0 / T5 ;
1634       bs12 = model->HSM2_bs1 * T7 ;
1635       T8 = - bs12 * T7 ;
1636       bs12_dVb = T8 * T5_dVb ;
1637       bs12_dVd = T8 * T5_dVd ;
1638       bs12_dVg = T8 * T5_dVg ;
1639       Fn_SU( T10 , Vbsz2 + bs12, 0.93 * Pb20, vth_dlt, T0) ;
1640       Qbmm = sqrt (T1 * (Pb20 - T10 )) ;
1641       T9 = T0 / Qbmm ;
1642       Qbmm_dVb = 0.5 * T1 * - (Vbsz2_dVbs + bs12_dVb) * T9 ;
1643       Qbmm_dVd = 0.5 * T1 * - (Vbsz2_dVds + bs12_dVd) * T9 ;
1644       Qbmm_dVg = 0.5 * T1 * - (Vbsz2_dVgs + bs12_dVg) * T9 ;
1645 
1646       dqb = (Qb0 - Qbmm) * Cox_inv ;
1647       dqb_dVb = Vthp_dVb - Qbmm_dVb * Cox_inv - Qbmm * Cox_inv_dVb ;
1648       dqb_dVd = Vthp_dVd - Qbmm_dVd * Cox_inv - Qbmm * Cox_inv_dVd ;
1649       dqb_dVg = Vthp_dVg - Qbmm_dVg * Cox_inv - Qbmm * Cox_inv_dVg ;
1650 
1651       T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ;
1652       T2 = sqrt( T1 * ( Pb2c - Vbsz2 ) ) ;
1653       Vth0 = Pb2c + Vfb + T2 * Cox_inv ;
1654       T3 = 0.5 * T1 / T2 * Cox_inv ;
1655       Vth0_dVb = T3 * ( - Vbsz2_dVbs ) + T2 * Cox_inv_dVb ;
1656       Vth0_dVd = T3 * ( - Vbsz2_dVds ) + T2 * Cox_inv_dVd ;
1657       Vth0_dVg = T3 * ( - Vbsz2_dVgs ) + T2 * Cox_inv_dVg ;
1658 
1659       T1 = C_ESI * Cox_inv ;
1660       T2 = here->HSM2_wdplp ;
1661       T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ;
1662       T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ;
1663       dVth0 = T5 * sqrt_Pbsum ;
1664       T6 = 0.5 * T5 / sqrt_Pbsum ;
1665       T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ;
1666       T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ;
1667       dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
1668       dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
1669       dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
1670 
1671       T1 = Vthp - Vth0 ;
1672       T1_dVb = Vthp_dVb - Vth0_dVb ;
1673       T2 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * Pbsum / model->HSM2_lp ;
1674       T2_dVb = pParam->HSM2_scp3 * Pbsum_dVb / model->HSM2_lp ;
1675       T3 = T2 + pParam->HSM2_scp2 * Vdsz ;
1676       T3_dVb = T2_dVb + pParam->HSM2_scp2 * Vdsz_dVbs ;
1677 
1678 
1679       Vdx = model->HSM2_scp21 + Vdsz ;
1680       Vdx_dVbs = Vdsz_dVbs ;
1681       Vdx2 = Vdx * Vdx ;
1682       Vdx2_dVbs = 2 * Vdx_dVbs * Vdx ;
1683 
1684       dVthLP = T1 * dVth0 * T3 + dqb - here->HSM2_msc / Vdx2 ;
1685       dVthLP_dVb = T1_dVb * dVth0 * T3 + T1 * dVth0_dVb * T3 +  T1 * dVth0 * T3_dVb
1686                    + dqb_dVb + here->HSM2_msc / Vdx2 /Vdx2 *Vdx2_dVbs;
1687       T4 = T1 * dVth0 * pParam->HSM2_scp3 / model->HSM2_lp ;
1688       dVthLP_dVd = (Vthp_dVd - Vth0_dVd) * dVth0 * T3 + T1 * dVth0_dVd * T3
1689                      + T4 * Pbsum_dVd
1690                      + T1 * dVth0 * pParam->HSM2_scp2 * Vdsz_dVds
1691                      + dqb_dVd
1692                  + 2.0e0 * here->HSM2_msc * Vdx * Vdsz_dVds / ( Vdx2 * Vdx2 ) ;
1693       dVthLP_dVg = (Vthp_dVg - Vth0_dVg) * dVth0 * T3 + T1 * dVth0_dVg * T3
1694                      + T4 * Pbsum_dVg + dqb_dVg ;
1695     } else {
1696       dVthLP = 0.0e0 ;
1697       dVthLP_dVb = 0.0e0 ;
1698       dVthLP_dVd = 0.0e0 ;
1699       dVthLP_dVg = 0.0e0 ;
1700     }
1701 
1702     /*---------------------------------------------------*
1703      * dVthSC : Short-channel effect induced by Vds.
1704      *-----------------*/
1705     T1 = C_ESI * Cox_inv ;
1706     T2 = here->HSM2_wdpl ;
1707     T3 = here->HSM2_lgate - model->HSM2_parl2 ;
1708     T4 = 1.0e0 / ( T3 * T3 ) ;
1709     T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ;
1710 
1711     dVth0 = T5 * sqrt_Pbsum ;
1712 
1713     T6 = T5 / 2.0 / sqrt_Pbsum ;
1714     T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ;
1715     T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ;
1716     dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
1717     dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
1718     dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
1719 
1720     T1 = pParam->HSM2_sc3 / here->HSM2_lgate ;
1721     T4 = pParam->HSM2_sc1 + T1 * Pbsum ;
1722     T4_dVb = T1 * Pbsum_dVb ;
1723     T4_dVd = T1 * Pbsum_dVd ;
1724     T4_dVg = T1 * Pbsum_dVg ;
1725 
1726     T5 = T4 + pParam->HSM2_sc2 * Vdsz * ( 1.0 +  model->HSM2_sc4 * Pbsum );
1727     T5_dVb = T4_dVb + pParam->HSM2_sc2 * Vdsz * model->HSM2_sc4 * Pbsum_dVb
1728              + pParam->HSM2_sc2 * Vdsz_dVbs * model->HSM2_sc4 * Pbsum;
1729     T5_dVd = T4_dVd + pParam->HSM2_sc2 * Vdsz_dVds * ( 1.0 + model->HSM2_sc4 * Pbsum )
1730              + pParam->HSM2_sc2 * Vdsz * model->HSM2_sc4 * Pbsum_dVd;
1731     T5_dVg = T4_dVg + pParam->HSM2_sc2 * Vdsz * model->HSM2_sc4 * Pbsum_dVg;
1732 
1733 
1734     dVthSC = dVth0 * T5 ;
1735     dVthSC_dVb = dVth0_dVb * T5 + dVth0 * T5_dVb ;
1736     dVthSC_dVd = dVth0_dVd * T5 + dVth0 * T5_dVd ;
1737     dVthSC_dVg = dVth0_dVg * T5 + dVth0 * T5_dVg ;
1738 
1739     /*---------------------------------------------------*
1740      * dVthW : narrow-channel effect.
1741      *-----------------*/
1742     T1 = 1.0 / Cox ;
1743     T2 = T1 * T1 ;
1744     T3 = 1.0 / ( Cox +  pParam->HSM2_wfc / Weff ) ;
1745     T4 = T3 * T3 ;
1746     T5 = T1 - T3 ;
1747     T6 = Qb0 * ( T2 - T4 ) ;
1748 
1749     dVthW = Qb0 * T5 + pParam->HSM2_wvth0 / here->HSM2_wg ;
1750     dVthW_dVb = Qb0_dVb * T5 - Cox_dVb * T6 ;
1751     dVthW_dVd = Qb0_dVd * T5 - Cox_dVd * T6 ;
1752     dVthW_dVg =              - Cox_dVg * T6 ;
1753 
1754     /*---------------------------------------------------*
1755      * dVth : Total variation.
1756      * - Positive dVth means the decrease in Vth.
1757      *-----------------*/
1758     dVth = dVthSC + dVthLP + dVthW + here->HSM2_dVthsm ;
1759     dVth_dVb = dVthSC_dVb + dVthLP_dVb + dVthW_dVb ;
1760     dVth_dVd = dVthSC_dVd + dVthLP_dVd + dVthW_dVd ;
1761     dVth_dVg = dVthSC_dVg + dVthLP_dVg + dVthW_dVg ;
1762 
1763     /*---------------------------------------------------*
1764      * Vth : Threshold voltagei for OP.
1765      *-----------------*/
1766     T2 = sqrt( here->HSM2_2qnsub_esi * (Pb2-Vbsz) ) ;
1767     Vth = Pb2 + Vfb + T2 * Cox0_inv - dVth ;
1768 
1769     /*-----------------------------------------------------------*
1770      * Constants in the equation of Ps0 .
1771      *-----------------*/
1772 
1773     fac1 = cnst0 * Cox_inv ;
1774     fac1_dVbs = cnst0 * Cox_inv_dVb ;
1775     fac1_dVds = cnst0 * Cox_inv_dVd ;
1776     fac1_dVgs = cnst0 * Cox_inv_dVg ;
1777 
1778     fac1p2 = fac1 * fac1 ;
1779 
1780     /*---------------------------------------------------*
1781      * Poly-Depletion Effect
1782      *-----------------*/
1783 
1784     dPpg = 0.0 ;
1785     dPpg_dVb = 0.0 ;
1786     dPpg_dVd = 0.0 ;
1787     dPpg_dVg = 0.0 ;
1788 
1789     if ( here->HSM2_flg_pgd == 1 ) {
1790 
1791       T7 = Vgsz ;
1792       T7_dVb =  Vgsz_dVbs ;
1793       T7_dVd =  Vgsz_dVds ;
1794       T7_dVg =  Vgsz_dVgs ;
1795 
1796       T0 = here->HSM2_cnstpgd ;
1797 
1798       T3 = T7 - model->HSM2_pgd2 ;
1799       T3_dVb = T7_dVb ;
1800       T3_dVd = T7_dVd ;
1801       T3_dVg = T7_dVg ;
1802 
1803       Fn_ExpLim( dPpg , T3 , T6 ) ;
1804       dPpg_dVb = T6 * T3_dVb ;
1805       dPpg_dVd = T6 * T3_dVd ;
1806       dPpg_dVg = T6 * T3_dVg ;
1807 
1808       Fn_SZ( dPpg , dPpg - 1.0 , pol_dlt , T6 ) ;
1809       dPpg_dVb *= T6 ;
1810       dPpg_dVd *= T6 ;
1811       dPpg_dVg *= T6 ;
1812 
1813       dPpg *= T0 ;
1814       dPpg_dVb *= T0 ;
1815       dPpg_dVd *= T0 ;
1816       dPpg_dVg *= T0 ;
1817 
1818       Fn_SU( dPpg , dPpg , pol_b , pol_dlt , T9 ) ;
1819       dPpg_dVb *= T9 ;
1820       dPpg_dVd *= T9 ;
1821       dPpg_dVg *= T9 ;
1822 
1823     }
1824 
1825     /*---------------------------------------------------*
1826      * Vgp : Effective gate bias with SCE & RSCE & flatband.
1827      *-----------------*/
1828     Vgp = Vgs - Vfb + dVth - dPpg ;
1829     Vgp_dVbs = dVth_dVb - dPpg_dVb ;
1830     Vgp_dVds = dVth_dVd - dPpg_dVd ;
1831     Vgp_dVgs = 1.0e0 + dVth_dVg - dPpg_dVg ;
1832 
1833     /*---------------------------------------------------*
1834      * Vgs_fb : Actual flatband voltage taking account Vbs.
1835      * - note: if Vgs == Vgs_fb then Vgp == Ps0 == Vbs .
1836      *------------------*/
1837     Vgs_fb = Vfb - dVth + dPpg + Vbs ;
1838 
1839 #include "hsm2eval_dep.h"
1840 
1841   } else {
1842 
1843   /*---------------------------------------------------*
1844    * Normal mode MOSFET
1845    *------------------*/
1846 
1847   /*-----------------------------------------------------------*
1848    * start of the loop.
1849    *-----------------*/
1850   for ( lp_bs = 1 ; lp_bs <= lp_bs_max ; lp_bs ++ ) {
1851 
1852     Ids_last = Ids ;
1853     /* Initialization of counters is needed for restart. */
1854     lp_s0   = 0 ;
1855     lp_sl   = 0 ;
1856 
1857     /*-----------------------------------------------------------*
1858      * Vxsz: Modified bias introduced to realize symmetry at Vds=0.
1859      *-----------------*/
1860 
1861     T1 = Vbsc_dVbse * Vds / 2 ;
1862     Fn_SymAdd(  Vzadd , T1 , model->HSM2_vzadd0 , T2 ) ;
1863     T2 *= Vbsc_dVbse / 2 ;
1864     Vzadd_dVds = T2 ;
1865 
1866     if ( Vzadd < ps_conv ) {
1867       Vzadd = ps_conv ;
1868       Vzadd_dVds = 0.0 ;
1869     }
1870 
1871     Vbsz = Vbs + Vzadd ;
1872     Vbsz_dVbs = 1.0 ;
1873     Vbsz_dVds = Vzadd_dVds ;
1874 
1875     Vdsz = Vds + 2.0 * Vzadd ;
1876     Vdsz_dVds = 1.0 + 2.0 * Vzadd_dVds ;
1877 
1878     Vgsz = Vgs + Vzadd ;
1879     Vgsz_dVgs = 1.0 ;
1880     Vgsz_dVds = Vzadd_dVds ;
1881 
1882     /*---------------------------------------------------*
1883      * Factor of modification for symmetry.
1884      *-----------------*/
1885 
1886     T1 = here->HSM2_qnsub_esi * Cox0_inv * Cox0_inv ;
1887     T2 = Vgs - Vfb ;
1888     T3 = 1 + 2.0 / T1 * ( T2 - beta_inv - Vbs ) ;
1889     Fn_SZ( T4 , T3 , 1e-3 , T5 ) ;
1890     TX = sqrt( T4 ) ;
1891     Pslsat = T2 + T1 * ( 1.0 - TX ) ;
1892     VdsatS = Pslsat - Pb2 ;
1893     Fn_SL( VdsatS , VdsatS , 0.1 , 5e-2 , T6 ) ;
1894 
1895     VdsatS_dVbs = ( TX ? (T6 * T5 / TX ) : 0.0 ) ;
1896     VdsatS_dVds = 0.0 ;
1897     VdsatS_dVgs = ( TX ? (T6 * ( 1.0 - T5 / TX )) : 0.0 ) ;
1898 
1899 
1900     T1 = Vds / VdsatS ;
1901     Fn_SUPoly4( TX , T1 , 1.0 , T0 ) ;
1902     FMDVDS = TX * TX ;
1903     T2 = 2 * TX * T0 ;
1904     T3 = T2 / ( VdsatS * VdsatS ) ;
1905     FMDVDS_dVbs = T3 * ( - Vds * VdsatS_dVbs ) ;
1906     FMDVDS_dVds = T3 * ( 1.0 * VdsatS - Vds * VdsatS_dVds ) ;
1907     FMDVDS_dVgs = T3 * ( - Vds * VdsatS_dVgs ) ;
1908 
1909     /*-----------------------------------------------------------*
1910      * Quantum effect
1911      *-----------------*/
1912     if ( model->HSM2_flg_qme == 0 ) {
1913       flg_qme = 0 ;
1914     } else {
1915       flg_qme = 1 ;
1916     }
1917 
1918 
1919       T1 = here->HSM2_2qnsub_esi ;
1920       T2 = sqrt( T1 * Pb20 ) ;
1921       Vthq = Pb20 + Vfb + T2 * Cox0_inv ;
1922       Vthq_dVb = 0.0 ;
1923       Vthq_dVd = 0.0 ;
1924 
1925       if ( flg_qme == 0 ) {
1926 	Tox = Tox0 ;
1927 	Tox_dVb = 0.0 ;
1928 	Tox_dVd = 0.0 ;
1929 	Tox_dVg = 0.0 ;
1930 
1931 	Cox = Cox0 ;
1932 	Cox_dVb = 0.0 ;
1933 	Cox_dVd = 0.0 ;
1934 	Cox_dVg = 0.0 ;
1935 
1936 	Cox_inv  = Cox0_inv ;
1937 	Cox_inv_dVb = 0.0 ;
1938 	Cox_inv_dVd = 0.0 ;
1939 	Cox_inv_dVg = 0.0 ;
1940 
1941 	T0 = cnst0 * cnst0 * Cox_inv ;
1942 	cnstCoxi = T0 * Cox_inv ;
1943 	cnstCoxi_dVb = 0.0 ;
1944 	cnstCoxi_dVd = 0.0 ;
1945 	cnstCoxi_dVg = 0.0 ;
1946       } else {
1947 
1948 	T5     = Vgs  - Vbs - Vthq + model->HSM2_qme2 ;
1949 	T5_dVb = -1.0 - Vthq_dVb ;
1950 	T5_dVd =      - Vthq_dVd ;
1951 	T5_dVg =  1.0 ;
1952   	Fn_SZ( T2 , T5 , qme_dlt, T3) ;
1953   	T2 = T2 + small ;
1954   	T2_dVb = T3 * T5_dVb ;
1955   	T2_dVd = T3 * T5_dVd ;
1956   	T2_dVg = T3 * T5_dVg ;
1957 
1958 	T3 = 1.0 /  T2 ;
1959 	T7 = -1.0 / ( T2 * T2 ) ;
1960   	T3_dVb = T7 * T2_dVb ;
1961   	T3_dVd = T7 * T2_dVd ;
1962   	T3_dVg = T7 * T2_dVg ;
1963 
1964         T4 = 2.0 * fabs(Vthq) ;
1965         T6 = Vfb - Vthq + model->HSM2_qme2 ;
1966         if(T6 > T4) { T4 = T6; }
1967 
1968   	Fn_SU( T2 , T3 , 1.0 / T4  , qme_dlt, T6 ) ;
1969   	T2_dVb = T6 * T3_dVb ;
1970   	T2_dVd = T6 * T3_dVd ;
1971   	T2_dVg = T6 * T3_dVg ;
1972 
1973 	dTox = model->HSM2_qme1 * T2 + model->HSM2_qme3 ;
1974         T7   = model->HSM2_qme1 ;
1975 	dTox_dVb = T7 * T2_dVb ;
1976 	dTox_dVd = T7 * T2_dVd ;
1977 	dTox_dVg = T7 * T2_dVg ;
1978 
1979 	if ( dTox * 1.0e12 < Tox0 ) {
1980 	  dTox = 0.0 ;
1981 	  dTox_dVb = 0.0 ;
1982 	  dTox_dVd = 0.0 ;
1983 	  dTox_dVg = 0.0 ;
1984 	  flg_qme = 0 ;
1985 	}
1986 
1987 	Tox = Tox0 + dTox ;
1988 	Tox_dVb = dTox_dVb ;
1989 	Tox_dVd = dTox_dVd ;
1990 	Tox_dVg = dTox_dVg ;
1991 
1992 	Cox = c_eox / Tox ;
1993 	T1  = - c_eox / ( Tox * Tox ) ;
1994 	Cox_dVb = T1 * Tox_dVb ;
1995 	Cox_dVd = T1 * Tox_dVd ;
1996 	Cox_dVg = T1 * Tox_dVg ;
1997 
1998 	Cox_inv  = Tox / c_eox ;
1999 	T1  = 1.0 / c_eox ;
2000 	Cox_inv_dVb = T1 * Tox_dVb ;
2001 	Cox_inv_dVd = T1 * Tox_dVd ;
2002 	Cox_inv_dVg = T1 * Tox_dVg ;
2003 
2004 	T0 = cnst0 * cnst0 * Cox_inv ;
2005 	cnstCoxi = T0 * Cox_inv ;
2006 	T1 = 2.0 * T0 ;
2007 	cnstCoxi_dVb = T1 * Cox_inv_dVb ;
2008 	cnstCoxi_dVd = T1 * Cox_inv_dVd ;
2009 	cnstCoxi_dVg = T1 * Cox_inv_dVg ;
2010       }
2011 
2012 
2013     fac1 = cnst0 * Cox_inv ;
2014     fac1_dVds = cnst0 * Cox_inv_dVd ;
2015     fac1_dVgs = cnst0 * Cox_inv_dVg ;
2016     fac1_dVbs = cnst0 * Cox_inv_dVb ;
2017     fac1p2 = fac1 * fac1 ;
2018 
2019     /* Ps0_min: approx. solution of Poisson equation at Vgs_min */
2020     /*          ( easy to improve, if necessary  )              */
2021     Ps0_min = 2.0 * beta_inv * log(-Vgs_min/fac1) ;
2022     Ps0_min_dVds = -2.0 * beta_inv * fac1_dVds / fac1 ;
2023     Ps0_min_dVgs = -2.0 * beta_inv * fac1_dVgs / fac1 ;
2024     Ps0_min_dVbs = -2.0 * beta_inv * fac1_dVbs / fac1 ;
2025 
2026 
2027     /*---------------------------------------------------*
2028      * Vbsz2 : Vbs for dVth
2029      *-----------------*/
2030     Vbsz2 = Vbsz ;
2031     Vbsz2_dVbs = Vbsz_dVbs ;
2032     Vbsz2_dVds = Vbsz_dVds ;
2033     Vbsz2_dVgs = 0.0 ;
2034 
2035     if ( corecip ) {
2036 
2037       /* ************************** */
2038       /* Initial value for PS0Z_SCE */
2039       /* ************************** */
2040 
2041       T1 = dP_max + dP_max ;
2042 
2043       if ( flg_pprv >= 1 ) {
2044         /* -------------------------- *
2045          * Extrapolate previous value *
2046          * -------------------------- */
2047 
2048         T1  =   here->HSM2_PS0Z_SCE_dvbs_prv * dVbs
2049               + here->HSM2_PS0Z_SCE_dvds_prv * dVds
2050               + here->HSM2_PS0Z_SCE_dvgs_prv * dVgs ;
2051 
2052         if ( fabs(T1) <= dP_max ) {
2053           Ps0_ini = here->HSM2_PS0Z_SCE_prv + T1 ; /* take extrapolated value */
2054           Ps0_ini_dVds = here->HSM2_PS0Z_SCE_dvds_prv ;
2055           Ps0_ini_dVgs = here->HSM2_PS0Z_SCE_dvgs_prv ;
2056           Ps0_ini_dVbs = here->HSM2_PS0Z_SCE_dvbs_prv ;
2057         }
2058       } /* end of (flg_pprv >=1) if-block */
2059 
2060       if ( fabs(T1) > dP_max) {
2061 	/* ------------------------------------- *
2062 	 * Analytical initial value for PS0Z_SCE *
2063          * ------------------------------------- */
2064 
2065 
2066 	T1 = here->HSM2_2qnsub_esi ;
2067 	T2 = sqrt( T1 * ( Pb20 - Vbsz ) ) ;
2068 	Vthq = Pb20 + Vfb + T2 * Cox0_inv ;
2069 	Vth = Vthq ;
2070 
2071 	TX     = 4.0e0 * ( beta * ( Vgs - Vbs ) - 1.0e0 ) / ( fac1p2 * beta2 ) ;
2072         TX_dVds = - 2.0 * TX / fac1 * fac1_dVds ;
2073         TX_dVgs = - 2.0 * TX / fac1 * fac1_dVgs + 4.0 * beta / ( fac1p2 * beta2 ) ;
2074         TX_dVbs = - 2.0 * TX / fac1 * fac1_dVbs - 4.0 * beta / ( fac1p2 * beta2 ) ;
2075         TX    += 1.0 ;
2076         if ( TX > epsm10 ) {
2077           T3     = sqrt( TX ) ;
2078           T3_dVd = 0.5 * TX_dVds / T3 ;
2079           T3_dVg = 0.5 * TX_dVgs / T3 ;
2080           T3_dVb = 0.5 * TX_dVbs / T3 ;
2081         } else {
2082           T3 = sqrt( epsm10 ) ;
2083           T3_dVd = T3_dVg = T3_dVb = 0.0 ;
2084         }
2085 	Ps0_iniA      = Vgs + fac1p2 * beta * 0.5 * ( 1.0e0 - T3 ) ;
2086         Ps0_iniA_dVds =       fac1 * beta * ( 1.0 - T3 ) * fac1_dVds - fac1p2 * beta * 0.5 * T3_dVd ;
2087         Ps0_iniA_dVgs = 1.0 + fac1 * beta * ( 1.0 - T3 ) * fac1_dVgs - fac1p2 * beta * 0.5 * T3_dVg ;
2088         Ps0_iniA_dVbs =       fac1 * beta * ( 1.0 - T3 ) * fac1_dVbs - fac1p2 * beta * 0.5 * T3_dVb ;
2089 
2090 	Chi = beta * ( Ps0_iniA - Vbs ) ;
2091 
2092 	if ( Chi < znbd3 ) {
2093 	  /*-----------------------------------*
2094 	   * zone-D1/D2
2095 	   * - Ps0_ini is the analytical solution of Qs=Qb0 with
2096 	   *   Qb0 being approximated to 3-degree polynomial.
2097 	   *-----------------*/
2098 	  TY = beta * ( Vgs - Vbs ) ;
2099           TY_dVds = 0.0 ;
2100           TY_dVgs = beta ;
2101           TY_dVbs = - beta ;
2102 	  T1 = 1.0e0 / ( cn_nc3 * beta * fac1 ) ;
2103           T1_dVd = - T1 / fac1 * fac1_dVds ;
2104           T1_dVg = - T1 / fac1 * fac1_dVgs ;
2105           T1_dVb = - T1 / fac1 * fac1_dVbs ;
2106 	  T2 = 81.0 + 3.0 * T1 ;
2107           T2_dVd = 3.0 * T1_dVd ;
2108           T2_dVg = 3.0 * T1_dVg ;
2109           T2_dVb = 3.0 * T1_dVb ;
2110 	  T3 = -2916.0 - 81.0 * T1 + 27.0 * T1 * TY ;
2111           T3_dVd = ( - 81.0 + 27.0 * TY ) * T1_dVd + 27.0 * T1 * TY_dVds ;
2112           T3_dVg = ( - 81.0 + 27.0 * TY ) * T1_dVg + 27.0 * T1 * TY_dVgs ;
2113           T3_dVb = ( - 81.0 + 27.0 * TY ) * T1_dVb + 27.0 * T1 * TY_dVbs ;
2114           T4     = T3 ;
2115           T4_dVd = T3_dVd ;
2116           T4_dVg = T3_dVg ;
2117           T4_dVb = T3_dVb ;
2118           T6     = sqrt( 4 * T2 * T2 * T2 + T4 * T4 ) ;
2119           T6_dVd = ( 6.0 * T2 * T2 * T2_dVd + T4 * T4_dVd ) / T6 ;
2120           T6_dVg = ( 6.0 * T2 * T2 * T2_dVg + T4 * T4_dVg ) / T6 ;
2121           T6_dVb = ( 6.0 * T2 * T2 * T2_dVb + T4 * T4_dVb ) / T6 ;
2122 	  T5     = Fn_Pow( T3 + T6 , C_1o3 ) ;
2123           T5_dVd = ( T3_dVd + T6_dVd ) / ( 3.0 * T5 * T5 ) ;
2124           T5_dVg = ( T3_dVg + T6_dVg ) / ( 3.0 * T5 * T5 ) ;
2125           T5_dVb = ( T3_dVb + T6_dVb ) / ( 3.0 * T5 * T5 ) ;
2126 
2127 	  TX = 3.0 - ( C_2p_1o3 * T2 ) / ( 3.0 * T5 )
2128 	    + 1 / ( 3.0 * C_2p_1o3 ) * T5 ;
2129           TX_dVds = - C_2p_1o3 / (3.0 * T5) * T2_dVd + ( C_2p_1o3 * T2 / (3.0 * T5 * T5) + 1.0 / (3.0 * C_2p_1o3) ) * T5_dVd ;
2130           TX_dVgs = - C_2p_1o3 / (3.0 * T5) * T2_dVg + ( C_2p_1o3 * T2 / (3.0 * T5 * T5) + 1.0 / (3.0 * C_2p_1o3) ) * T5_dVg ;
2131           TX_dVbs = - C_2p_1o3 / (3.0 * T5) * T2_dVb + ( C_2p_1o3 * T2 / (3.0 * T5 * T5) + 1.0 / (3.0 * C_2p_1o3) ) * T5_dVb ;
2132 
2133 	  Ps0_iniA = TX * beta_inv + Vbs ;
2134           Ps0_iniA_dVds = TX_dVds * beta_inv ;
2135           Ps0_iniA_dVgs = TX_dVgs * beta_inv ;
2136           Ps0_iniA_dVbs = TX_dVbs * beta_inv + 1.0 ;
2137 	  Ps0_ini = Ps0_iniA ;
2138           Ps0_ini_dVds  = Ps0_iniA_dVds ;
2139           Ps0_ini_dVgs  = Ps0_iniA_dVgs ;
2140           Ps0_ini_dVbs  = Ps0_iniA_dVbs ;
2141 
2142 	} else if ( Vgs <= Vth ) {
2143 	  /*-----------------------------------*
2144 	   * Weak inversion zone.
2145 	   *-----------------*/
2146 	  Ps0_ini = Ps0_iniA ;
2147           Ps0_ini_dVds = Ps0_iniA_dVds ;
2148           Ps0_ini_dVgs = Ps0_iniA_dVgs ;
2149           Ps0_ini_dVbs = Ps0_iniA_dVbs ;
2150 
2151 	} else {
2152 	  /*-----------------------------------*
2153 	   * Strong inversion zone.
2154 	   * - Ps0_iniB : upper bound.
2155 	   *-----------------*/
2156 	  T1 = 1.0 / cnst1 / cnstCoxi ;
2157           T1_dVd = - T1 / cnstCoxi * cnstCoxi_dVd ;
2158           T1_dVg = - T1 / cnstCoxi * cnstCoxi_dVg ;
2159           T1_dVb = - T1 / cnstCoxi * cnstCoxi_dVb ;
2160 	  T0 = Vgs - Vfb ;
2161 	  T2 = T1 * T0 * T0 ;
2162           T2_dVd = T1_dVd * T0 * T0 ;
2163           T2_dVg = T1_dVg * T0 * T0 + 2.0 * T1 * T0 ;
2164           T2_dVb = T1_dVb * T0 * T0 ;
2165 	  T3 = beta + 2.0 / T0 ;
2166           T3_dVg = -2.0 / (T0 * T0) ;
2167 
2168 	  Ps0_iniB = log( T2 + small ) / T3 ;
2169           Ps0_iniB_dVds = T2_dVd / (T2 * T3) ;
2170           Ps0_iniB_dVgs = T2_dVg / (T2 * T3) - T3_dVg * Ps0_iniB / T3 ;
2171           Ps0_iniB_dVbs = T2_dVb / (T2 * T3) ;
2172 
2173 	  Fn_SU2( Ps0_ini , Ps0_iniA, Ps0_iniB, c_ps0ini_2, T1,T2) ;
2174           Ps0_ini_dVds = Ps0_iniA_dVds * T1 + Ps0_iniB_dVds * T2 ;
2175           Ps0_ini_dVgs = Ps0_iniA_dVgs * T1 + Ps0_iniB_dVgs * T2 ;
2176           Ps0_ini_dVbs = Ps0_iniA_dVbs * T1 + Ps0_iniB_dVbs * T2 ;
2177 	}
2178       } /* end of initial value calulation */
2179 
2180       /**************************/
2181 
2182 	/* initial value for SCE LOOP */
2183 	PS0_SCE = Ps0_ini ;
2184       PS0_SCE_dVds  = Ps0_ini_dVds ;
2185       PS0_SCE_dVgs  = Ps0_ini_dVgs ;
2186       PS0_SCE_dVbs  = Ps0_ini_dVbs ;
2187 
2188 	PS0Z_SCE = Ps0_ini ;
2189       PS0Z_SCE_dVds = Ps0_ini_dVds ;
2190       PS0Z_SCE_dVgs = Ps0_ini_dVgs ;
2191       PS0Z_SCE_dVbs = Ps0_ini_dVbs ;
2192     } /* end of corecip=1 case (initial value calculation) */
2193 
2194 	MAX_LOOP_SCE = 5 ;
2195 	NNN = 0 ;
2196 
2197     /* ************************************************************************* */
2198 
2199 //  START_OF_SCE_LOOP : /* outer loop of multi level Newton framework            */
2200     START_OF_SCE_LOOP = 1 ; end_of_part_1 = 0 ;
2201 while( START_OF_SCE_LOOP ) { /* Begin: 1st SCE LOOP */
2202   while( START_OF_SCE_LOOP ) { /* Begin: 2nd SCE LOOP */
2203     while( START_OF_SCE_LOOP ) { /* Begin: 3rd SCE LOOP */
2204     START_OF_SCE_LOOP = 0 ;
2205 
2206     /* ************************************************************************* */
2207 
2208                         /* for multi level Newton method we need the derivatives */
2209                         /* with respect to PS0Z_SCE                              */
2210                         /* naming convention: ..._dPS0Z means d.../dPS0Z_SCE     */
2211 
2212 
2213   if ( flg_qme == 1 ) {
2214     /*---------------------------------------------------*
2215      * Vthp : Vth with pocket.
2216      *-----------------*/
2217 
2218     if( corecip ){
2219 
2220       T1 = here->HSM2_2qnsub_esi ;
2221       Qb0 = sqrt ( T1 ) ;
2222       Qb0_dVb = 0.0 ;
2223       Qb0_dVd = 0.0 ;
2224       Qb0_dVg = 0.0 ;
2225 
2226       Vthp     = PS0Z_SCE + Vfb + Qb0     * Cox_inv                     + here->HSM2_ptovr ;
2227       Vthp_dVb = PS0Z_SCE_dVbs  + Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ;
2228       Vthp_dVd = PS0Z_SCE_dVds  + Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ;
2229       Vthp_dVg = PS0Z_SCE_dVgs  + Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ;
2230       Vthp_dPS0Z = 1.0 ;
2231 
2232     }else{  /* original */
2233       T1 = here->HSM2_2qnsub_esi ;
2234       Qb0 = sqrt (T1 * (Pb20 - Vbsz2)) ;
2235       T2 = 0.5 * T1 / Qb0 ;
2236       Qb0_dVb = T2 * (- Vbsz2_dVbs) ;
2237       Qb0_dVd = T2 * (- Vbsz2_dVds) ;
2238       Qb0_dVg = T2 * (- Vbsz2_dVgs) ;
2239 
2240       Vthp = Pb20 + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr;
2241       Vthp_dVb = Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ;
2242       Vthp_dVd = Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ;
2243       Vthp_dVg = Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ;
2244     }
2245 
2246 
2247     Pb20b = Pb20 ;
2248     Pb20b_dVb = 0.0 ;
2249     Pb20b_dVd = 0.0 ;
2250     Pb20b_dVg = 0.0 ;
2251 
2252     T0 = 0.95 ;
2253     T1 = T0 * Pb20b - Vbsz2 - 1.0e-3 ;
2254     T1_dVb = T0 * Pb20b_dVb - Vbsz2_dVbs ;
2255     T1_dVd = T0 * Pb20b_dVd - Vbsz2_dVds ;
2256     T1_dVg = T0 * Pb20b_dVg - Vbsz2_dVgs ;
2257     T2 = sqrt (T1 * T1 + 4.0 * T0 * Pb20b * 1.0e-3) ;
2258     T3 = T0 * Pb20b - 0.5 * (T1 + T2) ;
2259     T4 = 2.0 * T0 * 1.0e-3 ;
2260     T5 = T1 / T2 ;
2261     T6 = T4 / T2 ;
2262     T3_dVb = T0 * Pb20b_dVb
2263            - 0.5 * (T1_dVb + (T1_dVb * T5 + T6 * Pb20b_dVb ) ) ;
2264     T3_dVd = T0 * Pb20b_dVd
2265            - 0.5 * (T1_dVd + (T1_dVd * T5 + T6 * Pb20b_dVd ) ) ;
2266     T3_dVg = T0 * Pb20b_dVg
2267            - 0.5 * (T1_dVg + (T1_dVg * T5 + T6 * Pb20b_dVg ) ) ;
2268     Pbsum = Pb20b - T3 ;
2269     Pbsum_dVb = Pb20b_dVb - T3_dVb ;
2270     Pbsum_dVd = Pb20b_dVd - T3_dVd ;
2271     Pbsum_dVg = Pb20b_dVg - T3_dVg ;
2272 
2273     sqrt_Pbsum = sqrt( Pbsum ) ;
2274 
2275     /*-------------------------------------------*
2276      * dVthLP : Short-channel effect induced by pocket.
2277      * - Vth0 : Vth without pocket.
2278      *-----------------*/
2279     if ( model->HSM2_lp != 0.0 ) {
2280 
2281       if( corecip ){
2282 
2283 	T1 = here->HSM2_2qnsub_esi ;
2284 	T2 = model->HSM2_bs2 - Vbsz2 ;
2285 	T3 = T2 + small ;
2286 	T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ;
2287 	T5 = 0.5 * (T3 + T4) ;
2288 	T6 = 0.5 * (1.0 + T3 / T4) ;
2289 	T5_dVb = - Vbsz2_dVbs * T6 ;
2290 	T5_dVd = - Vbsz2_dVds * T6 ;
2291 	T5_dVg = - Vbsz2_dVgs * T6 ;
2292 	T7 = 1.0 / T5 ;
2293 	bs12 = model->HSM2_bs1 * T7 ;
2294 	T8 = - bs12 * T7 ;
2295 	bs12_dVb = T8 * T5_dVb ;
2296 	bs12_dVd = T8 * T5_dVd ;
2297 	bs12_dVg = T8 * T5_dVg ;
2298 
2299 	T1     = 0.93 * ( PS0Z_SCE + Ps0_min - Vbsz2 );
2300 	T1_dVb = 0.93 * ( PS0Z_SCE_dVbs + Ps0_min_dVbs - Vbsz2_dVbs );
2301 	T1_dVd = 0.93 * ( PS0Z_SCE_dVds + Ps0_min_dVds - Vbsz2_dVds );
2302 	T1_dVg = 0.93 * ( PS0Z_SCE_dVgs + Ps0_min_dVgs - Vbsz2_dVgs );
2303         T1_dPS0Z = 0.93 ;
2304 
2305 	T2 = bs12 ;
2306 	T2_dVb = bs12_dVb ;
2307 	T2_dVd = bs12_dVd ;
2308 	T2_dVg = bs12_dVg ;
2309 
2310 	Fn_SU2( T10 , T2 , T1 , vth_dlt, T0, T3 ) ;
2311 	T10_dVb = T2_dVb * T0 + T1_dVb * T3 ;
2312 	T10_dVd = T2_dVd * T0 + T1_dVd * T3 ;
2313 	T10_dVg = T2_dVg * T0 + T1_dVg * T3 ;
2314         T10_dPS0Z = T1_dPS0Z * T3 ;
2315 
2316 	T4     = here->HSM2_2qnsub_esi * ( PS0Z_SCE + Ps0_min - Vbsz2 - T10 ) ;
2317 	T4_dVb = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVbs + Ps0_min_dVbs - Vbsz2_dVbs - T10_dVb ) ;
2318 	T4_dVd = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVds + Ps0_min_dVds - Vbsz2_dVds - T10_dVd ) ;
2319 	T4_dVg = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVgs + Ps0_min_dVgs - Vbsz2_dVgs - T10_dVg ) ;
2320         T4_dPS0Z = here->HSM2_2qnsub_esi * ( 1.0 - T10_dPS0Z ) ;
2321 
2322         if (T4 > arg2){
2323 	  Qbmm = sqrt ( T4 ) ;
2324 	  Qbmm_dVb = 0.5 / Qbmm * T4_dVb ;
2325 	  Qbmm_dVd = 0.5 / Qbmm * T4_dVd ;
2326 	  Qbmm_dVg = 0.5 / Qbmm * T4_dVg ;
2327           Qbmm_dPS0Z = 0.5 / Qbmm * T4_dPS0Z ;
2328         } else {
2329           Qbmm = sqrt(arg2) + 0.5 / sqrt(arg2) * ( T4 - arg2) ;
2330           Qbmm_dVb = 0.5 / sqrt(arg2) * T4_dVb ;
2331           Qbmm_dVd = 0.5 / sqrt(arg2) * T4_dVd ;
2332           Qbmm_dVg = 0.5 / sqrt(arg2) * T4_dVg ;
2333           Qbmm_dPS0Z = 0.5 / sqrt(arg2) * T4_dPS0Z ;
2334         }
2335 
2336 	dqb = ( Qb0 - Qbmm ) * Cox_inv ;
2337 	dqb_dVb = ( Qb0_dVb - Qbmm_dVb ) * Cox_inv + ( Qb0 - Qbmm ) * Cox_inv_dVb ;
2338 	dqb_dVd = ( Qb0_dVd - Qbmm_dVd ) * Cox_inv + ( Qb0 - Qbmm ) * Cox_inv_dVd ;
2339 	dqb_dVg = ( Qb0_dVg - Qbmm_dVg ) * Cox_inv + ( Qb0 - Qbmm ) * Cox_inv_dVg ;
2340         dqb_dPS0Z =      - Qbmm_dPS0Z * Cox_inv ;
2341 
2342 	if( codqb == 0 ){
2343 	  dqb = 0.0 ;
2344 	  dqb_dVb = 0.0 ;
2345 	  dqb_dVd = 0.0 ;
2346 	  dqb_dVg = 0.0 ;
2347           dqb_dPS0Z = 0.0 ;
2348 	}
2349 
2350 	T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ;
2351 	T2 = sqrt( T1 ) ;
2352 	T2_dVb = 0.0 ;
2353 	T2_dVd = 0.0 ;
2354 	T2_dVg = 0.0 ;
2355 
2356 	Vth0     = PS0Z_SCE + Vfb +    T2 * Cox_inv ;
2357 	Vth0_dVb = PS0Z_SCE_dVbs + T2_dVb * Cox_inv + T2 * Cox_inv_dVb ;
2358 	Vth0_dVd = PS0Z_SCE_dVds + T2_dVd * Cox_inv + T2 * Cox_inv_dVd ;
2359 	Vth0_dVg = PS0Z_SCE_dVgs + T2_dVg * Cox_inv + T2 * Cox_inv_dVg ;
2360         Vth0_dPS0Z = 1.0 ;
2361 
2362 	T1     = C_ESI * Cox_inv ;
2363 	T1_dVb = C_ESI * Cox_inv_dVb ;
2364 	T1_dVd = C_ESI * Cox_inv_dVd ;
2365 	T1_dVg = C_ESI * Cox_inv_dVg ;
2366 	T2 = here->HSM2_wdplp ;
2367 
2368 	T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ;
2369 	T3 = 2.0 * ( model->HSM2_vbi - Pb20 ) * T2 * T4 ;
2370 
2371 	T5 = T1 * T3 ;
2372 	T5_dVb = T1_dVb * T3 ;
2373 	T5_dVd = T1_dVd * T3 ;
2374 	T5_dVg = T1_dVg * T3 ;
2375 
2376 	T6     = PS0Z_SCE      - Vbsz ;
2377 	T6_dVb = PS0Z_SCE_dVbs - Vbsz_dVbs ;
2378 	T6_dVd = PS0Z_SCE_dVds - Vbsz_dVds ;
2379 	T6_dVg = PS0Z_SCE_dVgs ;
2380         T6_dPS0Z = 1.0 ;
2381 
2382   	Fn_SZ( T6, T6, C_sce_dlt, T0 );
2383 	T6_dVb *= T0 ;
2384 	T6_dVd *= T0 ;
2385 	T6_dVg *= T0 ;
2386         T6_dPS0Z *= T0 ;
2387 
2388 	dVth0     = T5 * sqrt( T6 ) ;
2389 	dVth0_dVb = T5 * 0.5 / sqrt( T6 ) * T6_dVb + T5_dVb * sqrt( T6 );
2390 	dVth0_dVd = T5 * 0.5 / sqrt( T6 ) * T6_dVd + T5_dVd * sqrt( T6 ) ;
2391 	dVth0_dVg = T5 * 0.5 / sqrt( T6 ) * T6_dVg + T5_dVg * sqrt( T6 ) ;
2392 	 dVth0_dPS0Z = T5 * 0.5 / sqrt( T6 ) * T6_dPS0Z ;
2393 
2394 	T1     = Vthp     - Vth0 ;
2395 	T1_dVb = Vthp_dVb - Vth0_dVb ;
2396 	T1_dVd = Vthp_dVd - Vth0_dVd ;
2397 	T1_dVg = Vthp_dVg - Vth0_dVg ;
2398         T1_dPS0Z = Vthp_dPS0Z - Vth0_dPS0Z ;
2399 
2400 	T9     = PS0Z_SCE      - Vbsz2 ;
2401 	T9_dVb = PS0Z_SCE_dVbs - Vbsz2_dVbs ;
2402 	T9_dVd = PS0Z_SCE_dVds - Vbsz2_dVds ;
2403 	T9_dVg = PS0Z_SCE_dVgs - Vbsz2_dVgs ;
2404         T9_dPS0Z = 1.0 ;
2405 
2406 	T3     = pParam->HSM2_scp1 + pParam->HSM2_scp3 * T9 / model->HSM2_lp + pParam->HSM2_scp2 * Vdsz ;
2407 	T3_dVb = pParam->HSM2_scp3 * T9_dVb / model->HSM2_lp ;
2408 	T3_dVd = pParam->HSM2_scp3 * T9_dVd / model->HSM2_lp + pParam->HSM2_scp2 * Vdsz_dVds ;
2409 	T3_dVg = pParam->HSM2_scp3 * T9_dVg / model->HSM2_lp ;
2410         T3_dPS0Z = pParam->HSM2_scp3 * T9_dPS0Z / model->HSM2_lp ;
2411 
2412 	Vdx = model->HSM2_scp21 + Vdsz ;
2413 	Vdx2 = Vdx * Vdx + small ;
2414 	T4 = Vdx * Vdx + small ;
2415 	T4_dVb = 0.0 ;
2416 	T4_dVd = 2.0 * Vdx * Vdsz_dVds ;
2417 	T4_dVg = 0.0 ;
2418 
2419 	T5 = 1.0 / T4 ;
2420 	T5_dVb = - T4_dVb / T4 / T4 ;
2421 	T5_dVd = - T4_dVd / T4 / T4 ;
2422 	T5_dVg = - T4_dVg / T4 / T4 ;
2423 
2424 	dVthLP     = T1 * dVth0 * T3 + dqb - here->HSM2_msc * T5  ;
2425 	dVthLP_dVb = T1_dVb * dVth0 * T3 + T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb + dqb_dVb - here->HSM2_msc * T5_dVb  ;
2426 	dVthLP_dVd = T1_dVd * dVth0 * T3 + T1 * dVth0_dVd * T3 + T1 * dVth0 * T3_dVd + dqb_dVd - here->HSM2_msc * T5_dVd  ;
2427 	dVthLP_dVg = T1_dVg * dVth0 * T3 + T1 * dVth0_dVg * T3 + T1 * dVth0 * T3_dVg + dqb_dVg - here->HSM2_msc * T5_dVg  ;
2428         dVthLP_dPS0Z = T1_dPS0Z * dVth0 * T3 + T1 * dVth0_dPS0Z * T3 + T1 * dVth0 * T3_dPS0Z + dqb_dPS0Z   ;
2429 
2430       }else{  /* original */
2431 
2432 	T1 = here->HSM2_2qnsub_esi ;
2433 	T2 = model->HSM2_bs2 - Vbsz2 ;
2434 	T3 = T2 + small ;
2435 	T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ;
2436 	T5 = 0.5 * (T3 + T4) ;
2437 	T6 = 0.5 * (1.0 + T3 / T4) ;
2438 	T5_dVb = - Vbsz2_dVbs * T6 ;
2439 	T5_dVd = - Vbsz2_dVds * T6 ;
2440 	T5_dVg = - Vbsz2_dVgs * T6 ;
2441 	T7 = 1.0 / T5 ;
2442 	bs12 = model->HSM2_bs1 * T7 ;
2443 	T8 = - bs12 * T7 ;
2444 	bs12_dVb = T8 * T5_dVb ;
2445 	bs12_dVd = T8 * T5_dVd ;
2446 	bs12_dVg = T8 * T5_dVg ;
2447 	Fn_SU( T10 , Vbsz2 + bs12, 0.93 * Pb20, vth_dlt, T0) ;
2448 	Qbmm = sqrt (T1 * (Pb20 - T10 )) ;
2449 	T9 = T0 / Qbmm ;
2450 	Qbmm_dVb = 0.5 * T1 * - (Vbsz2_dVbs + bs12_dVb) * T9 ;
2451 	Qbmm_dVd = 0.5 * T1 * - (Vbsz2_dVds + bs12_dVd) * T9 ;
2452 	Qbmm_dVg = 0.5 * T1 * - (Vbsz2_dVgs + bs12_dVg) * T9 ;
2453 
2454 	dqb = (Qb0 - Qbmm) * Cox_inv ;
2455 	dqb_dVb = Vthp_dVb - Qbmm_dVb * Cox_inv - Qbmm * Cox_inv_dVb ;
2456 	dqb_dVd = Vthp_dVd - Qbmm_dVd * Cox_inv - Qbmm * Cox_inv_dVd ;
2457 	dqb_dVg = Vthp_dVg - Qbmm_dVg * Cox_inv - Qbmm * Cox_inv_dVg ;
2458 
2459 	T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ;
2460 	T2 = sqrt( T1 * ( Pb2c - Vbsz2 ) ) ;
2461 	Vth0 = Pb2c + Vfb + T2 * Cox_inv ;
2462 	T3 = 0.5 * T1 / T2 * Cox_inv ;
2463 	Vth0_dVb = T3 * ( - Vbsz2_dVbs ) + T2 * Cox_inv_dVb ;
2464 	Vth0_dVd = T3 * ( - Vbsz2_dVds ) + T2 * Cox_inv_dVd ;
2465 	Vth0_dVg = T3 * ( - Vbsz2_dVgs ) + T2 * Cox_inv_dVg ;
2466 
2467 	T1 = C_ESI * Cox_inv ;
2468 	T2 = here->HSM2_wdplp ;
2469 	T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ;
2470 	T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ;
2471 	dVth0 = T5 * sqrt_Pbsum ;
2472 	T6 = 0.5 * T5 / sqrt_Pbsum ;
2473 	T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ;
2474 	T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ;
2475 	dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
2476 	dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
2477 	dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
2478 
2479 	T1 = Vthp - Vth0 ;
2480 	T2 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * Pbsum / model->HSM2_lp ;
2481 	T3 = T2 + pParam->HSM2_scp2 * Vdsz ;
2482 
2483 	Vdx = model->HSM2_scp21 + Vdsz ;
2484 	Vdx2 = Vdx * Vdx + small ;
2485 
2486 	dVthLP = T1 * dVth0 * T3 + dqb - here->HSM2_msc / Vdx2 ;
2487 	T4 = T1 * dVth0 * pParam->HSM2_scp3 / model->HSM2_lp ;
2488 	dVthLP_dVb = (Vthp_dVb - Vth0_dVb) * dVth0 * T3 + T1 * dVth0_dVb * T3
2489 	  + T4 * Pbsum_dVb + dqb_dVb ;
2490 	dVthLP_dVd = (Vthp_dVd - Vth0_dVd) * dVth0 * T3 + T1 * dVth0_dVd * T3
2491 	  + T4 * Pbsum_dVd
2492 	  + T1 * dVth0 * pParam->HSM2_scp2 * Vdsz_dVds
2493 	  + dqb_dVd
2494 	  + 2.0e0 * here->HSM2_msc * Vdx * Vdsz_dVds / ( Vdx2 * Vdx2 ) ;
2495 	dVthLP_dVg = (Vthp_dVg - Vth0_dVg) * dVth0 * T3 + T1 * dVth0_dVg * T3
2496 	  + T4 * Pbsum_dVg + dqb_dVg ;
2497       }
2498 
2499     } else {
2500       dVthLP = 0.0e0 ;
2501       dVthLP_dVb = 0.0e0 ;
2502       dVthLP_dVd = 0.0e0 ;
2503       dVthLP_dVg = 0.0e0 ;
2504     }
2505 
2506     /*---------------------------------------------------*
2507      * dVthSC : Short-channel effect induced by Vds.
2508      *-----------------*/
2509 
2510     if( corecip ){
2511 
2512       T3 = here->HSM2_lgate - model->HSM2_parl2 ;
2513       T4 = 1.0e0 / ( T3 * T3 ) ;
2514       T5 = pParam->HSM2_sc3 / here->HSM2_lgate ;
2515 
2516       T6     = pParam->HSM2_sc1 + T5 * ( PS0Z_SCE - Vbsz ) ;
2517       T6_dVb = T5 * ( PS0Z_SCE_dVbs - Vbsz_dVbs );
2518       T6_dVd = T5 * ( PS0Z_SCE_dVds - Vbsz_dVds );
2519       T6_dVg = T5 *   PS0Z_SCE_dVgs ;
2520        T6_dPS0Z = T5 ;
2521 
2522       /* QME:1  CORECIP:1 */
2523       if( pParam->HSM2_sc4 != 0 ){
2524 	T8     = pParam->HSM2_sc4 * Vdsz * ( PS0Z_SCE - Vbsz ) ;
2525 	T8_dVd = pParam->HSM2_sc4 * ( Vdsz_dVds * ( PS0Z_SCE - Vbsz ) + Vdsz * ( PS0Z_SCE_dVds - Vbsz_dVds ) ) ;
2526 	T8_dVb = pParam->HSM2_sc4 *                                     Vdsz * ( PS0Z_SCE_dVbs - Vbsz_dVbs )   ;
2527 	T8_dVg = pParam->HSM2_sc4 *                                     Vdsz *   PS0Z_SCE_dVgs                 ;
2528         T8_dPS0Z = pParam->HSM2_sc4 * Vdsz ;
2529 
2530 	T1     = T6     + pParam->HSM2_sc2 * Vdsz + T8 ;
2531 	T1_dVd = T6_dVd + pParam->HSM2_sc2 * Vdsz_dVds + T8_dVd ;
2532 	T1_dVb = T6_dVb + T8_dVb ;
2533 	T1_dVg = T6_dVg + T8_dVg ;
2534         T1_dPS0Z = T6_dPS0Z + T8_dPS0Z ;
2535       }else{
2536 	T1     = T6     + pParam->HSM2_sc2 * Vdsz      ;
2537 	T1_dVb = T6_dVb                                ;
2538 	T1_dVd = T6_dVd + pParam->HSM2_sc2 * Vdsz_dVds ;
2539 	T1_dVg = T6_dVg                                ;
2540         T1_dPS0Z = T6_dPS0Z                      ;
2541       }
2542 
2543       T0 = C_ESI * here->HSM2_wdpl * 2.0e0 * ( model->HSM2_vbi - Pb20 ) * T4 ;
2544 
2545       T2     = T0 * Cox_inv ;
2546       T2_dVb = T0 * Cox_inv_dVb ;
2547       T2_dVd = T0 * Cox_inv_dVd ;
2548       T2_dVg = T0 * Cox_inv_dVg ;
2549 
2550       A      = T2 * T1 ;
2551       A_dVbs = T2 * T1_dVb + T1 * T2_dVb ;
2552       A_dVds = T2 * T1_dVd + T1 * T2_dVd ;
2553       A_dVgs = T2 * T1_dVg + T1 * T2_dVg ;
2554        A_dPS0Z = T2 * T1_dPS0Z      ;
2555 
2556       T9     = PS0Z_SCE      - Vbsz + Ps0_min ;
2557       T9_dVb = PS0Z_SCE_dVbs - Vbsz_dVbs + Ps0_min_dVbs ;
2558       T9_dVd = PS0Z_SCE_dVds - Vbsz_dVds + Ps0_min_dVds ;
2559       T9_dVg = PS0Z_SCE_dVgs             + Ps0_min_dVgs ;
2560        T9_dPS0Z = 1.0 ;
2561 
2562       if ( T9 > arg0 ) {
2563         T8 = sqrt( T9 ) ;
2564         T8_dVb = 0.5 * T9_dVb / T8 ;
2565         T8_dVd = 0.5 * T9_dVd / T8 ;
2566         T8_dVg = 0.5 * T9_dVg / T8 ;
2567         T8_dPS0Z = 0.5 * T9_dPS0Z / T8 ;
2568       } else {
2569         T8 = sqrt(arg0) + 0.5 / sqrt(arg0) * ( T9 - arg0) ;
2570         T8_dVb = 0.5 / sqrt(arg0) * T9_dVb ;
2571         T8_dVd = 0.5 / sqrt(arg0) * T9_dVd ;
2572         T8_dVg = 0.5 / sqrt(arg0) * T9_dVg ;
2573         T8_dPS0Z = 0.5 / sqrt(arg0) * T9_dPS0Z ;
2574       }
2575 
2576       dVthSC = A * T8 ;
2577       dVthSC_dVb = A * T8_dVb + A_dVbs * T8;
2578       dVthSC_dVd = A * T8_dVd + A_dVds * T8;
2579       dVthSC_dVg = A * T8_dVg + A_dVgs * T8;
2580       dVthSC_dPS0Z = A * T8_dPS0Z + A_dPS0Z * T8;
2581 
2582 
2583     }else{  /* original */
2584 
2585       T1 = C_ESI * Cox_inv ;
2586       T2 = here->HSM2_wdpl ;
2587       T3 = here->HSM2_lgate - model->HSM2_parl2 ;
2588       T4 = 1.0e0 / ( T3 * T3 ) ;
2589       T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ;
2590 
2591       dVth0 = T5 * sqrt_Pbsum ;
2592       T6 = T5 / 2.0 / sqrt_Pbsum ;
2593       T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ;
2594       T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ;
2595       dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
2596       dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
2597       dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
2598 
2599       T1 = pParam->HSM2_sc3 / here->HSM2_lgate ;
2600       T4 = pParam->HSM2_sc1 + T1 * Pbsum ;
2601       T4_dVb = T1 * Pbsum_dVb ;
2602       T4_dVd = T1 * Pbsum_dVd ;
2603       T4_dVg = T1 * Pbsum_dVg ;
2604 
2605       /* QME:1  CORECIP:0 */
2606       if( pParam->HSM2_sc4 != 0 ){
2607 	T8     = pParam->HSM2_sc4 *   Vdsz * Pbsum ;
2608 	T8_dVd = pParam->HSM2_sc4 * ( Vdsz_dVds * Pbsum + Vdsz * Pbsum_dVd ) ;
2609 	T8_dVb = pParam->HSM2_sc4 *                       Vdsz * Pbsum_dVb   ;
2610 	T8_dVg = pParam->HSM2_sc4 *                       Vdsz * Pbsum_dVg   ;
2611 
2612 	T5     = T4     + pParam->HSM2_sc2 * Vdsz      + T8     ;
2613 	T5_dVd = T4_dVd + pParam->HSM2_sc2 * Vdsz_dVds + T8_dVd ;
2614 	T5_dVb = T4_dVb                                + T8_dVb ;
2615 	T5_dVg = T4_dVg                                + T8_dVg ;
2616       }else{
2617 	T5     = T4     + pParam->HSM2_sc2 * Vdsz      ;
2618 	T5_dVb = T4_dVb                                ;
2619 	T5_dVd = T4_dVd + pParam->HSM2_sc2 * Vdsz_dVds ;
2620 	T5_dVg = T4_dVg                                ;
2621       }
2622 
2623       dVthSC = dVth0 * T5 ;
2624       dVthSC_dVb = dVth0_dVb * T5 + dVth0 * T5_dVb ;
2625       dVthSC_dVd = dVth0_dVd * T5 + dVth0 * T5_dVd ;
2626       dVthSC_dVg = dVth0_dVg * T5 + dVth0 * T5_dVg ;
2627 
2628     }
2629 
2630 
2631     /*---------------------------------------------------*
2632      * dVthW : narrow-channel effect.
2633      *-----------------*/
2634     T1 = 1.0 / Cox ;
2635     T2 = T1 * T1 ;
2636     T3 = 1.0 / ( Cox +  pParam->HSM2_wfc / Weff ) ;
2637     T4 = T3 * T3 ;
2638     T5 = T1 - T3 ;
2639     T6 = Qb0 * ( T2 - T4 ) ;
2640 
2641     if( corecip ){
2642       dVthW = Qb0 * T5 + pParam->HSM2_wvth0 / here->HSM2_wg ;
2643       dVthW_dVb = Qb0_dVb * T5 - Cox_dVb * T6 ;
2644       dVthW_dVd = Qb0_dVd * T5 - Cox_dVd * T6 ;
2645       dVthW_dVg = Qb0_dVg * T5 - Cox_dVg * T6 ;
2646     }else{ /* original */
2647       dVthW = Qb0 * T5 + pParam->HSM2_wvth0 / here->HSM2_wg ;
2648       dVthW_dVb = Qb0_dVb * T5 - Cox_dVb * T6 ;
2649       dVthW_dVd = Qb0_dVd * T5 - Cox_dVd * T6 ;
2650       dVthW_dVg =              - Cox_dVg * T6 ;
2651     }
2652 
2653     /* end of case flg_qme = 1 */
2654 
2655   } else {
2656 
2657     /* now case flg_qme = 0    */
2658 
2659     /*---------------------------------------------------*
2660      * Vthp : Vth with pocket.
2661      *-----------------*/
2662 
2663     if( corecip ){
2664       T1 = here->HSM2_2qnsub_esi ;
2665       Qb0 = sqrt ( T1 ) ;
2666       Qb0_dVb = 0.0 ;
2667       Qb0_dVd = 0.0 ;
2668       Qb0_dVg = 0.0 ;
2669 
2670       Vthp     = PS0Z_SCE + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr;
2671       Vthp_dVb = PS0Z_SCE_dVbs + Qb0_dVb * Cox_inv ;
2672       Vthp_dVd = PS0Z_SCE_dVds + Qb0_dVd * Cox_inv ;
2673       Vthp_dVg = PS0Z_SCE_dVgs + Qb0_dVg * Cox_inv ;
2674        Vthp_dPS0Z = 1.0 ;
2675     }else{  /* original */
2676       T1 = here->HSM2_2qnsub_esi ;
2677       Qb0 = sqrt (T1 * (Pb20 - Vbsz2)) ;
2678       T2 = 0.5 * T1 / Qb0 ;
2679       Qb0_dVb = T2 * (- Vbsz2_dVbs) ;
2680       Qb0_dVd = T2 * (- Vbsz2_dVds) ;
2681       Qb0_dVg = T2 * (- Vbsz2_dVgs) ;
2682 
2683       Vthp = Pb20 + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr;
2684       Vthp_dVb = Qb0_dVb * Cox_inv ;
2685       Vthp_dVd = Qb0_dVd * Cox_inv ;
2686       Vthp_dVg = Qb0_dVg * Cox_inv ;
2687     }
2688 
2689     Pb20b = Pb20 ;
2690     Pb20b_dVb = 0.0 ;
2691     Pb20b_dVd = 0.0 ;
2692     Pb20b_dVg = 0.0 ;
2693 
2694     T0 = 0.95 ;
2695     T1 = T0 * Pb20b - Vbsz2 - 1.0e-3 ;
2696     T1_dVb = T0 * Pb20b_dVb - Vbsz2_dVbs ;
2697     T1_dVd = T0 * Pb20b_dVd - Vbsz2_dVds ;
2698     T1_dVg = T0 * Pb20b_dVg - Vbsz2_dVgs ;
2699     T2 = sqrt (T1 * T1 + 4.0 * T0 * Pb20b * 1.0e-3) ;
2700     T3 = T0 * Pb20b - 0.5 * (T1 + T2) ;
2701     T4 = 2.0 * T0 * 1.0e-3 ;
2702     T5 = T1 / T2 ;
2703     T6 = T4 / T2 ;
2704     T3_dVb = T0 * Pb20b_dVb
2705            - 0.5 * (T1_dVb + (T1_dVb * T5 + T6 * Pb20b_dVb ) ) ;
2706     T3_dVd = T0 * Pb20b_dVd
2707            - 0.5 * (T1_dVd + (T1_dVd * T5 + T6 * Pb20b_dVd ) ) ;
2708     T3_dVg = T0 * Pb20b_dVg
2709            - 0.5 * (T1_dVg + (T1_dVg * T5 + T6 * Pb20b_dVg ) ) ;
2710     Pbsum = Pb20b - T3 ;
2711     Pbsum_dVb = Pb20b_dVb - T3_dVb ;
2712     Pbsum_dVd = Pb20b_dVd - T3_dVd ;
2713     Pbsum_dVg = Pb20b_dVg - T3_dVg ;
2714 
2715     sqrt_Pbsum = sqrt( Pbsum ) ;
2716 
2717     /*-------------------------------------------*
2718      * dVthLP : Short-channel effect induced by pocket.
2719      * - Vth0 : Vth without pocket.
2720      *-----------------*/
2721     if ( model->HSM2_lp != 0.0 ) {
2722 
2723       if( corecip ){
2724 	T1 = here->HSM2_2qnsub_esi ;
2725 	T2 = model->HSM2_bs2 - Vbsz2 ;
2726 	T3 = T2 + small ;
2727 	T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ;
2728 	T5 = 0.5 * (T3 + T4) ;
2729 	T6 = 0.5 * (1.0 + T3 / T4) ;
2730 	T5_dVb = - Vbsz2_dVbs * T6 ;
2731 	T5_dVd = - Vbsz2_dVds * T6 ;
2732 	T5_dVg = - Vbsz2_dVgs * T6 ;
2733 	T7 = 1.0 / T5 ;
2734 	bs12 = model->HSM2_bs1 * T7 ;
2735 	T8 = - bs12 * T7 ;
2736 	bs12_dVb = T8 * T5_dVb ;
2737 	bs12_dVd = T8 * T5_dVd ;
2738 	bs12_dVg = T8 * T5_dVg ;
2739 
2740 	T1     = 0.93 * ( PS0Z_SCE + Ps0_min - Vbsz2 );
2741 	T1_dVb = 0.93 * ( PS0Z_SCE_dVbs + Ps0_min_dVbs - Vbsz2_dVbs );
2742 	T1_dVd = 0.93 * ( PS0Z_SCE_dVds + Ps0_min_dVds - Vbsz2_dVds );
2743 	T1_dVg = 0.93 * ( PS0Z_SCE_dVgs + Ps0_min_dVgs - Vbsz2_dVgs );
2744         T1_dPS0Z = 0.93 ;
2745 
2746 	T2 = bs12 ;
2747 	T2_dVb = bs12_dVb ;
2748 	T2_dVd = bs12_dVd ;
2749 	T2_dVg = bs12_dVg ;
2750 
2751 	Fn_SU2( T10 , T2 , T1 , vth_dlt, T0, T3 ) ;
2752 	T10_dVb = T2_dVb * T0 + T1_dVb * T3 ;
2753 	T10_dVd = T2_dVd * T0 + T1_dVd * T3 ;
2754 	T10_dVg = T2_dVg * T0 + T1_dVg * T3 ;
2755         T10_dPS0Z = T1_dPS0Z * T3 ;
2756 
2757 	T4     = here->HSM2_2qnsub_esi * ( PS0Z_SCE + Ps0_min - Vbsz2 - T10 ) ;
2758 	T4_dVb = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVbs + Ps0_min_dVbs - Vbsz2_dVbs - T10_dVb ) ;
2759 	T4_dVd = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVds + Ps0_min_dVds - Vbsz2_dVds - T10_dVd ) ;
2760 	T4_dVg = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVgs + Ps0_min_dVgs - Vbsz2_dVgs - T10_dVg ) ;
2761         T4_dPS0Z = here->HSM2_2qnsub_esi * ( 1.0 - T10_dPS0Z ) ;
2762 
2763         if (T4 > arg2){
2764 	  Qbmm = sqrt ( T4 ) ;
2765 	  Qbmm_dVb = 0.5 / Qbmm * T4_dVb ;
2766 	  Qbmm_dVd = 0.5 / Qbmm * T4_dVd ;
2767 	  Qbmm_dVg = 0.5 / Qbmm * T4_dVg ;
2768           Qbmm_dPS0Z = 0.5 / Qbmm * T4_dPS0Z ;
2769         } else {
2770           Qbmm = sqrt(arg2) + 0.5 / sqrt(arg2) * ( T4 - arg2) ;
2771           Qbmm_dVb = 0.5 / sqrt(arg2) * T4_dVb ;
2772           Qbmm_dVd = 0.5 / sqrt(arg2) * T4_dVd ;
2773           Qbmm_dVg = 0.5 / sqrt(arg2) * T4_dVg ;
2774           Qbmm_dPS0Z = 0.5 / sqrt(arg2) * T4_dPS0Z ;
2775         }
2776 
2777 	dqb = ( Qb0 - Qbmm ) * Cox_inv ;
2778 	dqb_dVb = ( Qb0_dVb - Qbmm_dVb ) * Cox_inv ;
2779 	dqb_dVd = ( Qb0_dVd - Qbmm_dVd ) * Cox_inv ;
2780 	dqb_dVg = ( Qb0_dVg - Qbmm_dVg ) * Cox_inv ;
2781         dqb_dPS0Z = ( - Qbmm_dPS0Z ) * Cox_inv ;
2782 
2783         /*  W/O QME PART  */
2784 	if( codqb == 0 ){
2785 	  dqb = 0 ;
2786 	  dqb_dVb = 0 ;
2787 	  dqb_dVd = 0 ;
2788 	  dqb_dVg = 0 ;
2789           dqb_dPS0Z = 0.0 ;
2790 	}
2791 
2792 	T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ;
2793 	T2 = sqrt( T1 ) ;
2794 	T2_dVb = 0.0 ;
2795 	T2_dVd = 0.0 ;
2796 	T2_dVg = 0.0 ;
2797 
2798 	Vth0     = PS0Z_SCE + Vfb +    T2 * Cox_inv ;
2799 	Vth0_dVb = PS0Z_SCE_dVbs + T2_dVb * Cox_inv ;
2800 	Vth0_dVd = PS0Z_SCE_dVds + T2_dVd * Cox_inv ;
2801 	Vth0_dVg = PS0Z_SCE_dVgs + T2_dVg * Cox_inv ;
2802         Vth0_dPS0Z = 1.0 ;
2803 
2804 	T1 = C_ESI * Cox_inv ;
2805 	T2 = here->HSM2_wdplp ;
2806 
2807 	T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ;
2808 	T5 = 2.0e0 * ( model->HSM2_vbi - Pb20 ) * T1 * T2 * T4 ;
2809 	T5_dVb = 0.0 ;
2810 	T5_dVd = 0.0 ;
2811 	T5_dVg = 0.0 ;
2812 
2813 	T6     = PS0Z_SCE      - Vbsz      ;
2814 	T6_dVb = PS0Z_SCE_dVbs - Vbsz_dVbs ;
2815 	T6_dVd = PS0Z_SCE_dVds - Vbsz_dVds ;
2816 	T6_dVg = PS0Z_SCE_dVgs                         ;
2817         T6_dPS0Z = 1.0 ;
2818 
2819 	Fn_SZ(T6, T6, C_sce_dlt, T0 );
2820         T6 += small ;
2821 	T6_dVb *= T0 ;
2822 	T6_dVd *= T0 ;
2823 	T6_dVg *= T0 ;
2824         T6_dPS0Z *= T0 ;
2825 
2826 	dVth0 = T5 * sqrt( T6 ) ;
2827 	dVth0_dVb = T5 * 0.5 / sqrt( T6 ) * T6_dVb + T5_dVb * sqrt( T6 );
2828 	dVth0_dVd = T5 * 0.5 / sqrt( T6 ) * T6_dVd + T5_dVd * sqrt( T6 ) ;
2829 	dVth0_dVg = T5 * 0.5 / sqrt( T6 ) * T6_dVg + T5_dVg * sqrt( T6 ) ;
2830         dVth0_dPS0Z = T5 * 0.5 / sqrt( T6 ) * T6_dPS0Z ;
2831 
2832 	T1 = Vthp - Vth0 ;
2833 	T1_dVb = Vthp_dVb - Vth0_dVb ;
2834 	T1_dVd = Vthp_dVd - Vth0_dVd ;
2835 	T1_dVg = Vthp_dVg - Vth0_dVg ;
2836         T1_dPS0Z = Vthp_dPS0Z - Vth0_dPS0Z ;
2837 
2838 	T9 = PS0Z_SCE - Vbsz2 ;
2839 	T9_dVb = PS0Z_SCE_dVbs - Vbsz2_dVbs ;
2840 	T9_dVd = PS0Z_SCE_dVds - Vbsz2_dVds ;
2841 	T9_dVg = PS0Z_SCE_dVgs - Vbsz2_dVgs ;
2842         T9_dPS0Z = 1.0 ;
2843 
2844 	T3 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * T9 / model->HSM2_lp + pParam->HSM2_scp2 * Vdsz ;
2845 	T3_dVb = pParam->HSM2_scp3 * T9_dVb / model->HSM2_lp ;
2846 	T3_dVd = pParam->HSM2_scp3 * T9_dVd / model->HSM2_lp + pParam->HSM2_scp2 * Vdsz_dVds ;
2847 	T3_dVg = pParam->HSM2_scp3 * T9_dVg / model->HSM2_lp ;
2848         T3_dPS0Z = pParam->HSM2_scp3 * T9_dPS0Z / model->HSM2_lp ;
2849 
2850 	Vdx = model->HSM2_scp21 + Vdsz ;
2851 	Vdx2 = Vdx * Vdx + small ;
2852 	T4 = Vdx * Vdx + small ;
2853 	T4_dVb = 0.0 ;
2854 	T4_dVd = 2.0 * Vdx * Vdsz_dVds ;
2855 	T4_dVg = 0.0 ;
2856 
2857 	T5 = 1.0 / T4 ;
2858 	T5_dVb = - T4_dVb / T4 / T4 ;
2859 	T5_dVd = - T4_dVd / T4 / T4 ;
2860 	T5_dVg = - T4_dVg / T4 / T4 ;
2861 
2862 	dVthLP     = T1 * dVth0 * T3 + dqb - here->HSM2_msc * T5  ;
2863 	dVthLP_dVb = T1_dVb * dVth0 * T3 + T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb + dqb_dVb - here->HSM2_msc * T5_dVb  ;
2864 	dVthLP_dVd = T1_dVd * dVth0 * T3 + T1 * dVth0_dVd * T3 + T1 * dVth0 * T3_dVd + dqb_dVd - here->HSM2_msc * T5_dVd  ;
2865 	dVthLP_dVg = T1_dVg * dVth0 * T3 + T1 * dVth0_dVg * T3 + T1 * dVth0 * T3_dVg + dqb_dVg - here->HSM2_msc * T5_dVg  ;
2866         dVthLP_dPS0Z = T1_dPS0Z * dVth0 * T3 + T1 * dVth0_dPS0Z * T3 + T1 * dVth0 * T3_dPS0Z + dqb_dPS0Z   ;
2867 
2868       }else{  /* Original */
2869 
2870 	T1 = here->HSM2_2qnsub_esi ;
2871 	T2 = model->HSM2_bs2 - Vbsz2 ;
2872 	T3 = T2 + small ;
2873 	T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ;
2874 	T5 = 0.5 * (T3 + T4) ;
2875 	T6 = 0.5 * (1.0 + T3 / T4) ;
2876 	T5_dVb = - Vbsz2_dVbs * T6 ;
2877 	T5_dVd = - Vbsz2_dVds * T6 ;
2878 	T5_dVg = - Vbsz2_dVgs * T6 ;
2879 	T7 = 1.0 / T5 ;
2880 	bs12 = model->HSM2_bs1 * T7 ;
2881 	T8 = - bs12 * T7 ;
2882 	bs12_dVb = T8 * T5_dVb ;
2883 	bs12_dVd = T8 * T5_dVd ;
2884 	bs12_dVg = T8 * T5_dVg ;
2885 	Fn_SU( T10 , Vbsz2 + bs12, 0.93 * Pb20, vth_dlt, T0) ;
2886 	Qbmm = sqrt (T1 * (Pb20 - T10 )) ;
2887 
2888 	T9 = T0 / Qbmm ;
2889 	Qbmm_dVb = 0.5 * T1 * - (Vbsz2_dVbs + bs12_dVb) * T9 ;
2890 	Qbmm_dVd = 0.5 * T1 * - (Vbsz2_dVds + bs12_dVd) * T9 ;
2891 	Qbmm_dVg = 0.5 * T1 * - (Vbsz2_dVgs + bs12_dVg) * T9 ;
2892 
2893 	dqb = (Qb0 - Qbmm) * Cox_inv ;
2894 	dqb_dVb = Vthp_dVb - Qbmm_dVb * Cox_inv ;
2895 	dqb_dVd = Vthp_dVd - Qbmm_dVd * Cox_inv ;
2896 	dqb_dVg = Vthp_dVg - Qbmm_dVg * Cox_inv ;
2897 
2898 	T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ;
2899 	T2 = sqrt( T1 * ( Pb2c - Vbsz2 ) ) ;
2900 	Vth0 = Pb2c + Vfb + T2 * Cox_inv ;
2901 	T3 = 0.5 * T1 / T2 * Cox_inv ;
2902 	Vth0_dVb = T3 * ( - Vbsz2_dVbs ) ;
2903 	Vth0_dVd = T3 * ( - Vbsz2_dVds ) ;
2904 	Vth0_dVg = T3 * ( - Vbsz2_dVgs ) ;
2905 
2906 	T1 = C_ESI * Cox_inv ;
2907 	T2 = here->HSM2_wdplp ;
2908 
2909 	T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ;
2910 	T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ;
2911 	dVth0 = T5 * sqrt_Pbsum ;
2912 	T6 = 0.5 * T5 / sqrt_Pbsum ;
2913 	T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ;
2914 	T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ;
2915 	dVth0_dVb = T6 * Pbsum_dVb + T8 * Pb20b_dVb ;
2916 	dVth0_dVd = T6 * Pbsum_dVd + T8 * Pb20b_dVd ;
2917 	dVth0_dVg = T6 * Pbsum_dVg + T8 * Pb20b_dVg ;
2918 
2919 	T1 = Vthp - Vth0 ;
2920 	T2 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * Pbsum / model->HSM2_lp ;
2921 	T3 = T2 + pParam->HSM2_scp2 * Vdsz ;
2922 
2923 	Vdx = model->HSM2_scp21 + Vdsz ;
2924 	Vdx2 = Vdx * Vdx + small ;
2925 
2926 	dVthLP = T1 * dVth0 * T3 + dqb - here->HSM2_msc / Vdx2 ;
2927 	T4 = T1 * dVth0 * pParam->HSM2_scp3 / model->HSM2_lp ;
2928 	dVthLP_dVb = (Vthp_dVb - Vth0_dVb) * dVth0 * T3 + T1 * dVth0_dVb * T3
2929 	  + T4 * Pbsum_dVb + dqb_dVb ;
2930 	dVthLP_dVd = (Vthp_dVd - Vth0_dVd) * dVth0 * T3 + T1 * dVth0_dVd * T3
2931 	  + T4 * Pbsum_dVd
2932 	  + T1 * dVth0 * pParam->HSM2_scp2 * Vdsz_dVds
2933 	  + dqb_dVd
2934 	  + 2.0e0 * here->HSM2_msc * Vdx * Vdsz_dVds / ( Vdx2 * Vdx2 ) ;
2935 	dVthLP_dVg = (Vthp_dVg - Vth0_dVg) * dVth0 * T3 + T1 * dVth0_dVg * T3
2936 	  + T4 * Pbsum_dVg + dqb_dVg ;
2937 
2938       }
2939 
2940     } else {
2941       dVthLP = 0.0e0 ;
2942       dVthLP_dVb = 0.0e0 ;
2943       dVthLP_dVd = 0.0e0 ;
2944       dVthLP_dVg = 0.0e0 ;
2945     }
2946 
2947     /*---------------------------------------------------*
2948      * dVthSC : Short-channel effect induced by Vds.
2949      *-----------------*/
2950 
2951     if( corecip ){
2952       T3 = here->HSM2_lgate - model->HSM2_parl2 ;
2953       T4 = 1.0e0 / ( T3 * T3 ) ;
2954       T5 = pParam->HSM2_sc3 / here->HSM2_lgate ;
2955 
2956       T6     = pParam->HSM2_sc1 + T5 * ( PS0Z_SCE - Vbsz ) ;
2957       T6_dVb = T5 * ( PS0Z_SCE_dVbs - Vbsz_dVbs );
2958       T6_dVd = T5 * ( PS0Z_SCE_dVds - Vbsz_dVds );
2959       T6_dVg = T5 *   PS0Z_SCE_dVgs ;
2960       T6_dPS0Z = T5 ;
2961 
2962       /* QME:0  CORECIP:1 */
2963       if( pParam->HSM2_sc4 != 0 ){
2964 	T8     = pParam->HSM2_sc4 * Vdsz * ( PS0Z_SCE - Vbsz ) ;
2965 	T8_dVd = pParam->HSM2_sc4 * ( Vdsz_dVds * ( PS0Z_SCE - Vbsz ) + Vdsz * ( PS0Z_SCE_dVds - Vbsz_dVds ) ) ;
2966 	T8_dVb = pParam->HSM2_sc4 *                                     Vdsz * ( PS0Z_SCE_dVbs - Vbsz_dVbs )   ;
2967 	T8_dVg = pParam->HSM2_sc4 *                                     Vdsz *   PS0Z_SCE_dVgs                 ;
2968         T8_dPS0Z = pParam->HSM2_sc4 * Vdsz ;
2969 
2970 	T1     = T6     + pParam->HSM2_sc2 * Vdsz + T8 ;
2971 	T1_dVd = T6_dVd + pParam->HSM2_sc2 * Vdsz_dVds + T8_dVd ;
2972 	T1_dVb = T6_dVb + T8_dVb ;
2973 	T1_dVg = T6_dVg + T8_dVg ;
2974         T1_dPS0Z = T6_dPS0Z + T8_dPS0Z ;
2975       }else{
2976 	T1     = T6     + pParam->HSM2_sc2 * Vdsz      ;
2977 	T1_dVb = T6_dVb                                ;
2978 	T1_dVd = T6_dVd + pParam->HSM2_sc2 * Vdsz_dVds ;
2979 	T1_dVg = T6_dVg                                ;
2980         T1_dPS0Z = T6_dPS0Z                      ;
2981       }
2982 
2983       T2 = C_ESI * Cox_inv * here->HSM2_wdpl * 2.0e0 * ( model->HSM2_vbi - Pb20 ) * T4 ;
2984 
2985       A = T2 * T1 ;
2986       A_dVbs = T2 * T1_dVb ;
2987       A_dVds = T2 * T1_dVd ;
2988       A_dVgs = T2 * T1_dVg ;
2989        A_dPS0Z = T2 * T1_dPS0Z ;
2990 
2991       T7     = PS0Z_SCE      - Vbsz + Ps0_min ;
2992       T7_dVb = PS0Z_SCE_dVbs - Vbsz_dVbs + Ps0_min_dVbs;
2993       T7_dVd = PS0Z_SCE_dVds - Vbsz_dVds + Ps0_min_dVds ;
2994       T7_dVg = PS0Z_SCE_dVgs             + Ps0_min_dVgs ;
2995       T7_dPS0Z = 1.0 ;
2996 
2997       if ( T7 > arg0 ) {
2998         T8 = sqrt( T7 ) ;
2999         T8_dVb = 0.5 * T7_dVb / T8 ;
3000         T8_dVd = 0.5 * T7_dVd / T8 ;
3001         T8_dVg = 0.5 * T7_dVg / T8 ;
3002         T8_dPS0Z  = 0.5 * T7_dPS0Z  / T8 ;
3003       } else {
3004         T8 = sqrt(arg0) + 0.5 / sqrt(arg0) * ( T7 - arg0) ;
3005         T8_dVb = 0.5 / sqrt(arg0) * T7_dVb ;
3006         T8_dVd = 0.5 / sqrt(arg0) * T7_dVd ;
3007         T8_dVg = 0.5 / sqrt(arg0) * T7_dVg ;
3008         T8_dPS0Z = 0.5 / sqrt(arg0) * T7_dPS0Z ;
3009       }
3010 
3011       dVthSC = A * T8 ;
3012       dVthSC_dVb = A * T8_dVb + A_dVbs * T8;
3013       dVthSC_dVd = A * T8_dVd + A_dVds * T8;
3014       dVthSC_dVg = A * T8_dVg + A_dVgs * T8;
3015       dVthSC_dPS0Z = A * T8_dPS0Z + A_dPS0Z * T8;
3016 
3017     }else{ /* original */
3018 
3019       T1 = C_ESI * Cox_inv ;
3020       T2 = here->HSM2_wdpl ;
3021       T3 = here->HSM2_lgate - model->HSM2_parl2 ;
3022       T4 = 1.0e0 / ( T3 * T3 ) ;
3023       T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ;
3024 
3025       dVth0 = T5 * sqrt_Pbsum ;
3026       T6 = T5 / 2.0 / sqrt_Pbsum ;
3027       T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ;
3028       T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ;
3029       dVth0_dVb = T6 * Pbsum_dVb + T8 * Pb20b_dVb ;
3030       dVth0_dVd = T6 * Pbsum_dVd + T8 * Pb20b_dVd ;
3031       dVth0_dVg = T6 * Pbsum_dVg + T8 * Pb20b_dVg ;
3032 
3033       T1 = pParam->HSM2_sc3 / here->HSM2_lgate ;
3034       T4 = pParam->HSM2_sc1 + T1 * Pbsum ;
3035       T4_dVb = T1 * Pbsum_dVb ;
3036       T4_dVd = T1 * Pbsum_dVd ;
3037       T4_dVg = T1 * Pbsum_dVg ;
3038 
3039       /* QME:0  CORECIP:0 */
3040       if( pParam->HSM2_sc4 != 0 ){
3041 	T8     = pParam->HSM2_sc4 *   Vdsz * Pbsum ;
3042 	T8_dVd = pParam->HSM2_sc4 * ( Vdsz_dVds * Pbsum + Vdsz * Pbsum_dVd ) ;
3043 	T8_dVb = pParam->HSM2_sc4 *                       Vdsz * Pbsum_dVb   ;
3044 	T8_dVg = pParam->HSM2_sc4 *                       Vdsz * Pbsum_dVg   ;
3045 
3046 	T5     = T4     + pParam->HSM2_sc2 * Vdsz      + T8     ;
3047 	T5_dVd = T4_dVd + pParam->HSM2_sc2 * Vdsz_dVds + T8_dVd ;
3048 	T5_dVb = T4_dVb                                + T8_dVb ;
3049 	T5_dVg = T4_dVg                                + T8_dVg ;
3050       }else{
3051 	T5     = T4     + pParam->HSM2_sc2 * Vdsz      ;
3052 	T5_dVb = T4_dVb                                ;
3053 	T5_dVd = T4_dVd + pParam->HSM2_sc2 * Vdsz_dVds ;
3054 	T5_dVg = T4_dVg                                ;
3055       }
3056 
3057       dVthSC = dVth0 * T5 ;
3058       dVthSC_dVb = dVth0_dVb * T5 + dVth0 * T5_dVb ;
3059       dVthSC_dVd = dVth0_dVd * T5 + dVth0 * T5_dVd ;
3060       dVthSC_dVg = dVth0_dVg * T5 + dVth0 * T5_dVg ;
3061 
3062     }
3063 
3064     /*---------------------------------------------------*
3065      * dVthW : narrow-channel effect.
3066      *-----------------*/
3067     T1 = 1.0 / Cox ;
3068     T3 = 1.0 / ( Cox +  pParam->HSM2_wfc / Weff ) ;
3069     T5 = T1 - T3 ;
3070 
3071     if( corecip ){
3072       dVthW = Qb0 * T5 + pParam->HSM2_wvth0 / here->HSM2_wg ;
3073       dVthW_dVb = Qb0_dVb * T5 ;
3074       dVthW_dVd = Qb0_dVd * T5 ;
3075       dVthW_dVg = Qb0_dVg * T5 ;
3076     }else{ /* original */
3077       dVthW = Qb0 * T5 + pParam->HSM2_wvth0 / here->HSM2_wg ;
3078       dVthW_dVb = Qb0_dVb * T5 ;
3079       dVthW_dVd = Qb0_dVd * T5 ;
3080       dVthW_dVg = 0.0 ;
3081     }
3082 
3083 
3084 
3085   } /* end of flg_qme if-blocks */
3086 
3087     /*---------------------------------------------------*
3088      * dVth : Total variation.
3089      * - Positive dVth means the decrease in Vth.
3090      *-----------------*/
3091     dVth = dVthSC + dVthLP + dVthW + here->HSM2_dVthsm ;
3092     dVth_dVb = dVthSC_dVb + dVthLP_dVb + dVthW_dVb ;
3093     dVth_dVd = dVthSC_dVd + dVthLP_dVd + dVthW_dVd ;
3094     dVth_dVg = dVthSC_dVg + dVthLP_dVg + dVthW_dVg ;
3095     dVth_dPS0Z = dVthSC_dPS0Z + dVthLP_dPS0Z ;
3096 
3097     /*---------------------------------------------------*
3098      * Vth : Threshold voltagei for OP.
3099      *-----------------*/
3100     T2 = sqrt( here->HSM2_2qnsub_esi * Pb2 ) ;
3101     Vth = Pb2 + Vfb + T2 * Cox0_inv - dVth ;
3102 
3103     /*-----------------------------------------------------------*
3104      * Constants in the equation of Ps0 .
3105      *-----------------*/
3106 
3107     fac1 = cnst0 * Cox_inv ;
3108     fac1_dVbs = cnst0 * Cox_inv_dVb ;
3109     fac1_dVds = cnst0 * Cox_inv_dVd ;
3110     fac1_dVgs = cnst0 * Cox_inv_dVg ;
3111 
3112     fac1p2 = fac1 * fac1 ;
3113     /*---------------------------------------------------*
3114      * Poly-Depletion Effect
3115      *-----------------*/
3116 
3117   if ( here->HSM2_flg_pgd == 0 ) {
3118     dPpg = 0.0 ;
3119     dPpg_dVb = 0.0 ;
3120     dPpg_dVd = 0.0 ;
3121     dPpg_dVg = 0.0 ;
3122   } else {
3123 
3124     T7 = Vgsz ;
3125     T7_dVb =  0.0 ;
3126     T7_dVd =  Vgsz_dVds ;
3127     T7_dVg =  Vgsz_dVgs ;
3128 
3129     T0 = here->HSM2_cnstpgd ;
3130 
3131     T3 = T7 - model->HSM2_pgd2 ;
3132     T3_dVb = T7_dVb ;
3133     T3_dVd = T7_dVd ;
3134     T3_dVg = T7_dVg ;
3135 
3136     Fn_ExpLim( dPpg , T3 , T6 ) ;
3137     dPpg_dVb = T6 * T3_dVb ;
3138     dPpg_dVd = T6 * T3_dVd ;
3139     dPpg_dVg = T6 * T3_dVg ;
3140 
3141     Fn_SZ( dPpg , dPpg - 1.0 , 0.1 , T6 ) ;
3142     dPpg_dVb *= T6 ;
3143     dPpg_dVd *= T6 ;
3144     dPpg_dVg *= T6 ;
3145 
3146     dPpg *= T0 ;
3147     dPpg_dVb *= T0 ;
3148     dPpg_dVd *= T0 ;
3149     dPpg_dVg *= T0 ;
3150 
3151     Fn_SU( dPpg , dPpg , pol_b , pol_dlt , T9 ) ;
3152     dPpg_dVb *= T9 ;
3153     dPpg_dVd *= T9 ;
3154     dPpg_dVg *= T9 ;
3155 
3156   }
3157 
3158     /*---------------------------------------------------*
3159      * Vgp : Effective gate bias with SCE & RSCE & flatband.
3160      *-----------------*/
3161     Vgp = Vgs - Vfb + dVth - dPpg ;
3162     Vgp_dVbs = dVth_dVb - dPpg_dVb ;
3163     Vgp_dVds = dVth_dVd - dPpg_dVd ;
3164     Vgp_dVgs = 1.0e0 + dVth_dVg - dPpg_dVg ;
3165     Vgp_dPS0Z = dVth_dPS0Z ;
3166 
3167     Vgpz =  Vgsz - Vfb + dVth - dPpg ; /* (tmp) */
3168     Vgpz_dVbs = dVth_dVb ;
3169     Vgpz_dVds = Vgsz_dVds + dVth_dVd - dPpg_dVd ;
3170     Vgpz_dVgs = Vgsz_dVgs + dVth_dVg - dPpg_dVg ;
3171     Vgpz_dPS0Z = dVth_dPS0Z ;
3172 
3173     /*---------------------------------------------------*
3174      * Vgs_fb : Actual flatband voltage taking account Vbs.
3175      * - note: if Vgs == Vgs_fb then Vgp == Ps0 == Vbs .
3176      *------------------*/
3177     Vgs_fb = Vfb - dVth + dPpg + Vbs ;
3178 
3179     /*-----------------------------------------------------------*
3180      * Accumulation zone. (zone-A)
3181      * - evaluate basic characteristics and exit from this part.
3182      *-----------------*/
3183     if ( Vgs < Vgs_fb ) {
3184 
3185       flg_zone = -1 ;
3186 
3187       /*---------------------------------------------------*
3188        * Evaluation of Ps0.
3189        * - Psa : Analytical solution of
3190        *             Cox( Vgp - Psa ) = cnst0 * Qacc
3191        *         where Qacc is the 3-degree series of (fdep)^{1/2}.
3192        *         The unkown is transformed to Chi=beta(Ps0-Vbs).
3193        * - Ps0_min : |Ps0_min| when Vbs=0.
3194        *-----------------*/
3195 
3196       /* Ps0_min = here->HSM2_eg - Pb2 ;                                    */
3197       /* -> replaced by approx. solving Poisson equation at Vgs=Vgs_min     */
3198       /* Ps0_min = 2.0 * beta_inv * log(-Vgs_min/fac1) ; already done above */
3199 
3200       TX = beta * ( Vgp - Vbs ) ;
3201       TX_dVbs = beta * ( Vgp_dVbs - 1.0 ) ;
3202       TX_dVds = beta * Vgp_dVds ;
3203       TX_dVgs = beta * Vgp_dVgs ;
3204       TX_dPS0Z = beta * Vgp_dPS0Z ;
3205 
3206       T1 = 1.0 / ( beta * cnst0 ) ;
3207       TY = T1 * Cox ;
3208       TY_dVbs = T1 * Cox_dVb ;
3209       TY_dVds = T1 * Cox_dVd ;
3210       TY_dVgs = T1 * Cox_dVg ;
3211 
3212       Ac41 = 2.0 + 3.0 * C_SQRT_2 * TY ;
3213 
3214       Ac4 = 8.0 * Ac41 * Ac41 * Ac41 ;
3215       T1 = 72.0 * Ac41 * Ac41 * C_SQRT_2 ;
3216       Ac4_dVbs = T1 * TY_dVbs ;
3217       Ac4_dVds = T1 * TY_dVds ;
3218       Ac4_dVgs = T1 * TY_dVgs ;
3219 
3220       T4 = ( TX - 2.0 ) ;
3221       T5 = 9.0 * TY * T4 ;
3222       T5_dVb = 9.0 * ( TY_dVbs * T4 + TY * TX_dVbs ) ;
3223       T5_dVd = 9.0 * ( TY_dVds * T4 + TY * TX_dVds ) ;
3224       T5_dVg = 9.0 * ( TY_dVgs * T4 + TY * TX_dVgs ) ;
3225       T5_dPS0Z = 9.0 * (              TY * TX_dPS0Z ) ;
3226 
3227       Ac31 = 7.0 * C_SQRT_2 - T5 ;
3228       Ac31_dVbs = -T5_dVb ;
3229       Ac31_dVds = -T5_dVd ;
3230       Ac31_dVgs = -T5_dVg ;
3231       Ac31_dPS0Z = -T5_dPS0Z ;
3232 
3233       Ac3 = Ac31 * Ac31 ;
3234       T1 = 2.0 * Ac31 ;
3235       Ac3_dVbs = T1 * Ac31_dVbs ;
3236       Ac3_dVds = T1 * Ac31_dVds ;
3237       Ac3_dVgs = T1 * Ac31_dVgs ;
3238       Ac3_dPS0Z = T1 * Ac31_dPS0Z ;
3239 
3240       Ac2 = sqrt( Ac4 + Ac3 ) ;
3241       T1 = 0.5 / Ac2 ;
3242       Ac2_dVbs = T1 * ( Ac4_dVbs + Ac3_dVbs ) ;
3243       Ac2_dVds = T1 * ( Ac4_dVds + Ac3_dVds ) ;
3244       Ac2_dVgs = T1 * ( Ac4_dVgs + Ac3_dVgs ) ;
3245       Ac2_dPS0Z = T1 * (           Ac3_dPS0Z ) ;
3246 
3247       Ac1 = -7.0 * C_SQRT_2 + Ac2 + T5 ;
3248       Ac1_dVbs = Ac2_dVbs + T5_dVb ;
3249       Ac1_dVds = Ac2_dVds + T5_dVd ;
3250       Ac1_dVgs = Ac2_dVgs + T5_dVg ;
3251        Ac1_dPS0Z = Ac2_dPS0Z + T5_dPS0Z ;
3252 
3253       Acd = Fn_Pow( Ac1 , C_1o3 ) ;
3254       T1 = C_1o3 / ( Acd * Acd ) ;
3255       Acd_dVbs = Ac1_dVbs * T1 ;
3256       Acd_dVds = Ac1_dVds * T1 ;
3257       Acd_dVgs = Ac1_dVgs * T1 ;
3258       Acd_dPS0Z = Ac1_dPS0Z * T1 ;
3259 
3260       Acn = -4.0 * C_SQRT_2 - 12.0 * TY + 2.0 * Acd + C_SQRT_2 * Acd * Acd ;
3261       T1 = 2.0 + 2.0 * C_SQRT_2 * Acd ;
3262       Acn_dVbs = - 12.0 * TY_dVbs + T1 * Acd_dVbs ;
3263       Acn_dVds = - 12.0 * TY_dVds + T1 * Acd_dVds ;
3264       Acn_dVgs = - 12.0 * TY_dVgs + T1 * Acd_dVgs ;
3265       Acn_dPS0Z =                   T1 * Acd_dPS0Z ;
3266 
3267       T1 = 1.0 / Acd ;
3268       Chi = Acn * T1 ;
3269       Chi_dVbs = ( Acn_dVbs - Chi * Acd_dVbs ) * T1 ;
3270       Chi_dVds = ( Acn_dVds - Chi * Acd_dVds ) * T1 ;
3271       Chi_dVgs = ( Acn_dVgs - Chi * Acd_dVgs ) * T1 ;
3272       Chi_dPS0Z = ( Acn_dPS0Z - Chi * Acd_dPS0Z ) * T1 ;
3273 
3274       Psa = Chi * beta_inv + Vbs ;
3275       Psa_dVbs = Chi_dVbs * beta_inv + 1.0 ;
3276       Psa_dVds = Chi_dVds * beta_inv ;
3277       Psa_dVgs = Chi_dVgs * beta_inv ;
3278       Psa_dPS0Z = Chi_dPS0Z * beta_inv ;
3279 
3280       T1 = Psa - Vbs ;
3281       T2 = T1 / Ps0_min ;
3282       T3 = sqrt( 1.0 + ( T2 * T2 ) ) ;
3283 
3284       T9 = T2 / T3 / Ps0_min ;
3285       T3_dVb = T9 * ( Psa_dVbs - 1.0 ) ;
3286       T3_dVd = T9 * ( Psa_dVds ) ;
3287       T3_dVg = T9 * ( Psa_dVgs ) ;
3288       T3_dPS0Z = T9 * ( Psa_dPS0Z ) ;
3289 
3290       Ps0 = T1 / T3 + Vbs ;
3291       T9 = 1.0 / ( T3 * T3 ) ;
3292       Ps0_dVbs = T9 * ( ( Psa_dVbs - 1.0 ) * T3 - T1 * T3_dVb ) + 1.0 ;
3293       Ps0_dVds = T9 * ( Psa_dVds * T3 - T1 * T3_dVd ) ;
3294       Ps0_dVgs = T9 * ( Psa_dVgs * T3 - T1 * T3_dVg ) ;
3295       Ps0_dPS0Z = T9 * ( Psa_dPS0Z * T3 - T1 * T3_dPS0Z ) ;
3296 
3297       /*---------------------------------------------------*
3298        * Characteristics.
3299        *-----------------*/
3300       Psl = Ps0 ;
3301       Psl_dVbs = Ps0_dVbs ;
3302       Psl_dVds = Ps0_dVds ;
3303       Psl_dVgs = Ps0_dVgs ;
3304 
3305       T2 = ( Vgp - Ps0 ) ;
3306       Qbu = Cox * T2 ;
3307       Qbu_dVbs = Cox * ( Vgp_dVbs - Ps0_dVbs ) + Cox_dVb * T2 ;
3308       Qbu_dVds = Cox * ( Vgp_dVds - Ps0_dVds ) + Cox_dVd * T2 ;
3309       Qbu_dVgs = Cox * ( Vgp_dVgs - Ps0_dVgs ) + Cox_dVg * T2 ;
3310 
3311       Qiu = 0.0e0 ;
3312       Qiu_dVbs = 0.0e0 ;
3313       Qiu_dVds = 0.0e0 ;
3314       Qiu_dVgs = 0.0e0 ;
3315 
3316       Qdrat = 0.5e0 ;
3317       Qdrat_dVbs = 0.0e0 ;
3318       Qdrat_dVds = 0.0e0 ;
3319       Qdrat_dVgs = 0.0e0 ;
3320 
3321       Lred = 0.0e0 ;
3322       Lred_dVbs = 0.0e0 ;
3323       Lred_dVds = 0.0e0 ;
3324       Lred_dVgs = 0.0e0 ;
3325 
3326       Ids = 0.0e0 ;
3327       Ids_dVbs = 0.0e0 ;
3328       Ids_dVds = 0.0e0 ;
3329       Ids_dVgs = 0.0e0 ;
3330 
3331       VgVt = 0.0 ;
3332 
3333       flg_noqi = 1 ;
3334 
3335       DJI = 1.0 ;
3336 
3337       if( corecip ){
3338 	/*!! This is for Accumulation Region !!*/
3339 
3340 	T1 = Vds * 0.5  ;
3341 	Fn_SymAdd( Pzadd , T1 , model->HSM2_pzadd0 , T2 ) ;
3342 	T2 /= 2 ;
3343 	Pzadd_dVbs = 0.0 ;
3344 	Pzadd_dVds = T2 * ( 1.0 ) ;
3345 	Pzadd_dVgs = 0.0 ;
3346         Pzadd_dPS0Z = 0.0 ;
3347 
3348 	if ( Pzadd < epsm10 ) {
3349 	  Pzadd = epsm10 ;
3350 	  Pzadd_dVbs = 0.0 ;
3351 	  Pzadd_dVds = 0.0 ;
3352 	  Pzadd_dVgs = 0.0 ;
3353           Pzadd_dPS0Z = 0.0 ;
3354 	}
3355 
3356 	Ps0z = Ps0 + Pzadd ;
3357 	Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ;
3358 	Ps0z_dVds = Ps0_dVds + Pzadd_dVds ;
3359 	Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ;
3360         Ps0z_dPS0Z = Ps0_dPS0Z + Pzadd_dPS0Z ;
3361 
3362         /* calculate Newton correction: */
3363         G = PS0Z_SCE - Ps0z ;
3364         delta_PS0Z_SCE = - G / (1.0 - Ps0z_dPS0Z) ;
3365 
3366         delta_PS0Z_SCE_dVbs = Ps0z_dVbs - PS0Z_SCE_dVbs;
3367         delta_PS0Z_SCE_dVds = Ps0z_dVds - PS0Z_SCE_dVds;
3368         delta_PS0Z_SCE_dVgs = Ps0z_dVgs - PS0Z_SCE_dVgs;
3369         PS0Z_SCE += delta_PS0Z_SCE ;
3370 	PS0Z_SCE_dVbs = Ps0z_dVbs ;
3371         PS0Z_SCE_dVds = Ps0z_dVds ;
3372         PS0Z_SCE_dVgs = Ps0z_dVgs ;
3373 
3374         PS0_SCE = PS0Z_SCE - Pzadd ;
3375         PS0_SCE_dVbs = Ps0_dVbs ;
3376         PS0_SCE_dVds = Ps0_dVds ;
3377         PS0_SCE_dVgs = Ps0_dVgs ;
3378 
3379 	NNN += 1 ;
3380 
3381        if( (    fabs(delta_PS0Z_SCE) > PS0_SCE_tol
3382              || fabs(delta_PS0Z_SCE_dVbs) > PS0_SCE_deriv_tol
3383              || fabs(delta_PS0Z_SCE_dVds) > PS0_SCE_deriv_tol
3384              || fabs(delta_PS0Z_SCE_dVgs) > PS0_SCE_deriv_tol
3385            ) && (NNN < MAX_LOOP_SCE)  ){
3386       // goto START_OF_SCE_LOOP;
3387               START_OF_SCE_LOOP = 1 ;
3388       }
3389       }
3390 
3391     //goto end_of_part_1 ;
3392       if( START_OF_SCE_LOOP==0 ) end_of_part_1 = 1 ;
3393     }
3394 
3395     } /* End of 3rd SCE_LOOP */
3396     if ( end_of_part_1 == 0 ) { /* skip to end_of_part_1 */
3397 
3398     /*-----------------------------------------------------------*
3399      * Initial guess for Ps0.
3400      *-----------------*/
3401 
3402     /*---------------------------------------------------*
3403      * Ps0_iniA: solution of subthreshold equation assuming zone-D1/D2.
3404      *-----------------*/
3405     TX = 1.0e0 + 4.0e0
3406       * ( beta * ( Vgp - Vbs ) - 1.0e0 ) / ( fac1p2 * beta2 ) ;
3407     TX = Fn_Max( TX , epsm10 ) ;
3408     Ps0_iniA = Vgp + fac1p2 * beta * 0.5 * ( 1.0e0 - sqrt( TX ) ) ;
3409 
3410     /* use analitical value in subthreshold region. */
3411     if ( Vgs < ( Vfb + Vth ) * 0.5 ) {
3412         flg_pprv = 0 ;
3413     }
3414 
3415     if ( flg_pprv >= 1 ) {
3416       /*---------------------------------------------------*
3417        * Use previous value.
3418        *-----------------*/
3419 
3420       T1  = Ps0_dVbs * dVbs + Ps0_dVds * dVds  + Ps0_dVgs * dVgs ;
3421       Ps0_ini  = Ps0 + T1 ;
3422 
3423       if ( flg_pprv == 2 ) {
3424         /* TX_dVxs = d^2 Ps0 / d Vxs^2 here */
3425         if ( Vbsc_dif2 > epsm10 ) {
3426           TX_dVbs = ( here->HSM2_ps0_dvbs_prv - here->HSM2_ps0_dvbs_prv2 )
3427                   / Vbsc_dif2 ;
3428         } else {
3429           TX_dVbs = 0.0 ;
3430         }
3431         if ( Vdsc_dif2 > epsm10 ) {
3432           TX_dVds = ( here->HSM2_ps0_dvds_prv - here->HSM2_ps0_dvds_prv2 )
3433                   / Vdsc_dif2 ;
3434         } else {
3435           TX_dVds = 0.0 ;
3436         }
3437         if ( Vgsc_dif2 > epsm10 ) {
3438           TX_dVgs = ( here->HSM2_ps0_dvgs_prv - here->HSM2_ps0_dvgs_prv2 )
3439                   / Vgsc_dif2 ;
3440         } else {
3441           TX_dVgs = 0.0 ;
3442         }
3443         T2 = ( dVbs * dVbs ) / 2 * TX_dVbs
3444            + ( dVds * dVds ) / 2 * TX_dVds
3445            + ( dVgs * dVgs ) / 2 * TX_dVgs ;
3446 
3447         if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) {
3448           Ps0_ini += T2 ;
3449         } else {
3450           flg_pprv = 1 ;
3451         }
3452       }
3453 
3454       T1 = Ps0_ini - Ps0 ;
3455       if ( T1 < - dP_max || T1 > dP_max ) {
3456         flg_pprv = 0 ; /* flag changes to analitical */
3457       } else {
3458         Ps0_iniA = Fn_Max( Ps0_ini , Ps0_iniA ) ;
3459       }
3460     } /* end of (flg_pprv >=1) if-block */
3461 
3462     if ( flg_pprv == 0 ) {
3463 
3464       /*---------------------------------------------------*
3465        * Analytical initial guess.
3466        *-----------------*/
3467       /*-------------------------------------------*
3468        * Common part.
3469        *-----------------*/
3470       Chi = beta * ( Ps0_iniA - Vbs ) ;
3471 
3472       if ( Chi < znbd3 ) {
3473         /*-----------------------------------*
3474          * zone-D1/D2
3475          * - Ps0_ini is the analytical solution of Qs=Qb0 with
3476          *   Qb0 being approximated to 3-degree polynomial.
3477          *-----------------*/
3478         TY = beta * ( Vgp - Vbs ) ;
3479         T1 = 1.0e0 / ( cn_nc3 * beta * fac1 ) ;
3480         T2 = 81.0 + 3.0 * T1 ;
3481         T3 = -2916.0 - 81.0 * T1 + 27.0 * T1 * TY ;
3482         T4 = 1458.0 - 81.0 * ( 54.0 + T1 ) + 27.0 * T1 * TY ;
3483         T4 = T4 * T4 ;
3484         T5 = Fn_Pow( T3 + sqrt( 4 * T2 * T2 * T2 + T4 ) , C_1o3 ) ;
3485         TX = 3.0 - ( C_2p_1o3 * T2 ) / ( 3.0 * T5 )
3486            + 1 / ( 3.0 * C_2p_1o3 ) * T5 ;
3487 
3488         Ps0_iniA = TX * beta_inv + Vbs ;
3489         Ps0_ini = Ps0_iniA ;
3490 
3491       } else if ( Vgs <= Vth ) {
3492        /*-----------------------------------*
3493         * Weak inversion zone.
3494         *-----------------*/
3495         Ps0_ini = Ps0_iniA ;
3496 
3497       } else {
3498        /*-----------------------------------*
3499         * Strong inversion zone.
3500         * - Ps0_iniB : upper bound.
3501         *-----------------*/
3502         T1 = 1.0 / cnst1 / cnstCoxi ;
3503         T2 = T1 * Vgp * Vgp ;
3504         T3 = beta + 2.0 / Vgp ;
3505 
3506         Ps0_iniB = log( T2 + small ) / T3 ;
3507 
3508         Fn_SU( Ps0_ini , Ps0_iniA, Ps0_iniB, c_ps0ini_2, T1) ;
3509       }
3510     }
3511 
3512     TX = Vbs + ps_conv / 2 ;
3513     if ( Ps0_ini < TX ) Ps0_ini = TX ;
3514 
3515 
3516     /*---------------------------------------------------*
3517      * Assign initial guess.
3518      *-----------------*/
3519     if ( NNN == 0 ) {
3520        Ps0 = Ps0_ini ;
3521     }
3522     Psl_lim = Ps0_iniA ;
3523 
3524     /*---------------------------------------------------*
3525      * Calculation of Ps0. (beginning of Newton loop)
3526      * - Fs0 : Fs0 = 0 is the equation to be solved.
3527      * - dPs0 : correction value.
3528      *-----------------*/
3529     exp_bVbs = exp( beta * Vbs ) ;
3530     cfs1 = cnst1 * exp_bVbs ;
3531 
3532     flg_conv = 0 ;
3533     for ( lp_s0 = 1 ; lp_s0 <= lp_s0_max + 1 ; lp_s0 ++ ) {
3534 
3535       Chi = beta * ( Ps0 - Vbs ) ;
3536 
3537       if ( Chi < znbd5 ) {
3538         /*-------------------------------------------*
3539          * zone-D1/D2.  (Ps0)
3540          * - Qb0 is approximated to 5-degree polynomial.
3541          *-----------------*/
3542         fi = Chi * Chi * Chi
3543           * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ;
3544         fi_dChi = Chi * Chi
3545           * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ;
3546 
3547         fs01 = cfs1 * fi * fi ;
3548         fs01_dPs0 = cfs1 * beta * 2 * fi * fi_dChi ;
3549 
3550         fb = Chi * ( cn_nc51
3551            + Chi * ( cn_nc52
3552            + Chi * ( cn_nc53
3553            + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ;
3554         fb_dChi = cn_nc51
3555            + Chi * ( 2 * cn_nc52
3556            + Chi * ( 3 * cn_nc53
3557            + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ;
3558 
3559         fs02 = sqrt( fb * fb + fs01 ) ;
3560         fs02_dPs0 = ( beta * fb_dChi * 2 * fb + fs01_dPs0 ) / ( fs02 + fs02 ) ;
3561 
3562       } else {
3563         /*-------------------------------------------*
3564          * zone-D3.  (Ps0)
3565          *-----------------*/
3566          if ( Chi < large_arg ) { /* avoid exp_Chi to become extremely large */
3567             exp_Chi = exp( Chi ) ;
3568             fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ;
3569             fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ;
3570          } else {
3571             exp_bPs0 = exp( beta*Ps0 ) ;
3572             fs01 = cnst1 * ( exp_bPs0 - exp_bVbs ) ;
3573             fs01_dPs0 = cnst1 * beta * exp_bPs0 ;
3574          }
3575         fs02 = sqrt( Chi - 1.0 + fs01 ) ;
3576         fs02_dPs0 = ( beta + fs01_dPs0 ) / ( fs02 + fs02 ) ;
3577       } /* end of if ( Chi ... ) else block */
3578 
3579       Fs0 = Vgp - Ps0 - fac1 * fs02 ;
3580       Fs0_dPs0 = - 1.0e0 - fac1 * fs02_dPs0 ;
3581 
3582       if ( flg_conv == 1 ) break ;
3583 
3584       dPs0 = - Fs0 / Fs0_dPs0 ;
3585 
3586       /*-------------------------------------------*
3587        * Update Ps0 .
3588        * - clamped to Vbs if Ps0 < Vbs .
3589        *-----------------*/
3590       dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Ps0))) ;
3591       if ( fabs( dPs0 ) > dPlim ) dPs0 = dPlim * Fn_Sgn( dPs0 ) ;
3592 
3593       Ps0 = Ps0 + dPs0 ;
3594 
3595       TX = Vbs + ps_conv / 2 ;
3596       if ( Ps0 < TX ) Ps0 = TX ;
3597 
3598       /*-------------------------------------------*
3599        * Check convergence.
3600        * NOTE: This condition may be too rigid.
3601        *-----------------*/
3602       if ( fabs( dPs0 ) <= ps_conv && fabs( Fs0 ) <= gs_conv ) {
3603         flg_conv = 1 ;
3604       }
3605 
3606     } /* end of Ps0 Newton loop */
3607 
3608     /* Eliminate loop count to take account of the derivative loop */
3609     lp_s0 -- ;
3610 
3611     /*-------------------------------------------*
3612      * Procedure for diverged case.
3613      *-----------------*/
3614     if ( flg_conv == 0 ) {
3615       fprintf( stderr ,
3616                "*** warning(HiSIM): Went Over Iteration Maximum (Ps0)\n" ) ;
3617       fprintf( stderr ,
3618                " Vbse   = %7.3f Vdse = %7.3f Vgse = %7.3f\n" ,
3619                Vbse , Vdse , Vgse ) ;
3620       if ( flg_info >= 2 ) {
3621         printf( "*** warning(HiSIM): Went Over Iteration Maximum (Ps0)\n" ) ;
3622       }
3623     }
3624 
3625     /*---------------------------------------------------*
3626      * Evaluate derivatives of  Ps0.
3627      * - note: Here, fs01_dVbs and fs02_dVbs are derivatives
3628      *   w.r.t. explicit Vbs. So, Ps0 in the fs01 and fs02
3629      *   expressions is regarded as a constant.
3630      *-----------------*/
3631 
3632     /* derivatives of fs0* w.r.t. explicit Vbs */
3633     if ( Chi < znbd5 ) {
3634       fs01_dVbs = cfs1 * beta * fi * ( fi - 2 * fi_dChi ) ;
3635       T2 = 1.0e0 / ( fs02 + fs02 ) ;
3636       fs02_dVbs = ( - beta * fb_dChi * 2 * fb + fs01_dVbs ) * T2 ;
3637     } else {
3638       fs01_dVbs = - cfs1 * beta ;
3639       T2 = 0.5e0 / fs02 ;
3640       fs02_dVbs = ( - beta + fs01_dVbs ) * T2 ;
3641     }
3642 
3643     T1 = 1.0 / Fs0_dPs0 ;
3644     Ps0_dVbs = - ( Vgp_dVbs - ( fac1 * fs02_dVbs + fac1_dVbs * fs02 ) ) * T1 ;
3645     Ps0_dVds = - ( Vgp_dVds - fac1_dVds * fs02 ) * T1 ;
3646     Ps0_dVgs = - ( Vgp_dVgs - fac1_dVgs * fs02 ) * T1 ;
3647 
3648     if ( Chi < znbd5 ) {
3649       /*-------------------------------------------*
3650        * zone-D1/D2. (Ps0)
3651        * Xi0 := fdep0^2 = fb * fb  [D1,D2]
3652        *-----------------*/
3653       Xi0 = fb * fb + epsm10 ;
3654       T1 = 2 * fb * fb_dChi * beta ;
3655       Xi0_dVbs = T1 * ( Ps0_dVbs - 1.0 ) ;
3656       Xi0_dVds = T1 * Ps0_dVds ;
3657       Xi0_dVgs = T1 * Ps0_dVgs ;
3658 
3659       Xi0p12 = fb + epsm10 ;
3660       T1 = fb_dChi * beta ;
3661       Xi0p12_dVbs = T1 * ( Ps0_dVbs - 1.0 ) ;
3662       Xi0p12_dVds = T1 * Ps0_dVds ;
3663       Xi0p12_dVgs = T1 * Ps0_dVgs ;
3664 
3665       Xi0p32 = fb * fb * fb + epsm10 ;
3666       T1 = 3 * fb * fb * fb_dChi * beta ;
3667       Xi0p32_dVbs = T1 * ( Ps0_dVbs - 1.0 ) ;
3668       Xi0p32_dVds = T1 * Ps0_dVds ;
3669       Xi0p32_dVgs = T1 * Ps0_dVgs ;
3670 
3671     } else {
3672       /*-------------------------------------------*
3673        * zone-D3. (Ps0)
3674        *-----------------*/
3675       flg_zone = 3 ;
3676       flg_noqi = 0 ;
3677 
3678       /*-----------------------------------*
3679        * Xi0 := fdep0^2 = Chi - 1 = beta * ( Ps0 - Vbs ) - 1 [D3]
3680        *-----------------*/
3681       Xi0 = Chi - 1.0e0 ;
3682       Xi0_dVbs = beta * ( Ps0_dVbs - 1.0e0 ) ;
3683       Xi0_dVds = beta * Ps0_dVds ;
3684       Xi0_dVgs = beta * Ps0_dVgs ;
3685 
3686       Xi0p12 = sqrt( Xi0 ) ;
3687       T1 = 0.5e0 / Xi0p12 ;
3688       Xi0p12_dVbs = T1 * Xi0_dVbs ;
3689       Xi0p12_dVds = T1 * Xi0_dVds ;
3690       Xi0p12_dVgs = T1 * Xi0_dVgs ;
3691 
3692       Xi0p32 = Xi0 * Xi0p12 ;
3693       T1 = 1.5e0 * Xi0p12 ;
3694       Xi0p32_dVbs = T1 * Xi0_dVbs ;
3695       Xi0p32_dVds = T1 * Xi0_dVds ;
3696       Xi0p32_dVgs = T1 * Xi0_dVgs ;
3697 
3698     } /* end of if ( Chi  ... ) block */
3699 
3700      /*-----------------------------------------------------------*
3701      * - Recalculate the derivatives of fs01 and fs02.
3702      * note: fs01  = cnst1 * exp( Vbs ) * ( exp( Chi ) - Chi - 1.0e0 ) ;
3703      *       fs02  = sqrt( Xi0 + fs01 ) ;
3704      *-----------------*/
3705     fs01_dVbs = Ps0_dVbs * fs01_dPs0 + fs01_dVbs ;
3706     fs01_dVds = Ps0_dVds * fs01_dPs0 ;
3707     fs01_dVgs = Ps0_dVgs * fs01_dPs0 ;
3708     fs02_dVbs = Ps0_dVbs * fs02_dPs0 + fs02_dVbs ;
3709     fs02_dVds = Ps0_dVds * fs02_dPs0 ;
3710     fs02_dVgs = Ps0_dVgs * fs02_dPs0 ;
3711 
3712     /*-----------------------------------------------------------*
3713      * Qb0 : Qb at source side.
3714      * Qn0 : Qi at source side.
3715      *-----------------*/
3716 
3717     Qb0 = cnst0 * Xi0p12 ;
3718     Qb0_dVb = cnst0 * Xi0p12_dVbs ;
3719     Qb0_dVd = cnst0 * Xi0p12_dVds ;
3720     Qb0_dVg = cnst0 * Xi0p12_dVgs ;
3721 
3722     T1 = 1.0 / ( fs02 + Xi0p12 ) ;
3723     Qn0 = cnst0 * fs01 * T1 ;
3724 
3725     T2 = 1.0 / ( fs01 + epsm10 ) ;
3726 
3727     Qn0_dVbs = Qn0 * ( fs01_dVbs * T2 - ( fs02_dVbs + Xi0p12_dVbs ) * T1 ) ;
3728     Qn0_dVds = Qn0 * ( fs01_dVds * T2 - ( fs02_dVds + Xi0p12_dVds ) * T1 ) ;
3729     Qn0_dVgs = Qn0 * ( fs01_dVgs * T2 - ( fs02_dVgs + Xi0p12_dVgs ) * T1 ) ;
3730 
3731 
3732     /*-----------------------------------------------------------*
3733      * zone-D1 and D2
3734      *-----------------*/
3735     if ( Chi < znbd5 ) {
3736       if ( Chi < znbd3 ) {
3737         /*-------------------------------------------*
3738          * zone-D1. (Ps0)
3739          *-----------------*/
3740         flg_zone = 1 ;
3741         flg_noqi = 1 ; /** !! to be revisited !! **/
3742 
3743         Qiu = Qn0 ;
3744         Qiu_dVbs = Qn0_dVbs ;
3745         Qiu_dVds = Qn0_dVds ;
3746         Qiu_dVgs = Qn0_dVgs ;
3747 
3748         Qbu = Qb0 ;
3749         Qbu_dVbs = Qb0_dVb ;
3750         Qbu_dVds = Qb0_dVd ;
3751         Qbu_dVgs = Qb0_dVg ;
3752 
3753         Qdrat = 0.5 ;
3754         Qdrat_dVbs = 0.0 ;
3755         Qdrat_dVds = 0.0 ;
3756         Qdrat_dVgs = 0.0 ;
3757 
3758         Lred = 0.0e0 ;
3759         Lred_dVbs = 0.0e0 ;
3760         Lred_dVds = 0.0e0 ;
3761         Lred_dVgs = 0.0e0 ;
3762 
3763       } else {
3764         /*-------------------------------------------*
3765          * zone-D2 (Ps0)
3766          *-----------------*/
3767         flg_zone = 2 ;
3768         flg_noqi = 0 ;
3769         /*-----------------------------------------------------------*
3770          * FD2 : connecting function for zone-D2.
3771          * - Qiu, Qbu, Qdrat and Lred should be interpolated later.
3772          *-----------------*/
3773         T1 = 1.0 / ( znbd5 - znbd3 ) ;
3774         TX = T1 * ( Chi - znbd3 ) ;
3775         TX_dVbs = beta * T1 * ( Ps0_dVbs - 1.0 ) ;
3776         TX_dVds = beta * T1 * Ps0_dVds ;
3777         TX_dVgs = beta * T1 * Ps0_dVgs ;
3778 
3779         FD2 = TX * TX * TX * ( 10.0 + TX * ( -15.0 + TX * 6.0 ) ) ;
3780         T4 = TX * TX * ( 30.0 + TX * ( -60.0 + TX * 30.0 ) ) ;
3781 
3782         FD2_dVbs = T4 * TX_dVbs ;
3783         FD2_dVds = T4 * TX_dVds ;
3784         FD2_dVgs = T4 * TX_dVgs ;
3785       } /* end of zone-D2 */
3786     }
3787 
3788 
3789     /*---------------------------------------------------*
3790      * VgVt : Vgp - Vth_qi. ( Vth_qi is Vth for Qi evaluation. )
3791      *-----------------*/
3792     VgVt = Qn0 * Cox_inv ;
3793     VgVt_dVbs = Qn0_dVbs * Cox_inv + Qn0 * Cox_inv_dVb ;
3794     VgVt_dVds = Qn0_dVds * Cox_inv + Qn0 * Cox_inv_dVd ;
3795     VgVt_dVgs = Qn0_dVgs * Cox_inv + Qn0 * Cox_inv_dVg ;
3796 
3797     /*-----------------------------------------------------------*
3798      * make Qi=Qd=Ids=0 if VgVt <= VgVt_small
3799      *-----------------*/
3800     if ( VgVt <= VgVt_small && model->HSM2_bypass_enable ) {
3801       flg_zone = 4 ;
3802       flg_noqi = 1 ;
3803 
3804       Psl = Ps0 ;
3805       Psl_dVbs = Ps0_dVbs ;
3806       Psl_dVds = Ps0_dVds ;
3807       Psl_dVgs = Ps0_dVgs ;
3808 
3809 
3810       Pds = 0.0 ;
3811       Pds_dVbs = 0.0 ;
3812       Pds_dVds = 0.0 ;
3813       Pds_dVgs = 0.0 ;
3814 
3815       Qbu = Qb0 ;
3816       Qbu_dVbs = Qb0_dVb ;
3817       Qbu_dVds = Qb0_dVd ;
3818       Qbu_dVgs = Qb0_dVg ;
3819 
3820       Qiu = 0.0 ;
3821       Qiu_dVbs = 0.0 ;
3822       Qiu_dVds = 0.0 ;
3823       Qiu_dVgs = 0.0 ;
3824 
3825       Qdrat = 0.5 ;
3826       Qdrat_dVbs = 0.0 ;
3827       Qdrat_dVds = 0.0 ;
3828       Qdrat_dVgs = 0.0 ;
3829 
3830       Lred = 0.0 ;
3831       Lred_dVbs = 0.0 ;
3832       Lred_dVds = 0.0 ;
3833       Lred_dVgs = 0.0 ;
3834 
3835       Ids = 0.0e0 ;
3836       Ids_dVbs = 0.0e0 ;
3837       Ids_dVds = 0.0e0 ;
3838       Ids_dVgs = 0.0e0 ;
3839 
3840       DJI = 1.0 ;
3841 
3842 
3843       if( corecip ){
3844 
3845         Fs0_dPS0Z = Vgp_dPS0Z ;
3846         Ps0_dPS0Z = - Fs0_dPS0Z / Fs0_dPs0 ;
3847 
3848 	T1 = Vds * 0.5  ;
3849 	Fn_SymAdd( Pzadd , T1 , model->HSM2_pzadd0 , T2 ) ;
3850 	T2 /= 2 ;
3851 	Pzadd_dVbs = 0.0 ;
3852 	Pzadd_dVds = T2 * ( 1.0 ) ;
3853 	Pzadd_dVgs = 0.0 ;
3854         Pzadd_dPS0Z = 0.0 ;
3855 	if ( Pzadd < epsm10 ) {
3856 	  Pzadd = epsm10 ;
3857 	  Pzadd_dVbs = 0.0 ;
3858 	  Pzadd_dVds = 0.0 ;
3859 	  Pzadd_dVgs = 0.0 ;
3860           Pzadd_dPS0Z = 0.0 ;
3861 	}
3862 
3863 	Ps0z = Ps0 + Pzadd ;
3864 	Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ;
3865 	Ps0z_dVds = Ps0_dVds + Pzadd_dVds ;
3866 	Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ;
3867         Ps0z_dPS0Z = Ps0_dPS0Z + Pzadd_dPS0Z ;
3868 
3869         /* calculate Newton correction: */
3870         G = PS0Z_SCE - Ps0z ;
3871         delta_PS0Z_SCE = - G / (1.0 - Ps0z_dPS0Z) ;
3872 
3873         delta_PS0Z_SCE_dVbs = Ps0z_dVbs - PS0Z_SCE_dVbs;
3874         delta_PS0Z_SCE_dVds = Ps0z_dVds - PS0Z_SCE_dVds;
3875         delta_PS0Z_SCE_dVgs = Ps0z_dVgs - PS0Z_SCE_dVgs;
3876         PS0Z_SCE += delta_PS0Z_SCE ;
3877 	PS0Z_SCE_dVbs = Ps0z_dVbs ;
3878         PS0Z_SCE_dVds = Ps0z_dVds ;
3879         PS0Z_SCE_dVgs = Ps0z_dVgs ;
3880 
3881         PS0_SCE = PS0Z_SCE - Pzadd ;
3882         PS0_SCE_dVbs = Ps0_dVbs ;
3883         PS0_SCE_dVds = Ps0_dVds ;
3884         PS0_SCE_dVgs = Ps0_dVgs ;
3885 
3886 
3887 	NNN += 1 ;
3888 
3889        if( (    fabs(delta_PS0Z_SCE) > PS0_SCE_tol
3890              || fabs(delta_PS0Z_SCE_dVbs) > PS0_SCE_deriv_tol
3891              || fabs(delta_PS0Z_SCE_dVds) > PS0_SCE_deriv_tol
3892              || fabs(delta_PS0Z_SCE_dVgs) > PS0_SCE_deriv_tol
3893            ) && (NNN < MAX_LOOP_SCE)  ){
3894        //go to START_OF_SCE_LOOP;
3895 	        START_OF_SCE_LOOP = 1 ;
3896 	}
3897 
3898       }
3899 
3900     //goto end_of_part_1 ;
3901       if( START_OF_SCE_LOOP==0 ) end_of_part_1 = 1 ;
3902 
3903     }
3904 
3905     } /* skip end_of_part_1  */
3906   } /* End of 2nd SCE_LOOP */
3907     if( end_of_part_1 == 0 ) { /* skip to end_of_part_1 */
3908 
3909     /*-----------------------------------------------------------*
3910      * Start point of Psl (= Ps0 + Pds) calculation. (label)
3911      *-----------------*/
3912 /*  start_of_Psl:*/
3913 
3914 
3915     /* Vdseff (begin) */
3916     Vdsorg = Vds ;
3917 
3918     T2 = here->HSM2_qnsub_esi / ( Cox * Cox ) ;
3919     T4 = - 2.0e0 * T2 / Cox ;
3920     T2_dVb = T4 * Cox_dVb ;
3921     T2_dVd = T4 * Cox_dVd ;
3922     T2_dVg = T4 * Cox_dVg ;
3923 
3924     T5     = Vgpz - beta_inv - Vbsz ;
3925     T5_dVb = Vgpz_dVbs       - Vbsz_dVbs ;
3926     T5_dVd = Vgpz_dVds       - Vbsz_dVds ;
3927     T5_dVg = Vgpz_dVgs ;
3928 
3929     T0 = 2.0 / T2 ;
3930     T1     = 1.0e0 + T0 * T5 ;
3931     T1_dVb = ( T5_dVb * T2 - T5 * T2_dVb ) * T0 / T2 ;
3932     T1_dVd = ( T5_dVd * T2 - T5 * T2_dVd ) * T0 / T2 ;
3933     T1_dVg = ( T5_dVg * T2 - T5 * T2_dVg ) * T0 / T2 ;
3934 
3935     Fn_SZ( T1 , T1 , 0.05 , T9 ) ;
3936     T1 += small ;
3937     T1_dVb *= T9 ;
3938     T1_dVd *= T9 ;
3939     T1_dVg *= T9 ;
3940 
3941     T3 = sqrt( T1 ) ;
3942     T3_dVb = 0.5 / T3 * T1_dVb ;
3943     T3_dVd = 0.5 / T3 * T1_dVd ;
3944     T3_dVg = 0.5 / T3 * T1_dVg ;
3945 
3946     T10 = Vgpz + T2 * ( 1.0e0 - T3 ) ;
3947     T10_dVb = Vgpz_dVbs + T2_dVb * ( 1.0e0 - T3 ) - T2 * T3_dVb ;
3948     T10_dVd = Vgpz_dVds + T2_dVd * ( 1.0e0 - T3 ) - T2 * T3_dVd ;
3949     T10_dVg = Vgpz_dVgs + T2_dVg * ( 1.0e0 - T3 ) - T2 * T3_dVg ;
3950     Fn_SZ( T10 , T10 , 0.01 , T0 ) ;
3951     T10 += epsm10 ;
3952     T10_dVb *= T0 ;
3953     T10_dVd *= T0 ;
3954     T10_dVg *= T0 ;
3955 
3956 
3957     T1 = Vds / T10 ;
3958     T2 = Fn_Pow( T1 , here->HSM2_ddlt - 1.0e0 ) ;
3959     T7 = T2 * T1 ;
3960     T0 = here->HSM2_ddlt * T2 / ( T10 * T10 ) ;
3961     T7_dVb = T0 * ( - Vds * T10_dVb ) ;
3962     T7_dVd = T0 * ( T10 - Vds * T10_dVd ) ;
3963     T7_dVg = T0 * ( - Vds * T10_dVg ) ;
3964 
3965     T3 = 1.0 + T7 ;
3966     T4 = Fn_Pow( T3 , 1.0 / here->HSM2_ddlt - 1.0 ) ;
3967     T6 = T4 * T3 ;
3968     T0 = T4 / here->HSM2_ddlt ;
3969     T6_dVb = T0 * T7_dVb ;
3970     T6_dVd = T0 * T7_dVd ;
3971     T6_dVg = T0 * T7_dVg ;
3972 
3973     Vdseff = Vds / T6 ;
3974     T0 = 1.0 / ( T6 * T6 ) ;
3975     Vdseff_dVbs =      - Vds * T6_dVb   * T0 ;
3976     Vdseff_dVds = ( T6 - Vds * T6_dVd ) * T0 ;
3977     Vdseff_dVgs =      - Vds * T6_dVg   * T0 ;
3978 
3979     Vds = Vdseff ;
3980     /* Vdseff (end) */
3981 
3982 
3983     exp_bVbsVds = exp( beta * ( Vbs - Vds ) ) ;
3984 
3985 
3986     /*---------------------------------------------------*
3987      * Skip Psl calculation when Vds is very small.
3988      *-----------------*/
3989     if ( Vds <= 0.0 ) {
3990       Pds = 0.0 ;
3991       Psl = Ps0 ;
3992       flg_conv = 1 ;
3993       goto start_of_loopl ;
3994     }
3995 
3996     /*-----------------------------------------------------------*
3997      * Initial guess for Pds ( = Psl - Ps0 ).
3998      *-----------------*/
3999     if ( flg_pprv >= 1  ) {
4000       /*---------------------------------------------------*
4001        * Use previous value.
4002        *-----------------*/
4003 
4004       T1  = Pds_dVbs * dVbs + Pds_dVds * dVds  + Pds_dVgs * dVgs ;
4005       Pds_ini  = Pds + T1 ;
4006 
4007       if ( flg_pprv == 2 ) {
4008         /* TX_dVxs = d^2 Pds / d Vxs^2 here */
4009         if ( Vbsc_dif2 > epsm10 ) {
4010           TX_dVbs = ( here->HSM2_pds_dvbs_prv - here->HSM2_pds_dvbs_prv2 )
4011                   / Vbsc_dif2 ;
4012         } else {
4013           TX_dVbs = 0.0 ;
4014         }
4015         if ( Vdsc_dif2 > epsm10 ) {
4016           TX_dVds = ( here->HSM2_pds_dvds_prv - here->HSM2_pds_dvds_prv2 )
4017                   / Vdsc_dif2 ;
4018         } else {
4019           TX_dVds = 0.0 ;
4020         }
4021         if ( Vgsc_dif2 > epsm10 ) {
4022           TX_dVgs = ( here->HSM2_pds_dvgs_prv - here->HSM2_pds_dvgs_prv2 )
4023                   / Vgsc_dif2 ;
4024         } else {
4025           TX_dVgs = 0.0 ;
4026         }
4027         T2 = ( dVbs * dVbs ) / 2 * TX_dVbs
4028            + ( dVds * dVds ) / 2 * TX_dVds
4029            + ( dVgs * dVgs ) / 2 * TX_dVgs ;
4030 
4031         if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) {
4032           Pds_ini += T2 ;
4033         } else {
4034           flg_pprv = 1 ;
4035         }
4036       }
4037 
4038       T1 = Pds_ini - Pds ;
4039       if ( T1 < - dP_max || T1 > dP_max ) flg_pprv = 0 ; /* flag changes */
4040 
4041     } /* end of (flg_pprv>=1) if-block */
4042 
4043     if ( flg_pprv == 0 ) {
4044       /*---------------------------------------------------*
4045        * Analytical initial guess.
4046        *-----------------*/
4047       Pds_max = Fn_Max( Psl_lim - Ps0 , 0.0e0 ) ;
4048 
4049       Fn_SU( Pds_ini , Vds, (1.0e0 + c_pslini_1) * Pds_max, c_pslini_2, T1 ) ;
4050       Pds_ini = Fn_Min( Pds_ini , Pds_max ) ;
4051     }
4052 
4053     if ( Pds_ini < 0.0 ) Pds_ini = 0.0 ;
4054     else if ( Pds_ini > Vds ) Pds_ini = Vds ;
4055 
4056 
4057     /*---------------------------------------------------*
4058      * Assign initial guess.
4059      *-----------------*/
4060     if ( NNN == 0 ) {
4061     Pds = Pds_ini ;
4062     Psl = Ps0 + Pds ;
4063     } else {
4064       /* take solution from previous PS0_SCE_loop as initial value */
4065       Pds = Psl - Ps0 ;
4066     }
4067     TX = Vbs + ps_conv / 2 ;
4068     if ( Psl < TX ) Psl = TX ;
4069 
4070     /*---------------------------------------------------*
4071      * Calculation of Psl by solving Poisson eqn.
4072      * (beginning of Newton loop)
4073      * - Fsl : Fsl = 0 is the equation to be solved.
4074      * - dPsl : correction value.
4075      *-----------------*/
4076     flg_conv = 0 ;
4077 
4078     /*---------------------------------------------------*
4079      * start of Psl calculation. (label)
4080      *-----------------*/
4081 start_of_loopl:
4082 
4083     for ( lp_sl = 1 ; lp_sl <= lp_sl_max + 1 ; lp_sl ++ ) {
4084 
4085       Chi = beta * ( Psl - Vbs ) ;
4086 
4087       if ( Chi  < znbd5 ) {
4088         /*-------------------------------------------*
4089          * zone-D2.  (Psl)
4090          * - Qb0 is approximated to 5-degree polynomial.
4091          *-----------------*/
4092 
4093         fi = Chi * Chi * Chi
4094           * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ;
4095         fi_dChi = Chi * Chi
4096           * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ;
4097 
4098         cfs1 = cnst1 * exp_bVbsVds ;
4099         fsl1 = cfs1 * fi * fi ;
4100         fsl1_dPsl = cfs1 * beta * 2 * fi * fi_dChi ;
4101 
4102         fb = Chi * ( cn_nc51
4103            + Chi * ( cn_nc52
4104            + Chi * ( cn_nc53
4105            + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ;
4106         fb_dChi = cn_nc51
4107            + Chi * ( 2 * cn_nc52
4108            + Chi * ( 3 * cn_nc53
4109            + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ;
4110 
4111         fsl2 = sqrt( fb * fb + fsl1 ) ;
4112         fsl2_dPsl = ( beta * fb_dChi * 2 * fb + fsl1_dPsl ) / ( fsl2 + fsl2 ) ;
4113 
4114       } else {
4115         /*-------------------------------------------*
4116          * zone-D3.  (Psl)
4117          *-----------------*/
4118         Rho = beta * ( Psl - Vds ) ;
4119         exp_Rho = exp( Rho ) ;
4120 
4121         fsl1 = cnst1 * ( exp_Rho - exp_bVbsVds ) ;
4122         fsl1_dPsl = cnst1 * beta * ( exp_Rho ) ;
4123         Xil = Chi - 1.0e0 ;
4124         fsl2 = sqrt( Xil + fsl1 ) ;
4125         fsl2_dPsl = ( beta + fsl1_dPsl ) / ( fsl2 + fsl2 ) ;
4126       }
4127 
4128       Fsl = Vgp - Psl - fac1 * fsl2 ;
4129       Fsl_dPsl = - 1.0e0 - fac1 * fsl2_dPsl ;
4130 
4131       if ( flg_conv == 1 ) break ;
4132 
4133       dPsl = - Fsl / Fsl_dPsl ;
4134 
4135       /*-------------------------------------------*
4136        * Update Psl .
4137        * - clamped to Vbs if Psl < Vbs .
4138        *-----------------*/
4139       dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Psl))) ;
4140       if ( fabs( dPsl ) > dPlim ) dPsl = dPlim * Fn_Sgn( dPsl ) ;
4141 
4142       Psl = Psl + dPsl ;
4143 
4144       TX = Vbs + ps_conv / 2 ;
4145       if ( Psl < TX ) Psl = TX ;
4146 
4147       /*-------------------------------------------*
4148        * Check convergence.
4149        * NOTE: This condition may be too rigid.
4150        *-----------------*/
4151       if ( fabs( dPsl ) <= ps_conv && fabs( Fsl ) <= gs_conv ) {
4152         flg_conv = 1 ;
4153       }
4154     } /* end of Psl Newton loop */
4155 
4156     /* Eliminate loop count to take account of the derivative loop */
4157     lp_sl -- ;
4158 
4159     /*-------------------------------------------*
4160      * Procedure for diverged case.
4161      *-----------------*/
4162     if ( flg_conv == 0 ) {
4163       fprintf( stderr ,
4164                "*** warning(HiSIM): Went Over Iteration Maximum (Psl)\n" ) ;
4165       fprintf( stderr ,
4166                " Vbse   = %7.3f Vdse = %7.3f Vgse = %7.3f\n" ,
4167                Vbse , Vdse , Vgse ) ;
4168       if ( flg_info >= 2 ) {
4169         printf("*** warning(HiSIM): Went Over Iteration Maximum (Psl)\n" ) ;
4170       }
4171     }
4172 
4173 
4174     /*---------------------------------------------------*
4175      * Evaluate derivatives of  Psl.
4176      * - note: Here, fsl1_dVbs and fsl2_dVbs are derivatives
4177      *   w.r.t. explicit Vbs. So, Psl in the fsl1 and fsl2
4178      *   expressions is regarded as a constant.
4179      *-----------------*/
4180     if ( Chi < znbd5 ) {
4181       T1 = cfs1 * beta * fi ;
4182       fsl1_dVbs = T1 * ( ( 1.0 - Vdseff_dVbs ) * fi - 2.0 * fi_dChi ) ;
4183       fsl1_dVds = - T1 * fi * Vdseff_dVds ;
4184       fsl1_dVgs = - T1 * fi * Vdseff_dVgs ;
4185       T2 =  0.5 / fsl2 ;
4186       fsl2_dVbs = ( - beta * fb_dChi * 2 * fb + fsl1_dVbs ) * T2 ;
4187       fsl2_dVds = fsl1_dVds * T2 ;
4188       fsl2_dVgs = fsl1_dVgs * T2 ;
4189     } else {
4190       T1 = cnst1 * beta ;
4191       fsl1_dVbs = - T1 * ( exp_Rho * Vdseff_dVbs
4192                          + ( 1.0 - Vdseff_dVbs ) * exp_bVbsVds );
4193       fsl1_dVds = - T1 * Vdseff_dVds * ( exp_Rho - exp_bVbsVds );
4194       fsl1_dVgs =   T1 * Vdseff_dVgs * ( - exp_Rho + exp_bVbsVds );
4195       T2 = 0.5e0 / fsl2 ;
4196       fsl2_dVbs = ( - beta + fsl1_dVbs ) * T2 ;
4197       fsl2_dVds = ( fsl1_dVds ) * T2 ;
4198       fsl2_dVgs = ( fsl1_dVgs ) * T2 ;
4199     }
4200 
4201     T1 = 1.0 / Fsl_dPsl ;
4202     Psl_dVbs = - ( Vgp_dVbs - ( fac1 * fsl2_dVbs + fac1_dVbs * fsl2 ) ) * T1 ;
4203     Psl_dVds = - ( Vgp_dVds - ( fac1 * fsl2_dVds + fac1_dVds * fsl2 ) ) * T1 ;
4204     Psl_dVgs = - ( Vgp_dVgs - ( fac1 * fsl2_dVgs + fac1_dVgs * fsl2 ) ) * T1 ;
4205 
4206     if ( Chi < znbd5 ) {
4207       /*-------------------------------------------*
4208        * zone-D1/D2. (Psl)
4209        *-----------------*/
4210       Xil = fb * fb + epsm10 ;
4211       T1 = 2 * fb * fb_dChi * beta ;
4212       Xil_dVbs = T1 * ( Psl_dVbs - 1.0 ) ;
4213       Xil_dVds = T1 * Psl_dVds ;
4214       Xil_dVgs = T1 * Psl_dVgs ;
4215 
4216       Xilp12 = fb + epsm10 ;
4217       T1 = fb_dChi * beta ;
4218       Xilp12_dVbs = T1 * ( Psl_dVbs - 1.0 ) ;
4219       Xilp12_dVds = T1 * Psl_dVds ;
4220       Xilp12_dVgs = T1 * Psl_dVgs ;
4221 
4222       Xilp32 = fb * fb * fb + epsm10 ;
4223       T1 = 3 * fb * fb * fb_dChi * beta ;
4224       Xilp32_dVbs = T1 * ( Psl_dVbs - 1.0 ) ;
4225       Xilp32_dVds = T1 * Psl_dVds ;
4226       Xilp32_dVgs = T1 * Psl_dVgs ;
4227 
4228     } else {
4229       /*-------------------------------------------*
4230        * zone-D3. (Psl)
4231        *-----------------*/
4232 
4233       Xil = Chi - 1.0e0 ;
4234       Xil_dVbs = beta * ( Psl_dVbs - 1.0e0 ) ;
4235       Xil_dVds = beta * Psl_dVds ;
4236       Xil_dVgs = beta * Psl_dVgs ;
4237 
4238       Xilp12 = sqrt( Xil ) ;
4239       T1 = 0.5e0 / Xilp12 ;
4240       Xilp12_dVbs = T1 * Xil_dVbs ;
4241       Xilp12_dVds = T1 * Xil_dVds ;
4242       Xilp12_dVgs = T1 * Xil_dVgs ;
4243 
4244       Xilp32 = Xil * Xilp12 ;
4245       T1 = 1.5e0 * Xilp12 ;
4246       Xilp32_dVbs = T1 * Xil_dVbs ;
4247       Xilp32_dVds = T1 * Xil_dVds ;
4248       Xilp32_dVgs = T1 * Xil_dVgs ;
4249 
4250     }
4251 
4252     /*---------------------------------------------------*
4253      * Assign Pds.
4254      *-----------------*/
4255     Pds = Psl - Ps0 ;
4256 
4257     if ( Pds < 0.0 ) {
4258       Pds = 0.0 ;
4259       Psl = Ps0 ;
4260     }
4261 
4262     Pds_dVbs = Psl_dVbs - Ps0_dVbs ;
4263     Pds_dVds = Psl_dVds - Ps0_dVds ;
4264     Pds_dVgs = Psl_dVgs - Ps0_dVgs ;
4265 
4266     if ( Pds < ps_conv ) {
4267       Pds_dVbs = 0.0 ;
4268       Pds_dVgs = 0.0 ;
4269       Psl_dVbs = Ps0_dVbs ;
4270       Psl_dVgs = Ps0_dVgs ;
4271     }
4272 
4273     /* Vdseff */
4274     Vds = Vdsorg;
4275 
4276 
4277     if( corecip ){
4278 
4279       /* For multi level Newton method to calculate PS0Z_SCE        */
4280       /* remember that for the inner Newton:                        */
4281       /* Fs0(PS0Z_SCE,Ps0) = Vgp(PSOZ_SCE) - Ps0 - fac1 * fs02(Ps0) */
4282       /* -> dPs0/dPS0Z_SCE = - (dFs0/dPS0Z_SCE) / (dFs0/dPs0)       */
4283       /* and                                                        */
4284       /* Fsl(PS0Z_SCE,Psl) = Vgp(PS0Z_SCE) - Psl - fac1 * fsl1(Psl) */
4285       /* -> dPsl/dPS0Z_SCE = - (dFsl/dPS0Z_SCE) / (dFsl/dPsl)       */
4286 
4287       /* Outer Newton:                                                                       */
4288       /* PS0Z_SCE = Ps0 + Pzadd(Ps0,Psl)                                                     */
4289       /* -> G(PS0Z_SCE) := PS0Z_SCE - Ps0(PS0Z_SCE) - Pzadd(Ps0(PS0Z_SCE),Psl(Ps0Z_SCE)) = 0 */
4290       /* -> Newton correction delta_PS0Z_SCE from:                                           */
4291       /*         (1.0 - dPs0/dPS0Z_SCE - dPzadd/dPS0Z_SCE) * delta_PS0Z_SCE = - G            */
4292 
4293       Fs0_dPS0Z = Vgp_dPS0Z ;
4294       Ps0_dPS0Z = - Fs0_dPS0Z / Fs0_dPs0 ;
4295 
4296       Fsl_dPS0Z = Vgp_dPS0Z ;
4297       Psl_dPS0Z = - Fsl_dPS0Z / Fsl_dPsl ;
4298 
4299       if ( Pds < ps_conv ) {
4300         Pds_dPS0Z = 0.0 ;
4301       } else {
4302         Pds_dPS0Z = Psl_dPS0Z - Ps0_dPS0Z ;
4303       }
4304 
4305       T1 =  ( Vds - Pds ) / 2 ;
4306       Fn_SymAdd( Pzadd , T1 , model->HSM2_pzadd0 , T2 ) ;
4307       T2 /= 2 ;
4308       Pzadd_dVbs = T2 * ( - Pds_dVbs ) ;
4309       Pzadd_dVds = T2 * ( 1.0 - Pds_dVds ) ;
4310       Pzadd_dVgs = T2 * ( - Pds_dVgs ) ;
4311       Pzadd_dPS0Z = T2 * ( - Pds_dPS0Z) ;
4312 
4313       if ( Pzadd < epsm10 ) {
4314 	Pzadd = epsm10 ;
4315 	Pzadd_dVbs = 0.0 ;
4316 	Pzadd_dVds = 0.0 ;
4317 	Pzadd_dVgs = 0.0 ;
4318         Pzadd_dPS0Z = 0.0 ;
4319       }
4320 
4321       Ps0z = Ps0 + Pzadd ;
4322       Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ;
4323       Ps0z_dVds = Ps0_dVds + Pzadd_dVds ;
4324       Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ;
4325       Ps0z_dPS0Z = Ps0_dPS0Z + Pzadd_dPS0Z ;
4326 
4327 
4328       /* calculate Newton correction: */
4329       G = PS0Z_SCE - Ps0z ;
4330       delta_PS0Z_SCE = - G / (1.0 - Ps0z_dPS0Z) ;
4331 
4332       delta_PS0Z_SCE_dVbs = Ps0z_dVbs - PS0Z_SCE_dVbs;
4333       delta_PS0Z_SCE_dVds = Ps0z_dVds - PS0Z_SCE_dVds;
4334       delta_PS0Z_SCE_dVgs = Ps0z_dVgs - PS0Z_SCE_dVgs;
4335       PS0Z_SCE += delta_PS0Z_SCE ;
4336       PS0Z_SCE_dVbs = Ps0z_dVbs ;
4337       PS0Z_SCE_dVds = Ps0z_dVds ;
4338       PS0Z_SCE_dVgs = Ps0z_dVgs ;
4339 
4340       PS0_SCE = PS0Z_SCE - Pzadd ;
4341       PS0_SCE_dVbs = Ps0_dVbs ;
4342       PS0_SCE_dVds = Ps0_dVds ;
4343       PS0_SCE_dVgs = Ps0_dVgs ;
4344 
4345       NNN += 1 ;
4346 
4347       if( (    fabs(delta_PS0Z_SCE) > PS0_SCE_tol
4348             || fabs(delta_PS0Z_SCE_dVbs) > PS0_SCE_deriv_tol
4349             || fabs(delta_PS0Z_SCE_dVds) > PS0_SCE_deriv_tol
4350             || fabs(delta_PS0Z_SCE_dVgs) > PS0_SCE_deriv_tol
4351           ) && (NNN < MAX_LOOP_SCE)  ){
4352      // goto START_OF_SCE_LOOP;
4353              START_OF_SCE_LOOP = 1 ;
4354       }
4355 
4356 
4357     }
4358 
4359     } /* skip end_of_part_1  */
4360 } /* End of 1st SCE_LOOP */
4361     if ( end_of_part_1 == 0 ) { /* skip to end_of_part_1 */
4362 
4363     /*-----------------------------------------------------------*
4364      * Evaluate Idd.
4365      * - Eta : substantial variable of QB'/Pds and Idd/Pds.
4366      * - note: Eta   = 4 * GAMMA_{hisim_0}
4367      *-----------------*/
4368     T1 = beta / Xi0 ;
4369     Eta = T1 * Pds ;
4370     T2 = Eta * beta_inv ;
4371     Eta_dVbs = T1 * ( Pds_dVbs - Xi0_dVbs * T2 ) ;
4372     Eta_dVds = T1 * ( Pds_dVds - Xi0_dVds * T2 ) ;
4373     Eta_dVgs = T1 * ( Pds_dVgs - Xi0_dVgs * T2 ) ;
4374 
4375     /* ( Eta + 1 )^n */
4376     Eta1 = Eta + 1.0e0 ;
4377     Eta1p12 = sqrt( Eta1 ) ;
4378     Eta1p32 = Eta1p12 * Eta1 ;
4379     Eta1p52 = Eta1p32 * Eta1 ;
4380 
4381     /* 1 / ( ( Eta + 1 )^n + 1 ) */
4382     Zeta12 = 1.0e0 / ( Eta1p12 + 1.0e0 ) ;
4383     Zeta32 = 1.0e0 / ( Eta1p32 + 1.0e0 ) ;
4384     Zeta52 = 1.0e0 / ( Eta1p52 + 1.0e0 ) ;
4385 
4386     /*---------------------------------------------------*
4387      * F00 := PS00/Pds (n=1/2)
4388      *-----------------*/
4389     F00 = Zeta12 / Xi0p12 ;
4390     T3 = - 1 / Xi0  ;
4391     T4 = - 0.5e0 / Eta1p12 * F00 ;
4392     T5 = Zeta12 * T3 ;
4393     T6 = Zeta12 * T4 ;
4394     F00_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ;
4395     F00_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ;
4396     F00_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ;
4397 
4398     /*---------------------------------------------------*
4399      * F10 := PS10/Pds (n=3/2)
4400      *-----------------*/
4401     T1 = 3.0e0 + Eta * ( 3.0e0 + Eta ) ;
4402     F10 = C_2o3 * Xi0p12 * Zeta32 * T1 ;
4403     T2 = 3.0e0 + Eta * 2.0e0 ;
4404     T3 = C_2o3 * T1 ;
4405     T4 = - 1.5e0 * Eta1p12 * F10 + C_2o3 * Xi0p12 * T2 ;
4406     T5 = Zeta32 * T3 ;
4407     T6 = Zeta32 * T4 ;
4408     F10_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ;
4409     F10_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ;
4410     F10_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ;
4411 
4412     /*---------------------------------------------------*
4413      * F30 := PS30/Pds (n=5/2)
4414      *-----------------*/
4415     T1 = 5e0 + Eta * ( 10e0 + Eta * ( 10e0 + Eta * ( 5e0 + Eta ) ) ) ;
4416     F30 = 4e0 / ( 15e0 * beta ) * Xi0p32 * Zeta52 * T1 ;
4417     T2 = 10e0 + Eta * ( 20e0 + Eta * ( 15e0 + Eta * 4e0 ) ) ;
4418     T3 = 4e0 / ( 15e0 * beta ) * T1 ;
4419     T4 = - ( 5e0 / 2e0 ) * Eta1p32 * F30 + 4e0 / ( 15e0 * beta ) * Xi0p32 * T2 ;
4420     T5 = Zeta52 * T3 ;
4421     T6 = Zeta52 * T4 ;
4422     F30_dVbs = ( Xi0p32_dVbs * T5 + Eta_dVbs * T6 ) ;
4423     F30_dVds = ( Xi0p32_dVds * T5 + Eta_dVds * T6 ) ;
4424     F30_dVgs = ( Xi0p32_dVgs * T5 + Eta_dVgs * T6 ) ;
4425 
4426     /*---------------------------------------------------*
4427      * F11 := PS11/Pds.
4428      *-----------------*/
4429     F11 = Ps0 * F10 + C_2o3 * beta_inv * Xilp32 - F30 ;
4430     T1 = C_2o3 * beta_inv ;
4431     F11_dVbs = Ps0_dVbs * F10 + Ps0 * F10_dVbs
4432       + T1 * Xilp32_dVbs - F30_dVbs ;
4433     F11_dVds = Ps0_dVds * F10 + Ps0 * F10_dVds
4434       + T1 * Xilp32_dVds - F30_dVds ;
4435     F11_dVgs = Ps0_dVgs * F10 + Ps0 * F10_dVgs
4436       + T1 * Xilp32_dVgs - F30_dVgs ;
4437 
4438     /*---------------------------------------------------*
4439      * Fdd := Idd/Pds.
4440      *-----------------*/
4441     T1 = Vgp + beta_inv - 0.5e0 * ( 2.0e0 * Ps0 + Pds ) ;
4442     T2 = - F10 + F00 ;
4443     T3 = beta * Cox ;
4444     T4 = beta * cnst0 ;
4445     Fdd = T3 * T1 + T4 * T2 ;
4446     Fdd_dVbs = T3 * ( Vgp_dVbs - Ps0_dVbs - 0.5e0 * Pds_dVbs )
4447       + beta * Cox_dVb * T1 + T4 * ( - F10_dVbs + F00_dVbs ) ;
4448     Fdd_dVds = T3 * ( Vgp_dVds - Ps0_dVds - 0.5e0 * Pds_dVds )
4449       + beta * Cox_dVd * T1 + T4 * ( - F10_dVds + F00_dVds ) ;
4450     Fdd_dVgs = T3 * ( Vgp_dVgs - Ps0_dVgs - 0.5e0 * Pds_dVgs )
4451       + beta * Cox_dVg * T1 + T4 * ( - F10_dVgs + F00_dVgs ) ;
4452 
4453 
4454     /*---------------------------------------------------*
4455      *  Idd:
4456      *-----------------*/
4457     Idd = Pds * Fdd ;
4458     Idd_dVbs = Pds_dVbs * Fdd + Pds * Fdd_dVbs ;
4459     Idd_dVds = Pds_dVds * Fdd + Pds * Fdd_dVds ;
4460     Idd_dVgs = Pds_dVgs * Fdd + Pds * Fdd_dVgs ;
4461 
4462     /*-----------------------------------------------------------*
4463      * Skip CLM and integrated charges if zone==D1
4464      *-----------------*/
4465     if( flg_zone == 1 ) {
4466       goto start_of_mobility ;
4467     }
4468 
4469     /*-----------------------------------------------------------*
4470      * Channel Length Modulation. Lred: \Delta L
4471      *-----------------*/
4472     if( pParam->HSM2_clm2 < epsm10 && pParam->HSM2_clm3 < epsm10 ) {
4473       Lred = 0.0e0 ;
4474       Lred_dVbs = 0.0e0 ;
4475       Lred_dVds = 0.0e0 ;
4476       Lred_dVgs = 0.0e0 ;
4477 
4478       Psdl = Psl ;
4479       Psdl_dVbs = Psl_dVbs ;
4480       Psdl_dVds = Psl_dVds ;
4481       Psdl_dVgs = Psl_dVgs ;
4482       if ( Psdl > Ps0 + Vds - epsm10 ) {
4483         Psdl = Ps0 + Vds - epsm10 ;
4484         Psdl_dVbs = Ps0_dVbs ;
4485         Psdl_dVds = Ps0_dVds + 1.0 ;
4486         Psdl_dVgs = Ps0_dVgs ;
4487       }
4488 
4489     } else {
4490       T1 = here->HSM2_wdpl ;
4491       T8 = sqrt (Psl - Vbs) ;
4492       Wd = T1 * T8 ;
4493       T9 = 0.5 * T1 / T8 ;
4494       Wd_dVbs = T9 * (Psl_dVbs - 1.0) ;
4495       Wd_dVds = T9 * Psl_dVds ;
4496       Wd_dVgs = T9 * Psl_dVgs ;
4497 
4498       T0 = 1.0 / Wd ;
4499       T1 = Qn0 * T0 ;
4500       T2 = pParam->HSM2_clm3 * T1 ;
4501       T3 = pParam->HSM2_clm3 * T0 ;
4502       T2_dVb = T3 * (Qn0_dVbs - T1 * Wd_dVbs) ;
4503       T2_dVd = T3 * (Qn0_dVds - T1 * Wd_dVds) ;
4504       T2_dVg = T3 * (Qn0_dVgs - T1 * Wd_dVgs) ;
4505 
4506       T5 = pParam->HSM2_clm2 * q_Nsub + T2 ;
4507       T1 = 1.0 / T5 ;
4508       T4 = C_ESI * T1 ;
4509       T4_dVb = - T4 * T2_dVb * T1 ;
4510       T4_dVd = - T4 * T2_dVd * T1 ;
4511       T4_dVg = - T4 * T2_dVg * T1 ;
4512 
4513       T1 = (1.0e0 - pParam->HSM2_clm1) ;
4514       Psdl = pParam->HSM2_clm1 * (Vds + Ps0) + T1 * Psl ;
4515       Psdl_dVbs = pParam->HSM2_clm1 * Ps0_dVbs + T1 * Psl_dVbs ;
4516       Psdl_dVds = pParam->HSM2_clm1 * (1.0 + Ps0_dVds) + T1 * Psl_dVds ;
4517       Psdl_dVgs = pParam->HSM2_clm1 * Ps0_dVgs + T1 * Psl_dVgs ;
4518       if ( Psdl > Ps0 + Vds - epsm10 ) {
4519         Psdl = Ps0 + Vds - epsm10 ;
4520         Psdl_dVbs = Ps0_dVbs ;
4521         Psdl_dVds = Ps0_dVds + 1.0 ;
4522         Psdl_dVgs = Ps0_dVgs ;
4523       }
4524       T6 = Psdl - Psl ;
4525       T6_dVb = Psdl_dVbs - Psl_dVbs ;
4526       T6_dVd = Psdl_dVds - Psl_dVds ;
4527       T6_dVg = Psdl_dVgs - Psl_dVgs ;
4528 
4529       T3 = beta * Qn0 ;
4530       T1 = 1.0 / T3 ;
4531       T5 = Idd * T1 ;
4532       T2 = T5 * beta ;
4533       T5_dVb = (Idd_dVbs - T2 * Qn0_dVbs) * T1 ;
4534       T5_dVd = (Idd_dVds - T2 * Qn0_dVds) * T1 ;
4535       T5_dVg = (Idd_dVgs - T2 * Qn0_dVgs) * T1 ;
4536 
4537       T10 = q_Nsub / C_ESI ;
4538       T1 = C_E0_p2 ;  // E0^2
4539       T2 = 1.0 / Leff ;
4540       T11 = (2.0 * T5 + 2.0 * T10 * T6 * T4 + T1 * T4) * T2 ;
4541       T3 = T2 * T4 ;
4542       T7 = T11 * T4 ;
4543       T7_dVb = (2.0 * T5_dVb + 2.0 * T10 * (T6_dVb * T4 + T6 * T4_dVb) + T1 * T4_dVb) * T3 + T11 * T4_dVb ;
4544       T7_dVd = (2.0 * T5_dVd + 2.0 * T10 * (T6_dVd * T4 + T6 * T4_dVd) + T1 * T4_dVd) * T3 + T11 * T4_dVd ;
4545       T7_dVg = (2.0 * T5_dVg + 2.0 * T10 * (T6_dVg * T4 + T6 * T4_dVg) + T1 * T4_dVg) * T3 + T11 * T4_dVg ;
4546 
4547       T11 = 4.0 * (2.0 * T10 * T6 + T1) ;
4548       T1 = 8.0 * T10 * T4 * T4 ;
4549       T2 = 2.0 * T11 * T4 ;
4550       T8 = T11 * T4 * T4 ;
4551       T8_dVb = ( T1 * T6_dVb + T2 * T4_dVb) ;
4552       T8_dVd = ( T1 * T6_dVd + T2 * T4_dVd) ;
4553       T8_dVg = ( T1 * T6_dVg + T2 * T4_dVg) ;
4554 
4555       T9 = sqrt (T7 * T7 + T8);
4556       T1 = 1.0 / T9 ;
4557       T2 = T7 * T1 ;
4558       T3 = 0.5 * T1 ;
4559       T9_dVb = (T2 * T7_dVb + T3 * T8_dVb) ;
4560       T9_dVd = (T2 * T7_dVd + T3 * T8_dVd) ;
4561       T9_dVg = (T2 * T7_dVg + T3 * T8_dVg) ;
4562 
4563       Lred = 0.5 * (- T7 + T9) ;
4564       Lred_dVbs = 0.5 * (- T7_dVb + T9_dVb) ;
4565       Lred_dVds = 0.5 * (- T7_dVd + T9_dVd) ;
4566       Lred_dVgs = 0.5 * (- T7_dVg + T9_dVg) ;
4567 
4568       /*---------------------------------------------------*
4569        * Modify Lred for symmetry.
4570        *-----------------*/
4571       T1 = Lred ;
4572       Lred = FMDVDS * T1 ;
4573       Lred_dVbs = FMDVDS_dVbs * T1 + FMDVDS * Lred_dVbs ;
4574       Lred_dVds = FMDVDS_dVds * T1 + FMDVDS * Lred_dVds ;
4575       Lred_dVgs = FMDVDS_dVgs * T1 + FMDVDS * Lred_dVgs ;
4576     }
4577 
4578     /* CLM5 & CLM6 */
4579     Lred *= here->HSM2_clmmod ;
4580     Lred_dVbs *= here->HSM2_clmmod ;
4581     Lred_dVds *= here->HSM2_clmmod ;
4582     Lred_dVgs *= here->HSM2_clmmod ;
4583 
4584 
4585     /*---------------------------------------------------*
4586      * Qbu : -Qb in unit area.
4587      *-----------------*/
4588     T1 = Vgp + beta_inv ;
4589     T2 = T1 * F10 - F11 ;
4590 
4591     Qbnm = cnst0 * ( cnst0 * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds )
4592                    + Cox * T2 ) ;
4593     Qbnm_dVbs = cnst0 * ( cnst0 * ( - Xi0_dVbs - 0.5e0 * beta * Pds_dVbs )
4594                           + Cox * ( Vgp_dVbs * F10 + T1 * F10_dVbs - F11_dVbs )
4595                           + Cox_dVb * T2 ) ;
4596     Qbnm_dVds = cnst0 * ( cnst0 * ( - Xi0_dVds - 0.5e0 * beta * Pds_dVds )
4597                           + Cox * ( Vgp_dVds * F10 + T1 * F10_dVds - F11_dVds )
4598                           + Cox_dVd * T2 ) ;
4599     Qbnm_dVgs = cnst0 * ( cnst0 * ( - Xi0_dVgs - 0.5e0 * beta * Pds_dVgs )
4600                           + Cox * ( Vgp_dVgs * F10 + T1 * F10_dVgs - F11_dVgs )
4601                           + Cox_dVg * T2 ) ;
4602 
4603     T1 = beta ;
4604     Qbu = T1 * Qbnm / Fdd ;
4605     T2 = T1 / ( Fdd * Fdd ) ;
4606     Qbu_dVbs = T2 * ( Fdd * Qbnm_dVbs - Qbnm * Fdd_dVbs ) ;
4607     Qbu_dVds = T2 * ( Fdd * Qbnm_dVds - Qbnm * Fdd_dVds ) ;
4608     Qbu_dVgs = T2 * ( Fdd * Qbnm_dVgs - Qbnm * Fdd_dVgs ) ;
4609 
4610     /*---------------------------------------------------*
4611      * preparation for Qi and Qd.
4612      * - DtPds: Delta * Pds ;
4613      * - Achi: (1+Delta) * Pds ;
4614      *-----------------*/
4615     T1 = 2.0e0 * fac1 ;
4616     DtPds = T1 * ( F10 - Xi0p12 ) ;
4617     T2 = 2.0 * ( F10 - Xi0p12 ) ;
4618     DtPds_dVbs  = T1 * ( F10_dVbs - Xi0p12_dVbs )
4619                 + T2 * fac1_dVbs ;
4620     DtPds_dVds  = T1 * ( F10_dVds - Xi0p12_dVds )
4621                 + T2 * fac1_dVds ;
4622     DtPds_dVgs  = T1 * ( F10_dVgs - Xi0p12_dVgs )
4623                 + T2 * fac1_dVgs ;
4624 
4625     Achi = Pds + DtPds ;
4626     Achi_dVbs = Pds_dVbs + DtPds_dVbs ;
4627     Achi_dVds = Pds_dVds + DtPds_dVds ;
4628     Achi_dVgs = Pds_dVgs + DtPds_dVgs ;
4629 
4630     /*-----------------------------------------------------------*
4631      * Alpha : parameter to evaluate charges.
4632      * - Achi: (1+Delta) * Pds ;
4633      * - clamped to 0 if Alpha < 0.
4634      *-----------------*/
4635     T1 = 1.0 / VgVt ;
4636     T2 = Achi * T1 ;
4637     T3 = 1.0e0 - T2 ;
4638     TX = 1.0 - T3 ;
4639     Fn_CP( TY , TX , 1.0 , 4 , T4 ) ;
4640     Alpha = 1.0 - TY ;
4641     T5 = T1 * T4 ;
4642     Alpha_dVbs = - ( Achi_dVbs - T2 * VgVt_dVbs ) * T5 ;
4643     Alpha_dVds = - ( Achi_dVds - T2 * VgVt_dVds ) * T5 ;
4644     Alpha_dVgs = - ( Achi_dVgs - T2 * VgVt_dVgs ) * T5 ;
4645 
4646 
4647     /*-----------------------------------------------------------*
4648      * Qiu : -Qi in unit area.
4649      *-----------------*/
4650 
4651     Qinm = 1.0e0 + Alpha * ( 1.0e0 + Alpha ) ;
4652     T1 = 1.0e0 + Alpha + Alpha ;
4653     Qinm_dVbs = Alpha_dVbs * T1 ;
4654     Qinm_dVds = Alpha_dVds * T1 ;
4655     Qinm_dVgs = Alpha_dVgs * T1 ;
4656 
4657     Qidn = Fn_Max( 1.0e0 + Alpha , epsm10 ) ;
4658     Qidn_dVbs = Alpha_dVbs ;
4659     Qidn_dVds = Alpha_dVds ;
4660     Qidn_dVgs = Alpha_dVgs ;
4661 
4662     T1 = C_2o3 * VgVt * Qinm / Qidn ;
4663     Qiu = T1 * Cox ;
4664     T2 = 1.0 / VgVt ;
4665     T3 = 1.0 / Qinm ;
4666     T4 = 1.0 / Qidn ;
4667     Qiu_dVbs = Qiu * ( VgVt_dVbs * T2 + Qinm_dVbs * T3 - Qidn_dVbs * T4 )
4668              + T1 * Cox_dVb ;
4669     Qiu_dVds = Qiu * ( VgVt_dVds * T2 + Qinm_dVds * T3 - Qidn_dVds * T4)
4670              + T1 * Cox_dVd ;
4671     Qiu_dVgs = Qiu * ( VgVt_dVgs * T2 + Qinm_dVgs * T3 - Qidn_dVgs * T4)
4672              + T1 * Cox_dVg ;
4673 
4674     /*-----------------------------------------------------------*
4675      * Qdrat : Qd/Qi
4676      *-----------------*/
4677     Qdnm = 0.5e0 + Alpha ;
4678     Qdnm_dVbs = Alpha_dVbs ;
4679     Qdnm_dVds = Alpha_dVds ;
4680     Qdnm_dVgs = Alpha_dVgs ;
4681 
4682     Qddn = Qidn * Qinm ;
4683     Qddn_dVbs = Qidn_dVbs * Qinm + Qidn * Qinm_dVbs ;
4684     Qddn_dVds = Qidn_dVds * Qinm + Qidn * Qinm_dVds ;
4685     Qddn_dVgs = Qidn_dVgs * Qinm + Qidn * Qinm_dVgs ;
4686 
4687     Quot = 0.4e0 * Qdnm  / Qddn ;
4688     Qdrat = 0.6e0 - Quot ;
4689 
4690     if ( Qdrat <= 0.5e0 ) {
4691       T1 = 1.0 / Qddn ;
4692       T2 = 1.0 / Qdnm ;
4693       Qdrat_dVbs = Quot * ( Qddn_dVbs * T1 - Qdnm_dVbs * T2 ) ;
4694       Qdrat_dVds = Quot * ( Qddn_dVds * T1 - Qdnm_dVds * T2 ) ;
4695       Qdrat_dVgs = Quot * ( Qddn_dVgs * T1 - Qdnm_dVgs * T2 ) ;
4696     } else {
4697       Qdrat = 0.5e0 ;
4698       Qdrat_dVbs = 0.0e0 ;
4699       Qdrat_dVds = 0.0e0 ;
4700       Qdrat_dVgs = 0.0e0 ;
4701     }
4702 
4703 
4704     /*-----------------------------------------------------------*
4705      * Interpolate charges and CLM for zone-D2.
4706      *-----------------*/
4707 
4708     if ( flg_zone == 2 ) {
4709       T1 = Qbu ;
4710       Qbu = FD2 * Qbu + ( 1.0 - FD2 ) * Qb0 ;
4711       Qbu_dVbs = FD2 * Qbu_dVbs + FD2_dVbs * T1
4712         + ( 1.0 - FD2 ) * Qb0_dVb - FD2_dVbs * Qb0 ;
4713       Qbu_dVds = FD2 * Qbu_dVds + FD2_dVds * T1
4714         + ( 1.0 - FD2 ) * Qb0_dVd - FD2_dVds * Qb0 ;
4715       Qbu_dVgs = FD2 * Qbu_dVgs + FD2_dVgs * T1
4716         + ( 1.0 - FD2 ) * Qb0_dVg - FD2_dVgs * Qb0 ;
4717 
4718       if ( Qbu < 0.0 ) {
4719         Qbu = 0.0 ;
4720         Qbu_dVbs = 0.0 ;
4721         Qbu_dVds = 0.0 ;
4722         Qbu_dVgs = 0.0 ;
4723       }
4724       T1 = Qiu ;
4725       Qiu = FD2 * Qiu + ( 1.0 - FD2 ) * Qn0 ;
4726       Qiu_dVbs = FD2 * Qiu_dVbs + FD2_dVbs * T1
4727         + ( 1.0 - FD2 ) * Qn0_dVbs - FD2_dVbs * Qn0 ;
4728       Qiu_dVds = FD2 * Qiu_dVds + FD2_dVds * T1
4729         + ( 1.0 - FD2 ) * Qn0_dVds - FD2_dVds * Qn0 ;
4730       Qiu_dVgs = FD2 * Qiu_dVgs + FD2_dVgs * T1
4731         + ( 1.0 - FD2 ) * Qn0_dVgs - FD2_dVgs * Qn0 ;
4732       if ( Qiu < 0.0 ) {
4733         Qiu = 0.0 ;
4734         Qiu_dVbs = 0.0 ;
4735         Qiu_dVds = 0.0 ;
4736         Qiu_dVgs = 0.0 ;
4737       }
4738 
4739       T1 = Qdrat ;
4740       Qdrat = FD2 * Qdrat + ( 1.0 - FD2 ) * 0.5e0 ;
4741       Qdrat_dVbs = FD2 * Qdrat_dVbs + FD2_dVbs * T1 - FD2_dVbs * 0.5e0 ;
4742       Qdrat_dVds = FD2 * Qdrat_dVds + FD2_dVds * T1 - FD2_dVds * 0.5e0 ;
4743       Qdrat_dVgs = FD2 * Qdrat_dVgs + FD2_dVgs * T1 - FD2_dVgs * 0.5e0 ;
4744 
4745       /* note: Lred=0 in zone-D1 */
4746       T1 = Lred ;
4747       Lred = FD2 * Lred ;
4748       Lred_dVbs = FD2 * Lred_dVbs + FD2_dVbs * T1 ;
4749       Lred_dVds = FD2 * Lred_dVds + FD2_dVds * T1 ;
4750       Lred_dVgs = FD2 * Lred_dVgs + FD2_dVgs * T1 ;
4751     } /* end of flg_zone==2 if-block */
4752 
4753 
4754 start_of_mobility:
4755 
4756     Lch = Leff - Lred ;
4757     if ( Lch < 1.0e-9 ) {
4758          Lch = 1.0e-9 ; Lch_dVbs = Lch_dVds = Lch_dVgs = 0.0 ;
4759     } else { Lch_dVbs = - Lred_dVbs ; Lch_dVds = - Lred_dVds ; Lch_dVgs = - Lred_dVgs ; }
4760 
4761 
4762 
4763     /*-----------------------------------------------------------*
4764      * Muun : universal mobility. (CGS unit)
4765      *-----------------*/
4766 
4767     T1 = here->HSM2_ndep_o_esi / C_m2cm ; /* fix in version 2.8 */
4768     T2 = here->HSM2_ninv_o_esi / C_m2cm ; /* fix in version 2.8 */
4769 
4770     T0 = here->HSM2_ninvd ;
4771     T3 = sqrt(Pds*Pds + model->HSM2_vzadd0) ;
4772     Pdsz = T3 - sqrt(model->HSM2_vzadd0) ;
4773     Pdsz_dVbs = Pds_dVbs * Pds / T3  ;
4774     Pdsz_dVds = Pds_dVds * Pds / T3  ;
4775     Pdsz_dVgs = Pds_dVgs * Pds / T3  ;
4776 
4777     T4 = 1.0 + Pdsz * T0 ;
4778     T4_dVb =   Pdsz_dVbs * T0 ;
4779     T4_dVd =   Pdsz_dVds * T0 ;
4780     T4_dVg =   Pdsz_dVgs * T0 ;
4781 
4782     T5     = T1 * Qbu      + T2 * Qiu ;
4783     T5_dVb = T1 * Qbu_dVbs + T2 * Qiu_dVbs ;
4784     T5_dVd = T1 * Qbu_dVds + T2 * Qiu_dVds ;
4785     T5_dVg = T1 * Qbu_dVgs + T2 * Qiu_dVgs ;
4786 
4787     T3     = T5 / T4 ;
4788     T3_dVb = ( - T4_dVb * T5 + T4 * T5_dVb ) / T4 / T4 ;
4789     T3_dVd = ( - T4_dVd * T5 + T4 * T5_dVd ) / T4 / T4 ;
4790     T3_dVg = ( - T4_dVg * T5 + T4 * T5_dVg ) / T4 / T4 ;
4791 
4792     Eeff = T3 ;
4793     Eeff_dVbs = T3_dVb ;
4794     Eeff_dVds = T3_dVd ;
4795     Eeff_dVgs = T3_dVg ;
4796 
4797     T5 = Fn_Pow( Eeff , model->HSM2_mueph0 - 1.0e0 ) ;
4798     T8 = T5 * Eeff ;
4799     T7 = Fn_Pow( Eeff , here->HSM2_muesr - 1.0e0 ) ;
4800     T6 = T7 * Eeff ;
4801 
4802 
4803     T9 = C_QE * C_m2cm_p2 ;
4804     Rns = Qiu / T9 ;
4805     T1 = 1.0e0 / ( here->HSM2_muecb0 + here->HSM2_muecb1 * Rns / 1.0e11 )
4806       + here->HSM2_mphn0 * T8 + T6 / pParam->HSM2_muesr1 ;
4807     Muun = 1.0e0 / T1 ;
4808 
4809     T1 = 1.0e0 / ( T1 * T1 ) ;
4810     T2 = here->HSM2_muecb0 + here->HSM2_muecb1 * Rns / 1.0e11 ;
4811     T2 = 1.0e0 / ( T2 * T2 ) ;
4812     T3 = here->HSM2_mphn1 * T5 ;
4813     T4 = here->HSM2_muesr * T7 / pParam->HSM2_muesr1 ;
4814     T5 = - 1.0e-11 * here->HSM2_muecb1 / C_QE * T2 / C_m2cm_p2 ;
4815     Muun_dVbs = - ( T5 * Qiu_dVbs
4816                     + Eeff_dVbs * T3 + Eeff_dVbs * T4 ) * T1 ;
4817     Muun_dVds = - ( T5 * Qiu_dVds
4818                     + Eeff_dVds * T3 + Eeff_dVds * T4 ) * T1 ;
4819     Muun_dVgs = - ( T5 * Qiu_dVgs
4820                     + Eeff_dVgs * T3 + Eeff_dVgs * T4 ) * T1 ;
4821 
4822     /*  Change to MKS unit */
4823     Muun      /= C_m2cm_p2 ;
4824     Muun_dVbs /= C_m2cm_p2 ;
4825     Muun_dVds /= C_m2cm_p2 ;
4826     Muun_dVgs /= C_m2cm_p2 ;
4827     /*-----------------------------------------------------------*
4828      * Mu : mobility
4829      *-----------------*/
4830     T2 = beta * (Qn0 + small) * Lch ;
4831 
4832 
4833     T1 = 1.0e0 / T2 ;
4834     T3 = T1 * T1 ;
4835     T4 =  - beta * T3 ;
4836     T5 = T4 * Lch ;
4837     T6 = T4 * (Qn0 + small) ;
4838     T1_dVb = ( T5 * Qn0_dVbs + T6 * Lch_dVbs) ;
4839     T1_dVd = ( T5 * Qn0_dVds + T6 * Lch_dVds) ;
4840     T1_dVg = ( T5 * Qn0_dVgs + T6 * Lch_dVgs) ;
4841 
4842     TY = Idd * T1 ;
4843     TY_dVbs = Idd_dVbs * T1 + Idd * T1_dVb ;
4844     TY_dVds = Idd_dVds * T1 + Idd * T1_dVd ;
4845     TY_dVgs = Idd_dVgs * T1 + Idd * T1_dVg ;
4846 
4847     T2 = 0.2 * Vmax /  Muun ;
4848     T3 = - T2 / Muun ;
4849     T2_dVb = T3 * Muun_dVbs ;
4850     T2_dVd = T3 * Muun_dVds ;
4851     T2_dVg = T3 * Muun_dVgs ;
4852 
4853     Ey = sqrt( TY * TY + T2 * T2 ) ;
4854     T4 = 1.0 / Ey ;
4855     Ey_dVbs = T4 * ( TY * TY_dVbs + T2 * T2_dVb ) ;
4856     Ey_dVds = T4 * ( TY * TY_dVds + T2 * T2_dVd ) ;
4857     Ey_dVgs = T4 * ( TY * TY_dVgs + T2 * T2_dVg ) ;
4858 
4859     Em = Muun * Ey ;
4860     Em_dVbs = Muun_dVbs * Ey + Muun * Ey_dVbs ;
4861     Em_dVds = Muun_dVds * Ey + Muun * Ey_dVds ;
4862     Em_dVgs = Muun_dVgs * Ey + Muun * Ey_dVgs ;
4863 
4864     T1  = Em / Vmax ;
4865 
4866     /* note: model->HSM2_bb = 2 (electron) ;1 (hole) */
4867     if ( 1.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 1.0e0 + epsm10 ) {
4868       T3 = 1.0e0 ;
4869     } else if ( 2.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 2.0e0 + epsm10 ) {
4870       T3 = T1 ;
4871     } else {
4872       T3 = Fn_Pow( T1 , model->HSM2_bb - 1.0e0 ) ;
4873     }
4874     T2 = T1 * T3 ;
4875     T4 = 1.0e0 + T2 ;
4876 
4877     if ( 1.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 1.0e0 + epsm10 ) {
4878       T5 = 1.0 / T4 ;
4879           T6 = T5 / T4 ;
4880     } else if ( 2.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 2.0e0 + epsm10 ) {
4881       T5 = 1.0 / sqrt( T4 ) ;
4882           T6 = T5 / T4 ;
4883     } else {
4884       T6 = Fn_Pow( T4 , ( - 1.0e0 / model->HSM2_bb - 1.0e0 ) ) ;
4885       T5 = T4 * T6 ;
4886     }
4887 
4888     T7 = Muun / Vmax * T6 * T3 ;
4889 
4890     Mu = Muun * T5 ;
4891     Mu_dVbs = Muun_dVbs * T5 - T7 * Em_dVbs ;
4892     Mu_dVds = Muun_dVds * T5 - T7 * Em_dVds ;
4893     Mu_dVgs = Muun_dVgs * T5 - T7 * Em_dVgs ;
4894 
4895 /*  end_of_mobility : */
4896 
4897     /*-----------------------------------------------------------*
4898      * Ids: channel current.
4899      *-----------------*/
4900     betaWL = here->HSM2_weff_nf * beta_inv / Lch ;
4901     T1 = - betaWL / Lch ;
4902     betaWL_dVbs = T1 * Lch_dVbs ;
4903     betaWL_dVds = T1 * Lch_dVds ;
4904     betaWL_dVgs = T1 * Lch_dVgs ;
4905 
4906     Ids0 = betaWL * Idd * Mu ;
4907     T1 = betaWL * Idd ;
4908     T2 = Idd * Mu ;
4909     T3 = Mu * betaWL ;
4910     Ids0_dVbs = T3 * Idd_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ;
4911     Ids0_dVds = T3 * Idd_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ;
4912     Ids0_dVgs = T3 * Idd_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ;
4913 
4914     /*-----------------------------------------------------------*
4915      * Adding parasitic components to the channel current.
4916      *-----------------*/
4917     if( model->HSM2_ptl != 0 ){
4918       T1 =  0.5 * ( Vds - Pds ) ;
4919       Fn_SymAdd( T6 , T1 , 0.01 , T2 ) ;
4920       T2 *= 0.5 ;
4921       T6_dVb = T2 * ( - Pds_dVbs ) ;
4922       T6_dVd = T2 * ( 1.0 - Pds_dVds ) ;
4923       T6_dVg = T2 * ( - Pds_dVgs ) ;
4924 
4925       T1     = 1.1 - ( Ps0 + T6 );
4926       T1_dVb =     - ( Ps0_dVbs + T6_dVb );
4927       T1_dVd =     - ( Ps0_dVds + T6_dVd );
4928       T1_dVg =     - ( Ps0_dVgs + T6_dVg );
4929 
4930       Fn_SZ( T2 , T1 , 0.05 , T0 ) ;
4931       T2 += small ;
4932       T2_dVb = T1_dVb * T0 ;
4933       T2_dVd = T1_dVd * T0 ;
4934       T2_dVg = T1_dVg * T0 ;
4935 
4936       T0 = beta * here->HSM2_ptl0 ;
4937       T3 = Cox * T0 ;
4938       T3_dVb = Cox_dVb * T0 ;
4939       T3_dVd = Cox_dVd * T0 ;
4940       T3_dVg = Cox_dVg * T0 ;
4941       T0 = pow( T2 , model->HSM2_ptp ) ;
4942       T9     = T3 * T0 ;
4943       T9_dVb = T3 * model->HSM2_ptp * T0 / T2 * T2_dVb + T3_dVb * T0 ;
4944       T9_dVd = T3 * model->HSM2_ptp * T0 / T2 * T2_dVd + T3_dVd * T0 ;
4945       T9_dVg = T3 * model->HSM2_ptp * T0 / T2 * T2_dVg + T3_dVg * T0 ;
4946 
4947 
4948       T4 = 1.0 + Vdsz * model->HSM2_pt2 ;
4949       T4_dVb = 0.0 ;
4950       T4_dVd = Vdsz_dVds * model->HSM2_pt2 ;
4951       T4_dVg = 0.0 ;
4952 
4953       T0 = here->HSM2_pt40 ;
4954       T5 = Ps0 + T6 - Vbsz ;
4955       T5_dVb = Ps0_dVbs + T6_dVb - Vbsz_dVbs ;
4956       T5_dVd = Ps0_dVds + T6_dVd - Vbsz_dVds ;
4957       T5_dVg = Ps0_dVgs + T6_dVg ;
4958       T4 += Vdsz * T0 * T5 ;
4959       T4_dVb += Vdsz * T0 * T5_dVb ;
4960       T4_dVd += Vdsz * T0 * T5_dVd + Vdsz_dVds * T0 * T5 ;
4961       T4_dVg += Vdsz * T0 * T5_dVg ;
4962 
4963       T6     = T9     * T4 ;
4964       T9_dVb = T9_dVb * T4 + T9 * T4_dVb ;
4965       T9_dVd = T9_dVd * T4 + T9 * T4_dVd ;
4966       T9_dVg = T9_dVg * T4 + T9 * T4_dVg ;
4967       T9     = T6 ;
4968 
4969     }else{
4970       T9 = 0.0 ;
4971       T9_dVb = 0.0 ;
4972       T9_dVd = 0.0 ;
4973       T9_dVg = 0.0 ;
4974     }
4975 
4976 
4977     if( model->HSM2_gdl != 0 ){
4978       T1 = beta * here->HSM2_gdl0 ;
4979       T2 = Cox * T1 ;
4980       T2_dVb = Cox_dVb * T1 ;
4981       T2_dVd = Cox_dVd * T1 ;
4982       T2_dVg = Cox_dVg * T1 ;
4983       T8     = T2 * Vdsz ;
4984       T8_dVb = T2_dVb * Vdsz ;
4985       T8_dVd = T2_dVd * Vdsz + T2 * Vdsz_dVds ;
4986       T8_dVg = T2_dVg * Vdsz ;
4987     }else{
4988       T8 = 0.0 ;
4989       T8_dVb = 0.0 ;
4990       T8_dVd = 0.0 ;
4991       T8_dVg = 0.0 ;
4992     }
4993 
4994 
4995     if ( ( T9 + T8 ) > 0.0 ) {
4996       Idd1 = Pds * ( T9 + T8 ) ;
4997       Idd1_dVbs = Pds_dVbs * ( T9 + T8 ) + Pds * ( T9_dVb + T8_dVb ) ;
4998       Idd1_dVds = Pds_dVds * ( T9 + T8 ) + Pds * ( T9_dVd + T8_dVd ) ;
4999       Idd1_dVgs = Pds_dVgs * ( T9 + T8 ) + Pds * ( T9_dVg + T8_dVg ) ;
5000 
5001       Ids0 += betaWL * Idd1 * Mu ;
5002       T1 = betaWL * Idd1 ;
5003       T2 = Idd1 * Mu ;
5004       T3 = Mu * betaWL ;
5005       Ids0_dVbs += T3 * Idd1_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ;
5006       Ids0_dVds += T3 * Idd1_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ;
5007       Ids0_dVgs += T3 * Idd1_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ;
5008     }
5009 
5010 
5011     /* (note: rpock procedure was removed. (2006.04.20) */
5012     if ( flg_rsrd == 2 ) {
5013       Rd  = here->HSM2_rd ;
5014       T0 = Rd * Ids0 ;
5015       T1 = Vds + small ;
5016       T2 = 1.0 / T1 ;
5017       T3 = 1.0 + T0 * T2 ;
5018       T3_dVb =   Rd * Ids0_dVbs             * T2 ;
5019       T3_dVd = ( Rd * Ids0_dVds * T1 - T0 ) * T2 * T2 ;
5020       T3_dVg =   Rd * Ids0_dVgs             * T2 ;
5021       T4 = 1.0 / T3 ;
5022       Ids = Ids0 * T4 ;
5023       T5 = T4 * T4 ;
5024       Ids_dVbs = ( Ids0_dVbs * T3 - Ids0 * T3_dVb ) * T5 ;
5025       Ids_dVds = ( Ids0_dVds * T3 - Ids0 * T3_dVd ) * T5 ;
5026       Ids_dVgs = ( Ids0_dVgs * T3 - Ids0 * T3_dVg ) * T5 ;
5027     } else {
5028       Ids = Ids0 ;
5029       Ids_dVbs = Ids0_dVbs ;
5030       Ids_dVds = Ids0_dVds ;
5031       Ids_dVgs = Ids0_dVgs ;
5032     }
5033 
5034     if ( Pds < ps_conv ) {
5035       Ids_dVbs = 0.0 ;
5036       Ids_dVgs = 0.0 ;
5037     }
5038 
5039     Ids += Gdsmin * Vds ;
5040     Ids_dVds += Gdsmin ;
5041 
5042 
5043     /*-----------------------------------------------------------*
5044      * STI
5045      *-----------------*/
5046     if ( model->HSM2_coisti != 0 ) {
5047       /*---------------------------------------------------*
5048        * dVthSCSTI : Short-channel effect induced by Vds (STI).
5049        *-----------------*/
5050       T1 = C_ESI * Cox_inv ;
5051       T2 = here->HSM2_wdpl ;
5052       T3 =  here->HSM2_lgatesm - model->HSM2_parl2 ;
5053       T4 = 1.0 / (T3 * T3) ;
5054       T5 = 2.0 * (model->HSM2_vbi - Pb20b) * T1 * T2 * T4 ;
5055 
5056       dVth0 = T5 * sqrt_Pbsum ;
5057       T6 = T5 * 0.5 / sqrt_Pbsum ;
5058       T7 = 2.0 * (model->HSM2_vbi - Pb20b) * C_ESI * T2 * T4 * sqrt_Pbsum ;
5059       T8 = - 2.0 * T1 * T2 * T4 * sqrt_Pbsum ;
5060       dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
5061       dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
5062       dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
5063 
5064       T4 = pParam->HSM2_scsti1 ;
5065       T6 = pParam->HSM2_scsti2 ;
5066       T1  = T4 + T6 * Vdsz ;
5067       dVthSCSTI = dVth0 * T1 ;
5068       dVthSCSTI_dVb = dVth0_dVb * T1 ;
5069       dVthSCSTI_dVd = dVth0_dVd * T1 + dVth0 * T6 * Vdsz_dVds ;
5070       dVthSCSTI_dVg = dVth0_dVg * T1 ;
5071 
5072       T1 = pParam->HSM2_vthsti - model->HSM2_vdsti * Vds ;
5073       T1_dVd = - model->HSM2_vdsti ;
5074 
5075       Vgssti = Vgsz - Vfb + T1 + dVthSCSTI ;
5076       Vgssti_dVbs = dVthSCSTI_dVb ;
5077       Vgssti_dVds = Vgsz_dVds + T1_dVd + dVthSCSTI_dVd ;
5078       Vgssti_dVgs = Vgsz_dVgs + dVthSCSTI_dVg ;
5079 
5080       costi0 = here->HSM2_costi0 ;
5081       costi1 = here->HSM2_costi1 ;
5082 
5083       costi3 = here->HSM2_costi0_p2 * Cox_inv * Cox_inv ;
5084       T1 = 2.0 * here->HSM2_costi0_p2 * Cox_inv ;
5085       costi3_dVb = T1 * Cox_inv_dVb ;
5086       costi3_dVd = T1 * Cox_inv_dVd ;
5087       costi3_dVg = T1 * Cox_inv_dVg ;
5088       T2 = 1.0 / costi3 ;
5089       costi3_dVb_c3 = costi3_dVb * T2 ;
5090       costi3_dVd_c3 = costi3_dVd * T2 ;
5091       costi3_dVg_c3 = costi3_dVg * T2 ;
5092 
5093       costi4 = costi3 * beta * 0.5 ;
5094       costi5 = costi4 * beta * 2.0 ;
5095 
5096       T11 = beta * 0.25 ;
5097       T10 = beta_inv - costi3 * T11 + Vfb - pParam->HSM2_vthsti - dVthSCSTI + small ;
5098       T10_dVb = - T11 * costi3_dVb - dVthSCSTI_dVb ;
5099       T10_dVd = - T11 * costi3_dVd - dVthSCSTI_dVd ;
5100       T10_dVg = - T11 * costi3_dVg - dVthSCSTI_dVg ;
5101       T1 = Vgsz - T10 - psisti_dlt ;
5102       T1_dVb = - T10_dVb ;
5103       T1_dVd = Vgsz_dVds - T10_dVd ;
5104       T1_dVg = Vgsz_dVgs - T10_dVg ;
5105       T0 = Fn_Sgn(T10) ;
5106       T2 = sqrt (T1 * T1 + T0 * 4.0 * T10 * psisti_dlt) ;
5107       T3 = T10 + 0.5 * (T1 + T2) - Vfb + pParam->HSM2_vthsti + dVthSCSTI - Vbsz ;
5108       T3_dVb = T10_dVb + 0.5 * (T1_dVb + (T1 * T1_dVb + T0 * 2.0 * T10_dVb * psisti_dlt) / T2)
5109         + dVthSCSTI_dVb - Vbsz_dVbs ;
5110       T3_dVd = T10_dVd + 0.5 * (T1_dVd + (T1 * T1_dVd + T0 * 2.0 * T10_dVd * psisti_dlt) / T2)
5111         + dVthSCSTI_dVd - Vbsz_dVds ;
5112       T3_dVg = T10_dVg + 0.5 * (T1_dVg + (T1 * T1_dVg + T0 * 2.0 * T10_dVg * psisti_dlt) / T2)
5113         + dVthSCSTI_dVg ;
5114       T4 = beta * T3 - 1.0 ;
5115       T5 = 4.0 / costi5 ;
5116       T1 = 1.0 + T4 * T5 ;
5117       T6 = beta * T5 ;
5118       T7 = T4 * T5 ;
5119       T1_dVb = (T6 * T3_dVb - T7 * costi3_dVb_c3) ;
5120       T1_dVd = (T6 * T3_dVd - T7 * costi3_dVd_c3) ;
5121       T1_dVg = (T6 * T3_dVg - T7 * costi3_dVg_c3) ;
5122       Fn_SZ( T1 , T1, 1.0e-2, T2) ;
5123       T1 += small ;
5124       T1_dVb *= T2 ;
5125       T1_dVd *= T2 ;
5126       T1_dVg *= T2 ;
5127       costi6 = sqrt (T1) ;
5128       T0 = costi4 * (1.0 - costi6) ;
5129       Psasti = Vgssti + T0 ;
5130       T2 = 0.5 * costi4 / costi6 ;
5131       Psasti_dVbs = Vgssti_dVbs + costi3_dVb_c3 * T0 - T2 * T1_dVb ;
5132       Psasti_dVds = Vgssti_dVds + costi3_dVd_c3 * T0 - T2 * T1_dVd ;
5133       Psasti_dVgs = Vgssti_dVgs + costi3_dVg_c3 * T0 - T2 * T1_dVg ;
5134 
5135       T0 = 1.0 / (beta + 2.0 / (Vgssti + small)) ;
5136       Psbsti = log (1.0 / costi1 / costi3 * (Vgssti * Vgssti)) * T0 ;
5137       T2 = 2.0 * T0 / (Vgssti + small) ;
5138       T3 = Psbsti / (Vgssti + small) ;
5139       Psbsti_dVbs = T2 * (Vgssti_dVbs - 0.5 * costi3_dVb_c3 * Vgssti
5140                                 + T3 * Vgssti_dVbs ) ;
5141       Psbsti_dVds = T2 * (Vgssti_dVds - 0.5 * costi3_dVd_c3 * Vgssti
5142                                 + T3 * Vgssti_dVds ) ;
5143       Psbsti_dVgs = T2 * (Vgssti_dVgs - 0.5 * costi3_dVg_c3 * Vgssti
5144                                 + T3 * Vgssti_dVgs ) ;
5145 
5146       Psab = Psbsti - Psasti - sti2_dlt ;
5147       Psab_dVbs = Psbsti_dVbs - Psasti_dVbs ;
5148       Psab_dVds = Psbsti_dVds - Psasti_dVds ;
5149       Psab_dVgs = Psbsti_dVgs - Psasti_dVgs ;
5150       T0 = sqrt (Psab * Psab + 4.0 * sti2_dlt * Psbsti) ;
5151       Psti = Psbsti - 0.5 * (Psab + T0) ;
5152       T1 = 1.0 / T0 ;
5153       Psti_dVbs = Psbsti_dVbs
5154         - 0.5 * ( Psab_dVbs
5155                 + ( Psab * Psab_dVbs + 2.0 * sti2_dlt * Psbsti_dVbs ) * T1 ) ;
5156       Psti_dVds = Psbsti_dVds
5157         - 0.5 * ( Psab_dVds
5158                 + ( Psab * Psab_dVds + 2.0 * sti2_dlt * Psbsti_dVds ) * T1 ) ;
5159       Psti_dVgs = Psbsti_dVgs
5160         - 0.5 * ( Psab_dVgs
5161                 + ( Psab * Psab_dVgs + 2.0 * sti2_dlt * Psbsti_dVgs ) * T1 ) ;
5162 
5163       T0 = costi1 * exp (beta * Psti) ;
5164       T1 = beta * (Psti - Vbsz) - 1.0 + T0 ;
5165       T1_dVb = beta * ((Psti_dVbs - Vbsz_dVbs) + T0 * Psti_dVbs) ;
5166       T1_dVd = beta * ((Psti_dVds - Vbsz_dVds) + T0 * Psti_dVds) ;
5167       T1_dVg = beta * (Psti_dVgs + T0 * Psti_dVgs) ;
5168       Fn_SZ ( T1 , T1, 1.0e-2, T0) ;
5169           T1 += epsm10 ;
5170       T1_dVb *= T0 ;
5171       T1_dVd *= T0 ;
5172       T1_dVg *= T0 ;
5173       sq1sti = sqrt (T1);
5174       T2 = 0.5 / sq1sti ;
5175       sq1sti_dVbs = T2 * T1_dVb ;
5176       sq1sti_dVds = T2 * T1_dVd ;
5177       sq1sti_dVgs = T2 * T1_dVg ;
5178 
5179       T1 = beta * (Psti - Vbsz) - 1.0;
5180       T1_dVb = beta * (Psti_dVbs - Vbsz_dVbs) ;
5181       T1_dVd = beta * (Psti_dVds - Vbsz_dVds) ;
5182       T1_dVg = beta * Psti_dVgs ;
5183       Fn_SZ( T1 , T1, 1.0e-2, T0) ;
5184           T1 += epsm10 ;
5185       T1_dVb *= T0 ;
5186       T1_dVd *= T0 ;
5187       T1_dVg *= T0 ;
5188       sq2sti = sqrt (T1);
5189       T2 = 0.5 / sq2sti ;
5190       sq2sti_dVbs = T2 * T1_dVb ;
5191       sq2sti_dVds = T2 * T1_dVd ;
5192       sq2sti_dVgs = T2 * T1_dVg ;
5193 
5194       Qn0sti = costi0 * (sq1sti - sq2sti) ;
5195       Qn0sti_dVbs = costi0 * (sq1sti_dVbs - sq2sti_dVbs) ;
5196       Qn0sti_dVds = costi0 * (sq1sti_dVds - sq2sti_dVds) ;
5197       Qn0sti_dVgs = costi0 * (sq1sti_dVgs - sq2sti_dVgs) ;
5198 
5199       /* T1: Vdsatsti */
5200       T1 = Psasti - Psti ;
5201       T1_dVb = Psasti_dVbs - Psti_dVbs ;
5202       T1_dVd = Psasti_dVds - Psti_dVds ;
5203       T1_dVg = Psasti_dVgs - Psti_dVgs ;
5204 
5205       Fn_SZ( T1 , T1 , 1.0e-1 , T2 ) ;
5206       T1 += epsm10 ;
5207       T1_dVb *= T2 ;
5208       T1_dVd *= T2 ;
5209       T1_dVg *= T2 ;
5210 
5211 
5212       TX = Vds / T1 ;
5213       T2 = 1.0 / ( T1 * T1 ) ;
5214       TX_dVbs = T2 * ( - Vds * T1_dVb ) ;
5215       TX_dVds = T2 * ( T1 - Vds * T1_dVd ) ;
5216       TX_dVgs = T2 * ( - Vds * T1_dVg ) ;
5217 
5218       Fn_CP( TY , TX , 1.0 , 4 , T2 ) ;
5219       TY_dVbs = T2 * TX_dVbs ;
5220       TY_dVds = T2 * TX_dVds ;
5221       TY_dVgs = T2 * TX_dVgs ;
5222 
5223       costi7 = 2.0 * here->HSM2_wsti * here->HSM2_nf * beta_inv ;
5224       T1 = Lch ;
5225       Idssti = costi7 * Mu * Qn0sti * TY / T1;
5226       T3 = 1.0 / T1 ;
5227       T4 = Mu * Qn0sti * TY / T1 / T1 ;
5228       T5 = Mu * Qn0sti ;
5229       Idssti_dVbs = costi7 * (((Mu_dVbs * Qn0sti + Mu * Qn0sti_dVbs) * TY
5230                                +  T5 * TY_dVbs ) * T3
5231                               - Lch_dVbs * T4 ) ;
5232       Idssti_dVds = costi7 * (((Mu_dVds * Qn0sti + Mu * Qn0sti_dVds) * TY
5233                                +  T5 * TY_dVds ) * T3
5234                               - Lch_dVds * T4 ) ;
5235       Idssti_dVgs = costi7 * (((Mu_dVgs * Qn0sti + Mu * Qn0sti_dVgs) * TY
5236                                +  T5 * TY_dVgs ) * T3
5237                               - Lch_dVgs * T4 ) ;
5238 
5239       Ids = Ids + Idssti ;
5240       Ids_dVbs = Ids_dVbs + Idssti_dVbs ;
5241       Ids_dVds = Ids_dVds + Idssti_dVds ;
5242       Ids_dVgs = Ids_dVgs + Idssti_dVgs ;
5243 
5244     }
5245 
5246     /*-----------------------------------------------------------*
5247      * Break point for the case of Rs=Rd=0.
5248      *-----------------*/
5249     if ( flg_rsrd == 0 ) {
5250       DJI = 1.0 ;
5251       break ;
5252     }
5253 
5254     /*-----------------------------------------------------------*
5255      * calculate corrections of biases.
5256      * - Fbs = 0, etc. are the small ciucuit equations.
5257      * - DJ, Jacobian of the small circuit matrix, is g.t. 1
5258      *   provided Rs, Rd and conductances are positive.
5259      *-----------------*/
5260     Fbs = Vbs - Vbsc + Ids * Rs ;
5261     Fds = Vds - Vdsc + Ids * ( Rs + Rd ) ;
5262     Fgs = Vgs - Vgsc + Ids * Rs ;
5263 
5264     DJ = 1.0 + Rs * Ids_dVbs + ( Rs + Rd ) * Ids_dVds + Rs * Ids_dVgs ;
5265     DJI = 1.0 / DJ ;
5266 
5267     JI11 = 1 + ( Rs + Rd ) * Ids_dVds + Rs * Ids_dVgs ;
5268     JI12 = - Rs * Ids_dVds ;
5269     JI13 = - Rs * Ids_dVgs ;
5270     JI21 = - ( Rs + Rd ) * Ids_dVbs ;
5271     JI22 = 1 + Rs * Ids_dVbs + Rs * Ids_dVgs ;
5272     JI23 = - ( Rs + Rd ) * Ids_dVgs ;
5273     JI31 = - Rs * Ids_dVbs ;
5274     JI32 = - Rs * Ids_dVds ;
5275     JI33 = 1 + Rs * Ids_dVbs + ( Rs + Rd ) * Ids_dVds ;
5276 
5277     dVbs = - DJI * ( JI11 * Fbs + JI12 * Fds + JI13 * Fgs ) ;
5278     dVds = - DJI * ( JI21 * Fbs + JI22 * Fds + JI23 * Fgs ) ;
5279     dVgs = - DJI * ( JI31 * Fbs + JI32 * Fds + JI33 * Fgs ) ;
5280 
5281     dV_sum = fabs( dVbs ) + fabs( dVds ) + fabs( dVgs ) ;
5282 
5283 
5284     /*-----------------------------------------------------------*
5285      * Break point for converged case.
5286      * - Exit from the bias loop.
5287      * - NOTE: Update of internal biases is avoided.
5288      *-----------------*/
5289     if ( Ids_last * Ids_tol >= fabs( Ids_last - Ids ) || mini_current >= fabs( Ids_last - Ids )
5290             || dV_sum < ps_conv ) break ;
5291 
5292     /*-----------------------------------------------------------*
5293      * Update the internal biases.
5294      *-----------------*/
5295     Vbs  = Vbs + dVbs ;
5296     Vds  = Vds + dVds ;
5297     Vgs  = Vgs + dVgs ;
5298     if ( Vds < 0.0 ) {
5299       Vds  = 0.0 ;
5300       dVds = 0.0 ;
5301     }
5302 
5303     /*-----------------------------------------------------------*
5304      * Bottom of bias loop. (label)
5305      *-----------------*/
5306 /*  bottom_of_bias_loop :*/
5307 
5308     /*-----------------------------------------------------------*
5309      * Make initial guess flag of potential ON.
5310      * - This effects for the 2nd and later iterations of bias loop.
5311      *-----------------*/
5312     flg_pprv = 1 ;
5313 
5314     } /* skip to end_of_part_1 */
5315 
5316   } /*++ End of the bias loop +++++++++++++++++++++++++++++*/
5317   if ( end_of_part_1 == 0 ) {
5318 
5319   if ( lp_bs > lp_bs_max ) { lp_bs -- ; }
5320 
5321 
5322 
5323   /*----------------------------------------------------------*
5324    * induced gate noise. ( Part 1/3 )
5325    *----------------------*/
5326   if ( model->HSM2_coign != 0 && model->HSM2_cothrml != 0 ) {
5327       kusai00 = VgVt * VgVt ;
5328       kusaidd = 2.0e0 * beta_inv * Cox_inv * Idd ;
5329       kusaiL = kusai00 - kusaidd ;
5330       Fn_SZ( kusai00 , kusai00 , 1.0e-3 , T0 ) ;
5331       Fn_SZ( kusaiL , kusaiL , 1.0e-3 , T0 ) ;
5332       kusai00L = kusai00 - kusaiL ;
5333       if ( Qn0 < epsm10 || kusai00L < epsm10 ) flg_ign = 0 ;
5334       else flg_ign = 1 ;
5335   }
5336 
5337 
5338   /*-----------------------------------------------------------*
5339    * End of PART-1. (label)
5340    *-----------------*/
5341    } /* skip end_of_part_1 */
5342 /* end_of_part_1: */
5343  end_of_part_1 = 0;
5344 
5345   // Qiu for noise calcs
5346   Qiu_noi = Qiu ;
5347 
5348   }  // end of Normal mode MOSFET
5349 
5350 
5351   /*----------------------------------------------------------*
5352    * Evaluate integrated chages in unit [C].
5353    *----------------------*/
5354 
5355   T1 = - here->HSM2_weff_nf * Leff ;
5356 
5357   Qb = T1 * Qbu ;
5358   Qb_dVbs = T1 * Qbu_dVbs ;
5359   Qb_dVds = T1 * Qbu_dVds ;
5360   Qb_dVgs = T1 * Qbu_dVgs ;
5361 
5362   Qi = T1 * Qiu ;
5363   Qi_dVbs = T1 * Qiu_dVbs ;
5364   Qi_dVds = T1 * Qiu_dVds ;
5365   Qi_dVgs = T1 * Qiu_dVgs ;
5366 
5367   Qi_noi = T1 * Qiu_noi ; // for noise calc.
5368 
5369   Qd = Qi * Qdrat ;
5370   Qd_dVbs = Qi_dVbs * Qdrat + Qi * Qdrat_dVbs ;
5371   Qd_dVds = Qi_dVds * Qdrat + Qi * Qdrat_dVds ;
5372   Qd_dVgs = Qi_dVgs * Qdrat + Qi * Qdrat_dVgs ;
5373 
5374 
5375   /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5376    * PART-2: Substrate / gate / leak currents
5377    *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
5378 
5379     /*-----------------------------------------------------------*
5380      * Modified potential for symmetry.
5381      *-----------------*/
5382     T1 =  ( Vds - Pds ) / 2 ;
5383     Fn_SymAdd( Pzadd , T1 , model->HSM2_pzadd0 , T2 ) ;
5384     T2 /= 2 ;
5385     Pzadd_dVbs = T2 * ( - Pds_dVbs ) ;
5386     Pzadd_dVds = T2 * ( 1.0 - Pds_dVds ) ;
5387     Pzadd_dVgs = T2 * ( - Pds_dVgs ) ;
5388 
5389     if ( Pzadd < epsm10 ) {
5390       Pzadd = epsm10 ;
5391       Pzadd_dVbs = 0.0 ;
5392       Pzadd_dVds = 0.0 ;
5393       Pzadd_dVgs = 0.0 ;
5394     }
5395 
5396     Ps0z = Ps0 + Pzadd ;
5397     Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ;
5398     Ps0z_dVds = Ps0_dVds + Pzadd_dVds ;
5399     Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ;
5400   /*-----------------------------------------------------------*
5401    * Isub : substrate current induced by impact ionization.
5402    *-----------------*/
5403 
5404   if ( flg_noqi == 1 || model->HSM2_coisub == 0 ) {
5405    /* Accumulation zone or nonconductive case, in which Ids==0. */
5406     Isub = 0.0e0 ;
5407     Isub_dVbs = Isub_dVds = Isub_dVgs = 0.0e0 ;
5408   } else {
5409    /*-------------------------------------------*
5410     * Conductive case.
5411     *-----------------*/
5412     if ( pParam->HSM2_sub1 > 0.0e0 && pParam->HSM2_vmax > 0.0e0 ) {
5413       T0 = here->HSM2_vg2const ;
5414       T1 = T0 * Vgp ;
5415       T1_dVd = T0 * Vgp_dVds ;
5416       T1_dVg = T0 * Vgp_dVgs ;
5417       T1_dVb = T0 * Vgp_dVbs ;
5418 
5419       T7 = Cox0 * Cox0 ;
5420       T8 = here->HSM2_qnsub_esi ;
5421       T3 = T8 / T7 ;
5422 
5423       T9 = 2.0 / T8 ;
5424       T4 = T9 * T7 ;         /* bugfix in version 2.80 */
5425 
5426       T2 = here->HSM2_xvbs ;
5427       T5 = T1 - beta_inv - T2 * Vbsz ;
5428       T5_dVd = T1_dVd - T2 * Vbsz_dVds;
5429       T5_dVg = T1_dVg ;
5430       T5_dVb = T1_dVb - T2 * Vbsz_dVbs;
5431 
5432       T6 = 1.0 + T4 * T5 ;   /* bugfix in version 2.80 */
5433       T6_dVd = T4 * T5_dVd ;
5434       T6_dVg = T4 * T5_dVg ;
5435       T6_dVb = T4 * T5_dVb ;
5436       Fn_SZ( T6 , T6, 1.0e-3, T9) ;
5437       T6 += small ;
5438       T6_dVd *= T9 ;
5439       T6_dVg *= T9 ;
5440       T6_dVb *= T9 ;
5441       T6 = sqrt( T6 ) ;
5442       T9 = 0.5 / T6 ;
5443       T6_dVd = T9 * T6_dVd ;
5444       T6_dVg = T9 * T6_dVg ;
5445       T6_dVb = T9 * T6_dVb ;
5446 
5447       Psislsat = T1 + T3 * ( 1.0 - T6 ) ;
5448       Psislsat_dVd = T1_dVd - T3 * T6_dVd ;
5449       Psislsat_dVg = T1_dVg - T3 * T6_dVg ;
5450       Psislsat_dVb = T1_dVb - T3 * T6_dVb ;
5451 
5452       T2 = here->HSM2_lgate / (here->HSM2_xgate + here->HSM2_lgate) ;
5453 
5454       Psisubsat = pParam->HSM2_svds * Vdsz + Ps0z - T2 * Psislsat ;
5455       Psisubsat_dVd = pParam->HSM2_svds * Vdsz_dVds + Ps0z_dVds - T2 * Psislsat_dVd ;
5456       Psisubsat_dVg = Ps0z_dVgs - T2 * Psislsat_dVg ;
5457       Psisubsat_dVb = Ps0z_dVbs - T2 * Psislsat_dVb ;
5458       Fn_SZ( Psisubsat , Psisubsat, 1.0e-3, T9 ) ;
5459       Psisubsat += small ;
5460       Psisubsat_dVd *= T9 ;
5461       Psisubsat_dVg *= T9 ;
5462       Psisubsat_dVb *= T9 ;
5463 
5464       T5 = here->HSM2_xsub1 ;
5465       T6 = here->HSM2_xsub2 ;
5466       T2 = exp( - T6 / Psisubsat ) ;
5467       T3 = T2 * T6 / ( Psisubsat * Psisubsat ) ;
5468       T2_dVd = T3 * Psisubsat_dVd ;
5469       T2_dVg = T3 * Psisubsat_dVg ;
5470       T2_dVb = T3 * Psisubsat_dVb ;
5471 
5472       Isub = T5 * Psisubsat * Ids * T2 ;
5473       Isub_dVds =  T5 * ( Psisubsat_dVd * Ids * T2
5474                         + Psisubsat * Ids_dVds * T2
5475                         + Psisubsat * Ids * T2_dVd ) ;
5476       Isub_dVgs =  T5 * ( Psisubsat_dVg * Ids * T2
5477                         + Psisubsat * Ids_dVgs * T2
5478                         + Psisubsat * Ids * T2_dVg ) ;
5479       Isub_dVbs =  T5 * ( Psisubsat_dVb * Ids * T2
5480                         + Psisubsat * Ids_dVbs * T2
5481                         + Psisubsat * Ids * T2_dVb ) ;
5482     } else {
5483       Isub = 0.0e0 ;
5484       Isub_dVbs = Isub_dVds = Isub_dVgs = 0.0e0 ;
5485     } /* end of if ( pParam->HSM2_sub1 ... ) else block. */
5486   }
5487 
5488 
5489     /*---------------------------------------------------*
5490      * Impact-Ionization Induced Bulk Potential Change (IBPC)
5491      *-----------------*/
5492   if ( flg_noqi == 0 && Isub > 0e0 && pParam->HSM2_ibpc1 != 0e0 ) {
5493 
5494     /* delta Vbs */
5495     T0 = 1e0 + pParam->HSM2_ibpc2 * dVth ;
5496     dVbsIBPC = pParam->HSM2_ibpc1 * T0 * Isub ;
5497     dVbsIBPC_dVbs = pParam->HSM2_ibpc1 * ( pParam->HSM2_ibpc2 * dVth_dVb * Isub + T0 * Isub_dVbs ) ;
5498     dVbsIBPC_dVds = pParam->HSM2_ibpc1 * ( pParam->HSM2_ibpc2 * dVth_dVd * Isub + T0 * Isub_dVds ) ;
5499     dVbsIBPC_dVgs = pParam->HSM2_ibpc1 * ( pParam->HSM2_ibpc2 * dVth_dVg * Isub + T0 * Isub_dVgs ) ;
5500 
5501     /* dG3 & dG4 */
5502     T10 = 1e0 / Xi0 ;
5503     T1 = beta * dVbsIBPC * T10 ;
5504     T10 *= T10 ;
5505     T1_dVb = beta * ( dVbsIBPC_dVbs * Xi0 - dVbsIBPC * Xi0_dVbs ) * T10 ;
5506     T1_dVd = beta * ( dVbsIBPC_dVds * Xi0 - dVbsIBPC * Xi0_dVds ) * T10 ;
5507     T1_dVg = beta * ( dVbsIBPC_dVgs * Xi0 - dVbsIBPC * Xi0_dVgs ) * T10 ;
5508 
5509     T10 = 1e0 / Xil ;
5510     T2 = beta * dVbsIBPC * T10 ;
5511     T10 *= T10 ;
5512     T2_dVb = beta * ( dVbsIBPC_dVbs * Xil - dVbsIBPC * Xil_dVbs ) * T10 ;
5513     T2_dVd = beta * ( dVbsIBPC_dVds * Xil - dVbsIBPC * Xil_dVds ) * T10 ;
5514     T2_dVg = beta * ( dVbsIBPC_dVgs * Xil - dVbsIBPC * Xil_dVgs ) * T10 ;
5515 
5516     dG3 = cnst0 * ( Xilp32 * T2 - Xi0p32 * T1 ) ;
5517     dG3_dVbs = cnst0 * ( Xilp32_dVbs * T2 + Xilp32 * T2_dVb - Xi0p32_dVbs * T1 - Xi0p32 * T1_dVb ) ;
5518     dG3_dVds = cnst0 * ( Xilp32_dVds * T2 + Xilp32 * T2_dVd - Xi0p32_dVds * T1 - Xi0p32 * T1_dVd ) ;
5519     dG3_dVgs = cnst0 * ( Xilp32_dVgs * T2 + Xilp32 * T2_dVg - Xi0p32_dVgs * T1 - Xi0p32 * T1_dVg ) ;
5520     dG4 = cnst0 * 0.5 * ( - Xilp12 * T2 + Xi0p12 * T1 ) ;
5521     dG4_dVbs = cnst0 * 0.5 * ( - Xilp12_dVbs * T2 - Xilp12 * T2_dVb + Xi0p12_dVbs * T1 + Xi0p12 * T1_dVb ) ;
5522     dG4_dVds = cnst0 * 0.5 * ( - Xilp12_dVds * T2 - Xilp12 * T2_dVd + Xi0p12_dVds * T1 + Xi0p12 * T1_dVd ) ;
5523     dG4_dVgs = cnst0 * 0.5 * ( - Xilp12_dVgs * T2 - Xilp12 * T2_dVg + Xi0p12_dVgs * T1 + Xi0p12 * T1_dVg ) ;
5524 
5525     /* Add IBPC current into Ids */
5526     dIdd = dG3 + dG4 ;
5527     dIdd_dVbs = dG3_dVbs + dG4_dVbs ;
5528     dIdd_dVds = dG3_dVds + dG4_dVds ;
5529     dIdd_dVgs = dG3_dVgs + dG4_dVgs ;
5530     IdsIBPC = betaWL * dIdd * Mu ;
5531     IdsIBPC_dVbs = betaWL * ( Mu * dIdd_dVbs + dIdd * Mu_dVbs ) + betaWL_dVbs * Mu * dIdd ;
5532     IdsIBPC_dVds = betaWL * ( Mu * dIdd_dVds + dIdd * Mu_dVds ) + betaWL_dVds * Mu * dIdd ;
5533     IdsIBPC_dVgs = betaWL * ( Mu * dIdd_dVgs + dIdd * Mu_dVgs ) + betaWL_dVgs * Mu * dIdd ;
5534 
5535   } /* End if (IBPC) */
5536 
5537   /*-----------------------------------------------------------*
5538    * Igate : Gate current induced by tunneling.
5539    *-----------------*/
5540   if ( model->HSM2_coiigs == 0 ) {
5541     Igate = 0.0 ;
5542     Igate_dVbs = Igate_dVds = Igate_dVgs = 0.0 ;
5543     Igs = 0.0 ;
5544     Igs_dVbs = Igs_dVds = Igs_dVgs = 0.0 ;
5545     Igd = 0.0 ;
5546     Igd_dVbs = Igd_dVds = Igd_dVgs = 0.0 ;
5547     Igb = 0.0 ;
5548     Igb_dVbs = Igb_dVds = Igb_dVgs = 0.0 ;
5549     GLPART1 = 0.0 ;
5550     GLPART1_dVgs = GLPART1_dVds = GLPART1_dVbs = 0.0 ;
5551   } else {
5552 
5553 
5554     /* Igate */
5555     if ( flg_noqi == 0 ) {
5556       Psdlz = Ps0z + Vdsz - epsm10 ;
5557       Psdlz_dVbs = Ps0z_dVbs ;
5558       Psdlz_dVds = Ps0z_dVds + Vdsz_dVds ;
5559       Psdlz_dVgs = Ps0z_dVgs ;
5560 
5561       T1 = Vgsz - Vfb + modelMKS->HSM2_gleak4 * (dVth - dPpg) * Leff - Psdlz * pParam->HSM2_gleak3 ;
5562       T1_dVg = Vgsz_dVgs + modelMKS->HSM2_gleak4 * (dVth_dVg - dPpg_dVg) * Leff - Psdlz_dVgs * pParam->HSM2_gleak3 ;
5563       T1_dVd = Vgsz_dVds + modelMKS->HSM2_gleak4 * (dVth_dVd - dPpg_dVd) * Leff - Psdlz_dVds * pParam->HSM2_gleak3 ;
5564       T1_dVb = modelMKS->HSM2_gleak4 * ( dVth_dVb - dPpg_dVb ) * Leff - Psdlz_dVbs * pParam->HSM2_gleak3 ;
5565 
5566       T3 = 1.0 / Tox0 ;
5567       T2 = T1 * T3 ;
5568       T2_dVg = (T1_dVg ) * T3 ;
5569       T2_dVd = (T1_dVd ) * T3 ;
5570       T2_dVb = (T1_dVb ) * T3 ;
5571 
5572       T3 = 1.0 / modelMKS->HSM2_gleak5 ;
5573 
5574       if ( VgVt <= VgVt_small ) {
5575         Ey = 0.0 ;
5576         Ey_dVgs = 0.0 ;
5577         Ey_dVds = 0.0 ;
5578         Ey_dVbs = 0.0 ;
5579       }
5580       T7 = 1.0 + Ey * T3 ;
5581       T7_dVg = Ey_dVgs * T3 ;
5582       T7_dVd = Ey_dVds * T3 ;
5583       T7_dVb = Ey_dVbs * T3 ;
5584 
5585       Etun = T2 * T7 ;
5586       Etun_dVgs = T2_dVg * T7 + T7_dVg * T2 ;
5587       Etun_dVds = T2_dVd * T7 + T7_dVd * T2 ;
5588       Etun_dVbs = T2_dVb * T7 + T7_dVb * T2 ;
5589 
5590       Fn_SZ( Etun , Etun , igate_dlt , T5 ) ;
5591       Etun_dVgs *= T5 ;
5592       Etun_dVds *= T5 ;
5593       Etun_dVbs *= T5 ;
5594 
5595       Fn_SZ( T3 , Vgsz , 1.0e-3 , T4 ) ;
5596       T3 -= model->HSM2_vzadd0 ;
5597       TX = T3 / cclmmdf ;
5598       T2 = 1.0 +  TX * TX ;
5599       T1 = 1.0 - 1.0 / T2 ;
5600       T1_dVg = 2.0 * TX * T4 / ( T2 * T2 * cclmmdf ) ;
5601       T1_dVd = T1_dVg * Vgsz_dVds ;
5602       Etun_dVgs = T1 * Etun_dVgs + Etun * T1_dVg ;
5603       Etun_dVds = T1 * Etun_dVds + Etun * T1_dVd ;
5604       Etun_dVbs *= T1 ;
5605       Etun *= T1 ;
5606 
5607       T0 = Leff * here->HSM2_weff_nf ;
5608       T7 = modelMKS->HSM2_gleak7 / (modelMKS->HSM2_gleak7 + T0) ;
5609 
5610       T6 = pParam->HSM2_gleak6 ;
5611       T9 = T6 / (T6 + Vdsz) ;
5612       T9_dVd = - T9 / (T6 + Vdsz) * Vdsz_dVds ;
5613 
5614       T1 = - pParam->HSM2_gleak2 * Egp32 / (Etun + small) ;
5615 
5616       if ( T1 < - EXP_THR ) {
5617         Igate = 0.0 ;
5618         Igate_dVbs = Igate_dVds = Igate_dVgs = 0.0 ;
5619       } else {
5620         T2 = exp ( T1 ) ;
5621         T3 = pParam->HSM2_gleak1 / Egp12 * C_QE * T0 ;
5622 
5623         T4 =  T2 * T3 * sqrt ((Qiu + Cox0 * VgVt_small ) / cnst0) ;
5624         T5 = T4 * Etun ;
5625         T6 = 0.5 * Etun / (Qiu + Cox0 * VgVt_small ) ;
5626         T10 = T5 * Etun ;
5627         T10_dVb = T5 * (2.0 * Etun_dVbs - T1 * Etun_dVbs + T6 * Qiu_dVbs) ;
5628         T10_dVd = T5 * (2.0 * Etun_dVds - T1 * Etun_dVds + T6 * Qiu_dVds) ;
5629         T10_dVg = T5 * (2.0 * Etun_dVgs - T1 * Etun_dVgs + T6 * Qiu_dVgs) ;
5630 
5631         Igate = T7 * T9 * T10 ;
5632         Igate_dVbs = T7 * T9 * T10_dVb ;
5633         Igate_dVds = T7 * (T9_dVd * T10 + T9 * T10_dVd) ;
5634         Igate_dVgs = T7 * T9 * T10_dVg ;
5635       }
5636     } else {
5637       Igate = 0.0 ;
5638       Igate_dVbs = Igate_dVds = Igate_dVgs = 0.0 ;
5639     }
5640 
5641     /* Igs */
5642       T0 = - pParam->HSM2_glksd2 * Vgs + modelMKS->HSM2_glksd3 ;
5643       T2 = exp (Tox0 * T0);
5644       T2_dVg = (- Tox0 * pParam->HSM2_glksd2) * T2;
5645 
5646       T0 = Vgs / Tox0 / Tox0 ;
5647       T3 = Vgs * T0 ;
5648       T3_dVg = 2.0 * T0 * (1.0 ) ;
5649       T4 = pParam->HSM2_glksd1 / 1.0e6 * here->HSM2_weff_nf ;
5650       Igs = T4 * T2 * T3 ;
5651       Igs_dVgs = T4 * (T2_dVg * T3 + T2 * T3_dVg) ;
5652       Igs_dVds = 0.0 ;
5653       Igs_dVbs = 0.0 ;
5654 
5655       if ( Vgs >= 0.0e0 ){
5656         Igs *= -1.0 ;
5657         Igs_dVgs *= -1.0 ;
5658         Igs_dVds *= -1.0 ;
5659         Igs_dVbs *= -1.0 ;
5660       }
5661 
5662 
5663     /* Igd */
5664       T1 = Vgs - Vds ;
5665       T0 = - pParam->HSM2_glksd2 * T1 + modelMKS->HSM2_glksd3 ;
5666       T2 = exp (Tox0 * T0);
5667       T2_dVg = (- Tox0 * pParam->HSM2_glksd2) * T2;
5668       T2_dVd = (+ Tox0 * pParam->HSM2_glksd2) * T2;
5669       T2_dVb = 0.0 ;
5670 
5671       T0 = T1 / Tox0 / Tox0 ;
5672       T3 = T1 * T0 ;
5673       T3_dVg = 2.0 * T0 ;
5674       T3_dVd = - 2.0 * T0 ;
5675       T3_dVb = 0.0 ;
5676       T4 = pParam->HSM2_glksd1 / 1.0e6 * here->HSM2_weff_nf ;
5677       Igd = T4 * T2 * T3 ;
5678       Igd_dVgs = T4 * (T2_dVg * T3 + T2 * T3_dVg) ;
5679       Igd_dVds = T4 * (T2_dVd * T3 + T2 * T3_dVd) ;
5680       Igd_dVbs = 0.0 ;
5681 
5682       if( T1 >= 0.0e0 ){
5683         Igd  *= -1.0 ;
5684         Igd_dVgs *= -1.0 ;
5685         Igd_dVds *= -1.0 ;
5686         Igd_dVbs *= -1.0 ;
5687       }
5688 
5689 
5690     /* Igb */
5691       Etun = (- Vgs + Vbs + Vfb + model->HSM2_glkb3 ) / Tox0 ;
5692 
5693       Etun_dVgs = - 1.0 / Tox0 ;
5694       Etun_dVds = 0.0 ;
5695       Etun_dVbs = 1.0 / Tox0 ;
5696 
5697       Fn_SZ( Etun , Etun, igate_dlt, T5) ;
5698       Etun += small ;
5699       Etun_dVgs *= T5 ;
5700       Etun_dVbs *= T5 ;
5701 
5702       T1 = - pParam->HSM2_glkb2 / Etun ;
5703       if ( T1 < - EXP_THR ) {
5704         Igb = 0.0 ;
5705         Igb_dVgs = Igb_dVds = Igb_dVbs = 0.0 ;
5706       } else {
5707         T2 = exp ( T1 );
5708         T3 =  pParam->HSM2_glkb2 / ( Etun * Etun ) * T2 ;
5709         T2_dVg = T3 * Etun_dVgs ;
5710         T2_dVb = T3 * Etun_dVbs ;
5711 
5712         T3 = pParam->HSM2_glkb1 * here->HSM2_weff_nf * Leff ;
5713         Igb = T3 * Etun * Etun * T2 ;
5714         Igb_dVgs = T3 * (2.0 * Etun * Etun_dVgs * T2 + Etun * Etun * T2_dVg);
5715         Igb_dVds = 0.0 ;
5716         Igb_dVbs = T3 * (2.0 * Etun * Etun_dVbs * T2 + Etun * Etun * T2_dVb);
5717       }
5718 
5719         GLPART1 = 0.5 ;
5720 	GLPART1_dVgs = 0.0 ;
5721 	GLPART1_dVds = 0.0 ;
5722 	GLPART1_dVbs = 0.0 ;
5723 
5724   } /* if ( model->HSM2_coiigs == 0 ) */
5725 
5726 
5727 
5728 
5729   /*-----------------------------------------------------------*
5730    * Igidl : GIDL
5731    *-----------------*/
5732   if( model->HSM2_cogidl == 0 ){
5733     Igidl = 0.0e0 ;
5734     Igidl_dVbs = 0.0e0 ;
5735     Igidl_dVds = 0.0e0 ;
5736     Igidl_dVgs = 0.0e0 ;
5737   } else {
5738     T3 = here->HSM2_2qnsub_esi ;
5739     Qb0 = sqrt (T3 * (Pb20 - Vbsz2)) ;
5740     T4 = 0.5 * T3 / Qb0 ;
5741     Qb0_dVb = T4 * (- Vbsz2_dVbs) ;
5742     Qb0_dVd = T4 * (- Vbsz2_dVds) ;
5743     Qb0_dVg = T4 * (- Vbsz2_dVgs) ;
5744 
5745     Qb0Cox = model->HSM2_gidl6 * Qb0 * Cox_inv ;
5746     Qb0Cox_dVb = model->HSM2_gidl6 * ( Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ) ;
5747     Qb0Cox_dVd = model->HSM2_gidl6 * ( Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ) ;
5748     Qb0Cox_dVg = model->HSM2_gidl6 * ( Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ) ;
5749 
5750     T1 = model->HSM2_gidl3 * (Vds  + model->HSM2_gidl4) - Vgs + (dVthSC + dVthLP) * model->HSM2_gidl5 - Qb0Cox ;
5751 
5752     T2 = 1.0 / Tox0 ;
5753     E1 = T1 * T2 ;
5754 
5755     E1_dVb = ( model->HSM2_gidl5 * (dVthSC_dVb + dVthLP_dVb) - Qb0Cox_dVb ) * T2 ;
5756     E1_dVd = ( model->HSM2_gidl3 + model->HSM2_gidl5 * (dVthSC_dVd + dVthLP_dVd) - Qb0Cox_dVd ) * T2 ;
5757     E1_dVg = ( -1.0 + model->HSM2_gidl5 * (dVthSC_dVg + dVthLP_dVg) - Qb0Cox_dVg ) * T2 ;
5758 
5759     Fn_SZ( Egidl , E1, eef_dlt, T5) ;
5760     Egidl_dVb = T5 * E1_dVb ;
5761     Egidl_dVd = T5 * E1_dVd ;
5762     Egidl_dVg = T5 * E1_dVg ;
5763     Egidl    += small ;
5764 
5765     T6 = pow(Egidl,model->HSM2_gidl7) ;
5766     T1 = model->HSM2_gidl7 * pow(Egidl,model->HSM2_gidl7 -1.0) ;
5767     T6_dVb = Egidl_dVb * T1 ;
5768     T6_dVd = Egidl_dVd * T1 ;
5769     T6_dVg = Egidl_dVg * T1 ;
5770 
5771     T0 = - pParam->HSM2_gidl2 * Egp32 / T6 ;
5772     if ( T0 < - EXP_THR ) {
5773       Igidl = 0.0 ;
5774       Igidl_dVbs = Igidl_dVds = Igidl_dVgs = 0.0 ;
5775     } else {
5776       T1 = exp ( T0 ) ;
5777       T2 = pParam->HSM2_gidl1 / Egp12 * C_QE * here->HSM2_weff_nf ;
5778       Igidl = T2 * Egidl * Egidl * T1 ;
5779       T3 = T2 * T1 * Egidl * (2.0 + pParam->HSM2_gidl2 * Egp32 * Egidl / T6 / T6 ) ;
5780       Igidl_dVbs = T3 * Egidl_dVb ;
5781       Igidl_dVds = T3 * Egidl_dVd ;
5782       Igidl_dVgs = T3 * Egidl_dVg ;
5783     }
5784 
5785     Vdb = Vds - Vbs ;
5786     if ( Vdb > 0.0 ) {
5787       T2 = Vdb * Vdb ;
5788       T4 = T2 * Vdb ;
5789       T0 = T4 + C_gidl_delta ;
5790       T5 = T4 / T0 ;
5791       T7 = ( 3.0 * T2 * T0 - T4 * 3.0 * T2 ) / ( T0 * T0 ) ;  /* == T5_dVdb */
5792       Igidl_dVbs = Igidl_dVbs * T5 + Igidl * T7 * ( - 1.0 ) ; /* Vdb_dVbs = -1 */
5793       Igidl_dVds = Igidl_dVds * T5 + Igidl * T7 * ( + 1.0 ) ; /* Vdb_dVds = +1 */
5794       Igidl_dVgs = Igidl_dVgs * T5 ; /* Vdb_dVgs = 0 */
5795       Igidl *= T5 ;
5796     } else {
5797       Igidl = 0.0 ;
5798       Igidl_dVbs = Igidl_dVds = Igidl_dVgs = 0.0 ;
5799     }
5800 
5801   }
5802 
5803 
5804   /*-----------------------------------------------------------*
5805    * Igisl : GISL
5806    *-----------------*/
5807   if( model->HSM2_cogidl == 0){
5808     Igisl = 0.0e0 ;
5809     Igisl_dVbs = 0.0e0 ;
5810     Igisl_dVds = 0.0e0 ;
5811     Igisl_dVgs = 0.0e0 ;
5812   } else {
5813     T1 = model->HSM2_gidl3 * ( - Vds + model->HSM2_gidl4 )
5814       - ( Vgs - Vds ) + ( dVthSC + dVthLP ) * model->HSM2_gidl5 - Qb0Cox ;
5815 
5816     T2 = 1.0 / Tox0 ;
5817     E1 = T1 * T2 ;
5818     E1_dVb = ( model->HSM2_gidl5 * (dVthSC_dVb + dVthLP_dVb) - Qb0Cox_dVb ) * T2 ;
5819     E1_dVd = ( -1.0 * model->HSM2_gidl3 + 1.0 + model->HSM2_gidl5 * (dVthSC_dVd + dVthLP_dVd) - Qb0Cox_dVd ) * T2 ;
5820     E1_dVg = ( -1.0 + model->HSM2_gidl5 * (dVthSC_dVg + dVthLP_dVg) - Qb0Cox_dVg ) * T2 ;
5821 
5822     Fn_SZ( Egisl , E1, eef_dlt, T5) ;
5823     Egisl_dVb = T5 * E1_dVb ;
5824     Egisl_dVd = T5 * E1_dVd ;
5825     Egisl_dVg = T5 * E1_dVg ;
5826     Egisl    += small ;
5827 
5828     T6 = pow(Egisl,model->HSM2_gidl7) ;
5829     T1 = model->HSM2_gidl7 * pow(Egisl,model->HSM2_gidl7 -1.0) ;
5830     T6_dVb = Egisl_dVb * T1 ;
5831     T6_dVd = Egisl_dVd * T1 ;
5832     T6_dVg = Egisl_dVg * T1 ;
5833 
5834     T0 = - pParam->HSM2_gidl2 * Egp32 / T6 ;
5835     if ( T0 < - EXP_THR ) {
5836       Igisl = 0.0 ;
5837       Igisl_dVbs = Igisl_dVds = Igisl_dVgs = 0.0 ;
5838     } else {
5839       T1 = exp ( T0 ) ;
5840       T2 = pParam->HSM2_gidl1 / Egp12 * C_QE * here->HSM2_weff_nf ;
5841       Igisl = T2 * Egisl * Egisl * T1 ;
5842       T3 = T2 * T1 * Egisl * (2.0 + pParam->HSM2_gidl2 * Egp32 * Egisl / T6 / T6) ;
5843       Igisl_dVbs = T3 * Egisl_dVb ;
5844       Igisl_dVds = T3 * Egisl_dVd ;
5845       Igisl_dVgs = T3 * Egisl_dVg ;
5846     }
5847 
5848     Vsb = - Vbs ;
5849     if ( Vsb > 0.0 ) {
5850       T2 = Vsb * Vsb ;
5851       T4 = T2 * Vsb ;
5852       T0 = T4 + C_gidl_delta ;
5853       T5 = T4 / T0 ;
5854       T7 = ( 3.0 * T2 * T0 - T4 * 3.0 * T2 ) / ( T0 * T0 ) ;  /* == T5_dVsb */
5855       Igisl_dVbs = Igisl_dVbs * T5 + Igisl * T7 * ( - 1.0 ) ; /* Vsb_dVbs = -1 */
5856       Igisl_dVds = Igisl_dVds * T5 ; /* Vsb_dVds = 0 */
5857       Igisl_dVgs = Igisl_dVgs * T5 ; /* Vsb_dVgs = 0 */
5858       Igisl *= T5 ;
5859     } else {
5860       Igisl = 0.0 ;
5861       Igisl_dVbs = Igisl_dVds = Igisl_dVgs = 0.0 ;
5862     }
5863 
5864   }
5865 
5866 
5867   /*-----------------------------------------------------------*
5868    * End of PART-2. (label)
5869    *-----------------*/
5870 /* end_of_part_2: */
5871 
5872   /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5873    * PART-3: Overlap charge
5874    *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
5875   Aclm = pParam->HSM2_clm1 ;
5876   if ( flg_noqi != 0 ) {
5877     /*-------------------------------------------*
5878      * Calculation of Psdl for cases of flg_noqi==1.
5879      *-----------------*/
5880     Psdl = Aclm * (Vds + Ps0) + (1.0e0 - Aclm) * Psl ;
5881     Psdl_dVbs = Aclm * Ps0_dVbs + (1.0e0 - Aclm) * Psl_dVbs ;
5882     Psdl_dVds = Aclm * (1.0e0 + Ps0_dVds) + (1.0e0 - Aclm) * Psl_dVds ;
5883     Psdl_dVgs = Aclm * Ps0_dVgs + (1.0e0 - Aclm) * Psl_dVgs ;
5884     if ( Psdl > Ps0 + Vds - epsm10 ) {
5885       Psdl = Ps0 + Vds - epsm10 ;
5886       Psdl_dVbs = Ps0_dVbs ;
5887       Psdl_dVds = Ps0_dVds + 1.0 ;
5888       Psdl_dVgs = Ps0_dVgs ;
5889     }
5890 
5891     if (model->HSM2_xqy !=0) {
5892       Ec = 0.0e0 ;
5893       Ec_dVbs =0.0e0 ;
5894       Ec_dVds =0.0e0 ;
5895       Ec_dVgs =0.0e0 ;
5896     }
5897   } else {
5898     /* Ec is removed from Lred calc. part */
5899     if (model->HSM2_xqy !=0) {
5900       if ( Idd < C_IDD_MIN ) {
5901         Ec = 0.0e0 ;
5902         Ec_dVbs =0.0e0 ;
5903         Ec_dVds =0.0e0 ;
5904         Ec_dVgs =0.0e0 ;
5905       } else {
5906       T1 =  beta_inv / Leff ;
5907       T2 = 1.0 / (Qn0 + 1e-20) ;
5908       T3 = T2 * T2 ;
5909       Ec = Idd * T1 * T2 ;
5910       Ec_dVbs = T1 * (Idd_dVbs * T2 - Idd * Qn0_dVbs * T3 ) ;
5911       Ec_dVds = T1 * (Idd_dVds * T2 - Idd * Qn0_dVds * T3 ) ;
5912       Ec_dVgs = T1 * (Idd_dVgs * T2 - Idd * Qn0_dVgs * T3 ) ;
5913       }
5914     }
5915   }
5916 
5917 
5918   /*-------------------------------------------*
5919    * Overlap charges: Qgod, Qgos, and Qover
5920    *-----------------*/
5921   if ( model->HSM2_coovlp >= 1 && pParam->HSM2_lover > 0.0 ){
5922     cov_slp = modelMKS->HSM2_ovslp ;
5923     cov_mag = model->HSM2_ovmag ;
5924 
5925     covvg = Vgs ;
5926     covvg_dVgs = 1.0 ;
5927 
5928     T1 = Cox0 * here->HSM2_weff_nf ;
5929     Lov = pParam->HSM2_lover ;
5930 
5931     if ( pParam->HSM2_nover == 0.0 ){
5932       T4 = cov_slp * T1 * ( cov_mag + covvg ) ;
5933       T4_dVg = cov_slp * T1 * covvg_dVgs ;
5934       T4_dVd = 0.0 ;
5935       T5 = Lov * T1 ;
5936 
5937       TX = Ps0 ;
5938       TX_dVbs = Ps0_dVbs ;
5939       TX_dVds = Ps0_dVds ;
5940       TX_dVgs = Ps0_dVgs ;
5941 
5942       T9 = 1.2e0 - TX ;
5943       Qgos = Vgs * T5 - T9 * T4 ;
5944       Qgos_dVbs =      T4 * TX_dVbs ;
5945       Qgos_dVds =      T4 * TX_dVds - T9 * T4_dVd ;
5946       Qgos_dVgs = T5 + T4 * TX_dVgs - T9 * T4_dVg ;
5947 
5948       T4 = cov_slp * T1 * ( cov_mag + covvg - Vds ) ;
5949       T4_dVg = cov_slp * T1 * covvg_dVgs ;
5950       T4_dVd = - cov_slp * T1 ;
5951       TX = Psl - Vds ;
5952       TX_dVbs = Psl_dVbs ;
5953       TX_dVds = Psl_dVds - 1.0 ;
5954       TX_dVgs = Psl_dVgs ;
5955       T9 = 1.2e0 - TX ;
5956       Qgod = (Vgs - Vds) * T5 - T4 * T9 ;
5957       Qgod_dVbs =        T4 * TX_dVbs ;
5958       Qgod_dVds = - T5 + T4 * TX_dVds - T9 * T4_dVd ;
5959       Qgod_dVgs =   T5 + T4 * TX_dVgs - T9 * T4_dVg ;
5960     } else {
5961       for ( lcover = -1 ; lcover <= +1 ; lcover += 2 ) {
5962         flg_ovloops = ( 1 - lcover ) / 2 ; /* 1 in Source overlap calc. */
5963         flg_ovloopd = ( 1 + lcover ) / 2 ; /* 1 in Drain overlap calc. */
5964         /*-------------------------------------------*
5965          * Qover (G/D overlap charge)  |  note: _dVxs means _dVxse
5966          *------------------------*/
5967         Vbsgmt = ModeNML * Vbse + ModeRVS * ( Vbse - Vdse ) ;
5968         Vdsgmt = ModeNML * Vdse + ModeRVS * ( - Vdse ) ;
5969         Vgsgmt = ModeNML * Vgse + ModeRVS * ( Vgse - Vdse ) ;
5970         Vdbgmt = Vdsgmt - Vbsgmt ;
5971         Vgbgmt = Vgsgmt - Vbsgmt ;
5972         Vsbgmt = - Vbsgmt ;
5973         flg_overs = flg_ovloops * (int)ModeNML + flg_ovloopd * (int)ModeRVS ; /* geometrical source */
5974         flg_overd = flg_ovloops * (int)ModeRVS + flg_ovloopd * (int)ModeNML ; /* geometrical drain */
5975         Vxbgmt = flg_overs * Vsbgmt + flg_overd * Vdbgmt + epsm10 ;
5976 
5977 
5978         /*---------------------------------------------------*
5979          * Clamp -Vxbgmt.
5980          *-----------------*/
5981         T0 = - Vxbgmt;
5982         if ( T0 > Vbs_bnd ) {
5983           T1 =    T0   - Vbs_bnd;
5984           T2 =    Vbs_max    - Vbs_bnd;
5985 
5986           Fn_SUPoly4( TY, T1, T2, T11 );
5987 
5988           T10 = Vbs_bnd + TY ;
5989         }  else {
5990           T10 = T0 ;
5991           T11 = 1.0 ;
5992         }
5993         Vxbgmtcl = - T10 - small2 ;
5994         Vxbgmtcl_dVxbgmt = T11;
5995 
5996         fac1 = here->HSM2_cnst0over * Cox0_inv ;
5997         fac1_dVbs = 0.0; fac1_dVds = 0.0; fac1_dVgs = 0.0;
5998 
5999         fac1p2 = fac1 * fac1 ;
6000 
6001         VgpLD = - Vgbgmt + pParam->HSM2_vfbover;
6002         VgpLD_dVgb = - 1.0e0 ;
6003 
6004         T0 = pParam->HSM2_nover / here->HSM2_nin ;
6005         Pb2over = 2.0 / beta * log( T0 ) ;
6006 
6007         Vgb_fb_LD =  - Vxbgmtcl ;
6008 
6009         /*-----------------------------------*
6010          * QsuLD: total charge = Accumulation | Depletion+inversion
6011          *-----------------*/
6012         if (   VgpLD  < Vgb_fb_LD ){
6013           /*---------------------------*
6014            * Accumulation
6015            *-----------------*/
6016           flg_ovzone = -1 ;
6017           T1 = 1.0 / ( beta * here->HSM2_cnst0over ) ;
6018           TY = T1 * Cox0 ;
6019           Ac41 = 2.0 + 3.0 * C_SQRT_2 * TY ;
6020           Ac4 = 8.0 * Ac41 * Ac41 * Ac41 ;
6021 
6022           Ps0_min = here->HSM2_eg - Pb2over ;
6023 
6024           TX = beta * ( VgpLD + Vxbgmtcl ) ;
6025           TX_dVxb = beta * Vxbgmtcl_dVxbgmt ;
6026           TX_dVgb = beta * VgpLD_dVgb ;
6027 
6028           Ac31 = 7.0 * C_SQRT_2 - 9.0 * TY * ( TX - 2.0 ) ;
6029           Ac31_dVxb = - 9.0 * TY * TX_dVxb ;
6030           Ac31_dVgb = - 9.0 * TY * TX_dVgb ;
6031 
6032           Ac3 = Ac31 * Ac31 ;
6033           T1 = 2.0 * Ac31 ;
6034           Ac3_dVxb = T1 * Ac31_dVxb ;
6035           Ac3_dVgb = T1 * Ac31_dVgb ;
6036 
6037           Ac2 = sqrt( Ac4 + Ac3 ) ;
6038           T1 = 0.5 / Ac2 ;
6039           Ac2_dVxb = T1 *  Ac3_dVxb ;
6040           Ac2_dVgb = T1 *  Ac3_dVgb ;
6041 
6042           Ac1 = -7.0 * C_SQRT_2 + Ac2 + 9.0 * TY * ( TX - 2.0 ) ;
6043           Ac1_dVxb = Ac2_dVxb + 9.0 * TY * TX_dVxb ;
6044           Ac1_dVgb = Ac2_dVgb + 9.0 * TY * TX_dVgb ;
6045 
6046           Acd = pow( Ac1 , C_1o3 ) ;
6047           T1 = C_1o3 / ( Acd * Acd ) ;
6048           Acd_dVxb = Ac1_dVxb * T1 ;
6049           Acd_dVgb = Ac1_dVgb * T1 ;
6050 
6051           Acn = -4.0 * C_SQRT_2 - 12.0 * TY + 2.0 * Acd + C_SQRT_2 * Acd * Acd ;
6052           T1 = 2.0 + 2.0 * C_SQRT_2 * Acd ;
6053           Acn_dVxb = T1 * Acd_dVxb ;
6054           Acn_dVgb = T1 * Acd_dVgb ;
6055 
6056           Chi = Acn / Acd ;
6057           T1 = 1.0 / ( Acd * Acd ) ;
6058           Chi_dVxb = ( Acn_dVxb * Acd - Acn * Acd_dVxb ) * T1 ;
6059           Chi_dVgb = ( Acn_dVgb * Acd - Acn * Acd_dVgb ) * T1 ;
6060 
6061           Psa = Chi * beta_inv - Vxbgmtcl ;
6062           Psa_dVxb = Chi_dVxb * beta_inv - Vxbgmtcl_dVxbgmt ;
6063           Psa_dVgb = Chi_dVgb * beta_inv ;
6064 
6065           T1 = Psa + Vxbgmtcl ;
6066           T2 = T1 / Ps0_min ;
6067           T3 = sqrt( 1.0 + ( T2 * T2 ) ) ;
6068 
6069           T9 = T2 / T3 / Ps0_min ;
6070           T3_dVd = T9 * ( Psa_dVxb + Vxbgmtcl_dVxbgmt ) ;
6071           T3_dVg = T9 * Psa_dVgb ;
6072 
6073           Ps0LD = T1 / T3 - Vxbgmtcl ;
6074           T9 = 1.0 / ( T3 * T3 ) ;
6075           Ps0LD_dVxb = T9 * ( ( Psa_dVxb + Vxbgmtcl_dVxbgmt ) * T3 - T1 * T3_dVd ) - Vxbgmtcl_dVxbgmt ;
6076           Ps0LD_dVgb = T9 * ( Psa_dVgb * T3 - T1 * T3_dVg );
6077 
6078           T2 = ( VgpLD - Ps0LD ) ;
6079           QsuLD = Cox0 * T2 ;
6080           QsuLD_dVxb = - Cox0 * Ps0LD_dVxb ;
6081           QsuLD_dVgb = Cox0 * ( VgpLD_dVgb - Ps0LD_dVgb ) ;
6082 
6083           QbuLD = QsuLD ;
6084           QbuLD_dVxb = QsuLD_dVxb ;
6085           QbuLD_dVgb = QsuLD_dVgb ;
6086 
6087         } else {
6088 
6089           /*---------------------------*
6090            * Depletion and inversion
6091            *-----------------*/
6092 
6093           /* initial value for a few fixpoint iterations
6094              to get Ps0_iniA from simplified Poisson equation: */
6095            flg_ovzone = 2 ;
6096            Chi = znbd3 ;
6097            Chi_dVxb = 0.0 ; Chi_dVgb = 0.0 ;
6098 
6099            Ps0_iniA= Chi/beta - Vxbgmtcl ;
6100            Ps0_iniA_dVxb = Chi_dVxb/beta - Vxbgmtcl_dVxbgmt ;
6101            Ps0_iniA_dVgb = Chi_dVgb/beta ;
6102 
6103           /* 1 .. 2 relaxation steps should be sufficient */
6104           for ( lp_ld = 1; lp_ld <= 2; lp_ld ++ ) {
6105             TY = exp(-Chi);
6106             TY_dVxb = -Chi_dVxb * TY;
6107             TY_dVgb = -Chi_dVgb * TY;
6108             TX = 1.0e0 + 4.0e0
6109                * ( beta * ( VgpLD + Vxbgmtcl ) - 1.0e0 + TY ) / ( fac1p2 * beta2 ) ;
6110             TX_dVxb = 4.0e0 * ( beta * ( Vxbgmtcl_dVxbgmt ) + TY_dVxb ) / ( fac1p2 * beta2 );
6111             TX_dVgb = 4.0e0 * ( beta * ( VgpLD_dVgb       ) + TY_dVgb ) / ( fac1p2 * beta2 );
6112             T1 = ( beta * ( VgpLD + Vxbgmtcl ) - 1.0e0 + TY );
6113             T3 = fac1p2 * beta2 ;
6114             if ( TX < epsm10) {
6115               TX = epsm10; TX_dVxb = 0.0; TX_dVgb = 0.0;
6116             }
6117 
6118             Ps0_iniA = VgpLD + fac1p2 * beta / 2.0e0 * ( 1.0e0 - sqrt( TX ) ) ;
6119             Ps0_iniA_dVxb =            - fac1p2 * beta / 2.0e0 * TX_dVxb * 0.5 / sqrt( TX );
6120             Ps0_iniA_dVgb = VgpLD_dVgb - fac1p2 * beta / 2.0e0 * TX_dVgb * 0.5 / sqrt( TX );
6121             T1 = fac1p2 * beta ;
6122             T2 = 1.0 - sqrt( TX );
6123 
6124             Chi = beta * ( Ps0_iniA + Vxbgmtcl ) ;
6125             Chi_dVxb = beta * ( Ps0_iniA_dVxb + Vxbgmtcl_dVxbgmt ) ;
6126             Chi_dVgb = beta * ( Ps0_iniA_dVgb ) ;
6127           } /* End of iteration */
6128 
6129           if ( Chi < znbd3 ) {
6130 
6131             flg_ovzone = 1 ;
6132 
6133             /*-----------------------------------*
6134              * zone-D1
6135              * - Ps0_iniA is the analytical solution of QovLD=Qb0 with
6136              *   Qb0 being approximated by 3-degree polynomial.
6137              *
6138              *   new: Inclusion of exp(-Chi) term at right border
6139              *-----------------*/
6140             Ta =  1.0/(9.0*sqrt(2.0)) - (5.0+7.0*exp(-3.0)) / (54.0*sqrt(2.0+exp(-3.0)));
6141             Tb = (1.0+exp(-3.0)) / (2.0*sqrt(2.0+exp(-3.0))) - sqrt(2.0) / 3.0;
6142             Tc =  1.0/sqrt(2.0) + 1.0/(beta*fac1);
6143             Td = - (VgpLD + Vxbgmtcl) / fac1;
6144             Td_dVxb = - Vxbgmtcl_dVxbgmt / fac1;
6145             Td_dVgb = - VgpLD_dVgb / fac1;
6146             Tq = Tb*Tb*Tb / (27.0*Ta*Ta*Ta) - Tb*Tc/(6.0*Ta*Ta) + Td/(2.0*Ta);
6147             Tq_dVxb = Td_dVxb/(2.0*Ta);
6148             Tq_dVgb = Td_dVgb / (2.0*Ta);
6149             Tp = (3.0*Ta*Tc-Tb*Tb)/(9.0*Ta*Ta);
6150             T5      = sqrt(Tq*Tq + Tp*Tp*Tp);
6151             T5_dVxb = 2.0*Tq*Tq_dVxb / (2.0*T5);
6152             T5_dVgb = 2.0*Tq*Tq_dVgb / (2.0*T5);
6153             Tu = pow(-Tq + T5,C_1o3);
6154             Tu_dVxb = Tu / (3.0 * (-Tq + T5)) * (-Tq_dVxb + T5_dVxb);
6155             Tu_dVgb = Tu / (3.0 * (-Tq + T5)) * (-Tq_dVgb + T5_dVgb);
6156             Tv = -pow(Tq + T5,C_1o3);
6157             Tv_dVxb = Tv / (3.0 * (-Tq - T5)) * (-Tq_dVxb - T5_dVxb);
6158             Tv_dVgb = Tv / (3.0 * (-Tq - T5)) * (-Tq_dVgb - T5_dVgb);
6159             TX      = Tu + Tv - Tb/(3.0*Ta);
6160             TX_dVxb = Tu_dVxb + Tv_dVxb;
6161             TX_dVgb = Tu_dVgb + Tv_dVgb;
6162 
6163             Ps0_iniA = TX * beta_inv - Vxbgmtcl ;
6164             Ps0_iniA_dVxb = TX_dVxb * beta_inv - Vxbgmtcl_dVxbgmt;
6165             Ps0_iniA_dVgb = TX_dVgb * beta_inv;
6166 
6167             Chi = beta * ( Ps0_iniA + Vxbgmtcl ) ;
6168             Chi_dVxb = beta * ( Ps0_iniA_dVxb + Vxbgmtcl_dVxbgmt ) ;
6169             Chi_dVgb = beta * ( Ps0_iniA_dVgb ) ;
6170           }
6171 
6172           if ( model->HSM2_coqovsm > 0 ) {
6173     	  /*-----------------------------------*
6174     	   * - Ps0_iniB : upper bound.
6175     	   *-----------------*/
6176             flg_ovzone += 2;
6177 
6178             VgpLD_shift = VgpLD + Vxbgmtcl + 0.1;
6179             VgpLD_shift_dVgb = VgpLD_dVgb;
6180             VgpLD_shift_dVxb = Vxbgmtcl_dVxbgmt;
6181             exp_bVbs = exp( beta * - Vxbgmtcl ) + small ;
6182             exp_bVbs_dVxb = - exp_bVbs * beta * Vxbgmtcl_dVxbgmt;
6183             T0 = here->HSM2_nin / pParam->HSM2_nover;
6184             cnst1over = T0 * T0;
6185             gamma = cnst1over * exp_bVbs ;
6186             gamma_dVxb = cnst1over * exp_bVbs_dVxb;
6187 
6188             T0    = beta2 * fac1p2;
6189 
6190             psi = beta*VgpLD_shift;
6191             psi_dVgb = beta*VgpLD_shift_dVgb;
6192             psi_dVxb = beta*VgpLD_shift_dVxb;
6193             Chi_1      = log(gamma*T0 + psi*psi) - log(cnst1over*T0) + beta*Vxbgmtcl;
6194             Chi_1_dVgb = 2.0*psi*psi_dVgb/ (gamma*T0 + psi*psi);
6195             Chi_1_dVxb = (gamma_dVxb*T0+2.0*psi*psi_dVxb)/(gamma*T0+psi*psi)
6196                                 + beta*Vxbgmtcl_dVxbgmt;
6197 
6198             Fn_SU2( Chi_1, Chi_1, psi, 1.0, T1, T2 );
6199             Chi_1_dVgb = Chi_1_dVgb*T1 + psi_dVgb*T2;
6200             Chi_1_dVxb = Chi_1_dVxb*T1 + psi_dVxb*T2;
6201 
6202          /* 1 fixpoint step for getting more accurate Chi_B */
6203             psi      -= Chi_1 ;
6204             psi_dVgb -= Chi_1_dVgb ;
6205             psi_dVxb -= Chi_1_dVxb ;
6206 
6207             psi      += beta*0.1 ;
6208 
6209             psi_B = psi;
6210             arg_B = psi*psi/(gamma*T0);
6211             Chi_B = log(gamma*T0 + psi*psi) - log(cnst1over*T0) + beta*Vxbgmtcl;
6212             Chi_B_dVgb = 2.0*psi*psi_dVgb/ (gamma*T0 + psi*psi);
6213             Chi_B_dVxb = (gamma_dVxb*T0+2.0*psi*psi_dVxb)/(gamma*T0+psi*psi)
6214                                 + beta*Vxbgmtcl_dVxbgmt;
6215             Ps0_iniB      = Chi_B/beta - Vxbgmtcl ;
6216             Ps0_iniB_dVgb = Chi_B_dVgb/beta;
6217             Ps0_iniB_dVxb = Chi_B_dVxb/beta- Vxbgmtcl_dVxbgmt;
6218 
6219 
6220             /* construction of Ps0LD by taking Ps0_iniB as an upper limit of Ps0_iniA
6221              *
6222              * Limiting is done for Chi rather than for Ps0LD, to avoid shifting
6223              * for Fn_SU2 */
6224 
6225             Chi_A = Chi;
6226             Chi_A_dVxb = Chi_dVxb;
6227             Chi_A_dVgb = Chi_dVgb;
6228 
6229             Fn_SU2( Chi, Chi_A, Chi_B, c_ps0ini_2*75.00, T1, T2 ); /* org: 50 */
6230             Chi_dVgb = Chi_A_dVgb * T1 + Chi_B_dVgb * T2;
6231             Chi_dVxb = Chi_A_dVxb * T1 + Chi_B_dVxb * T2;
6232 
6233           }
6234 
6235             /* updating Ps0LD */
6236             Ps0LD= Chi/beta - Vxbgmtcl ;
6237             Ps0LD_dVgb = Chi_dVgb/beta;
6238             Ps0LD_dVxb = Chi_dVxb/beta- Vxbgmtcl_dVxbgmt;
6239 
6240           T1      = Chi - 1.0 + exp(-Chi);
6241           T1_dVxb = (1.0 - exp(-Chi)) * Chi_dVxb ;
6242           T1_dVgb = (1.0 - exp(-Chi)) * Chi_dVgb ;
6243           if (T1 < epsm10) {
6244              T1 = epsm10 ;
6245              T1_dVxb = 0.0 ;
6246              T1_dVgb = 0.0 ;
6247           }
6248           T2 = sqrt(T1);
6249           QbuLD = here->HSM2_cnst0over * T2 ;
6250           T3 = here->HSM2_cnst0over * 0.5 / T2 ;
6251           QbuLD_dVxb = T3 * T1_dVxb ;
6252           QbuLD_dVgb = T3 * T1_dVgb ;
6253 
6254           /*-----------------------------------------------------------*
6255            * QsuLD : Qovs or Qovd in unit area.
6256            * note: QsuLD = Qdep+Qinv.
6257            *-----------------*/
6258           QsuLD = Cox0 * ( VgpLD - Ps0LD ) ;
6259           QsuLD_dVxb = Cox0 * ( - Ps0LD_dVxb ) ;
6260           QsuLD_dVgb = Cox0 * ( VgpLD_dVgb - Ps0LD_dVgb ) ;
6261 
6262           if ( model->HSM2_coqovsm == 1 ) { /* take initial values from analytical model */
6263 
6264 
6265             /*---------------------------------------------------*
6266              * Calculation of Ps0LD. (beginning of Newton loop)
6267              * - Fs0 : Fs0 = 0 is the equation to be solved.
6268              * - dPs0 : correction value.
6269              *-----------------*/
6270 
6271             /* initial value too close to flat band should not be used */
6272             exp_bVbs = exp( beta * - Vxbgmtcl ) ;
6273             T0 = here->HSM2_nin / pParam->HSM2_nover;
6274             cnst1over = T0 * T0;
6275             cfs1 = cnst1over * exp_bVbs ;
6276 
6277             flg_conv = 0 ;
6278             for ( lp_s0 = 1 ; lp_s0 <= 2*lp_s0_max + 1 ; lp_s0 ++ ) {
6279 
6280                 Chi = beta * ( Ps0LD + Vxbgmtcl ) ;
6281 
6282                 if ( Chi < znbd5 ) {
6283                   /*-------------------------------------------*
6284                    * zone-D1/D2. (Ps0LD)
6285                    *-----------------*/
6286                   fi = Chi * Chi * Chi
6287                     * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ;
6288                   fi_dChi = Chi * Chi
6289                     * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ;
6290 
6291                   fs01 = cfs1 * fi * fi ;
6292                   fs01_dPs0 = cfs1 * beta * 2 * fi * fi_dChi ;
6293 
6294                   fb = Chi * ( cn_nc51
6295                      + Chi * ( cn_nc52
6296                      + Chi * ( cn_nc53
6297                      + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ;
6298                   fb_dChi = cn_nc51
6299                      + Chi * ( 2 * cn_nc52
6300                      + Chi * ( 3 * cn_nc53
6301                      + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ;
6302 
6303                   fs02 = sqrt( fb * fb + fs01 + small ) ;
6304                   fs02_dPs0 = ( beta * fb_dChi * 2 * fb + fs01_dPs0 ) / ( fs02 + fs02 ) ;
6305 
6306                 } else {
6307                  /*-------------------------------------------*
6308                   * zone-D3. (Ps0LD)
6309                   *-----------------*/
6310                  if ( Chi < large_arg ) { /* avoid exp_Chi to become extremely large */
6311     	        exp_Chi = exp( Chi ) ;
6312     	        fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ;
6313     	        fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ;
6314                  } else {
6315                     exp_bPs0 = exp( beta*Ps0LD ) ;
6316                     fs01     = cnst1over * ( exp_bPs0 - exp_bVbs ) ;
6317                     fs01_dPs0 = cnst1over * beta * exp_bPs0 ;
6318                  }
6319                  fs02 = sqrt( Chi - 1.0 + fs01 ) ;
6320                  fs02_dPs0 = ( beta + fs01_dPs0 ) / fs02 * 0.5 ;
6321 
6322                 } /* end of if ( Chi  ... ) block */
6323                 /*-----------------------------------------------------------*
6324                  * Fs0
6325                  *-----------------*/
6326                 Fs0 = VgpLD - Ps0LD - fac1 * fs02 ;
6327                 Fs0_dPs0 = - 1.0e0 - fac1 * fs02_dPs0 ;
6328 
6329                 if ( flg_conv == 1 ) break ;
6330 
6331                 dPs0 = - Fs0 / Fs0_dPs0 ;
6332 
6333                 /*-------------------------------------------*
6334                  * Update Ps0LD .
6335                  *-----------------*/
6336                 dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Ps0LD))) ;
6337                 if ( fabs( dPs0 ) > dPlim ) dPs0 = dPlim * Fn_Sgn( dPs0 ) ;
6338 
6339                 Ps0LD = Ps0LD + dPs0 ;
6340 
6341                 TX = -Vxbgmtcl + ps_conv / 2 ;
6342                 if ( Ps0LD < TX ) Ps0LD = TX ;
6343 
6344                 /*-------------------------------------------*
6345                  * Check convergence.
6346                  *-----------------*/
6347                 if ( fabs( dPs0 ) <= ps_conv && fabs( Fs0 ) <= gs_conv ) {
6348                   flg_conv = 1 ;
6349                 }
6350 
6351             } /* end of Ps0LD Newton loop */
6352 
6353             /*-------------------------------------------*
6354              * Procedure for diverged case.
6355              *-----------------*/
6356             if ( flg_conv == 0 ) {
6357               fprintf( stderr ,
6358                        "*** warning(HiSIM_HV): Went Over Iteration Maximum (Ps0LD)\n" ) ;
6359               fprintf( stderr , " -Vxbgmtcl = %e   Vgbgmt = %e\n" , -Vxbgmtcl , Vgbgmt ) ;
6360             }
6361 
6362             /*---------------------------------------------------*
6363              * Evaluate derivatives of Ps0LD.
6364              *-----------------*/
6365 
6366             if ( Chi < znbd5 ) {
6367               fs01_dVbs = cfs1 * beta * fi * ( - fi + 2 * fi_dChi ) ; /* fs01_dVxbgmtcl */
6368               T2 = 1.0e0 / ( fs02 + fs02 ) ;
6369               fs02_dVbs = ( + beta * fb_dChi * 2 * fb + fs01_dVbs ) * T2 ; /* fs02_dVxbgmtcl */
6370             } else {
6371               if ( Chi < large_arg ) {
6372                 fs01_dVbs = + cfs1 * beta ; /* fs01_dVxbgmtcl */
6373               } else {
6374                 fs01_dVbs   = + cfs1 * beta ;
6375               }
6376               T2 = 0.5e0 / fs02 ;
6377               fs02_dVbs = ( + beta + fs01_dVbs ) * T2 ; /* fs02_dVxbgmtcl */
6378             }
6379 
6380             T1 = 1.0 / Fs0_dPs0 ;
6381             Ps0LD_dVxb = - ( - fac1 * fs02_dVbs ) * T1 ;
6382             Ps0LD_dVds = 0.0 ;
6383             Ps0LD_dVgb = - ( VgpLD_dVgb - fac1_dVgs * fs02 ) * T1 ;
6384 
6385 
6386             if ( Chi < znbd5 ) {
6387               /*-------------------------------------------*
6388                * zone-D1/D2. (Ps0LD)
6389                *-----------------*/
6390               if ( Chi < znbd3 ) { flg_ovzone = 1; }
6391                             else { flg_ovzone = 2; }
6392 
6393               Xi0 = fb * fb + epsm10 ;
6394               T1 = 2 * fb * fb_dChi * beta ;
6395               Xi0_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0_dVxbgmtcl */
6396               Xi0_dVds = T1 * Ps0LD_dVds ;
6397               Xi0_dVgs = T1 * Ps0LD_dVgb ;
6398 
6399               Xi0p12 = fb + epsm10 ;
6400               T1 = fb_dChi * beta ;
6401               Xi0p12_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0p12_dVxbgmtcl */
6402               Xi0p12_dVds = T1 * Ps0LD_dVds ;
6403               Xi0p12_dVgs = T1 * Ps0LD_dVgb ;
6404 
6405               Xi0p32 = fb * fb * fb + epsm10 ;
6406               T1 = 3 * fb * fb * fb_dChi * beta ;
6407               Xi0p32_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0p32_dVxbgmtcl */
6408               Xi0p32_dVds = T1 * Ps0LD_dVds ;
6409               Xi0p32_dVgs = T1 * Ps0LD_dVgb ;
6410 
6411             } else {
6412               /*-------------------------------------------*
6413                * zone-D3. (Ps0LD)
6414                *-----------------*/
6415               flg_ovzone = 3 ;
6416 
6417               Xi0 = Chi - 1.0e0 ;
6418               Xi0_dVbs = beta * ( Ps0LD_dVxb + 1.0e0 ) ; /* Xi0_dVxbgmtcl */
6419               Xi0_dVds = beta * Ps0LD_dVds ;
6420               Xi0_dVgs = beta * Ps0LD_dVgb ;
6421 
6422               Xi0p12 = sqrt( Xi0 ) ;
6423               T1 = 0.5e0 / Xi0p12 ;
6424               Xi0p12_dVbs = T1 * Xi0_dVbs ;
6425               Xi0p12_dVds = T1 * Xi0_dVds ;
6426               Xi0p12_dVgs = T1 * Xi0_dVgs ;
6427 
6428               Xi0p32 = Xi0 * Xi0p12 ;
6429               T1 = 1.5e0 * Xi0p12 ;
6430               Xi0p32_dVbs = T1 * Xi0_dVbs ;
6431               Xi0p32_dVds = T1 * Xi0_dVds ;
6432               Xi0p32_dVgs = T1 * Xi0_dVgs ;
6433 
6434               if ( Chi < large_arg ) {
6435               } else {
6436               }
6437             } /* end of if ( Chi  ... ) block */
6438 
6439             /*-----------------------------------------------------------*
6440              * - Recalculate the derivatives of fs01 and fs02.
6441              *-----------------*/
6442             fs01_dVbs = Ps0LD_dVxb * fs01_dPs0 + fs01_dVbs ;
6443             fs01_dVds = Ps0LD_dVds * fs01_dPs0 ;
6444             fs01_dVgs = Ps0LD_dVgb * fs01_dPs0 ;
6445             fs02_dVbs = Ps0LD_dVxb * fs02_dPs0 + fs02_dVbs ;
6446             fs02_dVxb = Ps0LD_dVds * fs02_dPs0 ;
6447             fs02_dVgb = Ps0LD_dVgb * fs02_dPs0 ;
6448 
6449             /*-----------------------------------------------------------*
6450              * QbuLD and QiuLD
6451              *-----------------*/
6452             QbuLD = here->HSM2_cnst0over * Xi0p12 ;
6453             QbuLD_dVxb = here->HSM2_cnst0over * Xi0p12_dVbs ;
6454             QbuLD_dVgb = here->HSM2_cnst0over * Xi0p12_dVgs ;
6455 
6456             T1 = 1.0 / ( fs02 + Xi0p12 ) ;
6457             QiuLD = here->HSM2_cnst0over * fs01 * T1 ;
6458             T2 = 1.0 / ( fs01 + epsm10 ) ;
6459             QiuLD_dVbs = QiuLD * ( fs01_dVbs * T2 - ( fs02_dVbs + Xi0p12_dVbs ) * T1 ) ;
6460             QiuLD_dVgs = QiuLD * ( fs01_dVgs * T2 - ( fs02_dVgb + Xi0p12_dVgs ) * T1 ) ;
6461 
6462             /*-----------------------------------------------------------*
6463              * Extrapolation: X_dVxbgmt = X_dVxbgmtcl * Vxbgmtcl_dVxbgmt
6464              *-----------------*/
6465             QbuLD_dVxb *= Vxbgmtcl_dVxbgmt ;
6466             QiuLD_dVbs *= Vxbgmtcl_dVxbgmt ;
6467 
6468             /*-----------------------------------------------------------*
6469              * Total overlap charge
6470              *-----------------*/
6471             QsuLD = QbuLD + QiuLD;
6472             QsuLD_dVxb = QbuLD_dVxb + QiuLD_dVbs;
6473             QsuLD_dVgb = QbuLD_dVgb + QiuLD_dVgs;
6474 
6475           } /* end of COQOVSM branches */
6476 
6477         } /* end of Vgbgmt region blocks */
6478 
6479 
6480         /* convert to source ref. */
6481         QsuLD_dVbs = - (QsuLD_dVxb + QsuLD_dVgb) ;
6482         QsuLD_dVds =    QsuLD_dVxb * flg_overd   ;
6483         QsuLD_dVgs =                 QsuLD_dVgb  ;
6484 
6485         QbuLD_dVbs = - (QbuLD_dVxb + QbuLD_dVgb) ;
6486         QbuLD_dVds =    QbuLD_dVxb * flg_overd   ;
6487         QbuLD_dVgs =                 QbuLD_dVgb  ;
6488 
6489         /* inversion charge = total - depletion */
6490         QiuLD = QsuLD - QbuLD  ;
6491         QiuLD_dVbs = QsuLD_dVbs - QbuLD_dVbs ;
6492         QiuLD_dVds = QsuLD_dVds - QbuLD_dVds ;
6493         QiuLD_dVgs = QsuLD_dVgs - QbuLD_dVgs ;
6494 
6495         /* assign final outputs of Qover model */
6496         /* note: Qovs and Qovd are exchanged in reverse mode */
6497         T4 = here->HSM2_weff_nf * Lov ;
6498 
6499         if(flg_ovloops) {
6500           Qovs =  T4 * QsuLD ;
6501           Qovs_dVbs = T4 * QsuLD_dVbs ;
6502           Qovs_dVds = T4 * QsuLD_dVds ;
6503           Qovs_dVgs = T4 * QsuLD_dVgs ;
6504           QisLD = T4 * QiuLD ;
6505           QisLD_dVbs = T4 * QiuLD_dVbs ;
6506           QisLD_dVds = T4 * QiuLD_dVds ;
6507           QisLD_dVgs = T4 * QiuLD_dVgs ;
6508           QbsLD = T4 * QbuLD ;
6509           QbsLD_dVbs = T4 * QbuLD_dVbs ;
6510           QbsLD_dVds = T4 * QbuLD_dVds ;
6511           QbsLD_dVgs = T4 * QbuLD_dVgs ;
6512         }
6513 
6514         if(flg_ovloopd) {
6515           Qovd =  T4 * QsuLD ;
6516           Qovd_dVbs = T4 * QsuLD_dVbs ;
6517           Qovd_dVds = T4 * QsuLD_dVds ;
6518           Qovd_dVgs = T4 * QsuLD_dVgs ;
6519           QidLD = T4 * QiuLD ;
6520           QidLD_dVbs = T4 * QiuLD_dVbs ;
6521           QidLD_dVds = T4 * QiuLD_dVds ;
6522           QidLD_dVgs = T4 * QiuLD_dVgs ;
6523           QbdLD = T4 * QbuLD ;
6524           QbdLD_dVbs = T4 * QbuLD_dVbs ;
6525           QbdLD_dVds = T4 * QbuLD_dVds ;
6526           QbdLD_dVgs = T4 * QbuLD_dVgs ;
6527         }
6528 
6529       } /* end of lcover loop */
6530 
6531       /* convert to the derivatives w.r.t. mode-dependent biases */
6532       Qovs_dVds = ModeNML * Qovs_dVds
6533        - ModeRVS * ( Qovs_dVds + Qovs_dVgs + Qovs_dVbs ) ;
6534       QisLD_dVds = ModeNML * QisLD_dVds
6535        - ModeRVS * ( QisLD_dVds + QisLD_dVgs + QisLD_dVbs ) ;
6536       QbsLD_dVds = ModeNML * QbsLD_dVds
6537        - ModeRVS * ( QbsLD_dVds + QbsLD_dVgs + QbsLD_dVbs ) ;
6538       Qovd_dVds = ModeNML * Qovd_dVds
6539        - ModeRVS * ( Qovd_dVds + Qovd_dVgs + Qovd_dVbs );
6540       QidLD_dVds = ModeNML * QidLD_dVds
6541        - ModeRVS * ( QidLD_dVds + QidLD_dVgs + QidLD_dVbs ) ;
6542       QbdLD_dVds = ModeNML * QbdLD_dVds
6543        - ModeRVS * ( QbdLD_dVds + QbdLD_dVgs + QbdLD_dVbs ) ;
6544 
6545     } /* end of if ( pParam->HSM2_nover == 0.0 ) */
6546 
6547     /*-----------------------------------*
6548      * Additional constant capacitance model
6549      *-----------------*/
6550     flg_overgiven = ( (int)ModeRVS * model->HSM2_cgso_Given
6551                     + (int)ModeNML * model->HSM2_cgdo_Given  ) ;
6552     if ( flg_overgiven ) {
6553       Cgdo  = ModeRVS * pParam->HSM2_cgso + ModeNML * pParam->HSM2_cgdo ;
6554       Cgdo *= - here->HSM2_weff_nf ;
6555 
6556       Qgod += - Cgdo * (Vgs - Vds) ;
6557       Qgod_dVds +=  Cgdo ;
6558       Qgod_dVgs += -Cgdo ;
6559     }
6560 
6561     flg_overgiven = ( (int)ModeNML * model->HSM2_cgso_Given
6562                     + (int)ModeRVS * model->HSM2_cgdo_Given ) ;
6563     if(flg_overgiven) {
6564       Cgso  = ModeNML * pParam->HSM2_cgso + ModeRVS * pParam->HSM2_cgdo ;
6565       Cgso *= - here->HSM2_weff_nf ;
6566 
6567       Qgos += - Cgso * Vgs ;
6568       Qgos_dVgs += -Cgso ;
6569     }
6570 
6571   } else { /* else case of if ( model->HSM2_coovlp >= 1 ) */
6572     if ( (here->HSM2_mode == HiSIM_NORMAL_MODE && !model->HSM2_cgdo_Given) ||
6573 	 (here->HSM2_mode != HiSIM_NORMAL_MODE && !model->HSM2_cgso_Given) ) {
6574       Cgdo = - Cox0 * pParam->HSM2_lover * here->HSM2_weff_nf ;
6575     } else {
6576       Cgdo  = ModeRVS * pParam->HSM2_cgso + ModeNML * pParam->HSM2_cgdo ;
6577       Cgdo *= - here->HSM2_weff_nf ;
6578     }
6579     Qgod = - Cgdo * (Vgs - Vds) ;
6580     Qgod_dVbs = 0.0 ;
6581     Qgod_dVds = Cgdo ;
6582     Qgod_dVgs = - Cgdo ;
6583 
6584     if ( (here->HSM2_mode == HiSIM_NORMAL_MODE && !model->HSM2_cgso_Given) ||
6585          (here->HSM2_mode != HiSIM_NORMAL_MODE && !model->HSM2_cgdo_Given) ) {
6586       Cgso = - Cox0 * pParam->HSM2_lover * here->HSM2_weff_nf ;
6587     } else {
6588       Cgso  = ModeNML * pParam->HSM2_cgso + ModeRVS * pParam->HSM2_cgdo ;
6589       Cgso *= - here->HSM2_weff_nf ;
6590     }
6591     Qgos = - Cgso * Vgs ;
6592     Qgos_dVbs = 0.0 ;
6593     Qgos_dVds = 0.0 ;
6594     Qgos_dVgs = - Cgso ;
6595   } /* end of if ( model->HSM2_coovlp >= 1 ) */
6596 
6597   /*-------------------------------------------*
6598    * Gate/Bulk overlap charge: Qgbo
6599    *-----------------*/
6600   Cgbo_loc = - model->HSM2_cgbo * here->HSM2_lgate ;
6601   Qgbo = - Cgbo_loc * (Vgs -Vbs) ;
6602   Qgbo_dVgs = - Cgbo_loc ;
6603   Qgbo_dVbs =   Cgbo_loc ;
6604   Qgbo_dVds = 0.0 ;
6605 
6606   /*---------------------------------------------------*
6607    * Lateral-field-induced capacitance.
6608    *-----------------*/
6609   if ( model->HSM2_coqy == 0 || model->HSM2_xqy == 0 ){
6610     Qy = 0.0e0 ;
6611     Qy_dVds = 0.0e0 ;
6612     Qy_dVgs = 0.0e0 ;
6613     Qy_dVbs = 0.0e0 ;
6614   } else {
6615     Pslk = Ec * Leff + Ps0 ;
6616     Pslk_dVbs = Ec_dVbs * Leff + Ps0_dVbs;
6617     Pslk_dVds = Ec_dVds * Leff + Ps0_dVds;
6618     Pslk_dVgs = Ec_dVgs * Leff + Ps0_dVgs;
6619     Fn_SU2( T10, (Pslk + C_PSLK_SHIFT), (Psdl + C_PSLK_SHIFT), C_PSLK_DELTA, T1, T2 );
6620     Pslk_dVbs = Pslk_dVbs * T1 + Psdl_dVbs * T2;
6621     Pslk_dVds = Pslk_dVds * T1 + Psdl_dVds * T2;
6622     Pslk_dVgs = Pslk_dVgs * T1 + Psdl_dVgs * T2;
6623     Pslk = T10 - C_PSLK_SHIFT;
6624 
6625     /* suppress Qy in accumulation region */
6626     /*
6627     Aclm_eff = 1.0 - Pds / (eps_qy + Pds) * (1.0 - Aclm) ;
6628     Aclm_eff_dVds = eps_qy * Pds_dVds / ((eps_qy + Pds)*(eps_qy + Pds)) ;
6629     Aclm_eff_dVgs = eps_qy * Pds_dVgs / ((eps_qy + Pds)*(eps_qy + Pds)) ;
6630     Aclm_eff_dVbs = eps_qy * Pds_dVbs / ((eps_qy + Pds)*(eps_qy + Pds)) ;
6631     */
6632 
6633     Aclm_eff = Aclm ; Aclm_eff_dVds = Aclm_eff_dVgs = Aclm_eff_dVbs = 0.0 ;
6634 
6635     T1 = Aclm_eff * ( Vds + Ps0 ) + ( 1.0e0 - Aclm_eff ) * Pslk ;
6636     T1_dVb = Aclm_eff * (  Ps0_dVbs ) + ( 1.0e0 - Aclm_eff ) * Pslk_dVbs
6637              + Aclm_eff_dVbs * ( Vds + Ps0 - Pslk ) ;
6638     T1_dVd = Aclm_eff * ( 1.0 + Ps0_dVds ) + ( 1.0e0 - Aclm_eff ) * Pslk_dVds
6639              + Aclm_eff_dVds * ( Vds + Ps0 - Pslk ) ;
6640     T1_dVg = Aclm_eff * (  Ps0_dVgs ) + ( 1.0e0 - Aclm_eff ) * Pslk_dVgs
6641              + Aclm_eff_dVgs * ( Vds + Ps0 - Pslk ) ;
6642     T10 = here->HSM2_wdpl ;
6643     T3 = T10 * 1.3 ;
6644     T2 = C_ESI * here->HSM2_weff_nf * T3 ;
6645     T7 = 1.0e-9 ; /* 1nm */
6646     T0 = Fn_Max( model->HSM2_xqy , T7 ) ;
6647     T4 = T2 / T0 ;
6648     Qy =       - ( Ps0      + Vds   - T1     ) * T4 ;
6649     Qy_dVds =  - ( Ps0_dVds + 1.0e0 - T1_dVd ) * T4 ;
6650     Qy_dVgs =  - ( Ps0_dVgs         - T1_dVg ) * T4 ;
6651     Qy_dVbs =  - ( Ps0_dVbs         - T1_dVb ) * T4 ;
6652 
6653 
6654   }
6655 
6656   if ( model->HSM2_xqy1 != 0.0 ){
6657     Qy += here->HSM2_cqyb0 * Vbs ;
6658     Qy_dVbs += here->HSM2_cqyb0 ;
6659   }
6660 
6661   Qy      = Qy * FMDVDS ;
6662   Qy_dVbs = Qy_dVbs * FMDVDS + Qy * FMDVDS_dVbs ;
6663   Qy_dVds = Qy_dVds * FMDVDS + Qy * FMDVDS_dVds ;
6664   Qy_dVgs = Qy_dVgs * FMDVDS + Qy * FMDVDS_dVgs ;
6665 
6666   /*---------------------------------------------------*
6667    * Fringing capacitance.
6668    *-----------------*/
6669   Cf = here->HSM2_cfrng ;
6670   Qfd = Cf * ( Vgs - Vds ) ;
6671   Qfs = Cf * Vgs ;
6672 
6673   /*-----------------------------------------------------------*
6674    * End of PART-3. (label)
6675    *-----------------*/
6676 
6677 /* end_of_part_3:*/
6678 
6679   /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6680    * PART-4: Substrate-source/drain junction diode.
6681    *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
6682 
6683   /*-----------------------------------------------------------*
6684    * Cbsj, Cbdj: node-base S/D biases.
6685    *-----------------*/
6686 
6687   T10 = model->HSM2_cvb * here->HSM2_jd_nvtm_inv ;
6688   T11 = model->HSM2_cvbk * here->HSM2_jd_nvtm_inv ;
6689 
6690   T9 = model->HSM2_cisb * here->HSM2_exptemp ;
6691   T0 = here->HSM2_isbd2 * T9 ;
6692 
6693   T2 = exp (- vbd_jct * T10 );
6694   T2_dVb = - T2 * T10 ;
6695 
6696   T3 = exp (- vbd_jct * T11 );
6697   T3_dVb = - T3 * T11 ;
6698 
6699 
6700   /* ibd */
6701   if ( vbd_jct < here->HSM2_vbdt ) {
6702     TX = vbd_jct * here->HSM2_jd_nvtm_inv ;
6703     if ( TX < - EXP_THR ) {
6704       T1 = 0.0 ;
6705       T1_dVb = 0.0 ;
6706     } else {
6707       T1 = exp ( TX ) ;
6708       T1_dVb = T1 * here->HSM2_jd_nvtm_inv ;
6709     }
6710 
6711     Ibd = here->HSM2_isbd * (T1 - 1.0)
6712       + T0 * (T2 - 1.0)
6713       + pParam->HSM2_cisbk * (T3 - 1.0);
6714     Gbd = here->HSM2_isbd * T1_dVb
6715       + T0 * T2_dVb
6716       + pParam->HSM2_cisbk * T3_dVb ;
6717 
6718   } else {
6719     T1 = here->HSM2_jd_expcd ;
6720 
6721     T4 = here->HSM2_isbd * here->HSM2_jd_nvtm_inv  * T1 ;
6722 
6723     Ibd = here->HSM2_isbd * (T1 - 1.0)
6724       + T4 * (vbd_jct - here->HSM2_vbdt)
6725       + T0 * (T2 - 1.0)
6726       + pParam->HSM2_cisbk * (T3 - 1.0) ;
6727     Gbd = T4
6728       + T0 * T2_dVb
6729       + pParam->HSM2_cisbk * T3_dVb ;
6730   }
6731   T12 = model->HSM2_divx * here->HSM2_isbd2 ;
6732   Ibd += T12 * vbd_jct ;
6733   Gbd += T12 ;
6734 
6735   /* ibs */
6736   T0 = here->HSM2_isbs2 * T9 ;
6737 
6738   TX = - vbs_jct * T10 ;
6739   if ( TX < - EXP_THR ) {
6740     T2 = 0.0 ;
6741     T2_dVb = 0.0 ;
6742   } else {
6743     T2 = exp ( TX );
6744     T2_dVb = - T2 * T10 ;
6745   }
6746 
6747   TX = - vbs_jct * T11 ;
6748   if ( TX < - EXP_THR ) {
6749     T3 = 0.0 ;
6750     T3_dVb = 0.0 ;
6751   } else {
6752     T3 = exp ( TX );
6753     T3_dVb = - T3 * T11 ;
6754   }
6755 
6756   if ( vbs_jct < here->HSM2_vbst ) {
6757     TX = vbs_jct * here->HSM2_jd_nvtm_inv ;
6758     if ( TX < - EXP_THR ) {
6759       T1 = 0.0 ;
6760       T1_dVb = 0.0 ;
6761     } else {
6762       T1 = exp ( TX ) ;
6763       T1_dVb = T1 * here->HSM2_jd_nvtm_inv ;
6764     }
6765     Ibs = here->HSM2_isbs * (T1 - 1.0)
6766       + T0 * (T2 - 1.0)
6767       + pParam->HSM2_cisbk * (T3 - 1.0);
6768     Gbs = here->HSM2_isbs * T1_dVb
6769       + T0 * T2_dVb
6770       + pParam->HSM2_cisbk * T3_dVb ;
6771   } else {
6772     T1 = here->HSM2_jd_expcs ;
6773 
6774     T4 = here->HSM2_isbs * here->HSM2_jd_nvtm_inv  * T1 ;
6775 
6776     Ibs = here->HSM2_isbs * (T1 - 1.0)
6777       + T4 * (vbs_jct - here->HSM2_vbst)
6778       + T0 * (T2 - 1.0)
6779       + pParam->HSM2_cisbk * (T3 - 1.0) ;
6780     Gbs = T4
6781       + T0 * T2_dVb
6782       + pParam->HSM2_cisbk * T3_dVb ;
6783   }
6784   T12 = model->HSM2_divx * here->HSM2_isbs2 ;
6785   Ibs += T12 * vbs_jct ;
6786   Gbs += T12 ;
6787 
6788   /*---------------------------------------------------*
6789    * Add Gjmin.
6790    *-----------------*/
6791     Ibd += Gjmin * vbd_jct ;
6792     Ibs += Gjmin * vbs_jct ;
6793 
6794     Gbd += Gjmin ;
6795     Gbs += Gjmin ;
6796 
6797   /*-----------------------------------------------------------*
6798    * Charges and Capacitances.
6799    *-----------------*/
6800   /*  charge storage elements
6801    *  bulk-drain and bulk-source depletion capacitances
6802    *  czbd : zero bias drain junction capacitance
6803    *  czbs : zero bias source junction capacitance
6804    *  czbdsw:zero bias drain junction sidewall capacitance
6805    *  czbssw:zero bias source junction sidewall capacitance
6806    */
6807   /*  add new parameters
6808       tcjbs	: temperature dependence of czbs
6809       tcjbd	: temperature dependence of czbd
6810       tcjbssw	: temperature dependence of czbssw
6811       tcjbdsw	: temperature dependence of czbdsw
6812       tcjbsswg	: temperature dependence of czbsswg
6813       tcjbdswg	: temperature dependence of czbdswg
6814   */
6815   tcjbd=model->HSM2_tcjbd;
6816   tcjbs=model->HSM2_tcjbs;
6817   tcjbdsw=model->HSM2_tcjbdsw;
6818   tcjbssw=model->HSM2_tcjbssw;
6819   tcjbdswg=model->HSM2_tcjbdswg;
6820   tcjbsswg=model->HSM2_tcjbsswg;
6821 
6822   czbs = model->HSM2_cj * here->HSM2_as ;
6823   czbs = czbs * ( 1.0 + tcjbs * ( TTEMP - model->HSM2_ktnom )) ;
6824 
6825   czbd = model->HSM2_cj * here->HSM2_ad ;
6826   czbd = czbd * ( 1.0 + tcjbd * ( TTEMP - model->HSM2_ktnom )) ;
6827 
6828   /* Source Bulk Junction */
6829   if (here->HSM2_ps > here->HSM2_weff_nf) {
6830     czbssw = model->HSM2_cjsw * ( here->HSM2_ps - here->HSM2_weff_nf ) ;
6831     czbssw = czbssw * ( 1.0 + tcjbssw * ( TTEMP - model->HSM2_ktnom )) ;
6832 
6833     czbsswg = model->HSM2_cjswg * here->HSM2_weff_nf ;
6834     czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSM2_ktnom )) ;
6835 
6836     if (vbs_jct == 0.0) {
6837       Qbs = 0.0 ;
6838       Capbs = czbs + czbssw + czbsswg ;
6839     } else if (vbs_jct < 0.0) {
6840       if (czbs > 0.0) {
6841         arg = 1.0 - vbs_jct / model->HSM2_pb ;
6842         if (model->HSM2_mj == 0.5)
6843           sarg = 1.0 / sqrt(arg) ;
6844         else
6845           sarg = Fn_Pow( arg , -model->HSM2_mj ) ;
6846         Qbs = model->HSM2_pb * czbs * (1.0 - arg * sarg) / (1.0 - model->HSM2_mj) ;
6847         Capbs = czbs * sarg ;
6848       } else {
6849         Qbs = 0.0 ;
6850         Capbs = 0.0 ;
6851       }
6852       if (czbssw > 0.0) {
6853         arg = 1.0 - vbs_jct / model->HSM2_pbsw ;
6854         if (model->HSM2_mjsw == 0.5)
6855           sarg = 1.0 / sqrt(arg) ;
6856         else
6857           sarg = Fn_Pow( arg , -model->HSM2_mjsw ) ;
6858         Qbs += model->HSM2_pbsw * czbssw * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjsw) ;
6859         Capbs += czbssw * sarg ;
6860       }
6861       if (czbsswg > 0.0) {
6862         arg = 1.0 - vbs_jct / model->HSM2_pbswg ;
6863         if (model->HSM2_mjswg == 0.5)
6864           sarg = 1.0 / sqrt(arg) ;
6865         else
6866           sarg = Fn_Pow( arg , -model->HSM2_mjswg ) ;
6867         Qbs += model->HSM2_pbswg * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjswg) ;
6868         Capbs += czbsswg * sarg ;
6869       }
6870     } else {
6871       T1 = czbs + czbssw + czbsswg ;
6872       T2 = czbs * model->HSM2_mj / model->HSM2_pb
6873         + czbssw * model->HSM2_mjsw / model->HSM2_pbsw
6874         + czbsswg * model->HSM2_mjswg / model->HSM2_pbswg ;
6875       Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ;
6876       Capbs = T1 + vbs_jct * T2 ;
6877     }
6878   } else {
6879     czbsswg = model->HSM2_cjswg * here->HSM2_ps ;
6880     czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSM2_ktnom )) ;
6881     if (vbs_jct == 0.0) {
6882       Qbs = 0.0 ;
6883       Capbs = czbs + czbsswg ;
6884     } else if (vbs_jct < 0.0) {
6885       if (czbs > 0.0) {
6886         arg = 1.0 - vbs_jct / model->HSM2_pb ;
6887         if (model->HSM2_mj == 0.5)
6888           sarg = 1.0 / sqrt(arg) ;
6889         else
6890           sarg = Fn_Pow( arg , -model->HSM2_mj ) ;
6891         Qbs = model->HSM2_pb * czbs * (1.0 - arg * sarg) / (1.0 - model->HSM2_mj) ;
6892         Capbs = czbs * sarg ;
6893       } else {
6894         Qbs = 0.0 ;
6895         Capbs = 0.0 ;
6896       }
6897       if (czbsswg > 0.0) {
6898         arg = 1.0 - vbs_jct / model->HSM2_pbswg ;
6899         if (model->HSM2_mjswg == 0.5)
6900           sarg = 1.0 / sqrt(arg) ;
6901         else
6902           sarg = Fn_Pow( arg , -model->HSM2_mjswg ) ;
6903         Qbs += model->HSM2_pbswg * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjswg) ;
6904         Capbs += czbsswg * sarg ;
6905       }
6906     } else {
6907       T1 = czbs + czbsswg ;
6908       T2 = czbs * model->HSM2_mj / model->HSM2_pb
6909         + czbsswg * model->HSM2_mjswg / model->HSM2_pbswg ;
6910       Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ;
6911       Capbs = T1 + vbs_jct * T2 ;
6912     }
6913   }
6914 
6915   /* Drain Bulk Junction */
6916   if (here->HSM2_pd > here->HSM2_weff_nf) {
6917     czbdsw = model->HSM2_cjsw * ( here->HSM2_pd - here->HSM2_weff_nf ) ;
6918     czbdsw = czbdsw * ( 1.0 + tcjbdsw * ( TTEMP - model->HSM2_ktnom )) ;
6919     czbdswg = model->HSM2_cjswg * here->HSM2_weff_nf ;
6920     czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSM2_ktnom )) ;
6921     if (vbd_jct == 0.0) {
6922       Qbd = 0.0 ;
6923       Capbd = czbd + czbdsw + czbdswg ;
6924     } else if (vbd_jct < 0.0) {
6925       if (czbd > 0.0) {
6926         arg = 1.0 - vbd_jct / model->HSM2_pb ;
6927         if (model->HSM2_mj == 0.5)
6928           sarg = 1.0 / sqrt(arg) ;
6929         else
6930           sarg = Fn_Pow( arg , -model->HSM2_mj ) ;
6931         Qbd = model->HSM2_pb * czbd * (1.0 - arg * sarg) / (1.0 - model->HSM2_mj) ;
6932         Capbd = czbd * sarg ;
6933       } else {
6934         Qbd = 0.0 ;
6935         Capbd = 0.0 ;
6936       }
6937       if (czbdsw > 0.0) {
6938         arg = 1.0 - vbd_jct / model->HSM2_pbsw ;
6939         if (model->HSM2_mjsw == 0.5)
6940           sarg = 1.0 / sqrt(arg) ;
6941         else
6942           sarg = Fn_Pow( arg , -model->HSM2_mjsw ) ;
6943         Qbd += model->HSM2_pbsw * czbdsw * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjsw) ;
6944         Capbd += czbdsw * sarg ;
6945       }
6946       if (czbdswg > 0.0) {
6947         arg = 1.0 - vbd_jct / model->HSM2_pbswg ;
6948         if (model->HSM2_mjswg == 0.5)
6949           sarg = 1.0 / sqrt(arg) ;
6950         else
6951           sarg = Fn_Pow( arg , -model->HSM2_mjswg ) ;
6952         Qbd += model->HSM2_pbswg * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjswg) ;
6953         Capbd += czbdswg * sarg ;
6954       }
6955     } else {
6956       T1 = czbd + czbdsw + czbdswg ;
6957       T2 = czbd * model->HSM2_mj / model->HSM2_pb
6958         + czbdsw * model->HSM2_mjsw / model->HSM2_pbsw
6959         + czbdswg * model->HSM2_mjswg / model->HSM2_pbswg ;
6960       Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ;
6961       Capbd = T1 + vbd_jct * T2 ;
6962     }
6963 
6964   } else {
6965     czbdswg = model->HSM2_cjswg * here->HSM2_pd ;
6966     czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSM2_ktnom )) ;
6967     if (vbd_jct == 0.0) {
6968       Qbd = 0.0 ;
6969       Capbd = czbd + czbdswg ;
6970     } else if (vbd_jct < 0.0) {
6971       if (czbd > 0.0) {
6972         arg = 1.0 - vbd_jct / model->HSM2_pb ;
6973         if (model->HSM2_mj == 0.5)
6974           sarg = 1.0 / sqrt(arg) ;
6975         else
6976           sarg = Fn_Pow( arg , -model->HSM2_mj ) ;
6977         Qbd = model->HSM2_pb * czbd * (1.0 - arg * sarg) / (1.0 - model->HSM2_mj) ;
6978         Capbd = czbd * sarg ;
6979       } else {
6980         Qbd = 0.0 ;
6981         Capbd = 0.0 ;
6982       }
6983       if (czbdswg > 0.0) {
6984         arg = 1.0 - vbd_jct / model->HSM2_pbswg ;
6985         if (model->HSM2_mjswg == 0.5)
6986           sarg = 1.0 / sqrt(arg) ;
6987         else
6988           sarg = Fn_Pow( arg , -model->HSM2_mjswg ) ;
6989         Qbd += model->HSM2_pbswg * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjswg) ;
6990         Capbd += czbdswg * sarg ;
6991       }
6992     } else {
6993       T1 = czbd + czbdswg ;
6994       T2 = czbd * model->HSM2_mj / model->HSM2_pb
6995         + czbdswg * model->HSM2_mjswg / model->HSM2_pbswg ;
6996       Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ;
6997       Capbd = T1 + vbd_jct * T2 ;
6998     }
6999   }
7000 
7001   /*-----------------------------------------------------------*
7002    * End of PART-4. (label)
7003    *-----------------*/
7004 
7005 /* end_of_part_4:*/
7006 
7007 
7008 
7009   /*-----------------------------------------------------------*
7010    * PART-5: NQS. (label)
7011    *-----------------*/
7012   if (flg_nqs) {
7013 
7014     if(ckt->CKTmode & MODETRAN){
7015       if( ckt->CKTmode & MODEINITTRAN ){
7016         Qi_nqs = Qi ;
7017         Qi_dVgs_nqs = Qi_dVgs ;
7018         Qi_dVds_nqs = Qi_dVds ;
7019         Qi_dVbs_nqs = Qi_dVbs ;
7020 
7021         Qb_nqs = Qb ;
7022         Qb_dVgs_nqs = Qb_dVgs ;
7023         Qb_dVds_nqs = Qb_dVds ;
7024         Qb_dVbs_nqs = Qb_dVbs ;
7025       } else {
7026         /* tau for inversion charge */
7027         if (flg_noqi == 0) {
7028           T12 = model->HSM2_dly1;
7029           T10 = model->HSM2_dly2;
7030 
7031           T3 = Lch ;
7032           T1 = T10 * T12 * T3 * T3 ;
7033           T2 = Mu * VgVt * T12 + T10 * T3 * T3 + small ;
7034           tau = T1 / T2 ;
7035 
7036           T1_dVg = T10 * T12 * 2.0 * T3 * Lch_dVgs ;
7037           T1_dVd = T10 * T12 * 2.0 * T3 * Lch_dVds ;
7038           T1_dVb = T10 * T12 * 2.0 * T3 * Lch_dVbs ;
7039 
7040           T2_dVg = T12 * Mu_dVgs * VgVt
7041             + T12 * Mu * VgVt_dVgs + T10 * 2.0 * T3 * Lch_dVgs ;
7042           T2_dVd = T12 * Mu_dVds * VgVt
7043             + T12 * Mu * VgVt_dVds + T10 * 2.0 * T3 * Lch_dVds ;
7044           T2_dVb = T12 * Mu_dVbs * VgVt
7045             + T12 * Mu * VgVt_dVbs + T10 * 2.0 * T3 * Lch_dVbs ;
7046 
7047           T4 = 1.0 / ( T2 * T2 ) ;
7048           tau_dVgs = ( T2 * T1_dVg - T1 * T2_dVg ) * T4 ;
7049           tau_dVds = ( T2 * T1_dVd - T1 * T2_dVd ) * T4 ;
7050           tau_dVbs = ( T2 * T1_dVb - T1 * T2_dVb ) * T4 ;
7051         } else {
7052           tau = model->HSM2_dly1 + small ;
7053           tau_dVgs = tau_dVds = tau_dVbs = 0.0 ;
7054         }
7055 
7056         T1 = ckt->CKTdelta ;
7057 
7058         /* Calculation of Qi */
7059         Qi_prev = *(ckt->CKTstate1 + here->HSM2qi_nqs) ;
7060         T2 = T1 + tau ;
7061         T0 = Qi - Qi_prev ;
7062         Qi_nqs = Qi_prev + T1 / T2 * T0;
7063         T3 = T1 / T2 ;
7064         T4 = T0 / T2 ;
7065         Qi_dVgs_nqs = T3 * (Qi_dVgs - T4 * tau_dVgs);
7066         Qi_dVds_nqs = T3 * (Qi_dVds - T4 * tau_dVds);
7067         Qi_dVbs_nqs = T3 * (Qi_dVbs - T4 * tau_dVbs);
7068 
7069         /* tau for bulk charge */
7070         T2 = modelMKS->HSM2_dly3 ;
7071         taub = T2 * Cox ;
7072         taub_dVgs = T2 * Cox_dVg ;
7073         taub_dVds = T2 * Cox_dVd ;
7074         taub_dVbs = T2 * Cox_dVb ;
7075         /* Calculation of Qb */
7076         Qb_prev = *(ckt->CKTstate1 + here->HSM2qb_nqs) ;
7077         T2 = T1 + taub ;
7078         T0 = Qb - Qb_prev ;
7079         Qb_nqs = Qb_prev + T1 / T2 * T0 ;
7080         T3 = T1 / T2 ;
7081         T4 = T0 / T2 ;
7082         Qb_dVgs_nqs = T3 * (Qb_dVgs - T4 * taub_dVgs) ;
7083         Qb_dVds_nqs = T3 * (Qb_dVds - T4 * taub_dVds) ;
7084         Qb_dVbs_nqs = T3 * (Qb_dVbs - T4 * taub_dVbs) ;
7085       }
7086     } else { /* !(CKT_mode & MODETRAN) */
7087       Qi_nqs = Qi ;
7088       Qi_dVgs_nqs = Qi_dVgs ;
7089       Qi_dVds_nqs = Qi_dVds ;
7090       Qi_dVbs_nqs = Qi_dVbs ;
7091 
7092       Qb_nqs = Qb ;
7093       Qb_dVgs_nqs = Qb_dVgs ;
7094       Qb_dVds_nqs = Qb_dVds ;
7095       Qb_dVbs_nqs = Qb_dVbs ;
7096     }
7097   }
7098 
7099   if ( flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG)) ) { /* ACNQS */
7100 
7101     if (flg_noqi == 0) {
7102       T10 = model->HSM2_dly1 ;
7103       T11 = model->HSM2_dly2 ;
7104       T12 = Lch ;
7105 
7106       T1 = T10 * T11 * T12 * T12 ;
7107       T2 = Mu * VgVt * T10 + T11 * T12 * T12 + small ;
7108       tau = T1 / T2 ;
7109 
7110       T1_dVg = T10 * T11 * 2.0 * T12 * Lch_dVgs ;
7111       T1_dVd = T10 * T11 * 2.0 * T12 * Lch_dVds ;
7112       T1_dVb = T10 * T11 * 2.0 * T12 * Lch_dVbs ;
7113       T2_dVg = T10 * Mu_dVgs * VgVt + T10 * Mu * VgVt_dVgs
7114         + T11 * 2.0 * T12 * Lch_dVgs ;
7115       T2_dVd = T10 * Mu_dVds * VgVt + T10 * Mu * VgVt_dVds
7116         + T11 * 2.0 * T12 * Lch_dVds ;
7117       T2_dVb = T10 * Mu_dVbs * VgVt + T10 * Mu * VgVt_dVbs
7118         + T11 * 2.0 * T12 * Lch_dVbs ;
7119 
7120       T3 = 1.0 / T2 ;
7121       tau_dVgs = (T1_dVg - tau * T2_dVg) * T3 ;
7122       tau_dVds = (T1_dVd - tau * T2_dVd) * T3 ;
7123       tau_dVbs = (T1_dVb - tau * T2_dVb) * T3 ;
7124     } else {
7125       tau = model->HSM2_dly1 + small ;
7126       tau_dVgs = tau_dVds = tau_dVbs = 0.0 ;
7127     }
7128 
7129     T1 = modelMKS->HSM2_dly3 ;
7130     taub = T1 * Cox ;
7131     taub_dVgs = T1 * Cox_dVg ;
7132     taub_dVds = T1 * Cox_dVd ;
7133     taub_dVbs = T1 * Cox_dVb ;
7134   }
7135 
7136   /*-----------------------------------------------------------*
7137    * End of PART-5. (label)
7138    *-----------------*/
7139 /* end_of_part_5: */
7140 
7141   /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7142    * PART-6: Noise Calculation.
7143    *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
7144 
7145   /*-----------------------------------------------------------*
7146    * 1/f noise.
7147    *-----------------*/
7148   if ( model->HSM2_coflick != 0 && !flg_noqi ) {
7149 
7150     NFalp = pParam->HSM2_nfalp ;
7151     NFtrp = pParam->HSM2_nftrp ;
7152     Cit = modelMKS->HSM2_cit ;
7153 
7154     T1 = Qn0 / C_QE ;
7155     T2 = ( Cox + Qn0 / ( Ps0 - Vbs ) + Cit ) * beta_inv / C_QE ;
7156     T3 = -2.0E0 * Qi_noi / C_QE / Lch / here->HSM2_weff_nf - T1 ;
7157     if ( T3 != T1 ) {
7158       T4 = 1.0E0 / ( T1 + T2 ) / ( T3 + T2 ) + 2.0E0 * NFalp * Ey * Mu / ( T3 - T1 )
7159         * log( ( T3 + T2 ) / ( T1 + T2 ) ) + NFalp * Ey * Mu * NFalp * Ey * Mu ;
7160     }  else {
7161       T4 = 1.0 / ( T1 + T2 ) / ( T3 + T2 ) + 2.0 * NFalp * Ey * Mu / ( T1 + T2 )
7162         + NFalp * Ey * Mu * NFalp * Ey * Mu;
7163     }
7164     Nflic = Ids * Ids * NFtrp / ( Lch * beta * here->HSM2_weff_nf ) * T4 ;
7165   } else {
7166     Nflic = 0.0 ;
7167   }
7168 
7169   /*-----------------------------------------------------------*
7170    * thermal noise.
7171    *-----------------*/
7172   if ( model->HSM2_cothrml != 0 && !flg_noqi ) {
7173 
7174     Eyd = ( Psdl - Ps0 ) / Lch ;
7175     T12 = Muun * Eyd / C_vmax ;
7176     /* note: model->HSM2_bb = 2 (electron) ;1 (hole) */
7177     if ( 1.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 1.0e0 + epsm10 ) {
7178       T7  = 1.0e0 ;
7179     } else if ( 2.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 2.0e0 + epsm10 ) {
7180       T7  = T12 ;
7181     } else {
7182       T7  = Fn_Pow( Eyd, model->HSM2_bb - 1.0e0 ) ;
7183     }
7184     T8 = T12 * T7 ;
7185     T9 = 1.0e0 + T8 ;
7186     T10 = Fn_Pow( T9, ( - 1.0e0 / model->HSM2_bb - 1.0e0 ) ) ;
7187     T11 = T9 * T10 ;
7188     Mud_hoso = Muun * T11 ;
7189     Mu_Ave = ( Mu + Mud_hoso ) / 2.0 ;
7190 
7191     /* Sid_h = GAMMA * 4.0 * C_KB * model->HSM2_temp * gds0_h2; */
7192     T0 = Alpha * Alpha ;
7193     Nthrml  = here->HSM2_weff_nf * Cox * VgVt * Mu
7194       * ( ( 1e0 + 3e0 * Alpha + 6e0 * T0 ) * Mud_hoso * Mud_hoso
7195           + ( 3e0 + 4e0 * Alpha + 3e0 * T0 ) * Mud_hoso * Mu
7196           + ( 6e0 + 3e0 * Alpha + T0 ) * Mu * Mu )
7197       / ( 15e0 * Lch * ( 1e0 + Alpha ) * Mu_Ave * Mu_Ave ) ;
7198   } else {
7199     Nthrml = 0e0 ;
7200   }
7201 
7202 
7203   /*----------------------------------------------------------*
7204    * induced gate noise. ( Part 2/3 )
7205    *----------------------*/
7206   if ( model->HSM2_coign != 0 && model->HSM2_cothrml != 0 && flg_ign == 1 && !flg_noqi ) {
7207     sqrtkusaiL = sqrt( kusaiL ) ;
7208     T2 = VgVt + sqrtkusaiL ;
7209     T3 = kusai00 * kusai00 ;
7210     T4 = kusaiL * kusaiL ;
7211     T5 = 42.0e0 * kusai00 * kusaiL ;
7212     T5 += 4.0e0 * ( T3 + T4 ) ;
7213     T5 += 20.0e0 * sqrtkusaiL * VgVt * ( kusai00 + kusaiL ) ;
7214     T10 = T2 * T2 ;
7215     T10 *= T10 ;
7216     kusai_ig = T5 / ( T10 * T2 ) ; /* Induced Gate Noise parameter */
7217     gds0_ign = here->HSM2_weff_nf / Lch * Mu * Cox ;
7218     gds0_h2 = gds0_ign * VgVt ;
7219     GAMMA = Nthrml / gds0_h2 ;
7220     T7 = kusai00 + 4.0e0 * VgVt * sqrtkusaiL + kusaiL ;
7221     /* cross-correlation coefficient (= Sigid/sqrt(Sig*Sid) ) */
7222     crl_f = c_sqrt_15 * kusai00L * T7
7223       / ( 6.0e0 * T2 * sqrt( GAMMA * T2 * VgVt * T5 ) ) ;
7224   }
7225 
7226 
7227   /*-----------------------------------------------------------*
7228    * End of PART-6. (label)
7229    *-----------------*/
7230 /* end_of_part_6: */
7231 
7232 
7233   /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7234    * PART-7: Evaluation of outputs.
7235    *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
7236 
7237   /*-----------------------------------------------------------*
7238    * Implicit quantities related to Alpha.
7239    *-----------------*/
7240   /* note: T1 = 1 + Delta */
7241   if ( flg_noqi == 0 && VgVt > VgVt_small ) {
7242     Delta = fac1 * beta / ( 2 * Xi0p12 ) ;
7243     Pslsat = VgVt / ( 1.0 + Delta ) + Ps0 ;
7244   } else {
7245     Pslsat = 0.0 ;
7246   }
7247   Vdsat = Pslsat - Pb2 ;
7248   if ( Vdsat < 0.0 ) {
7249     Vdsat = 0.0 ;
7250   }
7251 
7252   /*-----------------------------------------------------------*
7253    * Evaluate the derivatives w.r.t. external biases.
7254    * - All derivatives that influence outputs must be modified here.
7255    *-----------------*/
7256 
7257   /*---------------------------------------------------*
7258    * Case ignoring Rs/Rd.
7259    *-----------------*/
7260   if ( flg_rsrd != 1 || Ids < 0.0 ) {
7261     Ids_dVbse = Ids_dVbs ; Ids_dVdse = Ids_dVds ; Ids_dVgse = Ids_dVgs ;
7262     Qb_dVbse = Qb_dVbs ; Qb_dVdse = Qb_dVds ; Qb_dVgse = Qb_dVgs ;
7263     Qi_dVbse = Qi_dVbs ; Qi_dVdse = Qi_dVds ; Qi_dVgse = Qi_dVgs ;
7264     Qd_dVbse = Qd_dVbs ; Qd_dVdse = Qd_dVds ; Qd_dVgse = Qd_dVgs ;
7265     Isub_dVbse = Isub_dVbs ; Isub_dVdse = Isub_dVds ; Isub_dVgse = Isub_dVgs ;
7266     IdsIBPC_dVbse = IdsIBPC_dVbs ; IdsIBPC_dVdse = IdsIBPC_dVds ; IdsIBPC_dVgse = IdsIBPC_dVgs ;
7267     Igate_dVbse = Igate_dVbs ; Igate_dVdse = Igate_dVds ; Igate_dVgse = Igate_dVgs ;
7268     Igd_dVbse = Igd_dVbs ; Igd_dVdse = Igd_dVds ; Igd_dVgse = Igd_dVgs ;
7269     Igs_dVbse = Igs_dVbs ; Igs_dVdse = Igs_dVds ; Igs_dVgse = Igs_dVgs ;
7270     Igb_dVbse = Igb_dVbs ; Igb_dVdse = Igb_dVds ; Igb_dVgse = Igb_dVgs ;
7271     Igidl_dVbse = Igidl_dVbs ; Igidl_dVdse = Igidl_dVds ; Igidl_dVgse = Igidl_dVgs ;
7272     Igisl_dVbse = Igisl_dVbs ; Igisl_dVdse = Igisl_dVds ; Igisl_dVgse = Igisl_dVgs ;
7273     Qgos_dVbse = Qgos_dVbs ; Qgos_dVdse = Qgos_dVds ; Qgos_dVgse = Qgos_dVgs ;
7274     Qgod_dVbse = Qgod_dVbs ; Qgod_dVdse = Qgod_dVds ; Qgod_dVgse = Qgod_dVgs ;
7275     Qgbo_dVbse = Qgbo_dVbs ; Qgbo_dVdse = Qgbo_dVds ; Qgbo_dVgse = Qgbo_dVgs ;
7276     Qovd_dVbse = Qovd_dVbs ; Qovd_dVdse = Qovd_dVds ; Qovd_dVgse = Qovd_dVgs ;
7277     QidLD_dVbse = QidLD_dVbs ; QidLD_dVdse = QidLD_dVds ; QidLD_dVgse = QidLD_dVgs ;
7278     QbdLD_dVbse = QbdLD_dVbs ; QbdLD_dVdse = QbdLD_dVds ; QbdLD_dVgse = QbdLD_dVgs ;
7279     Qovs_dVbse = Qovs_dVbs ; Qovs_dVdse = Qovs_dVds ; Qovs_dVgse = Qovs_dVgs ;
7280     QisLD_dVbse = QisLD_dVbs ; QisLD_dVdse = QisLD_dVds ; QisLD_dVgse = QisLD_dVgs ;
7281     QbsLD_dVbse = QbsLD_dVbs ; QbsLD_dVdse = QbsLD_dVds ; QbsLD_dVgse = QbsLD_dVgs ;
7282     Qy_dVbse = Qy_dVbs ; Qy_dVdse = Qy_dVds ; Qy_dVgse = Qy_dVgs ;
7283     Qdrat_dVbse = Qdrat_dVbs; Qdrat_dVdse = Qdrat_dVds; Qdrat_dVgse = Qdrat_dVgs;
7284     GLPART1_dVbse = GLPART1_dVbs ;GLPART1_dVdse = GLPART1_dVds ;GLPART1_dVgse = GLPART1_dVgs ;
7285 
7286     if (flg_nqs) { /* NQS */
7287       Qi_dVgse_nqs = Qi_dVgs_nqs; Qi_dVdse_nqs = Qi_dVds_nqs; Qi_dVbse_nqs = Qi_dVbs_nqs;
7288       Qb_dVgse_nqs = Qb_dVgs_nqs; Qb_dVdse_nqs = Qb_dVds_nqs; Qb_dVbse_nqs = Qb_dVbs_nqs;
7289     }
7290     if (flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG))) { /* ACNQS */
7291       tau_dVgse = tau_dVgs ; tau_dVdse = tau_dVds ; tau_dVbse = tau_dVbs ;
7292       taub_dVgse = taub_dVgs ; taub_dVdse = taub_dVds ; taub_dVbse = taub_dVbs ;
7293     }
7294 
7295   } else {
7296     /*---------------------------------------------------*
7297      * Case Rs>0 or Rd>0
7298      *-----------------*/
7299 
7300     /*-------------------------------------------*
7301      * Conductances w.r.t. confined biases.
7302      *-----------------*/
7303     Ids_dVbse = Ids_dVbs * DJI ;
7304     Ids_dVdse = Ids_dVds * DJI ;
7305     Ids_dVgse = Ids_dVgs * DJI ;
7306 
7307     /*-------------------------------------------*
7308      * Derivatives of internal biases  w.r.t. external biases.
7309      *-----------------*/
7310     Vbs_dVbse = ( 1.0 - Rs * Ids_dVbse ) ;
7311     Vbs_dVdse = - Rs * Ids_dVdse ;
7312     Vbs_dVgse = - Rs * Ids_dVgse ;
7313 
7314     Vds_dVbse = - ( Rs + Rd ) * Ids_dVbse ;
7315     Vds_dVdse = ( 1.0 - ( Rs + Rd ) * Ids_dVdse ) ;
7316     Vds_dVgse = - ( Rs + Rd ) * Ids_dVgse ;
7317 
7318     Vgs_dVbse = - Rs * Ids_dVbse ;
7319     Vgs_dVdse = - Rs * Ids_dVdse ;
7320     Vgs_dVgse = ( 1.0 - Rs * Ids_dVgse ) ;
7321 
7322     /*-------------------------------------------*
7323      * Derivatives of charges.
7324      *-----------------*/
7325     Qb_dVbse = Qb_dVbs * Vbs_dVbse + Qb_dVds * Vds_dVbse + Qb_dVgs * Vgs_dVbse ;
7326     Qb_dVdse = Qb_dVbs * Vbs_dVdse + Qb_dVds * Vds_dVdse + Qb_dVgs * Vgs_dVdse ;
7327     Qb_dVgse = Qb_dVbs * Vbs_dVgse + Qb_dVds * Vds_dVgse + Qb_dVgs * Vgs_dVgse ;
7328     Qi_dVbse = Qi_dVbs * Vbs_dVbse + Qi_dVds * Vds_dVbse + Qi_dVgs * Vgs_dVbse ;
7329     Qi_dVdse = Qi_dVbs * Vbs_dVdse + Qi_dVds * Vds_dVdse + Qi_dVgs * Vgs_dVdse ;
7330     Qi_dVgse = Qi_dVbs * Vbs_dVgse + Qi_dVds * Vds_dVgse + Qi_dVgs * Vgs_dVgse ;
7331     Qd_dVbse = Qd_dVbs * Vbs_dVbse + Qd_dVds * Vds_dVbse + Qd_dVgs * Vgs_dVbse ;
7332     Qd_dVdse = Qd_dVbs * Vbs_dVdse + Qd_dVds * Vds_dVdse + Qd_dVgs * Vgs_dVdse ;
7333     Qd_dVgse = Qd_dVbs * Vbs_dVgse + Qd_dVds * Vds_dVgse + Qd_dVgs * Vgs_dVgse ;
7334 
7335     /*-------------------------------------------*
7336      * Substrate/gate/leak conductances.
7337      *-----------------*/
7338     Isub_dVbse = Isub_dVbs * Vbs_dVbse + Isub_dVds * Vds_dVbse + Isub_dVgs * Vgs_dVbse ;
7339     Isub_dVdse = Isub_dVbs * Vbs_dVdse + Isub_dVds * Vds_dVdse + Isub_dVgs * Vgs_dVdse ;
7340     Isub_dVgse = Isub_dVbs * Vbs_dVgse + Isub_dVds * Vds_dVgse + Isub_dVgs * Vgs_dVgse ;
7341     IdsIBPC_dVbse = IdsIBPC_dVbs * Vbs_dVbse + IdsIBPC_dVds * Vds_dVbse + IdsIBPC_dVgs * Vgs_dVbse ;
7342     IdsIBPC_dVdse = IdsIBPC_dVbs * Vbs_dVdse + IdsIBPC_dVds * Vds_dVdse + IdsIBPC_dVgs * Vgs_dVdse ;
7343     IdsIBPC_dVgse = IdsIBPC_dVbs * Vbs_dVgse + IdsIBPC_dVds * Vds_dVgse + IdsIBPC_dVgs * Vgs_dVgse ;
7344     Igate_dVbse = Igate_dVbs * Vbs_dVbse + Igate_dVds * Vds_dVbse + Igate_dVgs * Vgs_dVbse ;
7345     Igate_dVdse = Igate_dVbs * Vbs_dVdse + Igate_dVds * Vds_dVdse + Igate_dVgs * Vgs_dVdse ;
7346     Igate_dVgse = Igate_dVbs * Vbs_dVgse + Igate_dVds * Vds_dVgse + Igate_dVgs * Vgs_dVgse ;
7347     Igb_dVbse = Igb_dVbs * Vbs_dVbse + Igb_dVds * Vds_dVbse + Igb_dVgs * Vgs_dVbse ;
7348     Igb_dVdse = Igb_dVbs * Vbs_dVdse + Igb_dVds * Vds_dVdse + Igb_dVgs * Vgs_dVdse ;
7349     Igb_dVgse = Igb_dVbs * Vbs_dVgse + Igb_dVds * Vds_dVgse + Igb_dVgs * Vgs_dVgse ;
7350     Igd_dVbse = Igd_dVbs * Vbs_dVbse + Igd_dVds * Vds_dVbse + Igd_dVgs * Vgs_dVbse ;
7351     Igd_dVdse = Igd_dVbs * Vbs_dVdse + Igd_dVds * Vds_dVdse + Igd_dVgs * Vgs_dVdse ;
7352     Igd_dVgse = Igd_dVbs * Vbs_dVgse + Igd_dVds * Vds_dVgse + Igd_dVgs * Vgs_dVgse ;
7353     Igs_dVbse = Igs_dVbs * Vbs_dVbse + Igs_dVds * Vds_dVbse + Igs_dVgs * Vgs_dVbse ;
7354     Igs_dVdse = Igs_dVbs * Vbs_dVdse + Igs_dVds * Vds_dVdse + Igs_dVgs * Vgs_dVdse ;
7355     Igs_dVgse = Igs_dVbs * Vbs_dVgse + Igs_dVds * Vds_dVgse + Igs_dVgs * Vgs_dVgse ;
7356     Igidl_dVbse = Igidl_dVbs * Vbs_dVbse + Igidl_dVds * Vds_dVbse + Igidl_dVgs * Vgs_dVbse ;
7357     Igidl_dVdse = Igidl_dVbs * Vbs_dVdse + Igidl_dVds * Vds_dVdse + Igidl_dVgs * Vgs_dVdse ;
7358     Igidl_dVgse = Igidl_dVbs * Vbs_dVgse + Igidl_dVds * Vds_dVgse + Igidl_dVgs * Vgs_dVgse ;
7359     Igisl_dVbse = Igisl_dVbs * Vbs_dVbse + Igisl_dVds * Vds_dVbse + Igisl_dVgs * Vgs_dVbse ;
7360     Igisl_dVdse = Igisl_dVbs * Vbs_dVdse + Igisl_dVds * Vds_dVdse + Igisl_dVgs * Vgs_dVdse ;
7361     Igisl_dVgse = Igisl_dVbs * Vbs_dVgse + Igisl_dVds * Vds_dVgse + Igisl_dVgs * Vgs_dVgse ;
7362 
7363     GLPART1_dVbse = GLPART1_dVbs * Vbs_dVbse + GLPART1_dVds * Vds_dVbse + GLPART1_dVgs * Vgs_dVbse ;
7364     GLPART1_dVdse = GLPART1_dVbs * Vbs_dVdse + GLPART1_dVds * Vds_dVdse + GLPART1_dVgs * Vgs_dVdse ;
7365     GLPART1_dVgse = GLPART1_dVbs * Vbs_dVgse + GLPART1_dVds * Vds_dVgse + GLPART1_dVgs * Vgs_dVgse ;
7366 
7367     /*---------------------------------------------------*
7368      * Derivatives of overlap charges.
7369      *-----------------*/
7370     Qgos_dVbse = Qgos_dVbs * Vbs_dVbse + Qgos_dVds * Vds_dVbse + Qgos_dVgs * Vgs_dVbse ;
7371     Qgos_dVdse = Qgos_dVbs * Vbs_dVdse + Qgos_dVds * Vds_dVdse + Qgos_dVgs * Vgs_dVdse ;
7372     Qgos_dVgse = Qgos_dVbs * Vbs_dVgse + Qgos_dVds * Vds_dVgse + Qgos_dVgs * Vgs_dVgse ;
7373     Qgod_dVbse = Qgod_dVbs * Vbs_dVbse + Qgod_dVds * Vds_dVbse + Qgod_dVgs * Vgs_dVbse ;
7374     Qgod_dVdse = Qgod_dVbs * Vbs_dVdse + Qgod_dVds * Vds_dVdse + Qgod_dVgs * Vgs_dVdse ;
7375     Qgod_dVgse = Qgod_dVbs * Vbs_dVgse + Qgod_dVds * Vds_dVgse + Qgod_dVgs * Vgs_dVgse ;
7376     Qgbo_dVbse = Qgbo_dVbs * Vbs_dVbse + Qgbo_dVds * Vds_dVbse + Qgbo_dVgs * Vgs_dVbse ;
7377     Qgbo_dVdse = Qgbo_dVbs * Vbs_dVdse + Qgbo_dVds * Vds_dVdse + Qgbo_dVgs * Vgs_dVdse ;
7378     Qgbo_dVgse = Qgbo_dVbs * Vbs_dVgse + Qgbo_dVds * Vds_dVgse + Qgbo_dVgs * Vgs_dVgse ;
7379     Qovd_dVbse = Qovd_dVbs * Vbs_dVbse + Qovd_dVds * Vds_dVbse + Qovd_dVgs * Vgs_dVbse ;
7380     Qovd_dVdse = Qovd_dVbs * Vbs_dVdse + Qovd_dVds * Vds_dVdse + Qovd_dVgs * Vgs_dVdse ;
7381     Qovd_dVgse = Qovd_dVbs * Vbs_dVgse + Qovd_dVds * Vds_dVgse + Qovd_dVgs * Vgs_dVgse ;
7382     QidLD_dVbse = QidLD_dVbs * Vbs_dVbse + QidLD_dVds * Vds_dVbse + QidLD_dVgs * Vgs_dVbse ;
7383     QidLD_dVdse = QidLD_dVbs * Vbs_dVdse + QidLD_dVds * Vds_dVdse + QidLD_dVgs * Vgs_dVdse ;
7384     QidLD_dVgse = QidLD_dVbs * Vbs_dVgse + QidLD_dVds * Vds_dVgse + QidLD_dVgs * Vgs_dVgse ;
7385     QbdLD_dVbse = QbdLD_dVbs * Vbs_dVbse + QbdLD_dVds * Vds_dVbse + QbdLD_dVgs * Vgs_dVbse ;
7386     QbdLD_dVdse = QbdLD_dVbs * Vbs_dVdse + QbdLD_dVds * Vds_dVdse + QbdLD_dVgs * Vgs_dVdse ;
7387     QbdLD_dVgse = QbdLD_dVbs * Vbs_dVgse + QbdLD_dVds * Vds_dVgse + QbdLD_dVgs * Vgs_dVgse ;
7388     Qovs_dVbse = Qovs_dVbs * Vbs_dVbse + Qovs_dVds * Vds_dVbse + Qovs_dVgs * Vgs_dVbse ;
7389     Qovs_dVdse = Qovs_dVbs * Vbs_dVdse + Qovs_dVds * Vds_dVdse + Qovs_dVgs * Vgs_dVdse ;
7390     Qovs_dVgse = Qovs_dVbs * Vbs_dVgse + Qovs_dVds * Vds_dVgse + Qovs_dVgs * Vgs_dVgse ;
7391     QisLD_dVbse = QisLD_dVbs * Vbs_dVbse + QisLD_dVds * Vds_dVbse + QisLD_dVgs * Vgs_dVbse ;
7392     QisLD_dVdse = QisLD_dVbs * Vbs_dVdse + QisLD_dVds * Vds_dVdse + QisLD_dVgs * Vgs_dVdse ;
7393     QisLD_dVgse = QisLD_dVbs * Vbs_dVgse + QisLD_dVds * Vds_dVgse + QisLD_dVgs * Vgs_dVgse ;
7394     QbsLD_dVbse = QbsLD_dVbs * Vbs_dVbse + QbsLD_dVds * Vds_dVbse + QbsLD_dVgs * Vgs_dVbse ;
7395     QbsLD_dVdse = QbsLD_dVbs * Vbs_dVdse + QbsLD_dVds * Vds_dVdse + QbsLD_dVgs * Vgs_dVdse ;
7396     QbsLD_dVgse = QbsLD_dVbs * Vbs_dVgse + QbsLD_dVds * Vds_dVgse + QbsLD_dVgs * Vgs_dVgse ;
7397     Qy_dVbse = Qy_dVbs * Vbs_dVbse + Qy_dVds * Vds_dVbse + Qy_dVgs * Vgs_dVbse ;
7398     Qy_dVdse = Qy_dVbs * Vbs_dVdse + Qy_dVds * Vds_dVdse + Qy_dVgs * Vgs_dVdse ;
7399     Qy_dVgse = Qy_dVbs * Vbs_dVgse + Qy_dVds * Vds_dVgse + Qy_dVgs * Vgs_dVgse ;
7400     Qdrat_dVbse = Qdrat_dVbs * Vbs_dVbse + Qdrat_dVds * Vds_dVbse + Qdrat_dVgs * Vgs_dVbse ;
7401     Qdrat_dVdse = Qdrat_dVbs * Vbs_dVdse + Qdrat_dVds * Vds_dVdse + Qdrat_dVgs * Vgs_dVdse ;
7402     Qdrat_dVgse = Qdrat_dVbs * Vbs_dVgse + Qdrat_dVds * Vds_dVgse + Qdrat_dVgs * Vgs_dVgse ;
7403 
7404     if (flg_nqs) { /* NQS */
7405       Qi_dVgse_nqs = Qi_dVgs_nqs * Vgs_dVgse + Qi_dVds_nqs * Vds_dVgse + Qi_dVbs_nqs * Vbs_dVgse;
7406       Qi_dVdse_nqs = Qi_dVgs_nqs * Vgs_dVdse + Qi_dVds_nqs * Vds_dVdse + Qi_dVbs_nqs * Vbs_dVdse;
7407       Qi_dVbse_nqs = Qi_dVgs_nqs * Vgs_dVbse + Qi_dVds_nqs * Vds_dVbse + Qi_dVbs_nqs * Vbs_dVbse;
7408       Qb_dVgse_nqs = Qb_dVgs_nqs * Vgs_dVgse + Qb_dVds_nqs * Vds_dVgse + Qb_dVbs_nqs * Vbs_dVgse;
7409       Qb_dVdse_nqs = Qb_dVgs_nqs * Vgs_dVdse + Qb_dVds_nqs * Vds_dVdse + Qb_dVbs_nqs * Vbs_dVdse;
7410       Qb_dVbse_nqs = Qb_dVgs_nqs * Vgs_dVbse + Qb_dVds_nqs * Vds_dVbse + Qb_dVbs_nqs * Vbs_dVbse;
7411     }
7412     if (flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG))) { /* ACNQS */
7413       tau_dVgse = tau_dVgs * Vgs_dVgse + tau_dVds * Vds_dVgse + tau_dVbs * Vbs_dVgse;
7414       tau_dVdse = tau_dVgs * Vgs_dVdse + tau_dVds * Vds_dVdse + tau_dVbs * Vbs_dVdse;
7415       tau_dVbse = tau_dVgs * Vgs_dVbse + tau_dVds * Vds_dVbse + tau_dVbs * Vbs_dVbse;
7416       taub_dVgse = taub_dVgs * Vgs_dVgse + taub_dVds * Vds_dVgse + taub_dVbs * Vbs_dVgse;
7417       taub_dVdse = taub_dVgs * Vgs_dVdse + taub_dVds * Vds_dVdse + taub_dVbs * Vbs_dVdse;
7418       taub_dVbse = taub_dVgs * Vgs_dVbse + taub_dVds * Vds_dVbse + taub_dVbs * Vbs_dVbse;
7419     }
7420   } /* end of if ( flg_rsrd == 0 ) blocks */
7421 
7422   /*-------------------------------------------*
7423    * Add IdsIBPC to Ids.
7424    *-----------------*/
7425   Ids += IdsIBPC ;
7426   Ids_dVbse += IdsIBPC_dVbse ;
7427   Ids_dVdse += IdsIBPC_dVdse ;
7428   Ids_dVgse += IdsIBPC_dVgse ;
7429 
7430   /*---------------------------------------------------*
7431    * Derivatives of junction diode currents and charges.
7432    * - NOTE: These quantities are regarded as functions of
7433    *         external biases.
7434    * - NOTE: node-base S/D
7435    *-----------------*/
7436   Gbse = Gbs ;
7437   Gbde = Gbd ;
7438   Capbse = Capbs ;
7439   Capbde = Capbd ;
7440 
7441   /*---------------------------------------------------*
7442    * Extrapolate quantities if external biases are out of bounds.
7443    *-----------------*/
7444   if ( flg_vbsc == 1 ) {
7445     Ids_dVbse   *= Vbsc_dVbse ;
7446     Qb_dVbse    *= Vbsc_dVbse ;
7447     Qi_dVbse    *= Vbsc_dVbse ;
7448     Qd_dVbse    *= Vbsc_dVbse ;
7449     Isub_dVbse  *= Vbsc_dVbse ;
7450     Igate_dVbse *= Vbsc_dVbse ;
7451     Igs_dVbse   *= Vbsc_dVbse ;
7452     Igd_dVbse   *= Vbsc_dVbse ;
7453     Igb_dVbse   *= Vbsc_dVbse ;
7454     Igidl_dVbse *= Vbsc_dVbse ;
7455     Igisl_dVbse *= Vbsc_dVbse ;
7456     Qgos_dVbse  *= Vbsc_dVbse ;
7457     Qgod_dVbse  *= Vbsc_dVbse ;
7458     Qgbo_dVbse  *= Vbsc_dVbse ;
7459     Qy_dVbse    *= Vbsc_dVbse ;
7460     if (flg_nqs) {
7461       Qi_dVbse_nqs *= Vbsc_dVbse ;
7462       Qb_dVbse_nqs *= Vbsc_dVbse ;
7463     }
7464     if (flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG))) { /* ACNQS */
7465       tau_dVbse *= Vbsc_dVbse ;
7466       taub_dVbse *= Vbsc_dVbse ;
7467     }
7468   } else if ( flg_vbsc == -1 ) {
7469     T1 = Vbse - Vbsc ;
7470 
7471     TX = Ids + T1 * Ids_dVbse ;
7472     if ( TX * Ids >= 0.0 ) {
7473       Ids = TX ;
7474     } else {
7475       Ids_dVbse = 0.0 ;
7476       Ids_dVdse = 0.0 ;
7477       Ids_dVgse = 0.0 ;
7478       Ids = 0.0 ;
7479     }
7480 
7481     TX = Qb  + T1 * Qb_dVbse ;
7482     /*note: The sign of Qb can be changed.*/
7483     Qb = TX ;
7484 
7485     TX = Qd  + T1 * Qd_dVbse ;
7486     if ( TX * Qd >= 0.0 ) {
7487       Qd = TX ;
7488     } else {
7489       Qd_dVbse = 0.0 ;
7490       Qd_dVdse = 0.0 ;
7491       Qd_dVgse = 0.0 ;
7492       Qd = 0.0 ;
7493     }
7494 
7495     TX = Qi  + T1 * Qi_dVbse ;
7496     if ( TX * Qi >= 0.0 ) {
7497       Qi = TX ;
7498     } else {
7499       Qi_dVbse = 0.0 ;
7500       Qi_dVdse = 0.0 ;
7501       Qi_dVgse = 0.0 ;
7502       Qi = 0.0 ;
7503     }
7504 
7505     TX = Isub + T1 * Isub_dVbse ;
7506     if ( TX * Isub >= 0.0 ) {
7507       Isub = TX ;
7508     } else {
7509       Isub_dVbse = 0.0 ;
7510       Isub_dVdse = 0.0 ;
7511       Isub_dVgse = 0.0 ;
7512       Isub = 0.0 ;
7513     }
7514 
7515     TX = Igate + T1 * Igate_dVbse ;
7516     if ( TX * Igate >= 0.0 ) {
7517       Igate = TX ;
7518     } else {
7519       Igate_dVbse = 0.0 ;
7520       Igate_dVdse = 0.0 ;
7521       Igate_dVgse = 0.0 ;
7522       Igate = 0.0 ;
7523     }
7524 
7525     TX = Igs + T1 * Igs_dVbse ;
7526     if ( TX * Igs >= 0.0 ) {
7527       Igs = TX ;
7528     } else {
7529       Igs_dVbse = 0.0 ;
7530       Igs_dVdse = 0.0 ;
7531       Igs_dVgse = 0.0 ;
7532       Igs = 0.0 ;
7533     }
7534 
7535     TX = Igd + T1 * Igd_dVbse ;
7536     if ( TX * Igd >= 0.0 ) {
7537       Igd = TX ;
7538     } else {
7539       Igd_dVbse = 0.0 ;
7540       Igd_dVdse = 0.0 ;
7541       Igd_dVgse = 0.0 ;
7542       Igd = 0.0 ;
7543     }
7544 
7545     TX = Igb + T1 * Igb_dVbse ;
7546     if ( TX * Igb >= 0.0 ) {
7547       Igb = TX ;
7548     } else {
7549       Igb_dVbse = 0.0 ;
7550       Igb_dVdse = 0.0 ;
7551       Igb_dVgse = 0.0 ;
7552       Igb = 0.0 ;
7553     }
7554 
7555     TX = Igidl + T1 * Igidl_dVbse ;
7556     if ( TX * Igidl >= 0.0 ) {
7557       Igidl = TX ;
7558     } else {
7559       Igidl_dVbse = 0.0 ;
7560       Igidl_dVdse = 0.0 ;
7561       Igidl_dVgse = 0.0 ;
7562       Igidl = 0.0 ;
7563     }
7564 
7565     TX = Igisl + T1 * Igisl_dVbse ;
7566     if ( TX * Igisl >= 0.0 ) {
7567       Igisl = TX ;
7568     } else {
7569       Igisl_dVbse = 0.0 ;
7570       Igisl_dVdse = 0.0 ;
7571       Igisl_dVgse = 0.0 ;
7572       Igisl = 0.0 ;
7573     }
7574 
7575     TX = GLPART1 + T1 * GLPART1_dVbse ;
7576     if ( TX * GLPART1 >= 0.0 ) {
7577       GLPART1 = TX ;
7578     } else{
7579       GLPART1_dVbse = 0.0 ;
7580       GLPART1_dVdse = 0.0 ;
7581       GLPART1_dVgse = 0.0 ;
7582       GLPART1 = 0.0 ;
7583     }
7584 
7585     TX = Qgod + T1 * Qgod_dVbse ;
7586     if ( TX * Qgod >= 0.0 ) {
7587       Qgod = TX ;
7588     } else {
7589       Qgod_dVbse = 0.0 ;
7590       Qgod_dVdse = 0.0 ;
7591       Qgod_dVgse = 0.0 ;
7592       Qgod = 0.0 ;
7593     }
7594 
7595     TX = Qgos + T1 * Qgos_dVbse ;
7596     if ( TX * Qgos >= 0.0 ) {
7597       Qgos = TX ;
7598     } else {
7599       Qgos_dVbse = 0.0 ;
7600       Qgos_dVdse = 0.0 ;
7601       Qgos_dVgse = 0.0 ;
7602       Qgos = 0.0 ;
7603     }
7604 
7605     TX = Qgbo + T1 * Qgbo_dVbse ;
7606     if ( TX * Qgbo >= 0.0 ) {
7607       Qgbo = TX ;
7608     } else {
7609       Qgbo_dVbse = 0.0 ;
7610       Qgbo_dVdse = 0.0 ;
7611       Qgbo_dVgse = 0.0 ;
7612       Qgbo = 0.0 ;
7613     }
7614 
7615     TX = Qy + T1 * Qy_dVbse ;
7616     if ( TX * Qy >= 0.0 ) {
7617       Qy = TX ;
7618     } else {
7619       Qy_dVbse = 0.0 ;
7620       Qy_dVdse = 0.0 ;
7621       Qy_dVgse = 0.0 ;
7622       Qy = 0.0 ;
7623     }
7624 
7625     TX = Qdrat  + T1 * Qdrat_dVbse ;
7626     if ( TX * Qdrat >= 0.0 ) {
7627       Qdrat = TX ;
7628     } else{
7629       Qdrat_dVbse = 0.0 ;
7630       Qdrat_dVdse = 0.0 ;
7631       Qdrat_dVgse = 0.0 ;
7632       Qdrat = 0.0 ;
7633     }
7634 
7635     TX = Qovd + T1 * Qovd_dVbse ;
7636     if ( TX * Qovd >= 0.0 ) {
7637       Qovd = TX ;
7638     } else{
7639       Qovd_dVbse = 0.0 ;
7640       Qovd_dVdse = 0.0 ;
7641       Qovd_dVgse = 0.0 ;
7642       Qovd = 0.0 ;
7643     }
7644 
7645     TX = QidLD + T1 * QidLD_dVbse ;
7646     if ( TX * QidLD >= 0.0 ) {
7647       QidLD = TX ;
7648     } else{
7649       QidLD_dVbse = 0.0 ;
7650       QidLD_dVdse = 0.0 ;
7651       QidLD_dVgse = 0.0 ;
7652       QidLD = 0.0 ;
7653     }
7654 
7655     TX = QbdLD + T1 * QbdLD_dVbse ;
7656     if ( TX * QbdLD >= 0.0 ) {
7657       QbdLD = TX ;
7658     } else{
7659       QbdLD_dVbse = 0.0 ;
7660       QbdLD_dVdse = 0.0 ;
7661       QbdLD_dVgse = 0.0 ;
7662       QbdLD = 0.0 ;
7663     }
7664 
7665     TX = Qovs + T1 * Qovs_dVbse ;
7666     if ( TX * Qovs >= 0.0 ) {
7667       Qovs = TX ;
7668     } else{
7669       T7 = Qovs / ( Qovs - TX ) ;
7670       Qovs_dVbse *= T7 ;
7671       Qovs_dVdse *= T7 ;
7672       Qovs_dVgse *= T7 ;
7673       Qovs = 0.0 ;
7674     }
7675 
7676     TX = QisLD + T1 * QisLD_dVbse ;
7677     if ( TX * QisLD >= 0.0 ) {
7678       QisLD = TX ;
7679     } else{
7680       QisLD_dVbse = 0.0 ;
7681       QisLD_dVdse = 0.0 ;
7682       QisLD_dVgse = 0.0 ;
7683       QisLD = 0.0 ;
7684     }
7685 
7686     TX = QbsLD + T1 * QbsLD_dVbse ;
7687     if ( TX * QbsLD >= 0.0 ) {
7688       QbsLD = TX ;
7689     } else{
7690       QbsLD_dVbse = 0.0 ;
7691       QbsLD_dVdse = 0.0 ;
7692       QbsLD_dVgse = 0.0 ;
7693       QbsLD = 0.0 ;
7694     }
7695 
7696     if (flg_nqs) { /* for NQS charge */
7697       TX = Qi_nqs  + T1 * Qi_dVbse_nqs ;
7698       if ( TX * Qi_nqs >= 0.0 ) {
7699         Qi_nqs = TX ;
7700       } else {
7701         Qi_dVbse_nqs = 0.0 ;
7702         Qi_dVdse_nqs = 0.0 ;
7703         Qi_dVgse_nqs = 0.0 ;
7704         Qi_nqs = 0.0 ;
7705       }
7706 
7707       TX = Qb_nqs  + T1 * Qb_dVbse_nqs ;
7708       Qb_nqs = TX ;
7709     }
7710 
7711     if (flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG))) { /* ACNQS */
7712       TX = tau  + T1 * tau_dVbse ;
7713       if ( TX * tau >= 0.0 ) {
7714         tau = TX ;
7715       } else {
7716         tau_dVbse = 0.0 ;
7717         tau_dVdse = 0.0 ;
7718         tau_dVgse = 0.0 ;
7719         tau = 0.0 ;
7720       }
7721 
7722       TX = taub  + T1 * taub_dVbse ;
7723       if ( TX * taub >= 0.0 ) {
7724         taub = TX ;
7725       } else {
7726         taub_dVbse = 0.0 ;
7727         taub_dVdse = 0.0 ;
7728         taub_dVgse = 0.0 ;
7729         taub = 0.0 ;
7730       }
7731     }
7732   }
7733 
7734   /*-----------------------------------------------------------*
7735    * Warn negative conductance.
7736    * - T1 ( = d Ids / d Vds ) is the derivative w.r.t. circuit bias.
7737    *-----------------*/
7738   if ( here->HSM2_mode == HiSIM_NORMAL_MODE ) {
7739     T1 = Ids_dVdse ;
7740   } else {
7741     T1 = Ids_dVbse + Ids_dVdse + Ids_dVgse ; /* Ids_dVss * -1 */
7742   }
7743 
7744   if ( flg_info >= 1 &&
7745        (Ids_dVbse < 0.0 || T1 < 0.0 || Ids_dVgse < 0.0) ) {
7746     printf( "*** warning(HiSIM): Negative Conductance\n" ) ;
7747     printf( " type = %d  mode = %d\n" , model->HSM2_type , here->HSM2_mode ) ;
7748     printf( " Vbse = %12.5e Vdse = %12.5e Vgse = %12.5e\n" ,
7749             Vbse , Vdse , Vgse ) ;
7750     printf( " Ids_dVbse   = %12.5e\n" , Ids_dVbse ) ;
7751     printf( " Ids_dVdse   = %12.5e\n" , T1 ) ;
7752     printf( " Ids_dVgse   = %12.5e\n" , Ids_dVgse ) ;
7753   }
7754 
7755   /*-----------------------------------------------------------*
7756    * Redefine overlap charges/capacitances.
7757    *-----------------*/
7758   /*---------------------------------------------------*
7759    * Overlap capacitance.
7760    *-----------------*/
7761   Cggo = Qgos_dVgse + Qgod_dVgse + Qgbo_dVgse ;
7762   Cgdo = Qgos_dVdse + Qgod_dVdse ;
7763   Cgso = - (Qgos_dVbse + Qgod_dVbse + Qgos_dVdse + Qgod_dVdse
7764             + Qgos_dVgse + Qgod_dVgse) ;
7765   Cgbo = Qgos_dVbse + Qgod_dVbse + Qgbo_dVbse ;
7766 
7767   /*---------------------------------------------------*
7768    * Add fringing charge/capacitance to overlap.
7769    *-----------------*/
7770   Qgod += Qfd ;
7771   Qgos += Qfs ;
7772 
7773   Cggo += 2.0 * Cf ;
7774   Cgdo += - Cf ;
7775   Cgso += - Cf ;
7776   /*-----------------------------------------------------------*
7777    * Assign outputs.
7778    *-----------------*/
7779 
7780   /*---------------------------------------------------*
7781    * Multiplication factor of a MOSFET instance.
7782    *-----------------*/
7783   M = here->HSM2_m ;
7784 
7785   /*---------------------------------------------------*
7786    * Channel current and conductances.
7787    *-----------------*/
7788   here->HSM2_ids  = M * Ids ;
7789   here->HSM2_gmbs = M * Ids_dVbse  ;
7790   here->HSM2_gds  = M * Ids_dVdse ;
7791   here->HSM2_gm   = M * Ids_dVgse ;
7792 
7793   /*---------------------------------------------------*
7794    * Overlap capacitances.
7795    *-----------------*/
7796   /* Q_dVsx */
7797   T2 = - ( Qovd_dVbse + Qovd_dVdse + Qovd_dVgse ) ;
7798   T6 = - ( Qovs_dVbse + Qovs_dVdse + Qovs_dVgse ) ;
7799   T5 = - ( QbdLD_dVbse + QbdLD_dVdse + QbdLD_dVgse ) ;
7800   T7 = - ( QbsLD_dVbse + QbsLD_dVdse + QbsLD_dVgse ) ;
7801 
7802   here->HSM2_cgdo = M * (  Cgdo - Qovd_dVdse - Qovs_dVdse ) ;
7803   here->HSM2_cgso = M * (  Cgso - T2 - T6 ) ;
7804   here->HSM2_cgbo = M * (  Cgbo - Qovd_dVbse - Qovs_dVbse ) ;
7805 
7806   here->HSM2_cdgo = M * (  - Qgod_dVgse - Cf + QbdLD_dVgse ) ;
7807   here->HSM2_cddo = M * (  - Qgod_dVdse + Cf + QbdLD_dVdse ) ;
7808   here->HSM2_cdso = M * (  Qgod_dVbse + Qgod_dVdse + Qgod_dVgse + T5 ) ;
7809 
7810   here->HSM2_csgo = M * (  - Qgos_dVgse - Cf + QbsLD_dVgse ) ;
7811   here->HSM2_csdo = M * (  - Qgos_dVdse      + QbsLD_dVdse ) ;
7812   here->HSM2_csso = M * (  Qgos_dVbse + Qgos_dVdse + Qgos_dVgse + Cf + T7 ) ;
7813 
7814   /*---------------------------------------------------*
7815    * Lateral-field-induced capacitance.
7816    *-----------------*/
7817   T0 = model->HSM2_qyrat ;
7818   T1 = 1.0 - T0 ;
7819   Qys = Qy * T1 ;
7820   Qys_dVdse = Qy_dVdse * T1 ;
7821   Qys_dVgse = Qy_dVgse * T1 ;
7822   Qys_dVbse = Qy_dVbse * T1 ;
7823   Qy = Qy * T0 ;
7824   Qy_dVdse = Qy_dVdse * T0 ;
7825   Qy_dVgse = Qy_dVgse * T0 ;
7826   Qy_dVbse = Qy_dVbse * T0 ;
7827 
7828   Cqyd = Qy_dVdse ;
7829   Cqyg = Qy_dVgse ;
7830   Cqyb = Qy_dVbse ;
7831   Cqys = - ( Cqyb +  Cqyd + Cqyg ) ;
7832   here->HSM2_cqyd = M * Cqyd ;
7833   here->HSM2_cqyg = M * Cqyg ;
7834   here->HSM2_cqyb = M * Cqyb ;
7835 
7836   /* -------------------------------------*
7837    * Intrinsic charges / capacitances.
7838    *-----------------*/
7839   if ( flg_nqs && ((ckt->CKTmode & MODETRAN) ||
7840                    (ckt->CKTmode & MODEINITFIX)) ) { /* NQS (tran. analysis) */
7841 
7842     *(ckt->CKTstate0 + here->HSM2qi_nqs) = Qi_nqs ;
7843     *(ckt->CKTstate0 + here->HSM2qb_nqs) = Qb_nqs ;
7844 
7845     here->HSM2_qg = M * - (Qb_nqs + Qi_nqs) ;
7846     here->HSM2_qd = M * Qi_nqs * Qdrat ;
7847     here->HSM2_qs = M * Qi_nqs * (1.0 - Qdrat) ;
7848 
7849     here->HSM2_cbgb = M * Qb_dVgse_nqs ;
7850     here->HSM2_cbdb = M * Qb_dVdse_nqs ;
7851     here->HSM2_cbsb = M * - (Qb_dVbse_nqs + Qb_dVdse_nqs + Qb_dVgse_nqs) ;
7852 
7853     here->HSM2_cggb = M * ( - Qb_dVgse_nqs - Qi_dVgse_nqs ) ;
7854     here->HSM2_cgdb = M * ( - Qb_dVdse_nqs - Qi_dVdse_nqs ) ;
7855     here->HSM2_cgsb = M * ( Qb_dVbse_nqs + Qb_dVdse_nqs + Qb_dVgse_nqs
7856 			    + Qi_dVbse_nqs + Qi_dVdse_nqs + Qi_dVgse_nqs ) ;
7857 
7858     qd_dVgse = Qi_dVgse_nqs * Qdrat + Qdrat_dVgse * Qi_nqs ;
7859     qd_dVdse = Qi_dVdse_nqs * Qdrat + Qdrat_dVdse * Qi_nqs ;
7860     qd_dVbse = Qi_dVbse_nqs * Qdrat + Qdrat_dVbse * Qi_nqs ;
7861     qd_dVsse = - ( qd_dVgse + qd_dVdse + qd_dVbse ) ;
7862     here->HSM2_cdgb = M * qd_dVgse ;
7863     here->HSM2_cddb = M * qd_dVdse ;
7864     here->HSM2_cdsb = M * qd_dVsse ;
7865   } else  { /* QS or NQS (ac dc analysis) */
7866 
7867     here->HSM2_qg = M * - (Qb + Qi) ;
7868     here->HSM2_qd = M * Qd ;
7869     here->HSM2_qs = M * ( Qi - Qd ) ;
7870 
7871     here->HSM2_cbgb = M * Qb_dVgse ;
7872     here->HSM2_cbdb = M * Qb_dVdse ;
7873     here->HSM2_cbsb = M * - (Qb_dVbse + Qb_dVdse + Qb_dVgse) ;
7874 
7875     here->HSM2_cggb = M * ( - Qb_dVgse - Qi_dVgse ) ;
7876     here->HSM2_cgdb = M * ( - Qb_dVdse - Qi_dVdse ) ;
7877     here->HSM2_cgsb = M * ( Qb_dVbse + Qb_dVdse + Qb_dVgse
7878 			    + Qi_dVbse + Qi_dVdse + Qi_dVgse ) ;
7879 
7880     here->HSM2_cdgb = M * Qd_dVgse ;
7881     here->HSM2_cddb = M * Qd_dVdse ;
7882     here->HSM2_cdsb = M * - (Qd_dVgse + Qd_dVdse + Qd_dVbse) ;
7883   }
7884 
7885 
7886   /*---------------------------------------------------*
7887    * Add lateral-field-induced charges/capacitances to intrinsic ones.
7888    * - NOTE: This function depends on coqy, a control option.
7889    *-----------------*/
7890   if ( model->HSM2_coqy == 1 ) {
7891       here->HSM2_qg += M * (   Qy + Qys ) ;
7892       here->HSM2_qd += M * ( - Qy       ) ;
7893       here->HSM2_qs += M * (      - Qys ) ;
7894 
7895       T8 = - ( Qys_dVbse + Qys_dVdse + Qys_dVgse ) ;
7896       here->HSM2_cggb += M * (   Cqyg + Qys_dVgse ) ;
7897       here->HSM2_cgdb += M * (   Cqyd + Qys_dVdse ) ;
7898       here->HSM2_cgsb += M * (   Cqys + T8        ) ;
7899 
7900       here->HSM2_cdgb += M * ( - Cqyg ) ;
7901       here->HSM2_cddb += M * ( - Cqyd ) ;
7902       here->HSM2_cdsb += M * ( - Cqys ) ;
7903   }
7904 
7905   /*---------------------------------------------------*
7906    * Add S/D overlap charges/capacitances to intrinsic ones.
7907    * - NOTE: This function depends on coadov, a control option.
7908    *-----------------*/
7909   if ( model->HSM2_coadov == 1 ) {
7910     /* Q_dVsb */
7911     T0 = - ( Qgbo_dVbse + Qgbo_dVdse + Qgbo_dVgse ) ;
7912     T1 = - ( Qovd_dVbse + Qovd_dVdse + Qovd_dVgse ) ;
7913     T3 = - ( Qovs_dVbse + Qovs_dVdse + Qovs_dVgse ) ;
7914     T4 = - ( QidLD_dVbse + QidLD_dVdse + QidLD_dVgse + QisLD_dVbse + QisLD_dVdse + QisLD_dVgse ) ;
7915     T5 = - ( QbdLD_dVbse + QbdLD_dVdse + QbdLD_dVgse ) ;
7916     T7 = - ( Qgod_dVbse + Qgod_dVdse + Qgod_dVgse ) ;
7917 
7918       here->HSM2_qg += M * ( Qgod + Qgos + Qgbo - Qovd - Qovs ) ;
7919       here->HSM2_qd += M * ( - Qgod + QbdLD ) ;
7920       here->HSM2_qs += M * ( - Qgos + QbsLD ) ;
7921 
7922       here->HSM2_cbgb += M * ( - Qgbo_dVgse + QidLD_dVgse + QisLD_dVgse ) ;
7923       here->HSM2_cbdb += M * ( - Qgbo_dVdse + QidLD_dVdse + QisLD_dVdse ) ;
7924       here->HSM2_cbsb += M * ( - T0         + T4                        ) ;
7925 
7926       here->HSM2_cggb += M * ( Cggo - Qovd_dVgse - Qovs_dVgse ) ;
7927       here->HSM2_cgdb += M * ( Cgdo - Qovd_dVdse - Qovs_dVdse ) ;
7928       here->HSM2_cgsb += M * ( Cgso - T1         - T3         ) ;
7929 
7930       here->HSM2_cdgb += M * ( - Qgod_dVgse - Cf + QbdLD_dVgse ) ;
7931       here->HSM2_cddb += M * ( - Qgod_dVdse + Cf + QbdLD_dVdse ) ;
7932       here->HSM2_cdsb += M * ( - T7              + T5         ) ;
7933   }
7934 
7935 
7936 
7937   /*---------------------------------------------------*
7938    * tau (channel/bulk charge) for ACNQS.
7939    *-----------------*/
7940   if (flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG))) {
7941     here->HSM2_tau = tau ;
7942     here->HSM2_tau_dVgs = tau_dVgse ;
7943     here->HSM2_tau_dVds = tau_dVdse ;
7944     here->HSM2_tau_dVbs = tau_dVbse ;
7945 
7946     here->HSM2_taub = taub ;
7947     here->HSM2_taub_dVgs = taub_dVgse ;
7948     here->HSM2_taub_dVds = taub_dVdse ;
7949     here->HSM2_taub_dVbs = taub_dVbse ;
7950 
7951     here->HSM2_Xd = Qdrat;
7952     here->HSM2_Xd_dVgs = Qdrat_dVgse ;
7953     here->HSM2_Xd_dVds = Qdrat_dVdse ;
7954     here->HSM2_Xd_dVbs = Qdrat_dVbse ;
7955 
7956     here->HSM2_Qb      = M * Qb ;
7957     here->HSM2_Qb_dVgs = M * Qb_dVgse ;
7958     here->HSM2_Qb_dVds = M * Qb_dVdse ;
7959     here->HSM2_Qb_dVbs = M * Qb_dVbse ;
7960 
7961     here->HSM2_Qi      = M * Qi ;
7962     here->HSM2_Qi_dVgs = M * Qi_dVgse ;
7963     here->HSM2_Qi_dVds = M * Qi_dVdse ;
7964     here->HSM2_Qi_dVbs = M * Qi_dVbse ;
7965 
7966   }
7967 
7968   /*---------------------------------------------------*
7969    * Substrate/gate/leak currents.
7970    *-----------------*/
7971 
7972   here->HSM2_isub = M * Isub ;
7973   here->HSM2_gbbs = M * Isub_dVbse ;
7974   here->HSM2_gbds = M * Isub_dVdse ;
7975   here->HSM2_gbgs = M * Isub_dVgse ;
7976 
7977   here->HSM2_igb   = M * -Igb ;
7978   here->HSM2_gigbb = M * -Igb_dVbse ;
7979   here->HSM2_gigbg = M * -Igb_dVgse ;
7980   if (here->HSM2_mode == HiSIM_NORMAL_MODE) {
7981     here->HSM2_gigbd = M * -Igb_dVdse ;
7982     here->HSM2_gigbs = M * ( Igb_dVbse + Igb_dVdse + Igb_dVgse ) ;
7983   } else {
7984     here->HSM2_gigbd = M * ( Igb_dVbse + Igb_dVdse + Igb_dVgse ) ;
7985     here->HSM2_gigbs = M * -Igb_dVdse ;
7986   }
7987 
7988   if (here->HSM2_mode == HiSIM_NORMAL_MODE) {
7989 
7990     here->HSM2_igd   = M * ( GLPART1 * Igate - Igd ) ;
7991     here->HSM2_gigdb = M * ( GLPART1 * Igate_dVbse + GLPART1_dVbse * Igate - Igd_dVbse ) ;
7992     here->HSM2_gigdd = M * ( GLPART1 * Igate_dVdse + GLPART1_dVdse * Igate - Igd_dVdse ) ;
7993     here->HSM2_gigdg = M * ( GLPART1 * Igate_dVgse + GLPART1_dVgse * Igate - Igd_dVgse ) ;
7994 
7995   } else {
7996 
7997     T1 = 1.0 - GLPART1 ;
7998     T1_dVb = - GLPART1_dVbse ;
7999     T1_dVd = - GLPART1_dVdse ;
8000     T1_dVg = - GLPART1_dVgse ;
8001     here->HSM2_igd = M * ( T1 * Igate - Igs ) ;
8002     here->HSM2_gigdb = M * ( T1 * Igate_dVbse + T1_dVb * Igate - Igs_dVbse ) ;
8003     here->HSM2_gigdd = M * ( T1 * - ( Igate_dVgse + Igate_dVbse + Igate_dVdse )
8004                      + ( - T1_dVb - T1_dVg - T1_dVd ) * Igate + ( Igs_dVgse + Igs_dVbse + Igs_dVdse ) ) ;
8005     here->HSM2_gigdg = M * ( T1 * Igate_dVgse + T1_dVg * Igate - Igs_dVgse ) ;
8006   }
8007   here->HSM2_gigds   = -(here->HSM2_gigdb + here->HSM2_gigdd + here->HSM2_gigdg) ;
8008 
8009   if (here->HSM2_mode == HiSIM_NORMAL_MODE) {
8010 
8011     T1 = 1.0 - GLPART1 ;
8012     T1_dVb = - GLPART1_dVbse ;
8013     T1_dVd = - GLPART1_dVdse ;
8014     T1_dVg = - GLPART1_dVgse ;
8015     here->HSM2_igs   = M * ( T1 * Igate - Igs ) ;
8016     here->HSM2_gigsb = M * ( T1 * Igate_dVbse + T1_dVb * Igate - Igs_dVbse ) ;
8017     here->HSM2_gigsd = M * ( T1 * Igate_dVdse + T1_dVd * Igate - Igs_dVdse ) ;
8018     here->HSM2_gigsg = M * ( T1 * Igate_dVgse + T1_dVg * Igate - Igs_dVgse ) ;
8019 
8020   } else {
8021 
8022     here->HSM2_igs   = M * ( GLPART1 * Igate - Igd ) ;
8023     here->HSM2_gigsb = M * ( GLPART1 * Igate_dVbse + GLPART1_dVbse * Igate - Igd_dVbse ) ;
8024     here->HSM2_gigsd = M * ( GLPART1 * -(Igate_dVgse + Igate_dVbse + Igate_dVdse)
8025                  - Igate * ( GLPART1_dVbse + GLPART1_dVdse + GLPART1_dVgse ) + (Igs_dVgse + Igs_dVbse + Igs_dVdse) ) ;
8026     here->HSM2_gigsg = M * ( GLPART1 * Igate_dVgse + GLPART1_dVgse * Igate - Igd_dVgse ) ;
8027 
8028   }
8029   here->HSM2_gigss   = -(here->HSM2_gigsb + here->HSM2_gigsd + here->HSM2_gigsg) ;
8030 
8031   here->HSM2_igidl    = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igidl       : M * Igisl ;
8032   here->HSM2_gigidlbs = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igidl_dVbse : M * Igisl_dVbse ;
8033   here->HSM2_gigidlds = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igidl_dVdse : M * ( - Igisl_dVbse - Igisl_dVdse - Igisl_dVgse ) ;
8034   here->HSM2_gigidlgs = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igidl_dVgse : M * Igisl_dVgse ;
8035 
8036   here->HSM2_igisl    = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igisl       : M * Igidl ;
8037   here->HSM2_gigislbd = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igisl_dVbse : M * Igidl_dVbse ;
8038   here->HSM2_gigislsd = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igisl_dVdse : M * ( - Igidl_dVbse - Igidl_dVdse - Igidl_dVgse ) ;
8039   here->HSM2_gigislgd = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igisl_dVgse : M * Igidl_dVgse ;
8040 
8041   /*---------------------------------------------------*
8042    * Von, Vdsat.
8043    *-----------------*/
8044   here->HSM2_von = Vth ;
8045   here->HSM2_vdsat = Vdsat ;
8046 
8047   /*---------------------------------------------------*
8048    * Junction diode.
8049    *-----------------*/
8050   here->HSM2_ibs = M * Ibs ;
8051   here->HSM2_ibd = M * Ibd ;
8052   here->HSM2_gbs = M * Gbse ;
8053   here->HSM2_gbd = M * Gbde ;
8054   *(ckt->CKTstate0 + here->HSM2qbs) = M * Qbs ;
8055   *(ckt->CKTstate0 + here->HSM2qbd) = M * Qbd ;
8056   here->HSM2_capbs = M * Capbse ;
8057   here->HSM2_capbd = M * Capbde ;
8058 
8059   /*-----------------------------------------------------------*
8060    * Warn floating-point exceptions.
8061    * - Function finite() in libm is called.
8062    * - Go to start with info==5.
8063    *-----------------*/
8064   T1 = here->HSM2_ids + here->HSM2_gmbs + here->HSM2_gds + here->HSM2_gm ;
8065   T1 = T1 + here->HSM2_qd + here->HSM2_cdsb ;
8066   if ( ! finite (T1) ) {
8067     flg_err = 1 ;
8068     fprintf (stderr ,
8069              "*** warning(HiSIM): FP-exception (PART-1)\n" ) ;
8070     if ( flg_info >= 1 ) {
8071       printf ( "*** warning(HiSIM): FP-exception\n") ;
8072       printf ( "here->HSM2_ids   = %12.5e\n" , here->HSM2_ids ) ;
8073       printf ( "here->HSM2_gmbs  = %12.5e\n" , here->HSM2_gmbs) ;
8074       printf ( "here->HSM2_gds   = %12.5e\n" , here->HSM2_gds ) ;
8075       printf ( "here->HSM2_gm    = %12.5e\n" , here->HSM2_gm  ) ;
8076       printf ( "here->HSM2_qd    = %12.5e\n" , here->HSM2_qd  ) ;
8077       printf ( "here->HSM2_cdsb  = %12.5e\n" , here->HSM2_cdsb) ;
8078     }
8079   }
8080 
8081   T1 = here->HSM2_isub + here->HSM2_gbbs + here->HSM2_gbds + here->HSM2_gbgs ;
8082   if ( ! finite (T1) ) {
8083     flg_err = 1 ;
8084     fprintf (stderr ,
8085              "*** warning(HiSIM): FP-exception (PART-2)\n") ;
8086     if ( flg_info >= 1 ) {
8087       printf ("*** warning(HiSIM): FP-exception\n") ;
8088     }
8089   }
8090 
8091   T1 = here->HSM2_cgbo + Cgdo + Cgso + Cggo ;
8092   if ( ! finite (T1) ) {
8093     flg_err = 1 ;
8094     fprintf(stderr ,
8095             "*** warning(HiSIM): FP-exception (PART-3)\n") ;
8096     if ( flg_info >= 1 ) {
8097       printf ("*** warning(HiSIM): FP-exception\n") ;
8098     }
8099   }
8100 
8101   T1 = here->HSM2_ibs + here->HSM2_ibd + here->HSM2_gbs + here->HSM2_gbd ;
8102   T1 = T1 + *(ckt->CKTstate0 + here->HSM2qbs) + *(ckt->CKTstate0 + here->HSM2qbd)
8103           + here->HSM2_capbs + here->HSM2_capbd ;
8104   if ( ! finite (T1) ) {
8105     flg_err = 1 ;
8106     fprintf(stderr ,
8107             "*** warning(HiSIM): FP-exception (PART-4)\n") ;
8108     if ( flg_info >= 1 ) {
8109       printf ("*** warning(HiSIM): FP-exception\n") ;
8110     }
8111   }
8112 
8113   /*-----------------------------------------------------------*
8114    * Exit for error case.
8115    *-----------------*/
8116   if ( flg_err != 0 ) {
8117     fprintf (stderr , "----- bias information (HiSIM)\n" ) ;
8118     fprintf (stderr , "name: %s\n" , here->HSM2name ) ;
8119     fprintf (stderr , "stetes: %d\n" , here->HSM2states ) ;
8120     fprintf (stderr , "vds= %12.5e vgs=%12.5e vbs=%12.5e\n"
8121             , vds , vgs , vbs ) ;
8122     fprintf (stderr , "vbs_jct= %12.5e vbd_jct= %12.5e\n"
8123             , vbs_jct , vbd_jct ) ;
8124     fprintf (stderr , "vd= %12.5e vg= %12.5e vb= %12.5e vs= %12.5e\n"
8125             , *( ckt->CKTrhsOld + here->HSM2dNodePrime )
8126             , *( ckt->CKTrhsOld + here->HSM2gNodePrime )
8127             , *( ckt->CKTrhsOld + here->HSM2bNodePrime )
8128             , *( ckt->CKTrhsOld + here->HSM2sNodePrime )  ) ;
8129     if ( here->HSM2_called >= 1 ) {
8130       fprintf (stderr , "vdsc_prv= %12.5e vgsc_prv=%12.5e vbsc_prv=%12.5e\n"
8131               , here->HSM2_vdsc_prv , here->HSM2_vgsc_prv
8132               , here->HSM2_vbsc_prv ) ;
8133     }
8134     fprintf (stderr , "----- bias information (end)\n" ) ;
8135   }
8136 
8137   if ( flg_err != 0 ) return ( HiSIM_ERROR ) ;
8138 
8139   /*-----------------------------------------------------------*
8140    * Noise.
8141    *-----------------*/
8142   here->HSM2_noiflick = M * Nflic ;
8143   here->HSM2_noithrml = M * Nthrml ;
8144 
8145   /*----------------------------------------------------------*
8146    * induced gate noise. ( Part 3/3 )
8147    *----------------------*/
8148   if ( model->HSM2_coign != 0 && model->HSM2_cothrml != 0 && flg_ign == 1 && !flg_noqi ) {
8149     T0 = Cox_small * Cox * here->HSM2_weff_nf * Leff ;
8150     T1 = here->HSM2_cgsb / M ;
8151     if( - T1 > T0 ){
8152       Nign0 = c_16o135 * C_QE * beta_inv * T1 * T1 / gds0_ign ;
8153       if ( kusai00L > epsm10 && Vds > epsm10 ) {
8154     MuModA = Muun / Mu ;
8155     MuModB = ( Muun / Mud_hoso - MuModA ) / Vds ;
8156     correct_w1 = MuModA + C_2o3 * MuModB
8157       * ( kusai00 + VgVt * sqrtkusaiL + kusaiL )
8158       / ( VgVt + sqrtkusaiL ) ;
8159       } else {
8160     correct_w1 = Muun / Mud_hoso ;
8161       }
8162       here->HSM2_noiigate = M * Nign0 * kusai_ig * correct_w1 ;
8163       here->HSM2_noicross = crl_f ;
8164       if ( here->HSM2_noiigate < 0.0 ) here->HSM2_noiigate = 0.0e0 ;
8165     }else{
8166     here->HSM2_noiigate = 0.0e0 ;
8167     here->HSM2_noicross = 0.0e0 ;
8168   }
8169   here->HSM2_Qdrat = Qdrat ; /* needed for calculating induced gate noise */
8170   }else{
8171     here->HSM2_noiigate = 0.0e0 ;
8172     here->HSM2_noicross = 0.0e0 ;
8173   }
8174 
8175   /*-----------------------------------------------------------*
8176    * Restore values for next calculation.
8177    *-----------------*/
8178 
8179   /* Confined biases */
8180   if ( here->HSM2_called >= 1 ) {
8181     here->HSM2_vbsc_prv2 = here->HSM2_vbsc_prv ;
8182     here->HSM2_vdsc_prv2 = here->HSM2_vdsc_prv ;
8183     here->HSM2_vgsc_prv2 = here->HSM2_vgsc_prv ;
8184     here->HSM2_mode_prv2 = here->HSM2_mode_prv ;
8185   }
8186   here->HSM2_vbsc_prv = Vbsc ;
8187   here->HSM2_vdsc_prv = Vdsc ;
8188   here->HSM2_vgsc_prv = Vgsc ;
8189   here->HSM2_mode_prv = here->HSM2_mode ;
8190 
8191   /* Surface potentials and derivatives w.r.t. internal biases */
8192   if ( here->HSM2_called >= 1 ) {
8193     here->HSM2_ps0_prv2 = here->HSM2_ps0_prv ;
8194     here->HSM2_ps0_dvbs_prv2 = here->HSM2_ps0_dvbs_prv ;
8195     here->HSM2_ps0_dvds_prv2 = here->HSM2_ps0_dvds_prv ;
8196     here->HSM2_ps0_dvgs_prv2 = here->HSM2_ps0_dvgs_prv ;
8197     here->HSM2_pds_prv2 = here->HSM2_pds_prv ;
8198     here->HSM2_pds_dvbs_prv2 = here->HSM2_pds_dvbs_prv ;
8199     here->HSM2_pds_dvds_prv2 = here->HSM2_pds_dvds_prv ;
8200     here->HSM2_pds_dvgs_prv2 = here->HSM2_pds_dvgs_prv ;
8201   }
8202 
8203   here->HSM2_ps0_prv = Ps0 ;
8204   here->HSM2_ps0_dvbs_prv = Ps0_dVbs ;
8205   here->HSM2_ps0_dvds_prv = Ps0_dVds ;
8206   here->HSM2_ps0_dvgs_prv = Ps0_dVgs ;
8207   here->HSM2_pds_prv = Pds ;
8208   here->HSM2_pds_dvbs_prv = Pds_dVbs ;
8209   here->HSM2_pds_dvds_prv = Pds_dVds ;
8210   here->HSM2_pds_dvgs_prv = Pds_dVgs ;
8211 
8212   /* Derivatives of channel current w.r.t. internal biases */
8213   here->HSM2_ids_prv = Ids ;
8214   here->HSM2_ids_dvbs_prv = Ids_dVbs ;
8215   here->HSM2_ids_dvds_prv = Ids_dVds ;
8216   here->HSM2_ids_dvgs_prv = Ids_dVgs ;
8217 
8218   /* For CORECIP = 1 */
8219   if ( corecip ) {
8220     here->HSM2_PS0Z_SCE_prv = PS0Z_SCE ;
8221     here->HSM2_PS0Z_SCE_dvds_prv = PS0Z_SCE_dVds ;
8222     here->HSM2_PS0Z_SCE_dvgs_prv = PS0Z_SCE_dVgs ;
8223     here->HSM2_PS0Z_SCE_dvbs_prv = PS0Z_SCE_dVbs ;
8224     /* here->HSM2_nnn = NNN ; */
8225   }
8226 
8227   /*-----------------------------------------------------------*
8228    * End of PART-7. (label)
8229    *-----------------*/
8230 /* end_of_part_7: */
8231 
8232   /*-----------------------------------------------------------*
8233    * Bottom of hsm2eval.
8234    *-----------------*/
8235 
8236 
8237   return ( HiSIM_OK ) ;
8238 
8239 } /* end of hsm2eval */
8240 
8241