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 : hsmhvld.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 #include "ngspice/ngspice.h"
61 #include "hisimhv2.h"
62 #include "ngspice/trandefs.h"
63 #include "ngspice/const.h"
64 #include "ngspice/sperror.h"
65 #include "ngspice/devdefs.h"
66 #include "ngspice/suffix.h"
67 
68 #define SHOW_EPS_QUANT 1.0e-15
69 
ShowPhysVals(HSMHV2instance * here,HSMHV2model * model,int isFirst,double vds,double vgs,double vbs,double vgd,double vbd,double vgb)70 static void ShowPhysVals
71 (
72  HSMHV2instance *here,
73  HSMHV2model *model,
74  int isFirst,
75  double vds,
76  double vgs,
77  double vbs,
78  double vgd,
79  double vbd,
80  double vgb
81  )
82 {
83 
84   NG_IGNORE(vgd);
85   NG_IGNORE(vbd);
86 
87   /*                                                            */
88   /*                                                            */
89   /* Note: This function is not yet adapted to the flat version */
90   /*                                                            */
91   /*                                                            */
92 
93   /* regard the epsilon-quantity as 0.0 */
94   vds = (fabs(vds) < SHOW_EPS_QUANT) ? 0.0 : vds;
95   vgs = (fabs(vgs) < SHOW_EPS_QUANT) ? 0.0 : vgs;
96   vbs = (fabs(vbs) < SHOW_EPS_QUANT) ? 0.0 : vbs;
97   vgb = (fabs(vgb) < SHOW_EPS_QUANT) ? 0.0 : vgb;
98   switch (model->HSMHV2_show) {
99   case 1:
100     if (isFirst) printf("Vds        Ids\n");
101     printf("%e %e\n", model->HSMHV2_type*vds, here->HSMHV2_mode*here->HSMHV2_ids);
102     break;
103   case 2:
104     if (isFirst) printf("Vgs        Ids\n");
105     printf("%e %e\n", model->HSMHV2_type*vgs, here->HSMHV2_mode*here->HSMHV2_ids);
106     break;
107   case 3:
108     if (isFirst) printf("Vgs        log10(|Ids|)\n");
109     printf("%e %e\n", model->HSMHV2_type*vgs, log10(here->HSMHV2_ids));
110     break;
111   case 4:
112     if (isFirst) printf("log10(|Ids|)    gm/|Ids|\n");
113     if (here->HSMHV2_ids == 0.0)
114       printf("I can't show gm/Ids - log10(Ids), because Ids = 0.\n");
115     else
116       printf("%e %e\n",  log10(here->HSMHV2_ids), here->HSMHV2_gm/here->HSMHV2_ids);
117     break;
118   case 5:
119     if (isFirst) printf("Vds        gds\n");
120     printf("%e %e\n", model->HSMHV2_type*vds, here->HSMHV2_gds);
121     break;
122   case 6:
123     if (isFirst) printf("Vgs        gm\n");
124     printf("%e %e\n", model->HSMHV2_type*vgs, here->HSMHV2_gm);
125     break;
126   case 7:
127     if (isFirst) printf("Vbs        gbs\n");
128     printf("%e %e\n", model->HSMHV2_type*vbs, here->HSMHV2_gmbs);
129     break;
130   case 8:
131     if (isFirst) printf("Vgs        Cgg\n");
132     printf("%e %e\n", model->HSMHV2_type*vgs, here->HSMHV2_cggb);
133     break;
134   case 9:
135     if (isFirst) printf("Vgs        Cgs\n");
136     printf("%e %e\n", model->HSMHV2_type*vgs, here->HSMHV2_cgsb);
137     break;
138   case 10:
139     if (isFirst) printf("Vgs        Cgd\n");
140     printf("%e %e\n", model->HSMHV2_type*vgs, here->HSMHV2_cgdb);
141     break;
142   case 11:
143     if (isFirst) printf("Vgs        Cgb\n");
144     printf("%e %e\n", model->HSMHV2_type*vgs, -(here->HSMHV2_cggb+here->HSMHV2_cgsb+here->HSMHV2_cgdb));
145     break;
146   case 12:
147     if (isFirst) printf("Vds        Csg\n");
148     printf("%e %e\n", model->HSMHV2_type*vds, -(here->HSMHV2_cggb+here->HSMHV2_cbgb+here->HSMHV2_cdgb));
149     break;
150   case 13:
151     if (isFirst) printf("Vds        Cdg\n");
152     printf("%e %e\n", model->HSMHV2_type*vds, here->HSMHV2_cdgb);
153     break;
154   case 14:
155     if (isFirst) printf("Vds        Cbg\n");
156     printf("%e %e\n", model->HSMHV2_type*vds, here->HSMHV2_cbgb);
157     break;
158   case 15:
159     if (isFirst) printf("Vds        Cgg\n");
160     printf("%e %e\n", model->HSMHV2_type*vds, here->HSMHV2_cggb);
161     break;
162   case 16:
163     if (isFirst) printf("Vds        Cgs\n");
164     printf("%e %e\n", model->HSMHV2_type*vds, here->HSMHV2_cgsb);
165     break;
166   case 17:
167     if (isFirst) printf("Vds        Cgd\n");
168     printf("%e %e\n", model->HSMHV2_type*vds, here->HSMHV2_cgdb);
169     break;
170   case 18:
171     if (isFirst) printf("Vds        Cgb\n");
172     printf("%e %e\n", model->HSMHV2_type*vds, -(here->HSMHV2_cggb+here->HSMHV2_cgsb+here->HSMHV2_cgdb));
173     break;
174   case 19:
175     if (isFirst) printf("Vgs        Csg\n");
176     printf("%e %e\n", model->HSMHV2_type*vgs, -(here->HSMHV2_cggb+here->HSMHV2_cbgb+here->HSMHV2_cdgb));
177     break;
178   case 20:
179     if (isFirst) printf("Vgs        Cdg\n");
180     printf("%e %e\n", model->HSMHV2_type*vgs, here->HSMHV2_cdgb);
181     break;
182   case 21:
183     if (isFirst) printf("Vgs        Cbg\n");
184     printf("%e %e\n", model->HSMHV2_type*vgs, here->HSMHV2_cbgb);
185     break;
186   case 22:
187     if (isFirst) printf("Vgb        Cgb\n");
188     printf("%e %e\n", model->HSMHV2_type*vgb, -(here->HSMHV2_cggb+here->HSMHV2_cgsb+here->HSMHV2_cgdb));
189     break;
190   case 50:
191     if (isFirst) printf("Vgs  Vds  Vbs  Vgb  Ids  log10(|Ids|)  gm/|Ids|  gm  gds  gbs  Cgg  Cgs  Cgb  Cgd  Csg  Cbg  Cdg\n");
192     printf("%e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e\n",
193             model->HSMHV2_type*vgs, model->HSMHV2_type*vds, model->HSMHV2_type*vbs, model->HSMHV2_type*vgb, here->HSMHV2_mode*here->HSMHV2_ids,
194             log10(here->HSMHV2_ids), here->HSMHV2_gm/here->HSMHV2_ids, here->HSMHV2_gm, here->HSMHV2_gds, here->HSMHV2_gmbs, here->HSMHV2_cggb,
195             here->HSMHV2_cgsb, -(here->HSMHV2_cggb+here->HSMHV2_cgsb+here->HSMHV2_cgdb), here->HSMHV2_cgdb,
196             -(here->HSMHV2_cggb+here->HSMHV2_cbgb+here->HSMHV2_cdgb), here->HSMHV2_cbgb, here->HSMHV2_cdgb);
197     break;
198   default:
199     /*
200       printf("There is no physical value corrsponding to %d\n", flag);
201     */
202     break;
203   }
204 }
205 
HSMHV2load(GENmodel * inModel,CKTcircuit * ckt)206 int HSMHV2load(
207      GENmodel *inModel,
208      CKTcircuit *ckt)
209      /* actually load the current value into the
210       * sparse matrix previously provided
211       */
212 {
213   HSMHV2model *model = (HSMHV2model*)inModel;
214   HSMHV2instance *here;
215   HSMHV2binningParam *pParam;
216   HSMHV2modelMKSParam *modelMKS ;
217   HSMHV2hereMKSParam  *hereMKS ;
218 
219 
220 
221   /* node voltages */
222 #define XDIM 14
223   double x[XDIM] ;
224 
225   /* branch voltages */
226   double vbd=0.0,  vbs=0.0,  vds=0.0,  vgb=0.0, vgd=0.0, vgdo=0.0, vgs=0.0 ;
227   double vdbs=0.0, vsbs=0.0, vdbd=0.0 ;
228   double vges=0.0, vged=0.0, vgedo=0.0 ;
229   double vbs_jct=0.0, vbd_jct=0.0;
230   double deltemp = 0.0 , deltemp_old = 0.0 ;
231   double vggp=0, vddp=0, vssp=0, vbpb=0, vbpsb=0, vbpdb=0 ;
232   double vdse=0.0, vgse=0.0, vbse=0.0 ;
233   double vsubs=0.0 ; /* substrate bias */
234 
235   double ivds=0.0,  ivgs=0.0,  ivbs=0.0 ;
236   double ivgse=0.0, ivdse=0.0, ivbse=0.0 ;
237 
238   /* delta of branch voltages */
239   double delvbs=0.0, delvds=0.0, delvgs=0.0, delvsbs=0.0, delvdbd=0.0, deldeltemp = 0.0 ;
240   double delvdse=0.0, delvgse=0.0, delvbse=0.0, delvddp=0.0, delvssp=0.0, delvggp=0.0, delvbpb=0.0, delvbpdb=0.0, delvbpsb =0.0 ;
241   double delvsubs=0.0; /* substrate bias change */
242 
243   /* branch currents */
244   double Ids=0.0, gds=0.0,     gm=0.0,     gmbs=0.0,    gmT=0.0,
245                   gds_ext=0.0, gm_ext=0.0, gmbs_ext=0.0 ;
246   double Igd=0.0, dIgd_dVd=0.0, dIgd_dVg=0.0, dIgd_dVb=0.0, dIgd_dVs=0.0, dIgd_dT=0.0 ;
247   double Igs=0.0, dIgs_dVd=0.0, dIgs_dVg=0.0, dIgs_dVb=0.0, dIgs_dVs=0.0, dIgs_dT=0.0 ;
248   double Igb=0.0, dIgb_dVd=0.0, dIgb_dVg=0.0, dIgb_dVb=0.0, dIgb_dVs=0.0, dIgb_dT=0.0 ;
249   double Isub=0.0, dIsub_dVds=0.0, dIsub_dVgs=0.0, dIsub_dVbs=0.0, dIsub_dT=0.0 ;
250   double Isubs=0.0, dIsubs_dVds=0.0, dIsubs_dVgs=0.0, dIsubs_dVbs=0.0, dIsubs_dT=0.0 ;
251   double IsubLD=0.0, dIsubLD_dVds=0.0, dIsubLD_dVgs=0.0, dIsubLD_dVbs=0.0, dIsubLD_dT=0.0 ;
252   double IsubLDs=0.0, dIsubLDs_dVds=0.0, dIsubLDs_dVgs=0.0, dIsubLDs_dVbs=0.0, dIsubLDs_dT=0.0 ;
253   double dIsubLD_dVddp=0.0, dIsubLDs_dVddp=0.0 ;
254   double IdsIBPC=0.0, dIdsIBPC_dVds=0.0, dIdsIBPC_dVgs=0.0, dIdsIBPC_dVbs=0.0, dIdsIBPC_dT=0.0 ;
255   double IdsIBPCs=0.0, dIdsIBPCs_dVds=0.0, dIdsIBPCs_dVgs=0.0, dIdsIBPCs_dVbs=0.0, dIdsIBPCs_dT=0.0 ;
256   double dIdsIBPC_dVddp=0.0, dIdsIBPCs_dVddp=0.0 ;
257   double Igidl=0.0, dIgidl_dVds=0.0, dIgidl_dVgs=0.0, dIgidl_dVbs=0.0, dIgidl_dT=0.0 ;
258   double Igisl=0.0, dIgisl_dVds=0.0, dIgisl_dVgs=0.0, dIgisl_dVbs=0.0, dIgisl_dT=0.0 ;
259   double Ibd=0.0, Gbd=0.0, Gbdt=0.0 ;
260   double Ibs=0.0, Gbs=0.0, Gbst=0.0 ;
261   double Iddp=0.0, dIddp_dVddp=0.0, dIddp_dVdse=0.0, dIddp_dVgse=0.0, dIddp_dVbse=0.0, dIddp_dVsubs=0.0, dIddp_dT =0.0 , dIddp_dVds =0.0, dIddp_dVgs =0.0, dIddp_dVbs =0.0 ;
262   double Issp=0.0, dIssp_dVssp=0.0, dIssp_dVdse=0.0, dIssp_dVgse=0.0, dIssp_dVbse=0.0, dIssp_dVsubs=0.0, dIssp_dT =0.0 ;
263   double Iggp=0.0, dIggp_dVggp =0.0 ;
264   double Ibpb=0.0, dIbpb_dVbpb =0.0 ;
265   double Ibpdb=0.0, dIbpdb_dVbpdb =0.0 ;
266   double Ibpsb=0.0, dIbpsb_dVbpsb =0.0 ;
267   double Ith=0.0,   dIth_dT =0.0 ;
268 
269   /* displacement currents */
270   double cq_d=0.0,  cq_dP=0.0,  cq_g=0.0,  cq_gP=0.0,  cq_s=0.0,  cq_sP=0.0,  cq_bP=0.0,  cq_b=0.0,  cq_db=0.0,    cq_sb=0.0,  cq_t=0.0  ;
271   double cq_dE=0.0, cq_gE=0.0,  cq_sE=0.0,  cq_bE=0.0 ;
272 
273   /* node currents */
274   double cur_d=0.0, cur_dP=0.0, cur_g=0.0, cur_gP=0.0, cur_s=0.0, cur_sP=0.0, cur_bP=0.0, cur_b=0.0, cur_db=0.0,   cur_sb=0.0, cur_t=0.0 ;
275   double i_d=0.0,   i_dP=0.0,   i_g=0.0,   i_gP=0.0,   i_s=0.0,   i_sP=0.0,   i_bP=0.0,   i_b=0.0,   i_db=0.0,     i_sb=0.0,   i_t=0.0   ;
276 
277   /* resistances and conductances */
278   double Rd=0.0, dRd_dVdse=0.0, dRd_dVgse=0.0, dRd_dVbse=0.0, dRd_dVsubs=0.0, dRd_dT=0.0, dRd_dVddp=0.0, dRd_dVds=0.0, dRd_dVgs=0.0, dRd_dVbs=0.0 ;
279   double Rs=0.0, dRs_dVdse=0.0, dRs_dVgse=0.0, dRs_dVbse=0.0, dRs_dVsubs=0.0, dRs_dT=0.0 ;
280 
281   double GD=0.0, GD_dVds=0.0, GD_dVgs=0.0, GD_dVbs=0.0, GD_dVsubs=0.0, GD_dT=0.0, GD_dVddp=0.0, GD_dVdse=0.0, GD_dVgse=0.0, GD_dVbse=0.0 ;
282   double GS=0.0, GS_dVds=0.0, GS_dVgs=0.0, GS_dVbs=0.0, GS_dVsubs=0.0, GS_dT=0.0 ;
283   double Gth=0.0 ;
284   double GG=0.0,  GRBPD=0.0, GRBPS=0.0, GRBPB=0.0;
285 
286   /* charges */
287   double Qd=0.0, dQd_dVds=0.0, dQd_dVgs=0.0, dQd_dVbs=0.0, dQd_dT=0.0 ;
288   double Qg=0.0, dQg_dVds=0.0, dQg_dVgs=0.0, dQg_dVbs=0.0, dQg_dT=0.0 ;
289   double Qs=0.0, dQs_dVds=0.0, dQs_dVgs=0.0, dQs_dVbs=0.0, dQs_dT=0.0 ;
290   double Qb=0.0, dQb_dVds=0.0, dQb_dVgs=0.0, dQb_dVbs=0.0, dQb_dT=0.0 ;
291   double Qbd=0.0, Cbd=0.0, Cbdt=0.0,
292          Qbs=0.0, Cbs=0.0, Cbst=0.0 ;
293   double Qth=0.0, Cth =0.0 ;
294   double Qfd=0.0, dQfd_dVdse=0.0, dQfd_dVgse=0.0, dQfd_dVbse=0.0, dQfd_dT=0.0 ;
295   double Qfs=0.0, dQfs_dVdse=0.0, dQfs_dVgse=0.0, dQfs_dVbse=0.0, dQfs_dT=0.0 ;
296 
297   double Qdext=0.0, dQdext_dVdse=0.0, dQdext_dVgse=0.0, dQdext_dVbse=0.0, dQdext_dT=0.0 ;
298   double Qgext=0.0, dQgext_dVdse=0.0, dQgext_dVgse=0.0, dQgext_dVbse=0.0, dQgext_dT=0.0 ;
299   double Qsext=0.0, dQsext_dVdse=0.0, dQsext_dVgse=0.0, dQsext_dVbse=0.0, dQsext_dT=0.0 ;
300   double Qbext=0.0, dQbext_dVdse=0.0, dQbext_dVgse=0.0, dQbext_dVbse=0.0, dQbext_dT=0.0 ;
301 
302   /* 5th substrate node */
303   int flg_subNode = 0 ;
304 
305   /* self heating */
306   double Veffpower=0.0, dVeffpower_dVds=0.0, dVeffpower_dVdse =0.0 ;
307   double P=0.0, dP_dVds=0.0,  dP_dVgs=0.0,  dP_dVbs=0.0, dP_dT =0.0,
308                 dP_dVdse=0.0, dP_dVgse=0.0, dP_dVbse =0.0 ;
309   double T0 , T1 , T2 ;
310 
311 #define SHE_MAX_dlt 0.1
312 
313 #define C_RTH_MIN 1.0e-4
314 
315   double TMF1 , TMF2  ;
316 /*---------------------------------------------------*
317 * smoothUpper: ceiling.
318 *      y = xmax - 0.5 ( arg + sqrt( arg^2 + 4 xmax delta ) )
319 *    arg = xmax - x - delta
320 *-----------------*/
321 
322 #define Fn_SU( y , x , xmax , delta , dx ) { \
323     TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
324     TMF2 = 4.0 * ( xmax ) * ( delta) ; \
325     TMF2 = TMF2 > 0.0 ?  TMF2 :  -( TMF2 ) ; \
326     TMF2 = sqrt ( TMF1 *  TMF1 + TMF2 ) ; \
327     dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
328     y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
329   }
330 
331   /* NQS related variables */
332   int flg_nqs =0 ;
333   double Qi_nqs=0.0, Qb_nqs=0.0, delQi_nqs=0.0, delQb_nqs=0.0, i_qi=0.0, i_qb=0.0, cq_qi=0.0, cq_qb=0.0, cur_qi=0.0, cur_qb =0.0 ;
334   double Iqi_nqs=0.0, dIqi_nqs_dVds=0.0, dIqi_nqs_dVgs=0.0, dIqi_nqs_dVbs=0.0, dIqi_nqs_dT=0.0, dIqi_nqs_dQi_nqs =0.0 ;
335   double Iqb_nqs=0.0, dIqb_nqs_dVds=0.0, dIqb_nqs_dVgs=0.0, dIqb_nqs_dVbs=0.0, dIqb_nqs_dT=0.0, dIqb_nqs_dQb_nqs =0.0 ;
336   double Qd_nqs=0.0,  dQd_nqs_dVds=0.0,  dQd_nqs_dVgs=0.0,  dQd_nqs_dVbs=0.0,  dQd_nqs_dT=0.0,  dQd_nqs_dQi_nqs  =0.0 ;
337   double Qs_nqs=0.0,  dQs_nqs_dVds=0.0,  dQs_nqs_dVgs=0.0,  dQs_nqs_dVbs=0.0,  dQs_nqs_dT=0.0,  dQs_nqs_dQi_nqs  =0.0 ;
338   double Qg_nqs=0.0,  dQg_nqs_dQi_nqs=0.0, dQg_nqs_dQb_nqs =0.0 ;
339   double tau=0.0,     dtau_dVds=0.0,     dtau_dVgs=0.0,     dtau_dVbs=0.0,     dtau_dT   =0.0 ;
340   double taub=0.0,    dtaub_dVds=0.0,    dtaub_dVgs=0.0,    dtaub_dVbs=0.0,    dtaub_dT  =0.0 ;
341   double Qdrat=0.0,   dQdrat_dVds=0.0,   dQdrat_dVgs=0.0,   dQdrat_dVbs=0.0,   dQdrat_dT =0.0 ;
342   double Qi=0.0,      dQi_dVds=0.0,      dQi_dVgs=0.0,      dQi_dVbs=0.0,      dQi_dT    =0.0 ;
343   double Qbulk=0.0,   dQbulk_dVds=0.0,   dQbulk_dVgs=0.0,   dQbulk_dVbs=0.0,   dQbulk_dT =0.0 ;
344 
345   /* output related variables */
346   double dQi_nqs_dVds=0.0, dQi_nqs_dVgs=0.0, dQi_nqs_dVbs=0.0,
347          dQb_nqs_dVds=0.0, dQb_nqs_dVgs=0.0, dQb_nqs_dVbs=0.0 ;
348   double cgdb_nqs=0.0,     cggb_nqs=0.0,     cgsb_nqs=0.0,
349          cbdb_nqs=0.0,     cbgb_nqs=0.0,     cbsb_nqs=0.0,
350          cddb_nqs=0.0,     cdgb_nqs=0.0,     cdsb_nqs=0.0 ;
351   double cgdb=0.0,         cggb=0.0,         cgsb=0.0,
352          cbdb=0.0,         cbgb=0.0,         cbsb=0.0,
353          cddb=0.0,         cdgb=0.0,         cdsb=0.0 ;
354 
355   /* rows of conductance and capacitance matrix stamp */
356   double ydc_d[XDIM],   ydc_dP[XDIM],  ydc_g[XDIM],   ydc_gP[XDIM],  ydc_s[XDIM],  ydc_sP[XDIM] ;
357   double ydc_bP[XDIM],  ydc_b[XDIM],   ydc_db[XDIM],  ydc_sb[XDIM],  ydc_t[XDIM],  ydc_qi[XDIM],  ydc_qb[XDIM]  ;
358   double ydyn_d[XDIM],  ydyn_dP[XDIM], ydyn_g[XDIM],  ydyn_gP[XDIM], ydyn_s[XDIM], ydyn_sP[XDIM] ;
359   double ydyn_bP[XDIM], ydyn_b[XDIM],  ydyn_db[XDIM], ydyn_sb[XDIM], ydyn_t[XDIM], ydyn_qi[XDIM], ydyn_qb[XDIM] ;
360 
361   /* limiter, bypass, and convergence */
362   int ByPass=0, Check=0, Check1=0, Check2=0, Check3=0 ;
363   double von=0.0, limval =0.0 ;
364   double i_dP_hat=0.0, i_gP_hat=0.0, i_sP_hat=0.0, i_db_hat=0.0, i_sb_hat =0.0         ;
365 
366 #define LIM_TOL 1.0e0
367 #define LIM_TOL2 1.0e0
368 
369   /* predictor and numerical integration stuff */
370   double ag0=0.0, xfact=0.0 ;
371   double ceq=0.0, geq=0.0 ;
372   int ChargeComputationNeeded =
373     ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) ||
374      ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)))
375     ? 1 : 0;
376   int showPhysVal=0 ;
377   int isConv=0 ;
378   double vds_pre=0.0 ;
379   int i=0, noncon_old=0 ;
380 
381 
382 
383 #define dNode        0
384 #define dNodePrime   1
385 #define gNode        2
386 #define gNodePrime   3
387 #define sNode        4
388 #define sNodePrime   5
389 #define bNodePrime   6
390 #define bNode        7
391 #define dbNode       8
392 #define sbNode       9
393 #define subNode     10
394 #define tempNode    11
395 #define qiNode      12
396 #define qbNode      13
397 #define lastNode    13        /* must be the last node! */
398 
399 
400 #define SPICE_rhs 1           /* set to 0 if rhs to be loaded for standard Newton */
401                               /* set to 1 if rhs_eq to be loaded, e.g. for SPICE  */
402 
403   if (SPICE_rhs) {
404     for (i=0; i<XDIM; i++) {
405       x[i] = 0.0 ;
406     }
407   }
408 
409   /*  loop through all the HSMHV2 device models */
410   for ( ; model != NULL; model = HSMHV2nextModel(model)) {
411     /* loop through all the instances of the model */
412 
413     modelMKS = &model->modelMKS ;
414 
415     for (here = HSMHV2instances(model); here != NULL ;
416          here = HSMHV2nextInstance(here)) {
417 
418       hereMKS = &here->hereMKS ;
419       pParam = &here->pParam ;
420       showPhysVal = 0;
421       Check=1;
422       ByPass = 0;
423       vsubs = 0.0 ; /* substrate bias */
424       deltemp = 0.0 ;
425       noncon_old = ckt->CKTnoncon;
426       flg_nqs = model->HSMHV2_conqs ;
427       flg_subNode = here->HSMHV2subNode ; /* if flg_subNode > 0, external(/internal) substrate node exists */
428 
429 #ifdef DEBUG_HISIMHVLD_VX
430       printf("mode = %x\n", ckt->CKTmode);
431       printf("Vd Vg Vs Vb %e %e %e %e\n", *(ckt->CKTrhsOld+here->HSMHV2dNodePrime),
432              *(ckt->CKTrhsOld+here->HSMHV2gNodePrime),
433              *(ckt->CKTrhsOld+here->HSMHV2sNodePrime),
434              *(ckt->CKTrhsOld+here->HSMHV2bNodePrime));
435 #endif
436 
437       if ( ckt->CKTmode & MODEINITSMSIG ) {
438         vbs = *(ckt->CKTstate0 + here->HSMHV2vbs);
439         vgs = *(ckt->CKTstate0 + here->HSMHV2vgs);
440         vds = *(ckt->CKTstate0 + here->HSMHV2vds);
441 
442         vges = *(ckt->CKTstate0 + here->HSMHV2vges);
443         vdbd = *(ckt->CKTstate0 + here->HSMHV2vdbd);
444         vsbs = *(ckt->CKTstate0 + here->HSMHV2vsbs);
445         if (flg_subNode > 0) vsubs = *(ckt->CKTstate0 + here->HSMHV2vsubs);
446         if( here->HSMHV2_coselfheat > 0 ){
447           deltemp = *(ckt->CKTstate0 + here->HSMHV2deltemp);
448         }
449         vdse = *(ckt->CKTstate0 + here->HSMHV2vdse) ;
450         vgse = *(ckt->CKTstate0 + here->HSMHV2vgse) ;
451         vbse = *(ckt->CKTstate0 + here->HSMHV2vbse) ;
452         if ( flg_nqs ) {
453           Qi_nqs = *(ckt->CKTstate0 + here->HSMHV2qi_nqs) ;
454           Qb_nqs = *(ckt->CKTstate0 + here->HSMHV2qb_nqs) ;
455         } else {
456           Qi_nqs = 0.0 ;
457           Qb_nqs = 0.0 ;
458         }
459       /* printf("HSMHV2_load: (from state0) vds.. = %e %e %e %e %e %e\n",
460                                               vds,vgs,vbs,vdse,vgse,vbse); */
461       }
462       else if ( ckt->CKTmode & MODEINITTRAN ) {
463 /* #include "printf_ld_converged.inc" */
464         vbs = *(ckt->CKTstate1 + here->HSMHV2vbs);
465         vgs = *(ckt->CKTstate1 + here->HSMHV2vgs);
466         vds = *(ckt->CKTstate1 + here->HSMHV2vds);
467 
468         vges = *(ckt->CKTstate1 + here->HSMHV2vges);
469         vdbd = *(ckt->CKTstate1 + here->HSMHV2vdbd);
470         vsbs = *(ckt->CKTstate1 + here->HSMHV2vsbs);
471         if (flg_subNode > 0) vsubs = *(ckt->CKTstate1 + here->HSMHV2vsubs);
472         if( here->HSMHV2_coselfheat > 0 ){
473           deltemp = *(ckt->CKTstate1 + here->HSMHV2deltemp);
474         }
475         vdse = *(ckt->CKTstate1 + here->HSMHV2vdse) ;
476         vgse = *(ckt->CKTstate1 + here->HSMHV2vgse) ;
477         vbse = *(ckt->CKTstate1 + here->HSMHV2vbse) ;
478         if ( flg_nqs ) {
479           Qi_nqs = *(ckt->CKTstate1 + here->HSMHV2qi_nqs) ;
480           Qb_nqs = *(ckt->CKTstate1 + here->HSMHV2qb_nqs) ;
481         } else {
482           Qi_nqs = 0.0 ;
483           Qb_nqs = 0.0 ;
484         }
485       }
486       else if ( (ckt->CKTmode & MODEINITJCT) && !here->HSMHV2_off ) {
487         vds = model->HSMHV2_type * here->HSMHV2_icVDS;
488         vgs = vges = model->HSMHV2_type * here->HSMHV2_icVGS;
489         vbs = vsbs = model->HSMHV2_type * here->HSMHV2_icVBS;
490         vdbd = 0.0 ;
491         if ( (vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) &&
492              ( (ckt->CKTmode & (MODETRAN|MODEAC|MODEDCOP|MODEDCTRANCURVE)) ||
493                !(ckt->CKTmode & MODEUIC) ) ) {
494           /* set biases for starting analysis */
495           vbs = vdbd = vsbs = 0.0;
496           vgs = vges = 0.1;
497           vds = 0.1;
498         }
499         if (flg_subNode > 0) vsubs = 0.0;
500         if( here->HSMHV2_coselfheat > 0 ) deltemp=0.0;
501         vdse = vds ;
502         vgse = vgs ;
503         Qi_nqs = Qb_nqs = 0.0 ;
504       }
505       else if ( ( ckt->CKTmode & (MODEINITJCT | MODEINITFIX) ) &&
506                 here->HSMHV2_off ) {
507         vbs = vgs = vds = 0.0; vges = 0.0; vdbd = vsbs = 0.0;
508         if (flg_subNode > 0) vsubs = 0.0;
509         if( here->HSMHV2_coselfheat > 0 ) deltemp=0.0;
510         vdse = vds ;
511         vgse = vgs ;
512         Qi_nqs = Qb_nqs = 0.0 ;
513       }
514       else {
515 #ifndef PREDICTOR /* BSIM3 style */
516         if (ckt->CKTmode & MODEINITPRED) {
517 /* #include "printf_ld_converged.inc" */
518           /* if (here->HSMHV2_mode > 0) {
519              gds_ext = here->HSMHV2_dIds_dVdse ;
520           } else {
521              gds_ext = + (here->HSMHV2_dIds_dVdse + here->HSMHV2_dIds_dVgse + here->HSMHV2_dIds_dVbse) ;
522           }
523           printf("zzz %e %e\n",ckt->CKTtime,gds_ext) ; */
524           xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1];
525           *(ckt->CKTstate0 + here->HSMHV2vbs) =
526             *(ckt->CKTstate1 + here->HSMHV2vbs);
527           vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vbs))
528             -(xfact * (*(ckt->CKTstate2 + here->HSMHV2vbs)));
529           *(ckt->CKTstate0 + here->HSMHV2vgs) =
530             *(ckt->CKTstate1 + here->HSMHV2vgs);
531           vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vgs))
532             -(xfact * (*(ckt->CKTstate2 + here->HSMHV2vgs)));
533           *(ckt->CKTstate0 + here->HSMHV2vds) =
534             *(ckt->CKTstate1 + here->HSMHV2vds);
535           vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vds))
536             -(xfact * (*(ckt->CKTstate2 + here->HSMHV2vds)));
537           *(ckt->CKTstate0 + here->HSMHV2vbd) =
538             *(ckt->CKTstate0 + here->HSMHV2vbs)-
539             *(ckt->CKTstate0 + here->HSMHV2vds);
540 
541           *(ckt->CKTstate0 + here->HSMHV2vges) =
542             *(ckt->CKTstate1 + here->HSMHV2vges);
543           vges = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vges))
544             -(xfact * (*(ckt->CKTstate2 + here->HSMHV2vges)));
545           *(ckt->CKTstate0 + here->HSMHV2vdbd) =
546             *(ckt->CKTstate1 + here->HSMHV2vdbd);
547           vdbd = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vdbd))
548             - (xfact * (*(ckt->CKTstate2 + here->HSMHV2vdbd)));
549           *(ckt->CKTstate0 + here->HSMHV2vdbs) =
550             *(ckt->CKTstate0 + here->HSMHV2vdbd)
551             + *(ckt->CKTstate0 + here->HSMHV2vds);
552           *(ckt->CKTstate0 + here->HSMHV2vsbs) =
553             *(ckt->CKTstate1 + here->HSMHV2vsbs);
554           vsbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vsbs))
555             - (xfact * (*(ckt->CKTstate2 + here->HSMHV2vsbs)));
556           if (flg_subNode > 0){
557             vsubs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vsubs))
558               - ( xfact * (*(ckt->CKTstate2 + here->HSMHV2vsubs)));
559           }
560           if( here->HSMHV2_coselfheat > 0 ){
561             deltemp = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2deltemp))
562               - ( xfact * (*(ckt->CKTstate2 + here->HSMHV2deltemp)));
563 
564             *(ckt->CKTstate0 + here->HSMHV2deltemp) =
565               *(ckt->CKTstate1 + here->HSMHV2deltemp);
566           }
567           *(ckt->CKTstate0 + here->HSMHV2vdse) =
568             *(ckt->CKTstate1 + here->HSMHV2vdse);
569           vdse = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vdse))
570             -(xfact * (*(ckt->CKTstate2 + here->HSMHV2vdse)));
571           *(ckt->CKTstate0 + here->HSMHV2vgse) =
572             *(ckt->CKTstate1 + here->HSMHV2vgse);
573           vgse = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vgse))
574             -(xfact * (*(ckt->CKTstate2 + here->HSMHV2vgse)));
575           *(ckt->CKTstate0 + here->HSMHV2vbse) =
576             *(ckt->CKTstate1 + here->HSMHV2vbse);
577           vbse = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2vbse))
578             -(xfact * (*(ckt->CKTstate2 + here->HSMHV2vbse)));
579           if (flg_nqs) {
580             *(ckt->CKTstate0 + here->HSMHV2qi_nqs) =
581               *(ckt->CKTstate1 + here->HSMHV2qi_nqs);
582             Qi_nqs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2qi_nqs))
583               -(xfact * (*(ckt->CKTstate2 + here->HSMHV2qi_nqs)));
584             *(ckt->CKTstate0 + here->HSMHV2qb_nqs) =
585               *(ckt->CKTstate1 + here->HSMHV2qb_nqs);
586             Qb_nqs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHV2qb_nqs))
587               -(xfact * (*(ckt->CKTstate2 + here->HSMHV2qb_nqs)));
588           } else {
589             Qi_nqs = Qb_nqs = 0.0 ;
590           }
591         }
592         else {
593 #endif /* PREDICTOR */
594 /*          here->HSMHV2_time = ckt->CKTtime; /\* for debug print *\/ */
595           /* get biases from CKT */
596           vbs = model->HSMHV2_type *
597             (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) -
598              *(ckt->CKTrhsOld+here->HSMHV2sNodePrime));
599           vgs = model->HSMHV2_type *
600             (*(ckt->CKTrhsOld+here->HSMHV2gNodePrime) -
601              *(ckt->CKTrhsOld+here->HSMHV2sNodePrime));
602           vds = model->HSMHV2_type *
603             (*(ckt->CKTrhsOld+here->HSMHV2dNodePrime) -
604              *(ckt->CKTrhsOld+here->HSMHV2sNodePrime));
605 
606           vges = model->HSMHV2_type *
607             (*(ckt->CKTrhsOld+here->HSMHV2gNode) -
608              *(ckt->CKTrhsOld+here->HSMHV2sNodePrime));
609           vdbd = model->HSMHV2_type
610             * (*(ckt->CKTrhsOld + here->HSMHV2dbNode)
611             - *(ckt->CKTrhsOld + here->HSMHV2dNode));
612           vsbs = model->HSMHV2_type
613             * (*(ckt->CKTrhsOld + here->HSMHV2sbNode)
614             - *(ckt->CKTrhsOld + here->HSMHV2sNode));
615           if (flg_subNode > 0){
616             vsubs = model->HSMHV2_type
617               * (*(ckt->CKTrhsOld + here->HSMHV2subNode)
618               - *(ckt->CKTrhsOld + here->HSMHV2sNode));
619           }
620           if( here->HSMHV2_coselfheat > 0 ){
621             deltemp = *(ckt->CKTrhsOld + here->HSMHV2tempNode);
622           }
623           vbse = model->HSMHV2_type *
624             (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) -
625              *(ckt->CKTrhsOld+here->HSMHV2sNode));
626           vgse = model->HSMHV2_type *
627             (*(ckt->CKTrhsOld+here->HSMHV2gNodePrime) -
628              *(ckt->CKTrhsOld+here->HSMHV2sNode));
629           vdse = model->HSMHV2_type *
630             (*(ckt->CKTrhsOld+here->HSMHV2dNode) -
631              *(ckt->CKTrhsOld+here->HSMHV2sNode));
632           if ( flg_nqs ) {
633             Qi_nqs = *(ckt->CKTrhsOld + here->HSMHV2qiNode);
634             Qb_nqs = *(ckt->CKTrhsOld + here->HSMHV2qbNode);
635           } else {
636             Qi_nqs = Qb_nqs = 0.0 ;
637           }
638 #ifndef PREDICTOR
639         }
640 #endif /* PREDICTOR */
641 
642         /* printf("HSMHV2_load: (from rhs   ) vds.. = %e %e %e %e %e %e\n",
643                                                  vds,vgs,vbs,vdse,vgse,vbse); */
644 
645         vbd = vbs - vds;
646         vgd = vgs - vds;
647         vged = vges - vds;
648         vdbs = vdbd + vdse;
649         vgdo = *(ckt->CKTstate0 + here->HSMHV2vgs) - *(ckt->CKTstate0 + here->HSMHV2vds);
650         vgedo = *(ckt->CKTstate0 + here->HSMHV2vges) - *(ckt->CKTstate0 + here->HSMHV2vds);
651 
652         vds_pre = vds;
653 
654 #ifndef NOBYPASS
655         /* start of bypass section
656            ... no bypass in case of selfheating  */
657         if ( !(ckt->CKTmode & MODEINITPRED) && ckt->CKTbypass && !here->HSMHV2_coselfheat) {
658           delvds  = vds  - *(ckt->CKTstate0 + here->HSMHV2vds) ;
659           delvgs  = vgs  - *(ckt->CKTstate0 + here->HSMHV2vgs) ;
660           delvbs  = vbs  - *(ckt->CKTstate0 + here->HSMHV2vbs) ;
661           delvdse = vdse - *(ckt->CKTstate0 + here->HSMHV2vdse) ;
662           delvgse = vgse - *(ckt->CKTstate0 + here->HSMHV2vgse) ;
663           delvbse = vbse - *(ckt->CKTstate0 + here->HSMHV2vbse) ;
664           delvdbd = vdbd - *(ckt->CKTstate0 + here->HSMHV2vdbd) ;
665           delvsbs = vsbs - *(ckt->CKTstate0 + here->HSMHV2vsbs) ;
666           if (flg_subNode > 0) delvsubs = vsubs - *(ckt->CKTstate0 + here->HSMHV2vsubs) ; /* substrate bias change */
667           deldeltemp = deltemp - *(ckt->CKTstate0 + here->HSMHV2deltemp) ;
668           if (flg_nqs) {
669             delQi_nqs = Qi_nqs - *(ckt->CKTstate0 + here->HSMHV2qi_nqs) ;
670             delQb_nqs = Qb_nqs - *(ckt->CKTstate0 + here->HSMHV2qb_nqs) ;
671           } else {
672             delQi_nqs = delQb_nqs = 0.0 ;
673           }
674 
675           /* now let's see if we can bypass                     */
676           /* ... first perform the easy cheap bypass checks ... */
677  /*          1 2     3       3                       3    4    4     4 5                               543                   2    1 */
678           if ( ( fabs(delvds ) < ckt->CKTreltol * MAX(fabs(vds ),fabs(*(ckt->CKTstate0 + here->HSMHV2vds ))) + ckt->CKTvoltTol ) &&
679                ( fabs(delvgs ) < ckt->CKTreltol * MAX(fabs(vgs ),fabs(*(ckt->CKTstate0 + here->HSMHV2vgs ))) + ckt->CKTvoltTol ) &&
680                ( fabs(delvbs ) < ckt->CKTreltol * MAX(fabs(vbs ),fabs(*(ckt->CKTstate0 + here->HSMHV2vbs ))) + ckt->CKTvoltTol ) &&
681                ( fabs(delvdse) < ckt->CKTreltol * MAX(fabs(vdse),fabs(*(ckt->CKTstate0 + here->HSMHV2vdse))) + ckt->CKTvoltTol ) &&
682                ( fabs(delvgse) < ckt->CKTreltol * MAX(fabs(vgse),fabs(*(ckt->CKTstate0 + here->HSMHV2vgse))) + ckt->CKTvoltTol ) &&
683                ( fabs(delvbse) < ckt->CKTreltol * MAX(fabs(vbse),fabs(*(ckt->CKTstate0 + here->HSMHV2vbse))) + ckt->CKTvoltTol ) &&
684                ( fabs(delvdbd) < ckt->CKTreltol * MAX(fabs(vdbd),fabs(*(ckt->CKTstate0 + here->HSMHV2vdbd))) + ckt->CKTvoltTol ) &&
685                ( fabs(delvsbs) < ckt->CKTreltol * MAX(fabs(vsbs),fabs(*(ckt->CKTstate0 + here->HSMHV2vsbs))) + ckt->CKTvoltTol ) &&
686                ( fabs(delvsubs) < ckt->CKTreltol * MAX(fabs(vsubs),fabs(*(ckt->CKTstate0 + here->HSMHV2vsubs))) + ckt->CKTvoltTol ) &&
687                ( fabs(delQi_nqs) < ckt->CKTreltol *   fabs(Qi_nqs) + ckt->CKTchgtol*ckt->CKTabstol + 1.0e-20  ) &&
688                ( fabs(delQb_nqs) < ckt->CKTreltol *   fabs(Qb_nqs) + ckt->CKTchgtol*ckt->CKTabstol + 1.0e-20  )    )
689                                                                                   /* 1.0e-20: heuristic value, must be small enough     */
690                                                                                   /* to ensure that bypass does not destroy convergence */
691           { /* ... the first bypass checks are passed -> now do the more expensive checks ...*/
692             if ( here->HSMHV2_mode > 0 ) { /* forward mode */
693               Ids        = here->HSMHV2_ids ;
694               gds        = here->HSMHV2_dIds_dVdsi ;
695               gm         = here->HSMHV2_dIds_dVgsi ;
696               gmbs       = here->HSMHV2_dIds_dVbsi ;
697               gmT        = 0.0  ;
698               gmbs_ext   = here->HSMHV2_dIds_dVbse;
699               gds_ext    = here->HSMHV2_dIds_dVdse ;
700               gm_ext     = here->HSMHV2_dIds_dVgse;
701               Isub         = here->HSMHV2_isub ;
702               dIsub_dVds   = here->HSMHV2_dIsub_dVdsi ;
703               dIsub_dVgs   = here->HSMHV2_dIsub_dVgsi ;
704               dIsub_dVbs   = here->HSMHV2_dIsub_dVbsi ;
705               dIsub_dT     = 0.0  ;
706               Isubs        = 0.0 ;
707               dIsubs_dVds  = 0.0 ;
708               dIsubs_dVgs  = 0.0 ;
709               dIsubs_dVbs  = 0.0 ;
710               dIsubs_dT    = 0.0 ;
711               IsubLD         = here->HSMHV2_isubld ;
712               dIsubLD_dVds   = here->HSMHV2_dIsubLD_dVdsi ;
713               dIsubLD_dVgs   = here->HSMHV2_dIsubLD_dVgsi ;
714               dIsubLD_dVbs   = here->HSMHV2_dIsubLD_dVbsi ;
715               dIsubLD_dT     = 0.0  ;
716               dIsubLD_dVddp  = here->HSMHV2_dIsubLD_dVddp ;
717               IsubLDs        = 0.0 ;
718               dIsubLDs_dVds  = 0.0 ;
719               dIsubLDs_dVgs  = 0.0 ;
720               dIsubLDs_dVbs  = 0.0 ;
721               dIsubLDs_dT    = 0.0 ;
722               dIsubLDs_dVddp = 0.0 ;
723               IdsIBPC         = here->HSMHV2_idsibpc ;
724               dIdsIBPC_dVds   = here->HSMHV2_dIdsIBPC_dVdsi ;
725               dIdsIBPC_dVgs   = here->HSMHV2_dIdsIBPC_dVgsi ;
726               dIdsIBPC_dVbs   = here->HSMHV2_dIdsIBPC_dVbsi ;
727               dIdsIBPC_dT     = 0.0  ;
728               dIdsIBPC_dVddp  = here->HSMHV2_dIdsIBPC_dVddp ;
729               IdsIBPCs        = 0.0 ;
730               dIdsIBPCs_dVds  = 0.0 ;
731               dIdsIBPCs_dVgs  = 0.0 ;
732               dIdsIBPCs_dVbs  = 0.0 ;
733               dIdsIBPCs_dT    = 0.0 ;
734               dIdsIBPCs_dVddp = 0.0 ;
735               Igidl        = here->HSMHV2_igidl ;
736               dIgidl_dVds  = here->HSMHV2_dIgidl_dVdsi ;
737               dIgidl_dVgs  = here->HSMHV2_dIgidl_dVgsi ;
738               dIgidl_dVbs  = here->HSMHV2_dIgidl_dVbsi ;
739               dIgidl_dT    = 0.0  ;
740               Igisl        = here->HSMHV2_igisl ;
741               dIgisl_dVds  = here->HSMHV2_dIgisl_dVdsi ;
742               dIgisl_dVgs  = here->HSMHV2_dIgisl_dVgsi ;
743               dIgisl_dVbs  = here->HSMHV2_dIgisl_dVbsi ;
744               dIgisl_dT    = 0.0  ;
745               Igd          = here->HSMHV2_igd ;
746               dIgd_dVd   = here->HSMHV2_dIgd_dVdsi ;
747               dIgd_dVg   = here->HSMHV2_dIgd_dVgsi ;
748               dIgd_dVb   = here->HSMHV2_dIgd_dVbsi ;
749               dIgd_dT      = 0.0  ;
750               Igs          = here->HSMHV2_igs ;
751               dIgs_dVd   = here->HSMHV2_dIgs_dVdsi ;
752               dIgs_dVg   = here->HSMHV2_dIgs_dVgsi ;
753               dIgs_dVb   = here->HSMHV2_dIgs_dVbsi ;
754               dIgs_dT      = 0.0  ;
755               Igb          = here->HSMHV2_igb ;
756               dIgb_dVd   = here->HSMHV2_dIgb_dVdsi ;
757               dIgb_dVg   = here->HSMHV2_dIgb_dVgsi ;
758               dIgb_dVb   = here->HSMHV2_dIgb_dVbsi ;
759               dIgb_dT      = 0.0  ;
760               Ibd = here->HSMHV2_ibd ;
761               Gbd = here->HSMHV2_gbd ;
762               Gbdt = 0.0 ;
763               Ibs = here->HSMHV2_ibs ;
764               Gbs = here->HSMHV2_gbs ;
765               Gbst = 0.0 ;
766             } else { /* reverse mode */
767               Ids       = - here->HSMHV2_ids ;
768               gds       = + (here->HSMHV2_dIds_dVdsi + here->HSMHV2_dIds_dVgsi + here->HSMHV2_dIds_dVbsi) ;
769               gm        = - here->HSMHV2_dIds_dVgsi ;
770               gmbs      = - here->HSMHV2_dIds_dVbsi ;
771               gmT       = 0.0  ;
772               gds_ext   = + (here->HSMHV2_dIds_dVdse + here->HSMHV2_dIds_dVgse + here->HSMHV2_dIds_dVbse) ;
773               gm_ext    = - here->HSMHV2_dIds_dVgse;
774               gmbs_ext  = - here->HSMHV2_dIds_dVbse;
775               Isub         = 0.0 ;
776               dIsub_dVds   = 0.0 ;
777               dIsub_dVgs   = 0.0 ;
778               dIsub_dVbs   = 0.0 ;
779               dIsub_dT     = 0.0 ;
780               Isubs        =   here->HSMHV2_isub ;
781               dIsubs_dVds  = - (here->HSMHV2_dIsub_dVdsi + here->HSMHV2_dIsub_dVgsi + here->HSMHV2_dIsub_dVbsi) ;
782               dIsubs_dVgs  =   here->HSMHV2_dIsub_dVgsi ;
783               dIsubs_dVbs  =   here->HSMHV2_dIsub_dVbsi ;
784               dIsubs_dT    =   0.0 ;
785               IsubLD         = 0.0 ;
786               dIsubLD_dVds   = 0.0 ;
787               dIsubLD_dVgs   = 0.0 ;
788               dIsubLD_dVbs   = 0.0 ;
789               dIsubLD_dT     = 0.0 ;
790               dIsubLD_dVddp  = 0.0 ;
791               IsubLDs        =   here->HSMHV2_isubld ;
792               dIsubLDs_dVds  = - (here->HSMHV2_dIsubLD_dVdsi + here->HSMHV2_dIsubLD_dVgsi + here->HSMHV2_dIsubLD_dVbsi) ;
793               dIsubLDs_dVgs  =   here->HSMHV2_dIsubLD_dVgsi ;
794               dIsubLDs_dVbs  =   here->HSMHV2_dIsubLD_dVbsi ;
795               dIsubLDs_dT    =   0.0 ;
796               dIsubLDs_dVddp = - here->HSMHV2_dIsubLD_dVddp ;
797               IdsIBPC         = 0.0 ;
798               dIdsIBPC_dVds   = 0.0 ;
799               dIdsIBPC_dVgs   = 0.0 ;
800               dIdsIBPC_dVbs   = 0.0 ;
801               dIdsIBPC_dT     = 0.0 ;
802               dIdsIBPC_dVddp  = 0.0 ;
803               IdsIBPCs        =   here->HSMHV2_idsibpc ;
804               dIdsIBPCs_dVds  = - (here->HSMHV2_dIdsIBPC_dVdsi + here->HSMHV2_dIdsIBPC_dVgsi + here->HSMHV2_dIdsIBPC_dVbsi) ;
805               dIdsIBPCs_dVgs  =   here->HSMHV2_dIdsIBPC_dVgsi ;
806               dIdsIBPCs_dVbs  =   here->HSMHV2_dIdsIBPC_dVbsi ;
807               dIdsIBPCs_dT    =   0.0 ;
808               dIdsIBPCs_dVddp = - here->HSMHV2_dIdsIBPC_dVddp ;
809               Igidl        =   here->HSMHV2_igisl ;
810               dIgidl_dVds  = - (here->HSMHV2_dIgisl_dVdsi + here->HSMHV2_dIgisl_dVgsi + here->HSMHV2_dIgisl_dVbsi) ;
811               dIgidl_dVgs  =   here->HSMHV2_dIgisl_dVgsi ;
812               dIgidl_dVbs  =   here->HSMHV2_dIgisl_dVbsi ;
813               dIgidl_dT    =   0.0  ;
814               Igisl        =   here->HSMHV2_igidl ;
815               dIgisl_dVds  = - (here->HSMHV2_dIgidl_dVdsi + here->HSMHV2_dIgidl_dVgsi + here->HSMHV2_dIgidl_dVbsi) ;
816               dIgisl_dVgs  =   here->HSMHV2_dIgidl_dVgsi ;
817               dIgisl_dVbs  =   here->HSMHV2_dIgidl_dVbsi ;
818               dIgisl_dT    =   0.0  ;
819               Igd          =   here->HSMHV2_igd ;
820               dIgd_dVd   = - (here->HSMHV2_dIgs_dVdsi + here->HSMHV2_dIgs_dVgsi + here->HSMHV2_dIgs_dVbsi) ;
821               dIgd_dVg   =   here->HSMHV2_dIgs_dVgsi ;
822               dIgd_dVb   =   here->HSMHV2_dIgs_dVbsi ;
823               dIgd_dT      =   0.0  ;
824               Igs          =   here->HSMHV2_igs ;
825               dIgs_dVd   = - (here->HSMHV2_dIgd_dVdsi + here->HSMHV2_dIgd_dVgsi + here->HSMHV2_dIgd_dVbsi) ;
826               dIgs_dVg   =   here->HSMHV2_dIgd_dVgsi ;
827               dIgs_dVb   =   here->HSMHV2_dIgd_dVbsi ;
828               dIgs_dT      =   0.0  ;
829               Igb          =   here->HSMHV2_igb ;
830               dIgb_dVd   = - (here->HSMHV2_dIgb_dVdsi + here->HSMHV2_dIgb_dVgsi + here->HSMHV2_dIgb_dVbsi) ;
831               dIgb_dVg   =   here->HSMHV2_dIgb_dVgsi ;
832               dIgb_dVb   =   here->HSMHV2_dIgb_dVbsi ;
833               dIgb_dT      =   0.0  ;
834               Ibd = here->HSMHV2_ibd ;
835               Gbd = here->HSMHV2_gbd ;
836               Gbdt = 0.0 ;
837               Ibs = here->HSMHV2_ibs ;
838               Gbs = here->HSMHV2_gbs ;
839               Gbst = 0.0 ;
840             } /* end of reverse mode */
841 
842             /* for bypass control, only nonlinear static currents are considered: */
843             i_dP     = Ids  + Isub  + Igidl - Igd ;
844             i_dP_hat = i_dP + gm         *delvgs + gds        *delvds + gmbs       *delvbs + gmT      *deldeltemp
845                             + dIsub_dVgs *delvgs + dIsub_dVds *delvds + dIsub_dVbs *delvbs + dIsub_dT *deldeltemp
846                             + dIgidl_dVgs*delvgs + dIgidl_dVds*delvds + dIgidl_dVbs*delvbs + dIgidl_dT*deldeltemp
847                             -(dIgd_dVg   *delvgs + dIgd_dVd   *delvds + dIgd_dVb   *delvbs + dIgd_dT  *deldeltemp)
848                             + gm_ext     *delvgse + gds_ext    *delvdse + gmbs_ext   *delvbse ;
849 
850             i_gP     = Igd  + Igs   + Igb ;
851             i_gP_hat = i_gP + dIgd_dVg   *delvgs + dIgd_dVd   *delvds + dIgd_dVb   *delvbs + dIgd_dT  *deldeltemp
852                             + dIgs_dVg   *delvgs + dIgs_dVd   *delvds + dIgs_dVb   *delvbs + dIgs_dT  *deldeltemp
853                             + dIgb_dVg   *delvgs + dIgb_dVd   *delvds + dIgb_dVb   *delvbs + dIgb_dT  *deldeltemp ;
854 
855             i_sP     =-Ids  + Isubs + Igisl - Igs ;
856             i_sP_hat = i_sP -(gm         *delvgs + gds        *delvds + gmbs       *delvbs + gmT      *deldeltemp)
857                             + dIsubs_dVgs*delvgs + dIsubs_dVds*delvds + dIsubs_dVbs*delvbs + dIsubs_dT*deldeltemp
858                             + dIgisl_dVgs*delvgs + dIgisl_dVds*delvds + dIgisl_dVbs*delvbs + dIgisl_dT*deldeltemp
859                             -(dIgs_dVg   *delvgs + dIgs_dVd   *delvds + dIgs_dVb   *delvbs + dIgs_dT  *deldeltemp)
860                             -(gm_ext     *delvgse + gds_ext    *delvdse + gmbs_ext   *delvbse) ;
861 
862             i_db     = Ibd ;
863             i_db_hat = i_db + Gbd*delvdbd + Gbdt*deldeltemp ;
864 
865             i_sb     = Ibs ;
866             i_sb_hat = i_sb + Gbs*delvsbs + Gbst*deldeltemp ;
867 
868             /* ... second part of bypass checks: */
869  /*            1 2     3               3                       3    4        4     4    43                  2    1 */
870             if ( ( fabs(i_dP_hat - i_dP) < ckt->CKTreltol * MAX(fabs(i_dP_hat),fabs(i_dP)) + ckt->CKTabstol ) &&
871                  ( fabs(i_gP_hat - i_gP) < ckt->CKTreltol * MAX(fabs(i_gP_hat),fabs(i_gP)) + ckt->CKTabstol ) &&
872                  ( fabs(i_sP_hat - i_sP) < ckt->CKTreltol * MAX(fabs(i_sP_hat),fabs(i_sP)) + ckt->CKTabstol ) &&
873                  ( fabs(i_db_hat - i_db) < ckt->CKTreltol * MAX(fabs(i_db_hat),fabs(i_db)) + ckt->CKTabstol ) &&
874                  ( fabs(i_sb_hat - i_sb) < ckt->CKTreltol * MAX(fabs(i_sb_hat),fabs(i_sb)) + ckt->CKTabstol )    )
875             {
876               /* bypass code */
877               vds  = *(ckt->CKTstate0 + here->HSMHV2vds );
878               vgs  = *(ckt->CKTstate0 + here->HSMHV2vgs );
879               vbs  = *(ckt->CKTstate0 + here->HSMHV2vbs );
880               vdse = *(ckt->CKTstate0 + here->HSMHV2vdse);
881               vgse = *(ckt->CKTstate0 + here->HSMHV2vgse);
882               vbse = *(ckt->CKTstate0 + here->HSMHV2vbse);
883               vdbd = *(ckt->CKTstate0 + here->HSMHV2vdbd);
884               vsbs = *(ckt->CKTstate0 + here->HSMHV2vsbs);
885               vsubs = *(ckt->CKTstate0 + here->HSMHV2vsubs);
886               deltemp = *(ckt->CKTstate0 + here->HSMHV2deltemp);
887               if ( flg_nqs ) {
888                 Qi_nqs = *(ckt->CKTstate0 + here->HSMHV2qi_nqs);
889                 Qb_nqs = *(ckt->CKTstate0 + here->HSMHV2qb_nqs);
890               }
891 
892               vges = *(ckt->CKTstate0 + here->HSMHV2vges);
893 
894               vbd  = vbs - vds;
895               vgd  = vgs - vds;
896               vgb  = vgs - vbs;
897               vged = vges - vds;
898 
899               vbs_jct = vsbs;
900               vbd_jct = vdbd;
901 
902               /* linear branch currents */
903               vddp = model->HSMHV2_type * (*(ckt->CKTrhsOld+here->HSMHV2dNode) - *(ckt->CKTrhsOld+here->HSMHV2dNodePrime));
904               vggp = model->HSMHV2_type * (*(ckt->CKTrhsOld+here->HSMHV2gNode) - *(ckt->CKTrhsOld+here->HSMHV2gNodePrime));
905               vssp = model->HSMHV2_type * (*(ckt->CKTrhsOld+here->HSMHV2sNode) - *(ckt->CKTrhsOld+here->HSMHV2sNodePrime));
906               vbpb  = model->HSMHV2_type * (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) - *(ckt->CKTrhsOld+here->HSMHV2bNode));
907               vbpdb = model->HSMHV2_type * (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) - *(ckt->CKTrhsOld+here->HSMHV2dbNode));
908               vbpsb = model->HSMHV2_type * (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) - *(ckt->CKTrhsOld+here->HSMHV2sbNode));
909 
910               ByPass = 1;
911               goto line755;
912             }
913           }
914         }  /* end of Bypass section */
915 #endif /*NOBYPASS*/
916 
917 #ifdef DEBUG_HISIMHVLD_VX
918         printf( "vbd_p    = %12.5e\n" , vbd );
919         printf( "vbs_p    = %12.5e\n" , vbs );
920         printf( "vgs_p    = %12.5e\n" , vgs );
921         printf( "vds_p    = %12.5e\n" , vds );
922 #endif
923 
924         /* start limiting of nonlinear branch voltages */
925 
926         von = here->HSMHV2_von;
927         Check3 = 0 ;
928         if(*(ckt->CKTstate0 + here->HSMHV2vds) >= 0.0) { /* case vds>=0 for limiting */
929           limval = DEVfetlim(vgs, *(ckt->CKTstate0 + here->HSMHV2vgs), von);
930           if (vgs != limval) {
931             vgs = limval ;
932             Check3 = 1 ;
933           }
934           if (Check3) vds = vgs - vgd;
935           limval = DEVlimvds(vds, *(ckt->CKTstate0 + here->HSMHV2vds));
936           if (vds != limval) {
937             vds = limval ;
938             Check3 = 2 ;
939           }
940           vgd = vgs - vds;
941 
942           if (here->HSMHV2_corg == 1) {
943             limval = DEVfetlim(vges, *(ckt->CKTstate0 + here->HSMHV2vges), von);
944             if (vges != limval) {
945               vges = limval ;
946               Check3 = 3 ;
947             }
948             vged = vges - vds;
949           }
950 
951         } else { /* case vds < 0 for limiting */
952           limval = DEVfetlim(vgd, vgdo, von);
953           if (vgd != limval) {
954             vgd = limval ;
955             Check3 = 4 ;
956           }
957           if (Check3) vds = vgs - vgd;
958           limval = -DEVlimvds(-vds, -(*(ckt->CKTstate0 + here->HSMHV2vds)));
959           if (vds != limval) {
960             vds = limval ;
961             Check3 = 5 ;
962           }
963           vgs = vgd + vds;
964 
965           if (here->HSMHV2_corg == 1) {
966             limval = DEVfetlim(vged, vgedo, von);
967             if (vged != limval) {
968               vged = limval ;
969               Check3 = 6 ;
970             }
971             vges = vged + vds;
972           }
973         } /* end of case vds< 0 for limiting */
974 
975         if (vds >= 0.0) { /* case vds >=0 for limiting of junctions */
976           vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->HSMHV2vbs),
977                           CONSTvt0, model->HSMHV2_vcrit, &Check1);
978           if (Check1) Check3 = 7 ;
979           vbd = vbs - vds;
980           if (here->HSMHV2_corbnet) {
981             vsbs = DEVpnjlim(vsbs, *(ckt->CKTstate0 + here->HSMHV2vsbs),
982                              CONSTvt0, model->HSMHV2_vcrit, &Check2);
983             if (Check2) Check3 = 8 ;
984           }
985         }
986         else { /* case vds < 0 for limiting of junctions */
987           vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->HSMHV2vbd),
988                           CONSTvt0, model->HSMHV2_vcrit, &Check1);
989           if (Check1) Check3 = 9 ;
990           vbs = vbd + vds;
991           if (here->HSMHV2_corbnet) {
992             vdbd = DEVpnjlim(vdbd, *(ckt->CKTstate0 + here->HSMHV2vdbd),
993                              CONSTvt0, model->HSMHV2_vcrit, &Check2);
994             if (Check2) {
995                Check3 = 10 ;
996                vdbs = vdbd + vdse;
997             }
998           }
999         }
1000 
1001         if( here->HSMHV2_coselfheat > 0 ){
1002            /* Logarithmic damping of deltemp beyond LIM_TOL */
1003            deltemp_old = *(ckt->CKTstate0 + here->HSMHV2deltemp);
1004            if (deltemp > deltemp_old + LIM_TOL)
1005              {deltemp = deltemp_old + LIM_TOL + log10((deltemp-deltemp_old)/LIM_TOL);
1006                Check3 = 11;}
1007            else if (deltemp < deltemp_old - LIM_TOL)
1008              {deltemp = deltemp_old - LIM_TOL - log10((deltemp_old-deltemp)/LIM_TOL);
1009                Check3 = 12;}
1010         }
1011 
1012         /* if (Check3) printf("HSMHV2_load: Check3=%d\n",Check3) ; */
1013 
1014         /* limiting completed */
1015         if (Check3 == 0 ) Check = 0 ;
1016       } /* loading and limiting of nonlinear branch voltages is completed */
1017 
1018 
1019       vbd = vbs - vds;
1020       vgd = vgs - vds;
1021       vgb = vgs - vbs;
1022       vged = vges - vds;
1023 
1024       vbs_jct = vsbs;
1025       vbd_jct = vdbd;
1026 
1027       /* linear branch voltages */
1028       if ( (ckt->CKTmode & MODEINITJCT) && !here->HSMHV2_off ) {
1029         vddp = vggp = vssp = vbpdb = vbpb = vbpsb = 0.0;
1030       } else {
1031         vddp = model->HSMHV2_type *
1032              (*(ckt->CKTrhsOld+here->HSMHV2dNode) -
1033                 *(ckt->CKTrhsOld+here->HSMHV2dNodePrime));
1034 
1035         vggp = model->HSMHV2_type *
1036              (*(ckt->CKTrhsOld+here->HSMHV2gNode) -
1037                 *(ckt->CKTrhsOld+here->HSMHV2gNodePrime));
1038 
1039         vssp = model->HSMHV2_type *
1040              (*(ckt->CKTrhsOld+here->HSMHV2sNode) -
1041                 *(ckt->CKTrhsOld+here->HSMHV2sNodePrime));
1042 
1043         vbpdb = model->HSMHV2_type *
1044              (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) -
1045                 *(ckt->CKTrhsOld+here->HSMHV2dbNode));
1046 
1047         vbpb = model->HSMHV2_type *
1048              (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) -
1049                 *(ckt->CKTrhsOld+here->HSMHV2bNode));
1050 
1051         vbpsb = model->HSMHV2_type *
1052              (*(ckt->CKTrhsOld+here->HSMHV2bNodePrime) -
1053                 *(ckt->CKTrhsOld+here->HSMHV2sbNode));
1054       }
1055 
1056 #ifdef DEBUG_HISIMHVLD_VX
1057       printf( "vbd    = %12.5e\n" , vbd );
1058       printf( "vbs    = %12.5e\n" , vbs );
1059       printf( "vgs    = %12.5e\n" , vgs );
1060       printf( "vds    = %12.5e\n" , vds );
1061 #endif
1062 
1063       /* After loading (and limiting of branch voltages: Start model evaluation */
1064 
1065       /* printf("HSMHV2_load: vds=%e vgs=%e vbs=%e vsd=%e vgd=%e vbd=%e\n",
1066                           vds,vgs,vbs,-vds,vgs-vds,vbs-vds); */
1067 
1068       if (vds >= 0) { /* normal mode */
1069         here->HSMHV2_mode = 1;
1070         ivds = vds;
1071         ivgs = vgs;
1072         ivbs = vbs;
1073         ivdse = vdse;
1074         ivgse = vgse;
1075         ivbse = vbse;
1076       } else { /* reverse mode */
1077         here->HSMHV2_mode = -1;
1078         ivds = -vds;
1079         ivgs = vgd;
1080         ivbs = vbd;
1081         ivdse = -vdse;
1082         ivgse = vgse - vdse;
1083         ivbse = vbse - vdse;
1084       }
1085 
1086       if ( model->HSMHV2_info >= 5 ) { /* mode, bias conditions ... */
1087         printf( "--- variables given to HSMHV2evaluate() ----\n" );
1088         printf( "type   = %s\n" , (model->HSMHV2_type>0) ? "NMOS" : "PMOS" );
1089         printf( "mode   = %s\n" , (here->HSMHV2_mode>0) ? "NORMAL" : "REVERSE" );
1090 
1091         printf( "vbse vbs    = %12.5e %12.5e\n" , vbse, ivbs );
1092         printf( "vdse vds    = %12.5e %12.5e\n" , vdse, ivds );
1093         printf( "vgse vgs    = %12.5e %12.5e\n" , vgse, ivgs );
1094       }
1095       if ( model->HSMHV2_info >= 6 ) { /* input flags */
1096         printf( "corsrd = %s\n" , (model->HSMHV2_corsrd)  ? "true" : "false" ) ;
1097         printf( "coadov = %s\n" , (model->HSMHV2_coadov)  ? "true" : "false" ) ;
1098         printf( "coisub = %s\n" , (model->HSMHV2_coisub)  ? "true" : "false" ) ;
1099         printf( "coiigs = %s\n" , (model->HSMHV2_coiigs)  ? "true" : "false" ) ;
1100         printf( "cogidl = %s\n" , (model->HSMHV2_cogidl)  ? "true" : "false" ) ;
1101         printf( "coovlp = %s\n" , (model->HSMHV2_coovlp)  ? "true" : "false" ) ;
1102         printf( "coovlps = %s\n" , (model->HSMHV2_coovlps) ? "true" : "false" ) ;
1103         printf( "coflick = %s\n", (model->HSMHV2_coflick) ? "true" : "false" ) ;
1104         printf( "coisti = %s\n" , (model->HSMHV2_coisti)  ? "true" : "false" ) ;
1105         printf( "conqs  = %s\n" , (model->HSMHV2_conqs)   ? "true" : "false" ) ;
1106         printf( "cothrml = %s\n", (model->HSMHV2_cothrml) ? "true" : "false" ) ;
1107         printf( "coign = %s\n"  , (model->HSMHV2_coign)   ? "true" : "false" ) ;
1108         printf( "cosym   = %s\n" , (model->HSMHV2_cosym) ? "true" : "false" ) ;
1109         printf( "coselfheat = %s\n" , (here->HSMHV2_coselfheat) ? "true" : "false" ) ;
1110       }
1111       /* print inputs ------------AA */
1112 
1113  #ifdef DEBUG_HISIMHVCGG
1114       /* Print convergence flag */
1115       printf("isConv %d ", isConv );
1116       printf("CKTtime %e ", ckt->CKTtime );
1117       printf("Vb %1.3e ", (model->HSMHV2_type>0) ? vbs:-vbs );
1118       printf("Vd %1.3e ", (model->HSMHV2_type>0) ? vds:-vds );
1119       printf("Vg %1.3e ", (model->HSMHV2_type>0) ? vgs:-vgs );
1120  #endif
1121 
1122       /* call model evaluation */
1123       if ( HSMHV2evaluate(ivdse,ivgse,ivbse,ivds, ivgs, ivbs, vbs_jct, vbd_jct, vsubs, vddp, deltemp, here, model, ckt) == HiSIM_ERROR )
1124         return (HiSIM_ERROR);
1125       if ( here->HSMHV2_cordrift == 1 ) {
1126         if ( HSMHV2rdrift(vddp, vds, vbs, vsubs, deltemp, here, model, ckt) == HiSIM_ERROR )
1127         return (HiSIM_ERROR);
1128       }
1129       if ( HSMHV2dio(vbs_jct, vbd_jct, deltemp, here, model, ckt) == HiSIM_ERROR )
1130         return (HiSIM_ERROR);
1131 
1132 #ifdef DEBUG_HISIMHVCGG
1133       printf("HSMHV2_ids %e ", here->HSMHV2_ids ) ;
1134       printf("HSMHV2_cggb %e ", here->HSMHV2_cggb ) ;
1135       printf("\n") ;
1136 #endif
1137 
1138       here->HSMHV2_called += 1;
1139 
1140 line755: /* standard entry if HSMHV2evaluate is bypassed */
1141          /* (could be shifted a bit forward ...)       */
1142       if ( here->HSMHV2_mode > 0 ) { /* forward mode */
1143         Rd         = here->HSMHV2_Rd ;
1144         dRd_dVddp  = here->HSMHV2_dRd_dVddp  ;
1145         dRd_dVdse  = here->HSMHV2_dRd_dVdse  ;
1146         dRd_dVgse  = here->HSMHV2_dRd_dVgse  ;
1147         dRd_dVbse  = here->HSMHV2_dRd_dVbse  ;
1148         dRd_dVsubs = (flg_subNode > 0) ? here->HSMHV2_dRd_dVsubs : 0.0 ; /* derivative w.r.t. Vsubs */
1149         dRd_dT     = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dRd_dTi : 0.0  ;
1150         dRd_dVds   = here->HSMHV2_dRd_dVds   ;
1151         dRd_dVgs   = here->HSMHV2_dRd_dVgs   ;
1152         dRd_dVbs   = here->HSMHV2_dRd_dVbs   ;
1153         Rs         = here->HSMHV2_Rs ;
1154         dRs_dVdse  = here->HSMHV2_dRs_dVdse  ;
1155         dRs_dVgse  = here->HSMHV2_dRs_dVgse  ;
1156         dRs_dVbse  = here->HSMHV2_dRs_dVbse  ;
1157         dRs_dVsubs = (flg_subNode > 0) ? here->HSMHV2_dRs_dVsubs : 0.0 ; /* derivative w.r.t. Vsubs */
1158         dRs_dT     = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dRs_dTi : 0.0  ;
1159         Ids        = here->HSMHV2_ids ;
1160         gds        = here->HSMHV2_dIds_dVdsi ;
1161         gm         = here->HSMHV2_dIds_dVgsi ;
1162         gmbs       = here->HSMHV2_dIds_dVbsi ;
1163         gmT        = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIds_dTi : 0.0  ;
1164         gmbs_ext   = here->HSMHV2_dIds_dVbse ;
1165         gds_ext    = here->HSMHV2_dIds_dVdse ;
1166         gm_ext     = here->HSMHV2_dIds_dVgse ;
1167 
1168         Qd        = here->HSMHV2_qd ;
1169         dQd_dVds  = here->HSMHV2_dQdi_dVdsi ;
1170         dQd_dVgs  = here->HSMHV2_dQdi_dVgsi ;
1171         dQd_dVbs  = here->HSMHV2_dQdi_dVbsi ;
1172         dQd_dT    = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQdi_dTi : 0.0  ;
1173         Qg         = here->HSMHV2_qg ;
1174         dQg_dVds   = here->HSMHV2_dQg_dVdsi ;
1175         dQg_dVgs   = here->HSMHV2_dQg_dVgsi ;
1176         dQg_dVbs   = here->HSMHV2_dQg_dVbsi ;
1177         dQg_dT     = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQg_dTi : 0.0  ;
1178         Qs        = here->HSMHV2_qs ;
1179         dQs_dVds  = here->HSMHV2_dQsi_dVdsi ;
1180         dQs_dVgs  = here->HSMHV2_dQsi_dVgsi ;
1181         dQs_dVbs  = here->HSMHV2_dQsi_dVbsi ;
1182         dQs_dT    = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQsi_dTi : 0.0  ;
1183         Qb         = - (here->HSMHV2_qg + here->HSMHV2_qd + here->HSMHV2_qs) ;
1184         dQb_dVds   = here->HSMHV2_dQb_dVdsi ;
1185         dQb_dVgs   = here->HSMHV2_dQb_dVgsi ;
1186         dQb_dVbs   = here->HSMHV2_dQb_dVbsi ;
1187         dQb_dT     = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQb_dTi : 0.0  ;
1188         Qfd        = here->HSMHV2_qdp ;
1189         dQfd_dVdse = here->HSMHV2_dqdp_dVdse ;
1190         dQfd_dVgse = here->HSMHV2_dqdp_dVgse ;
1191         dQfd_dVbse = here->HSMHV2_dqdp_dVbse ;
1192         dQfd_dT    = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dqdp_dTi : 0.0  ;
1193         Qfs        = here->HSMHV2_qsp ;
1194         dQfs_dVdse = here->HSMHV2_dqsp_dVdse ;
1195         dQfs_dVgse = here->HSMHV2_dqsp_dVgse ;
1196         dQfs_dVbse = here->HSMHV2_dqsp_dVbse ;
1197         dQfs_dT    = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dqsp_dTi : 0.0  ;
1198 
1199         Qdext        = here->HSMHV2_qdext ;
1200         dQdext_dVdse = here->HSMHV2_dQdext_dVdse ;
1201         dQdext_dVgse = here->HSMHV2_dQdext_dVgse ;
1202         dQdext_dVbse = here->HSMHV2_dQdext_dVbse ;
1203         dQdext_dT    = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQdext_dTi : 0.0  ;
1204         Qgext        = here->HSMHV2_qgext ;
1205         dQgext_dVdse = here->HSMHV2_dQgext_dVdse ;
1206         dQgext_dVgse = here->HSMHV2_dQgext_dVgse ;
1207         dQgext_dVbse = here->HSMHV2_dQgext_dVbse ;
1208         dQgext_dT    = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQgext_dTi : 0.0  ;
1209         Qsext        = here->HSMHV2_qsext ;
1210         dQsext_dVdse = here->HSMHV2_dQsext_dVdse ;
1211         dQsext_dVgse = here->HSMHV2_dQsext_dVgse ;
1212         dQsext_dVbse = here->HSMHV2_dQsext_dVbse ;
1213         dQsext_dT    = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQsext_dTi : 0.0  ;
1214         Qbext        = - (here->HSMHV2_qgext + here->HSMHV2_qdext + here->HSMHV2_qsext) ;
1215         dQbext_dVdse = here->HSMHV2_dQbext_dVdse ;
1216         dQbext_dVgse = here->HSMHV2_dQbext_dVgse ;
1217         dQbext_dVbse = here->HSMHV2_dQbext_dVbse ;
1218         dQbext_dT    = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQbext_dTi : 0.0  ;
1219         Isub         = here->HSMHV2_isub ;
1220         dIsub_dVds   = here->HSMHV2_dIsub_dVdsi ;
1221         dIsub_dVgs   = here->HSMHV2_dIsub_dVgsi ;
1222         dIsub_dVbs   = here->HSMHV2_dIsub_dVbsi ;
1223         dIsub_dT     = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIsub_dTi : 0.0  ;
1224         Isubs        = 0.0 ;
1225         dIsubs_dVds  = 0.0 ;
1226         dIsubs_dVgs  = 0.0 ;
1227         dIsubs_dVbs  = 0.0 ;
1228         dIsubs_dT    = 0.0 ;
1229         IsubLD         = here->HSMHV2_isubld ;
1230         dIsubLD_dVds   = here->HSMHV2_dIsubLD_dVdsi ;
1231         dIsubLD_dVgs   = here->HSMHV2_dIsubLD_dVgsi ;
1232         dIsubLD_dVbs   = here->HSMHV2_dIsubLD_dVbsi ;
1233         dIsubLD_dT     = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIsubLD_dTi : 0.0  ;
1234         dIsubLD_dVddp  = here->HSMHV2_dIsubLD_dVddp ;
1235         IsubLDs        = 0.0 ;
1236         dIsubLDs_dVds  = 0.0 ;
1237         dIsubLDs_dVgs  = 0.0 ;
1238         dIsubLDs_dVbs  = 0.0 ;
1239         dIsubLDs_dT    = 0.0 ;
1240         dIsubLDs_dVddp = 0.0 ;
1241         IdsIBPC         = here->HSMHV2_idsibpc ;
1242         dIdsIBPC_dVds   = here->HSMHV2_dIdsIBPC_dVdsi ;
1243         dIdsIBPC_dVgs   = here->HSMHV2_dIdsIBPC_dVgsi ;
1244         dIdsIBPC_dVbs   = here->HSMHV2_dIdsIBPC_dVbsi ;
1245         dIdsIBPC_dT     = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIdsIBPC_dTi : 0.0  ;
1246         dIdsIBPC_dVddp  = here->HSMHV2_dIdsIBPC_dVddp ;
1247         IdsIBPCs        = 0.0 ;
1248         dIdsIBPCs_dVds  = 0.0 ;
1249         dIdsIBPCs_dVgs  = 0.0 ;
1250         dIdsIBPCs_dVbs  = 0.0 ;
1251         dIdsIBPCs_dT    = 0.0 ;
1252         dIdsIBPCs_dVddp = 0.0 ;
1253         Igidl        = here->HSMHV2_igidl ;
1254         dIgidl_dVds  = here->HSMHV2_dIgidl_dVdsi ;
1255         dIgidl_dVgs  = here->HSMHV2_dIgidl_dVgsi ;
1256         dIgidl_dVbs  = here->HSMHV2_dIgidl_dVbsi ;
1257         dIgidl_dT    = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgidl_dTi : 0.0  ;
1258         Igisl        = here->HSMHV2_igisl ;
1259         dIgisl_dVds  = here->HSMHV2_dIgisl_dVdsi ;
1260         dIgisl_dVgs  = here->HSMHV2_dIgisl_dVgsi ;
1261         dIgisl_dVbs  = here->HSMHV2_dIgisl_dVbsi ;
1262         dIgisl_dT    = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgisl_dTi : 0.0  ;
1263         Igd          = here->HSMHV2_igd ;
1264         dIgd_dVd   = here->HSMHV2_dIgd_dVdsi ;
1265         dIgd_dVg   = here->HSMHV2_dIgd_dVgsi ;
1266         dIgd_dVb   = here->HSMHV2_dIgd_dVbsi ;
1267         dIgd_dT      = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgd_dTi : 0.0  ;
1268         Igs          = here->HSMHV2_igs ;
1269         dIgs_dVd   = here->HSMHV2_dIgs_dVdsi ;
1270         dIgs_dVg   = here->HSMHV2_dIgs_dVgsi ;
1271         dIgs_dVb   = here->HSMHV2_dIgs_dVbsi ;
1272         dIgs_dT      = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgs_dTi : 0.0  ;
1273         Igb          = here->HSMHV2_igb ;
1274         dIgb_dVd   = here->HSMHV2_dIgb_dVdsi ;
1275         dIgb_dVg   = here->HSMHV2_dIgb_dVgsi ;
1276         dIgb_dVb   = here->HSMHV2_dIgb_dVbsi ;
1277         dIgb_dT      = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgb_dTi : 0.0  ;
1278 
1279         /*---------------------------------------------------*
1280          * Junction diode.
1281          *-----------------*/
1282         Ibd = here->HSMHV2_ibd ;
1283         Gbd = here->HSMHV2_gbd ;
1284         Gbdt = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_gbdT : 0.0 ;
1285 
1286         /* Qbd = here->HSMHV2_qbd ; */
1287         Qbd = *(ckt->CKTstate0 + here->HSMHV2qbd) ;
1288         Cbd = here->HSMHV2_capbd ;
1289         Cbdt = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_gcbdT : 0.0 ;
1290 
1291         Ibs = here->HSMHV2_ibs ;
1292         Gbs = here->HSMHV2_gbs ;
1293         Gbst = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_gbsT : 0.0 ;
1294 
1295         /* Qbs = here->HSMHV2_qbs ; */
1296         Qbs = *(ckt->CKTstate0 + here->HSMHV2qbs) ;
1297         Cbs = here->HSMHV2_capbs ;
1298         Cbst = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_gcbsT : 0.0 ;
1299 
1300         if (flg_nqs) {
1301           tau         = here->HSMHV2_tau       ;
1302           dtau_dVds   = here->HSMHV2_tau_dVdsi ;
1303           dtau_dVgs   = here->HSMHV2_tau_dVgsi ;
1304           dtau_dVbs   = here->HSMHV2_tau_dVbsi ;
1305           dtau_dT     = here->HSMHV2_tau_dTi   ;
1306           taub        = here->HSMHV2_taub      ;
1307           dtaub_dVds  = here->HSMHV2_taub_dVdsi ;
1308           dtaub_dVgs  = here->HSMHV2_taub_dVgsi ;
1309           dtaub_dVbs  = here->HSMHV2_taub_dVbsi ;
1310           dtaub_dT    = here->HSMHV2_taub_dTi   ;
1311           Qdrat       = here->HSMHV2_Xd         ;
1312           dQdrat_dVds = here->HSMHV2_Xd_dVdsi   ;
1313           dQdrat_dVgs = here->HSMHV2_Xd_dVgsi   ;
1314           dQdrat_dVbs = here->HSMHV2_Xd_dVbsi   ;
1315           dQdrat_dT   = here->HSMHV2_Xd_dTi     ;
1316           Qi          = here->HSMHV2_Qi         ;
1317           dQi_dVds    = here->HSMHV2_Qi_dVdsi   ;
1318           dQi_dVgs    = here->HSMHV2_Qi_dVgsi   ;
1319           dQi_dVbs    = here->HSMHV2_Qi_dVbsi   ;
1320           dQi_dT      = here->HSMHV2_Qi_dTi     ;
1321           Qbulk       = here->HSMHV2_Qbulk       ;
1322           dQbulk_dVds = here->HSMHV2_Qbulk_dVdsi ;
1323           dQbulk_dVgs = here->HSMHV2_Qbulk_dVgsi ;
1324           dQbulk_dVbs = here->HSMHV2_Qbulk_dVbsi ;
1325           dQbulk_dT   = here->HSMHV2_Qbulk_dTi   ;
1326         }
1327 
1328       } else { /* reverse mode */
1329         /* note: here->HSMHV2_Rd and here->HSMHV2_Rs are already subjected to mode handling,
1330            while the following derivatives here->HSMHV2_Rd_dVdse, ... are not! */
1331         Rd        = here->HSMHV2_Rd ;
1332         dRd_dVddp = here->HSMHV2_dRd_dVddp  ;
1333         dRd_dVdse = here->HSMHV2_dRd_dVdse ;
1334         dRd_dVgse = here->HSMHV2_dRd_dVgse ;
1335         dRd_dVbse = here->HSMHV2_dRd_dVbse ;
1336         dRd_dVsubs= (flg_subNode > 0) ? here->HSMHV2_dRd_dVsubs : 0.0 ; /* derivative w.r.t. Vsubs */
1337         dRd_dT    = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dRd_dTi : 0.0  ;
1338         dRd_dVds  = here->HSMHV2_dRd_dVds  ;
1339         dRd_dVgs  = here->HSMHV2_dRd_dVgs  ;
1340         dRd_dVbs  = here->HSMHV2_dRd_dVbs  ;
1341         Rs        = here->HSMHV2_Rs ;
1342         dRs_dVdse = here->HSMHV2_dRs_dVdse ;
1343         dRs_dVgse = here->HSMHV2_dRs_dVgse ;
1344         dRs_dVbse = here->HSMHV2_dRs_dVbse ;
1345         dRs_dVsubs= (flg_subNode > 0) ? here->HSMHV2_dRs_dVsubs : 0.0 ; /* derivative w.r.t. Vsubs */
1346         dRs_dT    = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dRs_dTi : 0.0  ;
1347         Ids       = - here->HSMHV2_ids ;
1348         gds       = + (here->HSMHV2_dIds_dVdsi + here->HSMHV2_dIds_dVgsi + here->HSMHV2_dIds_dVbsi) ;
1349         gm        = - here->HSMHV2_dIds_dVgsi ;
1350         gmbs      = - here->HSMHV2_dIds_dVbsi ;
1351         gmT       = (here->HSMHV2_coselfheat > 0) ? - here->HSMHV2_dIds_dTi : 0.0  ;
1352         gds_ext   = + (here->HSMHV2_dIds_dVdse + here->HSMHV2_dIds_dVgse + here->HSMHV2_dIds_dVbse) ;
1353         gm_ext    = - here->HSMHV2_dIds_dVgse;
1354         gmbs_ext  = - here->HSMHV2_dIds_dVbse;
1355 
1356         Qd        =   here->HSMHV2_qs ;
1357         dQd_dVds  = - (here->HSMHV2_dQsi_dVdsi + here->HSMHV2_dQsi_dVgsi + here->HSMHV2_dQsi_dVbsi) ;
1358         dQd_dVgs  =   here->HSMHV2_dQsi_dVgsi ;
1359         dQd_dVbs  =   here->HSMHV2_dQsi_dVbsi ;
1360         dQd_dT    =   (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQsi_dTi : 0.0  ;
1361         Qg         =   here->HSMHV2_qg ;
1362         dQg_dVds   = - (here->HSMHV2_dQg_dVdsi + here->HSMHV2_dQg_dVgsi + here->HSMHV2_dQg_dVbsi) ;
1363         dQg_dVgs   =   here->HSMHV2_dQg_dVgsi ;
1364         dQg_dVbs   =   here->HSMHV2_dQg_dVbsi ;
1365         dQg_dT     =   (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQg_dTi : 0.0  ;
1366         Qs        =   here->HSMHV2_qd ;
1367         dQs_dVds  = - (here->HSMHV2_dQdi_dVdsi + here->HSMHV2_dQdi_dVgsi + here->HSMHV2_dQdi_dVbsi) ;
1368         dQs_dVgs  =   here->HSMHV2_dQdi_dVgsi ;
1369         dQs_dVbs  =   here->HSMHV2_dQdi_dVbsi ;
1370         dQs_dT    =   (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQdi_dTi : 0.0  ;
1371         Qb         = - (here->HSMHV2_qg + here->HSMHV2_qd + here->HSMHV2_qs) ;
1372         dQb_dVds   = - (here->HSMHV2_dQb_dVdsi + here->HSMHV2_dQb_dVgsi + here->HSMHV2_dQb_dVbsi) ;
1373         dQb_dVgs   =   here->HSMHV2_dQb_dVgsi ;
1374         dQb_dVbs   =   here->HSMHV2_dQb_dVbsi ;
1375         dQb_dT     =   (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQb_dTi : 0.0  ;
1376         Qfd        =   here->HSMHV2_qsp ;
1377         dQfd_dVdse = - (here->HSMHV2_dqsp_dVdse + here->HSMHV2_dqsp_dVgse + here->HSMHV2_dqsp_dVbse) ;
1378         dQfd_dVgse =   here->HSMHV2_dqsp_dVgse ;
1379         dQfd_dVbse =   here->HSMHV2_dqsp_dVbse ;
1380         dQfd_dT    =   (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dqsp_dTi : 0.0  ;
1381         Qfs        =   here->HSMHV2_qdp ;
1382         dQfs_dVdse = - (here->HSMHV2_dqdp_dVdse + here->HSMHV2_dqdp_dVgse + here->HSMHV2_dqdp_dVbse) ;
1383         dQfs_dVgse =   here->HSMHV2_dqdp_dVgse ;
1384         dQfs_dVbse =   here->HSMHV2_dqdp_dVbse ;
1385         dQfs_dT    =   (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dqdp_dTi : 0.0  ;
1386 
1387         Qdext        = here->HSMHV2_qsext ;
1388         dQdext_dVdse = - (here->HSMHV2_dQsext_dVdse + here->HSMHV2_dQsext_dVgse + here->HSMHV2_dQsext_dVbse);
1389         dQdext_dVgse = here->HSMHV2_dQsext_dVgse ;
1390         dQdext_dVbse = here->HSMHV2_dQsext_dVbse ;
1391         dQdext_dT    = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQsext_dTi : 0.0  ;
1392         Qgext        = here->HSMHV2_qgext ;
1393         dQgext_dVdse = - (here->HSMHV2_dQgext_dVdse + here->HSMHV2_dQgext_dVgse + here->HSMHV2_dQgext_dVbse);
1394         dQgext_dVgse = here->HSMHV2_dQgext_dVgse ;
1395         dQgext_dVbse = here->HSMHV2_dQgext_dVbse ;
1396         dQgext_dT    = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQgext_dTi : 0.0  ;
1397         Qsext        = here->HSMHV2_qdext ;
1398         dQsext_dVdse = - (here->HSMHV2_dQdext_dVdse + here->HSMHV2_dQdext_dVgse + here->HSMHV2_dQdext_dVbse);
1399         dQsext_dVgse = here->HSMHV2_dQdext_dVgse ;
1400         dQsext_dVbse = here->HSMHV2_dQdext_dVbse ;
1401         dQsext_dT    = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQdext_dTi : 0.0  ;
1402         Qbext        = - (here->HSMHV2_qgext + here->HSMHV2_qdext + here->HSMHV2_qsext) ;
1403         dQbext_dVdse = - (here->HSMHV2_dQbext_dVdse + here->HSMHV2_dQbext_dVgse + here->HSMHV2_dQbext_dVbse);
1404         dQbext_dVgse = here->HSMHV2_dQbext_dVgse ;
1405         dQbext_dVbse = here->HSMHV2_dQbext_dVbse ;
1406         dQbext_dT    = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dQbext_dTi : 0.0  ;
1407         Isub         = 0.0 ;
1408         dIsub_dVds   = 0.0 ;
1409         dIsub_dVgs   = 0.0 ;
1410         dIsub_dVbs   = 0.0 ;
1411         dIsub_dT     = 0.0 ;
1412         Isubs        =   here->HSMHV2_isub ;
1413         dIsubs_dVds  = - (here->HSMHV2_dIsub_dVdsi + here->HSMHV2_dIsub_dVgsi + here->HSMHV2_dIsub_dVbsi) ;
1414         dIsubs_dVgs  =   here->HSMHV2_dIsub_dVgsi ;
1415         dIsubs_dVbs  =   here->HSMHV2_dIsub_dVbsi ;
1416         dIsubs_dT    =   (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIsub_dTi : 0.0 ;
1417         IsubLD         = 0.0 ;
1418         dIsubLD_dVds   = 0.0 ;
1419         dIsubLD_dVgs   = 0.0 ;
1420         dIsubLD_dVbs   = 0.0 ;
1421         dIsubLD_dT     = 0.0 ;
1422         dIsubLD_dVddp  = 0.0 ;
1423         IsubLDs        =   here->HSMHV2_isubld ;
1424         dIsubLDs_dVds  = - (here->HSMHV2_dIsubLD_dVdsi + here->HSMHV2_dIsubLD_dVgsi + here->HSMHV2_dIsubLD_dVbsi) ;
1425         dIsubLDs_dVgs  =   here->HSMHV2_dIsubLD_dVgsi ;
1426         dIsubLDs_dVbs  =   here->HSMHV2_dIsubLD_dVbsi ;
1427         dIsubLDs_dT    =   (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIsubLD_dTi : 0.0 ;
1428         dIsubLDs_dVddp = - here->HSMHV2_dIsubLD_dVddp ;
1429         IdsIBPC         = 0.0 ;
1430         dIdsIBPC_dVds   = 0.0 ;
1431         dIdsIBPC_dVgs   = 0.0 ;
1432         dIdsIBPC_dVbs   = 0.0 ;
1433         dIdsIBPC_dT     = 0.0 ;
1434         dIdsIBPC_dVddp  = 0.0 ;
1435         IdsIBPCs        =   here->HSMHV2_idsibpc ;
1436         dIdsIBPCs_dVds  = - (here->HSMHV2_dIdsIBPC_dVdsi + here->HSMHV2_dIdsIBPC_dVgsi + here->HSMHV2_dIdsIBPC_dVbsi) ;
1437         dIdsIBPCs_dVgs  =   here->HSMHV2_dIdsIBPC_dVgsi ;
1438         dIdsIBPCs_dVbs  =   here->HSMHV2_dIdsIBPC_dVbsi ;
1439         dIdsIBPCs_dT    =   (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIdsIBPC_dTi : 0.0 ;
1440         dIdsIBPCs_dVddp = - here->HSMHV2_dIdsIBPC_dVddp ;
1441         Igidl        =   here->HSMHV2_igisl ;
1442         dIgidl_dVds  = - (here->HSMHV2_dIgisl_dVdsi + here->HSMHV2_dIgisl_dVgsi + here->HSMHV2_dIgisl_dVbsi) ;
1443         dIgidl_dVgs  =   here->HSMHV2_dIgisl_dVgsi ;
1444         dIgidl_dVbs  =   here->HSMHV2_dIgisl_dVbsi ;
1445         dIgidl_dT    =   (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgisl_dTi : 0.0  ;
1446         Igisl        =   here->HSMHV2_igidl ;
1447         dIgisl_dVds  = - (here->HSMHV2_dIgidl_dVdsi + here->HSMHV2_dIgidl_dVgsi + here->HSMHV2_dIgidl_dVbsi) ;
1448         dIgisl_dVgs  =   here->HSMHV2_dIgidl_dVgsi ;
1449         dIgisl_dVbs  =   here->HSMHV2_dIgidl_dVbsi ;
1450         dIgisl_dT    =   (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgidl_dTi : 0.0  ;
1451         /* note: here->HSMHV2_igd and here->HSMHV2_igs are already subjected to mode handling,
1452            while the following derivatives here->HSMHV2_dIgd_dVdsi, ... are not! */
1453         Igd          =   here->HSMHV2_igd ;
1454         dIgd_dVd   = - (here->HSMHV2_dIgs_dVdsi + here->HSMHV2_dIgs_dVgsi + here->HSMHV2_dIgs_dVbsi) ;
1455         dIgd_dVg   =   here->HSMHV2_dIgs_dVgsi ;
1456         dIgd_dVb   =   here->HSMHV2_dIgs_dVbsi ;
1457         dIgd_dT      =   (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgs_dTi : 0.0  ;
1458         Igs          =   here->HSMHV2_igs ;
1459         dIgs_dVd   = - (here->HSMHV2_dIgd_dVdsi + here->HSMHV2_dIgd_dVgsi + here->HSMHV2_dIgd_dVbsi) ;
1460         dIgs_dVg   =   here->HSMHV2_dIgd_dVgsi ;
1461         dIgs_dVb   =   here->HSMHV2_dIgd_dVbsi ;
1462         dIgs_dT      =   (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgd_dTi : 0.0  ;
1463         Igb          =   here->HSMHV2_igb ;
1464         dIgb_dVd   = - (here->HSMHV2_dIgb_dVdsi + here->HSMHV2_dIgb_dVgsi + here->HSMHV2_dIgb_dVbsi) ;
1465         dIgb_dVg   =   here->HSMHV2_dIgb_dVgsi ;
1466         dIgb_dVb   =   here->HSMHV2_dIgb_dVbsi ;
1467         dIgb_dT      =   (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_dIgb_dTi : 0.0  ;
1468 
1469         /*---------------------------------------------------*
1470          * Junction diode.
1471          *-----------------*/
1472         Ibd = here->HSMHV2_ibd ;
1473         Gbd = here->HSMHV2_gbd ;
1474         Gbdt = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_gbdT : 0.0 ;
1475 
1476         /* Qbd = here->HSMHV2_qbd ; */
1477         Qbd = *(ckt->CKTstate0 + here->HSMHV2qbd) ;
1478         Cbd = here->HSMHV2_capbd ;
1479         Cbdt = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_gcbdT : 0.0 ;
1480 
1481         Ibs = here->HSMHV2_ibs ;
1482         Gbs = here->HSMHV2_gbs ;
1483         Gbst = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_gbsT : 0.0 ;
1484 
1485         /* Qbs = here->HSMHV2_qbs ; */
1486         Qbs = *(ckt->CKTstate0 + here->HSMHV2qbs) ;
1487         Cbs = here->HSMHV2_capbs ;
1488         Cbst = (here->HSMHV2_coselfheat > 0) ? here->HSMHV2_gcbsT : 0.0 ;
1489 
1490         if (flg_nqs) {
1491           tau         =   here->HSMHV2_tau       ;
1492           dtau_dVds   = -(here->HSMHV2_tau_dVdsi + here->HSMHV2_tau_dVgsi + here->HSMHV2_tau_dVbsi) ;
1493           dtau_dVgs   =   here->HSMHV2_tau_dVgsi ;
1494           dtau_dVbs   =   here->HSMHV2_tau_dVbsi ;
1495           dtau_dT     =   here->HSMHV2_tau_dTi   ;
1496           taub        =   here->HSMHV2_taub      ;
1497           dtaub_dVds  = -(here->HSMHV2_taub_dVdsi + here->HSMHV2_taub_dVgsi + here->HSMHV2_taub_dVbsi);
1498           dtaub_dVgs  =   here->HSMHV2_taub_dVgsi ;
1499           dtaub_dVbs  =   here->HSMHV2_taub_dVbsi ;
1500           dtaub_dT    =   here->HSMHV2_taub_dTi   ;
1501           Qdrat       =   1.0 - here->HSMHV2_Xd         ;
1502           dQdrat_dVds = +(here->HSMHV2_Xd_dVdsi + here->HSMHV2_Xd_dVgsi + here->HSMHV2_Xd_dVbsi) ;
1503           dQdrat_dVgs = - here->HSMHV2_Xd_dVgsi   ;
1504           dQdrat_dVbs = - here->HSMHV2_Xd_dVbsi   ;
1505           dQdrat_dT   = - here->HSMHV2_Xd_dTi     ;
1506           Qi          =   here->HSMHV2_Qi         ;
1507           dQi_dVds    = -(here->HSMHV2_Qi_dVdsi + here->HSMHV2_Qi_dVgsi + here->HSMHV2_Qi_dVbsi) ;
1508           dQi_dVgs    =   here->HSMHV2_Qi_dVgsi   ;
1509           dQi_dVbs    =   here->HSMHV2_Qi_dVbsi   ;
1510           dQi_dT      =   here->HSMHV2_Qi_dTi     ;
1511           Qbulk       =   here->HSMHV2_Qbulk       ;
1512           dQbulk_dVds = -(here->HSMHV2_Qbulk_dVdsi + here->HSMHV2_Qbulk_dVgsi + here->HSMHV2_Qbulk_dVbsi) ;
1513           dQbulk_dVgs =   here->HSMHV2_Qbulk_dVgsi ;
1514           dQbulk_dVbs =   here->HSMHV2_Qbulk_dVbsi ;
1515           dQbulk_dT   =   here->HSMHV2_Qbulk_dTi   ;
1516         }
1517       } /* end of reverse mode */
1518 
1519       if (here->HSMHV2_coselfheat > 0) {
1520         if (pParam->HSMHV2_rth > C_RTH_MIN) {
1521           Gth = 1.0/pParam->HSMHV2_rth ;
1522         } else {
1523           Gth = 1.0/C_RTH_MIN ;
1524         }
1525         Ith         = Gth * deltemp ;
1526         dIth_dT     = Gth ;
1527         Cth         = pParam->HSMHV2_cth ;
1528         Qth         = Cth * deltemp ;
1529         /*     P = Ids * (Vdsi + param * ( Vdse - Vdsi)) */
1530         /*       = Ids * Veffpower                       */
1531         if ( vds * (vdse - vds) >= 0.0) {
1532           if ( pParam->HSMHV2_powrat == 1.0 ) {
1533             Veffpower        = vdse ;
1534             dVeffpower_dVds  = 0.0 ;
1535             dVeffpower_dVdse = 1.0 ;
1536           } else {
1537             Veffpower        = vds + here->HSMHV2_powratio * (vdse - vds) ;
1538             dVeffpower_dVds  = (1.0 - here->HSMHV2_powratio) ;
1539             dVeffpower_dVdse = here->HSMHV2_powratio ;
1540           }
1541         } else {
1542           Veffpower        = vds ;
1543           dVeffpower_dVds  = 1.0 ;
1544           dVeffpower_dVdse = 0.0 ;
1545         }
1546         P           = Ids  * Veffpower ;
1547         dP_dVds     = gds  * Veffpower + Ids * dVeffpower_dVds;
1548         dP_dVgs     = gm   * Veffpower ;
1549         dP_dVbs     = gmbs * Veffpower ;
1550         dP_dT       = gmT  * Veffpower ;
1551         dP_dVdse    = gds_ext  * Veffpower + Ids * dVeffpower_dVdse ;
1552         dP_dVgse    = gm_ext   * Veffpower ;
1553         dP_dVbse    = gmbs_ext * Veffpower ;
1554 
1555         /* Clamping the maximum rise tempaerarure (SHEMAX) */
1556         T1 = model->HSMHV2_shemax * Gth ;
1557         Fn_SU( T2 , P , T1 , SHE_MAX_dlt * Gth , T0 ) ;
1558         P = T2 ;
1559         dP_dVds     = T0 * dP_dVds ;
1560         dP_dVgs     = T0 * dP_dVgs ;
1561         dP_dVbs     = T0 * dP_dVbs ;
1562         dP_dT       = T0 * dP_dT ;
1563         dP_dVdse    = T0 * dP_dVdse ;
1564         dP_dVgse    = T0 * dP_dVgse ;
1565         dP_dVbse    = T0 * dP_dVbse ;
1566 
1567       } else {
1568         Gth         = 0.0 ;
1569         Ith         = 0.0 ;
1570         dIth_dT     = 0.0 ;
1571         Cth         = 0.0 ;
1572         Qth         = 0.0 ;
1573         P           = 0.0 ;
1574         dP_dVds     = 0.0 ;
1575         dP_dVgs     = 0.0 ;
1576         dP_dVbs     = 0.0 ;
1577         dP_dT       = 0.0 ;
1578         dP_dVdse    = 0.0 ;
1579         dP_dVgse    = 0.0 ;
1580         dP_dVbse    = 0.0 ;
1581       }
1582 
1583       /* in case of nqs: construct static contributions to the nqs equations (Iqi_nqs, Iqb_nqs)       */
1584       /*   and nqs charge contributions to inner drain, gate and source node (Qd_nqs, Qg_nqs, Qs_nqs) */
1585 
1586       if (flg_nqs) {
1587         /* .. tau, taub must be > 0 */
1588         if (tau < 1.0e-18) {
1589           tau = 1.e-18 ;
1590           dtau_dVds = dtau_dVgs = dtau_dVbs = dtau_dT = 0.0 ;
1591         }
1592         if (taub < 1.0e-18) {
1593           taub = 1.0e-18 ;
1594           dtaub_dVds = dtaub_dVgs = dtaub_dVbs = dtaub_dT = 0.0 ;
1595         }
1596 
1597         Iqi_nqs          = (Qi_nqs - Qi) / tau ;
1598         dIqi_nqs_dVds    = - (dQi_dVds + Iqi_nqs * dtau_dVds) / tau ;
1599         dIqi_nqs_dVgs    = - (dQi_dVgs + Iqi_nqs * dtau_dVgs) / tau ;
1600         dIqi_nqs_dVbs    = - (dQi_dVbs + Iqi_nqs * dtau_dVbs) / tau ;
1601         dIqi_nqs_dT      = - (dQi_dT   + Iqi_nqs * dtau_dT  ) / tau ;
1602         dIqi_nqs_dQi_nqs = 1.0 / tau ;
1603 
1604         Iqb_nqs          = (Qb_nqs - Qbulk) / taub ;
1605         dIqb_nqs_dVds    = - (dQbulk_dVds + Iqb_nqs * dtaub_dVds) / taub ;
1606         dIqb_nqs_dVgs    = - (dQbulk_dVgs + Iqb_nqs * dtaub_dVgs) / taub ;
1607         dIqb_nqs_dVbs    = - (dQbulk_dVbs + Iqb_nqs * dtaub_dVbs) / taub ;
1608         dIqb_nqs_dT      = - (dQbulk_dT   + Iqb_nqs * dtaub_dT  ) / taub ;
1609         dIqb_nqs_dQb_nqs = 1.0 / taub ;
1610 
1611         Qd_nqs           = Qi_nqs * Qdrat ;
1612         dQd_nqs_dVds     = Qi_nqs * dQdrat_dVds ;
1613         dQd_nqs_dVgs     = Qi_nqs * dQdrat_dVgs ;
1614         dQd_nqs_dVbs     = Qi_nqs * dQdrat_dVbs ;
1615         dQd_nqs_dT       = Qi_nqs * dQdrat_dT   ;
1616         dQd_nqs_dQi_nqs  = Qdrat ;
1617 
1618         Qg_nqs           = - Qi_nqs - Qb_nqs ;
1619         dQg_nqs_dQi_nqs  = - 1.0 ;
1620         dQg_nqs_dQb_nqs  = - 1.0 ;
1621 
1622         Qs_nqs           =   Qi_nqs * (1.0 - Qdrat) ;
1623         dQs_nqs_dVds     = - Qi_nqs * dQdrat_dVds ;
1624         dQs_nqs_dVgs     = - Qi_nqs * dQdrat_dVgs ;
1625         dQs_nqs_dVbs     = - Qi_nqs * dQdrat_dVbs ;
1626         dQs_nqs_dT       = - Qi_nqs * dQdrat_dT   ;
1627         dQs_nqs_dQi_nqs  =   1.0 - Qdrat ;
1628       } else {
1629         Iqi_nqs = Iqb_nqs = Qd_nqs = Qg_nqs = Qs_nqs = 0.0 ;
1630       }
1631 
1632       dIgd_dVs = - (dIgd_dVd + dIgd_dVg + dIgd_dVb) ;
1633       dIgs_dVs = - (dIgs_dVd + dIgs_dVg + dIgs_dVb) ;
1634       dIgb_dVs = - (dIgb_dVd + dIgb_dVg + dIgb_dVb) ;
1635 
1636      /*---------------------------------------------------*
1637       * External Resistances
1638       *-----------------*/
1639       if(model->HSMHV2_corsrd == 1 || model->HSMHV2_corsrd == 3 || model->HSMHV2_cordrift == 1 ) {
1640         if(Rd > 0){
1641           GD = 1.0/Rd;
1642           GD_dVgs   = - dRd_dVgs   /Rd/Rd;
1643           GD_dVds   = - dRd_dVds   /Rd/Rd;
1644           GD_dVddp  = - dRd_dVddp  /Rd/Rd;
1645           GD_dVbs   = - dRd_dVbs   /Rd/Rd;
1646           GD_dVsubs = - dRd_dVsubs /Rd/Rd;
1647           GD_dT     = - dRd_dT     /Rd/Rd;
1648           GD_dVgse  = - dRd_dVgse  /Rd/Rd;
1649           GD_dVdse  = - dRd_dVdse  /Rd/Rd;
1650           GD_dVbse  = - dRd_dVbse  /Rd/Rd;
1651         }else{
1652           GD=0.0;
1653           GD_dVgs=0.0;
1654           GD_dVds=0.0;
1655           GD_dVddp = 0.0;
1656           GD_dVbs=0.0;
1657           GD_dVsubs=0.0;
1658           GD_dT  =0.0;
1659           GD_dVgse  =0.0;
1660           GD_dVdse  =0.0;
1661           GD_dVbse  =0.0;
1662         }
1663         if(Rs > 0){
1664           GS = 1.0/Rs;
1665           GS_dVgs = - dRs_dVgse /Rs/Rs;
1666           GS_dVds = - dRs_dVdse /Rs/Rs;
1667           GS_dVbs = - dRs_dVbse /Rs/Rs;
1668           GS_dVsubs = - dRs_dVsubs /Rs/Rs;
1669           GS_dT = - dRs_dT /Rs/Rs;
1670         }else{
1671           GS=0.0;
1672           GS_dVgs=0.0;
1673           GS_dVds=0.0;
1674           GS_dVbs=0.0;
1675           GS_dVsubs=0.0;
1676           GS_dT  =0.0;
1677         }
1678       }
1679       Iddp        = GD        * vddp;
1680       dIddp_dVddp = GD_dVddp  * vddp + GD ;
1681       dIddp_dVdse = GD_dVdse  * vddp;
1682       dIddp_dVgse = GD_dVgse  * vddp;
1683       dIddp_dVbse = GD_dVbse  * vddp;
1684       dIddp_dVsubs= GD_dVsubs * vddp;
1685       dIddp_dT    = GD_dT     * vddp;
1686       dIddp_dVds  = GD_dVds   * vddp;
1687       dIddp_dVgs  = GD_dVgs   * vddp;
1688       dIddp_dVbs  = GD_dVbs   * vddp;
1689 
1690       Issp        = GS * vssp;
1691       dIssp_dVssp = GS;
1692       dIssp_dVdse = GS_dVds * vssp ;
1693       dIssp_dVgse = GS_dVgs * vssp;
1694       dIssp_dVbse = GS_dVbs * vssp;
1695       dIssp_dVsubs= GS_dVsubs * vssp;
1696       dIssp_dT    = GS_dT * vssp;
1697 
1698       if( model->HSMHV2_corg > 0.0 ){
1699         GG = here->HSMHV2_grg ;
1700       }else{
1701         GG = 0.0 ;
1702       }
1703       Iggp        = GG * vggp;
1704       dIggp_dVggp = GG;
1705 
1706       if(model->HSMHV2_corbnet == 1 && here->HSMHV2_rbpb > 0.0 ){
1707         GRBPB = here->HSMHV2_grbpb ;
1708       }else{
1709         GRBPB = 0.0 ;
1710       }
1711       Ibpb        = GRBPB * vbpb;
1712       dIbpb_dVbpb = GRBPB;
1713 
1714       if(model->HSMHV2_corbnet == 1 && here->HSMHV2_rbpd > 0.0 ){
1715         GRBPD = here->HSMHV2_grbpd ;
1716       }else{
1717         GRBPD = 0.0 ;
1718       }
1719       Ibpdb         = GRBPD * vbpdb;
1720       dIbpdb_dVbpdb = GRBPD;
1721 
1722       if(model->HSMHV2_corbnet == 1 && here->HSMHV2_rbps > 0.0 ){
1723         GRBPS = here->HSMHV2_grbps ;
1724       }else{
1725         GRBPS = 0.0 ;
1726       }
1727       Ibpsb         = GRBPS * vbpsb;
1728       dIbpsb_dVbpsb = GRBPS;
1729 
1730       /* printf("HSMHV2_load: ByPass=%d\n",ByPass) ; */
1731 
1732       if (!ByPass) { /* no convergence check in case of Bypass */
1733         /*
1734          *  check convergence
1735          */
1736         isConv = 1;
1737         if ( (here->HSMHV2_off == 0) || !(ckt->CKTmode & MODEINITFIX) ) {
1738           if (Check == 1) {
1739             ckt->CKTnoncon++;
1740             isConv = 0;
1741 #ifndef NEWCONV
1742           } else {
1743           /* convergence check for branch currents is done in function HSMHV2convTest */
1744 #endif /* NEWCONV */
1745           }
1746         }
1747 
1748         *(ckt->CKTstate0 + here->HSMHV2vbs) = vbs;
1749         *(ckt->CKTstate0 + here->HSMHV2vbd) = vbd;
1750         *(ckt->CKTstate0 + here->HSMHV2vgs) = vgs;
1751         *(ckt->CKTstate0 + here->HSMHV2vds) = vds;
1752         *(ckt->CKTstate0 + here->HSMHV2vsbs) = vsbs;
1753         *(ckt->CKTstate0 + here->HSMHV2vdbs) = vdbs;
1754         *(ckt->CKTstate0 + here->HSMHV2vdbd) = vdbd;
1755         *(ckt->CKTstate0 + here->HSMHV2vges) = vges;
1756         *(ckt->CKTstate0 + here->HSMHV2vsubs) = vsubs;
1757         *(ckt->CKTstate0 + here->HSMHV2deltemp) = deltemp;
1758         *(ckt->CKTstate0 + here->HSMHV2vdse) = vdse;
1759         *(ckt->CKTstate0 + here->HSMHV2vgse) = vgse;
1760         *(ckt->CKTstate0 + here->HSMHV2vbse) = vbse;
1761         if ( flg_nqs ) {
1762           *(ckt->CKTstate0 + here->HSMHV2qi_nqs) = Qi_nqs;
1763           *(ckt->CKTstate0 + here->HSMHV2qb_nqs) = Qb_nqs;
1764         }
1765         /* printf("HSMHV2_load: (into state0) vds.. = %e %e %e %e %e %e\n",
1766                                                vds,vgs,vbs,vdse,vgse,vbse); */
1767 
1768         if ((ckt->CKTmode & MODEDC) &&
1769           !(ckt->CKTmode & MODEINITFIX) && !(ckt->CKTmode & MODEINITJCT))
1770           showPhysVal = 1;
1771         if (model->HSMHV2_show_Given && showPhysVal && isConv) {
1772           static int isFirst = 1;
1773           if (vds != vds_pre)
1774             ShowPhysVals(here, model, isFirst, vds_pre, vgs, vbs, vgd, vbd, vgb);
1775           else
1776             ShowPhysVals(here, model, isFirst, vds, vgs, vbs, vgd, vbd, vgb);
1777           if (isFirst) isFirst = 0;
1778         }
1779       }
1780 
1781 #include "hsmhv2ld_info_eval.h"
1782 
1783       /* For standard Newton method (SPICE_rhs == 0):                          */
1784       /*   if currents (and charges) are limited -> extrapolate onto x-values  */
1785       /* in SPICE mode (SPICE_rhs == 1):                                       */
1786       /*   extrapolate onto x = 0 (-> rhs_eq)                                  */
1787       /*                                                                       */
1788       /* note that                                                             */
1789       /* the charge extrapolation is replaced by extrapolation of displacement */
1790       /* currents, see below                                                   */
1791 
1792       /* ...... just for easier handling: collect node voltages in vector x:   */
1793       if (!SPICE_rhs) {
1794         x[dNode]      = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2dNode));
1795         x[dNodePrime] = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2dNodePrime));
1796         x[gNode]      = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2gNode));
1797         x[gNodePrime] = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2gNodePrime));
1798         x[sNode]      = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2sNode));
1799         x[sNodePrime] = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2sNodePrime));
1800         x[bNodePrime] = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2bNodePrime));
1801         x[bNode]      = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2bNode));
1802         x[dbNode]     = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2dbNode));
1803         x[sbNode]     = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2sbNode));
1804         if (flg_subNode > 0)
1805           x[subNode]  = model->HSMHV2_type *( *(ckt->CKTrhsOld+here->HSMHV2subNode)); /* previous vsub */
1806         else
1807           x[subNode]  = 0.0;
1808         if (here->HSMHV2_coselfheat > 0)
1809           x[tempNode] =  *(ckt->CKTrhsOld+here->HSMHV2tempNode);
1810         else
1811           x[tempNode] = 0.0;
1812         if ( flg_nqs ) {
1813           x[qiNode] =  *(ckt->CKTrhsOld+here->HSMHV2qiNode);
1814           x[qbNode] =  *(ckt->CKTrhsOld+here->HSMHV2qbNode);
1815         } else {
1816           x[qiNode] = 0.0;
1817           x[qbNode] = 0.0;
1818         }
1819       }
1820 
1821       delvgs = (x[gNodePrime] - x[sNodePrime]) - vgs;
1822       delvds = (x[dNodePrime] - x[sNodePrime]) - vds;
1823       delvbs = (x[bNodePrime] - x[sNodePrime]) - vbs;
1824       deldeltemp = x[tempNode] - deltemp;
1825 
1826       if (delvgs || delvds || delvbs ||deldeltemp) {
1827         Ids  += gm         *delvgs + gds        *delvds + gmbs       *delvbs + gmT      *deldeltemp ;
1828         Isub += dIsub_dVgs *delvgs + dIsub_dVds *delvds + dIsub_dVbs *delvbs + dIsub_dT *deldeltemp ;
1829         Isubs+= dIsubs_dVgs*delvgs + dIsubs_dVds*delvds + dIsubs_dVbs*delvbs + dIsubs_dT*deldeltemp ;
1830         IsubLD += dIsubLD_dVgs *delvgs + dIsubLD_dVds *delvds + dIsubLD_dVbs *delvbs + dIsubLD_dT *deldeltemp ;
1831         IsubLDs+= dIsubLDs_dVgs*delvgs + dIsubLDs_dVds*delvds + dIsubLDs_dVbs*delvbs + dIsubLDs_dT*deldeltemp ;
1832         IdsIBPC += dIdsIBPC_dVgs *delvgs + dIdsIBPC_dVds *delvds + dIdsIBPC_dVbs *delvbs + dIdsIBPC_dT *deldeltemp ;
1833         IdsIBPCs+= dIdsIBPCs_dVgs*delvgs + dIdsIBPCs_dVds*delvds + dIdsIBPCs_dVbs*delvbs + dIdsIBPCs_dT*deldeltemp ;
1834         Igd  += dIgd_dVg   *delvgs + dIgd_dVd   *delvds + dIgd_dVb   *delvbs + dIgd_dT  *deldeltemp ;
1835         Igs  += dIgs_dVg   *delvgs + dIgs_dVd   *delvds + dIgs_dVb   *delvbs + dIgs_dT  *deldeltemp ;
1836         Igb  += dIgb_dVg   *delvgs + dIgb_dVd   *delvds + dIgb_dVb   *delvbs + dIgb_dT  *deldeltemp ;
1837         Igidl+= dIgidl_dVgs*delvgs + dIgidl_dVds*delvds + dIgidl_dVbs*delvbs + dIgidl_dT*deldeltemp ;
1838         Igisl+= dIgisl_dVgs*delvgs + dIgisl_dVds*delvds + dIgisl_dVbs*delvbs + dIgisl_dT*deldeltemp ;
1839         P    += dP_dVgs    *delvgs + dP_dVds    *delvds + dP_dVbs    *delvbs + dP_dT    *deldeltemp ;
1840         if (flg_nqs) {
1841           Iqi_nqs += dIqi_nqs_dVgs*delvgs + dIqi_nqs_dVds*delvds + dIqi_nqs_dVbs*delvbs + dIqi_nqs_dT*deldeltemp ;
1842           Iqb_nqs += dIqb_nqs_dVgs*delvgs + dIqb_nqs_dVds*delvds + dIqb_nqs_dVbs*delvbs + dIqb_nqs_dT*deldeltemp ;
1843         }
1844       }
1845 
1846       delvgse = (x[gNodePrime] - x[sNode]) - vgse;
1847       delvdse = (x[dNode]      - x[sNode]) - vdse;
1848       delvbse = (x[bNodePrime] - x[sNode]) - vbse;
1849       if (flg_subNode > 0) delvsubs = (x[subNode] - x[sNode]) - vsubs; /* substrate bias change */
1850 
1851       if (delvgse || delvdse || delvbse ) {
1852         Ids  += gm_ext     *delvgse + gds_ext    *delvdse + gmbs_ext   *delvbse ;
1853         P    += dP_dVgse   *delvgse + dP_dVdse   *delvdse + dP_dVbse   *delvbse ;
1854         Iddp += dIddp_dVgse*delvgse + dIddp_dVdse*delvdse + dIddp_dVbse*delvbse ;
1855         Issp += dIssp_dVgse*delvgse + dIssp_dVdse*delvdse + dIssp_dVbse*delvbse ;
1856       }
1857 
1858       if (delvsubs) {
1859         Iddp += dIddp_dVsubs*delvsubs ;
1860         Issp += dIssp_dVsubs*delvsubs ;
1861       }
1862 
1863       if (deldeltemp) {
1864         Iddp += dIddp_dT*deldeltemp ;
1865         Issp += dIssp_dT*deldeltemp ;
1866         Ith  += dIth_dT *deldeltemp ;
1867       }
1868 
1869       delvdbd = (x[dbNode] - x[dNode]) - vbd_jct ;
1870       if (delvdbd || deldeltemp) {
1871         Ibd += Gbd*delvdbd + Gbdt*deldeltemp ;
1872       }
1873 
1874       delvsbs = (x[sbNode] - x[sNode]) - vbs_jct ;
1875       if (delvsbs || deldeltemp) {
1876         Ibs += Gbs*delvsbs + Gbst*deldeltemp ;
1877       }
1878 
1879       delvddp = (x[dNode] - x[dNodePrime]) - vddp ;
1880       if (delvddp) {
1881         Iddp += dIddp_dVddp * delvddp ;
1882         IsubLD  += dIsubLD_dVddp   * delvddp ;
1883         IsubLDs += dIsubLDs_dVddp  * delvddp ;
1884         IdsIBPC += dIdsIBPC_dVddp  * delvddp ;
1885         IdsIBPCs+= dIdsIBPCs_dVddp * delvddp ;
1886       }
1887 
1888       delvds = (x[dNodePrime] - x[sNodePrime]) - vds ;
1889       if (delvds) {
1890         Iddp += dIddp_dVds * delvds ;
1891       }
1892 
1893       delvgs = (x[gNodePrime] - x[sNodePrime]) - vgs ;
1894       if (delvgs) {
1895         Iddp += dIddp_dVgs * delvgs ;
1896       }
1897 
1898       delvbs = (x[bNodePrime] - x[sNodePrime]) - vbs ;
1899       if (delvbs) {
1900         Iddp += dIddp_dVbs * delvbs ;
1901       }
1902 
1903       delvssp = (x[sNode] - x[sNodePrime]) - vssp ;
1904       if (delvssp) {
1905         Issp += dIssp_dVssp * delvssp ;
1906       }
1907 
1908       delvggp = (x[gNode] - x[gNodePrime]) - vggp ;
1909       if (delvggp) {
1910         Iggp += dIggp_dVggp * delvggp ;
1911       }
1912 
1913       delvbpb = (x[bNodePrime] - x[bNode]) - vbpb ;
1914       if (delvbpb) {
1915         Ibpb += dIbpb_dVbpb * delvbpb ;
1916       }
1917 
1918       delvbpdb = (x[bNodePrime] - x[dbNode]) - vbpdb ;
1919       if (delvbpdb) {
1920         Ibpdb += dIbpdb_dVbpdb * delvbpdb ;
1921       }
1922 
1923       delvbpsb = (x[bNodePrime] - x[sbNode]) - vbpsb ;
1924       if (delvbpsb) {
1925         Ibpsb += dIbpsb_dVbpsb * delvbpsb ;
1926       }
1927 
1928       if (flg_nqs) {
1929         delQi_nqs = x[qiNode] - Qi_nqs ;
1930         if (delQi_nqs) {
1931           Iqi_nqs += dIqi_nqs_dQi_nqs * delQi_nqs ;
1932         }
1933         delQb_nqs = x[qbNode] - Qb_nqs ;
1934         if (delQb_nqs) {
1935           Iqb_nqs += dIqb_nqs_dQb_nqs * delQb_nqs ;
1936         }
1937       }
1938 
1939 
1940       /* Assemble currents into nodes */
1941       /* ... static part              */
1942 
1943 
1944       /*  drain node  */
1945       i_d = Iddp - Ibd + IsubLD + IdsIBPC - IdsIBPCs ;
1946       /*  intrinsic drain node */
1947       i_dP = -Iddp + Ids + Isub + Igidl - Igd ;
1948       /*  gate node */
1949       i_g = Iggp ;
1950       /*  intrinsic gate node */
1951       i_gP = - Iggp + Igd + Igs + Igb ;
1952       /*  source node  */
1953       i_s = Issp - Ibs + IsubLDs - IdsIBPC + IdsIBPCs ;
1954       /*  intrinsic source node  */
1955       i_sP = - Issp - Ids + Isubs + Igisl - Igs ;
1956       /*  intrinsic bulk node */
1957       i_bP = - Isub - Isubs - IsubLD - IsubLDs- Igidl -Igb - Igisl  + Ibpdb + Ibpb + Ibpsb ;
1958       /*  base node */
1959       i_b = - Ibpb ;
1960       /*  drain bulk node  */
1961       i_db = Ibd - Ibpdb ;
1962       /*  source bulk node  */
1963       i_sb = Ibs - Ibpsb ;
1964       /*  temp node  */
1965       if (here->HSMHV2_coselfheat > 0){
1966         i_t = Ith - P ;
1967       } else {
1968         i_t = 0.0;
1969       }
1970       /* nqs equations */
1971       i_qi = Iqi_nqs ;
1972       i_qb = Iqb_nqs ;
1973 
1974       for (i = 0; i < XDIM; i++) {
1975         ydc_d[i] = ydc_dP[i] = ydc_g[i] = ydc_gP[i] = ydc_s[i] = ydc_sP[i] = ydc_bP[i] = ydc_b[i]
1976         = ydc_db[i] = ydc_sb[i] = ydc_t[i] = 0.0;
1977       }
1978       if (flg_nqs) {
1979         for (i = 0; i < XDIM; i++) {
1980            ydc_qi[i] = ydc_qb[i] = 0.0;
1981         }
1982       }
1983 
1984       /*  drain node  */
1985       ydc_d[dNode] = dIddp_dVddp + dIddp_dVdse + Gbd + dIsubLD_dVddp + dIdsIBPC_dVddp - dIdsIBPCs_dVddp ;
1986       ydc_d[dNodePrime] = -dIddp_dVddp + dIddp_dVds + dIsubLD_dVds  + dIdsIBPC_dVds - dIdsIBPCs_dVds - dIsubLD_dVddp  - dIdsIBPC_dVddp + dIdsIBPCs_dVddp ;
1987       /* ydc_d[gNode] = 0.0 ; */
1988       ydc_d[gNodePrime] = dIddp_dVgse + dIddp_dVgs + dIsubLD_dVgs  + dIdsIBPC_dVgs - dIdsIBPCs_dVgs ;
1989       ydc_d[sNode] = - ( dIddp_dVdse + dIddp_dVgse + dIddp_dVbse ) - dIddp_dVsubs ;
1990       ydc_d[sNodePrime] =  - dIsubLD_dVds - dIsubLD_dVgs - dIsubLD_dVbs  - dIdsIBPC_dVds  - dIdsIBPC_dVgs  - dIdsIBPC_dVbs  - (- dIdsIBPCs_dVds  - dIdsIBPCs_dVgs  - dIdsIBPCs_dVbs ) - ( dIddp_dVds + dIddp_dVgs + dIddp_dVbs ) ;
1991       ydc_d[bNodePrime] =  dIddp_dVbse + dIddp_dVbs + dIsubLD_dVbs  + dIdsIBPC_dVbs - dIdsIBPCs_dVbs ;
1992       /* ydc_d[bNode] = 0.0 ; */
1993       ydc_d[dbNode] = - Gbd ;
1994       /* ydc_d[sbNode] = 0.0 ; */
1995       ydc_d[subNode] = dIddp_dVsubs ;
1996       ydc_d[tempNode] = dIddp_dT - Gbdt + dIsubLD_dT  + dIdsIBPC_dT - dIdsIBPCs_dT ;
1997 
1998       /*  intrinsic drain node  */
1999       ydc_dP[dNode] = - (dIddp_dVddp + dIddp_dVdse) + gds_ext ;
2000       ydc_dP[dNodePrime] = dIddp_dVddp - dIddp_dVds + gds + dIsub_dVds + dIgidl_dVds - dIgd_dVd ;
2001       /* ydc_dP[gNode] = 0.0; */
2002       ydc_dP[gNodePrime] = -dIddp_dVgse - dIddp_dVgs + gm_ext
2003         + gm + dIsub_dVgs + dIgidl_dVgs - dIgd_dVg ;
2004       ydc_dP[sNode] =  dIddp_dVdse + dIddp_dVgse + dIddp_dVbse + dIddp_dVsubs + (-gds_ext -gm_ext -gmbs_ext);
2005       ydc_dP[sNodePrime] = -( gds + dIsub_dVds + dIgidl_dVds )
2006         - ( gm + dIsub_dVgs + dIgidl_dVgs )
2007         - ( gmbs + dIsub_dVbs + dIgidl_dVbs ) - dIgd_dVs
2008         + ( dIddp_dVds + dIddp_dVgs + dIddp_dVbs ) ;
2009       ydc_dP[bNodePrime] = - dIddp_dVbse - dIddp_dVbs + gmbs_ext
2010         + gmbs + dIsub_dVbs + dIgidl_dVbs - dIgd_dVb;
2011       /* ydc_dP[bNode] = 0.0; */
2012       /* ydc_dP[dbNode] = 0.0 ; */
2013       /* ydc_dP[sbNode] = 0.0 ; */
2014       ydc_dP[subNode] = - dIddp_dVsubs ;
2015       ydc_dP[tempNode] = - dIddp_dT
2016         + gmT + dIsub_dT + dIgidl_dT - dIgd_dT ;
2017 
2018       /*  gate node  */
2019       /* ydc_g[dNode] = 0.0 ; */
2020       /* ydc_g[dNodePrime] = 0.0 ; */
2021       ydc_g[gNode] = dIggp_dVggp ;
2022       ydc_g[gNodePrime] = - dIggp_dVggp ;
2023       /* ydc_g[sNode] = 0.0 ; */
2024       /* ydc_g[sNodePrime] = 0.0 ; */
2025       /* ydc_g[bNodePrime] = 0.0 ; */
2026       /* ydc_g[bNode] = 0.0 ; */
2027       /* ydc_g[dbNode] = 0.0 ; */
2028       /* ydc_g[sbNode] = 0.0 ; */
2029       /* ydc_g[tempNode] = 0.0 ; */
2030 
2031       /*  intrinsic gate node  */
2032       /* ydc_gP[dNode] = 0.0 ; */
2033       ydc_gP[dNodePrime] = dIgd_dVd + dIgs_dVd + dIgb_dVd ;
2034       ydc_gP[gNode] = - dIggp_dVggp ;
2035       ydc_gP[gNodePrime] = dIggp_dVggp + dIgd_dVg + dIgs_dVg + dIgb_dVg ;
2036       /* ydc_gP[sNode] = 0.0 ; */
2037       ydc_gP[sNodePrime] = dIgd_dVs + dIgs_dVs + dIgb_dVs ;
2038       ydc_gP[bNodePrime] = dIgd_dVb + dIgs_dVb + dIgb_dVb ;
2039       /* ydc_gP[bNode] = 0.0 ; */
2040       /* ydc_gP[dbNode] = 0.0 ; */
2041       /* ydc_gP[sbNode] = 0.0 ; */
2042       ydc_gP[tempNode] = dIgd_dT + dIgs_dT + dIgb_dT ;
2043 
2044       /*  source node */
2045       ydc_s[dNode] = dIssp_dVdse + dIsubLDs_dVddp  - dIdsIBPC_dVddp + dIdsIBPCs_dVddp ;
2046       ydc_s[dNodePrime] = dIsubLDs_dVds  - dIdsIBPC_dVds + dIdsIBPCs_dVds - dIsubLDs_dVddp  + dIdsIBPC_dVddp - dIdsIBPCs_dVddp ;
2047       /* ydc_s[gNode] = 0.0 */
2048       ydc_s[gNodePrime] = dIssp_dVgse + dIsubLDs_dVgs  - dIdsIBPC_dVgs + dIdsIBPCs_dVgs ;
2049       ydc_s[sNode] = dIssp_dVssp - ( dIssp_dVgse + dIssp_dVdse + dIssp_dVbse ) - dIssp_dVsubs + Gbs ;
2050       ydc_s[sNodePrime] = - dIssp_dVssp - dIsubLDs_dVds - dIsubLDs_dVgs - dIsubLDs_dVbs   - (- dIdsIBPC_dVds  - dIdsIBPC_dVgs  - dIdsIBPC_dVbs )  - dIdsIBPCs_dVds  - dIdsIBPCs_dVgs  - dIdsIBPCs_dVbs ;
2051       ydc_s[bNodePrime] = dIssp_dVbse + dIsubLDs_dVbs  - dIdsIBPC_dVbs + dIdsIBPCs_dVbs ;
2052       /* ydc_s[bNode] = 0.0 */
2053       /* ydc_s[dbNode] = 0.0 */
2054       ydc_s[sbNode]     = - Gbs ;
2055       ydc_s[subNode] = dIssp_dVsubs;
2056       ydc_s[tempNode] = dIssp_dT - Gbst + dIsubLDs_dT  - dIdsIBPC_dT + dIdsIBPCs_dT ;
2057 
2058       /*  intrinsic source node */
2059       ydc_sP[dNode] = - dIssp_dVdse -gds_ext ;
2060       ydc_sP[dNodePrime] = - gds + dIsubs_dVds + dIgisl_dVds - dIgs_dVd ;
2061       /* ydc_sP[gNode] = 0.0 ; */
2062       ydc_sP[gNodePrime] = -dIssp_dVgse -gm_ext
2063         - gm + dIsubs_dVgs + dIgisl_dVgs - dIgs_dVg ;
2064       ydc_sP[sNode] = - dIssp_dVssp - ( - dIssp_dVdse - dIssp_dVgse - dIssp_dVbse ) + dIssp_dVsubs +(gds_ext + gm_ext + gmbs_ext);
2065       ydc_sP[sNodePrime] = dIssp_dVssp - ( - gds + dIsubs_dVds + dIgisl_dVds )
2066         - ( - gm + dIsubs_dVgs + dIgisl_dVgs )
2067         - ( - gmbs + dIsubs_dVbs + dIgisl_dVbs ) - dIgs_dVs ;
2068       ydc_sP[bNodePrime] = -dIssp_dVbse -gmbs_ext
2069         - gmbs + dIsubs_dVbs + dIgisl_dVbs - dIgs_dVb ;
2070       /* ydc_sP[bNode] = 0.0 ; */
2071       /* ydc_sP[dbNode] = 0.0 ; */
2072       /* ydc_sP[sbNode] = 0.0 ; */
2073       ydc_sP[subNode] = - dIssp_dVsubs;
2074       ydc_sP[tempNode] = -dIssp_dT
2075               - gmT + dIsubs_dT + dIgisl_dT - dIgs_dT;
2076 
2077       /*  intrinsic bulk node */
2078       ydc_bP[dNode] = - dIsubLD_dVddp - dIsubLDs_dVddp ;
2079       ydc_bP[dNodePrime] = - dIsub_dVds - dIsubs_dVds  - dIsubLD_dVds - dIsubLDs_dVds - dIgidl_dVds - dIgb_dVd - dIgisl_dVds - ( - dIsubLD_dVddp - dIsubLDs_dVddp ) ;
2080       /* ydc_bP[gNode] = 0.0 ; */
2081       ydc_bP[gNodePrime] = - dIsub_dVgs - dIsubs_dVgs  - dIsubLD_dVgs - dIsubLDs_dVgs - dIgidl_dVgs - dIgb_dVg - dIgisl_dVgs ;
2082       /* ydc_bP[sNode] = 0.0 ;*/
2083       ydc_bP[sNodePrime] = - ( - dIsub_dVds - dIsubs_dVds - dIsubLD_dVds - dIsubLDs_dVds - dIgidl_dVds - dIgisl_dVds )
2084        - ( - dIsub_dVgs - dIsubs_dVgs - dIsubLD_dVgs - dIsubLDs_dVgs - dIgidl_dVgs - dIgisl_dVgs )
2085        - ( - dIsub_dVbs - dIsubs_dVbs - dIsubLD_dVbs - dIsubLDs_dVbs - dIgidl_dVbs - dIgisl_dVbs ) - dIgb_dVs ;
2086       ydc_bP[bNodePrime] = - dIsub_dVbs - dIsubs_dVbs  - dIsubLD_dVbs - dIsubLDs_dVbs - dIgidl_dVbs - dIgb_dVb - dIgisl_dVbs + dIbpdb_dVbpdb + dIbpb_dVbpb + dIbpsb_dVbpsb ;
2087       ydc_bP[bNode] = - dIbpb_dVbpb ;
2088       ydc_bP[dbNode] = - dIbpdb_dVbpdb ;
2089       ydc_bP[sbNode] =  - dIbpsb_dVbpsb ;
2090       ydc_bP[tempNode] = - dIsub_dT - dIsubs_dT - dIsubLD_dT - dIsubLDs_dT - dIgidl_dT - dIgb_dT - dIgisl_dT ;
2091 
2092       /*  bulk node */
2093       /* ydc_b[dNode] = 0.0 ; */
2094       /* ydc_b[dNodePrime] = 0.0 ; */
2095       /* ydc_b[gNode] = 0.0 ; */
2096       /* ydc_b[gNodePrime] = 0.0 ; */
2097       /* ydc_b[sNode] = 0.0 ; */
2098       /* ydc_b[sNodePrime] = 0.0 ; */
2099       ydc_b[bNodePrime] = - dIbpb_dVbpb ;
2100       ydc_b[bNode] = dIbpb_dVbpb ;
2101       /* ydc_b[dbNode] = 0.0 ; */
2102       /* ydc_b[sbNode] = 0.0 ; */
2103       /* ydc_b[tempNode] = 0.0 ; */
2104 
2105       /*  drain bulk node */
2106       ydc_db[dNode] = - Gbd ;
2107       /* ydc_db[dNodePrime] = 0.0 ; */
2108       /* ydc_db[gNode] = 0.0 ; */
2109       /* ydc_db[gNodePrime] = 0.0 ; */
2110       /* ydc_db[sNode] = 0.0 ; */
2111       /* ydc_db[sNodePrime] = 0.0 ; */
2112       ydc_db[bNodePrime] = - dIbpdb_dVbpdb ;
2113       /* ydc_db[bNode] = 0.0 ; */
2114       ydc_db[dbNode] = Gbd + dIbpdb_dVbpdb ;
2115       /* ydc_db[sbNode] = 0.0 ; */
2116       ydc_db[tempNode] = Gbdt ;
2117 
2118       /* source bulk node */
2119       /* ydc_sb[dNode] = 0.0 ; */
2120       /* ydc_sb[dNodePrime] = 0.0 ; */
2121       /* ydc_sb[gNode] = 0.0 ; */
2122       /* ydc_sb[gNodePrime] = 0.0 ; */
2123       ydc_sb[sNode] = - Gbs ;
2124       /* ydc_sb[sNodePrime] = 0.0 ; */
2125       ydc_sb[bNodePrime] = - dIbpsb_dVbpsb ;
2126       /* ydc_sb[bNode] = 0.0 ; */
2127       /* ydc_sb[dbNode] = 0.0 ; */
2128       ydc_sb[sbNode] = Gbs + dIbpsb_dVbpsb ;
2129       ydc_sb[tempNode] = Gbst ;
2130 
2131       /*  temp node */
2132       ydc_t[dNode] = - dP_dVdse ;
2133       ydc_t[dNodePrime] = - dP_dVds ;
2134       /* ydc_t[gNode] = 0.0 ; */
2135       ydc_t[gNodePrime] = - dP_dVgs - dP_dVgse ;
2136       ydc_t[sNode] = - ( - dP_dVdse - dP_dVgse - dP_dVbse ) ;
2137       ydc_t[sNodePrime] = - ( - dP_dVds - dP_dVgs - dP_dVbs ) ;
2138       ydc_t[bNodePrime] = - dP_dVbs - dP_dVbse ;
2139       /* ydc_t[bNode] = 0.0 ; */
2140       /* ydc_t[dbNode] = 0.0 ; */
2141       /* ydc_t[sbNode] = 0.0 ; */
2142       ydc_t[tempNode] = dIth_dT - dP_dT ;
2143 
2144       /* additional entries for flat nqs handling */
2145       if ( flg_nqs ) {
2146         ydc_qi[dNodePrime]   =   dIqi_nqs_dVds ;
2147         ydc_qi[gNodePrime]   =   dIqi_nqs_dVgs ;
2148         ydc_qi[sNodePrime]   = -(dIqi_nqs_dVds + dIqi_nqs_dVgs + dIqi_nqs_dVbs) ;
2149         ydc_qi[bNodePrime]   =   dIqi_nqs_dVbs ;
2150         ydc_qi[tempNode] =   dIqi_nqs_dT   ;
2151         ydc_qi[qiNode]   =   dIqi_nqs_dQi_nqs ;
2152         /* ydc_qi[qbNode]=   0.0 ;  */
2153         ydc_qb[dNodePrime]   =   dIqb_nqs_dVds ;
2154         ydc_qb[gNodePrime]   =   dIqb_nqs_dVgs ;
2155         ydc_qb[sNodePrime]   = -(dIqb_nqs_dVds + dIqb_nqs_dVgs + dIqb_nqs_dVbs) ;
2156         ydc_qb[bNodePrime]   =   dIqb_nqs_dVbs ;
2157         ydc_qb[tempNode] =   dIqb_nqs_dT   ;
2158         /* ydc_qb[qiNode]=   0.0 ; */
2159         ydc_qb[qbNode]   =   dIqb_nqs_dQb_nqs ;
2160       }
2161 
2162 
2163       /* Preset vectors and matrix for dynamic part */
2164 
2165       cq_d = cq_dP = cq_g = cq_gP = cq_s = cq_sP = cq_bP = cq_b = cq_db = cq_sb = cq_t = cq_qi = cq_qb = 0.0 ;
2166       for (i = 0; i < XDIM ; i++) {
2167         ydyn_d[i] = ydyn_dP[i] = ydyn_g[i] = ydyn_gP[i] = ydyn_s[i] = ydyn_sP[i] = ydyn_bP[i] = ydyn_b[i]
2168         = ydyn_db[i] = ydyn_sb[i] = ydyn_t[i] = 0.0;
2169       }
2170       if (flg_nqs) {
2171          for (i = 0; i < XDIM ; i++) {
2172           ydyn_qi[i] = ydyn_qb[i] = 0.0;
2173         }
2174       }
2175 
2176       ag0 = ckt->CKTag[0];
2177 
2178       if (ChargeComputationNeeded) { /* start handling of dynamic part */
2179 
2180         if (!ByPass) { /* loading of state vector not necessary in case of Bypass */
2181 
2182           /*  intrinsic gate node (without fringing charges) */
2183           *(ckt->CKTstate0 + here->HSMHV2qg) = Qg + Qg_nqs + Qgext;
2184 
2185           /*  intrinsic drain node */
2186           *(ckt->CKTstate0 + here->HSMHV2qd) = Qd + Qd_nqs ;
2187 
2188           /* intrinsic bulk node */
2189           *(ckt->CKTstate0 + here->HSMHV2qb) = Qb + Qb_nqs + Qbext;
2190 
2191           /*  drain bulk node */
2192           *(ckt->CKTstate0 + here->HSMHV2qbd) = Qbd ;
2193 
2194           /* source bulk node */
2195           *(ckt->CKTstate0 + here->HSMHV2qbs) = Qbs ;
2196 
2197           /* temp node */
2198           *(ckt->CKTstate0 + here->HSMHV2qth) = Qth ;
2199 
2200           /* fringing charges */
2201           *(ckt->CKTstate0 + here->HSMHV2qfd) = Qfd ;
2202           *(ckt->CKTstate0 + here->HSMHV2qfs) = Qfs ;
2203 
2204           /* external drain node */
2205           *(ckt->CKTstate0 + here->HSMHV2qdE) = Qdext;
2206 
2207           /* nqs charges Qi_nqs, Qb_nqs: already loaded above */
2208           /* if ( flg_nqs ) {                                 */
2209           /*   *(ckt->CKTstate0 + here->HSMHV2qi_nqs) = Qi_nqs; */
2210           /*   *(ckt->CKTstate0 + here->HSMHV2qb_nqs) = Qb_nqs; */
2211           /* }                                                */
2212         }
2213 
2214         /* ... assemble capacitance matrix */
2215 
2216         /* ...... drain node */
2217         ydyn_d[dNode] = dQfd_dVdse + Cbd + dQdext_dVdse ;
2218         /* ydyn_d[dNodePrime] = 0.0 ; */
2219         /* ydyn_d[gNode] = 0.0 ; */
2220         ydyn_d[gNodePrime] = dQfd_dVgse + dQdext_dVgse ;
2221         ydyn_d[sNode] = - (dQfd_dVdse + dQfd_dVgse+ dQfd_dVbse) - ( dQdext_dVdse + dQdext_dVgse + dQdext_dVbse ) ;
2222         /* ydyn_d[sNodePrime ] = 0.0 ; */
2223         ydyn_d[bNodePrime] = dQfd_dVbse + dQdext_dVbse;
2224         /* ydyn_d[bNode ] = 0.0 ; */
2225         ydyn_d[dbNode] = - Cbd ;
2226         /* ydyn_d[sbNode ] = 0.0 ; */
2227         ydyn_d[tempNode] = dQfd_dT - Cbdt + dQdext_dT ;
2228 
2229         /* ...... intrinsic drain node */
2230         /* ydyn_dP[dNode] = 0.0 ; */
2231         ydyn_dP[dNodePrime] = dQd_dVds ;
2232         /* ydyn_dP[gNode] = 0.0 ; */
2233         ydyn_dP[gNodePrime] = dQd_dVgs ;
2234         /* ydyn_dP[sNode] = 0.0 ; */
2235         ydyn_dP[sNodePrime] = - ( dQd_dVds + dQd_dVgs + dQd_dVbs ) ;
2236         ydyn_dP[bNodePrime] = dQd_dVbs ;
2237         /* ydyn_dP[bNode] = 0.0 ; */
2238         /* ydyn_dP[dbNode] = 0.0 ; */
2239         /* ydyn_dP[sbNode] = 0.0 ; */
2240         ydyn_dP[tempNode] = dQd_dT ;
2241 
2242         /* ...... gate node  */
2243         /*        (no entry) */
2244 
2245         /* ...... intrinsic gate node */
2246         ydyn_gP[dNode] = -dQfd_dVdse - dQfs_dVdse + dQgext_dVdse ;
2247         ydyn_gP[dNodePrime] = dQg_dVds ;
2248         /* ydyn_gP[gNode] = 0.0 ; */
2249         ydyn_gP[gNodePrime] = dQg_dVgs -dQfd_dVgse - dQfs_dVgse + dQgext_dVgse ;
2250         ydyn_gP[sNode] = dQfd_dVdse + dQfs_dVdse + dQfd_dVgse + dQfs_dVgse + dQfd_dVbse + dQfs_dVbse
2251                        - ( dQgext_dVdse + dQgext_dVgse + dQgext_dVbse ) ;
2252         ydyn_gP[sNodePrime] = -( dQg_dVds + dQg_dVgs + dQg_dVbs ) ;
2253         ydyn_gP[bNodePrime] = dQg_dVbs -dQfd_dVbse - dQfs_dVbse + dQgext_dVbse ;
2254         /* ydyn_gP[bNode] = 0.0 ; */
2255         /* ydyn_gP[dbNode] = 0.0 ; */
2256         /* ydyn_gP[sbNode] = 0.0 ; */
2257         ydyn_gP[tempNode] = dQg_dT - dQfd_dT - dQfs_dT + dQgext_dT ;
2258 
2259         /* ...... source node */
2260         ydyn_s[dNode] = dQfs_dVdse + dQsext_dVdse ;
2261         /* ydyn_d[dNodePrime ] = 0.0 ; */
2262         /* ydyn_d[gNode ] = 0.0 ; */
2263         ydyn_s[gNodePrime] = dQfs_dVgse + dQsext_dVgse ;
2264         ydyn_s[sNode] = Cbs - (dQfs_dVdse + dQfs_dVgse+ dQfs_dVbse) - ( dQsext_dVdse + dQsext_dVgse + dQsext_dVbse ) ;
2265         /* ydyn_d[sNodePrime ] = 0.0 ; */
2266         ydyn_s[bNodePrime] = dQfs_dVbse + dQsext_dVbse ;
2267         /* ydyn_d[bNode ] = 0.0 ; */
2268         /* ydyn_d[dbNode ] = 0.0 ; */
2269         ydyn_s[sbNode] = - Cbs ;
2270         ydyn_s[tempNode] = dQfs_dT - Cbst + dQsext_dT ;
2271 
2272         /* ...... intrinsic source node */
2273         /* ydyn_sP[dNode] = 0.0 ; */
2274         ydyn_sP[dNodePrime] = dQs_dVds ;
2275         /* ydyn_sP[gNode] = 0.0 ; */
2276         ydyn_sP[gNodePrime] =  dQs_dVgs ;
2277         /* ydyn_sP[sNode] = 0.0 ; */
2278         ydyn_sP[sNodePrime] = - ( dQs_dVds + dQs_dVgs + dQs_dVbs );
2279         ydyn_sP[bNodePrime] = dQs_dVbs ;
2280         /* ydyn_sP[bNode] = 0.0 ; */
2281         /* ydyn_sP[dbNode] = 0.0 ; */
2282         /* ydyn_sP[sbNode] = 0.0 ; */
2283         ydyn_sP[tempNode] = dQs_dT ;
2284 
2285         /* ...... intrinsic bulk node */
2286         ydyn_bP[dNode] = dQbext_dVdse ;
2287         ydyn_bP[dNodePrime] =  dQb_dVds ;
2288         /* ydyn_bP[gNode] = 0.0 ; */
2289         ydyn_bP[gNodePrime] = dQb_dVgs + dQbext_dVgse ;
2290         ydyn_bP[sNode] = - ( dQbext_dVdse + dQbext_dVgse + dQbext_dVbse ) ;
2291         ydyn_bP[sNodePrime] = - ( dQb_dVds + dQb_dVgs + dQb_dVbs );
2292         ydyn_bP[bNodePrime] = dQb_dVbs + dQbext_dVbse ;
2293         /* ydyn_bP[bNode] = 0.0 ; */
2294         /* ydyn_bP[dbNode] = 0.0 ; */
2295         /* ydyn_bP[sbNode] = 0.0 ; */
2296         ydyn_bP[tempNode] = dQb_dT + dQbext_dT ;
2297 
2298         /* ...... bulk node  */
2299         /*        (no entry) */
2300 
2301         /* ...... drain bulk node */
2302         ydyn_db[dNode] = - Cbd ;
2303         /* ydyn_db[dNodePrime] = 0.0 ; */
2304         /* ydyn_db[gNode] = 0.0 ; */
2305         /* ydyn_db[gNodePrime] = 0.0 ; */
2306         /* ydyn_db[sNode] = 0.0 ; */
2307         /* ydyn_db[sNodePrime] = 0.0 ; */
2308         /* ydyn_db[bNodePrime] = 0.0 ; */
2309         /* ydyn_db[bNode] = 0.0 ; */
2310         ydyn_db[dbNode] = Cbd ;
2311         /* ydyn_db[sbNode] = 0.0 ; */
2312         ydyn_db[tempNode] = Cbdt ;
2313 
2314         /* ...... source bulk  node */
2315         /* ydyn_sb[dNode] = 0.0 ; */
2316         /* ydyn_sb[dNodePrime] = 0.0 ; */
2317         /* ydyn_sb[gNode] = 0.0 ; */
2318         /* ydyn_sb[gNodePrime] = 0.0 ; */
2319         ydyn_sb[sNode] = - Cbs ;
2320         /* ydyn_sb[sNodePrime] = 0.0 ; */
2321         /* ydyn_sb[bNodePrime] = 0.0 ; */
2322         /* ydyn_sb[bNode] = 0.0 ; */
2323         /* ydyn_sb[dbNode] = 0.0 ; */
2324         ydyn_sb[sbNode] = Cbs ;
2325         ydyn_sb[tempNode] = Cbst ;
2326 
2327         /* ...... temp  node */
2328         /* ydyn_t[dNode] = 0.0 ; */
2329         /* ydyn_t[dNodePrime] = 0.0 ; */
2330         /* ydyn_t[gNode] = 0.0 ; */
2331         /* ydyn_t[gNodePrime] = 0.0 ; */
2332         /* ydyn_t[sNode] = 0.0 ; */
2333         /* ydyn_t[sNodePrime] = 0.0 ; */
2334         /* ydyn_t[bNodePrime] = 0.0 ; */
2335         /* ydyn_t[bNode] = 0.0 ; */
2336         /* ydyn_t[dbNode] = 0.0 ; */
2337         /* ydyn_t[sbNode] = 0.0 ; */
2338         ydyn_t[tempNode] = Cth ;
2339 
2340         /* additional entries for flat nqs handling */
2341         if (flg_nqs) {
2342           /* ...... intrinsic drain node */
2343           /* ydyn_dP[dNode] += 0.0 ; */
2344           ydyn_dP[dNodePrime] += dQd_nqs_dVds ;
2345           /* ydyn_dP[gNode] += 0.0 ; */
2346           ydyn_dP[gNodePrime] += dQd_nqs_dVgs ;
2347           /* ydyn_dP[sNode] += 0.0 ; */
2348           ydyn_dP[sNodePrime] += - ( dQd_nqs_dVds + dQd_nqs_dVgs + dQd_nqs_dVbs ) ;
2349           ydyn_dP[bNodePrime] += dQd_nqs_dVbs ;
2350           /* ydyn_dP[bNode] += 0.0 ; */
2351           /* ydyn_dP[dbNode] += 0.0 ; */
2352           /* ydyn_dP[sbNode] += 0.0 ; */
2353           ydyn_dP[tempNode] += dQd_nqs_dT ;
2354           ydyn_dP[qiNode]    = dQd_nqs_dQi_nqs ;
2355 
2356           /* ...... intrinsic gate node */
2357           /* ydyn_gP[dNode] += 0.0 ; */
2358           /* ydyn_gP[dNodePrime] += 0.0 ; */
2359           /* ydyn_gP[gNode] += 0.0 ; */
2360           /* ydyn_gP[gNodePrime] += 0.0 ; */
2361           /* ydyn_gP[sNode] += 0.0 ; */
2362           /* ydyn_gP[sNodePrime] += 0.0 ; */
2363           /* ydyn_gP[bNodePrime] += 0.0 ; */
2364           /* ydyn_gP[bNode] += 0.0 ; */
2365           /* ydyn_gP[dbNode] += 0.0 ; */
2366           /* ydyn_gP[sbNode] += 0.0 ; */
2367           /* ydyn_gP[tempNode] += 0.0 ; */
2368           ydyn_gP[qiNode] = dQg_nqs_dQi_nqs ;
2369           ydyn_gP[qbNode] = dQg_nqs_dQb_nqs ;
2370 
2371           /* ...... intrinsic source node */
2372           /* ydyn_sP[dNode] += 0.0 ; */
2373           ydyn_sP[dNodePrime] += dQs_nqs_dVds ;
2374           /* ydyn_sP[gNode] += 0.0 ; */
2375           ydyn_sP[gNodePrime] +=  dQs_nqs_dVgs ;
2376           /* ydyn_sP[sNode] += 0.0 ; */
2377           ydyn_sP[sNodePrime] += - ( dQs_nqs_dVds + dQs_nqs_dVgs + dQs_nqs_dVbs );
2378           ydyn_sP[bNodePrime] += dQs_nqs_dVbs ;
2379           /* ydyn_sP[bNode] += 0.0 ; */
2380           /* ydyn_sP[dbNode] += 0.0 ; */
2381           /* ydyn_sP[sbNode] += 0.0 ; */
2382           ydyn_sP[tempNode] += dQs_nqs_dT ;
2383           ydyn_sP[qiNode]    = dQs_nqs_dQi_nqs ;
2384 
2385           /* ...... intrinsic bulk node */
2386           /* ydyn_bP[dNode] += 0.0 ; */
2387           /* ydyn_bP[dNodePrime] += 0.0 ; */
2388           /* ydyn_bP[gNode] += 0.0 ; */
2389           /* ydyn_bP[gNodePrime] += 0.0 ; */
2390           /* ydyn_bP[sNode] += 0.0 ; */
2391           /* ydyn_bP[sNodePrime] += 0.0 ; */
2392           /* ydyn_bP[bNodePrime] += 0.0 ; */
2393           /* ydyn_bP[bNode] += 0.0 ; */
2394           /* ydyn_bP[dbNode] += 0.0 ; */
2395           /* ydyn_bP[sbNode] += 0.0 ; */
2396           /* ydyn_bP[tempNode] += 0.0 ; */
2397           ydyn_bP[qbNode] = 1.0 ;
2398 
2399           /* ...... qi node */
2400           /* ydyn_qi[dNodePrime]   = 0.0 ; */
2401           /* ydyn_qi[gNodePrime]   = 0.0 ; */
2402           /* ydyn_qi[sNodePrime]   = 0.0 ; */
2403           /* ydyn_qi[bNodePrime]   = 0.0 ; */
2404           /* ydyn_qi[tempNode] = 0.0 ; */
2405           ydyn_qi[qiNode]      = 1.0 ;
2406           /* ydyn_qi[qbNode]   = 0.0 ; */
2407 
2408           /* ...... qb node */
2409           /* ydyn_qb[dNodePrime]   = 0.0 ; */
2410           /* ydyn_qb[gNodePrime]   = 0.0 ; */
2411           /* ydyn_qb[sNodePrime]   = 0.0 ; */
2412           /* ydyn_qb[bNodePrime]   = 0.0 ; */
2413           /* ydyn_qb[tempNode] = 0.0 ; */
2414           /* ydyn_qb[qiNode]   = 0.0 ; */
2415           ydyn_qb[qbNode]      = 1.0 ;
2416         }
2417 
2418         if (!ByPass) { /* integrate etc. only necessary if not in Bypass mode! */
2419 
2420           /* store small signal parameters */
2421           if (ckt->CKTmode & MODEINITSMSIG) {
2422             /* printf("HSMHV2_load: (small signal) ByPass=%d\n",ByPass); */
2423 /*          printf("HSMHV2_load: ydc_dP=%e %e %e %e %e %e %e %e\n",
2424                     ydc_dP[0],ydc_dP[1],ydc_dP[2],ydc_dP[3],ydc_dP[4],ydc_dP[5],ydc_dP[6],ydc_dP[7]);
2425             printf("HSMHV2_load: ych_dP=%e %e %e %e %e %e %e %e\n",
2426                     ydyn_dP[0],ydyn_dP[1],ydyn_dP[2],ydyn_dP[3],ydyn_dP[4],ydyn_dP[5],ydyn_dP[6],ydyn_dP[7]);
2427 */
2428             /* dc matrix into structure 0724*/
2429             for (i = 0; i < XDIM; i++) {
2430               here->HSMHV2_ydc_d[i] = ydc_d[i];
2431               here->HSMHV2_ydc_dP[i] = ydc_dP[i];
2432               here->HSMHV2_ydc_g[i] = ydc_g[i];
2433               here->HSMHV2_ydc_gP[i] = ydc_gP[i];
2434               here->HSMHV2_ydc_s[i] = ydc_s[i];
2435               here->HSMHV2_ydc_sP[i] = ydc_sP[i];
2436               here->HSMHV2_ydc_bP[i] = ydc_bP[i];
2437               here->HSMHV2_ydc_b[i] = ydc_b[i];
2438               here->HSMHV2_ydc_db[i] = ydc_db[i];
2439               here->HSMHV2_ydc_sb[i] = ydc_sb[i];
2440               here->HSMHV2_ydc_t[i] = ydc_t[i];
2441             }
2442             /* capacitance matrix into structure 0724*/
2443             for (i = 0; i < XDIM; i++) {
2444               here->HSMHV2_ydyn_d[i] = ydyn_d[i];
2445               here->HSMHV2_ydyn_dP[i] = ydyn_dP[i];
2446               here->HSMHV2_ydyn_g[i] = ydyn_g[i];
2447               here->HSMHV2_ydyn_gP[i] = ydyn_gP[i];
2448               here->HSMHV2_ydyn_s[i] = ydyn_s[i];
2449               here->HSMHV2_ydyn_sP[i] = ydyn_sP[i];
2450               here->HSMHV2_ydyn_bP[i] = ydyn_bP[i];
2451               here->HSMHV2_ydyn_b[i] = ydyn_b[i];
2452               here->HSMHV2_ydyn_db[i] = ydyn_db[i];
2453               here->HSMHV2_ydyn_sb[i] = ydyn_sb[i];
2454               here->HSMHV2_ydyn_t[i] = ydyn_t[i];
2455             }
2456             if (flg_nqs) {
2457               for (i = 0; i < XDIM; i++) {
2458                 here->HSMHV2_ydc_qi[i] = ydc_qi[i];
2459                 here->HSMHV2_ydc_qb[i] = ydc_qb[i];
2460                 here->HSMHV2_ydyn_qi[i] = ydyn_qi[i];
2461                 here->HSMHV2_ydyn_qb[i] = ydyn_qb[i];
2462               }
2463             }
2464             goto line1000; /* that's all for small signal analyses */
2465           }
2466 
2467           /* Continue handling of dynamic part: */
2468           /* ... calculate time derivatives of node charges */
2469 
2470           if (ckt->CKTmode & MODEINITTRAN) {
2471             /* at the very first iteration of the first timepoint:
2472            copy charges into previous state -> the integrator may use them ... */
2473             *(ckt->CKTstate1 + here->HSMHV2qb) = *(ckt->CKTstate0 + here->HSMHV2qb);
2474             *(ckt->CKTstate1 + here->HSMHV2qg) = *(ckt->CKTstate0 + here->HSMHV2qg);
2475             *(ckt->CKTstate1 + here->HSMHV2qd) = *(ckt->CKTstate0 + here->HSMHV2qd);
2476             *(ckt->CKTstate1 + here->HSMHV2qth) = *(ckt->CKTstate0 + here->HSMHV2qth);
2477             *(ckt->CKTstate1 + here->HSMHV2qbs) = *(ckt->CKTstate0 + here->HSMHV2qbs);
2478             *(ckt->CKTstate1 + here->HSMHV2qbd) = *(ckt->CKTstate0 + here->HSMHV2qbd);
2479 
2480             *(ckt->CKTstate1 + here->HSMHV2qfd) = *(ckt->CKTstate0 + here->HSMHV2qfd);
2481             *(ckt->CKTstate1 + here->HSMHV2qfs) = *(ckt->CKTstate0 + here->HSMHV2qfs);
2482 
2483             *(ckt->CKTstate1 + here->HSMHV2qdE) = *(ckt->CKTstate0 + here->HSMHV2qdE);
2484 
2485             if (flg_nqs) {
2486               *(ckt->CKTstate1 + here->HSMHV2qi_nqs) = *(ckt->CKTstate0 + here->HSMHV2qi_nqs);
2487               *(ckt->CKTstate1 + here->HSMHV2qb_nqs) = *(ckt->CKTstate0 + here->HSMHV2qb_nqs);
2488             }
2489           }
2490 
2491           return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qb));
2492           return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qg));
2493           return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qd));
2494           return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qbs));
2495           return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qbd));
2496 
2497           return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qth));
2498 
2499           return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qfd));
2500           return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qfs));
2501 
2502           return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qdE));
2503 
2504           if (flg_nqs) {
2505             return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qi_nqs));
2506             return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHV2qb_nqs));
2507           }
2508 
2509           if (ckt->CKTmode & MODEINITTRAN) {
2510             /* at the very first iteration of the first timepoint:
2511                copy currents into previous state -> the integrator may use them ... */
2512             *(ckt->CKTstate1 + here->HSMHV2cqb) = *(ckt->CKTstate0 + here->HSMHV2cqb);
2513             *(ckt->CKTstate1 + here->HSMHV2cqg) = *(ckt->CKTstate0 + here->HSMHV2cqg);
2514             *(ckt->CKTstate1 + here->HSMHV2cqd) = *(ckt->CKTstate0 + here->HSMHV2cqd);
2515 
2516             *(ckt->CKTstate1 + here->HSMHV2cqth) = *(ckt->CKTstate0 + here->HSMHV2cqth);
2517 
2518             *(ckt->CKTstate1 + here->HSMHV2cqbs) = *(ckt->CKTstate0 + here->HSMHV2cqbs);
2519             *(ckt->CKTstate1 + here->HSMHV2cqbd) = *(ckt->CKTstate0 + here->HSMHV2cqbd);
2520             *(ckt->CKTstate1 + here->HSMHV2cqfd) = *(ckt->CKTstate0 + here->HSMHV2cqfd);
2521             *(ckt->CKTstate1 + here->HSMHV2cqfs) = *(ckt->CKTstate0 + here->HSMHV2cqfs);
2522 
2523             *(ckt->CKTstate1 + here->HSMHV2cqdE) = *(ckt->CKTstate0 + here->HSMHV2cqdE);
2524             if (flg_nqs) {
2525               *(ckt->CKTstate1 + here->HSMHV2dotqi_nqs) = *(ckt->CKTstate0 + here->HSMHV2dotqi_nqs);
2526               *(ckt->CKTstate1 + here->HSMHV2dotqb_nqs) = *(ckt->CKTstate0 + here->HSMHV2dotqb_nqs);
2527             }
2528           }
2529         }
2530 
2531 
2532         /* ... finally gather displacement currents from data structures */
2533 
2534         cq_dP = *(ckt->CKTstate0 + here->HSMHV2cqd);
2535         cq_gP = *(ckt->CKTstate0 + here->HSMHV2cqg);
2536         cq_bP = *(ckt->CKTstate0 + here->HSMHV2cqb);
2537         cq_sP = - *(ckt->CKTstate0 + here->HSMHV2cqg)
2538                 - *(ckt->CKTstate0 + here->HSMHV2cqb)
2539                 - *(ckt->CKTstate0 + here->HSMHV2cqd);
2540         cq_dE = *(ckt->CKTstate0 + here->HSMHV2cqdE);
2541         cq_db = *(ckt->CKTstate0 + here->HSMHV2cqbd);
2542         cq_sb = *(ckt->CKTstate0 + here->HSMHV2cqbs);
2543         cq_g = 0.0 ;
2544         cq_b = 0.0 ;
2545 
2546         /* displacement currents at outer drain/source node (fringing part only!) */
2547         cq_d = *(ckt->CKTstate0 + here->HSMHV2cqfd);
2548         cq_s = *(ckt->CKTstate0 + here->HSMHV2cqfs);
2549 
2550         cq_t = *(ckt->CKTstate0 + here->HSMHV2cqth);
2551 
2552         /* displacement currents due to nqs */
2553         if (flg_nqs) {
2554           cq_qi = *(ckt->CKTstate0 + here->HSMHV2dotqi_nqs);
2555           cq_qb = *(ckt->CKTstate0 + here->HSMHV2dotqb_nqs);
2556         } else {
2557           cq_qi = cq_qb = 0.0 ;
2558         }
2559 
2560         /* ... and, if necessary: Extrapolate displacement currents onto x-values */
2561 
2562         if (delvdbd || deldeltemp) {
2563           cq_db += ag0*(Cbd*delvdbd + Cbdt*deldeltemp) ;
2564         }
2565         if (delvsbs || deldeltemp) {
2566           cq_sb += ag0*(Cbs*delvsbs + Cbst*deldeltemp) ;
2567         }
2568         if (delvgs || delvds || delvbs || deldeltemp) {
2569           cq_gP += ag0*(dQg_dVgs*delvgs + dQg_dVds*delvds + dQg_dVbs*delvbs + dQg_dT*deldeltemp) ;
2570           cq_dP += ag0*(dQd_dVgs*delvgs + dQd_dVds*delvds + dQd_dVbs*delvbs + dQd_dT*deldeltemp) ;
2571           cq_sP += ag0*(dQs_dVgs*delvgs + dQs_dVds*delvds + dQs_dVbs*delvbs + dQs_dT*deldeltemp) ;
2572           cq_bP  = - ( cq_gP + cq_dP + cq_sP );
2573         }
2574         if (deldeltemp) {
2575           cq_t += ag0*Cth    *deldeltemp ;
2576           cq_d += ag0*dQfd_dT*deldeltemp ;
2577           cq_s += ag0*dQfs_dT*deldeltemp ;
2578 
2579           cq_gE += ag0*dQgext_dT*deldeltemp ;
2580           cq_dE += ag0*dQdext_dT*deldeltemp ;
2581           cq_bE += ag0*dQbext_dT*deldeltemp ;
2582           cq_sE  = - ( cq_gE + cq_dE + cq_bE );
2583         }
2584         if (delvgse || delvdse || delvbse) {
2585           cq_d += ag0*(dQfd_dVgse*delvgse + dQfd_dVdse*delvdse + dQfd_dVbse*delvbse) ;
2586           cq_s += ag0*(dQfs_dVgse*delvgse + dQfs_dVdse*delvdse + dQfs_dVbse*delvbse) ;
2587 
2588           cq_gE += ag0*(dQgext_dVgse*delvgse + dQgext_dVdse*delvdse + dQgext_dVbse*delvbse) ;
2589           cq_dE += ag0*(dQdext_dVgse*delvgse + dQdext_dVdse*delvdse + dQdext_dVbse*delvbse) ;
2590           cq_bE += ag0*(dQbext_dVgse*delvgse + dQbext_dVdse*delvdse + dQbext_dVbse*delvbse) ;
2591           cq_sE  = - ( cq_gE + cq_dE + cq_bE );
2592         }
2593 
2594         if (flg_nqs) {
2595           if (delvgs || delvds || delvbs || deldeltemp) {
2596             cq_dP += ag0*(dQd_nqs_dVgs*delvgs + dQd_nqs_dVds*delvds + dQd_nqs_dVbs*delvbs + dQd_nqs_dT*deldeltemp) ;
2597             cq_sP += ag0*(dQs_nqs_dVgs*delvgs + dQs_nqs_dVds*delvds + dQs_nqs_dVbs*delvbs + dQs_nqs_dT*deldeltemp) ;
2598             cq_bP  = - ( cq_gP + cq_dP + cq_sP ); /* should be superfluous ? */
2599           }
2600           if (delQi_nqs) {
2601             cq_dP += ag0*dQd_nqs_dQi_nqs*delQi_nqs ;
2602             cq_gP += ag0*dQg_nqs_dQi_nqs*delQi_nqs ;
2603             cq_sP += ag0*dQs_nqs_dQi_nqs*delQi_nqs ;
2604             cq_qi += ag0*     1.0       *delQi_nqs ;
2605           }
2606           if (delQb_nqs) {
2607             cq_gP += ag0*dQg_nqs_dQb_nqs*delQb_nqs ;
2608             cq_bP += ag0*     1.0       *delQb_nqs ;
2609             cq_qb += ag0*     1.0       *delQb_nqs ;
2610           }
2611         }
2612       } /* End of handling dynamic part */
2613 
2614 
2615       /* Assemble total node currents (type-handling shifted to stamping) */
2616 
2617       cur_d  = i_d  + cq_d - cq_db + cq_dE ;
2618       cur_dP = i_dP + cq_dP ;
2619       cur_g  = i_g  + cq_g  ;
2620       cur_gP = i_gP + cq_gP - cq_d - cq_s + cq_gE ;
2621       cur_s  = i_s  + cq_s - cq_sb + cq_sE ;
2622       cur_sP = i_sP + cq_sP;
2623       cur_bP = i_bP + cq_bP + cq_bE ;
2624       cur_b  = i_b  + cq_b;
2625       cur_db = i_db + cq_db;
2626       cur_sb = i_sb + cq_sb;
2627       cur_t  = i_t  + cq_t;
2628       cur_qi = i_qi + cq_qi;
2629       cur_qb = i_qb + cq_qb;
2630 
2631 
2632       /* Now we can start stamping ...                                    */
2633       /* ... right hand side: subtract total node currents                */
2634 
2635       *(ckt->CKTrhs + here->HSMHV2dNode)      -= model->HSMHV2_type * cur_d;
2636       *(ckt->CKTrhs + here->HSMHV2dNodePrime) -= model->HSMHV2_type * cur_dP;
2637       *(ckt->CKTrhs + here->HSMHV2gNode)      -= model->HSMHV2_type * cur_g;
2638       *(ckt->CKTrhs + here->HSMHV2gNodePrime) -= model->HSMHV2_type * cur_gP;
2639       *(ckt->CKTrhs + here->HSMHV2sNode)      -= model->HSMHV2_type * cur_s;
2640       *(ckt->CKTrhs + here->HSMHV2sNodePrime) -= model->HSMHV2_type * cur_sP;
2641       *(ckt->CKTrhs + here->HSMHV2bNodePrime) -= model->HSMHV2_type * cur_bP;
2642       *(ckt->CKTrhs + here->HSMHV2bNode)      -= model->HSMHV2_type * cur_b;
2643       *(ckt->CKTrhs + here->HSMHV2dbNode)     -= model->HSMHV2_type * cur_db;
2644       *(ckt->CKTrhs + here->HSMHV2sbNode)     -= model->HSMHV2_type * cur_sb;
2645       if( here->HSMHV2_coselfheat > 0) {
2646         *(ckt->CKTrhs + here->HSMHV2tempNode) -= cur_t;  /* temp node independent of model type! */
2647       }
2648       if (flg_nqs) {
2649         *(ckt->CKTrhs + here->HSMHV2qiNode) -= cur_qi;
2650         *(ckt->CKTrhs + here->HSMHV2qbNode) -= cur_qb;
2651       }
2652 
2653 
2654       /* ... finally stamp matrix */
2655 
2656       /*drain*/
2657       *(here->HSMHV2DdPtr)  += ydc_d[dNode]         + ag0*ydyn_d[dNode];
2658       *(here->HSMHV2DdpPtr) += ydc_d[dNodePrime]    + ag0*ydyn_d[dNodePrime];
2659       *(here->HSMHV2DgpPtr) += ydc_d[gNodePrime]    + ag0*ydyn_d[gNodePrime];
2660       *(here->HSMHV2DsPtr)  += ydc_d[sNode]         + ag0*ydyn_d[sNode];
2661       *(here->HSMHV2DspPtr) += ydc_d[sNodePrime]    + ag0*ydyn_d[sNodePrime];
2662       *(here->HSMHV2DbpPtr) += ydc_d[bNodePrime]    + ag0*ydyn_d[bNodePrime];
2663       *(here->HSMHV2DdbPtr) += ydc_d[dbNode]        + ag0*ydyn_d[dbNode];
2664       if (flg_subNode > 0) {
2665         *(here->HSMHV2DsubPtr) += ydc_d[subNode];
2666       }
2667       if( here->HSMHV2_coselfheat > 0) {
2668         /* temp entries in matrix dependent on model type */
2669         *(here->HSMHV2DtempPtr) += model->HSMHV2_type * (ydc_d[tempNode] + ag0*ydyn_d[tempNode]);
2670       }
2671 
2672       /*drain prime*/
2673       *(here->HSMHV2DPdPtr)  +=  ydc_dP[dNode]      + ag0*ydyn_dP[dNode];
2674       *(here->HSMHV2DPdpPtr) +=  ydc_dP[dNodePrime] + ag0*ydyn_dP[dNodePrime];
2675       *(here->HSMHV2DPgpPtr) +=  ydc_dP[gNodePrime] + ag0*ydyn_dP[gNodePrime];
2676       *(here->HSMHV2DPsPtr)  +=  ydc_dP[sNode]      + ag0*ydyn_dP[sNode];
2677       *(here->HSMHV2DPspPtr) +=  ydc_dP[sNodePrime] + ag0*ydyn_dP[sNodePrime];
2678       *(here->HSMHV2DPbpPtr) +=  ydc_dP[bNodePrime] + ag0*ydyn_dP[bNodePrime];
2679       if (flg_subNode > 0) {
2680         *(here->HSMHV2DPsubPtr) += ydc_dP[subNode];
2681       }
2682       if( here->HSMHV2_coselfheat > 0) {
2683         /* temp entries in matrix dependent on model type */
2684         *(here->HSMHV2DPtempPtr) +=  model->HSMHV2_type * (ydc_dP[tempNode] + ag0*ydyn_dP[tempNode]);
2685       }
2686       if (flg_nqs) {
2687         *(here->HSMHV2DPqiPtr) +=  model->HSMHV2_type * (ydc_dP[qiNode] + ag0*ydyn_dP[qiNode]);
2688       }
2689 
2690       /*gate*/
2691       *(here->HSMHV2GgPtr)   +=  ydc_g[gNode]       + ag0*ydyn_g[gNode];
2692       *(here->HSMHV2GgpPtr)  +=  ydc_g[gNodePrime]  + ag0*ydyn_g[gNodePrime];
2693 
2694       /*gate prime*/
2695       *(here->HSMHV2GPdPtr)  +=  ydc_gP[dNode]      + ag0*ydyn_gP[dNode];
2696       *(here->HSMHV2GPdpPtr) +=  ydc_gP[dNodePrime] + ag0*ydyn_gP[dNodePrime];
2697       *(here->HSMHV2GPgPtr)  +=  ydc_gP[gNode]      + ag0*ydyn_gP[gNode];
2698       *(here->HSMHV2GPgpPtr) +=  ydc_gP[gNodePrime] + ag0*ydyn_gP[gNodePrime];
2699       *(here->HSMHV2GPsPtr)  +=  ydc_gP[sNode]      + ag0*ydyn_gP[sNode];
2700       *(here->HSMHV2GPspPtr) +=  ydc_gP[sNodePrime] + ag0*ydyn_gP[sNodePrime];
2701       *(here->HSMHV2GPbpPtr) +=  ydc_gP[bNodePrime] + ag0*ydyn_gP[bNodePrime];
2702       if( here->HSMHV2_coselfheat > 0) {
2703         /* temp entries in matrix dependent on model type */
2704         *(here->HSMHV2GPtempPtr) +=  model->HSMHV2_type * (ydc_gP[tempNode] + ag0*ydyn_gP[tempNode]);
2705       }
2706       if (flg_nqs) {
2707         *(here->HSMHV2GPqiPtr) +=  model->HSMHV2_type * (ydc_gP[qiNode] + ag0*ydyn_gP[qiNode]);
2708         *(here->HSMHV2GPqbPtr) +=  model->HSMHV2_type * (ydc_gP[qbNode] + ag0*ydyn_gP[qbNode]);
2709       }
2710 
2711       /*source*/
2712       *(here->HSMHV2SdPtr)  += ydc_s[dNode]         + ag0*ydyn_s[dNode];
2713       *(here->HSMHV2SsPtr)  += ydc_s[sNode]         + ag0*ydyn_s[sNode];
2714       *(here->HSMHV2SdpPtr) += ydc_s[dNodePrime]    + ag0*ydyn_s[dNodePrime];
2715       *(here->HSMHV2SgpPtr) += ydc_s[gNodePrime]    + ag0*ydyn_s[gNodePrime];
2716       *(here->HSMHV2SspPtr) += ydc_s[sNodePrime]    + ag0*ydyn_s[sNodePrime];
2717       *(here->HSMHV2SbpPtr) += ydc_s[bNodePrime]    + ag0*ydyn_s[bNodePrime];
2718       *(here->HSMHV2SsbPtr) += ydc_s[sbNode]        + ag0*ydyn_s[sbNode];
2719       if (flg_subNode > 0) {
2720         *(here->HSMHV2SsubPtr) += ydc_s[subNode];
2721       }
2722       if( here->HSMHV2_coselfheat > 0) {
2723         /* temp entries in matrix dependent on model type */
2724         *(here->HSMHV2StempPtr) += model->HSMHV2_type * (ydc_s[tempNode]+ ag0*ydyn_s[tempNode]);
2725       }
2726 
2727       /*source prime*/
2728       *(here->HSMHV2SPdPtr)  +=  ydc_sP[dNode]      + ag0*ydyn_sP[dNode];
2729       *(here->HSMHV2SPdpPtr) +=  ydc_sP[dNodePrime] + ag0*ydyn_sP[dNodePrime];
2730       *(here->HSMHV2SPgpPtr) +=  ydc_sP[gNodePrime] + ag0*ydyn_sP[gNodePrime];
2731       *(here->HSMHV2SPsPtr)  +=  ydc_sP[sNode]      + ag0*ydyn_sP[sNode];
2732       *(here->HSMHV2SPspPtr) +=  ydc_sP[sNodePrime] + ag0*ydyn_sP[sNodePrime];
2733       *(here->HSMHV2SPbpPtr) +=  ydc_sP[bNodePrime] + ag0*ydyn_sP[bNodePrime];
2734       if (flg_subNode > 0) {
2735         *(here->HSMHV2SPsubPtr) += ydc_sP[subNode];
2736       }
2737       if( here->HSMHV2_coselfheat > 0) {
2738         /* temp entries in matrix dependent on model type */
2739         *(here->HSMHV2SPtempPtr) +=  model->HSMHV2_type * (ydc_sP[tempNode] + ag0*ydyn_sP[tempNode]);
2740       }
2741       if (flg_nqs) {
2742         *(here->HSMHV2SPqiPtr) +=  model->HSMHV2_type * (ydc_sP[qiNode] + ag0*ydyn_sP[qiNode]);
2743       }
2744 
2745       /*bulk prime*/
2746       *(here->HSMHV2BPdPtr)  +=  ydc_bP[dNode]      + ag0*ydyn_bP[dNode];
2747       *(here->HSMHV2BPdpPtr) +=  ydc_bP[dNodePrime] + ag0*ydyn_bP[dNodePrime];
2748       *(here->HSMHV2BPgpPtr) +=  ydc_bP[gNodePrime] + ag0*ydyn_bP[gNodePrime];
2749       *(here->HSMHV2BPspPtr) +=  ydc_bP[sNodePrime] + ag0*ydyn_bP[sNodePrime];
2750       *(here->HSMHV2BPsPtr)  +=  ydc_bP[sNode]      + ag0*ydyn_bP[sNode];
2751       *(here->HSMHV2BPbpPtr) +=  ydc_bP[bNodePrime] + ag0*ydyn_bP[bNodePrime];
2752       *(here->HSMHV2BPbPtr)  +=  ydc_bP[bNode]      + ag0*ydyn_bP[bNode];
2753       *(here->HSMHV2BPdbPtr) +=  ydc_bP[dbNode]     + ag0*ydyn_bP[dbNode];
2754       *(here->HSMHV2BPsbPtr) +=  ydc_bP[sbNode]     + ag0*ydyn_bP[sbNode];
2755       if( here->HSMHV2_coselfheat > 0) {
2756         /* temp entries in matrix dependent on model type */
2757         *(here->HSMHV2BPtempPtr) +=  model->HSMHV2_type * (ydc_bP[tempNode] + ag0*ydyn_bP[tempNode]);
2758       }
2759       if (flg_nqs) {
2760         *(here->HSMHV2BPqbPtr) +=  model->HSMHV2_type * (ydc_bP[qbNode] + ag0*ydyn_bP[qbNode]);
2761       }
2762 
2763       /*bulk*/
2764       *(here->HSMHV2BbpPtr) +=  ydc_b[bNodePrime]   + ag0*ydyn_b[bNodePrime];
2765       *(here->HSMHV2BbPtr)  +=  ydc_b[bNode]        + ag0*ydyn_b[bNode];
2766 
2767       /*drain bulk*/
2768       *(here->HSMHV2DBdPtr)  +=  ydc_db[dNode]      + ag0*ydyn_db[dNode];
2769       *(here->HSMHV2DBbpPtr) +=  ydc_db[bNodePrime] + ag0*ydyn_db[bNodePrime];
2770       *(here->HSMHV2DBdbPtr) +=  ydc_db[dbNode]     + ag0*ydyn_db[dbNode];
2771       if( here->HSMHV2_coselfheat > 0) {
2772         /* temp entries in matrix dependent on model type */
2773         *(here->HSMHV2DBtempPtr) +=  model->HSMHV2_type * (ydc_db[tempNode] + ag0*ydyn_db[tempNode]);
2774       }
2775 
2776       /*source bulk*/
2777       *(here->HSMHV2SBsPtr)  +=  ydc_sb[sNode]      + ag0*ydyn_sb[sNode];
2778       *(here->HSMHV2SBbpPtr) +=  ydc_sb[bNodePrime] + ag0*ydyn_sb[bNodePrime];
2779       *(here->HSMHV2SBsbPtr) +=  ydc_sb[sbNode]     + ag0*ydyn_sb[sbNode];
2780       if( here->HSMHV2_coselfheat > 0) {
2781         /* temp entries in matrix dependent on model type */
2782         *(here->HSMHV2SBtempPtr) +=  model->HSMHV2_type * (ydc_sb[tempNode] + ag0*ydyn_sb[tempNode]);
2783       }
2784 
2785       /*temp*/
2786       if( here->HSMHV2_coselfheat > 0) {
2787         /* temp entries in matrix dependent on model type */
2788         *(here->HSMHV2TempdPtr)  +=  model->HSMHV2_type * (ydc_t[dNode]      + ag0*ydyn_t[dNode]     );
2789         *(here->HSMHV2TempdpPtr) +=  model->HSMHV2_type * (ydc_t[dNodePrime] + ag0*ydyn_t[dNodePrime]);
2790         *(here->HSMHV2TempgpPtr) +=  model->HSMHV2_type * (ydc_t[gNodePrime] + ag0*ydyn_t[gNodePrime]);
2791         *(here->HSMHV2TempsPtr)  +=  model->HSMHV2_type * (ydc_t[sNode]      + ag0*ydyn_t[sNode]     );
2792         *(here->HSMHV2TempspPtr) +=  model->HSMHV2_type * (ydc_t[sNodePrime] + ag0*ydyn_t[sNodePrime]);
2793         *(here->HSMHV2TempbpPtr) +=  model->HSMHV2_type * (ydc_t[bNodePrime] + ag0*ydyn_t[bNodePrime]);
2794         /* no type factor at main diagonal temp entry! */
2795         *(here->HSMHV2TemptempPtr) +=  ydc_t[tempNode] + ag0*ydyn_t[tempNode];
2796       }
2797 
2798       /* additional entries for flat nqs handling */
2799       if ( flg_nqs ) {
2800         /*qi*/
2801         *(here->HSMHV2QIdpPtr) +=  model->HSMHV2_type * (ydc_qi[dNodePrime] + ag0*ydyn_qi[dNodePrime]);
2802         *(here->HSMHV2QIgpPtr) +=  model->HSMHV2_type * (ydc_qi[gNodePrime] + ag0*ydyn_qi[gNodePrime]);
2803         *(here->HSMHV2QIspPtr) +=  model->HSMHV2_type * (ydc_qi[sNodePrime] + ag0*ydyn_qi[sNodePrime]);
2804         *(here->HSMHV2QIbpPtr) +=  model->HSMHV2_type * (ydc_qi[bNodePrime] + ag0*ydyn_qi[bNodePrime]);
2805         *(here->HSMHV2QIqiPtr) +=                     (ydc_qi[qiNode] + ag0*ydyn_qi[qiNode]);
2806         if ( here->HSMHV2_coselfheat > 0 ) { /* self heating */
2807           *(here->HSMHV2QItempPtr) +=                     (ydc_qi[tempNode] + ag0*ydyn_qi[tempNode]);
2808         }
2809 
2810         /*qb*/
2811         *(here->HSMHV2QBdpPtr) +=  model->HSMHV2_type * (ydc_qb[dNodePrime] + ag0*ydyn_qb[dNodePrime]);
2812         *(here->HSMHV2QBgpPtr) +=  model->HSMHV2_type * (ydc_qb[gNodePrime] + ag0*ydyn_qb[gNodePrime]);
2813         *(here->HSMHV2QBspPtr) +=  model->HSMHV2_type * (ydc_qb[sNodePrime] + ag0*ydyn_qb[sNodePrime]);
2814         *(here->HSMHV2QBbpPtr) +=  model->HSMHV2_type * (ydc_qb[bNodePrime] + ag0*ydyn_qb[bNodePrime]);
2815         *(here->HSMHV2QBqbPtr) +=                     (ydc_qb[qbNode] + ag0*ydyn_qb[qbNode]);
2816         if ( here->HSMHV2_coselfheat > 0 ) { /* self heating */
2817           *(here->HSMHV2QBtempPtr) +=                     (ydc_qb[tempNode] + ag0*ydyn_qb[tempNode]);
2818         }
2819       }
2820 
2821 
2822 line1000:
2823 
2824       if (ckt->CKTnoncon != noncon_old) {
2825         ckt->CKTtroubleElt = (GENinstance *) here;
2826       }
2827 
2828 
2829     } /* End of MOSFET Instance */
2830   } /* End of Model Instance */
2831 
2832   return(OK);
2833 }
2834