diff --git a/src/spicelib/devices/vdmos/vdmosload.c b/src/spicelib/devices/vdmos/vdmosload.c index d34c5d089..453623a37 100644 --- a/src/spicelib/devices/vdmos/vdmosload.c +++ b/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; }