From 06d0aaa8279665e8436ea4243d2c61c173164d83 Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 28 Aug 2018 14:55:43 +0200 Subject: [PATCH] whitespaces --- src/spicelib/devices/bsim2/b2temp.c | 292 +-- .../devices/bsim3soi_dd/b3soiddtemp.c | 934 ++++---- .../devices/bsim3soi_fd/b3soifdtemp.c | 932 ++++---- .../devices/bsim3soi_pd/b3soipdtemp.c | 1042 ++++----- src/spicelib/devices/bsim3v0/b3v0temp.c | 854 +++---- src/spicelib/devices/bsim3v1/b3v1temp.c | 924 ++++---- src/spicelib/devices/bsim4/b4temp.c | 12 +- src/spicelib/devices/bsim4v5/b4v5temp.c | 1422 ++++++------ src/spicelib/devices/bsim4v6/b4v6temp.c | 1996 ++++++++--------- 9 files changed, 4204 insertions(+), 4204 deletions(-) diff --git a/src/spicelib/devices/bsim2/b2temp.c b/src/spicelib/devices/bsim2/b2temp.c index 35fdad0d0..216c81356 100644 --- a/src/spicelib/devices/bsim2/b2temp.c +++ b/src/spicelib/devices/bsim2/b2temp.c @@ -14,8 +14,8 @@ Author: 1985 Hong J. Park, Thomas L. Quarles /* ARGSUSED */ int B2temp(GENmodel *inModel, CKTcircuit *ckt) - /* load the B2 device structure with those pointers needed later - * for fast matrix loading + /* load the B2 device structure with those pointers needed later + * for fast matrix loading */ { @@ -31,7 +31,7 @@ B2temp(GENmodel *inModel, CKTcircuit *ckt) /* loop through all the B2 device models */ for( ; model != NULL; model = B2nextModel(model)) { - + /* Default value Processing for B2 MOSFET Models */ /* Some Limiting for Model Parameters */ if( model->B2bulkJctPotential < 0.1) { @@ -42,10 +42,10 @@ B2temp(GENmodel *inModel, CKTcircuit *ckt) } model->B2Cox = 3.453e-13/(model->B2tox * 1.0e-4);/*in F/cm**2 */ - model->B2vdd2 = 2.0 * model->B2vdd; - model->B2vgg2 = 2.0 * model->B2vgg; - model->B2vbb2 = 2.0 * model->B2vbb; - model->B2Vtm = 8.625e-5 * (model->B2temp + 273.0); + model->B2vdd2 = 2.0 * model->B2vdd; + model->B2vgg2 = 2.0 * model->B2vgg; + model->B2vbb2 = 2.0 * model->B2vbb; + model->B2Vtm = 8.625e-5 * (model->B2temp + 273.0); struct bsim2SizeDependParam *p = model->pSizeDependParamKnot; while (p) { @@ -53,41 +53,41 @@ B2temp(GENmodel *inModel, CKTcircuit *ckt) FREE(p); p = next_p; } - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; + model->pSizeDependParamKnot = NULL; + pLastKnot = NULL; /* loop through all the instances of the model */ for (here = B2instances(model); here != NULL ; here=B2nextInstance(here)) { - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; + pSizeDependParamKnot = model->pSizeDependParamKnot; + Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->B2l == pSizeDependParamKnot->Length) - && (here->B2w == pSizeDependParamKnot->Width)) + while ((pSizeDependParamKnot != NULL) && Size_Not_Found) + { if ((here->B2l == pSizeDependParamKnot->Length) + && (here->B2w == pSizeDependParamKnot->Width)) { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } + here->pParam = pSizeDependParamKnot; + } + else + { pLastKnot = pSizeDependParamKnot; + pSizeDependParamKnot = pSizeDependParamKnot->pNext; + } } - if (Size_Not_Found) - { here->pParam = TMALLOC(struct bsim2SizeDependParam, 1); + if (Size_Not_Found) + { here->pParam = TMALLOC(struct bsim2SizeDependParam, 1); if (pLastKnot == NULL) - model->pSizeDependParamKnot = here->pParam; + model->pSizeDependParamKnot = here->pParam; else - pLastKnot->pNext = here->pParam; + pLastKnot->pNext = here->pParam; here->pParam->pNext = NULL; - EffectiveLength = here->B2l - model->B2deltaL * 1.0e-6; - EffectiveWidth = here->B2w - model->B2deltaW * 1.0e-6; + EffectiveLength = here->B2l - model->B2deltaL * 1.0e-6; + EffectiveWidth = here->B2w - model->B2deltaW * 1.0e-6; if(EffectiveLength<=0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "B2: mosfet %s, model %s: Effective channel length <=0", model->B2modName, here->B2name); @@ -95,152 +95,152 @@ B2temp(GENmodel *inModel, CKTcircuit *ckt) } if(EffectiveWidth <= 0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "B2: mosfet %s, model %s: Effective channel width <=0", model->B2modName, here->B2name); return(E_BADPARM); } - Inv_L = 1.0e-6 / EffectiveLength; - Inv_W = 1.0e-6 / EffectiveWidth; - here->pParam->Width = here->B2w; - here->pParam->Length = here->B2l; + Inv_L = 1.0e-6 / EffectiveLength; + Inv_W = 1.0e-6 / EffectiveWidth; + here->pParam->Width = here->B2w; + here->pParam->Length = here->B2l; here->pParam->B2vfb = model->B2vfb0 + model->B2vfbW * Inv_W - + model->B2vfbL * Inv_L; + + model->B2vfbL * Inv_L; here->pParam->B2phi = model->B2phi0 + model->B2phiW * Inv_W - + model->B2phiL * Inv_L; + + model->B2phiL * Inv_L; here->pParam->B2k1 = model->B2k10 + model->B2k1W * Inv_W - + model->B2k1L * Inv_L; + + model->B2k1L * Inv_L; here->pParam->B2k2 = model->B2k20 + model->B2k2W * Inv_W - + model->B2k2L * Inv_L; - here->pParam->B2eta0 = model->B2eta00 - + model->B2eta0W * Inv_W - + model->B2eta0L * Inv_L; - here->pParam->B2etaB = model->B2etaB0 + model->B2etaBW - * Inv_W + model->B2etaBL * Inv_L; + + model->B2k2L * Inv_L; + here->pParam->B2eta0 = model->B2eta00 + + model->B2eta0W * Inv_W + + model->B2eta0L * Inv_L; + here->pParam->B2etaB = model->B2etaB0 + model->B2etaBW + * Inv_W + model->B2etaBL * Inv_L; here->pParam->B2beta0 = model->B2mob00; - here->pParam->B2beta0B = model->B2mob0B0 - + model->B2mob0BW * Inv_W - + model->B2mob0BL * Inv_L; - here->pParam->B2betas0 = model->B2mobs00 - + model->B2mobs0W * Inv_W - + model->B2mobs0L * Inv_L; + here->pParam->B2beta0B = model->B2mob0B0 + + model->B2mob0BW * Inv_W + + model->B2mob0BL * Inv_L; + here->pParam->B2betas0 = model->B2mobs00 + + model->B2mobs0W * Inv_W + + model->B2mobs0L * Inv_L; if (here->pParam->B2betas0 < 1.01 * here->pParam->B2beta0) - here->pParam->B2betas0 = 1.01 * here->pParam->B2beta0; - here->pParam->B2betasB = model->B2mobsB0 - + model->B2mobsBW * Inv_W - + model->B2mobsBL * Inv_L; + here->pParam->B2betas0 = 1.01 * here->pParam->B2beta0; + here->pParam->B2betasB = model->B2mobsB0 + + model->B2mobsBW * Inv_W + + model->B2mobsBL * Inv_L; tmp = (here->pParam->B2betas0 - here->pParam->B2beta0 - - here->pParam->B2beta0B * model->B2vbb); + - here->pParam->B2beta0B * model->B2vbb); if ((-here->pParam->B2betasB * model->B2vbb) > tmp) - here->pParam->B2betasB = -tmp / model->B2vbb; - here->pParam->B2beta20 = model->B2mob200 - + model->B2mob20W * Inv_W - + model->B2mob20L * Inv_L; - here->pParam->B2beta2B = model->B2mob2B0 - + model->B2mob2BW * Inv_W - + model->B2mob2BL * Inv_L; - here->pParam->B2beta2G = model->B2mob2G0 - + model->B2mob2GW * Inv_W - + model->B2mob2GL * Inv_L; - here->pParam->B2beta30 = model->B2mob300 - + model->B2mob30W * Inv_W - + model->B2mob30L * Inv_L; - here->pParam->B2beta3B = model->B2mob3B0 - + model->B2mob3BW * Inv_W - + model->B2mob3BL * Inv_L; - here->pParam->B2beta3G = model->B2mob3G0 - + model->B2mob3GW * Inv_W - + model->B2mob3GL * Inv_L; - here->pParam->B2beta40 = model->B2mob400 - + model->B2mob40W * Inv_W - + model->B2mob40L * Inv_L; - here->pParam->B2beta4B = model->B2mob4B0 - + model->B2mob4BW * Inv_W - + model->B2mob4BL * Inv_L; - here->pParam->B2beta4G = model->B2mob4G0 - + model->B2mob4GW * Inv_W - + model->B2mob4GL * Inv_L; + here->pParam->B2betasB = -tmp / model->B2vbb; + here->pParam->B2beta20 = model->B2mob200 + + model->B2mob20W * Inv_W + + model->B2mob20L * Inv_L; + here->pParam->B2beta2B = model->B2mob2B0 + + model->B2mob2BW * Inv_W + + model->B2mob2BL * Inv_L; + here->pParam->B2beta2G = model->B2mob2G0 + + model->B2mob2GW * Inv_W + + model->B2mob2GL * Inv_L; + here->pParam->B2beta30 = model->B2mob300 + + model->B2mob30W * Inv_W + + model->B2mob30L * Inv_L; + here->pParam->B2beta3B = model->B2mob3B0 + + model->B2mob3BW * Inv_W + + model->B2mob3BL * Inv_L; + here->pParam->B2beta3G = model->B2mob3G0 + + model->B2mob3GW * Inv_W + + model->B2mob3GL * Inv_L; + here->pParam->B2beta40 = model->B2mob400 + + model->B2mob40W * Inv_W + + model->B2mob40L * Inv_L; + here->pParam->B2beta4B = model->B2mob4B0 + + model->B2mob4BW * Inv_W + + model->B2mob4BL * Inv_L; + here->pParam->B2beta4G = model->B2mob4G0 + + model->B2mob4GW * Inv_W + + model->B2mob4GL * Inv_L; - CoxWoverL = model->B2Cox * EffectiveWidth / EffectiveLength; + CoxWoverL = model->B2Cox * EffectiveWidth / EffectiveLength; - here->pParam->B2beta0 *= CoxWoverL; - here->pParam->B2beta0B *= CoxWoverL; - here->pParam->B2betas0 *= CoxWoverL; - here->pParam->B2betasB *= CoxWoverL; - here->pParam->B2beta30 *= CoxWoverL; - here->pParam->B2beta3B *= CoxWoverL; - here->pParam->B2beta3G *= CoxWoverL; - here->pParam->B2beta40 *= CoxWoverL; - here->pParam->B2beta4B *= CoxWoverL; - here->pParam->B2beta4G *= CoxWoverL; + here->pParam->B2beta0 *= CoxWoverL; + here->pParam->B2beta0B *= CoxWoverL; + here->pParam->B2betas0 *= CoxWoverL; + here->pParam->B2betasB *= CoxWoverL; + here->pParam->B2beta30 *= CoxWoverL; + here->pParam->B2beta3B *= CoxWoverL; + here->pParam->B2beta3G *= CoxWoverL; + here->pParam->B2beta40 *= CoxWoverL; + here->pParam->B2beta4B *= CoxWoverL; + here->pParam->B2beta4G *= CoxWoverL; here->pParam->B2ua0 = model->B2ua00 + model->B2ua0W * Inv_W - + model->B2ua0L * Inv_L; + + model->B2ua0L * Inv_L; here->pParam->B2uaB = model->B2uaB0 + model->B2uaBW * Inv_W - + model->B2uaBL * Inv_L; + + model->B2uaBL * Inv_L; here->pParam->B2ub0 = model->B2ub00 + model->B2ub0W * Inv_W - + model->B2ub0L * Inv_L; + + model->B2ub0L * Inv_L; here->pParam->B2ubB = model->B2ubB0 + model->B2ubBW * Inv_W - + model->B2ubBL * Inv_L; + + model->B2ubBL * Inv_L; here->pParam->B2u10 = model->B2u100 + model->B2u10W * Inv_W - + model->B2u10L * Inv_L; + + model->B2u10L * Inv_L; here->pParam->B2u1B = model->B2u1B0 + model->B2u1BW * Inv_W - + model->B2u1BL * Inv_L; + + model->B2u1BL * Inv_L; here->pParam->B2u1D = model->B2u1D0 + model->B2u1DW * Inv_W - + model->B2u1DL * Inv_L; + + model->B2u1DL * Inv_L; here->pParam->B2n0 = model->B2n00 + model->B2n0W * Inv_W - + model->B2n0L * Inv_L; + + model->B2n0L * Inv_L; here->pParam->B2nB = model->B2nB0 + model->B2nBW * Inv_W - + model->B2nBL * Inv_L; + + model->B2nBL * Inv_L; here->pParam->B2nD = model->B2nD0 + model->B2nDW * Inv_W - + model->B2nDL * Inv_L; + + model->B2nDL * Inv_L; if (here->pParam->B2n0 < 0.0) - here->pParam->B2n0 = 0.0; + here->pParam->B2n0 = 0.0; - here->pParam->B2vof0 = model->B2vof00 - + model->B2vof0W * Inv_W - + model->B2vof0L * Inv_L; - here->pParam->B2vofB = model->B2vofB0 - + model->B2vofBW * Inv_W - + model->B2vofBL * Inv_L; - here->pParam->B2vofD = model->B2vofD0 - + model->B2vofDW * Inv_W - + model->B2vofDL * Inv_L; + here->pParam->B2vof0 = model->B2vof00 + + model->B2vof0W * Inv_W + + model->B2vof0L * Inv_L; + here->pParam->B2vofB = model->B2vofB0 + + model->B2vofBW * Inv_W + + model->B2vofBL * Inv_L; + here->pParam->B2vofD = model->B2vofD0 + + model->B2vofDW * Inv_W + + model->B2vofDL * Inv_L; here->pParam->B2ai0 = model->B2ai00 + model->B2ai0W * Inv_W - + model->B2ai0L * Inv_L; + + model->B2ai0L * Inv_L; here->pParam->B2aiB = model->B2aiB0 + model->B2aiBW * Inv_W - + model->B2aiBL * Inv_L; + + model->B2aiBL * Inv_L; here->pParam->B2bi0 = model->B2bi00 + model->B2bi0W * Inv_W - + model->B2bi0L * Inv_L; + + model->B2bi0L * Inv_L; here->pParam->B2biB = model->B2biB0 + model->B2biBW * Inv_W - + model->B2biBL * Inv_L; - here->pParam->B2vghigh = model->B2vghigh0 - + model->B2vghighW * Inv_W - + model->B2vghighL * Inv_L; - here->pParam->B2vglow = model->B2vglow0 - + model->B2vglowW * Inv_W - + model->B2vglowL * Inv_L; + + model->B2biBL * Inv_L; + here->pParam->B2vghigh = model->B2vghigh0 + + model->B2vghighW * Inv_W + + model->B2vghighL * Inv_L; + here->pParam->B2vglow = model->B2vglow0 + + model->B2vglowW * Inv_W + + model->B2vglowL * Inv_L; - here->pParam->CoxWL = model->B2Cox * EffectiveLength - * EffectiveWidth * 1.0e4; - here->pParam->One_Third_CoxWL = here->pParam->CoxWL / 3.0; - here->pParam->Two_Third_CoxWL = 2.0 - * here->pParam->One_Third_CoxWL; - here->pParam->B2GSoverlapCap = model->B2gateSourceOverlapCap - * EffectiveWidth; - here->pParam->B2GDoverlapCap = model->B2gateDrainOverlapCap - * EffectiveWidth; - here->pParam->B2GBoverlapCap = model->B2gateBulkOverlapCap - * EffectiveLength; + here->pParam->CoxWL = model->B2Cox * EffectiveLength + * EffectiveWidth * 1.0e4; + here->pParam->One_Third_CoxWL = here->pParam->CoxWL / 3.0; + here->pParam->Two_Third_CoxWL = 2.0 + * here->pParam->One_Third_CoxWL; + here->pParam->B2GSoverlapCap = model->B2gateSourceOverlapCap + * EffectiveWidth; + here->pParam->B2GDoverlapCap = model->B2gateDrainOverlapCap + * EffectiveWidth; + here->pParam->B2GBoverlapCap = model->B2gateBulkOverlapCap + * EffectiveLength; here->pParam->SqrtPhi = sqrt(here->pParam->B2phi); - here->pParam->Phis3 = here->pParam->SqrtPhi - * here->pParam->B2phi; + here->pParam->Phis3 = here->pParam->SqrtPhi + * here->pParam->B2phi; here->pParam->Arg = here->pParam->B2betasB - - here->pParam->B2beta0B - model->B2vdd - * (here->pParam->B2beta3B - model->B2vdd - * here->pParam->B2beta4B); + - here->pParam->B2beta0B - model->B2vdd + * (here->pParam->B2beta3B - model->B2vdd + * here->pParam->B2beta4B); } @@ -248,26 +248,26 @@ B2temp(GENmodel *inModel, CKTcircuit *ckt) /* process drain series resistance */ if( (here->B2drainConductance=model->B2sheetResistance * - here->B2drainSquares) != 0.0 ) { + here->B2drainSquares) != 0.0 ) { here->B2drainConductance = 1. / here->B2drainConductance ; - } - + } + /* process source series resistance */ if( (here->B2sourceConductance=model->B2sheetResistance * - here->B2sourceSquares) != 0.0 ) { + here->B2sourceSquares) != 0.0 ) { here->B2sourceConductance = 1. / here->B2sourceConductance ; } - here->pParam->B2vt0 = here->pParam->B2vfb - + here->pParam->B2phi - + here->pParam->B2k1 * here->pParam->SqrtPhi - - here->pParam->B2k2 * here->pParam->B2phi; + here->pParam->B2vt0 = here->pParam->B2vfb + + here->pParam->B2phi + + here->pParam->B2k1 * here->pParam->SqrtPhi + - here->pParam->B2k2 * here->pParam->B2phi; here->B2von = here->pParam->B2vt0; /* added for initialization*/ } } return(OK); -} +} diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddtemp.c b/src/spicelib/devices/bsim3soi_dd/b3soiddtemp.c index e31f39903..8bd2fd2fb 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddtemp.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddtemp.c @@ -7,8 +7,8 @@ File: b3soiddtemp.c 98/5/01 Modified by Paolo Nenzi 2002 **********/ -/* - * Revision 2.1 99/9/27 Pin Su +/* + * Revision 2.1 99/9/27 Pin Su * BSIMDD2.1 release */ @@ -51,71 +51,71 @@ int Size_Not_Found; if (model->B3SOIDDGatesidewallJctPotential < 0.1) model->B3SOIDDGatesidewallJctPotential = 0.1; - struct b3soiddSizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct b3soiddSizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } + struct b3soiddSizeDependParam *p = model->pSizeDependParamKnot; + while (p) { + struct b3soiddSizeDependParam *next_p = p->pNext; + FREE(p); + p = next_p; + } model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; + pLastKnot = NULL; - Tnom = model->B3SOIDDtnom; - TRatio = Temp / Tnom; + Tnom = model->B3SOIDDtnom; + TRatio = Temp / Tnom; - model->B3SOIDDvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); + model->B3SOIDDvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); model->B3SOIDDfactor1 = sqrt(EPSSI / EPSOX * model->B3SOIDDtox); Vtm0 = KboQ * Tnom; Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - model->B3SOIDDeg0 = Eg0; + model->B3SOIDDeg0 = Eg0; model->B3SOIDDvtm = 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) + ni = 1.45e10 * (Temp / 300.15) * sqrt(Temp / 300.15) * exp(21.5565981 - Eg / (2.0 * model->B3SOIDDvtm)); /* loop through all the instances of the model */ - /* MCJ: Length and Width not initialized */ + /* MCJ: Length and Width not initialized */ for (here = B3SOIDDinstances(model); here != NULL; - here = B3SOIDDnextInstance(here)) - { - here->B3SOIDDrbodyext = here->B3SOIDDbodySquares * + here = B3SOIDDnextInstance(here)) + { + here->B3SOIDDrbodyext = here->B3SOIDDbodySquares * model->B3SOIDDrbsh; - pSizeDependParamKnot = model->pSizeDependParamKnot; + pSizeDependParamKnot = model->pSizeDependParamKnot; Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->B3SOIDDl == pSizeDependParamKnot->Length) - && (here->B3SOIDDw == pSizeDependParamKnot->Width) + while ((pSizeDependParamKnot != NULL) && Size_Not_Found) + { if ((here->B3SOIDDl == pSizeDependParamKnot->Length) + && (here->B3SOIDDw == pSizeDependParamKnot->Width) && (here->B3SOIDDrth0 == pSizeDependParamKnot->Rth0) && (here->B3SOIDDcth0 == pSizeDependParamKnot->Cth0)) { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } + here->pParam = pSizeDependParamKnot; + } + else + { pLastKnot = pSizeDependParamKnot; + pSizeDependParamKnot = pSizeDependParamKnot->pNext; + } } - if (Size_Not_Found) - { pParam = TMALLOC(struct b3soiddSizeDependParam, 1); + if (Size_Not_Found) + { pParam = TMALLOC(struct b3soiddSizeDependParam, 1); if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; + model->pSizeDependParamKnot = pParam; else - pLastKnot->pNext = pParam; + pLastKnot->pNext = pParam; pParam->pNext = NULL; here->pParam = pParam; - Ldrn = here->B3SOIDDl; - Wdrn = here->B3SOIDDw; + Ldrn = here->B3SOIDDl; + Wdrn = here->B3SOIDDw; pParam->Length = Ldrn; pParam->Width = Wdrn; pParam->Rth0 = here->B3SOIDDrth0; pParam->Cth0 = here->B3SOIDDcth0; - + T0 = pow(Ldrn, model->B3SOIDDLln); T1 = pow(Wdrn, model->B3SOIDDLwn); tmp1 = model->B3SOIDDLl / T0 + model->B3SOIDDLw / T1 @@ -132,7 +132,7 @@ int Size_Not_Found; pParam->B3SOIDDleff = here->B3SOIDDl - 2.0 * pParam->B3SOIDDdl; if (pParam->B3SOIDDleff <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "B3SOIDD: mosfet %s, model %s: Effective channel length <= 0", model->B3SOIDDmodName, here->B3SOIDDname); @@ -141,7 +141,7 @@ int Size_Not_Found; pParam->B3SOIDDweff = here->B3SOIDDw - 2.0 * pParam->B3SOIDDdw; if (pParam->B3SOIDDweff <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "B3SOIDD: mosfet %s, model %s: Effective channel width <= 0", model->B3SOIDDmodName, here->B3SOIDDname); @@ -150,7 +150,7 @@ int Size_Not_Found; pParam->B3SOIDDleffCV = here->B3SOIDDl - 2.0 * pParam->B3SOIDDdlc; if (pParam->B3SOIDDleffCV <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "B3SOIDD: mosfet %s, model %s: Effective channel length for C-V <= 0", model->B3SOIDDmodName, here->B3SOIDDname); @@ -159,7 +159,7 @@ int Size_Not_Found; pParam->B3SOIDDweffCV = here->B3SOIDDw - 2.0 * pParam->B3SOIDDdwc; if (pParam->B3SOIDDweffCV <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "B3SOIDD: mosfet %s, model %s: Effective channel width for C-V <= 0", model->B3SOIDDmodName, here->B3SOIDDname); @@ -183,351 +183,351 @@ int Size_Not_Found; pParam->B3SOIDDprt = model->B3SOIDDprt; /* Not binned - END */ - /* CV model */ - pParam->B3SOIDDcgsl = model->B3SOIDDcgsl; - pParam->B3SOIDDcgdl = model->B3SOIDDcgdl; - pParam->B3SOIDDckappa = model->B3SOIDDckappa; - pParam->B3SOIDDcf = model->B3SOIDDcf; - pParam->B3SOIDDclc = model->B3SOIDDclc; - pParam->B3SOIDDcle = model->B3SOIDDcle; + /* CV model */ + pParam->B3SOIDDcgsl = model->B3SOIDDcgsl; + pParam->B3SOIDDcgdl = model->B3SOIDDcgdl; + pParam->B3SOIDDckappa = model->B3SOIDDckappa; + pParam->B3SOIDDcf = model->B3SOIDDcf; + pParam->B3SOIDDclc = model->B3SOIDDclc; + pParam->B3SOIDDcle = model->B3SOIDDcle; pParam->B3SOIDDabulkCVfactor = pow(1.0+(pParam->B3SOIDDclc - / pParam->B3SOIDDleff), - pParam->B3SOIDDcle); + / pParam->B3SOIDDleff), + pParam->B3SOIDDcle); /* Added for binning - START */ - if (model->B3SOIDDbinUnit == 1) - { Inv_L = 1.0e-6 / pParam->B3SOIDDleff; - Inv_W = 1.0e-6 / pParam->B3SOIDDweff; - Inv_LW = 1.0e-12 / (pParam->B3SOIDDleff - * pParam->B3SOIDDweff); - } - else - { Inv_L = 1.0 / pParam->B3SOIDDleff; - Inv_W = 1.0 / pParam->B3SOIDDweff; - Inv_LW = 1.0 / (pParam->B3SOIDDleff - * pParam->B3SOIDDweff); - } - pParam->B3SOIDDnpeak = model->B3SOIDDnpeak - + model->B3SOIDDlnpeak * Inv_L - + model->B3SOIDDwnpeak * Inv_W - + model->B3SOIDDpnpeak * Inv_LW; - pParam->B3SOIDDnsub = model->B3SOIDDnsub - + model->B3SOIDDlnsub * Inv_L - + model->B3SOIDDwnsub * Inv_W - + model->B3SOIDDpnsub * Inv_LW; - pParam->B3SOIDDngate = model->B3SOIDDngate - + model->B3SOIDDlngate * Inv_L - + model->B3SOIDDwngate * Inv_W - + model->B3SOIDDpngate * Inv_LW; - pParam->B3SOIDDvth0 = model->B3SOIDDvth0 - + model->B3SOIDDlvth0 * Inv_L - + model->B3SOIDDwvth0 * Inv_W - + model->B3SOIDDpvth0 * Inv_LW; - pParam->B3SOIDDk1 = model->B3SOIDDk1 - + model->B3SOIDDlk1 * Inv_L - + model->B3SOIDDwk1 * Inv_W - + model->B3SOIDDpk1 * Inv_LW; - pParam->B3SOIDDk2 = model->B3SOIDDk2 - + model->B3SOIDDlk2 * Inv_L - + model->B3SOIDDwk2 * Inv_W - + model->B3SOIDDpk2 * Inv_LW; - pParam->B3SOIDDk3 = model->B3SOIDDk3 - + model->B3SOIDDlk3 * Inv_L - + model->B3SOIDDwk3 * Inv_W - + model->B3SOIDDpk3 * Inv_LW; - pParam->B3SOIDDk3b = model->B3SOIDDk3b - + model->B3SOIDDlk3b * Inv_L - + model->B3SOIDDwk3b * Inv_W - + model->B3SOIDDpk3b * Inv_LW; - pParam->B3SOIDDvbsa = model->B3SOIDDvbsa - + model->B3SOIDDlvbsa * Inv_L - + model->B3SOIDDwvbsa * Inv_W - + model->B3SOIDDpvbsa * Inv_LW; - pParam->B3SOIDDdelp = model->B3SOIDDdelp - + model->B3SOIDDldelp * Inv_L - + model->B3SOIDDwdelp * Inv_W - + model->B3SOIDDpdelp * Inv_LW; - pParam->B3SOIDDkb1 = model->B3SOIDDkb1 - + model->B3SOIDDlkb1 * Inv_L - + model->B3SOIDDwkb1 * Inv_W - + model->B3SOIDDpkb1 * Inv_LW; - pParam->B3SOIDDkb3 = model->B3SOIDDkb3 - + model->B3SOIDDlkb3 * Inv_L - + model->B3SOIDDwkb3 * Inv_W - + model->B3SOIDDpkb3 * Inv_LW; - pParam->B3SOIDDdvbd0 = model->B3SOIDDdvbd0 - + model->B3SOIDDldvbd0 * Inv_L - + model->B3SOIDDwdvbd0 * Inv_W - + model->B3SOIDDpdvbd0 * Inv_LW; - pParam->B3SOIDDdvbd1 = model->B3SOIDDdvbd1 - + model->B3SOIDDldvbd1 * Inv_L - + model->B3SOIDDwdvbd1 * Inv_W - + model->B3SOIDDpdvbd1 * Inv_LW; - pParam->B3SOIDDw0 = model->B3SOIDDw0 - + model->B3SOIDDlw0 * Inv_L - + model->B3SOIDDww0 * Inv_W - + model->B3SOIDDpw0 * Inv_LW; - pParam->B3SOIDDnlx = model->B3SOIDDnlx - + model->B3SOIDDlnlx * Inv_L - + model->B3SOIDDwnlx * Inv_W - + model->B3SOIDDpnlx * Inv_LW; - pParam->B3SOIDDdvt0 = model->B3SOIDDdvt0 - + model->B3SOIDDldvt0 * Inv_L - + model->B3SOIDDwdvt0 * Inv_W - + model->B3SOIDDpdvt0 * Inv_LW; - pParam->B3SOIDDdvt1 = model->B3SOIDDdvt1 - + model->B3SOIDDldvt1 * Inv_L - + model->B3SOIDDwdvt1 * Inv_W - + model->B3SOIDDpdvt1 * Inv_LW; - pParam->B3SOIDDdvt2 = model->B3SOIDDdvt2 - + model->B3SOIDDldvt2 * Inv_L - + model->B3SOIDDwdvt2 * Inv_W - + model->B3SOIDDpdvt2 * Inv_LW; - pParam->B3SOIDDdvt0w = model->B3SOIDDdvt0w - + model->B3SOIDDldvt0w * Inv_L - + model->B3SOIDDwdvt0w * Inv_W - + model->B3SOIDDpdvt0w * Inv_LW; - pParam->B3SOIDDdvt1w = model->B3SOIDDdvt1w - + model->B3SOIDDldvt1w * Inv_L - + model->B3SOIDDwdvt1w * Inv_W - + model->B3SOIDDpdvt1w * Inv_LW; - pParam->B3SOIDDdvt2w = model->B3SOIDDdvt2w - + model->B3SOIDDldvt2w * Inv_L - + model->B3SOIDDwdvt2w * Inv_W - + model->B3SOIDDpdvt2w * Inv_LW; - pParam->B3SOIDDu0 = model->B3SOIDDu0 - + model->B3SOIDDlu0 * Inv_L - + model->B3SOIDDwu0 * Inv_W - + model->B3SOIDDpu0 * Inv_LW; - pParam->B3SOIDDua = model->B3SOIDDua - + model->B3SOIDDlua * Inv_L - + model->B3SOIDDwua * Inv_W - + model->B3SOIDDpua * Inv_LW; - pParam->B3SOIDDub = model->B3SOIDDub - + model->B3SOIDDlub * Inv_L - + model->B3SOIDDwub * Inv_W - + model->B3SOIDDpub * Inv_LW; - pParam->B3SOIDDuc = model->B3SOIDDuc - + model->B3SOIDDluc * Inv_L - + model->B3SOIDDwuc * Inv_W - + model->B3SOIDDpuc * Inv_LW; - pParam->B3SOIDDvsat = model->B3SOIDDvsat - + model->B3SOIDDlvsat * Inv_L - + model->B3SOIDDwvsat * Inv_W - + model->B3SOIDDpvsat * Inv_LW; - pParam->B3SOIDDa0 = model->B3SOIDDa0 - + model->B3SOIDDla0 * Inv_L - + model->B3SOIDDwa0 * Inv_W - + model->B3SOIDDpa0 * Inv_LW; - pParam->B3SOIDDags = model->B3SOIDDags - + model->B3SOIDDlags * Inv_L - + model->B3SOIDDwags * Inv_W - + model->B3SOIDDpags * Inv_LW; - pParam->B3SOIDDb0 = model->B3SOIDDb0 - + model->B3SOIDDlb0 * Inv_L - + model->B3SOIDDwb0 * Inv_W - + model->B3SOIDDpb0 * Inv_LW; - pParam->B3SOIDDb1 = model->B3SOIDDb1 - + model->B3SOIDDlb1 * Inv_L - + model->B3SOIDDwb1 * Inv_W - + model->B3SOIDDpb1 * Inv_LW; - pParam->B3SOIDDketa = model->B3SOIDDketa - + model->B3SOIDDlketa * Inv_L - + model->B3SOIDDwketa * Inv_W - + model->B3SOIDDpketa * Inv_LW; - pParam->B3SOIDDabp = model->B3SOIDDabp - + model->B3SOIDDlabp * Inv_L - + model->B3SOIDDwabp * Inv_W - + model->B3SOIDDpabp * Inv_LW; - pParam->B3SOIDDmxc = model->B3SOIDDmxc - + model->B3SOIDDlmxc * Inv_L - + model->B3SOIDDwmxc * Inv_W - + model->B3SOIDDpmxc * Inv_LW; - pParam->B3SOIDDadice0 = model->B3SOIDDadice0 - + model->B3SOIDDladice0 * Inv_L - + model->B3SOIDDwadice0 * Inv_W - + model->B3SOIDDpadice0 * Inv_LW; - pParam->B3SOIDDa1 = model->B3SOIDDa1 - + model->B3SOIDDla1 * Inv_L - + model->B3SOIDDwa1 * Inv_W - + model->B3SOIDDpa1 * Inv_LW; - pParam->B3SOIDDa2 = model->B3SOIDDa2 - + model->B3SOIDDla2 * Inv_L - + model->B3SOIDDwa2 * Inv_W - + model->B3SOIDDpa2 * Inv_LW; - pParam->B3SOIDDrdsw = model->B3SOIDDrdsw - + model->B3SOIDDlrdsw * Inv_L - + model->B3SOIDDwrdsw * Inv_W - + model->B3SOIDDprdsw * Inv_LW; - pParam->B3SOIDDprwb = model->B3SOIDDprwb - + model->B3SOIDDlprwb * Inv_L - + model->B3SOIDDwprwb * Inv_W - + model->B3SOIDDpprwb * Inv_LW; - pParam->B3SOIDDprwg = model->B3SOIDDprwg - + model->B3SOIDDlprwg * Inv_L - + model->B3SOIDDwprwg * Inv_W - + model->B3SOIDDpprwg * Inv_LW; - pParam->B3SOIDDwr = model->B3SOIDDwr - + model->B3SOIDDlwr * Inv_L - + model->B3SOIDDwwr * Inv_W - + model->B3SOIDDpwr * Inv_LW; - pParam->B3SOIDDnfactor = model->B3SOIDDnfactor - + model->B3SOIDDlnfactor * Inv_L - + model->B3SOIDDwnfactor * Inv_W - + model->B3SOIDDpnfactor * Inv_LW; - pParam->B3SOIDDdwg = model->B3SOIDDdwg - + model->B3SOIDDldwg * Inv_L - + model->B3SOIDDwdwg * Inv_W - + model->B3SOIDDpdwg * Inv_LW; - pParam->B3SOIDDdwb = model->B3SOIDDdwb - + model->B3SOIDDldwb * Inv_L - + model->B3SOIDDwdwb * Inv_W - + model->B3SOIDDpdwb * Inv_LW; - pParam->B3SOIDDvoff = model->B3SOIDDvoff - + model->B3SOIDDlvoff * Inv_L - + model->B3SOIDDwvoff * Inv_W - + model->B3SOIDDpvoff * Inv_LW; - pParam->B3SOIDDeta0 = model->B3SOIDDeta0 - + model->B3SOIDDleta0 * Inv_L - + model->B3SOIDDweta0 * Inv_W - + model->B3SOIDDpeta0 * Inv_LW; - pParam->B3SOIDDetab = model->B3SOIDDetab - + model->B3SOIDDletab * Inv_L - + model->B3SOIDDwetab * Inv_W - + model->B3SOIDDpetab * Inv_LW; - pParam->B3SOIDDdsub = model->B3SOIDDdsub - + model->B3SOIDDldsub * Inv_L - + model->B3SOIDDwdsub * Inv_W - + model->B3SOIDDpdsub * Inv_LW; - pParam->B3SOIDDcit = model->B3SOIDDcit - + model->B3SOIDDlcit * Inv_L - + model->B3SOIDDwcit * Inv_W - + model->B3SOIDDpcit * Inv_LW; - pParam->B3SOIDDcdsc = model->B3SOIDDcdsc - + model->B3SOIDDlcdsc * Inv_L - + model->B3SOIDDwcdsc * Inv_W - + model->B3SOIDDpcdsc * Inv_LW; - pParam->B3SOIDDcdscb = model->B3SOIDDcdscb - + model->B3SOIDDlcdscb * Inv_L - + model->B3SOIDDwcdscb * Inv_W - + model->B3SOIDDpcdscb * Inv_LW; - pParam->B3SOIDDcdscd = model->B3SOIDDcdscd - + model->B3SOIDDlcdscd * Inv_L - + model->B3SOIDDwcdscd * Inv_W - + model->B3SOIDDpcdscd * Inv_LW; - pParam->B3SOIDDpclm = model->B3SOIDDpclm - + model->B3SOIDDlpclm * Inv_L - + model->B3SOIDDwpclm * Inv_W - + model->B3SOIDDppclm * Inv_LW; - pParam->B3SOIDDpdibl1 = model->B3SOIDDpdibl1 - + model->B3SOIDDlpdibl1 * Inv_L - + model->B3SOIDDwpdibl1 * Inv_W - + model->B3SOIDDppdibl1 * Inv_LW; - pParam->B3SOIDDpdibl2 = model->B3SOIDDpdibl2 - + model->B3SOIDDlpdibl2 * Inv_L - + model->B3SOIDDwpdibl2 * Inv_W - + model->B3SOIDDppdibl2 * Inv_LW; - pParam->B3SOIDDpdiblb = model->B3SOIDDpdiblb - + model->B3SOIDDlpdiblb * Inv_L - + model->B3SOIDDwpdiblb * Inv_W - + model->B3SOIDDppdiblb * Inv_LW; - pParam->B3SOIDDdrout = model->B3SOIDDdrout - + model->B3SOIDDldrout * Inv_L - + model->B3SOIDDwdrout * Inv_W - + model->B3SOIDDpdrout * Inv_LW; - pParam->B3SOIDDpvag = model->B3SOIDDpvag - + model->B3SOIDDlpvag * Inv_L - + model->B3SOIDDwpvag * Inv_W - + model->B3SOIDDppvag * Inv_LW; - pParam->B3SOIDDdelta = model->B3SOIDDdelta - + model->B3SOIDDldelta * Inv_L - + model->B3SOIDDwdelta * Inv_W - + model->B3SOIDDpdelta * Inv_LW; - pParam->B3SOIDDaii = model->B3SOIDDaii - + model->B3SOIDDlaii * Inv_L - + model->B3SOIDDwaii * Inv_W - + model->B3SOIDDpaii * Inv_LW; - pParam->B3SOIDDbii = model->B3SOIDDbii - + model->B3SOIDDlbii * Inv_L - + model->B3SOIDDwbii * Inv_W - + model->B3SOIDDpbii * Inv_LW; - pParam->B3SOIDDcii = model->B3SOIDDcii - + model->B3SOIDDlcii * Inv_L - + model->B3SOIDDwcii * Inv_W - + model->B3SOIDDpcii * Inv_LW; - pParam->B3SOIDDdii = model->B3SOIDDdii - + model->B3SOIDDldii * Inv_L - + model->B3SOIDDwdii * Inv_W - + model->B3SOIDDpdii * Inv_LW; - pParam->B3SOIDDalpha0 = model->B3SOIDDalpha0 - + model->B3SOIDDlalpha0 * Inv_L - + model->B3SOIDDwalpha0 * Inv_W - + model->B3SOIDDpalpha0 * Inv_LW; - pParam->B3SOIDDalpha1 = model->B3SOIDDalpha1 - + model->B3SOIDDlalpha1 * Inv_L - + model->B3SOIDDwalpha1 * Inv_W - + model->B3SOIDDpalpha1 * Inv_LW; - pParam->B3SOIDDbeta0 = model->B3SOIDDbeta0 - + model->B3SOIDDlbeta0 * Inv_L - + model->B3SOIDDwbeta0 * Inv_W - + model->B3SOIDDpbeta0 * Inv_LW; - pParam->B3SOIDDagidl = model->B3SOIDDagidl - + model->B3SOIDDlagidl * Inv_L - + model->B3SOIDDwagidl * Inv_W - + model->B3SOIDDpagidl * Inv_LW; - pParam->B3SOIDDbgidl = model->B3SOIDDbgidl - + model->B3SOIDDlbgidl * Inv_L - + model->B3SOIDDwbgidl * Inv_W - + model->B3SOIDDpbgidl * Inv_LW; - pParam->B3SOIDDngidl = model->B3SOIDDngidl - + model->B3SOIDDlngidl * Inv_L - + model->B3SOIDDwngidl * Inv_W - + model->B3SOIDDpngidl * Inv_LW; - pParam->B3SOIDDntun = model->B3SOIDDntun - + model->B3SOIDDlntun * Inv_L - + model->B3SOIDDwntun * Inv_W - + model->B3SOIDDpntun * Inv_LW; - pParam->B3SOIDDndiode = model->B3SOIDDndiode - + model->B3SOIDDlndiode * Inv_L - + model->B3SOIDDwndiode * Inv_W - + model->B3SOIDDpndiode * Inv_LW; - pParam->B3SOIDDisbjt = model->B3SOIDDisbjt - + model->B3SOIDDlisbjt * Inv_L - + model->B3SOIDDwisbjt * Inv_W - + model->B3SOIDDpisbjt * Inv_LW; - pParam->B3SOIDDisdif = model->B3SOIDDisdif - + model->B3SOIDDlisdif * Inv_L - + model->B3SOIDDwisdif * Inv_W - + model->B3SOIDDpisdif * Inv_LW; - pParam->B3SOIDDisrec = model->B3SOIDDisrec - + model->B3SOIDDlisrec * Inv_L - + model->B3SOIDDwisrec * Inv_W - + model->B3SOIDDpisrec * Inv_LW; - pParam->B3SOIDDistun = model->B3SOIDDistun - + model->B3SOIDDlistun * Inv_L - + model->B3SOIDDwistun * Inv_W - + model->B3SOIDDpistun * Inv_LW; - pParam->B3SOIDDedl = model->B3SOIDDedl - + model->B3SOIDDledl * Inv_L - + model->B3SOIDDwedl * Inv_W - + model->B3SOIDDpedl * Inv_LW; - pParam->B3SOIDDkbjt1 = model->B3SOIDDkbjt1 - + model->B3SOIDDlkbjt1 * Inv_L - + model->B3SOIDDwkbjt1 * Inv_W - + model->B3SOIDDpkbjt1 * Inv_LW; - /* CV model */ - pParam->B3SOIDDvsdfb = model->B3SOIDDvsdfb - + model->B3SOIDDlvsdfb * Inv_L - + model->B3SOIDDwvsdfb * Inv_W - + model->B3SOIDDpvsdfb * Inv_LW; - pParam->B3SOIDDvsdth = model->B3SOIDDvsdth - + model->B3SOIDDlvsdth * Inv_L - + model->B3SOIDDwvsdth * Inv_W - + model->B3SOIDDpvsdth * Inv_LW; + if (model->B3SOIDDbinUnit == 1) + { Inv_L = 1.0e-6 / pParam->B3SOIDDleff; + Inv_W = 1.0e-6 / pParam->B3SOIDDweff; + Inv_LW = 1.0e-12 / (pParam->B3SOIDDleff + * pParam->B3SOIDDweff); + } + else + { Inv_L = 1.0 / pParam->B3SOIDDleff; + Inv_W = 1.0 / pParam->B3SOIDDweff; + Inv_LW = 1.0 / (pParam->B3SOIDDleff + * pParam->B3SOIDDweff); + } + pParam->B3SOIDDnpeak = model->B3SOIDDnpeak + + model->B3SOIDDlnpeak * Inv_L + + model->B3SOIDDwnpeak * Inv_W + + model->B3SOIDDpnpeak * Inv_LW; + pParam->B3SOIDDnsub = model->B3SOIDDnsub + + model->B3SOIDDlnsub * Inv_L + + model->B3SOIDDwnsub * Inv_W + + model->B3SOIDDpnsub * Inv_LW; + pParam->B3SOIDDngate = model->B3SOIDDngate + + model->B3SOIDDlngate * Inv_L + + model->B3SOIDDwngate * Inv_W + + model->B3SOIDDpngate * Inv_LW; + pParam->B3SOIDDvth0 = model->B3SOIDDvth0 + + model->B3SOIDDlvth0 * Inv_L + + model->B3SOIDDwvth0 * Inv_W + + model->B3SOIDDpvth0 * Inv_LW; + pParam->B3SOIDDk1 = model->B3SOIDDk1 + + model->B3SOIDDlk1 * Inv_L + + model->B3SOIDDwk1 * Inv_W + + model->B3SOIDDpk1 * Inv_LW; + pParam->B3SOIDDk2 = model->B3SOIDDk2 + + model->B3SOIDDlk2 * Inv_L + + model->B3SOIDDwk2 * Inv_W + + model->B3SOIDDpk2 * Inv_LW; + pParam->B3SOIDDk3 = model->B3SOIDDk3 + + model->B3SOIDDlk3 * Inv_L + + model->B3SOIDDwk3 * Inv_W + + model->B3SOIDDpk3 * Inv_LW; + pParam->B3SOIDDk3b = model->B3SOIDDk3b + + model->B3SOIDDlk3b * Inv_L + + model->B3SOIDDwk3b * Inv_W + + model->B3SOIDDpk3b * Inv_LW; + pParam->B3SOIDDvbsa = model->B3SOIDDvbsa + + model->B3SOIDDlvbsa * Inv_L + + model->B3SOIDDwvbsa * Inv_W + + model->B3SOIDDpvbsa * Inv_LW; + pParam->B3SOIDDdelp = model->B3SOIDDdelp + + model->B3SOIDDldelp * Inv_L + + model->B3SOIDDwdelp * Inv_W + + model->B3SOIDDpdelp * Inv_LW; + pParam->B3SOIDDkb1 = model->B3SOIDDkb1 + + model->B3SOIDDlkb1 * Inv_L + + model->B3SOIDDwkb1 * Inv_W + + model->B3SOIDDpkb1 * Inv_LW; + pParam->B3SOIDDkb3 = model->B3SOIDDkb3 + + model->B3SOIDDlkb3 * Inv_L + + model->B3SOIDDwkb3 * Inv_W + + model->B3SOIDDpkb3 * Inv_LW; + pParam->B3SOIDDdvbd0 = model->B3SOIDDdvbd0 + + model->B3SOIDDldvbd0 * Inv_L + + model->B3SOIDDwdvbd0 * Inv_W + + model->B3SOIDDpdvbd0 * Inv_LW; + pParam->B3SOIDDdvbd1 = model->B3SOIDDdvbd1 + + model->B3SOIDDldvbd1 * Inv_L + + model->B3SOIDDwdvbd1 * Inv_W + + model->B3SOIDDpdvbd1 * Inv_LW; + pParam->B3SOIDDw0 = model->B3SOIDDw0 + + model->B3SOIDDlw0 * Inv_L + + model->B3SOIDDww0 * Inv_W + + model->B3SOIDDpw0 * Inv_LW; + pParam->B3SOIDDnlx = model->B3SOIDDnlx + + model->B3SOIDDlnlx * Inv_L + + model->B3SOIDDwnlx * Inv_W + + model->B3SOIDDpnlx * Inv_LW; + pParam->B3SOIDDdvt0 = model->B3SOIDDdvt0 + + model->B3SOIDDldvt0 * Inv_L + + model->B3SOIDDwdvt0 * Inv_W + + model->B3SOIDDpdvt0 * Inv_LW; + pParam->B3SOIDDdvt1 = model->B3SOIDDdvt1 + + model->B3SOIDDldvt1 * Inv_L + + model->B3SOIDDwdvt1 * Inv_W + + model->B3SOIDDpdvt1 * Inv_LW; + pParam->B3SOIDDdvt2 = model->B3SOIDDdvt2 + + model->B3SOIDDldvt2 * Inv_L + + model->B3SOIDDwdvt2 * Inv_W + + model->B3SOIDDpdvt2 * Inv_LW; + pParam->B3SOIDDdvt0w = model->B3SOIDDdvt0w + + model->B3SOIDDldvt0w * Inv_L + + model->B3SOIDDwdvt0w * Inv_W + + model->B3SOIDDpdvt0w * Inv_LW; + pParam->B3SOIDDdvt1w = model->B3SOIDDdvt1w + + model->B3SOIDDldvt1w * Inv_L + + model->B3SOIDDwdvt1w * Inv_W + + model->B3SOIDDpdvt1w * Inv_LW; + pParam->B3SOIDDdvt2w = model->B3SOIDDdvt2w + + model->B3SOIDDldvt2w * Inv_L + + model->B3SOIDDwdvt2w * Inv_W + + model->B3SOIDDpdvt2w * Inv_LW; + pParam->B3SOIDDu0 = model->B3SOIDDu0 + + model->B3SOIDDlu0 * Inv_L + + model->B3SOIDDwu0 * Inv_W + + model->B3SOIDDpu0 * Inv_LW; + pParam->B3SOIDDua = model->B3SOIDDua + + model->B3SOIDDlua * Inv_L + + model->B3SOIDDwua * Inv_W + + model->B3SOIDDpua * Inv_LW; + pParam->B3SOIDDub = model->B3SOIDDub + + model->B3SOIDDlub * Inv_L + + model->B3SOIDDwub * Inv_W + + model->B3SOIDDpub * Inv_LW; + pParam->B3SOIDDuc = model->B3SOIDDuc + + model->B3SOIDDluc * Inv_L + + model->B3SOIDDwuc * Inv_W + + model->B3SOIDDpuc * Inv_LW; + pParam->B3SOIDDvsat = model->B3SOIDDvsat + + model->B3SOIDDlvsat * Inv_L + + model->B3SOIDDwvsat * Inv_W + + model->B3SOIDDpvsat * Inv_LW; + pParam->B3SOIDDa0 = model->B3SOIDDa0 + + model->B3SOIDDla0 * Inv_L + + model->B3SOIDDwa0 * Inv_W + + model->B3SOIDDpa0 * Inv_LW; + pParam->B3SOIDDags = model->B3SOIDDags + + model->B3SOIDDlags * Inv_L + + model->B3SOIDDwags * Inv_W + + model->B3SOIDDpags * Inv_LW; + pParam->B3SOIDDb0 = model->B3SOIDDb0 + + model->B3SOIDDlb0 * Inv_L + + model->B3SOIDDwb0 * Inv_W + + model->B3SOIDDpb0 * Inv_LW; + pParam->B3SOIDDb1 = model->B3SOIDDb1 + + model->B3SOIDDlb1 * Inv_L + + model->B3SOIDDwb1 * Inv_W + + model->B3SOIDDpb1 * Inv_LW; + pParam->B3SOIDDketa = model->B3SOIDDketa + + model->B3SOIDDlketa * Inv_L + + model->B3SOIDDwketa * Inv_W + + model->B3SOIDDpketa * Inv_LW; + pParam->B3SOIDDabp = model->B3SOIDDabp + + model->B3SOIDDlabp * Inv_L + + model->B3SOIDDwabp * Inv_W + + model->B3SOIDDpabp * Inv_LW; + pParam->B3SOIDDmxc = model->B3SOIDDmxc + + model->B3SOIDDlmxc * Inv_L + + model->B3SOIDDwmxc * Inv_W + + model->B3SOIDDpmxc * Inv_LW; + pParam->B3SOIDDadice0 = model->B3SOIDDadice0 + + model->B3SOIDDladice0 * Inv_L + + model->B3SOIDDwadice0 * Inv_W + + model->B3SOIDDpadice0 * Inv_LW; + pParam->B3SOIDDa1 = model->B3SOIDDa1 + + model->B3SOIDDla1 * Inv_L + + model->B3SOIDDwa1 * Inv_W + + model->B3SOIDDpa1 * Inv_LW; + pParam->B3SOIDDa2 = model->B3SOIDDa2 + + model->B3SOIDDla2 * Inv_L + + model->B3SOIDDwa2 * Inv_W + + model->B3SOIDDpa2 * Inv_LW; + pParam->B3SOIDDrdsw = model->B3SOIDDrdsw + + model->B3SOIDDlrdsw * Inv_L + + model->B3SOIDDwrdsw * Inv_W + + model->B3SOIDDprdsw * Inv_LW; + pParam->B3SOIDDprwb = model->B3SOIDDprwb + + model->B3SOIDDlprwb * Inv_L + + model->B3SOIDDwprwb * Inv_W + + model->B3SOIDDpprwb * Inv_LW; + pParam->B3SOIDDprwg = model->B3SOIDDprwg + + model->B3SOIDDlprwg * Inv_L + + model->B3SOIDDwprwg * Inv_W + + model->B3SOIDDpprwg * Inv_LW; + pParam->B3SOIDDwr = model->B3SOIDDwr + + model->B3SOIDDlwr * Inv_L + + model->B3SOIDDwwr * Inv_W + + model->B3SOIDDpwr * Inv_LW; + pParam->B3SOIDDnfactor = model->B3SOIDDnfactor + + model->B3SOIDDlnfactor * Inv_L + + model->B3SOIDDwnfactor * Inv_W + + model->B3SOIDDpnfactor * Inv_LW; + pParam->B3SOIDDdwg = model->B3SOIDDdwg + + model->B3SOIDDldwg * Inv_L + + model->B3SOIDDwdwg * Inv_W + + model->B3SOIDDpdwg * Inv_LW; + pParam->B3SOIDDdwb = model->B3SOIDDdwb + + model->B3SOIDDldwb * Inv_L + + model->B3SOIDDwdwb * Inv_W + + model->B3SOIDDpdwb * Inv_LW; + pParam->B3SOIDDvoff = model->B3SOIDDvoff + + model->B3SOIDDlvoff * Inv_L + + model->B3SOIDDwvoff * Inv_W + + model->B3SOIDDpvoff * Inv_LW; + pParam->B3SOIDDeta0 = model->B3SOIDDeta0 + + model->B3SOIDDleta0 * Inv_L + + model->B3SOIDDweta0 * Inv_W + + model->B3SOIDDpeta0 * Inv_LW; + pParam->B3SOIDDetab = model->B3SOIDDetab + + model->B3SOIDDletab * Inv_L + + model->B3SOIDDwetab * Inv_W + + model->B3SOIDDpetab * Inv_LW; + pParam->B3SOIDDdsub = model->B3SOIDDdsub + + model->B3SOIDDldsub * Inv_L + + model->B3SOIDDwdsub * Inv_W + + model->B3SOIDDpdsub * Inv_LW; + pParam->B3SOIDDcit = model->B3SOIDDcit + + model->B3SOIDDlcit * Inv_L + + model->B3SOIDDwcit * Inv_W + + model->B3SOIDDpcit * Inv_LW; + pParam->B3SOIDDcdsc = model->B3SOIDDcdsc + + model->B3SOIDDlcdsc * Inv_L + + model->B3SOIDDwcdsc * Inv_W + + model->B3SOIDDpcdsc * Inv_LW; + pParam->B3SOIDDcdscb = model->B3SOIDDcdscb + + model->B3SOIDDlcdscb * Inv_L + + model->B3SOIDDwcdscb * Inv_W + + model->B3SOIDDpcdscb * Inv_LW; + pParam->B3SOIDDcdscd = model->B3SOIDDcdscd + + model->B3SOIDDlcdscd * Inv_L + + model->B3SOIDDwcdscd * Inv_W + + model->B3SOIDDpcdscd * Inv_LW; + pParam->B3SOIDDpclm = model->B3SOIDDpclm + + model->B3SOIDDlpclm * Inv_L + + model->B3SOIDDwpclm * Inv_W + + model->B3SOIDDppclm * Inv_LW; + pParam->B3SOIDDpdibl1 = model->B3SOIDDpdibl1 + + model->B3SOIDDlpdibl1 * Inv_L + + model->B3SOIDDwpdibl1 * Inv_W + + model->B3SOIDDppdibl1 * Inv_LW; + pParam->B3SOIDDpdibl2 = model->B3SOIDDpdibl2 + + model->B3SOIDDlpdibl2 * Inv_L + + model->B3SOIDDwpdibl2 * Inv_W + + model->B3SOIDDppdibl2 * Inv_LW; + pParam->B3SOIDDpdiblb = model->B3SOIDDpdiblb + + model->B3SOIDDlpdiblb * Inv_L + + model->B3SOIDDwpdiblb * Inv_W + + model->B3SOIDDppdiblb * Inv_LW; + pParam->B3SOIDDdrout = model->B3SOIDDdrout + + model->B3SOIDDldrout * Inv_L + + model->B3SOIDDwdrout * Inv_W + + model->B3SOIDDpdrout * Inv_LW; + pParam->B3SOIDDpvag = model->B3SOIDDpvag + + model->B3SOIDDlpvag * Inv_L + + model->B3SOIDDwpvag * Inv_W + + model->B3SOIDDppvag * Inv_LW; + pParam->B3SOIDDdelta = model->B3SOIDDdelta + + model->B3SOIDDldelta * Inv_L + + model->B3SOIDDwdelta * Inv_W + + model->B3SOIDDpdelta * Inv_LW; + pParam->B3SOIDDaii = model->B3SOIDDaii + + model->B3SOIDDlaii * Inv_L + + model->B3SOIDDwaii * Inv_W + + model->B3SOIDDpaii * Inv_LW; + pParam->B3SOIDDbii = model->B3SOIDDbii + + model->B3SOIDDlbii * Inv_L + + model->B3SOIDDwbii * Inv_W + + model->B3SOIDDpbii * Inv_LW; + pParam->B3SOIDDcii = model->B3SOIDDcii + + model->B3SOIDDlcii * Inv_L + + model->B3SOIDDwcii * Inv_W + + model->B3SOIDDpcii * Inv_LW; + pParam->B3SOIDDdii = model->B3SOIDDdii + + model->B3SOIDDldii * Inv_L + + model->B3SOIDDwdii * Inv_W + + model->B3SOIDDpdii * Inv_LW; + pParam->B3SOIDDalpha0 = model->B3SOIDDalpha0 + + model->B3SOIDDlalpha0 * Inv_L + + model->B3SOIDDwalpha0 * Inv_W + + model->B3SOIDDpalpha0 * Inv_LW; + pParam->B3SOIDDalpha1 = model->B3SOIDDalpha1 + + model->B3SOIDDlalpha1 * Inv_L + + model->B3SOIDDwalpha1 * Inv_W + + model->B3SOIDDpalpha1 * Inv_LW; + pParam->B3SOIDDbeta0 = model->B3SOIDDbeta0 + + model->B3SOIDDlbeta0 * Inv_L + + model->B3SOIDDwbeta0 * Inv_W + + model->B3SOIDDpbeta0 * Inv_LW; + pParam->B3SOIDDagidl = model->B3SOIDDagidl + + model->B3SOIDDlagidl * Inv_L + + model->B3SOIDDwagidl * Inv_W + + model->B3SOIDDpagidl * Inv_LW; + pParam->B3SOIDDbgidl = model->B3SOIDDbgidl + + model->B3SOIDDlbgidl * Inv_L + + model->B3SOIDDwbgidl * Inv_W + + model->B3SOIDDpbgidl * Inv_LW; + pParam->B3SOIDDngidl = model->B3SOIDDngidl + + model->B3SOIDDlngidl * Inv_L + + model->B3SOIDDwngidl * Inv_W + + model->B3SOIDDpngidl * Inv_LW; + pParam->B3SOIDDntun = model->B3SOIDDntun + + model->B3SOIDDlntun * Inv_L + + model->B3SOIDDwntun * Inv_W + + model->B3SOIDDpntun * Inv_LW; + pParam->B3SOIDDndiode = model->B3SOIDDndiode + + model->B3SOIDDlndiode * Inv_L + + model->B3SOIDDwndiode * Inv_W + + model->B3SOIDDpndiode * Inv_LW; + pParam->B3SOIDDisbjt = model->B3SOIDDisbjt + + model->B3SOIDDlisbjt * Inv_L + + model->B3SOIDDwisbjt * Inv_W + + model->B3SOIDDpisbjt * Inv_LW; + pParam->B3SOIDDisdif = model->B3SOIDDisdif + + model->B3SOIDDlisdif * Inv_L + + model->B3SOIDDwisdif * Inv_W + + model->B3SOIDDpisdif * Inv_LW; + pParam->B3SOIDDisrec = model->B3SOIDDisrec + + model->B3SOIDDlisrec * Inv_L + + model->B3SOIDDwisrec * Inv_W + + model->B3SOIDDpisrec * Inv_LW; + pParam->B3SOIDDistun = model->B3SOIDDistun + + model->B3SOIDDlistun * Inv_L + + model->B3SOIDDwistun * Inv_W + + model->B3SOIDDpistun * Inv_LW; + pParam->B3SOIDDedl = model->B3SOIDDedl + + model->B3SOIDDledl * Inv_L + + model->B3SOIDDwedl * Inv_W + + model->B3SOIDDpedl * Inv_LW; + pParam->B3SOIDDkbjt1 = model->B3SOIDDkbjt1 + + model->B3SOIDDlkbjt1 * Inv_L + + model->B3SOIDDwkbjt1 * Inv_W + + model->B3SOIDDpkbjt1 * Inv_LW; + /* CV model */ + pParam->B3SOIDDvsdfb = model->B3SOIDDvsdfb + + model->B3SOIDDlvsdfb * Inv_L + + model->B3SOIDDwvsdfb * Inv_W + + model->B3SOIDDpvsdfb * Inv_LW; + pParam->B3SOIDDvsdth = model->B3SOIDDvsdth + + model->B3SOIDDlvsdth * Inv_L + + model->B3SOIDDwvsdth * Inv_W + + model->B3SOIDDpvsdth * Inv_LW; /* Added for binning - END */ - T0 = (TRatio - 1.0); + T0 = (TRatio - 1.0); pParam->B3SOIDDuatemp = pParam->B3SOIDDua; /* save ua, ub, and uc for b3soiddld.c */ pParam->B3SOIDDubtemp = pParam->B3SOIDDub; @@ -538,30 +538,30 @@ int Size_Not_Found; pParam->B3SOIDDcth = here->B3SOIDDcth0 * model->B3SOIDDtsi; pParam->B3SOIDDrbody = model->B3SOIDDrbody * pParam->B3SOIDDweff / pParam->B3SOIDDleff; - pParam->B3SOIDDua = pParam->B3SOIDDua + pParam->B3SOIDDua1 * T0; - pParam->B3SOIDDub = pParam->B3SOIDDub + pParam->B3SOIDDub1 * T0; - pParam->B3SOIDDuc = pParam->B3SOIDDuc + pParam->B3SOIDDuc1 * T0; - if (pParam->B3SOIDDu0 > 1.0) + pParam->B3SOIDDua = pParam->B3SOIDDua + pParam->B3SOIDDua1 * T0; + pParam->B3SOIDDub = pParam->B3SOIDDub + pParam->B3SOIDDub1 * T0; + pParam->B3SOIDDuc = pParam->B3SOIDDuc + pParam->B3SOIDDuc1 * T0; + if (pParam->B3SOIDDu0 > 1.0) pParam->B3SOIDDu0 = pParam->B3SOIDDu0 / 1.0e4; pParam->B3SOIDDu0temp = pParam->B3SOIDDu0 - * pow(TRatio, pParam->B3SOIDDute); - pParam->B3SOIDDvsattemp = pParam->B3SOIDDvsat - pParam->B3SOIDDat - * T0; - pParam->B3SOIDDrds0 = (pParam->B3SOIDDrdsw + pParam->B3SOIDDprt * T0) + * pow(TRatio, pParam->B3SOIDDute); + pParam->B3SOIDDvsattemp = pParam->B3SOIDDvsat - pParam->B3SOIDDat + * T0; + pParam->B3SOIDDrds0 = (pParam->B3SOIDDrdsw + pParam->B3SOIDDprt * T0) / pow(pParam->B3SOIDDweff * 1E6, pParam->B3SOIDDwr); - if (B3SOIDDcheckModel(model, here, ckt)) - { + if (B3SOIDDcheckModel(model, here, ckt)) + { SPfrontEnd->IFerrorf (ERR_FATAL, "Fatal error(s) detected during B3SOIDDV3 parameter checking for %s in model %s", model->B3SOIDDmodName, here->B3SOIDDname); - return(E_BADPARM); - } + return(E_BADPARM); + } pParam->B3SOIDDcgdo = (model->B3SOIDDcgdo + pParam->B3SOIDDcf) - * pParam->B3SOIDDweffCV; + * pParam->B3SOIDDweffCV; pParam->B3SOIDDcgso = (model->B3SOIDDcgso + pParam->B3SOIDDcf) - * pParam->B3SOIDDweffCV; + * pParam->B3SOIDDweffCV; pParam->B3SOIDDcgeo = model->B3SOIDDcgeo * pParam->B3SOIDDleffCV; @@ -599,7 +599,7 @@ int Size_Not_Found; pParam->B3SOIDDvsdfb = -model->B3SOIDDtype * (model->B3SOIDDvtm*log(-1e20 / pParam->B3SOIDDnsub) + 0.3); } - + /* Phi & Gamma */ SDphi = 2.0*model->B3SOIDDvtm*log(fabs(pParam->B3SOIDDnsub) / ni); SDgamma = 5.753e-12 * sqrt(fabs(pParam->B3SOIDDnsub)) / model->B3SOIDDcbox; @@ -610,14 +610,14 @@ int Size_Not_Found; ((pParam->B3SOIDDnsub < 0) && (model->B3SOIDDtype < 0)) ) pParam->B3SOIDDvsdth = pParam->B3SOIDDvsdfb + SDphi + SDgamma * sqrt(SDphi); - else + else pParam->B3SOIDDvsdth = pParam->B3SOIDDvsdfb - SDphi - SDgamma * sqrt(SDphi); } if (!model->B3SOIDDcsdminGiven) { /* Cdmin */ - tmp = sqrt(2.0 * EPSSI * SDphi / (Charge_q * + tmp = sqrt(2.0 * EPSSI * SDphi / (Charge_q * fabs(pParam->B3SOIDDnsub) * 1.0e6)); tmp1 = EPSSI / tmp; model->B3SOIDDcsdmin = tmp1 * model->B3SOIDDcbox / @@ -629,7 +629,7 @@ int Size_Not_Found; model->B3SOIDDtbox); T1 = here->B3SOIDDsourcePerimeter - pParam->B3SOIDDweff; if (T1 > 0.0) - pParam->B3SOIDDcsesw = T0 * T1; + pParam->B3SOIDDcsesw = T0 * T1; else pParam->B3SOIDDcsesw = 0.0; T1 = here->B3SOIDDdrainPerimeter - pParam->B3SOIDDweff; @@ -638,31 +638,31 @@ int Size_Not_Found; else pParam->B3SOIDDcdesw = 0.0; - pParam->B3SOIDDphi = 2.0 * model->B3SOIDDvtm - * log(pParam->B3SOIDDnpeak / ni); + pParam->B3SOIDDphi = 2.0 * model->B3SOIDDvtm + * log(pParam->B3SOIDDnpeak / ni); - pParam->B3SOIDDsqrtPhi = sqrt(pParam->B3SOIDDphi); - pParam->B3SOIDDphis3 = pParam->B3SOIDDsqrtPhi * pParam->B3SOIDDphi; + pParam->B3SOIDDsqrtPhi = sqrt(pParam->B3SOIDDphi); + pParam->B3SOIDDphis3 = pParam->B3SOIDDsqrtPhi * pParam->B3SOIDDphi; pParam->B3SOIDDXdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->B3SOIDDnpeak * 1.0e6)) - * pParam->B3SOIDDsqrtPhi; + * pParam->B3SOIDDnpeak * 1.0e6)) + * pParam->B3SOIDDsqrtPhi; pParam->B3SOIDDsqrtXdep0 = sqrt(pParam->B3SOIDDXdep0); pParam->B3SOIDDlitl = sqrt(3.0 * model->B3SOIDDxj - * model->B3SOIDDtox); + * model->B3SOIDDtox); pParam->B3SOIDDvbi = model->B3SOIDDvtm * log(1.0e20 - * pParam->B3SOIDDnpeak / (ni * ni)); + * pParam->B3SOIDDnpeak / (ni * ni)); pParam->B3SOIDDcdep0 = sqrt(Charge_q * EPSSI - * pParam->B3SOIDDnpeak * 1.0e6 / 2.0 - / pParam->B3SOIDDphi); - + * pParam->B3SOIDDnpeak * 1.0e6 / 2.0 + / pParam->B3SOIDDphi); + if (model->B3SOIDDk1Given || model->B3SOIDDk2Given) - { if (!model->B3SOIDDk1Given) - { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); + { if (!model->B3SOIDDk1Given) + { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); pParam->B3SOIDDk1 = 0.53; } if (!model->B3SOIDDk2Given) - { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); + { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); pParam->B3SOIDDk2 = -0.0186; } if (model->B3SOIDDxtGiven) @@ -677,73 +677,73 @@ int Size_Not_Found; fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); } else - { if (!model->B3SOIDDvbxGiven) - pParam->B3SOIDDvbx = pParam->B3SOIDDphi - 7.7348e-4 + { if (!model->B3SOIDDvbxGiven) + pParam->B3SOIDDvbx = pParam->B3SOIDDphi - 7.7348e-4 * pParam->B3SOIDDnpeak - * pParam->B3SOIDDxt * pParam->B3SOIDDxt; - if (pParam->B3SOIDDvbx > 0.0) - pParam->B3SOIDDvbx = -pParam->B3SOIDDvbx; - if (pParam->B3SOIDDvbm > 0.0) + * pParam->B3SOIDDxt * pParam->B3SOIDDxt; + if (pParam->B3SOIDDvbx > 0.0) + pParam->B3SOIDDvbx = -pParam->B3SOIDDvbx; + if (pParam->B3SOIDDvbm > 0.0) pParam->B3SOIDDvbm = -pParam->B3SOIDDvbm; - + if (!model->B3SOIDDgamma1Given) pParam->B3SOIDDgamma1 = 5.753e-12 - * sqrt(pParam->B3SOIDDnpeak) + * sqrt(pParam->B3SOIDDnpeak) / model->B3SOIDDcox; if (!model->B3SOIDDgamma2Given) pParam->B3SOIDDgamma2 = 5.753e-12 - * sqrt(pParam->B3SOIDDnsub) + * sqrt(pParam->B3SOIDDnsub) / model->B3SOIDDcox; T0 = pParam->B3SOIDDgamma1 - pParam->B3SOIDDgamma2; T1 = sqrt(pParam->B3SOIDDphi - pParam->B3SOIDDvbx) - - pParam->B3SOIDDsqrtPhi; + - pParam->B3SOIDDsqrtPhi; T2 = sqrt(pParam->B3SOIDDphi * (pParam->B3SOIDDphi - - pParam->B3SOIDDvbm)) - pParam->B3SOIDDphi; + - pParam->B3SOIDDvbm)) - pParam->B3SOIDDphi; pParam->B3SOIDDk2 = T0 * T1 / (2.0 * T2 + pParam->B3SOIDDvbm); pParam->B3SOIDDk1 = pParam->B3SOIDDgamma2 - 2.0 - * pParam->B3SOIDDk2 * sqrt(pParam->B3SOIDDphi - - pParam->B3SOIDDvbm); + * pParam->B3SOIDDk2 * sqrt(pParam->B3SOIDDphi + - pParam->B3SOIDDvbm); } - - if (pParam->B3SOIDDk2 < 0.0) - { T0 = 0.5 * pParam->B3SOIDDk1 / pParam->B3SOIDDk2; - pParam->B3SOIDDvbsc = 0.9 * (pParam->B3SOIDDphi - T0 * T0); - if (pParam->B3SOIDDvbsc > -3.0) - pParam->B3SOIDDvbsc = -3.0; - else if (pParam->B3SOIDDvbsc < -30.0) - pParam->B3SOIDDvbsc = -30.0; - } - else - { pParam->B3SOIDDvbsc = -30.0; - } - if (pParam->B3SOIDDvbsc > pParam->B3SOIDDvbm) - pParam->B3SOIDDvbsc = pParam->B3SOIDDvbm; - if (model->B3SOIDDvth0Given) - { pParam->B3SOIDDvfb = model->B3SOIDDtype * pParam->B3SOIDDvth0 - - pParam->B3SOIDDphi - pParam->B3SOIDDk1 + if (pParam->B3SOIDDk2 < 0.0) + { T0 = 0.5 * pParam->B3SOIDDk1 / pParam->B3SOIDDk2; + pParam->B3SOIDDvbsc = 0.9 * (pParam->B3SOIDDphi - T0 * T0); + if (pParam->B3SOIDDvbsc > -3.0) + pParam->B3SOIDDvbsc = -3.0; + else if (pParam->B3SOIDDvbsc < -30.0) + pParam->B3SOIDDvbsc = -30.0; + } + else + { pParam->B3SOIDDvbsc = -30.0; + } + if (pParam->B3SOIDDvbsc > pParam->B3SOIDDvbm) + pParam->B3SOIDDvbsc = pParam->B3SOIDDvbm; + + if (model->B3SOIDDvth0Given) + { pParam->B3SOIDDvfb = model->B3SOIDDtype * pParam->B3SOIDDvth0 + - pParam->B3SOIDDphi - pParam->B3SOIDDk1 * pParam->B3SOIDDsqrtPhi; - } - else - { pParam->B3SOIDDvfb = -1.0; - pParam->B3SOIDDvth0 = model->B3SOIDDtype * (pParam->B3SOIDDvfb - + pParam->B3SOIDDphi + pParam->B3SOIDDk1 + } + else + { pParam->B3SOIDDvfb = -1.0; + pParam->B3SOIDDvth0 = model->B3SOIDDtype * (pParam->B3SOIDDvfb + + pParam->B3SOIDDphi + pParam->B3SOIDDk1 * pParam->B3SOIDDsqrtPhi); - } + } T1 = sqrt(EPSSI / EPSOX * model->B3SOIDDtox - * pParam->B3SOIDDXdep0); + * pParam->B3SOIDDXdep0); T0 = exp(-0.5 * pParam->B3SOIDDdsub * pParam->B3SOIDDleff / T1); pParam->B3SOIDDtheta0vb0 = (T0 + 2.0 * T0 * T0); T0 = exp(-0.5 * pParam->B3SOIDDdrout * pParam->B3SOIDDleff / T1); T2 = (T0 + 2.0 * T0 * T0); pParam->B3SOIDDthetaRout = pParam->B3SOIDDpdibl1 * T2 - + pParam->B3SOIDDpdibl2; + + pParam->B3SOIDDpdibl2; here->B3SOIDDminIsub = 5.0e-2 * pParam->B3SOIDDweff * model->B3SOIDDtsi * MAX(pParam->B3SOIDDisdif, pParam->B3SOIDDisrec); - } + } here->B3SOIDDcsbox = model->B3SOIDDcbox*here->B3SOIDDsourceArea; here->B3SOIDDcsmin = model->B3SOIDDcsdmin*here->B3SOIDDsourceArea; @@ -751,7 +751,7 @@ int Size_Not_Found; here->B3SOIDDcdmin = model->B3SOIDDcsdmin*here->B3SOIDDdrainArea; if ( ((pParam->B3SOIDDnsub > 0) && (model->B3SOIDDtype > 0)) || - ((pParam->B3SOIDDnsub < 0) && (model->B3SOIDDtype < 0)) ) + ((pParam->B3SOIDDnsub < 0) && (model->B3SOIDDtype < 0)) ) { T0 = pParam->B3SOIDDvsdth - pParam->B3SOIDDvsdfb; pParam->B3SOIDDsdt1 = pParam->B3SOIDDvsdfb + model->B3SOIDDasd * T0; @@ -761,14 +761,14 @@ int Size_Not_Found; pParam->B3SOIDDst3 = T2 /( 1 - model->B3SOIDDasd); here->B3SOIDDst4 = T0 * T1 * (1 + model->B3SOIDDasd) / 3 - here->B3SOIDDcsmin * pParam->B3SOIDDvsdfb; - + T1 = here->B3SOIDDcdbox - here->B3SOIDDcdmin; T2 = T1 / T0 / T0; pParam->B3SOIDDdt2 = T2 / model->B3SOIDDasd; pParam->B3SOIDDdt3 = T2 /( 1 - model->B3SOIDDasd); here->B3SOIDDdt4 = T0 * T1 * (1 + model->B3SOIDDasd) / 3 - here->B3SOIDDcdmin * pParam->B3SOIDDvsdfb; - } else + } else { T0 = pParam->B3SOIDDvsdfb - pParam->B3SOIDDvsdth; pParam->B3SOIDDsdt1 = pParam->B3SOIDDvsdth + model->B3SOIDDasd * T0; @@ -778,34 +778,34 @@ int Size_Not_Found; pParam->B3SOIDDst3 = T2 /( 1 - model->B3SOIDDasd); here->B3SOIDDst4 = T0 * T1 * (1 + model->B3SOIDDasd) / 3 - here->B3SOIDDcsbox * pParam->B3SOIDDvsdth; - + T1 = here->B3SOIDDcdmin - here->B3SOIDDcdbox; T2 = T1 / T0 / T0; pParam->B3SOIDDdt2 = T2 / model->B3SOIDDasd; pParam->B3SOIDDdt3 = T2 /( 1 - model->B3SOIDDasd); here->B3SOIDDdt4 = T0 * T1 * (1 + model->B3SOIDDasd) / 3 - here->B3SOIDDcdbox * pParam->B3SOIDDvsdth; - } + } - here->B3SOIDDphi = pParam->B3SOIDDphi; + here->B3SOIDDphi = pParam->B3SOIDDphi; /* process source/drain series resistance */ - here->B3SOIDDdrainConductance = model->B3SOIDDsheetResistance - * here->B3SOIDDdrainSquares; + here->B3SOIDDdrainConductance = model->B3SOIDDsheetResistance + * here->B3SOIDDdrainSquares; if (here->B3SOIDDdrainConductance > 0.0) here->B3SOIDDdrainConductance = 1.0 - / here->B3SOIDDdrainConductance; - else + / here->B3SOIDDdrainConductance; + else here->B3SOIDDdrainConductance = 0.0; - - here->B3SOIDDsourceConductance = model->B3SOIDDsheetResistance - * here->B3SOIDDsourceSquares; - if (here->B3SOIDDsourceConductance > 0.0) + + here->B3SOIDDsourceConductance = model->B3SOIDDsheetResistance + * here->B3SOIDDsourceSquares; + if (here->B3SOIDDsourceConductance > 0.0) here->B3SOIDDsourceConductance = 1.0 - / here->B3SOIDDsourceConductance; - else + / here->B3SOIDDsourceConductance; + else here->B3SOIDDsourceConductance = 0.0; - here->B3SOIDDcgso = pParam->B3SOIDDcgso; - here->B3SOIDDcgdo = pParam->B3SOIDDcgdo; + here->B3SOIDDcgso = pParam->B3SOIDDcgso; + here->B3SOIDDcgdo = pParam->B3SOIDDcgdo; } } diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdtemp.c b/src/spicelib/devices/bsim3soi_fd/b3soifdtemp.c index 3fb6eae40..d589e4354 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdtemp.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdtemp.c @@ -7,7 +7,7 @@ Modified by Paolo Nenzi 2002 **********/ /* - * Revision 2.1 99/9/27 Pin Su + * Revision 2.1 99/9/27 Pin Su * BSIMFD2.1 release */ @@ -50,71 +50,71 @@ int Size_Not_Found; if (model->B3SOIFDGatesidewallJctPotential < 0.1) model->B3SOIFDGatesidewallJctPotential = 0.1; - struct b3soifdSizeDependParam *p = model->pSizeDependParamKnot; - while (p) { - struct b3soifdSizeDependParam *next_p = p->pNext; - FREE(p); - p = next_p; - } + struct b3soifdSizeDependParam *p = model->pSizeDependParamKnot; + while (p) { + struct b3soifdSizeDependParam *next_p = p->pNext; + FREE(p); + p = next_p; + } model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; + pLastKnot = NULL; - Tnom = model->B3SOIFDtnom; - TRatio = Temp / Tnom; + Tnom = model->B3SOIFDtnom; + TRatio = Temp / Tnom; - model->B3SOIFDvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); + 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->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) + 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 */ + /* MCJ: Length and Width not initialized */ for (here = B3SOIFDinstances(model); here != NULL; - here = B3SOIFDnextInstance(here)) - { - here->B3SOIFDrbodyext = here->B3SOIFDbodySquares * + here = B3SOIFDnextInstance(here)) + { + here->B3SOIFDrbodyext = here->B3SOIFDbodySquares * model->B3SOIFDrbsh; - pSizeDependParamKnot = model->pSizeDependParamKnot; + pSizeDependParamKnot = model->pSizeDependParamKnot; Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->B3SOIFDl == pSizeDependParamKnot->Length) - && (here->B3SOIFDw == pSizeDependParamKnot->Width) + 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; - } + here->pParam = pSizeDependParamKnot; + } + else + { pLastKnot = pSizeDependParamKnot; + pSizeDependParamKnot = pSizeDependParamKnot->pNext; + } } - if (Size_Not_Found) - { pParam = TMALLOC(struct b3soifdSizeDependParam, 1); + if (Size_Not_Found) + { pParam = TMALLOC(struct b3soifdSizeDependParam, 1); if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; + model->pSizeDependParamKnot = pParam; else - pLastKnot->pNext = pParam; + pLastKnot->pNext = pParam; pParam->pNext = NULL; here->pParam = pParam; - Ldrn = here->B3SOIFDl; - Wdrn = here->B3SOIFDw; + 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 @@ -131,7 +131,7 @@ int Size_Not_Found; pParam->B3SOIFDleff = here->B3SOIFDl - 2.0 * pParam->B3SOIFDdl; if (pParam->B3SOIFDleff <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "B3SOIFD: mosfet %s, model %s: Effective channel length <= 0", model->B3SOIFDmodName, here->B3SOIFDname); @@ -140,7 +140,7 @@ int Size_Not_Found; pParam->B3SOIFDweff = here->B3SOIFDw - 2.0 * pParam->B3SOIFDdw; if (pParam->B3SOIFDweff <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "B3SOIFD: mosfet %s, model %s: Effective channel width <= 0", model->B3SOIFDmodName, here->B3SOIFDname); @@ -149,7 +149,7 @@ int Size_Not_Found; pParam->B3SOIFDleffCV = here->B3SOIFDl - 2.0 * pParam->B3SOIFDdlc; if (pParam->B3SOIFDleffCV <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "B3SOIFD: mosfet %s, model %s: Effective channel length for C-V <= 0", model->B3SOIFDmodName, here->B3SOIFDname); @@ -158,7 +158,7 @@ int Size_Not_Found; pParam->B3SOIFDweffCV = here->B3SOIFDw - 2.0 * pParam->B3SOIFDdwc; if (pParam->B3SOIFDweffCV <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "B3SOIFD: mosfet %s, model %s: Effective channel width for C-V <= 0", model->B3SOIFDmodName, here->B3SOIFDname); @@ -182,351 +182,351 @@ int Size_Not_Found; 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; + /* 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); + / 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 - + model->B3SOIFDpw0 * Inv_LW; - pParam->B3SOIFDnlx = model->B3SOIFDnlx - + model->B3SOIFDlnlx * Inv_L - + model->B3SOIFDwnlx * Inv_W - + model->B3SOIFDpnlx * Inv_LW; - pParam->B3SOIFDdvt0 = model->B3SOIFDdvt0 - + model->B3SOIFDldvt0 * Inv_L - + model->B3SOIFDwdvt0 * Inv_W - + model->B3SOIFDpdvt0 * Inv_LW; - pParam->B3SOIFDdvt1 = model->B3SOIFDdvt1 - + model->B3SOIFDldvt1 * Inv_L - + model->B3SOIFDwdvt1 * Inv_W - + model->B3SOIFDpdvt1 * Inv_LW; - pParam->B3SOIFDdvt2 = model->B3SOIFDdvt2 - + model->B3SOIFDldvt2 * Inv_L - + model->B3SOIFDwdvt2 * Inv_W - + model->B3SOIFDpdvt2 * Inv_LW; - pParam->B3SOIFDdvt0w = model->B3SOIFDdvt0w - + model->B3SOIFDldvt0w * Inv_L - + model->B3SOIFDwdvt0w * Inv_W - + model->B3SOIFDpdvt0w * Inv_LW; - pParam->B3SOIFDdvt1w = model->B3SOIFDdvt1w - + model->B3SOIFDldvt1w * Inv_L - + model->B3SOIFDwdvt1w * Inv_W - + model->B3SOIFDpdvt1w * Inv_LW; - pParam->B3SOIFDdvt2w = model->B3SOIFDdvt2w - + model->B3SOIFDldvt2w * Inv_L - + model->B3SOIFDwdvt2w * Inv_W - + model->B3SOIFDpdvt2w * Inv_LW; - pParam->B3SOIFDu0 = model->B3SOIFDu0 - + model->B3SOIFDlu0 * Inv_L - + model->B3SOIFDwu0 * Inv_W - + model->B3SOIFDpu0 * Inv_LW; - pParam->B3SOIFDua = model->B3SOIFDua - + model->B3SOIFDlua * Inv_L - + model->B3SOIFDwua * Inv_W - + model->B3SOIFDpua * Inv_LW; - pParam->B3SOIFDub = model->B3SOIFDub - + model->B3SOIFDlub * Inv_L - + model->B3SOIFDwub * Inv_W - + model->B3SOIFDpub * Inv_LW; - pParam->B3SOIFDuc = model->B3SOIFDuc - + model->B3SOIFDluc * Inv_L - + model->B3SOIFDwuc * Inv_W - + model->B3SOIFDpuc * Inv_LW; - pParam->B3SOIFDvsat = model->B3SOIFDvsat - + model->B3SOIFDlvsat * Inv_L - + model->B3SOIFDwvsat * Inv_W - + model->B3SOIFDpvsat * Inv_LW; - pParam->B3SOIFDa0 = model->B3SOIFDa0 - + model->B3SOIFDla0 * Inv_L - + model->B3SOIFDwa0 * Inv_W - + model->B3SOIFDpa0 * Inv_LW; - pParam->B3SOIFDags = model->B3SOIFDags - + model->B3SOIFDlags * Inv_L - + model->B3SOIFDwags * Inv_W - + model->B3SOIFDpags * Inv_LW; - pParam->B3SOIFDb0 = model->B3SOIFDb0 - + model->B3SOIFDlb0 * Inv_L - + model->B3SOIFDwb0 * Inv_W - + model->B3SOIFDpb0 * Inv_LW; - pParam->B3SOIFDb1 = model->B3SOIFDb1 - + model->B3SOIFDlb1 * Inv_L - + model->B3SOIFDwb1 * Inv_W - + model->B3SOIFDpb1 * Inv_LW; - pParam->B3SOIFDketa = model->B3SOIFDketa - + model->B3SOIFDlketa * Inv_L - + model->B3SOIFDwketa * Inv_W - + model->B3SOIFDpketa * Inv_LW; - pParam->B3SOIFDabp = model->B3SOIFDabp - + model->B3SOIFDlabp * Inv_L - + model->B3SOIFDwabp * Inv_W - + model->B3SOIFDpabp * Inv_LW; - pParam->B3SOIFDmxc = model->B3SOIFDmxc - + model->B3SOIFDlmxc * Inv_L - + model->B3SOIFDwmxc * Inv_W - + model->B3SOIFDpmxc * Inv_LW; - pParam->B3SOIFDadice0 = model->B3SOIFDadice0 - + model->B3SOIFDladice0 * Inv_L - + model->B3SOIFDwadice0 * Inv_W - + model->B3SOIFDpadice0 * Inv_LW; - pParam->B3SOIFDa1 = model->B3SOIFDa1 - + model->B3SOIFDla1 * Inv_L - + model->B3SOIFDwa1 * Inv_W - + model->B3SOIFDpa1 * Inv_LW; - pParam->B3SOIFDa2 = model->B3SOIFDa2 - + model->B3SOIFDla2 * Inv_L - + model->B3SOIFDwa2 * Inv_W - + model->B3SOIFDpa2 * Inv_LW; - pParam->B3SOIFDrdsw = model->B3SOIFDrdsw - + model->B3SOIFDlrdsw * Inv_L - + model->B3SOIFDwrdsw * Inv_W - + model->B3SOIFDprdsw * Inv_LW; - pParam->B3SOIFDprwb = model->B3SOIFDprwb - + model->B3SOIFDlprwb * Inv_L - + model->B3SOIFDwprwb * Inv_W - + model->B3SOIFDpprwb * Inv_LW; - pParam->B3SOIFDprwg = model->B3SOIFDprwg - + model->B3SOIFDlprwg * Inv_L - + model->B3SOIFDwprwg * Inv_W - + model->B3SOIFDpprwg * Inv_LW; - pParam->B3SOIFDwr = model->B3SOIFDwr - + model->B3SOIFDlwr * Inv_L - + model->B3SOIFDwwr * Inv_W - + model->B3SOIFDpwr * Inv_LW; - pParam->B3SOIFDnfactor = model->B3SOIFDnfactor - + model->B3SOIFDlnfactor * Inv_L - + model->B3SOIFDwnfactor * Inv_W - + model->B3SOIFDpnfactor * Inv_LW; - pParam->B3SOIFDdwg = model->B3SOIFDdwg - + model->B3SOIFDldwg * Inv_L - + model->B3SOIFDwdwg * Inv_W - + model->B3SOIFDpdwg * Inv_LW; - pParam->B3SOIFDdwb = model->B3SOIFDdwb - + model->B3SOIFDldwb * Inv_L - + model->B3SOIFDwdwb * Inv_W - + model->B3SOIFDpdwb * Inv_LW; - pParam->B3SOIFDvoff = model->B3SOIFDvoff - + model->B3SOIFDlvoff * Inv_L - + model->B3SOIFDwvoff * Inv_W - + model->B3SOIFDpvoff * Inv_LW; - pParam->B3SOIFDeta0 = model->B3SOIFDeta0 - + model->B3SOIFDleta0 * Inv_L - + model->B3SOIFDweta0 * Inv_W - + model->B3SOIFDpeta0 * Inv_LW; - pParam->B3SOIFDetab = model->B3SOIFDetab - + model->B3SOIFDletab * Inv_L - + model->B3SOIFDwetab * Inv_W - + model->B3SOIFDpetab * Inv_LW; - pParam->B3SOIFDdsub = model->B3SOIFDdsub - + model->B3SOIFDldsub * Inv_L - + model->B3SOIFDwdsub * Inv_W - + model->B3SOIFDpdsub * Inv_LW; - pParam->B3SOIFDcit = model->B3SOIFDcit - + model->B3SOIFDlcit * Inv_L - + model->B3SOIFDwcit * Inv_W - + model->B3SOIFDpcit * Inv_LW; - pParam->B3SOIFDcdsc = model->B3SOIFDcdsc - + model->B3SOIFDlcdsc * Inv_L - + model->B3SOIFDwcdsc * Inv_W - + model->B3SOIFDpcdsc * Inv_LW; - pParam->B3SOIFDcdscb = model->B3SOIFDcdscb - + model->B3SOIFDlcdscb * Inv_L - + model->B3SOIFDwcdscb * Inv_W - + model->B3SOIFDpcdscb * Inv_LW; - pParam->B3SOIFDcdscd = model->B3SOIFDcdscd - + model->B3SOIFDlcdscd * Inv_L - + model->B3SOIFDwcdscd * Inv_W - + model->B3SOIFDpcdscd * Inv_LW; - pParam->B3SOIFDpclm = model->B3SOIFDpclm - + model->B3SOIFDlpclm * Inv_L - + model->B3SOIFDwpclm * Inv_W - + model->B3SOIFDppclm * Inv_LW; - pParam->B3SOIFDpdibl1 = model->B3SOIFDpdibl1 - + model->B3SOIFDlpdibl1 * Inv_L - + model->B3SOIFDwpdibl1 * Inv_W - + model->B3SOIFDppdibl1 * Inv_LW; - pParam->B3SOIFDpdibl2 = model->B3SOIFDpdibl2 - + model->B3SOIFDlpdibl2 * Inv_L - + model->B3SOIFDwpdibl2 * Inv_W - + model->B3SOIFDppdibl2 * Inv_LW; - pParam->B3SOIFDpdiblb = model->B3SOIFDpdiblb - + model->B3SOIFDlpdiblb * Inv_L - + model->B3SOIFDwpdiblb * Inv_W - + model->B3SOIFDppdiblb * Inv_LW; - pParam->B3SOIFDdrout = model->B3SOIFDdrout - + model->B3SOIFDldrout * Inv_L - + model->B3SOIFDwdrout * Inv_W - + model->B3SOIFDpdrout * Inv_LW; - pParam->B3SOIFDpvag = model->B3SOIFDpvag - + model->B3SOIFDlpvag * Inv_L - + model->B3SOIFDwpvag * Inv_W - + model->B3SOIFDppvag * Inv_LW; - pParam->B3SOIFDdelta = model->B3SOIFDdelta - + model->B3SOIFDldelta * Inv_L - + model->B3SOIFDwdelta * Inv_W - + model->B3SOIFDpdelta * Inv_LW; - pParam->B3SOIFDaii = model->B3SOIFDaii - + model->B3SOIFDlaii * Inv_L - + model->B3SOIFDwaii * Inv_W - + model->B3SOIFDpaii * Inv_LW; - pParam->B3SOIFDbii = model->B3SOIFDbii - + model->B3SOIFDlbii * Inv_L - + model->B3SOIFDwbii * Inv_W - + model->B3SOIFDpbii * Inv_LW; - pParam->B3SOIFDcii = model->B3SOIFDcii - + model->B3SOIFDlcii * Inv_L - + model->B3SOIFDwcii * Inv_W - + model->B3SOIFDpcii * Inv_LW; - pParam->B3SOIFDdii = model->B3SOIFDdii - + model->B3SOIFDldii * Inv_L - + model->B3SOIFDwdii * Inv_W - + model->B3SOIFDpdii * Inv_LW; - pParam->B3SOIFDalpha0 = model->B3SOIFDalpha0 - + model->B3SOIFDlalpha0 * Inv_L - + model->B3SOIFDwalpha0 * Inv_W - + model->B3SOIFDpalpha0 * Inv_LW; - pParam->B3SOIFDalpha1 = model->B3SOIFDalpha1 - + model->B3SOIFDlalpha1 * Inv_L - + model->B3SOIFDwalpha1 * Inv_W - + model->B3SOIFDpalpha1 * Inv_LW; - pParam->B3SOIFDbeta0 = model->B3SOIFDbeta0 - + model->B3SOIFDlbeta0 * Inv_L - + model->B3SOIFDwbeta0 * Inv_W - + model->B3SOIFDpbeta0 * Inv_LW; - pParam->B3SOIFDagidl = model->B3SOIFDagidl - + model->B3SOIFDlagidl * Inv_L - + model->B3SOIFDwagidl * Inv_W - + model->B3SOIFDpagidl * Inv_LW; - pParam->B3SOIFDbgidl = model->B3SOIFDbgidl - + model->B3SOIFDlbgidl * Inv_L - + model->B3SOIFDwbgidl * Inv_W - + model->B3SOIFDpbgidl * Inv_LW; - pParam->B3SOIFDngidl = model->B3SOIFDngidl - + model->B3SOIFDlngidl * Inv_L - + model->B3SOIFDwngidl * Inv_W - + model->B3SOIFDpngidl * Inv_LW; - pParam->B3SOIFDntun = model->B3SOIFDntun - + model->B3SOIFDlntun * Inv_L - + model->B3SOIFDwntun * Inv_W - + model->B3SOIFDpntun * Inv_LW; - pParam->B3SOIFDndiode = model->B3SOIFDndiode - + model->B3SOIFDlndiode * Inv_L - + model->B3SOIFDwndiode * Inv_W - + model->B3SOIFDpndiode * Inv_LW; - pParam->B3SOIFDisbjt = model->B3SOIFDisbjt - + model->B3SOIFDlisbjt * Inv_L - + model->B3SOIFDwisbjt * Inv_W - + model->B3SOIFDpisbjt * Inv_LW; - pParam->B3SOIFDisdif = model->B3SOIFDisdif - + model->B3SOIFDlisdif * Inv_L - + model->B3SOIFDwisdif * Inv_W - + model->B3SOIFDpisdif * Inv_LW; - pParam->B3SOIFDisrec = model->B3SOIFDisrec - + model->B3SOIFDlisrec * Inv_L - + model->B3SOIFDwisrec * Inv_W - + model->B3SOIFDpisrec * Inv_LW; - pParam->B3SOIFDistun = model->B3SOIFDistun - + model->B3SOIFDlistun * Inv_L - + model->B3SOIFDwistun * Inv_W - + model->B3SOIFDpistun * Inv_LW; - pParam->B3SOIFDedl = model->B3SOIFDedl - + model->B3SOIFDledl * Inv_L - + model->B3SOIFDwedl * Inv_W - + model->B3SOIFDpedl * Inv_LW; - pParam->B3SOIFDkbjt1 = model->B3SOIFDkbjt1 - + model->B3SOIFDlkbjt1 * Inv_L - + model->B3SOIFDwkbjt1 * Inv_W - + model->B3SOIFDpkbjt1 * Inv_LW; - /* CV model */ - pParam->B3SOIFDvsdfb = model->B3SOIFDvsdfb - + model->B3SOIFDlvsdfb * Inv_L - + model->B3SOIFDwvsdfb * Inv_W - + model->B3SOIFDpvsdfb * Inv_LW; - pParam->B3SOIFDvsdth = model->B3SOIFDvsdth - + model->B3SOIFDlvsdth * Inv_L - + model->B3SOIFDwvsdth * Inv_W - + model->B3SOIFDpvsdth * Inv_LW; + 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 + + model->B3SOIFDpw0 * Inv_LW; + pParam->B3SOIFDnlx = model->B3SOIFDnlx + + model->B3SOIFDlnlx * Inv_L + + model->B3SOIFDwnlx * Inv_W + + model->B3SOIFDpnlx * Inv_LW; + pParam->B3SOIFDdvt0 = model->B3SOIFDdvt0 + + model->B3SOIFDldvt0 * Inv_L + + model->B3SOIFDwdvt0 * Inv_W + + model->B3SOIFDpdvt0 * Inv_LW; + pParam->B3SOIFDdvt1 = model->B3SOIFDdvt1 + + model->B3SOIFDldvt1 * Inv_L + + model->B3SOIFDwdvt1 * Inv_W + + model->B3SOIFDpdvt1 * Inv_LW; + pParam->B3SOIFDdvt2 = model->B3SOIFDdvt2 + + model->B3SOIFDldvt2 * Inv_L + + model->B3SOIFDwdvt2 * Inv_W + + model->B3SOIFDpdvt2 * Inv_LW; + pParam->B3SOIFDdvt0w = model->B3SOIFDdvt0w + + model->B3SOIFDldvt0w * Inv_L + + model->B3SOIFDwdvt0w * Inv_W + + model->B3SOIFDpdvt0w * Inv_LW; + pParam->B3SOIFDdvt1w = model->B3SOIFDdvt1w + + model->B3SOIFDldvt1w * Inv_L + + model->B3SOIFDwdvt1w * Inv_W + + model->B3SOIFDpdvt1w * Inv_LW; + pParam->B3SOIFDdvt2w = model->B3SOIFDdvt2w + + model->B3SOIFDldvt2w * Inv_L + + model->B3SOIFDwdvt2w * Inv_W + + model->B3SOIFDpdvt2w * Inv_LW; + pParam->B3SOIFDu0 = model->B3SOIFDu0 + + model->B3SOIFDlu0 * Inv_L + + model->B3SOIFDwu0 * Inv_W + + model->B3SOIFDpu0 * Inv_LW; + pParam->B3SOIFDua = model->B3SOIFDua + + model->B3SOIFDlua * Inv_L + + model->B3SOIFDwua * Inv_W + + model->B3SOIFDpua * Inv_LW; + pParam->B3SOIFDub = model->B3SOIFDub + + model->B3SOIFDlub * Inv_L + + model->B3SOIFDwub * Inv_W + + model->B3SOIFDpub * Inv_LW; + pParam->B3SOIFDuc = model->B3SOIFDuc + + model->B3SOIFDluc * Inv_L + + model->B3SOIFDwuc * Inv_W + + model->B3SOIFDpuc * Inv_LW; + pParam->B3SOIFDvsat = model->B3SOIFDvsat + + model->B3SOIFDlvsat * Inv_L + + model->B3SOIFDwvsat * Inv_W + + model->B3SOIFDpvsat * Inv_LW; + pParam->B3SOIFDa0 = model->B3SOIFDa0 + + model->B3SOIFDla0 * Inv_L + + model->B3SOIFDwa0 * Inv_W + + model->B3SOIFDpa0 * Inv_LW; + pParam->B3SOIFDags = model->B3SOIFDags + + model->B3SOIFDlags * Inv_L + + model->B3SOIFDwags * Inv_W + + model->B3SOIFDpags * Inv_LW; + pParam->B3SOIFDb0 = model->B3SOIFDb0 + + model->B3SOIFDlb0 * Inv_L + + model->B3SOIFDwb0 * Inv_W + + model->B3SOIFDpb0 * Inv_LW; + pParam->B3SOIFDb1 = model->B3SOIFDb1 + + model->B3SOIFDlb1 * Inv_L + + model->B3SOIFDwb1 * Inv_W + + model->B3SOIFDpb1 * Inv_LW; + pParam->B3SOIFDketa = model->B3SOIFDketa + + model->B3SOIFDlketa * Inv_L + + model->B3SOIFDwketa * Inv_W + + model->B3SOIFDpketa * Inv_LW; + pParam->B3SOIFDabp = model->B3SOIFDabp + + model->B3SOIFDlabp * Inv_L + + model->B3SOIFDwabp * Inv_W + + model->B3SOIFDpabp * Inv_LW; + pParam->B3SOIFDmxc = model->B3SOIFDmxc + + model->B3SOIFDlmxc * Inv_L + + model->B3SOIFDwmxc * Inv_W + + model->B3SOIFDpmxc * Inv_LW; + pParam->B3SOIFDadice0 = model->B3SOIFDadice0 + + model->B3SOIFDladice0 * Inv_L + + model->B3SOIFDwadice0 * Inv_W + + model->B3SOIFDpadice0 * Inv_LW; + pParam->B3SOIFDa1 = model->B3SOIFDa1 + + model->B3SOIFDla1 * Inv_L + + model->B3SOIFDwa1 * Inv_W + + model->B3SOIFDpa1 * Inv_LW; + pParam->B3SOIFDa2 = model->B3SOIFDa2 + + model->B3SOIFDla2 * Inv_L + + model->B3SOIFDwa2 * Inv_W + + model->B3SOIFDpa2 * Inv_LW; + pParam->B3SOIFDrdsw = model->B3SOIFDrdsw + + model->B3SOIFDlrdsw * Inv_L + + model->B3SOIFDwrdsw * Inv_W + + model->B3SOIFDprdsw * Inv_LW; + pParam->B3SOIFDprwb = model->B3SOIFDprwb + + model->B3SOIFDlprwb * Inv_L + + model->B3SOIFDwprwb * Inv_W + + model->B3SOIFDpprwb * Inv_LW; + pParam->B3SOIFDprwg = model->B3SOIFDprwg + + model->B3SOIFDlprwg * Inv_L + + model->B3SOIFDwprwg * Inv_W + + model->B3SOIFDpprwg * Inv_LW; + pParam->B3SOIFDwr = model->B3SOIFDwr + + model->B3SOIFDlwr * Inv_L + + model->B3SOIFDwwr * Inv_W + + model->B3SOIFDpwr * Inv_LW; + pParam->B3SOIFDnfactor = model->B3SOIFDnfactor + + model->B3SOIFDlnfactor * Inv_L + + model->B3SOIFDwnfactor * Inv_W + + model->B3SOIFDpnfactor * Inv_LW; + pParam->B3SOIFDdwg = model->B3SOIFDdwg + + model->B3SOIFDldwg * Inv_L + + model->B3SOIFDwdwg * Inv_W + + model->B3SOIFDpdwg * Inv_LW; + pParam->B3SOIFDdwb = model->B3SOIFDdwb + + model->B3SOIFDldwb * Inv_L + + model->B3SOIFDwdwb * Inv_W + + model->B3SOIFDpdwb * Inv_LW; + pParam->B3SOIFDvoff = model->B3SOIFDvoff + + model->B3SOIFDlvoff * Inv_L + + model->B3SOIFDwvoff * Inv_W + + model->B3SOIFDpvoff * Inv_LW; + pParam->B3SOIFDeta0 = model->B3SOIFDeta0 + + model->B3SOIFDleta0 * Inv_L + + model->B3SOIFDweta0 * Inv_W + + model->B3SOIFDpeta0 * Inv_LW; + pParam->B3SOIFDetab = model->B3SOIFDetab + + model->B3SOIFDletab * Inv_L + + model->B3SOIFDwetab * Inv_W + + model->B3SOIFDpetab * Inv_LW; + pParam->B3SOIFDdsub = model->B3SOIFDdsub + + model->B3SOIFDldsub * Inv_L + + model->B3SOIFDwdsub * Inv_W + + model->B3SOIFDpdsub * Inv_LW; + pParam->B3SOIFDcit = model->B3SOIFDcit + + model->B3SOIFDlcit * Inv_L + + model->B3SOIFDwcit * Inv_W + + model->B3SOIFDpcit * Inv_LW; + pParam->B3SOIFDcdsc = model->B3SOIFDcdsc + + model->B3SOIFDlcdsc * Inv_L + + model->B3SOIFDwcdsc * Inv_W + + model->B3SOIFDpcdsc * Inv_LW; + pParam->B3SOIFDcdscb = model->B3SOIFDcdscb + + model->B3SOIFDlcdscb * Inv_L + + model->B3SOIFDwcdscb * Inv_W + + model->B3SOIFDpcdscb * Inv_LW; + pParam->B3SOIFDcdscd = model->B3SOIFDcdscd + + model->B3SOIFDlcdscd * Inv_L + + model->B3SOIFDwcdscd * Inv_W + + model->B3SOIFDpcdscd * Inv_LW; + pParam->B3SOIFDpclm = model->B3SOIFDpclm + + model->B3SOIFDlpclm * Inv_L + + model->B3SOIFDwpclm * Inv_W + + model->B3SOIFDppclm * Inv_LW; + pParam->B3SOIFDpdibl1 = model->B3SOIFDpdibl1 + + model->B3SOIFDlpdibl1 * Inv_L + + model->B3SOIFDwpdibl1 * Inv_W + + model->B3SOIFDppdibl1 * Inv_LW; + pParam->B3SOIFDpdibl2 = model->B3SOIFDpdibl2 + + model->B3SOIFDlpdibl2 * Inv_L + + model->B3SOIFDwpdibl2 * Inv_W + + model->B3SOIFDppdibl2 * Inv_LW; + pParam->B3SOIFDpdiblb = model->B3SOIFDpdiblb + + model->B3SOIFDlpdiblb * Inv_L + + model->B3SOIFDwpdiblb * Inv_W + + model->B3SOIFDppdiblb * Inv_LW; + pParam->B3SOIFDdrout = model->B3SOIFDdrout + + model->B3SOIFDldrout * Inv_L + + model->B3SOIFDwdrout * Inv_W + + model->B3SOIFDpdrout * Inv_LW; + pParam->B3SOIFDpvag = model->B3SOIFDpvag + + model->B3SOIFDlpvag * Inv_L + + model->B3SOIFDwpvag * Inv_W + + model->B3SOIFDppvag * Inv_LW; + pParam->B3SOIFDdelta = model->B3SOIFDdelta + + model->B3SOIFDldelta * Inv_L + + model->B3SOIFDwdelta * Inv_W + + model->B3SOIFDpdelta * Inv_LW; + pParam->B3SOIFDaii = model->B3SOIFDaii + + model->B3SOIFDlaii * Inv_L + + model->B3SOIFDwaii * Inv_W + + model->B3SOIFDpaii * Inv_LW; + pParam->B3SOIFDbii = model->B3SOIFDbii + + model->B3SOIFDlbii * Inv_L + + model->B3SOIFDwbii * Inv_W + + model->B3SOIFDpbii * Inv_LW; + pParam->B3SOIFDcii = model->B3SOIFDcii + + model->B3SOIFDlcii * Inv_L + + model->B3SOIFDwcii * Inv_W + + model->B3SOIFDpcii * Inv_LW; + pParam->B3SOIFDdii = model->B3SOIFDdii + + model->B3SOIFDldii * Inv_L + + model->B3SOIFDwdii * Inv_W + + model->B3SOIFDpdii * Inv_LW; + pParam->B3SOIFDalpha0 = model->B3SOIFDalpha0 + + model->B3SOIFDlalpha0 * Inv_L + + model->B3SOIFDwalpha0 * Inv_W + + model->B3SOIFDpalpha0 * Inv_LW; + pParam->B3SOIFDalpha1 = model->B3SOIFDalpha1 + + model->B3SOIFDlalpha1 * Inv_L + + model->B3SOIFDwalpha1 * Inv_W + + model->B3SOIFDpalpha1 * Inv_LW; + pParam->B3SOIFDbeta0 = model->B3SOIFDbeta0 + + model->B3SOIFDlbeta0 * Inv_L + + model->B3SOIFDwbeta0 * Inv_W + + model->B3SOIFDpbeta0 * Inv_LW; + pParam->B3SOIFDagidl = model->B3SOIFDagidl + + model->B3SOIFDlagidl * Inv_L + + model->B3SOIFDwagidl * Inv_W + + model->B3SOIFDpagidl * Inv_LW; + pParam->B3SOIFDbgidl = model->B3SOIFDbgidl + + model->B3SOIFDlbgidl * Inv_L + + model->B3SOIFDwbgidl * Inv_W + + model->B3SOIFDpbgidl * Inv_LW; + pParam->B3SOIFDngidl = model->B3SOIFDngidl + + model->B3SOIFDlngidl * Inv_L + + model->B3SOIFDwngidl * Inv_W + + model->B3SOIFDpngidl * Inv_LW; + pParam->B3SOIFDntun = model->B3SOIFDntun + + model->B3SOIFDlntun * Inv_L + + model->B3SOIFDwntun * Inv_W + + model->B3SOIFDpntun * Inv_LW; + pParam->B3SOIFDndiode = model->B3SOIFDndiode + + model->B3SOIFDlndiode * Inv_L + + model->B3SOIFDwndiode * Inv_W + + model->B3SOIFDpndiode * Inv_LW; + pParam->B3SOIFDisbjt = model->B3SOIFDisbjt + + model->B3SOIFDlisbjt * Inv_L + + model->B3SOIFDwisbjt * Inv_W + + model->B3SOIFDpisbjt * Inv_LW; + pParam->B3SOIFDisdif = model->B3SOIFDisdif + + model->B3SOIFDlisdif * Inv_L + + model->B3SOIFDwisdif * Inv_W + + model->B3SOIFDpisdif * Inv_LW; + pParam->B3SOIFDisrec = model->B3SOIFDisrec + + model->B3SOIFDlisrec * Inv_L + + model->B3SOIFDwisrec * Inv_W + + model->B3SOIFDpisrec * Inv_LW; + pParam->B3SOIFDistun = model->B3SOIFDistun + + model->B3SOIFDlistun * Inv_L + + model->B3SOIFDwistun * Inv_W + + model->B3SOIFDpistun * Inv_LW; + pParam->B3SOIFDedl = model->B3SOIFDedl + + model->B3SOIFDledl * Inv_L + + model->B3SOIFDwedl * Inv_W + + model->B3SOIFDpedl * Inv_LW; + pParam->B3SOIFDkbjt1 = model->B3SOIFDkbjt1 + + model->B3SOIFDlkbjt1 * Inv_L + + model->B3SOIFDwkbjt1 * Inv_W + + model->B3SOIFDpkbjt1 * Inv_LW; + /* CV model */ + pParam->B3SOIFDvsdfb = model->B3SOIFDvsdfb + + model->B3SOIFDlvsdfb * Inv_L + + model->B3SOIFDwvsdfb * Inv_W + + model->B3SOIFDpvsdfb * Inv_LW; + pParam->B3SOIFDvsdth = model->B3SOIFDvsdth + + model->B3SOIFDlvsdth * Inv_L + + model->B3SOIFDwvsdth * Inv_W + + model->B3SOIFDpvsdth * Inv_LW; /* Added for binning - END */ - T0 = (TRatio - 1.0); + T0 = (TRatio - 1.0); pParam->B3SOIFDuatemp = pParam->B3SOIFDua; /* save ua, ub, and uc for b3soifdld.c */ pParam->B3SOIFDubtemp = pParam->B3SOIFDub; @@ -537,30 +537,30 @@ int Size_Not_Found; pParam->B3SOIFDcth = here->B3SOIFDcth0 * model->B3SOIFDtsi; pParam->B3SOIFDrbody = model->B3SOIFDrbody * pParam->B3SOIFDweff / pParam->B3SOIFDleff; - pParam->B3SOIFDua = pParam->B3SOIFDua + pParam->B3SOIFDua1 * T0; - pParam->B3SOIFDub = pParam->B3SOIFDub + pParam->B3SOIFDub1 * T0; - pParam->B3SOIFDuc = pParam->B3SOIFDuc + pParam->B3SOIFDuc1 * T0; - if (pParam->B3SOIFDu0 > 1.0) + pParam->B3SOIFDua = pParam->B3SOIFDua + pParam->B3SOIFDua1 * T0; + pParam->B3SOIFDub = pParam->B3SOIFDub + pParam->B3SOIFDub1 * T0; + pParam->B3SOIFDuc = pParam->B3SOIFDuc + pParam->B3SOIFDuc1 * T0; + if (pParam->B3SOIFDu0 > 1.0) pParam->B3SOIFDu0 = pParam->B3SOIFDu0 / 1.0e4; pParam->B3SOIFDu0temp = pParam->B3SOIFDu0 - * pow(TRatio, pParam->B3SOIFDute); - pParam->B3SOIFDvsattemp = pParam->B3SOIFDvsat - pParam->B3SOIFDat - * T0; - pParam->B3SOIFDrds0 = (pParam->B3SOIFDrdsw + pParam->B3SOIFDprt * T0) + * pow(TRatio, pParam->B3SOIFDute); + pParam->B3SOIFDvsattemp = pParam->B3SOIFDvsat - pParam->B3SOIFDat + * T0; + pParam->B3SOIFDrds0 = (pParam->B3SOIFDrdsw + pParam->B3SOIFDprt * T0) / pow(pParam->B3SOIFDweff * 1E6, pParam->B3SOIFDwr); - if (B3SOIFDcheckModel(model, here, ckt)) - { + if (B3SOIFDcheckModel(model, here, ckt)) + { SPfrontEnd->IFerrorf (ERR_FATAL, "Fatal error(s) detected during B3SOIFDV3 parameter checking for %s in model %s", model->B3SOIFDmodName, here->B3SOIFDname); - return(E_BADPARM); - } + return(E_BADPARM); + } pParam->B3SOIFDcgdo = (model->B3SOIFDcgdo + pParam->B3SOIFDcf) - * pParam->B3SOIFDweffCV; + * pParam->B3SOIFDweffCV; pParam->B3SOIFDcgso = (model->B3SOIFDcgso + pParam->B3SOIFDcf) - * pParam->B3SOIFDweffCV; + * pParam->B3SOIFDweffCV; pParam->B3SOIFDcgeo = model->B3SOIFDcgeo * pParam->B3SOIFDleffCV; @@ -599,7 +599,7 @@ int Size_Not_Found; pParam->B3SOIFDvsdfb = -model->B3SOIFDtype * (model->B3SOIFDvtm*log(-1e20 / pParam->B3SOIFDnsub) + 0.3); } - + /* Phi & Gamma */ SDphi = 2.0*model->B3SOIFDvtm*log(fabs(pParam->B3SOIFDnsub) / ni); SDgamma = 5.753e-12 * sqrt(fabs(pParam->B3SOIFDnsub)) / model->B3SOIFDcbox; @@ -610,14 +610,14 @@ int Size_Not_Found; ((pParam->B3SOIFDnsub < 0) && (model->B3SOIFDtype < 0)) ) pParam->B3SOIFDvsdth = pParam->B3SOIFDvsdfb + SDphi + SDgamma * sqrt(SDphi); - else + else pParam->B3SOIFDvsdth = pParam->B3SOIFDvsdfb - SDphi - SDgamma * sqrt(SDphi); } if (!model->B3SOIFDcsdminGiven) { /* Cdmin */ - tmp = sqrt(2.0 * EPSSI * SDphi / (Charge_q * + tmp = sqrt(2.0 * EPSSI * SDphi / (Charge_q * fabs(pParam->B3SOIFDnsub) * 1.0e6)); tmp1 = EPSSI / tmp; model->B3SOIFDcsdmin = tmp1 * model->B3SOIFDcbox / @@ -628,7 +628,7 @@ int Size_Not_Found; model->B3SOIFDtbox); T1 = here->B3SOIFDsourcePerimeter - pParam->B3SOIFDweff; if (T1 > 0.0) - pParam->B3SOIFDcsesw = T0 * T1; + pParam->B3SOIFDcsesw = T0 * T1; else pParam->B3SOIFDcsesw = 0.0; T1 = here->B3SOIFDdrainPerimeter - pParam->B3SOIFDweff; @@ -637,31 +637,31 @@ int Size_Not_Found; else pParam->B3SOIFDcdesw = 0.0; - pParam->B3SOIFDphi = 2.0 * model->B3SOIFDvtm - * log(pParam->B3SOIFDnpeak / ni); + pParam->B3SOIFDphi = 2.0 * model->B3SOIFDvtm + * log(pParam->B3SOIFDnpeak / ni); - pParam->B3SOIFDsqrtPhi = sqrt(pParam->B3SOIFDphi); - pParam->B3SOIFDphis3 = pParam->B3SOIFDsqrtPhi * pParam->B3SOIFDphi; + pParam->B3SOIFDsqrtPhi = sqrt(pParam->B3SOIFDphi); + pParam->B3SOIFDphis3 = pParam->B3SOIFDsqrtPhi * pParam->B3SOIFDphi; pParam->B3SOIFDXdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->B3SOIFDnpeak * 1.0e6)) - * pParam->B3SOIFDsqrtPhi; + * pParam->B3SOIFDnpeak * 1.0e6)) + * pParam->B3SOIFDsqrtPhi; pParam->B3SOIFDsqrtXdep0 = sqrt(pParam->B3SOIFDXdep0); pParam->B3SOIFDlitl = sqrt(3.0 * model->B3SOIFDxj - * model->B3SOIFDtox); + * model->B3SOIFDtox); pParam->B3SOIFDvbi = model->B3SOIFDvtm * log(1.0e20 - * pParam->B3SOIFDnpeak / (ni * ni)); + * pParam->B3SOIFDnpeak / (ni * ni)); pParam->B3SOIFDcdep0 = sqrt(Charge_q * EPSSI - * pParam->B3SOIFDnpeak * 1.0e6 / 2.0 - / pParam->B3SOIFDphi); - + * pParam->B3SOIFDnpeak * 1.0e6 / 2.0 + / pParam->B3SOIFDphi); + if (model->B3SOIFDk1Given || model->B3SOIFDk2Given) - { if (!model->B3SOIFDk1Given) - { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); + { if (!model->B3SOIFDk1Given) + { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); pParam->B3SOIFDk1 = 0.53; } if (!model->B3SOIFDk2Given) - { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); + { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); pParam->B3SOIFDk2 = -0.0186; } if (model->B3SOIFDxtGiven) @@ -676,73 +676,73 @@ int Size_Not_Found; fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); } else - { if (!model->B3SOIFDvbxGiven) - pParam->B3SOIFDvbx = pParam->B3SOIFDphi - 7.7348e-4 + { if (!model->B3SOIFDvbxGiven) + pParam->B3SOIFDvbx = pParam->B3SOIFDphi - 7.7348e-4 * pParam->B3SOIFDnpeak - * pParam->B3SOIFDxt * pParam->B3SOIFDxt; - if (pParam->B3SOIFDvbx > 0.0) - pParam->B3SOIFDvbx = -pParam->B3SOIFDvbx; - if (pParam->B3SOIFDvbm > 0.0) + * pParam->B3SOIFDxt * pParam->B3SOIFDxt; + if (pParam->B3SOIFDvbx > 0.0) + pParam->B3SOIFDvbx = -pParam->B3SOIFDvbx; + if (pParam->B3SOIFDvbm > 0.0) pParam->B3SOIFDvbm = -pParam->B3SOIFDvbm; - + if (!model->B3SOIFDgamma1Given) pParam->B3SOIFDgamma1 = 5.753e-12 - * sqrt(pParam->B3SOIFDnpeak) + * sqrt(pParam->B3SOIFDnpeak) / model->B3SOIFDcox; if (!model->B3SOIFDgamma2Given) pParam->B3SOIFDgamma2 = 5.753e-12 - * sqrt(pParam->B3SOIFDnsub) + * sqrt(pParam->B3SOIFDnsub) / model->B3SOIFDcox; T0 = pParam->B3SOIFDgamma1 - pParam->B3SOIFDgamma2; T1 = sqrt(pParam->B3SOIFDphi - pParam->B3SOIFDvbx) - - pParam->B3SOIFDsqrtPhi; + - pParam->B3SOIFDsqrtPhi; T2 = sqrt(pParam->B3SOIFDphi * (pParam->B3SOIFDphi - - pParam->B3SOIFDvbm)) - pParam->B3SOIFDphi; + - pParam->B3SOIFDvbm)) - pParam->B3SOIFDphi; pParam->B3SOIFDk2 = T0 * T1 / (2.0 * T2 + pParam->B3SOIFDvbm); pParam->B3SOIFDk1 = pParam->B3SOIFDgamma2 - 2.0 - * pParam->B3SOIFDk2 * sqrt(pParam->B3SOIFDphi - - pParam->B3SOIFDvbm); + * pParam->B3SOIFDk2 * sqrt(pParam->B3SOIFDphi + - pParam->B3SOIFDvbm); } - - if (pParam->B3SOIFDk2 < 0.0) - { T0 = 0.5 * pParam->B3SOIFDk1 / pParam->B3SOIFDk2; - pParam->B3SOIFDvbsc = 0.9 * (pParam->B3SOIFDphi - T0 * T0); - if (pParam->B3SOIFDvbsc > -3.0) - pParam->B3SOIFDvbsc = -3.0; - else if (pParam->B3SOIFDvbsc < -30.0) - pParam->B3SOIFDvbsc = -30.0; - } - else - { pParam->B3SOIFDvbsc = -30.0; - } - if (pParam->B3SOIFDvbsc > pParam->B3SOIFDvbm) - pParam->B3SOIFDvbsc = pParam->B3SOIFDvbm; - if (model->B3SOIFDvth0Given) - { pParam->B3SOIFDvfb = model->B3SOIFDtype * pParam->B3SOIFDvth0 - - pParam->B3SOIFDphi - pParam->B3SOIFDk1 + if (pParam->B3SOIFDk2 < 0.0) + { T0 = 0.5 * pParam->B3SOIFDk1 / pParam->B3SOIFDk2; + pParam->B3SOIFDvbsc = 0.9 * (pParam->B3SOIFDphi - T0 * T0); + if (pParam->B3SOIFDvbsc > -3.0) + pParam->B3SOIFDvbsc = -3.0; + else if (pParam->B3SOIFDvbsc < -30.0) + pParam->B3SOIFDvbsc = -30.0; + } + else + { pParam->B3SOIFDvbsc = -30.0; + } + if (pParam->B3SOIFDvbsc > pParam->B3SOIFDvbm) + pParam->B3SOIFDvbsc = pParam->B3SOIFDvbm; + + if (model->B3SOIFDvth0Given) + { pParam->B3SOIFDvfb = model->B3SOIFDtype * pParam->B3SOIFDvth0 + - pParam->B3SOIFDphi - pParam->B3SOIFDk1 * pParam->B3SOIFDsqrtPhi; - } - else - { pParam->B3SOIFDvfb = -1.0; - pParam->B3SOIFDvth0 = model->B3SOIFDtype * (pParam->B3SOIFDvfb - + pParam->B3SOIFDphi + pParam->B3SOIFDk1 + } + else + { pParam->B3SOIFDvfb = -1.0; + pParam->B3SOIFDvth0 = model->B3SOIFDtype * (pParam->B3SOIFDvfb + + pParam->B3SOIFDphi + pParam->B3SOIFDk1 * pParam->B3SOIFDsqrtPhi); - } + } T1 = sqrt(EPSSI / EPSOX * model->B3SOIFDtox - * pParam->B3SOIFDXdep0); + * pParam->B3SOIFDXdep0); T0 = exp(-0.5 * pParam->B3SOIFDdsub * pParam->B3SOIFDleff / T1); pParam->B3SOIFDtheta0vb0 = (T0 + 2.0 * T0 * T0); T0 = exp(-0.5 * pParam->B3SOIFDdrout * pParam->B3SOIFDleff / T1); T2 = (T0 + 2.0 * T0 * T0); pParam->B3SOIFDthetaRout = pParam->B3SOIFDpdibl1 * T2 - + pParam->B3SOIFDpdibl2; + + pParam->B3SOIFDpdibl2; here->B3SOIFDminIsub = 5.0e-2 * pParam->B3SOIFDweff * model->B3SOIFDtsi * MAX(pParam->B3SOIFDisdif, pParam->B3SOIFDisrec); - } + } here->B3SOIFDcsbox = model->B3SOIFDcbox*here->B3SOIFDsourceArea; here->B3SOIFDcsmin = model->B3SOIFDcsdmin*here->B3SOIFDsourceArea; @@ -750,7 +750,7 @@ int Size_Not_Found; here->B3SOIFDcdmin = model->B3SOIFDcsdmin*here->B3SOIFDdrainArea; if ( ((pParam->B3SOIFDnsub > 0) && (model->B3SOIFDtype > 0)) || - ((pParam->B3SOIFDnsub < 0) && (model->B3SOIFDtype < 0)) ) + ((pParam->B3SOIFDnsub < 0) && (model->B3SOIFDtype < 0)) ) { T0 = pParam->B3SOIFDvsdth - pParam->B3SOIFDvsdfb; pParam->B3SOIFDsdt1 = pParam->B3SOIFDvsdfb + model->B3SOIFDasd * T0; @@ -760,14 +760,14 @@ int Size_Not_Found; pParam->B3SOIFDst3 = T2 /( 1 - model->B3SOIFDasd); here->B3SOIFDst4 = T0 * T1 * (1 + model->B3SOIFDasd) / 3 - here->B3SOIFDcsmin * pParam->B3SOIFDvsdfb; - + T1 = here->B3SOIFDcdbox - here->B3SOIFDcdmin; T2 = T1 / T0 / T0; pParam->B3SOIFDdt2 = T2 / model->B3SOIFDasd; pParam->B3SOIFDdt3 = T2 /( 1 - model->B3SOIFDasd); here->B3SOIFDdt4 = T0 * T1 * (1 + model->B3SOIFDasd) / 3 - here->B3SOIFDcdmin * pParam->B3SOIFDvsdfb; - } else + } else { T0 = pParam->B3SOIFDvsdfb - pParam->B3SOIFDvsdth; pParam->B3SOIFDsdt1 = pParam->B3SOIFDvsdth + model->B3SOIFDasd * T0; @@ -777,34 +777,34 @@ int Size_Not_Found; pParam->B3SOIFDst3 = T2 /( 1 - model->B3SOIFDasd); here->B3SOIFDst4 = T0 * T1 * (1 + model->B3SOIFDasd) / 3 - here->B3SOIFDcsbox * pParam->B3SOIFDvsdth; - + T1 = here->B3SOIFDcdmin - here->B3SOIFDcdbox; T2 = T1 / T0 / T0; pParam->B3SOIFDdt2 = T2 / model->B3SOIFDasd; pParam->B3SOIFDdt3 = T2 /( 1 - model->B3SOIFDasd); here->B3SOIFDdt4 = T0 * T1 * (1 + model->B3SOIFDasd) / 3 - here->B3SOIFDcdbox * pParam->B3SOIFDvsdth; - } + } - here->B3SOIFDphi = pParam->B3SOIFDphi; + here->B3SOIFDphi = pParam->B3SOIFDphi; /* process source/drain series resistance */ - here->B3SOIFDdrainConductance = model->B3SOIFDsheetResistance - * here->B3SOIFDdrainSquares; + here->B3SOIFDdrainConductance = model->B3SOIFDsheetResistance + * here->B3SOIFDdrainSquares; if (here->B3SOIFDdrainConductance > 0.0) here->B3SOIFDdrainConductance = 1.0 - / here->B3SOIFDdrainConductance; - else + / here->B3SOIFDdrainConductance; + else here->B3SOIFDdrainConductance = 0.0; - - here->B3SOIFDsourceConductance = model->B3SOIFDsheetResistance - * here->B3SOIFDsourceSquares; - if (here->B3SOIFDsourceConductance > 0.0) + + here->B3SOIFDsourceConductance = model->B3SOIFDsheetResistance + * here->B3SOIFDsourceSquares; + if (here->B3SOIFDsourceConductance > 0.0) here->B3SOIFDsourceConductance = 1.0 - / here->B3SOIFDsourceConductance; - else + / here->B3SOIFDsourceConductance; + else here->B3SOIFDsourceConductance = 0.0; - here->B3SOIFDcgso = pParam->B3SOIFDcgso; - here->B3SOIFDcgdo = pParam->B3SOIFDcgdo; + here->B3SOIFDcgso = pParam->B3SOIFDcgso; + here->B3SOIFDcgdo = pParam->B3SOIFDcgdo; } } diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdtemp.c b/src/spicelib/devices/bsim3soi_pd/b3soipdtemp.c index 4e7d04c66..2ed4cb900 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdtemp.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdtemp.c @@ -12,7 +12,7 @@ Modified by Paolo Nenzi 2002 **********/ /* - * Revision 2.2.3 02/3/5 Pin Su + * Revision 2.2.3 02/3/5 Pin Su * BSIMPD2.2.3 release */ @@ -76,65 +76,65 @@ double tmp3, T7; p = next_p; } model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; + pLastKnot = NULL; - Tnom = model->B3SOIPDtnom; - TempRatio = Temp / Tnom; + Tnom = model->B3SOIPDtnom; + TempRatio = Temp / Tnom; - model->B3SOIPDvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); + model->B3SOIPDvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); model->B3SOIPDfactor1 = sqrt(EPSSI / EPSOX * model->B3SOIPDtox); Vtm0 = KboQ * Tnom; Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - model->B3SOIPDeg0 = Eg0; + model->B3SOIPDeg0 = Eg0; model->B3SOIPDvtm = 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) + ni = 1.45e10 * (Temp / 300.15) * sqrt(Temp / 300.15) * exp(21.5565981 - Eg / (2.0 * model->B3SOIPDvtm)); /* loop through all the instances of the model */ - /* MCJ: Length and Width not initialized */ + /* MCJ: Length and Width not initialized */ for (here = B3SOIPDinstances(model); here != NULL; - here = B3SOIPDnextInstance(here)) - { + here = B3SOIPDnextInstance(here)) + { here->B3SOIPDrbodyext = here->B3SOIPDbodySquares * model->B3SOIPDrbsh; - pSizeDependParamKnot = model->pSizeDependParamKnot; + pSizeDependParamKnot = model->pSizeDependParamKnot; Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->B3SOIPDl == pSizeDependParamKnot->Length) - && (here->B3SOIPDw == pSizeDependParamKnot->Width) + while ((pSizeDependParamKnot != NULL) && Size_Not_Found) + { if ((here->B3SOIPDl == pSizeDependParamKnot->Length) + && (here->B3SOIPDw == pSizeDependParamKnot->Width) && (here->B3SOIPDrth0 == pSizeDependParamKnot->Rth0) && (here->B3SOIPDcth0 == pSizeDependParamKnot->Cth0)) { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - pParam = here->pParam; /* v2.2.3 bug fix */ - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } + here->pParam = pSizeDependParamKnot; + pParam = here->pParam; /* v2.2.3 bug fix */ + } + else + { pLastKnot = pSizeDependParamKnot; + pSizeDependParamKnot = pSizeDependParamKnot->pNext; + } } - if (Size_Not_Found) - { pParam = TMALLOC(struct b3soipdSizeDependParam, 1); + if (Size_Not_Found) + { pParam = TMALLOC(struct b3soipdSizeDependParam, 1); if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; + model->pSizeDependParamKnot = pParam; else - pLastKnot->pNext = pParam; + pLastKnot->pNext = pParam; pParam->pNext = NULL; here->pParam = pParam; - Ldrn = here->B3SOIPDl; - Wdrn = here->B3SOIPDw; + Ldrn = here->B3SOIPDl; + Wdrn = here->B3SOIPDw; pParam->Length = Ldrn; pParam->Width = Wdrn; pParam->Rth0 = here->B3SOIPDrth0; pParam->Cth0 = here->B3SOIPDcth0; - + T0 = pow(Ldrn, model->B3SOIPDLln); T1 = pow(Wdrn, model->B3SOIPDLwn); tmp1 = model->B3SOIPDLl / T0 + model->B3SOIPDLw / T1 @@ -161,7 +161,7 @@ double tmp3, T7; pParam->B3SOIPDleff = here->B3SOIPDl - 2.0 * pParam->B3SOIPDdl; if (pParam->B3SOIPDleff <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "B3SOIPD: mosfet %s, model %s: Effective channel length <= 0", model->B3SOIPDmodName, here->B3SOIPDname); @@ -171,7 +171,7 @@ double tmp3, T7; pParam->B3SOIPDweff = here->B3SOIPDw - here->B3SOIPDnbc * model->B3SOIPDdwbc - (2.0 - here->B3SOIPDnbc) * pParam->B3SOIPDdw; if (pParam->B3SOIPDweff <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "B3SOIPD: mosfet %s, model %s: Effective channel width <= 0", model->B3SOIPDmodName, here->B3SOIPDname); @@ -183,7 +183,7 @@ double tmp3, T7; pParam->B3SOIPDleffCV = here->B3SOIPDl - 2.0 * pParam->B3SOIPDdlc; if (pParam->B3SOIPDleffCV <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "B3SOIPD: mosfet %s, model %s: Effective channel length for C-V <= 0", model->B3SOIPDmodName, here->B3SOIPDname); @@ -193,7 +193,7 @@ double tmp3, T7; pParam->B3SOIPDweffCV = here->B3SOIPDw - here->B3SOIPDnbc * model->B3SOIPDdwbc - (2.0 - here->B3SOIPDnbc) * pParam->B3SOIPDdwc; if (pParam->B3SOIPDweffCV <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "B3SOIPD: mosfet %s, model %s: Effective channel width for C-V <= 0", model->B3SOIPDmodName, here->B3SOIPDname); @@ -205,7 +205,7 @@ double tmp3, T7; pParam->B3SOIPDleffCVb = here->B3SOIPDl - 2.0 * pParam->B3SOIPDdlc - model->B3SOIPDdlcb; if (pParam->B3SOIPDleffCVb <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "B3SOIPD: mosfet %s, model %s: Effective channel length for C-V (body) <= 0", model->B3SOIPDmodName, here->B3SOIPDname); @@ -214,7 +214,7 @@ double tmp3, T7; pParam->B3SOIPDleffCVbg = pParam->B3SOIPDleffCVb + 2 * model->B3SOIPDdlbg; if (pParam->B3SOIPDleffCVbg <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "B3SOIPD: mosfet %s, model %s: Effective channel length for C-V (backgate) <= 0", model->B3SOIPDmodName, here->B3SOIPDname); @@ -222,406 +222,406 @@ double tmp3, T7; } /* Not binned - START */ - pParam->B3SOIPDat = model->B3SOIPDat; - pParam->B3SOIPDgamma1 = model->B3SOIPDgamma1; - pParam->B3SOIPDgamma2 = model->B3SOIPDgamma2; - pParam->B3SOIPDvbx = model->B3SOIPDvbx; - pParam->B3SOIPDvbm = model->B3SOIPDvbm; - pParam->B3SOIPDxt = model->B3SOIPDxt; - pParam->B3SOIPDkt1 = model->B3SOIPDkt1; - pParam->B3SOIPDkt1l = model->B3SOIPDkt1l; - pParam->B3SOIPDkt2 = model->B3SOIPDkt2; - pParam->B3SOIPDua1 = model->B3SOIPDua1; - pParam->B3SOIPDub1 = model->B3SOIPDub1; - pParam->B3SOIPDuc1 = model->B3SOIPDuc1; - pParam->B3SOIPDute = model->B3SOIPDute; - pParam->B3SOIPDprt = model->B3SOIPDprt; + pParam->B3SOIPDat = model->B3SOIPDat; + pParam->B3SOIPDgamma1 = model->B3SOIPDgamma1; + pParam->B3SOIPDgamma2 = model->B3SOIPDgamma2; + pParam->B3SOIPDvbx = model->B3SOIPDvbx; + pParam->B3SOIPDvbm = model->B3SOIPDvbm; + pParam->B3SOIPDxt = model->B3SOIPDxt; + pParam->B3SOIPDkt1 = model->B3SOIPDkt1; + pParam->B3SOIPDkt1l = model->B3SOIPDkt1l; + pParam->B3SOIPDkt2 = model->B3SOIPDkt2; + pParam->B3SOIPDua1 = model->B3SOIPDua1; + pParam->B3SOIPDub1 = model->B3SOIPDub1; + pParam->B3SOIPDuc1 = model->B3SOIPDuc1; + pParam->B3SOIPDute = model->B3SOIPDute; + pParam->B3SOIPDprt = model->B3SOIPDprt; /* Not binned - END */ - /* CV model */ - pParam->B3SOIPDcgsl = model->B3SOIPDcgsl; - pParam->B3SOIPDcgdl = model->B3SOIPDcgdl; - pParam->B3SOIPDckappa = model->B3SOIPDckappa; - pParam->B3SOIPDcf = model->B3SOIPDcf; - pParam->B3SOIPDclc = model->B3SOIPDclc; - pParam->B3SOIPDcle = model->B3SOIPDcle; + /* CV model */ + pParam->B3SOIPDcgsl = model->B3SOIPDcgsl; + pParam->B3SOIPDcgdl = model->B3SOIPDcgdl; + pParam->B3SOIPDckappa = model->B3SOIPDckappa; + pParam->B3SOIPDcf = model->B3SOIPDcf; + pParam->B3SOIPDclc = model->B3SOIPDclc; + pParam->B3SOIPDcle = model->B3SOIPDcle; pParam->B3SOIPDabulkCVfactor = 1.0 + pow((pParam->B3SOIPDclc / pParam->B3SOIPDleff), - pParam->B3SOIPDcle); + pParam->B3SOIPDcle); /* Added for binning - START */ - if (model->B3SOIPDbinUnit == 1) - { Inv_L = 1.0e-6 / pParam->B3SOIPDleff; - Inv_W = 1.0e-6 / pParam->B3SOIPDweff; - Inv_LW = 1.0e-12 / (pParam->B3SOIPDleff - * pParam->B3SOIPDweff); - } - else - { Inv_L = 1.0 / pParam->B3SOIPDleff; - Inv_W = 1.0 / pParam->B3SOIPDweff; - Inv_LW = 1.0 / (pParam->B3SOIPDleff - * pParam->B3SOIPDweff); - } - pParam->B3SOIPDnpeak = model->B3SOIPDnpeak - + model->B3SOIPDlnpeak * Inv_L - + model->B3SOIPDwnpeak * Inv_W - + model->B3SOIPDpnpeak * Inv_LW; - pParam->B3SOIPDnsub = model->B3SOIPDnsub - + model->B3SOIPDlnsub * Inv_L - + model->B3SOIPDwnsub * Inv_W - + model->B3SOIPDpnsub * Inv_LW; - pParam->B3SOIPDngate = model->B3SOIPDngate - + model->B3SOIPDlngate * Inv_L - + model->B3SOIPDwngate * Inv_W - + model->B3SOIPDpngate * Inv_LW; - pParam->B3SOIPDvth0 = model->B3SOIPDvth0 - + model->B3SOIPDlvth0 * Inv_L - + model->B3SOIPDwvth0 * Inv_W - + model->B3SOIPDpvth0 * Inv_LW; - pParam->B3SOIPDk1 = model->B3SOIPDk1 - + model->B3SOIPDlk1 * Inv_L - + model->B3SOIPDwk1 * Inv_W - + model->B3SOIPDpk1 * Inv_LW; - pParam->B3SOIPDk2 = model->B3SOIPDk2 - + model->B3SOIPDlk2 * Inv_L - + model->B3SOIPDwk2 * Inv_W - + model->B3SOIPDpk2 * Inv_LW; - pParam->B3SOIPDk1w1 = model->B3SOIPDk1w1 - + model->B3SOIPDlk1w1 * Inv_L - + model->B3SOIPDwk1w1 * Inv_W - + model->B3SOIPDpk1w1 * Inv_LW; - pParam->B3SOIPDk1w2 = model->B3SOIPDk1w2 - + model->B3SOIPDlk1w2 * Inv_L - + model->B3SOIPDwk1w2 * Inv_W - + model->B3SOIPDpk1w2 * Inv_LW; - pParam->B3SOIPDk3 = model->B3SOIPDk3 - + model->B3SOIPDlk3 * Inv_L - + model->B3SOIPDwk3 * Inv_W - + model->B3SOIPDpk3 * Inv_LW; - pParam->B3SOIPDk3b = model->B3SOIPDk3b - + model->B3SOIPDlk3b * Inv_L - + model->B3SOIPDwk3b * Inv_W - + model->B3SOIPDpk3b * Inv_LW; - pParam->B3SOIPDkb1 = model->B3SOIPDkb1 - + model->B3SOIPDlkb1 * Inv_L - + model->B3SOIPDwkb1 * Inv_W - + model->B3SOIPDpkb1 * Inv_LW; - pParam->B3SOIPDw0 = model->B3SOIPDw0 - + model->B3SOIPDlw0 * Inv_L - + model->B3SOIPDww0 * Inv_W - + model->B3SOIPDpw0 * Inv_LW; - pParam->B3SOIPDnlx = model->B3SOIPDnlx - + model->B3SOIPDlnlx * Inv_L - + model->B3SOIPDwnlx * Inv_W - + model->B3SOIPDpnlx * Inv_LW; - pParam->B3SOIPDdvt0 = model->B3SOIPDdvt0 - + model->B3SOIPDldvt0 * Inv_L - + model->B3SOIPDwdvt0 * Inv_W - + model->B3SOIPDpdvt0 * Inv_LW; - pParam->B3SOIPDdvt1 = model->B3SOIPDdvt1 - + model->B3SOIPDldvt1 * Inv_L - + model->B3SOIPDwdvt1 * Inv_W - + model->B3SOIPDpdvt1 * Inv_LW; - pParam->B3SOIPDdvt2 = model->B3SOIPDdvt2 - + model->B3SOIPDldvt2 * Inv_L - + model->B3SOIPDwdvt2 * Inv_W - + model->B3SOIPDpdvt2 * Inv_LW; - pParam->B3SOIPDdvt0w = model->B3SOIPDdvt0w - + model->B3SOIPDldvt0w * Inv_L - + model->B3SOIPDwdvt0w * Inv_W - + model->B3SOIPDpdvt0w * Inv_LW; - pParam->B3SOIPDdvt1w = model->B3SOIPDdvt1w - + model->B3SOIPDldvt1w * Inv_L - + model->B3SOIPDwdvt1w * Inv_W - + model->B3SOIPDpdvt1w * Inv_LW; - pParam->B3SOIPDdvt2w = model->B3SOIPDdvt2w - + model->B3SOIPDldvt2w * Inv_L - + model->B3SOIPDwdvt2w * Inv_W - + model->B3SOIPDpdvt2w * Inv_LW; - pParam->B3SOIPDu0 = model->B3SOIPDu0 - + model->B3SOIPDlu0 * Inv_L - + model->B3SOIPDwu0 * Inv_W - + model->B3SOIPDpu0 * Inv_LW; - pParam->B3SOIPDua = model->B3SOIPDua - + model->B3SOIPDlua * Inv_L - + model->B3SOIPDwua * Inv_W - + model->B3SOIPDpua * Inv_LW; - pParam->B3SOIPDub = model->B3SOIPDub - + model->B3SOIPDlub * Inv_L - + model->B3SOIPDwub * Inv_W - + model->B3SOIPDpub * Inv_LW; - pParam->B3SOIPDuc = model->B3SOIPDuc - + model->B3SOIPDluc * Inv_L - + model->B3SOIPDwuc * Inv_W - + model->B3SOIPDpuc * Inv_LW; - pParam->B3SOIPDvsat = model->B3SOIPDvsat - + model->B3SOIPDlvsat * Inv_L - + model->B3SOIPDwvsat * Inv_W - + model->B3SOIPDpvsat * Inv_LW; - pParam->B3SOIPDa0 = model->B3SOIPDa0 - + model->B3SOIPDla0 * Inv_L - + model->B3SOIPDwa0 * Inv_W - + model->B3SOIPDpa0 * Inv_LW; - pParam->B3SOIPDags = model->B3SOIPDags - + model->B3SOIPDlags * Inv_L - + model->B3SOIPDwags * Inv_W - + model->B3SOIPDpags * Inv_LW; - pParam->B3SOIPDb0 = model->B3SOIPDb0 - + model->B3SOIPDlb0 * Inv_L - + model->B3SOIPDwb0 * Inv_W - + model->B3SOIPDpb0 * Inv_LW; - pParam->B3SOIPDb1 = model->B3SOIPDb1 - + model->B3SOIPDlb1 * Inv_L - + model->B3SOIPDwb1 * Inv_W - + model->B3SOIPDpb1 * Inv_LW; - pParam->B3SOIPDketa = model->B3SOIPDketa - + model->B3SOIPDlketa * Inv_L - + model->B3SOIPDwketa * Inv_W - + model->B3SOIPDpketa * Inv_LW; - pParam->B3SOIPDketas = model->B3SOIPDketas - + model->B3SOIPDlketas * Inv_L - + model->B3SOIPDwketas * Inv_W - + model->B3SOIPDpketas * Inv_LW; - pParam->B3SOIPDa1 = model->B3SOIPDa1 - + model->B3SOIPDla1 * Inv_L - + model->B3SOIPDwa1 * Inv_W - + model->B3SOIPDpa1 * Inv_LW; - pParam->B3SOIPDa2 = model->B3SOIPDa2 - + model->B3SOIPDla2 * Inv_L - + model->B3SOIPDwa2 * Inv_W - + model->B3SOIPDpa2 * Inv_LW; - pParam->B3SOIPDrdsw = model->B3SOIPDrdsw - + model->B3SOIPDlrdsw * Inv_L - + model->B3SOIPDwrdsw * Inv_W - + model->B3SOIPDprdsw * Inv_LW; - pParam->B3SOIPDprwb = model->B3SOIPDprwb - + model->B3SOIPDlprwb * Inv_L - + model->B3SOIPDwprwb * Inv_W - + model->B3SOIPDpprwb * Inv_LW; - pParam->B3SOIPDprwg = model->B3SOIPDprwg - + model->B3SOIPDlprwg * Inv_L - + model->B3SOIPDwprwg * Inv_W - + model->B3SOIPDpprwg * Inv_LW; - pParam->B3SOIPDwr = model->B3SOIPDwr - + model->B3SOIPDlwr * Inv_L - + model->B3SOIPDwwr * Inv_W - + model->B3SOIPDpwr * Inv_LW; - pParam->B3SOIPDnfactor = model->B3SOIPDnfactor - + model->B3SOIPDlnfactor * Inv_L - + model->B3SOIPDwnfactor * Inv_W - + model->B3SOIPDpnfactor * Inv_LW; - pParam->B3SOIPDdwg = model->B3SOIPDdwg - + model->B3SOIPDldwg * Inv_L - + model->B3SOIPDwdwg * Inv_W - + model->B3SOIPDpdwg * Inv_LW; - pParam->B3SOIPDdwb = model->B3SOIPDdwb - + model->B3SOIPDldwb * Inv_L - + model->B3SOIPDwdwb * Inv_W - + model->B3SOIPDpdwb * Inv_LW; - pParam->B3SOIPDvoff = model->B3SOIPDvoff - + model->B3SOIPDlvoff * Inv_L - + model->B3SOIPDwvoff * Inv_W - + model->B3SOIPDpvoff * Inv_LW; - pParam->B3SOIPDeta0 = model->B3SOIPDeta0 - + model->B3SOIPDleta0 * Inv_L - + model->B3SOIPDweta0 * Inv_W - + model->B3SOIPDpeta0 * Inv_LW; - pParam->B3SOIPDetab = model->B3SOIPDetab - + model->B3SOIPDletab * Inv_L - + model->B3SOIPDwetab * Inv_W - + model->B3SOIPDpetab * Inv_LW; - pParam->B3SOIPDdsub = model->B3SOIPDdsub - + model->B3SOIPDldsub * Inv_L - + model->B3SOIPDwdsub * Inv_W - + model->B3SOIPDpdsub * Inv_LW; - pParam->B3SOIPDcit = model->B3SOIPDcit - + model->B3SOIPDlcit * Inv_L - + model->B3SOIPDwcit * Inv_W - + model->B3SOIPDpcit * Inv_LW; - pParam->B3SOIPDcdsc = model->B3SOIPDcdsc - + model->B3SOIPDlcdsc * Inv_L - + model->B3SOIPDwcdsc * Inv_W - + model->B3SOIPDpcdsc * Inv_LW; - pParam->B3SOIPDcdscb = model->B3SOIPDcdscb - + model->B3SOIPDlcdscb * Inv_L - + model->B3SOIPDwcdscb * Inv_W - + model->B3SOIPDpcdscb * Inv_LW; - pParam->B3SOIPDcdscd = model->B3SOIPDcdscd - + model->B3SOIPDlcdscd * Inv_L - + model->B3SOIPDwcdscd * Inv_W - + model->B3SOIPDpcdscd * Inv_LW; - pParam->B3SOIPDpclm = model->B3SOIPDpclm - + model->B3SOIPDlpclm * Inv_L - + model->B3SOIPDwpclm * Inv_W - + model->B3SOIPDppclm * Inv_LW; - pParam->B3SOIPDpdibl1 = model->B3SOIPDpdibl1 - + model->B3SOIPDlpdibl1 * Inv_L - + model->B3SOIPDwpdibl1 * Inv_W - + model->B3SOIPDppdibl1 * Inv_LW; - pParam->B3SOIPDpdibl2 = model->B3SOIPDpdibl2 - + model->B3SOIPDlpdibl2 * Inv_L - + model->B3SOIPDwpdibl2 * Inv_W - + model->B3SOIPDppdibl2 * Inv_LW; - pParam->B3SOIPDpdiblb = model->B3SOIPDpdiblb - + model->B3SOIPDlpdiblb * Inv_L - + model->B3SOIPDwpdiblb * Inv_W - + model->B3SOIPDppdiblb * Inv_LW; - pParam->B3SOIPDdrout = model->B3SOIPDdrout - + model->B3SOIPDldrout * Inv_L - + model->B3SOIPDwdrout * Inv_W - + model->B3SOIPDpdrout * Inv_LW; - pParam->B3SOIPDpvag = model->B3SOIPDpvag - + model->B3SOIPDlpvag * Inv_L - + model->B3SOIPDwpvag * Inv_W - + model->B3SOIPDppvag * Inv_LW; - pParam->B3SOIPDdelta = model->B3SOIPDdelta - + model->B3SOIPDldelta * Inv_L - + model->B3SOIPDwdelta * Inv_W - + model->B3SOIPDpdelta * Inv_LW; - pParam->B3SOIPDalpha0 = model->B3SOIPDalpha0 - + model->B3SOIPDlalpha0 * Inv_L - + model->B3SOIPDwalpha0 * Inv_W - + model->B3SOIPDpalpha0 * Inv_LW; - pParam->B3SOIPDfbjtii = model->B3SOIPDfbjtii - + model->B3SOIPDlfbjtii * Inv_L - + model->B3SOIPDwfbjtii * Inv_W - + model->B3SOIPDpfbjtii * Inv_LW; - pParam->B3SOIPDbeta0 = model->B3SOIPDbeta0 - + model->B3SOIPDlbeta0 * Inv_L - + model->B3SOIPDwbeta0 * Inv_W - + model->B3SOIPDpbeta0 * Inv_LW; - pParam->B3SOIPDbeta1 = model->B3SOIPDbeta1 - + model->B3SOIPDlbeta1 * Inv_L - + model->B3SOIPDwbeta1 * Inv_W - + model->B3SOIPDpbeta1 * Inv_LW; - pParam->B3SOIPDbeta2 = model->B3SOIPDbeta2 - + model->B3SOIPDlbeta2 * Inv_L - + model->B3SOIPDwbeta2 * Inv_W - + model->B3SOIPDpbeta2 * Inv_LW; - pParam->B3SOIPDvdsatii0 = model->B3SOIPDvdsatii0 - + model->B3SOIPDlvdsatii0 * Inv_L - + model->B3SOIPDwvdsatii0 * Inv_W - + model->B3SOIPDpvdsatii0 * Inv_LW; - pParam->B3SOIPDlii = model->B3SOIPDlii - + model->B3SOIPDllii * Inv_L - + model->B3SOIPDwlii * Inv_W - + model->B3SOIPDplii * Inv_LW; - pParam->B3SOIPDesatii = model->B3SOIPDesatii - + model->B3SOIPDlesatii * Inv_L - + model->B3SOIPDwesatii * Inv_W - + model->B3SOIPDpesatii * Inv_LW; - pParam->B3SOIPDsii0 = model->B3SOIPDsii0 - + model->B3SOIPDlsii0 * Inv_L - + model->B3SOIPDwsii0 * Inv_W - + model->B3SOIPDpsii0 * Inv_LW; - pParam->B3SOIPDsii1 = model->B3SOIPDsii1 - + model->B3SOIPDlsii1 * Inv_L - + model->B3SOIPDwsii1 * Inv_W - + model->B3SOIPDpsii1 * Inv_LW; - pParam->B3SOIPDsii2 = model->B3SOIPDsii2 - + model->B3SOIPDlsii2 * Inv_L - + model->B3SOIPDwsii2 * Inv_W - + model->B3SOIPDpsii2 * Inv_LW; - pParam->B3SOIPDsiid = model->B3SOIPDsiid - + model->B3SOIPDlsiid * Inv_L - + model->B3SOIPDwsiid * Inv_W - + model->B3SOIPDpsiid * Inv_LW; - pParam->B3SOIPDagidl = model->B3SOIPDagidl - + model->B3SOIPDlagidl * Inv_L - + model->B3SOIPDwagidl * Inv_W - + model->B3SOIPDpagidl * Inv_LW; - pParam->B3SOIPDbgidl = model->B3SOIPDbgidl - + model->B3SOIPDlbgidl * Inv_L - + model->B3SOIPDwbgidl * Inv_W - + model->B3SOIPDpbgidl * Inv_LW; - pParam->B3SOIPDngidl = model->B3SOIPDngidl - + model->B3SOIPDlngidl * Inv_L - + model->B3SOIPDwngidl * Inv_W - + model->B3SOIPDpngidl * Inv_LW; - pParam->B3SOIPDntun = model->B3SOIPDntun - + model->B3SOIPDlntun * Inv_L - + model->B3SOIPDwntun * Inv_W - + model->B3SOIPDpntun * Inv_LW; - pParam->B3SOIPDndiode = model->B3SOIPDndiode - + model->B3SOIPDlndiode * Inv_L - + model->B3SOIPDwndiode * Inv_W - + model->B3SOIPDpndiode * Inv_LW; - pParam->B3SOIPDnrecf0 = model->B3SOIPDnrecf0 - + model->B3SOIPDlnrecf0 * Inv_L - + model->B3SOIPDwnrecf0 * Inv_W - + model->B3SOIPDpnrecf0 * Inv_LW; - pParam->B3SOIPDnrecr0 = model->B3SOIPDnrecr0 - + model->B3SOIPDlnrecr0 * Inv_L - + model->B3SOIPDwnrecr0 * Inv_W - + model->B3SOIPDpnrecr0 * Inv_LW; - pParam->B3SOIPDisbjt = model->B3SOIPDisbjt - + model->B3SOIPDlisbjt * Inv_L - + model->B3SOIPDwisbjt * Inv_W - + model->B3SOIPDpisbjt * Inv_LW; - pParam->B3SOIPDisdif = model->B3SOIPDisdif - + model->B3SOIPDlisdif * Inv_L - + model->B3SOIPDwisdif * Inv_W - + model->B3SOIPDpisdif * Inv_LW; - pParam->B3SOIPDisrec = model->B3SOIPDisrec - + model->B3SOIPDlisrec * Inv_L - + model->B3SOIPDwisrec * Inv_W - + model->B3SOIPDpisrec * Inv_LW; - pParam->B3SOIPDistun = model->B3SOIPDistun - + model->B3SOIPDlistun * Inv_L - + model->B3SOIPDwistun * Inv_W - + model->B3SOIPDpistun * Inv_LW; - pParam->B3SOIPDvrec0 = model->B3SOIPDvrec0 - + model->B3SOIPDlvrec0 * Inv_L - + model->B3SOIPDwvrec0 * Inv_W - + model->B3SOIPDpvrec0 * Inv_LW; - pParam->B3SOIPDvtun0 = model->B3SOIPDvtun0 - + model->B3SOIPDlvtun0 * Inv_L - + model->B3SOIPDwvtun0 * Inv_W - + model->B3SOIPDpvtun0 * Inv_LW; - pParam->B3SOIPDnbjt = model->B3SOIPDnbjt - + model->B3SOIPDlnbjt * Inv_L - + model->B3SOIPDwnbjt * Inv_W - + model->B3SOIPDpnbjt * Inv_LW; - pParam->B3SOIPDlbjt0 = model->B3SOIPDlbjt0 - + model->B3SOIPDllbjt0 * Inv_L - + model->B3SOIPDwlbjt0 * Inv_W - + model->B3SOIPDplbjt0 * Inv_LW; - pParam->B3SOIPDvabjt = model->B3SOIPDvabjt - + model->B3SOIPDlvabjt * Inv_L - + model->B3SOIPDwvabjt * Inv_W - + model->B3SOIPDpvabjt * Inv_LW; - pParam->B3SOIPDaely = model->B3SOIPDaely - + model->B3SOIPDlaely * Inv_L - + model->B3SOIPDwaely * Inv_W - + model->B3SOIPDpaely * Inv_LW; - pParam->B3SOIPDahli = model->B3SOIPDahli - + model->B3SOIPDlahli * Inv_L - + model->B3SOIPDwahli * Inv_W - + model->B3SOIPDpahli * Inv_LW; - /* CV model */ - pParam->B3SOIPDvsdfb = model->B3SOIPDvsdfb - + model->B3SOIPDlvsdfb * Inv_L - + model->B3SOIPDwvsdfb * Inv_W - + model->B3SOIPDpvsdfb * Inv_LW; - pParam->B3SOIPDvsdth = model->B3SOIPDvsdth - + model->B3SOIPDlvsdth * Inv_L - + model->B3SOIPDwvsdth * Inv_W - + model->B3SOIPDpvsdth * Inv_LW; - pParam->B3SOIPDdelvt = model->B3SOIPDdelvt - + model->B3SOIPDldelvt * Inv_L - + model->B3SOIPDwdelvt * Inv_W - + model->B3SOIPDpdelvt * Inv_LW; - pParam->B3SOIPDacde = model->B3SOIPDacde - + model->B3SOIPDlacde * Inv_L - + model->B3SOIPDwacde * Inv_W - + model->B3SOIPDpacde * Inv_LW; - pParam->B3SOIPDmoin = model->B3SOIPDmoin - + model->B3SOIPDlmoin * Inv_L - + model->B3SOIPDwmoin * Inv_W - + model->B3SOIPDpmoin * Inv_LW; + if (model->B3SOIPDbinUnit == 1) + { Inv_L = 1.0e-6 / pParam->B3SOIPDleff; + Inv_W = 1.0e-6 / pParam->B3SOIPDweff; + Inv_LW = 1.0e-12 / (pParam->B3SOIPDleff + * pParam->B3SOIPDweff); + } + else + { Inv_L = 1.0 / pParam->B3SOIPDleff; + Inv_W = 1.0 / pParam->B3SOIPDweff; + Inv_LW = 1.0 / (pParam->B3SOIPDleff + * pParam->B3SOIPDweff); + } + pParam->B3SOIPDnpeak = model->B3SOIPDnpeak + + model->B3SOIPDlnpeak * Inv_L + + model->B3SOIPDwnpeak * Inv_W + + model->B3SOIPDpnpeak * Inv_LW; + pParam->B3SOIPDnsub = model->B3SOIPDnsub + + model->B3SOIPDlnsub * Inv_L + + model->B3SOIPDwnsub * Inv_W + + model->B3SOIPDpnsub * Inv_LW; + pParam->B3SOIPDngate = model->B3SOIPDngate + + model->B3SOIPDlngate * Inv_L + + model->B3SOIPDwngate * Inv_W + + model->B3SOIPDpngate * Inv_LW; + pParam->B3SOIPDvth0 = model->B3SOIPDvth0 + + model->B3SOIPDlvth0 * Inv_L + + model->B3SOIPDwvth0 * Inv_W + + model->B3SOIPDpvth0 * Inv_LW; + pParam->B3SOIPDk1 = model->B3SOIPDk1 + + model->B3SOIPDlk1 * Inv_L + + model->B3SOIPDwk1 * Inv_W + + model->B3SOIPDpk1 * Inv_LW; + pParam->B3SOIPDk2 = model->B3SOIPDk2 + + model->B3SOIPDlk2 * Inv_L + + model->B3SOIPDwk2 * Inv_W + + model->B3SOIPDpk2 * Inv_LW; + pParam->B3SOIPDk1w1 = model->B3SOIPDk1w1 + + model->B3SOIPDlk1w1 * Inv_L + + model->B3SOIPDwk1w1 * Inv_W + + model->B3SOIPDpk1w1 * Inv_LW; + pParam->B3SOIPDk1w2 = model->B3SOIPDk1w2 + + model->B3SOIPDlk1w2 * Inv_L + + model->B3SOIPDwk1w2 * Inv_W + + model->B3SOIPDpk1w2 * Inv_LW; + pParam->B3SOIPDk3 = model->B3SOIPDk3 + + model->B3SOIPDlk3 * Inv_L + + model->B3SOIPDwk3 * Inv_W + + model->B3SOIPDpk3 * Inv_LW; + pParam->B3SOIPDk3b = model->B3SOIPDk3b + + model->B3SOIPDlk3b * Inv_L + + model->B3SOIPDwk3b * Inv_W + + model->B3SOIPDpk3b * Inv_LW; + pParam->B3SOIPDkb1 = model->B3SOIPDkb1 + + model->B3SOIPDlkb1 * Inv_L + + model->B3SOIPDwkb1 * Inv_W + + model->B3SOIPDpkb1 * Inv_LW; + pParam->B3SOIPDw0 = model->B3SOIPDw0 + + model->B3SOIPDlw0 * Inv_L + + model->B3SOIPDww0 * Inv_W + + model->B3SOIPDpw0 * Inv_LW; + pParam->B3SOIPDnlx = model->B3SOIPDnlx + + model->B3SOIPDlnlx * Inv_L + + model->B3SOIPDwnlx * Inv_W + + model->B3SOIPDpnlx * Inv_LW; + pParam->B3SOIPDdvt0 = model->B3SOIPDdvt0 + + model->B3SOIPDldvt0 * Inv_L + + model->B3SOIPDwdvt0 * Inv_W + + model->B3SOIPDpdvt0 * Inv_LW; + pParam->B3SOIPDdvt1 = model->B3SOIPDdvt1 + + model->B3SOIPDldvt1 * Inv_L + + model->B3SOIPDwdvt1 * Inv_W + + model->B3SOIPDpdvt1 * Inv_LW; + pParam->B3SOIPDdvt2 = model->B3SOIPDdvt2 + + model->B3SOIPDldvt2 * Inv_L + + model->B3SOIPDwdvt2 * Inv_W + + model->B3SOIPDpdvt2 * Inv_LW; + pParam->B3SOIPDdvt0w = model->B3SOIPDdvt0w + + model->B3SOIPDldvt0w * Inv_L + + model->B3SOIPDwdvt0w * Inv_W + + model->B3SOIPDpdvt0w * Inv_LW; + pParam->B3SOIPDdvt1w = model->B3SOIPDdvt1w + + model->B3SOIPDldvt1w * Inv_L + + model->B3SOIPDwdvt1w * Inv_W + + model->B3SOIPDpdvt1w * Inv_LW; + pParam->B3SOIPDdvt2w = model->B3SOIPDdvt2w + + model->B3SOIPDldvt2w * Inv_L + + model->B3SOIPDwdvt2w * Inv_W + + model->B3SOIPDpdvt2w * Inv_LW; + pParam->B3SOIPDu0 = model->B3SOIPDu0 + + model->B3SOIPDlu0 * Inv_L + + model->B3SOIPDwu0 * Inv_W + + model->B3SOIPDpu0 * Inv_LW; + pParam->B3SOIPDua = model->B3SOIPDua + + model->B3SOIPDlua * Inv_L + + model->B3SOIPDwua * Inv_W + + model->B3SOIPDpua * Inv_LW; + pParam->B3SOIPDub = model->B3SOIPDub + + model->B3SOIPDlub * Inv_L + + model->B3SOIPDwub * Inv_W + + model->B3SOIPDpub * Inv_LW; + pParam->B3SOIPDuc = model->B3SOIPDuc + + model->B3SOIPDluc * Inv_L + + model->B3SOIPDwuc * Inv_W + + model->B3SOIPDpuc * Inv_LW; + pParam->B3SOIPDvsat = model->B3SOIPDvsat + + model->B3SOIPDlvsat * Inv_L + + model->B3SOIPDwvsat * Inv_W + + model->B3SOIPDpvsat * Inv_LW; + pParam->B3SOIPDa0 = model->B3SOIPDa0 + + model->B3SOIPDla0 * Inv_L + + model->B3SOIPDwa0 * Inv_W + + model->B3SOIPDpa0 * Inv_LW; + pParam->B3SOIPDags = model->B3SOIPDags + + model->B3SOIPDlags * Inv_L + + model->B3SOIPDwags * Inv_W + + model->B3SOIPDpags * Inv_LW; + pParam->B3SOIPDb0 = model->B3SOIPDb0 + + model->B3SOIPDlb0 * Inv_L + + model->B3SOIPDwb0 * Inv_W + + model->B3SOIPDpb0 * Inv_LW; + pParam->B3SOIPDb1 = model->B3SOIPDb1 + + model->B3SOIPDlb1 * Inv_L + + model->B3SOIPDwb1 * Inv_W + + model->B3SOIPDpb1 * Inv_LW; + pParam->B3SOIPDketa = model->B3SOIPDketa + + model->B3SOIPDlketa * Inv_L + + model->B3SOIPDwketa * Inv_W + + model->B3SOIPDpketa * Inv_LW; + pParam->B3SOIPDketas = model->B3SOIPDketas + + model->B3SOIPDlketas * Inv_L + + model->B3SOIPDwketas * Inv_W + + model->B3SOIPDpketas * Inv_LW; + pParam->B3SOIPDa1 = model->B3SOIPDa1 + + model->B3SOIPDla1 * Inv_L + + model->B3SOIPDwa1 * Inv_W + + model->B3SOIPDpa1 * Inv_LW; + pParam->B3SOIPDa2 = model->B3SOIPDa2 + + model->B3SOIPDla2 * Inv_L + + model->B3SOIPDwa2 * Inv_W + + model->B3SOIPDpa2 * Inv_LW; + pParam->B3SOIPDrdsw = model->B3SOIPDrdsw + + model->B3SOIPDlrdsw * Inv_L + + model->B3SOIPDwrdsw * Inv_W + + model->B3SOIPDprdsw * Inv_LW; + pParam->B3SOIPDprwb = model->B3SOIPDprwb + + model->B3SOIPDlprwb * Inv_L + + model->B3SOIPDwprwb * Inv_W + + model->B3SOIPDpprwb * Inv_LW; + pParam->B3SOIPDprwg = model->B3SOIPDprwg + + model->B3SOIPDlprwg * Inv_L + + model->B3SOIPDwprwg * Inv_W + + model->B3SOIPDpprwg * Inv_LW; + pParam->B3SOIPDwr = model->B3SOIPDwr + + model->B3SOIPDlwr * Inv_L + + model->B3SOIPDwwr * Inv_W + + model->B3SOIPDpwr * Inv_LW; + pParam->B3SOIPDnfactor = model->B3SOIPDnfactor + + model->B3SOIPDlnfactor * Inv_L + + model->B3SOIPDwnfactor * Inv_W + + model->B3SOIPDpnfactor * Inv_LW; + pParam->B3SOIPDdwg = model->B3SOIPDdwg + + model->B3SOIPDldwg * Inv_L + + model->B3SOIPDwdwg * Inv_W + + model->B3SOIPDpdwg * Inv_LW; + pParam->B3SOIPDdwb = model->B3SOIPDdwb + + model->B3SOIPDldwb * Inv_L + + model->B3SOIPDwdwb * Inv_W + + model->B3SOIPDpdwb * Inv_LW; + pParam->B3SOIPDvoff = model->B3SOIPDvoff + + model->B3SOIPDlvoff * Inv_L + + model->B3SOIPDwvoff * Inv_W + + model->B3SOIPDpvoff * Inv_LW; + pParam->B3SOIPDeta0 = model->B3SOIPDeta0 + + model->B3SOIPDleta0 * Inv_L + + model->B3SOIPDweta0 * Inv_W + + model->B3SOIPDpeta0 * Inv_LW; + pParam->B3SOIPDetab = model->B3SOIPDetab + + model->B3SOIPDletab * Inv_L + + model->B3SOIPDwetab * Inv_W + + model->B3SOIPDpetab * Inv_LW; + pParam->B3SOIPDdsub = model->B3SOIPDdsub + + model->B3SOIPDldsub * Inv_L + + model->B3SOIPDwdsub * Inv_W + + model->B3SOIPDpdsub * Inv_LW; + pParam->B3SOIPDcit = model->B3SOIPDcit + + model->B3SOIPDlcit * Inv_L + + model->B3SOIPDwcit * Inv_W + + model->B3SOIPDpcit * Inv_LW; + pParam->B3SOIPDcdsc = model->B3SOIPDcdsc + + model->B3SOIPDlcdsc * Inv_L + + model->B3SOIPDwcdsc * Inv_W + + model->B3SOIPDpcdsc * Inv_LW; + pParam->B3SOIPDcdscb = model->B3SOIPDcdscb + + model->B3SOIPDlcdscb * Inv_L + + model->B3SOIPDwcdscb * Inv_W + + model->B3SOIPDpcdscb * Inv_LW; + pParam->B3SOIPDcdscd = model->B3SOIPDcdscd + + model->B3SOIPDlcdscd * Inv_L + + model->B3SOIPDwcdscd * Inv_W + + model->B3SOIPDpcdscd * Inv_LW; + pParam->B3SOIPDpclm = model->B3SOIPDpclm + + model->B3SOIPDlpclm * Inv_L + + model->B3SOIPDwpclm * Inv_W + + model->B3SOIPDppclm * Inv_LW; + pParam->B3SOIPDpdibl1 = model->B3SOIPDpdibl1 + + model->B3SOIPDlpdibl1 * Inv_L + + model->B3SOIPDwpdibl1 * Inv_W + + model->B3SOIPDppdibl1 * Inv_LW; + pParam->B3SOIPDpdibl2 = model->B3SOIPDpdibl2 + + model->B3SOIPDlpdibl2 * Inv_L + + model->B3SOIPDwpdibl2 * Inv_W + + model->B3SOIPDppdibl2 * Inv_LW; + pParam->B3SOIPDpdiblb = model->B3SOIPDpdiblb + + model->B3SOIPDlpdiblb * Inv_L + + model->B3SOIPDwpdiblb * Inv_W + + model->B3SOIPDppdiblb * Inv_LW; + pParam->B3SOIPDdrout = model->B3SOIPDdrout + + model->B3SOIPDldrout * Inv_L + + model->B3SOIPDwdrout * Inv_W + + model->B3SOIPDpdrout * Inv_LW; + pParam->B3SOIPDpvag = model->B3SOIPDpvag + + model->B3SOIPDlpvag * Inv_L + + model->B3SOIPDwpvag * Inv_W + + model->B3SOIPDppvag * Inv_LW; + pParam->B3SOIPDdelta = model->B3SOIPDdelta + + model->B3SOIPDldelta * Inv_L + + model->B3SOIPDwdelta * Inv_W + + model->B3SOIPDpdelta * Inv_LW; + pParam->B3SOIPDalpha0 = model->B3SOIPDalpha0 + + model->B3SOIPDlalpha0 * Inv_L + + model->B3SOIPDwalpha0 * Inv_W + + model->B3SOIPDpalpha0 * Inv_LW; + pParam->B3SOIPDfbjtii = model->B3SOIPDfbjtii + + model->B3SOIPDlfbjtii * Inv_L + + model->B3SOIPDwfbjtii * Inv_W + + model->B3SOIPDpfbjtii * Inv_LW; + pParam->B3SOIPDbeta0 = model->B3SOIPDbeta0 + + model->B3SOIPDlbeta0 * Inv_L + + model->B3SOIPDwbeta0 * Inv_W + + model->B3SOIPDpbeta0 * Inv_LW; + pParam->B3SOIPDbeta1 = model->B3SOIPDbeta1 + + model->B3SOIPDlbeta1 * Inv_L + + model->B3SOIPDwbeta1 * Inv_W + + model->B3SOIPDpbeta1 * Inv_LW; + pParam->B3SOIPDbeta2 = model->B3SOIPDbeta2 + + model->B3SOIPDlbeta2 * Inv_L + + model->B3SOIPDwbeta2 * Inv_W + + model->B3SOIPDpbeta2 * Inv_LW; + pParam->B3SOIPDvdsatii0 = model->B3SOIPDvdsatii0 + + model->B3SOIPDlvdsatii0 * Inv_L + + model->B3SOIPDwvdsatii0 * Inv_W + + model->B3SOIPDpvdsatii0 * Inv_LW; + pParam->B3SOIPDlii = model->B3SOIPDlii + + model->B3SOIPDllii * Inv_L + + model->B3SOIPDwlii * Inv_W + + model->B3SOIPDplii * Inv_LW; + pParam->B3SOIPDesatii = model->B3SOIPDesatii + + model->B3SOIPDlesatii * Inv_L + + model->B3SOIPDwesatii * Inv_W + + model->B3SOIPDpesatii * Inv_LW; + pParam->B3SOIPDsii0 = model->B3SOIPDsii0 + + model->B3SOIPDlsii0 * Inv_L + + model->B3SOIPDwsii0 * Inv_W + + model->B3SOIPDpsii0 * Inv_LW; + pParam->B3SOIPDsii1 = model->B3SOIPDsii1 + + model->B3SOIPDlsii1 * Inv_L + + model->B3SOIPDwsii1 * Inv_W + + model->B3SOIPDpsii1 * Inv_LW; + pParam->B3SOIPDsii2 = model->B3SOIPDsii2 + + model->B3SOIPDlsii2 * Inv_L + + model->B3SOIPDwsii2 * Inv_W + + model->B3SOIPDpsii2 * Inv_LW; + pParam->B3SOIPDsiid = model->B3SOIPDsiid + + model->B3SOIPDlsiid * Inv_L + + model->B3SOIPDwsiid * Inv_W + + model->B3SOIPDpsiid * Inv_LW; + pParam->B3SOIPDagidl = model->B3SOIPDagidl + + model->B3SOIPDlagidl * Inv_L + + model->B3SOIPDwagidl * Inv_W + + model->B3SOIPDpagidl * Inv_LW; + pParam->B3SOIPDbgidl = model->B3SOIPDbgidl + + model->B3SOIPDlbgidl * Inv_L + + model->B3SOIPDwbgidl * Inv_W + + model->B3SOIPDpbgidl * Inv_LW; + pParam->B3SOIPDngidl = model->B3SOIPDngidl + + model->B3SOIPDlngidl * Inv_L + + model->B3SOIPDwngidl * Inv_W + + model->B3SOIPDpngidl * Inv_LW; + pParam->B3SOIPDntun = model->B3SOIPDntun + + model->B3SOIPDlntun * Inv_L + + model->B3SOIPDwntun * Inv_W + + model->B3SOIPDpntun * Inv_LW; + pParam->B3SOIPDndiode = model->B3SOIPDndiode + + model->B3SOIPDlndiode * Inv_L + + model->B3SOIPDwndiode * Inv_W + + model->B3SOIPDpndiode * Inv_LW; + pParam->B3SOIPDnrecf0 = model->B3SOIPDnrecf0 + + model->B3SOIPDlnrecf0 * Inv_L + + model->B3SOIPDwnrecf0 * Inv_W + + model->B3SOIPDpnrecf0 * Inv_LW; + pParam->B3SOIPDnrecr0 = model->B3SOIPDnrecr0 + + model->B3SOIPDlnrecr0 * Inv_L + + model->B3SOIPDwnrecr0 * Inv_W + + model->B3SOIPDpnrecr0 * Inv_LW; + pParam->B3SOIPDisbjt = model->B3SOIPDisbjt + + model->B3SOIPDlisbjt * Inv_L + + model->B3SOIPDwisbjt * Inv_W + + model->B3SOIPDpisbjt * Inv_LW; + pParam->B3SOIPDisdif = model->B3SOIPDisdif + + model->B3SOIPDlisdif * Inv_L + + model->B3SOIPDwisdif * Inv_W + + model->B3SOIPDpisdif * Inv_LW; + pParam->B3SOIPDisrec = model->B3SOIPDisrec + + model->B3SOIPDlisrec * Inv_L + + model->B3SOIPDwisrec * Inv_W + + model->B3SOIPDpisrec * Inv_LW; + pParam->B3SOIPDistun = model->B3SOIPDistun + + model->B3SOIPDlistun * Inv_L + + model->B3SOIPDwistun * Inv_W + + model->B3SOIPDpistun * Inv_LW; + pParam->B3SOIPDvrec0 = model->B3SOIPDvrec0 + + model->B3SOIPDlvrec0 * Inv_L + + model->B3SOIPDwvrec0 * Inv_W + + model->B3SOIPDpvrec0 * Inv_LW; + pParam->B3SOIPDvtun0 = model->B3SOIPDvtun0 + + model->B3SOIPDlvtun0 * Inv_L + + model->B3SOIPDwvtun0 * Inv_W + + model->B3SOIPDpvtun0 * Inv_LW; + pParam->B3SOIPDnbjt = model->B3SOIPDnbjt + + model->B3SOIPDlnbjt * Inv_L + + model->B3SOIPDwnbjt * Inv_W + + model->B3SOIPDpnbjt * Inv_LW; + pParam->B3SOIPDlbjt0 = model->B3SOIPDlbjt0 + + model->B3SOIPDllbjt0 * Inv_L + + model->B3SOIPDwlbjt0 * Inv_W + + model->B3SOIPDplbjt0 * Inv_LW; + pParam->B3SOIPDvabjt = model->B3SOIPDvabjt + + model->B3SOIPDlvabjt * Inv_L + + model->B3SOIPDwvabjt * Inv_W + + model->B3SOIPDpvabjt * Inv_LW; + pParam->B3SOIPDaely = model->B3SOIPDaely + + model->B3SOIPDlaely * Inv_L + + model->B3SOIPDwaely * Inv_W + + model->B3SOIPDpaely * Inv_LW; + pParam->B3SOIPDahli = model->B3SOIPDahli + + model->B3SOIPDlahli * Inv_L + + model->B3SOIPDwahli * Inv_W + + model->B3SOIPDpahli * Inv_LW; + /* CV model */ + pParam->B3SOIPDvsdfb = model->B3SOIPDvsdfb + + model->B3SOIPDlvsdfb * Inv_L + + model->B3SOIPDwvsdfb * Inv_W + + model->B3SOIPDpvsdfb * Inv_LW; + pParam->B3SOIPDvsdth = model->B3SOIPDvsdth + + model->B3SOIPDlvsdth * Inv_L + + model->B3SOIPDwvsdth * Inv_W + + model->B3SOIPDpvsdth * Inv_LW; + pParam->B3SOIPDdelvt = model->B3SOIPDdelvt + + model->B3SOIPDldelvt * Inv_L + + model->B3SOIPDwdelvt * Inv_W + + model->B3SOIPDpdelvt * Inv_LW; + pParam->B3SOIPDacde = model->B3SOIPDacde + + model->B3SOIPDlacde * Inv_L + + model->B3SOIPDwacde * Inv_W + + model->B3SOIPDpacde * Inv_LW; + pParam->B3SOIPDmoin = model->B3SOIPDmoin + + model->B3SOIPDlmoin * Inv_L + + model->B3SOIPDwmoin * Inv_W + + model->B3SOIPDpmoin * Inv_LW; /* Added for binning - END */ - T0 = (TempRatio - 1.0); + T0 = (TempRatio - 1.0); pParam->B3SOIPDuatemp = pParam->B3SOIPDua; /* save ua, ub, and uc for b3soipdld.c */ pParam->B3SOIPDubtemp = pParam->B3SOIPDub; @@ -630,7 +630,7 @@ double tmp3, T7; /* v2.2 release */ - pParam->B3SOIPDrth = here->B3SOIPDrth0 / (pParam->B3SOIPDweff + model->B3SOIPDwth0) + pParam->B3SOIPDrth = here->B3SOIPDrth0 / (pParam->B3SOIPDweff + model->B3SOIPDwth0) * here->B3SOIPDnseg; pParam->B3SOIPDcth = here->B3SOIPDcth0 * (pParam->B3SOIPDweff + model->B3SOIPDwth0) / here->B3SOIPDnseg; @@ -645,30 +645,30 @@ double tmp3, T7; /* v2.2 release */ - pParam->B3SOIPDua = pParam->B3SOIPDua + pParam->B3SOIPDua1 * T0; - pParam->B3SOIPDub = pParam->B3SOIPDub + pParam->B3SOIPDub1 * T0; - pParam->B3SOIPDuc = pParam->B3SOIPDuc + pParam->B3SOIPDuc1 * T0; - if (pParam->B3SOIPDu0 > 1.0) + pParam->B3SOIPDua = pParam->B3SOIPDua + pParam->B3SOIPDua1 * T0; + pParam->B3SOIPDub = pParam->B3SOIPDub + pParam->B3SOIPDub1 * T0; + pParam->B3SOIPDuc = pParam->B3SOIPDuc + pParam->B3SOIPDuc1 * T0; + if (pParam->B3SOIPDu0 > 1.0) pParam->B3SOIPDu0 = pParam->B3SOIPDu0 / 1.0e4; pParam->B3SOIPDu0temp = pParam->B3SOIPDu0 - * pow(TempRatio, pParam->B3SOIPDute); - pParam->B3SOIPDvsattemp = pParam->B3SOIPDvsat - pParam->B3SOIPDat - * T0; - pParam->B3SOIPDrds0 = (pParam->B3SOIPDrdsw + pParam->B3SOIPDprt * T0) + * pow(TempRatio, pParam->B3SOIPDute); + pParam->B3SOIPDvsattemp = pParam->B3SOIPDvsat - pParam->B3SOIPDat + * T0; + pParam->B3SOIPDrds0 = (pParam->B3SOIPDrdsw + pParam->B3SOIPDprt * T0) / pow(pParam->B3SOIPDweff * 1E6, pParam->B3SOIPDwr); - if (B3SOIPDcheckModel(model, here, ckt)) - { + if (B3SOIPDcheckModel(model, here, ckt)) + { SPfrontEnd->IFerrorf (ERR_FATAL, "Fatal error(s) detected during B3SOIPDV3 parameter checking for %s in model %s", model->B3SOIPDmodName, here->B3SOIPDname); - return(E_BADPARM); - } + return(E_BADPARM); + } pParam->B3SOIPDcgdo = (model->B3SOIPDcgdo + pParam->B3SOIPDcf) - * pParam->B3SOIPDwdiodCV; + * pParam->B3SOIPDwdiodCV; pParam->B3SOIPDcgso = (model->B3SOIPDcgso + pParam->B3SOIPDcf) - * pParam->B3SOIPDwdiosCV; + * pParam->B3SOIPDwdiosCV; pParam->B3SOIPDcgeo = model->B3SOIPDcgeo * pParam->B3SOIPDleffCV; @@ -690,7 +690,7 @@ double tmp3, T7; /* v2.2.2 bug fix */ pParam->B3SOIPDahli0 = pParam->B3SOIPDahli * T0; - + pParam->B3SOIPDjbjt = pParam->B3SOIPDisbjt * T0; pParam->B3SOIPDjdif = pParam->B3SOIPDisdif * T1; pParam->B3SOIPDjrec = pParam->B3SOIPDisrec * T2; @@ -698,7 +698,7 @@ double tmp3, T7; T7 = model->B3SOIPDxtun * (TempRatio - 1); DEXP(T7, T0); pParam->B3SOIPDjtun = pParam->B3SOIPDistun * T0; - + if (pParam->B3SOIPDnsub > 0) pParam->B3SOIPDvfbb = -model->B3SOIPDtype * model->B3SOIPDvtm * @@ -716,7 +716,7 @@ double tmp3, T7; pParam->B3SOIPDvsdfb = -model->B3SOIPDtype * (model->B3SOIPDvtm*log(-1e20 / pParam->B3SOIPDnsub) + 0.3); } - + /* Phi & Gamma */ SDphi = 2.0*model->B3SOIPDvtm*log(fabs(pParam->B3SOIPDnsub) / ni); SDgamma = 5.753e-12 * sqrt(fabs(pParam->B3SOIPDnsub)) / model->B3SOIPDcbox; @@ -734,39 +734,39 @@ double tmp3, T7; if (!model->B3SOIPDcsdminGiven) { /* Cdmin */ - tmp = sqrt(2.0 * EPSSI * SDphi / (Charge_q * + tmp = sqrt(2.0 * EPSSI * SDphi / (Charge_q * fabs(pParam->B3SOIPDnsub) * 1.0e6)); tmp1 = EPSSI / tmp; model->B3SOIPDcsdmin = tmp1 * model->B3SOIPDcbox / (tmp1 + model->B3SOIPDcbox); - } + } - pParam->B3SOIPDphi = 2.0 * model->B3SOIPDvtm - * log(pParam->B3SOIPDnpeak / ni); + pParam->B3SOIPDphi = 2.0 * model->B3SOIPDvtm + * log(pParam->B3SOIPDnpeak / ni); - pParam->B3SOIPDsqrtPhi = sqrt(pParam->B3SOIPDphi); - pParam->B3SOIPDphis3 = pParam->B3SOIPDsqrtPhi * pParam->B3SOIPDphi; + pParam->B3SOIPDsqrtPhi = sqrt(pParam->B3SOIPDphi); + pParam->B3SOIPDphis3 = pParam->B3SOIPDsqrtPhi * pParam->B3SOIPDphi; pParam->B3SOIPDXdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->B3SOIPDnpeak * 1.0e6)) - * pParam->B3SOIPDsqrtPhi; + * pParam->B3SOIPDnpeak * 1.0e6)) + * pParam->B3SOIPDsqrtPhi; pParam->B3SOIPDsqrtXdep0 = sqrt(pParam->B3SOIPDXdep0); pParam->B3SOIPDlitl = sqrt(3.0 * model->B3SOIPDxj - * model->B3SOIPDtox); + * model->B3SOIPDtox); pParam->B3SOIPDvbi = model->B3SOIPDvtm * log(1.0e20 - * pParam->B3SOIPDnpeak / (ni * ni)); + * pParam->B3SOIPDnpeak / (ni * ni)); pParam->B3SOIPDcdep0 = sqrt(Charge_q * EPSSI - * pParam->B3SOIPDnpeak * 1.0e6 / 2.0 - / pParam->B3SOIPDphi); - + * pParam->B3SOIPDnpeak * 1.0e6 / 2.0 + / pParam->B3SOIPDphi); + if (model->B3SOIPDk1Given || model->B3SOIPDk2Given) - { if (!model->B3SOIPDk1Given) - { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); + { if (!model->B3SOIPDk1Given) + { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); pParam->B3SOIPDk1 = 0.53; } if (!model->B3SOIPDk2Given) - { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); + { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); pParam->B3SOIPDk2 = -0.0186; } if (model->B3SOIPDxtGiven) @@ -781,83 +781,83 @@ double tmp3, T7; fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); } else - { if (!model->B3SOIPDvbxGiven) - pParam->B3SOIPDvbx = pParam->B3SOIPDphi - 7.7348e-4 + { if (!model->B3SOIPDvbxGiven) + pParam->B3SOIPDvbx = pParam->B3SOIPDphi - 7.7348e-4 * pParam->B3SOIPDnpeak - * pParam->B3SOIPDxt * pParam->B3SOIPDxt; - if (pParam->B3SOIPDvbx > 0.0) - pParam->B3SOIPDvbx = -pParam->B3SOIPDvbx; - if (pParam->B3SOIPDvbm > 0.0) + * pParam->B3SOIPDxt * pParam->B3SOIPDxt; + if (pParam->B3SOIPDvbx > 0.0) + pParam->B3SOIPDvbx = -pParam->B3SOIPDvbx; + if (pParam->B3SOIPDvbm > 0.0) pParam->B3SOIPDvbm = -pParam->B3SOIPDvbm; - + if (!model->B3SOIPDgamma1Given) pParam->B3SOIPDgamma1 = 5.753e-12 - * sqrt(pParam->B3SOIPDnpeak) + * sqrt(pParam->B3SOIPDnpeak) / model->B3SOIPDcox; if (!model->B3SOIPDgamma2Given) pParam->B3SOIPDgamma2 = 5.753e-12 - * sqrt(pParam->B3SOIPDnsub) + * sqrt(pParam->B3SOIPDnsub) / model->B3SOIPDcox; T0 = pParam->B3SOIPDgamma1 - pParam->B3SOIPDgamma2; T1 = sqrt(pParam->B3SOIPDphi - pParam->B3SOIPDvbx) - - pParam->B3SOIPDsqrtPhi; + - pParam->B3SOIPDsqrtPhi; T2 = sqrt(pParam->B3SOIPDphi * (pParam->B3SOIPDphi - - pParam->B3SOIPDvbm)) - pParam->B3SOIPDphi; + - pParam->B3SOIPDvbm)) - pParam->B3SOIPDphi; pParam->B3SOIPDk2 = T0 * T1 / (2.0 * T2 + pParam->B3SOIPDvbm); pParam->B3SOIPDk1 = pParam->B3SOIPDgamma2 - 2.0 - * pParam->B3SOIPDk2 * sqrt(pParam->B3SOIPDphi - - pParam->B3SOIPDvbm); + * pParam->B3SOIPDk2 * sqrt(pParam->B3SOIPDphi + - pParam->B3SOIPDvbm); } - - if (pParam->B3SOIPDk2 < 0.0) - { T0 = 0.5 * pParam->B3SOIPDk1 / pParam->B3SOIPDk2; + + if (pParam->B3SOIPDk2 < 0.0) + { T0 = 0.5 * pParam->B3SOIPDk1 / pParam->B3SOIPDk2; pParam->B3SOIPDvbsc = 0.9 * (pParam->B3SOIPDphi - T0 * T0); - if (pParam->B3SOIPDvbsc > -3.0) - pParam->B3SOIPDvbsc = -3.0; - else if (pParam->B3SOIPDvbsc < -30.0) - pParam->B3SOIPDvbsc = -30.0; - } - else - { pParam->B3SOIPDvbsc = -30.0; - } - if (pParam->B3SOIPDvbsc > pParam->B3SOIPDvbm) - pParam->B3SOIPDvbsc = pParam->B3SOIPDvbm; + if (pParam->B3SOIPDvbsc > -3.0) + pParam->B3SOIPDvbsc = -3.0; + else if (pParam->B3SOIPDvbsc < -30.0) + pParam->B3SOIPDvbsc = -30.0; + } + else + { pParam->B3SOIPDvbsc = -30.0; + } + if (pParam->B3SOIPDvbsc > pParam->B3SOIPDvbm) + pParam->B3SOIPDvbsc = pParam->B3SOIPDvbm; if ((T0 = pParam->B3SOIPDweff + pParam->B3SOIPDk1w2) < 1e-8) T0 = 1e-8; pParam->B3SOIPDk1eff = pParam->B3SOIPDk1 * (1 + pParam->B3SOIPDk1w1/T0); - if (model->B3SOIPDvth0Given) - { pParam->B3SOIPDvfb = model->B3SOIPDtype * pParam->B3SOIPDvth0 - - pParam->B3SOIPDphi - pParam->B3SOIPDk1eff + if (model->B3SOIPDvth0Given) + { pParam->B3SOIPDvfb = model->B3SOIPDtype * pParam->B3SOIPDvth0 + - pParam->B3SOIPDphi - pParam->B3SOIPDk1eff * pParam->B3SOIPDsqrtPhi; - } - else - { pParam->B3SOIPDvfb = -1.0; - pParam->B3SOIPDvth0 = model->B3SOIPDtype * (pParam->B3SOIPDvfb - + pParam->B3SOIPDphi + pParam->B3SOIPDk1eff + } + else + { pParam->B3SOIPDvfb = -1.0; + pParam->B3SOIPDvth0 = model->B3SOIPDtype * (pParam->B3SOIPDvfb + + pParam->B3SOIPDphi + pParam->B3SOIPDk1eff * pParam->B3SOIPDsqrtPhi); - } + } T1 = sqrt(EPSSI / EPSOX * model->B3SOIPDtox - * pParam->B3SOIPDXdep0); + * pParam->B3SOIPDXdep0); T0 = exp(-0.5 * pParam->B3SOIPDdsub * pParam->B3SOIPDleff / T1); pParam->B3SOIPDtheta0vb0 = (T0 + 2.0 * T0 * T0); T0 = exp(-0.5 * pParam->B3SOIPDdrout * pParam->B3SOIPDleff / T1); T2 = (T0 + 2.0 * T0 * T0); pParam->B3SOIPDthetaRout = pParam->B3SOIPDpdibl1 * T2 - + pParam->B3SOIPDpdibl2; - } + + pParam->B3SOIPDpdibl2; + } here->B3SOIPDcsbox = model->B3SOIPDcbox*here->B3SOIPDsourceArea; here->B3SOIPDcsmin = model->B3SOIPDcsdmin*here->B3SOIPDsourceArea; here->B3SOIPDcdbox = model->B3SOIPDcbox*here->B3SOIPDdrainArea; here->B3SOIPDcdmin = model->B3SOIPDcsdmin*here->B3SOIPDdrainArea; - if ( ((pParam->B3SOIPDnsub > 0) && (model->B3SOIPDtype > 0)) || - ((pParam->B3SOIPDnsub < 0) && (model->B3SOIPDtype < 0)) ) - { + if ( ((pParam->B3SOIPDnsub > 0) && (model->B3SOIPDtype > 0)) || + ((pParam->B3SOIPDnsub < 0) && (model->B3SOIPDtype < 0)) ) + { T0 = pParam->B3SOIPDvsdth - pParam->B3SOIPDvsdfb; pParam->B3SOIPDsdt1 = pParam->B3SOIPDvsdfb + model->B3SOIPDasd * T0; T1 = here->B3SOIPDcsbox - here->B3SOIPDcsmin; @@ -873,8 +873,8 @@ double tmp3, T7; pParam->B3SOIPDdt3 = T2 /( 1 - model->B3SOIPDasd); here->B3SOIPDdt4 = T0 * T1 * (1 + model->B3SOIPDasd) / 3 - here->B3SOIPDcdmin * pParam->B3SOIPDvsdfb; - } else - { + } else + { T0 = pParam->B3SOIPDvsdfb - pParam->B3SOIPDvsdth; pParam->B3SOIPDsdt1 = pParam->B3SOIPDvsdth + model->B3SOIPDasd * T0; T1 = here->B3SOIPDcsmin - here->B3SOIPDcsbox; @@ -883,21 +883,21 @@ double tmp3, T7; pParam->B3SOIPDst3 = T2 /( 1 - model->B3SOIPDasd); here->B3SOIPDst4 = T0 * T1 * (1 + model->B3SOIPDasd) / 3 - here->B3SOIPDcsbox * pParam->B3SOIPDvsdth; - + T1 = here->B3SOIPDcdmin - here->B3SOIPDcdbox; T2 = T1 / T0 / T0; pParam->B3SOIPDdt2 = T2 / model->B3SOIPDasd; pParam->B3SOIPDdt3 = T2 /( 1 - model->B3SOIPDasd); here->B3SOIPDdt4 = T0 * T1 * (1 + model->B3SOIPDasd) / 3 - here->B3SOIPDcdbox * pParam->B3SOIPDvsdth; - } + } /* v2.2.2 bug fix */ T0 = model->B3SOIPDcsdesw * log(1 + model->B3SOIPDtsi / model->B3SOIPDtbox); T1 = here->B3SOIPDsourcePerimeter - here->B3SOIPDw; if (T1 > 0.0) - here->B3SOIPDcsesw = T0 * T1; + here->B3SOIPDcsesw = T0 * T1; else here->B3SOIPDcsesw = 0.0; T1 = here->B3SOIPDdrainPerimeter - here->B3SOIPDw; @@ -907,25 +907,25 @@ double tmp3, T7; here->B3SOIPDcdesw = 0.0; - here->B3SOIPDphi = pParam->B3SOIPDphi; + here->B3SOIPDphi = pParam->B3SOIPDphi; /* process source/drain series resistance */ - here->B3SOIPDdrainConductance = model->B3SOIPDsheetResistance - * here->B3SOIPDdrainSquares; + here->B3SOIPDdrainConductance = model->B3SOIPDsheetResistance + * here->B3SOIPDdrainSquares; if (here->B3SOIPDdrainConductance > 0.0) here->B3SOIPDdrainConductance = 1.0 - / here->B3SOIPDdrainConductance; - else + / here->B3SOIPDdrainConductance; + else here->B3SOIPDdrainConductance = 0.0; - - here->B3SOIPDsourceConductance = model->B3SOIPDsheetResistance - * here->B3SOIPDsourceSquares; - if (here->B3SOIPDsourceConductance > 0.0) + + here->B3SOIPDsourceConductance = model->B3SOIPDsheetResistance + * here->B3SOIPDsourceSquares; + if (here->B3SOIPDsourceConductance > 0.0) here->B3SOIPDsourceConductance = 1.0 - / here->B3SOIPDsourceConductance; - else + / here->B3SOIPDsourceConductance; + else here->B3SOIPDsourceConductance = 0.0; - here->B3SOIPDcgso = pParam->B3SOIPDcgso; - here->B3SOIPDcgdo = pParam->B3SOIPDcgdo; + here->B3SOIPDcgso = pParam->B3SOIPDcgso; + here->B3SOIPDcgdo = pParam->B3SOIPDcgdo; /* v2.0 release */ @@ -938,8 +938,8 @@ double tmp3, T7; pParam->B3SOIPDlratio = pow(T0,pParam->B3SOIPDnbjt); pParam->B3SOIPDlratiodif = 1.0 + model->B3SOIPDldif0 * pow(T0,model->B3SOIPDndif); - if ((pParam->B3SOIPDvearly = pParam->B3SOIPDvabjt + pParam->B3SOIPDaely * pParam->B3SOIPDleff) < 1) - pParam->B3SOIPDvearly = 1; + if ((pParam->B3SOIPDvearly = pParam->B3SOIPDvabjt + pParam->B3SOIPDaely * pParam->B3SOIPDleff) < 1) + pParam->B3SOIPDvearly = 1; /* vfbzb calculation for capMod 3 */ tmp = sqrt(pParam->B3SOIPDXdep0); diff --git a/src/spicelib/devices/bsim3v0/b3v0temp.c b/src/spicelib/devices/bsim3v0/b3v0temp.c index d5ab05c1b..99a2e258a 100644 --- a/src/spicelib/devices/bsim3v0/b3v0temp.c +++ b/src/spicelib/devices/bsim3v0/b3v0temp.c @@ -38,8 +38,8 @@ int Size_Not_Found; /* loop through all the BSIM3v0 device models */ for (; model != NULL; model = BSIM3v0nextModel(model)) { Temp = ckt->CKTtemp; - if (model->BSIM3v0bulkJctPotential < 0.1) - model->BSIM3v0bulkJctPotential = 0.1; + if (model->BSIM3v0bulkJctPotential < 0.1) + model->BSIM3v0bulkJctPotential = 0.1; if (model->BSIM3v0sidewallJctPotential < 0.1) model->BSIM3v0sidewallJctPotential = 0.1; @@ -50,41 +50,41 @@ int Size_Not_Found; p = next_p; } model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; + pLastKnot = NULL; - Tnom = model->BSIM3v0tnom; - TRatio = Temp / Tnom; - - /* loop through all the instances of the model */ + Tnom = model->BSIM3v0tnom; + TRatio = Temp / Tnom; + + /* loop through all the instances of the model */ for (here = BSIM3v0instances(model); here != NULL; - here=BSIM3v0nextInstance(here)) - { - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->BSIM3v0l == pSizeDependParamKnot->Length) - && (here->BSIM3v0w == pSizeDependParamKnot->Width)) + here=BSIM3v0nextInstance(here)) + { + pSizeDependParamKnot = model->pSizeDependParamKnot; + Size_Not_Found = 1; + while ((pSizeDependParamKnot != NULL) && Size_Not_Found) + { if ((here->BSIM3v0l == pSizeDependParamKnot->Length) + && (here->BSIM3v0w == pSizeDependParamKnot->Width)) { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } + here->pParam = pSizeDependParamKnot; + } + else + { pLastKnot = pSizeDependParamKnot; + pSizeDependParamKnot = pSizeDependParamKnot->pNext; + } } - if (Size_Not_Found) - { pParam = TMALLOC(struct bsim3v0SizeDependParam, 1); + if (Size_Not_Found) + { pParam = TMALLOC(struct bsim3v0SizeDependParam, 1); if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; + model->pSizeDependParamKnot = pParam; else - pLastKnot->pNext = pParam; + pLastKnot->pNext = pParam; pParam->pNext = NULL; here->pParam = pParam; - Ldrn = here->BSIM3v0l; - Wdrn = here->BSIM3v0w; - + Ldrn = here->BSIM3v0l; + Wdrn = here->BSIM3v0w; + T0 = pow(Ldrn, model->BSIM3v0Lln); T1 = pow(Wdrn, model->BSIM3v0Lwn); tmp1 = model->BSIM3v0Ll / T0 + model->BSIM3v0Lw / T1 @@ -101,7 +101,7 @@ int Size_Not_Found; pParam->BSIM3v0leff = here->BSIM3v0l - 2.0 * pParam->BSIM3v0dl; if (pParam->BSIM3v0leff <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "BSIM3v0: mosfet %s, model %s: Effective channel length <= 0", model->BSIM3v0modName, here->BSIM3v0name); @@ -110,7 +110,7 @@ int Size_Not_Found; pParam->BSIM3v0weff = here->BSIM3v0w - 2.0 * pParam->BSIM3v0dw; if (pParam->BSIM3v0weff <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "BSIM3v0: mosfet %s, model %s: Effective channel width <= 0", model->BSIM3v0modName, here->BSIM3v0name); @@ -119,7 +119,7 @@ int Size_Not_Found; pParam->BSIM3v0leffCV = here->BSIM3v0l - 2.0 * pParam->BSIM3v0dlc; if (pParam->BSIM3v0leffCV <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "BSIM3v0: mosfet %s, model %s: Effective channel length for C-V <= 0", model->BSIM3v0modName, here->BSIM3v0name); @@ -128,359 +128,359 @@ int Size_Not_Found; pParam->BSIM3v0weffCV = here->BSIM3v0w - 2.0 * pParam->BSIM3v0dwc; if (pParam->BSIM3v0weffCV <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "BSIM3v0: mosfet %s, model %s: Effective channel width for C-V <= 0", model->BSIM3v0modName, here->BSIM3v0name); return(E_BADPARM); } - model->BSIM3v0vcrit = CONSTvt0 * log(CONSTvt0 - / (CONSTroot2 * 1.0e-14)); + model->BSIM3v0vcrit = CONSTvt0 * log(CONSTvt0 + / (CONSTroot2 * 1.0e-14)); model->BSIM3v0factor1 = sqrt(EPSSI / EPSOX * model->BSIM3v0tox); - if (model->BSIM3v0binUnit == 1) - { Inv_L = 1.0e-6 / pParam->BSIM3v0leff; - Inv_W = 1.0e-6 / pParam->BSIM3v0weff; - Inv_LW = 1.0e-12 / (pParam->BSIM3v0leff - * pParam->BSIM3v0weff); - } - else - { Inv_L = 1.0 / pParam->BSIM3v0leff; - Inv_W = 1.0 / pParam->BSIM3v0weff; - Inv_LW = 1.0 / (pParam->BSIM3v0leff - * pParam->BSIM3v0weff); - } - pParam->BSIM3v0cdsc = model->BSIM3v0cdsc - + model->BSIM3v0lcdsc * Inv_L - + model->BSIM3v0wcdsc * Inv_W - + model->BSIM3v0pcdsc * Inv_LW; - pParam->BSIM3v0cdscb = model->BSIM3v0cdscb - + model->BSIM3v0lcdscb * Inv_L - + model->BSIM3v0wcdscb * Inv_W - + model->BSIM3v0pcdscb * Inv_LW; - - pParam->BSIM3v0cdscd = model->BSIM3v0cdscd - + model->BSIM3v0lcdscd * Inv_L - + model->BSIM3v0wcdscd * Inv_W - + model->BSIM3v0pcdscd * Inv_LW; - - pParam->BSIM3v0cit = model->BSIM3v0cit - + model->BSIM3v0lcit * Inv_L - + model->BSIM3v0wcit * Inv_W - + model->BSIM3v0pcit * Inv_LW; - pParam->BSIM3v0nfactor = model->BSIM3v0nfactor - + model->BSIM3v0lnfactor * Inv_L - + model->BSIM3v0wnfactor * Inv_W - + model->BSIM3v0pnfactor * Inv_LW; - pParam->BSIM3v0xj = model->BSIM3v0xj - + model->BSIM3v0lxj * Inv_L - + model->BSIM3v0wxj * Inv_W - + model->BSIM3v0pxj * Inv_LW; - pParam->BSIM3v0vsat = model->BSIM3v0vsat - + model->BSIM3v0lvsat * Inv_L - + model->BSIM3v0wvsat * Inv_W - + model->BSIM3v0pvsat * Inv_LW; - pParam->BSIM3v0at = model->BSIM3v0at - + model->BSIM3v0lat * Inv_L - + model->BSIM3v0wat * Inv_W - + model->BSIM3v0pat * Inv_LW; - pParam->BSIM3v0a0 = model->BSIM3v0a0 - + model->BSIM3v0la0 * Inv_L - + model->BSIM3v0wa0 * Inv_W - + model->BSIM3v0pa0 * Inv_LW; - - pParam->BSIM3v0ags = model->BSIM3v0ags - + model->BSIM3v0lags * Inv_L - + model->BSIM3v0wags * Inv_W - + model->BSIM3v0pags * Inv_LW; - - pParam->BSIM3v0a1 = model->BSIM3v0a1 - + model->BSIM3v0la1 * Inv_L - + model->BSIM3v0wa1 * Inv_W - + model->BSIM3v0pa1 * Inv_LW; - pParam->BSIM3v0a2 = model->BSIM3v0a2 - + model->BSIM3v0la2 * Inv_L - + model->BSIM3v0wa2 * Inv_W - + model->BSIM3v0pa2 * Inv_LW; - pParam->BSIM3v0keta = model->BSIM3v0keta - + model->BSIM3v0lketa * Inv_L - + model->BSIM3v0wketa * Inv_W - + model->BSIM3v0pketa * Inv_LW; - pParam->BSIM3v0nsub = model->BSIM3v0nsub - + model->BSIM3v0lnsub * Inv_L - + model->BSIM3v0wnsub * Inv_W - + model->BSIM3v0pnsub * Inv_LW; - pParam->BSIM3v0npeak = model->BSIM3v0npeak - + model->BSIM3v0lnpeak * Inv_L - + model->BSIM3v0wnpeak * Inv_W - + model->BSIM3v0pnpeak * Inv_LW; - pParam->BSIM3v0ngate = model->BSIM3v0ngate - + model->BSIM3v0lngate * Inv_L - + model->BSIM3v0wngate * Inv_W - + model->BSIM3v0pngate * Inv_LW; - pParam->BSIM3v0gamma1 = model->BSIM3v0gamma1 - + model->BSIM3v0lgamma1 * Inv_L - + model->BSIM3v0wgamma1 * Inv_W - + model->BSIM3v0pgamma1 * Inv_LW; - pParam->BSIM3v0gamma2 = model->BSIM3v0gamma2 - + model->BSIM3v0lgamma2 * Inv_L - + model->BSIM3v0wgamma2 * Inv_W - + model->BSIM3v0pgamma2 * Inv_LW; - pParam->BSIM3v0vbx = model->BSIM3v0vbx - + model->BSIM3v0lvbx * Inv_L - + model->BSIM3v0wvbx * Inv_W - + model->BSIM3v0pvbx * Inv_LW; - pParam->BSIM3v0vbm = model->BSIM3v0vbm - + model->BSIM3v0lvbm * Inv_L - + model->BSIM3v0wvbm * Inv_W - + model->BSIM3v0pvbm * Inv_LW; - pParam->BSIM3v0xt = model->BSIM3v0xt - + model->BSIM3v0lxt * Inv_L - + model->BSIM3v0wxt * Inv_W - + model->BSIM3v0pxt * Inv_LW; - pParam->BSIM3v0k1 = model->BSIM3v0k1 - + model->BSIM3v0lk1 * Inv_L - + model->BSIM3v0wk1 * Inv_W - + model->BSIM3v0pk1 * Inv_LW; - pParam->BSIM3v0kt1 = model->BSIM3v0kt1 - + model->BSIM3v0lkt1 * Inv_L - + model->BSIM3v0wkt1 * Inv_W - + model->BSIM3v0pkt1 * Inv_LW; - pParam->BSIM3v0kt1l = model->BSIM3v0kt1l - + model->BSIM3v0lkt1l * Inv_L - + model->BSIM3v0wkt1l * Inv_W - + model->BSIM3v0pkt1l * Inv_LW; - pParam->BSIM3v0k2 = model->BSIM3v0k2 - + model->BSIM3v0lk2 * Inv_L - + model->BSIM3v0wk2 * Inv_W - + model->BSIM3v0pk2 * Inv_LW; - pParam->BSIM3v0kt2 = model->BSIM3v0kt2 - + model->BSIM3v0lkt2 * Inv_L - + model->BSIM3v0wkt2 * Inv_W - + model->BSIM3v0pkt2 * Inv_LW; - pParam->BSIM3v0k3 = model->BSIM3v0k3 - + model->BSIM3v0lk3 * Inv_L - + model->BSIM3v0wk3 * Inv_W - + model->BSIM3v0pk3 * Inv_LW; - pParam->BSIM3v0k3b = model->BSIM3v0k3b - + model->BSIM3v0lk3b * Inv_L - + model->BSIM3v0wk3b * Inv_W - + model->BSIM3v0pk3b * Inv_LW; - pParam->BSIM3v0w0 = model->BSIM3v0w0 - + model->BSIM3v0lw0 * Inv_L - + model->BSIM3v0ww0 * Inv_W - + model->BSIM3v0pw0 * Inv_LW; - pParam->BSIM3v0nlx = model->BSIM3v0nlx - + model->BSIM3v0lnlx * Inv_L - + model->BSIM3v0wnlx * Inv_W - + model->BSIM3v0pnlx * Inv_LW; - pParam->BSIM3v0dvt0 = model->BSIM3v0dvt0 - + model->BSIM3v0ldvt0 * Inv_L - + model->BSIM3v0wdvt0 * Inv_W - + model->BSIM3v0pdvt0 * Inv_LW; - pParam->BSIM3v0dvt1 = model->BSIM3v0dvt1 - + model->BSIM3v0ldvt1 * Inv_L - + model->BSIM3v0wdvt1 * Inv_W - + model->BSIM3v0pdvt1 * Inv_LW; - pParam->BSIM3v0dvt2 = model->BSIM3v0dvt2 - + model->BSIM3v0ldvt2 * Inv_L - + model->BSIM3v0wdvt2 * Inv_W - + model->BSIM3v0pdvt2 * Inv_LW; - pParam->BSIM3v0dvt0w = model->BSIM3v0dvt0w - + model->BSIM3v0ldvt0w * Inv_L - + model->BSIM3v0wdvt0w * Inv_W - + model->BSIM3v0pdvt0w * Inv_LW; - pParam->BSIM3v0dvt1w = model->BSIM3v0dvt1w - + model->BSIM3v0ldvt1w * Inv_L - + model->BSIM3v0wdvt1w * Inv_W - + model->BSIM3v0pdvt1w * Inv_LW; - pParam->BSIM3v0dvt2w = model->BSIM3v0dvt2w - + model->BSIM3v0ldvt2w * Inv_L - + model->BSIM3v0wdvt2w * Inv_W - + model->BSIM3v0pdvt2w * Inv_LW; - pParam->BSIM3v0drout = model->BSIM3v0drout - + model->BSIM3v0ldrout * Inv_L - + model->BSIM3v0wdrout * Inv_W - + model->BSIM3v0pdrout * Inv_LW; - pParam->BSIM3v0dsub = model->BSIM3v0dsub - + model->BSIM3v0ldsub * Inv_L - + model->BSIM3v0wdsub * Inv_W - + model->BSIM3v0pdsub * Inv_LW; - pParam->BSIM3v0vth0 = model->BSIM3v0vth0 - + model->BSIM3v0lvth0 * Inv_L - + model->BSIM3v0wvth0 * Inv_W - + model->BSIM3v0pvth0 * Inv_LW; - pParam->BSIM3v0ua = model->BSIM3v0ua - + model->BSIM3v0lua * Inv_L - + model->BSIM3v0wua * Inv_W - + model->BSIM3v0pua * Inv_LW; - pParam->BSIM3v0ua1 = model->BSIM3v0ua1 - + model->BSIM3v0lua1 * Inv_L - + model->BSIM3v0wua1 * Inv_W - + model->BSIM3v0pua1 * Inv_LW; - pParam->BSIM3v0ub = model->BSIM3v0ub - + model->BSIM3v0lub * Inv_L - + model->BSIM3v0wub * Inv_W - + model->BSIM3v0pub * Inv_LW; - pParam->BSIM3v0ub1 = model->BSIM3v0ub1 - + model->BSIM3v0lub1 * Inv_L - + model->BSIM3v0wub1 * Inv_W - + model->BSIM3v0pub1 * Inv_LW; - pParam->BSIM3v0uc = model->BSIM3v0uc - + model->BSIM3v0luc * Inv_L - + model->BSIM3v0wuc * Inv_W - + model->BSIM3v0puc * Inv_LW; - pParam->BSIM3v0uc1 = model->BSIM3v0uc1 - + model->BSIM3v0luc1 * Inv_L - + model->BSIM3v0wuc1 * Inv_W - + model->BSIM3v0puc1 * Inv_LW; - pParam->BSIM3v0u0 = model->BSIM3v0u0 - + model->BSIM3v0lu0 * Inv_L - + model->BSIM3v0wu0 * Inv_W - + model->BSIM3v0pu0 * Inv_LW; - pParam->BSIM3v0ute = model->BSIM3v0ute - + model->BSIM3v0lute * Inv_L - + model->BSIM3v0wute * Inv_W - + model->BSIM3v0pute * Inv_LW; - pParam->BSIM3v0voff = model->BSIM3v0voff - + model->BSIM3v0lvoff * Inv_L - + model->BSIM3v0wvoff * Inv_W - + model->BSIM3v0pvoff * Inv_LW; - pParam->BSIM3v0delta = model->BSIM3v0delta - + model->BSIM3v0ldelta * Inv_L - + model->BSIM3v0wdelta * Inv_W - + model->BSIM3v0pdelta * Inv_LW; - pParam->BSIM3v0rdsw = model->BSIM3v0rdsw - + model->BSIM3v0lrdsw * Inv_L - + model->BSIM3v0wrdsw * Inv_W - + model->BSIM3v0prdsw * Inv_LW; - pParam->BSIM3v0prwg = model->BSIM3v0prwg - + model->BSIM3v0lprwg * Inv_L - + model->BSIM3v0wprwg * Inv_W - + model->BSIM3v0pprwg * Inv_LW; - pParam->BSIM3v0prwb = model->BSIM3v0prwb - + model->BSIM3v0lprwb * Inv_L - + model->BSIM3v0wprwb * Inv_W - + model->BSIM3v0pprwb * Inv_LW; - pParam->BSIM3v0prt = model->BSIM3v0prt - + model->BSIM3v0lprt * Inv_L - + model->BSIM3v0wprt * Inv_W - + model->BSIM3v0pprt * Inv_LW; - pParam->BSIM3v0eta0 = model->BSIM3v0eta0 - + model->BSIM3v0leta0 * Inv_L - + model->BSIM3v0weta0 * Inv_W - + model->BSIM3v0peta0 * Inv_LW; - pParam->BSIM3v0etab = model->BSIM3v0etab - + model->BSIM3v0letab * Inv_L - + model->BSIM3v0wetab * Inv_W - + model->BSIM3v0petab * Inv_LW; - pParam->BSIM3v0pclm = model->BSIM3v0pclm - + model->BSIM3v0lpclm * Inv_L - + model->BSIM3v0wpclm * Inv_W - + model->BSIM3v0ppclm * Inv_LW; - pParam->BSIM3v0pdibl1 = model->BSIM3v0pdibl1 - + model->BSIM3v0lpdibl1 * Inv_L - + model->BSIM3v0wpdibl1 * Inv_W - + model->BSIM3v0ppdibl1 * Inv_LW; - pParam->BSIM3v0pdibl2 = model->BSIM3v0pdibl2 - + model->BSIM3v0lpdibl2 * Inv_L - + model->BSIM3v0wpdibl2 * Inv_W - + model->BSIM3v0ppdibl2 * Inv_LW; - pParam->BSIM3v0pdiblb = model->BSIM3v0pdiblb - + model->BSIM3v0lpdiblb * Inv_L - + model->BSIM3v0wpdiblb * Inv_W - + model->BSIM3v0ppdiblb * Inv_LW; - pParam->BSIM3v0pscbe1 = model->BSIM3v0pscbe1 - + model->BSIM3v0lpscbe1 * Inv_L - + model->BSIM3v0wpscbe1 * Inv_W - + model->BSIM3v0ppscbe1 * Inv_LW; - pParam->BSIM3v0pscbe2 = model->BSIM3v0pscbe2 - + model->BSIM3v0lpscbe2 * Inv_L - + model->BSIM3v0wpscbe2 * Inv_W - + model->BSIM3v0ppscbe2 * Inv_LW; - pParam->BSIM3v0pvag = model->BSIM3v0pvag - + model->BSIM3v0lpvag * Inv_L - + model->BSIM3v0wpvag * Inv_W - + model->BSIM3v0ppvag * Inv_LW; - pParam->BSIM3v0wr = model->BSIM3v0wr - + model->BSIM3v0lwr * Inv_L - + model->BSIM3v0wwr * Inv_W - + model->BSIM3v0pwr * Inv_LW; - pParam->BSIM3v0dwg = model->BSIM3v0dwg - + model->BSIM3v0ldwg * Inv_L - + model->BSIM3v0wdwg * Inv_W - + model->BSIM3v0pdwg * Inv_LW; - pParam->BSIM3v0dwb = model->BSIM3v0dwb - + model->BSIM3v0ldwb * Inv_L - + model->BSIM3v0wdwb * Inv_W - + model->BSIM3v0pdwb * Inv_LW; - pParam->BSIM3v0b0 = model->BSIM3v0b0 - + model->BSIM3v0lb0 * Inv_L - + model->BSIM3v0wb0 * Inv_W - + model->BSIM3v0pb0 * Inv_LW; - pParam->BSIM3v0b1 = model->BSIM3v0b1 - + model->BSIM3v0lb1 * Inv_L - + model->BSIM3v0wb1 * Inv_W - + model->BSIM3v0pb1 * Inv_LW; - pParam->BSIM3v0alpha0 = model->BSIM3v0alpha0 - + model->BSIM3v0lalpha0 * Inv_L - + model->BSIM3v0walpha0 * Inv_W - + model->BSIM3v0palpha0 * Inv_LW; - pParam->BSIM3v0beta0 = model->BSIM3v0beta0 - + model->BSIM3v0lbeta0 * Inv_L - + model->BSIM3v0wbeta0 * Inv_W - + model->BSIM3v0pbeta0 * Inv_LW; - /* CV model */ - pParam->BSIM3v0elm = model->BSIM3v0elm - + model->BSIM3v0lelm * Inv_L - + model->BSIM3v0welm * Inv_W - + model->BSIM3v0pelm * Inv_LW; - pParam->BSIM3v0cgsl = model->BSIM3v0cgsl - + model->BSIM3v0lcgsl * Inv_L - + model->BSIM3v0wcgsl * Inv_W - + model->BSIM3v0pcgsl * Inv_LW; - pParam->BSIM3v0cgdl = model->BSIM3v0cgdl - + model->BSIM3v0lcgdl * Inv_L - + model->BSIM3v0wcgdl * Inv_W - + model->BSIM3v0pcgdl * Inv_LW; - pParam->BSIM3v0ckappa = model->BSIM3v0ckappa - + model->BSIM3v0lckappa * Inv_L - + model->BSIM3v0wckappa * Inv_W - + model->BSIM3v0pckappa * Inv_LW; - pParam->BSIM3v0cf = model->BSIM3v0cf - + model->BSIM3v0lcf * Inv_L - + model->BSIM3v0wcf * Inv_W - + model->BSIM3v0pcf * Inv_LW; - pParam->BSIM3v0clc = model->BSIM3v0clc - + model->BSIM3v0lclc * Inv_L - + model->BSIM3v0wclc * Inv_W - + model->BSIM3v0pclc * Inv_LW; - pParam->BSIM3v0cle = model->BSIM3v0cle - + model->BSIM3v0lcle * Inv_L - + model->BSIM3v0wcle * Inv_W - + model->BSIM3v0pcle * Inv_LW; + if (model->BSIM3v0binUnit == 1) + { Inv_L = 1.0e-6 / pParam->BSIM3v0leff; + Inv_W = 1.0e-6 / pParam->BSIM3v0weff; + Inv_LW = 1.0e-12 / (pParam->BSIM3v0leff + * pParam->BSIM3v0weff); + } + else + { Inv_L = 1.0 / pParam->BSIM3v0leff; + Inv_W = 1.0 / pParam->BSIM3v0weff; + Inv_LW = 1.0 / (pParam->BSIM3v0leff + * pParam->BSIM3v0weff); + } + pParam->BSIM3v0cdsc = model->BSIM3v0cdsc + + model->BSIM3v0lcdsc * Inv_L + + model->BSIM3v0wcdsc * Inv_W + + model->BSIM3v0pcdsc * Inv_LW; + pParam->BSIM3v0cdscb = model->BSIM3v0cdscb + + model->BSIM3v0lcdscb * Inv_L + + model->BSIM3v0wcdscb * Inv_W + + model->BSIM3v0pcdscb * Inv_LW; + + pParam->BSIM3v0cdscd = model->BSIM3v0cdscd + + model->BSIM3v0lcdscd * Inv_L + + model->BSIM3v0wcdscd * Inv_W + + model->BSIM3v0pcdscd * Inv_LW; + + pParam->BSIM3v0cit = model->BSIM3v0cit + + model->BSIM3v0lcit * Inv_L + + model->BSIM3v0wcit * Inv_W + + model->BSIM3v0pcit * Inv_LW; + pParam->BSIM3v0nfactor = model->BSIM3v0nfactor + + model->BSIM3v0lnfactor * Inv_L + + model->BSIM3v0wnfactor * Inv_W + + model->BSIM3v0pnfactor * Inv_LW; + pParam->BSIM3v0xj = model->BSIM3v0xj + + model->BSIM3v0lxj * Inv_L + + model->BSIM3v0wxj * Inv_W + + model->BSIM3v0pxj * Inv_LW; + pParam->BSIM3v0vsat = model->BSIM3v0vsat + + model->BSIM3v0lvsat * Inv_L + + model->BSIM3v0wvsat * Inv_W + + model->BSIM3v0pvsat * Inv_LW; + pParam->BSIM3v0at = model->BSIM3v0at + + model->BSIM3v0lat * Inv_L + + model->BSIM3v0wat * Inv_W + + model->BSIM3v0pat * Inv_LW; + pParam->BSIM3v0a0 = model->BSIM3v0a0 + + model->BSIM3v0la0 * Inv_L + + model->BSIM3v0wa0 * Inv_W + + model->BSIM3v0pa0 * Inv_LW; + + pParam->BSIM3v0ags = model->BSIM3v0ags + + model->BSIM3v0lags * Inv_L + + model->BSIM3v0wags * Inv_W + + model->BSIM3v0pags * Inv_LW; + + pParam->BSIM3v0a1 = model->BSIM3v0a1 + + model->BSIM3v0la1 * Inv_L + + model->BSIM3v0wa1 * Inv_W + + model->BSIM3v0pa1 * Inv_LW; + pParam->BSIM3v0a2 = model->BSIM3v0a2 + + model->BSIM3v0la2 * Inv_L + + model->BSIM3v0wa2 * Inv_W + + model->BSIM3v0pa2 * Inv_LW; + pParam->BSIM3v0keta = model->BSIM3v0keta + + model->BSIM3v0lketa * Inv_L + + model->BSIM3v0wketa * Inv_W + + model->BSIM3v0pketa * Inv_LW; + pParam->BSIM3v0nsub = model->BSIM3v0nsub + + model->BSIM3v0lnsub * Inv_L + + model->BSIM3v0wnsub * Inv_W + + model->BSIM3v0pnsub * Inv_LW; + pParam->BSIM3v0npeak = model->BSIM3v0npeak + + model->BSIM3v0lnpeak * Inv_L + + model->BSIM3v0wnpeak * Inv_W + + model->BSIM3v0pnpeak * Inv_LW; + pParam->BSIM3v0ngate = model->BSIM3v0ngate + + model->BSIM3v0lngate * Inv_L + + model->BSIM3v0wngate * Inv_W + + model->BSIM3v0pngate * Inv_LW; + pParam->BSIM3v0gamma1 = model->BSIM3v0gamma1 + + model->BSIM3v0lgamma1 * Inv_L + + model->BSIM3v0wgamma1 * Inv_W + + model->BSIM3v0pgamma1 * Inv_LW; + pParam->BSIM3v0gamma2 = model->BSIM3v0gamma2 + + model->BSIM3v0lgamma2 * Inv_L + + model->BSIM3v0wgamma2 * Inv_W + + model->BSIM3v0pgamma2 * Inv_LW; + pParam->BSIM3v0vbx = model->BSIM3v0vbx + + model->BSIM3v0lvbx * Inv_L + + model->BSIM3v0wvbx * Inv_W + + model->BSIM3v0pvbx * Inv_LW; + pParam->BSIM3v0vbm = model->BSIM3v0vbm + + model->BSIM3v0lvbm * Inv_L + + model->BSIM3v0wvbm * Inv_W + + model->BSIM3v0pvbm * Inv_LW; + pParam->BSIM3v0xt = model->BSIM3v0xt + + model->BSIM3v0lxt * Inv_L + + model->BSIM3v0wxt * Inv_W + + model->BSIM3v0pxt * Inv_LW; + pParam->BSIM3v0k1 = model->BSIM3v0k1 + + model->BSIM3v0lk1 * Inv_L + + model->BSIM3v0wk1 * Inv_W + + model->BSIM3v0pk1 * Inv_LW; + pParam->BSIM3v0kt1 = model->BSIM3v0kt1 + + model->BSIM3v0lkt1 * Inv_L + + model->BSIM3v0wkt1 * Inv_W + + model->BSIM3v0pkt1 * Inv_LW; + pParam->BSIM3v0kt1l = model->BSIM3v0kt1l + + model->BSIM3v0lkt1l * Inv_L + + model->BSIM3v0wkt1l * Inv_W + + model->BSIM3v0pkt1l * Inv_LW; + pParam->BSIM3v0k2 = model->BSIM3v0k2 + + model->BSIM3v0lk2 * Inv_L + + model->BSIM3v0wk2 * Inv_W + + model->BSIM3v0pk2 * Inv_LW; + pParam->BSIM3v0kt2 = model->BSIM3v0kt2 + + model->BSIM3v0lkt2 * Inv_L + + model->BSIM3v0wkt2 * Inv_W + + model->BSIM3v0pkt2 * Inv_LW; + pParam->BSIM3v0k3 = model->BSIM3v0k3 + + model->BSIM3v0lk3 * Inv_L + + model->BSIM3v0wk3 * Inv_W + + model->BSIM3v0pk3 * Inv_LW; + pParam->BSIM3v0k3b = model->BSIM3v0k3b + + model->BSIM3v0lk3b * Inv_L + + model->BSIM3v0wk3b * Inv_W + + model->BSIM3v0pk3b * Inv_LW; + pParam->BSIM3v0w0 = model->BSIM3v0w0 + + model->BSIM3v0lw0 * Inv_L + + model->BSIM3v0ww0 * Inv_W + + model->BSIM3v0pw0 * Inv_LW; + pParam->BSIM3v0nlx = model->BSIM3v0nlx + + model->BSIM3v0lnlx * Inv_L + + model->BSIM3v0wnlx * Inv_W + + model->BSIM3v0pnlx * Inv_LW; + pParam->BSIM3v0dvt0 = model->BSIM3v0dvt0 + + model->BSIM3v0ldvt0 * Inv_L + + model->BSIM3v0wdvt0 * Inv_W + + model->BSIM3v0pdvt0 * Inv_LW; + pParam->BSIM3v0dvt1 = model->BSIM3v0dvt1 + + model->BSIM3v0ldvt1 * Inv_L + + model->BSIM3v0wdvt1 * Inv_W + + model->BSIM3v0pdvt1 * Inv_LW; + pParam->BSIM3v0dvt2 = model->BSIM3v0dvt2 + + model->BSIM3v0ldvt2 * Inv_L + + model->BSIM3v0wdvt2 * Inv_W + + model->BSIM3v0pdvt2 * Inv_LW; + pParam->BSIM3v0dvt0w = model->BSIM3v0dvt0w + + model->BSIM3v0ldvt0w * Inv_L + + model->BSIM3v0wdvt0w * Inv_W + + model->BSIM3v0pdvt0w * Inv_LW; + pParam->BSIM3v0dvt1w = model->BSIM3v0dvt1w + + model->BSIM3v0ldvt1w * Inv_L + + model->BSIM3v0wdvt1w * Inv_W + + model->BSIM3v0pdvt1w * Inv_LW; + pParam->BSIM3v0dvt2w = model->BSIM3v0dvt2w + + model->BSIM3v0ldvt2w * Inv_L + + model->BSIM3v0wdvt2w * Inv_W + + model->BSIM3v0pdvt2w * Inv_LW; + pParam->BSIM3v0drout = model->BSIM3v0drout + + model->BSIM3v0ldrout * Inv_L + + model->BSIM3v0wdrout * Inv_W + + model->BSIM3v0pdrout * Inv_LW; + pParam->BSIM3v0dsub = model->BSIM3v0dsub + + model->BSIM3v0ldsub * Inv_L + + model->BSIM3v0wdsub * Inv_W + + model->BSIM3v0pdsub * Inv_LW; + pParam->BSIM3v0vth0 = model->BSIM3v0vth0 + + model->BSIM3v0lvth0 * Inv_L + + model->BSIM3v0wvth0 * Inv_W + + model->BSIM3v0pvth0 * Inv_LW; + pParam->BSIM3v0ua = model->BSIM3v0ua + + model->BSIM3v0lua * Inv_L + + model->BSIM3v0wua * Inv_W + + model->BSIM3v0pua * Inv_LW; + pParam->BSIM3v0ua1 = model->BSIM3v0ua1 + + model->BSIM3v0lua1 * Inv_L + + model->BSIM3v0wua1 * Inv_W + + model->BSIM3v0pua1 * Inv_LW; + pParam->BSIM3v0ub = model->BSIM3v0ub + + model->BSIM3v0lub * Inv_L + + model->BSIM3v0wub * Inv_W + + model->BSIM3v0pub * Inv_LW; + pParam->BSIM3v0ub1 = model->BSIM3v0ub1 + + model->BSIM3v0lub1 * Inv_L + + model->BSIM3v0wub1 * Inv_W + + model->BSIM3v0pub1 * Inv_LW; + pParam->BSIM3v0uc = model->BSIM3v0uc + + model->BSIM3v0luc * Inv_L + + model->BSIM3v0wuc * Inv_W + + model->BSIM3v0puc * Inv_LW; + pParam->BSIM3v0uc1 = model->BSIM3v0uc1 + + model->BSIM3v0luc1 * Inv_L + + model->BSIM3v0wuc1 * Inv_W + + model->BSIM3v0puc1 * Inv_LW; + pParam->BSIM3v0u0 = model->BSIM3v0u0 + + model->BSIM3v0lu0 * Inv_L + + model->BSIM3v0wu0 * Inv_W + + model->BSIM3v0pu0 * Inv_LW; + pParam->BSIM3v0ute = model->BSIM3v0ute + + model->BSIM3v0lute * Inv_L + + model->BSIM3v0wute * Inv_W + + model->BSIM3v0pute * Inv_LW; + pParam->BSIM3v0voff = model->BSIM3v0voff + + model->BSIM3v0lvoff * Inv_L + + model->BSIM3v0wvoff * Inv_W + + model->BSIM3v0pvoff * Inv_LW; + pParam->BSIM3v0delta = model->BSIM3v0delta + + model->BSIM3v0ldelta * Inv_L + + model->BSIM3v0wdelta * Inv_W + + model->BSIM3v0pdelta * Inv_LW; + pParam->BSIM3v0rdsw = model->BSIM3v0rdsw + + model->BSIM3v0lrdsw * Inv_L + + model->BSIM3v0wrdsw * Inv_W + + model->BSIM3v0prdsw * Inv_LW; + pParam->BSIM3v0prwg = model->BSIM3v0prwg + + model->BSIM3v0lprwg * Inv_L + + model->BSIM3v0wprwg * Inv_W + + model->BSIM3v0pprwg * Inv_LW; + pParam->BSIM3v0prwb = model->BSIM3v0prwb + + model->BSIM3v0lprwb * Inv_L + + model->BSIM3v0wprwb * Inv_W + + model->BSIM3v0pprwb * Inv_LW; + pParam->BSIM3v0prt = model->BSIM3v0prt + + model->BSIM3v0lprt * Inv_L + + model->BSIM3v0wprt * Inv_W + + model->BSIM3v0pprt * Inv_LW; + pParam->BSIM3v0eta0 = model->BSIM3v0eta0 + + model->BSIM3v0leta0 * Inv_L + + model->BSIM3v0weta0 * Inv_W + + model->BSIM3v0peta0 * Inv_LW; + pParam->BSIM3v0etab = model->BSIM3v0etab + + model->BSIM3v0letab * Inv_L + + model->BSIM3v0wetab * Inv_W + + model->BSIM3v0petab * Inv_LW; + pParam->BSIM3v0pclm = model->BSIM3v0pclm + + model->BSIM3v0lpclm * Inv_L + + model->BSIM3v0wpclm * Inv_W + + model->BSIM3v0ppclm * Inv_LW; + pParam->BSIM3v0pdibl1 = model->BSIM3v0pdibl1 + + model->BSIM3v0lpdibl1 * Inv_L + + model->BSIM3v0wpdibl1 * Inv_W + + model->BSIM3v0ppdibl1 * Inv_LW; + pParam->BSIM3v0pdibl2 = model->BSIM3v0pdibl2 + + model->BSIM3v0lpdibl2 * Inv_L + + model->BSIM3v0wpdibl2 * Inv_W + + model->BSIM3v0ppdibl2 * Inv_LW; + pParam->BSIM3v0pdiblb = model->BSIM3v0pdiblb + + model->BSIM3v0lpdiblb * Inv_L + + model->BSIM3v0wpdiblb * Inv_W + + model->BSIM3v0ppdiblb * Inv_LW; + pParam->BSIM3v0pscbe1 = model->BSIM3v0pscbe1 + + model->BSIM3v0lpscbe1 * Inv_L + + model->BSIM3v0wpscbe1 * Inv_W + + model->BSIM3v0ppscbe1 * Inv_LW; + pParam->BSIM3v0pscbe2 = model->BSIM3v0pscbe2 + + model->BSIM3v0lpscbe2 * Inv_L + + model->BSIM3v0wpscbe2 * Inv_W + + model->BSIM3v0ppscbe2 * Inv_LW; + pParam->BSIM3v0pvag = model->BSIM3v0pvag + + model->BSIM3v0lpvag * Inv_L + + model->BSIM3v0wpvag * Inv_W + + model->BSIM3v0ppvag * Inv_LW; + pParam->BSIM3v0wr = model->BSIM3v0wr + + model->BSIM3v0lwr * Inv_L + + model->BSIM3v0wwr * Inv_W + + model->BSIM3v0pwr * Inv_LW; + pParam->BSIM3v0dwg = model->BSIM3v0dwg + + model->BSIM3v0ldwg * Inv_L + + model->BSIM3v0wdwg * Inv_W + + model->BSIM3v0pdwg * Inv_LW; + pParam->BSIM3v0dwb = model->BSIM3v0dwb + + model->BSIM3v0ldwb * Inv_L + + model->BSIM3v0wdwb * Inv_W + + model->BSIM3v0pdwb * Inv_LW; + pParam->BSIM3v0b0 = model->BSIM3v0b0 + + model->BSIM3v0lb0 * Inv_L + + model->BSIM3v0wb0 * Inv_W + + model->BSIM3v0pb0 * Inv_LW; + pParam->BSIM3v0b1 = model->BSIM3v0b1 + + model->BSIM3v0lb1 * Inv_L + + model->BSIM3v0wb1 * Inv_W + + model->BSIM3v0pb1 * Inv_LW; + pParam->BSIM3v0alpha0 = model->BSIM3v0alpha0 + + model->BSIM3v0lalpha0 * Inv_L + + model->BSIM3v0walpha0 * Inv_W + + model->BSIM3v0palpha0 * Inv_LW; + pParam->BSIM3v0beta0 = model->BSIM3v0beta0 + + model->BSIM3v0lbeta0 * Inv_L + + model->BSIM3v0wbeta0 * Inv_W + + model->BSIM3v0pbeta0 * Inv_LW; + /* CV model */ + pParam->BSIM3v0elm = model->BSIM3v0elm + + model->BSIM3v0lelm * Inv_L + + model->BSIM3v0welm * Inv_W + + model->BSIM3v0pelm * Inv_LW; + pParam->BSIM3v0cgsl = model->BSIM3v0cgsl + + model->BSIM3v0lcgsl * Inv_L + + model->BSIM3v0wcgsl * Inv_W + + model->BSIM3v0pcgsl * Inv_LW; + pParam->BSIM3v0cgdl = model->BSIM3v0cgdl + + model->BSIM3v0lcgdl * Inv_L + + model->BSIM3v0wcgdl * Inv_W + + model->BSIM3v0pcgdl * Inv_LW; + pParam->BSIM3v0ckappa = model->BSIM3v0ckappa + + model->BSIM3v0lckappa * Inv_L + + model->BSIM3v0wckappa * Inv_W + + model->BSIM3v0pckappa * Inv_LW; + pParam->BSIM3v0cf = model->BSIM3v0cf + + model->BSIM3v0lcf * Inv_L + + model->BSIM3v0wcf * Inv_W + + model->BSIM3v0pcf * Inv_LW; + pParam->BSIM3v0clc = model->BSIM3v0clc + + model->BSIM3v0lclc * Inv_L + + model->BSIM3v0wclc * Inv_W + + model->BSIM3v0pclc * Inv_LW; + pParam->BSIM3v0cle = model->BSIM3v0cle + + model->BSIM3v0lcle * Inv_L + + model->BSIM3v0wcle * Inv_W + + model->BSIM3v0pcle * Inv_LW; pParam->BSIM3v0abulkCVfactor = 1.0 + pow((pParam->BSIM3v0clc - / pParam->BSIM3v0leff), - pParam->BSIM3v0cle); + / pParam->BSIM3v0leff), + pParam->BSIM3v0cle); pParam->BSIM3v0cgdo = (model->BSIM3v0cgdo + pParam->BSIM3v0cf) - * pParam->BSIM3v0weffCV; + * pParam->BSIM3v0weffCV; pParam->BSIM3v0cgso = (model->BSIM3v0cgso + pParam->BSIM3v0cf) - * pParam->BSIM3v0weffCV; + * pParam->BSIM3v0weffCV; pParam->BSIM3v0cgbo = model->BSIM3v0cgbo * pParam->BSIM3v0leffCV; - T0 = (TRatio - 1.0); - pParam->BSIM3v0ua = pParam->BSIM3v0ua + pParam->BSIM3v0ua1 * T0; - pParam->BSIM3v0ub = pParam->BSIM3v0ub + pParam->BSIM3v0ub1 * T0; - pParam->BSIM3v0uc = pParam->BSIM3v0uc + pParam->BSIM3v0uc1 * T0; + T0 = (TRatio - 1.0); + pParam->BSIM3v0ua = pParam->BSIM3v0ua + pParam->BSIM3v0ua1 * T0; + pParam->BSIM3v0ub = pParam->BSIM3v0ub + pParam->BSIM3v0ub1 * T0; + pParam->BSIM3v0uc = pParam->BSIM3v0uc + pParam->BSIM3v0uc1 * T0; pParam->BSIM3v0u0temp = pParam->BSIM3v0u0 - * pow(TRatio, pParam->BSIM3v0ute); - pParam->BSIM3v0vsattemp = pParam->BSIM3v0vsat - pParam->BSIM3v0at - * T0; - pParam->BSIM3v0rds0 = (pParam->BSIM3v0rdsw + pParam->BSIM3v0prt * T0) + * pow(TRatio, pParam->BSIM3v0ute); + pParam->BSIM3v0vsattemp = pParam->BSIM3v0vsat - pParam->BSIM3v0at + * T0; + pParam->BSIM3v0rds0 = (pParam->BSIM3v0rdsw + pParam->BSIM3v0prt * T0) / pow(pParam->BSIM3v0weff * 1E6, pParam->BSIM3v0wr); if (!model->BSIM3v0npeakGiven && model->BSIM3v0gamma1Given) @@ -488,36 +488,36 @@ int Size_Not_Found; pParam->BSIM3v0npeak = 3.021E22 * T0 * T0; } - Vtm0 = KboQ * Tnom; - Eg = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) + Vtm0 = KboQ * Tnom; + Eg = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); + ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) * exp(21.5565981 - Eg / (2.0 * Vtm0)); - pParam->BSIM3v0phi = 2.0 * Vtm0 - * log(pParam->BSIM3v0npeak / ni); + pParam->BSIM3v0phi = 2.0 * Vtm0 + * log(pParam->BSIM3v0npeak / ni); - pParam->BSIM3v0sqrtPhi = sqrt(pParam->BSIM3v0phi); - pParam->BSIM3v0phis3 = pParam->BSIM3v0sqrtPhi * pParam->BSIM3v0phi; + pParam->BSIM3v0sqrtPhi = sqrt(pParam->BSIM3v0phi); + pParam->BSIM3v0phis3 = pParam->BSIM3v0sqrtPhi * pParam->BSIM3v0phi; pParam->BSIM3v0Xdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->BSIM3v0npeak * 1.0e6)) - * pParam->BSIM3v0sqrtPhi; + * pParam->BSIM3v0npeak * 1.0e6)) + * pParam->BSIM3v0sqrtPhi; pParam->BSIM3v0sqrtXdep0 = sqrt(pParam->BSIM3v0Xdep0); pParam->BSIM3v0litl = sqrt(3.0 * pParam->BSIM3v0xj - * model->BSIM3v0tox); + * model->BSIM3v0tox); pParam->BSIM3v0vbi = Vtm0 * log(1.0e20 - * pParam->BSIM3v0npeak / (ni * ni)); + * pParam->BSIM3v0npeak / (ni * ni)); pParam->BSIM3v0cdep0 = sqrt(Charge_q * EPSSI - * pParam->BSIM3v0npeak * 1.0e6 / 2.0 - / pParam->BSIM3v0phi); - + * pParam->BSIM3v0npeak * 1.0e6 / 2.0 + / pParam->BSIM3v0phi); + if (model->BSIM3v0k1Given || model->BSIM3v0k2Given) - { if (!model->BSIM3v0k1Given) - { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); + { if (!model->BSIM3v0k1Given) + { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); pParam->BSIM3v0k1 = 0.53; } if (!model->BSIM3v0k2Given) - { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); + { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); pParam->BSIM3v0k2 = -0.0186; } if (model->BSIM3v0nsubGiven) @@ -534,87 +534,87 @@ int Size_Not_Found; fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); } else - { if (!model->BSIM3v0vbxGiven) - pParam->BSIM3v0vbx = pParam->BSIM3v0phi - 7.7348e-4 + { if (!model->BSIM3v0vbxGiven) + pParam->BSIM3v0vbx = pParam->BSIM3v0phi - 7.7348e-4 * pParam->BSIM3v0npeak - * pParam->BSIM3v0xt * pParam->BSIM3v0xt; - if (pParam->BSIM3v0vbx > 0.0) - pParam->BSIM3v0vbx = -pParam->BSIM3v0vbx; - if (pParam->BSIM3v0vbm > 0.0) + * pParam->BSIM3v0xt * pParam->BSIM3v0xt; + if (pParam->BSIM3v0vbx > 0.0) + pParam->BSIM3v0vbx = -pParam->BSIM3v0vbx; + if (pParam->BSIM3v0vbm > 0.0) pParam->BSIM3v0vbm = -pParam->BSIM3v0vbm; - + if (!model->BSIM3v0gamma1Given) pParam->BSIM3v0gamma1 = 5.753e-12 - * sqrt(pParam->BSIM3v0npeak) + * sqrt(pParam->BSIM3v0npeak) / model->BSIM3v0cox; if (!model->BSIM3v0gamma2Given) pParam->BSIM3v0gamma2 = 5.753e-12 - * sqrt(pParam->BSIM3v0nsub) + * sqrt(pParam->BSIM3v0nsub) / model->BSIM3v0cox; T0 = pParam->BSIM3v0gamma1 - pParam->BSIM3v0gamma2; T1 = sqrt(pParam->BSIM3v0phi - pParam->BSIM3v0vbx) - - pParam->BSIM3v0sqrtPhi; + - pParam->BSIM3v0sqrtPhi; T2 = sqrt(pParam->BSIM3v0phi * (pParam->BSIM3v0phi - - pParam->BSIM3v0vbm)) - pParam->BSIM3v0phi; + - pParam->BSIM3v0vbm)) - pParam->BSIM3v0phi; pParam->BSIM3v0k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM3v0vbm); pParam->BSIM3v0k1 = pParam->BSIM3v0gamma2 - 2.0 - * pParam->BSIM3v0k2 * sqrt(pParam->BSIM3v0phi - - pParam->BSIM3v0vbm); + * pParam->BSIM3v0k2 * sqrt(pParam->BSIM3v0phi + - pParam->BSIM3v0vbm); } - - if (pParam->BSIM3v0k2 > 0.0) - { T0 = 0.5 * pParam->BSIM3v0k1 / pParam->BSIM3v0k2; + + if (pParam->BSIM3v0k2 > 0.0) + { T0 = 0.5 * pParam->BSIM3v0k1 / pParam->BSIM3v0k2; pParam->BSIM3v0vbsc = 0.9 * (pParam->BSIM3v0phi - T0 * T0); - if (pParam->BSIM3v0vbsc > -3.0) - pParam->BSIM3v0vbsc = -3.0; - else if (pParam->BSIM3v0vbsc < -30.0) - pParam->BSIM3v0vbsc = -30.0; - } - else - { pParam->BSIM3v0vbsc = -10.0; - } + if (pParam->BSIM3v0vbsc > -3.0) + pParam->BSIM3v0vbsc = -3.0; + else if (pParam->BSIM3v0vbsc < -30.0) + pParam->BSIM3v0vbsc = -30.0; + } + else + { pParam->BSIM3v0vbsc = -10.0; + } - model->BSIM3v0vtm = KboQ * Temp; + model->BSIM3v0vtm = KboQ * Temp; - if (model->BSIM3v0vth0Given) - pParam->BSIM3v0vfb = model->BSIM3v0type * pParam->BSIM3v0vth0 - - pParam->BSIM3v0phi - pParam->BSIM3v0k1 + if (model->BSIM3v0vth0Given) + pParam->BSIM3v0vfb = model->BSIM3v0type * pParam->BSIM3v0vth0 + - pParam->BSIM3v0phi - pParam->BSIM3v0k1 * pParam->BSIM3v0sqrtPhi; else pParam->BSIM3v0vth0 = model->BSIM3v0type * (-1.0 - + pParam->BSIM3v0phi + pParam->BSIM3v0k1 + + pParam->BSIM3v0phi + pParam->BSIM3v0k1 * pParam->BSIM3v0sqrtPhi); T1 = sqrt(EPSSI / EPSOX * model->BSIM3v0tox - * pParam->BSIM3v0Xdep0); + * pParam->BSIM3v0Xdep0); T0 = exp(-0.5 * pParam->BSIM3v0dsub * pParam->BSIM3v0leff / T1); pParam->BSIM3v0theta0vb0 = (T0 + 2.0 * T0 * T0); T0 = exp(-0.5 * pParam->BSIM3v0drout * pParam->BSIM3v0leff / T1); T2 = (T0 + 2.0 * T0 * T0); pParam->BSIM3v0thetaRout = pParam->BSIM3v0pdibl1 * T2 - + pParam->BSIM3v0pdibl2; + + pParam->BSIM3v0pdibl2; /* process source/drain series resistance */ - here->BSIM3v0drainConductance = model->BSIM3v0sheetResistance - * here->BSIM3v0drainSquares; + here->BSIM3v0drainConductance = model->BSIM3v0sheetResistance + * here->BSIM3v0drainSquares; if (here->BSIM3v0drainConductance > 0.0) here->BSIM3v0drainConductance = 1.0 - / here->BSIM3v0drainConductance; - else + / here->BSIM3v0drainConductance; + else here->BSIM3v0drainConductance = 0.0; - - here->BSIM3v0sourceConductance = model->BSIM3v0sheetResistance - * here->BSIM3v0sourceSquares; - if (here->BSIM3v0sourceConductance > 0.0) + + here->BSIM3v0sourceConductance = model->BSIM3v0sheetResistance + * here->BSIM3v0sourceSquares; + if (here->BSIM3v0sourceConductance > 0.0) here->BSIM3v0sourceConductance = 1.0 - / here->BSIM3v0sourceConductance; - else + / here->BSIM3v0sourceConductance; + else here->BSIM3v0sourceConductance = 0.0; - } - here->BSIM3v0cgso = pParam->BSIM3v0cgso; - here->BSIM3v0cgdo = pParam->BSIM3v0cgdo; + } + here->BSIM3v0cgso = pParam->BSIM3v0cgso; + here->BSIM3v0cgdo = pParam->BSIM3v0cgdo; } } return(OK); diff --git a/src/spicelib/devices/bsim3v1/b3v1temp.c b/src/spicelib/devices/bsim3v1/b3v1temp.c index f4e7e913e..e179be58a 100644 --- a/src/spicelib/devices/bsim3v1/b3v1temp.c +++ b/src/spicelib/devices/bsim3v1/b3v1temp.c @@ -1,12 +1,12 @@ /********** * Copyright 1990 Regents of the University of California. All rights reserved. * File: b3v1ld.c - * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Author: 1995 Min-Chie Jeng and Mansun Chan. * Modified by Paolo Nenzi 2002 **********/ - -/* - * Release Notes: + +/* + * Release Notes: * BSIM3v3.1, Released by yuhua 96/12/08 */ @@ -45,8 +45,8 @@ int Size_Not_Found; /* loop through all the BSIM3v1 device models */ for (; model != NULL; model = BSIM3v1nextModel(model)) { Temp = ckt->CKTtemp; - if (model->BSIM3v1bulkJctPotential < 0.1) - model->BSIM3v1bulkJctPotential = 0.1; + if (model->BSIM3v1bulkJctPotential < 0.1) + model->BSIM3v1bulkJctPotential = 0.1; if (model->BSIM3v1sidewallJctPotential < 0.1) model->BSIM3v1sidewallJctPotential = 0.1; if (model->BSIM3v1GatesidewallJctPotential < 0.1) @@ -59,74 +59,74 @@ int Size_Not_Found; p = next_p; } model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; + pLastKnot = NULL; - Tnom = model->BSIM3v1tnom; - TRatio = Temp / Tnom; + Tnom = model->BSIM3v1tnom; + TRatio = Temp / Tnom; - model->BSIM3v1vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); + model->BSIM3v1vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); model->BSIM3v1factor1 = sqrt(EPSSI / EPSOX * model->BSIM3v1tox); Vtm0 = KboQ * Tnom; Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) + ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); model->BSIM3v1vtm = KboQ * Temp; Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - if (Temp != Tnom) - { T0 = Eg0 / Vtm0 - Eg / model->BSIM3v1vtm + model->BSIM3v1jctTempExponent - * log(Temp / Tnom); - T1 = exp(T0 / model->BSIM3v1jctEmissionCoeff); - model->BSIM3v1jctTempSatCurDensity = model->BSIM3v1jctSatCurDensity - * T1; - model->BSIM3v1jctSidewallTempSatCurDensity - = model->BSIM3v1jctSidewallSatCurDensity * T1; - } - else - { model->BSIM3v1jctTempSatCurDensity = model->BSIM3v1jctSatCurDensity; - model->BSIM3v1jctSidewallTempSatCurDensity - = model->BSIM3v1jctSidewallSatCurDensity; - } + if (Temp != Tnom) + { T0 = Eg0 / Vtm0 - Eg / model->BSIM3v1vtm + model->BSIM3v1jctTempExponent + * log(Temp / Tnom); + T1 = exp(T0 / model->BSIM3v1jctEmissionCoeff); + model->BSIM3v1jctTempSatCurDensity = model->BSIM3v1jctSatCurDensity + * T1; + model->BSIM3v1jctSidewallTempSatCurDensity + = model->BSIM3v1jctSidewallSatCurDensity * T1; + } + else + { model->BSIM3v1jctTempSatCurDensity = model->BSIM3v1jctSatCurDensity; + model->BSIM3v1jctSidewallTempSatCurDensity + = model->BSIM3v1jctSidewallSatCurDensity; + } - if (model->BSIM3v1jctTempSatCurDensity < 0.0) - model->BSIM3v1jctTempSatCurDensity = 0.0; - if (model->BSIM3v1jctSidewallTempSatCurDensity < 0.0) - model->BSIM3v1jctSidewallTempSatCurDensity = 0.0; + if (model->BSIM3v1jctTempSatCurDensity < 0.0) + model->BSIM3v1jctTempSatCurDensity = 0.0; + if (model->BSIM3v1jctSidewallTempSatCurDensity < 0.0) + model->BSIM3v1jctSidewallTempSatCurDensity = 0.0; /* loop through all the instances of the model */ - /* MCJ: Length and Width not initialized */ + /* MCJ: Length and Width not initialized */ for (here = BSIM3v1instances(model); here != NULL; - here = BSIM3v1nextInstance(here)) - { - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->BSIM3v1l == pSizeDependParamKnot->Length) - && (here->BSIM3v1w == pSizeDependParamKnot->Width)) + here = BSIM3v1nextInstance(here)) + { + pSizeDependParamKnot = model->pSizeDependParamKnot; + Size_Not_Found = 1; + while ((pSizeDependParamKnot != NULL) && Size_Not_Found) + { if ((here->BSIM3v1l == pSizeDependParamKnot->Length) + && (here->BSIM3v1w == pSizeDependParamKnot->Width)) { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } + here->pParam = pSizeDependParamKnot; + } + else + { pLastKnot = pSizeDependParamKnot; + pSizeDependParamKnot = pSizeDependParamKnot->pNext; + } } - if (Size_Not_Found) - { pParam = TMALLOC(struct bsim3v1SizeDependParam, 1); + if (Size_Not_Found) + { pParam = TMALLOC(struct bsim3v1SizeDependParam, 1); if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; + model->pSizeDependParamKnot = pParam; else - pLastKnot->pNext = pParam; + pLastKnot->pNext = pParam; pParam->pNext = NULL; here->pParam = pParam; - Ldrn = here->BSIM3v1l; - Wdrn = here->BSIM3v1w; + Ldrn = here->BSIM3v1l; + Wdrn = here->BSIM3v1w; pParam->Length = Ldrn; pParam->Width = Wdrn; - + T0 = pow(Ldrn, model->BSIM3v1Lln); T1 = pow(Wdrn, model->BSIM3v1Lwn); tmp1 = model->BSIM3v1Ll / T0 + model->BSIM3v1Lw / T1 @@ -143,7 +143,7 @@ int Size_Not_Found; pParam->BSIM3v1leff = here->BSIM3v1l - 2.0 * pParam->BSIM3v1dl; if (pParam->BSIM3v1leff <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "BSIM3v1: mosfet %s, model %s: Effective channel length <= 0", model->BSIM3v1modName, here->BSIM3v1name); @@ -152,7 +152,7 @@ int Size_Not_Found; pParam->BSIM3v1weff = here->BSIM3v1w - 2.0 * pParam->BSIM3v1dw; if (pParam->BSIM3v1weff <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "BSIM3v1: mosfet %s, model %s: Effective channel width <= 0", model->BSIM3v1modName, here->BSIM3v1name); @@ -161,7 +161,7 @@ int Size_Not_Found; pParam->BSIM3v1leffCV = here->BSIM3v1l - 2.0 * pParam->BSIM3v1dlc; if (pParam->BSIM3v1leffCV <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "BSIM3v1: mosfet %s, model %s: Effective channel length for C-V <= 0", model->BSIM3v1modName, here->BSIM3v1name); @@ -170,7 +170,7 @@ int Size_Not_Found; pParam->BSIM3v1weffCV = here->BSIM3v1w - 2.0 * pParam->BSIM3v1dwc; if (pParam->BSIM3v1weffCV <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "BSIM3v1: mosfet %s, model %s: Effective channel width for C-V <= 0", model->BSIM3v1modName, here->BSIM3v1name); @@ -178,359 +178,359 @@ int Size_Not_Found; } - if (model->BSIM3v1binUnit == 1) - { Inv_L = 1.0e-6 / pParam->BSIM3v1leff; - Inv_W = 1.0e-6 / pParam->BSIM3v1weff; - Inv_LW = 1.0e-12 / (pParam->BSIM3v1leff - * pParam->BSIM3v1weff); - } - else - { Inv_L = 1.0 / pParam->BSIM3v1leff; - Inv_W = 1.0 / pParam->BSIM3v1weff; - Inv_LW = 1.0 / (pParam->BSIM3v1leff - * pParam->BSIM3v1weff); - } - pParam->BSIM3v1cdsc = model->BSIM3v1cdsc - + model->BSIM3v1lcdsc * Inv_L - + model->BSIM3v1wcdsc * Inv_W - + model->BSIM3v1pcdsc * Inv_LW; - pParam->BSIM3v1cdscb = model->BSIM3v1cdscb - + model->BSIM3v1lcdscb * Inv_L - + model->BSIM3v1wcdscb * Inv_W - + model->BSIM3v1pcdscb * Inv_LW; - - pParam->BSIM3v1cdscd = model->BSIM3v1cdscd - + model->BSIM3v1lcdscd * Inv_L - + model->BSIM3v1wcdscd * Inv_W - + model->BSIM3v1pcdscd * Inv_LW; - - pParam->BSIM3v1cit = model->BSIM3v1cit - + model->BSIM3v1lcit * Inv_L - + model->BSIM3v1wcit * Inv_W - + model->BSIM3v1pcit * Inv_LW; - pParam->BSIM3v1nfactor = model->BSIM3v1nfactor - + model->BSIM3v1lnfactor * Inv_L - + model->BSIM3v1wnfactor * Inv_W - + model->BSIM3v1pnfactor * Inv_LW; - pParam->BSIM3v1xj = model->BSIM3v1xj - + model->BSIM3v1lxj * Inv_L - + model->BSIM3v1wxj * Inv_W - + model->BSIM3v1pxj * Inv_LW; - pParam->BSIM3v1vsat = model->BSIM3v1vsat - + model->BSIM3v1lvsat * Inv_L - + model->BSIM3v1wvsat * Inv_W - + model->BSIM3v1pvsat * Inv_LW; - pParam->BSIM3v1at = model->BSIM3v1at - + model->BSIM3v1lat * Inv_L - + model->BSIM3v1wat * Inv_W - + model->BSIM3v1pat * Inv_LW; - pParam->BSIM3v1a0 = model->BSIM3v1a0 - + model->BSIM3v1la0 * Inv_L - + model->BSIM3v1wa0 * Inv_W - + model->BSIM3v1pa0 * Inv_LW; - - pParam->BSIM3v1ags = model->BSIM3v1ags - + model->BSIM3v1lags * Inv_L - + model->BSIM3v1wags * Inv_W - + model->BSIM3v1pags * Inv_LW; - - pParam->BSIM3v1a1 = model->BSIM3v1a1 - + model->BSIM3v1la1 * Inv_L - + model->BSIM3v1wa1 * Inv_W - + model->BSIM3v1pa1 * Inv_LW; - pParam->BSIM3v1a2 = model->BSIM3v1a2 - + model->BSIM3v1la2 * Inv_L - + model->BSIM3v1wa2 * Inv_W - + model->BSIM3v1pa2 * Inv_LW; - pParam->BSIM3v1keta = model->BSIM3v1keta - + model->BSIM3v1lketa * Inv_L - + model->BSIM3v1wketa * Inv_W - + model->BSIM3v1pketa * Inv_LW; - pParam->BSIM3v1nsub = model->BSIM3v1nsub - + model->BSIM3v1lnsub * Inv_L - + model->BSIM3v1wnsub * Inv_W - + model->BSIM3v1pnsub * Inv_LW; - pParam->BSIM3v1npeak = model->BSIM3v1npeak - + model->BSIM3v1lnpeak * Inv_L - + model->BSIM3v1wnpeak * Inv_W - + model->BSIM3v1pnpeak * Inv_LW; - pParam->BSIM3v1ngate = model->BSIM3v1ngate - + model->BSIM3v1lngate * Inv_L - + model->BSIM3v1wngate * Inv_W - + model->BSIM3v1pngate * Inv_LW; - pParam->BSIM3v1gamma1 = model->BSIM3v1gamma1 - + model->BSIM3v1lgamma1 * Inv_L - + model->BSIM3v1wgamma1 * Inv_W - + model->BSIM3v1pgamma1 * Inv_LW; - pParam->BSIM3v1gamma2 = model->BSIM3v1gamma2 - + model->BSIM3v1lgamma2 * Inv_L - + model->BSIM3v1wgamma2 * Inv_W - + model->BSIM3v1pgamma2 * Inv_LW; - pParam->BSIM3v1vbx = model->BSIM3v1vbx - + model->BSIM3v1lvbx * Inv_L - + model->BSIM3v1wvbx * Inv_W - + model->BSIM3v1pvbx * Inv_LW; - pParam->BSIM3v1vbm = model->BSIM3v1vbm - + model->BSIM3v1lvbm * Inv_L - + model->BSIM3v1wvbm * Inv_W - + model->BSIM3v1pvbm * Inv_LW; - pParam->BSIM3v1xt = model->BSIM3v1xt - + model->BSIM3v1lxt * Inv_L - + model->BSIM3v1wxt * Inv_W - + model->BSIM3v1pxt * Inv_LW; - pParam->BSIM3v1k1 = model->BSIM3v1k1 - + model->BSIM3v1lk1 * Inv_L - + model->BSIM3v1wk1 * Inv_W - + model->BSIM3v1pk1 * Inv_LW; - pParam->BSIM3v1kt1 = model->BSIM3v1kt1 - + model->BSIM3v1lkt1 * Inv_L - + model->BSIM3v1wkt1 * Inv_W - + model->BSIM3v1pkt1 * Inv_LW; - pParam->BSIM3v1kt1l = model->BSIM3v1kt1l - + model->BSIM3v1lkt1l * Inv_L - + model->BSIM3v1wkt1l * Inv_W - + model->BSIM3v1pkt1l * Inv_LW; - pParam->BSIM3v1k2 = model->BSIM3v1k2 - + model->BSIM3v1lk2 * Inv_L - + model->BSIM3v1wk2 * Inv_W - + model->BSIM3v1pk2 * Inv_LW; - pParam->BSIM3v1kt2 = model->BSIM3v1kt2 - + model->BSIM3v1lkt2 * Inv_L - + model->BSIM3v1wkt2 * Inv_W - + model->BSIM3v1pkt2 * Inv_LW; - pParam->BSIM3v1k3 = model->BSIM3v1k3 - + model->BSIM3v1lk3 * Inv_L - + model->BSIM3v1wk3 * Inv_W - + model->BSIM3v1pk3 * Inv_LW; - pParam->BSIM3v1k3b = model->BSIM3v1k3b - + model->BSIM3v1lk3b * Inv_L - + model->BSIM3v1wk3b * Inv_W - + model->BSIM3v1pk3b * Inv_LW; - pParam->BSIM3v1w0 = model->BSIM3v1w0 - + model->BSIM3v1lw0 * Inv_L - + model->BSIM3v1ww0 * Inv_W - + model->BSIM3v1pw0 * Inv_LW; - pParam->BSIM3v1nlx = model->BSIM3v1nlx - + model->BSIM3v1lnlx * Inv_L - + model->BSIM3v1wnlx * Inv_W - + model->BSIM3v1pnlx * Inv_LW; - pParam->BSIM3v1dvt0 = model->BSIM3v1dvt0 - + model->BSIM3v1ldvt0 * Inv_L - + model->BSIM3v1wdvt0 * Inv_W - + model->BSIM3v1pdvt0 * Inv_LW; - pParam->BSIM3v1dvt1 = model->BSIM3v1dvt1 - + model->BSIM3v1ldvt1 * Inv_L - + model->BSIM3v1wdvt1 * Inv_W - + model->BSIM3v1pdvt1 * Inv_LW; - pParam->BSIM3v1dvt2 = model->BSIM3v1dvt2 - + model->BSIM3v1ldvt2 * Inv_L - + model->BSIM3v1wdvt2 * Inv_W - + model->BSIM3v1pdvt2 * Inv_LW; - pParam->BSIM3v1dvt0w = model->BSIM3v1dvt0w - + model->BSIM3v1ldvt0w * Inv_L - + model->BSIM3v1wdvt0w * Inv_W - + model->BSIM3v1pdvt0w * Inv_LW; - pParam->BSIM3v1dvt1w = model->BSIM3v1dvt1w - + model->BSIM3v1ldvt1w * Inv_L - + model->BSIM3v1wdvt1w * Inv_W - + model->BSIM3v1pdvt1w * Inv_LW; - pParam->BSIM3v1dvt2w = model->BSIM3v1dvt2w - + model->BSIM3v1ldvt2w * Inv_L - + model->BSIM3v1wdvt2w * Inv_W - + model->BSIM3v1pdvt2w * Inv_LW; - pParam->BSIM3v1drout = model->BSIM3v1drout - + model->BSIM3v1ldrout * Inv_L - + model->BSIM3v1wdrout * Inv_W - + model->BSIM3v1pdrout * Inv_LW; - pParam->BSIM3v1dsub = model->BSIM3v1dsub - + model->BSIM3v1ldsub * Inv_L - + model->BSIM3v1wdsub * Inv_W - + model->BSIM3v1pdsub * Inv_LW; - pParam->BSIM3v1vth0 = model->BSIM3v1vth0 - + model->BSIM3v1lvth0 * Inv_L - + model->BSIM3v1wvth0 * Inv_W - + model->BSIM3v1pvth0 * Inv_LW; - pParam->BSIM3v1ua = model->BSIM3v1ua - + model->BSIM3v1lua * Inv_L - + model->BSIM3v1wua * Inv_W - + model->BSIM3v1pua * Inv_LW; - pParam->BSIM3v1ua1 = model->BSIM3v1ua1 - + model->BSIM3v1lua1 * Inv_L - + model->BSIM3v1wua1 * Inv_W - + model->BSIM3v1pua1 * Inv_LW; - pParam->BSIM3v1ub = model->BSIM3v1ub - + model->BSIM3v1lub * Inv_L - + model->BSIM3v1wub * Inv_W - + model->BSIM3v1pub * Inv_LW; - pParam->BSIM3v1ub1 = model->BSIM3v1ub1 - + model->BSIM3v1lub1 * Inv_L - + model->BSIM3v1wub1 * Inv_W - + model->BSIM3v1pub1 * Inv_LW; - pParam->BSIM3v1uc = model->BSIM3v1uc - + model->BSIM3v1luc * Inv_L - + model->BSIM3v1wuc * Inv_W - + model->BSIM3v1puc * Inv_LW; - pParam->BSIM3v1uc1 = model->BSIM3v1uc1 - + model->BSIM3v1luc1 * Inv_L - + model->BSIM3v1wuc1 * Inv_W - + model->BSIM3v1puc1 * Inv_LW; - pParam->BSIM3v1u0 = model->BSIM3v1u0 - + model->BSIM3v1lu0 * Inv_L - + model->BSIM3v1wu0 * Inv_W - + model->BSIM3v1pu0 * Inv_LW; - pParam->BSIM3v1ute = model->BSIM3v1ute - + model->BSIM3v1lute * Inv_L - + model->BSIM3v1wute * Inv_W - + model->BSIM3v1pute * Inv_LW; - pParam->BSIM3v1voff = model->BSIM3v1voff - + model->BSIM3v1lvoff * Inv_L - + model->BSIM3v1wvoff * Inv_W - + model->BSIM3v1pvoff * Inv_LW; - pParam->BSIM3v1delta = model->BSIM3v1delta - + model->BSIM3v1ldelta * Inv_L - + model->BSIM3v1wdelta * Inv_W - + model->BSIM3v1pdelta * Inv_LW; - pParam->BSIM3v1rdsw = model->BSIM3v1rdsw - + model->BSIM3v1lrdsw * Inv_L - + model->BSIM3v1wrdsw * Inv_W - + model->BSIM3v1prdsw * Inv_LW; - pParam->BSIM3v1prwg = model->BSIM3v1prwg - + model->BSIM3v1lprwg * Inv_L - + model->BSIM3v1wprwg * Inv_W - + model->BSIM3v1pprwg * Inv_LW; - pParam->BSIM3v1prwb = model->BSIM3v1prwb - + model->BSIM3v1lprwb * Inv_L - + model->BSIM3v1wprwb * Inv_W - + model->BSIM3v1pprwb * Inv_LW; - pParam->BSIM3v1prt = model->BSIM3v1prt - + model->BSIM3v1lprt * Inv_L - + model->BSIM3v1wprt * Inv_W - + model->BSIM3v1pprt * Inv_LW; - pParam->BSIM3v1eta0 = model->BSIM3v1eta0 - + model->BSIM3v1leta0 * Inv_L - + model->BSIM3v1weta0 * Inv_W - + model->BSIM3v1peta0 * Inv_LW; - pParam->BSIM3v1etab = model->BSIM3v1etab - + model->BSIM3v1letab * Inv_L - + model->BSIM3v1wetab * Inv_W - + model->BSIM3v1petab * Inv_LW; - pParam->BSIM3v1pclm = model->BSIM3v1pclm - + model->BSIM3v1lpclm * Inv_L - + model->BSIM3v1wpclm * Inv_W - + model->BSIM3v1ppclm * Inv_LW; - pParam->BSIM3v1pdibl1 = model->BSIM3v1pdibl1 - + model->BSIM3v1lpdibl1 * Inv_L - + model->BSIM3v1wpdibl1 * Inv_W - + model->BSIM3v1ppdibl1 * Inv_LW; - pParam->BSIM3v1pdibl2 = model->BSIM3v1pdibl2 - + model->BSIM3v1lpdibl2 * Inv_L - + model->BSIM3v1wpdibl2 * Inv_W - + model->BSIM3v1ppdibl2 * Inv_LW; - pParam->BSIM3v1pdiblb = model->BSIM3v1pdiblb - + model->BSIM3v1lpdiblb * Inv_L - + model->BSIM3v1wpdiblb * Inv_W - + model->BSIM3v1ppdiblb * Inv_LW; - pParam->BSIM3v1pscbe1 = model->BSIM3v1pscbe1 - + model->BSIM3v1lpscbe1 * Inv_L - + model->BSIM3v1wpscbe1 * Inv_W - + model->BSIM3v1ppscbe1 * Inv_LW; - pParam->BSIM3v1pscbe2 = model->BSIM3v1pscbe2 - + model->BSIM3v1lpscbe2 * Inv_L - + model->BSIM3v1wpscbe2 * Inv_W - + model->BSIM3v1ppscbe2 * Inv_LW; - pParam->BSIM3v1pvag = model->BSIM3v1pvag - + model->BSIM3v1lpvag * Inv_L - + model->BSIM3v1wpvag * Inv_W - + model->BSIM3v1ppvag * Inv_LW; - pParam->BSIM3v1wr = model->BSIM3v1wr - + model->BSIM3v1lwr * Inv_L - + model->BSIM3v1wwr * Inv_W - + model->BSIM3v1pwr * Inv_LW; - pParam->BSIM3v1dwg = model->BSIM3v1dwg - + model->BSIM3v1ldwg * Inv_L - + model->BSIM3v1wdwg * Inv_W - + model->BSIM3v1pdwg * Inv_LW; - pParam->BSIM3v1dwb = model->BSIM3v1dwb - + model->BSIM3v1ldwb * Inv_L - + model->BSIM3v1wdwb * Inv_W - + model->BSIM3v1pdwb * Inv_LW; - pParam->BSIM3v1b0 = model->BSIM3v1b0 - + model->BSIM3v1lb0 * Inv_L - + model->BSIM3v1wb0 * Inv_W - + model->BSIM3v1pb0 * Inv_LW; - pParam->BSIM3v1b1 = model->BSIM3v1b1 - + model->BSIM3v1lb1 * Inv_L - + model->BSIM3v1wb1 * Inv_W - + model->BSIM3v1pb1 * Inv_LW; - pParam->BSIM3v1alpha0 = model->BSIM3v1alpha0 - + model->BSIM3v1lalpha0 * Inv_L - + model->BSIM3v1walpha0 * Inv_W - + model->BSIM3v1palpha0 * Inv_LW; - pParam->BSIM3v1beta0 = model->BSIM3v1beta0 - + model->BSIM3v1lbeta0 * Inv_L - + model->BSIM3v1wbeta0 * Inv_W - + model->BSIM3v1pbeta0 * Inv_LW; - /* CV model */ - pParam->BSIM3v1elm = model->BSIM3v1elm - + model->BSIM3v1lelm * Inv_L - + model->BSIM3v1welm * Inv_W - + model->BSIM3v1pelm * Inv_LW; - pParam->BSIM3v1cgsl = model->BSIM3v1cgsl - + model->BSIM3v1lcgsl * Inv_L - + model->BSIM3v1wcgsl * Inv_W - + model->BSIM3v1pcgsl * Inv_LW; - pParam->BSIM3v1cgdl = model->BSIM3v1cgdl - + model->BSIM3v1lcgdl * Inv_L - + model->BSIM3v1wcgdl * Inv_W - + model->BSIM3v1pcgdl * Inv_LW; - pParam->BSIM3v1ckappa = model->BSIM3v1ckappa - + model->BSIM3v1lckappa * Inv_L - + model->BSIM3v1wckappa * Inv_W - + model->BSIM3v1pckappa * Inv_LW; - pParam->BSIM3v1cf = model->BSIM3v1cf - + model->BSIM3v1lcf * Inv_L - + model->BSIM3v1wcf * Inv_W - + model->BSIM3v1pcf * Inv_LW; - pParam->BSIM3v1clc = model->BSIM3v1clc - + model->BSIM3v1lclc * Inv_L - + model->BSIM3v1wclc * Inv_W - + model->BSIM3v1pclc * Inv_LW; - pParam->BSIM3v1cle = model->BSIM3v1cle - + model->BSIM3v1lcle * Inv_L - + model->BSIM3v1wcle * Inv_W - + model->BSIM3v1pcle * Inv_LW; - pParam->BSIM3v1vfbcv = model->BSIM3v1vfbcv - + model->BSIM3v1lvfbcv * Inv_L - + model->BSIM3v1wvfbcv * Inv_W - + model->BSIM3v1pvfbcv * Inv_LW; - pParam->BSIM3v1abulkCVfactor = 1.0 + pow((pParam->BSIM3v1clc - / pParam->BSIM3v1leff), - pParam->BSIM3v1cle); + if (model->BSIM3v1binUnit == 1) + { Inv_L = 1.0e-6 / pParam->BSIM3v1leff; + Inv_W = 1.0e-6 / pParam->BSIM3v1weff; + Inv_LW = 1.0e-12 / (pParam->BSIM3v1leff + * pParam->BSIM3v1weff); + } + else + { Inv_L = 1.0 / pParam->BSIM3v1leff; + Inv_W = 1.0 / pParam->BSIM3v1weff; + Inv_LW = 1.0 / (pParam->BSIM3v1leff + * pParam->BSIM3v1weff); + } + pParam->BSIM3v1cdsc = model->BSIM3v1cdsc + + model->BSIM3v1lcdsc * Inv_L + + model->BSIM3v1wcdsc * Inv_W + + model->BSIM3v1pcdsc * Inv_LW; + pParam->BSIM3v1cdscb = model->BSIM3v1cdscb + + model->BSIM3v1lcdscb * Inv_L + + model->BSIM3v1wcdscb * Inv_W + + model->BSIM3v1pcdscb * Inv_LW; - T0 = (TRatio - 1.0); - pParam->BSIM3v1ua = pParam->BSIM3v1ua + pParam->BSIM3v1ua1 * T0; - pParam->BSIM3v1ub = pParam->BSIM3v1ub + pParam->BSIM3v1ub1 * T0; - pParam->BSIM3v1uc = pParam->BSIM3v1uc + pParam->BSIM3v1uc1 * T0; - if (pParam->BSIM3v1u0 > 1.0) + pParam->BSIM3v1cdscd = model->BSIM3v1cdscd + + model->BSIM3v1lcdscd * Inv_L + + model->BSIM3v1wcdscd * Inv_W + + model->BSIM3v1pcdscd * Inv_LW; + + pParam->BSIM3v1cit = model->BSIM3v1cit + + model->BSIM3v1lcit * Inv_L + + model->BSIM3v1wcit * Inv_W + + model->BSIM3v1pcit * Inv_LW; + pParam->BSIM3v1nfactor = model->BSIM3v1nfactor + + model->BSIM3v1lnfactor * Inv_L + + model->BSIM3v1wnfactor * Inv_W + + model->BSIM3v1pnfactor * Inv_LW; + pParam->BSIM3v1xj = model->BSIM3v1xj + + model->BSIM3v1lxj * Inv_L + + model->BSIM3v1wxj * Inv_W + + model->BSIM3v1pxj * Inv_LW; + pParam->BSIM3v1vsat = model->BSIM3v1vsat + + model->BSIM3v1lvsat * Inv_L + + model->BSIM3v1wvsat * Inv_W + + model->BSIM3v1pvsat * Inv_LW; + pParam->BSIM3v1at = model->BSIM3v1at + + model->BSIM3v1lat * Inv_L + + model->BSIM3v1wat * Inv_W + + model->BSIM3v1pat * Inv_LW; + pParam->BSIM3v1a0 = model->BSIM3v1a0 + + model->BSIM3v1la0 * Inv_L + + model->BSIM3v1wa0 * Inv_W + + model->BSIM3v1pa0 * Inv_LW; + + pParam->BSIM3v1ags = model->BSIM3v1ags + + model->BSIM3v1lags * Inv_L + + model->BSIM3v1wags * Inv_W + + model->BSIM3v1pags * Inv_LW; + + pParam->BSIM3v1a1 = model->BSIM3v1a1 + + model->BSIM3v1la1 * Inv_L + + model->BSIM3v1wa1 * Inv_W + + model->BSIM3v1pa1 * Inv_LW; + pParam->BSIM3v1a2 = model->BSIM3v1a2 + + model->BSIM3v1la2 * Inv_L + + model->BSIM3v1wa2 * Inv_W + + model->BSIM3v1pa2 * Inv_LW; + pParam->BSIM3v1keta = model->BSIM3v1keta + + model->BSIM3v1lketa * Inv_L + + model->BSIM3v1wketa * Inv_W + + model->BSIM3v1pketa * Inv_LW; + pParam->BSIM3v1nsub = model->BSIM3v1nsub + + model->BSIM3v1lnsub * Inv_L + + model->BSIM3v1wnsub * Inv_W + + model->BSIM3v1pnsub * Inv_LW; + pParam->BSIM3v1npeak = model->BSIM3v1npeak + + model->BSIM3v1lnpeak * Inv_L + + model->BSIM3v1wnpeak * Inv_W + + model->BSIM3v1pnpeak * Inv_LW; + pParam->BSIM3v1ngate = model->BSIM3v1ngate + + model->BSIM3v1lngate * Inv_L + + model->BSIM3v1wngate * Inv_W + + model->BSIM3v1pngate * Inv_LW; + pParam->BSIM3v1gamma1 = model->BSIM3v1gamma1 + + model->BSIM3v1lgamma1 * Inv_L + + model->BSIM3v1wgamma1 * Inv_W + + model->BSIM3v1pgamma1 * Inv_LW; + pParam->BSIM3v1gamma2 = model->BSIM3v1gamma2 + + model->BSIM3v1lgamma2 * Inv_L + + model->BSIM3v1wgamma2 * Inv_W + + model->BSIM3v1pgamma2 * Inv_LW; + pParam->BSIM3v1vbx = model->BSIM3v1vbx + + model->BSIM3v1lvbx * Inv_L + + model->BSIM3v1wvbx * Inv_W + + model->BSIM3v1pvbx * Inv_LW; + pParam->BSIM3v1vbm = model->BSIM3v1vbm + + model->BSIM3v1lvbm * Inv_L + + model->BSIM3v1wvbm * Inv_W + + model->BSIM3v1pvbm * Inv_LW; + pParam->BSIM3v1xt = model->BSIM3v1xt + + model->BSIM3v1lxt * Inv_L + + model->BSIM3v1wxt * Inv_W + + model->BSIM3v1pxt * Inv_LW; + pParam->BSIM3v1k1 = model->BSIM3v1k1 + + model->BSIM3v1lk1 * Inv_L + + model->BSIM3v1wk1 * Inv_W + + model->BSIM3v1pk1 * Inv_LW; + pParam->BSIM3v1kt1 = model->BSIM3v1kt1 + + model->BSIM3v1lkt1 * Inv_L + + model->BSIM3v1wkt1 * Inv_W + + model->BSIM3v1pkt1 * Inv_LW; + pParam->BSIM3v1kt1l = model->BSIM3v1kt1l + + model->BSIM3v1lkt1l * Inv_L + + model->BSIM3v1wkt1l * Inv_W + + model->BSIM3v1pkt1l * Inv_LW; + pParam->BSIM3v1k2 = model->BSIM3v1k2 + + model->BSIM3v1lk2 * Inv_L + + model->BSIM3v1wk2 * Inv_W + + model->BSIM3v1pk2 * Inv_LW; + pParam->BSIM3v1kt2 = model->BSIM3v1kt2 + + model->BSIM3v1lkt2 * Inv_L + + model->BSIM3v1wkt2 * Inv_W + + model->BSIM3v1pkt2 * Inv_LW; + pParam->BSIM3v1k3 = model->BSIM3v1k3 + + model->BSIM3v1lk3 * Inv_L + + model->BSIM3v1wk3 * Inv_W + + model->BSIM3v1pk3 * Inv_LW; + pParam->BSIM3v1k3b = model->BSIM3v1k3b + + model->BSIM3v1lk3b * Inv_L + + model->BSIM3v1wk3b * Inv_W + + model->BSIM3v1pk3b * Inv_LW; + pParam->BSIM3v1w0 = model->BSIM3v1w0 + + model->BSIM3v1lw0 * Inv_L + + model->BSIM3v1ww0 * Inv_W + + model->BSIM3v1pw0 * Inv_LW; + pParam->BSIM3v1nlx = model->BSIM3v1nlx + + model->BSIM3v1lnlx * Inv_L + + model->BSIM3v1wnlx * Inv_W + + model->BSIM3v1pnlx * Inv_LW; + pParam->BSIM3v1dvt0 = model->BSIM3v1dvt0 + + model->BSIM3v1ldvt0 * Inv_L + + model->BSIM3v1wdvt0 * Inv_W + + model->BSIM3v1pdvt0 * Inv_LW; + pParam->BSIM3v1dvt1 = model->BSIM3v1dvt1 + + model->BSIM3v1ldvt1 * Inv_L + + model->BSIM3v1wdvt1 * Inv_W + + model->BSIM3v1pdvt1 * Inv_LW; + pParam->BSIM3v1dvt2 = model->BSIM3v1dvt2 + + model->BSIM3v1ldvt2 * Inv_L + + model->BSIM3v1wdvt2 * Inv_W + + model->BSIM3v1pdvt2 * Inv_LW; + pParam->BSIM3v1dvt0w = model->BSIM3v1dvt0w + + model->BSIM3v1ldvt0w * Inv_L + + model->BSIM3v1wdvt0w * Inv_W + + model->BSIM3v1pdvt0w * Inv_LW; + pParam->BSIM3v1dvt1w = model->BSIM3v1dvt1w + + model->BSIM3v1ldvt1w * Inv_L + + model->BSIM3v1wdvt1w * Inv_W + + model->BSIM3v1pdvt1w * Inv_LW; + pParam->BSIM3v1dvt2w = model->BSIM3v1dvt2w + + model->BSIM3v1ldvt2w * Inv_L + + model->BSIM3v1wdvt2w * Inv_W + + model->BSIM3v1pdvt2w * Inv_LW; + pParam->BSIM3v1drout = model->BSIM3v1drout + + model->BSIM3v1ldrout * Inv_L + + model->BSIM3v1wdrout * Inv_W + + model->BSIM3v1pdrout * Inv_LW; + pParam->BSIM3v1dsub = model->BSIM3v1dsub + + model->BSIM3v1ldsub * Inv_L + + model->BSIM3v1wdsub * Inv_W + + model->BSIM3v1pdsub * Inv_LW; + pParam->BSIM3v1vth0 = model->BSIM3v1vth0 + + model->BSIM3v1lvth0 * Inv_L + + model->BSIM3v1wvth0 * Inv_W + + model->BSIM3v1pvth0 * Inv_LW; + pParam->BSIM3v1ua = model->BSIM3v1ua + + model->BSIM3v1lua * Inv_L + + model->BSIM3v1wua * Inv_W + + model->BSIM3v1pua * Inv_LW; + pParam->BSIM3v1ua1 = model->BSIM3v1ua1 + + model->BSIM3v1lua1 * Inv_L + + model->BSIM3v1wua1 * Inv_W + + model->BSIM3v1pua1 * Inv_LW; + pParam->BSIM3v1ub = model->BSIM3v1ub + + model->BSIM3v1lub * Inv_L + + model->BSIM3v1wub * Inv_W + + model->BSIM3v1pub * Inv_LW; + pParam->BSIM3v1ub1 = model->BSIM3v1ub1 + + model->BSIM3v1lub1 * Inv_L + + model->BSIM3v1wub1 * Inv_W + + model->BSIM3v1pub1 * Inv_LW; + pParam->BSIM3v1uc = model->BSIM3v1uc + + model->BSIM3v1luc * Inv_L + + model->BSIM3v1wuc * Inv_W + + model->BSIM3v1puc * Inv_LW; + pParam->BSIM3v1uc1 = model->BSIM3v1uc1 + + model->BSIM3v1luc1 * Inv_L + + model->BSIM3v1wuc1 * Inv_W + + model->BSIM3v1puc1 * Inv_LW; + pParam->BSIM3v1u0 = model->BSIM3v1u0 + + model->BSIM3v1lu0 * Inv_L + + model->BSIM3v1wu0 * Inv_W + + model->BSIM3v1pu0 * Inv_LW; + pParam->BSIM3v1ute = model->BSIM3v1ute + + model->BSIM3v1lute * Inv_L + + model->BSIM3v1wute * Inv_W + + model->BSIM3v1pute * Inv_LW; + pParam->BSIM3v1voff = model->BSIM3v1voff + + model->BSIM3v1lvoff * Inv_L + + model->BSIM3v1wvoff * Inv_W + + model->BSIM3v1pvoff * Inv_LW; + pParam->BSIM3v1delta = model->BSIM3v1delta + + model->BSIM3v1ldelta * Inv_L + + model->BSIM3v1wdelta * Inv_W + + model->BSIM3v1pdelta * Inv_LW; + pParam->BSIM3v1rdsw = model->BSIM3v1rdsw + + model->BSIM3v1lrdsw * Inv_L + + model->BSIM3v1wrdsw * Inv_W + + model->BSIM3v1prdsw * Inv_LW; + pParam->BSIM3v1prwg = model->BSIM3v1prwg + + model->BSIM3v1lprwg * Inv_L + + model->BSIM3v1wprwg * Inv_W + + model->BSIM3v1pprwg * Inv_LW; + pParam->BSIM3v1prwb = model->BSIM3v1prwb + + model->BSIM3v1lprwb * Inv_L + + model->BSIM3v1wprwb * Inv_W + + model->BSIM3v1pprwb * Inv_LW; + pParam->BSIM3v1prt = model->BSIM3v1prt + + model->BSIM3v1lprt * Inv_L + + model->BSIM3v1wprt * Inv_W + + model->BSIM3v1pprt * Inv_LW; + pParam->BSIM3v1eta0 = model->BSIM3v1eta0 + + model->BSIM3v1leta0 * Inv_L + + model->BSIM3v1weta0 * Inv_W + + model->BSIM3v1peta0 * Inv_LW; + pParam->BSIM3v1etab = model->BSIM3v1etab + + model->BSIM3v1letab * Inv_L + + model->BSIM3v1wetab * Inv_W + + model->BSIM3v1petab * Inv_LW; + pParam->BSIM3v1pclm = model->BSIM3v1pclm + + model->BSIM3v1lpclm * Inv_L + + model->BSIM3v1wpclm * Inv_W + + model->BSIM3v1ppclm * Inv_LW; + pParam->BSIM3v1pdibl1 = model->BSIM3v1pdibl1 + + model->BSIM3v1lpdibl1 * Inv_L + + model->BSIM3v1wpdibl1 * Inv_W + + model->BSIM3v1ppdibl1 * Inv_LW; + pParam->BSIM3v1pdibl2 = model->BSIM3v1pdibl2 + + model->BSIM3v1lpdibl2 * Inv_L + + model->BSIM3v1wpdibl2 * Inv_W + + model->BSIM3v1ppdibl2 * Inv_LW; + pParam->BSIM3v1pdiblb = model->BSIM3v1pdiblb + + model->BSIM3v1lpdiblb * Inv_L + + model->BSIM3v1wpdiblb * Inv_W + + model->BSIM3v1ppdiblb * Inv_LW; + pParam->BSIM3v1pscbe1 = model->BSIM3v1pscbe1 + + model->BSIM3v1lpscbe1 * Inv_L + + model->BSIM3v1wpscbe1 * Inv_W + + model->BSIM3v1ppscbe1 * Inv_LW; + pParam->BSIM3v1pscbe2 = model->BSIM3v1pscbe2 + + model->BSIM3v1lpscbe2 * Inv_L + + model->BSIM3v1wpscbe2 * Inv_W + + model->BSIM3v1ppscbe2 * Inv_LW; + pParam->BSIM3v1pvag = model->BSIM3v1pvag + + model->BSIM3v1lpvag * Inv_L + + model->BSIM3v1wpvag * Inv_W + + model->BSIM3v1ppvag * Inv_LW; + pParam->BSIM3v1wr = model->BSIM3v1wr + + model->BSIM3v1lwr * Inv_L + + model->BSIM3v1wwr * Inv_W + + model->BSIM3v1pwr * Inv_LW; + pParam->BSIM3v1dwg = model->BSIM3v1dwg + + model->BSIM3v1ldwg * Inv_L + + model->BSIM3v1wdwg * Inv_W + + model->BSIM3v1pdwg * Inv_LW; + pParam->BSIM3v1dwb = model->BSIM3v1dwb + + model->BSIM3v1ldwb * Inv_L + + model->BSIM3v1wdwb * Inv_W + + model->BSIM3v1pdwb * Inv_LW; + pParam->BSIM3v1b0 = model->BSIM3v1b0 + + model->BSIM3v1lb0 * Inv_L + + model->BSIM3v1wb0 * Inv_W + + model->BSIM3v1pb0 * Inv_LW; + pParam->BSIM3v1b1 = model->BSIM3v1b1 + + model->BSIM3v1lb1 * Inv_L + + model->BSIM3v1wb1 * Inv_W + + model->BSIM3v1pb1 * Inv_LW; + pParam->BSIM3v1alpha0 = model->BSIM3v1alpha0 + + model->BSIM3v1lalpha0 * Inv_L + + model->BSIM3v1walpha0 * Inv_W + + model->BSIM3v1palpha0 * Inv_LW; + pParam->BSIM3v1beta0 = model->BSIM3v1beta0 + + model->BSIM3v1lbeta0 * Inv_L + + model->BSIM3v1wbeta0 * Inv_W + + model->BSIM3v1pbeta0 * Inv_LW; + /* CV model */ + pParam->BSIM3v1elm = model->BSIM3v1elm + + model->BSIM3v1lelm * Inv_L + + model->BSIM3v1welm * Inv_W + + model->BSIM3v1pelm * Inv_LW; + pParam->BSIM3v1cgsl = model->BSIM3v1cgsl + + model->BSIM3v1lcgsl * Inv_L + + model->BSIM3v1wcgsl * Inv_W + + model->BSIM3v1pcgsl * Inv_LW; + pParam->BSIM3v1cgdl = model->BSIM3v1cgdl + + model->BSIM3v1lcgdl * Inv_L + + model->BSIM3v1wcgdl * Inv_W + + model->BSIM3v1pcgdl * Inv_LW; + pParam->BSIM3v1ckappa = model->BSIM3v1ckappa + + model->BSIM3v1lckappa * Inv_L + + model->BSIM3v1wckappa * Inv_W + + model->BSIM3v1pckappa * Inv_LW; + pParam->BSIM3v1cf = model->BSIM3v1cf + + model->BSIM3v1lcf * Inv_L + + model->BSIM3v1wcf * Inv_W + + model->BSIM3v1pcf * Inv_LW; + pParam->BSIM3v1clc = model->BSIM3v1clc + + model->BSIM3v1lclc * Inv_L + + model->BSIM3v1wclc * Inv_W + + model->BSIM3v1pclc * Inv_LW; + pParam->BSIM3v1cle = model->BSIM3v1cle + + model->BSIM3v1lcle * Inv_L + + model->BSIM3v1wcle * Inv_W + + model->BSIM3v1pcle * Inv_LW; + pParam->BSIM3v1vfbcv = model->BSIM3v1vfbcv + + model->BSIM3v1lvfbcv * Inv_L + + model->BSIM3v1wvfbcv * Inv_W + + model->BSIM3v1pvfbcv * Inv_LW; + pParam->BSIM3v1abulkCVfactor = 1.0 + pow((pParam->BSIM3v1clc + / pParam->BSIM3v1leff), + pParam->BSIM3v1cle); + + T0 = (TRatio - 1.0); + pParam->BSIM3v1ua = pParam->BSIM3v1ua + pParam->BSIM3v1ua1 * T0; + pParam->BSIM3v1ub = pParam->BSIM3v1ub + pParam->BSIM3v1ub1 * T0; + pParam->BSIM3v1uc = pParam->BSIM3v1uc + pParam->BSIM3v1uc1 * T0; + if (pParam->BSIM3v1u0 > 1.0) pParam->BSIM3v1u0 = pParam->BSIM3v1u0 / 1.0e4; pParam->BSIM3v1u0temp = pParam->BSIM3v1u0 - * pow(TRatio, pParam->BSIM3v1ute); - pParam->BSIM3v1vsattemp = pParam->BSIM3v1vsat - pParam->BSIM3v1at - * T0; - pParam->BSIM3v1rds0 = (pParam->BSIM3v1rdsw + pParam->BSIM3v1prt * T0) + * pow(TRatio, pParam->BSIM3v1ute); + pParam->BSIM3v1vsattemp = pParam->BSIM3v1vsat - pParam->BSIM3v1at + * T0; + pParam->BSIM3v1rds0 = (pParam->BSIM3v1rdsw + pParam->BSIM3v1prt * T0) / pow(pParam->BSIM3v1weff * 1E6, pParam->BSIM3v1wr); - if (BSIM3v1checkModel(model, here, ckt)) - { + if (BSIM3v1checkModel(model, here, ckt)) + { SPfrontEnd->IFerrorf (ERR_FATAL, "Fatal error(s) detected during BSIM3V3.1 parameter checking for %s in model %s", model->BSIM3v1modName, here->BSIM3v1name); - return(E_BADPARM); - } + return(E_BADPARM); + } pParam->BSIM3v1cgdo = (model->BSIM3v1cgdo + pParam->BSIM3v1cf) - * pParam->BSIM3v1weffCV; + * pParam->BSIM3v1weffCV; pParam->BSIM3v1cgso = (model->BSIM3v1cgso + pParam->BSIM3v1cf) - * pParam->BSIM3v1weffCV; + * pParam->BSIM3v1weffCV; pParam->BSIM3v1cgbo = model->BSIM3v1cgbo * pParam->BSIM3v1leffCV; if (!model->BSIM3v1npeakGiven && model->BSIM3v1gamma1Given) @@ -538,31 +538,31 @@ int Size_Not_Found; pParam->BSIM3v1npeak = 3.021E22 * T0 * T0; } - pParam->BSIM3v1phi = 2.0 * Vtm0 - * log(pParam->BSIM3v1npeak / ni); + pParam->BSIM3v1phi = 2.0 * Vtm0 + * log(pParam->BSIM3v1npeak / ni); - pParam->BSIM3v1sqrtPhi = sqrt(pParam->BSIM3v1phi); - pParam->BSIM3v1phis3 = pParam->BSIM3v1sqrtPhi * pParam->BSIM3v1phi; + pParam->BSIM3v1sqrtPhi = sqrt(pParam->BSIM3v1phi); + pParam->BSIM3v1phis3 = pParam->BSIM3v1sqrtPhi * pParam->BSIM3v1phi; pParam->BSIM3v1Xdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->BSIM3v1npeak * 1.0e6)) - * pParam->BSIM3v1sqrtPhi; + * pParam->BSIM3v1npeak * 1.0e6)) + * pParam->BSIM3v1sqrtPhi; pParam->BSIM3v1sqrtXdep0 = sqrt(pParam->BSIM3v1Xdep0); pParam->BSIM3v1litl = sqrt(3.0 * pParam->BSIM3v1xj - * model->BSIM3v1tox); + * model->BSIM3v1tox); pParam->BSIM3v1vbi = Vtm0 * log(1.0e20 - * pParam->BSIM3v1npeak / (ni * ni)); + * pParam->BSIM3v1npeak / (ni * ni)); pParam->BSIM3v1cdep0 = sqrt(Charge_q * EPSSI - * pParam->BSIM3v1npeak * 1.0e6 / 2.0 - / pParam->BSIM3v1phi); - + * pParam->BSIM3v1npeak * 1.0e6 / 2.0 + / pParam->BSIM3v1phi); + if (model->BSIM3v1k1Given || model->BSIM3v1k2Given) - { if (!model->BSIM3v1k1Given) - { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); + { if (!model->BSIM3v1k1Given) + { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); pParam->BSIM3v1k1 = 0.53; } if (!model->BSIM3v1k2Given) - { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); + { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); pParam->BSIM3v1k2 = -0.0186; } if (model->BSIM3v1nsubGiven) @@ -579,89 +579,89 @@ int Size_Not_Found; fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); } else - { if (!model->BSIM3v1vbxGiven) - pParam->BSIM3v1vbx = pParam->BSIM3v1phi - 7.7348e-4 + { if (!model->BSIM3v1vbxGiven) + pParam->BSIM3v1vbx = pParam->BSIM3v1phi - 7.7348e-4 * pParam->BSIM3v1npeak - * pParam->BSIM3v1xt * pParam->BSIM3v1xt; - if (pParam->BSIM3v1vbx > 0.0) - pParam->BSIM3v1vbx = -pParam->BSIM3v1vbx; - if (pParam->BSIM3v1vbm > 0.0) + * pParam->BSIM3v1xt * pParam->BSIM3v1xt; + if (pParam->BSIM3v1vbx > 0.0) + pParam->BSIM3v1vbx = -pParam->BSIM3v1vbx; + if (pParam->BSIM3v1vbm > 0.0) pParam->BSIM3v1vbm = -pParam->BSIM3v1vbm; - + if (!model->BSIM3v1gamma1Given) pParam->BSIM3v1gamma1 = 5.753e-12 - * sqrt(pParam->BSIM3v1npeak) + * sqrt(pParam->BSIM3v1npeak) / model->BSIM3v1cox; if (!model->BSIM3v1gamma2Given) pParam->BSIM3v1gamma2 = 5.753e-12 - * sqrt(pParam->BSIM3v1nsub) + * sqrt(pParam->BSIM3v1nsub) / model->BSIM3v1cox; T0 = pParam->BSIM3v1gamma1 - pParam->BSIM3v1gamma2; T1 = sqrt(pParam->BSIM3v1phi - pParam->BSIM3v1vbx) - - pParam->BSIM3v1sqrtPhi; + - pParam->BSIM3v1sqrtPhi; T2 = sqrt(pParam->BSIM3v1phi * (pParam->BSIM3v1phi - - pParam->BSIM3v1vbm)) - pParam->BSIM3v1phi; + - pParam->BSIM3v1vbm)) - pParam->BSIM3v1phi; pParam->BSIM3v1k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM3v1vbm); pParam->BSIM3v1k1 = pParam->BSIM3v1gamma2 - 2.0 - * pParam->BSIM3v1k2 * sqrt(pParam->BSIM3v1phi - - pParam->BSIM3v1vbm); + * pParam->BSIM3v1k2 * sqrt(pParam->BSIM3v1phi + - pParam->BSIM3v1vbm); } - - if (pParam->BSIM3v1k2 < 0.0) - { T0 = 0.5 * pParam->BSIM3v1k1 / pParam->BSIM3v1k2; - pParam->BSIM3v1vbsc = 0.9 * (pParam->BSIM3v1phi - T0 * T0); - if (pParam->BSIM3v1vbsc > -3.0) - pParam->BSIM3v1vbsc = -3.0; - else if (pParam->BSIM3v1vbsc < -30.0) - pParam->BSIM3v1vbsc = -30.0; - } - else - { pParam->BSIM3v1vbsc = -30.0; - } - if (pParam->BSIM3v1vbsc > pParam->BSIM3v1vbm) - pParam->BSIM3v1vbsc = pParam->BSIM3v1vbm; - if (model->BSIM3v1vth0Given) - { pParam->BSIM3v1vfb = model->BSIM3v1type * pParam->BSIM3v1vth0 - - pParam->BSIM3v1phi - pParam->BSIM3v1k1 + if (pParam->BSIM3v1k2 < 0.0) + { T0 = 0.5 * pParam->BSIM3v1k1 / pParam->BSIM3v1k2; + pParam->BSIM3v1vbsc = 0.9 * (pParam->BSIM3v1phi - T0 * T0); + if (pParam->BSIM3v1vbsc > -3.0) + pParam->BSIM3v1vbsc = -3.0; + else if (pParam->BSIM3v1vbsc < -30.0) + pParam->BSIM3v1vbsc = -30.0; + } + else + { pParam->BSIM3v1vbsc = -30.0; + } + if (pParam->BSIM3v1vbsc > pParam->BSIM3v1vbm) + pParam->BSIM3v1vbsc = pParam->BSIM3v1vbm; + + if (model->BSIM3v1vth0Given) + { pParam->BSIM3v1vfb = model->BSIM3v1type * pParam->BSIM3v1vth0 + - pParam->BSIM3v1phi - pParam->BSIM3v1k1 * pParam->BSIM3v1sqrtPhi; - } - else - { pParam->BSIM3v1vfb = -1.0; - pParam->BSIM3v1vth0 = model->BSIM3v1type * (pParam->BSIM3v1vfb - + pParam->BSIM3v1phi + pParam->BSIM3v1k1 + } + else + { pParam->BSIM3v1vfb = -1.0; + pParam->BSIM3v1vth0 = model->BSIM3v1type * (pParam->BSIM3v1vfb + + pParam->BSIM3v1phi + pParam->BSIM3v1k1 * pParam->BSIM3v1sqrtPhi); - } + } T1 = sqrt(EPSSI / EPSOX * model->BSIM3v1tox - * pParam->BSIM3v1Xdep0); + * pParam->BSIM3v1Xdep0); T0 = exp(-0.5 * pParam->BSIM3v1dsub * pParam->BSIM3v1leff / T1); pParam->BSIM3v1theta0vb0 = (T0 + 2.0 * T0 * T0); T0 = exp(-0.5 * pParam->BSIM3v1drout * pParam->BSIM3v1leff / T1); T2 = (T0 + 2.0 * T0 * T0); pParam->BSIM3v1thetaRout = pParam->BSIM3v1pdibl1 * T2 - + pParam->BSIM3v1pdibl2; - } + + pParam->BSIM3v1pdibl2; + } /* process source/drain series resistance */ - here->BSIM3v1drainConductance = model->BSIM3v1sheetResistance - * here->BSIM3v1drainSquares; + here->BSIM3v1drainConductance = model->BSIM3v1sheetResistance + * here->BSIM3v1drainSquares; if (here->BSIM3v1drainConductance > 0.0) here->BSIM3v1drainConductance = 1.0 - / here->BSIM3v1drainConductance; - else + / here->BSIM3v1drainConductance; + else here->BSIM3v1drainConductance = 0.0; - - here->BSIM3v1sourceConductance = model->BSIM3v1sheetResistance - * here->BSIM3v1sourceSquares; - if (here->BSIM3v1sourceConductance > 0.0) + + here->BSIM3v1sourceConductance = model->BSIM3v1sheetResistance + * here->BSIM3v1sourceSquares; + if (here->BSIM3v1sourceConductance > 0.0) here->BSIM3v1sourceConductance = 1.0 - / here->BSIM3v1sourceConductance; - else + / here->BSIM3v1sourceConductance; + else here->BSIM3v1sourceConductance = 0.0; - here->BSIM3v1cgso = pParam->BSIM3v1cgso; - here->BSIM3v1cgdo = pParam->BSIM3v1cgdo; + here->BSIM3v1cgso = pParam->BSIM3v1cgso; + here->BSIM3v1cgdo = pParam->BSIM3v1cgdo; } } return(OK); diff --git a/src/spicelib/devices/bsim4/b4temp.c b/src/spicelib/devices/bsim4/b4temp.c index de0aee17c..aa69d7b21 100644 --- a/src/spicelib/devices/bsim4/b4temp.c +++ b/src/spicelib/devices/bsim4/b4temp.c @@ -1393,7 +1393,7 @@ int Size_Not_Found, i; pParam->BSIM4Bechvb = (model->BSIM4type == NMOS) ? 7.45669e11 : 1.16645e12; if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4))) - { + { pParam->BSIM4AechvbEdgeS = pParam->BSIM4Aechvb * pParam->BSIM4weff * model->BSIM4dlcig * pParam->BSIM4ToxRatioEdge; pParam->BSIM4AechvbEdgeD = pParam->BSIM4Aechvb * pParam->BSIM4weff @@ -1626,7 +1626,7 @@ int Size_Not_Found, i; /*high k*/ /*Calculate VgsteffVth for mobMod=3*/ if(model->BSIM4mobMod==3) - { /*Calculate n @ Vbs=Vds=0*/ + { /*Calculate n @ Vbs=Vds=0*/ lt1 = model->BSIM4factor1* pParam->BSIM4sqrtXdep0; T0 = pParam->BSIM4dvt1 * pParam->BSIM4leff / lt1; if (T0 < EXP_THRESHOLD) @@ -1877,14 +1877,14 @@ int Size_Not_Found, i; } /*rbpbx = exp( log(model->BSIM4rbpbx0) + model->BSIM4rbpbxl * lnl + - model->BSIM4rbpbxw * lnw + model->BSIM4rbpbxnf * lnnf ); + model->BSIM4rbpbxw * lnw + model->BSIM4rbpbxnf * lnnf ); rbpby = exp( log(model->BSIM4rbpby0) + model->BSIM4rbpbyl * lnl + - model->BSIM4rbpbyw * lnw + model->BSIM4rbpbynf * lnnf ); + model->BSIM4rbpbyw * lnw + model->BSIM4rbpbynf * lnnf ); */ rbpbx = model->BSIM4rbpbx0 * exp( model->BSIM4rbpbxl * lnl + - model->BSIM4rbpbxw * lnw + model->BSIM4rbpbxnf * lnnf ); + model->BSIM4rbpbxw * lnw + model->BSIM4rbpbxnf * lnnf ); rbpby = model->BSIM4rbpby0 * exp( model->BSIM4rbpbyl * lnl + - model->BSIM4rbpbyw * lnw + model->BSIM4rbpbynf * lnnf ); + model->BSIM4rbpbyw * lnw + model->BSIM4rbpbynf * lnnf ); here->BSIM4rbpb = rbpbx*rbpby/(rbpbx + rbpby); } diff --git a/src/spicelib/devices/bsim4v5/b4v5temp.c b/src/spicelib/devices/bsim4v5/b4v5temp.c index 13792f397..3b871a5e1 100644 --- a/src/spicelib/devices/bsim4v5/b4v5temp.c +++ b/src/spicelib/devices/bsim4v5/b4v5temp.c @@ -23,7 +23,7 @@ #include "ngspice/suffix.h" #define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 +#define KboQ 8.617087e-5 #define EPS0 8.85418e-12 #define EPSSI 1.03594e-10 #define PI 3.141592654 @@ -85,20 +85,20 @@ int Size_Not_Found, i; /* loop through all the BSIM4v5 device models */ for (; model != NULL; model = BSIM4v5nextModel(model)) { Temp = ckt->CKTtemp; - if (model->BSIM4v5SbulkJctPotential < 0.1) - { model->BSIM4v5SbulkJctPotential = 0.1; - fprintf(stderr, "Given pbs is less than 0.1. Pbs is set to 0.1.\n"); - } + if (model->BSIM4v5SbulkJctPotential < 0.1) + { model->BSIM4v5SbulkJctPotential = 0.1; + fprintf(stderr, "Given pbs is less than 0.1. Pbs is set to 0.1.\n"); + } if (model->BSIM4v5SsidewallJctPotential < 0.1) - { model->BSIM4v5SsidewallJctPotential = 0.1; - fprintf(stderr, "Given pbsws is less than 0.1. Pbsws is set to 0.1.\n"); - } + { model->BSIM4v5SsidewallJctPotential = 0.1; + fprintf(stderr, "Given pbsws is less than 0.1. Pbsws is set to 0.1.\n"); + } if (model->BSIM4v5SGatesidewallJctPotential < 0.1) - { model->BSIM4v5SGatesidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswgs is less than 0.1. Pbswgs is set to 0.1.\n"); - } + { model->BSIM4v5SGatesidewallJctPotential = 0.1; + fprintf(stderr, "Given pbswgs is less than 0.1. Pbswgs is set to 0.1.\n"); + } - if (model->BSIM4v5DbulkJctPotential < 0.1) + if (model->BSIM4v5DbulkJctPotential < 0.1) { model->BSIM4v5DbulkJctPotential = 0.1; fprintf(stderr, "Given pbd is less than 0.1. Pbd is set to 0.1.\n"); } @@ -114,9 +114,9 @@ int Size_Not_Found, i; if ((model->BSIM4v5toxeGiven) && (model->BSIM4v5toxpGiven) && (model->BSIM4v5dtoxGiven) && (model->BSIM4v5toxe != (model->BSIM4v5toxp + model->BSIM4v5dtox))) printf("Warning: toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored.\n"); - else if ((model->BSIM4v5toxeGiven) && (!model->BSIM4v5toxpGiven)) - model->BSIM4v5toxp = model->BSIM4v5toxe - model->BSIM4v5dtox; - else if ((!model->BSIM4v5toxeGiven) && (model->BSIM4v5toxpGiven)) + else if ((model->BSIM4v5toxeGiven) && (!model->BSIM4v5toxpGiven)) + model->BSIM4v5toxp = model->BSIM4v5toxe - model->BSIM4v5dtox; + else if ((!model->BSIM4v5toxeGiven) && (model->BSIM4v5toxpGiven)) model->BSIM4v5toxe = model->BSIM4v5toxp + model->BSIM4v5dtox; model->BSIM4v5coxe = model->BSIM4v5epsrox * EPS0 / model->BSIM4v5toxe; @@ -148,33 +148,33 @@ int Size_Not_Found, i; model->pSizeDependParamKnot = NULL; pLastKnot = NULL; - Tnom = model->BSIM4v5tnom; - TRatio = Temp / Tnom; + Tnom = model->BSIM4v5tnom; + TRatio = Temp / Tnom; - model->BSIM4v5vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); + model->BSIM4v5vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); model->BSIM4v5factor1 = sqrt(EPSSI / (model->BSIM4v5epsrox * EPS0) * model->BSIM4v5toxe); Vtm0 = model->BSIM4v5vtm0 = KboQ * Tnom; Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) + ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); model->BSIM4v5vtm = KboQ * Temp; Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - if (Temp != Tnom) - { T0 = Eg0 / Vtm0 - Eg / model->BSIM4v5vtm; - T1 = log(Temp / Tnom); - T2 = T0 + model->BSIM4v5SjctTempExponent * T1; - T3 = exp(T2 / model->BSIM4v5SjctEmissionCoeff); - model->BSIM4v5SjctTempSatCurDensity = model->BSIM4v5SjctSatCurDensity - * T3; - model->BSIM4v5SjctSidewallTempSatCurDensity - = model->BSIM4v5SjctSidewallSatCurDensity * T3; + if (Temp != Tnom) + { T0 = Eg0 / Vtm0 - Eg / model->BSIM4v5vtm; + T1 = log(Temp / Tnom); + T2 = T0 + model->BSIM4v5SjctTempExponent * T1; + T3 = exp(T2 / model->BSIM4v5SjctEmissionCoeff); + model->BSIM4v5SjctTempSatCurDensity = model->BSIM4v5SjctSatCurDensity + * T3; + model->BSIM4v5SjctSidewallTempSatCurDensity + = model->BSIM4v5SjctSidewallSatCurDensity * T3; model->BSIM4v5SjctGateSidewallTempSatCurDensity = model->BSIM4v5SjctGateSidewallSatCurDensity * T3; - T2 = T0 + model->BSIM4v5DjctTempExponent * T1; + T2 = T0 + model->BSIM4v5DjctTempExponent * T1; T3 = exp(T2 / model->BSIM4v5DjctEmissionCoeff); model->BSIM4v5DjctTempSatCurDensity = model->BSIM4v5DjctSatCurDensity * T3; @@ -182,11 +182,11 @@ int Size_Not_Found, i; = model->BSIM4v5DjctSidewallSatCurDensity * T3; model->BSIM4v5DjctGateSidewallTempSatCurDensity = model->BSIM4v5DjctGateSidewallSatCurDensity * T3; - } - else - { model->BSIM4v5SjctTempSatCurDensity = model->BSIM4v5SjctSatCurDensity; - model->BSIM4v5SjctSidewallTempSatCurDensity - = model->BSIM4v5SjctSidewallSatCurDensity; + } + else + { model->BSIM4v5SjctTempSatCurDensity = model->BSIM4v5SjctSatCurDensity; + model->BSIM4v5SjctSidewallTempSatCurDensity + = model->BSIM4v5SjctSidewallSatCurDensity; model->BSIM4v5SjctGateSidewallTempSatCurDensity = model->BSIM4v5SjctGateSidewallSatCurDensity; model->BSIM4v5DjctTempSatCurDensity = model->BSIM4v5DjctSatCurDensity; @@ -194,12 +194,12 @@ int Size_Not_Found, i; = model->BSIM4v5DjctSidewallSatCurDensity; model->BSIM4v5DjctGateSidewallTempSatCurDensity = model->BSIM4v5DjctGateSidewallSatCurDensity; - } + } - if (model->BSIM4v5SjctTempSatCurDensity < 0.0) - model->BSIM4v5SjctTempSatCurDensity = 0.0; - if (model->BSIM4v5SjctSidewallTempSatCurDensity < 0.0) - model->BSIM4v5SjctSidewallTempSatCurDensity = 0.0; + if (model->BSIM4v5SjctTempSatCurDensity < 0.0) + model->BSIM4v5SjctTempSatCurDensity = 0.0; + if (model->BSIM4v5SjctSidewallTempSatCurDensity < 0.0) + model->BSIM4v5SjctSidewallTempSatCurDensity = 0.0; if (model->BSIM4v5SjctGateSidewallTempSatCurDensity < 0.0) model->BSIM4v5SjctGateSidewallTempSatCurDensity = 0.0; if (model->BSIM4v5DjctTempSatCurDensity < 0.0) @@ -209,60 +209,60 @@ int Size_Not_Found, i; if (model->BSIM4v5DjctGateSidewallTempSatCurDensity < 0.0) model->BSIM4v5DjctGateSidewallTempSatCurDensity = 0.0; - /* Temperature dependence of D/B and S/B diode capacitance begins */ - delTemp = ckt->CKTtemp - model->BSIM4v5tnom; - T0 = model->BSIM4v5tcj * delTemp; - if (T0 >= -1.0) - { model->BSIM4v5SunitAreaTempJctCap = model->BSIM4v5SunitAreaJctCap *(1.0 + T0); /*bug_fix -JX */ + /* Temperature dependence of D/B and S/B diode capacitance begins */ + delTemp = ckt->CKTtemp - model->BSIM4v5tnom; + T0 = model->BSIM4v5tcj * delTemp; + if (T0 >= -1.0) + { model->BSIM4v5SunitAreaTempJctCap = model->BSIM4v5SunitAreaJctCap *(1.0 + T0); /*bug_fix -JX */ model->BSIM4v5DunitAreaTempJctCap = model->BSIM4v5DunitAreaJctCap *(1.0 + T0); - } - else - { if (model->BSIM4v5SunitAreaJctCap > 0.0) - { model->BSIM4v5SunitAreaTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjs to be negative. Cjs is clamped to zero.\n"); + } + else + { if (model->BSIM4v5SunitAreaJctCap > 0.0) + { model->BSIM4v5SunitAreaTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cjs to be negative. Cjs is clamped to zero.\n"); } - if (model->BSIM4v5DunitAreaJctCap > 0.0) + if (model->BSIM4v5DunitAreaJctCap > 0.0) { model->BSIM4v5DunitAreaTempJctCap = 0.0; fprintf(stderr, "Temperature effect has caused cjd to be negative. Cjd is clamped to zero.\n"); } - } + } T0 = model->BSIM4v5tcjsw * delTemp; - if (T0 >= -1.0) - { model->BSIM4v5SunitLengthSidewallTempJctCap = model->BSIM4v5SunitLengthSidewallJctCap *(1.0 + T0); + if (T0 >= -1.0) + { model->BSIM4v5SunitLengthSidewallTempJctCap = model->BSIM4v5SunitLengthSidewallJctCap *(1.0 + T0); model->BSIM4v5DunitLengthSidewallTempJctCap = model->BSIM4v5DunitLengthSidewallJctCap *(1.0 + T0); - } - else - { if (model->BSIM4v5SunitLengthSidewallJctCap > 0.0) - { model->BSIM4v5SunitLengthSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjsws to be negative. Cjsws is clamped to zero.\n"); - } - if (model->BSIM4v5DunitLengthSidewallJctCap > 0.0) + } + else + { if (model->BSIM4v5SunitLengthSidewallJctCap > 0.0) + { model->BSIM4v5SunitLengthSidewallTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cjsws to be negative. Cjsws is clamped to zero.\n"); + } + if (model->BSIM4v5DunitLengthSidewallJctCap > 0.0) { model->BSIM4v5DunitLengthSidewallTempJctCap = 0.0; fprintf(stderr, "Temperature effect has caused cjswd to be negative. Cjswd is clamped to zero.\n"); - } - } + } + } T0 = model->BSIM4v5tcjswg * delTemp; - if (T0 >= -1.0) - { model->BSIM4v5SunitLengthGateSidewallTempJctCap = model->BSIM4v5SunitLengthGateSidewallJctCap *(1.0 + T0); + if (T0 >= -1.0) + { model->BSIM4v5SunitLengthGateSidewallTempJctCap = model->BSIM4v5SunitLengthGateSidewallJctCap *(1.0 + T0); model->BSIM4v5DunitLengthGateSidewallTempJctCap = model->BSIM4v5DunitLengthGateSidewallJctCap *(1.0 + T0); - } - else - { if (model->BSIM4v5SunitLengthGateSidewallJctCap > 0.0) - { model->BSIM4v5SunitLengthGateSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswgs to be negative. Cjswgs is clamped to zero.\n"); - } - if (model->BSIM4v5DunitLengthGateSidewallJctCap > 0.0) + } + else + { if (model->BSIM4v5SunitLengthGateSidewallJctCap > 0.0) + { model->BSIM4v5SunitLengthGateSidewallTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cjswgs to be negative. Cjswgs is clamped to zero.\n"); + } + if (model->BSIM4v5DunitLengthGateSidewallJctCap > 0.0) { model->BSIM4v5DunitLengthGateSidewallTempJctCap = 0.0; fprintf(stderr, "Temperature effect has caused cjswgd to be negative. Cjswgd is clamped to zero.\n"); } - } + } model->BSIM4v5PhiBS = model->BSIM4v5SbulkJctPotential - - model->BSIM4v5tpb * delTemp; + - model->BSIM4v5tpb * delTemp; if (model->BSIM4v5PhiBS < 0.01) - { model->BSIM4v5PhiBS = 0.01; - fprintf(stderr, "Temperature effect has caused pbs to be less than 0.01. Pbs is clamped to 0.01.\n"); - } + { model->BSIM4v5PhiBS = 0.01; + fprintf(stderr, "Temperature effect has caused pbs to be less than 0.01. Pbs is clamped to 0.01.\n"); + } model->BSIM4v5PhiBD = model->BSIM4v5DbulkJctPotential - model->BSIM4v5tpb * delTemp; if (model->BSIM4v5PhiBD < 0.01) @@ -273,9 +273,9 @@ int Size_Not_Found, i; model->BSIM4v5PhiBSWS = model->BSIM4v5SsidewallJctPotential - model->BSIM4v5tpbsw * delTemp; if (model->BSIM4v5PhiBSWS <= 0.01) - { model->BSIM4v5PhiBSWS = 0.01; - fprintf(stderr, "Temperature effect has caused pbsws to be less than 0.01. Pbsws is clamped to 0.01.\n"); - } + { model->BSIM4v5PhiBSWS = 0.01; + fprintf(stderr, "Temperature effect has caused pbsws to be less than 0.01. Pbsws is clamped to 0.01.\n"); + } model->BSIM4v5PhiBSWD = model->BSIM4v5DsidewallJctPotential - model->BSIM4v5tpbsw * delTemp; if (model->BSIM4v5PhiBSWD <= 0.01) @@ -283,12 +283,12 @@ int Size_Not_Found, i; fprintf(stderr, "Temperature effect has caused pbswd to be less than 0.01. Pbswd is clamped to 0.01.\n"); } - model->BSIM4v5PhiBSWGS = model->BSIM4v5SGatesidewallJctPotential + model->BSIM4v5PhiBSWGS = model->BSIM4v5SGatesidewallJctPotential - model->BSIM4v5tpbswg * delTemp; if (model->BSIM4v5PhiBSWGS <= 0.01) - { model->BSIM4v5PhiBSWGS = 0.01; - fprintf(stderr, "Temperature effect has caused pbswgs to be less than 0.01. Pbswgs is clamped to 0.01.\n"); - } + { model->BSIM4v5PhiBSWGS = 0.01; + fprintf(stderr, "Temperature effect has caused pbswgs to be less than 0.01. Pbswgs is clamped to 0.01.\n"); + } model->BSIM4v5PhiBSWGD = model->BSIM4v5DGatesidewallJctPotential - model->BSIM4v5tpbswg * delTemp; if (model->BSIM4v5PhiBSWGD <= 0.01) @@ -305,7 +305,7 @@ int Size_Not_Found, i; { model->BSIM4v5ijthsfwd = 0.1; fprintf(stderr, "Ijthsfwd reset to %g.\n", model->BSIM4v5ijthsfwd); } - if (model->BSIM4v5ijthdrev <= 0.0) + if (model->BSIM4v5ijthdrev <= 0.0) { model->BSIM4v5ijthdrev = 0.1; fprintf(stderr, "Ijthdrev reset to %g.\n", model->BSIM4v5ijthdrev); } @@ -345,7 +345,7 @@ int Size_Not_Found, i; /* loop through all the instances of the model */ for (here = BSIM4v5instances(model); here != NULL; - here = BSIM4v5nextInstance(here)) + here = BSIM4v5nextInstance(here)) { pSizeDependParamKnot = model->pSizeDependParamKnot; Size_Not_Found = 1; @@ -370,15 +370,15 @@ int Size_Not_Found, i; if (Size_Not_Found) { pParam = TMALLOC(struct bsim4v5SizeDependParam, 1); if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; + model->pSizeDependParamKnot = pParam; else - pLastKnot->pNext = pParam; + pLastKnot->pNext = pParam; pParam->pNext = NULL; here->pParam = pParam; pParam->Length = here->BSIM4v5l; pParam->Width = here->BSIM4v5w; - pParam->NFinger = here->BSIM4v5nf; + pParam->NFinger = here->BSIM4v5nf; Lnew = here->BSIM4v5l + model->BSIM4v5xl ; Wnew = here->BSIM4v5w / here->BSIM4v5nf + model->BSIM4v5xw; @@ -397,13 +397,13 @@ int Size_Not_Found, i; + model->BSIM4v5Wwl / (T2 * T3); pParam->BSIM4v5dw = model->BSIM4v5Wint + tmp1; tmp2 = model->BSIM4v5Wlc / T2 + model->BSIM4v5Wwc / T3 - + model->BSIM4v5Wwlc / (T2 * T3); + + model->BSIM4v5Wwlc / (T2 * T3); pParam->BSIM4v5dwc = model->BSIM4v5dwc + tmp2; pParam->BSIM4v5dwj = model->BSIM4v5dwj + tmp2; pParam->BSIM4v5leff = Lnew - 2.0 * pParam->BSIM4v5dl; if (pParam->BSIM4v5leff <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "BSIM4v5: mosfet %s, model %s: Effective channel length <= 0", model->BSIM4v5modName, here->BSIM4v5name); @@ -412,7 +412,7 @@ int Size_Not_Found, i; pParam->BSIM4v5weff = Wnew - 2.0 * pParam->BSIM4v5dw; if (pParam->BSIM4v5weff <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "BSIM4v5: mosfet %s, model %s: Effective channel width <= 0", model->BSIM4v5modName, here->BSIM4v5name); @@ -421,7 +421,7 @@ int Size_Not_Found, i; pParam->BSIM4v5leffCV = Lnew - 2.0 * pParam->BSIM4v5dlc; if (pParam->BSIM4v5leffCV <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "BSIM4v5: mosfet %s, model %s: Effective channel length for C-V <= 0", model->BSIM4v5modName, here->BSIM4v5name); @@ -430,7 +430,7 @@ int Size_Not_Found, i; pParam->BSIM4v5weffCV = Wnew - 2.0 * pParam->BSIM4v5dwc; if (pParam->BSIM4v5weffCV <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "BSIM4v5: mosfet %s, model %s: Effective channel width for C-V <= 0", model->BSIM4v5modName, here->BSIM4v5name); @@ -447,82 +447,82 @@ int Size_Not_Found, i; } - if (model->BSIM4v5binUnit == 1) - { Inv_L = 1.0e-6 / pParam->BSIM4v5leff; - Inv_W = 1.0e-6 / pParam->BSIM4v5weff; - Inv_LW = 1.0e-12 / (pParam->BSIM4v5leff - * pParam->BSIM4v5weff); - } - else - { Inv_L = 1.0 / pParam->BSIM4v5leff; - Inv_W = 1.0 / pParam->BSIM4v5weff; - Inv_LW = 1.0 / (pParam->BSIM4v5leff - * pParam->BSIM4v5weff); - } - pParam->BSIM4v5cdsc = model->BSIM4v5cdsc - + model->BSIM4v5lcdsc * Inv_L - + model->BSIM4v5wcdsc * Inv_W - + model->BSIM4v5pcdsc * Inv_LW; - pParam->BSIM4v5cdscb = model->BSIM4v5cdscb - + model->BSIM4v5lcdscb * Inv_L - + model->BSIM4v5wcdscb * Inv_W - + model->BSIM4v5pcdscb * Inv_LW; - - pParam->BSIM4v5cdscd = model->BSIM4v5cdscd - + model->BSIM4v5lcdscd * Inv_L - + model->BSIM4v5wcdscd * Inv_W - + model->BSIM4v5pcdscd * Inv_LW; - - pParam->BSIM4v5cit = model->BSIM4v5cit - + model->BSIM4v5lcit * Inv_L - + model->BSIM4v5wcit * Inv_W - + model->BSIM4v5pcit * Inv_LW; - pParam->BSIM4v5nfactor = model->BSIM4v5nfactor - + model->BSIM4v5lnfactor * Inv_L - + model->BSIM4v5wnfactor * Inv_W - + model->BSIM4v5pnfactor * Inv_LW; - pParam->BSIM4v5xj = model->BSIM4v5xj - + model->BSIM4v5lxj * Inv_L - + model->BSIM4v5wxj * Inv_W - + model->BSIM4v5pxj * Inv_LW; - pParam->BSIM4v5vsat = model->BSIM4v5vsat - + model->BSIM4v5lvsat * Inv_L - + model->BSIM4v5wvsat * Inv_W - + model->BSIM4v5pvsat * Inv_LW; - pParam->BSIM4v5at = model->BSIM4v5at - + model->BSIM4v5lat * Inv_L - + model->BSIM4v5wat * Inv_W - + model->BSIM4v5pat * Inv_LW; - pParam->BSIM4v5a0 = model->BSIM4v5a0 - + model->BSIM4v5la0 * Inv_L - + model->BSIM4v5wa0 * Inv_W - + model->BSIM4v5pa0 * Inv_LW; - - pParam->BSIM4v5ags = model->BSIM4v5ags - + model->BSIM4v5lags * Inv_L - + model->BSIM4v5wags * Inv_W - + model->BSIM4v5pags * Inv_LW; - - pParam->BSIM4v5a1 = model->BSIM4v5a1 - + model->BSIM4v5la1 * Inv_L - + model->BSIM4v5wa1 * Inv_W - + model->BSIM4v5pa1 * Inv_LW; - pParam->BSIM4v5a2 = model->BSIM4v5a2 - + model->BSIM4v5la2 * Inv_L - + model->BSIM4v5wa2 * Inv_W - + model->BSIM4v5pa2 * Inv_LW; - pParam->BSIM4v5keta = model->BSIM4v5keta - + model->BSIM4v5lketa * Inv_L - + model->BSIM4v5wketa * Inv_W - + model->BSIM4v5pketa * Inv_LW; - pParam->BSIM4v5nsub = model->BSIM4v5nsub - + model->BSIM4v5lnsub * Inv_L - + model->BSIM4v5wnsub * Inv_W - + model->BSIM4v5pnsub * Inv_LW; - pParam->BSIM4v5ndep = model->BSIM4v5ndep - + model->BSIM4v5lndep * Inv_L - + model->BSIM4v5wndep * Inv_W - + model->BSIM4v5pndep * Inv_LW; + if (model->BSIM4v5binUnit == 1) + { Inv_L = 1.0e-6 / pParam->BSIM4v5leff; + Inv_W = 1.0e-6 / pParam->BSIM4v5weff; + Inv_LW = 1.0e-12 / (pParam->BSIM4v5leff + * pParam->BSIM4v5weff); + } + else + { Inv_L = 1.0 / pParam->BSIM4v5leff; + Inv_W = 1.0 / pParam->BSIM4v5weff; + Inv_LW = 1.0 / (pParam->BSIM4v5leff + * pParam->BSIM4v5weff); + } + pParam->BSIM4v5cdsc = model->BSIM4v5cdsc + + model->BSIM4v5lcdsc * Inv_L + + model->BSIM4v5wcdsc * Inv_W + + model->BSIM4v5pcdsc * Inv_LW; + pParam->BSIM4v5cdscb = model->BSIM4v5cdscb + + model->BSIM4v5lcdscb * Inv_L + + model->BSIM4v5wcdscb * Inv_W + + model->BSIM4v5pcdscb * Inv_LW; + + pParam->BSIM4v5cdscd = model->BSIM4v5cdscd + + model->BSIM4v5lcdscd * Inv_L + + model->BSIM4v5wcdscd * Inv_W + + model->BSIM4v5pcdscd * Inv_LW; + + pParam->BSIM4v5cit = model->BSIM4v5cit + + model->BSIM4v5lcit * Inv_L + + model->BSIM4v5wcit * Inv_W + + model->BSIM4v5pcit * Inv_LW; + pParam->BSIM4v5nfactor = model->BSIM4v5nfactor + + model->BSIM4v5lnfactor * Inv_L + + model->BSIM4v5wnfactor * Inv_W + + model->BSIM4v5pnfactor * Inv_LW; + pParam->BSIM4v5xj = model->BSIM4v5xj + + model->BSIM4v5lxj * Inv_L + + model->BSIM4v5wxj * Inv_W + + model->BSIM4v5pxj * Inv_LW; + pParam->BSIM4v5vsat = model->BSIM4v5vsat + + model->BSIM4v5lvsat * Inv_L + + model->BSIM4v5wvsat * Inv_W + + model->BSIM4v5pvsat * Inv_LW; + pParam->BSIM4v5at = model->BSIM4v5at + + model->BSIM4v5lat * Inv_L + + model->BSIM4v5wat * Inv_W + + model->BSIM4v5pat * Inv_LW; + pParam->BSIM4v5a0 = model->BSIM4v5a0 + + model->BSIM4v5la0 * Inv_L + + model->BSIM4v5wa0 * Inv_W + + model->BSIM4v5pa0 * Inv_LW; + + pParam->BSIM4v5ags = model->BSIM4v5ags + + model->BSIM4v5lags * Inv_L + + model->BSIM4v5wags * Inv_W + + model->BSIM4v5pags * Inv_LW; + + pParam->BSIM4v5a1 = model->BSIM4v5a1 + + model->BSIM4v5la1 * Inv_L + + model->BSIM4v5wa1 * Inv_W + + model->BSIM4v5pa1 * Inv_LW; + pParam->BSIM4v5a2 = model->BSIM4v5a2 + + model->BSIM4v5la2 * Inv_L + + model->BSIM4v5wa2 * Inv_W + + model->BSIM4v5pa2 * Inv_LW; + pParam->BSIM4v5keta = model->BSIM4v5keta + + model->BSIM4v5lketa * Inv_L + + model->BSIM4v5wketa * Inv_W + + model->BSIM4v5pketa * Inv_LW; + pParam->BSIM4v5nsub = model->BSIM4v5nsub + + model->BSIM4v5lnsub * Inv_L + + model->BSIM4v5wnsub * Inv_W + + model->BSIM4v5pnsub * Inv_LW; + pParam->BSIM4v5ndep = model->BSIM4v5ndep + + model->BSIM4v5lndep * Inv_L + + model->BSIM4v5wndep * Inv_W + + model->BSIM4v5pndep * Inv_LW; pParam->BSIM4v5nsd = model->BSIM4v5nsd + model->BSIM4v5lnsd * Inv_L + model->BSIM4v5wnsd * Inv_W @@ -531,70 +531,70 @@ int Size_Not_Found, i; + model->BSIM4v5lphin * Inv_L + model->BSIM4v5wphin * Inv_W + model->BSIM4v5pphin * Inv_LW; - pParam->BSIM4v5ngate = model->BSIM4v5ngate - + model->BSIM4v5lngate * Inv_L - + model->BSIM4v5wngate * Inv_W - + model->BSIM4v5pngate * Inv_LW; - pParam->BSIM4v5gamma1 = model->BSIM4v5gamma1 - + model->BSIM4v5lgamma1 * Inv_L - + model->BSIM4v5wgamma1 * Inv_W - + model->BSIM4v5pgamma1 * Inv_LW; - pParam->BSIM4v5gamma2 = model->BSIM4v5gamma2 - + model->BSIM4v5lgamma2 * Inv_L - + model->BSIM4v5wgamma2 * Inv_W - + model->BSIM4v5pgamma2 * Inv_LW; - pParam->BSIM4v5vbx = model->BSIM4v5vbx - + model->BSIM4v5lvbx * Inv_L - + model->BSIM4v5wvbx * Inv_W - + model->BSIM4v5pvbx * Inv_LW; - pParam->BSIM4v5vbm = model->BSIM4v5vbm - + model->BSIM4v5lvbm * Inv_L - + model->BSIM4v5wvbm * Inv_W - + model->BSIM4v5pvbm * Inv_LW; - pParam->BSIM4v5xt = model->BSIM4v5xt - + model->BSIM4v5lxt * Inv_L - + model->BSIM4v5wxt * Inv_W - + model->BSIM4v5pxt * Inv_LW; + pParam->BSIM4v5ngate = model->BSIM4v5ngate + + model->BSIM4v5lngate * Inv_L + + model->BSIM4v5wngate * Inv_W + + model->BSIM4v5pngate * Inv_LW; + pParam->BSIM4v5gamma1 = model->BSIM4v5gamma1 + + model->BSIM4v5lgamma1 * Inv_L + + model->BSIM4v5wgamma1 * Inv_W + + model->BSIM4v5pgamma1 * Inv_LW; + pParam->BSIM4v5gamma2 = model->BSIM4v5gamma2 + + model->BSIM4v5lgamma2 * Inv_L + + model->BSIM4v5wgamma2 * Inv_W + + model->BSIM4v5pgamma2 * Inv_LW; + pParam->BSIM4v5vbx = model->BSIM4v5vbx + + model->BSIM4v5lvbx * Inv_L + + model->BSIM4v5wvbx * Inv_W + + model->BSIM4v5pvbx * Inv_LW; + pParam->BSIM4v5vbm = model->BSIM4v5vbm + + model->BSIM4v5lvbm * Inv_L + + model->BSIM4v5wvbm * Inv_W + + model->BSIM4v5pvbm * Inv_LW; + pParam->BSIM4v5xt = model->BSIM4v5xt + + model->BSIM4v5lxt * Inv_L + + model->BSIM4v5wxt * Inv_W + + model->BSIM4v5pxt * Inv_LW; pParam->BSIM4v5vfb = model->BSIM4v5vfb + model->BSIM4v5lvfb * Inv_L + model->BSIM4v5wvfb * Inv_W + model->BSIM4v5pvfb * Inv_LW; - pParam->BSIM4v5k1 = model->BSIM4v5k1 - + model->BSIM4v5lk1 * Inv_L - + model->BSIM4v5wk1 * Inv_W - + model->BSIM4v5pk1 * Inv_LW; - pParam->BSIM4v5kt1 = model->BSIM4v5kt1 - + model->BSIM4v5lkt1 * Inv_L - + model->BSIM4v5wkt1 * Inv_W - + model->BSIM4v5pkt1 * Inv_LW; - pParam->BSIM4v5kt1l = model->BSIM4v5kt1l - + model->BSIM4v5lkt1l * Inv_L - + model->BSIM4v5wkt1l * Inv_W - + model->BSIM4v5pkt1l * Inv_LW; - pParam->BSIM4v5k2 = model->BSIM4v5k2 - + model->BSIM4v5lk2 * Inv_L - + model->BSIM4v5wk2 * Inv_W - + model->BSIM4v5pk2 * Inv_LW; - pParam->BSIM4v5kt2 = model->BSIM4v5kt2 - + model->BSIM4v5lkt2 * Inv_L - + model->BSIM4v5wkt2 * Inv_W - + model->BSIM4v5pkt2 * Inv_LW; - pParam->BSIM4v5k3 = model->BSIM4v5k3 - + model->BSIM4v5lk3 * Inv_L - + model->BSIM4v5wk3 * Inv_W - + model->BSIM4v5pk3 * Inv_LW; - pParam->BSIM4v5k3b = model->BSIM4v5k3b - + model->BSIM4v5lk3b * Inv_L - + model->BSIM4v5wk3b * Inv_W - + model->BSIM4v5pk3b * Inv_LW; - pParam->BSIM4v5w0 = model->BSIM4v5w0 - + model->BSIM4v5lw0 * Inv_L - + model->BSIM4v5ww0 * Inv_W - + model->BSIM4v5pw0 * Inv_LW; - pParam->BSIM4v5lpe0 = model->BSIM4v5lpe0 - + model->BSIM4v5llpe0 * Inv_L - + model->BSIM4v5wlpe0 * Inv_W - + model->BSIM4v5plpe0 * Inv_LW; + pParam->BSIM4v5k1 = model->BSIM4v5k1 + + model->BSIM4v5lk1 * Inv_L + + model->BSIM4v5wk1 * Inv_W + + model->BSIM4v5pk1 * Inv_LW; + pParam->BSIM4v5kt1 = model->BSIM4v5kt1 + + model->BSIM4v5lkt1 * Inv_L + + model->BSIM4v5wkt1 * Inv_W + + model->BSIM4v5pkt1 * Inv_LW; + pParam->BSIM4v5kt1l = model->BSIM4v5kt1l + + model->BSIM4v5lkt1l * Inv_L + + model->BSIM4v5wkt1l * Inv_W + + model->BSIM4v5pkt1l * Inv_LW; + pParam->BSIM4v5k2 = model->BSIM4v5k2 + + model->BSIM4v5lk2 * Inv_L + + model->BSIM4v5wk2 * Inv_W + + model->BSIM4v5pk2 * Inv_LW; + pParam->BSIM4v5kt2 = model->BSIM4v5kt2 + + model->BSIM4v5lkt2 * Inv_L + + model->BSIM4v5wkt2 * Inv_W + + model->BSIM4v5pkt2 * Inv_LW; + pParam->BSIM4v5k3 = model->BSIM4v5k3 + + model->BSIM4v5lk3 * Inv_L + + model->BSIM4v5wk3 * Inv_W + + model->BSIM4v5pk3 * Inv_LW; + pParam->BSIM4v5k3b = model->BSIM4v5k3b + + model->BSIM4v5lk3b * Inv_L + + model->BSIM4v5wk3b * Inv_W + + model->BSIM4v5pk3b * Inv_LW; + pParam->BSIM4v5w0 = model->BSIM4v5w0 + + model->BSIM4v5lw0 * Inv_L + + model->BSIM4v5ww0 * Inv_W + + model->BSIM4v5pw0 * Inv_LW; + pParam->BSIM4v5lpe0 = model->BSIM4v5lpe0 + + model->BSIM4v5llpe0 * Inv_L + + model->BSIM4v5wlpe0 * Inv_W + + model->BSIM4v5plpe0 * Inv_LW; pParam->BSIM4v5lpeb = model->BSIM4v5lpeb + model->BSIM4v5llpeb * Inv_L + model->BSIM4v5wlpeb * Inv_W @@ -607,102 +607,102 @@ int Size_Not_Found, i; + model->BSIM4v5ldvtp1 * Inv_L + model->BSIM4v5wdvtp1 * Inv_W + model->BSIM4v5pdvtp1 * Inv_LW; - pParam->BSIM4v5dvt0 = model->BSIM4v5dvt0 - + model->BSIM4v5ldvt0 * Inv_L - + model->BSIM4v5wdvt0 * Inv_W - + model->BSIM4v5pdvt0 * Inv_LW; - pParam->BSIM4v5dvt1 = model->BSIM4v5dvt1 - + model->BSIM4v5ldvt1 * Inv_L - + model->BSIM4v5wdvt1 * Inv_W - + model->BSIM4v5pdvt1 * Inv_LW; - pParam->BSIM4v5dvt2 = model->BSIM4v5dvt2 - + model->BSIM4v5ldvt2 * Inv_L - + model->BSIM4v5wdvt2 * Inv_W - + model->BSIM4v5pdvt2 * Inv_LW; - pParam->BSIM4v5dvt0w = model->BSIM4v5dvt0w - + model->BSIM4v5ldvt0w * Inv_L - + model->BSIM4v5wdvt0w * Inv_W - + model->BSIM4v5pdvt0w * Inv_LW; - pParam->BSIM4v5dvt1w = model->BSIM4v5dvt1w - + model->BSIM4v5ldvt1w * Inv_L - + model->BSIM4v5wdvt1w * Inv_W - + model->BSIM4v5pdvt1w * Inv_LW; - pParam->BSIM4v5dvt2w = model->BSIM4v5dvt2w - + model->BSIM4v5ldvt2w * Inv_L - + model->BSIM4v5wdvt2w * Inv_W - + model->BSIM4v5pdvt2w * Inv_LW; - pParam->BSIM4v5drout = model->BSIM4v5drout - + model->BSIM4v5ldrout * Inv_L - + model->BSIM4v5wdrout * Inv_W - + model->BSIM4v5pdrout * Inv_LW; - pParam->BSIM4v5dsub = model->BSIM4v5dsub - + model->BSIM4v5ldsub * Inv_L - + model->BSIM4v5wdsub * Inv_W - + model->BSIM4v5pdsub * Inv_LW; - pParam->BSIM4v5vth0 = model->BSIM4v5vth0 - + model->BSIM4v5lvth0 * Inv_L - + model->BSIM4v5wvth0 * Inv_W - + model->BSIM4v5pvth0 * Inv_LW; - pParam->BSIM4v5ua = model->BSIM4v5ua - + model->BSIM4v5lua * Inv_L - + model->BSIM4v5wua * Inv_W - + model->BSIM4v5pua * Inv_LW; - pParam->BSIM4v5ua1 = model->BSIM4v5ua1 - + model->BSIM4v5lua1 * Inv_L - + model->BSIM4v5wua1 * Inv_W - + model->BSIM4v5pua1 * Inv_LW; - pParam->BSIM4v5ub = model->BSIM4v5ub - + model->BSIM4v5lub * Inv_L - + model->BSIM4v5wub * Inv_W - + model->BSIM4v5pub * Inv_LW; - pParam->BSIM4v5ub1 = model->BSIM4v5ub1 - + model->BSIM4v5lub1 * Inv_L - + model->BSIM4v5wub1 * Inv_W - + model->BSIM4v5pub1 * Inv_LW; - pParam->BSIM4v5uc = model->BSIM4v5uc - + model->BSIM4v5luc * Inv_L - + model->BSIM4v5wuc * Inv_W - + model->BSIM4v5puc * Inv_LW; - pParam->BSIM4v5uc1 = model->BSIM4v5uc1 - + model->BSIM4v5luc1 * Inv_L - + model->BSIM4v5wuc1 * Inv_W - + model->BSIM4v5puc1 * Inv_LW; - pParam->BSIM4v5ud = model->BSIM4v5ud - + model->BSIM4v5lud * Inv_L - + model->BSIM4v5wud * Inv_W - + model->BSIM4v5pud * Inv_LW; - pParam->BSIM4v5ud1 = model->BSIM4v5ud1 - + model->BSIM4v5lud1 * Inv_L - + model->BSIM4v5wud1 * Inv_W - + model->BSIM4v5pud1 * Inv_LW; - pParam->BSIM4v5up = model->BSIM4v5up - + model->BSIM4v5lup * Inv_L - + model->BSIM4v5wup * Inv_W - + model->BSIM4v5pup * Inv_LW; - pParam->BSIM4v5lp = model->BSIM4v5lp - + model->BSIM4v5llp * Inv_L - + model->BSIM4v5wlp * Inv_W - + model->BSIM4v5plp * Inv_LW; + pParam->BSIM4v5dvt0 = model->BSIM4v5dvt0 + + model->BSIM4v5ldvt0 * Inv_L + + model->BSIM4v5wdvt0 * Inv_W + + model->BSIM4v5pdvt0 * Inv_LW; + pParam->BSIM4v5dvt1 = model->BSIM4v5dvt1 + + model->BSIM4v5ldvt1 * Inv_L + + model->BSIM4v5wdvt1 * Inv_W + + model->BSIM4v5pdvt1 * Inv_LW; + pParam->BSIM4v5dvt2 = model->BSIM4v5dvt2 + + model->BSIM4v5ldvt2 * Inv_L + + model->BSIM4v5wdvt2 * Inv_W + + model->BSIM4v5pdvt2 * Inv_LW; + pParam->BSIM4v5dvt0w = model->BSIM4v5dvt0w + + model->BSIM4v5ldvt0w * Inv_L + + model->BSIM4v5wdvt0w * Inv_W + + model->BSIM4v5pdvt0w * Inv_LW; + pParam->BSIM4v5dvt1w = model->BSIM4v5dvt1w + + model->BSIM4v5ldvt1w * Inv_L + + model->BSIM4v5wdvt1w * Inv_W + + model->BSIM4v5pdvt1w * Inv_LW; + pParam->BSIM4v5dvt2w = model->BSIM4v5dvt2w + + model->BSIM4v5ldvt2w * Inv_L + + model->BSIM4v5wdvt2w * Inv_W + + model->BSIM4v5pdvt2w * Inv_LW; + pParam->BSIM4v5drout = model->BSIM4v5drout + + model->BSIM4v5ldrout * Inv_L + + model->BSIM4v5wdrout * Inv_W + + model->BSIM4v5pdrout * Inv_LW; + pParam->BSIM4v5dsub = model->BSIM4v5dsub + + model->BSIM4v5ldsub * Inv_L + + model->BSIM4v5wdsub * Inv_W + + model->BSIM4v5pdsub * Inv_LW; + pParam->BSIM4v5vth0 = model->BSIM4v5vth0 + + model->BSIM4v5lvth0 * Inv_L + + model->BSIM4v5wvth0 * Inv_W + + model->BSIM4v5pvth0 * Inv_LW; + pParam->BSIM4v5ua = model->BSIM4v5ua + + model->BSIM4v5lua * Inv_L + + model->BSIM4v5wua * Inv_W + + model->BSIM4v5pua * Inv_LW; + pParam->BSIM4v5ua1 = model->BSIM4v5ua1 + + model->BSIM4v5lua1 * Inv_L + + model->BSIM4v5wua1 * Inv_W + + model->BSIM4v5pua1 * Inv_LW; + pParam->BSIM4v5ub = model->BSIM4v5ub + + model->BSIM4v5lub * Inv_L + + model->BSIM4v5wub * Inv_W + + model->BSIM4v5pub * Inv_LW; + pParam->BSIM4v5ub1 = model->BSIM4v5ub1 + + model->BSIM4v5lub1 * Inv_L + + model->BSIM4v5wub1 * Inv_W + + model->BSIM4v5pub1 * Inv_LW; + pParam->BSIM4v5uc = model->BSIM4v5uc + + model->BSIM4v5luc * Inv_L + + model->BSIM4v5wuc * Inv_W + + model->BSIM4v5puc * Inv_LW; + pParam->BSIM4v5uc1 = model->BSIM4v5uc1 + + model->BSIM4v5luc1 * Inv_L + + model->BSIM4v5wuc1 * Inv_W + + model->BSIM4v5puc1 * Inv_LW; + pParam->BSIM4v5ud = model->BSIM4v5ud + + model->BSIM4v5lud * Inv_L + + model->BSIM4v5wud * Inv_W + + model->BSIM4v5pud * Inv_LW; + pParam->BSIM4v5ud1 = model->BSIM4v5ud1 + + model->BSIM4v5lud1 * Inv_L + + model->BSIM4v5wud1 * Inv_W + + model->BSIM4v5pud1 * Inv_LW; + pParam->BSIM4v5up = model->BSIM4v5up + + model->BSIM4v5lup * Inv_L + + model->BSIM4v5wup * Inv_W + + model->BSIM4v5pup * Inv_LW; + pParam->BSIM4v5lp = model->BSIM4v5lp + + model->BSIM4v5llp * Inv_L + + model->BSIM4v5wlp * Inv_W + + model->BSIM4v5plp * Inv_LW; pParam->BSIM4v5eu = model->BSIM4v5eu + model->BSIM4v5leu * Inv_L + model->BSIM4v5weu * Inv_W + model->BSIM4v5peu * Inv_LW; - pParam->BSIM4v5u0 = model->BSIM4v5u0 - + model->BSIM4v5lu0 * Inv_L - + model->BSIM4v5wu0 * Inv_W - + model->BSIM4v5pu0 * Inv_LW; - pParam->BSIM4v5ute = model->BSIM4v5ute - + model->BSIM4v5lute * Inv_L - + model->BSIM4v5wute * Inv_W - + model->BSIM4v5pute * Inv_LW; - pParam->BSIM4v5voff = model->BSIM4v5voff - + model->BSIM4v5lvoff * Inv_L - + model->BSIM4v5wvoff * Inv_W - + model->BSIM4v5pvoff * Inv_LW; - pParam->BSIM4v5tvoff = model->BSIM4v5tvoff - + model->BSIM4v5ltvoff * Inv_L - + model->BSIM4v5wtvoff * Inv_W - + model->BSIM4v5ptvoff * Inv_LW; + pParam->BSIM4v5u0 = model->BSIM4v5u0 + + model->BSIM4v5lu0 * Inv_L + + model->BSIM4v5wu0 * Inv_W + + model->BSIM4v5pu0 * Inv_LW; + pParam->BSIM4v5ute = model->BSIM4v5ute + + model->BSIM4v5lute * Inv_L + + model->BSIM4v5wute * Inv_W + + model->BSIM4v5pute * Inv_LW; + pParam->BSIM4v5voff = model->BSIM4v5voff + + model->BSIM4v5lvoff * Inv_L + + model->BSIM4v5wvoff * Inv_W + + model->BSIM4v5pvoff * Inv_LW; + pParam->BSIM4v5tvoff = model->BSIM4v5tvoff + + model->BSIM4v5ltvoff * Inv_L + + model->BSIM4v5wtvoff * Inv_W + + model->BSIM4v5ptvoff * Inv_LW; pParam->BSIM4v5minv = model->BSIM4v5minv + model->BSIM4v5lminv * Inv_L + model->BSIM4v5wminv * Inv_W @@ -719,14 +719,14 @@ int Size_Not_Found, i; + model->BSIM4v5lpditsd * Inv_L + model->BSIM4v5wpditsd * Inv_W + model->BSIM4v5ppditsd * Inv_LW; - pParam->BSIM4v5delta = model->BSIM4v5delta - + model->BSIM4v5ldelta * Inv_L - + model->BSIM4v5wdelta * Inv_W - + model->BSIM4v5pdelta * Inv_LW; - pParam->BSIM4v5rdsw = model->BSIM4v5rdsw - + model->BSIM4v5lrdsw * Inv_L - + model->BSIM4v5wrdsw * Inv_W - + model->BSIM4v5prdsw * Inv_LW; + pParam->BSIM4v5delta = model->BSIM4v5delta + + model->BSIM4v5ldelta * Inv_L + + model->BSIM4v5wdelta * Inv_W + + model->BSIM4v5pdelta * Inv_LW; + pParam->BSIM4v5rdsw = model->BSIM4v5rdsw + + model->BSIM4v5lrdsw * Inv_L + + model->BSIM4v5wrdsw * Inv_W + + model->BSIM4v5prdsw * Inv_LW; pParam->BSIM4v5rdw = model->BSIM4v5rdw + model->BSIM4v5lrdw * Inv_L + model->BSIM4v5wrdw * Inv_W @@ -735,86 +735,86 @@ int Size_Not_Found, i; + model->BSIM4v5lrsw * Inv_L + model->BSIM4v5wrsw * Inv_W + model->BSIM4v5prsw * Inv_LW; - pParam->BSIM4v5prwg = model->BSIM4v5prwg - + model->BSIM4v5lprwg * Inv_L - + model->BSIM4v5wprwg * Inv_W - + model->BSIM4v5pprwg * Inv_LW; - pParam->BSIM4v5prwb = model->BSIM4v5prwb - + model->BSIM4v5lprwb * Inv_L - + model->BSIM4v5wprwb * Inv_W - + model->BSIM4v5pprwb * Inv_LW; - pParam->BSIM4v5prt = model->BSIM4v5prt - + model->BSIM4v5lprt * Inv_L - + model->BSIM4v5wprt * Inv_W - + model->BSIM4v5pprt * Inv_LW; - pParam->BSIM4v5eta0 = model->BSIM4v5eta0 - + model->BSIM4v5leta0 * Inv_L - + model->BSIM4v5weta0 * Inv_W - + model->BSIM4v5peta0 * Inv_LW; - pParam->BSIM4v5etab = model->BSIM4v5etab - + model->BSIM4v5letab * Inv_L - + model->BSIM4v5wetab * Inv_W - + model->BSIM4v5petab * Inv_LW; - pParam->BSIM4v5pclm = model->BSIM4v5pclm - + model->BSIM4v5lpclm * Inv_L - + model->BSIM4v5wpclm * Inv_W - + model->BSIM4v5ppclm * Inv_LW; - pParam->BSIM4v5pdibl1 = model->BSIM4v5pdibl1 - + model->BSIM4v5lpdibl1 * Inv_L - + model->BSIM4v5wpdibl1 * Inv_W - + model->BSIM4v5ppdibl1 * Inv_LW; - pParam->BSIM4v5pdibl2 = model->BSIM4v5pdibl2 - + model->BSIM4v5lpdibl2 * Inv_L - + model->BSIM4v5wpdibl2 * Inv_W - + model->BSIM4v5ppdibl2 * Inv_LW; - pParam->BSIM4v5pdiblb = model->BSIM4v5pdiblb - + model->BSIM4v5lpdiblb * Inv_L - + model->BSIM4v5wpdiblb * Inv_W - + model->BSIM4v5ppdiblb * Inv_LW; - pParam->BSIM4v5pscbe1 = model->BSIM4v5pscbe1 - + model->BSIM4v5lpscbe1 * Inv_L - + model->BSIM4v5wpscbe1 * Inv_W - + model->BSIM4v5ppscbe1 * Inv_LW; - pParam->BSIM4v5pscbe2 = model->BSIM4v5pscbe2 - + model->BSIM4v5lpscbe2 * Inv_L - + model->BSIM4v5wpscbe2 * Inv_W - + model->BSIM4v5ppscbe2 * Inv_LW; - pParam->BSIM4v5pvag = model->BSIM4v5pvag - + model->BSIM4v5lpvag * Inv_L - + model->BSIM4v5wpvag * Inv_W - + model->BSIM4v5ppvag * Inv_LW; - pParam->BSIM4v5wr = model->BSIM4v5wr - + model->BSIM4v5lwr * Inv_L - + model->BSIM4v5wwr * Inv_W - + model->BSIM4v5pwr * Inv_LW; - pParam->BSIM4v5dwg = model->BSIM4v5dwg - + model->BSIM4v5ldwg * Inv_L - + model->BSIM4v5wdwg * Inv_W - + model->BSIM4v5pdwg * Inv_LW; - pParam->BSIM4v5dwb = model->BSIM4v5dwb - + model->BSIM4v5ldwb * Inv_L - + model->BSIM4v5wdwb * Inv_W - + model->BSIM4v5pdwb * Inv_LW; - pParam->BSIM4v5b0 = model->BSIM4v5b0 - + model->BSIM4v5lb0 * Inv_L - + model->BSIM4v5wb0 * Inv_W - + model->BSIM4v5pb0 * Inv_LW; - pParam->BSIM4v5b1 = model->BSIM4v5b1 - + model->BSIM4v5lb1 * Inv_L - + model->BSIM4v5wb1 * Inv_W - + model->BSIM4v5pb1 * Inv_LW; - pParam->BSIM4v5alpha0 = model->BSIM4v5alpha0 - + model->BSIM4v5lalpha0 * Inv_L - + model->BSIM4v5walpha0 * Inv_W - + model->BSIM4v5palpha0 * Inv_LW; + pParam->BSIM4v5prwg = model->BSIM4v5prwg + + model->BSIM4v5lprwg * Inv_L + + model->BSIM4v5wprwg * Inv_W + + model->BSIM4v5pprwg * Inv_LW; + pParam->BSIM4v5prwb = model->BSIM4v5prwb + + model->BSIM4v5lprwb * Inv_L + + model->BSIM4v5wprwb * Inv_W + + model->BSIM4v5pprwb * Inv_LW; + pParam->BSIM4v5prt = model->BSIM4v5prt + + model->BSIM4v5lprt * Inv_L + + model->BSIM4v5wprt * Inv_W + + model->BSIM4v5pprt * Inv_LW; + pParam->BSIM4v5eta0 = model->BSIM4v5eta0 + + model->BSIM4v5leta0 * Inv_L + + model->BSIM4v5weta0 * Inv_W + + model->BSIM4v5peta0 * Inv_LW; + pParam->BSIM4v5etab = model->BSIM4v5etab + + model->BSIM4v5letab * Inv_L + + model->BSIM4v5wetab * Inv_W + + model->BSIM4v5petab * Inv_LW; + pParam->BSIM4v5pclm = model->BSIM4v5pclm + + model->BSIM4v5lpclm * Inv_L + + model->BSIM4v5wpclm * Inv_W + + model->BSIM4v5ppclm * Inv_LW; + pParam->BSIM4v5pdibl1 = model->BSIM4v5pdibl1 + + model->BSIM4v5lpdibl1 * Inv_L + + model->BSIM4v5wpdibl1 * Inv_W + + model->BSIM4v5ppdibl1 * Inv_LW; + pParam->BSIM4v5pdibl2 = model->BSIM4v5pdibl2 + + model->BSIM4v5lpdibl2 * Inv_L + + model->BSIM4v5wpdibl2 * Inv_W + + model->BSIM4v5ppdibl2 * Inv_LW; + pParam->BSIM4v5pdiblb = model->BSIM4v5pdiblb + + model->BSIM4v5lpdiblb * Inv_L + + model->BSIM4v5wpdiblb * Inv_W + + model->BSIM4v5ppdiblb * Inv_LW; + pParam->BSIM4v5pscbe1 = model->BSIM4v5pscbe1 + + model->BSIM4v5lpscbe1 * Inv_L + + model->BSIM4v5wpscbe1 * Inv_W + + model->BSIM4v5ppscbe1 * Inv_LW; + pParam->BSIM4v5pscbe2 = model->BSIM4v5pscbe2 + + model->BSIM4v5lpscbe2 * Inv_L + + model->BSIM4v5wpscbe2 * Inv_W + + model->BSIM4v5ppscbe2 * Inv_LW; + pParam->BSIM4v5pvag = model->BSIM4v5pvag + + model->BSIM4v5lpvag * Inv_L + + model->BSIM4v5wpvag * Inv_W + + model->BSIM4v5ppvag * Inv_LW; + pParam->BSIM4v5wr = model->BSIM4v5wr + + model->BSIM4v5lwr * Inv_L + + model->BSIM4v5wwr * Inv_W + + model->BSIM4v5pwr * Inv_LW; + pParam->BSIM4v5dwg = model->BSIM4v5dwg + + model->BSIM4v5ldwg * Inv_L + + model->BSIM4v5wdwg * Inv_W + + model->BSIM4v5pdwg * Inv_LW; + pParam->BSIM4v5dwb = model->BSIM4v5dwb + + model->BSIM4v5ldwb * Inv_L + + model->BSIM4v5wdwb * Inv_W + + model->BSIM4v5pdwb * Inv_LW; + pParam->BSIM4v5b0 = model->BSIM4v5b0 + + model->BSIM4v5lb0 * Inv_L + + model->BSIM4v5wb0 * Inv_W + + model->BSIM4v5pb0 * Inv_LW; + pParam->BSIM4v5b1 = model->BSIM4v5b1 + + model->BSIM4v5lb1 * Inv_L + + model->BSIM4v5wb1 * Inv_W + + model->BSIM4v5pb1 * Inv_LW; + pParam->BSIM4v5alpha0 = model->BSIM4v5alpha0 + + model->BSIM4v5lalpha0 * Inv_L + + model->BSIM4v5walpha0 * Inv_W + + model->BSIM4v5palpha0 * Inv_LW; pParam->BSIM4v5alpha1 = model->BSIM4v5alpha1 + model->BSIM4v5lalpha1 * Inv_L + model->BSIM4v5walpha1 * Inv_W + model->BSIM4v5palpha1 * Inv_LW; - pParam->BSIM4v5beta0 = model->BSIM4v5beta0 - + model->BSIM4v5lbeta0 * Inv_L - + model->BSIM4v5wbeta0 * Inv_W - + model->BSIM4v5pbeta0 * Inv_LW; + pParam->BSIM4v5beta0 = model->BSIM4v5beta0 + + model->BSIM4v5lbeta0 * Inv_L + + model->BSIM4v5wbeta0 * Inv_W + + model->BSIM4v5pbeta0 * Inv_LW; pParam->BSIM4v5agidl = model->BSIM4v5agidl + model->BSIM4v5lagidl * Inv_L + model->BSIM4v5wagidl * Inv_W @@ -936,38 +936,38 @@ int Size_Not_Found, i; + model->BSIM4v5wtvfbsdoff * Inv_W + model->BSIM4v5ptvfbsdoff * Inv_LW; - pParam->BSIM4v5cgsl = model->BSIM4v5cgsl - + model->BSIM4v5lcgsl * Inv_L - + model->BSIM4v5wcgsl * Inv_W - + model->BSIM4v5pcgsl * Inv_LW; - pParam->BSIM4v5cgdl = model->BSIM4v5cgdl - + model->BSIM4v5lcgdl * Inv_L - + model->BSIM4v5wcgdl * Inv_W - + model->BSIM4v5pcgdl * Inv_LW; - pParam->BSIM4v5ckappas = model->BSIM4v5ckappas - + model->BSIM4v5lckappas * Inv_L - + model->BSIM4v5wckappas * Inv_W - + model->BSIM4v5pckappas * Inv_LW; + pParam->BSIM4v5cgsl = model->BSIM4v5cgsl + + model->BSIM4v5lcgsl * Inv_L + + model->BSIM4v5wcgsl * Inv_W + + model->BSIM4v5pcgsl * Inv_LW; + pParam->BSIM4v5cgdl = model->BSIM4v5cgdl + + model->BSIM4v5lcgdl * Inv_L + + model->BSIM4v5wcgdl * Inv_W + + model->BSIM4v5pcgdl * Inv_LW; + pParam->BSIM4v5ckappas = model->BSIM4v5ckappas + + model->BSIM4v5lckappas * Inv_L + + model->BSIM4v5wckappas * Inv_W + + model->BSIM4v5pckappas * Inv_LW; pParam->BSIM4v5ckappad = model->BSIM4v5ckappad + model->BSIM4v5lckappad * Inv_L + model->BSIM4v5wckappad * Inv_W + model->BSIM4v5pckappad * Inv_LW; - pParam->BSIM4v5cf = model->BSIM4v5cf - + model->BSIM4v5lcf * Inv_L - + model->BSIM4v5wcf * Inv_W - + model->BSIM4v5pcf * Inv_LW; - pParam->BSIM4v5clc = model->BSIM4v5clc - + model->BSIM4v5lclc * Inv_L - + model->BSIM4v5wclc * Inv_W - + model->BSIM4v5pclc * Inv_LW; - pParam->BSIM4v5cle = model->BSIM4v5cle - + model->BSIM4v5lcle * Inv_L - + model->BSIM4v5wcle * Inv_W - + model->BSIM4v5pcle * Inv_LW; - pParam->BSIM4v5vfbcv = model->BSIM4v5vfbcv - + model->BSIM4v5lvfbcv * Inv_L - + model->BSIM4v5wvfbcv * Inv_W - + model->BSIM4v5pvfbcv * Inv_LW; + pParam->BSIM4v5cf = model->BSIM4v5cf + + model->BSIM4v5lcf * Inv_L + + model->BSIM4v5wcf * Inv_W + + model->BSIM4v5pcf * Inv_LW; + pParam->BSIM4v5clc = model->BSIM4v5clc + + model->BSIM4v5lclc * Inv_L + + model->BSIM4v5wclc * Inv_W + + model->BSIM4v5pclc * Inv_LW; + pParam->BSIM4v5cle = model->BSIM4v5cle + + model->BSIM4v5lcle * Inv_L + + model->BSIM4v5wcle * Inv_W + + model->BSIM4v5pcle * Inv_LW; + pParam->BSIM4v5vfbcv = model->BSIM4v5vfbcv + + model->BSIM4v5lvfbcv * Inv_L + + model->BSIM4v5wvfbcv * Inv_W + + model->BSIM4v5pvfbcv * Inv_LW; pParam->BSIM4v5acde = model->BSIM4v5acde + model->BSIM4v5lacde * Inv_L + model->BSIM4v5wacde * Inv_W @@ -998,62 +998,62 @@ int Size_Not_Found, i; + model->BSIM4v5pku0we * Inv_LW; pParam->BSIM4v5abulkCVfactor = 1.0 + pow((pParam->BSIM4v5clc - / pParam->BSIM4v5leffCV), - pParam->BSIM4v5cle); + / pParam->BSIM4v5leffCV), + pParam->BSIM4v5cle); - T0 = (TRatio - 1.0); + T0 = (TRatio - 1.0); - PowWeffWr = pow(pParam->BSIM4v5weffCJ * 1.0e6, pParam->BSIM4v5wr) * here->BSIM4v5nf; + PowWeffWr = pow(pParam->BSIM4v5weffCJ * 1.0e6, pParam->BSIM4v5wr) * here->BSIM4v5nf; - T1 = T2 = T3 = T4 = 0.0; - if(model->BSIM4v5tempMod == 0) { - pParam->BSIM4v5ua = pParam->BSIM4v5ua + pParam->BSIM4v5ua1 * T0; - pParam->BSIM4v5ub = pParam->BSIM4v5ub + pParam->BSIM4v5ub1 * T0; - pParam->BSIM4v5uc = pParam->BSIM4v5uc + pParam->BSIM4v5uc1 * T0; - pParam->BSIM4v5ud = pParam->BSIM4v5ud + pParam->BSIM4v5ud1 * T0; - pParam->BSIM4v5vsattemp = pParam->BSIM4v5vsat - pParam->BSIM4v5at * T0; - T10 = pParam->BSIM4v5prt * T0; - if(model->BSIM4v5rdsMod) { - /* External Rd(V) */ - T1 = pParam->BSIM4v5rdw + T10; - T2 = model->BSIM4v5rdwmin + T10; - /* External Rs(V) */ - T3 = pParam->BSIM4v5rsw + T10; - T4 = model->BSIM4v5rswmin + T10; + T1 = T2 = T3 = T4 = 0.0; + if(model->BSIM4v5tempMod == 0) { + pParam->BSIM4v5ua = pParam->BSIM4v5ua + pParam->BSIM4v5ua1 * T0; + pParam->BSIM4v5ub = pParam->BSIM4v5ub + pParam->BSIM4v5ub1 * T0; + pParam->BSIM4v5uc = pParam->BSIM4v5uc + pParam->BSIM4v5uc1 * T0; + pParam->BSIM4v5ud = pParam->BSIM4v5ud + pParam->BSIM4v5ud1 * T0; + pParam->BSIM4v5vsattemp = pParam->BSIM4v5vsat - pParam->BSIM4v5at * T0; + T10 = pParam->BSIM4v5prt * T0; + if(model->BSIM4v5rdsMod) { + /* External Rd(V) */ + T1 = pParam->BSIM4v5rdw + T10; + T2 = model->BSIM4v5rdwmin + T10; + /* External Rs(V) */ + T3 = pParam->BSIM4v5rsw + T10; + T4 = model->BSIM4v5rswmin + T10; } - /* Internal Rds(V) in IV */ - pParam->BSIM4v5rds0 = (pParam->BSIM4v5rdsw + T10) - * here->BSIM4v5nf / PowWeffWr; - pParam->BSIM4v5rdswmin = (model->BSIM4v5rdswmin + T10) - * here->BSIM4v5nf / PowWeffWr; + /* Internal Rds(V) in IV */ + pParam->BSIM4v5rds0 = (pParam->BSIM4v5rdsw + T10) + * here->BSIM4v5nf / PowWeffWr; + pParam->BSIM4v5rdswmin = (model->BSIM4v5rdswmin + T10) + * here->BSIM4v5nf / PowWeffWr; } else { /* tempMod = 1, 2 */ - pParam->BSIM4v5ua = pParam->BSIM4v5ua * (1.0 + pParam->BSIM4v5ua1 * delTemp) ; - pParam->BSIM4v5ub = pParam->BSIM4v5ub * (1.0 + pParam->BSIM4v5ub1 * delTemp); - pParam->BSIM4v5uc = pParam->BSIM4v5uc * (1.0 + pParam->BSIM4v5uc1 * delTemp); - pParam->BSIM4v5ud = pParam->BSIM4v5ud * (1.0 + pParam->BSIM4v5ud1 * delTemp); - pParam->BSIM4v5vsattemp = pParam->BSIM4v5vsat * (1.0 - pParam->BSIM4v5at * delTemp); - T10 = 1.0 + pParam->BSIM4v5prt * delTemp; - if(model->BSIM4v5rdsMod) { - /* External Rd(V) */ - T1 = pParam->BSIM4v5rdw * T10; - T2 = model->BSIM4v5rdwmin * T10; - /* External Rs(V) */ - T3 = pParam->BSIM4v5rsw * T10; - T4 = model->BSIM4v5rswmin * T10; + pParam->BSIM4v5ua = pParam->BSIM4v5ua * (1.0 + pParam->BSIM4v5ua1 * delTemp) ; + pParam->BSIM4v5ub = pParam->BSIM4v5ub * (1.0 + pParam->BSIM4v5ub1 * delTemp); + pParam->BSIM4v5uc = pParam->BSIM4v5uc * (1.0 + pParam->BSIM4v5uc1 * delTemp); + pParam->BSIM4v5ud = pParam->BSIM4v5ud * (1.0 + pParam->BSIM4v5ud1 * delTemp); + pParam->BSIM4v5vsattemp = pParam->BSIM4v5vsat * (1.0 - pParam->BSIM4v5at * delTemp); + T10 = 1.0 + pParam->BSIM4v5prt * delTemp; + if(model->BSIM4v5rdsMod) { + /* External Rd(V) */ + T1 = pParam->BSIM4v5rdw * T10; + T2 = model->BSIM4v5rdwmin * T10; + /* External Rs(V) */ + T3 = pParam->BSIM4v5rsw * T10; + T4 = model->BSIM4v5rswmin * T10; } - /* Internal Rds(V) in IV */ - pParam->BSIM4v5rds0 = pParam->BSIM4v5rdsw * T10 * here->BSIM4v5nf / PowWeffWr; - pParam->BSIM4v5rdswmin = model->BSIM4v5rdswmin * T10 * here->BSIM4v5nf / PowWeffWr; + /* Internal Rds(V) in IV */ + pParam->BSIM4v5rds0 = pParam->BSIM4v5rdsw * T10 * here->BSIM4v5nf / PowWeffWr; + pParam->BSIM4v5rdswmin = model->BSIM4v5rdswmin * T10 * here->BSIM4v5nf / PowWeffWr; } - if (T1 < 0.0) - { T1 = 0.0; - printf("Warning: Rdw at current temperature is negative; set to 0.\n"); - } - if (T2 < 0.0) + 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->BSIM4v5rd0 = T1 / PowWeffWr; + pParam->BSIM4v5rd0 = T1 / PowWeffWr; pParam->BSIM4v5rdwmin = T2 / PowWeffWr; if (T3 < 0.0) { T3 = 0.0; @@ -1066,34 +1066,34 @@ int Size_Not_Found, i; pParam->BSIM4v5rs0 = T3 / PowWeffWr; pParam->BSIM4v5rswmin = T4 / PowWeffWr; - if (pParam->BSIM4v5u0 > 1.0) + if (pParam->BSIM4v5u0 > 1.0) pParam->BSIM4v5u0 = pParam->BSIM4v5u0 / 1.0e4; /* mobility channel length dependence */ T5 = 1.0 - pParam->BSIM4v5up * exp( - pParam->BSIM4v5leff / pParam->BSIM4v5lp); pParam->BSIM4v5u0temp = pParam->BSIM4v5u0 * T5 - * pow(TRatio, pParam->BSIM4v5ute); + * pow(TRatio, pParam->BSIM4v5ute); if (pParam->BSIM4v5eu < 0.0) { pParam->BSIM4v5eu = 0.0; - printf("Warning: eu has been negative; reset to 0.0.\n"); - } + printf("Warning: eu has been negative; reset to 0.0.\n"); + } - pParam->BSIM4v5vfbsdoff = pParam->BSIM4v5vfbsdoff * (1.0 + pParam->BSIM4v5tvfbsdoff * delTemp); - pParam->BSIM4v5voff = pParam->BSIM4v5voff * (1.0 + pParam->BSIM4v5tvoff * delTemp); + pParam->BSIM4v5vfbsdoff = pParam->BSIM4v5vfbsdoff * (1.0 + pParam->BSIM4v5tvfbsdoff * delTemp); + pParam->BSIM4v5voff = pParam->BSIM4v5voff * (1.0 + pParam->BSIM4v5tvoff * delTemp); /* Source End Velocity Limit */ - if((model->BSIM4v5vtlGiven) && (model->BSIM4v5vtl > 0.0) ) - { + if((model->BSIM4v5vtlGiven) && (model->BSIM4v5vtl > 0.0) ) + { if(model->BSIM4v5lc < 0.0) pParam->BSIM4v5lc = 0.0; else pParam->BSIM4v5lc = model->BSIM4v5lc ; T0 = pParam->BSIM4v5leff / (pParam->BSIM4v5xn * pParam->BSIM4v5leff + pParam->BSIM4v5lc); pParam->BSIM4v5tfactor = (1.0 - T0) / (1.0 + T0 ); - } + } pParam->BSIM4v5cgdo = (model->BSIM4v5cgdo + pParam->BSIM4v5cf) - * pParam->BSIM4v5weffCV; + * pParam->BSIM4v5weffCV; pParam->BSIM4v5cgso = (model->BSIM4v5cgso + pParam->BSIM4v5cf) - * pParam->BSIM4v5weffCV; + * pParam->BSIM4v5weffCV; pParam->BSIM4v5cgbo = model->BSIM4v5cgbo * pParam->BSIM4v5leffCV * here->BSIM4v5nf; if (!model->BSIM4v5ndepGiven && model->BSIM4v5gamma1Given) @@ -1101,35 +1101,35 @@ int Size_Not_Found, i; pParam->BSIM4v5ndep = 3.01248e22 * T0 * T0; } - pParam->BSIM4v5phi = Vtm0 * log(pParam->BSIM4v5ndep / ni) - + pParam->BSIM4v5phin + 0.4; + pParam->BSIM4v5phi = Vtm0 * log(pParam->BSIM4v5ndep / ni) + + pParam->BSIM4v5phin + 0.4; - pParam->BSIM4v5sqrtPhi = sqrt(pParam->BSIM4v5phi); - pParam->BSIM4v5phis3 = pParam->BSIM4v5sqrtPhi * pParam->BSIM4v5phi; + pParam->BSIM4v5sqrtPhi = sqrt(pParam->BSIM4v5phi); + pParam->BSIM4v5phis3 = pParam->BSIM4v5sqrtPhi * pParam->BSIM4v5phi; pParam->BSIM4v5Xdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->BSIM4v5ndep * 1.0e6)) - * pParam->BSIM4v5sqrtPhi; + * pParam->BSIM4v5ndep * 1.0e6)) + * pParam->BSIM4v5sqrtPhi; pParam->BSIM4v5sqrtXdep0 = sqrt(pParam->BSIM4v5Xdep0); pParam->BSIM4v5litl = sqrt(3.0 * pParam->BSIM4v5xj - * model->BSIM4v5toxe); + * model->BSIM4v5toxe); pParam->BSIM4v5vbi = Vtm0 * log(pParam->BSIM4v5nsd - * pParam->BSIM4v5ndep / (ni * ni)); + * pParam->BSIM4v5ndep / (ni * ni)); - if (pParam->BSIM4v5ngate > 0.0) + if (pParam->BSIM4v5ngate > 0.0) { pParam->BSIM4v5vfbsd = Vtm0 * log(pParam->BSIM4v5ngate / pParam->BSIM4v5nsd); - } - else - pParam->BSIM4v5vfbsd = 0.0; + } + else + pParam->BSIM4v5vfbsd = 0.0; pParam->BSIM4v5cdep0 = sqrt(Charge_q * EPSSI - * pParam->BSIM4v5ndep * 1.0e6 / 2.0 - / pParam->BSIM4v5phi); + * pParam->BSIM4v5ndep * 1.0e6 / 2.0 + / pParam->BSIM4v5phi); pParam->BSIM4v5ToxRatio = exp(pParam->BSIM4v5ntox - * log(model->BSIM4v5toxref / model->BSIM4v5toxe)) - / model->BSIM4v5toxe / model->BSIM4v5toxe; + * log(model->BSIM4v5toxref / model->BSIM4v5toxe)) + / model->BSIM4v5toxe / model->BSIM4v5toxe; pParam->BSIM4v5ToxRatioEdge = exp(pParam->BSIM4v5ntox * log(model->BSIM4v5toxref / (model->BSIM4v5toxe * pParam->BSIM4v5poxedge))) @@ -1138,11 +1138,11 @@ int Size_Not_Found, i; pParam->BSIM4v5Aechvb = (model->BSIM4v5type == NMOS) ? 4.97232e-7 : 3.42537e-7; pParam->BSIM4v5Bechvb = (model->BSIM4v5type == NMOS) ? 7.45669e11 : 1.16645e12; pParam->BSIM4v5AechvbEdge = pParam->BSIM4v5Aechvb * pParam->BSIM4v5weff - * model->BSIM4v5dlcig * pParam->BSIM4v5ToxRatioEdge; + * model->BSIM4v5dlcig * pParam->BSIM4v5ToxRatioEdge; pParam->BSIM4v5BechvbEdge = -pParam->BSIM4v5Bechvb - * model->BSIM4v5toxe * pParam->BSIM4v5poxedge; + * model->BSIM4v5toxe * pParam->BSIM4v5poxedge; pParam->BSIM4v5Aechvb *= pParam->BSIM4v5weff * pParam->BSIM4v5leff - * pParam->BSIM4v5ToxRatio; + * pParam->BSIM4v5ToxRatio; pParam->BSIM4v5Bechvb *= -model->BSIM4v5toxe; @@ -1181,33 +1181,33 @@ int Size_Not_Found, i; } } else - { if (!model->BSIM4v5vbxGiven) - pParam->BSIM4v5vbx = pParam->BSIM4v5phi - 7.7348e-4 + { if (!model->BSIM4v5vbxGiven) + pParam->BSIM4v5vbx = pParam->BSIM4v5phi - 7.7348e-4 * pParam->BSIM4v5ndep - * pParam->BSIM4v5xt * pParam->BSIM4v5xt; - if (pParam->BSIM4v5vbx > 0.0) - pParam->BSIM4v5vbx = -pParam->BSIM4v5vbx; - if (pParam->BSIM4v5vbm > 0.0) + * pParam->BSIM4v5xt * pParam->BSIM4v5xt; + if (pParam->BSIM4v5vbx > 0.0) + pParam->BSIM4v5vbx = -pParam->BSIM4v5vbx; + if (pParam->BSIM4v5vbm > 0.0) pParam->BSIM4v5vbm = -pParam->BSIM4v5vbm; - + if (!model->BSIM4v5gamma1Given) pParam->BSIM4v5gamma1 = 5.753e-12 - * sqrt(pParam->BSIM4v5ndep) + * sqrt(pParam->BSIM4v5ndep) / model->BSIM4v5coxe; if (!model->BSIM4v5gamma2Given) pParam->BSIM4v5gamma2 = 5.753e-12 - * sqrt(pParam->BSIM4v5nsub) + * sqrt(pParam->BSIM4v5nsub) / model->BSIM4v5coxe; T0 = pParam->BSIM4v5gamma1 - pParam->BSIM4v5gamma2; T1 = sqrt(pParam->BSIM4v5phi - pParam->BSIM4v5vbx) - - pParam->BSIM4v5sqrtPhi; + - pParam->BSIM4v5sqrtPhi; T2 = sqrt(pParam->BSIM4v5phi * (pParam->BSIM4v5phi - - pParam->BSIM4v5vbm)) - pParam->BSIM4v5phi; + - pParam->BSIM4v5vbm)) - pParam->BSIM4v5phi; pParam->BSIM4v5k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM4v5vbm); pParam->BSIM4v5k1 = pParam->BSIM4v5gamma2 - 2.0 - * pParam->BSIM4v5k2 * sqrt(pParam->BSIM4v5phi - - pParam->BSIM4v5vbm); + * pParam->BSIM4v5k2 * sqrt(pParam->BSIM4v5phi + - pParam->BSIM4v5vbm); } if (!model->BSIM4v5vfbGiven) @@ -1225,27 +1225,27 @@ int Size_Not_Found, i; + pParam->BSIM4v5phi + pParam->BSIM4v5k1 * pParam->BSIM4v5sqrtPhi); } - + pParam->BSIM4v5k1ox = pParam->BSIM4v5k1 * model->BSIM4v5toxe / model->BSIM4v5toxm; tmp = sqrt(EPSSI / (model->BSIM4v5epsrox * EPS0) * model->BSIM4v5toxe * pParam->BSIM4v5Xdep0); - T0 = pParam->BSIM4v5dsub * pParam->BSIM4v5leff / tmp; + T0 = pParam->BSIM4v5dsub * pParam->BSIM4v5leff / tmp; if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; + { T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; T4 = T3 + 2.0 * T1 * MIN_EXP; pParam->BSIM4v5theta0vb0 = T1 / T4; } else pParam->BSIM4v5theta0vb0 = 1.0 / (MAX_EXP - 2.0); - T0 = pParam->BSIM4v5drout * pParam->BSIM4v5leff / tmp; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; + T0 = pParam->BSIM4v5drout * pParam->BSIM4v5leff / tmp; + if (T0 < EXP_THRESHOLD) + { T1 = exp(T0); + T2 = T1 - 1.0; T3 = T2 * T2; T4 = T3 + 2.0 * T1 * MIN_EXP; T5 = T1 / T4; @@ -1280,7 +1280,7 @@ int Size_Not_Found, i; T3 = T2 * T2; T4 = T3 + 2.0 * T1 * MIN_EXP; T9 = T1 / T4; - } + } else T9 = 1.0 / (MAX_EXP - 2.0); T9 = pParam->BSIM4v5dvt0 * T9 * tmp1; @@ -1290,25 +1290,25 @@ int Size_Not_Found, i; T0 = sqrt(1.0 + pParam->BSIM4v5lpe0 / pParam->BSIM4v5leff); if((model->BSIM4v5tempMod == 1) || (model->BSIM4v5tempMod == 0)) - T3 = (pParam->BSIM4v5kt1 + pParam->BSIM4v5kt1l / pParam->BSIM4v5leff) - * (TRatio - 1.0); + T3 = (pParam->BSIM4v5kt1 + pParam->BSIM4v5kt1l / pParam->BSIM4v5leff) + * (TRatio - 1.0); if(model->BSIM4v5tempMod == 2) T3 = - pParam->BSIM4v5kt1 * (TRatio - 1.0); T5 = pParam->BSIM4v5k1ox * (T0 - 1.0) * pParam->BSIM4v5sqrtPhi + T3; pParam->BSIM4v5vfbzbfactor = - T8 - T9 + pParam->BSIM4v5k3 * T4 + T5 - - pParam->BSIM4v5phi - pParam->BSIM4v5k1 * pParam->BSIM4v5sqrtPhi; + - pParam->BSIM4v5phi - pParam->BSIM4v5k1 * pParam->BSIM4v5sqrtPhi; - /* stress effect */ + /* stress effect */ - wlod = model->BSIM4v5wlod; - if (model->BSIM4v5wlod < 0.0) - { fprintf(stderr, "Warning: WLOD = %g is less than 0. 0.0 is used\n",model->BSIM4v5wlod); - wlod = 0.0; - } + wlod = model->BSIM4v5wlod; + if (model->BSIM4v5wlod < 0.0) + { fprintf(stderr, "Warning: WLOD = %g is less than 0. 0.0 is used\n",model->BSIM4v5wlod); + wlod = 0.0; + } T0 = pow(Lnew, model->BSIM4v5llodku0); - W_tmp = Wnew + wlod; + W_tmp = Wnew + wlod; T1 = pow(W_tmp, model->BSIM4v5wlodku0); tmp1 = model->BSIM4v5lku0 / T0 + model->BSIM4v5wku0 / T1 + model->BSIM4v5pku0 / (T0 * T1); @@ -1319,41 +1319,41 @@ int Size_Not_Found, i; tmp1 = model->BSIM4v5lkvth0 / T0 + model->BSIM4v5wkvth0 / T1 + model->BSIM4v5pkvth0 / (T0 * T1); pParam->BSIM4v5kvth0 = 1.0 + tmp1; - pParam->BSIM4v5kvth0 = sqrt(pParam->BSIM4v5kvth0*pParam->BSIM4v5kvth0 + DELTA); + pParam->BSIM4v5kvth0 = sqrt(pParam->BSIM4v5kvth0*pParam->BSIM4v5kvth0 + DELTA); T0 = (TRatio - 1.0); pParam->BSIM4v5ku0temp = pParam->BSIM4v5ku0 * (1.0 + model->BSIM4v5tku0 *T0) + DELTA; Inv_saref = 1.0/(model->BSIM4v5saref + 0.5*Ldrn); Inv_sbref = 1.0/(model->BSIM4v5sbref + 0.5*Ldrn); - pParam->BSIM4v5inv_od_ref = Inv_saref + Inv_sbref; - pParam->BSIM4v5rho_ref = model->BSIM4v5ku0 / pParam->BSIM4v5ku0temp * pParam->BSIM4v5inv_od_ref; + pParam->BSIM4v5inv_od_ref = Inv_saref + Inv_sbref; + pParam->BSIM4v5rho_ref = model->BSIM4v5ku0 / pParam->BSIM4v5ku0temp * pParam->BSIM4v5inv_od_ref; } /* End of SizeNotFound */ /* stress effect */ - if( (here->BSIM4v5sa > 0.0) && (here->BSIM4v5sb > 0.0) && - ((here->BSIM4v5nf == 1.0) || ((here->BSIM4v5nf > 1.0) && (here->BSIM4v5sd > 0.0))) ) - { Inv_sa = 0; - Inv_sb = 0; - - kvsat = model->BSIM4v5kvsat; - if (model->BSIM4v5kvsat < -1.0 ) - { fprintf(stderr, "Warning: KVSAT = %g is too small; -1.0 is used.\n",model->BSIM4v5kvsat); - kvsat = -1.0; - } - if (model->BSIM4v5kvsat > 1.0) - { fprintf(stderr, "Warning: KVSAT = %g is too big; 1.0 is used.\n",model->BSIM4v5kvsat); - kvsat = 1.0; - } - - for(i = 0; i < here->BSIM4v5nf; i++){ - T0 = 1.0 / here->BSIM4v5nf / (here->BSIM4v5sa + 0.5*Ldrn + i * (here->BSIM4v5sd +Ldrn)); - T1 = 1.0 / here->BSIM4v5nf / (here->BSIM4v5sb + 0.5*Ldrn + i * (here->BSIM4v5sd +Ldrn)); - Inv_sa += T0; - Inv_sb += T1; + if( (here->BSIM4v5sa > 0.0) && (here->BSIM4v5sb > 0.0) && + ((here->BSIM4v5nf == 1.0) || ((here->BSIM4v5nf > 1.0) && (here->BSIM4v5sd > 0.0))) ) + { Inv_sa = 0; + Inv_sb = 0; + + kvsat = model->BSIM4v5kvsat; + if (model->BSIM4v5kvsat < -1.0 ) + { fprintf(stderr, "Warning: KVSAT = %g is too small; -1.0 is used.\n",model->BSIM4v5kvsat); + kvsat = -1.0; + } + if (model->BSIM4v5kvsat > 1.0) + { fprintf(stderr, "Warning: KVSAT = %g is too big; 1.0 is used.\n",model->BSIM4v5kvsat); + kvsat = 1.0; + } + + for(i = 0; i < here->BSIM4v5nf; i++){ + T0 = 1.0 / here->BSIM4v5nf / (here->BSIM4v5sa + 0.5*Ldrn + i * (here->BSIM4v5sd +Ldrn)); + T1 = 1.0 / here->BSIM4v5nf / (here->BSIM4v5sb + 0.5*Ldrn + i * (here->BSIM4v5sd +Ldrn)); + Inv_sa += T0; + Inv_sb += T1; } - Inv_ODeff = Inv_sa + Inv_sb; + Inv_ODeff = Inv_sa + Inv_sb; rho = model->BSIM4v5ku0 / pParam->BSIM4v5ku0temp * Inv_ODeff; T0 = (1.0 + rho)/(1.0 + pParam->BSIM4v5rho_ref); here->BSIM4v5u0temp = pParam->BSIM4v5u0temp * T0; @@ -1361,62 +1361,62 @@ int Size_Not_Found, i; T1 = (1.0 + kvsat * rho)/(1.0 + kvsat * pParam->BSIM4v5rho_ref); here->BSIM4v5vsattemp = pParam->BSIM4v5vsattemp * T1; - OD_offset = Inv_ODeff - pParam->BSIM4v5inv_od_ref; - dvth0_lod = model->BSIM4v5kvth0 / pParam->BSIM4v5kvth0 * OD_offset; + OD_offset = Inv_ODeff - pParam->BSIM4v5inv_od_ref; + dvth0_lod = model->BSIM4v5kvth0 / pParam->BSIM4v5kvth0 * OD_offset; dk2_lod = model->BSIM4v5stk2 / pow(pParam->BSIM4v5kvth0, model->BSIM4v5lodk2) * OD_offset; deta0_lod = model->BSIM4v5steta0 / pow(pParam->BSIM4v5kvth0, model->BSIM4v5lodeta0) * OD_offset; - here->BSIM4v5vth0 = pParam->BSIM4v5vth0 + dvth0_lod; + here->BSIM4v5vth0 = pParam->BSIM4v5vth0 + dvth0_lod; here->BSIM4v5eta0 = pParam->BSIM4v5eta0 + deta0_lod; - here->BSIM4v5k2 = pParam->BSIM4v5k2 + dk2_lod; - } else { - here->BSIM4v5u0temp = pParam->BSIM4v5u0temp; + here->BSIM4v5k2 = pParam->BSIM4v5k2 + dk2_lod; + } else { + here->BSIM4v5u0temp = pParam->BSIM4v5u0temp; here->BSIM4v5vth0 = pParam->BSIM4v5vth0; here->BSIM4v5vsattemp = pParam->BSIM4v5vsattemp; here->BSIM4v5eta0 = pParam->BSIM4v5eta0; here->BSIM4v5k2 = pParam->BSIM4v5k2; } - /* Well Proximity Effect */ - if (model->BSIM4v5wpemod) + /* Well Proximity Effect */ + if (model->BSIM4v5wpemod) { if( (!here->BSIM4v5scaGiven) && (!here->BSIM4v5scbGiven) && (!here->BSIM4v5sccGiven) ) - { if((here->BSIM4v5scGiven) && (here->BSIM4v5sc > 0.0) ) - { T1 = here->BSIM4v5sc + Wdrn; - T2 = 1.0 / model->BSIM4v5scref; - here->BSIM4v5sca = model->BSIM4v5scref * model->BSIM4v5scref - / (here->BSIM4v5sc * T1); - here->BSIM4v5scb = ( (0.1 * here->BSIM4v5sc + 0.01 * model->BSIM4v5scref) - * exp(-10.0 * here->BSIM4v5sc * T2) - - (0.1 * T1 + 0.01 * model->BSIM4v5scref) - * exp(-10.0 * T1 * T2) ) / Wdrn; + { if((here->BSIM4v5scGiven) && (here->BSIM4v5sc > 0.0) ) + { T1 = here->BSIM4v5sc + Wdrn; + T2 = 1.0 / model->BSIM4v5scref; + here->BSIM4v5sca = model->BSIM4v5scref * model->BSIM4v5scref + / (here->BSIM4v5sc * T1); + here->BSIM4v5scb = ( (0.1 * here->BSIM4v5sc + 0.01 * model->BSIM4v5scref) + * exp(-10.0 * here->BSIM4v5sc * T2) + - (0.1 * T1 + 0.01 * model->BSIM4v5scref) + * exp(-10.0 * T1 * T2) ) / Wdrn; here->BSIM4v5scc = ( (0.05 * here->BSIM4v5sc + 0.0025 * model->BSIM4v5scref) - * exp(-20.0 * here->BSIM4v5sc * T2) - - (0.05 * T1 + 0.0025 * model->BSIM4v5scref) + * exp(-20.0 * here->BSIM4v5sc * T2) + - (0.05 * T1 + 0.0025 * model->BSIM4v5scref) * exp(-20.0 * T1 * T2) ) / Wdrn; - } else { - //fprintf(stderr, "Warning: No WPE as none of SCA, SCB, SCC, SC is given and/or SC not positive.\n"); - } - } - sceff = here->BSIM4v5sca + model->BSIM4v5web * here->BSIM4v5scb + } else { + //fprintf(stderr, "Warning: No WPE as none of SCA, SCB, SCC, SC is given and/or SC not positive.\n"); + } + } + sceff = here->BSIM4v5sca + model->BSIM4v5web * here->BSIM4v5scb + model->BSIM4v5wec * here->BSIM4v5scc; here->BSIM4v5vth0 += pParam->BSIM4v5kvth0we * sceff; here->BSIM4v5k2 += pParam->BSIM4v5k2we * sceff; - T3 = 1.0 + pParam->BSIM4v5ku0we * sceff; - if (T3 <= 0.0) - { + T3 = 1.0 + pParam->BSIM4v5ku0we * sceff; + if (T3 <= 0.0) + { fprintf(stderr, "Warning: ku0we = %g is negatively too high. Negative mobility! \n", T3); - T3 = 0.0; - } - here->BSIM4v5u0temp *= T3; + T3 = 0.0; + } + here->BSIM4v5u0temp *= T3; } - /* adding delvto */ + /* adding delvto */ here->BSIM4v5vth0 += here->BSIM4v5delvto; here->BSIM4v5vfb = pParam->BSIM4v5vfb + model->BSIM4v5type * here->BSIM4v5delvto; - /* Instance variables calculation */ + /* Instance variables calculation */ T3 = model->BSIM4v5type * here->BSIM4v5vth0 - here->BSIM4v5vfb - pParam->BSIM4v5phi; T4 = T3 + T3; @@ -1444,57 +1444,57 @@ int Size_Not_Found, i; here->BSIM4v5k2ox = here->BSIM4v5k2 * model->BSIM4v5toxe / model->BSIM4v5toxm; - here->BSIM4v5vfbzb = pParam->BSIM4v5vfbzbfactor - + model->BSIM4v5type * here->BSIM4v5vth0 ; - + here->BSIM4v5vfbzb = pParam->BSIM4v5vfbzbfactor + + model->BSIM4v5type * here->BSIM4v5vth0 ; + here->BSIM4v5cgso = pParam->BSIM4v5cgso; here->BSIM4v5cgdo = pParam->BSIM4v5cgdo; - - lnl = log(pParam->BSIM4v5leff * 1.0e6); - lnw = log(pParam->BSIM4v5weff * 1.0e6); - lnnf = log(here->BSIM4v5nf); - bodymode = 5; - if( ( !model->BSIM4v5rbps0Given) || - ( !model->BSIM4v5rbpd0Given) ) - bodymode = 1; - else - if( (!model->BSIM4v5rbsbx0Given && !model->BSIM4v5rbsby0Given) || - (!model->BSIM4v5rbdbx0Given && !model->BSIM4v5rbdby0Given) ) - bodymode = 3; + lnl = log(pParam->BSIM4v5leff * 1.0e6); + lnw = log(pParam->BSIM4v5weff * 1.0e6); + lnnf = log(here->BSIM4v5nf); - if(here->BSIM4v5rbodyMod == 2) - { - if (bodymode == 5) - { - rbsbx = exp( log(model->BSIM4v5rbsbx0) + model->BSIM4v5rbsdbxl * lnl + - model->BSIM4v5rbsdbxw * lnw + model->BSIM4v5rbsdbxnf * lnnf ); - rbsby = exp( log(model->BSIM4v5rbsby0) + model->BSIM4v5rbsdbyl * lnl + - model->BSIM4v5rbsdbyw * lnw + model->BSIM4v5rbsdbynf * lnnf ); - here->BSIM4v5rbsb = rbsbx * rbsby / (rbsbx + rbsby); + bodymode = 5; + if( ( !model->BSIM4v5rbps0Given) || + ( !model->BSIM4v5rbpd0Given) ) + bodymode = 1; + else + if( (!model->BSIM4v5rbsbx0Given && !model->BSIM4v5rbsby0Given) || + (!model->BSIM4v5rbdbx0Given && !model->BSIM4v5rbdby0Given) ) + bodymode = 3; - - rbdbx = exp( log(model->BSIM4v5rbdbx0) + model->BSIM4v5rbsdbxl * lnl + - model->BSIM4v5rbsdbxw * lnw + model->BSIM4v5rbsdbxnf * lnnf ); - rbdby = exp( log(model->BSIM4v5rbdby0) + model->BSIM4v5rbsdbyl * lnl + - model->BSIM4v5rbsdbyw * lnw + model->BSIM4v5rbsdbynf * lnnf ); - here->BSIM4v5rbdb = rbdbx * rbdby / (rbdbx + rbdby); - } + if(here->BSIM4v5rbodyMod == 2) + { + if (bodymode == 5) + { + rbsbx = exp( log(model->BSIM4v5rbsbx0) + model->BSIM4v5rbsdbxl * lnl + + model->BSIM4v5rbsdbxw * lnw + model->BSIM4v5rbsdbxnf * lnnf ); + rbsby = exp( log(model->BSIM4v5rbsby0) + model->BSIM4v5rbsdbyl * lnl + + model->BSIM4v5rbsdbyw * lnw + model->BSIM4v5rbsdbynf * lnnf ); + here->BSIM4v5rbsb = rbsbx * rbsby / (rbsbx + rbsby); - if ((bodymode == 3)|| (bodymode == 5)) - { - here->BSIM4v5rbps = exp( log(model->BSIM4v5rbps0) + model->BSIM4v5rbpsl * lnl + - model->BSIM4v5rbpsw * lnw + model->BSIM4v5rbpsnf * lnnf ); - here->BSIM4v5rbpd = exp( log(model->BSIM4v5rbpd0) + model->BSIM4v5rbpdl * lnl + - model->BSIM4v5rbpdw * lnw + model->BSIM4v5rbpdnf * lnnf ); - } - - rbpbx = exp( log(model->BSIM4v5rbpbx0) + model->BSIM4v5rbpbxl * lnl + - model->BSIM4v5rbpbxw * lnw + model->BSIM4v5rbpbxnf * lnnf ); - rbpby = exp( log(model->BSIM4v5rbpby0) + model->BSIM4v5rbpbyl * lnl + - model->BSIM4v5rbpbyw * lnw + model->BSIM4v5rbpbynf * lnnf ); - here->BSIM4v5rbpb = rbpbx*rbpby/(rbpbx + rbpby); - } + + rbdbx = exp( log(model->BSIM4v5rbdbx0) + model->BSIM4v5rbsdbxl * lnl + + model->BSIM4v5rbsdbxw * lnw + model->BSIM4v5rbsdbxnf * lnnf ); + rbdby = exp( log(model->BSIM4v5rbdby0) + model->BSIM4v5rbsdbyl * lnl + + model->BSIM4v5rbsdbyw * lnw + model->BSIM4v5rbsdbynf * lnnf ); + here->BSIM4v5rbdb = rbdbx * rbdby / (rbdbx + rbdby); + } + + if ((bodymode == 3)|| (bodymode == 5)) + { + here->BSIM4v5rbps = exp( log(model->BSIM4v5rbps0) + model->BSIM4v5rbpsl * lnl + + model->BSIM4v5rbpsw * lnw + model->BSIM4v5rbpsnf * lnnf ); + here->BSIM4v5rbpd = exp( log(model->BSIM4v5rbpd0) + model->BSIM4v5rbpdl * lnl + + model->BSIM4v5rbpdw * lnw + model->BSIM4v5rbpdnf * lnnf ); + } + + rbpbx = exp( log(model->BSIM4v5rbpbx0) + model->BSIM4v5rbpbxl * lnl + + model->BSIM4v5rbpbxw * lnw + model->BSIM4v5rbpbxnf * lnnf ); + rbpby = exp( log(model->BSIM4v5rbpby0) + model->BSIM4v5rbpbyl * lnl + + model->BSIM4v5rbpbyw * lnw + model->BSIM4v5rbpbynf * lnnf ); + here->BSIM4v5rbpb = rbpbx*rbpby/(rbpbx + rbpby); + } if ((here->BSIM4v5rbodyMod == 1 ) || ((here->BSIM4v5rbodyMod == 2 ) && (bodymode == 5)) ) @@ -1521,8 +1521,8 @@ int Size_Not_Found, i; } - if((here->BSIM4v5rbodyMod == 2) && (bodymode == 3)) - { + if((here->BSIM4v5rbodyMod == 2) && (bodymode == 3)) + { here->BSIM4v5grbdb = here->BSIM4v5grbsb = model->BSIM4v5gbmin; if (here->BSIM4v5rbpb < 1.0e-3) here->BSIM4v5grbpb = 1.0e3; @@ -1538,10 +1538,10 @@ int Size_Not_Found, i; here->BSIM4v5grbpd = model->BSIM4v5gbmin + 1.0 / here->BSIM4v5rbpd; } - if((here->BSIM4v5rbodyMod == 2) && (bodymode == 1)) - { + if((here->BSIM4v5rbodyMod == 2) && (bodymode == 1)) + { here->BSIM4v5grbdb = here->BSIM4v5grbsb = model->BSIM4v5gbmin; - here->BSIM4v5grbps = here->BSIM4v5grbpd = 1.0e3; + here->BSIM4v5grbps = here->BSIM4v5grbpd = 1.0e3; if (here->BSIM4v5rbpb < 1.0e-3) here->BSIM4v5grbpb = 1.0e3; else @@ -1549,9 +1549,9 @@ int Size_Not_Found, i; } - /* + /* * Process geomertry dependent parasitics - */ + */ here->BSIM4v5grgeltd = model->BSIM4v5rshg * (here->BSIM4v5xgw + pParam->BSIM4v5weffCJ / 3.0 / here->BSIM4v5ngcon) / @@ -1561,53 +1561,53 @@ int Size_Not_Found, i; here->BSIM4v5grgeltd = 1.0 / here->BSIM4v5grgeltd; else { here->BSIM4v5grgeltd = 1.0e3; /* mho */ - if (here->BSIM4v5rgateMod != 0) + if (here->BSIM4v5rgateMod != 0) printf("Warning: The gate conductance reset to 1.0e3 mho.\n"); } - DMCGeff = model->BSIM4v5dmcg - model->BSIM4v5dmcgt; + DMCGeff = model->BSIM4v5dmcg - model->BSIM4v5dmcgt; DMCIeff = model->BSIM4v5dmci; DMDGeff = model->BSIM4v5dmdg - model->BSIM4v5dmcgt; - if (here->BSIM4v5sourcePerimeterGiven) - { if (model->BSIM4v5perMod == 0) - here->BSIM4v5Pseff = here->BSIM4v5sourcePerimeter; - else - here->BSIM4v5Pseff = here->BSIM4v5sourcePerimeter - - pParam->BSIM4v5weffCJ * here->BSIM4v5nf; - } - else - BSIM4v5PAeffGeo(here->BSIM4v5nf, here->BSIM4v5geoMod, here->BSIM4v5min, + if (here->BSIM4v5sourcePerimeterGiven) + { if (model->BSIM4v5perMod == 0) + here->BSIM4v5Pseff = here->BSIM4v5sourcePerimeter; + else + here->BSIM4v5Pseff = here->BSIM4v5sourcePerimeter + - pParam->BSIM4v5weffCJ * here->BSIM4v5nf; + } + else + BSIM4v5PAeffGeo(here->BSIM4v5nf, here->BSIM4v5geoMod, here->BSIM4v5min, pParam->BSIM4v5weffCJ, DMCGeff, DMCIeff, DMDGeff, - &(here->BSIM4v5Pseff), &dumPd, &dumAs, &dumAd); + &(here->BSIM4v5Pseff), &dumPd, &dumAs, &dumAd); if (here->BSIM4v5drainPerimeterGiven) { if (model->BSIM4v5perMod == 0) here->BSIM4v5Pdeff = here->BSIM4v5drainPerimeter; else - here->BSIM4v5Pdeff = here->BSIM4v5drainPerimeter - - pParam->BSIM4v5weffCJ * here->BSIM4v5nf; + here->BSIM4v5Pdeff = here->BSIM4v5drainPerimeter + - pParam->BSIM4v5weffCJ * here->BSIM4v5nf; } else BSIM4v5PAeffGeo(here->BSIM4v5nf, here->BSIM4v5geoMod, here->BSIM4v5min, pParam->BSIM4v5weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &(here->BSIM4v5Pdeff), &dumAs, &dumAd); + &dumPs, &(here->BSIM4v5Pdeff), &dumAs, &dumAd); if (here->BSIM4v5sourceAreaGiven) here->BSIM4v5Aseff = here->BSIM4v5sourceArea; else BSIM4v5PAeffGeo(here->BSIM4v5nf, here->BSIM4v5geoMod, here->BSIM4v5min, pParam->BSIM4v5weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &dumPd, &(here->BSIM4v5Aseff), &dumAd); + &dumPs, &dumPd, &(here->BSIM4v5Aseff), &dumAd); if (here->BSIM4v5drainAreaGiven) here->BSIM4v5Adeff = here->BSIM4v5drainArea; else BSIM4v5PAeffGeo(here->BSIM4v5nf, here->BSIM4v5geoMod, here->BSIM4v5min, pParam->BSIM4v5weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &dumPd, &dumAs, &(here->BSIM4v5Adeff)); + &dumPs, &dumPd, &dumAs, &(here->BSIM4v5Adeff)); - /* Processing S/D resistance and conductance below */ + /* Processing S/D resistance and conductance below */ if(here->BSIM4v5sNodePrime != here->BSIM4v5sNode) { here->BSIM4v5sourceConductance = 0.0; @@ -1669,7 +1669,7 @@ int Size_Not_Found, i; { here->BSIM4v5drainConductance = 0.0; } - + /* End of Rsd processing */ @@ -1679,52 +1679,52 @@ int Size_Not_Found, i; } else { SourceSatCurrent = here->BSIM4v5Aseff * model->BSIM4v5SjctTempSatCurDensity - + here->BSIM4v5Pseff * model->BSIM4v5SjctSidewallTempSatCurDensity + + here->BSIM4v5Pseff * model->BSIM4v5SjctSidewallTempSatCurDensity + pParam->BSIM4v5weffCJ * here->BSIM4v5nf * model->BSIM4v5SjctGateSidewallTempSatCurDensity; } if (SourceSatCurrent > 0.0) { switch(model->BSIM4v5dioMod) { case 0: - if ((model->BSIM4v5bvs / Nvtms) > EXP_THRESHOLD) - here->BSIM4v5XExpBVS = model->BSIM4v5xjbvs * MIN_EXP; - else - here->BSIM4v5XExpBVS = model->BSIM4v5xjbvs * exp(-model->BSIM4v5bvs / Nvtms); - break; + if ((model->BSIM4v5bvs / Nvtms) > EXP_THRESHOLD) + here->BSIM4v5XExpBVS = model->BSIM4v5xjbvs * MIN_EXP; + else + here->BSIM4v5XExpBVS = model->BSIM4v5xjbvs * exp(-model->BSIM4v5bvs / Nvtms); + break; case 1: - BSIM4v5DioIjthVjmEval(Nvtms, model->BSIM4v5ijthsfwd, SourceSatCurrent, - 0.0, &(here->BSIM4v5vjsmFwd)); + BSIM4v5DioIjthVjmEval(Nvtms, model->BSIM4v5ijthsfwd, SourceSatCurrent, + 0.0, &(here->BSIM4v5vjsmFwd)); here->BSIM4v5IVjsmFwd = SourceSatCurrent * exp(here->BSIM4v5vjsmFwd / Nvtms); break; case 2: if ((model->BSIM4v5bvs / Nvtms) > EXP_THRESHOLD) { here->BSIM4v5XExpBVS = model->BSIM4v5xjbvs * MIN_EXP; - tmp = MIN_EXP; - } + tmp = MIN_EXP; + } else - { here->BSIM4v5XExpBVS = exp(-model->BSIM4v5bvs / Nvtms); - tmp = here->BSIM4v5XExpBVS; - here->BSIM4v5XExpBVS *= model->BSIM4v5xjbvs; - } + { here->BSIM4v5XExpBVS = exp(-model->BSIM4v5bvs / Nvtms); + tmp = here->BSIM4v5XExpBVS; + here->BSIM4v5XExpBVS *= model->BSIM4v5xjbvs; + } - BSIM4v5DioIjthVjmEval(Nvtms, model->BSIM4v5ijthsfwd, SourceSatCurrent, - here->BSIM4v5XExpBVS, &(here->BSIM4v5vjsmFwd)); - T0 = exp(here->BSIM4v5vjsmFwd / Nvtms); + BSIM4v5DioIjthVjmEval(Nvtms, model->BSIM4v5ijthsfwd, SourceSatCurrent, + here->BSIM4v5XExpBVS, &(here->BSIM4v5vjsmFwd)); + T0 = exp(here->BSIM4v5vjsmFwd / Nvtms); here->BSIM4v5IVjsmFwd = SourceSatCurrent * (T0 - here->BSIM4v5XExpBVS / T0 - + here->BSIM4v5XExpBVS - 1.0); - here->BSIM4v5SslpFwd = SourceSatCurrent - * (T0 + here->BSIM4v5XExpBVS / T0) / Nvtms; + + here->BSIM4v5XExpBVS - 1.0); + here->BSIM4v5SslpFwd = SourceSatCurrent + * (T0 + here->BSIM4v5XExpBVS / T0) / Nvtms; - T2 = model->BSIM4v5ijthsrev / SourceSatCurrent; - if (T2 < 1.0) - { T2 = 10.0; - fprintf(stderr, "Warning: ijthsrev too small and set to 10 times IsbSat.\n"); - } + T2 = model->BSIM4v5ijthsrev / SourceSatCurrent; + if (T2 < 1.0) + { T2 = 10.0; + fprintf(stderr, "Warning: ijthsrev too small and set to 10 times IsbSat.\n"); + } here->BSIM4v5vjsmRev = -model->BSIM4v5bvs - - Nvtms * log((T2 - 1.0) / model->BSIM4v5xjbvs); - T1 = model->BSIM4v5xjbvs * exp(-(model->BSIM4v5bvs - + here->BSIM4v5vjsmRev) / Nvtms); - here->BSIM4v5IVjsmRev = SourceSatCurrent * (1.0 + T1); + - Nvtms * log((T2 - 1.0) / model->BSIM4v5xjbvs); + T1 = model->BSIM4v5xjbvs * exp(-(model->BSIM4v5bvs + + here->BSIM4v5vjsmRev) / Nvtms); + here->BSIM4v5IVjsmRev = SourceSatCurrent * (1.0 + T1); here->BSIM4v5SslpRev = -SourceSatCurrent * T1 / Nvtms; break; default: @@ -1733,12 +1733,12 @@ int Size_Not_Found, i; } Nvtmd = model->BSIM4v5vtm * model->BSIM4v5DjctEmissionCoeff; - if ((here->BSIM4v5Adeff <= 0.0) && (here->BSIM4v5Pdeff <= 0.0)) + if ((here->BSIM4v5Adeff <= 0.0) && (here->BSIM4v5Pdeff <= 0.0)) { DrainSatCurrent = 1.0e-14; } else { DrainSatCurrent = here->BSIM4v5Adeff * model->BSIM4v5DjctTempSatCurDensity - + here->BSIM4v5Pdeff * model->BSIM4v5DjctSidewallTempSatCurDensity + + here->BSIM4v5Pdeff * model->BSIM4v5DjctSidewallTempSatCurDensity + pParam->BSIM4v5weffCJ * here->BSIM4v5nf * model->BSIM4v5DjctGateSidewallTempSatCurDensity; } @@ -1775,7 +1775,7 @@ int Size_Not_Found, i; * (T0 + here->BSIM4v5XExpBVD / T0) / Nvtmd; T2 = model->BSIM4v5ijthdrev / DrainSatCurrent; - if (T2 < 1.0) + if (T2 < 1.0) { T2 = 10.0; fprintf(stderr, "Warning: ijthdrev too small and set to 10 times IdbSat.\n"); } @@ -1791,8 +1791,8 @@ int Size_Not_Found, i; } } - /* GEDL current reverse bias */ - T0 = (TRatio - 1.0); + /* GEDL current reverse bias */ + T0 = (TRatio - 1.0); model->BSIM4v5njtstemp = model->BSIM4v5njts * (1.0 + model->BSIM4v5tnjts * T0); model->BSIM4v5njtsswtemp = model->BSIM4v5njtssw * (1.0 + model->BSIM4v5tnjtssw * T0); model->BSIM4v5njtsswgtemp = model->BSIM4v5njtsswg * (1.0 + model->BSIM4v5tnjtsswg * T0); @@ -1810,14 +1810,14 @@ int Size_Not_Found, i; T9 = model->BSIM4v5xtsswgd * T7; DEXP(T9, T6); - T10 = pParam->BSIM4v5weffCJ * here->BSIM4v5nf; - here->BSIM4v5SjctTempRevSatCur = T1 * here->BSIM4v5Aseff * model->BSIM4v5jtss; - here->BSIM4v5DjctTempRevSatCur = T2 * here->BSIM4v5Adeff * model->BSIM4v5jtsd; - here->BSIM4v5SswTempRevSatCur = T3 * here->BSIM4v5Pseff * model->BSIM4v5jtssws; - here->BSIM4v5DswTempRevSatCur = T4 * here->BSIM4v5Pdeff * model->BSIM4v5jtsswd; - here->BSIM4v5SswgTempRevSatCur = T5 * T10 * model->BSIM4v5jtsswgs; - here->BSIM4v5DswgTempRevSatCur = T6 * T10 * model->BSIM4v5jtsswgd; - + T10 = pParam->BSIM4v5weffCJ * here->BSIM4v5nf; + here->BSIM4v5SjctTempRevSatCur = T1 * here->BSIM4v5Aseff * model->BSIM4v5jtss; + here->BSIM4v5DjctTempRevSatCur = T2 * here->BSIM4v5Adeff * model->BSIM4v5jtsd; + here->BSIM4v5SswTempRevSatCur = T3 * here->BSIM4v5Pseff * model->BSIM4v5jtssws; + here->BSIM4v5DswTempRevSatCur = T4 * here->BSIM4v5Pdeff * model->BSIM4v5jtsswd; + here->BSIM4v5SswgTempRevSatCur = T5 * T10 * model->BSIM4v5jtsswgs; + here->BSIM4v5DswgTempRevSatCur = T6 * T10 * model->BSIM4v5jtsswgd; + if (BSIM4v5checkModel(model, here, ckt)) { diff --git a/src/spicelib/devices/bsim4v6/b4v6temp.c b/src/spicelib/devices/bsim4v6/b4v6temp.c index daa46ef52..cae564750 100644 --- a/src/spicelib/devices/bsim4v6/b4v6temp.c +++ b/src/spicelib/devices/bsim4v6/b4v6temp.c @@ -7,7 +7,7 @@ * Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu. * Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu * Authors: 2007- Mohan Dunga, Wenwei Yang, Ali Niknejad, Chenming Hu - * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu + * Authors: 2008- Wenwei Yang, Ali Niknejad, Chenming Hu * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 04/06/2001. * Modified by Xuemei Xi, 10/05/2001. @@ -30,7 +30,7 @@ #include "ngspice/suffix.h" #define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 +#define KboQ 8.617087e-5 #define EPS0 8.85418e-12 #define EPSSI 1.03594e-10 #define PI 3.141592654 @@ -92,20 +92,20 @@ int Size_Not_Found, i; /* loop through all the BSIM4v6 device models */ for (; model != NULL; model = BSIM4v6nextModel(model)) { Temp = ckt->CKTtemp; - if (model->BSIM4v6SbulkJctPotential < 0.1) - { model->BSIM4v6SbulkJctPotential = 0.1; - fprintf(stderr, "Given pbs is less than 0.1. Pbs is set to 0.1.\n"); - } + if (model->BSIM4v6SbulkJctPotential < 0.1) + { model->BSIM4v6SbulkJctPotential = 0.1; + fprintf(stderr, "Given pbs is less than 0.1. Pbs is set to 0.1.\n"); + } if (model->BSIM4v6SsidewallJctPotential < 0.1) - { model->BSIM4v6SsidewallJctPotential = 0.1; - fprintf(stderr, "Given pbsws is less than 0.1. Pbsws is set to 0.1.\n"); - } + { model->BSIM4v6SsidewallJctPotential = 0.1; + fprintf(stderr, "Given pbsws is less than 0.1. Pbsws is set to 0.1.\n"); + } if (model->BSIM4v6SGatesidewallJctPotential < 0.1) - { model->BSIM4v6SGatesidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswgs is less than 0.1. Pbswgs is set to 0.1.\n"); - } + { model->BSIM4v6SGatesidewallJctPotential = 0.1; + fprintf(stderr, "Given pbswgs is less than 0.1. Pbswgs is set to 0.1.\n"); + } - if (model->BSIM4v6DbulkJctPotential < 0.1) + if (model->BSIM4v6DbulkJctPotential < 0.1) { model->BSIM4v6DbulkJctPotential = 0.1; fprintf(stderr, "Given pbd is less than 0.1. Pbd is set to 0.1.\n"); } @@ -118,36 +118,36 @@ int Size_Not_Found, i; fprintf(stderr, "Given pbswgd is less than 0.1. Pbswgd is set to 0.1.\n"); } - if(model->BSIM4v6mtrlMod == 0) - { - if ((model->BSIM4v6toxeGiven) && (model->BSIM4v6toxpGiven) && (model->BSIM4v6dtoxGiven) - && (model->BSIM4v6toxe != (model->BSIM4v6toxp + model->BSIM4v6dtox))) - printf("Warning: toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored.\n"); - else if ((model->BSIM4v6toxeGiven) && (!model->BSIM4v6toxpGiven)) - model->BSIM4v6toxp = model->BSIM4v6toxe - model->BSIM4v6dtox; - else if ((!model->BSIM4v6toxeGiven) && (model->BSIM4v6toxpGiven)) - model->BSIM4v6toxe = model->BSIM4v6toxp + model->BSIM4v6dtox; - } + if(model->BSIM4v6mtrlMod == 0) + { + if ((model->BSIM4v6toxeGiven) && (model->BSIM4v6toxpGiven) && (model->BSIM4v6dtoxGiven) + && (model->BSIM4v6toxe != (model->BSIM4v6toxp + model->BSIM4v6dtox))) + printf("Warning: toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored.\n"); + else if ((model->BSIM4v6toxeGiven) && (!model->BSIM4v6toxpGiven)) + model->BSIM4v6toxp = model->BSIM4v6toxe - model->BSIM4v6dtox; + else if ((!model->BSIM4v6toxeGiven) && (model->BSIM4v6toxpGiven)) + model->BSIM4v6toxe = model->BSIM4v6toxp + model->BSIM4v6dtox; + } + + if(model->BSIM4v6mtrlMod) + { + epsrox = 3.9; + toxe = model->BSIM4v6eot; + epssub = EPS0 * model->BSIM4v6epsrsub; + } + else + { + epsrox = model->BSIM4v6epsrox; + toxe = model->BSIM4v6toxe; + epssub = EPSSI; + } - if(model->BSIM4v6mtrlMod) - { - epsrox = 3.9; - toxe = model->BSIM4v6eot; - epssub = EPS0 * model->BSIM4v6epsrsub; - } - else - { - epsrox = model->BSIM4v6epsrox; - toxe = model->BSIM4v6toxe; - epssub = EPSSI; - } - model->BSIM4v6coxe = epsrox * EPS0 / toxe; - if(model->BSIM4v6mtrlMod == 0) - model->BSIM4v6coxp = model->BSIM4v6epsrox * EPS0 / model->BSIM4v6toxp; + if(model->BSIM4v6mtrlMod == 0) + model->BSIM4v6coxp = model->BSIM4v6epsrox * EPS0 / model->BSIM4v6toxp; - if (!model->BSIM4v6cgdoGiven) + if (!model->BSIM4v6cgdoGiven) { if (model->BSIM4v6dlcGiven && (model->BSIM4v6dlc > 0.0)) model->BSIM4v6cgdo = model->BSIM4v6dlc * model->BSIM4v6coxe - model->BSIM4v6cgdl ; @@ -173,50 +173,50 @@ int Size_Not_Found, i; model->pSizeDependParamKnot = NULL; pLastKnot = NULL; - Tnom = model->BSIM4v6tnom; - TRatio = Temp / Tnom; + Tnom = model->BSIM4v6tnom; + TRatio = Temp / Tnom; - model->BSIM4v6vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); + model->BSIM4v6vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); model->BSIM4v6factor1 = sqrt(epssub / (epsrox * EPS0)* toxe); Vtm0 = model->BSIM4v6vtm0 = KboQ * Tnom; - - if(model->BSIM4v6mtrlMod==0) - { - Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) - * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); - } - else - { - Eg0 = model->BSIM4v6bg0sub - model->BSIM4v6tbgasub * Tnom * Tnom - / (Tnom + model->BSIM4v6tbgbsub); - T0 = model->BSIM4v6bg0sub - model->BSIM4v6tbgasub * 90090.0225 - / (300.15 + model->BSIM4v6tbgbsub); - ni = model->BSIM4v6ni0sub * (Tnom / 300.15) * sqrt(Tnom / 300.15) - * exp((T0 - Eg0) / (2.0 * Vtm0)); - } - model->BSIM4v6Eg0 = Eg0; + if(model->BSIM4v6mtrlMod==0) + { + Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); + ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) + * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); + } + else + { + Eg0 = model->BSIM4v6bg0sub - model->BSIM4v6tbgasub * Tnom * Tnom + / (Tnom + model->BSIM4v6tbgbsub); + T0 = model->BSIM4v6bg0sub - model->BSIM4v6tbgasub * 90090.0225 + / (300.15 + model->BSIM4v6tbgbsub); + ni = model->BSIM4v6ni0sub * (Tnom / 300.15) * sqrt(Tnom / 300.15) + * exp((T0 - Eg0) / (2.0 * Vtm0)); + } + + model->BSIM4v6Eg0 = Eg0; model->BSIM4v6vtm = KboQ * Temp; - if(model->BSIM4v6mtrlMod == 0) - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - else - Eg = model->BSIM4v6bg0sub - model->BSIM4v6tbgasub * Temp * Temp + if(model->BSIM4v6mtrlMod == 0) + Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); + else + Eg = model->BSIM4v6bg0sub - model->BSIM4v6tbgasub * Temp * Temp / (Temp + model->BSIM4v6tbgbsub); - if (Temp != Tnom) - { T0 = Eg0 / Vtm0 - Eg / model->BSIM4v6vtm; - T1 = log(Temp / Tnom); - T2 = T0 + model->BSIM4v6SjctTempExponent * T1; - T3 = exp(T2 / model->BSIM4v6SjctEmissionCoeff); - model->BSIM4v6SjctTempSatCurDensity = model->BSIM4v6SjctSatCurDensity - * T3; - model->BSIM4v6SjctSidewallTempSatCurDensity - = model->BSIM4v6SjctSidewallSatCurDensity * T3; + if (Temp != Tnom) + { T0 = Eg0 / Vtm0 - Eg / model->BSIM4v6vtm; + T1 = log(Temp / Tnom); + T2 = T0 + model->BSIM4v6SjctTempExponent * T1; + T3 = exp(T2 / model->BSIM4v6SjctEmissionCoeff); + model->BSIM4v6SjctTempSatCurDensity = model->BSIM4v6SjctSatCurDensity + * T3; + model->BSIM4v6SjctSidewallTempSatCurDensity + = model->BSIM4v6SjctSidewallSatCurDensity * T3; model->BSIM4v6SjctGateSidewallTempSatCurDensity = model->BSIM4v6SjctGateSidewallSatCurDensity * T3; - T2 = T0 + model->BSIM4v6DjctTempExponent * T1; + T2 = T0 + model->BSIM4v6DjctTempExponent * T1; T3 = exp(T2 / model->BSIM4v6DjctEmissionCoeff); model->BSIM4v6DjctTempSatCurDensity = model->BSIM4v6DjctSatCurDensity * T3; @@ -224,11 +224,11 @@ int Size_Not_Found, i; = model->BSIM4v6DjctSidewallSatCurDensity * T3; model->BSIM4v6DjctGateSidewallTempSatCurDensity = model->BSIM4v6DjctGateSidewallSatCurDensity * T3; - } - else - { model->BSIM4v6SjctTempSatCurDensity = model->BSIM4v6SjctSatCurDensity; - model->BSIM4v6SjctSidewallTempSatCurDensity - = model->BSIM4v6SjctSidewallSatCurDensity; + } + else + { model->BSIM4v6SjctTempSatCurDensity = model->BSIM4v6SjctSatCurDensity; + model->BSIM4v6SjctSidewallTempSatCurDensity + = model->BSIM4v6SjctSidewallSatCurDensity; model->BSIM4v6SjctGateSidewallTempSatCurDensity = model->BSIM4v6SjctGateSidewallSatCurDensity; model->BSIM4v6DjctTempSatCurDensity = model->BSIM4v6DjctSatCurDensity; @@ -236,12 +236,12 @@ int Size_Not_Found, i; = model->BSIM4v6DjctSidewallSatCurDensity; model->BSIM4v6DjctGateSidewallTempSatCurDensity = model->BSIM4v6DjctGateSidewallSatCurDensity; - } + } - if (model->BSIM4v6SjctTempSatCurDensity < 0.0) - model->BSIM4v6SjctTempSatCurDensity = 0.0; - if (model->BSIM4v6SjctSidewallTempSatCurDensity < 0.0) - model->BSIM4v6SjctSidewallTempSatCurDensity = 0.0; + if (model->BSIM4v6SjctTempSatCurDensity < 0.0) + model->BSIM4v6SjctTempSatCurDensity = 0.0; + if (model->BSIM4v6SjctSidewallTempSatCurDensity < 0.0) + model->BSIM4v6SjctSidewallTempSatCurDensity = 0.0; if (model->BSIM4v6SjctGateSidewallTempSatCurDensity < 0.0) model->BSIM4v6SjctGateSidewallTempSatCurDensity = 0.0; if (model->BSIM4v6DjctTempSatCurDensity < 0.0) @@ -251,66 +251,66 @@ int Size_Not_Found, i; if (model->BSIM4v6DjctGateSidewallTempSatCurDensity < 0.0) model->BSIM4v6DjctGateSidewallTempSatCurDensity = 0.0; - /* Temperature dependence of D/B and S/B diode capacitance begins */ - delTemp = ckt->CKTtemp - model->BSIM4v6tnom; - T0 = model->BSIM4v6tcj * delTemp; - if (T0 >= -1.0) - { model->BSIM4v6SunitAreaTempJctCap = model->BSIM4v6SunitAreaJctCap *(1.0 + T0); /*bug_fix -JX */ + /* Temperature dependence of D/B and S/B diode capacitance begins */ + delTemp = ckt->CKTtemp - model->BSIM4v6tnom; + T0 = model->BSIM4v6tcj * delTemp; + if (T0 >= -1.0) + { model->BSIM4v6SunitAreaTempJctCap = model->BSIM4v6SunitAreaJctCap *(1.0 + T0); /*bug_fix -JX */ model->BSIM4v6DunitAreaTempJctCap = model->BSIM4v6DunitAreaJctCap *(1.0 + T0); - } - else - { if (model->BSIM4v6SunitAreaJctCap > 0.0) - { model->BSIM4v6SunitAreaTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjs to be negative. Cjs is clamped to zero.\n"); + } + else + { if (model->BSIM4v6SunitAreaJctCap > 0.0) + { model->BSIM4v6SunitAreaTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cjs to be negative. Cjs is clamped to zero.\n"); } - if (model->BSIM4v6DunitAreaJctCap > 0.0) + if (model->BSIM4v6DunitAreaJctCap > 0.0) { model->BSIM4v6DunitAreaTempJctCap = 0.0; fprintf(stderr, "Temperature effect has caused cjd to be negative. Cjd is clamped to zero.\n"); } - } + } T0 = model->BSIM4v6tcjsw * delTemp; - if (model->BSIM4v6SunitLengthSidewallJctCap < 0.0)/*4.6.2*/ - {model->BSIM4v6SunitLengthSidewallJctCap = 0.0; - fprintf(stderr, "CJSWS is negative. Cjsws is clamped to zero.\n");} - if (model->BSIM4v6DunitLengthSidewallJctCap < 0.0) - {model->BSIM4v6DunitLengthSidewallJctCap = 0.0; - fprintf(stderr, "CJSWD is negative. Cjswd is clamped to zero.\n");} - if (T0 >= -1.0) - { model->BSIM4v6SunitLengthSidewallTempJctCap = model->BSIM4v6SunitLengthSidewallJctCap *(1.0 + T0); + if (model->BSIM4v6SunitLengthSidewallJctCap < 0.0)/*4.6.2*/ + {model->BSIM4v6SunitLengthSidewallJctCap = 0.0; + fprintf(stderr, "CJSWS is negative. Cjsws is clamped to zero.\n");} + if (model->BSIM4v6DunitLengthSidewallJctCap < 0.0) + {model->BSIM4v6DunitLengthSidewallJctCap = 0.0; + fprintf(stderr, "CJSWD is negative. Cjswd is clamped to zero.\n");} + if (T0 >= -1.0) + { model->BSIM4v6SunitLengthSidewallTempJctCap = model->BSIM4v6SunitLengthSidewallJctCap *(1.0 + T0); model->BSIM4v6DunitLengthSidewallTempJctCap = model->BSIM4v6DunitLengthSidewallJctCap *(1.0 + T0); - } - else - { if (model->BSIM4v6SunitLengthSidewallJctCap > 0.0) - { model->BSIM4v6SunitLengthSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjsws to be negative. Cjsws is clamped to zero.\n"); - } - if (model->BSIM4v6DunitLengthSidewallJctCap > 0.0) + } + else + { if (model->BSIM4v6SunitLengthSidewallJctCap > 0.0) + { model->BSIM4v6SunitLengthSidewallTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cjsws to be negative. Cjsws is clamped to zero.\n"); + } + if (model->BSIM4v6DunitLengthSidewallJctCap > 0.0) { model->BSIM4v6DunitLengthSidewallTempJctCap = 0.0; fprintf(stderr, "Temperature effect has caused cjswd to be negative. Cjswd is clamped to zero.\n"); - } - } + } + } T0 = model->BSIM4v6tcjswg * delTemp; - if (T0 >= -1.0) - { model->BSIM4v6SunitLengthGateSidewallTempJctCap = model->BSIM4v6SunitLengthGateSidewallJctCap *(1.0 + T0); + if (T0 >= -1.0) + { model->BSIM4v6SunitLengthGateSidewallTempJctCap = model->BSIM4v6SunitLengthGateSidewallJctCap *(1.0 + T0); model->BSIM4v6DunitLengthGateSidewallTempJctCap = model->BSIM4v6DunitLengthGateSidewallJctCap *(1.0 + T0); - } - else - { if (model->BSIM4v6SunitLengthGateSidewallJctCap > 0.0) - { model->BSIM4v6SunitLengthGateSidewallTempJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswgs to be negative. Cjswgs is clamped to zero.\n"); - } - if (model->BSIM4v6DunitLengthGateSidewallJctCap > 0.0) + } + else + { if (model->BSIM4v6SunitLengthGateSidewallJctCap > 0.0) + { model->BSIM4v6SunitLengthGateSidewallTempJctCap = 0.0; + fprintf(stderr, "Temperature effect has caused cjswgs to be negative. Cjswgs is clamped to zero.\n"); + } + if (model->BSIM4v6DunitLengthGateSidewallJctCap > 0.0) { model->BSIM4v6DunitLengthGateSidewallTempJctCap = 0.0; fprintf(stderr, "Temperature effect has caused cjswgd to be negative. Cjswgd is clamped to zero.\n"); } - } + } model->BSIM4v6PhiBS = model->BSIM4v6SbulkJctPotential - - model->BSIM4v6tpb * delTemp; + - model->BSIM4v6tpb * delTemp; if (model->BSIM4v6PhiBS < 0.01) - { model->BSIM4v6PhiBS = 0.01; - fprintf(stderr, "Temperature effect has caused pbs to be less than 0.01. Pbs is clamped to 0.01.\n"); - } + { model->BSIM4v6PhiBS = 0.01; + fprintf(stderr, "Temperature effect has caused pbs to be less than 0.01. Pbs is clamped to 0.01.\n"); + } model->BSIM4v6PhiBD = model->BSIM4v6DbulkJctPotential - model->BSIM4v6tpb * delTemp; if (model->BSIM4v6PhiBD < 0.01) @@ -321,9 +321,9 @@ int Size_Not_Found, i; model->BSIM4v6PhiBSWS = model->BSIM4v6SsidewallJctPotential - model->BSIM4v6tpbsw * delTemp; if (model->BSIM4v6PhiBSWS <= 0.01) - { model->BSIM4v6PhiBSWS = 0.01; - fprintf(stderr, "Temperature effect has caused pbsws to be less than 0.01. Pbsws is clamped to 0.01.\n"); - } + { model->BSIM4v6PhiBSWS = 0.01; + fprintf(stderr, "Temperature effect has caused pbsws to be less than 0.01. Pbsws is clamped to 0.01.\n"); + } model->BSIM4v6PhiBSWD = model->BSIM4v6DsidewallJctPotential - model->BSIM4v6tpbsw * delTemp; if (model->BSIM4v6PhiBSWD <= 0.01) @@ -331,12 +331,12 @@ int Size_Not_Found, i; fprintf(stderr, "Temperature effect has caused pbswd to be less than 0.01. Pbswd is clamped to 0.01.\n"); } - model->BSIM4v6PhiBSWGS = model->BSIM4v6SGatesidewallJctPotential + model->BSIM4v6PhiBSWGS = model->BSIM4v6SGatesidewallJctPotential - model->BSIM4v6tpbswg * delTemp; if (model->BSIM4v6PhiBSWGS <= 0.01) - { model->BSIM4v6PhiBSWGS = 0.01; - fprintf(stderr, "Temperature effect has caused pbswgs to be less than 0.01. Pbswgs is clamped to 0.01.\n"); - } + { model->BSIM4v6PhiBSWGS = 0.01; + fprintf(stderr, "Temperature effect has caused pbswgs to be less than 0.01. Pbswgs is clamped to 0.01.\n"); + } model->BSIM4v6PhiBSWGD = model->BSIM4v6DGatesidewallJctPotential - model->BSIM4v6tpbswg * delTemp; if (model->BSIM4v6PhiBSWGD <= 0.01) @@ -353,7 +353,7 @@ int Size_Not_Found, i; { model->BSIM4v6ijthsfwd = 0.0; fprintf(stderr, "Ijthsfwd reset to %g.\n", model->BSIM4v6ijthsfwd); } - if (model->BSIM4v6ijthdrev <= 0.0) + if (model->BSIM4v6ijthdrev <= 0.0) { model->BSIM4v6ijthdrev = 0.0; fprintf(stderr, "Ijthdrev reset to %g.\n", model->BSIM4v6ijthdrev); } @@ -393,40 +393,40 @@ int Size_Not_Found, i; /* loop through all the instances of the model */ for (here = BSIM4v6instances(model); here != NULL; - here = BSIM4v6nextInstance(here)) - { - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->BSIM4v6l == pSizeDependParamKnot->Length) - && (here->BSIM4v6w == pSizeDependParamKnot->Width) - && (here->BSIM4v6nf == pSizeDependParamKnot->NFinger)) + here = BSIM4v6nextInstance(here)) + { + pSizeDependParamKnot = model->pSizeDependParamKnot; + Size_Not_Found = 1; + while ((pSizeDependParamKnot != NULL) && Size_Not_Found) + { if ((here->BSIM4v6l == pSizeDependParamKnot->Length) + && (here->BSIM4v6w == pSizeDependParamKnot->Width) + && (here->BSIM4v6nf == pSizeDependParamKnot->NFinger)) { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - pParam = here->pParam; /*bug-fix */ - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } + here->pParam = pSizeDependParamKnot; + pParam = here->pParam; /*bug-fix */ + } + else + { pLastKnot = pSizeDependParamKnot; + pSizeDependParamKnot = pSizeDependParamKnot->pNext; + } } - /* stress effect */ - Ldrn = here->BSIM4v6l; - Wdrn = here->BSIM4v6w / here->BSIM4v6nf; + /* stress effect */ + Ldrn = here->BSIM4v6l; + Wdrn = here->BSIM4v6w / here->BSIM4v6nf; - if (Size_Not_Found) - { pParam = TMALLOC(struct bsim4v6SizeDependParam, 1); + if (Size_Not_Found) + { pParam = TMALLOC(struct bsim4v6SizeDependParam, 1); if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; + model->pSizeDependParamKnot = pParam; else - pLastKnot->pNext = pParam; + pLastKnot->pNext = pParam; pParam->pNext = NULL; here->pParam = pParam; pParam->Length = here->BSIM4v6l; pParam->Width = here->BSIM4v6w; - pParam->NFinger = here->BSIM4v6nf; + pParam->NFinger = here->BSIM4v6nf; Lnew = here->BSIM4v6l + model->BSIM4v6xl ; Wnew = here->BSIM4v6w / here->BSIM4v6nf + model->BSIM4v6xw; @@ -445,13 +445,13 @@ int Size_Not_Found, i; + model->BSIM4v6Wwl / (T2 * T3); pParam->BSIM4v6dw = model->BSIM4v6Wint + tmp1; tmp2 = model->BSIM4v6Wlc / T2 + model->BSIM4v6Wwc / T3 - + model->BSIM4v6Wwlc / (T2 * T3); + + model->BSIM4v6Wwlc / (T2 * T3); pParam->BSIM4v6dwc = model->BSIM4v6dwc + tmp2; pParam->BSIM4v6dwj = model->BSIM4v6dwj + tmp2; pParam->BSIM4v6leff = Lnew - 2.0 * pParam->BSIM4v6dl; if (pParam->BSIM4v6leff <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "BSIM4v6: mosfet %s, model %s: Effective channel length <= 0", model->BSIM4v6modName, here->BSIM4v6name); @@ -460,7 +460,7 @@ int Size_Not_Found, i; pParam->BSIM4v6weff = Wnew - 2.0 * pParam->BSIM4v6dw; if (pParam->BSIM4v6weff <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "BSIM4v6: mosfet %s, model %s: Effective channel width <= 0", model->BSIM4v6modName, here->BSIM4v6name); @@ -469,7 +469,7 @@ int Size_Not_Found, i; pParam->BSIM4v6leffCV = Lnew - 2.0 * pParam->BSIM4v6dlc; if (pParam->BSIM4v6leffCV <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "BSIM4v6: mosfet %s, model %s: Effective channel length for C-V <= 0", model->BSIM4v6modName, here->BSIM4v6name); @@ -478,7 +478,7 @@ int Size_Not_Found, i; pParam->BSIM4v6weffCV = Wnew - 2.0 * pParam->BSIM4v6dwc; if (pParam->BSIM4v6weffCV <= 0.0) - { + { SPfrontEnd->IFerrorf (ERR_FATAL, "BSIM4v6: mosfet %s, model %s: Effective channel width for C-V <= 0", model->BSIM4v6modName, here->BSIM4v6name); @@ -495,82 +495,82 @@ int Size_Not_Found, i; } - if (model->BSIM4v6binUnit == 1) - { Inv_L = 1.0e-6 / pParam->BSIM4v6leff; - Inv_W = 1.0e-6 / pParam->BSIM4v6weff; - Inv_LW = 1.0e-12 / (pParam->BSIM4v6leff - * pParam->BSIM4v6weff); - } - else - { Inv_L = 1.0 / pParam->BSIM4v6leff; - Inv_W = 1.0 / pParam->BSIM4v6weff; - Inv_LW = 1.0 / (pParam->BSIM4v6leff - * pParam->BSIM4v6weff); - } - pParam->BSIM4v6cdsc = model->BSIM4v6cdsc - + model->BSIM4v6lcdsc * Inv_L - + model->BSIM4v6wcdsc * Inv_W - + model->BSIM4v6pcdsc * Inv_LW; - pParam->BSIM4v6cdscb = model->BSIM4v6cdscb - + model->BSIM4v6lcdscb * Inv_L - + model->BSIM4v6wcdscb * Inv_W - + model->BSIM4v6pcdscb * Inv_LW; - - pParam->BSIM4v6cdscd = model->BSIM4v6cdscd - + model->BSIM4v6lcdscd * Inv_L - + model->BSIM4v6wcdscd * Inv_W - + model->BSIM4v6pcdscd * Inv_LW; - - pParam->BSIM4v6cit = model->BSIM4v6cit - + model->BSIM4v6lcit * Inv_L - + model->BSIM4v6wcit * Inv_W - + model->BSIM4v6pcit * Inv_LW; - pParam->BSIM4v6nfactor = model->BSIM4v6nfactor - + model->BSIM4v6lnfactor * Inv_L - + model->BSIM4v6wnfactor * Inv_W - + model->BSIM4v6pnfactor * Inv_LW; - pParam->BSIM4v6xj = model->BSIM4v6xj - + model->BSIM4v6lxj * Inv_L - + model->BSIM4v6wxj * Inv_W - + model->BSIM4v6pxj * Inv_LW; - pParam->BSIM4v6vsat = model->BSIM4v6vsat - + model->BSIM4v6lvsat * Inv_L - + model->BSIM4v6wvsat * Inv_W - + model->BSIM4v6pvsat * Inv_LW; - pParam->BSIM4v6at = model->BSIM4v6at - + model->BSIM4v6lat * Inv_L - + model->BSIM4v6wat * Inv_W - + model->BSIM4v6pat * Inv_LW; - pParam->BSIM4v6a0 = model->BSIM4v6a0 - + model->BSIM4v6la0 * Inv_L - + model->BSIM4v6wa0 * Inv_W - + model->BSIM4v6pa0 * Inv_LW; - - pParam->BSIM4v6ags = model->BSIM4v6ags - + model->BSIM4v6lags * Inv_L - + model->BSIM4v6wags * Inv_W - + model->BSIM4v6pags * Inv_LW; - - pParam->BSIM4v6a1 = model->BSIM4v6a1 - + model->BSIM4v6la1 * Inv_L - + model->BSIM4v6wa1 * Inv_W - + model->BSIM4v6pa1 * Inv_LW; - pParam->BSIM4v6a2 = model->BSIM4v6a2 - + model->BSIM4v6la2 * Inv_L - + model->BSIM4v6wa2 * Inv_W - + model->BSIM4v6pa2 * Inv_LW; - pParam->BSIM4v6keta = model->BSIM4v6keta - + model->BSIM4v6lketa * Inv_L - + model->BSIM4v6wketa * Inv_W - + model->BSIM4v6pketa * Inv_LW; - pParam->BSIM4v6nsub = model->BSIM4v6nsub - + model->BSIM4v6lnsub * Inv_L - + model->BSIM4v6wnsub * Inv_W - + model->BSIM4v6pnsub * Inv_LW; - pParam->BSIM4v6ndep = model->BSIM4v6ndep - + model->BSIM4v6lndep * Inv_L - + model->BSIM4v6wndep * Inv_W - + model->BSIM4v6pndep * Inv_LW; + if (model->BSIM4v6binUnit == 1) + { Inv_L = 1.0e-6 / pParam->BSIM4v6leff; + Inv_W = 1.0e-6 / pParam->BSIM4v6weff; + Inv_LW = 1.0e-12 / (pParam->BSIM4v6leff + * pParam->BSIM4v6weff); + } + else + { Inv_L = 1.0 / pParam->BSIM4v6leff; + Inv_W = 1.0 / pParam->BSIM4v6weff; + Inv_LW = 1.0 / (pParam->BSIM4v6leff + * pParam->BSIM4v6weff); + } + pParam->BSIM4v6cdsc = model->BSIM4v6cdsc + + model->BSIM4v6lcdsc * Inv_L + + model->BSIM4v6wcdsc * Inv_W + + model->BSIM4v6pcdsc * Inv_LW; + pParam->BSIM4v6cdscb = model->BSIM4v6cdscb + + model->BSIM4v6lcdscb * Inv_L + + model->BSIM4v6wcdscb * Inv_W + + model->BSIM4v6pcdscb * Inv_LW; + + pParam->BSIM4v6cdscd = model->BSIM4v6cdscd + + model->BSIM4v6lcdscd * Inv_L + + model->BSIM4v6wcdscd * Inv_W + + model->BSIM4v6pcdscd * Inv_LW; + + pParam->BSIM4v6cit = model->BSIM4v6cit + + model->BSIM4v6lcit * Inv_L + + model->BSIM4v6wcit * Inv_W + + model->BSIM4v6pcit * Inv_LW; + pParam->BSIM4v6nfactor = model->BSIM4v6nfactor + + model->BSIM4v6lnfactor * Inv_L + + model->BSIM4v6wnfactor * Inv_W + + model->BSIM4v6pnfactor * Inv_LW; + pParam->BSIM4v6xj = model->BSIM4v6xj + + model->BSIM4v6lxj * Inv_L + + model->BSIM4v6wxj * Inv_W + + model->BSIM4v6pxj * Inv_LW; + pParam->BSIM4v6vsat = model->BSIM4v6vsat + + model->BSIM4v6lvsat * Inv_L + + model->BSIM4v6wvsat * Inv_W + + model->BSIM4v6pvsat * Inv_LW; + pParam->BSIM4v6at = model->BSIM4v6at + + model->BSIM4v6lat * Inv_L + + model->BSIM4v6wat * Inv_W + + model->BSIM4v6pat * Inv_LW; + pParam->BSIM4v6a0 = model->BSIM4v6a0 + + model->BSIM4v6la0 * Inv_L + + model->BSIM4v6wa0 * Inv_W + + model->BSIM4v6pa0 * Inv_LW; + + pParam->BSIM4v6ags = model->BSIM4v6ags + + model->BSIM4v6lags * Inv_L + + model->BSIM4v6wags * Inv_W + + model->BSIM4v6pags * Inv_LW; + + pParam->BSIM4v6a1 = model->BSIM4v6a1 + + model->BSIM4v6la1 * Inv_L + + model->BSIM4v6wa1 * Inv_W + + model->BSIM4v6pa1 * Inv_LW; + pParam->BSIM4v6a2 = model->BSIM4v6a2 + + model->BSIM4v6la2 * Inv_L + + model->BSIM4v6wa2 * Inv_W + + model->BSIM4v6pa2 * Inv_LW; + pParam->BSIM4v6keta = model->BSIM4v6keta + + model->BSIM4v6lketa * Inv_L + + model->BSIM4v6wketa * Inv_W + + model->BSIM4v6pketa * Inv_LW; + pParam->BSIM4v6nsub = model->BSIM4v6nsub + + model->BSIM4v6lnsub * Inv_L + + model->BSIM4v6wnsub * Inv_W + + model->BSIM4v6pnsub * Inv_LW; + pParam->BSIM4v6ndep = model->BSIM4v6ndep + + model->BSIM4v6lndep * Inv_L + + model->BSIM4v6wndep * Inv_W + + model->BSIM4v6pndep * Inv_LW; pParam->BSIM4v6nsd = model->BSIM4v6nsd + model->BSIM4v6lnsd * Inv_L + model->BSIM4v6wnsd * Inv_W @@ -579,70 +579,70 @@ int Size_Not_Found, i; + model->BSIM4v6lphin * Inv_L + model->BSIM4v6wphin * Inv_W + model->BSIM4v6pphin * Inv_LW; - pParam->BSIM4v6ngate = model->BSIM4v6ngate - + model->BSIM4v6lngate * Inv_L - + model->BSIM4v6wngate * Inv_W - + model->BSIM4v6pngate * Inv_LW; - pParam->BSIM4v6gamma1 = model->BSIM4v6gamma1 - + model->BSIM4v6lgamma1 * Inv_L - + model->BSIM4v6wgamma1 * Inv_W - + model->BSIM4v6pgamma1 * Inv_LW; - pParam->BSIM4v6gamma2 = model->BSIM4v6gamma2 - + model->BSIM4v6lgamma2 * Inv_L - + model->BSIM4v6wgamma2 * Inv_W - + model->BSIM4v6pgamma2 * Inv_LW; - pParam->BSIM4v6vbx = model->BSIM4v6vbx - + model->BSIM4v6lvbx * Inv_L - + model->BSIM4v6wvbx * Inv_W - + model->BSIM4v6pvbx * Inv_LW; - pParam->BSIM4v6vbm = model->BSIM4v6vbm - + model->BSIM4v6lvbm * Inv_L - + model->BSIM4v6wvbm * Inv_W - + model->BSIM4v6pvbm * Inv_LW; - pParam->BSIM4v6xt = model->BSIM4v6xt - + model->BSIM4v6lxt * Inv_L - + model->BSIM4v6wxt * Inv_W - + model->BSIM4v6pxt * Inv_LW; + pParam->BSIM4v6ngate = model->BSIM4v6ngate + + model->BSIM4v6lngate * Inv_L + + model->BSIM4v6wngate * Inv_W + + model->BSIM4v6pngate * Inv_LW; + pParam->BSIM4v6gamma1 = model->BSIM4v6gamma1 + + model->BSIM4v6lgamma1 * Inv_L + + model->BSIM4v6wgamma1 * Inv_W + + model->BSIM4v6pgamma1 * Inv_LW; + pParam->BSIM4v6gamma2 = model->BSIM4v6gamma2 + + model->BSIM4v6lgamma2 * Inv_L + + model->BSIM4v6wgamma2 * Inv_W + + model->BSIM4v6pgamma2 * Inv_LW; + pParam->BSIM4v6vbx = model->BSIM4v6vbx + + model->BSIM4v6lvbx * Inv_L + + model->BSIM4v6wvbx * Inv_W + + model->BSIM4v6pvbx * Inv_LW; + pParam->BSIM4v6vbm = model->BSIM4v6vbm + + model->BSIM4v6lvbm * Inv_L + + model->BSIM4v6wvbm * Inv_W + + model->BSIM4v6pvbm * Inv_LW; + pParam->BSIM4v6xt = model->BSIM4v6xt + + model->BSIM4v6lxt * Inv_L + + model->BSIM4v6wxt * Inv_W + + model->BSIM4v6pxt * Inv_LW; pParam->BSIM4v6vfb = model->BSIM4v6vfb + model->BSIM4v6lvfb * Inv_L + model->BSIM4v6wvfb * Inv_W + model->BSIM4v6pvfb * Inv_LW; - pParam->BSIM4v6k1 = model->BSIM4v6k1 - + model->BSIM4v6lk1 * Inv_L - + model->BSIM4v6wk1 * Inv_W - + model->BSIM4v6pk1 * Inv_LW; - pParam->BSIM4v6kt1 = model->BSIM4v6kt1 - + model->BSIM4v6lkt1 * Inv_L - + model->BSIM4v6wkt1 * Inv_W - + model->BSIM4v6pkt1 * Inv_LW; - pParam->BSIM4v6kt1l = model->BSIM4v6kt1l - + model->BSIM4v6lkt1l * Inv_L - + model->BSIM4v6wkt1l * Inv_W - + model->BSIM4v6pkt1l * Inv_LW; - pParam->BSIM4v6k2 = model->BSIM4v6k2 - + model->BSIM4v6lk2 * Inv_L - + model->BSIM4v6wk2 * Inv_W - + model->BSIM4v6pk2 * Inv_LW; - pParam->BSIM4v6kt2 = model->BSIM4v6kt2 - + model->BSIM4v6lkt2 * Inv_L - + model->BSIM4v6wkt2 * Inv_W - + model->BSIM4v6pkt2 * Inv_LW; - pParam->BSIM4v6k3 = model->BSIM4v6k3 - + model->BSIM4v6lk3 * Inv_L - + model->BSIM4v6wk3 * Inv_W - + model->BSIM4v6pk3 * Inv_LW; - pParam->BSIM4v6k3b = model->BSIM4v6k3b - + model->BSIM4v6lk3b * Inv_L - + model->BSIM4v6wk3b * Inv_W - + model->BSIM4v6pk3b * Inv_LW; - pParam->BSIM4v6w0 = model->BSIM4v6w0 - + model->BSIM4v6lw0 * Inv_L - + model->BSIM4v6ww0 * Inv_W - + model->BSIM4v6pw0 * Inv_LW; - pParam->BSIM4v6lpe0 = model->BSIM4v6lpe0 - + model->BSIM4v6llpe0 * Inv_L - + model->BSIM4v6wlpe0 * Inv_W - + model->BSIM4v6plpe0 * Inv_LW; + pParam->BSIM4v6k1 = model->BSIM4v6k1 + + model->BSIM4v6lk1 * Inv_L + + model->BSIM4v6wk1 * Inv_W + + model->BSIM4v6pk1 * Inv_LW; + pParam->BSIM4v6kt1 = model->BSIM4v6kt1 + + model->BSIM4v6lkt1 * Inv_L + + model->BSIM4v6wkt1 * Inv_W + + model->BSIM4v6pkt1 * Inv_LW; + pParam->BSIM4v6kt1l = model->BSIM4v6kt1l + + model->BSIM4v6lkt1l * Inv_L + + model->BSIM4v6wkt1l * Inv_W + + model->BSIM4v6pkt1l * Inv_LW; + pParam->BSIM4v6k2 = model->BSIM4v6k2 + + model->BSIM4v6lk2 * Inv_L + + model->BSIM4v6wk2 * Inv_W + + model->BSIM4v6pk2 * Inv_LW; + pParam->BSIM4v6kt2 = model->BSIM4v6kt2 + + model->BSIM4v6lkt2 * Inv_L + + model->BSIM4v6wkt2 * Inv_W + + model->BSIM4v6pkt2 * Inv_LW; + pParam->BSIM4v6k3 = model->BSIM4v6k3 + + model->BSIM4v6lk3 * Inv_L + + model->BSIM4v6wk3 * Inv_W + + model->BSIM4v6pk3 * Inv_LW; + pParam->BSIM4v6k3b = model->BSIM4v6k3b + + model->BSIM4v6lk3b * Inv_L + + model->BSIM4v6wk3b * Inv_W + + model->BSIM4v6pk3b * Inv_LW; + pParam->BSIM4v6w0 = model->BSIM4v6w0 + + model->BSIM4v6lw0 * Inv_L + + model->BSIM4v6ww0 * Inv_W + + model->BSIM4v6pw0 * Inv_LW; + pParam->BSIM4v6lpe0 = model->BSIM4v6lpe0 + + model->BSIM4v6llpe0 * Inv_L + + model->BSIM4v6wlpe0 * Inv_W + + model->BSIM4v6plpe0 * Inv_LW; pParam->BSIM4v6lpeb = model->BSIM4v6lpeb + model->BSIM4v6llpeb * Inv_L + model->BSIM4v6wlpeb * Inv_W @@ -655,112 +655,112 @@ int Size_Not_Found, i; + model->BSIM4v6ldvtp1 * Inv_L + model->BSIM4v6wdvtp1 * Inv_W + model->BSIM4v6pdvtp1 * Inv_LW; - pParam->BSIM4v6dvt0 = model->BSIM4v6dvt0 - + model->BSIM4v6ldvt0 * Inv_L - + model->BSIM4v6wdvt0 * Inv_W - + model->BSIM4v6pdvt0 * Inv_LW; - pParam->BSIM4v6dvt1 = model->BSIM4v6dvt1 - + model->BSIM4v6ldvt1 * Inv_L - + model->BSIM4v6wdvt1 * Inv_W - + model->BSIM4v6pdvt1 * Inv_LW; - pParam->BSIM4v6dvt2 = model->BSIM4v6dvt2 - + model->BSIM4v6ldvt2 * Inv_L - + model->BSIM4v6wdvt2 * Inv_W - + model->BSIM4v6pdvt2 * Inv_LW; - pParam->BSIM4v6dvt0w = model->BSIM4v6dvt0w - + model->BSIM4v6ldvt0w * Inv_L - + model->BSIM4v6wdvt0w * Inv_W - + model->BSIM4v6pdvt0w * Inv_LW; - pParam->BSIM4v6dvt1w = model->BSIM4v6dvt1w - + model->BSIM4v6ldvt1w * Inv_L - + model->BSIM4v6wdvt1w * Inv_W - + model->BSIM4v6pdvt1w * Inv_LW; - pParam->BSIM4v6dvt2w = model->BSIM4v6dvt2w - + model->BSIM4v6ldvt2w * Inv_L - + model->BSIM4v6wdvt2w * Inv_W - + model->BSIM4v6pdvt2w * Inv_LW; - pParam->BSIM4v6drout = model->BSIM4v6drout - + model->BSIM4v6ldrout * Inv_L - + model->BSIM4v6wdrout * Inv_W - + model->BSIM4v6pdrout * Inv_LW; - pParam->BSIM4v6dsub = model->BSIM4v6dsub - + model->BSIM4v6ldsub * Inv_L - + model->BSIM4v6wdsub * Inv_W - + model->BSIM4v6pdsub * Inv_LW; - pParam->BSIM4v6vth0 = model->BSIM4v6vth0 - + model->BSIM4v6lvth0 * Inv_L - + model->BSIM4v6wvth0 * Inv_W - + model->BSIM4v6pvth0 * Inv_LW; - pParam->BSIM4v6ua = model->BSIM4v6ua - + model->BSIM4v6lua * Inv_L - + model->BSIM4v6wua * Inv_W - + model->BSIM4v6pua * Inv_LW; - pParam->BSIM4v6ua1 = model->BSIM4v6ua1 - + model->BSIM4v6lua1 * Inv_L - + model->BSIM4v6wua1 * Inv_W - + model->BSIM4v6pua1 * Inv_LW; - pParam->BSIM4v6ub = model->BSIM4v6ub - + model->BSIM4v6lub * Inv_L - + model->BSIM4v6wub * Inv_W - + model->BSIM4v6pub * Inv_LW; - pParam->BSIM4v6ub1 = model->BSIM4v6ub1 - + model->BSIM4v6lub1 * Inv_L - + model->BSIM4v6wub1 * Inv_W - + model->BSIM4v6pub1 * Inv_LW; - pParam->BSIM4v6uc = model->BSIM4v6uc - + model->BSIM4v6luc * Inv_L - + model->BSIM4v6wuc * Inv_W - + model->BSIM4v6puc * Inv_LW; - pParam->BSIM4v6uc1 = model->BSIM4v6uc1 - + model->BSIM4v6luc1 * Inv_L - + model->BSIM4v6wuc1 * Inv_W - + model->BSIM4v6puc1 * Inv_LW; - pParam->BSIM4v6ud = model->BSIM4v6ud - + model->BSIM4v6lud * Inv_L - + model->BSIM4v6wud * Inv_W - + model->BSIM4v6pud * Inv_LW; - pParam->BSIM4v6ud1 = model->BSIM4v6ud1 - + model->BSIM4v6lud1 * Inv_L - + model->BSIM4v6wud1 * Inv_W - + model->BSIM4v6pud1 * Inv_LW; - pParam->BSIM4v6up = model->BSIM4v6up - + model->BSIM4v6lup * Inv_L - + model->BSIM4v6wup * Inv_W - + model->BSIM4v6pup * Inv_LW; - pParam->BSIM4v6lp = model->BSIM4v6lp - + model->BSIM4v6llp * Inv_L - + model->BSIM4v6wlp * Inv_W - + model->BSIM4v6plp * Inv_LW; + pParam->BSIM4v6dvt0 = model->BSIM4v6dvt0 + + model->BSIM4v6ldvt0 * Inv_L + + model->BSIM4v6wdvt0 * Inv_W + + model->BSIM4v6pdvt0 * Inv_LW; + pParam->BSIM4v6dvt1 = model->BSIM4v6dvt1 + + model->BSIM4v6ldvt1 * Inv_L + + model->BSIM4v6wdvt1 * Inv_W + + model->BSIM4v6pdvt1 * Inv_LW; + pParam->BSIM4v6dvt2 = model->BSIM4v6dvt2 + + model->BSIM4v6ldvt2 * Inv_L + + model->BSIM4v6wdvt2 * Inv_W + + model->BSIM4v6pdvt2 * Inv_LW; + pParam->BSIM4v6dvt0w = model->BSIM4v6dvt0w + + model->BSIM4v6ldvt0w * Inv_L + + model->BSIM4v6wdvt0w * Inv_W + + model->BSIM4v6pdvt0w * Inv_LW; + pParam->BSIM4v6dvt1w = model->BSIM4v6dvt1w + + model->BSIM4v6ldvt1w * Inv_L + + model->BSIM4v6wdvt1w * Inv_W + + model->BSIM4v6pdvt1w * Inv_LW; + pParam->BSIM4v6dvt2w = model->BSIM4v6dvt2w + + model->BSIM4v6ldvt2w * Inv_L + + model->BSIM4v6wdvt2w * Inv_W + + model->BSIM4v6pdvt2w * Inv_LW; + pParam->BSIM4v6drout = model->BSIM4v6drout + + model->BSIM4v6ldrout * Inv_L + + model->BSIM4v6wdrout * Inv_W + + model->BSIM4v6pdrout * Inv_LW; + pParam->BSIM4v6dsub = model->BSIM4v6dsub + + model->BSIM4v6ldsub * Inv_L + + model->BSIM4v6wdsub * Inv_W + + model->BSIM4v6pdsub * Inv_LW; + pParam->BSIM4v6vth0 = model->BSIM4v6vth0 + + model->BSIM4v6lvth0 * Inv_L + + model->BSIM4v6wvth0 * Inv_W + + model->BSIM4v6pvth0 * Inv_LW; + pParam->BSIM4v6ua = model->BSIM4v6ua + + model->BSIM4v6lua * Inv_L + + model->BSIM4v6wua * Inv_W + + model->BSIM4v6pua * Inv_LW; + pParam->BSIM4v6ua1 = model->BSIM4v6ua1 + + model->BSIM4v6lua1 * Inv_L + + model->BSIM4v6wua1 * Inv_W + + model->BSIM4v6pua1 * Inv_LW; + pParam->BSIM4v6ub = model->BSIM4v6ub + + model->BSIM4v6lub * Inv_L + + model->BSIM4v6wub * Inv_W + + model->BSIM4v6pub * Inv_LW; + pParam->BSIM4v6ub1 = model->BSIM4v6ub1 + + model->BSIM4v6lub1 * Inv_L + + model->BSIM4v6wub1 * Inv_W + + model->BSIM4v6pub1 * Inv_LW; + pParam->BSIM4v6uc = model->BSIM4v6uc + + model->BSIM4v6luc * Inv_L + + model->BSIM4v6wuc * Inv_W + + model->BSIM4v6puc * Inv_LW; + pParam->BSIM4v6uc1 = model->BSIM4v6uc1 + + model->BSIM4v6luc1 * Inv_L + + model->BSIM4v6wuc1 * Inv_W + + model->BSIM4v6puc1 * Inv_LW; + pParam->BSIM4v6ud = model->BSIM4v6ud + + model->BSIM4v6lud * Inv_L + + model->BSIM4v6wud * Inv_W + + model->BSIM4v6pud * Inv_LW; + pParam->BSIM4v6ud1 = model->BSIM4v6ud1 + + model->BSIM4v6lud1 * Inv_L + + model->BSIM4v6wud1 * Inv_W + + model->BSIM4v6pud1 * Inv_LW; + pParam->BSIM4v6up = model->BSIM4v6up + + model->BSIM4v6lup * Inv_L + + model->BSIM4v6wup * Inv_W + + model->BSIM4v6pup * Inv_LW; + pParam->BSIM4v6lp = model->BSIM4v6lp + + model->BSIM4v6llp * Inv_L + + model->BSIM4v6wlp * Inv_W + + model->BSIM4v6plp * Inv_LW; pParam->BSIM4v6eu = model->BSIM4v6eu + model->BSIM4v6leu * Inv_L + model->BSIM4v6weu * Inv_W + model->BSIM4v6peu * Inv_LW; - pParam->BSIM4v6u0 = model->BSIM4v6u0 - + model->BSIM4v6lu0 * Inv_L - + model->BSIM4v6wu0 * Inv_W - + model->BSIM4v6pu0 * Inv_LW; - pParam->BSIM4v6ute = model->BSIM4v6ute - + model->BSIM4v6lute * Inv_L - + model->BSIM4v6wute * Inv_W - + model->BSIM4v6pute * Inv_LW; - /*high k mobility*/ - pParam->BSIM4v6ucs = model->BSIM4v6ucs - + model->BSIM4v6lucs * Inv_L - + model->BSIM4v6wucs * Inv_W - + model->BSIM4v6pucs * Inv_LW; - pParam->BSIM4v6ucste = model->BSIM4v6ucste - + model->BSIM4v6lucste * Inv_L - + model->BSIM4v6wucste * Inv_W - + model->BSIM4v6pucste * Inv_LW; - - pParam->BSIM4v6voff = model->BSIM4v6voff - + model->BSIM4v6lvoff * Inv_L - + model->BSIM4v6wvoff * Inv_W - + model->BSIM4v6pvoff * Inv_LW; - pParam->BSIM4v6tvoff = model->BSIM4v6tvoff - + model->BSIM4v6ltvoff * Inv_L - + model->BSIM4v6wtvoff * Inv_W - + model->BSIM4v6ptvoff * Inv_LW; + pParam->BSIM4v6u0 = model->BSIM4v6u0 + + model->BSIM4v6lu0 * Inv_L + + model->BSIM4v6wu0 * Inv_W + + model->BSIM4v6pu0 * Inv_LW; + pParam->BSIM4v6ute = model->BSIM4v6ute + + model->BSIM4v6lute * Inv_L + + model->BSIM4v6wute * Inv_W + + model->BSIM4v6pute * Inv_LW; + /*high k mobility*/ + pParam->BSIM4v6ucs = model->BSIM4v6ucs + + model->BSIM4v6lucs * Inv_L + + model->BSIM4v6wucs * Inv_W + + model->BSIM4v6pucs * Inv_LW; + pParam->BSIM4v6ucste = model->BSIM4v6ucste + + model->BSIM4v6lucste * Inv_L + + model->BSIM4v6wucste * Inv_W + + model->BSIM4v6pucste * Inv_LW; + + pParam->BSIM4v6voff = model->BSIM4v6voff + + model->BSIM4v6lvoff * Inv_L + + model->BSIM4v6wvoff * Inv_W + + model->BSIM4v6pvoff * Inv_LW; + pParam->BSIM4v6tvoff = model->BSIM4v6tvoff + + model->BSIM4v6ltvoff * Inv_L + + model->BSIM4v6wtvoff * Inv_W + + model->BSIM4v6ptvoff * Inv_LW; pParam->BSIM4v6minv = model->BSIM4v6minv + model->BSIM4v6lminv * Inv_L + model->BSIM4v6wminv * Inv_W @@ -769,7 +769,7 @@ int Size_Not_Found, i; + model->BSIM4v6lminvcv * Inv_L + model->BSIM4v6wminvcv * Inv_W + model->BSIM4v6pminvcv * Inv_LW; - pParam->BSIM4v6fprout = model->BSIM4v6fprout + pParam->BSIM4v6fprout = model->BSIM4v6fprout + model->BSIM4v6lfprout * Inv_L + model->BSIM4v6wfprout * Inv_W + model->BSIM4v6pfprout * Inv_LW; @@ -781,14 +781,14 @@ int Size_Not_Found, i; + model->BSIM4v6lpditsd * Inv_L + model->BSIM4v6wpditsd * Inv_W + model->BSIM4v6ppditsd * Inv_LW; - pParam->BSIM4v6delta = model->BSIM4v6delta - + model->BSIM4v6ldelta * Inv_L - + model->BSIM4v6wdelta * Inv_W - + model->BSIM4v6pdelta * Inv_LW; - pParam->BSIM4v6rdsw = model->BSIM4v6rdsw - + model->BSIM4v6lrdsw * Inv_L - + model->BSIM4v6wrdsw * Inv_W - + model->BSIM4v6prdsw * Inv_LW; + pParam->BSIM4v6delta = model->BSIM4v6delta + + model->BSIM4v6ldelta * Inv_L + + model->BSIM4v6wdelta * Inv_W + + model->BSIM4v6pdelta * Inv_LW; + pParam->BSIM4v6rdsw = model->BSIM4v6rdsw + + model->BSIM4v6lrdsw * Inv_L + + model->BSIM4v6wrdsw * Inv_W + + model->BSIM4v6prdsw * Inv_LW; pParam->BSIM4v6rdw = model->BSIM4v6rdw + model->BSIM4v6lrdw * Inv_L + model->BSIM4v6wrdw * Inv_W @@ -797,86 +797,86 @@ int Size_Not_Found, i; + model->BSIM4v6lrsw * Inv_L + model->BSIM4v6wrsw * Inv_W + model->BSIM4v6prsw * Inv_LW; - pParam->BSIM4v6prwg = model->BSIM4v6prwg - + model->BSIM4v6lprwg * Inv_L - + model->BSIM4v6wprwg * Inv_W - + model->BSIM4v6pprwg * Inv_LW; - pParam->BSIM4v6prwb = model->BSIM4v6prwb - + model->BSIM4v6lprwb * Inv_L - + model->BSIM4v6wprwb * Inv_W - + model->BSIM4v6pprwb * Inv_LW; - pParam->BSIM4v6prt = model->BSIM4v6prt - + model->BSIM4v6lprt * Inv_L - + model->BSIM4v6wprt * Inv_W - + model->BSIM4v6pprt * Inv_LW; - pParam->BSIM4v6eta0 = model->BSIM4v6eta0 - + model->BSIM4v6leta0 * Inv_L - + model->BSIM4v6weta0 * Inv_W - + model->BSIM4v6peta0 * Inv_LW; - pParam->BSIM4v6etab = model->BSIM4v6etab - + model->BSIM4v6letab * Inv_L - + model->BSIM4v6wetab * Inv_W - + model->BSIM4v6petab * Inv_LW; - pParam->BSIM4v6pclm = model->BSIM4v6pclm - + model->BSIM4v6lpclm * Inv_L - + model->BSIM4v6wpclm * Inv_W - + model->BSIM4v6ppclm * Inv_LW; - pParam->BSIM4v6pdibl1 = model->BSIM4v6pdibl1 - + model->BSIM4v6lpdibl1 * Inv_L - + model->BSIM4v6wpdibl1 * Inv_W - + model->BSIM4v6ppdibl1 * Inv_LW; - pParam->BSIM4v6pdibl2 = model->BSIM4v6pdibl2 - + model->BSIM4v6lpdibl2 * Inv_L - + model->BSIM4v6wpdibl2 * Inv_W - + model->BSIM4v6ppdibl2 * Inv_LW; - pParam->BSIM4v6pdiblb = model->BSIM4v6pdiblb - + model->BSIM4v6lpdiblb * Inv_L - + model->BSIM4v6wpdiblb * Inv_W - + model->BSIM4v6ppdiblb * Inv_LW; - pParam->BSIM4v6pscbe1 = model->BSIM4v6pscbe1 - + model->BSIM4v6lpscbe1 * Inv_L - + model->BSIM4v6wpscbe1 * Inv_W - + model->BSIM4v6ppscbe1 * Inv_LW; - pParam->BSIM4v6pscbe2 = model->BSIM4v6pscbe2 - + model->BSIM4v6lpscbe2 * Inv_L - + model->BSIM4v6wpscbe2 * Inv_W - + model->BSIM4v6ppscbe2 * Inv_LW; - pParam->BSIM4v6pvag = model->BSIM4v6pvag - + model->BSIM4v6lpvag * Inv_L - + model->BSIM4v6wpvag * Inv_W - + model->BSIM4v6ppvag * Inv_LW; - pParam->BSIM4v6wr = model->BSIM4v6wr - + model->BSIM4v6lwr * Inv_L - + model->BSIM4v6wwr * Inv_W - + model->BSIM4v6pwr * Inv_LW; - pParam->BSIM4v6dwg = model->BSIM4v6dwg - + model->BSIM4v6ldwg * Inv_L - + model->BSIM4v6wdwg * Inv_W - + model->BSIM4v6pdwg * Inv_LW; - pParam->BSIM4v6dwb = model->BSIM4v6dwb - + model->BSIM4v6ldwb * Inv_L - + model->BSIM4v6wdwb * Inv_W - + model->BSIM4v6pdwb * Inv_LW; - pParam->BSIM4v6b0 = model->BSIM4v6b0 - + model->BSIM4v6lb0 * Inv_L - + model->BSIM4v6wb0 * Inv_W - + model->BSIM4v6pb0 * Inv_LW; - pParam->BSIM4v6b1 = model->BSIM4v6b1 - + model->BSIM4v6lb1 * Inv_L - + model->BSIM4v6wb1 * Inv_W - + model->BSIM4v6pb1 * Inv_LW; - pParam->BSIM4v6alpha0 = model->BSIM4v6alpha0 - + model->BSIM4v6lalpha0 * Inv_L - + model->BSIM4v6walpha0 * Inv_W - + model->BSIM4v6palpha0 * Inv_LW; + pParam->BSIM4v6prwg = model->BSIM4v6prwg + + model->BSIM4v6lprwg * Inv_L + + model->BSIM4v6wprwg * Inv_W + + model->BSIM4v6pprwg * Inv_LW; + pParam->BSIM4v6prwb = model->BSIM4v6prwb + + model->BSIM4v6lprwb * Inv_L + + model->BSIM4v6wprwb * Inv_W + + model->BSIM4v6pprwb * Inv_LW; + pParam->BSIM4v6prt = model->BSIM4v6prt + + model->BSIM4v6lprt * Inv_L + + model->BSIM4v6wprt * Inv_W + + model->BSIM4v6pprt * Inv_LW; + pParam->BSIM4v6eta0 = model->BSIM4v6eta0 + + model->BSIM4v6leta0 * Inv_L + + model->BSIM4v6weta0 * Inv_W + + model->BSIM4v6peta0 * Inv_LW; + pParam->BSIM4v6etab = model->BSIM4v6etab + + model->BSIM4v6letab * Inv_L + + model->BSIM4v6wetab * Inv_W + + model->BSIM4v6petab * Inv_LW; + pParam->BSIM4v6pclm = model->BSIM4v6pclm + + model->BSIM4v6lpclm * Inv_L + + model->BSIM4v6wpclm * Inv_W + + model->BSIM4v6ppclm * Inv_LW; + pParam->BSIM4v6pdibl1 = model->BSIM4v6pdibl1 + + model->BSIM4v6lpdibl1 * Inv_L + + model->BSIM4v6wpdibl1 * Inv_W + + model->BSIM4v6ppdibl1 * Inv_LW; + pParam->BSIM4v6pdibl2 = model->BSIM4v6pdibl2 + + model->BSIM4v6lpdibl2 * Inv_L + + model->BSIM4v6wpdibl2 * Inv_W + + model->BSIM4v6ppdibl2 * Inv_LW; + pParam->BSIM4v6pdiblb = model->BSIM4v6pdiblb + + model->BSIM4v6lpdiblb * Inv_L + + model->BSIM4v6wpdiblb * Inv_W + + model->BSIM4v6ppdiblb * Inv_LW; + pParam->BSIM4v6pscbe1 = model->BSIM4v6pscbe1 + + model->BSIM4v6lpscbe1 * Inv_L + + model->BSIM4v6wpscbe1 * Inv_W + + model->BSIM4v6ppscbe1 * Inv_LW; + pParam->BSIM4v6pscbe2 = model->BSIM4v6pscbe2 + + model->BSIM4v6lpscbe2 * Inv_L + + model->BSIM4v6wpscbe2 * Inv_W + + model->BSIM4v6ppscbe2 * Inv_LW; + pParam->BSIM4v6pvag = model->BSIM4v6pvag + + model->BSIM4v6lpvag * Inv_L + + model->BSIM4v6wpvag * Inv_W + + model->BSIM4v6ppvag * Inv_LW; + pParam->BSIM4v6wr = model->BSIM4v6wr + + model->BSIM4v6lwr * Inv_L + + model->BSIM4v6wwr * Inv_W + + model->BSIM4v6pwr * Inv_LW; + pParam->BSIM4v6dwg = model->BSIM4v6dwg + + model->BSIM4v6ldwg * Inv_L + + model->BSIM4v6wdwg * Inv_W + + model->BSIM4v6pdwg * Inv_LW; + pParam->BSIM4v6dwb = model->BSIM4v6dwb + + model->BSIM4v6ldwb * Inv_L + + model->BSIM4v6wdwb * Inv_W + + model->BSIM4v6pdwb * Inv_LW; + pParam->BSIM4v6b0 = model->BSIM4v6b0 + + model->BSIM4v6lb0 * Inv_L + + model->BSIM4v6wb0 * Inv_W + + model->BSIM4v6pb0 * Inv_LW; + pParam->BSIM4v6b1 = model->BSIM4v6b1 + + model->BSIM4v6lb1 * Inv_L + + model->BSIM4v6wb1 * Inv_W + + model->BSIM4v6pb1 * Inv_LW; + pParam->BSIM4v6alpha0 = model->BSIM4v6alpha0 + + model->BSIM4v6lalpha0 * Inv_L + + model->BSIM4v6walpha0 * Inv_W + + model->BSIM4v6palpha0 * Inv_LW; pParam->BSIM4v6alpha1 = model->BSIM4v6alpha1 + model->BSIM4v6lalpha1 * Inv_L + model->BSIM4v6walpha1 * Inv_W + model->BSIM4v6palpha1 * Inv_LW; - pParam->BSIM4v6beta0 = model->BSIM4v6beta0 - + model->BSIM4v6lbeta0 * Inv_L - + model->BSIM4v6wbeta0 * Inv_W - + model->BSIM4v6pbeta0 * Inv_LW; + pParam->BSIM4v6beta0 = model->BSIM4v6beta0 + + model->BSIM4v6lbeta0 * Inv_L + + model->BSIM4v6wbeta0 * Inv_W + + model->BSIM4v6pbeta0 * Inv_LW; pParam->BSIM4v6agidl = model->BSIM4v6agidl + model->BSIM4v6lagidl * Inv_L + model->BSIM4v6wagidl * Inv_W @@ -1026,38 +1026,38 @@ int Size_Not_Found, i; + model->BSIM4v6wtvfbsdoff * Inv_W + model->BSIM4v6ptvfbsdoff * Inv_LW; - pParam->BSIM4v6cgsl = model->BSIM4v6cgsl - + model->BSIM4v6lcgsl * Inv_L - + model->BSIM4v6wcgsl * Inv_W - + model->BSIM4v6pcgsl * Inv_LW; - pParam->BSIM4v6cgdl = model->BSIM4v6cgdl - + model->BSIM4v6lcgdl * Inv_L - + model->BSIM4v6wcgdl * Inv_W - + model->BSIM4v6pcgdl * Inv_LW; - pParam->BSIM4v6ckappas = model->BSIM4v6ckappas - + model->BSIM4v6lckappas * Inv_L - + model->BSIM4v6wckappas * Inv_W - + model->BSIM4v6pckappas * Inv_LW; + pParam->BSIM4v6cgsl = model->BSIM4v6cgsl + + model->BSIM4v6lcgsl * Inv_L + + model->BSIM4v6wcgsl * Inv_W + + model->BSIM4v6pcgsl * Inv_LW; + pParam->BSIM4v6cgdl = model->BSIM4v6cgdl + + model->BSIM4v6lcgdl * Inv_L + + model->BSIM4v6wcgdl * Inv_W + + model->BSIM4v6pcgdl * Inv_LW; + pParam->BSIM4v6ckappas = model->BSIM4v6ckappas + + model->BSIM4v6lckappas * Inv_L + + model->BSIM4v6wckappas * Inv_W + + model->BSIM4v6pckappas * Inv_LW; pParam->BSIM4v6ckappad = model->BSIM4v6ckappad + model->BSIM4v6lckappad * Inv_L + model->BSIM4v6wckappad * Inv_W + model->BSIM4v6pckappad * Inv_LW; - pParam->BSIM4v6cf = model->BSIM4v6cf - + model->BSIM4v6lcf * Inv_L - + model->BSIM4v6wcf * Inv_W - + model->BSIM4v6pcf * Inv_LW; - pParam->BSIM4v6clc = model->BSIM4v6clc - + model->BSIM4v6lclc * Inv_L - + model->BSIM4v6wclc * Inv_W - + model->BSIM4v6pclc * Inv_LW; - pParam->BSIM4v6cle = model->BSIM4v6cle - + model->BSIM4v6lcle * Inv_L - + model->BSIM4v6wcle * Inv_W - + model->BSIM4v6pcle * Inv_LW; - pParam->BSIM4v6vfbcv = model->BSIM4v6vfbcv - + model->BSIM4v6lvfbcv * Inv_L - + model->BSIM4v6wvfbcv * Inv_W - + model->BSIM4v6pvfbcv * Inv_LW; + pParam->BSIM4v6cf = model->BSIM4v6cf + + model->BSIM4v6lcf * Inv_L + + model->BSIM4v6wcf * Inv_W + + model->BSIM4v6pcf * Inv_LW; + pParam->BSIM4v6clc = model->BSIM4v6clc + + model->BSIM4v6lclc * Inv_L + + model->BSIM4v6wclc * Inv_W + + model->BSIM4v6pclc * Inv_LW; + pParam->BSIM4v6cle = model->BSIM4v6cle + + model->BSIM4v6lcle * Inv_L + + model->BSIM4v6wcle * Inv_W + + model->BSIM4v6pcle * Inv_LW; + pParam->BSIM4v6vfbcv = model->BSIM4v6vfbcv + + model->BSIM4v6lvfbcv * Inv_L + + model->BSIM4v6wvfbcv * Inv_W + + model->BSIM4v6pvfbcv * Inv_LW; pParam->BSIM4v6acde = model->BSIM4v6acde + model->BSIM4v6lacde * Inv_L + model->BSIM4v6wacde * Inv_W @@ -1088,71 +1088,71 @@ int Size_Not_Found, i; + model->BSIM4v6pku0we * Inv_LW; pParam->BSIM4v6abulkCVfactor = 1.0 + pow((pParam->BSIM4v6clc - / pParam->BSIM4v6leffCV), - pParam->BSIM4v6cle); + / pParam->BSIM4v6leffCV), + pParam->BSIM4v6cle); - T0 = (TRatio - 1.0); + T0 = (TRatio - 1.0); - PowWeffWr = pow(pParam->BSIM4v6weffCJ * 1.0e6, pParam->BSIM4v6wr) * here->BSIM4v6nf; + PowWeffWr = pow(pParam->BSIM4v6weffCJ * 1.0e6, pParam->BSIM4v6wr) * here->BSIM4v6nf; - T1 = T2 = T3 = T4 = 0.0; - pParam->BSIM4v6ucs = pParam->BSIM4v6ucs * pow(TRatio, pParam->BSIM4v6ucste); - if(model->BSIM4v6tempMod == 0) { - pParam->BSIM4v6ua = pParam->BSIM4v6ua + pParam->BSIM4v6ua1 * T0; - pParam->BSIM4v6ub = pParam->BSIM4v6ub + pParam->BSIM4v6ub1 * T0; - pParam->BSIM4v6uc = pParam->BSIM4v6uc + pParam->BSIM4v6uc1 * T0; - pParam->BSIM4v6ud = pParam->BSIM4v6ud + pParam->BSIM4v6ud1 * T0; - pParam->BSIM4v6vsattemp = pParam->BSIM4v6vsat - pParam->BSIM4v6at * T0; - T10 = pParam->BSIM4v6prt * T0; - if(model->BSIM4v6rdsMod) { - /* External Rd(V) */ - T1 = pParam->BSIM4v6rdw + T10; - T2 = model->BSIM4v6rdwmin + T10; - /* External Rs(V) */ - T3 = pParam->BSIM4v6rsw + T10; - T4 = model->BSIM4v6rswmin + T10; + T1 = T2 = T3 = T4 = 0.0; + pParam->BSIM4v6ucs = pParam->BSIM4v6ucs * pow(TRatio, pParam->BSIM4v6ucste); + if(model->BSIM4v6tempMod == 0) { + pParam->BSIM4v6ua = pParam->BSIM4v6ua + pParam->BSIM4v6ua1 * T0; + pParam->BSIM4v6ub = pParam->BSIM4v6ub + pParam->BSIM4v6ub1 * T0; + pParam->BSIM4v6uc = pParam->BSIM4v6uc + pParam->BSIM4v6uc1 * T0; + pParam->BSIM4v6ud = pParam->BSIM4v6ud + pParam->BSIM4v6ud1 * T0; + pParam->BSIM4v6vsattemp = pParam->BSIM4v6vsat - pParam->BSIM4v6at * T0; + T10 = pParam->BSIM4v6prt * T0; + if(model->BSIM4v6rdsMod) { + /* External Rd(V) */ + T1 = pParam->BSIM4v6rdw + T10; + T2 = model->BSIM4v6rdwmin + T10; + /* External Rs(V) */ + T3 = pParam->BSIM4v6rsw + T10; + T4 = model->BSIM4v6rswmin + T10; } - /* Internal Rds(V) in IV */ - pParam->BSIM4v6rds0 = (pParam->BSIM4v6rdsw + T10) - * here->BSIM4v6nf / PowWeffWr; - pParam->BSIM4v6rdswmin = (model->BSIM4v6rdswmin + T10) - * here->BSIM4v6nf / PowWeffWr; - } else { - if (model->BSIM4v6tempMod == 3) - {pParam->BSIM4v6ua = pParam->BSIM4v6ua * pow(TRatio, pParam->BSIM4v6ua1) ; - pParam->BSIM4v6ub = pParam->BSIM4v6ub * pow(TRatio, pParam->BSIM4v6ub1); - pParam->BSIM4v6uc = pParam->BSIM4v6uc * pow(TRatio, pParam->BSIM4v6uc1); - pParam->BSIM4v6ud = pParam->BSIM4v6ud * pow(TRatio, pParam->BSIM4v6ud1); - } - else{ /* tempMod = 1, 2 */ - pParam->BSIM4v6ua = pParam->BSIM4v6ua * (1.0 + pParam->BSIM4v6ua1 * delTemp) ; - pParam->BSIM4v6ub = pParam->BSIM4v6ub * (1.0 + pParam->BSIM4v6ub1 * delTemp); - pParam->BSIM4v6uc = pParam->BSIM4v6uc * (1.0 + pParam->BSIM4v6uc1 * delTemp); - pParam->BSIM4v6ud = pParam->BSIM4v6ud * (1.0 + pParam->BSIM4v6ud1 * delTemp); - } - pParam->BSIM4v6vsattemp = pParam->BSIM4v6vsat * (1.0 - pParam->BSIM4v6at * delTemp); - T10 = 1.0 + pParam->BSIM4v6prt * delTemp; - if(model->BSIM4v6rdsMod) { - /* External Rd(V) */ - T1 = pParam->BSIM4v6rdw * T10; - T2 = model->BSIM4v6rdwmin * T10; - /* External Rs(V) */ - T3 = pParam->BSIM4v6rsw * T10; - T4 = model->BSIM4v6rswmin * T10; + /* Internal Rds(V) in IV */ + pParam->BSIM4v6rds0 = (pParam->BSIM4v6rdsw + T10) + * here->BSIM4v6nf / PowWeffWr; + pParam->BSIM4v6rdswmin = (model->BSIM4v6rdswmin + T10) + * here->BSIM4v6nf / PowWeffWr; + } else { + if (model->BSIM4v6tempMod == 3) + {pParam->BSIM4v6ua = pParam->BSIM4v6ua * pow(TRatio, pParam->BSIM4v6ua1) ; + pParam->BSIM4v6ub = pParam->BSIM4v6ub * pow(TRatio, pParam->BSIM4v6ub1); + pParam->BSIM4v6uc = pParam->BSIM4v6uc * pow(TRatio, pParam->BSIM4v6uc1); + pParam->BSIM4v6ud = pParam->BSIM4v6ud * pow(TRatio, pParam->BSIM4v6ud1); + } + else{ /* tempMod = 1, 2 */ + pParam->BSIM4v6ua = pParam->BSIM4v6ua * (1.0 + pParam->BSIM4v6ua1 * delTemp) ; + pParam->BSIM4v6ub = pParam->BSIM4v6ub * (1.0 + pParam->BSIM4v6ub1 * delTemp); + pParam->BSIM4v6uc = pParam->BSIM4v6uc * (1.0 + pParam->BSIM4v6uc1 * delTemp); + pParam->BSIM4v6ud = pParam->BSIM4v6ud * (1.0 + pParam->BSIM4v6ud1 * delTemp); + } + pParam->BSIM4v6vsattemp = pParam->BSIM4v6vsat * (1.0 - pParam->BSIM4v6at * delTemp); + T10 = 1.0 + pParam->BSIM4v6prt * delTemp; + if(model->BSIM4v6rdsMod) { + /* External Rd(V) */ + T1 = pParam->BSIM4v6rdw * T10; + T2 = model->BSIM4v6rdwmin * T10; + /* External Rs(V) */ + T3 = pParam->BSIM4v6rsw * T10; + T4 = model->BSIM4v6rswmin * T10; } - /* Internal Rds(V) in IV */ - pParam->BSIM4v6rds0 = pParam->BSIM4v6rdsw * T10 * here->BSIM4v6nf / PowWeffWr; - pParam->BSIM4v6rdswmin = model->BSIM4v6rdswmin * T10 * here->BSIM4v6nf / PowWeffWr; + /* Internal Rds(V) in IV */ + pParam->BSIM4v6rds0 = pParam->BSIM4v6rdsw * T10 * here->BSIM4v6nf / PowWeffWr; + pParam->BSIM4v6rdswmin = model->BSIM4v6rdswmin * T10 * here->BSIM4v6nf / PowWeffWr; } - if (T1 < 0.0) - { T1 = 0.0; - printf("Warning: Rdw at current temperature is negative; set to 0.\n"); - } - if (T2 < 0.0) + 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->BSIM4v6rd0 = T1 / PowWeffWr; + pParam->BSIM4v6rd0 = T1 / PowWeffWr; pParam->BSIM4v6rdwmin = T2 / PowWeffWr; if (T3 < 0.0) { T3 = 0.0; @@ -1165,38 +1165,38 @@ int Size_Not_Found, i; pParam->BSIM4v6rs0 = T3 / PowWeffWr; pParam->BSIM4v6rswmin = T4 / PowWeffWr; - if (pParam->BSIM4v6u0 > 1.0) + if (pParam->BSIM4v6u0 > 1.0) pParam->BSIM4v6u0 = pParam->BSIM4v6u0 / 1.0e4; /* mobility channel length dependence */ T5 = 1.0 - pParam->BSIM4v6up * exp( - pParam->BSIM4v6leff / pParam->BSIM4v6lp); pParam->BSIM4v6u0temp = pParam->BSIM4v6u0 * T5 - * pow(TRatio, pParam->BSIM4v6ute); + * pow(TRatio, pParam->BSIM4v6ute); if (pParam->BSIM4v6eu < 0.0) { pParam->BSIM4v6eu = 0.0; - printf("Warning: eu has been negative; reset to 0.0.\n"); - } + printf("Warning: eu has been negative; reset to 0.0.\n"); + } if (pParam->BSIM4v6ucs < 0.0) { pParam->BSIM4v6ucs = 0.0; - printf("Warning: ucs has been negative; reset to 0.0.\n"); - } + printf("Warning: ucs has been negative; reset to 0.0.\n"); + } - pParam->BSIM4v6vfbsdoff = pParam->BSIM4v6vfbsdoff * (1.0 + pParam->BSIM4v6tvfbsdoff * delTemp); - pParam->BSIM4v6voff = pParam->BSIM4v6voff * (1.0 + pParam->BSIM4v6tvoff * delTemp); + pParam->BSIM4v6vfbsdoff = pParam->BSIM4v6vfbsdoff * (1.0 + pParam->BSIM4v6tvfbsdoff * delTemp); + pParam->BSIM4v6voff = pParam->BSIM4v6voff * (1.0 + pParam->BSIM4v6tvoff * delTemp); /* Source End Velocity Limit */ - if((model->BSIM4v6vtlGiven) && (model->BSIM4v6vtl > 0.0) ) - { + if((model->BSIM4v6vtlGiven) && (model->BSIM4v6vtl > 0.0) ) + { if(model->BSIM4v6lc < 0.0) pParam->BSIM4v6lc = 0.0; else pParam->BSIM4v6lc = model->BSIM4v6lc ; T0 = pParam->BSIM4v6leff / (pParam->BSIM4v6xn * pParam->BSIM4v6leff + pParam->BSIM4v6lc); pParam->BSIM4v6tfactor = (1.0 - T0) / (1.0 + T0 ); - } + } pParam->BSIM4v6cgdo = (model->BSIM4v6cgdo + pParam->BSIM4v6cf) - * pParam->BSIM4v6weffCV; + * pParam->BSIM4v6weffCV; pParam->BSIM4v6cgso = (model->BSIM4v6cgso + pParam->BSIM4v6cf) - * pParam->BSIM4v6weffCV; + * pParam->BSIM4v6weffCV; pParam->BSIM4v6cgbo = model->BSIM4v6cgbo * pParam->BSIM4v6leffCV * here->BSIM4v6nf; if (!model->BSIM4v6ndepGiven && model->BSIM4v6gamma1Given) @@ -1204,51 +1204,51 @@ int Size_Not_Found, i; pParam->BSIM4v6ndep = 3.01248e22 * T0 * T0; } - pParam->BSIM4v6phi = Vtm0 * log(pParam->BSIM4v6ndep / ni) - + pParam->BSIM4v6phin + 0.4; + pParam->BSIM4v6phi = Vtm0 * log(pParam->BSIM4v6ndep / ni) + + pParam->BSIM4v6phin + 0.4; + + pParam->BSIM4v6sqrtPhi = sqrt(pParam->BSIM4v6phi); + pParam->BSIM4v6phis3 = pParam->BSIM4v6sqrtPhi * pParam->BSIM4v6phi; - pParam->BSIM4v6sqrtPhi = sqrt(pParam->BSIM4v6phi); - pParam->BSIM4v6phis3 = pParam->BSIM4v6sqrtPhi * pParam->BSIM4v6phi; - pParam->BSIM4v6Xdep0 = sqrt(2.0 * epssub / (Charge_q - * pParam->BSIM4v6ndep * 1.0e6)) - * pParam->BSIM4v6sqrtPhi; + * pParam->BSIM4v6ndep * 1.0e6)) + * pParam->BSIM4v6sqrtPhi; pParam->BSIM4v6sqrtXdep0 = sqrt(pParam->BSIM4v6Xdep0); - if(model->BSIM4v6mtrlMod == 0) - pParam->BSIM4v6litl = sqrt(3.0 * 3.9 / epsrox * pParam->BSIM4v6xj * toxe); - else - pParam->BSIM4v6litl = sqrt(model->BSIM4v6epsrsub/epsrox * pParam->BSIM4v6xj * toxe); + if(model->BSIM4v6mtrlMod == 0) + pParam->BSIM4v6litl = sqrt(3.0 * 3.9 / epsrox * pParam->BSIM4v6xj * toxe); + else + pParam->BSIM4v6litl = sqrt(model->BSIM4v6epsrsub/epsrox * pParam->BSIM4v6xj * toxe); pParam->BSIM4v6vbi = Vtm0 * log(pParam->BSIM4v6nsd - * pParam->BSIM4v6ndep / (ni * ni)); + * pParam->BSIM4v6ndep / (ni * ni)); - if (model->BSIM4v6mtrlMod == 0) - { - if (pParam->BSIM4v6ngate > 0.0) - { pParam->BSIM4v6vfbsd = Vtm0 * log(pParam->BSIM4v6ngate + if (model->BSIM4v6mtrlMod == 0) + { + if (pParam->BSIM4v6ngate > 0.0) + { pParam->BSIM4v6vfbsd = Vtm0 * log(pParam->BSIM4v6ngate / pParam->BSIM4v6nsd); - } - else - pParam->BSIM4v6vfbsd = 0.0; - } - else - { - T0 = Vtm0 * log(pParam->BSIM4v6nsd/ni); - T1 = 0.5 * Eg0; - if(T0 > T1) - T0 = T1; - T2 = model->BSIM4v6easub + T1 - model->BSIM4v6type * T0; - pParam->BSIM4v6vfbsd = model->BSIM4v6phig - T2; - } + } + else + pParam->BSIM4v6vfbsd = 0.0; + } + else + { + T0 = Vtm0 * log(pParam->BSIM4v6nsd/ni); + T1 = 0.5 * Eg0; + if(T0 > T1) + T0 = T1; + T2 = model->BSIM4v6easub + T1 - model->BSIM4v6type * T0; + pParam->BSIM4v6vfbsd = model->BSIM4v6phig - T2; + } pParam->BSIM4v6cdep0 = sqrt(Charge_q * epssub - * pParam->BSIM4v6ndep * 1.0e6 / 2.0 - / pParam->BSIM4v6phi); + * pParam->BSIM4v6ndep * 1.0e6 / 2.0 + / pParam->BSIM4v6phi); pParam->BSIM4v6ToxRatio = exp(pParam->BSIM4v6ntox - * log(model->BSIM4v6toxref / toxe)) - / toxe / toxe; + * log(model->BSIM4v6toxref / toxe)) + / toxe / toxe; pParam->BSIM4v6ToxRatioEdge = exp(pParam->BSIM4v6ntox * log(model->BSIM4v6toxref / (toxe * pParam->BSIM4v6poxedge))) @@ -1257,13 +1257,13 @@ int Size_Not_Found, i; pParam->BSIM4v6Aechvb = (model->BSIM4v6type == NMOS) ? 4.97232e-7 : 3.42537e-7; pParam->BSIM4v6Bechvb = (model->BSIM4v6type == NMOS) ? 7.45669e11 : 1.16645e12; pParam->BSIM4v6AechvbEdgeS = pParam->BSIM4v6Aechvb * pParam->BSIM4v6weff - * model->BSIM4v6dlcig * pParam->BSIM4v6ToxRatioEdge; + * model->BSIM4v6dlcig * pParam->BSIM4v6ToxRatioEdge; pParam->BSIM4v6AechvbEdgeD = pParam->BSIM4v6Aechvb * pParam->BSIM4v6weff - * model->BSIM4v6dlcigd * pParam->BSIM4v6ToxRatioEdge; + * model->BSIM4v6dlcigd * pParam->BSIM4v6ToxRatioEdge; pParam->BSIM4v6BechvbEdge = -pParam->BSIM4v6Bechvb - * toxe * pParam->BSIM4v6poxedge; + * toxe * pParam->BSIM4v6poxedge; pParam->BSIM4v6Aechvb *= pParam->BSIM4v6weff * pParam->BSIM4v6leff - * pParam->BSIM4v6ToxRatio; + * pParam->BSIM4v6ToxRatio; pParam->BSIM4v6Bechvb *= -toxe; @@ -1304,85 +1304,85 @@ int Size_Not_Found, i; } } else - { if (!model->BSIM4v6vbxGiven) - pParam->BSIM4v6vbx = pParam->BSIM4v6phi - 7.7348e-4 + { if (!model->BSIM4v6vbxGiven) + pParam->BSIM4v6vbx = pParam->BSIM4v6phi - 7.7348e-4 * pParam->BSIM4v6ndep - * pParam->BSIM4v6xt * pParam->BSIM4v6xt; - if (pParam->BSIM4v6vbx > 0.0) - pParam->BSIM4v6vbx = -pParam->BSIM4v6vbx; - if (pParam->BSIM4v6vbm > 0.0) + * pParam->BSIM4v6xt * pParam->BSIM4v6xt; + if (pParam->BSIM4v6vbx > 0.0) + pParam->BSIM4v6vbx = -pParam->BSIM4v6vbx; + if (pParam->BSIM4v6vbm > 0.0) pParam->BSIM4v6vbm = -pParam->BSIM4v6vbm; - + if (!model->BSIM4v6gamma1Given) pParam->BSIM4v6gamma1 = 5.753e-12 - * sqrt(pParam->BSIM4v6ndep) + * sqrt(pParam->BSIM4v6ndep) / model->BSIM4v6coxe; if (!model->BSIM4v6gamma2Given) pParam->BSIM4v6gamma2 = 5.753e-12 - * sqrt(pParam->BSIM4v6nsub) + * sqrt(pParam->BSIM4v6nsub) / model->BSIM4v6coxe; T0 = pParam->BSIM4v6gamma1 - pParam->BSIM4v6gamma2; T1 = sqrt(pParam->BSIM4v6phi - pParam->BSIM4v6vbx) - - pParam->BSIM4v6sqrtPhi; + - pParam->BSIM4v6sqrtPhi; T2 = sqrt(pParam->BSIM4v6phi * (pParam->BSIM4v6phi - - pParam->BSIM4v6vbm)) - pParam->BSIM4v6phi; + - pParam->BSIM4v6vbm)) - pParam->BSIM4v6phi; pParam->BSIM4v6k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM4v6vbm); pParam->BSIM4v6k1 = pParam->BSIM4v6gamma2 - 2.0 - * pParam->BSIM4v6k2 * sqrt(pParam->BSIM4v6phi - - pParam->BSIM4v6vbm); + * pParam->BSIM4v6k2 * sqrt(pParam->BSIM4v6phi + - pParam->BSIM4v6vbm); } if (!model->BSIM4v6vfbGiven) - { - if (model->BSIM4v6vth0Given) + { + if (model->BSIM4v6vth0Given) { pParam->BSIM4v6vfb = model->BSIM4v6type * pParam->BSIM4v6vth0 - pParam->BSIM4v6phi - pParam->BSIM4v6k1 * pParam->BSIM4v6sqrtPhi; } else - { - if ((model->BSIM4v6mtrlMod) && (model->BSIM4v6phigGiven) && - (model->BSIM4v6nsubGiven)) - { - T0 = Vtm0 * log(pParam->BSIM4v6nsub/ni); - T1 = 0.5 * Eg0; - if(T0 > T1) - T0 = T1; - T2 = model->BSIM4v6easub + T1 + model->BSIM4v6type * T0; - pParam->BSIM4v6vfb = model->BSIM4v6phig - T2; - } - else - { - pParam->BSIM4v6vfb = -1.0; - } - } + { + if ((model->BSIM4v6mtrlMod) && (model->BSIM4v6phigGiven) && + (model->BSIM4v6nsubGiven)) + { + T0 = Vtm0 * log(pParam->BSIM4v6nsub/ni); + T1 = 0.5 * Eg0; + if(T0 > T1) + T0 = T1; + T2 = model->BSIM4v6easub + T1 + model->BSIM4v6type * T0; + pParam->BSIM4v6vfb = model->BSIM4v6phig - T2; + } + else + { + pParam->BSIM4v6vfb = -1.0; + } + } } if (!model->BSIM4v6vth0Given) { pParam->BSIM4v6vth0 = model->BSIM4v6type * (pParam->BSIM4v6vfb + pParam->BSIM4v6phi + pParam->BSIM4v6k1 * pParam->BSIM4v6sqrtPhi); } - + pParam->BSIM4v6k1ox = pParam->BSIM4v6k1 * toxe / model->BSIM4v6toxm; tmp = sqrt(epssub / (epsrox * EPS0) * toxe * pParam->BSIM4v6Xdep0); - T0 = pParam->BSIM4v6dsub * pParam->BSIM4v6leff / tmp; + T0 = pParam->BSIM4v6dsub * pParam->BSIM4v6leff / tmp; if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; + { T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; T4 = T3 + 2.0 * T1 * MIN_EXP; pParam->BSIM4v6theta0vb0 = T1 / T4; } else pParam->BSIM4v6theta0vb0 = 1.0 / (MAX_EXP - 2.0); - T0 = pParam->BSIM4v6drout * pParam->BSIM4v6leff / tmp; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; + T0 = pParam->BSIM4v6drout * pParam->BSIM4v6leff / tmp; + if (T0 < EXP_THRESHOLD) + { T1 = exp(T0); + T2 = T1 - 1.0; T3 = T2 * T2; T4 = T3 + 2.0 * T1 * MIN_EXP; T5 = T1 / T4; @@ -1417,7 +1417,7 @@ int Size_Not_Found, i; T3 = T2 * T2; T4 = T3 + 2.0 * T1 * MIN_EXP; T9 = T1 / T4; - } + } else T9 = 1.0 / (MAX_EXP - 2.0); T9 = pParam->BSIM4v6dvt0 * T9 * tmp1; @@ -1427,25 +1427,25 @@ int Size_Not_Found, i; T0 = sqrt(1.0 + pParam->BSIM4v6lpe0 / pParam->BSIM4v6leff); if((model->BSIM4v6tempMod == 1) || (model->BSIM4v6tempMod == 0)) - T3 = (pParam->BSIM4v6kt1 + pParam->BSIM4v6kt1l / pParam->BSIM4v6leff) - * (TRatio - 1.0); + T3 = (pParam->BSIM4v6kt1 + pParam->BSIM4v6kt1l / pParam->BSIM4v6leff) + * (TRatio - 1.0); if((model->BSIM4v6tempMod == 2)||(model->BSIM4v6tempMod == 3)) T3 = - pParam->BSIM4v6kt1 * (TRatio - 1.0); T5 = pParam->BSIM4v6k1ox * (T0 - 1.0) * pParam->BSIM4v6sqrtPhi + T3; pParam->BSIM4v6vfbzbfactor = - T8 - T9 + pParam->BSIM4v6k3 * T4 + T5 - - pParam->BSIM4v6phi - pParam->BSIM4v6k1 * pParam->BSIM4v6sqrtPhi; + - pParam->BSIM4v6phi - pParam->BSIM4v6k1 * pParam->BSIM4v6sqrtPhi; - /* stress effect */ + /* stress effect */ - wlod = model->BSIM4v6wlod; - if (model->BSIM4v6wlod < 0.0) - { fprintf(stderr, "Warning: WLOD = %g is less than 0. 0.0 is used\n",model->BSIM4v6wlod); - wlod = 0.0; - } + wlod = model->BSIM4v6wlod; + if (model->BSIM4v6wlod < 0.0) + { fprintf(stderr, "Warning: WLOD = %g is less than 0. 0.0 is used\n",model->BSIM4v6wlod); + wlod = 0.0; + } T0 = pow(Lnew, model->BSIM4v6llodku0); - W_tmp = Wnew + wlod; + W_tmp = Wnew + wlod; T1 = pow(W_tmp, model->BSIM4v6wlodku0); tmp1 = model->BSIM4v6lku0 / T0 + model->BSIM4v6wku0 / T1 + model->BSIM4v6pku0 / (T0 * T1); @@ -1456,41 +1456,41 @@ int Size_Not_Found, i; tmp1 = model->BSIM4v6lkvth0 / T0 + model->BSIM4v6wkvth0 / T1 + model->BSIM4v6pkvth0 / (T0 * T1); pParam->BSIM4v6kvth0 = 1.0 + tmp1; - pParam->BSIM4v6kvth0 = sqrt(pParam->BSIM4v6kvth0*pParam->BSIM4v6kvth0 + DELTA); + pParam->BSIM4v6kvth0 = sqrt(pParam->BSIM4v6kvth0*pParam->BSIM4v6kvth0 + DELTA); T0 = (TRatio - 1.0); pParam->BSIM4v6ku0temp = pParam->BSIM4v6ku0 * (1.0 + model->BSIM4v6tku0 *T0) + DELTA; Inv_saref = 1.0/(model->BSIM4v6saref + 0.5*Ldrn); Inv_sbref = 1.0/(model->BSIM4v6sbref + 0.5*Ldrn); - pParam->BSIM4v6inv_od_ref = Inv_saref + Inv_sbref; - pParam->BSIM4v6rho_ref = model->BSIM4v6ku0 / pParam->BSIM4v6ku0temp * pParam->BSIM4v6inv_od_ref; + pParam->BSIM4v6inv_od_ref = Inv_saref + Inv_sbref; + pParam->BSIM4v6rho_ref = model->BSIM4v6ku0 / pParam->BSIM4v6ku0temp * pParam->BSIM4v6inv_od_ref; } /* End of SizeNotFound */ /* stress effect */ - if( (here->BSIM4v6sa > 0.0) && (here->BSIM4v6sb > 0.0) && - ((here->BSIM4v6nf == 1.0) || ((here->BSIM4v6nf > 1.0) && (here->BSIM4v6sd > 0.0))) ) - { Inv_sa = 0; - Inv_sb = 0; - - kvsat = model->BSIM4v6kvsat; - if (model->BSIM4v6kvsat < -1.0 ) - { fprintf(stderr, "Warning: KVSAT = %g is too small; -1.0 is used.\n",model->BSIM4v6kvsat); - kvsat = -1.0; - } - if (model->BSIM4v6kvsat > 1.0) - { fprintf(stderr, "Warning: KVSAT = %g is too big; 1.0 is used.\n",model->BSIM4v6kvsat); - kvsat = 1.0; - } - - for(i = 0; i < here->BSIM4v6nf; i++){ - T0 = 1.0 / here->BSIM4v6nf / (here->BSIM4v6sa + 0.5*Ldrn + i * (here->BSIM4v6sd +Ldrn)); - T1 = 1.0 / here->BSIM4v6nf / (here->BSIM4v6sb + 0.5*Ldrn + i * (here->BSIM4v6sd +Ldrn)); - Inv_sa += T0; - Inv_sb += T1; + if( (here->BSIM4v6sa > 0.0) && (here->BSIM4v6sb > 0.0) && + ((here->BSIM4v6nf == 1.0) || ((here->BSIM4v6nf > 1.0) && (here->BSIM4v6sd > 0.0))) ) + { Inv_sa = 0; + Inv_sb = 0; + + kvsat = model->BSIM4v6kvsat; + if (model->BSIM4v6kvsat < -1.0 ) + { fprintf(stderr, "Warning: KVSAT = %g is too small; -1.0 is used.\n",model->BSIM4v6kvsat); + kvsat = -1.0; + } + if (model->BSIM4v6kvsat > 1.0) + { fprintf(stderr, "Warning: KVSAT = %g is too big; 1.0 is used.\n",model->BSIM4v6kvsat); + kvsat = 1.0; + } + + for(i = 0; i < here->BSIM4v6nf; i++){ + T0 = 1.0 / here->BSIM4v6nf / (here->BSIM4v6sa + 0.5*Ldrn + i * (here->BSIM4v6sd +Ldrn)); + T1 = 1.0 / here->BSIM4v6nf / (here->BSIM4v6sb + 0.5*Ldrn + i * (here->BSIM4v6sd +Ldrn)); + Inv_sa += T0; + Inv_sb += T1; } - Inv_ODeff = Inv_sa + Inv_sb; + Inv_ODeff = Inv_sa + Inv_sb; rho = model->BSIM4v6ku0 / pParam->BSIM4v6ku0temp * Inv_ODeff; T0 = (1.0 + rho)/(1.0 + pParam->BSIM4v6rho_ref); here->BSIM4v6u0temp = pParam->BSIM4v6u0temp * T0; @@ -1498,83 +1498,83 @@ int Size_Not_Found, i; T1 = (1.0 + kvsat * rho)/(1.0 + kvsat * pParam->BSIM4v6rho_ref); here->BSIM4v6vsattemp = pParam->BSIM4v6vsattemp * T1; - OD_offset = Inv_ODeff - pParam->BSIM4v6inv_od_ref; - dvth0_lod = model->BSIM4v6kvth0 / pParam->BSIM4v6kvth0 * OD_offset; + OD_offset = Inv_ODeff - pParam->BSIM4v6inv_od_ref; + dvth0_lod = model->BSIM4v6kvth0 / pParam->BSIM4v6kvth0 * OD_offset; dk2_lod = model->BSIM4v6stk2 / pow(pParam->BSIM4v6kvth0, model->BSIM4v6lodk2) * OD_offset; deta0_lod = model->BSIM4v6steta0 / pow(pParam->BSIM4v6kvth0, model->BSIM4v6lodeta0) * OD_offset; - here->BSIM4v6vth0 = pParam->BSIM4v6vth0 + dvth0_lod; + here->BSIM4v6vth0 = pParam->BSIM4v6vth0 + dvth0_lod; here->BSIM4v6eta0 = pParam->BSIM4v6eta0 + deta0_lod; - here->BSIM4v6k2 = pParam->BSIM4v6k2 + dk2_lod; - } else { - here->BSIM4v6u0temp = pParam->BSIM4v6u0temp; + here->BSIM4v6k2 = pParam->BSIM4v6k2 + dk2_lod; + } else { + here->BSIM4v6u0temp = pParam->BSIM4v6u0temp; here->BSIM4v6vth0 = pParam->BSIM4v6vth0; here->BSIM4v6vsattemp = pParam->BSIM4v6vsattemp; here->BSIM4v6eta0 = pParam->BSIM4v6eta0; here->BSIM4v6k2 = pParam->BSIM4v6k2; } - /* Well Proximity Effect */ - if (model->BSIM4v6wpemod) + /* Well Proximity Effect */ + if (model->BSIM4v6wpemod) { if( (!here->BSIM4v6scaGiven) && (!here->BSIM4v6scbGiven) && (!here->BSIM4v6sccGiven) ) - { if((here->BSIM4v6scGiven) && (here->BSIM4v6sc > 0.0) ) - { T1 = here->BSIM4v6sc + Wdrn; - T2 = 1.0 / model->BSIM4v6scref; - here->BSIM4v6sca = model->BSIM4v6scref * model->BSIM4v6scref - / (here->BSIM4v6sc * T1); - here->BSIM4v6scb = ( (0.1 * here->BSIM4v6sc + 0.01 * model->BSIM4v6scref) - * exp(-10.0 * here->BSIM4v6sc * T2) - - (0.1 * T1 + 0.01 * model->BSIM4v6scref) - * exp(-10.0 * T1 * T2) ) / Wdrn; + { if((here->BSIM4v6scGiven) && (here->BSIM4v6sc > 0.0) ) + { T1 = here->BSIM4v6sc + Wdrn; + T2 = 1.0 / model->BSIM4v6scref; + here->BSIM4v6sca = model->BSIM4v6scref * model->BSIM4v6scref + / (here->BSIM4v6sc * T1); + here->BSIM4v6scb = ( (0.1 * here->BSIM4v6sc + 0.01 * model->BSIM4v6scref) + * exp(-10.0 * here->BSIM4v6sc * T2) + - (0.1 * T1 + 0.01 * model->BSIM4v6scref) + * exp(-10.0 * T1 * T2) ) / Wdrn; here->BSIM4v6scc = ( (0.05 * here->BSIM4v6sc + 0.0025 * model->BSIM4v6scref) - * exp(-20.0 * here->BSIM4v6sc * T2) - - (0.05 * T1 + 0.0025 * model->BSIM4v6scref) + * exp(-20.0 * here->BSIM4v6sc * T2) + - (0.05 * T1 + 0.0025 * model->BSIM4v6scref) * exp(-20.0 * T1 * T2) ) / Wdrn; - } else { + } else { fprintf(stderr, "Warning: No WPE as none of SCA, SCB, SCC, SC is given and/or SC not positive.\n"); - } - } - - if (here->BSIM4v6sca < 0.0) - { + } + } + + if (here->BSIM4v6sca < 0.0) + { printf("Warning: SCA = %g is negative. Set to 0.0.\n", here->BSIM4v6sca); here->BSIM4v6sca = 0.0; } if (here->BSIM4v6scb < 0.0) - { + { printf("Warning: SCB = %g is negative. Set to 0.0.\n", here->BSIM4v6scb); here->BSIM4v6scb = 0.0; } if (here->BSIM4v6scc < 0.0) - { + { printf("Warning: SCC = %g is negative. Set to 0.0.\n", here->BSIM4v6scc); here->BSIM4v6scc = 0.0; } if (here->BSIM4v6sc < 0.0) - { + { printf("Warning: SC = %g is negative. Set to 0.0.\n", here->BSIM4v6sc); here->BSIM4v6sc = 0.0; } - /*4.6.2*/ - sceff = here->BSIM4v6sca + model->BSIM4v6web * here->BSIM4v6scb + /*4.6.2*/ + sceff = here->BSIM4v6sca + model->BSIM4v6web * here->BSIM4v6scb + model->BSIM4v6wec * here->BSIM4v6scc; here->BSIM4v6vth0 += pParam->BSIM4v6kvth0we * sceff; here->BSIM4v6k2 += pParam->BSIM4v6k2we * sceff; - T3 = 1.0 + pParam->BSIM4v6ku0we * sceff; - if (T3 <= 0.0) - { T3 = 0.0; + T3 = 1.0 + pParam->BSIM4v6ku0we * sceff; + if (T3 <= 0.0) + { T3 = 0.0; fprintf(stderr, "Warning: ku0we = %g is negatively too high. Negative mobility! \n", pParam->BSIM4v6ku0we); - } - here->BSIM4v6u0temp *= T3; + } + here->BSIM4v6u0temp *= T3; } - /* adding delvto */ + /* adding delvto */ here->BSIM4v6vth0 += here->BSIM4v6delvto; here->BSIM4v6vfb = pParam->BSIM4v6vfb + model->BSIM4v6type * here->BSIM4v6delvto; - /* Instance variables calculation */ + /* Instance variables calculation */ T3 = model->BSIM4v6type * here->BSIM4v6vth0 - here->BSIM4v6vfb - pParam->BSIM4v6phi; T4 = T3 + T3; @@ -1602,57 +1602,57 @@ int Size_Not_Found, i; here->BSIM4v6k2ox = here->BSIM4v6k2 * toxe / model->BSIM4v6toxm; - here->BSIM4v6vfbzb = pParam->BSIM4v6vfbzbfactor - + model->BSIM4v6type * here->BSIM4v6vth0 ; - + here->BSIM4v6vfbzb = pParam->BSIM4v6vfbzbfactor + + model->BSIM4v6type * here->BSIM4v6vth0 ; + here->BSIM4v6cgso = pParam->BSIM4v6cgso; here->BSIM4v6cgdo = pParam->BSIM4v6cgdo; - - lnl = log(pParam->BSIM4v6leff * 1.0e6); - lnw = log(pParam->BSIM4v6weff * 1.0e6); - lnnf = log(here->BSIM4v6nf); - bodymode = 5; - if( ( !model->BSIM4v6rbps0Given) || - ( !model->BSIM4v6rbpd0Given) ) - bodymode = 1; - else - if( (!model->BSIM4v6rbsbx0Given && !model->BSIM4v6rbsby0Given) || - (!model->BSIM4v6rbdbx0Given && !model->BSIM4v6rbdby0Given) ) - bodymode = 3; + lnl = log(pParam->BSIM4v6leff * 1.0e6); + lnw = log(pParam->BSIM4v6weff * 1.0e6); + lnnf = log(here->BSIM4v6nf); - if(here->BSIM4v6rbodyMod == 2) - { - if (bodymode == 5) - { - rbsbx = exp( log(model->BSIM4v6rbsbx0) + model->BSIM4v6rbsdbxl * lnl + - model->BSIM4v6rbsdbxw * lnw + model->BSIM4v6rbsdbxnf * lnnf ); - rbsby = exp( log(model->BSIM4v6rbsby0) + model->BSIM4v6rbsdbyl * lnl + - model->BSIM4v6rbsdbyw * lnw + model->BSIM4v6rbsdbynf * lnnf ); - here->BSIM4v6rbsb = rbsbx * rbsby / (rbsbx + rbsby); + bodymode = 5; + if( ( !model->BSIM4v6rbps0Given) || + ( !model->BSIM4v6rbpd0Given) ) + bodymode = 1; + else + if( (!model->BSIM4v6rbsbx0Given && !model->BSIM4v6rbsby0Given) || + (!model->BSIM4v6rbdbx0Given && !model->BSIM4v6rbdby0Given) ) + bodymode = 3; - - rbdbx = exp( log(model->BSIM4v6rbdbx0) + model->BSIM4v6rbsdbxl * lnl + - model->BSIM4v6rbsdbxw * lnw + model->BSIM4v6rbsdbxnf * lnnf ); - rbdby = exp( log(model->BSIM4v6rbdby0) + model->BSIM4v6rbsdbyl * lnl + - model->BSIM4v6rbsdbyw * lnw + model->BSIM4v6rbsdbynf * lnnf ); - here->BSIM4v6rbdb = rbdbx * rbdby / (rbdbx + rbdby); - } + if(here->BSIM4v6rbodyMod == 2) + { + if (bodymode == 5) + { + rbsbx = exp( log(model->BSIM4v6rbsbx0) + model->BSIM4v6rbsdbxl * lnl + + model->BSIM4v6rbsdbxw * lnw + model->BSIM4v6rbsdbxnf * lnnf ); + rbsby = exp( log(model->BSIM4v6rbsby0) + model->BSIM4v6rbsdbyl * lnl + + model->BSIM4v6rbsdbyw * lnw + model->BSIM4v6rbsdbynf * lnnf ); + here->BSIM4v6rbsb = rbsbx * rbsby / (rbsbx + rbsby); - if ((bodymode == 3)|| (bodymode == 5)) - { - here->BSIM4v6rbps = exp( log(model->BSIM4v6rbps0) + model->BSIM4v6rbpsl * lnl + - model->BSIM4v6rbpsw * lnw + model->BSIM4v6rbpsnf * lnnf ); - here->BSIM4v6rbpd = exp( log(model->BSIM4v6rbpd0) + model->BSIM4v6rbpdl * lnl + - model->BSIM4v6rbpdw * lnw + model->BSIM4v6rbpdnf * lnnf ); - } - - rbpbx = exp( log(model->BSIM4v6rbpbx0) + model->BSIM4v6rbpbxl * lnl + - model->BSIM4v6rbpbxw * lnw + model->BSIM4v6rbpbxnf * lnnf ); - rbpby = exp( log(model->BSIM4v6rbpby0) + model->BSIM4v6rbpbyl * lnl + - model->BSIM4v6rbpbyw * lnw + model->BSIM4v6rbpbynf * lnnf ); - here->BSIM4v6rbpb = rbpbx*rbpby/(rbpbx + rbpby); - } + + rbdbx = exp( log(model->BSIM4v6rbdbx0) + model->BSIM4v6rbsdbxl * lnl + + model->BSIM4v6rbsdbxw * lnw + model->BSIM4v6rbsdbxnf * lnnf ); + rbdby = exp( log(model->BSIM4v6rbdby0) + model->BSIM4v6rbsdbyl * lnl + + model->BSIM4v6rbsdbyw * lnw + model->BSIM4v6rbsdbynf * lnnf ); + here->BSIM4v6rbdb = rbdbx * rbdby / (rbdbx + rbdby); + } + + if ((bodymode == 3)|| (bodymode == 5)) + { + here->BSIM4v6rbps = exp( log(model->BSIM4v6rbps0) + model->BSIM4v6rbpsl * lnl + + model->BSIM4v6rbpsw * lnw + model->BSIM4v6rbpsnf * lnnf ); + here->BSIM4v6rbpd = exp( log(model->BSIM4v6rbpd0) + model->BSIM4v6rbpdl * lnl + + model->BSIM4v6rbpdw * lnw + model->BSIM4v6rbpdnf * lnnf ); + } + + rbpbx = exp( log(model->BSIM4v6rbpbx0) + model->BSIM4v6rbpbxl * lnl + + model->BSIM4v6rbpbxw * lnw + model->BSIM4v6rbpbxnf * lnnf ); + rbpby = exp( log(model->BSIM4v6rbpby0) + model->BSIM4v6rbpbyl * lnl + + model->BSIM4v6rbpbyw * lnw + model->BSIM4v6rbpbynf * lnnf ); + here->BSIM4v6rbpb = rbpbx*rbpby/(rbpbx + rbpby); + } if ((here->BSIM4v6rbodyMod == 1 ) || ((here->BSIM4v6rbodyMod == 2 ) && (bodymode == 5)) ) @@ -1679,8 +1679,8 @@ int Size_Not_Found, i; } - if((here->BSIM4v6rbodyMod == 2) && (bodymode == 3)) - { + if((here->BSIM4v6rbodyMod == 2) && (bodymode == 3)) + { here->BSIM4v6grbdb = here->BSIM4v6grbsb = model->BSIM4v6gbmin; if (here->BSIM4v6rbpb < 1.0e-3) here->BSIM4v6grbpb = 1.0e3; @@ -1696,10 +1696,10 @@ int Size_Not_Found, i; here->BSIM4v6grbpd = model->BSIM4v6gbmin + 1.0 / here->BSIM4v6rbpd; } - if((here->BSIM4v6rbodyMod == 2) && (bodymode == 1)) - { + if((here->BSIM4v6rbodyMod == 2) && (bodymode == 1)) + { here->BSIM4v6grbdb = here->BSIM4v6grbsb = model->BSIM4v6gbmin; - here->BSIM4v6grbps = here->BSIM4v6grbpd = 1.0e3; + here->BSIM4v6grbps = here->BSIM4v6grbpd = 1.0e3; if (here->BSIM4v6rbpb < 1.0e-3) here->BSIM4v6grbpb = 1.0e3; else @@ -1707,9 +1707,9 @@ int Size_Not_Found, i; } - /* + /* * Process geomertry dependent parasitics - */ + */ here->BSIM4v6grgeltd = model->BSIM4v6rshg * (here->BSIM4v6xgw + pParam->BSIM4v6weffCJ / 3.0 / here->BSIM4v6ngcon) / @@ -1719,11 +1719,11 @@ int Size_Not_Found, i; here->BSIM4v6grgeltd = 1.0 / here->BSIM4v6grgeltd; else { here->BSIM4v6grgeltd = 1.0e3; /* mho */ - if (here->BSIM4v6rgateMod != 0) + if (here->BSIM4v6rgateMod != 0) printf("Warning: The gate conductance reset to 1.0e3 mho.\n"); } - DMCGeff = model->BSIM4v6dmcg - model->BSIM4v6dmcgt; + DMCGeff = model->BSIM4v6dmcg - model->BSIM4v6dmcgt; DMCIeff = model->BSIM4v6dmci; DMDGeff = model->BSIM4v6dmdg - model->BSIM4v6dmcgt; @@ -1732,41 +1732,41 @@ int Size_Not_Found, i; if(here->BSIM4v6sourcePerimeter == 0.0) here->BSIM4v6Pseff = 0.0; else if (here->BSIM4v6sourcePerimeter < 0.0) - { + { printf("Warning: Source Perimeter is specified as negative, it is set to zero.\n"); here->BSIM4v6Pseff = 0.0; } else - { + { if (model->BSIM4v6perMod == 0) here->BSIM4v6Pseff = here->BSIM4v6sourcePerimeter; else - here->BSIM4v6Pseff = here->BSIM4v6sourcePerimeter + here->BSIM4v6Pseff = here->BSIM4v6sourcePerimeter - pParam->BSIM4v6weffCJ * here->BSIM4v6nf; } } else - BSIM4v6PAeffGeo(here->BSIM4v6nf, here->BSIM4v6geoMod, here->BSIM4v6min, + BSIM4v6PAeffGeo(here->BSIM4v6nf, here->BSIM4v6geoMod, here->BSIM4v6min, pParam->BSIM4v6weffCJ, DMCGeff, DMCIeff, DMDGeff, &(here->BSIM4v6Pseff), &dumPd, &dumAs, &dumAd); if (here->BSIM4v6Pseff < 0.0) /*4.6.2*/ here->BSIM4v6Pseff = 0.0; - + if (here->BSIM4v6drainPerimeterGiven) - { + { if(here->BSIM4v6drainPerimeter == 0.0) here->BSIM4v6Pdeff = 0.0; else if (here->BSIM4v6drainPerimeter < 0.0) - { + { printf("Warning: Drain Perimeter is specified as negative, it is set to zero\n"); here->BSIM4v6Pdeff = 0.0; } else - { + { if (model->BSIM4v6perMod == 0) here->BSIM4v6Pdeff = here->BSIM4v6drainPerimeter; else - here->BSIM4v6Pdeff = here->BSIM4v6drainPerimeter + here->BSIM4v6Pdeff = here->BSIM4v6drainPerimeter - pParam->BSIM4v6weffCJ * here->BSIM4v6nf; } } @@ -1776,7 +1776,7 @@ int Size_Not_Found, i; &dumPs, &(here->BSIM4v6Pdeff), &dumAs, &dumAd); if (here->BSIM4v6Pdeff < 0.0) /*4.6.2*/ here->BSIM4v6Pdeff = 0.0; - + if (here->BSIM4v6sourceAreaGiven) here->BSIM4v6Aseff = here->BSIM4v6sourceArea; else @@ -1789,9 +1789,9 @@ int Size_Not_Found, i; else BSIM4v6PAeffGeo(here->BSIM4v6nf, here->BSIM4v6geoMod, here->BSIM4v6min, pParam->BSIM4v6weffCJ, DMCGeff, DMCIeff, DMDGeff, - &dumPs, &dumPd, &dumAs, &(here->BSIM4v6Adeff)); + &dumPs, &dumPd, &dumAs, &(here->BSIM4v6Adeff)); - /* Processing S/D resistance and conductance below */ + /* Processing S/D resistance and conductance below */ if(here->BSIM4v6sNodePrime != here->BSIM4v6sNode) { here->BSIM4v6sourceConductance = 0.0; @@ -1853,7 +1853,7 @@ int Size_Not_Found, i; { here->BSIM4v6drainConductance = 0.0; } - + /* End of Rsd processing */ @@ -1863,52 +1863,52 @@ int Size_Not_Found, i; } else { SourceSatCurrent = here->BSIM4v6Aseff * model->BSIM4v6SjctTempSatCurDensity - + here->BSIM4v6Pseff * model->BSIM4v6SjctSidewallTempSatCurDensity + + here->BSIM4v6Pseff * model->BSIM4v6SjctSidewallTempSatCurDensity + pParam->BSIM4v6weffCJ * here->BSIM4v6nf * model->BSIM4v6SjctGateSidewallTempSatCurDensity; } if (SourceSatCurrent > 0.0) { switch(model->BSIM4v6dioMod) { case 0: - if ((model->BSIM4v6bvs / Nvtms) > EXP_THRESHOLD) - here->BSIM4v6XExpBVS = model->BSIM4v6xjbvs * MIN_EXP; - else - here->BSIM4v6XExpBVS = model->BSIM4v6xjbvs * exp(-model->BSIM4v6bvs / Nvtms); - break; + if ((model->BSIM4v6bvs / Nvtms) > EXP_THRESHOLD) + here->BSIM4v6XExpBVS = model->BSIM4v6xjbvs * MIN_EXP; + else + here->BSIM4v6XExpBVS = model->BSIM4v6xjbvs * exp(-model->BSIM4v6bvs / Nvtms); + break; case 1: - BSIM4v6DioIjthVjmEval(Nvtms, model->BSIM4v6ijthsfwd, SourceSatCurrent, - 0.0, &(here->BSIM4v6vjsmFwd)); + BSIM4v6DioIjthVjmEval(Nvtms, model->BSIM4v6ijthsfwd, SourceSatCurrent, + 0.0, &(here->BSIM4v6vjsmFwd)); here->BSIM4v6IVjsmFwd = SourceSatCurrent * exp(here->BSIM4v6vjsmFwd / Nvtms); break; case 2: if ((model->BSIM4v6bvs / Nvtms) > EXP_THRESHOLD) { here->BSIM4v6XExpBVS = model->BSIM4v6xjbvs * MIN_EXP; - tmp = MIN_EXP; - } + tmp = MIN_EXP; + } else - { here->BSIM4v6XExpBVS = exp(-model->BSIM4v6bvs / Nvtms); - tmp = here->BSIM4v6XExpBVS; - here->BSIM4v6XExpBVS *= model->BSIM4v6xjbvs; - } + { here->BSIM4v6XExpBVS = exp(-model->BSIM4v6bvs / Nvtms); + tmp = here->BSIM4v6XExpBVS; + here->BSIM4v6XExpBVS *= model->BSIM4v6xjbvs; + } - BSIM4v6DioIjthVjmEval(Nvtms, model->BSIM4v6ijthsfwd, SourceSatCurrent, - here->BSIM4v6XExpBVS, &(here->BSIM4v6vjsmFwd)); - T0 = exp(here->BSIM4v6vjsmFwd / Nvtms); + BSIM4v6DioIjthVjmEval(Nvtms, model->BSIM4v6ijthsfwd, SourceSatCurrent, + here->BSIM4v6XExpBVS, &(here->BSIM4v6vjsmFwd)); + T0 = exp(here->BSIM4v6vjsmFwd / Nvtms); here->BSIM4v6IVjsmFwd = SourceSatCurrent * (T0 - here->BSIM4v6XExpBVS / T0 - + here->BSIM4v6XExpBVS - 1.0); - here->BSIM4v6SslpFwd = SourceSatCurrent - * (T0 + here->BSIM4v6XExpBVS / T0) / Nvtms; + + here->BSIM4v6XExpBVS - 1.0); + here->BSIM4v6SslpFwd = SourceSatCurrent + * (T0 + here->BSIM4v6XExpBVS / T0) / Nvtms; - T2 = model->BSIM4v6ijthsrev / SourceSatCurrent; - if (T2 < 1.0) - { T2 = 10.0; - fprintf(stderr, "Warning: ijthsrev too small and set to 10 times IsbSat.\n"); - } + T2 = model->BSIM4v6ijthsrev / SourceSatCurrent; + if (T2 < 1.0) + { T2 = 10.0; + fprintf(stderr, "Warning: ijthsrev too small and set to 10 times IsbSat.\n"); + } here->BSIM4v6vjsmRev = -model->BSIM4v6bvs - - Nvtms * log((T2 - 1.0) / model->BSIM4v6xjbvs); - T1 = model->BSIM4v6xjbvs * exp(-(model->BSIM4v6bvs - + here->BSIM4v6vjsmRev) / Nvtms); - here->BSIM4v6IVjsmRev = SourceSatCurrent * (1.0 + T1); + - Nvtms * log((T2 - 1.0) / model->BSIM4v6xjbvs); + T1 = model->BSIM4v6xjbvs * exp(-(model->BSIM4v6bvs + + here->BSIM4v6vjsmRev) / Nvtms); + here->BSIM4v6IVjsmRev = SourceSatCurrent * (1.0 + T1); here->BSIM4v6SslpRev = -SourceSatCurrent * T1 / Nvtms; break; default: @@ -1917,12 +1917,12 @@ int Size_Not_Found, i; } Nvtmd = model->BSIM4v6vtm * model->BSIM4v6DjctEmissionCoeff; - if ((here->BSIM4v6Adeff <= 0.0) && (here->BSIM4v6Pdeff <= 0.0)) + if ((here->BSIM4v6Adeff <= 0.0) && (here->BSIM4v6Pdeff <= 0.0)) { DrainSatCurrent = 0.0; } else { DrainSatCurrent = here->BSIM4v6Adeff * model->BSIM4v6DjctTempSatCurDensity - + here->BSIM4v6Pdeff * model->BSIM4v6DjctSidewallTempSatCurDensity + + here->BSIM4v6Pdeff * model->BSIM4v6DjctSidewallTempSatCurDensity + pParam->BSIM4v6weffCJ * here->BSIM4v6nf * model->BSIM4v6DjctGateSidewallTempSatCurDensity; } @@ -1959,7 +1959,7 @@ int Size_Not_Found, i; * (T0 + here->BSIM4v6XExpBVD / T0) / Nvtmd; T2 = model->BSIM4v6ijthdrev / DrainSatCurrent; - if (T2 < 1.0) + if (T2 < 1.0) { T2 = 10.0; fprintf(stderr, "Warning: ijthdrev too small and set to 10 times IdbSat.\n"); } @@ -1975,8 +1975,8 @@ int Size_Not_Found, i; } } - /* GEDL current reverse bias */ - T0 = (TRatio - 1.0); + /* GEDL current reverse bias */ + T0 = (TRatio - 1.0); model->BSIM4v6njtsstemp = model->BSIM4v6njts * (1.0 + model->BSIM4v6tnjts * T0); model->BSIM4v6njtsswstemp = model->BSIM4v6njtssw * (1.0 + model->BSIM4v6tnjtssw * T0); model->BSIM4v6njtsswgstemp = model->BSIM4v6njtsswg * (1.0 + model->BSIM4v6tnjtsswg * T0); @@ -1996,59 +1996,59 @@ int Size_Not_Found, i; DEXP(T9, T5); T9 = model->BSIM4v6xtsswgd * T7; DEXP(T9, T6); - /*IBM TAT*/ - if(model->BSIM4v6jtweff < 0.0) - { model->BSIM4v6jtweff = 0.0; - fprintf(stderr, "TAT width dependence effect is negative. Jtweff is clamped to zero.\n"); - } - T11 = sqrt(model->BSIM4v6jtweff / pParam->BSIM4v6weffCJ) + 1.0; + /*IBM TAT*/ + if(model->BSIM4v6jtweff < 0.0) + { model->BSIM4v6jtweff = 0.0; + fprintf(stderr, "TAT width dependence effect is negative. Jtweff is clamped to zero.\n"); + } + T11 = sqrt(model->BSIM4v6jtweff / pParam->BSIM4v6weffCJ) + 1.0; - T10 = pParam->BSIM4v6weffCJ * here->BSIM4v6nf; - here->BSIM4v6SjctTempRevSatCur = T1 * here->BSIM4v6Aseff * model->BSIM4v6jtss; - here->BSIM4v6DjctTempRevSatCur = T2 * here->BSIM4v6Adeff * model->BSIM4v6jtsd; - here->BSIM4v6SswTempRevSatCur = T3 * here->BSIM4v6Pseff * model->BSIM4v6jtssws; - here->BSIM4v6DswTempRevSatCur = T4 * here->BSIM4v6Pdeff * model->BSIM4v6jtsswd; - here->BSIM4v6SswgTempRevSatCur = T5 * T10 * T11 * model->BSIM4v6jtsswgs; - here->BSIM4v6DswgTempRevSatCur = T6 * T10 * T11 * model->BSIM4v6jtsswgd; + T10 = pParam->BSIM4v6weffCJ * here->BSIM4v6nf; + here->BSIM4v6SjctTempRevSatCur = T1 * here->BSIM4v6Aseff * model->BSIM4v6jtss; + here->BSIM4v6DjctTempRevSatCur = T2 * here->BSIM4v6Adeff * model->BSIM4v6jtsd; + here->BSIM4v6SswTempRevSatCur = T3 * here->BSIM4v6Pseff * model->BSIM4v6jtssws; + here->BSIM4v6DswTempRevSatCur = T4 * here->BSIM4v6Pdeff * model->BSIM4v6jtsswd; + here->BSIM4v6SswgTempRevSatCur = T5 * T10 * T11 * model->BSIM4v6jtsswgs; + here->BSIM4v6DswgTempRevSatCur = T6 * T10 * T11 * model->BSIM4v6jtsswgd; - /*high k*/ - /*Calculate VgsteffVth for mobMod=3*/ - if(model->BSIM4v6mobMod==3) - { /*Calculate n @ Vbs=Vds=0*/ + /*high k*/ + /*Calculate VgsteffVth for mobMod=3*/ + if(model->BSIM4v6mobMod==3) + { /*Calculate n @ Vbs=Vds=0*/ V0 = pParam->BSIM4v6vbi - pParam->BSIM4v6phi; - lt1 = model->BSIM4v6factor1* pParam->BSIM4v6sqrtXdep0; - ltw = lt1; - T0 = pParam->BSIM4v6dvt1 * pParam->BSIM4v6leff / lt1; - if (T0 < EXP_THRESHOLD) - { - T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - Theta0 = T1 / T4; - } - else - Theta0 = 1.0 / (MAX_EXP - 2.0); - - tmp1 = epssub / pParam->BSIM4v6Xdep0; - here->BSIM4v6nstar = model->BSIM4v6vtm / Charge_q * - (model->BSIM4v6coxe + tmp1 + pParam->BSIM4v6cit); - tmp2 = pParam->BSIM4v6nfactor * tmp1; - tmp3 = (tmp2 + pParam->BSIM4v6cdsc * Theta0 + pParam->BSIM4v6cit) / model->BSIM4v6coxe; - 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 * model->BSIM4v6vtm; - T1 = pParam->BSIM4v6voffcbn; - T2 = T1/T0; - if (T2 < -EXP_THRESHOLD) + lt1 = model->BSIM4v6factor1* pParam->BSIM4v6sqrtXdep0; + ltw = lt1; + T0 = pParam->BSIM4v6dvt1 * pParam->BSIM4v6leff / lt1; + if (T0 < EXP_THRESHOLD) + { + T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXP; + Theta0 = T1 / T4; + } + else + Theta0 = 1.0 / (MAX_EXP - 2.0); + + tmp1 = epssub / pParam->BSIM4v6Xdep0; + here->BSIM4v6nstar = model->BSIM4v6vtm / Charge_q * + (model->BSIM4v6coxe + tmp1 + pParam->BSIM4v6cit); + tmp2 = pParam->BSIM4v6nfactor * tmp1; + tmp3 = (tmp2 + pParam->BSIM4v6cdsc * Theta0 + pParam->BSIM4v6cit) / model->BSIM4v6coxe; + 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 * model->BSIM4v6vtm; + T1 = pParam->BSIM4v6voffcbn; + T2 = T1/T0; + if (T2 < -EXP_THRESHOLD) { T3 = model->BSIM4v6coxe * MIN_EXP / pParam->BSIM4v6cdep0; - T4 = pParam->BSIM4v6mstar + T3 * n0; + T4 = pParam->BSIM4v6mstar + T3 * n0; } else if (T2 > EXP_THRESHOLD) { T3 = model->BSIM4v6coxe * MAX_EXP / pParam->BSIM4v6cdep0; @@ -2056,133 +2056,133 @@ int Size_Not_Found, i; } else { T3 = exp(T2)* model->BSIM4v6coxe / pParam->BSIM4v6cdep0; - T4 = pParam->BSIM4v6mstar + T3 * n0; - + T4 = pParam->BSIM4v6mstar + T3 * n0; + } - pParam->BSIM4v6VgsteffVth = T0 * log(2.0)/T4; - - } - + pParam->BSIM4v6VgsteffVth = T0 * log(2.0)/T4; + + } + if(model->BSIM4v6mtrlMod) - { - /* Calculate TOXP from EOT */ - /* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */ + { + /* Calculate TOXP from EOT */ + /* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */ Vtm0eot = KboQ * model->BSIM4v6tempeot; - Vtmeot = Vtm0eot; - vbieot = Vtm0eot * log(pParam->BSIM4v6nsd - * pParam->BSIM4v6ndep / (ni * ni)); - phieot = Vtm0eot * log(pParam->BSIM4v6ndep / ni) - + pParam->BSIM4v6phin + 0.4; - tmp2 = here->BSIM4v6vfb + phieot; - vddeot = model->BSIM4v6type * model->BSIM4v6vddeot; - T0 = model->BSIM4v6epsrgate * EPS0; - if ((pParam->BSIM4v6ngate > 1.0e18) && (pParam->BSIM4v6ngate < 1.0e25) - && (vddeot > tmp2) && (T0!=0)) - { - T1 = 1.0e6 * CHARGE * T0 * pParam->BSIM4v6ngate / - (model->BSIM4v6coxe * model->BSIM4v6coxe); - T8 = vddeot - tmp2; - T4 = sqrt(1.0 + 2.0 * T8 / T1); - T2 = 2.0 * T8 / (T4 + 1.0); - T3 = 0.5 * T2 * T2 / T1; - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - Vgs_eff = vddeot - T5; - } - else - Vgs_eff = vddeot; - - /* Calculate Vth @ Vds=Vbs=0 */ - - V0 = vbieot - phieot; - lt1 = model->BSIM4v6factor1* pParam->BSIM4v6sqrtXdep0; - ltw = lt1; - T0 = pParam->BSIM4v6dvt1 * model->BSIM4v6leffeot / lt1; - if (T0 < EXP_THRESHOLD) - { - T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - Theta0 = T1 / T4; - } - else - Theta0 = 1.0 / (MAX_EXP - 2.0); - Delt_vth = pParam->BSIM4v6dvt0 * Theta0 * V0; - T0 = pParam->BSIM4v6dvt1w * model->BSIM4v6weffeot * model->BSIM4v6leffeot / ltw; - if (T0 < EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXP; - T5 = T1 / T4; - } - else - T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ - T2 = pParam->BSIM4v6dvt0w * T5 * V0; - TempRatioeot = model->BSIM4v6tempeot / model->BSIM4v6tnom - 1.0; - T0 = sqrt(1.0 + pParam->BSIM4v6lpe0 / model->BSIM4v6leffeot); - T1 = pParam->BSIM4v6k1ox * (T0 - 1.0) * sqrt(phieot) - + (pParam->BSIM4v6kt1 + pParam->BSIM4v6kt1l / model->BSIM4v6leffeot) * TempRatioeot; - Vth_NarrowW = toxe * phieot - / (model->BSIM4v6weffeot + pParam->BSIM4v6w0); - Lpe_Vb = sqrt(1.0 + pParam->BSIM4v6lpeb / model->BSIM4v6leffeot); - Vth = model->BSIM4v6type * here->BSIM4v6vth0 + - (pParam->BSIM4v6k1ox - pParam->BSIM4v6k1)*sqrt(phieot)*Lpe_Vb - - Delt_vth - T2 + pParam->BSIM4v6k3 * Vth_NarrowW + T1; - - /* Calculate n */ - tmp1 = epssub / pParam->BSIM4v6Xdep0; - here->BSIM4v6nstar = Vtmeot / Charge_q * - (model->BSIM4v6coxe + tmp1 + pParam->BSIM4v6cit); - tmp2 = pParam->BSIM4v6nfactor * tmp1; - tmp3 = (tmp2 + pParam->BSIM4v6cdsc * Theta0 + pParam->BSIM4v6cit) / model->BSIM4v6coxe; - if (tmp3 >= -0.5) - n = 1.0 + tmp3; - else - { - T0 = 1.0 / (3.0 + 8.0 * tmp3); - n = (1.0 + 3.0 * tmp3) * T0; - } - - /* Vth correction for Pocket implant */ - if (pParam->BSIM4v6dvtp0 > 0.0) - { - T3 = model->BSIM4v6leffeot + pParam->BSIM4v6dvtp0 * 2.0; - if (model->BSIM4v6tempMod < 2) - T4 = Vtmeot * log(model->BSIM4v6leffeot / T3); - else - T4 = Vtm0eot * log(model->BSIM4v6leffeot / T3); - Vth -= n * T4; - } - Vgsteff = Vgs_eff-Vth; - /* calculating Toxp */ - T3 = model->BSIM4v6type * here->BSIM4v6vth0 + Vtmeot = Vtm0eot; + vbieot = Vtm0eot * log(pParam->BSIM4v6nsd + * pParam->BSIM4v6ndep / (ni * ni)); + phieot = Vtm0eot * log(pParam->BSIM4v6ndep / ni) + + pParam->BSIM4v6phin + 0.4; + tmp2 = here->BSIM4v6vfb + phieot; + vddeot = model->BSIM4v6type * model->BSIM4v6vddeot; + T0 = model->BSIM4v6epsrgate * EPS0; + if ((pParam->BSIM4v6ngate > 1.0e18) && (pParam->BSIM4v6ngate < 1.0e25) + && (vddeot > tmp2) && (T0!=0)) + { + T1 = 1.0e6 * CHARGE * T0 * pParam->BSIM4v6ngate / + (model->BSIM4v6coxe * model->BSIM4v6coxe); + T8 = vddeot - tmp2; + T4 = sqrt(1.0 + 2.0 * T8 / T1); + T2 = 2.0 * T8 / (T4 + 1.0); + T3 = 0.5 * T2 * T2 / T1; + T7 = 1.12 - T3 - 0.05; + T6 = sqrt(T7 * T7 + 0.224); + T5 = 1.12 - 0.5 * (T7 + T6); + Vgs_eff = vddeot - T5; + } + else + Vgs_eff = vddeot; + + /* Calculate Vth @ Vds=Vbs=0 */ + + V0 = vbieot - phieot; + lt1 = model->BSIM4v6factor1* pParam->BSIM4v6sqrtXdep0; + ltw = lt1; + T0 = pParam->BSIM4v6dvt1 * model->BSIM4v6leffeot / lt1; + if (T0 < EXP_THRESHOLD) + { + T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXP; + Theta0 = T1 / T4; + } + else + Theta0 = 1.0 / (MAX_EXP - 2.0); + Delt_vth = pParam->BSIM4v6dvt0 * Theta0 * V0; + T0 = pParam->BSIM4v6dvt1w * model->BSIM4v6weffeot * model->BSIM4v6leffeot / ltw; + if (T0 < EXP_THRESHOLD) + { T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXP; + T5 = T1 / T4; + } + else + T5 = 1.0 / (MAX_EXP - 2.0); /* 3.0 * MIN_EXP omitted */ + T2 = pParam->BSIM4v6dvt0w * T5 * V0; + TempRatioeot = model->BSIM4v6tempeot / model->BSIM4v6tnom - 1.0; + T0 = sqrt(1.0 + pParam->BSIM4v6lpe0 / model->BSIM4v6leffeot); + T1 = pParam->BSIM4v6k1ox * (T0 - 1.0) * sqrt(phieot) + + (pParam->BSIM4v6kt1 + pParam->BSIM4v6kt1l / model->BSIM4v6leffeot) * TempRatioeot; + Vth_NarrowW = toxe * phieot + / (model->BSIM4v6weffeot + pParam->BSIM4v6w0); + Lpe_Vb = sqrt(1.0 + pParam->BSIM4v6lpeb / model->BSIM4v6leffeot); + Vth = model->BSIM4v6type * here->BSIM4v6vth0 + + (pParam->BSIM4v6k1ox - pParam->BSIM4v6k1)*sqrt(phieot)*Lpe_Vb + - Delt_vth - T2 + pParam->BSIM4v6k3 * Vth_NarrowW + T1; + + /* Calculate n */ + tmp1 = epssub / pParam->BSIM4v6Xdep0; + here->BSIM4v6nstar = Vtmeot / Charge_q * + (model->BSIM4v6coxe + tmp1 + pParam->BSIM4v6cit); + tmp2 = pParam->BSIM4v6nfactor * tmp1; + tmp3 = (tmp2 + pParam->BSIM4v6cdsc * Theta0 + pParam->BSIM4v6cit) / model->BSIM4v6coxe; + if (tmp3 >= -0.5) + n = 1.0 + tmp3; + else + { + T0 = 1.0 / (3.0 + 8.0 * tmp3); + n = (1.0 + 3.0 * tmp3) * T0; + } + + /* Vth correction for Pocket implant */ + if (pParam->BSIM4v6dvtp0 > 0.0) + { + T3 = model->BSIM4v6leffeot + pParam->BSIM4v6dvtp0 * 2.0; + if (model->BSIM4v6tempMod < 2) + T4 = Vtmeot * log(model->BSIM4v6leffeot / T3); + else + T4 = Vtm0eot * log(model->BSIM4v6leffeot / T3); + Vth -= n * T4; + } + Vgsteff = Vgs_eff-Vth; + /* calculating Toxp */ + T3 = model->BSIM4v6type * here->BSIM4v6vth0 - here->BSIM4v6vfb - phieot; T4 = T3 + T3; T5 = 2.5 * T3; - + 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->BSIM4v6bdos * 0.7 * log(T0)); - Tcen = model->BSIM4v6ados * 1.9e-9 / T1; - toxpf = toxe - epsrox/model->BSIM4v6epsrsub * Tcen; - niter++; - } while ((niter<=4)&&(ABS(toxpf-toxpi)>1e-12)); - model->BSIM4v6toxp = toxpf; - model->BSIM4v6coxp = epsrox * EPS0 / model->BSIM4v6toxp; - } + + niter = 0; + toxpf = toxe; + do + { + toxpi = toxpf; + tmp2 = 2.0e8 * toxpf; + T0 = (Vgsteff + vtfbphi2eot) / tmp2; + T1 = 1.0 + exp(model->BSIM4v6bdos * 0.7 * log(T0)); + Tcen = model->BSIM4v6ados * 1.9e-9 / T1; + toxpf = toxe - epsrox/model->BSIM4v6epsrsub * Tcen; + niter++; + } while ((niter<=4)&&(ABS(toxpf-toxpi)>1e-12)); + model->BSIM4v6toxp = toxpf; + model->BSIM4v6coxp = epsrox * EPS0 / model->BSIM4v6toxp; + } if (BSIM4v6checkModel(model, here, ckt)) {