Browse Source

new version 102.1

pre-master-46
dwarning 19 years ago
parent
commit
2958b19aa4
  1. 4
      src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include
  2. 38
      src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include
  3. 4
      src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include
  4. 4
      src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist.include
  5. 22
      src/spicelib/devices/adms/psp102/admsva/PSP102_ChargesNQS.include
  6. 4
      src/spicelib/devices/adms/psp102/admsva/PSP102_InitNQS.include
  7. 4
      src/spicelib/devices/adms/psp102/admsva/PSP102_binning.include
  8. 4
      src/spicelib/devices/adms/psp102/admsva/PSP102_binpars.include
  9. 46
      src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include
  10. 164
      src/spicelib/devices/adms/psp102/admsva/PSP102_module.include
  11. 4
      src/spicelib/devices/adms/psp102/admsva/PSP102_nqs_macrodefs.include
  12. 8
      src/spicelib/devices/adms/psp102/admsva/SIMKIT_macrodefs.include
  13. 4
      src/spicelib/devices/adms/psp102/admsva/psp102.va
  14. 60
      src/spicelib/devices/adms/psp102/admsva/readme.txt

4
src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include

@ -4,10 +4,10 @@
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
// //
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
// //
// //
// Version: 102.1 (PSP), 200.2 (JUNCAP), October 2006 (Simkit 2.4)
// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5)
// //
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================

38
src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include

@ -4,10 +4,10 @@
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
// //
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
// //
// //
// Version: 102.1 (PSP), 200.2 (JUNCAP), October 2006 (Simkit 2.4)
// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5)
// //
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
@ -149,7 +149,7 @@ h2d = (x) + (eps) * h2; \
h3 = (x0) + h2d; \ h3 = (x0) + h2d; \
h4 = (x0) - h2d; \ h4 = (x0) - h2d; \
h5 = sqrt(h4 * h4 + h1); \ h5 = sqrt(h4 * h4 + h1); \
hyp5 = 2.0 * (x) * (x0) / (h3 + h5);
hyp5 = 2.0 * ((x) * (x0) / (h3 + h5));
// A special function used to calculate TAT-currents, // A special function used to calculate TAT-currents,
@ -163,12 +163,12 @@ end else begin \
terfc = 1 / (1 - perfc * y); \ terfc = 1 / (1 - perfc * y); \
end \ end \
`expl_low(-ysq + m, tmp) \ `expl_low(-ysq + m, tmp) \
erfcpos = (`aerfc * terfc + berfc * terfc * terfc + cerfc * terfc * terfc * terfc) * tmp; \
erfcpos = (`aerfc * terfc + berfc * (terfc * terfc) + cerfc * (terfc * terfc * terfc)) * tmp; \
if (y > 0) begin \ if (y > 0) begin \
result = erfcpos; \ result = erfcpos; \
end else begin\ end else begin\
`expl_low(m, tmp) \ `expl_low(m, tmp) \
result = 2* tmp - erfcpos; \
result = 2 * tmp - erfcpos; \
end end
@ -192,35 +192,35 @@ end else begin \
wsrh = wsrhstep + dwsrh; \ wsrh = wsrhstep + dwsrh; \
`mypower(vbi_minus_vjsrh * VBIRinv, P, tmp) \ `mypower(vbi_minus_vjsrh * VBIRinv, P, tmp) \
wdep = wdepnulr * tmp; \ wdep = wdepnulr * tmp; \
asrh = ftd * (zinv - 1) * wdep; \
isrh = CSRH * asrh * wsrh; \
asrh = ftd * ((zinv - 1) * wdep); \
isrh = CSRH * (asrh * wsrh); \
end \ end \
if (CTAT == 0) begin \ if (CTAT == 0) begin \
itat = 0; \ itat = 0; \
end else begin \ end else begin \
btat = btatpart * (wdep * one_minus_P) / vbi_minus_vjsrh; \
twoatatoverthreebtat = `twothirds * atat / btat; \
btat = btatpart * ((wdep * one_minus_P) / vbi_minus_vjsrh); \
twoatatoverthreebtat = (`twothirds * atat) / btat; \
umaxbeforelimiting = twoatatoverthreebtat * twoatatoverthreebtat; \ umaxbeforelimiting = twoatatoverthreebtat * twoatatoverthreebtat; \
umax = sqrt(umaxbeforelimiting * umaxbeforelimiting / (umaxbeforelimiting * umaxbeforelimiting + 1)); \ umax = sqrt(umaxbeforelimiting * umaxbeforelimiting / (umaxbeforelimiting * umaxbeforelimiting + 1)); \
sqrtumax = sqrt(abs(umax)); \ sqrtumax = sqrt(abs(umax)); \
umaxpoweronepointfive = umax * sqrtumax; \ umaxpoweronepointfive = umax * sqrtumax; \
`mypower2((1 + btat * umaxpoweronepointfive), (-P * one_over_one_minus_P), wgamma) \ `mypower2((1 + btat * umaxpoweronepointfive), (-P * one_over_one_minus_P), wgamma) \
wtat = wsrh * wgamma / (wsrh + 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; \
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; \ xerfc = (ltat - 1) * ktat; \
`calcerfcexpmtat(xerfc, mtat, erfctimesexpmtat) \ `calcerfcexpmtat(xerfc, mtat, erfctimesexpmtat) \
gammamax = atat * erfctimesexpmtat * `SQRTPI / (2 * ktat); \
itat = CTAT * asrh * gammamax * wtat; \
gammamax = `SQRTPI * 0.5 * (atat * erfctimesexpmtat / ktat); \
itat = CTAT * (asrh * gammamax * wtat); \
end \ end \
if (CBBT == 0) begin \ if (CBBT == 0) begin \
ibbt = 0; \ ibbt = 0; \
end else begin \ end else begin \
`mypower(((VBIR - vbbt) * VBIRinv), P, tmp) \ `mypower(((VBIR - vbbt) * VBIRinv), P, tmp) \
Fmaxr = (VBIR - vbbt) * one_over_one_minus_P * wdepnulrinv / tmp; \
Fmaxr = one_over_one_minus_P * ((VBIR - vbbt) * wdepnulrinv / tmp); \
`expl(-fbbt / Fmaxr, tmp) \ `expl(-fbbt / Fmaxr, tmp) \
ibbt = CBBT * VAK * Fmaxr * Fmaxr * tmp; \
ibbt = CBBT * (VAK * Fmaxr * Fmaxr * tmp); \
end \ end \
if (VBR > `vbrmax) begin \ if (VBR > `vbrmax) begin \
fbreakdown = 1; \ fbreakdown = 1; \
@ -246,7 +246,7 @@ two_psistar = 0.0; \
if ( !( ((AB_i) == 0) && ((LS_i) == 0) && ((LG_i) == 0) ) ) begin \ if ( !( ((AB_i) == 0) && ((LS_i) == 0) && ((LG_i) == 0) ) ) begin \
`hypfunction5(VAK, vfmin, vch, vj) \ `hypfunction5(VAK, vfmin, vch, vj) \
if (VAK < VMAX) begin \ if (VAK < VMAX) begin \
`expl(0.5 * VAK * phitdinv, zinv) \
`expl(0.5 * (VAK * phitdinv), zinv) \
idmult = zinv * zinv; \ idmult = zinv * zinv; \
end else begin \ end else begin \
`expl(VMAX * phitdinv, exp_VMAX_over_phitd) \ `expl(VMAX * phitdinv, exp_VMAX_over_phitd) \
@ -256,9 +256,9 @@ if ( !( ((AB_i) == 0) && ((LS_i) == 0) && ((LG_i) == 0) ) ) begin \
idmult = idmult - 1.0; \ idmult = idmult - 1.0; \
z = 1 / zinv; \ z = 1 / zinv; \
if (VAK > 0) begin \ if (VAK > 0) begin \
two_psistar = 2.0 * phitd * ln(2.0 + z + sqrt((z + 1.0) * (z + 3.0))); \
two_psistar = 2.0 * (phitd * ln(2.0 + z + sqrt((z + 1.0) * (z + 3.0)))); \
end else begin \ end else begin \
two_psistar = -VAK + 2.0 * phitd * ln(2 * zinv + 1 + sqrt((1 + zinv) * (1 + 3 * zinv))); \
two_psistar = -VAK + 2.0 * (phitd * ln(2 * zinv + 1 + sqrt((1 + zinv) * (1 + 3 * zinv)))); \
end \ end \
vjlim = vbimin - two_psistar; \ vjlim = vbimin - two_psistar; \
`hypfunction2(VAK, vjlim, phitd, vjsrh) \ `hypfunction2(VAK, vjlim, phitd, vjsrh) \

4
src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include

@ -4,10 +4,10 @@
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
// //
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
// //
// //
// Version: 102.1 (PSP), 200.2 (JUNCAP), October 2006 (Simkit 2.4)
// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5)
// //
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================

4
src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist.include

@ -4,10 +4,10 @@
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
// //
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
// //
// //
// Version: 102.1 (PSP), 200.2 (JUNCAP), October 2006 (Simkit 2.4)
// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5)
// //
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================

22
src/spicelib/devices/adms/psp102/admsva/PSP102_ChargesNQS.include

@ -4,10 +4,10 @@
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
// //
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
// //
// //
// Version: 102.1, October 2006 (Simkit 2.4)
// Version: 102.1, April 2007 (Simkit 2.5)
// //
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
@ -283,21 +283,21 @@
// Update internal nodes // Update internal nodes
V(RES1) <+ vnorm_inv * I(RES1) * r_nqs; V(RES1) <+ vnorm_inv * I(RES1) * r_nqs;
V(SPLINE1) <+ vnorm_inv * idt(-Tnorm * fk1, Qp1_0);
V(SPLINE1) <+ idt(-vnorm_inv * Tnorm * fk1, Qp1_0);
V(RES2) <+ vnorm_inv * I(RES2) * r_nqs; V(RES2) <+ vnorm_inv * I(RES2) * r_nqs;
V(SPLINE2) <+ vnorm_inv * idt(-Tnorm * fk2, Qp2_0);
V(SPLINE2) <+ idt(-vnorm_inv * Tnorm * fk2, Qp2_0);
V(RES3) <+ vnorm_inv * I(RES3) * r_nqs; V(RES3) <+ vnorm_inv * I(RES3) * r_nqs;
V(SPLINE3) <+ vnorm_inv * idt(-Tnorm * fk3, Qp3_0);
V(SPLINE3) <+ idt(-vnorm_inv * Tnorm * fk3, Qp3_0);
V(RES4) <+ vnorm_inv * I(RES4) * r_nqs; V(RES4) <+ vnorm_inv * I(RES4) * r_nqs;
V(SPLINE4) <+ vnorm_inv * idt(-Tnorm * fk4, Qp4_0);
V(SPLINE4) <+ idt(-vnorm_inv * Tnorm * fk4, Qp4_0);
V(RES5) <+ vnorm_inv * I(RES5) * r_nqs; V(RES5) <+ vnorm_inv * I(RES5) * r_nqs;
V(SPLINE5) <+ vnorm_inv * idt(-Tnorm * fk5, Qp5_0);
V(SPLINE5) <+ idt(-vnorm_inv * Tnorm * fk5, Qp5_0);
V(RES6) <+ vnorm_inv * I(RES6) * r_nqs; V(RES6) <+ vnorm_inv * I(RES6) * r_nqs;
V(SPLINE6) <+ vnorm_inv * idt(-Tnorm * fk6, Qp6_0);
V(SPLINE6) <+ idt(-vnorm_inv * Tnorm * fk6, Qp6_0);
V(RES7) <+ vnorm_inv * I(RES7) * r_nqs; V(RES7) <+ vnorm_inv * I(RES7) * r_nqs;
V(SPLINE7) <+ vnorm_inv * idt(-Tnorm * fk7, Qp7_0);
V(SPLINE7) <+ idt(-vnorm_inv * Tnorm * fk7, Qp7_0);
V(RES8) <+ vnorm_inv * I(RES8) * r_nqs; V(RES8) <+ vnorm_inv * I(RES8) * r_nqs;
V(SPLINE8) <+ vnorm_inv * idt(-Tnorm * fk8, Qp8_0);
V(SPLINE8) <+ idt(-vnorm_inv * Tnorm * fk8, Qp8_0);
V(RES9) <+ vnorm_inv * I(RES9) * r_nqs; V(RES9) <+ vnorm_inv * I(RES9) * r_nqs;
V(SPLINE9) <+ vnorm_inv * idt(-Tnorm * fk9, Qp9_0);
V(SPLINE9) <+ idt(-vnorm_inv * Tnorm * fk9, Qp9_0);

4
src/spicelib/devices/adms/psp102/admsva/PSP102_InitNQS.include

@ -4,10 +4,10 @@
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
// //
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
// //
// //
// Version: 102.1, October 2006 (Simkit 2.4)
// Version: 102.1, April 2007 (Simkit 2.5)
// //
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================

4
src/spicelib/devices/adms/psp102/admsva/PSP102_binning.include

@ -4,10 +4,10 @@
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
// //
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
// //
// //
// Version: 102.1, October 2006 (Simkit 2.4)
// Version: 102.1, April 2007 (Simkit 2.5)
// //
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================

4
src/spicelib/devices/adms/psp102/admsva/PSP102_binpars.include

@ -4,10 +4,10 @@
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
// //
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
// //
// //
// Version: 102.1, October 2006 (Simkit 2.4)
// Version: 102.1, April 2007 (Simkit 2.5)
// //
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================

46
src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include

@ -4,10 +4,10 @@
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
// //
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
// //
// //
// Version: 102.1, October 2006 (Simkit 2.4)
// Version: 102.1, April 2007 (Simkit 2.5)
// //
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
@ -73,7 +73,7 @@
// around the arguments in the expressions are necessary) // around the arguments in the expressions are necessary)
`define sigma(a,c,tau,eta,y) \ `define sigma(a,c,tau,eta,y) \
nu = (a) + (c); \ nu = (a) + (c); \
mu = nu * nu / (tau) + 0.5 * (c) * (c) - (a); \
mu = nu * nu / (tau) + 0.5 * ((c) * (c)) - (a); \
y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a))); y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a)));
@ -83,7 +83,7 @@ nu = (a) + (c); \
if (abs(tau) < 1e-120) begin /*sometimes tau is extremely small...*/\ if (abs(tau) < 1e-120) begin /*sometimes tau is extremely small...*/\
y = (eta); \ y = (eta); \
end else begin \ end else begin \
mu = (nu) * (nu) / (tau) + 0.5 * (c) * (c) - (a) * (b); \
mu = (nu) * (nu) / (tau) + 0.5 * ((c) * (c)) - (a) * (b); \
y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a) * (b))); \ y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a) * (b))); \
end end
@ -97,7 +97,7 @@ if (abs(xg) <= margin) begin \
end else begin \ end else begin \
if (xg < -margin) begin \ if (xg < -margin) begin \
SP_S_yg = -xg; \ SP_S_yg = -xg; \
SP_S_ysub = 1.25 * SP_S_yg * inv_xi; \
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_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_temp = SP_S_yg - SP_S_eta; \
SP_S_a = SP_S_temp * SP_S_temp + Gf2*(SP_S_eta + 1.0);\ SP_S_a = SP_S_temp * SP_S_temp + Gf2*(SP_S_eta + 1.0);\
@ -108,15 +108,15 @@ end else begin \
SP_S_delta1 = 1.0 / 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_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_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_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_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_temp = SP_S_yg - SP_S_y0; \
SP_S_temp1 = (delta) * SP_S_delta1; \ 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_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_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)); \
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 \ end else begin \
SP_xg1 = 1.0 / (x1 + Gf * 7.324648775608221e-001); \ SP_xg1 = 1.0 / (x1 + Gf * 7.324648775608221e-001); \
SP_S_A_fac= (xi * x1 * SP_xg1 - 1.0) * SP_xg1; \ SP_S_A_fac= (xi * x1 * SP_xg1 - 1.0) * SP_xg1; \
@ -130,10 +130,10 @@ end else begin \
SP_S_temp1= exp(-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_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_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_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_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_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_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_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); \ 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) \ `sigma2(SP_S_a, SP_S_b, SP_S_c, SP_S_tau, SP_S_eta, SP_S_x0) \
@ -152,14 +152,14 @@ end else begin \
end \ end \
SP_S_temp = 1.0 / (2.0 + SP_S_x0 * SP_S_x0); \ 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_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_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_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_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_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_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 = 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)); \
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 \
end end
@ -177,10 +177,10 @@ end else begin \
SP_S_temp1= exp(-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_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_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_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_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_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_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_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); \ 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) \ `sigma2(SP_S_a, SP_S_b, SP_S_c, SP_S_tau, SP_S_eta, SP_S_x0) \
@ -199,14 +199,14 @@ end else begin \
end \ end \
SP_S_temp = 1.0 / (2.0 + SP_S_x0 * SP_S_x0); \ 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_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_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_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_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_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_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 = 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));\
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
// //
@ -229,8 +229,8 @@ end else begin \
SP_OV_p = 2.0 * SP_OV_temp + GOV2 * (SP_OV_D0 - 1.0); \ 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_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_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_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); \ sp = -(SP_OV_y0 + SP_OV_w); \
end else begin \ end else begin \
SP_OV_Afac = (xi_ov * x1 * inv_xg1 - 1.0) * inv_xg1; \ SP_OV_Afac = (xi_ov * x1 * inv_xg1 - 1.0) * inv_xg1; \
@ -242,8 +242,8 @@ end else begin \
SP_OV_p = 2.0 * (xg - SP_OV_x0) + GOV2 * (1 - 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_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_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_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; \ sp = SP_OV_x0 + SP_OV_u; \
end \ end \
sp = -sp; \ sp = -sp; \

164
src/spicelib/devices/adms/psp102/admsva/PSP102_module.include

@ -6,10 +6,10 @@
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
// //
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
// //
// //
// Version: 102.1, October 2006 (Simkit 2.4)
// Version: 102.1, April 2007 (Simkit 2.5)
// //
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
@ -540,7 +540,7 @@
real Dnsub; real Dnsub;
real Igidl, Igisl, Vtovd, Vtovs; real Igidl, Igisl, Vtovd, Vtovs;
real x_s, sqm, alpha, alpha1, eta_p, phi_inf, za, xitsb, rhob; 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 thesat1, wsat, ysat, zsat, r1, r2, dL, GdL, dL1, FdL, GR, Gmob, Gmob_dL, Gvsat, Gvsatinv, QCLM;
real xgm, Voxm, dps, qim, qim1, qim1_1, xgs_ov, xgd_ov, sigVds; real xgm, Voxm, dps, qim, qim1, qim1_1, xgs_ov, xgd_ov, sigVds;
real Ux, xg; real Ux, xg;
real mu, nu, xn_s, delta_ns; real mu, nu, xn_s, delta_ns;
@ -1312,6 +1312,7 @@
QCLM = 0.0; QCLM = 0.0;
thesat1 = 0.0; thesat1 = 0.0;
Gvsat = 1.0; Gvsat = 1.0;
Gvsatinv = 1.0;
xgm = 0.0; xgm = 0.0;
dps = 0.0; dps = 0.0;
qim = 0.0; qim = 0.0;
@ -1373,7 +1374,7 @@
Vgb1 = Vgbstar - VFB_i; Vgb1 = Vgbstar - VFB_i;
Vdsx = sqrt(Vds * Vds + 0.01) - 0.1; Vdsx = sqrt(Vds * Vds + 0.01) - 0.1;
Vsbx = Vsbstar + 0.5 * (Vds - Vdsx); Vsbx = Vsbstar + 0.5 * (Vds - Vdsx);
delVg = CF_i * Vdsx * (1 + CFB_i * Vsbx); // DIBL
delVg = CF_i * (Vdsx * (1 + CFB_i * Vsbx)); // DIBL
Vgb1 = Vgb1 + delVg; Vgb1 = Vgb1 + delVg;
xg = Vgb1 * inv_phit1; xg = Vgb1 * inv_phit1;
@ -1417,32 +1418,30 @@
delta_1s = 0.0; delta_1s = 0.0;
temp = 1.0 / (2.0 + x_s * x_s); temp = 1.0 / (2.0 + x_s * x_s);
xi0s = x_s * x_s * temp; xi0s = x_s * x_s * temp;
xi1s = 4.0 * x_s * temp * temp;
xi1s = 4.0 * (x_s * temp * temp);
xi2s = (8.0 * temp - 12.0 * xi0s) * temp * temp; xi2s = (8.0 * temp - 12.0 * xi0s) * temp * temp;
if (x_s < `se05) begin if (x_s < `se05) begin
delta_1s = exp(x_s); delta_1s = exp(x_s);
Es = 1.0 / delta_1s; Es = 1.0 / delta_1s;
delta_1s = delta_ns * 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 end else if (x_s > (xn_s - `se05)) begin
delta_1s = exp(x_s - xn_s); delta_1s = exp(x_s - xn_s);
Es = delta_ns / delta_1s; Es = delta_ns / delta_1s;
Ds = delta_1s - delta_ns * (x_s + 1.0 + xi0s);
end else begin end else begin
delta_1s = `ke05 / `P3(xn_s - x_s - `se05); delta_1s = `ke05 / `P3(xn_s - x_s - `se05);
Es = `ke05 / `P3(x_s - `se05); Es = `ke05 / `P3(x_s - `se05);
Ds = delta_1s - delta_ns * (x_s + 1.0 + xi0s);
end end
Ds = delta_1s - delta_ns * (x_s + 1.0 + xi0s);
if (x_s < 1.0e-5) begin 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;
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 end else begin
Ps = x_s - 1.0 + Es; Ps = x_s - 1.0 + Es;
sqm = sqrt(Ps); sqm = sqrt(Ps);
alpha = 1.0 + 0.5 * Gf * (1.0 - Es) / sqm;
alpha = 1.0 + 0.5 * (Gf * (1.0 - Es) / sqm);
end end
Em = Es; Em = Es;
Ed = Em; Ed = Em;
@ -1465,9 +1464,9 @@
end else begin end else begin
temp = 1.0 / (1.0 + RSG_i * qis); temp = 1.0 / (1.0 + RSG_i * qis);
end end
GR = THER_i * rhob * temp * qis;
GR = THER_i * (rhob * temp * qis);
Eeffm = E_eff0 * (qbs + eta_mu * qis); Eeffm = E_eff0 * (qbs + eta_mu * qis);
Mutmp = pow(Eeffm * MUE_i, THEMU_i) + CS_i * Ps / (Ps + Ds + 1.0e-14);
Mutmp = pow(Eeffm * MUE_i, THEMU_i) + CS_i * (Ps / (Ps + Ds + 1.0e-14));
Gmob = (1.0 + Mutmp + GR) * Rxcor; Gmob = (1.0 + Mutmp + GR) * Rxcor;
if (THESATB_i < 0) begin if (THESATB_i < 0) begin
xitsb = 1.0 / (1.0 - THESATB_i * Vsbx); xitsb = 1.0 / (1.0 - THESATB_i * Vsbx);
@ -1475,13 +1474,13 @@
xitsb = 1.0 + THESATB_i * Vsbx; xitsb = 1.0 + THESATB_i * Vsbx;
end end
temp2 = qis * xitsb; temp2 = qis * xitsb;
wsat = 100.0 * temp2 / (100.0 + temp2);
wsat = 100.0 * (temp2 / (100.0 + temp2));
if (THESATG_i < 0) begin if (THESATG_i < 0) begin
temp = 1 / (1 - THESATG_i * wsat); temp = 1 / (1 - THESATG_i * wsat);
end else begin end else begin
temp = 1 + THESATG_i * wsat; temp = 1 + THESATG_i * wsat;
end end
thesat1 = THESAT_i * temp / Gmob;
thesat1 = THESAT_i * (temp / Gmob);
phi_inf = qis / alpha + phit1; phi_inf = qis / alpha + phit1;
ysat = thesat1 * phi_inf * `invSqrt2; ysat = thesat1 * phi_inf * `invSqrt2;
if (CHNL_TYPE==`PMOS) begin if (CHNL_TYPE==`PMOS) begin
@ -1489,11 +1488,11 @@
end end
za = 2.0 / (1.0 + sqrt(1.0 + 4.0 * ysat)); za = 2.0 / (1.0 + sqrt(1.0 + 4.0 * ysat));
temp1 = za * 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));
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; asat = xgs + 0.5 * Gf2;
Phi_2 = Gf2 * Ds * phit1 * 0.98 / (asat + sqrt(asat * asat - Gf2 * Ds * 0.98));
Phi_2 = 0.98 * (Gf2 * Ds * phit1 / (asat + sqrt(asat * asat - Gf2 * Ds * 0.98)));
Phi_0_2 = Phi_0 + Phi_2; Phi_0_2 = Phi_0 + Phi_2;
Phi0_Phi2 = 2.0 * 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)); 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)); Vdsat = Phi_sat - phit1 * ln(1.0 + Phi_sat * (Phi_sat - 2.0 * asat * phit1) * inv_Gf2 / (phit1 * phit1 * Ds));
end else begin end else begin
@ -1522,8 +1521,8 @@
pC = 2.0 * (xg - x_s) + Gf2 * (1.0 - Es + delta_1s * k_ds - delta_nd * (1.0 + xi1s)); 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; qC = Gf2 * (1.0 - k_ds) * Ds;
temp = 2.0 - Gf2 * (Es + delta_1s * k_ds - delta_nd * xi2s); 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));
temp = pC * pC - 2.0 * (temp * qC);
x_ds = 2.0 * (qC / (pC + sqrt(temp)));
x_d = x_s + x_ds; x_d = x_s + x_ds;
end end
dps = x_ds * phit1; // deltaPsi dps = x_ds * phit1; // deltaPsi
@ -1556,32 +1555,32 @@
Em = sqrt(temp); Em = sqrt(temp);
end end
D_bar = 0.5 * (Ds + Dd); D_bar = 0.5 * (Ds + Dd);
Dm = D_bar + 0.125 * x_ds * x_ds * (Em - 2.0 * inv_Gf2);
Dm = D_bar + 0.125 * (x_ds * x_ds * (Em - 2.0 * inv_Gf2));
if (x_m < 1.0e-5) begin 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));
Pm = 0.5 * (x_m * x_m * (1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m))));
xgm = Gf * sqrt(Dm + Pm); xgm = Gf * sqrt(Dm + Pm);
// 4.2.7 Polysilicon depletion // 4.2.7 Polysilicon depletion
if (kp > 0.0) begin if (kp > 0.0) begin
eta_p = 1.0 / sqrt(1.0 + kp * xgm); eta_p = 1.0 / sqrt(1.0 + kp * xgm);
end // (kp > 0.0) 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;
temp = sqrt(1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m)));
sqm = `invSqrt2 * (x_m * temp);
alpha = eta_p + `invSqrt2 * (Gf * (1.0 - 0.5 * x_m + `oneSixth * (x_m * x_m)) / temp);
end else begin end else begin
Pm = x_m - 1.0 + Em; Pm = x_m - 1.0 + Em;
xgm = Gf * sqrt(Dm + Pm); xgm = Gf * sqrt(Dm + Pm);
// 4.2.7 Polysilicon depletion // 4.2.7 Polysilicon depletion
if (kp > 0.0) begin if (kp > 0.0) begin
d0 = 1.0 - Em + 2.0 * xgm * inv_Gf2;
d0 = 1.0 - Em + 2.0 * (xgm * inv_Gf2);
eta_p = 1.0 / sqrt(1.0 + kp * xgm); eta_p = 1.0 / sqrt(1.0 + kp * xgm);
temp = eta_p / (eta_p + 1.0); temp = eta_p / (eta_p + 1.0);
x_pm = kp * temp * temp * Gf2 * Dm;
x_pm = kp * (temp * temp * Gf2 * Dm);
p_pd = 2.0 * (xgm - x_pm) + Gf2 * (1.0 - Em + Dm); p_pd = 2.0 * (xgm - x_pm) + Gf2 * (1.0 - Em + Dm);
q_pd = x_pm * (x_pm - 2.0 * xgm); q_pd = x_pm * (x_pm - 2.0 * xgm);
xi_pd = 1.0 - 0.5 * Gf2 * (Em + Dm);
xi_pd = 1.0 - 0.5 * (Gf2 * (Em + Dm));
u_pd = q_pd * p_pd / (p_pd * p_pd - xi_pd * q_pd); u_pd = q_pd * p_pd / (p_pd * p_pd - xi_pd * q_pd);
x_m = x_m + u_pd; x_m = x_m + u_pd;
km = exp(u_pd); km = exp(u_pd);
@ -1589,16 +1588,16 @@
Dm = Dm * km; Dm = Dm * km;
Pm = x_m - 1.0 + Em; Pm = x_m - 1.0 + Em;
xgm = Gf * sqrt(Dm + Pm); xgm = Gf * sqrt(Dm + Pm);
help = 1.0 - Em + 2.0 * xgm * eta_p * inv_Gf2;
help = 1.0 - Em + 2.0 * (xgm * eta_p * inv_Gf2);
x_ds = x_ds * km * (d0 + D_bar) / (help + km * D_bar); x_ds = x_ds * km * (d0 + D_bar) / (help + km * D_bar);
dps = x_ds * phit1; dps = x_ds * phit1;
end // (kp > 0.0) end // (kp > 0.0)
sqm = sqrt(Pm); sqm = sqrt(Pm);
alpha = eta_p + 0.5 * Gf * (1.0 - Em) / sqm;
alpha = eta_p + 0.5 * (Gf * (1.0 - Em) / sqm);
end end
// 4.2.8 Potential midpoint inversion charge // 4.2.8 Potential midpoint inversion charge
qim = Gf2 * Dm * phit1 / (xgm + Gf * sqm);
qim = phit1 * (Gf2 * Dm / (xgm + Gf * sqm));
// 4.2.8 Potential midpoint inversion charge (continued) // 4.2.8 Potential midpoint inversion charge (continued)
qim1 = qim + phit1 * alpha; qim1 = qim + phit1 * alpha;
@ -1610,54 +1609,55 @@
end else begin end else begin
temp = 1.0 / (1.0 + RSG_i * qim); temp = 1.0 / (1.0 + RSG_i * qim);
end end
GR = THER_i * rhob * temp * qim;
GR = THER_i * (rhob * temp * qim);
// Mobility reduction // Mobility reduction
qeff = qbm + eta_mu * qim; qeff = qbm + eta_mu * qim;
Eeffm = E_eff0 * qeff; Eeffm = E_eff0 * qeff;
Mutmp = pow(Eeffm * MUE_i, THEMU_i) + CS_i * Pm / (Pm + Dm + 1.0e-14);
Mutmp = pow(Eeffm * MUE_i, THEMU_i) + CS_i * (Pm / (Pm + Dm + 1.0e-14));
Gmob = (1.0 + Mutmp + GR) * Rxcor; Gmob = (1.0 + Mutmp + GR) * Rxcor;
// 4.2.9 Drain-source channel current // 4.2.9 Drain-source channel current
// Channel length modulation // Channel length modulation
r1 = qim * qim1_1; r1 = qim * qim1_1;
r2 = phit1 * alpha * qim1_1;
r2 = phit1 * (alpha * qim1_1);
temp = ln((1.0 + (Vds - dps) * inv_VP) / (1.0 + (Vdse - dps) * inv_VP)); temp = ln((1.0 + (Vds - dps) * inv_VP) / (1.0 + (Vdse - dps) * inv_VP));
temp1 = ln(1.0 + Vdsx * inv_VP); temp1 = ln(1.0 + Vdsx * inv_VP);
dL = ALP_i * temp; dL = ALP_i * temp;
GdL = 1.0 / (1.0 + dL + dL * dL); GdL = 1.0 / (1.0 + dL + dL * dL);
dL1 = dL + ALP1_i * qim1_1 * r1 * temp + ALP2_i * qbm * r2 * r2 * temp1;
dL1 = dL + ALP1_i * (qim1_1 * r1 * temp) + ALP2_i * (qbm * r2 * r2 * temp1);
FdL = (1.0 + dL1 + dL1 * dL1) * GdL; FdL = (1.0 + dL1 + dL1 * dL1) * GdL;
// Velocity saturation // Velocity saturation
temp2 = qim * xitsb; temp2 = qim * xitsb;
wsat = 100.0 * temp2 / (100.0 + temp2);
wsat = 100.0 * (temp2 / (100.0 + temp2));
Gmob_dL = Gmob * GdL; Gmob_dL = Gmob * GdL;
if (THESATG_i < 0) begin if (THESATG_i < 0) begin
temp = 1 / (1 - THESATG_i * wsat); temp = 1 / (1 - THESATG_i * wsat);
end else begin end else begin
temp = 1 + THESATG_i * wsat; temp = 1 + THESATG_i * wsat;
end end
thesat1 = THESAT_i * temp / Gmob_dL;
thesat1 = THESAT_i * (temp / Gmob_dL);
zsat = thesat1 * thesat1 * dps * dps; zsat = thesat1 * thesat1 * dps * dps;
if (CHNL_TYPE == `PMOS) begin if (CHNL_TYPE == `PMOS) begin
zsat = zsat / (1.0 + thesat1 * dps); zsat = zsat / (1.0 + thesat1 * dps);
end end
Gvsat = 0.5 * Gmob_dL * (1.0 + sqrt(1.0 + 2.0 * zsat));
Gvsat = 0.5 * (Gmob_dL * (1.0 + sqrt(1.0 + 2.0 * zsat)));
Gvsatinv = 1.0 / Gvsat;
// Drain-source current // Drain-source current
Ids = BET_i * FdL * qim1 * dps / Gvsat;
Ids = BET_i * (FdL * qim1 * dps * Gvsatinv);
// 4.2.10 Variables for calculation of intrinsic charges and gate current // 4.2.10 Variables for calculation of intrinsic charges and gate current
Voxm = xgm * phit1; Voxm = xgm * phit1;
temp = Gmob_dL / Gvsat;
alpha1 = alpha * (1.0 + 0.5 * zsat * temp * temp);
temp = Gmob_dL * Gvsatinv;
alpha1 = alpha * (1.0 + 0.5 * (zsat * temp * temp));
H = temp * qim1 / alpha1; H = temp * qim1 / alpha1;
// 4.2.11 Impact-Ionization // 4.2.11 Impact-Ionization
if (SWIMPACT != 0) begin if (SWIMPACT != 0) begin
delVsat = Vds - A3_i * dps; delVsat = Vds - A3_i * dps;
if (delVsat > 0) begin if (delVsat > 0) begin
temp2 = A2_i * (1.0 + A4_i * (sqrt(phib + Vsbstar) - sqrt_phib)) / delVsat;
temp2 = A2_i * ((1.0 + A4_i * (sqrt(phib + Vsbstar) - sqrt_phib)) / delVsat);
`expl_low(-temp2, temp) `expl_low(-temp2, temp)
mavl = A1_i * delVsat * temp;
mavl = A1_i * (delVsat * temp);
Iimpact = Ids * mavl; Iimpact = Ids * mavl;
end end
end end
@ -1701,7 +1701,7 @@
end else begin end else begin
`expl_low(temp, TP) `expl_low(temp, TP)
end end
Igsov = IGOV_i * TP * ln((1.0 + Dsi) / (1.0 + Dgate));
Igsov = IGOV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate)));
// Gate-drain overlap component of gate current // Gate-drain overlap component of gate current
arg2mina = Vovd + Dov; arg2mina = Vovd + Dov;
@ -1721,7 +1721,7 @@
end else begin end else begin
`expl_low(temp, TP) `expl_low(temp, TP)
end end
Igdov = IGOV_i * TP * ln((1.0 + Dsi) / (1.0 + Dgate));
Igdov = IGOV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate)));
end end
// Gate-channel component of gate current // Gate-channel component of gate current
@ -1750,7 +1750,7 @@
end else begin end else begin
`expl_low(temp, TP) `expl_low(temp, TP)
end end
Igc0 = IGINV_i * TP * ln((1.0 + Dsi) / (1.0 + Dgate));
Igc0 = IGINV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate)));
// Source/drain partitioning of gate-channel current // Source/drain partitioning of gate-channel current
if ((xg <= 0) || ((GC2_i == 0) && (GC3_i == 0))) begin if ((xg <= 0) || ((GC2_i == 0) && (GC3_i == 0))) begin
@ -1759,14 +1759,14 @@
end else begin end else begin
temp = GC2_i + 2.0 * GC3_i * zg; temp = GC2_i + 2.0 * GC3_i * zg;
u0 = CHIB_i / (temp * BCH); u0 = CHIB_i / (temp * BCH);
x = 0.5 * dps / u0;
x = 0.5 * (dps / u0);
u0_div_H = u0 / H; u0_div_H = u0 / H;
Bg = u0_div_H * (1.0 - u0_div_H) * 0.5; Bg = u0_div_H * (1.0 - u0_div_H) * 0.5;
Ag = 0.5 - 3.0 * Bg; Ag = 0.5 - 3.0 * Bg;
if (x < 1.0e-3) begin if (x < 1.0e-3) begin
xsq = x * x; 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)));
igc = 1.0 + xsq * (`oneSixth + u0_div_H * `oneThird + `oneSixth * (xsq * (0.05 + 0.2 * u0_div_H)));
igcd_h = 0.5 * igc - `oneSixth * (x * (1.0 + xsq * (0.4 * (Bg + 0.25) + 0.0285714285714 * (xsq * (0.125 + Bg)))));
end else begin end else begin
inv_x = 1.0 / x; inv_x = 1.0 / x;
`expl(x, ex) `expl(x, ex)
@ -1794,18 +1794,18 @@
// GIDL current computation // GIDL current computation
if (Vovd < 0) begin if (Vovd < 0) begin
Vtovd = sqrt(Vovd * Vovd + CGIDL_i * CGIDL_i * Vdb * Vdb + 1.0e-6);
Vtovd = sqrt(Vovd * Vovd + CGIDL_i * CGIDL_i * (Vdb * Vdb) + 1.0e-6);
temp = -BGIDL_i / Vtovd; temp = -BGIDL_i / Vtovd;
`expl_low(temp, temp2) `expl_low(temp, temp2)
Igidl = -AGIDL_i * Vdb * Vovd * Vtovd * temp2;
Igidl = -AGIDL_i * (Vdb * Vovd * Vtovd * temp2);
end end
// GISL current computation // GISL current computation
if (Vovs < 0) begin if (Vovs < 0) begin
Vtovs = sqrt(Vovs * Vovs + CGIDL_i * CGIDL_i * Vsb * Vsb + 1.0e-6);
Vtovs = sqrt(Vovs * Vovs + CGIDL_i * CGIDL_i * (Vsb * Vsb) + 1.0e-6);
temp = -BGIDL_i / Vtovs; temp = -BGIDL_i / Vtovs;
`expl_low(temp, temp2) `expl_low(temp, temp2)
Igisl = -AGIDL_i * Vsb * Vovs * Vtovs * temp2;
Igisl = -AGIDL_i * (Vsb * Vovs * Vtovs * temp2);
end end
end // (SWGIDL != 0) end // (SWGIDL != 0)
@ -1833,13 +1833,13 @@
QD = 0.0; QD = 0.0;
QB = QG; QB = QG;
end else begin end else begin
Fj = 0.5 * dps / H;
Fj = 0.5 * (dps / H);
Fj2 = Fj * Fj; 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);
QCLM = (1.0 - GdL) * (qim - 0.5 * (alpha * dps));
QG = Voxm + 0.5 * (eta_p * dps * (Fj * GdL * `oneThird - 1.0 + GdL));
temp = alpha * dps * `oneSixth; temp = alpha * dps * `oneSixth;
QI = GdL * (qim + temp * Fj) + QCLM; 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);
QD = 0.5 * (GdL * GdL * (qim - temp * (1.0 - Fj - 0.2 * Fj2)) + QCLM * (1.0 + GdL));
QB = QG - QI; QB = QG - QI;
end end
Qg = QG * COX_qm; Qg = QG * COX_qm;
@ -1867,7 +1867,7 @@
pd = 1.0; pd = 1.0;
Gp = Gf; Gp = Gf;
end else begin end else begin
ym = 0.5 * ( 1.0 + 0.25 * dps / H);
ym = 0.5 * ( 1.0 + 0.25 * (dps / H));
pd = xgm / (xg - x_m); pd = xgm / (xg - x_m);
Gp = Gf / pd; Gp = Gf / pd;
end end
@ -2015,14 +2015,14 @@
Qfgs = temp; Qfgs = temp;
end 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);
I(`Gint, S) <+ ddt(CHNL_TYPE * Qg);
I(`Bint, S) <+ ddt(CHNL_TYPE * Qb);
I(D, S) <+ ddt(CHNL_TYPE * Qd);
I(`Gint, S) <+ ddt(CHNL_TYPE * Qfgs);
I(`Gint, D) <+ ddt(CHNL_TYPE * Qfgd);
I(`Gint, `Bint) <+ ddt(CHNL_TYPE * Qgb_ov);
I(`Bjs, S) <+ ddt(CHNL_TYPE * qsjun);
I(`Bjd, D) <+ ddt(CHNL_TYPE * qdjun);
end // loadDynamic end // loadDynamic
@ -2047,27 +2047,27 @@
if ((xg > 0.0) && (MULT_i > 0) && (BET_i > 0)) begin if ((xg > 0.0) && (MULT_i > 0) && (BET_i > 0)) begin
N1 = Cox_over_q * alpha * phit; N1 = Cox_over_q * alpha * phit;
Nm1 = Cox_over_q * qim1; 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));
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 + (NFB_i + NFC_i * (Nm1 - 2.0 * N1)) * Delta_N1;
Sfl = Sfl_prefac * Ids / (Gvsat * N1) * Sfl;
Sfl = Sfl_prefac * Ids * Gvsatinv * Sfl / N1;
H0 = qim1 / alpha; H0 = qim1 / alpha;
t1 = qim / qim1; t1 = qim / qim1;
sqt2 = 0.5 * `oneSixth * dps / H0;
sqt2 = 0.5 * `oneSixth * (dps / H0);
t2 = sqt2 * sqt2; t2 = sqt2 * sqt2;
r = H0 / H - 1.0; r = H0 / H - 1.0;
lc = `CLIP_LOW(1.0 - 12 * r * t2, 1e-20);
lc = `CLIP_LOW(1.0 - 12 * (r * t2), 1e-20);
lcinv2 = 1 / (lc * lc); lcinv2 = 1 / (lc * lc);
g_ideal = BET_i * FdL * qim1 / Gvsat;
g_ideal = BET_i * (FdL * qim1 * Gvsatinv);
CGeff = Gvsat * Gvsat * COX_qm * eta_p / (Gmob_dL * Gmob_dL); CGeff = Gvsat * Gvsat * COX_qm * eta_p / (Gmob_dL * Gmob_dL);
mid = t1 + 12 * t2 - 24 * (1.0 + t1) * t2 * r;
mid = t1 + 12 * t2 - 24 * ((1.0 + t1) * t2 * r);
mid = `CLIP_LOW(mid, 1e-40); mid = `CLIP_LOW(mid, 1e-40);
mid = g_ideal * lcinv2 * mid; mid = g_ideal * lcinv2 * mid;
mig = t1 / 12 - t2 * (t1 + 0.2 - 12 * t2) - 1.6 * t2 * (t1 + 1.0 - 12 * t2) * r;
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 = `CLIP_LOW(mig, 1e-40);
mig = lcinv2 / g_ideal * mig; mig = lcinv2 / g_ideal * mig;
migid = lcinv2 * sqt2 * (1.0 - 12 * t2 - (t1 + 19.2 * t2 - 12 * t1 * t2) * r);
migid = lcinv2 * sqt2 * (1.0 - 12 * t2 - (t1 + 19.2 * t2 - 12 * (t1 * t2)) * r);
sqid = sqrt(MULT_i * nt * mid); sqid = sqrt(MULT_i * nt * mid);
sqig = sqrt(MULT_i * nt / mig); sqig = sqrt(MULT_i * nt / mig);
c_igid = (sqid == 0) ? 0.0 : (migid * sqig / sqid); // = migid / sqrt(mig * mid); c_igid = (sqid == 0) ? 0.0 : (migid * sqig / sqid); // = migid / sqrt(mig * mid);
@ -2075,7 +2075,7 @@
end end
shot_igsx = 2.0 * `QELE * abs(Igse); shot_igsx = 2.0 * `QELE * abs(Igse);
shot_igdx = 2.0 * `QELE * abs(Igde); shot_igdx = 2.0 * `QELE * abs(Igde);
shot_iavl = 2.0 * `QELE * (mavl + 1) * abs(Iimpacte);
shot_iavl = 2.0 * `QELE * ((mavl + 1) * abs(Iimpacte));
// JUNCAP2 // JUNCAP2
sjnoisex = 2.0 * `QELE * abs(isjun); sjnoisex = 2.0 * `QELE * abs(isjun);
djnoisex = 2.0 * `QELE * abs(idjun); djnoisex = 2.0 * `QELE * abs(idjun);
@ -2114,8 +2114,8 @@
I(D,S) <+ flicker_noise(MULT_i * Sfl, 1.0); I(D,S) <+ flicker_noise(MULT_i * Sfl, 1.0);
I(D,S) <+ white_noise(sqid * sqid * (1.0 - c_igid)); I(D,S) <+ white_noise(sqid * sqid * (1.0 - c_igid));
I(D,S) <+ sqid * V(NOI2); 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)<+ ddt(0.5 * ((1.0 + sigVds) * mig * CGeff * V(NOIC)));
I(`Gint,D)<+ ddt(0.5 * ((1.0 - sigVds) * mig * CGeff * V(NOIC)));
I(`Gint,S)<+ white_noise(shot_igs); I(`Gint,S)<+ white_noise(shot_igs);
I(`Gint,D)<+ white_noise(shot_igd); I(`Gint,D)<+ white_noise(shot_igd);
// JUNCAP2 // JUNCAP2
@ -2154,7 +2154,7 @@
ig = Igse + Igde + Igbe; ig = Igse + Igde + Igbe;
ib = -Iimpacte - Igbe - Igidle - Igisle; ib = -Iimpacte - Igbe - Igidle - Igisle;
P_D = 1 + 0.25 * Gf * kp;
P_D = 1 + 0.25 * (Gf * kp);
facvsb0 = phib + 2 * phit1; facvsb0 = phib + 2 * phit1;
facvsb = Vsbstar + facvsb0; facvsb = Vsbstar + facvsb0;
sig1k = 2 * `PI * 1000 * CGeff; sig1k = 2 * `PI * 1000 * CGeff;

4
src/spicelib/devices/adms/psp102/admsva/PSP102_nqs_macrodefs.include

@ -4,10 +4,10 @@
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
// //
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
// //
// //
// Version: 102.1, October 2006 (Simkit 2.4)
// Version: 102.1, April 2007 (Simkit 2.5)
// //
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================

8
src/spicelib/devices/adms/psp102/admsva/SIMKIT_macrodefs.include

@ -4,10 +4,10 @@
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
// //
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
// //
// //
// Version: 102.1, October 2006 (Simkit 2.4)
// Version: 102.1, April 2007 (Simkit 2.5)
// //
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
@ -43,7 +43,7 @@
`define from(lower,upper) `define from(lower,upper)
// `define from(lower,upper) from[lower:upper] // `define from(lower,upper) from[lower:upper]
// Some functions
// Some functions
`define MAX(x,y) ((x)>(y)?(x):(y)) `define MAX(x,y) ((x)>(y)?(x):(y))
`define MIN(x,y) ((x)<(y)?(x):(y)) `define MIN(x,y) ((x)<(y)?(x):(y))
@ -83,7 +83,7 @@
// P3 3rd order polynomial expansion of exp() // P3 3rd order polynomial expansion of exp()
`define P3(u) (1.0 + (u) * (1.0 + 0.5 * (u) * (1.0 + (u) * `oneThird)))
`define P3(u) (1.0 + (u) * (1.0 + 0.5 * ((u) * (1.0 + (u) * `oneThird))))
// expl exp() with 3rd order polynomial extrapolation // expl exp() with 3rd order polynomial extrapolation

4
src/spicelib/devices/adms/psp102/admsva/psp102.va

@ -4,10 +4,10 @@
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================
// //
// (c) Copyright 2006, All Rights Reserved, NXP Semiconductors
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
// //
// //
// Version: 102.1, October 2006 (Simkit 2.4)
// Version: 102.1, April 2007 (Simkit 2.5)
// //
//====================================================================================== //======================================================================================
//====================================================================================== //======================================================================================

60
src/spicelib/devices/adms/psp102/admsva/readme.txt

@ -6,10 +6,10 @@
--------------------------- ---------------------------
(c) Copyright 2006, All Rights Reserved, NXP Semiconductors
(c) Copyright 2007, All Rights Reserved, NXP Semiconductors
Version: PSP 102.1 (including JUNCAP2 200.2), October 2006 (Simkit 2.4)
Version: PSP 102.1 (including JUNCAP2 200.2), April 2007 (Simkit 2.5)
====================================================================================== ======================================================================================
====================================================================================== ======================================================================================
@ -72,40 +72,42 @@ 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
Release notes va-code of PSP 102.1, including JUNCAP2 200.2 (April 2007)
------------------------------------------------------------------------
Focus in this release has been on improving the simulation speed of PSP and JUNCAP2.
The model equations in this release of PSP 102.1 are identical to those in the
October 2006 release. This version features some minor impelementation changes
w.r.t. the previous release.
The main changes have been in the SiMKit version generated from this verilog-A
implementation: improvements in the automatic C-code generation process
and compilation of the C-code. The result is reflected in the SiMKit 2.5 version of
PSP, which shows a very significant simulation speed improvement w.r.t SiMKit 2.4.
The minor implementation changes in the verilog-A code will have some positive effect
on the simulation speed of the verilog-A version as well. Note, however, that the
simulation speed of the verilog-A version of PSP and the improvement w.r.t. the
previous version strongly depend on the verilog-A compiler used.
PSP 102.1 is backwards compatible with the previous version, PSP 102.0.
====================================================================================== ======================================================================================
====================================================================================== ======================================================================================
The functionality of the Verilog-A code in this package is the same as that of the 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
C-code, which is contained in SIMKIT version 2.5. Note that Operating Point information
is available only in the C-code, not in Verilog-A code. 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.
The PSP-NQS model is provided as Verilog-A code. In SiMKit 2.5, a test version of
the PSP-NQS model is included (identical to that in SiMKit 2.4). This implementation
circumvents the problem 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 This Verilog-A code of PSP is primarily intended as a source for C-code generation
@ -114,5 +116,5 @@ using ADMS. Most of the testing has been done on the C-code which was generated
The authors want to thank Laurent Lemaitre and Colin McAndrew (Freescale) The authors want to thank Laurent Lemaitre and Colin McAndrew (Freescale)
for their help with ADMS and the implementation of the model code. Geoffrey 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
Coram (Analog Devices) is acknowledged for useful comments on the Verilog-A
code. code.
Loading…
Cancel
Save