HICUM2ask done according to VA-Code

This commit is contained in:
mariok 2020-04-27 17:13:30 +02:00
parent d86caadb07
commit b02c763ed1
5 changed files with 241 additions and 102 deletions

View File

@ -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")
};

View File

@ -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);

View File

@ -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,
};

View File

@ -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;

View File

@ -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