📄 b3soiddld.c
字号:
/**********Copyright 1999 Regents of the University of California. All rights reserved.Author: Weidong Liu and Pin Su Feb 1999Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen TangModified by Pin Su, Wei Jin 99/9/27Modified by Paolo Nenzi 2002File: b3soiddld.c 98/5/01**********//* * Revision 2.1 99/9/27 Pin Su * BSIMDD2.1 release */#include "ngspice.h"#include "cktdefs.h"#include "b3soidddef.h"#include "trandefs.h"#include "const.h"#include "sperror.h"#include "devdefs.h"#include "suffix.h"#define MAX_EXP 5.834617425e14#define MIN_EXP 1.713908431e-15#define EXP_THRESHOLD 34.0#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#define DELTA_4 0.02#define DELT_Vbs0eff 0.02#define DELT_Vbsmos 0.005#define DELT_Vbseff 0.005#define DELT_Xcsat 0.2#define DELT_Vbs0dio 1e-7#define DELTA_VFB 0.02#define DELTA_Vcscv 0.0004#define DELT_Vbsdio 0.01#define CONST_2OV3 0.6666666666#define OFF_Vbsdio 2e-2#define OFF_Vbs0_dio 2.02e-2#define QEX_FACT 20 /* B3SOIDDSmartVbs(Vbs, Old, here, check) * Smart Vbs guess. */doubleB3SOIDDSmartVbs(double New, double Old, B3SOIDDinstance *here, CKTcircuit *ckt, int *check){ /* only do it for floating body and DC */ if (here->B3SOIDDfloat && (ckt->CKTmode & (MODEDC | MODEDCOP))) { /* Vbs cannot be negative in DC */ if (New < 0.0) New = 0.0; } return(New);} /* B3SOIDDlimit(vnew,vold) * limits the per-iteration change of any absolute voltage value */doubleB3SOIDDlimit(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;}intB3SOIDDload(GENmodel *inModel, CKTcircuit *ckt){B3SOIDDmodel *model = (B3SOIDDmodel*)inModel;B3SOIDDinstance *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_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, gTte, 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, dVfb_dVb, dVfb_dVd, dVfb_dT;double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth = 0.0;double dVth_dVb, dVth_dVd, dVth_dT;double Vgst, dVgs_eff_dVg;double n, dn_dVb, Vtm;double ExpArg, V0;double ueff = 0.0, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT;double Esat, Vdsat = 0.0;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 One_Third_CoxWL, Two_Third_CoxWL, CoxWL;double T0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dVc, dT0_dVe, dT0_dT;double T1, dT1_dVg, dT1_dVd, dT1_dVb, dT1_dVc, dT1_dVe, dT1_dT;double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dVc, dT2_dVe, dT2_dT;double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dVc, dT3_dVe, dT3_dT;double T4, dT4_dVg, dT4_dVd, dT4_dVb, dT4_dVc, dT4_dVe, dT4_dT;double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dVc, dT5_dVe, dT5_dT;double T6, dT6_dVg, dT6_dVd, dT6_dVb, dT6_dVc, dT6_dVe, dT6_dT;double T7;double T8;double T9;double T10;double T11, T12;double 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 = 0.0, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb;double dVgsteff_dVe, dVgsteff_dT;double Vdseff = 0.0, 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 = 0.0, Gm, Gds = 0.0, 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 b3soiddSizeDependParam *pParam;int ByPass, Check, ChargeComputationNeeded = 0, error; double gbbsp, gbbdp, gbbg, gbbb, gbbe, gbbp, gbbT;double gddpsp, gddpdp, gddpg, gddpb, gddpe, gddpT;double gsspsp, gsspdp, gsspg, gsspb, gsspe, gsspT;double Gbpbs, Gbpgs, Gbpds, Gbpes, Gbpps, GbpT;double ves, ved, veb, vge = 0.0, delves, vedo, delved;double vps, vpd, Vps, delvps;double Vbd, Ves, Vesfb, sqrtXdep, DeltVthtemp, dDeltVthtemp_dT;double Vbp, dVbp_dVp, dVbp_dVb, dVbp_dVg, dVbp_dVd, dVbp_dVe, dVbp_dT;double Vpsdio, dVpsdio_dVg, dVpsdio_dVd, dVpsdio_dVe, dVpsdio_dVp, dVpsdio_dT;double DeltVthw, dDeltVthw_dVb, dDeltVthw_dT;double dVbseff_dVd, dVbseff_dVe, dVbseff_dT;double dVdsat_dVc, dVasat_dVc, dVACLM_dVc, dVADIBL_dVc, dVa_dVc;double dfgche1_dVc, dfgche2_dVc, dgche_dVc, dVdseff_dVc, dIdl_dVc;double Gm0, Gds0, Gmb0, GmT0, Gmc, Gme, GmT, dVbseff_dVg;double dDIBL_Sft_dVb, BjtA, dBjtA_dVd;double diffVdsii ;double Idgidl = 0.0, Gdgidld, Gdgidlg, Isgidl = 0.0, Gsgidlg;double Gjsd, Gjsb, GjsT, Gjdd, Gjdb, GjdT;double Ibp = 0.0, Iii = 0.0, Giid, Giig, Giib, Giie, GiiT, Gcd, Gcb, GcT;double ceqbody, ceqbodcon = 0.0;double gppg = 0.0, gppdp = 0.0, gppb = 0.0, gppe = 0.0, gppp = 0.0;double gppsp = 0.0, gppT;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, Nfb, CboxWL;double cjsbs;double Qbf0, Qsicv, dVfbeff_dVrg, Cbe = 0.0;double qinv = 0.0, qgate = 0.0, qbody = 0.0, qdrn = 0.0, qsrc, qsub = 0.0;double cqgate, cqbody = 0.0, cqdrn = 0.0, cqsub, cqtemp;double Cgg, Cgd, Cgb, Cge;double Csg, Csd, Csb, Cse, Cbg = 0.0, Cbd = 0.0, Cbb = 0.0;double Cgg1, Cgb1, Cgd1, Csg1, Csd1, Csb1;double Vbs0t = 0.0, dVbs0t_dT ;double Vbs0 = 0.0 ,dVbs0_dVe, dVbs0_dT;double Vbs0eff = 0.0 ,dVbs0eff_dVg ,dVbs0eff_dVd ,dVbs0eff_dVe, dVbs0eff_dT;double Vbs0teff = 0.0,dVbs0teff_dVg ,dVbs0teff_dVd, dVbs0teff_dVe;double dVbs0teff_dT;double Vbsdio = 0.0, dVbsdio_dVg, dVbsdio_dVd, dVbsdio_dVe, dVbsdio_dVb;double dVbsdio_dT;double Vthfd = 0.0 ,dVthfd_dVd ,dVthfd_dVe, dVthfd_dT;double Vbs0mos = 0.0 ,dVbs0mos_dVe, dVbs0mos_dT;double Vbsmos ,dVbsmos_dVg ,dVbsmos_dVb ,dVbsmos_dVd, dVbsmos_dVe, dVbsmos_dT;double Abeff ,dAbeff_dVg ,dAbeff_dVb, dAbeff_dVc;double Vcs ,dVcs_dVg ,dVcs_dVb ,dVcs_dVd ,dVcs_dVe, dVcs_dT;double Xcsat = 0.0, dXcsat_dVg, dXcsat_dVc;double Vdsatii ,dVdsatii_dVg ,dVdsatii_dVd, dVdsatii_dVb, dVdsatii_dT;double Vdseffii ,dVdseffii_dVg ,dVdseffii_dVd, dVdseffii_dVb, dVdseffii_dT;double VcsCV = 0.0 ,dVcsCV_dVg = 0.0 ,dVcsCV_dVb = 0.0;double dVcsCV_dVd = 0.0 ,dVcsCV_dVc = 0.0;double VdsCV = 0.0 ,dVdsCV_dVg = 0.0 ,dVdsCV_dVb = 0.0;double dVdsCV_dVd = 0.0 ,dVdsCV_dVc = 0.0;double Phisc ,dPhisc_dVg ,dPhisc_dVb ,dPhisc_dVd, dPhisc_dVc;double Phisd ,dPhisd_dVg ,dPhisd_dVb ,dPhisd_dVd, dPhisd_dVc;double sqrtPhisc;double sqrtPhisd;double Xc = 0.0 ,dXc_dVg = 0.0 ,dXc_dVb = 0.0 ,dXc_dVd = 0.0 ,dXc_dVc = 0.0;double Ibjt = 0.0 ,dIbjt_dVb ,dIbjt_dVd ,dIbjt_dT = 0.0;double Ibs1 ,dIbs1_dVb ,dIbs1_dT = 0.0;double Ibs2 ,dIbs2_dVb ,dIbs2_dT = 0.0;double Ibs3 ,dIbs3_dVb ,dIbs3_dVd, dIbs3_dT = 0.0;double Ibs4 ,dIbs4_dVb ,dIbs4_dT = 0.0;double Ibd1 ,dIbd1_dVb ,dIbd1_dVd ,dIbd1_dT = 0.0;double Ibd2 ,dIbd2_dVb ,dIbd2_dVd ,dIbd2_dT = 0.0;double Ibd3 ,dIbd3_dVb ,dIbd3_dVd ,dIbd3_dT = 0.0;double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT = 0.0;double ExpVbs1, dExpVbs1_dVb, dExpVbs1_dT = 0.0;double ExpVbs2, dExpVbs2_dVb, dExpVbs2_dT = 0.0;double ExpVbs4 = 0.0, dExpVbs4_dVb = 0.0, dExpVbs4_dT = 0.0;double ExpVbd1, dExpVbd1_dVb, dExpVbd1_dT = 0.0;double ExpVbd2, dExpVbd2_dVb, dExpVbd2_dT = 0.0;double ExpVbd4 = 0.0, dExpVbd4_dVb = 0.0, dExpVbd4_dT = 0.0;double WTsi, NVtm1, NVtm2;double Ic = 0.0;double Ibs = 0.0;double Ibd = 0.0;double Nomi ,dNomi_dVg ,dNomi_dVb ,dNomi_dVd ,dNomi_dVc;double Denomi ,dDenomi_dVg ,dDenomi_dVd ,dDenomi_dVb ,dDenomi_dVc, dDenomi_dT;double Qbf = 0.0 ,dQbf_dVg = 0.0 ,dQbf_dVb = 0.0 ,dQbf_dVd = 0.0;double dQbf_dVc = 0.0 ,dQbf_dVe = 0.0;double Qsubs1 = 0.0 ,dQsubs1_dVg ,dQsubs1_dVb ,dQsubs1_dVd ,dQsubs1_dVc;double Qsubs2 = 0.0 ,dQsubs2_dVg ,dQsubs2_dVb ,dQsubs2_dVd ,dQsubs2_dVc ,dQsubs2_dVe;double Qsub0 = 0.0 ,dQsub0_dVg ,dQsub0_dVb ,dQsub0_dVd ;double Qac0 = 0.0 ,dQac0_dVb ,dQac0_dVd;double Qdep0 ,dQdep0_dVb;double Qe1 = 0.0 , dQe1_dVg ,dQe1_dVb, dQe1_dVd, dQe1_dVe, dQe1_dT;double Ce1g ,Ce1b ,Ce1d ,Ce1e, Ce1T;double Ce2g ,Ce2b ,Ce2d ,Ce2e, Ce2T;double Qe2 = 0.0 , dQe2_dVg ,dQe2_dVb, dQe2_dVd, dQe2_dVe, dQe2_dT;double dQbf_dVrg = 0.0, dQac0_dVrg, dQsub0_dVrg; double dQsubs2_dVrg, dQbf0_dVe, dQbf0_dT;/* for self-heating */double vbi, vfbb, phi, sqrtPhi, Xdep0, jbjt, jdif, jrec, jtun, 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 dQbf_dT = 0.0, dVdsCV_dT = 0.0, dPhisd_dT;double dNomi_dT, dXc_dT = 0.0, dQsubs1_dT, dQsubs2_dT;double dVcsCV_dT = 0.0, dPhisc_dT, dQsicv_dT;double CbT, CsT, CgT;double Qex, dQex_dVg, dQex_dVb, dQex_dVd, dQex_dVe, dQex_dT;/* clean up last */FILE *fpdebug = NULL;/* end clean up */int nandetect;static int nanfound = 0;char nanmessage [12];double m; for (; model != NULL; model = model->B3SOIDDnextModel){ for (here = model->B3SOIDDinstances; here != NULL; here = here->B3SOIDDnextInstance) { if (here->B3SOIDDowner != ARCHme) continue; Check = 0; ByPass = 0; selfheat = (model->B3SOIDDshMod == 1) && (here->B3SOIDDrth0 != 0.0); pParam = here->pParam; if (here->B3SOIDDdebugMod > 3) { if (model->B3SOIDDtype > 0) fpdebug = fopen("b3soiddn.log", "a"); else fpdebug = fopen("b3soiddp.log", "a"); fprintf(fpdebug, "******* Time : %.5e ******* Device: %s Iteration: %d\n", ckt->CKTtime, here->B3SOIDDname, here->B3SOIDDiterations); } if ((ckt->CKTmode & MODEINITSMSIG)) { vbs = *(ckt->CKTstate0 + here->B3SOIDDvbs); vgs = *(ckt->CKTstate0 + here->B3SOIDDvgs); ves = *(ckt->CKTstate0 + here->B3SOIDDves); vps = *(ckt->CKTstate0 + here->B3SOIDDvps); vds = *(ckt->CKTstate0 + here->B3SOIDDvds); delTemp = *(ckt->CKTstate0 + here->B3SOIDDdeltemp); vg = *(ckt->CKTrhsOld + here->B3SOIDDgNode); vd = *(ckt->CKTrhsOld + here->B3SOIDDdNodePrime); vs = *(ckt->CKTrhsOld + here->B3SOIDDsNodePrime); vp = *(ckt->CKTrhsOld + here->B3SOIDDpNode); ve = *(ckt->CKTrhsOld + here->B3SOIDDeNode); vb = *(ckt->CKTrhsOld + here->B3SOIDDbNode); if (here->B3SOIDDdebugMod > 2) { fprintf(fpdebug, "... INIT SMSIG ...\n"); } if (here->B3SOIDDdebugMod > 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -