Compare commits

...
35 Commits
Author SHA1 Message Date
Tim Edwards 62648c5672 Merge branch 'master' into work 2018-04-25 15:03:18 -04:00
Tim Edwards 7d113beada Update at Wed Apr 25 15:03:16 EDT 2018 by tim 2018-04-25 15:03:16 -04:00
Tim Edwards 1fe341833c Expanded the verilog parsing to include simple handling of ifdef,
ifndef, endif conditional statements.  Pre-define the key "LVS"
for use with netgen.  Also corrected some problems stemming from
the way delimiters are handled and the flexible use of whitespace
in verilog.
2018-04-25 15:00:49 -04:00
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
Tim Edwards eefdb61e14 Merge branch 'master' into work 2018-04-05 10:10:47 -04:00
Tim Edwards 1d1ad3c833 Update at Thu Apr 5 10:10:44 EDT 2018 by tim 2018-04-05 10:10:44 -04:00
Tim Edwards 4166408576 Discovered a subtle error caused by running a setup script that
calls "equate pins".  This could fail because the routine that forces
uniqueness of pins was being called by the "compare" command but
outside of PinMatch.  Fixed by duplicating the call to force uniqueness
of pins inside the "equate" function.  Redundant calls should not
matter as uniqueness is resolved on the first call and subsequent calls
will need no further action.
2018-04-05 10:06:32 -04:00
Tim Edwards 2b15b731bb Merge branch 'master' into work 2018-03-28 12:40:17 -04:00
Tim Edwards 9ad6ad3338 Update at Wed Mar 28 12:40:15 EDT 2018 by tim 2018-03-28 12:40:15 -04:00
Tim Edwards 0fb5efd914 Corrected a crash condition during pin matching if any subcell has
no pins at all.
2018-03-28 12:39:40 -04:00
Tim Edwards 763117aabe Merge branch 'master' into work 2018-01-29 13:26:41 -05:00
Tim Edwards 96a95d337f Update at Mon Jan 29 13:26:39 EST 2018 by tim 2018-01-29 13:26:39 -05:00
Tim Edwards 393788a039 Changed behavior of the "lvs" script so that the setup file can
be specified as "nosetup" if the "lvs" command is being called
interactively from a terminal or as part of a larger script where
setup commands have been issued prior to running the "lvs" script.
Similarly, the log file can be specified as "nolog" to prevent any
log file from being generated.
2018-01-29 13:24:54 -05:00
Tim Edwards c630c2e397 Merge branch 'master' into work 2018-01-26 11:58:07 -05:00
Tim Edwards 1e8685128c Update at Fri Jan 26 11:58:05 EST 2018 by tim 2018-01-26 11:58:05 -05:00
Tim Edwards 440f61d540 Corrected a number of function returns, mainly to avoid compile-
time warnings and errors.  Removed the "-lazy" option from the
Tcl load command, which is not needed when the stubs libraries
are compiled in correctly, and which causes issues on some
systems (e.g., Mac OS).  Thanks to Matt Guthaus for the patch.
2018-01-26 11:56:41 -05:00
Tim Edwards cc532b2cb7 Merge branch 'master' into work 2017-12-14 21:50:33 -05:00
Tim Edwards 2a4c7b3cde Update at Thu Dec 14 21:50:32 EST 2017 by tim 2017-12-14 21:50:32 -05:00
Tim Edwards 87e44b0d8c Corrected an issue in which netgen would attempt to find a file
from a ".include" line by trying alternate extensions.  This
should be discouraged, as it happened that a file included
"name.defparams", a file that didn't exist, and instead of calling
out the missing file, it recast it to "name.spice" and caused it
to drop into an infinite loop.  Oops.
2017-12-14 21:48:01 -05:00
Tim Edwards e1322dbaf6 Merge branch 'master' into work 2017-12-07 08:46:43 -05:00
Tim Edwards 661157e041 Update at Thu Dec 7 08:46:40 EST 2017 by tim 2017-12-07 08:46:40 -05:00
Tim Edwards 77e5d70626 Corrected Tcl list output (and, by consequence, the JSON file
output) to include pin information (missing "-list" argument to
the "equate pins" command).
2017-12-07 08:45:37 -05:00
Tim Edwards 4098b7d5fd Completed an unimplemented method that sets missing properties to
the default before comparing instances against each other for
serial/parallel combination.  In particular, this avoids a
failure to serially combine a device with M = 1 vs. a device with
no M declared.
2017-10-12 15:26:29 -04:00
Tim Edwards f860244700 Provide additional output for mismatched serial/parallel networks.
Netgen was incorrectly treating mismatched networks as a missing
set of parameters on whichever device had more property records,
resulting in misleading output.
2017-10-12 14:17:24 -04:00
Tim Edwards 66015511cb Corrected mismatch count, which was prematurely declaring a
mismatch on "M=" even though some conditions pass.
2017-10-12 12:30:33 -04:00
Tim Edwards b3277ca53e Modified reading of SPICE files so that parameters in quotes get
treated monolithically instead of being broken up into separate
tokens according to space characters, which screws up the parameter
parsing.
2017-10-12 12:11:30 -04:00
Tim Edwards 00c2e74524 Merge branch 'master' into work 2017-10-12 10:52:58 -04:00
Tim Edwards bdb8917327 Update at Thu Oct 12 10:52:56 EDT 2017 by tim 2017-10-12 10:52:56 -04:00
Tim Edwards 95bce5dbd6 Corrected another error in the serial combination in which the
attempt to resolve values by combining over serial chains was
attempting to access a property "S" in the component's master
record, which generally won't exist unless it has been explicitly
set in the netlist (which is unlikely since "S" is not a standard
SPICE/CDL parameter like "M").
2017-10-12 10:51:13 -04:00
28 changed files with 2043 additions and 6762 deletions
+1 -1
View File
@@ -1 +1 @@
1.5.87
1.5.97
+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);
}
+1 -1
View File
@@ -1417,7 +1417,7 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
else
tc2 = LookupCellFile(name2, file2);
if (tc1 == NULL || tc2 == NULL) return;
if (tc1 == NULL || tc2 == NULL) return 0;
InitializeHashTable(&compdict, OBJHASHSIZE);
+1 -1
View File
@@ -309,7 +309,7 @@ struct hashlist *HashInt2PtrInstall(char *name, int c, void *ptr,
/* destroy a hash table, freeing associated memory */
/*----------------------------------------------------------------------*/
void *HashKill(struct hashdict *dict)
void HashKill(struct hashdict *dict)
{
struct hashlist *np, *p;
int i;
+1
View File
@@ -25,6 +25,7 @@ extern struct nlist *RecurseHashTablePointer(struct hashdict *dict,
void *pointer);
extern void HashDelete(char *name, struct hashdict *dict);
extern void HashIntDelete(char *name, int value, struct hashdict *dict);
extern void HashKill(struct hashdict *dict);
extern int CountHashTableEntries(struct hashlist *p);
+155 -31
View File
@@ -573,7 +573,7 @@ struct FormattedList *FormatBadElementFragment(struct Element *E)
elemlist = (struct FormattedList *)MALLOC(sizeof(struct FormattedList));
if (elemlist == NULL) {
Fprintf(stdout, "Unable to allocated memory to print element fanout.\n");
return;
return NULL;
}
fanout = 0;
@@ -582,7 +582,7 @@ struct FormattedList *FormatBadElementFragment(struct Element *E)
if (nodes == NULL) {
Fprintf(stderr, "Unable to allocate memory to print element fanout.\n");
FREE(elemlist);
return;
return NULL;
}
elemlist->flist = (struct FanoutList *)CALLOC(fanout, sizeof(struct FanoutList));
@@ -829,14 +829,14 @@ struct FormattedList *FormatBadNodeFragment(struct Node *N)
pins = (struct ElementList **)CALLOC(fanout, sizeof(struct ElementList *));
if (pins == NULL) {
Fprintf(stdout, "Unable to allocate memory to print node fanout.\n");
return;
return NULL;
}
nodelist = (struct FormattedList *)MALLOC(sizeof(struct FormattedList));
if (nodelist == NULL) {
Fprintf(stdout, "Unable to allocate memory to print node fanout.\n");
FREE(pins);
return;
return NULL;
}
nodelist->flist = (struct FanoutList *)CALLOC(fanout, sizeof(struct FanoutList));
nodelist->fanout = fanout;
@@ -3780,12 +3780,14 @@ void serial_sort(struct objlist *ob1, struct nlist *tp1, int idx1, int run)
if (vl->key == NULL) continue;
if (!strcmp(vl->key, "S"))
sval = vl->value.ival;
kl = (struct property *)HashLookup(vl->key, &(tp1->propdict));
if (kl->merge == MERGE_SER_CRIT)
if (vl->type == PROP_INTEGER)
cval = (double)vl->value.ival;
else
cval = vl->value.dval;
else {
kl = (struct property *)HashLookup(vl->key, &(tp1->propdict));
if (kl && (kl->merge == MERGE_SER_CRIT))
if (vl->type == PROP_INTEGER)
cval = (double)vl->value.ival;
else
cval = vl->value.dval;
}
}
proplist[i].value = (double)sval * cval;
proplist[i].idx = i;
@@ -4224,9 +4226,9 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int serial)
struct property *kl, *m_rec, **plist;
struct valuelist ***vlist, *vl, *vl2, *newvlist;
proplinkptr plink, ptop;
int pcount, p, i, j, pmatch, ival, crit, ctype;
int pcount, p, i, j, k, pmatch, ival, crit, ctype;
double dval;
static struct valuelist nullvl;
static struct valuelist nullvl, dfltvl;
char multiple[2];
int changed = 0;
@@ -4336,9 +4338,37 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int serial)
pmatch++;
continue;
}
// TO-DO: If either value is missing, it takes kl->pdefault
// If either value is missing, it takes kl->pdefault
// and must apply promotions if necessary.
else if (vl == NULL || vl2 == NULL) continue;
else if (vl == NULL || vl2 == NULL) {
if (vl == NULL) {
if (kl->type != vlist[p][j]->type)
PromoteProperty(kl, vl2);
}
else {
if (kl->type != vlist[p][i]->type)
PromoteProperty(kl, vl);
}
vl = &dfltvl;
dfltvl.type = kl->type;
switch (kl->type) {
case PROP_STRING:
dfltvl.value.string = kl->pdefault.string;
break;
case PROP_INTEGER:
dfltvl.value.ival = kl->pdefault.ival;
break;
case PROP_DOUBLE:
case PROP_VALUE:
dfltvl.value.ival = kl->pdefault.ival;
break;
case PROP_EXPRESSION:
dfltvl.value.stack = kl->pdefault.stack;
break;
}
}
// Critical properties can be multiplied up by M (S) and do not
// need to match. May want a more nuanced comparison, though.
@@ -4885,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);
@@ -4953,6 +4983,52 @@ PropertyCheckMismatch(struct objlist *tp1, struct nlist *tc1,
}
/*--------------------------------------------------------------*/
/* Dump a description of a device's serial/parallel network */
/*--------------------------------------------------------------*/
void DumpNetwork(struct objlist *ob, int cidx)
{
struct valuelist *vl;
struct objlist *tp;
int i;
for (tp = ob; tp && (tp->type != PROPERTY); tp = tp->next)
if ((tp > ob) && (tp->type == FIRSTPIN))
return;
if (tp == NULL) return;
Fprintf(stdout, "Circuit %d instance %s network:\n", cidx, ob->instance.name);
for (; tp && (tp->type == PROPERTY); tp = tp->next) {
for (i = 0;; i++) {
vl = &(tp->instance.props[i]);
if (vl->type == PROP_ENDLIST) break;
if (!strcmp(vl->key, "_tag")) {
Fprintf(stdout, "%s\n", vl->value.string);
continue;
}
Fprintf(stdout, " %s = ", vl->key);
switch(vl->type) {
case PROP_STRING:
Fprintf(stdout, "%s\n", vl->value.string);
break;
case PROP_INTEGER:
Fprintf(stdout, "%d\n", vl->value.ival);
break;
case PROP_DOUBLE:
case PROP_VALUE:
Fprintf(stdout, "%g\n", vl->value.dval);
break;
case PROP_EXPRESSION:
Fprintf(stdout, "(expression)\n");
break;
}
}
}
}
/*--------------------------------------------------------------*/
/* Compare the properties of two objects. The passed values */
/* ob1 and ob2 are pointers to the first entry (firstpin) of */
@@ -4981,7 +5057,7 @@ PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print,
struct property *kl1, *kl2;
struct valuelist *vl1, *vl2;
int t1type, t2type;
int i, mismatches = 0;
int i, mismatches = 0, checked_one;
int rval = 1;
char *inst1, *inst2;
#ifdef TCL_NETGEN
@@ -5073,8 +5149,18 @@ PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print,
inst2 = ob2->instance.name;
if (*inst2 == '/') inst2++;
checked_one = FALSE;
while(1) {
if (t1type != PROPERTY) {
if ((t1type != PROPERTY) && (checked_one == TRUE)) {
// t2 has more property records than t1, and they did not get
// merged equally by PropertySortAndCombine().
Fprintf(stdout, "Circuit 1 parallel/serial network does not match"
" Circuit 2\n");
DumpNetwork(ob1, 1);
DumpNetwork(ob2, 2);
mismatches++;
}
else if (t1type != PROPERTY) {
// t1 has no properties. See if t2's properties are required
// to be checked. If so, flag t2 instance as unmatched
@@ -5084,13 +5170,24 @@ PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print,
if (vl2 == NULL) continue;
if (vl2->key == NULL) continue;
kl2 = (struct property *)HashLookup(vl2->key, &(tc2->propdict));
if (kl2 != NULL) break; // Property is required
if (kl2 != NULL) {
// Allowed for one instance to be missing "M" or "S".
if (!(*matchfunc)(vl2->key, "M") && !(*matchfunc)(vl2->key, "S"))
break; // Property is required
}
}
if (vl2->type != PROP_ENDLIST) {
mismatches++;
if (do_print) Fprintf(stdout, "Circuit 2 %s instance %s has no"
" property match in circuit 1.\n",
Circuit2->name, inst2);
if (do_print) {
if (vl2 && vl2->key)
Fprintf(stdout, "Circuit 2 %s instance %s property"
" \"%s\" has no match in circuit 1.\n",
Circuit2->name, inst2, vl2->key);
else
Fprintf(stdout, "Circuit 2 %s instance %s has no"
" property match in circuit 1.\n",
Circuit2->name, inst2);
}
#ifdef TCL_NETGEN
if (do_list) {
mpair = PropertyList(NULL, vl2);
@@ -5105,23 +5202,43 @@ PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print,
else
rval = 0;
}
else if ((t2type != PROPERTY) && (checked_one == TRUE)) {
// t1 has more property records than t2, and they did not get
// merged equally by PropertySortAndCombine().
Fprintf(stdout, "Circuit 2 parallel/serial network does not match"
" Circuit 1\n");
DumpNetwork(ob1, 1);
DumpNetwork(ob2, 2);
mismatches++;
}
else if (t2type != PROPERTY) {
// t2 has no properties. See if t1's properties are required
// to be checked. If so, flag t1 instance as unmatched
mismatches++;
for (i = 0;; i++) {
vl1 = &(tp1->instance.props[i]);
if (vl1->type == PROP_ENDLIST) break;
if (vl1 == NULL) continue;
if (vl1->key == NULL) continue;
kl1 = (struct property *)HashLookup(vl1->key, &(tc1->propdict));
if (kl1 != NULL) break; // Property is required
if (kl1 != NULL) {
// Allowed for one instance to be missing "M" or "S".
if (!(*matchfunc)(vl1->key, "M") && !(*matchfunc)(vl1->key, "S"))
break; // Property is required
}
}
if (vl1->type != PROP_ENDLIST) {
if (do_print) Fprintf(stdout, "Circuit 1 %s instance %s has no"
" property match in Circuit 2.\n",
Circuit1->name, inst1);
mismatches++;
if (do_print) {
if (vl1 && vl1->key)
Fprintf(stdout, "Circuit 1 %s instance %s property"
" \"%s\" has no match in circuit 2.\n",
Circuit1->name, inst1, vl1->key);
else
Fprintf(stdout, "Circuit 1 %s instance %s has no"
" property match in circuit 2.\n",
Circuit1->name, inst1);
}
#ifdef TCL_NETGEN
if (do_list) {
mpair = PropertyList(vl1, NULL);
@@ -5171,6 +5288,7 @@ PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print,
t1type = (tp1) ? tp1->type : 0;
t2type = (tp2) ? tp2->type : 0;
if ((t1type != PROPERTY) && (t2type != PROPERTY)) break;
checked_one = TRUE;
}
*retval = (rval < 0) ? rval : mismatches;
@@ -5936,7 +6054,7 @@ int IgnoreClass(char *name, int file, unsigned char type)
if ((file == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
IgnoreClass(name, Circuit1->file, type);
IgnoreClass(name, Circuit2->file, type);
return;
return 0;
}
newIgnore = (struct IgnoreList *)MALLOC(sizeof(struct IgnoreList));
@@ -6086,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) {
@@ -6275,9 +6393,13 @@ struct nlist *addproxies(struct hashlist *p, void *clientdata)
/* circuit pair has been matched with automorphisms, */
/* then some pins may be matched arbitrarily. */
/* */
/* Return 1 on success, 0 on failure. */
/* If "dolist" is 1, append the list representing the */
/* output (if any) to variable tcl_out, if it exists. */
/* */
/* Return codes: */
/* 2: Neither cell had pins, so matching is unnecessary */
/* 1: Exact match */
/* 0: Inexact match resolved by proxy pin insertion */
/*------------------------------------------------------*/
int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
@@ -6314,7 +6436,7 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
if (haspins == 0) {
// Neither cell has any ports, so this is probably a top-level
// cell and there is nothing to do.
return 1;
return 2;
}
cover = (char *)CALLOC(numnodes, sizeof(char));
@@ -6386,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);
@@ -6557,6 +6679,7 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
if (ob1 && ob1->next && ob1->next->type != PORT)
break;
}
if (ob1 == NULL) ob1 = tc1->cell; /* No ports */
/* Assign non-matching pins in tc2 with real node */
/* connections in the cell to the end. Create pins */
@@ -6642,6 +6765,7 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
if (ob2 && ob2->next && ob2->next->type != PORT)
break;
}
if (ob2 == NULL) ob2 = tc2->cell; /* No ports */
/* If cell 2 has fewer nodes than cell 1, then add dummy (unconnected) */
/* pins to cell 2. If these correspond to numbers missing in the match */
-6423
View File
File diff suppressed because it is too large Load Diff
+89 -21
View File
@@ -193,6 +193,67 @@ static struct filestack *OpenFiles = NULL;
#define TOKEN_DELIMITER " \t\n\r"
/*----------------------------------------------------------------------*/
/* TrimQuoted() --- */
/* Remove spaces from inside single- or double-quoted strings. */
/*----------------------------------------------------------------------*/
void TrimQuoted(char *line)
{
char *qstart, *qend, *lptr;
int slen;
int changed;
/* Single-quoted entries */
changed = TRUE;
lptr = line;
while (changed)
{
changed = FALSE;
qstart = strchr(lptr, '\'');
if (qstart)
{
qend = strchr(qstart + 1, '\'');
if (qend && (qend > qstart)) {
slen = strlen(lptr);
for (lptr = qstart + 1; lptr < qend; lptr++) {
if (*lptr == ' ') {
memmove(lptr, lptr + 1, slen);
qend--;
changed = TRUE;
}
}
lptr++;
}
}
}
/* Double-quoted entries */
changed = TRUE;
lptr = line;
while (changed)
{
changed = FALSE;
qstart = strchr(lptr, '\"');
if (qstart)
{
qend = strchr(qstart + 1, '\"');
if (qend && (qend > qstart)) {
slen = strlen(lptr);
for (lptr = qstart + 1; lptr < qend; lptr++) {
if (*lptr == ' ') {
memmove(lptr, lptr + 1, slen);
qend--;
changed = TRUE;
}
}
lptr++;
}
}
}
}
/*----------------------------------------------------------------------*/
/* GetNextLineNoNewline() */
/* */
@@ -202,7 +263,7 @@ static struct filestack *OpenFiles = NULL;
/* */
/*----------------------------------------------------------------------*/
int GetNextLineNoNewline()
int GetNextLineNoNewline(char *delimiter)
{
char *newbuf;
int testc;
@@ -233,8 +294,9 @@ int GetNextLineNoNewline()
}
linenum++;
strcpy(linetok, line);
TrimQuoted(linetok);
nexttok = strtok(linetok, TOKEN_DELIMITER);
nexttok = strtok(linetok, delimiter);
return 0;
}
@@ -243,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);
}
@@ -254,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);
}
/*----------------------------------------------------------------------*/
@@ -266,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);
}
/*----------------------------------------------------------------------*/
@@ -295,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;
}
}
@@ -311,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);
}
/*----------------------------------------------------------------------*/
@@ -325,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);
@@ -418,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;
@@ -430,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) */
@@ -443,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);
+22 -31
View File
@@ -1038,7 +1038,7 @@ struct property *PropertyValue(char *name, int fnum, char *key,
if ((fnum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
PropertyValue(name, Circuit1->file, key, slop, pdefault);
PropertyValue(name, Circuit2->file, key, slop, pdefault);
return;
return NULL;
}
tc = LookupCellFile(name, fnum);
@@ -1073,7 +1073,7 @@ struct property *PropertyDouble(char *name, int fnum, char *key,
if ((fnum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
PropertyDouble(name, Circuit1->file, key, slop, pdefault);
PropertyDouble(name, Circuit2->file, key, slop, pdefault);
return;
return NULL;
}
tc = LookupCellFile(name, fnum);
@@ -1106,7 +1106,7 @@ struct property *PropertyInteger(char *name, int fnum, char *key,
if ((fnum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
PropertyInteger(name, Circuit1->file, key, slop, pdefault);
PropertyInteger(name, Circuit2->file, key, slop, pdefault);
return;
return NULL;
}
tc = LookupCellFile(name, fnum);
@@ -1139,7 +1139,7 @@ struct property *PropertyString(char *name, int fnum, char *key, double dval,
if ((fnum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
PropertyString(name, Circuit1->file, key, dval, pdefault);
PropertyString(name, Circuit2->file, key, dval, pdefault);
return;
return NULL;
}
tc = LookupCellFile(name, 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;
}
/*----------------------------------------------------------------------*/
+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(";");
+39 -5
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);
}
@@ -348,7 +382,7 @@ int removeshorted(struct hashlist *p, int file)
ptr = (struct nlist *)(p->ptr);
if ((file != -1) && (ptr->file != file)) return;
if ((file != -1) && (ptr->file != file)) return 0;
lob = NULL;
for (ob = ptr->cell; ob != NULL;) {
@@ -412,7 +446,7 @@ int deleteclass(struct hashlist *p, int file)
ptr = (struct nlist *)(p->ptr);
if ((file != -1) && (ptr->file != file)) return;
if ((file != -1) && (ptr->file != file)) return 0;
lob = NULL;
for (ob = ptr->cell; ob != NULL;) {
@@ -469,7 +503,7 @@ int renameinstances(struct hashlist *p, int file)
ptr = (struct nlist *)(p->ptr);
if ((file != -1) && (ptr->file != file)) return;
if ((file != -1) && (ptr->file != file)) return 0;
for (ob = ptr->cell; ob != NULL; ob = ob->next) {
if ((ob->type >= FIRSTPIN) && (ob->model.class != NULL)) {
+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);
+39 -36
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;
@@ -1941,12 +1941,15 @@ void IncludeSpice(char *fname, int parent, struct cellstack **CellStackPtr,
if ((filenum = OpenParseFile(fname, parent)) < 0) {
/* If that fails, see if a standard SPICE extension */
/* helps. But really, we're getting desperate at this */
/* point. */
/* helps, if the file didn't have an extension. But */
/* really, we're getting desperate at this point. */
SetExtension(name, fname, SPICE_EXTENSION);
if ((filenum = OpenParseFile(name, parent)) < 0) {
Fprintf(stderr,"Error in SPICE file read: No file %s\n",name);
if (strchr(fname, '.') == NULL) {
SetExtension(name, fname, SPICE_EXTENSION);
filenum = OpenParseFile(name, parent);
}
if (filenum < 0) {
Fprintf(stderr,"Error in SPICE file include: No file %s\n",name);
return;
}
}
+1441
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -132,6 +132,7 @@ char *xilinx_class(model)
}
return(model);
}
void
Xilinx(cellname, filename)
char *cellname;
char *filename;
+2 -2
View File
@@ -66,8 +66,8 @@ CPP = gcc -E -x c
CXX = @CXX@
CPPFLAGS = -I. -I${NETGENDIR}
DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DUSE_TCL_STUBS -DUSE_TK_STUBS -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"60\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
DFLAGS_NOSTUB = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"60\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DUSE_TCL_STUBS -DUSE_TK_STUBS -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"90\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
DFLAGS_NOSTUB = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"90\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
CFLAGS = -g -m64 -fPIC -fPIC
DEPEND_FILE = Depend
+2 -2
View File
@@ -22,8 +22,8 @@ tclnetgen${SHDLIB_EXT}: ${EXTRA_LIBS}
@echo --- making netgen Tcl library \(tclnetgen${SHDLIB_EXT}\)
${RM} tclnetgen${SHDLIB_EXT}
${CC} ${CFLAGS} ${CPPFLAGS} -o $@ ${LDDL_FLAGS} \
${LD_RUN_PATH} ${EXTRA_LIBS} ${LD_EXTRA_LIBS} -lc ${LIBS} \
${LIB_SPECS} ${LDFLAGS}
${LD_RUN_PATH} ${EXTRA_LIBS} ${LD_EXTRA_LIBS} \
-lc ${LIBS} ${LIB_SPECS} ${LDFLAGS}
$(DESTDIR)${BINDIR}/netgen:
${RM} $@
+14 -14
View File
@@ -12,9 +12,9 @@ generated by GNU Autoconf 2.69. Invocation command line was
hostname = stravinsky
uname -m = x86_64
uname -r = 3.18.3-201.fc21.x86_64
uname -r = 4.1.13-100.fc21.x86_64
uname -s = Linux
uname -v = #1 SMP Mon Jan 19 15:59:31 UTC 2015
uname -v = #1 SMP Tue Nov 10 13:13:20 UTC 2015
/usr/bin/uname -p = x86_64
/bin/uname -X = unknown
@@ -50,7 +50,7 @@ configure:2584: found /bin/gcc
configure:2595: result: gcc
configure:2824: checking for C compiler version
configure:2833: gcc --version >&5
gcc (GCC) 4.9.2 20141101 (Red Hat 4.9.2-1)
gcc (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6)
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
@@ -61,9 +61,9 @@ Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.9.2/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.9.2-20141101/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.9.2-20141101/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.9.2-20150212/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.9.2-20150212/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.9.2 20141101 (Red Hat 4.9.2-1) (GCC)
gcc version 4.9.2 20150212 (Red Hat 4.9.2-6) (GCC)
configure:2844: $? = 0
configure:2833: gcc -V >&5
gcc: error: unrecognized command line option '-V'
@@ -125,7 +125,7 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "60"
| #define NETGEN_REVISION "90"
| /* end confdefs.h. */
| #include <ac_nonexistent.h>
configure:3384: result: gcc -E
@@ -146,7 +146,7 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "60"
| #define NETGEN_REVISION "90"
| /* end confdefs.h. */
| #include <ac_nonexistent.h>
configure:3447: checking for library containing strerror
@@ -261,7 +261,7 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "60"
| #define NETGEN_REVISION "90"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
@@ -302,7 +302,7 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "60"
| #define NETGEN_REVISION "90"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
@@ -382,7 +382,7 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "60"
| #define NETGEN_REVISION "90"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
@@ -454,7 +454,7 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "60"
| #define NETGEN_REVISION "90"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
@@ -521,7 +521,7 @@ configure:5949: checking for IceConnectionNumber in -lICE
configure:5974: gcc -o conftest -g conftest.c -lICE >&5
configure:5974: $? = 0
configure:5983: result: yes
configure:6705: creating ./config.status
configure:6704: creating ./config.status
## ---------------------- ##
## Running config.status. ##
@@ -621,7 +621,7 @@ CC='gcc'
CFLAGS='-g -m64 -fPIC'
CPP='gcc -E -x c'
CPPFLAGS=''
DEFS='-DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"60\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1'
DEFS='-DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"90\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1'
DEPEND_FLAG='-MM'
ECHO_C=''
ECHO_N='printf'
@@ -736,7 +736,7 @@ unused=''
#define PACKAGE_BUGREPORT "[email protected]"
#define PACKAGE_URL ""
#define NETGEN_VERSION "1.5"
#define NETGEN_REVISION "60"
#define NETGEN_REVISION "90"
#define STDC_HEADERS 1
#define HAVE_SYS_TYPES_H 1
#define HAVE_SYS_STAT_H 1
+1 -1
View File
@@ -659,7 +659,7 @@ S["ECHO_T"]=""
S["ECHO_N"]="-n"
S["ECHO_C"]=""
S["DEFS"]="-DPACKAGE_NAME=\\\"netgen\\\" -DPACKAGE_TARNAME=\\\"netgen\\\" -DPACKAGE_VERSION=\\\"1.3\\\" -DPACKAGE_STRING=\\\"netgen\\ 1.3\\\" -DPACKAGE_BUGREPORT=\\\"eda-dev@open"\
"circuitdesign.com\\\" -DPACKAGE_URL=\\\"\\\" -DNETGEN_VERSION=\\\"1.5\\\" -DNETGEN_REVISION=\\\"60\\\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -"\
"circuitdesign.com\\\" -DPACKAGE_URL=\\\"\\\" -DNETGEN_VERSION=\\\"1.5\\\" -DNETGEN_REVISION=\\\"90\\\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -"\
"DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -D"\
"SIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHA"\
"VE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1"
+1 -2
View File
@@ -6081,8 +6081,7 @@ case $target in
;;
*darwin*)
$as_echo "#define macosx 1" >>confdefs.h
$as_echo "#define macosx macos" >> confdefs.h
if test "$CPP" = "cc -E" ; then
CPPFLAGS="$CPPFLAGS -no-cpp-precomp"
fi
+1 -1
View File
@@ -868,7 +868,7 @@ case $target in
AC_DEFINE(i386)
;;
*darwin*)
AC_DEFINE(macosx)
$as_echo "#define macosx macos" >> confdefs.h
if test "$CPP" = "cc -E" ; then
CPPFLAGS="$CPPFLAGS -no-cpp-precomp"
fi
+2 -2
View File
@@ -66,8 +66,8 @@ CPP = gcc -E -x c
CXX = @CXX@
CPPFLAGS = -I. -I${NETGENDIR}
DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DUSE_TCL_STUBS -DUSE_TK_STUBS -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"60\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
DFLAGS_NOSTUB = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"60\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DUSE_TCL_STUBS -DUSE_TK_STUBS -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"90\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
DFLAGS_NOSTUB = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"90\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
CFLAGS = -g -m64 -fPIC -fPIC
DEPEND_FILE = Depend
+5 -5
View File
@@ -28,14 +28,14 @@ netgenexec${EXEEXT}: netgenexec.c
${LDFLAGS} ${LIBS} ${LIB_SPECS_NOSTUB}
netgen.tcl: netgen.tcl.in
sed -e /TCL_DIR/s%TCL_DIR%${TCLDIR}%g \
-e /SHDLIB_EXT/s%SHDLIB_EXT%${SHDLIB_EXT}%g \
sed -e 's%TCL_DIR%${TCLDIR}%g' \
-e 's%SHDLIB_EXT%${SHDLIB_EXT}%g' \
netgen.tcl.in > netgen.tcl
netgen.sh: netgen.sh.in
sed -e /TCL_DIR/s%TCL_DIR%${TCLDIR}%g \
-e /TCLLIB_DIR/s%TCLLIB_DIR%${TCL_LIB_DIR}%g \
-e /WISH_EXE/s%WISH_EXE%${WISH_EXE}%g \
sed -e 's%TCL_DIR%${TCLDIR}%g' \
-e 's%TCLLIB_DIR%${TCL_LIB_DIR}%g' \
-e 's%WISH_EXE%${WISH_EXE}%g' \
netgen.sh.in > netgen.sh
$(DESTDIR)${TCLDIR}/%: %
+26 -13
View File
@@ -20,11 +20,10 @@ foreach i $nlist {
}
}
if {${tcl_version} >= 8.6} {
load -lazy TCL_DIR/tclnetgenSHDLIB_EXT
} else {
load TCL_DIR/tclnetgenSHDLIB_EXT
}
# -lazy option not needed if stubs libraries are handled correctly
# load -lazy TCL_DIR/tclnetgenSHDLIB_EXT
load TCL_DIR/tclnetgenSHDLIB_EXT
#----------------------------------------------------------------
# Convert LVS list result into a JSON file
@@ -476,15 +475,22 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
if {$perrors > 0} {
puts stdout "Warning: There were errors reading the setup file"
}
} else {
} elseif {[string first nosetup $setupfile] < 0} {
netgen::permute default ;# transistors and resistors
netgen::property default
}
puts stdout "Comparison output logged to file $logfile"
netgen::log file $logfile
netgen::log start
netgen::log echo off
if {[string first nolog $logfile] < 0} {
puts stdout "Comparison output logged to file $logfile"
netgen::log file $logfile
netgen::log start
netgen::log echo off
set dolog true
} else {
set dolog false
}
if {$dolist == 1} {
set endval [netgen::compare -list hierarchical "$fnum1 $cell1" "$fnum2 $cell2"]
} else {
@@ -529,8 +535,13 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
} else {
# Match pins
netgen::log echo off
set result [equate pins "$fnum1 [lindex $endval 0]" \
"$fnum2 [lindex $endval 1]"]
if {$dolist == 1} {
set result [equate pins "$fnum1 [lindex $endval 0]" \
"$fnum2 [lindex $endval 1]"]
} else {
set result [equate -list pins "$fnum1 [lindex $endval 0]" \
"$fnum2 [lindex $endval 1]"]
}
if {$result != 0} {
equate classes "$fnum1 [lindex $endval 0]" \
"$fnum2 [lindex $endval 1]"
@@ -562,7 +573,9 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
if {$properr != {}} {
netgen::log put "The following cells had property errors: $properr\n"
}
netgen::log end
if {$dolog} {
netgen::log end
}
puts stdout "LVS Done."
if {$dojson == 1} {
netgen::convert_to_json $logfile $lvs_final
+28 -9
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;
@@ -2910,15 +2918,26 @@ _netcmp_equate(ClientData clientData,
Circuit1 = tp1;
Circuit2 = tp2;
}
if (MatchPins(tp1, tp2, dolist)) {
// Check for and remove duplicate pins. Normally this is called
// from "compare", but since "equate pins" may be called outside
// of and before "compare", pin uniqueness needs to be ensured.
UniquePins(tp1->name, tp1->file);
UniquePins(tp2->name, tp2->file);
result = MatchPins(tp1, tp2, dolist);
if (result == 2) {
Fprintf(stdout, "Cells have no pins; pin matching not needed.\n");
}
else if (result > 0) {
Fprintf(stdout, "Cell pin lists are equivalent.\n");
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(1));
}
else {
Fprintf(stdout, "Cell pin lists for %s and %s altered to match.\n",
name1, name2);
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(0));
}
Tcl_SetObjResult(interp, Tcl_NewIntObj(result));
if (ElementClasses == NULL) {
/* Recover temporarily set global variables (see above) */
Circuit1 = SaveC1;
@@ -4071,7 +4090,7 @@ int Tclnetgen_Init(Tcl_Interp *interp)
if (cadroot == NULL) cadroot = CAD_DIR;
Tcl_SetVar(interp, "CAD_ROOT", cadroot, TCL_GLOBAL_ONLY);
Tcl_PkgProvide(interp, "Tclnetgen", "1.1");
Tcl_PkgProvide(interp, "Tclnetgen", NETGEN_VERSION);
if ((consoleinterp = Tcl_GetMaster(interp)) == NULL)
consoleinterp = interp;