zwischenstand
This commit is contained in:
parent
84307c4acf
commit
b32bf6dd14
|
|
@ -719,16 +719,16 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
};
|
||||
|
||||
//Hole charge at low bias
|
||||
std::function<duals::duald (duals::duald, duals::duald, duals::duald)> calc_Q_0 = [&](duals::duald Qjei, duals::duald Qjci, duals::duald hjei_vbe){
|
||||
//Hole charge at low bias
|
||||
duals::duald Q_0, b_q, Q_bpt ;
|
||||
a_bpt = 0.05;
|
||||
Q_0 = here->HICUMqp0_t + hjei_vbe*Qjei + model->HICUMhjci*Qjci;
|
||||
Q_bpt = a_bpt*here->HICUMqp0_t;
|
||||
b_q = Q_0/Q_bpt-1;
|
||||
Q_0 = Q_bpt*(1+(b_q +sqrt(b_q*b_q+1.921812))/2);
|
||||
return Q_0;
|
||||
};
|
||||
// std::function<duals::duald (duals::duald, duals::duald, duals::duald)> calc_Q_0 = [&](duals::duald Qjei, duals::duald Qjci, duals::duald hjei_vbe){
|
||||
// //Hole charge at low bias
|
||||
// duals::duald Q_0, b_q, Q_bpt ;
|
||||
// a_bpt = 0.05;
|
||||
// Q_0 = here->HICUMqp0_t + hjei_vbe*Qjei + model->HICUMhjci*Qjci;
|
||||
// Q_bpt = a_bpt*here->HICUMqp0_t;
|
||||
// b_q = Q_0/Q_bpt-1;
|
||||
// Q_0 = Q_bpt*(1+(b_q +sqrt(b_q*b_q+1.921812))/2);
|
||||
// return Q_0;
|
||||
// };
|
||||
|
||||
/* loop through all the models */
|
||||
for (; model != NULL; model = HICUMnextModel(model)) {
|
||||
|
|
@ -1289,513 +1289,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
// return double(1);
|
||||
// };
|
||||
|
||||
/* loop through all the instances of the model */
|
||||
for (here = HICUMinstances(model); here != NULL ;
|
||||
here=HICUMnextInstance(here)) {
|
||||
|
||||
gqbepar1 = 0.0;
|
||||
gqbepar2 = 0.0;
|
||||
gqbcpar1 = 0.0;
|
||||
gqbcpar2 = 0.0;
|
||||
gqsu = 0.0;
|
||||
Icth = 0.0, Icth_Vrth = 0.0;
|
||||
|
||||
// SCALE = here->HICUMarea * here->HICUMm;
|
||||
|
||||
/*
|
||||
* initialization
|
||||
*/
|
||||
icheck=1;
|
||||
if(ckt->CKTmode & MODEINITSMSIG) {
|
||||
Vbiei = *(ckt->CKTstate0 + here->HICUMvbiei);
|
||||
Vbici = *(ckt->CKTstate0 + here->HICUMvbici);
|
||||
Vciei = Vbiei - Vbici;
|
||||
Vbpei = *(ckt->CKTstate0 + here->HICUMvbpei);
|
||||
Vbpci = *(ckt->CKTstate0 + here->HICUMvbpci);
|
||||
Vbci = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMcollCINode));
|
||||
Vsici = *(ckt->CKTstate0 + here->HICUMvsici);
|
||||
Vsc = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMsubsNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMcollNode));
|
||||
|
||||
Vbpbi = *(ckt->CKTstate0 + here->HICUMvbpbi);
|
||||
Vbe = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMemitNode));
|
||||
Vcic = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMcollCINode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMcollNode));
|
||||
Vbbp = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseBPNode));
|
||||
Vbpe = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseBPNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMemitNode));
|
||||
Veie = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMemitEINode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMemitNode));
|
||||
Vsis = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMsubsSINode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMsubsNode));
|
||||
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) {
|
||||
Vbiei = *(ckt->CKTstate1 + here->HICUMvbiei);
|
||||
Vbici = *(ckt->CKTstate1 + here->HICUMvbici);
|
||||
Vciei = Vbiei - Vbici;
|
||||
Vbpei = *(ckt->CKTstate1 + here->HICUMvbpei);
|
||||
Vbpci = *(ckt->CKTstate1 + here->HICUMvbpci);
|
||||
Vbci = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMcollCINode));
|
||||
Vsici = *(ckt->CKTstate1 + here->HICUMvsici);
|
||||
Vsc = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMsubsNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMcollNode));
|
||||
|
||||
Vbpbi = *(ckt->CKTstate1 + here->HICUMvbpbi);
|
||||
Vbe = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMemitNode));
|
||||
Vcic = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMcollCINode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMcollNode));
|
||||
Vbbp = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseBPNode));
|
||||
Vbpe = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseBPNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMemitNode));
|
||||
Veie = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMemitEINode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMemitNode));
|
||||
Vsis = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMsubsSINode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMsubsNode));
|
||||
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) &&
|
||||
(ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)){
|
||||
Vbe=Vbiei=model->HICUMtype*here->HICUMicVBE;
|
||||
Vciei=model->HICUMtype*here->HICUMicVCE;
|
||||
Vbci=Vbici=Vbpci=Vbiei-Vciei;
|
||||
Vbpei=0.0;
|
||||
Vsc=Vsici=0.0;
|
||||
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;
|
||||
} else if((ckt->CKTmode & MODEINITJCT) && (here->HICUMoff==0)) {
|
||||
Vbe=Vbiei=model->HICUMtype*here->HICUMtVcrit;
|
||||
Vciei=0.0;
|
||||
Vbci=Vbici=Vbpci=0.0;
|
||||
Vbpei=0.0;
|
||||
Vsc=Vsici=0.0;
|
||||
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;
|
||||
} else if((ckt->CKTmode & MODEINITJCT) ||
|
||||
( (ckt->CKTmode & MODEINITFIX) && (here->HICUMoff!=0))) {
|
||||
Vbe=0.0;
|
||||
Vbiei=Vbe;
|
||||
Vciei=0.0;
|
||||
Vbci=Vbici=Vbpci=0.0;
|
||||
Vbpei=0.0;
|
||||
Vsc=Vsici=0.0;
|
||||
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;
|
||||
} else {
|
||||
#ifndef PREDICTOR
|
||||
if(ckt->CKTmode & MODEINITPRED) {
|
||||
xfact = ckt->CKTdelta/ckt->CKTdeltaOld[1];
|
||||
Vbiei = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvbiei)-
|
||||
xfact * *(ckt->CKTstate2 + here->HICUMvbiei);
|
||||
Vbici = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvbici)-
|
||||
xfact * *(ckt->CKTstate2 + here->HICUMvbici);
|
||||
Vciei = Vbiei - Vbici;
|
||||
Vbpei = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvbpei)-
|
||||
xfact * *(ckt->CKTstate2 + here->HICUMvbpei);
|
||||
Vbpci = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvbpci)-
|
||||
xfact * *(ckt->CKTstate2 + here->HICUMvbpci);
|
||||
Vsici = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvsici)-
|
||||
xfact * *(ckt->CKTstate2 + here->HICUMvsici);
|
||||
Vbpbi = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvbpbi)-
|
||||
xfact * *(ckt->CKTstate2 + here->HICUMvbpbi);
|
||||
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) =
|
||||
*(ckt->CKTstate1 + here->HICUMvbpei);
|
||||
*(ckt->CKTstate0 + here->HICUMvbici) =
|
||||
*(ckt->CKTstate1 + here->HICUMvbici);
|
||||
*(ckt->CKTstate0 + here->HICUMvbpei) =
|
||||
*(ckt->CKTstate1 + here->HICUMvbpei);
|
||||
*(ckt->CKTstate0 + here->HICUMvbpbi) =
|
||||
*(ckt->CKTstate1 + here->HICUMvbpbi);
|
||||
*(ckt->CKTstate0 + here->HICUMvsici) =
|
||||
*(ckt->CKTstate1 + here->HICUMvsici);
|
||||
*(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) =
|
||||
*(ckt->CKTstate1 + here->HICUMibiei_Vbiei);
|
||||
*(ckt->CKTstate0 + here->HICUMibpei) =
|
||||
*(ckt->CKTstate1 + here->HICUMibpei);
|
||||
*(ckt->CKTstate0 + here->HICUMibpei_Vbpei) =
|
||||
*(ckt->CKTstate1 + here->HICUMibpei_Vbpei);
|
||||
*(ckt->CKTstate0 + here->HICUMiciei) =
|
||||
*(ckt->CKTstate1 + here->HICUMiciei);
|
||||
*(ckt->CKTstate0 + here->HICUMiciei_Vbiei) =
|
||||
*(ckt->CKTstate1 + here->HICUMiciei_Vbiei);
|
||||
*(ckt->CKTstate0 + here->HICUMiciei_Vbici) =
|
||||
*(ckt->CKTstate1 + here->HICUMiciei_Vbici);
|
||||
*(ckt->CKTstate0 + here->HICUMibici) =
|
||||
*(ckt->CKTstate1 + here->HICUMibici);
|
||||
*(ckt->CKTstate0 + here->HICUMibici_Vbici) =
|
||||
*(ckt->CKTstate1 + here->HICUMibici_Vbici);
|
||||
*(ckt->CKTstate0 + here->HICUMibpei) =
|
||||
*(ckt->CKTstate1 + here->HICUMibpei);
|
||||
*(ckt->CKTstate0 + here->HICUMibpbi) =
|
||||
*(ckt->CKTstate1 + here->HICUMibpbi);
|
||||
*(ckt->CKTstate0 + here->HICUMibpbi_Vbpbi) =
|
||||
*(ckt->CKTstate1 + here->HICUMibpbi_Vbpbi);
|
||||
*(ckt->CKTstate0 + here->HICUMibpbi_Vbiei) =
|
||||
*(ckt->CKTstate1 + here->HICUMibpbi_Vbiei);
|
||||
*(ckt->CKTstate0 + here->HICUMibpbi_Vbici) =
|
||||
*(ckt->CKTstate1 + here->HICUMibpbi_Vbici);
|
||||
*(ckt->CKTstate0 + here->HICUMisici) =
|
||||
*(ckt->CKTstate1 + here->HICUMisici);
|
||||
*(ckt->CKTstate0 + here->HICUMisici_Vsici) =
|
||||
*(ckt->CKTstate1 + here->HICUMisici_Vsici);
|
||||
*(ckt->CKTstate0 + here->HICUMibpsi) =
|
||||
*(ckt->CKTstate1 + here->HICUMibpsi);
|
||||
*(ckt->CKTstate0 + here->HICUMibpsi_Vbpci) =
|
||||
*(ckt->CKTstate1 + here->HICUMibpsi_Vbpci);
|
||||
*(ckt->CKTstate0 + here->HICUMibpsi_Vsici) =
|
||||
*(ckt->CKTstate1 + here->HICUMibpsi_Vsici);
|
||||
*(ckt->CKTstate0 + here->HICUMgqbepar1) =
|
||||
*(ckt->CKTstate1 + here->HICUMgqbepar1);
|
||||
*(ckt->CKTstate0 + here->HICUMgqbepar2) =
|
||||
*(ckt->CKTstate1 + here->HICUMgqbepar2);
|
||||
*(ckt->CKTstate0 + here->HICUMieie) =
|
||||
*(ckt->CKTstate1 + here->HICUMieie);
|
||||
*(ckt->CKTstate0 + here->HICUMisis_Vsis) =
|
||||
*(ckt->CKTstate1 + here->HICUMisis_Vsis);
|
||||
//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 */
|
||||
/*
|
||||
* compute new nonlinear branch voltages
|
||||
*/
|
||||
Vbiei = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseBINode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMemitEINode));
|
||||
Vbici = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseBINode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMcollCINode));
|
||||
Vbpei = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseBPNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMemitEINode));
|
||||
Vbpbi = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseBPNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseBINode));
|
||||
Vbpci = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseBPNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMcollCINode));
|
||||
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);
|
||||
Vciei = Vbiei - Vbici;
|
||||
if (model->HICUMflsh)
|
||||
Vrth = *(ckt->CKTrhsOld + here->HICUMtempNode);
|
||||
#ifndef PREDICTOR
|
||||
}
|
||||
#endif /* PREDICTOR */
|
||||
delvbiei = Vbiei - *(ckt->CKTstate0 + here->HICUMvbiei);
|
||||
delvbici = Vbici - *(ckt->CKTstate0 + here->HICUMvbici);
|
||||
delvbpei = Vbpei - *(ckt->CKTstate0 + here->HICUMvbpei);
|
||||
delvbpbi = Vbpbi - *(ckt->CKTstate0 + here->HICUMvbpbi);
|
||||
delvbpci = Vbpci - *(ckt->CKTstate0 + here->HICUMvbpci);
|
||||
delvsici = Vsici - *(ckt->CKTstate0 + here->HICUMvsici);
|
||||
if (model->HICUMflsh)
|
||||
delvrth = Vrth - *(ckt->CKTstate0 + here->HICUMvrth);
|
||||
Vbe = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMemitNode));
|
||||
Vsc = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMsubsNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMcollNode));
|
||||
Vcic = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMcollCINode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMcollNode));
|
||||
Vbci = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMcollCINode));
|
||||
Vbbp = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseBPNode));
|
||||
Vbpe = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMbaseBPNode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMemitNode));
|
||||
Veie = model->HICUMtype*(
|
||||
*(ckt->CKTrhsOld+here->HICUMemitEINode)-
|
||||
*(ckt->CKTrhsOld+here->HICUMemitNode));
|
||||
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);
|
||||
if (model->HICUMflsh)
|
||||
Vrth = *(ckt->CKTrhsOld + here->HICUMtempNode);
|
||||
ibieihat = *(ckt->CKTstate0 + here->HICUMibiei) +
|
||||
*(ckt->CKTstate0 + here->HICUMibiei_Vbiei)*delvbiei;
|
||||
ibicihat = *(ckt->CKTstate0 + here->HICUMibici) +
|
||||
*(ckt->CKTstate0 + here->HICUMibici_Vbici)*delvbici;
|
||||
ibpeihat = *(ckt->CKTstate0 + here->HICUMibpei) +
|
||||
*(ckt->CKTstate0 + here->HICUMibpei_Vbpei)*delvbpei;
|
||||
ibpcihat = *(ckt->CKTstate0 + here->HICUMibpci) +
|
||||
*(ckt->CKTstate0 + here->HICUMibpci_Vbpci)*delvbpci;
|
||||
icieihat = *(ckt->CKTstate0 + here->HICUMiciei) +
|
||||
*(ckt->CKTstate0 + here->HICUMiciei_Vbiei)*delvbiei +
|
||||
*(ckt->CKTstate0 + here->HICUMiciei_Vbici)*delvbici;
|
||||
ibpbihat = *(ckt->CKTstate0 + here->HICUMibpbi) +
|
||||
*(ckt->CKTstate0 + here->HICUMibpbi_Vbpbi)*delvbpbi +
|
||||
*(ckt->CKTstate0 + here->HICUMibpbi_Vbiei)*delvbiei +
|
||||
*(ckt->CKTstate0 + here->HICUMibpbi_Vbici)*delvbici;
|
||||
isicihat = *(ckt->CKTstate0 + here->HICUMisici) +
|
||||
*(ckt->CKTstate0 + here->HICUMisici_Vsici)*delvsici;
|
||||
ibpsihat = *(ckt->CKTstate0 + here->HICUMibpsi) +
|
||||
*(ckt->CKTstate0 + here->HICUMibpsi_Vbpci)*delvbpci +
|
||||
*(ckt->CKTstate0 + here->HICUMibpsi_Vsici)*delvsici;
|
||||
/*
|
||||
* bypass if solution has not changed
|
||||
*/
|
||||
/* the following collections of if's would be just one
|
||||
* if the average compiler could handle it, but many
|
||||
* find the expression too complicated, thus the split.
|
||||
* ... no bypass in case of selfheating
|
||||
*/
|
||||
if( (ckt->CKTbypass) && (!(ckt->CKTmode & MODEINITPRED)) && !model->HICUMflsh &&
|
||||
(fabs(delvbiei) < (ckt->CKTreltol*MAX(fabs(Vbiei),
|
||||
fabs(*(ckt->CKTstate0 + here->HICUMvbiei)))+
|
||||
ckt->CKTvoltTol)) )
|
||||
if( (fabs(delvbici) < ckt->CKTreltol*MAX(fabs(Vbici),
|
||||
fabs(*(ckt->CKTstate0 + here->HICUMvbici)))+
|
||||
ckt->CKTvoltTol) )
|
||||
if( (fabs(delvbpei) < ckt->CKTreltol*MAX(fabs(Vbpei),
|
||||
fabs(*(ckt->CKTstate0 + here->HICUMvbpei)))+
|
||||
ckt->CKTvoltTol) )
|
||||
if( (fabs(delvbpbi) < ckt->CKTreltol*MAX(fabs(Vbpbi),
|
||||
fabs(*(ckt->CKTstate0 + here->HICUMvbpbi)))+
|
||||
ckt->CKTvoltTol) )
|
||||
if( (fabs(delvsici) < ckt->CKTreltol*MAX(fabs(Vsici),
|
||||
fabs(*(ckt->CKTstate0 + here->HICUMvsici)))+
|
||||
ckt->CKTvoltTol) )
|
||||
if( (fabs(ibieihat-*(ckt->CKTstate0 + here->HICUMibiei)) <
|
||||
ckt->CKTreltol* MAX(fabs(ibieihat),
|
||||
fabs(*(ckt->CKTstate0 + here->HICUMibiei)))+
|
||||
ckt->CKTabstol) )
|
||||
if( (fabs(ibpeihat-*(ckt->CKTstate0 + here->HICUMibpei)) <
|
||||
ckt->CKTreltol* MAX(fabs(ibpeihat),
|
||||
fabs(*(ckt->CKTstate0 + here->HICUMibpei)))+
|
||||
ckt->CKTabstol) )
|
||||
if( (fabs(icieihat-*(ckt->CKTstate0 + here->HICUMiciei)) <
|
||||
ckt->CKTreltol* MAX(fabs(icieihat),
|
||||
fabs(*(ckt->CKTstate0 + here->HICUMiciei)))+
|
||||
ckt->CKTabstol) )
|
||||
if( (fabs(ibicihat-*(ckt->CKTstate0 + here->HICUMibici)) <
|
||||
ckt->CKTreltol* MAX(fabs(ibicihat),
|
||||
fabs(*(ckt->CKTstate0 + here->HICUMibici)))+
|
||||
ckt->CKTabstol) )
|
||||
if( (fabs(ibpcihat-*(ckt->CKTstate0 + here->HICUMibpei)) <
|
||||
ckt->CKTreltol* MAX(fabs(ibpcihat),
|
||||
fabs(*(ckt->CKTstate0 + here->HICUMibpei)))+
|
||||
ckt->CKTabstol) )
|
||||
if( (fabs(ibpbihat-*(ckt->CKTstate0 + here->HICUMibpbi)) <
|
||||
ckt->CKTreltol* MAX(fabs(ibpbihat),
|
||||
fabs(*(ckt->CKTstate0 + here->HICUMibpbi)))+
|
||||
ckt->CKTabstol) )
|
||||
if( (fabs(isicihat-*(ckt->CKTstate0 + here->HICUMisici)) <
|
||||
ckt->CKTreltol* MAX(fabs(isicihat),
|
||||
fabs(*(ckt->CKTstate0 + here->HICUMisici)))+
|
||||
ckt->CKTabstol) )
|
||||
if( (fabs(ibpsihat-*(ckt->CKTstate0 + here->HICUMibpsi)) <
|
||||
ckt->CKTreltol* MAX(fabs(ibpsihat),
|
||||
fabs(*(ckt->CKTstate0 + here->HICUMibpsi)))+
|
||||
ckt->CKTabstol) ) {
|
||||
/*
|
||||
* bypassing....
|
||||
*/
|
||||
Vbiei = *(ckt->CKTstate0 + here->HICUMvbiei);
|
||||
Vbici = *(ckt->CKTstate0 + here->HICUMvbici);
|
||||
Vbpei = *(ckt->CKTstate0 + here->HICUMvbpei);
|
||||
Vbpbi = *(ckt->CKTstate0 + here->HICUMvbpbi);
|
||||
Vbpci = *(ckt->CKTstate0 + here->HICUMvbpci);
|
||||
Vsici = *(ckt->CKTstate0 + here->HICUMvsici);
|
||||
|
||||
Ibiei = *(ckt->CKTstate0 + here->HICUMibiei);
|
||||
Ibiei_Vbiei = *(ckt->CKTstate0 + here->HICUMibiei_Vbiei);
|
||||
|
||||
Ibpei = *(ckt->CKTstate0 + here->HICUMibpei);
|
||||
Ibpei_Vbpei = *(ckt->CKTstate0 + here->HICUMibpei_Vbpei);
|
||||
|
||||
Iciei = *(ckt->CKTstate0 + here->HICUMiciei);
|
||||
Iciei_Vbiei = *(ckt->CKTstate0 + here->HICUMiciei_Vbiei);
|
||||
Iciei_Vbici = *(ckt->CKTstate0 + here->HICUMiciei_Vbici);
|
||||
|
||||
Ibici = *(ckt->CKTstate0 + here->HICUMibici);
|
||||
Ibici_Vbici = *(ckt->CKTstate0 + here->HICUMibici_Vbici);
|
||||
|
||||
Ibpbi = *(ckt->CKTstate0 + here->HICUMibpbi);
|
||||
Ibpbi_Vbpbi = *(ckt->CKTstate0 + here->HICUMibpbi_Vbpbi);
|
||||
Ibpbi_Vbiei = *(ckt->CKTstate0 + here->HICUMibpbi_Vbiei);
|
||||
Ibpbi_Vbici = *(ckt->CKTstate0 + here->HICUMibpbi_Vbici);
|
||||
|
||||
Isici = *(ckt->CKTstate0 + here->HICUMisici);
|
||||
Isici_Vsici = *(ckt->CKTstate0 + here->HICUMisici_Vsici);
|
||||
|
||||
Ibpsi = *(ckt->CKTstate0 + here->HICUMibpsi);
|
||||
Ibpsi_Vbpci = *(ckt->CKTstate0 + here->HICUMibpsi_Vbpci);
|
||||
Ibpsi_Vsici = *(ckt->CKTstate0 + here->HICUMibpsi_Vsici);
|
||||
|
||||
Ibpci = *(ckt->CKTstate0 + here->HICUMibpci);
|
||||
Ibpci_Vbpci = *(ckt->CKTstate0 + here->HICUMibpci_Vbpci);
|
||||
|
||||
Ieie = *(ckt->CKTstate0 + here->HICUMieie);
|
||||
|
||||
Isis_Vsis = *(ckt->CKTstate0 + here->HICUMisis_Vsis);
|
||||
|
||||
gqbepar1 = *(ckt->CKTstate0 + here->HICUMgqbepar1);
|
||||
gqbepar2 = *(ckt->CKTstate0 + here->HICUMgqbepar2);
|
||||
gqbcpar1 = *(ckt->CKTstate0 + here->HICUMgqbcpar1);
|
||||
gqbcpar2 = *(ckt->CKTstate0 + here->HICUMgqbcpar2);
|
||||
goto load;
|
||||
}
|
||||
/*
|
||||
* limit nonlinear branch voltages
|
||||
*/
|
||||
ichk1 = 1, ichk2 = 1, ichk3 = 1, ichk4 = 1, ichk5 = 0;
|
||||
Vbiei = DEVpnjlim(Vbiei,*(ckt->CKTstate0 + here->HICUMvbiei),here->HICUMvt,
|
||||
here->HICUMtVcrit,&icheck);
|
||||
Vbici = DEVpnjlim(Vbici,*(ckt->CKTstate0 + here->HICUMvbici),here->HICUMvt,
|
||||
here->HICUMtVcrit,&ichk1);
|
||||
Vbpei = DEVpnjlim(Vbpei,*(ckt->CKTstate0 + here->HICUMvbpei),here->HICUMvt,
|
||||
here->HICUMtVcrit,&ichk2);
|
||||
Vbpci = DEVpnjlim(Vbpci,*(ckt->CKTstate0 + here->HICUMvbpci),here->HICUMvt,
|
||||
here->HICUMtVcrit,&ichk3);
|
||||
Vsici = DEVpnjlim(Vsici,*(ckt->CKTstate0 + here->HICUMvsici),here->HICUMvt,
|
||||
here->HICUMtVcrit,&ichk4);
|
||||
if (model->HICUMflsh) {
|
||||
ichk5 = 1;
|
||||
Vrth = HICUMlimitlog(Vrth,
|
||||
*(ckt->CKTstate0 + here->HICUMvrth),100,&ichk4);
|
||||
}
|
||||
if ((ichk1 == 1) || (ichk2 == 1) || (ichk3 == 1) || (ichk4 == 1) || (ichk5 == 1)) icheck=1;
|
||||
}
|
||||
/*
|
||||
* determine dc current and derivatives
|
||||
*/
|
||||
//todo: check for double multiplication on pnp's
|
||||
Vbiei = model->HICUMtype*Vbiei;
|
||||
Vbici = model->HICUMtype*Vbici;
|
||||
Vciei = Vbiei-Vbici;
|
||||
Vbpei = model->HICUMtype*Vbpei;
|
||||
Vbpci = model->HICUMtype*Vbpci;
|
||||
Vbci = model->HICUMtype*Vbci;
|
||||
Vsici = model->HICUMtype*Vsici;
|
||||
Vsc = model->HICUMtype*Vsc;
|
||||
|
||||
if (model->HICUMflsh!=0 && model->HICUMrth >= MIN_R) { // Thermal_update_with_self_heating
|
||||
here->HICUMtemp = here->HICUMtemp+Vrth;
|
||||
iret = hicum_thermal_update(model, here);
|
||||
}
|
||||
|
||||
// Model_evaluation
|
||||
|
||||
//Intrinsic transistor
|
||||
//Internal base currents across b-e junction
|
||||
// HICDIO(here->HICUMvt,model->HICUMibeis,here->HICUMibeis_t,model->HICUMmbei,Vbiei,&ibei,&Ibiei_Vbiei);
|
||||
// HICDIO(here->HICUMvt,model->HICUMireis,here->HICUMireis_t,model->HICUMmrei,Vbiei,&irei,&irei_Vbiei);
|
||||
// HICDIO(here->HICUMvt,model->HICUMireis,here->HICUMireis_t,model->HICUMmrei,Vbiei,&irei,&irei_Vbiei);
|
||||
|
||||
//TODO:derivative of ibeis_t and ireis_t missing here
|
||||
hicum_diode(here->HICUMtemp,here->HICUMibeis_t,model->HICUMmbei, Vbiei, &ibei, &ibei_Vbiei, &ibei_dT);
|
||||
hicum_diode(here->HICUMtemp,here->HICUMireis_t,model->HICUMmrei, Vbiei, &irei, &irei_Vbiei, &irei_dT);
|
||||
|
||||
//Inverse of low-field internal collector resistance: needed in HICICK
|
||||
Orci0_t = 1.0/here->HICUMrci0_t;
|
||||
|
||||
//Internal b-e and b-c junction capacitances and charges
|
||||
//QJMODF(here->HICUMvt,cjei0_t,vdei_t,model->HICUMzei,ajei_t,V(br_biei),Qjei)
|
||||
//Cjei = ddx(Qjei,V(bi));
|
||||
//TODO: derivatives after cjei0_t, vdei_t ajei_t missing here
|
||||
hicum_qjmodf(here->HICUMtemp,here->HICUMcjei0_t,here->HICUMvdei_t,model->HICUMzei,here->HICUMajei_t,Vbiei,&Cjei,&Cjei_Vbiei, &Cjei_dT,&Qjei, &Qjei_Vbiei, &Qjei_dT);
|
||||
|
||||
//TODO:missing temperature derivatives of vdei_t, hjei0_t vdei_t, ahjei_t
|
||||
result = calc_hjei_vbe(Vbiei+1_e, here->HICUMtemp, here, model);
|
||||
hjei_vbe = result.rpart();
|
||||
hjei_vbe_Vbiei = result.dpart();
|
||||
result = calc_hjei_vbe(Vbiei, here->HICUMtemp+1_e, here, model);
|
||||
hjei_vbe_dT = result.dpart();
|
||||
|
||||
|
||||
//HICJQ(here->HICUMvt,cjci0_t,vdci_t,model->HICUMzci,vptci_t,V(br_bici),Qjci);
|
||||
//Cjci = ddx(Qjci,V(bi));
|
||||
//TODO: derivatives after cjci0_t, vdci_t, vptci_t
|
||||
hicum_HICJQ(here->HICUMtemp, here->HICUMcjci0_t,here->HICUMvdci_t,model->HICUMzci,here->HICUMvptci_t, Vbici, &Cjci, &Cjci_Vbici, &Cjci_dT, &Qjci, &Qjci_Vbici, &Qjci_dT);
|
||||
|
||||
|
||||
|
||||
//Hole charge at low bias
|
||||
// double calc_Q0 = [&
|
||||
a_bpt = 0.05;
|
||||
Q_0 = qp0_t + hjei_vbe*Qjei + hjci*Qjci;
|
||||
Q_bpt = a_bpt*qp0_t;
|
||||
b_q = Q_0/Q_bpt-1;
|
||||
Q_0 = Q_bpt*(1+(b_q +sqrt(b_q*b_q+1.921812))/2);
|
||||
|
||||
|
||||
|
||||
//Transit time calculation at low current density
|
||||
if(here->HICUMcjci0_t > 0.0) { // CJMODF
|
||||
double cV_f,cv_e,cs_q,cs_q2,cv_j,cdvj_dv;
|
||||
|
|
|
|||
Loading…
Reference in New Issue