From 154036c09ff5176d3661f92665885c48a6c05c4e Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Thu, 23 Jul 2020 16:50:31 +0200 Subject: [PATCH] consistent derivative with Vrth/Tdev=> will rework this, I do not like this --- src/spicelib/devices/hicum2/hicum2acld.c | 99 ++++----- src/spicelib/devices/hicum2/hicum2conv.c | 18 +- src/spicelib/devices/hicum2/hicum2defs.h | 4 +- src/spicelib/devices/hicum2/hicum2pzld.c | 142 ++++++------ src/spicelib/devices/hicum2/hicumL2.cpp | 148 ++----------- src/spicelib/devices/hicum2/hicumL2temp.cpp | 4 +- src/spicelib/devices/hicum2/overview_files.md | 202 ------------------ 7 files changed, 160 insertions(+), 457 deletions(-) delete mode 100644 src/spicelib/devices/hicum2/overview_files.md diff --git a/src/spicelib/devices/hicum2/hicum2acld.c b/src/spicelib/devices/hicum2/hicum2acld.c index 65aaa7faf..20a0b6826 100644 --- a/src/spicelib/devices/hicum2/hicum2acld.c +++ b/src/spicelib/devices/hicum2/hicum2acld.c @@ -116,6 +116,7 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt) double Ixf_Vrth ; double Ith_Vrth, Ith_Vbiei, Ith_Vbici, Ith_Vbpbi, Ith_Vbpci, Ith_Vbpei, Ith_Vciei, Ith_Vsici, Ith_Vcic, Ith_Vbbp, Ith_Veie; + double Tdev_Vrth; /* loop through all the models */ for( ; model != NULL; model = HICUMnextModel(model)) { @@ -127,6 +128,8 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt) for( here = HICUMinstances(model); here!= NULL; here = HICUMnextInstance(here)) { + Tdev_Vrth = here->HICUMtemp_Vrth ; + // get all derivatives of branch DC currents if(model->HICUMrcxGiven && model->HICUMrcx != 0) { Icic_Vcic = 1/here->HICUMrcx_t.rpart; @@ -519,46 +522,46 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt) // Stamps with SH if (selfheat) { // Stamp element: Ibiei f_Bi = + f_Ei = - - *(here->HICUMbaseBItempPtr) += Ibiei_Vrth; - *(here->HICUMemitEItempPtr) += -Ibiei_Vrth; + *(here->HICUMbaseBItempPtr) += Ibiei_Vrth*Tdev_Vrth; + *(here->HICUMemitEItempPtr) += -Ibiei_Vrth*Tdev_Vrth; // Stamp element: Ibpei f_Bp = + f_Ei = - // with respect to Potential Vrth - *(here->HICUMbaseBPtempPtr) += Ibpei_Vrth; - *(here->HICUMemitEItempPtr) += -Ibpei_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpei_Vrth*Tdev_Vrth; + *(here->HICUMemitEItempPtr) += -Ibpei_Vrth*Tdev_Vrth; // Stamp element: Ibici f_Bi = + f_Ci = - - *(here->HICUMbaseBItempPtr) += Ibici_Vrth; - *(here->HICUMcollCItempPtr) += -Ibici_Vrth; + *(here->HICUMbaseBItempPtr) += Ibici_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr) += -Ibici_Vrth*Tdev_Vrth; // Stamp element: Iciei f_Ci = + f_Ei = - - *(here->HICUMcollCItempPtr) += Iciei_Vrth; - *(here->HICUMemitEItempPtr) += -Iciei_Vrth; + *(here->HICUMcollCItempPtr) += Iciei_Vrth*Tdev_Vrth; + *(here->HICUMemitEItempPtr) += -Iciei_Vrth*Tdev_Vrth; // Stamp element: Ibpci f_Bp = + f_Ci = - - *(here->HICUMbaseBPtempPtr) += Ibpci_Vrth; - *(here->HICUMcollCItempPtr) += -Ibpci_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpci_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr) += -Ibpci_Vrth*Tdev_Vrth; // Stamp element: Rcx f_Ci = + f_C = - - *(here->HICUMcollCItempPtr) += Icic_Vrth; - *(here->HICUMcollTempPtr) += -Icic_Vrth; + *(here->HICUMcollCItempPtr) += Icic_Vrth*Tdev_Vrth; + *(here->HICUMcollTempPtr) += -Icic_Vrth*Tdev_Vrth; // Stamp element: Rbx f_B = + f_Bp = - - *(here->HICUMbaseTempPtr) += Ibbp_Vrth; - *(here->HICUMbaseBPtempPtr) += -Ibbp_Vrth; + *(here->HICUMbaseTempPtr) += Ibbp_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr) += -Ibbp_Vrth*Tdev_Vrth; // Stamp element: Re f_Ei = + f_E = - - *(here->HICUMemitEItempPtr) += Ieie_Vrth; - *(here->HICUMemitTempPtr) += -Ieie_Vrth; + *(here->HICUMemitEItempPtr) += Ieie_Vrth*Tdev_Vrth; + *(here->HICUMemitTempPtr) += -Ieie_Vrth*Tdev_Vrth; // Stamp element: Rbi f_Bp = + f_Bi = - - *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth; - *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth*Tdev_Vrth; + *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth*Tdev_Vrth; // Stamp element: Isici f_Si = + f_Ci = - - *(here->HICUMsubsSItempPtr) += Isici_Vrth; - *(here->HICUMcollCItempPtr) += -Isici_Vrth; + *(here->HICUMsubsSItempPtr) += Isici_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr) += -Isici_Vrth*Tdev_Vrth; // Branch: bpsi, Stamp element: Its - *(here->HICUMbaseBPtempPtr) += Ibpsi_Vrth; - *(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpsi_Vrth*Tdev_Vrth; + *(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth*Tdev_Vrth; if (nqs) { // Stamp element: Ixf f_xf = + - *(here->HICUMxfTempPtr) += Ixf_Vrth; + *(here->HICUMxfTempPtr) += Ixf_Vrth*Tdev_Vrth; // Stamp element: Ixf1 f_xf1 = + - *(here->HICUMxf1TempPtr) += Ixf1_Vrth; + *(here->HICUMxf1TempPtr) += Ixf1_Vrth*Tdev_Vrth; // Stamp element: Ixf2 f_xf2 = + - *(here->HICUMxf2TempPtr) += Ixf2_Vrth; + *(here->HICUMxf2TempPtr) += Ixf2_Vrth*Tdev_Vrth; } // Stamp element: Ith f_T = - Ith @@ -597,29 +600,29 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt) // finish //the charges - *(here->HICUMbaseBItempPtr + 1) += +XQrbi_Vrth; - *(here->HICUMbaseBPtempPtr + 1) += -XQrbi_Vrth; - *(here->HICUMbaseBItempPtr + 1) += +XQjei_Vrth; - *(here->HICUMemitEItempPtr + 1) += -XQjei_Vrth; - *(here->HICUMbaseBItempPtr + 1) += +XQf_Vrth; - *(here->HICUMemitEItempPtr + 1) += -XQf_Vrth; - *(here->HICUMbaseBItempPtr + 1) += +XQr_Vrth; - *(here->HICUMcollCItempPtr + 1) += -XQr_Vrth; - *(here->HICUMbaseBItempPtr + 1) += +XQjci_Vrth; - *(here->HICUMcollCItempPtr + 1) += -XQjci_Vrth; - *(here->HICUMbaseBPtempPtr + 1) += +XQjep_Vrth; - *(here->HICUMemitEItempPtr + 1) += -XQjep_Vrth; - *(here->HICUMbaseTempPtr + 1) += +Xqjcx0_t_i_Vrth; - *(here->HICUMcollCItempPtr + 1) += -Xqjcx0_t_i_Vrth; - *(here->HICUMbaseBPtempPtr + 1) += +Xqjcx0_t_ii_Vrth; - *(here->HICUMcollCItempPtr + 1) += -Xqjcx0_t_ii_Vrth; - *(here->HICUMbaseBPtempPtr + 1) += +XQdsu_Vrth; - *(here->HICUMcollCItempPtr + 1) += -XQdsu_Vrth; - *(here->HICUMsubsSItempPtr + 1) += +XQjs_Vrth; - *(here->HICUMcollCItempPtr + 1) += -XQjs_Vrth; - *(here->HICUMsubsTempPtr + 1) += +XQscp_Vrth; - *(here->HICUMcollTempPtr + 1) += -XQscp_Vrth; - *(here->HICUMtempTempPtr + 1) += +XQcth_Vrth; + *(here->HICUMbaseBItempPtr + 1) += +XQrbi_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr + 1) += -XQrbi_Vrth*Tdev_Vrth; + *(here->HICUMbaseBItempPtr + 1) += +XQjei_Vrth*Tdev_Vrth; + *(here->HICUMemitEItempPtr + 1) += -XQjei_Vrth*Tdev_Vrth; + *(here->HICUMbaseBItempPtr + 1) += +XQf_Vrth*Tdev_Vrth; + *(here->HICUMemitEItempPtr + 1) += -XQf_Vrth*Tdev_Vrth; + *(here->HICUMbaseBItempPtr + 1) += +XQr_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr + 1) += -XQr_Vrth*Tdev_Vrth; + *(here->HICUMbaseBItempPtr + 1) += +XQjci_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr + 1) += -XQjci_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr + 1) += +XQjep_Vrth*Tdev_Vrth; + *(here->HICUMemitEItempPtr + 1) += -XQjep_Vrth*Tdev_Vrth; + *(here->HICUMbaseTempPtr + 1) += +Xqjcx0_t_i_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr + 1) += -Xqjcx0_t_i_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr + 1) += +Xqjcx0_t_ii_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr + 1) += -Xqjcx0_t_ii_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr + 1) += +XQdsu_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr + 1) += -XQdsu_Vrth*Tdev_Vrth; + *(here->HICUMsubsSItempPtr + 1) += +XQjs_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr + 1) += -XQjs_Vrth*Tdev_Vrth; + *(here->HICUMsubsTempPtr + 1) += +XQscp_Vrth*Tdev_Vrth; + *(here->HICUMcollTempPtr + 1) += -XQscp_Vrth*Tdev_Vrth; + *(here->HICUMtempTempPtr + 1) += +XQcth_Vrth*Tdev_Vrth; } diff --git a/src/spicelib/devices/hicum2/hicum2conv.c b/src/spicelib/devices/hicum2/hicum2conv.c index 4004cc728..ee96ccabb 100644 --- a/src/spicelib/devices/hicum2/hicum2conv.c +++ b/src/spicelib/devices/hicum2/hicum2conv.c @@ -44,6 +44,8 @@ HICUMconvTest(GENmodel *inModel, CKTcircuit *ckt) double isicihat; double volatile ithhat; + double Tdev_Vrth; + double Vbiei, Vbici, Vciei, Vbpei, Vbpbi, Vbpci, Vbci, Vsici, Vrth, Vcic, Vbbp, Veie; double Ibiei, Ibici, Iciei, Ibpei, Ibpbi, Ibpci, Ibpsi, Isici, Ith; @@ -102,34 +104,36 @@ HICUMconvTest(GENmodel *inModel, CKTcircuit *ckt) delvbbp = Vbbp - *(ckt->CKTstate0 + here->HICUMvbbp); delveie = Veie - *(ckt->CKTstate0 + here->HICUMveie); + Tdev_Vrth = here->HICUMtemp_Vrth ; + ibieihat = *(ckt->CKTstate0 + here->HICUMibiei) + *(ckt->CKTstate0 + here->HICUMibiei_Vbiei)*delvbiei + - *(ckt->CKTstate0 + here->HICUMibiei_Vrth)*delvrth + + *(ckt->CKTstate0 + here->HICUMibiei_Vrth)*Tdev_Vrth*delvrth + *(ckt->CKTstate0 + here->HICUMibiei_Vbici)*delvbici; ibicihat = *(ckt->CKTstate0 + here->HICUMibici) + *(ckt->CKTstate0 + here->HICUMibici_Vbici)*delvbici+ - *(ckt->CKTstate0 + here->HICUMibici_Vrth)*delvrth+ + *(ckt->CKTstate0 + here->HICUMibici_Vrth)*Tdev_Vrth*delvrth+ *(ckt->CKTstate0 + here->HICUMibici_Vbiei)*delvbiei; icieihat = *(ckt->CKTstate0 + here->HICUMiciei) + *(ckt->CKTstate0 + here->HICUMiciei_Vbiei)*delvbiei + - *(ckt->CKTstate0 + here->HICUMiciei_Vrth)*delvrth + + *(ckt->CKTstate0 + here->HICUMiciei_Vrth)*Tdev_Vrth*delvrth + *(ckt->CKTstate0 + here->HICUMiciei_Vbici)*delvbici; ibpeihat = *(ckt->CKTstate0 + here->HICUMibpei) + *(ckt->CKTstate0 + here->HICUMibpei_Vrth)*delvrth+ *(ckt->CKTstate0 + here->HICUMibpei_Vbpei)*delvbpei; ibpbihat = *(ckt->CKTstate0 + here->HICUMibpbi) + *(ckt->CKTstate0 + here->HICUMibpbi_Vbiei)*delvbiei + - *(ckt->CKTstate0 + here->HICUMibpbi_Vrth)*delvrth + + *(ckt->CKTstate0 + here->HICUMibpbi_Vrth)*Tdev_Vrth*delvrth + *(ckt->CKTstate0 + here->HICUMibpbi_Vbici)*delvbici; ibpcihat = *(ckt->CKTstate0 + here->HICUMibpci) + - *(ckt->CKTstate0 + here->HICUMibpci_Vrth)*delvrth+ + *(ckt->CKTstate0 + here->HICUMibpci_Vrth)*Tdev_Vrth*delvrth+ *(ckt->CKTstate0 + here->HICUMibpci_Vbpci)*delvbici; ibpsihat = *(ckt->CKTstate0 + here->HICUMibpsi) + *(ckt->CKTstate0 + here->HICUMibpsi_Vbpci)*delvbpci + - *(ckt->CKTstate0 + here->HICUMibpsi_Vrth)*delvrth + + *(ckt->CKTstate0 + here->HICUMibpsi_Vrth)*Tdev_Vrth*delvrth + *(ckt->CKTstate0 + here->HICUMibpsi_Vsici)*delvsici; isicihat = *(ckt->CKTstate0 + here->HICUMisici) + - *(ckt->CKTstate0 + here->HICUMisici_Vrth)*delvrth+ + *(ckt->CKTstate0 + here->HICUMisici_Vrth)*Tdev_Vrth*delvrth+ *(ckt->CKTstate0 + here->HICUMisici_Vsici)*delvsici; ithhat = *(ckt->CKTstate0 + here->HICUMith) + *(ckt->CKTstate0 + here->HICUMith_Vrth)*delvrth+ diff --git a/src/spicelib/devices/hicum2/hicum2defs.h b/src/spicelib/devices/hicum2/hicum2defs.h index 79ac04be2..fa8745a55 100644 --- a/src/spicelib/devices/hicum2/hicum2defs.h +++ b/src/spicelib/devices/hicum2/hicum2defs.h @@ -65,8 +65,8 @@ typedef struct sHICUMinstance { int HICUMbaseBPNode; /* number of internal base node of hicum */ int HICUMsubsSINode; /* number of internal substrate node */ int HICUMxfNode; /* number of internal excess phase node qdei */ - int HICUMxf1Node; /* number of internal excess phase node itf */ - int HICUMxf2Node; /* number of internal excess phase node itf */ + int HICUMxf1Node; /* number of internal excess phase 1 node itf */ + int HICUMxf2Node; /* number of internal excess phase 2 node itf */ double HICUMarea; /* area factor for the hicum */ //initial conditions diff --git a/src/spicelib/devices/hicum2/hicum2pzld.c b/src/spicelib/devices/hicum2/hicum2pzld.c index 34c344624..56aac6df3 100644 --- a/src/spicelib/devices/hicum2/hicum2pzld.c +++ b/src/spicelib/devices/hicum2/hicum2pzld.c @@ -115,6 +115,8 @@ HICUMpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) double Ixf_Vxf ; double Ixf_Vrth ; + double Tdev_Vrth; + double Ith_Vrth, Ith_Vbiei, Ith_Vbici, Ith_Vbpbi, Ith_Vbpci, Ith_Vbpei, Ith_Vciei, Ith_Vsici, Ith_Vcic, Ith_Vbbp, Ith_Veie; /* loop through all the models */ @@ -127,6 +129,8 @@ HICUMpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) for( here = HICUMinstances(model); here!= NULL; here = HICUMnextInstance(here)) { + Tdev_Vrth = here->HICUMtemp_Vrth ; + // get all derivatives of branch DC currents if(model->HICUMrcxGiven && model->HICUMrcx != 0) { Icic_Vcic = 1/here->HICUMrcx_t.rpart; @@ -608,46 +612,46 @@ HICUMpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) // Stamps with SH if (selfheat) { // Stamp element: Ibiei f_Bi = + f_Ei = - - *(here->HICUMbaseBItempPtr) += Ibiei_Vrth; - *(here->HICUMemitEItempPtr) += -Ibiei_Vrth; + *(here->HICUMbaseBItempPtr) += Ibiei_Vrth*Tdev_Vrth; + *(here->HICUMemitEItempPtr) += -Ibiei_Vrth*Tdev_Vrth; // Stamp element: Ibpei f_Bp = + f_Ei = - // with respect to Potential Vrth - *(here->HICUMbaseBPtempPtr) += Ibpei_Vrth; - *(here->HICUMemitEItempPtr) += -Ibpei_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpei_Vrth*Tdev_Vrth; + *(here->HICUMemitEItempPtr) += -Ibpei_Vrth*Tdev_Vrth; // Stamp element: Ibici f_Bi = + f_Ci = - - *(here->HICUMbaseBItempPtr) += Ibici_Vrth; - *(here->HICUMcollCItempPtr) += -Ibici_Vrth; + *(here->HICUMbaseBItempPtr) += Ibici_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr) += -Ibici_Vrth*Tdev_Vrth; // Stamp element: Iciei f_Ci = + f_Ei = - - *(here->HICUMcollCItempPtr) += Iciei_Vrth; - *(here->HICUMemitEItempPtr) += -Iciei_Vrth; + *(here->HICUMcollCItempPtr) += Iciei_Vrth*Tdev_Vrth; + *(here->HICUMemitEItempPtr) += -Iciei_Vrth*Tdev_Vrth; // Stamp element: Ibpci f_Bp = + f_Ci = - - *(here->HICUMbaseBPtempPtr) += Ibpci_Vrth; - *(here->HICUMcollCItempPtr) += -Ibpci_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpci_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr) += -Ibpci_Vrth*Tdev_Vrth; // Stamp element: Rcx f_Ci = + f_C = - - *(here->HICUMcollCItempPtr) += Icic_Vrth; - *(here->HICUMcollTempPtr) += -Icic_Vrth; + *(here->HICUMcollCItempPtr) += Icic_Vrth*Tdev_Vrth; + *(here->HICUMcollTempPtr) += -Icic_Vrth*Tdev_Vrth; // Stamp element: Rbx f_B = + f_Bp = - - *(here->HICUMbaseTempPtr) += Ibbp_Vrth; - *(here->HICUMbaseBPtempPtr) += -Ibbp_Vrth; + *(here->HICUMbaseTempPtr) += Ibbp_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr) += -Ibbp_Vrth*Tdev_Vrth; // Stamp element: Re f_Ei = + f_E = - - *(here->HICUMemitEItempPtr) += Ieie_Vrth; - *(here->HICUMemitTempPtr) += -Ieie_Vrth; + *(here->HICUMemitEItempPtr) += Ieie_Vrth*Tdev_Vrth; + *(here->HICUMemitTempPtr) += -Ieie_Vrth*Tdev_Vrth; // Stamp element: Rbi f_Bp = + f_Bi = - - *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth; - *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth*Tdev_Vrth; + *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth*Tdev_Vrth; // Stamp element: Isici f_Si = + f_Ci = - - *(here->HICUMsubsSItempPtr) += Isici_Vrth; - *(here->HICUMcollCItempPtr) += -Isici_Vrth; + *(here->HICUMsubsSItempPtr) += Isici_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr) += -Isici_Vrth*Tdev_Vrth; // Branch: bpsi, Stamp element: Its - *(here->HICUMbaseBPtempPtr) += Ibpsi_Vrth; - *(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpsi_Vrth*Tdev_Vrth; + *(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth*Tdev_Vrth; if (nqs) { // Stamp element: Ixf f_xf = + - *(here->HICUMxfTempPtr) += Ixf_Vrth; + *(here->HICUMxfTempPtr) += Ixf_Vrth*Tdev_Vrth; // Stamp element: Ixf1 f_xf1 = + - *(here->HICUMxf1TempPtr) += Ixf1_Vrth; + *(here->HICUMxf1TempPtr) += Ixf1_Vrth*Tdev_Vrth; // Stamp element: Ixf2 f_xf2 = + - *(here->HICUMxf2TempPtr) += Ixf2_Vrth; + *(here->HICUMxf2TempPtr) += Ixf2_Vrth*Tdev_Vrth; } // Stamp element: Ith f_T = - Ith @@ -686,50 +690,50 @@ HICUMpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) // finish //the charges - *(here->HICUMbaseBItempPtr + 1) += +XQrbi_Vrth*(s->imag); - *(here->HICUMbaseBItempPtr ) += +XQrbi_Vrth*(s->real); - *(here->HICUMbaseBPtempPtr + 1) += -XQrbi_Vrth*(s->imag); - *(here->HICUMbaseBPtempPtr ) += -XQrbi_Vrth*(s->real); - *(here->HICUMbaseBItempPtr + 1) += +XQjei_Vrth*(s->imag); - *(here->HICUMbaseBItempPtr ) += +XQjei_Vrth*(s->real); - *(here->HICUMemitEItempPtr + 1) += -XQjei_Vrth*(s->imag); - *(here->HICUMemitEItempPtr ) += -XQjei_Vrth*(s->real); - *(here->HICUMbaseBItempPtr + 1) += +XQf_Vrth*(s->imag); - *(here->HICUMbaseBItempPtr ) += +XQf_Vrth*(s->real); - *(here->HICUMemitEItempPtr + 1) += -XQf_Vrth*(s->imag); - *(here->HICUMemitEItempPtr ) += -XQf_Vrth*(s->real); - *(here->HICUMbaseBItempPtr + 1) += +XQr_Vrth*(s->imag); - *(here->HICUMbaseBItempPtr ) += +XQr_Vrth*(s->real); - *(here->HICUMcollCItempPtr + 1) += -XQr_Vrth*(s->imag); - *(here->HICUMcollCItempPtr ) += -XQr_Vrth*(s->real); - *(here->HICUMbaseBItempPtr + 1) += +XQjci_Vrth*(s->imag); - *(here->HICUMbaseBItempPtr ) += +XQjci_Vrth*(s->real); - *(here->HICUMcollCItempPtr + 1) += -XQjci_Vrth*(s->imag); - *(here->HICUMcollCItempPtr ) += -XQjci_Vrth*(s->real); - *(here->HICUMbaseBPtempPtr + 1) += +XQjep_Vrth*(s->imag); - *(here->HICUMbaseBPtempPtr ) += +XQjep_Vrth*(s->real); - *(here->HICUMemitEItempPtr + 1) += -XQjep_Vrth*(s->imag); - *(here->HICUMemitEItempPtr ) += -XQjep_Vrth*(s->real); - *(here->HICUMbaseTempPtr + 1) += +Xqjcx0_t_i_Vrth*(s->imag); - *(here->HICUMbaseTempPtr ) += +Xqjcx0_t_i_Vrth*(s->real); - *(here->HICUMcollCItempPtr + 1) += -Xqjcx0_t_i_Vrth*(s->imag); - *(here->HICUMcollCItempPtr ) += -Xqjcx0_t_i_Vrth*(s->real); - *(here->HICUMbaseBPtempPtr + 1) += +Xqjcx0_t_ii_Vrth*(s->imag); - *(here->HICUMbaseBPtempPtr ) += +Xqjcx0_t_ii_Vrth*(s->real); - *(here->HICUMcollCItempPtr + 1) += -Xqjcx0_t_ii_Vrth*(s->imag); - *(here->HICUMcollCItempPtr ) += -Xqjcx0_t_ii_Vrth*(s->real); - *(here->HICUMbaseBPtempPtr + 1) += +XQdsu_Vrth*(s->imag); - *(here->HICUMbaseBPtempPtr ) += +XQdsu_Vrth*(s->real); - *(here->HICUMcollCItempPtr + 1) += -XQdsu_Vrth*(s->imag); - *(here->HICUMcollCItempPtr ) += -XQdsu_Vrth*(s->real); - *(here->HICUMsubsSItempPtr + 1) += +XQjs_Vrth*(s->imag); - *(here->HICUMsubsSItempPtr ) += +XQjs_Vrth*(s->real); - *(here->HICUMcollCItempPtr + 1) += -XQjs_Vrth*(s->imag); - *(here->HICUMcollCItempPtr ) += -XQjs_Vrth*(s->real); - *(here->HICUMsubsTempPtr + 1) += +XQscp_Vrth*(s->imag); - *(here->HICUMsubsTempPtr ) += +XQscp_Vrth*(s->real); - *(here->HICUMcollTempPtr + 1) += -XQscp_Vrth*(s->imag); - *(here->HICUMcollTempPtr ) += -XQscp_Vrth*(s->real); + *(here->HICUMbaseBItempPtr + 1) += +XQrbi_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMbaseBItempPtr ) += +XQrbi_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMbaseBPtempPtr + 1) += -XQrbi_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMbaseBPtempPtr ) += -XQrbi_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMbaseBItempPtr + 1) += +XQjei_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMbaseBItempPtr ) += +XQjei_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMemitEItempPtr + 1) += -XQjei_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMemitEItempPtr ) += -XQjei_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMbaseBItempPtr + 1) += +XQf_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMbaseBItempPtr ) += +XQf_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMemitEItempPtr + 1) += -XQf_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMemitEItempPtr ) += -XQf_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMbaseBItempPtr + 1) += +XQr_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMbaseBItempPtr ) += +XQr_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMcollCItempPtr + 1) += -XQr_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMcollCItempPtr ) += -XQr_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMbaseBItempPtr + 1) += +XQjci_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMbaseBItempPtr ) += +XQjci_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMcollCItempPtr + 1) += -XQjci_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMcollCItempPtr ) += -XQjci_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMbaseBPtempPtr + 1) += +XQjep_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMbaseBPtempPtr ) += +XQjep_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMemitEItempPtr + 1) += -XQjep_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMemitEItempPtr ) += -XQjep_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMbaseTempPtr + 1) += +Xqjcx0_t_i_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMbaseTempPtr ) += +Xqjcx0_t_i_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMcollCItempPtr + 1) += -Xqjcx0_t_i_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMcollCItempPtr ) += -Xqjcx0_t_i_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMbaseBPtempPtr + 1) += +Xqjcx0_t_ii_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMbaseBPtempPtr ) += +Xqjcx0_t_ii_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMcollCItempPtr + 1) += -Xqjcx0_t_ii_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMcollCItempPtr ) += -Xqjcx0_t_ii_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMbaseBPtempPtr + 1) += +XQdsu_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMbaseBPtempPtr ) += +XQdsu_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMcollCItempPtr + 1) += -XQdsu_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMcollCItempPtr ) += -XQdsu_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMsubsSItempPtr + 1) += +XQjs_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMsubsSItempPtr ) += +XQjs_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMcollCItempPtr + 1) += -XQjs_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMcollCItempPtr ) += -XQjs_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMsubsTempPtr + 1) += +XQscp_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMsubsTempPtr ) += +XQscp_Vrth*Tdev_Vrth*(s->real); + *(here->HICUMcollTempPtr + 1) += -XQscp_Vrth*Tdev_Vrth*(s->imag); + *(here->HICUMcollTempPtr ) += -XQscp_Vrth*Tdev_Vrth*(s->real); *(here->HICUMtempTempPtr + 1) += +XQcth_Vrth*(s->imag); *(here->HICUMtempTempPtr ) += +XQcth_Vrth*(s->real); diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 1aeea068a..a23bea724 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -2,38 +2,15 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles Model Author: 1990 Michael Schröter TU Dresden -Spice3 Implementation: 2019 Dietmar Warning, Markus Müller, Mario Krattenmacher +Spice3 Implementation: 2020 Dietmar Warning, Markus Müller, Mario Krattenmacher **********/ /* * This file defines the HICUM L2.4.0 model load function * Comments on the Code: - * - We use dual numbers to calculate derivatives, this is readble and error proof. - * - The code is targeted to be readbale and maintainable, speed is sacrificied for this purpose. - * - The verilog a code is available at the website of TU Dresden, Michael Schroeter#s chair. - * - * Checklist of what needs to be done: (@Mario: also look at this, did I get everything?) - * - ijBEp - * - ijBCx - * - QjEp - * - QBCx' - * - QBCx'' - * - QdS - * - QjS - * - iTS - * - ijSC - * - rbi - * - crbi,qrbi - * - Qjci - * - Qjei - * - ijBCi - * - ijBEi - * - Qf - * - Qr - * - iavl - * - iBEti - * - itf, itr - * - NQS derivatives, sources and elements + * - We use dual numbers to calculate derivatives, this is readble and error proof. => you need to understand that to understand this code + * - The code is targeted to be readbale and maintainable, speed is sacrificed for this purpose. + * - The verilog a code is available at the website of TU Dresden, Michael Schroeter's chair. */ #include "cmath" @@ -374,7 +351,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Qdei,Qrbi; double Qdei_Vbiei, Qdei_Vbici, Qdei_dT; double it,ibei,irei,ibci,ibep,irep,ibh_rec; - double volatile ibet,iavl,iavl_dT,iavl_Vbiei,iavl_Vbici; + double ibet,iavl,iavl_dT,iavl_Vbiei,iavl_Vbici; double ijbcx,ijbcx_dT,ijbcx_Vbpci,ijsc,ijsc_Vsici,ijsc_Vrth,Qjs,Qscp,HSI_Tsu,Qdsu; double HSI_Tsu_Vbpci, HSI_Tsu_Vsici, HSI_Tsu_dT; double Qdsu_Vbpci, Qdsu_Vsici, Qdsu_dT; @@ -383,7 +360,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Cscp_Vsc, Cscp_dT; //Base resistance and self-heating power - double volatile rbi,pterm,pterm_dT; + double rbi,pterm,pterm_dT; //Model initialization double C_1; @@ -455,7 +432,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double ibpsihat; double ithhat; double ceq, geq=0.0; - double volatile rhs_current; + double rhs_current; int icheck=1; int ichk1, ichk2, ichk3, ichk4, ichk5, ichk6; int error; @@ -467,7 +444,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Ibpci=0, Ibpci_Vbpci; double Isici, Isici_Vsici;// double Isc=0, Isc_Vsc=0; - double volatile Iciei, Iciei_Vbiei, Iciei_Vbici, Iciei_Vrth, Iciei_Vxf2; + double Iciei, Iciei_Vbiei, Iciei_Vbici, Iciei_Vrth, Iciei_Vxf2; double Ibbp_Vbbp=0; double Isis_Vsis; double Ieie, Ieie_Veie=0; @@ -518,7 +495,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) //NQS double Qxf_Vxf, Qxf1_Vxf1, Qxf2_Vxf2; - double volatile Ith=0, Vrth=0, Icth, Icth_Vrth, delvrth; + double Ith=0, Vrth=0, Icth, Icth_Vrth, delvrth; double Ibiei_Vrth=0; double Ibici_Vrth=0; @@ -868,14 +845,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) //Avalanche current duals::duald iavl; duals::duald v_bord,v_q,U0,av,avl,cjci0_t, vdci_t, qavl_t,favl_t, kavl_t; - // double v_bord_r; - // double volatile v_bord_r1; - // int use_aval; - // if ((model->HICUMfavl > 0.0) && (model->HICUMcjci0_scaled > 0.0)) { - // use_aval = 1; - // } else { - // use_aval = 0; - // } if (use_aval == 1) {//begin : HICAVL double T_dpart = T.dpart(); cjci0_t = here->HICUMcjci0_t.rpart; @@ -915,19 +884,11 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) } else { iavl = itf*avl; } - // if (avl > 0 && iavl==0){ - // printf("error"); - // fflush(stdout); - // } } else { iavl = 0.0; - // printf("error"); - // fflush(stdout); } } else{ iavl = 0; - // printf("error"); - // fflush(stdout); } // Note that iavl = 0.0 is already set in the initialization block for use_aval == 0 (Markus: not for this lambda!) return iavl; @@ -1115,24 +1076,10 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) l_it = l_it+1; if (!(abs(d_Q) >= RTOLC*abs(Q_pT))) { //extra_rounds to get rid of derivative noise extra_round = extra_round + 1; - - // printf("extra round\n"); - // condition_ = (extra_round < 5); - // std::cout << std::noboolalpha << condition_ << " == " << std::boolalpha << condition_ << std::endl; - // condition_ = (abs(d_Q) >= RTOLC*abs(Q_pT)) && (l_it <= l_itmax) && (extra_round < 5); - // std::cout << std::noboolalpha << condition_ << " == " << std::boolalpha << condition_ << std::endl; } } - // I_Tf1 = i_0f/Q_pT; - // a_h = Oich*I_Tf1; - // itf = I_Tf1*(1.0+a_h); - // itr = i_0r/Q_pT; - // //Final transit times, charges and transport current components - // Tf = T_f0; - // Qf = T_f0*itf; - // // `HICQFF(itf,ick,Tf,Qf,T_fT,Q_fT,Q_bf) - // Qr = Tr*itr; + //final calculations afterwards, see later in load where this is called } //if return Q_pT; @@ -1399,7 +1346,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) ///////////////////////// // begin copy state vector ///////////////////////// - //done with copy&paste plus VIM macro ... thank god for VIM. *(ckt->CKTstate0+here->HICUMvbiei)=*(ckt->CKTstate1+here->HICUMvbiei); *(ckt->CKTstate0+here->HICUMvbici)=*(ckt->CKTstate1+here->HICUMvbici); *(ckt->CKTstate0+here->HICUMvbpei)=*(ckt->CKTstate1+here->HICUMvbpei); @@ -1532,7 +1478,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vbiei = model->HICUMtype*( *(ckt->CKTrhsOld+here->HICUMbaseBINode)- *(ckt->CKTrhsOld+here->HICUMemitEINode)); - Vbe = model->HICUMtype*( //@Dietmar: correct? + Vbe = model->HICUMtype*( *(ckt->CKTrhsOld+here->HICUMbaseNode)- *(ckt->CKTrhsOld+here->HICUMemitNode)); Vbici = model->HICUMtype*( @@ -1863,7 +1809,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) /* * determine dc current and derivatives */ -//todo: check for double multiplication on pnp's Vbiei = model->HICUMtype*Vbiei; Vbici = model->HICUMtype*Vbici; Vciei = (Vbiei-Vbici); @@ -1872,6 +1817,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vbci = model->HICUMtype*Vbci; Vsici = model->HICUMtype*Vsici; Vsc = model->HICUMtype*Vsc; + //Dietmar, what about this // Vxf = model->HICUMtype*Vxf; // Vxf1 = model->HICUMtype*Vxf1; // Vxf2 = model->HICUMtype*Vxf2; @@ -1880,10 +1826,12 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Temp = here->HICUMtemp+Vrth; _iret = hicum_thermal_update(model, here, &Temp, &Tdev_Vrth); - here->HICUMdtemp_sh = Temp - here->HICUMtemp; + here->HICUMdtemp_sh = Temp - here->HICUMtemp; + here->HICUMtemp_Vrth = Tdev_Vrth; } else { Temp = here->HICUMtemp; - here->HICUMdtemp_sh = 0; + here->HICUMdtemp_sh = 0; + here->HICUMtemp_Vrth = 0; } // Model_evaluation @@ -1999,7 +1947,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) //begin final transfer current calculations -> itf, itr, Qf, Qr------------ calc_it_final(Temp+1_e, Vbiei , Vbici , Q_pT+1_e*Q_pT_dT , T_f0+1_e*T_f0_dT , ick+1_e*ick_dT , &result_itf, &result_itr, &result_Qf, &result_Qr, &result_Q_bf, &result_Tf); - // calc_it_final(Temp+1_e, Vbiei , Vbici , Q_pT , T_f0 , ick , &result_itf, &result_itr, &result_Qf, &result_Qr); itf = result_itf.rpart(); itr = result_itr.rpart(); Qf = result_Qf.rpart(); @@ -2074,7 +2021,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Qrbi = Crbi*Vbpbi; //Vbpbi=(Vbpei-Vbiei)=(Vbpci-Vbici) Qrbi_Vbpbi = Crbi; - Qrbi_Vbiei = Vbpbi*Crbi_Vbiei;// - Crbi; //What do you think Dietmar? + Qrbi_Vbiei = Vbpbi*Crbi_Vbiei;// - Crbi; //not sure about this derivative Qrbi_Vbici = Vbpbi*Crbi_Vbici;//- Crbi; Qrbi_Vrth = Vbpbi*Crbi_Vrth; @@ -2098,61 +2045,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) here->HICUMiavl = iavl; - // double v_bord, v_bord_Vbici, v_bord_dT; - // double v_q, v_q_dT, v_q_Vbici; - // double U0,U0_dT; - // double av,av_dT, av_Vbici; - // double avl,avl_av, avl_U0, avl_v_q, avl_v_bord, avl_Vbici, avl_dT; - - //Avalanche current hand implementation - // iavl = 0; - // iavl_Vbici = 0; - // iavl_Vbiei = 0; - // iavl_dT = 0; - // if (use_aval == 1) {//begin : HICAVL - // v_bord = here->HICUMvdci_t.rpart-Vbici; - // v_bord_Vbici = -1; - // v_bord_dT = here->HICUMvdci_t.dpart; - // if (v_bord > 0) { - // v_q = here->HICUMqavl_t.rpart/Cjci; - // v_q_dT = here->HICUMqavl_t.dpart/Cjci - v_q/Cjci*Cjci_dT ; - // v_q_Vbici = -v_q*Cjci_Vbici/Cjci; - // U0 = here->HICUMqavl_t.rpart/here->HICUMcjci0_t.rpart; - // U0_dT = here->HICUMqavl_t.dpart/here->HICUMcjci0_t.rpart - U0/here->HICUMcjci0_t.rpart*here->HICUMcjci0_t.dpart; - // if(v_bord > U0){ - // av = here->HICUMfavl_t.rpart*exp(-v_q/U0); - // av_dT = here->HICUMfavl_t.dpart*exp(-v_q/U0) - av*(v_q_dT/U0-v_q/U0*U0_dT); - // av_Vbici = -av*v_q_Vbici/U0; - // avl = av*(U0+(1.0+v_q/U0)*(v_bord-U0)); - // avl_av = (U0+(1.0+v_q/U0)*(v_bord-U0)); - // avl_U0 = av*(1.0 - v_q/U0/U0*(v_bord-U0) - (1.0+v_q/U0) ); - // avl_v_bord = av*(1.0+v_q/U0); - // avl_v_q = av*(v_bord-U0)/U0; - // avl_Vbici = avl_av*av_Vbici + avl_v_q*v_q_Vbici + avl_v_bord*v_bord_Vbici; - // avl_dT = avl_av*av_dT + avl_U0*U0_dT + avl_v_bord*v_bord_dT + avl_v_q*v_q_dT; - // } else { - // avl = here->HICUMfavl_t.rpart*v_bord*exp(-v_q/v_bord); - // avl_v_q = -avl/v_bord; - // avl_v_bord = avl*v_q/v_bord/v_bord; - // avl_dT = here->HICUMfavl_t.dpart*v_bord*exp(-v_q/v_bord) + avl_v_bord*v_bord_dT + avl_v_q*v_q_dT; - // avl_Vbici = avl_v_q*v_q_Vbici + avl_v_bord*v_bord_Vbici; - // } - // if (model->HICUMkavl > 0) { //: HICAVLHIGH - // // duals::duald denom,sq_smooth,hl; - // // denom = 1-kavl_t*avl; - // // // Avoid denom < 0 using a smoothing function - // // sq_smooth = sqrt(denom*denom+0.01); - // // hl = 0.5*(denom+sq_smooth); - // // iavl = itf*avl/hl; - // } else { - // iavl = itf*avl; - // iavl_Vbici = avl*itf_Vbici + avl_Vbici*itf; - // iavl_Vbiei = avl*itf_Vbiei; - // iavl_dT = avl*itf_dT + itf*avl_dT; - // } - // } - // } - //Excess base current from recombination at the b-c barrier ibh_rec = Q_bf*Otbhrec; ibh_rec_Vbiei = Otbhrec*Q_bf_Vbiei ; @@ -3279,7 +3171,7 @@ load: // finish if (nqs) { - // Branch: xf1-ground, Stamp element: Ixf1 f_xf1=+ //Markus has opposite sign than Dietmar. This current flows from xf1 to ground? + // Branch: xf1-ground, Stamp element: Ixf1 f_xf1=+ rhs_current = Ixf1 - Ixf1_Vbici*Vbici - Ixf1_Vbiei*Vbiei -Ixf1_Vxf1*Vxf1 - Ixf1_Vxf2*Vxf2; *(ckt->CKTrhs + here->HICUMxf1Node) += -rhs_current; // rhs_current; // into xf1 node *(here->HICUMxf1BaseBIPtr) += +Ixf1_Vbiei; @@ -3289,7 +3181,7 @@ load: *(here->HICUMxf1Xf2Ptr) += +Ixf1_Vxf2; *(here->HICUMxf1Xf1Ptr) += +Ixf1_Vxf1; - // Branch: xf2-ground, Stamp element: Ixf2 f_xf2=+ //Markus has opposite sign than Dietmar. This current flows from xf1 to ground? + // Branch: xf2-ground, Stamp element: Ixf2 f_xf2=+ rhs_current = Ixf2 - Ixf2_Vbici*Vbici - Ixf2_Vbiei*Vbiei - Ixf2_Vxf1*Vxf1 - Ixf2_Vxf2*Vxf2; *(ckt->CKTrhs + here->HICUMxf2Node) += -rhs_current; // rhs_current; // into xf2 node *(here->HICUMxf2BaseBIPtr) += +Ixf2_Vbiei; @@ -3299,7 +3191,7 @@ load: *(here->HICUMxf2Xf2Ptr) += +Ixf2_Vxf2; *(here->HICUMxf2Xf1Ptr) += +Ixf2_Vxf1; - // Branch: xf-ground, Stamp element: Ixf f_xf=+ //Markus has opposite sign than Dietmar. This current flows from xf1 to ground? + // 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 *(here->HICUMxfBaseBIPtr) += +Ixf_Vbiei; diff --git a/src/spicelib/devices/hicum2/hicumL2temp.cpp b/src/spicelib/devices/hicum2/hicumL2temp.cpp index a22950a6d..20c459b24 100644 --- a/src/spicelib/devices/hicum2/hicumL2temp.cpp +++ b/src/spicelib/devices/hicum2/hicumL2temp.cpp @@ -168,8 +168,10 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double *(Tdev_Vrth) = 0; } } + //This routine calculate the derivative with respect to Vrth. Since at some point + // Tdev becomes constant (see above), we need to account for this like below. temp = *(HICUMTemp)+1_e* *(Tdev_Vrth); // dual number device temperature - vt = temp*CONSTKoverQ; // dual valued temperature voltage + vt = temp*CONSTKoverQ; // dual valued temperature voltage here->HICUMvt0 = Tnom * CONSTKoverQ; here->HICUMvt.rpart = vt.rpart(); diff --git a/src/spicelib/devices/hicum2/overview_files.md b/src/spicelib/devices/hicum2/overview_files.md deleted file mode 100644 index 3e917201c..000000000 --- a/src/spicelib/devices/hicum2/overview_files.md +++ /dev/null @@ -1,202 +0,0 @@ -notes of Mario and Markus with thanks to Dietmar - -# Overview of Spice Files for HiCUM - -This file gives an overview of the files needed for the ngspice HiCUM version, e.g. their: - -- intent -- status -- assignee (Mario or Markus) - -- hicum2.c - - Definition of the external instance and model structure. - - Including the variables which can be accessed from the outside. -- hicum2acld.c -- hicum2ask.c - - Define how the instance output data is saved. -- hicum2conv.c -- hicum2defs.h - - Define the internal data structure -- hicum2ext.h -- hicum2getic.h -- hicum2init.h -- hicum2itf.h -- hicum2load.c -- hicum2mask.c - - Define how the model output data is saved. -- hicum2mpar.c - - Check which parameters for the model were given in the netlist. If a parameter is given, save it and set the XXXGiven flag. -- hicum2noise.c -- hicum2param.c -- hicum2pzld.c -- hicum2setup.c -- hicum2soachk.c -- hicum2temp.c - - Temperature scaling of all parameters - - Models are implemented and all derivatives are implemented using dual numbers - - Assignee: Mario -- hicum2trunc.c -- hicumL2.cpp - Implemented equivalent circuit elements: - - Ijbei - - Ijbci - - Cjei - - Cjci - - It - - Crbi (Mario check this) - - Iavl - - Ibhrec - - rbi - - Ijbep - - Ijbep - - Ijbcx - - Cjcx - - Cjs - - Cjep - - Ibet - - Ijsc - Missing: - - Ibpsi - -## Working in the DC case without self heating: - -See test case in DMT where this is compared against ADS. - -- re -- Ibiei -- Ibici - -## useful stuff - -non-ancient explanation how equation system of spice looks: - - -# run tests and get netlists -Ja, gibt es: run_cmc_check script im tests/bin Verzeichnis hat oben einen debug Schalter. -Dann musst Du in qaSpec Dir die entsprechenden tests ein- bzw. auskommentieren. -Nicht über die hohen % Zahlen wundern. Wir bewegen uns oft im exp Bereich. Deshalb der tkdiff Vergleich ob es grob stimmt. - -# run cmc tests -P.S. Bedienungsanleitung cmc qa check: -- das zu prüfende ngspice muß im Pfad liegen! -- ins tests/hicum2/npn Verzeichnis setzen und "./run" aufrufen -- die results mit den reference per tkdiff oder ähnlich vergleichen - -# AC Anleitung - -Die Regeln für die AC load Aufstellung sind: -1. Inspizieren ob XXXload.c Matrix und RHS vollständig ist! -2. Cut the entire block. -3. Paste into XXXacload.c -4. Löschen der RHS Einträge. -5. Verdoppeln aller Matrixeinträge + shift mit +1 für die imag Anteile von reaktive Zweigen. -6. dafür sorgen daß diese mit 2*Pi*f CKTomega) malgenommen werden. -Es ist reine cut&paste Arbeit mit einem guten Editor. - -# Kommentar von DWarn, mal ansehen -Im Init part, line 1142: - if (ibets > 0) begin : HICTUN_T - -Im Update part, line 1361: - if (ibets > 0 && (Vbpei < 0.0 || Vbiei < 0.0)) begin : HICTUN_T - - -# gmin - -Die Knoten eines nichlinearen Zweiges müssen einmal (!) mit gmin verbunden werden. -Daraus folgt, wie schon gemacht, für den Strom gmin*Vxy als Zusatz und für alle (!) -Ableitungen des Stromes gmin als Zusatz. - -Praktisch heißt das, daß die Beaufschlagung von Iciei überflüssig ist, -da schon mit den Zweigen biei und bici erfolgt ist. -Es fehlen aber noch Beaufschlagungen, -z.B. Ibiei_Vbici, weil die Ableitung später hinzugekommen ist. - -# CMC Failing Tests -****** Checking test (ngspice): fgum_ac_npn_1D_ac - variant: standard (compared to: reference) FAIL (probably from some simulation failure) - -****** Checking test (ngspice): fgum_ac_npn_internal_ac - variant: standard (compared to: reference) FAIL (probably from some simulation failure) - -****** Checking test (ngspice): fgum_ac_npn_full_ac - variant: standard (compared to: reference) FAIL (probably from some simulation failure) - -****** Checking test (ngspice): fgum_ac_npn_full_subcoupl_peri_bias_ac - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - -****** Checking test (ngspice): fgum_ac_npn_full_subcoupl_peri_con_ac - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - -****** Checking test (ngspice): fgum_ac_npn_full_subcoupl_peri_bias_ac - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - -****** Checking test (ngspice): fgum_ac_npn_full_subcoupl_peri_cond_ac - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - -****** Checking test (ngspice): fgum_ac_npn_vert_nqs_ac - variant: standard (compared to: reference) FAIL (probably from some simulation failure) - -***** Checking test (ngspice): fgum_ac_npn_lat_nqs_ac - variant: standard (compared to: reference) FAIL (probably from some simulation failure) - -****** Checking test (ngspice): fgum_ac_npn_cornoise_ac - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - -***** Checking test (ngspice): CBE_npn_1D_dc - variant: standard (compared to: reference) FAIL (probably from some simulation failure) - -****** Checking test (ngspice): CBE_npn_1D_ac - variant: standard (compared to: reference) FAIL (probably from some simulation failure) - -****** Checking test (ngspice): CBE_npn_internal_ac - variant: standard (compared to: reference) FAIL (probably from some simulation failure) - -***** Checking test (ngspice): CBE_npn_full_ac - variant: standard (compared to: reference) FAIL (probably from some simulation failure) - -***** Checking test (ngspice): ypara_npn_1D_ac - variant: standard (compared to: reference) FAIL (probably from some simulation failure) - -***** Checking test (ngspice): ypara_npn_internal_ac - variant: standard (compared to: reference) FAIL (probably from some simulation failure) - -***** Checking test (ngspice): ypara_npn_full_ac - variant: standard (compared to: reference) FAIL (probably from some simulation failure) - -***** Checking test (ngspice): ypara_npn_full_sh_ac - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - -****** Checking test (ngspice): ypara_npn_full_subtran_ac - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - -****** Checking test (ngspice): ypara_npn_full_subcoupl_ac - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - -****** Checking test (ngspice): ypara_npn_full_subcoupl_peri_bias_ac - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - -****** Checking test (ngspice): ypara_npn_full_subcoupl_peri_con_ac - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - -***** Checking test (ngspice): ypara_npn_full_subcoupl_peri_bias_ac - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - -****** Checking test (ngspice): ypara_npn_full_subcoupl_peri_con_ac - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - variant: standard (compared to: reference) DIFFER (max rel error is 100%) - -***** Checking test (ngspice): ypara_npn_vert_nqs_ac - variant: standard (compared to: reference) FAIL (probably from some simulation failure) - -****** Checking test (ngspice): ypara_npn_lat_nqs_ac - variant: standard (compared to: reference) FAIL (probably from some simulation failure) - -****** Checking test (ngspice): ypara_npn_cornoise_ac - variant: standard (compared to: reference) DIFFER (max rel error is 100%) -