diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include index 6485db896..f4dafbd85 100644 --- a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include +++ b/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) // //====================================================================================== //====================================================================================== diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include index dc28952ad..00d5deed6 100644 --- a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include +++ b/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; \ h4 = (x0) - h2d; \ 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, @@ -163,12 +163,12 @@ 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; \ +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; \ + result = 2 * tmp - erfcpos; \ end @@ -192,35 +192,35 @@ end else begin \ wsrh = wsrhstep + dwsrh; \ `mypower(vbi_minus_vjsrh * VBIRinv, P, tmp) \ wdep = wdepnulr * tmp; \ - asrh = ftd * (zinv - 1) * wdep; \ - isrh = CSRH * asrh * wsrh; \ + 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; \ + 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; \ + 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; \ + gammamax = `SQRTPI * 0.5 * (atat * erfctimesexpmtat / 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; \ + Fmaxr = one_over_one_minus_P * ((VBIR - vbbt) * wdepnulrinv / tmp); \ `expl(-fbbt / Fmaxr, tmp) \ - ibbt = CBBT * VAK * Fmaxr * Fmaxr * tmp; \ + ibbt = CBBT * (VAK * Fmaxr * Fmaxr * tmp); \ end \ if (VBR > `vbrmax) begin \ fbreakdown = 1; \ @@ -246,7 +246,7 @@ 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) \ + `expl(0.5 * (VAK * phitdinv), zinv) \ idmult = zinv * zinv; \ end else begin \ `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; \ z = 1 / zinv; \ 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 \ - 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 \ vjlim = vbimin - two_psistar; \ `hypfunction2(VAK, vjlim, phitd, vjsrh) \ diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include index 5b9d57761..d0064f197 100644 --- a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include +++ b/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) // //====================================================================================== //====================================================================================== diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist.include index 2c2addf94..cb4c5a680 100644 --- a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist.include +++ b/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) // //====================================================================================== //====================================================================================== diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_ChargesNQS.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_ChargesNQS.include index 598daeab5..6ebe651fd 100644 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_ChargesNQS.include +++ b/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 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(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(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(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(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(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(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(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(SPLINE9) <+ vnorm_inv * idt(-Tnorm * fk9, Qp9_0); + V(SPLINE9) <+ idt(-vnorm_inv * 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 index 6d06177ad..a42383d16 100644 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_InitNQS.include +++ b/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) // //====================================================================================== //====================================================================================== diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_binning.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_binning.include index 9f84f1c48..2c044e0ff 100644 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_binning.include +++ b/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) // //====================================================================================== //====================================================================================== diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_binpars.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_binpars.include index 35313b029..625bb1e1a 100644 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_binpars.include +++ b/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) // //====================================================================================== //====================================================================================== diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include index 8c3c3fef6..f9e443db7 100644 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include +++ b/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) `define sigma(a,c,tau,eta,y) \ 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))); @@ -83,7 +83,7 @@ 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); \ + mu = (nu) * (nu) / (tau) + 0.5 * ((c) * (c)) - (a) * (b); \ y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a) * (b))); \ end @@ -97,7 +97,7 @@ if (abs(xg) <= margin) begin \ end else begin \ if (xg < -margin) begin \ 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_temp = SP_S_yg - SP_S_eta; \ 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_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_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)); \ + 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; \ @@ -130,10 +130,10 @@ end else begin \ 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_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_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) \ @@ -152,14 +152,14 @@ end else begin \ 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_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)); \ + 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 @@ -177,10 +177,10 @@ end else begin \ 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_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_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) \ @@ -199,14 +199,14 @@ end else begin \ 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_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));\ + 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 // @@ -229,8 +229,8 @@ end else begin \ 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_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; \ @@ -242,8 +242,8 @@ end else begin \ 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_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; \ diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_module.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_module.include index b47f1f9ea..7180ded1e 100644 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_module.include +++ b/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 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 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 Ux, xg; real mu, nu, xn_s, delta_ns; @@ -1312,6 +1312,7 @@ QCLM = 0.0; thesat1 = 0.0; Gvsat = 1.0; + Gvsatinv = 1.0; xgm = 0.0; dps = 0.0; qim = 0.0; @@ -1373,7 +1374,7 @@ 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 + delVg = CF_i * (Vdsx * (1 + CFB_i * Vsbx)); // DIBL Vgb1 = Vgb1 + delVg; xg = Vgb1 * inv_phit1; @@ -1417,32 +1418,30 @@ 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; + 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 + Ds = delta_1s - delta_ns * (x_s + 1.0 + xi0s); if (x_s < 1.0e-5) begin - Ps = 0.5 * x_s * x_s * (1.0 - `oneThird * x_s * (1.0 - 0.25 * x_s)); - Ds = `oneSixth * delta_ns * x_s * x_s * x_s * (1.0 + 1.75 * x_s); - temp = sqrt(1.0 - `oneThird * x_s * (1.0 - 0.25 * x_s)); - sqm = `invSqrt2 * x_s * temp; - alpha = 1.0 + Gf * `invSqrt2 * (1.0 - 0.5 * x_s + `oneSixth * x_s * x_s) / temp; + 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; + alpha = 1.0 + 0.5 * (Gf * (1.0 - Es) / sqm); end Em = Es; Ed = Em; @@ -1465,9 +1464,9 @@ end else begin temp = 1.0 / (1.0 + RSG_i * qis); end - GR = THER_i * rhob * temp * qis; + 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); + 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); @@ -1475,13 +1474,13 @@ xitsb = 1.0 + THESATB_i * Vsbx; end temp2 = qis * xitsb; - wsat = 100.0 * temp2 / (100.0 + temp2); + 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; + thesat1 = THESAT_i * (temp / Gmob); phi_inf = qis / alpha + phit1; ysat = thesat1 * phi_inf * `invSqrt2; if (CHNL_TYPE==`PMOS) begin @@ -1489,11 +1488,11 @@ 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)); + 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_2 = 0.98 * (Gf2 * Ds * phit1 / (asat + sqrt(asat * asat - Gf2 * Ds * 0.98))); Phi_0_2 = Phi_0 + Phi_2; - Phi0_Phi2 = 2.0 * Phi_0 * Phi_2; + 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 @@ -1522,8 +1521,8 @@ 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)); + 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 @@ -1556,32 +1555,32 @@ Em = sqrt(temp); end 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 - 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); // 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; + temp = sqrt(1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m))); + sqm = `invSqrt2 * (x_m * temp); + alpha = eta_p + `invSqrt2 * (Gf * (1.0 - 0.5 * x_m + `oneSixth * (x_m * x_m)) / temp); end else begin Pm = x_m - 1.0 + Em; xgm = Gf * sqrt(Dm + Pm); // 4.2.7 Polysilicon depletion 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); 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); 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); x_m = x_m + u_pd; km = exp(u_pd); @@ -1589,16 +1588,16 @@ 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; + 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; + 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); + qim = phit1 * (Gf2 * Dm / (xgm + Gf * sqm)); // 4.2.8 Potential midpoint inversion charge (continued) qim1 = qim + phit1 * alpha; @@ -1610,54 +1609,55 @@ end else begin temp = 1.0 / (1.0 + RSG_i * qim); end - GR = THER_i * rhob * temp * qim; + 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); + 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; + 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; + 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); + 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; + 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)); + Gvsat = 0.5 * (Gmob_dL * (1.0 + sqrt(1.0 + 2.0 * zsat))); + Gvsatinv = 1.0 / Gvsat; // 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 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; // 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; + temp2 = A2_i * ((1.0 + A4_i * (sqrt(phib + Vsbstar) - sqrt_phib)) / delVsat); `expl_low(-temp2, temp) - mavl = A1_i * delVsat * temp; + mavl = A1_i * (delVsat * temp); Iimpact = Ids * mavl; end end @@ -1701,7 +1701,7 @@ end else begin `expl_low(temp, TP) 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 arg2mina = Vovd + Dov; @@ -1721,7 +1721,7 @@ end else begin `expl_low(temp, TP) end - Igdov = IGOV_i * TP * ln((1.0 + Dsi) / (1.0 + Dgate)); + Igdov = IGOV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); end // Gate-channel component of gate current @@ -1750,7 +1750,7 @@ end else begin `expl_low(temp, TP) 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 if ((xg <= 0) || ((GC2_i == 0) && (GC3_i == 0))) begin @@ -1759,14 +1759,14 @@ end else begin temp = GC2_i + 2.0 * GC3_i * zg; u0 = CHIB_i / (temp * BCH); - x = 0.5 * dps / u0; + 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))); + igc = 1.0 + xsq * (`oneSixth + u0_div_H * `oneThird + `oneSixth * (xsq * (0.05 + 0.2 * u0_div_H))); + igcd_h = 0.5 * igc - `oneSixth * (x * (1.0 + xsq * (0.4 * (Bg + 0.25) + 0.0285714285714 * (xsq * (0.125 + Bg))))); end else begin inv_x = 1.0 / x; `expl(x, ex) @@ -1794,18 +1794,18 @@ // GIDL current computation 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; `expl_low(temp, temp2) - Igidl = -AGIDL_i * Vdb * Vovd * Vtovd * 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); + 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; + Igisl = -AGIDL_i * (Vsb * Vovs * Vtovs * temp2); end end // (SWGIDL != 0) @@ -1833,13 +1833,13 @@ QD = 0.0; QB = QG; end else begin - Fj = 0.5 * dps / H; + 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); + 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; 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; end Qg = QG * COX_qm; @@ -1867,7 +1867,7 @@ pd = 1.0; Gp = Gf; 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); Gp = Gf / pd; end @@ -2015,14 +2015,14 @@ 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); + 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 @@ -2047,27 +2047,27 @@ 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)); + 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; + Sfl = Sfl_prefac * Ids * Gvsatinv * Sfl / N1; H0 = qim1 / alpha; t1 = qim / qim1; - sqt2 = 0.5 * `oneSixth * dps / H0; + sqt2 = 0.5 * `oneSixth * (dps / H0); t2 = sqt2 * sqt2; 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); - 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); - 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 = 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 = 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); sqig = sqrt(MULT_i * nt / mig); c_igid = (sqid == 0) ? 0.0 : (migid * sqig / sqid); // = migid / sqrt(mig * mid); @@ -2075,7 +2075,7 @@ end shot_igsx = 2.0 * `QELE * abs(Igse); 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 sjnoisex = 2.0 * `QELE * abs(isjun); djnoisex = 2.0 * `QELE * abs(idjun); @@ -2114,8 +2114,8 @@ 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)<+ 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,D)<+ white_noise(shot_igd); // JUNCAP2 @@ -2154,7 +2154,7 @@ ig = Igse + Igde + Igbe; ib = -Iimpacte - Igbe - Igidle - Igisle; - P_D = 1 + 0.25 * Gf * kp; + P_D = 1 + 0.25 * (Gf * kp); facvsb0 = phib + 2 * phit1; facvsb = Vsbstar + facvsb0; sig1k = 2 * `PI * 1000 * CGeff; diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_nqs_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_nqs_macrodefs.include index 59b43072f..e14819dfe 100644 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_nqs_macrodefs.include +++ b/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) // //====================================================================================== //====================================================================================== diff --git a/src/spicelib/devices/adms/psp102/admsva/SIMKIT_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/SIMKIT_macrodefs.include index 66b7165af..190b1eead 100644 --- a/src/spicelib/devices/adms/psp102/admsva/SIMKIT_macrodefs.include +++ b/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) from[lower:upper] -// Some functions +// Some functions `define MAX(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() -`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 diff --git a/src/spicelib/devices/adms/psp102/admsva/psp102.va b/src/spicelib/devices/adms/psp102/admsva/psp102.va index fc1544715..a033bb284 100644 --- a/src/spicelib/devices/adms/psp102/admsva/psp102.va +++ b/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) // //====================================================================================== //====================================================================================== diff --git a/src/spicelib/devices/adms/psp102/admsva/readme.txt b/src/spicelib/devices/adms/psp102/admsva/readme.txt index 16c7ca798..5df9f5b4d 100644 --- a/src/spicelib/devices/adms/psp102/admsva/readme.txt +++ b/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) --------------------------------------------------------------------------- +Release notes va-code of PSP 102.1, including JUNCAP2 200.2 (April 2007) +------------------------------------------------------------------------ -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. +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. -- 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 +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. -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 @@ -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) 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.