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