You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1037 lines
36 KiB

/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
File: b3soipdtemp.c 98/5/01
Modified by Pin Su 99/2/15
Modified by Pin Su 99/4/30
Modified by Pin Su, Wei Jin 99/9/27
Modified by Pin Su 00/3/1
**********/
/* Lmin, Lmax, Wmin, Wmax */
#include "ngspice.h"
#include <stdio.h>
#include <math.h>
#include "smpdefs.h"
#include "cktdefs.h"
#include "b3soipddef.h"
#include "const.h"
#include "sperror.h"
#include "suffix.h"
#define Kb 1.3806226e-23
#define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */
#define EPSOX 3.453133e-11
#define EPSSI 1.03594e-10
#define PI 3.141592654
#define Charge_q 1.60219e-19
#define Eg300 1.115 /* energy gap at 300K */
#define MAX_EXPL 2.688117142e+43
#define MIN_EXPL 3.720075976e-44
#define EXPL_THRESHOLD 100.0
#define DEXP(A,B) { \
if (A > EXPL_THRESHOLD) { \
B = MAX_EXPL*(1.0+(A)-EXPL_THRESHOLD); \
} else if (A < -EXPL_THRESHOLD) { \
B = MIN_EXPL; \
} else { \
B = exp(A); \
} \
}
/* ARGSUSED */
int
B3SOIPDtemp (inModel, ckt)
GENmodel *inModel;
CKTcircuit *ckt;
{
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
register B3SOIPDinstance *here;
struct b3soipdSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam;
double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6, Ldrn, Wdrn;
double Temp, TempRatio, Inv_L, Inv_W, Inv_LW, Dw, Dl, Vtm0, Tnom;
double SDphi, SDgamma;
int Size_Not_Found;
/* v2.0 release */
double tmp3, T7, T8, T9;
/* loop through all the B3SOIPD device models */
for (; model != NULL; model = model->B3SOIPDnextModel)
{
Temp = ckt->CKTtemp;
if (model->B3SOIPDGatesidewallJctPotential < 0.1)
model->B3SOIPDGatesidewallJctPotential = 0.1;
model->pSizeDependParamKnot = NULL;
pLastKnot = NULL;
Tnom = model->B3SOIPDtnom;
TempRatio = Temp / Tnom;
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->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)
* exp (21.5565981 - Eg / (2.0 * model->B3SOIPDvtm));
/* loop through all the instances of the model */
/* MCJ: Length and Width not initialized */
for (here = model->B3SOIPDinstances; here != NULL;
here = here->B3SOIPDnextInstance)
{
here->B3SOIPDrbodyext = here->B3SOIPDbodySquares *
model->B3SOIPDrbsh;
pSizeDependParamKnot = model->pSizeDependParamKnot;
Size_Not_Found = 1;
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;
}
else
{
pLastKnot = pSizeDependParamKnot;
pSizeDependParamKnot = pSizeDependParamKnot->pNext;
}
}
if (Size_Not_Found)
{
pParam =
(struct b3soipdSizeDependParam *)
malloc (sizeof (struct b3soipdSizeDependParam));
if (pLastKnot == NULL)
model->pSizeDependParamKnot = pParam;
else
pLastKnot->pNext = pParam;
pParam->pNext = NULL;
here->pParam = pParam;
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
+ model->B3SOIPDLwl / (T0 * T1);
pParam->B3SOIPDdl = model->B3SOIPDLint + tmp1;
pParam->B3SOIPDdlc = model->B3SOIPDdlc + tmp1;
T2 = pow (Ldrn, model->B3SOIPDWln);
T3 = pow (Wdrn, model->B3SOIPDWwn);
tmp2 = model->B3SOIPDWl / T2 + model->B3SOIPDWw / T3
+ model->B3SOIPDWwl / (T2 * T3);
pParam->B3SOIPDdw = model->B3SOIPDWint + tmp2;
pParam->B3SOIPDdwc = model->B3SOIPDdwc + tmp2;
pParam->B3SOIPDleff = here->B3SOIPDl - 2.0 * pParam->B3SOIPDdl;
if (pParam->B3SOIPDleff <= 0.0)
{
IFuid namarray[2];
namarray[0] = model->B3SOIPDmodName;
namarray[1] = here->B3SOIPDname;
(*(SPfrontEnd->IFerror)) (ERR_FATAL,
"B3SOIPD: mosfet %s, model %s: Effective channel length <= 0",
namarray);
return (E_BADPARM);
}
pParam->B3SOIPDweff =
here->B3SOIPDw - here->B3SOIPDnbc * model->B3SOIPDdwbc -
(2.0 - here->B3SOIPDnbc) * pParam->B3SOIPDdw;
if (pParam->B3SOIPDweff <= 0.0)
{
IFuid namarray[2];
namarray[0] = model->B3SOIPDmodName;
namarray[1] = here->B3SOIPDname;
(*(SPfrontEnd->IFerror)) (ERR_FATAL,
"B3SOIPD: mosfet %s, model %s: Effective channel width <= 0",
namarray);
return (E_BADPARM);
}
pParam->B3SOIPDwdiod =
pParam->B3SOIPDweff / here->B3SOIPDnseg + here->B3SOIPDpdbcp;
pParam->B3SOIPDwdios =
pParam->B3SOIPDweff / here->B3SOIPDnseg + here->B3SOIPDpsbcp;
pParam->B3SOIPDleffCV =
here->B3SOIPDl - 2.0 * pParam->B3SOIPDdlc;
if (pParam->B3SOIPDleffCV <= 0.0)
{
IFuid namarray[2];
namarray[0] = model->B3SOIPDmodName;
namarray[1] = here->B3SOIPDname;
(*(SPfrontEnd->IFerror)) (ERR_FATAL,
"B3SOIPD: mosfet %s, model %s: Effective channel length for C-V <= 0",
namarray);
return (E_BADPARM);
}
pParam->B3SOIPDweffCV =
here->B3SOIPDw - here->B3SOIPDnbc * model->B3SOIPDdwbc -
(2.0 - here->B3SOIPDnbc) * pParam->B3SOIPDdwc;
if (pParam->B3SOIPDweffCV <= 0.0)
{
IFuid namarray[2];
namarray[0] = model->B3SOIPDmodName;
namarray[1] = here->B3SOIPDname;
(*(SPfrontEnd->IFerror)) (ERR_FATAL,
"B3SOIPD: mosfet %s, model %s: Effective channel width for C-V <= 0",
namarray);
return (E_BADPARM);
}
pParam->B3SOIPDwdiodCV =
pParam->B3SOIPDweffCV / here->B3SOIPDnseg +
here->B3SOIPDpdbcp;
pParam->B3SOIPDwdiosCV =
pParam->B3SOIPDweffCV / here->B3SOIPDnseg +
here->B3SOIPDpsbcp;
pParam->B3SOIPDleffCVb =
here->B3SOIPDl - 2.0 * pParam->B3SOIPDdlc -
model->B3SOIPDdlcb;
if (pParam->B3SOIPDleffCVb <= 0.0)
{
IFuid namarray[2];
namarray[0] = model->B3SOIPDmodName;
namarray[1] = here->B3SOIPDname;
(*(SPfrontEnd->IFerror)) (ERR_FATAL,
"B3SOIPD: mosfet %s, model %s: Effective channel length for C-V (body) <= 0",
namarray);
return (E_BADPARM);
}
pParam->B3SOIPDleffCVbg =
pParam->B3SOIPDleffCVb + 2 * model->B3SOIPDdlbg;
if (pParam->B3SOIPDleffCVbg <= 0.0)
{
IFuid namarray[2];
namarray[0] = model->B3SOIPDmodName;
namarray[1] = here->B3SOIPDname;
(*(SPfrontEnd->IFerror)) (ERR_FATAL,
"B3SOIPD: mosfet %s, model %s: Effective channel length for C-V (backgate) <= 0",
namarray);
return (E_BADPARM);
}
/* 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;
/* 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;
pParam->B3SOIPDabulkCVfactor =
1.0 + pow ((pParam->B3SOIPDclc / pParam->B3SOIPDleff),
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;
/* Added for binning - END */
T0 = (TempRatio - 1.0);
pParam->B3SOIPDuatemp = pParam->B3SOIPDua; /* save ua, ub, and uc for b3soild.c */
pParam->B3SOIPDubtemp = pParam->B3SOIPDub;
pParam->B3SOIPDuctemp = pParam->B3SOIPDuc;
pParam->B3SOIPDrds0denom =
pow (pParam->B3SOIPDweff * 1E6, pParam->B3SOIPDwr);
/* v2.2 release */
pParam->B3SOIPDrth =
here->B3SOIPDrth0 / (pParam->B3SOIPDweff +
model->B3SOIPDwth0) * here->B3SOIPDnseg;
pParam->B3SOIPDcth =
here->B3SOIPDcth0 * (pParam->B3SOIPDweff +
model->B3SOIPDwth0) / here->B3SOIPDnseg;
pParam->B3SOIPDrbody =
model->B3SOIPDrbody * model->B3SOIPDrhalo / (2 *
model->
B3SOIPDrbody +
model->
B3SOIPDrhalo *
pParam->
B3SOIPDleff) *
pParam->B3SOIPDweff / here->B3SOIPDnseg;
pParam->B3SOIPDoxideRatio =
pow (model->B3SOIPDtoxref / model->B3SOIPDtoxqm,
model->B3SOIPDntox) / model->B3SOIPDtoxqm /
model->B3SOIPDtoxqm;
/* 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->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 (pParam->B3SOIPDweff * 1E6,
pParam->B3SOIPDwr);
if (B3SOIPDcheckModel (model, here, ckt))
{
IFuid namarray[2];
namarray[0] = model->B3SOIPDmodName;
namarray[1] = here->B3SOIPDname;
(*(SPfrontEnd->IFerror)) (ERR_FATAL,
"Fatal error(s) detected during B3SOIPDV3 parameter checking for %s in model %s",
namarray);
return (E_BADPARM);
}
pParam->B3SOIPDcgdo = (model->B3SOIPDcgdo + pParam->B3SOIPDcf)
* pParam->B3SOIPDwdiodCV;
pParam->B3SOIPDcgso = (model->B3SOIPDcgso + pParam->B3SOIPDcf)
* pParam->B3SOIPDwdiosCV;
pParam->B3SOIPDcgeo = model->B3SOIPDcgeo
* pParam->B3SOIPDleffCV;
if (!model->B3SOIPDnpeakGiven && model->B3SOIPDgamma1Given)
{
T0 = pParam->B3SOIPDgamma1 * model->B3SOIPDcox;
pParam->B3SOIPDnpeak = 3.021E22 * T0 * T0;
}
T4 = Eg300 / model->B3SOIPDvtm * (TempRatio - 1.0);
T7 = model->B3SOIPDxbjt * T4 / pParam->B3SOIPDndiode;
DEXP (T7, T0);
T7 = model->B3SOIPDxdif * T4 / pParam->B3SOIPDndiode;
DEXP (T7, T1);
T7 = model->B3SOIPDxrec * T4 / pParam->B3SOIPDnrecf0;
DEXP (T7, T2);
pParam->B3SOIPDahli = pParam->B3SOIPDahli * T0;
pParam->B3SOIPDjbjt = pParam->B3SOIPDisbjt * T0;
pParam->B3SOIPDjdif = pParam->B3SOIPDisdif * T1;
pParam->B3SOIPDjrec = pParam->B3SOIPDisrec * T2;
T7 = model->B3SOIPDxtun * (TempRatio - 1);
DEXP (T7, T0);
pParam->B3SOIPDjtun = pParam->B3SOIPDistun * T0;
if (pParam->B3SOIPDnsub > 0)
pParam->B3SOIPDvfbb =
-model->B3SOIPDtype * model->B3SOIPDvtm *
log (pParam->B3SOIPDnpeak / pParam->B3SOIPDnsub);
else
pParam->B3SOIPDvfbb =
-model->B3SOIPDtype * model->B3SOIPDvtm *
log (-pParam->B3SOIPDnpeak * pParam->B3SOIPDnsub / ni / ni);
if (!model->B3SOIPDvsdfbGiven)
{
if (pParam->B3SOIPDnsub > 0)
pParam->B3SOIPDvsdfb =
-model->B3SOIPDtype * (model->B3SOIPDvtm *
log (1e20 * pParam->B3SOIPDnsub /
ni / ni) - 0.3);
else if (pParam->B3SOIPDnsub < 0)
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;
if (!model->B3SOIPDvsdthGiven)
{
if (((pParam->B3SOIPDnsub > 0) && (model->B3SOIPDtype > 0))
|| ((pParam->B3SOIPDnsub < 0)
&& (model->B3SOIPDtype < 0)))
pParam->B3SOIPDvsdth =
pParam->B3SOIPDvsdfb + SDphi + SDgamma * sqrt (SDphi);
else
pParam->B3SOIPDvsdth =
pParam->B3SOIPDvsdfb - SDphi - SDgamma * sqrt (SDphi);
}
if (!model->B3SOIPDcsdminGiven)
{
/* Cdmin */
tmp = sqrt (2.0 * EPSSI * SDphi / (Charge_q *
fabs (pParam->
B3SOIPDnsub) *
1.0e6));
tmp1 = EPSSI / tmp;
model->B3SOIPDcsdmin = tmp1 * model->B3SOIPDcbox /
(tmp1 + model->B3SOIPDcbox);
}
T0 = model->B3SOIPDcsdesw * log (1 + model->B3SOIPDtsi /
model->B3SOIPDtbox);
T1 = here->B3SOIPDsourcePerimeter - here->B3SOIPDw;
if (T1 > 0.0)
pParam->B3SOIPDcsesw = T0 * T1;
else
pParam->B3SOIPDcsesw = 0.0;
T1 = here->B3SOIPDdrainPerimeter - here->B3SOIPDw;
if (T1 > 0.0)
pParam->B3SOIPDcdesw = T0 * T1;
else
pParam->B3SOIPDcdesw = 0.0;
pParam->B3SOIPDphi = 2.0 * model->B3SOIPDvtm
* log (pParam->B3SOIPDnpeak / ni);
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->B3SOIPDsqrtXdep0 = sqrt (pParam->B3SOIPDXdep0);
pParam->B3SOIPDlitl = sqrt (3.0 * model->B3SOIPDxj
* model->B3SOIPDtox);
pParam->B3SOIPDvbi = model->B3SOIPDvtm * log (1.0e20
*
pParam->
B3SOIPDnpeak /
(ni * ni));
pParam->B3SOIPDcdep0 =
sqrt (Charge_q * EPSSI * 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");
pParam->B3SOIPDk1 = 0.53;
}
if (!model->B3SOIPDk2Given)
{
fprintf (stdout,
"Warning: k2 should be specified with k1.\n");
pParam->B3SOIPDk2 = -0.0186;
}
if (model->B3SOIPDxtGiven)
fprintf (stdout,
"Warning: xt is ignored because k1 or k2 is given.\n");
if (model->B3SOIPDvbxGiven)
fprintf (stdout,
"Warning: vbx is ignored because k1 or k2 is given.\n");
if (model->B3SOIPDvbmGiven)
fprintf (stdout,
"Warning: vbm is ignored because k1 or k2 is given.\n");
if (model->B3SOIPDgamma1Given)
fprintf (stdout,
"Warning: gamma1 is ignored because k1 or k2 is given.\n");
if (model->B3SOIPDgamma2Given)
fprintf (stdout,
"Warning: gamma2 is ignored because k1 or k2 is given.\n");
}
else
{
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->B3SOIPDvbm = -pParam->B3SOIPDvbm;
if (!model->B3SOIPDgamma1Given)
pParam->B3SOIPDgamma1 = 5.753e-12
* sqrt (pParam->B3SOIPDnpeak) / model->B3SOIPDcox;
if (!model->B3SOIPDgamma2Given)
pParam->B3SOIPDgamma2 = 5.753e-12
* sqrt (pParam->B3SOIPDnsub) / model->B3SOIPDcox;
T0 = pParam->B3SOIPDgamma1 - pParam->B3SOIPDgamma2;
T1 = sqrt (pParam->B3SOIPDphi - pParam->B3SOIPDvbx)
- pParam->B3SOIPDsqrtPhi;
T2 = sqrt (pParam->B3SOIPDphi * (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);
}
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 ((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 * pParam->B3SOIPDsqrtPhi;
}
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);
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;
}
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)))
{
T0 = pParam->B3SOIPDvsdth - pParam->B3SOIPDvsdfb;
pParam->B3SOIPDsdt1 =
pParam->B3SOIPDvsdfb + model->B3SOIPDasd * T0;
T1 = here->B3SOIPDcsbox - here->B3SOIPDcsmin;
T2 = T1 / T0 / T0;
pParam->B3SOIPDst2 = T2 / model->B3SOIPDasd;
pParam->B3SOIPDst3 = T2 / (1 - model->B3SOIPDasd);
here->B3SOIPDst4 = T0 * T1 * (1 + model->B3SOIPDasd) / 3
- here->B3SOIPDcsmin * pParam->B3SOIPDvsdfb;
T1 = here->B3SOIPDcdbox - here->B3SOIPDcdmin;
T2 = T1 / T0 / T0;
pParam->B3SOIPDdt2 = T2 / model->B3SOIPDasd;
pParam->B3SOIPDdt3 = T2 / (1 - model->B3SOIPDasd);
here->B3SOIPDdt4 = T0 * T1 * (1 + model->B3SOIPDasd) / 3
- here->B3SOIPDcdmin * pParam->B3SOIPDvsdfb;
}
else
{
T0 = pParam->B3SOIPDvsdfb - pParam->B3SOIPDvsdth;
pParam->B3SOIPDsdt1 =
pParam->B3SOIPDvsdth + model->B3SOIPDasd * T0;
T1 = here->B3SOIPDcsmin - here->B3SOIPDcsbox;
T2 = T1 / T0 / T0;
pParam->B3SOIPDst2 = T2 / model->B3SOIPDasd;
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;
}
here->B3SOIPDphi = pParam->B3SOIPDphi;
/* process source/drain series resistance */
here->B3SOIPDdrainConductance = model->B3SOIPDsheetResistance
* here->B3SOIPDdrainSquares;
if (here->B3SOIPDdrainConductance > 0.0)
here->B3SOIPDdrainConductance = 1.0
/ here->B3SOIPDdrainConductance;
else
here->B3SOIPDdrainConductance = 0.0;
here->B3SOIPDsourceConductance = model->B3SOIPDsheetResistance
* here->B3SOIPDsourceSquares;
if (here->B3SOIPDsourceConductance > 0.0)
here->B3SOIPDsourceConductance = 1.0
/ here->B3SOIPDsourceConductance;
else
here->B3SOIPDsourceConductance = 0.0;
here->B3SOIPDcgso = pParam->B3SOIPDcgso;
here->B3SOIPDcgdo = pParam->B3SOIPDcgdo;
/* v2.0 release */
if (model->B3SOIPDln < 1e-15)
model->B3SOIPDln = 1e-15;
T0 =
-0.5 * pParam->B3SOIPDleff * pParam->B3SOIPDleff /
model->B3SOIPDln / model->B3SOIPDln;
DEXP (T0, T1);
pParam->B3SOIPDarfabjt = T1;
T0 =
pParam->B3SOIPDlbjt0 * (1.0 / pParam->B3SOIPDleff +
1.0 / model->B3SOIPDln);
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;
/* vfbzb calculation for capMod 3 */
tmp = sqrt (pParam->B3SOIPDXdep0);
tmp1 = pParam->B3SOIPDvbi - pParam->B3SOIPDphi;
tmp2 = model->B3SOIPDfactor1 * tmp;
T0 = -0.5 * pParam->B3SOIPDdvt1w * pParam->B3SOIPDweff
* pParam->B3SOIPDleff / tmp2;
if (T0 > -EXPL_THRESHOLD)
{
T1 = exp (T0);
T2 = T1 * (1.0 + 2.0 * T1);
}
else
{
T1 = MIN_EXPL;
T2 = T1 * (1.0 + 2.0 * T1);
}
T0 = pParam->B3SOIPDdvt0w * T2;
T2 = T0 * tmp1;
T0 = -0.5 * pParam->B3SOIPDdvt1 * pParam->B3SOIPDleff / tmp2;
if (T0 > -EXPL_THRESHOLD)
{
T1 = exp (T0);
T3 = T1 * (1.0 + 2.0 * T1);
}
else
{
T1 = MIN_EXPL;
T3 = T1 * (1.0 + 2.0 * T1);
}
T3 = pParam->B3SOIPDdvt0 * T3 * tmp1;
T4 = model->B3SOIPDtox * pParam->B3SOIPDphi
/ (pParam->B3SOIPDweff + pParam->B3SOIPDw0);
T0 = sqrt (1.0 + pParam->B3SOIPDnlx / pParam->B3SOIPDleff);
T5 = pParam->B3SOIPDk1eff * (T0 - 1.0) * pParam->B3SOIPDsqrtPhi
+ (pParam->B3SOIPDkt1 + pParam->B3SOIPDkt1l / pParam->B3SOIPDleff)
* (TempRatio - 1.0);
tmp3 = model->B3SOIPDtype * pParam->B3SOIPDvth0
- T2 - T3 + pParam->B3SOIPDk3 * T4 + T5;
pParam->B3SOIPDvfbzb =
tmp3 - pParam->B3SOIPDphi -
pParam->B3SOIPDk1eff * pParam->B3SOIPDsqrtPhi;
/* End of vfbzb */
pParam->B3SOIPDldeb =
sqrt (EPSSI * Vtm0 / (Charge_q * pParam->B3SOIPDnpeak * 1.0e6)) /
3.0;
pParam->B3SOIPDacde =
pParam->B3SOIPDacde * pow ((pParam->B3SOIPDnpeak / 2.0e16),
-0.25);
}
}
return (OK);
}