add latest available psp103 version to adms

This commit is contained in:
dwarning 2020-12-29 17:09:50 +01:00 committed by Holger Vogt
parent 70d1647cfa
commit 0e9d1c50a4
19 changed files with 7113 additions and 4 deletions

View File

@ -1101,7 +1101,8 @@ if test "x$enable_adms" = xyes ; then
adms/ekv \
adms/hicum0 \
adms/mextram \
adms/psp102 "
adms/psp102 \
adms/psp103 "
# The makefiles for adms (to be added to AC_CONFIG_FILES by ./autogen.sh --adms)
#VLAMKF src/spicelib/devices/adms/bsimbulk/Makefile
@ -1110,6 +1111,7 @@ if test "x$enable_adms" = xyes ; then
#VLAMKF src/spicelib/devices/adms/hicum0/Makefile
#VLAMKF src/spicelib/devices/adms/mextram/Makefile
#VLAMKF src/spicelib/devices/adms/psp102/Makefile
#VLAMKF src/spicelib/devices/adms/psp103/Makefile
NOTVLADEVDIR=""
@ -1118,7 +1120,8 @@ if test "x$enable_adms" = xyes ; then
spicelib/devices/adms/ekv/libekv.la \
spicelib/devices/adms/hicum0/libhicum0.la \
spicelib/devices/adms/mextram/libbjt504t.la \
spicelib/devices/adms/psp102/libpsp102.la "
spicelib/devices/adms/psp102/libpsp102.la \
spicelib/devices/adms/psp103/libpsp103.la "
else

View File

@ -1943,6 +1943,12 @@
<admst:value-to select="value" value="psp102"/>
</admst:new>
</admst:when>
<admst:when test="[lower-case(name)='psp103va']">
<admst:new datatype="attribute" arguments="ngspicename">
<admst:push into="../attribute" select="." onduplicate="abort"/>
<admst:value-to select="value" value="psp103"/>
</admst:new>
</admst:when>
<admst:otherwise>
<admst:new datatype="attribute" arguments="ngspicename">
<admst:push into="../attribute" select="." onduplicate="abort"/>
@ -2094,6 +2100,52 @@
</admst:new>
</admst:if>
</admst:when>
<admst:when test="[lower-case(name)='psp103va']">
<admst:if test="[nilled(variable[name='nmos'])]">
<admst:value-of select="analog"/>
<admst:value-of select="."/>
<admst:new datatype="variable" arguments="%p,nmos,%p">
<admst:push into="module/variable" select="." onduplicate="ignore"/>
<admst:value-to select="sizetype" value="scalar"/>
<admst:value-to select="type" value="integer"/>
<admst:value-to select="input" value="yes"/>
<admst:value-to select="output" value="yes"/>
<admst:value-to select="parametertype" value="model"/>
<admst:value-to select="scope" value="global_model"/>
<admst:new datatype="number" arguments="1">
<admst:value-to select="scalingunit" value="1"/>
<admst:value-of select="."/>
<admst:value-of select="../module"/>
<admst:new datatype="expression" arguments="%p,%p">
<admst:value-of select="."/>
<admst:value-to select="../../default" value="%p"/>
</admst:new>
</admst:new>
</admst:new>
</admst:if>
<admst:if test="[nilled(variable[name='pmos'])]">
<admst:value-of select="analog"/>
<admst:value-of select="."/>
<admst:new datatype="variable" arguments="%p,pmos,%p">
<admst:push into="module/variable" select="." onduplicate="ignore"/>
<admst:value-to select="sizetype" value="scalar"/>
<admst:value-to select="type" value="integer"/>
<admst:value-to select="input" value="yes"/>
<admst:value-to select="output" value="yes"/>
<admst:value-to select="parametertype" value="model"/>
<admst:value-to select="scope" value="global_model"/>
<admst:new datatype="number" arguments="1">
<admst:value-to select="scalingunit" value="1"/>
<admst:value-of select="."/>
<admst:value-of select="../module"/>
<admst:new datatype="expression" arguments="%p,%p">
<admst:value-of select="."/>
<admst:value-to select="../../default" value="%p"/>
</admst:new>
</admst:new>
</admst:new>
</admst:if>
</admst:when>
<admst:when test="[name='ekv']">
<admst:if test="[nilled(variable[name='nmos'])]">
<admst:value-of select="analog"/>

View File

@ -0,0 +1,176 @@
//======================================================================================
//======================================================================================
// Filename: Common103_macrodefs.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 103.7.0 (PSP), 200.6.0 (JUNCAP), April 2019
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
//////////////////////////////////////////////////////////////
//
// General macros and constants for compact va-models
//
//////////////////////////////////////////////////////////////
// Clipping functions
`define CLIP_LOW(val,min) ((val)>(min)?(val):(min))
`define CLIP_HIGH(val,max) ((val)<(max)?(val):(max))
`define CLIP_BOTH(val,min,max) ((val)>(min)?((val)<(max)?(val):(max)):(min))
`ifdef insideADMS
`define INITIAL_MODEL @(initial_model)
`define INITIAL_INSTANCE @(initial_instance)
`define from(lower,upper) from [lower:upper]
`else
`define INITIAL_MODEL
`define INITIAL_INSTANCE
`define from(lower,upper)
`endif
// Min/Max functions
`define MAX(x,y) ((x)>(y)?(x):(y))
`define MIN(x,y) ((x)<(y)?(x):(y))
// Mathematical constants
`define PI 3.1415926535897931
`define SQRTPI 1.77245385090551603
// Physical constants
`define KELVINCONVERSION 273.15
`define KBOL 1.3806505E-23
`define QELE 1.6021918E-19
`define HBAR 1.05457168E-34
`define MELE 9.1093826E-31
`define EPSO 8.8541878176E-12
`define EPSRSI 11.8
// Other constants
`define oneThird 3.3333333333333333e-01
`define twoThirds 6.6666666666666667e-01
// Constants needed in safe exponential function (called "expl")
`define se 4.6051701859880916e+02
`define se05 2.3025850929940458e+02
`define ke 1.0e-200
`define ke05 1.0e-100
`define keinv 1.0e200
`define ke05inv 1.0e100
// P3 3rd order polynomial expansion of exp()
`define P3(u) (1.0 + (u) * (1.0 + 0.5 * ((u) * (1.0 + (u) * `oneThird))))
// expl exp() with 3rd order polynomial extrapolation for very low values (exp_low),
// very high values (exp_high), or both (expl)
`define expl(x, res) \
if (abs(x) < `se05) begin\
res = exp(x); \
end else begin \
if ((x) < 0.0) begin\
res = `ke05 / `P3(-`se05 - (x)); \
end else begin\
res = `ke05inv * `P3((x) - `se05); \
end \
end
`define expl_low(x, res) \
if ((x) > -`se05) begin\
res = exp(x); \
end else begin\
res = `ke05 / `P3(-`se05 - (x)); \
end
`define expl_high(x, res) \
if ((x) < `se05) begin\
res = exp(x); \
end else begin \
res = `ke05inv * `P3((x) - `se05); \
end
// Exchange function
`define swap(a, b) \
temp = a; \
a = b; \
b = temp;
// Parameter definition macros: "des" description argument is intended to
// be a short description, the "inf" information argument is intended to be
// a detailed description (e.g. for display as part of on-line help).
//
// MPR model parameter real
// MPI model parameter integer
// IPR instance parameter real
// IPI instance parameter integer
// OPP operating point parameter, includes units and description for printing
// OPM operating point parameter, scales with $mfactor
// OPD operating point parameter, scales with 1/$mfactor
//
// Instance parameters have the attribute *type="instance"* and note that
// compilers treat these as both instance and model parameters, with a
// specified instance value taking precedence over a specified model card value.
//
// There are some issues with passing range directives with some compilers,
// so for each parameter declaration there are multiple versions:
// cc closed lower bound, closed upper bound
// co closed lower bound, open upper bound
// cz closed lower bound of zero (no upper bound)
// oc open lower bound, closed upper bound
// oo open lower bound, open upper bound
// oz open lower bound of zero (no upper bound)
// nb no bounds
// sw switch (integer only, values 0=false and >0=true)
// ty switch (integer only, values -1=n-type and +1=p-type)
//
`define ALIAS(alias,paramName) aliasparam alias = paramName;
`define OPP(nam,uni,des) (*units=uni, desc=des*) real nam;
`define OPM(nam,uni,des) (*units=uni, multiplicity="multiply", desc=des*) real nam;
`define OPD(nam,uni,des) (*units=uni, multiplicity="divide", desc=des*) real nam;
`define MPRcc(nam,def,uni,lwr,upr,des) (*units=uni , desc=des*) parameter real nam=def from[lwr:upr];
`define MPRco(nam,def,uni,lwr,upr,des) (*units=uni , desc=des*) parameter real nam=def from[lwr:upr);
`define MPRcz(nam,def,uni, des) (*units=uni , desc=des*) parameter real nam=def from[ 0:inf);
`define MPRoc(nam,def,uni,lwr,upr,des) (*units=uni , desc=des*) parameter real nam=def from(lwr:upr];
`define MPRoo(nam,def,uni,lwr,upr,des) (*units=uni , desc=des*) parameter real nam=def from(lwr:upr);
`define MPRoz(nam,def,uni, des) (*units=uni , desc=des*) parameter real nam=def from( 0:inf);
`define MPRnb(nam,def,uni, des) (*units=uni , desc=des*) parameter real nam=def;
`define MPIcc(nam,def,uni,lwr,upr,des) (*units=uni , desc=des*) parameter integer nam=def from[lwr:upr];
`define MPIco(nam,def,uni,lwr,upr,des) (*units=uni , desc=des*) parameter integer nam=def from[lwr:upr);
`define MPIcz(nam,def,uni, des) (*units=uni , desc=des*) parameter integer nam=def from[ 0:inf);
`define MPIoc(nam,def,uni,lwr,upr,des) (*units=uni , desc=des*) parameter integer nam=def from(lwr:upr];
`define MPIoo(nam,def,uni,lwr,upr,des) (*units=uni , desc=des*) parameter integer nam=def from(lwr:upr);
`define MPIoz(nam,def,uni, des) (*units=uni , desc=des*) parameter integer nam=def from( 0:inf);
`define MPInb(nam,def,uni, des) (*units=uni , desc=des*) parameter integer nam=def;
`define MPIsw(nam,def,uni, des) (*units=uni , desc=des*) parameter integer nam=def from[ 0:inf);
`define MPIty(nam,def,uni, des) (*units=uni , desc=des*) parameter integer nam=def from[ -1: 1] exclude 0;
`define IPRcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr];
`define IPRco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr);
`define IPRcz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[ 0:inf);
`define IPRoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr];
`define IPRoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr);
`define IPRoz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def from( 0:inf);
`define IPRnb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def;
`define IPIcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr];
`define IPIco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr);
`define IPIcz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[ 0:inf);
`define IPIoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr];
`define IPIoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr);
`define IPIoz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from( 0:inf);
`define IPInb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def;
`define IPIsw(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[ 0:inf);

View File

@ -0,0 +1,406 @@
//======================================================================================
//======================================================================================
// Filename: JUNCAP200_InitModel.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 200.6.0, April 2019
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
// --------------------------------------------------------------------------------------------------------------
// Calculation of internal parameters which are independent on instance parameters
// --------------------------------------------------------------------------------------------------------------
TRJ_i = `CLIP_LOW( TRJ ,`TRJ_cliplow);
IMAX_i = `CLIP_LOW( IMAX ,`IMAX_cliplow);
FREV_i = `CLIP_BOTH(FREV ,`FREV_cliplow,`FREV_cliphigh);
//IFACTOR_i = `CLIP_LOW( IFACTOR ,`IFACTOR_cliplow);
//CFACTOR_i = `CLIP_LOW( CFACTOR ,`CFACTOR_cliplow);
CJORBOT_i = `CLIP_LOW( CJORBOT ,`CJORBOT_cliplow);
CJORSTI_i = `CLIP_LOW( CJORSTI ,`CJORSTI_cliplow);
CJORGAT_i = `CLIP_LOW( CJORGAT ,`CJORGAT_cliplow);
VBIRBOT_i = `CLIP_LOW( VBIRBOT ,`VBIR_cliplow);
VBIRSTI_i = `CLIP_LOW( VBIRSTI ,`VBIR_cliplow);
VBIRGAT_i = `CLIP_LOW( VBIRGAT ,`VBIR_cliplow);
PBOT_i = `CLIP_BOTH(PBOT ,`P_cliplow,`P_cliphigh);
PSTI_i = `CLIP_BOTH(PSTI ,`P_cliplow,`P_cliphigh);
PGAT_i = `CLIP_BOTH(PGAT ,`P_cliplow,`P_cliphigh);
PHIGBOT_i = PHIGBOT;
PHIGSTI_i = PHIGSTI;
PHIGGAT_i = PHIGGAT;
IDSATRBOT_i = `CLIP_LOW( IDSATRBOT ,`IDSATR_cliplow);
IDSATRSTI_i = `CLIP_LOW( IDSATRSTI ,`IDSATR_cliplow);
IDSATRGAT_i = `CLIP_LOW( IDSATRGAT ,`IDSATR_cliplow);
CSRHBOT_i = `CLIP_LOW( CSRHBOT ,`CSRH_cliplow);
CSRHSTI_i = `CLIP_LOW( CSRHSTI ,`CSRH_cliplow);
CSRHGAT_i = `CLIP_LOW( CSRHGAT ,`CSRH_cliplow);
XJUNSTI_i = `CLIP_LOW( XJUNSTI ,`XJUN_cliplow);
XJUNGAT_i = `CLIP_LOW( XJUNGAT ,`XJUN_cliplow);
CTATBOT_i = `CLIP_LOW( CTATBOT ,`CTAT_cliplow);
CTATSTI_i = `CLIP_LOW( CTATSTI ,`CTAT_cliplow);
CTATGAT_i = `CLIP_LOW( CTATGAT ,`CTAT_cliplow);
MEFFTATBOT_i = `CLIP_LOW( MEFFTATBOT ,`MEFFTAT_cliplow);
MEFFTATSTI_i = `CLIP_LOW( MEFFTATSTI ,`MEFFTAT_cliplow);
MEFFTATGAT_i = `CLIP_LOW( MEFFTATGAT ,`MEFFTAT_cliplow);
CBBTBOT_i = `CLIP_LOW( CBBTBOT ,`CBBT_cliplow);
CBBTSTI_i = `CLIP_LOW( CBBTSTI ,`CBBT_cliplow);
CBBTGAT_i = `CLIP_LOW( CBBTGAT ,`CBBT_cliplow);
FBBTRBOT_i = FBBTRBOT;
FBBTRSTI_i = FBBTRSTI;
FBBTRGAT_i = FBBTRGAT;
STFBBTBOT_i = STFBBTBOT;
STFBBTSTI_i = STFBBTSTI;
STFBBTGAT_i = STFBBTGAT;
VBRBOT_i = `CLIP_LOW( VBRBOT ,`VBR_cliplow);
VBRSTI_i = `CLIP_LOW( VBRSTI ,`VBR_cliplow);
VBRGAT_i = `CLIP_LOW( VBRGAT ,`VBR_cliplow);
PBRBOT_i = `CLIP_LOW( PBRBOT ,`PBR_cliplow);
PBRSTI_i = `CLIP_LOW( PBRSTI ,`PBR_cliplow);
PBRGAT_i = `CLIP_LOW( PBRGAT ,`PBR_cliplow);
SWJUNEXP_i = 0.0;
if (SWJUNEXP > 0.5) begin
SWJUNEXP_i = 1.0;
end else begin
SWJUNEXP_i = 0.0;
end
VJUNREF_i = `CLIP_LOW( VJUNREF ,`VJUNREF_cliplow);
FJUNQ_i = `CLIP_LOW( FJUNQ ,`FJUNQ_cliplow);
`ifdef JUNCAP_StandAlone
// do nothing
`else // JUNCAP_StandAlone
if (SWJUNASYM == 0.0) begin
CJORBOTD_i = CJORBOT_i;
CJORSTID_i = CJORSTI_i;
CJORGATD_i = CJORGAT_i;
VBIRBOTD_i = VBIRBOT_i;
VBIRSTID_i = VBIRSTI_i;
VBIRGATD_i = VBIRGAT_i;
PBOTD_i = PBOT_i;
PSTID_i = PSTI_i;
PGATD_i = PGAT_i;
PHIGBOTD_i = PHIGBOT_i;
PHIGSTID_i = PHIGSTI_i;
PHIGGATD_i = PHIGGAT_i;
IDSATRBOTD_i = IDSATRBOT_i;
IDSATRSTID_i = IDSATRSTI_i;
IDSATRGATD_i = IDSATRGAT_i;
CSRHBOTD_i = CSRHBOT_i;
CSRHSTID_i = CSRHSTI_i;
CSRHGATD_i = CSRHGAT_i;
XJUNSTID_i = XJUNSTI_i;
XJUNGATD_i = XJUNGAT_i;
CTATBOTD_i = CTATBOT_i;
CTATSTID_i = CTATSTI_i;
CTATGATD_i = CTATGAT_i;
MEFFTATBOTD_i = MEFFTATBOT_i;
MEFFTATSTID_i = MEFFTATSTI_i;
MEFFTATGATD_i = MEFFTATGAT_i;
CBBTBOTD_i = CBBTBOT_i;
CBBTSTID_i = CBBTSTI_i;
CBBTGATD_i = CBBTGAT_i;
FBBTRBOTD_i = FBBTRBOT_i;
FBBTRSTID_i = FBBTRSTI_i;
FBBTRGATD_i = FBBTRGAT_i;
STFBBTBOTD_i = STFBBTBOT_i;
STFBBTSTID_i = STFBBTSTI_i;
STFBBTGATD_i = STFBBTGAT_i;
VBRBOTD_i = VBRBOT_i;
VBRSTID_i = VBRSTI_i;
VBRGATD_i = VBRGAT_i;
PBRBOTD_i = PBRBOT_i;
PBRSTID_i = PBRSTI_i;
PBRGATD_i = PBRGAT_i;
VJUNREFD_i = VJUNREF_i;
FJUNQD_i = FJUNQ_i;
end else begin
CJORBOTD_i = `CLIP_LOW( CJORBOTD ,`CJORBOT_cliplow);
CJORSTID_i = `CLIP_LOW( CJORSTID ,`CJORSTI_cliplow);
CJORGATD_i = `CLIP_LOW( CJORGATD ,`CJORGAT_cliplow);
VBIRBOTD_i = `CLIP_LOW( VBIRBOTD ,`VBIR_cliplow);
VBIRSTID_i = `CLIP_LOW( VBIRSTID ,`VBIR_cliplow);
VBIRGATD_i = `CLIP_LOW( VBIRGATD ,`VBIR_cliplow);
PBOTD_i = `CLIP_BOTH(PBOTD ,`P_cliplow,`P_cliphigh);
PSTID_i = `CLIP_BOTH(PSTID ,`P_cliplow,`P_cliphigh);
PGATD_i = `CLIP_BOTH(PGATD ,`P_cliplow,`P_cliphigh);
PHIGBOTD_i = PHIGBOTD;
PHIGSTID_i = PHIGSTID;
PHIGGATD_i = PHIGGATD;
IDSATRBOTD_i = `CLIP_LOW( IDSATRBOTD ,`IDSATR_cliplow);
IDSATRSTID_i = `CLIP_LOW( IDSATRSTID ,`IDSATR_cliplow);
IDSATRGATD_i = `CLIP_LOW( IDSATRGATD ,`IDSATR_cliplow);
CSRHBOTD_i = `CLIP_LOW( CSRHBOTD ,`CSRH_cliplow);
CSRHSTID_i = `CLIP_LOW( CSRHSTID ,`CSRH_cliplow);
CSRHGATD_i = `CLIP_LOW( CSRHGATD ,`CSRH_cliplow);
XJUNSTID_i = `CLIP_LOW( XJUNSTID ,`XJUN_cliplow);
XJUNGATD_i = `CLIP_LOW( XJUNGATD ,`XJUN_cliplow);
CTATBOTD_i = `CLIP_LOW( CTATBOTD ,`CTAT_cliplow);
CTATSTID_i = `CLIP_LOW( CTATSTID ,`CTAT_cliplow);
CTATGATD_i = `CLIP_LOW( CTATGATD ,`CTAT_cliplow);
MEFFTATBOTD_i = `CLIP_LOW( MEFFTATBOTD,`MEFFTAT_cliplow);
MEFFTATSTID_i = `CLIP_LOW( MEFFTATSTID,`MEFFTAT_cliplow);
MEFFTATGATD_i = `CLIP_LOW( MEFFTATGATD,`MEFFTAT_cliplow);
CBBTBOTD_i = `CLIP_LOW( CBBTBOTD ,`CBBT_cliplow);
CBBTSTID_i = `CLIP_LOW( CBBTSTID ,`CBBT_cliplow);
CBBTGATD_i = `CLIP_LOW( CBBTGATD ,`CBBT_cliplow);
FBBTRBOTD_i = FBBTRBOTD;
FBBTRSTID_i = FBBTRSTID;
FBBTRGATD_i = FBBTRGATD;
STFBBTBOTD_i = STFBBTBOTD;
STFBBTSTID_i = STFBBTSTID;
STFBBTGATD_i = STFBBTGATD;
VBRBOTD_i = `CLIP_LOW( VBRBOTD ,`VBR_cliplow);
VBRSTID_i = `CLIP_LOW( VBRSTID ,`VBR_cliplow);
VBRGATD_i = `CLIP_LOW( VBRGATD ,`VBR_cliplow);
PBRBOTD_i = `CLIP_LOW( PBRBOTD ,`PBR_cliplow);
PBRSTID_i = `CLIP_LOW( PBRSTID ,`PBR_cliplow);
PBRGATD_i = `CLIP_LOW( PBRGATD ,`PBR_cliplow);
VJUNREFD_i = `CLIP_LOW( VJUNREFD ,`VJUNREF_cliplow);
FJUNQD_i = `CLIP_LOW( FJUNQD ,`FJUNQ_cliplow);
end
`endif // JUNCAP_StandAlone
tkr = `KELVINCONVERSION + TRJ_i;
tkd = max($temperature + DTA, `KELVINCONVERSION + `MINTEMP);
auxt = tkd / tkr;
KBOL_over_QELE = `KBOL / `QELE;
phitr = KBOL_over_QELE * tkr;
phitrinv = 1.0 / phitr;
phitd = KBOL_over_QELE * tkd;
phitdinv = 1.0 / phitd;
// bandgap voltages at reference temperature
deltaphigr = -(7.02e-4 * tkr * tkr) / (1108.0 + tkr);
phigrbot = PHIGBOT_i + deltaphigr;
phigrsti = PHIGSTI_i + deltaphigr;
phigrgat = PHIGGAT_i + deltaphigr;
// bandgap voltages at device temperature
deltaphigd = -(7.02e-4 * tkd * tkd) / (1108.0 + tkd);
phigdbot = PHIGBOT_i + deltaphigd;
phigdsti = PHIGSTI_i + deltaphigd;
phigdgat = PHIGGAT_i + deltaphigd;
// factors ftd for ideal-current model
ftdbot = (pow(auxt, 1.5)) * exp(0.5 * ((phigrbot * phitrinv) - (phigdbot * phitdinv)));
ftdsti = (pow(auxt, 1.5)) * exp(0.5 * ((phigrsti * phitrinv) - (phigdsti * phitdinv)));
ftdgat = (pow(auxt, 1.5)) * exp(0.5 * ((phigrgat * phitrinv) - (phigdgat * phitdinv)));
// temperature-scaled saturation current for ideal-current model
idsatbot = IDSATRBOT_i * ftdbot * ftdbot;
idsatsti = IDSATRSTI_i * ftdsti * ftdsti;
idsatgat = IDSATRGAT_i * ftdgat * ftdgat;
// built-in voltages before limiting
ubibot = VBIRBOT_i * auxt - 2.0 * phitd * ln(ftdbot);
ubisti = VBIRSTI_i * auxt - 2.0 * phitd * ln(ftdsti);
ubigat = VBIRGAT_i * auxt - 2.0 * phitd * ln(ftdgat);
// built-in voltages limited to phitd
vbibot = ubibot + phitd * ln(1 + exp((`vbilow - ubibot) * phitdinv));
vbisti = ubisti + phitd * ln(1 + exp((`vbilow - ubisti) * phitdinv));
vbigat = ubigat + phitd * ln(1 + exp((`vbilow - ubigat) * phitdinv));
// inverse values of built-in voltages
vbiinvbot = 1.0 / vbibot;
vbiinvsti = 1.0 / vbisti;
vbiinvgat = 1.0 / vbigat;
// one minus the grading coefficient
one_minus_PBOT = 1.0 - PBOT_i;
one_minus_PSTI = 1.0 - PSTI_i;
one_minus_PGAT = 1.0 - PGAT_i;
// one over "one minus the grading coefficient"
one_over_one_minus_PBOT = 1.0 / one_minus_PBOT;
one_over_one_minus_PSTI = 1.0 / one_minus_PSTI;
one_over_one_minus_PGAT = 1.0 / one_minus_PGAT;
// temperature-scaled zero-bias capacitance
cjobot = CJORBOT_i * pow((VBIRBOT_i * vbiinvbot), PBOT_i);
cjosti = CJORSTI_i * pow((VBIRSTI_i * vbiinvsti), PSTI_i);
cjogat = CJORGAT_i * pow((VBIRGAT_i * vbiinvgat), PGAT_i);
// prefactor in physical part of charge model
qprefbot = cjobot * vbibot * one_over_one_minus_PBOT;
qprefsti = cjosti * vbisti * one_over_one_minus_PSTI;
qprefgat = cjogat * vbigat * one_over_one_minus_PGAT;
// prefactor in mathematical extension of charge model
qpref2bot = `a * cjobot;
qpref2sti = `a * cjosti;
qpref2gat = `a * cjogat;
// zero-bias depletion widths at reference temperature, needed in SRH and TAT model
wdepnulrbot = EPSSI / CJORBOT_i;
wdepnulrsti = XJUNSTI_i * EPSSI / CJORSTI_i;
wdepnulrgat = XJUNGAT_i * EPSSI / CJORGAT_i;
// inverse values of "wdepnulr", used in BBT model
wdepnulrinvbot = 1.0 / wdepnulrbot;
wdepnulrinvsti = 1.0 / wdepnulrsti;
wdepnulrinvgat = 1.0 / wdepnulrgat;
// inverse values of built-in voltages at reference temperature, needed in SRH and BBT model
VBIRBOTinv = 1.0 / VBIRBOT_i;
VBIRSTIinv = 1.0 / VBIRSTI_i;
VBIRGATinv = 1.0 / VBIRGAT_i;
// some constants needed in erfc-approximation, needed in TAT model
perfc = (`SQRTPI * `aerfc);
berfc = ((-5.0 * (`aerfc) + 6.0 - pow((perfc), -2.0)) / 3.0);
cerfc = (1.0 - (`aerfc) - (berfc));
// half the bandgap energy, limited to values > phitd, needed in TAT model
deltaEbot = max(0.5 * phigdbot, phitd);
deltaEsti = max(0.5 * phigdsti, phitd);
deltaEgat = max(0.5 * phigdgat, phitd);
// values of atat, needed in TAT model
atatbot = deltaEbot * phitdinv;
atatsti = deltaEsti * phitdinv;
atatgat = deltaEgat * phitdinv;
// values of btatpart, needed in TAT model
btatpartbot = sqrt(32.0 * MEFFTATBOT_i * `MELE * `QELE * (deltaEbot * deltaEbot * deltaEbot)) / (3.0 * `HBAR);
btatpartsti = sqrt(32.0 * MEFFTATSTI_i * `MELE * `QELE * (deltaEsti * deltaEsti * deltaEsti)) / (3.0 * `HBAR);
btatpartgat = sqrt(32.0 * MEFFTATGAT_i * `MELE * `QELE * (deltaEgat * deltaEgat * deltaEgat)) / (3.0 * `HBAR);
// temperature-scaled values of FBBT, needed in BBT model
fbbtbot = FBBTRBOT_i * (1.0 + STFBBTBOT_i * (tkd - tkr));
fbbtsti = FBBTRSTI_i * (1.0 + STFBBTSTI_i * (tkd - tkr));
fbbtgat = FBBTRGAT_i * (1.0 + STFBBTGAT_i * (tkd - tkr));
fbbtbot = `CLIP_LOW(fbbtbot, 0.0);
fbbtsti = `CLIP_LOW(fbbtsti, 0.0);
fbbtgat = `CLIP_LOW(fbbtgat, 0.0);
// values of fstop, needed in avalanche/breakdown model
alphaav = 1.0 - 1.0 / FREV_i;
fstopbot = 1.0 / (1.0 - pow(alphaav, PBRBOT_i));
fstopsti = 1.0 / (1.0 - pow(alphaav, PBRSTI_i));
fstopgat = 1.0 / (1.0 - pow(alphaav, PBRGAT_i));
// inverse values of breakdown voltages, needed in avalanche/breakdown model
VBRinvbot = 1.0 / VBRBOT_i;
VBRinvsti = 1.0 / VBRSTI_i;
VBRinvgat = 1.0 / VBRGAT_i;
// slopes for linear extrapolation close to and beyond breakdown, needed in avalanche/breakdown model
slopebot = -(fstopbot * fstopbot * pow(alphaav, (PBRBOT_i - 1.0))) * PBRBOT_i * VBRinvbot;
slopesti = -(fstopsti * fstopsti * pow(alphaav, (PBRSTI_i - 1.0))) * PBRSTI_i * VBRinvsti;
slopegat = -(fstopgat * fstopgat * pow(alphaav, (PBRGAT_i - 1.0))) * PBRGAT_i * VBRinvgat;
`ifdef JUNCAP_StandAlone
// do nothing
`else // JUNCAP_StandAlone
phigrbot_d = PHIGBOTD_i + deltaphigr;
phigrsti_d = PHIGSTID_i + deltaphigr;
phigrgat_d = PHIGGATD_i + deltaphigr;
phigdbot_d = PHIGBOTD_i + deltaphigd;
phigdsti_d = PHIGSTID_i + deltaphigd;
phigdgat_d = PHIGGATD_i + deltaphigd;
ftdbot_d = (pow(auxt, 1.5)) * exp(0.5 * ((phigrbot_d * phitrinv) - (phigdbot_d * phitdinv)));
ftdsti_d = (pow(auxt, 1.5)) * exp(0.5 * ((phigrsti_d * phitrinv) - (phigdsti_d * phitdinv)));
ftdgat_d = (pow(auxt, 1.5)) * exp(0.5 * ((phigrgat_d * phitrinv) - (phigdgat_d * phitdinv)));
idsatbot_d = IDSATRBOTD_i * ftdbot_d * ftdbot_d;
idsatsti_d = IDSATRSTID_i * ftdsti_d * ftdsti_d;
idsatgat_d = IDSATRGATD_i * ftdgat_d * ftdgat_d;
ubibot_d = VBIRBOTD_i * auxt - 2.0 * phitd * ln(ftdbot_d);
ubisti_d = VBIRSTID_i * auxt - 2.0 * phitd * ln(ftdsti_d);
ubigat_d = VBIRGATD_i * auxt - 2.0 * phitd * ln(ftdgat_d);
vbibot_d = ubibot_d + phitd * ln(1.0 + exp((`vbilow - ubibot_d) * phitdinv));
vbisti_d = ubisti_d + phitd * ln(1.0 + exp((`vbilow - ubisti_d) * phitdinv));
vbigat_d = ubigat_d + phitd * ln(1.0 + exp((`vbilow - ubigat_d) * phitdinv));
vbiinvbot_d = 1.0 / vbibot_d;
vbiinvsti_d = 1.0 / vbisti_d;
vbiinvgat_d = 1.0 / vbigat_d;
one_minus_PBOT_d = 1.0 - PBOTD_i;
one_minus_PSTI_d = 1.0 - PSTID_i;
one_minus_PGAT_d = 1.0 - PGATD_i;
one_over_one_minus_PBOT_d = 1.0 / one_minus_PBOT_d;
one_over_one_minus_PSTI_d = 1.0 / one_minus_PSTI_d;
one_over_one_minus_PGAT_d = 1.0 / one_minus_PGAT_d;
cjobot_d = CJORBOTD_i * pow((VBIRBOTD_i * vbiinvbot_d), PBOTD_i);
cjosti_d = CJORSTID_i * pow((VBIRSTID_i * vbiinvsti_d), PSTID_i);
cjogat_d = CJORGATD_i * pow((VBIRGATD_i * vbiinvgat_d), PGATD_i);
qprefbot_d = cjobot_d * vbibot_d * one_over_one_minus_PBOT_d;
qprefsti_d = cjosti_d * vbisti_d * one_over_one_minus_PSTI_d;
qprefgat_d = cjogat_d * vbigat_d * one_over_one_minus_PGAT_d;
qpref2bot_d = `a * cjobot_d;
qpref2sti_d = `a * cjosti_d;
qpref2gat_d = `a * cjogat_d;
wdepnulrbot_d = EPSSI / CJORBOTD_i;
wdepnulrsti_d = XJUNSTID_i * EPSSI / CJORSTID_i;
wdepnulrgat_d = XJUNGATD_i * EPSSI / CJORGATD_i;
wdepnulrinvbot_d = 1.0 / wdepnulrbot_d;
wdepnulrinvsti_d = 1.0 / wdepnulrsti_d;
wdepnulrinvgat_d = 1.0 / wdepnulrgat_d;
VBIRBOTinv_d = 1.0 / VBIRBOTD_i;
VBIRSTIinv_d = 1.0 / VBIRSTID_i;
VBIRGATinv_d = 1.0 / VBIRGATD_i;
deltaEbot_d = max(0.5 * phigdbot_d, phitd);
deltaEsti_d = max(0.5 * phigdsti_d, phitd);
deltaEgat_d = max(0.5 * phigdgat_d, phitd);
atatbot_d = deltaEbot_d * phitdinv;
atatsti_d = deltaEsti_d * phitdinv;
atatgat_d = deltaEgat_d * phitdinv;
btatpartbot_d = sqrt(32.0 * MEFFTATBOTD_i * `MELE * `QELE * (deltaEbot_d * deltaEbot_d * deltaEbot_d)) / (3.0 * `HBAR);
btatpartsti_d = sqrt(32.0 * MEFFTATSTID_i * `MELE * `QELE * (deltaEsti_d * deltaEsti_d * deltaEsti_d)) / (3.0 * `HBAR);
btatpartgat_d = sqrt(32.0 * MEFFTATGATD_i * `MELE * `QELE * (deltaEgat_d * deltaEgat_d * deltaEgat_d)) / (3.0 * `HBAR);
fbbtbot_d = FBBTRBOTD_i * (1.0 + STFBBTBOTD_i * (tkd - tkr));
fbbtsti_d = FBBTRSTID_i * (1.0 + STFBBTSTID_i * (tkd - tkr));
fbbtgat_d = FBBTRGATD_i * (1.0 + STFBBTGATD_i * (tkd - tkr));
fbbtbot_d = `CLIP_LOW(fbbtbot_d, 0.0);
fbbtsti_d = `CLIP_LOW(fbbtsti_d, 0.0);
fbbtgat_d = `CLIP_LOW(fbbtgat_d, 0.0);
fstopbot_d = 1.0 / (1.0 - pow(alphaav, PBRBOTD_i));
fstopsti_d = 1.0 / (1.0 - pow(alphaav, PBRSTID_i));
fstopgat_d = 1.0 / (1.0 - pow(alphaav, PBRGATD_i));
VBRinvbot_d = 1.0 / VBRBOTD_i;
VBRinvsti_d = 1.0 / VBRSTID_i;
VBRinvgat_d = 1.0 / VBRGATD_i;
slopebot_d = -(fstopbot_d * fstopbot_d * pow(alphaav, (PBRBOTD_i - 1.0))) * PBRBOTD_i * VBRinvbot_d;
slopesti_d = -(fstopsti_d * fstopsti_d * pow(alphaav, (PBRSTID_i - 1.0))) * PBRSTID_i * VBRinvsti_d;
slopegat_d = -(fstopgat_d * fstopgat_d * pow(alphaav, (PBRGATD_i - 1.0))) * PBRGATD_i * VBRinvgat_d;
`endif // JUNCAP_StandAlone

View File

@ -0,0 +1,471 @@
//======================================================================================
//======================================================================================
// Filename: JUNCAP200_macrodefs.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 200.6.0, April 2019
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
///////////////////////////////////////////
//
// Macros and constants used in JUNCAP2
//
///////////////////////////////////////////
// Other constants
`define MINTEMP -2.5e2
`define vbilow 5.0e-2
`define a 2.0
`define epsch 0.1
`define dvbi 5.0e-2
`define epsav 1.0e-6
`define vbrmax 1.0e3
`define vmaxlarge 1.0e8
`define aerfc 0.29214664
`define twothirds 0.666666666666667
// Clipping values
`define levelnumber 2.0e2
`define AB_cliplow 0.0
`define LS_cliplow 0.0
`define LG_cliplow 0.0
`define MULT_cliplow 0.0
`define TRJ_cliplow `MINTEMP
`define IMAX_cliplow 1.0e-12
`define FREV_cliplow 1.0e1
`define FREV_cliphigh 1.0e10
`define IFACTOR_cliplow 0.0
`define CFACTOR_cliplow 0.0
`define CJORBOT_cliplow 1.0e-12
`define CJORSTI_cliplow 1.0e-18
`define CJORGAT_cliplow 1.0e-18
`define VBIR_cliplow `vbilow
`define P_cliplow 5.0e-2
`define P_cliphigh 0.95
`define IDSATR_cliplow 0.0
`define CSRH_cliplow 0.0
`define XJUN_cliplow 1.0e-9
`define CTAT_cliplow 0.0
`define MEFFTAT_cliplow 1.0e-2
`define CBBT_cliplow 0.0
`define VBR_cliplow 0.1
`define PBR_cliplow 0.1
`define VJUNREF_cliplow 0.5
`define FJUNQ_cliplow 0.0
/////////////////////////////////////////////////////////////////////////////
//
// Macro definitions.
//
// Note that because at present locally scoped variables
// can only be in named blocks, the intermediate variables
// used in the macros below must be explicitly declared
// as variables.
//
/////////////////////////////////////////////////////////////////////////////
// Variable declarations of variables that need to be *local* in juncap-express initialization
//`define LocalGlobalVars \
// /* declaration of variables needed in macro "calcerfcexpmtat" */ \
// real ysq, terfc, erfcpos; \
// \
// /* declaration of variables needed in hypfunction 5 */ \
// real h1, h2, h2d, h3, h4, h5; \
// \
// /* declaration of variables calculated outside macro "juncapfunction", voltage-dependent part */ \
// real idmult, vj, z, zinv, two_psistar, vjlim, vjsrh, vbbt, vav; \
// \
// /* declaration of variables used within macro "juncapfunction" */ \
// real tmp, id; \
// real isrh, vbi_minus_vjsrh, wsrhstep, dwsrh, wsrh, wdep, asrh; \
// real itat, btat, twoatatoverthreebtat, umaxbeforelimiting, umax, sqrtumax, umaxpoweronepointfive; \
// real wgamma, wtat, ktat, ltat, mtat, xerfc, erfctimesexpmtat, gammamax; \
// real ibbt, Fmaxr; \
// real fbreakdown;
// Instance parameter dependent initialization
`define JuncapInitInstance(AB_i, LS_i, LG_i, idsatbot, idsatsti, idsatgat, vbibot, vbisti, vbigat, PBOT_i, PSTI_i, PGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim) \
if (idsatbot * AB_i > 0.0) begin \
vmaxbot = phitd * ln(IMAX_i / (idsatbot * AB_i) + 1.0); \
end else begin \
vmaxbot = `vmaxlarge; \
end \
if (idsatsti * LS_i > 0.0) begin \
vmaxsti = phitd * ln(IMAX_i / (idsatsti * LS_i) + 1.0); \
end else begin \
vmaxsti = `vmaxlarge; \
end \
if (idsatgat * LG_i > 0.0) begin \
vmaxgat = phitd * ln(IMAX_i / (idsatgat * LG_i) + 1.0); \
end else begin \
vmaxgat = `vmaxlarge; \
end \
VMAX = min(min(vmaxbot, vmaxsti), vmaxgat); \
`expl(VMAX * phitdinv, exp_VMAX_over_phitd) \
\
/* determination of minimum value of the relevant built-in voltages */ \
/* and determination of limiting value of conditioned voltage for BBT calculation */ \
vbibot2 = vbibot; \
vbisti2 = vbisti; \
vbigat2 = vbigat; \
pbot2 = PBOT_i; \
psti2 = PSTI_i; \
pgat2 = PGAT_i; \
vbibot2r = VBIRBOT_i; \
vbisti2r = VBIRSTI_i; \
vbigat2r = VBIRGAT_i; \
if (AB_i == 0.0) begin \
vbibot2 = vbisti + vbigat; \
pbot2 = 0.9 * min(PSTI_i, PGAT_i); \
vbibot2r = VBIRSTI_i + VBIRGAT_i; \
end \
if (LS_i == 0.0) begin \
vbisti2 = vbibot + vbigat; \
psti2 = 0.9 * min(PBOT_i, PGAT_i); \
vbisti2r = VBIRBOT_i + VBIRGAT_i; \
end \
if (LG_i == 0.0) begin \
vbigat2 = vbibot + vbisti; \
pgat2 = 0.9 * min(PBOT_i, PSTI_i); \
vbigat2r = VBIRBOT_i + VBIRSTI_i; \
end \
vbimin = min(min(vbibot2, vbisti2), vbigat2); \
vch = vbimin * `epsch; \
pmax = max(max(pbot2, psti2), pgat2); \
vfmin = vbimin * (1.0 - (pow(`a, (-1.0 / (pmax))))); \
vbbtlim = min(min(vbibot2r, vbisti2r), vbigat2r) - `dvbi;
// Special power-functions
`define mypower(x,power,result) \
if (power == 0.5) begin \
result = sqrt(x); \
end else begin \
result = pow(x, power); \
end
`define mypower2(x,power,result) \
if (power == -1.0) begin \
result = 1.0 / (x); \
end else begin \
result = pow(x, power); \
end
`define mypower3(x,power,result) \
if (power == 4.0) begin \
result = (x) * (x) * (x) * (x); \
end else begin \
result = pow(abs(x), power); \
end
// Smoothing functions
`define hypfunction2(x,x0,eps,hyp2) \
hyp2 = 0.5 * ((x) + (x0) - sqrt(((x) - (x0)) * ((x) - (x0)) + 4.0 * (eps) * (eps)));
`define hypfunction5(x,x0,eps,hyp5) \
h1 = 4.0 * (eps) * (eps); \
h2 = (eps) / (x0); \
h2d = (x) + (eps) * h2; \
h3 = (x0) + h2d; \
h4 = (x0) - h2d; \
h5 = sqrt(h4 * h4 + h1); \
hyp5 = 2.0 * ((x) * (x0) / (h3 + h5));
// A special function used to calculate TAT-currents,
// including an approximation of the erfc-function
`define calcerfcexpmtat(y,m,result) \
ysq = y * y; \
if (y > 0.0) begin \
terfc = 1.0 / (1.0 + perfc * y); \
end else begin \
terfc = 1.0 / (1.0 - perfc * y); \
end \
`expl_low(-ysq + m, tmp) \
erfcpos = (`aerfc * terfc + berfc * (terfc * terfc) + cerfc * (terfc * terfc * terfc)) * tmp; \
if (y > 0.0) begin \
result = erfcpos; \
end else begin\
`expl_low(m, tmp) \
result = 2.0 * tmp - erfcpos; \
end
// This is the main function of the JUNCAP2-model. It returns the current and charge
// for a single diode
`define juncapfunction(VAK,qpref,qpref2,vbiinv,one_minus_P,idsat,CSRH,CTAT,vbi,wdepnulr,VBIRinv,P,ftd,btatpart,atat,one_over_one_minus_P,CBBT,VBIR,wdepnulrinv,fbbt,VBR,VBRinv,PBR,fstop,slope,Ijprime,Qjprime) \
`mypower((1.0 - vj * vbiinv), one_minus_P, tmp) \
Qjprime = CFACTOR_i * (qpref * (1.0 - tmp) + qpref2 * (VAK - vj)); \
id = idsat * idmult; \
if ((CSRH == 0.0) && (CTAT == 0.0)) begin \
isrh = 0.0; \
end else begin \
vbi_minus_vjsrh = vbi-vjsrh; \
wsrhstep = 1.0 - sqrt(1.0 - two_psistar / vbi_minus_vjsrh); \
if (P == 0.5) begin \
dwsrh = 0.0; \
end else begin \
dwsrh = ((wsrhstep * wsrhstep * ln(wsrhstep) / (1.0 - wsrhstep)) + wsrhstep) * (1.0 - 2.0 * P); \
end \
wsrh = wsrhstep + dwsrh; \
`mypower(vbi_minus_vjsrh * VBIRinv, P, tmp) \
wdep = wdepnulr * tmp; \
asrh = ftd * ((zinv - 1.0) * wdep); \
isrh = CSRH * (asrh * wsrh); \
end \
if (CTAT == 0.0) begin \
itat = 0.0; \
end else begin \
btat = btatpart * ((wdep * one_minus_P) / vbi_minus_vjsrh); \
twoatatoverthreebtat = (`twothirds * atat) / btat; \
umaxbeforelimiting = twoatatoverthreebtat * twoatatoverthreebtat; \
umax = sqrt(umaxbeforelimiting * umaxbeforelimiting / (umaxbeforelimiting * umaxbeforelimiting + 1.0)); \
sqrtumax = sqrt(abs(umax)); \
umaxpoweronepointfive = umax * sqrtumax; \
`mypower2((1.0 + btat * umaxpoweronepointfive), (-P * one_over_one_minus_P), wgamma) \
wtat = wsrh * wgamma / (wsrh + wgamma); \
ktat = sqrt(0.375 * (btat / sqrtumax)); \
ltat = 2.0 * (twoatatoverthreebtat * sqrtumax) - umax; \
mtat = atat * twoatatoverthreebtat * sqrtumax - atat * umax + 0.5 * (btat * umaxpoweronepointfive); \
xerfc = (ltat - 1.0) * ktat; \
`calcerfcexpmtat(xerfc, mtat, erfctimesexpmtat) \
gammamax = `SQRTPI * 0.5 * (atat * erfctimesexpmtat / ktat); \
itat = CTAT * (asrh * gammamax * wtat); \
end \
if (CBBT == 0.0) begin \
ibbt = 0.0; \
end else begin \
`mypower(((VBIR - vbbt) * VBIRinv), P, tmp) \
Fmaxr = one_over_one_minus_P * ((VBIR - vbbt) * wdepnulrinv / tmp); \
`expl(-fbbt / Fmaxr, tmp) \
ibbt = CBBT * (VAK * Fmaxr * Fmaxr * tmp); \
end \
if (VBR > `vbrmax) begin \
fbreakdown = 1.0; \
end else begin \
if (vav > -alphaav * VBR) begin \
`mypower3(vav * VBRinv, PBR, tmp) \
fbreakdown = 1.0 / (1.0 - tmp); \
end else begin \
fbreakdown = fstop + (vav + alphaav * VBR) * slope; \
end \
end \
Ijprime = IFACTOR_i * (id + isrh + itat + ibbt) * fbreakdown;
// The following code is written as a macro because the naming of the instance parameters is
// different for JUNCAP2 stand-alone and JUNCAP2-in-PSP: AB, LS, LG for JUNCAP2 stand-alone,
// ABSOURCE, LSSOURCE, LGSOURCE for source junction in PSP and ABDRAIN, LSDRAIN, LGDRAIN for
// drain junction in PSP
`define juncapcommon(V, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \
vbbt = 0.0; \
two_psistar = 0.0; \
if ( !( ((AB_i) == 0.0) && ((LS_i) == 0.0) && ((LG_i) == 0.0) ) ) begin \
`hypfunction5(V, vfmin, vch, vj) \
if (V < VMAX) begin \
`expl(0.5 * (V * phitdinv), zinv) \
idmult = zinv * zinv; \
end else begin \
idmult = (1.0 + (V - VMAX) * phitdinv) * exp_VMAX_over_phitd; \
zinv = sqrt(idmult); \
end \
idmult = idmult - 1.0; \
z = 1.0 / zinv; \
if (V > 0.0) begin \
two_psistar = 2.0 * (phitd * ln(2.0 + z + sqrt((z + 1.0) * (z + 3.0)))); \
end else begin \
two_psistar = -V + 2.0 * (phitd * ln(2.0 * zinv + 1.0 + sqrt((1.0 + zinv) * (1.0 + 3.0 * zinv)))); \
end \
vjlim = vbimin - two_psistar; \
`hypfunction2(V, vjlim, phitd, vjsrh) \
`hypfunction2(V, vbbtlim, phitr, vbbt) \
`hypfunction2(V, 0.0, `epsav, vav) \
end \
if ((AB_i) == 0.0) begin \
ijunbot = 0.0; \
qjunbot = 0.0; \
end else begin \
`juncapfunction(V, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, ijunbot, qjunbot) \
end \
if ((LS_i) == 0.0) begin \
ijunsti = 0.0; \
qjunsti = 0.0; \
end else begin \
`juncapfunction(V, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, ijunsti, qjunsti) \
end \
if ((LG_i) == 0.0) begin \
ijungat = 0.0; \
qjungat = 0.0; \
end else begin \
`juncapfunction(V, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, ijungat, qjungat) \
end
//============================================================================================================
// JUNCAP-express
//
// The macros below are used in the express-version of JUNCAP2
//============================================================================================================
`define relerr 1.0e-3
`define P1(x) ((x) + 1.0)
`define expll(x, xlow, expxlow, xhigh, expxhigh) \
((x) < (xlow)) ? (expxlow) / `P1((xlow) - (x)) : (((x) > (xhigh)) ? (expxhigh) * `P1((x) - (xhigh)) : exp(x))
// The "JuncapExpressInit"-macro below is split into three parts, as some verilog-A compilers cannot handle
// macros beyond a certain size. Moreover, it is useful to limit the list of input and output variables.
// Part 1
`define JuncapExpressInit1(AB_i, LS_i, LG_i, VJUNREF_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim) \
FRACNA = 0.4; \
FRACNB = 0.65; \
FRACI = 0.8; \
/* Sample voltages */ \
V1 = -FRACNA * VJUNREF_i; \
V2 = -FRACNB * VJUNREF_i; \
V3 = -FRACI * VJUNREF_i; \
V4 = 0.1; \
V5 = 0.2; \
/* evaluate full JUNCAP-model at five voltages */ \
`juncapcommon(V1, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \
I1 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; \
`juncapcommon(V2, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \
I2 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; \
`juncapcommon(V3, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \
I3 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat;
// Part 2
`define JuncapExpressInit2(AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim) \
/* forward currents */ \
`juncapcommon(V4, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \
I4 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; \
`juncapcommon(V5, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \
I5 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat;
// Part 3
`define JuncapExpressInit3(AB_i, LS_i, LG_i, idsatbot, idsatsti, idsatgat, ISATFOR1, MFOR1, ISATFOR2, MFOR2, ISATREV, MREV, m0flag) \
/* compute internal parameters from these five (I,V)-values */ \
ISATFOR1 = AB_i * idsatbot + LS_i * idsatsti + LG_i * idsatgat; \
I4_cor = I4 - ISATFOR1 * (exp(V4 * phitdinv * MFOR1) - 1.0); \
I5_cor = I5 - ISATFOR1 * (exp(V5 * phitdinv * MFOR1) - 1.0); \
if ( !( ((AB_i) == 0.0) && ((LS_i) == 0.0) && ((LG_i) == 0.0) ) ) begin \
if ((I4 > 0.0) && (I5 > 0.0)) begin \
if ((((I4_cor / I4) > `relerr) || ((I5_cor / I5) > `relerr)) && (I4_cor > 0.0) && (I5_cor > 0.0) && (I5_cor > I4_cor)) begin \
alphaje = I4_cor / I5_cor; \
MFOR2 = phitd * ln(alphaje) / (V4 - V5); \
ISATFOR2 = I4_cor / (exp(V4 * phitdinv * MFOR2) - 1.0); \
end \
end \
I1_cor = I1 - ISATFOR1 * (exp(V1 * phitdinv * MFOR1) - 1.0) - ISATFOR2 * (exp(V1 * phitdinv * MFOR2) - 1.0); \
I2_cor = I2 - ISATFOR1 * (exp(V2 * phitdinv * MFOR1) - 1.0) - ISATFOR2 * (exp(V2 * phitdinv * MFOR2) - 1.0); \
I3_cor = I3 - ISATFOR1 * (exp(V3 * phitdinv * MFOR1) - 1.0) - ISATFOR2 * (exp(V3 * phitdinv * MFOR2) - 1.0); \
if ((I1 < 0.0) && (I2 < 0.0) && (I3 < 0.0)) begin \
if ((((I1_cor / I1) > `relerr) || ((I2_cor / I2) > `relerr) || ((I3_cor / I3) > `relerr)) \
&& (I1_cor < 0.0) && (I2_cor < 0.0) && (I3_cor < 0.0)) begin \
alphaje = I1_cor / I2_cor; \
m0_rev = -phitd * ln(alphaje) / (V1 - V2); /* zeroth order approximation */ \
tt0 = V2 / (V2 - V1); \
tt1 = phitd * (alphaje - 1.0) * (pow(alphaje, tt0) - 1.0); \
tt0 = V1 / (V1 - V2); \
tt2 = pow(alphaje, tt0) * (V2 - V1) + alphaje * V1 - V2; \
mcor_rev = tt1 / tt2; /* first order Newton correction */ \
MREV = m0_rev + mcor_rev; \
if (abs(V3 * phitdinv * MREV) < 1.0e-6) begin \
/* Taylor approximation needed */ \
/* Note: ISATREV and MREV have different meaning in this situation!! */ \
m0flag = 1.0; \
ISATREV = I3_cor * (1.0 / V3 + 0.5 * phitdinv * MREV); \
MREV = -0.5 * I3_cor * MREV * phitdinv / V3; \
end else begin \
m0flag = 0.0; \
ISATREV = -I3_cor / (exp(-V3 * phitdinv * MREV) - 1.0); \
end \
end \
end \
end
// Part 4
`define JuncapExpressInit4(AB_i, LS_i, LG_i, FJUNQ_i, cjobot, cjosti, cjogat, zflagbot, zflagsti, zflaggat) \
/* charge model initialization */ \
zfrac = FJUNQ_i * (AB_i * cjobot + LS_i * cjosti + LG_i * cjogat); \
if ((AB_i * cjobot) <= zfrac) begin \
zflagbot = 0.0; \
end \
if ((LS_i * cjosti) <= zfrac) begin \
zflagsti = 0.0; \
end \
if ((LG_i * cjogat) <= zfrac) begin \
zflaggat = 0.0; \
end
// Part 5
`define JuncapExpressInit5(AB_i, LS_i, LG_i, ISATFOR1, ISATFOR2, ISATREV, xhighf1, expxhf1, xhighf2, expxhf2, xhighr, expxhr) \
/* calculate limits beyond which exponentials are linearly extrapolated */ \
if ( !( ((AB_i) == 0.0) && ((LS_i) == 0.0) && ((LG_i) == 0.0) ) ) begin \
xhighf1 = ln(0.5 * IMAX_i / (ISATFOR1 + 1.0e-21)); \
xhighf2 = ln(0.5 * IMAX_i / (ISATFOR2 + 1.0e-21)); \
xhighr = ln(0.5 * IMAX_i / (abs(ISATREV) + 1.0e-21)); \
end \
xhighf1 = min(xhighf1, `se05); \
expxhf1 = exp(xhighf1); \
xhighf2 = min(xhighf2, `se05); \
expxhf2 = exp(xhighf2); \
xhighr = min(xhighr, `se05); \
expxhr = exp(xhighr);
`define JuncapExpressCurrent(V, MFOR1, ISATFOR1, MFOR2, ISATFOR2, MREV, ISATREV, m0flag, xhighf1, expxhf1, xhighf2, expxhf2, xhighr, expxhr, ijun) \
tm0 = V * phitdinv * MFOR1; \
tm1 = `expll(tm0, -`se05, `ke05, xhighf1, expxhf1); \
ijunfor1 = ISATFOR1 * (tm1 - 1.0); \
tm0 = V * phitdinv * MFOR2; \
tm1 = `expll(tm0, -`se05, `ke05, xhighf2, expxhf2); \
ijunfor2 = ISATFOR2 * (tm1 - 1.0); \
ijunrev = 0.0; \
if (m0flag > 0.0) begin \
ijunrev = V * (ISATREV + V * MREV); \
end else begin \
tm0 = -V * phitdinv * MREV; \
tm1 = `expll(tm0, -`se05, `ke05, xhighr, expxhr); \
ijunrev = -ISATREV * (tm1 - 1.0); \
end \
ijun = ijunfor1 + ijunfor2 + ijunrev;
`define JuncapExpressCharge(V, AB_i, LS_i, LG_i, qprefbot, qprefsti, qprefgat, qpref2bot, qpref2sti, qpref2gat, vbiinvbot, vbiinvsti, vbiinvgat, one_minus_PBOT, one_minus_PSTI, one_minus_PGAT, vfmin, vch, zflagbot, zflagsti, zflaggat, qjunbot, qjunsti, qjungat) \
tmpv = 0.0; \
vjv = 0.0; \
`hypfunction5(V, vfmin, vch, vjv) \
if (zflagbot > 0.5) begin \
`mypower((1.0 - vjv * vbiinvbot), one_minus_PBOT, tmpv) \
qjunbot = qprefbot * (1.0 - tmpv) + qpref2bot * (V - vjv); \
end \
if (zflagsti > 0.5) begin \
`mypower((1.0 - vjv * vbiinvsti), one_minus_PSTI, tmpv) \
qjunsti = qprefsti * (1.0 - tmpv) + qpref2sti * (V - vjv); \
end \
if (zflaggat > 0.5) begin \
`mypower((1.0 - vjv * vbiinvgat), one_minus_PGAT, tmpv) \
qjungat = qprefgat * (1.0 - tmpv) + qpref2gat * (V - vjv); \
end

View File

@ -0,0 +1,181 @@
//======================================================================================
//======================================================================================
// Filename: JUNCAP200_parlist.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 200.6.0, April 2019
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
// --------------------------------------------------------------------------------------------------------------
// JUNCAP2 - Reduced parameter list
// --------------------------------------------------------------------------------------------------------------
`MPRco(IMAX ,1000.0 ,"A" ,`IMAX_cliplow ,inf ,"Maximum current up to which forward current behaves exponentially")
`MPRco(TRJ ,21.0 ,"degC" ,`TRJ_cliplow ,inf ,"Reference temperature")
`MPRcc(FREV ,1.0e3 ,"" ,`FREV_cliplow ,`FREV_cliphigh ,"Coefficient for reverse breakdown current limitation")
`IPRcz(IFACTOR ,1.0 ,"" ,"Multiplier for current")
`IPRcz(CFACTOR ,1.0 ,"" ,"Multiplier for depletion capacitance")
// Parameters for source-bulk junction
`ifdef JUNCAP_StandAlone
`MPRco(CJORBOT ,1.0e-3 ,"Fm^-2" ,`CJORBOT_cliplow ,inf ,"Zero-bias capacitance per unit-of-area of bottom component")
`MPRco(CJORSTI ,1.0e-9 ,"Fm^-1" ,`CJORSTI_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of STI-edge component")
`MPRco(CJORGAT ,1.0e-9 ,"Fm^-1" ,`CJORGAT_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of gate-edge component")
`MPRco(VBIRBOT ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of bottom component")
`MPRco(VBIRSTI ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of STI-edge component")
`MPRco(VBIRGAT ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of gate-edge component")
`MPRcc(PBOT ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of bottom component")
`MPRcc(PSTI ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of STI-edge component")
`MPRcc(PGAT ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of gate-edge component")
`MPRnb(PHIGBOT ,1.16 ,"V" ,"Zero-temperature bandgap voltage of bottom component")
`MPRnb(PHIGSTI ,1.16 ,"V" ,"Zero-temperature bandgap voltage of STI-edge component")
`MPRnb(PHIGGAT ,1.16 ,"V" ,"Zero-temperature bandgap voltage of gate-edge component")
`MPRco(IDSATRBOT ,1.0e-12 ,"Am^-2" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of bottom component")
`MPRco(IDSATRSTI ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of STI-edge component")
`MPRco(IDSATRGAT ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of gate-edge component")
`MPRco(CSRHBOT ,1.0e2 ,"Am^-3" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of bottom component")
`MPRco(CSRHSTI ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of STI-edge component")
`MPRco(CSRHGAT ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of gate-edge component")
`MPRco(XJUNSTI ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of STI-edge component")
`MPRco(XJUNGAT ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of gate-edge component")
`MPRco(CTATBOT ,1.0e2 ,"Am^-3" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of bottom component")
`MPRco(CTATSTI ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of STI-edge component")
`MPRco(CTATGAT ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of gate-edge component")
`MPRco(MEFFTATBOT ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of bottom component")
`MPRco(MEFFTATSTI ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component")
`MPRco(MEFFTATGAT ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component")
`MPRco(CBBTBOT ,1.0e-12 ,"AV^-3" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of bottom component")
`MPRco(CBBTSTI ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of STI-edge component")
`MPRco(CBBTGAT ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of gate-edge component")
`MPRnb(FBBTRBOT ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of bottom component")
`MPRnb(FBBTRSTI ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of STI-edge component")
`MPRnb(FBBTRGAT ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of gate-edge component")
`MPRnb(STFBBTBOT ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of bottom component")
`MPRnb(STFBBTSTI ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of STI-edge component")
`MPRnb(STFBBTGAT ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of gate-edge component")
`MPRco(VBRBOT ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of bottom component")
`MPRco(VBRSTI ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of STI-edge component")
`MPRco(VBRGAT ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of gate-edge component")
`MPRco(PBRBOT ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of bottom component")
`MPRco(PBRSTI ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of STI-edge component")
`MPRco(PBRGAT ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of gate-edge component")
`else // JUNCAP_StandAlone
`MPRco(CJORBOT ,1.0e-3 ,"Fm^-2" ,`CJORBOT_cliplow ,inf ,"Zero-bias capacitance per unit-of-area of bottom component for source-bulk junction")
`MPRco(CJORSTI ,1.0e-9 ,"Fm^-1" ,`CJORSTI_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of STI-edge component for source-bulk junction")
`MPRco(CJORGAT ,1.0e-9 ,"Fm^-1" ,`CJORGAT_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of gate-edge component for source-bulk junction")
`MPRco(VBIRBOT ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of bottom component for source-bulk junction")
`MPRco(VBIRSTI ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of STI-edge component for source-bulk junction")
`MPRco(VBIRGAT ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of gate-edge component for source-bulk junction")
`MPRcc(PBOT ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of bottom component for source-bulk junction")
`MPRcc(PSTI ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of STI-edge component for source-bulk junction")
`MPRcc(PGAT ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of gate-edge component for source-bulk junction")
`MPRnb(PHIGBOT ,1.16 ,"V" ,"Zero-temperature bandgap voltage of bottom component for source-bulk junction")
`MPRnb(PHIGSTI ,1.16 ,"V" ,"Zero-temperature bandgap voltage of STI-edge component for source-bulk junction")
`MPRnb(PHIGGAT ,1.16 ,"V" ,"Zero-temperature bandgap voltage of gate-edge component for source-bulk junction")
`MPRco(IDSATRBOT ,1.0e-12 ,"Am^-2" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of bottom component for source-bulk junction")
`MPRco(IDSATRSTI ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of STI-edge component for source-bulk junction")
`MPRco(IDSATRGAT ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of gate-edge component for source-bulk junction")
`MPRco(CSRHBOT ,1.0e2 ,"Am^-3" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of bottom component for source-bulk junction")
`MPRco(CSRHSTI ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of STI-edge component for source-bulk junction")
`MPRco(CSRHGAT ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of gate-edge component for source-bulk junction")
`MPRco(XJUNSTI ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of STI-edge component for source-bulk junction")
`MPRco(XJUNGAT ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of gate-edge component for source-bulk junction")
`MPRco(CTATBOT ,1.0e2 ,"Am^-3" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of bottom component for source-bulk junction")
`MPRco(CTATSTI ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of STI-edge component for source-bulk junction")
`MPRco(CTATGAT ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of gate-edge component for source-bulk junction")
`MPRco(MEFFTATBOT ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of bottom component for source-bulk junction")
`MPRco(MEFFTATSTI ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component for source-bulk junction")
`MPRco(MEFFTATGAT ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component for source-bulk junction")
`MPRco(CBBTBOT ,1.0e-12 ,"AV^-3" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of bottom component for source-bulk junction")
`MPRco(CBBTSTI ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of STI-edge component for source-bulk junction")
`MPRco(CBBTGAT ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of gate-edge component for source-bulk junction")
`MPRnb(FBBTRBOT ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of bottom component for source-bulk junction")
`MPRnb(FBBTRSTI ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of STI-edge component for source-bulk junction")
`MPRnb(FBBTRGAT ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of gate-edge component for source-bulk junction")
`MPRnb(STFBBTBOT ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of bottom component for source-bulk junction")
`MPRnb(STFBBTSTI ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of STI-edge component for source-bulk junction")
`MPRnb(STFBBTGAT ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of gate-edge component for source-bulk junction")
`MPRco(VBRBOT ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of bottom component for source-bulk junction")
`MPRco(VBRSTI ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of STI-edge component for source-bulk junction")
`MPRco(VBRGAT ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of gate-edge component for source-bulk junction")
`MPRco(PBRBOT ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of bottom component for source-bulk junction")
`MPRco(PBRSTI ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of STI-edge component for source-bulk junction")
`MPRco(PBRGAT ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of gate-edge component for source-bulk junction")
`endif // JUNCAP_StandAlone
// Parameters for drain-bulk junction
`ifdef JUNCAP_StandAlone
// do nothing
`else // JUNCAP_StandAlone
`MPRco(CJORBOTD ,1.0e-3 ,"Fm^-2" ,`CJORBOT_cliplow ,inf ,"Zero-bias capacitance per unit-of-area of bottom component for drain-bulk junction")
`MPRco(CJORSTID ,1.0e-9 ,"Fm^-1" ,`CJORSTI_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of STI-edge component for drain-bulk junction")
`MPRco(CJORGATD ,1.0e-9 ,"Fm^-1" ,`CJORGAT_cliplow ,inf ,"Zero-bias capacitance per unit-of-length of gate-edge component for drain-bulk junction")
`MPRco(VBIRBOTD ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of bottom component for drain-bulk junction")
`MPRco(VBIRSTID ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of STI-edge component for drain-bulk junction")
`MPRco(VBIRGATD ,1.0 ,"V" ,`VBIR_cliplow ,inf ,"Built-in voltage at the reference temperature of gate-edge component for drain-bulk junction")
`MPRcc(PBOTD ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of bottom component for drain-bulk junction")
`MPRcc(PSTID ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of STI-edge component for drain-bulk junction")
`MPRcc(PGATD ,0.5 ,"" ,`P_cliplow ,`P_cliphigh ,"Grading coefficient of gate-edge component for drain-bulk junction")
`MPRnb(PHIGBOTD ,1.16 ,"V" ,"Zero-temperature bandgap voltage of bottom component for drain-bulk junction")
`MPRnb(PHIGSTID ,1.16 ,"V" ,"Zero-temperature bandgap voltage of STI-edge component for drain-bulk junction")
`MPRnb(PHIGGATD ,1.16 ,"V" ,"Zero-temperature bandgap voltage of gate-edge component for drain-bulk junction")
`MPRco(IDSATRBOTD ,1.0e-12 ,"Am^-2" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of bottom component for drain-bulk junction")
`MPRco(IDSATRSTID ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of STI-edge component for drain-bulk junction")
`MPRco(IDSATRGATD ,1.0e-18 ,"Am^-1" ,`IDSATR_cliplow ,inf ,"Saturation current density at the reference temperature of gate-edge component for drain-bulk junction")
`MPRco(CSRHBOTD ,1.0e2 ,"Am^-3" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of bottom component for drain-bulk junction")
`MPRco(CSRHSTID ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of STI-edge component for drain-bulk junction")
`MPRco(CSRHGATD ,1.0e-4 ,"Am^-2" ,`CSRH_cliplow ,inf ,"Shockley-Read-Hall prefactor of gate-edge component for drain-bulk junction")
`MPRco(XJUNSTID ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of STI-edge component for drain-bulk junction")
`MPRco(XJUNGATD ,1.0e-7 ,"m" ,`XJUN_cliplow ,inf ,"Junction depth of gate-edge component for drain-bulk junction")
`MPRco(CTATBOTD ,1.0e2 ,"Am^-3" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of bottom component for drain-bulk junction")
`MPRco(CTATSTID ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of STI-edge component for drain-bulk junction")
`MPRco(CTATGATD ,1.0e-4 ,"Am^-2" ,`CTAT_cliplow ,inf ,"Trap-assisted tunneling prefactor of gate-edge component for drain-bulk junction")
`MPRco(MEFFTATBOTD ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of bottom component for drain-bulk junction")
`MPRco(MEFFTATSTID ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component for drain-bulk junction")
`MPRco(MEFFTATGATD ,0.25 ,"" ,`MEFFTAT_cliplow ,inf ,"Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component for drain-bulk junction")
`MPRco(CBBTBOTD ,1.0e-12 ,"AV^-3" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of bottom component for drain-bulk junction")
`MPRco(CBBTSTID ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of STI-edge component for drain-bulk junction")
`MPRco(CBBTGATD ,1.0e-18 ,"AV^-3m" ,`CBBT_cliplow ,inf ,"Band-to-band tunneling prefactor of gate-edge component for drain-bulk junction")
`MPRnb(FBBTRBOTD ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of bottom component for drain-bulk junction")
`MPRnb(FBBTRSTID ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of STI-edge component for drain-bulk junction")
`MPRnb(FBBTRGATD ,1.0e9 ,"Vm^-1" ,"Normalization field at the reference temperature for band-to-band tunneling of gate-edge component for drain-bulk junction")
`MPRnb(STFBBTBOTD ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of bottom component for drain-bulk junction")
`MPRnb(STFBBTSTID ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of STI-edge component for drain-bulk junction")
`MPRnb(STFBBTGATD ,-1.0e-3 ,"K^-1" ,"Temperature scaling parameter for band-to-band tunneling of gate-edge component for drain-bulk junction")
`MPRco(VBRBOTD ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of bottom component for drain-bulk junction")
`MPRco(VBRSTID ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of STI-edge component for drain-bulk junction")
`MPRco(VBRGATD ,10.0 ,"V" ,`VBR_cliplow ,inf ,"Breakdown voltage of gate-edge component for drain-bulk junction")
`MPRco(PBRBOTD ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of bottom component for drain-bulk junction")
`MPRco(PBRSTID ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of STI-edge component for drain-bulk junction")
`MPRco(PBRGATD ,4.0 ,"V" ,`PBR_cliplow ,inf ,"Breakdown onset tuning parameter of gate-edge component for drain-bulk junction")
`endif // JUNCAP_StandAlone
// JUNCAP2-express parameters
`MPRcc(SWJUNEXP ,0.0 ,"" ,0.0 ,1.0 ,"Flag for JUNCAP-express; 0=full model, 1=express model")
`ifdef JUNCAP_StandAlone
`MPRco(VJUNREF ,2.5 ,"V" ,`VJUNREF_cliplow ,inf ,"Typical maximum junction voltage; usually about 2*VSUP")
`MPRco(FJUNQ ,0.03 ,"" ,`FJUNQ_cliplow ,inf ,"Fraction below which junction capacitance components are considered negligible")
`else // JUNCAP_StandAlone
`MPRco(VJUNREF ,2.5 ,"V" ,`VJUNREF_cliplow ,inf ,"Typical maximum source-bulk junction voltage; usually about 2*VSUP")
`MPRco(FJUNQ ,0.03 ,"" ,`FJUNQ_cliplow ,inf ,"Fraction below which source-bulk junction capacitance components are considered negligible")
`MPRco(VJUNREFD ,2.5 ,"V" ,`VJUNREF_cliplow ,inf ,"Typical maximum drain-bulk junction voltage; usually about 2*VSUP")
`MPRco(FJUNQD ,0.03 ,"" ,`FJUNQ_cliplow ,inf ,"Fraction below which drain-bulk junction capacitance components are considered negligible")
`endif // JUNCAP_StandAlone

View File

@ -0,0 +1,141 @@
//======================================================================================
//======================================================================================
// Filename: JUNCAP200_varlist.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 200.6.0, April 2019
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
// declaration of clipped parameters
real TRJ_i, IMAX_i, FREV_i, IFACTOR_i, CFACTOR_i;
real CJORBOT_i, CJORSTI_i, CJORGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i;
real PBOT_i, PSTI_i, PGAT_i, PHIGBOT_i, PHIGSTI_i, PHIGGAT_i;
real IDSATRBOT_i, IDSATRSTI_i, IDSATRGAT_i, XJUNSTI_i, XJUNGAT_i;
real CSRHBOT_i, CSRHSTI_i, CSRHGAT_i, CTATBOT_i, CTATSTI_i, CTATGAT_i;
real MEFFTATBOT_i, MEFFTATSTI_i, MEFFTATGAT_i;
real CBBTBOT_i, CBBTSTI_i, CBBTGAT_i, FBBTRBOT_i, FBBTRSTI_i, FBBTRGAT_i;
real STFBBTBOT_i, STFBBTSTI_i, STFBBTGAT_i;
real VBRBOT_i, VBRSTI_i, VBRGAT_i, PBRBOT_i, PBRSTI_i, PBRGAT_i;
real SWJUNEXP_i, VJUNREF_i, FJUNQ_i;
// declaration of variables calculated outside macro "juncapfunction", voltage-independent part
real tkr, tkd, auxt, KBOL_over_QELE, phitr, phitrinv, phitd, phitdinv;
real perfc, berfc, cerfc;
real deltaphigr, deltaphigd, pmax;
real phigrbot, phigrsti, phigrgat, phigdbot, phigdsti, phigdgat;
real ftdbot, ftdsti, ftdgat, idsatbot, idsatsti, idsatgat;
real ubibot, ubisti, ubigat, vbibot, vbisti, vbigat;
real vbibot2, vbisti2, vbigat2, pbot2, psti2, pgat2, vbibot2r, vbisti2r, vbigat2r;
real vbiinvbot, vbiinvsti, vbiinvgat;
real one_minus_PBOT, one_minus_PSTI, one_minus_PGAT;
real one_over_one_minus_PBOT, one_over_one_minus_PSTI, one_over_one_minus_PGAT;
real cjobot, cjosti, cjogat;
real qprefbot, qprefsti, qprefgat, qpref2bot, qpref2sti, qpref2gat;
real wdepnulrbot, wdepnulrsti, wdepnulrgat, wdepnulrinvbot, wdepnulrinvsti, wdepnulrinvgat;
real VBIRBOTinv, VBIRSTIinv, VBIRGATinv;
real deltaEbot, deltaEsti, deltaEgat, atatbot, atatsti, atatgat;
real btatpartbot, btatpartsti, btatpartgat;
real fbbtbot, fbbtsti, fbbtgat;
real alphaav, fstopbot, fstopsti, fstopgat, VBRinvbot, VBRinvsti, VBRinvgat;
real slopebot, slopesti, slopegat;
real vmaxbot, vmaxsti, vmaxgat;
// JUNCAP-Express variables
real I1, I2, I3, I4, I5;
real I1_cor, I2_cor, I3_cor, I4_cor, I5_cor;
real V1, V2, V3, V4, V5;
real alphaje, m0_rev, mcor_rev;
real tt0, tt1, tt2, tm0, tm1;
real FRACNA, FRACNB, FRACI;
real zfrac;
real ijunfor1, ijunfor2, ijunrev;
`ifdef JUNCAP_StandAlone
// do nothing
`else // JUNCAP_StandAlone
real CJORBOTD_i, CJORSTID_i, CJORGATD_i, VBIRBOTD_i, VBIRSTID_i, VBIRGATD_i;
real PBOTD_i, PSTID_i, PGATD_i, PHIGBOTD_i, PHIGSTID_i, PHIGGATD_i;
real IDSATRBOTD_i, IDSATRSTID_i, IDSATRGATD_i, XJUNSTID_i, XJUNGATD_i;
real CSRHBOTD_i, CSRHSTID_i, CSRHGATD_i, CTATBOTD_i, CTATSTID_i, CTATGATD_i;
real MEFFTATBOTD_i, MEFFTATSTID_i, MEFFTATGATD_i;
real CBBTBOTD_i, CBBTSTID_i, CBBTGATD_i, FBBTRBOTD_i, FBBTRSTID_i, FBBTRGATD_i;
real STFBBTBOTD_i, STFBBTSTID_i, STFBBTGATD_i;
real VBRBOTD_i, VBRSTID_i, VBRGATD_i, PBRBOTD_i, PBRSTID_i, PBRGATD_i;
real VJUNREFD_i, FJUNQD_i;
real phigrbot_d, phigrsti_d, phigrgat_d, phigdbot_d, phigdsti_d, phigdgat_d;
real ftdbot_d, ftdsti_d, ftdgat_d, idsatbot_d, idsatsti_d, idsatgat_d;
real ubibot_d, ubisti_d, ubigat_d, vbibot_d, vbisti_d, vbigat_d;
real vbiinvbot_d, vbiinvsti_d, vbiinvgat_d;
real one_minus_PBOT_d, one_minus_PSTI_d, one_minus_PGAT_d;
real one_over_one_minus_PBOT_d, one_over_one_minus_PSTI_d, one_over_one_minus_PGAT_d;
real cjobot_d, cjosti_d, cjogat_d;
real qprefbot_d, qprefsti_d, qprefgat_d, qpref2bot_d, qpref2sti_d, qpref2gat_d;
real wdepnulrbot_d, wdepnulrsti_d, wdepnulrgat_d, wdepnulrinvbot_d, wdepnulrinvsti_d, wdepnulrinvgat_d;
real VBIRBOTinv_d, VBIRSTIinv_d, VBIRGATinv_d;
real deltaEbot_d, deltaEsti_d, deltaEgat_d, atatbot_d, atatsti_d, atatgat_d;
real btatpartbot_d, btatpartsti_d, btatpartgat_d;
real fbbtbot_d, fbbtsti_d, fbbtgat_d;
real fstopbot_d, fstopsti_d, fstopgat_d, VBRinvbot_d, VBRinvsti_d, VBRinvgat_d;
real slopebot_d, slopesti_d, slopegat_d;
`endif // JUNCAP_StandAlone
//`LocalGlobalVars
//================================================================
// Variables that are different for source and drain side junction
// and have a scope larger than a single macro-call
//================================================================
`ifdef JUNCAP_StandAlone
real AB_i, LS_i, LG_i;
real zflagbot, zflagsti, zflaggat;
real VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim;
// JUNCAP-express variables
real xhighf1, expxhf1, xhighf2, expxhf2, xhighr, expxhr;
// JUNCAP2-express intermediate parameters
real ISATFOR1, MFOR1, ISATFOR2, MFOR2, ISATREV, MREV, m0flag;
`else // JUNCAP_StandAlone
real ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, AS_i, PS_i;
real zflagbot_s, zflagsti_s, zflaggat_s;
real VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s;
// JUNCAP-express variables
real xhighf1_s, expxhf1_s, xhighf2_s, expxhf2_s, xhighr_s, expxhr_s, m0flag_s;
// JUNCAP2-express intermediate parameters
real ISATFOR1_s, MFOR1_s, ISATFOR2_s, MFOR2_s, ISATREV_s, MREV_s;
real ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, AD_i, PD_i;
real zflagbot_d, zflagsti_d, zflaggat_d;
real VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d;
// JUNCAP-express variables
real xhighf1_d, expxhf1_d, xhighf2_d, expxhf2_d, xhighr_d, expxhr_d, m0flag_d;
// JUNCAP2-express intermediate parameters
real ISATFOR1_d, MFOR1_d, ISATFOR2_d, MFOR2_d, ISATREV_d, MREV_d;
`endif // JUNCAP_StandAlone

View File

@ -0,0 +1,314 @@
//======================================================================================
//======================================================================================
// Filename: PSP103_ChargesNQS.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 103.7.0 (PSP), 200.6.0 (JUNCAP), April 2019
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
// --------------------------------------------------------------------------------------------------------------
// Calculate NQS-charge contributions
// --------------------------------------------------------------------------------------------------------------
Qp1 = vnorm * V(SPLINE1);
Qp2 = vnorm * V(SPLINE2);
Qp3 = vnorm * V(SPLINE3);
Qp4 = vnorm * V(SPLINE4);
Qp5 = vnorm * V(SPLINE5);
Qp6 = vnorm * V(SPLINE6);
Qp7 = vnorm * V(SPLINE7);
Qp8 = vnorm * V(SPLINE8);
Qp9 = vnorm * V(SPLINE9);
Tnorm = 0.0;
if (SWNQS_i != 0) begin
// Dimension and mobility information is included in Tnorm
Tnorm = MUNQS_i * phit1 * BET_i / (COX_qm * Gmob_dL_ac);
thesat2 = thesat1_ac * thesat1_ac * phit1 * phit1;
if (SWNQS_i == 1) begin
dQy = QpN - Qp0;
d2Qy = 6.0 * (Qp0 + QpN) - 12.0 * Qp1;
end else if (SWNQS_i == 2) begin
dQy = (-7.0 * Qp0 - 3.0 * Qp1 + 12.0 * Qp2 - 2.0 * QpN) / 5.0;
d2Qy = -18.0 / 5.0 * (-4.0 * Qp0 + 9.0 * Qp1 - 6.0 * Qp2 + QpN);
end else if (SWNQS_i == 3) begin
dQy = (-13.0 * Qp0 - 6.0 * Qp1 + 24.0 * Qp2 - 6.0 * Qp3 + QpN) / 7.0;
d2Qy = (180.0 * Qp0 - 408.0 * Qp1 + 288.0 * Qp2 - 72.0 * Qp3 + 12.0 * QpN) / 7.0;
end else if (SWNQS_i == 5) begin
dQy = (-181.0 * Qp0 - 84.0 * Qp1 + 24.0 * Qp4 - 6.0 * Qp5 - 90.0 * Qp3 + QpN
+ 336.0 * Qp2) / 65.0;
d2Qy = (432.0 * Qp4 - 108.0 * Qp5 - 1620.0 * Qp3 + 18.0 * QpN + 3762.0 * Qp0
- 8532.0 * Qp1 + 6048.0 * Qp2) / 65.0;
end else if (SWNQS_i == 9) begin
dQy = (1680.0 * Qp6 + 23400.0 * Qp4 + 5.0 * QpN - 87330.0 * Qp3 + 120.0 * Qp8
- 450.0 * Qp7 - 81480.0 * Qp1 + 325920.0 * Qp2
-175565.0 * Qp0 - 30.0 * Qp9) / 37829.0 - 30.0 / 181.0 * Qp5;
d2Qy = (-13500.0 * Qp7 + 702000.0 * Qp4 - 2619900 * Qp3 - 13793100.0 * Qp1
+ 9777600.0 * Qp2 + 6081750.0 * Qp0 + 150.0 * QpN + 3600.0 * Qp8
- 900.0 * Qp9 + 50400.0 * Qp6) / 37829.0 - 900.0 / 181.0 * Qp5;
end else begin
dQy = 0.0;
d2Qy = 0.0;
end
`fq(Qp1, xg_ac, dQy, d2Qy, fk1)
end else begin
thesat2 = 0.0;
end
if (SWNQS_i >= 2) begin
if (SWNQS_i == 2) begin
dQy = (2.0 * Qp0 - 12.0 * Qp1 + 3.0 * Qp2 + 7.0 * QpN) / 5.0;
d2Qy = -18.0 / 5.0 * (-4.0 * QpN + 9.0 * Qp2 - 6.0 * Qp1 + Qp0);
end else if (SWNQS_i == 3) begin
dQy = 0.5 * Qp0 - 3.0 * Qp1 + 3.0 * Qp3 - 0.5 * QpN;
d2Qy = (-48.0 * Qp0 + 288.0 * Qp1 - 480.0 * Qp2 + 288.0 * Qp3 - 48.0 * QpN) / 7.0;
end else if (SWNQS_i == 5) begin
dQy = (-291.0 * Qp1 - 6.0 * Qp2 - 84.0 * Qp4 + 21.0 * Qp5) / 65.0
+ (630.0 * Qp3 - 7.0 * QpN + 97.0 * Qp0) / 130.0;
d2Qy = (-1728.0 * Qp4 + 432.0 * Qp5 + 6480.0 * Qp3 - 72.0 * QpN - 1008.0 * Qp0
+ 6048.0 * Qp1 - 10152.0 * Qp2) / 65.0;
end else if (SWNQS_i == 9) begin
dQy = (-5880.0 * Qp6 - 81900.0 * Qp4 + 305655.0 * Qp3 - 420.0 * Qp8
+ 105.0 * Qp9 - 282255.0 * Qp1 + 1575.0 * Qp7 - 5850.0 * Qp2) / 37829.0
+ 105.0 / 181.0 * Qp5 + (94085.0 * Qp0 - 35.0 * QpN) / 75658.0;
d2Qy = (9777600.0 * Qp1 + 54000.0 * Qp7 - 2808000.0 * Qp4 + 10479600.0 * Qp3
- 16413000.0 * Qp2 - 1629600.0 * Qp0 - 600.0 * QpN - 14400.0 * Qp8
+ 3600.0 * Qp9 - 201600.0 * Qp6) / 37829.0 + 3600.0 * Qp5 / 181.0;
end else begin
dQy = 0.0;
d2Qy = 0.0;
end
`fq(Qp2, xg_ac, dQy, d2Qy, fk2)
end
if (SWNQS_i >= 3) begin
if (SWNQS_i == 3) begin
dQy = (13.0 * QpN + 6.0 * Qp3 - 24.0 * Qp2 + 6.0 * Qp1 - Qp0) / 7.0;
d2Qy = (180.0 * QpN - 408.0 * Qp3 + 288.0 * Qp2 - 72.0 * Qp1 + 12.0 * Qp0) / 7.0;
end else if (SWNQS_i == 5) begin
dQy = (QpN - 6.0 * Qp5 + 24.0 * Qp4 - 24.0 * Qp2 + 6.0 * Qp1 - Qp0) / 5.0;
d2Qy = (1296.0 * (Qp4 + Qp2) - 324.0 * (Qp5 + Qp1) - 2052.0 * Qp3
+ 54.0 * (QpN + Qp0)) / 13.0;
end else if (SWNQS_i == 9) begin
dQy = (21840.0 * Qp6 + 304200.0 * Qp4 + 65.0 * QpN - 420.0 * Qp3 + 1560.0 * Qp8
- 12605.0 * Qp0 - 390.0 * Qp9 + 75630.0 * Qp1 - 5850.0 * Qp7
- 302520.0 * Qp2) / 37829.0 - 390.0 / 181.0 * Qp5;
d2Qy = (-2619900.0 * Qp1 - 202500.0 * Qp7 + 10530000.0 * Qp4 - 16601100.0 * Qp3
+ 10479600.0 * Qp2 + 436650.0 * Qp0 + 2250.0 * QpN + 54000.0 * Qp8
- 13500.0 * Qp9 + 756000.0 * Qp6) / 37829.0 - 13500.0 * Qp5 / 181.0;
end else begin
dQy = 0.0;
d2Qy = 0.0;
end
`fq(Qp3, xg_ac, dQy, d2Qy, fk3)
end
if (SWNQS_i >= 4) begin
if (SWNQS_i == 5) begin
dQy = (-630.0 * Qp3 + 12.0 * Qp4 + 582.0 * Qp5 - 97.0 * QpN + 7.0 * Qp0
- 42.0 * Qp1 + 168.0 * Qp2) / 130.0;
d2Qy = (-10152.0 * Qp4 + 6048.0 * Qp5 + 6480.0 * Qp3 - 1008.0 * QpN
- 72.0 * Qp0 + 432.0 * Qp1 - 1728.0 * Qp2) / 65.0;
end
else if (SWNQS_i == 9) begin
dQy = (-81480.0 * Qp6 - 30.0 * Qp4 - 303975.0 * Qp3 - 5820.0 * Qp8
+ 1455.0 * Qp9 - 20265.0 * Qp1 + 21825.0 * Qp7 + 81060.0 * Qp2) / 37829.0
- 485.0 / 75658.0 * QpN + 1455.0 * Qp5 / 181.0 + 6755.0 * Qp0 / 75658.0;
d2Qy = (702000.0 * Qp1 + 756000.0 * Qp7 - 16614600.0 * Qp4 + 10530000.0 * Qp3
- 2808000.0 * Qp2 - 117000.0 * Qp0 - 8400.0 * QpN - 201600.0 * Qp8
+ 50400.0 * Qp9 - 2822400.0 * Qp6) / 37829.0 + 50400.0 * Qp5 / 181.0;
end else begin
dQy = 0.0;
d2Qy = 0.0;
end
`fq(Qp4, xg_ac, dQy, d2Qy, fk4)
end
if (SWNQS_i >= 5) begin
if (SWNQS_i == 5) begin
dQy = (-336.0 * Qp4 + 84.0 * Qp5 + 90.0 * Qp3 + 181.0 * QpN - Qp0 + 6.0 * Qp1
- 24.0 * Qp2) / 65.0;
d2Qy = (18.0 * Qp0 + 3762.0 * QpN + 6048.0 * Qp4 + 432.0 * Qp2 - 1620.0 * Qp3
- 108.0 * Qp1 - 8532.0 * Qp5) / 65.0;
end else if (SWNQS_i == 9) begin
dQy = (1680.0 * (Qp6 - Qp4) + 5.0 * (QpN - Qp0) + 450.0 * (Qp3 - Qp7)
+ 120.0 * (Qp8 - Qp2) - 30.0 * (Qp9 - Qp1)) / 209.0;
d2Qy = (-900.0 * (Qp1 + Qp9) - 13500.0 * (Qp7 + Qp3) - 79500.0 * Qp5
+ 50400.0 * (Qp4 + Qp6) + 3600.0 * (Qp2 + Qp8) + 150.0 * (Qp0 + QpN)) / 181.0;
end else begin
dQy = 0.0;
d2Qy = 0.0;
end
`fq(Qp5, xg_ac, dQy, d2Qy, fk5)
end
if (SWNQS_i >= 6) begin
if (SWNQS_i == 9) begin
dQy = (30.0 * Qp6 + 81480.0 * Qp4 - 21825.0 * Qp3 - 81060.0 * Qp8 + 20265.0 * Qp9
- 1455.0 * Qp1 + 303975.0 * Qp7 + 5820.0 * Qp2) / 37829.0
-(6755.0 * QpN - 485.0 * Qp0) / 75658.0 - 1455.0 / 181.0 * Qp5;
d2Qy = (50400.0 * Qp1 + 10530000.0 * Qp7 - 2822400.0 * Qp4 + 756000.0 * Qp3
- 201600.0 * Qp2 - 8400.0 * Qp0 - 117000.0 * QpN - 2808000.0 * Qp8
+ 702000.0 * Qp9 - 16614600.0 * Qp6) / 37829.0 + 50400.0 * Qp5 / 181.0;
end else begin
dQy = 0.0;
d2Qy = 0.0;
end
`fq(Qp6, xg_ac, dQy, d2Qy, fk6)
end
if (SWNQS_i >= 7) begin
if (SWNQS_i == 9) begin
dQy = (-304200.0 * Qp6 - 21840.0 * Qp4 + 12605.0 * QpN + 5850.0 * Qp3
+ 302520.0 * Qp8 - 65.0 * Qp0 - 75630.0 * Qp9 + 390.0 * Qp1 + 420.0 * Qp7
- 1560.0 * Qp2) / 37829.0 + 390.0 / 181.0 * Qp5;
d2Qy = (-13500.0 * Qp1 - 16601100.0 * Qp7 + 756000.0 * Qp4 - 202500.0 * Qp3
+ 54000.0 * Qp2 + 2250.0 * Qp0 + 436650.0 * QpN + 10479600.0 * Qp8
- 2619900.0 * Qp9 + 10530000.0 * Qp6) / 37829.0 - 13500.0 * Qp5 / 181.0;
end else begin
dQy = 0.0;
d2Qy = 0.0;
end
`fq(Qp7, xg_ac, dQy, d2Qy, fk7)
end
if (SWNQS_i >= 8) begin
if (SWNQS_i == 9) begin
dQy = (81900.0 * Qp6 + 5880.0 * Qp4 - 1575.0 * Qp3 + 5850.0 * Qp8 + 282255.0 * Qp9
- 105.0 * Qp1 - 305655.0 * Qp7 + 420.0 * Qp2) / 37829.0 + (35.0 * Qp0
- 94085.0 * QpN) / 75658.0 - 105.0 / 181.0 * Qp5;
d2Qy = (3600.0 * Qp1 + 10479600.0 * Qp7 - 201600.0 * Qp4 + 54000.0 * Qp3
- 14400.0 * Qp2 - 600.0 * Qp0 - 1629600.0 * QpN - 16413000.0 * Qp8
+ 9777600.0 * Qp9 - 2808000.0 * Qp6) / 37829.0 + 3600.0 * Qp5 / 181.0;
end else begin
dQy = 0.0;
d2Qy = 0.0;
end
`fq(Qp8, xg_ac, dQy, d2Qy, fk8)
end
if (SWNQS_i >= 9) begin
if (SWNQS_i == 9) begin
dQy = (-23400.0 * Qp6 - 1680.0 * Qp4 + 175565.0 * QpN + 450.0 * Qp3
- 325920.0 * Qp8 - 5.0 * Qp0 + 81480.0 * Qp9 + 30.0 * Qp1
+ 87330.0 * Qp7 - 120.0 * Qp2) / 37829.0 + 30.0 * Qp5 / 181.0;
d2Qy = (-900.0 * Qp1 - 2619900.0 * Qp7 + 50400.0 * Qp4 - 13500.0 * Qp3
+ 3600.0 * Qp2 + 150.0 * Qp0 + 6081750.0 * QpN + 9777600.0 * Qp8
- 13793100.0 * Qp9 + 702000.0 * Qp6) / 37829.0 - 900.0 * Qp5 / 181.0;
end else begin
dQy = 0.0;
d2Qy = 0.0;
end
`fq(Qp9, xg_ac, dQy, d2Qy, fk9)
end
//--------------------------------------------------------------------
// Terminal charges for NQS
QS_NQS = 0.0;
QD_NQS = 0.0;
QG_NQS = 0.0;
if (SWNQS_i != 0) begin
if (SWNQS_i == 1) begin
QS_NQS = (17.0 * Qp0 + 30.0 * Qp1 + QpN) / 96.0;
QD_NQS = (Qp0 + 30.0 * Qp1 + 17.0 * QpN) / 96.0;
`QiToPhi(Qp1,xg_ac, temp1)
QG_NQS = xg_ac - (x_sp + 4.0 * temp1 + x_dp) * `oneSixth;
end else if (SWNQS_i == 2) begin
QS_NQS = (11.0 * Qp0 + 24.0 * Qp1 + 9.0 * Qp2 + QpN) / 90.0;
QD_NQS = (11.0 * QpN + 24.0 * Qp2 + 9.0 * Qp1 + Qp0) / 90.0;
`QiToPhi(Qp1, xg_ac, temp1)
`QiToPhi(Qp2, xg_ac, temp2)
QG_NQS = xg_ac - (x_sp + 3.0 * (temp1 + temp2) + x_dp) * 0.125;
end else if (SWNQS_i == 3) begin
QS_NQS = (251.0 * Qp0 + 594.0 * Qp1 + 312.0 * Qp2 + 174.0 * Qp3 + 13.0 * QpN) / 2688.0;
QD_NQS = (251.0 * QpN + 594.0 * Qp3 + 312.0 * Qp2 + 174.0 * Qp1 + 13.0 * Qp0) / 2688.0;
`QiToPhi(Qp1, xg_ac, temp1)
`QiToPhi(Qp2, xg_ac, temp2)
`QiToPhi(Qp3, xg_ac, temp3)
QG_NQS = xg_ac - (x_sp + 4.0 * temp1 + 2.0 * temp2 + 4.0 * temp3 + x_dp) / 12.0;
end else if (SWNQS_i == 5) begin
QS_NQS = (1187.0 * Qp0 + 43.0 * QpN) / 18720.0 + (503.0 * Qp1 + 172.0 * Qp4
+ 87.0 * Qp5 + 265.0 * Qp3 + 328.0 * Qp2) / 3120.0;
QD_NQS = (1187.0 * QpN + 43.0 * Qp0) / 18720.0 + (503.0 * Qp5 + 172.0 * Qp2
+ 87.0 * Qp1 + 265.0 * Qp3 + 328.0 * Qp4) / 3120.0;
`QiToPhi(Qp1, xg_ac, temp1)
`QiToPhi(Qp2, xg_ac, temp2)
`QiToPhi(Qp3, xg_ac, temp3)
`QiToPhi(Qp4, xg_ac, temp4)
`QiToPhi(Qp5, xg_ac, temp5)
QG_NQS = xg_ac - (x_sp + 4.0 * (temp1 + temp3 + temp5) + 2.0 * (temp2 + temp4) + x_dp) / 18.0;
end else if (SWNQS_i == 9) begin
QS_NQS = (75653.0 * Qp8 + 225999.0 * Qp4) / 3782900.0 + (151321.0 * Qp9
+ 454023.0 * Qp7 + 1073767.0 * Qp3 + 1564569.0 * Qp1) / 15131600.0
+ 75623.0 * Qp6 / 1891450.0 + 145.0 * Qp5 / 2896.0 + 72263.0 * Qp2 / 945725.0
+ (3504517.0 * Qp0 + 75653.0 * QpN) / 90789600.0;
QD_NQS = (75653.0 * Qp2 + 225999.0 * Qp6) / 3782900.0 + (151321.0 * Qp1
+ 454023.0 * Qp3 + 1073767.0 * Qp7 + 1564569.0 * Qp9) / 15131600.0
+ 75623.0 * Qp4 / 1891450.0 + 145.0 * Qp5 / 2896.0 + 72263.0 * Qp8 / 945725.0
+ (3504517.0 * QpN + 75653.0 * Qp0) / 90789600.0;
`QiToPhi(Qp1, xg_ac, temp1)
`QiToPhi(Qp2, xg_ac, temp2)
`QiToPhi(Qp3, xg_ac, temp3)
`QiToPhi(Qp4, xg_ac, temp4)
`QiToPhi(Qp5, xg_ac, temp5)
`QiToPhi(Qp6, xg_ac, temp6)
`QiToPhi(Qp7, xg_ac, temp7)
`QiToPhi(Qp8, xg_ac, temp8)
`QiToPhi(Qp9, xg_ac, temp9)
QG_NQS = xg_ac - (x_sp + 4.0 * (temp1 + temp3 + temp5 + temp7 + temp9)
+ 2.0 * (temp2 + temp4 + temp6 + temp8) + x_dp) / 30.0;
end
QG_NQS = pd * QG_NQS;
if (sigVds > 0) begin
Qs = COX_qm * phit1 * QS_NQS;
Qd = COX_qm * phit1 * QD_NQS;
end else begin
Qs = COX_qm * phit1 * QD_NQS;
Qd = COX_qm * phit1 * QS_NQS;
end
Qg = COX_qm * phit1 * QG_NQS;
Qb = -Qg - Qs - Qd;
end
// Update internal nodes
V(RES1) <+ vnorm_inv * I(RES1) * r_nqs;
V(SPLINE1) <+ vnorm_inv * idt(-Tnorm * fk1, Qp1_0);
V(RES2) <+ vnorm_inv * I(RES2) * r_nqs;
V(SPLINE2) <+ vnorm_inv * idt(-Tnorm * fk2, Qp2_0);
V(RES3) <+ vnorm_inv * I(RES3) * r_nqs;
V(SPLINE3) <+ vnorm_inv * idt(-Tnorm * fk3, Qp3_0);
V(RES4) <+ vnorm_inv * I(RES4) * r_nqs;
V(SPLINE4) <+ vnorm_inv * idt(-Tnorm * fk4, Qp4_0);
V(RES5) <+ vnorm_inv * I(RES5) * r_nqs;
V(SPLINE5) <+ vnorm_inv * idt(-Tnorm * fk5, Qp5_0);
V(RES6) <+ vnorm_inv * I(RES6) * r_nqs;
V(SPLINE6) <+ vnorm_inv * idt(-Tnorm * fk6, Qp6_0);
V(RES7) <+ vnorm_inv * I(RES7) * r_nqs;
V(SPLINE7) <+ vnorm_inv * idt(-Tnorm * fk7, Qp7_0);
V(RES8) <+ vnorm_inv * I(RES8) * r_nqs;
V(SPLINE8) <+ vnorm_inv * idt(-Tnorm * fk8, Qp8_0);
V(RES9) <+ vnorm_inv * I(RES9) * r_nqs;
V(SPLINE9) <+ vnorm_inv * idt(-Tnorm * fk9, Qp9_0);

View File

@ -0,0 +1,205 @@
//======================================================================================
//======================================================================================
// Filename: PSP103_InitNQS.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 103.7.0 (PSP), 200.6.0 (JUNCAP), April 2019
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
/////////////////////////////////////////////////////////////////////////////
//
// Computing initial (dc) values for internal nodes.
// This code is independent of internal-node voltages
//
/////////////////////////////////////////////////////////////////////////////
Qp1_0 = 0.0;
Qp2_0 = 0.0;
Qp3_0 = 0.0;
Qp4_0 = 0.0;
Qp5_0 = 0.0;
Qp6_0 = 0.0;
Qp7_0 = 0.0;
Qp8_0 = 0.0;
Qp9_0 = 0.0;
fk1 = 0.0;
fk2 = 0.0;
fk3 = 0.0;
fk4 = 0.0;
fk5 = 0.0;
fk6 = 0.0;
fk7 = 0.0;
fk8 = 0.0;
fk9 = 0.0;
if (SWNQS_i != 0) begin
dQis = 0.0;
dQy = 0.0;
dfQi = 0.0;
fQi = 0.0;
d2Qy = 0.0;
Qp1 = 0.0;
Qp2 = 0.0;
Qp3 = 0.0;
Qp4 = 0.0;
Qp5 = 0.0;
Qp6 = 0.0;
Qp7 = 0.0;
Qp8 = 0.0;
Qp9 = 0.0;
phi_p1 = 0.0;
phi_p2 = 0.0;
phi_p3 = 0.0;
phi_p4 = 0.0;
phi_p5 = 0.0;
phi_p6 = 0.0;
phi_p7 = 0.0;
phi_p8 = 0.0;
phi_p9 = 0.0;
// Setting initial values for charge along the channel
// from interpolated DC-solution
if (xg_ac > 0) begin
if (SWNQS_i == 1) begin
phi_p1 = `Phiy(0.5);
`PhiToQb(phi_p1,Qb_tmp)
Qp1_0 = -pd * (xg_ac - phi_p1) - Qb_tmp;
end else if (SWNQS_i == 2) begin
phi_p1 = `Phiy(`oneThird);
`PhiToQb(phi_p1,Qb_tmp)
Qp1_0 = -pd * (xg_ac - phi_p1) - Qb_tmp;
phi_p2 = `Phiy(`twoThirds);
`PhiToQb(phi_p2,Qb_tmp)
Qp2_0 = -pd * (xg_ac - phi_p2) - Qb_tmp;
if (sigVds < 0) begin
`swap(Qp1_0, Qp2_0)
end
end else if (SWNQS_i == 3) begin
phi_p1 = `Phiy(0.25);
`PhiToQb(phi_p1,Qb_tmp)
Qp1_0 = -pd * (xg_ac - phi_p1) - Qb_tmp;
phi_p2 = `Phiy(0.5);
`PhiToQb(phi_p2,Qb_tmp)
Qp2_0 = -pd * (xg_ac - phi_p2) - Qb_tmp;
phi_p3 = `Phiy(0.75);
`PhiToQb(phi_p3,Qb_tmp)
Qp3_0 = -pd * (xg_ac - phi_p3) - Qb_tmp;
if (sigVds < 0) begin
`swap(Qp1_0, Qp3_0)
end
end else if (SWNQS_i == 5) begin
phi_p1 = `Phiy(`oneSixth);
`PhiToQb(phi_p1,Qb_tmp)
Qp1_0 = -pd * (xg_ac - phi_p1) - Qb_tmp;
phi_p2 = `Phiy(`oneThird);
`PhiToQb(phi_p2,Qb_tmp)
Qp2_0 = -pd * (xg_ac - phi_p2) - Qb_tmp;
phi_p3 = `Phiy(0.5);
`PhiToQb(phi_p3,Qb_tmp)
Qp3_0 = -pd * (xg_ac - phi_p3) - Qb_tmp;
phi_p4 = `Phiy(`twoThirds);
`PhiToQb(phi_p4,Qb_tmp)
Qp4_0 = -pd * (xg_ac - phi_p4) - Qb_tmp;
phi_p5 = `Phiy(0.8333333333333333);
`PhiToQb(phi_p5,Qb_tmp)
Qp5_0 = -pd * (xg_ac - phi_p5) - Qb_tmp;
if (sigVds < 0) begin
`swap(Qp1_0, Qp5_0)
`swap(Qp2_0, Qp4_0)
end
end else if (SWNQS_i == 9) begin
phi_p1 = `Phiy(0.1);
`PhiToQb(phi_p1,Qb_tmp)
Qp1_0 = -pd * (xg_ac - phi_p1) - Qb_tmp;
phi_p2 = `Phiy(0.2);
`PhiToQb(phi_p2,Qb_tmp)
Qp2_0 = -pd * (xg_ac - phi_p2) - Qb_tmp;
phi_p3 = `Phiy(0.3);
`PhiToQb(phi_p3,Qb_tmp)
Qp3_0 = -pd * (xg_ac - phi_p3) - Qb_tmp;
phi_p4 = `Phiy(0.4);
`PhiToQb(phi_p4,Qb_tmp)
Qp4_0 = -pd * (xg_ac - phi_p4) - Qb_tmp;
phi_p5 = `Phiy(0.5);
`PhiToQb(phi_p5,Qb_tmp)
Qp5_0 = -pd * (xg_ac - phi_p5) - Qb_tmp;
phi_p6 = `Phiy(0.6);
`PhiToQb(phi_p6,Qb_tmp)
Qp6_0 = -pd * (xg_ac - phi_p6) - Qb_tmp;
phi_p7 = `Phiy(0.7);
`PhiToQb(phi_p7,Qb_tmp)
Qp7_0 = -pd * (xg_ac - phi_p7) - Qb_tmp;
phi_p8 = `Phiy(0.8);
`PhiToQb(phi_p8,Qb_tmp)
Qp8_0 = -pd * (xg_ac - phi_p8) - Qb_tmp;
phi_p9 = `Phiy(0.9);
`PhiToQb(phi_p9,Qb_tmp)
Qp9_0 = -pd * (xg_ac - phi_p9) - Qb_tmp;
if (sigVds < 0) begin
`swap(Qp1_0, Qp9_0)
`swap(Qp2_0, Qp8_0)
`swap(Qp3_0, Qp7_0)
`swap(Qp4_0, Qp6_0)
end
end
end // (x_g >0)
end // (SWNQS_i != 0)
x_sp = 0.0;
x_dp = 0.0;
Qp0 = 0.0;
QpN = 0.0;
if (SWNQS_i != 0.0) begin
x_sp = x_m_ac - sigVds * 0.5 * dps_ac * inv_phit1;
x_dp = x_m_ac + sigVds * 0.5 * dps_ac * inv_phit1;
Qp0 = 0.0;
QpN = 0.0;
if (x_sp > 0) begin
`PhiToQb(x_sp, QbSIGN)
Qp0 = -pd * (xg_ac - x_sp) - QbSIGN;
end
if (x_dp > 0) begin
`PhiToQb(x_dp, QbSIGN)
QpN = -pd * (xg_ac - x_dp) - QbSIGN;
end
end

View File

@ -0,0 +1,762 @@
//======================================================================================
//======================================================================================
// Filename: PSP103_macrodefs.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 103.7.0 (PSP), 200.6.0 (JUNCAP), April 2019
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
/////////////////////////////////////////////
//
// Macros and constants used in PSP
//
/////////////////////////////////////////////
// Explicit Gmin
`define GMIN $simparam("gmin",1e-15)
`define PMOS -1
`define NMOS +1
// Some functions
`define MINA(x,y,a) 0.5*((x)+(y)-sqrt(((x)-(y))*((x)-(y))+(a)))
`define MAXA(x,y,a) 0.5*((x)+(y)+sqrt(((x)-(y))*((x)-(y))+(a)))
`define MNE(x,y,a,mne) \
tme1 = 4.0 - (a); \
tme2 = (x) + (y); \
mne = 2.0 / tme1 * (tme2 - sqrt(tme2 * tme2 - tme1 * (x) * (y)));
`define MXE(x,y,a,mxe) \
tme1 = 4.0 - (a); \
tme2 = (x) + (y); \
mxe = 2.0 / tme1 * (tme2 + sqrt(tme2 * tme2 - tme1 * (x) * (y)));
// Physical constants
`define QMN 5.951993
`define QMP 7.448711
// Other constants (PSP-mos)
`define DELTA1 0.02
`define invSqrt2 7.0710678118654746e-01
`define oneSixth 1.6666666666666667e-01
`define LEN 1.0e-6
`define WEN 1.0e-6
/////////////////////////////////////////////////////////////////////////////
//
// Macro definitions.
//
// Note that because at present locally scoped variables
// can only be in named blocks, the intermediate variables
// used in the macros below must be explicitly declared
// as variables in the main code.
//
/////////////////////////////////////////////////////////////////////////////
// Function for parameter definition in the case of separate calculation of charge model in saturation
// --------------------------------------------------------------------------------------------------------------
`define DefACparam(param_i,param_dc,param_ac) \
param_i = (param_dc); \
if ($param_given(param_ac) == 1) \
param_i = (param_ac);
// sigma function used in surface potential and other calculations
// --------------------------------------------------------------------------------------------------------------
// Note: one call uses expressions for arguments so parentheses around the arguments in the expressions are necessary
`define sigma(a,c,tau,eta,y) \
nu = (a) + (c); \
mutau = nu * nu + (tau) * (0.5 * ((c) * (c)) - (a)); \
y = (eta) + (a) * nu * (tau) / (mutau + (nu / mutau) * (tau) * (tau) * (c) * ((c) * (c) * `oneThird - (a)));
// modified version of sigma function, which takes 4 arguments
// --------------------------------------------------------------------------------------------------------------
`define sigma2(a,b,c,tau,eta,y) \
nu = (a) + (c); \
mutau = (nu) * (nu) + (tau) * (0.5 * ((c) * (c)) - (a) * (b)); \
y = (eta) + (a) * nu * (tau) / (mutau + (nu / mutau) * (tau) * (tau) * (c) * ((c) * (c) * `oneThird - (a) * (b)));
// sp_s function: surface potential calculation
// --------------------------------------------------------------------------------------------------------------
`define sp_s(sp,xg,xn,delta) \
if (abs(xg) <= margin) begin \
SP_S_temp1 = inv_xi * inv_xi * `oneSixth * `invSqrt2; \
sp = xg * inv_xi * (1.0 + xg * (1.0 - (delta)) * Gf * SP_S_temp1); \
end else begin \
if (xg < -margin) begin \
SP_S_yg = -xg; \
SP_S_ysub = 1.25 * (SP_S_yg * inv_xi); \
SP_S_eta = 0.5 * (SP_S_ysub + 10 - sqrt((SP_S_ysub - 6.0) * (SP_S_ysub - 6.0) + 64.0)); \
SP_S_temp = SP_S_yg - SP_S_eta; \
SP_S_a = SP_S_temp * SP_S_temp + Gf2*(SP_S_eta + 1.0);\
SP_S_c = 2.0 * SP_S_temp - Gf2; \
SP_S_tau = -SP_S_eta + ln(SP_S_a * inv_Gf2); \
`sigma(SP_S_a, SP_S_c, SP_S_tau, SP_S_eta, SP_S_y0) \
`expl_high(SP_S_y0, SP_S_delta0) \
SP_S_delta1 = 1.0 / SP_S_delta0; \
SP_S_temp = 1.0 / (2.0 + SP_S_y0 * SP_S_y0); \
SP_S_xi0 = SP_S_y0 * SP_S_y0 * SP_S_temp; \
SP_S_xi1 = 4.0 * (SP_S_y0 * SP_S_temp * SP_S_temp); \
SP_S_xi2 = (8.0 * SP_S_temp - 12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \
SP_S_temp = SP_S_yg - SP_S_y0; \
SP_S_temp1 = (delta) * SP_S_delta1; \
SP_S_pC = 2.0 * SP_S_temp + Gf2 * (SP_S_delta0 - 1.0 - SP_S_temp1 + (delta) * (1.0 - SP_S_xi1)); \
SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta0 - SP_S_y0 - 1.0 + SP_S_temp1 + (delta) * (SP_S_y0 - 1.0 - SP_S_xi0)); \
SP_S_temp = 2.0 - Gf2 * (SP_S_delta0 + SP_S_temp1 - (delta) * SP_S_xi2); \
SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \
sp = -SP_S_y0 - 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp))); \
end else begin \
SP_xg1 = 1.0 / (1.25 + Gf * 7.324648775608221e-001); \
SP_S_A_fac= (xi * 1.25 * SP_xg1 - 1.0) * SP_xg1; \
SP_S_xbar = xg * inv_xi * (1.0 + SP_S_A_fac * xg); \
`expl_low(-SP_S_xbar, SP_S_temp) \
SP_S_w = 1.0 - SP_S_temp; \
SP_S_x1 = xg + Gf2 * 0.5 - Gf * sqrt(xg + Gf2 * 0.25 - SP_S_w); \
SP_S_bx = (xn) + 3.0; \
SP_S_eta = `MINA(SP_S_x1, SP_S_bx, 5.0) - 0.5 * (SP_S_bx - sqrt(SP_S_bx * SP_S_bx + 5.0)); \
SP_S_temp = xg - SP_S_eta; \
SP_S_temp1= exp(-SP_S_eta); \
SP_S_temp2= 1.0 / (2.0 + SP_S_eta * SP_S_eta); \
SP_S_xi0 = SP_S_eta * SP_S_eta * SP_S_temp2; \
SP_S_xi1 = 4.0 * (SP_S_eta * SP_S_temp2 * SP_S_temp2); \
SP_S_xi2 = (8.0 * SP_S_temp2 - 12.0 * SP_S_xi0) * SP_S_temp2 * SP_S_temp2; \
SP_S_a = max(1.0e-40, SP_S_temp * SP_S_temp - Gf2 * (SP_S_temp1 + SP_S_eta - 1.0 - (delta) * (SP_S_eta + 1.0 + SP_S_xi0))); \
SP_S_b = 1.0 - 0.5 * (Gf2 * (SP_S_temp1 - (delta) * SP_S_xi2)); \
SP_S_c = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_temp1 - (delta) * (1.0 + SP_S_xi1)); \
SP_S_tau = (xn) - SP_S_eta + ln(SP_S_a / Gf2); \
`sigma2(SP_S_a, SP_S_b, SP_S_c, SP_S_tau, SP_S_eta, SP_S_x0) \
if (SP_S_x0 < `se05) begin \
SP_S_delta0 = exp(SP_S_x0); \
SP_S_delta1 = 1.0 / SP_S_delta0; \
SP_S_delta0 = (delta) * SP_S_delta0; \
end else begin \
if (SP_S_x0 > (xn) - `se05) begin \
SP_S_delta0 = exp(SP_S_x0 - (xn)); \
SP_S_delta1 = (delta) / SP_S_delta0; \
end else begin \
SP_S_delta0 = `ke05 / `P3((xn) - SP_S_x0 - `se05); \
SP_S_delta1 = `ke05 / `P3(SP_S_x0 - `se05); \
end \
end \
SP_S_temp = 1.0 / (2.0 + SP_S_x0 * SP_S_x0); \
SP_S_xi0 = SP_S_x0 * SP_S_x0 * SP_S_temp; \
SP_S_xi1 = 4.0 * (SP_S_x0 * SP_S_temp * SP_S_temp); \
SP_S_xi2 = (8.0 * SP_S_temp - 12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \
SP_S_temp = xg - SP_S_x0; \
SP_S_pC = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_delta1 + SP_S_delta0 - (delta) * (1.0 + SP_S_xi1)); \
SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta1 + SP_S_x0 - 1.0 + SP_S_delta0 - (delta) * (SP_S_x0 + 1.0 + SP_S_xi0)); \
SP_S_temp = 2.0 - Gf2 * (SP_S_delta1 + SP_S_delta0 - (delta) * SP_S_xi2); \
SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \
sp = SP_S_x0 + 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp))); \
end \
end
// sp_s_d function: surface potential calculation at drain (subset of function sp_s)
// --------------------------------------------------------------------------------------------------------------
`define sp_s_d(sp,xg,xn,delta) \
if (abs(xg) <= margin) begin \
SP_S_temp1 = inv_xi * inv_xi * `oneSixth * `invSqrt2; \
sp = xg * inv_xi * (1.0 + xg * (1.0 - (delta)) * Gf * SP_S_temp1); \
end else begin \
SP_S_bx = (xn) + 3; \
SP_S_eta = `MINA(SP_S_x1, SP_S_bx, 5.0) - 0.5 * (SP_S_bx - sqrt(SP_S_bx * SP_S_bx + 5.0)); \
SP_S_temp = xg - SP_S_eta; \
SP_S_temp1= exp(-SP_S_eta); \
SP_S_temp2= 1.0 / (2.0 + SP_S_eta * SP_S_eta); \
SP_S_xi0 = SP_S_eta * SP_S_eta * SP_S_temp2; \
SP_S_xi1 = 4.0 * (SP_S_eta * SP_S_temp2 * SP_S_temp2); \
SP_S_xi2 = (8.0 * SP_S_temp2 - 12.0 * SP_S_xi0) * SP_S_temp2 * SP_S_temp2; \
SP_S_a = max(1.0e-40, SP_S_temp * SP_S_temp - Gf2 * (SP_S_temp1 + SP_S_eta - 1.0 - (delta) * (SP_S_eta + 1.0 + SP_S_xi0))); \
SP_S_b = 1.0 - 0.5 * (Gf2 * (SP_S_temp1 - (delta) * SP_S_xi2)); \
SP_S_c = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_temp1 - (delta) * (1.0 + SP_S_xi1)); \
SP_S_tau = (xn) - SP_S_eta + ln(SP_S_a / Gf2); \
`sigma2(SP_S_a, SP_S_b, SP_S_c, SP_S_tau, SP_S_eta, SP_S_x0) \
if (SP_S_x0 < `se05) begin \
SP_S_delta0 = exp(SP_S_x0); \
SP_S_delta1 = 1.0 / SP_S_delta0; \
SP_S_delta0 = (delta) * SP_S_delta0; \
end else begin \
if (SP_S_x0 > (xn) - `se05) begin \
SP_S_delta0 = exp(SP_S_x0 - (xn)); \
SP_S_delta1 = (delta) / SP_S_delta0; \
end else begin \
SP_S_delta0 = `ke05 / `P3((xn) - SP_S_x0 - `se05); \
SP_S_delta1 = `ke05 / `P3(SP_S_x0 - `se05); \
end \
end \
SP_S_temp = 1.0 / (2.0 + SP_S_x0 * SP_S_x0); \
SP_S_xi0 = SP_S_x0 * SP_S_x0 * SP_S_temp; \
SP_S_xi1 = 4.0 * (SP_S_x0 * SP_S_temp * SP_S_temp); \
SP_S_xi2 = (8.0 * SP_S_temp-12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \
SP_S_temp = xg - SP_S_x0; \
SP_S_pC = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_delta1 + SP_S_delta0 - (delta) * (1.0 + SP_S_xi1)); \
SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta1 + SP_S_x0 - 1.0 + SP_S_delta0 - (delta) * (SP_S_x0 + 1.0 + SP_S_xi0)); \
SP_S_temp = 2.0 - Gf2*(SP_S_delta1+SP_S_delta0-(delta)*SP_S_xi2); \
SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \
sp = SP_S_x0 + 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp)));\
end
// sp_ovInit function: surface potential calculation for the overlap regions initialization
// --------------------------------------------------------------------------------------------------------------
`define sp_ovInit(GOV, GOV2, SP_OV_eps2, SP_OV_a, SP_OV_delta1) \
inv_GOV = 1.0 / GOV; \
SP_OV_eps = 3.1 * GOV + 8.5; \
SP_OV_eps2 = SP_OV_eps * SP_OV_eps; \
SP_OV_delta = 0.5 * SP_OV_eps; \
if (inv_GOV < 0.06) begin \
SP_OV_a = 64.0 * inv_GOV; \
end else begin \
if (inv_GOV <= 0.45) begin \
SP_OV_a = 22.0 * inv_GOV + 3.0; \
end else begin \
if (inv_GOV <= 1.6) begin \
SP_OV_a = -7.2 * inv_GOV + 15.5; \
end else begin \
SP_OV_a = GOV; \
end \
end \
end \
SP_OV_delta1 = SP_OV_delta + GOV2 * 0.5 - GOV * sqrt(SP_OV_delta + GOV2 * 0.25 + SP_OV_a);
// qi_edge charge calculation for the edge transistor
// --------------------------------------------------------------------------------------------------------------
`define qi_edge(qieff_edge,xg_edge,xn_edge) \
Q_EDGE_xsth = xbedge + xn_edge; \
Q_EDGE_xth0 = Q_EDGE_xsth + Gfedge * sqrt(Q_EDGE_xsth); \
Q_EDGE_xth = Q_EDGE_xth0 + dxthedge; \
Q_EDGE_n = 1.0 + Gfedge / (2.0 * sqrt(Q_EDGE_xsth)); \
Q_EDGE_n_inv = 1.0 / Q_EDGE_n; \
Q_EDGE_xgt = xg_edge - Q_EDGE_xth; \
if (Q_EDGE_xgt > -12.0) begin \
Q_EDGE_xgt0 = Q_EDGE_xgt + lnGfedge2 - 1.0; \
Q_EDGE_xgt0e = 0.5 * (Q_EDGE_xgt0 + sqrt(Q_EDGE_xgt0 * Q_EDGE_xgt0 + 10.0)); \
Q_EDGE_qi0si = Q_EDGE_xgt - Q_EDGE_n * ln(Q_EDGE_xgt0e) + lnGfedge2; \
Q_EDGE_qi0 = 0.5 * (Q_EDGE_qi0si + sqrt(Q_EDGE_qi0si * Q_EDGE_qi0si + 2.0)); \
`expl_high((Q_EDGE_xgt - Q_EDGE_qi0), Q_EDGE_exp_x) \
Q_EDGE_d0 = Gfedge2 * Q_EDGE_exp_x; \
Q_EDGE_d0p = pow(Q_EDGE_d0, Q_EDGE_n_inv); \
Q_EDGE_sqerr = Q_EDGE_n * Q_EDGE_n + (2.0 * (Q_EDGE_qi0 + Q_EDGE_n) - Q_EDGE_d0p) * Q_EDGE_d0p; \
Q_EDGE_errq = Q_EDGE_n * ((sqrt(Q_EDGE_sqerr) - Q_EDGE_n) / Q_EDGE_d0p - 1.0); \
qieff_edge = Q_EDGE_qi0 - Q_EDGE_errq; \
end else begin \
`expl_low((Q_EDGE_n_inv * (Q_EDGE_xgt + lnGfedge2)), qieff_edge) \
end
// CollapsableR macro: used for parasitic resistances
// --------------------------------------------------------------------------------------------------------------
// Note: if R=0, the Verilog-A compiler should recognize that the corresponding nodes can be collapsed
`define CollapsableR(G, R, SN, N1, N2, Rname) \
if ((R) > 0.0) begin \
I(N1, N2) <+ MULT_i * (G) * V(N1, N2); \
/* line below can be removed if compiler issue occurs */ \
I(N1, N2) <+ white_noise(MULT_i * SN, Rname); \
end else begin \
V(N1, N2) <+ 0.0; \
end
//ngspice-adms: can't node collapse
`define NonCollapsableR(G, R, SN, N1, N2, Rname) \
I(N1, N2) <+ MULT_i * (G) * V(N1, N2); \
I(N1, N2) <+ white_noise(MULT_i * SN, Rname);
// Local variable declaration (used in SPcalc_dc/SPcalc_ac sections, PSP103_SPCalculation.include and SP macro)
// --------------------------------------------------------------------------------------------------------------
//`define SPcalcLocalVarDecl \
// real phib, G_0, Vsbstar, cfloc, thesatloc, axloc, alploc; \
// real Vsbx, xg, Dnsub, Gf, Gf2, inv_Gf2, xi, inv_xi, Ux, xn_s, delta_ns, margin, x_s, delta_1s, xi0s, xi1s; \
// real xi2s, Es, Ds, Ps, Rxcor, xgs, qis, qbs, rhob, GR, Eeffm, Mutmp, Gmob, xitsb, wsat, thesat1, phi_inf; \
// real ysat, za, Phi_0, asat, Phi_2, Phi_0_2, Phi0_Phi2, Phi_sat, Vdse, Udse, xn_d, k_ds, delta_nd, x_d, x_ds; \
// real pC, qC, dps, xi0d, Ed, Dd, x_m, Em, D_bar, Dm, Pm, xgm, eta_p, sqm, alpha, d0, x_pm, p_pd, q_pd, xi_pd; \
// real u_pd, km, km0, qim, qim1, qbm, qeff, qeff1, s1, dL, GdL, Gmob_dL, zsat, Gvsat, Gvsatinv, Voxm, alpha1, H; \
// real SP_S_temp, SP_S_temp1, SP_S_temp2; \
// real SP_S_yg, SP_S_ysub, SP_S_eta, SP_S_a, SP_S_c, SP_S_tau, SP_S_y0, SP_S_delta0, SP_S_delta1, SP_S_xi0; \
// real SP_S_xi1, SP_S_xi2, SP_S_pC, SP_S_qC, SP_xg1, SP_S_A_fac, SP_S_xbar, SP_S_w, SP_S_x1, SP_S_bx, SP_S_b; \
// real SP_S_x0;
// TempInitialize macro: initialize the temperature dependent variables
// --------------------------------------------------------------------------------------------------------------
`define TempInitialize \
TKD_sq = TKD * TKD; \
delT = TKD - TKR; \
rTn = TKR / TKD; \
ln_rTn = ln(rTn); \
phit = TKD * `KBOL / `QELE; \
inv_phit = 1.0 / phit; \
Eg = 1.179 - 9.025e-5 * TKD - 3.05e-7 * TKD_sq; \
phibFac = (1.045 + 4.5e-4 * TKD) * (0.523 + 1.4e-3 * TKD - 1.48e-6 * TKD_sq) * TKD_sq / 9.0E4; \
phibFac = `MAX(phibFac, 1.0E-3); \
\
/* parameter for white noise of parasitic resistances */ \
nt0 = 4.0 * `KBOL * TKD;
// TempScaling macro: calculation of temperature dependent variables
// --------------------------------------------------------------------------------------------------------------
`define TempScaling \
phib_dc = Eg + DPHIB_i + 2.0 * phit * ln(NEFF_i * pow(phibFac, -0.75) * 4.0e-26); \
phib_dc = `MAX(phib_dc, 5.0E-2); \
G_0_dc = sqrt(2.0 * `QELE * NEFF_i * EPSSI * inv_phit) / CoxPrime; \
\
/* Poly-silicon depletion */ \
kp = 0.0; \
np = 0.0; \
if (NP_i > 0.0) begin \
arg2max = 8.0e7 / tox_sq; \
np = `MAX(NP_i, arg2max); \
np = `MAX(5.0e24, np); \
kp = 2.0 * CoxPrime * CoxPrime * phit / (`QELE * np * EPSSI); \
end \
\
/* QM corrections */ \
qlim2 = 100.0 * phit * phit; \
if (QMC_i > 0.0) begin \
qb0 = sqrt(phit * G_0_dc * G_0_dc * phib_dc); \
dphibq = 0.75 * qq * pow(qb0, `twoThirds); \
phib_dc = phib_dc + dphibq; \
G_0_dc = G_0_dc * (1.0 + 2.0 * `twoThirds * dphibq / qb0); \
end \
sqrt_phib_dc = sqrt(phib_dc); \
phix_dc = 0.95 * phib_dc; \
aphi_dc = 0.0025 * phib_dc * phib_dc; \
bphi_dc = aphi_dc; \
phix2 = 0.5 * sqrt(bphi_dc); \
phix1_dc = `MINA(phix_dc - phix2, 0.0, aphi_dc); \
alpha_b = 0.5 * (phib_dc + Eg); \
us1 = sqrt(VSBNUD_i + phib_dc) - sqrt_phib_dc; \
us21 = sqrt(VSBNUD_i + DVSBNUD_i + phib_dc) - sqrt_phib_dc - us1; \
\
/* Additional variables for separate surface potential calculation for CV */ \
phib_ac = Eg + DPHIB_i + DELVTAC_i + 2.0 * phit * ln(NEFFAC_i * pow(phibFac, -0.75) * 4.0e-26); \
phib_ac = `MAX(phib_ac, 5.0E-2); \
G_0_ac = sqrt(2.0 * `QELE * NEFFAC_i * EPSSI * inv_phit) / CoxPrime; \
\
if (QMC_i > 0.0) begin \
qb0 = sqrt(phit * G_0_ac * G_0_ac * phib_ac); \
dphibq = 0.75 * qq * pow(qb0, `twoThirds); \
phib_ac = phib_ac + dphibq; \
G_0_ac = G_0_ac * (1.0 + 2.0 * `twoThirds * dphibq / qb0); \
end \
\
phix_ac = 0.95 * phib_ac; \
aphi_ac = 0.0025 * phib_ac * phib_ac; \
bphi_ac = aphi_ac; \
phix2 = 0.5 * sqrt(bphi_ac); \
phix1_ac = `MINA(phix_ac - phix2, 0.0, aphi_ac); \
\
/* Temperature scaling of parameters*/ \
VFB_T = VFB_i + STVFB_i * delT * (1.0 + ST2VFB_i * delT)+ DELVTO_i; \
\
/* Interface states parameters*/ \
tf_ct = exp(STCT_i * ln_rTn); \
CT_T = CT_i * tf_ct; \
CTG_T = CTG_i / rTn; \
\
/* Mobility parameters */ \
tf_bet = exp(STBET_i * ln_rTn); \
BETN_T = BETN_i * tf_bet; \
BET_i = FACTUO_i * BETN_T * CoxPrime; \
THEMU_T = THEMU_i * exp(STTHEMU_i * ln_rTn); \
tf_mue = exp(STMUE_i * ln_rTn); \
MUE_T = MUE_i * tf_mue; \
THECS_T = THECS_i * exp(STTHECS_i * ln_rTn); \
tf_cs = exp(STCS_i * ln_rTn); \
CS_T = CS_i * tf_cs; \
tf_xcor = exp(STXCOR_i * ln_rTn); \
XCOR_T = XCOR_i * tf_xcor; \
\
/* Series resistance */ \
tf_ther = exp(STRS_i * ln_rTn); \
RS_T = RS_i * tf_ther; \
THER_i = 2.0 * BET_i * RS_T; \
\
/* Velocity saturation */ \
tf_thesat = exp(STTHESAT_i * ln_rTn); \
THESAT_T = THESAT_i * tf_thesat; \
THESATAC_T = THESATAC_i * tf_thesat; \
\
/* Impact ionization */ \
A2_T = A2_i * exp(-STA2_i * ln_rTn); \
\
/* Noise */ \
nt = FNT_i * 4.0 * `KBOL * TKD; \
Sfl_prefac = phit * phit * BET_i / Cox_over_q; \
\
/* Edge transistor */ \
if ((SWEDGE_i != 0.0) && (BETNEDGE_i > 0.0)) begin \
VFBEDGE_T = VFBEDGE_i + STVFBEDGE_i * delT + DELVTOEDGE_i; \
tf_betedge = exp(STBETEDGE_i * ln_rTn); \
BETNEDGE_T = BETNEDGE_i * tf_betedge; \
BETEDGE_i = FACTUOEDGE_i * BETNEDGE_T * CoxPrime; \
phit0edge = phit * (1.0 + CTEDGE_i * rTn); \
phibedge = Eg + DPHIBEDGE_i + 2.0 * phit0edge * ln(NEFFEDGE_i * pow(phibFac, -0.75) * 4.0e-26); \
phibedge = `MAX(phibedge, 5.0E-2); \
Gfedge = sqrt(2.0 * `QELE * NEFFEDGE_i * EPSSI * inv_phit) / CoxPrime; \
Gfedge2 = Gfedge * Gfedge; \
lnGfedge2 = ln(Gfedge2); \
phixedge = 0.95 * phibedge; \
aphiedge = 0.0025 * phibedge * phibedge; \
bphiedge = aphiedge; \
phix2edge = 0.5 * sqrt(bphiedge); \
phix1edge = `MINA(phixedge - phix2edge, 0.0, aphiedge); \
Sfl_prefac_edge = phit * phit * BETEDGE_i / Cox_over_q; \
ntedge = FNTEDGE_i * 4.0 * `KBOL * TKD; \
end else begin \
VFBEDGE_T = 0.0; \
tf_betedge = 1.0; \
BETNEDGE_T = 0.0; \
BETEDGE_i = 0.0; \
phit0edge = phit; \
phibedge = 0.0; \
Gfedge = 1.0; \
Gfedge2 = 1.0; \
lnGfedge2 = 0.0; \
phixedge = 0.0; \
aphiedge = 0.0; \
bphiedge = 0.0; \
phix2edge = 0.0; \
phix1edge = 0.0; \
Sfl_prefac_edge = 0.0; \
ntedge = 1.0; \
end
// Model's core for currents and charges calculation (initially into PSP103_SPCalculation.include)
// --------------------------------------------------------------------------------------------------------------
`define SPCalculation \
\
/* Initialisation of some variables */ \
alpha = 0.0; \
GdL = 1.0; \
dL = 0.0; \
qbm = 0.0; \
dps = 0.0; \
qim = 0.0; \
qim1 = 0.0; \
H = 1.0; \
s1 = 0.0; \
eta_p = 1.0; \
Gvsat = 1.0; \
Gvsatinv = 1.0; \
SP_S_x1 = 0.0; \
x_s = 0.0; \
sqm = 0.0; \
xitsb = 0.0; \
rhob = 0.0; \
Gmob = 1.0; \
Gmob_dL = 1.0; \
Udse = 0.0; \
thesat1 = 0.0; \
xgm = 0.0; \
\
/* Bias definition */ \
Vgb1 = Vgs + Vsbstar - VFB_T; \
Vsbx = Vsbstar + 0.5 * (Vds - Vdsx); \
Vdsp = 2.0 * Vdsx / (1.0 + sqrt(1.0 + CFD_i * Vdsx)); \
delVg = cfloc * Vdsp * (1.0 + CFB_i * Vsbx); \
dphit1 = PSCE_i * (1.0 + PSCED_i * Vdsx) * (1.0 + PSCEB_i * Vsbx); \
Vgb1 = Vgb1 + delVg; \
\
/* Bias dependent body factor */ \
if (DNSUB_i > 0.0) begin \
Dnsub = DNSUB_i * `MAXA(0.0, Vgs + Vsb - VNSUB_i, NSLP_i); \
Gf = G_0 * sqrt(1.0 + Dnsub); \
end else begin \
Gf = G_0; \
end \
Gf2 = Gf * Gf; \
inv_Gf2 = 1.0 / Gf2; \
\
/* Bias dependence of interface states */ \
dCTG = 1.0; \
if (CTG_i > 0.0) begin \
xgct = 2.0 * Vgb1 * inv_phit; \
temp1 = Gf2 + xgct; \
temp2 = `MAXA((temp1 + xgct), 0.0, 5.0); \
xsct0 = 0.5 * (temp1 - Gf * sqrt(temp2)); \
xbct = phib * inv_phit; \
xsbstar = Vsbx * inv_phit; \
temp1 = xbct + xsbstar + 2.0; \
xsct = `MINA(xsct0, temp1, 5.0); \
temp2 = CTG_T * (xsct - (1.0 + CTB_i) * (0.5 * xbct + xsbstar)); \
`expl_low(temp2, dCTG) \
end \
ct_fact = 1.0 + CT_T * dCTG; \
phit1 = phit * ct_fact * (1.0 + dphit1); \
inv_phit1 = 1.0 / phit1; \
xg = Vgb1 * inv_phit1; \
\
/* Surface potential at source side */ \
xi = 1.0 + Gf * `invSqrt2; \
inv_xi = 1.0 / xi; \
Ux = Vsbstar * inv_phit1; \
xn_s = phib * inv_phit1 + Ux; \
if (xn_s < `se) \
delta_ns = exp(-xn_s); \
else \
delta_ns = `ke / `P3(xn_s - `se); \
margin = 1.0e-5 * xi; \
\
`sp_s(x_s, xg, xn_s, delta_ns) \
x_d = x_s; \
x_m = x_s; \
x_ds = 0.0; \
\
/* Core PSP current calculation */ \
Vdsat_lim = 3.912023005 * phit1; \
if (xg <= 0.0) begin \
qis = 0.0; \
xgm = xg - x_s; \
Voxm = xgm * phit1; \
qeff1 = Voxm; \
Vdsat = Vdsat_lim; \
Vdse = Vds; \
end else begin /* (xg > 0) */ \
delta_1s = 0.0; \
temp = 1.0 / (2.0 + x_s * x_s); \
xi0s = x_s * x_s * temp; \
xi1s = 4.0 * (x_s * temp * temp); \
xi2s = (8.0 * temp - 12.0 * xi0s) * temp * temp; \
if (x_s < `se05) begin \
delta_1s = exp(x_s); \
Es = 1.0 / delta_1s; \
delta_1s = delta_ns * delta_1s; \
end else if (x_s > (xn_s - `se05)) begin \
delta_1s = exp(x_s - xn_s); \
Es = delta_ns / delta_1s; \
end else begin \
delta_1s = `ke05 / `P3(xn_s - x_s - `se05); \
Es = `ke05 / `P3(x_s - `se05); \
end \
Ds = delta_1s - delta_ns * (x_s + 1.0 + xi0s); \
if (x_s < 1.0e-5) begin \
Ps = 0.5 * (x_s * x_s * (1.0 - `oneThird * (x_s * (1.0 - 0.25 * x_s)))); \
Ds = `oneSixth * (delta_ns * x_s * x_s * x_s * (1.0 + 1.75 * x_s)); \
temp = sqrt(1.0 - `oneThird * (x_s * (1.0 - 0.25 * x_s))); \
sqm = `invSqrt2 * (x_s * temp); \
alpha = 1.0 + Gf * `invSqrt2 * (1.0 - 0.5 * x_s + `oneSixth * (x_s * x_s)) / temp; \
end else begin \
Ps = x_s - 1.0 + Es; \
sqm = sqrt(Ps); \
alpha = 1.0 + 0.5 * (Gf * (1.0 - Es) / sqm); \
end \
Em = Es; \
Ed = Em; \
Dm = Ds; \
Dd = Dm; \
\
/* Drain saturation voltage */ \
Rxcor = (1.0 + 0.2 * XCOR_T * Vsbx) / (1.0 + XCOR_T * Vsbx); \
if (Ds > `ke05) begin \
xgs = Gf * sqrt(Ps + Ds); \
qis = Gf2 * Ds * phit1 / (xgs + Gf * sqm); \
qbs = sqm * Gf * phit1; \
if (RSB_i < 0.0) begin \
rhob = 1.0 / (1.0 - RSB_i * Vsbx); \
end else begin \
rhob = 1.0 + RSB_i * Vsbx; \
end \
if (RSG_i < 0.0) begin \
temp = 1.0 - RSG_i * qis; \
end else begin \
temp = 1.0 / (1.0 + RSG_i * qis); \
end \
GR = THER_i * (rhob * temp * qis); \
Eeffm = E_eff0 * (qbs + eta_mu * qis); \
temp1 = ln(Ps / (Ps + Ds + 1.0e-14)); \
Mutmp = pow(Eeffm * MUE_T, THEMU_T) + CS_T * exp(0.5 * THECS_T * temp1); \
Gmob = (1.0 + Mutmp + GR) * Rxcor; \
if (THESATB_i < 0.0) begin \
xitsb = 1.0 / (1.0 - THESATB_i * Vsbx); \
end else begin \
xitsb = 1.0 + THESATB_i * Vsbx; \
end \
temp2 = qis * xitsb; \
wsat = 100.0 * (temp2 / (100.0 + temp2)); \
if (THESATG_i < 0.0) begin \
temp = 1.0 / (1.0 - THESATG_i * wsat); \
end else begin \
temp = 1.0 + THESATG_i * wsat; \
end \
thesat1 = thesatloc * (temp / Gmob); \
phi_inf = qis / alpha + phit1; \
ysat = thesat1 * phi_inf * `invSqrt2; \
if (CHNL_TYPE==`PMOS) begin \
ysat = ysat / sqrt(1.0 + ysat); \
end \
za = 2.0 / (1.0 + sqrt(1.0 + 4.0 * ysat)); \
temp1 = za * ysat; \
Phi_0 = phi_inf * za * (1.0 + 0.86 * (temp1 * (1.0 - temp1 * za) / (1.0 + 4.0 * (temp1 * temp1 * za)))); \
asat = xgs + 0.5 * Gf2; \
Phi_2 = 0.98 * (Gf2 * Ds * phit1 / (asat + sqrt(asat * asat - Gf2 * Ds * 0.98))); \
Phi_0_2 = Phi_0 + Phi_2; \
Phi0_Phi2 = 2.0 * (Phi_0 * Phi_2); \
Phi_sat = Phi0_Phi2 / (Phi_0_2 + sqrt(Phi_0_2 * Phi_0_2 - 1.98 * Phi0_Phi2)); \
Vdsat = Phi_sat - phit1 * ln(1.0 + Phi_sat * (Phi_sat - 2.0 * asat * phit1) * inv_Gf2 / (phit1 * phit1 * Ds)); \
end else begin \
Vdsat = Vdsat_lim; \
end \
temp = pow(Vds / Vdsat, axloc); \
temp1 = -1.0 / axloc; \
Vdse = Vds * pow(1.0 + temp, temp1); \
\
/* Surface potential at drain side */ \
Udse = Vdse * inv_phit1; \
xn_d = xn_s + Udse; \
if (Udse < `se) begin \
k_ds = exp(-Udse); \
end else begin \
k_ds = `ke / `P3(Udse - `se); \
end \
delta_nd = delta_ns * k_ds; \
\
`sp_s_d(x_d, xg, xn_d, delta_nd) \
x_ds = x_d - x_s; \
\
/* Approximations for extremely small x_ds: capacitance calculation */ \
if (x_ds < 1.0e-10) begin \
pC = 2.0 * (xg - x_s) + Gf2 * (1.0 - Es + delta_1s * k_ds - delta_nd * (1.0 + xi1s)); \
qC = Gf2 * (1.0 - k_ds) * Ds; \
temp = 2.0 - Gf2 * (Es + delta_1s * k_ds - delta_nd * xi2s); \
temp = pC * pC - 2.0 * (temp * qC); \
x_ds = 2.0 * (qC / (pC + sqrt(temp))); \
x_d = x_s + x_ds; \
end \
dps = x_ds * phit1; \
\
xi0d = x_d * x_d / (2.0 + x_d * x_d); \
if (x_d < `se05) begin \
Ed = exp(-x_d); \
if (x_d < 1.0e-5) begin \
Dd = `oneSixth * delta_nd * x_d * x_d * x_d * (1.0 + 1.75 * x_d); \
end else begin \
Dd = delta_nd * (1.0 / Ed - x_d - 1.0 - xi0d); \
end \
end else begin \
if (x_d > (xn_d - `se05)) begin \
temp = exp(x_d - xn_d); \
Ed = delta_nd / temp; \
Dd = temp - delta_nd * (x_d + 1.0 + xi0d); \
end else begin \
Ed = `ke05 / `P3(x_d - `se05); \
temp = `ke05 / `P3(xn_d - x_d - `se05); \
Dd = temp - delta_nd * (x_d + 1.0 + xi0d); \
end \
end \
\
/* Mid-point surface potential */ \
x_m = 0.5 * (x_s + x_d); \
Em = 0.0; \
temp = Ed * Es; \
if (temp > 0.0) begin \
Em = sqrt(temp); \
end \
D_bar = 0.5 * (Ds + Dd); \
Dm = D_bar + 0.125 * (x_ds * x_ds * (Em - 2.0 * inv_Gf2)); \
\
if (x_m < 1.0e-5) begin \
Pm = 0.5 * (x_m * x_m * (1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m)))); \
xgm = Gf * sqrt(Dm + Pm); \
\
/* Polysilicon depletion */ \
if (kp > 0.0) begin \
eta_p = 1.0 / sqrt(1.0 + kp * xgm); \
end /* (kp > 0.0) */ \
temp = sqrt(1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m))); \
sqm = `invSqrt2 * (x_m * temp); \
alpha = eta_p + `invSqrt2 * (Gf * (1.0 - 0.5 * x_m + `oneSixth * (x_m * x_m)) / temp); \
end else begin \
Pm = x_m - 1.0 + Em; \
xgm = Gf * sqrt(Dm + Pm); \
\
/* Polysilicon depletion */ \
if (kp > 0.0) begin \
d0 = 1.0 - Em + 2.0 * (xgm * inv_Gf2); \
eta_p = 1.0 / sqrt(1.0 + kp * xgm); \
temp = eta_p / (eta_p + 1.0); \
x_pm = kp * (temp * temp * Gf2 * Dm); \
p_pd = 2.0 * (xgm - x_pm) + Gf2 * (1.0 - Em + Dm); \
q_pd = x_pm * (x_pm - 2.0 * xgm); \
xi_pd = 1.0 - 0.5 * (Gf2 * (Em + Dm)); \
u_pd = q_pd * p_pd / (p_pd * p_pd - xi_pd * q_pd); \
x_m = x_m + u_pd; \
km = exp(u_pd); \
Em = Em / km; \
Dm = Dm * km; \
Pm = x_m - 1.0 + Em; \
xgm = Gf * sqrt(Dm + Pm); \
km0 = 1.0 - Em + 2.0 * (xgm * eta_p * inv_Gf2); \
x_ds = x_ds * km * (d0 + D_bar) / (km0 + km * D_bar); \
dps = x_ds * phit1; \
end /* (kp > 0.0) */ \
sqm = sqrt(Pm); \
alpha = eta_p + 0.5 * (Gf * (1.0 - Em) / sqm); \
end \
\
/* Potential midpoint inversion charge */ \
qim = phit1 * (Gf2 * Dm / (xgm + Gf * sqm)); \
qim1 = qim + phit1 * alpha; \
qbm = sqm * Gf * phit1; \
\
/* Series resistance */ \
if (RSG_i < 0.0) begin \
temp = 1.0 - RSG_i * qim; \
end else begin \
temp = 1.0 / (1.0 + RSG_i * qim); \
end \
GR = THER_i * (rhob * temp * qim); \
\
/* Mobility reduction */ \
qeff = qbm + eta_mu * qim; \
qeff1 = qbm + eta_mu1 * qim; \
Eeffm = E_eff0 * qeff; \
temp1 = ln(Pm / (Pm + Dm + 1.0e-14)); \
Mutmp = pow(Eeffm * MUE_T, THEMU_T) + CS_T * exp(0.5 * THECS_T * temp1); \
Gmob = (1.0 + Mutmp + GR) * Rxcor; \
\
/* Channel length modulation */ \
s1 = ln((1.0 + (Vds - dps) * inv_VP) / (1.0 + (Vdse - dps) * inv_VP)); \
dL = alploc * s1; \
GdL = 1.0 / (1.0 + dL + dL * dL); \
\
/* Velocity saturation */ \
temp2 = qim * xitsb; \
wsat = 100.0 * (temp2 / (100.0 + temp2)); \
Gmob_dL = Gmob * GdL; \
if (THESATG_i < 0.0) begin \
temp = 1.0 / (1.0 - THESATG_i * wsat); \
end else begin \
temp = 1.0 + THESATG_i * wsat; \
end \
thesat1 = thesatloc * (temp / Gmob_dL); \
zsat = thesat1 * thesat1 * dps * dps; \
if (CHNL_TYPE == `PMOS) begin \
zsat = zsat / (1.0 + thesat1 * dps); \
end \
Gvsat = 0.5 * (Gmob_dL * (1.0 + sqrt(1.0 + 2.0 * zsat))); \
Gvsatinv = 1.0 / Gvsat; \
\
/* Variables for calculation of intrinsic charges and gate current */ \
Voxm = xgm * phit1; \
temp = Gmob_dL * Gvsatinv; \
alpha1 = alpha * (1.0 + 0.5 * (zsat * temp * temp)); \
H = temp * qim1 / alpha1; \
\
end /* (xg > 0) */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,123 @@
//======================================================================================
//======================================================================================
// Filename: PSP103_nqs_macrodefs.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 103.7.0 (PSP), 200.6.0 (JUNCAP), April 2019
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
//////////////////////////////////////////
//
// Macros used in PSP-NQS
//
//////////////////////////////////////////
// Function to calculate bulk charge from surface potential
`define PhiToQb(phi,Qb_tmp) \
if (abs(phi) <= margin_ac) \
Qb_tmp = -0.70710678 * phi * Gf_ac * (1.0 - `oneSixth * phi * (1.0 - `oneSixth * phi)); \
else begin \
`expl((-phi), temp) \
Qb_tmp = Gf_ac * sqrt(temp + phi - 1.0); \
if (phi > margin_ac) \
Qb_tmp = -Qb_tmp; \
end
// Function used in fq-macro
`define PhiTod2Qis(xphi,d2Qis) \
if (abs(xphi) <= margin_ac) begin \
Qb_tmp = -0.70710678 * xphi * Gf_ac * (1.0 - `oneSixth * xphi * (1.0 - `oneSixth * xphi)); \
dQbs = -0.70710678 * Gf_ac * (1.0 - `oneThird * xphi * (1.0 - 0.25 * xphi)); \
d2Qis = -0.235702 * Gf_ac * (1.0 - 0.5 * xphi); \
end else begin \
`expl((-xphi),temp) \
Qb_tmp = Gf_ac * sqrt(temp + xphi - 1.0); \
if (xphi > margin_ac) \
Qb_tmp = -Qb_tmp; \
dQbs = 0.5 * Gf_ac * Gf_ac * (1.0 - temp) / Qb_tmp; \
d2Qis = (dQbs * dQbs - 0.5 * Gf_ac * Gf_ac) / Qb_tmp + dQbs; \
end
// Function used in QiToPhi
`define sps(sp, xg) \
if (abs(xg) <= marginp) begin \
sp = xg / a_factrp; \
end else begin \
if (xg < -marginp) begin \
NQS_yg = -xg; \
NQS_z = 1.25 * NQS_yg / a_factrp; \
NQS_eta = (NQS_z + 10.0 - sqrt((NQS_z - 6.0) * (NQS_z - 6.0) + 64.0)) * 0.5; \
NQS_a = (NQS_yg - NQS_eta) * (NQS_yg - NQS_eta) + Gp2 * (NQS_eta + 1.0); \
NQS_c = 2.0 * (NQS_yg - NQS_eta) - Gp2; \
NQS_tau = ln(NQS_a / Gp2) - NQS_eta; \
`sigma(NQS_a, NQS_c, NQS_tau, NQS_eta, NQS_y0) \
`expl(NQS_y0, NQS_D0) \
NQS_xi = 1.0 - Gp2 * NQS_D0 * 0.5; \
NQS_p = 2.0 * (NQS_yg - NQS_y0) + Gp2 * (NQS_D0 - 1.0); \
NQS_q = (NQS_yg - NQS_y0) * (NQS_yg - NQS_y0) + Gp2 * (NQS_y0 + 1.0 - NQS_D0); \
NQS_temp = NQS_p * NQS_p - 4.0 * NQS_xi * NQS_q; \
NQS_w = 2.0 * NQS_q / (NQS_p + sqrt(NQS_temp)); \
sp = -(NQS_y0 + NQS_w); \
end else begin \
NQS_xg1 = 1.0 / ( 1.25 + 7.32464877560822e-01 * Gp); \
NQS_A_fac = (1.25 * a_factrp * NQS_xg1 - 1.0) * NQS_xg1; \
NQS_xbar = xg / a_factrp * (1.0 + NQS_A_fac * xg); \
`expl(-NQS_xbar, NQS_temp) \
NQS_w = 1.0 - NQS_temp; \
NQS_x0 = xg + Gp2 * 0.5 - Gp * sqrt(xg + Gp2 * 0.25 - NQS_w); \
`expl((-NQS_x0), NQS_D0) \
NQS_xi = 1.0 - Gp2 * 0.5 * NQS_D0; \
NQS_p = 2.0 * (xg - NQS_x0) + Gp2 * (1.0 - NQS_D0); \
NQS_q = (xg - NQS_x0) * (xg - NQS_x0) - Gp2 * (NQS_x0 - 1.0 + NQS_D0); \
NQS_temp = NQS_p * NQS_p - 4.0 * NQS_xi * NQS_q; \
NQS_u = 2.0 * NQS_q / (NQS_p + sqrt(NQS_temp)); \
sp = NQS_x0 + NQS_u; \
end \
end
// Function to calculate surface potential from inversion charge
`define QiToPhi(Qi,xg,xphi) \
temp = Qi / pd + xg; \
`sps(xphi,temp)
// Calculation of fk
`define fq(Qi,xg,dQy,d2Qy,fk) \
`QiToPhi(Qi, xg, xphi) \
`PhiTod2Qis(xphi, d2Qis) \
dQis = pd - dQbs; \
dQis_1 = 1.0 / dQis; \
fQi = Qi * dQis_1 - 1.0; \
dfQi = (1.0 - Qi * d2Qis * dQis_1 * dQis_1) * dQis_1; \
fk0 = dfQi * dQy * dQy + fQi * d2Qy; \
dpsy2 = dQy * dQy * dQis_1 * dQis_1; \
zsat_nqs = thesat2 * dpsy2; \
if (CHNL_TYPE == `PMOS) \
zsat_nqs = zsat_nqs / (1.0 + thesat1_ac * dps_ac); \
temp = sqrt(1.0 + 2.0 * zsat_nqs); \
Fvsat = 2.0 / (1.0 + temp); \
temp1 = d2Qy - dpsy2 * d2Qis; \
fk = Fvsat * (fk0 - zsat_nqs * fQi * temp1 * Fvsat / temp);
// Interpolation of surface potential along channel
`define Phiy(y) \
x_m_ac + H_ac * (1.0 - sqrt(1.0 - 2.0 * dps_ac / H_ac * ((y) - ym))) * inv_phit1

View File

@ -0,0 +1,913 @@
//======================================================================================
//======================================================================================
// Filename: PSP103_parlist.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 103.7.0 (PSP), 200.6.0 (JUNCAP), April 2019
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
// --------------------------------------------------------------------------------------------------------------
// Special model parameters and switch parameters
// --------------------------------------------------------------------------------------------------------------
// Special model parameters, some are also simulator global variables
`MPInb(LEVEL ,103 ,"" ,"Model level")
`MPIty(TYPE ,1 ,"" ,"Channel type parameter, +1=NMOS -1=PMOS")
`MPRco(TR ,21.0 ,"degC" ,-273.0 ,inf ,"nominal (reference) temperature")
// Switch parameters that turn models or effects on or off
`MPIcc(SWGEO ,1 ,"" ,0 ,2 ,"Flag for geometrical model, 0=local, 1=global, 2=binning")
`MPIcc(SWIGATE ,0 ,"" ,0 ,2 ,"Flag for gate current: 0=off, 1=on, 2=on+overlaps-parameters")
`MPIcc(SWIMPACT ,0 ,"" ,0 ,1 ,"Flag for impact ionization current, 0=turn off II")
`MPIcc(SWGIDL ,0 ,"" ,0 ,1 ,"Flag for GIDL current, 0=turn off IGIDL")
`MPIcc(SWJUNCAP ,0 ,"" ,0 ,3 ,"Flag for juncap, 0=turn off juncap")
`MPIcc(SWJUNASYM ,0 ,"" ,0 ,1 ,"Flag for asymmetric junctions; 0=symmetric, 1=asymmetric")
`MPIcc(SWNUD ,0 ,"" ,0 ,2 ,"Flag for NUD-effect; 0=off, 1=on, 2=on+CV-correction")
`MPIcc(SWEDGE ,0 ,"" ,0 ,1 ,"Flag for drain current of edge transistors; 0=off, 1=on")
`MPIcc(SWDELVTAC ,0 ,"" ,0 ,1 ,"Flag for separate capacitance calculation; 0=off, 1=on")
`MPIcc(SWQSAT ,0 ,"" ,0 ,1 ,"Flag for separate capacitance calculation in saturation only: 0=off, 1=on")
`MPIcc(SWQPART ,0 ,"" ,0 ,1 ,"Flag for drain/source charge partitioning; 0=linear distribution, 1=source")
`MPIcc(SWIGN ,1 ,"" ,0 ,1 ,"Flag for induced gate noise; 0=off, 1=on")
`ifdef NQSmodel
`MPIcc(SWNQS ,0 ,"" ,0 ,9 ,"Flag for NQS, 0=off, 1, 2, 3, 5, or 9=number of collocation points")
`endif // NQSmodel
`MPRcz(QMC ,1.0 ,"" ,"Quantum-mechanical correction factor")
// --------------------------------------------------------------------------------------------------------------
// PSP local model parameters
// --------------------------------------------------------------------------------------------------------------
// Process parameters
`MPRnb(VFB ,-1.0 ,"V" ,"Flat band voltage at TR")
`MPRnb(STVFB ,5.0e-4 ,"V/K" ,"Temperature dependence of VFB")
`MPRnb(ST2VFB ,0.0 ,"K^-1" ,"Quadratic temperature dependence of VFB")
`MPRco(TOX ,2.0e-09 ,"m" ,1.0e-10 ,inf ,"Gate oxide thickness")
`MPRco(EPSROX ,3.9 ,"" ,1.0 ,inf ,"Relative permittivity of gate dielectric")
`MPRcc(NEFF ,5.0e23 ,"m^-3" ,1.0e20 ,1.0e26 ,"Effective substrate doping")
`MPRcz(FACNEFFAC ,1.0 ,"" ,"Pre-factor for effective substrate doping in separate charge calculation")
`MPRco(GFACNUD ,1.0 ,"" ,0.01 ,inf ,"Body-factor change due to NUD-effect")
`MPRcz(VSBNUD ,0.0 ,"V" ,"Lower Vsb value for NUD-effect")
`MPRco(DVSBNUD ,1.0 ,"V" ,0.1 ,inf ,"Vsb-range for NUD-effect")
`MPRnb(VNSUB ,0.0 ,"V" ,"Effective doping bias-dependence parameter")
`MPRco(NSLP ,0.05 ,"V" ,1.0e-3 ,inf ,"Effective doping bias-dependence parameter")
`MPRcc(DNSUB ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Effective doping bias-dependence parameter")
`MPRnb(DPHIB ,0.0 ,"V" ,"Offset parameter for PHIB")
`MPRnb(DELVTAC ,0.0 ,"V" ,"Offset parameter for PHIB in separate charge calculation")
`MPRcz(NP ,1.0e26 ,"m^-3" ,"Gate poly-silicon doping")
`MPRco(TOXOV ,2.0e-09 ,"m" ,1.0e-10 ,inf ,"Overlap oxide thickness")
`MPRco(TOXOVD ,2.0e-09 ,"m" ,1.0e-10 ,inf ,"Overlap oxide thickness for drain side")
`MPRcc(NOV ,5.0e25 ,"m^-3" ,1.0e23 ,1.0e27 ,"Effective doping of overlap region")
`MPRcc(NOVD ,5.0e25 ,"m^-3" ,1.0e23 ,1.0e27 ,"Effective doping of overlap region for drain side")
// Interface states parameters: PSP 103.6
`MPRcz(CT ,0.0 ,"" ,"Interface states factor")
`MPRcz(CTG ,0.0 ,"" ,"Gate voltage dependence of interface states factor")
`MPRnb(CTB ,0.0 ,"" ,"Bulk voltage dependence of interface states factor")
`MPRnb(STCT ,1.0 ,"" ,"Geometry-independent temperature dependence of CT")
// DIBL parameters
`MPRcz(CF ,0.0 ,"" ,"DIBL-parameter")
`MPRcz(CFAC ,0.0 ,"" ,"DIBL-parameter of charge model when SWQSAT=1")
`MPRcz(CFD ,0.0 ,"V^-1" ,"Drain voltage dependence of CF")
`MPRcc(CFB ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Back bias dependence of CF")
// Subthreshold slope parameters of short channel transistor
`MPRcz(PSCE ,0.0 ,"" ,"Subthreshold slope coefficient for short channel transistor")
`MPRcc(PSCEB ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of subthreshold slope coefficient for short channel transistor")
`MPRcz(PSCED ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of subthreshold slope coefficient for short channel transistor")
// Mobility parameters
`MPRcz(BETN ,7.0e-2 ,"m^2/V/s" ,"Channel aspect ratio times zero-field mobility")
`MPRnb(STBET ,1.0 ,"" ,"Temperature dependence of BETN")
`MPRcz(MUE ,0.5 ,"m/V" ,"Mobility reduction coefficient at TR")
`MPRnb(STMUE ,0.0 ,"" ,"Temperature dependence of MUE")
`MPRcz(THEMU ,1.5 ,"" ,"Mobility reduction exponent at TR")
`MPRnb(STTHEMU ,1.5 ,"" ,"Temperature dependence of THEMU")
`MPRcz(CS ,0.0 ,"" ,"Coulomb scattering parameter at TR")
`MPRnb(STCS ,0.0 ,"" ,"Temperature dependence of CS")
`MPRcz(THECS ,2.0 ,"" ,"Coulomb scattering exponent at TR")
`MPRnb(STTHECS ,0.0 ,"" ,"Temperature dependence of THECS")
`MPRcz(XCOR ,0.0 ,"V^-1" ,"Non-universality factor")
`MPRnb(STXCOR ,0.0 ,"" ,"Temperature dependence of XCOR")
`MPRcz(FETA ,1.0 ,"" ,"Effective field parameter")
// Series-resistance parameters (for resistance modeling as part of intrinsic mobility reduction)
`MPRcz(RS ,30.0 ,"Ohm" ,"Series resistance at TR")
`MPRnb(STRS ,1.0 ,"" ,"Temperature dependence of RS")
`MPRcc(RSB ,0.0 ,"V^-1" ,-0.5 ,1.0 ,"Back-bias dependence of series resistance")
`MPRco(RSG ,0.0 ,"V^-1" ,-0.5 ,inf ,"Gate-bias dependence of series resistance")
// Velocity saturation parameters
`MPRcz(THESAT ,1.0 ,"V^-1" ,"Velocity saturation parameter at TR")
`MPRcz(THESATAC ,1.0 ,"V^-1" ,"Velocity saturation parameter at TR of charge model when SWQSAT=1")
`MPRnb(STTHESAT ,1.0 ,"" ,"Temperature dependence of THESAT")
`MPRcc(THESATB ,0.0 ,"V^-1" ,-0.5 ,1.0 ,"Back-bias dependence of velocity saturation")
`MPRco(THESATG ,0.0 ,"V^-1" ,-0.5 ,inf ,"Gate-bias dependence of velocity saturation")
// Saturation voltage parameters
`MPRco(AX ,3.0 ,"" ,2.0 ,inf ,"Linear/saturation transition factor")
`MPRco(AXAC ,3.0 ,"" ,2.0 ,inf ,"Linear/saturation transition factor of charge model when SWQSAT=1")
// Channel length modulation (CLM) parameters
`MPRcz(ALP ,0.01 ,"" ,"CLM pre-factor")
`MPRcz(ALPAC ,0.01 ,"" ,"CLM pre-factor of charge model when SWQSAT=1")
`MPRcz(ALP1 ,0.0 ,"V" ,"CLM enhancement factor above threshold")
`MPRcz(ALP2 ,0.0 ,"V^-1" ,"CLM enhancement factor below threshold")
`MPRco(VP ,0.05 ,"V" ,1.0e-10 ,inf ,"CLM logarithm dependence factor")
// Impact ionization (II) parameters
`MPRcz(A1 ,1.0 ,"" ,"Impact-ionization pre-factor")
`MPRcz(A2 ,10.0 ,"V" ,"Impact-ionization exponent at TR")
`MPRnb(STA2 ,0.0 ,"V" ,"Temperature dependence of A2")
`MPRcz(A3 ,1.0 ,"" ,"Saturation-voltage dependence of impact-ionization")
`MPRcz(A4 ,0.0 ,"V^-0.5" ,"Back-bias dependence of impact-ionization")
// Gate current parameters
`MPRcc(GCO ,0.0 ,"" ,-10.0 ,10.0 ,"Gate tunnelling energy adjustment")
`MPRcz(IGINV ,0.0 ,"A" ,"Gate channel current pre-factor")
`MPRcz(IGOV ,0.0 ,"A" ,"Gate overlap current pre-factor")
`MPRcz(IGOVD ,0.0 ,"A" ,"Gate overlap current pre-factor for drain side")
`MPRnb(STIG ,2.0 ,"" ,"Temperature dependence of IGINV and IGOV")
`MPRcc(GC2 ,0.375 ,"" ,0.0 ,10.0 ,"Gate current slope factor")
`MPRcc(GC3 ,0.063 ,"" ,-2.0 ,2.0 ,"Gate current curvature factor")
`MPRcc(GC2OV ,0.375 ,"" ,0.0 ,10.0 ,"Gate overlap current slope factor, used only when SWIGATE=2")
`MPRcc(GC3OV ,0.063 ,"" ,-2.0 ,2.0 ,"Gate overlap current curvature factor, used only when SWIGATE=2")
`MPRco(CHIB ,3.1 ,"V" ,1.0 ,inf ,"Tunnelling barrier height")
// Gate Induced Drain/Source Leakage (GIDL) parameters
`MPRcz(AGIDL ,0.0 ,"A/V^3" ,"GIDL pre-factor")
`MPRcz(AGIDLD ,0.0 ,"A/V^3" ,"GIDL pre-factor for drain side")
`MPRcz(BGIDL ,41.0 ,"V" ,"GIDL probability factor at TR")
`MPRcz(BGIDLD ,41.0 ,"V" ,"GIDL probability factor at TR for drain side")
`MPRnb(STBGIDL ,0.0 ,"V/K" ,"Temperature dependence of BGIDL")
`MPRnb(STBGIDLD ,0.0 ,"V/K" ,"Temperature dependence of BGIDL for drain side")
`MPRnb(CGIDL ,0.0 ,"" ,"Back-bias dependence of GIDL")
`MPRnb(CGIDLD ,0.0 ,"" ,"Back-bias dependence of GIDL for drain side")
// Charge model parameters
`MPRcz(COX ,1.0e-14 ,"F" ,"Oxide capacitance for intrinsic channel")
`MPRcz(CGOV ,1.0e-15 ,"F" ,"Oxide capacitance for gate-drain/source overlap")
`MPRcz(CGOVD ,1.0e-15 ,"F" ,"Oxide capacitance for gate-drain overlap")
`MPRcz(CGBOV ,0.0 ,"F" ,"Oxide capacitance for gate-bulk overlap")
`MPRcz(CFR ,0.0 ,"F" ,"Outer fringe capacitance")
`MPRcz(CFRD ,0.0 ,"F" ,"Outer fringe capacitance for drain side")
// Noise parameters
`MPRcz(FNT ,1.0 ,"" ,"Thermal noise coefficient")
`MPRcz(FNTEXC ,0.0 ,"" ,"Excess noise coefficient")
`MPRcz(NFA ,8.0e22 ,"V^-1/m^4" ,"First coefficient of flicker noise")
`MPRcz(NFB ,3.0e07 ,"V^-1/m^2" ,"Second coefficient of flicker noise")
`MPRcz(NFC ,0.0 ,"V^-1" ,"Third coefficient of flicker noise")
`MPRcz(EF ,1.0 ,"" ,"Flicker noise frequency exponent")
// Edge transistor parameters: PSP 103.4
`MPRnb(VFBEDGE ,-1.0 ,"V" ,"Flat band voltage of edge transistors at TR")
`MPRnb(STVFBEDGE ,5.0e-4 ,"V/K" ,"Temperature dependence of VFBEDGE")
`MPRnb(DPHIBEDGE ,0.0 ,"V" ,"Offset parameter for PHIB of edge transistors")
`MPRcc(NEFFEDGE ,5.0e23 ,"m^-3" ,1.0e20 ,1.0e26 ,"Effective substrate doping of edge transistors")
`MPRcz(CTEDGE ,0.0 ,"" ,"Interface states factor of edge transistors")
`MPRcz(BETNEDGE ,5.0e-4 ,"m^2/V/s" ,"Channel aspect ratio times zero-field mobility of edge transistor")
`MPRnb(STBETEDGE ,1.0 ,"" ,"Temperature dependence of BETNEDGE")
`MPRcz(PSCEEDGE ,0.0 ,"" ,"Subthreshold slope coefficient for short channel edge transistors")
`MPRcc(PSCEBEDGE ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of subthreshold slope coefficient for short channel edge transistors")
`MPRcz(PSCEDEDGE ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of subthreshold slope coefficient for short channel edge transistors")
`MPRcz(CFEDGE ,0.0 ,"" ,"DIBL parameter of edge transistors")
`MPRcz(CFDEDGE ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of DIBL-parameter of edge transistors")
`MPRcc(CFBEDGE ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of DIBL-parameter of edge transistors")
`MPRcz(FNTEDGE ,1.0 ,"" ,"Thermal noise coefficient of edge transistors")
`MPRcz(NFAEDGE ,8.0e22 ,"V^-1/m^4" ,"First coefficient of flicker noise of edge transistors")
`MPRcz(NFBEDGE ,3.0e07 ,"V^-1/m^2" ,"Second coefficient of flicker noise of edge transistors")
`MPRcz(NFCEDGE ,0.0 ,"V^-1" ,"Third coefficient of flicker noise of edge transistors")
`MPRcz(EFEDGE ,1.0 ,"" ,"Flicker noise frequency exponent of edge transistors")
// NQS parameters
`ifdef NQSmodel
`MPRcz(MUNQS ,1.0 ,"" ,"Relative mobility for NQS modelling")
`endif // NQSmodel
// Parasitic resistance parameters
`MPRcz(RG ,0.0 ,"Ohm" ,"Gate resistance")
`MPRcz(RSE ,0.0 ,"Ohm" ,"External source resistance")
`MPRcz(RDE ,0.0 ,"Ohm" ,"External drain resistance")
`MPRcz(RBULK ,0.0 ,"Ohm" ,"Bulk resistance between node BP and BI")
`MPRcz(RWELL ,0.0 ,"Ohm" ,"Well resistance between node BI and B")
`MPRcz(RJUNS ,0.0 ,"Ohm" ,"Source-side bulk resistance between node BI and BS")
`MPRcz(RJUND ,0.0 ,"Ohm" ,"Drain-side bulk resistance between node BI and BD")
// Self heating effect parameters
`ifdef SelfHeating
`MPRcz(RTH ,0.0 ,"K/W" ,"Thermal resistance")
`MPRcz(CTH ,0.0 ,"J/K" ,"Thermal capacitance")
`MPRnb(STRTH ,0.0 ,"" ,"Temperature sensitivity of RTH")
`endif // SelfHeating
// --------------------------------------------------------------------------------------------------------------
// PSP global model parameters
// --------------------------------------------------------------------------------------------------------------
// Process Parameters
`MPRnb(LVARO ,0.0 ,"m" ,"Geom. independent difference between actual and programmed gate length")
`MPRnb(LVARL ,0.0 ,"" ,"Length dependence of LVAR")
`MPRnb(LVARW ,0.0 ,"" ,"Width dependence of LVAR")
`MPRnb(LAP ,0.0 ,"m" ,"Effective channel length reduction per side")
`MPRnb(WVARO ,0.0 ,"m" ,"Geom. independent difference between actual and programmed field-oxide opening")
`MPRnb(WVARL ,0.0 ,"" ,"Length dependence of WVAR")
`MPRnb(WVARW ,0.0 ,"" ,"Width dependence of WVAR")
`MPRnb(WOT ,0.0 ,"m" ,"Effective channel width reduction per side")
`MPRnb(DLQ ,0.0 ,"m" ,"Effective channel length reduction for CV")
`MPRnb(DWQ ,0.0 ,"m" ,"Effective channel width reduction for CV")
`MPRnb(VFBO ,-1.0 ,"V" ,"Geometry-independent flat-band voltage at TR")
`MPRnb(VFBL ,0.0 ,"V" ,"Length dependence of flat-band voltage")
`MPRnb(VFBW ,0.0 ,"V" ,"Width dependence of flat-band voltage")
`MPRnb(VFBLW ,0.0 ,"V" ,"Area dependence of flat-band voltage")
`MPRnb(STVFBO ,5.0e-4 ,"V/K" ,"Geometry-independent temperature dependence of VFB")
`MPRnb(STVFBL ,0.0 ,"V/K" ,"Length dependence of temperature dependence of VFB")
`MPRnb(STVFBW ,0.0 ,"V/K" ,"Width dependence of temperature dependence of VFB")
`MPRnb(STVFBLW ,0.0 ,"V/K" ,"Area dependence of temperature dependence of VFB")
`MPRnb(ST2VFBO ,0.0 ,"K^-1" ,"Quadratic temperature dependence of VFB")
`MPRco(TOXO ,2.0e-9 ,"m" ,1.0e-10 ,inf ,"Gate oxide thickness")
`MPRco(EPSROXO ,3.9 ,"" ,1.0 ,inf ,"Relative permittivity of gate dielectric")
`MPRco(NSUBO ,3.0e23 ,"m^-3" ,1.0e20 ,inf ,"Geometry independent substrate doping")
`MPRnb(NSUBW ,0.0 ,"" ,"Width dependence of background doping NSUBO due to segregation")
`MPRco(WSEG ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Char. length of segregation of background doping NSUBO")
`MPRcz(NPCK ,1.0e24 ,"m^-3" ,"Pocket doping level")
`MPRnb(NPCKW ,0.0 ,"" ,"Width dependence of pocket doping NPCK due to segregation")
`MPRco(WSEGP ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Char. length of segregation of pocket doping NPCK")
`MPRco(LPCK ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Char. length of lateral doping profile")
`MPRnb(LPCKW ,0.0 ,"" ,"Width dependence of char. length of lateral doping profile")
`MPRnb(FOL1 ,0.0 ,"" ,"First length dependence coefficient for short channel body effect")
`MPRnb(FOL2 ,0.0 ,"" ,"Second length dependence coefficient for short channel body effect")
`MPRnb(FACNEFFACO ,1.0 ,"" ,"Geom. independent pre-factor for effective substrate doping in separate charge calculation")
`MPRnb(FACNEFFACL ,0.0 ,"" ,"Length dependence of FACNEFFAC")
`MPRnb(FACNEFFACW ,0.0 ,"" ,"Width dependence of FACNEFFAC")
`MPRnb(FACNEFFACLW ,0.0 ,"" ,"Area dependence of FACNEFFAC")
`MPRnb(GFACNUDO ,1.0 ,"" ,"Geom. independent body-factor change due to NUD-effect")
`MPRnb(GFACNUDL ,0.0 ,"" ,"Length dependence of GFACNUD")
`MPRnb(GFACNUDLEXP ,1.0 ,"" ,"Exponent for length dependence of GFACNUD")
`MPRnb(GFACNUDW ,0.0 ,"" ,"Width dependence of GFACNUD")
`MPRnb(GFACNUDLW ,0.0 ,"" ,"Area dependence of GFACNUD")
`MPRnb(VSBNUDO ,0.0 ,"V" ,"Lower Vsb value for NUD-effect")
`MPRnb(DVSBNUDO ,1.0 ,"V" ,"Vsb range for NUD-effect")
`MPRnb(VNSUBO ,0.0 ,"V" ,"Effective doping bias-dependence parameter")
`MPRnb(NSLPO ,0.05 ,"V" ,"Effective doping bias-dependence parameter")
`MPRnb(DNSUBO ,0.0 ,"V^-1" ,"Effective doping bias-dependence parameter")
`MPRnb(DPHIBO ,0.0 ,"V" ,"Geometry independent offset of PHIB")
`MPRnb(DPHIBL ,0.0 ,"V" ,"Length dependence offset of PHIB")
`MPRnb(DPHIBLEXP ,1.0 ,"" ,"Exponent for length dependence of offset of PHIB")
`MPRnb(DPHIBW ,0.0 ,"V" ,"Width dependence of offset of PHIB")
`MPRnb(DPHIBLW ,0.0 ,"V" ,"Area dependence of offset of PHIB")
`MPRnb(DELVTACO ,0.0 ,"V" ,"Geom. independent offset parameter for PHIB in separate charge calculation")
`MPRnb(DELVTACL ,0.0 ,"V" ,"Length dependence of DELVTAC")
`MPRnb(DELVTACLEXP ,1.0 ,"" ,"Exponent for length dependence of offset of DELVTAC")
`MPRnb(DELVTACW ,0.0 ,"V" ,"Width dependence of DELVTAC")
`MPRnb(DELVTACLW ,0.0 ,"V" ,"Area dependence of DELVTAC")
`MPRnb(NPO ,1.0e26 ,"m^-3" ,"Geometry-independent gate poly-silicon doping")
`MPRnb(NPL ,0.0 ,"" ,"Length dependence of gate poly-silicon doping")
`MPRco(TOXOVO ,2.0e-9 ,"m" ,1.0e-10 ,inf ,"Overlap oxide thickness")
`MPRco(TOXOVDO ,2.0e-9 ,"m" ,1.0e-10 ,inf ,"Overlap oxide thickness for drain side")
`MPRcz(LOV ,0.0 ,"m" ,"Overlap length for gate/drain and gate/source overlap capacitance")
`MPRcz(LOVD ,0.0 ,"m" ,"Overlap length for gate/drain overlap capacitance")
`MPRnb(NOVO ,5.0e25 ,"m^-3" ,"Effective doping of overlap region")
`MPRnb(NOVDO ,5.0e25 ,"m^-3" ,"Effective doping of overlap region for drain side")
// Interface states parameters: PSP 103.6
`MPRnb(CTO ,0.0 ,"" ,"Geometry-independent interface states factor")
`MPRnb(CTL ,0.0 ,"" ,"Length dependence of interface states factor")
`MPRnb(CTLEXP ,1.0 ,"" ,"Exponent for length dependence of interface states factor")
`MPRnb(CTW ,0.0 ,"" ,"Width dependence of interface states factor")
`MPRnb(CTLW ,0.0 ,"" ,"Area dependence of interface states factor")
`MPRcz(CTGO ,0.0 ,"" ,"Gate voltage dependence of interface states factor")
`MPRnb(CTBO ,0.0 ,"" ,"Bulk voltage dependence of interface states factor")
`MPRnb(STCTO ,1.0 ,"" ,"Geometry-independent temperature dependence of CT")
// DIBL Parameters
`MPRnb(CFL ,0.0 ,"" ,"Length dependence of DIBL-parameter")
`MPRnb(CFLEXP ,2.0 ,"" ,"Exponent for length dependence of CF")
`MPRnb(CFW ,0.0 ,"" ,"Width dependence of CF")
`MPRnb(CFACL ,0.0 ,"" ,"Length dependence of DIBL-parameter of charge model when SWQSAT=1")
`MPRnb(CFACLEXP ,2.0 ,"" ,"Exponent for length dependence of CF")
`MPRnb(CFACW ,0.0 ,"" ,"Width dependence of CF")
`MPRcz(CFDO ,0.0 ,"V^-1" ,"Drain voltage dependence of CF")
`MPRnb(CFBO ,0.0 ,"V^-1" ,"Back-bias dependence of CF")
// Subthreshold slope parameters of short channel transistor
`MPRnb(PSCEL ,0.0 ,"" ,"Length dependence of subthreshold slope coefficient for short channel transistor")
`MPRnb(PSCELEXP ,2.0 ,"" ,"Exponent for length dependence of subthreshold slope coefficient for short channel transistor")
`MPRnb(PSCEW ,0.0 ,"" ,"Exponent for length dependence of subthreshold slope coefficient for short channel transistor")
`MPRcc(PSCEBO ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of subthreshold slope coefficient for short channel transistor")
`MPRcz(PSCEDO ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of subthreshold slope coefficient for short channel transistor")
// Mobility Parameters
`MPRcz(UO ,5.0e-2 ,"m^2/V/s" ,"Zero-field mobility at TR")
`MPRnb(FBET1 ,0.0 ,"" ,"Relative mobility decrease due to first lateral profile")
`MPRnb(FBET1W ,0.0 ,"" ,"Width dependence of relative mobility decrease due to first lateral profile")
`MPRco(LP1 ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Mobility-related characteristic length of first lateral profile")
`MPRnb(LP1W ,0.0 ,"" ,"Width dependence of mobility-related characteristic length of first lateral profile")
`MPRnb(FBET2 ,0.0 ,"" ,"Relative mobility decrease due to second lateral profile")
`MPRco(LP2 ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Mobility-related characteristic length of second lateral profile")
`MPRnb(BETW1 ,0.0 ,"" ,"First higher-order width scaling coefficient of BETN")
`MPRnb(BETW2 ,0.0 ,"" ,"Second higher-order width scaling coefficient of BETN")
`MPRco(WBET ,1.0e-9 ,"m" ,1.0e-10 ,inf ,"Characteristic width for width scaling of BETN")
`MPRnb(STBETO ,1.0 ,"" ,"Geometry independent temperature dependence of BETN")
`MPRnb(STBETL ,0.0 ,"" ,"Length dependence of temperature dependence of BETN")
`MPRnb(STBETW ,0.0 ,"" ,"Width dependence of temperature dependence of BETN")
`MPRnb(STBETLW ,0.0 ,"" ,"Area dependence of temperature dependence of BETN")
`MPRnb(MUEO ,0.5 ,"m/V" ,"Geometry independent mobility reduction coefficient at TR")
`MPRnb(MUEW ,0.0 ,"" ,"Width dependence of mobility reduction coefficient at TR")
`MPRnb(STMUEO ,0.0 ,"" ,"Temperature dependence of MUE")
`MPRnb(THEMUO ,1.5 ,"" ,"Mobility reduction exponent at TR")
`MPRnb(STTHEMUO ,1.5 ,"" ,"Temperature dependence of THEMU")
`MPRnb(CSO ,0.0 ,"" ,"Geometry independent coulomb scattering parameter at TR")
`MPRnb(CSL ,0.0 ,"" ,"Length dependence of CS")
`MPRnb(CSLEXP ,1.0 ,"" ,"Exponent for length dependence of CS")
`MPRnb(CSW ,0.0 ,"" ,"Width dependence of CS")
`MPRnb(CSLW ,0.0 ,"" ,"Area dependence of CS")
`MPRnb(STCSO ,0.0 ,"" ,"Temperature dependence of CS")
`MPRcz(THECSO ,2.0 ,"" ,"Coulomb scattering exponent at TR")
`MPRnb(STTHECSO ,0.0 ,"" ,"Temperature dependence of THECS")
`MPRnb(XCORO ,0.0 ,"V^-1" ,"Geometry independent non-universality parameter")
`MPRnb(XCORL ,0.0 ,"" ,"Length dependence of non-universality parameter")
`MPRnb(XCORW ,0.0 ,"" ,"Width dependence of non-universality parameter")
`MPRnb(XCORLW ,0.0 ,"" ,"Area dependence of non-universality parameter")
`MPRnb(STXCORO ,0.0 ,"" ,"Temperature dependence of XCOR")
`MPRnb(FETAO ,1.0 ,"" ,"Effective field parameter")
// Series Resistance
`MPRnb(RSW1 ,50.0 ,"Ohm" ,"Source/drain series resistance for 1 um wide channel at TR")
`MPRnb(RSW2 ,0.0 ,"" ,"Higher-order width scaling of RS")
`MPRnb(STRSO ,1.0 ,"" ,"Temperature dependence of RS")
`MPRnb(RSBO ,0.0 ,"V^-1" ,"Back-bias dependence of series resistance")
`MPRnb(RSGO ,0.0 ,"V^-1" ,"Gate-bias dependence of series resistance")
// Velocity Saturation
`MPRnb(THESATO ,0.0 ,"V^-1" ,"Geometry independent velocity saturation parameter at TR")
`MPRnb(THESATL ,0.05 ,"V^-1" ,"Length dependence of THESAT")
`MPRnb(THESATLEXP ,1.0 ,"" ,"Exponent for length dependence of THESAT")
`MPRnb(THESATW ,0.0 ,"" ,"Width dependence of THESAT")
`MPRnb(THESATLW ,0.0 ,"" ,"Area dependence of THESAT")
`MPRnb(THESATACO ,0.0 ,"V^-1" ,"Geometry independent velocity saturation parameter at TR of charge model when SWQSAT=1")
`MPRnb(THESATACL ,0.05 ,"V^-1" ,"Length dependence of THESATAC")
`MPRnb(THESATACLEXP ,1.0 ,"" ,"Exponent for length dependence of THESATAC")
`MPRnb(THESATACW ,0.0 ,"" ,"Width dependence of THESATAC")
`MPRnb(THESATACLW ,0.0 ,"" ,"Area dependence of THESATAC")
`MPRnb(STTHESATO ,1.0 ,"" ,"Geometry independent temperature dependence of THESAT")
`MPRnb(STTHESATL ,0.0 ,"" ,"Length dependence of temperature dependence of THESAT")
`MPRnb(STTHESATW ,0.0 ,"" ,"Width dependence of temperature dependence of THESAT")
`MPRnb(STTHESATLW ,0.0 ,"" ,"Area dependence of temperature dependence of THESAT")
`MPRnb(THESATBO ,0.0 ,"V^-1" ,"Back-bias dependence of velocity saturation")
`MPRnb(THESATGO ,0.0 ,"V^-1" ,"Gate-bias dependence of velocity saturation")
// Saturation Voltage
`MPRnb(AXO ,18.0 ,"" ,"Geometry independent linear/saturation transition factor")
`MPRcz(AXL ,0.4 ,"" ,"Length dependence of AX")
`MPRnb(AXACO ,18.0 ,"" ,"Geometry independent linear/saturation transition factor of charge model when SWQSAT=1")
`MPRcz(AXACL ,0.4 ,"" ,"Length dependence of AXAC")
// Channel Length Modulation
`MPRnb(ALPL ,5.0e-4 ,"" ,"Length dependence of ALP")
`MPRnb(ALPLEXP ,1.0 ,"" ,"Exponent for length dependence of ALP")
`MPRnb(ALPW ,0.0 ,"" ,"Width dependence of ALP")
`MPRnb(ALPACL ,5.0e-4 ,"" ,"Length dependence of ALPAC")
`MPRnb(ALPACLEXP ,1.0 ,"" ,"Exponent for length dependence of ALPAC")
`MPRnb(ALPACW ,0.0 ,"" ,"Width dependence of ALPAC")
`MPRnb(ALP1L1 ,0.0 ,"V" ,"Length dependence of CLM enhancement factor above threshold")
`MPRnb(ALP1LEXP ,0.5 ,"" ,"Exponent for length dependence of ALP1")
`MPRcz(ALP1L2 ,0.0 ,"" ,"Second_order length dependence of ALP1")
`MPRnb(ALP1W ,0.0 ,"" ,"Width dependence of ALP1")
`MPRnb(ALP2L1 ,0.0 ,"V^-1" ,"Length dependence of CLM enhancement factor below threshold")
`MPRnb(ALP2LEXP ,0.5 ,"" ,"Exponent for length dependence of ALP2")
`MPRcz(ALP2L2 ,0.0 ,"" ,"Second_order length dependence of ALP2")
`MPRnb(ALP2W ,0.0 ,"" ,"Width dependence of ALP2")
`MPRnb(VPO ,0.05 ,"V" ,"CLM logarithmic dependence parameter")
// Weak-avalanche parameters
`MPRnb(A1O ,1.0 ,"" ,"Geometry independent impact-ionization pre-factor")
`MPRnb(A1L ,0.0 ,"" ,"Length dependence of A1")
`MPRnb(A1W ,0.0 ,"" ,"Width dependence of A1")
`MPRnb(A2O ,10.0 ,"V" ,"Impact-ionization exponent at TR")
`MPRnb(STA2O ,0.0 ,"V" ,"Temperature dependence of A2")
`MPRnb(A3O ,1.0 ,"" ,"Geometry independent saturation-voltage dependence of II")
`MPRnb(A3L ,0.0 ,"" ,"Length dependence of A3")
`MPRnb(A3W ,0.0 ,"" ,"Width dependence of A3")
`MPRnb(A4O ,0.0 ,"V^-0.5" ,"Geometry independent back-bias dependence of II")
`MPRnb(A4L ,0.0 ,"" ,"Length dependence of A4")
`MPRnb(A4W ,0.0 ,"" ,"Width dependence of A4")
// Gate current parameters
`MPRnb(GCOO ,0.0 ,"" ,"Gate tunnelling energy adjustment")
`MPRnb(IGINVLW ,0.0 ,"A" ,"Gate channel current pre-factor for 1 um^2 channel area")
`MPRnb(IGOVW ,0.0 ,"A" ,"Gate overlap current pre-factor for 1 um wide channel")
`MPRnb(IGOVDW ,0.0 ,"A" ,"Gate overlap current pre-factor for 1 um wide channel for drain side")
`MPRnb(STIGO ,2.0 ,"" ,"Temperature dependence of IGINV and IGOV")
`MPRnb(GC2O ,0.375 ,"" ,"Gate current slope factor")
`MPRnb(GC3O ,0.063 ,"" ,"Gate current curvature factor")
`MPRnb(GC2OVO ,0.375 ,"" ,"Gate overlap current slope factor, used only when SWIGATE=2")
`MPRnb(GC3OVO ,0.063 ,"" ,"Gate overlap current curvature factor, used only when SWIGATE=2")
`MPRnb(CHIBO ,3.1 ,"V" ,"Tunnelling barrier height")
// Gate-induced drain leakage parameters
`MPRnb(AGIDLW ,0.0 ,"A/V^3" ,"Width dependence of GIDL pre-factor")
`MPRnb(AGIDLDW ,0.0 ,"A/V^3" ,"Width dependence of GIDL pre-factor for drain side")
`MPRnb(BGIDLO ,41.0 ,"V" ,"GIDL probability factor at TR")
`MPRnb(BGIDLDO ,41.0 ,"V" ,"GIDL probability factor at TR for drain side")
`MPRnb(STBGIDLO ,0.0 ,"V/K" ,"Temperature dependence of BGIDL")
`MPRnb(STBGIDLDO ,0.0 ,"V/K" ,"Temperature dependence of BGIDL for drain side")
`MPRnb(CGIDLO ,0.0 ,"" ,"Back-bias dependence of GIDL")
`MPRnb(CGIDLDO ,0.0 ,"" ,"Back-bias dependence of GIDL for drain side")
// Charge Model Parameters
`MPRnb(CGBOVL ,0.0 ,"F" ,"Oxide capacitance for gate-bulk overlap for 1 um long channel")
`MPRnb(CFRW ,0.0 ,"F" ,"Outer fringe capacitance for 1 um wide channel")
`MPRnb(CFRDW ,0.0 ,"F" ,"Outer fringe capacitance for 1 um wide channel for drain side")
// Noise Model Parameters
`MPRnb(FNTO ,1.0 ,"" ,"Thermal noise coefficient")
`MPRcz(FNTEXCL ,0.0 ,"" ,"Length dependence coefficient of excess noise")
`MPRnb(NFALW ,8.0e22 ,"V^-1/m^4" ,"First coefficient of flicker noise for 1 um^2 channel area")
`MPRnb(NFBLW ,3.0e7 ,"V^-1/m^2" ,"Second coefficient of flicker noise for 1 um^2 channel area")
`MPRnb(NFCLW ,0.0 ,"V^-1" ,"Third coefficient of flicker noise for 1 um^2 channel area")
`MPRnb(EFO ,1.0 ,"" ,"Flicker noise frequency exponent")
`MPRnb(LINTNOI ,0.0 ,"m" ,"Length offset for flicker noise")
`MPRnb(ALPNOI ,2.0 ,"" ,"Exponent for length offset for flicker noise")
// Edge transistor parameters: PSP 103.4
`MPRcz(WEDGE ,1.0e-8 ,"m" ,"Electrical width of edge transistor per side")
`MPRcz(WEDGEW ,0.0 ,"" ,"Width dependence of edge WEDGE")
`MPRnb(VFBEDGEO ,-1.0 ,"V" ,"Geometry-independent flat-band voltage of edge transistors at TR")
`MPRnb(STVFBEDGEO ,5.0e-4 ,"V/K" ,"Geometry-independent temperature dependence of VFBEDGE")
`MPRnb(STVFBEDGEL ,0.0 ,"V/K" ,"Length dependence of temperature dependence of VFBEDGE")
`MPRnb(STVFBEDGEW ,0.0 ,"V/K" ,"Width dependence of temperature dependence of VFBEDGE")
`MPRnb(STVFBEDGELW ,0.0 ,"V/K" ,"Area dependence of temperature dependence of VFBEDGE")
`MPRnb(DPHIBEDGEO ,0.0 ,"V" ,"Geometry independent of edge transistor PHIB offset")
`MPRnb(DPHIBEDGEL ,0.0 ,"V" ,"Length dependence of edge transistor PHIB offset")
`MPRnb(DPHIBEDGELEXP ,1.0 ,"" ,"Exponent for length dependence of edge transistor PHIB offset")
`MPRnb(DPHIBEDGEW ,0.0 ,"V" ,"Width dependence of edge transistor PHIB offset")
`MPRnb(DPHIBEDGELW ,0.0 ,"V" ,"Area dependence of edge transistor PHIB offset")
`MPRco(NSUBEDGEO ,5.0e23 ,"m^-3" ,1.0e20 ,inf ,"Geometry independent substrate doping of edge transistors")
`MPRnb(NSUBEDGEL ,0.0 ,"" ,"Length dependence of edge transistor substrate doping")
`MPRnb(NSUBEDGELEXP ,1.0 ,"" ,"Exponent for length dependence of edge transistor substrate doping")
`MPRnb(NSUBEDGEW ,0.0 ,"" ,"Width dependence of edge transistor substrate doping")
`MPRnb(NSUBEDGELW ,0.0 ,"" ,"Area dependence of edge transistor substrate doping")
`MPRnb(CTEDGEO ,0.0 ,"" ,"Geometry-independent interface states factor of edge transistors")
`MPRnb(CTEDGEL ,0.0 ,"" ,"Length dependence of interface states factor of edge transistors")
`MPRnb(CTEDGELEXP ,1.0 ,"" ,"Exponent for length dependence of interface states factor of edge transistors")
`MPRnb(FBETEDGE ,0.0 ,"" ,"Length dependence of edge transistor mobility")
`MPRco(LPEDGE ,1.0e-8 ,"m" ,1.0e-10 ,inf ,"Exponent for length dependence of edge transistor mobility")
`MPRnb(BETEDGEW ,0.0 ,"" ,"Width scaling coefficient of edge transistor mobility")
`MPRnb(STBETEDGEO ,1.0 ,"" ,"Geometry independent temperature dependence of BETNEDGE")
`MPRnb(STBETEDGEL ,0.0 ,"" ,"Length dependence of temperature dependence of BETNEDGE")
`MPRnb(STBETEDGEW ,0.0 ,"" ,"Width dependence of temperature dependence of BETNEDGE")
`MPRnb(STBETEDGELW ,0.0 ,"" ,"Area dependence of temperature dependence of BETNEDGE")
`MPRnb(PSCEEDGEL ,0.0 ,"" ,"Length dependence of subthreshold slope coefficient for short channel edge transistors")
`MPRnb(PSCEEDGELEXP ,2.0 ,"" ,"Exponent for length dependence of subthreshold slope coefficient for short channel edge transistors")
`MPRnb(PSCEEDGEW ,0.0 ,"" ,"Exponent for length dependence of subthreshold slope coefficient for short channel edge transistor")
`MPRcc(PSCEBEDGEO ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of subthreshold slope coefficient for short channel edge transistors")
`MPRcz(PSCEDEDGEO ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of subthreshold slope coefficient for short channel edge transistors")
`MPRnb(CFEDGEL ,0.0 ,"" ,"Length dependence of DIBL-parameter of edge transistors")
`MPRnb(CFEDGELEXP ,2.0 ,"" ,"Exponent for length dependence of DIBL-parameter of edge transistors")
`MPRnb(CFEDGEW ,0.0 ,"" ,"Width dependence of DIBL-parameter of edge transistors")
`MPRcz(CFDEDGEO ,0.0 ,"V^-1" ,"Drain voltage dependence parameter of DIBL-parameter of edge transistors")
`MPRcc(CFBEDGEO ,0.0 ,"V^-1" ,0.0 ,1.0 ,"Bulk voltage dependence parameter of DIBL-parameter of edge transistors")
`MPRnb(FNTEDGEO ,1.0 ,"" ,"Thermal noise coefficient")
`MPRnb(NFAEDGELW ,8.0e22 ,"V^-1/m^4" ,"First coefficient of flicker noise for 1 um^2 channel area")
`MPRnb(NFBEDGELW ,3.0e7 ,"V^-1/m^2" ,"Second coefficient of flicker noise for 1 um^2 channel area")
`MPRnb(NFCEDGELW ,0.0 ,"V^-1" ,"Third coefficient of flicker noise for 1 um^2 channel area")
`MPRnb(EFEDGEO ,1.0 ,"" ,"Flicker noise frequency exponent")
// Well proximity effect Parameters
`MPRnb(KVTHOWEO ,0.0 ,"" ,"Geometrical independent threshold shift parameter")
`MPRnb(KVTHOWEL ,0.0 ,"" ,"Length dependent threshold shift parameter")
`MPRnb(KVTHOWEW ,0.0 ,"" ,"Width dependent threshold shift parameter")
`MPRnb(KVTHOWELW ,0.0 ,"" ,"Area dependent threshold shift parameter")
`MPRnb(KUOWEO ,0.0 ,"" ,"Geometrical independent mobility degradation factor")
`MPRnb(KUOWEL ,0.0 ,"" ,"Length dependent mobility degradation factor")
`MPRnb(KUOWEW ,0.0 ,"" ,"Width dependent mobility degradation factor")
`MPRnb(KUOWELW ,0.0 ,"" ,"Area dependent mobility degradation factor")
// --------------------------------------------------------------------------------------------------------------
// PSP global model parameters (binning)
// --------------------------------------------------------------------------------------------------------------
// Process parameters
`MPRnb(POVFB ,-1.0 ,"V" ,"Coefficient for the geometry independent part of VFB")
`MPRnb(PLVFB ,0.0 ,"V" ,"Coefficient for the length dependence of VFB")
`MPRnb(PWVFB ,0.0 ,"V" ,"Coefficient for the width dependence of VFB")
`MPRnb(PLWVFB ,0.0 ,"V" ,"Coefficient for the length times width dependence of VFB")
`MPRnb(POSTVFB ,5.0e-4 ,"V/K" ,"Coefficient for the geometry independent part of STVFB")
`MPRnb(PLSTVFB ,0.0 ,"V/K" ,"Coefficient for the length dependence of STVFB")
`MPRnb(PWSTVFB ,0.0 ,"V/K" ,"Coefficient for the width dependence of STVFB")
`MPRnb(PLWSTVFB ,0.0 ,"V/K" ,"Coefficient for the length times width dependence of STVFB")
`MPRnb(POST2VFB ,0.0 ,"K^-1" ,"Coefficient for the geometry independent part of ST2VFB")
`MPRnb(POTOX ,2.0e-9 ,"m" ,"Coefficient for the geometry independent part of TOX")
`MPRnb(POEPSROX ,3.9 ,"" ,"Coefficient for the geometry independent part of EPSOX")
`MPRnb(PONEFF ,5.0e23 ,"m^-3" ,"Coefficient for the geometry independent part of NEFF")
`MPRnb(PLNEFF ,0.0 ,"m^-3" ,"Coefficient for the length dependence of NEFF")
`MPRnb(PWNEFF ,0.0 ,"m^-3" ,"Coefficient for the width dependence of NEFF")
`MPRnb(PLWNEFF ,0.0 ,"m^-3" ,"Coefficient for the length times width dependence of NEFF")
`MPRnb(POFACNEFFAC ,1.0 ,"" ,"Coefficient for the geometry independent part of FACNEFFAC")
`MPRnb(PLFACNEFFAC ,0.0 ,"" ,"Coefficient for the length dependence of FACNEFFAC")
`MPRnb(PWFACNEFFAC ,0.0 ,"" ,"Coefficient for the width dependence of FACNEFFAC")
`MPRnb(PLWFACNEFFAC ,0.0 ,"" ,"Coefficient for the length times width dependence of FACNEFFAC")
`MPRnb(POGFACNUD ,1.0 ,"" ,"Coefficient for the geometry independent part of GFACNUD")
`MPRnb(PLGFACNUD ,0.0 ,"" ,"Coefficient for the length dependence of GFACNUD")
`MPRnb(PWGFACNUD ,0.0 ,"" ,"Coefficient for the width dependence of GFACNUD")
`MPRnb(PLWGFACNUD ,0.0 ,"" ,"Coefficient for the length times width dependence of GFACNUD")
`MPRnb(POVSBNUD ,0.0 ,"V" ,"Coefficient for the geometry independent part of VSBNUD")
`MPRnb(PODVSBNUD ,1.0 ,"V" ,"Coefficient for the geometry independent part of DVSBNUD")
`MPRnb(POVNSUB ,0.0 ,"V" ,"Coefficient for the geometry independent part of VNSUB")
`MPRnb(PONSLP ,0.05 ,"V" ,"Coefficient for the geometry independent part of NSLP")
`MPRnb(PODNSUB ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of DNSUB")
`MPRnb(PODPHIB ,0.0 ,"V" ,"Coefficient for the geometry independent part of DPHIB")
`MPRnb(PLDPHIB ,0.0 ,"V" ,"Coefficient for the length dependence of DPHIB")
`MPRnb(PWDPHIB ,0.0 ,"V" ,"Coefficient for the width dependence of DPHIB")
`MPRnb(PLWDPHIB ,0.0 ,"V" ,"Coefficient for the length times width dependence of DPHIB")
`MPRnb(PODELVTAC ,0.0 ,"V" ,"Coefficient for the geometry independent part of DELVTAC")
`MPRnb(PLDELVTAC ,0.0 ,"V" ,"Coefficient for the length dependence of DELVTAC")
`MPRnb(PWDELVTAC ,0.0 ,"V" ,"Coefficient for the width dependence of DELVTAC")
`MPRnb(PLWDELVTAC ,0.0 ,"V" ,"Coefficient for the length times width dependence of DELVTAC")
`MPRnb(PONP ,1.0e26 ,"m^-3" ,"Coefficient for the geometry independent part of NP")
`MPRnb(PLNP ,0.0 ,"m^-3" ,"Coefficient for the length dependence of NP")
`MPRnb(PWNP ,0.0 ,"m^-3" ,"Coefficient for the width dependence of NP")
`MPRnb(PLWNP ,0.0 ,"m^-3" ,"Coefficient for the length times width dependence of NP")
`MPRnb(POTOXOV ,2.0e-09 ,"m" ,"Coefficient for the geometry independent part of TOXOV")
`MPRnb(POTOXOVD ,2.0e-09 ,"m" ,"Coefficient for the geometry independent part of TOXOV for drain side")
`MPRnb(PONOV ,5.0e25 ,"m^-3" ,"Coefficient for the geometry independent part of NOV")
`MPRnb(PLNOV ,0.0 ,"m^-3" ,"Coefficient for the length dependence of NOV")
`MPRnb(PWNOV ,0.0 ,"m^-3" ,"Coefficient for the width dependence of NOV")
`MPRnb(PLWNOV ,0.0 ,"m^-3" ,"Coefficient for the length times width dependence of NOV")
`MPRnb(PONOVD ,5.0e25 ,"m^-3" ,"Coefficient for the geometry independent part of NOV for drain side")
`MPRnb(PLNOVD ,0.0 ,"m^-3" ,"Coefficient for the length dependence of NOV for drain side")
`MPRnb(PWNOVD ,0.0 ,"m^-3" ,"Coefficient for the width dependence of NOV for drain side")
`MPRnb(PLWNOVD ,0.0 ,"m^-3" ,"Coefficient for the length times width dependence of NOV for drain side")
// Interface states parameters
`MPRnb(POCT ,0.0 ,"" ,"Coefficient for the geometry independent part of CT")
`MPRnb(PLCT ,0.0 ,"" ,"Coefficient for the length dependence of CT")
`MPRnb(PWCT ,0.0 ,"" ,"Coefficient for the width dependence of CT")
`MPRnb(PLWCT ,0.0 ,"" ,"Coefficient for the length times width dependence of CT")
`MPRnb(POCTG ,0.0 ,"" ,"Coefficient for the geometry independent part of CTG")
`MPRnb(POCTB ,0.0 ,"" ,"Coefficient for the geometry independent part of CTB")
`MPRnb(POSTCT ,1.0 ,"" ,"Coefficient for the geometry independent part of STCT")
// DIBL parameters
`MPRnb(POCF ,0.0 ,"" ,"Coefficient for the geometry independent part of CF")
`MPRnb(PLCF ,0.0 ,"" ,"Coefficient for the length dependence of CF")
`MPRnb(PWCF ,0.0 ,"" ,"Coefficient for the width dependence of CF")
`MPRnb(PLWCF ,0.0 ,"" ,"Coefficient for the length times width dependence of CF")
`MPRnb(POCFAC ,0.0 ,"" ,"Coefficient for the geometry independent part of CFAC")
`MPRnb(PLCFAC ,0.0 ,"" ,"Coefficient for the length dependence of CFAC")
`MPRnb(PWCFAC ,0.0 ,"" ,"Coefficient for the width dependence of CFAC")
`MPRnb(PLWCFAC ,0.0 ,"" ,"Coefficient for the length times width dependence of CFAC")
`MPRnb(POCFD ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of CFD")
`MPRnb(POCFB ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of CFB")
// Subthreshold slope parameters of short channel transistor
`MPRnb(POPSCE ,0.0 ,"" ,"Coefficient for the geometry independent part of PSCE")
`MPRnb(PLPSCE ,0.0 ,"" ,"Coefficient for the length dependence of PSCE")
`MPRnb(PWPSCE ,0.0 ,"" ,"Coefficient for the width dependence of PSCE")
`MPRnb(PLWPSCE ,0.0 ,"" ,"Coefficient for the length times width dependence of PSCE")
`MPRnb(POPSCEB ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of PSCEB")
`MPRnb(POPSCED ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of PSCED")
// Mobility parameters
`MPRnb(POBETN ,7.0e-2 ,"m^2/V/s" ,"Coefficient for the geometry independent part of BETN")
`MPRnb(PLBETN ,0.0 ,"m^2/V/s" ,"Coefficient for the length dependence of BETN")
`MPRnb(PWBETN ,0.0 ,"m^2/V/s" ,"Coefficient for the width dependence of BETN")
`MPRnb(PLWBETN ,0.0 ,"m^2/V/s" ,"Coefficient for the length times width dependence of BETN")
`MPRnb(POSTBET ,1.0 ,"" ,"Coefficient for the geometry independent part of STBET")
`MPRnb(PLSTBET ,0.0 ,"" ,"Coefficient for the length dependence of STBET")
`MPRnb(PWSTBET ,0.0 ,"" ,"Coefficient for the width dependence of STBET")
`MPRnb(PLWSTBET ,0.0 ,"" ,"Coefficient for the length times width dependence of STBET")
`MPRnb(POMUE ,0.5 ,"m/V" ,"Coefficient for the geometry independent part of MUE")
`MPRnb(PLMUE ,0.0 ,"m/V" ,"Coefficient for the length dependence of MUE")
`MPRnb(PWMUE ,0.0 ,"m/V" ,"Coefficient for the width dependence of MUE")
`MPRnb(PLWMUE ,0.0 ,"m/V" ,"Coefficient for the length times width dependence of MUE")
`MPRnb(POSTMUE ,0.0 ,"" ,"Coefficient for the geometry independent part of STMUE")
`MPRnb(POTHEMU ,1.5 ,"" ,"Coefficient for the geometry independent part of THEMU")
`MPRnb(POSTTHEMU ,1.5 ,"" ,"Coefficient for the geometry independent part of STTHEMU")
`MPRnb(POCS ,0.0 ,"" ,"Coefficient for the geometry independent part of CS")
`MPRnb(PLCS ,0.0 ,"" ,"Coefficient for the length dependence of CS")
`MPRnb(PWCS ,0.0 ,"" ,"Coefficient for the width dependence of CS")
`MPRnb(PLWCS ,0.0 ,"" ,"Coefficient for the length times width dependence of CS")
`MPRnb(POSTCS ,0.0 ,"" ,"Coefficient for the geometry independent part of STCS")
`MPRnb(POTHECS ,2.0 ,"" ,"Coefficient for the geometry independent part of THECS")
`MPRnb(POSTTHECS ,0.0 ,"" ,"Coefficient for the geometry independent part of STHTECS")
`MPRnb(POXCOR ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of XCOR")
`MPRnb(PLXCOR ,0.0 ,"V^-1" ,"Coefficient for the length dependence of XCOR")
`MPRnb(PWXCOR ,0.0 ,"V^-1" ,"Coefficient for the width dependence of XCOR")
`MPRnb(PLWXCOR ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of XCOR")
`MPRnb(POSTXCOR ,0.0 ,"" ,"Coefficient for the geometry independent part of STXCOR")
`MPRnb(POFETA ,1.0 ,"" ,"Coefficient for the geometry independent part of FETA")
// Series resistance parameters
`MPRnb(PORS ,30.0 ,"Ohm" ,"Coefficient for the geometry independent part of RS")
`MPRnb(PLRS ,0.0 ,"Ohm" ,"Coefficient for the length dependence of RS")
`MPRnb(PWRS ,0.0 ,"Ohm" ,"Coefficient for the width dependence of RS")
`MPRnb(PLWRS ,0.0 ,"Ohm" ,"Coefficient for the length times width dependence of RS")
`MPRnb(POSTRS ,1.0 ,"" ,"Coefficient for the geometry independent part of STRS")
`MPRnb(PORSB ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of RSB")
`MPRnb(PORSG ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of RSG")
// Velocity saturation parameters
`MPRnb(POTHESAT ,1.0 ,"V^-1" ,"Coefficient for the geometry independent part of THESAT")
`MPRnb(PLTHESAT ,0.0 ,"V^-1" ,"Coefficient for the length dependence of THESAT")
`MPRnb(PWTHESAT ,0.0 ,"V^-1" ,"Coefficient for the width dependence of THESAT")
`MPRnb(PLWTHESAT ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of THESAT")
`MPRnb(POTHESATAC ,1.0 ,"V^-1" ,"Coefficient for the geometry independent part of THESATAC")
`MPRnb(PLTHESATAC ,0.0 ,"V^-1" ,"Coefficient for the length dependence of THESATAC")
`MPRnb(PWTHESATAC ,0.0 ,"V^-1" ,"Coefficient for the width dependence of THESATAC")
`MPRnb(PLWTHESATAC ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of THESATAC")
`MPRnb(POSTTHESAT ,1.0 ,"" ,"Coefficient for the geometry independent part of STTHESAT")
`MPRnb(PLSTTHESAT ,0.0 ,"" ,"Coefficient for the length dependence of STTHESAT")
`MPRnb(PWSTTHESAT ,0.0 ,"" ,"Coefficient for the width dependence of STTHESAT")
`MPRnb(PLWSTTHESAT ,0.0 ,"" ,"Coefficient for the length times width dependence of STTHESAT")
`MPRnb(POTHESATB ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of THESATB")
`MPRnb(PLTHESATB ,0.0 ,"V^-1" ,"Coefficient for the length dependence of THESATB")
`MPRnb(PWTHESATB ,0.0 ,"V^-1" ,"Coefficient for the width dependence of THESATB")
`MPRnb(PLWTHESATB ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of THESATB")
`MPRnb(POTHESATG ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of THESATG")
`MPRnb(PLTHESATG ,0.0 ,"V^-1" ,"Coefficient for the length dependence of THESATG")
`MPRnb(PWTHESATG ,0.0 ,"V^-1" ,"Coefficient for the width dependence of THESATG")
`MPRnb(PLWTHESATG ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of THESATG")
// Saturation voltage parameters
`MPRnb(POAX ,3.0 ,"" ,"Coefficient for the geometry independent part of AX")
`MPRnb(PLAX ,0.0 ,"" ,"Coefficient for the length dependence of AX")
`MPRnb(PWAX ,0.0 ,"" ,"Coefficient for the width dependence of AX")
`MPRnb(PLWAX ,0.0 ,"" ,"Coefficient for the length times width dependence of AX")
`MPRnb(POAXAC ,3.0 ,"" ,"Coefficient for the geometry independent part of AXAC")
`MPRnb(PLAXAC ,0.0 ,"" ,"Coefficient for the length dependence of AXAC")
`MPRnb(PWAXAC ,0.0 ,"" ,"Coefficient for the width dependence of AXAC")
`MPRnb(PLWAXAC ,0.0 ,"" ,"Coefficient for the length times width dependence of AXAC")
// Channel length modulation (CLM) parameters
`MPRnb(POALP ,1.0e-2 ,"" ,"Coefficient for the geometry independent part of ALP")
`MPRnb(PLALP ,0.0 ,"" ,"Coefficient for the length dependence of ALP")
`MPRnb(PWALP ,0.0 ,"" ,"Coefficient for the width dependence of ALP")
`MPRnb(PLWALP ,0.0 ,"" ,"Coefficient for the length times width dependence of ALP")
`MPRnb(POALPAC ,1.0e-2 ,"" ,"Coefficient for the geometry independent part of ALPAC")
`MPRnb(PLALPAC ,0.0 ,"" ,"Coefficient for the length dependence of ALPAC")
`MPRnb(PWALPAC ,0.0 ,"" ,"Coefficient for the width dependence of ALPAC")
`MPRnb(PLWALPAC ,0.0 ,"" ,"Coefficient for the length times width dependence of ALPAC")
`MPRnb(POALP1 ,0.0 ,"V" ,"Coefficient for the geometry independent part of ALP1")
`MPRnb(PLALP1 ,0.0 ,"V" ,"Coefficient for the length dependence of ALP1")
`MPRnb(PWALP1 ,0.0 ,"V" ,"Coefficient for the width dependence of ALP1")
`MPRnb(PLWALP1 ,0.0 ,"V" ,"Coefficient for the length times width dependence of ALP1")
`MPRnb(POALP2 ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of ALP2")
`MPRnb(PLALP2 ,0.0 ,"V^-1" ,"Coefficient for the length dependence of ALP2")
`MPRnb(PWALP2 ,0.0 ,"V^-1" ,"Coefficient for the width dependence of ALP2")
`MPRnb(PLWALP2 ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of ALP2")
`MPRnb(POVP ,0.05 ,"V" ,"Coefficient for the geometry independent part of VP")
// Impact ionization parameters
`MPRnb(POA1 ,1.0 ,"" ,"Coefficient for the geometry independent part of A1")
`MPRnb(PLA1 ,0.0 ,"" ,"Coefficient for the length dependence of A1")
`MPRnb(PWA1 ,0.0 ,"" ,"Coefficient for the width dependence of A1")
`MPRnb(PLWA1 ,0.0 ,"" ,"Coefficient for the length times width dependence of A1")
`MPRnb(POA2 ,10.0 ,"V" ,"Coefficient for the geometry independent part of A2")
`MPRnb(POSTA2 ,0.0 ,"V" ,"Coefficient for the geometry independent part of STA2")
`MPRnb(POA3 ,1.0 ,"" ,"Coefficient for the geometry independent part of A3")
`MPRnb(PLA3 ,0.0 ,"" ,"Coefficient for the length dependence of A3")
`MPRnb(PWA3 ,0.0 ,"" ,"Coefficient for the width dependence of A3")
`MPRnb(PLWA3 ,0.0 ,"" ,"Coefficient for the length times width dependence of A3")
`MPRnb(POA4 ,0.0 ,"V^-0.5" ,"Coefficient for the geometry independent part of A4")
`MPRnb(PLA4 ,0.0 ,"V^-0.5" ,"Coefficient for the length dependence of A4")
`MPRnb(PWA4 ,0.0 ,"V^-0.5" ,"Coefficient for the width dependence of A4")
`MPRnb(PLWA4 ,0.0 ,"V^-0.5" ,"Coefficient for the length times width dependence of A4")
`MPRnb(POGCO ,0.0 ,"" ,"Coefficient for the geometry independent part of GCO")
// Gate current parameters
`MPRnb(POIGINV ,0.0 ,"A" ,"Coefficient for the geometry independent part of IGINV")
`MPRnb(PLIGINV ,0.0 ,"A" ,"Coefficient for the length dependence of IGINV")
`MPRnb(PWIGINV ,0.0 ,"A" ,"Coefficient for the width dependence of IGINV")
`MPRnb(PLWIGINV ,0.0 ,"A" ,"Coefficient for the length times width dependence of IGINV")
`MPRnb(POIGOV ,0.0 ,"A" ,"Coefficient for the geometry independent part of IGOV")
`MPRnb(PLIGOV ,0.0 ,"A" ,"Coefficient for the length dependence of IGOV")
`MPRnb(PWIGOV ,0.0 ,"A" ,"Coefficient for the width dependence of IGOV")
`MPRnb(PLWIGOV ,0.0 ,"A" ,"Coefficient for the length times width dependence of IGOV")
`MPRnb(POIGOVD ,0.0 ,"A" ,"Coefficient for the geometry independent part of IGOV for drain side")
`MPRnb(PLIGOVD ,0.0 ,"A" ,"Coefficient for the length dependence of IGOV for drain side")
`MPRnb(PWIGOVD ,0.0 ,"A" ,"Coefficient for the width dependence of IGOV for drain side")
`MPRnb(PLWIGOVD ,0.0 ,"A" ,"Coefficient for the length times width dependence of IGOV for drain side")
`MPRnb(POSTIG ,2.0 ,"" ,"Coefficient for the geometry independent part of STIG")
`MPRnb(POGC2 ,0.375 ,"" ,"Coefficient for the geometry independent part of GC2")
`MPRnb(POGC3 ,0.063 ,"" ,"Coefficient for the geometry independent part of GC3")
`MPRnb(POGC2OV ,0.375 ,"" ,"Coefficient for the geometry independent part of GC2OV, used only when SWIGATE=2")
`MPRnb(POGC3OV ,0.063 ,"" ,"Coefficient for the geometry independent part of GC3OV, used only when SWIGATE=2")
`MPRnb(POCHIB ,3.1 ,"V" ,"Coefficient for the geometry independent part of CHIB")
// Gate-induced drain leakage (GIDL) parameters
`MPRnb(POAGIDL ,0.0 ,"A/V^3" ,"Coefficient for the geometry independent part of AGIDL")
`MPRnb(PLAGIDL ,0.0 ,"A/V^3" ,"Coefficient for the length dependence of AGIDL")
`MPRnb(PWAGIDL ,0.0 ,"A/V^3" ,"Coefficient for the width dependence of AGIDL")
`MPRnb(PLWAGIDL ,0.0 ,"A/V^3" ,"Coefficient for the length times width dependence of AGIDL")
`MPRnb(POAGIDLD ,0.0 ,"A/V^3" ,"Coefficient for the geometry independent part of AGIDL for drain side")
`MPRnb(PLAGIDLD ,0.0 ,"A/V^3" ,"Coefficient for the length dependence of AGIDL for drain side")
`MPRnb(PWAGIDLD ,0.0 ,"A/V^3" ,"Coefficient for the width dependence of AGIDL for drain side")
`MPRnb(PLWAGIDLD ,0.0 ,"A/V^3" ,"Coefficient for the length times width dependence of AGIDL for drain side")
`MPRnb(POBGIDL ,41.0 ,"V" ,"Coefficient for the geometry independent part of BGIDL")
`MPRnb(POBGIDLD ,41.0 ,"V" ,"Coefficient for the geometry independent part of BGIDL for drain side")
`MPRnb(POSTBGIDL ,0.0 ,"V/K" ,"Coefficient for the geometry independent part of STBGIDL")
`MPRnb(POSTBGIDLD ,0.0 ,"V/K" ,"Coefficient for the geometry independent part of STBGIDL for drain side")
`MPRnb(POCGIDL ,0.0 ,"" ,"Coefficient for the geometry independent part of CGIDL")
`MPRnb(POCGIDLD ,0.0 ,"" ,"Coefficient for the geometry independent part of CGIDL for drain side")
// Charge model parameters
`MPRnb(POCOX ,1.0e-14 ,"F" ,"Coefficient for the geometry independent part of COX")
`MPRnb(PLCOX ,0.0 ,"F" ,"Coefficient for the length dependence of COX")
`MPRnb(PWCOX ,0.0 ,"F" ,"Coefficient for the width dependence of COX")
`MPRnb(PLWCOX ,0.0 ,"F" ,"Coefficient for the length times width dependence of COX")
`MPRnb(POCGOV ,1.0e-15 ,"F" ,"Coefficient for the geometry independent part of CGOV")
`MPRnb(PLCGOV ,0.0 ,"F" ,"Coefficient for the length dependence of CGOV")
`MPRnb(PWCGOV ,0.0 ,"F" ,"Coefficient for the width dependence of CGOV")
`MPRnb(PLWCGOV ,0.0 ,"F" ,"Coefficient for the length times width dependence of CGOV")
`MPRnb(POCGOVD ,1.0e-15 ,"F" ,"Coefficient for the geometry independent part of CGOV for drain side")
`MPRnb(PLCGOVD ,0.0 ,"F" ,"Coefficient for the length dependence of CGOV for drain side")
`MPRnb(PWCGOVD ,0.0 ,"F" ,"Coefficient for the width dependence of CGOV for drain side")
`MPRnb(PLWCGOVD ,0.0 ,"F" ,"Coefficient for the length times width dependence of CGOV for drain side")
`MPRnb(POCGBOV ,0.0 ,"F" ,"Coefficient for the geometry independent part of CGBOV")
`MPRnb(PLCGBOV ,0.0 ,"F" ,"Coefficient for the length dependence of CGBOV")
`MPRnb(PWCGBOV ,0.0 ,"F" ,"Coefficient for the width dependence of CGBOV")
`MPRnb(PLWCGBOV ,0.0 ,"F" ,"Coefficient for the length times width dependence of CGBOV")
`MPRnb(POCFR ,0.0 ,"F" ,"Coefficient for the geometry independent part of CFR")
`MPRnb(PLCFR ,0.0 ,"F" ,"Coefficient for the length dependence of CFR")
`MPRnb(PWCFR ,0.0 ,"F" ,"Coefficient for the width dependence of CFR")
`MPRnb(PLWCFR ,0.0 ,"F" ,"Coefficient for the length times width dependence of CFR")
`MPRnb(POCFRD ,0.0 ,"F" ,"Coefficient for the geometry independent part of CFR for drain side")
`MPRnb(PLCFRD ,0.0 ,"F" ,"Coefficient for the length dependence of CFR for drain side")
`MPRnb(PWCFRD ,0.0 ,"F" ,"Coefficient for the width dependence of CFR for drain side")
`MPRnb(PLWCFRD ,0.0 ,"F" ,"Coefficient for the length times width dependence of CFR for drain side")
// Noise model parameters
`MPRnb(POFNT ,1.0 ,"" ,"Coefficient for the geometry independent part of FNT")
`MPRnb(POFNTEXC ,0.0 ,"" ,"Coefficient for the geometry independent part of FNTEXC")
`MPRnb(PLFNTEXC ,0.0 ,"" ,"Coefficient for the length dependence of FNTEXC")
`MPRnb(PWFNTEXC ,0.0 ,"" ,"Coefficient for the width dependence of FNTEXC")
`MPRnb(PLWFNTEXC ,0.0 ,"" ,"Coefficient for the length times width dependence of FNTEXC")
`MPRnb(PONFA ,8.0e22 ,"V^-1/m^4" ,"Coefficient for the geometry independent part of NFA")
`MPRnb(PLNFA ,0.0 ,"V^-1/m^4" ,"Coefficient for the length dependence of NFA")
`MPRnb(PWNFA ,0.0 ,"V^-1/m^4" ,"Coefficient for the width dependence of NFA")
`MPRnb(PLWNFA ,0.0 ,"V^-1/m^4" ,"Coefficient for the length times width dependence of NFA")
`MPRnb(PONFB ,3.0e7 ,"V^-1/m^2" ,"Coefficient for the geometry independent part of NFB")
`MPRnb(PLNFB ,0.0 ,"V^-1/m^2" ,"Coefficient for the length dependence of NFB")
`MPRnb(PWNFB ,0.0 ,"V^-1/m^2" ,"Coefficient for the width dependence of NFB")
`MPRnb(PLWNFB ,0.0 ,"V^-1/m^2" ,"Coefficient for the length times width dependence of NFB")
`MPRnb(PONFC ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of NFC")
`MPRnb(PLNFC ,0.0 ,"V^-1" ,"Coefficient for the length dependence of NFC")
`MPRnb(PWNFC ,0.0 ,"V^-1" ,"Coefficient for the width dependence of NFC")
`MPRnb(PLWNFC ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of NFC")
`MPRnb(POEF ,1.0 ,"" ,"Coefficient for the flicker noise frequency exponent")
// Edge transistor parameters: PSP 103.4
`MPRnb(POVFBEDGE ,-1.0 ,"V" ,"Coefficient for the geometry independent part of VFBEDGE")
`MPRnb(POSTVFBEDGE ,0.0 ,"V/K" ,"Coefficient for the geometry independent part of STVFBEDGE")
`MPRnb(PLSTVFBEDGE ,0.0 ,"V/K" ,"Coefficient for the length dependence of STVFBEDGE")
`MPRnb(PWSTVFBEDGE ,0.0 ,"V/K" ,"Coefficient for the width dependence of STVFBEDGE")
`MPRnb(PLWSTVFBEDGE ,0.0 ,"V/K" ,"Coefficient for the length times width dependence of STVFBEDGE")
`MPRnb(PODPHIBEDGE ,0.0 ,"V" ,"Coefficient for the geometry independent part of DPHIBEDGE")
`MPRnb(PLDPHIBEDGE ,0.0 ,"V" ,"Coefficient for the length dependence of DPHIBEDGE")
`MPRnb(PWDPHIBEDGE ,0.0 ,"V" ,"Coefficient for the width dependence of DPHIBEDGE")
`MPRnb(PLWDPHIBEDGE ,0.0 ,"V" ,"Coefficient for the length times width dependence of DPHIBEDGE")
`MPRnb(PONEFFEDGE ,5.0e23 ,"m^-3" ,"Coefficient for the geometry independent part of NEFFEDGE")
`MPRnb(PLNEFFEDGE ,0.0 ,"m^-3" ,"Coefficient for the length dependence of NEFFEDGE")
`MPRnb(PWNEFFEDGE ,0.0 ,"m^-3" ,"Coefficient for the width dependence of NEFFEDGE")
`MPRnb(PLWNEFFEDGE ,0.0 ,"m^-3" ,"Coefficient for the length times width dependence of NEFFEDGE")
`MPRnb(POCTEDGE ,0.0 ,"" ,"Coefficient for the geometry independent part of CTEDGE")
`MPRnb(PLCTEDGE ,0.0 ,"" ,"Coefficient for the length dependence of CTEDGE")
`MPRnb(PWCTEDGE ,0.0 ,"" ,"Coefficient for the width dependence of CTEDGE")
`MPRnb(PLWCTEDGE ,0.0 ,"" ,"Coefficient for the length times width dependence of CTEDGE")
`MPRnb(POBETNEDGE ,5.0e-4 ,"m^2/V/s" ,"Coefficient for the geometry independent part of BETNEDGE")
`MPRnb(PLBETNEDGE ,0.0 ,"m^2/V/s" ,"Coefficient for the length dependence of BETNEDGE")
`MPRnb(PWBETNEDGE ,0.0 ,"m^2/V/s" ,"Coefficient for the width dependence of BETNEDGE")
`MPRnb(PLWBETNEDGE ,0.0 ,"m^2/V/s" ,"Coefficient for the length times width dependence of BETNEDGE")
`MPRnb(POSTBETEDGE ,1.0 ,"" ,"Coefficient for the geometry independent part of STBETEDGE")
`MPRnb(PLSTBETEDGE ,0.0 ,"" ,"Coefficient for the length dependence of STBETEDGE")
`MPRnb(PWSTBETEDGE ,0.0 ,"" ,"Coefficient for the width dependence of STBETEDGE")
`MPRnb(PLWSTBETEDGE ,0.0 ,"" ,"Coefficient for the length times width dependence of STBETEDGE")
`MPRnb(POPSCEEDGE ,0.0 ,"" ,"Coefficient for the geometry independent part of PSCEEDGE")
`MPRnb(PLPSCEEDGE ,0.0 ,"" ,"Coefficient for the length dependence of PSCEEDGE")
`MPRnb(PWPSCEEDGE ,0.0 ,"" ,"Coefficient for the width dependence of PSCEEDGE")
`MPRnb(PLWPSCEEDGE ,0.0 ,"" ,"Coefficient for the length times width dependence of PSCEEDGE")
`MPRnb(POPSCEBEDGE ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of PSCEBEDGE")
`MPRnb(POPSCEDEDGE ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of PSCEDEDGE")
`MPRnb(POCFEDGE ,0.0 ,"" ,"Coefficient for the geometry independent part of CFEDGE")
`MPRnb(PLCFEDGE ,0.0 ,"" ,"Coefficient for the length dependence of CFEDGE")
`MPRnb(PWCFEDGE ,0.0 ,"" ,"Coefficient for the width dependence of CFEDGE")
`MPRnb(PLWCFEDGE ,0.0 ,"" ,"Coefficient for the length times width dependence of CFEDGE")
`MPRnb(POCFDEDGE ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of CFDEDGE")
`MPRnb(POCFBEDGE ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of CFBEDGE")
`MPRnb(POFNTEDGE ,1.0 ,"" ,"Coefficient for the geometry independent part of FNTEDGE")
`MPRnb(PONFAEDGE ,8.0e22 ,"V^-1/m^4" ,"Coefficient for the geometry independent part of NFAEDGE")
`MPRnb(PLNFAEDGE ,0.0 ,"V^-1/m^4" ,"Coefficient for the length dependence of NFAEDGE")
`MPRnb(PWNFAEDGE ,0.0 ,"V^-1/m^4" ,"Coefficient for the width dependence of NFAEDGE")
`MPRnb(PLWNFAEDGE ,0.0 ,"V^-1/m^4" ,"Coefficient for the length times width dependence of NFAEDGE")
`MPRnb(PONFBEDGE ,3.0e7 ,"V^-1/m^2" ,"Coefficient for the geometry independent part of NFBEDGE")
`MPRnb(PLNFBEDGE ,0.0 ,"V^-1/m^2" ,"Coefficient for the length dependence of NFBEDGE")
`MPRnb(PWNFBEDGE ,0.0 ,"V^-1/m^2" ,"Coefficient for the width dependence of NFBEDGE")
`MPRnb(PLWNFBEDGE ,0.0 ,"V^-1/m^2" ,"Coefficient for the length times width dependence of NFBEDGE")
`MPRnb(PONFCEDGE ,0.0 ,"V^-1" ,"Coefficient for the geometry independent part of NFCEDGE")
`MPRnb(PLNFCEDGE ,0.0 ,"V^-1" ,"Coefficient for the length dependence of NFCEDGE")
`MPRnb(PWNFCEDGE ,0.0 ,"V^-1" ,"Coefficient for the width dependence of NFCEDGE")
`MPRnb(PLWNFCEDGE ,0.0 ,"V^-1" ,"Coefficient for the length times width dependence of NFCEDGE")
`MPRnb(POEFEDGE ,1.0 ,"" ,"Coefficient for the geometry independent part of EFEDGE")
// Well proximity effect parameters
`MPRnb(POKVTHOWE ,0.0 ,"" ,"Coefficient for the geometry independent part of KVTHOWE")
`MPRnb(PLKVTHOWE ,0.0 ,"" ,"Coefficient for the length dependence part of KVTHOWE")
`MPRnb(PWKVTHOWE ,0.0 ,"" ,"Coefficient for the width dependence part of KVTHOWE")
`MPRnb(PLWKVTHOWE ,0.0 ,"" ,"Coefficient for the length times width dependence part of KVTHOWE")
`MPRnb(POKUOWE ,0.0 ,"" ,"Coefficient for the geometry independent part of KUOWE")
`MPRnb(PLKUOWE ,0.0 ,"" ,"Coefficient for the length dependence part of KUOWE")
`MPRnb(PWKUOWE ,0.0 ,"" ,"Coefficient for the width dependence part of KUOWE")
`MPRnb(PLWKUOWE ,0.0 ,"" ,"Coefficient for the length times width dependence part of KUOWE")
// `Dummy' parameters for binning-set labeling
`MPRnb(LMIN ,0 ,"m" ,"Dummy parameter to label binning set")
`MPRnb(LMAX ,1.0 ,"m" ,"Dummy parameter to label binning set")
`MPRnb(WMIN ,0.0 ,"m" ,"Dummy parameter to label binning set")
`MPRnb(WMAX ,1.0 ,"m" ,"Dummy parameter to label binning set")
// --------------------------------------------------------------------------------------------------------------
// Parameters that occur in both global and binning model
// --------------------------------------------------------------------------------------------------------------
// NQS parameters
`ifdef NQSmodel
`MPRnb(MUNQSO ,1.0 ,"" ,"Relative mobility for NQS modelling")
`endif // NQSmodel
// Parasitic resistance parameters
`MPRnb(RGO ,0.0 ,"Ohm" ,"Gate resistance")
`MPRcz(RINT ,0.0 ,"Ohm m^2" ,"Contact resistance between silicide and ploy")
`MPRcz(RVPOLY ,0.0 ,"Ohm m^2" ,"Vertical poly resistance")
`MPRcz(RSHG ,0.0 ,"Ohm/sq" ,"Gate electrode diffusion sheet resistance")
`MPRnb(DLSIL ,0.0 ,"m" ,"Silicide extension over the physical gate length")
`MPRnb(RSH ,0.0 ,"Ohm/sq" ,"Sheet resistance of source diffusion")
`MPRnb(RSHD ,0.0 ,"Ohm/sq" ,"Sheet resistance of drain diffusion")
`MPRnb(RBULKO ,0.0 ,"Ohm" ,"Bulk resistance between node BP and BI")
`MPRnb(RWELLO ,0.0 ,"Ohm" ,"Well resistance between node BI and B")
`MPRnb(RJUNSO ,0.0 ,"Ohm" ,"Source-side bulk resistance between node BI and BS")
`MPRnb(RJUNDO ,0.0 ,"Ohm" ,"Drain-side bulk resistance between node BI and BD")
// Self heating effect parameters
`ifdef SelfHeating
`MPRnb(RTHO ,0.0 ,"K/W" ,"Geometry independent part of thermal resistance")
`MPRnb(RTHW1 ,0.0 ,"K/W" ,"Width dependence of thermal resistance")
`MPRnb(RTHW2 ,0.0 ,"" ,"Offset in width dependence of thermal resistance")
`MPRnb(RTHLW ,0.0 ,"" ,"Length-correction to width dependence of thermal resistance")
`MPRnb(CTHO ,0.0 ,"J/K" ,"Geometry independent part of thermal capacitance")
`MPRnb(CTHW1 ,0.0 ,"J/K" ,"Width dependence of thermal capacitance")
`MPRnb(CTHW2 ,0.0 ,"" ,"Offset in width dependence of thermal capacitance")
`MPRnb(CTHLW ,0.0 ,"" ,"Length-correction to width dependence of thermal capacitance")
`MPRnb(STRTHO ,0.0 ,"" ,"Temperature sensitivity of RTH")
`endif // SelfHeating
// Stress Model Parameters
`MPRcc(SAREF ,1.0e-6 ,"m" ,1.0e-9 ,inf ,"Reference distance between OD-edge and poly from one side")
`MPRcc(SBREF ,1.0e-6 ,"m" ,1.0e-9 ,inf ,"Reference distance between OD-edge and poly from other side")
`MPRnb(WLOD ,0.0 ,"m" ,"Width parameter")
`MPRnb(KUO ,0.0 ,"m" ,"Mobility degradation/enhancement coefficient")
`MPRcc(KVSAT ,0.0 ,"m" ,-1.0 ,1.0 ,"Saturation velocity degradation/enhancement coefficient")
`MPRcc(KVSATAC ,0.0 ,"m" ,-1.0 ,1.0 ,"Saturation velocity degradation/enhancement coefficient of charge model when SWQSAT=1")
`MPRnb(TKUO ,0.0 ,"" ,"Temperature dependence of KUO")
`MPRnb(LKUO ,0.0 ,"m^LLODKUO" ,"Length dependence of KUO")
`MPRnb(WKUO ,0.0 ,"m^WLODKUO" ,"Width dependence of KUO")
`MPRnb(PKUO ,0.0 ,"m^(LLODKUO+WLODKUO)" ,"Cross-term dependence of KUO")
`MPRcz(LLODKUO ,0.0 ,"" ,"Length parameter for UO stress effect")
`MPRcz(WLODKUO ,0.0 ,"" ,"Width parameter for UO stress effect")
`MPRnb(KVTHO ,0.0 ,"Vm" ,"Threshold shift parameter")
`MPRnb(LKVTHO ,0.0 ,"m^LLODVTH" ,"Length dependence of KVTHO")
`MPRnb(WKVTHO ,0.0 ,"m^WLODVTH" ,"Width dependence of KVTHO")
`MPRnb(PKVTHO ,0.0 ,"m^(LLODVTH+WLODVTH)" ,"Cross-term dependence of KVTHO")
`MPRcz(LLODVTH ,0.0 ,"" ,"Length parameter for VTH-stress effect")
`MPRcz(WLODVTH ,0.0 ,"" ,"Width parameter for VTH-stress effect")
`MPRnb(STETAO ,0.0 ,"m" ,"Eta0 shift factor related to VTHO change")
`MPRcz(LODETAO ,1.0 ,"" ,"Eta0 shift modification factor for stress effect")
// Well proximity effect Parameters
`MPRcz(SCREF ,1.0e-6 ,"m" ,"Distance between OD-edge and well edge of a reference device")
`MPRnb(WEB ,0.0 ,"" ,"Coefficient for SCB")
`MPRnb(WEC ,0.0 ,"" ,"Coefficient for SCC")
// --------------------------------------------------------------------------------------------------------------
// Other Parameters
// --------------------------------------------------------------------------------------------------------------
`MPRnb(DTA ,0.0 ,"K" ,"Temperature offset w.r.t. ambient temperature")

View File

@ -0,0 +1,773 @@
//======================================================================================
//======================================================================================
// Filename: PSP103_scaling.include
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 103.7.0 (PSP), 200.6.0 (JUNCAP), April 2019
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
// Transistor geometry
iL = `LEN / L_i;
iW = `WEN / W_i;
delLPS = LVARO * (1.0 + LVARL * iL) * (1.0 + LVARW * iW);
delWOD = WVARO * (1.0 + WVARL * iL) * (1.0 + WVARW * iW);
if (SWGEO_i == 2) begin
delLPS = LVARO * (1.0 + LVARL * iL);
delWOD = WVARO * (1.0 + WVARW * iW);
end
LE = `CLIP_LOW(L_i + delLPS - 2.0 * LAP, 1.0e-9);
WE = `CLIP_LOW(W_i + delWOD - 2.0 * WOT, 1.0e-9);
LEcv = `CLIP_LOW(L_i + delLPS - 2.0 * LAP + DLQ, 1.0e-9);
WEcv = `CLIP_LOW(W_i + delWOD - 2.0 * WOT + DWQ, 1.0e-9);
Lcv = `CLIP_LOW(L_i + delLPS + DLQ, 1.0e-9);
Wcv = `CLIP_LOW(W_i + delWOD + DWQ, 1.0e-9);
iLE = `LEN / LE;
iWE = `WEN / WE;
// Geometry for multi-finger devices
L_f = `CLIP_LOW(L_i + delLPS, 1.0e-9);
L_slif = `CLIP_LOW(L_f + DLSIL, 1.0e-9);
W_f = `CLIP_LOW(W_i + delWOD, 1.0e-9);
XGWE = `CLIP_LOW(XGW_i - 0.5 * delWOD, 1.0e-9);
// Local model parameters
VFB_p = VFB;
STVFB_p = STVFB;
ST2VFB_p = ST2VFB;
TOX_p = TOX;
EPSROX_p = EPSROX;
NEFF_p = NEFF;
FACNEFFAC_p = FACNEFFAC;
GFACNUD_p = GFACNUD;
VSBNUD_p = VSBNUD;
DVSBNUD_p = DVSBNUD;
VNSUB_p = VNSUB;
NSLP_p = NSLP;
DNSUB_p = DNSUB;
DPHIB_p = DPHIB;
DELVTAC_p = DELVTAC;
NP_p = NP;
TOXOV_p = TOXOV;
TOXOVD_p = TOXOVD;
NOV_p = NOV;
NOVD_p = NOVD;
CT_p = CT;
CTG_p = CTG;
CTB_p = CTB;
STCT_p = STCT;
PSCE_p = PSCE;
PSCED_p = PSCED;
PSCEB_p = PSCEB;
CF_p = CF;
`DefACparam(CFAC_p, CF, CFAC)
CFD_p = CFD;
CFB_p = CFB;
BETN_p = BETN;
STBET_p = STBET;
MUE_p = MUE;
STMUE_p = STMUE;
THEMU_p = THEMU;
STTHEMU_p = STTHEMU;
CS_p = CS;
STCS_p = STCS;
THECS_p = THECS;
STTHECS_p = STTHECS;
XCOR_p = XCOR;
STXCOR_p = STXCOR;
FETA_p = FETA;
RS_p = RS;
STRS_p = STRS;
RSB_p = RSB;
RSG_p = RSG;
THESAT_p = THESAT;
`DefACparam(THESATAC_p, THESAT, THESATAC)
STTHESAT_p = STTHESAT;
THESATB_p = THESATB;
THESATG_p = THESATG;
AX_p = AX;
`DefACparam(AXAC_p, AX, AXAC)
ALP_p = ALP;
`DefACparam(ALPAC_p, ALP, ALPAC)
ALP1_p = ALP1;
ALP2_p = ALP2;
VP_p = VP;
A1_p = A1;
A2_p = A2;
STA2_p = STA2;
A3_p = A3;
A4_p = A4;
GCO_p = GCO;
IGINV_p = IGINV;
IGOV_p = IGOV;
IGOVD_p = IGOVD;
STIG_p = STIG;
GC2_p = GC2;
GC3_p = GC3;
GC2OV_p = GC2OV;
GC3OV_p = GC3OV;
CHIB_p = CHIB;
AGIDL_p = AGIDL;
AGIDLD_p = AGIDLD;
BGIDL_p = BGIDL;
BGIDLD_p = BGIDLD;
STBGIDL_p = STBGIDL;
STBGIDLD_p = STBGIDLD;
CGIDL_p = CGIDL;
CGIDLD_p = CGIDLD;
COX_p = COX;
CGOV_p = CGOV;
CGOVD_p = CGOVD;
CGBOV_p = CGBOV;
CFR_p = CFR;
CFRD_p = CFRD;
FNT_p = FNT;
FNTEXC_p = FNTEXC;
NFA_p = NFA;
NFB_p = NFB;
NFC_p = NFC;
EF_p = EF;
VFBEDGE_p = VFBEDGE;
STVFBEDGE_p = STVFBEDGE;
DPHIBEDGE_p = DPHIBEDGE;
NEFFEDGE_p = NEFFEDGE;
CTEDGE_p = CTEDGE;
BETNEDGE_p = BETNEDGE;
STBETEDGE_p = STBETEDGE;
PSCEEDGE_p = PSCEEDGE;
PSCEBEDGE_p = PSCEBEDGE;
PSCEDEDGE_p = PSCEDEDGE;
CFEDGE_p = CFEDGE;
CFDEDGE_p = CFDEDGE;
CFBEDGE_p = CFBEDGE;
FNTEDGE_p = FNTEDGE;
NFAEDGE_p = NFAEDGE;
NFBEDGE_p = NFBEDGE;
NFCEDGE_p = NFCEDGE;
EFEDGE_p = EFEDGE;
RG_p = RG;
RSE_p = RSE;
RDE_p = RDE;
RWELL_p = RWELL;
RBULK_p = RBULK;
RJUNS_p = RJUNS;
RJUND_p = RJUND;
`ifdef SelfHeating
RTH_p = RTH;
CTH_p = CTH;
STRTH_p = STRTH;
`endif // SelfHeating
`ifdef NQSmodel
MUNQS_p = MUNQS;
`endif // NQSmodel
// Geometry scaling with physical scaling rules
if (SWGEO_i == 1) begin
// Process parameters
VFB_p = VFBO + VFBL * iLE + VFBW * iWE + VFBLW * iLE * iWE;
STVFB_p = STVFBO + STVFBL * iLE + STVFBW * iWE + STVFBLW * iLE * iWE;
ST2VFB_p = ST2VFBO;
TOX_p = TOXO;
EPSROX_p = EPSROXO;
NSUB0e = NSUBO_i * `MAX(( 1.0 + NSUBW * iWE * ln( 1.0 + WE / WSEG_i )), 1.0e-03);
NPCKe = NPCK_i * `MAX(( 1.0 + NPCKW * iWE * ln( 1.0 + WE / WSEGP_i )), 1.0e-03);
LPCKe = LPCK_i * `MAX(( 1.0 + LPCKW * iWE * ln( 1.0 + WE / WSEGP_i )), 1.0e-03);
if (LE > (2.0 * LPCKe)) begin
AA = 7.5e10;
BB = sqrt(NSUB0e + 0.5 * NPCKe) - sqrt(NSUB0e);
NSUB = sqrt(NSUB0e) + AA * ln(1.0 + 2.0 * LPCKe / LE * (exp(BB / AA) - 1.0));
NSUB = NSUB * NSUB;
end else begin
if (LE >= LPCKe) begin
NSUB = NSUB0e + NPCKe * LPCKe / LE;
end else begin // LE < LPCK
NSUB = NSUB0e + NPCKe * (2.0 - LE / LPCKe);
end
end
NEFF_p = NSUB * (1.0 - FOL1 * iLE - FOL2 * iLE * iLE);
FACNEFFAC_p = FACNEFFACO + FACNEFFACL * iLE + FACNEFFACW * iWE + FACNEFFACLW * iLE * iWE;
GFACNUD_p = GFACNUDO + GFACNUDL * pow(iLE, GFACNUDLEXP) + GFACNUDW * iWE + GFACNUDLW * iLE * iWE;
VSBNUD_p = VSBNUDO;
DVSBNUD_p = DVSBNUDO;
VNSUB_p = VNSUBO;
NSLP_p = NSLPO;
DNSUB_p = DNSUBO;
DPHIB_p = DPHIBO + DPHIBL * pow(iLE, DPHIBLEXP) + DPHIBW * iWE + DPHIBLW * iLE * iWE;
DELVTAC_p = DELVTACO + DELVTACL * pow(iLE, DELVTACLEXP) + DELVTACW * iWE + DELVTACLW * iLE * iWE;
NP_p = NPO * `MAX(1.0e-6, (1.0 + NPL * iLE));
TOXOV_p = TOXOVO;
TOXOVD_p = TOXOVDO;
NOV_p = NOVO;
NOVD_p = NOVDO;
// Interface states parameters
CT_p = (CTO + CTL * pow(iLE, CTLEXP)) * (1.0 + CTW * iWE) * (1.0 + CTLW * iLE * iWE);
CTG_p = CTGO;
CTB_p = CTBO;
STCT_p = STCTO;
// DIBL parameters
CF_p = CFL * pow(iLE, CFLEXP) * (1.0 + CFW * iWE);
CFAC_p = CFACL_i * pow(iLE, CFACLEXP_i) * (1.0 + CFACW_i * iWE);
CFD_p = CFDO;
CFB_p = CFBO;
// Subthreshold slope parameters of short channel transistor
PSCE_p = PSCEL * pow(iLE, PSCELEXP) * (1.0 + PSCEW * iWE);
PSCED_p = PSCEDO;
PSCEB_p = PSCEBO;
// Mobility parameters
FBET1e = FBET1 * (1.0 + FBET1W * iWE);
LP1e = LP1_i * `MAX(1.0 + LP1W * iWE, 1.0e-03);
GPE = 1.0 + FBET1e * LP1e / LE * (1.0 - exp(-LE / LP1e)) + FBET2 * LP2_i / LE * (1.0 - exp(-LE / LP2_i));
GPE = `MAX(GPE, 1.0e-15);
GWE = 1.0 + BETW1 * iWE + BETW2 * iWE * ln(1.0 + WE / WBET_i);
BETN_p = UO * WE / (GPE * LE) * GWE;
STBET_p = STBETO + STBETL * iLE + STBETW * iWE + STBETLW * iLE * iWE;
MUE_p = MUEO * (1.0 + MUEW * iWE);
STMUE_p = STMUEO;
THEMU_p = THEMUO;
STTHEMU_p = STTHEMUO;
CS_p = (CSO + CSL * pow(iLE, CSLEXP)) * (1.0 + CSW * iWE) * (1.0 + CSLW * iLE * iWE);
STCS_p = STCSO;
THECS_p = THECSO;
STTHECS_p = STTHECSO;
XCOR_p = XCORO * (1.0 + XCORL * iLE) * (1.0 + XCORW * iWE) * (1.0 + XCORLW * iLE * iWE);
STXCOR_p = STXCORO;
FETA_p = FETAO;
// Series resistance
RS_p = RSW1 * iWE * (1.0 + RSW2 * iWE);
STRS_p = STRSO;
RSB_p = RSBO;
RSG_p = RSGO;
// Velocity saturation
THESAT_p = (THESATO + THESATL * GWE / GPE * pow(iLE, THESATLEXP)) * (1.0 + THESATW * iWE) * (1.0 + THESATLW * iLE * iWE);
THESATAC_p = (THESATACO_i + THESATACL_i * GWE / GPE * pow(iLE, THESATACLEXP_i)) * (1.0 + THESATACW_i * iWE) * (1.0 + THESATACLW_i * iLE * iWE);
STTHESAT_p = STTHESATO + STTHESATL * iLE + STTHESATW * iWE + STTHESATLW * iLE * iWE;
THESATB_p = THESATBO;
THESATG_p = THESATGO;
// Saturation voltage
AX_p = AXO / (1.0 + AXL_i * iLE);
AXAC_p = AXACO_i / (1.0 + AXACL_i * iLE);
// Channel length modulation
ALP_p = ALPL * pow(iLE, ALPLEXP) * (1.0 + ALPW * iWE);
ALPAC_p = ALPACL_i * pow(iLE, ALPACLEXP_i) * (1.0 + ALPACW_i * iWE);
tmpx = pow(iLE, ALP1LEXP);
ALP1_p = ALP1L1 * tmpx * (1.0 + ALP1W * iWE) / (1.0 + ALP1L2_i * iLE * tmpx);
tmpx = pow(iLE, ALP2LEXP);
ALP2_p = ALP2L1 * tmpx * (1.0 + ALP2W * iWE) / (1.0 + ALP2L2_i * iLE * tmpx);
VP_p = VPO;
// Impact ionization
A1_p = A1O * (1.0 + A1L * iLE) * (1.0 + A1W * iWE);
A2_p = A2O;
STA2_p = STA2O;
A3_p = A3O * (1.0 + A3L * iLE) * (1.0 + A3W * iWE);
A4_p = A4O * (1.0 + A4L * iLE) * (1.0 + A4W * iWE);
// Gate current
GCO_p = GCOO;
IGINV_p = IGINVLW / (iWE * iLE);
IGOV_p = IGOVW * LOV_i / (`LEN * iWE);
IGOVD_p = IGOVDW * LOVD_i / (`LEN * iWE);
STIG_p = STIGO;
GC2_p = GC2O;
GC3_p = GC3O;
GC2OV_p = GC2OVO;
GC3OV_p = GC3OVO;
CHIB_p = CHIBO;
// GIDL
AGIDL_p = AGIDLW * LOV_i / (`LEN * iWE);
AGIDLD_p = AGIDLDW * LOVD_i / (`LEN * iWE);
BGIDL_p = BGIDLO;
BGIDLD_p = BGIDLDO;
STBGIDL_p = STBGIDLO;
STBGIDLD_p = STBGIDLDO;
CGIDL_p = CGIDLO;
CGIDLD_p = CGIDLDO;
// Charge model parameters
COX_p = `EPSO * EPSROXO_i * WEcv * LEcv / TOXO_i;
CGOV_p = `EPSO * EPSROXO_i * WEcv * LOV_i / TOXOVO_i;
CGOVD_p = `EPSO * EPSROXO_i * WEcv * LOVD_i / TOXOVDO_i;
CGBOV_p = CGBOVL * Lcv / `LEN;
CFR_p = CFRW * Wcv / `WEN;
CFRD_p = CFRDW * Wcv / `WEN;
// Noise model parameters
temp0 = 1.0 - 2.0 * LINTNOI * iLE / `LEN;
Lnoi = `MAX(temp0, 1.0e-3);
Lred = 1.0 / pow(Lnoi, ALPNOI);
FNT_p = FNTO;
FNTEXC_p = FNTEXCL * BETN_p * BETN_p * iWE * iWE;
NFA_p = Lred * iWE * iLE * NFALW;
NFB_p = Lred * iWE * iLE * NFBLW;
NFC_p = Lred * iWE * iLE * NFCLW;
EF_p = EFO;
// Edge transistors: PSP 103.4
WE_edge = 2.0 * WEDGE + WEDGEW * WE;
iWE_edge = `WEN / WE_edge;
VFBEDGE_p = VFBEDGEO;
STVFBEDGE_p = STVFBEDGEO + STVFBEDGEL * iLE + STVFBEDGEW * iWE + STVFBEDGELW * iLE * iWE;
DPHIBEDGE_p = DPHIBEDGEO + DPHIBEDGEL * pow(iLE, DPHIBEDGELEXP) + DPHIBEDGEW * iWE + DPHIBEDGELW * iLE * iWE;
NEFFEDGE_p = NSUBEDGEO_i * (1.0 + NSUBEDGEL * pow(iLE, NSUBEDGELEXP)) * ( 1.0 + NSUBEDGEW * iWE) * ( 1.0 + NSUBEDGELW * iLE * iWE);
CTEDGE_p = CTEDGEO + CTEDGEL * pow(iLE, CTEDGELEXP);
GPE_edge = 1.0 + FBETEDGE * LPEDGE_i / LE * (1.0 - exp(-LE / LPEDGE_i));
GPE_edge = `MAX(GPE_edge, 1.0e-15);
BETNEDGE_p = UO * WE_edge / (GPE_edge * LE) * (1.0 + BETEDGEW * iWE);
STBETEDGE_p = STBETEDGEO + STBETEDGEL * iLE + STBETEDGEW * iWE + STBETEDGELW * iLE * iWE;
PSCEEDGE_p = PSCEEDGEL * pow(iLE, PSCEEDGELEXP) * (1.0 + PSCEEDGEW * iWE);
PSCEBEDGE_p = PSCEBEDGEO;
PSCEDEDGE_p = PSCEDEDGEO;
CFEDGE_p = CFEDGEL * pow(iLE, CFEDGELEXP) * (1.0 + CFEDGEW * iWE);
CFDEDGE_p = CFDEDGEO;
CFBEDGE_p = CFBEDGEO;
FNTEDGE_p = FNTEDGEO;
NFAEDGE_p = iWE_edge * iLE * NFAEDGELW;
NFBEDGE_p = iWE_edge * iLE * NFBEDGELW;
NFCEDGE_p = iWE_edge * iLE * NFCEDGELW;
EFEDGE_p = EFEDGEO;
end
// Well proximity effect parameters
KVTHOWE = KVTHOWEO + KVTHOWEL * iLE + KVTHOWEW * iWE + KVTHOWELW * iLE * iWE;
KUOWE = KUOWEO + KUOWEL * iLE + KUOWEW * iWE + KUOWELW * iLE * iWE;
// Geometry scaling with binning scaling rules
if (SWGEO_i == 2) begin
// auxiliary variables
iLEWE = iLE * iWE;
iiLE = LE / `LEN;
iiWE = WE / `WEN;
iiLEWE = iiLE * iiWE;
iiiLEWE = iiWE / iiLE;
// auxiliary variables for COX only
iiLEcv = LEcv / `LEN;
iiWEcv = WEcv / `WEN;
iiLEWEcv = iiLEcv * iiWEcv;
// auxiliary variables for CGOV only
iLEcv = `LEN / LEcv;
iiiLEWEcv = iiWEcv / iiLEcv;
// auxiliary variables for CGBOV only
iiLcv = Lcv / `LEN;
iiWcv = Wcv / `WEN;
iiLWcv = iiLcv * iiWcv;
// auxiliary variables for CFR only
iLcv = `LEN / Lcv;
iiiLWcv = iiWcv / iiLcv;
// Process parameters
VFB_p = POVFB + iLE * PLVFB + iWE * PWVFB + iLEWE * PLWVFB;
STVFB_p = POSTVFB + iLE * PLSTVFB + iWE * PWSTVFB + iLEWE * PLWSTVFB;
ST2VFB_p = POST2VFB;
TOX_p = POTOX;
EPSROX_p = POEPSROX;
NEFF_p = PONEFF + iLE * PLNEFF + iWE * PWNEFF + iLEWE * PLWNEFF;
FACNEFFAC_p = POFACNEFFAC + iLE * PLFACNEFFAC + iWE * PWFACNEFFAC + iLEWE * PLWFACNEFFAC;
GFACNUD_p = POGFACNUD + PLGFACNUD * iLE + PWGFACNUD * iWE + PLWGFACNUD * iLE * iWE;
VSBNUD_p = POVSBNUD;
DVSBNUD_p = PODVSBNUD;
VNSUB_p = POVNSUB;
NSLP_p = PONSLP;
DNSUB_p = PODNSUB;
DPHIB_p = PODPHIB + iLE * PLDPHIB + iWE * PWDPHIB + iLEWE * PLWDPHIB;
DELVTAC_p = PODELVTAC + iLE * PLDELVTAC + iWE * PWDELVTAC + iLEWE * PLWDELVTAC;
NP_p = PONP + iLE * PLNP + iWE * PWNP + iLEWE * PLWNP;
TOXOV_p = POTOXOV;
TOXOVD_p = POTOXOVD;
NOV_p = PONOV + iLE * PLNOV + iWE * PWNOV + iLEWE * PLWNOV;
NOVD_p = PONOVD + iLE * PLNOVD + iWE * PWNOVD + iLEWE * PLWNOVD;
// Interface states parameters
CT_p = POCT + iLE * PLCT + iWE * PWCT + iLEWE * PLWCT;
CTG_p = POCTG;
CTB_p = POCTB;
STCT_p = POSTCT;
// DIBL parameters
CF_p = POCF + iLE * PLCF + iWE * PWCF + iLEWE * PLWCF;
CFAC_p = POCFAC_i + iLE * PLCFAC_i + iWE * PWCFAC_i + iLEWE * PLWCFAC_i;
CFD_p = POCFD;
CFB_p = POCFB;
// Subthreshold slope parameters of short channel transistor
PSCE_p = POPSCE + iLE * PLPSCE + iWE * PWPSCE + iLEWE * PLWPSCE;
PSCEB_p = POPSCEB;
PSCED_p = POPSCED;
// Mobility parameters
BETN_p = iiWE * iLE * (POBETN + iLE * PLBETN + iWE * PWBETN + iLEWE * PLWBETN);
STBET_p = POSTBET + iLE * PLSTBET + iWE * PWSTBET + iLEWE * PLWSTBET;
MUE_p = POMUE + iLE * PLMUE + iWE * PWMUE + iLEWE * PLWMUE;
STMUE_p = POSTMUE;
THEMU_p = POTHEMU;
STTHEMU_p = POSTTHEMU;
CS_p = POCS + iLE * PLCS + iWE * PWCS + iLEWE * PLWCS;
STCS_p = POSTCS;
THECS_p = POTHECS;
STTHECS_p = POSTTHECS;
XCOR_p = POXCOR + iLE * PLXCOR + iWE * PWXCOR + iLEWE * PLWXCOR;
STXCOR_p = POSTXCOR;
FETA_p = POFETA;
// Series resistance parameters
RS_p = PORS + iLE * PLRS + iWE * PWRS + iLEWE * PLWRS;
STRS_p = POSTRS;
RSB_p = PORSB;
RSG_p = PORSG;
// Velocity saturation parameters
THESAT_p = POTHESAT + iLE * PLTHESAT + iWE * PWTHESAT + iLEWE * PLWTHESAT;
THESATAC_p = POTHESATAC_i + iLE * PLTHESATAC_i + iWE * PWTHESATAC_i + iLEWE * PLWTHESATAC_i;
STTHESAT_p = POSTTHESAT + iLE * PLSTTHESAT + iWE * PWSTTHESAT + iLEWE * PLWSTTHESAT;
THESATB_p = POTHESATB + iLE * PLTHESATB + iWE * PWTHESATB + iLEWE * PLWTHESATB;
THESATG_p = POTHESATG + iLE * PLTHESATG + iWE * PWTHESATG + iLEWE * PLWTHESATG;
// Saturation voltage parameters
AX_p = POAX + iLE * PLAX + iWE * PWAX + iLEWE * PLWAX;
AXAC_p = POAXAC_i + iLE * PLAXAC_i + iWE * PWAXAC_i + iLEWE * PLWAXAC_i;
// Channel length modulation (CLM) parameters
ALP_p = POALP + iLE * PLALP + iWE * PWALP + iLEWE * PLWALP;
ALPAC_p = POALPAC_i + iLE * PLALPAC_i + iWE * PWALPAC_i + iLEWE * PLWALPAC_i;
ALP1_p = POALP1 + iLE * PLALP1 + iWE * PWALP1 + iLEWE * PLWALP1;
ALP2_p = POALP2 + iLE * PLALP2 + iWE * PWALP2 + iLEWE * PLWALP2;
VP_p = POVP;
// Impact ionization parameters
A1_p = POA1 + iLE * PLA1 + iWE * PWA1 + iLEWE * PLWA1;
A2_p = POA2;
STA2_p = POSTA2;
A3_p = POA3 + iLE * PLA3 + iWE * PWA3 + iLEWE * PLWA3;
A4_p = POA4 + iLE * PLA4 + iWE * PWA4 + iLEWE * PLWA4;
GCO_p = POGCO;
// Gate current parameters
IGINV_p = POIGINV + iiLE * PLIGINV + iiWE * PWIGINV + iiLEWE * PLWIGINV;
IGOV_p = POIGOV + iLE * PLIGOV + iiWE * PWIGOV + iiiLEWE * PLWIGOV;
IGOVD_p = POIGOVD + iLE * PLIGOVD + iiWE * PWIGOVD + iiiLEWE * PLWIGOVD;
STIG_p = POSTIG;
GC2_p = POGC2;
GC3_p = POGC3;
GC2OV_p = POGC2OV;
GC3OV_p = POGC3OV;
CHIB_p = POCHIB;
// Gate-induced drain leakage (GIDL) parameters
AGIDL_p = POAGIDL + iLE * PLAGIDL + iiWE * PWAGIDL + iiiLEWE * PLWAGIDL;
AGIDLD_p = POAGIDLD + iLE * PLAGIDLD + iiWE * PWAGIDLD + iiiLEWE * PLWAGIDLD;
BGIDL_p = POBGIDL;
BGIDLD_p = POBGIDLD;
STBGIDL_p = POSTBGIDL;
STBGIDLD_p = POSTBGIDLD;
CGIDL_p = POCGIDL;
CGIDLD_p = POCGIDLD;
// Charge model parameters
COX_p = POCOX + iiLEcv * PLCOX + iiWEcv * PWCOX + iiLEWEcv * PLWCOX;
CGOV_p = POCGOV + iLEcv * PLCGOV + iiWEcv * PWCGOV + iiiLEWEcv * PLWCGOV;
CGOVD_p = POCGOVD + iLEcv * PLCGOVD + iiWEcv * PWCGOVD + iiiLEWEcv * PLWCGOVD;
CGBOV_p = POCGBOV + iiLcv * PLCGBOV + iiWcv * PWCGBOV + iiLWcv * PLWCGBOV;
CFR_p = POCFR + iLcv * PLCFR + iiWcv * PWCFR + iiiLWcv * PLWCFR;
CFRD_p = POCFRD + iLcv * PLCFRD + iiWcv * PWCFRD + iiiLWcv * PLWCFRD;
// Noise model parameters
FNT_p = POFNT;
FNTEXC_p = iLE * iLE * (POFNTEXC + iLE * PLFNTEXC + iWE * PWFNTEXC + iLEWE * PLWFNTEXC);
NFA_p = PONFA + iLE * PLNFA + iWE * PWNFA + iLEWE * PLWNFA;
NFB_p = PONFB + iLE * PLNFB + iWE * PWNFB + iLEWE * PLWNFB;
NFC_p = PONFC + iLE * PLNFC + iWE * PWNFC + iLEWE * PLWNFC;
EF_p = POEF;
// Edge transistor: PSP 103.4
VFBEDGE_p = POVFBEDGE;
STVFBEDGE_p = POSTVFBEDGE + iLE * PLSTVFBEDGE + iWE * PWSTVFBEDGE + iLEWE * PLWSTVFBEDGE;
DPHIBEDGE_p = PODPHIBEDGE + iLE * PLDPHIBEDGE + iWE * PWDPHIBEDGE + iLEWE * PLWDPHIBEDGE;
NEFFEDGE_p = PONEFFEDGE + iLE * PLNEFFEDGE + iWE * PWNEFFEDGE + iLEWE * PLWNEFFEDGE;
CTEDGE_p = POCTEDGE + iLE * PLCTEDGE + iWE * PWCTEDGE + iLEWE * PLWCTEDGE;
BETNEDGE_p = iLE * (POBETNEDGE + iLE * PLBETNEDGE + iWE * PWBETNEDGE + iLEWE * PLWBETNEDGE);
STBETEDGE_p = POSTBETEDGE + iLE * PLSTBETEDGE + iWE * PWSTBETEDGE + iLEWE * PLWSTBETEDGE;
PSCEEDGE_p = POPSCEEDGE + iLE * PLPSCEEDGE + iWE * PWPSCEEDGE + iLEWE * PLWPSCEEDGE;
PSCEBEDGE_p = POPSCEBEDGE;
PSCEDEDGE_p = POPSCEDEDGE;
CFEDGE_p = POCFEDGE + iLE * PLCFEDGE + iWE * PWCFEDGE + iLEWE * PLWCFEDGE;
CFDEDGE_p = POCFDEDGE;
CFBEDGE_p = POCFBEDGE;
FNTEDGE_p = POFNTEDGE;
NFAEDGE_p = PONFAEDGE + iLE * PLNFAEDGE + iWE * PWNFAEDGE + iLEWE * PLWNFAEDGE;
NFBEDGE_p = PONFBEDGE + iLE * PLNFBEDGE + iWE * PWNFBEDGE + iLEWE * PLWNFBEDGE;
NFCEDGE_p = PONFCEDGE + iLE * PLNFCEDGE + iWE * PWNFCEDGE + iLEWE * PLWNFCEDGE;
EFEDGE_p = POEFEDGE;
// Well proximity effect parameters
KVTHOWE = POKVTHOWE + iLE * PLKVTHOWE + iWE * PWKVTHOWE + iLEWE * PLWKVTHOWE;
KUOWE = POKUOWE + iLE * PLKUOWE + iWE * PWKUOWE + iLEWE * PLWKUOWE;
end
// Parasitic resistance parameters
if ((SWGEO_i == 1) || (SWGEO_i == 2)) begin
RG_p = RSHG_i * (`oneThird * W_f / NGCON_i + XGWE) / (NGCON_i * L_slif) + (RINT_i + RVPOLY_i) / (W_f * L_f) + NF_i * RGO;
if (SWJUNASYM == 0) begin
RSHD_i = RSH_i;
end
RSE_p = NRS * RSH_i;
RDE_p = NRD * RSHD_i;
RWELL_p = NF_i * RWELLO;
RBULK_p = NF_i * RBULKO;
RJUNS_p = NF_i * RJUNSO;
RJUND_p = NF_i * RJUNDO;
// Self heating effect parameters
`ifdef SelfHeating
deltaRth = RTHW2 + WE / `WEN * (1.0 + RTHLW * LE / `LEN);
deltaRth = `MAX(deltaRth, 1.0e-6);
RTH_p = RTHO + RTHW1 / deltaRth;
CTH_p = CTHO + CTHW1 * (CTHW2 + WE / `WEN * (1.0 + CTHLW * LE / `LEN));
STRTH_p = STRTHO;
`endif // SelfHeating
// NQS parameters
`ifdef NQSmodel
MUNQS_p = MUNQSO;
`endif // NQSmodel
// Mechanical stress model
tmpa = 0.0;
tmpb = 0.0;
loop = 0.0;
if ((SA_i > 0.0) && (SB_i > 0.0) && ((NF_i == 1.0) || ((NF_i > 1.0) && (SD_i > 0.0)))) begin
while (loop < (NF_i - 0.5)) begin
tmpa = tmpa + 1.0 / (SA_i + 0.5 * L_i + loop * (SD_i + L_i));
tmpb = tmpb + 1.0 / (SB_i + 0.5 * L_i + loop * (SD_i + L_i));
loop = loop + 1.0;
end
Invsa = tmpa * invNF;
Invsb = tmpb * invNF;
Invsaref = 1.0 / (SAREF_i + 0.5 * L_i);
Invsbref = 1.0 / (SBREF_i + 0.5 * L_i);
Lx = `MAX(L_i + delLPS, 1.0e-9);
Wx = `MAX(W_i + delWOD + WLOD, 1.0e-9);
templ = 1.0 / pow(Lx, LLODKUO_i);
tempw = 1.0 / pow(Wx, WLODKUO_i);
Kstressu0 = (1.0 + LKUO * templ + WKUO * tempw + PKUO * templ * tempw) * (1.0 + TKUO * (rTa - 1.0));
rhobeta = KUO * (Invsa + Invsb) / Kstressu0;
rhobetaref = KUO * (Invsaref + Invsbref) / Kstressu0;
templ = 1.0 / pow(Lx, LLODVTH_i);
tempw = 1.0 / pow(Wx, WLODVTH_i);
Kstressvth0 = 1.0 + LKVTHO * templ + WKVTHO * tempw + PKVTHO * templ * tempw;
temp0 = Invsa + Invsb - Invsaref - Invsbref;
// Parameter adaptations
temp00 = (1.0 + rhobeta) / (1.0 + rhobetaref);
BETN_p = BETN_p * temp00;
THESAT_p = THESAT_p * temp00 * (1.0 + KVSAT_i * rhobetaref) / (1.0 + KVSAT_i * rhobeta);
THESATAC_p = THESATAC_p * temp00 * (1.0 + KVSATAC_i * rhobetaref) / (1.0 + KVSATAC_i * rhobeta);
BETNEDGE_p = BETNEDGE_p * temp00;
temp00 = KVTHO * temp0 / Kstressvth0;
VFB_p = VFB_p + temp00;
VFBEDGE_p = VFBEDGE_p + temp00;
temp00 = STETAO * temp0 / pow(Kstressvth0, LODETAO_i);
CF_p = CF_p + temp00;
CFAC_p = CFAC_p + temp00;
CFEDGE_p = CFEDGE_p + temp00;
end
// Well proximity effect equations
if ((SCA_i > 0.0) || (SCB_i > 0.0) || (SCC_i > 0.0) || (SC_i > 0.0)) begin
if ((SCA_i == 0.0) && (SCB_i == 0.0) && (SCC_i == 0.0)) begin
temp0 = SC_i + W_i;
temp00 = 1.0 / SCREF_i;
SCA_i = SCREF_i * SCREF_i / (SC_i * temp0);
SCB_i = ((0.1 * SC_i + 0.01 * SCREF_i) * exp(-10.0 * SC_i * temp00) - (0.1 * temp0 + 0.01 * SCREF_i) * exp(-10.0 * temp0 * temp00)) / W_i;
SCC_i = ((0.05 * SC_i + 0.0025 * SCREF_i) * exp(-20.0 * SC_i * temp00) - (0.05 * temp0 + 0.0025 * SCREF_i) * exp(-20.0 * temp0 * temp00)) / W_i;
end
// Parameter adaptations
temp0 = SCA_i + WEB_i * SCB_i + WEC_i * SCC_i;
VFB_p = VFB_p + KVTHOWE * temp0;
BETN_p = BETN_p * (1.0 + KUOWE * temp0);
VFBEDGE_p = VFBEDGE_p + KVTHOWE * temp0;
BETNEDGE_p = BETNEDGE_p * (1.0 + KUOWE * temp0);
end
end
// Internal parameters (including temperature scaling)
// Clipping of the local model parameters
VFB_i = VFB_p;
STVFB_i = STVFB_p;
ST2VFB_i = ST2VFB_p;
TOX_i = `CLIP_LOW(TOX_p, 1.0e-10);
EPSROX_i = `CLIP_LOW(EPSROX_p, 1.0);
NEFF_i = `CLIP_BOTH(NEFF_p, 1.0e20, 1.0e26);
FACNEFFAC_i = `CLIP_LOW(FACNEFFAC_p, 0.0);
GFACNUD_i = `CLIP_LOW(GFACNUD_p, 0.01);
VSBNUD_i = `CLIP_LOW(VSBNUD_p, 0.0);
DVSBNUD_i = `CLIP_LOW(DVSBNUD_p, 0.1);
VNSUB_i = VNSUB_p;
NSLP_i = `CLIP_LOW(NSLP_p, 1.0e-3);
DNSUB_i = `CLIP_BOTH(DNSUB_p, 0.0, 1.0);
DPHIB_i = DPHIB_p;
DELVTAC_i = DELVTAC_p;
NP_i = `CLIP_LOW(NP_p, 0.0);
TOXOV_i = `CLIP_LOW(TOXOV_p, 1.0e-10);
TOXOVD_i = `CLIP_LOW(TOXOVD_p, 1.0e-10);
NOV_i = `CLIP_BOTH(NOV_p, 1.0e23, 1.0e27);
NOVD_i = `CLIP_BOTH(NOVD_p, 1.0e23, 1.0e27);
CT_i = `CLIP_LOW(CT_p, 0.0);
CTG_i = `CLIP_LOW(CTG_p, 0.0);
CTB_i = CTB_p;
STCT_i = STCT_p;
CF_i = `CLIP_LOW(CF_p, 0.0);
CFAC_i = `CLIP_LOW(CFAC_p, 0.0);
CFD_i = `CLIP_LOW(CFD_p, 0.0);
CFB_i = `CLIP_BOTH(CFB_p, 0.0, 1.0);
PSCE_i = `CLIP_LOW(PSCE_p, 0.0);
PSCEB_i = `CLIP_BOTH(PSCEB_p, 0.0, 1.0);
PSCED_i = `CLIP_LOW(PSCED_p, 0.0);
BETN_i = `CLIP_LOW(BETN_p, 0.0);
STBET_i = STBET_p;
MUE_i = `CLIP_LOW(MUE_p, 0.0);
STMUE_i = STMUE_p;
THEMU_i = `CLIP_LOW(THEMU_p, 0.0);
STTHEMU_i = STTHEMU_p;
CS_i = `CLIP_LOW(CS_p, 0.0);
STCS_i = STCS_p;
THECS_i = `CLIP_LOW(THECS_p, 0.0);
STTHECS_i = STTHECS_p;
XCOR_i = `CLIP_LOW(XCOR_p, 0.0);
STXCOR_i = STXCOR_p;
FETA_i = `CLIP_LOW(FETA_p, 0.0);
RS_i = `CLIP_LOW(RS_p, 0.0);
STRS_i = STRS_p;
RSB_i = `CLIP_BOTH(RSB_p, -0.5, 1.0);
RSG_i = `CLIP_LOW(RSG_p, -0.5);
THESAT_i = `CLIP_LOW(THESAT_p, 0.0);
THESATAC_i = `CLIP_LOW(THESATAC_p, 0.0);
STTHESAT_i = STTHESAT_p;
THESATB_i = `CLIP_BOTH(THESATB_p, -0.5, 1.0);
THESATG_i = `CLIP_LOW(THESATG_p, -0.5);
AX_i = `CLIP_LOW(AX_p, 2.0);
AXAC_i = `CLIP_LOW(AXAC_p, 2.0);
ALP_i = `CLIP_LOW(ALP_p, 0.0);
ALPAC_i = `CLIP_LOW(ALPAC_p, 0.0);
ALP1_i = `CLIP_LOW(ALP1_p, 0.0);
ALP2_i = `CLIP_LOW(ALP2_p, 0.0);
VP_i = `CLIP_LOW(VP_p, 1.0e-10);
A1_i = `CLIP_LOW(A1_p, 0.0);
A2_i = `CLIP_LOW(A2_p, 0.0);
STA2_i = STA2_p;
A3_i = `CLIP_LOW(A3_p, 0.0);
A4_i = `CLIP_LOW(A4_p, 0.0);
GCO_i = `CLIP_BOTH(GCO_p, -10.0, 10.0);
IGINV_i = `CLIP_LOW(IGINV_p, 0.0);
IGOV_i = `CLIP_LOW(IGOV_p, 0.0);
IGOVD_i = `CLIP_LOW(IGOVD_p, 0.0);
STIG_i = STIG_p;
GC2_i = `CLIP_BOTH(GC2_p, 0.0, 10.0);
GC3_i = `CLIP_BOTH(GC3_p, -10.0, 10.0);
GC2OV_i = GC2_i;
GC3OV_i = GC3_i;
if (SWIGATE_i == 2) begin
GC2OV_i = `CLIP_BOTH(GC2OV_p, 0.0, 10.0);
GC3OV_i = `CLIP_BOTH(GC3OV_p, -10.0, 10.0);
end
CHIB_i = `CLIP_LOW(CHIB_p, 1.0);
AGIDL_i = `CLIP_LOW(AGIDL_p, 0.0);
AGIDLD_i = `CLIP_LOW(AGIDLD_p, 0.0);
BGIDL_i = `CLIP_LOW(BGIDL_p, 0.0);
BGIDLD_i = `CLIP_LOW(BGIDLD_p, 0.0);
STBGIDL_i = STBGIDL_p;
STBGIDLD_i = STBGIDLD_p;
CGIDL_i = CGIDL_p;
CGIDLD_i = CGIDLD_p;
COX_i = `CLIP_LOW(COX_p, 0.0);
CGOV_i = `CLIP_LOW(CGOV_p, 0.0);
CGOVD_i = `CLIP_LOW(CGOVD_p, 0.0);
CGBOV_i = `CLIP_LOW(CGBOV_p, 0.0);
CFR_i = `CLIP_LOW(CFR_p, 0.0);
CFRD_i = `CLIP_LOW(CFRD_p, 0.0);
FNT_i = `CLIP_LOW(FNT_p, 0.0);
FNTEXC_i = `CLIP_LOW(FNTEXC_p, 0.0);
NFA_i = `CLIP_LOW(NFA_p, 0.0);
NFB_i = `CLIP_LOW(NFB_p, 0.0);
NFC_i = `CLIP_LOW(NFC_p, 0.0);
EF_i = `CLIP_LOW(EF_p, 0.0);
VFBEDGE_i = VFBEDGE_p;
STVFBEDGE_i = STVFBEDGE_p;
DPHIBEDGE_i = DPHIBEDGE_p;
NEFFEDGE_i = `CLIP_BOTH(NEFFEDGE_p, 1.0e20, 1.0e26);
CTEDGE_i = `CLIP_LOW(CTEDGE_p, 0.0);
BETNEDGE_i = `CLIP_LOW(BETNEDGE_p, 0.0);
STBETEDGE_i = STBETEDGE_p;
PSCEEDGE_i = `CLIP_LOW(PSCEEDGE_p, 0.0);
PSCEBEDGE_i = `CLIP_BOTH(PSCEBEDGE_p, 0.0, 1.0);
PSCEDEDGE_i = `CLIP_LOW(PSCEDEDGE_p, 0.0);
CFEDGE_i = `CLIP_LOW(CFEDGE_p, 0.0);
CFDEDGE_i = `CLIP_LOW(CFDEDGE_p, 0.0);
CFBEDGE_i = `CLIP_BOTH(CFBEDGE_p, 0.0, 1.0);
FNTEDGE_i = `CLIP_LOW(FNTEDGE_p, 0.0);
NFAEDGE_i = `CLIP_LOW(NFAEDGE_p, 0.0);
NFBEDGE_i = `CLIP_LOW(NFBEDGE_p, 0.0);
NFCEDGE_i = `CLIP_LOW(NFCEDGE_p, 0.0);
EFEDGE_i = `CLIP_LOW(EFEDGE_p, 0.0);
RG_i = `CLIP_LOW(RG_p, 0.0);
RSE_i = `CLIP_LOW(RSE_p, 0.0);
RDE_i = `CLIP_LOW(RDE_p, 0.0);
RBULK_i = `CLIP_LOW(RBULK_p, 0.0);
RJUNS_i = `CLIP_LOW(RJUNS_p, 0.0);
RJUND_i = `CLIP_LOW(RJUND_p, 0.0);
RWELL_i = `CLIP_LOW(RWELL_p, 0.0);
`ifdef SelfHeating
RTH_i = `CLIP_LOW(RTH_p, 1.0e-4);
CTH_i = `CLIP_LOW(CTH_p, 0.0);
STRTH_i = STRTH_p;
`endif // SelfHeating
MULT_i = `CLIP_LOW(MULT * NF_i, 0.0); // Note: NF_i is set to 1 for local model
FACTUO_i = `CLIP_LOW(FACTUO, 0.0);
DELVTO_i = DELVTO;
FACTUOEDGE_i = `CLIP_LOW(FACTUOEDGE, 0.0);
DELVTOEDGE_i = DELVTOEDGE;
`ifdef NQSmodel
MUNQS_i = `CLIP_LOW(MUNQS_p, 0.0);
`endif // NQSmodel
// Ignore drain-side values in case of symmetric junctions
if (SWJUNASYM_i == 0) begin
TOXOVD_i = TOXOV_i;
NOVD_i = NOV_i;
AGIDLD_i = AGIDL_i;
BGIDLD_i = BGIDL_i;
STBGIDLD_i = STBGIDL_i;
CGIDLD_i = CGIDL_i;
IGOVD_i = IGOV_i;
CGOVD_i = CGOV_i;
CFRD_i = CFR_i;
end

View File

@ -0,0 +1,54 @@
//======================================================================================
//======================================================================================
// Filename: psp103.va
//======================================================================================
//======================================================================================
//
// (c) Copyright notice
//
// Since 2015 until today, PSP has been co-developed by NXP Semiconductors and
// CEA-Leti. For this part of the model, each claim undivided ownership and copyrights
// Since 2012 until 2015, PSP has been co-developed by NXP Semiconductors and
// Delft University of Technology. For this part of the model, each claim undivided
// ownership and copyrights
// Until and including 2011, PSP has been co-developed by NXP Semiconductors and
// Arizona State University. For this part of the model, NXP Semiconductors claims
// undivided ownership and copyrights.
//
//
// Version: 103.7.0 (PSP), 200.6.0 (JUNCAP), April 2019
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file releasenotesPSP103.txt
//
`include "discipline.h"
//`define NQSmodel true
//`define SelfHeating true
`include "Common103_macrodefs.include"
`include "JUNCAP200_macrodefs.include"
`include "PSP103_macrodefs.include"
// Note: some verilog-A compilers have problems handling the ddx-operator,
// which occurs in definition of OP-output variables. If the line below is
// commented out, all OP-output variables using the ddx-operator are skipped.
`define OPderiv
/////////////////////////////////////////////////////////////////////////////
//
// PSP global model code
//
/////////////////////////////////////////////////////////////////////////////
module PSP103VA(D, G, S, B);
`include "PSP103_module.include"
endmodule

View File

@ -0,0 +1,206 @@
======================================================================================
======================================================================================
Silicon Integration Initiative (Si2)
Compact Model Coalition In-Code Statement
Software is distributed as is, completely without warranty or service support. The
Commissariat a l'energie atomique et aux energies alternatives (CEA), NXP
Semiconductors, and Delft University of Technology, along with their employees are
not liable for the condition or performance of the software.
NXP Semiconductors, Delft University of Technology, and CEA own the copyright and
grant users a perpetual, irrevocable, worldwide, non-exclusive, royalty-free license
with respect to the software as set forth below.
NXP Semiconductors, Delft University of Technology, and CEA hereby disclaim all
implied warranties.
NXP Semiconductors, Delft University of Technology, and CEA grant the users the right
to modify, copy, and redistribute the software and documentation, both within the
user's organization and externally, subject to the following restrictions:
1. The users agree not to charge for the NXP Semiconductors, Delft University of
Technology, and CEA-developed code itself but may charge for additions,
extensions, or support.
2. In any product based on the software, the users agree to acknowledge NXP
Semiconductors, Delft University of Technology, and CEA that developed the
software. This acknowledgement shall appear in the product documentation.
3. Redistributions to others of source code and documentation must retain the
copyright notice, disclaimer, and list of conditions.
4. Redistributions to others in binary form must reproduce the copyright notice,
disclaimer, and list of conditions in the documentation and/or other materials
provided with the distribution.
CMC In-Code Statement Revision: 103.7.0 (PSP), 04/29/2019
200.6.0 (JUNCAP),04/29/2019
======================================================================================
======================================================================================
Authors: G.D.J. Smit, A.J. Scholten, and D.B.M. Klaassen (NXP Semiconductors)
O. Rozeau, S. Martinie, T. Poiroux, J.C. Barbé (CEA-Leti)
Former contributers:
G. Gildenblat, W. Yao, Z. Zhu, X. Li and W. Wu (Arizona State University)
R. van Langevelde (Philips Research)
R. van der Toorn (Delft University of Technology)
The most recent version of the model code, the documentation, and contact
information can be found on:
http://www.cea.fr/cea-tech/leti/pspsupport
======================================================================================
======================================================================================
This package consists of the following files:
- releasenotesPSP103.txt This file
- psp103.va Main file for PSP model
- psp103t.va Main file for PSP model with self heating
- psp103_nqs.va Main file for PSP model with NQS-effects
- juncap200.va Main file for JUNCAP2 stand-alone model
- Common103_macrodefs.include Common macro definitions
- PSP103_macrodefs.include Macro definitions for PSP
- PSP103_module.include Actual model code for intrinsic MOS model
- PSP103_parlist.include Model parameter list for PSP model
- PSP103_scaling.include Geometry scaling equations for PSP model
- PSP103_nqs_macrodefs.include Macro definitions for PSP-NQS
- PSP103_InitNQS.include PSP-NQS initialization code
- PSP103_ChargesNQS.include Calculation of NQS-charge contributions
- JUNCAP200_macrodefs.include Macro definitions for JUNCAP2 model
- JUNCAP200_parlist.include JUNCAP2 parameter list
- JUNCAP200_varlist.include JUNCAP2 variable declarations
- JUNCAP200_InitModel.include JUNCAP2 model initialization code
======================================================================================
======================================================================================
Usage
-----
Depending which model one wants to use, one should compile one of the four .va-files
(psp103.va, psp103t.va, psp103_nqs.va, and juncap200.va). The module names are
"PSP103VA", "PSP103TVA", and "PSPNQS103VA" (for QS, self heating, and NQS,
respectively), and "JUNCAP200" for the JUNCAP2-model.
======================================================================================
======================================================================================
Release notes vA-code of PSP 103.7.0 (April 2019)
---------------------------------------------------------
Changes include
- More efficient calculations of Vdsp and Vdspedge
- Additional parameters for overlaps gate leakage currents
- Charge partitioning: new switch parameter SWQPART to modify the charge
partitioning between the drain and the source
- Additional parameters for charge model decoupling to improve CV description
- Minor modification on code files organization
- PSP103_macrodefs.include:
- Addition of variable declarations in SPcalcLocalVarDecl macro: line 280
- Calculation of THESATAC_T: line 390
- Includes SPCalculation.include file as a new macro called "SPCalculation"
- PSP103_parlist.include:
- New file including PSP103_binpars.include and model parameter declaration from
PSP103_module.include
- Addition of new parameters SWQSAT, SWQPART, CFAC, THESATAC, AXAC, ALPAC, GC2OV,
GC3OV, CFACL, CFACLEXP, CFACW, THESATACO, THESATACL, THESATACLEXP, THESATACW,
THESATACLW, AXACO, AXACL, ALPACL, ALPACLEXP, ALPACW, GC2OVO, GC3OVO, POCFAC,
PLCFAC, PWCFAC, PLWCFAC, POTHESATAC, PLTHESATAC, PWTHESATAC, PLWTHESATAC,
POAXAC, PLAXAC, PWAXAC, PLWAXAC, POGC2OV, POGC3OV, KVSATAC
- PSP103_scaling.include:
- New file including PSP103_binning.include and geometry scaling equations from
PSP103_module.include
- Addition of new internal local parameters, associated scaling rules and clipped
variables: CFAC_p, THESATAC_p, AXAC_p, ALPAC_p, GC2OV_p, GC3OV_p, CFAC_i,
THESATAC_i, AXAC_i, ALPAC_i, GC2OV_i, GC3OV_i
- Introduction of mechanical stress effect on THESATAC_p and CFAC_p. Minor
modifications of the stress model using the internal variable temp00.
- PSP103_module.include:
- New OP-output variables: lp_cfac, lp_thesatac, lp_axac, lp_alpac, lp_gc2ov,
lp_gc3ov: lines 399, 423, 428, 430, 446, 447, 2128, 2152, 2157, 2159, 2175, 2176.
- New max clipping value of SWIGATE_i: line 542
- New variables SWQSAT_i, SWQPART_i: lines 150, 550 and 551
- Calculation of internal global-binning parameters for the charge model: lines 619
to 651
- Calculation of GCQOV variable for overlap gate leakage currents: lines 237, 782
to 788
- New variable declaration for charge model THESATAC_T: lines 225 and 1040
- Vgb is now calculated in line 1089
- Modifications for overlaps leakage currents GC2_i, GC3_i and GCQ are replaced by
GC2OV_i, GC3OV_i and GCQOV: lines 1209 to 1246
- New calculation of Vdspedge: line 1344
- Calculation of cfloc, thesatloc, axloc and alploc: lines 1136 to 1139, lines 1403 to
1406 and lines 1418 to 1421
- Modification of the condition "SWDELVTAC_i != 0" ("else" case was cancelled): lines
1408 to 1415
- Addition of the condition "SWQSAT_i != 0" for Q-model decoupling in saturation: lines
1417 to 1422
- Addition of the condition "SWQPART_i == 1.0" for charge partitioning and calculation
of the new charge partitioning: lines 1484 to 1490
- PSP103_SPCalculation.include: cancelled file
- PSP103_binpars.include: cancelled file
- PSP103_binning.include: cancelled file
PSP 103.7.0 is backwards compatible with the previous version, PSP 103.6.0
======================================================================================
======================================================================================
Release notes vA-code of JUNCAP 200.6.0 (April 2019)
---------------------------------------------------------
Change includes:
- Bug fix on juncap express model (induced by negative values of MFOR2 and
ISATFOR2 variables)
- Addition of 2 multiplier factors for current IFACTOR and charge CFACTOR
- JUNCAP200_parlist.include:
- Declaration of 2 new model parameters IFACTOR and CFACTOR: lines 36 and 37
- JUNCAP200_varlist1.include: cancelled file
- JUNCAP200_varlist2.include: cancelled file
- JUNCAP200_varlist.include:
- New file including JUNCAP200_varlist1.include and JUNCAP200_varlist2.include
- JUNCAP200_macrodefs.include:
- Definition of 2 new constants IFACTOR_cliplow and CFACTOR_cliplow: lines 57
and 58
- Addition of CFACTOR in the calculation of Qjprime: line 221
- Addition of IFACTOR in the calculation of Ijprime: line 276
- Modification of condition for calculation of MFOR2 and ISATFOR2 variables
to avoid a bug on juncap express model.
- JUNCAP200_InitModel.include:
- Addition of cliiped variables IFACTOR_i and CFACTOR_i: lines 36 and 37
- juncap200.va:
- Included new file for variable declarations: line 81
JUNCAP 200.6.0 is backwards compatible with the previous version, JUNCAP 200.5.0
=====================================================================================
======================================================================================
The authors want to thank Laurent Lemaitre and Colin McAndrew (Freescale)
for their help with ADMS and the implementation of the model code. Geoffrey
Coram (Analog Devices) is acknowledged for input concerning the Verilog-A
implementation of the model.

View File

@ -130,6 +130,7 @@ extern struct coreInfo_t coreInfo; /* cmexport.c */
#include "adms/mextram/bjt504titf.h"
#include "adms/ekv/ekvitf.h"
#include "adms/psp102/psp102itf.h"
#include "adms/psp103/psp103itf.h"
#include "adms/bsimbulk/bsimbulkitf.h"
#include "adms/bsimcmg/bsimcmgitf.h"
#endif
@ -213,6 +214,7 @@ static SPICEdev *(*static_devices[])(void) = {
(SPICEdev *(*)(void)) get_bjt504t_info,
(SPICEdev *(*)(void)) get_ekv_info,
(SPICEdev *(*)(void)) get_psp102_info,
(SPICEdev *(*)(void)) get_psp103_info,
(SPICEdev *(*)(void)) get_bsimbulk_info,
(SPICEdev *(*)(void)) get_bsimcmg_info,
#endif
@ -302,7 +304,7 @@ SPICEdev ** devices(void)
#define DEVICES_USED {"asrc", "bjt", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v5", "bsim4v6", "bsim4v7", \
"bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", "hisim2", "hisimhv1", "hisimhv2", \
"cap", "cccs", "ccvs", "csw", "dio", "hfet", "hfet2", "ind", "isrc", "jfet", "ltra", "mes", "mesa" ,"mos1", "mos2", "mos3", \
"mos6", "mos9", "res", "soi3", "sw", "tra", "urc", "vccs", "vcvs", "vsrc", "hicum0", "bjt504t", "ekv", "psp102", "bsimbulk", "bsimcmg"}
"mos6", "mos9", "res", "soi3", "sw", "tra", "urc", "vccs", "vcvs", "vsrc", "hicum0", "bjt504t", "ekv", "psp102", "psp103", "bsimbulk", "bsimcmg"}
#else
#define DEVICES_USED {"asrc", "bjt", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v5", "bsim4v6", "bsim4v7", \
"bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", "hisim2", "hisimhv1", "hisimhv2", \

View File

@ -145,6 +145,7 @@ INP2M(CKTcircuit *ckt, INPtables *tab, struct card *current)
#ifdef ADMS
thismodel->INPmodType != INPtypelook("ekv") &&
thismodel->INPmodType != INPtypelook("psp102") &&
thismodel->INPmodType != INPtypelook("psp103") &&
thismodel->INPmodType != INPtypelook("bsimbulk") &&
thismodel->INPmodType != INPtypelook("bsimcmg") &&
#endif

View File

@ -367,7 +367,6 @@ char *INPdomodel(CKTcircuit *ckt, struct card *image, INPtables * tab)
}
break;
case 45:
case 69:
type = INPtypelook("psp102");
if (type < 0) {
err =
@ -375,6 +374,14 @@ char *INPdomodel(CKTcircuit *ckt, struct card *image, INPtables * tab)
("Device type PSP102 not available in this binary\n");
}
break;
case 69:
type = INPtypelook("psp103");
if (type < 0) {
err =
INPmkTemp
("Device type PSP103 not available in this binary\n");
}
break;
#endif
case 55:
type = INPtypelook("B3SOIFD");