From a52274ba7d5c9e9878e9616b53d40c918b516729 Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Tue, 8 Sep 2020 15:43:18 +0200 Subject: [PATCH] fix nqs transient --- src/spicelib/devices/hicum2/hicum2acld.c | 2 + src/spicelib/devices/hicum2/hicum2conv.c | 1 + src/spicelib/devices/hicum2/hicum2defs.h | 185 ++++++++++++----------- src/spicelib/devices/hicum2/hicum2mask.c | 5 - src/spicelib/devices/hicum2/hicum2pzld.c | 2 + src/spicelib/devices/hicum2/hicumL2.cpp | 41 +++-- 6 files changed, 127 insertions(+), 109 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2acld.c b/src/spicelib/devices/hicum2/hicum2acld.c index 8e7073d5a..772a31b17 100644 --- a/src/spicelib/devices/hicum2/hicum2acld.c +++ b/src/spicelib/devices/hicum2/hicum2acld.c @@ -26,6 +26,7 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt) double Ibpei_Vrth; double Ibiei_Vbiei; + double Ibiei_Vxf; double Ibiei_Vbici; double Ibiei_Vrth; @@ -157,6 +158,7 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt) } Ibiei_Vbiei = *(ckt->CKTstate0 + here->HICUMibiei_Vbiei); + Ibiei_Vxf = *(ckt->CKTstate0 + here->HICUMibiei_Vxf); Ibiei_Vbici = *(ckt->CKTstate0 + here->HICUMibiei_Vbici); Ibiei_Vrth = *(ckt->CKTstate0 + here->HICUMibiei_Vrth); diff --git a/src/spicelib/devices/hicum2/hicum2conv.c b/src/spicelib/devices/hicum2/hicum2conv.c index 421c909f6..44161bbdd 100644 --- a/src/spicelib/devices/hicum2/hicum2conv.c +++ b/src/spicelib/devices/hicum2/hicum2conv.c @@ -97,6 +97,7 @@ HICUMconvTest(GENmodel *inModel, CKTcircuit *ckt) delvbbp = Vbbp - *(ckt->CKTstate0 + here->HICUMvbbp); delveie = Veie - *(ckt->CKTstate0 + here->HICUMveie); + //todo: maybe add ibiei_Vxf ibieihat = *(ckt->CKTstate0 + here->HICUMibiei) + *(ckt->CKTstate0 + here->HICUMibiei_Vbiei)*delvbiei + *(ckt->CKTstate0 + here->HICUMibiei_Vrth)*delvrth + diff --git a/src/spicelib/devices/hicum2/hicum2defs.h b/src/spicelib/devices/hicum2/hicum2defs.h index 861504efd..ab13d6514 100644 --- a/src/spicelib/devices/hicum2/hicum2defs.h +++ b/src/spicelib/devices/hicum2/hicum2defs.h @@ -386,127 +386,128 @@ typedef struct sHICUMinstance { #define HICUMibiei HICUMstate+13 #define HICUMibiei_Vbiei HICUMstate+14 -#define HICUMibiei_Vbici HICUMstate+15 -#define HICUMibiei_Vrth HICUMstate+16 +#define HICUMibiei_Vxf HICUMstate+15 +#define HICUMibiei_Vbici HICUMstate+16 +#define HICUMibiei_Vrth HICUMstate+17 -#define HICUMibpei HICUMstate+17 -#define HICUMibpei_Vbpei HICUMstate+18 -#define HICUMibpei_Vrth HICUMstate+19 +#define HICUMibpei HICUMstate+18 +#define HICUMibpei_Vbpei HICUMstate+19 +#define HICUMibpei_Vrth HICUMstate+20 -#define HICUMiciei HICUMstate+20 -#define HICUMiciei_Vbiei HICUMstate+21 -#define HICUMiciei_Vbici HICUMstate+22 -#define HICUMiciei_Vxf2 HICUMstate+23 -#define HICUMiciei_Vrth HICUMstate+24 +#define HICUMiciei HICUMstate+21 +#define HICUMiciei_Vbiei HICUMstate+22 +#define HICUMiciei_Vbici HICUMstate+23 +#define HICUMiciei_Vxf2 HICUMstate+24 +#define HICUMiciei_Vrth HICUMstate+25 -#define HICUMibici HICUMstate+25 -#define HICUMibici_Vbici HICUMstate+26 -#define HICUMibici_Vbiei HICUMstate+27 -#define HICUMibici_Vrth HICUMstate+28 +#define HICUMibici HICUMstate+26 +#define HICUMibici_Vbici HICUMstate+27 +#define HICUMibici_Vbiei HICUMstate+28 +#define HICUMibici_Vrth HICUMstate+29 -#define HICUMibpbi HICUMstate+29 -#define HICUMibpbi_Vbpbi HICUMstate+30 -#define HICUMibpbi_Vbiei HICUMstate+31 -#define HICUMibpbi_Vbici HICUMstate+32 -#define HICUMibpbi_Vrth HICUMstate+33 +#define HICUMibpbi HICUMstate+30 +#define HICUMibpbi_Vbpbi HICUMstate+31 +#define HICUMibpbi_Vbiei HICUMstate+32 +#define HICUMibpbi_Vbici HICUMstate+33 +#define HICUMibpbi_Vrth HICUMstate+34 -#define HICUMibpci HICUMstate+34 -#define HICUMibpci_Vbpci HICUMstate+35 -#define HICUMibpci_Vrth HICUMstate+36 +#define HICUMibpci HICUMstate+35 +#define HICUMibpci_Vbpci HICUMstate+36 +#define HICUMibpci_Vrth HICUMstate+37 -#define HICUMisici HICUMstate+37 -#define HICUMisici_Vsici HICUMstate+38 -#define HICUMisici_Vrth HICUMstate+39 +#define HICUMisici HICUMstate+38 +#define HICUMisici_Vsici HICUMstate+39 +#define HICUMisici_Vrth HICUMstate+40 -#define HICUMibpsi HICUMstate+40 -#define HICUMibpsi_Vbpci HICUMstate+41 -#define HICUMibpsi_Vsici HICUMstate+42 -#define HICUMibpsi_Vrth HICUMstate+43 +#define HICUMibpsi HICUMstate+41 +#define HICUMibpsi_Vbpci HICUMstate+42 +#define HICUMibpsi_Vsici HICUMstate+43 +#define HICUMibpsi_Vrth HICUMstate+44 -#define HICUMisis_Vsis HICUMstate+44 +#define HICUMisis_Vsis HICUMstate+45 -#define HICUMieie HICUMstate+45 // needed for re-flicker noise -#define HICUMieie_Vrth HICUMstate+46 +#define HICUMieie HICUMstate+46 // needed for re-flicker noise +#define HICUMieie_Vrth HICUMstate+47 -#define HICUMqrbi HICUMstate+47 -#define HICUMcqrbi HICUMstate+48 +#define HICUMqrbi HICUMstate+48 +#define HICUMcqrbi HICUMstate+49 -#define HICUMqjei HICUMstate+49 -#define HICUMcqjei HICUMstate+50 +#define HICUMqjei HICUMstate+50 +#define HICUMcqjei HICUMstate+51 -#define HICUMqf HICUMstate+51 -#define HICUMcqf HICUMstate+52 +#define HICUMqf HICUMstate+52 +#define HICUMcqf HICUMstate+53 -#define HICUMqr HICUMstate+53 -#define HICUMcqr HICUMstate+54 +#define HICUMqr HICUMstate+54 +#define HICUMcqr HICUMstate+55 -#define HICUMqjci HICUMstate+55 -#define HICUMcqjci HICUMstate+56 +#define HICUMqjci HICUMstate+56 +#define HICUMcqjci HICUMstate+57 -#define HICUMqjep HICUMstate+57 -#define HICUMcqjep HICUMstate+58 +#define HICUMqjep HICUMstate+58 +#define HICUMcqjep HICUMstate+59 -#define HICUMqjcx0_i HICUMstate+59 -#define HICUMcqcx0_t_i HICUMstate+60 +#define HICUMqjcx0_i HICUMstate+60 +#define HICUMcqcx0_t_i HICUMstate+61 -#define HICUMqjcx0_ii HICUMstate+61 -#define HICUMcqcx0_t_ii HICUMstate+62 +#define HICUMqjcx0_ii HICUMstate+62 +#define HICUMcqcx0_t_ii HICUMstate+63 -#define HICUMqdsu HICUMstate+63 -#define HICUMcqdsu HICUMstate+64 +#define HICUMqdsu HICUMstate+64 +#define HICUMcqdsu HICUMstate+65 -#define HICUMqjs HICUMstate+65 -#define HICUMcqjs HICUMstate+66 +#define HICUMqjs HICUMstate+66 +#define HICUMcqjs HICUMstate+67 -#define HICUMqscp HICUMstate+67 -#define HICUMcqscp HICUMstate+68 +#define HICUMqscp HICUMstate+68 +#define HICUMcqscp HICUMstate+69 -#define HICUMqbepar1 HICUMstate+69 -#define HICUMcqbepar1 HICUMstate+70 -#define HICUMgqbepar1 HICUMstate+71 +#define HICUMqbepar1 HICUMstate+70 +#define HICUMcqbepar1 HICUMstate+71 +#define HICUMgqbepar1 HICUMstate+72 -#define HICUMqbepar2 HICUMstate+72 -#define HICUMcqbepar2 HICUMstate+73 -#define HICUMgqbepar2 HICUMstate+74 +#define HICUMqbepar2 HICUMstate+73 +#define HICUMcqbepar2 HICUMstate+74 +#define HICUMgqbepar2 HICUMstate+75 -#define HICUMqbcpar1 HICUMstate+75 -#define HICUMcqbcpar1 HICUMstate+76 -#define HICUMgqbcpar1 HICUMstate+77 +#define HICUMqbcpar1 HICUMstate+76 +#define HICUMcqbcpar1 HICUMstate+77 +#define HICUMgqbcpar1 HICUMstate+78 -#define HICUMqbcpar2 HICUMstate+78 -#define HICUMcqbcpar2 HICUMstate+79 -#define HICUMgqbcpar2 HICUMstate+80 +#define HICUMqbcpar2 HICUMstate+79 +#define HICUMcqbcpar2 HICUMstate+80 +#define HICUMgqbcpar2 HICUMstate+81 -#define HICUMqsu HICUMstate+81 -#define HICUMcqsu HICUMstate+82 -#define HICUMgqsu HICUMstate+83 +#define HICUMqsu HICUMstate+82 +#define HICUMcqsu HICUMstate+83 +#define HICUMgqsu HICUMstate+84 -#define HICUMqcth HICUMstate+84 -#define HICUMcqcth HICUMstate+85 +#define HICUMqcth HICUMstate+85 +#define HICUMcqcth HICUMstate+86 -#define HICUMqxf HICUMstate+86 -#define HICUMcqxf HICUMstate+87 -#define HICUMgqxf HICUMstate+88 -#define HICUMixf HICUMstate+89 -#define HICUMixf_Vbiei HICUMstate+90 -#define HICUMixf_Vbici HICUMstate+91 -#define HICUMixf_Vxf HICUMstate+92 -#define HICUMixf_Vrth HICUMstate+93 +#define HICUMqxf HICUMstate+87 +#define HICUMcqxf HICUMstate+88 +#define HICUMgqxf HICUMstate+89 +#define HICUMixf HICUMstate+90 +#define HICUMixf_Vbiei HICUMstate+91 +#define HICUMixf_Vbici HICUMstate+92 +#define HICUMixf_Vxf HICUMstate+93 +#define HICUMixf_Vrth HICUMstate+94 -#define HICUMqxf1 HICUMstate+94 -#define HICUMcqxf1 HICUMstate+95 -#define HICUMgqxf1 HICUMstate+96 -#define HICUMixf1 HICUMstate+97 -#define HICUMixf1_Vbiei HICUMstate+98 -#define HICUMixf1_Vbici HICUMstate+99 -#define HICUMixf1_Vxf2 HICUMstate+100 -#define HICUMixf1_Vxf1 HICUMstate+101 -#define HICUMixf1_Vrth HICUMstate+102 +#define HICUMqxf1 HICUMstate+95 +#define HICUMcqxf1 HICUMstate+96 +#define HICUMgqxf1 HICUMstate+97 +#define HICUMixf1 HICUMstate+98 +#define HICUMixf1_Vbiei HICUMstate+99 +#define HICUMixf1_Vbici HICUMstate+100 +#define HICUMixf1_Vxf2 HICUMstate+101 +#define HICUMixf1_Vxf1 HICUMstate+102 +#define HICUMixf1_Vrth HICUMstate+103 -#define HICUMqxf2 HICUMstate+103 -#define HICUMcqxf2 HICUMstate+104 -#define HICUMgqxf2 HICUMstate+105 -#define HICUMixf2 HICUMstate+106 +#define HICUMqxf2 HICUMstate+104 +#define HICUMcqxf2 HICUMstate+105 +#define HICUMgqxf2 HICUMstate+106 +#define HICUMixf2 HICUMstate+107 #define HICUMixf2_Vbiei HICUMstate+108 #define HICUMixf2_Vbici HICUMstate+109 #define HICUMixf2_Vxf1 HICUMstate+110 diff --git a/src/spicelib/devices/hicum2/hicum2mask.c b/src/spicelib/devices/hicum2/hicum2mask.c index efffde670..ac2616b79 100644 --- a/src/spicelib/devices/hicum2/hicum2mask.c +++ b/src/spicelib/devices/hicum2/hicum2mask.c @@ -155,11 +155,9 @@ HICUMmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value) //Series resistances case HICUM_MOD_RBI0: value->rValue = model->HICUMrbi0; - if (model->HICUMrbi0 < MIN_R) model->HICUMrbi0 = MIN_R; return(OK); case HICUM_MOD_RBX: value->rValue = model->HICUMrbx; - if (model->HICUMrbx < MIN_R) model->HICUMrbx = MIN_R; return(OK); case HICUM_MOD_FGEO: value->rValue = model->HICUMfgeo; @@ -175,11 +173,9 @@ HICUMmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value) return(OK); case HICUM_MOD_RE: value->rValue = model->HICUMre; - if (model->HICUMre < MIN_R) model->HICUMre = MIN_R; return(OK); case HICUM_MOD_RCX: value->rValue = model->HICUMrcx; - if (model->HICUMrcx < MIN_R) model->HICUMrcx = MIN_R; return(OK); //Substrate transistor @@ -202,7 +198,6 @@ HICUMmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value) //Intra-device substrate coupling case HICUM_MOD_RSU: value->rValue = model->HICUMrsu; - if (model->HICUMrsu < MIN_R) model->HICUMrsu = MIN_R; return(OK); case HICUM_MOD_CSU: diff --git a/src/spicelib/devices/hicum2/hicum2pzld.c b/src/spicelib/devices/hicum2/hicum2pzld.c index 63c196873..afdcdf807 100644 --- a/src/spicelib/devices/hicum2/hicum2pzld.c +++ b/src/spicelib/devices/hicum2/hicum2pzld.c @@ -26,6 +26,7 @@ HICUMpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) double Ibpei_Vrth; double Ibiei_Vbiei; + double Ibiei_Vxf; double Ibiei_Vbici; double Ibiei_Vrth; @@ -157,6 +158,7 @@ HICUMpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) } Ibiei_Vbiei = *(ckt->CKTstate0 + here->HICUMibiei_Vbiei); + Ibiei_Vxf = *(ckt->CKTstate0 + here->HICUMibiei_Vxf); Ibiei_Vbici = *(ckt->CKTstate0 + here->HICUMibiei_Vbici); Ibiei_Vrth = *(ckt->CKTstate0 + here->HICUMibiei_Vrth); diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index eea1562f7..db86cb1da 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -437,7 +437,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) int error; double Vbe, Vcic, Vbbp, Veie, Vsis, Vbpe; - double Ibiei, Ibiei_Vbiei, Ibiei_Vbici; + double Ibiei, Ibiei_Vbiei, Ibiei_Vxf, Ibiei_Vbici; double Ibici, Ibici_Vbici, Ibici_Vbiei; double Ibpei, Ibpei_Vbpei; double Ibpci, Ibpci_Vbpci; @@ -1349,6 +1349,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate0+here->HICUMveie)=*(ckt->CKTstate1+here->HICUMveie); *(ckt->CKTstate0+here->HICUMibiei)=*(ckt->CKTstate1+here->HICUMibiei); *(ckt->CKTstate0+here->HICUMibiei_Vbiei)=*(ckt->CKTstate1+here->HICUMibiei_Vbiei); + *(ckt->CKTstate0+here->HICUMibiei_Vxf)=*(ckt->CKTstate1+here->HICUMibiei_Vxf); *(ckt->CKTstate0+here->HICUMibiei_Vbici)=*(ckt->CKTstate1+here->HICUMibiei_Vbici); *(ckt->CKTstate0+here->HICUMibiei_Vrth)=*(ckt->CKTstate1+here->HICUMibiei_Vrth); *(ckt->CKTstate0+here->HICUMibpei)=*(ckt->CKTstate1+here->HICUMibpei); @@ -1558,6 +1559,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) if (selfheat) { Vrth = *(ckt->CKTrhsOld + here->HICUMtempNode); } + //todo: maybe add ibiei_Vxf ibieihat = *(ckt->CKTstate0 + here->HICUMibiei) + *(ckt->CKTstate0 + here->HICUMibiei_Vbiei)*delvbiei+ *(ckt->CKTstate0 + here->HICUMibiei_Vrth)*delvrth+ @@ -1689,6 +1691,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Ibiei = *(ckt->CKTstate0 + here->HICUMibiei); Ibiei_Vbiei = *(ckt->CKTstate0 + here->HICUMibiei_Vbiei); + Ibiei_Vxf = *(ckt->CKTstate0 + here->HICUMibiei_Vxf); Ibiei_Vbici = *(ckt->CKTstate0 + here->HICUMibiei_Vbici); Ibiei_Vrth = *(ckt->CKTstate0 + here->HICUMibiei_Vrth); @@ -2203,6 +2206,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Qxf = model->HICUMalqf*model->HICUMt0*Vxf; //for RC nw Qxf_Vxf = model->HICUMalqf*model->HICUMt0; //for RC nw + //convergency killer Qdeix = Vxf; //for RC nw Qdeix_Vxf = 1.0; Qdeix_Vbiei = 0; @@ -2642,10 +2646,18 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Ibiei_Vbiei += geq; Ibiei += *(ckt->CKTstate0 + here->HICUMcqjei); //Qdeix - error = NIintegrate(ckt,&geq,&ceq,Qdeix_Vbiei,here->HICUMqf); - if(error) return(error); - Ibiei_Vbiei += geq; - Ibiei += *(ckt->CKTstate0 + here->HICUMcqf); + if (!nqs) { + error = NIintegrate(ckt,&geq,&ceq,Qdeix_Vbiei,here->HICUMqf); + if(error) return(error); + Ibiei_Vbiei += geq; + Ibiei_Vxf = 0; + Ibiei += *(ckt->CKTstate0 + here->HICUMcqf); + } else { //Qdeix is now a function of Vxf(t) + error = NIintegrate(ckt,&geq,&ceq,Qdeix_Vxf,here->HICUMqf); + if(error) return(error); + Ibiei_Vxf = geq; + Ibiei += *(ckt->CKTstate0 + here->HICUMcqf); + } //Qr error = NIintegrate(ckt,&geq,&ceq,Qr_Vbici,here->HICUMqr); if(error) return(error); @@ -2687,21 +2699,21 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Isc_Vsc = geq; Isc = *(ckt->CKTstate0 + here->HICUMcqscp); if (nqs) { - //Qxf - error = NIintegrate(ckt,&geq,&ceq,Qxf1_Vxf1,here->HICUMqxf); + //Qxf1 + error = NIintegrate(ckt,&geq,&ceq,Qxf1_Vxf1,here->HICUMqxf1); if(error) return(error); Ixf1_Vxf1 += geq; - Ixf1 += *(ckt->CKTstate0 + here->HICUMcqxf); + Ixf1 += *(ckt->CKTstate0 + here->HICUMcqxf1); //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); + error = NIintegrate(ckt,&geq,&ceq,Qxf_Vxf,here->HICUMqxf); if(error) return(error); Ixf_Vxf += geq; - Ixf += *(ckt->CKTstate0 + here->HICUMcqxf1); + Ixf += *(ckt->CKTstate0 + here->HICUMcqxf); } if (selfheat) @@ -2809,6 +2821,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate0 + here->HICUMibiei) = Ibiei; *(ckt->CKTstate0 + here->HICUMibiei_Vbiei) = Ibiei_Vbiei; + *(ckt->CKTstate0 + here->HICUMibiei_Vxf) = Ibiei_Vxf; *(ckt->CKTstate0 + here->HICUMibiei_Vbici) = Ibiei_Vbici; *(ckt->CKTstate0 + here->HICUMibiei_Vrth) = Ibiei_Vrth; @@ -2981,7 +2994,7 @@ load: // finish // Branch: biei, Stamp element: Ibiei = Ibei + Irei ( was Ijbei ) - rhs_current = model->HICUMtype * (Ibiei - Ibiei_Vbiei*Vbiei - Ibiei_Vbici*Vbici); + rhs_current = model->HICUMtype * (Ibiei - Ibiei_Vbiei*Vbiei - Ibiei_Vxf*Vxf - Ibiei_Vbici*Vbici); *(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; // with respect to Vbiei @@ -2994,6 +3007,10 @@ load: *(here->HICUMemitEICollCIPtr) += Ibiei_Vbici; *(here->HICUMbaseBICollCIPtr) += -Ibiei_Vbici; *(here->HICUMemitEIBaseBIPtr) += -Ibiei_Vbici; + if (nqs) { + *(here->HICUMbaseBIXfPtr) += Ibiei_Vxf; + *(here->HICUMemitEIXfPtr) += -Ibiei_Vxf; + } // finish // Branch: bpei, Stamp element: Ibpei = Ibep + Irep ( was Ijbep ) @@ -3162,7 +3179,7 @@ load: // Branch: xf-ground, Stamp element: Ixf f_xf=+ rhs_current = Ixf - Ixf_Vbici*Vbici - Ixf_Vbiei*Vbiei - Ixf_Vxf*Vxf; - *(ckt->CKTrhs + here->HICUMxfNode) += -rhs_current; // rhs_current; // into xf2 node + *(ckt->CKTrhs + here->HICUMxfNode) += -rhs_current; // rhs_current; // into xf node *(here->HICUMxfBaseBIPtr) += +Ixf_Vbiei; *(here->HICUMxfEmitEIPtr) += -Ixf_Vbiei; *(here->HICUMxfBaseBIPtr) += +Ixf_Vbici;