diff --git a/src/spicelib/devices/bsim3/b3check.c b/src/spicelib/devices/bsim3/b3check.c index 9997431d8..eb00bc5ad 100644 --- a/src/spicelib/devices/bsim3/b3check.c +++ b/src/spicelib/devices/bsim3/b3check.c @@ -41,19 +41,19 @@ FILE *fplog; fprintf(fplog, "Model = %s\n", model->BSIM3modName); if (pParam->BSIM3nlx < -pParam->BSIM3leff) - { fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n", - pParam->BSIM3nlx); - printf("Fatal: Nlx = %g is less than -Leff.\n", - pParam->BSIM3nlx); - Fatal_Flag = 1; + { fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n", + pParam->BSIM3nlx); + printf("Fatal: Nlx = %g is less than -Leff.\n", + pParam->BSIM3nlx); + Fatal_Flag = 1; } - if (model->BSIM3tox <= 0.0) - { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", - model->BSIM3tox); - printf("Fatal: Tox = %g is not positive.\n", model->BSIM3tox); - Fatal_Flag = 1; - } + if (model->BSIM3tox <= 0.0) + { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", + model->BSIM3tox); + printf("Fatal: Tox = %g is not positive.\n", model->BSIM3tox); + Fatal_Flag = 1; + } if (model->BSIM3toxm <= 0.0) { fprintf(fplog, "Fatal: Toxm = %g is not positive.\n", @@ -70,104 +70,104 @@ FILE *fplog; Fatal_Flag = 1; } - if (pParam->BSIM3npeak <= 0.0) - { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", - pParam->BSIM3npeak); - printf("Fatal: Nch = %g is not positive.\n", - pParam->BSIM3npeak); - Fatal_Flag = 1; - } - if (pParam->BSIM3nsub <= 0.0) - { fprintf(fplog, "Fatal: Nsub = %g is not positive.\n", - pParam->BSIM3nsub); - printf("Fatal: Nsub = %g is not positive.\n", - pParam->BSIM3nsub); - Fatal_Flag = 1; - } - if (pParam->BSIM3ngate < 0.0) - { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", - pParam->BSIM3ngate); - printf("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->BSIM3ngate); - Fatal_Flag = 1; - } - if (pParam->BSIM3ngate > 1.e25) - { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", - pParam->BSIM3ngate); - printf("Fatal: Ngate = %g Ngate is too high\n", - pParam->BSIM3ngate); - Fatal_Flag = 1; - } - if (pParam->BSIM3xj <= 0.0) - { fprintf(fplog, "Fatal: Xj = %g is not positive.\n", - pParam->BSIM3xj); - printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM3xj); - Fatal_Flag = 1; - } + if (pParam->BSIM3npeak <= 0.0) + { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", + pParam->BSIM3npeak); + printf("Fatal: Nch = %g is not positive.\n", + pParam->BSIM3npeak); + Fatal_Flag = 1; + } + if (pParam->BSIM3nsub <= 0.0) + { fprintf(fplog, "Fatal: Nsub = %g is not positive.\n", + pParam->BSIM3nsub); + printf("Fatal: Nsub = %g is not positive.\n", + pParam->BSIM3nsub); + Fatal_Flag = 1; + } + if (pParam->BSIM3ngate < 0.0) + { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", + pParam->BSIM3ngate); + printf("Fatal: Ngate = %g Ngate is not positive.\n", + pParam->BSIM3ngate); + Fatal_Flag = 1; + } + if (pParam->BSIM3ngate > 1.e25) + { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", + pParam->BSIM3ngate); + printf("Fatal: Ngate = %g Ngate is too high\n", + pParam->BSIM3ngate); + Fatal_Flag = 1; + } + if (pParam->BSIM3xj <= 0.0) + { fprintf(fplog, "Fatal: Xj = %g is not positive.\n", + pParam->BSIM3xj); + printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM3xj); + Fatal_Flag = 1; + } - if (pParam->BSIM3dvt1 < 0.0) - { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", - pParam->BSIM3dvt1); - printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM3dvt1); - Fatal_Flag = 1; - } - - if (pParam->BSIM3dvt1w < 0.0) - { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", - pParam->BSIM3dvt1w); - printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM3dvt1w); - Fatal_Flag = 1; - } - - if (pParam->BSIM3w0 == -pParam->BSIM3weff) - { fprintf(fplog, "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); - printf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; + if (pParam->BSIM3dvt1 < 0.0) + { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", + pParam->BSIM3dvt1); + printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM3dvt1); + Fatal_Flag = 1; + } + + if (pParam->BSIM3dvt1w < 0.0) + { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", + pParam->BSIM3dvt1w); + printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM3dvt1w); + Fatal_Flag = 1; + } + + if (pParam->BSIM3w0 == -pParam->BSIM3weff) + { fprintf(fplog, "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); + printf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); + Fatal_Flag = 1; } - if (pParam->BSIM3dsub < 0.0) - { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM3dsub); - printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM3dsub); - Fatal_Flag = 1; - } - if (pParam->BSIM3b1 == -pParam->BSIM3weff) - { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; + if (pParam->BSIM3dsub < 0.0) + { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM3dsub); + printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM3dsub); + Fatal_Flag = 1; + } + if (pParam->BSIM3b1 == -pParam->BSIM3weff) + { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + Fatal_Flag = 1; } if (pParam->BSIM3u0temp <= 0.0) - { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3u0temp); - printf("Fatal: u0 at current temperature = %g is not positive.\n", - pParam->BSIM3u0temp); - Fatal_Flag = 1; + { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3u0temp); + printf("Fatal: u0 at current temperature = %g is not positive.\n", + pParam->BSIM3u0temp); + Fatal_Flag = 1; } /* Check delta parameter */ if (pParam->BSIM3delta < 0.0) - { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", - pParam->BSIM3delta); - printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM3delta); - Fatal_Flag = 1; + { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", + pParam->BSIM3delta); + printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM3delta); + Fatal_Flag = 1; } - if (pParam->BSIM3vsattemp <= 0.0) - { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3vsattemp); - printf("Fatal: Vsat at current temperature = %g is not positive.\n", - pParam->BSIM3vsattemp); - Fatal_Flag = 1; - } + if (pParam->BSIM3vsattemp <= 0.0) + { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3vsattemp); + printf("Fatal: Vsat at current temperature = %g is not positive.\n", + pParam->BSIM3vsattemp); + Fatal_Flag = 1; + } /* Check Rout parameters */ - if (pParam->BSIM3pclm <= 0.0) - { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM3pclm); - printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM3pclm); - Fatal_Flag = 1; - } + if (pParam->BSIM3pclm <= 0.0) + { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM3pclm); + printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM3pclm); + Fatal_Flag = 1; + } - if (pParam->BSIM3drout < 0.0) - { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM3drout); - printf("Fatal: Drout = %g is negative.\n", pParam->BSIM3drout); - Fatal_Flag = 1; - } + if (pParam->BSIM3drout < 0.0) + { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM3drout); + printf("Fatal: Drout = %g is negative.\n", pParam->BSIM3drout); + Fatal_Flag = 1; + } if (pParam->BSIM3pscbe2 <= 0.0) { fprintf(fplog, "Warning: Pscbe2 = %g is not positive.\n", @@ -175,25 +175,25 @@ FILE *fplog; printf("Warning: Pscbe2 = %g is not positive.\n", pParam->BSIM3pscbe2); } - /* ACM model */ - if (model->BSIM3acmMod == 0) { - if (model->BSIM3unitLengthSidewallJctCap > 0.0 || - model->BSIM3unitLengthGateSidewallJctCap > 0.0) - { - if (here->BSIM3drainPerimeter < pParam->BSIM3weff) - { fprintf(fplog, "Warning: Pd = %g is less than W.\n", - here->BSIM3drainPerimeter); - printf("Warning: Pd = %g is less than W.\n", - here->BSIM3drainPerimeter); - } - if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) - { fprintf(fplog, "Warning: Ps = %g is less than W.\n", - here->BSIM3sourcePerimeter); - printf("Warning: Ps = %g is less than W.\n", - here->BSIM3sourcePerimeter); - } - } - } + /* ACM model */ + if (model->BSIM3acmMod == 0) { + if (model->BSIM3unitLengthSidewallJctCap > 0.0 || + model->BSIM3unitLengthGateSidewallJctCap > 0.0) + { + if (here->BSIM3drainPerimeter < pParam->BSIM3weff) + { fprintf(fplog, "Warning: Pd = %g is less than W.\n", + here->BSIM3drainPerimeter); + printf("Warning: Pd = %g is less than W.\n", + here->BSIM3drainPerimeter); + } + if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) + { fprintf(fplog, "Warning: Ps = %g is less than W.\n", + here->BSIM3sourcePerimeter); + printf("Warning: Ps = %g is less than W.\n", + here->BSIM3sourcePerimeter); + } + } + } if ((model->BSIM3calcacm > 0) && (model->BSIM3acmMod != 12)) { fprintf(fplog, "Warning: CALCACM = %d is wrong. Set back to 0.\n", @@ -233,9 +233,9 @@ FILE *fplog; /* Check capacitance parameters */ if (pParam->BSIM3clc < 0.0) - { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM3clc); - printf("Fatal: Clc = %g is negative.\n", pParam->BSIM3clc); - Fatal_Flag = 1; + { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM3clc); + printf("Fatal: Clc = %g is negative.\n", pParam->BSIM3clc); + Fatal_Flag = 1; } if (pParam->BSIM3moin < 5.0) @@ -249,160 +249,160 @@ FILE *fplog; printf("Warning: Moin = %g is too large.\n", pParam->BSIM3moin); } - if(model->BSIM3capMod ==3) { - if (pParam->BSIM3acde < 0.4) - { fprintf(fplog, "Warning: Acde = %g is too small.\n", - pParam->BSIM3acde); - printf("Warning: Acde = %g is too small.\n", pParam->BSIM3acde); - } - if (pParam->BSIM3acde > 1.6) - { fprintf(fplog, "Warning: Acde = %g is too large.\n", - pParam->BSIM3acde); - printf("Warning: Acde = %g is too large.\n", pParam->BSIM3acde); - } - } + if(model->BSIM3capMod ==3) { + if (pParam->BSIM3acde < 0.4) + { fprintf(fplog, "Warning: Acde = %g is too small.\n", + pParam->BSIM3acde); + printf("Warning: Acde = %g is too small.\n", pParam->BSIM3acde); + } + if (pParam->BSIM3acde > 1.6) + { fprintf(fplog, "Warning: Acde = %g is too large.\n", + pParam->BSIM3acde); + printf("Warning: Acde = %g is too large.\n", pParam->BSIM3acde); + } + } if (model->BSIM3paramChk ==1) { /* Check L and W parameters */ - if (pParam->BSIM3leff <= 5.0e-8) - { fprintf(fplog, "Warning: Leff = %g may be too small.\n", - pParam->BSIM3leff); - printf("Warning: Leff = %g may be too small.\n", - pParam->BSIM3leff); - } - - if (pParam->BSIM3leffCV <= 5.0e-8) - { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", - pParam->BSIM3leffCV); - printf("Warning: Leff for CV = %g may be too small.\n", - pParam->BSIM3leffCV); - } - + if (pParam->BSIM3leff <= 5.0e-8) + { fprintf(fplog, "Warning: Leff = %g may be too small.\n", + pParam->BSIM3leff); + printf("Warning: Leff = %g may be too small.\n", + pParam->BSIM3leff); + } + + if (pParam->BSIM3leffCV <= 5.0e-8) + { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", + pParam->BSIM3leffCV); + printf("Warning: Leff for CV = %g may be too small.\n", + pParam->BSIM3leffCV); + } + if (pParam->BSIM3weff <= 1.0e-7) - { fprintf(fplog, "Warning: Weff = %g may be too small.\n", - pParam->BSIM3weff); - printf("Warning: Weff = %g may be too small.\n", - pParam->BSIM3weff); - } - - if (pParam->BSIM3weffCV <= 1.0e-7) - { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", - pParam->BSIM3weffCV); - printf("Warning: Weff for CV = %g may be too small.\n", - pParam->BSIM3weffCV); - } - + { fprintf(fplog, "Warning: Weff = %g may be too small.\n", + pParam->BSIM3weff); + printf("Warning: Weff = %g may be too small.\n", + pParam->BSIM3weff); + } + + if (pParam->BSIM3weffCV <= 1.0e-7) + { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", + pParam->BSIM3weffCV); + printf("Warning: Weff for CV = %g may be too small.\n", + pParam->BSIM3weffCV); + } + /* Check threshold voltage parameters */ - if (pParam->BSIM3nlx < 0.0) - { fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->BSIM3nlx); - printf("Warning: Nlx = %g is negative.\n", pParam->BSIM3nlx); + if (pParam->BSIM3nlx < 0.0) + { fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->BSIM3nlx); + printf("Warning: Nlx = %g is negative.\n", pParam->BSIM3nlx); } - if (model->BSIM3tox < 1.0e-9) - { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n", - model->BSIM3tox); - printf("Warning: Tox = %g is less than 10A.\n", model->BSIM3tox); + if (model->BSIM3tox < 1.0e-9) + { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n", + model->BSIM3tox); + printf("Warning: Tox = %g is less than 10A.\n", model->BSIM3tox); } if (pParam->BSIM3npeak <= 1.0e15) - { fprintf(fplog, "Warning: Nch = %g may be too small.\n", - pParam->BSIM3npeak); - printf("Warning: Nch = %g may be too small.\n", - pParam->BSIM3npeak); - } - else if (pParam->BSIM3npeak >= 1.0e21) - { fprintf(fplog, "Warning: Nch = %g may be too large.\n", - pParam->BSIM3npeak); - printf("Warning: Nch = %g may be too large.\n", - pParam->BSIM3npeak); - } + { fprintf(fplog, "Warning: Nch = %g may be too small.\n", + pParam->BSIM3npeak); + printf("Warning: Nch = %g may be too small.\n", + pParam->BSIM3npeak); + } + else if (pParam->BSIM3npeak >= 1.0e21) + { fprintf(fplog, "Warning: Nch = %g may be too large.\n", + pParam->BSIM3npeak); + printf("Warning: Nch = %g may be too large.\n", + pParam->BSIM3npeak); + } - if (pParam->BSIM3nsub <= 1.0e14) - { fprintf(fplog, "Warning: Nsub = %g may be too small.\n", - pParam->BSIM3nsub); - printf("Warning: Nsub = %g may be too small.\n", - pParam->BSIM3nsub); - } - else if (pParam->BSIM3nsub >= 1.0e21) - { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", - pParam->BSIM3nsub); - printf("Warning: Nsub = %g may be too large.\n", - pParam->BSIM3nsub); - } + if (pParam->BSIM3nsub <= 1.0e14) + { fprintf(fplog, "Warning: Nsub = %g may be too small.\n", + pParam->BSIM3nsub); + printf("Warning: Nsub = %g may be too small.\n", + pParam->BSIM3nsub); + } + else if (pParam->BSIM3nsub >= 1.0e21) + { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", + pParam->BSIM3nsub); + printf("Warning: Nsub = %g may be too large.\n", + pParam->BSIM3nsub); + } - if ((pParam->BSIM3ngate > 0.0) && - (pParam->BSIM3ngate <= 1.e18)) - { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM3ngate); - printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM3ngate); - } + if ((pParam->BSIM3ngate > 0.0) && + (pParam->BSIM3ngate <= 1.e18)) + { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", + pParam->BSIM3ngate); + printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", + pParam->BSIM3ngate); + } if (pParam->BSIM3dvt0 < 0.0) - { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", - pParam->BSIM3dvt0); - printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM3dvt0); - } - - if (fabs(1.0e-6 / (pParam->BSIM3w0 + pParam->BSIM3weff)) > 10.0) - { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); - printf("Warning: (W0 + Weff) may be too small.\n"); + { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", + pParam->BSIM3dvt0); + printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM3dvt0); + } + + if (fabs(1.0e-6 / (pParam->BSIM3w0 + pParam->BSIM3weff)) > 10.0) + { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); + printf("Warning: (W0 + Weff) may be too small.\n"); } /* Check subthreshold parameters */ - if (pParam->BSIM3nfactor < 0.0) - { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", - pParam->BSIM3nfactor); - printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM3nfactor); - } - if (pParam->BSIM3cdsc < 0.0) - { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", - pParam->BSIM3cdsc); - printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM3cdsc); - } - if (pParam->BSIM3cdscd < 0.0) - { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", - pParam->BSIM3cdscd); - printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM3cdscd); - } + if (pParam->BSIM3nfactor < 0.0) + { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", + pParam->BSIM3nfactor); + printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM3nfactor); + } + if (pParam->BSIM3cdsc < 0.0) + { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", + pParam->BSIM3cdsc); + printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM3cdsc); + } + if (pParam->BSIM3cdscd < 0.0) + { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", + pParam->BSIM3cdscd); + printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM3cdscd); + } /* Check DIBL parameters */ - if (pParam->BSIM3eta0 < 0.0) - { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", - pParam->BSIM3eta0); - printf("Warning: Eta0 = %g is negative.\n", pParam->BSIM3eta0); - } - -/* Check Abulk parameters */ - if (fabs(1.0e-6 / (pParam->BSIM3b1 + pParam->BSIM3weff)) > 10.0) - { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); - printf("Warning: (B1 + Weff) may be too small.\n"); + if (pParam->BSIM3eta0 < 0.0) + { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", + pParam->BSIM3eta0); + printf("Warning: Eta0 = %g is negative.\n", pParam->BSIM3eta0); + } + +/* Check Abulk parameters */ + if (fabs(1.0e-6 / (pParam->BSIM3b1 + pParam->BSIM3weff)) > 10.0) + { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); + printf("Warning: (B1 + Weff) may be too small.\n"); } /* Check Saturation parameters */ - if (pParam->BSIM3a2 < 0.01) - { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3a2); - printf("Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->BSIM3a2); - pParam->BSIM3a2 = 0.01; - } - else if (pParam->BSIM3a2 > 1.0) - { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM3a2); - printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM3a2); - pParam->BSIM3a2 = 1.0; - pParam->BSIM3a1 = 0.0; - } + if (pParam->BSIM3a2 < 0.01) + { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3a2); + printf("Warning: A2 = %g is too small. Set to 0.01.\n", + pParam->BSIM3a2); + pParam->BSIM3a2 = 0.01; + } + else if (pParam->BSIM3a2 > 1.0) + { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", + pParam->BSIM3a2); + printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", + pParam->BSIM3a2); + pParam->BSIM3a2 = 1.0; + pParam->BSIM3a1 = 0.0; + } - if (pParam->BSIM3rdsw < 0.0) - { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM3rdsw); - printf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM3rdsw); - pParam->BSIM3rdsw = 0.0; - pParam->BSIM3rds0 = 0.0; - } + if (pParam->BSIM3rdsw < 0.0) + { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->BSIM3rdsw); + printf("Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->BSIM3rdsw); + pParam->BSIM3rdsw = 0.0; + pParam->BSIM3rds0 = 0.0; + } if (pParam->BSIM3rds0 < 0.0) { fprintf(fplog, "Warning: Rds at current temperature = %g is negative. Set to zero.\n", pParam->BSIM3rds0); @@ -411,40 +411,40 @@ FILE *fplog; pParam->BSIM3rds0 = 0.0; } - if (pParam->BSIM3vsattemp < 1.0e3) - { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp); - printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp); - } + if (pParam->BSIM3vsattemp < 1.0e3) + { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp); + printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp); + } - if (pParam->BSIM3pdibl1 < 0.0) - { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", - pParam->BSIM3pdibl1); - printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM3pdibl1); - } - if (pParam->BSIM3pdibl2 < 0.0) - { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", - pParam->BSIM3pdibl2); - printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM3pdibl2); - } + if (pParam->BSIM3pdibl1 < 0.0) + { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", + pParam->BSIM3pdibl1); + printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM3pdibl1); + } + if (pParam->BSIM3pdibl2 < 0.0) + { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", + pParam->BSIM3pdibl2); + printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM3pdibl2); + } /* Check overlap capacitance parameters */ if (model->BSIM3cgdo < 0.0) - { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo); - printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo); - model->BSIM3cgdo = 0.0; + { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo); + printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo); + model->BSIM3cgdo = 0.0; } if (model->BSIM3cgso < 0.0) - { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso); - printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso); - model->BSIM3cgso = 0.0; + { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso); + printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso); + model->BSIM3cgso = 0.0; } if (model->BSIM3cgbo < 0.0) - { fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo); - printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo); - model->BSIM3cgbo = 0.0; + { fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo); + printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo); + model->BSIM3cgbo = 0.0; } }/* loop for the parameter check for warning messages */ - fclose(fplog); + fclose(fplog); } else { fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n"); diff --git a/src/spicelib/devices/bsim3/b3ld.c b/src/spicelib/devices/bsim3/b3ld.c index df6958554..8d352d607 100644 --- a/src/spicelib/devices/bsim3/b3ld.c +++ b/src/spicelib/devices/bsim3/b3ld.c @@ -378,54 +378,54 @@ for (; model != NULL; model = model->BSIM3nextModel) /* Source/drain junction diode DC model begins */ Nvtm = model->BSIM3vtm * model->BSIM3jctEmissionCoeff; - /* acm model */ - if (model->BSIM3acmMod == 0) - { - if ((here->BSIM3sourceArea <= 0.0) && (here->BSIM3sourcePerimeter <= 0.0)) - { SourceSatCurrent = 1.0e-14; + /* acm model */ + if (model->BSIM3acmMod == 0) + { + if ((here->BSIM3sourceArea <= 0.0) && (here->BSIM3sourcePerimeter <= 0.0)) + { SourceSatCurrent = 1.0e-14; + } + else + { SourceSatCurrent = here->BSIM3sourceArea + * model->BSIM3jctTempSatCurDensity + + here->BSIM3sourcePerimeter + * model->BSIM3jctSidewallTempSatCurDensity; + } + if ((here->BSIM3drainArea <= 0.0) && (here->BSIM3drainPerimeter <= 0.0)) + { DrainSatCurrent = 1.0e-14; + } + else + { DrainSatCurrent = here->BSIM3drainArea + * model->BSIM3jctTempSatCurDensity + + here->BSIM3drainPerimeter + * model->BSIM3jctSidewallTempSatCurDensity; + } } else - { SourceSatCurrent = here->BSIM3sourceArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3sourcePerimeter - * model->BSIM3jctSidewallTempSatCurDensity; + { + error = ACM_saturationCurrents( + model->BSIM3acmMod, + model->BSIM3calcacm, + here->BSIM3geo, + model->BSIM3hdif, + model->BSIM3wmlt, + here->BSIM3w, + model->BSIM3xw, + model->BSIM3jctTempSatCurDensity, + model->BSIM3jctSidewallTempSatCurDensity, + here->BSIM3drainAreaGiven, + here->BSIM3drainArea, + here->BSIM3drainPerimeterGiven, + here->BSIM3drainPerimeter, + here->BSIM3sourceAreaGiven, + here->BSIM3sourceArea, + here->BSIM3sourcePerimeterGiven, + here->BSIM3sourcePerimeter, + &DrainSatCurrent, + &SourceSatCurrent + ); + if (error) + return(error); } - if ((here->BSIM3drainArea <= 0.0) && (here->BSIM3drainPerimeter <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } - else - { DrainSatCurrent = here->BSIM3drainArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3drainPerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } - } - else - { - error = ACM_saturationCurrents( - model->BSIM3acmMod, - model->BSIM3calcacm, - here->BSIM3geo, - model->BSIM3hdif, - model->BSIM3wmlt, - here->BSIM3w, - model->BSIM3xw, - model->BSIM3jctTempSatCurDensity, - model->BSIM3jctSidewallTempSatCurDensity, - here->BSIM3drainAreaGiven, - here->BSIM3drainArea, - here->BSIM3drainPerimeterGiven, - here->BSIM3drainPerimeter, - here->BSIM3sourceAreaGiven, - here->BSIM3sourceArea, - here->BSIM3sourcePerimeterGiven, - here->BSIM3sourcePerimeter, - &DrainSatCurrent, - &SourceSatCurrent - ); - if (error) - return(error); - } if (SourceSatCurrent <= 0.0) { here->BSIM3gbs = ckt->CKTgmin; @@ -2268,66 +2268,66 @@ finished: along gate side */ - if (model->BSIM3acmMod == 0) - { - czbd = model->BSIM3unitAreaTempJctCap * here->BSIM3drainArea; /*bug fix */ - czbs = model->BSIM3unitAreaTempJctCap * here->BSIM3sourceArea; - if (here->BSIM3drainPerimeter < pParam->BSIM3weff) + if (model->BSIM3acmMod == 0) { - czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap - * here->BSIM3drainPerimeter; - czbdsw = 0.0; + czbd = model->BSIM3unitAreaTempJctCap * here->BSIM3drainArea; /*bug fix */ + czbs = model->BSIM3unitAreaTempJctCap * here->BSIM3sourceArea; + if (here->BSIM3drainPerimeter < pParam->BSIM3weff) + { + czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap + * here->BSIM3drainPerimeter; + czbdsw = 0.0; + } + else + { + czbdsw = model->BSIM3unitLengthSidewallTempJctCap + * (here->BSIM3drainPerimeter - pParam->BSIM3weff); + czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap + * pParam->BSIM3weff; + } + if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) + { + czbssw = 0.0; + czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap + * here->BSIM3sourcePerimeter; + } + else + { + czbssw = model->BSIM3unitLengthSidewallTempJctCap + * (here->BSIM3sourcePerimeter - pParam->BSIM3weff); + czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap + * pParam->BSIM3weff; + } + } else { + error = ACM_junctionCapacitances( + model->BSIM3acmMod, + model->BSIM3calcacm, + here->BSIM3geo, + model->BSIM3hdif, + model->BSIM3wmlt, + here->BSIM3w, + model->BSIM3xw, + here->BSIM3drainAreaGiven, + here->BSIM3drainArea, + here->BSIM3drainPerimeterGiven, + here->BSIM3drainPerimeter, + here->BSIM3sourceAreaGiven, + here->BSIM3sourceArea, + here->BSIM3sourcePerimeterGiven, + here->BSIM3sourcePerimeter, + model->BSIM3unitAreaTempJctCap, + model->BSIM3unitLengthSidewallTempJctCap, + model->BSIM3unitLengthGateSidewallJctCap, + &czbd, + &czbdsw, + &czbdswg, + &czbs, + &czbssw, + &czbsswg + ); + if (error) + return(error); } - else - { - czbdsw = model->BSIM3unitLengthSidewallTempJctCap - * (here->BSIM3drainPerimeter - pParam->BSIM3weff); - czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap - * pParam->BSIM3weff; - } - if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) - { - czbssw = 0.0; - czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap - * here->BSIM3sourcePerimeter; - } - else - { - czbssw = model->BSIM3unitLengthSidewallTempJctCap - * (here->BSIM3sourcePerimeter - pParam->BSIM3weff); - czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap - * pParam->BSIM3weff; - } - } else { - error = ACM_junctionCapacitances( - model->BSIM3acmMod, - model->BSIM3calcacm, - here->BSIM3geo, - model->BSIM3hdif, - model->BSIM3wmlt, - here->BSIM3w, - model->BSIM3xw, - here->BSIM3drainAreaGiven, - here->BSIM3drainArea, - here->BSIM3drainPerimeterGiven, - here->BSIM3drainPerimeter, - here->BSIM3sourceAreaGiven, - here->BSIM3sourceArea, - here->BSIM3sourcePerimeterGiven, - here->BSIM3sourcePerimeter, - model->BSIM3unitAreaTempJctCap, - model->BSIM3unitLengthSidewallTempJctCap, - model->BSIM3unitLengthGateSidewallJctCap, - &czbd, - &czbdsw, - &czbdswg, - &czbs, - &czbssw, - &czbsswg - ); - if (error) - return(error); - } MJ = model->BSIM3bulkJctBotGradingCoeff; MJSW = model->BSIM3bulkJctSideGradingCoeff; diff --git a/src/spicelib/devices/bsim3/b3mpar.c b/src/spicelib/devices/bsim3/b3mpar.c index f43325ed8..cbf579682 100644 --- a/src/spicelib/devices/bsim3/b3mpar.c +++ b/src/spicelib/devices/bsim3/b3mpar.c @@ -55,7 +55,7 @@ GENmodel *inMod) mod->BSIM3acnqsMod = value->iValue; mod->BSIM3acnqsModGiven = TRUE; break; - case BSIM3_MOD_VERSION : + case BSIM3_MOD_VERSION : mod->BSIM3version = value->sValue; mod->BSIM3versionGiven = TRUE; break; @@ -131,14 +131,14 @@ GENmodel *inMod) case BSIM3_MOD_NPEAK: mod->BSIM3npeak = value->rValue; mod->BSIM3npeakGiven = TRUE; - if (mod->BSIM3npeak > 1.0e20) - mod->BSIM3npeak *= 1.0e-6; + if (mod->BSIM3npeak > 1.0e20) + mod->BSIM3npeak *= 1.0e-6; break; case BSIM3_MOD_NGATE: mod->BSIM3ngate = value->rValue; mod->BSIM3ngateGiven = TRUE; - if (mod->BSIM3ngate > 1.0e23) - mod->BSIM3ngate *= 1.0e-6; + if (mod->BSIM3ngate > 1.0e23) + mod->BSIM3ngate *= 1.0e-6; break; case BSIM3_MOD_GAMMA1: mod->BSIM3gamma1 = value->rValue; @@ -480,7 +480,7 @@ GENmodel *inMod) mod->BSIM3wmltGiven = TRUE; break; - /* Length dependence */ + /* Length dependence */ case BSIM3_MOD_LCDSC : mod->BSIM3lcdsc = value->rValue; mod->BSIM3lcdscGiven = TRUE; @@ -544,14 +544,14 @@ GENmodel *inMod) case BSIM3_MOD_LNPEAK: mod->BSIM3lnpeak = value->rValue; mod->BSIM3lnpeakGiven = TRUE; - if (mod->BSIM3lnpeak > 1.0e20) - mod->BSIM3lnpeak *= 1.0e-6; + if (mod->BSIM3lnpeak > 1.0e20) + mod->BSIM3lnpeak *= 1.0e-6; break; case BSIM3_MOD_LNGATE: mod->BSIM3lngate = value->rValue; mod->BSIM3lngateGiven = TRUE; - if (mod->BSIM3lngate > 1.0e23) - mod->BSIM3lngate *= 1.0e-6; + if (mod->BSIM3lngate > 1.0e23) + mod->BSIM3lngate *= 1.0e-6; break; case BSIM3_MOD_LGAMMA1: mod->BSIM3lgamma1 = value->rValue; @@ -823,7 +823,7 @@ GENmodel *inMod) mod->BSIM3lvoffcvGiven = TRUE; break; - /* Width dependence */ + /* Width dependence */ case BSIM3_MOD_WCDSC : mod->BSIM3wcdsc = value->rValue; mod->BSIM3wcdscGiven = TRUE; @@ -887,14 +887,14 @@ GENmodel *inMod) case BSIM3_MOD_WNPEAK: mod->BSIM3wnpeak = value->rValue; mod->BSIM3wnpeakGiven = TRUE; - if (mod->BSIM3wnpeak > 1.0e20) - mod->BSIM3wnpeak *= 1.0e-6; + if (mod->BSIM3wnpeak > 1.0e20) + mod->BSIM3wnpeak *= 1.0e-6; break; case BSIM3_MOD_WNGATE: mod->BSIM3wngate = value->rValue; mod->BSIM3wngateGiven = TRUE; - if (mod->BSIM3wngate > 1.0e23) - mod->BSIM3wngate *= 1.0e-6; + if (mod->BSIM3wngate > 1.0e23) + mod->BSIM3wngate *= 1.0e-6; break; case BSIM3_MOD_WGAMMA1: mod->BSIM3wgamma1 = value->rValue; @@ -1166,7 +1166,7 @@ GENmodel *inMod) mod->BSIM3wvoffcvGiven = TRUE; break; - /* Cross-term dependence */ + /* Cross-term dependence */ case BSIM3_MOD_PCDSC : mod->BSIM3pcdsc = value->rValue; mod->BSIM3pcdscGiven = TRUE; @@ -1230,14 +1230,14 @@ GENmodel *inMod) case BSIM3_MOD_PNPEAK: mod->BSIM3pnpeak = value->rValue; mod->BSIM3pnpeakGiven = TRUE; - if (mod->BSIM3pnpeak > 1.0e20) - mod->BSIM3pnpeak *= 1.0e-6; + if (mod->BSIM3pnpeak > 1.0e20) + mod->BSIM3pnpeak *= 1.0e-6; break; case BSIM3_MOD_PNGATE: mod->BSIM3pngate = value->rValue; mod->BSIM3pngateGiven = TRUE; - if (mod->BSIM3pngate > 1.0e23) - mod->BSIM3pngate *= 1.0e-6; + if (mod->BSIM3pngate > 1.0e23) + mod->BSIM3pngate *= 1.0e-6; break; case BSIM3_MOD_PGAMMA1: mod->BSIM3pgamma1 = value->rValue; diff --git a/src/spicelib/devices/bsim3/b3temp.c b/src/spicelib/devices/bsim3/b3temp.c index 627d99749..b8632e1a6 100644 --- a/src/spicelib/devices/bsim3/b3temp.c +++ b/src/spicelib/devices/bsim3/b3temp.c @@ -807,39 +807,39 @@ int Size_Not_Found, error; * pParam->BSIM3weffCV * pParam->BSIM3leffCV * T0); /* process source/drain series resistance */ - /* ACM model */ - if (model->BSIM3acmMod == 0) - { - here->BSIM3drainConductance = model->BSIM3sheetResistance - * here->BSIM3drainSquares; - here->BSIM3sourceConductance = model->BSIM3sheetResistance - * here->BSIM3sourceSquares; - } - else /* ACM > 0 */ - { - error = ACM_SourceDrainResistances( - model->BSIM3acmMod, - model->BSIM3ld, - model->BSIM3ldif, - model->BSIM3hdif, - model->BSIM3wmlt, - here->BSIM3w, - model->BSIM3xw, - model->BSIM3sheetResistance, - here->BSIM3drainSquaresGiven, - model->BSIM3rd, - model->BSIM3rdc, - here->BSIM3drainSquares, - here->BSIM3sourceSquaresGiven, - model->BSIM3rs, - model->BSIM3rsc, - here->BSIM3sourceSquares, - &(here->BSIM3drainConductance), - &(here->BSIM3sourceConductance) - ); - if (error) - return(error); - } + /* ACM model */ + if (model->BSIM3acmMod == 0) + { + here->BSIM3drainConductance = model->BSIM3sheetResistance + * here->BSIM3drainSquares; + here->BSIM3sourceConductance = model->BSIM3sheetResistance + * here->BSIM3sourceSquares; + } + else /* ACM > 0 */ + { + error = ACM_SourceDrainResistances( + model->BSIM3acmMod, + model->BSIM3ld, + model->BSIM3ldif, + model->BSIM3hdif, + model->BSIM3wmlt, + here->BSIM3w, + model->BSIM3xw, + model->BSIM3sheetResistance, + here->BSIM3drainSquaresGiven, + model->BSIM3rd, + model->BSIM3rdc, + here->BSIM3drainSquares, + here->BSIM3sourceSquaresGiven, + model->BSIM3rs, + model->BSIM3rsc, + here->BSIM3sourceSquares, + &(here->BSIM3drainConductance), + &(here->BSIM3sourceConductance) + ); + if (error) + return(error); + } if (here->BSIM3drainConductance > 0.0) here->BSIM3drainConductance = 1.0 / here->BSIM3drainConductance;