diff --git a/output_ngspice_dc.ngspice b/output_ngspice_dc.ngspice new file mode 100644 index 000000000..21d64a5dc --- /dev/null +++ b/output_ngspice_dc.ngspice @@ -0,0 +1,3 @@ + n_c @q_q_h[area] @q_q_h[betaac] @q_q_h[betadc] @q_q_h[ccs] @q_q_h[cmui] @q_q_h[cmux] @q_q_h[cpii] @q_q_h[cpix] @q_q_h[crbi] @q_q_h[dtsh] @q_q_h[ft] @q_q_h[gmi] @q_q_h[gms] @q_q_h[iavl] @q_q_h[ib] @q_q_h[ic] @q_q_h[icvbe] @q_q_h[icvce] @q_q_h[ie] @q_q_h[is] @q_q_h[m] @q_q_h[p] @q_q_h[rb] @q_q_h[rbi] @q_q_h[rcx_t] @q_q_h[re_t] @q_q_h[rmui] @q_q_h[rmux] @q_q_h[roi] @q_q_h[rpii] @q_q_h[rpix] @q_q_h[temp] @q_q_h[tf] @q_q_h[tk] @q_q_h[vbc] @q_q_h[vbe] @q_q_h[vce] @q_q_h[vsc] n_b n_b_forced n_bx n_c n_c_forced n_cx n_e n_e_forced n_ex n_s n_sx n_t q_q_h#collCI q_q_h#emitEI q_q_h#subsSI q_q_h#xf q_q_h#xf1 q_q_h#xf2 v_v_b#branch v_v_c#branch v_v_e#branch v_v_s#branch + 1.00000104e-15 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.72829429e-22 0.00000000e+00 0.00000000e+00 0.00000000e+00 -nan 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.99751242e-03 9.97512422e-04 1.00000000e-03 1.00000000e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.68500000e+01 1.00000000e-15 3.00000000e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000000e-01 5.00000000e-01 5.00000000e-01 1.00000104e-15 1.00000004e-21 0.00000000e+00 2.10449022e-14 2.10448811e-20 0.00000000e+00 1.99987152e-36 0.00000000e+00 0.00000000e+00 2.00000107e-15 4.20897833e-14 1.99987352e-30 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000004e-12 2.10448811e-11 1.99987152e-27 + 1.02000109e-15 1.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.28505597e-21 0.00000000e+00 0.00000000e+00 0.00000000e+00 -nan 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 0.00000000e+00 1.99751242e-03 9.97512422e-04 1.00000000e-03 1.00000000e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.68500000e+01 1.00000000e-15 3.00000000e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.10000000e-01 5.10000000e-01 5.10000000e-01 1.02000109e-15 1.02000007e-21 0.00000000e+00 3.02332613e-14 3.02332311e-20 0.00000000e+00 2.03984753e-36 0.00000000e+00 0.00000000e+00 2.04000117e-15 6.04664924e-14 2.03984957e-30 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.02000007e-12 3.02332311e-11 2.03984753e-27 diff --git a/src/spicelib/devices/hicum2/hicum2.c b/src/spicelib/devices/hicum2/hicum2.c index 461351b68..ad79a4e53 100644 --- a/src/spicelib/devices/hicum2/hicum2.c +++ b/src/spicelib/devices/hicum2/hicum2.c @@ -25,6 +25,7 @@ IFparm HICUMpTable[] = { /* parameters */ IOPU("temp", HICUM_TEMP, IF_REAL, "Instance temperature"), IOPUR("tk", HICUM_QUEST_TK, IF_REAL, "Actual device temperature"), IOPU("dtsh", HICUM_QUEST_DTSH, IF_REAL, "Temperature increase due to self-heating"), + IOPU("it", HICUM_QUEST_IT, IF_REAL, "transfer current"), OPU("collnode", HICUM_QUEST_COLLNODE, IF_INTEGER, "Number of collector node"), OPU("basenode", HICUM_QUEST_BASENODE, IF_INTEGER, "Number of base node"), @@ -47,6 +48,8 @@ IFparm HICUMpTable[] = { /* parameters */ OP("ic", HICUM_QUEST_CC, IF_REAL, "Collector current"), OP("iavl", HICUM_QUEST_CAVL, IF_REAL, "Avalanche current"), OP("ib", HICUM_QUEST_CB, IF_REAL, "Base current"), + OP("ibei", HICUM_QUEST_CBEI, IF_REAL, "Intenral Base Emitter current"), + OP("ibci", HICUM_QUEST_CBCI, IF_REAL, "Internal Base Collector current"), OP("ie", HICUM_QUEST_CE, IF_REAL, "Emitter current"), OP("is", HICUM_QUEST_CS, IF_REAL, "Substrate current"), /* resistances */ diff --git a/src/spicelib/devices/hicum2/hicum2ask.c b/src/spicelib/devices/hicum2/hicum2ask.c index 6d23baab4..45961c966 100644 --- a/src/spicelib/devices/hicum2/hicum2ask.c +++ b/src/spicelib/devices/hicum2/hicum2ask.c @@ -125,6 +125,9 @@ HICUMask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFval case HICUM_QUEST_RE_T: value->rValue = here->HICUMre_t; return(OK); + case HICUM_QUEST_IT: + value->rValue = *(ckt->CKTstate0 + here->HICUMiciei); + return(OK); case HICUM_QUEST_RBI: value->rValue = here->HICUMrbi; return(OK); @@ -204,6 +207,12 @@ HICUMask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFval case HICUM_QUEST_TF: value->rValue = here->HICUMtf; return(OK); + case HICUM_QUEST_CBEI: + value->rValue = *(ckt->CKTstate0 + here->HICUMibiei); + return(OK); + case HICUM_QUEST_CBCI: + value->rValue = *(ckt->CKTstate0 + here->HICUMibici); + return(OK); case HICUM_QUEST_FT: // FT = GMi/(2*`M_PI*(CPIi+CPIx+CMUi+CMUx+(rcx_t+re_t+(re_t+rb)/BETAAC)*GMi*(CMUi+CMUx))); HICUMask(ckt, instPtr, HICUM_QUEST_GMI, &GMi, select); diff --git a/src/spicelib/devices/hicum2/hicum2defs.h b/src/spicelib/devices/hicum2/hicum2defs.h index c4e8c6a12..36e69cf41 100644 --- a/src/spicelib/devices/hicum2/hicum2defs.h +++ b/src/spicelib/devices/hicum2/hicum2defs.h @@ -1003,6 +1003,7 @@ enum { /* resistances */ HICUM_QUEST_RCX_T, HICUM_QUEST_RE_T, + HICUM_QUEST_IT, HICUM_QUEST_RBI, HICUM_QUEST_RB, /* transconductances and capacitances */ @@ -1024,6 +1025,8 @@ enum { /* transit time */ HICUM_QUEST_TF, HICUM_QUEST_FT, + HICUM_QUEST_CBEI, + HICUM_QUEST_CBCI, /* power */ HICUM_QUEST_POWER, }; diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index d7fc038e5..ad9b8978c 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -668,7 +668,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Ibpbi, Ibpbi_Vbpbi, Ibpbi_Vbici, Ibpbi_Vbiei; double Ibpsi, Ibpsi_Vbpci, Ibpsi_Vsici; double Icic_Vcic; - double Ibci, Ibci_Vbci, Ibci_dT; + double ibci_Vbci, ibci_dT; double hjei_vbe_Vbiei, hjei_vbe_dT, ibet_Vbpei=0.0, ibet_dT=0, ibet_Vbiei=0.0, ibh_rec_Vbiei; double irei_Vbiei, irei_dT; double ibep_Vbpei, ibep_dT; @@ -740,6 +740,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Ith_Veie; double Ith_Vcic; double Ith_Vbbp; + double dummy_1, dummy_2; //for debugging //declaration of lambda functions ----------------------------------- @@ -1430,8 +1431,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) hicum_diode(here->HICUMtemp,here->HICUMibeis_t,model->HICUMmbei, Vbiei, &ibei, &ibei_Vbiei, &ibei_dT); hicum_diode(here->HICUMtemp,here->HICUMireis_t,model->HICUMmrei, Vbiei, &irei, &irei_Vbiei, &irei_dT); - - //Internal b-e and b-c junction capacitances and charges //QJMODF(here->HICUMvt,cjei0_t,vdei_t,model->HICUMzei,ajei_t,V(br_biei),Qjei) //Cjei = ddx(Qjei,V(bi)); @@ -1619,7 +1618,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) //Internal base current across b-c junction //TODO - hicum_diode(here->HICUMtemp,here->HICUMibcis_t,model->HICUMmbci, Vbici, &Ibci, &Ibci_Vbci, &Ibci_dT); + hicum_diode(here->HICUMtemp,here->HICUMibcis_t,model->HICUMmbci, Vbici, &ibci, &ibci_Vbci, &ibci_dT); //Avalanche current result = calc_iavl(Vbici+1_e, Cjci , itf); @@ -1806,6 +1805,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Ibpei_Vbpei += model->HICUMtype*irep_Vbpei; Ibiei = model->HICUMtype*ibei; + Ibiei_Vbiei = model->HICUMtype*ibei_Vbiei; Ibiei += model->HICUMtype*irei; Ibiei_Vbiei += model->HICUMtype*irei_Vbiei; Ibiei += model->HICUMtype*ibh_rec; @@ -1904,8 +1904,12 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Ibpbi_Vbpbi = 1 / rbi; Ibpbi = Vbpbi / rbi; } else { + // Makrus: why this??? Ibpbi_Vbpbi = 1 / MIN_R; Ibpbi = Vbpbi / MIN_R; + + // Ibpbi = 0; + // Ibpbi_Vbpbi = 0; } Ibpbi_Vbiei = -Vbpbi * rbi_Vbiei / (rbi*rbi); Ibpbi_Vbici = -Vbpbi * rbi_Vbici / (rbi*rbi); @@ -2125,10 +2129,10 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Isici += *(ckt->CKTstate0 + here->HICUMcqjs); // Ibci += ddt(model->HICUMtype*qjcx0_t_i); - error = NIintegrate(ckt,&geq,&ceq,Cjcx_i,here->HICUMqjcx0_i); - if(error) return(error); - Ibci_Vbci = geq; - Ibci = *(ckt->CKTstate0 + here->HICUMcqcx0_t_i); + // error = NIintegrate(ckt,&geq,&ceq,Cjcx_i,here->HICUMqjcx0_i); + // if(error) return(error); + // Ibci_Vbci = geq; + // Ibci = *(ckt->CKTstate0 + here->HICUMcqcx0_t_i); // Ibpci += ddt(model->HICUMtype*(qjcx0_t_ii+Qdsu)); error = NIintegrate(ckt,&geq,&ceq,Cjcx_ii,here->HICUMqjcx0_ii); @@ -2398,13 +2402,13 @@ c Branch: ciei, Stamp element: It /* c Branch: bci, Stamp element: Qbcx */ - rhs_current = model->HICUMtype * (Ibci - Ibci_Vbci*Vbci); + rhs_current = model->HICUMtype * (ibci - ibci_Vbci*Vbci); *(ckt->CKTrhs + here->HICUMbaseNode) += -rhs_current; - *(here->HICUMbaseBasePtr) += Ibci_Vbci; - *(here->HICUMbaseCollCIPtr) += -Ibci_Vbci; + *(here->HICUMbaseBasePtr) += ibci_Vbci; + *(here->HICUMbaseCollCIPtr) += -ibci_Vbci; *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; - *(here->HICUMcollCIBasePtr) += -Ibci_Vbci; - *(here->HICUMcollCICollCIPtr) += Ibci_Vbci; + *(here->HICUMcollCIBasePtr) += -ibci_Vbci; + *(here->HICUMcollCICollCIPtr) += ibci_Vbci; /* c Branch: bpci, Stamp element: Ijbcx */ diff --git a/src/spicelib/devices/hicum2/overview_files.md b/src/spicelib/devices/hicum2/overview_files.md index 860147f1a..c10e50909 100644 --- a/src/spicelib/devices/hicum2/overview_files.md +++ b/src/spicelib/devices/hicum2/overview_files.md @@ -31,6 +31,12 @@ This file gives an overview of the files needed for the ngspice HiCUM version, e # hicum2temp.c * Temperature scaling of all parameters * Models are implemented, missing are the derivatives - * As most models are easy and just temperature dependent -> no dual numbers + * As most models are easy and just temperature dependent -> no dual numbers -> Markus: I disagree * Assignee: Mario # hicum2trunc.c + +# Working in the DC case without self heating: +See test case in DMT where this is compared against ADS. +- re +- Ibiei +- Ibici