Compare commits

..
7 Commits
Author SHA1 Message Date
Tim Edwards aee4b846e2 Corrected the known issue with pin bus index matching that was in
the last commit and which was expected to be corrected by this
commit.
2018-04-16 17:19:26 -04:00
Tim Edwards 004378be11 Merge branch 'master' into work 2018-04-16 15:43:25 -04:00
Tim Edwards dc42e98ab9 Update at Mon Apr 16 15:43:23 EDT 2018 by tim 2018-04-16 15:43:23 -04:00
Tim Edwards 58d7e17231 Corrected basic problem with verilog instance pins not needing to
be in any specific order since all ports are named.  Also corrected
problem with pin names not using the same string matching function
as used for nets in general (which affects the ability to match
against different bus delimiters).
2018-04-16 15:41:20 -04:00
Tim Edwards de30eeabe8 Merge branch 'master' into work 2018-04-12 17:13:43 -04:00
Tim Edwards feab5023e5 Update at Thu Apr 12 17:13:41 EDT 2018 by tim 2018-04-12 17:13:41 -04:00
Tim Edwards 4d65b0006d 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 ({}).
2018-04-12 17:09:10 -04:00
15 changed files with 1645 additions and 6676 deletions
+1 -1
View File
@@ -1 +1 @@
1.5.94
1.5.96
+1 -1
View File
@@ -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
+134 -134
View File
@@ -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);
}
+5 -5
View File
@@ -4915,7 +4915,7 @@ PropertyCheckMismatch(struct objlist *tp1, struct nlist *tc1,
case PROP_STRING:
islop = (int)(MAX(kl1->slop.dval, kl2->slop.dval) + 0.5);
if (islop == 0) {
if (strcasecmp(vl1->value.string, vl2->value.string)) {
if (!(*matchfunc)(vl1->value.string, vl2->value.string)) {
if (do_print) {
if (mismatches == 0)
Fprintf(stdout, "%s vs. %s:\n", inst1, inst2);
@@ -5172,7 +5172,7 @@ PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print,
kl2 = (struct property *)HashLookup(vl2->key, &(tc2->propdict));
if (kl2 != NULL) {
// Allowed for one instance to be missing "M" or "S".
if (strcasecmp(vl2->key, "M") && strcasecmp(vl2->key, "S"))
if (!(*matchfunc)(vl2->key, "M") && !(*matchfunc)(vl2->key, "S"))
break; // Property is required
}
}
@@ -5223,7 +5223,7 @@ PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print,
kl1 = (struct property *)HashLookup(vl1->key, &(tc1->propdict));
if (kl1 != NULL) {
// Allowed for one instance to be missing "M" or "S".
if (strcasecmp(vl1->key, "M") && strcasecmp(vl1->key, "S"))
if (!(*matchfunc)(vl1->key, "M") && !(*matchfunc)(vl1->key, "S"))
break; // Property is required
}
}
@@ -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) {
@@ -6508,7 +6508,7 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
for (m = 0; m < 43; m++) *(ostr + m) = ' ';
for (m = 44; m < 87; m++) *(ostr + m) = ' ';
snprintf(ostr, 43, "%s", obn->name);
if (!strcasecmp(obn->name, obp->name))
if ((*matchfunc)(obn->name, obp->name))
snprintf(ostr + 44, 43, "%s", obp->name);
else
snprintf(ostr + 44, 43, "%s **Mismatch**", obp->name);
-6423
View File
File diff suppressed because it is too large Load Diff
+27 -21
View File
@@ -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}
};
+5 -4
View File
@@ -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);
+18 -27
View File
@@ -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;
}
/*----------------------------------------------------------------------*/
+1
View File
@@ -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);
+22 -22
View File
@@ -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(";");
+36 -2
View File
@@ -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++;
}
@@ -257,6 +290,7 @@ void InitCellHashTable(void)
{
hashfunc = hash;
matchfunc = match;
matchintfunc = matchfile;
InitializeHashTable(&cell_dict, CELLHASHSIZE);
}
+8
View File
@@ -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);
+31 -31
View File
@@ -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;
+1343
View File
File diff suppressed because it is too large Load Diff
+13 -5
View File
@@ -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;