diff --git a/ChangeLog b/ChangeLog index 35af89c08..0b59aa3ea 100644 --- a/ChangeLog +++ b/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 * src/frontend/runcoms.c: commented out code that did not allow rawfile generation for OP and AC analyses. Now rawfile is generated even for diff --git a/DEVICES b/DEVICES index e14c3c715..b14e56ffe 100644 --- a/DEVICES +++ b/DEVICES @@ -574,36 +574,36 @@ BSIM3v0 - BSIM model level 3 Initial Release. Ver: 3.0 Class: M - Level: 52 + Level: 8 & 49, version = 3.0 Dir: devices/bsim3v0 Status: TO BE TESTED AND IMPROVED -BSIM3v0 - BSIM model level 3 +BSIM3v1 - BSIM model level 3 Initial Release. - Ver: 3.0 + Ver: 3.1 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 Initial Release. Ver: 3.1 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 Initial Release. Ver: 3.1 Class: M - Level: 49 + Level: 8 & 49, version = 3.1s Dir: devices/bsim3v1s Status: TO BE TESTED AND IMPROVED @@ -614,9 +614,9 @@ BSIM3v1 - BSIM model level 3 BSIM3 - BSIM model level 3 Initial Release. - Ver: 3.2.4 + Ver: 3.2.4 - 3.3.0 Class: M - Level: 8 + Level: 8 & 49, version = 3.2.2, 3.2.3, 3.2.4, 3.3.0 Dir: devices/bsim3 Status: TO BE TESTED @@ -637,9 +637,9 @@ BSIM3 - BSIM model level 3 BSIM4 - BSIM model level 4 (0.18 um) Initial Release. - Ver: 4.5.0 + Ver: 4.2.0 - 4.6.1 Class: M - Level: 14 + Level: 14 & 54, version = 4.2, 4.3, 4.4, 4.5, 4.6.1 Dir: devices/bsim4 Status: TO BE TESTED diff --git a/src/frontend/subckt.c b/src/frontend/subckt.c index 0a4c1973b..b16bd0fe9 100644 --- a/src/frontend/subckt.c +++ b/src/frontend/subckt.c @@ -1607,6 +1607,8 @@ devmodtranslate(struct line *deck, char *subname) char *buffer, *name, *t, c; wordlist *wlsub; bool found; + char* dot_char; + int i, j; #ifdef XSPICE char *next_name; #endif /* XSPICE */ @@ -1836,17 +1838,26 @@ devmodtranslate(struct line *deck, char *subname) (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); name = gettok(&t); - /* Now, is this a subcircuit model? */ 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) (void) sprintf(buffer + strlen(buffer), "%s ", name); (void) strcat(buffer, t); diff --git a/src/spicelib/parser/inpdomod.c b/src/spicelib/parser/inpdomod.c index ad66a58d4..686d01d89 100644 --- a/src/spicelib/parser/inpdomod.c +++ b/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"); } break; - case 3: + case 3: type = INPtypelook("MESA"); if (type < 0) { @@ -272,8 +272,21 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab) ("Device type MOS7 not available in this binary\n"); } break; - case 8: + case 8: case 49: 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")) || (strstr(ver, "3.2.3")) || (strstr(ver, "3.23")) || (strstr(ver, "3.2.4")) || (strstr(ver, "3.24")) ) { @@ -284,9 +297,7 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab) type = INPtypelook("BSIM3"); } 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; case 9: @@ -296,7 +307,7 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab) ("Device type MOS9 not available in this binary\n"); } break; - case 14: + case 14: case 54: 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")) || (strstr(ver, "4.2.1")) || (strstr(ver, "4.21")) ) { @@ -355,38 +366,6 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab) } break; #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: type = INPtypelook("B3SOIFD"); if (type < 0) {