diff --git a/src/spicelib/devices/hicum2/hicum.c b/src/spicelib/devices/hicum2/hicum.c index 2ee8771b2..ddfb79ab9 100644 --- a/src/spicelib/devices/hicum2/hicum.c +++ b/src/spicelib/devices/hicum2/hicum.c @@ -34,9 +34,9 @@ IFparm HICUMpTable[] = { /* parameters */ OPU("baseBInode", HICUM_QUEST_BASEBINODE, IF_INTEGER, "Internal base node"), OPU("emitEInode", HICUM_QUEST_EMITEINODE, IF_INTEGER, "Internal emitter node"), OPU("subsSInode", HICUM_QUEST_SUBSSINODE, IF_INTEGER, "Internal substrate node"), -// OPU("xfnode", HICUM_QUEST_XFNODE, IF_INTEGER, "Internal phase node xf"), -// OPU("xf1node", HICUM_QUEST_XF1NODE, IF_INTEGER, "Internal phase node xf1"), -// OPU("xf2node", HICUM_QUEST_XF2NODE, IF_INTEGER, "Internal phase node xf2"), + OPU("xfnode", HICUM_QUEST_XFNODE, IF_INTEGER, "Internal phase node xf"), + OPU("xf1node", HICUM_QUEST_XF1NODE, IF_INTEGER, "Internal phase node xf1"), + OPU("xf2node", HICUM_QUEST_XF2NODE, IF_INTEGER, "Internal phase node xf2"), OP("vbe", HICUM_QUEST_VBE, IF_REAL, "B-E voltage"), OP("vbc", HICUM_QUEST_VBC, IF_REAL, "B-C voltage"), OP("ic", HICUM_QUEST_CC, IF_REAL, "Collector current"), @@ -110,8 +110,10 @@ IFparm HICUMmPTable[] = { /* model parameters */ //Base-Collector avalanche current IOP("favl", HICUM_MOD_FAVL , IF_REAL, "Avalanche current factor"), IOP("qavl", HICUM_MOD_QAVL , IF_REAL, "Exponent factor for avalanche current"), + IOP("kavl", HICUM_MOD_KAVL , IF_REAL, "Flag/factor for turning strong avalanche on"), IOP("alfav", HICUM_MOD_ALFAV, IF_REAL, "Relative TC for FAVL"), IOP("alqav", HICUM_MOD_ALQAV, IF_REAL, "Relative TC for QAVL"), + IOP("alkav", HICUM_MOD_ALKAV, IF_REAL, "Relative TC for KAVL"), //Series resistances IOP("rbi0", HICUM_MOD_RBI0 , IF_REAL, "Zero bias internal base resistance"), diff --git a/src/spicelib/devices/hicum2/hicumdefs.h b/src/spicelib/devices/hicum2/hicumdefs.h index 781e58e6f..22ef972ed 100644 --- a/src/spicelib/devices/hicum2/hicumdefs.h +++ b/src/spicelib/devices/hicum2/hicumdefs.h @@ -57,9 +57,9 @@ typedef struct sHICUMinstance { int HICUMemitEINode; /* number of internal emitter node of hicum */ int HICUMbaseBPNode; /* number of internal base node of hicum */ int HICUMsubsSINode; /* number of internal substrate node */ - int HICUMxfNode; /* number of internal excess phase node */ - int HICUMxf1Node; /* number of internal excess phase node */ - int HICUMxf2Node; /* number of internal excess phase node */ + int HICUMxfNode; /* number of internal excess phase node qdei */ + int HICUMxf1Node; /* number of internal excess phase node itf */ + int HICUMxf2Node; /* number of internal excess phase node itf */ double HICUMarea; /* area factor for the hicum */ double HICUMicVBE; /* initial condition voltage B-E */ @@ -92,6 +92,7 @@ typedef struct sHICUMinstance { double HICUMthcs_t; double HICUMfavl_t; double HICUMqavl_t; + double HICUMkavl_t; double HICUMrbi0_t; double HICUMibets_t; double HICUMabet_t; @@ -211,6 +212,7 @@ typedef struct sHICUMinstance { double *HICUMsubsCollPtr; double *HICUMcollSubsPtr; + /* excess phase */ double *HICUMxfXfPtr; double *HICUMxf1Xf1Ptr; double *HICUMxf2Xf2Ptr; @@ -255,6 +257,8 @@ typedef struct sHICUMinstance { double HICUMcapsu; double HICUMcapcth; + double HICUMcapxf; + double HICUMtVcrit; double HICUMbetadc; @@ -367,10 +371,16 @@ typedef struct sHICUMinstance { #define HICUMvrth HICUMstate+67 #define HICUMicth_Vrth HICUMstate+68 -//#define HICUMvbxf HICUMstate+73 -//#define HICUMvbxf1 HICUMstate+74 -//#define HICUMvbxf2 HICUMstate+75 -#define HICUMnumStates 69 +#define HICUMvxf HICUMstate+69 +#define HICUMqxf HICUMstate+70 +#define HICUMcqxf HICUMstate+71 +#define HICUMgqxf HICUMstate+72 +#define HICUMixf_Vbiei HICUMstate+73 +#define HICUMixf_Vbici HICUMstate+74 + +#define HICUMvxf1 HICUMstate+75 +#define HICUMvxf2 HICUMstate+76 +#define HICUMnumStates 77 /* per model data */ typedef struct sHICUMmodel { /* model structure for a hicum */ @@ -426,8 +436,10 @@ typedef struct sHICUMmodel { /* model structure for a hicum */ //Base-Collector avalanche current double HICUMfavl; double HICUMqavl; + double HICUMkavl; double HICUMalfav; double HICUMalqav; + double HICUMalkav; //Series resistances double HICUMrbi0; @@ -602,8 +614,10 @@ typedef struct sHICUMmodel { /* model structure for a hicum */ //Base-Collector avalanche current unsigned HICUMfavlGiven : 1; unsigned HICUMqavlGiven : 1; + unsigned HICUMkavlGiven : 1; unsigned HICUMalfavGiven : 1; unsigned HICUMalqavGiven : 1; + unsigned HICUMalkavGiven : 1; //Series resistances unsigned HICUMrbi0Given : 1; @@ -798,8 +812,10 @@ enum { //Base-Collector avalanche current HICUM_MOD_FAVL, HICUM_MOD_QAVL, + HICUM_MOD_KAVL, HICUM_MOD_ALFAV, HICUM_MOD_ALQAV, + HICUM_MOD_ALKAV, //Series resistances HICUM_MOD_RBI0, @@ -944,9 +960,9 @@ enum { HICUM_QUEST_BASEBINODE, HICUM_QUEST_EMITEINODE, HICUM_QUEST_SUBSSINODE, -// HICUM_QUEST_XFNODE, -// HICUM_QUEST_XF1NODE, -// HICUM_QUEST_XF2NODE, + HICUM_QUEST_XFNODE, + HICUM_QUEST_XF1NODE, + HICUM_QUEST_XF2NODE, HICUM_QUEST_VBE, HICUM_QUEST_VBC, HICUM_QUEST_CC, diff --git a/src/spicelib/devices/hicum2/hicumload.c b/src/spicelib/devices/hicum2/hicumload.c index 1e67a8a77..40a683c26 100644 --- a/src/spicelib/devices/hicum2/hicumload.c +++ b/src/spicelib/devices/hicum2/hicumload.c @@ -24,7 +24,6 @@ Spice3 Implementation: 2019 Dietmar Warning #define DFa_fj 1.921812 #define RTOLC 1.0e-5 #define l_itmax 100 -#define LN_EXP_LIMIT 11.0 #define MIN_R 0.001 void QJMODF(double, double, double, double, double, double, double *, double *, double *); @@ -506,15 +505,16 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) int l_it; //NQS -// double Ixf1,Ixf2,Qxf1,Qxf2; + double Ixf1,Ixf2,Qxf1,Qxf2; double Itxf, Qdeix; -// double Vxf, Ixf, Qxf; + double Vxf, Ixf, Qxf; double hjei_vbe; double Vbiei, Vbici, Vciei, Vbpei, Vbpbi, Vbpci, Vsici, Vbci, Vsc; - double qjcx0_t_i, qjcx0_t_ii; + // Model flags + int use_aval; //end of variables @@ -537,7 +537,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) int ichk1, ichk2, ichk3, ichk4, ichk5; int error; double Vbe, Vcic, Vbbp, Veie, Vsis, Vbpe; -// double Vbxf, Vbxf1, Vbxf2; double Ibiei, Ibiei_Vbiei; double Ibici, Ibici_Vbici; @@ -553,7 +552,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Ibpsi, Ibpsi_Vbpci, Ibpsi_Vsici; double Icic_Vcic; double Ibci, Ibci_Vbci; -// double Icxf, Icxf1, Icxf2, Ibxf, Ibxf1, Ibxf2; double hjei_vbe_Vbiei, ibet_Vbpei=0.0, ibet_Vbiei=0.0, ibh_rec_Vbiei; double irei_Vbiei, irep_Vbpei, iavl_Vbici, rbi_Vbiei, rbi_Vbici; double Q_0_Vbiei, Q_0_Vbici, b_q_Vbiei, b_q_Vbici; @@ -588,6 +586,12 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double cqbcpar1, gqbcpar1; double cqbcpar2, gqbcpar2; double cqsu, gqsu; + double qjcx0_t_i, qjcx0_t_ii; + +//NQS + double Vbxf, Vbxf1, Vbxf2; + double Qxf_Vxf; + double Iqxf, Iqxf_Vxf, Iqxf1, Iqxf2; double Ith, Vrth, Icth, Icth_Vrth, delvrth; @@ -616,44 +620,55 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Ith_Vbbp; /* loop through all the models */ - for( ; model != NULL; model = HICUMnextModel(model)) { + for (; model != NULL; model = HICUMnextModel(model)) { -// Model_initialization + // Model_initialization - //Depletion capacitance splitting at b-c junction - //Capacitances at peripheral and external base node - C_1 = (1.0-model->HICUMfbcpar)*(model->HICUMcjcx0+model->HICUMcbcpar); + // Depletion capacitance splitting at b-c junction + // Capacitances at peripheral and external base node + C_1 = (1.0 - model->HICUMfbcpar) * + (model->HICUMcjcx0 + model->HICUMcbcpar); if (C_1 >= model->HICUMcbcpar) { cbcpar1 = model->HICUMcbcpar; cbcpar2 = 0.0; - cjcx01 = C_1-model->HICUMcbcpar; - cjcx02 = model->HICUMcjcx0-cjcx01; - } else { + cjcx01 = C_1 - model->HICUMcbcpar; + cjcx02 = model->HICUMcjcx0 - cjcx01; + } + else { cbcpar1 = C_1; - cbcpar2 = model->HICUMcbcpar-cbcpar1; - cjcx01 = 0.0; - cjcx02 = model->HICUMcjcx0; + cbcpar2 = model->HICUMcbcpar - cbcpar1; + cjcx01 = 0.0; + cjcx02 = model->HICUMcjcx0; } - //Parasitic b-e capacitance partitioning: No temperature dependence - cbepar2 = model->HICUMfbepar*model->HICUMcbepar; - cbepar1 = model->HICUMcbepar-cbepar2; + // Parasitic b-e capacitance partitioning: No temperature dependence + cbepar2 = model->HICUMfbepar * model->HICUMcbepar; + cbepar1 = model->HICUMcbepar - cbepar2; - //Avoid divide-by-zero and define infinity other way - //High current correction for 2D and 3D effects + // Avoid divide-by-zero and define infinity other way + // High current correction for 2D and 3D effects if (model->HICUMich != 0.0) { - Oich = 1.0/model->HICUMich; - } else { - Oich = 0.0; + Oich = 1.0 / model->HICUMich; + } + else { + Oich = 0.0; } - //Base current recombination time constant at b-c barrier + // Base current recombination time constant at b-c barrier if (model->HICUMtbhrec != 0.0) { - Otbhrec = 1.0/model->HICUMtbhrec; - } else { + Otbhrec = 1.0 / model->HICUMtbhrec; + } + else { Otbhrec = 0.0; } + // Turn avalanche calculation on depending of parameters + if ((model->HICUMfavl > 0.0) && (model->HICUMcjci0 > 0.0)) { + use_aval = 1; + } else { + use_aval = 0; + } + // end of Model_initialization /* loop through all the instances of the model */ @@ -706,9 +721,9 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vsis = model->HICUMtype*( *(ckt->CKTrhsOld+here->HICUMsubsSINode)- *(ckt->CKTrhsOld+here->HICUMsubsNode)); -// Vbxf = *(ckt->CKTstate0 + here->HICUMvbxf); -// Vbxf1 = *(ckt->CKTstate0 + here->HICUMvbxf1); -// Vbxf2 = *(ckt->CKTstate0 + here->HICUMvbxf2); + Vbxf = *(ckt->CKTstate0 + here->HICUMvxf); + Vbxf1 = *(ckt->CKTstate0 + here->HICUMvxf1); + Vbxf2 = *(ckt->CKTstate0 + here->HICUMvxf2); if (model->HICUMflsh) Vrth = *(ckt->CKTstate0 + here->HICUMvrth); } else if(ckt->CKTmode & MODEINITTRAN) { @@ -744,9 +759,9 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vsis = model->HICUMtype*( *(ckt->CKTrhsOld+here->HICUMsubsSINode)- *(ckt->CKTrhsOld+here->HICUMsubsNode)); -// Vbxf = *(ckt->CKTstate1 + here->HICUMvbxf); -// Vbxf1 = *(ckt->CKTstate1 + here->HICUMvbxf1); -// Vbxf2 = *(ckt->CKTstate1 + here->HICUMvbxf2); + Vbxf = *(ckt->CKTstate1 + here->HICUMvxf); + Vbxf1 = *(ckt->CKTstate1 + here->HICUMvxf1); + Vbxf2 = *(ckt->CKTstate1 + here->HICUMvxf2); if (model->HICUMflsh) Vrth = *(ckt->CKTstate1 + here->HICUMvrth); } else if((ckt->CKTmode & MODEINITJCT) && @@ -759,7 +774,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vbpbi=Vbbp=Vbpe=0.0; Vcic=Veie=Vsis=0.0; Vrth=0.0,Icth=0.0,Icth_Vrth=0.0; -// Vbxf=Vbxf1=Vbxf2=0.0; + Vbxf=Vbxf1=Vbxf2=0.0; } else if((ckt->CKTmode & MODEINITJCT) && (here->HICUMoff==0)) { Vbe=Vbiei=model->HICUMtype*here->HICUMtVcrit; Vciei=0.0; @@ -769,7 +784,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vbpbi=Vbbp=Vbpe=0.0; Vcic=Veie=Vsis=0.0; Vrth=0.0,Icth=0.0,Icth_Vrth=0.0; -// Vbxf=Vbxf1=Vbxf2=0.0; + Vbxf=Vbxf1=Vbxf2=0.0; } else if((ckt->CKTmode & MODEINITJCT) || ( (ckt->CKTmode & MODEINITFIX) && (here->HICUMoff!=0))) { Vbe=0.0; @@ -781,7 +796,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vbpbi=Vbbp=Vbpe=0.0; Vcic=Veie=Vsis=0.0; Vrth=0.0,Icth=0.0,Icth_Vrth=0.0; -// Vbxf=Vbxf1=Vbxf2=0.0; + Vbxf=Vbxf1=Vbxf2=0.0; } else { #ifndef PREDICTOR if(ckt->CKTmode & MODEINITPRED) { @@ -799,16 +814,12 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) xfact * *(ckt->CKTstate2 + here->HICUMvsici); Vbpbi = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvbpbi)- xfact * *(ckt->CKTstate2 + here->HICUMvbpbi); -// Vbxf = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvbxf)- -// xfact * *(ckt->CKTstate2 + here->HICUMvbxf); -// Vbxf1 = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvbxf1)- -// xfact * *(ckt->CKTstate2 + here->HICUMvbxf1); -// Vbxf2 = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvbxf2)- -// xfact * *(ckt->CKTstate2 + here->HICUMvbxf2); - if (model->HICUMflsh) { - Vrth = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HICUMvrth)) - - ( xfact * (*(ckt->CKTstate2 + here->HICUMvrth))); - } + Vbxf = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvxf)- + xfact * *(ckt->CKTstate2 + here->HICUMvxf); + Vbxf1 = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvxf1)- + xfact * *(ckt->CKTstate2 + here->HICUMvxf1); + Vbxf2 = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvxf2)- + xfact * *(ckt->CKTstate2 + here->HICUMvxf2); *(ckt->CKTstate0 + here->HICUMvbiei) = *(ckt->CKTstate1 + here->HICUMvbiei); *(ckt->CKTstate0 + here->HICUMvbpei) = @@ -821,16 +832,12 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate1 + here->HICUMvbpbi); *(ckt->CKTstate0 + here->HICUMvsici) = *(ckt->CKTstate1 + here->HICUMvsici); -// *(ckt->CKTstate0 + here->HICUMvbxf) = -// *(ckt->CKTstate1 + here->HICUMvbxf); -// *(ckt->CKTstate0 + here->HICUMvbxf1) = -// *(ckt->CKTstate1 + here->HICUMvbxf1); -// *(ckt->CKTstate0 + here->HICUMvbxf2) = -// *(ckt->CKTstate1 + here->HICUMvbxf2); - if (model->HICUMflsh) { - *(ckt->CKTstate0 + here->HICUMvrth) = - *(ckt->CKTstate1 + here->HICUMvrth); - } + *(ckt->CKTstate0 + here->HICUMvxf) = + *(ckt->CKTstate1 + here->HICUMvxf); + *(ckt->CKTstate0 + here->HICUMvxf1) = + *(ckt->CKTstate1 + here->HICUMvxf1); + *(ckt->CKTstate0 + here->HICUMvxf2) = + *(ckt->CKTstate1 + here->HICUMvxf2); *(ckt->CKTstate0 + here->HICUMibiei) = *(ckt->CKTstate1 + here->HICUMibiei); *(ckt->CKTstate0 + here->HICUMibiei_Vbiei) = @@ -877,9 +884,22 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate1 + here->HICUMieie); *(ckt->CKTstate0 + here->HICUMisis_Vsis) = *(ckt->CKTstate1 + here->HICUMisis_Vsis); - if (model->HICUMflsh) +//NQS + *(ckt->CKTstate0 + here->HICUMgqxf) = + *(ckt->CKTstate1 + here->HICUMgqxf); + *(ckt->CKTstate0 + here->HICUMixf_Vbiei) = + *(ckt->CKTstate1 + here->HICUMixf_Vbiei); + *(ckt->CKTstate0 + here->HICUMixf_Vbici) = + *(ckt->CKTstate1 + here->HICUMixf_Vbici); + + if (model->HICUMflsh) { + Vrth = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HICUMvrth)) + - ( xfact * (*(ckt->CKTstate2 + here->HICUMvrth))); + *(ckt->CKTstate0 + here->HICUMvrth) = + *(ckt->CKTstate1 + here->HICUMvrth); *(ckt->CKTstate0 + here->HICUMqcth) = *(ckt->CKTstate1 + here->HICUMqcth); + } } else { #endif /* PREDICTOR */ /* @@ -903,9 +923,9 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vsici = model->HICUMtype*( *(ckt->CKTrhsOld+here->HICUMsubsSINode)- *(ckt->CKTrhsOld+here->HICUMcollCINode)); -// Vbxf = *(ckt->CKTrhsOld + here->HICUMxfNode); -// Vbxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); -// Vbxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); + Vbxf = *(ckt->CKTrhsOld + here->HICUMxfNode); + Vbxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); + Vbxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); Vciei = Vbiei - Vbici; if (model->HICUMflsh) Vrth = *(ckt->CKTrhsOld + here->HICUMtempNode); @@ -944,9 +964,9 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vsis = model->HICUMtype*( *(ckt->CKTrhsOld+here->HICUMsubsSINode)- *(ckt->CKTrhsOld+here->HICUMsubsNode)); -// Vbxf = *(ckt->CKTrhsOld + here->HICUMxfNode); -// Vbxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); -// Vbxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); + Vbxf = *(ckt->CKTrhsOld + here->HICUMxfNode); + Vbxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); + Vbxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); if (model->HICUMflsh) Vrth = *(ckt->CKTrhsOld + here->HICUMtempNode); ibieihat = *(ckt->CKTstate0 + here->HICUMibiei) + @@ -1348,23 +1368,40 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) HICDIO(here->HICUMvt,model->HICUMibcis,here->HICUMibcis_t,model->HICUMmbci,Vbici,&ibci,&Ibici_Vbici); //Avalanche current - if((Vbici < 0.0) && (here->HICUMfavl_t > 0.0) && (here->HICUMcjci0_t > 0.0)) { // HICAVL + if (use_aval == 1) { // HICAVL double v_bord,v_q,U0,av,avl,avl_Vbici,v_q_Vbici,av_Vbici; v_bord = here->HICUMvdci_t-Vbici; - v_q = here->HICUMqavl_t/Cjci; - v_q_Vbici = -here->HICUMqavl_t*Cjci_Vbici/(Cjci*Cjci); - U0 = here->HICUMqavl_t/here->HICUMcjci0_t; - if(v_bord > U0) { - av = here->HICUMfavl_t*exp(-v_q/U0); - av_Vbici = -av*v_q_Vbici/U0; - avl = av*(U0+(1.0+v_q/U0)*(v_bord-U0)); - avl_Vbici = av*((-v_q/U0-1)+(v_bord-U0)*v_q_Vbici/U0)+((v_q/U0+1)*(v_bord-U0)+U0)*av_Vbici; - } else { - avl = here->HICUMfavl_t*v_bord*exp(-v_q/v_bord); - avl_Vbici = avl*(-v_q/(v_bord*v_bord)-v_q_Vbici/v_bord)-avl/v_bord; + if (v_bord > 0) { + v_q = here->HICUMqavl_t/Cjci; + v_q_Vbici = -here->HICUMqavl_t*Cjci_Vbici/(Cjci*Cjci); + U0 = here->HICUMqavl_t/here->HICUMcjci0_t; + if(v_bord > U0) { + av = here->HICUMfavl_t*exp(-v_q/U0); + av_Vbici = -av*v_q_Vbici/U0; + avl = av*(U0+(1.0+v_q/U0)*(v_bord-U0)); + avl_Vbici = av*((-v_q/U0-1)+(v_bord-U0)*v_q_Vbici/U0)+((v_q/U0+1)*(v_bord-U0)+U0)*av_Vbici; + } else { + avl = here->HICUMfavl_t*v_bord*exp(-v_q/v_bord); + avl_Vbici = avl*(-v_q/(v_bord*v_bord)-v_q_Vbici/v_bord)-avl/v_bord; + } + /* This model turns strong avalanche on. The parameter kavl can turn this + * model extension off (kavl = 0). Although this is numerically stable, a + * conditional statement is applied in order to reduce the numerical over- + * head for simulations without the new model. + */ + if (model->HICUMkavl > 0) { // HICAVLHIGH + double denom,sq_smooth,hl; + denom = 1-here->HICUMkavl_t*avl; + // Avoid denom < 0 using a smoothing function + sq_smooth = sqrt(denom*denom+0.01); + hl = 0.5*(denom+sq_smooth); + iavl = itf*avl/hl; + iavl_Vbici = itf*avl_Vbici/hl; + } else { + iavl = itf*avl; + iavl_Vbici = itf*avl_Vbici; + } } - iavl = itf*avl; - iavl_Vbici = itf*avl_Vbici; } else { iavl = 0.0; iavl_Vbici = 0.0; @@ -1537,31 +1574,33 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) // Excess Phase calculation -// if ((model->HICUMflnqs != 0 || model->HICUMflcomp == 0.0 || model->HICUMflcomp == 2.1) && Tf != 0 && (model->HICUMalit > 0 || model->HICUMalqf > 0)) { -// double Vxf1, Vxf2, fact; -// Vxf1 = Vbxf1; -// Vxf2 = Vbxf2; -// -// Ixf1 = (Vxf2-itf)/Tf*model->HICUMt0; -// Ixf2 = (Vxf2-Vxf1)/Tf*model->HICUMt0; -// Qxf1 = model->HICUMalit*Vxf1*model->HICUMt0; -// Qxf2 = model->HICUMalit*Vxf2/3*model->HICUMt0; -// Itxf = Vxf2; -// -// Vxf = Vbxf; //for RC nw -// fact = model->HICUMt0/Tf; //for RC nw -// Ixf = (Vxf - Qdei)*fact; //for RC nw -// Qxf = model->HICUMalqf*Vxf*model->HICUMt0; //for RC nw -// Qdeix = Vxf; //for RC nw -// } else { -// Ixf1 = Vbxf1; -// Ixf2 = Vbxf2; -// Qxf1 = 0; -// Qxf2 = 0; -// -// Ixf = Vbxf; -// Qxf = 0; -// } + if ((model->HICUMflnqs != 0 || model->HICUMflcomp == 0.0 || model->HICUMflcomp == 2.1) && Tf != 0 && (model->HICUMalit > 0 || model->HICUMalqf > 0)) { + double Vxf1, Vxf2, fact; + Vxf1 = Vbxf1; + Vxf2 = Vbxf2; + + Ixf1 = (Vxf2-itf)/Tf*model->HICUMt0; + Ixf2 = (Vxf2-Vxf1)/Tf*model->HICUMt0; + Qxf1 = model->HICUMalit*Vxf1*model->HICUMt0; + Qxf2 = model->HICUMalit*Vxf2/3*model->HICUMt0; + Itxf = Vxf2; + + Vxf = Vbxf; //for RC nw + fact = model->HICUMt0/Tf; //for RC nw + Ixf = (Vxf - Qdei)*fact; //for RC nw + Qxf = model->HICUMalqf*Vxf*model->HICUMt0; //for RC nw + Qxf_Vxf = model->HICUMalqf*model->HICUMt0; //for RC nw + Qdeix = Vxf; //for RC nw + } else { + Ixf1 = Vbxf1; + Ixf2 = Vbxf2; + Qxf1 = 0; + Qxf2 = 0; + + Ixf = Vbxf; + Qxf = 0; + Qxf_Vxf = 0; + } // end of Model_evaluation @@ -1676,14 +1715,13 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) } // ******************************************** -// // NQS effect + // NQS effect // Ibxf1 = Ixf1; -//// Icxf1 += ddt(Qxf1); +// Icxf1 += ddt(Qxf1); // Ibxf2 = Ixf2; -//// Icxf2 += ddt(Qxf2); -// -// Ibxf = Ixf; //for RC nw -//// Icxf += ddt(Qxf); //for RC nw +// Icxf2 += ddt(Qxf2); + +// Icxf += ddt(Qxf); //for RC nw // end of Load_sources @@ -1775,6 +1813,8 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate0 + here->HICUMqbcpar1) = Qbcpar1; *(ckt->CKTstate0 + here->HICUMqbcpar2) = Qbcpar2; *(ckt->CKTstate0 + here->HICUMqsu) = Qsu; +//NQS + *(ckt->CKTstate0 + here->HICUMqxf) = Qxf; if (model->HICUMflsh) *(ckt->CKTstate0 + here->HICUMqcth) = Qcth; @@ -1791,6 +1831,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) here->HICUMcapscp = Cscp; here->HICUMcapsu = model->HICUMcsu; here->HICUMcapcth = model->HICUMcth; + here->HICUMcapscp = Cscp; /* * store small-signal parameters @@ -1814,6 +1855,8 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate0 + here->HICUMcqbcpar1) = Qbcpar1_Vbci; *(ckt->CKTstate0 + here->HICUMcqbcpar2) = Qbcpar2_Vbpci; *(ckt->CKTstate0 + here->HICUMcqsu) = Qsu_Vsis; +//NQS + *(ckt->CKTstate0 + here->HICUMcqxf) = Qxf_Vxf; if (model->HICUMflsh) *(ckt->CKTstate0 + here->HICUMcqcth) = model->HICUMcth; continue; /* go to 1000 */ @@ -1854,6 +1897,9 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate0 + here->HICUMqbcpar2) ; *(ckt->CKTstate1 + here->HICUMqsu) = *(ckt->CKTstate0 + here->HICUMqsu) ; +//NQS + *(ckt->CKTstate1 + here->HICUMqxf) = + *(ckt->CKTstate0 + here->HICUMqxf) ; if (model->HICUMflsh) *(ckt->CKTstate1 + here->HICUMqcth) = *(ckt->CKTstate0 + here->HICUMqcth) ; @@ -1912,6 +1958,11 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) if(error) return(error); Isc_Vsc = geq; Isc = *(ckt->CKTstate0 + here->HICUMcqscp); +//NQS + error = NIintegrate(ckt,&geq,&ceq,Qxf_Vxf,here->HICUMqxf); + if(error) return(error); + Iqxf_Vxf = geq; + Iqxf = *(ckt->CKTstate0 + here->HICUMcqxf); if (model->HICUMflsh) { @@ -2242,6 +2293,27 @@ c Branch: sis, Stamp element: Rsu *(here->HICUMsubsSISubsSIPtr) += Isis_Vsis; *(here->HICUMsubsSISubsPtr) += -Isis_Vsis; *(here->HICUMsubsSubsSIPtr) += -Isis_Vsis; +//NQS +/* +c Branch: xf, Stamp element: Ixf +*/ + rhs_current = model->HICUMtype * Ixf; + *(ckt->CKTrhs + here->HICUMxfNode) += -rhs_current; +// *(here->HICUMxfTempPtr) += -Ixf_Vrth; +// *(here->HICUMxfBaseBIPtr) += -Ixf_Vbiei; +// *(here->HICUMxfEmitEIPtr) += +Ixf_Vbiei; +// *(here->HICUMxfBaseBIPtr) += -Ixf_Vbici; +// *(here->HICUMxfCollCIPtr) += +Ixf_Vbici; +/* +c Branch: xf, Stamp element: Qxf +*/ + rhs_current = model->HICUMtype * (Iqxf - Iqxf_Vxf*Vxf); + *(ckt->CKTrhs + here->HICUMxfNode) += -rhs_current; + *(here->HICUMxfXfPtr) += Iqxf_Vxf; +/* +c Branch: xf, Stamp element: Rxf +*/ + *(here->HICUMxfXfPtr) += 1.0; if (model->HICUMflsh) { /* diff --git a/src/spicelib/devices/hicum2/hicummask.c b/src/spicelib/devices/hicum2/hicummask.c index b6269c067..65d41022c 100644 --- a/src/spicelib/devices/hicum2/hicummask.c +++ b/src/spicelib/devices/hicum2/hicummask.c @@ -135,12 +135,18 @@ HICUMmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value) case HICUM_MOD_QAVL: value->rValue = here->HICUMqavl; return(OK); + case HICUM_MOD_KAVL: + value->rValue = here->HICUMkavl; + return(OK); case HICUM_MOD_ALFAV: value->rValue = here->HICUMalfav; return(OK); case HICUM_MOD_ALQAV: value->rValue = here->HICUMalqav; return(OK); + case HICUM_MOD_ALKAV: + value->rValue = here->HICUMalkav; + return(OK); //Series resistances case HICUM_MOD_RBI0: diff --git a/src/spicelib/devices/hicum2/hicummpar.c b/src/spicelib/devices/hicum2/hicummpar.c index 6896f5438..c59232a3a 100644 --- a/src/spicelib/devices/hicum2/hicummpar.c +++ b/src/spicelib/devices/hicum2/hicummpar.c @@ -171,6 +171,10 @@ HICUMmParam(int param, IFvalue *value, GENmodel *inModel) model->HICUMqavl = value->rValue; model->HICUMqavlGiven = TRUE; break; + case HICUM_MOD_KAVL: + model->HICUMkavl = value->rValue; + model->HICUMkavlGiven = TRUE; + break; case HICUM_MOD_ALFAV: model->HICUMalfav = value->rValue; model->HICUMalfavGiven = TRUE; @@ -179,6 +183,10 @@ HICUMmParam(int param, IFvalue *value, GENmodel *inModel) model->HICUMalqav = value->rValue; model->HICUMalqavGiven = TRUE; break; + case HICUM_MOD_ALKAV: + model->HICUMalkav = value->rValue; + model->HICUMalkavGiven = TRUE; + break; //Series resistances case HICUM_MOD_RBI0: diff --git a/src/spicelib/devices/hicum2/hicumsetup.c b/src/spicelib/devices/hicum2/hicumsetup.c index bfba3dbc2..42eeeef95 100644 --- a/src/spicelib/devices/hicum2/hicumsetup.c +++ b/src/spicelib/devices/hicum2/hicumsetup.c @@ -38,433 +38,441 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) for( ; model != NULL; model = HICUMnextModel(model)) { //Circuit simulator specific parameters - if(model->HICUMtype != NPN && model->HICUMtype != PNP) { + if(model->HICUMtype != NPN && model->HICUMtype != PNP) model->HICUMtype = NPN; - } - if(!model->HICUMtnomGiven) { - model->HICUMtnom = ckt->CKTnomTemp; - } -//Transfer current - if(!model->HICUMc10Given) { - model->HICUMc10 = 2e-30; - } - if(!model->HICUMqp0Given) { - model->HICUMqp0 = 2e-14; - } - if(!model->HICUMichGiven) { - model->HICUMich = 0.0; - } - if(!model->HICUMhf0Given) { - model->HICUMhf0 = 1.0; - } - if(!model->HICUMhfeGiven) { - model->HICUMhfe = 1.0; - } - if(!model->HICUMhfcGiven) { - model->HICUMhfc = 1.0; - } - if(!model->HICUMhjeiGiven) { - model->HICUMhjei = 1.0; - } - if(!model->HICUMahjeiGiven) { - model->HICUMahjei = 0.0; - } - if(!model->HICUMrhjeiGiven) { - model->HICUMrhjei = 1.0; - } - if(!model->HICUMhjciGiven) { - model->HICUMhjci = 1.0; - } -//Base-Emitter diode; - if(!model->HICUMibeisGiven) { - model->HICUMibeis = 1e-18; - } - if(!model->HICUMmbeiGiven) { - model->HICUMmbei = 1.0; - } - if(!model->HICUMireisGiven) { - model->HICUMireis = 0.0; - } - if(!model->HICUMmreiGiven) { - model->HICUMmrei = 2.0; - } - if(!model->HICUMibepsGiven) { - model->HICUMibeps = 0.0; - } - if(!model->HICUMmbepGiven) { - model->HICUMmbep = 1.0; - } - if(!model->HICUMirepsGiven) { - model->HICUMireps = 0.0; - } - if(!model->HICUMmrepGiven) { - model->HICUMmrep = 2.0; - } - if(!model->HICUMmcfGiven) { - model->HICUMmcf = 1.0; - } -//Transit time for excess recombination current at b-c barrier - if(!model->HICUMtbhrecGiven) { - model->HICUMtbhrec = 0.0; - } -//Base-Collector diode currents - if(!model->HICUMibcisGiven) { - model->HICUMibcis = 1e-16; - } - if(!model->HICUMmbciGiven) { - model->HICUMmbci = 1.0; - } - if(!model->HICUMibcxsGiven) { - model->HICUMibcxs = 0.0; - } - if(!model->HICUMmbcxGiven) { - model->HICUMmbcx = 1.0; - } -//Base-Emitter tunneling current - if(!model->HICUMibetsGiven) { - model->HICUMibets = 0.0; - } - if(!model->HICUMabetGiven) { - model->HICUMabet = 40.0; - } - if(!model->HICUMtunodeGiven) { - model->HICUMtunode = 1; - } -//Base-Collector avalanche current - if(!model->HICUMfavlGiven) { - model->HICUMfavl = 0.0; - } - if(!model->HICUMqavlGiven) { - model->HICUMqavl = 0.0; - } - if(!model->HICUMalfavGiven) { - model->HICUMalfav = 0.0; - } - if(!model->HICUMalqavGiven) { - model->HICUMalqav = 0.0; - } -//Series resistances - if(!model->HICUMrbi0Given) { - model->HICUMrbi0 = MIN_R; - } - if(!model->HICUMrbxGiven) { - model->HICUMrbx = MIN_R; - } - if(!model->HICUMfgeoGiven) { - model->HICUMfgeo = 0.6557; - } - if(!model->HICUMfdqr0Given) { - model->HICUMfdqr0 = 0.0; - } - if(!model->HICUMfcrbiGiven) { - model->HICUMfcrbi = 0.0; - } - if(!model->HICUMfqiGiven) { - model->HICUMfqi = 1.0; - } - if(!model->HICUMreGiven) { - model->HICUMre = MIN_R; - } - if(!model->HICUMrcxGiven) { - model->HICUMrcx = MIN_R; - } -//Substrate transistor - if(!model->HICUMitssGiven) { - model->HICUMitss = 0.0; - } - if(!model->HICUMmsfGiven) { - model->HICUMmsf = 1.0; - } - if(!model->HICUMiscsGiven) { - model->HICUMiscs = 0.0; - } - if(!model->HICUMmscGiven) { - model->HICUMmsc = 1.0; - } - if(!model->HICUMtsfGiven) { - model->HICUMtsf = 0.0; - } -//Intra-device substrate coupling - if(!model->HICUMrsuGiven) { - model->HICUMrsu = MIN_R; - } - if(!model->HICUMcsuGiven) { - model->HICUMcsu = 0.0; - } -//Depletion Capacitances - if(!model->HICUMcjei0Given) { - model->HICUMcjei0 = 1.0e-20; - } - if(!model->HICUMvdeiGiven) { - model->HICUMvdei = 0.9; - } - if(!model->HICUMzeiGiven) { - model->HICUMzei = 0.5; - } - if(!model->HICUMajeiGiven) { - model->HICUMajei = 2.5; - } - if(!model->HICUMcjep0Given) { - model->HICUMcjep0 = 1.0e-20; - } - if(!model->HICUMvdepGiven) { - model->HICUMvdep = 0.9; - } - if(!model->HICUMzepGiven) { - model->HICUMzep = 0.5; - } - if(!model->HICUMajepGiven) { - model->HICUMajep = 2.5; - } - if(!model->HICUMcjci0Given) { - model->HICUMcjci0 = 1.0e-20; - } - if(!model->HICUMvdciGiven) { - model->HICUMvdci = 0.7; - } - if(!model->HICUMzciGiven) { - model->HICUMzci = 0.4; - } - if(!model->HICUMvptciGiven) { - model->HICUMvptci = 100.0; - } - if(!model->HICUMcjcx0Given) { - model->HICUMcjcx0 = 1.0e-20; - } - if(!model->HICUMvdcxGiven) { - model->HICUMvdcx = 0.7; - } - if(!model->HICUMzcxGiven) { - model->HICUMzcx = 0.4; - } - if(!model->HICUMvptcxGiven) { - model->HICUMvptcx = 100.0; - } - if(!model->HICUMfbcparGiven) { - model->HICUMfbcpar = 0.0; - } - if(!model->HICUMfbeparGiven) { - model->HICUMfbepar = 1.0; - } - if(!model->HICUMcjs0Given) { - model->HICUMcjs0 = 0.0; - } - if(!model->HICUMvdsGiven) { - model->HICUMvds = 0.6; - } - if(!model->HICUMzsGiven) { - model->HICUMzs = 0.5; - } - if(!model->HICUMvptsGiven) { - model->HICUMvpts = 100.0; - } - if(!model->HICUMcscp0Given) { - model->HICUMcscp0 = 0.0; - } - if(!model->HICUMvdspGiven) { - model->HICUMvdsp = 0.6; - } - if(!model->HICUMzspGiven) { - model->HICUMzsp = 0.5; - } - if(!model->HICUMvptspGiven) { - model->HICUMvptsp = 100.0; - } -//Diffusion Capacitances - if(!model->HICUMt0Given) { - model->HICUMt0 = 0.0; - } - if(!model->HICUMdt0hGiven) { - model->HICUMdt0h = 0.0; - } - if(!model->HICUMtbvlGiven) { - model->HICUMtbvl = 0.0; - } - if(!model->HICUMtef0Given) { - model->HICUMtef0 = 0.0; - } - if(!model->HICUMgtfeGiven) { - model->HICUMgtfe = 1.0; - } - if(!model->HICUMthcsGiven) { - model->HICUMthcs = 0.0; - } - if(!model->HICUMahcGiven) { - model->HICUMahc = 0.1; - } - if(!model->HICUMfthcGiven) { - model->HICUMfthc = 0.0; - } - if(!model->HICUMrci0Given) { - model->HICUMrci0 = 150; - } - if(!model->HICUMvlimGiven) { - model->HICUMvlim = 0.5; - } - if(!model->HICUMvcesGiven) { - model->HICUMvces = 0.1; - } - if(!model->HICUMvptGiven) { - model->HICUMvpt = 100.0; - } - if(!model->HICUMaickGiven) { - model->HICUMaick = 1.0e-03; - } - if(!model->HICUMdelckGiven) { - model->HICUMdelck = 2.0; - } - if(!model->HICUMtrGiven) { - model->HICUMtr = 0.0; - } - if(!model->HICUMvcbarGiven) { - model->HICUMvcbar = 0.0; - } - if(!model->HICUMicbarGiven) { - model->HICUMicbar = 0.0; - } - if(!model->HICUMacbarGiven) { - model->HICUMacbar = 0.01; - } -//Isolation Capacitances - if(!model->HICUMcbeparGiven) { - model->HICUMcbepar = 0.0; - } - if(!model->HICUMcbcparGiven) { - model->HICUMcbcpar = 0.0; - } -//Non-quasi-static Effect - if(!model->HICUMalqfGiven) { - model->HICUMalqf = 0.167; - } - if(!model->HICUMalitGiven) { - model->HICUMalit = 0.333; - } - if(!model->HICUMflnqsGiven) { - model->HICUMflnqs = 0; - } -//Noise - if(!model->HICUMkfGiven) { - model->HICUMkf = 0.0; - } - if(!model->HICUMafGiven) { - model->HICUMaf = 2.0; - } - if(!model->HICUMcfbeGiven) { - model->HICUMcfbe = -1; - } - if(!model->HICUMflconoGiven) { - model->HICUMflcono = 0; - } - if(!model->HICUMkfreGiven) { - model->HICUMkfre = 0.0; - } - if(!model->HICUMafreGiven) { - model->HICUMafre = 2.0; - } -//Lateral Geometry Scaling (at high current densities) - if(!model->HICUMlatbGiven) { - model->HICUMlatb = 0.0; - } - if(!model->HICUMlatlGiven) { - model->HICUMlatl = 0.0; - } -//Temperature dependence - if(!model->HICUMvgbGiven) { - model->HICUMvgb = 1.17; - } - if(!model->HICUMalt0Given) { - model->HICUMalt0 = 0.0; - } - if(!model->HICUMkt0Given) { - model->HICUMkt0 = 0.0; - } - if(!model->HICUMzetaciGiven) { - model->HICUMzetaci = 0.0; - } - if(!model->HICUMalvsGiven) { - model->HICUMalvs = 0.0; - } - if(!model->HICUMalcesGiven) { - model->HICUMalces = 0.0; - } - if(!model->HICUMzetarbiGiven) { - model->HICUMzetarbi = 0.0; - } - if(!model->HICUMzetarbxGiven) { - model->HICUMzetarbx = 0.0; - } - if(!model->HICUMzetarcxGiven) { - model->HICUMzetarcx = 0.0; - } - if(!model->HICUMzetareGiven) { - model->HICUMzetare = 0.0; - } - if(!model->HICUMzetacxGiven) { - model->HICUMzetacx = 1.0; - } - if(!model->HICUMvgeGiven) { - model->HICUMvge = 1.17; - } - if(!model->HICUMvgcGiven) { - model->HICUMvgc = 1.17; - } - if(!model->HICUMvgsGiven) { - model->HICUMvgs = 1.17; - } - if(!model->HICUMf1vgGiven) { - model->HICUMf1vg = -1.02377e-4; - } - if(!model->HICUMf2vgGiven) { - model->HICUMf2vg = 4.3215e-4; - } - if(!model->HICUMzetactGiven) { - model->HICUMzetact = 3.0; - } - if(!model->HICUMzetabetGiven) { - model->HICUMzetabet = 3.5; - } - if(!model->HICUMalbGiven) { - model->HICUMalb = 0.0; - } - if(!model->HICUMdvgbeGiven) { - model->HICUMdvgbe = 0.0; - } - if(!model->HICUMzetahjeiGiven) { - model->HICUMzetahjei = 1.0; - } - if(!model->HICUMzetavgbeGiven) { - model->HICUMzetavgbe = 1.0; - } -//Self-Heating - if(!model->HICUMflshGiven) { - model->HICUMflsh = 0; - } - if(!model->HICUMrthGiven) { - model->HICUMrth = 0.0; - } - if(!model->HICUMzetarthGiven) { - model->HICUMzetarth = 0.0; - } - if(!model->HICUMalrthGiven) { - model->HICUMalrth = 0.0; - } - if(!model->HICUMcthGiven) { - model->HICUMcth = 0.0; - } -//Compatibility with V2.1 - if(!model->HICUMflcompGiven) { - model->HICUMflcomp = 0.0; - } - if(!model->HICUMvbeMaxGiven) { + if(!model->HICUMtnomGiven) + model->HICUMtnom = ckt->CKTnomTemp; + +//Transfer current + if(!model->HICUMc10Given) + model->HICUMc10 = 2e-30; + + if(!model->HICUMqp0Given) + model->HICUMqp0 = 2e-14; + + if(!model->HICUMichGiven) + model->HICUMich = 0.0; + + if(!model->HICUMhf0Given) + model->HICUMhf0 = 1.0; + + if(!model->HICUMhfeGiven) + model->HICUMhfe = 1.0; + + if(!model->HICUMhfcGiven) + model->HICUMhfc = 1.0; + + if(!model->HICUMhjeiGiven) + model->HICUMhjei = 1.0; + + if(!model->HICUMahjeiGiven) + model->HICUMahjei = 0.0; + + if(!model->HICUMrhjeiGiven) + model->HICUMrhjei = 1.0; + + if(!model->HICUMhjciGiven) + model->HICUMhjci = 1.0; + +//Base-Emitter diode; + if(!model->HICUMibeisGiven) + model->HICUMibeis = 1e-18; + + if(!model->HICUMmbeiGiven) + model->HICUMmbei = 1.0; + + if(!model->HICUMireisGiven) + model->HICUMireis = 0.0; + + if(!model->HICUMmreiGiven) + model->HICUMmrei = 2.0; + + if(!model->HICUMibepsGiven) + model->HICUMibeps = 0.0; + + if(!model->HICUMmbepGiven) + model->HICUMmbep = 1.0; + + if(!model->HICUMirepsGiven) + model->HICUMireps = 0.0; + + if(!model->HICUMmrepGiven) + model->HICUMmrep = 2.0; + + if(!model->HICUMmcfGiven) + model->HICUMmcf = 1.0; + +//Transit time for excess recombination current at b-c barrier + if(!model->HICUMtbhrecGiven) + model->HICUMtbhrec = 0.0; + +//Base-Collector diode currents + if(!model->HICUMibcisGiven) + model->HICUMibcis = 1e-16; + + if(!model->HICUMmbciGiven) + model->HICUMmbci = 1.0; + + if(!model->HICUMibcxsGiven) + model->HICUMibcxs = 0.0; + + if(!model->HICUMmbcxGiven) + model->HICUMmbcx = 1.0; + +//Base-Emitter tunneling current + if(!model->HICUMibetsGiven) + model->HICUMibets = 0.0; + + if(!model->HICUMabetGiven) + model->HICUMabet = 40.0; + + if(!model->HICUMtunodeGiven) + model->HICUMtunode = 1; + +//Base-Collector avalanche current + if(!model->HICUMfavlGiven) + model->HICUMfavl = 0.0; + + if(!model->HICUMqavlGiven) + model->HICUMqavl = 0.0; + + if(!model->HICUMkavlGiven) + model->HICUMkavl = 0.0; + + if(!model->HICUMalfavGiven) + model->HICUMalfav = 0.0; + + if(!model->HICUMalqavGiven) + model->HICUMalqav = 0.0; + + if(!model->HICUMalkavGiven) + model->HICUMalkav = 0.0; + +//Series resistances + if(!model->HICUMrbi0Given) + model->HICUMrbi0 = MIN_R; + + if(!model->HICUMrbxGiven) + model->HICUMrbx = MIN_R; + + if(!model->HICUMfgeoGiven) + model->HICUMfgeo = 0.6557; + + if(!model->HICUMfdqr0Given) + model->HICUMfdqr0 = 0.0; + + if(!model->HICUMfcrbiGiven) + model->HICUMfcrbi = 0.0; + + if(!model->HICUMfqiGiven) + model->HICUMfqi = 1.0; + + if(!model->HICUMreGiven) + model->HICUMre = MIN_R; + + if(!model->HICUMrcxGiven) + model->HICUMrcx = MIN_R; + +//Substrate transistor + if(!model->HICUMitssGiven) + model->HICUMitss = 0.0; + + if(!model->HICUMmsfGiven) + model->HICUMmsf = 1.0; + + if(!model->HICUMiscsGiven) + model->HICUMiscs = 0.0; + + if(!model->HICUMmscGiven) + model->HICUMmsc = 1.0; + + if(!model->HICUMtsfGiven) + model->HICUMtsf = 0.0; + +//Intra-device substrate coupling + if(!model->HICUMrsuGiven) + model->HICUMrsu = MIN_R; + + if(!model->HICUMcsuGiven) + model->HICUMcsu = 0.0; + +//Depletion Capacitances + if(!model->HICUMcjei0Given) + model->HICUMcjei0 = 1.0e-20; + + if(!model->HICUMvdeiGiven) + model->HICUMvdei = 0.9; + + if(!model->HICUMzeiGiven) + model->HICUMzei = 0.5; + + if(!model->HICUMajeiGiven) + model->HICUMajei = 2.5; + + if(!model->HICUMcjep0Given) + model->HICUMcjep0 = 1.0e-20; + + if(!model->HICUMvdepGiven) + model->HICUMvdep = 0.9; + + if(!model->HICUMzepGiven) + model->HICUMzep = 0.5; + + if(!model->HICUMajepGiven) + model->HICUMajep = 2.5; + + if(!model->HICUMcjci0Given) + model->HICUMcjci0 = 1.0e-20; + + if(!model->HICUMvdciGiven) + model->HICUMvdci = 0.7; + + if(!model->HICUMzciGiven) + model->HICUMzci = 0.4; + + if(!model->HICUMvptciGiven) + model->HICUMvptci = 100.0; + + if(!model->HICUMcjcx0Given) + model->HICUMcjcx0 = 1.0e-20; + + if(!model->HICUMvdcxGiven) + model->HICUMvdcx = 0.7; + + if(!model->HICUMzcxGiven) + model->HICUMzcx = 0.4; + + if(!model->HICUMvptcxGiven) + model->HICUMvptcx = 100.0; + + if(!model->HICUMfbcparGiven) + model->HICUMfbcpar = 0.0; + + if(!model->HICUMfbeparGiven) + model->HICUMfbepar = 1.0; + + if(!model->HICUMcjs0Given) + model->HICUMcjs0 = 0.0; + + if(!model->HICUMvdsGiven) + model->HICUMvds = 0.6; + + if(!model->HICUMzsGiven) + model->HICUMzs = 0.5; + + if(!model->HICUMvptsGiven) + model->HICUMvpts = 100.0; + + if(!model->HICUMcscp0Given) + model->HICUMcscp0 = 0.0; + + if(!model->HICUMvdspGiven) + model->HICUMvdsp = 0.6; + + if(!model->HICUMzspGiven) + model->HICUMzsp = 0.5; + + if(!model->HICUMvptspGiven) + model->HICUMvptsp = 100.0; + +//Diffusion Capacitances + if(!model->HICUMt0Given) + model->HICUMt0 = 0.0; + + if(!model->HICUMdt0hGiven) + model->HICUMdt0h = 0.0; + + if(!model->HICUMtbvlGiven) + model->HICUMtbvl = 0.0; + + if(!model->HICUMtef0Given) + model->HICUMtef0 = 0.0; + + if(!model->HICUMgtfeGiven) + model->HICUMgtfe = 1.0; + + if(!model->HICUMthcsGiven) + model->HICUMthcs = 0.0; + + if(!model->HICUMahcGiven) + model->HICUMahc = 0.1; + + if(!model->HICUMfthcGiven) + model->HICUMfthc = 0.0; + + if(!model->HICUMrci0Given) + model->HICUMrci0 = 150; + + if(!model->HICUMvlimGiven) + model->HICUMvlim = 0.5; + + if(!model->HICUMvcesGiven) + model->HICUMvces = 0.1; + + if(!model->HICUMvptGiven) + model->HICUMvpt = 100.0; + + if(!model->HICUMaickGiven) + model->HICUMaick = 1.0e-03; + + if(!model->HICUMdelckGiven) + model->HICUMdelck = 2.0; + + if(!model->HICUMtrGiven) + model->HICUMtr = 0.0; + + if(!model->HICUMvcbarGiven) + model->HICUMvcbar = 0.0; + + if(!model->HICUMicbarGiven) + model->HICUMicbar = 0.0; + + if(!model->HICUMacbarGiven) + model->HICUMacbar = 0.01; + +//Isolation Capacitances + if(!model->HICUMcbeparGiven) + model->HICUMcbepar = 0.0; + + if(!model->HICUMcbcparGiven) + model->HICUMcbcpar = 0.0; + +//Non-quasi-static Effect + if(!model->HICUMalqfGiven) + model->HICUMalqf = 0.167; + + if(!model->HICUMalitGiven) + model->HICUMalit = 0.333; + + if(!model->HICUMflnqsGiven) + model->HICUMflnqs = 0; + +//Noise + if(!model->HICUMkfGiven) + model->HICUMkf = 0.0; + + if(!model->HICUMafGiven) + model->HICUMaf = 2.0; + + if(!model->HICUMcfbeGiven) + model->HICUMcfbe = -1; + + if(!model->HICUMflconoGiven) + model->HICUMflcono = 0; + + if(!model->HICUMkfreGiven) + model->HICUMkfre = 0.0; + + if(!model->HICUMafreGiven) + model->HICUMafre = 2.0; + +//Lateral Geometry Scaling (at high current densities) + if(!model->HICUMlatbGiven) + model->HICUMlatb = 0.0; + + if(!model->HICUMlatlGiven) + model->HICUMlatl = 0.0; + +//Temperature dependence + if(!model->HICUMvgbGiven) + model->HICUMvgb = 1.17; + + if(!model->HICUMalt0Given) + model->HICUMalt0 = 0.0; + + if(!model->HICUMkt0Given) + model->HICUMkt0 = 0.0; + + if(!model->HICUMzetaciGiven) + model->HICUMzetaci = 0.0; + + if(!model->HICUMalvsGiven) + model->HICUMalvs = 0.0; + + if(!model->HICUMalcesGiven) + model->HICUMalces = 0.0; + + if(!model->HICUMzetarbiGiven) + model->HICUMzetarbi = 0.0; + + if(!model->HICUMzetarbxGiven) + model->HICUMzetarbx = 0.0; + + if(!model->HICUMzetarcxGiven) + model->HICUMzetarcx = 0.0; + + if(!model->HICUMzetareGiven) + model->HICUMzetare = 0.0; + + if(!model->HICUMzetacxGiven) + model->HICUMzetacx = 1.0; + + if(!model->HICUMvgeGiven) + model->HICUMvge = 1.17; + + if(!model->HICUMvgcGiven) + model->HICUMvgc = 1.17; + + if(!model->HICUMvgsGiven) + model->HICUMvgs = 1.17; + + if(!model->HICUMf1vgGiven) + model->HICUMf1vg = -1.02377e-4; + + if(!model->HICUMf2vgGiven) + model->HICUMf2vg = 4.3215e-4; + + if(!model->HICUMzetactGiven) + model->HICUMzetact = 3.0; + + if(!model->HICUMzetabetGiven) + model->HICUMzetabet = 3.5; + + if(!model->HICUMalbGiven) + model->HICUMalb = 0.0; + + if(!model->HICUMdvgbeGiven) + model->HICUMdvgbe = 0.0; + + if(!model->HICUMzetahjeiGiven) + model->HICUMzetahjei = 1.0; + + if(!model->HICUMzetavgbeGiven) + model->HICUMzetavgbe = 1.0; + +//Self-Heating + if(!model->HICUMflshGiven) + model->HICUMflsh = 0; + + if(!model->HICUMrthGiven) + model->HICUMrth = 0.0; + + if(!model->HICUMzetarthGiven) + model->HICUMzetarth = 0.0; + + if(!model->HICUMalrthGiven) + model->HICUMalrth = 0.0; + + if(!model->HICUMcthGiven) + model->HICUMcth = 0.0; + + if((model->HICUMrthGiven) && (model->HICUMcth < 1e-12)) + model->HICUMcth = 1e-12; + +//Compatibility with V2.1 + if(!model->HICUMflcompGiven) + model->HICUMflcomp = 0.0; + + + if(!model->HICUMvbeMaxGiven) model->HICUMvbeMax = 1e99; - } - if(!model->HICUMvbcMaxGiven) { + + if(!model->HICUMvbcMaxGiven) model->HICUMvbcMax = 1e99; - } - if(!model->HICUMvceMaxGiven) { + + if(!model->HICUMvceMaxGiven) model->HICUMvceMax = 1e99; - } /* loop through all the instances of the model */ for (here = HICUMinstances(model); here != NULL ; @@ -552,26 +560,23 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) here->HICUMbaseBINode = tmp->number; } -// if(here->HICUMxfNode == 0) { -// error = CKTmkVolt(ckt, &tmp, here->HICUMname, "xf"); -// if(error) return(error); -// here->HICUMxfNode = tmp->number; -// } -// -// if(here->HICUMxf1Node == 0) { -// error = CKTmkVolt(ckt, &tmp, here->HICUMname, "xf1"); -// if(error) return(error); -// here->HICUMxf1Node = tmp->number; -// } -// -// if(here->HICUMxf2Node == 0) { -// error = CKTmkVolt(ckt, &tmp, here->HICUMname, "xf2"); -// if(error) return(error); -// here->HICUMxf2Node = tmp->number; -// } + if(here->HICUMxfNode == 0) { + error = CKTmkVolt(ckt, &tmp, here->HICUMname, "xf"); + if(error) return(error); + here->HICUMxfNode = tmp->number; + } - if((model->HICUMrthGiven) && (model->HICUMcth < 1e-12)) - model->HICUMcth = 1e-12; + if(here->HICUMxf1Node == 0) { + error = CKTmkVolt(ckt, &tmp, here->HICUMname, "xf1"); + if(error) return(error); + here->HICUMxf1Node = tmp->number; + } + + if(here->HICUMxf2Node == 0) { + error = CKTmkVolt(ckt, &tmp, here->HICUMname, "xf2"); + if(error) return(error); + here->HICUMxf2Node = tmp->number; + } /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ @@ -636,9 +641,9 @@ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(HICUMsubsCollPtr,HICUMsubsNode,HICUMcollNode); //s-c TSTALLOC(HICUMcollSubsPtr,HICUMcollNode,HICUMsubsNode); //c-s -// TSTALLOC(HICUMxfXfPtr,HICUMxfNode,HICUMxfNode); -// TSTALLOC(HICUMxf1Xf1Ptr,HICUMxf1Node,HICUMxf1Node); -// TSTALLOC(HICUMxf2Xf2Ptr,HICUMxf2Node,HICUMxf2Node); + TSTALLOC(HICUMxfXfPtr,HICUMxfNode,HICUMxfNode); + TSTALLOC(HICUMxf1Xf1Ptr,HICUMxf1Node,HICUMxf1Node); + TSTALLOC(HICUMxf2Xf2Ptr,HICUMxf2Node,HICUMxf2Node); if (model->HICUMflsh) { TSTALLOC(HICUMcollTempPtr,HICUMcollNode,HICUMtempNode); @@ -702,6 +707,19 @@ HICUMunsetup( && here->HICUMcollCINode != here->HICUMcollNode) CKTdltNNum(ckt, here->HICUMcollCINode); here->HICUMcollCINode = 0; + + if(here->HICUMxfNode > 0) + CKTdltNNum(ckt, here->HICUMxfNode); + here->HICUMxfNode = 0; + + if(here->HICUMxf1Node > 0) + CKTdltNNum(ckt, here->HICUMxf1Node); + here->HICUMxf1Node = 0; + + if(here->HICUMxf2Node > 0) + CKTdltNNum(ckt, here->HICUMxf2Node); + here->HICUMxf2Node = 0; + } } return OK; diff --git a/src/spicelib/devices/hicum2/hicumtemp.c b/src/spicelib/devices/hicum2/hicumtemp.c index b04d76a19..9c9e13986 100644 --- a/src/spicelib/devices/hicum2/hicumtemp.c +++ b/src/spicelib/devices/hicum2/hicumtemp.c @@ -253,6 +253,7 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance) //Avalanche current factors here->HICUMfavl_t = model->HICUMfavl*exp(model->HICUMalfav*dT); here->HICUMqavl_t = model->HICUMqavl*exp(model->HICUMalqav*dT); + here->HICUMkavl_t = model->HICUMkavl*exp(model->HICUMalkav*dT); //Zero bias internal base resistance here->HICUMrbi0_t = model->HICUMrbi0*exp(model->HICUMzetarbi*here->HICUMln_qtt0);