protect nqs network

This commit is contained in:
Markus Mueller 2020-06-23 16:24:59 +02:00
parent 1c36e997ba
commit 75e3a4da64
4 changed files with 232 additions and 203 deletions

View File

@ -120,7 +120,8 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt)
/* loop through all the models */
for( ; model != NULL; model = HICUMnextModel(model)) {
int selfheat = ((model->HICUMflsh > 0) && (model->HICUMrthGiven) && (model->HICUMrth > 0.0));
int selfheat = ( (model->HICUMflsh > 0) && (model->HICUMrthGiven) && (model->HICUMrth > 0.0));
int nqs = ( (model->HICUMflnqs != 0 || model->HICUMflcomp == 0.0 || model->HICUMflcomp == 2.1) && (model->HICUMalit > 0 || model->HICUMalqf > 0));
/* loop through all the instances of the model */
for( here = HICUMinstances(model); here!= NULL;
@ -226,8 +227,10 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt)
*(here->HICUMemitEICollCIPtr) += Iciei_Vbici;
*(here->HICUMcollCICollCIPtr) += -Iciei_Vbici;
*(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbici;
*(here->HICUMcollCIXf2Ptr) += Iciei_Vxf2;
*(here->HICUMemitEIXf2Ptr) += -Iciei_Vxf2;
if (nqs) {
*(here->HICUMcollCIXf2Ptr) += Iciei_Vxf2;
*(here->HICUMemitEIXf2Ptr) += -Iciei_Vxf2;
}
// Stamp element: Ibici
*(here->HICUMbaseBIBaseBIPtr) += Ibici_Vbici;
@ -299,28 +302,28 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt)
*(here->HICUMsubsSISubsPtr) += -Isis_Vsis;
*(here->HICUMsubsSubsSIPtr) += -Isis_Vsis;
//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;
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 //////
@ -409,8 +412,10 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt)
*(here->HICUMemitEICollCIPtr +1) += XQf_Vbici;
*(here->HICUMbaseBICollCIPtr +1) += -XQf_Vbici;
*(here->HICUMemitEIBaseBIPtr +1) += -XQf_Vbici;
*(here->HICUMbaseBIXfPtr +1) += XQf_Vxf;
*(here->HICUMemitEIXfPtr +1) += -XQf_Vxf;
if (nqs) {
*(here->HICUMbaseBIXfPtr +1) += XQf_Vxf;
*(here->HICUMemitEIXfPtr +1) += -XQf_Vxf;
}
//Qjci
*(here->HICUMbaseBIBaseBIPtr +1) += XQjci_Vbici;
*(here->HICUMcollCICollCIPtr +1) += XQjci_Vbici;
@ -436,10 +441,11 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt)
*(here->HICUMcollCICollCIPtr +1) += XQdsu_Vbpci;
*(here->HICUMbaseBPCollCIPtr +1) += -XQdsu_Vbpci;
*(here->HICUMcollCIBaseBPPtr +1) += -XQdsu_Vbpci;
*(here->HICUMbaseBPBaseBPPtr +1) += XQdsu_Vsici;
*(here->HICUMsubsSISubsSIPtr +1) += XQdsu_Vsici;
*(here->HICUMbaseBPSubsSIPtr +1) += -XQdsu_Vsici;
*(here->HICUMsubsSIBaseBPPtr +1) += -XQdsu_Vsici;
//not implemented
// *(here->HICUMbaseBPBaseBPPtr +1) += XQdsu_Vsici;
// *(here->HICUMsubsSISubsSIPtr +1) += XQdsu_Vsici;
// *(here->HICUMbaseBPSubsSIPtr +1) += -XQdsu_Vsici;
// *(here->HICUMsubsSIBaseBPPtr +1) += -XQdsu_Vsici;
//Qjs
*(here->HICUMsubsSISubsSIPtr +1) += XQjs_Vsici;
*(here->HICUMcollCICollCIPtr +1) += XQjs_Vsici;
@ -475,12 +481,14 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt)
*(here->HICUMsubsSISubsSIPtr + 1) += XQsu_Vsis;
*(here->HICUMsubsSISubsPtr + 1) += -XQsu_Vsis;
*(here->HICUMsubsSubsSIPtr + 1) += -XQsu_Vsis;
//Qxf1
*(here->HICUMxf1Xf1Ptr + 1) += +XQxf1_Vxf1;
//Qxf2
*(here->HICUMxf2Xf2Ptr + 1) += +XQxf2_Vxf2;
//Qxf
*(here->HICUMxfXfPtr + 1) += +XQxf_Vxf;
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) {
@ -518,12 +526,14 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt)
// Branch: bpsi, Stamp element: Its
*(here->HICUMbaseBPtempPtr) += Ibpsi_Vrth;
*(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth;
// 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;
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: Ith f_T = - Ith
// with respect to Potential Vrth
@ -592,8 +602,8 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt)
*(here->HICUMsubsSItempPtr + 1) += -XQjs_Vrth;
*(here->HICUMcollCItempPtr + 1) += +XQjs_Vrth;
//Qscp from S to C f_S =- f_C =+
*(here->HICUMsubsTempPtr + 1) += -XQscp_Vrth;
*(here->HICUMcollTempPtr + 1) += +XQscp_Vrth;
// *(here->HICUMsubsTempPtr + 1) += -XQscp_Vrth;
// *(here->HICUMcollTempPtr + 1) += +XQscp_Vrth;
//Qcth from 0 to T f_0=- f_T=+
*(here->HICUMtempTempPtr + 1) += -XQcth_Vrth;

View File

@ -38,6 +38,7 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
for( ; model != NULL; model = HICUMnextModel(model)) {
int selfheat = (((model->HICUMflsh == 1) || (model->HICUMflsh == 2)) && (model->HICUMrthGiven) && (model->HICUMrth > 0.0));
int nqs = ( (model->HICUMflnqs != 0 || model->HICUMflcomp == 0.0 || model->HICUMflcomp == 2.1) && (model->HICUMalit > 0 || model->HICUMalqf > 0));
//Circuit simulator specific parameters
if(model->HICUMtype != NPN && model->HICUMtype != PNP)
@ -579,22 +580,26 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
}
}
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 (nqs) {
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;
}
} else {
here->HICUMxfNode = 0;
here->HICUMxf1Node = 0;
here->HICUMxf2Node = 0;
}
/* macro to make elements with built in test for out of memory */
@ -644,8 +649,10 @@ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\
TSTALLOC(HICUMbaseBIEmitEIPtr,HICUMbaseBINode,HICUMemitEINode); //ei-bi
TSTALLOC(HICUMemitEIBaseBIPtr,HICUMemitEINode,HICUMbaseBINode); //bi-ei
TSTALLOC(HICUMbaseBIXfPtr ,HICUMbaseBINode,HICUMxfNode); //ei-bi
TSTALLOC(HICUMemitEIXfPtr ,HICUMemitEINode,HICUMxfNode); //ei-bi
if (nqs) {
TSTALLOC(HICUMbaseBIXfPtr ,HICUMbaseBINode,HICUMxfNode); //ei-bi
TSTALLOC(HICUMemitEIXfPtr ,HICUMemitEINode,HICUMxfNode); //ei-bi
}
TSTALLOC(HICUMbaseBICollCIPtr,HICUMbaseBINode,HICUMcollCINode); //ci-bi
TSTALLOC(HICUMcollCIBaseBIPtr,HICUMcollCINode,HICUMbaseBINode); //bi-ci
@ -662,27 +669,28 @@ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\
TSTALLOC(HICUMsubsCollPtr,HICUMsubsNode,HICUMcollNode); //s-c
TSTALLOC(HICUMcollSubsPtr,HICUMcollNode,HICUMsubsNode); //c-s
TSTALLOC(HICUMxf1Xf1Ptr ,HICUMxf1Node ,HICUMxf1Node);
TSTALLOC(HICUMxf1TempPtr ,HICUMxf1Node ,HICUMtempNode);
TSTALLOC(HICUMxf1BaseBIPtr,HICUMxf1Node ,HICUMbaseBINode);
TSTALLOC(HICUMxf1EmitEIPtr,HICUMxf1Node ,HICUMemitEINode);
TSTALLOC(HICUMxf1CollCIPtr,HICUMxf1Node ,HICUMcollCINode);
TSTALLOC(HICUMxf1Xf2Ptr ,HICUMxf1Node ,HICUMxf2Node);
if (nqs) {
TSTALLOC(HICUMxf1Xf1Ptr ,HICUMxf1Node ,HICUMxf1Node);
TSTALLOC(HICUMxf1BaseBIPtr,HICUMxf1Node ,HICUMbaseBINode);
TSTALLOC(HICUMxf1EmitEIPtr,HICUMxf1Node ,HICUMemitEINode);
TSTALLOC(HICUMxf1CollCIPtr,HICUMxf1Node ,HICUMcollCINode);
TSTALLOC(HICUMxf1Xf2Ptr ,HICUMxf1Node ,HICUMxf2Node);
TSTALLOC(HICUMxf2Xf1Ptr ,HICUMxf2Node ,HICUMxf1Node);
TSTALLOC(HICUMxf2TempPtr ,HICUMxf2Node ,HICUMtempNode);
TSTALLOC(HICUMxf2BaseBIPtr,HICUMxf2Node ,HICUMbaseBINode);
TSTALLOC(HICUMxf2EmitEIPtr,HICUMxf2Node ,HICUMemitEINode);
TSTALLOC(HICUMxf2CollCIPtr,HICUMxf2Node ,HICUMcollCINode);
TSTALLOC(HICUMxf2Xf2Ptr ,HICUMxf2Node ,HICUMxf2Node);
TSTALLOC(HICUMemitEIXf2Ptr,HICUMemitEINode,HICUMxf2Node);
TSTALLOC(HICUMcollCIXf2Ptr,HICUMcollCINode,HICUMxf2Node);
TSTALLOC(HICUMxf2Xf1Ptr ,HICUMxf2Node ,HICUMxf1Node);
TSTALLOC(HICUMxf2BaseBIPtr,HICUMxf2Node ,HICUMbaseBINode);
TSTALLOC(HICUMxf2EmitEIPtr,HICUMxf2Node ,HICUMemitEINode);
TSTALLOC(HICUMxf2CollCIPtr,HICUMxf2Node ,HICUMcollCINode);
TSTALLOC(HICUMxf2Xf2Ptr ,HICUMxf2Node ,HICUMxf2Node);
TSTALLOC(HICUMemitEIXf2Ptr,HICUMemitEINode,HICUMxf2Node);
TSTALLOC(HICUMcollCIXf2Ptr,HICUMcollCINode,HICUMxf2Node);
TSTALLOC(HICUMxfXfPtr ,HICUMxfNode,HICUMxfNode);
TSTALLOC(HICUMxfTempPtr ,HICUMxfNode,HICUMtempNode);
TSTALLOC(HICUMxfEmitEIPtr ,HICUMxfNode,HICUMemitEINode);
TSTALLOC(HICUMxfCollCIPtr ,HICUMxfNode,HICUMcollCINode);
TSTALLOC(HICUMxfBaseBIPtr ,HICUMxfNode,HICUMbaseBINode);
TSTALLOC(HICUMxfXfPtr ,HICUMxfNode,HICUMxfNode);
TSTALLOC(HICUMxfEmitEIPtr ,HICUMxfNode,HICUMemitEINode);
TSTALLOC(HICUMxfCollCIPtr ,HICUMxfNode,HICUMcollCINode);
TSTALLOC(HICUMxfBaseBIPtr ,HICUMxfNode,HICUMbaseBINode);
}
TSTALLOC(HICUMbaseBPSubsSIPtr ,HICUMbaseBPNode,HICUMsubsSINode);
TSTALLOC(HICUMsubsSIBaseBPPtr ,HICUMsubsSINode,HICUMbaseBPNode);
@ -711,7 +719,13 @@ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\
TSTALLOC(HICUMtempSubsSIPtr,HICUMtempNode,HICUMsubsSINode);
TSTALLOC(HICUMtempTempPtr,HICUMtempNode,HICUMtempNode);
}
if (nqs) {
TSTALLOC(HICUMxfTempPtr ,HICUMxfNode,HICUMtempNode);
TSTALLOC(HICUMxf2TempPtr ,HICUMxf2Node ,HICUMtempNode);
TSTALLOC(HICUMxf1TempPtr ,HICUMxf1Node ,HICUMtempNode);
}
}
}
}
return(OK);
@ -729,6 +743,7 @@ HICUMunsetup(
model = HICUMnextModel(model))
{
int selfheat = (((model->HICUMflsh == 1) || (model->HICUMflsh == 2)) && (model->HICUMrthGiven) && (model->HICUMrth > 0.0));
int nqs = ( (model->HICUMflnqs != 0 || model->HICUMflcomp == 0.0 || model->HICUMflcomp == 2.1) && (model->HICUMalit > 0 || model->HICUMalqf > 0));
for (here = HICUMinstances(model); here != NULL;
here=HICUMnextInstance(here))
@ -764,17 +779,20 @@ HICUMunsetup(
}
}
if (nqs) {
if(here->HICUMxfNode > 0)
CKTdltNNum(ckt, here->HICUMxfNode);
here->HICUMxfNode = 0;
CKTdltNNum(ckt, here->HICUMxfNode);
here->HICUMxfNode = 0;
if(here->HICUMxf1Node > 0)
CKTdltNNum(ckt, here->HICUMxf1Node);
here->HICUMxf1Node = 0;
if(here->HICUMxf1Node > 0)
CKTdltNNum(ckt, here->HICUMxf1Node);
here->HICUMxf1Node = 0;
if(here->HICUMxf2Node > 0)
CKTdltNNum(ckt, here->HICUMxf2Node);
here->HICUMxf2Node = 0;
if(here->HICUMxf2Node > 0)
CKTdltNNum(ckt, here->HICUMxf2Node);
here->HICUMxf2Node = 0;
}
}
}

View File

@ -1197,6 +1197,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
// Model_initialization
int selfheat = ((model->HICUMflsh > 0) && (model->HICUMrthGiven) && (model->HICUMrth > 0.0));
int nqs = ( (model->HICUMflnqs != 0 || model->HICUMflcomp == 0.0 || model->HICUMflcomp == 2.1) && (model->HICUMalit > 0 || model->HICUMalqf > 0));
// Depletion capacitance splitting at b-c junction
// Capacitances at peripheral and external base node
@ -1873,12 +1874,14 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
here->HICUMtVcrit,&ichk3);
Vsici = DEVpnjlim(Vsici,*(ckt->CKTstate0 + here->HICUMvsici),here->HICUMvt.rpart,
here->HICUMtVcrit,&ichk4);
Vxf = DEVpnjlim(Vxf,*(ckt->CKTstate0 + here->HICUMvxf),here->HICUMvt.rpart,
here->HICUMtVcrit,&ichk5);
Vxf1 = DEVpnjlim(Vxf1,*(ckt->CKTstate0 + here->HICUMvxf1),here->HICUMvt.rpart,
here->HICUMtVcrit,&ichk6);
Vxf2 = DEVpnjlim(Vxf2,*(ckt->CKTstate0 + here->HICUMvxf2),here->HICUMvt.rpart,
here->HICUMtVcrit,&ichk7);
if (nqs) {
Vxf = DEVpnjlim(Vxf,*(ckt->CKTstate0 + here->HICUMvxf),here->HICUMvt.rpart,
here->HICUMtVcrit,&ichk5);
Vxf1 = DEVpnjlim(Vxf1,*(ckt->CKTstate0 + here->HICUMvxf1),here->HICUMvt.rpart,
here->HICUMtVcrit,&ichk6);
Vxf2 = DEVpnjlim(Vxf2,*(ckt->CKTstate0 + here->HICUMvxf2),here->HICUMvt.rpart,
here->HICUMtVcrit,&ichk7);
}
if (selfheat) {
ichk8 = 1;
Vrth = HICUMlimitlog(Vrth,
@ -2546,7 +2549,8 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
Qdeix_Vxf = 0.0;
// Excess Phase calculation
if ((model->HICUMflnqs != 0 || model->HICUMflcomp == 0.0 || model->HICUMflcomp == 2.1) && Tf != 0 && (model->HICUMalit > 0 || model->HICUMalqf > 0)) {
if ( (model->HICUMflnqs != 0 || model->HICUMflcomp == 0.0 || model->HICUMflcomp == 2.1) && Tf != 0 && (model->HICUMalit > 0 || model->HICUMalqf > 0)) {
Ixf1 = (Vxf2-itf)/Tf*model->HICUMt0;
Ixf1_Vxf2 = 1.0/Tf*model->HICUMt0;
Ixf1_ditf = -Ixf1_Vxf2;
@ -2848,20 +2852,22 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
Ibpsi_Vbpci += ckt->CKTgmin;
Ibpsi_Vsici += ckt->CKTgmin;
//Ixf
Ixf_Vbiei += ckt->CKTgmin;
Ixf_Vbici += ckt->CKTgmin;
Ixf_Vxf += ckt->CKTgmin;
//Ixf1
Ixf1_Vbiei += ckt->CKTgmin;
Ixf1_Vbici += ckt->CKTgmin;
Ixf1_Vxf2 += ckt->CKTgmin;
Ixf1_Vxf1 += ckt->CKTgmin;
//Ixf2
Ixf2_Vbiei += ckt->CKTgmin;
Ixf2_Vbici += ckt->CKTgmin;
Ixf2_Vxf2 += ckt->CKTgmin;
Ixf2_Vxf1 += ckt->CKTgmin;
if (nqs) {
//Ixf
Ixf_Vbiei += ckt->CKTgmin;
Ixf_Vbici += ckt->CKTgmin;
Ixf_Vxf += ckt->CKTgmin;
//Ixf1
Ixf1_Vbiei += ckt->CKTgmin;
Ixf1_Vbici += ckt->CKTgmin;
Ixf1_Vxf2 += ckt->CKTgmin;
Ixf1_Vxf1 += ckt->CKTgmin;
//Ixf2
Ixf2_Vbiei += ckt->CKTgmin;
Ixf2_Vbici += ckt->CKTgmin;
Ixf2_Vxf2 += ckt->CKTgmin;
Ixf2_Vxf1 += ckt->CKTgmin;
}
//SHE derivatives
if (selfheat) {
@ -2899,10 +2905,12 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
Ith_Veie += ckt->CKTgmin;
Ith_Vrth += ckt->CKTgmin;
// //NQS
Ixf_dT += ckt->CKTgmin;
Ixf1_dT += ckt->CKTgmin;
Ixf2_dT += ckt->CKTgmin;
if (nqs) {
// //NQS
Ixf_dT += ckt->CKTgmin;
Ixf1_dT += ckt->CKTgmin;
Ixf2_dT += ckt->CKTgmin;
}
}
// end of Load_sources
@ -3164,21 +3172,23 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
if(error) return(error);
Isc_Vsc = geq;
Isc = *(ckt->CKTstate0 + here->HICUMcqscp);
//Qxf
error = NIintegrate(ckt,&geq,&ceq,Qxf1_Vxf1,here->HICUMqxf);
if(error) return(error);
Ixf1_Vxf1 += geq;
Ixf1 += *(ckt->CKTstate0 + here->HICUMcqxf);
//Qxf2
error = NIintegrate(ckt,&geq,&ceq,Qxf2_Vxf2,here->HICUMqxf2);
if(error) return(error);
Ixf2_Vxf2 += geq;
Ixf2 += *(ckt->CKTstate0 + here->HICUMcqxf2);
//Qxf
error = NIintegrate(ckt,&geq,&ceq,Qxf_Vxf,here->HICUMqxf1);
if(error) return(error);
Ixf_Vxf += geq;
Ixf += *(ckt->CKTstate0 + here->HICUMcqxf1);
if (nqs) {
//Qxf
error = NIintegrate(ckt,&geq,&ceq,Qxf1_Vxf1,here->HICUMqxf);
if(error) return(error);
Ixf1_Vxf1 += geq;
Ixf1 += *(ckt->CKTstate0 + here->HICUMcqxf);
//Qxf2
error = NIintegrate(ckt,&geq,&ceq,Qxf2_Vxf2,here->HICUMqxf2);
if(error) return(error);
Ixf2_Vxf2 += geq;
Ixf2 += *(ckt->CKTstate0 + here->HICUMcqxf2);
//Qxf
error = NIintegrate(ckt,&geq,&ceq,Qxf_Vxf,here->HICUMqxf1);
if(error) return(error);
Ixf_Vxf += geq;
Ixf += *(ckt->CKTstate0 + here->HICUMcqxf1);
}
if (selfheat)
{
@ -3231,12 +3241,12 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
/*
* check convergence
*/
if ( (!(ckt->CKTmode & MODEINITFIX))||(!(here->HICUMoff))) {
if (icheck == 1) {
ckt->CKTnoncon++;
ckt->CKTtroubleElt = (GENinstance *) here;
}
}
// if ( (!(ckt->CKTmode & MODEINITFIX))||(!(here->HICUMoff))) {
// if (icheck == 1) {
// ckt->CKTnoncon++;
// ckt->CKTtroubleElt = (GENinstance *) here;
// }
// }
/*
* charge storage for electrostatic caps
@ -3491,9 +3501,11 @@ load:
*(here->HICUMemitEICollCIPtr) += Iciei_Vbici;
*(here->HICUMcollCICollCIPtr) += -Iciei_Vbici;
*(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbici;
// with respect to Vxf2
*(here->HICUMcollCIXf2Ptr) += Iciei_Vxf2;
*(here->HICUMemitEIXf2Ptr) += -Iciei_Vxf2;
if (nqs) {
// with respect to Vxf2
*(here->HICUMcollCIXf2Ptr) += Iciei_Vxf2;
*(here->HICUMemitEIXf2Ptr) += -Iciei_Vxf2;
}
// finish
// Branch: bci, Stamp element: Qbcx
@ -3620,50 +3632,37 @@ load:
// I(br_bxf) <+ Ixf; //for RC nw
// I(br_cxf) <+ ddt(Qxf); //for RC nw
// Branch: xf1-ground, Stamp element: Ixf1 f_xf1=+ //Markus has opposite sign than Dietmar. This current flows from xf1 to ground?
rhs_current = Ixf1 - Ixf1_Vbici*Vbici - Ixf1_Vbiei*Vbiei -Ixf1_Vxf1*Vxf1 - Ixf1_Vxf2*Vxf2;
*(ckt->CKTrhs + here->HICUMxf1Node) += -rhs_current; // rhs_current; // into xf1 node
*(here->HICUMxf1BaseBIPtr) += +Ixf1_Vbiei;
*(here->HICUMxf1EmitEIPtr) += -Ixf1_Vbiei;
*(here->HICUMxf1BaseBIPtr) += +Ixf1_Vbici;
*(here->HICUMxf1CollCIPtr) += -Ixf1_Vbici;
*(here->HICUMxf1Xf2Ptr) += +Ixf1_Vxf2;
*(here->HICUMxf1Xf1Ptr) += +Ixf1_Vxf1;
if (nqs) {
// Branch: xf1-ground, Stamp element: Ixf1 f_xf1=+ //Markus has opposite sign than Dietmar. This current flows from xf1 to ground?
rhs_current = Ixf1 - Ixf1_Vbici*Vbici - Ixf1_Vbiei*Vbiei -Ixf1_Vxf1*Vxf1 - Ixf1_Vxf2*Vxf2;
*(ckt->CKTrhs + here->HICUMxf1Node) += -rhs_current; // rhs_current; // into xf1 node
*(here->HICUMxf1BaseBIPtr) += +Ixf1_Vbiei;
*(here->HICUMxf1EmitEIPtr) += -Ixf1_Vbiei;
*(here->HICUMxf1BaseBIPtr) += +Ixf1_Vbici;
*(here->HICUMxf1CollCIPtr) += -Ixf1_Vbici;
*(here->HICUMxf1Xf2Ptr) += +Ixf1_Vxf2;
*(here->HICUMxf1Xf1Ptr) += +Ixf1_Vxf1;
// Branch: xf2-ground, Stamp element: Ixf2 f_xf2=+ //Markus has opposite sign than Dietmar. This current flows from xf1 to ground?
rhs_current = Ixf2 - Ixf2_Vbici*Vbici - Ixf2_Vbiei*Vbiei - Ixf2_Vxf1*Vxf1 - Ixf2_Vxf2*Vxf2;
*(ckt->CKTrhs + here->HICUMxf2Node) += -rhs_current; // rhs_current; // into xf2 node
*(here->HICUMxf2BaseBIPtr) += +Ixf2_Vbiei;
*(here->HICUMxf2EmitEIPtr) += -Ixf2_Vbiei;
*(here->HICUMxf2BaseBIPtr) += +Ixf2_Vbici;
*(here->HICUMxf2CollCIPtr) += -Ixf2_Vbici;
*(here->HICUMxf2Xf2Ptr) += +Ixf2_Vxf2;
*(here->HICUMxf2Xf1Ptr) += +Ixf2_Vxf1;
// Branch: xf2-ground, Stamp element: Ixf2 f_xf2=+ //Markus has opposite sign than Dietmar. This current flows from xf1 to ground?
rhs_current = Ixf2 - Ixf2_Vbici*Vbici - Ixf2_Vbiei*Vbiei - Ixf2_Vxf1*Vxf1 - Ixf2_Vxf2*Vxf2;
*(ckt->CKTrhs + here->HICUMxf2Node) += -rhs_current; // rhs_current; // into xf2 node
*(here->HICUMxf2BaseBIPtr) += +Ixf2_Vbiei;
*(here->HICUMxf2EmitEIPtr) += -Ixf2_Vbiei;
*(here->HICUMxf2BaseBIPtr) += +Ixf2_Vbici;
*(here->HICUMxf2CollCIPtr) += -Ixf2_Vbici;
*(here->HICUMxf2Xf2Ptr) += +Ixf2_Vxf2;
*(here->HICUMxf2Xf1Ptr) += +Ixf2_Vxf1;
// Branch: xf-ground, Stamp element: Ixf f_xf=+ //Markus has opposite sign than Dietmar. This current flows from xf1 to ground?
rhs_current = Ixf - Ixf_Vbici*Vbici - Ixf_Vbiei*Vbiei - Ixf_Vxf*Vxf;
*(ckt->CKTrhs + here->HICUMxfNode) += -rhs_current; // rhs_current; // into xf2 node
*(here->HICUMxfBaseBIPtr) += +Ixf_Vbiei;
*(here->HICUMxfEmitEIPtr) += -Ixf_Vbiei;
*(here->HICUMxfBaseBIPtr) += +Ixf_Vbici;
*(here->HICUMxfCollCIPtr) += -Ixf_Vbici;
*(here->HICUMxfXfPtr) += +Ixf_Vxf;
// Branch: xf-ground, Stamp element: Ixf f_xf=+ //Markus has opposite sign than Dietmar. This current flows from xf1 to ground?
rhs_current = Ixf - Ixf_Vbici*Vbici - Ixf_Vbiei*Vbiei - Ixf_Vxf*Vxf;
*(ckt->CKTrhs + here->HICUMxfNode) += -rhs_current; // rhs_current; // into xf2 node
*(here->HICUMxfBaseBIPtr) += +Ixf_Vbiei;
*(here->HICUMxfEmitEIPtr) += -Ixf_Vbiei;
*(here->HICUMxfBaseBIPtr) += +Ixf_Vbici;
*(here->HICUMxfCollCIPtr) += -Ixf_Vbici;
*(here->HICUMxfXfPtr) += +Ixf_Vxf;
}
/*
c Branch: xf1-ground, Stamp element: Rxf1 TODO: This is wrong, but needed at the moment for convergence
*/
// *(here->HICUMxf1Xf1Ptr) += 1; // current Ixf1 is normalized to Tf
/*
c Branch: xf2-ground, Stamp element: Rxf2
*/
// *(here->HICUMxf2Xf2Ptr) += 1; // current Ixf2 is normalized to Tf
/*
c Branch: xf-ground, Stamp element: Ixf
*/
/*
c Branch: xf-ground, Stamp element: Rxf
*/
// *(here->HICUMxfXfPtr) += 1; // current Ixf is normalized to Tf
// #############################################################
// ############### FINISH STAMPS NO SH #########################
@ -3779,26 +3778,28 @@ c Branch: xf-ground, Stamp element: Rxf
*(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth;
// finish
// Stamp element: Ixf f_xf = +
rhs_current = -Ixf_dT*Vrth;
*(ckt->CKTrhs + here->HICUMxfNode) += -rhs_current;
// with respect to Potential Vxf
*(here->HICUMxfTempPtr) += Ixf_dT;
// finish
if (nqs) {
// Stamp element: Ixf f_xf = +
rhs_current = -Ixf_dT*Vrth;
*(ckt->CKTrhs + here->HICUMxfNode) += -rhs_current;
// with respect to Potential Vxf
*(here->HICUMxfTempPtr) += Ixf_dT;
// finish
// Stamp element: Ixf1 f_xf1 = +
rhs_current = -Ixf1_dT*Vrth;
*(ckt->CKTrhs + here->HICUMxf1Node) += -rhs_current;
// with respect to Potential Vxf1
*(here->HICUMxf1TempPtr) += Ixf1_dT;
// finish
// Stamp element: Ixf1 f_xf1 = +
rhs_current = -Ixf1_dT*Vrth;
*(ckt->CKTrhs + here->HICUMxf1Node) += -rhs_current;
// with respect to Potential Vxf1
*(here->HICUMxf1TempPtr) += Ixf1_dT;
// finish
// Stamp element: Ixf2 f_xf2 = +
rhs_current = -Ixf2_dT*Vrth;
*(ckt->CKTrhs + here->HICUMxf2Node) += -rhs_current;
// with respect to Potential Vxf2
*(here->HICUMxf2TempPtr) += Ixf2_dT;
// finish
// Stamp element: Ixf2 f_xf2 = +
rhs_current = -Ixf2_dT*Vrth;
*(ckt->CKTrhs + here->HICUMxf2Node) += -rhs_current;
// with respect to Potential Vxf2
*(here->HICUMxf2TempPtr) += Ixf2_dT;
// finish
}
// Stamp element: Ith f_T = - Ith
rhs_current = Ith + Icth - Icth_Vrth*Vrth

View File

@ -35,15 +35,15 @@ pins coll base emit subs therm
float therm
checkPolarity n
test fgum_ac_npn_vert_nqs_dc
test fgum_ac_npn_full_ac
temperature 27
biases V(emit)=0 V(subs)=0
biasSweep V(base)=0.750000,1.050000,0.010000
biasList V(coll)=0.500000,1.000000,1.500000
outputs I(coll) I(base)
modelParameters parameters/npn_vert_nqs
freq dec 10 1e+010 2e+010
outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll)
modelParameters parameters/npn_full
//
// Specific tests
//