b3soifdtemp.c
来自「ngspice又一个电子CAD仿真软件代码.功能更全」· C语言 代码 · 共 822 行 · 第 1/3 页
C
822 行
/**********Copyright 1999 Regents of the University of California. All rights reserved.Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen TangFile: b3soifdtemp.c 98/5/01Modified by Pin Su, Wei Jin 99/9/27Modified by Paolo Nenzi 2002**********//* * Revision 2.1 99/9/27 Pin Su * BSIMFD2.1 release *//* Lmin, Lmax, Wmin, Wmax */#include "ngspice.h"#include "smpdefs.h"#include "cktdefs.h"#include "b3soifddef.h"#include "const.h"#include "sperror.h"#include "suffix.h"#define Kb 1.3806226e-23#define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */#define EPSOX 3.453133e-11#define EPSSI 1.03594e-10#define PI 3.141592654#define MAX_EXP 5.834617425e14#define MIN_EXP 1.713908431e-15#define EXP_THRESHOLD 34.0#define Charge_q 1.60219e-19/* ARGSUSED */intB3SOIFDtemp(GENmodel *inModel, CKTcircuit *ckt){B3SOIFDmodel *model = (B3SOIFDmodel*) inModel;B3SOIFDinstance *here;struct b3soifdSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL;double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6, Ldrn, Wdrn;double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom;double SDphi, SDgamma;int Size_Not_Found; /* loop through all the B3SOIFD device models */ for (; model != NULL; model = model->B3SOIFDnextModel) { Temp = ckt->CKTtemp; if (model->B3SOIFDGatesidewallJctPotential < 0.1) model->B3SOIFDGatesidewallJctPotential = 0.1; model->pSizeDependParamKnot = NULL; pLastKnot = NULL; Tnom = model->B3SOIFDtnom; TRatio = Temp / Tnom; model->B3SOIFDvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); model->B3SOIFDfactor1 = sqrt(EPSSI / EPSOX * model->B3SOIFDtox); Vtm0 = KboQ * Tnom; Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); model->B3SOIFDeg0 = Eg0; model->B3SOIFDvtm = KboQ * Temp; Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); /* ni is in cm^-3 */ ni = 1.45e10 * (Temp / 300.15) * sqrt(Temp / 300.15) * exp(21.5565981 - Eg / (2.0 * model->B3SOIFDvtm)); /* loop through all the instances of the model */ /* MCJ: Length and Width not initialized */ for (here = model->B3SOIFDinstances; here != NULL; here = here->B3SOIFDnextInstance) { if (here->B3SOIFDowner != ARCHme) continue; here->B3SOIFDrbodyext = here->B3SOIFDbodySquares * model->B3SOIFDrbsh; pSizeDependParamKnot = model->pSizeDependParamKnot; Size_Not_Found = 1; while ((pSizeDependParamKnot != NULL) && Size_Not_Found) { if ((here->B3SOIFDl == pSizeDependParamKnot->Length) && (here->B3SOIFDw == pSizeDependParamKnot->Width) && (here->B3SOIFDrth0 == pSizeDependParamKnot->Rth0) && (here->B3SOIFDcth0 == pSizeDependParamKnot->Cth0)) { Size_Not_Found = 0; here->pParam = pSizeDependParamKnot; } else { pLastKnot = pSizeDependParamKnot; pSizeDependParamKnot = pSizeDependParamKnot->pNext; } } if (Size_Not_Found) { pParam = (struct b3soifdSizeDependParam *)tmalloc( sizeof(struct b3soifdSizeDependParam)); if (pLastKnot == NULL) model->pSizeDependParamKnot = pParam; else pLastKnot->pNext = pParam; pParam->pNext = NULL; here->pParam = pParam; Ldrn = here->B3SOIFDl; Wdrn = here->B3SOIFDw; pParam->Length = Ldrn; pParam->Width = Wdrn; pParam->Rth0 = here->B3SOIFDrth0; pParam->Cth0 = here->B3SOIFDcth0; T0 = pow(Ldrn, model->B3SOIFDLln); T1 = pow(Wdrn, model->B3SOIFDLwn); tmp1 = model->B3SOIFDLl / T0 + model->B3SOIFDLw / T1 + model->B3SOIFDLwl / (T0 * T1); pParam->B3SOIFDdl = model->B3SOIFDLint + tmp1; pParam->B3SOIFDdlc = model->B3SOIFDdlc + tmp1; T2 = pow(Ldrn, model->B3SOIFDWln); T3 = pow(Wdrn, model->B3SOIFDWwn); tmp2 = model->B3SOIFDWl / T2 + model->B3SOIFDWw / T3 + model->B3SOIFDWwl / (T2 * T3); pParam->B3SOIFDdw = model->B3SOIFDWint + tmp2; pParam->B3SOIFDdwc = model->B3SOIFDdwc + tmp2; pParam->B3SOIFDleff = here->B3SOIFDl - 2.0 * pParam->B3SOIFDdl; if (pParam->B3SOIFDleff <= 0.0) { IFuid namarray[2]; namarray[0] = model->B3SOIFDmodName; namarray[1] = here->B3SOIFDname; (*(SPfrontEnd->IFerror))(ERR_FATAL, "B3SOIFD: mosfet %s, model %s: Effective channel length <= 0", namarray); return(E_BADPARM); } pParam->B3SOIFDweff = here->B3SOIFDw - 2.0 * pParam->B3SOIFDdw; if (pParam->B3SOIFDweff <= 0.0) { IFuid namarray[2]; namarray[0] = model->B3SOIFDmodName; namarray[1] = here->B3SOIFDname; (*(SPfrontEnd->IFerror))(ERR_FATAL, "B3SOIFD: mosfet %s, model %s: Effective channel width <= 0", namarray); return(E_BADPARM); } pParam->B3SOIFDleffCV = here->B3SOIFDl - 2.0 * pParam->B3SOIFDdlc; if (pParam->B3SOIFDleffCV <= 0.0) { IFuid namarray[2]; namarray[0] = model->B3SOIFDmodName; namarray[1] = here->B3SOIFDname; (*(SPfrontEnd->IFerror))(ERR_FATAL, "B3SOIFD: mosfet %s, model %s: Effective channel length for C-V <= 0", namarray); return(E_BADPARM); } pParam->B3SOIFDweffCV = here->B3SOIFDw - 2.0 * pParam->B3SOIFDdwc; if (pParam->B3SOIFDweffCV <= 0.0) { IFuid namarray[2]; namarray[0] = model->B3SOIFDmodName; namarray[1] = here->B3SOIFDname; (*(SPfrontEnd->IFerror))(ERR_FATAL, "B3SOIFD: mosfet %s, model %s: Effective channel width for C-V <= 0", namarray); return(E_BADPARM); } /* Not binned - START */ pParam->B3SOIFDat = model->B3SOIFDat; pParam->B3SOIFDgamma1 = model->B3SOIFDgamma1; pParam->B3SOIFDgamma2 = model->B3SOIFDgamma2; pParam->B3SOIFDvbx = model->B3SOIFDvbx; pParam->B3SOIFDvbm = model->B3SOIFDvbm; pParam->B3SOIFDxt = model->B3SOIFDxt; pParam->B3SOIFDkt1 = model->B3SOIFDkt1; pParam->B3SOIFDkt1l = model->B3SOIFDkt1l; pParam->B3SOIFDkt2 = model->B3SOIFDkt2; pParam->B3SOIFDua1 = model->B3SOIFDua1; pParam->B3SOIFDub1 = model->B3SOIFDub1; pParam->B3SOIFDuc1 = model->B3SOIFDuc1; pParam->B3SOIFDute = model->B3SOIFDute; pParam->B3SOIFDprt = model->B3SOIFDprt; /* Not binned - END */ /* CV model */ pParam->B3SOIFDcgsl = model->B3SOIFDcgsl; pParam->B3SOIFDcgdl = model->B3SOIFDcgdl; pParam->B3SOIFDckappa = model->B3SOIFDckappa; pParam->B3SOIFDcf = model->B3SOIFDcf; pParam->B3SOIFDclc = model->B3SOIFDclc; pParam->B3SOIFDcle = model->B3SOIFDcle; pParam->B3SOIFDabulkCVfactor = pow(1.0+(pParam->B3SOIFDclc / pParam->B3SOIFDleff), pParam->B3SOIFDcle);/* Added for binning - START */ if (model->B3SOIFDbinUnit == 1) { Inv_L = 1.0e-6 / pParam->B3SOIFDleff; Inv_W = 1.0e-6 / pParam->B3SOIFDweff; Inv_LW = 1.0e-12 / (pParam->B3SOIFDleff * pParam->B3SOIFDweff); } else { Inv_L = 1.0 / pParam->B3SOIFDleff; Inv_W = 1.0 / pParam->B3SOIFDweff; Inv_LW = 1.0 / (pParam->B3SOIFDleff * pParam->B3SOIFDweff); } pParam->B3SOIFDnpeak = model->B3SOIFDnpeak + model->B3SOIFDlnpeak * Inv_L + model->B3SOIFDwnpeak * Inv_W + model->B3SOIFDpnpeak * Inv_LW; pParam->B3SOIFDnsub = model->B3SOIFDnsub + model->B3SOIFDlnsub * Inv_L + model->B3SOIFDwnsub * Inv_W + model->B3SOIFDpnsub * Inv_LW; pParam->B3SOIFDngate = model->B3SOIFDngate + model->B3SOIFDlngate * Inv_L + model->B3SOIFDwngate * Inv_W + model->B3SOIFDpngate * Inv_LW; pParam->B3SOIFDvth0 = model->B3SOIFDvth0 + model->B3SOIFDlvth0 * Inv_L + model->B3SOIFDwvth0 * Inv_W + model->B3SOIFDpvth0 * Inv_LW; pParam->B3SOIFDk1 = model->B3SOIFDk1 + model->B3SOIFDlk1 * Inv_L + model->B3SOIFDwk1 * Inv_W + model->B3SOIFDpk1 * Inv_LW; pParam->B3SOIFDk2 = model->B3SOIFDk2 + model->B3SOIFDlk2 * Inv_L + model->B3SOIFDwk2 * Inv_W + model->B3SOIFDpk2 * Inv_LW; pParam->B3SOIFDk3 = model->B3SOIFDk3 + model->B3SOIFDlk3 * Inv_L + model->B3SOIFDwk3 * Inv_W + model->B3SOIFDpk3 * Inv_LW; pParam->B3SOIFDk3b = model->B3SOIFDk3b + model->B3SOIFDlk3b * Inv_L + model->B3SOIFDwk3b * Inv_W + model->B3SOIFDpk3b * Inv_LW; pParam->B3SOIFDvbsa = model->B3SOIFDvbsa + model->B3SOIFDlvbsa * Inv_L + model->B3SOIFDwvbsa * Inv_W + model->B3SOIFDpvbsa * Inv_LW; pParam->B3SOIFDdelp = model->B3SOIFDdelp + model->B3SOIFDldelp * Inv_L + model->B3SOIFDwdelp * Inv_W + model->B3SOIFDpdelp * Inv_LW; pParam->B3SOIFDkb1 = model->B3SOIFDkb1 + model->B3SOIFDlkb1 * Inv_L + model->B3SOIFDwkb1 * Inv_W + model->B3SOIFDpkb1 * Inv_LW; pParam->B3SOIFDkb3 = model->B3SOIFDkb3 + model->B3SOIFDlkb3 * Inv_L + model->B3SOIFDwkb3 * Inv_W + model->B3SOIFDpkb3 * Inv_LW; pParam->B3SOIFDdvbd0 = model->B3SOIFDdvbd0 + model->B3SOIFDldvbd0 * Inv_L + model->B3SOIFDwdvbd0 * Inv_W + model->B3SOIFDpdvbd0 * Inv_LW; pParam->B3SOIFDdvbd1 = model->B3SOIFDdvbd1 + model->B3SOIFDldvbd1 * Inv_L + model->B3SOIFDwdvbd1 * Inv_W + model->B3SOIFDpdvbd1 * Inv_LW; pParam->B3SOIFDw0 = model->B3SOIFDw0 + model->B3SOIFDlw0 * Inv_L + model->B3SOIFDww0 * Inv_W
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?