1 /***********************************************************************
2 
3  HiSIM (Hiroshima University STARC IGFET Model)
4  Copyright (C) 2014 Hiroshima University & STARC
5 
6  MODEL NAME : HiSIM_HV
7  ( VERSION : 2  SUBVERSION : 2  REVISION : 0 )
8  Model Parameter 'VERSION' : 2.20
9  FILE : hsmhveval_rdrift.c
10 
11  DATE : 2014.6.11
12 
13  released by
14                 Hiroshima University &
15                 Semiconductor Technology Academic Research Center (STARC)
16 ***********************************************************************/
17 
18 /**********************************************************************
19 
20 The following source code, and all copyrights, trade secrets or other
21 intellectual property rights in and to the source code in its entirety,
22 is owned by the Hiroshima University and the STARC organization.
23 
24 All users need to follow the "HISIM_HV Distribution Statement and
25 Copyright Notice" attached to HiSIM_HV model.
26 
27 -----HISIM_HV Distribution Statement and Copyright Notice--------------
28 
29 Software is distributed as is, completely without warranty or service
30 support. Hiroshima University or STARC and its employees are not liable
31 for the condition or performance of the software.
32 
33 Hiroshima University and STARC own the copyright and grant users a perpetual,
34 irrevocable, worldwide, non-exclusive, royalty-free license with respect
35 to the software as set forth below.
36 
37 Hiroshima University and STARC hereby disclaims all implied warranties.
38 
39 Hiroshima University and STARC grant the users the right to modify, copy,
40 and redistribute the software and documentation, both within the user's
41 organization and externally, subject to the following restrictions
42 
43 1. The users agree not to charge for Hiroshima University and STARC code
44 itself but may charge for additions, extensions, or support.
45 
46 2. In any product based on the software, the users agree to acknowledge
47 Hiroshima University and STARC that developed the software. This
48 acknowledgment shall appear in the product documentation.
49 
50 3. The users agree to reproduce any copyright notice which appears on
51 the software on any copy or modification of such made available
52 to others."
53 
54 Toshimasa Asahara, President, Hiroshima University
55 Mitiko Miura-Mattausch, Professor, Hiroshima University
56 Katsuhiro Shimohigashi, President&CEO, STARC
57 June 2008 (revised October 2011)
58 *************************************************************************/
59 
60 /*===========================================================*
61 * Preamble.
62 *=================*/
63 /*---------------------------------------------------*
64 * Header files.
65 *-----------------*/
66 #include "ngspice/ngspice.h"
67 #ifdef __STDC__
68 /* #include <ieeefp.h> */
69 #endif
70 
71 /*-----------------------------------*
72 * HiSIM macros
73 *-----------------*/
74 #include "hisimhv2.h"
75 #include "hsmhv2evalenv.h"
76 
77 /* local variables used in macro functions */
78 static double TMF0 , TMF1 , TMF2 , TMF3 ;
79 
80 /*===========================================================*
81 * pow
82 *=================*/
83 #ifdef POW_TO_EXP_AND_LOG
84 #define Fn_Pow( x , y )  exp( y * log( x )  )
85 #else
86 #define Fn_Pow( x , y )  pow( x , y )
87 #endif
88 
89 /*===========================================================*
90 * Macro Functions for ceiling/flooring/symmetrization.
91 *=================*/
92 /*---------------------------------------------------*
93 * smoothUpper: ceiling.
94 *      y = xmax - 0.5 ( arg + sqrt( arg^2 + 4 xmax delta ) )
95 *    arg = xmax - x - delta
96 *-----------------*/
97 
98 #define Fn_SU( y , x , xmax , delta , dx ) { \
99     TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
100     TMF2 = 4.0 * ( xmax ) * ( delta) ; \
101     TMF2 = TMF2 > 0.0 ?  TMF2 : - ( TMF2 ) ; \
102     TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
103     dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
104     y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
105   }
106 
107 #define Fn_SU2( y , x , xmax , delta , dy_dx , dy_dxmax ) { \
108     TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
109     TMF2 = 4.0 * ( xmax ) * ( delta) ; \
110     TMF2 = TMF2 > 0.0 ?  TMF2 : - ( TMF2 ) ; \
111     TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
112     dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
113     dy_dxmax = 0.5 * ( 1.0 - ( TMF1 + 2.0 * delta ) / TMF2 ) ; \
114     y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
115   }
116 
117 /*---------------------------------------------------*
118 * smoothLower: flooring.
119 *      y = xmin + 0.5 ( arg + sqrt( arg^2 + 4 xmin delta ) )
120 *    arg = x - xmin - delta
121 *-----------------*/
122 
123 #define Fn_SL( y , x , xmin , delta , dx ) { \
124     TMF1 = ( x ) - ( xmin ) - ( delta ) ; \
125     TMF2 = 4.0 * ( xmin ) * ( delta ) ; \
126     TMF2 = TMF2 > 0.0 ?  TMF2 : - ( TMF2 ) ; \
127     TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
128     dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
129     y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \
130   }
131 
132 #define Fn_SL2( y , x , xmin , delta , dy_dx, dy_dxmin ) { \
133     TMF1 = ( x ) - ( xmin ) - ( delta ) ; \
134     TMF2 = 4.0 * ( xmin ) * ( delta ) ; \
135     TMF2 = TMF2 > 0.0 ?  TMF2 : - ( TMF2 ) ; \
136     TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
137     dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
138     dy_dxmin = 0.5 * ( 1.0 - ( TMF1 - 2.0 * delta ) / TMF2 ) ; \
139     y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \
140   }
141 
142 /*---------------------------------------------------*
143 * smoothZero: flooring to zero.
144 *      y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) )
145 *-----------------*/
146 
147 #define Fn_SZ( y , x , delta , dx ) { \
148     TMF2 = sqrt ( ( x ) *  ( x ) + 4.0 * ( delta ) * ( delta ) ) ; \
149     dx = 0.5 * ( 1.0 + ( x ) / TMF2 ) ; \
150     y = 0.5 * ( ( x ) + TMF2 ) ; \
151     if( y < 0.0 ) { y=0.0; dx=0.0; } \
152   }
153 
154 /*---------------------------------------------------*
155 * SymAdd: evaluate additional term for symmetry.
156 *-----------------*/
157 
158 #define Fn_SymAdd( y , x , add0 , dx ) \
159 { \
160    if( ( x ) < 1e6 ) { \
161     TMF1 = 2.0 * ( x ) / ( add0 ) ; \
162     TMF2 = 1.0 + TMF1 * ( (1.0/2) + TMF1 * ( (1.0/6) \
163                + TMF1 * ( (1.0/24) + TMF1 * ( (1.0/120) \
164                + TMF1 * ( (1.0/720) + TMF1 * (1.0/5040) ) ) ) ) ) ; \
165     TMF3 = (1.0/2) + TMF1 * ( (1.0/3) \
166                + TMF1 * ( (1.0/8) + TMF1 * ( (1.0/30) \
167                + TMF1 * ( (1.0/144) + TMF1 * (1.0/840) ) ) ) ) ; \
168     y = add0 / TMF2 ; \
169     dx = - 2.0 * TMF3 / ( TMF2 * TMF2 ) ; \
170    } else { y=0.0; dx=0.9; } \
171 }
172 
173 #define Fn_CP( y , x , xmax , pw , dx ) { \
174   double x2 = (x) * (x) ; \
175   double xmax2 = (xmax) * (xmax) ; \
176   double xp = 1.0 , xmp = 1.0 ; \
177   int   m =0, mm =0; \
178   double arg =0.0, dnm =0.0; \
179   for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \
180   arg = xp + xmp ; \
181   dnm = arg ; \
182   if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \
183     if ( pw == 1 ) { mm = 1 ; \
184     } else if ( pw == 2 ) { mm = 2 ; \
185     } else if ( pw == 4 ) { mm = 3 ; \
186     } else if ( pw == 8 ) { mm = 4 ; } \
187     for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \
188   } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \
189   dnm = 1.0 / dnm ; \
190   y = (x) * (xmax) * dnm ; \
191   dx = (xmax) * xmp * dnm / arg ; \
192 }
193 
194 #define Fn_SU_CP( y , x , xmax , delta , pw , dx ) { \
195  if(x > xmax - delta && delta >= 0.0) { \
196    TMF1 = x - xmax + delta ; \
197    Fn_CP( TMF0 , TMF1 , delta , pw , dx )  \
198    y = xmax - delta + TMF0 ; \
199    dx = dx ; \
200  } else { \
201    y = x ; \
202    dx = 1.0 ; \
203  } \
204 }
205 
206 /*===========================================================*
207 * Function hsmhvrdrift.
208 *=================*/
209 
HSMHV2rdrift(double Vddp,double Vds,double Vbs,double Vsubs,double deltemp,HSMHV2instance * here,HSMHV2model * model,CKTcircuit * ckt)210 int HSMHV2rdrift
211 (
212  double        Vddp,
213  double        Vds,
214  double        Vbs,
215  double        Vsubs, /* substrate-source voltage */
216  double        deltemp,
217  HSMHV2instance *here,
218  HSMHV2model    *model,
219  CKTcircuit    *ckt
220 )
221 {
222   HSMHV2binningParam *pParam = &here->pParam ;
223   HSMHV2modelMKSParam *modelMKS = &model->modelMKS ;
224 
225   const double small = 1.0e-50 ;
226 
227   double Mfactor =0.0, WeffLD_nf  =0.0 ;
228   double Ldrift  =0.0, Xldld      =0.0 ;
229   double Nover   =0.0                  ;
230 
231   /* temporary vars. & derivatives*/
232   double T0 =0.0, T0_dVb =0.0, T0_dVd =0.0, T0_dVg =0.0, T0_dT =0.0 ;
233   double T1 =0.0, T1_dVd =0.0, T1_dT =0.0, T1_dVddp =0.0 ;
234   double T2 =0.0, T2_dVb =0.0, T2_dVd =0.0, T2_dT =0.0, T2_dVddp =0.0 ;
235   double T3 =0.0, T3_dT =0.0, T3_dVddp =0.0 ;
236   double T4 =0.0, T4_dT =0.0, T4_dVddp =0.0 ;
237   double T5 =0.0, T5_dT =0.0, T5_dVddp =0.0 ;
238   double T6 =0.0, T6_dT =0.0, T6_dVddp =0.0 ;
239   double T9 =0.0 ;
240 
241   /* bias-dependent Rd, Rs */
242 
243   double Edri  =0.0, Edri_dVddp =0.0 ;
244   double Vdri  =0.0, Vdri_dVddp =0.0, Vdri_dT =0.0 ;
245   double Vmax  =0.0, Vmax_dT    =0.0 ;
246   double Mu0   =0.0, Mu0_dT  =0.0 ;
247   double Cx    =0.0, Cx_dT      =0.0 ;
248   double Car   =0.0, Car_dT     =0.0 ;
249   double Mu    =0.0, Mu_dVddp = 0.0, Mu_dT   =0.0 ;
250   double Xov =0.0, Xov_dVds =0.0, Xov_dVgs =0.0, Xov_dVbs =0.0, Xov_dT =0.0 ;
251   double Carr =0.0, Carr_dVds=0.0, Carr_dVgs=0.0, Carr_dVbs=0.0, Carr_dVddp =0.0, Carr_dT =0.0 ;
252 
253   double GD   =0.0, GD_dVddp   =0.0, GD_dVgse   =0.0, GD_dT   =0.0, GD_dVds   =0.0, GD_dVgs   =0.0, GD_dVbs   =0.0 ;
254   double Rd   =0.0, Rd_dVddp   =0.0, Rd_dVdse   =0.0, Rd_dVgse   =0.0, Rd_dVbse   =0.0, Rd_dT   =0.0, Rd_dVds   =0.0, Rd_dVgs   =0.0, Rd_dVbs   =0.0 ;
255   double Vddpz=0.0, Vddpz_dVddp=0.0, Vzadd      =0.0, Vzadd_dVddp=0.0 ;
256 
257   /* temperature-dependent variables for SHE model */
258   double TTEMP  =0.0, TTEMP0   =0.0 ;
259 
260   /* Wdepl and Wjunc */
261   double Wdepl, Wdepl_dVd, Wdepl_dVg, Wdepl_dVb, Wdepl_dT;
262   double Wjunc0, Wjunc0_dVd, Wjunc0_dVb;
263   double Wrdrdjunc, Wjunc, Wjunc_dVd, Wjunc_dVb;
264 
265   const double Res_min = 1.0e-4 ;
266   const double epsm10 = 10.0e0 * C_EPS_M ;
267   const double ps_conv = 1.0e-12 ;
268 
269   double Rdrbb_dT =0.0 ;
270 
271   double Wdep = 0.0, Wdep_dVdserev = 0.0, Wdep_dVsubsrev = 0.0 ;
272   double T1_dVdserev = 0.0, T1_dVsubsrev = 0.0, T6_dVdserev = 0.0, T6_dVsubsrev = 0.0 ;
273   double Rd_dVsubs=0.0 ;
274 
275 #define C_sub_delta 0.1 /* CHECK! */
276 #define C_sub_delta2 1.0e-9 /* CHECK! */
277 
278   NG_IGNORE(Vsubs);
279 
280   /*================ Start of executable code.=================*/
281 
282   /*-----------------------------------------------------------*
283    * Temperature dependent constants.
284    *-----------------*/
285   if ( here->HSMHV2tempNode > 0 && pParam->HSMHV2_rth0 != 0.0 ) {
286 
287 #define HSMHV2EVAL
288 #include "hsmhv2temp_eval_rdri.h"
289 
290   } else {
291     if ( here->HSMHV2_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV2_dtemp ; }
292     Mu0_dT      = 0.0 ;
293     Vmax_dT     = 0.0 ;
294     Cx_dT       = 0.0 ;
295     Car_dT      = 0.0 ;
296     Rdrbb_dT    = 0.0 ;
297   }
298 
299   Mfactor   = here->HSMHV2_m ;
300   WeffLD_nf = here->HSMHV2_weff_ld * here->HSMHV2_nf ;
301   Ldrift    = here->HSMHV2_ldrift1 + here->HSMHV2_ldrift2 ;
302   Xldld     = model->HSMHV2_xldld + small ;
303   Nover     = pParam->HSMHV2_nover ;
304 
305 
306   Mu0    = here->HSMHV2_rdrmue * here->HSMHV2_rdrmuel ;
307   Mu0_dT = Mu0_dT * here->HSMHV2_rdrmuel ;
308   Vmax    = here->HSMHV2_rdrvmax * here->HSMHV2_rdrvmaxw * here->HSMHV2_rdrvmaxl + small ;
309   Vmax_dT = Vmax_dT * here->HSMHV2_rdrvmaxw * here->HSMHV2_rdrvmaxl ;
310   Cx      = here->HSMHV2_rdrcx * here->HSMHV2_rdrcxw ;
311   Cx_dT   = Cx_dT * here->HSMHV2_rdrcxw ;
312   Car     = here->HSMHV2_rdrcar ;
313 
314   //-----------------------------------------------------------*
315   // Modified bias introduced to realize symmetry at Vddp=0.
316   //-----------------//
317   if(Vddp < 0) {
318     Fn_SymAdd( Vzadd , -Vddp / 2 , model->HSMHV2_vzadd0 , T2 ) ;
319     Vzadd_dVddp = - T2 / 2.0 ;
320     if( Vzadd < ps_conv ) {
321         Vzadd = ps_conv ;
322         Vzadd_dVddp = 0.0 ;
323     }
324     Vddpz = Vddp - 2 * Vzadd ;
325     Vddpz_dVddp = 1.0 - 2 * Vzadd_dVddp ;
326   } else {
327     Fn_SymAdd( Vzadd ,  Vddp / 2 , model->HSMHV2_vzadd0 , T2 ) ;
328     Vzadd_dVddp =   T2 / 2.0 ;
329     if( Vzadd < ps_conv ) {
330         Vzadd = ps_conv ;
331         Vzadd_dVddp = 0.0 ;
332     }
333     Vddpz = Vddp + 2 * Vzadd ;
334     Vddpz_dVddp = 1.0 + 2 * Vzadd_dVddp ;
335   }
336 
337   Edri       = Vddpz / Ldrift ;
338   Edri_dVddp = Vddpz_dVddp  / Ldrift ;
339 
340   Vdri       = Mu0    * Edri ;
341   Vdri_dVddp = Mu0    * Edri_dVddp ;
342   Vdri_dT    = Mu0_dT * Edri ;
343 
344   /*-----------------------------------------------------------*
345    * Mu : mobility
346    *-----------------*/
347   if ( Vddp >= 0 ) {
348     T1       = Vdri / Vmax ;
349     T1_dVddp = Vdri_dVddp / Vmax ;
350     T1_dT    = ( Vdri_dT * Vmax -  Vdri * Vmax_dT ) / ( Vmax * Vmax );
351   } else  {
352     T1       = - Vdri / Vmax ;
353     T1_dVddp = - Vdri_dVddp / Vmax ;
354     T1_dT    = - ( Vdri_dT * Vmax - Vdri * Vmax_dT ) / ( Vmax * Vmax );
355   }
356 
357   if( model->HSMHV2_rdrbbtmp == 0.0 ) {
358     if( T1 == 0.0 ) {
359       T2 = 0.0 ; T2_dT = 0.0 ; T2_dVddp = 0.0 ;
360       T4 = 1.0 ; T4_dT = 0.0 ; T4_dVddp = 0.0 ;
361     }else {
362       if ( 1.0e0 - epsm10 <= here->HSMHV2_rdrbb && here->HSMHV2_rdrbb <= 1.0e0 + epsm10 )  {
363         T3 = 1.0e0 ;
364         T3_dT    = 0.0e0 ;
365         T3_dVddp = 0.0e0 ;
366       } else if ( 2.0e0 - epsm10 <= here->HSMHV2_rdrbb && here->HSMHV2_rdrbb <= 2.0e0 + epsm10 )  {
367         T3 = T1 ;
368         T3_dT    = T1_dT ;
369         T3_dVddp = T1_dVddp ;
370       } else  {
371         T3 = Fn_Pow( T1 , here->HSMHV2_rdrbb - 1.0e0 ) ;
372         T3_dT    = ( here->HSMHV2_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV2_rdrbb - 2.0e0 ) * T1_dT ;
373         T3_dVddp = ( here->HSMHV2_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV2_rdrbb - 2.0e0 ) * T1_dVddp ;
374       }
375       T2 = T1 * T3 ;
376       T2_dT    = T1 * T3_dT  + T3 * T1_dT ;
377       T2_dVddp = T1 * T3_dVddp + T3 * T1_dVddp ;
378       T4 = 1.0e0 + T2 ;
379       T4_dT    = T2_dT ;
380       T4_dVddp = T2_dVddp ;
381     }
382 
383     if ( 1.0e0 - epsm10 <= here->HSMHV2_rdrbb && here->HSMHV2_rdrbb <= 1.0e0 + epsm10 )  {
384       T5 = 1.0 / T4 ;
385       T5_dT    = - T5 * T5 * T4_dT ;
386       T5_dVddp = - T5 * T5 * T4_dVddp ;
387     } else if ( 2.0e0 - epsm10 <= here->HSMHV2_rdrbb && here->HSMHV2_rdrbb <= 2.0e0 + epsm10 )  {
388       T5 = 1.0 / sqrt( T4 ) ;
389       T5_dT    = - 0.5e0 / ( T4 * sqrt(T4) ) * T4_dT ;
390       T5_dVddp = - 0.5e0 / ( T4 * sqrt(T4) ) * T4_dVddp;
391     } else  {
392       T6 = Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) ) ;
393       T5 = T4 * T6 ;
394       T6_dT    = ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 2.0e0 ) ) * T4_dT ;
395       T6_dVddp = ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 2.0e0 ) ) * T4_dVddp ;
396       T5_dT    = T4_dT * T6  + T4 * T6_dT ;
397       T5_dVddp = T4_dVddp * T6 + T4 * T6_dVddp ;
398     }
399 
400   } else {
401     if( T1 == 0.0 ) {
402       T2 = 0.0 ; T2_dT = 0.0 ; T2_dVddp = 0.0 ;
403       T4 = 1.0 ; T4_dT = 0.0 ; T4_dVddp = 0.0 ;
404     }else {
405       T3 = Fn_Pow( T1 , here->HSMHV2_rdrbb - 1.0e0 ) ;
406       T3_dT    = ( here->HSMHV2_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV2_rdrbb - 2.0e0 ) * T1_dT + T3*log(T1)*Rdrbb_dT ;
407       T3_dVddp = ( here->HSMHV2_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV2_rdrbb - 2.0e0 ) * T1_dVddp ;
408       T2 = T1 * T3 ;
409       T2_dT    = T1 * T3_dT  + T3 * T1_dT ;
410       T2_dVddp = T1 * T3_dVddp + T3 * T1_dVddp ;
411       T4 = 1.0e0 + T2 ;
412       T4_dT    = T2_dT ;
413       T4_dVddp = T2_dVddp ;
414     }
415     T6 = Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) ) ;
416     T5 = T4 * T6 ;
417     T6_dT    = ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 2.0e0 ) ) * T4_dT +T6*log(T4)/here->HSMHV2_rdrbb/here->HSMHV2_rdrbb*Rdrbb_dT ;
418     T6_dVddp = ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 2.0e0 ) ) * T4_dVddp ;
419     T5_dT    = T4_dT * T6  + T4 * T6_dT ;
420     T5_dVddp = T4_dVddp * T6 + T4 * T6_dVddp ;
421   }
422 
423   Mu       = Mu0 * T5 ;
424   Mu_dVddp = Mu0 * T5_dVddp ;
425   Mu_dT    = Mu0_dT * T5 + Mu0 * T5_dT ;
426 
427   /*-----------------------------------------------------------*
428    * Carr : carrier density
429    *-----------------*/
430 
431   T4     = 1.0e0 + T1 ;
432   T4_dVddp = T1_dVddp ;
433   T4_dT    = T1_dT ;
434 
435   T5     = 1.0 / T4 ;
436   T5_dVddp = - T5 * T5 * T4_dVddp ;
437   T5_dT    = - T5 * T5 * T4_dT ;
438 
439   Carr       = Nover * ( 1.0 + Car * ( 1.0 - T5 ) * Vddpz /  ( Ldrift - model->HSMHV2_rdrdl2 ) ) ;
440   Carr_dVddp = Nover * Car * ( - T5_dVddp * Vddpz + ( 1.0 - T5 ) * Vddpz_dVddp ) / ( Ldrift - model->HSMHV2_rdrdl2 ) ;
441   Carr_dT    = Nover * ( Car_dT * ( 1.0 - T5 ) + Car * ( - T5_dT ) ) * Vddpz / ( Ldrift - model->HSMHV2_rdrdl2 ) ;
442 
443   Carr      += - here->HSMHV2_QbuLD      / C_QE * model->HSMHV2_rdrqover;
444   Carr_dVds  = - here->HSMHV2_QbuLD_dVds / C_QE * model->HSMHV2_rdrqover;
445   Carr_dVgs  = - here->HSMHV2_QbuLD_dVgs / C_QE * model->HSMHV2_rdrqover;
446   Carr_dVbs  = - here->HSMHV2_QbuLD_dVbs / C_QE * model->HSMHV2_rdrqover;
447   Carr_dT   += - here->HSMHV2_QbuLD_dTi  / C_QE * model->HSMHV2_rdrqover;
448 
449   /*-----------------------------------------------------------*
450    * Xov : depth of the current flow
451    *-----------------*/
452   T0     = -here->HSMHV2_Ps0LD ;
453   T0_dVd = -here->HSMHV2_Ps0LD_dVds ;
454   T0_dVg = -here->HSMHV2_Ps0LD_dVgs ;
455   T0_dVb = -here->HSMHV2_Ps0LD_dVbs ;
456   T0_dT  = -here->HSMHV2_Ps0LD_dTi  ;
457 
458   Fn_SZ( T0 , T0 , 1.0e-2 , T9 ) ;
459   T0 +=  epsm10 ;
460   T0_dVd *= T9 ;
461   T0_dVg *= T9 ;
462   T0_dVb *= T9 ;
463   T0_dT  *= T9 ;
464 
465   Wdepl     = sqrt ( here->HSMHV2_kdep * T0 ) ;
466   Wdepl_dVd = here->HSMHV2_kdep / ( 2.0 * Wdepl ) * T0_dVd ;
467   Wdepl_dVg = here->HSMHV2_kdep / ( 2.0 * Wdepl ) * T0_dVg ;
468   Wdepl_dVb = here->HSMHV2_kdep / ( 2.0 * Wdepl ) * T0_dVb ;
469   Wdepl_dT  = here->HSMHV2_kdep / ( 2.0 * Wdepl ) * T0_dT  ;
470 
471   T2     = Vds - Vbs + model->HSMHV2_vbi ;
472   T2_dVd = 1.0  ;
473   T2_dVb = -1.0 ;
474 
475   Fn_SZ( T2 , T2 , 1.0e-2 , T9 ) ;
476   T2 +=  epsm10 ;
477   T2_dVd *= T9 ;
478   T2_dVb *= T9 ;
479 
480   Wjunc0     = sqrt ( here->HSMHV2_kjunc * T2 ) ;
481   Wjunc0_dVd = here->HSMHV2_kjunc / ( 2.0 * Wjunc0 ) * T2_dVd ;
482   Wjunc0_dVb = here->HSMHV2_kjunc / ( 2.0 * Wjunc0 ) * T2_dVb ;
483   Fn_SU( Wjunc, Wjunc0, Xldld, 10e-3*Xldld, T0 );
484   Wjunc_dVd = Wjunc0_dVd * T0;
485   Wjunc_dVb = Wjunc0_dVb * T0;
486 //  Wrdrdjunc = model->HSMHV2_rdrdjunc + small ;
487   Wrdrdjunc = model->HSMHV2_rdrdjunc + epsm10 ;
488 
489 
490   Xov      = here->HSMHV2_Xmax - Cx * (  here->HSMHV2_Xmax
491              / Wrdrdjunc * Wdepl +  here->HSMHV2_Xmax / Xldld * Wjunc ) ;
492   Xov_dVds = - Cx *  here->HSMHV2_Xmax / Wrdrdjunc * Wdepl_dVd
493              - Cx *  here->HSMHV2_Xmax / Xldld * Wjunc_dVd ;
494   Xov_dVgs = - Cx *  here->HSMHV2_Xmax / Wrdrdjunc * Wdepl_dVg ;
495   Xov_dVbs = - Cx *  here->HSMHV2_Xmax / Wrdrdjunc * Wdepl_dVb
496              - Cx *  here->HSMHV2_Xmax / Xldld * Wjunc_dVb ;
497   Xov_dT   = - Cx_dT * (  here->HSMHV2_Xmax
498              / Wrdrdjunc * Wdepl +  here->HSMHV2_Xmax / Xldld * Wjunc )
499              - Cx *  here->HSMHV2_Xmax / Wrdrdjunc * Wdepl_dT  ;
500 
501   Fn_SZ( Xov , Xov , (1.0 - here->HSMHV2_rdrcx) * here->HSMHV2_Xmax / 100 , T9 ) ;
502 
503   Xov_dVds *= T9 ;
504   Xov_dVgs *= T9 ;
505   Xov_dVbs *= T9 ;
506   Xov_dT   *= T9 ;
507 
508   /*-----------------------------------------------------------*
509    * Rd : drift resistance
510    *-----------------*/
511   T0 = C_QE / ( Ldrift + model->HSMHV2_rdrdl1 );
512   T1 = T0;
513   T1_dVd = 0.0 ;
514 
515   GD       = T1 * Xov * Mu * Carr ;
516   GD_dVddp = T1 * Xov * Mu_dVddp * Carr
517              + T1 * Xov * Mu * Carr_dVddp ;
518   GD_dVgse = 0.0 ;
519   GD_dT    = T1 * Xov * Mu_dT * Carr
520              + T1 * Xov_dT * Mu * Carr
521              + T1 * Xov * Mu * Carr_dT ;
522   GD_dVds  = T1 * Mu * (Xov_dVds * Carr + Xov * Carr_dVds)
523              + T1_dVd * Mu * Xov * Carr;
524   GD_dVgs  = T1 * Mu * (Xov_dVgs * Carr + Xov * Carr_dVgs);
525   GD_dVbs  = T1 * Mu * (Xov_dVbs * Carr + Xov * Carr_dVbs);
526 
527   if ( GD <= 0 ) {
528 //    GD       = small ;
529     GD       = epsm10 ;
530     GD_dVddp = 0.0 ;
531     GD_dVgse = 0.0 ;
532     GD_dT    = 0.0 ;
533     GD_dVds  = 0.0 ;
534     GD_dVgs  = 0.0 ;
535     GD_dVbs  = 0.0 ;
536   }
537 
538   Rd       = 1 / GD ;
539   Rd_dVddp = - GD_dVddp * Rd * Rd ;
540   Rd_dVgse = - GD_dVgse * Rd * Rd ;
541   Rd_dT    = - GD_dT    * Rd * Rd ;
542   Rd_dVds  = - GD_dVds  * Rd * Rd ;
543   Rd_dVgs  = - GD_dVgs  * Rd * Rd ;
544   Rd_dVbs  = - GD_dVbs  * Rd * Rd ;
545 
546   /* Weff dependence of the resistances */
547   Rd = Rd  /  WeffLD_nf ;
548 
549   Fn_SU_CP( Rd, Rd, 1e6, 1e3, 2, T0 ) ;
550 
551   Rd_dVddp = Rd_dVddp*T0/WeffLD_nf ;
552   Rd_dVgse = Rd_dVgse*T0/WeffLD_nf ;
553   Rd_dT    = Rd_dT*T0/WeffLD_nf ;
554   Rd_dVds  = Rd_dVds*T0/WeffLD_nf ;
555   Rd_dVgs  = Rd_dVgs*T0/WeffLD_nf ;
556   Rd_dVbs  = Rd_dVbs*T0/WeffLD_nf ;
557 
558   if ( here->HSMHV2subNode >= 0 &&
559        ( pParam->HSMHV2_nover * ( modelMKS->HSMHV2_nsubsub + pParam->HSMHV2_nover ) ) > 0 ) {
560       /* external substrate node exists && LDMOS case: */
561       /* Substrate Effect */
562     T0 = model->HSMHV2_vbisub - model->HSMHV2_rdvdsub * here->HSMHV2_Vdserevz - model->HSMHV2_rdvsub * here->HSMHV2_Vsubsrev ;
563 
564     Fn_SZ( T1, T0, 10.0, T2 ) ;
565     T1 += epsm10 ;
566 
567     T1_dVdserev  = - model->HSMHV2_rdvdsub * here->HSMHV2_Vdserevz_dVd * T2 ;
568     T1_dVsubsrev = - model->HSMHV2_rdvsub  * T2 ;
569 
570     T0 = modelMKS->HSMHV2_nsubsub / ( pParam->HSMHV2_nover * ( modelMKS->HSMHV2_nsubsub + pParam->HSMHV2_nover ) ) ;
571 
572     T4 = 2 * C_ESI / C_QE * T0 ;
573     Wdep = sqrt ( T4 * T1 ) + small ;
574 
575     Wdep_dVdserev =  0.5 * T4 * T1_dVdserev  / Wdep ;
576     Wdep_dVsubsrev = 0.5 * T4 * T1_dVsubsrev / Wdep ;
577 
578     Fn_SU( Wdep, Wdep, model->HSMHV2_ddrift, C_sub_delta * model->HSMHV2_ddrift, T0 ) ;
579     Wdep_dVdserev *=  T0 ;
580     Wdep_dVsubsrev *= T0 ;
581 
582     T0 = model->HSMHV2_ddrift - Wdep ;
583     Fn_SZ( T0, T0, C_sub_delta2, T2 ) ;
584     T0 += epsm10;
585 
586     T6 = (here->HSMHV2_ldrift1 +  here->HSMHV2_ldrift2 ) / T0 ;
587     T6_dVdserev =  T2 * Wdep_dVdserev  * T6 / T0 ;
588     T6_dVsubsrev = T2 * Wdep_dVsubsrev * T6 / T0 ;
589 
590     T0 = Rd ;
591     Rd        = T0 * T6 ;
592     Rd_dVddp  = Rd_dVddp * T6 ;
593     Rd_dVgse  = Rd_dVgse * T6 ;
594     Rd_dVdse  = T0 * T6_dVdserev ;
595     Rd_dVbse  = Rd_dVgse * T6 ;
596 
597     Rd_dVds   = Rd_dVds * T6 ;
598     Rd_dVgs   = Rd_dVgs * T6 ;
599     Rd_dVbs   = Rd_dVbs * T6 ;
600     Rd_dVsubs = T0 * T6_dVsubsrev ;
601     Rd_dT     = Rd_dT    * T6 ;
602 
603   }
604 
605 
606   /* Sheet resistances are added. */
607   Rd += here->HSMHV2_rd0 ;
608 
609   /* Re-stamps for hsmhvnoi.c */
610   /* Please see hsmhvnoi.c */
611   if ( Rd > Res_min && model->HSMHV2_cothrml )
612        here->HSMHV2drainConductance = Mfactor / Rd ;
613   else here->HSMHV2drainConductance = 0.0 ;
614   if ( here->HSMHV2_Rs > Res_min && model->HSMHV2_cothrml )
615        here->HSMHV2sourceConductance = Mfactor / here->HSMHV2_rs0 ;
616   else here->HSMHV2sourceConductance = 0.0 ;
617 
618   /* Clamping to Res_min */
619   here->HSMHV2_Rs = here->HSMHV2_rs0 / Mfactor ;
620   if(here->HSMHV2_Rs < Res_min) { here->HSMHV2_Rs = Res_min ; }
621   here->HSMHV2_dRs_dVdse  = 0.0 ;
622   here->HSMHV2_dRs_dVgse  = 0.0 ;
623   here->HSMHV2_dRs_dVbse  = 0.0 ;
624   here->HSMHV2_dRs_dVsubs = 0.0 ;
625   here->HSMHV2_dRs_dTi = 0.0 ;
626 
627 
628     /* Clamping to Res_min */
629     here->HSMHV2_Rd = Rd / Mfactor ;
630     if(here->HSMHV2_Rd < Res_min) {
631       here->HSMHV2_Rd = Res_min ;
632       here->HSMHV2_dRd_dVddp  = 0.0 ;
633       here->HSMHV2_dRd_dVdse  = 0.0 ;
634       here->HSMHV2_dRd_dVgse  = 0.0 ;
635       here->HSMHV2_dRd_dVbse  = 0.0 ;
636       here->HSMHV2_dRd_dVsubs = 0.0 ;
637       here->HSMHV2_dRd_dTi    = 0.0 ;
638       here->HSMHV2_dRd_dVds   = 0.0 ;
639       here->HSMHV2_dRd_dVgs   = 0.0 ;
640       here->HSMHV2_dRd_dVbs   = 0.0 ;
641     } else {
642       here->HSMHV2_dRd_dVddp = Rd_dVddp / Mfactor ;
643       here->HSMHV2_dRd_dVdse = Rd_dVdse / Mfactor ;
644       here->HSMHV2_dRd_dVgse = Rd_dVgse / Mfactor ;
645       here->HSMHV2_dRd_dVbse = Rd_dVbse / Mfactor ;
646       here->HSMHV2_dRd_dVsubs= Rd_dVsubs / Mfactor ;
647       here->HSMHV2_dRd_dTi   = Rd_dT / Mfactor ;
648       here->HSMHV2_dRd_dVds  = Rd_dVds / Mfactor ;
649       here->HSMHV2_dRd_dVgs  = Rd_dVgs / Mfactor ;
650       here->HSMHV2_dRd_dVbs  = Rd_dVbs / Mfactor ;
651     }
652 
653 
654   return ( HiSIM_OK ) ;
655 
656 }
657