⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 b3soild.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 5 页
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen TangFile: b3soild.c          98/5/01Modified by Pin Su, Weidong Liu and Jan Feng	99/2/15Modified by Pin Su 99/4/30Modified by Pin Su, Wei Jin 99/9/27Modified by Pin Su 00/3/1Modified by Pin Su 00/8/15Modified by Pin Su 01/2/15Modified by Pin Su and Hui Wan 02/3/5Modified by Pin Su 02/5/20Modified by Paolo Nenzi 2002**********/#include "ngspice.h"#include "cktdefs.h"#include "b3soidef.h"#include "trandefs.h"#include "const.h"#include "sperror.h"#include "devdefs.h"#include "suffix.h"#define EPSOX 3.453133e-11#define EPSSI 1.03594e-10#define Charge_q 1.60219e-19#define KboQ 8.617087e-5  /*  Kb / q   */#define Eg300 1.115   /*  energy gap at 300K  */#define DELTA_1 0.02#define DELTA_2 0.02#define DELTA_3 0.02/* Original is 0.02, for matching IBM model, change to 0.08 */#define DELTA_3_SOI 0.08#define DELTA_4 0.02#define DELT_Vbseff  0.005#define DELTA_VFB  0.02#define CONST_2OV3 0.6666666666#define MAX_EXPL 2.688117142e+43#define MIN_EXPL 3.720075976e-44#define EXPL_THRESHOLD 100.0#define DEXP(A,B,C) {                                                         \        if (A > EXPL_THRESHOLD) {                                              \            B = MAX_EXPL*(1.0+(A)-EXPL_THRESHOLD);                              \            C = MAX_EXPL;                                                            \        } else if (A < -EXPL_THRESHOLD)  {                                                \            B = MIN_EXPL;                                                      \            C = 0;                                                            \        } else   {                                                            \            B = exp(A);                                                       \            C = B;                                                            \        }                                                                     \    }#define FLOG(A)  fabs(A) + 1e-14    /* B3SOIlimit(vnew,vold)     *  limits the per-iteration change of any absolute voltage value     */doubleB3SOIlimit(double vnew, double vold, double limit, int *check){    double T0, T1;    if (isnan (vnew) || isnan (vold))    {	fprintf(stderr, "Alberto says:  YOU TURKEY!  The limiting function received NaN.\n");	fprintf(stderr, "New prediction returns to 0.0!\n");        vnew = 0.0;        *check = 1;    }    T0 = vnew - vold;    T1 = fabs(T0);    if (T1 > limit) {        if (T0 > 0.0)             vnew = vold + limit;        else             vnew = vold - limit;	*check = 1;    }    return vnew;}intB3SOIload(GENmodel *inModel, CKTcircuit *ckt){B3SOImodel *model = (B3SOImodel*)inModel;B3SOIinstance *here;int selfheat;double Gmin;double ag0, qgd, qgs, von, cbhat, VgstNVt, ExpVgst = 0.0;double cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq;double arg;double delvbd, delvbs, delvds, delvgd, delvgs;double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4;double PhiBSWG, MJSWG;double gcgdb, gcggb, gcgsb, gcgeb, gcgT;double gcsdb, gcsgb, gcssb, gcseb, gcsT;double gcddb, gcdgb, gcdsb, gcdeb, gcdT;double gcbdb, gcbgb, gcbsb, gcbeb, gcbT;double gcedb, gcegb, gcesb, gceeb, gceT;double gcTt, gTtg, gTtb, gTtdp, gTtt, gTtsp;double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact;double vg, vd, vs, vp, ve, vb;double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum;double Vgs_eff, Vfb = 0.0, dVfb_dVb, dVfb_dVd, dVfb_dT;double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd, dVth_dT;double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg;double n, dn_dVb, Vtm;double ExpArg, V0;double ueff, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT;double Esat, Vdsat;double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dT;double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat;double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dT;double Va, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT;double Vbseff, dVbseff_dVb;double CoxWL;double T0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dT;double T1, dT1_dVg, dT1_dVd, dT1_dVb, dT1_dT;double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dT;double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dT = 0.0;double T4, dT4_dVd, dT4_dVb, dT4_dT;double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dT = 0.0;double T6, dT6_dVg, dT6_dVd, dT6_dVb, dT6_dT = 0.0;double T7;double T8, dT8_dVd;double T9, dT9_dVd;double T10, dT10_dVb, dT10_dVd;double T11, T12;double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb;double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dT;double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dT;double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb;double Delt_vth, dDelt_vth_dVb, dDelt_vth_dT;double Theta0, dTheta0_dVb;double TempRatio, tmp1, tmp2, tmp3, tmp4;double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg;double a1; double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb, dVgsteff_dT;double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dT;double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb;double diffVds;double dAbulk_dVg, dn_dVd ;double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb, dbeta_dT;double gche, dgche_dVg, dgche_dVd, dgche_dVb, dgche_dT;double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb, dfgche1_dT;double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb, dfgche2_dT;double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb, dIdl_dT;double Ids, Gm, Gds, Gmb;double CoxWovL;double Rds, dRds_dVg, dRds_dVb, dRds_dT, WVCox, WVCoxRds;double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb;double Leff, Weff, dWeff_dVg, dWeff_dVb;double AbulkCV, dAbulkCV_dVb;double qgdo, qgso, cgdo, cgso; double dxpart, sxpart; struct b3soiSizeDependParam *pParam;int ByPass, Check, ChargeComputationNeeded = 0, error; double gbbsp, gbbdp, gbbg, gbbb, gbbp, gbbT;double gddpsp, gddpdp, gddpg, gddpb, gddpT;double gsspsp, gsspdp, gsspg, gsspb, gsspT;double Gbpbs, Gbpps;double ves, ved, veb, vge = 0.0, delves, vedo, delved;double vps, vpd, Vps, delvps;double Vbd, Ves, Vesfb, DeltVthtemp, dDeltVthtemp_dT;double Vbp, dVbp_dVb;double DeltVthw, dDeltVthw_dVb, dDeltVthw_dT;double Gm0, Gds0, Gmb0, GmT0, Gmc, GmT;double dDIBL_Sft_dVb;double Idgidl, Gdgidld, Gdgidlg, Isgidl, Gsgidlg;double Gjsd, Gjsb, GjsT, Gjdd, Gjdb, GjdT;double Ibp, Iii, Giid, Giig, Giib, GiiT, Gcd, Gcb, GcT, ceqbody, ceqbodcon;double gppb, gppp;double delTemp, deldelTemp, Temp;double ceqth, ceqqth;double K1;double qjs = 0.0, gcjsbs, gcjsT;double qjd = 0.0, gcjdbs, gcjdds, gcjdT;double qge;double ceqqe;double ni, Eg, Cbox, CboxWL;double cjsbs;double dVfbeff_dVrg;double qinv, qgate = 0.0, qbody = 0.0, qdrn = 0.0, qsrc, qsub = 0.0;double cqgate, cqbody, cqdrn, cqsub, cqtemp;double Cgg, Cgd, Cgb;double Csg, Csd, Csb, Cbg = 0.0, Cbd = 0.0, Cbb = 0.0;double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Csg1, Csd1, Csb1;double Vdsatii;double Ibs1 ,dIbs1_dVb ,dIbs1_dT;double Ibs2 ,dIbs2_dVb ,dIbs2_dT;double Ibs3 ,dIbs3_dVb ,dIbs3_dVd, dIbs3_dT;double Ibs4 ,dIbs4_dVb ,dIbs4_dT;double Ibd1 ,dIbd1_dVb ,dIbd1_dVd ,dIbd1_dT;double Ibd2 ,dIbd2_dVb ,dIbd2_dVd ,dIbd2_dT;double Ibd3 ,dIbd3_dVb ,dIbd3_dVd ,dIbd3_dT;double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT;double WTsi, NVtm1, NVtm2;double Ic  ,dIc_dVb ,dIc_dVd;double Ibs;double Ibd;double Denomi ,dDenomi_dVg ,dDenomi_dVd ,dDenomi_dVb ,dDenomi_dT;double Qsub0 = 0.0, dQsub0_dVg, dQsub0_dVb, dQsub0_dVd ;double Qac0 = 0.0 ,dQac0_dVb   ,dQac0_dVd;double Qe1 , dQe1_dVb, dQe1_dVe, dQe1_dT;double Ce1b ,Ce1e, Ce1T;double dQac0_dVrg, dQsub0_dVrg; /*  for self-heating  */double vbi, vfbb, phi, sqrtPhi, Xdep0, jbjt, jdif, jrec, jtun;double u0temp, vsattemp;double rds0, ua, ub, uc;double dvbi_dT, dvfbb_dT, djbjt_dT, djdif_dT, djrec_dT, djtun_dT, du0temp_dT;double dvsattemp_dT, drds0_dT, dua_dT, dub_dT, duc_dT, dni_dT, dVtm_dT;double dVfbeff_dT, dQac0_dT, dQsub0_dT;double CbT, CsT, CgT;/* v2.0 release */double Vbsh, dVbsh_dVb;double sqrtPhisExt, dsqrtPhisExt_dVb;double T13, T14;double dT11_dVb, dT13_dVb, dT14_dVb;double dVgst_dVd;double Vdsatii0, dVdsatii0_dT;double VgsStep, dVgsStep_dT, Ratio, dRatio_dVg, dRatio_dVb, dRatio_dVd;double dRatio_dT, dTempRatio_dT;double Vdiff, dVdiff_dVg, dVdiff_dVb, dVdiff_dVd, dVdiff_dT;double dNVtm1_dT;double NVtmf, NVtmr, dNVtmf_dT, dNVtmr_dT;double TempRatioMinus1;double Ahli, dAhli_dT;double WsTsi, WdTsi;double dPhiBSWG_dT, dcjsbs_dT, darg_dT = 0.0, ddT3_dVb_dT = 0.0;   double dT7_dT, dT0_dT7, dT1_dT7, dT2_dT7;double CoxWLb, CoxWLcenb;double ExpVbsNVtm, dExpVbsNVtm_dVb, dExpVbsNVtm_dT;double ExpVbdNVtm, dExpVbdNVtm_dVb, dExpVbdNVtm_dVd, dExpVbdNVtm_dT;double Ien, dIen_dT, Iendif, dIendif_dT;double Ibsdif, dIbsdif_dVb, dIbsdif_dT;double Ibddif, dIbddif_dVb, dIbddif_dVd, dIbddif_dT;double Ehlis, dEhlis_dVb, dEhlis_dT;double EhlisFactor, dEhlisFactor_dVb, dEhlisFactor_dT;double Ehlid, dEhlid_dVb, dEhlid_dVd, dEhlid_dT;double EhlidFactor, dEhlidFactor_dVb, dEhlidFactor_dVd, dEhlidFactor_dT;double E2ndFactor, dE2ndFactor_dVb, dE2ndFactor_dVd, dE2ndFactor_dT;double dT10_dT, dT11_dT, DioMax;double cjdbs, dcjdbs_dT;double wdios, wdiod, wdiosCV, wdiodCV;/* for capMod3 */double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVb, LINK, Ccen, Coxeff;double dCoxeff_dVg, dCoxeff_dVb;double CoxWLcen, QovCox, dQac0_dVg, DeltaPhi, dDeltaPhi_dVg;double dDeltaPhi_dVd, dDeltaPhi_dVb;double dTcen_dVd, dTcen_dT, dCoxeff_dVd, dCoxeff_dT, dCoxWLcenb_dT;double qinoi, qbulk;double T3zb, lt1zb, ltwzb, Theta0zb;double Delt_vthzb, dDelt_vthzb_dT;double DeltVthwzb, dDeltVthwzb_dT;double DeltVthtempzb, dDeltVthtempzb_dT;double Vthzb = 0.0, dVthzb_dT = 0.0, Vfbzb, dVfbzb_dT;/* v3.0 */double Igc, dIgc_dVg, dIgc_dVd, dIgc_dVb, Igs, dIgs_dVg, dIgs_dVs, Igd, dIgd_dVg, dIgd_dVd;double Igcs, dIgcs_dVg, dIgcs_dVd, dIgcs_dVb, Igcd, dIgcd_dVg, dIgcd_dVd, dIgcd_dVb;double vgs_eff, dvgs_eff_dvg, vgd_eff, dvgd_eff_dvg;double VxNVt, ExpVxNVt;double gIstotg, gIstotd, gIstotb, gIstots, Istoteq;double gIdtotg, gIdtotd, gIdtotb, gIdtots, Idtoteq;double gIgtotg, gIgtotd, gIgtotb, gIgtots, Igtoteq;/* v3.0 */double Vbsitf, dVbsitf_dVg, dVbsitf_dVd, dVbsitf_dVb, dVbsitf_dVe, dVbsitf_dT;double dIgb1_dVe, gige, Giie, dT0_dVe, dRatio_dVe, dVdiff_dVe;double dT1_dVe, dT5_dVe, dIgb_dVe, dVox_dVe, dVoxdepinv_dVe = 0.0, dVaux_dVe;double Gme, gTte, gbbe, gddpe, gsspe;double Vbs0, dVbs0_dVg, dVbs0_dVd, dVbs0_dVe, dVbs0_dT;double Vbs0mos, dVbs0mos_dVe, dVbs0mos_dT;double Vbsmos, dVbsmos_dVg, dVbsmos_dVd, dVbsmos_dVb, dVbsmos_dVe, dVbsmos_dT;double PhiON, dPhiON_dVg, dPhiON_dVd, dPhiON_dVe, dPhiON_dT;double PhiFD, dPhiFD_dVg, dPhiFD_dVd, dPhiFD_dVe, dPhiFD_dT;double Vbs0t, dVbs0t_dVg, dVbs0t_dVd, dVbs0t_dVe, dVbs0t_dT;double VthFD, dVthFD_dVd, dVthFD_dVb, dVthFD_dVe, dVthFD_dT;double VtgsFD, ExpVtgsFD, VgstFD, ExpVgstFD;double VtgseffFD, dVtgseffFD_dVd, dVtgseffFD_dVg, dVtgseffFD_dVe;double dVtgseffFD_dT;double VgsteffFD, dVgsteffFD_dVd, dVgsteffFD_dVg, dVgsteffFD_dVe;double dVgsteffFD_dT;double dT2_dVe, dVbsh_dVg, dVbsh_dVd, dVbsh_dVe, dVbsh_dT;double dVgsteff_dVe, dVbseff_dVg, dVbseff_dVd, dVbseff_dVe, dVbseff_dT;/* v2.2 release */double Vgb = 0.0, dVgb_dVg = 0.0, dVgb_dVb = 0.0, Vox, dVox_dVg;double dVox_dVd, dVox_dVb;double OxideRatio, Vaux, dVaux_dVg, dVaux_dVd, dVaux_dVb;double Igb, dIgb_dVg, dIgb_dVd, dIgb_dVb;double ceqgate;double dT0_dVox, Voxeff, dVoxeff_dVox;double dVox_dT, dVaux_dT = 0.0, dIgb_dT;double Voxacc = 0.0, dVoxacc_dVg = 0.0, dVoxacc_dVd = 0.0, dVoxacc_dVb = 0.0;double Voxdepinv = 0.0, dVoxdepinv_dVg = 0.0, dVoxdepinv_dVb = 0.0;double dVoxdepinv_dVd = 0.0, dVoxdepinv_dT = 0.0;double Igb1, dIgb1_dVg, dIgb1_dVd, dIgb1_dVb, dIgb1_dT;double Igb2, dIgb2_dVg, dIgb2_dVd, dIgb2_dVb, dIgb2_dT;double gigs, gigd, gigb, gigg;double gigT;double m;for (; model != NULL; model = model->B3SOInextModel){    for (here = model->B3SOIinstances; here != NULL;           here = here->B3SOInextInstance)     {    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -