Browse Source

correct subckt expansion and new bsim model level/version selection

pre-master-46
dwarning 18 years ago
parent
commit
e352cb46dd
  1. 7
      ChangeLog
  2. 32
      DEVICES
  3. 25
      src/frontend/subckt.c
  4. 55
      src/spicelib/parser/inpdomod.c

7
ChangeLog

@ -1,3 +1,10 @@
2008-01-06 Dietmar Warning
* src/frontend/subckt.c: correct compare of binned model names. Fixed a bug
of incorrect subckt expansion when MOS model inside.
* src/spicelib/parser/inpdomod.c, DEVICES: Compatibility issue - now all
bsim3 models running under level 8 and 49 and all bsim4 models under
level 14 and 54. Distinction must be made by version parameter.
2008-01-04 Paolo Nenzi <p.nenzi@ieee.org> 2008-01-04 Paolo Nenzi <p.nenzi@ieee.org>
* src/frontend/runcoms.c: commented out code that did not allow rawfile * src/frontend/runcoms.c: commented out code that did not allow rawfile
generation for OP and AC analyses. Now rawfile is generated even for generation for OP and AC analyses. Now rawfile is generated even for

32
DEVICES

@ -574,36 +574,36 @@ BSIM3v0 - BSIM model level 3
Initial Release. Initial Release.
Ver: 3.0 Ver: 3.0
Class: M Class: M
Level: 52
Level: 8 & 49, version = 3.0
Dir: devices/bsim3v0 Dir: devices/bsim3v0
Status: TO BE TESTED AND IMPROVED Status: TO BE TESTED AND IMPROVED
BSIM3v0 - BSIM model level 3
BSIM3v1 - BSIM model level 3
Initial Release. Initial Release.
Ver: 3.0
Ver: 3.1
Class: M Class: M
Level: 51
Dir: devices/bsim3v1a
Status: TO BE TESTED AND IMPROVED
This is the BSIM3v3.0 model modified by Alan Gillespie.
Level: 8 & 49, version = 3.1
Dir: devices/bsim3v1
Status: TO BE TESTED
BSIM3v1 - BSIM model level 3 BSIM3v1 - BSIM model level 3
Initial Release. Initial Release.
Ver: 3.1 Ver: 3.1
Class: M Class: M
Level: 50
Dir: devices/bsim3v1
Status: TO BE TESTED
Level: 8 & 49, version = 3.1a
Dir: devices/bsim3v1a
Status: TO BE TESTED AND IMPROVED
This is the BSIM3v3.1 model modified by Alan Gillespie.
BSIM3v1 - BSIM model level 3 BSIM3v1 - BSIM model level 3
Initial Release. Initial Release.
Ver: 3.1 Ver: 3.1
Class: M Class: M
Level: 49
Level: 8 & 49, version = 3.1s
Dir: devices/bsim3v1s Dir: devices/bsim3v1s
Status: TO BE TESTED AND IMPROVED Status: TO BE TESTED AND IMPROVED
@ -614,9 +614,9 @@ BSIM3v1 - BSIM model level 3
BSIM3 - BSIM model level 3 BSIM3 - BSIM model level 3
Initial Release. Initial Release.
Ver: 3.2.4
Ver: 3.2.4 - 3.3.0
Class: M Class: M
Level: 8
Level: 8 & 49, version = 3.2.2, 3.2.3, 3.2.4, 3.3.0
Dir: devices/bsim3 Dir: devices/bsim3
Status: TO BE TESTED Status: TO BE TESTED
@ -637,9 +637,9 @@ BSIM3 - BSIM model level 3
BSIM4 - BSIM model level 4 (0.18 um) BSIM4 - BSIM model level 4 (0.18 um)
Initial Release. Initial Release.
Ver: 4.5.0
Ver: 4.2.0 - 4.6.1
Class: M Class: M
Level: 14
Level: 14 & 54, version = 4.2, 4.3, 4.4, 4.5, 4.6.1
Dir: devices/bsim4 Dir: devices/bsim4
Status: TO BE TESTED Status: TO BE TESTED

25
src/frontend/subckt.c

@ -1607,6 +1607,8 @@ devmodtranslate(struct line *deck, char *subname)
char *buffer, *name, *t, c; char *buffer, *name, *t, c;
wordlist *wlsub; wordlist *wlsub;
bool found; bool found;
char* dot_char;
int i, j;
#ifdef XSPICE #ifdef XSPICE
char *next_name; char *next_name;
#endif /* XSPICE */ #endif /* XSPICE */
@ -1836,17 +1838,26 @@ devmodtranslate(struct line *deck, char *subname)
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name); tfree(name);
name = gettok(&t); name = gettok(&t);
/* Now, is this a subcircuit model? */ /* Now, is this a subcircuit model? */
for (wlsub = submod; wlsub; wlsub = wlsub->wl_next) { for (wlsub = submod; wlsub; wlsub = wlsub->wl_next) {
if (eq(name, wlsub->wl_word)) {
(void) sprintf(buffer + strlen(buffer), "%s:%s ",
subname, name);
found = TRUE;
break;
i = strlen(wlsub->wl_word);
j = 0; /* Now, have we a binned model? */
if ( (dot_char = strstr( wlsub->wl_word, "." )) ) {
dot_char++; j++;
while( *dot_char != '\0' ) {
if ( !isdigit( *dot_char ) ) {
break;
}
dot_char++; j++;
}
}
if ( strncmp( name, wlsub->wl_word, i - j ) == 0 ) {
(void) sprintf(buffer + strlen(buffer), "%s:%s ",
subname, name);
found = TRUE;
break;
} }
} }
if (!found) if (!found)
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
(void) strcat(buffer, t); (void) strcat(buffer, t);

55
src/spicelib/parser/inpdomod.c

@ -161,7 +161,7 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
err = INPmkTemp("Device type MESA not availabe\n"); err = INPmkTemp("Device type MESA not availabe\n");
} }
break; break;
case 3:
case 3:
type = INPtypelook("MESA"); type = INPtypelook("MESA");
if (type < 0) if (type < 0)
{ {
@ -272,8 +272,21 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
("Device type MOS7 not available in this binary\n"); ("Device type MOS7 not available in this binary\n");
} }
break; break;
case 8:
case 8: case 49:
err = INPfindVer(line, ver); err = INPfindVer(line, ver);
if ( strcmp(ver, "3.0") == 0 ) {
type = INPtypelook("BSIM3v0");
}
if ( strcmp(ver, "3.1") == 0 ) {
type = INPtypelook("BSIM3v1");
}
if ( strcmp(ver, "3.1s") == 0 ) {
type = INPtypelook("BSIM3v1S");
}
if ( strcmp(ver, "3.1a") == 0 ) {
type = INPtypelook("BSIM3v1A");
}
if ( (strstr(ver, "3.2.2")) || (strstr(ver, "3.22")) || if ( (strstr(ver, "3.2.2")) || (strstr(ver, "3.22")) ||
(strstr(ver, "3.2.3")) || (strstr(ver, "3.23")) || (strstr(ver, "3.2.3")) || (strstr(ver, "3.23")) ||
(strstr(ver, "3.2.4")) || (strstr(ver, "3.24")) ) { (strstr(ver, "3.2.4")) || (strstr(ver, "3.24")) ) {
@ -284,9 +297,7 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
type = INPtypelook("BSIM3"); type = INPtypelook("BSIM3");
} }
if (type < 0) { if (type < 0) {
err =
INPmkTemp
("Device type BSIM3 not available in this binary\n");
err = INPmkTemp("Device type BSIM3 not available in this binary\n");
} }
break; break;
case 9: case 9:
@ -296,7 +307,7 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
("Device type MOS9 not available in this binary\n"); ("Device type MOS9 not available in this binary\n");
} }
break; break;
case 14:
case 14: case 54:
err = INPfindVer(line, ver); /* mapping of minor versions are only placeholder */ err = INPfindVer(line, ver); /* mapping of minor versions are only placeholder */
if ( (strstr(ver, "4.2")) || (strstr(ver, "4.2.0")) || (strstr(ver, "4.20")) if ( (strstr(ver, "4.2")) || (strstr(ver, "4.2.0")) || (strstr(ver, "4.20"))
|| (strstr(ver, "4.2.1")) || (strstr(ver, "4.21")) ) { || (strstr(ver, "4.2.1")) || (strstr(ver, "4.21")) ) {
@ -355,38 +366,6 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
} }
break; break;
#endif #endif
case 49:
type = INPtypelook("BSIM3v1S");
if (type < 0) {
err =
INPmkTemp
("Device type BSIM3v1S not available in this binary\n");
}
break;
case 50:
type = INPtypelook("BSIM3v1");
if (type < 0) {
err =
INPmkTemp
("Device type BSIM3v1 not available in this binary\n");
}
break;
case 51:
type = INPtypelook("BSIM3v1A");
if (type < 0) {
err =
INPmkTemp
("Device type BSIM3v1A not available in this binary\n");
}
break;
case 52:
type = INPtypelook("BSIM3v0");
if (type < 0) {
err =
INPmkTemp
("Device type BSIM3v0 not available in this binary\n");
}
break;
case 55: case 55:
type = INPtypelook("B3SOIFD"); type = INPtypelook("B3SOIFD");
if (type < 0) { if (type < 0) {

Loading…
Cancel
Save