diff --git a/src/spicelib/devices/hicum2/hicum2ask.c b/src/spicelib/devices/hicum2/hicum2ask.c index a300110cb..2e6c35db2 100644 --- a/src/spicelib/devices/hicum2/hicum2ask.c +++ b/src/spicelib/devices/hicum2/hicum2ask.c @@ -214,13 +214,13 @@ HICUMask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFval value->rValue = here->HICUMcapjei + here->HICUMcapdeix; return(OK); case HICUM_QUEST_CPIX: - value->rValue = here->HICUMcapjep + here->HICUMcbepar; + value->rValue = here->HICUMcapjep + here->HICUMcbepar_scaled; return(OK); case HICUM_QUEST_CMUI: value->rValue = here->HICUMcapjci + here->HICUMcapdci; return(OK); case HICUM_QUEST_CMUX: - value->rValue = here->HICUMcapjcx_t_i + here->HICUMcapjcx_t_ii + here->HICUMcbcpar + here->HICUMcapdsu; + value->rValue = here->HICUMcapjcx_t_i + here->HICUMcapjcx_t_ii + here->HICUMcbcpar_scaled + here->HICUMcapdsu; return(OK); case HICUM_QUEST_CCS: value->rValue = here->HICUMcapjs + here->HICUMcapscp; diff --git a/src/spicelib/devices/hicum2/hicum2defs.h b/src/spicelib/devices/hicum2/hicum2defs.h index d3cd500f0..98a590e67 100644 --- a/src/spicelib/devices/hicum2/hicum2defs.h +++ b/src/spicelib/devices/hicum2/hicum2defs.h @@ -140,16 +140,31 @@ typedef struct sHICUMinstance { dual_double HICUMvds_t; dual_double HICUMvpts_t; - //model variables that depend on "area" and "m" and are needed in load + //model variables that depend on "area" and "m" and are needed in temp + double HICUMqp0_scaled; + double HICUMc10_scaled; + double HICUMicbar_scaled; + double HICUMrth_scaled; + double HICUMcth_scaled; + double HICUMcjei0_scaled; + double HICUMibeis_scaled; + double HICUMireis_scaled; + double HICUMibeps_scaled; + double HICUMireps_scaled; + double HICUMcjep0_scaled; + double HICUMcbepar_scaled; + double HICUMibets_scaled; + double HICUMibcis_scaled; double HICUMcjci0_scaled; double HICUMcjcx0_scaled; - double HICUMicbar_scaled; - double HICUMcbepar_scaled; double HICUMcbcpar_scaled; - double HICUMcth_scaled; - double HICUMrth_scaled; + double HICUMibcxs_scaled; + double HICUMqavl_scaled; + double HICUMre_scaled; double HICUMrci0_scaled; - double HICUMibets_scaled; + double HICUMrbx_scaled; + double HICUMrcx_scaled; + double HICUMrbi0_scaled; double HICUMrbi; double HICUMiavl; @@ -158,9 +173,6 @@ typedef struct sHICUMinstance { double HICUMtf; double HICUMick; - double HICUMcbepar; - double HICUMcbcpar; - double *HICUMcollCollPtr; /* pointer to sparse matrix at * (collector,collector) */ double *HICUMbaseBasePtr; /* pointer to sparse matrix at diff --git a/src/spicelib/devices/hicum2/hicum2setup.c b/src/spicelib/devices/hicum2/hicum2setup.c index f5c2107a3..58deb29cd 100644 --- a/src/spicelib/devices/hicum2/hicum2setup.c +++ b/src/spicelib/devices/hicum2/hicum2setup.c @@ -498,6 +498,63 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) here->HICUMdtemp = 0.0; } + // Warning: + // The scaling with HICUMm and HICUMarea is done here from model to here variables in order to save memory. + // Classical spice scaling with "area" is implemented, but it is not recommended to be used. If you want + // scaling, more sophisticated expressions should be used. Those can be found in modern PDKs or should be + // provided by modeling engineers. + // For discrete devices, the multiplication factor "m" should give reasonable results. + // + // The HICUMm device multiplicaton factor can be exected to give good results. + // The following variables need scaling in HICUM: + // IT : qp0 ~ (area m)**2 qp0 ~ area m icbar ~ area m + // BE junction: cjei0 ~ area m cjep0 ~ m + // ibeis ~ area m ibeps ~ m + // cbepar ~ m -> area scaling not reasonable + // BC junction: cjci0 ~ area m cjcx0 ~ m + // ibcis ~ area m ibcxs ~ m + // ireis ~ area m ireps ~ m + // cbcpar ~ m -> area scaling not reasonable + // qavl ~ area m + // re ~1/(area*m) + // rci0 ~1/(area*m) + // rbx ~1/(area*m) -> assume that scaling with "area" is due to lE0 increase + // rcx ~1/(area*m) -> assume that scaling with "area" is due to lE0 increase + // rbi0 ~1/(area*m) -> assume that scaling with "area" is due to lE0 increase + // rth ~1/(area*m) -> bad assumption, but more transistor geometry needs to be known for accurate scaling + // cth ~ area*m -> bad assumption, but more transistor geometry needs to be known for accurate scaling + // Substrate related parameters not scaled on purpose. This is very geometry dependent? + + double area_times_m = here->HICUMm*here->HICUMarea; + //IT + here->HICUMqp0_scaled = model->HICUMqp0 * area_times_m; + here->HICUMc10_scaled = model->HICUMc10 * area_times_m*area_times_m; + here->HICUMicbar_scaled = model->HICUMicbar * area_times_m; + here->HICUMrth_scaled = model->HICUMrth / area_times_m; //very poor assumption + here->HICUMcth_scaled = model->HICUMcth * area_times_m; //very poor assumption + //BE junction + here->HICUMcjei0_scaled = model->HICUMcjei0 * area_times_m; + here->HICUMibeis_scaled = model->HICUMibeis * area_times_m; + here->HICUMireis_scaled = model->HICUMireis * area_times_m; + here->HICUMibeps_scaled = model->HICUMibeps * here->HICUMm; + here->HICUMireps_scaled = model->HICUMireps * here->HICUMm; + here->HICUMcjep0_scaled = model->HICUMcjep0 * here->HICUMm; + here->HICUMcbepar_scaled = model->HICUMcbepar * here->HICUMm; + here->HICUMibets_scaled = model->HICUMibets * area_times_m; + //BC junction + here->HICUMibcis_scaled = model->HICUMibcis * area_times_m; + here->HICUMcjci0_scaled = model->HICUMcjci0 * area_times_m; + here->HICUMcjcx0_scaled = model->HICUMcjcx0 * here->HICUMm; + here->HICUMcbcpar_scaled = model->HICUMcbcpar * here->HICUMm; + here->HICUMibcxs_scaled = model->HICUMibcxs * here->HICUMm; + here->HICUMqavl_scaled = model->HICUMqavl * area_times_m; + //resistances + here->HICUMre_scaled = model->HICUMre / area_times_m; + here->HICUMrci0_scaled = model->HICUMrci0 / area_times_m; + here->HICUMrbx_scaled = model->HICUMrbx / area_times_m; + here->HICUMrcx_scaled = model->HICUMrcx / area_times_m; + here->HICUMrbi0_scaled = model->HICUMrbi0 / area_times_m; + here->HICUMstate = *states; *states += HICUMnumStates; diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 36cf964b4..aa5d29dbc 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -1196,31 +1196,9 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) for (; model != NULL; model = HICUMnextModel(model)) { // Model_initialization - int selfheat = ((model->HICUMflsh > 0) && (model->HICUMrthGiven) && (here->HICUMrth_scaled > 0.0)); + int selfheat = ((model->HICUMflsh > 0) && (model->HICUMrthGiven) && (model->HICUMrth > 0.0)); int nqs = ((model->HICUMflnqs != 0 || model->HICUMflcomp == 0.0 || model->HICUMflcomp == 2.1) && (model->HICUMalit > 0 || model->HICUMalqf > 0)); - // Depletion capacitance splitting at b-c junction - // Capacitances at peripheral and external base node - C_1 = (1.0 - model->HICUMfbcpar) * - (here->HICUMcjcx0_scaled + here->HICUMcbcpar_scaled); - if (C_1 >= here->HICUMcbcpar_scaled) { - cbcpar1 = here->HICUMcbcpar_scaled; - cbcpar2 = 0.0; - //cjcx01 = C_1 - here->HICUMcbcpar_scaled; - //cjcx02 = model->HICUMcjcx0_scaled - cjcx01; //not needed herein - } - else { - cbcpar1 = C_1; - cbcpar2 = here->HICUMcbcpar_scaled - cbcpar1; - //cjcx01 = 0.0; - //cjcx02 = model->HICUMcjcx0_scaled; //not needed herein - } - - // Parasitic b-e capacitance partitioning: No temperature dependence - cbepar2 = model->HICUMfbepar * here->HICUMcbepar_scaled; - cbepar1 = here->HICUMcbepar_scaled - cbepar2; - - // Avoid divide-by-zero and define infinity other way // High current correction for 2D and 3D effects if (model->HICUMich != 0.0) { @@ -1239,7 +1217,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) } // Turn avalanche calculation on depending of parameters - if ((model->HICUMfavl > 0.0) && (here->HICUMcjci0_scaled > 0.0)) { + if ((model->HICUMfavl > 0.0) && (model->HICUMcjci0 > 0.0)) { use_aval = 1; } else { use_aval = 0; @@ -1251,6 +1229,27 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) for (here = HICUMinstances(model); here != NULL ; here=HICUMnextInstance(here)) { + // Depletion capacitance splitting at b-c junction + // Capacitances at peripheral and external base node + C_1 = (1.0 - model->HICUMfbcpar) * + (here->HICUMcjcx0_scaled + here->HICUMcbcpar_scaled); + if (C_1 >= here->HICUMcbcpar_scaled) { + cbcpar1 = here->HICUMcbcpar_scaled; + cbcpar2 = 0.0; + //cjcx01 = C_1 - here->HICUMcbcpar_scaled; + //cjcx02 = model->HICUMcjcx0_scaled - cjcx01; //not needed herein + } + else { + cbcpar1 = C_1; + cbcpar2 = here->HICUMcbcpar_scaled - cbcpar1; + //cjcx01 = 0.0; + //cjcx02 = model->HICUMcjcx0_scaled; //not needed herein + } + + // Parasitic b-e capacitance partitioning: No temperature dependence + cbepar2 = model->HICUMfbepar * here->HICUMcbepar_scaled; + cbepar1 = here->HICUMcbepar_scaled - cbepar2; + gqbepar1 = 0.0; gqbepar2 = 0.0; gqbcpar1 = 0.0; @@ -1258,10 +1257,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) gqsu = 0.0; Icth = 0.0, Icth_Vrth = 0.0; - // Markus: What is this ? - here->HICUMcbepar = here->HICUMcbepar_scaled; - here->HICUMcbcpar = here->HICUMcbcpar_scaled; - /* * initialization */ diff --git a/src/spicelib/devices/hicum2/hicumL2temp.cpp b/src/spicelib/devices/hicum2/hicumL2temp.cpp index b2d95a096..85f1bb3a8 100644 --- a/src/spicelib/devices/hicum2/hicumL2temp.cpp +++ b/src/spicelib/devices/hicum2/hicumL2temp.cpp @@ -140,104 +140,8 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double double Tnom, zetatef, cjcx01, cjcx02, C_1; duals::duald cjei0_t, vdei_t, cjep0_t, vdep_t; - //variable for area and m scaling - double area_times_m; - double qp0_scaled ; - double c10_scaled ; - double icbar_scaled; - double cjei0_scaled; - double ibeis_scaled; - double ireis_scaled; - double ibeps_scaled; - double ibcxs_scaled; - double ireps_scaled; - double cjep0_scaled; - double cbepar_scaled; - double ibcis_scaled; - double cjci0_scaled; - double cjcx0_scaled; - double cbcpar_scaled; - double qavl_scaled ; - double re_scaled ; - double rci0_scaled ; - double rbx_scaled ; - double rcx_scaled ; - double rbi0_scaled ; - double rth_scaled ; - double cth_scaled ; - double ibets_scaled ; - // double cjci0_t, vdci_t, vptci_t, cjep0_t, vdep_t, ajep_t, vdcx_t, vptcx_t, cscp0_t, vdsp_t, vptsp_t, cjs0_t, vds_t, vpts_t; - // Warning: - // The scaling with HICUMm and HICUMarea is done here from model to here variables in order to save memory. - // Classical spice scaling with "area" is implemented, but it is not recommended to be used. If you want - // scaling, more sophisticated expressions should be used. Those can be found in modern PDKs or should be - // provided by modeling engineers. - // For discrete devices, the multiplication factor "m" should give reasonable results. - // - // The HICUMm device multiplicaton factor can be exected to give good results. - // The following variables need scaling in HICUM: - // IT : qp0 ~ (area m)**2 qp0 ~ area m icbar ~ area m - // BE junction: cjei0 ~ area m cjep0 ~ m - // ibeis ~ area m ibeps ~ m - // cbepar ~ m -> area scaling not reasonable - // BC junction: cjci0 ~ area m cjcx0 ~ m - // ibcis ~ area m ibcxs ~ m - // ireis ~ area m ireps ~ m - // cbcpar ~ m -> area scaling not reasonable - // qavl ~ area m - // re ~1/(area*m) - // rci0 ~1/(area*m) - // rbx ~1/(area*m) -> assume that scaling with "area" is due to lE0 increase - // rcx ~1/(area*m) -> assume that scaling with "area" is due to lE0 increase - // rbi0 ~1/(area*m) -> assume that scaling with "area" is due to lE0 increase - // rth ~1/(area*m) -> bad assumption, but more transistor geometry needs to be known for accurate scaling - // cth ~ area*m -> bad assumption, but more transistor geometry needs to be known for accurate scaling - // Substrate related parameters not scaled on purpose. This is very geometry dependent? - - area_times_m = here->HICUMm*here->HICUMarea; - //IT - qp0_scaled = model->HICUMqp0 * area_times_m; - c10_scaled = model->HICUMc10 * area_times_m*area_times_m; - icbar_scaled = model->HICUMicbar * area_times_m; - rth_scaled = model->HICUMrth / area_times_m; //very poor assumption - cth_scaled = model->HICUMcth * area_times_m; //very poor assumption - //BE junction - cjei0_scaled = model->HICUMcjei0 * area_times_m; - ibeis_scaled = model->HICUMibeis * area_times_m; - ireis_scaled = model->HICUMireis * area_times_m; - ibeps_scaled = model->HICUMibeps * here->HICUMm; - ireps_scaled = model->HICUMireps * here->HICUMm; - cjep0_scaled = model->HICUMcjep0 * here->HICUMm; - cbepar_scaled = model->HICUMcbepar * here->HICUMm; - ibets_scaled = model->HICUMibets * area_times_m; - //BC junction - ibcis_scaled = model->HICUMibcis * area_times_m; - cjci0_scaled = model->HICUMcjci0 * area_times_m; - cjcx0_scaled = model->HICUMcjcx0 * here->HICUMm; - cbcpar_scaled = model->HICUMcbcpar * here->HICUMm; - ibcxs_scaled = model->HICUMibcxs * here->HICUMm; - qavl_scaled = model->HICUMqavl * area_times_m; - //resistances - re_scaled = model->HICUMre / area_times_m; - rci0_scaled = model->HICUMrci0 / area_times_m; - rbx_scaled = model->HICUMrbx / area_times_m; - rcx_scaled = model->HICUMrcx / area_times_m; - rbi0_scaled = model->HICUMrbi0 / area_times_m; - - // These model variables depend on on scale. - // They are put into the here struct for usage in load routine. - here->HICUMicbar_scaled = icbar_scaled; - here->HICUMcbepar_scaled = cbepar_scaled; - here->HICUMcbcpar_scaled = cbcpar_scaled; - here->HICUMcth_scaled = cth_scaled; - here->HICUMibets_scaled = ibets_scaled; - here->HICUMrci0_scaled = rci0_scaled; - here->HICUMrth_scaled = rth_scaled; - here->HICUMcjcx0_scaled = cjcx0_scaled; - here->HICUMcjci0_scaled = cjci0_scaled; - Tnom = model->HICUMtnom; k10 = model->HICUMf1vg*Tnom*log(Tnom); k20 = model->HICUMf2vg*Tnom; @@ -280,12 +184,12 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double vgbe_t = (vgb_t+vge_t)/2; here->HICUMtVcrit = here->HICUMvt.rpart * - log(here->HICUMvt.rpart / (CONSTroot2*ibeis_scaled*here->HICUMarea*here->HICUMm)); + log(here->HICUMvt.rpart / (CONSTroot2*here->HICUMibeis_scaled)); //Internal b-e junction capacitance // TMPHICJ(here->HICUMvt0,here->HICUMvt,here->HICUMqtt0,here->HICUMln_qtt0,here->HICUMmg,cjei0_scaled,model->HICUMvdei,model->HICUMzei,model->HICUMajei,1,vgbe0,&here->HICUMcjei0_t,&here->HICUMvdei_t,&here->HICUMajei_t); hicum_TMPHICJ(vt, here->HICUMvt0, qtt0, ln_qtt0, mg, - cjei0_scaled, model->HICUMvdei, model->HICUMzei, model->HICUMajei, 1, vgbe0, + here->HICUMcjei0_scaled, model->HICUMvdei, model->HICUMzei, model->HICUMajei, 1, vgbe0, &here->HICUMcjei0_t.rpart, &here->HICUMvdei_t.rpart, &here->HICUMajei_t.rpart, &here->HICUMcjei0_t.dpart, &here->HICUMvdei_t.dpart, &here->HICUMajei_t.dpart); cjei0_t.rpart(here->HICUMcjei0_t.rpart); @@ -299,33 +203,33 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double r_VgVT = V_gT/vt; //Internal b-e diode saturation currents a = model->HICUMmcf*r_VgVT/model->HICUMmbei - model->HICUMalb*dT; - a = ibeis_scaled*exp(a); + a = here->HICUMibeis_scaled*exp(a); here->HICUMibeis_t.rpart = a.rpart(); here->HICUMibeis_t.dpart = a.dpart(); a = model->HICUMmcf*r_VgVT/model->HICUMmrei - model->HICUMalb*dT; - a = ireis_scaled*exp(a); + a = here->HICUMireis_scaled*exp(a); here->HICUMireis_t.rpart = a.rpart(); here->HICUMireis_t.dpart = a.dpart(); //Peripheral b-e diode saturation currents a = model->HICUMmcf*r_VgVT/model->HICUMmbep - model->HICUMalb*dT; - a = ibeps_scaled*exp(a); + a = here->HICUMibeps_scaled*exp(a); here->HICUMibeps_t.rpart = a.rpart(); here->HICUMibeps_t.dpart = a.dpart(); a = model->HICUMmcf*r_VgVT/model->HICUMmrep - model->HICUMalb*dT; - a = ireps_scaled*exp(a); + a = here->HICUMireps_scaled*exp(a); here->HICUMireps_t.rpart = a.rpart(); here->HICUMireps_t.dpart = a.dpart(); //Internal b-c diode saturation current a = r_VgVT/model->HICUMmbci; - a = ibcis_scaled*exp(a); + a = here->HICUMibcis_scaled*exp(a); here->HICUMibcis_t.rpart = a.rpart(); here->HICUMibcis_t.dpart = a.dpart(); //External b-c diode saturation currents a = r_VgVT/model->HICUMmbcx; - a = ibcxs_scaled*exp(a); + a = here->HICUMibcxs_scaled*exp(a); here->HICUMibcxs_t.rpart = a.rpart(); here->HICUMibcxs_t.dpart = a.dpart(); //Saturation transfer current for substrate transistor @@ -340,7 +244,7 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double here->HICUMiscs_t.dpart = a.dpart(); //Zero bias hole charge a = vdei_t/model->HICUMvdei; - a = qp0_scaled*(1.0+0.5*model->HICUMzei*(1.0-a)); + a = here->HICUMqp0_scaled*(1.0+0.5*model->HICUMzei*(1.0-a)); here->HICUMqp0_t.rpart = a.rpart(); here->HICUMqp0_t.dpart = a.dpart(); //Voltage separating ohmic and saturation velocity regime @@ -360,33 +264,33 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double here->HICUMtef0_t.dpart = a.dpart(); } else { //Internal b-e diode saturation currents - a = ibeis_scaled*exp(model->HICUMzetabet*ln_qtt0+model->HICUMvge/vt*(qtt0-1)); + a = here->HICUMibeis_scaled*exp(model->HICUMzetabet*ln_qtt0+model->HICUMvge/vt*(qtt0-1)); here->HICUMibeis_t.rpart = a.rpart(); here->HICUMibeis_t.dpart = a.dpart(); if (model->HICUMflcomp>=2.3) { - a = ireis_scaled*exp(mg/model->HICUMmrei*ln_qtt0+vgbe0/(model->HICUMmrei*vt)*(qtt0-1)); + a = here->HICUMireis_scaled*exp(mg/model->HICUMmrei*ln_qtt0+vgbe0/(model->HICUMmrei*vt)*(qtt0-1)); } else { - a = ireis_scaled*exp(0.5*mg*ln_qtt0+0.5*vgbe0/vt*(qtt0-1)); + a = here->HICUMireis_scaled*exp(0.5*mg*ln_qtt0+0.5*vgbe0/vt*(qtt0-1)); } here->HICUMireis_t.rpart = a.rpart(); here->HICUMireis_t.dpart = a.dpart(); //Peripheral b-e diode saturation currents - a = ibeps_scaled*exp(model->HICUMzetabet*ln_qtt0+model->HICUMvge/vt*(qtt0-1)); + a = here->HICUMibeps_scaled*exp(model->HICUMzetabet*ln_qtt0+model->HICUMvge/vt*(qtt0-1)); here->HICUMibeps_t.rpart = a.rpart(); here->HICUMibeps_t.dpart = a.dpart(); if (model->HICUMflcomp>=2.3) { - a = ireps_scaled*exp(mg/model->HICUMmrep*ln_qtt0+vgbe0/(model->HICUMmrep*vt)*(qtt0-1)); + a = here->HICUMireps_scaled*exp(mg/model->HICUMmrep*ln_qtt0+vgbe0/(model->HICUMmrep*vt)*(qtt0-1)); } else { - a = ireps_scaled*exp(0.5*mg*qtt0+0.5*vgbe0/vt*(qtt0-1)); + a = here->HICUMireps_scaled*exp(0.5*mg*qtt0+0.5*vgbe0/vt*(qtt0-1)); } here->HICUMireps_t.rpart = a.rpart(); here->HICUMireps_t.dpart = a.dpart(); //Internal b-c diode saturation currents - a = ibcis_scaled*exp(zetabci*ln_qtt0+model->HICUMvgc/vt*(qtt0-1)); + a = here->HICUMibcis_scaled*exp(zetabci*ln_qtt0+model->HICUMvgc/vt*(qtt0-1)); here->HICUMibcis_t.rpart = a.rpart(); here->HICUMibcis_t.dpart = a.dpart(); //External b-c diode saturation currents - a = ibcxs_scaled*exp(zetabcxt*ln_qtt0+model->HICUMvgc/vt*(qtt0-1)); + a = here->HICUMibcxs_scaled*exp(zetabcxt*ln_qtt0+model->HICUMvgc/vt*(qtt0-1)); here->HICUMibcxs_t.rpart = a.rpart(); here->HICUMibcxs_t.dpart = a.dpart(); //Saturation transfer current for substrate transistor @@ -399,7 +303,7 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double here->HICUMiscs_t.dpart = a.dpart(); //Zero bias hole charge a = exp(model->HICUMzei*log(vdei_t/model->HICUMvdei)); - a = qp0_scaled*(2.0-a); + a = here->HICUMqp0_scaled*(2.0-a); here->HICUMqp0_t.rpart = a.rpart(); here->HICUMqp0_t.dpart = a.dpart(); //Voltage separating ohmic and saturation velocity regime @@ -419,12 +323,12 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double } //GICCR prefactor - a = c10_scaled*exp(model->HICUMzetact*ln_qtt0+model->HICUMvgb/vt*(qtt0-1)); + a = here->HICUMc10_scaled*exp(model->HICUMzetact*ln_qtt0+model->HICUMvgb/vt*(qtt0-1)); here->HICUMc10_t.rpart = a.rpart(); here->HICUMc10_t.dpart = a.dpart(); // Low-field internal collector resistance - a = rci0_scaled*exp(model->HICUMzetaci*ln_qtt0); + a = here->HICUMrci0_scaled*exp(model->HICUMzetaci*ln_qtt0); here->HICUMrci0_t.rpart = a.rpart(); here->HICUMrci0_t.dpart = a.dpart(); @@ -436,7 +340,7 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double //Internal b-c junction capacitance // TMPHICJ(here->HICUMvt0,here->HICUMvt,here->HICUMqtt0,here->HICUMln_qtt0,here->HICUMmg,cjci0_scaled,model->HICUMvdci,model->HICUMzci,model->HICUMvptci,0,vgbc0,&cjci0_t,&vdci_t,&vptci_t); hicum_TMPHICJ(vt, here->HICUMvt0, qtt0, ln_qtt0, mg, - cjci0_scaled, model->HICUMvdci, model->HICUMzci, model->HICUMvptci, 0, vgbc0, + here->HICUMcjci0_scaled, model->HICUMvdci, model->HICUMzci, model->HICUMvptci, 0, vgbc0, &here->HICUMcjci0_t.rpart, &here->HICUMvdci_t.rpart, &here->HICUMvptci_t.rpart, &here->HICUMcjci0_t.dpart, &here->HICUMvdci_t.dpart, &here->HICUMvptci_t.dpart); @@ -454,7 +358,7 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double a = model->HICUMfavl*exp(model->HICUMalfav*dT); here->HICUMfavl_t.rpart = a.rpart(); here->HICUMfavl_t.dpart = a.dpart(); - a = qavl_scaled*exp(model->HICUMalqav*dT); + a = here->HICUMqavl_scaled*exp(model->HICUMalqav*dT); here->HICUMqavl_t.rpart = a.rpart(); here->HICUMqavl_t.dpart = a.dpart(); a = model->HICUMkavl*exp(model->HICUMalkav*dT); @@ -462,14 +366,14 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double here->HICUMkavl_t.dpart = a.dpart(); //Zero bias internal base resistance - a = rbi0_scaled*exp(model->HICUMzetarbi*ln_qtt0); + a = here->HICUMrbi0_scaled*exp(model->HICUMzetarbi*ln_qtt0); here->HICUMrbi0_t.rpart = a.rpart(); here->HICUMrbi0_t.dpart = a.dpart(); //Peripheral b-e junction capacitance // TMPHICJ(here->HICUMvt0,here->HICUMvt,here->HICUMqtt0,here->HICUMln_qtt0,here->HICUMmg,cjep0_scaled,model->HICUMvdep,model->HICUMzep,model->HICUMajep,1,vgbe0,&cjep0_t,&vdep_t,&ajep_t); hicum_TMPHICJ(vt, here->HICUMvt0, qtt0, ln_qtt0, mg, - cjep0_scaled, model->HICUMvdep, model->HICUMzep, model->HICUMajep, 1, vgbe0, + here->HICUMcjep0_scaled, model->HICUMvdep, model->HICUMzep, model->HICUMajep, 1, vgbe0, &here->HICUMcjep0_t.rpart, &here->HICUMvdep_t.rpart, &here->HICUMajep_t.rpart, &here->HICUMcjep0_t.dpart, &here->HICUMvdep_t.dpart, &here->HICUMajep_t.dpart); cjep0_t.rpart(here->HICUMcjep0_t.rpart); @@ -478,19 +382,19 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double vdep_t.dpart(here->HICUMvdep_t.dpart); //Tunneling current factors - if (ibets_scaled > 0) { // HICTUN_T + if (here->HICUMibets_scaled > 0) { // HICTUN_T duals::duald a_eg,ab,aa; ab = 1.0; aa = 1.0; a_eg = vgbe_t0/vgbe_t; - if(model->HICUMtunode==1 && cjep0_scaled > 0.0 && model->HICUMvdep >0.0) { - ab = (cjep0_t/cjep0_scaled)*sqrt(a_eg)*vdep_t*vdep_t/(model->HICUMvdep*model->HICUMvdep); - aa = (model->HICUMvdep/vdep_t)*(cjep0_scaled/cjep0_t)*pow(a_eg,-1.5); - } else if (model->HICUMtunode==0 && cjei0_scaled > 0.0 && model->HICUMvdei >0.0) { - ab = (cjei0_t/cjei0_scaled)*sqrt(a_eg)*vdei_t*vdei_t/(model->HICUMvdei*model->HICUMvdei); - aa = (model->HICUMvdei/vdei_t)*(cjei0_scaled/cjei0_t)*pow(a_eg,-1.5); + if(model->HICUMtunode==1 && here->HICUMcjep0_scaled > 0.0 && model->HICUMvdep >0.0) { + ab = (cjep0_t/here->HICUMcjep0_scaled)*sqrt(a_eg)*vdep_t*vdep_t/(model->HICUMvdep*model->HICUMvdep); + aa = (model->HICUMvdep/vdep_t)*(here->HICUMcjep0_scaled/cjep0_t)*pow(a_eg,-1.5); + } else if (model->HICUMtunode==0 && here->HICUMcjei0_scaled > 0.0 && model->HICUMvdei >0.0) { + ab = (cjei0_t/here->HICUMcjei0_scaled)*sqrt(a_eg)*vdei_t*vdei_t/(model->HICUMvdei*model->HICUMvdei); + aa = (model->HICUMvdei/vdei_t)*(here->HICUMcjei0_scaled/cjei0_t)*pow(a_eg,-1.5); } - a = ibets_scaled*ab; + a = here->HICUMibets_scaled*ab; here->HICUMibets_t.rpart = a.rpart(); here->HICUMibets_t.dpart = a.dpart(); a = model->HICUMabet*aa; @@ -505,13 +409,13 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double //Depletion capacitance splitting at b-c junction //Capacitances at peripheral and external base node - C_1 = (1.0-model->HICUMfbcpar)*(cjcx0_scaled+cbcpar_scaled); - if (C_1 >= cbcpar_scaled) { - cjcx01 = C_1-cbcpar_scaled; - cjcx02 = cjcx0_scaled-cjcx01; + C_1 = (1.0-model->HICUMfbcpar)*(here->HICUMcjcx0_scaled+here->HICUMcbcpar_scaled); + if (C_1 >= here->HICUMcbcpar_scaled) { + cjcx01 = C_1-here->HICUMcbcpar_scaled; + cjcx02 = here->HICUMcjcx0_scaled-cjcx01; } else { cjcx01 = 0.0; - cjcx02 = cjcx0_scaled; + cjcx02 = here->HICUMcjcx0_scaled; } //Temperature mapping for tunneling current is done inside HICTUN @@ -530,13 +434,13 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double here->HICUMcjcx02_t.dpart = a.dpart(); //Constant external series resistances - a = rcx_scaled*exp(model->HICUMzetarcx*ln_qtt0); + a = here->HICUMrcx_scaled*exp(model->HICUMzetarcx*ln_qtt0); here->HICUMrcx_t.rpart = a.rpart(); here->HICUMrcx_t.dpart = a.dpart(); - a = rbx_scaled*exp(model->HICUMzetarbx*ln_qtt0); + a = here->HICUMrbx_scaled*exp(model->HICUMzetarbx*ln_qtt0); here->HICUMrbx_t.rpart = a.rpart(); here->HICUMrbx_t.dpart = a.dpart(); - a = re_scaled*exp(model->HICUMzetare*ln_qtt0); + a = here->HICUMre_scaled*exp(model->HICUMzetare*ln_qtt0); here->HICUMre_t.rpart = a.rpart(); here->HICUMre_t.dpart = a.dpart(); @@ -594,7 +498,7 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double here->HICUMhfc_t.dpart = 0; } - a = rth_scaled*exp(model->HICUMzetarth*ln_qtt0)*(1+model->HICUMalrth*dT); + a = here->HICUMrth_scaled*exp(model->HICUMzetarth*ln_qtt0)*(1+model->HICUMalrth*dT); here->HICUMrth_t.rpart = a.rpart(); here->HICUMrth_t.dpart = a.dpart();