update to version 4.6.1

This commit is contained in:
dwarning 2007-11-04 19:34:56 +00:00
parent 5ff927f260
commit f4f0949d84
21 changed files with 811 additions and 218 deletions

View File

@ -1,6 +1,6 @@
## Process this file with automake to produce Makefile.in
pkglib_LIBRARIES = libbsim4.a
noinst_LIBRARIES = libbsim4.a
libbsim4_a_SOURCES = \
b4.c \

View File

@ -1,11 +1,12 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
* File: b4.c of BSIM4.6.0.
* File: b4.c of BSIM4.6.1.
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
* Modified by Xuemei Xi, 04/06/2001.
* Modified by Xuemei Xi, 10/05/2001.
@ -13,7 +14,8 @@
* Modified by Xuemei Xi, 05/09/2003.
* Modified by Xuemei Xi, 03/04/2004.
* Modified by Xuemei Xi, Mohan Dunga, 07/29/2005.
* Modified by Mohan Dunga, 12/13/2006
* Modified by Mohan Dunga, 12/13/2006.
* Modified by Mohan Dunga, Wenwei Yang, 05/18/2007.
**********/
#include "ngspice.h"
@ -108,6 +110,7 @@ OP( "gtau", BSIM4_GTAU, IF_REAL, "Gtau"),
};
IFparm BSIM4mPTable[] = { /* model parameters */
IOP( "cvchargemod", BSIM4_MOD_CVCHARGEMOD, IF_INTEGER, "Capacitance Charge model selector"),
IOP( "capmod", BSIM4_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"),
IOP( "diomod", BSIM4_MOD_DIOMOD, IF_INTEGER, "Diode IV model selector"),
IOP( "rdsmod", BSIM4_MOD_RDSMOD, IF_INTEGER, "Bias-dependent S/D resistance model selector"),
@ -120,12 +123,17 @@ IOP( "permod", BSIM4_MOD_PERMOD, IF_INTEGER, "Pd and Ps model selector"),
IOP( "geomod", BSIM4_MOD_GEOMOD, IF_INTEGER, "Geometry dependent parasitics model selector"),
IOP( "fnoimod", BSIM4_MOD_FNOIMOD, IF_INTEGER, "Flicker noise model selector"),
IOP( "tnoimod", BSIM4_MOD_TNOIMOD, IF_INTEGER, "Thermal noise model selector"),
IOP( "mtrlmod", BSIM4_MOD_MTRLMOD, IF_INTEGER, "parameter for non-silicon substrate or metal gate selector"),
IOP( "igcmod", BSIM4_MOD_IGCMOD, IF_INTEGER, "Gate-to-channel Ig model selector"),
IOP( "igbmod", BSIM4_MOD_IGBMOD, IF_INTEGER, "Gate-to-body Ig model selector"),
IOP( "tempmod", BSIM4_MOD_TEMPMOD, IF_INTEGER, "Temperature model selector"),
IOP( "paramchk", BSIM4_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"),
IOP( "binunit", BSIM4_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"),
IOP( "version", BSIM4_MOD_VERSION, IF_STRING, "parameter for model version"),
IOP( "eot", BSIM4_MOD_EOT, IF_REAL, "Equivalent gate oxide thickness in meters"),
IOP( "vddeot", BSIM4_MOD_VDDEOT, IF_REAL, "Voltage for extraction of Equivalent gate oxide thickness"),
IOP( "ados", BSIM4_MOD_ADOS, IF_REAL, "Charge centroid parameter"),
IOP( "bdos", BSIM4_MOD_BDOS, IF_REAL, "Charge centroid parameter"),
IOP( "toxe", BSIM4_MOD_TOXE, IF_REAL, "Electrical gate oxide thickness in meters"),
IOP( "toxp", BSIM4_MOD_TOXP, IF_REAL, "Physical gate oxide thickness in meters"),
IOP( "toxm", BSIM4_MOD_TOXM, IF_REAL, "Gate oxide thickness at which parameters are extracted"),
@ -145,6 +153,14 @@ IOP( "ags", BSIM4_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."),
IOP( "a1", BSIM4_MOD_A1, IF_REAL, "Non-saturation effect coefficient"),
IOP( "a2", BSIM4_MOD_A2, IF_REAL, "Non-saturation effect coefficient"),
IOP( "keta", BSIM4_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."),
IOP( "phig", BSIM4_MOD_PHIG, IF_REAL, "Work function of gate"),
IOP( "epsrgate", BSIM4_MOD_EPSRGATE, IF_REAL, "Dielectric constant of gate relative to vacuum"),
IOP( "easub",BSIM4_MOD_EASUB, IF_REAL, "Electron affinity of substrate"),
IOP( "epsrsub", BSIM4_MOD_EPSRSUB, IF_REAL, "Dielectric constant of substrate relative to vacuum"),
IOP( "ni0sub", BSIM4_MOD_NI0SUB, IF_REAL, "Intrinsic carrier concentration of substrate at 300.15K"),
IOP( "bg0sub", BSIM4_MOD_BG0SUB, IF_REAL, "Band-gap of substrate at T=0K"),
IOP( "tbgasub", BSIM4_MOD_TBGASUB, IF_REAL, "First parameter of band-gap change due to temperature"),
IOP( "tbgbsub", BSIM4_MOD_TBGBSUB, IF_REAL, "Second parameter of band-gap change due to temperature"),
IOP( "nsub", BSIM4_MOD_NSUB, IF_REAL, "Substrate doping concentration"),
IOP( "ndep", BSIM4_MOD_NDEP, IF_REAL, "Channel doping concentration at the depletion edge"),
IOP( "nsd", BSIM4_MOD_NSD, IF_REAL, "S/D doping concentration"),
@ -192,8 +208,10 @@ IOP( "u0", BSIM4_MOD_U0, IF_REAL, "Low-field mobility at Tnom"),
IOP( "eu", BSIM4_MOD_EU, IF_REAL, "Mobility exponent"),
IOP( "ute", BSIM4_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"),
IOP( "voff", BSIM4_MOD_VOFF, IF_REAL, "Threshold voltage offset"),
IOP( "minv", BSIM4_MOD_MINV, IF_REAL, "Fitting parameter for moderate invversion in Vgsteff"),
IOP( "minv", BSIM4_MOD_MINV, IF_REAL, "Fitting parameter for moderate inversion in Vgsteff"),
IOP( "minvcv", BSIM4_MOD_MINVCV, IF_REAL, "Fitting parameter for moderate inversion in Vgsteffcv"),
IOP( "voffl", BSIM4_MOD_VOFFL, IF_REAL, "Length dependence parameter for Vth offset"),
IOP( "voffcvl", BSIM4_MOD_VOFFCVL, IF_REAL, "Length dependence parameter for Vth offset in CV"),
IOP( "tnom", BSIM4_MOD_TNOM, IF_REAL, "Parameter measurement temperature"),
IOP( "cgso", BSIM4_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"),
IOP( "cgdo", BSIM4_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"),
@ -508,6 +526,7 @@ IOP( "lu0", BSIM4_MOD_LU0, IF_REAL, "Length dependence of u0"),
IOP( "lute", BSIM4_MOD_LUTE, IF_REAL, "Length dependence of ute"),
IOP( "lvoff", BSIM4_MOD_LVOFF, IF_REAL, "Length dependence of voff"),
IOP( "lminv", BSIM4_MOD_LMINV, IF_REAL, "Length dependence of minv"),
IOP( "lminvcv", BSIM4_MOD_LMINVCV, IF_REAL, "Length dependence of minvcv"),
IOP( "ldelta", BSIM4_MOD_LDELTA, IF_REAL, "Length dependence of delta"),
IOP( "lrdsw", BSIM4_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "),
IOP( "lrsw", BSIM4_MOD_LRSW, IF_REAL, "Length dependence of rsw"),
@ -654,6 +673,7 @@ IOP( "wu0", BSIM4_MOD_WU0, IF_REAL, "Width dependence of u0"),
IOP( "wute", BSIM4_MOD_WUTE, IF_REAL, "Width dependence of ute"),
IOP( "wvoff", BSIM4_MOD_WVOFF, IF_REAL, "Width dependence of voff"),
IOP( "wminv", BSIM4_MOD_WMINV, IF_REAL, "Width dependence of minv"),
IOP( "wminvcv", BSIM4_MOD_WMINVCV, IF_REAL, "Width dependence of minvcv"),
IOP( "wdelta", BSIM4_MOD_WDELTA, IF_REAL, "Width dependence of delta"),
IOP( "wrdsw", BSIM4_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "),
IOP( "wrsw", BSIM4_MOD_WRSW, IF_REAL, "Width dependence of rsw"),
@ -799,6 +819,7 @@ IOP( "pu0", BSIM4_MOD_PU0, IF_REAL, "Cross-term dependence of u0"),
IOP( "pute", BSIM4_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"),
IOP( "pvoff", BSIM4_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"),
IOP( "pminv", BSIM4_MOD_PMINV, IF_REAL, "Cross-term dependence of minv"),
IOP( "pminvcv", BSIM4_MOD_PMINVCV, IF_REAL, "Cross-term dependence of minvcv"),
IOP( "pdelta", BSIM4_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"),
IOP( "prdsw", BSIM4_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "),
IOP( "prsw", BSIM4_MOD_PRSW, IF_REAL, "Cross-term dependence of rsw"),

View File

@ -1,11 +1,12 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
* File: b4acld.c of BSIM4.6.0.
* File: b4acld.c of BSIM4.6.1.
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
* Modified by Xuemei Xi, 10/05/2001.
**********/
@ -59,7 +60,7 @@ double m;
for (; model != NULL; model = model->BSIM4nextModel)
{ for (here = model->BSIM4instances; here!= NULL;
here = here->BSIM4nextInstance)
{ if (here->BSIM4owner != ARCHme) continue;
{ if (here->BSIM4owner != ARCHme) continue;
pParam = here->pParam;
capbd = here->BSIM4capbd;
capbs = here->BSIM4capbs;
@ -451,7 +452,7 @@ double m;
/*
* Loading AC matrix
*/
m = here->BSIM4m;
m = here->BSIM4m;
if (!model->BSIM4rdsMod)
{ gdpr = here->BSIM4drainConductance;

View File

@ -1,10 +1,12 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
* File: b4ask.c of BSIM4.6.0.
* File: b4ask.c of BSIM4.6.1.
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
* Modified by Xuemei Xi, 04/06/2001.
* Modified by Xuemei Xi, 10/05/2001.

View File

@ -1,11 +1,12 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
* File: b4check.c of BSIM4.6.0.
* File: b4check.c of BSIM4.6.1.
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
* Modified by Xuemei Xi, 04/06/2001.
* Modified by Xuemei Xi, 10/05/2001.
@ -14,6 +15,7 @@
* Modified by Xuemei Xi, 03/04/2004.
* Modified by Xuemei Xi, 07/29/2005.
* Modified by Mohan Dunga, 12/13/2006
* Modified by Mohan Dunga, Wenwei Yang, 05/18/2007.
**********/
#include "ngspice.h"
@ -42,9 +44,9 @@ FILE *fplog;
fprintf(fplog, "\n");
fprintf(fplog, "++++++++++ BSIM4 PARAMETER CHECKING BELOW ++++++++++\n");
if (strcmp(model->BSIM4version, "4.6.0") != 0)
{ fprintf(fplog, "Warning: This model is BSIM4.6.0; you specified a wrong version number.\n");
printf("Warning: This model is BSIM4.6.0; you specified a wrong version number.\n");
if (strcmp(model->BSIM4version, "4.6.1") != 0)
{ fprintf(fplog, "Warning: This model is BSIM4.6.1; you specified a wrong version number.\n");
printf("Warning: This model is BSIM4.6.1; you specified a wrong version number.\n");
}
fprintf(fplog, "Model = %s\n", model->BSIM4modName);
@ -68,6 +70,36 @@ FILE *fplog;
printf("Fatal: Toxp = %g is not positive.\n", model->BSIM4toxp);
Fatal_Flag = 1;
}
if (model->BSIM4eot <= 0.0)
{ fprintf(fplog, "Fatal: EOT = %g is not positive.\n",
model->BSIM4eot);
printf("Fatal: EOT = %g is not positive.\n", model->BSIM4eot);
Fatal_Flag = 1;
}
if (model->BSIM4epsrgate < 0.0)
{ fprintf(fplog, "Fatal: Epsrgate = %g is not positive.\n",
model->BSIM4epsrgate);
printf("Fatal: Epsrgate = %g is not positive.\n", model->BSIM4epsrgate);
Fatal_Flag = 1;
}
if (model->BSIM4epsrsub < 0.0)
{ fprintf(fplog, "Fatal: Epsrsub = %g is not positive.\n",
model->BSIM4epsrsub);
printf("Fatal: Epsrsub = %g is not positive.\n", model->BSIM4epsrsub);
Fatal_Flag = 1;
}
if (model->BSIM4easub < 0.0)
{ fprintf(fplog, "Fatal: Easub = %g is not positive.\n",
model->BSIM4easub);
printf("Fatal: Easub = %g is not positive.\n", model->BSIM4easub);
Fatal_Flag = 1;
}
if (model->BSIM4ni0sub <= 0.0)
{ fprintf(fplog, "Fatal: Ni0sub = %g is not positive.\n",
model->BSIM4ni0sub);
printf("Fatal: Easub = %g is not positive.\n", model->BSIM4ni0sub);
Fatal_Flag = 1;
}
if (model->BSIM4toxm <= 0.0)
{ fprintf(fplog, "Fatal: Toxm = %g is not positive.\n",
@ -636,18 +668,6 @@ FILE *fplog;
}
/* Check capacitance parameters */
if (pParam->BSIM4noff < 0.1)
{ fprintf(fplog, "Warning: Noff = %g is too small.\n",
pParam->BSIM4noff);
printf("Warning: Noff = %g is too small.\n", pParam->BSIM4noff);
}
if (pParam->BSIM4voffcv < -0.5)
{ fprintf(fplog, "Warning: Voffcv = %g is too small.\n",
pParam->BSIM4voffcv);
printf("Warning: Voffcv = %g is too small.\n", pParam->BSIM4voffcv);
}
if (pParam->BSIM4moin < 5.0)
{ fprintf(fplog, "Warning: Moin = %g is too small.\n",
pParam->BSIM4moin);

View File

@ -1,4 +1,4 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
@ -6,6 +6,7 @@
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
* Modified by Xuemei Xi, 04/06/2001.
* Modified by Xuemei Xi, 10/05/2001.

View File

@ -1,11 +1,12 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
* File: b4del.c of BSIM4.6.0.
* File: b4del.c of BSIM4.6.1.
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
**********/

View File

@ -1,11 +1,12 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
* File: b4dest.c of BSIM4.6.0.
* File: b4dest.c of BSIM4.6.1.
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
**********/

View File

@ -1,11 +1,12 @@
/**** BSIM4.6.0 Released by Mohan Dunga 11/17//2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
* File: b4geo.c of BSIM4.6.0.
* File: b4geo.c of BSIM4.6.1.
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
**********/

View File

@ -1,11 +1,12 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
* File: b4getic.c of BSIM4.6.0.
* File: b4getic.c of BSIM4.6.1.
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
**********/

View File

@ -1,19 +1,21 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
* File: b4ld.c of BSIM4.6.0.
* File: b4ld.c of BSIM4.6.1.
* Author: 2000 Weidong Liu
* Authors: 2001- Xuemei Xi, Mohan Dunga, Ali Niknejad, Chenming Hu.
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
* Authors: 2006- Mohan Dunga, Ali Niknejad, Chenming Hu
* Authors: 2007- Mohan Dunga, 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.
* Modified by Xuemei Xi, 11/15/2002.
* Modified by Xuemei Xi, 05/09/2003.
* Modified by Xuemei Xi, 02/06/2004.
* Modified by Xuemei Xi, 03/04/2004.
* Modified by Xuemei Xi, Mohan Dunga, 07/29/2005.
* Modified by Mohan Dunga, 12/13/2006.
* Modified by Mohan Dunga, Wenwei Yang, 05/18/2007.
**********/
#include "ngspice.h"
@ -32,6 +34,7 @@
#define MAX_EXP 5.834617425e14
#define MIN_EXP 1.713908431e-15
#define EXP_THRESHOLD 34.0
#define EPS0 8.85418e-12
#define EPSSI 1.03594e-10
#define Charge_q 1.60219e-19
#define DELTA_1 0.02
@ -52,7 +55,7 @@
} \
}
int BSIM4polyDepletion(double phi, double ngate,double coxe, double Vgs, double *Vgs_eff, double *dVgs_eff_dVg);
int BSIM4polyDepletion(double phi, double ngate,double epsgate, double coxe, double Vgs, double *Vgs_eff, double *dVgs_eff_dVg);
int
BSIM4load(inModel,ckt)
@ -191,7 +194,7 @@ double Nvtmrss, Nvtmrssws, Nvtmrsswgs;
double Nvtmrsd, Nvtmrsswd, Nvtmrsswgd;
double vs, Fsevl, dvs_dVg, dvs_dVd, dvs_dVb, dFsevl_dVg, dFsevl_dVd, dFsevl_dVb;
double vgdx, vgsx;
double vgdx, vgsx, epssub, toxe, epsrox;
struct bsim4SizeDependParam *pParam;
int ByPass, ChargeComputationNeeded, error, Check, Check1, Check2;
@ -964,6 +967,22 @@ for (; model != NULL; model = model->BSIM4nextModel)
Vdb = -vbs;
}
/* dunga */
if(model->BSIM4mtrlMod)
{
epsrox = 3.9;
toxe = model->BSIM4eot;
epssub = EPS0 * model->BSIM4epsrsub;
}
else
{
epsrox = model->BSIM4epsrox;
toxe = model->BSIM4toxe;
epssub = EPSSI;
}
T0 = Vbs - here->BSIM4vbsc - 0.001;
T1 = sqrt(T0 * T0 - 0.004 * here->BSIM4vbsc);
if (T0 >= 0.0)
@ -982,7 +1001,6 @@ for (; model != NULL; model = model->BSIM4nextModel)
T1 = sqrt(T0 * T0 + 0.004 * T9);
Vbseff = T9 - 0.5 * (T0 + T1);
dVbseff_dVb *= 0.5 * (1.0 + T0 / T1);
Phis = pParam->BSIM4phi - Vbseff;
dPhis_dVb = -1.0;
sqrtPhis = sqrt(Phis);
@ -1067,7 +1085,7 @@ for (; model != NULL; model = model->BSIM4nextModel)
T1 = pParam->BSIM4k1ox * (T0 - 1.0) * pParam->BSIM4sqrtPhi
+ (pParam->BSIM4kt1 + pParam->BSIM4kt1l / Leff
+ pParam->BSIM4kt2 * Vbseff) * TempRatio;
Vth_NarrowW = model->BSIM4toxe * pParam->BSIM4phi
Vth_NarrowW = toxe * pParam->BSIM4phi
/ (pParam->BSIM4weff + pParam->BSIM4w0);
T3 = here->BSIM4eta0 + pParam->BSIM4etab * Vbseff;
@ -1097,7 +1115,7 @@ for (; model != NULL; model = model->BSIM4nextModel)
/* Calculate n */
tmp1 = EPSSI / Xdep;
tmp1 = epssub / Xdep;
here->BSIM4nstar = model->BSIM4vtm / Charge_q * (model->BSIM4coxe
+ tmp1 + pParam->BSIM4cit);
tmp2 = pParam->BSIM4nfactor * tmp1;
@ -1156,10 +1174,15 @@ for (; model != NULL; model = model->BSIM4nextModel)
/* Poly Gate Si Depletion Effect */
T0 = here->BSIM4vfb + pParam->BSIM4phi;
if(model->BSIM4mtrlMod == 0)
T1 = EPSSI;
else
T1 = model->BSIM4epsrgate * EPS0;
BSIM4polyDepletion(T0, pParam->BSIM4ngate, model->BSIM4coxe, vgs, &vgs_eff, &dvgs_eff_dvg);
BSIM4polyDepletion(T0, pParam->BSIM4ngate, model->BSIM4coxe, vgd, &vgd_eff, &dvgd_eff_dvg);
BSIM4polyDepletion(T0, pParam->BSIM4ngate, T1, model->BSIM4coxe, vgs, &vgs_eff, &dvgs_eff_dvg);
BSIM4polyDepletion(T0, pParam->BSIM4ngate, T1, model->BSIM4coxe, vgd, &vgd_eff, &dvgd_eff_dvg);
if(here->BSIM4mode>0) {
Vgs_eff = vgs_eff;
@ -1334,53 +1357,57 @@ for (; model != NULL; model = model->BSIM4nextModel)
Abulk0 *= T0;
/* Mobility calculation */
if (model->BSIM4mtrlMod)
T14 = 2.0 * model->BSIM4type *(model->BSIM4phig - model->BSIM4easub - 0.5*model->BSIM4Eg0 + 0.45);
else
T14 = 0.0;
if (model->BSIM4mobMod == 0)
{ T0 = Vgsteff + Vth + Vth;
{ T0 = Vgsteff + Vth + Vth - T14;
T2 = pParam->BSIM4ua + pParam->BSIM4uc * Vbseff;
T3 = T0 / model->BSIM4toxe;
T3 = T0 / toxe;
T12 = sqrt(Vth * Vth + 0.0001);
T9 = 1.0/(Vgsteff + 2*T12);
T10 = T9*model->BSIM4toxe;
T10 = T9*toxe;
T8 = pParam->BSIM4ud * T10 * T10 * Vth;
T6 = T8 * Vth;
T5 = T3 * (T2 + pParam->BSIM4ub * T3) + T6;
T7 = - 2.0 * T6 * T9;
T11 = T7 * Vth/T12;
dDenomi_dVg = (T2 + 2.0 * pParam->BSIM4ub * T3) / model->BSIM4toxe;
dDenomi_dVg = (T2 + 2.0 * pParam->BSIM4ub * T3) / toxe;
T13 = 2.0 * (dDenomi_dVg + T11 + T8);
dDenomi_dVd = T13 * dVth_dVd;
dDenomi_dVb = T13 * dVth_dVb + pParam->BSIM4uc * T3;
dDenomi_dVg+= T7;
}
else if (model->BSIM4mobMod == 1)
{ T0 = Vgsteff + Vth + Vth;
{ T0 = Vgsteff + Vth + Vth - T14;
T2 = 1.0 + pParam->BSIM4uc * Vbseff;
T3 = T0 / model->BSIM4toxe;
T3 = T0 / toxe;
T4 = T3 * (pParam->BSIM4ua + pParam->BSIM4ub * T3);
T12 = sqrt(Vth * Vth + 0.0001);
T9 = 1.0/(Vgsteff + 2*T12);
T10 = T9*model->BSIM4toxe;
T10 = T9*toxe;
T8 = pParam->BSIM4ud * T10 * T10 * Vth;
T6 = T8 * Vth;
T5 = T4 * T2 + T6;
T7 = - 2.0 * T6 * T9;
T11 = T7 * Vth/T12;
dDenomi_dVg = (pParam->BSIM4ua + 2.0 * pParam->BSIM4ub * T3) * T2
/ model->BSIM4toxe;
dDenomi_dVg = (pParam->BSIM4ua + 2.0 * pParam->BSIM4ub * T3) * T2 / toxe;
T13 = 2.0 * (dDenomi_dVg + T11 + T8);
dDenomi_dVd = T13 * dVth_dVd;
dDenomi_dVb = T13 * dVth_dVb + pParam->BSIM4uc * T4;
dDenomi_dVg+= T7;
}
else
{ T0 = (Vgsteff + here->BSIM4vtfbphi1) / model->BSIM4toxe;
{ T0 = (Vgsteff + here->BSIM4vtfbphi1) / toxe;
T1 = exp(pParam->BSIM4eu * log(T0));
dT1_dVg = T1 * pParam->BSIM4eu / T0 / model->BSIM4toxe;
dT1_dVg = T1 * pParam->BSIM4eu / T0 / toxe;
T2 = pParam->BSIM4ua + pParam->BSIM4uc * Vbseff;
T3 = T0 / model->BSIM4toxe;
T3 = T0 / toxe;
T12 = sqrt(Vth * Vth + 0.0001);
T9 = 1.0/(Vgsteff + 2*T12);
T10 = T9*model->BSIM4toxe;
T10 = T9*toxe;
T8 = pParam->BSIM4ud * T10 * T10 * Vth;
T6 = T8 * Vth;
T5 = T1 * T2 + T6;
@ -1625,15 +1652,15 @@ for (; model != NULL; model = model->BSIM4nextModel)
dT0_dVg = 1.0 / tmp2;
T0 = (Vgsteff + tmp1) * dT0_dVg;
tmp3 = exp(0.7 * log(T0));
tmp3 = exp(model->BSIM4bdos * 0.7 * log(T0));
T1 = 1.0 + tmp3;
T2 = 0.7 * tmp3 / T0;
Tcen = 1.9e-9 / T1;
T2 = model->BSIM4bdos * 0.7 * tmp3 / T0;
Tcen = model->BSIM4ados * 1.9e-9 / T1;
dTcen_dVg = -Tcen * T2 * dT0_dVg / T1;
Coxeff = EPSSI * model->BSIM4coxp
/ (EPSSI + model->BSIM4coxp * Tcen);
dCoxeff_dVg = -Coxeff * Coxeff * dTcen_dVg / EPSSI;
Coxeff = epssub * model->BSIM4coxp
/ (epssub + model->BSIM4coxp * Tcen);
dCoxeff_dVg = -Coxeff * Coxeff * dTcen_dVg / epssub;
CoxeffWovL = Coxeff * Weff / Leff;
beta = ueff * CoxeffWovL;
@ -2104,9 +2131,15 @@ for (; model != NULL; model = model->BSIM4nextModel)
/* Calculate GIDL current */
vgs_eff = here->BSIM4vgs_eff;
dvgs_eff_dvg = here->BSIM4dvgs_eff_dvg;
T0 = 3.0 * model->BSIM4toxe;
if(model->BSIM4mtrlMod == 0)
T0 = 3.0 * toxe;
else
T0 = model->BSIM4epsrsub * toxe / epsrox;
T1 = (vds - vgs_eff - pParam->BSIM4egidl ) / T0;
if(model->BSIM4mtrlMod ==0)
T1 = (vds - vgs_eff - pParam->BSIM4egidl ) / T0;
else
T1 = (vds - vgs_eff - pParam->BSIM4egidl + pParam->BSIM4vfbsd) / T0;
if ((pParam->BSIM4agidl <= 0.0) || (pParam->BSIM4bgidl <= 0.0)
|| (T1 <= 0.0) || (pParam->BSIM4cgidl <= 0.0) || (vbd > 0.0))
Igidl = Ggidld = Ggidlg = Ggidlb = 0.0;
@ -2146,7 +2179,10 @@ for (; model != NULL; model = model->BSIM4nextModel)
vgd_eff = here->BSIM4vgd_eff;
dvgd_eff_dvg = here->BSIM4dvgd_eff_dvg;
if(model->BSIM4mtrlMod ==0)
T1 = (-vds - vgd_eff - pParam->BSIM4egisl ) / T0;
else
T1 = (-vds - vgd_eff - pParam->BSIM4egisl + pParam->BSIM4vfbsd ) / T0;
if ((pParam->BSIM4agisl <= 0.0) || (pParam->BSIM4bgisl <= 0.0)
|| (T1 <= 0.0) || (pParam->BSIM4cgisl <= 0.0) || (vbs > 0.0))
@ -2311,7 +2347,7 @@ for (; model != NULL; model = model->BSIM4nextModel)
dPigcd_dVg = dPigcd_dVd = dPigcd_dVb = 0.0;
}
else
{ T11 = pParam->BSIM4Bechvb * model->BSIM4toxe;
{ T11 = pParam->BSIM4Bechvb * toxe;
T12 = Vgsteff + 1.0e-20;
T13 = T11 / T12 / T12;
T14 = -T13 / T12;
@ -2485,7 +2521,7 @@ for (; model != NULL; model = model->BSIM4nextModel)
T11 = 4.97232e-7 * pParam->BSIM4weff
* pParam->BSIM4leff * pParam->BSIM4ToxRatio;
T12 = -7.45669e11 * model->BSIM4toxe;
T12 = -7.45669e11 * toxe;
T3 = pParam->BSIM4aigbacc * pParam->BSIM4cigbacc
- pParam->BSIM4bigbacc;
T4 = pParam->BSIM4bigbacc * pParam->BSIM4cigbacc;
@ -3000,37 +3036,113 @@ for (; model != NULL; model = model->BSIM4nextModel)
CoxWL = model->BSIM4coxe * pParam->BSIM4weffCV
* pParam->BSIM4leffCV * here->BSIM4nf;
/* Seperate VgsteffCV with noff and voffcv */
noff = n * pParam->BSIM4noff;
dnoff_dVd = pParam->BSIM4noff * dn_dVd;
dnoff_dVb = pParam->BSIM4noff * dn_dVb;
T0 = Vtm * noff;
voffcv = pParam->BSIM4voffcv;
VgstNVt = (Vgst - voffcv) / T0;
if (VgstNVt > EXP_THRESHOLD)
{ Vgsteff = Vgst - voffcv;
dVgsteff_dVg = dVgs_eff_dVg;
dVgsteff_dVd = -dVth_dVd;
dVgsteff_dVb = -dVth_dVb;
}
else if (VgstNVt < -EXP_THRESHOLD)
{ Vgsteff = T0 * log(1.0 + MIN_EXP);
dVgsteff_dVg = 0.0;
dVgsteff_dVd = Vgsteff / noff;
dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb;
dVgsteff_dVd *= dnoff_dVd;
}
else
{ ExpVgst = exp(VgstNVt);
Vgsteff = T0 * log(1.0 + ExpVgst);
dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst);
dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv)
/ noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd;
dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv)
/ noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb;
dVgsteff_dVg *= dVgs_eff_dVg;
} /* End of VgsteffCV */
if(model->BSIM4cvchargeMod == 0)
{
/* Seperate VgsteffCV with noff and voffcv */
noff = n * pParam->BSIM4noff;
dnoff_dVd = pParam->BSIM4noff * dn_dVd;
dnoff_dVb = pParam->BSIM4noff * dn_dVb;
T0 = Vtm * noff;
voffcv = pParam->BSIM4voffcv;
VgstNVt = (Vgst - voffcv) / T0;
if (VgstNVt > EXP_THRESHOLD)
{
Vgsteff = Vgst - voffcv;
dVgsteff_dVg = dVgs_eff_dVg;
dVgsteff_dVd = -dVth_dVd;
dVgsteff_dVb = -dVth_dVb;
}
else if (VgstNVt < -EXP_THRESHOLD)
{
Vgsteff = T0 * log(1.0 + MIN_EXP);
dVgsteff_dVg = 0.0;
dVgsteff_dVd = Vgsteff / noff;
dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb;
dVgsteff_dVd *= dnoff_dVd;
}
else
{
ExpVgst = exp(VgstNVt);
Vgsteff = T0 * log(1.0 + ExpVgst);
dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst);
dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv)
/ noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd;
dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv)
/ noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb;
dVgsteff_dVg *= dVgs_eff_dVg;
}
/* End of VgsteffCV for cvchargeMod = 0 */
}
else
{
T0 = n * Vtm;
T1 = pParam->BSIM4mstarcv * Vgst;
T2 = T1 / T0;
if (T2 > EXP_THRESHOLD)
{
T10 = T1;
dT10_dVg = pParam->BSIM4mstarcv * dVgs_eff_dVg;
dT10_dVd = -dVth_dVd * pParam->BSIM4mstarcv;
dT10_dVb = -dVth_dVb * pParam->BSIM4mstarcv;
}
else if (T2 < -EXP_THRESHOLD)
{
T10 = Vtm * log(1.0 + MIN_EXP);
dT10_dVg = 0.0;
dT10_dVd = T10 * dn_dVd;
dT10_dVb = T10 * dn_dVb;
T10 *= n;
}
else
{
ExpVgst = exp(T2);
T3 = Vtm * log(1.0 + ExpVgst);
T10 = n * T3;
dT10_dVg = pParam->BSIM4mstarcv * ExpVgst / (1.0 + ExpVgst);
dT10_dVb = T3 * dn_dVb - dT10_dVg * (dVth_dVb + Vgst * dn_dVb / n);
dT10_dVd = T3 * dn_dVd - dT10_dVg * (dVth_dVd + Vgst * dn_dVd / n);
dT10_dVg *= dVgs_eff_dVg;
}
T1 = pParam->BSIM4voffcbncv - (1.0 - pParam->BSIM4mstarcv) * Vgst;
T2 = T1 / T0;
if (T2 < -EXP_THRESHOLD)
{
T3 = model->BSIM4coxe * MIN_EXP / pParam->BSIM4cdep0;
T9 = pParam->BSIM4mstarcv + T3 * n;
dT9_dVg = 0.0;
dT9_dVd = dn_dVd * T3;
dT9_dVb = dn_dVb * T3;
}
else if (T2 > EXP_THRESHOLD)
{
T3 = model->BSIM4coxe * MAX_EXP / pParam->BSIM4cdep0;
T9 = pParam->BSIM4mstarcv + T3 * n;
dT9_dVg = 0.0;
dT9_dVd = dn_dVd * T3;
dT9_dVb = dn_dVb * T3;
}
else
{
ExpVgst = exp(T2);
T3 = model->BSIM4coxe / pParam->BSIM4cdep0;
T4 = T3 * ExpVgst;
T5 = T1 * T4 / T0;
T9 = pParam->BSIM4mstarcv + n * T4;
dT9_dVg = T3 * (pParam->BSIM4mstarcv - 1.0) * ExpVgst / Vtm;
dT9_dVb = T4 * dn_dVb - dT9_dVg * dVth_dVb - T5 * dn_dVb;
dT9_dVd = T4 * dn_dVd - dT9_dVg * dVth_dVd - T5 * dn_dVd;
dT9_dVg *= dVgs_eff_dVg;
}
Vgsteff = T10 / T9;
T11 = T9 * T9;
dVgsteff_dVg = (T9 * dT10_dVg - T10 * dT9_dVg) / T11;
dVgsteff_dVd = (T9 * dT10_dVd - T10 * dT9_dVd) / T11;
dVgsteff_dVb = (T9 * dT10_dVb - T10 * dT9_dVb) / T11;
/* End of VgsteffCV for cvchargeMod = 1 */
}
if (model->BSIM4capMod == 1)
@ -3096,7 +3208,7 @@ for (; model != NULL; model = model->BSIM4nextModel)
VdseffCV = VdsatCV * T4;
dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg);
dVdseffCV_dVd = T5 * (dT1_dVd + 1.0);
dVdseffCV_dVb = dT0_dVb * (1.0 - T5) + T5 * dT1_dVb;
dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb;
}
if (Vds == 0.0)
@ -3247,7 +3359,7 @@ for (; model != NULL; model = model->BSIM4nextModel)
dTcen_dVg *= T1;
dTcen_dVb *= T1;
Ccen = EPSSI / Tcen;
Ccen = epssub / Tcen;
T2 = Cox / (Cox + Ccen);
Coxeff = T2 * Ccen;
T3 = -Ccen / Tcen;
@ -3311,16 +3423,16 @@ for (; model != NULL; model = model->BSIM4nextModel)
Tox += Tox; /* WDLiu: Tcen reevaluated below due to different Vgsteff */
T0 = (Vgsteff + here->BSIM4vtfbphi2) / Tox;
tmp = exp(0.7 * log(T0));
tmp = exp(model->BSIM4bdos * 0.7 * log(T0));
T1 = 1.0 + tmp;
T2 = 0.7 * tmp / (T0 * Tox);
Tcen = 1.9e-9 / T1;
T2 = model->BSIM4bdos * 0.7 * tmp / (T0 * Tox);
Tcen = model->BSIM4ados * 1.9e-9 / T1;
dTcen_dVg = -Tcen * T2 / T1;
dTcen_dVd = dTcen_dVg * dVgsteff_dVd;
dTcen_dVb = dTcen_dVg * dVgsteff_dVb;
dTcen_dVg *= dVgsteff_dVg;
Ccen = EPSSI / Tcen;
Ccen = epssub / Tcen;
T0 = Cox / (Cox + Ccen);
Coxeff = T0 * Ccen;
T1 = -Ccen / Tcen;
@ -3355,7 +3467,7 @@ for (; model != NULL; model = model->BSIM4nextModel)
VdseffCV = VdsatCV * T4;
dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg);
dVdseffCV_dVd = T5 * (dT1_dVd + 1.0);
dVdseffCV_dVb = dT0_dVb * (1.0 - T5) + T5 * dT1_dVb;
dVdseffCV_dVb = dT0_dVb * (T4 - T5) + T5 * dT1_dVb;
}
if (Vds == 0.0)
@ -3646,10 +3758,6 @@ finished:
if ((here->BSIM4off == 0) || (!(ckt->CKTmode & MODEINITFIX)))
{ if (Check == 1)
{ ckt->CKTnoncon++;
/* "Following #ifndef NEWCONV" to "#endif" is commented out in the former version.
However, since it was satisfactory when I checked, it has left as it is.
Please comment out, supposing you get a problem. */
#ifndef NEWCONV
}
else
@ -4560,7 +4668,7 @@ line900:
* Loading RHS
*/
m = here->BSIM4m;
m = here->BSIM4m;
(*(ckt->CKTrhs + here->BSIM4dNodePrime) += m * (ceqjd - ceqbd + ceqgdtot
- ceqdrn - ceqqd + Idtoteq));
@ -4788,6 +4896,7 @@ return(OK);
int BSIM4polyDepletion(
double phi,
double ngate,
double epsgate,
double coxe,
double Vgs,
double *Vgs_eff,
@ -4797,8 +4906,9 @@ int BSIM4polyDepletion(
/* Poly Gate Si Depletion Effect */
if ((ngate > 1.0e18) &&
(ngate < 1.0e25) && (Vgs > phi)) {
T1 = 1.0e6 * CHARGE * EPSSI * ngate / (coxe * coxe);
(ngate < 1.0e25) && (Vgs > phi) && (epsgate!=0)
){
T1 = 1.0e6 * CHARGE * epsgate * ngate / (coxe * coxe);
T8 = Vgs - phi;
T4 = sqrt(1.0 + 2.0 * T8 / T1);
T2 = 2.0 * T8 / (T4 + 1.0);

View File

@ -1,11 +1,12 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
* File: b4mask.c of BSIM4.6.0.
* File: b4mask.c of BSIM4.6.1.
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
* Modified by Xuemei Xi, 04/06/2001.
* Modified by Xuemei Xi, 10/05/2001.
@ -13,6 +14,7 @@
* Modified by Xuemei Xi, 05/09/2003.
* Modified by Xuemei Xi, Mohan Dunga, 07/29/2005.
* Modified by Mohan Dunga, 12/13/2006
* Modified by Mohan Dunga, Wenwei Yang, 05/18/2007.
**********/
@ -42,6 +44,9 @@ IFvalue *value;
case BSIM4_MOD_BINUNIT :
value->iValue = model->BSIM4binUnit;
return(OK);
case BSIM4_MOD_CVCHARGEMOD :
value->iValue = model->BSIM4cvchargeMod;
return(OK);
case BSIM4_MOD_CAPMOD :
value->iValue = model->BSIM4capMod;
return(OK);
@ -75,6 +80,10 @@ IFvalue *value;
case BSIM4_MOD_GEOMOD :
value->iValue = model->BSIM4geoMod;
return(OK);
case BSIM4_MOD_MTRLMOD :
value->iValue = model->BSIM4mtrlMod;
return(OK);
case BSIM4_MOD_IGCMOD :
value->iValue = model->BSIM4igcMod;
return(OK);
@ -91,6 +100,18 @@ IFvalue *value;
case BSIM4_MOD_TOXREF :
value->rValue = model->BSIM4toxref;
return(OK);
case BSIM4_MOD_EOT :
value->rValue = model->BSIM4eot;
return(OK);
case BSIM4_MOD_VDDEOT :
value->rValue = model->BSIM4vddeot;
return(OK);
case BSIM4_MOD_ADOS :
value->rValue = model->BSIM4ados;
return(OK);
case BSIM4_MOD_BDOS :
value->rValue = model->BSIM4bdos;
return(OK);
case BSIM4_MOD_TOXE :
value->rValue = model->BSIM4toxe;
return(OK);
@ -164,6 +185,30 @@ IFvalue *value;
case BSIM4_MOD_NSUB:
value->rValue = model->BSIM4nsub;
return(OK);
case BSIM4_MOD_PHIG:
value->rValue = model->BSIM4phig;
return(OK);
case BSIM4_MOD_EPSRGATE:
value->rValue = model->BSIM4epsrgate;
return(OK);
case BSIM4_MOD_EASUB:
value->rValue = model->BSIM4easub;
return(OK);
case BSIM4_MOD_EPSRSUB:
value->rValue = model->BSIM4epsrsub;
return(OK);
case BSIM4_MOD_NI0SUB:
value->rValue = model->BSIM4ni0sub;
return(OK);
case BSIM4_MOD_BG0SUB:
value->rValue = model->BSIM4bg0sub;
return(OK);
case BSIM4_MOD_TBGASUB:
value->rValue = model->BSIM4tbgasub;
return(OK);
case BSIM4_MOD_TBGBSUB:
value->rValue = model->BSIM4tbgbsub;
return(OK);
case BSIM4_MOD_NDEP:
value->rValue = model->BSIM4ndep;
return(OK);
@ -305,9 +350,15 @@ IFvalue *value;
case BSIM4_MOD_VOFFL:
value->rValue = model->BSIM4voffl;
return(OK);
case BSIM4_MOD_VOFFCVL:
value->rValue = model->BSIM4voffcvl;
return(OK);
case BSIM4_MOD_MINV:
value->rValue = model->BSIM4minv;
return(OK);
case BSIM4_MOD_MINVCV:
value->rValue = model->BSIM4minvcv;
return(OK);
case BSIM4_MOD_FPROUT:
value->rValue = model->BSIM4fprout;
return(OK);
@ -1015,6 +1066,9 @@ IFvalue *value;
case BSIM4_MOD_LMINV:
value->rValue = model->BSIM4lminv;
return(OK);
case BSIM4_MOD_LMINVCV:
value->rValue = model->BSIM4lminvcv;
return(OK);
case BSIM4_MOD_LFPROUT:
value->rValue = model->BSIM4lfprout;
return(OK);
@ -1429,6 +1483,9 @@ IFvalue *value;
case BSIM4_MOD_WMINV:
value->rValue = model->BSIM4wminv;
return(OK);
case BSIM4_MOD_WMINVCV:
value->rValue = model->BSIM4wminvcv;
return(OK);
case BSIM4_MOD_WFPROUT:
value->rValue = model->BSIM4wfprout;
return(OK);
@ -1843,6 +1900,9 @@ IFvalue *value;
case BSIM4_MOD_PMINV:
value->rValue = model->BSIM4pminv;
return(OK);
case BSIM4_MOD_PMINVCV:
value->rValue = model->BSIM4pminvcv;
return(OK);
case BSIM4_MOD_PFPROUT:
value->rValue = model->BSIM4pfprout;
return(OK);

View File

@ -1,11 +1,12 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
* File: b4mdel.c of BSIM4.6.0.
* File: b4mdel.c of BSIM4.6.1.
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
**********/

View File

@ -1,11 +1,12 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
* File: b4mpar.c of BSIM4.6.0.
* File: b4mpar.c of BSIM4.6.1.
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
* Modified by Xuemei Xi, 04/06/2001.
* Modified by Xuemei Xi, 10/05/2001.
@ -14,6 +15,7 @@
* Modified by Xuemei Xi, 03/04/2004.
* Modified by Xuemei Xi, Mohan Dunga, 07/29/2005.
* Modified by Mohan Dunga, 12/13/2006
* Modified by Mohan Dunga, Wenwei Yang, 05/18/2007.
**********/
#include "ngspice.h"
@ -42,6 +44,10 @@ GENmodel *inMod;
mod->BSIM4paramChk = value->iValue;
mod->BSIM4paramChkGiven = TRUE;
break;
case BSIM4_MOD_CVCHARGEMOD :
mod->BSIM4cvchargeMod = value->iValue;
mod->BSIM4cvchargeModGiven = TRUE;
break;
case BSIM4_MOD_CAPMOD :
mod->BSIM4capMod = value->iValue;
mod->BSIM4capModGiven = TRUE;
@ -86,6 +92,10 @@ GENmodel *inMod;
mod->BSIM4tnoiMod = value->iValue;
mod->BSIM4tnoiModGiven = TRUE;
break;
case BSIM4_MOD_MTRLMOD :
mod->BSIM4mtrlMod = value->iValue;
mod->BSIM4mtrlModGiven = TRUE;
break;
case BSIM4_MOD_IGCMOD :
mod->BSIM4igcMod = value->iValue;
mod->BSIM4igcModGiven = TRUE;
@ -107,7 +117,23 @@ GENmodel *inMod;
mod->BSIM4toxref = value->rValue;
mod->BSIM4toxrefGiven = TRUE;
break;
case BSIM4_MOD_TOXE :
case BSIM4_MOD_EOT :
mod->BSIM4eot = value->rValue;
mod->BSIM4eotGiven = TRUE;
break;
case BSIM4_MOD_VDDEOT :
mod->BSIM4vddeot = value->rValue;
mod->BSIM4vddeotGiven = TRUE;
break;
case BSIM4_MOD_ADOS :
mod->BSIM4ados = value->rValue;
mod->BSIM4adosGiven = TRUE;
break;
case BSIM4_MOD_BDOS :
mod->BSIM4bdos = value->rValue;
mod->BSIM4bdosGiven = TRUE;
break;
case BSIM4_MOD_TOXE :
mod->BSIM4toxe = value->rValue;
mod->BSIM4toxeGiven = TRUE;
break;
@ -188,6 +214,38 @@ GENmodel *inMod;
mod->BSIM4nsub = value->rValue;
mod->BSIM4nsubGiven = TRUE;
break;
case BSIM4_MOD_PHIG:
mod->BSIM4phig = value->rValue;
mod->BSIM4phigGiven = TRUE;
break;
case BSIM4_MOD_EPSRGATE:
mod->BSIM4epsrgate = value->rValue;
mod->BSIM4epsrgateGiven = TRUE;
break;
case BSIM4_MOD_EASUB:
mod->BSIM4easub = value->rValue;
mod->BSIM4easubGiven = TRUE;
break;
case BSIM4_MOD_EPSRSUB:
mod->BSIM4epsrsub = value->rValue;
mod->BSIM4epsrsubGiven = TRUE;
break;
case BSIM4_MOD_NI0SUB:
mod->BSIM4ni0sub = value->rValue;
mod->BSIM4ni0subGiven = TRUE;
break;
case BSIM4_MOD_BG0SUB:
mod->BSIM4bg0sub = value->rValue;
mod->BSIM4bg0subGiven = TRUE;
break;
case BSIM4_MOD_TBGASUB:
mod->BSIM4tbgasub = value->rValue;
mod->BSIM4tbgasubGiven = TRUE;
break;
case BSIM4_MOD_TBGBSUB:
mod->BSIM4tbgbsub = value->rValue;
mod->BSIM4tbgbsubGiven = TRUE;
break;
case BSIM4_MOD_NDEP:
mod->BSIM4ndep = value->rValue;
mod->BSIM4ndepGiven = TRUE;
@ -425,10 +483,18 @@ GENmodel *inMod;
mod->BSIM4voffl = value->rValue;
mod->BSIM4vofflGiven = TRUE;
break;
case BSIM4_MOD_VOFFCVL:
mod->BSIM4voffcvl = value->rValue;
mod->BSIM4voffcvlGiven = TRUE;
break;
case BSIM4_MOD_MINV:
mod->BSIM4minv = value->rValue;
mod->BSIM4minvGiven = TRUE;
break;
case BSIM4_MOD_MINVCV:
mod->BSIM4minvcv = value->rValue;
mod->BSIM4minvcvGiven = TRUE;
break;
case BSIM4_MOD_FPROUT:
mod->BSIM4fprout = value->rValue;
mod->BSIM4fproutGiven = TRUE;
@ -1551,6 +1617,10 @@ GENmodel *inMod;
mod->BSIM4lminv = value->rValue;
mod->BSIM4lminvGiven = TRUE;
break;
case BSIM4_MOD_LMINVCV:
mod->BSIM4lminvcv = value->rValue;
mod->BSIM4lminvcvGiven = TRUE;
break;
case BSIM4_MOD_LFPROUT:
mod->BSIM4lfprout = value->rValue;
mod->BSIM4lfproutGiven = TRUE;
@ -2107,6 +2177,10 @@ GENmodel *inMod;
mod->BSIM4wminv = value->rValue;
mod->BSIM4wminvGiven = TRUE;
break;
case BSIM4_MOD_WMINVCV:
mod->BSIM4wminvcv = value->rValue;
mod->BSIM4wminvcvGiven = TRUE;
break;
case BSIM4_MOD_WFPROUT:
mod->BSIM4wfprout = value->rValue;
mod->BSIM4wfproutGiven = TRUE;
@ -2663,6 +2737,10 @@ GENmodel *inMod;
mod->BSIM4pminv = value->rValue;
mod->BSIM4pminvGiven = TRUE;
break;
case BSIM4_MOD_PMINVCV:
mod->BSIM4pminvcv = value->rValue;
mod->BSIM4pminvcvGiven = TRUE;
break;
case BSIM4_MOD_PFPROUT:
mod->BSIM4pfprout = value->rValue;
mod->BSIM4pfproutGiven = TRUE;

View File

@ -1,11 +1,12 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
* File: b4noi.c of BSIM4.6.0.
* File: b4noi.c of BSIM4.6.1.
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
* Modified by Xuemei Xi, 04/06/2001.
* Modified by Xuemei Xi, 10/05/2001.

View File

@ -1,10 +1,12 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
* File: b4par.c of BSIM4.6.0.
* File: b4par.c of BSIM4.6.1.
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
* Modified by Xuemei Xi, 04/06/2001.
* Modified by Xuemei Xi, 11/15/2002.

View File

@ -1,4 +1,4 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
@ -6,6 +6,7 @@
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
* Modified by Xuemei Xi, 10/05/2001.
**********/
@ -55,7 +56,7 @@ double m;
{ for (here = model->BSIM4instances; here!= NULL;
here = here->BSIM4nextInstance)
{ if (here->BSIM4owner != ARCHme) continue;
pParam = here->pParam;
pParam = here->pParam;
capbd = here->BSIM4capbd;
capbs = here->BSIM4capbs;
cgso = here->BSIM4cgso;
@ -484,7 +485,7 @@ double m;
/*
* Loading PZ matrix
*/
m = here->BSIM4m;
m = here->BSIM4m;
if (!model->BSIM4rdsMod)
{ gdpr = here->BSIM4drainConductance;

View File

@ -1,10 +1,12 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
* File: b4set.c of BSIM4.6.0.
* File: b4set.c of BSIM4.6.1.
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
* Modified by Xuemei Xi, 04/06/2001.
* Modified by Xuemei Xi, 10/05/2001.
@ -13,6 +15,7 @@
* Modified by Xuemei Xi, 03/04/2004.
* Modified by Xuemei Xi, Mohan Dunga, 07/29/2005.
* Modified by Mohan Dunga, 12/13/2006
* Modified by Mohan Dunga, Wenwei Yang, 05/18/2007.
**********/
#include "ngspice.h"
@ -88,6 +91,8 @@ JOB *job;
printf("Warning: dioMod has been set to its default value: 1.\n");
}
if (!model->BSIM4cvchargeModGiven)
model->BSIM4cvchargeMod = 0;
if (!model->BSIM4capModGiven)
model->BSIM4capMod = 2;
else if ((model->BSIM4capMod != 0) && (model->BSIM4capMod != 1)
@ -153,6 +158,9 @@ JOB *job;
printf("Warning: acnqsMod has been set to its default value: 0.\n");
}
if (!model->BSIM4mtrlModGiven)
model->BSIM4mtrlMod = 0;
if (!model->BSIM4igcModGiven)
model->BSIM4igcMod = 0;
else if ((model->BSIM4igcMod != 0) && (model->BSIM4igcMod != 1)
@ -178,6 +186,14 @@ JOB *job;
model->BSIM4version = "4.6.0";
if (!model->BSIM4toxrefGiven)
model->BSIM4toxref = 30.0e-10;
if (!model->BSIM4eotGiven)
model->BSIM4eot = 15.0e-10;
if (!model->BSIM4vddeotGiven)
model->BSIM4vddeot = (model->BSIM4type == NMOS) ? 1.5 : -1.5;
if (!model->BSIM4adosGiven)
model->BSIM4ados = 1.0;
if (!model->BSIM4bdosGiven)
model->BSIM4bdos = 1.0;
if (!model->BSIM4toxeGiven)
model->BSIM4toxe = 30.0e-10;
if (!model->BSIM4toxpGiven)
@ -217,6 +233,22 @@ JOB *job;
model->BSIM4keta = -0.047; /* unit / V */
if (!model->BSIM4nsubGiven)
model->BSIM4nsub = 6.0e16; /* unit 1/cm3 */
if (!model->BSIM4phigGiven)
model->BSIM4phig = 4.05;
if (!model->BSIM4epsrgateGiven)
model->BSIM4epsrgate = 11.7;
if (!model->BSIM4easubGiven)
model->BSIM4easub = 4.05;
if (!model->BSIM4epsrsubGiven)
model->BSIM4epsrsub = 11.7;
if (!model->BSIM4ni0subGiven)
model->BSIM4ni0sub = 1.45e10; /* unit 1/cm3 */
if (!model->BSIM4bg0subGiven)
model->BSIM4bg0sub = 1.16; /* unit eV */
if (!model->BSIM4tbgasubGiven)
model->BSIM4tbgasub = 7.02e-4;
if (!model->BSIM4tbgbsubGiven)
model->BSIM4tbgbsub = 1108.0;
if (!model->BSIM4ndepGiven)
model->BSIM4ndep = 1.7e17; /* unit 1/cm3 */
if (!model->BSIM4nsdGiven)
@ -301,8 +333,12 @@ JOB *job;
model->BSIM4voff = -0.08;
if (!model->BSIM4vofflGiven)
model->BSIM4voffl = 0.0;
if (!model->BSIM4voffcvlGiven)
model->BSIM4voffcvl = 0.0;
if (!model->BSIM4minvGiven)
model->BSIM4minv = 0.0;
if (!model->BSIM4minvcvGiven)
model->BSIM4minvcv = 0.0;
if (!model->BSIM4fproutGiven)
model->BSIM4fprout = 0.0;
if (!model->BSIM4pditsGiven)
@ -748,6 +784,8 @@ JOB *job;
model->BSIM4lvoff = 0.0;
if (!model->BSIM4lminvGiven)
model->BSIM4lminv = 0.0;
if (!model->BSIM4lminvcvGiven)
model->BSIM4lminvcv = 0.0;
if (!model->BSIM4lfproutGiven)
model->BSIM4lfprout = 0.0;
if (!model->BSIM4lpditsGiven)
@ -961,7 +999,7 @@ JOB *job;
model->BSIM4wcdsc = 0.0;
if (!model->BSIM4wcdscbGiven)
model->BSIM4wcdscb = 0.0;
if (!model->BSIM4wcdscdGiven)
if (!model->BSIM4wcdscdGiven)
model->BSIM4wcdscd = 0.0;
if (!model->BSIM4wcitGiven)
model->BSIM4wcit = 0.0;
@ -1063,6 +1101,8 @@ JOB *job;
model->BSIM4wvoff = 0.0;
if (!model->BSIM4wminvGiven)
model->BSIM4wminv = 0.0;
if (!model->BSIM4wminvcvGiven)
model->BSIM4wminvcv = 0.0;
if (!model->BSIM4wfproutGiven)
model->BSIM4wfprout = 0.0;
if (!model->BSIM4wpditsGiven)
@ -1378,6 +1418,8 @@ JOB *job;
model->BSIM4pvoff = 0.0;
if (!model->BSIM4pminvGiven)
model->BSIM4pminv = 0.0;
if (!model->BSIM4pminvcvGiven)
model->BSIM4pminvcv = 0.0;
if (!model->BSIM4pfproutGiven)
model->BSIM4pfprout = 0.0;
if (!model->BSIM4ppditsGiven)
@ -1950,8 +1992,8 @@ JOB *job;
for (here = model->BSIM4instances; here != NULL ;
here=here->BSIM4nextInstance)
{
if (here->BSIM4owner == ARCHme) {
/* allocate a chunk of the state vector */
if (here->BSIM4owner == ARCHme) {
/* allocate a chunk of the state vector */
here->BSIM4states = *states;
*states += BSIM4numStates;
}

View File

@ -1,11 +1,12 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
* File: b4temp.c of BSIM4.6.0.
* File: b4temp.c of BSIM4.6.1.
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
* Modified by Xuemei Xi, 04/06/2001.
* Modified by Xuemei Xi, 10/05/2001.
@ -13,7 +14,8 @@
* Modified by Xuemei Xi, 05/09/2003.
* Modified by Xuemei Xi, 03/04/2004.
* Modified by Xuemei Xi, Mohan Dunga, 07/29/2005.
* Modified by Mohan Dunga, 12/13/2006
* Modified by Mohan Dunga, 12/13/2006.
* Modified by Mohan Dunga, Wenwei Yang, 05/18/2007.
**********/
#include "ngspice.h"
@ -73,9 +75,9 @@ CKTcircuit *ckt;
{
BSIM4model *model = (BSIM4model*) inModel;
BSIM4instance *here;
struct bsim4SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL;
double tmp, tmp1, tmp2, Eg, Eg0, ni;
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Lnew=0.0, Wnew;
struct bsim4SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam;
double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni, epssub;
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Lnew, Wnew;
double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom;
double dumPs, dumPd, dumAs, dumAd, PowWeffWr;
double DMCGeff, DMCIeff, DMDGeff;
@ -85,6 +87,8 @@ double Inv_saref, Inv_sbref, Inv_sa, Inv_sb, rho, Ldrn, dvth0_lod;
double W_tmp, Inv_ODeff, OD_offset, dk2_lod, deta0_lod;
double lnl, lnw, lnnf, rbpbx, rbpby, rbsbx, rbsby, rbdbx, rbdby,bodymode;
double kvsat, wlod, sceff, Wdrn;
double V0, lt1, ltw, Theta0, Delt_vth, TempRatio, Vth_NarrowW, Lpe_Vb, Vth;
double n, Vgsteff, Vgs_eff, niter, toxpf, toxpi, Tcen, toxe, epsrox, vddeot;
int Size_Not_Found, i;
@ -117,15 +121,33 @@ int Size_Not_Found, i;
fprintf(stderr, "Given pbswgd is less than 0.1. Pbswgd is set to 0.1.\n");
}
if ((model->BSIM4toxeGiven) && (model->BSIM4toxpGiven) && (model->BSIM4dtoxGiven)
&& (model->BSIM4toxe != (model->BSIM4toxp + model->BSIM4dtox)))
printf("Warning: toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored.\n");
else if ((model->BSIM4toxeGiven) && (!model->BSIM4toxpGiven))
model->BSIM4toxp = model->BSIM4toxe - model->BSIM4dtox;
else if ((!model->BSIM4toxeGiven) && (model->BSIM4toxpGiven))
model->BSIM4toxe = model->BSIM4toxp + model->BSIM4dtox;
if(model->BSIM4mtrlMod == 0)
{
if ((model->BSIM4toxeGiven) && (model->BSIM4toxpGiven) && (model->BSIM4dtoxGiven)
&& (model->BSIM4toxe != (model->BSIM4toxp + model->BSIM4dtox)))
printf("Warning: toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored.\n");
else if ((model->BSIM4toxeGiven) && (!model->BSIM4toxpGiven))
model->BSIM4toxp = model->BSIM4toxe - model->BSIM4dtox;
else if ((!model->BSIM4toxeGiven) && (model->BSIM4toxpGiven))
model->BSIM4toxe = model->BSIM4toxp + model->BSIM4dtox;
}
model->BSIM4coxe = model->BSIM4epsrox * EPS0 / model->BSIM4toxe;
if(model->BSIM4mtrlMod)
{
epsrox = 3.9;
toxe = model->BSIM4eot;
epssub = EPS0 * model->BSIM4epsrsub;
}
else
{
epsrox = model->BSIM4epsrox;
toxe = model->BSIM4toxe;
epssub = EPSSI;
}
model->BSIM4coxe = epsrox * EPS0 / toxe;
if(model->BSIM4mtrlMod == 0)
model->BSIM4coxp = model->BSIM4epsrox * EPS0 / model->BSIM4toxp;
if (!model->BSIM4cgdoGiven)
@ -153,16 +175,33 @@ int Size_Not_Found, i;
TRatio = Temp / Tnom;
model->BSIM4vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14));
model->BSIM4factor1 = sqrt(EPSSI / (model->BSIM4epsrox * EPS0)
* model->BSIM4toxe);
model->BSIM4factor1 = sqrt(epssub / (epsrox * EPS0)* toxe);
Vtm0 = model->BSIM4vtm0 = KboQ * Tnom;
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));
if(model->BSIM4mtrlMod==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->BSIM4bg0sub - model->BSIM4tbgasub * Tnom * Tnom
/ (Tnom + model->BSIM4tbgbsub);
T0 = model->BSIM4bg0sub - model->BSIM4tbgasub * 90090.0225
/ (300.15 + model->BSIM4tbgbsub);
ni = model->BSIM4ni0sub * (Tnom / 300.15) * sqrt(Tnom / 300.15)
* exp((T0 - Eg0) / (2.0 * Vtm0));
}
model->BSIM4Eg0 = Eg0;
model->BSIM4vtm = KboQ * Temp;
Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0);
if(model->BSIM4mtrlMod == 0)
Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0);
else
Eg = model->BSIM4bg0sub - model->BSIM4tbgasub * Temp * Temp
/ (Temp + model->BSIM4tbgbsub);
if (Temp != Tnom)
{ T0 = Eg0 / Vtm0 - Eg / model->BSIM4vtm;
T1 = log(Temp / Tnom);
@ -719,6 +758,10 @@ int Size_Not_Found, i;
+ model->BSIM4lminv * Inv_L
+ model->BSIM4wminv * Inv_W
+ model->BSIM4pminv * Inv_LW;
pParam->BSIM4minvcv = model->BSIM4minvcv
+ model->BSIM4lminvcv * Inv_L
+ model->BSIM4wminvcv * Inv_W
+ model->BSIM4pminvcv * Inv_LW;
pParam->BSIM4fprout = model->BSIM4fprout
+ model->BSIM4lfprout * Inv_L
+ model->BSIM4wfprout * Inv_W
@ -1147,33 +1190,49 @@ int Size_Not_Found, i;
pParam->BSIM4sqrtPhi = sqrt(pParam->BSIM4phi);
pParam->BSIM4phis3 = pParam->BSIM4sqrtPhi * pParam->BSIM4phi;
pParam->BSIM4Xdep0 = sqrt(2.0 * EPSSI / (Charge_q
pParam->BSIM4Xdep0 = sqrt(2.0 * epssub / (Charge_q
* pParam->BSIM4ndep * 1.0e6))
* pParam->BSIM4sqrtPhi;
pParam->BSIM4sqrtXdep0 = sqrt(pParam->BSIM4Xdep0);
pParam->BSIM4litl = sqrt(3.0 * pParam->BSIM4xj
* model->BSIM4toxe);
if(model->BSIM4mtrlMod == 0)
pParam->BSIM4litl = sqrt(3.0 * pParam->BSIM4xj * toxe);
else
pParam->BSIM4litl = sqrt(model->BSIM4epsrsub/epsrox * pParam->BSIM4xj * toxe);
pParam->BSIM4vbi = Vtm0 * log(pParam->BSIM4nsd
* pParam->BSIM4ndep / (ni * ni));
if (pParam->BSIM4ngate > 0.0)
{ pParam->BSIM4vfbsd = Vtm0 * log(pParam->BSIM4ngate
if (model->BSIM4mtrlMod == 0)
{
if (pParam->BSIM4ngate > 0.0)
{ pParam->BSIM4vfbsd = Vtm0 * log(pParam->BSIM4ngate
/ pParam->BSIM4nsd);
}
else
pParam->BSIM4vfbsd = 0.0;
}
else
pParam->BSIM4vfbsd = 0.0;
{
T0 = Vtm0 * log(pParam->BSIM4nsd/ni);
T1 = 0.5 * Eg0;
if(T0 > T1)
T0 = T1;
T2 = model->BSIM4easub + T1 - model->BSIM4type * T0;
pParam->BSIM4vfbsd = model->BSIM4phig - T2;
}
pParam->BSIM4cdep0 = sqrt(Charge_q * EPSSI
pParam->BSIM4cdep0 = sqrt(Charge_q * epssub
* pParam->BSIM4ndep * 1.0e6 / 2.0
/ pParam->BSIM4phi);
pParam->BSIM4ToxRatio = exp(pParam->BSIM4ntox
* log(model->BSIM4toxref / model->BSIM4toxe))
/ model->BSIM4toxe / model->BSIM4toxe;
* log(model->BSIM4toxref / toxe))
/ toxe / toxe;
pParam->BSIM4ToxRatioEdge = exp(pParam->BSIM4ntox
* log(model->BSIM4toxref
/ (model->BSIM4toxe * pParam->BSIM4poxedge)))
/ model->BSIM4toxe / model->BSIM4toxe
/ (toxe * pParam->BSIM4poxedge)))
/ toxe / toxe
/ pParam->BSIM4poxedge / pParam->BSIM4poxedge;
pParam->BSIM4Aechvb = (model->BSIM4type == NMOS) ? 4.97232e-7 : 3.42537e-7;
pParam->BSIM4Bechvb = (model->BSIM4type == NMOS) ? 7.45669e11 : 1.16645e12;
@ -1182,16 +1241,18 @@ int Size_Not_Found, i;
pParam->BSIM4AechvbEdgeD = pParam->BSIM4Aechvb * pParam->BSIM4weff
* model->BSIM4dlcigd * pParam->BSIM4ToxRatioEdge;
pParam->BSIM4BechvbEdge = -pParam->BSIM4Bechvb
* model->BSIM4toxe * pParam->BSIM4poxedge;
* toxe * pParam->BSIM4poxedge;
pParam->BSIM4Aechvb *= pParam->BSIM4weff * pParam->BSIM4leff
* pParam->BSIM4ToxRatio;
pParam->BSIM4Bechvb *= -model->BSIM4toxe;
pParam->BSIM4Bechvb *= -toxe;
pParam->BSIM4mstar = 0.5 + atan(pParam->BSIM4minv) / PI;
pParam->BSIM4mstarcv = 0.5 + atan(pParam->BSIM4minvcv) / PI;
pParam->BSIM4voffcbn = pParam->BSIM4voff + model->BSIM4voffl / pParam->BSIM4leff;
pParam->BSIM4voffcbncv = pParam->BSIM4voffcv + model->BSIM4voffcvl / pParam->BSIM4leff;
pParam->BSIM4ldeb = sqrt(EPSSI * Vtm0 / (Charge_q
pParam->BSIM4ldeb = sqrt(epssub * Vtm0 / (Charge_q
* pParam->BSIM4ndep * 1.0e6)) / 3.0;
pParam->BSIM4acde *= pow((pParam->BSIM4ndep / 2.0e16), -0.25);
@ -1247,14 +1308,29 @@ int Size_Not_Found, i;
}
if (!model->BSIM4vfbGiven)
{ if (model->BSIM4vth0Given)
{
if (model->BSIM4vth0Given)
{ pParam->BSIM4vfb = model->BSIM4type * pParam->BSIM4vth0
- pParam->BSIM4phi - pParam->BSIM4k1
* pParam->BSIM4sqrtPhi;
}
else
{ pParam->BSIM4vfb = -1.0;
}
{
if ((model->BSIM4mtrlMod) && (model->BSIM4phigGiven) &&
(model->BSIM4nsubGiven))
{
T0 = Vtm0 * log(pParam->BSIM4nsub/ni);
T1 = 0.5 * Eg0;
if(T0 > T1)
T0 = T1;
T2 = model->BSIM4easub + T1 + model->BSIM4type * T0;
pParam->BSIM4vfb = model->BSIM4phig - T2;
}
else
{
pParam->BSIM4vfb = -1.0;
}
}
}
if (!model->BSIM4vth0Given)
{ pParam->BSIM4vth0 = model->BSIM4type * (pParam->BSIM4vfb
@ -1262,11 +1338,10 @@ int Size_Not_Found, i;
* pParam->BSIM4sqrtPhi);
}
pParam->BSIM4k1ox = pParam->BSIM4k1 * model->BSIM4toxe
pParam->BSIM4k1ox = pParam->BSIM4k1 * toxe
/ model->BSIM4toxm;
tmp = sqrt(EPSSI / (model->BSIM4epsrox * EPS0)
* model->BSIM4toxe * pParam->BSIM4Xdep0);
tmp = sqrt(epssub / (epsrox * EPS0) * toxe * pParam->BSIM4Xdep0);
T0 = pParam->BSIM4dsub * pParam->BSIM4leff / tmp;
if (T0 < EXP_THRESHOLD)
{ T1 = exp(T0);
@ -1321,7 +1396,7 @@ int Size_Not_Found, i;
T9 = 1.0 / (MAX_EXP - 2.0);
T9 = pParam->BSIM4dvt0 * T9 * tmp1;
T4 = model->BSIM4toxe * pParam->BSIM4phi
T4 = toxe * pParam->BSIM4phi
/ (pParam->BSIM4weff + pParam->BSIM4w0);
T0 = sqrt(1.0 + pParam->BSIM4lpe0 / pParam->BSIM4leff);
@ -1476,7 +1551,7 @@ int Size_Not_Found, i;
here->BSIM4vbsc = -30.0;
if (here->BSIM4vbsc > pParam->BSIM4vbm)
here->BSIM4vbsc = pParam->BSIM4vbm;
here->BSIM4k2ox = here->BSIM4k2 * model->BSIM4toxe
here->BSIM4k2ox = here->BSIM4k2 * toxe
/ model->BSIM4toxm;
here->BSIM4vfbzb = pParam->BSIM4vfbzbfactor
@ -1856,12 +1931,116 @@ int Size_Not_Found, i;
here->BSIM4SswgTempRevSatCur = T5 * T10 * model->BSIM4jtsswgs;
here->BSIM4DswgTempRevSatCur = T6 * T10 * model->BSIM4jtsswgd;
if(model->BSIM4mtrlMod)
{
/* Calculate TOXP from EOT */
/* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */
tmp2 = here->BSIM4vfb + pParam->BSIM4phi;
vddeot = model->BSIM4type * model->BSIM4vddeot;
T0 = model->BSIM4epsrgate * EPS0;
if ((pParam->BSIM4ngate > 1.0e18) && (pParam->BSIM4ngate < 1.0e25)
&& (vddeot > tmp2) && (T0!=0))
{
T1 = 1.0e6 * CHARGE * T0 * pParam->BSIM4ngate /
(model->BSIM4coxe * model->BSIM4coxe);
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 = pParam->BSIM4vbi - pParam->BSIM4phi;
lt1 = model->BSIM4factor1* pParam->BSIM4sqrtXdep0;
ltw = lt1;
T0 = pParam->BSIM4dvt1 * pParam->BSIM4leff / 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->BSIM4dvt0 * Theta0 * V0;
T0 = pParam->BSIM4dvt1w * pParam->BSIM4weff * pParam->BSIM4leff / 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->BSIM4dvt0w * T5 * V0;
TempRatio = ckt->CKTtemp / model->BSIM4tnom - 1.0;
T0 = sqrt(1.0 + pParam->BSIM4lpe0 / pParam->BSIM4leff);
T1 = pParam->BSIM4k1ox * (T0 - 1.0) * pParam->BSIM4sqrtPhi
+ (pParam->BSIM4kt1 + pParam->BSIM4kt1l / pParam->BSIM4leff) * TempRatio;
Vth_NarrowW = toxe * pParam->BSIM4phi
/ (pParam->BSIM4weff + pParam->BSIM4w0);
Lpe_Vb = sqrt(1.0 + pParam->BSIM4lpeb / pParam->BSIM4leff);
Vth = model->BSIM4type * here->BSIM4vth0 +
(pParam->BSIM4k1ox - pParam->BSIM4k1)*pParam->BSIM4sqrtPhi*Lpe_Vb
- Delt_vth - T2 + pParam->BSIM4k3 * Vth_NarrowW + T1;
/* Calculate n */
tmp1 = epssub / pParam->BSIM4Xdep0;
here->BSIM4nstar = model->BSIM4vtm / Charge_q *
(model->BSIM4coxe + tmp1 + pParam->BSIM4cit);
tmp2 = pParam->BSIM4nfactor * tmp1;
tmp3 = (tmp2 + pParam->BSIM4cdsc * Theta0 + pParam->BSIM4cit) / model->BSIM4coxe;
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->BSIM4dvtp0 > 0.0)
{
T3 = pParam->BSIM4leff + pParam->BSIM4dvtp0 * 2.0;
if (model->BSIM4tempMod < 2)
T4 = model->BSIM4vtm * log(pParam->BSIM4leff / T3);
else
T4 = model->BSIM4vtm0 * log(pParam->BSIM4leff / T3);
Vth -= n * T4;
}
Vgsteff = Vgs_eff-Vth;
/* calculating Toxp */
niter = 0;
toxpf = toxe;
do
{
toxpi = toxpf;
tmp2 = 2.0e8 * toxpf;
T0 = (Vgsteff + here->BSIM4vtfbphi2) / tmp2;
T1 = 1.0 + exp(model->BSIM4bdos * 0.7 * log(T0));
Tcen = model->BSIM4ados * 1.9e-9 / T1;
toxpf = toxe - epsrox/model->BSIM4epsrsub * Tcen;
niter++;
} while ((niter<=4)&&(ABS(toxpf-toxpi)>1e-12));
model->BSIM4toxp = toxpf;
model->BSIM4coxp = epsrox * EPS0 / model->BSIM4toxp;
}
if (BSIM4checkModel(model, here, ckt))
{ IFuid namarray[2];
namarray[0] = model->BSIM4modName;
namarray[1] = here->BSIM4name;
(*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during BSIM4.6.0 parameter checking for %s in model %s", namarray);
(*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during BSIM4.6.1 parameter checking for %s in model %s", namarray);
return(E_BADPARM);
}
} /* End instance */

View File

@ -1,11 +1,12 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
* Copyright 2006 Regents of the University of California. All rights reserved.
* File: b4trunc.c of BSIM4.6.0.
* File: b4trunc.c of BSIM4.6.1.
* Author: 2000 Weidong Liu
* 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
* Project Director: Prof. Chenming Hu.
**********/

View File

@ -1,16 +1,18 @@
/**** BSIM4.6.0 Released by Mohan Dunga 12/13/2006 ****/
/**** BSIM4.6.1 Released by Mohan Dunga, Wenwei Yang 05/18/2007 ****/
/**********
Copyright 2006 Regents of the University of California. All rights reserved.
Author: 2000 Weidong Liu.
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
Modified by Xuemei Xi, 11/15/2002.
Modified by Xuemei Xi, 05/09/2003.
Modified by Xuemei Xi, 03/04/2004.
Modified by Xuemei Xi, Mohan Dunga, 09/24/2004.
Modified by Xuemei Xi, 07/29/2005.
Modified by Mohan Dunga, 12/13/2006
Modified by Mohan Dunga, Wenwei Yang, 05/18/2007.
File: bsim4def.h
**********/
@ -21,7 +23,7 @@ File: bsim4def.h
#include "gendefs.h"
#include "cktdefs.h"
#include "complex.h"
#include "noisedef.h"
#include "noisedef.h"
typedef struct sBSIM4instance
{
@ -515,6 +517,7 @@ struct bsim4SizeDependParam
double BSIM4voff;
double BSIM4tvoff;
double BSIM4minv;
double BSIM4minvcv;
double BSIM4vfb;
double BSIM4delta;
double BSIM4rdsw;
@ -638,7 +641,9 @@ struct bsim4SizeDependParam
double BSIM4theta0vb0;
double BSIM4thetaRout;
double BSIM4mstar;
double BSIM4mstarcv;
double BSIM4voffcbn;
double BSIM4voffcbncv;
double BSIM4rdswmin;
double BSIM4rdwmin;
double BSIM4rswmin;
@ -674,6 +679,7 @@ typedef struct sBSIM4model
int BSIM4type;
int BSIM4mobMod;
int BSIM4cvchargeMod;
int BSIM4capMod;
int BSIM4dioMod;
int BSIM4trnqsMod;
@ -685,12 +691,17 @@ typedef struct sBSIM4model
int BSIM4rgateMod;
int BSIM4perMod;
int BSIM4geoMod;
int BSIM4mtrlMod;
int BSIM4igcMod;
int BSIM4igbMod;
int BSIM4tempMod;
int BSIM4binUnit;
int BSIM4paramChk;
char *BSIM4version;
char *BSIM4version;
double BSIM4eot;
double BSIM4vddeot;
double BSIM4ados;
double BSIM4bdos;
double BSIM4toxe;
double BSIM4toxp;
double BSIM4toxm;
@ -710,6 +721,14 @@ typedef struct sBSIM4model
double BSIM4a2;
double BSIM4keta;
double BSIM4nsub;
double BSIM4phig;
double BSIM4epsrgate;
double BSIM4easub;
double BSIM4epsrsub;
double BSIM4ni0sub;
double BSIM4bg0sub;
double BSIM4tbgasub;
double BSIM4tbgbsub;
double BSIM4ndep;
double BSIM4nsd;
double BSIM4phin;
@ -756,7 +775,9 @@ typedef struct sBSIM4model
double BSIM4voff;
double BSIM4tvoff;
double BSIM4minv;
double BSIM4minvcv;
double BSIM4voffl;
double BSIM4voffcvl;
double BSIM4delta;
double BSIM4rdsw;
double BSIM4rdswmin;
@ -1013,6 +1034,7 @@ typedef struct sBSIM4model
double BSIM4lvoff;
double BSIM4ltvoff;
double BSIM4lminv;
double BSIM4lminvcv;
double BSIM4ldelta;
double BSIM4lrdsw;
double BSIM4lrsw;
@ -1157,6 +1179,7 @@ typedef struct sBSIM4model
double BSIM4wvoff;
double BSIM4wtvoff;
double BSIM4wminv;
double BSIM4wminvcv;
double BSIM4wdelta;
double BSIM4wrdsw;
double BSIM4wrsw;
@ -1301,6 +1324,7 @@ typedef struct sBSIM4model
double BSIM4pvoff;
double BSIM4ptvoff;
double BSIM4pminv;
double BSIM4pminvcv;
double BSIM4pdelta;
double BSIM4prdsw;
double BSIM4prsw;
@ -1494,6 +1518,7 @@ typedef struct sBSIM4model
/* Pre-calculated constants
* move to size-dependent param */
double BSIM4Eg0;
double BSIM4vtm;
double BSIM4vtm0;
double BSIM4coxe;
@ -1536,6 +1561,7 @@ typedef struct sBSIM4model
/* Flags */
unsigned BSIM4mobModGiven :1;
unsigned BSIM4binUnitGiven :1;
unsigned BSIM4cvchargeModGiven :1;
unsigned BSIM4capModGiven :1;
unsigned BSIM4dioModGiven :1;
unsigned BSIM4rdsModGiven :1;
@ -1548,11 +1574,16 @@ typedef struct sBSIM4model
unsigned BSIM4acnqsModGiven :1;
unsigned BSIM4fnoiModGiven :1;
unsigned BSIM4tnoiModGiven :1;
unsigned BSIM4mtrlModGiven :1;
unsigned BSIM4igcModGiven :1;
unsigned BSIM4igbModGiven :1;
unsigned BSIM4tempModGiven :1;
unsigned BSIM4typeGiven :1;
unsigned BSIM4toxrefGiven :1;
unsigned BSIM4eotGiven :1;
unsigned BSIM4vddeotGiven :1;
unsigned BSIM4adosGiven :1;
unsigned BSIM4bdosGiven :1;
unsigned BSIM4toxeGiven :1;
unsigned BSIM4toxpGiven :1;
unsigned BSIM4toxmGiven :1;
@ -1573,6 +1604,14 @@ typedef struct sBSIM4model
unsigned BSIM4a2Given :1;
unsigned BSIM4ketaGiven :1;
unsigned BSIM4nsubGiven :1;
unsigned BSIM4phigGiven :1;
unsigned BSIM4epsrgateGiven :1;
unsigned BSIM4easubGiven :1;
unsigned BSIM4epsrsubGiven :1;
unsigned BSIM4ni0subGiven :1;
unsigned BSIM4bg0subGiven :1;
unsigned BSIM4tbgasubGiven :1;
unsigned BSIM4tbgbsubGiven :1;
unsigned BSIM4ndepGiven :1;
unsigned BSIM4nsdGiven :1;
unsigned BSIM4phinGiven :1;
@ -1619,7 +1658,9 @@ typedef struct sBSIM4model
unsigned BSIM4voffGiven :1;
unsigned BSIM4tvoffGiven :1;
unsigned BSIM4vofflGiven :1;
unsigned BSIM4voffcvlGiven :1;
unsigned BSIM4minvGiven :1;
unsigned BSIM4minvcvGiven :1;
unsigned BSIM4rdswGiven :1;
unsigned BSIM4rdswminGiven :1;
unsigned BSIM4rdwminGiven :1;
@ -1876,6 +1917,7 @@ typedef struct sBSIM4model
unsigned BSIM4lvoffGiven :1;
unsigned BSIM4ltvoffGiven :1;
unsigned BSIM4lminvGiven :1;
unsigned BSIM4lminvcvGiven :1;
unsigned BSIM4lrdswGiven :1;
unsigned BSIM4lrswGiven :1;
unsigned BSIM4lrdwGiven :1;
@ -2020,6 +2062,7 @@ typedef struct sBSIM4model
unsigned BSIM4wvoffGiven :1;
unsigned BSIM4wtvoffGiven :1;
unsigned BSIM4wminvGiven :1;
unsigned BSIM4wminvcvGiven :1;
unsigned BSIM4wrdswGiven :1;
unsigned BSIM4wrswGiven :1;
unsigned BSIM4wrdwGiven :1;
@ -2164,6 +2207,7 @@ typedef struct sBSIM4model
unsigned BSIM4pvoffGiven :1;
unsigned BSIM4ptvoffGiven :1;
unsigned BSIM4pminvGiven :1;
unsigned BSIM4pminvcvGiven :1;
unsigned BSIM4prdswGiven :1;
unsigned BSIM4prswGiven :1;
unsigned BSIM4prdwGiven :1;
@ -2408,35 +2452,49 @@ typedef struct sBSIM4model
#define BSIM4_M 38
/* Global parameters */
#define BSIM4_MOD_TEMPMOD 89
#define BSIM4_MOD_IGCMOD 90
#define BSIM4_MOD_IGBMOD 91
#define BSIM4_MOD_ACNQSMOD 92
#define BSIM4_MOD_FNOIMOD 93
#define BSIM4_MOD_RDSMOD 94
#define BSIM4_MOD_DIOMOD 96
#define BSIM4_MOD_PERMOD 97
#define BSIM4_MOD_GEOMOD 98
#define BSIM4_MOD_RGATEMOD 99
#define BSIM4_MOD_RBODYMOD 100
#define BSIM4_MOD_CAPMOD 101
#define BSIM4_MOD_TRNQSMOD 102
#define BSIM4_MOD_MOBMOD 103
#define BSIM4_MOD_TNOIMOD 104
#define BSIM4_MOD_TOXE 105
#define BSIM4_MOD_CDSC 106
#define BSIM4_MOD_CDSCB 107
#define BSIM4_MOD_CIT 108
#define BSIM4_MOD_NFACTOR 109
#define BSIM4_MOD_XJ 110
#define BSIM4_MOD_VSAT 111
#define BSIM4_MOD_AT 112
#define BSIM4_MOD_A0 113
#define BSIM4_MOD_A1 114
#define BSIM4_MOD_A2 115
#define BSIM4_MOD_KETA 116
#define BSIM4_MOD_NSUB 117
#define BSIM4_MOD_NDEP 118
#define BSIM4_MOD_CVCHARGEMOD 77
#define BSIM4_MOD_ADOS 78
#define BSIM4_MOD_BDOS 79
#define BSIM4_MOD_TEMPMOD 80
#define BSIM4_MOD_MTRLMOD 81
#define BSIM4_MOD_IGCMOD 82
#define BSIM4_MOD_IGBMOD 83
#define BSIM4_MOD_ACNQSMOD 84
#define BSIM4_MOD_FNOIMOD 85
#define BSIM4_MOD_RDSMOD 86
#define BSIM4_MOD_DIOMOD 87
#define BSIM4_MOD_PERMOD 88
#define BSIM4_MOD_GEOMOD 89
#define BSIM4_MOD_RGATEMOD 90
#define BSIM4_MOD_RBODYMOD 91
#define BSIM4_MOD_CAPMOD 92
#define BSIM4_MOD_TRNQSMOD 93
#define BSIM4_MOD_MOBMOD 94
#define BSIM4_MOD_TNOIMOD 95
#define BSIM4_MOD_EOT 96
#define BSIM4_MOD_VDDEOT 97
#define BSIM4_MOD_TOXE 98
#define BSIM4_MOD_CDSC 99
#define BSIM4_MOD_CDSCB 100
#define BSIM4_MOD_CIT 101
#define BSIM4_MOD_NFACTOR 102
#define BSIM4_MOD_XJ 103
#define BSIM4_MOD_VSAT 104
#define BSIM4_MOD_AT 105
#define BSIM4_MOD_A0 106
#define BSIM4_MOD_A1 107
#define BSIM4_MOD_A2 108
#define BSIM4_MOD_KETA 109
#define BSIM4_MOD_NSUB 110
#define BSIM4_MOD_PHIG 111
#define BSIM4_MOD_EPSRGATE 112
#define BSIM4_MOD_EASUB 113
#define BSIM4_MOD_EPSRSUB 114
#define BSIM4_MOD_NI0SUB 115
#define BSIM4_MOD_BG0SUB 116
#define BSIM4_MOD_TBGASUB 117
#define BSIM4_MOD_TBGBSUB 118
#define BSIM4_MOD_NDEP 119
#define BSIM4_MOD_NGATE 120
#define BSIM4_MOD_GAMMA1 121
#define BSIM4_MOD_GAMMA2 122
@ -2607,6 +2665,8 @@ typedef struct sBSIM4model
#define BSIM4_MOD_LP 293
#define BSIM4_MOD_TVOFF 294
#define BSIM4_MOD_TVFBSDOFF 295
#define BSIM4_MOD_MINVCV 296
#define BSIM4_MOD_VOFFCVL 297
/* Length dependence */
#define BSIM4_MOD_LCDSC 301
@ -2742,6 +2802,7 @@ typedef struct sBSIM4model
#define BSIM4_MOD_LUD1 440
#define BSIM4_MOD_LUP 441
#define BSIM4_MOD_LLP 442
#define BSIM4_MOD_LMINVCV 443
/* Width dependence */
#define BSIM4_MOD_WCDSC 481
@ -2876,6 +2937,7 @@ typedef struct sBSIM4model
#define BSIM4_MOD_WUD1 620
#define BSIM4_MOD_WUP 621
#define BSIM4_MOD_WLP 622
#define BSIM4_MOD_WMINVCV 623
/* Cross-term dependence */
#define BSIM4_MOD_PCDSC 661
@ -3032,13 +3094,14 @@ typedef struct sBSIM4model
#define BSIM4_MOD_STETA0 814
#define BSIM4_MOD_LODETA0 815
#define BSIM4_MOD_WEB 816
#define BSIM4_MOD_WEC 817
#define BSIM4_MOD_WEB 816
#define BSIM4_MOD_WEC 817
#define BSIM4_MOD_KVTH0WE 818
#define BSIM4_MOD_K2WE 819
#define BSIM4_MOD_KU0WE 820
#define BSIM4_MOD_SCREF 821
#define BSIM4_MOD_WPEMOD 822
#define BSIM4_MOD_K2WE 819
#define BSIM4_MOD_KU0WE 820
#define BSIM4_MOD_SCREF 821
#define BSIM4_MOD_WPEMOD 822
#define BSIM4_MOD_PMINVCV 823
#define BSIM4_MOD_PLAMBDA 825
#define BSIM4_MOD_PVTL 826
@ -3317,11 +3380,17 @@ typedef struct sBSIM4model
#include "bsim4ext.h"
#ifdef __STDC__
extern void BSIM4evaluate(double,double,double,BSIM4instance*,BSIM4model*,
double*,double*,double*, double*, double*, double*, double*,
double*, double*, double*, double*, double*, double*, double*,
double*, double*, double*, double*, CKTcircuit*);
extern int BSIM4debug(BSIM4model*, BSIM4instance*, CKTcircuit*, int);
extern int BSIM4checkModel(BSIM4model*, BSIM4instance*, CKTcircuit*);
#else /* stdc */
extern void BSIM4evaluate();
extern int BSIM4debug();
extern int BSIM4checkModel();
#endif /* stdc */
#endif /*BSIM4*/