Browse Source

complete vbic nqs effect implementation

pre-master-46
dwarning 2 years ago
committed by Holger Vogt
parent
commit
aae53f3641
  1. 89
      src/spicelib/devices/vbic/vbicacld.c
  2. 25
      src/spicelib/devices/vbic/vbicbindCSC.c
  3. 7
      src/spicelib/devices/vbic/vbicdefs.h
  4. 28
      src/spicelib/devices/vbic/vbicload.c
  5. 15
      src/spicelib/devices/vbic/vbicnoise.c
  6. 333
      src/spicelib/devices/vbic/vbicpzld.c
  7. 4
      src/spicelib/devices/vbic/vbicsetup.c

89
src/spicelib/devices/vbic/vbicacld.c

@ -39,6 +39,10 @@ VBICacLoad(GENmodel *inModel, CKTcircuit *ckt)
Ith_Vrci, Ith_Vbcx, Ith_Vrbi, Ith_Vrbp, Ith_Vrcx, Ith_Vrbx, Ith_Vre, Ith_Vrs;
double XQcth_Vrth, XQbe_Vrth, XQbex_Vrth, XQbc_Vrth, XQbcx_Vrth, XQbep_Vrth, XQbcp_Vrth;
//NQS
double Itxf_Vrxf, Ibc_Vrxf, Ith_Vrxf, Ixzf_Vrth, Ixxf_Vrxf, XQcxf_Vcxf;
double Ixzf_Vbei, Ixzf_Vbci, Xl;
/* loop through all the models */
for( ; model != NULL; model = VBICnextModel(model)) {
@ -90,17 +94,20 @@ c Stamp element: Ibex
*(here->VBICbaseBXEmitEIPtr) += -Ibex_Vbex;
*(here->VBICemitEIBaseBXPtr) += -Ibex_Vbex;
*(here->VBICemitEIEmitEIPtr) += Ibex_Vbex;
if (!here->VBIC_excessPhase) {
/*
c Stamp element: Itzf
*/
*(here->VBICcollCIBaseBIPtr) += Itzf_Vbei;
*(here->VBICcollCIEmitEIPtr) += -Itzf_Vbei;
*(here->VBICcollCIBaseBIPtr) += Itzf_Vbci;
*(here->VBICcollCICollCIPtr) += -Itzf_Vbci;
*(here->VBICemitEIBaseBIPtr) += -Itzf_Vbei;
*(here->VBICemitEIEmitEIPtr) += Itzf_Vbei;
*(here->VBICemitEIBaseBIPtr) += -Itzf_Vbci;
*(here->VBICemitEICollCIPtr) += Itzf_Vbci;
*(here->VBICcollCIBaseBIPtr) += Itzf_Vbei;
*(here->VBICcollCIEmitEIPtr) += -Itzf_Vbei;
*(here->VBICcollCIBaseBIPtr) += Itzf_Vbci;
*(here->VBICcollCICollCIPtr) += -Itzf_Vbci;
*(here->VBICemitEIBaseBIPtr) += -Itzf_Vbei;
*(here->VBICemitEIEmitEIPtr) += Itzf_Vbei;
*(here->VBICemitEIBaseBIPtr) += -Itzf_Vbci;
*(here->VBICemitEICollCIPtr) += Itzf_Vbci;
}
/*
c Stamp element: Itzr
*/
@ -230,7 +237,8 @@ c Stamp element: Rs
Ibe_Vrth = here->VBICibe_Vrth;
Ibex_Vrth = here->VBICibex_Vrth;
Itzf_Vrth = here->VBICitzf_vrth;
if (!here->VBIC_excessPhase)
Itzf_Vrth = here->VBICitzf_vrth;
Itzr_Vrth = here->VBICitzr_Vrth;
Ibc_Vrth = here->VBICibc_Vrth;
Ibep_Vrth = here->VBICibep_Vrth;
@ -271,11 +279,14 @@ c Stamp element: Ibex
*/
*(here->VBICbaseBXtempPtr) += Ibex_Vrth;
*(here->VBICemitEItempPtr) += -Ibex_Vrth;
if (!here->VBIC_excessPhase) {
/*
c Stamp element: Itzf
*/
*(here->VBICcollCItempPtr) += Itzf_Vrth;
*(here->VBICemitEItempPtr) += -Itzf_Vrth;
*(here->VBICcollCItempPtr) += Itzf_Vrth;
*(here->VBICemitEItempPtr) += -Itzf_Vrth;
}
/*
c Stamp element: Itzr
*/
@ -375,6 +386,44 @@ c Stamp element: Ith
*(here->VBICtempEmitEIPtr) += +Ith_Vre;
*(here->VBICtempSubsPtr) += -Ith_Vrs;
*(here->VBICtempSubsSIPtr) += +Ith_Vrs;
if (here->VBIC_excessPhase) {
Ith_Vrxf = *(ckt->CKTstate0 + here->VBICith_Vrxf);
*(here->VBICtempXf2Ptr) += +Ith_Vrxf;
}
}
if (here->VBIC_excessPhase) {
Itxf_Vrxf = *(ckt->CKTstate0 + here->VBICitxf_Vrxf);
Ibc_Vrxf = *(ckt->CKTstate0 + here->VBICibc_Vrxf);
Ixzf_Vbei = *(ckt->CKTstate0 + here->VBICixzf_Vbei);
Ixzf_Vbci = *(ckt->CKTstate0 + here->VBICixzf_Vbci);
Ixxf_Vrxf = *(ckt->CKTstate0 + here->VBICixxf_Vrxf);
/*
c Stamp element: Itxf
*/
*(here->VBICcollCIXf2Ptr) += Itxf_Vrxf;
*(here->VBICemitEIXf2Ptr) += -Itxf_Vrxf;
/*
c Stamp element: Ibc
*/
*(here->VBICbaseBIXf2Ptr) += Ibc_Vrxf;
*(here->VBICcollCIXf2Ptr) += -Ibc_Vrxf;
/*
c Stamp element: Ixzf, Branch: xf1-ground
*/
*(here->VBICxf1BaseBIPtr) += +Ixzf_Vbei;
*(here->VBICxf1EmitEIPtr) += -Ixzf_Vbei;
*(here->VBICxf1BaseBIPtr) += +Ixzf_Vbci;
*(here->VBICxf1CollCIPtr) += -Ixzf_Vbci;
if (here->VBIC_selfheat) {
Ixzf_Vrth = *(ckt->CKTstate0 + here->VBICixzf_Vrth);
*(here->VBICxf1TempPtr) += Ixzf_Vrth;
}
/*
c Stamp element: Ixxf, Branch: xf2-ground
*/
*(here->VBICxf2Xf2Ptr) += +Ixxf_Vrxf;
}
/*
@ -479,6 +528,24 @@ c Stamp element: Qbco
*(here->VBICsubsSItempPtr + 1) += XQbcp_Vrth;
*(here->VBICbaseBPtempPtr + 1) += -XQbcp_Vrth;
}
if (here->VBIC_excessPhase) {
/*
c Stamp element: Qcxf
*/
XQcxf_Vcxf = here->VBICcapQcxf * ckt->CKTomega;
*(here->VBICxf1Xf1Ptr + 1) += XQcxf_Vcxf;
/*
c Stamp element: L = TD/3
*/
Xl = here->VBICindInduct * ckt->CKTomega;
*(here->VBICxf1IbrPtr) += 1;
*(here->VBICxf2IbrPtr) -= 1;
*(here->VBICibrXf1Ptr) += 1;
*(here->VBICibrXf2Ptr) -= 1;
*(here->VBICibrIbrPtr + 1) -= Xl;
}
}
}

25
src/spicelib/devices/vbic/vbicbindCSC.c

@ -36,6 +36,7 @@ VBICbindCSC (GENmodel *inModel, CKTcircuit *ckt)
CREATE_KLU_BINDING_TABLE(VBICemitEIEmitEIPtr, VBICemitEIEmitEIBinding, VBICemitEINode, VBICemitEINode);
CREATE_KLU_BINDING_TABLE(VBICbaseBPBaseBPPtr, VBICbaseBPBaseBPBinding, VBICbaseBPNode, VBICbaseBPNode);
CREATE_KLU_BINDING_TABLE(VBICsubsSISubsSIPtr, VBICsubsSISubsSIBinding, VBICsubsSINode, VBICsubsSINode);
CREATE_KLU_BINDING_TABLE(VBICbaseEmitPtr, VBICbaseEmitBinding, VBICbaseNode, VBICemitNode);
CREATE_KLU_BINDING_TABLE(VBICemitBasePtr, VBICemitBaseBinding, VBICemitNode, VBICbaseNode);
CREATE_KLU_BINDING_TABLE(VBICbaseCollPtr, VBICbaseCollBinding, VBICbaseNode, VBICcollNode);
@ -56,6 +57,7 @@ VBICbindCSC (GENmodel *inModel, CKTcircuit *ckt)
CREATE_KLU_BINDING_TABLE(VBICbaseBXSubsSIPtr, VBICbaseBXSubsSIBinding, VBICbaseBXNode, VBICsubsSINode);
CREATE_KLU_BINDING_TABLE(VBICbaseBIEmitEIPtr, VBICbaseBIEmitEIBinding, VBICbaseBINode, VBICemitEINode);
CREATE_KLU_BINDING_TABLE(VBICbaseBPSubsSIPtr, VBICbaseBPSubsSIBinding, VBICbaseBPNode, VBICsubsSINode);
CREATE_KLU_BINDING_TABLE(VBICcollCXCollPtr, VBICcollCXCollBinding, VBICcollCXNode, VBICcollNode);
CREATE_KLU_BINDING_TABLE(VBICbaseBXBasePtr, VBICbaseBXBaseBinding, VBICbaseBXNode, VBICbaseNode);
CREATE_KLU_BINDING_TABLE(VBICemitEIEmitPtr, VBICemitEIEmitBinding, VBICemitEINode, VBICemitNode);
@ -101,7 +103,30 @@ VBICbindCSC (GENmodel *inModel, CKTcircuit *ckt)
CREATE_KLU_BINDING_TABLE(VBICtempSubsPtr, VBICtempSubsBinding, VBICtempNode, VBICsubsNode);
CREATE_KLU_BINDING_TABLE(VBICtempSubsSIPtr, VBICtempSubsSIBinding, VBICtempNode, VBICsubsSINode);
CREATE_KLU_BINDING_TABLE(VBICtempTempPtr, VBICtempTempBinding, VBICtempNode, VBICtempNode);
if (here->VBIC_excessPhase) {
CREATE_KLU_BINDING_TABLE(VBICtempXf2Ptr, VBICtempXf2Binding, VBICtempNode, VBICxf2Node);
CREATE_KLU_BINDING_TABLE(VBICxf1TempPtr, VBICxf1TempBinding, VBICxf1Node ,VBICtempNode);
}
}
if (here->VBIC_excessPhase) {
CREATE_KLU_BINDING_TABLE(VBICxf1Xf1Ptr , VBICxf1Xf1Binding , VBICxf1Node , VBICxf1Node);
CREATE_KLU_BINDING_TABLE(VBICxf1Xf2Ptr , VBICxf1Xf2Binding , VBICxf1Node , VBICxf2Node);
CREATE_KLU_BINDING_TABLE(VBICxf1CollCIPtr, VBICxf1CollCIBinding, VBICxf1Node , VBICcollCINode);
CREATE_KLU_BINDING_TABLE(VBICxf1BaseBIPtr, VBICxf1BaseBIBinding, VBICxf1Node , VBICbaseBINode);
CREATE_KLU_BINDING_TABLE(VBICxf1EmitEIPtr, VBICxf1EmitEIBinding, VBICxf1Node , VBICemitEINode);
CREATE_KLU_BINDING_TABLE(VBICxf2Xf2Ptr , VBICxf2Xf2Binding , VBICxf2Node , VBICxf2Node);
CREATE_KLU_BINDING_TABLE(VBICxf2Xf1Ptr , VBICxf2Xf1Binding , VBICxf2Node , VBICxf1Node);
CREATE_KLU_BINDING_TABLE(VBICcollCIXf2Ptr, VBICcollCIXf2Binding, VBICcollCINode, VBICxf2Node);
CREATE_KLU_BINDING_TABLE(VBICbaseBIXf2Ptr, VBICbaseBIXf2Binding, VBICbaseBINode, VBICxf2Node);
CREATE_KLU_BINDING_TABLE(VBICemitEIXf2Ptr, VBICemitEIXf2Binding, VBICemitEINode, VBICxf2Node);
CREATE_KLU_BINDING_TABLE(VBICxf1IbrPtr , VBICxf1IbrBinding , VBICxf1Node , VBICbrEq);
CREATE_KLU_BINDING_TABLE(VBICxf2IbrPtr , VBICxf2IbrBinding , VBICxf2Node , VBICbrEq);
CREATE_KLU_BINDING_TABLE(VBICibrXf2Ptr , VBICibrXf2Binding , VBICbrEq , VBICxf2Node);
CREATE_KLU_BINDING_TABLE(VBICibrXf1Ptr , VBICibrXf1Binding , VBICbrEq , VBICxf1Node);
CREATE_KLU_BINDING_TABLE(VBICibrIbrPtr , VBICibrIbrBinding , VBICbrEq , VBICbrEq);
}
}
}

7
src/spicelib/devices/vbic/vbicdefs.h

@ -309,7 +309,6 @@ typedef struct sVBICinstance {
double VBICith_Vbex;
double VBICith_Vbep;
double VBICith_Vbcp;
double VBICqf_Vxf;
double VBICith_Vcep;
double VBICith_Vrci;
double VBICith_Vbcx;
@ -321,6 +320,7 @@ typedef struct sVBICinstance {
double VBICith_Vrs;
double VBICindInduct;
double VBICcapQcxf;
int VBIC_selfheat; /* self-heating enabled */
int VBIC_excessPhase; /* excess phase enabled */
@ -344,6 +344,7 @@ typedef struct sVBICinstance {
BindElement *VBICemitEIEmitEIBinding ;
BindElement *VBICbaseBPBaseBPBinding ;
BindElement *VBICsubsSISubsSIBinding ;
BindElement *VBICbaseEmitBinding ;
BindElement *VBICemitBaseBinding ;
BindElement *VBICbaseCollBinding ;
@ -364,6 +365,7 @@ typedef struct sVBICinstance {
BindElement *VBICbaseBXSubsSIBinding ;
BindElement *VBICbaseBIEmitEIBinding ;
BindElement *VBICbaseBPSubsSIBinding ;
BindElement *VBICcollCXCollBinding ;
BindElement *VBICbaseBXBaseBinding ;
BindElement *VBICemitEIEmitBinding ;
@ -384,6 +386,7 @@ typedef struct sVBICinstance {
BindElement *VBICsubsSICollCIBinding ;
BindElement *VBICsubsSIBaseBIBinding ;
BindElement *VBICsubsSIBaseBPBinding ;
BindElement *VBICcollTempBinding ;
BindElement *VBICbaseTempBinding ;
BindElement *VBICemitTempBinding ;
@ -407,8 +410,10 @@ typedef struct sVBICinstance {
BindElement *VBICtempSubsBinding ;
BindElement *VBICtempSubsSIBinding ;
BindElement *VBICtempTempBinding ;
BindElement *VBICtempXf2Binding ;
BindElement *VBICxf1TempBinding ;
BindElement *VBICxf1Xf1Binding ;
BindElement *VBICxf1Xf2Binding ;
BindElement *VBICxf1CollCIBinding ;

28
src/spicelib/devices/vbic/vbicload.c

@ -98,7 +98,7 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
,Ith_Vrci=0.0,Ith_Vbcx=0.0,Ith_Vrbx=0.0,Ith_Vrbi=0.0,Ith_Vre=0.0,Ith_Vrbp=0.0,Qcth=0.0
,Qcth_Vrth=0.0,SCALE;
//NQS
double Vrxf, Vcxf, Itxf, Itxf_Vrxf, Ibc_Vrxf, Ith_Vrxf, Ixzf_Vrth,
double Vrxf, Vcxf, Itxf=0.0, Itxf_Vrxf=0.0, Ibc_Vrxf, Ith_Vrxf, Ixzf_Vrth,
Ixxf_Vrxf, Qcxf, Qcxf_Vcxf, Flxf, Flxf_Vrxf;
double Vxf1xf2, Rxf1xf2, newmind, req, veq;
@ -135,7 +135,6 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
int error;
double gqbeo, cqbeo, gqbco, cqbco, gbcx, cbcx;
double Icth, Icth_Vrth;
//NQS
double Ixzf,Ixxf;
double Ixzf_Vbei, Ixzf_Vbci;
@ -381,7 +380,7 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate0 + here->VBICitzr) =
*(ckt->CKTstate1 + here->VBICitzr);
*(ckt->CKTstate0 + here->VBICitzr_Vbei) =
*(ckt->CKTstate1 + here->VBICitzf_Vbei);
*(ckt->CKTstate1 + here->VBICitzr_Vbei);
*(ckt->CKTstate0 + here->VBICitzr_Vbci) =
*(ckt->CKTstate1 + here->VBICitzr_Vbci);
*(ckt->CKTstate0 + here->VBICibc) =
@ -453,14 +452,14 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate0+here->VBICixzf)=*(ckt->CKTstate1+here->VBICixzf;
*(ckt->CKTstate0+here->VBICixzf_Vbei)=*(ckt->CKTstate1+here->VBICixzf_Vbei);
*(ckt->CKTstate0+here->VBICixzf_Vbci)=*(ckt->CKTstate1+here->VBICixzf_Vbci);
*(ckt->CKTstate0+here->VBICixzf_Vrth)=*(ckt->CKTstate1+here->VBICixzf_Vrth);
*(ckt->CKTstate0+here->VBICixxf)=*(ckt->CKTstate1+here->VBICixxf;
*(ckt->CKTstate0+here->VBICixxf_Vrxf)=*(ckt->CKTstate1+here->VBICixxf_Vrxf);
*(ckt->CKTstate0+here->VBICitxf)=*(ckt->CKTstate1+here->VBICitxf;
*(ckt->CKTstate0+here->VBICitxf_Vrxf)=*(ckt->CKTstate1+here->VBICitxf_Vrxf);
*(ckt->CKTstate0+here->VBICith_Vrxf)=*(ckt->CKTstate1+here->VBICitxf_Vrxf);
if (here->VBIC_selfheat)
if (here->VBIC_selfheat) {
*(ckt->CKTstate0+here->VBICixzf_Vrth)=*(ckt->CKTstate1+here->VBICixzf_Vrth);
*(ckt->CKTstate0+here->VBICith_Vrxf)=*(ckt->CKTstate1+here->VBICith_Vrxf);
}
*(ckt->CKTstate0+here->VBICindFlux)=*(ckt->CKTstate1+here->VBICindFlux);
}
} else {
@ -610,7 +609,6 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
ckt->CKTreltol* MAX(fabs(ibexhat),
fabs(*(ckt->CKTstate0 + here->VBICibex)))+
ckt->CKTabstol) )
if (!here->VBIC_excessPhase)
if( (fabs(itzfhat-*(ckt->CKTstate0 + here->VBICitzf)) <
ckt->CKTreltol* MAX(fabs(itzfhat),
@ -621,7 +619,6 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
ckt->CKTreltol* MAX(fabs(ixzfhat),
fabs(*(ckt->CKTstate0 + here->VBICixzf)))+
ckt->CKTabstol) )
if( (fabs(itzrhat-*(ckt->CKTstate0 + here->VBICitzr)) <
ckt->CKTreltol* MAX(fabs(itzrhat),
fabs(*(ckt->CKTstate0 + here->VBICitzr)))+
@ -714,7 +711,6 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Itxf_Vrxf = *(ckt->CKTstate0 + here->VBICitxf_Vrxf);
Ixxf = *(ckt->CKTstate0 + here->VBICixxf);
Ixxf_Vrxf = *(ckt->CKTstate0 + here->VBICixxf_Vrxf);
Ith_Vrxf = *(ckt->CKTstate0 + here->VBICith_Vrxf);
Qcxf = *(ckt->CKTstate0 + here->VBICqcxf);
Icxf = *(ckt->CKTstate0 + here->VBICcqcxf);
Icxf_Vcxf = *(ckt->CKTstate0 + here->VBICgqcxf);
@ -723,8 +719,10 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
Ixzf_Vbei = *(ckt->CKTstate0 + here->VBICixzf_Vbei);
Ixzf_Vbci = *(ckt->CKTstate0 + here->VBICixzf_Vbci);
Ixzf_Vrth = *(ckt->CKTstate0 + here->VBICixzf_Vrth);
if (here->VBIC_selfheat)
if (here->VBIC_selfheat) {
Ixzf_Vrth = *(ckt->CKTstate0 + here->VBICixzf_Vrth);
Ith_Vrxf = *(ckt->CKTstate0 + here->VBICith_Vrxf);
}
Flxf = *(ckt->CKTstate0 + here->VBICindFlux);
}
goto load;
@ -887,7 +885,7 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
here->VBICcapqbcpth = Qbcp_Vrth;
}
if (here->VBIC_excessPhase) {
*(ckt->CKTstate0 + here->VBICcqcxf) = Qcxf_Vcxf;
here->VBICcapQcxf = Qcxf_Vcxf;
}
continue; /* go to 1000 */
}
@ -1121,7 +1119,6 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate0 + here->VBICitxf_Vrxf) = Itxf_Vrxf;
*(ckt->CKTstate0 + here->VBICixxf) = Ixxf;
*(ckt->CKTstate0 + here->VBICixxf_Vrxf) = Ixxf_Vrxf;
*(ckt->CKTstate0 + here->VBICith_Vrxf) = Ith_Vrxf;
*(ckt->CKTstate0 + here->VBICqcxf) = Qcxf;
*(ckt->CKTstate0 + here->VBICcqcxf) = Icxf;
*(ckt->CKTstate0 + here->VBICgqcxf) = Icxf_Vcxf;
@ -1129,9 +1126,10 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate0 + here->VBICixzf) = Ixzf;
*(ckt->CKTstate0 + here->VBICixzf_Vbei) = Ixzf_Vbei;
*(ckt->CKTstate0 + here->VBICixzf_Vbci) = Ixzf_Vbci;
*(ckt->CKTstate0 + here->VBICixzf_Vrth) = Ixzf_Vrth;
if (here->VBIC_selfheat)
if (here->VBIC_selfheat) {
*(ckt->CKTstate0 + here->VBICixzf_Vrth) = Ixzf_Vrth;
*(ckt->CKTstate0 + here->VBICith_Vrxf) = Ith_Vrxf;
}
*(ckt->CKTstate0 + here->VBICindFlux) = Flxf;
}
@ -1549,7 +1547,7 @@ c Stamp element: Ith
*(here->VBICtempSubsSIPtr) += +Ith_Vrs;
if (here->VBIC_excessPhase) {
rhs_current = -Ith_Vrxf*Vrxf;
*(ckt->CKTrhs + here->VBICxf2Node) += -rhs_current;
*(ckt->CKTrhs + here->VBICtempNode) += -rhs_current;
*(here->VBICtempXf2Ptr) += +Ith_Vrxf;
}
}

15
src/spicelib/devices/vbic/vbicnoise.c

@ -127,11 +127,16 @@ VBICnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *
ckt,THERMNOISE,inst->VBICsubsSINode,inst->VBICsubsNode,
*(ckt->CKTstate0 + inst->VBICirs_Vrs), dtemp);
NevalSrc(&noizDens[VBICICNOIZ],&lnNdens[VBICICNOIZ],
ckt,SHOTNOISE,inst->VBICcollCINode, inst->VBICemitEINode,
*(ckt->CKTstate0 + inst->VBICitzf));
if (!inst->VBIC_excessPhase) {
NevalSrc(&noizDens[VBICICNOIZ],&lnNdens[VBICICNOIZ],
ckt,SHOTNOISE,inst->VBICcollCINode, inst->VBICemitEINode,
*(ckt->CKTstate0 + inst->VBICitzf));
}
if (inst->VBIC_excessPhase) {
NevalSrc(&noizDens[VBICICNOIZ],&lnNdens[VBICICNOIZ],
ckt,SHOTNOISE,inst->VBICcollCINode, inst->VBICemitEINode,
*(ckt->CKTstate0 + inst->VBICitxf));
}
NevalSrc(&noizDens[VBICIBNOIZ],&lnNdens[VBICIBNOIZ],
ckt,SHOTNOISE,inst->VBICbaseBINode, inst->VBICemitEINode,
*(ckt->CKTstate0 + inst->VBICibe));

333
src/spicelib/devices/vbic/vbicpzld.c

@ -30,7 +30,18 @@ VBICpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
,Ibcp_Vbcp,Iccp_Vbep,Irs_Vrs,Iccp_Vbci,Iccp_Vbcp;
double XQbe_Vbei, XQbe_Vbci, XQbex_Vbex, XQbc_Vbci,
XQbcx_Vbcx, XQbep_Vbep, XQbep_Vbci,
XQbcp_Vbcp;
XQbcp_Vbcp, XQbeo_Vbe, XQbco_Vbc;
double Ibe_Vrth, Ibex_Vrth, Itzf_Vrth, Itzr_Vrth, Ibc_Vrth, Ibep_Vrth,
Ircx_Vrth, Irci_Vrth, Irbx_Vrth, Irbi_Vrth, Ire_Vrth, Irbp_Vrth,
Ibcp_Vrth, Iccp_Vrth, Irs_Vrth, Irth_Vrth, Ith_Vrth,
Ith_Vbei, Ith_Vbci, Ith_Vcei, Ith_Vbex, Ith_Vbep, Ith_Vbcp, Ith_Vcep,
Ith_Vrci, Ith_Vbcx, Ith_Vrbi, Ith_Vrbp, Ith_Vrcx, Ith_Vrbx, Ith_Vre, Ith_Vrs;
double XQcth_Vrth, XQbe_Vrth, XQbex_Vrth, XQbc_Vrth, XQbcx_Vrth, XQbep_Vrth, XQbcp_Vrth;
//NQS
double Itxf_Vrxf, Ibc_Vrxf, Ith_Vrxf, Ixzf_Vrth, Ixxf_Vrxf, XQcxf_Vcxf;
double Ixzf_Vbei, Ixzf_Vbci, Xl;
/* loop through all the models */
for( ; model != NULL; model = VBICnextModel(model)) {
@ -83,17 +94,20 @@ c Stamp element: Ibex
*(here->VBICbaseBXEmitEIPtr) += -Ibex_Vbex;
*(here->VBICemitEIBaseBXPtr) += -Ibex_Vbex;
*(here->VBICemitEIEmitEIPtr) += Ibex_Vbex;
if (!here->VBIC_excessPhase) {
/*
c Stamp element: Itzf
*/
*(here->VBICcollCIBaseBIPtr) += Itzf_Vbei;
*(here->VBICcollCIEmitEIPtr) += -Itzf_Vbei;
*(here->VBICcollCIBaseBIPtr) += Itzf_Vbci;
*(here->VBICcollCICollCIPtr) += -Itzf_Vbci;
*(here->VBICemitEIBaseBIPtr) += -Itzf_Vbei;
*(here->VBICemitEIEmitEIPtr) += Itzf_Vbei;
*(here->VBICemitEIBaseBIPtr) += -Itzf_Vbci;
*(here->VBICemitEICollCIPtr) += Itzf_Vbci;
*(here->VBICcollCIBaseBIPtr) += Itzf_Vbei;
*(here->VBICcollCIEmitEIPtr) += -Itzf_Vbei;
*(here->VBICcollCIBaseBIPtr) += Itzf_Vbci;
*(here->VBICcollCICollCIPtr) += -Itzf_Vbci;
*(here->VBICemitEIBaseBIPtr) += -Itzf_Vbei;
*(here->VBICemitEIEmitEIPtr) += Itzf_Vbei;
*(here->VBICemitEIBaseBIPtr) += -Itzf_Vbci;
*(here->VBICemitEICollCIPtr) += Itzf_Vbci;
}
/*
c Stamp element: Itzr
*/
@ -126,10 +140,10 @@ c Stamp element: Ibep
/*
c Stamp element: Ircx
*/
*(here->VBICcollCollPtr) += Ircx_Vrcx;
*(here->VBICcollCollPtr) += Ircx_Vrcx;
*(here->VBICcollCXCollCXPtr) += Ircx_Vrcx;
*(here->VBICcollCXCollPtr) += -Ircx_Vrcx;
*(here->VBICcollCollCXPtr) += -Ircx_Vrcx;
*(here->VBICcollCXCollPtr) += -Ircx_Vrcx;
*(here->VBICcollCollCXPtr) += -Ircx_Vrcx;
/*
c Stamp element: Irci
*/
@ -148,10 +162,10 @@ c Stamp element: Irci
/*
c Stamp element: Irbx
*/
*(here->VBICbaseBasePtr) += Irbx_Vrbx;
*(here->VBICbaseBasePtr) += Irbx_Vrbx;
*(here->VBICbaseBXBaseBXPtr) += Irbx_Vrbx;
*(here->VBICbaseBXBasePtr) += -Irbx_Vrbx;
*(here->VBICbaseBaseBXPtr) += -Irbx_Vrbx;
*(here->VBICbaseBXBasePtr) += -Irbx_Vrbx;
*(here->VBICbaseBaseBXPtr) += -Irbx_Vrbx;
/*
c Stamp element: Irbi
*/
@ -170,10 +184,10 @@ c Stamp element: Irbi
/*
c Stamp element: Ire
*/
*(here->VBICemitEmitPtr) += Ire_Vre;
*(here->VBICemitEmitPtr) += Ire_Vre;
*(here->VBICemitEIEmitEIPtr) += Ire_Vre;
*(here->VBICemitEIEmitPtr) += -Ire_Vre;
*(here->VBICemitEmitEIPtr) += -Ire_Vre;
*(here->VBICemitEIEmitPtr) += -Ire_Vre;
*(here->VBICemitEmitEIPtr) += -Ire_Vre;
/*
c Stamp element: Irbp
*/
@ -214,10 +228,204 @@ c Stamp element: Iccp
/*
c Stamp element: Irs
*/
*(here->VBICsubsSubsPtr) += Irs_Vrs;
*(here->VBICsubsSubsPtr) += Irs_Vrs;
*(here->VBICsubsSISubsSIPtr) += Irs_Vrs;
*(here->VBICsubsSISubsPtr) += -Irs_Vrs;
*(here->VBICsubsSubsSIPtr) += -Irs_Vrs;
*(here->VBICsubsSISubsPtr) += -Irs_Vrs;
*(here->VBICsubsSubsSIPtr) += -Irs_Vrs;
if (here->VBIC_selfheat) {
Ibe_Vrth = here->VBICibe_Vrth;
Ibex_Vrth = here->VBICibex_Vrth;
if (!here->VBIC_excessPhase)
Itzf_Vrth = here->VBICitzf_vrth;
Itzr_Vrth = here->VBICitzr_Vrth;
Ibc_Vrth = here->VBICibc_Vrth;
Ibep_Vrth = here->VBICibep_Vrth;
Ircx_Vrth = here->VBICircx_Vrth;
Irci_Vrth = here->VBICirci_Vrth;
Irbx_Vrth = here->VBICirbx_Vrth;
Irbi_Vrth = here->VBICirbi_Vrth;
Ire_Vrth = here->VBICire_Vrth;
Irbp_Vrth = here->VBICirbp_Vrth;
Ibcp_Vrth = here->VBICibcp_Vrth;
Iccp_Vrth = here->VBICiccp_Vrth;
Irs_Vrth = here->VBICirs_Vrth;
Irth_Vrth = here->VBICirth_Vrth;
Ith_Vrth = here->VBICith_Vrth;
Ith_Vbei = here->VBICith_Vbei;
Ith_Vbci = here->VBICith_Vbci;
Ith_Vcei = here->VBICith_Vcei;
Ith_Vbex = here->VBICith_Vbex;
Ith_Vbep = here->VBICith_Vbep;
Ith_Vbcp = here->VBICith_Vbcp;
Ith_Vcep = here->VBICith_Vcep;
Ith_Vrci = here->VBICith_Vrci;
Ith_Vbcx = here->VBICith_Vbcx;
Ith_Vrbi = here->VBICith_Vrbi;
Ith_Vrbp = here->VBICith_Vrbp;
Ith_Vrcx = here->VBICith_Vrcx;
Ith_Vrbx = here->VBICith_Vrbx;
Ith_Vre = here->VBICith_Vre;
Ith_Vrs = here->VBICith_Vrs;
/*
c Stamp element: Ibe
*/
*(here->VBICbaseBItempPtr) += Ibe_Vrth;
*(here->VBICemitEItempPtr) += -Ibe_Vrth;
/*
c Stamp element: Ibex
*/
*(here->VBICbaseBXtempPtr) += Ibex_Vrth;
*(here->VBICemitEItempPtr) += -Ibex_Vrth;
if (!here->VBIC_excessPhase) {
/*
c Stamp element: Itzf
*/
*(here->VBICcollCItempPtr) += Itzf_Vrth;
*(here->VBICemitEItempPtr) += -Itzf_Vrth;
}
/*
c Stamp element: Itzr
*/
*(here->VBICemitEItempPtr) += Itzr_Vrth;
*(here->VBICcollCItempPtr) += -Itzr_Vrth;
/*
c Stamp element: Ibc
*/
*(here->VBICbaseBItempPtr) += Ibc_Vrth;
*(here->VBICcollCItempPtr) += -Ibc_Vrth;
/*
c Stamp element: Ibep
*/
*(here->VBICbaseBXtempPtr) += Ibep_Vrth;
*(here->VBICbaseBPtempPtr) += -Ibep_Vrth;
/*
c Stamp element: Rcx
*/
*(here->VBICcollTempPtr) += Ircx_Vrth;
*(here->VBICcollCXtempPtr) += -Ircx_Vrth;
/*
c Stamp element: Irci
*/
*(here->VBICcollCXtempPtr) += Irci_Vrth;
*(here->VBICcollCItempPtr) += -Irci_Vrth;
/*
c Stamp element: Rbx
*/
*(here->VBICbaseTempPtr) += Irbx_Vrth;
*(here->VBICbaseBXtempPtr) += -Irbx_Vrth;
/*
c Stamp element: Irbi
*/
*(here->VBICbaseBXtempPtr) += Irbi_Vrth;
*(here->VBICbaseBItempPtr) += -Irbi_Vrth;
/*
c Stamp element: Re
*/
*(here->VBICemitTempPtr) += Ire_Vrth;
*(here->VBICemitEItempPtr) += -Ire_Vrth;
/*
c Stamp element: Irbp
*/
*(here->VBICbaseBPtempPtr) += Irbp_Vrth;
*(here->VBICcollCXtempPtr) += -Irbp_Vrth;
/*
c Stamp element: Ibcp
*/
*(here->VBICsubsSItempPtr) += Ibcp_Vrth;
*(here->VBICbaseBPtempPtr) += -Ibcp_Vrth;
/*
c Stamp element: Iccp
*/
*(here->VBICbaseBXtempPtr) += Iccp_Vrth;
*(here->VBICsubsSItempPtr) += -Iccp_Vrth;
/*
c Stamp element: Rs
*/
*(here->VBICsubsTempPtr) += Irs_Vrth;
*(here->VBICsubsSItempPtr) += -Irs_Vrth;
/*
c Stamp element: Rth
*/
*(here->VBICtempTempPtr) += Irth_Vrth;
/*
c Stamp element: Ith
*/
*(here->VBICtempTempPtr) += -Ith_Vrth;
*(here->VBICtempBaseBIPtr) += -Ith_Vbei;
*(here->VBICtempEmitEIPtr) += +Ith_Vbei;
*(here->VBICtempBaseBIPtr) += -Ith_Vbci;
*(here->VBICtempCollCIPtr) += +Ith_Vbci;
*(here->VBICtempCollCIPtr) += -Ith_Vcei;
*(here->VBICtempEmitEIPtr) += +Ith_Vcei;
*(here->VBICtempBaseBXPtr) += -Ith_Vbex;
*(here->VBICtempEmitEIPtr) += +Ith_Vbex;
*(here->VBICtempBaseBXPtr) += -Ith_Vbep;
*(here->VBICtempBaseBPPtr) += +Ith_Vbep;
*(here->VBICtempSubsPtr) += -Ith_Vbcp;
*(here->VBICtempBaseBPPtr) += +Ith_Vbcp;
*(here->VBICtempBaseBXPtr) += -Ith_Vcep;
*(here->VBICtempSubsPtr) += +Ith_Vcep;
*(here->VBICtempCollCXPtr) += -Ith_Vrci;
*(here->VBICtempCollCIPtr) += +Ith_Vrci;
*(here->VBICtempBaseBIPtr) += -Ith_Vbcx;
*(here->VBICtempCollCXPtr) += +Ith_Vbcx;
*(here->VBICtempBaseBXPtr) += -Ith_Vrbi;
*(here->VBICtempBaseBIPtr) += +Ith_Vrbi;
*(here->VBICtempBaseBPPtr) += -Ith_Vrbp;
*(here->VBICtempCollCXPtr) += +Ith_Vrbp;
*(here->VBICtempCollPtr) += -Ith_Vrcx;
*(here->VBICtempCollCXPtr) += +Ith_Vrcx;
*(here->VBICtempBasePtr) += -Ith_Vrbx;
*(here->VBICtempBaseBXPtr) += +Ith_Vrbx;
*(here->VBICtempEmitPtr) += -Ith_Vre;
*(here->VBICtempEmitEIPtr) += +Ith_Vre;
*(here->VBICtempSubsPtr) += -Ith_Vrs;
*(here->VBICtempSubsSIPtr) += +Ith_Vrs;
if (here->VBIC_excessPhase) {
Ith_Vrxf = *(ckt->CKTstate0 + here->VBICith_Vrxf);
*(here->VBICtempXf2Ptr) += +Ith_Vrxf;
}
}
if (here->VBIC_excessPhase) {
Itxf_Vrxf = *(ckt->CKTstate0 + here->VBICitxf_Vrxf);
Ibc_Vrxf = *(ckt->CKTstate0 + here->VBICibc_Vrxf);
Ixzf_Vbei = *(ckt->CKTstate0 + here->VBICixzf_Vbei);
Ixzf_Vbci = *(ckt->CKTstate0 + here->VBICixzf_Vbci);
Ixxf_Vrxf = *(ckt->CKTstate0 + here->VBICixxf_Vrxf);
/*
c Stamp element: Itxf
*/
*(here->VBICcollCIXf2Ptr) += Itxf_Vrxf;
*(here->VBICemitEIXf2Ptr) += -Itxf_Vrxf;
/*
c Stamp element: Ibc
*/
*(here->VBICbaseBIXf2Ptr) += Ibc_Vrxf;
*(here->VBICcollCIXf2Ptr) += -Ibc_Vrxf;
/*
c Stamp element: Ixzf, Branch: xf1-ground
*/
*(here->VBICxf1BaseBIPtr) += +Ixzf_Vbei;
*(here->VBICxf1EmitEIPtr) += -Ixzf_Vbei;
*(here->VBICxf1BaseBIPtr) += +Ixzf_Vbci;
*(here->VBICxf1CollCIPtr) += -Ixzf_Vbci;
if (here->VBIC_selfheat) {
Ixzf_Vrth = *(ckt->CKTstate0 + here->VBICixzf_Vrth);
*(here->VBICxf1TempPtr) += Ixzf_Vrth;
}
/*
c Stamp element: Ixxf, Branch: xf2-ground
*/
*(here->VBICxf2Xf2Ptr) += +Ixxf_Vrxf;
}
/*
c The complex part
*/
@ -229,6 +437,8 @@ c The complex part
XQbep_Vbep = *(ckt->CKTstate0 + here->VBICcqbep);
XQbep_Vbci = *(ckt->CKTstate0 + here->VBICcqbepci);
XQbcp_Vbcp = *(ckt->CKTstate0 + here->VBICcqbcp);
XQbeo_Vbe = *(ckt->CKTstate0 + here->VBICcqbeo);
XQbco_Vbc = *(ckt->CKTstate0 + here->VBICcqbco);
/*
c Stamp element: Qbe
*/
@ -312,6 +522,87 @@ c Stamp element: Qbcp
*(here->VBICbaseBPBaseBPPtr) += XQbcp_Vbcp * (s->real);
*(here->VBICbaseBPBaseBPPtr + 1) += XQbcp_Vbcp * (s->imag);
/*
c Stamp element: Qbeo
*/
*(here->VBICbaseBasePtr ) += XQbeo_Vbe * (s->real);
*(here->VBICbaseBasePtr + 1) += XQbeo_Vbe * (s->imag);
*(here->VBICemitEmitPtr ) += XQbeo_Vbe * (s->real);
*(here->VBICemitEmitPtr + 1) += XQbeo_Vbe * (s->imag);
*(here->VBICbaseEmitPtr ) += -XQbeo_Vbe * (s->real);
*(here->VBICbaseEmitPtr + 1) += -XQbeo_Vbe * (s->imag);
*(here->VBICemitBasePtr ) += -XQbeo_Vbe * (s->real);
*(here->VBICemitBasePtr + 1) += -XQbeo_Vbe * (s->imag);
/*
c Stamp element: Qbco
*/
*(here->VBICbaseBasePtr ) += XQbco_Vbc * (s->real);
*(here->VBICbaseBasePtr + 1) += XQbco_Vbc * (s->imag);
*(here->VBICcollCollPtr ) += XQbco_Vbc * (s->real);
*(here->VBICcollCollPtr + 1) += XQbco_Vbc * (s->imag);
*(here->VBICbaseCollPtr ) += -XQbco_Vbc * (s->real);
*(here->VBICbaseCollPtr + 1) += -XQbco_Vbc * (s->imag);
*(here->VBICcollBasePtr ) += -XQbco_Vbc * (s->real);
*(here->VBICcollBasePtr + 1) += -XQbco_Vbc * (s->imag);
if (here->VBIC_selfheat) {
XQcth_Vrth = here->VBICcapcth;
XQbe_Vrth = here->VBICcapqbeth;
XQbex_Vrth = here->VBICcapqbexth;
XQbc_Vrth = here->VBICcapqbcth;
XQbcx_Vrth = here->VBICcapqbcxth;
XQbep_Vrth = here->VBICcapqbepth;
XQbcp_Vrth = here->VBICcapqbcpth;
*(here->VBICtempTempPtr ) += XQcth_Vrth * (s->real);
*(here->VBICtempTempPtr + 1) += XQcth_Vrth * (s->imag);
*(here->VBICbaseBItempPtr ) += XQbe_Vrth * (s->real);
*(here->VBICbaseBItempPtr + 1) += XQbe_Vrth * (s->imag);
*(here->VBICemitEItempPtr ) += -XQbe_Vrth * (s->real);
*(here->VBICemitEItempPtr + 1) += -XQbe_Vrth * (s->imag);
*(here->VBICbaseBXtempPtr ) += XQbex_Vrth * (s->real);
*(here->VBICbaseBXtempPtr + 1) += XQbex_Vrth * (s->imag);
*(here->VBICemitEItempPtr ) += -XQbex_Vrth * (s->real);
*(here->VBICemitEItempPtr + 1) += -XQbex_Vrth * (s->imag);
*(here->VBICbaseBItempPtr ) += XQbc_Vrth * (s->real);
*(here->VBICbaseBItempPtr + 1) += XQbc_Vrth * (s->imag);
*(here->VBICcollCItempPtr ) += -XQbc_Vrth * (s->real);
*(here->VBICcollCItempPtr + 1) += -XQbc_Vrth * (s->imag);
*(here->VBICbaseBItempPtr ) += XQbcx_Vrth * (s->real);
*(here->VBICbaseBItempPtr + 1) += XQbcx_Vrth * (s->imag);
*(here->VBICcollCXtempPtr ) += -XQbcx_Vrth * (s->real);
*(here->VBICcollCXtempPtr + 1) += -XQbcx_Vrth * (s->imag);
*(here->VBICbaseBXtempPtr ) += XQbep_Vrth * (s->real);
*(here->VBICbaseBXtempPtr + 1) += XQbep_Vrth * (s->imag);
*(here->VBICbaseBPtempPtr ) += -XQbep_Vrth * (s->real);
*(here->VBICbaseBPtempPtr + 1) += -XQbep_Vrth * (s->imag);
*(here->VBICsubsSItempPtr ) += XQbcp_Vrth * (s->real);
*(here->VBICsubsSItempPtr + 1) += XQbcp_Vrth * (s->imag);
*(here->VBICbaseBPtempPtr ) += -XQbcp_Vrth * (s->real);
*(here->VBICbaseBPtempPtr + 1) += -XQbcp_Vrth * (s->imag);
}
if (here->VBIC_excessPhase) {
/*
c Stamp element: Qcxf
*/
XQcxf_Vcxf = here->VBICcapQcxf;
*(here->VBICxf1Xf1Ptr ) += XQcxf_Vcxf * s->real;
*(here->VBICxf1Xf1Ptr + 1) += XQcxf_Vcxf * s->imag;
/*
c Stamp element: L = TD/3
*/
Xl = here->VBICindInduct;
*(here->VBICxf1IbrPtr) += 1;
*(here->VBICxf2IbrPtr) -= 1;
*(here->VBICibrXf1Ptr) += 1;
*(here->VBICibrXf2Ptr) -= 1;
*(here->VBICibrIbrPtr ) -= Xl * s->real;
*(here->VBICibrIbrPtr + 1) -= Xl * s->imag;
}
}
}
return(OK);

4
src/spicelib/devices/vbic/vbicsetup.c

@ -623,20 +623,18 @@ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\
TSTALLOC(VBICxf1CollCIPtr, VBICxf1Node , VBICcollCINode);
TSTALLOC(VBICxf1BaseBIPtr, VBICxf1Node , VBICbaseBINode);
TSTALLOC(VBICxf1EmitEIPtr, VBICxf1Node , VBICemitEINode);
TSTALLOC(VBICxf2Xf2Ptr , VBICxf2Node , VBICxf2Node);
TSTALLOC(VBICxf2Xf1Ptr , VBICxf2Node , VBICxf1Node);
TSTALLOC(VBICcollCIXf2Ptr, VBICcollCINode, VBICxf2Node);
TSTALLOC(VBICbaseBIXf2Ptr, VBICbaseBINode, VBICxf2Node);
TSTALLOC(VBICemitEIXf2Ptr, VBICemitEINode, VBICxf2Node);
TSTALLOC(VBICxf1IbrPtr, VBICxf1Node, VBICbrEq);
TSTALLOC(VBICxf2IbrPtr, VBICxf2Node, VBICbrEq);
TSTALLOC(VBICibrXf2Ptr, VBICbrEq, VBICxf2Node);
TSTALLOC(VBICibrXf1Ptr, VBICbrEq, VBICxf1Node);
TSTALLOC(VBICibrIbrPtr, VBICbrEq, VBICbrEq);
}
}
}
return(OK);

Loading…
Cancel
Save