HICUM2ask done according to VA-Code
This commit is contained in:
parent
d86caadb07
commit
b02c763ed1
|
|
@ -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")
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue