Added new handling for verilog structural netlists, and fixed
some problems stemming from comparing a case-sensitive netlist
against a case-insensitive one. Verilog netlist reading does
not yet have support for macros other than "`include", and it
does not yet have support for bit vectors constructed with
braces ({}).
This commit is contained in:
parent
eefdb61e14
commit
4d65b0006d
|
|
@ -3,7 +3,7 @@ NETGENDIR = ..
|
|||
SRCS = actel.c ccode.c greedy.c ntk.c print.c actellib.c embed.c \
|
||||
hash.c netfile.c objlist.c query.c anneal.c ext.c netcmp.c netgen.c \
|
||||
pdutils.c random.c timing.c bottomup.c flatten.c place.c spice.c \
|
||||
wombat.c xilinx.c xillib.c
|
||||
verilog.c wombat.c xilinx.c xillib.c
|
||||
X11_SRCS = xnetgen.c
|
||||
|
||||
include ${NETGENDIR}/defs.mak
|
||||
|
|
|
|||
268
base/ext.c
268
base/ext.c
|
|
@ -196,16 +196,16 @@ char *ReadExt(char *fname, int doflat, int *fnum)
|
|||
}
|
||||
|
||||
while (!EndParseFile()) {
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
|
||||
if (EndParseFile()) break;
|
||||
if (nexttok[0] == '#') SkipNewLine();
|
||||
else if (match(nexttok, "timestamp")) SkipNewLine();
|
||||
else if (match(nexttok, "version")) SkipNewLine();
|
||||
else if (match(nexttok, "tech")) SkipNewLine();
|
||||
else if (match(nexttok, "scale")) SkipNewLine();
|
||||
else if (match(nexttok, "style")) SkipNewLine();
|
||||
else if (match(nexttok, "resistclasses")) SkipNewLine();
|
||||
if (nexttok[0] == '#') SkipNewLine(NULL);
|
||||
else if (match(nexttok, "timestamp")) SkipNewLine(NULL);
|
||||
else if (match(nexttok, "version")) SkipNewLine(NULL);
|
||||
else if (match(nexttok, "tech")) SkipNewLine(NULL);
|
||||
else if (match(nexttok, "scale")) SkipNewLine(NULL);
|
||||
else if (match(nexttok, "style")) SkipNewLine(NULL);
|
||||
else if (match(nexttok, "resistclasses")) SkipNewLine(NULL);
|
||||
else if (match(nexttok, "node")) {
|
||||
char name[200];
|
||||
|
||||
|
|
@ -216,122 +216,122 @@ char *ReadExt(char *fname, int doflat, int *fnum)
|
|||
CellDef(fname, filenum);
|
||||
CellDefInProgress = 1;
|
||||
}
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(name, nexttok);
|
||||
Node(name); /* Ports will be determined by context */
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
}
|
||||
else if (match(nexttok, "equiv")) {
|
||||
char name[200];
|
||||
char name2[200];
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(name, nexttok);
|
||||
if (LookupObject(name,CurrentCell) == NULL) Node(name);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(name2, nexttok);
|
||||
if (LookupObject(name2,CurrentCell) == NULL) Node(name2);
|
||||
join(name, name2);
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
}
|
||||
else if (match(nexttok, "device")) {
|
||||
char dev_name[100], dev_class[100];
|
||||
char gate[200], drain[200], source[200], subs[200];
|
||||
char inststr[64];
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
strcpy(dev_class, nexttok);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
strcpy(dev_name, nexttok);
|
||||
SkipTok(); /* x coord of gate box */
|
||||
SkipTok(NULL); /* x coord of gate box */
|
||||
strcpy(inststr, dev_class);
|
||||
strcat(inststr, "@");
|
||||
strcat(inststr, nexttok);
|
||||
SkipTok(); /* y coord of gate box */
|
||||
SkipTok(NULL); /* y coord of gate box */
|
||||
strcat(inststr, ",");
|
||||
strcat(inststr, nexttok);
|
||||
SkipTok(); /* skip coord of gate box */
|
||||
SkipTok(); /* skip coord of gate box */
|
||||
SkipTok(NULL); /* skip coord of gate box */
|
||||
SkipTok(NULL); /* skip coord of gate box */
|
||||
|
||||
/* Device-dependent parameters */
|
||||
|
||||
if (match(dev_class, "mosfet")) {
|
||||
SkipTok(); /* skip device length */
|
||||
SkipTok(); /* skip device width */
|
||||
SkipTok();
|
||||
SkipTok(NULL); /* skip device length */
|
||||
SkipTok(NULL); /* skip device width */
|
||||
SkipTok(NULL);
|
||||
GetExtName(subs, nexttok);
|
||||
}
|
||||
else if (match(dev_class, "bjt")) {
|
||||
SkipTok(); /* skip device length */
|
||||
SkipTok(); /* skip device width */
|
||||
SkipTok();
|
||||
SkipTok(NULL); /* skip device length */
|
||||
SkipTok(NULL); /* skip device width */
|
||||
SkipTok(NULL);
|
||||
GetExtName(subs, nexttok);
|
||||
}
|
||||
else if (match(dev_class, "devcap")) {
|
||||
SkipTok(); /* skip device length */
|
||||
SkipTok(); /* skip device width */ /* or. . . */
|
||||
SkipTok(NULL); /* skip device length */
|
||||
SkipTok(NULL); /* skip device width */ /* or. . . */
|
||||
}
|
||||
else if (match(dev_class, "devres")) {
|
||||
SkipTok(); /* skip device length */
|
||||
SkipTok(); /* skip device width */ /* or. . . */
|
||||
SkipTok(NULL); /* skip device length */
|
||||
SkipTok(NULL); /* skip device width */ /* or. . . */
|
||||
}
|
||||
else if (match(dev_class, "diode")) {
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(gate, nexttok);
|
||||
SkipTok(); /* skip terminal length */
|
||||
SkipTok(); /* skip terminal attributes */
|
||||
SkipTok();
|
||||
SkipTok(NULL); /* skip terminal length */
|
||||
SkipTok(NULL); /* skip terminal attributes */
|
||||
SkipTok(NULL);
|
||||
GetExtName(drain, nexttok);
|
||||
SkipTok(); /* skip terminal length */
|
||||
SkipTok(); /* skip terminal attributes */
|
||||
SkipTok(NULL); /* skip terminal length */
|
||||
SkipTok(NULL); /* skip terminal attributes */
|
||||
}
|
||||
else if (match(dev_class, "subckt")) {
|
||||
SkipTok(); /* skip device length */
|
||||
SkipTok(); /* skip device width */
|
||||
SkipTok();
|
||||
SkipTok(NULL); /* skip device length */
|
||||
SkipTok(NULL); /* skip device width */
|
||||
SkipTok(NULL);
|
||||
GetExtName(subs, nexttok);
|
||||
while (nexttok != NULL) {
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(gate, nexttok);
|
||||
SkipTok(); /* skip terminal length */
|
||||
SkipTok(); /* skip terminal attributes */
|
||||
SkipTok(NULL); /* skip terminal length */
|
||||
SkipTok(NULL); /* skip terminal attributes */
|
||||
}
|
||||
}
|
||||
else if (match(dev_class, "rsubckt")) {
|
||||
SkipTok(); /* skip device length */
|
||||
SkipTok(); /* skip device width */
|
||||
SkipTok();
|
||||
SkipTok(NULL); /* skip device length */
|
||||
SkipTok(NULL); /* skip device width */
|
||||
SkipTok(NULL);
|
||||
GetExtName(subs, nexttok);
|
||||
}
|
||||
SkipTokNoNewline();
|
||||
SkipNewLine();
|
||||
SkipTokNoNewline(NULL);
|
||||
SkipNewLine(NULL);
|
||||
}
|
||||
else if (match(nexttok, "fet")) { /* old-style FET record */
|
||||
char fet_class[100];
|
||||
char gate[200], drain[200], source[200], subs[200];
|
||||
char inststr[64];
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
strcpy(fet_class, nexttok);
|
||||
SkipTok(); /* x coord of gate box */
|
||||
SkipTok(NULL); /* x coord of gate box */
|
||||
strcpy(inststr, fet_class);
|
||||
strcat(inststr, "@");
|
||||
strcat(inststr, nexttok);
|
||||
SkipTok(); /* y coord of gate box */
|
||||
SkipTok(NULL); /* y coord of gate box */
|
||||
strcat(inststr, ",");
|
||||
strcat(inststr, nexttok);
|
||||
SkipTok(); /* skip coord of gate box */
|
||||
SkipTok(); /* skip coord of gate box */
|
||||
SkipTok(); /* skip gate area */
|
||||
SkipTok(); /* skip gate perimeter */
|
||||
SkipTok();
|
||||
SkipTok(NULL); /* skip coord of gate box */
|
||||
SkipTok(NULL); /* skip coord of gate box */
|
||||
SkipTok(NULL); /* skip gate area */
|
||||
SkipTok(NULL); /* skip gate perimeter */
|
||||
SkipTok(NULL);
|
||||
GetExtName(subs, nexttok);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(gate, nexttok);
|
||||
SkipTok(); /* skip terminal length */
|
||||
SkipTok(); /* skip terminal attributes */
|
||||
SkipTok();
|
||||
SkipTok(NULL); /* skip terminal length */
|
||||
SkipTok(NULL); /* skip terminal attributes */
|
||||
SkipTok(NULL);
|
||||
GetExtName(drain, nexttok);
|
||||
SkipTok(); /* skip terminal length */
|
||||
SkipTok(); /* skip terminal attributes */
|
||||
SkipTokNoNewline();
|
||||
SkipTok(NULL); /* skip terminal length */
|
||||
SkipTok(NULL); /* skip terminal attributes */
|
||||
SkipTokNoNewline(NULL);
|
||||
if (nexttok == NULL) {
|
||||
/* This gets around a problem with the magic extractor in which */
|
||||
/* transistors having shorted source-drain are written into the */
|
||||
|
|
@ -341,7 +341,7 @@ char *ReadExt(char *fname, int doflat, int *fnum)
|
|||
}
|
||||
else
|
||||
GetExtName(source, nexttok);
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
/* remap transistors into things we know about */
|
||||
if (match(fet_class, "nfet"))
|
||||
N(fname, inststr, gate, drain, source);
|
||||
|
|
@ -361,15 +361,15 @@ char *ReadExt(char *fname, int doflat, int *fnum)
|
|||
else if (match(nexttok, "cap")) {
|
||||
if (IgnoreRC) {
|
||||
/* ignore all capacitances */
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
}
|
||||
else {
|
||||
char ctop[200], cbot[200], cdummy[200];
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(ctop, nexttok);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(cbot, nexttok);
|
||||
SkipNewLine(); /* Skip over capacitance value */
|
||||
SkipNewLine(NULL); /* Skip over capacitance value */
|
||||
Cap(fname, NULL, ctop, cbot);
|
||||
}
|
||||
}
|
||||
|
|
@ -386,14 +386,14 @@ char *ReadExt(char *fname, int doflat, int *fnum)
|
|||
CellDefInProgress = 1;
|
||||
}
|
||||
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(name, nexttok);
|
||||
if ((basename = strrchr(name,'/')) != NULL) {
|
||||
char tmp[200];
|
||||
strcpy(tmp, basename+1);
|
||||
strcpy(name, tmp);
|
||||
}
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(instancename, nexttok);
|
||||
Printf("Instancing %s as %s\n", name, instancename);
|
||||
Instance(name, instancename);
|
||||
|
|
@ -401,14 +401,14 @@ char *ReadExt(char *fname, int doflat, int *fnum)
|
|||
Printf("Flattening %s in %s\n", instancename, fname);
|
||||
flattenInstancesOf(NULL, filenum, name);
|
||||
}
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
}
|
||||
else if (match(nexttok, "merge")) {
|
||||
char name[200];
|
||||
char name2[200];
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(name, nexttok);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(name2, nexttok);
|
||||
if (doflat)
|
||||
join(name, name2);
|
||||
|
|
@ -416,12 +416,12 @@ char *ReadExt(char *fname, int doflat, int *fnum)
|
|||
join(name, name2);
|
||||
else {
|
||||
}
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
}
|
||||
else {
|
||||
Printf("Strange token in ext: '%s'\n", nexttok);
|
||||
InputParseError(stderr);
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
}
|
||||
}
|
||||
CloseParseFile();
|
||||
|
|
@ -657,189 +657,189 @@ char *ReadSim(char *fname, int *fnum)
|
|||
CellDef(fname, filenum);
|
||||
|
||||
while (!EndParseFile()) {
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
|
||||
if (EndParseFile()) break;
|
||||
if (nexttok[0] == '|') {
|
||||
SkipTok(); /* "units" */
|
||||
SkipTok(NULL); /* "units" */
|
||||
if (!strcmp(nexttok, "units:")) {
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
simscale = strtod(nexttok, NULL);
|
||||
}
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
}
|
||||
else if (match(nexttok, "n")) {
|
||||
char gate[200], drain[200], source[200];
|
||||
char inststr[25], *instptr = NULL;
|
||||
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(gate, nexttok);
|
||||
if (LookupObject(gate, CurrentCell) == NULL)
|
||||
Node(gate); /* define the node if it does not already exist */
|
||||
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(drain, nexttok);
|
||||
if (LookupObject(drain, CurrentCell) == NULL)
|
||||
Node(drain); /* define the node if it does not already exist */
|
||||
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(source, nexttok);
|
||||
if (LookupObject(source, CurrentCell) == NULL)
|
||||
Node(source); /* define the node if it does not already exist */
|
||||
|
||||
SkipTokNoNewline(); /* length */
|
||||
SkipTokNoNewline(NULL); /* length */
|
||||
if ((nexttok != NULL) && (nexttok[0] != '\0')) {
|
||||
vstr = ScaleStringFloatValue(&nexttok[0], simscale * 1e-8);
|
||||
AddProperty(&kvlist, "length", vstr);
|
||||
SkipTok(); /* width */
|
||||
SkipTok(NULL); /* width */
|
||||
if ((nexttok != NULL) && (nexttok[0] != '\0')) {
|
||||
vstr = ScaleStringFloatValue(&nexttok[0], simscale * 1e-8);
|
||||
AddProperty(&kvlist, "width", vstr);
|
||||
}
|
||||
SkipTokNoNewline();
|
||||
SkipTokNoNewline(NULL);
|
||||
if (nexttok != NULL) {
|
||||
if (StrIsInt(nexttok)) {
|
||||
strcpy(inststr, "n@");
|
||||
strcat(inststr, nexttok);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
strcat(inststr, ",");
|
||||
strcat(inststr, nexttok);
|
||||
instptr = inststr;
|
||||
}
|
||||
}
|
||||
}
|
||||
SkipNewLine(); /* skip any attributes */
|
||||
SkipNewLine(NULL); /* skip any attributes */
|
||||
N(fname, instptr, gate, drain, source);
|
||||
LinkProperties("n", kvlist);
|
||||
}
|
||||
else if (match(nexttok, "p")) {
|
||||
char gate[200], drain[200], source[200];
|
||||
char inststr[25], *instptr = NULL;
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(gate, nexttok);
|
||||
if (LookupObject(gate, CurrentCell) == NULL)
|
||||
Node(gate); /* define the node if it does not already exist */
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(drain, nexttok);
|
||||
if (LookupObject(drain, CurrentCell) == NULL)
|
||||
Node(drain); /* define the node if it does not already exist */
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(source, nexttok);
|
||||
if (LookupObject(source, CurrentCell) == NULL)
|
||||
Node(source); /* define the node if it does not already exist */
|
||||
SkipTokNoNewline(); /* length */
|
||||
SkipTokNoNewline(NULL); /* length */
|
||||
if ((nexttok != NULL) && (nexttok[0] != '\0')) {
|
||||
vstr = ScaleStringFloatValue(&nexttok[0], simscale * 1e-8);
|
||||
AddProperty(&kvlist, "length", vstr);
|
||||
SkipTok(); /* width */
|
||||
SkipTok(NULL); /* width */
|
||||
if ((nexttok != NULL) && (nexttok[0] != '\0')) {
|
||||
vstr = ScaleStringFloatValue(&nexttok[0], simscale * 1e-8);
|
||||
AddProperty(&kvlist, "width", vstr);
|
||||
}
|
||||
SkipTokNoNewline();
|
||||
SkipTokNoNewline(NULL);
|
||||
if (nexttok != NULL) {
|
||||
if (StrIsInt(nexttok)) {
|
||||
strcpy(inststr, "p@");
|
||||
strcat(inststr, nexttok);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
strcat(inststr, ",");
|
||||
strcat(inststr, nexttok);
|
||||
instptr = inststr;
|
||||
}
|
||||
}
|
||||
}
|
||||
SkipNewLine(); /* skip various attributes */
|
||||
SkipNewLine(NULL); /* skip various attributes */
|
||||
P(fname, instptr, gate, drain, source);
|
||||
LinkProperties("p", kvlist);
|
||||
}
|
||||
else if (match(nexttok, "e")) { /* 3-port capacitors (poly/poly2) */
|
||||
char gate[200], drain[200], source[200];
|
||||
char inststr[25], *instptr = NULL;
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(gate, nexttok);
|
||||
if (LookupObject(gate, CurrentCell) == NULL)
|
||||
Node(gate); /* define the node if it does not already exist */
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(drain, nexttok);
|
||||
if (LookupObject(drain, CurrentCell) == NULL)
|
||||
Node(drain); /* define the node if it does not already exist */
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(source, nexttok);
|
||||
if (LookupObject(source, CurrentCell) == NULL)
|
||||
Node(source); /* define the node if it does not already exist */
|
||||
SkipTokNoNewline(); /* skip length */
|
||||
SkipTokNoNewline(NULL); /* skip length */
|
||||
if (nexttok != NULL) {
|
||||
SkipTok(); /* skip width */
|
||||
SkipTokNoNewline();
|
||||
SkipTok(NULL); /* skip width */
|
||||
SkipTokNoNewline(NULL);
|
||||
inststr[0] = '\0';
|
||||
if (nexttok != NULL) {
|
||||
if (StrIsInt(nexttok)) {
|
||||
strcpy(inststr, "e@");
|
||||
strcat(inststr, nexttok);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
strcat(inststr, ",");
|
||||
strcat(inststr, nexttok);
|
||||
instptr = inststr;
|
||||
}
|
||||
}
|
||||
}
|
||||
SkipNewLine(); /* skip various attributes */
|
||||
SkipNewLine(NULL); /* skip various attributes */
|
||||
E(fname, instptr, gate, drain, source);
|
||||
}
|
||||
else if (match(nexttok, "b")) { /* bipolars added by Tim 7/16/96 */
|
||||
char base[200], emitter[200], collector[200];
|
||||
char inststr[25], *instptr = NULL;
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(base, nexttok);
|
||||
if (LookupObject(base, CurrentCell) == NULL)
|
||||
Node(base); /* define the node if it does not already exist */
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(emitter, nexttok);
|
||||
if (LookupObject(emitter, CurrentCell) == NULL)
|
||||
Node(emitter); /* define the node if it does not already exist */
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(collector, nexttok);
|
||||
if (LookupObject(collector, CurrentCell) == NULL)
|
||||
Node(collector); /* define the node if it does not already exist */
|
||||
SkipTokNoNewline(); /* skip length */
|
||||
SkipTokNoNewline(NULL); /* skip length */
|
||||
if (nexttok != NULL) {
|
||||
SkipTok(); /* skip width */
|
||||
SkipTokNoNewline();
|
||||
SkipTok(NULL); /* skip width */
|
||||
SkipTokNoNewline(NULL);
|
||||
if (nexttok != NULL) {
|
||||
if (StrIsInt(nexttok)) {
|
||||
strcpy(inststr, "b@");
|
||||
strcat(inststr, nexttok);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
strcat(inststr, ",");
|
||||
strcat(inststr, nexttok);
|
||||
instptr = inststr;
|
||||
}
|
||||
}
|
||||
}
|
||||
SkipNewLine(); /* skip various attributes */
|
||||
SkipNewLine(NULL); /* skip various attributes */
|
||||
B(fname, instptr, collector, base, emitter);
|
||||
}
|
||||
else if (matchnocase(nexttok, "c")) { /* 2-port capacitors */
|
||||
if (IgnoreRC) {
|
||||
/* ignore all capacitances */
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
}
|
||||
else {
|
||||
char ctop[200], cbot[200], cdummy[200];
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(ctop, nexttok);
|
||||
if (LookupObject(ctop, CurrentCell) == NULL)
|
||||
Node(ctop); /* define the node if it does not already exist */
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(cbot, nexttok);
|
||||
if (LookupObject(cbot, CurrentCell) == NULL)
|
||||
Node(cbot); /* define the node if it does not already exist */
|
||||
SkipTokNoNewline();
|
||||
SkipTokNoNewline(NULL);
|
||||
if (nexttok != NULL) {
|
||||
vstr = ScaleStringFloatValue(&nexttok[0], 1e-15);
|
||||
AddProperty(&kvlist, "value", vstr);
|
||||
}
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
Cap(fname, NULL, ctop, cbot);
|
||||
LinkProperties("c", kvlist);
|
||||
}
|
||||
|
|
@ -847,23 +847,23 @@ char *ReadSim(char *fname, int *fnum)
|
|||
else if (match(nexttok, "r")) { /* 2-port resistors */
|
||||
if (IgnoreRC) {
|
||||
/* ignore all capacitances */
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
}
|
||||
else {
|
||||
char rtop[200], rbot[200];
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(rtop, nexttok);
|
||||
if (LookupObject(rtop, CurrentCell) == NULL)
|
||||
Node(rtop); /* define the node if it does not already exist */
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(rbot, nexttok);
|
||||
if (LookupObject(rbot, CurrentCell) == NULL)
|
||||
Node(rbot); /* define the node if it does not already exist */
|
||||
SkipTokNoNewline();
|
||||
SkipTokNoNewline(NULL);
|
||||
if (nexttok != NULL) {
|
||||
AddProperty(&kvlist, "value", &nexttok[0]);
|
||||
}
|
||||
SkipNewLine(); /* skip various attributes */
|
||||
SkipNewLine(NULL); /* skip various attributes */
|
||||
Res(fname, NULL, rtop, rbot);
|
||||
LinkProperties("r", kvlist);
|
||||
}
|
||||
|
|
@ -871,55 +871,55 @@ char *ReadSim(char *fname, int *fnum)
|
|||
else if (match(nexttok, "z")) { /* 3-port resistors from magic */
|
||||
if (IgnoreRC) {
|
||||
/* ignore all capacitances */
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
}
|
||||
else {
|
||||
char rtop[200], rbot[200], rdummy[200];
|
||||
char inststr[25], *instptr = NULL;
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(rdummy, nexttok);
|
||||
if (LookupObject(rdummy, CurrentCell) == NULL)
|
||||
Node(rdummy); /* define the node if it does not already exist */
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(rtop, nexttok);
|
||||
if (LookupObject(rtop, CurrentCell) == NULL)
|
||||
Node(rtop); /* define the node if it does not already exist */
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(rbot, nexttok);
|
||||
if (LookupObject(rbot, CurrentCell) == NULL)
|
||||
Node(rbot); /* define the node if it does not already exist */
|
||||
SkipTokNoNewline(); /* skip length */
|
||||
SkipTokNoNewline(NULL); /* skip length */
|
||||
if (nexttok != NULL) {
|
||||
SkipTok(); /* skip width */
|
||||
SkipTokNoNewline();
|
||||
SkipTok(NULL); /* skip width */
|
||||
SkipTokNoNewline(NULL);
|
||||
if (nexttok != NULL) {
|
||||
if (StrIsInt(nexttok)) {
|
||||
strcpy(inststr, "z@");
|
||||
strcat(inststr, nexttok);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
strcat(inststr, ",");
|
||||
strcat(inststr, nexttok);
|
||||
instptr = inststr;
|
||||
}
|
||||
}
|
||||
}
|
||||
SkipNewLine(); /* skip various attributes */
|
||||
SkipNewLine(NULL); /* skip various attributes */
|
||||
Res3(fname, instptr, rdummy, rtop, rbot);
|
||||
}
|
||||
}
|
||||
else if (match(nexttok, "N")) {
|
||||
/* ignore this keyword */
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
}
|
||||
else if (match(nexttok, "A")) {
|
||||
/* ignore this keyword */
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
}
|
||||
else if (match(nexttok, "=")) {
|
||||
char node1[200], node2[200];
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(node1, nexttok);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
GetExtName(node2, nexttok);
|
||||
join(node1, node2);
|
||||
}
|
||||
|
|
@ -928,12 +928,12 @@ char *ReadSim(char *fname, int *fnum)
|
|||
Printf("Ignoring lumped resistances (\"R\" records) in .sim.\n");
|
||||
has_lumped = 1; /* Don't print this message more than once */
|
||||
}
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
}
|
||||
else {
|
||||
Printf("Strange token in .sim: '%s'\n", nexttok);
|
||||
InputParseError(stderr);
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
}
|
||||
DeleteProperties(&kvlist);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6204,7 +6204,7 @@ int reorderpins(struct hashlist *p, int file)
|
|||
|
||||
if (unordered)
|
||||
Fprintf(stderr, "Ports of %s are unordered. "
|
||||
"Ordering will be arbitrary.", tc2->name);
|
||||
"Ordering will be arbitrary.\n", tc2->name);
|
||||
|
||||
for (ob = ptr->cell; ob != NULL; ) {
|
||||
if (ob->type == FIRSTPIN) {
|
||||
|
|
|
|||
6423
base/netcmp.c.orig
6423
base/netcmp.c.orig
File diff suppressed because it is too large
Load Diff
|
|
@ -263,7 +263,7 @@ void TrimQuoted(char *line)
|
|||
/* */
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
int GetNextLineNoNewline()
|
||||
int GetNextLineNoNewline(char *delimiter)
|
||||
{
|
||||
char *newbuf;
|
||||
int testc;
|
||||
|
|
@ -296,7 +296,7 @@ int GetNextLineNoNewline()
|
|||
strcpy(linetok, line);
|
||||
TrimQuoted(linetok);
|
||||
|
||||
nexttok = strtok(linetok, TOKEN_DELIMITER);
|
||||
nexttok = strtok(linetok, delimiter);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -305,10 +305,10 @@ int GetNextLineNoNewline()
|
|||
/* valid token. */
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
void GetNextLine()
|
||||
void GetNextLine(char *delimiter)
|
||||
{
|
||||
do {
|
||||
if (GetNextLineNoNewline() == -1) return;
|
||||
if (GetNextLineNoNewline(delimiter) == -1) return;
|
||||
} while (nexttok == NULL);
|
||||
}
|
||||
|
||||
|
|
@ -316,11 +316,13 @@ void GetNextLine()
|
|||
/* if nexttok is already NULL, force scanner to read new line */
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
void SkipTok(void)
|
||||
void SkipTok(char *delimiter)
|
||||
{
|
||||
if (nexttok != NULL &&
|
||||
(nexttok = strtok(NULL, TOKEN_DELIMITER)) != NULL) return;
|
||||
GetNextLine();
|
||||
if (nexttok != NULL &&
|
||||
(nexttok = strtok(NULL, (delimiter) ? delimiter : TOKEN_DELIMITER))
|
||||
!= NULL)
|
||||
return;
|
||||
GetNextLine((delimiter) ? delimiter : TOKEN_DELIMITER);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
|
@ -328,9 +330,9 @@ void SkipTok(void)
|
|||
/* must be preceeded by at least one call to SkipTok() */
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
void SkipTokNoNewline(void)
|
||||
void SkipTokNoNewline(char *delimiter)
|
||||
{
|
||||
nexttok = strtok(NULL, TOKEN_DELIMITER);
|
||||
nexttok = strtok(NULL, (delimiter) ? delimiter : TOKEN_DELIMITER);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
|
@ -357,15 +359,15 @@ void SpiceTokNoNewline(void)
|
|||
while (nexttok == NULL) {
|
||||
contline = getc(infile);
|
||||
if (contline == '*') {
|
||||
GetNextLine();
|
||||
SkipNewLine();
|
||||
GetNextLine(TOKEN_DELIMITER);
|
||||
SkipNewLine(NULL);
|
||||
continue;
|
||||
}
|
||||
else if (contline != '+') {
|
||||
ungetc(contline, infile);
|
||||
return;
|
||||
}
|
||||
if (GetNextLineNoNewline() == -1) break;
|
||||
if (GetNextLineNoNewline(TOKEN_DELIMITER) == -1) break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -373,9 +375,10 @@ void SpiceTokNoNewline(void)
|
|||
/* skip to the end of the current line */
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
void SkipNewLine(void)
|
||||
void SkipNewLine(char *delimiter)
|
||||
{
|
||||
while (nexttok != NULL) nexttok = strtok(NULL, TOKEN_DELIMITER);
|
||||
while (nexttok != NULL)
|
||||
nexttok = strtok(NULL, (delimiter) ? delimiter : TOKEN_DELIMITER);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
|
@ -387,13 +390,13 @@ void SpiceSkipNewLine(void)
|
|||
{
|
||||
int contline;
|
||||
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
contline = getc(infile);
|
||||
|
||||
while (contline == '+') {
|
||||
ungetc(contline, infile);
|
||||
GetNextLine();
|
||||
SkipNewLine();
|
||||
GetNextLine(TOKEN_DELIMITER);
|
||||
SkipNewLine(NULL);
|
||||
contline = getc(infile);
|
||||
}
|
||||
ungetc(contline, infile);
|
||||
|
|
@ -480,7 +483,7 @@ char *ReadNetlist(char *fname, int *fnum)
|
|||
};
|
||||
|
||||
#ifdef mips
|
||||
struct filetype formats[6];
|
||||
struct filetype formats[7];
|
||||
|
||||
formats[0].extension = NTK_EXTENSION;
|
||||
formats[0].proc = ReadNtk;
|
||||
|
|
@ -492,8 +495,10 @@ char *ReadNetlist(char *fname, int *fnum)
|
|||
formats[3].proc = ReadSpice;
|
||||
formats[4].extension = NETGEN_EXTENSION;
|
||||
formats[4].proc = ReadNetgenFile;
|
||||
formats[5].extension = NULL;
|
||||
formats[5].proc = NULL;
|
||||
formats[5].extension = VERILOG_EXTENSION;
|
||||
formats[5].proc = ReadVerilogFile;
|
||||
formats[6].extension = NULL;
|
||||
formats[6].proc = NULL;
|
||||
|
||||
#else /* not mips (i.e. compiler with reasonable initializers) */
|
||||
|
||||
|
|
@ -505,6 +510,7 @@ char *ReadNetlist(char *fname, int *fnum)
|
|||
{SPICE_EXTENSION, ReadSpice},
|
||||
{SPICE_EXT2, ReadSpice},
|
||||
{SPICE_EXT3, ReadSpice},
|
||||
{VERILOG_EXTENSION, ReadVerilog},
|
||||
{NETGEN_EXTENSION, ReadNetgenFile},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
#define NETGEN_EXTENSION ".ntg"
|
||||
#define CCODE_EXTENSION ".c.code"
|
||||
#define ESACAP_EXTENSION ".esa"
|
||||
#define VERILOG_EXTENSION ".v"
|
||||
|
||||
#define LINELENGTH 80
|
||||
|
||||
|
|
@ -27,11 +28,11 @@ extern int File;
|
|||
/* input routines */
|
||||
|
||||
extern char *nexttok;
|
||||
#define SKIPTO(a) do {SkipTok();} while (!match(nexttok,a))
|
||||
extern void SkipTok(void);
|
||||
extern void SkipTokNoNewline(void);
|
||||
#define SKIPTO(a) do {SkipTok(NULL);} while (!match(nexttok,a))
|
||||
extern void SkipTok(char *delimiter);
|
||||
extern void SkipTokNoNewline(char *delimiter);
|
||||
extern void SkipNewLine(char *delimiter);
|
||||
extern void SpiceTokNoNewline(void); /* handles SPICE "+" continuation line */
|
||||
extern void SkipNewLine(void);
|
||||
extern void SpiceSkipNewLine(void); /* handles SPICE "+" continuation line */
|
||||
extern void InputParseError(FILE *f);
|
||||
extern int OpenParseFile(char *name, int fnum);
|
||||
|
|
|
|||
|
|
@ -1203,40 +1203,31 @@ void CellDef(char *name, int fnum)
|
|||
{
|
||||
struct nlist *np;
|
||||
|
||||
if (Debug) Printf("Defining cell: %s\n",name);
|
||||
GarbageCollect();
|
||||
if ((CurrentCell = LookupCellFile(name, fnum)) != NULL) {
|
||||
if (AddToExistingDefinition) {
|
||||
if (Debug) Printf("Defining cell: %s\n",name);
|
||||
GarbageCollect();
|
||||
if ((CurrentCell = LookupCellFile(name, fnum)) != NULL) {
|
||||
if (AddToExistingDefinition) {
|
||||
ReopenCellDef(name, fnum);
|
||||
return ;
|
||||
}
|
||||
else {
|
||||
}
|
||||
else {
|
||||
Printf("Cell: %s exists already, and will be overwritten.\n", name);
|
||||
CellDelete(name, fnum);
|
||||
}
|
||||
}
|
||||
/* install a new cell in lookup table (hashed) */
|
||||
np = InstallInCellHashTable(name, fnum);
|
||||
CurrentCell = LookupCellFile(name, fnum);
|
||||
CurrentCell->class = CLASS_SUBCKT; /* default */
|
||||
CurrentCell->flags = (GlobalParallelNone) ? COMB_NO_PARALLEL : 0;
|
||||
}
|
||||
/* install a new cell in lookup table (hashed) */
|
||||
np = InstallInCellHashTable(name, fnum);
|
||||
CurrentCell = LookupCellFile(name, fnum);
|
||||
CurrentCell->class = CLASS_SUBCKT; /* default */
|
||||
CurrentCell->flags = (GlobalParallelNone) ? COMB_NO_PARALLEL : 0;
|
||||
|
||||
LastPlaced = NULL;
|
||||
CurrentTail = NULL;
|
||||
FreeNodeNames(CurrentCell);
|
||||
NextNode = 1;
|
||||
}
|
||||
LastPlaced = NULL;
|
||||
CurrentTail = NULL;
|
||||
FreeNodeNames(CurrentCell);
|
||||
NextNode = 1;
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
/* Same as CellDef() above, but mark cell as case-insensitive. */
|
||||
/* This routine is used only by the ReadSpice() function. */
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
void CellDefNoCase(char *name, int file)
|
||||
{
|
||||
CellDef(name, file);
|
||||
CurrentCell->file = file;
|
||||
CurrentCell->flags |= CELL_NOCASE;
|
||||
// Mark cell as case insensitive if case insensitivity is in effect
|
||||
if (matchfunc == matchnocase) CurrentCell->flags |= CELL_NOCASE;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
|
|
|||
|
|
@ -178,6 +178,7 @@ extern char *ReadSim(char *fname, int *fnum);
|
|||
extern char *ReadSpice(char *fname, int *fnum);
|
||||
extern char *ReadSpiceLib(char *fname, int *fnum);
|
||||
extern char *ReadNetgenFile (char *fname, int *fnum);
|
||||
extern char *ReadVerilog(char *fname, int *fnum);
|
||||
|
||||
extern char *ReadNetlist(char *fname, int *fnum);
|
||||
|
||||
|
|
|
|||
44
base/ntk.c
44
base/ntk.c
|
|
@ -193,7 +193,7 @@ char *ReadNtk (char *fname, int *fnum)
|
|||
}
|
||||
|
||||
while (!EndParseFile()) {
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
if (EndParseFile()) break;
|
||||
if (nexttok[0] == '|') SKIPTO(";");
|
||||
else if (match(nexttok, "c")) {
|
||||
|
|
@ -203,14 +203,14 @@ char *ReadNtk (char *fname, int *fnum)
|
|||
EndCell();
|
||||
CellDefInProgress = 0;
|
||||
}
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
CellDef(nexttok, CurrentCell->file);
|
||||
LastCellRead = CurrentCell->name;
|
||||
CellDefInProgress = 1;
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
while (!match(nexttok, ";")) {
|
||||
Port(nexttok);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
}
|
||||
}
|
||||
else if (match(nexttok, "s")) {
|
||||
|
|
@ -224,8 +224,8 @@ char *ReadNtk (char *fname, int *fnum)
|
|||
if (LastCellRead == NULL)
|
||||
LastCellRead = CurrentCell->name;
|
||||
}
|
||||
SkipTok();
|
||||
SkipTok(); /* eat the 'size' of the node */
|
||||
SkipTok(NULL);
|
||||
SkipTok(NULL); /* eat the 'size' of the node */
|
||||
/* after the 'size', all names are synonyms */
|
||||
while (!match(nexttok, ";")) {
|
||||
#if 1
|
||||
|
|
@ -240,7 +240,7 @@ char *ReadNtk (char *fname, int *fnum)
|
|||
#endif
|
||||
if (strlen(last)) join(last, nexttok);
|
||||
strcpy(last, nexttok);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
}
|
||||
}
|
||||
else if (match(nexttok, "h")) {
|
||||
|
|
@ -250,11 +250,11 @@ char *ReadNtk (char *fname, int *fnum)
|
|||
if (LastCellRead == NULL)
|
||||
LastCellRead = CurrentCell->name;
|
||||
}
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
strcpy(model, nexttok);
|
||||
strcpy(instancename, nexttok);
|
||||
strcat(instancename, INSTANCE_DELIMITER);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
strcat(instancename, nexttok);
|
||||
if (LookupCell(model) == NULL) {
|
||||
#ifdef DEFINE_UNDEFINED_CELLS
|
||||
|
|
@ -264,7 +264,7 @@ char *ReadNtk (char *fname, int *fnum)
|
|||
|
||||
previous_cell = CurrentCell->name;
|
||||
CellDef(model, CurrentCell->file);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
args = 0;
|
||||
while (!match(nexttok, ";")) {
|
||||
sprintf(name, "pin%d", args+1);
|
||||
|
|
@ -273,11 +273,11 @@ char *ReadNtk (char *fname, int *fnum)
|
|||
args++;
|
||||
/* check for overflow */
|
||||
if (args == (sizeof(ports) / sizeof(ports[0]))) {
|
||||
while (!match(nexttok, ";")) SkipTok();
|
||||
while (!match(nexttok, ";")) SkipTok(NULL);
|
||||
break; /* out of while loop */
|
||||
}
|
||||
/* if no overflow, get the next token */
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
}
|
||||
EndCell();
|
||||
/* now, reopen previous cell, instance the new cell,
|
||||
|
|
@ -301,7 +301,7 @@ char *ReadNtk (char *fname, int *fnum)
|
|||
ob = LookupCell(model)->cell;
|
||||
while ((ob != NULL) && !IsPort(ob))
|
||||
ob = ob->next;
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
while (!match(nexttok, ";")) {
|
||||
strcpy(name, instancename);
|
||||
strcat(name, SEPARATOR);
|
||||
|
|
@ -311,7 +311,7 @@ char *ReadNtk (char *fname, int *fnum)
|
|||
do {
|
||||
ob = ob->next;
|
||||
} while ((ob != NULL) && !IsPort(ob)) ;
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -322,12 +322,12 @@ char *ReadNtk (char *fname, int *fnum)
|
|||
if (LastCellRead == NULL)
|
||||
LastCellRead = CurrentCell->name;
|
||||
}
|
||||
SkipTok();
|
||||
SkipTok(); /* skip the transistor size */
|
||||
SkipTok(NULL);
|
||||
SkipTok(NULL); /* skip the transistor size */
|
||||
strcpy(name, nexttok);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
strcpy(model, nexttok);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
strcpy(instancename, nexttok);
|
||||
N(fname, NULL, name, model, instancename);
|
||||
SKIPTO(";");
|
||||
|
|
@ -339,12 +339,12 @@ char *ReadNtk (char *fname, int *fnum)
|
|||
if (LastCellRead == NULL)
|
||||
LastCellRead = CurrentCell->name;
|
||||
}
|
||||
SkipTok();
|
||||
SkipTok(); /* skip the transistor size */
|
||||
SkipTok(NULL);
|
||||
SkipTok(NULL); /* skip the transistor size */
|
||||
strcpy(name, nexttok);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
strcpy(model, nexttok);
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
strcpy(instancename, nexttok);
|
||||
P(fname, NULL, name, model, instancename);
|
||||
SKIPTO(";");
|
||||
|
|
|
|||
|
|
@ -184,13 +184,46 @@ int match(char *st1, char *st2)
|
|||
|
||||
/* Case-insensitive matching */
|
||||
|
||||
/* For case-insensitivity, the alphabet is lower-cased, but */
|
||||
/* also all common vector delimiters are cast to the same */
|
||||
/* character so that different vector notations will match. */
|
||||
|
||||
static char to_lower[256] = {
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
|
||||
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
|
||||
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
|
||||
40, 41, 42, 43, 44, 45, 46, 47,
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
':', ';', '<', '=', '>', '?', '@',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
||||
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'<', '\\', '>', '^', '_', '`',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
||||
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'<', '|', '>', '~', 127,
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
|
||||
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
|
||||
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
|
||||
40, 41, 42, 43, 44, 45, 46, 47,
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
':', ';', '<', '=', '>', '?', '@',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
||||
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'<', '\\', '>', '^', '_', '`',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
||||
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'<', '|', '>', '~', 127
|
||||
};
|
||||
|
||||
int matchnocase(char *st1, char *st2)
|
||||
{
|
||||
char *sp1 = st1;
|
||||
char *sp2 = st2;
|
||||
|
||||
while (*sp1 != '\0' && *sp2 != '\0') {
|
||||
if (tolower(*sp1) != tolower(*sp2)) break;
|
||||
if (to_lower[*sp1] != to_lower[*sp2]) break;
|
||||
sp1++;
|
||||
sp2++;
|
||||
}
|
||||
|
|
@ -216,7 +249,7 @@ int matchfilenocase(char *st1, char *st2, int f1, int f2)
|
|||
|
||||
if (f1 != f2) return 0;
|
||||
while (*sp1 != '\0' && *sp2 != '\0') {
|
||||
if (tolower(*sp1) != tolower(*sp2)) break;
|
||||
if (to_lower[*sp1] != to_lower[*sp2]) break;
|
||||
sp1++;
|
||||
sp2++;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1024,6 +1024,10 @@ void Query(void)
|
|||
promptstring("Write SPICE: circuit name: ", repstr);
|
||||
SpiceCell(repstr, filenum, "");
|
||||
break;
|
||||
case 'v':
|
||||
promptstring("Write Verilog: circuit name: ", repstr);
|
||||
VerilogModule(repstr, filenum, "");
|
||||
break;
|
||||
case 'E':
|
||||
promptstring("Write ESACAP: circuit name: ", repstr);
|
||||
EsacapCell(repstr,"");
|
||||
|
|
@ -1062,6 +1066,10 @@ void Query(void)
|
|||
promptstring("Read SPICE (.ckt) file? ", repstr);
|
||||
ReadSpice(repstr, &filenum);
|
||||
break;
|
||||
case 'V':
|
||||
promptstring("Read Verilog (.v) file? ", repstr);
|
||||
ReadVerilog(repstr, &filenum);
|
||||
break;
|
||||
case 'G' :
|
||||
promptstring("Read NETGEN: file? ", repstr);
|
||||
ReadNetgenFile(repstr, &filenum);
|
||||
|
|
|
|||
62
base/spice.c
62
base/spice.c
|
|
@ -512,10 +512,10 @@ void ReadSpiceFile(char *fname, int filenum, struct cellstack **CellStackPtr,
|
|||
|
||||
while (!EndParseFile()) {
|
||||
|
||||
SkipTok(); /* get the next token */
|
||||
SkipTok(NULL); /* get the next token */
|
||||
if ((EndParseFile()) && (nexttok == NULL)) break;
|
||||
|
||||
if (nexttok[0] == '*') SkipNewLine();
|
||||
if (nexttok[0] == '*') SkipNewLine(NULL);
|
||||
|
||||
else if (matchnocase(nexttok, ".SUBCKT")) {
|
||||
SpiceTokNoNewline();
|
||||
|
|
@ -574,18 +574,18 @@ void ReadSpiceFile(char *fname, int filenum, struct cellstack **CellStackPtr,
|
|||
Printf("Renaming original cell to %s\n", model);
|
||||
InstanceRename(nexttok, model, filenum);
|
||||
CellRehash(nexttok, model, filenum);
|
||||
CellDefNoCase(nexttok, filenum);
|
||||
CellDef(nexttok, filenum);
|
||||
tp = LookupCellFile(nexttok, filenum);
|
||||
}
|
||||
else if (tp != NULL) { /* Make a new definition for an empty cell */
|
||||
FreePorts(nexttok);
|
||||
CellDelete(nexttok, filenum); /* This removes any PLACEHOLDER flag */
|
||||
CellDefNoCase(model, filenum);
|
||||
CellDef(model, filenum);
|
||||
tp = LookupCellFile(model, filenum);
|
||||
update = 1; /* Will need to update existing instances */
|
||||
}
|
||||
else if (tp == NULL) { /* Completely new cell, no name conflict */
|
||||
CellDefNoCase(model, filenum);
|
||||
CellDef(model, filenum);
|
||||
tp = LookupCellFile(model, filenum);
|
||||
}
|
||||
|
||||
|
|
@ -651,7 +651,7 @@ skip_ends:
|
|||
|
||||
while (1) {
|
||||
SpiceSkipNewLine();
|
||||
SkipTok();
|
||||
SkipTok(NULL);
|
||||
if (EndParseFile()) break;
|
||||
if (matchnocase(nexttok, ".ENDS")) {
|
||||
in_subckt = 0;
|
||||
|
|
@ -673,7 +673,7 @@ skip_ends:
|
|||
|
||||
if (*CellStackPtr) PopStack(CellStackPtr);
|
||||
if (*CellStackPtr) ReopenCellDef((*CellStackPtr)->cellname, filenum);
|
||||
SkipNewLine();
|
||||
SkipNewLine(NULL);
|
||||
}
|
||||
else if (matchnocase(nexttok, ".MODEL")) {
|
||||
unsigned char class = CLASS_SUBCKT;
|
||||
|
|
@ -745,7 +745,7 @@ skip_ends:
|
|||
if (numnodes == 0) {
|
||||
// If there is no current cell, make one
|
||||
if (!(*CellStackPtr)) {
|
||||
CellDefNoCase(fname, filenum);
|
||||
CellDef(fname, filenum);
|
||||
PushStack(fname, CellStackPtr);
|
||||
}
|
||||
Global(nexttok);
|
||||
|
|
@ -859,7 +859,7 @@ skip_ends:
|
|||
collector[99] = '\0';
|
||||
|
||||
if (!(*CellStackPtr)) {
|
||||
CellDefNoCase(fname, filenum);
|
||||
CellDef(fname, filenum);
|
||||
PushStack(fname, CellStackPtr);
|
||||
}
|
||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||
|
|
@ -891,7 +891,7 @@ skip_ends:
|
|||
}
|
||||
|
||||
if (LookupCellFile(model, filenum) == NULL) {
|
||||
CellDefNoCase(model, filenum);
|
||||
CellDef(model, filenum);
|
||||
Port("collector");
|
||||
Port("base");
|
||||
Port("emitter");
|
||||
|
|
@ -920,7 +920,7 @@ skip_ends:
|
|||
bulk[99] = '\0';
|
||||
|
||||
if (!(*CellStackPtr)) {
|
||||
CellDefNoCase(fname, filenum);
|
||||
CellDef(fname, filenum);
|
||||
PushStack(fname, CellStackPtr);
|
||||
}
|
||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||
|
|
@ -961,7 +961,7 @@ skip_ends:
|
|||
/* SPICE transistor. */
|
||||
|
||||
if (LookupCellFile(model, filenum) == NULL) {
|
||||
CellDefNoCase(model, filenum);
|
||||
CellDef(model, filenum);
|
||||
Port("drain");
|
||||
Port("gate");
|
||||
Port("source");
|
||||
|
|
@ -998,7 +998,7 @@ skip_ends:
|
|||
cbot[99] = '\0';
|
||||
|
||||
if (!(*CellStackPtr)) {
|
||||
CellDefNoCase(fname, filenum);
|
||||
CellDef(fname, filenum);
|
||||
PushStack(fname, CellStackPtr);
|
||||
}
|
||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||
|
|
@ -1052,7 +1052,7 @@ skip_ends:
|
|||
else
|
||||
{
|
||||
if (LookupCellFile(model, filenum) == NULL) {
|
||||
CellDefNoCase(model, filenum);
|
||||
CellDef(model, filenum);
|
||||
Port("top");
|
||||
Port("bottom");
|
||||
PropertyValue(model, filenum, "value", 0.01, 0.0);
|
||||
|
|
@ -1092,7 +1092,7 @@ skip_ends:
|
|||
rbot[99] = '\0';
|
||||
|
||||
if (!(*CellStackPtr)) {
|
||||
CellDefNoCase(fname, filenum);
|
||||
CellDef(fname, filenum);
|
||||
PushStack(fname, CellStackPtr);
|
||||
}
|
||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||
|
|
@ -1143,7 +1143,7 @@ skip_ends:
|
|||
if (model[0] != '\0')
|
||||
{
|
||||
if (LookupCellFile(model, filenum) == NULL) {
|
||||
CellDefNoCase(model, filenum);
|
||||
CellDef(model, filenum);
|
||||
Port("end_a");
|
||||
Port("end_b");
|
||||
PropertyValue(model, filenum, "value", 0.01, 0.0);
|
||||
|
|
@ -1179,7 +1179,7 @@ skip_ends:
|
|||
anode[99] = '\0';
|
||||
|
||||
if (!(*CellStackPtr)) {
|
||||
CellDefNoCase(fname, filenum);
|
||||
CellDef(fname, filenum);
|
||||
PushStack(fname, CellStackPtr);
|
||||
}
|
||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||
|
|
@ -1208,7 +1208,7 @@ skip_ends:
|
|||
}
|
||||
|
||||
if (LookupCellFile(model, filenum) == NULL) {
|
||||
CellDefNoCase(model, filenum);
|
||||
CellDef(model, filenum);
|
||||
Port("anode");
|
||||
Port("cathode");
|
||||
PropertyInteger(model, filenum, "M", 0, 1);
|
||||
|
|
@ -1241,7 +1241,7 @@ skip_ends:
|
|||
node4[99] = '\0';
|
||||
|
||||
if (!(*CellStackPtr)) {
|
||||
CellDefNoCase(fname, filenum);
|
||||
CellDef(fname, filenum);
|
||||
PushStack(fname, CellStackPtr);
|
||||
}
|
||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||
|
|
@ -1279,7 +1279,7 @@ skip_ends:
|
|||
if (model[0] != '\0')
|
||||
{
|
||||
if (LookupCellFile(model, filenum) == NULL) {
|
||||
CellDefNoCase(model, filenum);
|
||||
CellDef(model, filenum);
|
||||
Port("node1");
|
||||
Port("node2");
|
||||
Port("node3");
|
||||
|
|
@ -1319,7 +1319,7 @@ skip_ends:
|
|||
end_b[99] = '\0';
|
||||
|
||||
if (!(*CellStackPtr)) {
|
||||
CellDefNoCase(fname, filenum);
|
||||
CellDef(fname, filenum);
|
||||
PushStack(fname, CellStackPtr);
|
||||
}
|
||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||
|
|
@ -1364,7 +1364,7 @@ skip_ends:
|
|||
if (model[0] != '\0')
|
||||
{
|
||||
if (LookupCellFile(model, filenum) == NULL) {
|
||||
CellDefNoCase(model, filenum);
|
||||
CellDef(model, filenum);
|
||||
Port("end_a");
|
||||
Port("end_b");
|
||||
PropertyInteger(model, filenum, "M", 0, 1);
|
||||
|
|
@ -1402,7 +1402,7 @@ skip_ends:
|
|||
neg[99] = '\0';
|
||||
|
||||
if (!(*CellStackPtr)) {
|
||||
CellDefNoCase(fname, filenum);
|
||||
CellDef(fname, filenum);
|
||||
PushStack(fname, CellStackPtr);
|
||||
}
|
||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||
|
|
@ -1432,7 +1432,7 @@ skip_ends:
|
|||
}
|
||||
strcpy(model, "vsrc"); /* Default voltage source */
|
||||
if (LookupCellFile(model, filenum) == NULL) {
|
||||
CellDefNoCase(model, filenum);
|
||||
CellDef(model, filenum);
|
||||
Port("pos");
|
||||
Port("neg");
|
||||
PropertyInteger(model, filenum, "M", 0, 1);
|
||||
|
|
@ -1457,7 +1457,7 @@ skip_ends:
|
|||
neg[99] = '\0';
|
||||
|
||||
if (!(*CellStackPtr)) {
|
||||
CellDefNoCase(fname, filenum);
|
||||
CellDef(fname, filenum);
|
||||
PushStack(fname, CellStackPtr);
|
||||
}
|
||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||
|
|
@ -1486,7 +1486,7 @@ skip_ends:
|
|||
}
|
||||
strcpy(model, "isrc"); /* Default current source */
|
||||
if (LookupCellFile(model, filenum) == NULL) {
|
||||
CellDefNoCase(model, filenum);
|
||||
CellDef(model, filenum);
|
||||
Port("pos");
|
||||
Port("neg");
|
||||
PropertyInteger(model, filenum, "M", 0, 1);
|
||||
|
|
@ -1513,7 +1513,7 @@ skip_ends:
|
|||
ctrln[99] = '\0';
|
||||
|
||||
if (!(*CellStackPtr)) {
|
||||
CellDefNoCase(fname, filenum);
|
||||
CellDef(fname, filenum);
|
||||
PushStack(fname, CellStackPtr);
|
||||
}
|
||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||
|
|
@ -1549,7 +1549,7 @@ skip_ends:
|
|||
}
|
||||
strcpy(model, "vcvs"); /* Default controlled voltage source */
|
||||
if (LookupCellFile(model, filenum) == NULL) {
|
||||
CellDefNoCase(model, filenum);
|
||||
CellDef(model, filenum);
|
||||
Port("pos");
|
||||
Port("neg");
|
||||
Port("ctrlp");
|
||||
|
|
@ -1589,7 +1589,7 @@ skip_ends:
|
|||
snprintf(instancename, 99, "%s", nexttok + 1);
|
||||
strncpy(instancename, nexttok + 1, 99);
|
||||
if (!(*CellStackPtr)) {
|
||||
CellDefNoCase(fname, filenum);
|
||||
CellDef(fname, filenum);
|
||||
PushStack(fname, CellStackPtr);
|
||||
}
|
||||
|
||||
|
|
@ -1714,7 +1714,7 @@ skip_ends:
|
|||
|
||||
Fprintf(stdout, "Call to undefined subcircuit %s\n"
|
||||
"Creating placeholder cell definition.\n", subcktname);
|
||||
CellDefNoCase(subcktname, filenum);
|
||||
CellDef(subcktname, filenum);
|
||||
CurrentCell->flags |= CELL_PLACEHOLDER;
|
||||
for (scan = head, i = 1; scan != NULL; scan = scan->next, i++) {
|
||||
sprintf(defport, "%d", i);
|
||||
|
|
@ -1882,7 +1882,7 @@ char *ReadSpiceTop(char *fname, int *fnum, int blackbox)
|
|||
// as an empty cell. Otherwise, the filename is lost and cells
|
||||
// cannot be matched to the file!
|
||||
|
||||
if (LookupCellFile(fname, filenum) == NULL) CellDefNoCase(fname, filenum);
|
||||
if (LookupCellFile(fname, filenum) == NULL) CellDef(fname, filenum);
|
||||
|
||||
tp = LookupCellFile(fname, filenum);
|
||||
if (tp) tp->flags |= CELL_TOP;
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -698,11 +698,11 @@ _netgen_readnet(ClientData clientData,
|
|||
{
|
||||
char *formats[] = {
|
||||
"automatic", "ext", "extflat", "sim", "ntk", "spice",
|
||||
"netgen", "actel", "xilinx", NULL
|
||||
"verilog", "netgen", "actel", "xilinx", NULL
|
||||
};
|
||||
enum FormatIdx {
|
||||
AUTO_IDX, EXT_IDX, EXTFLAT_IDX, SIM_IDX, NTK_IDX,
|
||||
SPICE_IDX, NETGEN_IDX, ACTEL_IDX, XILINX_IDX
|
||||
SPICE_IDX, VERILOG_IDX, NETGEN_IDX, ACTEL_IDX, XILINX_IDX
|
||||
};
|
||||
struct nlist *tc;
|
||||
int result, index, filenum = -1;
|
||||
|
|
@ -771,7 +771,7 @@ _netgen_readnet(ClientData clientData,
|
|||
|
||||
if (retstr) savstr = STRDUP(retstr);
|
||||
|
||||
// Check if the file is already loaded
|
||||
// Check if the file is already loaded.
|
||||
|
||||
tc = LookupCell(savstr);
|
||||
if (tc != NULL) {
|
||||
|
|
@ -803,6 +803,9 @@ _netgen_readnet(ClientData clientData,
|
|||
case SPICE_IDX:
|
||||
retstr = ReadSpice(savstr, &filenum);
|
||||
break;
|
||||
case VERILOG_IDX:
|
||||
retstr = ReadVerilog(savstr, &filenum);
|
||||
break;
|
||||
case NETGEN_IDX:
|
||||
retstr = ReadNetgenFile(savstr, &filenum);
|
||||
break;
|
||||
|
|
@ -918,11 +921,13 @@ _netgen_writenet(ClientData clientData,
|
|||
{
|
||||
char *formats[] = {
|
||||
"ext", "sim", "ntk", "actel",
|
||||
"spice", "wombat", "esacap", "netgen", "ccode", "xilinx", NULL
|
||||
"spice", "verilog", "wombat", "esacap", "netgen",
|
||||
"ccode", "xilinx", NULL
|
||||
};
|
||||
enum FormatIdx {
|
||||
EXT_IDX, SIM_IDX, NTK_IDX, ACTEL_IDX,
|
||||
SPICE_IDX, WOMBAT_IDX, ESACAP_IDX, NETGEN_IDX, CCODE_IDX, XILINX_IDX
|
||||
SPICE_IDX, VERILOG_IDX, WOMBAT_IDX, ESACAP_IDX, NETGEN_IDX,
|
||||
CCODE_IDX, XILINX_IDX
|
||||
};
|
||||
int result, index, filenum;
|
||||
char *repstr;
|
||||
|
|
@ -963,6 +968,9 @@ _netgen_writenet(ClientData clientData,
|
|||
case SPICE_IDX:
|
||||
SpiceCell(repstr, filenum, "");
|
||||
break;
|
||||
case VERILOG_IDX:
|
||||
VerilogModule(repstr, filenum, "");
|
||||
break;
|
||||
case WOMBAT_IDX:
|
||||
Wombat(repstr,NULL);
|
||||
break;
|
||||
|
|
|
|||
Loading…
Reference in New Issue