diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 993f9ac15..0c9bc3a96 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -719,16 +719,16 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) }; //Hole charge at low bias - std::function 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 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;