Browse Source

cweakinv, introduce sine scaling fucntion scalef()

pre-master-46
Holger Vogt 8 years ago
committed by rlar
parent
commit
f0d131fb8a
  1. 29
      src/spicelib/devices/vdmos/vdmosload.c

29
src/spicelib/devices/vdmos/vdmosload.c

@ -860,6 +860,23 @@ load :
}
/* scaling function, sine function interpolating between 0 and 1
* nf2: empirical setting of sine 'speed'
*/
static double
scalef(double nf2, double vgst)
{
double vgstsin = vgst / nf2;
if (vgstsin > 1)
return 1;
else if (vgstsin < -1)
return 0;
else
return 0.5 * sin(vgstsin * M_PI / 2) + 0.5;
}
/* Calculate D/S current including weak inversion.
* Uses a single function covering weak-moderate-stong inversion, as well
* as linear and saturation regions, with an interpolation method according to
@ -873,20 +890,12 @@ load :
static double
cweakinv(double n, double vgst, double vds, double lambda, double beta, double vt, double mtr)
{
double scalef;
double nf2 = 0.1; /* empirical setting of sin 'speed' */
double vgstsin = vgst / nf2;
if (vgstsin > 1)
scalef = 1;
else if (vgstsin < -1)
scalef = 0;
else
scalef = 0.5 * sin(vgstsin * M_PI / 2) + 0.5;
double n1 = n + (1 - n) * scalef; /* n < n1 < 1 */
double n1 = n + (1 - n) * scalef(nf2, vgst); /* n < n1 < 1 */
double first = log(1 + exp(vgst / (2 * n1 * vt)));
double second = log(1 + exp((vgst - vds * mtr * n1) / (2 * n1 * vt)));
double cds =
beta * n1 * 2 * vt * vt * (1 + scalef * lambda * vds) *
beta * n1 * 2 * vt * vt * (1 + scalef(nf2, vgst) * lambda * vds) *
(first * first - second * second);
return cds;
}
Loading…
Cancel
Save