Merge remote-tracking branch 'origin/markus_dev' into hicum2-mario
This commit is contained in:
commit
a642b4bab2
|
|
@ -21,7 +21,7 @@ noise v(c) vin dec 10 10 10G 1
|
||||||
setplot
|
setplot
|
||||||
setplot noise1
|
setplot noise1
|
||||||
plot ally
|
plot ally
|
||||||
plot 300*inoise_spectrum onoise_spectrum
|
plot inoise_spectrum onoise_spectrum loglog
|
||||||
setplot noise2
|
setplot noise2
|
||||||
print all
|
print all
|
||||||
echo
|
echo
|
||||||
|
|
|
||||||
|
|
@ -161,6 +161,8 @@ typedef struct sHICUMinstance {
|
||||||
double HICUMrbx_scaled;
|
double HICUMrbx_scaled;
|
||||||
double HICUMrcx_scaled;
|
double HICUMrcx_scaled;
|
||||||
double HICUMrbi0_scaled;
|
double HICUMrbi0_scaled;
|
||||||
|
double HICUMkf_scaled;
|
||||||
|
double HICUMkfre_scaled;
|
||||||
|
|
||||||
double HICUMrbi;
|
double HICUMrbi;
|
||||||
double HICUMiavl;
|
double HICUMiavl;
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata
|
||||||
|
|
||||||
HICUMmodel *firstModel = (HICUMmodel *) genmodel;
|
HICUMmodel *firstModel = (HICUMmodel *) genmodel;
|
||||||
HICUMmodel *model;
|
HICUMmodel *model;
|
||||||
HICUMinstance *inst;
|
HICUMinstance *here;
|
||||||
double tempOnoise;
|
double tempOnoise;
|
||||||
double tempInoise;
|
double tempInoise;
|
||||||
double noizDens[HICUMNSRCS];
|
double noizDens[HICUMNSRCS];
|
||||||
|
|
@ -66,32 +66,32 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata
|
||||||
};
|
};
|
||||||
|
|
||||||
for (model=firstModel; model != NULL; model=HICUMnextModel(model)) {
|
for (model=firstModel; model != NULL; model=HICUMnextModel(model)) {
|
||||||
for (inst=HICUMinstances(model); inst != NULL;
|
for (here=HICUMinstances(model); here != NULL;
|
||||||
inst=HICUMnextInstance(inst)) {
|
here=HICUMnextInstance(here)) {
|
||||||
|
|
||||||
// get all derivatives of branch DC currents
|
// get all derivatives of branch DC currents
|
||||||
if(model->HICUMrcxGiven && model->HICUMrcx != 0) {
|
if(model->HICUMrcxGiven && model->HICUMrcx != 0) {
|
||||||
Icic_Vcic = 1/inst->HICUMrcx_t.rpart;
|
Icic_Vcic = 1/here->HICUMrcx_t.rpart;
|
||||||
} else {
|
} else {
|
||||||
Icic_Vcic = 0.0;
|
Icic_Vcic = 0.0;
|
||||||
}
|
}
|
||||||
if(model->HICUMrbxGiven && model->HICUMrbx != 0) {
|
if(model->HICUMrbxGiven && model->HICUMrbx != 0) {
|
||||||
Ibbp_Vbbp = 1/inst->HICUMrbx_t.rpart;
|
Ibbp_Vbbp = 1/here->HICUMrbx_t.rpart;
|
||||||
} else {
|
} else {
|
||||||
Ibbp_Vbbp = 0.0;
|
Ibbp_Vbbp = 0.0;
|
||||||
}
|
}
|
||||||
if(model->HICUMreGiven && model->HICUMre != 0) {
|
if(model->HICUMreGiven && model->HICUMre != 0) {
|
||||||
Ieie_Veie = 1/inst->HICUMre_t.rpart;
|
Ieie_Veie = 1/here->HICUMre_t.rpart;
|
||||||
} else {
|
} else {
|
||||||
Ieie_Veie = 0.0;
|
Ieie_Veie = 0.0;
|
||||||
}
|
}
|
||||||
if(model->HICUMrsuGiven && model->HICUMrsu != 0) {
|
if(model->HICUMrsuGiven && model->HICUMrsu != 0) {
|
||||||
Isis_Vsis = 1/model->HICUMrsu*inst->HICUMm;
|
Isis_Vsis = 1/model->HICUMrsu*here->HICUMm;
|
||||||
} else {
|
} else {
|
||||||
Isis_Vsis = 0.0;
|
Isis_Vsis = 0.0;
|
||||||
}
|
}
|
||||||
if(inst->HICUMrbi > 0) {
|
if(here->HICUMrbi > 0) {
|
||||||
Ibpbi_Vbpbi = 1/inst->HICUMrbi;
|
Ibpbi_Vbpbi = 1/here->HICUMrbi;
|
||||||
} else {
|
} else {
|
||||||
Ibpbi_Vbpbi = 0.0;
|
Ibpbi_Vbpbi = 0.0;
|
||||||
}
|
}
|
||||||
|
|
@ -108,14 +108,14 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata
|
||||||
|
|
||||||
case N_DENS:
|
case N_DENS:
|
||||||
for (i=0; i < HICUMNSRCS; i++) {
|
for (i=0; i < HICUMNSRCS; i++) {
|
||||||
NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->HICUMname, HICUMnNames[i]);
|
NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", here->HICUMname, HICUMnNames[i]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INT_NOIZ:
|
case INT_NOIZ:
|
||||||
for (i=0; i < HICUMNSRCS; i++) {
|
for (i=0; i < HICUMNSRCS; i++) {
|
||||||
NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->HICUMname, HICUMnNames[i]);
|
NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", here->HICUMname, HICUMnNames[i]);
|
||||||
NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->HICUMname, HICUMnNames[i]);
|
NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", here->HICUMname, HICUMnNames[i]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -127,78 +127,79 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata
|
||||||
|
|
||||||
case N_DENS:
|
case N_DENS:
|
||||||
NevalSrc(&noizDens[HICUMRCNOIZ],&lnNdens[HICUMRCNOIZ],
|
NevalSrc(&noizDens[HICUMRCNOIZ],&lnNdens[HICUMRCNOIZ],
|
||||||
ckt,THERMNOISE,inst->HICUMcollCINode,inst->HICUMcollNode,
|
ckt,THERMNOISE,here->HICUMcollCINode,here->HICUMcollNode,
|
||||||
Icic_Vcic);
|
Icic_Vcic);
|
||||||
|
|
||||||
NevalSrc(&noizDens[HICUMRBNOIZ],&lnNdens[HICUMRBNOIZ],
|
NevalSrc(&noizDens[HICUMRBNOIZ],&lnNdens[HICUMRBNOIZ],
|
||||||
ckt,THERMNOISE,inst->HICUMbaseNode,inst->HICUMbaseBPNode,
|
ckt,THERMNOISE,here->HICUMbaseNode,here->HICUMbaseBPNode,
|
||||||
Ibbp_Vbbp);
|
Ibbp_Vbbp);
|
||||||
|
|
||||||
NevalSrc(&noizDens[HICUMRBINOIZ],&lnNdens[HICUMRBINOIZ],
|
NevalSrc(&noizDens[HICUMRBINOIZ],&lnNdens[HICUMRBINOIZ],
|
||||||
ckt,THERMNOISE,inst->HICUMbaseBPNode,inst->HICUMbaseBINode,
|
ckt,THERMNOISE,here->HICUMbaseBPNode,here->HICUMbaseBINode,
|
||||||
Ibpbi_Vbpbi);
|
Ibpbi_Vbpbi);
|
||||||
|
|
||||||
NevalSrc(&noizDens[HICUMRENOIZ],&lnNdens[HICUMRENOIZ],
|
NevalSrc(&noizDens[HICUMRENOIZ],&lnNdens[HICUMRENOIZ],
|
||||||
ckt,THERMNOISE,inst->HICUMemitEINode,inst->HICUMemitNode,
|
ckt,THERMNOISE,here->HICUMemitEINode,here->HICUMemitNode,
|
||||||
Ieie_Veie);
|
Ieie_Veie);
|
||||||
|
|
||||||
NevalSrc(&noizDens[HICUMRSNOIZ],&lnNdens[HICUMRSNOIZ],
|
NevalSrc(&noizDens[HICUMRSNOIZ],&lnNdens[HICUMRSNOIZ],
|
||||||
ckt,THERMNOISE,inst->HICUMsubsSINode,inst->HICUMsubsNode,
|
ckt,THERMNOISE,here->HICUMsubsSINode,here->HICUMsubsNode,
|
||||||
Isis_Vsis);
|
Isis_Vsis);
|
||||||
|
|
||||||
//todo: ibici contains iavl, has to be separated for non-correlated noise
|
|
||||||
// NevalSrc(&noizDens[HICUMIAVLNOIZ],&lnNdens[HICUMIAVLNOIZ],
|
|
||||||
// ckt,SHOTNOISE,inst->HICUMcollCINode,inst->HICUMbaseBINode,
|
|
||||||
// inst->HICUMiavl);
|
|
||||||
|
|
||||||
|
NevalSrc(&noizDens[HICUMIAVLNOIZ],&lnNdens[HICUMIAVLNOIZ],
|
||||||
|
ckt,SHOTNOISE,here->HICUMcollCINode,here->HICUMbaseBINode,
|
||||||
|
here->HICUMiavl);
|
||||||
|
|
||||||
|
//todo: ibici contains iavl, has to be separated for non-correlated noise
|
||||||
NevalSrc(&noizDens[HICUMIBCINOIZ],&lnNdens[HICUMIBCINOIZ],
|
NevalSrc(&noizDens[HICUMIBCINOIZ],&lnNdens[HICUMIBCINOIZ],
|
||||||
ckt,SHOTNOISE,inst->HICUMbaseBINode,inst->HICUMcollCINode,
|
ckt,SHOTNOISE,here->HICUMbaseBINode,here->HICUMcollCINode,
|
||||||
*(ckt->CKTstate0 + inst->HICUMibici));
|
*(ckt->CKTstate0 + here->HICUMibici)+here->HICUMiavl);
|
||||||
|
|
||||||
NevalSrc(&noizDens[HICUMIBEPNOIZ],&lnNdens[HICUMIBEPNOIZ],
|
NevalSrc(&noizDens[HICUMIBEPNOIZ],&lnNdens[HICUMIBEPNOIZ],
|
||||||
ckt,SHOTNOISE,inst->HICUMbaseBPNode,inst->HICUMemitEINode,
|
ckt,SHOTNOISE,here->HICUMbaseBPNode,here->HICUMemitEINode,
|
||||||
*(ckt->CKTstate0 + inst->HICUMibpei));
|
*(ckt->CKTstate0 + here->HICUMibpei));
|
||||||
|
|
||||||
NevalSrc(&noizDens[HICUMIBCXNOIZ],&lnNdens[HICUMIBCXNOIZ],
|
NevalSrc(&noizDens[HICUMIBCXNOIZ],&lnNdens[HICUMIBCXNOIZ],
|
||||||
ckt,SHOTNOISE,inst->HICUMbaseBPNode,inst->HICUMcollCINode,
|
ckt,SHOTNOISE,here->HICUMbaseBPNode,here->HICUMcollCINode,
|
||||||
*(ckt->CKTstate0 + inst->HICUMibpci));
|
*(ckt->CKTstate0 + here->HICUMibpci));
|
||||||
|
|
||||||
NevalSrc(&noizDens[HICUMIJSCNOIZ],&lnNdens[HICUMIJSCNOIZ],
|
NevalSrc(&noizDens[HICUMIJSCNOIZ],&lnNdens[HICUMIJSCNOIZ],
|
||||||
ckt,SHOTNOISE,inst->HICUMsubsSINode,inst->HICUMcollCINode,
|
ckt,SHOTNOISE,here->HICUMsubsSINode,here->HICUMcollCINode,
|
||||||
*(ckt->CKTstate0 + inst->HICUMisici));
|
*(ckt->CKTstate0 + here->HICUMisici));
|
||||||
|
|
||||||
//todo: iciei contains it, has to be separated for non-correlated noise
|
//todo: iciei contains it, has to be separated for non-correlated noise
|
||||||
NevalSrc(&noizDens[HICUMITNOIZ],&lnNdens[HICUMITNOIZ],
|
NevalSrc(&noizDens[HICUMITNOIZ],&lnNdens[HICUMITNOIZ],
|
||||||
ckt,SHOTNOISE,inst->HICUMcollCINode,inst->HICUMemitEINode,
|
ckt,SHOTNOISE,here->HICUMcollCINode,here->HICUMemitEINode,
|
||||||
*(ckt->CKTstate0 + inst->HICUMiciei));
|
*(ckt->CKTstate0 + here->HICUMiciei));
|
||||||
|
|
||||||
NevalSrc(&noizDens[HICUMIBEINOIZ],&lnNdens[HICUMIBEINOIZ],
|
NevalSrc(&noizDens[HICUMIBEINOIZ],&lnNdens[HICUMIBEINOIZ],
|
||||||
ckt,SHOTNOISE,inst->HICUMbaseBINode,inst->HICUMemitEINode,
|
ckt,SHOTNOISE,here->HICUMbaseBINode,here->HICUMemitEINode,
|
||||||
*(ckt->CKTstate0 + inst->HICUMibiei));
|
*(ckt->CKTstate0 + here->HICUMibiei));
|
||||||
|
|
||||||
|
|
||||||
if (model->HICUMcfbe == -1) {
|
if (model->HICUMcfbe == -1) {
|
||||||
NevalSrc(&noizDens[HICUMFLBENOIZ], NULL, ckt,
|
NevalSrc(&noizDens[HICUMFLBENOIZ], NULL, ckt,
|
||||||
N_GAIN,inst->HICUMbaseBINode, inst->HICUMemitEINode,
|
N_GAIN,here->HICUMbaseBINode, here->HICUMemitEINode,
|
||||||
(double)0.0);
|
(double)0.0);
|
||||||
} else {
|
} else {
|
||||||
NevalSrc(&noizDens[HICUMFLBENOIZ], NULL, ckt,
|
NevalSrc(&noizDens[HICUMFLBENOIZ], NULL, ckt,
|
||||||
N_GAIN,inst->HICUMbaseBPNode, inst->HICUMemitEINode,
|
N_GAIN,here->HICUMbaseBPNode, here->HICUMemitEINode,
|
||||||
(double)0.0);
|
(double)0.0);
|
||||||
}
|
}
|
||||||
noizDens[HICUMFLBENOIZ] *= inst->HICUMm * model->HICUMkf *
|
noizDens[HICUMFLBENOIZ] *= here->HICUMkf_scaled *
|
||||||
exp(model->HICUMaf *
|
exp(model->HICUMaf *
|
||||||
log(MAX(fabs((*(ckt->CKTstate0 + inst->HICUMibiei)+*(ckt->CKTstate0 + inst->HICUMibpei)))/inst->HICUMm,N_MINLOG))) /
|
log(MAX(fabs((*(ckt->CKTstate0 + here->HICUMibiei)+*(ckt->CKTstate0 + here->HICUMibpei))),N_MINLOG))) /
|
||||||
data->freq;
|
data->freq;
|
||||||
lnNdens[HICUMFLBENOIZ] =
|
lnNdens[HICUMFLBENOIZ] =
|
||||||
log(MAX(noizDens[HICUMFLBENOIZ],N_MINLOG));
|
log(MAX(noizDens[HICUMFLBENOIZ],N_MINLOG));
|
||||||
|
|
||||||
NevalSrc(&noizDens[HICUMFLRENOIZ], NULL, ckt,
|
NevalSrc(&noizDens[HICUMFLRENOIZ], NULL, ckt,
|
||||||
N_GAIN,inst->HICUMemitEINode, inst->HICUMemitNode,
|
N_GAIN,here->HICUMemitEINode, here->HICUMemitNode,
|
||||||
(double)0.0);
|
(double)0.0);
|
||||||
noizDens[HICUMFLRENOIZ] *= inst->HICUMm * model->HICUMkfre *
|
noizDens[HICUMFLRENOIZ] *= here->HICUMkfre_scaled *
|
||||||
exp(model->HICUMafre *
|
exp(model->HICUMafre *
|
||||||
log(MAX(fabs(*(ckt->CKTstate0 + inst->HICUMieie))/inst->HICUMm,N_MINLOG))) /
|
log(MAX(fabs(*(ckt->CKTstate0 + here->HICUMieie)),N_MINLOG))) /
|
||||||
data->freq;
|
data->freq;
|
||||||
lnNdens[HICUMFLRENOIZ] =
|
lnNdens[HICUMFLRENOIZ] =
|
||||||
log(MAX(noizDens[HICUMFLRENOIZ],N_MINLOG));
|
log(MAX(noizDens[HICUMFLRENOIZ],N_MINLOG));
|
||||||
|
|
@ -231,15 +232,15 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata
|
||||||
/* initialize our "history" variables */
|
/* initialize our "history" variables */
|
||||||
|
|
||||||
for (i=0; i < HICUMNSRCS; i++) {
|
for (i=0; i < HICUMNSRCS; i++) {
|
||||||
inst->HICUMnVar[LNLSTDENS][i] = lnNdens[i];
|
here->HICUMnVar[LNLSTDENS][i] = lnNdens[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* clear out our integration variables if it's the first pass */
|
/* clear out our integration variables if it's the first pass */
|
||||||
|
|
||||||
if (data->freq == job->NstartFreq) {
|
if (data->freq == job->NstartFreq) {
|
||||||
for (i=0; i < HICUMNSRCS; i++) {
|
for (i=0; i < HICUMNSRCS; i++) {
|
||||||
inst->HICUMnVar[OUTNOIZ][i] = 0.0;
|
here->HICUMnVar[OUTNOIZ][i] = 0.0;
|
||||||
inst->HICUMnVar[INNOIZ][i] = 0.0;
|
here->HICUMnVar[INNOIZ][i] = 0.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else { /* data->delFreq != 0.0 (we have to integrate) */
|
} else { /* data->delFreq != 0.0 (we have to integrate) */
|
||||||
|
|
@ -249,19 +250,19 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata
|
||||||
for (i=0; i < HICUMNSRCS; i++) {
|
for (i=0; i < HICUMNSRCS; i++) {
|
||||||
if (i != HICUMTOTNOIZ) {
|
if (i != HICUMTOTNOIZ) {
|
||||||
tempOnoise = Nintegrate(noizDens[i], lnNdens[i],
|
tempOnoise = Nintegrate(noizDens[i], lnNdens[i],
|
||||||
inst->HICUMnVar[LNLSTDENS][i], data);
|
here->HICUMnVar[LNLSTDENS][i], data);
|
||||||
tempInoise = Nintegrate(noizDens[i] * data->GainSqInv ,
|
tempInoise = Nintegrate(noizDens[i] * data->GainSqInv ,
|
||||||
lnNdens[i] + data->lnGainInv,
|
lnNdens[i] + data->lnGainInv,
|
||||||
inst->HICUMnVar[LNLSTDENS][i] + data->lnGainInv,
|
here->HICUMnVar[LNLSTDENS][i] + data->lnGainInv,
|
||||||
data);
|
data);
|
||||||
inst->HICUMnVar[LNLSTDENS][i] = lnNdens[i];
|
here->HICUMnVar[LNLSTDENS][i] = lnNdens[i];
|
||||||
data->outNoiz += tempOnoise;
|
data->outNoiz += tempOnoise;
|
||||||
data->inNoise += tempInoise;
|
data->inNoise += tempInoise;
|
||||||
if (job->NStpsSm != 0) {
|
if (job->NStpsSm != 0) {
|
||||||
inst->HICUMnVar[OUTNOIZ][i] += tempOnoise;
|
here->HICUMnVar[OUTNOIZ][i] += tempOnoise;
|
||||||
inst->HICUMnVar[OUTNOIZ][HICUMTOTNOIZ] += tempOnoise;
|
here->HICUMnVar[OUTNOIZ][HICUMTOTNOIZ] += tempOnoise;
|
||||||
inst->HICUMnVar[INNOIZ][i] += tempInoise;
|
here->HICUMnVar[INNOIZ][i] += tempInoise;
|
||||||
inst->HICUMnVar[INNOIZ][HICUMTOTNOIZ] += tempInoise;
|
here->HICUMnVar[INNOIZ][HICUMTOTNOIZ] += tempInoise;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -276,8 +277,8 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata
|
||||||
case INT_NOIZ: /* already calculated, just output */
|
case INT_NOIZ: /* already calculated, just output */
|
||||||
if (job->NStpsSm != 0) {
|
if (job->NStpsSm != 0) {
|
||||||
for (i=0; i < HICUMNSRCS; i++) {
|
for (i=0; i < HICUMNSRCS; i++) {
|
||||||
data->outpVector[data->outNumber++] = inst->HICUMnVar[OUTNOIZ][i];
|
data->outpVector[data->outNumber++] = here->HICUMnVar[OUTNOIZ][i];
|
||||||
data->outpVector[data->outNumber++] = inst->HICUMnVar[INNOIZ][i];
|
data->outpVector[data->outNumber++] = here->HICUMnVar[INNOIZ][i];
|
||||||
}
|
}
|
||||||
} /* if */
|
} /* if */
|
||||||
break;
|
break;
|
||||||
|
|
@ -288,7 +289,7 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata
|
||||||
return (OK); /* do nothing, the main calling routine will close */
|
return (OK); /* do nothing, the main calling routine will close */
|
||||||
break; /* the plots */
|
break; /* the plots */
|
||||||
} /* switch (operation) */
|
} /* switch (operation) */
|
||||||
} /* for inst */
|
} /* for here */
|
||||||
} /* for model */
|
} /* for model */
|
||||||
|
|
||||||
return(OK);
|
return(OK);
|
||||||
|
|
|
||||||
|
|
@ -549,6 +549,9 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
|
||||||
here->HICUMrbx_scaled = model->HICUMrbx / area_times_m;
|
here->HICUMrbx_scaled = model->HICUMrbx / area_times_m;
|
||||||
here->HICUMrcx_scaled = model->HICUMrcx / area_times_m;
|
here->HICUMrcx_scaled = model->HICUMrcx / area_times_m;
|
||||||
here->HICUMrbi0_scaled = model->HICUMrbi0 / area_times_m;
|
here->HICUMrbi0_scaled = model->HICUMrbi0 / area_times_m;
|
||||||
|
//noise
|
||||||
|
here->HICUMkf_scaled = model->HICUMkf * pow(here->HICUMm, (1-model->HICUMaf));
|
||||||
|
here->HICUMkfre_scaled = model->HICUMkfre * pow(here->HICUMm, (1-model->HICUMafre));
|
||||||
|
|
||||||
here->HICUMstate = *states;
|
here->HICUMstate = *states;
|
||||||
*states += HICUMnumStates;
|
*states += HICUMnumStates;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue