introduce first excess phase network and update to 2.4.0

This commit is contained in:
dwarning 2020-01-25 14:57:55 +01:00
parent 85c34cfb0f
commit c318ef15ee
7 changed files with 689 additions and 566 deletions

View File

@ -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"),

View File

@ -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,

View File

@ -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) {
/*

View File

@ -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:

View File

@ -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:

View File

@ -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;

View File

@ -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);