var redifinition removed

This commit is contained in:
Holger Vogt 2020-04-25 19:35:41 +02:00
parent a10be03c75
commit f2e749e821
3 changed files with 121 additions and 119 deletions

View File

@ -431,8 +431,8 @@ next1: if(vbs <= -3*vt) {
*
*/
double arg;
double sarg;
double arg1;
double sarg1;
double a4[4],b4[4],x4[8],poly4[8];
double beta1;
double dsrgdb;
@ -569,15 +569,15 @@ next1: if(vbs <= -3*vt) {
*/
if (lvbs <= 0.0) {
sarg = sqrt(phiMinVbs);
dsrgdb = -0.5/sarg;
sarg1 = sqrt(phiMinVbs);
dsrgdb = -0.5/sarg1;
d2sdb2 = 0.5*dsrgdb/phiMinVbs;
} else {
sphi = sqrt(here->MOS2tPhi);
sphi3 = here->MOS2tPhi*sphi;
sarg = sphi/(1.0+0.5*lvbs/here->MOS2tPhi);
tmp = sarg/sphi3;
dsrgdb = -0.5*sarg*tmp;
sarg1 = sphi/(1.0+0.5*lvbs/here->MOS2tPhi);
tmp = sarg1/sphi3;
dsrgdb = -0.5*sarg1*tmp;
d2sdb2 = -dsrgdb*tmp;
}
if ((lvbs-lvds) <= 0) {
@ -606,7 +606,7 @@ next1: if(vbs <= -3*vt) {
if ((model->MOS2gamma > 0.0) ||
(model->MOS2substrateDoping > 0.0)) {
xwd = model->MOS2xd*barg;
xws = model->MOS2xd*sarg;
xws = model->MOS2xd*sarg1;
/*
* short-channel effect with vds .ne. 0.0
@ -655,14 +655,14 @@ next1: if(vbs <= -3*vt) {
dgdvds = 0.0;
dgddb2 = 0.0;
}
von = vbin+gamasd*sarg;
von = vbin+gamasd*sarg1;
vth = von;
vdsat = 0.0;
if (model->MOS2fastSurfaceStateDensity != 0.0 && OxideCap != 0.0) {
/* XXX constant per model */
cfs = CHARGE*model->MOS2fastSurfaceStateDensity*
1e4 /*(cm**2/m**2)*/;
cdonco = -(gamasd*dsrgdb+dgddvb*sarg)+factor;
cdonco = -(gamasd*dsrgdb+dgddvb*sarg1)+factor;
xn = 1.0+cfs/OxideCap*here->MOS2m*
here->MOS2w*EffectiveLength+cdonco;
@ -686,20 +686,20 @@ next1: if(vbs <= -3*vt) {
* compute some more useful quantities
*/
sarg3 = sarg*sarg*sarg;
sarg3 = sarg1*sarg1*sarg1;
/* XXX constant per model */
sbiarg = sqrt(here->MOS2tBulkPot);
gammad = gamasd;
dgdvbs = dgddvb;
body = barg*barg*barg-sarg3;
gdbdv = 2.0*gammad*(barg*barg*dbrgdb-sarg*sarg*dsrgdb);
dodvbs = -factor+dgdvbs*sarg+gammad*dsrgdb;
gdbdv = 2.0*gammad*(barg*barg*dbrgdb-sarg1*sarg1*dsrgdb);
dodvbs = -factor+dgdvbs*sarg1+gammad*dsrgdb;
if (model->MOS2fastSurfaceStateDensity == 0.0) goto line400;
if (OxideCap == 0.0) goto line410;
dxndvb = 2.0*dgdvbs*dsrgdb+gammad*d2sdb2+dgddb2*sarg;
dxndvb = 2.0*dgdvbs*dsrgdb+gammad*d2sdb2+dgddb2*sarg1;
dodvbs = dodvbs+vt*dxndvb;
dxndvd = dgdvds*dsrgdb;
dodvds = dgdvds*sarg+vt*dxndvd;
dodvds = dgdvds*sarg1+vt*dxndvd;
/*
* evaluate effective mobility and its derivatives
*/
@ -740,12 +740,12 @@ line500:
dsdvgs = 0.0;
dsdvbs = 0.0;
} else {
arg = sqrt(1.0+4.0*argv/gammd2);
vdsat = (vgsx-vbin)/eta+gammd2*(1.0-arg)/2.0;
arg1 = sqrt(1.0+4.0*argv/gammd2);
vdsat = (vgsx-vbin)/eta+gammd2*(1.0-arg1)/2.0;
vdsat = MAX(vdsat,0.0);
dsdvgs = (1.0-1.0/arg)/eta;
dsdvbs = (gammad*(1.0-arg)+2.0*argv/(gammad*arg))/
eta*dgdvbs+1.0/arg+factor*dsdvgs;
dsdvgs = (1.0-1.0/arg1)/eta;
dsdvbs = (gammad*(1.0-arg1)+2.0*argv/(gammad*arg1))/
eta*dgdvbs+1.0/arg1+factor*dsdvgs;
}
} else {
vdsat = (vgsx-vbin)/eta;
@ -838,15 +838,15 @@ line500:
dbsrdb = -0.5*bsarg*bsarg/sphi3;
}
bodys = bsarg*bsarg*bsarg-sarg3;
gdbdvs = 2.0*gammad*(bsarg*bsarg*dbsrdb-sarg*sarg*dsrgdb);
gdbdvs = 2.0*gammad*(bsarg*bsarg*dbsrdb-sarg1*sarg1*dsrgdb);
if (model->MOS2maxDriftVel <= 0) {
if (model->MOS2substrateDoping == 0.0) goto line610;
if (xlamda > 0.0) goto line610;
argv = (lvds-vdsat)/4.0;
sargv = sqrt(1.0+argv*argv);
arg = sqrt(argv+sargv);
arg1 = sqrt(argv+sargv);
xlfact = model->MOS2xd/(EffectiveLength*lvds);
xlamda = xlfact*arg;
xlamda = xlfact*arg1;
dldsat = lvds*xlamda/(8.0*sargv);
} else {
argv = (vgsx-vbin)/eta-vdsat;
@ -915,13 +915,13 @@ line610:
goto line1050;
}
here->MOS2gds = beta1*(von-vbin-gammad*sarg)*exp(argg*
here->MOS2gds = beta1*(von-vbin-gammad*sarg1)*exp(argg*
(lvgs-von));
goto line1050;
}
here->MOS2gds = beta1*(lvgs-vbin-gammad*sarg);
here->MOS2gds = beta1*(lvgs-vbin-gammad*sarg1);
goto line1050;
}
@ -971,25 +971,25 @@ line900:
* linear region
*/
cdrain = beta1*((lvgs-vbin-eta*lvds/2.0)*lvds-gammad*body/1.5);
arg = cdrain*(dudvgs/ufact-dldvgs/clfact);
here->MOS2gm = arg+beta1*lvds;
arg = cdrain*(dudvds/ufact-dldvds/clfact);
here->MOS2gds = arg+beta1*(lvgs-vbin-eta*
arg1 = cdrain*(dudvgs/ufact-dldvgs/clfact);
here->MOS2gm = arg1+beta1*lvds;
arg1 = cdrain*(dudvds/ufact-dldvds/clfact);
here->MOS2gds = arg1+beta1*(lvgs-vbin-eta*
lvds-gammad*barg-dgdvds*body/1.5);
arg = cdrain*(dudvbs/ufact-dldvbs/clfact);
here->MOS2gmbs = arg-beta1*(gdbdv+dgdvbs*body/1.5-factor*lvds);
arg1 = cdrain*(dudvbs/ufact-dldvbs/clfact);
here->MOS2gmbs = arg1-beta1*(gdbdv+dgdvbs*body/1.5-factor*lvds);
} else {
/*
* saturation region
*/
cdrain = beta1*((lvgs-vbin-eta*
vdsat/2.0)*vdsat-gammad*bodys/1.5);
arg = cdrain*(dudvgs/ufact-dldvgs/clfact);
here->MOS2gm = arg+beta1*vdsat+beta1*(lvgs-
arg1 = cdrain*(dudvgs/ufact-dldvgs/clfact);
here->MOS2gm = arg1+beta1*vdsat+beta1*(lvgs-
vbin-eta*vdsat-gammad*bsarg)*dsdvgs;
here->MOS2gds = -cdrain*dldvds/clfact-beta1*dgdvds*bodys/1.5;
arg = cdrain*(dudvbs/ufact-dldvbs/clfact);
here->MOS2gmbs = arg-beta1*(gdbdvs+dgdvbs*bodys/1.5-factor*
arg1 = cdrain*(dudvbs/ufact-dldvbs/clfact);
here->MOS2gmbs = arg1-beta1*(gdbdvs+dgdvbs*bodys/1.5-factor*
vdsat)+beta1* (lvgs-vbin-eta*vdsat-gammad*bsarg)*dsdvbs;
}
/*

View File

@ -464,8 +464,8 @@ next1: if(vbs <= -3*vt) {
/* the following 14 variables are local to this code block until
* it is obvious that they can be made global
*/
double arg;
double sarg;
double arg1;
double sarg1;
double vgon;
double vdshere, vbsvbd;
double idsat, lambda, vonbm = 0.0;
@ -473,14 +473,14 @@ next1: if(vbs <= -3*vt) {
vbsvbd = (here->MOS6mode==1?vbs:vbd);
if (vbsvbd <= 0 ) {
sarg = sqrt(here->MOS6tPhi - vbsvbd);
sarg1 = sqrt(here->MOS6tPhi - vbsvbd);
} else {
sarg = sqrt(here->MOS6tPhi);
sarg = sarg - vbsvbd / (sarg+sarg);
sarg = MAX(0,sarg);
sarg1 = sqrt(here->MOS6tPhi);
sarg1 = sarg1 - vbsvbd / (sarg1+sarg1);
sarg1 = MAX(0,sarg1);
}
vdshere = vds * here->MOS6mode;
von=(here->MOS6tVbi*model->MOS6type)+model->MOS6gamma*sarg
von=(here->MOS6tVbi*model->MOS6type)+model->MOS6gamma*sarg1
- model->MOS6gamma1 * vbsvbd
- model->MOS6sigma * vdshere;
vgon = (here->MOS6mode==1?vgs:vgd) - von;
@ -496,20 +496,20 @@ next1: if(vbs <= -3*vt) {
here->MOS6gmbs=0;
} else {
if (sarg <= 0) {
arg=0;
if (sarg1 <= 0) {
arg1=0;
} else {
if ((here->MOS6mode==1?vbs:vbd) <= 0 ) {
vonbm = model->MOS6gamma1
+ model->MOS6gamma / (sarg + sarg);
+ model->MOS6gamma / (sarg1 + sarg1);
} else {
vonbm = model->MOS6gamma1
+ model->MOS6gamma / 2 / sqrt(here->MOS6tPhi);
}
}
sarg = log(vgon);
vdsat = model->MOS6kv * exp(sarg * model->MOS6nv);
idsat = betac * exp(sarg * model->MOS6nc);
sarg1 = log(vgon);
vdsat = model->MOS6kv * exp(sarg1 * model->MOS6nv);
idsat = betac * exp(sarg1 * model->MOS6nc);
lambda = model->MOS6lamda0 - model->MOS6lamda1 * vbsvbd;
/*
* saturation region

View File

@ -571,24 +571,24 @@ Gaussian_Elimination1(int dims)
return(1);
}
static double
root3(double a1, double a2, double a3, double x)
static double root3(double a1_in, double a2_in, double a3_in, double x)
{
double t1, t2;
t1 = x*x*x + a1*x*x + a2*x + a3;
t2 = 3.0*x*x + 2.0*a1*x + a2;
t1 = x*x*x + a1_in*x*x + a2_in*x + a3_in;
t2 = 3.0*x*x + 2.0*a1_in*x + a2_in;
return(x - t1 / t2);
}
static int
div3(double a1, double a2, double a3, double x, double *p1, double *p2)
div3(double a1_in, double a2_in, double a3_in,
double x, double *p1_in, double *p2_in)
{
NG_IGNORE(a2);
NG_IGNORE(a2_in);
*p1 = a1 + x;
*p2 = - a3 / x;
*p1_in = a1_in + x;
*p2_in = -a3_in / x;
return(1);
}
@ -656,8 +656,8 @@ static double f2(a, b, z)
}
***/
static int
mac(double at, double bt, double *b1, double *b2, double *b3, double *b4, double *b5)
static int mac(double at, double bt, double *b1_in, double *b2_in,
double *b3_in, double *b4_in, double *b5_in)
/* float at, bt; */
{
double a, b;
@ -666,7 +666,7 @@ mac(double at, double bt, double *b1, double *b2, double *b3, double *b4, double
a = at;
b = bt;
y1 = *b1 = 0.5 * (a - b);
y1 = *b1_in = 0.5 * (a - b);
y2 = 0.5 * (3.0 * b * b - 2.0 * a * b - a * a) * y1 / (a - b);
y3 = ((3.0 * b * b + a * a) * y1 * y1 + 0.5 * (3.0 * b * b
- 2.0 * a * b - a * a) * y2) / (a - b);
@ -678,12 +678,12 @@ mac(double at, double bt, double *b1, double *b2, double *b3, double *b4, double
(y2 * y2 + y1 * y3) + (3.0 * b * b + a * a) * y1 * y3 +
0.5 * (3.0 * b * b - 2.0 * a * b - a * a) * y4) / (a - b);
*b2 = y2 / 2.0;
*b3 = y3 / 6.0;
*b4 = y4 / 24.0;
*b5 = y5 / 120.0;
*b2_in = y2 / 2.0;
*b3_in = y3 / 6.0;
*b4_in = y4 / 24.0;
*b5_in = y5 / 120.0;
return(1);
return 1;
}
@ -705,19 +705,18 @@ static double exp_approx1(double st)
}
***/
static int
get_c(double eq1, double eq2, double eq3, double ep1, double ep2, double a, double b,
double *cr, double *ci)
static int get_c(double eq1_in, double eq2_in, double eq3_in,
double ep1_in, double ep2_in, double a, double b, double *cr, double *ci)
{
double d, n;
d = (3.0*(a*a-b*b)+2.0*ep1*a+ep2)*(3.0*(a*a-b*b)+2.0*ep1*a+ep2);
d += (6.0*a*b+2.0*ep1*b)*(6.0*a*b+2.0*ep1*b);
n = -(eq1*(a*a-b*b)+eq2*a+eq3)*(6.0*a*b+2.0*ep1*b);
n += (2.0*eq1*a*b+eq2*b)*(3.0*(a*a-b*b)+2.0*ep1*a+ep2);
d = (3.0*(a*a-b*b)+2.0*ep1_in*a+ep2_in)*(3.0*(a*a-b*b)+2.0*ep1_in*a+ep2_in);
d += (6.0*a*b+2.0*ep1_in*b)*(6.0*a*b+2.0*ep1_in*b);
n = -(eq1_in*(a*a-b*b)+eq2_in*a+eq3_in)*(6.0*a*b+2.0*ep1_in*b);
n += (2.0*eq1_in*a*b+eq2_in*b)*(3.0*(a*a-b*b)+2.0*ep1_in*a+ep2_in);
*ci = n/d;
n = (3.0*(a*a-b*b)+2.0*ep1*a+ep2)*(eq1*(a*a-b*b)+eq2*a+eq3);
n += (6.0*a*b+2.0*ep1*b)*(2.0*eq1*a*b+eq2*b);
n = (3.0*(a*a-b*b)+2.0*ep1_in*a+ep2_in)*(eq1_in*(a*a-b*b)+eq2_in*a+eq3_in);
n += (6.0*a*b+2.0*ep1_in*b)*(2.0*eq1_in*a*b+eq2_in*b);
*cr = n/d;
return(1);
@ -947,41 +946,44 @@ exp_div3(double a1, double a2, double a3, double x,
/***
***/
static int
exp_find_roots(double a1, double a2, double a3, double *ex1, double *ex2, double *ex3)
static int exp_find_roots(double a1_in, double a2_in, double a3_in,
double *ex1_in, double *ex2_in, double *ex3_in)
{
double x, t;
double p, q;
q = (a1*a1-3.0*a2) / 9.0;
p = (2.0*a1*a1*a1-9.0*a1*a2+27.0*a3) / 54.0;
q = (a1_in*a1_in-3.0*a2_in) / 9.0;
p = (2.0*a1_in*a1_in*a1_in-9.0*a1_in*a2_in+27.0*a3_in) / 54.0;
t = q*q*q - p*p;
if (t >= 0.0) {
t = acos(p /(q * sqrt(q)));
x = -2.0*sqrt(q)*cos(t / 3.0) - a1/3.0;
x = -2.0*sqrt(q)*cos(t / 3.0) - a1_in/3.0;
} else {
if (p > 0.0) {
t = pow(sqrt(-t)+p, 1.0 / 3.0);
x = -(t + q / t) - a1/3.0;
x = -(t + q / t) - a1_in/3.0;
} else if (p == 0.0) {
x = -a1/3.0;
x = -a1_in/3.0;
} else {
t = pow(sqrt(-t)-p, 1.0 / 3.0);
x = (t + q / t) - a1/3.0;
x = (t + q / t) - a1_in/3.0;
}
}
{
double ex1;
int i = 0;
ex1 = x;
for (t = root3(a1, a2, a3, x); ABS(t-x) > 5.0e-4;
t = root3(a1, a2, a3, x))
if (++i == 32) {
x = ex1;
break;
} else
x = t;
}
{
double ex1a;
int i = 0;
ex1a = x;
for (t = root3(a1_in, a2_in, a3_in, x); ABS(t-x) > 5.0e-4;
t = root3(a1_in, a2_in, a3_in, x)) {
if (++i == 32) {
x = ex1a;
break;
}
else {
x = t;
}
}
}
/***
x = a1;
for (t = root3(a1, a2, a3, x); ABS(t-x) > epsi2;
@ -997,24 +999,24 @@ exp_find_roots(double a1, double a2, double a3, double *ex1, double *ex2, double
}
}
***/
*ex1 = x;
div3(a1, a2, a3, x, &a1, &a2);
*ex1_in = x;
div3(a1_in, a2_in, a3_in, x, &a1_in, &a2_in);
t = a1 * a1 - 4.0 * a2;
t = a1_in * a1_in - 4.0 * a2_in;
if (t < 0) {
ifImg = 1;
printf("***** Two Imaginary Roots.\n");
*ex3 = 0.5 * sqrt(-t);
*ex2 = -0.5 * a1;
*ex3_in = 0.5 * sqrt(-t);
*ex2_in = -0.5 * a1_in;
} else {
ifImg = 0;
t *= 1.0e-16;
t = sqrt(t)*1.0e8;
if (a1 >= 0.0)
*ex2 = t = -0.5 * (a1 + t);
if (a1_in >= 0.0)
*ex2_in = t = -0.5 * (a1_in + t);
else
*ex2 = t = -0.5 * (a1 - t);
*ex3 = a2 / t;
*ex2_in = t = -0.5 * (a1_in - t);
*ex3_in = a2_in / t;
/*
*ex2 = 0.5 * (-a1 + t);
*ex3 = 0.5 * (-a1 - t);
@ -1095,34 +1097,34 @@ static NODE
return(n);
}
static int
find_roots(double a1, double a2, double a3, double *x1, double *x2, double *x3)
static int find_roots(double a1_in, double a2_in, double a3_in,
double *x1r, double *x2r, double *x3r)
{
double x, t;
double p, q;
q = (a1*a1-3.0*a2) / 9.0;
p = (2.0*a1*a1*a1-9.0*a1*a2+27.0*a3) / 54.0;
q = (a1_in*a1_in-3.0*a2_in) / 9.0;
p = (2.0*a1_in*a1_in*a1_in-9.0*a1_in*a2_in+27.0*a3_in) / 54.0;
t = q*q*q - p*p;
if (t >= 0.0) {
t = acos(p /(q * sqrt(q)));
x = -2.0*sqrt(q)*cos(t / 3.0) - a1/3.0;
x = -2.0*sqrt(q)*cos(t / 3.0) - a1_in/3.0;
} else {
if (p > 0.0) {
t = pow(sqrt(-t)+p, 1.0 / 3.0);
x = -(t + q / t) - a1/3.0;
x = -(t + q / t) - a1_in/3.0;
} else if (p == 0.0) {
x = -a1/3.0;
x = -a1_in/3.0;
} else {
t = pow(sqrt(-t)-p, 1.0 / 3.0);
x = (t + q / t) - a1/3.0;
x = (t + q / t) - a1_in/3.0;
}
}
{
double x_backup = x;
int i = 0;
for (t = root3(a1, a2, a3, x); ABS(t-x) > 5.0e-4;
t = root3(a1, a2, a3, x))
for (t = root3(a1_in, a2_in, a3_in, x); ABS(t-x) > 5.0e-4;
t = root3(a1_in, a2_in, a3_in, x))
if (++i == 32) {
x = x_backup;
break;
@ -1147,10 +1149,10 @@ find_roots(double a1, double a2, double a3, double *x1, double *x2, double *x3)
}
*/
*x1 = x;
div3(a1, a2, a3, x, &a1, &a2);
*x1r = x;
div3(a1_in, a2_in, a3_in, x, &a1_in, &a2_in);
t = a1 * a1 - 4.0 * a2;
t = a1_in * a1_in - 4.0 * a2_in;
if (t < 0) {
printf("***** Two Imaginary Roots in Characteristic Admittance.\n");
controlled_exit(EXIT_FAILURE);
@ -1158,11 +1160,11 @@ find_roots(double a1, double a2, double a3, double *x1, double *x2, double *x3)
t *= 1.0e-18;
t = sqrt(t) * 1.0e9;
if (a1 >= 0.0)
*x2 = t = -0.5 * (a1 + t);
if (a1_in >= 0.0)
*x2r = t = -0.5 * (a1_in + t);
else
*x2 = t = -0.5 * (a1 - t);
*x3 = a2 / t;
*x2r = t = -0.5 * (a1_in - t);
*x3r = a2_in / t;
/*
*x2 = 0.5 * (-a1 + t);
*x3 = 0.5 * (-a1 - t);