b3noi.c
来自「ngspice又一个电子CAD仿真软件代码.功能更全」· C语言 代码 · 共 506 行 · 第 1/2 页
C
506 行
(IFuid) NULL, name, UID_OTHER, (void **) NULL); /* we've added one more plot */ (void) sprintf(name, "inoise_total.%s%s", here->BSIM3name, BSIM3nNames[i]); data->namelist = (IFuid *) trealloc( (char *) data->namelist, (data->numPlots + 1) * sizeof(IFuid)); if (!data->namelist) return(E_NOMEM); (*(SPfrontEnd->IFnewUid)) (ckt, &(data->namelist[data->numPlots++]), (IFuid) NULL, name, UID_OTHER, (void **)NULL); /* we've added one more plot */ } break; } } break; case N_CALC: m = here->BSIM3m; switch (mode) { case N_DENS: NevalSrc(&noizDens[BSIM3RDNOIZ], &lnNdens[BSIM3RDNOIZ], ckt, THERMNOISE, here->BSIM3dNodePrime, here->BSIM3dNode, here->BSIM3drainConductance * m); NevalSrc(&noizDens[BSIM3RSNOIZ], &lnNdens[BSIM3RSNOIZ], ckt, THERMNOISE, here->BSIM3sNodePrime, here->BSIM3sNode, here->BSIM3sourceConductance * m); switch( model->BSIM3noiMod ) { case 1: case 3: NevalSrc(&noizDens[BSIM3IDNOIZ], &lnNdens[BSIM3IDNOIZ], ckt, THERMNOISE, here->BSIM3dNodePrime, here->BSIM3sNodePrime, (2.0 / 3.0 * fabs(here->BSIM3gm + here->BSIM3gds + here->BSIM3gmbs)) * m); break; case 2: case 4: /* Added revision dependent code */ if (model->BSIM3intVersion == BSIM3V324) { NevalSrc(&noizDens[BSIM3IDNOIZ], &lnNdens[BSIM3IDNOIZ], ckt, THERMNOISE, here->BSIM3dNodePrime, here->BSIM3sNodePrime, (m * here->BSIM3ueff * fabs(here->BSIM3qinv) / (pParam->BSIM3leff * pParam->BSIM3leff + here->BSIM3ueff * fabs(here->BSIM3qinv) * here->BSIM3rds))); /* bugfix */ } else { /* for all versions lower then 3.2.4 */ NevalSrc(&noizDens[BSIM3IDNOIZ], &lnNdens[BSIM3IDNOIZ], ckt, THERMNOISE, here->BSIM3dNodePrime, here->BSIM3sNodePrime, (m * here->BSIM3ueff * fabs(here->BSIM3qinv / (pParam->BSIM3leff * pParam->BSIM3leff)))); } break; } NevalSrc(&noizDens[BSIM3FLNOIZ], (double*) NULL, ckt, N_GAIN, here->BSIM3dNodePrime, here->BSIM3sNodePrime, (double) 0.0); switch( model->BSIM3noiMod ) { case 1: case 4: noizDens[BSIM3FLNOIZ] *= m * model->BSIM3kf * exp(model->BSIM3af * log(MAX(fabs(here->BSIM3cd), N_MINLOG))) / (pow(data->freq, model->BSIM3ef) * pParam->BSIM3leff * pParam->BSIM3leff * model->BSIM3cox); break; case 2: case 3: vgs = *(ckt->CKTstates[0] + here->BSIM3vgs); vds = *(ckt->CKTstates[0] + here->BSIM3vds); if (vds < 0.0) { vds = -vds; vgs = vgs + vds; } /* Added revision dependent code */ if (model->BSIM3intVersion == BSIM3V324) { Ssi = StrongInversionNoiseEvalNew(vds, model, here, data->freq, ckt->CKTtemp); T10 = model->BSIM3oxideTrapDensityA * 8.62e-5 * ckt->CKTtemp; T11 = pParam->BSIM3weff * pParam->BSIM3leff * pow(data->freq, model->BSIM3ef) * 4.0e36; Swi = T10 / T11 * here->BSIM3cd * here->BSIM3cd; T1 = Swi + Ssi; if (T1 > 0.0) noizDens[BSIM3FLNOIZ] *= m * (Ssi * Swi) / T1; else noizDens[BSIM3FLNOIZ] *= 0.0; } else { /* for all versions lower then 3.2.4 */ if (vgs >= here->BSIM3von + 0.1) { Ssi = StrongInversionNoiseEvalOld(vgs, vds, model, here, data->freq, ckt->CKTtemp); noizDens[BSIM3FLNOIZ] *= m * Ssi; } else { pParam = here->pParam; T10 = model->BSIM3oxideTrapDensityA * 8.62e-5 * ckt->CKTtemp; T11 = pParam->BSIM3weff * pParam-> BSIM3leff * pow (data->freq, model->BSIM3ef) * 4.0e36; Swi = T10 / T11 * here->BSIM3cd * here->BSIM3cd; Slimit = StrongInversionNoiseEvalOld( here->BSIM3von + 0.1, vds, model, here, data->freq, ckt->CKTtemp); T1 = Swi + Slimit; if (T1 > 0.0) noizDens[BSIM3FLNOIZ] *= m * (Slimit * Swi) / T1; else noizDens[BSIM3FLNOIZ] *= 0.0; } } break; } lnNdens[BSIM3FLNOIZ] = log(MAX(noizDens[BSIM3FLNOIZ], N_MINLOG)); noizDens[BSIM3TOTNOIZ] = noizDens[BSIM3RDNOIZ] + noizDens[BSIM3RSNOIZ] + noizDens[BSIM3IDNOIZ] + noizDens[BSIM3FLNOIZ]; lnNdens[BSIM3TOTNOIZ] = log(MAX(noizDens[BSIM3TOTNOIZ], N_MINLOG)); *OnDens += noizDens[BSIM3TOTNOIZ]; if (data->delFreq == 0.0) { /* if we haven't done any previous integration, we need to initialize our "history" variables. */ for (i = 0; i < BSIM3NSRCS; i++) { here->BSIM3nVar[LNLSTDENS][i] = lnNdens[i]; } /* clear out our integration variables if it's the first pass */ if (data->freq == ((NOISEAN*) ckt->CKTcurJob)->NstartFreq) { for (i = 0; i < BSIM3NSRCS; i++) { here->BSIM3nVar[OUTNOIZ][i] = 0.0; here->BSIM3nVar[INNOIZ][i] = 0.0; } } } else { /* data->delFreq != 0.0, we have to integrate. */ for (i = 0; i < BSIM3NSRCS; i++) { if (i != BSIM3TOTNOIZ) { tempOnoise = Nintegrate(noizDens[i], lnNdens[i], here->BSIM3nVar[LNLSTDENS][i], data); tempInoise = Nintegrate(noizDens[i] * data->GainSqInv, lnNdens[i] + data->lnGainInv, here->BSIM3nVar[LNLSTDENS][i] + data->lnGainInv, data); here->BSIM3nVar[LNLSTDENS][i] = lnNdens[i]; data->outNoiz += tempOnoise; data->inNoise += tempInoise; if (((NOISEAN*) ckt->CKTcurJob)->NStpsSm != 0) { here->BSIM3nVar[OUTNOIZ][i] += tempOnoise; here->BSIM3nVar[OUTNOIZ][BSIM3TOTNOIZ] += tempOnoise; here->BSIM3nVar[INNOIZ][i] += tempInoise; here->BSIM3nVar[INNOIZ][BSIM3TOTNOIZ] += tempInoise; } } } } if (data->prtSummary) { for (i = 0; i < BSIM3NSRCS; i++) { /* print a summary report */ data->outpVector[data->outNumber++] = noizDens[i]; } } break; case INT_NOIZ: /* already calculated, just output */ if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) { for (i = 0; i < BSIM3NSRCS; i++) { data->outpVector[data->outNumber++] = here->BSIM3nVar[OUTNOIZ][i]; data->outpVector[data->outNumber++] = here->BSIM3nVar[INNOIZ][i]; } } break; } break; case N_CLOSE: /* do nothing, the main calling routine will close */ return (OK); break; /* the plots */ } /* switch (operation) */ } /* for here */ } /* for model */ return(OK);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?