Browse Source

allow more then 4 terminal mos models in subckts

pre-master-46
dwarning 14 years ago
parent
commit
082a3e92ae
  1. 81
      src/frontend/subckt.c

81
src/frontend/subckt.c

@ -1724,6 +1724,7 @@ static void
devmodtranslate(struct line *deck, char *subname, wordlist * const submod)
{
struct line *s;
int found;
for (s = deck; s; s = s->li_next) {
@ -1873,6 +1874,7 @@ devmodtranslate(struct line *deck, char *subname, wordlist * const submod)
tfree(s->li_line);
s->li_line = buffer;
break;
case 'u': /* urc transmissionline */
/* 3 terminal devices */
case 'w': /* current controlled switch */
@ -1901,7 +1903,6 @@ devmodtranslate(struct line *deck, char *subname, wordlist * const submod)
break;
/* 4 terminal devices */
case 'm':
case 'o': /* ltra */
case 's': /* vc switch */
case 'y': /* txl */
@ -1926,28 +1927,70 @@ devmodtranslate(struct line *deck, char *subname, wordlist * const submod)
tfree(name);
name = gettok(&t);
/* Now, is this a subcircuit model? */
for (wlsub = submod; wlsub; wlsub = wlsub->wl_next) {
/* FIXME, probably too unspecific */
int i = (int) strlen(wlsub->wl_word);
int j = 0; /* Now, have we a binned model? */
char* dot_char;
if ((dot_char = strstr(wlsub->wl_word, ".")) != NULL) {
dot_char++;
j++;
while (*dot_char != '\0') {
if (!isdigit(*dot_char)) {
break;
}
wlsub = wl_find(name, submod);
if (!wlsub)
(void) sprintf(buffer + strlen(buffer), "%s ", name);
else
(void) sprintf(buffer + strlen(buffer), "%s:%s ", subname, name);
(void) strcat(buffer, t);
tfree(s->li_line);
s->li_line = buffer;
tfree(name);
break;
/* 4-7 terminal mos devices */
case 'm':
name = gettok(&t); /* get refdes */
(void) sprintf(buffer, "%s ", name);
tfree(name);
name = gettok_node(&t); /* get first attached netname */
(void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
name = gettok_node(&t); /* get second attached netname */
(void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
name = gettok_node(&t); /* get third attached netname */
(void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
name = gettok_node(&t); /* get fourth attached netname */
(void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
name = gettok(&t);
found = 0;
while (*t && !found) {
/* Now, is this a subcircuit model? */
for (wlsub = submod; wlsub; wlsub = wlsub->wl_next) {
/* FIXME, probably too unspecific */
int i = (int) strlen(wlsub->wl_word);
int j = 0; /* Now, have we a binned model? */
char* dot_char;
if ((dot_char = strstr(wlsub->wl_word, ".")) != NULL) {
dot_char++;
j++;
while (*dot_char != '\0') {
if (!isdigit(*dot_char)) {
break;
}
dot_char++;
j++;
}
}
if (strncmp(name, wlsub->wl_word, (size_t) (i - j)) == 0) {
found = 1;
break;
}
}
if (strncmp(name, wlsub->wl_word, (size_t) (i - j)) == 0)
break;
}
if (!found) { /* name was not a model - was a netname */
(void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
name = gettok(&t);
}
} /* while */
if (!wlsub)
if (!found)
(void) sprintf(buffer + strlen(buffer), "%s ", name);
else
(void) sprintf(buffer + strlen(buffer), "%s:%s ", subname, name);
@ -1958,7 +2001,7 @@ devmodtranslate(struct line *deck, char *subname, wordlist * const submod)
tfree(name);
break;
/* 3-5 terminal devices */
/* 3-5 terminal bjt devices */
case 'q':
name = gettok(&t); /* get refdes */
(void) sprintf(buffer, "%s ", name);

Loading…
Cancel
Save