diff --git a/src/spicelib/devices/vbic/vbicacld.c b/src/spicelib/devices/vbic/vbicacld.c index 34332df6f..8b2f61725 100644 --- a/src/spicelib/devices/vbic/vbicacld.c +++ b/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; + + } } } diff --git a/src/spicelib/devices/vbic/vbicbindCSC.c b/src/spicelib/devices/vbic/vbicbindCSC.c index 72ee54c2b..90403845d 100644 --- a/src/spicelib/devices/vbic/vbicbindCSC.c +++ b/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); + } + } } diff --git a/src/spicelib/devices/vbic/vbicdefs.h b/src/spicelib/devices/vbic/vbicdefs.h index 1ac0dcb09..4e6bcb4af 100644 --- a/src/spicelib/devices/vbic/vbicdefs.h +++ b/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 ; diff --git a/src/spicelib/devices/vbic/vbicload.c b/src/spicelib/devices/vbic/vbicload.c index c0a415091..d761a684e 100644 --- a/src/spicelib/devices/vbic/vbicload.c +++ b/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; } } diff --git a/src/spicelib/devices/vbic/vbicnoise.c b/src/spicelib/devices/vbic/vbicnoise.c index 09dea77a6..f1995a24d 100644 --- a/src/spicelib/devices/vbic/vbicnoise.c +++ b/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)); diff --git a/src/spicelib/devices/vbic/vbicpzld.c b/src/spicelib/devices/vbic/vbicpzld.c index 18c59410a..484639903 100644 --- a/src/spicelib/devices/vbic/vbicpzld.c +++ b/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); diff --git a/src/spicelib/devices/vbic/vbicsetup.c b/src/spicelib/devices/vbic/vbicsetup.c index 9e5f60304..5c65aefc9 100644 --- a/src/spicelib/devices/vbic/vbicsetup.c +++ b/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);