something like that -.-

This commit is contained in:
mariok 2020-08-11 15:37:29 +02:00
parent 929e668836
commit 404e165e4a
4 changed files with 247 additions and 190 deletions

View File

@ -67,6 +67,8 @@ typedef struct sHICUMinstance {
int HICUMxfNode; /* number of internal excess phase node qdei */
int HICUMxf1Node; /* number of internal excess phase 1 node itf */
int HICUMxf2Node; /* number of internal excess phase 2 node itf */
int HICUMNoise1Node; /* number of internal noise 1 node for BiEi correlated noise */
int HICUMNoise2Node; /* number of internal noise 2 node for CiEi correlated noise */
double HICUMarea; /* area factor for the hicum */
//initial conditions
@ -191,8 +193,8 @@ typedef struct sHICUMinstance {
* (emitter prime,xf) */
double *HICUMbaseBIXfPtr; /* pointer to sparse matrix at
* (base prime,xf) */
double *HICUMsubsSISubsSIPtr; /* pointer to sparse matrix at
* (substrate prime, substrate prime) */
@ -254,7 +256,7 @@ typedef struct sHICUMinstance {
* (emitter prime,base prime) */
double *HICUMsubsTempPtr; /* pointer to sparse matrix at
* (subs ,T) */
double *HICUMcollCIBasePtr;
double *HICUMbaseCollCIPtr;
@ -311,6 +313,10 @@ typedef struct sHICUMinstance {
double *HICUMtempSubsSIPtr;
double *HICUMtempTempPtr;
/* correlated noise */
double *HICUMn1N1Ptr;
double *HICUMn2N2Ptr;
unsigned HICUMareaGiven :1; /* flag to indicate area was specified */
unsigned HICUMoff :1; /* 'off' flag for hicum */
unsigned HICUMicVBEGiven :1; /* flag to indicate VBE init. cond. given */
@ -383,150 +389,160 @@ typedef struct sHICUMinstance {
#define HICUMvxf HICUMstate+10
#define HICUMvxf1 HICUMstate+11
#define HICUMvxf2 HICUMstate+12
#define HICUMvn1 HICUMstate+13
#define HICUMvn2 HICUMstate+14
#define HICUMibiei HICUMstate+13
#define HICUMibiei_Vbiei HICUMstate+14
#define HICUMibiei_Vbici HICUMstate+15
#define HICUMibiei_Vrth HICUMstate+16
#define HICUMibiei HICUMstate+15
#define HICUMibiei_Vbiei HICUMstate+16
#define HICUMibiei_Vbici HICUMstate+17
#define HICUMibiei_Vrth HICUMstate+18
#define HICUMibpei HICUMstate+17
#define HICUMibpei_Vbpei HICUMstate+18
#define HICUMibpei_Vrth HICUMstate+19
#define HICUMibpei HICUMstate+19
#define HICUMibpei_Vbpei HICUMstate+20
#define HICUMibpei_Vrth HICUMstate+21
#define HICUMiciei HICUMstate+20
#define HICUMiciei_Vbiei HICUMstate+21
#define HICUMiciei_Vbici HICUMstate+22
#define HICUMiciei_Vxf2 HICUMstate+23
#define HICUMiciei_Vrth HICUMstate+24
#define HICUMiciei HICUMstate+22
#define HICUMiciei_Vbiei HICUMstate+23
#define HICUMiciei_Vbici HICUMstate+24
#define HICUMiciei_Vxf2 HICUMstate+25
#define HICUMiciei_Vrth HICUMstate+26
#define HICUMibici HICUMstate+25
#define HICUMibici_Vbici HICUMstate+26
#define HICUMibici_Vbiei HICUMstate+27
#define HICUMibici_Vrth HICUMstate+28
#define HICUMibici HICUMstate+27
#define HICUMibici_Vbici HICUMstate+28
#define HICUMibici_Vbiei HICUMstate+29
#define HICUMibici_Vrth HICUMstate+30
#define HICUMibpbi HICUMstate+29
#define HICUMibpbi_Vbpbi HICUMstate+30
#define HICUMibpbi_Vbiei HICUMstate+31
#define HICUMibpbi_Vbici HICUMstate+32
#define HICUMibpbi_Vrth HICUMstate+33
#define HICUMibpbi HICUMstate+31
#define HICUMibpbi_Vbpbi HICUMstate+32
#define HICUMibpbi_Vbiei HICUMstate+33
#define HICUMibpbi_Vbici HICUMstate+34
#define HICUMibpbi_Vrth HICUMstate+35
#define HICUMibpci HICUMstate+34
#define HICUMibpci_Vbpci HICUMstate+35
#define HICUMibpci_Vrth HICUMstate+36
#define HICUMibpci HICUMstate+36
#define HICUMibpci_Vbpci HICUMstate+37
#define HICUMibpci_Vrth HICUMstate+38
#define HICUMisici HICUMstate+37
#define HICUMisici_Vsici HICUMstate+38
#define HICUMisici_Vrth HICUMstate+39
#define HICUMisici HICUMstate+39
#define HICUMisici_Vsici HICUMstate+40
#define HICUMisici_Vrth HICUMstate+41
#define HICUMibpsi HICUMstate+40
#define HICUMibpsi_Vbpci HICUMstate+41
#define HICUMibpsi_Vsici HICUMstate+42
#define HICUMibpsi_Vrth HICUMstate+43
#define HICUMibpsi HICUMstate+42
#define HICUMibpsi_Vbpci HICUMstate+43
#define HICUMibpsi_Vsici HICUMstate+44
#define HICUMibpsi_Vrth HICUMstate+45
#define HICUMisis_Vsis HICUMstate+44
#define HICUMisis_Vsis HICUMstate+46
#define HICUMieie HICUMstate+45 // needed for re-flicker noise
#define HICUMieie_Vrth HICUMstate+46
#define HICUMieie HICUMstate+47 // needed for re-flicker noise
#define HICUMieie_Vrth HICUMstate+48
#define HICUMqrbi HICUMstate+47
#define HICUMcqrbi HICUMstate+48
#define HICUMqrbi HICUMstate+49
#define HICUMcqrbi HICUMstate+50
#define HICUMqjei HICUMstate+49
#define HICUMcqjei HICUMstate+50
#define HICUMqjei HICUMstate+51
#define HICUMcqjei HICUMstate+52
#define HICUMqf HICUMstate+51
#define HICUMcqf HICUMstate+52
#define HICUMqf HICUMstate+53
#define HICUMcqf HICUMstate+54
#define HICUMqr HICUMstate+53
#define HICUMcqr HICUMstate+54
#define HICUMqr HICUMstate+55
#define HICUMcqr HICUMstate+56
#define HICUMqjci HICUMstate+55
#define HICUMcqjci HICUMstate+56
#define HICUMqjci HICUMstate+57
#define HICUMcqjci HICUMstate+58
#define HICUMqjep HICUMstate+57
#define HICUMcqjep HICUMstate+58
#define HICUMqjep HICUMstate+59
#define HICUMcqjep HICUMstate+60
#define HICUMqjcx0_i HICUMstate+59
#define HICUMcqcx0_t_i HICUMstate+60
#define HICUMqjcx0_i HICUMstate+61
#define HICUMcqcx0_t_i HICUMstate+62
#define HICUMqjcx0_ii HICUMstate+61
#define HICUMcqcx0_t_ii HICUMstate+62
#define HICUMqjcx0_ii HICUMstate+63
#define HICUMcqcx0_t_ii HICUMstate+64
#define HICUMqdsu HICUMstate+63
#define HICUMcqdsu HICUMstate+64
#define HICUMqdsu HICUMstate+65
#define HICUMcqdsu HICUMstate+66
#define HICUMqjs HICUMstate+65
#define HICUMcqjs HICUMstate+66
#define HICUMqjs HICUMstate+67
#define HICUMcqjs HICUMstate+68
#define HICUMqscp HICUMstate+67
#define HICUMcqscp HICUMstate+68
#define HICUMqscp HICUMstate+69
#define HICUMcqscp HICUMstate+70
#define HICUMqbepar1 HICUMstate+69
#define HICUMcqbepar1 HICUMstate+70
#define HICUMgqbepar1 HICUMstate+71
#define HICUMqbepar1 HICUMstate+71
#define HICUMcqbepar1 HICUMstate+72
#define HICUMgqbepar1 HICUMstate+73
#define HICUMqbepar2 HICUMstate+72
#define HICUMcqbepar2 HICUMstate+73
#define HICUMgqbepar2 HICUMstate+74
#define HICUMqbepar2 HICUMstate+74
#define HICUMcqbepar2 HICUMstate+75
#define HICUMgqbepar2 HICUMstate+76
#define HICUMqbcpar1 HICUMstate+75
#define HICUMcqbcpar1 HICUMstate+76
#define HICUMgqbcpar1 HICUMstate+77
#define HICUMqbcpar1 HICUMstate+77
#define HICUMcqbcpar1 HICUMstate+78
#define HICUMgqbcpar1 HICUMstate+79
#define HICUMqbcpar2 HICUMstate+78
#define HICUMcqbcpar2 HICUMstate+79
#define HICUMgqbcpar2 HICUMstate+80
#define HICUMqbcpar2 HICUMstate+80
#define HICUMcqbcpar2 HICUMstate+81
#define HICUMgqbcpar2 HICUMstate+82
#define HICUMqsu HICUMstate+81
#define HICUMcqsu HICUMstate+82
#define HICUMgqsu HICUMstate+83
#define HICUMqsu HICUMstate+83
#define HICUMcqsu HICUMstate+84
#define HICUMgqsu HICUMstate+85
#define HICUMqcth HICUMstate+84
#define HICUMcqcth HICUMstate+85
#define HICUMqcth HICUMstate+86
#define HICUMcqcth HICUMstate+87
#define HICUMqxf HICUMstate+86
#define HICUMcqxf HICUMstate+87
#define HICUMgqxf HICUMstate+88
#define HICUMixf HICUMstate+89
#define HICUMixf_Vbiei HICUMstate+90
#define HICUMixf_Vbici HICUMstate+91
#define HICUMixf_Vxf HICUMstate+92
#define HICUMixf_Vrth HICUMstate+93
#define HICUMqxf HICUMstate+88
#define HICUMcqxf HICUMstate+89
#define HICUMgqxf HICUMstate+90
#define HICUMixf HICUMstate+91
#define HICUMixf_Vbiei HICUMstate+92
#define HICUMixf_Vbici HICUMstate+93
#define HICUMixf_Vxf HICUMstate+94
#define HICUMixf_Vrth HICUMstate+95
#define HICUMqxf1 HICUMstate+94
#define HICUMcqxf1 HICUMstate+95
#define HICUMgqxf1 HICUMstate+96
#define HICUMixf1 HICUMstate+97
#define HICUMixf1_Vbiei HICUMstate+98
#define HICUMixf1_Vbici HICUMstate+99
#define HICUMixf1_Vxf2 HICUMstate+100
#define HICUMixf1_Vxf1 HICUMstate+101
#define HICUMixf1_Vrth HICUMstate+102
#define HICUMqxf1 HICUMstate+96
#define HICUMcqxf1 HICUMstate+97
#define HICUMgqxf1 HICUMstate+98
#define HICUMixf1 HICUMstate+99
#define HICUMixf1_Vbiei HICUMstate+100
#define HICUMixf1_Vbici HICUMstate+101
#define HICUMixf1_Vxf2 HICUMstate+102
#define HICUMixf1_Vxf1 HICUMstate+103
#define HICUMixf1_Vrth HICUMstate+104
#define HICUMqxf2 HICUMstate+103
#define HICUMcqxf2 HICUMstate+104
#define HICUMgqxf2 HICUMstate+105
#define HICUMixf2 HICUMstate+106
#define HICUMixf2_Vbiei HICUMstate+108
#define HICUMixf2_Vbici HICUMstate+109
#define HICUMixf2_Vxf1 HICUMstate+110
#define HICUMixf2_Vxf2 HICUMstate+111
#define HICUMixf2_Vrth HICUMstate+112
#define HICUMqxf2 HICUMstate+105
#define HICUMcqxf2 HICUMstate+106
#define HICUMgqxf2 HICUMstate+107
#define HICUMixf2 HICUMstate+108
#define HICUMixf2_Vbiei HICUMstate+109
#define HICUMixf2_Vbici HICUMstate+110
#define HICUMixf2_Vxf1 HICUMstate+111
#define HICUMixf2_Vxf2 HICUMstate+112
#define HICUMixf2_Vrth HICUMstate+113
#define HICUMith HICUMstate+113
#define HICUMith_Vrth HICUMstate+114
#define HICUMith_Vbiei HICUMstate+115
#define HICUMith_Vbici HICUMstate+116
#define HICUMith_Vbpbi HICUMstate+117
#define HICUMith_Vbpci HICUMstate+118
#define HICUMith_Vbpei HICUMstate+119
#define HICUMith_Vciei HICUMstate+120
#define HICUMith_Vsici HICUMstate+121
#define HICUMith_Vcic HICUMstate+122
#define HICUMith_Vbbp HICUMstate+123
#define HICUMith_Veie HICUMstate+124
#define HICUMith HICUMstate+114
#define HICUMith_Vrth HICUMstate+115
#define HICUMith_Vbiei HICUMstate+116
#define HICUMith_Vbici HICUMstate+117
#define HICUMith_Vbpbi HICUMstate+118
#define HICUMith_Vbpci HICUMstate+119
#define HICUMith_Vbpei HICUMstate+120
#define HICUMith_Vciei HICUMstate+121
#define HICUMith_Vsici HICUMstate+122
#define HICUMith_Vcic HICUMstate+123
#define HICUMith_Vbbp HICUMstate+124
#define HICUMith_Veie HICUMstate+125
#define HICUMnumStates 125
#define HICUMqn1 HICUMstate+126
#define HICUMcqn1 HICUMstate+127
#define HICUMgqn1 HICUMstate+128
#define HICUMqn2 HICUMstate+129
#define HICUMcqn2 HICUMstate+130
#define HICUMgqn2 HICUMstate+131
#define HICUMnumStates 132
/* per model data */
typedef struct sHICUMmodel { /* model structure for a hicum */

View File

@ -169,33 +169,16 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata
*(ckt->CKTstate0 + here->HICUMisici));
//todo: iciei contains it, has to be separated for non-correlated noise
if ( model->HICUMflcono == 1 && (model->HICUMalit > 0 && model->HICUMalqf > 0)) {
// parameter definition
int n_w = 1;
float n_1 = here->HICUMtf*model->HICUMalit;
IFvalue betadc;
HICUMask(ckt, here, HICUM_QUEST_BETADC, &betadc, select);
float sqrt_n2 = betadc.rValue * (2*model->HICUMalqf-model->HICUMalit*model->HICUMalit);
float n_2 = 0;
if (model->HICUMflcono == 1 && (model->HICUMalit > 0 && model->HICUMalqf > 0)) {
// in case of correlated noise, the noise is added to two new branches and then added to biei and ciei in the DC/AC load
NevalSrc(&noizDens[HICUMIBEINOIZ],&lnNdens[HICUMIBEINOIZ],
ckt,SHOTNOISE,here->HICUMNoise1Node, 0,
*(ckt->CKTstate0 + here->HICUMibiei));
NevalSrc(&noizDens[HICUMITNOIZ],&lnNdens[HICUMITNOIZ],
ckt,SHOTNOISE,here->HICUMNoise2Node, 0,
*(ckt->CKTstate0 + here->HICUMiciei));
if (sqrt_n2 > 0.0) {
n_2 = here->HICUMtf*sqrt(sqrt_n2);
}
// realization of modified base shot noise source I1(bi,ei)
I(b_n1) <+ white_noise(2*`P_Q*abs(ibei),"ibei");
I(b_n1) <+ -V(b_n1);
I(bi,ei) <+ V(b_n1)+n_2/n_w*ddt(n_w*V(b_n1));
// realization of controlled base noise source I2(bi,ei)
I(bi,ei) <+ n_1/n_w*ddt(n_w*V(b_n2));
// realization of modified collector shot noise source I(ci,ei) (uncontrolled)
I(b_n2) <+ white_noise(2*`P_Q*abs(it),"it");
I(b_n2) <+ -V(b_n2);
I(ci,ei) <+ V(b_n2);
// end "Correlated noise in BJT"
} else {
NevalSrc(&noizDens[HICUMITNOIZ],&lnNdens[HICUMITNOIZ],
ckt,SHOTNOISE,here->HICUMcollCINode,here->HICUMemitEINode,

View File

@ -450,7 +450,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
double Ibpbi, Ibpbi_Vbpbi, Ibpbi_Vbici, Ibpbi_Vbiei;
double Ibpsi, Ibpsi_Vbpci, Ibpsi_Vsici, Ibpsi_Vrth;
double Icic_Vcic=0.0;
double Ibci=0.0, Ibci_Vbci=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;
@ -464,7 +464,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
//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. Else it is equal to 1.
duals::duald Temp_dual;
duals::duald Temp_dual;
double Cjei_Vbiei,Cjci_Vbici,Cjep_Vbpei,Cjep_dT,Cjs_Vsici;
double Cjei_dT, Cjci_dT;
@ -1119,6 +1119,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
// Model_initialization
int selfheat = ((model->HICUMflsh > 0) && (model->HICUMrthGiven) && (model->HICUMrth > 0.0));
int nqs = ((model->HICUMflnqs != 0 || model->HICUMflcomp < 2.3) && (model->HICUMalit > 0 || model->HICUMalqf > 0));
int correlated_noise = (model->HICUMflcono == 1 && (model->HICUMalit > 0 && model->HICUMalqf > 0));
// Avoid divide-by-zero and define infinity other way
// High current correction for 2D and 3D effects
@ -1589,17 +1590,17 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate0 + here->HICUMibpsi_Vrth)*delvrth +
*(ckt->CKTstate0 + here->HICUMibpsi_Vsici)*delvsici;
ithhat = *(ckt->CKTstate0 + here->HICUMith) +
*(ckt->CKTstate0 + here->HICUMith_Vbiei)*delvbiei+
*(ckt->CKTstate0 + here->HICUMith_Vbici)*delvbici+
*(ckt->CKTstate0 + here->HICUMith_Vbpbi)*delvbpbi+
*(ckt->CKTstate0 + here->HICUMith_Vbpci)*delvbpci+
*(ckt->CKTstate0 + here->HICUMith_Vbpei)*delvbpei+
*(ckt->CKTstate0 + here->HICUMith_Vciei)*delvciei+
*(ckt->CKTstate0 + here->HICUMith_Vsici)*delvsici+
*(ckt->CKTstate0 + here->HICUMith_Vcic)*delvcic+
*(ckt->CKTstate0 + here->HICUMith_Vbbp)*delvbbp+
*(ckt->CKTstate0 + here->HICUMith_Veie)*delveie+
*(ckt->CKTstate0 + here->HICUMith_Vrth)*delvrth;
*(ckt->CKTstate0 + here->HICUMith_Vbiei)*delvbiei+
*(ckt->CKTstate0 + here->HICUMith_Vbici)*delvbici+
*(ckt->CKTstate0 + here->HICUMith_Vbpbi)*delvbpbi+
*(ckt->CKTstate0 + here->HICUMith_Vbpci)*delvbpci+
*(ckt->CKTstate0 + here->HICUMith_Vbpei)*delvbpei+
*(ckt->CKTstate0 + here->HICUMith_Vciei)*delvciei+
*(ckt->CKTstate0 + here->HICUMith_Vsici)*delvsici+
*(ckt->CKTstate0 + here->HICUMith_Vcic)*delvcic+
*(ckt->CKTstate0 + here->HICUMith_Vbbp)*delvbbp+
*(ckt->CKTstate0 + here->HICUMith_Veie)*delveie+
*(ckt->CKTstate0 + here->HICUMith_Vrth)*delvrth;
/*
* bypass if solution has not changed
*/
@ -2019,7 +2020,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
iavl_Vbiei = result.dpart();
result = calc_iavl(Vbici , Cjci+1_e*Cjci_dT , itf+1_e*itf_dT , Temp_dual);
iavl_dT = result.dpart();
iavl_dT = result.dpart();
here->HICUMiavl = iavl;
@ -2315,8 +2316,8 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
Ibpci_Vrth = model->HICUMtype*ijbcx_dT;
Ibici = model->HICUMtype*(ibci - iavl);
Ibici_Vbici = model->HICUMtype*(ibci_Vbici - iavl_Vbici);
Ibici_Vbiei = model->HICUMtype*( - iavl_Vbiei);
Ibici_Vbici = model->HICUMtype*(ibci_Vbici - iavl_Vbici);
Ibici_Vbiei = model->HICUMtype*( - iavl_Vbiei);
Ibici_Vrth = model->HICUMtype*(ibci_dT - iavl_dT);
Isici = model->HICUMtype*ijsc;
@ -2332,7 +2333,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
if (rbi > 0.0) {
Ibpbi = Vbpbi / rbi;
Ibpbi_Vbpbi = 1 / rbi;
Ibpbi_Vbiei = -Vbpbi * rbi_Vbiei / (rbi*rbi);
Ibpbi_Vbiei = -Vbpbi * rbi_Vbiei / (rbi*rbi);
Ibpbi_Vbici = -Vbpbi * rbi_Vbici / (rbi*rbi);
Ibpbi_Vrth = -Vbpbi * rbi_dT / (rbi*rbi);
} else {
@ -2368,19 +2369,19 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
Ith_Vrth = pterm_dT;
Ith_Vrth += -1/here->HICUMrth_t.rpart;
Ith_Vrth += +Vrth/(here->HICUMrth_t.rpart*here->HICUMrth_t.rpart) * here->HICUMrth_t.dpart;
Ith_Vrth += +Vrth/(here->HICUMrth_t.rpart*here->HICUMrth_t.rpart) * here->HICUMrth_t.dpart;
if (model->HICUMflsh == 1) {
//it(Vbiei,Vbici)*(Vbiei-Vbici)
Ith_Vbiei += it_Vbiei*(Vbiei-Vbici) + it;
Ith_Vbici += it_Vbici*(Vbiei-Vbici) - it;
//avalanche current
//avalanche current
//(here->HICUMvdci_t.rpart-Vbici)*iavl = vdci_t*iavl - Vbici*iavl
Ith_Vbici += (here->HICUMvdci_t.rpart-Vbici)*iavl_Vbici - iavl;
Ith_Vbiei += (here->HICUMvdci_t.rpart-Vbici)*iavl_Vbiei;
} else if (model->HICUMflsh == 2) {
//remember:
//pterm = (Vbiei-Vbici)*it + (here->HICUMvdci_t.rpart-Vbici)*iavl + ibei*Vbiei + ibci*Vbici + ibep*Vbpei + ijbcx*Vbpci + ijsc*Vsici;
//it(Vbiei,Vbici)*(Vbiei-Vbici)
//it(Vbiei,Vbici)*(Vbiei-Vbici)
Ith_Vbiei += it_Vbiei*(Vbiei-Vbici) + it;
Ith_Vbici += it_Vbici*(Vbiei-Vbici) - it;
//Vbiei*Ibiei(Vbiei)
@ -2583,10 +2584,10 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
//transient analysis
if(ckt->CKTmode & MODEINITTRAN) {
//copy charges to CKTstate1
*(ckt->CKTstate1 + here->HICUMqrbi) =
*(ckt->CKTstate0 + here->HICUMqrbi) ;
*(ckt->CKTstate1 + here->HICUMqjei) =
*(ckt->CKTstate0 + here->HICUMqjei) ;
*(ckt->CKTstate1 + here->HICUMqrbi) =
*(ckt->CKTstate0 + here->HICUMqrbi) ;
*(ckt->CKTstate1 + here->HICUMqjei) =
*(ckt->CKTstate0 + here->HICUMqjei) ;
*(ckt->CKTstate1 + here->HICUMqf) =
*(ckt->CKTstate0 + here->HICUMqf) ;
*(ckt->CKTstate1 + here->HICUMqr) =
@ -2714,10 +2715,10 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
if(ckt->CKTmode & MODEINITTRAN) {
//copy from state1 to state0
*(ckt->CKTstate1 + here->HICUMcqrbi) =
*(ckt->CKTstate0 + here->HICUMcqrbi) ;
*(ckt->CKTstate1 + here->HICUMcqjei) =
*(ckt->CKTstate0 + here->HICUMcqjei) ;
*(ckt->CKTstate1 + here->HICUMcqrbi) =
*(ckt->CKTstate0 + here->HICUMcqrbi) ;
*(ckt->CKTstate1 + here->HICUMcqjei) =
*(ckt->CKTstate0 + here->HICUMcqjei) ;
*(ckt->CKTstate1 + here->HICUMcqf) =
*(ckt->CKTstate0 + here->HICUMcqf) ;
*(ckt->CKTstate1 + here->HICUMcqr) =
@ -2760,7 +2761,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
}
/*
* charge storage for electrostatic caps
* charge storage for electrostatic caps
*/
if(ckt->CKTmode & (MODETRAN | MODEAC)) {
// Ibe += ddt(cbepar1*Vbe);
@ -2897,11 +2898,11 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
load:
// #############################################################
// ############### STAMPS NO SH ##############################
// #############################################################
// #############################################################
// first branches that are not relevant in DC HICUM, e.g. only in the transient case
// Branch: sc, Stamp element: Cscp
// Branch: sc, Stamp element: Cscp
rhs_current = model->HICUMtype * (Isc - Isc_Vsc*Vsc);
*(ckt->CKTrhs + here->HICUMsubsNode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMcollNode) += rhs_current;
@ -2923,7 +2924,7 @@ load:
*(here->HICUMcollCIBasePtr) += -Ibci_Vbci;
// finish
// Branch: be, Stamp element: Cbepar1
// Branch: be, Stamp element: Cbepar1
rhs_current = model->HICUMtype * (*(ckt->CKTstate0 + here->HICUMcqbepar1) - Vbe * gqbepar1);
*(ckt->CKTrhs + here->HICUMbaseNode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMemitNode) += rhs_current;
@ -2934,7 +2935,7 @@ load:
*(here->HICUMemitBasePtr) += -gqbepar1;
// finish
// Branch: bpe, Stamp element: Cbepar2
// Branch: bpe, Stamp element: Cbepar2
rhs_current = model->HICUMtype * (*(ckt->CKTstate0 + here->HICUMcqbepar2) - Vbpe * gqbepar2);
*(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMemitNode) += rhs_current;
@ -3032,7 +3033,7 @@ load:
*(here->HICUMcollCIEmitEIPtr) += -Iciei_Vbiei;
*(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbiei;
// with respect to Vbici
*(here->HICUMcollCIBaseBIPtr) += Iciei_Vbici;
*(here->HICUMcollCIBaseBIPtr) += Iciei_Vbici;
*(here->HICUMemitEICollCIPtr) += Iciei_Vbici;
*(here->HICUMcollCICollCIPtr) += -Iciei_Vbici;
*(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbici;
@ -3083,19 +3084,19 @@ load:
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;
//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->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbiei;
*(here->HICUMbaseBIEmitEIPtr) += Ibpbi_Vbiei;
*(here->HICUMbaseBPEmitEIPtr) += -Ibpbi_Vbiei;
*(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbiei;
// with respect to Vbici
*(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbici;
*(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbici;
*(here->HICUMbaseBICollCIPtr) += Ibpbi_Vbici;
*(here->HICUMbaseBPCollCIPtr) += -Ibpbi_Vbici;
*(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbici;
@ -3139,7 +3140,7 @@ load:
// finish
if (nqs) {
// Branch: xf1-ground, Stamp element: Ixf1 f_xf1=+
// 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;
@ -3149,7 +3150,7 @@ load:
*(here->HICUMxf1Xf2Ptr) += +Ixf1_Vxf2;
*(here->HICUMxf1Xf1Ptr) += +Ixf1_Vxf1;
// Branch: xf2-ground, Stamp element: Ixf2 f_xf2=+
// 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;
@ -3159,7 +3160,7 @@ load:
*(here->HICUMxf2Xf2Ptr) += +Ixf2_Vxf2;
*(here->HICUMxf2Xf1Ptr) += +Ixf2_Vxf1;
// Branch: xf-ground, Stamp element: Ixf f_xf=+
// 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;
@ -3172,14 +3173,14 @@ load:
// #############################################################
// ############### FINISH STAMPS NO SH #########################
// #############################################################
// #############################################################
if (selfheat) {
// #############################################################
// ############### STAMP WITH SH ADDITIONS #####################
// #############################################################
// Stamp element: Ibiei f_Bi = + f_Ei = -
rhs_current = -Ibiei_Vrth*Vrth;
*(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current;
@ -3283,21 +3284,21 @@ load:
// finish
if (nqs) {
// Stamp element: Ixf f_xf = +
// Stamp element: Ixf f_xf = +
rhs_current = -Ixf_dT*Vrth;
*(ckt->CKTrhs + here->HICUMxfNode) += -rhs_current;
// with respect to Potential Vxf
*(here->HICUMxfTempPtr) += Ixf_dT;
// finish
// Stamp element: Ixf1 f_xf1 = +
// 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;
// finish
// Stamp element: Ixf2 f_xf2 = +
// Stamp element: Ixf2 f_xf2 = +
rhs_current = -Ixf2_dT*Vrth;
*(ckt->CKTrhs + here->HICUMxf2Node) += -rhs_current;
// with respect to Potential Vxf2
@ -3305,8 +3306,8 @@ load:
// finish
}
// Stamp element: Ith f_T = - Ith
rhs_current = Ith
// Stamp element: Ith f_T = - Ith
rhs_current = Ith
- Ith_Vbiei*Vbiei - Ith_Vbici*Vbici - Ith_Vciei*Vciei
- Ith_Vbpei*Vbpei - Ith_Vbpci*Vbpci - Ith_Vsici*Vsici
- Ith_Vbpbi*Vbpbi
@ -3355,6 +3356,63 @@ load:
*(here->HICUMtempTempPtr) += +Icth_Vrth;
// finish
}
if (correlated_noise) {
// #############################################################
// ############# STAMP WITH CORRELATED NOISE ###################
// #############################################################
// parameter definition
int n_w = 1;
double n_1 = Tf*model->HICUMalit;
double betadc = it/ibei;
double sqrt_n2 = betadc * (2*model->HICUMalqf-model->HICUMalit*model->HICUMalit);
double n_2 = 0;
if (sqrt_n2 > 0.0) {
n_2 = Tf*sqrt(sqrt_n2);
}
// Branch: n1 0, Stamp element: Rn1 = 1 Ohm
// with respect to Vn1
*(ckt->CKTrhs + here->HICUMNoise1Node) -= *(ckt->CKTstate0 + here->HICUMvn1);
// finish
// Branch: n2 0, Stamp element: Rn2 = 1 Ohm
// with respect to Vn2
*(ckt->CKTrhs + here->HICUMNoise2Node) -= *(ckt->CKTstate0 + here->HICUMvn2);
// finish
// Stamp element: Ibiei f_Bi = + f_Ei = -
// realization of modified base shot noise source I1(bi,ei)
rhs_current = -*(ckt->CKTstate0 + here->HICUMvn1);
double q_n1 = n_w* *(ckt->CKTstate0 + here->HICUMvn1);
double In1_Vn1 = 0;
// I(bi,ei) <+ n_2/n_w*ddt(n_w* *(ckt->CKTstate0 + here->HICUMvn1));
error = NIintegrate(ckt, &geq, &ceq, n_w, here->HICUMqn1);
if(error) return(error);
In1_Vn1 += n_2/n_w*geq;
rhs_current += n_2/n_w * *(ckt->CKTstate0 + here->HICUMcqn1);
*(ckt->CKTrhs + here->HICUMcollCINode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current;
*(here->HICUMn1N1Ptr) += +In1_Vn1;
// realization of controlled base noise source I2(bi,ei)
// I(bi,ei) <+ n_1/n_w*ddt(n_w* *(ckt->CKTstate0 + here->HICUMvn2));
error = NIintegrate(ckt, &geq, &ceq, n_w, here->HICUMqn1);
if(error) return(error);
In1_Vn1 += n_2/n_w*geq;
rhs_current += n_2/n_w * *(ckt->CKTstate0 + here->HICUMcqn1);
// finish
// Stamp element: Iciei f_Ci = + f_Ei = -
// realization of modified collector shot noise source I(ci,ei) (uncontrolled)
rhs_current = -*(ckt->CKTstate0 + here->HICUMvn2);
*(ckt->CKTrhs + here->HICUMcollCINode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current;
}
}
}

View File

@ -2,5 +2,5 @@
/icm/GNUmakefile
/icm/makedefs
!/examples/*/Makefile