Browse Source

Fixed bug with long lines. Thanks Dietmar!

pre-master-46
pnenzi 21 years ago
parent
commit
87f94117f7
  1. 6
      ChangeLog
  2. 169
      src/frontend/subckt.c

6
ChangeLog

@ -1,3 +1,9 @@
2005-02-08 Paolo Nenzi <p.nenzi@ieee.org>
* src/frontend/subckt.c: modified the file with the one supplied by
Dietmar Warning's (warning@danalyse.de). This fix the bug that
caused ngspice to crash with long subckt lines.
2004-09-05 Paolo Nenzi <p.nenzi@ieee.org> 2004-09-05 Paolo Nenzi <p.nenzi@ieee.org>
* src/spicelib/devices/jfet/jfet.c: model type (njf or pjf) was * src/spicelib/devices/jfet/jfet.c: model type (njf or pjf) was

169
src/frontend/subckt.c

@ -104,8 +104,8 @@ struct subs {
struct line *su_def; /* Pointer to the .subckt definition. */ struct line *su_def; /* Pointer to the .subckt definition. */
struct subs *su_next; struct subs *su_next;
} ; } ;
/* submod is the list of original model names, modnames is the /* submod is the list of original model names, modnames is the
* list of translated names (i.e. after subckt expansion) * list of translated names (i.e. after subckt expansion)
*/ */
@ -465,7 +465,7 @@ doit(struct line *deck)
/* Change the names of .models found in .subckts . . . */ /* Change the names of .models found in .subckts . . . */
if (modtranslate(lcc, scname)) /* this translates the model name in the .model line */ if (modtranslate(lcc, scname)) /* this translates the model name in the .model line */
devmodtranslate(lcc, scname); /* This translates the model name on all components in the deck */
devmodtranslate(lcc, scname); /* This translates the model name on all components in the deck */
s = sss->su_args; s = sss->su_args;
txfree(gettok(&t)); /* Throw out the subcircuit refdes */ txfree(gettok(&t)); /* Throw out the subcircuit refdes */
@ -577,7 +577,7 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
{ {
struct line *c; struct line *c;
char *buffer, *next_name, dev_type, *name, *s, *t, ch, *nametofree; char *buffer, *next_name, dev_type, *name, *s, *t, ch, *nametofree;
int nnodes, i, dim;
int nnodes, i, dim, blen;
int rtn=0; int rtn=0;
/* settrans builds the table holding the translated netnames. */ /* settrans builds the table holding the translated netnames. */
@ -626,13 +626,13 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
/* translate the instance name according to normal rules */ /* translate the instance name according to normal rules */
buffer = tmalloc(2000); /* XXXXX */
s = c->li_line; s = c->li_line;
name = MIFgettok(&s); name = MIFgettok(&s);
/* maschmann /* maschmann
sprintf(buffer, "%s:%s ", name, scname); */ sprintf(buffer, "%s:%s ", name, scname); */
buffer = (char *)tmalloc((strlen(scname)+strlen(name)+5)*sizeof(char));
sprintf(buffer, "a:%s:%s ", scname, name+1 ); sprintf(buffer, "a:%s:%s ", scname, name+1 );
@ -663,19 +663,25 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
case '[': case '[':
case ']': case ']':
case '~': case '~':
sprintf(buffer + strlen(buffer), "%s ", name);
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(name)+2)*sizeof(char));
sprintf(buffer + blen, "%s ", name);
break; break;
case '%': case '%':
sprintf(buffer + strlen(buffer), "%%");
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+2)*sizeof(char));
sprintf(buffer + blen, "%%");
/* don't translate the port type identifier */ /* don't translate the port type identifier */
name = next_name; name = next_name;
next_name = MIFgettok(&s); next_name = MIFgettok(&s);
sprintf(buffer + strlen(buffer), "%s ", name);
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(name)+2)*sizeof(char));
sprintf(buffer + blen, "%s ", name);
break; break;
default: default:
@ -685,23 +691,24 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
t = gettrans(name); t = gettrans(name);
if (t) { if (t) {
sprintf(buffer + strlen(buffer), "%s ", t);
} else {
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(t)+2)*sizeof(char));
sprintf(buffer + blen, "%s ", t);
} else {
/* maschmann: changed order /* maschmann: changed order
* sprintf(buffer + strlen(buffer), "%s:%s ", name, scname); */
if(name[0]=='v' || name[0]=='V')
/* If the name begins with V (Vsource), translate it as a source:
* V:subcircuitname:sourcename
* SDB says: This is a bad hack. What if my netname has a V in it?!?!? */
sprintf(buffer + strlen(buffer), "v:%s:%s ", scname, name+1);
else
/* Translate it as a normal node */
sprintf(buffer + strlen(buffer), "%s:%s ", scname, name);
}
sprintf(buffer + strlen(buffer), "%s:%s ", name, scname); */
if(name[0]=='v' || name[0]=='V') {
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(scname)+strlen(name)+5)*sizeof(char));
sprintf(buffer + blen, "v:%s:%s ", scname, name+1);
} else {
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(scname)+strlen(name)+3)*sizeof(char));
sprintf(buffer + blen, "%s:%s ", scname, name);
}
}
break; break;
} /* switch */ } /* switch */
} /* while */ } /* while */
@ -709,9 +716,11 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
/* copy in the last token, which is the model name */ /* copy in the last token, which is the model name */
if(name)
sprintf(buffer + strlen(buffer), "%s ", name);
if(name) {
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(name)+2)*sizeof(char));
sprintf(buffer + blen, "%s ", name);
}
/* Set s to null string for compatibility with code */ /* Set s to null string for compatibility with code */
/* after switch statement */ /* after switch statement */
@ -746,17 +755,19 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
* and stick the translated name into buffer. * and stick the translated name into buffer.
*/ */
ch = *name; /* ch identifies the type of component */ ch = *name; /* ch identifies the type of component */
buffer = tmalloc(2000); /* XXXXX */
name++; name++;
if (*name == ':') if (*name == ':')
name++; /* now name point to the rest of the refdes */ name++; /* now name point to the rest of the refdes */
if (*name)
(void) sprintf(buffer, "%c:%s:%s ", ch, scname, /* F:subcircuitname:refdesname */
if (*name) {
buffer = (char *)tmalloc((strlen(scname)+strlen(name)+5)*sizeof(char));
sprintf(buffer, "%c:%s:%s ", ch, scname, /* F:subcircuitname:refdesname */
name); name);
else
(void) sprintf(buffer, "%c:%s ", ch, scname); /* F:subcircuitname */
} else {
buffer = (char *)tmalloc((strlen(scname)+4)*sizeof(char));
sprintf(buffer, "%c:%s ", ch, scname); /* F:subcircuitname */
}
tfree(t); tfree(t);
@ -775,13 +786,16 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
t = gettrans(name); t = gettrans(name);
if (t) { /* the netname was used during the invocation; print it into the buffer */ if (t) { /* the netname was used during the invocation; print it into the buffer */
(void) sprintf(buffer + strlen(buffer), "%s ", t);
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(t)+2)*sizeof(char));
sprintf(buffer + blen, "%s ", t);
} }
else { /* net netname was not used during the invocation; place a else { /* net netname was not used during the invocation; place a
* translated name into the buffer. * translated name into the buffer.
*/ */
(void) sprintf(buffer + strlen(buffer),
"%s:%s ", scname, name);
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(scname)+strlen(name)+3)*sizeof(char));
sprintf(buffer + blen, "%s:%s ", scname, name);
} }
tfree(name); tfree(name);
} /* while (nnodes-- . . . . */ } /* while (nnodes-- . . . . */
@ -820,8 +834,9 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
} }
/* Write POLY(dim) into buffer */ /* Write POLY(dim) into buffer */
(void) sprintf(buffer + strlen(buffer),
"POLY( %d ) ", dim);
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+17)*sizeof(char));
sprintf(buffer + blen, "POLY( %d ) ", dim);
} /* if ( (strcmp(next_name, "POLY") == 0) . . . */ } /* if ( (strcmp(next_name, "POLY") == 0) . . . */
@ -854,9 +869,10 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
ch = *name; /* ch is the first char of the token. */ ch = *name; /* ch is the first char of the token. */
name++; name++;
if (*name == ':') if (*name == ':')
name++; /* name now points to the remainder of the token */
(void) sprintf(buffer + strlen(buffer),
"%c:%s:%s ", ch, scname, name);
name++; /* name now points to the remainder of the token */
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(scname)+strlen(name)+5)*sizeof(char));
sprintf(buffer + blen, "%c:%s:%s ", ch, scname, name);
/* From Vsense and Urefdes creates V:Urefdes:sense */ /* From Vsense and Urefdes creates V:Urefdes:sense */
} }
else { /* Handle netname */ else { /* Handle netname */
@ -870,13 +886,16 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
t = gettrans(name); t = gettrans(name);
if (t) { /* the netname was used during the invocation; print it into the buffer */ if (t) { /* the netname was used during the invocation; print it into the buffer */
(void) sprintf(buffer + strlen(buffer), "%s ", t);
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(t)+2)*sizeof(char));
sprintf(buffer + blen, "%s ", t);
} }
else { /* net netname was not used during the invocation; place a else { /* net netname was not used during the invocation; place a
* translated name into the buffer. * translated name into the buffer.
*/ */
(void) sprintf(buffer + strlen(buffer),
"%s:%s ", scname, name);
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(scname)+strlen(name)+3)*sizeof(char));
sprintf(buffer + blen, "%s:%s ", scname, name);
/* From netname and Urefdes creates Urefdes:netname */ /* From netname and Urefdes creates Urefdes:netname */
} }
} }
@ -884,7 +903,9 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
} /* while (nnodes--. . . . */ } /* while (nnodes--. . . . */
/* Now write out remainder of line (polynomial coeffs) */ /* Now write out remainder of line (polynomial coeffs) */
finishLine(buffer + strlen(buffer), s, scname);
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(s)+strlen(scname)+1000)*sizeof(char));
finishLine(buffer + blen, s, scname);
s = ""; s = "";
break; break;
@ -904,16 +925,18 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
* and stick the translated name into buffer. * and stick the translated name into buffer.
*/ */
ch = *name; ch = *name;
buffer = tmalloc(2000); /* XXXXX */
name++; name++;
if (*name == ':') if (*name == ':')
name++; name++;
if (*name)
(void) sprintf(buffer, "%c:%s:%s ", ch, scname,
name);
else
(void) sprintf(buffer, "%c:%s ", ch, scname);
if (*name) {
buffer = (char *)tmalloc((strlen(scname)+strlen(name)+5)*sizeof(char));
sprintf(buffer, "%c:%s:%s ", ch, scname, name);
} else {
buffer = (char *)tmalloc((strlen(scname)+4)*sizeof(char));
sprintf(buffer, "%c:%s ", ch, scname);
}
tfree(nametofree); tfree(nametofree);
@ -932,15 +955,18 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
t = gettrans(name); t = gettrans(name);
if (t) { /* the netname was used during the invocation; print it into the buffer */ if (t) { /* the netname was used during the invocation; print it into the buffer */
(void) sprintf(buffer + strlen(buffer), "%s ", t);
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(t)+2)*sizeof(char));
sprintf(buffer + blen, "%s ", t);
} }
else { /* net netname was not used during the invocation; place a else { /* net netname was not used during the invocation; place a
* translated name into the buffer. * translated name into the buffer.
*/ */
(void) sprintf(buffer + strlen(buffer),
"%s:%s ", scname, name);
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(scname)+strlen(name)+3)*sizeof(char));
sprintf(buffer + blen, "%s:%s ", scname, name);
} }
free(name);
tfree(name);
} /* while (nnodes-- . . . . */ } /* while (nnodes-- . . . . */
/* Now translate any devices (i.e. controlling sources). /* Now translate any devices (i.e. controlling sources).
@ -960,12 +986,15 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
if (*name == ':') if (*name == ':')
name++; name++;
if (*name)
(void) sprintf(buffer + strlen(buffer),
"%c:%s:%s ", ch, scname, name);
else
(void) sprintf(buffer + strlen(buffer),
"%c:%s ", ch, scname);
if (*name) {
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(scname)+strlen(name)+5)*sizeof(char));
sprintf(buffer + blen, "%c:%s:%s ", ch, scname, name);
} else {
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(scname)+4)*sizeof(char));
sprintf(buffer + blen, "%c:%s ", ch, scname);
}
tfree(t); tfree(t);
} /* while (nnodes--. . . . */ } /* while (nnodes--. . . . */
@ -975,14 +1004,18 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
* We also scan through the line for v(something) and * We also scan through the line for v(something) and
* i(something)... * i(something)...
*/ */
finishLine(buffer + strlen(buffer), s, scname);
s = "";
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(s)+strlen(scname)+1000)*sizeof(char));
finishLine(buffer + blen, s, scname);
s = "";
} /* switch(c->li_line . . . . */ } /* switch(c->li_line . . . . */
(void) strcat(buffer, s);
tfree(c->li_line);
c->li_line = copy(buffer);
blen = strlen(buffer);
buffer = (char *)trealloc(buffer, (blen+strlen(s)+1)*sizeof(char));
strcat(buffer, s);
tfree(c->li_line);
c->li_line = copy(buffer);
#ifdef TRACE #ifdef TRACE
/* SDB debug statement */ /* SDB debug statement */
@ -1102,6 +1135,7 @@ finishLine(char *dst, char *src, char *scname)
} }
} }
*dst = '\0'; /* va, append in each case '\0' */
return; return;
} }
@ -1221,7 +1255,7 @@ numnodes(char *name)
i = 0; i = 0;
s = buf; s = buf;
gotit = 0; gotit = 0;
txfree(gettok(&s)); /* Skip component name */
txfree(gettok(&s)); /* Skip component name */
while ((i < n) && (*s) && !gotit) { while ((i < n) && (*s) && !gotit) {
t = gettok_node(&s); /* get nodenames . . . */ t = gettok_node(&s); /* get nodenames . . . */
for (wl = modnames; wl; wl = wl->wl_next) for (wl = modnames; wl; wl = wl->wl_next)
@ -1308,7 +1342,7 @@ numdevs(char *s)
} }
/*----------------------------------------------------------------------* /*----------------------------------------------------------------------*
* modtranslate -- translates .model liness found in subckt definitions.
* modtranslate -- translates .model lines found in subckt definitions.
* Calling arguments are: * Calling arguments are:
* *deck = pointer to the .subckt definition (linked list) * *deck = pointer to the .subckt definition (linked list)
* *subname = pointer to the subcircuit name used at the subcircuit invocation (string) * *subname = pointer to the subcircuit name used at the subcircuit invocation (string)
@ -1339,8 +1373,7 @@ modtranslate(struct line *deck, char *subname)
buffer = tmalloc(strlen(name) + strlen(t) + buffer = tmalloc(strlen(name) + strlen(t) +
strlen(subname) + 4); strlen(subname) + 4);
(void) sprintf(buffer, "%s ",name); /* at this point, buffer = ".model " */ (void) sprintf(buffer, "%s ",name); /* at this point, buffer = ".model " */
tfree(name);
tfree(name);
name = gettok(&t); /* name now holds model name */ name = gettok(&t); /* name now holds model name */
wlsub = alloc(struct wordlist); wlsub = alloc(struct wordlist);
wlsub->wl_next = submod; wlsub->wl_next = submod;

Loading…
Cancel
Save