mirror of
https://github.com/RTimothyEdwards/netgen.git
synced 2026-08-22 14:07:07 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5f5248b3d0 | ||
|
|
80f9263004 | ||
|
|
edb50746cb | ||
|
|
f2368ca223 | ||
|
|
ee93d52a26 | ||
|
|
ba7004fd5b | ||
|
|
704bfbc871 | ||
|
|
7bee1851fa | ||
|
|
e4a4621b96 | ||
|
|
3ca77300ac | ||
|
|
236fba18aa | ||
|
|
1272ed22fe | ||
|
|
6179ba8cb8 | ||
|
|
aaf8fefc1a | ||
|
|
abaf896f7f | ||
|
|
e94d25b3f1 | ||
|
|
e659495ef5 | ||
|
|
2ce3cf8dd9 | ||
|
|
05f433f334 | ||
|
|
2129073a38 | ||
|
|
b0d980bb7d | ||
|
|
ab0165b16c | ||
|
|
5197eb6186 | ||
|
|
48ed1f7583 | ||
|
|
e63593c7e2 | ||
|
|
178af5f493 | ||
|
|
ac8956c32e | ||
|
|
b87f0fd5db | ||
|
|
21e9207924 | ||
|
|
8392721885 | ||
|
|
79bab50a79 | ||
|
|
b83800d69b | ||
|
|
93b9cf6577 | ||
|
|
bf53d52970 | ||
|
|
4250525e19 | ||
|
|
c1ed4ce49e | ||
|
|
ab327c5f82 | ||
|
|
2cb3937ee3 | ||
|
|
9b0afa893d | ||
|
|
c0f7ebd625 | ||
|
|
9e9288f746 | ||
|
|
bcbc736b51 | ||
|
|
f5f1240073 | ||
|
|
02d7a1bd01 | ||
|
|
7878b3cfbc | ||
|
|
7f727e6674 | ||
|
|
d111fa0a3b | ||
|
|
178b172c06 | ||
|
|
7870538ec9 | ||
|
|
ee4e1e087f | ||
|
|
7a8b5e835b | ||
|
|
77f7a773e3 | ||
|
|
9a48a59f68 | ||
|
|
535b8285e9 | ||
|
|
1e1d506697 | ||
|
|
4edaf0813d | ||
|
|
a4ae5ed989 | ||
|
|
d850586a14 | ||
|
|
4b5b117100 | ||
|
|
935e54abe6 | ||
|
|
49ccf1949a | ||
|
|
9b84776374 | ||
|
|
2af3f2a3f7 | ||
|
|
738abbdad9 | ||
|
|
8d7569e9a3 | ||
|
|
d9425163e1 | ||
|
|
9ba1dfe814 | ||
|
|
fadd0ae2fc | ||
|
|
153ce0e2b3 | ||
|
|
bfdacab28c | ||
|
|
7e9bd9f2a0 | ||
|
|
ee92d880d7 | ||
|
|
d3407b3e56 | ||
|
|
0a94bec191 | ||
|
|
4a7b6bf22a | ||
|
|
661c9ee854 | ||
|
|
5b21c1be3a | ||
|
|
e11dbac384 | ||
|
|
0535128421 | ||
|
|
afe0e9f758 | ||
|
|
e487890641 | ||
|
|
bb44d3f827 | ||
|
|
c25c4e1160 | ||
|
|
8ed4e3cf38 | ||
|
|
69838d79e4 | ||
|
|
fc7c9371e8 | ||
|
|
0d19868145 | ||
|
|
6b4eb01ee8 | ||
|
|
737b2a73bf | ||
|
|
6b8c6d1718 | ||
|
|
610eebb758 | ||
|
|
97058c5017 | ||
|
|
aa120460d0 | ||
|
|
ea5cbacf1c | ||
|
|
cdd768addc | ||
|
|
66cf2b82d9 | ||
|
|
bc4192496b | ||
|
|
168e5502a1 | ||
|
|
8d4b621b7d | ||
|
|
ba3e862552 | ||
|
|
cf6dd2a638 | ||
|
|
b6d896e73f | ||
|
|
9251ce2a48 | ||
|
|
aa82164c08 | ||
|
|
fb7876c7a6 | ||
|
|
e31caa3500 | ||
|
|
c1355bee45 | ||
|
|
4fb8b59a2f | ||
|
|
626faf22f9 | ||
|
|
550234dce5 | ||
|
|
a4c0028706 | ||
|
|
e7ae84bbc8 | ||
|
|
43c018f3bc | ||
|
|
ca119edc0a | ||
|
|
84348d2fe1 | ||
|
|
813b29cdc4 | ||
|
|
ccf4a0a900 | ||
|
|
e34166fdb9 | ||
|
|
a13491e358 | ||
|
|
1d05b8b676 | ||
|
|
e97d6f1aeb | ||
|
|
fb4759a8cd | ||
|
|
45d4004d43 | ||
|
|
0b014e6efd | ||
|
|
9ca713dfd9 | ||
|
|
851a1f941e | ||
|
|
fb798d6ce7 | ||
|
|
a888502038 | ||
|
|
c16258d4d1 | ||
|
|
5341d7a5fd | ||
|
|
8395df633c | ||
|
|
6554063df3 | ||
|
|
4416a380b3 | ||
|
|
46394b2000 | ||
|
|
3fe3bc4cfa | ||
|
|
6661910672 | ||
|
|
e7a36630f6 | ||
|
|
f32b0b34a3 | ||
|
|
6b731ddd7a | ||
|
|
99e35d8b11 | ||
|
|
65b542f0ab | ||
|
|
b826870be9 | ||
|
|
ed5276d67b | ||
|
|
69c9d85be7 | ||
|
|
ad05d059c7 | ||
|
|
1b2cd1497c | ||
|
|
d9d5a46c6e | ||
|
|
d73b711e3a | ||
|
|
1428580109 | ||
|
|
210dfb25c3 | ||
|
|
27f2ab8b3f | ||
|
|
1be00bbd99 | ||
|
|
03b241a5d4 | ||
|
|
43cebd1ef9 | ||
|
|
0490959b07 | ||
|
|
dc841f3293 | ||
|
|
05bcfede69 | ||
|
|
72ed78e55a | ||
|
|
59bb8a89c0 | ||
|
|
9bdaee652e | ||
|
|
9879b58f83 | ||
|
|
9e3b705fcc | ||
|
|
d2c9129242 | ||
|
|
942f421fa3 | ||
|
|
6bc948d8ba | ||
|
|
c1ad37f05a | ||
|
|
9edefe7d59 | ||
|
|
f6b9629521 | ||
|
|
7b2e01f2af | ||
|
|
224050f153 | ||
|
|
74e8c3e168 | ||
|
|
95a29fcd8c | ||
|
|
723a950fd3 | ||
|
|
e3368cb22a | ||
|
|
f06e6548bb | ||
|
|
72ed19ff36 | ||
|
|
39b8e3d14a | ||
|
|
b63dfa8638 | ||
|
|
f918f33c51 | ||
|
|
63b2e48ea1 | ||
|
|
6e63f49d53 | ||
|
|
419b6de29a | ||
|
|
205cf2aa58 | ||
|
|
52b6766fc8 | ||
|
|
7b0bdd29e8 | ||
|
|
433cbd090a | ||
|
|
3087bd3337 | ||
|
|
b79a29d662 | ||
|
|
bf9c61e412 | ||
|
|
8d34bd372d | ||
|
|
229c2931a8 | ||
|
|
b8da97deb1 | ||
|
|
b7187d5899 | ||
|
|
d27d441c58 | ||
|
|
48c9e6b292 | ||
|
|
ced5846da3 | ||
|
|
b99d33064f | ||
|
|
399472e940 |
+2
-3
@@ -22,7 +22,6 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <strings.h>
|
||||
#include <ctype.h>
|
||||
#ifdef IBMPC
|
||||
#include <stdlib.h> /* for strtol on PC */
|
||||
@@ -91,7 +90,7 @@ char *ActelName(char *Name)
|
||||
/* strip physical-pin information, if it exists */
|
||||
if ((nm = strrchr(name,PHYSICALPIN[0])) != NULL) *nm = '\0';
|
||||
if (strlen(name) > 13) {
|
||||
ActelIndex = (ActelIndex + 1) % ACTELNAMESIZE;
|
||||
ActelIndex = (++ActelIndex) % ACTELNAMESIZE;
|
||||
/* format the value of the hashed value of the string */
|
||||
sprintf(ActelNames[ActelIndex], "$%lX", ActelNameHash(name));
|
||||
if (Debug)
|
||||
@@ -102,7 +101,7 @@ Printf("ActelNameHash returns %s on name %s\n",ActelNames[ActelIndex], name);
|
||||
NeedsQuoting = 0;
|
||||
if (NULL != strpbrk(name, ".,:; \t\"'\n\r")) NeedsQuoting = 1;
|
||||
|
||||
ActelIndex = (ActelIndex + 1) % ACTELNAMESIZE;
|
||||
ActelIndex = (++ActelIndex) % ACTELNAMESIZE;
|
||||
if (!NeedsQuoting) {
|
||||
strcpy(ActelNames[ActelIndex], name);
|
||||
return(ActelNames[ActelIndex]);
|
||||
|
||||
+28
-82
@@ -300,6 +300,8 @@ int flattenInstancesOf(char *name, int fnum, char *instance)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/* Placeholder cells must not be flattened */
|
||||
if (ThisCell->flags & CELL_PLACEHOLDER) return 0;
|
||||
|
||||
FreeNodeNames(ThisCell);
|
||||
|
||||
@@ -337,10 +339,6 @@ int flattenInstancesOf(char *name, int fnum, char *instance)
|
||||
LastObj = ParentParams;
|
||||
continue;
|
||||
}
|
||||
if (ChildCell->flags & CELL_PLACEHOLDER) {
|
||||
LastObj = ParentParams;
|
||||
continue; // Placeholder cells must not be flattened
|
||||
}
|
||||
if (ChildCell == ThisCell) {
|
||||
LastObj = ParentParams;
|
||||
continue; // Avoid infinite loop
|
||||
@@ -1755,26 +1753,16 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s (%d)"
|
||||
" makes a better match\n", ecomp->cell1->name,
|
||||
name1, file1);
|
||||
if (flattenInstancesOf(name1, file1, ecomp->cell1->name) > 0)
|
||||
modified1++;
|
||||
}
|
||||
else if (ecomp->cell1 && (ecomp->num1 > 0)) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s (%d)"
|
||||
" would make a better match but is prohibited.\n",
|
||||
ecomp->cell1->name, name1, file1);
|
||||
flattenInstancesOf(name1, file1, ecomp->cell1->name);
|
||||
modified1++;
|
||||
}
|
||||
if (ecomp->cell2 && (ecomp->num2 > 0) &&
|
||||
(!(ecomp->cell2->flags & CELL_PLACEHOLDER))) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s (%d)"
|
||||
" makes a better match\n", ecomp->cell2->name,
|
||||
name2, file2);
|
||||
if (flattenInstancesOf(name2, file2, ecomp->cell2->name) > 0)
|
||||
modified2++;
|
||||
}
|
||||
else if (ecomp->cell2 && (ecomp->num2 > 0)) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s (%d)"
|
||||
" would make a better match but is prohibited.\n",
|
||||
ecomp->cell2->name, name2, file2);
|
||||
flattenInstancesOf(name2, file2, ecomp->cell2->name);
|
||||
modified2++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1863,13 +1851,8 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s (%d)"
|
||||
" makes a better match\n", ecomp->cell2->name,
|
||||
name2, file2);
|
||||
if (flattenInstancesOf(name2, file2, ecomp->cell2->name) > 0)
|
||||
modified2++;
|
||||
}
|
||||
else if (ecomp->cell2) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s (%d)"
|
||||
" would make a better match but is prohibited.\n",
|
||||
ecomp->cell2->name, name2, file2);
|
||||
flattenInstancesOf(name2, file2, ecomp->cell2->name);
|
||||
modified2++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1934,13 +1917,8 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s (%d)"
|
||||
" makes a better match\n", ecomp->cell1->name,
|
||||
name1, file1);
|
||||
if (flattenInstancesOf(name1, file1, ecomp->cell1->name) > 0)
|
||||
modified1++;
|
||||
}
|
||||
else if (ecomp->cell1) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s (%d)"
|
||||
" would make a better match but is prohibited.\n",
|
||||
ecomp->cell1->name, name1, file1);
|
||||
flattenInstancesOf(name1, file1, ecomp->cell1->name);
|
||||
modified1++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2018,11 +1996,8 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (found) break;
|
||||
}
|
||||
|
||||
if (found) {
|
||||
/* Beware remove shorting devices that */
|
||||
/* Do NOT remove shorting devices that */
|
||||
/* connect two ports. Otherwise the */
|
||||
/* port lists get screwed up. It is */
|
||||
/* better in that case to force the */
|
||||
@@ -2030,10 +2005,6 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
/* This is ignored for a top-level cell */
|
||||
/* because it will just show up as a */
|
||||
/* port mismatch error as it should. */
|
||||
/* (12/12/2025---disabling this worked; */
|
||||
/* may need to go back to a failing */
|
||||
/* example and determine how pin */
|
||||
/* matching gets scrambled.) */
|
||||
|
||||
if ((not_top == TRUE) &&
|
||||
(ecomp->cell1->class != CLASS_ISOURCE)) {
|
||||
@@ -2046,18 +2017,14 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
else if (ob2->node == node2)
|
||||
found2 = TRUE;
|
||||
if (found1 && found2) {
|
||||
Fprintf(stdout, "Warning: "
|
||||
"zero-valued device connects "
|
||||
"port %s to another port; pin "
|
||||
"matching may be affected.\n",
|
||||
ob2->name);
|
||||
// found = FALSE;
|
||||
found = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (found) break;
|
||||
}
|
||||
if (found) {
|
||||
Fprintf(stdout, "Removing zero-valued device "
|
||||
"%s from cell %s (%d) makes a better "
|
||||
@@ -2304,24 +2271,13 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
ecompX0->cell1->file, &compdict);
|
||||
if (dstr) *dstr = '[';
|
||||
if ((ncomp == ecomp0X) && (ecomp0X->num2 <= ecompX0->num1)) {
|
||||
if (!(ecompX0->cell1->flags & CELL_PLACEHOLDER)) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell"
|
||||
" %s (%d) makes a better match\n",
|
||||
ecompX0->cell1->name, name1, file1);
|
||||
if (flattenInstancesOf(name1, file1,
|
||||
ecompX0->cell1->name) > 0) {
|
||||
ecompX0->num1 = 0;
|
||||
ecomp0X->num1 += ecompX0->num1;
|
||||
modified1++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Fprintf(stdout, "Flattening instances of %s in "
|
||||
"cell %s (%d) would make a better "
|
||||
"match but is prohibited.\n",
|
||||
ecompX0->cell1->name, name1, file1);
|
||||
}
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s"
|
||||
"(%d) makes a better match\n",
|
||||
ecompX0->cell1->name, name1, file1);
|
||||
flattenInstancesOf(name1, file1, ecompX0->cell1->name);
|
||||
ecompX0->num1 = 0;
|
||||
ecomp0X->num1 += ecompX0->num1;
|
||||
modified1++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -2341,23 +2297,13 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
ecomp0X->cell2->file, &compdict);
|
||||
if (dstr) *dstr = '[';
|
||||
if ((ncomp == ecompX0) && (ecompX0->num1 <= ecomp0X->num2)) {
|
||||
if (!(ecomp0X->cell2->flags & CELL_PLACEHOLDER)) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell"
|
||||
" %s (%d) makes a better match\n",
|
||||
ecomp0X->cell2->name, name2, file2);
|
||||
if (flattenInstancesOf(name2, file2,
|
||||
ecomp0X->cell2->name) > 0) {
|
||||
ecomp0X->num2 = 0;
|
||||
ecompX0->num2 += ecomp0X->num2;
|
||||
modified2++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
Fprintf(stdout, "Flattening instances of %s in "
|
||||
"cell %s (%d) would make a better "
|
||||
"match but is prohibited.\n",
|
||||
ecompX0->cell2->name, name2, file2);
|
||||
}
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s"
|
||||
" (%d) makes a better match\n",
|
||||
ecomp0X->cell2->name, name2, file2);
|
||||
flattenInstancesOf(name2, file2, ecomp0X->cell2->name);
|
||||
ecomp0X->num2 = 0;
|
||||
ecompX0->num2 += ecomp0X->num2;
|
||||
modified2++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
+13
-20
@@ -137,39 +137,32 @@ static unsigned char uppercase[] = {
|
||||
// horrible things can happen, as, for example, names AOI12 and OAI12
|
||||
// have exactly the same hash result. Lousy for binning and even
|
||||
// lousier for generating class magic numbers.
|
||||
//
|
||||
// Updated again 4/2/2026 to the FNV-1a hash, which is better than
|
||||
// SDBM for this application, according to ChatGPT.
|
||||
|
||||
unsigned long hashnocase(char *s, int hashsize)
|
||||
{
|
||||
unsigned long hashval = 2166136261ul;
|
||||
for (; *s != '\0'; s++) {
|
||||
hashval ^= uppercase[*s];
|
||||
hashval *= 16777619ul;
|
||||
}
|
||||
unsigned long hashval;
|
||||
|
||||
for (hashval = 0; *s != '\0'; )
|
||||
hashval = uppercase[*s++]
|
||||
+ (hashval << 6) + (hashval << 16) - hashval;
|
||||
return (hashsize == 0) ? hashval : (hashval % hashsize);
|
||||
}
|
||||
|
||||
unsigned long hashcase(char *s, int hashsize)
|
||||
{
|
||||
unsigned long hashval = 2166136261ul;
|
||||
for (; *s != '\0'; s++) {
|
||||
hashval ^= (unsigned char)(*s);
|
||||
hashval *= 16777619ul;
|
||||
}
|
||||
unsigned long hashval;
|
||||
|
||||
for (hashval = 0; *s != '\0'; )
|
||||
hashval = (*s++) + (hashval << 6) + (hashval << 16) - hashval;
|
||||
return (hashsize == 0) ? hashval : (hashval % hashsize);
|
||||
}
|
||||
|
||||
unsigned long genhash(char *s, int c, int hashsize)
|
||||
{
|
||||
unsigned long hashval = 2166136261ul;
|
||||
hashval ^= (unsigned long)c;
|
||||
hashval *= 16777619ul;
|
||||
for (; *s != '\0'; s++) {
|
||||
hashval ^= (unsigned char)(*s);
|
||||
hashval *= 16777619ul;
|
||||
}
|
||||
unsigned long hashval;
|
||||
|
||||
for (hashval = (unsigned long)c; *s != '\0'; )
|
||||
hashval = (*s++) + (hashval << 6) + (hashval << 16) - hashval;
|
||||
return (hashsize == 0) ? hashval : (hashval % hashsize);
|
||||
}
|
||||
|
||||
|
||||
+38
-170
@@ -24,7 +24,6 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
#include <stdarg.h>
|
||||
#include <setjmp.h>
|
||||
#include <signal.h>
|
||||
#include <strings.h> /* for strncasecmp() */
|
||||
#include <time.h> /* for time() as a seed for random number generator */
|
||||
#include <limits.h>
|
||||
#include <math.h> /* for fabs() */
|
||||
@@ -52,7 +51,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifdef TCL_NETGEN
|
||||
int InterruptPending = 0;
|
||||
void (*oldinthandler)(int) = SIG_DFL;
|
||||
void (*oldinthandler)() = SIG_DFL;
|
||||
extern Tcl_Interp *netgeninterp;
|
||||
extern int check_interrupt();
|
||||
#endif
|
||||
@@ -1622,8 +1621,8 @@ void FormatIllegalElementClasses()
|
||||
char *permcount;
|
||||
int bytesleft;
|
||||
|
||||
permname = CALLOC(right_col_end + 100, sizeof(char));
|
||||
permcount = CALLOC(right_col_end + 100, sizeof(char));
|
||||
permname = CALLOC(right_col_end + 2, sizeof(char));
|
||||
permcount = CALLOC(right_col_end + 2, sizeof(char));
|
||||
ostr = output_string_init();
|
||||
|
||||
found = 0;
|
||||
@@ -3582,7 +3581,7 @@ int FlattenUnmatched(struct nlist *tc, char *parent, int stoplevel, int loclevel
|
||||
tc->name, parent, tc->file);
|
||||
changed = flattenInstancesOf(parent, tc->file, tc->name);
|
||||
Fprintf(stdout, "(%d instance%s)\n", changed, ((changed == 1) ? "" : "s"));
|
||||
return (changed != 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (tc->cell == NULL) return 0;
|
||||
@@ -5219,23 +5218,14 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int series,
|
||||
|
||||
if (comb == TRUE) {
|
||||
double pd;
|
||||
int hascrit = FALSE;
|
||||
int mult, cidx = -1;
|
||||
struct valuelist **avl, **cvl;
|
||||
struct valuelist *cvlp;
|
||||
|
||||
struct valuelist *avl, *cvl = NULL;
|
||||
critval.type = PROP_ENDLIST;
|
||||
critval.value.dval = 0.0;
|
||||
|
||||
/* Track properties separately so that multiple properties can be
|
||||
* added together (e.g., area and perimeter)
|
||||
*/
|
||||
avl = (struct valuelist **)CALLOC(pcount, sizeof(struct valuelist *));
|
||||
cvl = (struct valuelist **)CALLOC(pcount, sizeof(struct valuelist *));
|
||||
|
||||
for (i = 0; i < run; i++) {
|
||||
for (p = 0; p < pcount; p++) avl[p] = NULL;
|
||||
|
||||
avl = NULL;
|
||||
// if (vlist[0][i] == NULL) continue;
|
||||
// mult = vlist[0][i]->value.ival;
|
||||
if (vlist[0][i] == NULL)
|
||||
mult = 1;
|
||||
else
|
||||
@@ -5252,7 +5242,6 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int series,
|
||||
|
||||
/* critical properties never combine, but track them */
|
||||
if ((series == TRUE) && (ctype & MERGE_S_CRIT)) {
|
||||
hascrit = TRUE;
|
||||
pd = 2 * fabs(vl->value.dval - critval.value.dval) /
|
||||
(vl->value.dval + critval.value.dval);
|
||||
if ((vl->type != critval.type) || (pd > kl->slop.dval))
|
||||
@@ -5264,7 +5253,6 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int series,
|
||||
continue;
|
||||
}
|
||||
if ((series == FALSE) && (ctype & MERGE_P_CRIT)) {
|
||||
hascrit = TRUE;
|
||||
pd = 2 * fabs(vl->value.dval - critval.value.dval) /
|
||||
(vl->value.dval + critval.value.dval);
|
||||
if ((vl->type != critval.type) || (pd > kl->slop.dval))
|
||||
@@ -5298,30 +5286,19 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int series,
|
||||
}
|
||||
}
|
||||
if (ctype & (MERGE_S_ADD | MERGE_P_ADD | MERGE_S_PAR | MERGE_P_PAR))
|
||||
avl[p] = vl;
|
||||
avl = vl;
|
||||
}
|
||||
if (hascrit == FALSE) cidx = 0; /* No critical property */
|
||||
|
||||
/* Each time a new critical value is found, set the location */
|
||||
/* of the property record that will collect the summation or */
|
||||
/* parallel combination of values. */
|
||||
if (cidx == i) {
|
||||
for (p = 1; p < pcount; p++) {
|
||||
cvl[p] = avl[p];
|
||||
}
|
||||
}
|
||||
if (cidx == i) cvl = avl;
|
||||
|
||||
/* Sorting should have put all records with the same critical */
|
||||
/* value together sequentially. So if there are still */
|
||||
/* multiple property records, then merge them into the first */
|
||||
/* record with the same critical property value. If no */
|
||||
/* critical value exists, then all records can be merged. */
|
||||
/* record with the same critical property value. */
|
||||
|
||||
if ((i > 0) && (cidx >= 0) && (cidx < i)) {
|
||||
for (p = 1; p < pcount; p++) {
|
||||
vl = vlist[p][i];
|
||||
ctype = clist[p][i];
|
||||
cvlp = cvl[p];
|
||||
|
||||
if (ctype & (MERGE_S_ADD | MERGE_P_ADD)) {
|
||||
if (!vlist[0][i]) {
|
||||
@@ -5330,21 +5307,21 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int series,
|
||||
sizeof(struct valuelist));
|
||||
}
|
||||
vlist[0][i]->value.ival = 0; /* set M to 0 */
|
||||
if (cvlp && (cvlp->type == PROP_INTEGER))
|
||||
if (cvl && (cvl->type == PROP_INTEGER))
|
||||
{
|
||||
if (vl->type == PROP_INTEGER)
|
||||
cvlp->value.ival += vl->value.ival;
|
||||
cvl->value.ival += vl->value.ival;
|
||||
else {
|
||||
cvlp->type = PROP_DOUBLE;
|
||||
cvlp->value.dval = (double)cvlp->value.ival + vl->value.dval;
|
||||
cvl->type = PROP_DOUBLE;
|
||||
cvl->value.dval = (double)cvl->value.ival + vl->value.dval;
|
||||
}
|
||||
}
|
||||
else if ((cvlp && vl->type == PROP_DOUBLE))
|
||||
else if ((cvl && vl->type == PROP_DOUBLE))
|
||||
{
|
||||
if (vl->type == PROP_INTEGER)
|
||||
cvlp->value.dval += (double)vl->value.ival;
|
||||
cvl->value.dval += (double)vl->value.ival;
|
||||
else
|
||||
cvlp->value.dval += vl->value.dval;
|
||||
cvl->value.dval += vl->value.dval;
|
||||
}
|
||||
}
|
||||
else if (ctype & (MERGE_S_PAR | MERGE_P_PAR)) {
|
||||
@@ -5354,22 +5331,21 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int series,
|
||||
sizeof(struct valuelist));
|
||||
}
|
||||
vlist[0][i]->value.ival = 0; /* set M to 0 */
|
||||
/* Parallel value combination: (X * Y) / (X + Y)
|
||||
* To do parallel combination, both types need to
|
||||
/* To do parallel combination, both types need to
|
||||
* be double, so recast them if they are integer.
|
||||
*/
|
||||
if (vl->type == PROP_INTEGER) {
|
||||
vl->type = PROP_DOUBLE;
|
||||
vl->value.dval = (double)(vl->value.ival);
|
||||
}
|
||||
if (cvlp && (cvlp->type == PROP_INTEGER)) {
|
||||
cvlp->type = PROP_DOUBLE;
|
||||
cvlp->value.dval = (double)cvlp->value.ival;
|
||||
if (cvl && (cvl->type == PROP_INTEGER)) {
|
||||
cvl->type = PROP_DOUBLE;
|
||||
cvl->value.dval = (double)cvl->value.ival;
|
||||
}
|
||||
if ((cvlp && (vl->type == PROP_DOUBLE))) {
|
||||
cvlp->value.dval =
|
||||
(vl->value.dval * cvlp->value.dval) /
|
||||
(vl->value.dval + cvlp->value.dval);
|
||||
if ((cvl && (vl->type == PROP_DOUBLE))) {
|
||||
cvl->value.dval =
|
||||
sqrt(cvl->value.dval * cvl->value.dval
|
||||
+ vl->value.dval * vl->value.dval);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5381,9 +5357,6 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int series,
|
||||
Printf("Combined %d parallel devices.\n", changed);
|
||||
}
|
||||
}
|
||||
|
||||
FREE(avl);
|
||||
FREE(cvl);
|
||||
}
|
||||
|
||||
// Remove entries with M (S) = 0
|
||||
@@ -7544,11 +7517,6 @@ struct nlist *addproxies(struct hashlist *p, void *clientdata)
|
||||
}
|
||||
else {
|
||||
lob = ob;
|
||||
if (ob == NULL) {
|
||||
Fprintf(stdout, "Error: Premature end of pin list on "
|
||||
"instance %s.\n", firstpin->instance.name);
|
||||
break;
|
||||
}
|
||||
ob->type = i++;
|
||||
ob = ob->next;
|
||||
}
|
||||
@@ -7633,7 +7601,6 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
||||
int hasproxy1 = 0, hasproxy2 = 0;
|
||||
int needclean1 = 0, needclean2 = 0;
|
||||
int nomatch = 0;
|
||||
int P1, P2;
|
||||
int filenum = -1;
|
||||
int *correspond;
|
||||
char *ostr;
|
||||
@@ -7666,7 +7633,6 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
||||
return 2;
|
||||
}
|
||||
|
||||
correspond = (int *)CALLOC((tc1->nodename_cache_maxnodenum + 1), sizeof(int));
|
||||
cover = (char *)CALLOC(numnodes, sizeof(char));
|
||||
numorig = numnodes;
|
||||
|
||||
@@ -7885,6 +7851,8 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
||||
|
||||
ob1 = tc1->cell;
|
||||
|
||||
correspond = (int *)CALLOC((tc1->nodename_cache_maxnodenum + 1), sizeof(int));
|
||||
|
||||
for (i = 0; i < numorig; i++) {
|
||||
bangptr1 = strrchr(ob1->name, '!');
|
||||
if (bangptr1 && (*(bangptr1 + 1) == '\0'))
|
||||
@@ -7896,8 +7864,7 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
||||
if (*(cover + i) == (char)0) {
|
||||
j = 0;
|
||||
for (ob2 = tc2->cell; ob2 != NULL; ob2 = ob2->next) {
|
||||
char *name1, *name2, *aptr1 = NULL, *aptr2 = NULL;
|
||||
char delim1, delim2;
|
||||
char *name1, *name2;
|
||||
|
||||
if (!IsPort(ob2)) break;
|
||||
|
||||
@@ -7915,59 +7882,8 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
||||
if (!strncmp(name1, "proxy", 5) && (ob2->node == -1)) name1 +=5;
|
||||
if (!strncmp(name2, "proxy", 5) && (ob1->node == -1)) name2 +=5;
|
||||
|
||||
/* Recognize an array as matching a non-array of the same */
|
||||
/* name if the array is size 1. There must be a better way */
|
||||
/* to do this; this method makes excessive calls to */
|
||||
/* matchfunc(). */
|
||||
|
||||
if ((tc1->flags & CELL_PLACEHOLDER) || (tc2->flags && CELL_PLACEHOLDER)) {
|
||||
aptr1 = get_array_delimiter(name1, &delim1);
|
||||
aptr2 = get_array_delimiter(name2, &delim2);
|
||||
|
||||
if ((aptr1 != NULL) && (aptr2 == NULL)) {
|
||||
*aptr1 = '\0';
|
||||
if ((*matchfunc)(name1, name2)) {
|
||||
/* Check that name1 does not have another array
|
||||
* component in ob1
|
||||
*/
|
||||
struct objlist *ob3;
|
||||
for (ob3 = tc1->cell; ob3; ob3 = ob3->next) {
|
||||
if (!IsPort(ob3)) break;
|
||||
if (ob3 == ob1) continue;
|
||||
if (!strncmp(ob3->name, name1, strlen(name1)) &&
|
||||
is_delimiter(*(ob3->name + strlen(name1)))) {
|
||||
*aptr1 = delim1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((aptr1 == NULL) && (aptr2 != NULL)) {
|
||||
*aptr2 = '\0';
|
||||
if ((*matchfunc)(name1, name2)) {
|
||||
/* Check that name2 does not have another array
|
||||
* component in ob1
|
||||
*/
|
||||
struct objlist *ob3;
|
||||
for (ob3 = tc2->cell; ob3; ob3 = ob3->next) {
|
||||
if (!IsPort(ob3)) break;
|
||||
if (ob3 == ob2) continue;
|
||||
if (!strncmp(ob3->name, name2, strlen(name2)) &&
|
||||
is_delimiter(*(ob3->name + strlen(name2)))) {
|
||||
*aptr2 = delim2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((*matchfunc)(name1, name2)) {
|
||||
|
||||
if (aptr1) *aptr1 = delim1;
|
||||
if (aptr2) *aptr2 = delim2;
|
||||
|
||||
/* If both sides have unconnected nodes, then pins with */
|
||||
/* matching names are an automatic match. Otherwise, if */
|
||||
/* matching black-box entries, then pins are always */
|
||||
@@ -8057,7 +7973,7 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
||||
if (bangptr2) *bangptr2 = '!';
|
||||
break;
|
||||
}
|
||||
else if (IsPort(ob1) && IsPort(ob2)) {
|
||||
else {
|
||||
struct Permutation *permute1, *permute2;
|
||||
struct objlist *ob1a = NULL, *ob2a = NULL;
|
||||
|
||||
@@ -8067,28 +7983,30 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
||||
*/
|
||||
for (permute1 = tc1->permutes; permute1; permute1 = permute1->next) {
|
||||
if ((*matchfunc)(ob1->name, permute1->pin1)) {
|
||||
ob2a = LookupObject(permute1->pin2, tc2);
|
||||
ob1a = LookupObject(permute1->pin1, tc1);
|
||||
break;
|
||||
}
|
||||
else if ((*matchfunc)(ob1->name, permute1->pin2)) {
|
||||
ob2a = LookupObject(permute1->pin1, tc2);
|
||||
ob1a = LookupObject(permute1->pin2, tc1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (permute2 = tc2->permutes; permute2; permute2 = permute2->next) {
|
||||
if ((*matchfunc)(ob2->name, permute2->pin1)) {
|
||||
ob1a = LookupObject(permute2->pin2, tc1);
|
||||
ob2a = LookupObject(permute2->pin1, tc2);
|
||||
break;
|
||||
}
|
||||
else if ((*matchfunc)(ob2->name, permute2->pin2)) {
|
||||
ob1a = LookupObject(permute2->pin1, tc1);
|
||||
ob2a = LookupObject(permute2->pin2, tc2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (ob1a && ob2a) {
|
||||
if ((ob1->node == ob1a->node) && (ob2->node == ob2a->node)) {
|
||||
if ((correspond[ob1->node] == 0) ||
|
||||
(correspond[ob1->node] == ob2->node)) {
|
||||
/* This should be enough to prove equivalency */
|
||||
if ((correspond[ob1->node] == 0) || (correspond[ob1->node] == ob2->node)) {
|
||||
|
||||
correspond[ob1->node] = ob2->node; /* remember corresponding node */
|
||||
ob2->model.port = i; /* save order */
|
||||
*(cover + i) = (char)1;
|
||||
|
||||
@@ -8121,8 +8039,6 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
||||
}
|
||||
}
|
||||
if (bangptr2) *bangptr2 = '!';
|
||||
if (aptr1) *aptr1 = delim1;
|
||||
if (aptr2) *aptr2 = delim2;
|
||||
j++;
|
||||
}
|
||||
}
|
||||
@@ -8256,14 +8172,6 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
||||
hasproxy1 = 1;
|
||||
|
||||
HashPtrInstall(obn->name, obn, &(tc1->objdict));
|
||||
|
||||
/* If this is a black-box circuit, then the pin has not been output */
|
||||
if (NodeClasses == NULL) {
|
||||
output_string_fill(ostr);
|
||||
output_string_left(ostr, "%s", "(no matching pin)");
|
||||
output_string_right(ostr, "%s", ob2->name);
|
||||
output_string_print(ostr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8334,14 +8242,6 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
||||
hasproxy2 = 1;
|
||||
|
||||
HashPtrInstall(obn->name, obn, &(tc2->objdict));
|
||||
|
||||
/* If this is a black-box circuit, then the pin has not been output */
|
||||
if (NodeClasses == NULL) {
|
||||
output_string_fill(ostr);
|
||||
output_string_left(ostr, "%s", ob1->name);
|
||||
output_string_right(ostr, "%s", "(no matching pin)");
|
||||
output_string_print(ostr);
|
||||
}
|
||||
}
|
||||
|
||||
else if (ob1 != NULL && ob1->type == PORT && ob1->node < 0) {
|
||||
@@ -8369,38 +8269,6 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
||||
if (Debug == 0)
|
||||
output_string_print_divider(ostr, FALSE);
|
||||
|
||||
/* Catch errors where disconnected ports get effectively hidden by */
|
||||
/* pin permutations. */
|
||||
|
||||
if (result == 1) {
|
||||
int found = 0;
|
||||
for (NC = NodeClasses; NC != NULL; NC = NC->next) {
|
||||
P1 = P2 = 0;
|
||||
for (N1 = NC->nodes; N1 != NULL; N1 = N1->next) {
|
||||
if (N1->graph == Circuit2->file)
|
||||
if (IsPort(N1->object)) P2++;
|
||||
if (N1->graph == Circuit1->file)
|
||||
if (IsPort(N1->object)) P1++;
|
||||
}
|
||||
if (P1 != P2) {
|
||||
if (found == 0)
|
||||
Fprintf(stdout, "\nPort connection errors found:\n");
|
||||
found = 1;
|
||||
for (N1 = NC->nodes; N1 != NULL; N1 = N1->next) {
|
||||
obn = N1->object;
|
||||
|
||||
if (IsPort(obn))
|
||||
Fprintf(stdout, " %s (%d)\n", obn->name, N1->graph);
|
||||
else
|
||||
Fprintf(stdout, " %s (%d) (no port)\n", obn->name, N1->graph);
|
||||
if (N1->graph == Circuit1->file)
|
||||
correspond[obn->node] = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (found == 1) Fprintf(stdout, "\n");
|
||||
}
|
||||
|
||||
/* Run cleanuppins on circuit 1 */
|
||||
if (needclean1)
|
||||
CleanupPins(tc1->name, tc1->file);
|
||||
|
||||
+1
-3
@@ -302,7 +302,7 @@ int GetNextLineNoNewline(char *delimiter)
|
||||
{
|
||||
char *newbuf;
|
||||
int testc;
|
||||
static int nested = 0;
|
||||
int nested = 0;
|
||||
int llen;
|
||||
|
||||
if (feof(infile)) return -1;
|
||||
@@ -685,7 +685,6 @@ void SpiceSkipNewLine(void)
|
||||
ungetc(contline, infile);
|
||||
}
|
||||
|
||||
#if 0 /* Commented with "#if 0" due to comment characters in the comment */
|
||||
/*----------------------------------------------------------------------*/
|
||||
/* Function similar to strtok() for token parsing. The difference is */
|
||||
/* that it takes two sets of delimiters. The first is whitespace */
|
||||
@@ -706,7 +705,6 @@ void SpiceSkipNewLine(void)
|
||||
/* the first character of the delimiter string in addition to marking */
|
||||
/* the boundary between two-character and one-character delimiters. */
|
||||
/*----------------------------------------------------------------------*/
|
||||
#endif
|
||||
|
||||
char *strdtok0(char *pstring, char *delim1, char *delim2, char isverilog)
|
||||
{
|
||||
|
||||
@@ -25,8 +25,6 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h> /* for strtof() */
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
#include <ctype.h> /* toupper() */
|
||||
#ifdef IBMPC
|
||||
#include <alloc.h>
|
||||
|
||||
+1
-32
@@ -282,33 +282,6 @@ int matchfilenocase(char *st1, char *st2, int f1, int f2)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Delimiter matching---Find an opening delimiter in a string. */
|
||||
/* Return the position of the first opening delimeter in the string, */
|
||||
/* like strchr(). Place the actual delimeter character in *delim. */
|
||||
|
||||
char *get_array_delimiter(char *name, char *delim)
|
||||
{
|
||||
char *stest = name;
|
||||
|
||||
while (*stest != '\0')
|
||||
{
|
||||
if (to_lower[*stest] == '<') {
|
||||
*delim = *stest;
|
||||
return stest;
|
||||
}
|
||||
stest++;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Delimiter parsing---Check if a character is an opening array delimiter. */
|
||||
/* Return TRUE if the character is an opening delimiter, FALSE if not. */
|
||||
|
||||
int is_delimiter(char testc)
|
||||
{
|
||||
return (to_lower[testc] == '<') ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
#ifdef HAVE_MALLINFO
|
||||
void PrintMemoryStats(void)
|
||||
{
|
||||
@@ -476,7 +449,6 @@ int removeshorted(struct hashlist *p, int file)
|
||||
ob = nob;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Remove shorted instances of class "class" from the database */
|
||||
@@ -567,7 +539,6 @@ int deleteclass(struct hashlist *p, int file)
|
||||
}
|
||||
}
|
||||
FREE(checknodes);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Remove all instances of class "class" from the database */
|
||||
@@ -605,7 +576,6 @@ int renameinstances(struct hashlist *p, int file)
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void InstanceRename(char *from, char *to, int file)
|
||||
@@ -628,10 +598,9 @@ int freeprop(struct hashlist *p)
|
||||
struct property *prop;
|
||||
|
||||
prop = (struct property *)(p->ptr);
|
||||
if (prop->type == PROP_STRING) {
|
||||
if (prop->type == PROP_STRING)
|
||||
if (prop->pdefault.string != NULL)
|
||||
FREE(prop->pdefault.string);
|
||||
}
|
||||
else if (prop->type == PROP_EXPRESSION) {
|
||||
struct tokstack *stackptr, *nptr;
|
||||
stackptr = prop->pdefault.stack;
|
||||
|
||||
@@ -309,8 +309,6 @@ extern int match(char *, char *);
|
||||
extern int matchnocase(char *, char *);
|
||||
extern int matchfile(char *, char *, int, int);
|
||||
extern int matchfilenocase(char *, char *, int, int);
|
||||
extern int is_delimiter(char);
|
||||
extern char *get_array_delimiter(char *, char *);
|
||||
|
||||
extern void GarbageCollect(void);
|
||||
extern void InitGarbageCollection(void);
|
||||
|
||||
+2
-3
@@ -319,7 +319,7 @@ void Fanout(char *cell, char *node, int filter)
|
||||
while (ob != NULL) {
|
||||
char *obname = ob->name;
|
||||
if (*obname == '/') obname++;
|
||||
if (ob->node == nodenum) {
|
||||
if (ob->node == nodenum)
|
||||
if (filter == ALLOBJECTS) {
|
||||
Printf(" %s (", obname);
|
||||
PrintObjectType(ob->type);
|
||||
@@ -331,7 +331,6 @@ void Fanout(char *cell, char *node, int filter)
|
||||
else if (ob->type == filter) {
|
||||
Printf(" %s\n", obname);
|
||||
}
|
||||
}
|
||||
ob = ob->next;
|
||||
}
|
||||
}
|
||||
@@ -934,7 +933,7 @@ static int PrintLeavesInCellHash(struct hashlist *p)
|
||||
struct nlist *ptr;
|
||||
|
||||
ptr = (struct nlist *)(p->ptr);
|
||||
if (ptr->class == CLASS_SUBCKT) PrintLeavesInCell(ptr->name, ptr->file);
|
||||
if ((ptr->class == CLASS_SUBCKT)) PrintLeavesInCell(ptr->name, ptr->file);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
+9
-31
@@ -21,9 +21,6 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
#include <ctype.h>
|
||||
#if 0
|
||||
#include <stdarg.h> /* what about varargs, like in pdutils.c ??? */
|
||||
#endif
|
||||
@@ -196,7 +193,7 @@ void SpiceSubCell(struct nlist *tp, int IsSubCell)
|
||||
if (ob->type == PROPERTY) {
|
||||
struct valuelist *vl;
|
||||
int i;
|
||||
for (i = 0;; i++) {
|
||||
for (i == 0;; i++) {
|
||||
vl = &(ob->instance.props[i]);
|
||||
if (vl->type == PROP_ENDLIST) break;
|
||||
else if (vl->type == PROP_VALUE) {
|
||||
@@ -216,7 +213,7 @@ void SpiceSubCell(struct nlist *tp, int IsSubCell)
|
||||
if (ob->type == PROPERTY) {
|
||||
struct valuelist *vl;
|
||||
int i;
|
||||
for (i = 0;; i++) {
|
||||
for (i == 0;; i++) {
|
||||
vl = &(ob->instance.props[i]);
|
||||
if (vl->type == PROP_ENDLIST) break;
|
||||
else if (vl->type == PROP_VALUE) {
|
||||
@@ -236,7 +233,7 @@ void SpiceSubCell(struct nlist *tp, int IsSubCell)
|
||||
if (ob->type == PROPERTY) {
|
||||
struct valuelist *vl;
|
||||
int i;
|
||||
for (i = 0;; i++) {
|
||||
for (i == 0;; i++) {
|
||||
vl = &(ob->instance.props[i]);
|
||||
if (vl->type == PROP_ENDLIST) break;
|
||||
else if (vl->type == PROP_VALUE) {
|
||||
@@ -399,7 +396,7 @@ int renamepins(struct hashlist *p, int file)
|
||||
ptr = (struct nlist *)(p->ptr);
|
||||
|
||||
if (ptr->file != file)
|
||||
return 0;
|
||||
return 1;
|
||||
|
||||
for (ob = ptr->cell; ob != NULL; ob = ob->next) {
|
||||
if (ob->type == FIRSTPIN) {
|
||||
@@ -426,7 +423,6 @@ int renamepins(struct hashlist *p, int file)
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* If any pins are marked unconnected, see if there are */
|
||||
@@ -536,14 +532,8 @@ void ReadSpiceFile(char *fname, int filenum, struct cellstack **CellStackPtr,
|
||||
|
||||
SkipTok(NULL); /* get the next token */
|
||||
if ((EndParseFile()) && (nexttok == NULL)) break;
|
||||
if (nexttok == NULL) break;
|
||||
|
||||
/* Handle comment lines. Note that some variants of CDL format
|
||||
* use "*." for information that is transparent to SPICE simulators.
|
||||
* Handle "*.GLOBAL" entries. All others are ignored.
|
||||
*/
|
||||
if ((nexttok[0] == '*') && (!matchnocase(nexttok, "*.GLOBAL")))
|
||||
SkipNewLine(NULL);
|
||||
if (nexttok[0] == '*') SkipNewLine(NULL);
|
||||
|
||||
else if (matchnocase(nexttok, ".SUBCKT")) {
|
||||
SpiceTokNoNewline();
|
||||
@@ -831,10 +821,7 @@ skip_ends:
|
||||
|
||||
// Handle some commonly-used cards
|
||||
|
||||
/* .GLOBAL and *.GLOBAL. Note that *.GLOBAL is excepted from comment-line
|
||||
* handling, above, so any line starting with '*' is "*.GLOBAL".
|
||||
*/
|
||||
else if (matchnocase(nexttok, ".GLOBAL") || (nexttok[0] == '*')) {
|
||||
else if (matchnocase(nexttok, ".GLOBAL")) {
|
||||
while (nexttok != NULL) {
|
||||
int numnodes = 0;
|
||||
SpiceTokNoNewline();
|
||||
@@ -1783,19 +1770,10 @@ skip_ends:
|
||||
if (scan->next != NULL) scan = scan->next;
|
||||
tail->next = NULL;
|
||||
|
||||
/* Check for class defined inside itself (self-referential loop) */
|
||||
|
||||
if (!strcasecmp(model, scan->name)) {
|
||||
Fprintf(stderr, "Fatal: Class \"%s\" is instanced inside of itself!\n",
|
||||
scan->name);
|
||||
InputParseError(stderr);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Check for ignored class */
|
||||
|
||||
if ((itype = IsIgnored(scan->name, filenum)) == IGNORE_CLASS) {
|
||||
Printf("Class '%s' instanced in input but is being ignored.\n", scan->name);
|
||||
if ((itype = IsIgnored(subcktname, filenum)) == IGNORE_CLASS) {
|
||||
Printf("Class '%s' instanced in input but is being ignored.\n", model);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1810,7 +1788,7 @@ skip_ends:
|
||||
break;
|
||||
}
|
||||
if (shorted == (unsigned char)1) {
|
||||
Printf("Instance of '%s' is shorted, ignoring.\n", scan->name);
|
||||
Printf("Instance of '%s' is shorted, ignoring.\n", subcktname);
|
||||
while (head) {
|
||||
p = head->next;
|
||||
FREE(head);
|
||||
|
||||
+39
-215
@@ -76,8 +76,7 @@ struct hashdict verilogparams;
|
||||
// Global storage for verilog definitions
|
||||
struct hashdict verilogdefs;
|
||||
// Record file pointer that is associated with the hash tables
|
||||
int hashfilep = -1; /* for parameters */
|
||||
int hashfiled = -1; /* for definitions */
|
||||
int hashfile = -1;
|
||||
|
||||
// Global storage for wire buses
|
||||
struct hashdict buses;
|
||||
@@ -157,8 +156,7 @@ struct expr_stack {
|
||||
//-------------------------------------------------------------------------
|
||||
// Evaluate an expression for an array bound. This is much like
|
||||
// ReduceOneExpression() in netgen.c, but only handles basic integer
|
||||
// arithmetic (+,-,*,/), grouping by parentheses, bit shifts, and
|
||||
// if-else operators.
|
||||
// arithmetic (+,-,*,/) and grouping by parentheses.
|
||||
//
|
||||
// Returns 1 if successful, 0 on error.
|
||||
// Evaluated result is placed in the integer pointed to by "valptr".
|
||||
@@ -222,39 +220,6 @@ int EvalExpr(struct expr_stack **stackptr, int *valptr)
|
||||
}
|
||||
}
|
||||
|
||||
/* Reduce (a << b) and (a >> b) */
|
||||
|
||||
for (texp = start; texp; texp = texp->next) {
|
||||
if ((texp->last != NULL) && (texp->next != NULL) && (texp->oper != '\0')) {
|
||||
if ((texp->last->oper == '\0') && (texp->next->oper == '\0')) {
|
||||
if (texp->oper == '<') {
|
||||
/* Left shift */
|
||||
texp->last->value <<= texp->next->value;
|
||||
/* Remove two items from the stack */
|
||||
tmp = texp;
|
||||
texp = texp->last;
|
||||
texp->next = tmp->next->next;
|
||||
if (tmp->next->next) tmp->next->next->last = texp;
|
||||
FREE(tmp->next);
|
||||
FREE(tmp);
|
||||
modified = TRUE;
|
||||
}
|
||||
if (texp->oper == '>') {
|
||||
/* Right shift */
|
||||
texp->last->value >>= texp->next->value;
|
||||
/* Remove two items from the stack */
|
||||
tmp = texp;
|
||||
texp = texp->last;
|
||||
texp->next = tmp->next->next;
|
||||
if (tmp->next->next) tmp->next->next->last = texp;
|
||||
FREE(tmp->next);
|
||||
FREE(tmp);
|
||||
modified = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Reduce (a * b) and (a / b) */
|
||||
|
||||
for (texp = start; texp; texp = texp->next) {
|
||||
@@ -330,39 +295,6 @@ int EvalExpr(struct expr_stack **stackptr, int *valptr)
|
||||
}
|
||||
}
|
||||
|
||||
/* Reduce (a ? b : c) */
|
||||
|
||||
for (texp = start; texp; texp = texp->next) {
|
||||
/* There must be at least five objects on the stack */
|
||||
if ((texp->last != NULL) && (texp->next != NULL) && (texp->oper != '\0')
|
||||
&& (texp->next->next != NULL)
|
||||
&& (texp->next->next->next != NULL)) {
|
||||
if ((texp->last->oper == '\0') && (texp->next->oper == '\0')
|
||||
&& (texp->next->next->next->oper == '\0')) {
|
||||
if ((texp->oper == '?') && (texp->next->next->oper == ':')) {
|
||||
/* If-Else conditional */
|
||||
if (texp->last->value)
|
||||
texp->last->value = texp->next->value;
|
||||
else
|
||||
texp->last->value = texp->next->next->next->value;
|
||||
|
||||
/* Remove four items from the stack */
|
||||
tmp = texp;
|
||||
texp = texp->last;
|
||||
texp->next = tmp->next->next->next->next;
|
||||
if (tmp->next->next->next->next)
|
||||
tmp->next->next->next->next->last = texp;
|
||||
FREE(tmp->next->next->next);
|
||||
FREE(tmp->next->next);
|
||||
FREE(tmp->next);
|
||||
FREE(tmp);
|
||||
|
||||
modified = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Reduce (a) */
|
||||
|
||||
for (texp = start; texp; texp = texp->next) {
|
||||
@@ -441,15 +373,8 @@ int ParseIntegerExpression(char *expr, int *iptr)
|
||||
|
||||
if (match(sptr, "+") || match(sptr, "-")
|
||||
|| match(sptr, "*") || match(sptr, "/")
|
||||
|| match(sptr, "(") || match(sptr, ")")
|
||||
|| match(sptr, "<<") || match(sptr, ">>")
|
||||
|| match(sptr, "?") || match(sptr, ":")) {
|
||||
|| match(sptr, "(") || match(sptr, ")")) {
|
||||
newexp = (struct expr_stack *)MALLOC(sizeof(struct expr_stack));
|
||||
/* Note that "oper" is one character and that "<<" and ">>"
|
||||
* become '<' and '>', respectively. The less-than and greater-
|
||||
* than operators are not (yet) handled but will need to be
|
||||
* recast to some other character in "oper".
|
||||
*/
|
||||
newexp->oper = *sptr;
|
||||
newexp->value = 0;
|
||||
newexp->next = NULL;
|
||||
@@ -464,7 +389,7 @@ int ParseIntegerExpression(char *expr, int *iptr)
|
||||
if ((result = sscanf(sptr, "%d", &value)) != 1) {
|
||||
|
||||
// Is name in the parameter list?
|
||||
kl = (struct property *)HashLookup(sptr, &verilogparams);
|
||||
kl = (struct property *)HashLookup(nexttok, &verilogparams);
|
||||
if (kl == NULL) {
|
||||
Printf("Value %s in expression is not a number or a parameter.\n",
|
||||
sptr);
|
||||
@@ -477,29 +402,27 @@ int ParseIntegerExpression(char *expr, int *iptr)
|
||||
if (result != 1) {
|
||||
Printf("Parameter %s has value %s that cannot be parsed"
|
||||
" as an integer.\n",
|
||||
sptr, kl->pdefault.string);
|
||||
nexttok, kl->pdefault.string);
|
||||
value = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (kl->type == PROP_INTEGER) {
|
||||
value = kl->pdefault.ival;
|
||||
result = 1; // Assert valid result
|
||||
}
|
||||
else if (kl->type == PROP_DOUBLE) {
|
||||
value = (int)kl->pdefault.dval;
|
||||
if ((double)value != kl->pdefault.dval) {
|
||||
Printf("Parameter %s has value %g that cannot be parsed"
|
||||
" as an integer.\n",
|
||||
sptr, kl->pdefault.dval);
|
||||
nexttok, kl->pdefault.dval);
|
||||
value = 0;
|
||||
break;
|
||||
}
|
||||
result = 1; // Assert valid result
|
||||
}
|
||||
else {
|
||||
Printf("Parameter %s has unknown type; don't know how"
|
||||
" to parse.\n", sptr);
|
||||
" to parse.\n", nexttok);
|
||||
value = 0;
|
||||
break;
|
||||
}
|
||||
@@ -593,8 +516,7 @@ int GetBusTok(struct bus *wb)
|
||||
}
|
||||
else if (match(nexttok, "+") || match(nexttok, "-")
|
||||
|| match(nexttok, "*") || match(nexttok, "/")
|
||||
|| match(nexttok, "(") || match(nexttok, ")")
|
||||
|| match(nexttok, "<<") || match(nexttok, ">>")) {
|
||||
|| match(nexttok, "(") || match(nexttok, ")")) {
|
||||
newexp = (struct expr_stack *)MALLOC(sizeof(struct expr_stack));
|
||||
newexp->oper = *nexttok;
|
||||
newexp->value = 0;
|
||||
@@ -1914,38 +1836,6 @@ skip_endmodule:
|
||||
else { /* "assign" */
|
||||
SkipTokComments(VLOG_PIN_CHECK_DELIMITERS);
|
||||
char *aptr = strvchr(nexttok, '[');
|
||||
|
||||
/* This is a repeat of code to handle reading of pins, and
|
||||
* makes sure that all input has been read to the closing
|
||||
* bracket. There needs to be a single routine to do this,
|
||||
* or (better) rewrite the parser with lex instead of trying
|
||||
* to enumerate all the syntax cases separately.
|
||||
*/
|
||||
if ((aptr != NULL) && (strvchr(nexttok, ']') == NULL))
|
||||
{
|
||||
/* If a bus expressions has whitespace, then concatenate
|
||||
* to the closing ']'.
|
||||
*/
|
||||
char *array_expr = (char *)MALLOC(1);
|
||||
char *new_array_expr = NULL;
|
||||
*array_expr = '\0';
|
||||
/* Read to "]" */
|
||||
while (nexttok) {
|
||||
new_array_expr = (char *)MALLOC(strlen(array_expr) +
|
||||
strlen(nexttok) + 1);
|
||||
/* Roundabout way to do realloc() becase there is no REALLOC() */
|
||||
strcpy(new_array_expr, array_expr);
|
||||
strcat(new_array_expr, nexttok);
|
||||
FREE(array_expr);
|
||||
array_expr = new_array_expr;
|
||||
if (strchr(nexttok, ']')) break;
|
||||
SkipTokComments(VLOG_PIN_CHECK_DELIMITERS);
|
||||
}
|
||||
if (!nexttok) {
|
||||
Printf("Unterminated array in assignment %s\n", array_expr);
|
||||
}
|
||||
}
|
||||
|
||||
if (((aptr == NULL) && (GetBusTok(&wb) == 0)) ||
|
||||
((aptr != NULL) && (GetBus(aptr, &wb) == 0))) {
|
||||
if (aptr != NULL) {
|
||||
@@ -1989,8 +1879,7 @@ skip_endmodule:
|
||||
// Allowed uses of "assign" for netlists:
|
||||
// "assign a = b" joins two nets.
|
||||
// "assign a = {b, c, ...}" creates a bus from components.
|
||||
// "assign" using if-else constructs or bit shifts.
|
||||
// ("assign" using any other boolean arithmetic is not structural verilog.)
|
||||
// "assign" using any boolean arithmetic is not structural verilog.
|
||||
// "assign a = {x{b}}" creates a bus by repeating a component.
|
||||
|
||||
if (nexttok && match(nexttok, "=")) {
|
||||
@@ -2251,19 +2140,6 @@ nextinst:
|
||||
}
|
||||
SkipTokComments(VLOG_DELIMITERS);
|
||||
}
|
||||
else if (loop.loopvar != NULL) {
|
||||
/* Instances created within a generate block for loop have an
|
||||
* implicit array
|
||||
*/
|
||||
int loopval;
|
||||
struct property *klr;
|
||||
|
||||
klr = (struct property *)HashLookup(loop.loopvar, &verilogparams);
|
||||
loopval = klr->pdefault.ival;
|
||||
|
||||
arraystart = arrayend = loopval;
|
||||
sprintf(instancename + strlen(instancename), "[%d]", loopval);
|
||||
}
|
||||
|
||||
if (match(nexttok, "(")) {
|
||||
char savetok = (char)0;
|
||||
@@ -2326,19 +2202,7 @@ nextinst:
|
||||
strcat(new_wire_bundle, nexttok);
|
||||
FREE(wire_bundle);
|
||||
wire_bundle = new_wire_bundle;
|
||||
if (!strcmp(nexttok, "}"))
|
||||
{
|
||||
/* If a "bundle" has only one component, then it is
|
||||
* not really a bundle and should be treated as a
|
||||
* single wire.
|
||||
*/
|
||||
if (strchr(wire_bundle, ',') == NULL) {
|
||||
int blen = strlen(wire_bundle + 1) - 1;
|
||||
memmove(wire_bundle, wire_bundle + 1, blen);
|
||||
*(wire_bundle + blen) = '\0';
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (!strcmp(nexttok, "}")) break;
|
||||
SkipTokComments(VLOG_PIN_CHECK_DELIMITERS);
|
||||
}
|
||||
if (!nexttok) {
|
||||
@@ -2714,7 +2578,6 @@ nextinst:
|
||||
char *brackptr;
|
||||
int j;
|
||||
char locinst[MAX_STR_LEN];
|
||||
int arraypos = (arraystart > arrayend) ? arraymax - i : i;
|
||||
|
||||
if (i != -1)
|
||||
sprintf(locinst, "%s[%d]", instancename, i);
|
||||
@@ -2751,27 +2614,18 @@ nextinst:
|
||||
if (scan == NULL) {
|
||||
char localnet[MAX_STR_LEN];
|
||||
|
||||
/* Assume an implicit unconnected pin, unless there are no pins */
|
||||
if (strcmp(obpinname, "(no pins)")) {
|
||||
sprintf(localnet, "_noconnect_%d_", localcount++);
|
||||
Node(localnet);
|
||||
join(localnet, obptr->name);
|
||||
Fprintf(stdout,
|
||||
/* Assume an implicit unconnected pin */
|
||||
sprintf(localnet, "_noconnect_%d_", localcount++);
|
||||
Node(localnet);
|
||||
join(localnet, obptr->name);
|
||||
Fprintf(stdout,
|
||||
"Note: Implicit pin %s in instance %s of %s in cell %s\n",
|
||||
obpinname, locinst, modulename, CurrentCell->name);
|
||||
}
|
||||
}
|
||||
else if (GetBus(scan->net, &wb) == 0) {
|
||||
char *bptr2;
|
||||
char *scanroot;
|
||||
int isbundle = FALSE;
|
||||
/* Skip over a bundle delimiter */
|
||||
if (*scan->net == '{') {
|
||||
scanroot = strsave(scan->net + 1);
|
||||
isbundle = TRUE;
|
||||
}
|
||||
else
|
||||
scanroot = strsave(scan->net);
|
||||
scanroot = strsave(scan->net);
|
||||
brackptr = strvchr(scanroot, '[');
|
||||
if (brackptr) *brackptr = '\0';
|
||||
|
||||
@@ -2804,7 +2658,6 @@ nextinst:
|
||||
else {
|
||||
// Instance must be an array
|
||||
char netname[MAX_STR_LEN];
|
||||
char *spos = scanroot;
|
||||
int slice, portlen, siglen;
|
||||
|
||||
/* Get the array size of the port for bit slicing */
|
||||
@@ -2816,49 +2669,27 @@ nextinst:
|
||||
if (siglen < 0) siglen = -siglen;
|
||||
siglen++;
|
||||
|
||||
// If this is a bundle, then count out to the current
|
||||
// slice and read off the index. NOTE: Need to
|
||||
// handle multiple bits per bundle entry!
|
||||
if (isbundle) {
|
||||
int j;
|
||||
if (brackptr) *brackptr = '[';
|
||||
for (j = 0; j < arraypos * portlen; j++) {
|
||||
spos = strvchr(spos, ',');
|
||||
if (spos == NULL) break;
|
||||
spos++;
|
||||
}
|
||||
if (spos != NULL) {
|
||||
brackptr = strvchr(spos, '[');
|
||||
*brackptr = '\0';
|
||||
sscanf(brackptr + 1, "%d", &slice);
|
||||
}
|
||||
else spos = scanroot; /* should emit an error here */
|
||||
// If signal array is smaller than the portlength *
|
||||
// length of instance array, then the signal wraps.
|
||||
|
||||
if (wb2.start >= wb2.end && arraystart >= arrayend) {
|
||||
slice = wb.start - (arraystart - i) * portlen;
|
||||
while (slice < wb2.end) slice += siglen;
|
||||
}
|
||||
else { /* not a bundle */
|
||||
|
||||
// If signal array is smaller than the portlength *
|
||||
// length of instance array, then the signal wraps.
|
||||
|
||||
if (wb2.start >= wb2.end && arraystart >= arrayend) {
|
||||
slice = wb.start - (arraystart - i) * portlen;
|
||||
while (slice < wb2.end) slice += siglen;
|
||||
}
|
||||
else if (wb2.start < wb2.end && arraystart > arrayend) {
|
||||
slice = wb.start + (arraystart - i) * portlen;
|
||||
while (slice > wb2.end) slice -= siglen;
|
||||
}
|
||||
else if (wb2.start > wb2.end && arraystart < arrayend) {
|
||||
slice = wb.start - (arraystart + i) * portlen;
|
||||
while (slice < wb2.end) slice += siglen;
|
||||
}
|
||||
else { // (wb2.start < wb2.end && arraystart < arrayend)
|
||||
slice = wb.start + (arraystart + i) * portlen;
|
||||
while (slice > wb2.end) slice -= siglen;
|
||||
}
|
||||
spos = scanroot;
|
||||
else if (wb2.start < wb2.end && arraystart > arrayend) {
|
||||
slice = wb.start + (arraystart - i) * portlen;
|
||||
while (slice > wb2.end) slice -= siglen;
|
||||
}
|
||||
else if (wb2.start > wb2.end && arraystart < arrayend) {
|
||||
slice = wb.start - (arraystart + i) * portlen;
|
||||
while (slice < wb2.end) slice += siglen;
|
||||
}
|
||||
else { // (wb2.start < wb2.end && arraystart < arrayend)
|
||||
slice = wb.start + (arraystart + i) * portlen;
|
||||
while (slice > wb2.end) slice -= siglen;
|
||||
}
|
||||
|
||||
sprintf(netname, "%s[%d]", spos, slice);
|
||||
sprintf(netname, "%s[%d]", scanroot, slice);
|
||||
if (LookupObject(netname, CurrentCell) == NULL) Node(netname);
|
||||
join(netname, obptr->name);
|
||||
}
|
||||
@@ -3043,25 +2874,18 @@ char *ReadVerilogTop(char *fname, int *fnum, int blackbox)
|
||||
hashfunc = hashcase;
|
||||
}
|
||||
|
||||
if ((hashfilep != -1) && (hashfilep != *fnum)) {
|
||||
/* Started a new file, so remove all the parameters */
|
||||
if ((hashfile != -1) && (hashfile != *fnum)) {
|
||||
/* Started a new file, so remove all the parameters and definitions */
|
||||
RecurseHashTable(&verilogparams, freeprop);
|
||||
HashKill(&verilogparams);
|
||||
hashfilep = -1;
|
||||
}
|
||||
if ((hashfiled != -1) && (hashfiled != *fnum)) {
|
||||
/* Started a new file, so remove all the definitions */
|
||||
RecurseHashTable(&verilogdefs, freeprop);
|
||||
HashKill(&verilogdefs);
|
||||
hashfiled = -1;
|
||||
hashfile = -1;
|
||||
}
|
||||
if (hashfilep == -1) {
|
||||
if (hashfile == -1) {
|
||||
InitializeHashTable(&verilogparams, OBJHASHSIZE);
|
||||
hashfilep = filenum;
|
||||
}
|
||||
if (hashfiled == -1) {
|
||||
InitializeHashTable(&verilogdefs, OBJHASHSIZE);
|
||||
hashfiled = filenum;
|
||||
hashfile = *fnum;
|
||||
}
|
||||
definitions = &verilogdefs;
|
||||
|
||||
|
||||
+1
-2
@@ -68,7 +68,6 @@ LIB_SPECS = @LIB_SPECS@
|
||||
LIB_SPECS_NOSTUB = @LIB_SPECS_NOSTUB@
|
||||
WISH_EXE = @WISH_EXE@
|
||||
TCL_LIB_DIR = @TCL_LIB_DIR@
|
||||
EXTRA_CFLAGS =
|
||||
|
||||
CC = @CC@
|
||||
CPP = @CPP@
|
||||
@@ -77,7 +76,7 @@ CXX = @CXX@
|
||||
CPPFLAGS = -I. -I${NETGENDIR} @CPPFLAGS@
|
||||
DFLAGS = @extra_defs@ @stub_defs@ @DEFS@ -DSHDLIB_EXT=\"@SHDLIB_EXT@\" -DNDEBUG
|
||||
DFLAGS_NOSTUB = @extra_defs@ @DEFS@ -DSHDLIB_EXT=\"@SHDLIB_EXT@\" -DNDEBUG
|
||||
CFLAGS = @CFLAGS@ @SHLIB_CFLAGS@ @INC_SPECS@ ${EXTRA_CFLAGS}
|
||||
CFLAGS = @CFLAGS@ @SHLIB_CFLAGS@ @INC_SPECS@
|
||||
|
||||
DEPEND_FILE = Depend
|
||||
DEPEND_FLAG = @DEPEND_FLAG@
|
||||
|
||||
+4
-24
@@ -429,7 +429,7 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
|
||||
set file1 $name1
|
||||
set cell1 $name1
|
||||
}
|
||||
puts stdout "Reading netlist file $file1 for $name1"
|
||||
puts stdout "Reading netlist file $file1"
|
||||
set fnum1 [netgen::readnet $file1]
|
||||
} else {
|
||||
set cell1 [lindex $flist1 0]
|
||||
@@ -446,7 +446,7 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
|
||||
set file2 $name2
|
||||
set cell2 $name2
|
||||
}
|
||||
puts stdout "Reading netlist file $file2 for $name2"
|
||||
puts stdout "Reading netlist file $file2"
|
||||
set fnum2 [netgen::readnet $file2]
|
||||
} else {
|
||||
set cell2 [lindex $flist2 0]
|
||||
@@ -461,7 +461,7 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
|
||||
}
|
||||
|
||||
set clist1 [cells list $fnum1]
|
||||
set cidx [lsearch -exact $clist1 $cell1]
|
||||
set cidx [lsearch -regexp $clist1 ^$cell1$]
|
||||
if {$cidx < 0} {
|
||||
puts stderr "Cannot find cell $cell1 in file $file1"
|
||||
return
|
||||
@@ -469,7 +469,7 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
|
||||
set cell1 [lindex $clist1 $cidx]
|
||||
}
|
||||
set clist2 [cells list $fnum2]
|
||||
set cidx [lsearch -exact $clist2 $cell2]
|
||||
set cidx [lsearch -regexp $clist2 ^$cell2$]
|
||||
if {$cidx < 0} {
|
||||
puts stderr "Cannot find cell $cell2 in file $file2"
|
||||
return
|
||||
@@ -477,18 +477,6 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
|
||||
set cell2 [lindex $clist2 $cidx]
|
||||
}
|
||||
|
||||
# The "noflat" list is non-file-specific, so run on each file.
|
||||
foreach cell $noflat {
|
||||
set cidx [lsearch -regexp $clist1 ^$cell$]
|
||||
if {$cidx >= 0} {
|
||||
netgen::flatten prohibit "$fnum1 $cell"
|
||||
}
|
||||
set cidx [lsearch -regexp $clist2 ^$cell$]
|
||||
if {$cidx >= 0} {
|
||||
netgen::flatten prohibit "$fnum2 $cell"
|
||||
}
|
||||
}
|
||||
|
||||
netgen::compare assign "$fnum1 $cell1" "$fnum2 $cell2"
|
||||
|
||||
if {$setupfile == ""} {
|
||||
@@ -516,14 +504,6 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
|
||||
}
|
||||
}
|
||||
close $fsetup
|
||||
if {$command != {}} {
|
||||
# Incomplete command. Evaluate it to get a meaningful error message
|
||||
if {[catch {uplevel 1 [list namespace eval netgen $command]} msg]} {
|
||||
set msg [string trimright $msg "\n"]
|
||||
puts stderr "Error $setupfile:$sline (ignoring), $msg"
|
||||
incr perrors
|
||||
}
|
||||
}
|
||||
} else {
|
||||
puts stdout "Error: Cannot read the setup file $setupfile"
|
||||
}
|
||||
|
||||
+132
-142
@@ -21,8 +21,6 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h> /* for getenv */
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
#include <stdarg.h> /* for va_list */
|
||||
|
||||
#include <tcl.h>
|
||||
|
||||
@@ -45,14 +43,14 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
#if TCL_MAJOR_VERSION < 9
|
||||
typedef int Tcl_Size;
|
||||
#endif
|
||||
|
||||
/*-----------------------*/
|
||||
/* Tcl 8.4 compatibility */
|
||||
/*-----------------------*/
|
||||
|
||||
#ifndef CONST84
|
||||
#define CONST84
|
||||
#endif
|
||||
|
||||
Tcl_Interp *netgeninterp;
|
||||
Tcl_Interp *consoleinterp;
|
||||
int ColumnBase = 0;
|
||||
@@ -62,47 +60,47 @@ extern int PropertyErrorDetected;
|
||||
|
||||
/* Function prototypes for all Tcl command callbacks */
|
||||
|
||||
int _netgen_readnet(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_readlib(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_canonical(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_writenet(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_flatten(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_nodes(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_elements(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_debug(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_protochip(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_instances(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_contents(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_describe(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_cells(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_ports(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_model(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_leaves(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_quit(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_reinit(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_log(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_readnet(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_readlib(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_canonical(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_writenet(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_flatten(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_nodes(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_elements(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_debug(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_protochip(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_instances(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_contents(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_describe(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_cells(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_ports(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_model(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_leaves(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_quit(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_reinit(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netgen_log(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
#ifdef HAVE_MALLINFO
|
||||
int _netgen_printmem(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_printmem(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
#endif
|
||||
int _netgen_help(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_matching(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_compare(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_iterate(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_summary(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_print(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_format(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_run(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_verify(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_automorphs(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_equate(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_ignore(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_permute(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_property(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_exhaustive(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_symmetry(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_restart(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_global(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netcmp_convert(ClientData, Tcl_Interp *, int, Tcl_Obj *const objv[]);
|
||||
int _netgen_help(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_matching(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_compare(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_iterate(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_summary(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_print(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_format(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_run(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_verify(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_automorphs(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_equate(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_ignore(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_permute(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_property(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_exhaustive(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_symmetry(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_restart(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_global(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_convert(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
|
||||
typedef struct _Cmd {
|
||||
char *name;
|
||||
@@ -289,7 +287,7 @@ GetTopCell(int fnum)
|
||||
int
|
||||
CommonGetFilenameOrFile(Tcl_Interp *interp, Tcl_Obj *fobj, int *fnumptr)
|
||||
{
|
||||
int result;
|
||||
int result, llen;
|
||||
int fnum, ftest;
|
||||
char *filename;
|
||||
struct nlist *tp;
|
||||
@@ -372,8 +370,7 @@ CommonParseCell(Tcl_Interp *interp, Tcl_Obj *objv,
|
||||
struct nlist **tpr, int *fnumptr)
|
||||
{
|
||||
Tcl_Obj *tobj, *fobj;
|
||||
int result;
|
||||
Tcl_Size llen;
|
||||
int result, llen;
|
||||
int fnum, ftest, index;
|
||||
char *filename, *cellname;
|
||||
struct nlist *tp, *tp2;
|
||||
@@ -402,7 +399,7 @@ CommonParseCell(Tcl_Interp *interp, Tcl_Obj *objv,
|
||||
Tcl_ResetResult(interp);
|
||||
|
||||
/* Is 1st argument a special keyword? */
|
||||
if (Tcl_GetIndexFromObj(interp, tobj, (const char **)suboptions,
|
||||
if (Tcl_GetIndexFromObj(interp, tobj, (CONST84 char **)suboptions,
|
||||
"special", 0, &index) == TCL_OK) {
|
||||
switch (index) {
|
||||
case CIRCUIT1_IDX:
|
||||
@@ -458,7 +455,7 @@ CommonParseCell(Tcl_Interp *interp, Tcl_Obj *objv,
|
||||
|
||||
/* Check if 2nd item is a reserved keyword */
|
||||
if (Tcl_GetIndexFromObj(interp, fobj,
|
||||
(const char **)suboptions,
|
||||
(CONST84 char **)suboptions,
|
||||
"special", 0, &index) == TCL_OK) {
|
||||
switch (index) {
|
||||
case CIRCUIT1_IDX:
|
||||
@@ -583,7 +580,7 @@ CommonParseCell(Tcl_Interp *interp, Tcl_Obj *objv,
|
||||
} else {
|
||||
/* Only one name given; check if it matches subOption */
|
||||
|
||||
if (Tcl_GetIndexFromObj(interp, objv, (const char **)suboptions,
|
||||
if (Tcl_GetIndexFromObj(interp, objv, (CONST84 char **)suboptions,
|
||||
"special", 0, &index) == TCL_OK) {
|
||||
|
||||
switch (index) {
|
||||
@@ -668,7 +665,7 @@ CommonParseCell(Tcl_Interp *interp, Tcl_Obj *objv,
|
||||
|
||||
int
|
||||
_netgen_canonical(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
int result;
|
||||
struct nlist *np;
|
||||
@@ -707,7 +704,7 @@ _netgen_canonical(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_readnet(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *formats[] = {
|
||||
"automatic", "ext", "extflat", "sim", "prm", "ntk", "spice",
|
||||
@@ -744,7 +741,7 @@ _netgen_readnet(ClientData clientData,
|
||||
return TCL_ERROR;
|
||||
}
|
||||
else if (objc > 1) {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)formats,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)formats,
|
||||
"format", 0, &index) != TCL_OK) {
|
||||
if (objc == 3)
|
||||
|
||||
@@ -853,7 +850,7 @@ _netgen_readnet(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_readlib(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *formats[] = {
|
||||
"actel", "spice", "xilinx", NULL
|
||||
@@ -886,7 +883,7 @@ _netgen_readlib(ClientData clientData,
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "format [file]");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)formats,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)formats,
|
||||
"format", 0, &index) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -933,7 +930,7 @@ _netgen_readlib(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_writenet(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *formats[] = {
|
||||
"ext", "sim", "ntk", "actel",
|
||||
@@ -952,7 +949,7 @@ _netgen_writenet(ClientData clientData,
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "format file");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)formats,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)formats,
|
||||
"format", 0, &index) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -1020,11 +1017,11 @@ _netgen_writenet(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_flatten(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *repstr, *file;
|
||||
int result, filenum;
|
||||
struct nlist *tp, *tp2, *tptop;
|
||||
int result, llen, filenum;
|
||||
struct nlist *tp, *tp2;
|
||||
|
||||
if ((objc < 2) || (objc > 4)) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "?class? valid_cellname");
|
||||
@@ -1038,7 +1035,7 @@ _netgen_flatten(ClientData clientData,
|
||||
if (objc >= 3) {
|
||||
char *argv = Tcl_GetString(objv[1]);
|
||||
if (!strcmp(argv, "class")) {
|
||||
tptop = GetTopCell(filenum);
|
||||
tp = GetTopCell(filenum);
|
||||
|
||||
if (objc == 4) {
|
||||
int numflat;
|
||||
@@ -1049,7 +1046,7 @@ _netgen_flatten(ClientData clientData,
|
||||
}
|
||||
else {
|
||||
Printf("Flattening instances of %s in cell %s within file %s\n",
|
||||
repstr, tp2->name, tptop->name);
|
||||
repstr, tp2->name, tp->name);
|
||||
numflat = flattenInstancesOf(tp2->name, filenum, repstr);
|
||||
if (numflat == 0) {
|
||||
Tcl_SetResult(interp, "No instances found to flatten.", NULL);
|
||||
@@ -1058,19 +1055,15 @@ _netgen_flatten(ClientData clientData,
|
||||
}
|
||||
}
|
||||
else {
|
||||
Printf("Flattening instances of %s in file %s\n", repstr, tptop->name);
|
||||
Printf("Flattening instances of %s in file %s\n", repstr, tp->name);
|
||||
FlattenInstancesOf(repstr, filenum);
|
||||
}
|
||||
}
|
||||
else if (!strcmp(argv, "prohibit") || !strcmp(argv, "deny")) {
|
||||
tptop = GetTopCell(filenum);
|
||||
if (tp == NULL)
|
||||
Printf("Error: Cell %s does not exist.\n", repstr);
|
||||
else {
|
||||
Printf("Will not flatten instances of %s in file %s\n", repstr, tptop->name);
|
||||
/* Mark cell as placeholder so it will not be flattened */
|
||||
tp->flags |= CELL_PLACEHOLDER;
|
||||
}
|
||||
tp = GetTopCell(filenum);
|
||||
Printf("Will not flatten instances of %s in file %s\n", repstr, tp->name);
|
||||
/* Mark cell as placeholder so it will not be flattened */
|
||||
tp->flags |= CELL_PLACEHOLDER;
|
||||
}
|
||||
else {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "class valid_cellname");
|
||||
@@ -1094,7 +1087,7 @@ _netgen_flatten(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_nodes(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *estr = NULL, *istr = NULL, *cstr, *fstr;
|
||||
char *optstart;
|
||||
@@ -1212,7 +1205,7 @@ _netgen_nodes(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_elements(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *nstr = NULL, *cstr;
|
||||
struct objlist * (*ListSave)();
|
||||
@@ -1307,7 +1300,7 @@ _netgen_elements(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_debug(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *yesno[] = {
|
||||
"on", "off", NULL
|
||||
@@ -1321,7 +1314,7 @@ _netgen_debug(ClientData clientData,
|
||||
if (objc == 1)
|
||||
index = YES_IDX;
|
||||
else {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)yesno,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)yesno,
|
||||
"option", 0, &index) != TCL_OK) {
|
||||
index = CMD_IDX;
|
||||
}
|
||||
@@ -1356,7 +1349,7 @@ _netgen_debug(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_protochip(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
if (objc != 1) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "(no arguments)");
|
||||
@@ -1376,7 +1369,7 @@ _netgen_protochip(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_instances(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *repstr;
|
||||
int result;
|
||||
@@ -1406,7 +1399,7 @@ _netgen_instances(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_contents(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *repstr;
|
||||
int result;
|
||||
@@ -1435,7 +1428,7 @@ _netgen_contents(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_describe(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *repstr;
|
||||
int file = -1;
|
||||
@@ -1465,7 +1458,7 @@ _netgen_describe(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_cells(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *repstr, *filename = NULL;
|
||||
char *optstart;
|
||||
@@ -1552,7 +1545,7 @@ _netgen_cells(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_model(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
struct nlist *tp, *tp2;
|
||||
char *model, *retclass;
|
||||
@@ -1604,7 +1597,7 @@ _netgen_model(ClientData clientData,
|
||||
if (objc == 3) {
|
||||
nports = NumberOfPorts(tp->name, fnum);
|
||||
|
||||
if (Tcl_GetIndexFromObj(interp, objv[2], (const char **)modelclasses,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[2], (CONST84 char **)modelclasses,
|
||||
"class", 0, &index) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -1774,7 +1767,7 @@ wrongNumPorts:
|
||||
|
||||
int
|
||||
_netgen_ports(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *repstr;
|
||||
int result;
|
||||
@@ -1804,7 +1797,7 @@ _netgen_ports(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_leaves(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *repstr;
|
||||
int result;
|
||||
@@ -1840,7 +1833,7 @@ _netgen_leaves(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_quit(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
if (objc != 1) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "(no arguments)");
|
||||
@@ -1868,7 +1861,7 @@ _netgen_quit(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_reinit(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
if (objc != 1) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "(no arguments)");
|
||||
@@ -1888,7 +1881,7 @@ _netgen_reinit(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_log(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *yesno[] = {
|
||||
"start", "end", "reset", "suspend", "resume", "file", "echo", "put", NULL
|
||||
@@ -1905,7 +1898,7 @@ _netgen_log(ClientData clientData,
|
||||
index = (LoggingFile) ? RESUME_IDX : START_IDX;
|
||||
}
|
||||
else {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)yesno,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)yesno,
|
||||
"option", 0, &index) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -2032,7 +2025,7 @@ _netgen_log(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_printmem(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
if (objc != 1) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "(no arguments)");
|
||||
@@ -2054,7 +2047,7 @@ _netgen_printmem(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_format(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
int col1_width = 41, col2_width = 41;
|
||||
|
||||
@@ -2115,13 +2108,13 @@ _netcmp_format(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_compare(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *name1, *name2, *file1, *file2, *optstart;
|
||||
int fnum1, fnum2, dolist = 0;
|
||||
int dohierarchy = FALSE;
|
||||
int assignonly = FALSE;
|
||||
int argstart = 1, qresult, result;
|
||||
int argstart = 1, qresult, llen, result;
|
||||
int hascontents1, hascontents2;
|
||||
struct Correspond *nextcomp;
|
||||
struct nlist *tp1 = NULL, *tp2 = NULL;
|
||||
@@ -2292,7 +2285,7 @@ _netcmp_compare(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_iterate(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
if (objc != 1) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "(no arguments)");
|
||||
@@ -2316,7 +2309,7 @@ _netcmp_iterate(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_summary(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *options[] = {
|
||||
"nodes", "elements", NULL
|
||||
@@ -2331,7 +2324,7 @@ _netcmp_summary(ClientData clientData,
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (objc == 2) {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)options,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)options,
|
||||
"option", 0, &index) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -2357,7 +2350,7 @@ _netcmp_summary(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_print(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *options[] = {
|
||||
"nodes", "elements", "queue", NULL
|
||||
@@ -2395,16 +2388,16 @@ _netcmp_print(ClientData clientData,
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (objc >= 2) {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)options,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)options,
|
||||
"option", 0, &index) != TCL_OK) {
|
||||
if ((objc == 2) && (Tcl_GetIndexFromObj(interp, objv[1],
|
||||
(const char **)classes, "class", 0, &class) != TCL_OK)) {
|
||||
(CONST84 char **)classes, "class", 0, &class) != TCL_OK)) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (objc == 3 && index != QUEUE_IDX) {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[2], (const char **)classes,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[2], (CONST84 char **)classes,
|
||||
"class", 0, &class) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -2448,7 +2441,7 @@ _netcmp_print(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_run(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *options[] = {
|
||||
"converge", "resolve", NULL
|
||||
@@ -2475,7 +2468,7 @@ _netcmp_run(ClientData clientData,
|
||||
if (objc == 1)
|
||||
index = RESOLVE_IDX;
|
||||
else {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)options,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)options,
|
||||
"option", 0, &index) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -2592,7 +2585,7 @@ _netcmp_run(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_verify(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *options[] = {
|
||||
"nodes", "elements", "properties", "only", "all", "equivalent", "unique", NULL
|
||||
@@ -2624,7 +2617,7 @@ _netcmp_verify(ClientData clientData,
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (objc == 2) {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)options,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)options,
|
||||
"option", 0, &index) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -2781,7 +2774,7 @@ _netcmp_verify(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_automorphs(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
if (objc != 1) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "(no arguments)");
|
||||
@@ -2802,7 +2795,7 @@ _netcmp_automorphs(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_convert(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *cellname;
|
||||
int filenum = -1;
|
||||
@@ -2832,10 +2825,10 @@ _netcmp_convert(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_global(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *filename, *cellname, *pattern;
|
||||
int numchanged = 0, p, fnum, result;
|
||||
int numchanged = 0, p, fnum, llen, result;
|
||||
struct nlist *tp;
|
||||
|
||||
if (objc < 2) {
|
||||
@@ -2869,7 +2862,7 @@ _netcmp_global(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_ignore(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *options[] = {
|
||||
"class", "shorted", NULL
|
||||
@@ -2883,7 +2876,7 @@ _netcmp_ignore(ClientData clientData,
|
||||
char *name = NULL, *name2 = NULL;
|
||||
|
||||
if (objc >= 3) {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)options,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)options,
|
||||
"option", 0, &index) == TCL_OK) {
|
||||
objc--;
|
||||
objv++;
|
||||
@@ -2917,7 +2910,7 @@ _netcmp_ignore(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_equate(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *options[] = {
|
||||
"nodes", "elements", "classes", "pins", NULL
|
||||
@@ -2932,8 +2925,7 @@ _netcmp_equate(ClientData clientData,
|
||||
struct ElementClass *saveEclass = NULL;
|
||||
struct NodeClass *saveNclass = NULL;
|
||||
int file1, file2;
|
||||
int i, dolist = 0, doforce = 0, dounique = 0;
|
||||
Tcl_Size l1, l2, lent, ltest;
|
||||
int i, l1, l2, ltest, lent, dolist = 0, doforce = 0, dounique = 0;
|
||||
Tcl_Obj *tobj1, *tobj2, *tobj3;
|
||||
|
||||
while (objc > 1) {
|
||||
@@ -2963,7 +2955,7 @@ _netcmp_equate(ClientData clientData,
|
||||
return TCL_ERROR;
|
||||
}
|
||||
else {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)options,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)options,
|
||||
"option", 0, &index) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -3432,13 +3424,12 @@ _netcmp_equate(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_property(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
int fnum, i;
|
||||
int fnum, i, llen;
|
||||
struct nlist *tp;
|
||||
struct property *kl, *kllast, *klnext;
|
||||
Tcl_Obj *tobj1, *tobj2, *tobj3;
|
||||
Tcl_Size llen;
|
||||
double dval;
|
||||
int ival, argstart;
|
||||
|
||||
@@ -3515,7 +3506,7 @@ _netcmp_property(ClientData clientData,
|
||||
|
||||
/* Don't need to check return value */
|
||||
index = -1;
|
||||
Tcl_GetIndexFromObj(interp, objv[1], (const char **)topoptions,
|
||||
Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)topoptions,
|
||||
"option", 0, &index);
|
||||
|
||||
/* Check for special command "property default" */
|
||||
@@ -3613,7 +3604,7 @@ _netcmp_property(ClientData clientData,
|
||||
}
|
||||
else if (objc == 3) {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[2],
|
||||
(const char **)topo,
|
||||
(CONST84 char **)topo,
|
||||
"topology", 0, &idx2) == TCL_OK) {
|
||||
if (idx2 == 0)
|
||||
ExactTopology = TRUE;
|
||||
@@ -3672,7 +3663,7 @@ _netcmp_property(ClientData clientData,
|
||||
Tcl_SetObjResult(interp, tobj1);
|
||||
}
|
||||
else {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[2], (const char **)options,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[2], (CONST84 char **)options,
|
||||
"option", 0, &index) != TCL_OK) {
|
||||
index = ADD_IDX;
|
||||
argstart = 2;
|
||||
@@ -3705,7 +3696,7 @@ _netcmp_property(ClientData clientData,
|
||||
// Each value must be a list of two, or a yes/no answer.
|
||||
|
||||
if (Tcl_GetIndexFromObj(interp, objv[i],
|
||||
(const char **)yesno,
|
||||
(CONST84 char **)yesno,
|
||||
"combine", 0, &idx2) == TCL_OK) {
|
||||
if (idx2 <= 4) { /* true, enable, etc. */
|
||||
if (index == SERIAL_IDX || index == SERIES_IDX)
|
||||
@@ -3737,7 +3728,7 @@ _netcmp_property(ClientData clientData,
|
||||
if (result != TCL_OK) return result;
|
||||
|
||||
result = Tcl_GetIndexFromObj(interp, tobj2,
|
||||
(const char **)combineoptions,
|
||||
(CONST84 char **)combineoptions,
|
||||
"combine_type", 0, &idx2);
|
||||
if (result != TCL_OK) return result;
|
||||
|
||||
@@ -3822,7 +3813,7 @@ _netcmp_property(ClientData clientData,
|
||||
/* {key, type} or {key, tolerance} duplet */
|
||||
|
||||
if (Tcl_GetIndexFromObj(interp, tobj2,
|
||||
(const char **)suboptions,
|
||||
(CONST84 char **)suboptions,
|
||||
"type", 0, &idx2) != TCL_OK) {
|
||||
Tcl_ResetResult(interp);
|
||||
if (Tcl_GetDoubleFromObj(interp, tobj2, &dval)
|
||||
@@ -3866,7 +3857,7 @@ _netcmp_property(ClientData clientData,
|
||||
/* {key, type, tolerance} triplet */
|
||||
|
||||
if (Tcl_GetIndexFromObj(interp, tobj2,
|
||||
(const char **)suboptions,
|
||||
(CONST84 char **)suboptions,
|
||||
"type", 0, &idx2) != TCL_OK)
|
||||
return TCL_ERROR;
|
||||
|
||||
@@ -4009,7 +4000,7 @@ _netcmp_property(ClientData clientData,
|
||||
if (result != TCL_OK) return result;
|
||||
|
||||
result = Tcl_GetIndexFromObj(interp, tobj2,
|
||||
(const char **)mergeoptions,
|
||||
(CONST84 char **)mergeoptions,
|
||||
"merge_type", 0, &idx2);
|
||||
if (result != TCL_OK) return result;
|
||||
|
||||
@@ -4061,7 +4052,7 @@ _netcmp_property(ClientData clientData,
|
||||
return TCL_ERROR;
|
||||
}
|
||||
result = Tcl_GetIndexFromObj(interp, objv[3],
|
||||
(const char **)deriveoptions,
|
||||
(CONST84 char **)deriveoptions,
|
||||
"area|perimeter", 0, &idx2);
|
||||
if (result != TCL_OK) return result;
|
||||
switch (idx2) {
|
||||
@@ -4093,7 +4084,7 @@ _netcmp_property(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_permute(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *model, *pin1, *pin2;
|
||||
char *permuteclass[] = {
|
||||
@@ -4114,7 +4105,7 @@ _netcmp_permute(ClientData clientData,
|
||||
index = DEFLT_IDX;
|
||||
}
|
||||
else {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)permuteclass,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)permuteclass,
|
||||
"permute class", 0, &index) != TCL_OK) {
|
||||
if (objc != 4) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "?valid_cellname pin1 pin2?");
|
||||
@@ -4234,7 +4225,7 @@ _netcmp_permute(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_symmetry(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
Printf("Symmetry breaking method has been deprecated.\n");
|
||||
return TCL_OK;
|
||||
@@ -4250,7 +4241,7 @@ _netcmp_symmetry(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_exhaustive(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *yesno[] = {
|
||||
"on", "off", NULL
|
||||
@@ -4263,7 +4254,7 @@ _netcmp_exhaustive(ClientData clientData,
|
||||
if (objc == 1)
|
||||
index = -1;
|
||||
else {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)yesno,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)yesno,
|
||||
"option", 0, &index) != TCL_OK)
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -4292,7 +4283,7 @@ _netcmp_exhaustive(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_restart(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
if (objc != 1) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "(no arguments)");
|
||||
@@ -4312,7 +4303,7 @@ _netcmp_restart(ClientData clientData,
|
||||
|
||||
int
|
||||
_netgen_help(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
int n;
|
||||
|
||||
@@ -4343,7 +4334,7 @@ _netgen_help(ClientData clientData,
|
||||
|
||||
int
|
||||
_netcmp_matching(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *options[] = {
|
||||
"nodes", "elements", NULL
|
||||
@@ -4365,7 +4356,7 @@ _netcmp_matching(ClientData clientData,
|
||||
name = Tcl_GetString(objv[1]);
|
||||
}
|
||||
else {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (const char **)options,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)options,
|
||||
"option", 0, &index) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -4494,14 +4485,14 @@ void tcl_vprintf(FILE *f, const char *fmt, va_list args_in)
|
||||
|
||||
void tcl_stdflush(FILE *f)
|
||||
{
|
||||
Tcl_InterpState state;
|
||||
Tcl_SavedResult state;
|
||||
static char stdstr[] = "::flush stdxxx";
|
||||
char *stdptr = stdstr + 11;
|
||||
|
||||
state = Tcl_SaveInterpState(netgeninterp, TCL_OK);
|
||||
Tcl_SaveResult(netgeninterp, &state);
|
||||
strcpy(stdptr, (f == stderr) ? "err" : "out");
|
||||
Tcl_Eval(netgeninterp, stdstr);
|
||||
Tcl_RestoreInterpState(netgeninterp, state);
|
||||
Tcl_RestoreResult(netgeninterp, &state);
|
||||
}
|
||||
|
||||
/*------------------------------------------------------*/
|
||||
@@ -4531,7 +4522,7 @@ char *Tcl_Strdup(const char *s)
|
||||
/*------------------------------------------------------*/
|
||||
|
||||
int _tkcon_interrupt(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
InterruptPending = 1;
|
||||
return TCL_OK;
|
||||
@@ -4570,7 +4561,7 @@ int Tclnetgen_Init(Tcl_Interp *interp)
|
||||
/* Remember the interpreter */
|
||||
netgeninterp = interp;
|
||||
|
||||
if (Tcl_InitStubs(interp, TCL_VERSION, 0) == NULL) return TCL_ERROR;
|
||||
if (Tcl_InitStubs(interp, "8.5", 0) == NULL) return TCL_ERROR;
|
||||
|
||||
for (n = 0; netgen_cmds[n].name != NULL; n++) {
|
||||
sprintf(keyword, "netgen::%s", netgen_cmds[n].name);
|
||||
@@ -4579,8 +4570,7 @@ int Tclnetgen_Init(Tcl_Interp *interp)
|
||||
}
|
||||
for (n = 0; netcmp_cmds[n].name != NULL; n++) {
|
||||
sprintf(keyword, "netgen::%s", netcmp_cmds[n].name);
|
||||
Tcl_CreateObjCommand(interp, keyword,
|
||||
(Tcl_ObjCmdProc *)netcmp_cmds[n].handler,
|
||||
Tcl_CreateObjCommand(interp, keyword, netcmp_cmds[n].handler,
|
||||
(ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user