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) {