/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/ /********** * Copyright 2010 Regents of the University of California. All rights reserved. * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soitemp.c * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu. * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. * File: b4soitemp.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Tanvir Morshed 09/22/2009 * Modified by Tanvir Morshed 12/31/2009 * Modified by Tanvir Morshed 05/14/2010 * Modified by Tanvir Morshed 12/16/2010 **********/ /* Lmin, Lmax, Wmin, Wmax */ #include "ngspice/ngspice.h" #include "ngspice/smpdefs.h" #include "ngspice/cktdefs.h" #include "b4soidef.h" #include "ngspice/const.h" #include "ngspice/sperror.h" #include "ngspice/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 EPS0 8.85418e-12 #define PI 3.141592654 #define Charge_q 1.60219e-19 #define Eg300 1.115 /* energy gap at 300K */ #define MAX_EXPL 2.688117142e+43 #define MIN_EXPL 3.720075976e-44 #define EXPL_THRESHOLD 100.0 #define DELTA 1.0E-9 #define DEXP(A,B) { \ if (A > EXPL_THRESHOLD) { \ B = MAX_EXPL*(1.0+(A)-EXPL_THRESHOLD); \ } else if (A < -EXPL_THRESHOLD) { \ B = MIN_EXPL; \ } else { \ B = exp(A); \ } \ } int B4SOItemp( GENmodel *inModel, CKTcircuit *ckt) { register B4SOImodel *model = (B4SOImodel*) inModel; register B4SOIinstance *here; struct b4soiSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6; double Ldrn=0.0, Wdrn; double Temp, TempRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; double SDphi, SDgamma; double Inv_saref, Inv_sbref, Inv_sa, Inv_sb, rho, dvth0_lod; double W_tmp, Inv_ODeff, OD_offset, dk2_lod, deta0_lod, kvsat; int Size_Not_Found, i; double PowWeffWr, T10; /*v4.0 */ double Vtm0eot, Vtmeot,vbieot,phieot,sqrtphieot,vddeot; double Vgs_eff,Vgsteff, V0, Vth,Vgst; double lt1,ltw; double TempRatioMinus1; double n, VgstNVt, ExpArg, sqrtPhisExt,ExpVgst,Vgst2Vtm,vtfbphi2eot; double DIBL_Sft,Lpe_Vb,DITS_Sft,DeltVthtemp, DITS_Sft2; double Theta0,Delt_vth,DeltVthw; double niter,toxpf,toxpi, Tcen; double n0; double eggdep, agbc2n, agbc2p, bgbc2n, bgbc2p, sqrt2qeps; /* v4.3.1 bugfix for mtrlMod=1 -Tanvir */ /* v2.0 release */ double tmp3, T7; /*4.1*/ double epsrox, toxe, epssub; /* loop through all the B4SOI device models */ for (; model != NULL; model = model->B4SOInextModel) { Temp = ckt->CKTtemp; if (model->B4SOIGatesidewallJctSPotential < 0.1) /* v4.0 */ model->B4SOIGatesidewallJctSPotential = 0.1; if (model->B4SOIGatesidewallJctDPotential < 0.1) /* v4.0 */ model->B4SOIGatesidewallJctDPotential = 0.1; model->pSizeDependParamKnot = NULL; pLastKnot = NULL; Tnom = model->B4SOItnom; TempRatio = Temp / Tnom; if(model->B4SOImtrlMod) { epsrox = 3.9; toxe = model->B4SOIeot; epssub = EPS0 * model->B4SOIepsrsub; sqrt2qeps = sqrt(2.0 * 1.0e6 * Charge_q * epssub); /* bugfix 4.3.1 */ /* bugfix v4.3.1 following constants should be replaced with model params -Tanvir */ agbc2n = 3.42537e-7; agbc2p = 4.97232e-7; bgbc2n = 1.16645e12; bgbc2p = 7.45669e11; eggdep = 1.12; } else { epsrox = model->B4SOIepsrox; toxe = model->B4SOItox; epssub = EPSSI; sqrt2qeps = 5.753e-12; /* constant from v4.3.0 and earlier */ /* bugfix v4.3.1 following constants are valid for mtrlMod=0 -Tanvir */ agbc2n = 3.42537e-7; agbc2p = 4.97232e-7; bgbc2n = 1.16645e12; bgbc2p = 7.45669e11; eggdep = 1.12; } /*model->B4SOIcox = epsrox * EPS0 / toxe;*/ model->B4SOIvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); if(model->B4SOImtrlMod == 0) model->B4SOIfactor1 = sqrt(EPSSI / EPSOX * model->B4SOItox); else model->B4SOIfactor1 = sqrt(epssub / (epsrox*EPS0) * toxe);/*4.1*/ if (model->B4SOImtrlMod==0) { Vtm0 = KboQ * Tnom; Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); model->B4SOIeg0 = Eg0; model->B4SOIvtm = KboQ * Temp; Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); model->B4SOIeg = Eg; /* Bug fix #11 Jun 09 Eg is evaluated at Temp, not Tnom. To be used if no selfheat */ /* ni is in cm^-3 */ ni = 1.45e10 * (Temp / 300.15) * sqrt(Temp / 300.15) * exp(21.5565981 - Eg / (2.0 * model->B4SOIvtm)); } else { Vtm0 = KboQ * Tnom; Eg0 = model->B4SOIbg0sub - model->B4SOItbgasub * Tnom * Tnom / (Tnom + model->B4SOItbgbsub); model->B4SOIeg0 = Eg0; model->B4SOIvtm = KboQ * Temp; Eg = model->B4SOIbg0sub - model->B4SOItbgasub * Temp * Temp / (Temp + model->B4SOItbgbsub); model->B4SOIeg = Eg; /* Bug fix #11 Jun 09 Eg is evaluated at Temp, not Tnom. To be used if no selfheat */ ni = model->B4SOIni0sub * (Temp / Tnom) * sqrt(Temp / Tnom) * exp(Eg0/(2.0*Vtm0) - Eg / (2.0 * model->B4SOIvtm)); } /* loop through all the instances of the model */ /* MCJ: Length and Width not initialized */ for (here = model->B4SOIinstances; here != NULL; here = here->B4SOInextInstance) { here->B4SOIrbodyext = here->B4SOIbodySquares * model->B4SOIrbsh; pSizeDependParamKnot = model->pSizeDependParamKnot; Size_Not_Found = 1; while ((pSizeDependParamKnot != NULL) && Size_Not_Found) { if ((here->B4SOIl == pSizeDependParamKnot->Length) && (here->B4SOIw == pSizeDependParamKnot->Width) && (here->B4SOIrth0 == pSizeDependParamKnot->Rth0) && (here->B4SOIcth0 == pSizeDependParamKnot->Cth0) && (here->B4SOInf == pSizeDependParamKnot->NFinger)) /*4.0*/ { Size_Not_Found = 0; here->pParam = pSizeDependParamKnot; pParam = here->pParam; /* v2.2.3 bug fix */ } else { pLastKnot = pSizeDependParamKnot; pSizeDependParamKnot = pSizeDependParamKnot->pNext; } } if (Size_Not_Found) { pParam = (struct b4soiSizeDependParam *)malloc( sizeof(struct b4soiSizeDependParam)); if (pLastKnot == NULL) model->pSizeDependParamKnot = pParam; else pLastKnot->pNext = pParam; pParam->pNext = NULL; here->pParam = pParam; Ldrn = here->B4SOIl; Wdrn = here->B4SOIw / here->B4SOInf; /* v4.0 */ pParam->Length = here->B4SOIl; pParam->Width = here->B4SOIw; pParam->NFinger = here->B4SOInf; /* v4.0 */ pParam->Rth0 = here->B4SOIrth0; pParam->Cth0 = here->B4SOIcth0; T0 = pow(Ldrn, model->B4SOILln); T1 = pow(Wdrn, model->B4SOILwn); tmp1 = model->B4SOILl / T0 + model->B4SOILw / T1 + model->B4SOILwl / (T0 * T1); pParam->B4SOIdl = model->B4SOILint + tmp1; /* v2.2.3 */ tmp1 = model->B4SOILlc / T0 + model->B4SOILwc / T1 + model->B4SOILwlc / (T0 * T1); pParam->B4SOIdlc = model->B4SOIdlc + tmp1; /* v3.0 */ pParam->B4SOIdlcig = model->B4SOIdlcig + tmp1; T2 = pow(Ldrn, model->B4SOIWln); T3 = pow(Wdrn, model->B4SOIWwn); tmp2 = model->B4SOIWl / T2 + model->B4SOIWw / T3 + model->B4SOIWwl / (T2 * T3); pParam->B4SOIdw = model->B4SOIWint + tmp2; /* v2.2.3 */ tmp2 = model->B4SOIWlc / T2 + model->B4SOIWwc / T3 + model->B4SOIWwlc / (T2 * T3); pParam->B4SOIdwc = model->B4SOIdwc + tmp2; pParam->B4SOIleff = here->B4SOIl - 2.0 * pParam->B4SOIdl; if (pParam->B4SOIleff <= 0.0) { IFuid namarray[2]; namarray[0] = model->B4SOImodName; namarray[1] = here->B4SOIname; (*(SPfrontEnd->IFerror))(ERR_FATAL, "B4SOI: mosfet %s, model %s: Effective channel length <= 0", namarray); return(E_BADPARM); } pParam->B4SOIweff = here->B4SOIw / here->B4SOInf /* v4.0 */ - here->B4SOInbc * model->B4SOIdwbc - (2.0 - here->B4SOInbc) * pParam->B4SOIdw; if (pParam->B4SOIweff <= 0.0) { IFuid namarray[2]; namarray[0] = model->B4SOImodName; namarray[1] = here->B4SOIname; (*(SPfrontEnd->IFerror))(ERR_FATAL, "B4SOI: mosfet %s, model %s: Effective channel width <= 0", namarray); return(E_BADPARM); } pParam->B4SOIwdiod = pParam->B4SOIweff / here->B4SOInseg + here->B4SOIpdbcp; pParam->B4SOIwdios = pParam->B4SOIweff / here->B4SOInseg + here->B4SOIpsbcp; pParam->B4SOIleffCV = here->B4SOIl - 2.0 * pParam->B4SOIdlc; if (pParam->B4SOIleffCV <= 0.0) { IFuid namarray[2]; namarray[0] = model->B4SOImodName; namarray[1] = here->B4SOIname; (*(SPfrontEnd->IFerror))(ERR_FATAL, "B4SOI: mosfet %s, model %s: Effective channel length for C-V <= 0", namarray); return(E_BADPARM); } pParam->B4SOIweffCV = here->B4SOIw /here->B4SOInf /* v4.0 */ - here->B4SOInbc * model->B4SOIdwbc - (2.0 - here->B4SOInbc) * pParam->B4SOIdwc; if (pParam->B4SOIweffCV <= 0.0) { IFuid namarray[2]; namarray[0] = model->B4SOImodName; namarray[1] = here->B4SOIname; (*(SPfrontEnd->IFerror))(ERR_FATAL, "B4SOI: mosfet %s, model %s: Effective channel width for C-V <= 0", namarray); return(E_BADPARM); } pParam->B4SOIwdiodCV = pParam->B4SOIweffCV / here->B4SOInseg + here->B4SOIpdbcp; pParam->B4SOIwdiosCV = pParam->B4SOIweffCV / here->B4SOInseg + here->B4SOIpsbcp; pParam->B4SOIleffCVb = here->B4SOIl - 2.0 * pParam->B4SOIdlc - model->B4SOIdlcb; if (pParam->B4SOIleffCVb <= 0.0) { IFuid namarray[2]; namarray[0] = model->B4SOImodName; namarray[1] = here->B4SOIname; (*(SPfrontEnd->IFerror))(ERR_FATAL, "B4SOI: mosfet %s, model %s: Effective channel length for C-V (body) <= 0", namarray); return(E_BADPARM); } pParam->B4SOIleffCVbg = pParam->B4SOIleffCVb + 2 * model->B4SOIdlbg; if (pParam->B4SOIleffCVbg <= 0.0) { IFuid namarray[2]; namarray[0] = model->B4SOImodName; namarray[1] = here->B4SOIname; (*(SPfrontEnd->IFerror))(ERR_FATAL, "B4SOI: mosfet %s, model %s: Effective channel length for C-V (backgate) <= 0", namarray); return(E_BADPARM); } /* Not binned - START */ pParam->B4SOIgamma1 = model->B4SOIgamma1; pParam->B4SOIgamma2 = model->B4SOIgamma2; pParam->B4SOIvbx = model->B4SOIvbx; pParam->B4SOIvbm = model->B4SOIvbm; pParam->B4SOIxt = model->B4SOIxt; /* Not binned - END */ /* CV model */ pParam->B4SOIcf = model->B4SOIcf; pParam->B4SOIclc = model->B4SOIclc; pParam->B4SOIcle = model->B4SOIcle; pParam->B4SOIabulkCVfactor = 1.0 + pow((pParam->B4SOIclc / pParam->B4SOIleff), pParam->B4SOIcle); /* Added for binning - START */ if (model->B4SOIbinUnit == 1) { Inv_L = 1.0e-6 / pParam->B4SOIleff; Inv_W = 1.0e-6 / pParam->B4SOIweff; Inv_LW = 1.0e-12 / (pParam->B4SOIleff * pParam->B4SOIweff); } else { Inv_L = 1.0 / pParam->B4SOIleff; Inv_W = 1.0 / pParam->B4SOIweff; Inv_LW = 1.0 / (pParam->B4SOIleff * pParam->B4SOIweff); } pParam->B4SOInpeak = model->B4SOInpeak + model->B4SOIlnpeak * Inv_L + model->B4SOIwnpeak * Inv_W + model->B4SOIpnpeak * Inv_LW; pParam->B4SOInsub = model->B4SOInsub + model->B4SOIlnsub * Inv_L + model->B4SOIwnsub * Inv_W + model->B4SOIpnsub * Inv_LW; pParam->B4SOIngate = model->B4SOIngate + model->B4SOIlngate * Inv_L + model->B4SOIwngate * Inv_W + model->B4SOIpngate * Inv_LW; /*4.1*/ pParam->B4SOInsd = model->B4SOInsd + model->B4SOIlnsd * Inv_L + model->B4SOIwnsd * Inv_W + model->B4SOIpnsd * Inv_LW; pParam->B4SOIvth0 = model->B4SOIvth0 + model->B4SOIlvth0 * Inv_L + model->B4SOIwvth0 * Inv_W + model->B4SOIpvth0 * Inv_LW; pParam->B4SOIvfb = model->B4SOIvfb + model->B4SOIlvfb * Inv_L + model->B4SOIwvfb * Inv_W + model->B4SOIpvfb * Inv_LW; /* v4.1 */ pParam->B4SOIk1 = model->B4SOIk1 + model->B4SOIlk1 * Inv_L + model->B4SOIwk1 * Inv_W + model->B4SOIpk1 * Inv_LW; pParam->B4SOIk2 = model->B4SOIk2 + model->B4SOIlk2 * Inv_L + model->B4SOIwk2 * Inv_W + model->B4SOIpk2 * Inv_LW; pParam->B4SOIk1w1 = model->B4SOIk1w1 + model->B4SOIlk1w1 * Inv_L + model->B4SOIwk1w1 * Inv_W + model->B4SOIpk1w1 * Inv_LW; pParam->B4SOIk1w2 = model->B4SOIk1w2 + model->B4SOIlk1w2 * Inv_L + model->B4SOIwk1w2 * Inv_W + model->B4SOIpk1w2 * Inv_LW; pParam->B4SOIk3 = model->B4SOIk3 + model->B4SOIlk3 * Inv_L + model->B4SOIwk3 * Inv_W + model->B4SOIpk3 * Inv_LW; pParam->B4SOIk3b = model->B4SOIk3b + model->B4SOIlk3b * Inv_L + model->B4SOIwk3b * Inv_W + model->B4SOIpk3b * Inv_LW; pParam->B4SOIkb1 = model->B4SOIkb1 + model->B4SOIlkb1 * Inv_L + model->B4SOIwkb1 * Inv_W + model->B4SOIpkb1 * Inv_LW; pParam->B4SOIw0 = model->B4SOIw0 + model->B4SOIlw0 * Inv_L + model->B4SOIww0 * Inv_W + model->B4SOIpw0 * Inv_LW; pParam->B4SOIlpe0 = model->B4SOIlpe0 + model->B4SOIllpe0 * Inv_L + model->B4SOIwlpe0 * Inv_W + model->B4SOIplpe0 * Inv_LW; pParam->B4SOIlpeb = model->B4SOIlpeb + model->B4SOIllpeb * Inv_L + model->B4SOIwlpeb * Inv_W + model->B4SOIplpeb * Inv_LW; /* v4.0 */ pParam->B4SOIdvt0 = model->B4SOIdvt0 + model->B4SOIldvt0 * Inv_L + model->B4SOIwdvt0 * Inv_W + model->B4SOIpdvt0 * Inv_LW; pParam->B4SOIdvt1 = model->B4SOIdvt1 + model->B4SOIldvt1 * Inv_L + model->B4SOIwdvt1 * Inv_W + model->B4SOIpdvt1 * Inv_LW; pParam->B4SOIdvt2 = model->B4SOIdvt2 + model->B4SOIldvt2 * Inv_L + model->B4SOIwdvt2 * Inv_W + model->B4SOIpdvt2 * Inv_LW; pParam->B4SOIdvt0w = model->B4SOIdvt0w + model->B4SOIldvt0w * Inv_L + model->B4SOIwdvt0w * Inv_W + model->B4SOIpdvt0w * Inv_LW; pParam->B4SOIdvt1w = model->B4SOIdvt1w + model->B4SOIldvt1w * Inv_L + model->B4SOIwdvt1w * Inv_W + model->B4SOIpdvt1w * Inv_LW; pParam->B4SOIdvt2w = model->B4SOIdvt2w + model->B4SOIldvt2w * Inv_L + model->B4SOIwdvt2w * Inv_W + model->B4SOIpdvt2w * Inv_LW; pParam->B4SOIu0 = model->B4SOIu0 + model->B4SOIlu0 * Inv_L + model->B4SOIwu0 * Inv_W + model->B4SOIpu0 * Inv_LW; pParam->B4SOIua = model->B4SOIua + model->B4SOIlua * Inv_L + model->B4SOIwua * Inv_W + model->B4SOIpua * Inv_LW; pParam->B4SOIub = model->B4SOIub + model->B4SOIlub * Inv_L + model->B4SOIwub * Inv_W + model->B4SOIpub * Inv_LW; pParam->B4SOIuc = model->B4SOIuc + model->B4SOIluc * Inv_L + model->B4SOIwuc * Inv_W + model->B4SOIpuc * Inv_LW; pParam->B4SOIvsat = model->B4SOIvsat + model->B4SOIlvsat * Inv_L + model->B4SOIwvsat * Inv_W + model->B4SOIpvsat * Inv_LW; pParam->B4SOIa0 = model->B4SOIa0 + model->B4SOIla0 * Inv_L + model->B4SOIwa0 * Inv_W + model->B4SOIpa0 * Inv_LW; pParam->B4SOIags = model->B4SOIags + model->B4SOIlags * Inv_L + model->B4SOIwags * Inv_W + model->B4SOIpags * Inv_LW; pParam->B4SOIb0 = model->B4SOIb0 + model->B4SOIlb0 * Inv_L + model->B4SOIwb0 * Inv_W + model->B4SOIpb0 * Inv_LW; pParam->B4SOIb1 = model->B4SOIb1 + model->B4SOIlb1 * Inv_L + model->B4SOIwb1 * Inv_W + model->B4SOIpb1 * Inv_LW; pParam->B4SOIketa = model->B4SOIketa + model->B4SOIlketa * Inv_L + model->B4SOIwketa * Inv_W + model->B4SOIpketa * Inv_LW; pParam->B4SOIketas = model->B4SOIketas + model->B4SOIlketas * Inv_L + model->B4SOIwketas * Inv_W + model->B4SOIpketas * Inv_LW; pParam->B4SOIa1 = model->B4SOIa1 + model->B4SOIla1 * Inv_L + model->B4SOIwa1 * Inv_W + model->B4SOIpa1 * Inv_LW; pParam->B4SOIa2 = model->B4SOIa2 + model->B4SOIla2 * Inv_L + model->B4SOIwa2 * Inv_W + model->B4SOIpa2 * Inv_LW; pParam->B4SOIrdsw = model->B4SOIrdsw + model->B4SOIlrdsw * Inv_L + model->B4SOIwrdsw * Inv_W + model->B4SOIprdsw * Inv_LW; pParam->B4SOIrsw = model->B4SOIrsw /* v4.0 */ + model->B4SOIlrsw * Inv_L + model->B4SOIwrsw * Inv_W + model->B4SOIprsw * Inv_LW; pParam->B4SOIrdw = model->B4SOIrdw /* v4.0 */ + model->B4SOIlrdw * Inv_L + model->B4SOIwrdw * Inv_W + model->B4SOIprdw * Inv_LW; pParam->B4SOIprwb = model->B4SOIprwb + model->B4SOIlprwb * Inv_L + model->B4SOIwprwb * Inv_W + model->B4SOIpprwb * Inv_LW; pParam->B4SOIprwg = model->B4SOIprwg + model->B4SOIlprwg * Inv_L + model->B4SOIwprwg * Inv_W + model->B4SOIpprwg * Inv_LW; pParam->B4SOIwr = model->B4SOIwr + model->B4SOIlwr * Inv_L + model->B4SOIwwr * Inv_W + model->B4SOIpwr * Inv_LW; pParam->B4SOInfactor = model->B4SOInfactor + model->B4SOIlnfactor * Inv_L + model->B4SOIwnfactor * Inv_W + model->B4SOIpnfactor * Inv_LW; pParam->B4SOIdwg = model->B4SOIdwg + model->B4SOIldwg * Inv_L + model->B4SOIwdwg * Inv_W + model->B4SOIpdwg * Inv_LW; pParam->B4SOIdwb = model->B4SOIdwb + model->B4SOIldwb * Inv_L + model->B4SOIwdwb * Inv_W + model->B4SOIpdwb * Inv_LW; pParam->B4SOIvoff = model->B4SOIvoff + model->B4SOIlvoff * Inv_L + model->B4SOIwvoff * Inv_W + model->B4SOIpvoff * Inv_LW; pParam->B4SOIeta0 = model->B4SOIeta0 + model->B4SOIleta0 * Inv_L + model->B4SOIweta0 * Inv_W + model->B4SOIpeta0 * Inv_LW; pParam->B4SOIetab = model->B4SOIetab + model->B4SOIletab * Inv_L + model->B4SOIwetab * Inv_W + model->B4SOIpetab * Inv_LW; pParam->B4SOIdsub = model->B4SOIdsub + model->B4SOIldsub * Inv_L + model->B4SOIwdsub * Inv_W + model->B4SOIpdsub * Inv_LW; pParam->B4SOIcit = model->B4SOIcit + model->B4SOIlcit * Inv_L + model->B4SOIwcit * Inv_W + model->B4SOIpcit * Inv_LW; pParam->B4SOIcdsc = model->B4SOIcdsc + model->B4SOIlcdsc * Inv_L + model->B4SOIwcdsc * Inv_W + model->B4SOIpcdsc * Inv_LW; pParam->B4SOIcdscb = model->B4SOIcdscb + model->B4SOIlcdscb * Inv_L + model->B4SOIwcdscb * Inv_W + model->B4SOIpcdscb * Inv_LW; pParam->B4SOIcdscd = model->B4SOIcdscd + model->B4SOIlcdscd * Inv_L + model->B4SOIwcdscd * Inv_W + model->B4SOIpcdscd * Inv_LW; pParam->B4SOIpclm = model->B4SOIpclm + model->B4SOIlpclm * Inv_L + model->B4SOIwpclm * Inv_W + model->B4SOIppclm * Inv_LW; pParam->B4SOIpdibl1 = model->B4SOIpdibl1 + model->B4SOIlpdibl1 * Inv_L + model->B4SOIwpdibl1 * Inv_W + model->B4SOIppdibl1 * Inv_LW; pParam->B4SOIpdibl2 = model->B4SOIpdibl2 + model->B4SOIlpdibl2 * Inv_L + model->B4SOIwpdibl2 * Inv_W + model->B4SOIppdibl2 * Inv_LW; pParam->B4SOIpdiblb = model->B4SOIpdiblb + model->B4SOIlpdiblb * Inv_L + model->B4SOIwpdiblb * Inv_W + model->B4SOIppdiblb * Inv_LW; pParam->B4SOIdrout = model->B4SOIdrout + model->B4SOIldrout * Inv_L + model->B4SOIwdrout * Inv_W + model->B4SOIpdrout * Inv_LW; pParam->B4SOIpvag = model->B4SOIpvag + model->B4SOIlpvag * Inv_L + model->B4SOIwpvag * Inv_W + model->B4SOIppvag * Inv_LW; pParam->B4SOIdelta = model->B4SOIdelta + model->B4SOIldelta * Inv_L + model->B4SOIwdelta * Inv_W + model->B4SOIpdelta * Inv_LW; pParam->B4SOIalpha0 = model->B4SOIalpha0 + model->B4SOIlalpha0 * Inv_L + model->B4SOIwalpha0 * Inv_W + model->B4SOIpalpha0 * Inv_LW; pParam->B4SOIfbjtii = model->B4SOIfbjtii + model->B4SOIlfbjtii * Inv_L + model->B4SOIwfbjtii * Inv_W + model->B4SOIpfbjtii * Inv_LW; /*4.1 Iii model*/ pParam->B4SOIebjtii = model->B4SOIebjtii + model->B4SOIlebjtii * Inv_L + model->B4SOIwebjtii * Inv_W + model->B4SOIpebjtii * Inv_LW; pParam->B4SOIcbjtii = model->B4SOIcbjtii + model->B4SOIlcbjtii * Inv_L + model->B4SOIwcbjtii * Inv_W + model->B4SOIpcbjtii * Inv_LW; pParam->B4SOIvbci = model->B4SOIvbci + model->B4SOIlvbci * Inv_L + model->B4SOIwvbci * Inv_W + model->B4SOIpvbci * Inv_LW; pParam->B4SOIabjtii = model->B4SOIabjtii + model->B4SOIlabjtii * Inv_L + model->B4SOIwabjtii * Inv_W + model->B4SOIpabjtii * Inv_LW; pParam->B4SOImbjtii = model->B4SOImbjtii + model->B4SOIlmbjtii * Inv_L + model->B4SOIwmbjtii * Inv_W + model->B4SOIpmbjtii * Inv_LW; pParam->B4SOIbeta0 = model->B4SOIbeta0 + model->B4SOIlbeta0 * Inv_L + model->B4SOIwbeta0 * Inv_W + model->B4SOIpbeta0 * Inv_LW; pParam->B4SOIbeta1 = model->B4SOIbeta1 + model->B4SOIlbeta1 * Inv_L + model->B4SOIwbeta1 * Inv_W + model->B4SOIpbeta1 * Inv_LW; pParam->B4SOIbeta2 = model->B4SOIbeta2 + model->B4SOIlbeta2 * Inv_L + model->B4SOIwbeta2 * Inv_W + model->B4SOIpbeta2 * Inv_LW; pParam->B4SOIvdsatii0 = model->B4SOIvdsatii0 + model->B4SOIlvdsatii0 * Inv_L + model->B4SOIwvdsatii0 * Inv_W + model->B4SOIpvdsatii0 * Inv_LW; pParam->B4SOIlii = model->B4SOIlii + model->B4SOIllii * Inv_L + model->B4SOIwlii * Inv_W + model->B4SOIplii * Inv_LW; pParam->B4SOIesatii = model->B4SOIesatii + model->B4SOIlesatii * Inv_L + model->B4SOIwesatii * Inv_W + model->B4SOIpesatii * Inv_LW; pParam->B4SOIsii0 = model->B4SOIsii0 + model->B4SOIlsii0 * Inv_L + model->B4SOIwsii0 * Inv_W + model->B4SOIpsii0 * Inv_LW; pParam->B4SOIsii1 = model->B4SOIsii1 + model->B4SOIlsii1 * Inv_L + model->B4SOIwsii1 * Inv_W + model->B4SOIpsii1 * Inv_LW; pParam->B4SOIsii2 = model->B4SOIsii2 + model->B4SOIlsii2 * Inv_L + model->B4SOIwsii2 * Inv_W + model->B4SOIpsii2 * Inv_LW; pParam->B4SOIsiid = model->B4SOIsiid + model->B4SOIlsiid * Inv_L + model->B4SOIwsiid * Inv_W + model->B4SOIpsiid * Inv_LW; pParam->B4SOIagidl = model->B4SOIagidl + model->B4SOIlagidl * Inv_L + model->B4SOIwagidl * Inv_W + model->B4SOIpagidl * Inv_LW; pParam->B4SOIbgidl = model->B4SOIbgidl + model->B4SOIlbgidl * Inv_L + model->B4SOIwbgidl * Inv_W + model->B4SOIpbgidl * Inv_LW; pParam->B4SOIcgidl = model->B4SOIcgidl + model->B4SOIlcgidl * Inv_L + model->B4SOIwcgidl * Inv_W + model->B4SOIpcgidl * Inv_LW; pParam->B4SOIegidl = model->B4SOIegidl + model->B4SOIlegidl * Inv_L + model->B4SOIwegidl * Inv_W + model->B4SOIpegidl * Inv_LW; pParam->B4SOIrgidl = model->B4SOIrgidl + model->B4SOIlrgidl * Inv_L + model->B4SOIwrgidl * Inv_W + model->B4SOIprgidl * Inv_LW; pParam->B4SOIkgidl = model->B4SOIkgidl + model->B4SOIlkgidl * Inv_L + model->B4SOIwkgidl * Inv_W + model->B4SOIpkgidl * Inv_LW; pParam->B4SOIfgidl = model->B4SOIfgidl + model->B4SOIlfgidl * Inv_L + model->B4SOIwfgidl * Inv_W + model->B4SOIpfgidl * Inv_LW; pParam->B4SOIagisl = model->B4SOIagisl + model->B4SOIlagisl * Inv_L + model->B4SOIwagisl * Inv_W + model->B4SOIpagisl * Inv_LW; pParam->B4SOIbgisl = model->B4SOIbgisl + model->B4SOIlbgisl * Inv_L + model->B4SOIwbgisl * Inv_W + model->B4SOIpbgisl * Inv_LW; pParam->B4SOIcgisl = model->B4SOIcgisl + model->B4SOIlcgisl * Inv_L + model->B4SOIwcgisl * Inv_W + model->B4SOIpcgisl * Inv_LW; pParam->B4SOIegisl = model->B4SOIegisl + model->B4SOIlegisl * Inv_L + model->B4SOIwegisl * Inv_W + model->B4SOIpegisl * Inv_LW; pParam->B4SOIrgisl = model->B4SOIrgisl + model->B4SOIlrgisl * Inv_L + model->B4SOIwrgisl * Inv_W + model->B4SOIprgisl * Inv_LW; pParam->B4SOIkgisl = model->B4SOIkgisl + model->B4SOIlkgisl * Inv_L + model->B4SOIwkgisl * Inv_W + model->B4SOIpkgisl * Inv_LW; pParam->B4SOIfgisl = model->B4SOIfgisl + model->B4SOIlfgisl * Inv_L + model->B4SOIwfgisl * Inv_W + model->B4SOIpfgisl * Inv_LW; pParam->B4SOIntun = model->B4SOIntun /* v4.0 */ + model->B4SOIlntun * Inv_L + model->B4SOIwntun * Inv_W + model->B4SOIpntun * Inv_LW; pParam->B4SOIntund = model->B4SOIntund /* v4.0 */ + model->B4SOIlntund * Inv_L + model->B4SOIwntund * Inv_W + model->B4SOIpntund * Inv_LW; pParam->B4SOIndiode = model->B4SOIndiode /* v4.0 */ + model->B4SOIlndiode * Inv_L + model->B4SOIwndiode * Inv_W + model->B4SOIpndiode * Inv_LW; pParam->B4SOIndioded = model->B4SOIndioded /* v4.0 */ + model->B4SOIlndioded * Inv_L + model->B4SOIwndioded * Inv_W + model->B4SOIpndioded * Inv_LW; pParam->B4SOInrecf0 = model->B4SOInrecf0 /* v4.0 */ + model->B4SOIlnrecf0 * Inv_L + model->B4SOIwnrecf0 * Inv_W + model->B4SOIpnrecf0 * Inv_LW; pParam->B4SOInrecf0d = model->B4SOInrecf0d /* v4.0 */ + model->B4SOIlnrecf0d * Inv_L + model->B4SOIwnrecf0d * Inv_W + model->B4SOIpnrecf0d * Inv_LW; pParam->B4SOInrecr0 = model->B4SOInrecr0 /* v4.0 */ + model->B4SOIlnrecr0 * Inv_L + model->B4SOIwnrecr0 * Inv_W + model->B4SOIpnrecr0 * Inv_LW; pParam->B4SOInrecr0d = model->B4SOInrecr0d /* v4.0 */ + model->B4SOIlnrecr0d * Inv_L + model->B4SOIwnrecr0d * Inv_W + model->B4SOIpnrecr0d * Inv_LW; pParam->B4SOIisbjt = model->B4SOIisbjt + model->B4SOIlisbjt * Inv_L + model->B4SOIwisbjt * Inv_W + model->B4SOIpisbjt * Inv_LW; pParam->B4SOIidbjt = model->B4SOIidbjt + model->B4SOIlidbjt * Inv_L + model->B4SOIwidbjt * Inv_W + model->B4SOIpidbjt * Inv_LW; pParam->B4SOIisdif = model->B4SOIisdif + model->B4SOIlisdif * Inv_L + model->B4SOIwisdif * Inv_W + model->B4SOIpisdif * Inv_LW; pParam->B4SOIiddif = model->B4SOIiddif + model->B4SOIliddif * Inv_L + model->B4SOIwiddif * Inv_W + model->B4SOIpiddif * Inv_LW; pParam->B4SOIisrec = model->B4SOIisrec + model->B4SOIlisrec * Inv_L + model->B4SOIwisrec * Inv_W + model->B4SOIpisrec * Inv_LW; pParam->B4SOIistun = model->B4SOIistun + model->B4SOIlistun * Inv_L + model->B4SOIwistun * Inv_W + model->B4SOIpistun * Inv_LW; pParam->B4SOIidrec = model->B4SOIidrec + model->B4SOIlidrec * Inv_L + model->B4SOIwidrec * Inv_W + model->B4SOIpidrec * Inv_LW; pParam->B4SOIidtun = model->B4SOIidtun + model->B4SOIlidtun * Inv_L + model->B4SOIwidtun * Inv_W + model->B4SOIpidtun * Inv_LW; pParam->B4SOIvrec0 = model->B4SOIvrec0 /* v4.0 */ + model->B4SOIlvrec0 * Inv_L + model->B4SOIwvrec0 * Inv_W + model->B4SOIpvrec0 * Inv_LW; pParam->B4SOIvrec0d = model->B4SOIvrec0d /* v4.0 */ + model->B4SOIlvrec0d * Inv_L + model->B4SOIwvrec0d * Inv_W + model->B4SOIpvrec0d * Inv_LW; pParam->B4SOIvtun0 = model->B4SOIvtun0 /* v4.0 */ + model->B4SOIlvtun0 * Inv_L + model->B4SOIwvtun0 * Inv_W + model->B4SOIpvtun0 * Inv_LW; pParam->B4SOIvtun0d = model->B4SOIvtun0d /* v4.0 */ + model->B4SOIlvtun0d * Inv_L + model->B4SOIwvtun0d * Inv_W + model->B4SOIpvtun0d * Inv_LW; pParam->B4SOInbjt = model->B4SOInbjt + model->B4SOIlnbjt * Inv_L + model->B4SOIwnbjt * Inv_W + model->B4SOIpnbjt * Inv_LW; pParam->B4SOIlbjt0 = model->B4SOIlbjt0 + model->B4SOIllbjt0 * Inv_L + model->B4SOIwlbjt0 * Inv_W + model->B4SOIplbjt0 * Inv_LW; pParam->B4SOIvabjt = model->B4SOIvabjt + model->B4SOIlvabjt * Inv_L + model->B4SOIwvabjt * Inv_W + model->B4SOIpvabjt * Inv_LW; pParam->B4SOIaely = model->B4SOIaely + model->B4SOIlaely * Inv_L + model->B4SOIwaely * Inv_W + model->B4SOIpaely * Inv_LW; pParam->B4SOIahli = model->B4SOIahli /* v4.0 */ + model->B4SOIlahli * Inv_L + model->B4SOIwahli * Inv_W + model->B4SOIpahli * Inv_LW; pParam->B4SOIahlid = model->B4SOIahlid /* v4.0 */ + model->B4SOIlahlid * Inv_L + model->B4SOIwahlid * Inv_W + model->B4SOIpahlid * Inv_LW; /* v3.1 */ pParam->B4SOIxj = model->B4SOIxj + model->B4SOIlxj * Inv_L + model->B4SOIwxj * Inv_W + model->B4SOIpxj * Inv_LW; pParam->B4SOIalphaGB1 = model->B4SOIalphaGB1 + model->B4SOIlalphaGB1 * Inv_L + model->B4SOIwalphaGB1 * Inv_W + model->B4SOIpalphaGB1 * Inv_LW; pParam->B4SOIalphaGB2 = model->B4SOIalphaGB2 + model->B4SOIlalphaGB2 * Inv_L + model->B4SOIwalphaGB2 * Inv_W + model->B4SOIpalphaGB2 * Inv_LW; pParam->B4SOIbetaGB1 = model->B4SOIbetaGB1 + model->B4SOIlbetaGB1* Inv_L + model->B4SOIwbetaGB1 * Inv_W + model->B4SOIpbetaGB1 * Inv_LW; pParam->B4SOIbetaGB2 = model->B4SOIbetaGB2 + model->B4SOIlbetaGB2 * Inv_L + model->B4SOIwbetaGB2 * Inv_W + model->B4SOIpbetaGB2 * Inv_LW; pParam->B4SOIndif = model->B4SOIndif + model->B4SOIlndif * Inv_L + model->B4SOIwndif * Inv_W + model->B4SOIpndif * Inv_LW; pParam->B4SOIntrecf = model->B4SOIntrecf + model->B4SOIlntrecf* Inv_L + model->B4SOIwntrecf * Inv_W + model->B4SOIpntrecf * Inv_LW; pParam->B4SOIntrecr = model->B4SOIntrecr + model->B4SOIlntrecr * Inv_L + model->B4SOIwntrecr * Inv_W + model->B4SOIpntrecr * Inv_LW; pParam->B4SOIxbjt = model->B4SOIxbjt + model->B4SOIlxbjt * Inv_L + model->B4SOIwxbjt * Inv_W + model->B4SOIpxbjt * Inv_LW; pParam->B4SOIxdif = model->B4SOIxdif + model->B4SOIlxdif* Inv_L + model->B4SOIwxdif * Inv_W + model->B4SOIpxdif * Inv_LW; pParam->B4SOIxrec = model->B4SOIxrec + model->B4SOIlxrec * Inv_L + model->B4SOIwxrec * Inv_W + model->B4SOIpxrec * Inv_LW; pParam->B4SOIxtun = model->B4SOIxtun + model->B4SOIlxtun * Inv_L + model->B4SOIwxtun * Inv_W + model->B4SOIpxtun * Inv_LW; pParam->B4SOIxdifd = model->B4SOIxdifd + model->B4SOIlxdifd* Inv_L + model->B4SOIwxdifd * Inv_W + model->B4SOIpxdifd * Inv_LW; pParam->B4SOIxrecd = model->B4SOIxrecd + model->B4SOIlxrecd * Inv_L + model->B4SOIwxrecd * Inv_W + model->B4SOIpxrecd * Inv_LW; pParam->B4SOIxtund = model->B4SOIxtund + model->B4SOIlxtund * Inv_L + model->B4SOIwxtund * Inv_W + model->B4SOIpxtund * Inv_LW; pParam->B4SOIcgdl = model->B4SOIcgdl + model->B4SOIlcgdl * Inv_L + model->B4SOIwcgdl * Inv_W + model->B4SOIpcgdl * Inv_LW; pParam->B4SOIcgsl = model->B4SOIcgsl + model->B4SOIlcgsl * Inv_L + model->B4SOIwcgsl * Inv_W + model->B4SOIpcgsl * Inv_LW; pParam->B4SOIckappa = model->B4SOIckappa + model->B4SOIlckappa * Inv_L + model->B4SOIwckappa * Inv_W + model->B4SOIpckappa * Inv_LW; pParam->B4SOIute = model->B4SOIute + model->B4SOIlute * Inv_L + model->B4SOIwute * Inv_W + model->B4SOIpute * Inv_LW; /*4.1 mobmod=4*/ pParam->B4SOIud = model->B4SOIud /* + model->B4SOIud * Inv_L*//*Bug #15 Jun 09*/ + model->B4SOIlud * Inv_L /*Fix*/ + model->B4SOIwud * Inv_W + model->B4SOIpud * Inv_LW; pParam->B4SOIud1 = model->B4SOIud1 + model->B4SOIlud1 * Inv_L + model->B4SOIwud1 * Inv_W + model->B4SOIpud1 * Inv_LW; pParam->B4SOIeu = model->B4SOIeu + model->B4SOIleu * Inv_L + model->B4SOIweu * Inv_W + model->B4SOIpeu * Inv_LW; pParam->B4SOIucs = model->B4SOIucs + model->B4SOIlucs * Inv_L + model->B4SOIwucs * Inv_W + model->B4SOIpucs * Inv_LW; pParam->B4SOIucste = model->B4SOIucste + model->B4SOIlucste * Inv_L + model->B4SOIwucste * Inv_W + model->B4SOIpucste * Inv_LW; pParam->B4SOIkt1 = model->B4SOIkt1 + model->B4SOIlkt1 * Inv_L + model->B4SOIwkt1 * Inv_W + model->B4SOIpkt1 * Inv_LW; pParam->B4SOIkt2 = model->B4SOIkt2 + model->B4SOIlkt2 * Inv_L + model->B4SOIwkt2 * Inv_W + model->B4SOIpkt2 * Inv_LW; pParam->B4SOIkt1l = model->B4SOIkt1l + model->B4SOIlkt1l * Inv_L + model->B4SOIwkt1l * Inv_W + model->B4SOIpkt1l * Inv_LW; pParam->B4SOIua1 = model->B4SOIua1 + model->B4SOIlua1 * Inv_L + model->B4SOIwua1 * Inv_W + model->B4SOIpua1 * Inv_LW; pParam->B4SOIub1 = model->B4SOIub1 + model->B4SOIlub1* Inv_L + model->B4SOIwub1 * Inv_W + model->B4SOIpub1 * Inv_LW; pParam->B4SOIuc1 = model->B4SOIuc1 + model->B4SOIluc1 * Inv_L + model->B4SOIwuc1 * Inv_W + model->B4SOIpuc1 * Inv_LW; pParam->B4SOIat = model->B4SOIat + model->B4SOIlat * Inv_L + model->B4SOIwat * Inv_W + model->B4SOIpat * Inv_LW; pParam->B4SOIprt = model->B4SOIprt + model->B4SOIlprt * Inv_L + model->B4SOIwprt * Inv_W + model->B4SOIpprt * Inv_LW; /* v3.0 */ pParam->B4SOInigc = model->B4SOInigc + model->B4SOIlnigc * Inv_L + model->B4SOIwnigc * Inv_W + model->B4SOIpnigc * Inv_LW; pParam->B4SOIaigc = model->B4SOIaigc + model->B4SOIlaigc * Inv_L + model->B4SOIwaigc * Inv_W + model->B4SOIpaigc * Inv_LW; pParam->B4SOIbigc = model->B4SOIbigc + model->B4SOIlbigc * Inv_L + model->B4SOIwbigc * Inv_W + model->B4SOIpbigc * Inv_LW; pParam->B4SOIcigc = model->B4SOIcigc + model->B4SOIlcigc * Inv_L + model->B4SOIwcigc * Inv_W + model->B4SOIpcigc * Inv_LW; pParam->B4SOIaigsd = model->B4SOIaigsd + model->B4SOIlaigsd * Inv_L + model->B4SOIwaigsd * Inv_W + model->B4SOIpaigsd * Inv_LW; pParam->B4SOIbigsd = model->B4SOIbigsd + model->B4SOIlbigsd * Inv_L + model->B4SOIwbigsd * Inv_W + model->B4SOIpbigsd * Inv_LW; pParam->B4SOIcigsd = model->B4SOIcigsd + model->B4SOIlcigsd * Inv_L + model->B4SOIwcigsd * Inv_W + model->B4SOIpcigsd * Inv_LW; pParam->B4SOIpigcd = model->B4SOIpigcd + model->B4SOIlpigcd * Inv_L + model->B4SOIwpigcd * Inv_W + model->B4SOIppigcd * Inv_LW; pParam->B4SOIpoxedge = model->B4SOIpoxedge + model->B4SOIlpoxedge * Inv_L + model->B4SOIwpoxedge * Inv_W + model->B4SOIppoxedge * Inv_LW; /* v3.0 */ /* v3.1 added for RF */ pParam->B4SOIxrcrg1 = model->B4SOIxrcrg1 + model->B4SOIlxrcrg1 * Inv_L + model->B4SOIwxrcrg1 * Inv_W + model->B4SOIpxrcrg1 * Inv_LW; pParam->B4SOIxrcrg2 = model->B4SOIxrcrg2 + model->B4SOIlxrcrg2 * Inv_L + model->B4SOIwxrcrg2 * Inv_W + model->B4SOIpxrcrg2 * Inv_LW; /* v3.1 added for RF end */ /* CV model */ pParam->B4SOIvsdfb = model->B4SOIvsdfb + model->B4SOIlvsdfb * Inv_L + model->B4SOIwvsdfb * Inv_W + model->B4SOIpvsdfb * Inv_LW; pParam->B4SOIvsdth = model->B4SOIvsdth + model->B4SOIlvsdth * Inv_L + model->B4SOIwvsdth * Inv_W + model->B4SOIpvsdth * Inv_LW; pParam->B4SOIdelvt = model->B4SOIdelvt + model->B4SOIldelvt * Inv_L + model->B4SOIwdelvt * Inv_W + model->B4SOIpdelvt * Inv_LW; pParam->B4SOIacde = model->B4SOIacde + model->B4SOIlacde * Inv_L + model->B4SOIwacde * Inv_W + model->B4SOIpacde * Inv_LW; pParam->B4SOIacde = pParam->B4SOIacde * pow((pParam->B4SOInpeak / 2.0e16), -0.25); /* v3.2 bug fix */ pParam->B4SOImoin = model->B4SOImoin + model->B4SOIlmoin * Inv_L + model->B4SOIwmoin * Inv_W + model->B4SOIpmoin * Inv_LW; pParam->B4SOInoff = model->B4SOInoff + model->B4SOIlnoff * Inv_L + model->B4SOIwnoff * Inv_W + model->B4SOIpnoff * Inv_LW; /* v3.2 */ pParam->B4SOIdvtp0 = model->B4SOIdvtp0 + model->B4SOIldvtp0 * Inv_L + model->B4SOIwdvtp0 * Inv_W + model->B4SOIpdvtp0 * Inv_LW; /* v4.0 */ pParam->B4SOIdvtp1 = model->B4SOIdvtp1 + model->B4SOIldvtp1 * Inv_L + model->B4SOIwdvtp1 * Inv_W + model->B4SOIpdvtp1 * Inv_LW; /* v4.0 */ pParam->B4SOIdvtp2 = model->B4SOIdvtp2 + model->B4SOIldvtp2 * Inv_L + model->B4SOIwdvtp2 * Inv_W + model->B4SOIpdvtp2 * Inv_LW; /* v4.1 */ pParam->B4SOIdvtp3 = model->B4SOIdvtp3 + model->B4SOIldvtp3 * Inv_L + model->B4SOIwdvtp3 * Inv_W + model->B4SOIpdvtp3 * Inv_LW; /* v4.1 */ pParam->B4SOIdvtp4 = model->B4SOIdvtp4 + model->B4SOIldvtp4 * Inv_L + model->B4SOIwdvtp4 * Inv_W + model->B4SOIpdvtp4 * Inv_LW; /* v4.1 */ pParam->B4SOIminv = model->B4SOIminv + model->B4SOIlminv * Inv_L + model->B4SOIwminv * Inv_W + model->B4SOIpminv * Inv_LW; /* v4.0 */ pParam->B4SOIminvcv = model->B4SOIminvcv + model->B4SOIlminvcv * Inv_L + model->B4SOIwminvcv * Inv_W + model->B4SOIpminvcv * Inv_LW; /* v4.1 */ pParam->B4SOIvoffcv = model->B4SOIvoffcv /*Bug fix # 16 Jun09*/ + model->B4SOIlvoffcv * Inv_L + model->B4SOIwvoffcv * Inv_W + model->B4SOIpvoffcv * Inv_LW; pParam->B4SOIfprout = model->B4SOIfprout + model->B4SOIlfprout * Inv_L + model->B4SOIwfprout * Inv_W + model->B4SOIpfprout * Inv_LW; /* v4.0 */ pParam->B4SOIpdits = model->B4SOIpdits + model->B4SOIlpdits * Inv_L + model->B4SOIwpdits * Inv_W + model->B4SOIppdits * Inv_LW; /* v4.0 */ pParam->B4SOIpditsd = model->B4SOIpditsd + model->B4SOIlpditsd * Inv_L + model->B4SOIwpditsd * Inv_W + model->B4SOIppditsd * Inv_LW; /* v4.0 */ pParam->B4SOIaigbcp2 = model->B4SOIaigbcp2 + model->B4SOIlaigbcp2 * Inv_L + model->B4SOIwaigbcp2 * Inv_W + model->B4SOIpaigbcp2 * Inv_LW; /* v4.0 */ pParam->B4SOIbigbcp2 = model->B4SOIbigbcp2 + model->B4SOIlbigbcp2 * Inv_L + model->B4SOIwbigbcp2 * Inv_W + model->B4SOIpbigbcp2 * Inv_LW; /* v4.0 */ pParam->B4SOIcigbcp2 = model->B4SOIcigbcp2 + model->B4SOIlcigbcp2 * Inv_L + model->B4SOIwcigbcp2 * Inv_W + model->B4SOIpcigbcp2 * Inv_LW; /* v4.0 */ /* Added for binning - END */ /* v4.0 add mstar for Vgsteff */ pParam->B4SOImstar = 0.5 + atan(pParam->B4SOIminv) / PI; if (model->B4SOIvgstcvMod == 0) printf("vgstcvMod = 0, users are suggested to use vgstcvMod = 1 or 2.\n"); /* v4.1 add mstarcv for Vgsteffcv */ pParam->B4SOImstarcv = 0.5 + atan(pParam->B4SOIminvcv) / PI; T0 = (TempRatio - 1.0); pParam->B4SOIuatemp = pParam->B4SOIua; /* save ua, ub, and uc for b4soild.c */ pParam->B4SOIubtemp = pParam->B4SOIub; pParam->B4SOIuctemp = pParam->B4SOIuc; pParam->B4SOIrds0denom = pow(pParam->B4SOIweff * 1E6, pParam->B4SOIwr); /* v2.2 release */ pParam->B4SOIrth = here->B4SOIrth0 / (pParam->B4SOIweff + model->B4SOIwth0) * here->B4SOInseg / here->B4SOInf; /* bugfix_snps nf*/ pParam->B4SOIcth = here->B4SOIcth0 * (pParam->B4SOIweff + model->B4SOIwth0) / here->B4SOInseg * here->B4SOInf; /* bugfix_snps nf*/ /* v2.2.2 adding layout-dependent Frbody multiplier */ /* pParam->B4SOIrbody = here->B4SOIfrbody *model->B4SOIrbody * model->B4SOIrhalo / (2 * model->B4SOIrbody + model->B4SOIrhalo * pParam->B4SOIleff) * pParam->B4SOIweff / here->B4SOInseg / here->B4SOInf */ /* v4.0 *//*;*/ if (model->B4SOIrbody == 0) /* Bug Fix # 27 added to avoid NaN (0/0) in QA*/ pParam->B4SOIrbody = 0; else pParam->B4SOIrbody = here->B4SOIfrbody *model->B4SOIrbody * model->B4SOIrhalo / (2 * model->B4SOIrbody + model->B4SOIrhalo * pParam->B4SOIleff) * pParam->B4SOIweff / here->B4SOInseg/ here->B4SOInf; /* v4.0 */ pParam->B4SOIoxideRatio = pow(model->B4SOItoxref /model->B4SOItoxqm, model->B4SOIntox) /model->B4SOItoxqm/model->B4SOItoxqm; /* v2.2 release */ pParam->B4SOIua = pParam->B4SOIua + pParam->B4SOIua1 * T0; pParam->B4SOIub = pParam->B4SOIub + pParam->B4SOIub1 * T0; pParam->B4SOIuc = pParam->B4SOIuc + pParam->B4SOIuc1 * T0; if (pParam->B4SOIu0 > 1.0) pParam->B4SOIu0 = pParam->B4SOIu0 / 1.0e4; pParam->B4SOIu0temp = pParam->B4SOIu0 * pow(TempRatio, pParam->B4SOIute); pParam->B4SOIvsattemp = pParam->B4SOIvsat - pParam->B4SOIat * T0; pParam->B4SOIrds0 = (pParam->B4SOIrdsw + pParam->B4SOIprt * T0) / pow(pParam->B4SOIweff * 1E6, pParam->B4SOIwr); if(model->B4SOIrdsMod) { /* v4.0 */ PowWeffWr = pParam->B4SOIrds0denom * here->B4SOInf; T10 = pParam->B4SOIprt * T0; /* External Rd(V) */ T1 = pParam->B4SOIrdw + T10; T2 = model->B4SOIrdwmin + T10; if (T1 < 0.0) { T1 = 0.0; printf("Warning: Rdw at current temperature is negative; set to 0.\n"); } if (T2 < 0.0) { T2 = 0.0; printf("Warning: Rdwmin at current temperature is negative; set to 0.\n"); } pParam->B4SOIrd0 = T1 / PowWeffWr; pParam->B4SOIrdwmin = T2 / PowWeffWr; /* External Rs(V) */ T3 = pParam->B4SOIrsw + T10; T4 = model->B4SOIrswmin + T10; if (T3 < 0.0) { T3 = 0.0; printf("Warning: Rsw at current temperature is negative; set to 0.\n"); } if (T4 < 0.0) { T4 = 0.0; printf("Warning: Rswmin at current temperature is negative; set to 0.\n"); } pParam->B4SOIrs0 = T3 / PowWeffWr; pParam->B4SOIrswmin = T4 / PowWeffWr; } if (B4SOIcheckModel(model, here, ckt)) { IFuid namarray[2]; namarray[0] = model->B4SOImodName; namarray[1] = here->B4SOIname; (*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during B4SOIV3 parameter checking for %s in model %s", namarray); return(E_BADPARM); } pParam->B4SOIcgdo = (model->B4SOIcgdo + pParam->B4SOIcf) * pParam->B4SOIwdiodCV; pParam->B4SOIcgso = (model->B4SOIcgso + pParam->B4SOIcf) * pParam->B4SOIwdiosCV; pParam->B4SOIcgeo = model->B4SOIcgeo * pParam->B4SOIleffCV * here->B4SOInf; /* v4.0 */ if (!model->B4SOInpeakGiven && model->B4SOIgamma1Given) { T0 = pParam->B4SOIgamma1 * model->B4SOIcox; pParam->B4SOInpeak = 3.021E22 * T0 * T0; } T4 = Eg300 / model->B4SOIvtm * (TempRatio - 1.0); /* source side */ T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndiode; DEXP(T7, T0); T7 = pParam->B4SOIxdif * T4 / pParam->B4SOIndiode; DEXP(T7, T1); T7 = pParam->B4SOIxrec * T4 / pParam->B4SOInrecf0; DEXP(T7, T2); pParam->B4SOIahli0s = pParam->B4SOIahli * T0; pParam->B4SOIjbjts = pParam->B4SOIisbjt * T0; pParam->B4SOIjdifs = pParam->B4SOIisdif * T1; pParam->B4SOIjrecs = pParam->B4SOIisrec * T2; T7 = pParam->B4SOIxtun * (TempRatio - 1); DEXP(T7, T0); pParam->B4SOIjtuns = pParam->B4SOIistun * T0; /* drain side */ /* pParam->B4SOIjtund = pParam->B4SOIidtun * T0; */ /*v4.2 redundant */ T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndioded; DEXP(T7, T0); T7 = pParam->B4SOIxdifd * T4 / pParam->B4SOIndioded; DEXP(T7, T1); T7 = pParam->B4SOIxrecd * T4 / pParam->B4SOInrecf0d; DEXP(T7, T2); pParam->B4SOIahli0d = pParam->B4SOIahlid * T0; pParam->B4SOIjbjtd = pParam->B4SOIidbjt * T0; pParam->B4SOIjdifd = pParam->B4SOIiddif * T1; pParam->B4SOIjrecd = pParam->B4SOIidrec * T2; T7 = pParam->B4SOIxtund * (TempRatio - 1); DEXP(T7, T0); pParam->B4SOIjtund = pParam->B4SOIidtun * T0; if (pParam->B4SOInsub > 0) pParam->B4SOIvfbb = -model->B4SOItype * model->B4SOIvtm * log(pParam->B4SOInpeak/ pParam->B4SOInsub); else pParam->B4SOIvfbb = -model->B4SOItype * model->B4SOIvtm * log(-pParam->B4SOInpeak* pParam->B4SOInsub/ni/ni); if (!model->B4SOIvsdfbGiven) { if (pParam->B4SOInsub > 0) pParam->B4SOIvsdfb = -model->B4SOItype * (model->B4SOIvtm*log(1e20 * pParam->B4SOInsub / ni /ni) - 0.3); else if (pParam->B4SOInsub < 0) pParam->B4SOIvsdfb = -model->B4SOItype * (model->B4SOIvtm*log(-1e20 / pParam->B4SOInsub) + 0.3); } /* Phi & Gamma */ SDphi = 2.0*model->B4SOIvtm*log(fabs(pParam->B4SOInsub) / ni); SDgamma = sqrt2qeps * sqrt(fabs(pParam->B4SOInsub)) / model->B4SOIcbox; /* bugfix v4.3.1*/ if (!model->B4SOIvsdthGiven) { if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) pParam->B4SOIvsdth = pParam->B4SOIvsdfb + SDphi + SDgamma * sqrt(SDphi); else pParam->B4SOIvsdth = pParam->B4SOIvsdfb - SDphi - SDgamma * sqrt(SDphi); } if (!model->B4SOIcsdminGiven) { /* Cdmin */ tmp = sqrt(2.0 * epssub * SDphi / (Charge_q * fabs(pParam->B4SOInsub) * 1.0e6)); tmp1 = epssub / tmp; model->B4SOIcsdmin = tmp1 * model->B4SOIcbox / (tmp1 + model->B4SOIcbox); } pParam->B4SOIphi = 2.0 * model->B4SOIvtm * log(pParam->B4SOInpeak / ni); pParam->B4SOIsqrtPhi = sqrt(pParam->B4SOIphi); pParam->B4SOIphis3 = pParam->B4SOIsqrtPhi * pParam->B4SOIphi; pParam->B4SOIXdep0 = sqrt(2.0 * epssub / (Charge_q * pParam->B4SOInpeak * 1.0e6)) * pParam->B4SOIsqrtPhi; pParam->B4SOIsqrtXdep0 = sqrt(pParam->B4SOIXdep0); /*4.1*/ if (model->B4SOImtrlMod==0) pParam->B4SOIlitl = sqrt(3.0 *3.9/epsrox* pParam->B4SOIxj * model->B4SOItox); else /* pParam->B4SOIlitl = sqrt(epssub * pParam->B4SOIxj * model->B4SOItox/(epsrox*EPS0)); */ /* Bug fix # 13 Jun 09 'not reported by vendors'*/ pParam->B4SOIlitl = sqrt(epssub * pParam->B4SOIxj * toxe/(epsrox*EPS0)); /* fix */ pParam->B4SOIvbi = model->B4SOIvtm * log(1.0e20 * pParam->B4SOInpeak / (ni * ni)); pParam->B4SOIcdep0 = sqrt(Charge_q * epssub * pParam->B4SOInpeak * 1.0e6 / 2.0 / pParam->B4SOIphi); /* v3.0 */ /*4.1 */ if (model->B4SOImtrlMod ==0) { if (pParam->B4SOIngate > 0.0) { pParam->B4SOIvfbsd = Vtm0 * log(pParam->B4SOIngate / 1.0e20); } else pParam->B4SOIvfbsd = 0.0; } else { T0 = Vtm0 * log(pParam->B4SOInsd/ni); T1 = 0.5 * Eg0; if(T0 > T1) T0 = T1; T2 = model->B4SOIeasub + T1 - model->B4SOItype * T0; pParam->B4SOIvfbsd = model->B4SOIphig - T2; } pParam->B4SOIToxRatio = exp(model->B4SOIntox * log(model->B4SOItoxref /model->B4SOItoxqm)) /model->B4SOItoxqm /model->B4SOItoxqm; pParam->B4SOIToxRatioEdge = exp(model->B4SOIntox * log(model->B4SOItoxref / (model->B4SOItoxqm * pParam->B4SOIpoxedge))) / model->B4SOItoxqm / model->B4SOItoxqm / pParam->B4SOIpoxedge / pParam->B4SOIpoxedge; /* pParam->B4SOIAechvb = (model->B4SOItype == NMOS) ? 4.97232e-7 : 3.42537e-7; pParam->B4SOIBechvb = (model->B4SOItype == NMOS) ? 7.45669e11 : 1.16645e12; */ pParam->B4SOIAechvb = (model->B4SOItype == NMOS) ? agbc2p : agbc2n; /* bugfix 4.3.1 -Tanvir */ pParam->B4SOIBechvb = (model->B4SOItype == NMOS) ? bgbc2p : bgbc2n; /* bugfix v4.3.1 -Tanvir */ // The edge should have a contribution from psbcp & pdbcp. Need s & d terms. // There is no NF correction because psbcp & pdbcp are "per finger" in manual. pParam->B4SOIAechvbEdges = pParam->B4SOIAechvb * (pParam->B4SOIweff/here->B4SOInseg + here->B4SOIpsbcp) * pParam->B4SOIdlcig * pParam->B4SOIToxRatioEdge; /* v3.1 bug fix */ pParam->B4SOIAechvbEdged = pParam->B4SOIAechvb * (pParam->B4SOIweff/here->B4SOInseg + here->B4SOIpdbcp) * pParam->B4SOIdlcig * pParam->B4SOIToxRatioEdge; /* v3.1 bug fix */ pParam->B4SOIBechvbEdge = -pParam->B4SOIBechvb * model->B4SOItoxqm * pParam->B4SOIpoxedge; /* pParam->B4SOIAechvb *= pParam->B4SOIweff/here->B4SOInseg */ /* * pParam->B4SOIleff */ /* * pParam->B4SOIToxRatio */ /* + here->B4SOIagbcpd; v4.0 */ pParam->B4SOIAechvb *= (pParam->B4SOIweff/here->B4SOInseg * pParam->B4SOIleff + here->B4SOIagbcpd/here->B4SOInf) /* LFW */ * pParam->B4SOIToxRatio; /* From Geoffrey Coram 10/22/09 */ pParam->B4SOIBechvb *= -model->B4SOItoxqm; /* v3.0 */ if (model->B4SOIk1Given || model->B4SOIk2Given) { if (!model->B4SOIk1Given) { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); pParam->B4SOIk1 = 0.53; } if (!model->B4SOIk2Given) { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); pParam->B4SOIk2 = -0.0186; } if (model->B4SOIxtGiven) fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); if (model->B4SOIvbxGiven) fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); if (model->B4SOIvbmGiven) fprintf(stdout, "Warning: vbm is ignored because k1 or k2 is given.\n"); if (model->B4SOIgamma1Given) fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); if (model->B4SOIgamma2Given) fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); } else { if (!model->B4SOIvbxGiven){ if (model->B4SOImtrlMod) T0 = Charge_q / 2.0 / epssub * 1.0e6; else T0 = 7.7348e-4; pParam->B4SOIvbx = pParam->B4SOIphi - T0 * pParam->B4SOInpeak * pParam->B4SOIxt * pParam->B4SOIxt;} /* bugfix 4.3.1 */ if (pParam->B4SOIvbx > 0.0) pParam->B4SOIvbx = -pParam->B4SOIvbx; if (pParam->B4SOIvbm > 0.0) pParam->B4SOIvbm = -pParam->B4SOIvbm; if (!model->B4SOIgamma1Given) pParam->B4SOIgamma1 = sqrt2qeps * sqrt(pParam->B4SOInpeak) / model->B4SOIcox; /* bugfix 4.3.1 */ if (!model->B4SOIgamma2Given) pParam->B4SOIgamma2 = sqrt2qeps * sqrt(pParam->B4SOInsub) / model->B4SOIcox; /* bugfix 4.3.1 */ T0 = pParam->B4SOIgamma1 - pParam->B4SOIgamma2; T1 = sqrt(pParam->B4SOIphi - pParam->B4SOIvbx) - pParam->B4SOIsqrtPhi; T2 = sqrt(pParam->B4SOIphi * (pParam->B4SOIphi - pParam->B4SOIvbm)) - pParam->B4SOIphi; pParam->B4SOIk2 = T0 * T1 / (2.0 * T2 + pParam->B4SOIvbm); pParam->B4SOIk1 = pParam->B4SOIgamma2 - 2.0 * pParam->B4SOIk2 * sqrt(pParam->B4SOIphi - pParam->B4SOIvbm); } /*if (pParam->B4SOIk2 < 0.0) { T0 = 0.5 * pParam->B4SOIk1 / pParam->B4SOIk2; pParam->B4SOIvbsc = 0.9 * (pParam->B4SOIphi - T0 * T0); if (pParam->B4SOIvbsc > -3.0) pParam->B4SOIvbsc = -3.0; else if (pParam->B4SOIvbsc < -30.0) pParam->B4SOIvbsc = -30.0; } else { pParam->B4SOIvbsc = -30.0; } if (pParam->B4SOIvbsc > pParam->B4SOIvbm) pParam->B4SOIvbsc = pParam->B4SOIvbm; */ /* v4.2 never used in code */ if ((T0 = pParam->B4SOIweff + pParam->B4SOIk1w2) < 1e-8) T0 = 1e-8; pParam->B4SOIk1eff = pParam->B4SOIk1 * (1 + pParam->B4SOIk1w1/T0); /*4.0 if (model->B4SOIvth0Given) { pParam->B4SOIvfb = model->B4SOItype * pParam->B4SOIvth0 - pParam->B4SOIphi - pParam->B4SOIk1eff * pParam->B4SOIsqrtPhi; } else { pParam->B4SOIvfb = -1.0; pParam->B4SOIvth0 = model->B4SOItype * (pParam->B4SOIvfb + pParam->B4SOIphi + pParam->B4SOIk1eff * pParam->B4SOIsqrtPhi); } */ /* v4.1 */ if (!model->B4SOIvfbGiven) { if (model->B4SOIvth0Given) { pParam->B4SOIvfb = model->B4SOItype * pParam->B4SOIvth0 - pParam->B4SOIphi - pParam->B4SOIk1eff * pParam->B4SOIsqrtPhi; } else { pParam->B4SOIvfb = -1.0; } } if (!model->B4SOIvth0Given) { pParam->B4SOIvth0 = model->B4SOItype * (pParam->B4SOIvfb + pParam->B4SOIphi + pParam->B4SOIk1eff * pParam->B4SOIsqrtPhi); } /* v4.0 */ pParam->B4SOIk1ox = pParam->B4SOIk1eff * model->B4SOItox / model->B4SOItoxm; if(model->B4SOImtrlMod == 0) T1 = sqrt(EPSSI / EPSOX * model->B4SOItox * pParam->B4SOIXdep0); else T1 = sqrt(epssub / (epsrox*EPS0) * model->B4SOItox * pParam->B4SOIXdep0); T0 = exp(-0.5 * pParam->B4SOIdsub * pParam->B4SOIleff / T1); pParam->B4SOItheta0vb0 = (T0 + 2.0 * T0 * T0); T0 = exp(-0.5 * pParam->B4SOIdrout * pParam->B4SOIleff / T1); T2 = (T0 + 2.0 * T0 * T0); pParam->B4SOIthetaRout = pParam->B4SOIpdibl1 * T2 + pParam->B4SOIpdibl2; /* New DITS term (added in 4.1) */ pParam->B4SOIdvtp2factor = pParam->B4SOIdvtp2 / exp(pParam->B4SOIdvtp3 * log(pParam->B4SOIleff)); /* stress effect */ if (model->B4SOIwlod < 0.0) { fprintf(stderr, "Warning: WLOD = %g is less than 0. Set to 0.0\n",model->B4SOIwlod); model->B4SOIwlod = 0.0; } T0 = pow(Ldrn, model->B4SOIllodku0); W_tmp = Wdrn + model->B4SOIwlod; T1 = pow(W_tmp, model->B4SOIwlodku0); tmp1 = model->B4SOIlku0 / T0 + model->B4SOIwku0 / T1 + model->B4SOIpku0 / (T0 * T1); pParam->B4SOIku0 = 1.0 + tmp1; T0 = pow(Ldrn, model->B4SOIllodvth); T1 = pow(W_tmp, model->B4SOIwlodvth); tmp1 = model->B4SOIlkvth0 / T0 + model->B4SOIwkvth0 / T1 + model->B4SOIpkvth0 / (T0 * T1); pParam->B4SOIkvth0 = 1.0 + tmp1; pParam->B4SOIkvth0 = sqrt( pParam->B4SOIkvth0 * pParam->B4SOIkvth0 + DELTA); /*T0 = (TRatio - 1.0);*/ T0 = (TempRatio - 1.0); /* bug fix v4.1 */ pParam->B4SOIku0temp = pParam->B4SOIku0 * (1.0 + model->B4SOItku0 * T0) + DELTA; Inv_saref = 1.0 / (model->B4SOIsaref + 0.5 * Ldrn); Inv_sbref = 1.0 / (model->B4SOIsbref + 0.5 * Ldrn); pParam->B4SOIinv_od_ref = Inv_saref + Inv_sbref; pParam->B4SOIrho_ref = model->B4SOIku0 / pParam->B4SOIku0temp * pParam->B4SOIinv_od_ref; /* stress effect end */ } /* v4.0 stress effect */ /* Bug Fix # 17 Jul09 Code 1484-1560 is moved up from lines 1884-1958 of old version*/ /* v4.0 stress effect */ if( (here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) && ( (here->B4SOInf == 1.0) || ((here->B4SOInf > 1.0) && (here->B4SOIsd > 0.0)) ) ) { Inv_sa = 0; Inv_sb = 0; if (model->B4SOIkvsat < -1.0 ) { fprintf(stderr, "Warning: KVSAT = %g is too small; Reset to -1.0.\n",model->B4SOIkvsat); here->B4SOIkvsat = kvsat = -1.0; } else if (model->B4SOIkvsat > 1.0) { fprintf(stderr, "Warning: KVSAT = %g is too big; Reset to 1.0.\n",model->B4SOIkvsat); here->B4SOIkvsat = kvsat = 1.0; } else here->B4SOIkvsat = model->B4SOIkvsat; for(i = 0; i < here->B4SOInf; i++) { T0 = 1.0 / here->B4SOInf / (here->B4SOIsa + 0.5*Ldrn + i * (here->B4SOIsd +Ldrn)); T1 = 1.0 / here->B4SOInf / (here->B4SOIsb + 0.5*Ldrn + i * (here->B4SOIsd +Ldrn)); Inv_sa += T0; Inv_sb += T1; } Inv_ODeff = Inv_sa + Inv_sb; here->B4SOIInv_ODeff = Inv_ODeff; rho = model->B4SOIku0 / pParam->B4SOIku0temp * Inv_ODeff; T0 = (1.0 + rho)/(1.0 + pParam->B4SOIrho_ref); here->B4SOIu0temp = pParam->B4SOIu0temp * T0; T1 = (1.0 + here->B4SOIkvsat * rho)/(1.0 + here->B4SOIkvsat * pParam->B4SOIrho_ref);/*self-heating bug fix*/ here->B4SOIvsattemp = pParam->B4SOIvsattemp * T1; OD_offset = Inv_ODeff - pParam->B4SOIinv_od_ref; dvth0_lod = model->B4SOIkvth0 / pParam->B4SOIkvth0 * OD_offset; dk2_lod = model->B4SOIstk2 / pow(pParam->B4SOIkvth0, model->B4SOIlodk2) * OD_offset; deta0_lod = model->B4SOIsteta0 / pow(pParam->B4SOIkvth0, model->B4SOIlodeta0) * OD_offset; here->B4SOIvth0 = pParam->B4SOIvth0 + dvth0_lod; here->B4SOIk2 = pParam->B4SOIk2 + dk2_lod; here->B4SOIeta0 = pParam->B4SOIeta0 + deta0_lod; } else { here->B4SOIu0temp = pParam->B4SOIu0temp; here->B4SOIvth0 = pParam->B4SOIvth0; here->B4SOIvsattemp = pParam->B4SOIvsattemp; here->B4SOIk2 = pParam->B4SOIk2; here->B4SOIeta0 = pParam->B4SOIeta0; here->B4SOIInv_ODeff = 0; pParam->B4SOIinv_od_ref = 0; /*Stress bug fix*/ here->B4SOIkvsat = 0; /*Stress bug fix*/ } /* v4.0 stress effect end */ here->B4SOIk2ox = here->B4SOIk2 * model->B4SOItox / model->B4SOItoxm; /* v4.0 */ here->B4SOIvth0 += here->B4SOIdelvto; /* v4.0 */ here->B4SOIvfb = pParam->B4SOIvfb + model->B4SOItype * here->B4SOIdelvto; /* Bug Fix # 17 Jul09 Code 1479-1545 is moved up from lines 1884-1950 of old version, 1954-2035 in this version*/ here->B4SOIcsbox = model->B4SOIcbox*here->B4SOIsourceArea; here->B4SOIcsmin = model->B4SOIcsdmin*here->B4SOIsourceArea; here->B4SOIcdbox = model->B4SOIcbox*here->B4SOIdrainArea; here->B4SOIcdmin = model->B4SOIcsdmin*here->B4SOIdrainArea; if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) { T0 = pParam->B4SOIvsdth - pParam->B4SOIvsdfb; pParam->B4SOIsdt1 = pParam->B4SOIvsdfb + model->B4SOIasd * T0; T1 = here->B4SOIcsbox - here->B4SOIcsmin; T2 = T1 / T0 / T0; pParam->B4SOIst2 = T2 / model->B4SOIasd; pParam->B4SOIst3 = T2 /( 1 - model->B4SOIasd); here->B4SOIst4 = T0 * T1 * (1 + model->B4SOIasd) / 3 - here->B4SOIcsmin * pParam->B4SOIvsdfb; T1 = here->B4SOIcdbox - here->B4SOIcdmin; T2 = T1 / T0 / T0; pParam->B4SOIdt2 = T2 / model->B4SOIasd; pParam->B4SOIdt3 = T2 /( 1 - model->B4SOIasd); here->B4SOIdt4 = T0 * T1 * (1 + model->B4SOIasd) / 3 - here->B4SOIcdmin * pParam->B4SOIvsdfb; } else { T0 = pParam->B4SOIvsdfb - pParam->B4SOIvsdth; pParam->B4SOIsdt1 = pParam->B4SOIvsdth + model->B4SOIasd * T0; T1 = here->B4SOIcsmin - here->B4SOIcsbox; T2 = T1 / T0 / T0; pParam->B4SOIst2 = T2 / model->B4SOIasd; pParam->B4SOIst3 = T2 /( 1 - model->B4SOIasd); here->B4SOIst4 = T0 * T1 * (1 + model->B4SOIasd) / 3 - here->B4SOIcsbox * pParam->B4SOIvsdth; T1 = here->B4SOIcdmin - here->B4SOIcdbox; T2 = T1 / T0 / T0; pParam->B4SOIdt2 = T2 / model->B4SOIasd; pParam->B4SOIdt3 = T2 /( 1 - model->B4SOIasd); here->B4SOIdt4 = T0 * T1 * (1 + model->B4SOIasd) / 3 - here->B4SOIcdbox * pParam->B4SOIvsdth; } /* v2.2.2 bug fix */ T0 = model->B4SOIcsdesw * log(model->B4SOIcfrcoeff * (1 + model->B4SOItsi / model->B4SOItbox)); /* v4.4 */ T1 = here->B4SOIsourcePerimeter - here->B4SOIw; if (T1 > 0.0) here->B4SOIcsesw = T0 * T1; else here->B4SOIcsesw = 0.0; T1 = here->B4SOIdrainPerimeter - here->B4SOIw; if (T1 > 0.0) here->B4SOIcdesw = T0 * T1; else here->B4SOIcdesw = 0.0; here->B4SOIphi = pParam->B4SOIphi; /* process source/drain series resistance */ here->B4SOIdrainConductance = model->B4SOIsheetResistance * here->B4SOIdrainSquares; if (here->B4SOIdrainConductance > 0.0) here->B4SOIdrainConductance = 1.0 / here->B4SOIdrainConductance; else here->B4SOIdrainConductance = 0.0; here->B4SOIsourceConductance = model->B4SOIsheetResistance * here->B4SOIsourceSquares; if (here->B4SOIsourceConductance > 0.0) here->B4SOIsourceConductance = 1.0 / here->B4SOIsourceConductance; else here->B4SOIsourceConductance = 0.0; here->B4SOIcgso = pParam->B4SOIcgso; here->B4SOIcgdo = pParam->B4SOIcgdo; /* v2.0 release */ if (model->B4SOIln < 1e-15) model->B4SOIln = 1e-15; T0 = -0.5 * pParam->B4SOIleff * pParam->B4SOIleff / model->B4SOIln / model->B4SOIln; DEXP(T0,T1); pParam->B4SOIarfabjt = T1; T0 = pParam->B4SOIlbjt0 * (1.0 / pParam->B4SOIleff + 1.0 / model->B4SOIln); pParam->B4SOIlratio = pow(T0,pParam->B4SOInbjt); pParam->B4SOIlratiodif = 1.0 + model->B4SOIldif0 * pow(T0,pParam->B4SOIndif); if ((pParam->B4SOIvearly = pParam->B4SOIvabjt + pParam->B4SOIaely * pParam->B4SOIleff) < 1) pParam->B4SOIvearly = 1; /*4.1 toxp calculation*/ if(model->B4SOImtrlMod==0) { model->B4SOItoxp = model->B4SOItox - model->B4SOIdtoxcv; } else { /* Calculate TOXP from EOT */ /* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */ Vtm0eot = KboQ * model->B4SOItempeot; Vtmeot = Vtm0eot; vbieot = Vtm0eot * log(1.0e20 * pParam->B4SOInpeak / (ni * ni)); phieot = 2.0 * Vtm0eot * log(pParam->B4SOInpeak / ni); sqrtphieot = sqrt(phieot); tmp2 = here->B4SOIvfb + phieot; vddeot = model->B4SOItype * model->B4SOIvddeot; T0 = model->B4SOIepsrgate * EPS0; if ((pParam->B4SOIngate > 1.0e18) && (pParam->B4SOIngate < 1.0e25) && (vddeot > tmp2) && (T0!=0)) { T1 = 1.0e6 * Charge_q * epssub * pParam->B4SOIngate / (model->B4SOIcox * model->B4SOIcox); T4 = sqrt(1.0 + 2.0 * (vddeot - T0) / T1); T2 = T1 * (T4 - 1.0); T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ /* T7 = 1.12 - T3 - 0.05; */ T7 = eggdep - T3 - 0.05; /* bugfix v4.3.1 -Tanvir */ T6 = sqrt(T7 * T7 + 0.224); /* T5 = 1.12 - 0.5 * (T7 + T6); */ T5 = eggdep - 0.5 * (T7 + T6); /* bugfix v4.3.1 -Tanvir */ Vgs_eff = vddeot - T5; } else { Vgs_eff = vddeot; } /* Calculate Vth @ Vds=Vbs=0 */ V0 = vbieot - phieot; T3 = sqrt(pParam->B4SOIXdep0); lt1 = model->B4SOIfactor1 * T3; ltw= model->B4SOIfactor1 * T3 ; T0 = -0.5 * pParam->B4SOIdvt1 * model->B4SOIleffeot / lt1; if (T0 > -EXPL_THRESHOLD) { T1 = exp(T0); Theta0 = T1 * (1.0 + 2.0 * T1); } else { T1 = MIN_EXPL; Theta0 = T1 * (1.0 + 2.0 * T1); } /* Calculate n */ T2 = pParam->B4SOInfactor * epssub / pParam->B4SOIXdep0; T3 = pParam->B4SOIcdsc ; T4 = (T2 + T3 * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; if (T4 >= -0.5) { n = 1.0 + T4; } else /* avoid discontinuity problems caused by T4 */ { T0 = 1.0 / (3.0 + 8.0 * T4); n = (1.0 + 3.0 * T4) * T0; } /* v4.0 DITS */ if (pParam->B4SOIdvtp0 > 0.0) { T2 = 1; /* Bug fix #1 Jun 09 Shorter implementation of same code */ /* T0 = 0.0; T2 = exp(T0); if (T0 < -EXPL_THRESHOLD) { T2 = MIN_EXPL; } else { T2 = exp(T0); } end */ T3 = model->B4SOIleffeot + pParam->B4SOIdvtp0 * (1.0 + T2); T4 = Vtmeot * log(model->B4SOIleffeot / T3); DITS_Sft = n * T4; } else { DITS_Sft=0.0; } here->B4SOIthetavth = pParam->B4SOIdvt0 * Theta0; Delt_vth = here->B4SOIthetavth * V0; T0 = -0.5 * pParam->B4SOIdvt1w * model->B4SOIweffeot * model->B4SOIleffeot / ltw; if (T0 > -EXPL_THRESHOLD) { T1 = exp(T0); T2 = T1 * (1.0 + 2.0 * T1); } else { T1 = MIN_EXPL; T2 = T1 * (1.0 + 2.0 * T1); } T0 = pParam->B4SOIdvt0w * T2; DeltVthw = T0 * V0; TempRatioMinus1 = model->B4SOItempeot / model->B4SOItnom - 1.0; T0 = sqrt(1.0 + pParam->B4SOIlpe0 / model->B4SOIleffeot); T1 = (pParam->B4SOIkt1 + pParam->B4SOIkt1l / model->B4SOIleffeot); DeltVthtemp = pParam->B4SOIk1ox * (T0 - 1.0) * sqrtphieot + T1 * TempRatioMinus1; /* v4.0 */ tmp2 = toxe * phieot / (model->B4SOIweffeot + pParam->B4SOIw0); DIBL_Sft = 0.0; DITS_Sft2 = 0.0; Lpe_Vb = sqrt(1.0 + pParam->B4SOIlpeb / model->B4SOIleffeot); sqrtPhisExt = sqrtphieot; Vth = model->B4SOItype * here->B4SOIvth0 + (pParam->B4SOIk1ox * sqrtPhisExt - pParam->B4SOIk1eff * sqrtphieot) * Lpe_Vb - Delt_vth - DeltVthw +pParam->B4SOIk3 * tmp2 + DeltVthtemp - DIBL_Sft -DITS_Sft - DITS_Sft2; Vgst = Vgs_eff - Vth; T10 = n * Vtmeot; /* v4.0 */ VgstNVt = pParam->B4SOImstar * Vgst / T10; /* v4.0 */ ExpArg = (pParam->B4SOIvoff - (1- pParam->B4SOImstar) * Vgst) / T10; /* v4.0 */ /* MCJ: Very small Vgst */ if (VgstNVt > EXPL_THRESHOLD) { Vgsteff = Vgst; /* T0 is dVgsteff_dVbseff */ } else if (ExpArg > EXPL_THRESHOLD) { T0 = (Vgst - pParam->B4SOIvoff) / (n * Vtmeot); ExpVgst = exp(T0); Vgsteff = Vtmeot * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst; } else { ExpVgst = exp(VgstNVt); T1 = T10 * log(1.0 + ExpVgst); T3 = (1.0 / model->B4SOItempeot); T4 = -model->B4SOIcox / (Vtm0eot * pParam->B4SOIcdep0) * exp(ExpArg) * (1 - pParam->B4SOImstar); T2 = pParam->B4SOImstar - T10 * T4 / (1.0 - pParam->B4SOImstar); Vgsteff = T1 / T2; } Vgst2Vtm = Vgsteff + 2.0 * Vtmeot; /* calculating Toxp */ T3 = model->B4SOItype * here->B4SOIvth0 - here->B4SOIvfb - phieot; vtfbphi2eot = 4.0 * T3; if (vtfbphi2eot < 0.0) vtfbphi2eot = 0.0; niter = 0; toxpf = toxe; do { toxpi = toxpf; tmp2 = 2.0e8 * toxpf; T0 = (Vgsteff + vtfbphi2eot) / tmp2; T1 = 1.0 + exp(model->B4SOIbdos * 0.7 * log(T0)); Tcen = model->B4SOIados * 1.9e-9 / T1; toxpf = toxe - epsrox/model->B4SOIepsrsub * Tcen; niter++; } while ((niter<=4)&&(ABS(toxpf-toxpi)>1e-12)); model->B4SOItoxp = toxpf; /*model->B4SOIcoxp = epsrox * EPS0 / model->B4SOItoxp;*/ }/*End of Toxp*/ /* vfbzb calculation for capMod 3 */ tmp = sqrt(pParam->B4SOIXdep0); tmp1 = pParam->B4SOIvbi - pParam->B4SOIphi; tmp2 = model->B4SOIfactor1 * tmp; T0 = -0.5 * pParam->B4SOIdvt1w * pParam->B4SOIweff * pParam->B4SOIleff / tmp2; if (T0 > -EXPL_THRESHOLD) { T1 = exp(T0); T2 = T1 * (1.0 + 2.0 * T1); } else { T1 = MIN_EXPL; T2 = T1 * (1.0 + 2.0 * T1); } T0 = pParam->B4SOIdvt0w * T2; T2 = T0 * tmp1; T0 = -0.5 * pParam->B4SOIdvt1 * pParam->B4SOIleff / tmp2; if (T0 > -EXPL_THRESHOLD) { T1 = exp(T0); T3 = T1 * (1.0 + 2.0 * T1); } else { T1 = MIN_EXPL; T3 = T1 * (1.0 + 2.0 * T1); } T3 = pParam->B4SOIdvt0 * T3 * tmp1; /* v2.2.3 */ /*4.1*/ /* T4 = (model->B4SOItox - model->B4SOIdtoxcv) * pParam->B4SOIphi / (pParam->B4SOIweff + pParam->B4SOIw0); */ T4 = model->B4SOItoxp * pParam->B4SOIphi / (pParam->B4SOIweff + pParam->B4SOIw0); T0 = sqrt(1.0 + pParam->B4SOIlpe0 / pParam->B4SOIleff); /*v4.0*/ T5 = pParam->B4SOIk1ox * (T0 - 1.0) * pParam->B4SOIsqrtPhi + (pParam->B4SOIkt1 + pParam->B4SOIkt1l / pParam->B4SOIleff) * (TempRatio - 1.0); /* v4.0 */ tmp3 = model->B4SOItype * pParam->B4SOIvth0 - T2 - T3 + pParam->B4SOIk3 * T4 + T5; pParam->B4SOIvfbzb = tmp3 - pParam->B4SOIphi - pParam->B4SOIk1 * pParam->B4SOIsqrtPhi; /* End of vfbzb */ /* v3.2 */ pParam->B4SOIqsi = Charge_q * model->B4SOInpeak * (1.0 + pParam->B4SOIlpe0 / pParam->B4SOIleff) * 1e6 * model->B4SOItsi; /* v3.1 added for RF */ here->B4SOIgrgeltd = model->B4SOIrshg * (model->B4SOIxgw + pParam->B4SOIweff / here->B4SOInseg / 3.0 / model->B4SOIngcon) / (model->B4SOIngcon * here->B4SOInf * (here->B4SOIl - model->B4SOIxgl)); if (here->B4SOIgrgeltd > 0.0) here->B4SOIgrgeltd = 1.0 / here->B4SOIgrgeltd; else { here->B4SOIgrgeltd = 1.0e3; /* mho */ if (here->B4SOIrgateMod !=0) printf("Warning: The gate conductance reset to 1.0e3 mho.\n"); } /* v3.1 added for RF end */ /* v4.0 rbodyMod */ if (here->B4SOIrbodyMod) { if (here->B4SOIrbdb < 1.0e-3) here->B4SOIgrbdb = 1.0e3; /* in mho */ else here->B4SOIgrbdb = model->B4SOIgbmin + 1.0 / here->B4SOIrbdb; if (here->B4SOIrbsb < 1.0e-3) here->B4SOIgrbsb = 1.0e3; else here->B4SOIgrbsb = model->B4SOIgbmin + 1.0 / here->B4SOIrbsb; } /* v4.0 rbodyMod end */ /* Bug Fix # 17 Jul09 Stress effect code (lines: 1954-2020) is moved up to lines 1479-1545*/ here->B4SOIvfbzb = pParam->B4SOIvfbzb + model->B4SOItype * here->B4SOIdelvto; pParam->B4SOIldeb = sqrt(epssub * Vtm0 / (Charge_q * pParam->B4SOInpeak * 1.0e6)) / 3.0; /*For high k mobility*/ T1 = model->B4SOItype * here->B4SOIvth0 - here->B4SOIvfb - pParam->B4SOIphi; T2 = T1 + T1; T3 = 2.5 * T1; here->B4SOIvtfbphi1 = (model->B4SOItype == NMOS) ? T2 : T3; if (here->B4SOIvtfbphi1 < 0.0) here->B4SOIvtfbphi1 = 0.0; /*Calculate VgsteffVth for mobMod=4*/ if(model->B4SOImobMod == 4) { /*Calculate n @ Vbs=Vds=0*/ /*V0 = pParam->B4SOIvbi - pParam->B4SOIphi; */ /* v4.2 never used in code */ lt1 = model->B4SOIfactor1* pParam->B4SOIsqrtXdep0; /* ltw = lt1; */ /* v4.2 never used in code */ T0 = pParam->B4SOIdvt1 * pParam->B4SOIleff / lt1; if (T0 < EXPL_THRESHOLD) { T1 = exp(T0); T2 = T1 - 1.0; T3 = T2 * T2; T4 = T3 + 2.0 * T1 * MIN_EXPL; Theta0 = T1 / T4; } else Theta0 = 1.0 / (MAX_EXPL - 2.0); tmp1 = epssub / pParam->B4SOIXdep0; /*here->B4SOInstar = model->B4SOIvtm / Charge_q * (model->B4SOIcox + tmp1 + pParam->B4SOIcit); */ /* v4.2 never used in code */ tmp2 = pParam->B4SOInfactor * tmp1; tmp3 = (tmp2 + pParam->B4SOIcdsc * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; if (tmp3 >= -0.5) n0 = 1.0 + tmp3; else { T0 = 1.0 / (3.0 + 8.0 * tmp3); n0 = (1.0 + 3.0 * tmp3) * T0; } T0 = n0 * Vtm0; T1 = pParam->B4SOIvoff; T2 = T1/T0; if (T2 < -EXPL_THRESHOLD) { T3 = model->B4SOIcox * MIN_EXPL / pParam->B4SOIcdep0; T4 = pParam->B4SOImstar + T3 * n0; } else if (T2 > EXPL_THRESHOLD) { T3 = model->B4SOIcox * MAX_EXPL / pParam->B4SOIcdep0; T4 = pParam->B4SOImstar + T3 * n0; } else { T3 = exp(T2)* model->B4SOIcox / pParam->B4SOIcdep0; T4 = pParam->B4SOImstar + T3 * n0; } here->B4SOIvgsteffvth = T0 * log(2.0)/T4; } } } return(OK); }