From a8f478ab892505a21eec859eafab0cb13e34f9a6 Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Wed, 23 Aug 2023 09:52:36 +0200 Subject: [PATCH] fixing vbic --- src/spicelib/devices/vbic/vbicacld.c | 212 +++++++++++++++++++++- src/spicelib/devices/vbic/vbicdefs.h | 160 ++++++++++------- src/spicelib/devices/vbic/vbicload.c | 241 ++++++++++++++++++++++---- src/spicelib/devices/vbic/vbicsetup.c | 4 - 4 files changed, 513 insertions(+), 104 deletions(-) diff --git a/src/spicelib/devices/vbic/vbicacld.c b/src/spicelib/devices/vbic/vbicacld.c index 0844fccd0..efd1d9daa 100644 --- a/src/spicelib/devices/vbic/vbicacld.c +++ b/src/spicelib/devices/vbic/vbicacld.c @@ -28,7 +28,13 @@ VBICacLoad(GENmodel *inModel, CKTcircuit *ckt) ,Irci_Vbci,Irci_Vbcx,Irbx_Vrbx,Irbi_Vrbi,Irbi_Vbei ,Irbi_Vbci,Ire_Vre,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci ,Ibcp_Vbcp,Iccp_Vbep,Irs_Vrs,Iccp_Vbci,Iccp_Vbcp; - double XQbe_Vbei, XQbe_Vbci, XQbex_Vbex, XQbc_Vbci, + 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; + double XQbe_Vbei,XQbco_Vbc,XQbeo_Vbe, XQbe_Vbci, XQbex_Vbex, XQbc_Vbci, XQbcx_Vbcx, XQbep_Vbep, XQbep_Vbci, XQbcp_Vbcp; @@ -65,6 +71,39 @@ VBICacLoad(GENmodel *inModel, CKTcircuit *ckt) Irbx_Vrbx = *(ckt->CKTstate0 + here->VBICirbx_Vrbx); Irs_Vrs = *(ckt->CKTstate0 + here->VBICirs_Vrs); Ire_Vre = *(ckt->CKTstate0 + here->VBICire_Vre); + // new self-heating related entries + Ibe_Vrth = *(ckt->CKTstate0 + here->VBICibe_Vrth); + Ibex_Vrth = *(ckt->CKTstate0 + here->VBICibex_Vrth); + Itzf_Vrth = *(ckt->CKTstate0 + here->VBICitzf_Vrth); + Itzr_Vrth = *(ckt->CKTstate0 + here->VBICitzr_Vrth); + Ibc_Vrth = *(ckt->CKTstate0 + here->VBICibc_Vrth); + Ibep_Vrth = *(ckt->CKTstate0 + here->VBICibep_Vrth); + Ircx_Vrth = *(ckt->CKTstate0 + here->VBICircx_Vrth); + Irci_Vrth = *(ckt->CKTstate0 + here->VBICirci_Vrth); + Irbx_Vrth = *(ckt->CKTstate0 + here->VBICirbx_Vrth); + Irbi_Vrth = *(ckt->CKTstate0 + here->VBICirbi_Vrth); + Ire_Vrth = *(ckt->CKTstate0 + here->VBICire_Vrth); + Irbp_Vrth = *(ckt->CKTstate0 + here->VBICirbp_Vrth); + Ibcp_Vrth = *(ckt->CKTstate0 + here->VBICibcp_Vrth); + Iccp_Vrth = *(ckt->CKTstate0 + here->VBICiccp_Vrth); + Irs_Vrth = *(ckt->CKTstate0 + here->VBICirs_Vrth); + Irth_Vrth = *(ckt->CKTstate0 + here->VBICirth_Vrth); + Ith_Vrth = *(ckt->CKTstate0 + here->VBICith_Vrth); + Ith_Vbei = *(ckt->CKTstate0 + here->VBICith_Vbei); + Ith_Vbci = *(ckt->CKTstate0 + here->VBICith_Vbci); + Ith_Vcei = *(ckt->CKTstate0 + here->VBICith_Vcei); + Ith_Vbex = *(ckt->CKTstate0 + here->VBICith_Vbex); + Ith_Vbep = *(ckt->CKTstate0 + here->VBICith_Vbep); + Ith_Vbcp = *(ckt->CKTstate0 + here->VBICith_Vbcp); + Ith_Vcep = *(ckt->CKTstate0 + here->VBICith_Vcep); + Ith_Vrci = *(ckt->CKTstate0 + here->VBICith_Vrci); + Ith_Vbcx = *(ckt->CKTstate0 + here->VBICith_Vbcx); + Ith_Vrbi = *(ckt->CKTstate0 + here->VBICith_Vrbi); + Ith_Vrbp = *(ckt->CKTstate0 + here->VBICith_Vrbp); + Ith_Vrcx = *(ckt->CKTstate0 + here->VBICith_Vrcx); + Ith_Vrbx = *(ckt->CKTstate0 + here->VBICith_Vrbx); + Ith_Vre = *(ckt->CKTstate0 + here->VBICith_Vre); + Ith_Vrs = *(ckt->CKTstate0 + here->VBICith_Vrs); /* c The real part @@ -229,15 +268,43 @@ c The complex part XQbep_Vbep = *(ckt->CKTstate0 + here->VBICcqbep) * ckt->CKTomega; XQbep_Vbci = *(ckt->CKTstate0 + here->VBICcqbepci) * ckt->CKTomega; XQbcp_Vbcp = *(ckt->CKTstate0 + here->VBICcqbcp) * ckt->CKTomega; + XQbeo_Vbe = *(ckt->CKTstate0 + here->VBICcqbeo) * ckt->CKTomega; + XQbco_Vbc = *(ckt->CKTstate0 + here->VBICcqbco) * ckt->CKTomega; + + // self heating related charge changes + XQcth_Vrth = *(ckt->CKTstate0 + here->VBICcqcth) * ckt->CKTomega; + XQbe_Vrth = *(ckt->CKTstate0 + here->VBICcqbeth) * ckt->CKTomega; + XQbex_Vrth = *(ckt->CKTstate0 + here->VBICcqbexth) * ckt->CKTomega; + XQbc_Vrth = *(ckt->CKTstate0 + here->VBICcqbcth) * ckt->CKTomega; + XQbcx_Vrth = *(ckt->CKTstate0 + here->VBICcqbcxth) * ckt->CKTomega; + XQbep_Vrth = *(ckt->CKTstate0 + here->VBICcqbepth) * ckt->CKTomega; + XQbcp_Vrth = *(ckt->CKTstate0 + here->VBICcqbcpth) * ckt->CKTomega; + +/* +c Stamp element: Qbeo +*/ + *(here->VBICbaseBasePtr + 1) += XQbeo_Vbe; + *(here->VBICbaseEmitPtr + 1) += -XQbeo_Vbe; + *(here->VBICemitBasePtr + 1) += -XQbeo_Vbe; + *(here->VBICemitEmitPtr + 1) += XQbeo_Vbe; + +/* +c Stamp element: Qbco +*/ + *(here->VBICbaseBasePtr + 1) += XQbco_Vbc; + *(here->VBICbaseCollPtr + 1) += -XQbco_Vbc; + *(here->VBICcollBasePtr + 1) += -XQbco_Vbc; + *(here->VBICcollCollPtr + 1) += XQbco_Vbc; + /* c Stamp element: Qbe */ *(here->VBICbaseBIBaseBIPtr + 1) += XQbe_Vbei; *(here->VBICbaseBIEmitEIPtr + 1) += -XQbe_Vbei; - *(here->VBICbaseBIBaseBIPtr + 1) += XQbe_Vbci; - *(here->VBICbaseBICollCIPtr + 1) += -XQbe_Vbci; *(here->VBICemitEIBaseBIPtr + 1) += -XQbe_Vbei; *(here->VBICemitEIEmitEIPtr + 1) += XQbe_Vbei; + *(here->VBICbaseBIBaseBIPtr + 1) += XQbe_Vbci; + *(here->VBICbaseBICollCIPtr + 1) += -XQbe_Vbci; *(here->VBICemitEIBaseBIPtr + 1) += -XQbe_Vbci; *(here->VBICemitEICollCIPtr + 1) += XQbe_Vbci; /* @@ -280,6 +347,145 @@ c Stamp element: Qbcp *(here->VBICbaseBPSubsSIPtr + 1) += -XQbcp_Vbcp; *(here->VBICbaseBPBaseBPPtr + 1) += XQbcp_Vbcp; + if (here->VBIC_selfheat) { +/* +c Stamp element: Ibe +*/ + *(here->VBICbaseBItempPtr) += Ibe_Vrth; + *(here->VBICemitEItempPtr) += -Ibe_Vrth; +/* +c Stamp element: Ibex +*/ + *(here->VBICbaseBXtempPtr) += Ibex_Vrth; + *(here->VBICemitEItempPtr) += -Ibex_Vrth; +/* +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; + + // //the charges + *(here->VBICbaseBItempPtr + 1) += +XQbe_Vrth; + *(here->VBICemitEItempPtr + 1) += -XQbe_Vrth; + + *(here->VBICbaseBXtempPtr + 1) += +XQbex_Vrth; + *(here->VBICemitEItempPtr + 1) += -XQbex_Vrth; + + *(here->VBICbaseBItempPtr + 1) += +XQbc_Vrth; + *(here->VBICcollCItempPtr + 1) += -XQbc_Vrth; + + *(here->VBICbaseBItempPtr + 1) += +XQbcx_Vrth; + *(here->VBICcollCXtempPtr + 1) += -XQbcx_Vrth; + + *(here->VBICbaseBXtempPtr + 1) += +XQbep_Vrth; + *(here->VBICbaseBPtempPtr + 1) += -XQbep_Vrth; + + *(here->VBICsubsSItempPtr + 1) += +XQbcp_Vrth; + *(here->VBICbaseBPtempPtr + 1) += -XQbcp_Vrth; + + *(here->VBICtempTempPtr + 1) += -XQcth_Vrth; + + } + } } return(OK); diff --git a/src/spicelib/devices/vbic/vbicdefs.h b/src/spicelib/devices/vbic/vbicdefs.h index 1ed3f31f1..eca3cc9f4 100644 --- a/src/spicelib/devices/vbic/vbicdefs.h +++ b/src/spicelib/devices/vbic/vbicdefs.h @@ -274,89 +274,129 @@ typedef struct sVBICinstance { #define VBICibe VBICstate+9 #define VBICibe_Vbei VBICstate+10 +#define VBICibe_Vrth VBICstate+11 -#define VBICibex VBICstate+11 -#define VBICibex_Vbex VBICstate+12 +#define VBICibex VBICstate+12 +#define VBICibex_Vbex VBICstate+13 +#define VBICibex_Vrth VBICstate+14 -#define VBICitzf VBICstate+13 -#define VBICitzf_Vbei VBICstate+14 -#define VBICitzf_Vbci VBICstate+15 +#define VBICitzf VBICstate+15 +#define VBICitzf_Vbei VBICstate+16 +#define VBICitzf_Vbci VBICstate+17 +#define VBICitzf_Vrth VBICstate+18 -#define VBICitzr VBICstate+16 -#define VBICitzr_Vbci VBICstate+17 -#define VBICitzr_Vbei VBICstate+18 +#define VBICitzr VBICstate+19 +#define VBICitzr_Vbci VBICstate+20 +#define VBICitzr_Vbei VBICstate+21 +#define VBICitzr_Vrth VBICstate+22 -#define VBICibc VBICstate+19 -#define VBICibc_Vbci VBICstate+20 -#define VBICibc_Vbei VBICstate+21 +#define VBICibc VBICstate+23 +#define VBICibc_Vbci VBICstate+24 +#define VBICibc_Vbei VBICstate+25 +#define VBICibc_Vrth VBICstate+26 -#define VBICibep VBICstate+22 -#define VBICibep_Vbep VBICstate+23 +#define VBICibep VBICstate+27 +#define VBICibep_Vbep VBICstate+28 +#define VBICibep_Vrth VBICstate+29 -#define VBICirci VBICstate+24 -#define VBICirci_Vrci VBICstate+25 -#define VBICirci_Vbci VBICstate+26 -#define VBICirci_Vbcx VBICstate+27 +#define VBICirci VBICstate+30 +#define VBICirci_Vrci VBICstate+31 +#define VBICirci_Vbci VBICstate+32 +#define VBICirci_Vbcx VBICstate+33 +#define VBICirci_Vrth VBICstate+34 -#define VBICirbi VBICstate+28 -#define VBICirbi_Vrbi VBICstate+29 -#define VBICirbi_Vbei VBICstate+30 -#define VBICirbi_Vbci VBICstate+31 +#define VBICirbi VBICstate+35 +#define VBICirbi_Vrbi VBICstate+36 +#define VBICirbi_Vbei VBICstate+37 +#define VBICirbi_Vbci VBICstate+38 +#define VBICirbi_Vrth VBICstate+39 -#define VBICirbp VBICstate+32 -#define VBICirbp_Vrbp VBICstate+33 -#define VBICirbp_Vbep VBICstate+34 -#define VBICirbp_Vbci VBICstate+35 +#define VBICirbp VBICstate+40 +#define VBICirbp_Vrbp VBICstate+41 +#define VBICirbp_Vbep VBICstate+42 +#define VBICirbp_Vbci VBICstate+43 +#define VBICirbp_Vrth VBICstate+44 -#define VBICqbe VBICstate+36 -#define VBICcqbe VBICstate+37 -#define VBICcqbeci VBICstate+38 +#define VBICqbe VBICstate+45 +#define VBICcqbe VBICstate+46 +#define VBICcqbeci VBICstate+47 +#define VBICcqbeth VBICstate+48 -#define VBICqbex VBICstate+39 -#define VBICcqbex VBICstate+40 +#define VBICqbex VBICstate+49 +#define VBICcqbex VBICstate+50 +#define VBICcqbexth VBICstate+51 -#define VBICqbc VBICstate+41 -#define VBICcqbc VBICstate+42 +#define VBICqbc VBICstate+52 +#define VBICcqbc VBICstate+53 +#define VBICcqbcth VBICstate+54 -#define VBICqbcx VBICstate+43 -#define VBICcqbcx VBICstate+44 +#define VBICqbcx VBICstate+55 +#define VBICcqbcx VBICstate+56 +#define VBICcqbcxth VBICstate+57 -#define VBICqbep VBICstate+45 -#define VBICcqbep VBICstate+46 -#define VBICcqbepci VBICstate+47 +#define VBICqbep VBICstate+58 +#define VBICcqbep VBICstate+59 +#define VBICcqbepci VBICstate+60 +#define VBICcqbepth VBICstate+61 -#define VBICqbeo VBICstate+48 -#define VBICcqbeo VBICstate+49 -#define VBICgqbeo VBICstate+50 +#define VBICqbeo VBICstate+62 +#define VBICcqbeo VBICstate+63 +#define VBICgqbeo VBICstate+64 -#define VBICqbco VBICstate+51 -#define VBICcqbco VBICstate+52 -#define VBICgqbco VBICstate+53 +#define VBICqbco VBICstate+65 +#define VBICcqbco VBICstate+66 +#define VBICgqbco VBICstate+67 -#define VBICibcp VBICstate+54 -#define VBICibcp_Vbcp VBICstate+55 +#define VBICibcp VBICstate+68 +#define VBICibcp_Vrth VBICstate+69 +#define VBICibcp_Vbcp VBICstate+70 -#define VBICiccp VBICstate+56 -#define VBICiccp_Vbep VBICstate+57 -#define VBICiccp_Vbci VBICstate+58 -#define VBICiccp_Vbcp VBICstate+59 +#define VBICiccp VBICstate+71 +#define VBICiccp_Vbep VBICstate+72 +#define VBICiccp_Vbci VBICstate+73 +#define VBICiccp_Vbcp VBICstate+74 +#define VBICiccp_Vrth VBICstate+75 -#define VBICqbcp VBICstate+60 -#define VBICcqbcp VBICstate+61 +#define VBICqbcp VBICstate+76 +#define VBICcqbcp VBICstate+77 +#define VBICcqbcpth VBICstate+78 -#define VBICircx_Vrcx VBICstate+62 -#define VBICirbx_Vrbx VBICstate+63 -#define VBICirs_Vrs VBICstate+64 -#define VBICire_Vre VBICstate+65 +#define VBICircx_Vrcx VBICstate+79 +#define VBICircx_Vrth VBICstate+80 +#define VBICirbx_Vrbx VBICstate+81 +#define VBICirbx_Vrth VBICstate+82 +#define VBICirs_Vrs VBICstate+83 +#define VBICirs_Vrth VBICstate+84 +#define VBICire_Vre VBICstate+85 +#define VBICire_Vrth VBICstate+86 -#define VBICqcth VBICstate+66 /* thermal capacitor charge */ -#define VBICcqcth VBICstate+67 /* thermal capacitor current */ +#define VBICqcth VBICstate+87 /* thermal capacitor charge */ +#define VBICcqcth VBICstate+88 /* thermal capacitor current */ -#define VBICvrth VBICstate+68 -#define VBICicth_Vrth VBICstate+69 +#define VBICvrth VBICstate+89 +#define VBICicth_Vrth VBICstate+90 -#define VBICnumStates 70 +#define VBICirth_Vrth VBICstate+91 + +#define VBICith_Vrth VBICstate+92 +#define VBICith_Vrs VBICstate+93 +#define VBICith_Vbei VBICstate+94 +#define VBICith_Vbci VBICstate+95 +#define VBICith_Vcei VBICstate+96 +#define VBICith_Vbex VBICstate+97 +#define VBICith_Vbep VBICstate+98 +#define VBICith_Vbcp VBICstate+99 +#define VBICith_Vcep VBICstate+100 +#define VBICith_Vrci VBICstate+101 +#define VBICith_Vbcx VBICstate+102 +#define VBICith_Vrbi VBICstate+103 +#define VBICith_Vrbp VBICstate+104 +#define VBICith_Vrcx VBICstate+105 +#define VBICith_Vrbx VBICstate+106 +#define VBICith_Vre VBICstate+107 + +#define VBICnumStates 108 /* per model data */ typedef struct sVBICmodel { /* model structure for a vbic */ diff --git a/src/spicelib/devices/vbic/vbicload.c b/src/spicelib/devices/vbic/vbicload.c index 5ebf217e6..ba9d23642 100644 --- a/src/spicelib/devices/vbic/vbicload.c +++ b/src/spicelib/devices/vbic/vbicload.c @@ -18,7 +18,7 @@ Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH #include "ngspice/sperror.h" #include "ngspice/devdefs.h" -int vbic_4T_et_cf_fj(double *, +int vbic_4T_et_cf_fj(double *, double *, double *,double *,double *,double *,double *,double *, double *,double *,double *,double *,double *,double *, double *, double *,double *,double *,double *,double *,double *, double *, @@ -118,59 +118,59 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt) * model parameters */ p[0] = model->VBICtnom; - p[1] = here->VBICtextCollResist; - p[2] = here->VBICtintCollResist; - p[3] = here->VBICtepiSatVoltage; - p[4] = here->VBICtepiDoping; + p[1] = model->VBICextCollResist; + p[2] = model->VBICintCollResist; + p[3] = model->VBICepiSatVoltage; + p[4] = model->VBICepiDoping; p[5] = model->VBIChighCurFac; - p[6] = here->VBICtextBaseResist; - p[7] = here->VBICtintBaseResist; - p[8] = here->VBICtemitterResist; - p[9] = here->VBICtsubstrateResist; - p[10] = here->VBICtparBaseResist; - p[11] = here->VBICtsatCur; - p[12] = here->VBICtemissionCoeffF; - p[13] = here->VBICtemissionCoeffR; + p[6] = model->VBICextBaseResist; + p[7] = model->VBICintBaseResist; + p[8] = model->VBICemitterResist; + p[9] = model->VBICsubstrateResist; + p[10] = model->VBICparBaseResist; + p[11] = model->VBICsatCur; + p[12] = model->VBICemissionCoeffF; + p[13] = model->VBICemissionCoeffR; p[14] = model->VBICdeplCapLimitF; p[15] = model->VBICextOverlapCapBE; - p[16] = here->VBICtdepletionCapBE; - p[17] = here->VBICtpotentialBE; + p[16] = model->VBICdepletionCapBE; + p[17] = model->VBICpotentialBE; p[18] = model->VBICjunctionExpBE; p[19] = model->VBICsmoothCapBE; p[20] = model->VBICextOverlapCapBC; - p[21] = here->VBICtdepletionCapBC; + p[21] = model->VBICdepletionCapBC; p[22] = model->VBICepiCharge; - p[23] = here->VBICtextCapBC; - p[24] = here->VBICtpotentialBC; + p[23] = model->VBICextCapBC; + p[24] = model->VBICpotentialBC; p[25] = model->VBICjunctionExpBC; p[26] = model->VBICsmoothCapBC; - p[27] = here->VBICtextCapSC; - p[28] = here->VBICtpotentialSC; + p[27] = model->VBICextCapSC; + p[28] = model->VBICpotentialSC; p[29] = model->VBICjunctionExpSC; p[30] = model->VBICsmoothCapSC; - p[31] = here->VBICtidealSatCurBE; + p[31] = model->VBICidealSatCurBE; p[32] = model->VBICportionIBEI; p[33] = model->VBICidealEmissCoeffBE; - p[34] = here->VBICtnidealSatCurBE; + p[34] = model->VBICnidealSatCurBE; p[35] = model->VBICnidealEmissCoeffBE; - p[36] = here->VBICtidealSatCurBC; + p[36] = model->VBICidealSatCurBC; p[37] = model->VBICidealEmissCoeffBC; - p[38] = here->VBICtnidealSatCurBC; + p[38] = model->VBICnidealSatCurBC; p[39] = model->VBICnidealEmissCoeffBC; p[40] = model->VBICavalanchePar1BC; - p[41] = here->VBICtavalanchePar2BC; - p[42] = here->VBICtparasitSatCur; + p[41] = model->VBICavalanchePar2BC; + p[42] = model->VBICparasitSatCur; p[43] = model->VBICportionICCP; p[44] = model->VBICparasitFwdEmissCoeff; - p[45] = here->VBICtidealParasitSatCurBE; - p[46] = here->VBICtnidealParasitSatCurBE; - p[47] = here->VBICtidealParasitSatCurBC; + p[45] = model->VBICidealParasitSatCurBE; + p[46] = model->VBICnidealParasitSatCurBE; + p[47] = model->VBICidealParasitSatCurBC; p[48] = model->VBICidealParasitEmissCoeffBC; - p[49] = here->VBICtnidealParasitSatCurBC; + p[49] = model->VBICnidealParasitSatCurBC; p[50] = model->VBICnidealParasitEmissCoeffBC; p[51] = model->VBICearlyVoltF; p[52] = model->VBICearlyVoltR; - p[53] = here->VBICtrollOffF; + p[53] = model->VBICrollOffF; p[54] = model->VBICrollOffR; p[55] = model->VBICparRollOff; p[56] = model->VBICtransitTimeF; @@ -211,12 +211,12 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt) p[91] = model->VBICtempExpRCX; p[92] = model->VBICtempExpRBX; p[93] = model->VBICtempExpRBP; - p[94] = here->VBICtsepISRR; + p[94] = model->VBICsepISRR; p[95] = model->VBICtempExpXISR; p[96] = model->VBICdear; p[97] = model->VBICeap; - p[98] = here->VBICtvbbe; - p[99] = here->VBICtnbbe; + p[98] = model->VBICvbbe; + p[99] = model->VBICnbbe; p[100] = model->VBICibbe; p[101] = model->VBICtvbbe1; p[102] = model->VBICtvbbe2; @@ -306,6 +306,7 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt) } else if((ckt->CKTmode & MODEINITJCT) && (here->VBICoff==0)) { Vbe=Vbei=Vbex=model->VBICtype*here->VBICtVcrit; Vbc=Vbci=Vbcx=Vbep=0.0; + Vbc=Vbci=Vbcx=-model->VBICtype*here->VBICtVcrit; Vbcp=Vbc-Vbe; Vrci=Vrbi=Vrbp=0.0; Vrcx=Vrbx=Vre=Vrs=0.0; @@ -444,6 +445,70 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate1 + here->VBICirs_Vrs); *(ckt->CKTstate0 + here->VBICire_Vre) = *(ckt->CKTstate1 + here->VBICire_Vre); + *(ckt->CKTstate0 + here->VBICibe_Vrth)= + *(ckt->CKTstate1 + here->VBICibe_Vrth); + *(ckt->CKTstate0 + here->VBICibex_Vrth)= + *(ckt->CKTstate1 + here->VBICibex_Vrth); + *(ckt->CKTstate0 + here->VBICitzf_Vrth)= + *(ckt->CKTstate1 + here->VBICitzf_Vrth); + *(ckt->CKTstate0 + here->VBICitzr_Vrth)= + *(ckt->CKTstate1 + here->VBICitzr_Vrth); + *(ckt->CKTstate0 + here->VBICibc_Vrth)= + *(ckt->CKTstate1 + here->VBICibc_Vrth); + *(ckt->CKTstate0 + here->VBICibep_Vrth)= + *(ckt->CKTstate1 + here->VBICibep_Vrth); + *(ckt->CKTstate0 + here->VBICircx_Vrth)= + *(ckt->CKTstate1 + here->VBICircx_Vrth); + *(ckt->CKTstate0 + here->VBICirci_Vrth)= + *(ckt->CKTstate1 + here->VBICirci_Vrth); + *(ckt->CKTstate0 + here->VBICirbx_Vrth)= + *(ckt->CKTstate1 + here->VBICirbx_Vrth); + *(ckt->CKTstate0 + here->VBICirbi_Vrth)= + *(ckt->CKTstate1 + here->VBICirbi_Vrth); + *(ckt->CKTstate0 + here->VBICire_Vrth)= + *(ckt->CKTstate1 + here->VBICire_Vrth); + *(ckt->CKTstate0 + here->VBICirbp_Vrth)= + *(ckt->CKTstate1 + here->VBICirbp_Vrth); + *(ckt->CKTstate0 + here->VBICibcp_Vrth)= + *(ckt->CKTstate1 + here->VBICibcp_Vrth); + *(ckt->CKTstate0 + here->VBICiccp_Vrth)= + *(ckt->CKTstate1 + here->VBICiccp_Vrth); + *(ckt->CKTstate0 + here->VBICirs_Vrth)= + *(ckt->CKTstate1 + here->VBICirs_Vrth); + *(ckt->CKTstate0 + here->VBICirth_Vrth)= + *(ckt->CKTstate1 + here->VBICirth_Vrth); + *(ckt->CKTstate0 + here->VBICith_Vbei)= + *(ckt->CKTstate1 + here->VBICith_Vbei); + *(ckt->CKTstate0 + here->VBICith_Vbci)= + *(ckt->CKTstate1 + here->VBICith_Vbci); + *(ckt->CKTstate0 + here->VBICith_Vcei)= + *(ckt->CKTstate1 + here->VBICith_Vcei); + *(ckt->CKTstate0 + here->VBICith_Vbex)= + *(ckt->CKTstate1 + here->VBICith_Vbex); + *(ckt->CKTstate0 + here->VBICith_Vbep)= + *(ckt->CKTstate1 + here->VBICith_Vbep); + *(ckt->CKTstate0 + here->VBICith_Vbcp)= + *(ckt->CKTstate1 + here->VBICith_Vbcp); + *(ckt->CKTstate0 + here->VBICith_Vcep)= + *(ckt->CKTstate1 + here->VBICith_Vcep); + *(ckt->CKTstate0 + here->VBICith_Vrci)= + *(ckt->CKTstate1 + here->VBICith_Vrci); + *(ckt->CKTstate0 + here->VBICith_Vbcx)= + *(ckt->CKTstate1 + here->VBICith_Vbcx); + *(ckt->CKTstate0 + here->VBICith_Vrbi)= + *(ckt->CKTstate1 + here->VBICith_Vrbi); + *(ckt->CKTstate0 + here->VBICith_Vrbp)= + *(ckt->CKTstate1 + here->VBICith_Vrbp); + *(ckt->CKTstate0 + here->VBICith_Vrcx)= + *(ckt->CKTstate1 + here->VBICith_Vrcx); + *(ckt->CKTstate0 + here->VBICith_Vrbx)= + *(ckt->CKTstate1 + here->VBICith_Vrbx); + *(ckt->CKTstate0 + here->VBICith_Vre)= + *(ckt->CKTstate1 + here->VBICith_Vre); + *(ckt->CKTstate0 + here->VBICith_Vrs)= + *(ckt->CKTstate1 + here->VBICith_Vrs); + *(ckt->CKTstate0 + here->VBICith_Vrth)= + *(ckt->CKTstate1 + here->VBICith_Vrth); if (here->VBIC_selfheat) *(ckt->CKTstate0 + here->VBICqcth) = *(ckt->CKTstate1 + here->VBICqcth); @@ -668,6 +733,38 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt) Irbx_Vrbx = *(ckt->CKTstate0 + here->VBICirbx_Vrbx); Irs_Vrs = *(ckt->CKTstate0 + here->VBICirs_Vrs); Ire_Vre = *(ckt->CKTstate0 + here->VBICire_Vre); + Ibe_Vrth = *(ckt->CKTstate0 + here->VBICibe_Vrth); + Ibex_Vrth = *(ckt->CKTstate0 + here->VBICibex_Vrth); + Itzf_Vrth = *(ckt->CKTstate0 + here->VBICitzf_Vrth); + Itzr_Vrth = *(ckt->CKTstate0 + here->VBICitzr_Vrth); + Ibc_Vrth = *(ckt->CKTstate0 + here->VBICibc_Vrth); + Ibep_Vrth = *(ckt->CKTstate0 + here->VBICibep_Vrth); + Ircx_Vrth = *(ckt->CKTstate0 + here->VBICircx_Vrth); + Irci_Vrth = *(ckt->CKTstate0 + here->VBICirci_Vrth); + Irbx_Vrth = *(ckt->CKTstate0 + here->VBICirbx_Vrth); + Irbi_Vrth = *(ckt->CKTstate0 + here->VBICirbi_Vrth); + Ire_Vrth = *(ckt->CKTstate0 + here->VBICire_Vrth); + Irbp_Vrth = *(ckt->CKTstate0 + here->VBICirbp_Vrth); + Ibcp_Vrth = *(ckt->CKTstate0 + here->VBICibcp_Vrth); + Iccp_Vrth = *(ckt->CKTstate0 + here->VBICiccp_Vrth); + Irs_Vrth = *(ckt->CKTstate0 + here->VBICirs_Vrth); + Irth_Vrth = *(ckt->CKTstate0 + here->VBICirth_Vrth); + Ith_Vrth = *(ckt->CKTstate0 + here->VBICith_Vrth); + Ith_Vbei = *(ckt->CKTstate0 + here->VBICith_Vbei); + Ith_Vbci = *(ckt->CKTstate0 + here->VBICith_Vbci); + Ith_Vcei = *(ckt->CKTstate0 + here->VBICith_Vcei); + Ith_Vbex = *(ckt->CKTstate0 + here->VBICith_Vbex); + Ith_Vbep = *(ckt->CKTstate0 + here->VBICith_Vbep); + Ith_Vbcp = *(ckt->CKTstate0 + here->VBICith_Vbcp); + Ith_Vcep = *(ckt->CKTstate0 + here->VBICith_Vcep); + Ith_Vrci = *(ckt->CKTstate0 + here->VBICith_Vrci); + Ith_Vbcx = *(ckt->CKTstate0 + here->VBICith_Vbcx); + Ith_Vrbi = *(ckt->CKTstate0 + here->VBICith_Vrbi); + Ith_Vrbp = *(ckt->CKTstate0 + here->VBICith_Vrbp); + Ith_Vrcx = *(ckt->CKTstate0 + here->VBICith_Vrcx); + Ith_Vrbx = *(ckt->CKTstate0 + here->VBICith_Vrbx); + Ith_Vre = *(ckt->CKTstate0 + here->VBICith_Vre); + Ith_Vrs = *(ckt->CKTstate0 + here->VBICith_Vrs); goto load; } /* @@ -696,9 +793,28 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt) /* * determine dc current and derivatives */ + // define some voltages for debugging + // Vrth = 50; + // Vbei = 0.9; + // Vbe = 0.9; + // Vbc = 0.2; + // Vbci = 0.2; + // Vbex = 0.9; + // Vbcx = 0.2; + // Vrbp = 0.05; + // Vrs = 0.05; + // Vrcx = 0.05; + // Vrci = 0.1; + // Vrbi = 0.1; + // Vre = 0.05; + // Vcei = 0.7; + // Vbcp = -0.9; + // Vbep = 0.1; + // Vrbx = 0.01; + // end debugging Vcei = Vbei - Vbci; Vcep = Vbep - Vbcp; - iret = vbic_4T_et_cf_fj(p + iret = vbic_4T_et_cf_fj(p, &here->VBICtemp ,&Vrth, &Vbei, &Vbex, &Vbci, &Vbep, &Vbcp ,&Vrcx, &Vbcx, &Vrci, &Vrbx, &Vrbi, &Vre, &Vrbp ,&Vrs, &Vbe, &Vbc, &Vcei, &Vcep, &Ibe, &Ibe_Vrth @@ -777,6 +893,12 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate0 + here->VBICcqbeo) = Qbeo_Vbe; *(ckt->CKTstate0 + here->VBICcqbco) = Qbco_Vbc; *(ckt->CKTstate0 + here->VBICcqbcp) = Qbcp_Vbcp; + *(ckt->CKTstate0 + here->VBICcqbeth) = Qbe_Vrth; + *(ckt->CKTstate0 + here->VBICcqbexth) = Qbex_Vrth; + *(ckt->CKTstate0 + here->VBICcqbcth) = Qbc_Vrth; + *(ckt->CKTstate0 + here->VBICcqbcxth) = Qbcx_Vrth; + *(ckt->CKTstate0 + here->VBICcqbepth) = Qbep_Vrth; + *(ckt->CKTstate0 + here->VBICcqbcpth) = Qbcp_Vrth; if (here->VBIC_selfheat) *(ckt->CKTstate0 + here->VBICcqcth) = Qcth_Vrth; continue; /* go to 1000 */ @@ -857,6 +979,19 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate0 + here->VBICcqbep); *(ckt->CKTstate1 + here->VBICcqbcp) = *(ckt->CKTstate0 + here->VBICcqbcp); + *(ckt->CKTstate1 + here->VBICcqbeth) = + *(ckt->CKTstate0 + here->VBICcqbeth); + *(ckt->CKTstate1 + here->VBICcqbexth) = + *(ckt->CKTstate0 + here->VBICcqbexth); + *(ckt->CKTstate1 + here->VBICcqbcth) = + *(ckt->CKTstate0 + here->VBICcqbcth); + *(ckt->CKTstate1 + here->VBICcqbcxth) = + *(ckt->CKTstate0 + here->VBICcqbcxth); + *(ckt->CKTstate1 + here->VBICcqbepth) = + *(ckt->CKTstate0 + here->VBICcqbepth); + *(ckt->CKTstate1 + here->VBICcqbcpth) = + *(ckt->CKTstate0 + here->VBICcqbepth); + if (here->VBIC_selfheat) *(ckt->CKTstate1 + here->VBICcqcth) = *(ckt->CKTstate0 + here->VBICcqcth); @@ -941,6 +1076,38 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate0 + here->VBICire_Vre) = Ire_Vre; *(ckt->CKTstate0 + here->VBICcqcth) = Icth; *(ckt->CKTstate0 + here->VBICicth_Vrth) = Icth_Vrth; + *(ckt->CKTstate0 + here->VBICibe_Vrth)=Ibe_Vrth; + *(ckt->CKTstate0 + here->VBICibex_Vrth)=Ibex_Vrth; + *(ckt->CKTstate0 + here->VBICitzf_Vrth)=Itzf_Vrth; + *(ckt->CKTstate0 + here->VBICitzr_Vrth)=Itzr_Vrth; + *(ckt->CKTstate0 + here->VBICibc_Vrth)=Ibc_Vrth; + *(ckt->CKTstate0 + here->VBICibep_Vrth)=Ibep_Vrth; + *(ckt->CKTstate0 + here->VBICircx_Vrth)=Ircx_Vrth; + *(ckt->CKTstate0 + here->VBICirci_Vrth)=Irci_Vrth; + *(ckt->CKTstate0 + here->VBICirbx_Vrth)=Irbx_Vrth; + *(ckt->CKTstate0 + here->VBICirbi_Vrth)=Irbi_Vrth; + *(ckt->CKTstate0 + here->VBICire_Vrth)=Ire_Vrth; + *(ckt->CKTstate0 + here->VBICirbp_Vrth)=Irbp_Vrth; + *(ckt->CKTstate0 + here->VBICibcp_Vrth)=Ibcp_Vrth; + *(ckt->CKTstate0 + here->VBICiccp_Vrth)=Iccp_Vrth; + *(ckt->CKTstate0 + here->VBICirs_Vrth)=Irs_Vrth; + *(ckt->CKTstate0 + here->VBICirth_Vrth)=Irth_Vrth; + *(ckt->CKTstate0 + here->VBICith_Vrth)=Ith_Vrth; + *(ckt->CKTstate0 + here->VBICith_Vbei)=Ith_Vbei; + *(ckt->CKTstate0 + here->VBICith_Vbci)=Ith_Vbci; + *(ckt->CKTstate0 + here->VBICith_Vcei)=Ith_Vcei; + *(ckt->CKTstate0 + here->VBICith_Vbex)=Ith_Vbex; + *(ckt->CKTstate0 + here->VBICith_Vbep)=Ith_Vbep; + *(ckt->CKTstate0 + here->VBICith_Vbcp)=Ith_Vbcp; + *(ckt->CKTstate0 + here->VBICith_Vcep)=Ith_Vcep; + *(ckt->CKTstate0 + here->VBICith_Vrci)=Ith_Vrci; + *(ckt->CKTstate0 + here->VBICith_Vbcx)=Ith_Vbcx; + *(ckt->CKTstate0 + here->VBICith_Vrbi)=Ith_Vrbi; + *(ckt->CKTstate0 + here->VBICith_Vrbp)=Ith_Vrbp; + *(ckt->CKTstate0 + here->VBICith_Vrcx)=Ith_Vrcx; + *(ckt->CKTstate0 + here->VBICith_Vrbx)=Ith_Vrbx; + *(ckt->CKTstate0 + here->VBICith_Vre)=Ith_Vre; + *(ckt->CKTstate0 + here->VBICith_Vrs)=Ith_Vrs; load: /* @@ -1338,7 +1505,7 @@ c Stamp element: Ith return(OK); } -int vbic_4T_et_cf_fj(double *p +int vbic_4T_et_cf_fj(double *p, double *Tamb ,double *Vrth, double *Vbei, double *Vbex, double *Vbci, double *Vbep, double *Vbcp ,double *Vrcx, double *Vbcx, double *Vrci, double *Vrbx, double *Vrbi, double *Vre, double *Vrbp ,double *Vrs, double *Vbe, double *Vbc, double *Vcei, double *Vcep, double *Ibe, double *Ibe_Vrth @@ -1451,7 +1618,7 @@ double Ith_Iccp,Ith_Ircx,Ith_Irci,Ith_Irbx,Ith_Irbi,Ith_Ire,Ith_Irbp; /* Function and derivative code */ Tini=2.731500e+02+p[0]; - Tdev=(2.731500e+02+p[0])+(*Vrth); + Tdev=(*Tamb)+(*Vrth); Tdev_Vrth=1.0; Vtv=1.380662e-23*Tdev/1.602189e-19; Vtv_Tdev=8.617347e-5; diff --git a/src/spicelib/devices/vbic/vbicsetup.c b/src/spicelib/devices/vbic/vbicsetup.c index ef6b238ea..4964934c3 100644 --- a/src/spicelib/devices/vbic/vbicsetup.c +++ b/src/spicelib/devices/vbic/vbicsetup.c @@ -477,10 +477,6 @@ VBICsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) else here->VBIC_selfheat = 0; - if((model->VBICthermalResistGiven) && (model->VBICthermalCapacitance < 1e-12)) - model->VBICthermalCapacitance = 1e-12; - - if(here->VBICcollCINode == 0) { error = CKTmkVolt(ckt, &tmp, here->VBICname, "collCI"); if(error) return(error);