mirror of
https://github.com/RTimothyEdwards/netgen.git
synced 2026-08-28 17:05:45 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
02a77b61f9 | ||
|
|
dfd1e59432 | ||
|
|
f14ebf323f | ||
|
|
62648c5672 | ||
|
|
7d113beada | ||
|
|
1fe341833c | ||
|
|
aee4b846e2 | ||
|
|
004378be11 | ||
|
|
dc42e98ab9 | ||
|
|
58d7e17231 | ||
|
|
de30eeabe8 | ||
|
|
feab5023e5 | ||
|
|
4d65b0006d | ||
|
|
eefdb61e14 | ||
|
|
1d1ad3c833 | ||
|
|
4166408576 | ||
|
|
2b15b731bb | ||
|
|
9ad6ad3338 | ||
|
|
0fb5efd914 | ||
|
|
763117aabe | ||
|
|
96a95d337f | ||
|
|
393788a039 | ||
|
|
c630c2e397 | ||
|
|
1e8685128c | ||
|
|
440f61d540 | ||
|
|
cc532b2cb7 | ||
|
|
2a4c7b3cde | ||
|
|
87e44b0d8c | ||
|
|
e1322dbaf6 | ||
|
|
661157e041 | ||
|
|
77e5d70626 | ||
|
|
4098b7d5fd | ||
|
|
f860244700 | ||
|
|
66015511cb | ||
|
|
b3277ca53e | ||
|
|
00c2e74524 | ||
|
|
bdb8917327 | ||
|
|
95bce5dbd6 | ||
|
|
e15620257c | ||
|
|
7a947ee9be | ||
|
|
b5f188de42 | ||
|
|
ccbb286cf3 | ||
|
|
4809c02f79 | ||
|
|
af3982766e | ||
|
|
25c1f13e16 | ||
|
|
f0eec657a3 | ||
|
|
9d476bc25a | ||
|
|
5ed3fcb3f1 | ||
|
|
ab9659af17 | ||
|
|
41939adb84 | ||
|
|
39573981be | ||
|
|
b9e26f6fce | ||
|
|
78779ce2e9 | ||
|
|
70bb33cc62 | ||
|
|
fdf2f32654 | ||
|
|
05d4225e97 | ||
|
|
b6218699a9 | ||
|
|
d7927ef547 | ||
|
|
af7bc39bbf | ||
|
|
5cd68b9ef1 | ||
|
|
07788e7501 | ||
|
|
24cc7d0c94 | ||
|
|
dbcd36d3ec | ||
|
|
25c17abb70 | ||
|
|
fd019b4afd | ||
|
|
cdfd74bac4 | ||
|
|
dd9e02c5f3 | ||
|
|
26cd16f3ff | ||
|
|
ccdd47bc0b | ||
|
|
ace1c28507 | ||
|
|
5e9635e05f | ||
|
|
5c168946e3 | ||
|
|
1471f0c09f | ||
|
|
73b81fcfe3 | ||
|
|
b083a6df7c | ||
|
|
2b5a96500c | ||
|
|
66f94b47e6 | ||
|
|
09532ee628 | ||
|
|
2b7d416a41 | ||
|
|
090e9e122a | ||
|
|
67f1c1a2e9 | ||
|
|
a7dcb4ef45 |
+11
-10
@@ -1,12 +1,13 @@
|
|||||||
*.*%
|
netgen
|
||||||
*.cdslck
|
netgenexec
|
||||||
.inca.db.*
|
defs.mak
|
||||||
inca.*.pak
|
Depend
|
||||||
*.swp
|
config.cache
|
||||||
*.log
|
config.log
|
||||||
|
config.status
|
||||||
|
*.o
|
||||||
*.so
|
*.so
|
||||||
*~
|
*~
|
||||||
*/av_extracted*/
|
*.log
|
||||||
.nfs*
|
UPDATE_ME
|
||||||
*.cd-
|
VERSION
|
||||||
*/mommdl/
|
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@ NETGENDIR = ..
|
|||||||
SRCS = actel.c ccode.c greedy.c ntk.c print.c actellib.c embed.c \
|
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 \
|
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 \
|
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
|
X11_SRCS = xnetgen.c
|
||||||
|
|
||||||
include ${NETGENDIR}/defs.mak
|
include ${NETGENDIR}/defs.mak
|
||||||
|
|||||||
+134
-134
@@ -196,16 +196,16 @@ char *ReadExt(char *fname, int doflat, int *fnum)
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (!EndParseFile()) {
|
while (!EndParseFile()) {
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
|
|
||||||
if (EndParseFile()) break;
|
if (EndParseFile()) break;
|
||||||
if (nexttok[0] == '#') SkipNewLine();
|
if (nexttok[0] == '#') SkipNewLine(NULL);
|
||||||
else if (match(nexttok, "timestamp")) SkipNewLine();
|
else if (match(nexttok, "timestamp")) SkipNewLine(NULL);
|
||||||
else if (match(nexttok, "version")) SkipNewLine();
|
else if (match(nexttok, "version")) SkipNewLine(NULL);
|
||||||
else if (match(nexttok, "tech")) SkipNewLine();
|
else if (match(nexttok, "tech")) SkipNewLine(NULL);
|
||||||
else if (match(nexttok, "scale")) SkipNewLine();
|
else if (match(nexttok, "scale")) SkipNewLine(NULL);
|
||||||
else if (match(nexttok, "style")) SkipNewLine();
|
else if (match(nexttok, "style")) SkipNewLine(NULL);
|
||||||
else if (match(nexttok, "resistclasses")) SkipNewLine();
|
else if (match(nexttok, "resistclasses")) SkipNewLine(NULL);
|
||||||
else if (match(nexttok, "node")) {
|
else if (match(nexttok, "node")) {
|
||||||
char name[200];
|
char name[200];
|
||||||
|
|
||||||
@@ -216,122 +216,122 @@ char *ReadExt(char *fname, int doflat, int *fnum)
|
|||||||
CellDef(fname, filenum);
|
CellDef(fname, filenum);
|
||||||
CellDefInProgress = 1;
|
CellDefInProgress = 1;
|
||||||
}
|
}
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(name, nexttok);
|
GetExtName(name, nexttok);
|
||||||
Node(name); /* Ports will be determined by context */
|
Node(name); /* Ports will be determined by context */
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
}
|
}
|
||||||
else if (match(nexttok, "equiv")) {
|
else if (match(nexttok, "equiv")) {
|
||||||
char name[200];
|
char name[200];
|
||||||
char name2[200];
|
char name2[200];
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(name, nexttok);
|
GetExtName(name, nexttok);
|
||||||
if (LookupObject(name,CurrentCell) == NULL) Node(name);
|
if (LookupObject(name,CurrentCell) == NULL) Node(name);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(name2, nexttok);
|
GetExtName(name2, nexttok);
|
||||||
if (LookupObject(name2,CurrentCell) == NULL) Node(name2);
|
if (LookupObject(name2,CurrentCell) == NULL) Node(name2);
|
||||||
join(name, name2);
|
join(name, name2);
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
}
|
}
|
||||||
else if (match(nexttok, "device")) {
|
else if (match(nexttok, "device")) {
|
||||||
char dev_name[100], dev_class[100];
|
char dev_name[100], dev_class[100];
|
||||||
char gate[200], drain[200], source[200], subs[200];
|
char gate[200], drain[200], source[200], subs[200];
|
||||||
char inststr[64];
|
char inststr[64];
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcpy(dev_class, nexttok);
|
strcpy(dev_class, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcpy(dev_name, nexttok);
|
strcpy(dev_name, nexttok);
|
||||||
SkipTok(); /* x coord of gate box */
|
SkipTok(NULL); /* x coord of gate box */
|
||||||
strcpy(inststr, dev_class);
|
strcpy(inststr, dev_class);
|
||||||
strcat(inststr, "@");
|
strcat(inststr, "@");
|
||||||
strcat(inststr, nexttok);
|
strcat(inststr, nexttok);
|
||||||
SkipTok(); /* y coord of gate box */
|
SkipTok(NULL); /* y coord of gate box */
|
||||||
strcat(inststr, ",");
|
strcat(inststr, ",");
|
||||||
strcat(inststr, nexttok);
|
strcat(inststr, nexttok);
|
||||||
SkipTok(); /* skip coord of gate box */
|
SkipTok(NULL); /* skip coord of gate box */
|
||||||
SkipTok(); /* skip coord of gate box */
|
SkipTok(NULL); /* skip coord of gate box */
|
||||||
|
|
||||||
/* Device-dependent parameters */
|
/* Device-dependent parameters */
|
||||||
|
|
||||||
if (match(dev_class, "mosfet")) {
|
if (match(dev_class, "mosfet")) {
|
||||||
SkipTok(); /* skip device length */
|
SkipTok(NULL); /* skip device length */
|
||||||
SkipTok(); /* skip device width */
|
SkipTok(NULL); /* skip device width */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(subs, nexttok);
|
GetExtName(subs, nexttok);
|
||||||
}
|
}
|
||||||
else if (match(dev_class, "bjt")) {
|
else if (match(dev_class, "bjt")) {
|
||||||
SkipTok(); /* skip device length */
|
SkipTok(NULL); /* skip device length */
|
||||||
SkipTok(); /* skip device width */
|
SkipTok(NULL); /* skip device width */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(subs, nexttok);
|
GetExtName(subs, nexttok);
|
||||||
}
|
}
|
||||||
else if (match(dev_class, "devcap")) {
|
else if (match(dev_class, "devcap")) {
|
||||||
SkipTok(); /* skip device length */
|
SkipTok(NULL); /* skip device length */
|
||||||
SkipTok(); /* skip device width */ /* or. . . */
|
SkipTok(NULL); /* skip device width */ /* or. . . */
|
||||||
}
|
}
|
||||||
else if (match(dev_class, "devres")) {
|
else if (match(dev_class, "devres")) {
|
||||||
SkipTok(); /* skip device length */
|
SkipTok(NULL); /* skip device length */
|
||||||
SkipTok(); /* skip device width */ /* or. . . */
|
SkipTok(NULL); /* skip device width */ /* or. . . */
|
||||||
}
|
}
|
||||||
else if (match(dev_class, "diode")) {
|
else if (match(dev_class, "diode")) {
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(gate, nexttok);
|
GetExtName(gate, nexttok);
|
||||||
SkipTok(); /* skip terminal length */
|
SkipTok(NULL); /* skip terminal length */
|
||||||
SkipTok(); /* skip terminal attributes */
|
SkipTok(NULL); /* skip terminal attributes */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(drain, nexttok);
|
GetExtName(drain, nexttok);
|
||||||
SkipTok(); /* skip terminal length */
|
SkipTok(NULL); /* skip terminal length */
|
||||||
SkipTok(); /* skip terminal attributes */
|
SkipTok(NULL); /* skip terminal attributes */
|
||||||
}
|
}
|
||||||
else if (match(dev_class, "subckt")) {
|
else if (match(dev_class, "subckt")) {
|
||||||
SkipTok(); /* skip device length */
|
SkipTok(NULL); /* skip device length */
|
||||||
SkipTok(); /* skip device width */
|
SkipTok(NULL); /* skip device width */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(subs, nexttok);
|
GetExtName(subs, nexttok);
|
||||||
while (nexttok != NULL) {
|
while (nexttok != NULL) {
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(gate, nexttok);
|
GetExtName(gate, nexttok);
|
||||||
SkipTok(); /* skip terminal length */
|
SkipTok(NULL); /* skip terminal length */
|
||||||
SkipTok(); /* skip terminal attributes */
|
SkipTok(NULL); /* skip terminal attributes */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (match(dev_class, "rsubckt")) {
|
else if (match(dev_class, "rsubckt")) {
|
||||||
SkipTok(); /* skip device length */
|
SkipTok(NULL); /* skip device length */
|
||||||
SkipTok(); /* skip device width */
|
SkipTok(NULL); /* skip device width */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(subs, nexttok);
|
GetExtName(subs, nexttok);
|
||||||
}
|
}
|
||||||
SkipTokNoNewline();
|
SkipTokNoNewline(NULL);
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
}
|
}
|
||||||
else if (match(nexttok, "fet")) { /* old-style FET record */
|
else if (match(nexttok, "fet")) { /* old-style FET record */
|
||||||
char fet_class[100];
|
char fet_class[100];
|
||||||
char gate[200], drain[200], source[200], subs[200];
|
char gate[200], drain[200], source[200], subs[200];
|
||||||
char inststr[64];
|
char inststr[64];
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcpy(fet_class, nexttok);
|
strcpy(fet_class, nexttok);
|
||||||
SkipTok(); /* x coord of gate box */
|
SkipTok(NULL); /* x coord of gate box */
|
||||||
strcpy(inststr, fet_class);
|
strcpy(inststr, fet_class);
|
||||||
strcat(inststr, "@");
|
strcat(inststr, "@");
|
||||||
strcat(inststr, nexttok);
|
strcat(inststr, nexttok);
|
||||||
SkipTok(); /* y coord of gate box */
|
SkipTok(NULL); /* y coord of gate box */
|
||||||
strcat(inststr, ",");
|
strcat(inststr, ",");
|
||||||
strcat(inststr, nexttok);
|
strcat(inststr, nexttok);
|
||||||
SkipTok(); /* skip coord of gate box */
|
SkipTok(NULL); /* skip coord of gate box */
|
||||||
SkipTok(); /* skip coord of gate box */
|
SkipTok(NULL); /* skip coord of gate box */
|
||||||
SkipTok(); /* skip gate area */
|
SkipTok(NULL); /* skip gate area */
|
||||||
SkipTok(); /* skip gate perimeter */
|
SkipTok(NULL); /* skip gate perimeter */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(subs, nexttok);
|
GetExtName(subs, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(gate, nexttok);
|
GetExtName(gate, nexttok);
|
||||||
SkipTok(); /* skip terminal length */
|
SkipTok(NULL); /* skip terminal length */
|
||||||
SkipTok(); /* skip terminal attributes */
|
SkipTok(NULL); /* skip terminal attributes */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(drain, nexttok);
|
GetExtName(drain, nexttok);
|
||||||
SkipTok(); /* skip terminal length */
|
SkipTok(NULL); /* skip terminal length */
|
||||||
SkipTok(); /* skip terminal attributes */
|
SkipTok(NULL); /* skip terminal attributes */
|
||||||
SkipTokNoNewline();
|
SkipTokNoNewline(NULL);
|
||||||
if (nexttok == NULL) {
|
if (nexttok == NULL) {
|
||||||
/* This gets around a problem with the magic extractor in which */
|
/* This gets around a problem with the magic extractor in which */
|
||||||
/* transistors having shorted source-drain are written into the */
|
/* transistors having shorted source-drain are written into the */
|
||||||
@@ -341,7 +341,7 @@ char *ReadExt(char *fname, int doflat, int *fnum)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
GetExtName(source, nexttok);
|
GetExtName(source, nexttok);
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
/* remap transistors into things we know about */
|
/* remap transistors into things we know about */
|
||||||
if (match(fet_class, "nfet"))
|
if (match(fet_class, "nfet"))
|
||||||
N(fname, inststr, gate, drain, source);
|
N(fname, inststr, gate, drain, source);
|
||||||
@@ -361,15 +361,15 @@ char *ReadExt(char *fname, int doflat, int *fnum)
|
|||||||
else if (match(nexttok, "cap")) {
|
else if (match(nexttok, "cap")) {
|
||||||
if (IgnoreRC) {
|
if (IgnoreRC) {
|
||||||
/* ignore all capacitances */
|
/* ignore all capacitances */
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
char ctop[200], cbot[200], cdummy[200];
|
char ctop[200], cbot[200], cdummy[200];
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(ctop, nexttok);
|
GetExtName(ctop, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(cbot, nexttok);
|
GetExtName(cbot, nexttok);
|
||||||
SkipNewLine(); /* Skip over capacitance value */
|
SkipNewLine(NULL); /* Skip over capacitance value */
|
||||||
Cap(fname, NULL, ctop, cbot);
|
Cap(fname, NULL, ctop, cbot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -386,14 +386,14 @@ char *ReadExt(char *fname, int doflat, int *fnum)
|
|||||||
CellDefInProgress = 1;
|
CellDefInProgress = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(name, nexttok);
|
GetExtName(name, nexttok);
|
||||||
if ((basename = strrchr(name,'/')) != NULL) {
|
if ((basename = strrchr(name,'/')) != NULL) {
|
||||||
char tmp[200];
|
char tmp[200];
|
||||||
strcpy(tmp, basename+1);
|
strcpy(tmp, basename+1);
|
||||||
strcpy(name, tmp);
|
strcpy(name, tmp);
|
||||||
}
|
}
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(instancename, nexttok);
|
GetExtName(instancename, nexttok);
|
||||||
Printf("Instancing %s as %s\n", name, instancename);
|
Printf("Instancing %s as %s\n", name, instancename);
|
||||||
Instance(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);
|
Printf("Flattening %s in %s\n", instancename, fname);
|
||||||
flattenInstancesOf(NULL, filenum, name);
|
flattenInstancesOf(NULL, filenum, name);
|
||||||
}
|
}
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
}
|
}
|
||||||
else if (match(nexttok, "merge")) {
|
else if (match(nexttok, "merge")) {
|
||||||
char name[200];
|
char name[200];
|
||||||
char name2[200];
|
char name2[200];
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(name, nexttok);
|
GetExtName(name, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(name2, nexttok);
|
GetExtName(name2, nexttok);
|
||||||
if (doflat)
|
if (doflat)
|
||||||
join(name, name2);
|
join(name, name2);
|
||||||
@@ -416,12 +416,12 @@ char *ReadExt(char *fname, int doflat, int *fnum)
|
|||||||
join(name, name2);
|
join(name, name2);
|
||||||
else {
|
else {
|
||||||
}
|
}
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Printf("Strange token in ext: '%s'\n", nexttok);
|
Printf("Strange token in ext: '%s'\n", nexttok);
|
||||||
InputParseError(stderr);
|
InputParseError(stderr);
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CloseParseFile();
|
CloseParseFile();
|
||||||
@@ -657,189 +657,189 @@ char *ReadSim(char *fname, int *fnum)
|
|||||||
CellDef(fname, filenum);
|
CellDef(fname, filenum);
|
||||||
|
|
||||||
while (!EndParseFile()) {
|
while (!EndParseFile()) {
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
|
|
||||||
if (EndParseFile()) break;
|
if (EndParseFile()) break;
|
||||||
if (nexttok[0] == '|') {
|
if (nexttok[0] == '|') {
|
||||||
SkipTok(); /* "units" */
|
SkipTok(NULL); /* "units" */
|
||||||
if (!strcmp(nexttok, "units:")) {
|
if (!strcmp(nexttok, "units:")) {
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
simscale = strtod(nexttok, NULL);
|
simscale = strtod(nexttok, NULL);
|
||||||
}
|
}
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
}
|
}
|
||||||
else if (match(nexttok, "n")) {
|
else if (match(nexttok, "n")) {
|
||||||
char gate[200], drain[200], source[200];
|
char gate[200], drain[200], source[200];
|
||||||
char inststr[25], *instptr = NULL;
|
char inststr[25], *instptr = NULL;
|
||||||
|
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(gate, nexttok);
|
GetExtName(gate, nexttok);
|
||||||
if (LookupObject(gate, CurrentCell) == NULL)
|
if (LookupObject(gate, CurrentCell) == NULL)
|
||||||
Node(gate); /* define the node if it does not already exist */
|
Node(gate); /* define the node if it does not already exist */
|
||||||
|
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(drain, nexttok);
|
GetExtName(drain, nexttok);
|
||||||
if (LookupObject(drain, CurrentCell) == NULL)
|
if (LookupObject(drain, CurrentCell) == NULL)
|
||||||
Node(drain); /* define the node if it does not already exist */
|
Node(drain); /* define the node if it does not already exist */
|
||||||
|
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(source, nexttok);
|
GetExtName(source, nexttok);
|
||||||
if (LookupObject(source, CurrentCell) == NULL)
|
if (LookupObject(source, CurrentCell) == NULL)
|
||||||
Node(source); /* define the node if it does not already exist */
|
Node(source); /* define the node if it does not already exist */
|
||||||
|
|
||||||
SkipTokNoNewline(); /* length */
|
SkipTokNoNewline(NULL); /* length */
|
||||||
if ((nexttok != NULL) && (nexttok[0] != '\0')) {
|
if ((nexttok != NULL) && (nexttok[0] != '\0')) {
|
||||||
vstr = ScaleStringFloatValue(&nexttok[0], simscale * 1e-8);
|
vstr = ScaleStringFloatValue(&nexttok[0], simscale * 1e-8);
|
||||||
AddProperty(&kvlist, "length", vstr);
|
AddProperty(&kvlist, "length", vstr);
|
||||||
SkipTok(); /* width */
|
SkipTok(NULL); /* width */
|
||||||
if ((nexttok != NULL) && (nexttok[0] != '\0')) {
|
if ((nexttok != NULL) && (nexttok[0] != '\0')) {
|
||||||
vstr = ScaleStringFloatValue(&nexttok[0], simscale * 1e-8);
|
vstr = ScaleStringFloatValue(&nexttok[0], simscale * 1e-8);
|
||||||
AddProperty(&kvlist, "width", vstr);
|
AddProperty(&kvlist, "width", vstr);
|
||||||
}
|
}
|
||||||
SkipTokNoNewline();
|
SkipTokNoNewline(NULL);
|
||||||
if (nexttok != NULL) {
|
if (nexttok != NULL) {
|
||||||
if (StrIsInt(nexttok)) {
|
if (StrIsInt(nexttok)) {
|
||||||
strcpy(inststr, "n@");
|
strcpy(inststr, "n@");
|
||||||
strcat(inststr, nexttok);
|
strcat(inststr, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcat(inststr, ",");
|
strcat(inststr, ",");
|
||||||
strcat(inststr, nexttok);
|
strcat(inststr, nexttok);
|
||||||
instptr = inststr;
|
instptr = inststr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SkipNewLine(); /* skip any attributes */
|
SkipNewLine(NULL); /* skip any attributes */
|
||||||
N(fname, instptr, gate, drain, source);
|
N(fname, instptr, gate, drain, source);
|
||||||
LinkProperties("n", kvlist);
|
LinkProperties("n", kvlist);
|
||||||
}
|
}
|
||||||
else if (match(nexttok, "p")) {
|
else if (match(nexttok, "p")) {
|
||||||
char gate[200], drain[200], source[200];
|
char gate[200], drain[200], source[200];
|
||||||
char inststr[25], *instptr = NULL;
|
char inststr[25], *instptr = NULL;
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(gate, nexttok);
|
GetExtName(gate, nexttok);
|
||||||
if (LookupObject(gate, CurrentCell) == NULL)
|
if (LookupObject(gate, CurrentCell) == NULL)
|
||||||
Node(gate); /* define the node if it does not already exist */
|
Node(gate); /* define the node if it does not already exist */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(drain, nexttok);
|
GetExtName(drain, nexttok);
|
||||||
if (LookupObject(drain, CurrentCell) == NULL)
|
if (LookupObject(drain, CurrentCell) == NULL)
|
||||||
Node(drain); /* define the node if it does not already exist */
|
Node(drain); /* define the node if it does not already exist */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(source, nexttok);
|
GetExtName(source, nexttok);
|
||||||
if (LookupObject(source, CurrentCell) == NULL)
|
if (LookupObject(source, CurrentCell) == NULL)
|
||||||
Node(source); /* define the node if it does not already exist */
|
Node(source); /* define the node if it does not already exist */
|
||||||
SkipTokNoNewline(); /* length */
|
SkipTokNoNewline(NULL); /* length */
|
||||||
if ((nexttok != NULL) && (nexttok[0] != '\0')) {
|
if ((nexttok != NULL) && (nexttok[0] != '\0')) {
|
||||||
vstr = ScaleStringFloatValue(&nexttok[0], simscale * 1e-8);
|
vstr = ScaleStringFloatValue(&nexttok[0], simscale * 1e-8);
|
||||||
AddProperty(&kvlist, "length", vstr);
|
AddProperty(&kvlist, "length", vstr);
|
||||||
SkipTok(); /* width */
|
SkipTok(NULL); /* width */
|
||||||
if ((nexttok != NULL) && (nexttok[0] != '\0')) {
|
if ((nexttok != NULL) && (nexttok[0] != '\0')) {
|
||||||
vstr = ScaleStringFloatValue(&nexttok[0], simscale * 1e-8);
|
vstr = ScaleStringFloatValue(&nexttok[0], simscale * 1e-8);
|
||||||
AddProperty(&kvlist, "width", vstr);
|
AddProperty(&kvlist, "width", vstr);
|
||||||
}
|
}
|
||||||
SkipTokNoNewline();
|
SkipTokNoNewline(NULL);
|
||||||
if (nexttok != NULL) {
|
if (nexttok != NULL) {
|
||||||
if (StrIsInt(nexttok)) {
|
if (StrIsInt(nexttok)) {
|
||||||
strcpy(inststr, "p@");
|
strcpy(inststr, "p@");
|
||||||
strcat(inststr, nexttok);
|
strcat(inststr, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcat(inststr, ",");
|
strcat(inststr, ",");
|
||||||
strcat(inststr, nexttok);
|
strcat(inststr, nexttok);
|
||||||
instptr = inststr;
|
instptr = inststr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SkipNewLine(); /* skip various attributes */
|
SkipNewLine(NULL); /* skip various attributes */
|
||||||
P(fname, instptr, gate, drain, source);
|
P(fname, instptr, gate, drain, source);
|
||||||
LinkProperties("p", kvlist);
|
LinkProperties("p", kvlist);
|
||||||
}
|
}
|
||||||
else if (match(nexttok, "e")) { /* 3-port capacitors (poly/poly2) */
|
else if (match(nexttok, "e")) { /* 3-port capacitors (poly/poly2) */
|
||||||
char gate[200], drain[200], source[200];
|
char gate[200], drain[200], source[200];
|
||||||
char inststr[25], *instptr = NULL;
|
char inststr[25], *instptr = NULL;
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(gate, nexttok);
|
GetExtName(gate, nexttok);
|
||||||
if (LookupObject(gate, CurrentCell) == NULL)
|
if (LookupObject(gate, CurrentCell) == NULL)
|
||||||
Node(gate); /* define the node if it does not already exist */
|
Node(gate); /* define the node if it does not already exist */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(drain, nexttok);
|
GetExtName(drain, nexttok);
|
||||||
if (LookupObject(drain, CurrentCell) == NULL)
|
if (LookupObject(drain, CurrentCell) == NULL)
|
||||||
Node(drain); /* define the node if it does not already exist */
|
Node(drain); /* define the node if it does not already exist */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(source, nexttok);
|
GetExtName(source, nexttok);
|
||||||
if (LookupObject(source, CurrentCell) == NULL)
|
if (LookupObject(source, CurrentCell) == NULL)
|
||||||
Node(source); /* define the node if it does not already exist */
|
Node(source); /* define the node if it does not already exist */
|
||||||
SkipTokNoNewline(); /* skip length */
|
SkipTokNoNewline(NULL); /* skip length */
|
||||||
if (nexttok != NULL) {
|
if (nexttok != NULL) {
|
||||||
SkipTok(); /* skip width */
|
SkipTok(NULL); /* skip width */
|
||||||
SkipTokNoNewline();
|
SkipTokNoNewline(NULL);
|
||||||
inststr[0] = '\0';
|
inststr[0] = '\0';
|
||||||
if (nexttok != NULL) {
|
if (nexttok != NULL) {
|
||||||
if (StrIsInt(nexttok)) {
|
if (StrIsInt(nexttok)) {
|
||||||
strcpy(inststr, "e@");
|
strcpy(inststr, "e@");
|
||||||
strcat(inststr, nexttok);
|
strcat(inststr, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcat(inststr, ",");
|
strcat(inststr, ",");
|
||||||
strcat(inststr, nexttok);
|
strcat(inststr, nexttok);
|
||||||
instptr = inststr;
|
instptr = inststr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SkipNewLine(); /* skip various attributes */
|
SkipNewLine(NULL); /* skip various attributes */
|
||||||
E(fname, instptr, gate, drain, source);
|
E(fname, instptr, gate, drain, source);
|
||||||
}
|
}
|
||||||
else if (match(nexttok, "b")) { /* bipolars added by Tim 7/16/96 */
|
else if (match(nexttok, "b")) { /* bipolars added by Tim 7/16/96 */
|
||||||
char base[200], emitter[200], collector[200];
|
char base[200], emitter[200], collector[200];
|
||||||
char inststr[25], *instptr = NULL;
|
char inststr[25], *instptr = NULL;
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(base, nexttok);
|
GetExtName(base, nexttok);
|
||||||
if (LookupObject(base, CurrentCell) == NULL)
|
if (LookupObject(base, CurrentCell) == NULL)
|
||||||
Node(base); /* define the node if it does not already exist */
|
Node(base); /* define the node if it does not already exist */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(emitter, nexttok);
|
GetExtName(emitter, nexttok);
|
||||||
if (LookupObject(emitter, CurrentCell) == NULL)
|
if (LookupObject(emitter, CurrentCell) == NULL)
|
||||||
Node(emitter); /* define the node if it does not already exist */
|
Node(emitter); /* define the node if it does not already exist */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(collector, nexttok);
|
GetExtName(collector, nexttok);
|
||||||
if (LookupObject(collector, CurrentCell) == NULL)
|
if (LookupObject(collector, CurrentCell) == NULL)
|
||||||
Node(collector); /* define the node if it does not already exist */
|
Node(collector); /* define the node if it does not already exist */
|
||||||
SkipTokNoNewline(); /* skip length */
|
SkipTokNoNewline(NULL); /* skip length */
|
||||||
if (nexttok != NULL) {
|
if (nexttok != NULL) {
|
||||||
SkipTok(); /* skip width */
|
SkipTok(NULL); /* skip width */
|
||||||
SkipTokNoNewline();
|
SkipTokNoNewline(NULL);
|
||||||
if (nexttok != NULL) {
|
if (nexttok != NULL) {
|
||||||
if (StrIsInt(nexttok)) {
|
if (StrIsInt(nexttok)) {
|
||||||
strcpy(inststr, "b@");
|
strcpy(inststr, "b@");
|
||||||
strcat(inststr, nexttok);
|
strcat(inststr, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcat(inststr, ",");
|
strcat(inststr, ",");
|
||||||
strcat(inststr, nexttok);
|
strcat(inststr, nexttok);
|
||||||
instptr = inststr;
|
instptr = inststr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SkipNewLine(); /* skip various attributes */
|
SkipNewLine(NULL); /* skip various attributes */
|
||||||
B(fname, instptr, collector, base, emitter);
|
B(fname, instptr, collector, base, emitter);
|
||||||
}
|
}
|
||||||
else if (matchnocase(nexttok, "c")) { /* 2-port capacitors */
|
else if (matchnocase(nexttok, "c")) { /* 2-port capacitors */
|
||||||
if (IgnoreRC) {
|
if (IgnoreRC) {
|
||||||
/* ignore all capacitances */
|
/* ignore all capacitances */
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
char ctop[200], cbot[200], cdummy[200];
|
char ctop[200], cbot[200], cdummy[200];
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(ctop, nexttok);
|
GetExtName(ctop, nexttok);
|
||||||
if (LookupObject(ctop, CurrentCell) == NULL)
|
if (LookupObject(ctop, CurrentCell) == NULL)
|
||||||
Node(ctop); /* define the node if it does not already exist */
|
Node(ctop); /* define the node if it does not already exist */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(cbot, nexttok);
|
GetExtName(cbot, nexttok);
|
||||||
if (LookupObject(cbot, CurrentCell) == NULL)
|
if (LookupObject(cbot, CurrentCell) == NULL)
|
||||||
Node(cbot); /* define the node if it does not already exist */
|
Node(cbot); /* define the node if it does not already exist */
|
||||||
SkipTokNoNewline();
|
SkipTokNoNewline(NULL);
|
||||||
if (nexttok != NULL) {
|
if (nexttok != NULL) {
|
||||||
vstr = ScaleStringFloatValue(&nexttok[0], 1e-15);
|
vstr = ScaleStringFloatValue(&nexttok[0], 1e-15);
|
||||||
AddProperty(&kvlist, "value", vstr);
|
AddProperty(&kvlist, "value", vstr);
|
||||||
}
|
}
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
Cap(fname, NULL, ctop, cbot);
|
Cap(fname, NULL, ctop, cbot);
|
||||||
LinkProperties("c", kvlist);
|
LinkProperties("c", kvlist);
|
||||||
}
|
}
|
||||||
@@ -847,23 +847,23 @@ char *ReadSim(char *fname, int *fnum)
|
|||||||
else if (match(nexttok, "r")) { /* 2-port resistors */
|
else if (match(nexttok, "r")) { /* 2-port resistors */
|
||||||
if (IgnoreRC) {
|
if (IgnoreRC) {
|
||||||
/* ignore all capacitances */
|
/* ignore all capacitances */
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
char rtop[200], rbot[200];
|
char rtop[200], rbot[200];
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(rtop, nexttok);
|
GetExtName(rtop, nexttok);
|
||||||
if (LookupObject(rtop, CurrentCell) == NULL)
|
if (LookupObject(rtop, CurrentCell) == NULL)
|
||||||
Node(rtop); /* define the node if it does not already exist */
|
Node(rtop); /* define the node if it does not already exist */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(rbot, nexttok);
|
GetExtName(rbot, nexttok);
|
||||||
if (LookupObject(rbot, CurrentCell) == NULL)
|
if (LookupObject(rbot, CurrentCell) == NULL)
|
||||||
Node(rbot); /* define the node if it does not already exist */
|
Node(rbot); /* define the node if it does not already exist */
|
||||||
SkipTokNoNewline();
|
SkipTokNoNewline(NULL);
|
||||||
if (nexttok != NULL) {
|
if (nexttok != NULL) {
|
||||||
AddProperty(&kvlist, "value", &nexttok[0]);
|
AddProperty(&kvlist, "value", &nexttok[0]);
|
||||||
}
|
}
|
||||||
SkipNewLine(); /* skip various attributes */
|
SkipNewLine(NULL); /* skip various attributes */
|
||||||
Res(fname, NULL, rtop, rbot);
|
Res(fname, NULL, rtop, rbot);
|
||||||
LinkProperties("r", kvlist);
|
LinkProperties("r", kvlist);
|
||||||
}
|
}
|
||||||
@@ -871,55 +871,55 @@ char *ReadSim(char *fname, int *fnum)
|
|||||||
else if (match(nexttok, "z")) { /* 3-port resistors from magic */
|
else if (match(nexttok, "z")) { /* 3-port resistors from magic */
|
||||||
if (IgnoreRC) {
|
if (IgnoreRC) {
|
||||||
/* ignore all capacitances */
|
/* ignore all capacitances */
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
char rtop[200], rbot[200], rdummy[200];
|
char rtop[200], rbot[200], rdummy[200];
|
||||||
char inststr[25], *instptr = NULL;
|
char inststr[25], *instptr = NULL;
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(rdummy, nexttok);
|
GetExtName(rdummy, nexttok);
|
||||||
if (LookupObject(rdummy, CurrentCell) == NULL)
|
if (LookupObject(rdummy, CurrentCell) == NULL)
|
||||||
Node(rdummy); /* define the node if it does not already exist */
|
Node(rdummy); /* define the node if it does not already exist */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(rtop, nexttok);
|
GetExtName(rtop, nexttok);
|
||||||
if (LookupObject(rtop, CurrentCell) == NULL)
|
if (LookupObject(rtop, CurrentCell) == NULL)
|
||||||
Node(rtop); /* define the node if it does not already exist */
|
Node(rtop); /* define the node if it does not already exist */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(rbot, nexttok);
|
GetExtName(rbot, nexttok);
|
||||||
if (LookupObject(rbot, CurrentCell) == NULL)
|
if (LookupObject(rbot, CurrentCell) == NULL)
|
||||||
Node(rbot); /* define the node if it does not already exist */
|
Node(rbot); /* define the node if it does not already exist */
|
||||||
SkipTokNoNewline(); /* skip length */
|
SkipTokNoNewline(NULL); /* skip length */
|
||||||
if (nexttok != NULL) {
|
if (nexttok != NULL) {
|
||||||
SkipTok(); /* skip width */
|
SkipTok(NULL); /* skip width */
|
||||||
SkipTokNoNewline();
|
SkipTokNoNewline(NULL);
|
||||||
if (nexttok != NULL) {
|
if (nexttok != NULL) {
|
||||||
if (StrIsInt(nexttok)) {
|
if (StrIsInt(nexttok)) {
|
||||||
strcpy(inststr, "z@");
|
strcpy(inststr, "z@");
|
||||||
strcat(inststr, nexttok);
|
strcat(inststr, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcat(inststr, ",");
|
strcat(inststr, ",");
|
||||||
strcat(inststr, nexttok);
|
strcat(inststr, nexttok);
|
||||||
instptr = inststr;
|
instptr = inststr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SkipNewLine(); /* skip various attributes */
|
SkipNewLine(NULL); /* skip various attributes */
|
||||||
Res3(fname, instptr, rdummy, rtop, rbot);
|
Res3(fname, instptr, rdummy, rtop, rbot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (match(nexttok, "N")) {
|
else if (match(nexttok, "N")) {
|
||||||
/* ignore this keyword */
|
/* ignore this keyword */
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
}
|
}
|
||||||
else if (match(nexttok, "A")) {
|
else if (match(nexttok, "A")) {
|
||||||
/* ignore this keyword */
|
/* ignore this keyword */
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
}
|
}
|
||||||
else if (match(nexttok, "=")) {
|
else if (match(nexttok, "=")) {
|
||||||
char node1[200], node2[200];
|
char node1[200], node2[200];
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(node1, nexttok);
|
GetExtName(node1, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
GetExtName(node2, nexttok);
|
GetExtName(node2, nexttok);
|
||||||
join(node1, node2);
|
join(node1, node2);
|
||||||
}
|
}
|
||||||
@@ -928,12 +928,12 @@ char *ReadSim(char *fname, int *fnum)
|
|||||||
Printf("Ignoring lumped resistances (\"R\" records) in .sim.\n");
|
Printf("Ignoring lumped resistances (\"R\" records) in .sim.\n");
|
||||||
has_lumped = 1; /* Don't print this message more than once */
|
has_lumped = 1; /* Don't print this message more than once */
|
||||||
}
|
}
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Printf("Strange token in .sim: '%s'\n", nexttok);
|
Printf("Strange token in .sim: '%s'\n", nexttok);
|
||||||
InputParseError(stderr);
|
InputParseError(stderr);
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
}
|
}
|
||||||
DeleteProperties(&kvlist);
|
DeleteProperties(&kvlist);
|
||||||
}
|
}
|
||||||
|
|||||||
+26
-16
@@ -486,24 +486,30 @@ int flattenInstancesOf(char *name, int fnum, char *instance)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* splice instance out of parent */
|
/* splice instance out of parent */
|
||||||
if (ParentParams == ThisCell->cell) {
|
if ((ParentParams == ThisCell->cell) && (ChildObjList == NULL)) {
|
||||||
/* ParentParams are the very first thing in the list */
|
ThisCell->cell = ob2; /* Child cell was empty */
|
||||||
ThisCell->cell = ChildObjList;
|
tmp = ob2;
|
||||||
for (ob2 = ChildObjList; ob2 && ob2->next != NULL; ob2 = ob2->next) ;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* find ParentParams in ThisCell list */
|
if (ParentParams == ThisCell->cell) {
|
||||||
for (ob2 = ThisCell->cell; ob2 && ob2->next != ParentParams; ob2=ob2->next);
|
/* ParentParams are the very first thing in the list */
|
||||||
if (ob2)
|
ThisCell->cell = ChildObjList;
|
||||||
for (ob2->next = ChildObjList; ob2->next != NULL; ob2 = ob2->next) ;
|
for (ob2 = ChildObjList; ob2 && ob2->next != NULL; ob2 = ob2->next) ;
|
||||||
}
|
}
|
||||||
/* now, ob2 is last element in child list, so skip and reclaim parent */
|
else {
|
||||||
|
/* find ParentParams in ThisCell list */
|
||||||
|
for (ob2 = ThisCell->cell; ob2 && ob2->next != ParentParams; ob2=ob2->next);
|
||||||
|
if (ob2)
|
||||||
|
for (ob2->next = ChildObjList; ob2->next != NULL; ob2 = ob2->next) ;
|
||||||
|
}
|
||||||
|
/* now, ob2 is last element in child list, so skip and reclaim parent */
|
||||||
|
|
||||||
tmp = ParentParams;
|
tmp = ParentParams;
|
||||||
do {
|
do {
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
} while ((tmp != NULL) && ((tmp->type > FIRSTPIN) || (tmp->type == PROPERTY)));
|
} while ((tmp != NULL) && ((tmp->type > FIRSTPIN) || (tmp->type == PROPERTY)));
|
||||||
if (ob2) ob2->next = tmp;
|
if (ob2) ob2->next = tmp;
|
||||||
|
}
|
||||||
while (ParentParams != tmp) {
|
while (ParentParams != tmp) {
|
||||||
ob2 = ParentParams->next;
|
ob2 = ParentParams->next;
|
||||||
FreeObjectAndHash(ParentParams, ThisCell);
|
FreeObjectAndHash(ParentParams, ThisCell);
|
||||||
@@ -1224,6 +1230,10 @@ int CleanupPins(char *name, int filenum)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If cell is type MODULE, this is a black-box circuit and
|
||||||
|
// pins are expected to be disconnected (so don't remove them).
|
||||||
|
if (ThisCell->class == CLASS_MODULE) return 0;
|
||||||
|
|
||||||
// Avoid a loop through all cells unless we have to do it.
|
// Avoid a loop through all cells unless we have to do it.
|
||||||
|
|
||||||
for (ob = ThisCell->cell; ob != NULL; ob = ob->next) {
|
for (ob = ThisCell->cell; ob != NULL; ob = ob->next) {
|
||||||
@@ -1407,7 +1417,7 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
|||||||
else
|
else
|
||||||
tc2 = LookupCellFile(name2, file2);
|
tc2 = LookupCellFile(name2, file2);
|
||||||
|
|
||||||
if (tc1 == NULL || tc2 == NULL) return;
|
if (tc1 == NULL || tc2 == NULL) return 0;
|
||||||
|
|
||||||
InitializeHashTable(&compdict, OBJHASHSIZE);
|
InitializeHashTable(&compdict, OBJHASHSIZE);
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -309,7 +309,7 @@ struct hashlist *HashInt2PtrInstall(char *name, int c, void *ptr,
|
|||||||
/* destroy a hash table, freeing associated memory */
|
/* destroy a hash table, freeing associated memory */
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
void *HashKill(struct hashdict *dict)
|
void HashKill(struct hashdict *dict)
|
||||||
{
|
{
|
||||||
struct hashlist *np, *p;
|
struct hashlist *np, *p;
|
||||||
int i;
|
int i;
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ extern struct nlist *RecurseHashTablePointer(struct hashdict *dict,
|
|||||||
void *pointer);
|
void *pointer);
|
||||||
extern void HashDelete(char *name, struct hashdict *dict);
|
extern void HashDelete(char *name, struct hashdict *dict);
|
||||||
extern void HashIntDelete(char *name, int value, 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);
|
extern int CountHashTableEntries(struct hashlist *p);
|
||||||
|
|||||||
+200
-39
@@ -573,7 +573,7 @@ struct FormattedList *FormatBadElementFragment(struct Element *E)
|
|||||||
elemlist = (struct FormattedList *)MALLOC(sizeof(struct FormattedList));
|
elemlist = (struct FormattedList *)MALLOC(sizeof(struct FormattedList));
|
||||||
if (elemlist == NULL) {
|
if (elemlist == NULL) {
|
||||||
Fprintf(stdout, "Unable to allocated memory to print element fanout.\n");
|
Fprintf(stdout, "Unable to allocated memory to print element fanout.\n");
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
fanout = 0;
|
fanout = 0;
|
||||||
@@ -582,7 +582,7 @@ struct FormattedList *FormatBadElementFragment(struct Element *E)
|
|||||||
if (nodes == NULL) {
|
if (nodes == NULL) {
|
||||||
Fprintf(stderr, "Unable to allocate memory to print element fanout.\n");
|
Fprintf(stderr, "Unable to allocate memory to print element fanout.\n");
|
||||||
FREE(elemlist);
|
FREE(elemlist);
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
elemlist->flist = (struct FanoutList *)CALLOC(fanout, sizeof(struct FanoutList));
|
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 *));
|
pins = (struct ElementList **)CALLOC(fanout, sizeof(struct ElementList *));
|
||||||
if (pins == NULL) {
|
if (pins == NULL) {
|
||||||
Fprintf(stdout, "Unable to allocate memory to print node fanout.\n");
|
Fprintf(stdout, "Unable to allocate memory to print node fanout.\n");
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
nodelist = (struct FormattedList *)MALLOC(sizeof(struct FormattedList));
|
nodelist = (struct FormattedList *)MALLOC(sizeof(struct FormattedList));
|
||||||
if (nodelist == NULL) {
|
if (nodelist == NULL) {
|
||||||
Fprintf(stdout, "Unable to allocate memory to print node fanout.\n");
|
Fprintf(stdout, "Unable to allocate memory to print node fanout.\n");
|
||||||
FREE(pins);
|
FREE(pins);
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
nodelist->flist = (struct FanoutList *)CALLOC(fanout, sizeof(struct FanoutList));
|
nodelist->flist = (struct FanoutList *)CALLOC(fanout, sizeof(struct FanoutList));
|
||||||
nodelist->fanout = fanout;
|
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 (vl->key == NULL) continue;
|
||||||
if (!strcmp(vl->key, "S"))
|
if (!strcmp(vl->key, "S"))
|
||||||
sval = vl->value.ival;
|
sval = vl->value.ival;
|
||||||
kl = (struct property *)HashLookup(vl->key, &(tp1->propdict));
|
else {
|
||||||
if (kl->merge == MERGE_SER_CRIT)
|
kl = (struct property *)HashLookup(vl->key, &(tp1->propdict));
|
||||||
if (vl->type == PROP_INTEGER)
|
if (kl && (kl->merge == MERGE_SER_CRIT))
|
||||||
cval = (double)vl->value.ival;
|
if (vl->type == PROP_INTEGER)
|
||||||
else
|
cval = (double)vl->value.ival;
|
||||||
cval = vl->value.dval;
|
else
|
||||||
|
cval = vl->value.dval;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
proplist[i].value = (double)sval * cval;
|
proplist[i].value = (double)sval * cval;
|
||||||
proplist[i].idx = i;
|
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 property *kl, *m_rec, **plist;
|
||||||
struct valuelist ***vlist, *vl, *vl2, *newvlist;
|
struct valuelist ***vlist, *vl, *vl2, *newvlist;
|
||||||
proplinkptr plink, ptop;
|
proplinkptr plink, ptop;
|
||||||
int pcount, p, i, j, pmatch, ival, crit, ctype;
|
int pcount, p, i, j, k, pmatch, ival, crit, ctype;
|
||||||
double dval;
|
double dval;
|
||||||
static struct valuelist nullvl;
|
static struct valuelist nullvl, dfltvl;
|
||||||
char multiple[2];
|
char multiple[2];
|
||||||
int changed = 0;
|
int changed = 0;
|
||||||
|
|
||||||
@@ -4336,9 +4338,37 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int serial)
|
|||||||
pmatch++;
|
pmatch++;
|
||||||
continue;
|
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.
|
// 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
|
// Critical properties can be multiplied up by M (S) and do not
|
||||||
// need to match. May want a more nuanced comparison, though.
|
// need to match. May want a more nuanced comparison, though.
|
||||||
@@ -4885,7 +4915,7 @@ PropertyCheckMismatch(struct objlist *tp1, struct nlist *tc1,
|
|||||||
case PROP_STRING:
|
case PROP_STRING:
|
||||||
islop = (int)(MAX(kl1->slop.dval, kl2->slop.dval) + 0.5);
|
islop = (int)(MAX(kl1->slop.dval, kl2->slop.dval) + 0.5);
|
||||||
if (islop == 0) {
|
if (islop == 0) {
|
||||||
if (strcasecmp(vl1->value.string, vl2->value.string)) {
|
if (!(*matchfunc)(vl1->value.string, vl2->value.string)) {
|
||||||
if (do_print) {
|
if (do_print) {
|
||||||
if (mismatches == 0)
|
if (mismatches == 0)
|
||||||
Fprintf(stdout, "%s vs. %s:\n", inst1, inst2);
|
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 */
|
/* Compare the properties of two objects. The passed values */
|
||||||
/* ob1 and ob2 are pointers to the first entry (firstpin) of */
|
/* 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 property *kl1, *kl2;
|
||||||
struct valuelist *vl1, *vl2;
|
struct valuelist *vl1, *vl2;
|
||||||
int t1type, t2type;
|
int t1type, t2type;
|
||||||
int i, mismatches = 0;
|
int i, mismatches = 0, checked_one;
|
||||||
int rval = 1;
|
int rval = 1;
|
||||||
char *inst1, *inst2;
|
char *inst1, *inst2;
|
||||||
#ifdef TCL_NETGEN
|
#ifdef TCL_NETGEN
|
||||||
@@ -5073,24 +5149,45 @@ PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print,
|
|||||||
inst2 = ob2->instance.name;
|
inst2 = ob2->instance.name;
|
||||||
if (*inst2 == '/') inst2++;
|
if (*inst2 == '/') inst2++;
|
||||||
|
|
||||||
|
checked_one = FALSE;
|
||||||
while(1) {
|
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
|
// t1 has no properties. See if t2's properties are required
|
||||||
// to be checked. If so, flag t2 instance as unmatched
|
// to be checked. If so, flag t2 instance as unmatched
|
||||||
|
|
||||||
mismatches++;
|
|
||||||
for (i = 0;; i++) {
|
for (i = 0;; i++) {
|
||||||
vl2 = &(tp2->instance.props[i]);
|
vl2 = &(tp2->instance.props[i]);
|
||||||
if (vl2->type == PROP_ENDLIST) break;
|
if (vl2->type == PROP_ENDLIST) break;
|
||||||
if (vl2 == NULL) continue;
|
if (vl2 == NULL) continue;
|
||||||
if (vl2->key == NULL) continue;
|
if (vl2->key == NULL) continue;
|
||||||
kl2 = (struct property *)HashLookup(vl2->key, &(tc2->propdict));
|
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) {
|
if (vl2->type != PROP_ENDLIST) {
|
||||||
if (do_print) Fprintf(stdout, "Circuit 2 %s instance %s has no"
|
mismatches++;
|
||||||
" property match in circuit 1.\n",
|
if (do_print) {
|
||||||
Circuit2->name, inst2);
|
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
|
#ifdef TCL_NETGEN
|
||||||
if (do_list) {
|
if (do_list) {
|
||||||
mpair = PropertyList(NULL, vl2);
|
mpair = PropertyList(NULL, vl2);
|
||||||
@@ -5105,23 +5202,43 @@ PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print,
|
|||||||
else
|
else
|
||||||
rval = 0;
|
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) {
|
else if (t2type != PROPERTY) {
|
||||||
// t2 has no properties. See if t1's properties are required
|
// t2 has no properties. See if t1's properties are required
|
||||||
// to be checked. If so, flag t1 instance as unmatched
|
// to be checked. If so, flag t1 instance as unmatched
|
||||||
|
|
||||||
mismatches++;
|
|
||||||
for (i = 0;; i++) {
|
for (i = 0;; i++) {
|
||||||
vl1 = &(tp1->instance.props[i]);
|
vl1 = &(tp1->instance.props[i]);
|
||||||
if (vl1->type == PROP_ENDLIST) break;
|
if (vl1->type == PROP_ENDLIST) break;
|
||||||
if (vl1 == NULL) continue;
|
if (vl1 == NULL) continue;
|
||||||
if (vl1->key == NULL) continue;
|
if (vl1->key == NULL) continue;
|
||||||
kl1 = (struct property *)HashLookup(vl1->key, &(tc1->propdict));
|
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 (vl1->type != PROP_ENDLIST) {
|
||||||
if (do_print) Fprintf(stdout, "Circuit 1 %s instance %s has no"
|
mismatches++;
|
||||||
" property match in Circuit 2.\n",
|
if (do_print) {
|
||||||
Circuit1->name, inst1);
|
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
|
#ifdef TCL_NETGEN
|
||||||
if (do_list) {
|
if (do_list) {
|
||||||
mpair = PropertyList(vl1, NULL);
|
mpair = PropertyList(vl1, NULL);
|
||||||
@@ -5171,6 +5288,7 @@ PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print,
|
|||||||
t1type = (tp1) ? tp1->type : 0;
|
t1type = (tp1) ? tp1->type : 0;
|
||||||
t2type = (tp2) ? tp2->type : 0;
|
t2type = (tp2) ? tp2->type : 0;
|
||||||
if ((t1type != PROPERTY) && (t2type != PROPERTY)) break;
|
if ((t1type != PROPERTY) && (t2type != PROPERTY)) break;
|
||||||
|
checked_one = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
*retval = (rval < 0) ? rval : mismatches;
|
*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)) {
|
if ((file == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
|
||||||
IgnoreClass(name, Circuit1->file, type);
|
IgnoreClass(name, Circuit1->file, type);
|
||||||
IgnoreClass(name, Circuit2->file, type);
|
IgnoreClass(name, Circuit2->file, type);
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
newIgnore = (struct IgnoreList *)MALLOC(sizeof(struct IgnoreList));
|
newIgnore = (struct IgnoreList *)MALLOC(sizeof(struct IgnoreList));
|
||||||
@@ -6057,7 +6175,7 @@ int reorderpins(struct hashlist *p, int file)
|
|||||||
struct nlist *ptr;
|
struct nlist *ptr;
|
||||||
struct nlist *tc2 = Circuit2;
|
struct nlist *tc2 = Circuit2;
|
||||||
struct objlist *ob, *ob2, *firstpin;
|
struct objlist *ob, *ob2, *firstpin;
|
||||||
int i, numports, *nodes;
|
int i, numports, *nodes, unordered;
|
||||||
char **names;
|
char **names;
|
||||||
|
|
||||||
ptr = (struct nlist *)(p->ptr);
|
ptr = (struct nlist *)(p->ptr);
|
||||||
@@ -6071,14 +6189,23 @@ int reorderpins(struct hashlist *p, int file)
|
|||||||
/* instances of both cells. */
|
/* instances of both cells. */
|
||||||
|
|
||||||
numports = 0;
|
numports = 0;
|
||||||
|
unordered = 0;
|
||||||
ob2 = tc2->cell;
|
ob2 = tc2->cell;
|
||||||
while (ob2 && ob2->type == PORT) {
|
while (ob2 && ob2->type == PORT) {
|
||||||
|
if (ob2->model.port < 0) {
|
||||||
|
ob2->model.port = numports;
|
||||||
|
unordered = 1;
|
||||||
|
}
|
||||||
numports++;
|
numports++;
|
||||||
ob2 = ob2->next;
|
ob2 = ob2->next;
|
||||||
}
|
}
|
||||||
nodes = (int *)CALLOC(numports, sizeof(int));
|
nodes = (int *)CALLOC(numports, sizeof(int));
|
||||||
names = (char **)CALLOC(numports, sizeof(char *));
|
names = (char **)CALLOC(numports, sizeof(char *));
|
||||||
|
|
||||||
|
if (unordered)
|
||||||
|
Fprintf(stderr, "Ports of %s are unordered. "
|
||||||
|
"Ordering will be arbitrary.\n", tc2->name);
|
||||||
|
|
||||||
for (ob = ptr->cell; ob != NULL; ) {
|
for (ob = ptr->cell; ob != NULL; ) {
|
||||||
if (ob->type == FIRSTPIN) {
|
if (ob->type == FIRSTPIN) {
|
||||||
if ((*matchfunc)(ob->model.class, tc2->name)) {
|
if ((*matchfunc)(ob->model.class, tc2->name)) {
|
||||||
@@ -6266,14 +6393,19 @@ struct nlist *addproxies(struct hashlist *p, void *clientdata)
|
|||||||
/* circuit pair has been matched with automorphisms, */
|
/* circuit pair has been matched with automorphisms, */
|
||||||
/* then some pins may be matched arbitrarily. */
|
/* then some pins may be matched arbitrarily. */
|
||||||
/* */
|
/* */
|
||||||
/* Return 1 on success, 0 on failure. */
|
|
||||||
/* If "dolist" is 1, append the list representing the */
|
/* If "dolist" is 1, append the list representing the */
|
||||||
/* output (if any) to variable tcl_out, if it exists. */
|
/* 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)
|
int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
||||||
{
|
{
|
||||||
char *cover, *ctemp;
|
char *cover, *ctemp;
|
||||||
|
char *bangptr1, *bangptr2;
|
||||||
struct objlist *ob1, *ob2, *obn, *obp, *ob1s, *ob2s, *obt;
|
struct objlist *ob1, *ob2, *obn, *obp, *ob1s, *ob2s, *obt;
|
||||||
struct NodeClass *NC;
|
struct NodeClass *NC;
|
||||||
struct Node *N1, *N2;
|
struct Node *N1, *N2;
|
||||||
@@ -6304,7 +6436,7 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
|||||||
if (haspins == 0) {
|
if (haspins == 0) {
|
||||||
// Neither cell has any ports, so this is probably a top-level
|
// Neither cell has any ports, so this is probably a top-level
|
||||||
// cell and there is nothing to do.
|
// cell and there is nothing to do.
|
||||||
return 1;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
cover = (char *)CALLOC(numnodes, sizeof(char));
|
cover = (char *)CALLOC(numnodes, sizeof(char));
|
||||||
@@ -6376,7 +6508,7 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
|||||||
for (m = 0; m < 43; m++) *(ostr + m) = ' ';
|
for (m = 0; m < 43; m++) *(ostr + m) = ' ';
|
||||||
for (m = 44; m < 87; m++) *(ostr + m) = ' ';
|
for (m = 44; m < 87; m++) *(ostr + m) = ' ';
|
||||||
snprintf(ostr, 43, "%s", obn->name);
|
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);
|
snprintf(ostr + 44, 43, "%s", obp->name);
|
||||||
else
|
else
|
||||||
snprintf(ostr + 44, 43, "%s **Mismatch**", obp->name);
|
snprintf(ostr + 44, 43, "%s **Mismatch**", obp->name);
|
||||||
@@ -6486,13 +6618,25 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
|||||||
|
|
||||||
/* Do any unmatched pins have the same name? */
|
/* Do any unmatched pins have the same name? */
|
||||||
/* (This should not happen if unconnected pins are eliminated) */
|
/* (This should not happen if unconnected pins are eliminated) */
|
||||||
|
/* (Semi-hack: Allow "!" global flag) */
|
||||||
|
|
||||||
ob1 = tc1->cell;
|
ob1 = tc1->cell;
|
||||||
|
bangptr1 = strrchr(ob1->name, '!');
|
||||||
|
if (bangptr1 && (*(bangptr1 + 1) == '\0'))
|
||||||
|
*bangptr1 = '\0';
|
||||||
|
else bangptr1 = NULL;
|
||||||
|
|
||||||
for (i = 0; i < numorig; i++) {
|
for (i = 0; i < numorig; i++) {
|
||||||
if (*(cover + i) == (char)0) {
|
if (*(cover + i) == (char)0) {
|
||||||
j = 0;
|
j = 0;
|
||||||
for (ob2 = tc2->cell; ob2 != NULL; ob2 = ob2->next) {
|
for (ob2 = tc2->cell; ob2 != NULL; ob2 = ob2->next) {
|
||||||
if (!IsPort(ob2)) break;
|
if (!IsPort(ob2)) break;
|
||||||
|
|
||||||
|
bangptr2 = strrchr(ob2->name, '!');
|
||||||
|
if (bangptr2 && (*(bangptr2 + 1) == '\0'))
|
||||||
|
*bangptr2 = '\0';
|
||||||
|
else bangptr2 = NULL;
|
||||||
|
|
||||||
if ((*matchfunc)(ob1->name, ob2->name)) {
|
if ((*matchfunc)(ob1->name, ob2->name)) {
|
||||||
ob2->model.port = i; /* save order */
|
ob2->model.port = i; /* save order */
|
||||||
*(cover + i) = (char)1;
|
*(cover + i) = (char)1;
|
||||||
@@ -6521,11 +6665,13 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
if (bangptr2) *bangptr2 = '!';
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ob1 = ob1->next;
|
ob1 = ob1->next;
|
||||||
}
|
}
|
||||||
|
if (bangptr1) *bangptr1 = '!';
|
||||||
|
|
||||||
/* Find the end of the pin list in tc1, for adding proxy pins */
|
/* Find the end of the pin list in tc1, for adding proxy pins */
|
||||||
|
|
||||||
@@ -6533,6 +6679,7 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
|||||||
if (ob1 && ob1->next && ob1->next->type != PORT)
|
if (ob1 && ob1->next && ob1->next->type != PORT)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (ob1 == NULL) ob1 = tc1->cell; /* No ports */
|
||||||
|
|
||||||
/* Assign non-matching pins in tc2 with real node */
|
/* Assign non-matching pins in tc2 with real node */
|
||||||
/* connections in the cell to the end. Create pins */
|
/* connections in the cell to the end. Create pins */
|
||||||
@@ -6597,8 +6744,14 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
|||||||
obn->model.port = -1;
|
obn->model.port = -1;
|
||||||
obn->instance.name = NULL;
|
obn->instance.name = NULL;
|
||||||
obn->node = -1;
|
obn->node = -1;
|
||||||
obn->next = ob1->next;
|
if (ob1 == tc1->cell) {
|
||||||
ob1->next = obn;
|
obn->next = ob1;
|
||||||
|
tc1->cell = obn;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
obn->next = ob1->next;
|
||||||
|
ob1->next = obn;
|
||||||
|
}
|
||||||
ob1 = obn;
|
ob1 = obn;
|
||||||
hasproxy1 = 1;
|
hasproxy1 = 1;
|
||||||
|
|
||||||
@@ -6612,6 +6765,7 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
|||||||
if (ob2 && ob2->next && ob2->next->type != PORT)
|
if (ob2 && ob2->next && ob2->next->type != PORT)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (ob2 == NULL) ob2 = tc2->cell; /* No ports */
|
||||||
|
|
||||||
/* If cell 2 has fewer nodes than cell 1, then add dummy (unconnected) */
|
/* 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 */
|
/* pins to cell 2. If these correspond to numbers missing in the match */
|
||||||
@@ -6655,8 +6809,15 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
|||||||
obn->model.port = (i - j);
|
obn->model.port = (i - j);
|
||||||
obn->instance.name = NULL;
|
obn->instance.name = NULL;
|
||||||
obn->node = -1;
|
obn->node = -1;
|
||||||
obn->next = ob2->next;
|
|
||||||
ob2->next = obn;
|
if (ob2 == tc2->cell) {
|
||||||
|
obn->next = ob2;
|
||||||
|
tc2->cell = obn;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
obn->next = ob2->next;
|
||||||
|
ob2->next = obn;
|
||||||
|
}
|
||||||
ob2 = obn;
|
ob2 = obn;
|
||||||
hasproxy2 = 1;
|
hasproxy2 = 1;
|
||||||
|
|
||||||
@@ -6696,7 +6857,7 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
|||||||
|
|
||||||
/* Clean up "UNKNOWN" records from Circuit1 */
|
/* Clean up "UNKNOWN" records from Circuit1 */
|
||||||
|
|
||||||
for (obn = tc1->cell; ; obn = obn->next) {
|
for (obn = tc1->cell; obn; obn = obn->next) {
|
||||||
if (obn->type == UNKNOWN) obn->type = PORT;
|
if (obn->type == UNKNOWN) obn->type = PORT;
|
||||||
else if (obn->type != PORT) break;
|
else if (obn->type != PORT) break;
|
||||||
}
|
}
|
||||||
@@ -6715,13 +6876,13 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
|||||||
|
|
||||||
/* Clean up "UNKNOWN" records from Circuit2 */
|
/* Clean up "UNKNOWN" records from Circuit2 */
|
||||||
|
|
||||||
for (obn = tc2->cell; ; obn = obn->next) {
|
for (obn = tc2->cell; obn; obn = obn->next) {
|
||||||
if (obn->type == UNKNOWN) obn->type = PORT;
|
if (obn->type == UNKNOWN) obn->type = PORT;
|
||||||
else if (obn->type != PORT) break;
|
else if (obn->type != PORT) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for ports that did not get ordered */
|
/* Check for ports that did not get ordered */
|
||||||
for (obn = tc2->cell; obn->type == PORT; obn = obn->next) {
|
for (obn = tc2->cell; obn && (obn->type == PORT); obn = obn->next) {
|
||||||
if (obn->model.port == -1) {
|
if (obn->model.port == -1) {
|
||||||
if (obn->node == -1) {
|
if (obn->node == -1) {
|
||||||
// This only happens when pins have become separated from any net.
|
// This only happens when pins have become separated from any net.
|
||||||
|
|||||||
-6423
File diff suppressed because it is too large
Load Diff
+89
-21
@@ -193,6 +193,67 @@ static struct filestack *OpenFiles = NULL;
|
|||||||
|
|
||||||
#define TOKEN_DELIMITER " \t\n\r"
|
#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() */
|
/* GetNextLineNoNewline() */
|
||||||
/* */
|
/* */
|
||||||
@@ -202,7 +263,7 @@ static struct filestack *OpenFiles = NULL;
|
|||||||
/* */
|
/* */
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
int GetNextLineNoNewline()
|
int GetNextLineNoNewline(char *delimiter)
|
||||||
{
|
{
|
||||||
char *newbuf;
|
char *newbuf;
|
||||||
int testc;
|
int testc;
|
||||||
@@ -233,8 +294,9 @@ int GetNextLineNoNewline()
|
|||||||
}
|
}
|
||||||
linenum++;
|
linenum++;
|
||||||
strcpy(linetok, line);
|
strcpy(linetok, line);
|
||||||
|
TrimQuoted(linetok);
|
||||||
|
|
||||||
nexttok = strtok(linetok, TOKEN_DELIMITER);
|
nexttok = strtok(linetok, delimiter);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -243,10 +305,10 @@ int GetNextLineNoNewline()
|
|||||||
/* valid token. */
|
/* valid token. */
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
void GetNextLine()
|
void GetNextLine(char *delimiter)
|
||||||
{
|
{
|
||||||
do {
|
do {
|
||||||
if (GetNextLineNoNewline() == -1) return;
|
if (GetNextLineNoNewline(delimiter) == -1) return;
|
||||||
} while (nexttok == NULL);
|
} while (nexttok == NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -254,11 +316,13 @@ void GetNextLine()
|
|||||||
/* if nexttok is already NULL, force scanner to read new line */
|
/* if nexttok is already NULL, force scanner to read new line */
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
void SkipTok(void)
|
void SkipTok(char *delimiter)
|
||||||
{
|
{
|
||||||
if (nexttok != NULL &&
|
if (nexttok != NULL &&
|
||||||
(nexttok = strtok(NULL, TOKEN_DELIMITER)) != NULL) return;
|
(nexttok = strtok(NULL, (delimiter) ? delimiter : TOKEN_DELIMITER))
|
||||||
GetNextLine();
|
!= NULL)
|
||||||
|
return;
|
||||||
|
GetNextLine((delimiter) ? delimiter : TOKEN_DELIMITER);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
@@ -266,9 +330,9 @@ void SkipTok(void)
|
|||||||
/* must be preceeded by at least one call to SkipTok() */
|
/* 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) {
|
while (nexttok == NULL) {
|
||||||
contline = getc(infile);
|
contline = getc(infile);
|
||||||
if (contline == '*') {
|
if (contline == '*') {
|
||||||
GetNextLine();
|
GetNextLine(TOKEN_DELIMITER);
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (contline != '+') {
|
else if (contline != '+') {
|
||||||
ungetc(contline, infile);
|
ungetc(contline, infile);
|
||||||
return;
|
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 */
|
/* 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;
|
int contline;
|
||||||
|
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
contline = getc(infile);
|
contline = getc(infile);
|
||||||
|
|
||||||
while (contline == '+') {
|
while (contline == '+') {
|
||||||
ungetc(contline, infile);
|
ungetc(contline, infile);
|
||||||
GetNextLine();
|
GetNextLine(TOKEN_DELIMITER);
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
contline = getc(infile);
|
contline = getc(infile);
|
||||||
}
|
}
|
||||||
ungetc(contline, infile);
|
ungetc(contline, infile);
|
||||||
@@ -418,7 +483,7 @@ char *ReadNetlist(char *fname, int *fnum)
|
|||||||
};
|
};
|
||||||
|
|
||||||
#ifdef mips
|
#ifdef mips
|
||||||
struct filetype formats[6];
|
struct filetype formats[7];
|
||||||
|
|
||||||
formats[0].extension = NTK_EXTENSION;
|
formats[0].extension = NTK_EXTENSION;
|
||||||
formats[0].proc = ReadNtk;
|
formats[0].proc = ReadNtk;
|
||||||
@@ -430,8 +495,10 @@ char *ReadNetlist(char *fname, int *fnum)
|
|||||||
formats[3].proc = ReadSpice;
|
formats[3].proc = ReadSpice;
|
||||||
formats[4].extension = NETGEN_EXTENSION;
|
formats[4].extension = NETGEN_EXTENSION;
|
||||||
formats[4].proc = ReadNetgenFile;
|
formats[4].proc = ReadNetgenFile;
|
||||||
formats[5].extension = NULL;
|
formats[5].extension = VERILOG_EXTENSION;
|
||||||
formats[5].proc = NULL;
|
formats[5].proc = ReadVerilogFile;
|
||||||
|
formats[6].extension = NULL;
|
||||||
|
formats[6].proc = NULL;
|
||||||
|
|
||||||
#else /* not mips (i.e. compiler with reasonable initializers) */
|
#else /* not mips (i.e. compiler with reasonable initializers) */
|
||||||
|
|
||||||
@@ -443,6 +510,7 @@ char *ReadNetlist(char *fname, int *fnum)
|
|||||||
{SPICE_EXTENSION, ReadSpice},
|
{SPICE_EXTENSION, ReadSpice},
|
||||||
{SPICE_EXT2, ReadSpice},
|
{SPICE_EXT2, ReadSpice},
|
||||||
{SPICE_EXT3, ReadSpice},
|
{SPICE_EXT3, ReadSpice},
|
||||||
|
{VERILOG_EXTENSION, ReadVerilog},
|
||||||
{NETGEN_EXTENSION, ReadNetgenFile},
|
{NETGEN_EXTENSION, ReadNetgenFile},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|||||||
+5
-4
@@ -13,6 +13,7 @@
|
|||||||
#define NETGEN_EXTENSION ".ntg"
|
#define NETGEN_EXTENSION ".ntg"
|
||||||
#define CCODE_EXTENSION ".c.code"
|
#define CCODE_EXTENSION ".c.code"
|
||||||
#define ESACAP_EXTENSION ".esa"
|
#define ESACAP_EXTENSION ".esa"
|
||||||
|
#define VERILOG_EXTENSION ".v"
|
||||||
|
|
||||||
#define LINELENGTH 80
|
#define LINELENGTH 80
|
||||||
|
|
||||||
@@ -27,11 +28,11 @@ extern int File;
|
|||||||
/* input routines */
|
/* input routines */
|
||||||
|
|
||||||
extern char *nexttok;
|
extern char *nexttok;
|
||||||
#define SKIPTO(a) do {SkipTok();} while (!match(nexttok,a))
|
#define SKIPTO(a) do {SkipTok(NULL);} while (!match(nexttok,a))
|
||||||
extern void SkipTok(void);
|
extern void SkipTok(char *delimiter);
|
||||||
extern void SkipTokNoNewline(void);
|
extern void SkipTokNoNewline(char *delimiter);
|
||||||
|
extern void SkipNewLine(char *delimiter);
|
||||||
extern void SpiceTokNoNewline(void); /* handles SPICE "+" continuation line */
|
extern void SpiceTokNoNewline(void); /* handles SPICE "+" continuation line */
|
||||||
extern void SkipNewLine(void);
|
|
||||||
extern void SpiceSkipNewLine(void); /* handles SPICE "+" continuation line */
|
extern void SpiceSkipNewLine(void); /* handles SPICE "+" continuation line */
|
||||||
extern void InputParseError(FILE *f);
|
extern void InputParseError(FILE *f);
|
||||||
extern int OpenParseFile(char *name, int fnum);
|
extern int OpenParseFile(char *name, int fnum);
|
||||||
|
|||||||
+65
-44
@@ -49,6 +49,7 @@ int NextNode;
|
|||||||
|
|
||||||
int Composition = NONE;
|
int Composition = NONE;
|
||||||
int QuickSearch = 0;
|
int QuickSearch = 0;
|
||||||
|
int GlobalParallelNone = FALSE;
|
||||||
|
|
||||||
int AddToExistingDefinition = 0; /* default: overwrite cell when reopened */
|
int AddToExistingDefinition = 0; /* default: overwrite cell when reopened */
|
||||||
|
|
||||||
@@ -870,6 +871,32 @@ int ReduceExpressions(struct objlist *instprop, struct objlist *parprops,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------*/
|
||||||
|
/* Set/clear the flag bit COMB_NO_PARALLEL on all cells. Note that the */
|
||||||
|
/* function is called with value for enabling combine parallel, so */
|
||||||
|
/* value TRUE means clear bit, value FALSE means set bit. */
|
||||||
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
struct nlist *SetParallelCombineFlag(struct hashlist *p, void *clientdata)
|
||||||
|
{
|
||||||
|
struct nlist *ptr;
|
||||||
|
int *value = (int *)clientdata;
|
||||||
|
|
||||||
|
ptr = (struct nlist *)(p->ptr);
|
||||||
|
if (*value == TRUE)
|
||||||
|
ptr->flags &= (~COMB_NO_PARALLEL);
|
||||||
|
else
|
||||||
|
ptr->flags |= COMB_NO_PARALLEL;
|
||||||
|
|
||||||
|
return NULL; /* NULL keeps search alive */
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetParallelCombine(int value)
|
||||||
|
{
|
||||||
|
ClearDumpedList();
|
||||||
|
RecurseCellHashTable2(SetParallelCombineFlag, (void *)(&value));
|
||||||
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
/* Delete a property from the master cell record. */
|
/* Delete a property from the master cell record. */
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
@@ -1011,7 +1038,7 @@ struct property *PropertyValue(char *name, int fnum, char *key,
|
|||||||
if ((fnum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
|
if ((fnum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
|
||||||
PropertyValue(name, Circuit1->file, key, slop, pdefault);
|
PropertyValue(name, Circuit1->file, key, slop, pdefault);
|
||||||
PropertyValue(name, Circuit2->file, key, slop, pdefault);
|
PropertyValue(name, Circuit2->file, key, slop, pdefault);
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
tc = LookupCellFile(name, fnum);
|
tc = LookupCellFile(name, fnum);
|
||||||
@@ -1046,7 +1073,7 @@ struct property *PropertyDouble(char *name, int fnum, char *key,
|
|||||||
if ((fnum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
|
if ((fnum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
|
||||||
PropertyDouble(name, Circuit1->file, key, slop, pdefault);
|
PropertyDouble(name, Circuit1->file, key, slop, pdefault);
|
||||||
PropertyDouble(name, Circuit2->file, key, slop, pdefault);
|
PropertyDouble(name, Circuit2->file, key, slop, pdefault);
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
tc = LookupCellFile(name, fnum);
|
tc = LookupCellFile(name, fnum);
|
||||||
@@ -1079,7 +1106,7 @@ struct property *PropertyInteger(char *name, int fnum, char *key,
|
|||||||
if ((fnum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
|
if ((fnum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
|
||||||
PropertyInteger(name, Circuit1->file, key, slop, pdefault);
|
PropertyInteger(name, Circuit1->file, key, slop, pdefault);
|
||||||
PropertyInteger(name, Circuit2->file, key, slop, pdefault);
|
PropertyInteger(name, Circuit2->file, key, slop, pdefault);
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
tc = LookupCellFile(name, fnum);
|
tc = LookupCellFile(name, fnum);
|
||||||
@@ -1112,7 +1139,7 @@ struct property *PropertyString(char *name, int fnum, char *key, double dval,
|
|||||||
if ((fnum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
|
if ((fnum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
|
||||||
PropertyString(name, Circuit1->file, key, dval, pdefault);
|
PropertyString(name, Circuit1->file, key, dval, pdefault);
|
||||||
PropertyString(name, Circuit2->file, key, dval, pdefault);
|
PropertyString(name, Circuit2->file, key, dval, pdefault);
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
tc = LookupCellFile(name, fnum);
|
tc = LookupCellFile(name, fnum);
|
||||||
@@ -1176,40 +1203,31 @@ void CellDef(char *name, int fnum)
|
|||||||
{
|
{
|
||||||
struct nlist *np;
|
struct nlist *np;
|
||||||
|
|
||||||
if (Debug) Printf("Defining cell: %s\n",name);
|
if (Debug) Printf("Defining cell: %s\n",name);
|
||||||
GarbageCollect();
|
GarbageCollect();
|
||||||
if ((CurrentCell = LookupCellFile(name, fnum)) != NULL) {
|
if ((CurrentCell = LookupCellFile(name, fnum)) != NULL) {
|
||||||
if (AddToExistingDefinition) {
|
if (AddToExistingDefinition) {
|
||||||
ReopenCellDef(name, fnum);
|
ReopenCellDef(name, fnum);
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Printf("Cell: %s exists already, and will be overwritten.\n", name);
|
Printf("Cell: %s exists already, and will be overwritten.\n", name);
|
||||||
CellDelete(name, fnum);
|
CellDelete(name, fnum);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* install a new cell in lookup table (hashed) */
|
}
|
||||||
np = InstallInCellHashTable(name, fnum);
|
/* install a new cell in lookup table (hashed) */
|
||||||
CurrentCell = LookupCellFile(name, fnum);
|
np = InstallInCellHashTable(name, fnum);
|
||||||
CurrentCell->class = CLASS_SUBCKT; /* default */
|
CurrentCell = LookupCellFile(name, fnum);
|
||||||
CurrentCell->flags = 0;
|
CurrentCell->class = CLASS_SUBCKT; /* default */
|
||||||
|
CurrentCell->flags = (GlobalParallelNone) ? COMB_NO_PARALLEL : 0;
|
||||||
|
|
||||||
LastPlaced = NULL;
|
LastPlaced = NULL;
|
||||||
CurrentTail = NULL;
|
CurrentTail = NULL;
|
||||||
FreeNodeNames(CurrentCell);
|
FreeNodeNames(CurrentCell);
|
||||||
NextNode = 1;
|
NextNode = 1;
|
||||||
}
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------*/
|
// Mark cell as case insensitive if case insensitivity is in effect
|
||||||
/* Same as CellDef() above, but mark cell as case-insensitive. */
|
if (matchfunc == matchnocase) CurrentCell->flags |= CELL_NOCASE;
|
||||||
/* 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
@@ -3282,7 +3300,9 @@ int check_pin_nodes(struct objlist *ob1, struct objlist *ob2)
|
|||||||
pob = pob->next;
|
pob = pob->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nob->type > FIRSTPIN || pob->type > FIRSTPIN) return FALSE;
|
if (nob && pob && (nob->type > FIRSTPIN || pob->type > FIRSTPIN))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3306,11 +3326,6 @@ int CombineSerial(char *model, int file)
|
|||||||
int i, j, scnt = 0;
|
int i, j, scnt = 0;
|
||||||
struct valuelist *kv;
|
struct valuelist *kv;
|
||||||
|
|
||||||
// To avoid posting a non-working version, serial combination is
|
|
||||||
// disabled here until code is finished to compare the serial/parallel
|
|
||||||
// property networks.
|
|
||||||
// return 0;
|
|
||||||
|
|
||||||
if ((tp = LookupCellFile(model, file)) == NULL) {
|
if ((tp = LookupCellFile(model, file)) == NULL) {
|
||||||
Printf("Cell: %s does not exist.\n", model);
|
Printf("Cell: %s does not exist.\n", model);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -3387,11 +3402,10 @@ int CombineSerial(char *model, int file)
|
|||||||
/* a parameter '_tag', string value set to "+". */
|
/* a parameter '_tag', string value set to "+". */
|
||||||
|
|
||||||
for (obn = instlist[i][1]; obn->next &&
|
for (obn = instlist[i][1]; obn->next &&
|
||||||
obn->next->type != PROPERTY &&
|
obn->next->type > FIRSTPIN; obn = obn->next);
|
||||||
obn->next->type != FIRSTPIN; obn = obn->next);
|
|
||||||
obp = obn->next;
|
obp = obn->next;
|
||||||
|
|
||||||
if (obp == NULL || obp->type == FIRSTPIN) {
|
if (obp == NULL || obp->type != PROPERTY) {
|
||||||
struct objlist *nob;
|
struct objlist *nob;
|
||||||
/* No property record, so insert one */
|
/* No property record, so insert one */
|
||||||
nob = GetObject();
|
nob = GetObject();
|
||||||
@@ -3463,10 +3477,17 @@ int CombineSerial(char *model, int file)
|
|||||||
|
|
||||||
/* Excise the 2nd instance. instlist[i][1] remains as the */
|
/* Excise the 2nd instance. instlist[i][1] remains as the */
|
||||||
/* only pointer to it. */
|
/* only pointer to it. */
|
||||||
for (obp = instlist[i][0]; obp->next->type != FIRSTPIN; obp = obp->next);
|
for (obp = instlist[i][0]; obp->next->type > FIRSTPIN ||
|
||||||
for (ob2 = obp; ob2->next != instlist[i][1]; ob2 = ob2->next);
|
obp->next->type == PROPERTY; obp = obp->next);
|
||||||
for (obs = ob2->next; obs->next && obs->next->type != FIRSTPIN;
|
for (ob2 = obp; ob2 && ob2->next != instlist[i][1]; ob2 = ob2->next);
|
||||||
obs = obs->next);
|
|
||||||
|
/* Device may have been moved by the above code. If so, look for */
|
||||||
|
/* it from the beginning of the list. */
|
||||||
|
if (ob2 == NULL)
|
||||||
|
for (ob2 = tp->cell; ob2->next != instlist[i][1]; ob2 = ob2->next);
|
||||||
|
|
||||||
|
for (obs = ob2->next; obs->next && (obs->next->type > FIRSTPIN
|
||||||
|
|| obs->next->type == PROPERTY); obs = obs->next);
|
||||||
ob2->next = obs->next;
|
ob2->next = obs->next;
|
||||||
if (obs->next) obs->next = NULL; // Terminate 2nd instance record
|
if (obs->next) obs->next = NULL; // Terminate 2nd instance record
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ extern struct property *PropertyInteger(char *name, int fnum, char *key,
|
|||||||
extern struct property *PropertyString(char *name, int fnum, char *key,
|
extern struct property *PropertyString(char *name, int fnum, char *key,
|
||||||
double slop, char *pdefault);
|
double slop, char *pdefault);
|
||||||
extern int PropertyDelete(char *name, int fnum, char *key);
|
extern int PropertyDelete(char *name, int fnum, char *key);
|
||||||
|
extern void SetParallelCombine(int value);
|
||||||
extern int PropertyTolerance(char *name, int fnum, char *key, int ival,
|
extern int PropertyTolerance(char *name, int fnum, char *key, int ival,
|
||||||
double dval);
|
double dval);
|
||||||
extern int PropertyMerge(char *name, int fnum, char *key, int merge_type);
|
extern int PropertyMerge(char *name, int fnum, char *key, int merge_type);
|
||||||
@@ -53,6 +54,8 @@ extern void PortList(char *prefix, char *list_template);
|
|||||||
extern char *Cell(char *inststr, char *model, ...);
|
extern char *Cell(char *inststr, char *model, ...);
|
||||||
extern int IsIgnored(char *, int);
|
extern int IsIgnored(char *, int);
|
||||||
|
|
||||||
|
extern int auto_blackbox; /* For handling empty subcircuits */
|
||||||
|
|
||||||
/* netcmp.c */
|
/* netcmp.c */
|
||||||
extern struct nlist *LookupClassEquivalent(char *model, int file1, int file2);
|
extern struct nlist *LookupClassEquivalent(char *model, int file1, int file2);
|
||||||
extern void AssignCircuits(char *name1, int file1, char *name2, int file2);
|
extern void AssignCircuits(char *name1, int file1, char *name2, int file2);
|
||||||
@@ -132,6 +135,7 @@ extern int IgnoreRC; /* set this to 1 to ignore capacitance and resistance */
|
|||||||
extern int NoOutput; /* set this to 1 to disable stdout output */
|
extern int NoOutput; /* set this to 1 to disable stdout output */
|
||||||
extern int Composition; /* direction of composition */
|
extern int Composition; /* direction of composition */
|
||||||
extern int UnixWildcards; /* TRUE if *,?,{},[] only; false if full REGEXP */
|
extern int UnixWildcards; /* TRUE if *,?,{},[] only; false if full REGEXP */
|
||||||
|
extern int GlobalParallelNone; /* If TRUE, don't parallel combine any cells */
|
||||||
/* magic internal flag to restrict searches to recently placed cells */
|
/* magic internal flag to restrict searches to recently placed cells */
|
||||||
extern int QuickSearch;
|
extern int QuickSearch;
|
||||||
/* does re"CellDef"ing a cell add to it or overwrite it??? */
|
/* does re"CellDef"ing a cell add to it or overwrite it??? */
|
||||||
@@ -174,6 +178,7 @@ extern char *ReadSim(char *fname, int *fnum);
|
|||||||
extern char *ReadSpice(char *fname, int *fnum);
|
extern char *ReadSpice(char *fname, int *fnum);
|
||||||
extern char *ReadSpiceLib(char *fname, int *fnum);
|
extern char *ReadSpiceLib(char *fname, int *fnum);
|
||||||
extern char *ReadNetgenFile (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);
|
extern char *ReadNetlist(char *fname, int *fnum);
|
||||||
|
|
||||||
|
|||||||
+22
-22
@@ -193,7 +193,7 @@ char *ReadNtk (char *fname, int *fnum)
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (!EndParseFile()) {
|
while (!EndParseFile()) {
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
if (EndParseFile()) break;
|
if (EndParseFile()) break;
|
||||||
if (nexttok[0] == '|') SKIPTO(";");
|
if (nexttok[0] == '|') SKIPTO(";");
|
||||||
else if (match(nexttok, "c")) {
|
else if (match(nexttok, "c")) {
|
||||||
@@ -203,14 +203,14 @@ char *ReadNtk (char *fname, int *fnum)
|
|||||||
EndCell();
|
EndCell();
|
||||||
CellDefInProgress = 0;
|
CellDefInProgress = 0;
|
||||||
}
|
}
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
CellDef(nexttok, CurrentCell->file);
|
CellDef(nexttok, CurrentCell->file);
|
||||||
LastCellRead = CurrentCell->name;
|
LastCellRead = CurrentCell->name;
|
||||||
CellDefInProgress = 1;
|
CellDefInProgress = 1;
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
while (!match(nexttok, ";")) {
|
while (!match(nexttok, ";")) {
|
||||||
Port(nexttok);
|
Port(nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (match(nexttok, "s")) {
|
else if (match(nexttok, "s")) {
|
||||||
@@ -224,8 +224,8 @@ char *ReadNtk (char *fname, int *fnum)
|
|||||||
if (LastCellRead == NULL)
|
if (LastCellRead == NULL)
|
||||||
LastCellRead = CurrentCell->name;
|
LastCellRead = CurrentCell->name;
|
||||||
}
|
}
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
SkipTok(); /* eat the 'size' of the node */
|
SkipTok(NULL); /* eat the 'size' of the node */
|
||||||
/* after the 'size', all names are synonyms */
|
/* after the 'size', all names are synonyms */
|
||||||
while (!match(nexttok, ";")) {
|
while (!match(nexttok, ";")) {
|
||||||
#if 1
|
#if 1
|
||||||
@@ -240,7 +240,7 @@ char *ReadNtk (char *fname, int *fnum)
|
|||||||
#endif
|
#endif
|
||||||
if (strlen(last)) join(last, nexttok);
|
if (strlen(last)) join(last, nexttok);
|
||||||
strcpy(last, nexttok);
|
strcpy(last, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (match(nexttok, "h")) {
|
else if (match(nexttok, "h")) {
|
||||||
@@ -250,11 +250,11 @@ char *ReadNtk (char *fname, int *fnum)
|
|||||||
if (LastCellRead == NULL)
|
if (LastCellRead == NULL)
|
||||||
LastCellRead = CurrentCell->name;
|
LastCellRead = CurrentCell->name;
|
||||||
}
|
}
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcpy(model, nexttok);
|
strcpy(model, nexttok);
|
||||||
strcpy(instancename, nexttok);
|
strcpy(instancename, nexttok);
|
||||||
strcat(instancename, INSTANCE_DELIMITER);
|
strcat(instancename, INSTANCE_DELIMITER);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcat(instancename, nexttok);
|
strcat(instancename, nexttok);
|
||||||
if (LookupCell(model) == NULL) {
|
if (LookupCell(model) == NULL) {
|
||||||
#ifdef DEFINE_UNDEFINED_CELLS
|
#ifdef DEFINE_UNDEFINED_CELLS
|
||||||
@@ -264,7 +264,7 @@ char *ReadNtk (char *fname, int *fnum)
|
|||||||
|
|
||||||
previous_cell = CurrentCell->name;
|
previous_cell = CurrentCell->name;
|
||||||
CellDef(model, CurrentCell->file);
|
CellDef(model, CurrentCell->file);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
args = 0;
|
args = 0;
|
||||||
while (!match(nexttok, ";")) {
|
while (!match(nexttok, ";")) {
|
||||||
sprintf(name, "pin%d", args+1);
|
sprintf(name, "pin%d", args+1);
|
||||||
@@ -273,11 +273,11 @@ char *ReadNtk (char *fname, int *fnum)
|
|||||||
args++;
|
args++;
|
||||||
/* check for overflow */
|
/* check for overflow */
|
||||||
if (args == (sizeof(ports) / sizeof(ports[0]))) {
|
if (args == (sizeof(ports) / sizeof(ports[0]))) {
|
||||||
while (!match(nexttok, ";")) SkipTok();
|
while (!match(nexttok, ";")) SkipTok(NULL);
|
||||||
break; /* out of while loop */
|
break; /* out of while loop */
|
||||||
}
|
}
|
||||||
/* if no overflow, get the next token */
|
/* if no overflow, get the next token */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
}
|
}
|
||||||
EndCell();
|
EndCell();
|
||||||
/* now, reopen previous cell, instance the new cell,
|
/* now, reopen previous cell, instance the new cell,
|
||||||
@@ -301,7 +301,7 @@ char *ReadNtk (char *fname, int *fnum)
|
|||||||
ob = LookupCell(model)->cell;
|
ob = LookupCell(model)->cell;
|
||||||
while ((ob != NULL) && !IsPort(ob))
|
while ((ob != NULL) && !IsPort(ob))
|
||||||
ob = ob->next;
|
ob = ob->next;
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
while (!match(nexttok, ";")) {
|
while (!match(nexttok, ";")) {
|
||||||
strcpy(name, instancename);
|
strcpy(name, instancename);
|
||||||
strcat(name, SEPARATOR);
|
strcat(name, SEPARATOR);
|
||||||
@@ -311,7 +311,7 @@ char *ReadNtk (char *fname, int *fnum)
|
|||||||
do {
|
do {
|
||||||
ob = ob->next;
|
ob = ob->next;
|
||||||
} while ((ob != NULL) && !IsPort(ob)) ;
|
} while ((ob != NULL) && !IsPort(ob)) ;
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -322,12 +322,12 @@ char *ReadNtk (char *fname, int *fnum)
|
|||||||
if (LastCellRead == NULL)
|
if (LastCellRead == NULL)
|
||||||
LastCellRead = CurrentCell->name;
|
LastCellRead = CurrentCell->name;
|
||||||
}
|
}
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
SkipTok(); /* skip the transistor size */
|
SkipTok(NULL); /* skip the transistor size */
|
||||||
strcpy(name, nexttok);
|
strcpy(name, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcpy(model, nexttok);
|
strcpy(model, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcpy(instancename, nexttok);
|
strcpy(instancename, nexttok);
|
||||||
N(fname, NULL, name, model, instancename);
|
N(fname, NULL, name, model, instancename);
|
||||||
SKIPTO(";");
|
SKIPTO(";");
|
||||||
@@ -339,12 +339,12 @@ char *ReadNtk (char *fname, int *fnum)
|
|||||||
if (LastCellRead == NULL)
|
if (LastCellRead == NULL)
|
||||||
LastCellRead = CurrentCell->name;
|
LastCellRead = CurrentCell->name;
|
||||||
}
|
}
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
SkipTok(); /* skip the transistor size */
|
SkipTok(NULL); /* skip the transistor size */
|
||||||
strcpy(name, nexttok);
|
strcpy(name, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcpy(model, nexttok);
|
strcpy(model, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcpy(instancename, nexttok);
|
strcpy(instancename, nexttok);
|
||||||
P(fname, NULL, name, model, instancename);
|
P(fname, NULL, name, model, instancename);
|
||||||
SKIPTO(";");
|
SKIPTO(";");
|
||||||
|
|||||||
+45
-8
@@ -184,13 +184,46 @@ int match(char *st1, char *st2)
|
|||||||
|
|
||||||
/* Case-insensitive matching */
|
/* 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)
|
int matchnocase(char *st1, char *st2)
|
||||||
{
|
{
|
||||||
char *sp1 = st1;
|
char *sp1 = st1;
|
||||||
char *sp2 = st2;
|
char *sp2 = st2;
|
||||||
|
|
||||||
while (*sp1 != '\0' && *sp2 != '\0') {
|
while (*sp1 != '\0' && *sp2 != '\0') {
|
||||||
if (tolower(*sp1) != tolower(*sp2)) break;
|
if (to_lower[*sp1] != to_lower[*sp2]) break;
|
||||||
sp1++;
|
sp1++;
|
||||||
sp2++;
|
sp2++;
|
||||||
}
|
}
|
||||||
@@ -216,7 +249,7 @@ int matchfilenocase(char *st1, char *st2, int f1, int f2)
|
|||||||
|
|
||||||
if (f1 != f2) return 0;
|
if (f1 != f2) return 0;
|
||||||
while (*sp1 != '\0' && *sp2 != '\0') {
|
while (*sp1 != '\0' && *sp2 != '\0') {
|
||||||
if (tolower(*sp1) != tolower(*sp2)) break;
|
if (to_lower[*sp1] != to_lower[*sp2]) break;
|
||||||
sp1++;
|
sp1++;
|
||||||
sp2++;
|
sp2++;
|
||||||
}
|
}
|
||||||
@@ -257,6 +290,7 @@ void InitCellHashTable(void)
|
|||||||
{
|
{
|
||||||
hashfunc = hash;
|
hashfunc = hash;
|
||||||
matchfunc = match;
|
matchfunc = match;
|
||||||
|
matchintfunc = matchfile;
|
||||||
InitializeHashTable(&cell_dict, CELLHASHSIZE);
|
InitializeHashTable(&cell_dict, CELLHASHSIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -348,7 +382,7 @@ int removeshorted(struct hashlist *p, int file)
|
|||||||
|
|
||||||
ptr = (struct nlist *)(p->ptr);
|
ptr = (struct nlist *)(p->ptr);
|
||||||
|
|
||||||
if ((file != -1) && (ptr->file != file)) return;
|
if ((file != -1) && (ptr->file != file)) return 0;
|
||||||
|
|
||||||
lob = NULL;
|
lob = NULL;
|
||||||
for (ob = ptr->cell; ob != NULL;) {
|
for (ob = ptr->cell; ob != NULL;) {
|
||||||
@@ -412,7 +446,7 @@ int deleteclass(struct hashlist *p, int file)
|
|||||||
|
|
||||||
ptr = (struct nlist *)(p->ptr);
|
ptr = (struct nlist *)(p->ptr);
|
||||||
|
|
||||||
if ((file != -1) && (ptr->file != file)) return;
|
if ((file != -1) && (ptr->file != file)) return 0;
|
||||||
|
|
||||||
lob = NULL;
|
lob = NULL;
|
||||||
for (ob = ptr->cell; ob != NULL;) {
|
for (ob = ptr->cell; ob != NULL;) {
|
||||||
@@ -469,7 +503,7 @@ int renameinstances(struct hashlist *p, int file)
|
|||||||
|
|
||||||
ptr = (struct nlist *)(p->ptr);
|
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) {
|
for (ob = ptr->cell; ob != NULL; ob = ob->next) {
|
||||||
if ((ob->type >= FIRSTPIN) && (ob->model.class != NULL)) {
|
if ((ob->type >= FIRSTPIN) && (ob->model.class != NULL)) {
|
||||||
@@ -563,8 +597,11 @@ static int PrintCellHashTableElement(struct hashlist *p)
|
|||||||
/* only print primitive cells if Debug is enabled */
|
/* only print primitive cells if Debug is enabled */
|
||||||
if (Debug == 1) Printf("Cell: %s (instanced %d times); Primitive\n",
|
if (Debug == 1) Printf("Cell: %s (instanced %d times); Primitive\n",
|
||||||
ptr->name, ptr->number);
|
ptr->name, ptr->number);
|
||||||
|
else if (Debug == 3) { /* list */
|
||||||
|
Tcl_AppendElement(netgeninterp, ptr->name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (Debug == 2) { /* list only */
|
else if ((Debug == 2) || (Debug == 3)) { /* list only */
|
||||||
#ifdef TCL_NETGEN
|
#ifdef TCL_NETGEN
|
||||||
Tcl_AppendElement(netgeninterp, ptr->name);
|
Tcl_AppendElement(netgeninterp, ptr->name);
|
||||||
#else
|
#else
|
||||||
@@ -595,7 +632,7 @@ void PrintCellHashTable(int full, int filenum)
|
|||||||
|
|
||||||
bins = RecurseHashTable(&cell_dict, CountHashTableBinsUsed);
|
bins = RecurseHashTable(&cell_dict, CountHashTableBinsUsed);
|
||||||
total = RecurseHashTable(&cell_dict, CountHashTableEntries);
|
total = RecurseHashTable(&cell_dict, CountHashTableEntries);
|
||||||
if (full != 2)
|
if (full < 2)
|
||||||
Printf("Hash table: %d of %d bins used; %d cells total (%.2f per bin)\n",
|
Printf("Hash table: %d of %d bins used; %d cells total (%.2f per bin)\n",
|
||||||
bins, CELLHASHSIZE, total, (bins == 0) ? 0 :
|
bins, CELLHASHSIZE, total, (bins == 0) ? 0 :
|
||||||
(float)((float)total / (float)bins));
|
(float)((float)total / (float)bins));
|
||||||
@@ -605,7 +642,7 @@ void PrintCellHashTable(int full, int filenum)
|
|||||||
RecurseHashTable(&cell_dict, PrintCellHashTableElement);
|
RecurseHashTable(&cell_dict, PrintCellHashTableElement);
|
||||||
Debug = OldDebug;
|
Debug = OldDebug;
|
||||||
#ifndef TCL_NETGEN
|
#ifndef TCL_NETGEN
|
||||||
if (full == 2) Printf("\n");
|
if (full >= 2) Printf("\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1024,6 +1024,10 @@ void Query(void)
|
|||||||
promptstring("Write SPICE: circuit name: ", repstr);
|
promptstring("Write SPICE: circuit name: ", repstr);
|
||||||
SpiceCell(repstr, filenum, "");
|
SpiceCell(repstr, filenum, "");
|
||||||
break;
|
break;
|
||||||
|
case 'v':
|
||||||
|
promptstring("Write Verilog: circuit name: ", repstr);
|
||||||
|
VerilogModule(repstr, filenum, "");
|
||||||
|
break;
|
||||||
case 'E':
|
case 'E':
|
||||||
promptstring("Write ESACAP: circuit name: ", repstr);
|
promptstring("Write ESACAP: circuit name: ", repstr);
|
||||||
EsacapCell(repstr,"");
|
EsacapCell(repstr,"");
|
||||||
@@ -1062,6 +1066,10 @@ void Query(void)
|
|||||||
promptstring("Read SPICE (.ckt) file? ", repstr);
|
promptstring("Read SPICE (.ckt) file? ", repstr);
|
||||||
ReadSpice(repstr, &filenum);
|
ReadSpice(repstr, &filenum);
|
||||||
break;
|
break;
|
||||||
|
case 'V':
|
||||||
|
promptstring("Read Verilog (.v) file? ", repstr);
|
||||||
|
ReadVerilog(repstr, &filenum);
|
||||||
|
break;
|
||||||
case 'G' :
|
case 'G' :
|
||||||
promptstring("Read NETGEN: file? ", repstr);
|
promptstring("Read NETGEN: file? ", repstr);
|
||||||
ReadNetgenFile(repstr, &filenum);
|
ReadNetgenFile(repstr, &filenum);
|
||||||
|
|||||||
+87
-41
@@ -25,8 +25,10 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
#include <stdarg.h> /* what about varargs, like in pdutils.c ??? */
|
#include <stdarg.h> /* what about varargs, like in pdutils.c ??? */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef IBMPC
|
#include <stdlib.h> /* for calloc(), free(), getenv() */
|
||||||
#include <stdlib.h> /* for calloc(), free() */
|
#ifndef IBMPC
|
||||||
|
#include <sys/types.h> /* for getpwnam() tilde expansion */
|
||||||
|
#include <pwd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TCL_NETGEN
|
#ifdef TCL_NETGEN
|
||||||
@@ -42,6 +44,10 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
// Global storage for parameters from .PARAM
|
// Global storage for parameters from .PARAM
|
||||||
struct hashdict spiceparams;
|
struct hashdict spiceparams;
|
||||||
|
|
||||||
|
// Global setting for auto-detect of empty subcircuits as
|
||||||
|
// black-box subcells.
|
||||||
|
int auto_blackbox = FALSE;
|
||||||
|
|
||||||
// Check if a token represents a numerical value (with
|
// Check if a token represents a numerical value (with
|
||||||
// units) or an expression. This is basically a hack
|
// units) or an expression. This is basically a hack
|
||||||
// to see if it either passes StringIsValue() or is
|
// to see if it either passes StringIsValue() or is
|
||||||
@@ -398,6 +404,7 @@ int renamepins(struct hashlist *p, int file)
|
|||||||
|
|
||||||
void CleanupSubcell() {
|
void CleanupSubcell() {
|
||||||
int maxnode = 0;
|
int maxnode = 0;
|
||||||
|
int has_devices = FALSE;
|
||||||
struct objlist *sobj, *nobj, *lobj, *pobj;
|
struct objlist *sobj, *nobj, *lobj, *pobj;
|
||||||
|
|
||||||
if (CurrentCell == NULL) return;
|
if (CurrentCell == NULL) return;
|
||||||
@@ -409,6 +416,8 @@ void CleanupSubcell() {
|
|||||||
lobj = NULL;
|
lobj = NULL;
|
||||||
for (sobj = CurrentCell->cell; sobj != NULL;) {
|
for (sobj = CurrentCell->cell; sobj != NULL;) {
|
||||||
nobj = sobj->next;
|
nobj = sobj->next;
|
||||||
|
if (sobj->type == FIRSTPIN)
|
||||||
|
has_devices = TRUE;
|
||||||
if (sobj->node < 0) {
|
if (sobj->node < 0) {
|
||||||
if (IsGlobal(sobj)) {
|
if (IsGlobal(sobj)) {
|
||||||
if (lobj != NULL)
|
if (lobj != NULL)
|
||||||
@@ -437,6 +446,8 @@ void CleanupSubcell() {
|
|||||||
lobj = sobj;
|
lobj = sobj;
|
||||||
sobj = nobj;
|
sobj = nobj;
|
||||||
}
|
}
|
||||||
|
if ((has_devices == FALSE) && (auto_blackbox == TRUE))
|
||||||
|
SetClass(CLASS_MODULE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*------------------------------------------------------*/
|
/*------------------------------------------------------*/
|
||||||
@@ -501,10 +512,10 @@ void ReadSpiceFile(char *fname, int filenum, struct cellstack **CellStackPtr,
|
|||||||
|
|
||||||
while (!EndParseFile()) {
|
while (!EndParseFile()) {
|
||||||
|
|
||||||
SkipTok(); /* get the next token */
|
SkipTok(NULL); /* get the next token */
|
||||||
if ((EndParseFile()) && (nexttok == NULL)) break;
|
if ((EndParseFile()) && (nexttok == NULL)) break;
|
||||||
|
|
||||||
if (nexttok[0] == '*') SkipNewLine();
|
if (nexttok[0] == '*') SkipNewLine(NULL);
|
||||||
|
|
||||||
else if (matchnocase(nexttok, ".SUBCKT")) {
|
else if (matchnocase(nexttok, ".SUBCKT")) {
|
||||||
SpiceTokNoNewline();
|
SpiceTokNoNewline();
|
||||||
@@ -563,18 +574,18 @@ void ReadSpiceFile(char *fname, int filenum, struct cellstack **CellStackPtr,
|
|||||||
Printf("Renaming original cell to %s\n", model);
|
Printf("Renaming original cell to %s\n", model);
|
||||||
InstanceRename(nexttok, model, filenum);
|
InstanceRename(nexttok, model, filenum);
|
||||||
CellRehash(nexttok, model, filenum);
|
CellRehash(nexttok, model, filenum);
|
||||||
CellDefNoCase(nexttok, filenum);
|
CellDef(nexttok, filenum);
|
||||||
tp = LookupCellFile(nexttok, filenum);
|
tp = LookupCellFile(nexttok, filenum);
|
||||||
}
|
}
|
||||||
else if (tp != NULL) { /* Make a new definition for an empty cell */
|
else if (tp != NULL) { /* Make a new definition for an empty cell */
|
||||||
FreePorts(nexttok);
|
FreePorts(nexttok);
|
||||||
CellDelete(nexttok, filenum); /* This removes any PLACEHOLDER flag */
|
CellDelete(nexttok, filenum); /* This removes any PLACEHOLDER flag */
|
||||||
CellDefNoCase(model, filenum);
|
CellDef(model, filenum);
|
||||||
tp = LookupCellFile(model, filenum);
|
tp = LookupCellFile(model, filenum);
|
||||||
update = 1; /* Will need to update existing instances */
|
update = 1; /* Will need to update existing instances */
|
||||||
}
|
}
|
||||||
else if (tp == NULL) { /* Completely new cell, no name conflict */
|
else if (tp == NULL) { /* Completely new cell, no name conflict */
|
||||||
CellDefNoCase(model, filenum);
|
CellDef(model, filenum);
|
||||||
tp = LookupCellFile(model, filenum);
|
tp = LookupCellFile(model, filenum);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -615,7 +626,7 @@ void ReadSpiceFile(char *fname, int filenum, struct cellstack **CellStackPtr,
|
|||||||
}
|
}
|
||||||
SpiceTokNoNewline();
|
SpiceTokNoNewline();
|
||||||
}
|
}
|
||||||
SetClass((blackbox) ? CLASS_MODULE : CLASS_SUBCKT);
|
SetClass((blackbox) ? CLASS_MODULE : CLASS_SUBCKT);
|
||||||
|
|
||||||
if (hasports == 0) {
|
if (hasports == 0) {
|
||||||
// If the cell defines no ports, then create a proxy
|
// If the cell defines no ports, then create a proxy
|
||||||
@@ -640,7 +651,7 @@ skip_ends:
|
|||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
SpiceSkipNewLine();
|
SpiceSkipNewLine();
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
if (EndParseFile()) break;
|
if (EndParseFile()) break;
|
||||||
if (matchnocase(nexttok, ".ENDS")) {
|
if (matchnocase(nexttok, ".ENDS")) {
|
||||||
in_subckt = 0;
|
in_subckt = 0;
|
||||||
@@ -662,7 +673,7 @@ skip_ends:
|
|||||||
|
|
||||||
if (*CellStackPtr) PopStack(CellStackPtr);
|
if (*CellStackPtr) PopStack(CellStackPtr);
|
||||||
if (*CellStackPtr) ReopenCellDef((*CellStackPtr)->cellname, filenum);
|
if (*CellStackPtr) ReopenCellDef((*CellStackPtr)->cellname, filenum);
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
}
|
}
|
||||||
else if (matchnocase(nexttok, ".MODEL")) {
|
else if (matchnocase(nexttok, ".MODEL")) {
|
||||||
unsigned char class = CLASS_SUBCKT;
|
unsigned char class = CLASS_SUBCKT;
|
||||||
@@ -734,7 +745,7 @@ skip_ends:
|
|||||||
if (numnodes == 0) {
|
if (numnodes == 0) {
|
||||||
// If there is no current cell, make one
|
// If there is no current cell, make one
|
||||||
if (!(*CellStackPtr)) {
|
if (!(*CellStackPtr)) {
|
||||||
CellDefNoCase(fname, filenum);
|
CellDef(fname, filenum);
|
||||||
PushStack(fname, CellStackPtr);
|
PushStack(fname, CellStackPtr);
|
||||||
}
|
}
|
||||||
Global(nexttok);
|
Global(nexttok);
|
||||||
@@ -743,7 +754,7 @@ skip_ends:
|
|||||||
SpiceSkipNewLine();
|
SpiceSkipNewLine();
|
||||||
}
|
}
|
||||||
else if (matchnocase(nexttok, ".INCLUDE")) {
|
else if (matchnocase(nexttok, ".INCLUDE")) {
|
||||||
char *iname, *iptr, *quotptr, *pathend;
|
char *iname, *iptr, *quotptr, *pathend, *userpath = NULL;
|
||||||
|
|
||||||
SpiceTokNoNewline();
|
SpiceTokNoNewline();
|
||||||
if (nexttok == NULL) continue; /* Ignore if no filename */
|
if (nexttok == NULL) continue; /* Ignore if no filename */
|
||||||
@@ -755,12 +766,44 @@ skip_ends:
|
|||||||
pathend = strrchr(fname, '/');
|
pathend = strrchr(fname, '/');
|
||||||
iptr = nexttok;
|
iptr = nexttok;
|
||||||
while (*iptr == '\'' || *iptr == '\"' || *iptr == '`') iptr++;
|
while (*iptr == '\'' || *iptr == '\"' || *iptr == '`') iptr++;
|
||||||
if ((pathend != NULL) && (*iptr != '/')) {
|
if ((pathend != NULL) && (*iptr != '/') && (*iptr != '~')) {
|
||||||
*pathend = '\0';
|
*pathend = '\0';
|
||||||
iname = (char *)MALLOC(strlen(fname) + strlen(iptr) + 2);
|
iname = (char *)MALLOC(strlen(fname) + strlen(iptr) + 2);
|
||||||
sprintf(iname, "%s/%s", fname, iptr);
|
sprintf(iname, "%s/%s", fname, iptr);
|
||||||
*pathend = '/';
|
*pathend = '/';
|
||||||
}
|
}
|
||||||
|
#ifndef IBMPC
|
||||||
|
else if ((*iptr == '~') && (*(iptr + 1) == '/')) {
|
||||||
|
/* For ~/<path>, substitute tilde from $HOME */
|
||||||
|
userpath = getenv("HOME");
|
||||||
|
iname = (char *)MALLOC(strlen(userpath) + strlen(iptr));
|
||||||
|
sprintf(iname, "%s%s", userpath, iptr + 1);
|
||||||
|
}
|
||||||
|
else if (*iptr == '~') {
|
||||||
|
/* For ~<user>/<path>, substitute tilde from getpwnam() */
|
||||||
|
struct passwd *passwd;
|
||||||
|
char *pathstart;
|
||||||
|
pathstart = strchr(iptr, '/');
|
||||||
|
if (pathstart) *pathstart = '\0';
|
||||||
|
passwd = getpwnam(iptr + 1);
|
||||||
|
if (passwd != NULL) {
|
||||||
|
userpath = passwd->pw_dir;
|
||||||
|
if (pathstart) {
|
||||||
|
*pathstart = '/';
|
||||||
|
iname = (char *)MALLOC(strlen(userpath) + strlen(pathstart) + 1);
|
||||||
|
sprintf(iname, "%s%s", userpath, pathstart);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Almost certainly an error, but make the substitution anyway */
|
||||||
|
iname = STRDUP(userpath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Probably an error, but copy the filename verbatim */
|
||||||
|
iname = STRDUP(iptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
iname = STRDUP(iptr);
|
iname = STRDUP(iptr);
|
||||||
|
|
||||||
@@ -816,7 +859,7 @@ skip_ends:
|
|||||||
collector[99] = '\0';
|
collector[99] = '\0';
|
||||||
|
|
||||||
if (!(*CellStackPtr)) {
|
if (!(*CellStackPtr)) {
|
||||||
CellDefNoCase(fname, filenum);
|
CellDef(fname, filenum);
|
||||||
PushStack(fname, CellStackPtr);
|
PushStack(fname, CellStackPtr);
|
||||||
}
|
}
|
||||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||||
@@ -848,7 +891,7 @@ skip_ends:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (LookupCellFile(model, filenum) == NULL) {
|
if (LookupCellFile(model, filenum) == NULL) {
|
||||||
CellDefNoCase(model, filenum);
|
CellDef(model, filenum);
|
||||||
Port("collector");
|
Port("collector");
|
||||||
Port("base");
|
Port("base");
|
||||||
Port("emitter");
|
Port("emitter");
|
||||||
@@ -877,7 +920,7 @@ skip_ends:
|
|||||||
bulk[99] = '\0';
|
bulk[99] = '\0';
|
||||||
|
|
||||||
if (!(*CellStackPtr)) {
|
if (!(*CellStackPtr)) {
|
||||||
CellDefNoCase(fname, filenum);
|
CellDef(fname, filenum);
|
||||||
PushStack(fname, CellStackPtr);
|
PushStack(fname, CellStackPtr);
|
||||||
}
|
}
|
||||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||||
@@ -918,7 +961,7 @@ skip_ends:
|
|||||||
/* SPICE transistor. */
|
/* SPICE transistor. */
|
||||||
|
|
||||||
if (LookupCellFile(model, filenum) == NULL) {
|
if (LookupCellFile(model, filenum) == NULL) {
|
||||||
CellDefNoCase(model, filenum);
|
CellDef(model, filenum);
|
||||||
Port("drain");
|
Port("drain");
|
||||||
Port("gate");
|
Port("gate");
|
||||||
Port("source");
|
Port("source");
|
||||||
@@ -955,7 +998,7 @@ skip_ends:
|
|||||||
cbot[99] = '\0';
|
cbot[99] = '\0';
|
||||||
|
|
||||||
if (!(*CellStackPtr)) {
|
if (!(*CellStackPtr)) {
|
||||||
CellDefNoCase(fname, filenum);
|
CellDef(fname, filenum);
|
||||||
PushStack(fname, CellStackPtr);
|
PushStack(fname, CellStackPtr);
|
||||||
}
|
}
|
||||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||||
@@ -1009,7 +1052,7 @@ skip_ends:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (LookupCellFile(model, filenum) == NULL) {
|
if (LookupCellFile(model, filenum) == NULL) {
|
||||||
CellDefNoCase(model, filenum);
|
CellDef(model, filenum);
|
||||||
Port("top");
|
Port("top");
|
||||||
Port("bottom");
|
Port("bottom");
|
||||||
PropertyValue(model, filenum, "value", 0.01, 0.0);
|
PropertyValue(model, filenum, "value", 0.01, 0.0);
|
||||||
@@ -1049,7 +1092,7 @@ skip_ends:
|
|||||||
rbot[99] = '\0';
|
rbot[99] = '\0';
|
||||||
|
|
||||||
if (!(*CellStackPtr)) {
|
if (!(*CellStackPtr)) {
|
||||||
CellDefNoCase(fname, filenum);
|
CellDef(fname, filenum);
|
||||||
PushStack(fname, CellStackPtr);
|
PushStack(fname, CellStackPtr);
|
||||||
}
|
}
|
||||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||||
@@ -1100,7 +1143,7 @@ skip_ends:
|
|||||||
if (model[0] != '\0')
|
if (model[0] != '\0')
|
||||||
{
|
{
|
||||||
if (LookupCellFile(model, filenum) == NULL) {
|
if (LookupCellFile(model, filenum) == NULL) {
|
||||||
CellDefNoCase(model, filenum);
|
CellDef(model, filenum);
|
||||||
Port("end_a");
|
Port("end_a");
|
||||||
Port("end_b");
|
Port("end_b");
|
||||||
PropertyValue(model, filenum, "value", 0.01, 0.0);
|
PropertyValue(model, filenum, "value", 0.01, 0.0);
|
||||||
@@ -1136,7 +1179,7 @@ skip_ends:
|
|||||||
anode[99] = '\0';
|
anode[99] = '\0';
|
||||||
|
|
||||||
if (!(*CellStackPtr)) {
|
if (!(*CellStackPtr)) {
|
||||||
CellDefNoCase(fname, filenum);
|
CellDef(fname, filenum);
|
||||||
PushStack(fname, CellStackPtr);
|
PushStack(fname, CellStackPtr);
|
||||||
}
|
}
|
||||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||||
@@ -1165,7 +1208,7 @@ skip_ends:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (LookupCellFile(model, filenum) == NULL) {
|
if (LookupCellFile(model, filenum) == NULL) {
|
||||||
CellDefNoCase(model, filenum);
|
CellDef(model, filenum);
|
||||||
Port("anode");
|
Port("anode");
|
||||||
Port("cathode");
|
Port("cathode");
|
||||||
PropertyInteger(model, filenum, "M", 0, 1);
|
PropertyInteger(model, filenum, "M", 0, 1);
|
||||||
@@ -1198,7 +1241,7 @@ skip_ends:
|
|||||||
node4[99] = '\0';
|
node4[99] = '\0';
|
||||||
|
|
||||||
if (!(*CellStackPtr)) {
|
if (!(*CellStackPtr)) {
|
||||||
CellDefNoCase(fname, filenum);
|
CellDef(fname, filenum);
|
||||||
PushStack(fname, CellStackPtr);
|
PushStack(fname, CellStackPtr);
|
||||||
}
|
}
|
||||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||||
@@ -1236,7 +1279,7 @@ skip_ends:
|
|||||||
if (model[0] != '\0')
|
if (model[0] != '\0')
|
||||||
{
|
{
|
||||||
if (LookupCellFile(model, filenum) == NULL) {
|
if (LookupCellFile(model, filenum) == NULL) {
|
||||||
CellDefNoCase(model, filenum);
|
CellDef(model, filenum);
|
||||||
Port("node1");
|
Port("node1");
|
||||||
Port("node2");
|
Port("node2");
|
||||||
Port("node3");
|
Port("node3");
|
||||||
@@ -1276,7 +1319,7 @@ skip_ends:
|
|||||||
end_b[99] = '\0';
|
end_b[99] = '\0';
|
||||||
|
|
||||||
if (!(*CellStackPtr)) {
|
if (!(*CellStackPtr)) {
|
||||||
CellDefNoCase(fname, filenum);
|
CellDef(fname, filenum);
|
||||||
PushStack(fname, CellStackPtr);
|
PushStack(fname, CellStackPtr);
|
||||||
}
|
}
|
||||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||||
@@ -1321,7 +1364,7 @@ skip_ends:
|
|||||||
if (model[0] != '\0')
|
if (model[0] != '\0')
|
||||||
{
|
{
|
||||||
if (LookupCellFile(model, filenum) == NULL) {
|
if (LookupCellFile(model, filenum) == NULL) {
|
||||||
CellDefNoCase(model, filenum);
|
CellDef(model, filenum);
|
||||||
Port("end_a");
|
Port("end_a");
|
||||||
Port("end_b");
|
Port("end_b");
|
||||||
PropertyInteger(model, filenum, "M", 0, 1);
|
PropertyInteger(model, filenum, "M", 0, 1);
|
||||||
@@ -1359,7 +1402,7 @@ skip_ends:
|
|||||||
neg[99] = '\0';
|
neg[99] = '\0';
|
||||||
|
|
||||||
if (!(*CellStackPtr)) {
|
if (!(*CellStackPtr)) {
|
||||||
CellDefNoCase(fname, filenum);
|
CellDef(fname, filenum);
|
||||||
PushStack(fname, CellStackPtr);
|
PushStack(fname, CellStackPtr);
|
||||||
}
|
}
|
||||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||||
@@ -1389,7 +1432,7 @@ skip_ends:
|
|||||||
}
|
}
|
||||||
strcpy(model, "vsrc"); /* Default voltage source */
|
strcpy(model, "vsrc"); /* Default voltage source */
|
||||||
if (LookupCellFile(model, filenum) == NULL) {
|
if (LookupCellFile(model, filenum) == NULL) {
|
||||||
CellDefNoCase(model, filenum);
|
CellDef(model, filenum);
|
||||||
Port("pos");
|
Port("pos");
|
||||||
Port("neg");
|
Port("neg");
|
||||||
PropertyInteger(model, filenum, "M", 0, 1);
|
PropertyInteger(model, filenum, "M", 0, 1);
|
||||||
@@ -1414,7 +1457,7 @@ skip_ends:
|
|||||||
neg[99] = '\0';
|
neg[99] = '\0';
|
||||||
|
|
||||||
if (!(*CellStackPtr)) {
|
if (!(*CellStackPtr)) {
|
||||||
CellDefNoCase(fname, filenum);
|
CellDef(fname, filenum);
|
||||||
PushStack(fname, CellStackPtr);
|
PushStack(fname, CellStackPtr);
|
||||||
}
|
}
|
||||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||||
@@ -1443,7 +1486,7 @@ skip_ends:
|
|||||||
}
|
}
|
||||||
strcpy(model, "isrc"); /* Default current source */
|
strcpy(model, "isrc"); /* Default current source */
|
||||||
if (LookupCellFile(model, filenum) == NULL) {
|
if (LookupCellFile(model, filenum) == NULL) {
|
||||||
CellDefNoCase(model, filenum);
|
CellDef(model, filenum);
|
||||||
Port("pos");
|
Port("pos");
|
||||||
Port("neg");
|
Port("neg");
|
||||||
PropertyInteger(model, filenum, "M", 0, 1);
|
PropertyInteger(model, filenum, "M", 0, 1);
|
||||||
@@ -1470,7 +1513,7 @@ skip_ends:
|
|||||||
ctrln[99] = '\0';
|
ctrln[99] = '\0';
|
||||||
|
|
||||||
if (!(*CellStackPtr)) {
|
if (!(*CellStackPtr)) {
|
||||||
CellDefNoCase(fname, filenum);
|
CellDef(fname, filenum);
|
||||||
PushStack(fname, CellStackPtr);
|
PushStack(fname, CellStackPtr);
|
||||||
}
|
}
|
||||||
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
strncpy(inst, nexttok + 1, 99); SpiceTokNoNewline();
|
||||||
@@ -1506,7 +1549,7 @@ skip_ends:
|
|||||||
}
|
}
|
||||||
strcpy(model, "vcvs"); /* Default controlled voltage source */
|
strcpy(model, "vcvs"); /* Default controlled voltage source */
|
||||||
if (LookupCellFile(model, filenum) == NULL) {
|
if (LookupCellFile(model, filenum) == NULL) {
|
||||||
CellDefNoCase(model, filenum);
|
CellDef(model, filenum);
|
||||||
Port("pos");
|
Port("pos");
|
||||||
Port("neg");
|
Port("neg");
|
||||||
Port("ctrlp");
|
Port("ctrlp");
|
||||||
@@ -1546,7 +1589,7 @@ skip_ends:
|
|||||||
snprintf(instancename, 99, "%s", nexttok + 1);
|
snprintf(instancename, 99, "%s", nexttok + 1);
|
||||||
strncpy(instancename, nexttok + 1, 99);
|
strncpy(instancename, nexttok + 1, 99);
|
||||||
if (!(*CellStackPtr)) {
|
if (!(*CellStackPtr)) {
|
||||||
CellDefNoCase(fname, filenum);
|
CellDef(fname, filenum);
|
||||||
PushStack(fname, CellStackPtr);
|
PushStack(fname, CellStackPtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1671,7 +1714,7 @@ skip_ends:
|
|||||||
|
|
||||||
Fprintf(stdout, "Call to undefined subcircuit %s\n"
|
Fprintf(stdout, "Call to undefined subcircuit %s\n"
|
||||||
"Creating placeholder cell definition.\n", subcktname);
|
"Creating placeholder cell definition.\n", subcktname);
|
||||||
CellDefNoCase(subcktname, filenum);
|
CellDef(subcktname, filenum);
|
||||||
CurrentCell->flags |= CELL_PLACEHOLDER;
|
CurrentCell->flags |= CELL_PLACEHOLDER;
|
||||||
for (scan = head, i = 1; scan != NULL; scan = scan->next, i++) {
|
for (scan = head, i = 1; scan != NULL; scan = scan->next, i++) {
|
||||||
sprintf(defport, "%d", i);
|
sprintf(defport, "%d", i);
|
||||||
@@ -1839,7 +1882,7 @@ char *ReadSpiceTop(char *fname, int *fnum, int blackbox)
|
|||||||
// as an empty cell. Otherwise, the filename is lost and cells
|
// as an empty cell. Otherwise, the filename is lost and cells
|
||||||
// cannot be matched to the file!
|
// 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);
|
tp = LookupCellFile(fname, filenum);
|
||||||
if (tp) tp->flags |= CELL_TOP;
|
if (tp) tp->flags |= CELL_TOP;
|
||||||
@@ -1898,12 +1941,15 @@ void IncludeSpice(char *fname, int parent, struct cellstack **CellStackPtr,
|
|||||||
if ((filenum = OpenParseFile(fname, parent)) < 0) {
|
if ((filenum = OpenParseFile(fname, parent)) < 0) {
|
||||||
|
|
||||||
/* If that fails, see if a standard SPICE extension */
|
/* If that fails, see if a standard SPICE extension */
|
||||||
/* helps. But really, we're getting desperate at this */
|
/* helps, if the file didn't have an extension. But */
|
||||||
/* point. */
|
/* really, we're getting desperate at this point. */
|
||||||
|
|
||||||
SetExtension(name, fname, SPICE_EXTENSION);
|
if (strchr(fname, '.') == NULL) {
|
||||||
if ((filenum = OpenParseFile(name, parent)) < 0) {
|
SetExtension(name, fname, SPICE_EXTENSION);
|
||||||
Fprintf(stderr,"Error in SPICE file read: No file %s\n",name);
|
filenum = OpenParseFile(name, parent);
|
||||||
|
}
|
||||||
|
if (filenum < 0) {
|
||||||
|
Fprintf(stderr,"Error in SPICE file include: No file %s\n",name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1441
File diff suppressed because it is too large
Load Diff
@@ -132,6 +132,7 @@ char *xilinx_class(model)
|
|||||||
}
|
}
|
||||||
return(model);
|
return(model);
|
||||||
}
|
}
|
||||||
|
void
|
||||||
Xilinx(cellname, filename)
|
Xilinx(cellname, filename)
|
||||||
char *cellname;
|
char *cellname;
|
||||||
char *filename;
|
char *filename;
|
||||||
|
|||||||
@@ -66,8 +66,8 @@ CPP = gcc -E -x c
|
|||||||
CXX = @CXX@
|
CXX = @CXX@
|
||||||
|
|
||||||
CPPFLAGS = -I. -I${NETGENDIR}
|
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 = -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=\"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=\"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
|
CFLAGS = -g -m64 -fPIC -fPIC
|
||||||
|
|
||||||
DEPEND_FILE = Depend
|
DEPEND_FILE = Depend
|
||||||
|
|||||||
+2
-2
@@ -22,8 +22,8 @@ tclnetgen${SHDLIB_EXT}: ${EXTRA_LIBS}
|
|||||||
@echo --- making netgen Tcl library \(tclnetgen${SHDLIB_EXT}\)
|
@echo --- making netgen Tcl library \(tclnetgen${SHDLIB_EXT}\)
|
||||||
${RM} tclnetgen${SHDLIB_EXT}
|
${RM} tclnetgen${SHDLIB_EXT}
|
||||||
${CC} ${CFLAGS} ${CPPFLAGS} -o $@ ${LDDL_FLAGS} \
|
${CC} ${CFLAGS} ${CPPFLAGS} -o $@ ${LDDL_FLAGS} \
|
||||||
${LD_RUN_PATH} ${EXTRA_LIBS} ${LD_EXTRA_LIBS} -lc ${LIBS} \
|
${LD_RUN_PATH} ${EXTRA_LIBS} ${LD_EXTRA_LIBS} \
|
||||||
${LIB_SPECS} ${LDFLAGS}
|
-lc ${LIBS} ${LIB_SPECS} ${LDFLAGS}
|
||||||
|
|
||||||
$(DESTDIR)${BINDIR}/netgen:
|
$(DESTDIR)${BINDIR}/netgen:
|
||||||
${RM} $@
|
${RM} $@
|
||||||
|
|||||||
+14
-14
@@ -12,9 +12,9 @@ generated by GNU Autoconf 2.69. Invocation command line was
|
|||||||
|
|
||||||
hostname = stravinsky
|
hostname = stravinsky
|
||||||
uname -m = x86_64
|
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 -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
|
/usr/bin/uname -p = x86_64
|
||||||
/bin/uname -X = unknown
|
/bin/uname -X = unknown
|
||||||
@@ -50,7 +50,7 @@ configure:2584: found /bin/gcc
|
|||||||
configure:2595: result: gcc
|
configure:2595: result: gcc
|
||||||
configure:2824: checking for C compiler version
|
configure:2824: checking for C compiler version
|
||||||
configure:2833: gcc --version >&5
|
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.
|
Copyright (C) 2014 Free Software Foundation, Inc.
|
||||||
This is free software; see the source for copying conditions. There is NO
|
This is free software; see the source for copying conditions. There is NO
|
||||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
@@ -61,9 +61,9 @@ Using built-in specs.
|
|||||||
COLLECT_GCC=gcc
|
COLLECT_GCC=gcc
|
||||||
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.9.2/lto-wrapper
|
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.9.2/lto-wrapper
|
||||||
Target: x86_64-redhat-linux
|
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
|
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:2844: $? = 0
|
||||||
configure:2833: gcc -V >&5
|
configure:2833: gcc -V >&5
|
||||||
gcc: error: unrecognized command line option '-V'
|
gcc: error: unrecognized command line option '-V'
|
||||||
@@ -125,7 +125,7 @@ configure: failed program was:
|
|||||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||||
| #define PACKAGE_URL ""
|
| #define PACKAGE_URL ""
|
||||||
| #define NETGEN_VERSION "1.5"
|
| #define NETGEN_VERSION "1.5"
|
||||||
| #define NETGEN_REVISION "60"
|
| #define NETGEN_REVISION "90"
|
||||||
| /* end confdefs.h. */
|
| /* end confdefs.h. */
|
||||||
| #include <ac_nonexistent.h>
|
| #include <ac_nonexistent.h>
|
||||||
configure:3384: result: gcc -E
|
configure:3384: result: gcc -E
|
||||||
@@ -146,7 +146,7 @@ configure: failed program was:
|
|||||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||||
| #define PACKAGE_URL ""
|
| #define PACKAGE_URL ""
|
||||||
| #define NETGEN_VERSION "1.5"
|
| #define NETGEN_VERSION "1.5"
|
||||||
| #define NETGEN_REVISION "60"
|
| #define NETGEN_REVISION "90"
|
||||||
| /* end confdefs.h. */
|
| /* end confdefs.h. */
|
||||||
| #include <ac_nonexistent.h>
|
| #include <ac_nonexistent.h>
|
||||||
configure:3447: checking for library containing strerror
|
configure:3447: checking for library containing strerror
|
||||||
@@ -261,7 +261,7 @@ configure: failed program was:
|
|||||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||||
| #define PACKAGE_URL ""
|
| #define PACKAGE_URL ""
|
||||||
| #define NETGEN_VERSION "1.5"
|
| #define NETGEN_VERSION "1.5"
|
||||||
| #define NETGEN_REVISION "60"
|
| #define NETGEN_REVISION "90"
|
||||||
| #define STDC_HEADERS 1
|
| #define STDC_HEADERS 1
|
||||||
| #define HAVE_SYS_TYPES_H 1
|
| #define HAVE_SYS_TYPES_H 1
|
||||||
| #define HAVE_SYS_STAT_H 1
|
| #define HAVE_SYS_STAT_H 1
|
||||||
@@ -302,7 +302,7 @@ configure: failed program was:
|
|||||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||||
| #define PACKAGE_URL ""
|
| #define PACKAGE_URL ""
|
||||||
| #define NETGEN_VERSION "1.5"
|
| #define NETGEN_VERSION "1.5"
|
||||||
| #define NETGEN_REVISION "60"
|
| #define NETGEN_REVISION "90"
|
||||||
| #define STDC_HEADERS 1
|
| #define STDC_HEADERS 1
|
||||||
| #define HAVE_SYS_TYPES_H 1
|
| #define HAVE_SYS_TYPES_H 1
|
||||||
| #define HAVE_SYS_STAT_H 1
|
| #define HAVE_SYS_STAT_H 1
|
||||||
@@ -382,7 +382,7 @@ configure: failed program was:
|
|||||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||||
| #define PACKAGE_URL ""
|
| #define PACKAGE_URL ""
|
||||||
| #define NETGEN_VERSION "1.5"
|
| #define NETGEN_VERSION "1.5"
|
||||||
| #define NETGEN_REVISION "60"
|
| #define NETGEN_REVISION "90"
|
||||||
| #define STDC_HEADERS 1
|
| #define STDC_HEADERS 1
|
||||||
| #define HAVE_SYS_TYPES_H 1
|
| #define HAVE_SYS_TYPES_H 1
|
||||||
| #define HAVE_SYS_STAT_H 1
|
| #define HAVE_SYS_STAT_H 1
|
||||||
@@ -454,7 +454,7 @@ configure: failed program was:
|
|||||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||||
| #define PACKAGE_URL ""
|
| #define PACKAGE_URL ""
|
||||||
| #define NETGEN_VERSION "1.5"
|
| #define NETGEN_VERSION "1.5"
|
||||||
| #define NETGEN_REVISION "60"
|
| #define NETGEN_REVISION "90"
|
||||||
| #define STDC_HEADERS 1
|
| #define STDC_HEADERS 1
|
||||||
| #define HAVE_SYS_TYPES_H 1
|
| #define HAVE_SYS_TYPES_H 1
|
||||||
| #define HAVE_SYS_STAT_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: gcc -o conftest -g conftest.c -lICE >&5
|
||||||
configure:5974: $? = 0
|
configure:5974: $? = 0
|
||||||
configure:5983: result: yes
|
configure:5983: result: yes
|
||||||
configure:6705: creating ./config.status
|
configure:6704: creating ./config.status
|
||||||
|
|
||||||
## ---------------------- ##
|
## ---------------------- ##
|
||||||
## Running config.status. ##
|
## Running config.status. ##
|
||||||
@@ -621,7 +621,7 @@ CC='gcc'
|
|||||||
CFLAGS='-g -m64 -fPIC'
|
CFLAGS='-g -m64 -fPIC'
|
||||||
CPP='gcc -E -x c'
|
CPP='gcc -E -x c'
|
||||||
CPPFLAGS=''
|
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'
|
DEPEND_FLAG='-MM'
|
||||||
ECHO_C=''
|
ECHO_C=''
|
||||||
ECHO_N='printf'
|
ECHO_N='printf'
|
||||||
@@ -736,7 +736,7 @@ unused=''
|
|||||||
#define PACKAGE_BUGREPORT "[email protected]"
|
#define PACKAGE_BUGREPORT "[email protected]"
|
||||||
#define PACKAGE_URL ""
|
#define PACKAGE_URL ""
|
||||||
#define NETGEN_VERSION "1.5"
|
#define NETGEN_VERSION "1.5"
|
||||||
#define NETGEN_REVISION "60"
|
#define NETGEN_REVISION "90"
|
||||||
#define STDC_HEADERS 1
|
#define STDC_HEADERS 1
|
||||||
#define HAVE_SYS_TYPES_H 1
|
#define HAVE_SYS_TYPES_H 1
|
||||||
#define HAVE_SYS_STAT_H 1
|
#define HAVE_SYS_STAT_H 1
|
||||||
|
|||||||
@@ -659,7 +659,7 @@ S["ECHO_T"]=""
|
|||||||
S["ECHO_N"]="-n"
|
S["ECHO_N"]="-n"
|
||||||
S["ECHO_C"]=""
|
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"\
|
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"\
|
"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"\
|
"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"
|
"VE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1"
|
||||||
|
|||||||
Vendored
+1
-2
@@ -6081,8 +6081,7 @@ case $target in
|
|||||||
|
|
||||||
;;
|
;;
|
||||||
*darwin*)
|
*darwin*)
|
||||||
$as_echo "#define macosx 1" >>confdefs.h
|
$as_echo "#define macosx macos" >> confdefs.h
|
||||||
|
|
||||||
if test "$CPP" = "cc -E" ; then
|
if test "$CPP" = "cc -E" ; then
|
||||||
CPPFLAGS="$CPPFLAGS -no-cpp-precomp"
|
CPPFLAGS="$CPPFLAGS -no-cpp-precomp"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -868,7 +868,7 @@ case $target in
|
|||||||
AC_DEFINE(i386)
|
AC_DEFINE(i386)
|
||||||
;;
|
;;
|
||||||
*darwin*)
|
*darwin*)
|
||||||
AC_DEFINE(macosx)
|
$as_echo "#define macosx macos" >> confdefs.h
|
||||||
if test "$CPP" = "cc -E" ; then
|
if test "$CPP" = "cc -E" ; then
|
||||||
CPPFLAGS="$CPPFLAGS -no-cpp-precomp"
|
CPPFLAGS="$CPPFLAGS -no-cpp-precomp"
|
||||||
fi
|
fi
|
||||||
|
|||||||
+2
-2
@@ -66,8 +66,8 @@ CPP = gcc -E -x c
|
|||||||
CXX = @CXX@
|
CXX = @CXX@
|
||||||
|
|
||||||
CPPFLAGS = -I. -I${NETGENDIR}
|
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 = -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=\"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=\"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
|
CFLAGS = -g -m64 -fPIC -fPIC
|
||||||
|
|
||||||
DEPEND_FILE = Depend
|
DEPEND_FILE = Depend
|
||||||
|
|||||||
+5
-5
@@ -28,14 +28,14 @@ netgenexec${EXEEXT}: netgenexec.c
|
|||||||
${LDFLAGS} ${LIBS} ${LIB_SPECS_NOSTUB}
|
${LDFLAGS} ${LIBS} ${LIB_SPECS_NOSTUB}
|
||||||
|
|
||||||
netgen.tcl: netgen.tcl.in
|
netgen.tcl: netgen.tcl.in
|
||||||
sed -e /TCL_DIR/s%TCL_DIR%${TCLDIR}%g \
|
sed -e 's%TCL_DIR%${TCLDIR}%g' \
|
||||||
-e /SHDLIB_EXT/s%SHDLIB_EXT%${SHDLIB_EXT}%g \
|
-e 's%SHDLIB_EXT%${SHDLIB_EXT}%g' \
|
||||||
netgen.tcl.in > netgen.tcl
|
netgen.tcl.in > netgen.tcl
|
||||||
|
|
||||||
netgen.sh: netgen.sh.in
|
netgen.sh: netgen.sh.in
|
||||||
sed -e /TCL_DIR/s%TCL_DIR%${TCLDIR}%g \
|
sed -e 's%TCL_DIR%${TCLDIR}%g' \
|
||||||
-e /TCLLIB_DIR/s%TCLLIB_DIR%${TCL_LIB_DIR}%g \
|
-e 's%TCLLIB_DIR%${TCL_LIB_DIR}%g' \
|
||||||
-e /WISH_EXE/s%WISH_EXE%${WISH_EXE}%g \
|
-e 's%WISH_EXE%${WISH_EXE}%g' \
|
||||||
netgen.sh.in > netgen.sh
|
netgen.sh.in > netgen.sh
|
||||||
|
|
||||||
$(DESTDIR)${TCLDIR}/%: %
|
$(DESTDIR)${TCLDIR}/%: %
|
||||||
|
|||||||
+40
-29
@@ -20,11 +20,10 @@ foreach i $nlist {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if {${tcl_version} >= 8.6} {
|
# -lazy option not needed if stubs libraries are handled correctly
|
||||||
load -lazy TCL_DIR/tclnetgenSHDLIB_EXT
|
# load -lazy TCL_DIR/tclnetgenSHDLIB_EXT
|
||||||
} else {
|
|
||||||
load TCL_DIR/tclnetgenSHDLIB_EXT
|
load TCL_DIR/tclnetgenSHDLIB_EXT
|
||||||
}
|
|
||||||
|
|
||||||
#----------------------------------------------------------------
|
#----------------------------------------------------------------
|
||||||
# Convert LVS list result into a JSON file
|
# Convert LVS list result into a JSON file
|
||||||
@@ -84,9 +83,9 @@ proc netgen::convert_to_json {filename lvs_final} {
|
|||||||
nets {
|
nets {
|
||||||
puts $fjson " \"${key}\": \["
|
puts $fjson " \"${key}\": \["
|
||||||
set cktval [lindex $value 0]
|
set cktval [lindex $value 0]
|
||||||
puts $fjson " \"$cktval\","
|
puts $fjson " $cktval,"
|
||||||
set cktval [lindex $value 1]
|
set cktval [lindex $value 1]
|
||||||
puts $fjson " \"$cktval\""
|
puts $fjson " $cktval"
|
||||||
if {$kidx == $nkeys} {
|
if {$kidx == $nkeys} {
|
||||||
puts $fjson " \]"
|
puts $fjson " \]"
|
||||||
} else {
|
} else {
|
||||||
@@ -194,15 +193,13 @@ proc netgen::convert_to_json {filename lvs_final} {
|
|||||||
puts $fjson " \],"
|
puts $fjson " \],"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
puts $fjson " \]"
|
||||||
if {$gidx == $glen} {
|
if {$gidx == $glen} {
|
||||||
puts $fjson " \]"
|
puts $fjson " \]"
|
||||||
} else {
|
} else {
|
||||||
puts $fjson " \],"
|
puts $fjson " \],"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if {$glen > 0} {
|
|
||||||
puts $fjson " \]"
|
|
||||||
}
|
|
||||||
if {$kidx == $nkeys} {
|
if {$kidx == $nkeys} {
|
||||||
puts $fjson " \]"
|
puts $fjson " \]"
|
||||||
} else {
|
} else {
|
||||||
@@ -275,15 +272,13 @@ proc netgen::convert_to_json {filename lvs_final} {
|
|||||||
puts $fjson " \],"
|
puts $fjson " \],"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
puts $fjson " \]"
|
||||||
if {$gidx == $glen} {
|
if {$gidx == $glen} {
|
||||||
puts $fjson " \]"
|
puts $fjson " \]"
|
||||||
} else {
|
} else {
|
||||||
puts $fjson " \],"
|
puts $fjson " \],"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if {$glen > 0} {
|
|
||||||
puts $fjson " \]"
|
|
||||||
}
|
|
||||||
if {$kidx == $nkeys} {
|
if {$kidx == $nkeys} {
|
||||||
puts $fjson " \]"
|
puts $fjson " \]"
|
||||||
} else {
|
} else {
|
||||||
@@ -326,9 +321,9 @@ proc netgen::convert_to_json {filename lvs_final} {
|
|||||||
puts $fjson " \[\"${propname}\", \"${propval}\"\],"
|
puts $fjson " \[\"${propname}\", \"${propval}\"\],"
|
||||||
}
|
}
|
||||||
set property [lindex $instance end]
|
set property [lindex $instance end]
|
||||||
set prop0 [lindex $property 0]
|
set prop1 [lindex $property 1]
|
||||||
set propname [lindex $prop0 0]
|
set propname [lindex $prop1 0]
|
||||||
set propval [lindex $prop0 1]
|
set propval [lindex $prop1 1]
|
||||||
puts $fjson " \[\"${propname}\", \"${propval}\"\]"
|
puts $fjson " \[\"${propname}\", \"${propval}\"\]"
|
||||||
puts $fjson " \]"
|
puts $fjson " \]"
|
||||||
puts $fjson " \]"
|
puts $fjson " \]"
|
||||||
@@ -374,7 +369,6 @@ proc netgen::convert_to_json {filename lvs_final} {
|
|||||||
proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
|
proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
|
||||||
set dolist 0
|
set dolist 0
|
||||||
set dojson 0
|
set dojson 0
|
||||||
puts stdout "Diagnostic version"
|
|
||||||
foreach arg $args {
|
foreach arg $args {
|
||||||
if {$arg == "-list"} {
|
if {$arg == "-list"} {
|
||||||
puts stdout "Generating list result"
|
puts stdout "Generating list result"
|
||||||
@@ -385,6 +379,9 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
|
|||||||
set dolist 1
|
set dolist 1
|
||||||
set dojson 1
|
set dojson 1
|
||||||
set lvs_final {}
|
set lvs_final {}
|
||||||
|
} elseif {$arg == "-blackbox"} {
|
||||||
|
puts stdout "Treating empty subcircuits as black-box cells"
|
||||||
|
netgen::model blackbox on
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -478,15 +475,22 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
|
|||||||
if {$perrors > 0} {
|
if {$perrors > 0} {
|
||||||
puts stdout "Warning: There were errors reading the setup file"
|
puts stdout "Warning: There were errors reading the setup file"
|
||||||
}
|
}
|
||||||
} else {
|
} elseif {[string first nosetup $setupfile] < 0} {
|
||||||
netgen::permute default ;# transistors and resistors
|
netgen::permute default ;# transistors and resistors
|
||||||
netgen::property default
|
netgen::property default
|
||||||
}
|
}
|
||||||
|
|
||||||
puts stdout "Comparison output logged to file $logfile"
|
if {[string first nolog $logfile] < 0} {
|
||||||
netgen::log file $logfile
|
puts stdout "Comparison output logged to file $logfile"
|
||||||
netgen::log start
|
netgen::log file $logfile
|
||||||
netgen::log echo off
|
|
||||||
|
netgen::log start
|
||||||
|
netgen::log echo off
|
||||||
|
set dolog true
|
||||||
|
} else {
|
||||||
|
set dolog false
|
||||||
|
}
|
||||||
|
|
||||||
if {$dolist == 1} {
|
if {$dolist == 1} {
|
||||||
set endval [netgen::compare -list hierarchical "$fnum1 $cell1" "$fnum2 $cell2"]
|
set endval [netgen::compare -list hierarchical "$fnum1 $cell1" "$fnum2 $cell2"]
|
||||||
} else {
|
} else {
|
||||||
@@ -531,8 +535,13 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
|
|||||||
} else {
|
} else {
|
||||||
# Match pins
|
# Match pins
|
||||||
netgen::log echo off
|
netgen::log echo off
|
||||||
set result [equate pins "$fnum1 [lindex $endval 0]" \
|
if {$dolist == 1} {
|
||||||
"$fnum2 [lindex $endval 1]"]
|
set result [equate -list pins "$fnum1 [lindex $endval 0]" \
|
||||||
|
"$fnum2 [lindex $endval 1]"]
|
||||||
|
} else {
|
||||||
|
set result [equate pins "$fnum1 [lindex $endval 0]" \
|
||||||
|
"$fnum2 [lindex $endval 1]"]
|
||||||
|
}
|
||||||
if {$result != 0} {
|
if {$result != 0} {
|
||||||
equate classes "$fnum1 [lindex $endval 0]" \
|
equate classes "$fnum1 [lindex $endval 0]" \
|
||||||
"$fnum2 [lindex $endval 1]"
|
"$fnum2 [lindex $endval 1]"
|
||||||
@@ -564,7 +573,9 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
|
|||||||
if {$properr != {}} {
|
if {$properr != {}} {
|
||||||
netgen::log put "The following cells had property errors: $properr\n"
|
netgen::log put "The following cells had property errors: $properr\n"
|
||||||
}
|
}
|
||||||
netgen::log end
|
if {$dolog} {
|
||||||
|
netgen::log end
|
||||||
|
}
|
||||||
puts stdout "LVS Done."
|
puts stdout "LVS Done."
|
||||||
if {$dojson == 1} {
|
if {$dojson == 1} {
|
||||||
netgen::convert_to_json $logfile $lvs_final
|
netgen::convert_to_json $logfile $lvs_final
|
||||||
|
|||||||
+128
-37
@@ -698,11 +698,11 @@ _netgen_readnet(ClientData clientData,
|
|||||||
{
|
{
|
||||||
char *formats[] = {
|
char *formats[] = {
|
||||||
"automatic", "ext", "extflat", "sim", "ntk", "spice",
|
"automatic", "ext", "extflat", "sim", "ntk", "spice",
|
||||||
"netgen", "actel", "xilinx", NULL
|
"verilog", "netgen", "actel", "xilinx", NULL
|
||||||
};
|
};
|
||||||
enum FormatIdx {
|
enum FormatIdx {
|
||||||
AUTO_IDX, EXT_IDX, EXTFLAT_IDX, SIM_IDX, NTK_IDX,
|
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;
|
struct nlist *tc;
|
||||||
int result, index, filenum = -1;
|
int result, index, filenum = -1;
|
||||||
@@ -771,7 +771,7 @@ _netgen_readnet(ClientData clientData,
|
|||||||
|
|
||||||
if (retstr) savstr = STRDUP(retstr);
|
if (retstr) savstr = STRDUP(retstr);
|
||||||
|
|
||||||
// Check if the file is already loaded
|
// Check if the file is already loaded.
|
||||||
|
|
||||||
tc = LookupCell(savstr);
|
tc = LookupCell(savstr);
|
||||||
if (tc != NULL) {
|
if (tc != NULL) {
|
||||||
@@ -803,6 +803,9 @@ _netgen_readnet(ClientData clientData,
|
|||||||
case SPICE_IDX:
|
case SPICE_IDX:
|
||||||
retstr = ReadSpice(savstr, &filenum);
|
retstr = ReadSpice(savstr, &filenum);
|
||||||
break;
|
break;
|
||||||
|
case VERILOG_IDX:
|
||||||
|
retstr = ReadVerilog(savstr, &filenum);
|
||||||
|
break;
|
||||||
case NETGEN_IDX:
|
case NETGEN_IDX:
|
||||||
retstr = ReadNetgenFile(savstr, &filenum);
|
retstr = ReadNetgenFile(savstr, &filenum);
|
||||||
break;
|
break;
|
||||||
@@ -918,11 +921,13 @@ _netgen_writenet(ClientData clientData,
|
|||||||
{
|
{
|
||||||
char *formats[] = {
|
char *formats[] = {
|
||||||
"ext", "sim", "ntk", "actel",
|
"ext", "sim", "ntk", "actel",
|
||||||
"spice", "wombat", "esacap", "netgen", "ccode", "xilinx", NULL
|
"spice", "verilog", "wombat", "esacap", "netgen",
|
||||||
|
"ccode", "xilinx", NULL
|
||||||
};
|
};
|
||||||
enum FormatIdx {
|
enum FormatIdx {
|
||||||
EXT_IDX, SIM_IDX, NTK_IDX, ACTEL_IDX,
|
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;
|
int result, index, filenum;
|
||||||
char *repstr;
|
char *repstr;
|
||||||
@@ -963,6 +968,9 @@ _netgen_writenet(ClientData clientData,
|
|||||||
case SPICE_IDX:
|
case SPICE_IDX:
|
||||||
SpiceCell(repstr, filenum, "");
|
SpiceCell(repstr, filenum, "");
|
||||||
break;
|
break;
|
||||||
|
case VERILOG_IDX:
|
||||||
|
VerilogModule(repstr, filenum, "");
|
||||||
|
break;
|
||||||
case WOMBAT_IDX:
|
case WOMBAT_IDX:
|
||||||
Wombat(repstr,NULL);
|
Wombat(repstr,NULL);
|
||||||
break;
|
break;
|
||||||
@@ -1437,9 +1445,9 @@ _netgen_cells(ClientData clientData,
|
|||||||
char *optstart;
|
char *optstart;
|
||||||
int filenum = -1;
|
int filenum = -1;
|
||||||
struct nlist *np = NULL;
|
struct nlist *np = NULL;
|
||||||
int result, dolist = 0;
|
int result, printopt, dolist = 0, doall = 0, dotop = 0;
|
||||||
|
|
||||||
if (objc > 1) {
|
while (objc > 1) {
|
||||||
optstart = Tcl_GetString(objv[1]);
|
optstart = Tcl_GetString(objv[1]);
|
||||||
if (*optstart == '-') optstart++;
|
if (*optstart == '-') optstart++;
|
||||||
if (!strcmp(optstart, "list")) {
|
if (!strcmp(optstart, "list")) {
|
||||||
@@ -1447,27 +1455,41 @@ _netgen_cells(ClientData clientData,
|
|||||||
objv++;
|
objv++;
|
||||||
objc--;
|
objc--;
|
||||||
}
|
}
|
||||||
|
else if (!strcmp(optstart, "all")) {
|
||||||
|
doall = 1;
|
||||||
|
objv++;
|
||||||
|
objc--;
|
||||||
|
}
|
||||||
|
else if (!strcmp(optstart, "top")) {
|
||||||
|
dotop = 1;
|
||||||
|
objv++;
|
||||||
|
objc--;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
result = CommonParseCell(interp, objv[1], &np, &filenum);
|
||||||
|
if (result != TCL_OK) return result;
|
||||||
|
objv++;
|
||||||
|
objc--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (objc == 1) {
|
if (objc != 1) {
|
||||||
PrintCellHashTable((dolist) ? 2 : 0, -1);
|
Tcl_WrongNumArgs(interp, 1, objv, "[list] [-top] [-all] [valid_filename]");
|
||||||
}
|
|
||||||
else if (objc != 2) {
|
|
||||||
Tcl_WrongNumArgs(interp, 1, objv, "[list] [-all|-top|valid_filename]");
|
|
||||||
return TCL_ERROR;
|
return TCL_ERROR;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Tcl_Obj *lobj;
|
Tcl_Obj *lobj;
|
||||||
|
|
||||||
repstr = Tcl_GetString(objv[1]);
|
if (dotop) {
|
||||||
if (!strncmp(repstr, "-top", 4)) {
|
|
||||||
if (dolist)
|
if (dolist)
|
||||||
lobj = Tcl_NewListObj(0, NULL);
|
lobj = Tcl_NewListObj(0, NULL);
|
||||||
else
|
else
|
||||||
Fprintf(stdout, "Top level cells: ");
|
Fprintf(stdout, "Top level cells: ");
|
||||||
np = FirstCell();
|
np = FirstCell();
|
||||||
while (np != NULL) {
|
while (np != NULL) {
|
||||||
if (np->flags & CELL_TOP) {
|
if ((np->flags & CELL_TOP) && ((filenum == -1) ||
|
||||||
|
(np->file == filenum))) {
|
||||||
|
|
||||||
if (dolist)
|
if (dolist)
|
||||||
Tcl_ListObjAppendElement(interp, lobj,
|
Tcl_ListObjAppendElement(interp, lobj,
|
||||||
Tcl_NewStringObj(np->name, -1));
|
Tcl_NewStringObj(np->name, -1));
|
||||||
@@ -1483,11 +1505,13 @@ _netgen_cells(ClientData clientData,
|
|||||||
|
|
||||||
return TCL_OK;
|
return TCL_OK;
|
||||||
}
|
}
|
||||||
else if (strncmp(repstr, "-all", 4)) {
|
else {
|
||||||
result = CommonParseCell(interp, objv[1], &np, &filenum);
|
if (dolist)
|
||||||
if (result != TCL_OK) return result;
|
printopt = (doall) ? 3 : 2;
|
||||||
|
else
|
||||||
|
printopt = (doall) ? 1 : 0;
|
||||||
|
PrintCellHashTable(printopt, filenum);
|
||||||
}
|
}
|
||||||
PrintCellHashTable((dolist) ? 2 : 1, filenum);
|
|
||||||
}
|
}
|
||||||
return TCL_OK;
|
return TCL_OK;
|
||||||
}
|
}
|
||||||
@@ -1528,8 +1552,27 @@ _netgen_model(ClientData clientData,
|
|||||||
return TCL_ERROR;
|
return TCL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check for "model blackbox on|off" */
|
||||||
|
/* Behavior is to treat empty subcircuits as blackbox cells */
|
||||||
|
|
||||||
|
if ((objc > 1) && !strcmp(Tcl_GetString(objv[1]), "blackbox")) {
|
||||||
|
if ((objc > 2) && !strcmp(Tcl_GetString(objv[2]), "on")) {
|
||||||
|
auto_blackbox = TRUE;
|
||||||
|
return TCL_OK;
|
||||||
|
}
|
||||||
|
else if ((objc > 2) && !strcmp(Tcl_GetString(objv[2]), "off")) {
|
||||||
|
auto_blackbox = FALSE;
|
||||||
|
return TCL_OK;
|
||||||
|
}
|
||||||
|
else if (objc == 2) {
|
||||||
|
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(auto_blackbox));
|
||||||
|
return TCL_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
result = CommonParseCell(interp, objv[1], &tp, &fnum);
|
result = CommonParseCell(interp, objv[1], &tp, &fnum);
|
||||||
if (result != TCL_OK) return result;
|
if (result != TCL_OK)
|
||||||
|
return result;
|
||||||
|
|
||||||
if (objc == 3) {
|
if (objc == 3) {
|
||||||
model = Tcl_GetString(objv[2]);
|
model = Tcl_GetString(objv[2]);
|
||||||
@@ -1641,6 +1684,13 @@ _netgen_model(ClientData clientData,
|
|||||||
retclass = modelclasses[SUBCKT_IDX];
|
retclass = modelclasses[SUBCKT_IDX];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CLASS_MODULE:
|
||||||
|
if (auto_blackbox)
|
||||||
|
retclass = modelclasses[BLACKBOX_IDX];
|
||||||
|
else
|
||||||
|
retclass = modelclasses[MODULE_IDX];
|
||||||
|
break;
|
||||||
|
|
||||||
default: /* (includes case CLASS_UNDEF) */
|
default: /* (includes case CLASS_UNDEF) */
|
||||||
retclass = modelclasses[UNDEF_IDX];
|
retclass = modelclasses[UNDEF_IDX];
|
||||||
break;
|
break;
|
||||||
@@ -2678,10 +2728,10 @@ _netcmp_equate(ClientData clientData,
|
|||||||
};
|
};
|
||||||
int result, index;
|
int result, index;
|
||||||
char *name1 = NULL, *name2 = NULL, *optstart;
|
char *name1 = NULL, *name2 = NULL, *optstart;
|
||||||
struct nlist *tp1, *tp2;
|
struct nlist *tp1, *tp2, *SaveC1, *SaveC2;
|
||||||
struct objlist *ob1, *ob2;
|
struct objlist *ob1, *ob2;
|
||||||
int file1, file2;
|
int file1, file2;
|
||||||
int i, l1, l2, ltest, lent, dolist;
|
int i, l1, l2, ltest, lent, dolist = 0;
|
||||||
Tcl_Obj *tobj1, *tobj2, *tobj3;
|
Tcl_Obj *tobj1, *tobj2, *tobj3;
|
||||||
|
|
||||||
if (objc > 1) {
|
if (objc > 1) {
|
||||||
@@ -2849,7 +2899,7 @@ _netcmp_equate(ClientData clientData,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PINS_IDX:
|
case PINS_IDX:
|
||||||
if (ElementClasses == NULL) {
|
if ((ElementClasses == NULL) && (auto_blackbox == FALSE)) {
|
||||||
if (CurrentCell == NULL)
|
if (CurrentCell == NULL)
|
||||||
Fprintf(stderr, "Equate elements: no current cell.\n");
|
Fprintf(stderr, "Equate elements: no current cell.\n");
|
||||||
Fprintf(stderr, "Equate pins: cell %s and/or %s has no elements.\n",
|
Fprintf(stderr, "Equate pins: cell %s and/or %s has no elements.\n",
|
||||||
@@ -2857,20 +2907,41 @@ _netcmp_equate(ClientData clientData,
|
|||||||
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(0));
|
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(0));
|
||||||
return TCL_OK;
|
return TCL_OK;
|
||||||
}
|
}
|
||||||
if (tp1 == Circuit1 && tp2 == Circuit2) {
|
else if (ElementClasses == NULL) {
|
||||||
int result;
|
/* This has been called outside of a netlist compare, */
|
||||||
if (MatchPins(tp1, tp2, dolist)) {
|
/* probably to force name matching of pins on black-box */
|
||||||
Fprintf(stdout, "Cell pin lists are equivalent.\n");
|
/* devices. But MatchPins only works if tp1 == Circuit1 */
|
||||||
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(1));
|
/* and tp2 == Circuit2, so preserve these values and */
|
||||||
}
|
/* recover afterward (what a hack). */
|
||||||
else {
|
SaveC1 = Circuit1;
|
||||||
Fprintf(stdout, "Cell pin lists for %s and %s altered to match.\n",
|
SaveC2 = Circuit2;
|
||||||
name1, name2);
|
Circuit1 = tp1;
|
||||||
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(0));
|
Circuit2 = tp2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Fprintf(stderr, "Function not defined outside of LVS scope.\n");
|
Fprintf(stdout, "Cell pin lists for %s and %s altered to match.\n",
|
||||||
|
name1, name2);
|
||||||
|
}
|
||||||
|
Tcl_SetObjResult(interp, Tcl_NewIntObj(result));
|
||||||
|
if (ElementClasses == NULL) {
|
||||||
|
/* Recover temporarily set global variables (see above) */
|
||||||
|
Circuit1 = SaveC1;
|
||||||
|
Circuit2 = SaveC2;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -3093,8 +3164,12 @@ _netcmp_equate(ClientData clientData,
|
|||||||
/* netgen::property <device>|<model> <option> */
|
/* netgen::property <device>|<model> <option> */
|
||||||
/* yes|no */
|
/* yes|no */
|
||||||
/* Where <option> is one of: */
|
/* Where <option> is one of: */
|
||||||
/* serial --- allow/prohibit serial combination */
|
/* serial --- allow/prohibit serial combination */
|
||||||
/* parallel --- allow/prohibit parallel combination */
|
/* parallel --- allow/prohibit parallel combination */
|
||||||
|
/* or */
|
||||||
|
/* netgen::property parallel none */
|
||||||
|
/* --- prohibit parallel combinations by */
|
||||||
|
/* default. */
|
||||||
/* */
|
/* */
|
||||||
/* Formerly: (none) */
|
/* Formerly: (none) */
|
||||||
/* Results: */
|
/* Results: */
|
||||||
@@ -3188,6 +3263,22 @@ _netcmp_property(ClientData clientData,
|
|||||||
}
|
}
|
||||||
return TCL_OK;
|
return TCL_OK;
|
||||||
}
|
}
|
||||||
|
else if ((objc == 3) && (!strcmp(Tcl_GetString(objv[1]), "parallel"))) {
|
||||||
|
if (!strcmp(Tcl_GetString(objv[2]), "none")) {
|
||||||
|
GlobalParallelNone = TRUE;
|
||||||
|
SetParallelCombine(FALSE);
|
||||||
|
}
|
||||||
|
else if (!strcmp(Tcl_GetString(objv[2]), "all")) {
|
||||||
|
GlobalParallelNone = FALSE;
|
||||||
|
SetParallelCombine(TRUE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Tcl_SetResult(interp, "Bad option, should be property parallel none|all",
|
||||||
|
NONE);
|
||||||
|
return TCL_ERROR;
|
||||||
|
}
|
||||||
|
return TCL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
result = CommonParseCell(interp, objv[1], &tp, &fnum);
|
result = CommonParseCell(interp, objv[1], &tp, &fnum);
|
||||||
if (result != TCL_OK) return result;
|
if (result != TCL_OK) return result;
|
||||||
@@ -3999,7 +4090,7 @@ int Tclnetgen_Init(Tcl_Interp *interp)
|
|||||||
if (cadroot == NULL) cadroot = CAD_DIR;
|
if (cadroot == NULL) cadroot = CAD_DIR;
|
||||||
Tcl_SetVar(interp, "CAD_ROOT", cadroot, TCL_GLOBAL_ONLY);
|
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)
|
if ((consoleinterp = Tcl_GetMaster(interp)) == NULL)
|
||||||
consoleinterp = interp;
|
consoleinterp = interp;
|
||||||
|
|||||||
Reference in New Issue
Block a user