You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
645 lines
31 KiB
645 lines
31 KiB
/**********
|
|
License : 3-clause BSD
|
|
Spice3 Implementation: 2019-2020 Dietmar Warning, Markus Müller, Mario Krattenmacher
|
|
Model Author : 1990 Michael Schröter TU Dresden
|
|
**********/
|
|
|
|
/*
|
|
* Function to load the COMPLEX circuit matrix using the
|
|
* small signal parameters saved during a previous DC operating
|
|
* point analysis.
|
|
*/
|
|
|
|
#include "ngspice/ngspice.h"
|
|
#include "ngspice/cktdefs.h"
|
|
#include "hicum2defs.h"
|
|
#include "ngspice/sperror.h"
|
|
#include "ngspice/suffix.h"
|
|
|
|
int
|
|
HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt)
|
|
{
|
|
HICUMinstance *here;
|
|
HICUMmodel *model = (HICUMmodel*)inModel;
|
|
double Ibpei_Vbpei;
|
|
double Ibpei_Vrth;
|
|
|
|
double Ibiei_Vbiei;
|
|
double Ibiei_Vxf;
|
|
double Ibiei_Vbici;
|
|
double Ibiei_Vrth;
|
|
|
|
double Ibici_Vbici;
|
|
double Ibici_Vbiei;
|
|
double Ibici_Vrth;
|
|
|
|
double Ibpci_Vbpci;
|
|
double Ibpci_Vrth;
|
|
|
|
double Isici_Vsici;
|
|
double Isici_Vrth;
|
|
|
|
double Iciei_Vbiei;
|
|
double Iciei_Vbici;
|
|
double Iciei_Vrth;
|
|
double Iciei_Vxf2;
|
|
|
|
|
|
double Ibpbi_Vbpbi;
|
|
double Ibpbi_Vbici;
|
|
double Ibpbi_Vbiei;
|
|
double Ibpbi_Vrth;
|
|
|
|
double Isis_Vsis;
|
|
double Irth_Vrth;
|
|
double Icic_Vcic, Icic_Vrth;
|
|
double Ieie_Veie, Ieie_Vrth;
|
|
double Ibbp_Vbbp, Ibbp_Vrth;
|
|
|
|
double Ibpsi_Vbpci;
|
|
double Ibpsi_Vsici;
|
|
double Ibpsi_Vrth;
|
|
|
|
double XQrbi_Vbpbi;
|
|
double XQrbi_Vbiei;
|
|
double XQrbi_Vbici;
|
|
double XQrbi_Vrth;
|
|
double XQjei_Vbiei;
|
|
double XQjei_Vrth;
|
|
double XQjci_Vbici;
|
|
double XQjci_Vrth;
|
|
double XQjep_Vbpei;
|
|
double XQjep_Vrth;
|
|
double volatile Xqjcx0_t_i_Vbci;
|
|
double Xqjcx0_t_i_Vrth;
|
|
double volatile Xqjcx0_t_ii_Vbpci;
|
|
double Xqjcx0_t_ii_Vrth;
|
|
double XQdsu_Vbpci;
|
|
double XQdsu_Vsici;
|
|
double XQdsu_Vrth;
|
|
double XQjs_Vsici;
|
|
double XQjs_Vrth;
|
|
double XQscp_Vsc;
|
|
double XQscp_Vrth;
|
|
double XQbepar1_Vbe;
|
|
double XQbepar2_Vbpe;
|
|
double XQbcpar1_Vbci;
|
|
double XQbcpar2_Vbpci;
|
|
double XQsu_Vsis;
|
|
double XQcth_Vrth;
|
|
double XQf_Vbiei;
|
|
double XQf_Vbici;
|
|
double XQf_Vrth;
|
|
double XQf_Vxf;
|
|
double XQr_Vrth;
|
|
double XQr_Vbiei;
|
|
double XQr_Vbici;
|
|
|
|
double XQxf_Vxf;
|
|
double XQxf1_Vxf1;
|
|
double XQxf2_Vxf2;
|
|
|
|
double Ixf1_Vbiei;
|
|
double Ixf1_Vbici;
|
|
double Ixf1_Vxf2 ;
|
|
double Ixf1_Vxf1 ;
|
|
double Ixf1_Vrth ;
|
|
|
|
double Ixf2_Vbiei;
|
|
double Ixf2_Vbici;
|
|
double Ixf2_Vxf2 ;
|
|
double Ixf2_Vxf1 ;
|
|
double Ixf2_Vrth ;
|
|
|
|
double Ixf_Vbiei ;
|
|
double Ixf_Vbici ;
|
|
double Ixf_Vxf ;
|
|
double Ixf_Vrth ;
|
|
|
|
double Ith_Vrth, Ith_Vbiei, Ith_Vbici, Ith_Vbpbi, Ith_Vbpci, Ith_Vbpei, Ith_Vciei, Ith_Vsici, Ith_Vcic, Ith_Vbbp, Ith_Veie;
|
|
|
|
/* loop through all the models */
|
|
for( ; model != NULL; model = HICUMnextModel(model)) {
|
|
|
|
int selfheat = ( (model->HICUMflsh > 0) && (model->HICUMrthGiven) && (model->HICUMrth > 0.0));
|
|
int nqs = ( (model->HICUMflnqs != 0 || model->HICUMflcomp < 2.3) && (model->HICUMalit > 0 || model->HICUMalqf > 0));
|
|
|
|
/* loop through all the instances of the model */
|
|
for( here = HICUMinstances(model); here!= NULL;
|
|
here = HICUMnextInstance(here)) {
|
|
|
|
|
|
// get all derivatives of branch DC currents
|
|
if(model->HICUMrcxGiven && model->HICUMrcx != 0) {
|
|
Icic_Vcic = 1/here->HICUMrcx_t.rpart;
|
|
Icic_Vrth = -*(ckt->CKTstate0 + here->HICUMvcic)/here->HICUMrcx_t.rpart/here->HICUMrcx_t.rpart*here->HICUMrcx_t.dpart;
|
|
} else {
|
|
Icic_Vcic = 0.0;
|
|
Icic_Vrth = 0.0;
|
|
}
|
|
if(model->HICUMrbxGiven && model->HICUMrbx != 0) {
|
|
Ibbp_Vbbp = 1/here->HICUMrbx_t.rpart;
|
|
Ibbp_Vrth = -*(ckt->CKTstate0 + here->HICUMvbbp)/here->HICUMrbx_t.rpart/here->HICUMrbx_t.rpart*here->HICUMrbx_t.dpart;
|
|
} else {
|
|
Ibbp_Vbbp = 0.0;
|
|
Ibbp_Vrth = 0.0;
|
|
}
|
|
if(model->HICUMreGiven && model->HICUMre != 0) {
|
|
Ieie_Veie = 1/here->HICUMre_t.rpart;
|
|
Ieie_Vrth = -*(ckt->CKTstate0 + here->HICUMveie)/here->HICUMre_t.rpart/here->HICUMre_t.rpart*here->HICUMre_t.dpart;
|
|
} else {
|
|
Ieie_Veie = 0.0;
|
|
Ieie_Vrth = 0.0;
|
|
}
|
|
if(model->HICUMrsuGiven && model->HICUMrsu != 0) {
|
|
Isis_Vsis = 1/model->HICUMrsu*here->HICUMm;
|
|
} else {
|
|
Isis_Vsis = 0.0;
|
|
}
|
|
if(selfheat) {
|
|
Irth_Vrth = (1/here->HICUMrth_t.rpart - *(ckt->CKTstate0 + here->HICUMvrth)/(here->HICUMrth_t.rpart*here->HICUMrth_t.rpart) * here->HICUMrth_t.dpart);
|
|
} else {
|
|
Irth_Vrth = 0.0;
|
|
}
|
|
|
|
|
|
|
|
Ibiei_Vbiei = *(ckt->CKTstate0 + here->HICUMibiei_Vbiei);
|
|
Ibiei_Vxf = *(ckt->CKTstate0 + here->HICUMibiei_Vxf);
|
|
Ibiei_Vbici = *(ckt->CKTstate0 + here->HICUMibiei_Vbici);
|
|
Ibiei_Vrth = *(ckt->CKTstate0 + here->HICUMibiei_Vrth);
|
|
|
|
Ibpei_Vbpei = *(ckt->CKTstate0 + here->HICUMibpei_Vbpei);
|
|
Ibpei_Vrth = *(ckt->CKTstate0 + here->HICUMibpei_Vrth);
|
|
|
|
Iciei_Vbiei = *(ckt->CKTstate0 + here->HICUMiciei_Vbiei);
|
|
Iciei_Vbici = *(ckt->CKTstate0 + here->HICUMiciei_Vbici);
|
|
Iciei_Vrth = *(ckt->CKTstate0 + here->HICUMiciei_Vrth);
|
|
Iciei_Vxf2 = *(ckt->CKTstate0 + here->HICUMiciei_Vxf2);
|
|
|
|
Ibici_Vbici = *(ckt->CKTstate0 + here->HICUMibici_Vbici);
|
|
Ibici_Vbiei = *(ckt->CKTstate0 + here->HICUMibici_Vbiei);
|
|
Ibici_Vrth = *(ckt->CKTstate0 + here->HICUMibici_Vrth);
|
|
|
|
Ibpbi_Vbpbi = *(ckt->CKTstate0 + here->HICUMibpbi_Vbpbi);
|
|
Ibpbi_Vbiei = *(ckt->CKTstate0 + here->HICUMibpbi_Vbiei);
|
|
Ibpbi_Vbici = *(ckt->CKTstate0 + here->HICUMibpbi_Vbici);
|
|
Ibpbi_Vrth = *(ckt->CKTstate0 + here->HICUMibpbi_Vrth);
|
|
|
|
Ibpci_Vbpci = *(ckt->CKTstate0 + here->HICUMibpci_Vbpci);
|
|
Ibpci_Vrth = *(ckt->CKTstate0 + here->HICUMibpci_Vrth);
|
|
|
|
Isici_Vsici = *(ckt->CKTstate0 + here->HICUMisici_Vsici);
|
|
Isici_Vrth = *(ckt->CKTstate0 + here->HICUMisici_Vrth);
|
|
|
|
Ibpsi_Vbpci = *(ckt->CKTstate0 + here->HICUMibpsi_Vbpci);
|
|
Ibpsi_Vsici = *(ckt->CKTstate0 + here->HICUMibpsi_Vsici);
|
|
Ibpsi_Vrth = *(ckt->CKTstate0 + here->HICUMibpsi_Vrth);
|
|
|
|
Ith_Vrth = *(ckt->CKTstate0 + here->HICUMith_Vrth);
|
|
Ith_Vbiei = *(ckt->CKTstate0 + here->HICUMith_Vbiei);
|
|
Ith_Vbici = *(ckt->CKTstate0 + here->HICUMith_Vbici);
|
|
Ith_Vbpbi = *(ckt->CKTstate0 + here->HICUMith_Vbpbi);
|
|
Ith_Vbpci = *(ckt->CKTstate0 + here->HICUMith_Vbpci);
|
|
Ith_Vbpei = *(ckt->CKTstate0 + here->HICUMith_Vbpei);
|
|
Ith_Vciei = *(ckt->CKTstate0 + here->HICUMith_Vciei);
|
|
Ith_Vsici = *(ckt->CKTstate0 + here->HICUMith_Vsici);
|
|
Ith_Vcic = *(ckt->CKTstate0 + here->HICUMith_Vcic);
|
|
Ith_Vbbp = *(ckt->CKTstate0 + here->HICUMith_Vbbp);
|
|
Ith_Veie = *(ckt->CKTstate0 + here->HICUMith_Veie);
|
|
|
|
Ixf1_Vbiei = *(ckt->CKTstate0 + here->HICUMixf1_Vbiei);
|
|
Ixf1_Vbici = *(ckt->CKTstate0 + here->HICUMixf1_Vbici);
|
|
Ixf1_Vxf2 = *(ckt->CKTstate0 + here->HICUMixf1_Vxf2);
|
|
Ixf1_Vxf1 = *(ckt->CKTstate0 + here->HICUMixf1_Vxf1);
|
|
Ixf1_Vrth = *(ckt->CKTstate0 + here->HICUMixf1_Vrth);
|
|
|
|
Ixf2_Vbiei = *(ckt->CKTstate0 + here->HICUMixf2_Vbiei);
|
|
Ixf2_Vbici = *(ckt->CKTstate0 + here->HICUMixf2_Vbici);
|
|
Ixf2_Vxf2 = *(ckt->CKTstate0 + here->HICUMixf2_Vxf2);
|
|
Ixf2_Vxf1 = *(ckt->CKTstate0 + here->HICUMixf2_Vxf1);
|
|
Ixf2_Vrth = *(ckt->CKTstate0 + here->HICUMixf2_Vrth);
|
|
|
|
Ixf_Vbiei = *(ckt->CKTstate0 + here->HICUMixf_Vbiei);
|
|
Ixf_Vbici = *(ckt->CKTstate0 + here->HICUMixf_Vbici);
|
|
Ixf_Vxf = *(ckt->CKTstate0 + here->HICUMixf_Vxf);
|
|
Ixf_Vrth = *(ckt->CKTstate0 + here->HICUMixf_Vrth);
|
|
|
|
////////////////////////////////////
|
|
////////// The real part /////////
|
|
////////////////////////////////////
|
|
|
|
// Stamp element: Ibiei
|
|
*(here->HICUMbaseBIBaseBIPtr) += Ibiei_Vbiei;
|
|
*(here->HICUMemitEIEmitEIPtr) += Ibiei_Vbiei;
|
|
*(here->HICUMbaseBIEmitEIPtr) += -Ibiei_Vbiei;
|
|
*(here->HICUMemitEIBaseBIPtr) += -Ibiei_Vbiei;
|
|
*(here->HICUMbaseBIBaseBIPtr) += Ibiei_Vbici;
|
|
*(here->HICUMemitEICollCIPtr) += Ibiei_Vbici;
|
|
*(here->HICUMbaseBICollCIPtr) += -Ibiei_Vbici;
|
|
*(here->HICUMemitEIBaseBIPtr) += -Ibiei_Vbici;
|
|
|
|
// Stamp element: Ibpei
|
|
*(here->HICUMbaseBPBaseBPPtr) += Ibpei_Vbpei;
|
|
*(here->HICUMemitEIEmitEIPtr) += Ibpei_Vbpei;
|
|
*(here->HICUMbaseBPEmitEIPtr) += -Ibpei_Vbpei;
|
|
*(here->HICUMemitEIBaseBPPtr) += -Ibpei_Vbpei;;
|
|
|
|
// Stamp element: Ibici
|
|
*(here->HICUMbaseBIBaseBIPtr) += Ibici_Vbici;
|
|
*(here->HICUMcollCICollCIPtr) += Ibici_Vbici;
|
|
*(here->HICUMcollCIBaseBIPtr) += -Ibici_Vbici;
|
|
*(here->HICUMbaseBICollCIPtr) += -Ibici_Vbici;
|
|
*(here->HICUMbaseBIBaseBIPtr) += Ibici_Vbiei;
|
|
*(here->HICUMcollCIEmitEIPtr) += Ibici_Vbiei;
|
|
*(here->HICUMcollCIBaseBIPtr) += -Ibici_Vbiei;
|
|
*(here->HICUMbaseBIEmitEIPtr) += -Ibici_Vbiei;
|
|
|
|
// Stamp element: Iciei
|
|
*(here->HICUMcollCIBaseBIPtr) += Iciei_Vbiei;
|
|
*(here->HICUMemitEIEmitEIPtr) += Iciei_Vbiei;
|
|
*(here->HICUMcollCIEmitEIPtr) += -Iciei_Vbiei;
|
|
*(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbiei;
|
|
*(here->HICUMcollCIBaseBIPtr) += Iciei_Vbici;
|
|
*(here->HICUMemitEICollCIPtr) += Iciei_Vbici;
|
|
*(here->HICUMcollCICollCIPtr) += -Iciei_Vbici;
|
|
*(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbici;
|
|
if (nqs) {
|
|
*(here->HICUMcollCIXf2Ptr) += Iciei_Vxf2;
|
|
*(here->HICUMemitEIXf2Ptr) += -Iciei_Vxf2;
|
|
}
|
|
|
|
|
|
// Stamp element: Ibpci
|
|
*(here->HICUMbaseBPBaseBPPtr) += Ibpci_Vbpci;
|
|
*(here->HICUMcollCICollCIPtr) += Ibpci_Vbpci;
|
|
*(here->HICUMbaseBPCollCIPtr) += -Ibpci_Vbpci;
|
|
*(here->HICUMcollCIBaseBPPtr) += -Ibpci_Vbpci;
|
|
|
|
// Stamp element: Rcx
|
|
*(here->HICUMcollCollPtr) += Icic_Vcic;
|
|
*(here->HICUMcollCICollCIPtr) += Icic_Vcic;
|
|
*(here->HICUMcollCICollPtr) += -Icic_Vcic;
|
|
*(here->HICUMcollCollCIPtr) += -Icic_Vcic;
|
|
|
|
// Stamp element: Rbx
|
|
*(here->HICUMbaseBasePtr) += Ibbp_Vbbp;
|
|
*(here->HICUMbaseBPBaseBPPtr) += Ibbp_Vbbp;
|
|
*(here->HICUMbaseBPBasePtr) += -Ibbp_Vbbp;
|
|
*(here->HICUMbaseBaseBPPtr) += -Ibbp_Vbbp;
|
|
|
|
// Stamp element: Re
|
|
*(here->HICUMemitEmitPtr) += Ieie_Veie;
|
|
*(here->HICUMemitEIEmitEIPtr) += Ieie_Veie;
|
|
*(here->HICUMemitEIEmitPtr) += -Ieie_Veie;
|
|
*(here->HICUMemitEmitEIPtr) += -Ieie_Veie;
|
|
|
|
// Stamp element: Ibpbi
|
|
if (here->HICUMrbi>0.0) {
|
|
*(here->HICUMbaseBPBaseBPPtr) += Ibpbi_Vbpbi;
|
|
*(here->HICUMbaseBIBaseBIPtr) += Ibpbi_Vbpbi;
|
|
*(here->HICUMbaseBPBaseBIPtr) += -Ibpbi_Vbpbi;
|
|
*(here->HICUMbaseBIBaseBPPtr) += -Ibpbi_Vbpbi;
|
|
*(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbiei;
|
|
*(here->HICUMbaseBIEmitEIPtr) += Ibpbi_Vbiei;
|
|
*(here->HICUMbaseBPEmitEIPtr) += -Ibpbi_Vbiei;
|
|
*(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbiei;
|
|
*(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbici;
|
|
*(here->HICUMbaseBICollCIPtr) += Ibpbi_Vbici;
|
|
*(here->HICUMbaseBPCollCIPtr) += -Ibpbi_Vbici;
|
|
*(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbici;
|
|
};
|
|
|
|
// Stamp element: Isici
|
|
*(here->HICUMsubsSISubsSIPtr) += Isici_Vsici;
|
|
*(here->HICUMcollCICollCIPtr) += Isici_Vsici;
|
|
*(here->HICUMsubsSICollCIPtr) += -Isici_Vsici;
|
|
*(here->HICUMcollCISubsSIPtr) += -Isici_Vsici;;
|
|
|
|
// Stamp element: Ibpsi
|
|
*(here->HICUMbaseBPSubsSIPtr) += Ibpsi_Vsici;
|
|
*(here->HICUMsubsSICollCIPtr) += Ibpsi_Vsici;
|
|
*(here->HICUMbaseBPCollCIPtr) += -Ibpsi_Vsici;
|
|
*(here->HICUMsubsSISubsSIPtr) += -Ibpsi_Vsici;
|
|
*(here->HICUMbaseBPBaseBPPtr) += Ibpsi_Vbpci;
|
|
*(here->HICUMsubsSICollCIPtr) += Ibpsi_Vbpci;
|
|
*(here->HICUMbaseBPCollCIPtr) += -Ibpsi_Vbpci;
|
|
*(here->HICUMsubsSIBaseBPPtr) += -Ibpsi_Vbpci;;
|
|
|
|
// Stamp element: Rsu
|
|
*(here->HICUMsubsSubsPtr) += Isis_Vsis;
|
|
*(here->HICUMsubsSISubsSIPtr) += Isis_Vsis;
|
|
*(here->HICUMsubsSISubsPtr) += -Isis_Vsis;
|
|
*(here->HICUMsubsSubsSIPtr) += -Isis_Vsis;
|
|
|
|
if (nqs) {
|
|
//Ixf1
|
|
*(here->HICUMxf1BaseBIPtr) += +Ixf1_Vbiei;
|
|
*(here->HICUMxf1EmitEIPtr) += -Ixf1_Vbiei;
|
|
*(here->HICUMxf1BaseBIPtr) += +Ixf1_Vbici;
|
|
*(here->HICUMxf1CollCIPtr) += -Ixf1_Vbici;
|
|
*(here->HICUMxf1Xf2Ptr) += +Ixf1_Vxf2;
|
|
*(here->HICUMxf1Xf1Ptr) += +Ixf1_Vxf1;
|
|
//Ixf2
|
|
*(here->HICUMxf2BaseBIPtr) += +Ixf2_Vbiei;
|
|
*(here->HICUMxf2EmitEIPtr) += -Ixf2_Vbiei;
|
|
*(here->HICUMxf2BaseBIPtr) += +Ixf2_Vbici;
|
|
*(here->HICUMxf2CollCIPtr) += -Ixf2_Vbici;
|
|
*(here->HICUMxf2Xf2Ptr) += +Ixf2_Vxf2;
|
|
*(here->HICUMxf2Xf1Ptr) += +Ixf2_Vxf1;
|
|
//Ixf
|
|
*(here->HICUMxfBaseBIPtr) += +Ixf_Vbiei;
|
|
*(here->HICUMxfEmitEIPtr) += -Ixf_Vbiei;
|
|
*(here->HICUMxfBaseBIPtr) += +Ixf_Vbici;
|
|
*(here->HICUMxfCollCIPtr) += -Ixf_Vbici;
|
|
*(here->HICUMxfXfPtr) += +Ixf_Vxf;
|
|
}
|
|
|
|
////////////////////////////////////
|
|
////////// The complex part //////
|
|
////////////////////////////////////
|
|
|
|
//Qrbi
|
|
XQrbi_Vbpbi = *(ckt->CKTstate0 + here->HICUMcqrbi) * ckt->CKTomega;
|
|
XQrbi_Vbiei = here->HICUMqrbi_Vbiei * ckt->CKTomega;
|
|
XQrbi_Vbici = here->HICUMqrbi_Vbici * ckt->CKTomega;
|
|
XQrbi_Vrth = here->HICUMqrbi_Vrth * ckt->CKTomega;
|
|
//Qjei
|
|
XQjei_Vbiei = *(ckt->CKTstate0 + here->HICUMcqjei) * ckt->CKTomega;
|
|
XQjei_Vrth = here->HICUMqjei_Vrth * ckt->CKTomega;
|
|
//Qf
|
|
XQf_Vbiei = *(ckt->CKTstate0 + here->HICUMcqf) * ckt->CKTomega;
|
|
XQf_Vbici = here->HICUMqf_Vbici * ckt->CKTomega;
|
|
XQf_Vrth = here->HICUMqf_Vrth * ckt->CKTomega;
|
|
XQf_Vxf = here->HICUMqf_Vxf * ckt->CKTomega;
|
|
//Qr
|
|
XQr_Vbici = *(ckt->CKTstate0 + here->HICUMcqr) * ckt->CKTomega;
|
|
XQr_Vbiei = here->HICUMqr_Vbiei * ckt->CKTomega;
|
|
XQr_Vrth = here->HICUMqr_Vrth * ckt->CKTomega;
|
|
//Qjci
|
|
XQjci_Vbici = *(ckt->CKTstate0 + here->HICUMcqjci) * ckt->CKTomega;
|
|
XQjci_Vrth = here->HICUMqjci_Vrth * ckt->CKTomega;
|
|
//Qjep
|
|
XQjep_Vbpei = *(ckt->CKTstate0 + here->HICUMcqjep) * ckt->CKTomega;
|
|
XQjep_Vrth = here->HICUMqjep_Vrth * ckt->CKTomega;
|
|
//Qjcx_i
|
|
Xqjcx0_t_i_Vbci = *(ckt->CKTstate0 + here->HICUMcqcx0_t_i) * ckt->CKTomega;
|
|
Xqjcx0_t_i_Vrth = here->HICUMqjcx0_i_Vrth * ckt->CKTomega;
|
|
//Qjcx_ii
|
|
Xqjcx0_t_ii_Vbpci = *(ckt->CKTstate0 + here->HICUMcqcx0_t_ii) * ckt->CKTomega;
|
|
Xqjcx0_t_ii_Vrth = here->HICUMqjcx0_ii_Vrth * ckt->CKTomega;
|
|
//Qdsu
|
|
XQdsu_Vbpci = *(ckt->CKTstate0 + here->HICUMcqdsu) * ckt->CKTomega;
|
|
XQdsu_Vsici = here->HICUMqdsu_Vsici * ckt->CKTomega;
|
|
XQdsu_Vrth = here->HICUMqdsu_Vrth * ckt->CKTomega;
|
|
//Qjs
|
|
XQjs_Vsici = *(ckt->CKTstate0 + here->HICUMcqjs) * ckt->CKTomega;
|
|
XQjs_Vrth = here->HICUMqjs_Vrth * ckt->CKTomega;
|
|
//Qscp
|
|
XQscp_Vsc = *(ckt->CKTstate0 + here->HICUMcqscp) * ckt->CKTomega;
|
|
XQscp_Vrth = here->HICUMqscp_Vrth * ckt->CKTomega;
|
|
//Qbepar1
|
|
XQbepar1_Vbe = *(ckt->CKTstate0 + here->HICUMcqbepar1) * ckt->CKTomega;
|
|
//Qbepar2
|
|
XQbepar2_Vbpe = *(ckt->CKTstate0 + here->HICUMcqbepar2) * ckt->CKTomega;
|
|
//Qbcpar1
|
|
XQbcpar1_Vbci = *(ckt->CKTstate0 + here->HICUMcqbcpar1) * ckt->CKTomega;
|
|
//Qbcpar2
|
|
XQbcpar2_Vbpci = *(ckt->CKTstate0 + here->HICUMcqbcpar2) * ckt->CKTomega;
|
|
//Qsu
|
|
XQsu_Vsis = *(ckt->CKTstate0 + here->HICUMcqsu) * ckt->CKTomega;
|
|
//Qcth
|
|
XQcth_Vrth = *(ckt->CKTstate0 + here->HICUMcqcth) * ckt->CKTomega;
|
|
//Qxf
|
|
XQxf_Vxf = *(ckt->CKTstate0 + here->HICUMcqxf) * ckt->CKTomega;
|
|
XQxf1_Vxf1 = *(ckt->CKTstate0 + here->HICUMcqxf1) * ckt->CKTomega;
|
|
XQxf2_Vxf2 = *(ckt->CKTstate0 + here->HICUMcqxf2) * ckt->CKTomega;
|
|
|
|
//Qrbi f_bp=+ f_bi=-
|
|
if (here->HICUMrbi>0.0) {
|
|
*(here->HICUMbaseBPBaseBPPtr + 1) += XQrbi_Vbpbi;
|
|
*(here->HICUMbaseBIBaseBIPtr + 1) += XQrbi_Vbpbi;
|
|
*(here->HICUMbaseBPBaseBIPtr + 1) += -XQrbi_Vbpbi;
|
|
*(here->HICUMbaseBIBaseBPPtr + 1) += -XQrbi_Vbpbi;
|
|
*(here->HICUMbaseBPBaseBIPtr + 1) += XQrbi_Vbiei;
|
|
*(here->HICUMbaseBIEmitEIPtr + 1) += XQrbi_Vbiei;
|
|
*(here->HICUMbaseBPEmitEIPtr + 1) += -XQrbi_Vbiei;
|
|
*(here->HICUMbaseBIBaseBIPtr + 1) += -XQrbi_Vbiei;
|
|
*(here->HICUMbaseBPBaseBIPtr + 1) += XQrbi_Vbici;
|
|
*(here->HICUMbaseBICollCIPtr + 1) += XQrbi_Vbici;
|
|
*(here->HICUMbaseBPCollCIPtr + 1) += -XQrbi_Vbici;
|
|
*(here->HICUMbaseBIBaseBIPtr + 1) += -XQrbi_Vbici;
|
|
}
|
|
//Qjei
|
|
*(here->HICUMbaseBIBaseBIPtr + 1) += XQjei_Vbiei;
|
|
*(here->HICUMemitEIEmitEIPtr + 1) += XQjei_Vbiei;
|
|
*(here->HICUMbaseBIEmitEIPtr + 1) += -XQjei_Vbiei;
|
|
*(here->HICUMemitEIBaseBIPtr + 1) += -XQjei_Vbiei;
|
|
//Qf f_Bi=+ f_Ei =-
|
|
*(here->HICUMbaseBIBaseBIPtr +1) += XQf_Vbiei;
|
|
*(here->HICUMemitEIEmitEIPtr +1) += XQf_Vbiei;
|
|
*(here->HICUMbaseBIEmitEIPtr +1) += -XQf_Vbiei;
|
|
*(here->HICUMemitEIBaseBIPtr +1) += -XQf_Vbiei;
|
|
*(here->HICUMbaseBIBaseBIPtr +1) += XQf_Vbici;
|
|
*(here->HICUMemitEICollCIPtr +1) += XQf_Vbici;
|
|
*(here->HICUMbaseBICollCIPtr +1) += -XQf_Vbici;
|
|
*(here->HICUMemitEIBaseBIPtr +1) += -XQf_Vbici;
|
|
if (nqs) {
|
|
*(here->HICUMbaseBIXfPtr +1) += XQf_Vxf;
|
|
*(here->HICUMemitEIXfPtr +1) += -XQf_Vxf;
|
|
}
|
|
//Qjci
|
|
*(here->HICUMbaseBIBaseBIPtr +1) += XQjci_Vbici;
|
|
*(here->HICUMcollCICollCIPtr +1) += XQjci_Vbici;
|
|
*(here->HICUMcollCIBaseBIPtr +1) += -XQjci_Vbici;
|
|
*(here->HICUMbaseBICollCIPtr +1) += -XQjci_Vbici;
|
|
//Qr f_bi = + f_ci=-
|
|
*(here->HICUMbaseBIBaseBIPtr +1) += XQr_Vbici;
|
|
*(here->HICUMcollCICollCIPtr +1) += XQr_Vbici;
|
|
*(here->HICUMcollCIBaseBIPtr +1) += -XQr_Vbici;
|
|
*(here->HICUMbaseBICollCIPtr +1) += -XQr_Vbici;
|
|
*(here->HICUMbaseBIBaseBIPtr +1) += XQr_Vbiei;
|
|
*(here->HICUMcollCIEmitEIPtr +1) += XQr_Vbiei;
|
|
*(here->HICUMcollCIBaseBIPtr +1) += -XQr_Vbiei;
|
|
*(here->HICUMbaseBIEmitEIPtr +1) += -XQr_Vbiei;
|
|
//Qjep
|
|
*(here->HICUMbaseBPBaseBPPtr +1) += XQjep_Vbpei;
|
|
*(here->HICUMemitEIEmitEIPtr +1) += XQjep_Vbpei;
|
|
*(here->HICUMbaseBPEmitEIPtr +1) += -XQjep_Vbpei;
|
|
*(here->HICUMemitEIBaseBPPtr +1) += -XQjep_Vbpei;
|
|
//Qjcx_i
|
|
*(here->HICUMbaseBasePtr +1) += Xqjcx0_t_i_Vbci;
|
|
*(here->HICUMcollCICollCIPtr +1) += Xqjcx0_t_i_Vbci;
|
|
*(here->HICUMbaseCollCIPtr +1) += -Xqjcx0_t_i_Vbci;
|
|
*(here->HICUMcollCIBasePtr +1) += -Xqjcx0_t_i_Vbci;
|
|
//Qjcx_ii
|
|
*(here->HICUMbaseBPBaseBPPtr +1) += Xqjcx0_t_ii_Vbpci;
|
|
*(here->HICUMcollCICollCIPtr +1) += Xqjcx0_t_ii_Vbpci;
|
|
*(here->HICUMbaseBPCollCIPtr +1) += -Xqjcx0_t_ii_Vbpci;
|
|
*(here->HICUMcollCIBaseBPPtr +1) += -Xqjcx0_t_ii_Vbpci;
|
|
//Qdsu f_bp=+ f_ci=-
|
|
*(here->HICUMbaseBPBaseBPPtr +1) += XQdsu_Vbpci;
|
|
*(here->HICUMcollCICollCIPtr +1) += XQdsu_Vbpci;
|
|
*(here->HICUMbaseBPCollCIPtr +1) += -XQdsu_Vbpci;
|
|
*(here->HICUMcollCIBaseBPPtr +1) += -XQdsu_Vbpci;
|
|
*(here->HICUMbaseBPSubsSIPtr +1) += XQdsu_Vsici;
|
|
*(here->HICUMcollCICollCIPtr +1) += XQdsu_Vsici;
|
|
*(here->HICUMbaseBPCollCIPtr +1) += -XQdsu_Vsici;
|
|
*(here->HICUMcollCISubsSIPtr +1) += -XQdsu_Vsici;
|
|
//Qjs
|
|
*(here->HICUMsubsSISubsSIPtr +1) += XQjs_Vsici;
|
|
*(here->HICUMcollCICollCIPtr +1) += XQjs_Vsici;
|
|
*(here->HICUMsubsSICollCIPtr +1) += -XQjs_Vsici;
|
|
*(here->HICUMcollCISubsSIPtr +1) += -XQjs_Vsici;
|
|
//Qscp
|
|
*(here->HICUMsubsSubsPtr + 1) += XQscp_Vsc;
|
|
*(here->HICUMcollCollPtr + 1) += XQscp_Vsc;
|
|
*(here->HICUMcollSubsPtr + 1) += -XQscp_Vsc;
|
|
*(here->HICUMsubsCollPtr + 1) += -XQscp_Vsc;
|
|
//Qbepar1
|
|
*(here->HICUMbaseBasePtr + 1) += XQbepar1_Vbe;
|
|
*(here->HICUMemitEmitPtr + 1) += XQbepar1_Vbe;
|
|
*(here->HICUMbaseEmitPtr + 1) += -XQbepar1_Vbe;
|
|
*(here->HICUMemitBasePtr + 1) += -XQbepar1_Vbe;
|
|
//Qbepar2
|
|
*(here->HICUMbaseBPBaseBPPtr + 1) += XQbepar2_Vbpe;
|
|
*(here->HICUMemitEmitPtr + 1) += XQbepar2_Vbpe;
|
|
*(here->HICUMemitBaseBPPtr + 1) += -XQbepar2_Vbpe;
|
|
*(here->HICUMbaseBPEmitPtr + 1) += -XQbepar2_Vbpe;
|
|
//Qbcpar1
|
|
*(here->HICUMbaseBasePtr + 1) += XQbcpar1_Vbci;
|
|
*(here->HICUMcollCICollCIPtr + 1) += XQbcpar1_Vbci;
|
|
*(here->HICUMbaseCollCIPtr + 1) += -XQbcpar1_Vbci;
|
|
*(here->HICUMcollCIBasePtr + 1) += -XQbcpar1_Vbci;
|
|
//Qbcpar2
|
|
*(here->HICUMbaseBPBaseBPPtr +1) += XQbcpar2_Vbpci;
|
|
*(here->HICUMcollCICollCIPtr +1) += XQbcpar2_Vbpci;
|
|
*(here->HICUMbaseBPCollCIPtr +1) += -XQbcpar2_Vbpci;
|
|
*(here->HICUMcollCIBaseBPPtr +1) += -XQbcpar2_Vbpci;
|
|
//Qsu
|
|
*(here->HICUMsubsSubsPtr + 1) += XQsu_Vsis;
|
|
*(here->HICUMsubsSISubsSIPtr + 1) += XQsu_Vsis;
|
|
*(here->HICUMsubsSISubsPtr + 1) += -XQsu_Vsis;
|
|
*(here->HICUMsubsSubsSIPtr + 1) += -XQsu_Vsis;
|
|
if (nqs) {
|
|
//Qxf1
|
|
*(here->HICUMxf1Xf1Ptr + 1) += +XQxf1_Vxf1;
|
|
//Qxf2
|
|
*(here->HICUMxf2Xf2Ptr + 1) += +XQxf2_Vxf2;
|
|
//Qxf
|
|
*(here->HICUMxfXfPtr + 1) += +XQxf_Vxf;
|
|
}
|
|
|
|
// Stamps with SH
|
|
if (selfheat) {
|
|
// Stamp element: Ibiei f_Bi = + f_Ei = -
|
|
*(here->HICUMbaseBItempPtr) += Ibiei_Vrth;
|
|
*(here->HICUMemitEItempPtr) += -Ibiei_Vrth;
|
|
// Stamp element: Ibpei f_Bp = + f_Ei = -
|
|
// with respect to Potential Vrth
|
|
*(here->HICUMbaseBPtempPtr) += Ibpei_Vrth;
|
|
*(here->HICUMemitEItempPtr) += -Ibpei_Vrth;
|
|
// Stamp element: Ibici f_Bi = + f_Ci = -
|
|
*(here->HICUMbaseBItempPtr) += Ibici_Vrth;
|
|
*(here->HICUMcollCItempPtr) += -Ibici_Vrth;
|
|
// Stamp element: Iciei f_Ci = + f_Ei = -
|
|
*(here->HICUMcollCItempPtr) += Iciei_Vrth;
|
|
*(here->HICUMemitEItempPtr) += -Iciei_Vrth;
|
|
// Stamp element: Ibpci f_Bp = + f_Ci = -
|
|
*(here->HICUMbaseBPtempPtr) += Ibpci_Vrth;
|
|
*(here->HICUMcollCItempPtr) += -Ibpci_Vrth;
|
|
// Stamp element: Rcx f_Ci = + f_C = -
|
|
*(here->HICUMcollCItempPtr) += Icic_Vrth;
|
|
*(here->HICUMcollTempPtr) += -Icic_Vrth;
|
|
// Stamp element: Rbx f_B = + f_Bp = -
|
|
*(here->HICUMbaseTempPtr) += Ibbp_Vrth;
|
|
*(here->HICUMbaseBPtempPtr) += -Ibbp_Vrth;
|
|
// Stamp element: Re f_Ei = + f_E = -
|
|
*(here->HICUMemitEItempPtr) += Ieie_Vrth;
|
|
*(here->HICUMemitTempPtr) += -Ieie_Vrth;
|
|
// Stamp element: Rbi f_Bp = + f_Bi = -
|
|
*(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth;
|
|
*(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth;
|
|
// Stamp element: Isici f_Si = + f_Ci = -
|
|
*(here->HICUMsubsSItempPtr) += Isici_Vrth;
|
|
*(here->HICUMcollCItempPtr) += -Isici_Vrth;
|
|
// Branch: bpsi, Stamp element: Its
|
|
*(here->HICUMbaseBPtempPtr) += Ibpsi_Vrth;
|
|
*(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth;
|
|
if (nqs) {
|
|
// Stamp element: Ixf f_xf = +
|
|
*(here->HICUMxfTempPtr) += Ixf_Vrth;
|
|
// Stamp element: Ixf1 f_xf1 = +
|
|
*(here->HICUMxf1TempPtr) += Ixf1_Vrth;
|
|
// Stamp element: Ixf2 f_xf2 = +
|
|
*(here->HICUMxf2TempPtr) += Ixf2_Vrth;
|
|
}
|
|
|
|
// Stamp element: Rth f_T = +
|
|
*(here->HICUMtempTempPtr) += Irth_Vrth;
|
|
|
|
// Stamp element: Ith f_T = - Ith
|
|
// with respect to Potential Vrth
|
|
*(here->HICUMtempTempPtr) += -Ith_Vrth;
|
|
// with respect to Potential Vbiei
|
|
*(here->HICUMtempBaseBIPtr) += -Ith_Vbiei;
|
|
*(here->HICUMtempEmitEIPtr) += +Ith_Vbiei;
|
|
// with respect to Potential Vbici
|
|
*(here->HICUMtempBaseBIPtr) += -Ith_Vbici;
|
|
*(here->HICUMtempCollCIPtr) += +Ith_Vbici;
|
|
// with respect to Potential Vciei
|
|
*(here->HICUMtempCollCIPtr) += -Ith_Vciei;
|
|
*(here->HICUMtempEmitEIPtr) += +Ith_Vciei;
|
|
// with respect to Potential Vbpei
|
|
*(here->HICUMtempBaseBPPtr) += -Ith_Vbpei;
|
|
*(here->HICUMtempEmitEIPtr) += +Ith_Vbpei;
|
|
// with respect to Potential Vbpci
|
|
*(here->HICUMtempBaseBPPtr) += -Ith_Vbpci;
|
|
*(here->HICUMtempCollCIPtr) += +Ith_Vbpci;
|
|
// with respect to Potential Vsici
|
|
*(here->HICUMtempSubsSIPtr) += -Ith_Vsici;
|
|
*(here->HICUMtempCollCIPtr) += +Ith_Vsici;
|
|
// with respect to Potential Vbpbi
|
|
*(here->HICUMtempBaseBPPtr) += -Ith_Vbpbi;
|
|
*(here->HICUMtempBaseBIPtr) += +Ith_Vbpbi;
|
|
// with respect to Potential Vcic
|
|
*(here->HICUMtempCollCIPtr) += -Ith_Vcic;
|
|
*(here->HICUMtempCollPtr) += +Ith_Vcic;
|
|
// with respect to Potential Vbbp
|
|
*(here->HICUMtempBasePtr) += -Ith_Vbbp;
|
|
*(here->HICUMtempBaseBPPtr) += +Ith_Vbbp;
|
|
// with respect to Potential Veie
|
|
*(here->HICUMtempEmitEIPtr) += -Ith_Veie;
|
|
*(here->HICUMtempEmitPtr) += +Ith_Veie;
|
|
|
|
//the charges
|
|
*(here->HICUMbaseBItempPtr + 1) += +XQrbi_Vrth;
|
|
*(here->HICUMbaseBPtempPtr + 1) += -XQrbi_Vrth;
|
|
*(here->HICUMbaseBItempPtr + 1) += +XQjei_Vrth;
|
|
*(here->HICUMemitEItempPtr + 1) += -XQjei_Vrth;
|
|
*(here->HICUMbaseBItempPtr + 1) += +XQf_Vrth;
|
|
*(here->HICUMemitEItempPtr + 1) += -XQf_Vrth;
|
|
*(here->HICUMbaseBItempPtr + 1) += +XQr_Vrth;
|
|
*(here->HICUMcollCItempPtr + 1) += -XQr_Vrth;
|
|
*(here->HICUMbaseBItempPtr + 1) += +XQjci_Vrth;
|
|
*(here->HICUMcollCItempPtr + 1) += -XQjci_Vrth;
|
|
*(here->HICUMbaseBPtempPtr + 1) += +XQjep_Vrth;
|
|
*(here->HICUMemitEItempPtr + 1) += -XQjep_Vrth;
|
|
*(here->HICUMbaseTempPtr + 1) += +Xqjcx0_t_i_Vrth;
|
|
*(here->HICUMcollCItempPtr + 1) += -Xqjcx0_t_i_Vrth;
|
|
*(here->HICUMbaseBPtempPtr + 1) += +Xqjcx0_t_ii_Vrth;
|
|
*(here->HICUMcollCItempPtr + 1) += -Xqjcx0_t_ii_Vrth;
|
|
*(here->HICUMbaseBPtempPtr + 1) += +XQdsu_Vrth;
|
|
*(here->HICUMcollCItempPtr + 1) += -XQdsu_Vrth;
|
|
*(here->HICUMsubsSItempPtr + 1) += +XQjs_Vrth;
|
|
*(here->HICUMcollCItempPtr + 1) += -XQjs_Vrth;
|
|
*(here->HICUMsubsTempPtr + 1) += +XQscp_Vrth;
|
|
*(here->HICUMcollTempPtr + 1) += -XQscp_Vrth;
|
|
*(here->HICUMtempTempPtr + 1) += +XQcth_Vrth;
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
return(OK);
|
|
}
|