diff --git a/configure.ac b/configure.ac index ce4fe3c55..e82274ae5 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/src/spicelib/devices/adms/admst/ngspiceVersion.xml b/src/spicelib/devices/adms/admst/ngspiceVersion.xml index 26001c2b2..6ae5f49dc 100644 --- a/src/spicelib/devices/adms/admst/ngspiceVersion.xml +++ b/src/spicelib/devices/adms/admst/ngspiceVersion.xml @@ -1943,6 +1943,12 @@ + + + + + + @@ -2094,6 +2100,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/spicelib/devices/adms/psp103/admsva/Common103_macrodefs.include b/src/spicelib/devices/adms/psp103/admsva/Common103_macrodefs.include new file mode 100644 index 000000000..9f86b8c8d --- /dev/null +++ b/src/spicelib/devices/adms/psp103/admsva/Common103_macrodefs.include @@ -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); diff --git a/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_InitModel.include b/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_InitModel.include new file mode 100644 index 000000000..3326002f5 --- /dev/null +++ b/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_InitModel.include @@ -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 diff --git a/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_macrodefs.include b/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_macrodefs.include new file mode 100644 index 000000000..037edf40a --- /dev/null +++ b/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_macrodefs.include @@ -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 + diff --git a/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_parlist.include b/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_parlist.include new file mode 100644 index 000000000..d953fd91c --- /dev/null +++ b/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_parlist.include @@ -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 diff --git a/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_varlist.include b/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_varlist.include new file mode 100644 index 000000000..ddb410eac --- /dev/null +++ b/src/spicelib/devices/adms/psp103/admsva/JUNCAP200_varlist.include @@ -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 diff --git a/src/spicelib/devices/adms/psp103/admsva/PSP103_ChargesNQS.include b/src/spicelib/devices/adms/psp103/admsva/PSP103_ChargesNQS.include new file mode 100644 index 000000000..c992f3591 --- /dev/null +++ b/src/spicelib/devices/adms/psp103/admsva/PSP103_ChargesNQS.include @@ -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); + diff --git a/src/spicelib/devices/adms/psp103/admsva/PSP103_InitNQS.include b/src/spicelib/devices/adms/psp103/admsva/PSP103_InitNQS.include new file mode 100644 index 000000000..afa95af47 --- /dev/null +++ b/src/spicelib/devices/adms/psp103/admsva/PSP103_InitNQS.include @@ -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 diff --git a/src/spicelib/devices/adms/psp103/admsva/PSP103_macrodefs.include b/src/spicelib/devices/adms/psp103/admsva/PSP103_macrodefs.include new file mode 100644 index 000000000..6311aa2a1 --- /dev/null +++ b/src/spicelib/devices/adms/psp103/admsva/PSP103_macrodefs.include @@ -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) */ + diff --git a/src/spicelib/devices/adms/psp103/admsva/PSP103_module.include b/src/spicelib/devices/adms/psp103/admsva/PSP103_module.include new file mode 100644 index 000000000..e0267c09a --- /dev/null +++ b/src/spicelib/devices/adms/psp103/admsva/PSP103_module.include @@ -0,0 +1,2319 @@ +//====================================================================================== +//====================================================================================== +// Filename: PSP103_module.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 +// +// -------------------------------------------------------------------------------------------------------------- +// Node definitions +// -------------------------------------------------------------------------------------------------------------- + +`ifdef SelfHeating + inout D, G, S, B, DT; +`else // SelfHeating + inout D, G, S, B; +`endif // SelfHeating +electrical D; +electrical G; +electrical S; +electrical B; +`ifdef SelfHeating + thermal DT; + branch (DT) br_rth, br_ith; +`endif // SelfHeating + +// Internal nodes and branches for correlated drain and gate noise +electrical NOI; +branch (NOI) NOII; +branch (NOI) NOIR; +branch (NOI) NOIC; + +// Internal nodes for gate and bulk resistors +electrical GP; +electrical SI; +electrical DI; +electrical BP; +electrical BI; +electrical BS; +electrical BD; + +// Internal nodes and branches for spline collocation (NQS) +`ifdef NQSmodel + electrical INT1; + electrical INT2; + electrical INT3; + electrical INT4; + electrical INT5; + electrical INT6; + electrical INT7; + electrical INT8; + electrical INT9; + branch(INT1) SPLINE1; + branch(INT2) SPLINE2; + branch(INT3) SPLINE3; + branch(INT4) SPLINE4; + branch(INT5) SPLINE5; + branch(INT6) SPLINE6; + branch(INT7) SPLINE7; + branch(INT8) SPLINE8; + branch(INT9) SPLINE9; + branch(INT1) RES1; + branch(INT2) RES2; + branch(INT3) RES3; + branch(INT4) RES4; + branch(INT5) RES5; + branch(INT6) RES6; + branch(INT7) RES7; + branch(INT8) RES8; + branch(INT9) RES9; +`endif // NQSmodel + + + +// -------------------------------------------------------------------------------------------------------------- +// Instance parameters +// -------------------------------------------------------------------------------------------------------------- + +// Instance parameters for global and binning models only +`IPRco(L ,1.0e-5 ,"m" ,1.0e-9 ,inf ,"Design length") +`IPRco(W ,1.0e-5 ,"m" ,1.0e-9 ,inf ,"Design width") +`IPRnb(SA ,0.0 ,"m" ,"Distance between OD-edge and poly from one side") +`IPRnb(SB ,0.0 ,"m" ,"Distance between OD-edge and poly from other side") +`IPRnb(SD ,0.0 ,"m" ,"Distance between neighbouring fingers") +`IPRcz(SCA ,0.0 ,"" ,"Integral of the first distribution function for scattered well dopants") +`IPRcz(SCB ,0.0 ,"" ,"Integral of the second distribution function for scattered well dopants") +`IPRcz(SCC ,0.0 ,"" ,"Integral of the third distribution function for scattered well dopants") +`IPRnb(SC ,0.0 ,"m" ,"Distance between OD-edge and nearest well edge") +`IPRco(NF ,1.0 ,"" ,1.0 ,inf ,"Number of fingers") +`IPRcc(NGCON ,1.0 ,"" ,1.0 ,2.0 ,"Number of gate contacts") +`IPRnb(XGW ,1.0e-7 ,"m" ,"Distance from the gate contact to the channel edge") +`IPRnb(NRS ,0.0 ,"" ,"Number of squares of source diffusion") +`IPRnb(NRD ,0.0 ,"" ,"Number of squares of drain diffusion") + +// Instance parameters for local model only +`IPRco(JW ,1.0e-6 ,"m" ,`LG_cliplow ,inf ,"Gate-edge length of source/drain junction") + +// Instance parameters for global, binning, and local models +`IPRnb(DELVTO ,0.0 ,"V" ,"Threshold voltage shift parameter") +`IPRcz(FACTUO ,1.0 ,"" ,"Zero-field mobility pre-factor") +`IPRnb(DELVTOEDGE ,0.0 ,"V" ,"Threshold voltage shift parameter of edge transistor") +`IPRcz(FACTUOEDGE ,1.0 ,"" ,"Zero-field mobility pre-factor of edge transistor") +`IPRco(ABSOURCE ,1.0e-12 ,"m^2" ,`AB_cliplow ,inf ,"Bottom area of source junction") +`IPRco(LSSOURCE ,1.0e-6 ,"m" ,`LS_cliplow ,inf ,"STI-edge length of source junction") +`IPRco(LGSOURCE ,1.0e-6 ,"m" ,`LG_cliplow ,inf ,"Gate-edge length of source junction") +`IPRco(ABDRAIN ,1.0e-12 ,"m^2" ,`AB_cliplow ,inf ,"Bottom area of drain junction") +`IPRco(LSDRAIN ,1.0e-6 ,"m" ,`LS_cliplow ,inf ,"STI-edge length of drain junction") +`IPRco(LGDRAIN ,1.0e-6 ,"m" ,`LG_cliplow ,inf ,"Gate-edge length of drain junction") +`IPRco(AS ,1.0e-12 ,"m^2" ,`AB_cliplow ,inf ,"Bottom area of source junction") +`IPRco(PS ,1.0e-6 ,"m" ,`LS_cliplow ,inf ,"Perimeter of source junction") +`IPRco(AD ,1.0e-12 ,"m^2" ,`AB_cliplow ,inf ,"Bottom area of drain junction") +`IPRco(PD ,1.0e-6 ,"m" ,`LS_cliplow ,inf ,"Perimeter of drain junction") +`IPRco(MULT ,1.0 ,"" ,0.0 ,inf ,"Number of devices in parallel") + +// -------------------------------------------------------------------------------------------------------------- +// PSP Model Parameters +// -------------------------------------------------------------------------------------------------------------- +`include "PSP103_parlist.include" + +// -------------------------------------------------------------------------------------------------------------- +// JUNCAP Model Parameters +// -------------------------------------------------------------------------------------------------------------- +`include "JUNCAP200_parlist.include" + +// -------------------------------------------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------------------------------------------- + +// Variables for switch (initial_model parts) +integer CHNL_TYPE, SWGEO_i, SWIGATE_i, SWIMPACT_i, SWGIDL_i, SWJUNCAP_i, SWJUNASYM_i, SWNUD_i, SWEDGE_i, SWDELVTAC_i; +integer SWQSAT_i, SWQPART_i, SWIGN_i; + +// Instance local variables +real NF_i, invNF, L_i, W_i, SA_i, SB_i, SD_i, SC_i, XGW_i, JW_i, SCA_i, SCB_i, SCC_i, NGCON_i, MULT_i, FACTUO_i, DELVTO_i; +real FACTUOEDGE_i, DELVTOEDGE_i; + +// Instance local variables for juncap +real ABS_i, LSS_i, LGS_i, ABD_i, LSD_i, LGD_i, jwcorr, jww; + +// Variables of clipped global model parameters +real TOXO_i, EPSROXO_i, NSUBO_i, WSEG_i, NPCK_i, WSEGP_i, LPCK_i, TOXOVO_i, TOXOVDO_i, LOV_i, LOVD_i, LP1_i, LP2_i, WBET_i; +real AXL_i, ALP1L2_i, ALP2L2_i, SAREF_i, SBREF_i, KVSAT_i, LLODKUO_i, WLODKUO_i, LLODVTH_i, WLODVTH_i, LODETAO_i, SCREF_i; +real WEB_i, WEC_i, RSHG_i, RSH_i, RSHD_i, RINT_i, RVPOLY_i, NSUBEDGEO_i, LPEDGE_i; + +// Variables of internal global-binning parameters of charge model +real CFACL_i, CFACW_i, CFACLEXP_i, THESATACO_i, THESATACL_i, THESATACLEXP_i, THESATACW_i, THESATACLW_i, AXACO_i, AXACL_i, ALPACL_i; +real ALPACLEXP_i, ALPACW_i, POCFAC_i, PLCFAC_i, PWCFAC_i, PLWCFAC_i, POTHESATAC_i, PLTHESATAC_i, PWTHESATAC_i, PLWTHESATAC_i; +real POAXAC_i, PLAXAC_i, PWAXAC_i, PLWAXAC_i, POALPAC_i, PLALPAC_i, PWALPAC_i, PLWALPAC_i, KVSATAC_i; + +// Variables of local model parameters +real VFB_p, STVFB_p, ST2VFB_p, TOX_p, EPSROX_p, NEFF_p, FACNEFFAC_p, GFACNUD_p, VSBNUD_p, DVSBNUD_p, VNSUB_p, NSLP_p, DNSUB_p; +real DPHIB_p, DELVTAC_p, NP_p, CT_p, CTG_p, CTB_p, STCT_p, TOXOV_p, TOXOVD_p, NOV_p, NOVD_p, PSCE_p, PSCED_p, PSCEB_p, CF_p, CFAC_p; +real CFD_p, CFB_p, BETN_p, STBET_p, MUE_p, STMUE_p, THEMU_p, STTHEMU_p, CS_p, STCS_p, THECS_p, STTHECS_p, XCOR_p, STXCOR_p; +real FETA_p, RS_p, STRS_p, RSB_p, RSG_p, THESAT_p, THESATAC_p, STTHESAT_p, THESATB_p, THESATG_p, AX_p, AXAC_p, ALP_p, ALPAC_p; +real ALP1_p, ALP2_p, VP_p, A1_p, A2_p, STA2_p, A3_p, A4_p, GCO_p, IGINV_p, IGOV_p, IGOVD_p, STIG_p, GC2_p, GC3_p, GC2OV_p, GC3OV_p; +real CHIB_p, AGIDL_p, AGIDLD_p, BGIDL_p, BGIDLD_p, STBGIDL_p, STBGIDLD_p, CGIDL_p, CGIDLD_p, COX_p, CGOV_p, CGOVD_p, CGBOV_p, CFR_p; +real CFRD_p, FNT_p, FNTEXC_p, NFA_p, NFB_p, NFC_p, EF_p, VFBEDGE_p, STVFBEDGE_p, DPHIBEDGE_p, NEFFEDGE_p, CTEDGE_p, BETNEDGE_p; +real STBETEDGE_p, PSCEEDGE_p, PSCEBEDGE_p, PSCEDEDGE_p, CFEDGE_p, CFDEDGE_p, CFBEDGE_p, FNTEDGE_p, NFAEDGE_p, NFBEDGE_p, NFCEDGE_p; +real EFEDGE_p, RG_p, RSE_p, RDE_p, RWELL_p, RBULK_p, RJUNS_p, RJUND_p; +`ifdef SelfHeating + real RTH_p, CTH_p, STRTH_p; +`endif // SelfHeating +`ifdef NQSmodel + real MUNQS_p; +`endif // NQSmodel + +// Variables of clipped local model parameters +real TR_i, QMC_i, VFB_i, STVFB_i, ST2VFB_i, STCT_i, TOX_i, EPSROX_i, NEFF_i, FACNEFFAC_i, GFACNUD_i, VSBNUD_i, DVSBNUD_i, VNSUB_i, NSLP_i; +real DNSUB_i, DPHIB_i, DELVTAC_i, NP_i, CT_i, CTG_i, CTB_i, TOXOV_i, TOXOVD_i, NOV_i, NOVD_i, CF_i, CFAC_i, CFD_i, CFB_i, PSCE_i, PSCEB_i; +real PSCED_i, BETN_i, STBET_i, MUE_i, STMUE_i, THEMU_i, STTHEMU_i, CS_i, STCS_i, THECS_i, STTHECS_i, XCOR_i, STXCOR_i, FETA_i, RS_i, STRS_i; +real RSB_i, RSG_i, THESAT_i, THESATAC_i, STTHESAT_i, THESATB_i, THESATG_i, AX_i, AXAC_i, ALP_i, ALPAC_i, ALP1_i, ALP2_i, VP_i, A1_i, A2_i; +real STA2_i, A3_i, A4_i, GCO_i, IGINV_i, IGOV_i, IGOVD_i, STIG_i, GC2_i, GC3_i, GC2OV_i, GC3OV_i, CHIB_i, AGIDL_i, AGIDLD_i, BGIDL_i; +real BGIDLD_i, STBGIDL_i, STBGIDLD_i, CGIDL_i, CGIDLD_i, COX_i, CGOV_i, CGOVD_i, CGBOV_i, CFR_i, CFRD_i, FNT_i, FNTEXC_i, NFA_i, NFB_i; +real NFC_i, EF_i, VFBEDGE_i, STVFBEDGE_i, DPHIBEDGE_i, NEFFEDGE_i, CTEDGE_i, BETNEDGE_i, STBETEDGE_i, PSCEEDGE_i, PSCEBEDGE_i, PSCEDEDGE_i; +real CFEDGE_i, CFDEDGE_i, CFBEDGE_i, FNTEDGE_i, NFAEDGE_i, NFBEDGE_i, NFCEDGE_i, EFEDGE_i, RG_i, RSE_i, RDE_i, RBULK_i, RJUNS_i, RJUND_i; +real RWELL_i; +`ifdef SelfHeating + real RTH_i, CTH_i, STRTH_i; +`endif // SelfHeating +`ifdef NQSmodel + real MUNQS_i; +`endif // NQSmodel + +// Variables for scaling rules +real iL, iW, delLPS, delWOD, LE, WE, LEcv, WEcv, Lcv, Wcv, iLE, iWE, L_f, L_slif, W_f, XGWE, NSUB0e, NPCKe, LPCKe, AA, BB, NSUB; +real FBET1e, LP1e, GPE, GWE, tmpx, Lnoi, Lred, WE_edge, iWE_edge, GPE_edge, KVTHOWE, KUOWE; +`ifdef SelfHeating + real deltaRth; +`endif // SelfHeating + +// Variables for binning-rules +real iLEWE, iiLE, iiWE, iiLEWE, iiiLEWE, iLEcv, iiLEcv, iiWEcv, iiLEWEcv, iiiLEWEcv, iLcv, iiLcv, iiWcv, iiLWcv, iiiLWcv; + +// Variables for general temperature scaling +real TKR, TKA, rTa, delTa, phita, inv_phita, TKD, TKD_sq, delT, rTn, ln_rTn, inv_phit, Eg, phibFac; + +// JUNCAP2 variables +`include "JUNCAP200_varlist.include" + +// Local parameters after temperature scaling and variables used in self heating effect +real VFB_T, CT_T, CTG_T, BETN_T, MUE_T, THEMU_T, CS_T, THECS_T, XCOR_T, RS_T, BGIDL_T, BGIDLD_T, A2_T, VFBEDGE_T, BETNEDGE_T; +`ifdef SelfHeating + real RTH_T; +`else // SelfHeating + // in the self heating model, these variables are declared locally in the evaluate block + real phit, BET_i, BETEDGE_i, nt0, nt, THESAT_T, THESATAC_T, Sfl_prefac, phit0edge, Gfedge2, lnGfedge2, Sfl_prefac_edge; + real ntedge; +`endif // SelfHeating + +// Variables for channel temperature scaling (including self heating effect) +real phib_dc, G_0_dc, kp, np, arg2max, qlim2, qb0, dphibq, sqrt_phib_dc, phix_dc, aphi_dc, bphi_dc, phix2, phix1_dc, alpha_b; +real us1, us21, phib_ac, G_0_ac, phix_ac, aphi_ac, bphi_ac, phix1_ac, tf_ct, tf_bet, tf_mue, tf_cs, tf_xcor, tf_ther, THER_i, tf_thesat; +real tf_betedge, phibedge, Gfedge, phixedge, aphiedge, bphiedge, phix2edge, phix1edge; + +// Variables used in instance initializing +real EPSSI, EPSOX, CoxPrime, tox_sq, Cox_over_q, NEFFAC_i, qq, E_eff0, eta_mu, eta_mu1, inv_AX, inv_VP, CoxovPrime, CoxovPrime_d, GOV_s; +real GOV_d, GOV2_s, GOV2_d, SP_OV_eps2_s, SP_OV_a_s, SP_OV_delta1_s, SP_OV_eps2_d, SP_OV_a_d, SP_OV_delta1_d, inv_CHIB, B_fact, BCH; +real BOV, BOV_d, GCQ, GCQOV, tf_ig, AGIDLs, AGIDLDs, BGIDLs, BGIDLDs, fac_exc, ggate, gsource, gdrain, gbulk, gjuns, gjund, gwell; + +// Variables for bias affectation +real Vgs, Vds, Vsb, Vdb, Vgb, Vjun_s, Vjun_d, VgsPrime, VsbPrime, VdbPrime, VgdPrime; +real Vdsx; + +// Global variables used in PSP103_SPCalculation.include +real Vgb1, Vdsp, delVg, Vdsat_lim, Vdsat; + +// Global variables used in current and charge calculations +real xgs_ov, xgd_ov, Vsbstar_dc, Vsbstar_dc_tmp, Vmb, us, usnew, Vmbnew, qeff1_dc, Voxm_dc, GdL_dc, eta_p_dc, Gvsat_dc, Gmob_dL_dc, x_ds_dc; +real x_m_dc, Gf_dc, Vdsat_dc, Udse_dc, SP_OV_xg, xs_ov, xd_ov, Vovs, Vovd, zg, TP, Fs1, Fs2, Fs3, Fs, Vm, Dch, arg2mina, psi_t, arg1; +real Dsi, Dgate, Igc0, igc, igcd_h, u0, x, u0_div_H, Bg, Ag, xsq, inv_x, ex, inv_ex, Sg, Igc, Igb, Vtovd, Igidl, Vtovs, Igisl; +real delVsat, Vsbstar_ac, xg_ac, qeff1_ac, Voxm_ac, alpha_ac, dps_ac, qim_ac, GdL_ac, H_ac, QG, QI, QD, QB, Fj, Fj2; +real QCLM, Qg, Qd, Qb, Qs, Qgs_ov, Qgd_ov, Qgb_ov, Qfgs, Qfgd, rgatenoise, rsourcenoise, rdrainnoise, rbulknoise, rwellnoise, rjundnoise; +real rjunsnoise; + +// Global variables used in macros +real tme1, tme2; +real inv_GOV, SP_OV_eps, SP_OV_delta, mutau, nu; +real Q_EDGE_xsth, Q_EDGE_xth0, Q_EDGE_xth, Q_EDGE_n, Q_EDGE_n_inv, Q_EDGE_xgt, Q_EDGE_xgt0, Q_EDGE_xgt0e, Q_EDGE_qi0si, Q_EDGE_qi0; +real Q_EDGE_exp_x, Q_EDGE_d0, Q_EDGE_d0p, Q_EDGE_sqerr, Q_EDGE_errq; + +// Global variables used in noise section +real N1, Nm1, Delta_N1, Sfl, t1, sqt2, t2, r, lc, lcinv2, g_ideal, mid, temp2_exc, wsat_exc, temp_exc, thesat1_exc, zsat_exc, Gvsat_exc; +real gfac, Sidexc, sqid, mig, migid0, migid, CGeff, sqig, c_igid, shot_igcsx, shot_igcdx, shot_igsov, shot_igdov, shot_iavl, jnoisex_s, jnoisex_d; +real shot_igs, shot_igd, anoisedge, N1edge, Nm1edge, Delta_N1edge, H0edge, t1edge, sqt2edge, t2edge, redge, lcedge, lcinv2edge; +real g_idealedge; + +// Variables used in NQS-calculations +`ifdef NQSmodel + integer SWNQS_i; + real Gf_ac, xgm_dc, thesat1_dc, xgm_ac, x_m_ac, thesat1_ac, margin_dc, margin_ac; + real Qp1_0, Qp2_0, Qp3_0, Qp4_0, Qp5_0, Qp6_0, Qp7_0, Qp8_0, Qp9_0, fk1, fk2, fk3, fk4, fk5, fk6, fk7, fk8, fk9, phi_p1, phi_p2, phi_p3; + real phi_p4, phi_p5, phi_p6, phi_p7, phi_p8, phi_p9, Qp1, Qp2, Qp3, Qp4, Qp5, Qp6, Qp7, Qp8, Qp9, Qp0, QpN, QG_NQS, QS_NQS, QD_NQS, pd; + real Gp, Gp2, a_factrp, marginp, x_sp, x_dp, zsat_nqs, dfQi, fQi, dQis, dQis_1, d2Qis, dQbs, dQy, d2Qy, dpsy2, ym, inorm, Tnorm, Qb_tmp; + real QbSIGN, r_nqs, vnorm, vnorm_inv, NQS_xg1, NQS_yg, NQS_z, NQS_eta, NQS_a, NQS_c, NQS_tau, NQS_D0, NQS_xi, NQS_p, NQS_q, NQS_temp; + real NQS_A_fac, NQS_xbar, NQS_w, NQS_x0, NQS_u, NQS_y0, xphi, fk0, thesat2, Fvsat, temp3, temp4, temp5, temp6, temp7, temp8, temp9; +`endif // NQSmodel + +//ngspice-adms: move local variables here +real Invsa, Invsb, Invsaref, Invsbref, Kstressu0, rhobeta, rhobetaref, Kstressvth0; +real temp0, temp00, templ, tempw, Lx, Wx, loop, tmpa, tmpb; + +real ijunbot, ijunsti, ijungat, qjunbot, qjunsti, qjungat; + +real sigVds, dphit1, xgct, xsct0, xbct, xsbstar, xsct, dCTG, ct_fact, phit1, inv_phit1, xg_dc, alpha_dc, dps_dc, qim_dc; +real qim1_dc, H_dc, FdL_dc, Gvsatinv_dc, Ids, Iimpact, mavl, Igdov, Igsov, Igcd, Igcs, eta_p_ac, Gvsat_ac, Gmob_dL_ac, H0; +real COX_qm, ijun_s, ijunbot_s, ijunsti_s, ijungat_s, ijun_d, ijunbot_d, ijunsti_d, ijungat_d, qjun_s, qjunbot_s, qjunsti_s; +real qjungat_s, qjun_d, qjunbot_d, qjunsti_d, qjungat_d, jnoise_s, jnoise_d, Gmob_dc, xitsb_dc, Vdse_dc, Vsbstaredge, Vsbxedge; +real dphit1edge, phit1edge, inv_phit1edge, Vdspedge, delVgedge, xgedge, xbedge, dxthedge, xnedge_s, qseffedge, xnedge_d; +real qdseffedge, qdeffedge, qmeffedge, dsqredge, alphabmedge, Idsedge, Sfledge, midedge, sqidedge; +`ifdef SelfHeating + real Pdiss, phit, BET_i, BETEDGE_i, nt0, nt, THESAT_T, THESATAC_T, Sfl_prefac, phit0edge, Gfedge2, lnGfedge2, Sfl_prefac_edge; + real ntedge; +`endif // SelfHeating +real temp, temp1, temp2; + +real FdL, qim1_1, r1, r2, s2, dL1; + +real tmpv, vjv; + +real Pdiss_s, Pdiss_d; + +//`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; + +/* 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; + +// -------------------------------------------------------------------------------------------------------------- +// Variables for operating point info +// -------------------------------------------------------------------------------------------------------------- +real id_op, is, ig, ib, P_D, facvsb, facvsb0, sig1k, vth_i, vts_i, ids_i; +`OPP(ctype ,"" ,"Flag for channel type") +`OPP(sdint ,"" ,"Flag for source-drain interchange") +`OPP(ise ,"A" ,"Total source current") +`OPP(ige ,"A" ,"Total gate current") +`OPP(ide ,"A" ,"Total drain current") +`OPP(ibe ,"A" ,"Total bulk current") +`OPP(ids ,"A" ,"Drain current, excl. edge transistor currents, avalanche, tunnel, GISL, GIDL, and junction currents") +`OPP(idb ,"A" ,"Drain to bulk current") +`OPP(isb ,"A" ,"Source to bulk current") +`OPP(igs ,"A" ,"Gate-source tunneling current") +`OPP(igd ,"A" ,"Gate-drain tunneling current") +`OPP(igb ,"A" ,"Gate-bulk tunneling current") +`OPP(idedge ,"A" ,"Drain current of edge transistors") +`OPP(igcs ,"A" ,"Gate-channel tunneling current (source component)") +`OPP(igcd ,"A" ,"Gate-channel tunneling current (drain component)") +`OPP(iavl ,"A" ,"Substrate current due to weak avelanche") +`OPP(igisl ,"A" ,"Gate-induced source leakage current") +`OPP(igidl ,"A" ,"Gate-induced drain leakage current") +`OPP(ijs ,"A" ,"Total source junction current") +`OPP(ijsbot ,"A" ,"Source junction current (bottom component)") +`OPP(ijsgat ,"A" ,"Source junction current (gate-edge component)") +`OPP(ijssti ,"A" ,"Source junction current (STI-edge component)") +`OPP(ijd ,"A" ,"Total drain junction current") +`OPP(ijdbot ,"A" ,"Drain junction current (bottom component)") +`OPP(ijdgat ,"A" ,"Drain junction current (gate-edge component)") +`OPP(ijdsti ,"A" ,"Drain junction current (STI-edge component)") +`OPP(vds ,"V" ,"Drain-source voltage") +`OPP(vgs ,"V" ,"Gate-source voltage") +`OPP(vsb ,"V" ,"Source-bulk voltage") +`OPP(vto ,"V" ,"Zero-bias threshold voltage") +`OPP(vts ,"V" ,"Threshold voltage including back bias effects") +`OPP(vth ,"V" ,"Threshold voltage including back bias and drain bias effects") +`OPP(vgt ,"V" ,"Effective gate drive voltage including back bias and drain bias effects") +`OPP(vdss ,"V" ,"Drain saturation voltage at actual bias") +`OPP(vsat ,"" ,"Saturation limit") +`ifdef OPderiv + `OPP(gm ,"1/Ohm" ,"Transconductance") + `OPP(gmb ,"1/Ohm" ,"Substrate transconductance") + `OPP(gds ,"1/Ohm" ,"Output conductance") + `OPP(gjs ,"1/Ohm" ,"Source junction conductance") + `OPP(gjd ,"1/Ohm" ,"Drain junction conductance") + `OPP(cdd ,"F" ,"Drain capacitance") + `OPP(cdg ,"F" ,"Drain-gate capacitance") + `OPP(cds ,"F" ,"Drain-source capacitance") + `OPP(cdb ,"F" ,"Drain-bulk capacitance") + `OPP(cgd ,"F" ,"Gate-drain capacitance") + `OPP(cgg ,"F" ,"Gate capacitance") + `OPP(cgs ,"F" ,"Gate-source capacitance") + `OPP(cgb ,"F" ,"Gate-bulk capacitance") + `OPP(csd ,"F" ,"Source-drain capacitance") + `OPP(csg ,"F" ,"Source-gate capacitance") + `OPP(css ,"F" ,"Source capacitance") + `OPP(csb ,"F" ,"Source-bulk capacitance") + `OPP(cbd ,"F" ,"Bulk-drain capacitance") + `OPP(cbg ,"F" ,"Bulk-gate capacitance") + `OPP(cbs ,"F" ,"Bulk-source capacitance") + `OPP(cbb ,"F" ,"Bulk capacitance") + `OPP(cgsol ,"F" ,"Total gate-source overlap capacitance") + `OPP(cgdol ,"F" ,"Total gate-drain overlap capacitance") + `OPP(cjs ,"F" ,"Total source junction capacitance") + `OPP(cjsbot ,"F" ,"Source junction capacitance (bottom component)") + `OPP(cjsgat ,"F" ,"Source junction capacitance (gate-edge component)") + `OPP(cjssti ,"F" ,"Source junction capacitance (STI-edge component)") + `OPP(cjd ,"F" ,"Total drain junction capacitance") + `OPP(cjdbot ,"F" ,"Drain junction capacitance (bottom component)") + `OPP(cjdgat ,"F" ,"Drain junction capacitance (gate-edge component)") + `OPP(cjdsti ,"F" ,"Drain junction capacitance (STI-edge component)") +`endif // OPderiv +`OPP(weff ,"m" ,"Effective channel width for geometrical models") +`OPP(leff ,"m" ,"Effective channel length for geometrical models") +`ifdef OPderiv + `OPP(u ,"" ,"Transistor gain") + `OPP(rout ,"Ohm" ,"Small-signal output resistance") + `OPP(vearly ,"V" ,"Equivalent Early voltage") + `OPP(beff ,"A/V^2" ,"Gain factor") + `OPP(fug ,"Hz" ,"Unity gain frequency at actual bias") + `OPP(rg_op ,"Ohm" ,"Gate resistance") + `OPP(sfl ,"A^2/Hz" ,"Flicker noise current spectral density at 1 Hz") + `OPP(sqrtsff ,"V/sqrt(Hz)" ,"Input-referred RMS white noise voltage spectral density at 1 kHz") + `OPP(sqrtsfw ,"V/sqrt(Hz)" ,"Input-referred RMS white noise voltage spectral density") + `OPP(sid ,"A^2/Hz" ,"White noise current spectral density") + `OPP(sig ,"A^2/Hz" ,"Induced gate noise current spectral density at 1 Hz") + `OPP(cigid ,"" ,"Imaginary part of correlation coefficient between Sig and Sid") + `OPP(fknee ,"Hz" ,"Cross-over frequency above which white noise is dominant") + `OPP(sigs ,"A^2/Hz" ,"Gate-source current noise spectral density") + `OPP(sigd ,"A^2/Hz" ,"Gate-drain current noise spectral density") + `OPP(siavl ,"A^2/Hz" ,"Impact ionization current noise spectral density") + `OPP(ssi ,"A^2/Hz" ,"Total source junction current noise spectral density") + `OPP(sdi ,"A^2/Hz" ,"Total drain junction current noise spectral density") + `OPP(sfledge ,"A^2/Hz" ,"Flicker noise current spectral density at 1 Hz of edge transistors") + `OPP(sidedge ,"A^2/Hz" ,"White noise current spectral density of edge transistors") +`endif // OPderiv +// local parameters after scaling, T-scaling, and clipping +`OPP(lp_vfb ,"V" ,"Local parameter VFB after T-scaling and clipping") +`OPP(lp_stvfb ,"V/K" ,"Local parameter STVFB after clipping") +`OPP(lp_st2vfb ,"K^-1" ,"Local parameter ST2VFB after clipping") +`OPP(lp_tox ,"m" ,"Local parameter TOX after clipping") +`OPP(lp_epsrox ,"" ,"Local parameter EPSROX after clipping") +`OPP(lp_neff ,"m^-3" ,"Local parameter NEFF after clipping") +`OPP(lp_facneffac ,"" ,"Local parameter FACNEFFAC after clipping") +`OPP(lp_gfacnud ,"" ,"Local parameter GFACNUD after clipping") +`OPP(lp_vsbnud ,"V" ,"Local parameter VSBNUD after clipping") +`OPP(lp_dvsbnud ,"V" ,"Local parameter DVSBNUD after clipping") +`OPP(lp_vnsub ,"V" ,"Local parameter VNSUB after clipping") +`OPP(lp_nslp ,"V" ,"Local parameter NSLP after clipping") +`OPP(lp_dnsub ,"V^-1" ,"Local parameter DNSUB after clipping") +`OPP(lp_dphib ,"V" ,"Local parameter DPHIB after clipping") +`OPP(lp_delvtac ,"V" ,"Local parameter DELVTAC after clipping") +`OPP(lp_np ,"m^-3" ,"Local parameter NP after clipping") +`OPP(lp_toxov ,"m" ,"Local parameter TOXOV after clipping") +`OPP(lp_toxovd ,"m" ,"Local parameter TOXOVD after clipping") +`OPP(lp_nov ,"m^-3" ,"Local parameter NOV after clipping") +`OPP(lp_novd ,"m^-3" ,"Local parameter NOVD after clipping") +`OPP(lp_ct ,"" ,"Local parameter CT after clipping") +`OPP(lp_ctg ,"" ,"Local parameter CTG after clipping") +`OPP(lp_ctb ,"" ,"Local parameter CTB after clipping") +`OPP(lp_stct ,"" ,"Local parameter STCT after clipping") +`OPP(lp_cf ,"" ,"Local parameter CF after clipping") +`OPP(lp_cfac ,"" ,"Local parameter CFAC after clipping") +`OPP(lp_cfd ,"V^-1" ,"Local parameter CFD after clipping") +`OPP(lp_cfb ,"V^-1" ,"Local parameter CFB after clipping") +`OPP(lp_psce ,"" ,"Local parameter PSCE after clipping") +`OPP(lp_psceb ,"V^-1" ,"Local parameter PSCEB after clipping") +`OPP(lp_psced ,"V^-1" ,"Local parameter PSCED after clipping") +`OPP(lp_betn ,"m^2/(V s)" ,"Local parameter BETN after T-scaling and clipping") +`OPP(lp_stbet ,"" ,"Local parameter STBET after clipping") +`OPP(lp_mue ,"m/V" ,"Local parameter MUE after T-scaling and clipping") +`OPP(lp_stmue ,"" ,"Local parameter STMUE after clipping") +`OPP(lp_themu ,"" ,"Local parameter THEMU after T-scaling and clipping") +`OPP(lp_stthemu ,"" ,"Local parameter STTHEMU after clipping") +`OPP(lp_cs ,"" ,"Local parameter CS after T-scaling and clipping") +`OPP(lp_stcs ,"" ,"Local parameter STCS after clipping") +`OPP(lp_thecs ,"" ,"Local parameter THECS after T-scaling and clipping") +`OPP(lp_stthecs ,"" ,"Local parameter STTHECS after clipping") +`OPP(lp_xcor ,"V^-1" ,"Local parameter XCOR after T-scaling and clipping") +`OPP(lp_stxcor ,"" ,"Local parameter STXCOR after clipping") +`OPP(lp_feta ,"" ,"Local parameter FETA after clipping") +`OPP(lp_rs ,"Ohm" ,"Local parameter RS after T-scaling and clipping") +`OPP(lp_strs ,"" ,"Local parameter STRS after clipping") +`OPP(lp_rsb ,"V^-1" ,"Local parameter RSB after clipping") +`OPP(lp_rsg ,"V^-1" ,"Local parameter RSG after clipping") +`OPP(lp_thesat ,"V^-1" ,"Local parameter THESAT after T-scaling and clipping") +`OPP(lp_thesatac ,"V^-1" ,"Local parameter THESATAC after T-scaling and clipping") +`OPP(lp_stthesat ,"" ,"Local parameter STTHESAT after clipping") +`OPP(lp_thesatb ,"V^-1" ,"Local parameter THESATB after clipping") +`OPP(lp_thesatg ,"V^-1" ,"Local parameter THESATG after clipping") +`OPP(lp_ax ,"" ,"Local parameter AX after clipping") +`OPP(lp_axac ,"" ,"Local parameter AXAC after clipping") +`OPP(lp_alp ,"" ,"Local parameter ALP after clipping") +`OPP(lp_alpac ,"" ,"Local parameter ALPAC after clipping") +`OPP(lp_alp1 ,"V" ,"Local parameter ALP1 after clipping") +`OPP(lp_alp2 ,"V^-1" ,"Local parameter ALP2 after clipping") +`OPP(lp_vp ,"V" ,"Local parameter VP after clipping") +`OPP(lp_a1 ,"" ,"Local parameter A1 after clipping") +`OPP(lp_a2 ,"V" ,"Local parameter A2 after T-scaling and clipping") +`OPP(lp_sta2 ,"" ,"Local parameter STA2 after clipping") +`OPP(lp_a3 ,"" ,"Local parameter A3 after clipping") +`OPP(lp_a4 ,"1/sqrt(V)" ,"Local parameter A4 after clipping") +`OPP(lp_gco ,"" ,"Local parameter GCO after clipping") +`OPP(lp_iginv ,"A" ,"Local parameter IGINV after T-scaling and clipping") +`OPP(lp_igov ,"A" ,"Local parameter IGOV after T-scaling and clipping") +`OPP(lp_igovd ,"A" ,"Local parameter IGOVD after T-scaling and clipping") +`OPP(lp_stig ,"" ,"Local parameter STIG after clipping") +`OPP(lp_gc2 ,"" ,"Local parameter GC2 after clipping") +`OPP(lp_gc3 ,"" ,"Local parameter GC3 after clipping") +`OPP(lp_gc2ov ,"" ,"Local parameter GC2OV after clipping") +`OPP(lp_gc3ov ,"" ,"Local parameter GC3OV after clipping") +`OPP(lp_chib ,"V" ,"Local parameter CHIB after clipping") +`OPP(lp_agidl ,"A/V^3" ,"Local parameter AGIDL after clipping") +`OPP(lp_agidld ,"A/V^3" ,"Local parameter AGIDLD after clipping") +`OPP(lp_bgidl ,"V" ,"Local parameter BGIDL after T-scaling and clipping") +`OPP(lp_bgidld ,"V" ,"Local parameter BGIDLD after T-scaling and clipping") +`OPP(lp_stbgidl ,"V/K" ,"Local parameter STBGIDL after clipping") +`OPP(lp_stbgidld ,"V/K" ,"Local parameter STBGIDLD after clipping") +`OPP(lp_cgidl ,"" ,"Local parameter CGIDL after clipping") +`OPP(lp_cgidld ,"" ,"Local parameter CGIDLD after clipping") +`OPP(lp_cox ,"F" ,"Local parameter COX after clipping") +`OPP(lp_cgov ,"F" ,"Local parameter CGOV after clipping") +`OPP(lp_cgovd ,"F" ,"Local parameter CGOVD after clipping") +`OPP(lp_cgbov ,"F" ,"Local parameter CGBOV after clipping") +`OPP(lp_cfr ,"F" ,"Local parameter CFR after clipping") +`OPP(lp_cfrd ,"F" ,"Local parameter CFRD after clipping") +`OPP(lp_fnt ,"" ,"Local parameter FNT after clipping") +`OPP(lp_fntexc ,"" ,"Local parameter FNTEXC after clipping") +`OPP(lp_nfa ,"1/(V m^4)" ,"Local parameter NFA after clipping") +`OPP(lp_nfb ,"1/(V m^4)" ,"Local parameter NFB after clipping") +`OPP(lp_nfc ,"V^-1" ,"Local parameter NFC after clipping") +`OPP(lp_ef ,"" ,"Local parameter EF after clipping") +`OPP(lp_vfbedge ,"V" ,"Local parameter VFBEDGE after T-scaling and clipping") +`OPP(lp_stvfbedge ,"V/K" ,"Local parameter STVFBEDGE after clipping") +`OPP(lp_dphibedge ,"V" ,"Local parameter DPHIBEDGE after clipping") +`OPP(lp_neffedge ,"m^-3" ,"Local parameter NEFFEDGE after clipping") +`OPP(lp_ctedge ,"" ,"Local parameter CTEDGE after clipping") +`OPP(lp_betnedge ,"m^2/V/s" ,"Local parameter BETNEDGE after T-scaling and clipping") +`OPP(lp_stbetedge ,"" ,"Local parameter STBETEDGE after clipping") +`OPP(lp_psceedge ,"" ,"Local parameter PSCEEDGE after clipping") +`OPP(lp_pscebedge ,"V^-1" ,"Local parameter PSCEBEDGE after clipping") +`OPP(lp_pscededge ,"V^-1" ,"Local parameter PSCEDEDGE after clipping") +`OPP(lp_cfedge ,"V" ,"Local parameter CFEDGE after clipping") +`OPP(lp_cfdedge ,"V^-1" ,"Local parameter CFDEDGE after clipping") +`OPP(lp_cfbedge ,"V^-1" ,"Local parameter CFBEDGE after clipping") +`OPP(lp_fntedge ,"" ,"Local parameter FNTEDGE after clipping") +`OPP(lp_nfaedge ,"1/(V m^4)" ,"Local parameter NFAEDGE after clipping") +`OPP(lp_nfbedge ,"1/(V m^4)" ,"Local parameter NFBEDGE after clipping") +`OPP(lp_nfcedge ,"V^-1" ,"Local parameter NFCEDGE after clipping") +`OPP(lp_efedge ,"" ,"Local parameter EFEDGE after clipping") +`OPP(lp_rg ,"Ohm" ,"Local parameter RG after clipping") +`OPP(lp_rse ,"Ohm" ,"Local parameter RSE after clipping") +`OPP(lp_rde ,"Ohm" ,"Local parameter RDE after clipping") +`OPP(lp_rbulk ,"Ohm" ,"Local parameter RBULK after clipping") +`OPP(lp_rwell ,"Ohm" ,"Local parameter RWELL after clipping") +`OPP(lp_rjuns ,"Ohm" ,"Local parameter RJUNS after clipping") +`OPP(lp_rjund ,"Ohm" ,"Local parameter RJUND after clipping") +`ifdef SelfHeating + `OPP(lp_rth ,"K/W" ,"Local parameter RTH after T-scaling and clipping") + `OPP(lp_cth ,"J/K" ,"Local parameter CTH after clipping") + `OPP(lp_strth ,"" ,"Local parameter STRTH after clipping") + `OPP(pdiss ,"W" ,"Power dissipation") + `OPP(dtsh ,"K" ,"Temperature rise due to self heating") +`endif // SelfHeating +`OPP(tk ,"K" ,"Device Temperature") +`OPP(cjosbot ,"F" ,"Bottom component of total zero-bias source junction capacitance at device temperature") +`OPP(cjossti ,"F" ,"STI-edge component of total zero-bias source junction capacitance at device temperature") +`OPP(cjosgat ,"F" ,"Gate-edge component of total zero-bias source junction capacitance at device temperature") +`OPP(vbisbot ,"V" ,"Built-in voltage of source-side bottom junction at device temperature") +`OPP(vbissti ,"V" ,"Built-in voltage of source-side STI-edge junction at device temperature") +`OPP(vbisgat ,"V" ,"Built-in voltage of source-side gate-edge junction at device temperature") +`OPP(idsatsbot ,"A" ,"Total source-side bottom junction saturation current") +`OPP(idsatssti ,"A" ,"Total source-side STI-edge junction saturation current") +`OPP(idsatsgat ,"A" ,"Total source-side gate-edge junction saturation current") +`OPP(cjosbotd ,"F" ,"Bottom component of total zero-bias drain junction capacitance at device temperature") +`OPP(cjosstid ,"F" ,"STI-edge component of total zero-bias drain junction capacitance at device temperature") +`OPP(cjosgatd ,"F" ,"Gate-edge component of total zero-bias drain junction capacitance at device temperature") +`OPP(vbisbotd ,"V" ,"Built-in voltage of drain-side bottom junction at device temperature") +`OPP(vbisstid ,"V" ,"Built-in voltage of drain-side STI-edge junction at device temperature") +`OPP(vbisgatd ,"V" ,"Built-in voltage of drain-side gate-edge junction at device temperature") +`OPP(idsatsbotd ,"A" ,"Total drain-side bottom junction saturation current") +`OPP(idsatsstid ,"A" ,"Total drain-side STI-edge junction saturation current") +`OPP(idsatsgatd ,"A" ,"Total drain-side gate-edge junction saturation current") +`ifdef NQSmodel + `OPP(lp_munqs ,"" ,"Local parameter MUNQS after clipping") +`endif // NQSmodel + +// -------------------------------------------------------------------------------------------------------------- +// Analog block with all calculations and contribs +// -------------------------------------------------------------------------------------------------------------- +analog begin + + // -------------------------------------------------------------------------------------------------------------- + // Definition of bias/instance independent model variables + // -------------------------------------------------------------------------------------------------------------- + `INITIAL_MODEL + begin : initial_model + + // Clipping and rounding of switch parameters + if (TYPE >= 0) begin + CHNL_TYPE = `NMOS; + end else begin + CHNL_TYPE = `PMOS; + end + EPSSI = `EPSO * `EPSRSI; + SWGEO_i = floor(`CLIP_BOTH(SWGEO, 0.0, 2.0) + 0.5); + SWIGATE_i = floor(`CLIP_BOTH(SWIGATE, 0.0, 2.0) + 0.5); + SWIMPACT_i = floor(`CLIP_BOTH(SWIMPACT, 0.0, 1.0) + 0.5); + SWGIDL_i = floor(`CLIP_BOTH(SWGIDL, 0.0, 1.0) + 0.5); + SWJUNCAP_i = floor(`CLIP_BOTH(SWJUNCAP, 0.0, 3.0) + 0.5); + SWJUNASYM_i = floor(`CLIP_BOTH(SWJUNASYM, 0.0, 1.0) + 0.5); + SWNUD_i = floor(`CLIP_BOTH(SWNUD, 0.0, 2.0) + 0.5); + SWEDGE_i = floor(`CLIP_BOTH(SWEDGE, 0.0, 1.0) + 0.5); + SWDELVTAC_i = floor(`CLIP_BOTH(SWDELVTAC, 0.0, 1.0) + 0.5); + SWQSAT_i = floor(`CLIP_BOTH(SWQSAT, 0.0, 1.0) + 0.5); + SWQPART_i = floor(`CLIP_BOTH(SWQPART, 0.0, 1.0) + 0.5); + SWIGN_i = floor(`CLIP_BOTH(SWIGN, 0.0, 1.0) + 0.5); + QMC_i = `CLIP_LOW(QMC, 0.0); + `ifdef NQSmodel + if (SWNQS < 0.5) begin + SWNQS_i = 0; + end else begin + if (SWNQS < 1.5) begin + SWNQS_i = 1; + end else begin + if (SWNQS < 2.5) begin + SWNQS_i = 2; + end else begin + if (SWNQS < 4.0) begin + SWNQS_i = 3; + end else begin + if (SWNQS < 7.0) begin + SWNQS_i = 5; + end else begin + SWNQS_i = 9; + end + end + end + end + end + inorm = 1.0e-12; + r_nqs = 1.0e3; + vnorm = 10.0; + vnorm_inv = 1.0 / vnorm; + `endif // NQSmodel + + // Clipping of global model parameters + TOXO_i = `CLIP_LOW(TOXO, 1.0e-10); + EPSROXO_i = `CLIP_LOW(EPSROXO, 1.0); + NSUBO_i = `CLIP_LOW(NSUBO, 1.0e20); + WSEG_i = `CLIP_LOW(WSEG, 1.0e-10); + NPCK_i = `CLIP_LOW(NPCK, 0.0); + WSEGP_i = `CLIP_LOW(WSEGP, 1.0e-10); + LPCK_i = `CLIP_LOW(LPCK, 1.0e-10); + TOXOVO_i = `CLIP_LOW(TOXOVO, 1.0e-10); + TOXOVDO_i = `CLIP_LOW(TOXOVDO, 1.0e-10); + LOV_i = `CLIP_LOW(LOV, 0.0); + LOVD_i = `CLIP_LOW(LOVD, 0.0); + LP1_i = `CLIP_LOW(LP1, 1.0e-10); + LP2_i = `CLIP_LOW(LP2, 1.0e-10); + WBET_i = `CLIP_LOW(WBET, 1.0e-10); + AXL_i = `CLIP_LOW(AXL, 0.0); + ALP1L2_i = `CLIP_LOW(ALP1L2, 0.0); + ALP2L2_i = `CLIP_LOW(ALP2L2, 0.0); + SAREF_i = `CLIP_LOW(SAREF, 1.0e-9); + SBREF_i = `CLIP_LOW(SBREF, 1.0e-9); + KVSAT_i = `CLIP_BOTH(KVSAT, -1.0, 1.0); + LLODKUO_i = `CLIP_LOW(LLODKUO, 0.0); + WLODKUO_i = `CLIP_LOW(WLODKUO, 0.0); + LLODVTH_i = `CLIP_LOW(LLODVTH, 0.0); + WLODVTH_i = `CLIP_LOW(WLODVTH, 0.0); + LODETAO_i = `CLIP_LOW(LODETAO, 0.0); + SCREF_i = `CLIP_LOW(SCREF, 0.0); + WEB_i = WEB; + WEC_i = WEC; + RSHG_i = `CLIP_LOW(RSHG, 0.0); + RSH_i = `CLIP_LOW(RSH, 0.0); + RSHD_i = `CLIP_LOW(RSHD, 0.0); + RINT_i = `CLIP_LOW(RINT, 0.0); + RVPOLY_i = `CLIP_LOW(RVPOLY, 0.0); + NSUBEDGEO_i = `CLIP_LOW(NSUBEDGEO, 1.0e20); + LPEDGE_i = `CLIP_LOW(LPEDGE, 1.0e-10); + + // Definition of global-binning parameters for the charge model in the case of separate calculation in saturation + `DefACparam(CFACL_i, CFL, CFACL) + `DefACparam(CFACLEXP_i, CFLEXP, CFACLEXP) + `DefACparam(CFACW_i, CFW, CFACW) + `DefACparam(THESATACO_i, THESATO, THESATACO) + `DefACparam(THESATACL_i, THESATL, THESATACL) + `DefACparam(THESATACLEXP_i, THESATLEXP, THESATACLEXP) + `DefACparam(THESATACW_i, THESATW, THESATACW) + `DefACparam(THESATACLW_i, THESATLW, THESATACLW) + `DefACparam(AXACO_i, AXO, AXACO) + `DefACparam(AXACL_i, AXL_i, AXACL) + AXACL_i = `CLIP_LOW(AXACL_i, 0.0); + `DefACparam(ALPACL_i, ALPL, ALPACL) + `DefACparam(ALPACLEXP_i, ALPLEXP, ALPACLEXP) + `DefACparam(ALPACW_i, ALPW, ALPACW) + `DefACparam(POCFAC_i, POCF, POCFAC) + `DefACparam(PLCFAC_i, PLCF, PLCFAC) + `DefACparam(PWCFAC_i, PWCF, PWCFAC) + `DefACparam(PLWCFAC_i, PLWCF, PLWCFAC) + `DefACparam(POTHESATAC_i, POTHESAT, POTHESATAC) + `DefACparam(PLTHESATAC_i, PLTHESAT, PLTHESATAC) + `DefACparam(PWTHESATAC_i, PWTHESAT, PWTHESATAC) + `DefACparam(PLWTHESATAC_i, PLWTHESAT, PLWTHESATAC) + `DefACparam(POAXAC_i, POAX, POAXAC) + `DefACparam(PLAXAC_i, PLAX, PLAXAC) + `DefACparam(PWAXAC_i, PWAX, PWAXAC) + `DefACparam(PLWAXAC_i, PLWAX, PLWAXAC) + `DefACparam(POALPAC_i, POALP, POALPAC) + `DefACparam(PLALPAC_i, PLALP, PLALPAC) + `DefACparam(PWALPAC_i, PWALP, PWALPAC) + `DefACparam(PLWALPAC_i, PLWALP, PLWALPAC) + `DefACparam(KVSATAC_i, KVSAT, KVSATAC) + KVSATAC_i = `CLIP_BOTH(KVSATAC_i, -1.0, 1.0); + + // Transistor temperature + TR_i = `CLIP_LOW(TR, -273.0); + TKR = `KELVINCONVERSION + TR_i; + TKA = $temperature + DTA; + rTa = TKA / TKR; + delTa = TKA - TKR; + phita = TKA * `KBOL / `QELE; + inv_phita = 1.0 / phita; + `ifdef SelfHeating + // do nothing + `else // SelfHeating + TKD = TKA; + `TempInitialize + `endif // SelfHeating + + // JUNCAP2 + `include "JUNCAP200_InitModel.include" + + end // initial_model + + // -------------------------------------------------------------------------------------------------------------- + // Definition of instance dependent and bias independent variables + // -------------------------------------------------------------------------------------------------------------- + `INITIAL_INSTANCE + begin : initial_instance + + //ngspice-adms: JUNCAP2 Instance parameter handling + IFACTOR_i = `CLIP_LOW( IFACTOR ,`IFACTOR_cliplow); + CFACTOR_i = `CLIP_LOW( CFACTOR ,`CFACTOR_cliplow); + + // Declaration of local variables +// real Invsa, Invsb, Invsaref, Invsbref, Kstressu0, rhobeta, rhobetaref, Kstressvth0; +// real temp0, temp00, templ, tempw, Lx, Wx, loop, tmpa, tmpb; + + // Instance variables + NF_i = 1.0; + invNF = 1.0; + LE = 0.0; + WE = 0.0; + L_i = L; + W_i = W; + SA_i = SA; + SB_i = SB; + SD_i = SD; + SC_i = SC; + XGW_i = XGW; + ABSOURCE_i = ABSOURCE; + LSSOURCE_i = LSSOURCE; + LGSOURCE_i = LGSOURCE; + ABDRAIN_i = ABDRAIN; + LSDRAIN_i = LSDRAIN; + LGDRAIN_i = LGDRAIN; + AS_i = AS; + PS_i = PS; + AD_i = AD; + PD_i = PD; + JW_i = JW; + + // Clipping of the instance parameters + if ((SWGEO_i == 1) || (SWGEO_i == 2)) begin + NF_i = `CLIP_LOW(NF, 1.0); + NF_i = floor(NF_i + 0.5); // round to nearest integer + invNF = 1.0 / NF_i; + end + L_i = `CLIP_LOW(L_i, 1.0e-9); + W_i = `CLIP_LOW(W_i * invNF, 1.0e-9); + SCA_i = `CLIP_LOW(SCA, 0.0); + SCB_i = `CLIP_LOW(SCB, 0.0); + SCC_i = `CLIP_LOW(SCC, 0.0); + NGCON_i = (NGCON < 1.5) ? 1.0 : 2.0; + + // Internal local parameters + `include "PSP103_scaling.include" + + // Local process parameters + EPSOX = `EPSO * EPSROX_i; + CoxPrime = EPSOX / TOX_i; + tox_sq = TOX_i * TOX_i; + Cox_over_q = CoxPrime / `QELE; + NEFFAC_i = FACNEFFAC_i * NEFF_i; + NEFFAC_i = `CLIP_BOTH(NEFFAC_i, 1.0e20, 1.0e26); + + // QM corrections: initially calculated in PSP103_macrodefs.include (PSP103.3) + qq = 0.0; + if (QMC_i > 0.0) begin + qq = 0.4 * `QMN * QMC_i * pow(CoxPrime, `twoThirds); + if (CHNL_TYPE==`PMOS) begin + qq = `QMP / `QMN * qq; + end + end + + // Electrical field parameters + E_eff0 = 1.0e-8 * CoxPrime / EPSSI; + eta_mu = 0.5 * FETA_i; + eta_mu1 = 0.5; + if (CHNL_TYPE == `PMOS) begin + eta_mu = `oneThird * FETA_i; + eta_mu1 = `oneThird; + end + + // Linear-saturation transition parameter + inv_AX = 1.0 / AX_i; + + // CLM parameter + inv_VP = 1.0 / VP_i; + + // Gate overlap + CoxovPrime = EPSOX / TOXOV_i; + CoxovPrime_d = EPSOX / TOXOVD_i; + GOV_s = sqrt(2.0 * `QELE * NOV_i * EPSSI * inv_phita) / CoxovPrime; + GOV_d = sqrt(2.0 * `QELE * NOVD_i * EPSSI * inv_phita) / CoxovPrime_d; + GOV2_s = GOV_s * GOV_s; + GOV2_d = GOV_d * GOV_d; + `sp_ovInit(GOV_s, GOV2_s, SP_OV_eps2_s, SP_OV_a_s, SP_OV_delta1_s) + `sp_ovInit(GOV_d, GOV2_d, SP_OV_eps2_d, SP_OV_a_d, SP_OV_delta1_d) + + // Temperature scaling variables + `ifdef SelfHeating + // do nothing + `else // SelfHeating + // Initialize variables of edge transistor + `TempScaling + `endif // SelfHeating + + // Gate to channel leakage parameters + inv_CHIB = 1.0 / CHIB_i; + B_fact = 4.0 * `oneThird * sqrt(2.0 * `QELE * `MELE * CHIB_i) / `HBAR; + BCH = B_fact * TOX_i; + BOV = B_fact * TOXOV_i; + BOV_d = B_fact * TOXOVD_i; + GCQ = 0.0; + if (GC3_i < 0) begin + GCQ = -0.495 * GC2_i / GC3_i; + end + GCQOV = GCQ; + if (SWIGATE_i == 2) begin + GCQOV = 0.0; + if (GC3OV_i < 0.0) begin + GCQOV = -0.495 * GC2OV_i / GC3OV_i; + end + end + tf_ig = pow(rTa, STIG_i); + IGINV_i = IGINV_i * tf_ig; + IGOV_i = IGOV_i * tf_ig; + IGOVD_i = IGOVD_i * tf_ig; + + // GIDL parameters + AGIDLs = AGIDL_i * 4.0e-18 / (TOXOV_i * TOXOV_i); + AGIDLDs = AGIDLD_i * 4.0e-18 / (TOXOVD_i * TOXOVD_i); + B_fact = `MAX(1.0 + STBGIDL_i * delTa, 0.0); + BGIDL_T = BGIDL_i * B_fact; + BGIDLs = BGIDL_T * TOXOV_i * 5.0e8; + B_fact = `MAX(1.0 + STBGIDLD_i * delTa, 0.0); + BGIDLD_T = BGIDLD_i * B_fact; + BGIDLDs = BGIDLD_T * TOXOVD_i * 5.0e8; + + // Self Heating parameters + `ifdef SelfHeating + RTH_T = RTH_i * pow(rTa, STRTH_i); + `endif // SelfHeating + + // Noise model parameters + fac_exc = `MELE * 1.0e9 * FNTEXC_i; + + //ngspice-adms: Parasitic resistances - no node collapse + RG_i = `CLIP_LOW(RG, 1.0e-3); + RSE_i = `CLIP_LOW(RSE, 1.0e-3); + RDE_i = `CLIP_LOW(RDE, 1.0e-3); + RBULK_i = `CLIP_LOW(RBULK, 1.0e-3); + RJUNS_i = `CLIP_LOW(RJUNS, 1.0e-3); + RJUND_i = `CLIP_LOW(RJUND, 1.0e-3); + RWELL_i = `CLIP_LOW(RWELL, 1.0e-3); + + // Conductance of parasitic resistance + if (RG_i > 0.0) begin + ggate = 1.0 / RG_i; + end else begin + ggate = 0.0; + end + if (RSE_i > 0.0) begin + gsource = 1.0 / RSE_i; + end else begin + gsource = 0.0; + end + if (RDE_i > 0.0) begin + gdrain = 1.0 / RDE_i; + end else begin + gdrain = 0.0; + end + if (RBULK_i > 0.0) begin + gbulk = 1.0 / RBULK_i; + end else begin + gbulk = 0.0; + end + if (RJUNS_i > 0.0) begin + gjuns = 1.0 / RJUNS_i; + end else begin + gjuns = 0.0; + end + if (RJUND_i > 0.0) begin + gjund = 1.0 / RJUND_i; + end else begin + gjund = 0.0; + end + if (RWELL_i > 0.0) begin + gwell = 1.0 / RWELL_i; + end else begin + gwell = 0.0; + end + + // JUNCAP instance parameters + ABS_i = 0.0; + LSS_i = 0.0; + LGS_i = 0.0; + ABD_i = 0.0; + LSD_i = 0.0; + LGD_i = 0.0; + jwcorr = 0.0; + jww = WE; + if (SWGEO_i == 0) begin + jww = `CLIP_LOW(JW_i, `LG_cliplow); + end + if (SWJUNCAP_i == 3) begin + jwcorr = 1.0; + end + ABS_i = ABSOURCE_i * invNF; + LSS_i = LSSOURCE_i * invNF; + LGS_i = LGSOURCE_i * invNF; + ABD_i = ABDRAIN_i * invNF; + LSD_i = LSDRAIN_i * invNF; + LGD_i = LGDRAIN_i * invNF; + if ((SWJUNCAP_i == 2) || (SWJUNCAP_i == 3)) begin + ABS_i = AS_i * invNF; + LSS_i = PS_i * invNF - jwcorr * jww; + LGS_i = jww; + ABD_i = AD_i * invNF; + LSD_i = PD_i * invNF - jwcorr * jww; + LGD_i = jww; + end + if ((SWJUNCAP_i == 1) || (SWJUNCAP_i == 2) || (SWJUNCAP_i == 3)) begin + ABSOURCE_i = `CLIP_LOW(ABS_i, `AB_cliplow); + LSSOURCE_i = `CLIP_LOW(LSS_i, `LS_cliplow); + LGSOURCE_i = `CLIP_LOW(LGS_i, `LG_cliplow); + ABDRAIN_i = `CLIP_LOW(ABD_i, `AB_cliplow); + LSDRAIN_i = `CLIP_LOW(LSD_i, `LS_cliplow); + LGDRAIN_i = `CLIP_LOW(LGD_i, `LG_cliplow); + end else begin + ABSOURCE_i = 0.0; + LSSOURCE_i = 0.0; + LGSOURCE_i = 0.0; + ABDRAIN_i = 0.0; + LSDRAIN_i = 0.0; + LGDRAIN_i = 0.0; + end + + // Initialization of JUNCAP (global) variables; required for some verilog-A compilers + vbimin_s = 0.0; + vbimin_d = 0.0; + vfmin_s = 0.0; + vfmin_d = 0.0; + vch_s = 0.0; + vch_d = 0.0; + vbbtlim_s = 0.0; + vbbtlim_d = 0.0; + VMAX_s = 0.0; + VMAX_d = 0.0; + exp_VMAX_over_phitd_s = 0.0; + exp_VMAX_over_phitd_d = 0.0; + ISATFOR1_s = 0.0; + ISATFOR1_d = 0.0; + MFOR1_s = 1.0; + MFOR1_d = 1.0; + ISATFOR2_s = 0.0; + ISATFOR2_d = 0.0; + MFOR2_s = 1.0; + MFOR2_d = 1.0; + ISATREV_s = 0.0; + ISATREV_d = 0.0; + MREV_s = 1.0; + MREV_d = 1.0; + m0flag_s = 0.0; + m0flag_d = 0.0; + xhighf1_s = 0.0; + xhighf1_d = 0.0; + expxhf1_s = 0.0; + expxhf1_d = 0.0; + xhighf2_s = 0.0; + xhighf2_d = 0.0; + expxhf2_s = 0.0; + expxhf2_d = 0.0; + xhighr_s = 0.0; + xhighr_d = 0.0; + expxhr_s = 0.0; + expxhr_d = 0.0; + zflagbot_s = 1.0; + zflagbot_d = 1.0; + zflagsti_s = 1.0; + zflagsti_d = 1.0; + zflaggat_s = 1.0; + zflaggat_d = 1.0; + m0_rev = 0.0; + mcor_rev = 0.0; + I1_cor = 0.0; + I2_cor = 0.0; + I3_cor = 0.0; + I4_cor = 0.0; + I5_cor = 0.0; + tt0 = 0.0; + tt1 = 0.0; + tt2 = 0.0; + zfrac = 0.0; + alphaje = 0.0; + + if (SWJUNCAP_i > 0) begin + `JuncapInitInstance(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, idsatbot, idsatsti, idsatgat, vbibot, vbisti, vbigat, PBOT_i, PSTI_i, PGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i, VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s) + `JuncapInitInstance(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, idsatbot_d, idsatsti_d, idsatgat_d, vbibot_d, vbisti_d, vbigat_d, PBOTD_i, PSTID_i, PGATD_i, VBIRBOTD_i, VBIRSTID_i, VBIRGATD_i, VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d) + + if (SWJUNEXP_i == 1) begin : JUNCAPexpressInit + // Local variable declaration +// `LocalGlobalVars + + // results computed here are not used elsewhere +// real ijunbot, ijunsti, ijungat, qjunbot, qjunsti, qjungat; + + // Initialization of (local) variables; required for some verilog-A compilers + ysq = 0.0; + terfc = 0.0; + erfcpos = 0.0; + h1 = 0.0; + h2 = 0.0; + h2d = 0.0; + h3 = 0.0; + h4 = 0.0; + h5 = 0.0; + idmult = 0.0; + vj = 0.0; + z = 0.0; + zinv = 0.0; + two_psistar = 0.0; + vjlim = 0.0; + vjsrh = 0.0; + vbbt = 0.0; + vav = 0.0; + tmp = 0.0; + id = 0.0; + isrh = 0.0; + vbi_minus_vjsrh = 0.0; + wsrhstep = 0.0; + dwsrh = 0.0; + wsrh = 0.0; + wdep = 0.0; + asrh = 0.0; + itat = 0.0; + btat = 0.0; + twoatatoverthreebtat = 0.0; + umaxbeforelimiting = 0.0; + umax = 0.0; + sqrtumax = 0.0; + umaxpoweronepointfive = 0.0; + wgamma = 0.0; + wtat = 0.0; + ktat = 0.0; + ltat = 0.0; + mtat = 0.0; + xerfc = 0.0; + erfctimesexpmtat = 0.0; + gammamax = 0.0; + ibbt = 0.0; + Fmaxr = 0.0; + fbreakdown = 0.0; + qjunbot = 0.0; + qjunsti = 0.0; + qjungat = 0.0; + + // Computation of JUNCAP-express internal parameters + `JuncapExpressInit1(ABSOURCE_i, LSSOURCE_i, LGSOURCE_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_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s) + `JuncapExpressInit2(ABSOURCE_i, LSSOURCE_i, LGSOURCE_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_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s) + `JuncapExpressInit3(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, idsatbot, idsatsti, idsatgat, ISATFOR1_s, MFOR1_s, ISATFOR2_s, MFOR2_s, ISATREV_s, MREV_s, m0flag_s) + `JuncapExpressInit4(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, FJUNQ_i, cjobot, cjosti, cjogat, zflagbot_s, zflagsti_s, zflaggat_s) + `JuncapExpressInit5(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, ISATFOR1_s, ISATFOR2_s, ISATREV_s, xhighf1_s, expxhf1_s, xhighf2_s, expxhf2_s, xhighr_s, expxhr_s) + + `JuncapExpressInit1(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, VJUNREFD_i, qprefbot_d, qpref2bot_d, vbiinvbot_d, one_minus_PBOT_d, idsatbot_d, CSRHBOTD_i, CTATBOTD_i, vbibot_d, wdepnulrbot_d, VBIRBOTinv_d, PBOTD_i, ftdbot_d, btatpartbot_d, atatbot_d, one_over_one_minus_PBOT_d, CBBTBOTD_i, VBIRBOTD_i, wdepnulrinvbot_d, fbbtbot_d, VBRBOTD_i, VBRinvbot_d, PBRBOTD_i, fstopbot_d, slopebot_d, qprefsti_d, qpref2sti_d, vbiinvsti_d, one_minus_PSTI_d, idsatsti_d, CSRHSTID_i, CTATSTID_i, vbisti_d, wdepnulrsti_d, VBIRSTIinv_d, PSTID_i, ftdsti_d, btatpartsti_d, atatsti_d, one_over_one_minus_PSTI_d, CBBTSTID_i, VBIRSTID_i, wdepnulrinvsti_d, fbbtsti_d, VBRSTID_i, VBRinvsti_d, PBRSTID_i, fstopsti_d, slopesti_d, qprefgat_d, qpref2gat_d, vbiinvgat_d, one_minus_PGAT_d, idsatgat_d, CSRHGATD_i, CTATGATD_i, vbigat_d, wdepnulrgat_d, VBIRGATinv_d, PGATD_i, ftdgat_d, btatpartgat_d, atatgat_d, one_over_one_minus_PGAT_d, CBBTGATD_i, VBIRGATD_i, wdepnulrinvgat_d, fbbtgat_d, VBRGATD_i, VBRinvgat_d, PBRGATD_i, fstopgat_d, slopegat_d, VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d) + `JuncapExpressInit2(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, qprefbot_d, qpref2bot_d, vbiinvbot_d, one_minus_PBOT_d, idsatbot_d, CSRHBOTD_i, CTATBOTD_i, vbibot_d, wdepnulrbot_d, VBIRBOTinv_d, PBOTD_i, ftdbot_d, btatpartbot_d, atatbot_d, one_over_one_minus_PBOT_d, CBBTBOTD_i, VBIRBOTD_i, wdepnulrinvbot_d, fbbtbot_d, VBRBOTD_i, VBRinvbot_d, PBRBOTD_i, fstopbot_d, slopebot_d, qprefsti_d, qpref2sti_d, vbiinvsti_d, one_minus_PSTI_d, idsatsti_d, CSRHSTID_i, CTATSTID_i, vbisti_d, wdepnulrsti_d, VBIRSTIinv_d, PSTID_i, ftdsti_d, btatpartsti_d, atatsti_d, one_over_one_minus_PSTI_d, CBBTSTID_i, VBIRSTID_i, wdepnulrinvsti_d, fbbtsti_d, VBRSTID_i, VBRinvsti_d, PBRSTID_i, fstopsti_d, slopesti_d, qprefgat_d, qpref2gat_d, vbiinvgat_d, one_minus_PGAT_d, idsatgat_d, CSRHGATD_i, CTATGATD_i, vbigat_d, wdepnulrgat_d, VBIRGATinv_d, PGATD_i, ftdgat_d, btatpartgat_d, atatgat_d, one_over_one_minus_PGAT_d, CBBTGATD_i, VBIRGATD_i, wdepnulrinvgat_d, fbbtgat_d, VBRGATD_i, VBRinvgat_d, PBRGATD_i, fstopgat_d, slopegat_d, VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d) + `JuncapExpressInit3(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, idsatbot_d, idsatsti_d, idsatgat_d, ISATFOR1_d, MFOR1_d, ISATFOR2_d, MFOR2_d, ISATREV_d, MREV_d, m0flag_d) + `JuncapExpressInit4(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, FJUNQD_i, cjobot_d, cjosti_d, cjogat_d, zflagbot_d, zflagsti_d, zflaggat_d) + `JuncapExpressInit5(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, ISATFOR1_d, ISATFOR2_d, ISATREV_d, xhighf1_d, expxhf1_d, xhighf2_d, expxhf2_d, xhighr_d, expxhr_d) + end // JUNCAPexpressInit + + end + + end // initial_instance + + begin : evaluateblock + +// real sigVds, dphit1, xgct, xsct0, xbct, xsbstar, xsct, dCTG, ct_fact, phit1, inv_phit1, xg_dc, alpha_dc, dps_dc, qim_dc; +// real qim1_dc, H_dc, FdL_dc, Gvsatinv_dc, Ids, Iimpact, mavl, Igdov, Igsov, Igcd, Igcs, eta_p_ac, Gvsat_ac, Gmob_dL_ac, H0; +// real COX_qm, ijun_s, ijunbot_s, ijunsti_s, ijungat_s, ijun_d, ijunbot_d, ijunsti_d, ijungat_d, qjun_s, qjunbot_s, qjunsti_s; +// real qjungat_s, qjun_d, qjunbot_d, qjunsti_d, qjungat_d, jnoise_s, jnoise_d, Gmob_dc, xitsb_dc, Vdse_dc, Vsbstaredge, Vsbxedge; +// real dphit1edge, phit1edge, inv_phit1edge, Vdspedge, delVgedge, xgedge, xbedge, dxthedge, xnedge_s, qseffedge, xnedge_d; +// real qdseffedge, qdeffedge, qmeffedge, dsqredge, alphabmedge, Idsedge, Sfledge, midedge, sqidedge; +// `ifdef SelfHeating +// real Pdiss, phit, BET_i, BETEDGE_i, nt0, nt, THESAT_T, THESATAC_T, Sfl_prefac, phit0edge, Gfedge2, lnGfedge2, Sfl_prefac_edge; +// real ntedge; +// `endif // SelfHeating +// real temp, temp1, temp2; + + // -------------------------------------------------------------------------------------------------------------- + // DC bias dependent quantities (calculations for current contribs) + // -------------------------------------------------------------------------------------------------------------- + begin : evaluateStatic + + // Initialize temporary variables + temp = 0.0; + temp1 = 0.0; + temp2 = 0.0; + + // Initialization of variables for SHE effect + `ifdef SelfHeating + TKD = TKA + Temp(br_rth); + `TempInitialize + `TempScaling + `endif // SelfHeating + QCLM = 0.0; + xs_ov = 0.0; + xd_ov = 0.0; + Vovs = 0.0; + Vovd = 0.0; + Iimpact = 0.0; + mavl = 0.0; + + // Initialization of variables for NQS model + `ifdef NQSmodel + pd = 1.0; + ym = 0.0; + `endif // NQSmodel + + // Voltage affectations + if (CHNL_TYPE == `NMOS) begin + Vgs = V(GP, SI); + Vds = V(DI, SI); + Vsb = V(SI, BP); + Vjun_s = -V(SI, BS); + Vjun_d = -V(DI, BD); + end else begin + Vgs = -V(GP, SI); + Vds = -V(DI, SI); + Vsb = -V(SI, BP); + Vjun_s = V(SI, BS); + Vjun_d = V(DI, BD); + end + Vgb = Vgs + Vsb; + + // Voltages NOT subject to S/D-interchange + VgsPrime = Vgs; + VsbPrime = Vsb; + VdbPrime = Vds + Vsb; + VgdPrime = Vgs - Vds; + xgs_ov = -VgsPrime * inv_phita; + xgd_ov = -VgdPrime * inv_phita; + + // Source-drain interchange + sigVds = 1.0; + if (Vds < 0.0) begin + sigVds = -1.0; + Vgs = Vgs - Vds; + Vsb = Vsb + Vds; + Vds = -Vds; + end + Vdb = Vds + Vsb; + Vdsx = Vds * Vds / (sqrt(Vds * Vds + 0.01) + 0.1); + + // Core's model calculation for DC + begin : SPcalc_dc + + // Local variable declaration +// `SPcalcLocalVarDecl +// real FdL, qim1_1, r1, r2, s2, dL1; + + // Conditioning of terminal voltages + temp = `MINA(Vdb, Vsb, bphi_dc) + phix_dc; + Vsbstar_dc = Vsb - `MINA(temp, 0, aphi_dc) + phix1_dc; + Vsbstar_dc_tmp = Vsbstar_dc; + + // Adapt Vsb for NUD-effect + if ((SWNUD_i != 0) && (GFACNUD_i != 1.0)) begin + Vmb = Vsbstar_dc + 0.5 * (Vds - Vdsx); + us = sqrt(Vmb + phib_dc) - sqrt_phib_dc; + temp = 2.0 * (us - us1) / us21 - 1.0; + usnew = us - 0.25 * (1.0 - GFACNUD_i) * us21 * (temp + sqrt(temp * temp + 0.4804530139182)); + Vmbnew = usnew * usnew + (2.0 * sqrt_phib_dc) * usnew; + Vsbstar_dc = Vmbnew - 0.5 * (Vds - Vdsx); + end + + // Set variables needed in PSP_core macro + phib = phib_dc; + G_0 = G_0_dc; + Vsbstar = Vsbstar_dc; + cfloc = CF_i; + thesatloc = THESAT_T; + axloc = AX_i; + alploc = ALP_i; + FdL = 1.0; + + // Calculation of PSP model's core + `SPCalculation + + if (xg > 0.0) begin + qim1_1 = 1.0 / qim1; + r1 = qim * qim1_1; + r2 = phit1 * (alpha * qim1_1); + s2 = ln(1.0 + Vdsx * inv_VP); + dL1 = dL + ALP1_i * (qim1_1 * r1 * s1) + ALP2_i * (qbm * r2 * r2 * s2); + FdL = (1.0 + dL1 + dL1 * dL1) * GdL; + end + + xg_dc = xg; + qeff1_dc = qeff1; + Voxm_dc = Voxm; + alpha_dc = alpha; + dps_dc = dps; + qim_dc = qim; + qim1_dc = qim1; + GdL_dc = GdL; + FdL_dc = FdL; + H_dc = H; + eta_p_dc = eta_p; + Gvsat_dc = Gvsat; + Gvsatinv_dc = Gvsatinv; + Gmob_dL_dc = Gmob_dL; + x_ds_dc = x_ds; + x_m_dc = x_m; + Gf_dc = Gf; + Vdsat_dc = Vdsat; + Udse_dc = Udse; + Gmob_dc = Gmob; + xitsb_dc = xitsb; + Vdse_dc = Vdse; + `ifdef NQSmodel + xgm_dc = xgm; + thesat1_dc = thesat1; + margin_dc = margin; + `endif // NQSmodel + end // SPcalc_dc + + if (xg_dc <= 0) begin + Ids = 0.0; + end else begin + // Drain-source current + Ids = BET_i * (FdL_dc * qim1_dc * dps_dc * Gvsatinv_dc); + end + + // Surface potential in gate overlap regions + if (((SWIGATE_i != 0) && ((IGOV_i > 0.0) || (IGOVD_i > 0.0))) || ((SWGIDL_i != 0) && ((AGIDL_i > 0.0) || (AGIDLD_i > 0.0))) || (CGOV_i > 0.0) || (CGOVD_i > 0.0)) begin + SP_OV_xg = 0.5 * (xgs_ov + sqrt(xgs_ov * xgs_ov + SP_OV_eps2_s)); + xs_ov = -SP_OV_xg - GOV2_s * 0.5 + GOV_s * sqrt(SP_OV_xg + GOV2_s * 0.25 + SP_OV_a_s) + SP_OV_delta1_s; + SP_OV_xg = 0.5 * (xgd_ov + sqrt(xgd_ov * xgd_ov + SP_OV_eps2_d)); + xd_ov = -SP_OV_xg - GOV2_d * 0.5 + GOV_d * sqrt(SP_OV_xg + GOV2_d * 0.25 + SP_OV_a_d) + SP_OV_delta1_d; + Vovs = -phita * (xgs_ov + xs_ov); + Vovd = -phita * (xgd_ov + xd_ov); + end + + // Gate current + Igsov = 0.0; + Igdov = 0.0; + Igc = 0.0; + Igb = 0.0; + Igcs = 0.0; + Igcd = 0.0; + if (SWIGATE_i != 0) begin + if (IGOV_i > 0.0) begin + // Gate-source overlap component of gate current + zg = sqrt(Vovs * Vovs + 1.0e-6) * inv_CHIB; + if (GC3OV_i < 0.0) begin + zg = `MINA(zg, GCQOV, 1.0e-6); + end + temp = BOV * (-1.5 + zg * (GC2OV_i + GC3OV_i * zg)); + if (temp > 0.0) begin + TP = `P3(temp); + end else begin + `expl_low(temp, TP) + end + Fs1 = 3.0 + xs_ov; + Fs2 = -3.0 - GCO_i; + Fs3 = 30.0 * VgsPrime; + `MNE(Fs1, Fs3, 0.9, temp) + `MXE(Fs2, temp, 0.3, Fs) + Igsov = IGOV_i * (TP * Fs); + end + + if (IGOVD_i > 0.0) begin + // Gate-drain overlap component of gate current + zg = sqrt(Vovd * Vovd + 1.0e-6) * inv_CHIB; + if (GC3OV_i < 0.0) begin + zg = `MINA(zg, GCQOV, 1.0e-6); + end + temp = BOV_d * (-1.5 + zg * (GC2OV_i + GC3OV_i * zg)); + if (temp > 0.0) begin + TP = `P3(temp); + end else begin + `expl_low(temp, TP) + end + Fs1 = 3.0 + xd_ov; + Fs2 = -3.0 - GCO_i; + Fs3 = 30.0 * VgdPrime; + `MNE(Fs1, Fs3, 0.9, temp) + `MXE(Fs2, temp, 0.3, Fs) + Igdov = IGOVD_i * (TP * Fs); + end + + // Gate-channel component of gate current + if (IGINV_i > 0.0) begin + if (xg_dc <= 0.0) begin + temp = pow(Vds / Vdsat_lim, AX_i); + Udse_dc = Vds * pow(1.0 + temp, -inv_AX) * inv_phit1; + end + `expl_low(x_ds_dc-Udse_dc, temp) + Vm = Vsbstar_dc + phit1 * (0.5 * x_ds_dc - ln(0.5 * (1.0 + temp))); + Dch = GCO_i * phit1; + arg2mina = Voxm_dc + Dch; + psi_t = `MINA(0.0, arg2mina, 0.01); + zg = sqrt(Voxm_dc * Voxm_dc + 1.0e-6) * inv_CHIB; + if (GC3_i < 0.0) begin + zg = `MINA(zg, GCQ, 1.0e-06); + end + arg1 = (x_m_dc + (psi_t - alpha_b - Vm) * inv_phit1); + `expl(arg1,Dsi) + arg1 = -(Vgs + Vsbstar_dc - Vm) * inv_phit1; + `expl(arg1,temp) + Dgate = Dsi * temp; + temp = BCH * (-1.5 + zg * (GC2_i + GC3_i * zg)); + if (temp > 0) begin + TP = `P3(temp); + end else begin + `expl_low(temp, TP) + end + Igc0 = IGINV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); + + // Source/drain partitioning of gate-channel current + if ((xg_dc <= 0.0) || ((GC2_i == 0.0) && (GC3_i == 0.0))) begin + igc = 1.0; + igcd_h = 0.5; + end else begin + temp = GC2_i + 2.0 * GC3_i * zg; + u0 = CHIB_i / (temp * BCH); + x = 0.5 * (dps_dc / u0); + u0_div_H = u0 / H_dc; + Bg = u0_div_H * (1.0 - u0_div_H) * 0.5; + Ag = 0.5 - 3.0 * Bg; + if (x < 1.0e-3) begin + xsq = x * x; + igc = 1.0 + xsq * (`oneSixth + u0_div_H * `oneThird + `oneSixth * (xsq * (0.05 + 0.2 * u0_div_H))); + igcd_h = 0.5 * igc - `oneSixth * (x * (1.0 + xsq * (0.4 * (Bg + 0.25) + 0.0285714285714 * (xsq * (0.125 + Bg))))); + end else begin + inv_x = 1.0 / x; + `expl(x, ex) + inv_ex = 1.0 / ex; + temp = ex - inv_ex; + temp2 = ex + inv_ex; + igc = 0.5 * ((1.0 - u0_div_H) * temp * inv_x + u0_div_H * temp2); + igcd_h = 0.5 * (igc - temp * (Bg - Ag * inv_x * inv_x) - Ag * temp2 * inv_x); + end + end + Sg = 0.5 * (1.0 + xg_dc / sqrt(xg_dc * xg_dc + 1.0e-6)); + Igc = Igc0 * igc * Sg; + Igcd = Igc0 * igcd_h * Sg; + Igcs = Igc - Igcd; + Igb = Igc0 * igc * (1.0 - Sg); + end // (IGINV >0) + end // (SWIGATE != 0) + + // GIDL/GISL current + Igidl = 0.0; + Igisl = 0.0; + if (SWGIDL_i != 0) begin + // GIDL current computation + if ((AGIDLD_i > 0) && (Vovd < 0)) begin + Vtovd = sqrt(Vovd * Vovd + CGIDLD_i * CGIDLD_i * (VdbPrime * VdbPrime) + 1.0e-6); + temp = -BGIDLDs / Vtovd; + `expl_low(temp, temp2) + Igidl = -AGIDLDs * (VdbPrime * Vovd * Vtovd * temp2); + end + + // GISL current computation + if ((AGIDL_i > 0) && (Vovs < 0)) begin + Vtovs = sqrt(Vovs * Vovs + CGIDL_i * CGIDL_i * (VsbPrime * VsbPrime) + 1.0e-6); + temp = -BGIDLs / Vtovs; + `expl_low(temp, temp2) + Igisl = -AGIDLs * (VsbPrime * Vovs * Vtovs * temp2); + end + end // (SWGIDL != 0) + + // Drain current of edge transistors: PSP 103.4 + xgedge = 0.0; + qdseffedge = 0.0; + qmeffedge = 0.0; + dsqredge = 1.0e-40; + alphabmedge = 1.0; + Idsedge = 0.0; + if ((SWEDGE_i != 0.0) && (BETNEDGE_i > 0)) begin + temp = `MINA(Vdb, Vsb, bphiedge) + phixedge; + Vsbstaredge = Vsb - `MINA(temp, 0, aphiedge) + phix1edge; + Vsbxedge = Vsbstaredge + 0.5 * (Vds - Vdsx); + dphit1edge = PSCEEDGE_i * (1 + PSCEDEDGE_i * Vdsx)* (1.0 + PSCEBEDGE_i * Vsbxedge); // SCE on subthreshold slope + phit1edge = phit0edge * (1.0 + dphit1edge); + inv_phit1edge = 1.0 / phit1edge; + Vdspedge = 2.0 * Vdsx / (1.0 + sqrt(1.0 + CFDEDGE_i * Vdsx)); + delVgedge = CFEDGE_i * Vdspedge * (1 + CFBEDGE_i * Vsbxedge); // DIBL effect + xgedge = inv_phit1edge * (Vgs + Vsbstaredge + delVgedge - VFBEDGE_T); + xbedge = inv_phit1edge * phibedge; + dxthedge = 2.0 * ln(xbedge / Gfedge + sqrt(xbedge)); + xnedge_s = inv_phit1edge * Vsbstaredge; + `qi_edge(qseffedge,xgedge,xnedge_s) + xnedge_d = inv_phit1edge * (Vdse_dc + Vsbstaredge); + if ((qseffedge < 1.0e-3) && (Vdse_dc < 1.0e-6)) begin + `expl_low((-xnedge_d + xnedge_s), temp) + qdseffedge = qseffedge * (temp - 1.0); + qdeffedge = qdseffedge + qseffedge; + end else begin + `qi_edge(qdeffedge,xgedge,xnedge_d) + qdseffedge = qdeffedge - qseffedge; + end + qmeffedge = 0.5 * (qdeffedge + qseffedge); + dsqredge = max(xgedge - qmeffedge, 1.0e-40); + alphabmedge = 1.0 - 0.5 * Gfedge / sqrt(dsqredge + 0.25 * Gfedge2); + Idsedge = -BETEDGE_i * phit1edge * phit1edge * (alphabmedge * qmeffedge + 1.0) * qdseffedge / Gmob_dc; + end + + // Impact-Ionization + if ((xg_dc > 0) && (SWIMPACT_i != 0)) begin + delVsat = Vds - A3_i * dps_dc; + if (delVsat > 0) begin + temp2 = A2_T * ((1.0 + A4_i * (sqrt(phib_dc + Vsbstar_dc) - sqrt_phib_dc)) / (delVsat + 1.0e-30)); + `expl(-temp2, temp) + mavl = A1_i * (delVsat * temp); + Iimpact = mavl * (Ids + Idsedge); + end + end + + // Threshold voltage calculation for .OP + P_D = 1.0 + 0.25 * (Gf_dc * kp); + facvsb0 = phib_dc + 2.0 * phit1; + facvsb = Vsbstar_dc + facvsb0; + vts_i = VFB_T + P_D * facvsb - Vsbstar_dc + Gf_dc * sqrt(phit1 * facvsb ); + vth_i = vts_i - delVg; + + end // evaluateStatic + + // -------------------------------------------------------------------------------------------------------------- + // AC bias dependent quantities (calculations for charge contribs) + // -------------------------------------------------------------------------------------------------------------- + begin : evaluateDynamic + + // Core's model calculation for AC + begin : SPcalc_ac + + // Local variable declaration +// `SPcalcLocalVarDecl + + // SP calculations + if ((SWNUD_i == 1) || (SWDELVTAC_i != 0) || (SWQSAT_i == 1)) begin + + Vsbstar = Vsbstar_dc_tmp; + phib = phib_dc; + G_0 = G_0_dc; + cfloc = CF_i; + thesatloc = THESAT_T; + axloc = AX_i; + alploc = ALP_i; + + if (SWDELVTAC_i != 0) begin + // Conditioning of terminal voltages + temp = `MINA(Vdb, Vsb, bphi_ac) + phix_ac; + Vsbstar_ac = Vsb - `MINA(temp, 0.0, aphi_ac) + phix1_ac; + Vsbstar = Vsbstar_ac; + phib = phib_ac; + G_0 = G_0_ac; + end + + if (SWQSAT_i != 0) begin + cfloc = CFAC_i; + thesatloc = THESATAC_T; + axloc = AXAC_i; + alploc = ALPAC_i; + end + + // Calculation of PSP model's core + `SPCalculation + + xg_ac = xg; + qeff1_ac = qeff1; + Voxm_ac = Voxm; + alpha_ac = alpha; + dps_ac = dps; + qim_ac = qim; + GdL_ac = GdL; + H_ac = H; + eta_p_ac = eta_p; + Gvsat_ac = Gvsat; + Gmob_dL_ac = Gmob_dL; + `ifdef NQSmodel + Gf_ac = Gf; + x_m_ac = x_m; + xgm_ac = xgm; + thesat1_ac = thesat1; + margin_ac = margin; + `endif // NQSmodel + end else begin + xg_ac = xg_dc; + qeff1_ac = qeff1_dc; + Voxm_ac = Voxm_dc; + alpha_ac = alpha_dc; + dps_ac = dps_dc; + qim_ac = qim_dc; + GdL_ac = GdL_dc; + H_ac = H_dc; + eta_p_ac = eta_p_dc; + Gvsat_ac = Gvsat_dc; + Gmob_dL_ac = Gmob_dL_dc; + `ifdef NQSmodel + Gf_ac = Gf_dc; + x_m_ac = x_m_dc; + xgm_ac = xgm_dc; + thesat1_ac = thesat1_dc; + margin_ac = margin_dc; + `endif // NQSmodel + end + end // SPcalc_ac + + // Quantum mechanical corrections + COX_qm = COX_i; + if (qq > 0.0) begin + COX_qm = COX_i / (1.0 + qq * pow(qeff1_ac * qeff1_ac + qlim2, -1.0 * `oneSixth)); + end + + // Intrinsic charge model + if (xg_ac <= 0.0) begin + QG = Voxm_ac; + QI = 0.0; + QD = 0.0; + QB = QG; + end else begin + Fj = 0.5 * (dps_ac / H_ac); + Fj2 = Fj * Fj; + QG = Voxm_ac + 0.5 * (eta_p_ac * dps_ac * (Fj * GdL_ac * `oneThird - 1.0 + GdL_ac)); + temp = alpha_ac * dps_ac * `oneSixth; + if (SWQPART_i == 1) begin + QCLM = 0.0; + QD = 0.5 * GdL_ac * GdL_ac * (qim_ac - 3.0 * temp * (2.0 - Fj)); + end else begin + QCLM = (1.0 - GdL_ac) * (qim_ac - 0.5 * (alpha_ac * dps_ac)); + QD = 0.5 * (GdL_ac * GdL_ac * (qim_ac - temp * (1.0 - Fj - 0.2 * Fj2)) + QCLM * (1.0 + GdL_ac)); + end + QI = GdL_ac * (qim_ac + temp * Fj) + QCLM; + QB = QG - QI; + end + Qg = QG * COX_qm; + Qd = -QD * COX_qm; + Qb = -QB * COX_qm; + + // Extrinsic charge model + Qgs_ov = CGOV_i * Vovs; + Qgd_ov = CGOVD_i * Vovd; + Qgb_ov = CGBOV_i * Vgb; + + // Outer fringe charge + Qfgs = CFR_i * VgsPrime; + Qfgd = CFRD_i * VgdPrime; + + // Variables for NQS model + `ifdef NQSmodel + Gp = 0.0; + Gp2 = 0.0; + a_factrp = 0.0; + marginp = 0.0; + if (SWNQS_i != 0) begin + if (xg_ac <= 0.0) begin + ym = 0.5; + pd = 1.0; + Gp = Gf_ac; + end else begin + ym = 0.5 * ( 1.0 + 0.25 * (dps_ac / H_ac)); + pd = xgm_ac / (xg_ac - x_m_ac); + Gp = Gf_ac / pd; + end + Gp2 = Gp * Gp; + a_factrp = 1.0 + Gp * `invSqrt2; + marginp = 1.0e-5 * a_factrp; + end + `endif // NQSmodel + + end // evaluateDynamic + + // -------------------------------------------------------------------------------------------------------------- + // JUNCAP2 contribs + // -------------------------------------------------------------------------------------------------------------- + begin : evaluateStaticDynamic + ijun_s = 0.0; + ijunbot_s = 0.0; + ijunsti_s = 0.0; + ijungat_s = 0.0; + ijun_d = 0.0; + ijunbot_d = 0.0; + ijunsti_d = 0.0; + ijungat_d = 0.0; + qjun_s = 0.0; + qjunbot_s = 0.0; + qjunsti_s = 0.0; + qjungat_s = 0.0; + qjun_d = 0.0; + qjunbot_d = 0.0; + qjunsti_d = 0.0; + qjungat_d = 0.0; + if (SWJUNCAP_i > 0) begin + if (SWJUNEXP_i == 1) begin + `JuncapExpressCurrent(Vjun_s, MFOR1_s, ISATFOR1_s, MFOR2_s, ISATFOR2_s, MREV_s, ISATREV_s, m0flag_s, xhighf1_s, expxhf1_s, xhighf2_s, expxhf2_s, xhighr_s, expxhr_s, ijun_s) + `JuncapExpressCurrent(Vjun_d, MFOR1_d, ISATFOR1_d, MFOR2_d, ISATFOR2_d, MREV_d, ISATREV_d, m0flag_d, xhighf1_d, expxhf1_d, xhighf2_d, expxhf2_d, xhighr_d, expxhr_d, ijun_d) + begin : evaluateDynamic +// real tmpv, vjv; + `JuncapExpressCharge(Vjun_s, ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, qprefbot, qprefsti, qprefgat, qpref2bot, qpref2sti, qpref2gat, vbiinvbot, vbiinvsti, vbiinvgat, one_minus_PBOT, one_minus_PSTI, one_minus_PGAT, vfmin_s, vch_s, zflagbot_s, zflagsti_s, zflaggat_s, qjunbot_s, qjunsti_s, qjungat_s) + `JuncapExpressCharge(Vjun_d, ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, qprefbot_d, qprefsti_d, qprefgat_d, qpref2bot_d, qpref2sti_d, qpref2gat_d, vbiinvbot_d, vbiinvsti_d, vbiinvgat_d, one_minus_PBOT_d, one_minus_PSTI_d, one_minus_PGAT_d, vfmin_d, vch_d, zflagbot_d, zflagsti_d, zflaggat_d, qjunbot_d, qjunsti_d, qjungat_d) + end + end else begin + `juncapcommon(Vjun_s, ABSOURCE_i, LSSOURCE_i, LGSOURCE_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_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s, ijunbot_s, qjunbot_s, ijunsti_s, qjunsti_s, ijungat_s, qjungat_s) + ijun_s = ABSOURCE_i * ijunbot_s + LSSOURCE_i * ijunsti_s + LGSOURCE_i * ijungat_s; + `juncapcommon(Vjun_d, ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, qprefbot_d, qpref2bot_d, vbiinvbot_d, one_minus_PBOT_d, idsatbot_d, CSRHBOTD_i, CTATBOTD_i, vbibot_d, wdepnulrbot_d, VBIRBOTinv_d, PBOTD_i, ftdbot_d, btatpartbot_d, atatbot_d, one_over_one_minus_PBOT_d, CBBTBOTD_i, VBIRBOTD_i, wdepnulrinvbot_d, fbbtbot_d, VBRBOTD_i, VBRinvbot_d, PBRBOTD_i, fstopbot_d, slopebot_d, qprefsti_d, qpref2sti_d, vbiinvsti_d, one_minus_PSTI_d, idsatsti_d, CSRHSTID_i, CTATSTID_i, vbisti_d, wdepnulrsti_d, VBIRSTIinv_d, PSTID_i, ftdsti_d, btatpartsti_d, atatsti_d, one_over_one_minus_PSTI_d, CBBTSTID_i, VBIRSTID_i, wdepnulrinvsti_d, fbbtsti_d, VBRSTID_i, VBRinvsti_d, PBRSTID_i, fstopsti_d, slopesti_d, qprefgat_d, qpref2gat_d, vbiinvgat_d, one_minus_PGAT_d, idsatgat_d, CSRHGATD_i, CTATGATD_i, vbigat_d, wdepnulrgat_d, VBIRGATinv_d, PGATD_i, ftdgat_d, btatpartgat_d, atatgat_d, one_over_one_minus_PGAT_d, CBBTGATD_i, VBIRGATD_i, wdepnulrinvgat_d, fbbtgat_d, VBRGATD_i, VBRinvgat_d, PBRGATD_i, fstopgat_d, slopegat_d, VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d, ijunbot_d, qjunbot_d, ijunsti_d, qjunsti_d, ijungat_d, qjungat_d) + ijun_d = ABDRAIN_i * ijunbot_d + LSDRAIN_i * ijunsti_d + LGDRAIN_i * ijungat_d; + end + end + + // -------------------------------------------------------------------------------------------------------------- + // NQS and parasitic resistance contribs + // -------------------------------------------------------------------------------------------------------------- + + // Set initial conditions for NQS model + `ifdef NQSmodel + `include "PSP103_InitNQS.include" + `endif // NQSmodel + + // Parasitic resistances (including noise) + rgatenoise = nt0 * ggate; + rsourcenoise = nt0 * gsource; + rdrainnoise = nt0 * gdrain; + rbulknoise = nt0 * gbulk; + rjunsnoise = nt0 * gjuns; + rjundnoise = nt0 * gjund; + rwellnoise = nt0 * gwell; + + end // evaluateStaticDynamic + + // -------------------------------------------------------------------------------------------------------------- + // Current contribs + // -------------------------------------------------------------------------------------------------------------- + begin : loadStatic + + // Convert back for NMOS-PMOS and Source-Drain interchange + if (sigVds > 0.0) begin + I(DI, BP) <+ CHNL_TYPE * MULT_i * Iimpact; + I(DI, SI) <+ CHNL_TYPE * MULT_i * (Ids + Idsedge); + I(GP, SI) <+ CHNL_TYPE * MULT_i * Igcs; + I(GP, DI) <+ CHNL_TYPE * MULT_i * Igcd; + end else begin + I(SI, BP) <+ CHNL_TYPE * MULT_i * Iimpact; + I(SI, DI) <+ CHNL_TYPE * MULT_i * (Ids + Idsedge); + I(GP, DI) <+ CHNL_TYPE * MULT_i * Igcs; + I(GP, SI) <+ CHNL_TYPE * MULT_i * Igcd; + end + I(GP, BP) <+ CHNL_TYPE * MULT_i * Igb; + I(GP, SI) <+ CHNL_TYPE * MULT_i * Igsov; + I(GP, DI) <+ CHNL_TYPE * MULT_i * Igdov; + I(SI, BP) <+ CHNL_TYPE * MULT_i * Igisl; + I(DI, BP) <+ CHNL_TYPE * MULT_i * Igidl; + I(BS, SI) <+ CHNL_TYPE * MULT_i * ijun_s; + I(BD, DI) <+ CHNL_TYPE * MULT_i * ijun_d; + + //ngspice-adms: Parasitic resistances - no node collapse + `NonCollapsableR(ggate, RG_i, rgatenoise, G, GP, "rgate") + `NonCollapsableR(gsource, RSE_i, rsourcenoise, S, SI, "rsource") + `NonCollapsableR(gdrain, RDE_i, rdrainnoise, D, DI, "rdrain") + `NonCollapsableR(gbulk, RBULK_i, rbulknoise, BP, BI, "rbulk") + `NonCollapsableR(gjuns, RJUNS_i, rjunsnoise, BS, BI, "rjuns") + `NonCollapsableR(gjund, RJUND_i, rjundnoise, BD, BI, "rjund") + `NonCollapsableR(gwell, RWELL_i, rwellnoise, B, BI, "rwell") + + I(DI, SI) <+ `GMIN * V(DI, SI); + + end // loadStatic + + // -------------------------------------------------------------------------------------------------------------- + // ddt() contribs from charges (Note: MULT is handled explicitly) + // -------------------------------------------------------------------------------------------------------------- + begin : loadStaticDynamic + + // Implementation of NQS charges + `ifdef NQSmodel + `include "PSP103_ChargesNQS.include" + `endif // NQSmodel + + // Implementation of Self heating effect + `ifdef SelfHeating + begin : self_heating +// real Pdiss_s, Pdiss_d; + Pdiss = 0.0; + Pdiss_s = 0.0; + Pdiss_d = 0.0; + if (RSE_i > 0.0) begin + Pdiss_s = gsource * V(S, SI) * V(S, SI); + end + if (RDE_i > 0.0) begin + Pdiss_d = gdrain * V(D, DI) * V(D, DI); + end + if (RTH_p > 1.0e-3) begin + Pdiss = ((Ids + Idsedge) * Vds + Iimpact * (Vds + Vsb) + Pdiss_s + Pdiss_d); + end + Pwr(br_ith) <+ -MULT_i * Pdiss; + Pwr(br_rth) <+ ddt(MULT_i * CTH_i * Temp(br_rth)); + Pwr(br_rth) <+ MULT_i * Temp(br_rth) / RTH_T; + end // self_heating + `endif // SelfHeating + + end // loadStaticDynamic + + begin : loadDynamic + + // Local variable +// real temp; + + // Intrinsic MOSFET charges + Qs = -(Qg + Qb + Qd); + + // Total outerFringe + overlap for gate-source and gate-drain. + Qfgs = Qfgs + Qgs_ov; + Qfgd = Qfgd + Qgd_ov; + + // JUNCAP2 + qjun_s = ABSOURCE_i * qjunbot_s + LSSOURCE_i * qjunsti_s + LGSOURCE_i * qjungat_s; + qjun_d = ABDRAIN_i * qjunbot_d + LSDRAIN_i * qjunsti_d + LGDRAIN_i * qjungat_d; + + // Convert back (undo S-D interchange) + if (sigVds < 0.0) begin + temp = Qd; // Qd <--> Qs + Qd = Qs; + Qs = temp; + end + + I(GP, SI) <+ ddt(CHNL_TYPE * MULT_i * Qg); + I(BP, SI) <+ ddt(CHNL_TYPE * MULT_i * Qb); + I(DI, SI) <+ ddt(CHNL_TYPE * MULT_i * Qd); + I(GP, SI) <+ ddt(CHNL_TYPE * MULT_i * Qfgs); + I(GP, DI) <+ ddt(CHNL_TYPE * MULT_i * Qfgd); + I(GP, BP) <+ ddt(CHNL_TYPE * MULT_i * Qgb_ov); + I(BS, SI) <+ ddt(CHNL_TYPE * MULT_i * qjun_s); + I(BD, DI) <+ ddt(CHNL_TYPE * MULT_i * qjun_d); + + end // loadDynamic + + // -------------------------------------------------------------------------------------------------------------- + // Noise + // -------------------------------------------------------------------------------------------------------------- + begin : noise + + // Noise variable calculation + Sfl = 0.0; + Sidexc = 0.0; + mid = 0.0; + mig = 1.0e-40; + migid = 0.0; + c_igid = 0.0; + CGeff = COX_qm * eta_p_ac; + sqid = 0.0; + sqig = 0.0; + Sfledge = 0.0; + midedge = 0.0; + sqidedge = 0.0; + + // Channel noise contributions + if ((xg_dc > 0.0) && (MULT_i > 0.0) && (BET_i > 0.0)) begin + // Flicker noise + N1 = Cox_over_q * alpha_dc * phit; + Nm1 = Cox_over_q * qim1_dc; + Delta_N1 = Cox_over_q * alpha_dc * dps_dc; + Sfl = (NFA_i - NFB_i * N1 + NFC_i * (N1 * N1)) * ln((Nm1 + 0.5 * Delta_N1) / (Nm1 - 0.5 * Delta_N1)); + Sfl = Sfl + (NFB_i + NFC_i * (Nm1 - 2.0 * N1)) * Delta_N1; + Sfl = Sfl_prefac * Ids * Gvsatinv_dc * Sfl / N1; + Sfl = `CLIP_LOW(Sfl, 0.0); + + // Thermal channel noise + H0 = qim1_dc / alpha_dc; + t1 = qim_dc / qim1_dc; + sqt2 = 0.5 * `oneSixth * (dps_dc / H0); + t2 = sqt2 * sqt2; + r = H0 / H_dc - 1.0; + lc = `CLIP_LOW(1.0 - 12.0 * (r * t2), 1.0e-20); + lcinv2 = 1.0 / (lc * lc); + g_ideal = BET_i * (FdL_dc * qim1_dc * Gvsatinv_dc); + mid = t1 + 12.0 * t2 - 24.0 * ((1.0 + t1) * t2 * r); + mid = `CLIP_LOW(mid, 1.0e-40); + mid = g_ideal * lcinv2 * mid; + if (FNTEXC_i > 0.0) begin + // recalculate Gvsat, excluding Gmob-effect + temp2_exc = qim_dc * xitsb_dc; + wsat_exc = 100.0 * (temp2_exc / (100.0 + temp2_exc)); + if (THESATG_i < 0) begin + temp_exc = 1.0 / (1.0 - THESATG_i * wsat_exc); + end else begin + temp_exc = 1.0 + THESATG_i * wsat_exc; + end + thesat1_exc = THESAT_T * (temp_exc / Gmob_dc); + zsat_exc = thesat1_exc * thesat1_exc * dps_dc * dps_dc; + if (CHNL_TYPE == `PMOS) begin + zsat_exc = zsat_exc / (1.0 + thesat1_exc * dps_dc); + end + Gvsat_exc = 0.5 * (Gmob_dc * (1.0 + sqrt(1.0 + 2.0 * zsat_exc))); + gfac = Gmob_dc / (Gvsat_exc * lc); + Sidexc = fac_exc * Ids * Vdse_dc * gfac * gfac; + mid = mid + Sidexc / nt0; + end + sqid = sqrt(nt * mid); + + // Induced gate noise + if ((SWIGN_i == 1) && (nt > 0.0)) begin + mig = t1 / 12.0 - t2 * (t1 + 0.2 - 12.0 * t2) - 1.6 * (t2 * (t1 + 1.0 - 12.0 * t2) * r); + mig = `CLIP_LOW(mig, 1.0e-40); + mig = lcinv2 / g_ideal * mig; + migid0 = lcinv2 * sqt2 * (1.0 - 12.0 * t2 - (t1 + 19.2 * t2 - 12.0 * (t1 * t2)) * r); + CGeff = Gvsat_ac * Gvsat_ac * COX_qm * eta_p_ac / (Gmob_dL_ac * Gmob_dL_ac); + if (FNTEXC_i > 0.0) begin + mig = mig + Sidexc * (1.0 + 12.0 * t2) / (12.0 * g_ideal * g_ideal * nt0); + migid0 = migid0 - Sidexc * sqt2 * (1.0 + r) / (g_ideal * nt0); + end + sqig = sqrt(nt / mig); + if (sqid == 0) begin + c_igid = 0.0; + end else begin + c_igid = migid0 * sqig / sqid; // = migid0 / sqrt(mig * mid); + end + c_igid = `CLIP_BOTH(c_igid, 0.0, 1.0); + migid = c_igid * sqid / sqig; + end + end + + // Noise of gate leakage currents + shot_igcsx = 2.0 * `QELE * abs(Igcs); + shot_igcdx = 2.0 * `QELE * abs(Igcd); + shot_igsov = 2.0 * `QELE * abs(Igsov); + shot_igdov = 2.0 * `QELE * abs(Igdov); + + // Noise of impact ionization currents + shot_iavl = 2.0 * `QELE * ((mavl + 1) * abs(Iimpact)); + + // Noise of junctions (JUNCAP2) + jnoisex_s = 2.0 * `QELE * abs(ijun_s); + jnoisex_d = 2.0 * `QELE * abs(ijun_d); + if (sigVds > 0.0) begin + shot_igs = shot_igcsx + shot_igsov; + shot_igd = shot_igcdx + shot_igdov; + jnoise_s = jnoisex_s; + jnoise_d = jnoisex_d + shot_iavl; + end else begin + shot_igs = shot_igcdx + shot_igsov; + shot_igd = shot_igcsx + shot_igdov; + jnoise_s = jnoisex_s + shot_iavl; + jnoise_d = jnoisex_d; + end + + // Noise of edge transistors: PSP 103.4 + if ((SWEDGE_i != 0.0) && (BETNEDGE_i > 0) && (xgedge > 0)) begin + // Flicker noise of edge transistor + temp1 = 4.0 * dsqredge / Gfedge2; + anoisedge = sqrt(temp1 + 1.0) / (sqrt(temp1 + 1.1) - 1.0); + temp1 = Cox_over_q * phit; + N1edge = temp1 * anoisedge; + Nm1edge = temp1 * (qmeffedge + anoisedge); + Delta_N1edge = -temp1 * anoisedge * alphabmedge * qdseffedge; + Sfledge = (NFAEDGE_i - (NFBEDGE_i - NFCEDGE_i * N1edge) * N1edge) * ln((Nm1edge + 0.5 * Delta_N1edge) / (Nm1edge - 0.5 * Delta_N1edge)); + Sfledge = Sfledge + (NFBEDGE_i + NFCEDGE_i * (Nm1edge - 2.0 * N1edge)) * Delta_N1edge; + Sfledge = Sfl_prefac_edge * Idsedge * Gvsatinv_dc * Sfledge / N1edge; + Sfledge = `CLIP_LOW(Sfledge, 0.0); + + // Thermal channel noise of edge transistor + H0edge = phit * (qmeffedge + anoisedge) / anoisedge; + t1edge = phit1 / phit * qmeffedge / (qmeffedge + anoisedge); + sqt2edge = -0.5 * `oneSixth * phit * alphabmedge * qdseffedge / H0edge; + t2edge = sqt2edge * sqt2edge; + redge = 0.0; + temp1 = alpha_dc * H_dc; + if (temp1 > 1.0e-10) begin + redge = anoisedge * H0edge / temp1 - 1.0; + end + lcedge = `CLIP_LOW(1.0 - 12.0 * (redge * t2edge), 1.0e-20); + lcinv2edge = 1.0 / (lcedge * lcedge); + g_idealedge = BETEDGE_i * phit * (qmeffedge + anoisedge) * FdL_dc * Gvsatinv_dc; + midedge = t1edge + 12.0 * t2edge - 24.0 * ((1.0 + t1edge) * t2edge * redge); + midedge = `CLIP_LOW(midedge, 1.0e-40); + midedge = g_idealedge * lcinv2edge * midedge; + sqidedge = sqrt(ntedge * midedge); + end + + // Noise contributions + I(NOII) <+ white_noise((nt / mig), "igig"); + I(NOIR) <+ V(NOIR) / mig; + I(NOIC) <+ ddt(CGeff * V(NOIC)); +//ngspice-adms: can't handle specific noise contributions +// I(GP,SI) <+ -ddt(sqrt(MULT_i) * 0.5 * CGeff * V(NOIC)); +// I(GP,DI) <+ -ddt(sqrt(MULT_i) * 0.5 * CGeff * V(NOIC)); +// I(DI,SI) <+ sigVds * sqrt(MULT_i) * migid * I(NOII); + I(DI,SI) <+ white_noise(MULT_i * sqid * sqid * (1.0 - c_igid * c_igid), "idid"); + I(DI,SI) <+ flicker_noise(MULT_i * Sfl, EF_i, "flicker"); + I(GP,SI) <+ white_noise(MULT_i * shot_igs, "igs"); + I(GP,DI) <+ white_noise(MULT_i * shot_igd, "igd"); + I(BS,SI) <+ white_noise(MULT_i * jnoise_s, "ibs"); + I(BD,DI) <+ white_noise(MULT_i * jnoise_d, "ibd"); + I(DI,SI) <+ flicker_noise(MULT_i * Sfledge, EFEDGE_i, "flicker"); + I(DI,SI) <+ white_noise(MULT_i * sqidedge * sqidedge, "ididedge"); + + end // noise + + // -------------------------------------------------------------------------------------------------------------- + // Operating point info + // -------------------------------------------------------------------------------------------------------------- + begin : OPinfo + + // Auxiliary variables + id_op = Ids + Idsedge + Iimpact - Igcd; + is = -Ids - Idsedge - Igcs; + ig = Igcs + Igcd + Igsov + Igdov + Igb; + ib = -Iimpact - Igb - Igidl - Igisl; + sig1k = 2.0e3 * `PI * CGeff; + sig1k = sig1k * sig1k * mig; + + // Actual operation point output variables + sdint = sigVds; + ctype = CHNL_TYPE; + if (sigVds < 0.0) begin + ise = MULT_i * (is - Igdov + Igidl - ijun_d); + ige = MULT_i * ig; + ide = MULT_i * (id_op - Igsov + Igisl - ijun_s); + ibe = MULT_i * (ib + ijun_s + ijun_d); + ids = MULT_i * Ids; + idb = MULT_i * (Iimpact + Igisl - ijun_s); + isb = MULT_i * (Igidl - ijun_d); + igs = MULT_i * (Igcs + Igdov); + igd = MULT_i * (Igcd + Igsov); + igb = MULT_i * Igb; + idedge = MULT_i * Idsedge; + igcs = MULT_i * Igcs; + igcd = MULT_i * Igcd; + iavl = MULT_i * Iimpact; + igisl = MULT_i * Igidl; + igidl = MULT_i * Igisl; + if (SWJUNEXP_i == 1) begin + ijsbot = 0.0; + ijsgat = 0.0; + ijssti = 0.0; + ijdbot = 0.0; + ijdgat = 0.0; + ijdsti = 0.0; + idsatsbot = 0.0; + idsatssti = 0.0; + idsatsgat = 0.0; + idsatsbotd = 0.0; + idsatsstid = 0.0; + idsatsgatd = 0.0; + end else begin + ijsbot = MULT_i * ABDRAIN_i * ijunbot_d; + ijsgat = MULT_i * LGDRAIN_i * ijungat_d; + ijssti = MULT_i * LSDRAIN_i * ijunsti_d; + ijdbot = MULT_i * ABSOURCE_i * ijunbot_s; + ijdgat = MULT_i * LGSOURCE_i * ijungat_s; + ijdsti = MULT_i * LSSOURCE_i * ijunsti_s; + idsatsbot = MULT_i * ABSOURCE_i * idsatbot; + idsatssti = MULT_i * LSSOURCE_i * idsatsti; + idsatsgat = MULT_i * LGSOURCE_i * idsatgat; + idsatsbotd = MULT_i * ABDRAIN_i * idsatbot_d; + idsatsstid = MULT_i * LSDRAIN_i * idsatsti_d; + idsatsgatd = MULT_i * LGDRAIN_i * idsatgat_d; + end + ijs = MULT_i * ijun_d; + ijd = MULT_i * ijun_s; + vds = Vds; + vgs = Vgs; + vsb = Vsb; + vto = VFB_T + P_D * facvsb0 + Gf_dc * sqrt(phit1 * facvsb0); + vts = vts_i; + vth = vth_i; + vgt = vgs - vth; + vdss = Vdsat_dc; + vsat = Vds - vdss; + ids_i = Ids + Idsedge + Iimpact + Igisl - Igcd - Igsov - ijun_s; // Total drain-current + `ifdef OPderiv + gm = CHNL_TYPE * MULT_i * ddx(ids_i, V(GP)); + gmb = CHNL_TYPE * MULT_i * ddx(ids_i, V(BP)); + gds = CHNL_TYPE * MULT_i * ddx(ids_i, V(SI)); + gjs = MULT_i * ddx(ijun_d, V(BD)); + gjd = MULT_i * ddx(ijun_s, V(BS)); + css = CHNL_TYPE * MULT_i * ddx(Qd, V(DI)); + csg = -CHNL_TYPE * MULT_i * ddx(Qd, V(GP)); + csb = -CHNL_TYPE * MULT_i * ddx(Qd, V(BP)); + csd = css - csg - csb; + cgs = -CHNL_TYPE * MULT_i * ddx(Qg, V(DI)); + cgg = CHNL_TYPE * MULT_i * ddx(Qg, V(GP)); + cgb = -CHNL_TYPE * MULT_i * ddx(Qg, V(BP)); + cgd = cgg - cgs - cgb; + cds = -CHNL_TYPE * MULT_i * ddx(Qs, V(DI)); + cdg = -CHNL_TYPE * MULT_i * ddx(Qs, V(GP)); + cdb = -CHNL_TYPE * MULT_i * ddx(Qs, V(BP)); + cdd = cdg + cds + cdb; + cbs = -CHNL_TYPE * MULT_i * ddx(Qb, V(DI)); + cbg = -CHNL_TYPE * MULT_i * ddx(Qb, V(GP)); + cbb = CHNL_TYPE * MULT_i * ddx(Qb, V(BP)); + cbd = cbb - cbs - cbg; + cgsol = CHNL_TYPE * MULT_i * ddx(Qfgd, V(GP)); + cgdol = CHNL_TYPE * MULT_i * ddx(Qfgs, V(GP)); + cjsbot = -MULT_i * CHNL_TYPE * ABDRAIN_i * ddx(qjunbot_d, V(DI)); + cjsgat = -MULT_i * CHNL_TYPE * LGDRAIN_i * ddx(qjungat_d, V(DI)); + cjssti = -MULT_i * CHNL_TYPE * LSDRAIN_i * ddx(qjunsti_d, V(DI)); + cjs = cjsbot + cjsgat + cjssti; + cjdbot = -MULT_i * CHNL_TYPE * ABSOURCE_i * ddx(qjunbot_s, V(SI)); + cjdgat = -MULT_i * CHNL_TYPE * LGSOURCE_i * ddx(qjungat_s, V(SI)); + cjdsti = -MULT_i * CHNL_TYPE * LSSOURCE_i * ddx(qjunsti_s, V(SI)); + cjd = cjdbot + cjdgat + cjdsti; + `endif // OPderiv + end else begin + ise = MULT_i * (is - Igsov + Igisl - ijun_s); + ige = MULT_i * ig; + ide = MULT_i * (id_op - Igdov + Igidl - ijun_d); + ibe = MULT_i * (ib + ijun_s + ijun_d); + ids = MULT_i * Ids; + idb = MULT_i * (Iimpact + Igidl - ijun_d); + isb = MULT_i * (Igisl - ijun_s); + igs = MULT_i * (Igcs + Igsov); + igd = MULT_i * (Igcd + Igdov); + igb = MULT_i * Igb; + idedge = MULT_i * Idsedge; + igcs = MULT_i * Igcs; + igcd = MULT_i * Igcd; + iavl = MULT_i * Iimpact; + igisl = MULT_i * Igisl; + igidl = MULT_i * Igidl; + if (SWJUNEXP_i == 1) begin + ijsbot = 0.0; + ijsgat = 0.0; + ijssti = 0.0; + ijdbot = 0.0; + ijdgat = 0.0; + ijdsti = 0.0; + idsatsbot = 0.0; + idsatssti = 0.0; + idsatsgat = 0.0; + idsatsbotd = 0.0; + idsatsstid = 0.0; + idsatsgatd = 0.0; + end else begin + ijsbot = MULT_i * ABSOURCE_i * ijunbot_s; + ijsgat = MULT_i * LGSOURCE_i * ijungat_s; + ijssti = MULT_i * LSSOURCE_i * ijunsti_s; + ijdbot = MULT_i * ABDRAIN_i * ijunbot_d; + ijdgat = MULT_i * LGDRAIN_i * ijungat_d; + ijdsti = MULT_i * LSDRAIN_i * ijunsti_d; + idsatsbot = MULT_i * ABSOURCE_i * idsatbot; + idsatssti = MULT_i * LSSOURCE_i * idsatsti; + idsatsgat = MULT_i * LGSOURCE_i * idsatgat; + idsatsbotd = MULT_i * ABDRAIN_i * idsatbot_d; + idsatsstid = MULT_i * LSDRAIN_i * idsatsti_d; + idsatsgatd = MULT_i * LGDRAIN_i * idsatgat_d; + end + ijs = MULT_i * ijun_s; + ijd = MULT_i * ijun_d; + vds = Vds; + vgs = Vgs; + vsb = Vsb; + vto = VFB_T + P_D * facvsb0 + Gf_dc * sqrt(phit1 * facvsb0); + vts = vts_i; + vth = vth_i; + vgt = vgs - vth; + vdss = Vdsat_dc; + vsat = Vds - vdss; + ids_i = Ids + Idsedge + Iimpact + Igidl - Igcd - Igdov - ijun_d; // Total drain-current + `ifdef OPderiv + gm = CHNL_TYPE * MULT_i * ddx(ids_i, V(GP)); + gmb = CHNL_TYPE * MULT_i * ddx(ids_i, V(BP)); + gds = CHNL_TYPE * MULT_i * ddx(ids_i, V(DI)); + gjs = -MULT_i * ddx(ijun_s, V(SI)); + gjd = -MULT_i * ddx(ijun_d, V(DI)); + cdd = CHNL_TYPE * MULT_i * ddx(Qd, V(DI)); + cdg = -CHNL_TYPE * MULT_i * ddx(Qd, V(GP)); + cdb = -CHNL_TYPE * MULT_i * ddx(Qd, V(BP)); + cds = cdd - cdg - cdb; + cgd = -CHNL_TYPE * MULT_i * ddx(Qg, V(DI)); + cgg = CHNL_TYPE * MULT_i * ddx(Qg, V(GP)); + cgb = -CHNL_TYPE * MULT_i * ddx(Qg, V(BP)); + cgs = cgg - cgd - cgb; + csd = -CHNL_TYPE * MULT_i * ddx(Qs, V(DI)); + csg = -CHNL_TYPE * MULT_i * ddx(Qs, V(GP)); + csb = -CHNL_TYPE * MULT_i * ddx(Qs, V(BP)); + css = csg + csd + csb; + cbd = -CHNL_TYPE * MULT_i * ddx(Qb, V(DI)); + cbg = -CHNL_TYPE * MULT_i * ddx(Qb, V(GP)); + cbb = CHNL_TYPE * MULT_i * ddx(Qb, V(BP)); + cbs = cbb - cbd - cbg; + cgsol = CHNL_TYPE * MULT_i * ddx(Qfgs, V(GP)); + cgdol = CHNL_TYPE * MULT_i * ddx(Qfgd, V(GP)); + cjsbot = -MULT_i * CHNL_TYPE * ABSOURCE_i * ddx(qjunbot_s, V(SI)); + cjsgat = -MULT_i * CHNL_TYPE * LGSOURCE_i * ddx(qjungat_s, V(SI)); + cjssti = -MULT_i * CHNL_TYPE * LSSOURCE_i * ddx(qjunsti_s, V(SI)); + cjs = cjsbot + cjsgat + cjssti; + cjdbot = -MULT_i * CHNL_TYPE * ABDRAIN_i * ddx(qjunbot_d, V(DI)); + cjdgat = -MULT_i * CHNL_TYPE * LGDRAIN_i * ddx(qjungat_d, V(DI)); + cjdsti = -MULT_i * CHNL_TYPE * LSDRAIN_i * ddx(qjunsti_d, V(DI)); + cjd = cjdbot + cjdgat + cjdsti; + `endif // OPderiv + end + weff = WE; + leff = LE; + `ifdef OPderiv + if (abs(gds) < 1.0e-18) begin + u = 0.0; + rout = 0.0; + vearly = 0.0; + end else begin + u = gm / gds; + rout = 1.0 / gds; + vearly = ide / gds; + end + if (abs(vgt) < 1.0e-12) begin + beff = 0.0; + end else begin + beff = 2.0 * abs(ide) / (vgt * vgt); + end + if (abs(cgg + cgsol + cgdol) < 1.0e-30) begin + fug = 0.0; + end else begin + fug = gm / (2.0 * `PI * (cgg + cgsol + cgdol)); + end + rg_op = RG_i / MULT_i; + sfl = MULT_i * Sfl; + if (abs(gm) < 1.0e-18) begin + sqrtsff = 0.0; + sqrtsfw = 0.0; + end else begin + sqrtsff = sqrt(MULT_i * Sfl / 1000.0) / gm; + sqrtsfw = sqrt(MULT_i) * sqid / gm; + end + sid = MULT_i * sqid * sqid; + sig = MULT_i * nt * sig1k / (1.0 + sig1k * mig); + cigid = c_igid; + if (sid == 0.0) begin + fknee = 0.0; + end else begin + fknee = sfl / sid; + end + siavl = MULT_i * shot_iavl; + if (sigVds < 0.0) begin + sigs = MULT_i * (shot_igcsx + shot_igdov); + sigd = MULT_i * (shot_igcdx + shot_igsov); + ssi = MULT_i * jnoisex_d; + sdi = MULT_i * jnoisex_s; + end else begin + sigs = MULT_i * (shot_igcsx + shot_igsov); + sigd = MULT_i * (shot_igcdx + shot_igdov); + ssi = MULT_i * jnoisex_s; + sdi = MULT_i * jnoisex_d; + end + sfledge = MULT_i * Sfledge; + sidedge = MULT_i * sqidedge; + `endif // OPderiv + + lp_vfb = VFB_T; + lp_stvfb = STVFB_i; + lp_st2vfb = ST2VFB_i; + lp_tox = TOX_i; + lp_epsrox = EPSROX_i; + lp_neff = NEFF_i; + lp_facneffac = FACNEFFAC_i; + lp_gfacnud = GFACNUD_i; + lp_vsbnud = VSBNUD_i; + lp_dvsbnud = DVSBNUD_i; + lp_vnsub = VNSUB_i; + lp_nslp = NSLP_i; + lp_dnsub = DNSUB_i; + lp_dphib = DPHIB_i; + lp_delvtac = DELVTAC_i; + lp_np = NP_i; + lp_toxov = TOXOV_i; + lp_toxovd = TOXOVD_i; + lp_nov = NOV_i; + lp_novd = NOVD_i; + lp_ct = CT_T; + lp_ctg = CTG_T; + lp_ctb = CTB_i; + lp_stct = STCT_i; + lp_cf = CF_i; + lp_cfac = CFAC_i; + lp_cfd = CFD_i; + lp_cfb = CFB_i; + lp_psce = PSCE_i; + lp_psceb = PSCEB_i; + lp_psced = PSCED_i; + lp_betn = BETN_T; + lp_stbet = STBET_i; + lp_mue = MUE_T; + lp_stmue = STMUE_i; + lp_themu = THEMU_T; + lp_stthemu = STTHEMU_i; + lp_cs = CS_T; + lp_stcs = STCS_i; + lp_thecs = THECS_T; + lp_stthecs = STTHECS_i; + lp_xcor = XCOR_T; + lp_stxcor = STXCOR_i; + lp_feta = FETA_i; + lp_rs = RS_T; + lp_strs = STRS_i; + lp_rsb = RSB_i; + lp_rsg = RSG_i; + lp_thesat = THESAT_T; + lp_thesatac = THESATAC_T; + lp_stthesat = STTHESAT_i; + lp_thesatb = THESATB_i; + lp_thesatg = THESATG_i; + lp_ax = AX_i; + lp_axac = AXAC_i; + lp_alp = ALP_i; + lp_alpac = ALPAC_i; + lp_alp1 = ALP1_i; + lp_alp2 = ALP2_i; + lp_vp = VP_i; + lp_a1 = A1_i; + lp_a2 = A2_T; + lp_sta2 = STA2_i; + lp_a3 = A3_i; + lp_a4 = A4_i; + lp_gco = GCO_i; + lp_iginv = IGINV_i; + lp_igov = IGOV_i; + lp_igovd = IGOVD_i; + lp_stig = STIG_i; + lp_gc2 = GC2_i; + lp_gc3 = GC3_i; + lp_gc2ov = GC2OV_i; + lp_gc3ov = GC3OV_i; + lp_chib = CHIB_i; + lp_agidl = AGIDL_i; + lp_agidld = AGIDLD_i; + lp_bgidl = BGIDL_T; + lp_bgidld = BGIDLD_T; + lp_stbgidl = STBGIDL_i; + lp_stbgidld = STBGIDLD_i; + lp_cgidl = CGIDL_i; + lp_cgidld = CGIDLD_i; + lp_cox = COX_i; + lp_cgov = CGOV_i; + lp_cgovd = CGOVD_i; + lp_cgbov = CGBOV_i; + lp_cfr = CFR_i; + lp_cfrd = CFRD_i; + lp_fnt = FNT_i; + lp_fntexc = FNTEXC_i; + lp_nfa = NFA_i; + lp_nfb = NFB_i; + lp_nfc = NFC_i; + lp_ef = EF_i; + lp_vfbedge = VFBEDGE_T; + lp_stvfbedge = STVFBEDGE_i; + lp_dphibedge = DPHIBEDGE_i; + lp_neffedge = NEFFEDGE_i; + lp_ctedge = CTEDGE_i; + lp_betnedge = BETNEDGE_T; + lp_stbetedge = STBETEDGE_i; + lp_psceedge = PSCEEDGE_i; + lp_pscebedge = PSCEBEDGE_i; + lp_pscededge = PSCEDEDGE_i; + lp_cfedge = CFEDGE_i; + lp_cfdedge = CFDEDGE_i; + lp_cfbedge = CFBEDGE_i; + lp_fntedge = FNTEDGE_i; + lp_nfaedge = NFAEDGE_i; + lp_nfbedge = NFBEDGE_i; + lp_nfcedge = NFCEDGE_i; + lp_efedge = EFEDGE_i; + lp_rg = RG_i; + lp_rse = RSE_i; + lp_rde = RDE_i; + lp_rbulk = RBULK_i; + lp_rwell = RWELL_i; + lp_rjuns = RJUNS_i; + lp_rjund = RJUND_i; + `ifdef SelfHeating + lp_rth = RTH_i; + lp_cth = CTH_i; + lp_strth = STRTH_i; + pdiss = MULT_i * Pdiss; + dtsh = TKD - TKA; + `endif // SelfHeating + tk = TKD; + cjosbot = MULT_i * ABSOURCE_i * cjobot; + cjossti = MULT_i * LSSOURCE_i * cjosti; + cjosgat = MULT_i * LGSOURCE_i * cjogat; + vbisbot = vbibot; + vbissti = vbisti; + vbisgat = vbigat; + cjosbotd = MULT_i * ABDRAIN_i * cjobot_d; + cjosstid = MULT_i * LSDRAIN_i * cjosti_d; + cjosgatd = MULT_i * LGDRAIN_i * cjogat_d; + vbisbotd = vbibot_d; + vbisstid = vbisti_d; + vbisgatd = vbigat_d; + `ifdef NQSmodel + lp_munqs = MUNQS_i; + `endif // NQSmodel + + end // OPinfo + + end // evaluateblock + +end // analogBlock diff --git a/src/spicelib/devices/adms/psp103/admsva/PSP103_nqs_macrodefs.include b/src/spicelib/devices/adms/psp103/admsva/PSP103_nqs_macrodefs.include new file mode 100644 index 000000000..ddf9d2d81 --- /dev/null +++ b/src/spicelib/devices/adms/psp103/admsva/PSP103_nqs_macrodefs.include @@ -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 diff --git a/src/spicelib/devices/adms/psp103/admsva/PSP103_parlist.include b/src/spicelib/devices/adms/psp103/admsva/PSP103_parlist.include new file mode 100644 index 000000000..24b7b2a45 --- /dev/null +++ b/src/spicelib/devices/adms/psp103/admsva/PSP103_parlist.include @@ -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") + diff --git a/src/spicelib/devices/adms/psp103/admsva/PSP103_scaling.include b/src/spicelib/devices/adms/psp103/admsva/PSP103_scaling.include new file mode 100644 index 000000000..b588dfe43 --- /dev/null +++ b/src/spicelib/devices/adms/psp103/admsva/PSP103_scaling.include @@ -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 diff --git a/src/spicelib/devices/adms/psp103/admsva/psp103.va b/src/spicelib/devices/adms/psp103/admsva/psp103.va new file mode 100644 index 000000000..d66a1aca2 --- /dev/null +++ b/src/spicelib/devices/adms/psp103/admsva/psp103.va @@ -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 diff --git a/src/spicelib/devices/adms/psp103/admsva/releasenotesPSP103p7.txt b/src/spicelib/devices/adms/psp103/admsva/releasenotesPSP103p7.txt new file mode 100644 index 000000000..2ea7fb9bd --- /dev/null +++ b/src/spicelib/devices/adms/psp103/admsva/releasenotesPSP103p7.txt @@ -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. diff --git a/src/spicelib/devices/dev.c b/src/spicelib/devices/dev.c index e63e1009b..6da4e4b3a 100644 --- a/src/spicelib/devices/dev.c +++ b/src/spicelib/devices/dev.c @@ -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", \ diff --git a/src/spicelib/parser/inp2m.c b/src/spicelib/parser/inp2m.c index dde20a9d6..496a5b621 100644 --- a/src/spicelib/parser/inp2m.c +++ b/src/spicelib/parser/inp2m.c @@ -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 diff --git a/src/spicelib/parser/inpdomod.c b/src/spicelib/parser/inpdomod.c index 1107041bf..9d0404e85 100644 --- a/src/spicelib/parser/inpdomod.c +++ b/src/spicelib/parser/inpdomod.c @@ -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");