diff --git a/src/spicelib/devices/hicum2/hicum2.c b/src/spicelib/devices/hicum2/hicum2.c index 14b9611cc..461351b68 100644 --- a/src/spicelib/devices/hicum2/hicum2.c +++ b/src/spicelib/devices/hicum2/hicum2.c @@ -21,45 +21,61 @@ IFparm HICUMpTable[] = { /* parameters */ IP("ic", HICUM_IC, IF_REALVEC, "Initial condition vector"), IOPAU("icvbe", HICUM_IC_VBE, IF_REAL, "Initial B-E voltage"), IOPAU("icvce", HICUM_IC_VCE, IF_REAL, "Initial C-E voltage"), - IOPU("temp", HICUM_TEMP, IF_REAL, "Instance temperature"), - IOPU("dtemp", HICUM_DTEMP, IF_REAL, "Instance delta temperature"), IOPU("m", HICUM_M, IF_REAL, "Multiplier"), + 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"), OPU("collnode", HICUM_QUEST_COLLNODE, IF_INTEGER, "Number of collector node"), OPU("basenode", HICUM_QUEST_BASENODE, IF_INTEGER, "Number of base node"), OPU("emitnode", HICUM_QUEST_EMITNODE, IF_INTEGER, "Number of emitter node"), OPU("subsnode", HICUM_QUEST_SUBSNODE, IF_INTEGER, "Number of substrate node"), OPU("collCInode", HICUM_QUEST_COLLCINODE, IF_INTEGER, "Internal collector node"), - OPU("baseBPnode", HICUM_QUEST_BASEBPNODE, IF_INTEGER, "Internal base node"), + OPU("baseBPnode", HICUM_QUEST_BASEBPNODE, IF_INTEGER, "External base node"), OPU("baseBInode", HICUM_QUEST_BASEBINODE, IF_INTEGER, "Internal base node"), OPU("emitEInode", HICUM_QUEST_EMITEINODE, IF_INTEGER, "Internal emitter node"), OPU("subsSInode", HICUM_QUEST_SUBSSINODE, IF_INTEGER, "Internal substrate node"), OPU("xfnode", HICUM_QUEST_XFNODE, IF_INTEGER, "Internal phase node xf"), OPU("xf1node", HICUM_QUEST_XF1NODE, IF_INTEGER, "Internal phase node xf1"), OPU("xf2node", HICUM_QUEST_XF2NODE, IF_INTEGER, "Internal phase node xf2"), - OP("vbe", HICUM_QUEST_VBE, IF_REAL, "B-E voltage"), - OP("vbc", HICUM_QUEST_VBC, IF_REAL, "B-C voltage"), +/* voltages */ + OP("vbe", HICUM_QUEST_VBE, IF_REAL, "External BE voltage"), + OP("vbc", HICUM_QUEST_VBC, IF_REAL, "External BC voltage"), + OP("vce", HICUM_QUEST_VCE, IF_REAL, "External CE voltage"), + OP("vsc", HICUM_QUEST_VSC, IF_REAL, "External SC voltage"), +/* currents */ 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("ie", HICUM_QUEST_CE, IF_REAL, "Emitter current"), OP("is", HICUM_QUEST_CS, IF_REAL, "Substrate current"), - OP("gm", HICUM_QUEST_GM, IF_REAL, "Small signal transconductance dIc/dVbe"), - OP("go", HICUM_QUEST_GO, IF_REAL, "Small signal output conductance dIc/dVbc"), - OP("gpi", HICUM_QUEST_GPI, IF_REAL, "Small signal input conductance dIb/dVbe"), - OP("gmu", HICUM_QUEST_GMU, IF_REAL, "Small signal conductance dIb/dVbc"), - OP("gx", HICUM_QUEST_GX, IF_REAL, "Conductance from base to internal base"), - OP("cbe", HICUM_QUEST_CJBE, IF_REAL, "Internal base to emitter capacitance"), - OP("cbex", HICUM_QUEST_CBEX, IF_REAL, "External base to emitter capacitance"), - OP("cbep", HICUM_QUEST_CBEP, IF_REAL, "Parasitic Base to emitter capacitance"), - OP("cbc", HICUM_QUEST_CJBC, IF_REAL, "Internal base to collector capacitance"), - OP("cbcp", HICUM_QUEST_CBCXII,IF_REAL, "Parasitic Base to collector capacitance"), - OPU("geqcb", HICUM_QUEST_GEQCB, IF_REAL, "Internal C-B-base cap. equiv. cond."), - OPU("qbe", HICUM_QUEST_QBE, IF_REAL, "Charge storage B-E junction"), - OPU("cqbe", HICUM_QUEST_CQBE, IF_REAL, "Cap. due to charge storage in B-E jct."), - OPU("qbc", HICUM_QUEST_QBC, IF_REAL, "Charge storage B-C junction"), - OPU("cqbc", HICUM_QUEST_CQBC, IF_REAL, "Cap. due to charge storage in B-C jct."), - OPU("qbx", HICUM_QUEST_QBX, IF_REAL, "Charge storage B-X junction"), - OPU("cqbx", HICUM_QUEST_CQBX, IF_REAL, "Cap. due to charge storage in B-X jct."), +/* resistances */ + OP("rcx_t", HICUM_QUEST_RCX_T, IF_REAL, "External (saturated) collector series resistance"), + OP("re_t", HICUM_QUEST_RE_T, IF_REAL, "Emitter series resistance"), + OP("rbi", HICUM_QUEST_RBI, IF_REAL, "Internal base resistance as calculated in the model"), + OP("rb", HICUM_QUEST_RB, IF_REAL, "Total base resistance as calculated in the model"), + +/* transconductances and capacitances */ + OP("betadc", HICUM_QUEST_BETADC, IF_REAL, "Common emitter forward current gain"), + OP("gmi", HICUM_QUEST_GMI, IF_REAL, "Internal transconductance"), + OP("gms", HICUM_QUEST_GMS, IF_REAL, "Transconductance of the parasitic substrate PNP"), + OP("rpii", HICUM_QUEST_RPII, IF_REAL, "Internal base-emitter (input) resistance"), + OP("rpix", HICUM_QUEST_RPIX, IF_REAL, "External base-emitter (input) resistance"), + OP("rmui", HICUM_QUEST_RMUI, IF_REAL, "Internal feedback resistance"), + OP("rmux", HICUM_QUEST_RMUX, IF_REAL, "External feedback resistance"), + OP("roi", HICUM_QUEST_ROI, IF_REAL, "Output resistance"), + OP("cpii", HICUM_QUEST_CPII, IF_REAL, "Total internal BE capacitance"), + OP("cpix", HICUM_QUEST_CPIX, IF_REAL, "Total external BE capacitance"), + OP("cmui", HICUM_QUEST_CMUI, IF_REAL, "Total internal BC capacitance"), + OP("cmux", HICUM_QUEST_CMUX, IF_REAL, "Total external BC capacitance"), + OP("ccs", HICUM_QUEST_CCS, IF_REAL, "CS junction capacitance"), + OP("betaac", HICUM_QUEST_BETAAC, IF_REAL, "Small signal current gain"), + OP("crbi", HICUM_QUEST_CRBI, IF_REAL, "Shunt capacitance across RBI as calculated in the model"), +/* transit time */ + OP("tf", HICUM_QUEST_TF, IF_REAL, "Forward transit time"), + OP("ft", HICUM_QUEST_FT, IF_REAL, "Transit frequency"), + +/* power */ OP("p", HICUM_QUEST_POWER, IF_REAL, "Power dissipation") }; diff --git a/src/spicelib/devices/hicum2/hicum2ask.c b/src/spicelib/devices/hicum2/hicum2ask.c index cdb557da0..e02eb939e 100644 --- a/src/spicelib/devices/hicum2/hicum2ask.c +++ b/src/spicelib/devices/hicum2/hicum2ask.c @@ -72,15 +72,25 @@ HICUMask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFval case HICUM_QUEST_SUBSSINODE: value->iValue = here->HICUMsubsSINode; return(OK); +/* voltages */ case HICUM_QUEST_VBE: - value->rValue = *(ckt->CKTstate0 + here->HICUMvbiei); + value->rValue = *(ckt->CKTstate0 + here->HICUMbaseNode)-*(ckt->CKTstate0 + here->HICUMemitNode); return(OK); case HICUM_QUEST_VBC: - value->rValue = *(ckt->CKTstate0 + here->HICUMvbici); + value->rValue = *(ckt->CKTstate0 + here->HICUMbaseNode)-*(ckt->CKTstate0 + here->HICUMcollNode); return(OK); + case HICUM_QUEST_VCE: + value->rValue = *(ckt->CKTstate0 + here->HICUMcollNode)-*(ckt->CKTstate0 + here->HICUMemitNode); + return(OK); + case HICUM_QUEST_VSC: + value->rValue = *(ckt->CKTstate0 + here->HICUMcollNode)-*(ckt->CKTstate0 + here->HICUMsubsNode); + return(OK); +/* currents */ case HICUM_QUEST_CC: value->rValue = *(ckt->CKTstate0 + here->HICUMiciei) - - *(ckt->CKTstate0 + here->HICUMibici); + *(ckt->CKTstate0 + here->HICUMibici) - + *(ckt->CKTstate0 + here->HICUMibpci) - + *(ckt->CKTstate0 + here->HICUMisici); return(OK); case HICUM_QUEST_CB: value->rValue = *(ckt->CKTstate0 + here->HICUMibiei) + @@ -97,58 +107,136 @@ HICUMask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFval value->rValue = *(ckt->CKTstate0 + here->HICUMisici) - *(ckt->CKTstate0 + here->HICUMibpsi); return(OK); - case HICUM_QUEST_GM: - value->rValue = *(ckt->CKTstate0 + here->HICUMiciei_Vbiei); + case HICUM_QUEST_CAVL: + value->rValue = here->HICUMiavl; return(OK); - case HICUM_QUEST_GPI: - value->rValue = *(ckt->CKTstate0 + here->HICUMibiei_Vbiei); +/* resistances */ + case HICUM_QUEST_RCX_T: + value->rValue = here->HICUMrcx_t; return(OK); - case HICUM_QUEST_GPX: - value->rValue = *(ckt->CKTstate0 + here->HICUMibpei_Vbpei); + case HICUM_QUEST_RE_T: + value->rValue = here->HICUMre_t; return(OK); - case HICUM_QUEST_GMU: - value->rValue = *(ckt->CKTstate0 + here->HICUMibici_Vbici); + case HICUM_QUEST_RBI: + value->rValue = here->HICUMrbi; return(OK); - case HICUM_QUEST_GX: - value->rValue = *(ckt->CKTstate0 + here->HICUMibpbi_Vbpbi); + case HICUM_QUEST_RB: + value->rValue = here->HICUMrbi + here->HICUMrbx_t; return(OK); - case HICUM_QUEST_GO: - value->rValue = *(ckt->CKTstate0 + here->HICUMiciei_Vbici); +/* transconductances and capacitances */ + case HICUM_QUEST_BETADC: + // HICUMask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalue *select) + IFvalue* IC; + IFvalue* IB; + HICUMask(ckt, instPtr, HICUM_QUEST_CC, IC, select); + HICUMask(ckt, instPtr, HICUM_QUEST_CB, IB, select); + if (IB->rValue != 0.0) { + value->rValue = IC->rValue/IB->rValue; + } else { + value->rValue = 0.0; + } return(OK); - case HICUM_QUEST_CJBE: - value->rValue = here->HICUMcapjei; + case HICUM_QUEST_GMI: + value->rValue = *(ckt->CKTstate0 + here->HICUMiciei_Vbiei); // TODO: Check sign vs VA-Code in ADS return(OK); - case HICUM_QUEST_CDBE: - value->rValue = here->HICUMcapdeix; + case HICUM_QUEST_GMS: + value->rValue = *(ckt->CKTstate0 + here->HICUMibpsi_Vbpci); // TODO: Check sign vs VA-Code in ADS return(OK); - case HICUM_QUEST_CBEP: - value->rValue = here->HICUMcapjep; + case HICUM_QUEST_RPII: + value->rValue = 1/( *(ckt->CKTstate0 + here->HICUMibiei_Vbiei) + ckt->CKTgmin); // TODO: Check sign vs VA-Code in ADS return(OK); - case HICUM_QUEST_CJBC: - value->rValue = here->HICUMcapjci; + case HICUM_QUEST_RPIX: + value->rValue = 1/( *(ckt->CKTstate0 + here->HICUMibpei_Vbpei) + ckt->CKTgmin); // TODO: Check sign vs VA-Code in ADS return(OK); - case HICUM_QUEST_CBCXI: - value->rValue = here->HICUMcapjcx_t_i; + case HICUM_QUEST_RMUI: + value->rValue = 1/( *(ckt->CKTstate0 + here->HICUMibici_Vbici) + ckt->CKTgmin); // TODO: Check sign vs VA-Code in ADS return(OK); - case HICUM_QUEST_CBCXII: - value->rValue = here->HICUMcapjcx_t_ii; + case HICUM_QUEST_RMUX: + value->rValue = 1/( *(ckt->CKTstate0 + here->HICUMibpci_Vbpci) + ckt->CKTgmin); // TODO: Check sign vs VA-Code in ADS return(OK); - case HICUM_QUEST_CSCP: - value->rValue = here->HICUMcapscp; + case HICUM_QUEST_ROI: + value->rValue = 1/( *(ckt->CKTstate0 + here->HICUMiciei_Vbiei) + ckt->CKTgmin); // TODO: Check sign vs VA-Code in ADS return(OK); - case HICUM_QUEST_QBE: - value->rValue = *(ckt->CKTstate0 + here->HICUMqjei); + case HICUM_QUEST_CPII: + value->rValue = here->HICUMcapjei + here->HICUMcapdeix; return(OK); - case HICUM_QUEST_QBC: - value->rValue = *(ckt->CKTstate0 + here->HICUMqjci); + case HICUM_QUEST_CPIX: + value->rValue = here->HICUMcapjep + here->HICUMcbepar; return(OK); + case HICUM_QUEST_CMUI: + value->rValue = here->HICUMcapjci + here->HICUMcapdci; + return(OK); + case HICUM_QUEST_CMUX: + value->rValue = here->HICUMcapjcx_t_i + here->HICUMcapjcx_t_ii + here->HICUMcbcpar + here->HICUMcapdsu; + return(OK); + case HICUM_QUEST_CCS: + value->rValue = here->HICUMcapjs + here->HICUMcapscp; + return(OK); + case HICUM_QUEST_CRBI: + value->rValue = here->HICUMcaprbi; + return(OK); + case HICUM_QUEST_BETAAC: + // HICUMask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalue *select) + double g_be; + IFvalue* RPIi; + IFvalue* RPIx; + IFvalue* GMi; + HICUMask(ckt, instPtr, HICUM_QUEST_RPII, RPIi, select); + HICUMask(ckt, instPtr, HICUM_QUEST_RPIX, RPIx, select); + HICUMask(ckt, instPtr, HICUM_QUEST_GMI, GMi, select); + g_be = 1/(RPIi->rValue + RPIx->rValue); + if (g_be > 0.0) { + value->rValue = GMi->rValue/g_be; + } else { + value->rValue = 0.0; + } + return(OK); +/* transit time */ + case HICUM_QUEST_TF: + value->rValue = here->HICUMtf; + 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))); + IFvalue* GMi; + HICUMask(ckt, instPtr, HICUM_QUEST_GMI, GMi, select); + IFvalue* CPIi; + HICUMask(ckt, instPtr, HICUM_QUEST_CPII, CPIi, select); + IFvalue* CPIx; + HICUMask(ckt, instPtr, HICUM_QUEST_CPIX, CPIx, select); + IFvalue* CMUi; + HICUMask(ckt, instPtr, HICUM_QUEST_CMUI, CMUi, select); + IFvalue* CMUx; + HICUMask(ckt, instPtr, HICUM_QUEST_CMUX, CMUx, select); + IFvalue* rcx_t; + HICUMask(ckt, instPtr, HICUM_QUEST_RCX_T, rcx_t, select); + IFvalue* re_t; + HICUMask(ckt, instPtr, HICUM_QUEST_RE_T, re_t, select); + IFvalue* rb; + HICUMask(ckt, instPtr, HICUM_QUEST_RB, rb, select); + IFvalue* BETAAC; + HICUMask(ckt, instPtr, HICUM_QUEST_BETAAC, BETAAC, select); + + value->rValue = GMi->rValue/( + 2 * M_PI * ( + CPIi->rValue + CPIx->rValue + + CMUi->rValue + CMUx->rValue + + (rcx_t->rValue + re_t->rValue + (re_t->rValue + rb->rValue)/BETAAC->rValue) + ) * GMi->rValue * ( + CMUi->rValue + CMUx->rValue + ) + ); + return(OK); + +/* power */ case HICUM_QUEST_POWER: - value->rValue = fabs(*(ckt->CKTstate0 + here->HICUMiciei)) * fabs(*(ckt->CKTstate0 + here->HICUMvbiei) - *(ckt->CKTstate0 + here->HICUMvbici)) + - fabs(*(ckt->CKTstate0 + here->HICUMibiei) * *(ckt->CKTstate0 + here->HICUMvbiei)) + - fabs(*(ckt->CKTstate0 + here->HICUMibpei) * *(ckt->CKTstate0 + here->HICUMvbpei)) + - fabs(*(ckt->CKTstate0 + here->HICUMibici) * *(ckt->CKTstate0 + here->HICUMvbici)) + - fabs(*(ckt->CKTstate0 + here->HICUMibpci) * *(ckt->CKTstate0 + here->HICUMvbpci)) + - fabs(*(ckt->CKTstate0 + here->HICUMibpsi) * *(ckt->CKTstate0 + here->HICUMvsici)); + value->rValue = here->HICUMpterm; + return(OK); +/* temperature */ + case HICUM_QUEST_TK: + value->rValue = here->HICUMtemp; + return(OK); + case HICUM_QUEST_DTSH: + value->rValue = here->HICUMdtemp_sh; return(OK); default: return(E_BADPARM); diff --git a/src/spicelib/devices/hicum2/hicum2defs.h b/src/spicelib/devices/hicum2/hicum2defs.h index 9cbc8079a..c4e8c6a12 100644 --- a/src/spicelib/devices/hicum2/hicum2defs.h +++ b/src/spicelib/devices/hicum2/hicum2defs.h @@ -66,6 +66,7 @@ typedef struct sHICUMinstance { double HICUMicVCE; /* initial condition voltage C-E */ double HICUMtemp; /* instance temperature */ double HICUMdtemp; /* instance delta temperature */ + double HICUMdtemp_sh; /* instance delta temperature because of self-heating */ double HICUMm; /* multiply factor for the hicum */ double HICUMmg; @@ -101,6 +102,7 @@ typedef struct sHICUMinstance { double HICUMrcx_t; double HICUMrbx_t; double HICUMre_t; + double HICUMrbi; double HICUMtsf_t; double HICUMcscp0_t; double HICUMvdsp_t; @@ -127,6 +129,14 @@ typedef struct sHICUMinstance { double HICUMvds_t; double HICUMvpts_t; + double HICUMiavl; + double HICUMpterm; + + double HICUMtf; + + double HICUMcbepar; + double HICUMcbcpar; + double *HICUMcollCollPtr; /* pointer to sparse matrix at * (collector,collector) */ double *HICUMbaseBasePtr; /* pointer to sparse matrix at @@ -964,8 +974,7 @@ enum { /* device questions */ enum { - HICUM_QUEST_FT = 251, - HICUM_QUEST_COLLNODE, + HICUM_QUEST_COLLNODE = 251, HICUM_QUEST_BASENODE, HICUM_QUEST_EMITNODE, HICUM_QUEST_SUBSNODE, @@ -977,39 +986,45 @@ enum { HICUM_QUEST_XFNODE, HICUM_QUEST_XF1NODE, HICUM_QUEST_XF2NODE, +/* temperature */ + HICUM_QUEST_TK, + HICUM_QUEST_DTSH, +/* voltages */ HICUM_QUEST_VBE, HICUM_QUEST_VBC, + HICUM_QUEST_VCE, + HICUM_QUEST_VSC, +/* currents */ HICUM_QUEST_CC, + HICUM_QUEST_CAVL, HICUM_QUEST_CB, HICUM_QUEST_CE, HICUM_QUEST_CS, - HICUM_QUEST_GM, - HICUM_QUEST_GPI, - HICUM_QUEST_GPX, - HICUM_QUEST_GMU, - HICUM_QUEST_GX, - HICUM_QUEST_GO, - HICUM_QUEST_QBE, - HICUM_QUEST_CQBE, - HICUM_QUEST_QBC, - HICUM_QUEST_CQBC, - HICUM_QUEST_QBX, - HICUM_QUEST_CQBX, - HICUM_QUEST_QBCP, - HICUM_QUEST_CQBCP, - HICUM_QUEST_CEXBC, - HICUM_QUEST_GEQCB, - HICUM_QUEST_GCSUB, - HICUM_QUEST_GDSUB, - HICUM_QUEST_GEQBX, - HICUM_QUEST_CJBE, - HICUM_QUEST_CBEX, - HICUM_QUEST_CDBE, - HICUM_QUEST_CBEP, - HICUM_QUEST_CJBC, - HICUM_QUEST_CBCXI, - HICUM_QUEST_CBCXII, - HICUM_QUEST_CSCP, +/* resistances */ + HICUM_QUEST_RCX_T, + HICUM_QUEST_RE_T, + HICUM_QUEST_RBI, + HICUM_QUEST_RB, +/* transconductances and capacitances */ + HICUM_QUEST_BETADC, + HICUM_QUEST_GMI, + HICUM_QUEST_GMS, + HICUM_QUEST_RPII, + HICUM_QUEST_RPIX, + HICUM_QUEST_RMUI, + HICUM_QUEST_RMUX, + HICUM_QUEST_ROI, + HICUM_QUEST_CPII, + HICUM_QUEST_CPIX, + HICUM_QUEST_CMUI, + HICUM_QUEST_CMUX, + HICUM_QUEST_CCS, + HICUM_QUEST_BETAAC, + HICUM_QUEST_CRBI, +/* transit time */ + HICUM_QUEST_TF, + HICUM_QUEST_FT, +/* power */ HICUM_QUEST_POWER, }; diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index b3499952e..537a49aae 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -111,22 +111,21 @@ duals::duald HICDIO(duals::duald T, double IST, double UM1, duals::duald U) { duals::duald DIOY, le, vt; - // printf("2"); - vt = UM1 * CONSTboltz * T / CHARGE; - DIOY = U/vt; + vt = CONSTboltz * T / CHARGE; + DIOY = U/(UM1*vt); + // le = exp(DIOY); // would be the best way... But stay close to HICUML2.va + // return IST*(le-1.0); if (IST > 0.0) { if (DIOY > Dexp_lim) { le = (1 + (DIOY - Dexp_lim)); DIOY = Dexp_lim; - le = le*exp(DIOY); - return IST*(le-1.0); + return IST*(le*exp(DIOY)-1.0); + } else if (DIOY <= -14.0) { + return -IST; } else { le = exp(DIOY); return IST*(le-1.0); } - if(DIOY <= -14.0) { - return -IST; - } } else { return 0.0; } @@ -541,9 +540,9 @@ void hicum_diode(double T, double IS, double UM1, double U, double *Iz, double * result = HICDIO(T, IS, UM1, U+1_e); *Iz = result.rpart(); - *Gz = result.dpart(); //derivative after U + *Gz = result.dpart(); //derivative for U result = HICDIO(T+1_e, IS, UM1, U); - *Tz = result.dpart(); //derivative after T + *Tz = result.dpart(); //derivative for T } 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_dT, double *Qz, double *Qz_dU, double *Qz_dT) @@ -614,7 +613,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double itf,itr,Tf,Tr,VT_f,i_0f,i_0r,a_bpt,Q_0,Q_p,Q_bpt; double Orci0_t,b_q,I_Tf1,T_f0,Q_fT,T_fT,Q_bf; double a_h,Q_pT,d_Q; - double Qf,Qf_Vbiei,Qf_Vbici,Qf_dT,Cdei,Qr,Cdci; + double Qf, Qf_Vbiei, Qf_Vbici, Qf_dT, Cdei, Qr, Cdci; double ick, ick_Vciei, ick_dT,vc,cjcx01,cjcx02; int l_it; @@ -930,6 +929,9 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) cbepar2 = model->HICUMfbepar * model->HICUMcbepar; cbepar1 = model->HICUMcbepar - cbepar2; + here->HICUMcbepar = model->HICUMcbepar; + here->HICUMcbcpar = model->HICUMcbcpar; + // Avoid divide-by-zero and define infinity other way // High current correction for 2D and 3D effects if (model->HICUMich != 0.0) { @@ -1414,7 +1416,10 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) if (model->HICUMflsh!=0 && model->HICUMrth >= MIN_R) { // Thermal_update_with_self_heating here->HICUMtemp = here->HICUMtemp+Vrth; + here->HICUMdtemp_sh = here->HICUMtemp - ckt->CKTtemp; iret = hicum_thermal_update(model, here); + } else { + here->HICUMdtemp_sh = 0; } // Model_evaluation @@ -1433,6 +1438,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) //TODO: derivatives after cjei0_t, vdei_t ajei_t missing here hicum_qjmodf(here->HICUMtemp,here->HICUMcjei0_t,here->HICUMvdei_t,model->HICUMzei,here->HICUMajei_t,Vbiei,&Cjei,&Cjei_Vbiei, &Cjei_dT,&Qjei, &Qjei_Vbiei, &Qjei_dT); + //TODO:missing temperature derivatives of vdei_t, hjei0_t vdei_t, ahjei_t result = calc_hjei_vbe(Vbiei+1_e, here->HICUMtemp, here, model); hjei_vbe = result.rpart(); @@ -1586,6 +1592,8 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) itf_Vbiei = itf/VT_f; itr_Vbici = itr/here->HICUMvt; + here->HICUMtf = Tf; + //NQS effect implemented with LCR networks //Once the delay in ITF is considered, IT_NQS is calculated afterwards @@ -1625,6 +1633,8 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) iavl_Vbiei += iavl_ditf*itf_Vbiei; iavl_dT = iavl_ditf*itf_dT + iavl_dCjci*Cjci_dT; //TODO: derivatives kavl_t favl_t qavl_t cjci0_t vdci_t + here->HICUMiavl = iavl; + //Excess base current from recombination at the b-c barrier ibh_rec = Q_bf*Otbhrec; //todo: Q_bf derivatives to Vbiei @@ -1640,6 +1650,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) rbi_dCjci = result.dpart(); result = calc_rbi(here->HICUMtemp , Qjei , Cjci , Qf+1_e); rbi_dQf = result.dpart(); + here->HICUMrbi = rbi; rbi_Vbiei = rbi_dQjei* Qjei_Vbiei + rbi_dQf *Qf_Vbiei ; rbi_Vbici = rbi_dQf * Qf_Vbici + rbi_dCjci*Cjci_Vbici ; @@ -1744,7 +1755,10 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) if (here->HICUMrbx_t >= MIN_R) { pterm = pterm + Vbbp*Vbbp/here->HICUMrbx_t; } + } else { + pterm = 0; // default value... } + here->HICUMpterm = pterm; Itxf = itf; Qdeix = Qdei; diff --git a/src/spicelib/devices/hicum2/overview_files.md b/src/spicelib/devices/hicum2/overview_files.md index e5bc1f64e..860147f1a 100644 --- a/src/spicelib/devices/hicum2/overview_files.md +++ b/src/spicelib/devices/hicum2/overview_files.md @@ -6,17 +6,23 @@ This file gives an overview of the files needed for the ngspice HiCUM version, e - assignee (Mario or Markus) # hicum2.c -# hicum2acld..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