correct subckt expansion and new bsim model level/version selection

This commit is contained in:
dwarning 2008-01-06 14:09:33 +00:00
parent b7a0ee52f1
commit e352cb46dd
4 changed files with 60 additions and 63 deletions

View File

@ -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

36
DEVICES
View File

@ -574,27 +574,16 @@ 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
Initial Release.
Ver: 3.0
Class: M
Level: 51
Dir: devices/bsim3v1a
Status: TO BE TESTED AND IMPROVED
This is the BSIM3v3.0 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: 50 Level: 8 & 49, version = 3.1
Dir: devices/bsim3v1 Dir: devices/bsim3v1
Status: TO BE TESTED Status: TO BE TESTED
@ -603,7 +592,18 @@ 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.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
Initial Release.
Ver: 3.1
Class: M
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

View File

@ -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)) { 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 ", (void) sprintf(buffer + strlen(buffer), "%s:%s ",
subname, name); subname, name);
found = TRUE; found = TRUE;
break; 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);

View File

@ -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 = err = INPmkTemp("Device type BSIM3 not available in this binary\n");
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) {