From 0fc39a424e52804c40003b55ee398812cbaf151b Mon Sep 17 00:00:00 2001 From: dwarning Date: Mon, 20 Jul 2020 19:36:15 +0200 Subject: [PATCH 01/39] unify nqs flag for setup/unsetup --- src/spicelib/devices/hicum2/hicum2setup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spicelib/devices/hicum2/hicum2setup.c b/src/spicelib/devices/hicum2/hicum2setup.c index b2d3143d7..4de51d82a 100644 --- a/src/spicelib/devices/hicum2/hicum2setup.c +++ b/src/spicelib/devices/hicum2/hicum2setup.c @@ -800,7 +800,7 @@ HICUMunsetup( model = HICUMnextModel(model)) { int selfheat = (((model->HICUMflsh == 1) || (model->HICUMflsh == 2)) && (model->HICUMrthGiven) && (model->HICUMrth > 0.0)); - int nqs = ( (model->HICUMflnqs != 0 || model->HICUMflcomp == 0.0 || model->HICUMflcomp == 2.1) && (model->HICUMalit > 0 || model->HICUMalqf > 0)); + int nqs = ( (model->HICUMflnqs != 0 || model->HICUMflcomp < 2.3) && (model->HICUMalit > 0 || model->HICUMalqf > 0)); for (here = HICUMinstances(model); here != NULL; here=HICUMnextInstance(here)) From 187d391383cfe76fb5214971ac0ad7fe94b7e397 Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 21 Jul 2020 09:58:59 +0200 Subject: [PATCH 02/39] few corrections and reordering --- src/spicelib/devices/hicum2/hicumL2.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 2bac04c0a..53b77d757 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -429,7 +429,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double hjei_vbe; double Vbiei, Vbici, Vciei, Vbpei, Vbpbi, Vbpci, Vsici, Vbci, Vsc; - double Vbici_temp; + double Vbici_temp, Vaval; // Model flags int use_aval; @@ -1830,22 +1830,23 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) ichk1 = 1, ichk2 = 1, ichk3 = 1, ichk4 = 1, ichk5=1, ichk6 = 0; Vbiei = DEVpnjlim(Vbiei,*(ckt->CKTstate0 + here->HICUMvbiei),here->HICUMvt.rpart, here->HICUMtVcrit,&icheck); - if ( 1 || (iavl==0.0) || (-VbiciHICUMvdci_t.rpart) ) { - Vbici = DEVpnjlim(Vbici,*(ckt->CKTstate0 + here->HICUMvbici),here->HICUMvt.rpart, - here->HICUMtVcrit,&ichk1); - - } else { //limit change around 3*vdci_t, also iavl_Vbiei sign inverted -> somehow this brings convergence - Vbici_temp = - (Vbici + here->HICUMvdci_t.rpart*3), + Vaval = 3 * here->HICUMvdci_t.rpart;//limit step around 3*vdci_t -> somehow this brings convergence + if ((model->HICUMkavlGiven) && (Vbici < MIN(0, -Vaval))) { + Vbici_temp = -(Vbici + Vaval); Vbici_temp = DEVpnjlim( Vbici_temp, - -(*(ckt->CKTstate0 + here->HICUMvbici) + here->HICUMvdci_t.rpart*3), - here->HICUMvt.rpart/10, + -(*(ckt->CKTstate0 + here->HICUMvbici) + Vaval), + here->HICUMvt.rpart, here->HICUMtVcrit, &ichk1 ); - Vbici = - (Vbici_temp+here->HICUMvdci_t.rpart*3); - + Vbici = -(Vbici_temp + Vaval); + } else { + Vbici = DEVpnjlim(Vbici,*(ckt->CKTstate0 + here->HICUMvbici),here->HICUMvt.rpart, + here->HICUMtVcrit,&ichk1); } +// ichk1 = 0; +// Vbici = HICUMlimitlog(Vbici,*(ckt->CKTstate0 + here->HICUMvbici),0.4,&ichk1); Vbpei = DEVpnjlim(Vbpei,*(ckt->CKTstate0 + here->HICUMvbpei),here->HICUMvt.rpart, here->HICUMtVcrit,&ichk2); Vbpci = DEVpnjlim(Vbpci,*(ckt->CKTstate0 + here->HICUMvbpci),here->HICUMvt.rpart, From 6f5627f44169bd4eb72dea3fb7d8f6d600ddcdb5 Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Tue, 21 Jul 2020 11:48:22 +0200 Subject: [PATCH 03/39] node collapsing BI BP HICUM --- src/spicelib/devices/hicum2/hicum2setup.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2setup.c b/src/spicelib/devices/hicum2/hicum2setup.c index 4de51d82a..cb3df9a87 100644 --- a/src/spicelib/devices/hicum2/hicum2setup.c +++ b/src/spicelib/devices/hicum2/hicum2setup.c @@ -617,11 +617,20 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) } } } - - if(here->HICUMbaseBINode == 0) { + if(model->HICUMrbi0 == 0) { + here->HICUMbaseBINode = here->HICUMbaseBPNode; + } else if(here->HICUMemitEINode == 0) { error = CKTmkVolt(ckt, &tmp, here->HICUMname, "baseBI"); if(error) return(error); here->HICUMbaseBINode = tmp->number; + if (ckt->CKTcopyNodesets) { + if (CKTinst2Node(ckt,here,5,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } + } } if (selfheat) { From 34f579c08f9b8378c29074678e9cb651f49092ce Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Tue, 21 Jul 2020 13:05:54 +0200 Subject: [PATCH 04/39] fix bug node collapsing BI BP --- src/spicelib/devices/hicum2/hicum2setup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spicelib/devices/hicum2/hicum2setup.c b/src/spicelib/devices/hicum2/hicum2setup.c index cb3df9a87..ea46a36bc 100644 --- a/src/spicelib/devices/hicum2/hicum2setup.c +++ b/src/spicelib/devices/hicum2/hicum2setup.c @@ -619,7 +619,7 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) } if(model->HICUMrbi0 == 0) { here->HICUMbaseBINode = here->HICUMbaseBPNode; - } else if(here->HICUMemitEINode == 0) { + } else if(here->HICUMbaseBINode == 0) { error = CKTmkVolt(ckt, &tmp, here->HICUMname, "baseBI"); if(error) return(error); here->HICUMbaseBINode = tmp->number; From 9854038f2c22acf688fa494496ca7b71855198ea Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 21 Jul 2020 16:48:56 +0200 Subject: [PATCH 05/39] allow periphal resistors and rbi default 0 --- src/spicelib/devices/hicum2/hicum2mpar.c | 3 - src/spicelib/devices/hicum2/hicum2setup.c | 87 +++++++++++------------ src/spicelib/devices/hicum2/hicumL2.cpp | 2 - 3 files changed, 43 insertions(+), 49 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2mpar.c b/src/spicelib/devices/hicum2/hicum2mpar.c index 2b02a463c..57be1ad19 100644 --- a/src/spicelib/devices/hicum2/hicum2mpar.c +++ b/src/spicelib/devices/hicum2/hicum2mpar.c @@ -17,8 +17,6 @@ Spice3 Implementation: 2019 Dietmar Warning #include "ngspice/sperror.h" #include "ngspice/suffix.h" -#define MIN_R 0.001 - int HICUMmParam(int param, IFvalue *value, GENmodel *inModel) { @@ -196,7 +194,6 @@ HICUMmParam(int param, IFvalue *value, GENmodel *inModel) //Series resistances case HICUM_MOD_RBI0: model->HICUMrbi0 = value->rValue; - if (model->HICUMrbi0 < MIN_R) model->HICUMrbi0 = MIN_R; model->HICUMrbi0Given = TRUE; break; case HICUM_MOD_RBX: diff --git a/src/spicelib/devices/hicum2/hicum2setup.c b/src/spicelib/devices/hicum2/hicum2setup.c index ea46a36bc..4cb1657c5 100644 --- a/src/spicelib/devices/hicum2/hicum2setup.c +++ b/src/spicelib/devices/hicum2/hicum2setup.c @@ -21,8 +21,6 @@ Spice3 Implementation: 2019 Dietmar Warning #include "ngspice/ifsim.h" #include "ngspice/suffix.h" -#define MIN_R 0.001 - int HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* load the HICUM structure with those pointers needed later @@ -154,10 +152,10 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) //Series resistances if(!model->HICUMrbi0Given) - model->HICUMrbi0 = MIN_R; + model->HICUMrbi0 = 0.0; if(!model->HICUMrbxGiven) - model->HICUMrbx = MIN_R; + model->HICUMrbx = 0.0; if(!model->HICUMfgeoGiven) model->HICUMfgeo = 0.6557; @@ -172,10 +170,10 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) model->HICUMfqi = 1.0; if(!model->HICUMreGiven) - model->HICUMre = MIN_R; + model->HICUMre = 0.0; if(!model->HICUMrcxGiven) - model->HICUMrcx = MIN_R; + model->HICUMrcx = 0.0; //Substrate transistor if(!model->HICUMitssGiven) @@ -195,7 +193,7 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) //Intra-device substrate coupling if(!model->HICUMrsuGiven) - model->HICUMrsu = MIN_R; + model->HICUMrsu = 0.0; if(!model->HICUMcsuGiven) model->HICUMcsu = 0.0; @@ -499,24 +497,24 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) // Warning: // The scaling with HICUMm and HICUMarea is done here from model to here variables in order to save memory. - // Classical spice scaling with "area" is implemented, but it is not recommended to be used. If you want - // scaling, more sophisticated expressions should be used. Those can be found in modern PDKs or should be - // provided by modeling engineers. + // Classical spice scaling with "area" is implemented, but it is not recommended to be used. If you want + // scaling, more sophisticated expressions should be used. Those can be found in modern PDKs or should be + // provided by modeling engineers. // For discrete devices, the multiplication factor "m" should give reasonable results. // // The HICUMm device multiplicaton factor can be exected to give good results. // The following variables need scaling in HICUM: - // IT : qp0 ~ (area m)**2 qp0 ~ area m icbar ~ area m + // IT : qp0 ~ (area m)**2 qp0 ~ area m icbar ~ area m // BE junction: cjei0 ~ area m cjep0 ~ m // ibeis ~ area m ibeps ~ m // cbepar ~ m -> area scaling not reasonable // BC junction: cjci0 ~ area m cjcx0 ~ m - // ibcis ~ area m ibcxs ~ m - // ireis ~ area m ireps ~ m + // ibcis ~ area m ibcxs ~ m + // ireis ~ area m ireps ~ m // cbcpar ~ m -> area scaling not reasonable - // qavl ~ area m - // re ~1/(area*m) - // rci0 ~1/(area*m) + // qavl ~ area m + // re ~1/(area*m) + // rci0 ~1/(area*m) // rbx ~1/(area*m) -> assume that scaling with "area" is due to lE0 increase // rcx ~1/(area*m) -> assume that scaling with "area" is due to lE0 increase // rbi0 ~1/(area*m) -> assume that scaling with "area" is due to lE0 increase @@ -667,7 +665,7 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) here->HICUMxf2Node = 0; } - + /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ @@ -791,7 +789,7 @@ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(HICUMxf2TempPtr ,HICUMxf2Node ,HICUMtempNode); TSTALLOC(HICUMxf1TempPtr ,HICUMxf1Node ,HICUMtempNode); } - } + } } } return(OK); @@ -814,29 +812,30 @@ HICUMunsetup( for (here = HICUMinstances(model); here != NULL; here=HICUMnextInstance(here)) { - if (here->HICUMbaseBINode > 0) - CKTdltNNum(ckt, here->HICUMbaseBINode); - here->HICUMbaseBINode = 0; - - if (here->HICUMsubsSINode > 0 - && here->HICUMsubsSINode != here->HICUMsubsNode) - CKTdltNNum(ckt, here->HICUMsubsSINode); - here->HICUMsubsSINode = 0; - - if (here->HICUMemitEINode > 0 - && here->HICUMemitEINode != here->HICUMemitNode) - CKTdltNNum(ckt, here->HICUMemitEINode); - here->HICUMemitEINode = 0; + if (here->HICUMcollCINode > 0 + && here->HICUMcollCINode != here->HICUMcollNode) + CKTdltNNum(ckt, here->HICUMcollCINode); + here->HICUMcollCINode = 0; if (here->HICUMbaseBPNode > 0 && here->HICUMbaseBPNode != here->HICUMbaseNode) CKTdltNNum(ckt, here->HICUMbaseBPNode); here->HICUMbaseBPNode = 0; - if (here->HICUMcollCINode > 0 - && here->HICUMcollCINode != here->HICUMcollNode) - CKTdltNNum(ckt, here->HICUMcollCINode); - here->HICUMcollCINode = 0; + if (here->HICUMemitEINode > 0 + && here->HICUMemitEINode != here->HICUMemitNode) + CKTdltNNum(ckt, here->HICUMemitEINode); + here->HICUMemitEINode = 0; + + if (here->HICUMsubsSINode > 0 + && here->HICUMsubsSINode != here->HICUMsubsNode) + CKTdltNNum(ckt, here->HICUMsubsSINode); + here->HICUMsubsSINode = 0; + + if (here->HICUMbaseBINode > 0 + && here->HICUMbaseBPNode != here->HICUMbaseBINode) + CKTdltNNum(ckt, here->HICUMbaseBINode); + here->HICUMbaseBINode = 0; if (selfheat) { if (here->HICUMtempNode > 5) { // it is an internal node @@ -847,17 +846,17 @@ HICUMunsetup( if (nqs) { - if(here->HICUMxfNode > 0) - CKTdltNNum(ckt, here->HICUMxfNode); - here->HICUMxfNode = 0; + if(here->HICUMxfNode > 0) + CKTdltNNum(ckt, here->HICUMxfNode); + here->HICUMxfNode = 0; - if(here->HICUMxf1Node > 0) - CKTdltNNum(ckt, here->HICUMxf1Node); - here->HICUMxf1Node = 0; + if(here->HICUMxf1Node > 0) + CKTdltNNum(ckt, here->HICUMxf1Node); + here->HICUMxf1Node = 0; - if(here->HICUMxf2Node > 0) - CKTdltNNum(ckt, here->HICUMxf2Node); - here->HICUMxf2Node = 0; + if(here->HICUMxf2Node > 0) + CKTdltNNum(ckt, here->HICUMxf2Node); + here->HICUMxf2Node = 0; } } diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 53b77d757..12cdcc41b 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -1845,8 +1845,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vbici = DEVpnjlim(Vbici,*(ckt->CKTstate0 + here->HICUMvbici),here->HICUMvt.rpart, here->HICUMtVcrit,&ichk1); } -// ichk1 = 0; -// Vbici = HICUMlimitlog(Vbici,*(ckt->CKTstate0 + here->HICUMvbici),0.4,&ichk1); Vbpei = DEVpnjlim(Vbpei,*(ckt->CKTstate0 + here->HICUMvbpei),here->HICUMvt.rpart, here->HICUMtVcrit,&ichk2); Vbpci = DEVpnjlim(Vbpci,*(ckt->CKTstate0 + here->HICUMvbpci),here->HICUMvt.rpart, From f6db74ac50da167d3081c1c7e8a2e5eda254183f Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 21 Jul 2020 18:56:32 +0200 Subject: [PATCH 06/39] rm obsolete files --- tests/hicum2/npn/adsCkt | 169 ---- tests/hicum2/npn/qaSpec | 1421 ++++++++++++++++++++++++++++++++- tests/hicum2/npn/qaSpec_real | 1443 ---------------------------------- 3 files changed, 1406 insertions(+), 1627 deletions(-) delete mode 100644 tests/hicum2/npn/adsCkt delete mode 100644 tests/hicum2/npn/qaSpec_real diff --git a/tests/hicum2/npn/adsCkt b/tests/hicum2/npn/adsCkt deleted file mode 100644 index 9d79c9dbd..000000000 --- a/tests/hicum2/npn/adsCkt +++ /dev/null @@ -1,169 +0,0 @@ -; Noise simulation for ads -Options UseNutmegFormat=yes ASCII_Rawfile=yes -Options Temp=27 -Vsweep = 0 V - -define mysub (coll_x base_x emit_x subs_x therm_x) -#uselib "ckt", "VCVS" -VCVS:e_coll coll_x 0 coll_v 0 G=1 -V_Source:v_coll coll_v coll Vdc=0 -SDD:f_coll coll_x 0 C[1]="v_coll" I[1]=_c1*-1 -#uselib "ckt", "VCVS" -VCVS:e_base base_x 0 base_v 0 G=1 -V_Source:v_base base_v base Vdc=0 -SDD:f_base base_x 0 C[1]="v_base" I[1]=_c1*-1 -#uselib "ckt", "VCVS" -VCVS:e_emit emit_x 0 emit_v 0 G=1 -V_Source:v_emit emit_v emit Vdc=0 -SDD:f_emit emit_x 0 C[1]="v_emit" I[1]=_c1*-1 -#uselib "ckt", "VCVS" -VCVS:e_subs subs_x 0 subs_v 0 G=1 -V_Source:v_subs subs_v subs Vdc=0 -SDD:f_subs subs_x 0 C[1]="v_subs" I[1]=_c1*-1 -V_Source:v_therm therm therm_x Vdc=0 - -mymodel:q1 coll base emit subs therm \ - -model mymodel HICUM2_22 \ - C10= 9.074e-030 \ - Qp0= 1.008e-013 \ - Ich= 0 \ - Hfe= 10.01 \ - Hfc= 20.04 \ - Hjei= 3.382 \ - Hjci= 0.2 \ - Ibeis= 1.328e-019 \ - Mbei= 1.027 \ - Ireis= 1.5e-014 \ - Mrei= 2 \ - Ibeps= 1.26e-019 \ - Mbep= 1.042 \ - Ireps= 1.8e-014 \ - Mrep= 1.8 \ - Mcf= 1 \ - Tbhrec= 1e-010 \ - Ibcis= 4.603e-017 \ - Mbci= 1.15 \ - Ibcxs= 0 \ - Mbcx= 1 \ - Ibets= 0.02035 \ - Abet= 24 \ - Tunode= 1 \ - Favl= 18.96 \ - Qavl= 5.092e-014 \ - Alfav= -0.0024 \ - Alqav= -0.0006284 \ - Rbi0= 4.444 \ - Rbx= 2.568 \ - Fgeo= 0.7409 \ - Fdqr0= 0 \ - Fcrbi= 0 \ - Fqi= 1 \ - Re= 1.511 \ - Rcx= 2.483 \ - Itss= 1.143e-019 \ - Msf= 1.056 \ - Iscs= 4.60106e-015 \ - Msc= 1.018 \ - Tsf= 0 \ - Rsu= 500 \ - Csu= 6.4e-014 \ - Cjei0= 8.869e-015 \ - Vdei= 0.714 \ - Zei= 0.2489 \ - Ajei= 1.65 \ - Cjep0= 2.178e-015 \ - Vdep= 0.8501 \ - Zep= 0.2632 \ - Ajep= 1.6 \ - Cjci0= 3.58e-015 \ - Vdci= 0.8201 \ - Zci= 0.2857 \ - Vptci= 1.79 \ - Cjcx0= 6.299e-015 \ - Vdcx= 0.8201 \ - Zcx= 0.2863 \ - Vptcx= 1.977 \ - Fbcpar= 0.3 \ - Fbepar= 1 \ - Cjs0= 2.6e-014 \ - Vds= 0.9997 \ - Zs= 0.4295 \ - Vpts= 100 \ - T0= 2.089e-013 \ - Dt0h= 8e-014 \ - Tbvl= 8.25e-014 \ - Tef0= 3.271e-013 \ - Gtfe= 3.548 \ - Thcs= 5.001e-012 \ - Ahc= 0.05 \ - Fthc= 0.7 \ - Rci0= 9.523 \ - Vlim= 0.6999 \ - Vces= 0.01 \ - Vpt= 2 \ - Tr= 0 \ - Cbepar= 2.609e-014 \ - Cbcpar= 1.64512e-014 \ - Alqf= 0.166667 \ - Alit= 0.333333 \ - Flnqs= 0 \ - Kf= 0 \ - Af= 2 \ - Cfbe= -1 \ - Latb= 0 \ - Latl= 0 \ - Vgb= 0.91 \ - Alt0= 0.004 \ - Kt0= 6.588e-005 \ - Zetaci= 0.58 \ - Alvs= 0.001 \ - Alces= -0.2286 \ - Zetarbi= 0.3002 \ - Zetarbx= 0.06011 \ - Zetarcx= -0.02768 \ - Zetare= -0.9605 \ - Zetacx= 0 \ - Vge= 1.17 \ - Vgc= 1.17 \ - Vgs= 1.049 \ - F1vg= -0.000102377 \ - F2vg= 0.00043215 \ - Zetact= 5 \ - Zetabet= 4.892 \ - Alb= 0 \ - Flsh= 1 \ - Rth= 1113.4 \ - Cth= 6.841e-012 \ - Zetarth= 0 \ - Alrth= 0.002 \ - Flcomp= 2.3 \ - Tnom= 26.85 \ - Dt= 0 \ - Acbar= 1.5 \ - Flcono= 1 \ - Icbar= 0.01 \ - Vcbar= 0.04 \ - Zetavgbe= 0.7 \ - Hf0= 40 \ - Ahjei= 3 \ - Rhjei= 2 \ - Delck= 2 \ - Zetahjei= -0.5 \ - -end mysub - -V_Source:v_coll coll 0 Vdc=1.000000 -V_Source:v_base base 0 Vdc=Vsweep -V_Source:v_emit emit 0 Vdc=0 -V_Source:v_subs subs 0 Vdc=0 -I_Source:i_therm therm 0 Idc=0 -mysub:x_coll coll base emit subs therm -SDD:fn_coll 0 n_coll I[1,0]=_c1 C[1]="v_coll" -R:r_coll n_coll 0 R=1 Noise=no -OutputPlan:noiseOutput Type="Output" -SweepPlan:noisePlan Start=1000 Stop=1e+011 Dec=2 -SweepPlan:dcPlan Start=0.700000 Stop=1.100000 Step=0.1 -AC:AC1 CalcNoise=yes OutputPlan="noiseOutput" SweepVar="freq" \ -SweepPlan="noisePlan" NoiseNode="n_coll" -ParamSweep:Vsweep SimInstanceName="AC1" SweepVar="Vsweep" SweepPlan="dcPlan" diff --git a/tests/hicum2/npn/qaSpec b/tests/hicum2/npn/qaSpec index 066ad82cb..52e504f7f 100644 --- a/tests/hicum2/npn/qaSpec +++ b/tests/hicum2/npn/qaSpec @@ -1,5 +1,5 @@ // -// Example test specification for HICUM L2V2p32 +// Example test specification for HICUM Level 2 version 2.4.0 // // @@ -14,15 +14,30 @@ // `ifdef spice -// hicum not supported `endif -`ifdef ngspice -nTypeSelectionArguments npn level=8 version=2.34 -//pTypeSelectionArguments pnp level=8 version=2.34 +`ifdef hspice + nTypeSelectionArguments npn level=8 version=2.40 + pTypeSelectionArguments pnp level=8 version=2.40 +`endif +`ifdef spectre + nTypeSelectionArguments hic2_full type=1 + pTypeSelectionArguments hic2_full type=-1 `endif `ifdef ads -nTypeSelectionArguments HICUM2_22 -//nTypeSelectionArguments npn HICUM2_34 + nTypeSelectionArguments hic2_full type=1 + pTypeSelectionArguments hic2_full type=-1 +`endif +`ifdef eldo +`endif +`ifdef nexxim +`endif +`ifdef smartspice +`endif +`ifdef mica +`endif +`ifdef ngspice + nTypeSelectionArguments npn level=8 version=2.40 + pTypeSelectionArguments pnp level=8 version=2.40 `endif // @@ -30,13 +45,193 @@ nTypeSelectionArguments HICUM2_22 // keyLetter q -pins coll base emit subs therm -//verilogaFile vacode/hicumL2V2p34.va -float therm +pins coll base emit subs +//verilogaFile vacode/hicumL2V2p4p0.va +//float therm checkPolarity n +test fgum_dc_npn_1D +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.300000,1.040000,0.020000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D + +test fgum_dc_npn_1D_no_aval +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.300000,1.040000,0.020000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_no_aval + +test fgum_dc_npn_1D_breakdown +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.300000,1.040000,0.020000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_breakdown + +test fgum_dc_npn_internal +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.300000,1.040000,0.020000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_internal + +test fgum_dc_npn_full +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.300000,1.040000,0.020000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_full + +test fgum_dc_npn_full_sh +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.300000,1.040000,0.020000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_sh + +test fgum_dc_npn_full_subtran +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.300000,1.040000,0.020000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subtran + +test fgum_dc_npn_full_subcoupl +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.300000,1.040000,0.020000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl + +test fgum_dc_npn_full_subcoupl_peri_con +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.300000,1.040000,0.020000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_con + +test fgum_dc_npn_full_subcoupl_peri_bias +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.300000,1.040000,0.020000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_bias + +test fgum_dc_npn_vert_nqs +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.300000,1.040000,0.020000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_vert_nqs + +test fgum_dc_npn_lat_nqs +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.300000,1.040000,0.020000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_lat_nqs + +test fgum_dc_npn_cornoise +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.300000,1.040000,0.020000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_cornoise + +test fgum_ac_npn_1D_dc +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D + +test fgum_ac_npn_1D_ac +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +freq dec 10 1e+010 2e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_1D + +test fgum_ac_npn_1D_no_aval_dc +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_no_aval + +test fgum_ac_npn_1D_no_aval_ac +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +freq dec 10 1e+010 2e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_1D_no_aval + +test fgum_ac_npn_1D_breakdown_dc +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_breakdown + +test fgum_ac_npn_1D_breakdown_ac +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +freq dec 10 1e+010 2e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_1D_breakdown + +test fgum_ac_npn_internal_dc +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_internal + +test fgum_ac_npn_internal_ac +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +freq dec 10 1e+010 2e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_internal + +test fgum_ac_npn_full_dc +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_full + test fgum_ac_npn_full_ac -temperature 27 +temperature 27 biases V(emit)=0 V(subs)=0 biasSweep V(base)=0.750000,1.050000,0.010000 biasList V(coll)=0.500000,1.000000,1.500000 @@ -44,9 +239,1205 @@ freq dec 10 1e+010 2e+010 outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) modelParameters parameters/npn_full -// Specific tests -// +test fgum_ac_npn_full_sh_dc +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_sh +test fgum_ac_npn_full_sh_ac +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +freq dec 10 1e+010 2e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_sh + +test fgum_ac_npn_full_subtran_dc +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subtran + +test fgum_ac_npn_full_subtran_ac +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +freq dec 10 1e+010 2e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_subtran + +test fgum_ac_npn_full_subcoupl_dc +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl + +test fgum_ac_npn_full_subcoupl_ac +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +freq dec 10 1e+010 2e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_subcoupl + +test fgum_ac_npn_full_subcoupl_peri_con_dc +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_con + +test fgum_ac_npn_full_subcoupl_peri_con_ac +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +freq dec 10 1e+010 2e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_subcoupl_peri_con + +test fgum_ac_npn_full_subcoupl_peri_bias_dc +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_bias + +test fgum_ac_npn_full_subcoupl_peri_bias_ac +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +freq dec 10 1e+010 2e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_subcoupl_peri_bias + +test fgum_ac_npn_vert_nqs_dc +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_vert_nqs + +test fgum_ac_npn_vert_nqs_ac +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +freq dec 10 1e+010 2e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_vert_nqs + +test fgum_ac_npn_lat_nqs_dc +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_lat_nqs + +test fgum_ac_npn_lat_nqs_ac +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +freq dec 10 1e+010 2e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_lat_nqs + +test fgum_ac_npn_cornoise_dc +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +outputs I(coll) I(base) +modelParameters parameters/npn_cornoise + +test fgum_ac_npn_cornoise_ac +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(base)=0.750000,1.050000,0.010000 +biasList V(coll)=0.500000,1.000000,1.500000 +freq dec 10 1e+010 2e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_cornoise + +test fout_npn_1D_npn_1D +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(coll)=0.000000,6.000000,0.050000 +biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D + +test fout_npn_1D_npn_1D_no_aval +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(coll)=0.000000,6.000000,0.050000 +biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_no_aval + +test fout_npn_1D_npn_1D_breakdown +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(coll)=0.000000,6.000000,0.050000 +biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_breakdown + +test fout_npn_1D_npn_internal +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(coll)=0.000000,6.000000,0.050000 +biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 +outputs I(coll) I(base) +modelParameters parameters/npn_internal + +test fout_npn_1D_npn_full +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(coll)=0.000000,6.000000,0.050000 +biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 +outputs I(coll) I(base) +modelParameters parameters/npn_full + +test fout_npn_1D_npn_full_sh +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(coll)=0.000000,6.000000,0.050000 +biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_sh + +test fout_npn_1D_npn_full_subtran +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(coll)=0.000000,6.000000,0.050000 +biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subtran + +test fout_npn_1D_npn_full_subcoupl +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(coll)=0.000000,6.000000,0.050000 +biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl + +test fout_npn_1D_npn_full_subcoupl_peri_con +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(coll)=0.000000,6.000000,0.050000 +biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_con + +test fout_npn_1D_npn_full_subcoupl_peri_bias +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(coll)=0.000000,6.000000,0.050000 +biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_bias + +test fout_npn_1D_npn_vert_nqs +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(coll)=0.000000,6.000000,0.050000 +biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 +outputs I(coll) I(base) +modelParameters parameters/npn_vert_nqs + +test fout_npn_1D_npn_lat_nqs +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(coll)=0.000000,6.000000,0.050000 +biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 +outputs I(coll) I(base) +modelParameters parameters/npn_lat_nqs + +test fout_npn_1D_npn_cornoise +temperature 27 +biases V(emit)=0 V(subs)=0 +biasSweep V(coll)=0.000000,6.000000,0.050000 +biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 +outputs I(coll) I(base) +modelParameters parameters/npn_cornoise + +test CBE_npn_1D_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D + +test CBE_npn_1D_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_1D + +test CBE_npn_1D_no_aval_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_no_aval + +test CBE_npn_1D_no_aval_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_1D_no_aval + +test CBE_npn_1D_breakdown_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_breakdown + +test CBE_npn_1D_breakdown_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_1D_breakdown + +test CBE_npn_internal_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_internal + +test CBE_npn_internal_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_internal + +test CBE_npn_full_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full + +test CBE_npn_full_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full + +test CBE_npn_full_sh_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_sh + +test CBE_npn_full_sh_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_sh + +test CBE_npn_full_subtran_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subtran + +test CBE_npn_full_subtran_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_subtran + +test CBE_npn_full_subcoupl_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl + +test CBE_npn_full_subcoupl_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_subcoupl + +test CBE_npn_full_subcoupl_peri_con_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_con + +test CBE_npn_full_subcoupl_peri_con_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_subcoupl_peri_con + +test CBE_npn_full_subcoupl_peri_bias_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_bias + +test CBE_npn_full_subcoupl_peri_bias_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_subcoupl_peri_bias + +test CBE_npn_vert_nqs_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_vert_nqs + +test CBE_npn_vert_nqs_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_vert_nqs + +test CBE_npn_lat_nqs_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_lat_nqs + +test CBE_npn_lat_nqs_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_lat_nqs + +test CBE_npn_cornoise_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_cornoise + +test CBE_npn_cornoise_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,0.700000,0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_cornoise + +test CBC_CCS_npn_1D_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D + +test CBC_CCS_npn_1D_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_1D + +test CBC_CCS_npn_1D_no_aval_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_no_aval + +test CBC_CCS_npn_1D_no_aval_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_1D_no_aval + +test CBC_CCS_npn_1D_breakdown_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_breakdown + +test CBC_CCS_npn_1D_breakdown_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_1D_breakdown + +test CBC_CCS_npn_internal_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_internal + +test CBC_CCS_npn_internal_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_internal + +test CBC_CCS_npn_full_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full + +test CBC_CCS_npn_full_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full + +test CBC_CCS_npn_full_sh_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_sh + +test CBC_CCS_npn_full_sh_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_sh + +test CBC_CCS_npn_full_subtran_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subtran + +test CBC_CCS_npn_full_subtran_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_subtran + +test CBC_CCS_npn_full_subcoupl_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl + +test CBC_CCS_npn_full_subcoupl_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_subcoupl + +test CBC_CCS_npn_full_subcoupl_peri_con_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_con + +test CBC_CCS_npn_full_subcoupl_peri_con_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_subcoupl_peri_con + +test CBC_CCS_npn_full_subcoupl_peri_bias_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_bias + +test CBC_CCS_npn_full_subcoupl_peri_bias_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_subcoupl_peri_bias + +test CBC_CCS_npn_vert_nqs_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_vert_nqs + +test CBC_CCS_npn_vert_nqs_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_vert_nqs + +test CBC_CCS_npn_lat_nqs_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_lat_nqs + +test CBC_CCS_npn_lat_nqs_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_lat_nqs + +test CBC_CCS_npn_cornoise_dc +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_cornoise + +test CBC_CCS_npn_cornoise_ac +temperature -50 27 50 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=1.000000,-0.700000,-0.050000 +freq dec 10 1e+009 1e+010 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_cornoise + +test vce_0_npn_1D +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D + +test vce_0_npn_1D_no_aval +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_no_aval + +test vce_0_npn_1D_breakdown +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_breakdown + +test vce_0_npn_internal +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_internal + +test vce_0_npn_full +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full + +test vce_0_npn_full_sh +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_sh + +test vce_0_npn_full_subtran +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subtran + +test vce_0_npn_full_subcoupl +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl + +test vce_0_npn_full_subcoupl_peri_con +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_con + +test vce_0_npn_full_subcoupl_peri_bias +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_bias + +test vce_0_npn_vert_nqs +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_vert_nqs + +test vce_0_npn_lat_nqs +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_lat_nqs + +test vce_0_npn_cornoise +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(coll)=0.000000 +biasSweep V(base)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_cornoise + +test vbe_0_npn_1D +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D + +test vbe_0_npn_1D_no_aval +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_no_aval + +test vbe_0_npn_1D_breakdown +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_breakdown + +test vbe_0_npn_internal +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_internal + +test vbe_0_npn_full +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full + +test vbe_0_npn_full_sh +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_sh + +test vbe_0_npn_full_subtran +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subtran + +test vbe_0_npn_full_subcoupl +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl + +test vbe_0_npn_full_subcoupl_peri_con +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_con + +test vbe_0_npn_full_subcoupl_peri_bias +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_bias + +test vbe_0_npn_vert_nqs +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_vert_nqs + +test vbe_0_npn_lat_nqs +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_lat_nqs + +test vbe_0_npn_cornoise +temperature -50 0 27 50 100 150 +biases V(emit)=0 V(subs)=0 V(base)=0.000000 +biasSweep V(coll)=-1.000000,1.000000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_cornoise + +test ypara_npn_1D_dc +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D + +test ypara_npn_1D_ac +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +freq dec 5 1e+008 1e+011 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_1D + +test ypara_npn_1D_no_aval_dc +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_no_aval + +test ypara_npn_1D_no_aval_ac +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +freq dec 5 1e+008 1e+011 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_1D_no_aval + +test ypara_npn_1D_breakdown_dc +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_breakdown + +test ypara_npn_1D_breakdown_ac +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +freq dec 5 1e+008 1e+011 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_1D_breakdown + +test ypara_npn_internal_dc +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_internal + +test ypara_npn_internal_ac +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +freq dec 5 1e+008 1e+011 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_internal + +test ypara_npn_full_dc +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full + +test ypara_npn_full_ac +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +freq dec 5 1e+008 1e+011 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full + +test ypara_npn_full_sh_dc +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_sh + +test ypara_npn_full_sh_ac +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +freq dec 5 1e+008 1e+011 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_sh + +test ypara_npn_full_subtran_dc +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subtran + +test ypara_npn_full_subtran_ac +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +freq dec 5 1e+008 1e+011 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_subtran + +test ypara_npn_full_subcoupl_dc +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl + +test ypara_npn_full_subcoupl_ac +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +freq dec 5 1e+008 1e+011 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_subcoupl + +test ypara_npn_full_subcoupl_peri_con_dc +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_con + +test ypara_npn_full_subcoupl_peri_con_ac +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +freq dec 5 1e+008 1e+011 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_subcoupl_peri_con + +test ypara_npn_full_subcoupl_peri_bias_dc +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_bias + +test ypara_npn_full_subcoupl_peri_bias_ac +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +freq dec 5 1e+008 1e+011 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_full_subcoupl_peri_bias + +test ypara_npn_vert_nqs_dc +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_vert_nqs + +test ypara_npn_vert_nqs_ac +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +freq dec 5 1e+008 1e+011 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_vert_nqs + +test ypara_npn_lat_nqs_dc +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_lat_nqs + +test ypara_npn_lat_nqs_ac +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +freq dec 5 1e+008 1e+011 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_lat_nqs + +test ypara_npn_cornoise_dc +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +outputs I(coll) I(base) +modelParameters parameters/npn_cornoise + +test ypara_npn_cornoise_ac +temperature 27 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.800000,0.950000,0.050000 +freq dec 5 1e+008 1e+011 +outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) +modelParameters parameters/npn_cornoise + +test noise_npn_1D_dc +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D + +test noise_npn_1D_ac +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +freq dec 2 1000 1e+011 +outputs N(coll) +modelParameters parameters/npn_1D + +test noise_npn_1D_no_aval_dc +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_no_aval + +test noise_npn_1D_no_aval_ac +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +freq dec 2 1000 1e+011 +outputs N(coll) +modelParameters parameters/npn_1D_no_aval + +test noise_npn_1D_breakdown_dc +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +outputs I(coll) I(base) +modelParameters parameters/npn_1D_breakdown + +test noise_npn_1D_breakdown_ac +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +freq dec 2 1000 1e+011 +outputs N(coll) +modelParameters parameters/npn_1D_breakdown + +test noise_npn_internal_dc +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +outputs I(coll) I(base) +modelParameters parameters/npn_internal + +test noise_npn_internal_ac +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +freq dec 2 1000 1e+011 +outputs N(coll) +modelParameters parameters/npn_internal + +test noise_npn_full_dc +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +outputs I(coll) I(base) +modelParameters parameters/npn_full + +test noise_npn_full_ac +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +freq dec 2 1000 1e+011 +outputs N(coll) +modelParameters parameters/npn_full + +test noise_npn_full_sh_dc +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_sh + +test noise_npn_full_sh_ac +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +freq dec 2 1000 1e+011 +outputs N(coll) +modelParameters parameters/npn_full_sh + +test noise_npn_full_subtran_dc +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subtran + +test noise_npn_full_subtran_ac +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +freq dec 2 1000 1e+011 +outputs N(coll) +modelParameters parameters/npn_full_subtran + +test noise_npn_full_subcoupl_dc +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl + +test noise_npn_full_subcoupl_ac +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +freq dec 2 1000 1e+011 +outputs N(coll) +modelParameters parameters/npn_full_subcoupl + +test noise_npn_full_subcoupl_peri_con_dc +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_con + +test noise_npn_full_subcoupl_peri_con_ac +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +freq dec 2 1000 1e+011 +outputs N(coll) +modelParameters parameters/npn_full_subcoupl_peri_con + +test noise_npn_full_subcoupl_peri_bias_dc +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +outputs I(coll) I(base) +modelParameters parameters/npn_full_subcoupl_peri_bias + +test noise_npn_full_subcoupl_peri_bias_ac +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +freq dec 2 1000 1e+011 +outputs N(coll) +modelParameters parameters/npn_full_subcoupl_peri_bias + +test noise_npn_vert_nqs_dc +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +outputs I(coll) I(base) +modelParameters parameters/npn_vert_nqs + +test noise_npn_vert_nqs_ac +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +freq dec 2 1000 1e+011 +outputs N(coll) +modelParameters parameters/npn_vert_nqs + +test noise_npn_lat_nqs_dc +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +outputs I(coll) I(base) +modelParameters parameters/npn_lat_nqs + +test noise_npn_lat_nqs_ac +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +freq dec 2 1000 1e+011 +outputs N(coll) +modelParameters parameters/npn_lat_nqs + +test noise_npn_cornoise_dc +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +outputs I(coll) I(base) +modelParameters parameters/npn_cornoise + +test noise_npn_cornoise_ac +temperature 16.85 +biases V(emit)=0 V(subs)=0 V(coll)=1.000000 +biasSweep V(base)=0.700000,1.100000,0.100000 +freq dec 2 1000 1e+011 +outputs N(coll) +modelParameters parameters/npn_cornoise -`ifdef NOT_USED -`endif diff --git a/tests/hicum2/npn/qaSpec_real b/tests/hicum2/npn/qaSpec_real deleted file mode 100644 index 52e504f7f..000000000 --- a/tests/hicum2/npn/qaSpec_real +++ /dev/null @@ -1,1443 +0,0 @@ -// -// Example test specification for HICUM Level 2 version 2.4.0 -// - -// -// Simulator specific information -// These arguments are added to the model card -// specification to invoke the desired model in -// different simulators (which can have different -// names or levels for the same model) and to switch -// between nType and pType polarities. -// It is assumed that there are no polarity specific -// parameters. -// - -`ifdef spice -`endif -`ifdef hspice - nTypeSelectionArguments npn level=8 version=2.40 - pTypeSelectionArguments pnp level=8 version=2.40 -`endif -`ifdef spectre - nTypeSelectionArguments hic2_full type=1 - pTypeSelectionArguments hic2_full type=-1 -`endif -`ifdef ads - nTypeSelectionArguments hic2_full type=1 - pTypeSelectionArguments hic2_full type=-1 -`endif -`ifdef eldo -`endif -`ifdef nexxim -`endif -`ifdef smartspice -`endif -`ifdef mica -`endif -`ifdef ngspice - nTypeSelectionArguments npn level=8 version=2.40 - pTypeSelectionArguments pnp level=8 version=2.40 -`endif - -// -// General test-independent information -// - -keyLetter q -pins coll base emit subs -//verilogaFile vacode/hicumL2V2p4p0.va -//float therm -checkPolarity n - -test fgum_dc_npn_1D -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.300000,1.040000,0.020000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D - -test fgum_dc_npn_1D_no_aval -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.300000,1.040000,0.020000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_no_aval - -test fgum_dc_npn_1D_breakdown -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.300000,1.040000,0.020000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_breakdown - -test fgum_dc_npn_internal -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.300000,1.040000,0.020000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_internal - -test fgum_dc_npn_full -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.300000,1.040000,0.020000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_full - -test fgum_dc_npn_full_sh -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.300000,1.040000,0.020000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_sh - -test fgum_dc_npn_full_subtran -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.300000,1.040000,0.020000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subtran - -test fgum_dc_npn_full_subcoupl -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.300000,1.040000,0.020000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl - -test fgum_dc_npn_full_subcoupl_peri_con -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.300000,1.040000,0.020000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_con - -test fgum_dc_npn_full_subcoupl_peri_bias -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.300000,1.040000,0.020000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_bias - -test fgum_dc_npn_vert_nqs -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.300000,1.040000,0.020000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_vert_nqs - -test fgum_dc_npn_lat_nqs -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.300000,1.040000,0.020000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_lat_nqs - -test fgum_dc_npn_cornoise -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.300000,1.040000,0.020000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_cornoise - -test fgum_ac_npn_1D_dc -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D - -test fgum_ac_npn_1D_ac -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -freq dec 10 1e+010 2e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_1D - -test fgum_ac_npn_1D_no_aval_dc -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_no_aval - -test fgum_ac_npn_1D_no_aval_ac -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -freq dec 10 1e+010 2e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_1D_no_aval - -test fgum_ac_npn_1D_breakdown_dc -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_breakdown - -test fgum_ac_npn_1D_breakdown_ac -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -freq dec 10 1e+010 2e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_1D_breakdown - -test fgum_ac_npn_internal_dc -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_internal - -test fgum_ac_npn_internal_ac -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -freq dec 10 1e+010 2e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_internal - -test fgum_ac_npn_full_dc -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_full - -test fgum_ac_npn_full_ac -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -freq dec 10 1e+010 2e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full - -test fgum_ac_npn_full_sh_dc -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_sh - -test fgum_ac_npn_full_sh_ac -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -freq dec 10 1e+010 2e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_sh - -test fgum_ac_npn_full_subtran_dc -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subtran - -test fgum_ac_npn_full_subtran_ac -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -freq dec 10 1e+010 2e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_subtran - -test fgum_ac_npn_full_subcoupl_dc -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl - -test fgum_ac_npn_full_subcoupl_ac -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -freq dec 10 1e+010 2e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_subcoupl - -test fgum_ac_npn_full_subcoupl_peri_con_dc -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_con - -test fgum_ac_npn_full_subcoupl_peri_con_ac -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -freq dec 10 1e+010 2e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_subcoupl_peri_con - -test fgum_ac_npn_full_subcoupl_peri_bias_dc -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_bias - -test fgum_ac_npn_full_subcoupl_peri_bias_ac -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -freq dec 10 1e+010 2e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_subcoupl_peri_bias - -test fgum_ac_npn_vert_nqs_dc -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_vert_nqs - -test fgum_ac_npn_vert_nqs_ac -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -freq dec 10 1e+010 2e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_vert_nqs - -test fgum_ac_npn_lat_nqs_dc -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_lat_nqs - -test fgum_ac_npn_lat_nqs_ac -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -freq dec 10 1e+010 2e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_lat_nqs - -test fgum_ac_npn_cornoise_dc -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -outputs I(coll) I(base) -modelParameters parameters/npn_cornoise - -test fgum_ac_npn_cornoise_ac -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(base)=0.750000,1.050000,0.010000 -biasList V(coll)=0.500000,1.000000,1.500000 -freq dec 10 1e+010 2e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_cornoise - -test fout_npn_1D_npn_1D -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(coll)=0.000000,6.000000,0.050000 -biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D - -test fout_npn_1D_npn_1D_no_aval -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(coll)=0.000000,6.000000,0.050000 -biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_no_aval - -test fout_npn_1D_npn_1D_breakdown -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(coll)=0.000000,6.000000,0.050000 -biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_breakdown - -test fout_npn_1D_npn_internal -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(coll)=0.000000,6.000000,0.050000 -biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 -outputs I(coll) I(base) -modelParameters parameters/npn_internal - -test fout_npn_1D_npn_full -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(coll)=0.000000,6.000000,0.050000 -biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 -outputs I(coll) I(base) -modelParameters parameters/npn_full - -test fout_npn_1D_npn_full_sh -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(coll)=0.000000,6.000000,0.050000 -biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_sh - -test fout_npn_1D_npn_full_subtran -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(coll)=0.000000,6.000000,0.050000 -biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subtran - -test fout_npn_1D_npn_full_subcoupl -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(coll)=0.000000,6.000000,0.050000 -biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl - -test fout_npn_1D_npn_full_subcoupl_peri_con -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(coll)=0.000000,6.000000,0.050000 -biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_con - -test fout_npn_1D_npn_full_subcoupl_peri_bias -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(coll)=0.000000,6.000000,0.050000 -biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_bias - -test fout_npn_1D_npn_vert_nqs -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(coll)=0.000000,6.000000,0.050000 -biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 -outputs I(coll) I(base) -modelParameters parameters/npn_vert_nqs - -test fout_npn_1D_npn_lat_nqs -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(coll)=0.000000,6.000000,0.050000 -biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 -outputs I(coll) I(base) -modelParameters parameters/npn_lat_nqs - -test fout_npn_1D_npn_cornoise -temperature 27 -biases V(emit)=0 V(subs)=0 -biasSweep V(coll)=0.000000,6.000000,0.050000 -biasList V(base)=0.600000,0.650000,0.700000,0.750000,0.800000,0.850000,0.900000 -outputs I(coll) I(base) -modelParameters parameters/npn_cornoise - -test CBE_npn_1D_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D - -test CBE_npn_1D_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_1D - -test CBE_npn_1D_no_aval_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_no_aval - -test CBE_npn_1D_no_aval_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_1D_no_aval - -test CBE_npn_1D_breakdown_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_breakdown - -test CBE_npn_1D_breakdown_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_1D_breakdown - -test CBE_npn_internal_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_internal - -test CBE_npn_internal_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_internal - -test CBE_npn_full_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full - -test CBE_npn_full_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full - -test CBE_npn_full_sh_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_sh - -test CBE_npn_full_sh_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_sh - -test CBE_npn_full_subtran_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subtran - -test CBE_npn_full_subtran_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_subtran - -test CBE_npn_full_subcoupl_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl - -test CBE_npn_full_subcoupl_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_subcoupl - -test CBE_npn_full_subcoupl_peri_con_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_con - -test CBE_npn_full_subcoupl_peri_con_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_subcoupl_peri_con - -test CBE_npn_full_subcoupl_peri_bias_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_bias - -test CBE_npn_full_subcoupl_peri_bias_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_subcoupl_peri_bias - -test CBE_npn_vert_nqs_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_vert_nqs - -test CBE_npn_vert_nqs_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_vert_nqs - -test CBE_npn_lat_nqs_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_lat_nqs - -test CBE_npn_lat_nqs_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_lat_nqs - -test CBE_npn_cornoise_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_cornoise - -test CBE_npn_cornoise_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,0.700000,0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_cornoise - -test CBC_CCS_npn_1D_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D - -test CBC_CCS_npn_1D_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_1D - -test CBC_CCS_npn_1D_no_aval_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_no_aval - -test CBC_CCS_npn_1D_no_aval_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_1D_no_aval - -test CBC_CCS_npn_1D_breakdown_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_breakdown - -test CBC_CCS_npn_1D_breakdown_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_1D_breakdown - -test CBC_CCS_npn_internal_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_internal - -test CBC_CCS_npn_internal_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_internal - -test CBC_CCS_npn_full_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full - -test CBC_CCS_npn_full_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full - -test CBC_CCS_npn_full_sh_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_sh - -test CBC_CCS_npn_full_sh_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_sh - -test CBC_CCS_npn_full_subtran_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subtran - -test CBC_CCS_npn_full_subtran_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_subtran - -test CBC_CCS_npn_full_subcoupl_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl - -test CBC_CCS_npn_full_subcoupl_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_subcoupl - -test CBC_CCS_npn_full_subcoupl_peri_con_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_con - -test CBC_CCS_npn_full_subcoupl_peri_con_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_subcoupl_peri_con - -test CBC_CCS_npn_full_subcoupl_peri_bias_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_bias - -test CBC_CCS_npn_full_subcoupl_peri_bias_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_subcoupl_peri_bias - -test CBC_CCS_npn_vert_nqs_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_vert_nqs - -test CBC_CCS_npn_vert_nqs_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_vert_nqs - -test CBC_CCS_npn_lat_nqs_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_lat_nqs - -test CBC_CCS_npn_lat_nqs_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_lat_nqs - -test CBC_CCS_npn_cornoise_dc -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_cornoise - -test CBC_CCS_npn_cornoise_ac -temperature -50 27 50 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=1.000000,-0.700000,-0.050000 -freq dec 10 1e+009 1e+010 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_cornoise - -test vce_0_npn_1D -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D - -test vce_0_npn_1D_no_aval -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_no_aval - -test vce_0_npn_1D_breakdown -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_breakdown - -test vce_0_npn_internal -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_internal - -test vce_0_npn_full -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full - -test vce_0_npn_full_sh -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_sh - -test vce_0_npn_full_subtran -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subtran - -test vce_0_npn_full_subcoupl -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl - -test vce_0_npn_full_subcoupl_peri_con -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_con - -test vce_0_npn_full_subcoupl_peri_bias -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_bias - -test vce_0_npn_vert_nqs -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_vert_nqs - -test vce_0_npn_lat_nqs -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_lat_nqs - -test vce_0_npn_cornoise -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(coll)=0.000000 -biasSweep V(base)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_cornoise - -test vbe_0_npn_1D -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D - -test vbe_0_npn_1D_no_aval -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_no_aval - -test vbe_0_npn_1D_breakdown -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_breakdown - -test vbe_0_npn_internal -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_internal - -test vbe_0_npn_full -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full - -test vbe_0_npn_full_sh -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_sh - -test vbe_0_npn_full_subtran -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subtran - -test vbe_0_npn_full_subcoupl -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl - -test vbe_0_npn_full_subcoupl_peri_con -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_con - -test vbe_0_npn_full_subcoupl_peri_bias -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_bias - -test vbe_0_npn_vert_nqs -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_vert_nqs - -test vbe_0_npn_lat_nqs -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_lat_nqs - -test vbe_0_npn_cornoise -temperature -50 0 27 50 100 150 -biases V(emit)=0 V(subs)=0 V(base)=0.000000 -biasSweep V(coll)=-1.000000,1.000000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_cornoise - -test ypara_npn_1D_dc -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D - -test ypara_npn_1D_ac -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -freq dec 5 1e+008 1e+011 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_1D - -test ypara_npn_1D_no_aval_dc -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_no_aval - -test ypara_npn_1D_no_aval_ac -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -freq dec 5 1e+008 1e+011 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_1D_no_aval - -test ypara_npn_1D_breakdown_dc -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_breakdown - -test ypara_npn_1D_breakdown_ac -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -freq dec 5 1e+008 1e+011 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_1D_breakdown - -test ypara_npn_internal_dc -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_internal - -test ypara_npn_internal_ac -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -freq dec 5 1e+008 1e+011 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_internal - -test ypara_npn_full_dc -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full - -test ypara_npn_full_ac -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -freq dec 5 1e+008 1e+011 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full - -test ypara_npn_full_sh_dc -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_sh - -test ypara_npn_full_sh_ac -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -freq dec 5 1e+008 1e+011 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_sh - -test ypara_npn_full_subtran_dc -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subtran - -test ypara_npn_full_subtran_ac -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -freq dec 5 1e+008 1e+011 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_subtran - -test ypara_npn_full_subcoupl_dc -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl - -test ypara_npn_full_subcoupl_ac -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -freq dec 5 1e+008 1e+011 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_subcoupl - -test ypara_npn_full_subcoupl_peri_con_dc -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_con - -test ypara_npn_full_subcoupl_peri_con_ac -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -freq dec 5 1e+008 1e+011 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_subcoupl_peri_con - -test ypara_npn_full_subcoupl_peri_bias_dc -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_bias - -test ypara_npn_full_subcoupl_peri_bias_ac -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -freq dec 5 1e+008 1e+011 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_full_subcoupl_peri_bias - -test ypara_npn_vert_nqs_dc -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_vert_nqs - -test ypara_npn_vert_nqs_ac -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -freq dec 5 1e+008 1e+011 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_vert_nqs - -test ypara_npn_lat_nqs_dc -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_lat_nqs - -test ypara_npn_lat_nqs_ac -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -freq dec 5 1e+008 1e+011 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_lat_nqs - -test ypara_npn_cornoise_dc -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -outputs I(coll) I(base) -modelParameters parameters/npn_cornoise - -test ypara_npn_cornoise_ac -temperature 27 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.800000,0.950000,0.050000 -freq dec 5 1e+008 1e+011 -outputs G(base,base) G(base,coll) G(coll,base) G(coll,coll) C(base,base) C(base,coll) C(coll,base) C(coll,coll) -modelParameters parameters/npn_cornoise - -test noise_npn_1D_dc -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D - -test noise_npn_1D_ac -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -freq dec 2 1000 1e+011 -outputs N(coll) -modelParameters parameters/npn_1D - -test noise_npn_1D_no_aval_dc -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_no_aval - -test noise_npn_1D_no_aval_ac -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -freq dec 2 1000 1e+011 -outputs N(coll) -modelParameters parameters/npn_1D_no_aval - -test noise_npn_1D_breakdown_dc -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -outputs I(coll) I(base) -modelParameters parameters/npn_1D_breakdown - -test noise_npn_1D_breakdown_ac -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -freq dec 2 1000 1e+011 -outputs N(coll) -modelParameters parameters/npn_1D_breakdown - -test noise_npn_internal_dc -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -outputs I(coll) I(base) -modelParameters parameters/npn_internal - -test noise_npn_internal_ac -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -freq dec 2 1000 1e+011 -outputs N(coll) -modelParameters parameters/npn_internal - -test noise_npn_full_dc -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -outputs I(coll) I(base) -modelParameters parameters/npn_full - -test noise_npn_full_ac -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -freq dec 2 1000 1e+011 -outputs N(coll) -modelParameters parameters/npn_full - -test noise_npn_full_sh_dc -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_sh - -test noise_npn_full_sh_ac -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -freq dec 2 1000 1e+011 -outputs N(coll) -modelParameters parameters/npn_full_sh - -test noise_npn_full_subtran_dc -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subtran - -test noise_npn_full_subtran_ac -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -freq dec 2 1000 1e+011 -outputs N(coll) -modelParameters parameters/npn_full_subtran - -test noise_npn_full_subcoupl_dc -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl - -test noise_npn_full_subcoupl_ac -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -freq dec 2 1000 1e+011 -outputs N(coll) -modelParameters parameters/npn_full_subcoupl - -test noise_npn_full_subcoupl_peri_con_dc -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_con - -test noise_npn_full_subcoupl_peri_con_ac -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -freq dec 2 1000 1e+011 -outputs N(coll) -modelParameters parameters/npn_full_subcoupl_peri_con - -test noise_npn_full_subcoupl_peri_bias_dc -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -outputs I(coll) I(base) -modelParameters parameters/npn_full_subcoupl_peri_bias - -test noise_npn_full_subcoupl_peri_bias_ac -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -freq dec 2 1000 1e+011 -outputs N(coll) -modelParameters parameters/npn_full_subcoupl_peri_bias - -test noise_npn_vert_nqs_dc -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -outputs I(coll) I(base) -modelParameters parameters/npn_vert_nqs - -test noise_npn_vert_nqs_ac -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -freq dec 2 1000 1e+011 -outputs N(coll) -modelParameters parameters/npn_vert_nqs - -test noise_npn_lat_nqs_dc -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -outputs I(coll) I(base) -modelParameters parameters/npn_lat_nqs - -test noise_npn_lat_nqs_ac -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -freq dec 2 1000 1e+011 -outputs N(coll) -modelParameters parameters/npn_lat_nqs - -test noise_npn_cornoise_dc -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -outputs I(coll) I(base) -modelParameters parameters/npn_cornoise - -test noise_npn_cornoise_ac -temperature 16.85 -biases V(emit)=0 V(subs)=0 V(coll)=1.000000 -biasSweep V(base)=0.700000,1.100000,0.100000 -freq dec 2 1000 1e+011 -outputs N(coll) -modelParameters parameters/npn_cornoise - From a26b3ee2b20c668df6d41938a06472440803855f Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Thu, 23 Jul 2020 15:56:17 +0200 Subject: [PATCH 07/39] start bugfix --- src/spicelib/devices/hicum2/hicumL2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 53b77d757..a46337bd8 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -2504,7 +2504,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) if(!selfheat) { Ith = 0; } else if (model->HICUMrth_de==1) { - Ith = -Vrth/here->HICUMrth_t.rpart+pterm; //Current from gnd to T + Ith = -dT/here->HICUMrth_t.rpart+pterm; //Current from gnd to T } else { Ith = -Vrth/here->HICUMrth_t.rpart+pterm; //Current from gnd to T From 03c3efd7628e031f41cc2e3e0f6699d60189e635 Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Thu, 23 Jul 2020 16:22:46 +0200 Subject: [PATCH 08/39] finally: avalanche at very high T fix --- src/spicelib/devices/hicum2/hicum2defs.h | 1 + src/spicelib/devices/hicum2/hicumL2.cpp | 81 +++++++++++---------- src/spicelib/devices/hicum2/hicumL2.hpp | 2 +- src/spicelib/devices/hicum2/hicumL2temp.cpp | 17 +++-- 4 files changed, 53 insertions(+), 48 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2defs.h b/src/spicelib/devices/hicum2/hicum2defs.h index 8cb76bee0..79ac04be2 100644 --- a/src/spicelib/devices/hicum2/hicum2defs.h +++ b/src/spicelib/devices/hicum2/hicum2defs.h @@ -75,6 +75,7 @@ typedef struct sHICUMinstance { double HICUMicVCS; /* initial condition inner C-S branch */ double HICUMtemp; /* instance temperature */ + double HICUMtemp_Vrth;/* derivative device temperature to temperature at thermal node */ double HICUMdtemp; /* instance delta temperature */ double HICUMdtemp_sh; /* instance delta temperature because of self-heating */ double HICUMm; /* multiply factor for the hicum */ diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index bfdd866b5..1aeea068a 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -484,6 +484,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Q_0_Vbiei, Q_0_Vbici, Q_0_dT; double Temp; + double Tdev_Vrth; //derivative device temperature to Vrth double Cjei_Vbiei,Cjci_Vbici,Cjep_Vbpei,Cjep_dT,Cjs_Vsici; double Cjei_dT, Cjci_dT; @@ -1877,7 +1878,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) if (selfheat) { // Thermal_update_with_self_heating Temp = here->HICUMtemp+Vrth; - _iret = hicum_thermal_update(model, here, Temp); + _iret = hicum_thermal_update(model, here, &Temp, &Tdev_Vrth); here->HICUMdtemp_sh = Temp - here->HICUMtemp; } else { @@ -2502,7 +2503,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) if(!selfheat) { Ith = 0; } else if (model->HICUMrth_de==1) { - Ith = -dT/here->HICUMrth_t.rpart+pterm; //Current from gnd to T + Ith = -Vrth/here->HICUMrth_t.rpart+pterm; //Current from gnd to T } else { Ith = -Vrth/here->HICUMrth_t.rpart+pterm; //Current from gnd to T @@ -3324,125 +3325,125 @@ load: // ############################################################# // Stamp element: Ibiei f_Bi = + f_Ei = - - rhs_current = -Ibiei_Vrth*Vrth; + rhs_current = -Ibiei_Vrth*Tdev_Vrth*Vrth; *(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; // with respect to Potential Vrth - *(here->HICUMbaseBItempPtr) += Ibiei_Vrth; - *(here->HICUMemitEItempPtr) += -Ibiei_Vrth; + *(here->HICUMbaseBItempPtr) += Ibiei_Vrth*Tdev_Vrth; + *(here->HICUMemitEItempPtr) += -Ibiei_Vrth*Tdev_Vrth; // finish // Stamp element: Ibpei f_Bp = + f_Ei = - - rhs_current = -Ibpei_Vrth*Vrth; + rhs_current = -Ibpei_Vrth*Tdev_Vrth*Vrth; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; // 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; // finish // Stamp element: Ibici f_Bi = + f_Ci = - - rhs_current = -Ibici_Vrth*Vrth; + rhs_current = -Ibici_Vrth*Vrth*Tdev_Vrth; *(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; // with respect to Potential Vrth - *(here->HICUMbaseBItempPtr) += Ibici_Vrth; - *(here->HICUMcollCItempPtr) += -Ibici_Vrth; + *(here->HICUMbaseBItempPtr) += Ibici_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr) += -Ibici_Vrth*Tdev_Vrth; // finish // Stamp element: Iciei f_Ci = + f_Ei = - - rhs_current = -Iciei_Vrth*Vrth; + rhs_current = -Iciei_Vrth*Vrth*Tdev_Vrth; *(ckt->CKTrhs + here->HICUMcollCINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; // with respect to Potential Vrth - *(here->HICUMcollCItempPtr) += Iciei_Vrth; - *(here->HICUMemitEItempPtr) += -Iciei_Vrth; + *(here->HICUMcollCItempPtr) += Iciei_Vrth*Tdev_Vrth; + *(here->HICUMemitEItempPtr) += -Iciei_Vrth*Tdev_Vrth; // finish // Stamp element: Ibpci f_Bp = + f_Ci = - - rhs_current = -Ibpci_Vrth*Vrth; + rhs_current = -Ibpci_Vrth*Vrth*Tdev_Vrth; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; // with respect to Potential Vrth - *(here->HICUMbaseBPtempPtr) += Ibpci_Vrth; - *(here->HICUMcollCItempPtr) += -Ibpci_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpci_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr) += -Ibpci_Vrth*Tdev_Vrth; // finish // Stamp element: Rcx f_Ci = + f_C = - - rhs_current = -Icic_Vrth*Vrth; + rhs_current = -Icic_Vrth*Vrth*Tdev_Vrth; *(ckt->CKTrhs + here->HICUMcollCINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMcollNode) += rhs_current; // with respect to Potential Vrth - *(here->HICUMcollCItempPtr) += Icic_Vrth; - *(here->HICUMcollTempPtr) += -Icic_Vrth; + *(here->HICUMcollCItempPtr) += Icic_Vrth*Tdev_Vrth; + *(here->HICUMcollTempPtr) += -Icic_Vrth*Tdev_Vrth; // finish // Stamp element: Rbx f_B = + f_Bp = - - rhs_current = -Ibbp_Vrth*Vrth; + rhs_current = -Ibbp_Vrth*Vrth*Tdev_Vrth; *(ckt->CKTrhs + here->HICUMbaseNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseBPNode) += rhs_current; // with respect to Potential Vrth - *(here->HICUMbaseTempPtr) += Ibbp_Vrth; - *(here->HICUMbaseBPtempPtr) += -Ibbp_Vrth; + *(here->HICUMbaseTempPtr) += Ibbp_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr) += -Ibbp_Vrth*Tdev_Vrth; // finish // Stamp element: Re f_Ei = + f_E = - - rhs_current = - Ieie_Vrth*Vrth; + rhs_current = - Ieie_Vrth*Vrth*Tdev_Vrth; *(ckt->CKTrhs + here->HICUMemitEINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMemitNode) += +rhs_current; // with respect to Potential Vrth - *(here->HICUMemitEItempPtr) += +Ieie_Vrth; - *(here->HICUMemitTempPtr) += -Ieie_Vrth; + *(here->HICUMemitEItempPtr) += +Ieie_Vrth*Tdev_Vrth; + *(here->HICUMemitTempPtr) += -Ieie_Vrth*Tdev_Vrth; // finish // Stamp element: Rbi f_Bp = + f_Bi = - - rhs_current = -Ibpbi_Vrth*Vrth; + rhs_current = -Ibpbi_Vrth*Vrth*Tdev_Vrth; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseBINode) += rhs_current; // with respect to Potential Vrth - *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth; - *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth*Tdev_Vrth; + *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth*Tdev_Vrth; // finish // Stamp element: Isici f_Si = + f_Ci = - - rhs_current = -Isici_Vrth*Vrth; + rhs_current = -Isici_Vrth*Vrth*Tdev_Vrth; *(ckt->CKTrhs + here->HICUMsubsSINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; // with respect to Potential Vrth - *(here->HICUMsubsSItempPtr) += Isici_Vrth; - *(here->HICUMcollCItempPtr) += -Isici_Vrth; + *(here->HICUMsubsSItempPtr) += Isici_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr) += -Isici_Vrth*Tdev_Vrth; // finish // Branch: bpsi, Stamp element: Its - rhs_current = - Ibpsi_Vrth*Vrth; + rhs_current = - Ibpsi_Vrth*Vrth*Tdev_Vrth; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMsubsSINode) += rhs_current; // f_Bp = + f_Si = - // with respect to Vrth - *(here->HICUMbaseBPtempPtr) += Ibpsi_Vrth; - *(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpsi_Vrth*Tdev_Vrth; + *(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth*Tdev_Vrth; // finish if (nqs) { // Stamp element: Ixf f_xf = + - rhs_current = -Ixf_dT*Vrth; + rhs_current = -Ixf_dT*Vrth*Tdev_Vrth; *(ckt->CKTrhs + here->HICUMxfNode) += -rhs_current; // with respect to Potential Vxf - *(here->HICUMxfTempPtr) += Ixf_dT; + *(here->HICUMxfTempPtr) += Ixf_dT*Tdev_Vrth; // finish // Stamp element: Ixf1 f_xf1 = + rhs_current = -Ixf1_dT*Vrth; *(ckt->CKTrhs + here->HICUMxf1Node) += -rhs_current; // with respect to Potential Vxf1 - *(here->HICUMxf1TempPtr) += Ixf1_dT; + *(here->HICUMxf1TempPtr) += Ixf1_dT*Tdev_Vrth; // finish // Stamp element: Ixf2 f_xf2 = + - rhs_current = -Ixf2_dT*Vrth; + rhs_current = -Ixf2_dT*Vrth*Tdev_Vrth; *(ckt->CKTrhs + here->HICUMxf2Node) += -rhs_current; // with respect to Potential Vxf2 - *(here->HICUMxf2TempPtr) += Ixf2_dT; + *(here->HICUMxf2TempPtr) += Ixf2_dT*Tdev_Vrth; // finish } diff --git a/src/spicelib/devices/hicum2/hicumL2.hpp b/src/spicelib/devices/hicum2/hicumL2.hpp index 7b40c68c8..5f4ddb901 100644 --- a/src/spicelib/devices/hicum2/hicumL2.hpp +++ b/src/spicelib/devices/hicum2/hicumL2.hpp @@ -8,7 +8,7 @@ extern "C" { void hicum_diode(double T, double IS, double UM1, double U, double *Iz, double *Gz, double *Tz); void hicum_qjmodf(double T, double c_0, double u_d, double z, double a_j, double U_cap, double *C, double *C_dU, double *C_dvt, double *Qz, double *Qz_dU, double *Qz_dvt); static double HICUMlimitlog( double deltemp, double deltemp_old, double LIM_TOL, int *check); - int hicum_thermal_update(HICUMmodel *, HICUMinstance *, double Temp); + int hicum_thermal_update(HICUMmodel *, HICUMinstance *, double * Temp, double * Tdev_Vrth); int HICUMload(GENmodel *inModel, CKTcircuit *ckt); int HICUMtemp(GENmodel *inModel, CKTcircuit *ckt); #ifdef __cplusplus diff --git a/src/spicelib/devices/hicum2/hicumL2temp.cpp b/src/spicelib/devices/hicum2/hicumL2temp.cpp index e6495c5a8..a22950a6d 100644 --- a/src/spicelib/devices/hicum2/hicumL2temp.cpp +++ b/src/spicelib/devices/hicum2/hicumL2temp.cpp @@ -120,14 +120,14 @@ HICUMtemp(GENmodel *inModel, CKTcircuit *ckt) if(here->HICUMdtempGiven) here->HICUMtemp = here->HICUMtemp + here->HICUMdtemp; - iret = hicum_thermal_update(model, here, here -> HICUMtemp); + iret = hicum_thermal_update(model, here, &here -> HICUMtemp, &here->HICUMtemp_Vrth); } } return(OK); } -int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double HICUMTemp) +int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double * HICUMTemp, double * Tdev_Vrth) { HICUMmodel *model = (HICUMmodel *)inModel; HICUMinstance *here = (HICUMinstance *)inInstance; @@ -158,14 +158,17 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double zetasct = mg-1.5; // Limit temperature to avoid FPEs in equations - if(HICUMTemp < TMIN + CONSTCtoK) { - HICUMTemp = TMIN + CONSTCtoK; + *(Tdev_Vrth) = 1; + if(*(HICUMTemp) < TMIN + CONSTCtoK) { + *(HICUMTemp) = TMIN + CONSTCtoK; + *(Tdev_Vrth) = 0; } else { - if (HICUMTemp > TMAX + CONSTCtoK) { - HICUMTemp = TMAX + CONSTCtoK; + if (*(HICUMTemp) > TMAX + CONSTCtoK) { + *(HICUMTemp) = TMAX + CONSTCtoK; + *(Tdev_Vrth) = 0; } } - temp = HICUMTemp+1_e; // dual number valued temperature + temp = *(HICUMTemp)+1_e* *(Tdev_Vrth); // dual number device temperature vt = temp*CONSTKoverQ; // dual valued temperature voltage here->HICUMvt0 = Tnom * CONSTKoverQ; From 154036c09ff5176d3661f92665885c48a6c05c4e Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Thu, 23 Jul 2020 16:50:31 +0200 Subject: [PATCH 09/39] 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%) - From 019ef4e07edfef15b7548fef31464c9648baa1ac Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Fri, 24 Jul 2020 10:50:05 +0200 Subject: [PATCH 10/39] moving derivatives from _Tdev to _Vrth in a clean way (start) --- src/spicelib/devices/hicum2/hicumL2.cpp | 31 +++++++++++++------------ 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index a23bea724..892d1760f 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -273,23 +273,24 @@ duals::duald calc_hjei_vbe(duals::duald Vbiei, duals::duald T, HICUMinstance * h } -void hicum_diode(double T, dual_double IS, double UM1, double U, double *Iz, double *Gz, double *Tz) +void hicum_diode(duals::duald T, dual_double IS, double UM1, double U, double *Iz, double *Gz, double *Tz) { + // T is T_dev + 1_e*T_dev_Vrth //wrapper for hicum diode equation that also generates derivatives duals::duald result = 0; // printf("executed diode"); duals::duald is_t = IS.rpart; - result = HICDIO(T, is_t, UM1, U+1_e); + result = HICDIO(T.rpart(), is_t, UM1, U+1_e); *Iz = result.rpart(); *Gz = result.dpart(); //derivative for U is_t = IS.rpart + 1_e*IS.dpart; - result = HICDIO(T+1_e, is_t, UM1, U); + result = HICDIO(T, is_t, UM1, U); *Tz = result.dpart(); //derivative for T } -void hicum_qjmodf(double T, dual_double c_0, dual_double u_d, double z, dual_double a_j, double U_cap, double *C, double *C_dU, double *C_dT, double *Qz, double *Qz_dU, double *Qz_dT) +void hicum_qjmodf(duals::duald T, dual_double c_0, dual_double u_d, double z, dual_double a_j, double U_cap, double *C, double *C_dU, double *C_dT, double *Qz, double *Qz_dU, double *Qz_dT) { //wrapper for QJMODF that also generates derivatives duals::duald Cresult = 0; @@ -297,7 +298,7 @@ void hicum_qjmodf(double T, dual_double c_0, dual_double u_d, double z, dual_dou duals::duald c_0_t = c_0.rpart; duals::duald u_d_t = u_d.rpart; duals::duald a_j_t = a_j.rpart; - QJMODF(T, c_0_t, u_d_t, z, a_j_t, U_cap+1_e, &Cresult, &Qresult); + QJMODF(T.rpart(), c_0_t, u_d_t, z, a_j_t, U_cap+1_e, &Cresult, &Qresult); *C = Cresult.rpart(); *C_dU = Cresult.dpart(); *Qz = Qresult.rpart(); @@ -306,7 +307,7 @@ void hicum_qjmodf(double T, dual_double c_0, dual_double u_d, double z, dual_dou c_0_t.dpart(c_0.dpart); u_d_t.dpart(u_d.dpart); a_j_t.dpart(a_j.dpart); - QJMODF(T+1_e, c_0_t, u_d_t, z, a_j_t, U_cap, &Cresult, &Qresult); + QJMODF(T, c_0_t, u_d_t, z, a_j_t, U_cap, &Cresult, &Qresult); *Qz_dT = Qresult.dpart(); *C_dT = Cresult.dpart(); } @@ -1838,12 +1839,12 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) //Intrinsic transistor //Internal base currents across b-e junction - hicum_diode(Temp,here->HICUMibeis_t,model->HICUMmbei, Vbiei, &ibei, &ibei_Vbiei, &ibei_dT); - hicum_diode(Temp,here->HICUMireis_t,model->HICUMmrei, Vbiei, &irei, &irei_Vbiei, &irei_dT); + hicum_diode(Temp+1_e*Tdev_Vrth,here->HICUMibeis_t,model->HICUMmbei, Vbiei, &ibei, &ibei_Vbiei, &ibei_dT); + hicum_diode(Temp+1_e*Tdev_Vrth,here->HICUMireis_t,model->HICUMmrei, Vbiei, &irei, &irei_Vbiei, &irei_dT); //Internal b-e and b-c junction capacitances and charges //Cjei = ddx(Qjei,V(bi)); - hicum_qjmodf(Temp,here->HICUMcjei0_t,here->HICUMvdei_t,model->HICUMzei,here->HICUMajei_t,Vbiei,&Cjei,&Cjei_Vbiei, &Cjei_dT,&Qjei, &Qjei_Vbiei, &Qjei_dT); + hicum_qjmodf(Temp+1_e*Tdev_Vrth,here->HICUMcjei0_t,here->HICUMvdei_t,model->HICUMzei,here->HICUMajei_t,Vbiei,&Cjei,&Cjei_Vbiei, &Cjei_dT,&Qjei, &Qjei_Vbiei, &Qjei_dT); result = calc_hjei_vbe(Vbiei+1_e, Temp, here, model); hjei_vbe = result.rpart(); @@ -2030,7 +2031,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) //HICCR: } //Internal base current across b-c junction - hicum_diode(Temp,here->HICUMibcis_t,model->HICUMmbci, Vbici, &ibci, &ibci_Vbici, &ibci_dT); + hicum_diode(Temp+1_e*Tdev_Vrth,here->HICUMibcis_t,model->HICUMmbci, Vbici, &ibci, &ibci_Vbici, &ibci_dT); //Avalanche current result = calc_iavl(Vbici+1_e, Cjci+1_e*Cjci_Vbici, itf+1_e*itf_Vbici , Temp); @@ -2065,11 +2066,11 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) here->HICUMrbi = rbi; //Base currents across peripheral b-e junction - hicum_diode(Temp,here->HICUMibeps_t,model->HICUMmbep, Vbpei, &ibep, &ibep_Vbpei, &ibep_dT); - hicum_diode(Temp,here->HICUMireps_t,model->HICUMmrep, Vbpei, &irep, &irep_Vbpei, &irep_dT); + hicum_diode(Temp+1_e*Tdev_Vrth,here->HICUMibeps_t,model->HICUMmbep, Vbpei, &ibep, &ibep_Vbpei, &ibep_dT); + hicum_diode(Temp+1_e*Tdev_Vrth,here->HICUMireps_t,model->HICUMmrep, Vbpei, &irep, &irep_Vbpei, &irep_dT); //Peripheral b-e junction capacitance and charge - hicum_qjmodf(Temp,here->HICUMcjep0_t,here->HICUMvdep_t,model->HICUMzep,here->HICUMajep_t,Vbpei,&Cjep,&Cjep_Vbpei, &Cjep_dT,&Qjep, &Qjep_Vbpei, &Qjep_dT); + hicum_qjmodf(Temp+1_e*Tdev_Vrth,here->HICUMcjep0_t,here->HICUMvdep_t,model->HICUMzep,here->HICUMajep_t,Vbpei,&Cjep,&Cjep_Vbpei, &Cjep_dT,&Qjep, &Qjep_Vbpei, &Qjep_dT); //Tunneling current result = calc_ibet(Vbiei , Vbpei+1_e, Temp); @@ -2083,7 +2084,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) ibet_dT = result.dpart(); //Base currents across peripheral b-c junction (bp,ci) - hicum_diode(Temp,here->HICUMibcxs_t,model->HICUMmbcx, Vbpci, &ijbcx, &ijbcx_Vbpci, &ijbcx_dT); + hicum_diode(Temp+1_e*Tdev_Vrth,here->HICUMibcxs_t,model->HICUMmbcx, Vbpci, &ijbcx, &ijbcx_Vbpci, &ijbcx_dT); //Depletion capacitance and charge at external b-c junction (b,ci) hicum_HICJQ(Temp, here->HICUMcjcx01_t,here->HICUMvdcx_t,model->HICUMzcx,here->HICUMvptcx_t, Vbci, &Cjcx_i, &Cjcx_i_Vbci, &Cjcx_i_dT, &Qjcx_i, &Qjcx_i_Vbci, &Qjcx_i_dT); @@ -2138,7 +2139,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) } //Diode current for s-c junction (si,ci) - hicum_diode(Temp,here->HICUMiscs_t,model->HICUMmsc, Vsici, &ijsc, &ijsc_Vsici, &ijsc_Vrth); + hicum_diode(Temp+1_e*Tdev_Vrth,here->HICUMiscs_t,model->HICUMmsc, Vsici, &ijsc, &ijsc_Vsici, &ijsc_Vrth); // Self-heating calculation if (model->HICUMflsh == 1 && here->HICUMrth_scaled >= MIN_R) { From 00f51465e370b333f8e590db1b20f66a32e2ff96 Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Fri, 24 Jul 2020 11:07:58 +0200 Subject: [PATCH 11/39] finish cleaning --- src/spicelib/devices/hicum2/hicum2acld.c | 98 +++++++------- src/spicelib/devices/hicum2/hicum2conv.c | 17 +-- src/spicelib/devices/hicum2/hicum2pzld.c | 141 ++++++++++---------- src/spicelib/devices/hicum2/hicumL2.cpp | 140 +++++++++---------- src/spicelib/devices/hicum2/hicumL2temp.cpp | 6 +- 5 files changed, 200 insertions(+), 202 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2acld.c b/src/spicelib/devices/hicum2/hicum2acld.c index 20a0b6826..99332c082 100644 --- a/src/spicelib/devices/hicum2/hicum2acld.c +++ b/src/spicelib/devices/hicum2/hicum2acld.c @@ -116,7 +116,6 @@ 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)) { @@ -128,7 +127,6 @@ 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) { @@ -522,46 +520,46 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt) // Stamps with SH if (selfheat) { // Stamp element: Ibiei f_Bi = + f_Ei = - - *(here->HICUMbaseBItempPtr) += Ibiei_Vrth*Tdev_Vrth; - *(here->HICUMemitEItempPtr) += -Ibiei_Vrth*Tdev_Vrth; + *(here->HICUMbaseBItempPtr) += Ibiei_Vrth; + *(here->HICUMemitEItempPtr) += -Ibiei_Vrth; // Stamp element: Ibpei f_Bp = + f_Ei = - // with respect to Potential Vrth - *(here->HICUMbaseBPtempPtr) += Ibpei_Vrth*Tdev_Vrth; - *(here->HICUMemitEItempPtr) += -Ibpei_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpei_Vrth; + *(here->HICUMemitEItempPtr) += -Ibpei_Vrth; // Stamp element: Ibici f_Bi = + f_Ci = - - *(here->HICUMbaseBItempPtr) += Ibici_Vrth*Tdev_Vrth; - *(here->HICUMcollCItempPtr) += -Ibici_Vrth*Tdev_Vrth; + *(here->HICUMbaseBItempPtr) += Ibici_Vrth; + *(here->HICUMcollCItempPtr) += -Ibici_Vrth; // Stamp element: Iciei f_Ci = + f_Ei = - - *(here->HICUMcollCItempPtr) += Iciei_Vrth*Tdev_Vrth; - *(here->HICUMemitEItempPtr) += -Iciei_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr) += Iciei_Vrth; + *(here->HICUMemitEItempPtr) += -Iciei_Vrth; // Stamp element: Ibpci f_Bp = + f_Ci = - - *(here->HICUMbaseBPtempPtr) += Ibpci_Vrth*Tdev_Vrth; - *(here->HICUMcollCItempPtr) += -Ibpci_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpci_Vrth; + *(here->HICUMcollCItempPtr) += -Ibpci_Vrth; // Stamp element: Rcx f_Ci = + f_C = - - *(here->HICUMcollCItempPtr) += Icic_Vrth*Tdev_Vrth; - *(here->HICUMcollTempPtr) += -Icic_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr) += Icic_Vrth; + *(here->HICUMcollTempPtr) += -Icic_Vrth; // Stamp element: Rbx f_B = + f_Bp = - - *(here->HICUMbaseTempPtr) += Ibbp_Vrth*Tdev_Vrth; - *(here->HICUMbaseBPtempPtr) += -Ibbp_Vrth*Tdev_Vrth; + *(here->HICUMbaseTempPtr) += Ibbp_Vrth; + *(here->HICUMbaseBPtempPtr) += -Ibbp_Vrth; // Stamp element: Re f_Ei = + f_E = - - *(here->HICUMemitEItempPtr) += Ieie_Vrth*Tdev_Vrth; - *(here->HICUMemitTempPtr) += -Ieie_Vrth*Tdev_Vrth; + *(here->HICUMemitEItempPtr) += Ieie_Vrth; + *(here->HICUMemitTempPtr) += -Ieie_Vrth; // Stamp element: Rbi f_Bp = + f_Bi = - - *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth*Tdev_Vrth; - *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth; + *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth; // Stamp element: Isici f_Si = + f_Ci = - - *(here->HICUMsubsSItempPtr) += Isici_Vrth*Tdev_Vrth; - *(here->HICUMcollCItempPtr) += -Isici_Vrth*Tdev_Vrth; + *(here->HICUMsubsSItempPtr) += Isici_Vrth; + *(here->HICUMcollCItempPtr) += -Isici_Vrth; // Branch: bpsi, Stamp element: Its - *(here->HICUMbaseBPtempPtr) += Ibpsi_Vrth*Tdev_Vrth; - *(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpsi_Vrth; + *(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth; if (nqs) { // Stamp element: Ixf f_xf = + - *(here->HICUMxfTempPtr) += Ixf_Vrth*Tdev_Vrth; + *(here->HICUMxfTempPtr) += Ixf_Vrth; // Stamp element: Ixf1 f_xf1 = + - *(here->HICUMxf1TempPtr) += Ixf1_Vrth*Tdev_Vrth; + *(here->HICUMxf1TempPtr) += Ixf1_Vrth; // Stamp element: Ixf2 f_xf2 = + - *(here->HICUMxf2TempPtr) += Ixf2_Vrth*Tdev_Vrth; + *(here->HICUMxf2TempPtr) += Ixf2_Vrth; } // Stamp element: Ith f_T = - Ith @@ -600,29 +598,29 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt) // finish //the charges - *(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; + *(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; } diff --git a/src/spicelib/devices/hicum2/hicum2conv.c b/src/spicelib/devices/hicum2/hicum2conv.c index ee96ccabb..9c4adf88d 100644 --- a/src/spicelib/devices/hicum2/hicum2conv.c +++ b/src/spicelib/devices/hicum2/hicum2conv.c @@ -44,7 +44,6 @@ 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; @@ -104,36 +103,34 @@ 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)*Tdev_Vrth*delvrth + + *(ckt->CKTstate0 + here->HICUMibiei_Vrth)*delvrth + *(ckt->CKTstate0 + here->HICUMibiei_Vbici)*delvbici; ibicihat = *(ckt->CKTstate0 + here->HICUMibici) + *(ckt->CKTstate0 + here->HICUMibici_Vbici)*delvbici+ - *(ckt->CKTstate0 + here->HICUMibici_Vrth)*Tdev_Vrth*delvrth+ + *(ckt->CKTstate0 + here->HICUMibici_Vrth)*delvrth+ *(ckt->CKTstate0 + here->HICUMibici_Vbiei)*delvbiei; icieihat = *(ckt->CKTstate0 + here->HICUMiciei) + *(ckt->CKTstate0 + here->HICUMiciei_Vbiei)*delvbiei + - *(ckt->CKTstate0 + here->HICUMiciei_Vrth)*Tdev_Vrth*delvrth + + *(ckt->CKTstate0 + here->HICUMiciei_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)*Tdev_Vrth*delvrth + + *(ckt->CKTstate0 + here->HICUMibpbi_Vrth)*delvrth + *(ckt->CKTstate0 + here->HICUMibpbi_Vbici)*delvbici; ibpcihat = *(ckt->CKTstate0 + here->HICUMibpci) + - *(ckt->CKTstate0 + here->HICUMibpci_Vrth)*Tdev_Vrth*delvrth+ + *(ckt->CKTstate0 + here->HICUMibpci_Vrth)*delvrth+ *(ckt->CKTstate0 + here->HICUMibpci_Vbpci)*delvbici; ibpsihat = *(ckt->CKTstate0 + here->HICUMibpsi) + *(ckt->CKTstate0 + here->HICUMibpsi_Vbpci)*delvbpci + - *(ckt->CKTstate0 + here->HICUMibpsi_Vrth)*Tdev_Vrth*delvrth + + *(ckt->CKTstate0 + here->HICUMibpsi_Vrth)*delvrth + *(ckt->CKTstate0 + here->HICUMibpsi_Vsici)*delvsici; isicihat = *(ckt->CKTstate0 + here->HICUMisici) + - *(ckt->CKTstate0 + here->HICUMisici_Vrth)*Tdev_Vrth*delvrth+ + *(ckt->CKTstate0 + here->HICUMisici_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/hicum2pzld.c b/src/spicelib/devices/hicum2/hicum2pzld.c index 56aac6df3..ff535b212 100644 --- a/src/spicelib/devices/hicum2/hicum2pzld.c +++ b/src/spicelib/devices/hicum2/hicum2pzld.c @@ -115,8 +115,6 @@ 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 */ @@ -129,7 +127,6 @@ 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) { @@ -612,46 +609,46 @@ HICUMpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) // Stamps with SH if (selfheat) { // Stamp element: Ibiei f_Bi = + f_Ei = - - *(here->HICUMbaseBItempPtr) += Ibiei_Vrth*Tdev_Vrth; - *(here->HICUMemitEItempPtr) += -Ibiei_Vrth*Tdev_Vrth; + *(here->HICUMbaseBItempPtr) += Ibiei_Vrth; + *(here->HICUMemitEItempPtr) += -Ibiei_Vrth; // Stamp element: Ibpei f_Bp = + f_Ei = - // with respect to Potential Vrth - *(here->HICUMbaseBPtempPtr) += Ibpei_Vrth*Tdev_Vrth; - *(here->HICUMemitEItempPtr) += -Ibpei_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpei_Vrth; + *(here->HICUMemitEItempPtr) += -Ibpei_Vrth; // Stamp element: Ibici f_Bi = + f_Ci = - - *(here->HICUMbaseBItempPtr) += Ibici_Vrth*Tdev_Vrth; - *(here->HICUMcollCItempPtr) += -Ibici_Vrth*Tdev_Vrth; + *(here->HICUMbaseBItempPtr) += Ibici_Vrth; + *(here->HICUMcollCItempPtr) += -Ibici_Vrth; // Stamp element: Iciei f_Ci = + f_Ei = - - *(here->HICUMcollCItempPtr) += Iciei_Vrth*Tdev_Vrth; - *(here->HICUMemitEItempPtr) += -Iciei_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr) += Iciei_Vrth; + *(here->HICUMemitEItempPtr) += -Iciei_Vrth; // Stamp element: Ibpci f_Bp = + f_Ci = - - *(here->HICUMbaseBPtempPtr) += Ibpci_Vrth*Tdev_Vrth; - *(here->HICUMcollCItempPtr) += -Ibpci_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpci_Vrth; + *(here->HICUMcollCItempPtr) += -Ibpci_Vrth; // Stamp element: Rcx f_Ci = + f_C = - - *(here->HICUMcollCItempPtr) += Icic_Vrth*Tdev_Vrth; - *(here->HICUMcollTempPtr) += -Icic_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr) += Icic_Vrth; + *(here->HICUMcollTempPtr) += -Icic_Vrth; // Stamp element: Rbx f_B = + f_Bp = - - *(here->HICUMbaseTempPtr) += Ibbp_Vrth*Tdev_Vrth; - *(here->HICUMbaseBPtempPtr) += -Ibbp_Vrth*Tdev_Vrth; + *(here->HICUMbaseTempPtr) += Ibbp_Vrth; + *(here->HICUMbaseBPtempPtr) += -Ibbp_Vrth; // Stamp element: Re f_Ei = + f_E = - - *(here->HICUMemitEItempPtr) += Ieie_Vrth*Tdev_Vrth; - *(here->HICUMemitTempPtr) += -Ieie_Vrth*Tdev_Vrth; + *(here->HICUMemitEItempPtr) += Ieie_Vrth; + *(here->HICUMemitTempPtr) += -Ieie_Vrth; // Stamp element: Rbi f_Bp = + f_Bi = - - *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth*Tdev_Vrth; - *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth; + *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth; // Stamp element: Isici f_Si = + f_Ci = - - *(here->HICUMsubsSItempPtr) += Isici_Vrth*Tdev_Vrth; - *(here->HICUMcollCItempPtr) += -Isici_Vrth*Tdev_Vrth; + *(here->HICUMsubsSItempPtr) += Isici_Vrth; + *(here->HICUMcollCItempPtr) += -Isici_Vrth; // Branch: bpsi, Stamp element: Its - *(here->HICUMbaseBPtempPtr) += Ibpsi_Vrth*Tdev_Vrth; - *(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpsi_Vrth; + *(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth; if (nqs) { // Stamp element: Ixf f_xf = + - *(here->HICUMxfTempPtr) += Ixf_Vrth*Tdev_Vrth; + *(here->HICUMxfTempPtr) += Ixf_Vrth; // Stamp element: Ixf1 f_xf1 = + - *(here->HICUMxf1TempPtr) += Ixf1_Vrth*Tdev_Vrth; + *(here->HICUMxf1TempPtr) += Ixf1_Vrth; // Stamp element: Ixf2 f_xf2 = + - *(here->HICUMxf2TempPtr) += Ixf2_Vrth*Tdev_Vrth; + *(here->HICUMxf2TempPtr) += Ixf2_Vrth; } // Stamp element: Ith f_T = - Ith @@ -690,50 +687,50 @@ HICUMpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) // finish //the charges - *(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->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->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 892d1760f..2d9325786 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -312,7 +312,7 @@ void hicum_qjmodf(duals::duald T, dual_double c_0, dual_double u_d, double z, du *C_dT = Cresult.dpart(); } -void hicum_HICJQ(double T, dual_double c_0, dual_double u_d, double z, dual_double v_pt, double U_cap, double * C, double * C_dU, double * C_dT, double * Qz, double * Qz_dU, double * Qz_dT) +void hicum_HICJQ(duals::duald T, dual_double c_0, dual_double u_d, double z, dual_double v_pt, double U_cap, double * C, double * C_dU, double * C_dT, double * Qz, double * Qz_dU, double * Qz_dT) { //wrapper for HICJQ that also generates derivatives duals::duald Cresult = 0; @@ -320,7 +320,7 @@ void hicum_HICJQ(double T, dual_double c_0, dual_double u_d, double z, dual_doub duals::duald c_0_t = c_0.rpart; duals::duald u_d_t = u_d.rpart; duals::duald v_pt_t = v_pt.rpart; - HICJQ(T, c_0_t, u_d_t, z, v_pt_t, U_cap+1_e, &Cresult, &Qresult); + HICJQ(T.rpart(), c_0_t, u_d_t, z, v_pt_t, U_cap+1_e, &Cresult, &Qresult); *C = Cresult.rpart(); *C_dU = Cresult.dpart(); *Qz = Qresult.rpart(); @@ -329,7 +329,7 @@ void hicum_HICJQ(double T, dual_double c_0, dual_double u_d, double z, dual_doub c_0_t.dpart(c_0.dpart); u_d_t.dpart(u_d.dpart); v_pt_t.dpart(v_pt.dpart); - HICJQ(T+1_e, c_0_t, u_d_t, z, v_pt_t, U_cap, &Cresult, &Qresult); + HICJQ(T, c_0_t, u_d_t, z, v_pt_t, U_cap, &Cresult, &Qresult); *Qz_dT = Qresult.dpart(); *C_dT = Cresult.dpart(); } @@ -463,6 +463,10 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Temp; double Tdev_Vrth; //derivative device temperature to Vrth + // below variable has a real part equal to the device temperature and a dual part equal to dTdev/dVrth + //this is necessary, since for some Vrth, HICUM sets Tdev constant (eg very high self heating beyond 300K) + //then, dTdev/dVrth=0. Else it is equal to 1. + duals::duald Temp_dual; double Cjei_Vbiei,Cjci_Vbici,Cjep_Vbpei,Cjep_dT,Cjs_Vsici; double Cjei_dT, Cjci_dT; @@ -1835,27 +1839,29 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) here->HICUMtemp_Vrth = 0; } + Temp_dual = Temp + 1_e*Tdev_Vrth; + // Model_evaluation //Intrinsic transistor //Internal base currents across b-e junction - hicum_diode(Temp+1_e*Tdev_Vrth,here->HICUMibeis_t,model->HICUMmbei, Vbiei, &ibei, &ibei_Vbiei, &ibei_dT); - hicum_diode(Temp+1_e*Tdev_Vrth,here->HICUMireis_t,model->HICUMmrei, Vbiei, &irei, &irei_Vbiei, &irei_dT); + hicum_diode(Temp_dual,here->HICUMibeis_t,model->HICUMmbei, Vbiei, &ibei, &ibei_Vbiei, &ibei_dT); + hicum_diode(Temp_dual,here->HICUMireis_t,model->HICUMmrei, Vbiei, &irei, &irei_Vbiei, &irei_dT); //Internal b-e and b-c junction capacitances and charges //Cjei = ddx(Qjei,V(bi)); - hicum_qjmodf(Temp+1_e*Tdev_Vrth,here->HICUMcjei0_t,here->HICUMvdei_t,model->HICUMzei,here->HICUMajei_t,Vbiei,&Cjei,&Cjei_Vbiei, &Cjei_dT,&Qjei, &Qjei_Vbiei, &Qjei_dT); + hicum_qjmodf(Temp_dual,here->HICUMcjei0_t,here->HICUMvdei_t,model->HICUMzei,here->HICUMajei_t,Vbiei,&Cjei,&Cjei_Vbiei, &Cjei_dT,&Qjei, &Qjei_Vbiei, &Qjei_dT); result = calc_hjei_vbe(Vbiei+1_e, Temp, here, model); hjei_vbe = result.rpart(); hjei_vbe_Vbiei = result.dpart(); - result = calc_hjei_vbe(Vbiei, Temp+1_e, here, model); + result = calc_hjei_vbe(Vbiei, Temp_dual, here, model); hjei_vbe_dT = result.dpart(); //HICJQ(here->HICUMvt,cjci0_t,vdci_t,model->HICUMzci,vptci_t,V(br_bici),Qjci); //Cjci = ddx(Qjci,V(bi)); - hicum_HICJQ(Temp, here->HICUMcjci0_t,here->HICUMvdci_t,model->HICUMzci,here->HICUMvptci_t, Vbici, &Cjci, &Cjci_Vbici, &Cjci_dT, &Qjci, &Qjci_Vbici, &Qjci_dT); + hicum_HICJQ(Temp_dual, here->HICUMcjci0_t,here->HICUMvdci_t,model->HICUMzci,here->HICUMvptci_t, Vbici, &Cjci, &Cjci_Vbici, &Cjci_dT, &Qjci, &Qjci_Vbici, &Qjci_dT); //Hole charge at low bias result = calc_Q_0(Temp , Qjei+1_e*Qjei_Vbiei, Qjci, hjei_vbe+1_e*hjei_vbe_Vbiei); @@ -1865,7 +1871,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) result = calc_Q_0(Temp , Qjei, Qjci+1_e*Qjci_Vbici, hjei_vbe); Q_0_Vbici = result.dpart(); - result = calc_Q_0(Temp+1_e , Qjei+1_e*Qjei_dT, Qjci+1_e*Qjci_dT, hjei_vbe+1_e*hjei_vbe_dT); + result = calc_Q_0(Temp_dual , Qjei+1_e*Qjei_dT, Qjci+1_e*Qjci_dT, hjei_vbe+1_e*hjei_vbe_dT); Q_0_dT = result.dpart(); //Transit time calculation at low current density @@ -1873,7 +1879,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) T_f0 = result.rpart(); T_f0_Vbici = result.dpart(); - result = calc_T_f0(Temp+1_e, Vbici); + result = calc_T_f0(Temp_dual, Vbici); T_f0_dT = result.dpart() ; //Critical current @@ -1881,7 +1887,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) ick = result.rpart(); ick_Vciei = result.dpart(); - result = calc_ick(Temp+1_e, Vciei); + result = calc_ick(Temp_dual, Vciei); ick_dT = result.dpart(); here->HICUMick = ick; @@ -1894,7 +1900,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Tr = model->HICUMtr; //begin initial transfer current calculations -> itf, itr, Qf, Qr------------ - calc_it_initial(Temp+1_e, Vbiei , Vbici , Q_0+1_e*Q_0_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_a_h, &result_Q_p, &result_Tf); + calc_it_initial(Temp_dual, Vbiei , Vbici , Q_0+1_e*Q_0_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_a_h, &result_Q_p, &result_Tf); itf = result_itf.rpart(); itr = result_itr.rpart(); Qf = result_Qf.rpart(); @@ -1911,7 +1917,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Tf_dT = result_Tf.dpart(); if (!(Qf > RTOLC*Q_p || a_h > RTOLC)) { // in this case the newon is not run and the derivatives of the initial solution are needed - calc_it_initial(Temp+1_e, Vbiei , Vbici , Q_0+1_e*Q_0_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_a_h, &result_Q_p, &result_Tf); + calc_it_initial(Temp_dual, Vbiei , Vbici , Q_0+1_e*Q_0_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_a_h, &result_Q_p, &result_Tf); itf_dT = result_itf.dpart(); itr_dT = result_itr.dpart(); Qf_dT = result_Qf.dpart(); @@ -1936,7 +1942,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Tf_Vbici = result_Tf.dpart(); } else { //Newton needed - result = calc_it(Temp+1_e, Vbiei , Vbici , Q_0+1_e*Q_0_dT , T_f0+1_e*T_f0_dT , ick+1_e*ick_dT ); + result = calc_it(Temp_dual, Vbiei , Vbici , Q_0+1_e*Q_0_dT , T_f0+1_e*T_f0_dT , ick+1_e*ick_dT ); Q_pT = result.rpart(); Q_pT_dT = result.dpart(); result = calc_it(Temp , Vbiei+1_e, Vbici , Q_0+1_e*Q_0_Vbiei , T_f0 , ick+1_e*ick_Vciei ); @@ -1947,7 +1953,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) //end Q_pT ------------------------------------------------------------------------------- //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_dual, 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); itf = result_itf.rpart(); itr = result_itr.rpart(); Qf = result_Qf.rpart(); @@ -2031,7 +2037,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) //HICCR: } //Internal base current across b-c junction - hicum_diode(Temp+1_e*Tdev_Vrth,here->HICUMibcis_t,model->HICUMmbci, Vbici, &ibci, &ibci_Vbici, &ibci_dT); + hicum_diode(Temp_dual,here->HICUMibcis_t,model->HICUMmbci, Vbici, &ibci, &ibci_Vbici, &ibci_dT); //Avalanche current result = calc_iavl(Vbici+1_e, Cjci+1_e*Cjci_Vbici, itf+1_e*itf_Vbici , Temp); @@ -2041,7 +2047,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) result = calc_iavl(Vbici, Cjci, itf+1_e*itf_Vbiei , Temp); iavl_Vbiei = result.dpart(); - result = calc_iavl(Vbici , Cjci+1_e*Cjci_dT , itf+1_e*itf_dT , Temp+1_e); + result = calc_iavl(Vbici , Cjci+1_e*Cjci_dT , itf+1_e*itf_dT , Temp_dual); iavl_dT = result.dpart(); here->HICUMiavl = iavl; @@ -2053,7 +2059,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) ibh_rec_dT = Otbhrec*Q_bf_dT ; //internal base resistance - result = calc_rbi(Temp+1_e, Qjei+1_e*Qjei_dT , Qf+1_e*Qf_dT ); + result = calc_rbi(Temp_dual, Qjei+1_e*Qjei_dT , Qf+1_e*Qf_dT ); rbi = result.rpart(); rbi_dT = result.dpart(); @@ -2066,11 +2072,11 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) here->HICUMrbi = rbi; //Base currents across peripheral b-e junction - hicum_diode(Temp+1_e*Tdev_Vrth,here->HICUMibeps_t,model->HICUMmbep, Vbpei, &ibep, &ibep_Vbpei, &ibep_dT); - hicum_diode(Temp+1_e*Tdev_Vrth,here->HICUMireps_t,model->HICUMmrep, Vbpei, &irep, &irep_Vbpei, &irep_dT); + hicum_diode(Temp_dual,here->HICUMibeps_t,model->HICUMmbep, Vbpei, &ibep, &ibep_Vbpei, &ibep_dT); + hicum_diode(Temp_dual,here->HICUMireps_t,model->HICUMmrep, Vbpei, &irep, &irep_Vbpei, &irep_dT); //Peripheral b-e junction capacitance and charge - hicum_qjmodf(Temp+1_e*Tdev_Vrth,here->HICUMcjep0_t,here->HICUMvdep_t,model->HICUMzep,here->HICUMajep_t,Vbpei,&Cjep,&Cjep_Vbpei, &Cjep_dT,&Qjep, &Qjep_Vbpei, &Qjep_dT); + hicum_qjmodf(Temp_dual,here->HICUMcjep0_t,here->HICUMvdep_t,model->HICUMzep,here->HICUMajep_t,Vbpei,&Cjep,&Cjep_Vbpei, &Cjep_dT,&Qjep, &Qjep_Vbpei, &Qjep_dT); //Tunneling current result = calc_ibet(Vbiei , Vbpei+1_e, Temp); @@ -2080,27 +2086,27 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) result = calc_ibet(Vbiei+1_e, Vbpei, Temp); ibet_Vbiei = result.dpart(); - result = calc_ibet(Vbiei , Vbpei, Temp+1_e); + result = calc_ibet(Vbiei , Vbpei, Temp_dual); ibet_dT = result.dpart(); //Base currents across peripheral b-c junction (bp,ci) - hicum_diode(Temp+1_e*Tdev_Vrth,here->HICUMibcxs_t,model->HICUMmbcx, Vbpci, &ijbcx, &ijbcx_Vbpci, &ijbcx_dT); + hicum_diode(Temp_dual,here->HICUMibcxs_t,model->HICUMmbcx, Vbpci, &ijbcx, &ijbcx_Vbpci, &ijbcx_dT); //Depletion capacitance and charge at external b-c junction (b,ci) - hicum_HICJQ(Temp, here->HICUMcjcx01_t,here->HICUMvdcx_t,model->HICUMzcx,here->HICUMvptcx_t, Vbci, &Cjcx_i, &Cjcx_i_Vbci, &Cjcx_i_dT, &Qjcx_i, &Qjcx_i_Vbci, &Qjcx_i_dT); + hicum_HICJQ(Temp_dual, here->HICUMcjcx01_t,here->HICUMvdcx_t,model->HICUMzcx,here->HICUMvptcx_t, Vbci, &Cjcx_i, &Cjcx_i_Vbci, &Cjcx_i_dT, &Qjcx_i, &Qjcx_i_Vbci, &Qjcx_i_dT); //Depletion capacitance and charge at peripheral b-c junction (bp,ci) - hicum_HICJQ(Temp, here->HICUMcjcx02_t,here->HICUMvdcx_t,model->HICUMzcx,here->HICUMvptcx_t, Vbpci, &Cjcx_ii, &Cjcx_ii_Vbpci, &Cjcx_ii_dT, &Qjcx_ii, &Qjcx_ii_Vbpci, &Qjcx_ii_dT); + hicum_HICJQ(Temp_dual, here->HICUMcjcx02_t,here->HICUMvdcx_t,model->HICUMzcx,here->HICUMvptcx_t, Vbpci, &Cjcx_ii, &Cjcx_ii_Vbpci, &Cjcx_ii_dT, &Qjcx_ii, &Qjcx_ii_Vbpci, &Qjcx_ii_dT); //Depletion substrate capacitance and charge at inner s-c junction (si,ci) //HICJQ(here->HICUMvt,here->HICUMcjs0_t,here->HICUMvds_t,model->HICUMzs,here->HICUMvpts_t,Vsici,&Cjs,&Cjs_Vsici,&Qjs); - hicum_HICJQ(Temp, here->HICUMcjs0_t,here->HICUMvds_t,model->HICUMzs,here->HICUMvpts_t, Vsici, &Cjs, &Cjs_Vsici, &Cjs_dT, &Qjs, &Qjs_Vsici, &Qjs_dT); + hicum_HICJQ(Temp_dual, here->HICUMcjs0_t,here->HICUMvds_t,model->HICUMzs,here->HICUMvpts_t, Vsici, &Cjs, &Cjs_Vsici, &Cjs_dT, &Qjs, &Qjs_Vsici, &Qjs_dT); /* Peripheral substrate capacitance and charge at s-c junction (s,c) * Bias dependent only if model->HICUMvdsp > 0 */ if (model->HICUMvdsp > 0) { //HICJQ(here->HICUMvt,here->HICUMcscp0_t,here->HICUMvdsp_t,model->HICUMzsp,here->HICUMvptsp_t,Vsc,&Cscp,&Cscp_Vsc,&Qscp); - hicum_HICJQ(Temp, here->HICUMcscp0_t,here->HICUMvdsp_t,model->HICUMzsp,here->HICUMvptsp_t, Vsc, &Cscp, &Cscp_Vsc, &Cscp_dT, &Qscp, &Qscp_Vsc, &Qscp_dT); + hicum_HICJQ(Temp_dual, here->HICUMcscp0_t,here->HICUMvdsp_t,model->HICUMzsp,here->HICUMvptsp_t, Vsc, &Cscp, &Cscp_Vsc, &Cscp_dT, &Qscp, &Qscp_Vsc, &Qscp_dT); } else { // Constant, temperature independent capacitance Cscp = model->HICUMcscp0; @@ -2113,7 +2119,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) //Parasitic substrate transistor transfer current and diffusion charge //calc_itss = [&](duals::duald T, duals::duald Vbpci, duals::duald Vsici, duals::duald * HSI_Tsu, duals::duald * Qdsu){ - calc_itss(Temp+1_e, Vbpci , Vsici , &result_HSI_TSU, &result_Qdsu); + calc_itss(Temp_dual, Vbpci , Vsici , &result_HSI_TSU, &result_Qdsu); HSI_Tsu = result_HSI_TSU.rpart(); Qdsu = result_Qdsu.rpart(); HSI_Tsu_dT = result_HSI_TSU.dpart(); @@ -2139,7 +2145,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) } //Diode current for s-c junction (si,ci) - hicum_diode(Temp+1_e*Tdev_Vrth,here->HICUMiscs_t,model->HICUMmsc, Vsici, &ijsc, &ijsc_Vsici, &ijsc_Vrth); + hicum_diode(Temp_dual,here->HICUMiscs_t,model->HICUMmsc, Vsici, &ijsc, &ijsc_Vsici, &ijsc_Vrth); // Self-heating calculation if (model->HICUMflsh == 1 && here->HICUMrth_scaled >= MIN_R) { @@ -3218,125 +3224,125 @@ load: // ############################################################# // Stamp element: Ibiei f_Bi = + f_Ei = - - rhs_current = -Ibiei_Vrth*Tdev_Vrth*Vrth; + rhs_current = -Ibiei_Vrth*Vrth; *(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; // with respect to Potential Vrth - *(here->HICUMbaseBItempPtr) += Ibiei_Vrth*Tdev_Vrth; - *(here->HICUMemitEItempPtr) += -Ibiei_Vrth*Tdev_Vrth; + *(here->HICUMbaseBItempPtr) += Ibiei_Vrth; + *(here->HICUMemitEItempPtr) += -Ibiei_Vrth; // finish // Stamp element: Ibpei f_Bp = + f_Ei = - - rhs_current = -Ibpei_Vrth*Tdev_Vrth*Vrth; + rhs_current = -Ibpei_Vrth*Vrth; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; // with respect to Potential Vrth - *(here->HICUMbaseBPtempPtr) += Ibpei_Vrth*Tdev_Vrth; - *(here->HICUMemitEItempPtr) += -Ibpei_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpei_Vrth; + *(here->HICUMemitEItempPtr) += -Ibpei_Vrth; // finish // Stamp element: Ibici f_Bi = + f_Ci = - - rhs_current = -Ibici_Vrth*Vrth*Tdev_Vrth; + rhs_current = -Ibici_Vrth*Vrth; *(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; // with respect to Potential Vrth - *(here->HICUMbaseBItempPtr) += Ibici_Vrth*Tdev_Vrth; - *(here->HICUMcollCItempPtr) += -Ibici_Vrth*Tdev_Vrth; + *(here->HICUMbaseBItempPtr) += Ibici_Vrth; + *(here->HICUMcollCItempPtr) += -Ibici_Vrth; // finish // Stamp element: Iciei f_Ci = + f_Ei = - - rhs_current = -Iciei_Vrth*Vrth*Tdev_Vrth; + rhs_current = -Iciei_Vrth*Vrth; *(ckt->CKTrhs + here->HICUMcollCINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; // with respect to Potential Vrth - *(here->HICUMcollCItempPtr) += Iciei_Vrth*Tdev_Vrth; - *(here->HICUMemitEItempPtr) += -Iciei_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr) += Iciei_Vrth; + *(here->HICUMemitEItempPtr) += -Iciei_Vrth; // finish // Stamp element: Ibpci f_Bp = + f_Ci = - - rhs_current = -Ibpci_Vrth*Vrth*Tdev_Vrth; + rhs_current = -Ibpci_Vrth*Vrth; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; // with respect to Potential Vrth - *(here->HICUMbaseBPtempPtr) += Ibpci_Vrth*Tdev_Vrth; - *(here->HICUMcollCItempPtr) += -Ibpci_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpci_Vrth; + *(here->HICUMcollCItempPtr) += -Ibpci_Vrth; // finish // Stamp element: Rcx f_Ci = + f_C = - - rhs_current = -Icic_Vrth*Vrth*Tdev_Vrth; + rhs_current = -Icic_Vrth*Vrth; *(ckt->CKTrhs + here->HICUMcollCINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMcollNode) += rhs_current; // with respect to Potential Vrth - *(here->HICUMcollCItempPtr) += Icic_Vrth*Tdev_Vrth; - *(here->HICUMcollTempPtr) += -Icic_Vrth*Tdev_Vrth; + *(here->HICUMcollCItempPtr) += Icic_Vrth; + *(here->HICUMcollTempPtr) += -Icic_Vrth; // finish // Stamp element: Rbx f_B = + f_Bp = - - rhs_current = -Ibbp_Vrth*Vrth*Tdev_Vrth; + rhs_current = -Ibbp_Vrth*Vrth; *(ckt->CKTrhs + here->HICUMbaseNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseBPNode) += rhs_current; // with respect to Potential Vrth - *(here->HICUMbaseTempPtr) += Ibbp_Vrth*Tdev_Vrth; - *(here->HICUMbaseBPtempPtr) += -Ibbp_Vrth*Tdev_Vrth; + *(here->HICUMbaseTempPtr) += Ibbp_Vrth; + *(here->HICUMbaseBPtempPtr) += -Ibbp_Vrth; // finish // Stamp element: Re f_Ei = + f_E = - - rhs_current = - Ieie_Vrth*Vrth*Tdev_Vrth; + rhs_current = - Ieie_Vrth*Vrth; *(ckt->CKTrhs + here->HICUMemitEINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMemitNode) += +rhs_current; // with respect to Potential Vrth - *(here->HICUMemitEItempPtr) += +Ieie_Vrth*Tdev_Vrth; - *(here->HICUMemitTempPtr) += -Ieie_Vrth*Tdev_Vrth; + *(here->HICUMemitEItempPtr) += +Ieie_Vrth; + *(here->HICUMemitTempPtr) += -Ieie_Vrth; // finish // Stamp element: Rbi f_Bp = + f_Bi = - - rhs_current = -Ibpbi_Vrth*Vrth*Tdev_Vrth; + rhs_current = -Ibpbi_Vrth*Vrth; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseBINode) += rhs_current; // with respect to Potential Vrth - *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth*Tdev_Vrth; - *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth; + *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth; // finish // Stamp element: Isici f_Si = + f_Ci = - - rhs_current = -Isici_Vrth*Vrth*Tdev_Vrth; + rhs_current = -Isici_Vrth*Vrth; *(ckt->CKTrhs + here->HICUMsubsSINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; // with respect to Potential Vrth - *(here->HICUMsubsSItempPtr) += Isici_Vrth*Tdev_Vrth; - *(here->HICUMcollCItempPtr) += -Isici_Vrth*Tdev_Vrth; + *(here->HICUMsubsSItempPtr) += Isici_Vrth; + *(here->HICUMcollCItempPtr) += -Isici_Vrth; // finish // Branch: bpsi, Stamp element: Its - rhs_current = - Ibpsi_Vrth*Vrth*Tdev_Vrth; + rhs_current = - Ibpsi_Vrth*Vrth; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMsubsSINode) += rhs_current; // f_Bp = + f_Si = - // with respect to Vrth - *(here->HICUMbaseBPtempPtr) += Ibpsi_Vrth*Tdev_Vrth; - *(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth*Tdev_Vrth; + *(here->HICUMbaseBPtempPtr) += Ibpsi_Vrth; + *(here->HICUMsubsSItempPtr) += -Ibpsi_Vrth; // finish if (nqs) { // Stamp element: Ixf f_xf = + - rhs_current = -Ixf_dT*Vrth*Tdev_Vrth; + rhs_current = -Ixf_dT*Vrth; *(ckt->CKTrhs + here->HICUMxfNode) += -rhs_current; // with respect to Potential Vxf - *(here->HICUMxfTempPtr) += Ixf_dT*Tdev_Vrth; + *(here->HICUMxfTempPtr) += Ixf_dT; // finish // Stamp element: Ixf1 f_xf1 = + rhs_current = -Ixf1_dT*Vrth; *(ckt->CKTrhs + here->HICUMxf1Node) += -rhs_current; // with respect to Potential Vxf1 - *(here->HICUMxf1TempPtr) += Ixf1_dT*Tdev_Vrth; + *(here->HICUMxf1TempPtr) += Ixf1_dT; // finish // Stamp element: Ixf2 f_xf2 = + - rhs_current = -Ixf2_dT*Vrth*Tdev_Vrth; + rhs_current = -Ixf2_dT*Vrth; *(ckt->CKTrhs + here->HICUMxf2Node) += -rhs_current; // with respect to Potential Vxf2 - *(here->HICUMxf2TempPtr) += Ixf2_dT*Tdev_Vrth; + *(here->HICUMxf2TempPtr) += Ixf2_dT; // finish } diff --git a/src/spicelib/devices/hicum2/hicumL2temp.cpp b/src/spicelib/devices/hicum2/hicumL2temp.cpp index 20c459b24..c5c2f93f9 100644 --- a/src/spicelib/devices/hicum2/hicumL2temp.cpp +++ b/src/spicelib/devices/hicum2/hicumL2temp.cpp @@ -158,14 +158,14 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double zetasct = mg-1.5; // Limit temperature to avoid FPEs in equations - *(Tdev_Vrth) = 1; + *(Tdev_Vrth) = 1.0; if(*(HICUMTemp) < TMIN + CONSTCtoK) { *(HICUMTemp) = TMIN + CONSTCtoK; - *(Tdev_Vrth) = 0; + *(Tdev_Vrth) = 0.0; } else { if (*(HICUMTemp) > TMAX + CONSTCtoK) { *(HICUMTemp) = TMAX + CONSTCtoK; - *(Tdev_Vrth) = 0; + *(Tdev_Vrth) = 0.0; } } //This routine calculate the derivative with respect to Vrth. Since at some point From f5461183f30e60f9a860b2521c94fadc9aee573f Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Fri, 24 Jul 2020 11:17:33 +0200 Subject: [PATCH 12/39] hicumL2 load -> remove stamp for rbi, if node BP BI collapsed --- src/spicelib/devices/hicum2/hicumL2.cpp | 75 +++++++++++++++---------- 1 file changed, 44 insertions(+), 31 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 2d9325786..270db9e78 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -936,7 +936,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) if(Qf > 0.0) { rbi = rbi*(Qjei+Qf*model->HICUMfqi)/(Qjei+Qf); } - } else { + } else { rbi = 0.0; } return rbi; @@ -2363,7 +2363,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Ibpbi_Vbiei = -Vbpbi * rbi_Vbiei / (rbi*rbi); Ibpbi_Vbici = -Vbpbi * rbi_Vbici / (rbi*rbi); Ibpbi_Vrth = -Vbpbi * rbi_dT / (rbi*rbi); - } else { + } else if(rbi >0.0 ) { // fallback in case rbi is low Ibpbi = Vbpbi / MIN_R; Ibpbi_Vbpbi = 1 / MIN_R; @@ -2371,6 +2371,15 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Ibpbi_Vbici = 0; Ibpbi_Vrth = 0; } + else { + // fallback in case rbi is not zero, but smaller than MIN_R + Ibpbi = 0; + Ibpbi_Vbpbi = 0; + Ibpbi_Vbiei = 0; + Ibpbi_Vbici = 0; + Ibpbi_Vrth = 0; + } + // Following code is an intermediate solution (if branch contribution is not supported): // ****************************************** @@ -3119,27 +3128,29 @@ load: *(here->HICUMemitEmitEIPtr) += -Ieie_Veie; // finish -// Branch: bpbi, Stamp element: Rbi, Crbi - rhs_current = model->HICUMtype * (Ibpbi - Ibpbi_Vbpbi*Vbpbi - Ibpbi_Vbiei*Vbiei - Ibpbi_Vbici*Vbici); - *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMbaseBINode) += rhs_current; - //f_Bp = + f_Bi = - - // with respect to Vbpbi - *(here->HICUMbaseBPBaseBPPtr) += Ibpbi_Vbpbi; - *(here->HICUMbaseBIBaseBIPtr) += Ibpbi_Vbpbi; - *(here->HICUMbaseBPBaseBIPtr) += -Ibpbi_Vbpbi; - *(here->HICUMbaseBIBaseBPPtr) += -Ibpbi_Vbpbi; - // with respect to Vbiei - *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbiei; - *(here->HICUMbaseBIEmitEIPtr) += Ibpbi_Vbiei; - *(here->HICUMbaseBPEmitEIPtr) += -Ibpbi_Vbiei; - *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbiei; - // with respect to Vbici - *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbici; - *(here->HICUMbaseBICollCIPtr) += Ibpbi_Vbici; - *(here->HICUMbaseBPCollCIPtr) += -Ibpbi_Vbici; - *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbici; -// finish + if (rbi>0.0) { +// Branch: bpbi, Stamp element: Rbi, Crbi + rhs_current = model->HICUMtype * (Ibpbi - Ibpbi_Vbpbi*Vbpbi - Ibpbi_Vbiei*Vbiei - Ibpbi_Vbici*Vbici); + *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; + *(ckt->CKTrhs + here->HICUMbaseBINode) += rhs_current; + //f_Bp = + f_Bi = - + // with respect to Vbpbi + *(here->HICUMbaseBPBaseBPPtr) += Ibpbi_Vbpbi; + *(here->HICUMbaseBIBaseBIPtr) += Ibpbi_Vbpbi; + *(here->HICUMbaseBPBaseBIPtr) += -Ibpbi_Vbpbi; + *(here->HICUMbaseBIBaseBPPtr) += -Ibpbi_Vbpbi; + // with respect to Vbiei + *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbiei; + *(here->HICUMbaseBIEmitEIPtr) += Ibpbi_Vbiei; + *(here->HICUMbaseBPEmitEIPtr) += -Ibpbi_Vbiei; + *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbiei; + // with respect to Vbici + *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbici; + *(here->HICUMbaseBICollCIPtr) += Ibpbi_Vbici; + *(here->HICUMbaseBPCollCIPtr) += -Ibpbi_Vbici; + *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbici; +// finish + } // Branch: sici, Stamp element: Ijsc rhs_current = model->HICUMtype * (Isici - Isici_Vsici*Vsici); @@ -3295,14 +3306,16 @@ load: *(here->HICUMemitTempPtr) += -Ieie_Vrth; // finish -// Stamp element: Rbi f_Bp = + f_Bi = - - rhs_current = -Ibpbi_Vrth*Vrth; - *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; - *(ckt->CKTrhs + here->HICUMbaseBINode) += rhs_current; - // with respect to Potential Vrth - *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth; - *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth; -// finish + if (rbi>0.0) { +// Stamp element: Rbi f_Bp = + f_Bi = - + rhs_current = -Ibpbi_Vrth*Vrth; + *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; + *(ckt->CKTrhs + here->HICUMbaseBINode) += rhs_current; + // with respect to Potential Vrth + *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth; + *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth; +// finish + }; // Stamp element: Isici f_Si = + f_Ci = - rhs_current = -Isici_Vrth*Vrth; From 14a5cd873ba402f2b7c371b997dcdb3f6c18cb0f Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Fri, 24 Jul 2020 11:25:51 +0200 Subject: [PATCH 13/39] remove rbi stamps if nodes collapsed finish --- src/spicelib/devices/hicum2/hicum2acld.c | 52 ++++++++------- src/spicelib/devices/hicum2/hicum2pzld.c | 84 +++++++++++++----------- src/spicelib/devices/hicum2/hicumL2.cpp | 2 +- 3 files changed, 74 insertions(+), 64 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2acld.c b/src/spicelib/devices/hicum2/hicum2acld.c index 99332c082..b6382bd1a 100644 --- a/src/spicelib/devices/hicum2/hicum2acld.c +++ b/src/spicelib/devices/hicum2/hicum2acld.c @@ -286,18 +286,20 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt) *(here->HICUMemitEmitEIPtr) += -Ieie_Veie; // Stamp element: Ibpbi - *(here->HICUMbaseBPBaseBPPtr) += Ibpbi_Vbpbi; - *(here->HICUMbaseBIBaseBIPtr) += Ibpbi_Vbpbi; - *(here->HICUMbaseBPBaseBIPtr) += -Ibpbi_Vbpbi; - *(here->HICUMbaseBIBaseBPPtr) += -Ibpbi_Vbpbi; - *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbiei; - *(here->HICUMbaseBIEmitEIPtr) += Ibpbi_Vbiei; - *(here->HICUMbaseBPEmitEIPtr) += -Ibpbi_Vbiei; - *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbiei; - *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbici; - *(here->HICUMbaseBICollCIPtr) += Ibpbi_Vbici; - *(here->HICUMbaseBPCollCIPtr) += -Ibpbi_Vbici; - *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbici; + if (here->HICUMrbi>0.0) { + *(here->HICUMbaseBPBaseBPPtr) += Ibpbi_Vbpbi; + *(here->HICUMbaseBIBaseBIPtr) += Ibpbi_Vbpbi; + *(here->HICUMbaseBPBaseBIPtr) += -Ibpbi_Vbpbi; + *(here->HICUMbaseBIBaseBPPtr) += -Ibpbi_Vbpbi; + *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbiei; + *(here->HICUMbaseBIEmitEIPtr) += Ibpbi_Vbiei; + *(here->HICUMbaseBPEmitEIPtr) += -Ibpbi_Vbiei; + *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbiei; + *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbici; + *(here->HICUMbaseBICollCIPtr) += Ibpbi_Vbici; + *(here->HICUMbaseBPCollCIPtr) += -Ibpbi_Vbici; + *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbici; + }; // Stamp element: Isici *(here->HICUMsubsSISubsSIPtr) += Isici_Vsici; @@ -405,18 +407,20 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt) XQxf2_Vxf2 = *(ckt->CKTstate0 + here->HICUMcqxf2) * ckt->CKTomega; //Qrbi f_bp=+ f_bi=- - *(here->HICUMbaseBPBaseBPPtr + 1) += XQrbi_Vbpbi; - *(here->HICUMbaseBIBaseBIPtr + 1) += XQrbi_Vbpbi; - *(here->HICUMbaseBPBaseBIPtr + 1) += -XQrbi_Vbpbi; - *(here->HICUMbaseBIBaseBPPtr + 1) += -XQrbi_Vbpbi; - *(here->HICUMbaseBPBaseBIPtr + 1) += XQrbi_Vbiei; - *(here->HICUMbaseBIEmitEIPtr + 1) += XQrbi_Vbiei; - *(here->HICUMbaseBPEmitEIPtr + 1) += -XQrbi_Vbiei; - *(here->HICUMbaseBIBaseBIPtr + 1) += -XQrbi_Vbiei; - *(here->HICUMbaseBPBaseBIPtr + 1) += XQrbi_Vbici; - *(here->HICUMbaseBICollCIPtr + 1) += XQrbi_Vbici; - *(here->HICUMbaseBPCollCIPtr + 1) += -XQrbi_Vbici; - *(here->HICUMbaseBIBaseBIPtr + 1) += -XQrbi_Vbici; + if (here->HICUMrbi>0.0) { + *(here->HICUMbaseBPBaseBPPtr + 1) += XQrbi_Vbpbi; + *(here->HICUMbaseBIBaseBIPtr + 1) += XQrbi_Vbpbi; + *(here->HICUMbaseBPBaseBIPtr + 1) += -XQrbi_Vbpbi; + *(here->HICUMbaseBIBaseBPPtr + 1) += -XQrbi_Vbpbi; + *(here->HICUMbaseBPBaseBIPtr + 1) += XQrbi_Vbiei; + *(here->HICUMbaseBIEmitEIPtr + 1) += XQrbi_Vbiei; + *(here->HICUMbaseBPEmitEIPtr + 1) += -XQrbi_Vbiei; + *(here->HICUMbaseBIBaseBIPtr + 1) += -XQrbi_Vbiei; + *(here->HICUMbaseBPBaseBIPtr + 1) += XQrbi_Vbici; + *(here->HICUMbaseBICollCIPtr + 1) += XQrbi_Vbici; + *(here->HICUMbaseBPCollCIPtr + 1) += -XQrbi_Vbici; + *(here->HICUMbaseBIBaseBIPtr + 1) += -XQrbi_Vbici; + } //Qjei *(here->HICUMbaseBIBaseBIPtr + 1) += XQjei_Vbiei; *(here->HICUMemitEIEmitEIPtr + 1) += XQjei_Vbiei; diff --git a/src/spicelib/devices/hicum2/hicum2pzld.c b/src/spicelib/devices/hicum2/hicum2pzld.c index ff535b212..ee2896f8e 100644 --- a/src/spicelib/devices/hicum2/hicum2pzld.c +++ b/src/spicelib/devices/hicum2/hicum2pzld.c @@ -286,18 +286,20 @@ HICUMpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) *(here->HICUMemitEmitEIPtr) += -Ieie_Veie; // Stamp element: Ibpbi - *(here->HICUMbaseBPBaseBPPtr) += Ibpbi_Vbpbi; - *(here->HICUMbaseBIBaseBIPtr) += Ibpbi_Vbpbi; - *(here->HICUMbaseBPBaseBIPtr) += -Ibpbi_Vbpbi; - *(here->HICUMbaseBIBaseBPPtr) += -Ibpbi_Vbpbi; - *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbiei; - *(here->HICUMbaseBIEmitEIPtr) += Ibpbi_Vbiei; - *(here->HICUMbaseBPEmitEIPtr) += -Ibpbi_Vbiei; - *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbiei; - *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbici; - *(here->HICUMbaseBICollCIPtr) += Ibpbi_Vbici; - *(here->HICUMbaseBPCollCIPtr) += -Ibpbi_Vbici; - *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbici; + if (here->HICUMrbi>0.0) { + *(here->HICUMbaseBPBaseBPPtr) += Ibpbi_Vbpbi; + *(here->HICUMbaseBIBaseBIPtr) += Ibpbi_Vbpbi; + *(here->HICUMbaseBPBaseBIPtr) += -Ibpbi_Vbpbi; + *(here->HICUMbaseBIBaseBPPtr) += -Ibpbi_Vbpbi; + *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbiei; + *(here->HICUMbaseBIEmitEIPtr) += Ibpbi_Vbiei; + *(here->HICUMbaseBPEmitEIPtr) += -Ibpbi_Vbiei; + *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbiei; + *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbici; + *(here->HICUMbaseBICollCIPtr) += Ibpbi_Vbici; + *(here->HICUMbaseBPCollCIPtr) += -Ibpbi_Vbici; + *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbici; + }; // Stamp element: Isici *(here->HICUMsubsSISubsSIPtr) += Isici_Vsici; @@ -405,30 +407,32 @@ HICUMpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) XQxf2_Vxf2 = *(ckt->CKTstate0 + here->HICUMcqxf2); //Qrbi f_bp=+ f_bi=- - *(here->HICUMbaseBPBaseBPPtr + 1) += XQrbi_Vbpbi*(s->imag); - *(here->HICUMbaseBPBaseBPPtr ) += XQrbi_Vbpbi*(s->real); - *(here->HICUMbaseBIBaseBIPtr + 1) += XQrbi_Vbpbi*(s->imag); - *(here->HICUMbaseBIBaseBIPtr ) += XQrbi_Vbpbi*(s->real); - *(here->HICUMbaseBPBaseBIPtr + 1) += -XQrbi_Vbpbi*(s->imag); - *(here->HICUMbaseBPBaseBIPtr ) += -XQrbi_Vbpbi*(s->real); - *(here->HICUMbaseBIBaseBPPtr + 1) += -XQrbi_Vbpbi*(s->imag); - *(here->HICUMbaseBIBaseBPPtr ) += -XQrbi_Vbpbi*(s->real); - *(here->HICUMbaseBPBaseBIPtr + 1) += XQrbi_Vbiei*(s->imag); - *(here->HICUMbaseBPBaseBIPtr ) += XQrbi_Vbiei*(s->real); - *(here->HICUMbaseBIEmitEIPtr + 1) += XQrbi_Vbiei*(s->imag); - *(here->HICUMbaseBIEmitEIPtr ) += XQrbi_Vbiei*(s->real); - *(here->HICUMbaseBPEmitEIPtr + 1) += -XQrbi_Vbiei*(s->imag); - *(here->HICUMbaseBPEmitEIPtr ) += -XQrbi_Vbiei*(s->real); - *(here->HICUMbaseBIBaseBIPtr + 1) += -XQrbi_Vbiei*(s->imag); - *(here->HICUMbaseBIBaseBIPtr ) += -XQrbi_Vbiei*(s->real); - *(here->HICUMbaseBPBaseBIPtr + 1) += XQrbi_Vbici*(s->imag); - *(here->HICUMbaseBPBaseBIPtr ) += XQrbi_Vbici*(s->real); - *(here->HICUMbaseBICollCIPtr + 1) += XQrbi_Vbici*(s->imag); - *(here->HICUMbaseBICollCIPtr ) += XQrbi_Vbici*(s->real); - *(here->HICUMbaseBPCollCIPtr + 1) += -XQrbi_Vbici*(s->imag); - *(here->HICUMbaseBPCollCIPtr ) += -XQrbi_Vbici*(s->real); - *(here->HICUMbaseBIBaseBIPtr + 1) += -XQrbi_Vbici*(s->imag); - *(here->HICUMbaseBIBaseBIPtr ) += -XQrbi_Vbici*(s->real); + if (here->HICUMrbi>0.0) { + *(here->HICUMbaseBPBaseBPPtr + 1) += XQrbi_Vbpbi*(s->imag); + *(here->HICUMbaseBPBaseBPPtr ) += XQrbi_Vbpbi*(s->real); + *(here->HICUMbaseBIBaseBIPtr + 1) += XQrbi_Vbpbi*(s->imag); + *(here->HICUMbaseBIBaseBIPtr ) += XQrbi_Vbpbi*(s->real); + *(here->HICUMbaseBPBaseBIPtr + 1) += -XQrbi_Vbpbi*(s->imag); + *(here->HICUMbaseBPBaseBIPtr ) += -XQrbi_Vbpbi*(s->real); + *(here->HICUMbaseBIBaseBPPtr + 1) += -XQrbi_Vbpbi*(s->imag); + *(here->HICUMbaseBIBaseBPPtr ) += -XQrbi_Vbpbi*(s->real); + *(here->HICUMbaseBPBaseBIPtr + 1) += XQrbi_Vbiei*(s->imag); + *(here->HICUMbaseBPBaseBIPtr ) += XQrbi_Vbiei*(s->real); + *(here->HICUMbaseBIEmitEIPtr + 1) += XQrbi_Vbiei*(s->imag); + *(here->HICUMbaseBIEmitEIPtr ) += XQrbi_Vbiei*(s->real); + *(here->HICUMbaseBPEmitEIPtr + 1) += -XQrbi_Vbiei*(s->imag); + *(here->HICUMbaseBPEmitEIPtr ) += -XQrbi_Vbiei*(s->real); + *(here->HICUMbaseBIBaseBIPtr + 1) += -XQrbi_Vbiei*(s->imag); + *(here->HICUMbaseBIBaseBIPtr ) += -XQrbi_Vbiei*(s->real); + *(here->HICUMbaseBPBaseBIPtr + 1) += XQrbi_Vbici*(s->imag); + *(here->HICUMbaseBPBaseBIPtr ) += XQrbi_Vbici*(s->real); + *(here->HICUMbaseBICollCIPtr + 1) += XQrbi_Vbici*(s->imag); + *(here->HICUMbaseBICollCIPtr ) += XQrbi_Vbici*(s->real); + *(here->HICUMbaseBPCollCIPtr + 1) += -XQrbi_Vbici*(s->imag); + *(here->HICUMbaseBPCollCIPtr ) += -XQrbi_Vbici*(s->real); + *(here->HICUMbaseBIBaseBIPtr + 1) += -XQrbi_Vbici*(s->imag); + *(here->HICUMbaseBIBaseBIPtr ) += -XQrbi_Vbici*(s->real); + }; //Qjei *(here->HICUMbaseBIBaseBIPtr + 1) += XQjei_Vbiei*(s->imag); *(here->HICUMbaseBIBaseBIPtr ) += XQjei_Vbiei*(s->real); @@ -633,9 +637,11 @@ HICUMpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) // Stamp element: Re f_Ei = + f_E = - *(here->HICUMemitEItempPtr) += Ieie_Vrth; *(here->HICUMemitTempPtr) += -Ieie_Vrth; -// Stamp element: Rbi f_Bp = + f_Bi = - - *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth; - *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth; + if (here->HICUMrbi>0.0) { +// Stamp element: Rbi f_Bp = + f_Bi = - + *(here->HICUMbaseBPtempPtr) += Ibpbi_Vrth; + *(here->HICUMbaseBItempPtr) += -Ibpbi_Vrth; + }; // Stamp element: Isici f_Si = + f_Ci = - *(here->HICUMsubsSItempPtr) += Isici_Vrth; *(here->HICUMcollCItempPtr) += -Isici_Vrth; diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 270db9e78..b3a3a89c3 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -361,7 +361,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Cscp_Vsc, Cscp_dT; //Base resistance and self-heating power - double rbi,pterm,pterm_dT; + double rbi=0,pterm,pterm_dT; //Model initialization double C_1; From 0efc047f5fec5259ef4c34549e7d9641b61bd821 Mon Sep 17 00:00:00 2001 From: dwarning Date: Fri, 24 Jul 2020 16:03:10 +0200 Subject: [PATCH 14/39] few typos and comments --- src/spicelib/devices/hicum2/hicumL2.cpp | 43 +++++++------------------ 1 file changed, 12 insertions(+), 31 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index b3a3a89c3..aa9c801dd 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -8,8 +8,8 @@ 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. => you need to understand that to understand this code - * - The code is targeted to be readbale and maintainable, speed is sacrificed for this purpose. + * - We use dual numbers to calculate derivatives, this is readable and error proof. => you need to understand that to understand this code + * - The code is targeted to be readable and maintainable, speed is sacrificed for this purpose. * - The verilog a code is available at the website of TU Dresden, Michael Schroeter's chair. */ @@ -247,7 +247,7 @@ void HICJQ(duals::duald T, duals::duald c_0, duals::duald u_d, double z, duals:: duals::duald calc_hjei_vbe(duals::duald Vbiei, duals::duald T, HICUMinstance * here, HICUMmodel * model){ //calculates hje_vbe - //warpping in a routine allows easy calculation of derivatives with dual numbers + //wrapping in a routine allows easy calculation of derivatives with dual numbers duals::duald vj, vj_z, vt, vdei_t, hjei0_t, ahjei_t; if (model->HICUMahjei == 0.0){ return model->HICUMhjei; @@ -279,8 +279,6 @@ void hicum_diode(duals::duald T, dual_double IS, double UM1, double U, double *I //wrapper for hicum diode equation that also generates derivatives duals::duald result = 0; - // printf("executed diode"); - duals::duald is_t = IS.rpart; result = HICDIO(T.rpart(), is_t, UM1, U+1_e); *Iz = result.rpart(); @@ -409,7 +407,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Vbiei, Vbici, Vciei, Vbpei, Vbpbi, Vbpci, Vsici, Vbci, Vsc; double Vbici_temp, Vaval; - // Model flags + //Model flags int use_aval; //helpers for ngspice implementation @@ -463,7 +461,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Temp; double Tdev_Vrth; //derivative device temperature to Vrth - // below variable has a real part equal to the device temperature and a dual part equal to dTdev/dVrth + //below variable has a real part equal to the device temperature and a dual part equal to dTdev/dVrth //this is necessary, since for some Vrth, HICUM sets Tdev constant (eg very high self heating beyond 300K) //then, dTdev/dVrth=0. Else it is equal to 1. duals::duald Temp_dual; @@ -538,8 +536,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) // Q_fC, Q_CT: actual and ICCR (weighted) hole charge // T_fC, T_cT: actual and ICCR (weighted) transit time // Derivative dfCT_ditf not properly implemented yet - // feenableexcept(FE_INVALID | FE_OVERFLOW); //debuger catches NANS - std::function HICQFC = [&](duals::duald T, duals::duald Ix, duals::duald I_CK, duals::duald FFT_pcS, duals::duald * Q_fC, duals::duald * Q_CT, duals::duald * T_fC, duals::duald * T_cT) { duals::duald FCln, FCa, FCa1, FCd_a, FCw, FCdw_daick, FCda1_dw, FCf_ci, FCdfCT_ditf, FCw2, FCz, FCdfc_dw, FFdVc_ditf, FCf_CT, FCf1, FCf2, FCrt; @@ -895,7 +891,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) } else{ iavl = 0; } - // Note that iavl = 0.0 is already set in the initialization block for use_aval == 0 (Markus: not for this lambda!) return iavl; }; @@ -1086,7 +1081,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) //final calculations afterwards, see later in load where this is called - } //if + } return Q_pT; }; @@ -1149,7 +1144,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) use_aval = 0; } -// end of Model_initialization + // end of Model_initialization /* loop through all the instances of the model */ for (here = HICUMinstances(model); here != NULL ; @@ -1822,10 +1817,6 @@ 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; if (selfheat) { // Thermal_update_with_self_heating Temp = here->HICUMtemp+Vrth; @@ -1999,10 +1990,10 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) here->HICUMtf = Tf; - //NQS effect implemented with LCR networks + //NQS effect implemented with gyrator network //Once the delay in ITF is considered, IT_NQS is calculated afterwards - //Diffusion charges for further use (remember derivatives if this will be used somebday) + //Diffusion charges for further use (remember derivatives if this will be used someday) Qdei = Qf; Qdei_Vbici = Qf_Vbici; Qdei_Vbiei = Qf_Vbiei; @@ -2191,7 +2182,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) // Excess Phase calculation -> hand implementation - if ( nqs){ // && (ckt->CKTmode & (MODETRAN | MODEAC) ) ) { //evaluate nqs network only in TRANSIENT and AC modes. + if (nqs) { // && (ckt->CKTmode & (MODETRAN | MODEAC) ) ) { //evaluate nqs network only in TRANSIENT and AC modes. Ixf1 = (Vxf2-itf)/Tf*model->HICUMt0; Ixf1_Vxf2 = 1.0/Tf*model->HICUMt0; Ixf1_ditf = -Ixf1_Vxf2; @@ -2230,7 +2221,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Qxf = model->HICUMalqf*model->HICUMt0*Vxf; //for RC nw Qxf_Vxf = model->HICUMalqf*model->HICUMt0; //for RC nw - Qdeix = Vxf; //for RC nw + Qdeix = Vxf; //for RC nw Qdeix_Vxf = 1.0; Qdeix_Vbiei = 0; Qdeix_Vbici = 0; @@ -2381,17 +2372,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) } - // Following code is an intermediate solution (if branch contribution is not supported): - // ****************************************** - //if(model->HICUMflsh == 0 || model->HICUMrth_scaled < MIN_R) { - // I[br_sht] <+ Vrth/MIN_R; - //} else { - // I[br_sht] <+ Vrth/rth_t-pterm; - // I[br_sht] <+ ddt(here->HICUMcth_scaled*Vrth]); - //} - - // ****************************************** - + // ******************************************** // For simulators having no problem with Vrth) <+ 0.0 // with external thermal node, following code may be used. // Note that external thermal node should remain accessible From 5afb2dc8c8a2267bbeb0821fe5d917e3f4b2594d Mon Sep 17 00:00:00 2001 From: dwarning Date: Fri, 24 Jul 2020 16:49:11 +0200 Subject: [PATCH 15/39] reduce unnecassary inits --- src/spicelib/devices/hicum2/hicumL2.cpp | 83 +++++++++++++------------ 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index aa9c801dd..c06745ac6 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -359,7 +359,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Cscp_Vsc, Cscp_dT; //Base resistance and self-heating power - double rbi=0,pterm,pterm_dT; + double rbi=0.0,pterm,pterm_dT; //Model initialization double C_1; @@ -382,8 +382,8 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Qr_Vbiei, Qr_Vbici, Qr_dT; duals::duald result_itf, result_itr, result_Qp, result_Qf, result_Qr, result_Q_bf, result_a_h, result_Q_p, result_Tf; //intermediate variables when calling void dual functions double T_f0, Q_p, a_h; - double Q_bf, Q_bf_Vbiei=0, Q_bf_Vbici=0, Q_bf_dT=0; - double Q_pT=0, Q_pT_dVbiei=0, Q_pT_dVbici=0, Q_pT_dT=0; + double Q_bf, Q_bf_Vbiei, Q_bf_Vbici, Q_bf_dT; + double Q_pT, Q_pT_dVbiei, Q_pT_dVbici, Q_pT_dT; double Qf, Cdei, Qr, Cdci; double Cdei_Vbiei, Cdei_Vbici, Cdei_Vrth; double Cdci_Vbiei, Cdci_Vbici, Cdci_Vrth; @@ -391,15 +391,15 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double ick, ick_Vciei, ick_dT;//,cjcx01;//,cjcx02; //NQS - double Ixf1=0,Ixf2=0,Qxf1,Qxf2; - double Ixf1_Vxf1=0, Ixf1_Vxf2=0, Ixf1_ditf=0, Ixf1_dTf, Ixf1_Vbiei=0, Ixf1_Vbici=0, Ixf1_dT=0; - double Ixf2_Vxf1=0, Ixf2_Vbiei=0, Ixf2_Vbici=0, Ixf2_dT=0; - double Ixf_Vxf=0, Ixf_Tf,Ixf_Qdei,Ixf_Vbiei=0, Ixf_Vbici=0, Ixf_dT=0; - double Ixf2_Vxf2=0, Ixf2_dTf; + double Ixf1,Ixf2,Qxf1,Qxf2; + double Ixf1_Vxf1, Ixf1_Vxf2, Ixf1_ditf, Ixf1_dTf, Ixf1_Vbiei, Ixf1_Vbici, Ixf1_dT; + double Ixf2_Vxf1, Ixf2_Vbiei, Ixf2_Vbici, Ixf2_dT; + double Ixf_Vxf, Ixf_Tf,Ixf_Qdei,Ixf_Vbiei, Ixf_Vbici, Ixf_dT; + double Ixf2_Vxf2, Ixf2_dTf; double Itxf, Qdeix; double Itxf_Vxf2, Itxf_Vbici, Itxf_Vbiei, Itxf_dT; double Qdeix_Vxf, Qdeix_dT, Qdeix_Vbici, Qdeix_Vbiei; - double Qxf, Ixf=0, Vxf; + double Qxf, Ixf, Vxf; double Vxf1, Vxf2; double hjei_vbe; @@ -420,7 +420,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) #ifndef PREDICTOR double xfact; #endif - double delvbiei=0.0, delvbici=0.0, delvbpei=0.0, delvbpbi=0.0, delvbpci=0.0, delvsici=0.0, delvbbp=0.0, delveie=0.0, delvciei=0.0, delvcic=0.0, delvxf2=0.0; + double delvbiei, delvbici, delvbpei, delvbpbi, delvbpci, delvsici, delvbbp, delveie, delvciei, delvcic, delvxf2; double ibieihat; double ibpeihat; double icieihat; @@ -430,7 +430,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double isicihat; double ibpsihat; double ithhat; - double ceq, geq=0.0; + double ceq, geq; double rhs_current; int icheck=1; int ichk1, ichk2, ichk3, ichk4, ichk5, ichk6; @@ -440,18 +440,18 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Ibiei, Ibiei_Vbiei, Ibiei_Vbici; double Ibici, Ibici_Vbici, Ibici_Vbiei; double Ibpei, Ibpei_Vbpei; - double Ibpci=0, Ibpci_Vbpci; + double Ibpci, Ibpci_Vbpci; double Isici, Isici_Vsici;// - double Isc=0, Isc_Vsc=0; + double Isc=0.0, Isc_Vsc=0.0; double Iciei, Iciei_Vbiei, Iciei_Vbici, Iciei_Vrth, Iciei_Vxf2; - double Ibbp_Vbbp=0; + double Ibbp_Vbbp=0.0; double Isis_Vsis; - double Ieie, Ieie_Veie=0; + double Ieie, Ieie_Veie=0.0; double Ibpbi, Ibpbi_Vbpbi, Ibpbi_Vbici, Ibpbi_Vbiei; - double Ibpsi, Ibpsi_Vbpci, Ibpsi_Vsici, Ibpsi_Vrth=0; - double Icic_Vcic=0; - double Ibci=0, Ibci_Vbci=0; - double hjei_vbe_Vbiei, hjei_vbe_dT, ibet_Vbpei=0.0, ibet_dT=0, ibet_Vbiei=0.0, ibh_rec_Vbiei, ibh_rec_dT, ibh_rec_Vbici; + double Ibpsi, Ibpsi_Vbpci, Ibpsi_Vsici, Ibpsi_Vrth; + double Icic_Vcic=0.0; + double Ibci=0.0, Ibci_Vbci=0.0; + double hjei_vbe_Vbiei, hjei_vbe_dT, ibet_Vbpei, ibet_dT, ibet_Vbiei, ibh_rec_Vbiei, ibh_rec_dT, ibh_rec_Vbici; double irei_Vbiei, irei_dT; double ibep_Vbpei, ibep_dT; double irep_Vbpei, irep_dT, rbi_dT, rbi_Vbiei, rbi_Vbici; @@ -463,7 +463,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Tdev_Vrth; //derivative device temperature to Vrth //below variable has a real part equal to the device temperature and a dual part equal to dTdev/dVrth //this is necessary, since for some Vrth, HICUM sets Tdev constant (eg very high self heating beyond 300K) - //then, dTdev/dVrth=0. Else it is equal to 1. + //then, dTdev/dVrth. Else it is equal to 1. duals::duald Temp_dual; double Cjei_Vbiei,Cjci_Vbici,Cjep_Vbpei,Cjep_dT,Cjs_Vsici; @@ -498,30 +498,30 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) //NQS double Qxf_Vxf, Qxf1_Vxf1, Qxf2_Vxf2; - double Ith=0, Vrth=0, Icth, Icth_Vrth, delvrth; + double Ith=0.0, Vrth=0.0, Icth, Icth_Vrth, delvrth; - double Ibiei_Vrth=0; - double Ibici_Vrth=0; - double Ibpei_Vrth=0; - double Ibpci_Vrth=0; - double Isici_Vrth=0; - double Ibpbi_Vrth=0; - double Ieie_Vrth=0; - double Icic_Vrth=0; - double Ibbp_Vrth=0; + double Ibiei_Vrth; + double Ibici_Vrth; + double Ibpei_Vrth; + double Ibpci_Vrth; + double Isici_Vrth; + double Ibpbi_Vrth; + double Ieie_Vrth; + double Icic_Vrth=0.0; + double Ibbp_Vrth=0.0; - double Ith_Vrth =0; - double Ith_Vciei=0; - double Ith_Vbiei=0; - double Ith_Vbici=0; - double Ith_Vbpei=0; - double Ith_Vbpci=0; + double Ith_Vrth=0.0; + double Ith_Vciei=0.0; + double Ith_Vbiei=0.0; + double Ith_Vbici=0.0; + double Ith_Vbpei=0.0; + double Ith_Vbpci=0.0; - double Ith_Vsici=0; - double Ith_Vbpbi=0; - double Ith_Veie =0; - double Ith_Vcic =0; - double Ith_Vbbp =0; + double Ith_Vsici=0.0; + double Ith_Vbpbi=0.0; + double Ith_Veie=0.0; + double Ith_Vcic=0.0; + double Ith_Vbbp=0.0; // COLLECTOR CURRENT SPREADING CALCULATION // collector minority charge incl. 2D/3D current spreading (TED 10/96) @@ -2184,6 +2184,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) if (nqs) { // && (ckt->CKTmode & (MODETRAN | MODEAC) ) ) { //evaluate nqs network only in TRANSIENT and AC modes. Ixf1 = (Vxf2-itf)/Tf*model->HICUMt0; + Ixf1_Vxf1 = 0.0; Ixf1_Vxf2 = 1.0/Tf*model->HICUMt0; Ixf1_ditf = -Ixf1_Vxf2; Ixf1_dTf = -Ixf1/Tf; //Tf(Vbiei,Vciei=Vbiei-Vbici) From 162b174acd958fbbbd9de7874252ba264f9c5e55 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sat, 25 Jul 2020 12:31:05 +0200 Subject: [PATCH 16/39] add few small-signal parameter --- src/spicelib/devices/hicum2/hicumL2.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index c06745ac6..d653593ae 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -2580,12 +2580,16 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) here->HICUMqscp_Vrth = Qscp_dT; here->HICUMicth_dT = Icth_Vrth; - // store all derivatives of charges + /* + * store small-signal parameters + */ if ( (!(ckt->CKTmode & MODETRANOP))|| (!(ckt->CKTmode & MODEUIC)) ) { if(ckt->CKTmode & MODEINITSMSIG) { + *(ckt->CKTstate0 + here->HICUMcqrbi) = Qrbi_Vbpbi; *(ckt->CKTstate0 + here->HICUMcqf) = Qdeix_Vbiei; + *(ckt->CKTstate0 + here->HICUMcqr) = Qr_Vbici; *(ckt->CKTstate0 + here->HICUMcqjei) = Cjei; *(ckt->CKTstate0 + here->HICUMcqjci) = Cjci; From d735f445e5c38697c8ade7bce4d41a0d0486253c Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Sun, 26 Jul 2020 12:13:39 +0200 Subject: [PATCH 17/39] removed rbi fallback, removed rth_de --- src/spicelib/devices/hicum2/hicum2.c | 1 - src/spicelib/devices/hicum2/hicum2conv.c | 10 +--- src/spicelib/devices/hicum2/hicum2defs.h | 2 - src/spicelib/devices/hicum2/hicum2mask.c | 3 - src/spicelib/devices/hicum2/hicum2mpar.c | 4 -- src/spicelib/devices/hicum2/hicum2setup.c | 2 - src/spicelib/devices/hicum2/hicumL2.cpp | 72 ++++++----------------- 7 files changed, 20 insertions(+), 74 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2.c b/src/spicelib/devices/hicum2/hicum2.c index 03f04ba54..cabec5e29 100644 --- a/src/spicelib/devices/hicum2/hicum2.c +++ b/src/spicelib/devices/hicum2/hicum2.c @@ -273,7 +273,6 @@ IFparm HICUMmPTable[] = { /* model parameters */ //Self-Heating IOP("flsh", HICUM_MOD_FLSH , IF_INTEGER, "Flag for turning on and off self-heating effect"), - IOP("rth_de", HICUM_MOD_RTH_DE , IF_INTEGER, "Experimental flag for turning on and off self-heating using direct evaluation"), IOP("rth", HICUM_MOD_RTH , IF_REAL, "Thermal resistance"), IOP("zetarth", HICUM_MOD_ZETARTH, IF_REAL, "Temperature coefficient for Rth"), IOP("alrth", HICUM_MOD_ALRTH , IF_REAL, "First order relative TC of parameter Rth"), diff --git a/src/spicelib/devices/hicum2/hicum2conv.c b/src/spicelib/devices/hicum2/hicum2conv.c index 9c4adf88d..421c909f6 100644 --- a/src/spicelib/devices/hicum2/hicum2conv.c +++ b/src/spicelib/devices/hicum2/hicum2conv.c @@ -83,15 +83,9 @@ HICUMconvTest(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTrhsOld+here->HICUMemitEINode)); Vciei = Vbiei - Vbici; - //model->HICUMrth_de - if (model->HICUMrth_de==1) { - Vrth = *(ckt->CKTstate0 + here->HICUMith)*here->HICUMrth_t.rpart; - delvrth = 0; - } else { - Vrth = model->HICUMtype*(*(ckt->CKTrhsOld+here->HICUMtempNode)); - delvrth = Vrth - *(ckt->CKTstate0 + here->HICUMvrth); - } + Vrth = model->HICUMtype*(*(ckt->CKTrhsOld+here->HICUMtempNode)); + delvrth = Vrth - *(ckt->CKTstate0 + here->HICUMvrth); delvbiei = Vbiei - *(ckt->CKTstate0 + here->HICUMvbiei); delvbici = Vbici - *(ckt->CKTstate0 + here->HICUMvbici); delvbpei = Vbpei - *(ckt->CKTstate0 + here->HICUMvbpei); diff --git a/src/spicelib/devices/hicum2/hicum2defs.h b/src/spicelib/devices/hicum2/hicum2defs.h index fa8745a55..0a864dde5 100644 --- a/src/spicelib/devices/hicum2/hicum2defs.h +++ b/src/spicelib/devices/hicum2/hicum2defs.h @@ -703,7 +703,6 @@ typedef struct sHICUMmodel { /* model structure for a hicum */ //Self-Heating int HICUMflsh; - int HICUMrth_de; double HICUMrth; double HICUMzetarth; double HICUMalrth; @@ -1084,7 +1083,6 @@ enum { //Self-Heating HICUM_MOD_FLSH, - HICUM_MOD_RTH_DE, HICUM_MOD_RTH, HICUM_MOD_ZETARTH, HICUM_MOD_ALRTH, diff --git a/src/spicelib/devices/hicum2/hicum2mask.c b/src/spicelib/devices/hicum2/hicum2mask.c index c4fed2a67..efffde670 100644 --- a/src/spicelib/devices/hicum2/hicum2mask.c +++ b/src/spicelib/devices/hicum2/hicum2mask.c @@ -461,9 +461,6 @@ HICUMmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value) case HICUM_MOD_FLSH: value->iValue = model->HICUMflsh; return(OK); - case HICUM_MOD_RTH_DE: - value->iValue = model->HICUMrth_de; - return(OK); case HICUM_MOD_RTH: value->rValue = model->HICUMrth; return(OK); diff --git a/src/spicelib/devices/hicum2/hicum2mpar.c b/src/spicelib/devices/hicum2/hicum2mpar.c index 57be1ad19..a054b3b3f 100644 --- a/src/spicelib/devices/hicum2/hicum2mpar.c +++ b/src/spicelib/devices/hicum2/hicum2mpar.c @@ -590,10 +590,6 @@ HICUMmParam(int param, IFvalue *value, GENmodel *inModel) model->HICUMflsh = value->iValue; model->HICUMflshGiven = TRUE; break; - case HICUM_MOD_RTH_DE: - model->HICUMrth_de = value->iValue; - model->HICUMrth_deGiven = TRUE; - break; case HICUM_MOD_RTH: model->HICUMrth = value->rValue; model->HICUMrthGiven = TRUE; diff --git a/src/spicelib/devices/hicum2/hicum2setup.c b/src/spicelib/devices/hicum2/hicum2setup.c index 4cb1657c5..565a3abf4 100644 --- a/src/spicelib/devices/hicum2/hicum2setup.c +++ b/src/spicelib/devices/hicum2/hicum2setup.c @@ -445,8 +445,6 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) //Self-Heating if(!model->HICUMflshGiven) model->HICUMflsh = 0; - if(!model->HICUMrth_deGiven) - model->HICUMrth_de = 0; if(!model->HICUMrthGiven) model->HICUMrth = 0.0; diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index d653593ae..010e53e20 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -1219,11 +1219,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); Vxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); if (selfheat) { - if (model->HICUMrth_de == 1) { - Vrth = *(ckt->CKTstate0 + here->HICUMith)*here->HICUMrth_t.rpart; - } else { - Vrth = *(ckt->CKTstate0 + here->HICUMvrth); - } + Vrth = *(ckt->CKTstate0 + here->HICUMvrth); } } else if(ckt->CKTmode & MODEINITTRAN) { Vbiei = *(ckt->CKTstate1 + here->HICUMvbiei); @@ -1262,11 +1258,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); Vxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); if (selfheat) { - if (model->HICUMrth_de == 1) { - Vrth = *(ckt->CKTstate1 + here->HICUMith)*here->HICUMrth_t.rpart; - } else { - Vrth = *(ckt->CKTstate1 + here->HICUMvrth); - } + Vrth = *(ckt->CKTstate1 + here->HICUMvrth); } } else if((ckt->CKTmode & MODEINITJCT) && (ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)){ @@ -1510,11 +1502,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); Vciei = Vbiei - Vbici; if (selfheat) { - if (model->HICUMrth_de==1) { - Vrth = *(ckt->CKTstate0 + here->HICUMith)*here->HICUMrth_t.rpart; - } else { - Vrth = *(ckt->CKTrhsOld + here->HICUMtempNode); - } + Vrth = *(ckt->CKTrhsOld + here->HICUMtempNode); } #ifndef PREDICTOR @@ -1567,11 +1555,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); Vxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); if (selfheat) { - if (model->HICUMrth_de==1) { - Vrth = *(ckt->CKTstate0 + here->HICUMith)*here->HICUMrth_t.rpart; - } else { - Vrth = *(ckt->CKTrhsOld + here->HICUMtempNode); - } + Vrth = *(ckt->CKTrhsOld + here->HICUMtempNode); } ibieihat = *(ckt->CKTstate0 + here->HICUMibiei) + *(ckt->CKTstate0 + here->HICUMibiei_Vbiei)*delvbiei+ @@ -1778,20 +1762,20 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vbiei = DEVpnjlim(Vbiei,*(ckt->CKTstate0 + here->HICUMvbiei),here->HICUMvt.rpart, here->HICUMtVcrit,&icheck); Vaval = 3 * here->HICUMvdci_t.rpart;//limit step around 3*vdci_t -> somehow this brings convergence - if ((model->HICUMkavlGiven) && (Vbici < MIN(0, -Vaval))) { - Vbici_temp = -(Vbici + Vaval); - Vbici_temp = DEVpnjlim( - Vbici_temp, - -(*(ckt->CKTstate0 + here->HICUMvbici) + Vaval), - here->HICUMvt.rpart, - here->HICUMtVcrit, - &ichk1 - ); - Vbici = -(Vbici_temp + Vaval); - } else { + // if ((model->HICUMkavlGiven) && (Vbici < MIN(0, -Vaval))) { + // Vbici_temp = -(Vbici + Vaval); + // Vbici_temp = DEVpnjlim( + // Vbici_temp, + // -(*(ckt->CKTstate0 + here->HICUMvbici) + Vaval), + // here->HICUMvt.rpart, + // here->HICUMtVcrit, + // &ichk1 + // ); + // Vbici = -(Vbici_temp + Vaval); + // } else { Vbici = DEVpnjlim(Vbici,*(ckt->CKTstate0 + here->HICUMvbici),here->HICUMvt.rpart, here->HICUMtVcrit,&ichk1); - } + //} Vbpei = DEVpnjlim(Vbpei,*(ckt->CKTstate0 + here->HICUMvbpei),here->HICUMvt.rpart, here->HICUMtVcrit,&ichk2); Vbpci = DEVpnjlim(Vbpci,*(ckt->CKTstate0 + here->HICUMvbpci),here->HICUMvt.rpart, @@ -1982,10 +1966,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) it_Vbici = itf_Vbici - itr_Vbici; it_dT = itf_dT - itr_dT; - if (isnan(it)) { - it=0; - } - //end final calculations -------------------------------------------------- here->HICUMtf = Tf; @@ -2355,23 +2335,14 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Ibpbi_Vbiei = -Vbpbi * rbi_Vbiei / (rbi*rbi); Ibpbi_Vbici = -Vbpbi * rbi_Vbici / (rbi*rbi); Ibpbi_Vrth = -Vbpbi * rbi_dT / (rbi*rbi); - } else if(rbi >0.0 ) { + } else { // fallback in case rbi is low Ibpbi = Vbpbi / MIN_R; Ibpbi_Vbpbi = 1 / MIN_R; Ibpbi_Vbiei = 0; Ibpbi_Vbici = 0; Ibpbi_Vrth = 0; - } - else { - // fallback in case rbi is not zero, but smaller than MIN_R - Ibpbi = 0; - Ibpbi_Vbpbi = 0; - Ibpbi_Vbiei = 0; - Ibpbi_Vbici = 0; - Ibpbi_Vrth = 0; - } - + }; // ******************************************** // For simulators having no problem with Vrth) <+ 0.0 @@ -2392,8 +2363,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Ith_Vrth = 0.0; if(!selfheat) { Ith = 0; - } else if (model->HICUMrth_de==1) { - Ith = -Vrth/here->HICUMrth_t.rpart+pterm; //Current from gnd to T } else { Ith = -Vrth/here->HICUMrth_t.rpart+pterm; //Current from gnd to T @@ -3212,10 +3181,6 @@ load: if (selfheat) { - if (model->HICUMrth_de == 1) { - *(here->HICUMtempTempPtr) += 1; - *(ckt->CKTrhs + here->HICUMtempNode) += Vrth; - } else { // ############################################################# // ############### STAMP WITH SH ADDITIONS ##################### // ############################################################# @@ -3387,7 +3352,6 @@ load: *(here->HICUMtempEmitEIPtr) += -Ith_Veie; *(here->HICUMtempEmitPtr) += +Ith_Veie; // finish - } } } From 724887f32c8ef18c415f252e77cb11a5477d9d8b Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Sun, 26 Jul 2020 12:45:15 +0200 Subject: [PATCH 18/39] add ngspice Temperature clipping in HICUM --- src/spicelib/devices/hicum2/hicumL2.cpp | 26 ++++++------ src/spicelib/devices/hicum2/hicumL2temp.cpp | 46 +++++++++++++++------ 2 files changed, 47 insertions(+), 25 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 010e53e20..09f440dc0 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -1762,20 +1762,20 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vbiei = DEVpnjlim(Vbiei,*(ckt->CKTstate0 + here->HICUMvbiei),here->HICUMvt.rpart, here->HICUMtVcrit,&icheck); Vaval = 3 * here->HICUMvdci_t.rpart;//limit step around 3*vdci_t -> somehow this brings convergence - // if ((model->HICUMkavlGiven) && (Vbici < MIN(0, -Vaval))) { - // Vbici_temp = -(Vbici + Vaval); - // Vbici_temp = DEVpnjlim( - // Vbici_temp, - // -(*(ckt->CKTstate0 + here->HICUMvbici) + Vaval), - // here->HICUMvt.rpart, - // here->HICUMtVcrit, - // &ichk1 - // ); - // Vbici = -(Vbici_temp + Vaval); - // } else { + if ((model->HICUMkavlGiven) && (Vbici < MIN(0, -Vaval))) { + Vbici_temp = -(Vbici + Vaval); + Vbici_temp = DEVpnjlim( + Vbici_temp, + -(*(ckt->CKTstate0 + here->HICUMvbici) + Vaval), + here->HICUMvt.rpart, + here->HICUMtVcrit, + &ichk1 + ); + Vbici = -(Vbici_temp + Vaval); + } else { Vbici = DEVpnjlim(Vbici,*(ckt->CKTstate0 + here->HICUMvbici),here->HICUMvt.rpart, here->HICUMtVcrit,&ichk1); - //} + } Vbpei = DEVpnjlim(Vbpei,*(ckt->CKTstate0 + here->HICUMvbpei),here->HICUMvt.rpart, here->HICUMtVcrit,&ichk2); Vbpci = DEVpnjlim(Vbpci,*(ckt->CKTstate0 + here->HICUMvbpci),here->HICUMvt.rpart, @@ -1786,7 +1786,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) here->HICUMtVcrit,&ichk5); if (selfheat) { Vrth = HICUMlimitlog(Vrth, - *(ckt->CKTstate0 + here->HICUMvrth),10,&ichk6); + *(ckt->CKTstate0 + here->HICUMvrth),1,&ichk6); } if ((ichk1 == 1) || (ichk2 == 1) || (ichk3 == 1) || (ichk4 == 1) || (ichk5 == 1) || (ichk6 == 1)) icheck=1; } diff --git a/src/spicelib/devices/hicum2/hicumL2temp.cpp b/src/spicelib/devices/hicum2/hicumL2temp.cpp index c5c2f93f9..d77b068db 100644 --- a/src/spicelib/devices/hicum2/hicumL2temp.cpp +++ b/src/spicelib/devices/hicum2/hicumL2temp.cpp @@ -38,6 +38,19 @@ using namespace duals::literals; #define TMIN -100.0 #define LN_EXP_LIMIT 11.0 +duals::duald clip_temperature(duals::duald T){ + // smooth clipping function for device temperature, if self heating increases temperature beyond + // T0+TMAX or below T0-TMIN + duals::duald Tdev; + Tdev = T; + if (T<(TMIN+CONSTCtoK+1.0)){ + Tdev = TMIN+CONSTCtoK+exp(T-TMIN-CONSTCtoK-1.0); + } else if (T>(TMAX+CONSTCtoK-1.0)) { + Tdev = TMAX+CONSTCtoK-exp(TMAX+CONSTCtoK-T-1.0); + }; + return Tdev; +}; + void TMPHICJ(double , double , double , double , double , double , double , double , double , double , double , double *, double *, double *); @@ -157,20 +170,29 @@ int hicum_thermal_update(HICUMmodel *inModel, HICUMinstance *inInstance, double zetabcxt= mg+1-model->HICUMzetacx; zetasct = mg-1.5; - // Limit temperature to avoid FPEs in equations - *(Tdev_Vrth) = 1.0; - if(*(HICUMTemp) < TMIN + CONSTCtoK) { - *(HICUMTemp) = TMIN + CONSTCtoK; - *(Tdev_Vrth) = 0.0; - } else { - if (*(HICUMTemp) > TMAX + CONSTCtoK) { - *(HICUMTemp) = TMAX + CONSTCtoK; - *(Tdev_Vrth) = 0.0; - } - } + + + // Smooth ngspice T clipping + temp = clip_temperature( *(HICUMTemp)+1_e ); + *(HICUMTemp) = temp.rpart(); + *(Tdev_Vrth) = temp.dpart(); + + // original HICUM clipping for Tdev => left here for reference + // *(Tdev_Vrth) = 1.0; + // if(*(HICUMTemp) < TMIN + CONSTCtoK) { + // *(HICUMTemp) = TMIN + CONSTCtoK; + // *(Tdev_Vrth) = 0.0; + // } else { + // if (*(HICUMTemp) > TMAX + CONSTCtoK) { + // *(HICUMTemp) = TMAX + CONSTCtoK; + // *(Tdev_Vrth) = 0.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 + //temp = *(HICUMTemp)+1_e* *(Tdev_Vrth); // dual number device temperature + vt = temp*CONSTKoverQ; // dual valued temperature voltage here->HICUMvt0 = Tnom * CONSTKoverQ; From 556171a905026e08a887763b22420e8a82d6c987 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sun, 26 Jul 2020 16:36:15 +0200 Subject: [PATCH 19/39] rbi is 0 if nodes are collapsed --- src/spicelib/devices/hicum2/hicumL2.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 09f440dc0..59253c5bd 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -2127,7 +2127,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) pterm_dT = (Vbiei-Vbici)*it_dT + (here->HICUMvdci_t.rpart-Vbici)*iavl_dT + here->HICUMvdci_t.dpart*iavl + ibei_dT*Vbiei + ibci_dT*Vbici + ibep_dT*Vbpei + ijbcx_dT*Vbpci + ijsc_Vrth*Vsici; - if (rbi >= MIN_R) { + if (rbi > 0.0) { pterm += Vbpbi*Vbpbi/rbi; pterm_dT += -Vbpbi*Vbpbi*rbi_dT/rbi/rbi; } @@ -2329,19 +2329,19 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Iciei_Vrth = model->HICUMtype*(Itxf_dT - itr_dT); Iciei_Vxf2 = model->HICUMtype*Itxf_Vxf2; - if (rbi >= MIN_R) { + if (rbi > 0.0) { Ibpbi = Vbpbi / rbi; Ibpbi_Vbpbi = 1 / rbi; Ibpbi_Vbiei = -Vbpbi * rbi_Vbiei / (rbi*rbi); Ibpbi_Vbici = -Vbpbi * rbi_Vbici / (rbi*rbi); Ibpbi_Vrth = -Vbpbi * rbi_dT / (rbi*rbi); } else { - // fallback in case rbi is low - Ibpbi = Vbpbi / MIN_R; - Ibpbi_Vbpbi = 1 / MIN_R; - Ibpbi_Vbiei = 0; - Ibpbi_Vbici = 0; - Ibpbi_Vrth = 0; + // fallback in case bp-bi nodes are collapsed + Ibpbi = 0.0; + Ibpbi_Vbpbi = 0.0; + Ibpbi_Vbiei = 0.0; + Ibpbi_Vbici = 0.0; + Ibpbi_Vrth = 0.0; }; // ******************************************** @@ -2395,7 +2395,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Ith_Vbpci += Ibpci + Ibpci_Vbpci*Vbpci; //Vsici*Isici(Vsici) Ith_Vsici += Isici + Isici_Vsici*Vsici; - if (rbi >= MIN_R) { + if (rbi > 0.0) { //Vbpbi*Ibpbi(Vbpbi,Vbiei,Vbici) Ith_Vbpbi += Ibpbi + Ibpbi_Vbpbi*Vbpbi; Ith_Vbiei += Ibpbi_Vbiei*Vbpbi; @@ -3083,7 +3083,7 @@ load: *(here->HICUMemitEmitEIPtr) += -Ieie_Veie; // finish - if (rbi>0.0) { + if (rbi > 0.0) { // Branch: bpbi, Stamp element: Rbi, Crbi rhs_current = model->HICUMtype * (Ibpbi - Ibpbi_Vbpbi*Vbpbi - Ibpbi_Vbiei*Vbiei - Ibpbi_Vbici*Vbici); *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; @@ -3257,7 +3257,7 @@ load: *(here->HICUMemitTempPtr) += -Ieie_Vrth; // finish - if (rbi>0.0) { + if (rbi > 0.0) { // Stamp element: Rbi f_Bp = + f_Bi = - rhs_current = -Ibpbi_Vrth*Vrth; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; From 5901ec29024172180f235b138373d8b92ca52438 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sun, 26 Jul 2020 16:37:44 +0200 Subject: [PATCH 20/39] sign for CONSTCtoK must be + --- src/spicelib/devices/hicum2/hicumL2temp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spicelib/devices/hicum2/hicumL2temp.cpp b/src/spicelib/devices/hicum2/hicumL2temp.cpp index d77b068db..d0897bb87 100644 --- a/src/spicelib/devices/hicum2/hicumL2temp.cpp +++ b/src/spicelib/devices/hicum2/hicumL2temp.cpp @@ -44,7 +44,7 @@ duals::duald clip_temperature(duals::duald T){ duals::duald Tdev; Tdev = T; if (T<(TMIN+CONSTCtoK+1.0)){ - Tdev = TMIN+CONSTCtoK+exp(T-TMIN-CONSTCtoK-1.0); + Tdev = TMIN+CONSTCtoK+exp(T-TMIN+CONSTCtoK-1.0); } else if (T>(TMAX+CONSTCtoK-1.0)) { Tdev = TMAX+CONSTCtoK-exp(TMAX+CONSTCtoK-T-1.0); }; From f47bc449b319786daa8f35d6a753876107c60b73 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sun, 26 Jul 2020 21:56:48 +0200 Subject: [PATCH 21/39] few parameter adaptions to version 2.40 --- examples/hicum2/model-card-examples.lib | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/examples/hicum2/model-card-examples.lib b/examples/hicum2/model-card-examples.lib index 0b2c2466c..06a17b971 100644 --- a/examples/hicum2/model-card-examples.lib +++ b/examples/hicum2/model-card-examples.lib @@ -9,19 +9,17 @@ + hfe = 10.01 + hfc = 20.04 + hjei = 3.382 -+ hjci = 0.2 + ahjei = 3 + rhjei = 2 ++ hjci = 0.2 * *Base-Emitter diode currents + ibeis = 1.328e-019 + mbei = 1.027 -*+ ireis = 1.5e-014 + ireis = 1.5e-015 + mrei = 2 + ibeps = 1.26e-019 + mbep = 1.042 -*+ ireps = 1.8e-014 + ireps = 1.8e-015 + mrep = 1.8 + mcf = 1 @@ -59,7 +57,6 @@ + rcx = 2.483 * *Substrate transistor -*+ itss = 1.143e-019 + itss = 1.143e-017 + msf = 1.056 + iscs = 4.60106e-015 @@ -111,11 +108,12 @@ + vlim = 0.6999 + vces = 0.01 + vpt = 2 ++ aick = 1e-3 + delck = 2 + tr = 0 -+ acbar = 1.5 -+ icbar = 0.01 + vcbar = 0.04 ++ icbar = 0.01 ++ acbar = 1.5 * *Isolation Capacitances + cbepar = 2.609e-014 @@ -131,10 +129,12 @@ + af = .75 + cfbe = -1 + flcono = 0 ++ kfre = 0.0 ++ afre = 2.0 * *Lateral Geometry Scaling (at high current densities) -+ latb = 0 -+ latl = 0 ++ latb = 0.0 ++ latl = 0.0 * *Temperature dependence + vgb = 0.91 @@ -156,6 +156,7 @@ + zetact = 5 + zetabet = 4.892 + alb = 0 ++ dvgbe = 0 + zetahjei = -0.5 + zetavgbe = 0.7 * From 4a472a34516638b54bc04d6e8386b5e145df2065 Mon Sep 17 00:00:00 2001 From: dwarning Date: Mon, 27 Jul 2020 15:34:15 +0200 Subject: [PATCH 22/39] correct the switch for Vbici limiting --- src/spicelib/devices/hicum2/hicumL2.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 59253c5bd..2fcaf01fc 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -868,7 +868,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) av = favl_t*exp(-v_q/U0); avl = av*(U0+(1.0+v_q/U0)*(v_bord-U0)); } else { - avl = favl_t*v_bord*exp(-v_q/v_bord); + avl = favl_t * v_bord * exp(-v_q / v_bord); } /* This model turns strong avalanche on. The parameter kavl can turn this * model extension off (kavl = 0). Although this is numerically stable, a @@ -1762,7 +1762,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vbiei = DEVpnjlim(Vbiei,*(ckt->CKTstate0 + here->HICUMvbiei),here->HICUMvt.rpart, here->HICUMtVcrit,&icheck); Vaval = 3 * here->HICUMvdci_t.rpart;//limit step around 3*vdci_t -> somehow this brings convergence - if ((model->HICUMkavlGiven) && (Vbici < MIN(0, -Vaval))) { + if ((model->HICUMfavlGiven) && (Vbici < MIN(0, -Vaval))) { Vbici_temp = -(Vbici + Vaval); Vbici_temp = DEVpnjlim( Vbici_temp, From c76bcc7cca603f6e6d48c36f4e5a8eb497738396 Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 30 Jul 2020 12:36:30 +0200 Subject: [PATCH 23/39] delete base nodes from inner to outer --- src/spicelib/devices/hicum2/hicum2setup.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2setup.c b/src/spicelib/devices/hicum2/hicum2setup.c index 565a3abf4..646d298e3 100644 --- a/src/spicelib/devices/hicum2/hicum2setup.c +++ b/src/spicelib/devices/hicum2/hicum2setup.c @@ -815,6 +815,11 @@ HICUMunsetup( CKTdltNNum(ckt, here->HICUMcollCINode); here->HICUMcollCINode = 0; + if (here->HICUMbaseBINode > 0 + && here->HICUMbaseBPNode != here->HICUMbaseBINode) + CKTdltNNum(ckt, here->HICUMbaseBINode); + here->HICUMbaseBINode = 0; + if (here->HICUMbaseBPNode > 0 && here->HICUMbaseBPNode != here->HICUMbaseNode) CKTdltNNum(ckt, here->HICUMbaseBPNode); @@ -830,11 +835,6 @@ HICUMunsetup( CKTdltNNum(ckt, here->HICUMsubsSINode); here->HICUMsubsSINode = 0; - if (here->HICUMbaseBINode > 0 - && here->HICUMbaseBPNode != here->HICUMbaseBINode) - CKTdltNNum(ckt, here->HICUMbaseBINode); - here->HICUMbaseBINode = 0; - if (selfheat) { if (here->HICUMtempNode > 5) { // it is an internal node CKTdltNNum(ckt, here->HICUMtempNode); From 4a9dc52037ef14d2e17f5073d3f8e2b7ed94dab8 Mon Sep 17 00:00:00 2001 From: dwarning Date: Fri, 31 Jul 2020 10:00:20 +0200 Subject: [PATCH 24/39] twice assignment --- src/spicelib/devices/hicum2/hicumL2.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 2fcaf01fc..3f7086c52 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -2527,7 +2527,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) here->HICUMcapscp = Cscp; here->HICUMcapsu = model->HICUMcsu; here->HICUMcapcth = here->HICUMcth_scaled; - here->HICUMcapscp = Cscp; //derivatives of charges due to cross coupling here->HICUMqrbi_Vbiei = Qrbi_Vbiei; From cff491feca5d3bce0dc2e5b7fce5dd8f47961b76 Mon Sep 17 00:00:00 2001 From: dwarning Date: Fri, 31 Jul 2020 10:59:52 +0200 Subject: [PATCH 25/39] wrong and twice assignment --- src/spicelib/devices/hicum2/hicumL2.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 3f7086c52..9b0b1f19d 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -2605,8 +2605,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate0 + here->HICUMqjs) ; *(ckt->CKTstate1 + here->HICUMqscp) = *(ckt->CKTstate0 + here->HICUMqscp) ; - *(ckt->CKTstate1 + here->HICUMcqscp) = - *(ckt->CKTstate0 + here->HICUMcqscp) ; *(ckt->CKTstate1 + here->HICUMqbepar1) = *(ckt->CKTstate0 + here->HICUMqbepar1) ; *(ckt->CKTstate1 + here->HICUMqbepar2) = @@ -2736,8 +2734,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate0 + here->HICUMcqdsu) ; *(ckt->CKTstate1 + here->HICUMcqjs) = *(ckt->CKTstate0 + here->HICUMcqjs) ; - *(ckt->CKTstate1 + here->HICUMcqscp) = - *(ckt->CKTstate0 + here->HICUMcqscp) ; *(ckt->CKTstate1 + here->HICUMcqscp) = *(ckt->CKTstate0 + here->HICUMcqscp) ; *(ckt->CKTstate1 + here->HICUMcqxf1) = From 1f13d2526fb833a5061353de1a447ec02a16ee0a Mon Sep 17 00:00:00 2001 From: dwarning Date: Fri, 31 Jul 2020 11:29:25 +0200 Subject: [PATCH 26/39] visualc mod - no impact to hicum --- visualc/vngspice.vcxproj | 17 ++++++++++++----- visualc/xspice/cmpp/cmpp.vcxproj | 14 ++++++++++++-- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/visualc/vngspice.vcxproj b/visualc/vngspice.vcxproj index d65bba7b1..3a5b21a8d 100644 --- a/visualc/vngspice.vcxproj +++ b/visualc/vngspice.vcxproj @@ -1344,11 +1344,6 @@ - - invoke win_bison.exe for %(Identity) - ..\..\flex-bison\win_bison.exe --output=.\tmp-bison\%(Filename).c --defines=.\tmp-bison\%(Filename).h %(Identity) || exit 1 - .\tmp-bison\%(Filename).c;.\tmp-bison\%(Filename).h - @@ -2726,6 +2721,18 @@ + + + invoke win_bison.exe for %(Identity) + ..\..\flex-bison\win_bison.exe --output=.\tmp-bison\%(Filename).c --defines=.\tmp-bison\%(Filename).h %(Identity) || exit 1 + .\tmp-bison\%(Filename).c;.\tmp-bison\%(Filename).h + + + invoke win_bison.exe for %(Identity) + ..\..\flex-bison\win_bison.exe --output=.\tmp-bison\%(Filename).c --defines=.\tmp-bison\%(Filename).h %(Identity) || exit 1 + .\tmp-bison\%(Filename).c;.\tmp-bison\%(Filename).h + + diff --git a/visualc/xspice/cmpp/cmpp.vcxproj b/visualc/xspice/cmpp/cmpp.vcxproj index 45cecc0ec..b48535c12 100644 --- a/visualc/xspice/cmpp/cmpp.vcxproj +++ b/visualc/xspice/cmpp/cmpp.vcxproj @@ -155,16 +155,26 @@ - + + invoke win_flex.exe for %(Identity) + ..\..\..\..\flex-bison\win_flex.exe --outfile=.\tmp-bison\%(Filename).c --header-file=.\tmp-bison\%(Filename).h %(Identity) || exit 1 + .\tmp-bison\%(Filename).c;.\tmp-bison\%(Filename).h + + invoke win_bison.exe for %(Identity) ..\..\..\..\flex-bison\win_bison.exe --output=.\tmp-bison\%(Filename).c --defines=.\tmp-bison\%(Filename).h %(Identity) || exit 1 .\tmp-bison\%(Filename).c;.\tmp-bison\%(Filename).h - + invoke win_flex.exe for %(Identity) ..\..\..\..\flex-bison\win_flex.exe --outfile=.\tmp-bison\%(Filename).c --header-file=.\tmp-bison\%(Filename).h %(Identity) || exit 1 .\tmp-bison\%(Filename).c;.\tmp-bison\%(Filename).h + + invoke win_bison.exe for %(Identity) + ..\..\..\..\flex-bison\win_bison.exe --output=.\tmp-bison\%(Filename).c --defines=.\tmp-bison\%(Filename).h %(Identity) || exit 1 + .\tmp-bison\%(Filename).c;.\tmp-bison\%(Filename).h + From dd84b1fcd3f8db4db184e9d4fd2c368f8415a16c Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Fri, 31 Jul 2020 14:22:16 +0200 Subject: [PATCH 27/39] fix bug in Cscp stamp --- src/spicelib/devices/hicum2/hicumL2.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 9b0b1f19d..400bc0524 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -2907,9 +2907,9 @@ load: *(ckt->CKTrhs + here->HICUMcollNode) += rhs_current; // with respect to Vsc *(here->HICUMsubsSubsPtr) += Isc_Vsc; - *(here->HICUMsubsCollPtr) += Isc_Vsc; + *(here->HICUMcollCollPtr) += Isc_Vsc; + *(here->HICUMsubsCollPtr) += -Isc_Vsc; *(here->HICUMcollSubsPtr) += -Isc_Vsc; - *(here->HICUMcollCollPtr) += -Isc_Vsc; // finish // Branch: bci, Stamp element: Qbcx From 26e026e4c80cb8cbb8345882444cd69a6539713d Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Fri, 31 Jul 2020 14:36:34 +0200 Subject: [PATCH 28/39] fix stamp for Cth --- src/spicelib/devices/hicum2/hicumL2.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 400bc0524..20ce3415e 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -3306,7 +3306,7 @@ load: } // Stamp element: Ith f_T = - Ith - rhs_current = Ith + Icth - Icth_Vrth*Vrth + rhs_current = Ith - Ith_Vbiei*Vbiei - Ith_Vbici*Vbici - Ith_Vciei*Vciei - Ith_Vbpei*Vbpei - Ith_Vbpci*Vbpci - Ith_Vsici*Vsici - Ith_Vbpbi*Vbpbi @@ -3346,6 +3346,13 @@ load: // with respect to Potential Veie *(here->HICUMtempEmitEIPtr) += -Ith_Veie; *(here->HICUMtempEmitPtr) += +Ith_Veie; + +// finish + +// Cth f_T = - (put this separate to Ith to get signs right) + rhs_current = Icth - Vrth * Icth_Vrth; + *(ckt->CKTrhs + here->HICUMtempNode) += -rhs_current; + *(here->HICUMtempTempPtr) += +Icth_Vrth; // finish } } From c1f034869709972633ae04e57a0adbed07b1d9b5 Mon Sep 17 00:00:00 2001 From: dwarning Date: Fri, 31 Jul 2020 18:31:10 +0200 Subject: [PATCH 29/39] still problems in different terminal configurations --- src/spicelib/devices/hicum2/hicum2setup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spicelib/devices/hicum2/hicum2setup.c b/src/spicelib/devices/hicum2/hicum2setup.c index 646d298e3..f2cb167d3 100644 --- a/src/spicelib/devices/hicum2/hicum2setup.c +++ b/src/spicelib/devices/hicum2/hicum2setup.c @@ -836,7 +836,7 @@ HICUMunsetup( here->HICUMsubsSINode = 0; if (selfheat) { - if (here->HICUMtempNode > 5) { // it is an internal node + if (here->HICUMtempNode > 6) { // it is an internal node CKTdltNNum(ckt, here->HICUMtempNode); here->HICUMtempNode = 0; } From 8a0504bb13de3cdd4b91143e62500d27136812c4 Mon Sep 17 00:00:00 2001 From: dwarning Date: Fri, 31 Jul 2020 18:32:45 +0200 Subject: [PATCH 30/39] add a transient analysis example --- examples/hicum2/hic2_tran.sp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 examples/hicum2/hic2_tran.sp diff --git a/examples/hicum2/hic2_tran.sp b/examples/hicum2/hic2_tran.sp new file mode 100644 index 000000000..823570571 --- /dev/null +++ b/examples/hicum2/hic2_tran.sp @@ -0,0 +1,27 @@ +HICUM2v2.40 Amplifier in Time Domain + +vcc 2 0 2.5 +*vin 1 0 ac 1 dc 0 sin 0 25m 1G +vin 1 0 ac 1 dc 0 pulse 0 50m 0 5p 5p 4n 8n +rs 1 in 50 +c1 in b 1n +r1 2 c 180 +r2 c b 5k +q1 c b 0 0 hicuml2v2p40 +c2 c out 100p +r3 out 0 1k + +.ic v(c)=0.9 +.control +option method=gear +op +print all +ac dec 10 1Meg 9.9g +plot vdb(out) +tran 2p 200n +plot v(in) v(out) +.endc + +.include model-card-examples.lib + +.end From 36862a7bc61a751473b2fb2c67d4af02b103f3fc Mon Sep 17 00:00:00 2001 From: dwarning Date: Fri, 31 Jul 2020 21:06:13 +0200 Subject: [PATCH 31/39] white spaces --- src/spicelib/devices/hicum2/hicum2setup.c | 92 +++++++++++------------ 1 file changed, 45 insertions(+), 47 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2setup.c b/src/spicelib/devices/hicum2/hicum2setup.c index f2cb167d3..cc33a2c79 100644 --- a/src/spicelib/devices/hicum2/hicum2setup.c +++ b/src/spicelib/devices/hicum2/hicum2setup.c @@ -560,12 +560,12 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) if(error) return(error); here->HICUMcollCINode = tmp->number; if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; + if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } } - } } } if(model->HICUMrbx == 0) { @@ -575,12 +575,12 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) if(error) return(error); here->HICUMbaseBPNode = tmp->number; if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } + if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } } } if(model->HICUMre == 0) { @@ -590,12 +590,12 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) if(error) return(error); here->HICUMemitEINode = tmp->number; if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } + if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } } } if(model->HICUMrsu == 0) { @@ -605,12 +605,12 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) if(error) return(error); here->HICUMsubsSINode = tmp->number; if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,4,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } + if (CKTinst2Node(ckt,here,4,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } } } if(model->HICUMrbi0 == 0) { @@ -620,21 +620,21 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) if(error) return(error); here->HICUMbaseBINode = tmp->number; if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,5,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } + if (CKTinst2Node(ckt,here,5,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } } } if (selfheat) { - if (here->HICUMtempNode == 0) { // no external node for temperature - error = CKTmkVolt(ckt,&tmp,here->HICUMname,"dT"); // create internal node - if (error) return(error); - here->HICUMtempNode = tmp->number; - } + if (here->HICUMtempNode == 0) { // no external node for temperature + error = CKTmkVolt(ckt,&tmp,here->HICUMname,"dT"); // create internal node + if (error) return(error); + here->HICUMtempNode = tmp->number; + } } else { if (here->HICUMtempNode > 0) { // external temp node is given, but no she parameter here->HICUMtempNode = 0; @@ -663,7 +663,6 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) here->HICUMxf2Node = 0; } - /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ @@ -751,7 +750,6 @@ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(HICUMxfCollCIPtr ,HICUMxfNode,HICUMcollCINode); TSTALLOC(HICUMxfBaseBIPtr ,HICUMxfNode,HICUMbaseBINode); - } TSTALLOC(HICUMbaseBPSubsSIPtr ,HICUMbaseBPNode,HICUMsubsSINode); @@ -842,20 +840,20 @@ HICUMunsetup( } } - if (nqs) { + if (nqs) { - if(here->HICUMxfNode > 0) - CKTdltNNum(ckt, here->HICUMxfNode); - here->HICUMxfNode = 0; + if(here->HICUMxfNode > 0) + CKTdltNNum(ckt, here->HICUMxfNode); + here->HICUMxfNode = 0; - if(here->HICUMxf1Node > 0) - CKTdltNNum(ckt, here->HICUMxf1Node); - here->HICUMxf1Node = 0; + if(here->HICUMxf1Node > 0) + CKTdltNNum(ckt, here->HICUMxf1Node); + here->HICUMxf1Node = 0; - if(here->HICUMxf2Node > 0) - CKTdltNNum(ckt, here->HICUMxf2Node); - here->HICUMxf2Node = 0; - } + if(here->HICUMxf2Node > 0) + CKTdltNNum(ckt, here->HICUMxf2Node); + here->HICUMxf2Node = 0; + } } } From a4e7eb5b6c0321bc215fa39e92d821cc3d5b5490 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sun, 2 Aug 2020 18:25:51 +0200 Subject: [PATCH 32/39] fix instance multiplier application for noise --- src/spicelib/devices/hicum2/hicum2noise.c | 35 ++++++++++++----------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2noise.c b/src/spicelib/devices/hicum2/hicum2noise.c index 37c0521ff..c7148fb99 100644 --- a/src/spicelib/devices/hicum2/hicum2noise.c +++ b/src/spicelib/devices/hicum2/hicum2noise.c @@ -124,52 +124,53 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata case N_DENS: NevalSrc(&noizDens[HICUMRCNOIZ],&lnNdens[HICUMRCNOIZ], ckt,THERMNOISE,inst->HICUMcollCINode,inst->HICUMcollNode, - Icic_Vcic * inst->HICUMm); + Icic_Vcic); NevalSrc(&noizDens[HICUMRBNOIZ],&lnNdens[HICUMRBNOIZ], ckt,THERMNOISE,inst->HICUMbaseNode,inst->HICUMbaseBPNode, - Ibbp_Vbbp * inst->HICUMm); + Ibbp_Vbbp); NevalSrc(&noizDens[HICUMRBINOIZ],&lnNdens[HICUMRBINOIZ], ckt,THERMNOISE,inst->HICUMbaseBPNode,inst->HICUMbaseBINode, - *(ckt->CKTstate0 + inst->HICUMibpbi_Vbpbi) * inst->HICUMm); + *(ckt->CKTstate0 + inst->HICUMibpbi_Vbpbi)); NevalSrc(&noizDens[HICUMRENOIZ],&lnNdens[HICUMRENOIZ], ckt,THERMNOISE,inst->HICUMemitEINode,inst->HICUMemitNode, - Ieie_Veie * inst->HICUMm); + Ieie_Veie); NevalSrc(&noizDens[HICUMRSNOIZ],&lnNdens[HICUMRSNOIZ], ckt,THERMNOISE,inst->HICUMsubsSINode,inst->HICUMsubsNode, - Isis_Vsis * inst->HICUMm); + Isis_Vsis); - - NevalSrc(&noizDens[HICUMIAVLNOIZ],&lnNdens[HICUMIAVLNOIZ], - ckt,SHOTNOISE,inst->HICUMcollCINode,inst->HICUMbaseBINode, - inst->HICUMiavl); +//todo: ibici contains iavl, has to be separated for non-correlated noise +// NevalSrc(&noizDens[HICUMIAVLNOIZ],&lnNdens[HICUMIAVLNOIZ], +// ckt,SHOTNOISE,inst->HICUMcollCINode,inst->HICUMbaseBINode, +// inst->HICUMiavl); NevalSrc(&noizDens[HICUMIBCINOIZ],&lnNdens[HICUMIBCINOIZ], ckt,SHOTNOISE,inst->HICUMbaseBINode,inst->HICUMcollCINode, - *(ckt->CKTstate0 + inst->HICUMibici) * inst->HICUMm); + *(ckt->CKTstate0 + inst->HICUMibici)); NevalSrc(&noizDens[HICUMIBEPNOIZ],&lnNdens[HICUMIBEPNOIZ], ckt,SHOTNOISE,inst->HICUMbaseBPNode,inst->HICUMemitEINode, - *(ckt->CKTstate0 + inst->HICUMibpei) * inst->HICUMm); + *(ckt->CKTstate0 + inst->HICUMibpei)); NevalSrc(&noizDens[HICUMIBCXNOIZ],&lnNdens[HICUMIBCXNOIZ], ckt,SHOTNOISE,inst->HICUMbaseBPNode,inst->HICUMcollCINode, - *(ckt->CKTstate0 + inst->HICUMibpci) * inst->HICUMm); + *(ckt->CKTstate0 + inst->HICUMibpci)); NevalSrc(&noizDens[HICUMIJSCNOIZ],&lnNdens[HICUMIJSCNOIZ], ckt,SHOTNOISE,inst->HICUMsubsSINode,inst->HICUMcollCINode, - *(ckt->CKTstate0 + inst->HICUMisici) * inst->HICUMm); + *(ckt->CKTstate0 + inst->HICUMisici)); +//todo: iciei contains it, has to be separated for non-correlated noise NevalSrc(&noizDens[HICUMITNOIZ],&lnNdens[HICUMITNOIZ], ckt,SHOTNOISE,inst->HICUMcollCINode,inst->HICUMemitEINode, - *(ckt->CKTstate0 + inst->HICUMiciei) * inst->HICUMm); + *(ckt->CKTstate0 + inst->HICUMiciei)); NevalSrc(&noizDens[HICUMIBEINOIZ],&lnNdens[HICUMIBEINOIZ], ckt,SHOTNOISE,inst->HICUMbaseBINode,inst->HICUMemitEINode, - *(ckt->CKTstate0 + inst->HICUMibiei) * inst->HICUMm); + *(ckt->CKTstate0 + inst->HICUMibiei)); if (model->HICUMcfbe == -1) { @@ -183,7 +184,7 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata } noizDens[HICUMFLBENOIZ] *= inst->HICUMm * model->HICUMkf * exp(model->HICUMaf * - log(MAX(fabs((*(ckt->CKTstate0 + inst->HICUMibiei)+*(ckt->CKTstate0 + inst->HICUMibpei))),N_MINLOG))) / + log(MAX(fabs((*(ckt->CKTstate0 + inst->HICUMibiei)+*(ckt->CKTstate0 + inst->HICUMibpei)))/inst->HICUMm,N_MINLOG))) / data->freq; lnNdens[HICUMFLBENOIZ] = log(MAX(noizDens[HICUMFLBENOIZ],N_MINLOG)); @@ -193,7 +194,7 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata (double)0.0); noizDens[HICUMFLRENOIZ] *= inst->HICUMm * model->HICUMkfre * exp(model->HICUMafre * - log(MAX(fabs(*(ckt->CKTstate0 + inst->HICUMieie)),N_MINLOG))) / + log(MAX(fabs(*(ckt->CKTstate0 + inst->HICUMieie))/inst->HICUMm,N_MINLOG))) / data->freq; lnNdens[HICUMFLRENOIZ] = log(MAX(noizDens[HICUMFLRENOIZ],N_MINLOG)); From 58b89af40a673d1c427e2ec3c0a51fd0c42a0d49 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sun, 2 Aug 2020 18:57:14 +0200 Subject: [PATCH 33/39] prevent division by 0 for rbi --- src/spicelib/devices/hicum2/hicum2noise.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2noise.c b/src/spicelib/devices/hicum2/hicum2noise.c index c7148fb99..808e801ca 100644 --- a/src/spicelib/devices/hicum2/hicum2noise.c +++ b/src/spicelib/devices/hicum2/hicum2noise.c @@ -90,7 +90,11 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata } else { Isis_Vsis = 0.0; } - Ibpbi_Vbpbi = 1/inst->HICUMrbi; + if(inst->HICUMrbi > 0) { + Ibpbi_Vbpbi = 1/inst->HICUMrbi; + } else { + Ibpbi_Vbpbi = 0.0; + } switch (operation) { @@ -132,7 +136,7 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata NevalSrc(&noizDens[HICUMRBINOIZ],&lnNdens[HICUMRBINOIZ], ckt,THERMNOISE,inst->HICUMbaseBPNode,inst->HICUMbaseBINode, - *(ckt->CKTstate0 + inst->HICUMibpbi_Vbpbi)); + Ibpbi_Vbpbi); NevalSrc(&noizDens[HICUMRENOIZ],&lnNdens[HICUMRENOIZ], ckt,THERMNOISE,inst->HICUMemitEINode,inst->HICUMemitNode, From 689177a55f661054d9b031e16c5662faf69ac717 Mon Sep 17 00:00:00 2001 From: dwarning Date: Mon, 3 Aug 2020 10:41:44 +0200 Subject: [PATCH 34/39] correct multiplier scaling for rsu --- src/spicelib/devices/hicum2/hicum2acld.c | 2 +- src/spicelib/devices/hicum2/hicum2noise.c | 2 +- src/spicelib/devices/hicum2/hicum2pzld.c | 2 +- src/spicelib/devices/hicum2/hicumL2.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2acld.c b/src/spicelib/devices/hicum2/hicum2acld.c index b6382bd1a..8e7073d5a 100644 --- a/src/spicelib/devices/hicum2/hicum2acld.c +++ b/src/spicelib/devices/hicum2/hicum2acld.c @@ -151,7 +151,7 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt) Ieie_Vrth = 0.0; } if(model->HICUMrsuGiven && model->HICUMrsu != 0) { - Isis_Vsis = 1/model->HICUMrsu; + Isis_Vsis = 1/model->HICUMrsu*here->HICUMm; } else { Isis_Vsis = 0.0; } diff --git a/src/spicelib/devices/hicum2/hicum2noise.c b/src/spicelib/devices/hicum2/hicum2noise.c index 808e801ca..737516565 100644 --- a/src/spicelib/devices/hicum2/hicum2noise.c +++ b/src/spicelib/devices/hicum2/hicum2noise.c @@ -86,7 +86,7 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata Ieie_Veie = 0.0; } if(model->HICUMrsuGiven && model->HICUMrsu != 0) { - Isis_Vsis = 1/model->HICUMrsu; + Isis_Vsis = 1/model->HICUMrsu*inst->HICUMm; } else { Isis_Vsis = 0.0; } diff --git a/src/spicelib/devices/hicum2/hicum2pzld.c b/src/spicelib/devices/hicum2/hicum2pzld.c index ee2896f8e..63c196873 100644 --- a/src/spicelib/devices/hicum2/hicum2pzld.c +++ b/src/spicelib/devices/hicum2/hicum2pzld.c @@ -151,7 +151,7 @@ HICUMpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) Ieie_Vrth = 0.0; } if(model->HICUMrsuGiven && model->HICUMrsu != 0) { - Isis_Vsis = 1/model->HICUMrsu; + Isis_Vsis = 1/model->HICUMrsu*here->HICUMm; } else { Isis_Vsis = 0.0; } diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 20ce3415e..0ebd7c347 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -2271,7 +2271,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Ieie_Vrth = 0.0; } if(model->HICUMrsuGiven && model->HICUMrsu != 0) { - Isis_Vsis = 1/model->HICUMrsu; + Isis_Vsis = 1/model->HICUMrsu*here->HICUMm; } else { Isis_Vsis = 0.0; } From 67919b9bd8de1bc550d0ef5ed0d173016bc79ff3 Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 4 Aug 2020 08:56:04 +0200 Subject: [PATCH 35/39] yet another try for flicker noise scaling --- src/spicelib/devices/hicum2/hicum2defs.h | 2 ++ src/spicelib/devices/hicum2/hicum2noise.c | 8 ++++---- src/spicelib/devices/hicum2/hicum2setup.c | 3 +++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2defs.h b/src/spicelib/devices/hicum2/hicum2defs.h index 0a864dde5..893a87505 100644 --- a/src/spicelib/devices/hicum2/hicum2defs.h +++ b/src/spicelib/devices/hicum2/hicum2defs.h @@ -161,6 +161,8 @@ typedef struct sHICUMinstance { double HICUMrbx_scaled; double HICUMrcx_scaled; double HICUMrbi0_scaled; + double HICUMkf_scaled; + double HICUMkfre_scaled; double HICUMrbi; double HICUMiavl; diff --git a/src/spicelib/devices/hicum2/hicum2noise.c b/src/spicelib/devices/hicum2/hicum2noise.c index 737516565..47544c124 100644 --- a/src/spicelib/devices/hicum2/hicum2noise.c +++ b/src/spicelib/devices/hicum2/hicum2noise.c @@ -186,9 +186,9 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata N_GAIN,inst->HICUMbaseBPNode, inst->HICUMemitEINode, (double)0.0); } - noizDens[HICUMFLBENOIZ] *= inst->HICUMm * model->HICUMkf * + noizDens[HICUMFLBENOIZ] *= inst->HICUMkf_scaled * exp(model->HICUMaf * - log(MAX(fabs((*(ckt->CKTstate0 + inst->HICUMibiei)+*(ckt->CKTstate0 + inst->HICUMibpei)))/inst->HICUMm,N_MINLOG))) / + log(MAX(fabs((*(ckt->CKTstate0 + inst->HICUMibiei)+*(ckt->CKTstate0 + inst->HICUMibpei))),N_MINLOG))) / data->freq; lnNdens[HICUMFLBENOIZ] = log(MAX(noizDens[HICUMFLBENOIZ],N_MINLOG)); @@ -196,9 +196,9 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata NevalSrc(&noizDens[HICUMFLRENOIZ], NULL, ckt, N_GAIN,inst->HICUMemitEINode, inst->HICUMemitNode, (double)0.0); - noizDens[HICUMFLRENOIZ] *= inst->HICUMm * model->HICUMkfre * + noizDens[HICUMFLRENOIZ] *= inst->HICUMkfre_scaled * exp(model->HICUMafre * - log(MAX(fabs(*(ckt->CKTstate0 + inst->HICUMieie))/inst->HICUMm,N_MINLOG))) / + log(MAX(fabs(*(ckt->CKTstate0 + inst->HICUMieie)),N_MINLOG))) / data->freq; lnNdens[HICUMFLRENOIZ] = log(MAX(noizDens[HICUMFLRENOIZ],N_MINLOG)); diff --git a/src/spicelib/devices/hicum2/hicum2setup.c b/src/spicelib/devices/hicum2/hicum2setup.c index cc33a2c79..389ab5cc1 100644 --- a/src/spicelib/devices/hicum2/hicum2setup.c +++ b/src/spicelib/devices/hicum2/hicum2setup.c @@ -549,6 +549,9 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) here->HICUMrbx_scaled = model->HICUMrbx / area_times_m; here->HICUMrcx_scaled = model->HICUMrcx / area_times_m; here->HICUMrbi0_scaled = model->HICUMrbi0 / area_times_m; + //noise + here->HICUMkf_scaled = model->HICUMkf * pow(here->HICUMm, (1-model->HICUMaf)); + here->HICUMkfre_scaled = model->HICUMkfre * pow(here->HICUMm, (1-model->HICUMafre)); here->HICUMstate = *states; *states += HICUMnumStates; From 7251265231c82cf7111e374770b2264f85f95e3a Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 4 Aug 2020 08:59:26 +0200 Subject: [PATCH 36/39] more reasonable plot scaling --- examples/hicum2/hic2_noise.sp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/hicum2/hic2_noise.sp b/examples/hicum2/hic2_noise.sp index c9e646897..d1891c89e 100644 --- a/examples/hicum2/hic2_noise.sp +++ b/examples/hicum2/hic2_noise.sp @@ -21,7 +21,7 @@ noise v(c) vin dec 10 10 10G 1 setplot setplot noise1 plot ally -plot 300*inoise_spectrum onoise_spectrum +plot inoise_spectrum onoise_spectrum loglog setplot noise2 print all echo From 33d06d9732b8fb05ebc48fad4d02f19b9e94c9fd Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 4 Aug 2020 09:12:37 +0200 Subject: [PATCH 37/39] reintroduce iavl and correct ibici shot noise --- src/spicelib/devices/hicum2/hicum2noise.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2noise.c b/src/spicelib/devices/hicum2/hicum2noise.c index 47544c124..d51fc4233 100644 --- a/src/spicelib/devices/hicum2/hicum2noise.c +++ b/src/spicelib/devices/hicum2/hicum2noise.c @@ -146,14 +146,15 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata ckt,THERMNOISE,inst->HICUMsubsSINode,inst->HICUMsubsNode, Isis_Vsis); -//todo: ibici contains iavl, has to be separated for non-correlated noise -// NevalSrc(&noizDens[HICUMIAVLNOIZ],&lnNdens[HICUMIAVLNOIZ], -// ckt,SHOTNOISE,inst->HICUMcollCINode,inst->HICUMbaseBINode, -// inst->HICUMiavl); + NevalSrc(&noizDens[HICUMIAVLNOIZ],&lnNdens[HICUMIAVLNOIZ], + ckt,SHOTNOISE,inst->HICUMcollCINode,inst->HICUMbaseBINode, + inst->HICUMiavl); + +//todo: ibici contains iavl, has to be separated for non-correlated noise NevalSrc(&noizDens[HICUMIBCINOIZ],&lnNdens[HICUMIBCINOIZ], ckt,SHOTNOISE,inst->HICUMbaseBINode,inst->HICUMcollCINode, - *(ckt->CKTstate0 + inst->HICUMibici)); + *(ckt->CKTstate0 + inst->HICUMibici)+inst->HICUMiavl); NevalSrc(&noizDens[HICUMIBEPNOIZ],&lnNdens[HICUMIBEPNOIZ], ckt,SHOTNOISE,inst->HICUMbaseBPNode,inst->HICUMemitEINode, From 020fc706075d629e7f327a973a363f553b96aef3 Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 4 Aug 2020 09:18:05 +0200 Subject: [PATCH 38/39] change inst to here --- src/spicelib/devices/hicum2/hicum2noise.c | 102 +++++++++++----------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2noise.c b/src/spicelib/devices/hicum2/hicum2noise.c index d51fc4233..803a96adc 100644 --- a/src/spicelib/devices/hicum2/hicum2noise.c +++ b/src/spicelib/devices/hicum2/hicum2noise.c @@ -30,7 +30,7 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata HICUMmodel *firstModel = (HICUMmodel *) genmodel; HICUMmodel *model; - HICUMinstance *inst; + HICUMinstance *here; double tempOnoise; double tempInoise; double noizDens[HICUMNSRCS]; @@ -66,32 +66,32 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata }; for (model=firstModel; model != NULL; model=HICUMnextModel(model)) { - for (inst=HICUMinstances(model); inst != NULL; - inst=HICUMnextInstance(inst)) { + for (here=HICUMinstances(model); here != NULL; + here=HICUMnextInstance(here)) { // get all derivatives of branch DC currents if(model->HICUMrcxGiven && model->HICUMrcx != 0) { - Icic_Vcic = 1/inst->HICUMrcx_t.rpart; + Icic_Vcic = 1/here->HICUMrcx_t.rpart; } else { Icic_Vcic = 0.0; } if(model->HICUMrbxGiven && model->HICUMrbx != 0) { - Ibbp_Vbbp = 1/inst->HICUMrbx_t.rpart; + Ibbp_Vbbp = 1/here->HICUMrbx_t.rpart; } else { Ibbp_Vbbp = 0.0; } if(model->HICUMreGiven && model->HICUMre != 0) { - Ieie_Veie = 1/inst->HICUMre_t.rpart; + Ieie_Veie = 1/here->HICUMre_t.rpart; } else { Ieie_Veie = 0.0; } if(model->HICUMrsuGiven && model->HICUMrsu != 0) { - Isis_Vsis = 1/model->HICUMrsu*inst->HICUMm; + Isis_Vsis = 1/model->HICUMrsu*here->HICUMm; } else { Isis_Vsis = 0.0; } - if(inst->HICUMrbi > 0) { - Ibpbi_Vbpbi = 1/inst->HICUMrbi; + if(here->HICUMrbi > 0) { + Ibpbi_Vbpbi = 1/here->HICUMrbi; } else { Ibpbi_Vbpbi = 0.0; } @@ -108,14 +108,14 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata case N_DENS: for (i=0; i < HICUMNSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->HICUMname, HICUMnNames[i]); + NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", here->HICUMname, HICUMnNames[i]); } break; case INT_NOIZ: for (i=0; i < HICUMNSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->HICUMname, HICUMnNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->HICUMname, HICUMnNames[i]); + NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", here->HICUMname, HICUMnNames[i]); + NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", here->HICUMname, HICUMnNames[i]); } break; } @@ -127,79 +127,79 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata case N_DENS: NevalSrc(&noizDens[HICUMRCNOIZ],&lnNdens[HICUMRCNOIZ], - ckt,THERMNOISE,inst->HICUMcollCINode,inst->HICUMcollNode, + ckt,THERMNOISE,here->HICUMcollCINode,here->HICUMcollNode, Icic_Vcic); NevalSrc(&noizDens[HICUMRBNOIZ],&lnNdens[HICUMRBNOIZ], - ckt,THERMNOISE,inst->HICUMbaseNode,inst->HICUMbaseBPNode, + ckt,THERMNOISE,here->HICUMbaseNode,here->HICUMbaseBPNode, Ibbp_Vbbp); NevalSrc(&noizDens[HICUMRBINOIZ],&lnNdens[HICUMRBINOIZ], - ckt,THERMNOISE,inst->HICUMbaseBPNode,inst->HICUMbaseBINode, + ckt,THERMNOISE,here->HICUMbaseBPNode,here->HICUMbaseBINode, Ibpbi_Vbpbi); NevalSrc(&noizDens[HICUMRENOIZ],&lnNdens[HICUMRENOIZ], - ckt,THERMNOISE,inst->HICUMemitEINode,inst->HICUMemitNode, + ckt,THERMNOISE,here->HICUMemitEINode,here->HICUMemitNode, Ieie_Veie); NevalSrc(&noizDens[HICUMRSNOIZ],&lnNdens[HICUMRSNOIZ], - ckt,THERMNOISE,inst->HICUMsubsSINode,inst->HICUMsubsNode, + ckt,THERMNOISE,here->HICUMsubsSINode,here->HICUMsubsNode, Isis_Vsis); NevalSrc(&noizDens[HICUMIAVLNOIZ],&lnNdens[HICUMIAVLNOIZ], - ckt,SHOTNOISE,inst->HICUMcollCINode,inst->HICUMbaseBINode, - inst->HICUMiavl); + ckt,SHOTNOISE,here->HICUMcollCINode,here->HICUMbaseBINode, + here->HICUMiavl); //todo: ibici contains iavl, has to be separated for non-correlated noise NevalSrc(&noizDens[HICUMIBCINOIZ],&lnNdens[HICUMIBCINOIZ], - ckt,SHOTNOISE,inst->HICUMbaseBINode,inst->HICUMcollCINode, - *(ckt->CKTstate0 + inst->HICUMibici)+inst->HICUMiavl); + ckt,SHOTNOISE,here->HICUMbaseBINode,here->HICUMcollCINode, + *(ckt->CKTstate0 + here->HICUMibici)+here->HICUMiavl); NevalSrc(&noizDens[HICUMIBEPNOIZ],&lnNdens[HICUMIBEPNOIZ], - ckt,SHOTNOISE,inst->HICUMbaseBPNode,inst->HICUMemitEINode, - *(ckt->CKTstate0 + inst->HICUMibpei)); + ckt,SHOTNOISE,here->HICUMbaseBPNode,here->HICUMemitEINode, + *(ckt->CKTstate0 + here->HICUMibpei)); NevalSrc(&noizDens[HICUMIBCXNOIZ],&lnNdens[HICUMIBCXNOIZ], - ckt,SHOTNOISE,inst->HICUMbaseBPNode,inst->HICUMcollCINode, - *(ckt->CKTstate0 + inst->HICUMibpci)); + ckt,SHOTNOISE,here->HICUMbaseBPNode,here->HICUMcollCINode, + *(ckt->CKTstate0 + here->HICUMibpci)); NevalSrc(&noizDens[HICUMIJSCNOIZ],&lnNdens[HICUMIJSCNOIZ], - ckt,SHOTNOISE,inst->HICUMsubsSINode,inst->HICUMcollCINode, - *(ckt->CKTstate0 + inst->HICUMisici)); + ckt,SHOTNOISE,here->HICUMsubsSINode,here->HICUMcollCINode, + *(ckt->CKTstate0 + here->HICUMisici)); //todo: iciei contains it, has to be separated for non-correlated noise NevalSrc(&noizDens[HICUMITNOIZ],&lnNdens[HICUMITNOIZ], - ckt,SHOTNOISE,inst->HICUMcollCINode,inst->HICUMemitEINode, - *(ckt->CKTstate0 + inst->HICUMiciei)); + ckt,SHOTNOISE,here->HICUMcollCINode,here->HICUMemitEINode, + *(ckt->CKTstate0 + here->HICUMiciei)); NevalSrc(&noizDens[HICUMIBEINOIZ],&lnNdens[HICUMIBEINOIZ], - ckt,SHOTNOISE,inst->HICUMbaseBINode,inst->HICUMemitEINode, - *(ckt->CKTstate0 + inst->HICUMibiei)); + ckt,SHOTNOISE,here->HICUMbaseBINode,here->HICUMemitEINode, + *(ckt->CKTstate0 + here->HICUMibiei)); if (model->HICUMcfbe == -1) { NevalSrc(&noizDens[HICUMFLBENOIZ], NULL, ckt, - N_GAIN,inst->HICUMbaseBINode, inst->HICUMemitEINode, + N_GAIN,here->HICUMbaseBINode, here->HICUMemitEINode, (double)0.0); } else { NevalSrc(&noizDens[HICUMFLBENOIZ], NULL, ckt, - N_GAIN,inst->HICUMbaseBPNode, inst->HICUMemitEINode, + N_GAIN,here->HICUMbaseBPNode, here->HICUMemitEINode, (double)0.0); } - noizDens[HICUMFLBENOIZ] *= inst->HICUMkf_scaled * + noizDens[HICUMFLBENOIZ] *= here->HICUMkf_scaled * exp(model->HICUMaf * - log(MAX(fabs((*(ckt->CKTstate0 + inst->HICUMibiei)+*(ckt->CKTstate0 + inst->HICUMibpei))),N_MINLOG))) / + log(MAX(fabs((*(ckt->CKTstate0 + here->HICUMibiei)+*(ckt->CKTstate0 + here->HICUMibpei))),N_MINLOG))) / data->freq; lnNdens[HICUMFLBENOIZ] = log(MAX(noizDens[HICUMFLBENOIZ],N_MINLOG)); NevalSrc(&noizDens[HICUMFLRENOIZ], NULL, ckt, - N_GAIN,inst->HICUMemitEINode, inst->HICUMemitNode, + N_GAIN,here->HICUMemitEINode, here->HICUMemitNode, (double)0.0); - noizDens[HICUMFLRENOIZ] *= inst->HICUMkfre_scaled * + noizDens[HICUMFLRENOIZ] *= here->HICUMkfre_scaled * exp(model->HICUMafre * - log(MAX(fabs(*(ckt->CKTstate0 + inst->HICUMieie)),N_MINLOG))) / + log(MAX(fabs(*(ckt->CKTstate0 + here->HICUMieie)),N_MINLOG))) / data->freq; lnNdens[HICUMFLRENOIZ] = log(MAX(noizDens[HICUMFLRENOIZ],N_MINLOG)); @@ -232,15 +232,15 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata /* initialize our "history" variables */ for (i=0; i < HICUMNSRCS; i++) { - inst->HICUMnVar[LNLSTDENS][i] = lnNdens[i]; + here->HICUMnVar[LNLSTDENS][i] = lnNdens[i]; } /* clear out our integration variables if it's the first pass */ if (data->freq == job->NstartFreq) { for (i=0; i < HICUMNSRCS; i++) { - inst->HICUMnVar[OUTNOIZ][i] = 0.0; - inst->HICUMnVar[INNOIZ][i] = 0.0; + here->HICUMnVar[OUTNOIZ][i] = 0.0; + here->HICUMnVar[INNOIZ][i] = 0.0; } } } else { /* data->delFreq != 0.0 (we have to integrate) */ @@ -250,19 +250,19 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata for (i=0; i < HICUMNSRCS; i++) { if (i != HICUMTOTNOIZ) { tempOnoise = Nintegrate(noizDens[i], lnNdens[i], - inst->HICUMnVar[LNLSTDENS][i], data); + here->HICUMnVar[LNLSTDENS][i], data); tempInoise = Nintegrate(noizDens[i] * data->GainSqInv , lnNdens[i] + data->lnGainInv, - inst->HICUMnVar[LNLSTDENS][i] + data->lnGainInv, + here->HICUMnVar[LNLSTDENS][i] + data->lnGainInv, data); - inst->HICUMnVar[LNLSTDENS][i] = lnNdens[i]; + here->HICUMnVar[LNLSTDENS][i] = lnNdens[i]; data->outNoiz += tempOnoise; data->inNoise += tempInoise; if (job->NStpsSm != 0) { - inst->HICUMnVar[OUTNOIZ][i] += tempOnoise; - inst->HICUMnVar[OUTNOIZ][HICUMTOTNOIZ] += tempOnoise; - inst->HICUMnVar[INNOIZ][i] += tempInoise; - inst->HICUMnVar[INNOIZ][HICUMTOTNOIZ] += tempInoise; + here->HICUMnVar[OUTNOIZ][i] += tempOnoise; + here->HICUMnVar[OUTNOIZ][HICUMTOTNOIZ] += tempOnoise; + here->HICUMnVar[INNOIZ][i] += tempInoise; + here->HICUMnVar[INNOIZ][HICUMTOTNOIZ] += tempInoise; } } } @@ -277,8 +277,8 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata case INT_NOIZ: /* already calculated, just output */ if (job->NStpsSm != 0) { for (i=0; i < HICUMNSRCS; i++) { - data->outpVector[data->outNumber++] = inst->HICUMnVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = inst->HICUMnVar[INNOIZ][i]; + data->outpVector[data->outNumber++] = here->HICUMnVar[OUTNOIZ][i]; + data->outpVector[data->outNumber++] = here->HICUMnVar[INNOIZ][i]; } } /* if */ break; @@ -289,7 +289,7 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata return (OK); /* do nothing, the main calling routine will close */ break; /* the plots */ } /* switch (operation) */ - } /* for inst */ + } /* for here */ } /* for model */ return(OK); From 23183f10b6c66a8efc016764e0b1b230af8561b8 Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Sat, 8 Aug 2020 15:35:32 +0200 Subject: [PATCH 39/39] added it to Hicum states -> noise --- src/spicelib/devices/hicum2/hicum2defs.h | 4 +++- src/spicelib/devices/hicum2/hicum2noise.c | 4 +--- src/spicelib/devices/hicum2/hicumL2.cpp | 2 ++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2defs.h b/src/spicelib/devices/hicum2/hicum2defs.h index 893a87505..861504efd 100644 --- a/src/spicelib/devices/hicum2/hicum2defs.h +++ b/src/spicelib/devices/hicum2/hicum2defs.h @@ -526,7 +526,9 @@ typedef struct sHICUMinstance { #define HICUMith_Vbbp HICUMstate+123 #define HICUMith_Veie HICUMstate+124 -#define HICUMnumStates 125 +#define HICUMit HICUMstate+125 //for noise + +#define HICUMnumStates 126 /* per model data */ typedef struct sHICUMmodel { /* model structure for a hicum */ diff --git a/src/spicelib/devices/hicum2/hicum2noise.c b/src/spicelib/devices/hicum2/hicum2noise.c index 803a96adc..64631c6c4 100644 --- a/src/spicelib/devices/hicum2/hicum2noise.c +++ b/src/spicelib/devices/hicum2/hicum2noise.c @@ -151,7 +151,6 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata ckt,SHOTNOISE,here->HICUMcollCINode,here->HICUMbaseBINode, here->HICUMiavl); -//todo: ibici contains iavl, has to be separated for non-correlated noise NevalSrc(&noizDens[HICUMIBCINOIZ],&lnNdens[HICUMIBCINOIZ], ckt,SHOTNOISE,here->HICUMbaseBINode,here->HICUMcollCINode, *(ckt->CKTstate0 + here->HICUMibici)+here->HICUMiavl); @@ -168,10 +167,9 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata ckt,SHOTNOISE,here->HICUMsubsSINode,here->HICUMcollCINode, *(ckt->CKTstate0 + here->HICUMisici)); -//todo: iciei contains it, has to be separated for non-correlated noise NevalSrc(&noizDens[HICUMITNOIZ],&lnNdens[HICUMITNOIZ], ckt,SHOTNOISE,here->HICUMcollCINode,here->HICUMemitEINode, - *(ckt->CKTstate0 + here->HICUMiciei)); + *(ckt->CKTstate0 + here->HICUMit)); NevalSrc(&noizDens[HICUMIBEINOIZ],&lnNdens[HICUMIBEINOIZ], ckt,SHOTNOISE,here->HICUMbaseBINode,here->HICUMemitEINode, diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 0ebd7c347..273a2e271 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -1459,6 +1459,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate0+here->HICUMith_Vcic)=*(ckt->CKTstate1+here->HICUMith_Vcic); *(ckt->CKTstate0+here->HICUMith_Vbbp)=*(ckt->CKTstate1+here->HICUMith_Vbbp); *(ckt->CKTstate0+here->HICUMith_Veie)=*(ckt->CKTstate1+here->HICUMith_Veie); + *(ckt->CKTstate0+here->HICUMit)=*(ckt->CKTstate1+here->HICUMit); ///////////////////////// // end copy state vector ///////////////////////// @@ -2893,6 +2894,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate0 + here->HICUMixf2_Vxf1) = Ixf2_Vxf1; *(ckt->CKTstate0 + here->HICUMixf2_Vxf2) = Ixf2_Vxf2; *(ckt->CKTstate0 + here->HICUMixf2_Vrth) = Ixf2_dT; + *(ckt->CKTstate0 + here->HICUMit) = it; load: // #############################################################