Browse Source

Fast version checks in BSIM4.

pre-master-46
Árpád Bűrmen 6 months ago
parent
commit
5900f70438
  1. 21
      src/spicelib/devices/bsim4/b4noi.c
  2. 20
      src/spicelib/devices/bsim4/b4set.c
  3. 9
      src/spicelib/devices/bsim4/b4temp.c
  4. 7
      src/spicelib/devices/bsim4/bsim4def.h

21
src/spicelib/devices/bsim4/b4noi.c

@ -366,9 +366,10 @@ double mult_i, mult_fn;
epsilon = (T7 - T7 * T7 * T7 / 3.0) / (6.0 * T6); epsilon = (T7 - T7 * T7 * T7 / 3.0) / (6.0 * T6);
T8 = here->BSIM4Vgsteff / here->BSIM4EsatL; T8 = here->BSIM4Vgsteff / here->BSIM4EsatL;
T8 *= T8; T8 *= T8;
if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && (strncmp(model->BSIM4version, "4.8", 3)) &&
(strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) &&
(strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4)))
// if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && (strncmp(model->BSIM4version, "4.8", 3)) &&
// (strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) &&
// (strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4)))
if (model->BSIM4v48intVersion<=BSIM4v48V480)
{ {
npart_c = model->BSIM4rnoic * (1.0 + T8 npart_c = model->BSIM4rnoic * (1.0 + T8
* model->BSIM4tnoic * Leff); * model->BSIM4tnoic * Leff);
@ -420,9 +421,10 @@ double mult_i, mult_fn;
} }
switch(model->BSIM4tnoiMod) switch(model->BSIM4tnoiMod)
{ case 0: { case 0:
if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && (strncmp(model->BSIM4version, "4.8", 3)) &&
(strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) &&
(strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4)))
// if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && (strncmp(model->BSIM4version, "4.8", 3)) &&
// (strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) &&
// (strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4)))
if (model->BSIM4v48intVersion<=BSIM4v48V480)
{ {
T0 = here->BSIM4ueff * fabs(here->BSIM4qinv); T0 = here->BSIM4ueff * fabs(here->BSIM4qinv);
T1 = T0 * tmp + pParam->BSIM4leff T1 = T0 * tmp + pParam->BSIM4leff
@ -449,9 +451,10 @@ double mult_i, mult_fn;
} }
break; break;
case 1: case 1:
if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && (strncmp(model->BSIM4version, "4.8", 3)) &&
(strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) &&
(strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4)))
// if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && (strncmp(model->BSIM4version, "4.8", 3)) &&
// (strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) &&
// (strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4)))
if (model->BSIM4v48intVersion<=BSIM4v48V480)
{ {
T0 = here->BSIM4gm + here->BSIM4gmbs + here->BSIM4gds; T0 = here->BSIM4gm + here->BSIM4gmbs + here->BSIM4gds;
T0 *= T0; T0 *= T0;

20
src/spicelib/devices/bsim4/b4set.c

@ -203,6 +203,19 @@ BSIM4instance **InstArray;
} }
if (!model->BSIM4versionGiven) if (!model->BSIM4versionGiven)
model->BSIM4version = copy("4.8.3"); model->BSIM4version = copy("4.8.3");
/* Speed up version checking via integer version number */
if ((!strcmp(model->BSIM4version, "4.8.3"))||(!strncmp(model->BSIM4version, "4.83", 4))) {
model->BSIM4v48intVersion = BSIM4v48V483;
} else if ((!strcmp(model->BSIM4version, "4.8.2"))||(!strncmp(model->BSIM4version, "4.82", 4))) {
model->BSIM4v48intVersion = BSIM4v48V482;
} else if ((!strcmp(model->BSIM4version, "4.8.1"))||(!strncmp(model->BSIM4version, "4.81", 4))) {
model->BSIM4v48intVersion = BSIM4v48V481;
} else if ((!strcmp(model->BSIM4version, "4.8.0"))||(!strncmp(model->BSIM4version, "4.80", 4))||(!strncmp(model->BSIM4version, "4.8", 3))) {
model->BSIM4v48intVersion = BSIM4v48V480;
} else {
printf("Warning: unknown BSIM4 version. Working now with BSIM4.8.3.\n");
model->BSIM4v48intVersion = BSIM4v48V483;
}
if (!model->BSIM4toxrefGiven) if (!model->BSIM4toxrefGiven)
model->BSIM4toxref = 30.0e-10; model->BSIM4toxref = 30.0e-10;
if (!model->BSIM4eotGiven) if (!model->BSIM4eotGiven)
@ -342,9 +355,10 @@ BSIM4instance **InstArray;
if (!model->BSIM4ucsGiven) if (!model->BSIM4ucsGiven)
model->BSIM4ucs = (model->BSIM4type == NMOS) ? 1.67 : 1.0; model->BSIM4ucs = (model->BSIM4type == NMOS) ? 1.67 : 1.0;
if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) &&
(strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) &&
(strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4)))
// if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) &&
// (strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) &&
// (strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4)))
if (model->BSIM4v48intVersion<=BSIM4v48V480)
{ {
if (!model->BSIM4uaGiven) if (!model->BSIM4uaGiven)
model->BSIM4ua = ((model->BSIM4mobMod == 2)) ? 1.0e-15 : 1.0e-9; /* unit m/V */ model->BSIM4ua = ((model->BSIM4mobMod == 2)) ? 1.0e-15 : 1.0e-9; /* unit m/V */

9
src/spicelib/devices/bsim4/b4temp.c

@ -1368,10 +1368,11 @@ int Fatal_Flag = 0;
pParam->BSIM4Aechvb = (model->BSIM4type == NMOS) ? 4.97232e-7 : 3.42537e-7; pParam->BSIM4Aechvb = (model->BSIM4type == NMOS) ? 4.97232e-7 : 3.42537e-7;
pParam->BSIM4Bechvb = (model->BSIM4type == NMOS) ? 7.45669e11 : 1.16645e12; pParam->BSIM4Bechvb = (model->BSIM4type == NMOS) ? 7.45669e11 : 1.16645e12;
if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) &&
(strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) &&
(strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4)))
{
// if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) &&
// (strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) &&
// (strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4)))
// {
if (model->BSIM4v48intVersion<=BSIM4v48V480) {
pParam->BSIM4AechvbEdgeS = pParam->BSIM4Aechvb * pParam->BSIM4weff pParam->BSIM4AechvbEdgeS = pParam->BSIM4Aechvb * pParam->BSIM4weff
* model->BSIM4dlcig * pParam->BSIM4ToxRatioEdge; * model->BSIM4dlcig * pParam->BSIM4ToxRatioEdge;
pParam->BSIM4AechvbEdgeD = pParam->BSIM4Aechvb * pParam->BSIM4weff pParam->BSIM4AechvbEdgeD = pParam->BSIM4Aechvb * pParam->BSIM4weff

7
src/spicelib/devices/bsim4/bsim4def.h

@ -941,7 +941,12 @@ typedef struct sBSIM4model
int BSIM4tempMod; int BSIM4tempMod;
int BSIM4binUnit; int BSIM4binUnit;
int BSIM4paramChk; int BSIM4paramChk;
char *BSIM4version;
char *BSIM4version;
int BSIM4v48intVersion;
#define BSIM4v48V483 483 /* BSIM4v48 V4.8.3 */
#define BSIM4v48V482 482 /* BSIM4v48 V4.8.2 */
#define BSIM4v48V481 481 /* BSIM4v48 V4.8.1 */
#define BSIM4v48V480 480 /* BSIM4v48 V4.8.0 */
double BSIM4eot; double BSIM4eot;
double BSIM4vddeot; double BSIM4vddeot;
double BSIM4tempeot; double BSIM4tempeot;

Loading…
Cancel
Save