diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include new file mode 100644 index 000000000..6485db896 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include @@ -0,0 +1,184 @@ +//====================================================================================== +//====================================================================================== +// Filename: JUNCAP200_InitModel.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors +// +// +// Version: 102.1 (PSP), 200.2 (JUNCAP), October 2006 (Simkit 2.4) +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file readme.txt +// + + ////////////////////////////////////////////////////////////// + // + // Calculation of internal paramters which are independent + // on instance parameters + // + ////////////////////////////////////////////////////////////// + + TRJ_i = `CLIP_LOW( TRJ , `TRJ_cliplow); + IMAX_i = `CLIP_LOW( IMAX , `IMAX_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); + 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); + 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); + + 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 + deltaphigr; + phigrsti = PHIGSTI + deltaphigr; + phigrgat = PHIGGAT + deltaphigr; + + // bandgap voltages at device temperature + deltaphigd = -(7.02e-4 * tkd * tkd) / (1108.0 + tkd); + phigdbot = PHIGBOT + deltaphigd; + phigdsti = PHIGSTI + deltaphigd; + phigdgat = PHIGGAT + 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 * phitd * ln(ftdbot); + ubisti = VBIRSTI_i * auxt - 2 * phitd * ln(ftdsti); + ubigat = VBIRGAT_i * auxt - 2 * 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 - PBOT_i; + one_minus_PSTI = 1 - PSTI_i; + one_minus_PGAT = 1 - PGAT_i; + + // one over "one minus the grading coefficient" + one_over_one_minus_PBOT = 1 / one_minus_PBOT; + one_over_one_minus_PSTI = 1 / one_minus_PSTI; + one_over_one_minus_PGAT = 1 / 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 / wdepnulrbot; + wdepnulrinvsti = 1 / wdepnulrsti; + wdepnulrinvgat = 1 / wdepnulrgat; + + // inverse values of built-in voltages at reference temperature, needed in SRH and BBT model + VBIRBOTinv = 1 / VBIRBOT_i; + VBIRSTIinv = 1 / VBIRSTI_i; + VBIRGATinv = 1 / VBIRGAT_i; + + // some constants needed in erfc-approximation, needed in TAT model + perfc = (`SQRTPI * `aerfc); + berfc = ((-5 * (`aerfc) + 6 - pow((perfc), -2)) / 3); + 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 * MEFFTATBOT_i * `MELE * `QELE * (deltaEbot * deltaEbot * deltaEbot)) / (3 * `HBAR); + btatpartsti = sqrt(32 * MEFFTATSTI_i * `MELE * `QELE * (deltaEsti * deltaEsti * deltaEsti)) / (3 * `HBAR); + btatpartgat = sqrt(32 * MEFFTATGAT_i * `MELE * `QELE * (deltaEgat * deltaEgat * deltaEgat)) / (3 * `HBAR); + + // temperature-scaled values of FBBT, needed in BBT model + fbbtbot = FBBTRBOT * (1 + STFBBTBOT * (tkd - tkr)); + fbbtsti = FBBTRSTI * (1 + STFBBTSTI * (tkd - tkr)); + fbbtgat = FBBTRGAT * (1 + STFBBTGAT * (tkd - tkr)); + + // values of fstop, needed in avalanche/breakdown model + fstopbot = 1 / (1 - pow(`alphaav, PBRBOT_i)); + fstopsti = 1 / (1 - pow(`alphaav, PBRSTI_i)); + fstopgat = 1 / (1 - pow(`alphaav, PBRGAT_i)); + + // inverse values of breakdown voltages, needed in avalanche/breakdown model + VBRinvbot = 1 / VBRBOT_i; + VBRinvsti = 1 / VBRSTI_i; + VBRinvgat = 1 / VBRGAT_i; + + // slopes for linear extraploation close to and beyond breakdown, needed in avalanche/breakdown model + slopebot = -(fstopbot * fstopbot * pow(`alphaav, (PBRBOT_i - 1))) * PBRBOT_i * VBRinvbot; + slopesti = -(fstopsti * fstopsti * pow(`alphaav, (PBRSTI_i - 1))) * PBRSTI_i * VBRinvsti; + slopegat = -(fstopgat * fstopgat * pow(`alphaav, (PBRGAT_i - 1))) * PBRGAT_i * VBRinvgat; diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include new file mode 100644 index 000000000..dc28952ad --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include @@ -0,0 +1,285 @@ +//====================================================================================== +//====================================================================================== +// Filename: JUNCAP200_macrodefs.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors +// +// +// Version: 102.1 (PSP), 200.2 (JUNCAP), October 2006 (Simkit 2.4) +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file readme.txt +// + +/////////////////////////////////////////// +// +// Macros and constants used in JUNCAP2 +// +/////////////////////////////////////////// + +// Other constants +`define MINTEMP -250 +`define vbilow 0.050 +`define a 2 +`define epsch 0.1 +`define dvbi 0.050 +`define epsav 1E-6 +`define vbrmax 1000 +`define alphaav 0.999 +`define vmaxlarge 1E8 +`define aerfc 0.29214664 +`define twothirds 0.666666666666667 + + +// Clipping values +`define levelnumber 200 +`define AB_cliplow 0 +`define LS_cliplow 0 +`define LG_cliplow 0 +`define MULT_cliplow 0 +`define TRJ_cliplow `MINTEMP +`define IMAX_cliplow 1E-12 +`define CJORBOT_cliplow 1E-12 +`define CJORSTI_cliplow 1E-18 +`define CJORGAT_cliplow 1E-18 +`define VBIR_cliplow `vbilow +`define P_cliplow 0.05 +`define P_cliphigh 0.95 +`define IDSATR_cliplow 0 +`define CSRH_cliplow 0 +`define XJUN_cliplow 1E-9 +`define CTAT_cliplow 0 +`define MEFFTAT_cliplow 0.01 +`define CBBT_cliplow 0 +`define VBR_cliplow 0.1 +`define PBR_cliplow 0.1 + + +///////////////////////////////////////////////////////////////////////////// +// +// 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. +// +///////////////////////////////////////////////////////////////////////////// + +// Instance parameter dependent initialization + +`define JuncapInitInstance(AB_i, LS_i, LG_i, VMAX, vbimin, vch, vfmin, vbbtlim) \ +if (idsatbot * AB_i > 0) begin \ + vmaxbot = phitd * ln(IMAX_i / (idsatbot * AB_i) + 1); \ +end else begin \ + vmaxbot = `vmaxlarge; \ +end \ +if (idsatsti * LS_i > 0) begin \ + vmaxsti = phitd * ln(IMAX_i / (idsatsti * LS_i) + 1); \ +end else begin \ + vmaxsti = `vmaxlarge; \ +end \ +if (idsatgat * LG_i > 0) begin \ + vmaxgat = phitd * ln(IMAX_i / (idsatgat * LG_i) + 1); \ +end else begin \ + vmaxgat = `vmaxlarge; \ +end \ +VMAX = min(min(vmaxbot, vmaxsti), vmaxgat); \ + \ +/* determination of minimum value of the relevant built-in voltages */ \ +vbibot2 = vbibot; \ +vbisti2 = vbisti; \ +vbigat2 = vbigat; \ +if (AB_i == 0) begin vbibot2 = vbisti + vbigat; end \ +if (LS_i == 0) begin vbisti2 = vbibot + vbigat; end \ +if (LG_i == 0) begin vbigat2 = vbibot + vbisti; end \ +vbimin = min(min(vbibot2, vbisti2), vbigat2); \ +vch = vbimin * `epsch; \ +if (vbimin == vbibot) begin vfmin = vbibot * (1 - (pow(`a, (-1.0 / PBOT_i)))); end \ +if (vbimin == vbisti) begin vfmin = vbisti * (1 - (pow(`a, (-1.0 / PSTI_i)))); end \ +if (vbimin == vbigat) begin vfmin = vbigat * (1 - (pow(`a, (-1.0 / PGAT_i)))); end \ + \ +/* determination of limiting value of conditioned voltage for BBT calculation */ \ +vbibot2r = VBIRBOT_i; \ +vbisti2r = VBIRSTI_i; \ +vbigat2r = VBIRGAT_i; \ +if (AB_i == 0) begin vbibot2r = VBIRSTI_i + VBIRGAT_i; end \ +if (LS_i == 0) begin vbisti2r = VBIRBOT_i + VBIRGAT_i; end \ +if (LG_i == 0) begin vbigat2r = VBIRBOT_i + VBIRSTI_i; end \ +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) begin \ + result = 1 / (x); \ +end else begin \ + result = pow(x, power); \ +end + +`define mypower3(x,power,result) \ +if (power == 4) begin \ + result = (x) * (x) * (x) * (x); \ +end else begin \ + result = pow(x, power); \ +end + + +// Smoothing functions + +`define hypfunction2(x,x0,eps,hyp2) \ +hyp2 = 0.5 * ((x) + (x0) - sqrt(((x) - (x0)) * ((x) - (x0)) + 4 * (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) begin \ + terfc = 1 / (1 + perfc * y); \ +end else begin \ + terfc = 1 / (1 - perfc * y); \ +end \ +`expl_low(-ysq + m, tmp) \ +erfcpos = (`aerfc * terfc + berfc * terfc * terfc + cerfc * terfc * terfc * terfc) * tmp; \ +if (y > 0) begin \ + result = erfcpos; \ +end else begin\ + `expl_low(m, tmp) \ + result = 2* tmp - erfcpos; \ +end + + +// This is the main function of the JUNCAP2-model. It returns the current and charge +// for a single diode + +`define juncapfunction(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 - vj * vbiinv), one_minus_P, tmp) \ +Qjprime = qpref * (1 - tmp) + qpref2 * (VAK - vj); \ +id = idsat * idmult; \ +if ((CSRH == 0) && (CTAT == 0)) begin \ + isrh = 0; \ +end else begin \ + vbi_minus_vjsrh = vbi-vjsrh; \ + wsrhstep = 1 - sqrt(1 - two_psistar / vbi_minus_vjsrh); \ + if (P == 0.5) begin \ + dwsrh = 0; \ + end else begin \ + dwsrh = ((wsrhstep * wsrhstep * ln(wsrhstep) / (1 - wsrhstep)) + wsrhstep) * (1 - 2 * P); \ + end \ + wsrh = wsrhstep + dwsrh; \ + `mypower(vbi_minus_vjsrh * VBIRinv, P, tmp) \ + wdep = wdepnulr * tmp; \ + asrh = ftd * (zinv - 1) * wdep; \ + isrh = CSRH * asrh * wsrh; \ +end \ +if (CTAT == 0) begin \ + itat = 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)); \ + sqrtumax = sqrt(abs(umax)); \ + umaxpoweronepointfive = umax * sqrtumax; \ + `mypower2((1 + btat * umaxpoweronepointfive), (-P * one_over_one_minus_P), wgamma) \ + wtat = wsrh * wgamma / (wsrh + wgamma); \ + ktat = sqrt(0.375 * btat / sqrtumax); \ + ltat = 2 * twoatatoverthreebtat * sqrtumax - umax; \ + mtat = atat * twoatatoverthreebtat * sqrtumax - atat * umax + 0.5 * btat * umaxpoweronepointfive; \ + xerfc = (ltat - 1) * ktat; \ + `calcerfcexpmtat(xerfc, mtat, erfctimesexpmtat) \ + gammamax = atat * erfctimesexpmtat * `SQRTPI / (2 * ktat); \ + itat = CTAT * asrh * gammamax * wtat; \ +end \ +if (CBBT == 0) begin \ + ibbt = 0; \ +end else begin \ + `mypower(((VBIR - vbbt) * VBIRinv), P, tmp) \ + Fmaxr = (VBIR - vbbt) * one_over_one_minus_P * wdepnulrinv / tmp; \ + `expl(-fbbt / Fmaxr, tmp) \ + ibbt = CBBT * VAK * Fmaxr * Fmaxr * tmp; \ +end \ +if (VBR > `vbrmax) begin \ + fbreakdown = 1; \ +end else begin \ + if (vav > -`alphaav * VBR) begin \ + `mypower3(abs(vav * VBRinv), PBR, tmp) \ + fbreakdown = 1 / (1 - tmp); \ + end else begin \ + fbreakdown = fstop + (vav + `alphaav * VBR) * slope; \ + end \ +end \ +Ijprime = (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(AB_i,LS_i,LG_i,ijunbot,qjunbot,ijunsti,qjunsti,ijungat,qjungat) \ +vbbt = 0.0; \ +two_psistar = 0.0; \ +if ( !( ((AB_i) == 0) && ((LS_i) == 0) && ((LG_i) == 0) ) ) begin \ + `hypfunction5(VAK, vfmin, vch, vj) \ + if (VAK < VMAX) begin \ + `expl(0.5 * VAK * phitdinv, zinv) \ + idmult = zinv * zinv; \ + end else begin \ + `expl(VMAX * phitdinv, exp_VMAX_over_phitd) \ + idmult = (1 + (VAK - VMAX) * phitdinv) * exp_VMAX_over_phitd; \ + zinv = sqrt(idmult); \ + end \ + idmult = idmult - 1.0; \ + z = 1 / zinv; \ + if (VAK > 0) begin \ + two_psistar = 2.0 * phitd * ln(2.0 + z + sqrt((z + 1.0) * (z + 3.0))); \ + end else begin \ + two_psistar = -VAK + 2.0 * phitd * ln(2 * zinv + 1 + sqrt((1 + zinv) * (1 + 3 * zinv))); \ + end \ + vjlim = vbimin - two_psistar; \ + `hypfunction2(VAK, vjlim, phitd, vjsrh) \ + `hypfunction2(VAK, vbbtlim, phitr, vbbt) \ + `hypfunction2(VAK, 0, `epsav, vav) \ +end \ +if ((AB_i) == 0) begin \ + ijunbot = 0; \ + qjunbot = 0; \ +end else begin \ + `juncapfunction(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) begin \ + ijunsti = 0; \ + qjunsti = 0; \ +end else begin \ + `juncapfunction(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) begin \ + ijungat = 0; \ + qjungat = 0; \ +end else begin \ + `juncapfunction(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 diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include new file mode 100644 index 000000000..5b9d57761 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include @@ -0,0 +1,65 @@ +//====================================================================================== +//====================================================================================== +// Filename: JUNCAP200_parlist.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors +// +// +// Version: 102.1 (PSP), 200.2 (JUNCAP), October 2006 (Simkit 2.4) +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file readme.txt +// + + ////////////////////////////////////////// + // + // JUNCAP2 - Reduced parameterlist + // + ////////////////////////////////////////// + + parameter real IMAX = 1000 `from(`IMAX_cliplow ,inf ) `P(info="Maximum current up to which forward current behaves exponentially" unit="A" ); + parameter real CJORBOT = 1E-3 `from(`CJORBOT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-area of bottom component" unit="Fm^-2" ); + parameter real CJORSTI = 1E-9 `from(`CJORSTI_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of STI-edge component" unit="Fm^-1" ); + parameter real CJORGAT = 1E-9 `from(`CJORGAT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of gate-edge component" unit="Fm^-1" ); + parameter real VBIRBOT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of bottom component" unit="V" ); + parameter real VBIRSTI = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of STI-edge component" unit="V" ); + parameter real VBIRGAT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of gate-edge component" unit="V" ); + parameter real PBOT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of bottom component" unit="" ); + parameter real PSTI = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of STI-edge component" unit="" ); + parameter real PGAT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of gate-edge component" unit="" ); + parameter real PHIGBOT = 1.16 `P(info="Zero-temperature bandgap voltage of bottom component" unit="V" ); + parameter real PHIGSTI = 1.16 `P(info="Zero-temperature bandgap voltage of STI-edge component" unit="V" ); + parameter real PHIGGAT = 1.16 `P(info="Zero-temperature bandgap voltage of gate-edge component" unit="V" ); + parameter real IDSATRBOT = 1E-12 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of bottom component" unit="Am^-2" ); + parameter real IDSATRSTI = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of STI-edge component" unit="Am^-1" ); + parameter real IDSATRGAT = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of gate-edge component" unit="Am^-1" ); + parameter real CSRHBOT = 1E2 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of bottom component" unit="Am^-3" ); + parameter real CSRHSTI = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of STI-edge component" unit="Am^-2" ); + parameter real CSRHGAT = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of gate-edge component" unit="Am^-2" ); + parameter real XJUNSTI = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of STI-edge component" unit="m" ); + parameter real XJUNGAT = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of gate-edge component" unit="m" ); + parameter real CTATBOT = 1E2 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of bottom component" unit="Am^-3" ); + parameter real CTATSTI = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of STI-edge component" unit="Am^-2" ); + parameter real CTATGAT = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of gate-edge component" unit="Am^-2" ); + parameter real MEFFTATBOT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of bottom component" unit="" ); + parameter real MEFFTATSTI = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component" unit="" ); + parameter real MEFFTATGAT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component" unit="" ); + parameter real CBBTBOT = 1E-12 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of bottom component" unit="AV^-3" ); + parameter real CBBTSTI = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of STI-edge component" unit="AV^-3m" ); + parameter real CBBTGAT = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of gate-edge component" unit="AV^-3m" ); + parameter real FBBTRBOT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of bottom component" unit="Vm^-1" ); + parameter real FBBTRSTI = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of STI-edge component" unit="Vm^-1" ); + parameter real FBBTRGAT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of gate-edge component" unit="Vm^-1" ); + parameter real STFBBTBOT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of bottom component" unit="K^-1" ); + parameter real STFBBTSTI = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of STI-edge component" unit="K^-1" ); + parameter real STFBBTGAT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of gate-edge component" unit="K^-1" ); + parameter real VBRBOT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of bottom component" unit="V" ); + parameter real VBRSTI = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of STI-edge component" unit="V" ); + parameter real VBRGAT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of gate-edge component" unit="V" ); + parameter real PBRBOT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of bottom component" unit="V" ); + parameter real PBRSTI = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of STI-edge component" unit="V" ); + parameter real PBRGAT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of gate-edge component" unit="V" ); diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist.include new file mode 100644 index 000000000..2c2addf94 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist.include @@ -0,0 +1,67 @@ +//====================================================================================== +//====================================================================================== +// Filename: JUNCAP200_varlist.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors +// +// +// Version: 102.1 (PSP), 200.2 (JUNCAP), October 2006 (Simkit 2.4) +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file readme.txt +// + + + // 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 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; + + // declaration of clipped parameters + real TRJ_i, IMAX_i; + real CJORBOT_i, CJORSTI_i, CJORGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i; + real PBOT_i, PSTI_i, PGAT_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; + real VBRBOT_i, VBRSTI_i, VBRGAT_i, PBRBOT_i, PBRSTI_i, PBRGAT_i; + + // declaration of variables calculated outside macro "juncapfunction", voltage-independent part + real tkr, tkd, auxt, KBOL_over_QELE, phitr, phitrinv, phitd, phitdinv; + real deltaphigr, phigrbot, phigrsti, phigrgat, deltaphigd, phigdbot, phigdsti, phigdgat; + real ftdbot, ftdsti, ftdgat, idsatbot, idsatsti, idsatgat, exp_VMAX_over_phitd; + real ubibot, ubisti, ubigat, vbibot, vbisti, vbigat; + real vbibot2, vbisti2, vbigat2, 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, qprefbot, qprefsti, qprefgat; + real vbimin, vch, vfmin, vbbtlim; + real qpref2bot, qpref2sti, qpref2gat; + real wdepnulrbot, wdepnulrsti, wdepnulrgat, wdepnulrinvbot, wdepnulrinvsti, wdepnulrinvgat; + real VBIRBOTinv, VBIRSTIinv, VBIRGATinv; + real perfc, berfc, cerfc; + real deltaEbot, deltaEsti, deltaEgat, atatbot, atatsti, atatgat; + real btatpartbot, btatpartsti, btatpartgat; + real fbbtbot, fbbtsti, fbbtgat; + real fstopbot, fstopsti, fstopgat, VBRinvbot, VBRinvsti, VBRinvgat; + real slopebot, slopesti, slopegat; + real vmaxbot, vmaxsti, vmaxgat, VMAX; + + // declaration of variables calculated outside macro "juncapfunction", voltage-dependent part + real VAK, idmult, vj, z, zinv, two_psistar, vjlim, vjsrh, vbbt, vav; + diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_ChargesNQS.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_ChargesNQS.include new file mode 100644 index 000000000..598daeab5 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/PSP102_ChargesNQS.include @@ -0,0 +1,303 @@ +//====================================================================================== +//====================================================================================== +// Filename: PSP102_ChargesNQS.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors +// +// +// Version: 102.1, October 2006 (Simkit 2.4) +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file readme.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); + thesat2 = thesat1 * thesat1 * 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 * Qp6) / 37829.0 - 900.0 / 181.0 * Qp5; + end else begin + dQy = 0; + d2Qy = 0; + end + `fq(Qp1, xg, dQy, d2Qy, fk1) + 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 * Qp0 + + 6048 * Qp1 - 10152 * 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; + d2Qy = 0; + end + `fq(Qp2, xg, 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; + d2Qy = 0; + end + `fq(Qp3, xg, 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; + d2Qy = 0; + end + `fq(Qp4, xg, 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; + d2Qy = 0; + end + `fq(Qp5, xg, 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; + d2Qy = 0; + end + `fq(Qp6, xg, 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; + d2Qy = 0; + end + `fq(Qp7, xg, 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; + d2Qy = 0; + end + `fq(Qp8, xg, 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; + d2Qy = 0; + end + `fq(Qp9, xg, dQy, d2Qy, fk9) + end + + //-------------------------------------------------------------------- + + // Terminal charges for NQS + 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, temp1) + QG_NQS = xg - (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, temp1) + `QiToPhi(Qp2, xg, temp2) + QG_NQS = xg - (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, temp1) + `QiToPhi(Qp2, xg, temp2) + `QiToPhi(Qp3, xg, temp3) + QG_NQS = xg - (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, temp1) + `QiToPhi(Qp2, xg, temp2) + `QiToPhi(Qp3, xg, temp3) + `QiToPhi(Qp4, xg, temp4) + `QiToPhi(Qp5, xg, temp5) + QG_NQS = xg - (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, temp1) + `QiToPhi(Qp2, xg, temp2) + `QiToPhi(Qp3, xg, temp3) + `QiToPhi(Qp4, xg, temp4) + `QiToPhi(Qp5, xg, temp5) + `QiToPhi(Qp6, xg, temp6) + `QiToPhi(Qp7, xg, temp7) + `QiToPhi(Qp8, xg, temp8) + `QiToPhi(Qp9, xg, temp9) + QG_NQS = xg - (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/psp102/admsva/PSP102_InitNQS.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_InitNQS.include new file mode 100644 index 000000000..6d06177ad --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/PSP102_InitNQS.include @@ -0,0 +1,190 @@ +//====================================================================================== +//====================================================================================== +// Filename: PSP102_InitNQS.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors +// +// +// Version: 102.1, October 2006 (Simkit 2.4) +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file readme.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 > 0) begin + if (SWNQS_i == 1) begin + phi_p1 = `Phiy(0.5); + `PhiToQb(phi_p1,Qb_tmp) + Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp; + end else if (SWNQS_i == 2) begin + phi_p1 = `Phiy(`oneThird); + `PhiToQb(phi_p1,Qb_tmp) + Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp; + + phi_p2 = `Phiy(`twoThirds); + `PhiToQb(phi_p2,Qb_tmp) + Qp2_0 = -pd * (xg - 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 - phi_p1) - Qb_tmp; + + phi_p2 = `Phiy(0.5); + `PhiToQb(phi_p2,Qb_tmp) + Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp; + + phi_p3 = `Phiy(0.75); + `PhiToQb(phi_p3,Qb_tmp) + Qp3_0 = -pd * (xg - 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 - phi_p1) - Qb_tmp; + + phi_p2 = `Phiy(`oneThird); + `PhiToQb(phi_p2,Qb_tmp) + Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp; + + phi_p3 = `Phiy(0.5); + `PhiToQb(phi_p3,Qb_tmp) + Qp3_0 = -pd * (xg - phi_p3) - Qb_tmp; + + phi_p4 = `Phiy(`twoThirds); + `PhiToQb(phi_p4,Qb_tmp) + Qp4_0 = -pd * (xg - phi_p4) - Qb_tmp; + + phi_p5 = `Phiy(0.8333333333333333); + `PhiToQb(phi_p5,Qb_tmp) + Qp5_0 = -pd * (xg - 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 - phi_p1) - Qb_tmp; + + phi_p2 = `Phiy(0.2); + `PhiToQb(phi_p2,Qb_tmp) + Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp; + + phi_p3 = `Phiy(0.3); + `PhiToQb(phi_p3,Qb_tmp) + Qp3_0 = -pd * (xg - phi_p3) - Qb_tmp; + + phi_p4 = `Phiy(0.4); + `PhiToQb(phi_p4,Qb_tmp) + Qp4_0 = -pd * (xg - phi_p4) - Qb_tmp; + + phi_p5 = `Phiy(0.5); + `PhiToQb(phi_p5,Qb_tmp) + Qp5_0 = -pd * (xg - phi_p5) - Qb_tmp; + + phi_p6 = `Phiy(0.6); + `PhiToQb(phi_p6,Qb_tmp) + Qp6_0 = -pd * (xg - phi_p6) - Qb_tmp; + + phi_p7 = `Phiy(0.7); + `PhiToQb(phi_p7,Qb_tmp) + Qp7_0 = -pd * (xg - phi_p7) - Qb_tmp; + + phi_p8 = `Phiy(0.8); + `PhiToQb(phi_p8,Qb_tmp) + Qp8_0 = -pd * (xg - phi_p8) - Qb_tmp; + + phi_p9 = `Phiy(0.9); + `PhiToQb(phi_p9,Qb_tmp) + Qp9_0 = -pd * (xg - 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 - sigVds * 0.5 * dps * inv_phit1; + x_dp = x_m + sigVds * 0.5 * dps * inv_phit1; + Qp0 = 0.0; + QpN = 0.0; + if (x_sp > 0) begin + `PhiToQb(x_sp, QbSIGN) + Qp0 = -pd * (xg - x_sp) - QbSIGN; + end + if (x_dp > 0) begin + `PhiToQb(x_dp, QbSIGN) + QpN = -pd * (xg - x_dp) - QbSIGN; + end + end diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_binning.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_binning.include new file mode 100644 index 000000000..9f84f1c48 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/PSP102_binning.include @@ -0,0 +1,127 @@ +//====================================================================================== +//====================================================================================== +// Filename: PSP102_binning.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors +// +// +// Version: 102.1, October 2006 (Simkit 2.4) +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file readme.txt +// + + // 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 = POVFB + iLE * PLVFB + iWE * PWVFB + iLEWE * PLWVFB; + STVFB = POSTVFB + iLE * PLSTVFB + iWE * PWSTVFB + iLEWE * PLWSTVFB; + TOX = POTOX; + NEFF = PONEFF + iLE * PLNEFF + iWE * PWNEFF + iLEWE * PLWNEFF; + VNSUB = POVNSUB; + NSLP = PONSLP; + DNSUB = PODNSUB; + DPHIB = PODPHIB + iLE * PLDPHIB + iWE * PWDPHIB + iLEWE * PLWDPHIB; + NP = PONP + iLE * PLNP + iWE * PWNP + iLEWE * PLWNP; + CT = POCT + iLE * PLCT + iWE * PWCT + iLEWE * PLWCT; + TOXOV = POTOXOV; + NOV = PONOV + iLE * PLNOV + iWE * PWNOV + iLEWE * PLWNOV; + + // DIBL parameters + CF = POCF + iLE * PLCF + iWE * PWCF + iLEWE * PLWCF; + CFB = POCFB; + + // Mobility parameters + BETN = POBETN + iLE * PLBETN + iiWE * PWBETN + iiiLEWE * PLWBETN; + STBET = POSTBET + iLE * PLSTBET + iWE * PWSTBET + iLEWE * PLWSTBET; + MUE = POMUE + iLE * PLMUE + iWE * PWMUE + iLEWE * PLWMUE; + STMUE = POSTMUE; + THEMU = POTHEMU; + STTHEMU = POSTTHEMU; + CS = POCS + iLE * PLCS + iWE * PWCS + iLEWE * PLWCS; + STCS = POSTCS; + XCOR = POXCOR + iLE * PLXCOR + iWE * PWXCOR + iLEWE * PLWXCOR; + STXCOR = POSTXCOR; + FETA = POFETA; + + // Series resistance parameters + RS = PORS + iLE * PLRS + iWE * PWRS + iLEWE * PLWRS; + STRS = POSTRS; + RSB = PORSB; + RSG = PORSG; + + // Velocity saturation parameters + THESAT = POTHESAT + iLE * PLTHESAT + iWE * PWTHESAT + iLEWE * PLWTHESAT; + STTHESAT = POSTTHESAT + iLE * PLSTTHESAT + iWE * PWSTTHESAT + iLEWE * PLWSTTHESAT; + THESATB = POTHESATB + iLE * PLTHESATB + iWE * PWTHESATB + iLEWE * PLWTHESATB; + THESATG = POTHESATG + iLE * PLTHESATG + iWE * PWTHESATG + iLEWE * PLWTHESATG; + + // Saturation voltage parameters + AX = POAX + iLE * PLAX + iWE * PWAX + iLEWE * PLWAX; + + // Channel length modulation (CLM) parameters + ALP = POALP + iLE * PLALP + iWE * PWALP + iLEWE * PLWALP; + ALP1 = POALP1 + iLE * PLALP1 + iWE * PWALP1 + iLEWE * PLWALP1; + ALP2 = POALP2 + iLE * PLALP2 + iWE * PWALP2 + iLEWE * PLWALP2; + VP = POVP; + + // Impact ionization parameters + A1 = POA1 + iLE * PLA1 + iWE * PWA1 + iLEWE * PLWA1; + A2 = POA2; + STA2 = POSTA2; + A3 = POA3 + iLE * PLA3 + iWE * PWA3 + iLEWE * PLWA3; + A4 = POA4 + iLE * PLA4 + iWE * PWA4 + iLEWE * PLWA4; + GCO = POGCO; + + // Gate current parameters + IGINV = POIGINV + iiLE * PLIGINV + iiWE * PWIGINV + iiLEWE * PLWIGINV; + IGOV = POIGOV + iLE * PLIGOV + iiWE * PWIGOV + iiiLEWE * PLWIGOV; + STIG = POSTIG; + GC2 = POGC2; + GC3 = POGC3; + CHIB = POCHIB; + + // Gate-induced drain leakage (GIDL) parameters + AGIDL = POAGIDL + iLE * PLAGIDL + iiWE * PWAGIDL + iiiLEWE * PLWAGIDL; + BGIDL = POBGIDL; + STBGIDL = POSTBGIDL; + CGIDL = POCGIDL; + + // Charge model parameters + COX = POCOX + iiLEcv * PLCOX + iiWEcv * PWCOX + iiLEWEcv * PLWCOX; + CGOV = POCGOV + iLEcv * PLCGOV + iiWEcv * PWCGOV + iiiLEWEcv * PLWCGOV; + CGBOV = POCGBOV + iiLcv * PLCGBOV + iiWcv * PWCGBOV + iiLWcv * PLWCGBOV; + CFR = POCFR + iLcv * PLCFR + iiWcv * PWCFR + iiiLWcv * PLWCFR; + + // Noise model parameters + FNT = POFNT; + NFA = PONFA + iLE * PLNFA + iWE * PWNFA + iLEWE * PLWNFA; + NFB = PONFB + iLE * PLNFB + iWE * PWNFB + iLEWE * PLWNFB; + NFC = PONFC + iLE * PLNFC + iWE * PWNFC + iLEWE * PLWNFC; diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_binpars.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_binpars.include new file mode 100644 index 000000000..35313b029 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/PSP102_binpars.include @@ -0,0 +1,233 @@ +//====================================================================================== +//====================================================================================== +// Filename: PSP102_binpars.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors +// +// +// Version: 102.1, October 2006 (Simkit 2.4) +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file readme.txt +// + + /////////////////////////////////////////////////// + // PSP global model parameters (binning) + /////////////////////////////////////////////////// + + parameter real LEVEL = 1021 `P(info="Model level" unit="" ); + parameter real TYPE = 1 `from( -1.0,1.0 ) `P(info="Channel type parameter, +1=NMOS -1=PMOS" unit="" ); + parameter real TR = 21 `from( -273.0,inf ) `P(info="nominal (reference) temperature" unit="C" ); + + // Switch parameters + parameter real SWIGATE = 0 `from( 0.0,1.0 ) `P(info="Flag for gate current, 0=turn off IG" unit="" ); + parameter real SWIMPACT = 0 `from( 0.0,1.0 ) `P(info="Flag for impact ionization current, 0=turn off II" unit="" ); + parameter real SWGIDL = 0 `from( 0.0,1.0 ) `P(info="Flag for GIDL current, 0=turn off IGIDL" unit="" ); + parameter real SWJUNCAP = 0 `from( 0.0,3.0 ) `P(info="Flag for juncap, 0=turn off juncap" unit="" ); + parameter real QMC = 1 `from( 0.0,inf ) `P(info="Quantum-mechanical correction factor" unit="" ); + + // Process parameters + parameter real LVARO = 0 `P(info="Geometry independent difference between actual and programmed poly-silicon gate length" unit="m" ); + parameter real LVARL = 0 `P(info="Length dependence of difference between actual and programmed poly-silicon gate length" unit="" ); + parameter real LAP = 0 `P(info="Effective channel length reduction per side due to lateral diffusion of source/drain dopant ions" unit="m" ); + parameter real WVARO = 0 `P(info="Geometry independent difference between actual and programmed field-oxide opening" unit="m" ); + parameter real WVARW = 0 `P(info="Width dependence of difference between actual and programmed field-oxide opening" unit="" ); + parameter real WOT = 0 `P(info="Effective reduction of channel width per side due to lateral diffusion of channel-stop dopant ions" unit="m" ); + parameter real DLQ = 0 `P(info="Effective channel length reduction for CV" unit="m" ); + parameter real DWQ = 0 `P(info="Effective channel width reduction for CV" unit="m" ); + parameter real POVFB = -1 `P(info="Coefficient for the geometry independent part of VFB" unit="V" ); + parameter real PLVFB = 0.0 `P(info="Coefficient for the length dependence of VFB" unit="V" ); + parameter real PWVFB = 0.0 `P(info="Coefficient for the width dependence of VFB" unit="V" ); + parameter real PLWVFB = 0.0 `P(info="Coefficient for the length times width dependence of VFB" unit="V" ); + parameter real POSTVFB = 0.0005 `P(info="Coefficient for the geometry independent part of STVFB" unit="V/K" ); + parameter real PLSTVFB = 0.0 `P(info="Coefficient for the length dependence of STVFB" unit="V/K" ); + parameter real PWSTVFB = 0.0 `P(info="Coefficient for the width dependence of STVFB" unit="V/K" ); + parameter real PLWSTVFB = 0.0 `P(info="Coefficient for the length times width dependence of STVFB" unit="V/K" ); + parameter real POTOX = 2E-09 `P(info="Coefficient for the geometry independent part of TOX" unit="m" ); + parameter real PONEFF = 5E+23 `P(info="Coefficient for the geometry independent part of NEFF" unit="m^-3" ); + parameter real PLNEFF = 0.0 `P(info="Coefficient for the length dependence of NEFF" unit="m^-3" ); + parameter real PWNEFF = 0.0 `P(info="Coefficient for the width dependence of NEFF" unit="m^-3" ); + parameter real PLWNEFF = 0.0 `P(info="Coefficient for the length times width dependence of NEFF" unit="m^-3" ); + parameter real POVNSUB = 0 `P(info="Coefficient for the geometry independent part of VNSUB" unit="V" ); + parameter real PONSLP = 0.05 `P(info="Coefficient for the geometry independent part of NSLP" unit="V" ); + parameter real PODNSUB = 0 `P(info="Coefficient for the geometry independent part of DNSUB" unit="V^-1" ); + parameter real PODPHIB = 0 `P(info="Coefficient for the geometry independent part of DPHIB" unit="V" ); + parameter real PLDPHIB = 0.0 `P(info="Coefficient for the length dependence of DPHIB" unit="V" ); + parameter real PWDPHIB = 0.0 `P(info="Coefficient for the width dependence of DPHIB" unit="V" ); + parameter real PLWDPHIB = 0.0 `P(info="Coefficient for the length times width dependence of DPHIB" unit="V" ); + parameter real PONP = 1E+26 `P(info="Coefficient for the geometry independent part of NP" unit="m^-3" ); + parameter real PLNP = 0.0 `P(info="Coefficient for the length dependence of NP" unit="m^-3" ); + parameter real PWNP = 0.0 `P(info="Coefficient for the width dependence of NP" unit="m^-3" ); + parameter real PLWNP = 0.0 `P(info="Coefficient for the length times width dependence of NP" unit="m^-3" ); + parameter real POCT = 0 `P(info="Coefficient for the geometry independent part of CT" unit="" ); + parameter real PLCT = 0.0 `P(info="Coefficient for the length dependence of CT" unit="" ); + parameter real PWCT = 0.0 `P(info="Coefficient for the width dependence of CT" unit="" ); + parameter real PLWCT = 0.0 `P(info="Coefficient for the length times width dependence of CT" unit="" ); + parameter real POTOXOV = 2E-09 `P(info="Coefficient for the geometry independent part of TOXOV" unit="m" ); + parameter real PONOV = 5E+25 `P(info="Coefficient for the geometry independent part of NOV" unit="m^-3" ); + parameter real PLNOV = 0.0 `P(info="Coefficient for the length dependence of NOV" unit="m^-3" ); + parameter real PWNOV = 0.0 `P(info="Coefficient for the width dependence of NOV" unit="m^-3" ); + parameter real PLWNOV = 0.0 `P(info="Coefficient for the length times width dependence of NOV" unit="m^-3" ); + + // DIBL parameters + parameter real POCF = 0 `P(info="Coefficient for the geometry independent part of CF" unit="V^-1" ); + parameter real PLCF = 0.0 `P(info="Coefficient for the length dependence of CF" unit="V^-1" ); + parameter real PWCF = 0.0 `P(info="Coefficient for the width dependence of CF" unit="V^-1" ); + parameter real PLWCF = 0.0 `P(info="Coefficient for the length times width dependence of CF" unit="V^-1" ); + parameter real POCFB = 0 `P(info="Coefficient for the geometry independent part of CFB" unit="V^-1" ); + + // Mobility parameters + parameter real POBETN = 0.07 `P(info="Coefficient for the geometry independent part of BETN" unit="m^2/V/s" ); + parameter real PLBETN = 0.0 `P(info="Coefficient for the length dependence of BETN" unit="m^2/V/s" ); + parameter real PWBETN = 0.0 `P(info="Coefficient for the width dependence of BETN" unit="m^2/V/s" ); + parameter real PLWBETN = 0.0 `P(info="Coefficient for the length times width dependence of BETN" unit="m^2/V/s" ); + parameter real POSTBET = 1 `P(info="Coefficient for the geometry independent part of STBET" unit="" ); + parameter real PLSTBET = 0.0 `P(info="Coefficient for the length dependence of STBET" unit="" ); + parameter real PWSTBET = 0.0 `P(info="Coefficient for the width dependence of STBET" unit="" ); + parameter real PLWSTBET = 0.0 `P(info="Coefficient for the length times width dependence of STBET" unit="" ); + parameter real POMUE = 0.5 `P(info="Coefficient for the geometry independent part of MUE" unit="m/V" ); + parameter real PLMUE = 0.0 `P(info="Coefficient for the length dependence of MUE" unit="m/V" ); + parameter real PWMUE = 0.0 `P(info="Coefficient for the width dependence of MUE" unit="m/V" ); + parameter real PLWMUE = 0.0 `P(info="Coefficient for the length times width dependence of MUE" unit="m/V" ); + parameter real POSTMUE = 0 `P(info="Coefficient for the geometry independent part of STMUE" unit="" ); + parameter real POTHEMU = 1.5 `P(info="Coefficient for the geometry independent part of THEMU" unit="" ); + parameter real POSTTHEMU = 1.5 `P(info="Coefficient for the geometry independent part of STTHEMU" unit="" ); + parameter real POCS = 0 `P(info="Coefficient for the geometry independent part of CS" unit="" ); + parameter real PLCS = 0.0 `P(info="Coefficient for the length dependence of CS" unit="" ); + parameter real PWCS = 0.0 `P(info="Coefficient for the width dependence of CS" unit="" ); + parameter real PLWCS = 0.0 `P(info="Coefficient for the length times width dependence of CS" unit="" ); + parameter real POSTCS = 0 `P(info="Coefficient for the geometry independent part of STCS" unit="" ); + parameter real POXCOR = 0 `P(info="Coefficient for the geometry independent part of XCOR" unit="V^-1" ); + parameter real PLXCOR = 0.0 `P(info="Coefficient for the length dependence of XCOR" unit="V^-1" ); + parameter real PWXCOR = 0.0 `P(info="Coefficient for the width dependence of XCOR" unit="V^-1" ); + parameter real PLWXCOR = 0.0 `P(info="Coefficient for the length times width dependence of XCOR" unit="V^-1" ); + parameter real POSTXCOR = 0 `P(info="Coefficient for the geometry independent part of STXCOR" unit="" ); + parameter real POFETA = 1 `P(info="Coefficient for the geometry independent part of FETA" unit="" ); + + // Series resistance parameters + parameter real PORS = 30 `P(info="Coefficient for the geometry independent part of RS" unit="Ohm" ); + parameter real PLRS = 0.0 `P(info="Coefficient for the length dependence of RS" unit="Ohm" ); + parameter real PWRS = 0.0 `P(info="Coefficient for the width dependence of RS" unit="Ohm" ); + parameter real PLWRS = 0.0 `P(info="Coefficient for the length times width dependence of RS" unit="Ohm" ); + parameter real POSTRS = 1 `P(info="Coefficient for the geometry independent part of STRS" unit="" ); + parameter real PORSB = 0 `P(info="Coefficient for the geometry independent part of RSB" unit="V^-1" ); + parameter real PORSG = 0 `P(info="Coefficient for the geometry independent part of RSG" unit="V^-1" ); + + // Velocity saturation parameters + parameter real POTHESAT = 1 `P(info="Coefficient for the geometry independent part of THESAT" unit="V^-1" ); + parameter real PLTHESAT = 0.0 `P(info="Coefficient for the length dependence of THESAT" unit="V^-1" ); + parameter real PWTHESAT = 0.0 `P(info="Coefficient for the width dependence of THESAT" unit="V^-1" ); + parameter real PLWTHESAT = 0.0 `P(info="Coefficient for the length times width dependence of THESAT" unit="V^-1" ); + parameter real POSTTHESAT = 1 `P(info="Coefficient for the geometry independent part of STTHESAT" unit="" ); + parameter real PLSTTHESAT = 0.0 `P(info="Coefficient for the length dependence of STTHESAT" unit="" ); + parameter real PWSTTHESAT = 0.0 `P(info="Coefficient for the width dependence of STTHESAT" unit="" ); + parameter real PLWSTTHESAT = 0.0 `P(info="Coefficient for the length times width dependence of STTHESAT" unit="" ); + parameter real POTHESATB = 0 `P(info="Coefficient for the geometry independent part of THESATB" unit="V^-1" ); + parameter real PLTHESATB = 0.0 `P(info="Coefficient for the length dependence of THESATB" unit="V^-1" ); + parameter real PWTHESATB = 0.0 `P(info="Coefficient for the width dependence of THESATB" unit="V^-1" ); + parameter real PLWTHESATB = 0.0 `P(info="Coefficient for the length times width dependence of THESATB" unit="V^-1" ); + parameter real POTHESATG = 0 `P(info="Coefficient for the geometry independent part of THESATG" unit="V^-1" ); + parameter real PLTHESATG = 0.0 `P(info="Coefficient for the length dependence of THESATG" unit="V^-1" ); + parameter real PWTHESATG = 0.0 `P(info="Coefficient for the width dependence of THESATG" unit="V^-1" ); + parameter real PLWTHESATG = 0.0 `P(info="Coefficient for the length times width dependence of THESATG" unit="V^-1" ); + + // Saturation voltage parameters + parameter real POAX = 3 `P(info="Coefficient for the geometry independent part of AX" unit="" ); + parameter real PLAX = 0.0 `P(info="Coefficient for the length dependence of AX" unit="" ); + parameter real PWAX = 0.0 `P(info="Coefficient for the width dependence of AX" unit="" ); + parameter real PLWAX = 0.0 `P(info="Coefficient for the length times width dependence of AX" unit="" ); + + // Channel length modulation (CLM) parameters + parameter real POALP = 0.01 `P(info="Coefficient for the geometry independent part of ALP" unit="" ); + parameter real PLALP = 0.0 `P(info="Coefficient for the length dependence of ALP" unit="" ); + parameter real PWALP = 0.0 `P(info="Coefficient for the width dependence of ALP" unit="" ); + parameter real PLWALP = 0.0 `P(info="Coefficient for the length times width dependence of ALP" unit="" ); + parameter real POALP1 = 0 `P(info="Coefficient for the geometry independent part of ALP1" unit="V" ); + parameter real PLALP1 = 0.0 `P(info="Coefficient for the length dependence of ALP1" unit="V" ); + parameter real PWALP1 = 0.0 `P(info="Coefficient for the width dependence of ALP1" unit="V" ); + parameter real PLWALP1 = 0.0 `P(info="Coefficient for the length times width dependence of ALP1" unit="V" ); + parameter real POALP2 = 0 `P(info="Coefficient for the geometry independent part of ALP2" unit="V^-1" ); + parameter real PLALP2 = 0.0 `P(info="Coefficient for the length dependence of ALP2" unit="V^-1" ); + parameter real PWALP2 = 0.0 `P(info="Coefficient for the width dependence of ALP2" unit="V^-1" ); + parameter real PLWALP2 = 0.0 `P(info="Coefficient for the length times width dependence of ALP2" unit="V^-1" ); + parameter real POVP = 0.05 `P(info="Coefficient for the geometry independent part of VP" unit="V" ); + + // Impact ionization parameters + parameter real POA1 = 1 `P(info="Coefficient for the geometry independent part of A1" unit="" ); + parameter real PLA1 = 0.0 `P(info="Coefficient for the length dependence of A1" unit="" ); + parameter real PWA1 = 0.0 `P(info="Coefficient for the width dependence of A1" unit="" ); + parameter real PLWA1 = 0.0 `P(info="Coefficient for the length times width dependence of A1" unit="" ); + parameter real POA2 = 10 `P(info="Coefficient for the geometry independent part of A2" unit="V" ); + parameter real POSTA2 = 0 `P(info="Coefficient for the geometry independent part of STA2" unit="V" ); + parameter real POA3 = 1 `P(info="Coefficient for the geometry independent part of A3" unit="" ); + parameter real PLA3 = 0.0 `P(info="Coefficient for the length dependence of A3" unit="" ); + parameter real PWA3 = 0.0 `P(info="Coefficient for the width dependence of A3" unit="" ); + parameter real PLWA3 = 0.0 `P(info="Coefficient for the length times width dependence of A3" unit="" ); + parameter real POA4 = 0 `P(info="Coefficient for the geometry independent part of A4" unit="V^-0.5" ); + parameter real PLA4 = 0.0 `P(info="Coefficient for the length dependence of A4" unit="V^-0.5" ); + parameter real PWA4 = 0.0 `P(info="Coefficient for the width dependence of A4" unit="V^-0.5" ); + parameter real PLWA4 = 0.0 `P(info="Coefficient for the length times width dependence of A4" unit="V^-0.5" ); + parameter real POGCO = 0 `P(info="Coefficient for the geometry independent part of GCO" unit="" ); + + // Gate current parameters + parameter real POIGINV = 0 `P(info="Coefficient for the geometry independent part of IGINV" unit="A" ); + parameter real PLIGINV = 0.0 `P(info="Coefficient for the length dependence of IGINV" unit="A" ); + parameter real PWIGINV = 0.0 `P(info="Coefficient for the width dependence of IGINV" unit="A" ); + parameter real PLWIGINV = 0.0 `P(info="Coefficient for the length times width dependence of IGINV" unit="A" ); + parameter real POIGOV = 0 `P(info="Coefficient for the geometry independent part of IGOV" unit="A" ); + parameter real PLIGOV = 0.0 `P(info="Coefficient for the length dependence of IGOV" unit="A" ); + parameter real PWIGOV = 0.0 `P(info="Coefficient for the width dependence of IGOV" unit="A" ); + parameter real PLWIGOV = 0.0 `P(info="Coefficient for the length times width dependence of IGOV" unit="A" ); + parameter real POSTIG = 2 `P(info="Coefficient for the geometry independent part of STIG" unit="" ); + parameter real POGC2 = 0.375 `P(info="Coefficient for the geometry independent part of GC2" unit="" ); + parameter real POGC3 = 0.063 `P(info="Coefficient for the geometry independent part of GC3" unit="" ); + parameter real POCHIB = 3.1 `P(info="Coefficient for the geometry independent part of CHIB" unit="V" ); + + // Gate-induced drain leakage (GIDL) parameters + parameter real POAGIDL = 0 `P(info="Coefficient for the geometry independent part of AGIDL" unit="A/V^3" ); + parameter real PLAGIDL = 0.0 `P(info="Coefficient for the length dependence of AGIDL" unit="A/V^3" ); + parameter real PWAGIDL = 0.0 `P(info="Coefficient for the width dependence of AGIDL" unit="A/V^3" ); + parameter real PLWAGIDL = 0.0 `P(info="Coefficient for the length times width dependence of AGIDL" unit="A/V^3" ); + parameter real POBGIDL = 41 `P(info="Coefficient for the geometry independent part of BGIDL" unit="V" ); + parameter real POSTBGIDL = 0 `P(info="Coefficient for the geometry independent part of STBGIDL" unit="V/K" ); + parameter real POCGIDL = 0 `P(info="Coefficient for the geometry independent part of CGIDL" unit="" ); + + // Charge model parameters + parameter real POCOX = 1E-14 `P(info="Coefficient for the geometry independent part of COX" unit="F" ); + parameter real PLCOX = 0.0 `P(info="Coefficient for the length dependence of COX" unit="F" ); + parameter real PWCOX = 0.0 `P(info="Coefficient for the width dependence of COX" unit="F" ); + parameter real PLWCOX = 0.0 `P(info="Coefficient for the length times width dependence of COX" unit="F" ); + parameter real POCGOV = 1E-15 `P(info="Coefficient for the geometry independent part of CGOV" unit="F" ); + parameter real PLCGOV = 0.0 `P(info="Coefficient for the length dependence of CGOV" unit="F" ); + parameter real PWCGOV = 0.0 `P(info="Coefficient for the width dependence of CGOV" unit="F" ); + parameter real PLWCGOV = 0.0 `P(info="Coefficient for the length times width dependence of CGOV" unit="F" ); + parameter real POCGBOV = 0 `P(info="Coefficient for the geometry independent part of CGBOV" unit="F" ); + parameter real PLCGBOV = 0.0 `P(info="Coefficient for the length dependence of CGBOV" unit="F" ); + parameter real PWCGBOV = 0.0 `P(info="Coefficient for the width dependence of CGBOV" unit="F" ); + parameter real PLWCGBOV = 0.0 `P(info="Coefficient for the length times width dependence of CGBOV" unit="F" ); + parameter real POCFR = 0 `P(info="Coefficient for the geometry independent part of CFR" unit="F" ); + parameter real PLCFR = 0.0 `P(info="Coefficient for the length dependence of CFR" unit="F" ); + parameter real PWCFR = 0.0 `P(info="Coefficient for the width dependence of CFR" unit="F" ); + parameter real PLWCFR = 0.0 `P(info="Coefficient for the length times width dependence of CFR" unit="F" ); + + // Noise model parameters + parameter real POFNT = 1 `P(info="Coefficient for the geometry independent part of FNT" unit="" ); + parameter real PONFA = 8E+22 `P(info="Coefficient for the geometry independent part of NFA" unit="V^-1/m^4" ); + parameter real PLNFA = 0.0 `P(info="Coefficient for the length dependence of NFA" unit="V^-1/m^4" ); + parameter real PWNFA = 0.0 `P(info="Coefficient for the width dependence of NFA" unit="V^-1/m^4" ); + parameter real PLWNFA = 0.0 `P(info="Coefficient for the length times width dependence of NFA" unit="V^-1/m^4" ); + parameter real PONFB = 3E+07 `P(info="Coefficient for the geometry independent part of NFB" unit="V^-1/m^2" ); + parameter real PLNFB = 0.0 `P(info="Coefficient for the length dependence of NFB" unit="V^-1/m^2" ); + parameter real PWNFB = 0.0 `P(info="Coefficient for the width dependence of NFB" unit="V^-1/m^2" ); + parameter real PLWNFB = 0.0 `P(info="Coefficient for the length times width dependence of NFB" unit="V^-1/m^2" ); + parameter real PONFC = 0 `P(info="Coefficient for the geometry independent part of NFC" unit="V^-1" ); + parameter real PLNFC = 0.0 `P(info="Coefficient for the length dependence of NFC" unit="V^-1" ); + parameter real PWNFC = 0.0 `P(info="Coefficient for the width dependence of NFC" unit="V^-1" ); + parameter real PLWNFC = 0.0 `P(info="Coefficient for the length times width dependence of NFC" unit="V^-1" ); + + // Other parameters + parameter real DTA = 0 `P(info="Temperature offset w.r.t. ambient temperature" unit="K" ); diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include new file mode 100644 index 000000000..8c3c3fef6 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include @@ -0,0 +1,250 @@ +//====================================================================================== +//====================================================================================== +// Filename: PSP102_macrodefs.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors +// +// +// Version: 102.1, October 2006 (Simkit 2.4) +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file readme.txt +// + + +///////////////////////////////////////////// +// +// Macros and constants used in PSP +// +///////////////////////////////////////////// + +// Explicit Gmin +`define 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))) + +// Physical constants +`define EPSOX 3.453E-11 +`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 exp80 5.5406223843935098e+34 +`define exp160 3.0698496406442424e+69 + +`ifdef NQSmodel + `define Gint GP + `define Bint BP + `define Bjs BS + `define Bjd BD +`else // NQSmodel + `define Gint G + `define Bint B + `define Bjs B + `define Bjd B +`endif // NQSModel + +///////////////////////////////////////////////////////////////////////////// +// +// 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. +// +///////////////////////////////////////////////////////////////////////////// + + +// sigma function used in surface potential and other calculations +// (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); \ +mu = nu * nu / (tau) + 0.5 * (c) * (c) - (a); \ +y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a))); + + +// modified version of sigma, which takes 4 arguments +`define sigma2(a,b,c,tau,eta,y) \ +nu = (a) + (c); \ +if (abs(tau) < 1e-120) begin /*sometimes tau is extremely small...*/\ + y = (eta); \ +end else begin \ + mu = (nu) * (nu) / (tau) + 0.5 * (c) * (c) - (a) * (b); \ + y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a) * (b))); \ +end + +// +// sp_s 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 / (x1 + Gf * 7.324648775608221e-001); \ + SP_S_A_fac= (xi * x1 * 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 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_ov surface potential calculation for the overlap regions +// +`define sp_ov(sp,xg) \ +if (abs(xg) <= x_mrg_ov) begin \ + sp = (-(xg) * inv_xi_ov); \ +end else begin \ + if (xg < -x_mrg_ov) begin \ + SP_OV_yg = -xg; \ + SP_OV_z = x1 * SP_OV_yg * inv_xi_ov; \ + SP_OV_eta = 0.5 * (SP_OV_z + 10.0 - sqrt((SP_OV_z - 6.0) * (SP_OV_z - 6.0) + 64.0)); \ + SP_OV_a = (SP_OV_yg - SP_OV_eta) * (SP_OV_yg - SP_OV_eta) + GOV2 * (SP_OV_eta + 1.0); \ + SP_OV_c = 2.0 * (SP_OV_yg - SP_OV_eta) - GOV2; \ + SP_OV_tau = ln(SP_OV_a / GOV2) - SP_OV_eta; \ + `sigma(SP_OV_a, SP_OV_c, SP_OV_tau, SP_OV_eta, SP_OV_y0) \ + SP_OV_D0 = exp(SP_OV_y0); \ + SP_OV_temp = SP_OV_yg - SP_OV_y0; \ + SP_OV_p = 2.0 * SP_OV_temp + GOV2 * (SP_OV_D0 - 1.0); \ + SP_OV_q = SP_OV_temp * SP_OV_temp + GOV2 * (SP_OV_y0 + 1.0 - SP_OV_D0); \ + SP_OV_xi = 1.0 - GOV2 * 0.5 * SP_OV_D0; \ + SP_OV_temp = SP_OV_p * SP_OV_p - 4.0 * SP_OV_xi * SP_OV_q; \ + SP_OV_w = 2.0 * SP_OV_q / (SP_OV_p + sqrt(SP_OV_temp)); \ + sp = -(SP_OV_y0 + SP_OV_w); \ + end else begin \ + SP_OV_Afac = (xi_ov * x1 * inv_xg1 - 1.0) * inv_xg1; \ + SP_OV_xbar = xg * inv_xi_ov * (1.0 + SP_OV_Afac * xg); \ + `expl_low(-SP_OV_xbar, SP_OV_temp) \ + SP_OV_w = 1.0 - SP_OV_temp; \ + SP_OV_x0 = xg + GOV2 * 0.5 - GOV * sqrt(xg + GOV2 * 0.25 - SP_OV_w); \ + `expl_low(-SP_OV_x0, SP_OV_D0) \ + SP_OV_p = 2.0 * (xg - SP_OV_x0) + GOV2 * (1 - SP_OV_D0); \ + SP_OV_q = (xg - SP_OV_x0) * (xg - SP_OV_x0) - GOV2 * (SP_OV_x0 - 1.0 + SP_OV_D0); \ + SP_OV_xi = 1.0 - GOV2 * 0.5 * SP_OV_D0; \ + SP_OV_temp = SP_OV_p * SP_OV_p - 4.0 * SP_OV_xi * SP_OV_q; \ + SP_OV_u = 2.0 * SP_OV_q / (SP_OV_p + sqrt(SP_OV_temp)); \ + sp = SP_OV_x0 + SP_OV_u; \ + end \ + sp = -sp; \ +end diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_module.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_module.include new file mode 100644 index 000000000..9b52f55a6 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/PSP102_module.include @@ -0,0 +1,2356 @@ +//====================================================================================== +//====================================================================================== +// Filename: PSP102_module.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors +// +// +// Version: 102.1, October 2006 (Simkit 2.4) +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file readme.txt +// + + // Node definitions + inout D, G, S, B; + electrical D; + electrical G; + electrical S; + electrical B; + + // Extra internal nodes for correlated drain and gate noise + electrical NOI; + electrical NOI2; + + // Extra branches for correlated drain and gate noise + branch (NOI) NOII; + branch (NOI) NOIR; + branch (NOI) NOIC; + +`ifdef NQSmodel + // Internal nodes for gate and bulk resistors + electrical GP; + electrical BP; + electrical BI; + electrical BS; + electrical BD; + + // Internal nodes for spline collocation + 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 + + ////////////////////////// + // + // Model parameters + // + ////////////////////////// + +`ifdef LocalModel + /////////////////////////////////////////////////// + // PSP local model parameters + /////////////////////////////////////////////////// + + // Special model parameters, some are also simulator global variables + parameter real LEVEL = 102 `P(info="Model level" unit="" ); + parameter real TYPE = 1.0 `from( -1.0,1.0 ) `P(info="Channel type parameter, +1=NMOS -1=PMOS" unit="" ); + parameter real TR = 21.0 `from( -273.0,inf ) `P(info="nominal (reference) temperature" unit="C" ); + + // Switch parameters that turn models or effects on or off + parameter real SWIGATE = 0.0 `from( 0.0,1.0 ) `P(info="Flag for gate current, 0=turn off IG" unit="" ); + parameter real SWIMPACT = 0.0 `from( 0.0,1.0 ) `P(info="Flag for impact ionization current, 0=turn off II" unit="" ); + parameter real SWGIDL = 0.0 `from( 0.0,1.0 ) `P(info="Flag for GIDL current, 0=turn off IGIDL" unit="" ); + parameter real SWJUNCAP = 0.0 `from( 0.0,3.0 ) `P(info="Flag for juncap, 0=turn off juncap" unit="" ); + parameter real QMC = 1.0 `from( 0.0,inf ) `P(info="Quantum-mechanical correction factor" unit="" ); + + // Process parameters + parameter real VFB = -1.0 `P(info="Flatband voltage at TR" unit="V" ); + parameter real STVFB = 5.0e-4 `P(info="Temperature dependence of VFB" unit="V/K" ); + parameter real TOX = 2.0e-09 `from( 1e-10,inf ) `P(info="Gate oxide thickness" unit="m" ); + parameter real NEFF = 5.0e+23 `from( 1e20,1e26 ) `P(info="Effective substrate doping" unit="m^-3" ); + parameter real VNSUB = 0.0 `P(info="Effective doping bias-dependence parameter" unit="V" ); + parameter real NSLP = 0.05 `from( 1e-3,inf ) `P(info="Effective doping bias-dependence parameter" unit="V" ); + parameter real DNSUB = 0.0 `from( 0.0,1.0 ) `P(info="Effective doping bias-dependence parameter" unit="V^-1" ); + parameter real DPHIB = 0.0 `P(info="Offset parameter for PHIB" unit="V" ); + parameter real NP = 1.0e+26 `from( 0.0,inf ) `P(info="Gate poly-silicon doping" unit="m^-3" ); + parameter real CT = 0.0 `from( 0.0,inf ) `P(info="Interface states factor" unit="" ); + parameter real TOXOV = 2.0e-09 `from( 1e-10,inf ) `P(info="Overlap oxide thickness" unit="m" ); + parameter real NOV = 5.0e+25 `from( 1e20,1e27 ) `P(info="Effective doping of overlap region" unit="m^-3" ); + + // DIBL parameters + parameter real CF = 0.0 `from( 0.0,inf ) `P(info="DIBL-parameter" unit="V^-1" ); + parameter real CFB = 0.0 `from( 0.0,1.0 ) `P(info="Back bias dependence of CF" unit="V^-1" ); + + // Mobility parameters + parameter real BETN = 7e-2 `from( 0.0,inf ) `P(info="Channel aspect ratio times zero-field mobility" unit="m^2/V/s" ); + parameter real STBET = 1.0 `P(info="Temperature dependence of BETN" unit="" ); + parameter real MUE = 0.5 `from( 0.0,inf ) `P(info="Mobility reduction coefficient at TR" unit="m/V" ); + parameter real STMUE = 0.0 `P(info="Temperature dependence of MUE" unit="" ); + parameter real THEMU = 1.5 `from( 0.0,inf ) `P(info="Mobility reduction exponent at TR" unit="" ); + parameter real STTHEMU = 1.5 `P(info="Temperature dependence of THEMU" unit="" ); + parameter real CS = 0.0 `from( 0.0,inf ) `P(info="Coulomb scattering parameter at TR" unit="" ); + parameter real STCS = 0.0 `P(info="Temperature dependence of CS" unit="" ); + parameter real XCOR = 0.0 `from( 0.0,inf ) `P(info="Non-universality factor" unit="V^-1" ); + parameter real STXCOR = 0.0 `P(info="Temperature dependence of XCOR" unit="" ); + parameter real FETA = 1.0 `from( 0.0,inf ) `P(info="Effective field parameter" unit="" ); + + // Series-resistance parameters (for resistance modeling as part of intrinsic mobility reduction) + parameter real RS = 30 `from( 0.0,inf ) `P(info="Series resistance at TR" unit="Ohm" ); + parameter real STRS = 1.0 `P(info="Temperature dependence of RS" unit="" ); + parameter real RSB = 0.0 `from( -0.5,1.0 ) `P(info="Back-bias dependence of series resistance" unit="V^-1" ); + parameter real RSG = 0.0 `from( -0.5,inf ) `P(info="Gate-bias dependence of series resistance" unit="V^-1" ); + + // Velocity saturation parameters + parameter real THESAT = 1.0 `from( 0.0,inf ) `P(info="Velocity saturation parameter at TR" unit="V^-1" ); + parameter real STTHESAT = 1.0 `P(info="Temperature dependence of THESAT" unit="" ); + parameter real THESATB = 0.0 `from( -0.5,1.0 ) `P(info="Back-bias dependence of velocity saturation" unit="V^-1" ); + parameter real THESATG = 0.0 `from( -0.5,inf ) `P(info="Gate-bias dependence of velocity saturation" unit="V^-1" ); + + // Saturation voltage parameters + parameter real AX = 3.0 `from( 2.0,inf ) `P(info="Linear/saturation transition factor" unit="" ); + + // Channel length modulation (CLM) parameters + parameter real ALP = 0.01 `from( 0.0,inf ) `P(info="CLM pre-factor" unit="" ); + parameter real ALP1 = 0.00 `from( 0.0,inf ) `P(info="CLM enhancement factor above threshold" unit="V" ); + parameter real ALP2 = 0.00 `from( 0.0,inf ) `P(info="CLM enhancement factor below threshold" unit="V^-1" ); + parameter real VP = 0.05 `from( 1e-10,inf ) `P(info="CLM logarithm dependence factor" unit="V" ); + + // Impact ionization (II) parameters + parameter real A1 = 1.0 `from( 0.0,inf ) `P(info="Impact-ionization pre-factor" unit="" ); + parameter real A2 = 10.0 `from( 0.0,inf ) `P(info="Impact-ionization exponent at TR" unit="V" ); + parameter real STA2 = 0.0 `P(info="Temperature dependence of A2" unit="V" ); + parameter real A3 = 1.0 `from( 0.0,inf ) `P(info="Saturation-voltage dependence of impact-ionization" unit="" ); + parameter real A4 = 0.0 `from( 0.0,inf ) `P(info="Back-bias dependence of impact-ionization" unit="V^-0.5" ); + + // Gate current parameters + parameter real GCO = 0.0 `from( -10.0,10.0 ) `P(info="Gate tunnelling energy adjustment" unit="" ); + parameter real IGINV = 0.0 `from( 0.0,inf ) `P(info="Gate channel current pre-factor" unit="A" ); + parameter real IGOV = 0.0 `from( 0.0,inf ) `P(info="Gate overlap current pre-factor" unit="A" ); + parameter real STIG = 2.0 `P(info="Temperature dependence of IGINV and IGOV" unit="" ); + parameter real GC2 = 0.375 `from( 0.0,10.0 ) `P(info="Gate current slope factor" unit="" ); + parameter real GC3 = 0.063 `from( -2.0,2.0 ) `P(info="Gate current curvature factor" unit="" ); + parameter real CHIB = 3.1 `from( 1.0,inf ) `P(info="Tunnelling barrier height" unit="V" ); + + // Gate Induced Drain/Source Leakage (GIDL) parameters + parameter real AGIDL = 0.0 `from( 0.0,inf ) `P(info="GIDL pre-factor" unit="A/V^3" ); + parameter real BGIDL = 41.0 `from( 0.0,inf ) `P(info="GIDL probability factor at TR" unit="V" ); + parameter real STBGIDL = 0.0 `P(info="Temperature dependence of BGIDL" unit="V/K" ); + parameter real CGIDL = 0.0 `P(info="Back-bias dependence of GIDL" unit="" ); + + // Charge model parameters + parameter real COX = 1.0e-14 `from( 0.0,inf ) `P(info="Oxide capacitance for intrinsic channel" unit="F" ); + parameter real CGOV = 1.0e-15 `from( 0.0,inf ) `P(info="Oxide capacitance for gate-drain/source overlap" unit="F" ); + parameter real CGBOV = 0.0 `from( 0.0,inf ) `P(info="Oxide capacitance for gate-bulk overlap" unit="F" ); + parameter real CFR = 0.0 `from( 0.0,inf ) `P(info="Outer fringe capacitance" unit="F" ); + + // Noise parameters + parameter real FNT = 1.0 `from( 0.0,inf ) `P(info="Thermal noise coefficient" unit="" ); + parameter real NFA = 8.0e+22 `from( 0.0,inf ) `P(info="First coefficient of flicker noise" unit="V^-1/m^4" ); + parameter real NFB = 3.0e+07 `from( 0.0,inf ) `P(info="Second coefficient of flicker noise" unit="V^-1/m^2" ); + parameter real NFC = 0.0 `from( 0.0,inf ) `P(info="Third coefficient of flicker noise" unit="V^-1" ); +`ifdef NQSmodel + + // NQS parameters + parameter real SWNQS = 0.0 `from( 0.0,9.0 ) `P(info="Flag for NQS, 0=off, 1, 2, 3, 5, or 9=number of collocation points" unit="" ); + parameter real MUNQS = 1.0 `from( 0.0,inf ) `P(info="Relative mobility for NQS modelling" ); + parameter real RG = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Gate resistance" unit="Ohm" ); + parameter real RBULK = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Bulk resistance between node BP and BI" unit="Ohm" ); + parameter real RWELL = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Well resistance between node BI and B" unit="Ohm" ); + parameter real RJUNS = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Source-side bulk resistance between node BI and BS" unit="Ohm" ); + parameter real RJUND = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Drain-side bulk resistance between node BI and BD" unit="Ohm" ); +`endif // NQSmodel + + // JUNCAP Parameters + parameter real TRJ = 21 `from(`TRJ_cliplow,inf) `P(info="reference temperature" unit="C" ); + `include "JUNCAP200_parlist.include" + + // Other parameters + parameter real DTA = 0.0 `P(info="Temperature offset w.r.t. ambient temperature" unit="K" ); + + // Instance parameters + parameter real ABSOURCE = 1e-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of source junction" unit="m^2" ); + parameter real LSSOURCE = 1e-6 `from(`LS_cliplow,inf) `P(type="instance" info="STI-edge length of source junction" unit="m" ); + parameter real LGSOURCE = 1e-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of source junction" unit="m" ); + parameter real ABDRAIN = 1e-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of drain junction" unit="m^2" ); + parameter real LSDRAIN = 1e-6 `from(`LS_cliplow,inf) `P(type="instance" info="STI-edge length of drain junction" unit="m" ); + parameter real LGDRAIN = 1e-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of drain junction" unit="m" ); + parameter real AS = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of source junction" unit="m^2" ); + parameter real PS = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="Perimeter of source junction" unit="m" ); + parameter real AD = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of drain junction" unit="m^2" ); + parameter real PD = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="Perimeter of drain junction" unit="m" ); + parameter real JW = 1E-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of source/drain junction" unit="m" ); + parameter real MULT = 1.0 `from( 0.0,inf ) `P(type="instance" info="Number of devices in parallel" unit="" ); +`else // LocalModel +`ifdef Binning + + `include "PSP102_binpars.include" + +`else // Binning + /////////////////////////////////////////////////// + // PSP global model parameters + /////////////////////////////////////////////////// + + // Special model parameters + parameter real LEVEL = 1020 `P(info="Model level" unit="" ); + parameter real TYPE = 1.0 `from( -1,1 ) `P(info="Channel type parameter, +1=NMOS -1=PMOS" unit="" ); + + // Reference Temperature + parameter real TR = 21.0 `from( -273.0,inf ) `P(info="nominal (reference) temperature" unit="C" ); + + // Switch parameters that turn models or effects on or off + parameter real SWIGATE = 0.0 `from( 0.0,1.0 ) `P(info="Flag for gate current, 0=turn off IG" unit="" ); + parameter real SWIMPACT = 0.0 `from( 0.0,1.0 ) `P(info="Flag for impact ionization current, 0=turn off II" unit="" ); + parameter real SWGIDL = 0.0 `from( 0.0,1.0 ) `P(info="Flag for GIDL current, 0=turn off IGIDL" unit="" ); + parameter real SWJUNCAP = 0.0 `from( 0.0,3.0 ) `P(info="Flag for juncap, 0=turn off juncap" unit="" ); + parameter real QMC = 1.0 `from( 0.0,inf ) `P(info="Quantum-mechanical correction factor" unit="" ); + + // Process Parameters + parameter real LVARO = 0.0 `P(info="Geom. independent difference between actual and programmed gate length" unit="m" ); + parameter real LVARL = 0.0 `P(info="Length dependence of LVAR" unit="" ); + parameter real LVARW = 0.0 `P(info="Width dependence of LVAR" unit="" ); + parameter real LAP = 0.0 `P(info="Effective channel length reduction per side" unit="m" ); + parameter real WVARO = 0.0 `P(info="Geom. independent difference between actual and programmed field-oxide opening" unit="m" ); + parameter real WVARL = 0.0 `P(info="Length dependence of WVAR" unit="" ); + parameter real WVARW = 0.0 `P(info="Width dependence of WVAR" unit="" ); + parameter real WOT = 0.0 `P(info="Effective channel width reduction per side" unit="m" ); + parameter real DLQ = 0.0 `P(info="Effective channel length reduction for CV" unit="m" ); + parameter real DWQ = 0.0 `P(info="Effective channel width reduction for CV" unit="m" ); + parameter real VFBO = -1.0 `P(info="Geometry-independent flat-band voltage at TR" unit="V" ); + parameter real VFBL = 0.0 `P(info="Length dependence of flat-band voltage" unit="" ); + parameter real VFBW = 0.0 `P(info="Width dependence of flat-band voltage" unit="" ); + parameter real VFBLW = 0.0 `P(info="Area dependence of flat-band voltage" unit="" ); + parameter real STVFBO = 5e-4 `P(info="Geometry-independent temperature dependence of VFB" unit="V/K" ); + parameter real STVFBL = 0.0 `P(info="Length dependence of temperature dependence of VFB" unit="" ); + parameter real STVFBW = 0.0 `P(info="Width dependence of temperature dependence of VFB" unit="" ); + parameter real STVFBLW = 0.0 `P(info="Area dependence of temperature dependence of VFB" unit="" ); + parameter real TOXO = 2e-9 `from( 1e-10,inf ) `P(info="Gate oxide thickness" unit="m" ); + parameter real NSUBO = 3e23 `from( 1e20,inf ) `P(info="Geometry independent substrate doping" unit="m^-3" ); + parameter real NSUBW = 0.0 `P(info="Width dependence of background doping NSUBO due to segregation" unit="" ); + parameter real WSEG = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of segregation of background doping NSUBO" unit="m" ); + parameter real NPCK = 1e24 `from( 0.0,inf ) `P(info="Pocket doping level" unit="m^-3" ); + parameter real NPCKW = 0.0 `P(info="Width dependence of pocket doping NPCK due to segregation" unit="" ); + parameter real WSEGP = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of segregation of pocket doping NPCK" unit="m" ); + parameter real LPCK = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of lateral doping profile" unit="m" ); + parameter real LPCKW = 0.0 `P(info="Width dependence of char. length of lateral doping profile" unit="" ); + parameter real FOL1 = 0.0 `P(info="First length dependence coefficient for short channel body effect" unit="" ); + parameter real FOL2 = 0.0 `P(info="Second length dependence coefficient for short channel body effect" unit="" ); + parameter real VNSUBO = 0.0 `P(info="Effective doping bias-dependence parameter" unit="V" ); + parameter real NSLPO = 0.05 `P(info="Effective doping bias-dependence parameter" unit="V" ); + parameter real DNSUBO = 0.0 `P(info="Effective doping bias-dependence parameter" unit="V^-1" ); + parameter real DPHIBO = 0.0 `P(info="Geometry independent offset of PHIB" unit="V" ); + parameter real DPHIBL = 0.0 `P(info="Length dependence offset of PHIB" unit="V" ); + parameter real DPHIBLEXP= 1.0 `P(info="Exponent for length dependence of offset of PHIB" unit="" ); + parameter real DPHIBW = 0.0 `P(info="Width dependence of offset of PHIB" unit="" ); + parameter real DPHIBLW = 0.0 `P(info="Area dependence of offset of PHIB" unit="" ); + parameter real NPO = 1e26 `P(info="Geometry-independent gate poly-silicon doping" unit="m^-3" ); + parameter real NPL = 0.0 `P(info="Length dependence of gate poly-silicon doping" unit="" ); + parameter real CTO = 0.0 `P(info="Geometry-independent interface states factor" unit="" ); + parameter real CTL = 0.0 `P(info="Length dependence of interface states factor" unit="" ); + parameter real CTLEXP = 1.0 `P(info="Exponent for length dependence of interface states factor" unit="" ); + parameter real CTW = 0.0 `P(info="Width dependence of interface states factor" unit="" ); + parameter real CTLW = 0.0 `P(info="Area dependence of interface states factor" unit="" ); + parameter real TOXOVO = 2e-9 `from( 1e-10,inf ) `P(info="Overlap oxide thickness" unit="m" ); + parameter real LOV = 0 `from( 0.0,inf ) `P(info="Overlap length for gate/drain and gate/source overlap capacitance" unit="m" ); + parameter real NOVO = 5e25 `P(info="Effective doping of overlap region" unit="m^-3" ); + + // DIBL Parameters + parameter real CFL = 0.0 `P(info="Length dependence of DIBL-parameter" unit="V^-1" ); + parameter real CFLEXP = 2.0 `P(info="Exponent for length dependence of CF" unit="" ); + parameter real CFW = 0.0 `P(info="Width dependence of CF" unit="" ); + parameter real CFBO = 0.0 `P(info="Back-bias dependence of CF" unit="V^-1" ); + + // Mobility Parameters + parameter real UO = 5e-2 `P(info="Zero-field mobility at TR" unit="m^2/V/s" ); + parameter real FBET1 = 0.0 `P(info="Relative mobility decrease due to first lateral profile" unit="" ); + parameter real FBET1W = 0.0 `P(info="Width dependence of relative mobility decrease due to first lateral profile" unit="" ); + parameter real LP1 = 1e-8 `from( 1e-10,inf ) `P(info="Mobility-related characteristic length of first lateral profile" unit="m" ); + parameter real LP1W = 0.0 `P(info="Width dependence of mobility-related characteristic length of first lateral profile" unit="" ); + parameter real FBET2 = 0.0 `P(info="Relative mobility decrease due to second lateral profile" unit="" ); + parameter real LP2 = 1e-8 `from( 1e-10,inf ) `P(info="Mobility-related characteristic length of second lateral profile" unit="m" ); + parameter real BETW1 = 0.0 `P(info="First higher-order width scaling coefficient of BETN" unit="" ); + parameter real BETW2 = 0.0 `P(info="Second higher-order width scaling coefficient of BETN" unit="" ); + parameter real WBET = 1e-9 `from( 1e-10,inf ) `P(info="Characteristic width for width scaling of BETN" unit="m" ); + parameter real STBETO = 1.0 `P(info="Geometry independent temperature dependence of BETN" unit="" ); + parameter real STBETL = 0.0 `P(info="Length dependence of temperature dependence of BETN" unit="" ); + parameter real STBETW = 0.0 `P(info="Width dependence of temperature dependence of BETN" unit="" ); + parameter real STBETLW = 0.0 `P(info="Area dependence of temperature dependence of BETN" unit="" ); + parameter real MUEO = 0.5 `P(info="Geometry independent mobility reduction coefficient at TR" unit="m/V" ); + parameter real MUEW = 0.0 `P(info="Width dependence of mobility reduction coefficient at TR" unit="" ); + parameter real STMUEO = 0.0 `P(info="Temperature dependence of MUE" unit="" ); + parameter real THEMUO = 1.5 `P(info="Mobility reduction exponent at TR" unit="" ); + parameter real STTHEMUO = 1.5 `P(info="Temperature dependence of THEMU" unit="" ); + parameter real CSO = 0.0 `P(info="Geometry independent coulomb scattering parameter at TR" unit="" ); + parameter real CSL = 0.0 `P(info="Length dependence of CS" unit="" ); + parameter real CSLEXP = 0.0 `P(info="Exponent for length dependence of CS" unit="" ); + parameter real CSW = 0.0 `P(info="Width dependence of CS" unit="" ); + parameter real CSLW = 0.0 `P(info="Area dependence of CS" unit="" ); + parameter real STCSO = 0.0 `P(info="Temperature dependence of CS" unit="" ); + parameter real XCORO = 0.0 `P(info="Geometry independent non-universality parameter" unit="V^-1" ); + parameter real XCORL = 0.0 `P(info="Length dependence of non-universality parameter" unit="" ); + parameter real XCORW = 0.0 `P(info="Width dependence of non-universality parameter" unit="" ); + parameter real XCORLW = 0.0 `P(info="Area dependence of non-universality parameter" unit="" ); + parameter real STXCORO = 0.0 `P(info="Temperature dependence of XCOR" unit="" ); + parameter real FETAO = 1.0 `P(info="Effective field parameter" unit="" ); + + // Series Resistance + parameter real RSW1 = 2.5e3 `P(info="Source/drain series resistance for 1 um wide channel at TR" unit="Ohm" ); + parameter real RSW2 = 0.0 `P(info="Higher-order width scaling of RS" unit="" ); + parameter real STRSO = 1.0 `P(info="Temperature dependence of RS" unit="" ); + parameter real RSBO = 0.0 `P(info="Back-bias dependence of series resistance" unit="V^-1" ); + parameter real RSGO = 0.0 `P(info="Gate-bias dependence of series resistance" unit="V^-1" ); + + // Velocity Saturation + parameter real THESATO = 0.0 `P(info="Geometry independent velocity saturation parameter at TR" unit="V^-1" ); + parameter real THESATL = 0.05 `P(info="Length dependence of THESAT" unit="V^-1" ); + parameter real THESATLEXP= 1.0 `P(info="Exponent for length dependence of THESAT" unit="" ); + parameter real THESATW = 0.0 `P(info="Width dependence of velocity saturation parameter" unit="" ); + parameter real THESATLW = 0.0 `P(info="Area dependence of velocity saturation parameter" unit="" ); + parameter real STTHESATO= 1.0 `P(info="Geometry independent temperature dependence of THESAT" unit="" ); + parameter real STTHESATL= 0.0 `P(info="Length dependence of temperature dependence of THESAT" unit="" ); + parameter real STTHESATW= 0.0 `P(info="Width dependence of temperature dependence of THESAT" unit="" ); + parameter real STTHESATLW= 0.0 `P(info="Area dependence of temperature dependence of THESAT" unit="" ); + parameter real THESATBO = 0.0 `P(info="Back-bias dependence of velocity saturation" unit="V^-1" ); + parameter real THESATGO = 0.0 `P(info="Gate-bias dependence of velocity saturation" unit="V^-1" ); + + // Saturation Voltage + parameter real AXO = 18 `P(info="Geometry independent linear/saturation transition factor" unit="" ); + parameter real AXL = 0.4 `from( 0.0,inf ) `P(info="Length dependence of AX" unit="" ); + + // Channel Length Modulation + parameter real ALPL = 5e-4 `P(info="Length dependence of ALP" unit="" ); + parameter real ALPLEXP = 1.0 `P(info="Exponent for length dependence of ALP" unit="" ); + parameter real ALPW = 0.0 `P(info="Width dependence of ALP" unit="" ); + parameter real ALP1L1 = 0.0 `P(info="Length dependence of CLM enhancement factor above threshold" unit="V" ); + parameter real ALP1LEXP = 0.5 `P(info="Exponent for length dependence of ALP1" unit="" ); + parameter real ALP1L2 = 0.0 `from( 0.0,inf ) `P(info="Second_order length dependence of ALP1" unit="" ); + parameter real ALP1W = 0.0 `P(info="Width dependence of ALP1" unit="" ); + parameter real ALP2L1 = 0.0 `P(info="Length dependence of CLM enhancement factor below threshold" unit="V^-1" ); + parameter real ALP2LEXP = 0.5 `P(info="Exponent for length dependence of ALP2" unit="" ); + parameter real ALP2L2 = 0.0 `from( 0.0,inf ) `P(info="Second_order length dependence of ALP2" unit="" ); + parameter real ALP2W = 0.0 `P(info="Width dependence of ALP2" unit="" ); + parameter real VPO = 0.05 `P(info="CLM logarithmic dependence parameter" unit="V" ); + + // Weak-avalanche parameters + parameter real A1O = 1.0 `P(info="Geometry independent impact-ionization pre-factor" unit="" ); + parameter real A1L = 0.0 `P(info="Length dependence of A1" unit="" ); + parameter real A1W = 0.0 `P(info="Width dependence of A1" unit="" ); + parameter real A2O = 10 `P(info="Impact-ionization exponent at TR" unit="V" ); + parameter real STA2O = 0.0 `P(info="Temperature dependence of A2" unit="V" ); + parameter real A3O = 1.0 `P(info="Geometry independent saturation-voltage dependence of II" unit="" ); + parameter real A3L = 0.0 `P(info="Length dependence of A3" unit="" ); + parameter real A3W = 0.0 `P(info="Width dependence of A3" unit="" ); + parameter real A4O = 0.0 `P(info="Geometry independent back-bias dependence of II" unit="V^-0.5" ); + parameter real A4L = 0.0 `P(info="Length dependence of A4" unit="" ); + parameter real A4W = 0.0 `P(info="Width dependence of A4" unit="" ); + + // Gate current parameters + parameter real GCOO = 0.0 `P(info="Gate tunnelling energy adjustment" unit="" ); + parameter real IGINVLW = 0.0 `P(info="Gate channel current pre-factor for 1 um^2 channel area" unit="A" ); + parameter real IGOVW = 0.0 `P(info="Gate overlap current pre-factor for 1 um wide channel" unit="A" ); + parameter real STIGO = 2.0 `P(info="Temperature dependence of IGINV and IGOV" unit="" ); + parameter real GC2O = 0.375 `P(info="Gate current slope factor" unit="" ); + parameter real GC3O = 0.063 `P(info="Gate current curvature factor" unit="" ); + parameter real CHIBO = 3.1 `P(info="Tunnelling barrier height" unit="V" ); + + // Gate-induced drain leakage parameters + parameter real AGIDLW = 0.0 `P(info="Width dependence of GIDL pre-factor" unit="A/V^3" ); + parameter real BGIDLO = 41 `P(info="GIDL probability factor at TR" unit="V" ); + parameter real STBGIDLO = 0.0 `P(info="Temperature dependence of BGIDL" unit="V/K" ); + parameter real CGIDLO = 0.0 `P(info="Back-bias dependence of GIDL" unit="" ); + + // Charge Model Parameters + parameter real CGBOVL = 0.0 `P(info="Oxide capacitance for gate-bulk overlap for 1 um^2 area" unit="F" ); + parameter real CFRW = 0.0 `P(info="Outer fringe capacitance for 1 um wide channel" unit="F" ); + + // Noise Model Parameters + parameter real FNTO = 1.0 `P(info="Thermal noise coefficient" unit="" ); + parameter real NFALW = 8e22 `P(info="First coefficient of flicker noise for 1 um^2 channel area" unit="V^-1/m^4" ); + parameter real NFBLW = 3e7 `P(info="Second coefficient of flicker noise for 1 um^2 channel area" unit="V^-1/m^2" ); + parameter real NFCLW = 0.0 `P(info="Third coefficient of flicker noise for 1 um^2 channel area" unit="V^-1" ); + + // Other Parameters + parameter real DTA = 0 `P(info="Temperature offset w.r.t. ambient circuit temperature" unit="K" ); +`endif // Binning +`ifdef NQSmodel + + // NQS parameters + parameter real SWNQS = 0.0 `from( 0.0,9.0 ) `P(info="Flag for NQS, 0=off, 1, 2, 3, 5, or 9=number of collocation points" unit="" ); + parameter real MUNQSO = 1.0 `P(info="Relative mobility for NQS modelling" ); + parameter real RGO = 1.0e-3 `P(info="Gate resistance" ); + parameter real RBULKO = 1.0e-3 `P(info="Bulk resistance between node BP and BI" unit="Ohm" ); + parameter real RWELLO = 1.0e-3 `P(info="Well resistance between node BI and B" unit="Ohm" ); + parameter real RJUNSO = 1.0e-3 `P(info="Source-side bulk resistance between node BI and BS" unit="Ohm" ); + parameter real RJUNDO = 1.0e-3 `P(info="Drain-side bulk resistance between node BI and BD" unit="Ohm" ); +`endif // NQSmodel + + // Stress Model Parameters + parameter real SAREF = 1.0e-6 `from( 1e-9,inf ) `P(info="Reference distance beteen OD-edge to poly from one side" unit="m" ); + parameter real SBREF = 1.0e-6 `from( 1e-9,inf ) `P(info="Reference distance beteen OD-edge to poly from other side" unit="m" ); + parameter real WLOD = 0 `P(info="Width parameter" unit="m" ); + parameter real KUO = 0 `P(info="Mobility degradation/enhancement coefficient" unit="m" ); + parameter real KVSAT = 0 `from( -1.0,1.0 ) `P(info="Saturation velocity degradation/enhancement coefficient" unit="m" ); + parameter real TKUO = 0 `P(info="Temperature dependence of KUO" unit="" ); + parameter real LKUO = 0 `P(info="Length dependence of KUO" unit="m^LLODKUO" ); + parameter real WKUO = 0 `P(info="Width dependence of KUO" unit="m^WLODKUO" ); + parameter real PKUO = 0 `P(info="Cross-term dependence of KUO" unit="m^(LLODKUO+WLODKUO)" ); + parameter real LLODKUO = 0 `from( 0.0,inf ) `P(info="Length parameter for UO stress effect" unit="" ); + parameter real WLODKUO = 0 `from( 0.0,inf ) `P(info="Width parameter for UO stress effect" unit="" ); + parameter real KVTHO = 0 `P(info="Threshold shift parameter" unit="Vm" ); + parameter real LKVTHO = 0 `P(info="Length dependence of KVTHO" unit="m^LLODVTH" ); + parameter real WKVTHO = 0 `P(info="Width dependence of KVTHO" unit="m^WLODVTH" ); + parameter real PKVTHO = 0 `P(info="Cross-term dependence of KVTHO" unit="m^(LLODVTH+WLODVTH)" ); + parameter real LLODVTH = 0 `from( 0.0,inf ) `P(info="Length parameter for VTH-stress effect" unit="" ); + parameter real WLODVTH = 0 `from( 0.0,inf ) `P(info="Width parameter for VTH-stress effect" unit="" ); + parameter real STETAO = 0 `P(info="eta0 shift factor related to VTHO change" unit="m" ); + parameter real LODETAO = 1.0 `from( 0.0,inf ) `P(info="eta0 shift modifaction factor for stress effect" unit="" ); + + // JUNCAP Parameters + parameter real TRJ = 21 `from(`TRJ_cliplow,inf) `P(info="reference temperature" unit="C"); + `include "JUNCAP200_parlist.include" + + // Instance parameters + parameter real L = 10e-6 `from( 1e-9,inf ) `P(type="instance" info="Design length" unit="m" ); + parameter real W = 10e-6 `from( 1e-9,inf ) `P(type="instance" info="Design width" unit="m" ); + parameter real SA = 0.0 `P(type="instance" info="Distance beteen OD-edge to poly from one side" unit="m" ); + parameter real SB = 0.0 `P(type="instance" info="Distance beteen OD-edge to poly from other side" unit="m" ); + parameter real ABSOURCE = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of source junction" unit="m^2" ); + parameter real LSSOURCE = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="STI-edge length of source junction" unit="m" ); + parameter real LGSOURCE = 1E-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of source junction" unit="m" ); + parameter real ABDRAIN = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of drain junction" unit="m^2" ); + parameter real LSDRAIN = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="STI-edge length of drain junction" unit="m" ); + parameter real LGDRAIN = 1E-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of drain junction" unit="m" ); + parameter real AS = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of source junction" unit="m^2" ); + parameter real PS = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="Perimeter of source junction" unit="m" ); + parameter real AD = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of drain junction" unit="m^2" ); + parameter real PD = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="Perimeter of drain junction" unit="m" ); + parameter real MULT = 1.0 `from( 0.0,inf ) `P(type="instance" info="Number of devices in parallel" unit="" ); + + ////////////////////////// + // + // Variables + // + ////////////////////////// + + // Variables for geometrical scaling rules + real L_i, W_i, SA_i, SB_i; + real LEN, WEN, iL, iW, delLPS, delWOD, LE, WE, iLE, iWE, Lcv, Wcv, LEcv, WEcv; + +`ifdef Binning + // Auxiliary variables for binning-rules + real iLEWE, iiLE, iiWE, iiLEWE, iiiLEWE; + real iLEcv, iiLEcv, iiWEcv, iiLEWEcv, iiiLEWEcv; + real iLcv, iiLcv, iiWcv, iiLWcv, iiiLWcv; +`else // Binning + // Intermediate variables used for geometry-scaling + real NSUBO_i, WSEG_i, NPCK_i, WSEGP_i, LPCK_i, LOV_i; + real LP1_i, LP2_i, WBET_i, AXL_i, ALP1L2_i, ALP2L2_i; + real NSUB, AA, BB, NSUB0e, NPCKe, LPCKe; + real FBET1e, LP1e, GPE, GWE, tmpx; +`endif // Binning + + // List of local parameters + real VFB, STVFB, TOX, NEFF, VNSUB, NSLP, DNSUB, DPHIB, NP, CT; + real TOXOV, NOV, CF, CFB; + real BETN, STBET, MUE, STMUE, THEMU, STTHEMU, CS, STCS, XCOR, STXCOR, FETA; + real RS, STRS, RSB, RSG; + real THESAT, STTHESAT, THESATB, THESATG; + real AX; + real ALP, ALP1, ALP2, VP; + real A1, A2, STA2, A3, A4; + real GCO, IGINV, IGOV, STIG, GC2, GC3, CHIB; + real AGIDL, BGIDL, STBGIDL, CGIDL; + real COX, CGOV, CGBOV, CFR; + real FNT, NFA, NFB, NFC; +`ifdef NQSmodel + real MUNQS, RG, RBULK, RWELL, RJUNS, RJUND; +`endif // NQSmodel + + // Variables for stress-model + real SAREF_i, SBREF_i, KVSAT_i, LLODKUO_i, WLODKUO_i, LLODVTH_i, WLODVTH_i, LODETAO_i; + real Invsa, Invsb, Invsaref, Invsbref, Kstressu0, rhobeta, rhobetaref, Kstressvth0; + real temp0, templ, tempw, Lx, Wx; +`endif // LocalModel + + // Variables used in electrical equations + real VFB_i, STVFB_i, TOX_i, NEFF_i, VNSUB_i, NSLP_i, DNSUB_i, NP_i, QMC_i, CT_i, TOXOV_i, NOV_i; + real CF_i, CFB_i, DPHIB_i; + real BET_i, STBET_i, MUE_i, STMUE_i, THEMU_i, STTHEMU_i, CS_i, STCS_i, XCOR_i, STXCOR_i, FETA_i; + real RS_i, THER_i, STRS_i, RSB_i, RSG_i; + real THESAT_i, STTHESAT_i, THESATB_i, THESATG_i; + real AX_i, ALP_i, ALP1_i, ALP2_i, VP_i; + real A1_i, A2_i, STA2_i, A3_i, A4_i; + real GCO_i, IGINV_i, IGOV_i, STIG_i, GC2_i, GC3_i, CHIB_i; + real AGIDL_i, BGIDL_i, STBGIDL_i, CGIDL_i; + real COX_i, CGOV_i, CGBOV_i, CFR_i; + real FNT_i, NFA_i, NFB_i, NFC_i; + real TR_i, MULT_i; + + real temp, temp1, temp2, tempM; + real help; + + real TKR, TKD, TKD_sq, dT, rT, rTn; + real phit, inv_phit, Eg, phibFac, CoxPrime, tox_sq; + real delVg, CoxovPrime, GOV, GOV2; + real np, kp, qq, qb0, dphibq, qlim2; + real E_eff0, eta_mu, BCH, BOV, inv_CHIB, GCQ, Dch, Dov; + real tf_bet, tf_mue, tf_cs, tf_xcor, tf_ther, tf_thesat, tf_ig; + real xi_ov, inv_xi_ov, x_mrg_ov, x1, inv_xg1, Vdsat_lim; + real nt, Cox_over_q; + + real phib, sqrt_phib, phix, aphi, bphi, phix1, phix2, G_0, phit1, inv_phit1, alpha_b; + real inv_VP, inv_AX, Sfl_prefac; + + real Vgs, Vgd, Vds, Vsb, Vsbstar; + real Vgb, Vgb1, Vgbstar, Vdb, Vdbstar, Vdsx, Vsbx; + + real Dnsub; + real Igidl, Igisl, Vtovd, Vtovs; + real x_s, sqm, alpha, alpha1, eta_p, phi_inf, za, xitsb, rhob; + real thesat1, wsat, ysat, zsat, r1, r2, dL, GdL, dL1, FdL, GR, Gmob, Gmob_dL, Gvsat, QCLM; + real xgm, Voxm, dps, qim, qim1, qim1_1, xgs_ov, xgd_ov, sigVds; + real Ux, xg; + real mu, nu, xn_s, delta_ns; + real Gf, Gf2, inv_Gf2, xi, inv_xi, margin; + real qeff, COX_qm; + + real SP_xg1, SP_S_temp,SP_S_temp1,SP_S_temp2; + real SP_S_yg, SP_S_ysub, SP_S_y0, SP_S_a, SP_S_b, SP_S_c; + real SP_S_bx, SP_S_tau, SP_S_eta, SP_S_delta0, SP_S_delta1; + real SP_S_pC, SP_S_qC, SP_S_A_fac; + real SP_S_x1, SP_S_w, SP_S_xbar, SP_S_x0; + real SP_S_xi0, SP_S_xi1, SP_S_xi2; + real SP_OV_yg, SP_OV_z, SP_OV_eta, SP_OV_a, SP_OV_c; + real SP_OV_tau, SP_OV_D0, SP_OV_y0, SP_OV_xi, SP_OV_temp; + real SP_OV_p, SP_OV_q, SP_OV_w, SP_OV_Afac, SP_OV_xbar; + real SP_OV_x0, SP_OV_u; + + real x_d, x_m, x_ds, Rxcor, delta_1s, xi0s, xi1s, xi2s, xi0d; + real Es, Em, Ed, Ds, Dm, Dd, Ps, xgs, qis, qbs, qbm, Eeffm, Vm; + real Phi_0, Phi_2, asat, Phi_0_2, Phi0_Phi2; + real Vdse, Vdsat, xn_d, k_ds, Udse; + real Mutmp, Phi_sat, delta_nd; + real pC, qC, Pm; + real d0, D_bar, km, x_pm, xi_pd, p_pd, u_pd, q_pd; + real xs_ov, xd_ov, Vovs, Vovd, psi_t; + real zg, delVsat, TP, Dsi, Dgate, u0, u0_div_H, x, xsq, inv_x, ex, inv_ex, Ag, Bg, Sg; + real H, Fj, Fj2; + real N1, Nm1, Delta_N1, Sfl; + real H0, t1, t2, sqt2, r, lc, lcinv2, g_ideal, CGeff, mid, mig, migid, c_igid, sqid, sqig; + real shot_igs, shot_igsx, shot_igd, shot_igdx, shot_iavl; + + real Ids, Iimpact, mavl, Igdov, Igsov, Igc0, igc, igcd_h; + real Igc, Igcd, Igcs, Igb, Igs, Igd; + real Idse, Igbe, Igse, Igde, Igidle, Igisle, Iimpacte; + real QI, QD, QB, QG, Qg, Qd, Qb, Qs, Qgs_ov, Qgd_ov; + real Qfgs, Qfgd, Qgb_ov; + + real arg1, arg2max, arg2mina; + + integer CHNL_TYPE; + +`ifdef NQSmodel + // Variables used in NQS-calculations + real SWNQS_i, MUNQS_i, RG_i, RBULK_i, RWELL_i, RJUNS_i, RJUND_i; + real Qp1_0, Qp2_0, Qp3_0, Qp4_0, Qp5_0, Qp6_0, Qp7_0, Qp8_0, Qp9_0; + real fk1, fk2, fk3, fk4, fk5, fk6, fk7, fk8, fk9; + + real phi_p1, phi_p2, phi_p3; + real phi_p4, phi_p5, phi_p6; + real phi_p7, phi_p8, phi_p9; + + real Qp1, Qp2, Qp3; + real Qp4, Qp5, Qp6; + real Qp7, Qp8, Qp9; + real Qp0, QpN; + + real QG_NQS, QS_NQS, QD_NQS; + real pd, Gp, Gp2, a_factrp, marginp, x_sp, x_dp; + + real dfQi, fQi, dQis, dQis_1, d2Qis, dQbs, dQy, d2Qy, dpsy2; + real ym, inorm, Tnorm, Qb_tmp, QbSIGN; + real r_nqs, vnorm, vnorm_inv; + real NQS_xg1, NQS_yg, NQS_z, NQS_eta, NQS_a, NQS_c, NQS_tau, NQS_D0, NQS_xi, NQS_p; + real NQS_q, NQS_temp, NQS_A_fac, NQS_xbar, NQS_w, NQS_x0, NQS_u, NQS_y0; + real xphi, fk0, thesat2, Fvsat; + real Vrg, Vrbulk, Vrwell, Vrjund, Vrjuns; + real ggate, gbulk, gwell, gjund, gjuns, nt0; + real rgatenoise, rbulknoise, rwellnoise, rjundnoise, rjunsnoise; + real temp3, temp4, temp5, temp6, temp7, temp8, temp9; +`endif // NQSmodel + + // JUNCAP2 variables + `include "JUNCAP200_varlist.include" + real isjunbot, qsjunbot, isjunsti, qsjunsti, isjungat, qsjungat, isjun, qsjun, sjnoise, sjnoisex; + real idjunbot, qdjunbot, idjunsti, qdjunsti, idjungat, qdjungat, idjun, qdjun, djnoise, djnoisex; + real Vjuns, Vjund, VMAXS, VMAXD; + real vbimins, vchs, vfmins, vbbtlims, vbimind, vchd, vfmind, vbbtlimd; + real ABSOURCE_i, LSSOURCE_i, LGSOURCE_i; + real ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, juncapwidth; + + + +`ifdef insideADMS // OPinfo + ///////////////////////////////////////////////////////////////////////////// + // + // Variables for operating point info + // + ///////////////////////////////////////////////////////////////////////////// + + real id_op, is, ig, ib, P_D, facvsb, facvsb0, sig1k; + + real ctype `P(ask="yes" info="Flag for channel type" unit=""); + real sdint `P(ask="yes" info="Flag for source-drain interchange" unit=""); + + real ise `P(ask="yes" info="Total source current" unit="A"); + real ige `P(ask="yes" info="Total gate current" unit="A"); + real ide `P(ask="yes" info="Total drain current" unit="A"); + real ibe `P(ask="yes" info="Total bulk current" unit="A"); + real ids `P(ask="yes" info="Drain current, excl. avalanche, tunnel, GISL, GIDL, and junction currents" unit="A"); + real idb `P(ask="yes" info="Drain to bulk current" unit="A"); + real isb `P(ask="yes" info="Source to bulk current" unit="A"); + real igs `P(ask="yes" info="Gate-source tunneling current" unit="A"); + real igd `P(ask="yes" info="Gate-drain tunneling current" unit="A"); + real igb `P(ask="yes" info="Gate-bulk tunneling current" unit="A"); + real igcs `P(ask="yes" info="Gate-channel tunneling current (source component)" unit="A"); + real igcd `P(ask="yes" info="Gate-channel tunneling current (drain component)" unit="A"); + real iavl `P(ask="yes" info="Substrate current due to weak avelanche" unit="A"); + real igisl `P(ask="yes" info="Gate-induced source leakage current" unit="A"); + real igidl `P(ask="yes" info="Gate-induced drain leakage current" unit="A"); + + real ijs `P(ask="yes" info="Total source junction current" unit="A"); + real ijsbot `P(ask="yes" info="Source junction current (bottom component)" unit="A"); + real ijsgat `P(ask="yes" info="Source junction current (gate-edge component)" unit="A"); + real ijssti `P(ask="yes" info="Source junction current (STI-edge component)" unit="A"); + real ijd `P(ask="yes" info="Total drain junction current" unit="A"); + real ijdbot `P(ask="yes" info="Drain junction current (bottom component)" unit="A"); + real ijdgat `P(ask="yes" info="Drain junction current (gate-edge component)" unit="A"); + real ijdsti `P(ask="yes" info="Drain junction current (STI-edge component)" unit="A"); + + real vds `P(ask="yes" info="Drain-source voltage" unit="V"); + real vgs `P(ask="yes" info="Gate-source voltage" unit="V"); + real vsb `P(ask="yes" info="Source-bulk voltage" unit="V"); + real vto `P(ask="yes" info="Zero-bias threshold voltage" unit="V"); + real vts `P(ask="yes" info="Threshold voltage including back bias effects" unit="V"); + real vth `P(ask="yes" info="Threshold voltage including back bias and drain bias effects" unit="V"); + real vgt `P(ask="yes" info="Effective gate drive voltage including back bias and drain bias effects" unit="V"); + real vdss `P(ask="yes" info="Drain saturation voltage at actual bias" unit="V"); + real vsat `P(ask="yes" info="Saturation limit" unit="V"); + + real gm `P(ask="yes" info="Transconductance" unit="1/Ohm"); + real gmb `P(ask="yes" info="Substrate transconductance" unit="1/Ohm"); + real gds `P(ask="yes" info="Output conductance" unit="1/Ohm"); + real gjs `P(ask="yes" info="Source junction conductance" unit="1/Ohm"); + real gjd `P(ask="yes" info="Drain junction conductance" unit="1/Ohm"); + + real cdd `P(ask="yes" info="Drain capacitance" unit="F"); + real cdg `P(ask="yes" info="Drain-gate capacitance" unit="F"); + real cds `P(ask="yes" info="Drain-source capacitance" unit="F"); + real cdb `P(ask="yes" info="Drain-bulk capacitance" unit="F"); + real cgd `P(ask="yes" info="Gate-drain capacitance" unit="F"); + real cgg `P(ask="yes" info="Gate capacitance" unit="F"); + real cgs `P(ask="yes" info="Gate-source capacitance" unit="F"); + real cgb `P(ask="yes" info="Gate-bulk capacitance" unit="F"); + real csd `P(ask="yes" info="Source-drain capacitance" unit="F"); + real csg `P(ask="yes" info="Source-gate capacitance" unit="F"); + real css `P(ask="yes" info="Source capacitance" unit="F"); + real csb `P(ask="yes" info="Source-bulk capacitance" unit="F"); + real cbd `P(ask="yes" info="Bulk-drain capacitance" unit="F"); + real cbg `P(ask="yes" info="Bulk-gate capacitance" unit="F"); + real cbs `P(ask="yes" info="Bulk-source capacitance" unit="F"); + real cbb `P(ask="yes" info="Bulk capacitance" unit="F"); + real cgsol `P(ask="yes" info="Total gate-source overlap capacitance" unit="F"); + real cgdol `P(ask="yes" info="Total gate-drain overlap capacitance" unit="F"); + + real cjs `P(ask="yes" info="Total source junction capacitance" unit="F"); + real cjsbot `P(ask="yes" info="Source junction capacitance (bottom component)" unit="F"); + real cjsgat `P(ask="yes" info="Source junction capacitance (gate-edge component)" unit="F"); + real cjssti `P(ask="yes" info="Source junction capacitance (STI-edge component)" unit="F"); + real cjd `P(ask="yes" info="Total drain junction capacitance" unit="F"); + real cjdbot `P(ask="yes" info="Drain junction capacitance (bottom component)" unit="F"); + real cjdgat `P(ask="yes" info="Drain junction capacitance (gate-edge component)" unit="F"); + real cjdsti `P(ask="yes" info="Drain junction capacitance (STI-edge component)" unit="F"); + + real weff `P(ask="yes" info="Effective channel width for geometrical models" unit="m"); + real leff `P(ask="yes" info="Effective channel length for geometrical models" unit="m"); + real u `P(ask="yes" info="Transistor gain" unit=""); + real rout `P(ask="yes" info="Small-signal output resistance" unit="Ohm"); + real vearly `P(ask="yes" info="Equivalent Early voltage" unit="V"); + real beff `P(ask="yes" info="Gain factor" unit="A/V^2"); + real fug `P(ask="yes" info="Unity gain frequency at actual bias" unit="Hz"); + + real sfl `P(ask="yes" info="Flicker noise current density at 1 Hz" unit="A/Hz"); + real sqrtsff `P(ask="yes" info="Input-referred RMS white noise voltage density at 1 kHz" unit="V/sqrt(Hz)"); + real sqrtsfw `P(ask="yes" info="Input-referred RMS white noise voltage density" unit="V/sqrt(Hz)"); + real sid `P(ask="yes" info="White noise current density" unit="A^2/Hz"); + real sig `P(ask="yes" info="Induced gate noise current density at 1 Hz" unit="A^2/Hz"); + real cigid `P(ask="yes" info="Imaginary part of correlation coefficient between Sig and Sid" unit=""); + real fknee `P(ask="yes" info="Cross-over frequency above which white noise is dominant" unit="Hz"); + real sigs `P(ask="yes" info="Gate-source current noise spectral density" unit="A^2/Hz"); + real sigd `P(ask="yes" info="Gate-drain current noise spectral density" unit="A^2/Hz"); + real siavl `P(ask="yes" info="Impact ionization current noise spectral density" unit="A^2/Hz"); + real ssi `P(ask="yes" info="Total source junction current noise spectral density" unit="A^2/Hz"); + real sdi `P(ask="yes" info="Total drain junction current noise specral density" unit="A^2/Hz"); +`endif // OPinfo + + ///////////////////////////////////////////////////////////////////////////// + // + // Analog block with all calculations and contribs + // + ///////////////////////////////////////////////////////////////////////////// + + analog begin + + begin : initializeModel + // Code independent of bias or instance parameters + // This block needs to be evaluated only once + +`ifdef LocalModel + // Do nothing +`else // LocalModel +`ifdef Binning + // There are no binning parameters that need clipping +`else // Binning + // Clipping of global model parameters + TOX_i = `CLIP_LOW(TOXO, 1e-10); + NSUBO_i = `CLIP_LOW(NSUBO, 1e20); + WSEG_i = `CLIP_LOW(WSEG, 1e-10); + NPCK_i = `CLIP_LOW(NPCK, 0.0); + WSEGP_i = `CLIP_LOW(WSEGP, 1e-10); + LPCK_i = `CLIP_LOW(LPCK, 1e-10); + TOXOV_i = `CLIP_LOW(TOXOVO, 1e-10); + LOV_i = `CLIP_LOW(LOV, 0.0); + LP1_i = `CLIP_LOW(LP1, 1e-10); + LP2_i = `CLIP_LOW(LP2, 1e-10); + WBET_i = `CLIP_LOW(WBET, 1e-10); + AXL_i = `CLIP_LOW(AXL, 0.0); + ALP1L2_i = `CLIP_LOW(ALP1L2, 0.0); + ALP2L2_i = `CLIP_LOW(ALP2L2, 0.0); +`endif // Binning + + 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); +`endif // LocalModel + + // 4.1 Internal parameters (including temperature scaling) + // (only internal parameters independent on instance parameters + // are calculated in this section) + if (TYPE >= 0) begin + CHNL_TYPE = `NMOS; + end else begin + CHNL_TYPE = `PMOS; + end + + // Transistor temperature + TR_i = `CLIP_LOW(TR, -273); + TKR = `KELVINCONVERSION + TR_i; + TKD = $temperature + DTA; + TKD_sq = TKD * TKD; + dT = TKD - TKR; + rT = TKD / TKR; + rTn = TKR / TKD; + phit = TKD * `KBOL / `QELE; + inv_phit = 1.0 / phit; + + // Local process parameters + 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); + +`ifdef NQSmodel + // Round SWNQS to nearest allowed value + if (SWNQS < 0.5) begin + SWNQS_i = 0.0; + end else begin + if (SWNQS < 1.5) begin + SWNQS_i = 1.0; + end else begin + if (SWNQS < 2.5) begin + SWNQS_i = 2.0; + end else begin + if (SWNQS < 4.0) begin + SWNQS_i = 3.0; + end else begin + if (SWNQS < 7.0) begin + SWNQS_i = 5.0; + end else begin + SWNQS_i = 9.0; + end + end + end + end + end + inorm = 1.0e-12; + r_nqs = 1.0e+3; + vnorm = 10.0; + vnorm_inv = 1.0 / vnorm; + + nt0 = 4 * `KBOL * TKD; // parameter for white noise of parasitic resistances +`endif // NQSmodel + + // JUNCAP2 + `include "JUNCAP200_InitModel.include" + + end // initializeModel + + begin : initializeInstance + // Code independent of bias, but dependent on instance parameters, + // (including code dependent on parameters which could IN PRINCIPLE be scaled) + // This block needs to be evaluated only once for each instance + +`ifdef LocalModel + juncapwidth= JW; + +`else // LocalModel + // Clipping of the instance parameters + SAREF_i = `CLIP_LOW(SAREF, 1e-9); + SBREF_i = `CLIP_LOW(SBREF, 1e-9); + L_i = `CLIP_LOW(L, 1e-9); + W_i = `CLIP_LOW(W, 1e-9); + SA_i = SA; + SB_i = SB; + + /////////////////////////////////////////// + // GEOMETRICAL PARAMETERSCALING + /////////////////////////////////////////// + + // 3.2 Transistor geometry + LEN = 1e-6; + WEN = 1e-6; + iL = LEN / L_i; + iW = WEN / W_i; +`ifdef Binning + delLPS = LVARO * (1.0 + LVARL * iL); + delWOD = WVARO * (1.0 + WVARW * iW); +`else // Binning + delLPS = LVARO * (1.0 + LVARL * iL) * (1.0 + LVARW * iW); + delWOD = WVARO * (1.0 + WVARL * iL) * (1.0 + WVARW * iW); +`endif // Binning + LE = `CLIP_LOW(L_i + delLPS - 2.0 * LAP, 1e-9); + WE = `CLIP_LOW(W_i + delWOD - 2.0 * WOT, 1e-9); + LEcv = `CLIP_LOW(L_i + delLPS - 2.0 * LAP + DLQ, 1e-9); + WEcv = `CLIP_LOW(W_i + delWOD - 2.0 * WOT + DWQ, 1e-9); + Lcv = `CLIP_LOW(L_i + delLPS + DLQ, 1e-9); + Wcv = `CLIP_LOW(W_i + delWOD + DWQ, 1e-9); + iLE = LEN / LE; + iWE = WEN / WE; + juncapwidth= WE; + +`ifdef Binning + // 3.4 Geometry scaling with binning scaling rules + `include "PSP102_binning.include" + +`else // Binning + // 3.3 Geometry scaling with physical scaling rules + + // Process parameters + VFB = VFBO * (1.0 + VFBL * iLE) * (1.0 + VFBW * iWE) * (1.0 + VFBLW * iLE * iWE); + STVFB = STVFBO * (1.0 + STVFBL * iLE) * (1.0 + STVFBW * iWE) * (1.0 + STVFBLW * iLE * iWE); + TOX = TOXO; + 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 * LPCKe)) begin + AA = 7.5e10; + BB = sqrt(NSUB0e + 0.5 * NPCKe) - sqrt(NSUB0e); + NSUB = sqrt(NSUB0e) + AA * ln(1 + 2 * LPCKe / LE * (exp(BB / AA) - 1)); + NSUB = NSUB * NSUB; + end else begin + if (LE >= LPCKe) begin + NSUB = NSUB0e + NPCKe * LPCKe / LE; + end else begin // LE < LPCK + NSUB = NSUB0e + NPCKe * (2 - LE / LPCKe); + end + end + NEFF = NSUB * (1 - FOL1 * iLE - FOL2 * iLE * iLE); + VNSUB = VNSUBO; + NSLP = NSLPO; + DNSUB = DNSUBO; + DPHIB = (DPHIBO + DPHIBL * pow(iLE, DPHIBLEXP)) * (1.0 + DPHIBW * iWE) * (1.0 + DPHIBLW * iLE * iWE); + NP = NPO * `MAX(1e-6, (1.0 + NPL * iLE)); + CT = (CTO + CTL * pow(iLE, CTLEXP)) * (1.0 + CTW * iWE) * (1.0 + CTLW * iLE * iWE); + TOXOV = TOXOVO; + NOV = NOVO; + + // DIBL parameters + CF = CFL * pow(iLE, CFLEXP) * (1.0 + CFW * iWE); + CFB = CFBO; + + // 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, 1e-15); + GWE = 1.0 + BETW1 * iWE + BETW2 * iWE * ln(1.0 + WE / WBET_i); + BETN = UO * WE / (GPE * LE) * GWE; + STBET = STBETO * (1.0 + STBETL * iLE) * (1.0 + STBETW * iWE) * (1.0 + STBETLW * iLE * iWE); + MUE = MUEO * (1.0 + MUEW * iWE); + STMUE = STMUEO; + THEMU = THEMUO; + STTHEMU = STTHEMUO; + CS = (CSO + CSL * pow(iLE, CSLEXP)) * (1.0 + CSW * iWE) * (1.0 + CSLW * iLE * iWE); + STCS = STCSO; + XCOR = XCORO * (1.0 + XCORL * iLE) * (1.0 + XCORW * iWE) * (1.0 + XCORLW * iLE * iWE); + STXCOR = STXCORO; + FETA = FETAO; + + // Series resistance + RS = RSW1 * iWE * (1.0 + RSW2 * iWE); + STRS = STRSO; + RSB = RSBO; + RSG = RSGO; + + // Velocity saturation + THESAT = (THESATO + THESATL* GWE / GPE * pow(iLE, THESATLEXP)) * (1.0 + THESATW * iWE) * (1.0 + THESATLW * iLE * iWE); + STTHESAT = STTHESATO * (1.0 + STTHESATL * iLE) * (1.0 + STTHESATW * iWE) * (1.0 + STTHESATLW * iLE * iWE); + THESATB = THESATBO; + THESATG = THESATGO; + + // Saturation voltage + AX = AXO / (1.0 + AXL_i * iLE); + + // Channel length modulation + ALP = ALPL * pow(iLE, ALPLEXP) * (1.0 + ALPW * iWE); + tmpx = pow(iLE, ALP1LEXP); + ALP1 = ALP1L1 * tmpx * (1.0 + ALP1W * iWE) / (1.0 + ALP1L2_i * iLE * tmpx); + tmpx = pow(iLE, ALP2LEXP); + ALP2 = ALP2L1 * tmpx * (1.0 + ALP2W * iWE) / (1.0 + ALP2L2_i * iLE * tmpx); + VP = VPO; + + // Impact ionization + A1 = A1O * (1.0 + A1L * iLE) * (1.0 + A1W * iWE); + A2 = A2O; + STA2 = STA2O; + A3 = A3O * (1.0 + A3L * iLE) * (1.0 + A3W * iWE); + A4 = A4O * (1.0 + A4L * iLE) * (1.0 + A4W * iWE); + + // Gate current + GCO = GCOO; + IGINV = IGINVLW / (iWE * iLE); + IGOV = IGOVW * LOV_i / (LEN * iWE); + STIG = STIGO; + GC2 = GC2O; + GC3 = GC3O; + CHIB = CHIBO; + + // GIDL + AGIDL = AGIDLW * LOV_i / (LEN * iWE); + BGIDL = BGIDLO; + STBGIDL = STBGIDLO; + CGIDL = CGIDLO; + + // Charge model parameters + COX = `EPSOX * WEcv * LEcv / TOX_i; + CGOV = `EPSOX * WEcv * LOV_i / TOXOV_i; + CGBOV = CGBOVL * Lcv / LEN; + CFR = CFRW * Wcv / WEN; + FNT = FNTO; + + // Noise model parameters + NFA = iWE * iLE * NFALW; + NFB = iWE * iLE * NFBLW; + NFC = iWE * iLE * NFCLW; +`endif // Binning + +`ifdef NQSmodel + MUNQS = MUNQSO; + RG = RGO; + RWELL = RWELLO; + RBULK = RBULKO; + RJUNS = RJUNSO; + RJUND = RJUNDO; +`endif // NQSModel + + /////////////////////////////////////////// + // STRESSMODEL + /////////////////////////////////////////// + + // 3.5 Stress equations + if ((SA_i > 0) && (SB_i > 0)) begin + // Auxiliary variables + Invsa = 1.0 / (SA_i + 0.5 * L_i); + Invsb = 1.0 / (SB_i + 0.5 * L_i); + Invsaref = 1.0 / (SAREF_i + 0.5 * L_i); + Invsbref = 1.0 / (SBREF_i + 0.5 * L_i); + Lx = `MAX(L_i + delLPS, 1e-9); + Wx = `MAX(W_i + delWOD + WLOD, 1e-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 * (rT - 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 + BETN = BETN * (1.0 + rhobeta) / (1.0 + rhobetaref); + THESAT = THESAT * (1.0 + rhobeta) * (1.0 + KVSAT_i * rhobetaref) / ((1.0 + rhobetaref) * (1.0 + KVSAT_i * rhobeta)); + VFB = VFB + KVTHO * temp0 / Kstressvth0; + CF = CF + STETAO * temp0 / pow(Kstressvth0, LODETAO_i); + end + + /////////////////////////////////////////// + // END OF SCALINGRULES AND STRESSMODEL + /////////////////////////////////////////// + +`endif // LocalModel + // 4.1 Internal parameters (including temperature scaling) + + // Clipping of the local model parameters + VFB_i = VFB; + STVFB_i = STVFB; + TOX_i = `CLIP_LOW(TOX, 1e-10); + NEFF_i = `CLIP_BOTH(NEFF, 1e20, 1e26); + VNSUB_i = VNSUB; + NSLP_i = `CLIP_LOW(NSLP, 1e-3); + DNSUB_i = `CLIP_BOTH(DNSUB, 0.0, 1.0); + DPHIB_i = DPHIB; + NP_i = `CLIP_LOW(NP, 0.0); + QMC_i = `CLIP_LOW(QMC, 0.0); + CT_i = `CLIP_LOW(CT, 0.0); + TOXOV_i = `CLIP_LOW(TOXOV, 1e-10); + NOV_i = `CLIP_BOTH(NOV, 1e20, 1e27); + CF_i = `CLIP_LOW(CF, 0.0); + CFB_i = `CLIP_BOTH(CFB, 0.0, 1.0); + BET_i = `CLIP_LOW(BETN, 0.0); + STBET_i = STBET; + MUE_i = `CLIP_LOW(MUE, 0.0); + STMUE_i = STMUE; + THEMU_i = `CLIP_LOW(THEMU, 0.0); + STTHEMU_i = STTHEMU; + CS_i = `CLIP_LOW(CS, 0.0); + STCS_i = STCS; + XCOR_i = `CLIP_LOW(XCOR, 0.0); + STXCOR_i = STXCOR; + FETA_i = `CLIP_LOW(FETA, 0.0); + RS_i = `CLIP_LOW(RS, 0.0); + STRS_i = STRS; + RSB_i = `CLIP_BOTH(RSB, -0.5, 1.0); + RSG_i = `CLIP_LOW(RSG, -0.5); + THESAT_i = `CLIP_LOW(THESAT, 0.0); + STTHESAT_i = STTHESAT; + THESATB_i = `CLIP_BOTH(THESATB, -0.5, 1.0); + THESATG_i = `CLIP_LOW(THESATG, -0.5); + AX_i = `CLIP_LOW(AX, 2.0); + ALP_i = `CLIP_LOW(ALP, 0.0); + ALP1_i = `CLIP_LOW(ALP1, 0.0); + ALP2_i = `CLIP_LOW(ALP2, 0.0); + VP_i = `CLIP_LOW(VP, 1.0e-10); + A1_i = `CLIP_LOW(A1, 0.0); + A2_i = `CLIP_LOW(A2, 0.0); + STA2_i = STA2; + A3_i = `CLIP_LOW(A3, 0.0); + A4_i = `CLIP_LOW(A4, 0.0); + GCO_i = `CLIP_BOTH(GCO, -10.0, 10.0); + IGINV_i = `CLIP_LOW(IGINV, 0.0); + IGOV_i = `CLIP_LOW(IGOV, 0.0); + STIG_i = STIG; + GC2_i = `CLIP_BOTH(GC2, 0.0, 10.0); + GC3_i = `CLIP_BOTH(GC3, -10.0, 10.0); + CHIB_i = `CLIP_LOW(CHIB, 1.0); + AGIDL_i = `CLIP_LOW(AGIDL, 0.0); + BGIDL_i = `CLIP_LOW(BGIDL, 0.0); + STBGIDL_i = STBGIDL; + CGIDL_i = CGIDL; + COX_i = `CLIP_LOW(COX, 0.0); + CGOV_i = `CLIP_LOW(CGOV, 0.0); + CGBOV_i = `CLIP_LOW(CGBOV, 0.0); + CFR_i = `CLIP_LOW(CFR, 0.0); + FNT_i = `CLIP_LOW(FNT, 0.0); + NFA_i = `CLIP_LOW(NFA, 0.0); + NFB_i = `CLIP_LOW(NFB, 0.0); + NFC_i = `CLIP_LOW(NFC, 0.0); + MULT_i = `CLIP_LOW(MULT, 0.0); + + + // Local process parameters + phit1 = phit * (1.0 + CT_i * rTn); + inv_phit1 = 1.0 / phit1; + + VFB_i = VFB_i + STVFB_i * dT; + phib = Eg + DPHIB_i + 2.0 * phit * ln(NEFF_i * pow(phibFac, -0.75) * 4.0e-26); + phib = `MAX(phib, 5.0E-2); + CoxPrime = `EPSOX / TOX_i; + tox_sq = TOX_i * TOX_i; + G_0 = sqrt(2.0 * `QELE * NEFF_i * `EPSSI * inv_phit) / CoxPrime; + + // Poly-silicon depletion + kp = 0.0; + if (NP_i > 0.0) begin + arg2max = 8.0e7 / tox_sq; + np = `MAX(NP_i, arg2max); + np = `MAX(3.0e25, np); + kp = 2.0 * CoxPrime * CoxPrime * phit / (`QELE * np * `EPSSI); + end + + // QM corrections + qlim2 = 100.0 * phit * phit; + 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 + qb0 = sqrt(phit * G_0 * G_0 * phib); + dphibq = 0.75 * qq * pow(qb0, `twoThirds); + phib = phib + dphibq; + G_0 = G_0 * (1.0 + 2.0 * `twoThirds * dphibq / qb0); + end + sqrt_phib = sqrt(phib); + phix = 0.95 * phib; + aphi = 0.0025 * phib * phib; + bphi = aphi; + phix2 = 0.5 * sqrt(bphi); + phix1 = `MINA(phix - phix2, 0, aphi); + + // Gate overlap + CoxovPrime = `EPSOX / TOXOV_i; + GOV = sqrt(2.0 * `QELE * NOV_i * `EPSSI * inv_phit) / CoxovPrime; + GOV2 = GOV * GOV; + xi_ov = 1.0 + GOV * `invSqrt2; + inv_xi_ov = 1.0 / xi_ov; + x_mrg_ov = 1.0e-5 * xi_ov; + + // Mobility parameters + tf_bet = pow(rTn, STBET_i); + BET_i = BET_i * CoxPrime * tf_bet; + THEMU_i = THEMU_i * pow(rTn, STTHEMU_i); + tf_mue = pow(rTn, STMUE_i); + MUE_i = MUE_i * tf_mue; + tf_cs = pow(rTn, STCS_i); + CS_i = CS_i * tf_cs; + tf_xcor = pow(rTn, STXCOR_i); + XCOR_i = XCOR_i * tf_xcor; + E_eff0 = 1.0e-8 * CoxPrime / `EPSSI; + eta_mu = 0.5 * FETA_i; + if (CHNL_TYPE == `PMOS) begin + eta_mu = `oneThird * FETA_i; + end + + // Series resistance + tf_ther = pow(rTn, STRS_i); + RS_i = RS_i * tf_ther; + THER_i = 2 * BET_i * RS_i; + + // Velocity saturation + tf_thesat = pow(rTn, STTHESAT_i); + THESAT_i = THESAT_i * tf_thesat; + Vdsat_lim = 3.912023005 * phit1; + + inv_AX = 1.0 / AX_i; + inv_VP = 1.0 / VP_i; + + // Impact ionization + A2_i = A2_i * pow(rT, STA2_i); + + // Gate current + tf_ig = pow(rT, STIG_i); + IGINV_i = IGINV_i * tf_ig; + IGOV_i = IGOV_i * tf_ig; + inv_CHIB = 1.0 / CHIB_i; + tempM = 4.0 * `oneThird * sqrt(2 * `QELE * `MELE * CHIB_i) / `HBAR; + BCH = tempM * TOX_i; + BOV = tempM * TOXOV_i; + GCQ = 0; + if (GC3_i < 0) begin + GCQ = -0.495 * GC2_i / GC3_i; + end + alpha_b = 0.5 * (phib + Eg); + Dch = GCO_i * phit1; + Dov = GCO_i * phit; + + // GIDL + AGIDL_i = AGIDL_i * 4e-18 / (TOXOV_i * TOXOV_i); + tempM = `MAX(1.0 + STBGIDL_i * dT, 0); + BGIDL_i = BGIDL_i * tempM * TOXOV_i * 5e8; + + // Noise + nt = FNT_i * 4 * `KBOL * TKD; + Cox_over_q = CoxPrime / `QELE; + Sfl_prefac = phit * phit * BET_i / Cox_over_q; + + // Additional internal parameters + x1 = 1.25; + inv_xg1 = 1.0 / (x1 + GOV * 7.324648775608221e-1); // = 1.0/(x1+GOV*sqrt(exp(-x1)+x1-1)); +`ifdef NQSmodel + + // NQS parameters and variables + MUNQS_i = `CLIP_LOW(MUNQS, 0.0); + RG_i = `CLIP_LOW(RG, 1.0e-6); + RBULK_i = `CLIP_LOW(RBULK, 1.0e-6); + RJUNS_i = `CLIP_LOW(RJUNS, 1.0e-6); + RJUND_i = `CLIP_LOW(RJUND, 1.0e-6); + RWELL_i = `CLIP_LOW(RWELL, 1.0e-6); + + // Conductance of parasitic resistance + ggate = MULT_i / RG_i; + gbulk = MULT_i / RBULK_i; + gjuns = MULT_i / RJUNS_i; + gjund = MULT_i / RJUND_i; + gwell = MULT_i / RWELL_i; +`endif // NQSmodel + + // JUNCAP2 + vbimins = 0.0; + vfmins = 0.0; + vchs = 0.0; + vbbtlims = 0.0; + vbimind = 0.0; + vfmind = 0.0; + vchd = 0.0; + vbbtlimd = 0.0; + vj = 0.0; + idmult = 0.0; + vjsrh = 0.0; + zinv = 0.0; + wdep = 0.0; + wsrh = 0.0; + asrh = 0.0; + vav = 0.0; + vbi_minus_vjsrh = 0.0; + + if (SWJUNCAP == 0.0) 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; + VMAXS = 0.0; + VMAXD = 0.0; + end else begin + if (SWJUNCAP == 2.0) begin + ABSOURCE_i = `CLIP_LOW(AS, `AB_cliplow); + LSSOURCE_i = `CLIP_LOW(PS, `LS_cliplow); + LGSOURCE_i = juncapwidth; + ABDRAIN_i = `CLIP_LOW(AD, `AB_cliplow); + LSDRAIN_i = `CLIP_LOW(PD, `LS_cliplow); + LGDRAIN_i = juncapwidth; + end else begin + if (SWJUNCAP == 3.0) begin + ABSOURCE_i = `CLIP_LOW(AS, `AB_cliplow); + ABDRAIN_i = `CLIP_LOW(AD, `AB_cliplow); + LSSOURCE_i = `CLIP_LOW(PS - juncapwidth, `LS_cliplow); + LGSOURCE_i = juncapwidth; + LSDRAIN_i = `CLIP_LOW(PD - juncapwidth, `LS_cliplow); + LGDRAIN_i = juncapwidth; + end else begin + ABSOURCE_i = `CLIP_LOW(ABSOURCE, `AB_cliplow); + LSSOURCE_i = `CLIP_LOW(LSSOURCE, `LS_cliplow); + LGSOURCE_i = `CLIP_LOW(LGSOURCE, `LG_cliplow); + ABDRAIN_i = `CLIP_LOW(ABDRAIN, `AB_cliplow); + LSDRAIN_i = `CLIP_LOW(LSDRAIN, `LS_cliplow); + LGDRAIN_i = `CLIP_LOW(LGDRAIN, `LG_cliplow); + end + end + `JuncapInitInstance(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, VMAXS, vbimins, vchs, vfmins, vbbtlims) + `JuncapInitInstance(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, VMAXD, vbimind, vchd, vfmind, vbbtlimd) + end + + + end // initializeInstance + + ///////////////////////////////////////////////////////////////////////////// + // + // DC bias dependent quantities (calculations for current contribs) + // + ///////////////////////////////////////////////////////////////////////////// + + begin : evaluateStatic + // Initialisation of some variables + SP_S_x1 = 0.0; + x_s = 0.0; + sqm = 0.0; + alpha = 0.0; + eta_p = 1.0; + xitsb = 0.0; + rhob = 0.0; + GdL = 1.0; + FdL = 1.0; + Gmob = 1.0; + Gmob_dL = 1.0; + Udse = 0.0; + QCLM = 0.0; + thesat1 = 0.0; + Gvsat = 1.0; + xgm = 0.0; + dps = 0.0; + qim = 0.0; + qim1 = 0.0; + H = 1.0; + xs_ov = 0.0; + xd_ov = 0.0; + Vovs = 0.0; + Vovd = 0.0; + Iimpact = 0.0; + mavl = 0.0; + +`ifdef NQSmodel + // Initialization of variables for NQS model + pd = 1.0; + ym = 0.0; + + Vrg = V(G ,GP); + Vrjuns = V(BS,BI); + Vrjund = V(BD,BI); + Vrbulk = V(BP,BI); + Vrwell = V(B ,BI); +`endif // NQSmodel + if (CHNL_TYPE == `NMOS) begin + Vgs = V(`Gint, S); + Vds = V(D, S); + Vsb = V(S, `Bint); + Vjuns = -V(S, `Bjs); + Vjund = -V(D, `Bjd); + end else begin + Vgs = -V(`Gint, S); + Vds = -V(D, S); + Vsb = -V(S, `Bint); + Vjuns = V(S, `Bjs); + Vjund = V(D, `Bjd); + end + + // Source-drain interchange + sigVds = 1.0; + if (Vds < 0.0) begin + sigVds = -1.0; + Vgs = Vgs - Vds; + Vsb = Vsb + Vds; + Vds = -Vds; + end + + Vgd = Vgs - Vds; + Vdb = Vds + Vsb; + Vgb = Vgs + Vsb; + + xgs_ov = -Vgs * inv_phit; + xgd_ov = -Vgd * inv_phit; + + // 4.2.1 Conditioning of terminal voltages + temp = `MINA(Vdb, Vsb, bphi) + phix; + Vsbstar = Vsb - `MINA(temp, 0, aphi) + phix1; + Vdbstar = Vds + Vsbstar; + Vgbstar = Vgs + Vsbstar; + Vgb1 = Vgbstar - VFB_i; + Vdsx = sqrt(Vds * Vds + 0.01) - 0.1; + Vsbx = Vsbstar + 0.5 * (Vds - Vdsx); + delVg = CF_i * Vdsx * (1 + CFB_i * Vsbx); // DIBL + Vgb1 = Vgb1 + delVg; + xg = Vgb1 * inv_phit1; + + // 4.2.2 Bias dependent body factor + if (DNSUB_i > 0.0) begin + Dnsub = DNSUB_i * `MAXA(0, Vgs + Vsb - VNSUB_i, NSLP_i); + Gf = G_0 * sqrt(1.0 + Dnsub); + end else begin + Gf = G_0; + end + + // 4.2.3 Surface potential at source side + Gf2 = Gf * Gf; + inv_Gf2 = 1.0 / Gf2; + 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 = 1e-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 + // + if (xg <= 0.0) begin + qis = 0.0; + Ids = 0.0; + xgm = xg - x_s; + Voxm = xgm * phit1; + qeff = Voxm; + Vdsat = Vdsat_lim; + 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; + Ds = delta_ns * (1.0 / Es - x_s - 1.0 - xi0s); + end else if (x_s > (xn_s - `se05)) begin + delta_1s = exp(x_s - xn_s); + Es = delta_ns / delta_1s; + Ds = delta_1s - delta_ns * (x_s + 1.0 + xi0s); + end else begin + delta_1s = `ke05 / `P3(xn_s - x_s - `se05); + Es = `ke05 / `P3(x_s - `se05); + Ds = delta_1s - delta_ns * (x_s + 1.0 + xi0s); + end + 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; + + // 4.2.4 Drain saturation voltage + Rxcor = (1.0 + 0.2 * XCOR_i * Vsbx) / (1.0 + XCOR_i * 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) begin + rhob = 1.0 / (1.0 - RSB_i * Vsbx); + end else begin + rhob = 1.0 + RSB_i * Vsbx; + end + if (RSG_i < 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); + Mutmp = pow(Eeffm * MUE_i, THEMU_i) + CS_i * Ps / (Ps + Ds + 1.0e-14); + Gmob = (1.0 + Mutmp + GR) * Rxcor; + if (THESATB_i < 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) begin + temp = 1 / (1 - THESATG_i * wsat); + end else begin + temp = 1 + THESATG_i * wsat; + end + thesat1 = THESAT_i * 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 = Gf2 * Ds * phit1 * 0.98 / (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, AX_i); + Vdse = Vds * pow(1.0 + temp, -inv_AX); + + // 4.2.5 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 calulation + // + 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; // deltaPsi + + 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 + + // 4.2.6 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); + + // 4.2.7 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 + Gf * `invSqrt2 * (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); + + // 4.2.7 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); + help = 1.0 - Em + 2.0 * xgm * eta_p * inv_Gf2; + x_ds = x_ds * km * (d0 + D_bar) / (help + 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 + + // 4.2.8 Potential midpoint inversion charge + qim = Gf2 * Dm * phit1 / (xgm + Gf * sqm); + + // 4.2.8 Potential midpoint inversion charge (continued) + qim1 = qim + phit1 * alpha; + qim1_1 = 1.0 / qim1; + qbm = sqm * Gf * phit1; + // Series resistance + if (RSG_i < 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; + Eeffm = E_eff0 * qeff; + Mutmp = pow(Eeffm * MUE_i, THEMU_i) + CS_i * Pm / (Pm + Dm + 1.0e-14); + Gmob = (1.0 + Mutmp + GR) * Rxcor; + + // 4.2.9 Drain-source channel current + // Channel length modulation + r1 = qim * qim1_1; + r2 = phit1 * alpha * qim1_1; + temp = ln((1.0 + (Vds - dps) * inv_VP) / (1.0 + (Vdse - dps) * inv_VP)); + temp1 = ln(1.0 + Vdsx * inv_VP); + dL = ALP_i * temp; + GdL = 1.0 / (1.0 + dL + dL * dL); + dL1 = dL + ALP1_i * qim1_1 * r1 * temp + ALP2_i * qbm * r2 * r2 * temp1; + FdL = (1.0 + dL1 + dL1 * dL1) * GdL; + // Velocity saturation + temp2 = qim * xitsb; + wsat = 100.0 * temp2 / (100.0 + temp2); + Gmob_dL = Gmob * GdL; + if (THESATG_i < 0) begin + temp = 1 / (1 - THESATG_i * wsat); + end else begin + temp = 1 + THESATG_i * wsat; + end + thesat1 = THESAT_i * 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)); + // Drain-source current + Ids = BET_i * FdL * qim1 * dps / Gvsat; + + // 4.2.10 Variables for calculation of intrinsic charges and gate current + Voxm = xgm * phit1; + temp = Gmob_dL / Gvsat; + alpha1 = alpha * (1.0 + 0.5 * zsat * temp * temp); + H = temp * qim1 / alpha1; + + // 4.2.11 Impact-Ionization + if (SWIMPACT != 0) begin + delVsat = Vds - A3_i * dps; + if (delVsat > 0) begin + temp2 = A2_i * (1.0 + A4_i * (sqrt(phib + Vsbstar) - sqrt_phib)) / delVsat; + `expl_low(-temp2, temp) + mavl = A1_i * delVsat * temp; + Iimpact = Ids * mavl; + end + end + end // (xg > 0) + + // 4.2.12 Surface potential in gate overlap regions + if (((SWIGATE != 0) && (IGOV_i > 0)) || ((SWGIDL != 0) && (AGIDL_i > 0)) || (CGOV_i > 0)) begin + `sp_ov(xs_ov, xgs_ov) + `sp_ov(xd_ov, xgd_ov) + Vovs = -phit * (xgs_ov + xs_ov); + Vovd = -phit * (xgd_ov + xd_ov); + end + + // 4.2.13 Gate current + Igsov = 0.0; + Igdov = 0.0; + Igc = 0.0; + Igs = 0.0; + Igd = 0.0; + Igb = 0.0; + Igcs = 0.0; + Igcd = 0.0; + if (SWIGATE != 0) begin + if (IGOV_i > 0) begin + + // Gate-source overlap component of gate current + arg2mina = Vovs + Dov; + psi_t = `MINA(0.0, arg2mina, 0.01); + zg = sqrt(Vovs * Vovs + 1.0e-6) * inv_CHIB; + if (GC3_i < 0) begin + zg = `MINA(zg, GCQ, 1.0e-6); + end + arg1 = (3.0 + xs_ov + psi_t * inv_phit); + `expl(arg1, Dsi) + arg1 = -Vgs * inv_phit; + `expl(arg1, temp) + Dgate = Dsi * temp; + temp = BOV * (-1.5 + zg * (GC2_i + GC3_i * zg)); + if (temp > 0) begin + TP = `P3(temp); + end else begin + `expl_low(temp, TP) + end + Igsov = IGOV_i * TP * ln((1.0 + Dsi) / (1.0 + Dgate)); + + // Gate-drain overlap component of gate current + arg2mina = Vovd + Dov; + psi_t = `MINA(0.0, arg2mina, 0.01); + zg = sqrt(Vovd * Vovd + 1.0e-6) * inv_CHIB; + if (GC3_i < 0) begin + zg = `MINA(zg, GCQ, 1.0e-6); + end + arg1 = (3.0 + xd_ov + psi_t * inv_phit); + `expl(arg1, Dsi) + arg1 = -Vgd * inv_phit; + `expl(arg1, temp) + Dgate = Dsi * temp; + temp = BOV * (-1.5 + zg * (GC2_i + GC3_i * zg)); + if (temp > 0) begin + TP = `P3(temp); + end else begin + `expl_low(temp, TP) + end + Igdov = IGOV_i * TP * ln((1.0 + Dsi) / (1.0 + Dgate)); + end + + // Gate-channel component of gate current + if (IGINV_i > 0) begin + if (xg <= 0.0) begin + temp = pow(Vds / Vdsat_lim, AX_i); + Udse = Vds * pow(1.0 + temp, -inv_AX) * inv_phit1; + end + `expl_low(x_ds-Udse, temp) + Vm = Vsbstar + phit1 * (0.5 * x_ds - ln(0.5 * (1.0 + temp))); + + arg2mina = Voxm + Dch; + psi_t = `MINA(0.0, arg2mina, 0.01); + zg = sqrt(Voxm * Voxm + 1.0e-6) * inv_CHIB; + if (GC3_i < 0) begin + zg = `MINA(zg, GCQ, 1.0e-06); + end + arg1 = (x_m + (psi_t - alpha_b - Vm) * inv_phit1); + `expl(arg1,Dsi) + arg1 = -(Vgs + Vsbstar - 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 <= 0) || ((GC2_i == 0) && (GC3_i == 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 / u0; + u0_div_H = u0 / H; + 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 + xsq * `oneSixth * (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 / sqrt(xg * xg + 1.0e-6)); + Igc = Igc0 * igc * Sg; + Igcd = Igc0 * igcd_h * Sg; + Igcs = Igc - Igcd; + Igb = Igc0 * igc * (1.0 - Sg); + end // (IGINV >0) + Igs = Igsov + Igcs; + Igd = Igdov + Igcd; + end // (SWIGATE != 0) + + // 4.2.14 GIDL/GISL current + Igidl = 0.0; + Igisl = 0.0; + if ((SWGIDL != 0) && (AGIDL_i > 0)) begin + + // GIDL current computation + if (Vovd < 0) begin + Vtovd = sqrt(Vovd * Vovd + CGIDL_i * CGIDL_i * Vdb * Vdb + 1.0e-6); + temp = -BGIDL_i / Vtovd; + `expl_low(temp, temp2) + Igidl = -AGIDL_i * Vdb * Vovd * Vtovd * temp2; + end + + // GISL current computation + if (Vovs < 0) begin + Vtovs = sqrt(Vovs * Vovs + CGIDL_i * CGIDL_i * Vsb * Vsb + 1.0e-6); + temp = -BGIDL_i / Vtovs; + `expl_low(temp, temp2) + Igisl = -AGIDL_i * Vsb * Vovs * Vtovs * temp2; + end + end // (SWGIDL != 0) + + end // evaluateStatic + + + ///////////////////////////////////////////////////////////////////////////// + // + // AC bias dependent quantities (calculations for charge contribs) + // + ///////////////////////////////////////////////////////////////////////////// + + begin : evaluateDynamic + + // 4.2.16 Quantum mechanical corrections + COX_qm = COX_i; + if (qq > 0.0) begin + COX_qm = COX_i / (1.0 + qq * pow(qeff * qeff + qlim2, -1.0 * `oneSixth)); + end + + // 4.2.17 Intrinsic charge model + if (xg <= 0.0) begin + QG = Voxm; + QI = 0.0; + QD = 0.0; + QB = QG; + end else begin + Fj = 0.5 * dps / H; + Fj2 = Fj * Fj; + QCLM = (1.0 - GdL) * (qim - alpha * 0.5 * dps); + QG = Voxm + 0.5 * eta_p * dps * (Fj * GdL * `oneThird - 1.0 + GdL); + temp = alpha * dps * `oneSixth; + QI = GdL * (qim + temp * Fj) + QCLM; + QD = 0.5 * GdL * GdL * (qim - temp * (1.0 - Fj - 0.2 * Fj2)) + 0.5 * QCLM * (1.0 + GdL); + QB = QG - QI; + end + Qg = QG * COX_qm; + Qd = -QD * COX_qm; + Qb = -QB * COX_qm; + + // 4.2.18 Extrinsic charge model + Qgs_ov = CGOV_i * Vovs; + Qgd_ov = CGOV_i * Vovd; + Qgb_ov = CGBOV_i * Vgb; + + // Outer fringe charge + Qfgs = CFR_i * Vgs; + Qfgd = CFR_i * Vgd; +`ifdef NQSmodel + + // Variables for NQS model + Gp = 0.0; + Gp2 = 0.0; + a_factrp = 0.0; + marginp = 0.0; + if (SWNQS_i != 0) begin + if (xg <= 0.0) begin + ym = 0.5; + pd = 1.0; + Gp = Gf; + end else begin + ym = 0.5 * ( 1.0 + 0.25 * dps / H); + pd = xgm / (xg - x_m); + Gp = Gf / pd; + end + Gp2 = Gp * Gp; + a_factrp = 1.0 + Gp * `invSqrt2; + marginp = 1e-5 * a_factrp; + end +`endif // NQSmodel + + end // evaluateDynamic + + + ///////////////////////////////////////////////////////////////////////////// + // + // JUNCAP2 contribs + // + ///////////////////////////////////////////////////////////////////////////// + + begin : evaluateStaticDynamic + + // Source side + VAK = Vjuns; + VMAX = VMAXS; + vbimin = vbimins; + vfmin = vfmins; + vch = vchs; + vbbtlim = vbbtlims; + `juncapcommon(ABSOURCE_i,LSSOURCE_i,LGSOURCE_i,isjunbot,qsjunbot,isjunsti,qsjunsti,isjungat,qsjungat) + + // Drain side + VAK = Vjund; + VMAX = VMAXD; + vbimin = vbimind; + vfmin = vfmind; + vch = vchd; + vbbtlim = vbbtlimd; + `juncapcommon(ABDRAIN_i,LSDRAIN_i,LGDRAIN_i,idjunbot,qdjunbot,idjunsti,qdjunsti,idjungat,qdjungat) + +`ifdef NQSmodel + // Set initial conditions for NQS model + `include "PSP102_InitNQS.include" + +`endif // NQSmodel + end // evaluateStaticDynamic + + + ///////////////////////////////////////////////////////////////////////////// + // + // Current contribs + // + ///////////////////////////////////////////////////////////////////////////// + + begin : loadStatic + + // 4.2.15 Total terminal currents + + // Intrinsic MOSFET current + Idse = MULT_i * Ids; + + // Gate (tunneling) current components + Igbe = MULT_i * Igb; + Igse = MULT_i * Igs; + Igde = MULT_i * Igd; + + // GIDL/GISL current + Igidle = MULT_i * Igidl; + Igisle = MULT_i * Igisl; + + // Impact ionization current + Iimpacte = MULT_i * Iimpact; + + // JUNCAP2 + isjun = MULT_i * (ABSOURCE_i * isjunbot + LSSOURCE_i * isjunsti + LGSOURCE_i * isjungat); + idjun = MULT_i * (ABDRAIN_i * idjunbot + LSDRAIN_i * idjunsti + LGDRAIN_i * idjungat); + + // Convert back for NMOS-PMOS and Source-Drain interchange + if (sigVds > 0) begin + I(D, `Bint) <+ CHNL_TYPE * (Iimpacte + Igidle); + I(D, S) <+ CHNL_TYPE * Idse; + I(`Gint, S) <+ CHNL_TYPE * Igse; + I(`Gint, D) <+ CHNL_TYPE * Igde; + I(S, `Bint) <+ CHNL_TYPE * Igisle; + end else begin + I(S, `Bint) <+ CHNL_TYPE * (Iimpacte + Igidle); + I(S, D) <+ CHNL_TYPE * Idse; + I(`Gint, D) <+ CHNL_TYPE * Igse; + I(`Gint, S) <+ CHNL_TYPE * Igde; + I(D, `Bint) <+ CHNL_TYPE * Igisle; + end + I(`Gint, `Bint) <+ CHNL_TYPE * Igbe; + I(`Bjs, S) <+ CHNL_TYPE * isjun; + I(`Bjd, D) <+ CHNL_TYPE * idjun; +`ifdef NQSmodel + I(G, GP) <+ Vrg * ggate; + I(BP, BI) <+ Vrbulk * gbulk; + I(BS, BI) <+ Vrjuns * gjuns; + I(BD, BI) <+ Vrjund * gjund; + I(B, BI) <+ Vrwell * gwell; +`endif // NQSmodel + + I(D, S) <+ Vds * `GMIN; + + end // loadStatic + + ///////////////////////////////////////////////////////////////////////////// + // + // ddt() contribs from charges (Note: MULT is handled explicitly) + // + ///////////////////////////////////////////////////////////////////////////// + + begin : loadDynamic +`ifdef NQSmodel + + // Calculate NQS charge contributions + `include "PSP102_ChargesNQS.include" +`endif // NQSmodel + + // 4.2.19 Total terminal charges + + // Intrinsic MOSFET charges + Qg = MULT_i * Qg; + Qb = MULT_i * Qb; + Qd = MULT_i * Qd; + Qs = -(Qg + Qb + Qd); + + // Total outerFringe + overlap for + // gate-source and gate-drain. + Qfgs = MULT_i * (Qfgs + Qgs_ov); + Qfgd = MULT_i * (Qfgd + Qgd_ov); + + // Gate-bulk overlap charge + Qgb_ov = MULT_i * Qgb_ov; + + // JUNCAP2 + qsjun = MULT_i * (ABSOURCE_i * qsjunbot + LSSOURCE_i * qsjunsti + LGSOURCE_i * qsjungat); + qdjun = MULT_i * (ABDRAIN_i * qdjunbot + LSDRAIN_i * qdjunsti + LGDRAIN_i * qdjungat); + + // Convert back (undo S-D interchange) + if (sigVds < 0) begin + temp = Qd; // Qd <--> Qs + Qd = Qs; + Qs = temp; + temp = Qfgd; // Qfgd <--> Qfgs + Qfgd = Qfgs; + Qfgs = temp; + end + + I(`Gint, S) <+ CHNL_TYPE * ddt(Qg); + I(`Bint, S) <+ CHNL_TYPE * ddt(Qb); + I(D, S) <+ CHNL_TYPE * ddt(Qd); + I(`Gint, S) <+ CHNL_TYPE * ddt(Qfgs); + I(`Gint, D) <+ CHNL_TYPE * ddt(Qfgd); + I(`Gint, `Bint) <+ CHNL_TYPE * ddt(Qgb_ov); + I(`Bjs, S) <+ CHNL_TYPE * ddt(qsjun); + I(`Bjd, D) <+ CHNL_TYPE * ddt(qdjun); + + end // loadDynamic + + + ///////////////////////////////////////////////////////////////////////////// + // + // Noise + // + ///////////////////////////////////////////////////////////////////////////// + + begin : noise + + // 4.2.20 Noise variable calculation + Sfl = 0.0; + mid = 0.0; + mig = 0.0; + migid = 0.0; + c_igid = 0.0; + CGeff = COX_qm * eta_p; + sqid = 0.0; + sqig = 0.0; + if ((xg > 0.0) && (MULT_i > 0) && (BET_i > 0)) begin + N1 = Cox_over_q * alpha * phit; + Nm1 = Cox_over_q * qim1; + Delta_N1 = Cox_over_q * alpha * dps; + 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 / (Gvsat * N1) * Sfl; + + H0 = qim1 / alpha; + t1 = qim / qim1; + sqt2 = 0.5 * `oneSixth * dps / H0; + t2 = sqt2 * sqt2; + r = H0 / H - 1.0; + lc = `CLIP_LOW(1.0 - 12 * r * t2, 1e-20); + lcinv2 = 1 / (lc * lc); + g_ideal = BET_i * FdL * qim1 / Gvsat; + CGeff = Gvsat * Gvsat * COX_qm * eta_p / (Gmob_dL * Gmob_dL); + mid = t1 + 12 * t2 - 24 * (1.0 + t1) * t2 * r; + mid = `CLIP_LOW(mid, 1e-40); + mid = g_ideal * lcinv2 * mid; + mig = t1 / 12 - t2 * (t1 + 0.2 - 12 * t2) - 1.6 * t2 * (t1 + 1.0 - 12 * t2) * r; + mig = `CLIP_LOW(mig, 1e-40); + mig = lcinv2 / g_ideal * mig; + migid = lcinv2 * sqt2 * (1.0 - 12 * t2 - (t1 + 19.2 * t2 - 12 * t1 * t2) * r); + sqid = sqrt(MULT_i * nt * mid); + sqig = sqrt(MULT_i * nt / mig); + c_igid = (sqid == 0) ? 0.0 : (migid * sqig / sqid); // = migid / sqrt(mig * mid); + c_igid = `CLIP_BOTH(c_igid, 0.0, 1.0); + end + shot_igsx = 2.0 * `QELE * abs(Igse); + shot_igdx = 2.0 * `QELE * abs(Igde); + shot_iavl = 2.0 * `QELE * (mavl + 1) * abs(Iimpacte); + // JUNCAP2 + sjnoisex = 2.0 * `QELE * abs(isjun); + djnoisex = 2.0 * `QELE * abs(idjun); + if (sigVds > 0) begin + shot_igs = shot_igsx; + shot_igd = shot_igdx; + sjnoise = sjnoisex; + djnoise = djnoisex + shot_iavl; + end else begin + shot_igs = shot_igdx; + shot_igd = shot_igsx; + sjnoise = sjnoisex + shot_iavl; + djnoise = djnoisex; + end +`ifdef NQSmodel + rgatenoise = nt0 * ggate; + rbulknoise = nt0 * gbulk; + rjunsnoise = nt0 * gjuns; + rjundnoise = nt0 * gjund; + rwellnoise = nt0 * gwell; +`endif // NQSmodel + + // Important note: + // In Verilog-A, correlated noise sources can only be implemented by using two additional + // internal nodes (NOI and NOI2). When implementing PSP in a circuit simlutor, it is + // generally not necessary to retain these internal nodes and therefore (for execution + // speed reasons) should be avoided. + + // Noise contribs + I(NOI2) <+ V(NOI2); + I(NOI2) <+ white_noise(c_igid); + I(NOII) <+ white_noise(sqig * sqig * (1.0 - c_igid)); + I(NOII) <+ -sqig * V(NOI2); + I(NOIR) <+ V(NOIR); + I(NOIC) <+ ddt(mig * CGeff * V(NOIC)); + I(D,S) <+ flicker_noise(MULT_i * Sfl, 1.0); + I(D,S) <+ white_noise(sqid * sqid * (1.0 - c_igid)); + I(D,S) <+ sqid * V(NOI2); + I(`Gint,S)<+ 0.5 * (1.0 + sigVds) * ddt(mig * CGeff * V(NOIC)); + I(`Gint,D)<+ 0.5 * (1.0 - sigVds) * ddt(mig * CGeff * V(NOIC)); + I(`Gint,S)<+ white_noise(shot_igs); + I(`Gint,D)<+ white_noise(shot_igd); + // JUNCAP2 + I(`Bjs,S) <+ white_noise(sjnoise, "shot"); + I(`Bjd,D) <+ white_noise(djnoise, "shot"); +`ifdef NQSmodel + // Parasitic resistances + I(GP,G) <+ white_noise(rgatenoise); + I(BP,BI) <+ white_noise(rbulknoise); + I(BS,BI) <+ white_noise(rjunsnoise); + I(BD,BI) <+ white_noise(rjundnoise); + I(B ,BI) <+ white_noise(rwellnoise); +`endif // NQSmodel + end // noise + + +`ifdef insideADMS // OPinfo + ///////////////////////////////////////////////////////////////////////////// + // + // Operating point info + // + ///////////////////////////////////////////////////////////////////////////// + + begin : OPinfo + + // The output variables defined below are currently not available in + // Verilog-A, but only in the SiMKit-C-code which was generated from + // this source. Similar functionality will be available in Verilog-A + // from Verilog-A version 2.2 onwards. However, a different syntax is + // to be used (see Verilog AMS language reference manual, version 2.2, + // november 2004, Accellera). + + // Auxiliary variables + id_op = Idse + Iimpacte + Igidle - Igde; + is = -Idse + Igisle - Igse; + ig = Igse + Igde + Igbe; + ib = -Iimpacte - Igbe - Igidle - Igisle; + + P_D = 1 + 0.25 * Gf * kp; + facvsb0 = phib + 2 * phit1; + facvsb = Vsbstar + facvsb0; + sig1k = 2 * `PI * 1000 * CGeff; + sig1k = sig1k * sig1k * mig; + + + //////////////////////////////////////////////////////////////////////////////////// + // + // Actual operation point output variables + // + //////////////////////////////////////////////////////////////////////////////////// + + // Note: In this section (and ONLY in this section) `drain' always refers to + // the highest-potential end of the channel. Therefore, care has to be + // taken for derivatives w.r.t. terminal voltages when sigVds == -1. + + sdint = sigVds; + ctype = CHNL_TYPE; + + if (sigVds < 0) begin + // All variables in the actual model refering to junctions are + // not subject to SD-interchange. In the OP-output variables, + // SD-interchange is also done for the junctions, so that's + // what is happening here. Similar precautions have to be taken + // for those variables that are derivatives w.r.t. voltage branches + ise = is - idjun; + ige = ig; + ide = id_op - isjun; + ibe = ib + isjun + idjun; + ids = Idse; + idb = Iimpacte + Igidle - isjun; + isb = Igisle - idjun; + igs = Igse; + igd = Igde; + igb = Igbe; + igcs = MULT_i * Igcs; + igcd = MULT_i * Igcd; + iavl = Iimpacte; + igisl = Igisle; + igidl = Igidle; + + ijsbot = MULT_i * ABDRAIN_i * idjunbot; + ijsgat = MULT_i * LGDRAIN_i * idjungat; + ijssti = MULT_i * LSDRAIN_i * idjunsti; + ijs = ijsbot + ijsgat + ijssti; + ijdbot = MULT_i * ABSOURCE_i * isjunbot; + ijdgat = MULT_i * LGSOURCE_i * isjungat; + ijdsti = MULT_i * LSSOURCE_i * isjunsti; + ijd = ijdbot + ijdgat + ijdsti; + + vds = Vds; + vgs = Vgs; + vsb = Vsb; + vto = VFB_i + P_D * facvsb0 + Gf * sqrt(phit1 * facvsb0); + vts = VFB_i + P_D * facvsb - Vsbstar + Gf * sqrt(phit1 * facvsb ); + vth = vts - delVg; + vgt = vgs - vth; + vdss = Vdsat; + vsat = Vds - vdss; + + temp = Idse + Iimpacte + Igidle - Igde - isjun; // Total drain-current + gm = CHNL_TYPE * ddx(temp, V(`Gint, S)); + gmb = -CHNL_TYPE * ddx(temp, V(S, `Bint)); + gds = -CHNL_TYPE * ddx(temp, V(D, S)) - (gm + gmb); + + gjs = -ddx(idjun, V(D, `Bjd)); + gjd = -ddx(isjun, V(S, `Bjs)); + + css = CHNL_TYPE * ddx(Qd, V(D, S)); + csg = -CHNL_TYPE * ddx(Qd, V(`Gint, S)); + csb = CHNL_TYPE * ddx(Qd, V(S, `Bint)); + csd = css - csg - csb; + cgs = -CHNL_TYPE * ddx(Qg, V(D, S)); + cgg = CHNL_TYPE * ddx(Qg, V(`Gint, S)); + cgb = CHNL_TYPE * ddx(Qg, V(S, `Bint)); + cgd = cgg - cgs - cgb; + cds = -CHNL_TYPE * ddx(Qs, V(D, S)); + cdg = -CHNL_TYPE * ddx(Qs, V(`Gint, S)); + cdb = CHNL_TYPE * ddx(Qs, V(S, `Bint)); + cdd = cdg + cds + cdb; + cbs = -CHNL_TYPE * ddx(Qb, V(D, S)); + cbg = -CHNL_TYPE * ddx(Qb, V(`Gint, S)); + cbb = -CHNL_TYPE * ddx(Qb, V(S, `Bint)); + cbd = cbb - cbs - cbg; + cgsol = -CHNL_TYPE * ddx(Qfgd, V(D, S)); + cgdol = CHNL_TYPE * ddx(Qfgs, V(`Gint, S)); + + cjsbot = -MULT_i * CHNL_TYPE * ABDRAIN_i * ddx(qdjunbot, V(D, `Bjd)); + cjsgat = -MULT_i * CHNL_TYPE * LGDRAIN_i * ddx(qdjungat, V(D, `Bjd)); + cjssti = -MULT_i * CHNL_TYPE * LSDRAIN_i * ddx(qdjunsti, V(D, `Bjd)); + cjs = cjsbot + cjsgat + cjssti; + cjdbot = -MULT_i * CHNL_TYPE * ABSOURCE_i * ddx(qsjunbot, V(S, `Bjs)); + cjdgat = -MULT_i * CHNL_TYPE * LGSOURCE_i * ddx(qsjungat, V(S, `Bjs)); + cjdsti = -MULT_i * CHNL_TYPE * LSSOURCE_i * ddx(qsjunsti, V(S, `Bjs)); + cjd = cjdbot + cjdgat + cjdsti; + end else begin + ise = is - isjun; + ige = ig; + ide = id_op - idjun; + ibe = ib + isjun + idjun; + ids = Idse; + idb = Iimpacte + Igidle - idjun; + isb = Igisle - isjun; + igs = Igse; + igd = Igde; + igb = Igbe; + igcs = MULT_i * Igcs; + igcd = MULT_i * Igcd; + iavl = Iimpacte; + igisl = Igisle; + igidl = Igidle; + + ijsbot = MULT_i * ABSOURCE_i * isjunbot; + ijsgat = MULT_i * LGSOURCE_i * isjungat; + ijssti = MULT_i * LSSOURCE_i * isjunsti; + ijs = ijsbot + ijsgat + ijssti; + ijdbot = MULT_i * ABDRAIN_i * idjunbot; + ijdgat = MULT_i * LGDRAIN_i * idjungat; + ijdsti = MULT_i * LSDRAIN_i * idjunsti; + ijd = ijdbot + ijdgat + ijdsti; + + vds = Vds; + vgs = Vgs; + vsb = Vsb; + vto = VFB_i + P_D * facvsb0 + Gf * sqrt(phit1 * facvsb0); + vts = VFB_i + P_D * facvsb - Vsbstar + Gf * sqrt(phit1 * facvsb ); + vth = vts - delVg; + vgt = vgs - vth; + vdss = Vdsat; + vsat = Vds - vdss; + + temp = Idse + Iimpacte + Igidle - Igde - idjun; + gm = CHNL_TYPE * ddx(temp, V(`Gint, S)); + gmb = -CHNL_TYPE * ddx(temp, V(S, `Bint)); + gds = CHNL_TYPE * ddx(temp, V(D, S)); + + gjs = -ddx(isjun, V(S, `Bjs)); + gjd = -ddx(idjun, V(D, `Bjd)); + + cdd = CHNL_TYPE * ddx(Qd, V(D, S)); + cdg = -CHNL_TYPE * ddx(Qd, V(`Gint, S)); + cdb = CHNL_TYPE * ddx(Qd, V(S, `Bint)); + cds = cdd - cdg - cdb; + cgd = -CHNL_TYPE * ddx(Qg, V(D, S)); + cgg = CHNL_TYPE * ddx(Qg, V(`Gint, S)); + cgb = CHNL_TYPE * ddx(Qg, V(S, `Bint)); + cgs = cgg - cgd - cgb; + csd = -CHNL_TYPE * ddx(Qs, V(D, S)); + csg = -CHNL_TYPE * ddx(Qs, V(`Gint, S)); + csb = CHNL_TYPE * ddx(Qs, V(S, `Bint)); + css = csg + csd + csb; + cbd = -CHNL_TYPE * ddx(Qb, V(D, S)); + cbg = -CHNL_TYPE * ddx(Qb, V(`Gint, S)); + cbb = -CHNL_TYPE * ddx(Qb, V(S, `Bint)); + cbs = cbb - cbd - cbg; + cgsol = CHNL_TYPE * ddx(Qfgs, V(`Gint, S)); + cgdol = -CHNL_TYPE * ddx(Qfgd, V(D, S)); + + cjsbot = -MULT_i * CHNL_TYPE * ABSOURCE_i * ddx(qsjunbot, V(S, `Bjs)); + cjsgat = -MULT_i * CHNL_TYPE * LGSOURCE_i * ddx(qsjungat, V(S, `Bjs)); + cjssti = -MULT_i * CHNL_TYPE * LSSOURCE_i * ddx(qsjunsti, V(S, `Bjs)); + cjs = cjsbot + cjsgat + cjssti; + cjdbot = -MULT_i * CHNL_TYPE * ABDRAIN_i * ddx(qdjunbot, V(D, `Bjd)); + cjdgat = -MULT_i * CHNL_TYPE * LGDRAIN_i * ddx(qdjungat, V(D, `Bjd)); + cjdsti = -MULT_i * CHNL_TYPE * LSDRAIN_i * ddx(qdjunsti, V(D, `Bjd)); + cjd = cjdbot + cjdgat + cjdsti; + end +`ifdef LocalModel + weff = 0; + leff = 0; +`else + weff = WE; + leff = LE; +`endif + u = (abs(gds) < 1e-18) ? 0 : (gm / gds); + rout = (abs(gds) < 1e-18) ? 0 : (1.0 / gds); + vearly = (abs(gds) < 1e-18) ? 0 : (ide / gds); + beff = (abs(vgt) < 1e-12) ? 0 : (2 * abs(ide) / (vgt * vgt)); + fug = (abs(cgg + cgsol + cgdol) < 1e-30) ? 0.0 : gm / (2 * `PI * (cgg + cgsol + cgdol)); + + sfl = Sfl; + sqrtsff = (abs(gm) < 1e-18) ? 0 : (sqrt(MULT_i * Sfl / 1000) / gm); + sqrtsfw = (abs(gm) < 1e-18) ? 0 : (sqid / gm); + sid = sqid * sqid; + sig = MULT_i * nt * sig1k / (1 + sig1k * mig); + cigid = c_igid; + fknee = (sid == 0) ? 0 : Sfl / sid; + sigs = shot_igsx; + sigd = shot_igdx; + siavl = shot_iavl; + if (sigVds < 0) begin + ssi = djnoisex; + sdi = sjnoisex; + end else begin + ssi = sjnoisex; + sdi = djnoisex; + end + end // OPinfo +`endif // OPinfo + + end // analogBlock diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_nqs_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_nqs_macrodefs.include new file mode 100644 index 000000000..59b43072f --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/PSP102_nqs_macrodefs.include @@ -0,0 +1,117 @@ +//====================================================================================== +//====================================================================================== +// Filename: PSP102_nqs_macrodefs.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors +// +// +// Version: 102.1, October 2006 (Simkit 2.4) +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file readme.txt +// + +////////////////////////////////////////// +// +// Macros used in PSP-NQS +// +////////////////////////////////////////// + +// Function to calculate bulk charge from surface potential +`define PhiToQb(phi,Qb_tmp) \ +if (abs(phi) <= margin) \ + Qb_tmp = -0.70710678 * phi * Gf * (1.0 - `oneSixth * phi * (1.0 - `oneSixth * phi)); \ +else begin \ + `expl((-phi), temp) \ + Qb_tmp = Gf * sqrt(temp + phi - 1.0); \ + if (phi > margin) \ + Qb_tmp = -Qb_tmp; \ +end + + +// Function used in fq-macro +`define PhiTod2Qis(xphi,d2Qis) \ +if (abs(xphi) <= margin) begin \ + Qb_tmp = -0.70710678 * xphi * Gf * (1.0 - `oneSixth * xphi * (1.0 - `oneSixth * xphi)); \ + dQbs = -0.70710678 * Gf * (1.0 - `oneThird * xphi * (1.0 - 0.25 * xphi)); \ + d2Qis = -0.235702 * Gf * (1.0 - 0.5 * xphi); \ +end else begin \ + `expl((-xphi),temp) \ + Qb_tmp = Gf * sqrt(temp + xphi - 1.0); \ + if (xphi > margin) \ + Qb_tmp = -Qb_tmp; \ + dQbs = 0.5 * Gf2 * (1.0 - temp) / Qb_tmp; \ + d2Qis = (dQbs * dQbs - 0.5 * Gf * Gf) / 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 = thesat2 * dpsy2; \ + if (CHNL_TYPE == `PMOS) \ + zsat = zsat / (1.0 + thesat1 * dps); \ + temp = sqrt(1.0 + 2.0 * zsat); \ + Fvsat = 2.0 / (1.0 + temp); \ + temp1 = d2Qy - dpsy2 * d2Qis; \ + fk = Fvsat * (fk0 - zsat * fQi * temp1 * Fvsat / temp); + + +// Interpolation of surface potential along channel +`define Phiy(y) \ + x_m + H * (1.0 - sqrt(1.0 - 2.0 * dps / H * ((y) - ym))) * inv_phit1 diff --git a/src/spicelib/devices/adms/psp102/admsva/SIMKIT_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/SIMKIT_macrodefs.include new file mode 100644 index 000000000..66b7165af --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/SIMKIT_macrodefs.include @@ -0,0 +1,121 @@ +//====================================================================================== +//====================================================================================== +// Filename: SIMKIT_macrodefs.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors +// +// +// Version: 102.1, October 2006 (Simkit 2.4) +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file readme.txt +// + +////////////////////////////////////////////////////////////// +// +// General macros and constants for compact va-models +// +////////////////////////////////////////////////////////////// + +`define VERS "0.0" +`define VREV "0.0" +`define VERSreal 0.0 +`define VREVreal 0.0 + +`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)) + + // Note 1: In this va-code, the `P-macro is defined such that its argument + // is ignored during compilation; in this source code it acts as + // a comment + // Note 2: In this va-code, the "from" keyword in the parameter + // list is not used. Silent clipping is used instead. One could enable + // the Verilog-A range checking by redefining the `from-macro below. + `define P(txt) + `define AT_MODEL + `define AT_INSTANCE + `define AT_NOISE + `define from(lower,upper) +// `define from(lower,upper) from[lower:upper] + +// Some 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 EPSSI 1.045E-10 + +// 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 + +///////////////////////////////////////////////////////////////////////////// +// +// Macro definitions. +// +// Note that because variables in macros are not locally scoped, +// the intermediate variables used in the macros below must be +// explicitly declared in the main code. +// +///////////////////////////////////////////////////////////////////////////// + + +// 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), to avoid overflows +// and underflows and retain C-3 continuity +`define expl(x, res) \ +if (abs(x) < `se05) begin\ + res = exp(x); \ +end else begin \ + if ((x) < -`se05) 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 + +`define swap(a, b) \ +temp = a; \ +a = b; \ +b = temp; diff --git a/src/spicelib/devices/adms/psp102/admsva/psp102.va b/src/spicelib/devices/adms/psp102/admsva/psp102.va new file mode 100644 index 000000000..fc1544715 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/psp102.va @@ -0,0 +1,48 @@ +//====================================================================================== +//====================================================================================== +// Filename: psp102.va +//====================================================================================== +//====================================================================================== +// +// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors +// +// +// Version: 102.1, October 2006 (Simkit 2.4) +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file readme.txt +// + +`include "discipline.h" + +`include "SIMKIT_macrodefs.include" + +`include "JUNCAP200_macrodefs.include" + +`include "PSP102_macrodefs.include" + + +///////////////////////////////////////////////////////////////////////////// +// +// PSP global model code +// +///////////////////////////////////////////////////////////////////////////// + +// `undef LocalModel +// `define Binning + +module psp102(D, G, S, B) + +`P( + info = "PSP MOSFET Model" + version = `VERS + revision = `VREV + simkit:name = "psp1020" + simkit:desc = "psp_1020" +); + +`include "PSP102_module.include" + +endmodule diff --git a/src/spicelib/devices/adms/psp102/admsva/readme.txt b/src/spicelib/devices/adms/psp102/admsva/readme.txt new file mode 100644 index 000000000..16c7ca798 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/readme.txt @@ -0,0 +1,118 @@ +====================================================================================== +====================================================================================== + + --------------------------- + Verilog-A definition of PSP + --------------------------- + + + (c) Copyright 2006, All Rights Reserved, NXP Semiconductors + + + Version: PSP 102.1 (including JUNCAP2 200.2), October 2006 (Simkit 2.4) + +====================================================================================== +====================================================================================== + + Authors: G.D.J. Smit, A.J. Scholten, and D.B.M. Klaassen (NXP Semiconductors Research) + R. van Langevelde (Philips Research) + G. Gildenblat, X. Li, and W. Wu (The Arizona State University) + + + +The most recent version of the model code, the documentation, and contact information +can be found on: + + http://PSPmodel.asu.edu/ +or + http://www.nxp.com/Philips_Models/ + +====================================================================================== +====================================================================================== + +This package consists of several files: + + - readme.txt This file + + - psp102.va Main file for global ("geometrical") model + - psp102b.va Main file for global binning model + - psp102e.va Main file for local ("electrical") model + - psp102_nqs.va Main file for global ("geometrical") model with NQS-effects + - psp102b_nqs.va Main file for global binning model with NQS-effects + - psp102e_nqs.va Main file for local ("electrical") model with NQS-effects + - juncap200.va Main file for JUNCAP2 stand-alone model + + - SIMKIT_macrodefs.include Common macro definitions + - PSP102_macrodefs.include Macro definitions for PSP + - PSP102_module.include Actual model code for intrinsic MOS model + - PSP102_binning.include Geometry scaling equation for binning + - PSP102_binpars.include Parameterlist for global PSP binning model + - PSP102_nqs_macrodefs.include Macro definitions for PSP-NQS + - PSP102_InitNQS.include PSP-NQS initialization code + - PSP102_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 seven .va-files +(psp102.va, psp102b.va, psp102e.va, psp102_nqs.va, psp102b_nqs.va, psp102e_nqs.va, and +juncap200.va). The module names are "PSP102VA" and "PSPNQS102VA" for the global PSP-model +(QS and NQS, respectively), and similarly "PSP102BVA" and "PSPNQS102BVA" for the binning +PSP-model, "PSP102EVA" and "PSPNQS102EVA" for the local PSP-model, and "JUNCAP200" for +the JUNCAP2-model. + + +====================================================================================== +====================================================================================== + +Release notes va-code of PSP 102.1, including JUNCAP2 200.2 (October 2006) +-------------------------------------------------------------------------- + +PSP 102.1 is backwards compatible with the previous version, PSP 102.0, and +resolves some minor implementation issues and bugs. Next to the existing +verilog-A implementation, a test version of the NQS model is now available +in the SiMKit. + +- Added clipping boundaries for SWNQS. +- Removed several "empty statements". +- Resolved SpectreRF hidden state problem +- Solved minor bugs in stress model +- Solved minor bug in juncap model +- Changed the NQS-module names in the verilog-A code +- Made some implementation changes for optimization and maintenance purposes + * Introduced verilog-macro for nodes G/GP, B/BP, B/BS, and B/BD + * Make drain junction voltage equal to V(D, B) instead of V(D, S) + V(S, B) + * Extra intermediate variables for parasitic resistor noise densities + * Modified implementation of NQS-model + +====================================================================================== +====================================================================================== + +The functionality of the Verilog-A code in this package is the same as that of the +C-code, which is contained in SIMKIT version 2.4. Note that Operating Point information +is available only in the C-code, not in Verilog-A code. + + +The PSP-NQS model is provided as Verilog-A code. In SiMKit 2.4, for the first time a +test version of the PSP-NQS model is included. This implementation circumvents the +of the SpectreVerilog-A-generated C-code being too large to compile. Moreover, it is +computationally more efficient as it uses less rows in the simulator matrix. On the +other hand, this implementation has some known limitations. More information is +available from the authors. Further improvements are expected in future releases. + + +This Verilog-A code of PSP is primarily intended as a source for C-code generation +using ADMS. Most of the testing has been done on the C-code which was generated from it. + + +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 his useful comments on the Verilog-A +code.