Compare commits

...
33 Commits
Author SHA1 Message Date
Tim Edwards 758b5a249a Extended the prematching phase to include matching of devices
based on properties that can be traded with number of devices,
such as MOSFET width, by merging.  This initial implementation
is somewhat limited, only dealing with properties that merge
by summing.  Only devices that do not match at all in the other
circuit will be considered for merging.  The feature includes
a command option "property ... merge ..." that allows control
over which devices can and cannot be merged.
2016-06-23 22:27:34 -04:00
Tim Edwards 15d10f1d93 Merge branch 'master' into work 2016-06-23 10:18:49 -04:00
Tim Edwards a6e3e7e457 Update at Thu Jun 23 10:18:47 EDT 2016 by tim 2016-06-23 10:18:47 -04:00
Tim Edwards 5f634b2a91 Overhaul of the hash table method. Original method used global
variables to iterate over hash table contents.  This led to the
inability to nest hash table iterators.  Fixed by defining a
wrapper structure that holds the actual hash table plus the size
and iterator indexes.  Not only does this solve the nesting
problem, but it also avoids the need to pass the hash table size
on every call, and that reduces the number of ways a hash table
subroutine can go wrong (e.g., cannot access the table out of
bounds simply by passing a size that is larger than was used to
initialize the table).
2016-06-23 10:13:18 -04:00
Tim Edwards cbb2f78ee9 Merge branch 'master' into work 2016-05-19 16:46:33 -04:00
Tim Edwards 99c942eb2b Update at Thu May 19 16:46:32 EDT 2016 by tim 2016-05-19 16:46:32 -04:00
Tim Edwards 4306562a1a Corrected a previously-working output of a list of cells with property
errors at the end of LVS.  The result of "verify matching" got
overwritten by the result from matching pins, erasing the information
about a cell having property errors.
2016-05-19 16:45:27 -04:00
Tim Edwards 2f8d50159f Merge branch 'master' into work 2016-05-17 09:05:10 -04:00
Tim Edwards bbc9110431 Update at Tue May 17 09:05:09 EDT 2016 by tim 2016-05-17 09:05:09 -04:00
Tim Edwards f9c4fc86a0 Prevented error messages about undefined properties for devices. 2016-05-17 09:03:18 -04:00
Tim Edwards e0527a0a89 Corrected the "property tolerance" command in tclnetgen, and cleaned up
some of the property matching output.
2016-05-16 17:33:15 -04:00
Tim Edwards be6a5a87ce Updated the .gitignore file to avoid the .log and .so files. 2016-05-16 13:11:35 -04:00
Tim Edwards 317eb8ff0f Removed files that should not be in the git repository 2016-05-16 13:10:58 -04:00
Tim Edwards 6bf29235bc Added additional diagnostic statements. 2016-05-16 13:09:19 -04:00
Tim Edwards 6428d5995c Merge branch 'master' into work 2016-05-16 10:55:54 -04:00
Tim Edwards acd9a0e846 Update at Mon May 16 10:55:53 EDT 2016 by tim 2016-05-16 10:55:53 -04:00
Tim Edwards 7edeb2e37d Fairly extensive modifications that allow for handling of, and
comparisons between, duplicate cells (cells with the same netlist
that may have more than one name in a circuit, or which for some
reason appear with the same name more than once in a netlist).
Added more checks to the list prematching, which prevents various
troubles with cells having a mismatched hierarchy.  Added a
command option to "flatten class" to flatten instances only within
a specific cell.  Corrected one error in the pin matching routine.
Added a check in the pin matching routine to look for pins that
have been found to be no-connects after cleaning up the pin lists
of the children of that cell.
2016-05-16 10:50:12 -04:00
Tim Edwards 06d772edd0 Fixed a potential crash condition in uniquepins(). 2016-05-05 11:27:23 -04:00
Tim Edwards 9ae51e0150 Merge branch 'master' into work 2016-05-05 10:12:59 -04:00
Tim Edwards f7cbae9efe Update at Thu May 5 10:12:58 EDT 2016 by tim 2016-05-05 10:12:58 -04:00
Tim Edwards 086495bc28 Corrected a line in FlattenUnmatched that would cause an
infinite loop if attempting to flatten an empty cell.
2016-05-05 10:12:23 -04:00
Tim Edwards 846ab5369a Corrected an error causing a segfault on property mismatches where
one cell is missing properties (failed to check for a NULL value
before checking values internal to the structure that was NULL).
2016-03-20 15:56:39 -04:00
Tim Edwards 8667bf0799 Corrected an additional error that let PropertyMatch() be called
with arguments swapped with respect to Circuit1, Circuit2 definitions,
which are fixed in PropertyMatch().
2016-03-20 12:34:24 -04:00
Tim Edwards 0caf47006c Additional measure to ensure that name altered to avoid cross-
netlist naming conflicts does not also cause a naming conflict.
2016-03-20 11:55:51 -04:00
Tim Edwards a7a94ab2be Merge branch 'master' into work 2016-03-20 11:44:06 -04:00
Tim Edwards d612485a9b Update at Sun Mar 20 11:44:06 EDT 2016 by tim 2016-03-20 11:44:06 -04:00
Tim Edwards b245b79c20 Corrected handling of name matching so that if the setup file
equates class "a" in circuit 1 with class "b" in circuit2, and
if circuit 1 has a class called "b" and/or circuit 2 has a class
called "a", then both classes are given a new hash to avoid
conflicts with the (presumably) unrelated cells of the same name
in the other netlist.
2016-03-20 11:41:41 -04:00
Tim Edwards c11252f196 Merge branch 'master' into work 2016-03-16 12:06:39 -04:00
Tim Edwards 5735181f88 Update at Wed Mar 16 12:06:38 EDT 2016 by tim 2016-03-16 12:06:38 -04:00
Tim Edwards 6e144bf5fe Corrected the device pre-matching routine to not segfault when
a cell has zero instances in one of the surveyed cells.
2016-03-16 12:05:51 -04:00
Tim Edwards c015bbe432 Merge branch 'master' into work 2015-12-07 15:01:42 -05:00
Tim Edwards 7a87a6f0d9 Update at Mon Dec 7 15:01:41 EST 2015 by tim 2015-12-07 15:01:41 -05:00
Tim Edwards 5e3cf08bfb Corrected calls from the non-Tcl/Tk version to routines which have
been modified in the Tcl/Tk version to take an additional argument
for the file number.  In the non-Tcl/Tk-compatibility mode, netgen
should operate in a backwards-compatibility mode with filenum = -1.
2015-12-07 14:59:54 -05:00
27 changed files with 1602 additions and 2922 deletions
+2
View File
@@ -3,6 +3,8 @@
.inca.db.*
inca.*.pak
*.swp
*.log
*.so
*~
*/av_extracted*/
.nfs*
+1 -1
View File
@@ -1 +1 @@
1.5.47
1.5.55
+5 -5
View File
@@ -39,7 +39,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#define ACTELHASHSIZE 99
static long actelhashbase = 0xA00;
static struct hashlist *actelnametab[ACTELHASHSIZE];
static struct hashdict actelnamedict;
static FILE *actelfile;
char *ActelName(char *Name);
@@ -53,16 +53,16 @@ void PrintActelNames(char *filename)
{
if (filename == NULL) actelfile = stdout;
else actelfile = fopen(filename,"w");
RecurseHashTable(actelnametab, ACTELHASHSIZE, PrintActelName);
RecurseHashTable(&actelnamedict, PrintActelName);
if (actelfile != stdout) fclose(actelfile);
}
long ActelNameHash(char *name)
/* hashes name into nametab if necessary, then returns address of entry */
/* hashes name into namedict if necessary, then returns address of entry */
{
struct hashlist *p;
p = HashInstall(name, actelnametab, ACTELHASHSIZE);
p = HashInstall(name, &actelnamedict);
if (p == NULL) return(0);
if (p->ptr != NULL) return ((long)(p->ptr));
actelhashbase++;
@@ -403,7 +403,7 @@ void Actel(char *name, char *filename)
return;
}
ClearDumpedList();
InitializeHashTable(actelnametab, ACTELHASHSIZE);
InitializeHashTable(&actelnamedict, ACTELHASHSIZE);
if (LookupCell(name) != NULL)
actelCell(name);
CloseFile(FileName);
+3 -3
View File
@@ -544,10 +544,10 @@ void simCell(char *name, int filenum)
if (ob2 && ob2->type == PROPERTY) {
struct property *kl;
struct valuelist *vl;
kl = (struct property *)HashLookup("length", tp2->proptab, OBJHASHSIZE);
kl = (struct property *)HashLookup("length", &(tp2->propdict));
vl = (struct valuelist *)ob2->instance.name;
l = 1.0e6 * vl[kl->idx].value.dval; /* m -> um */
kl = (struct property *)HashLookup("width", tp2->proptab, OBJHASHSIZE);
kl = (struct property *)HashLookup("width", &(tp2->propdict));
w = 1.0e6 * vl[kl->idx].value.dval; /* m -> um */
}
FlushString(" %g %g\n", l, w);
@@ -579,7 +579,7 @@ void simCell(char *name, int filenum)
if (ob2 && ob2->type == PROPERTY) {
struct property *kl;
struct valuelist *vl;
kl = (struct property *)HashLookup("value", tp2->proptab, OBJHASHSIZE);
kl = (struct property *)HashLookup("value", &(tp2->propdict));
vl = (struct valuelist *)ob2->instance.name;
if (tp2->class == CLASS_CAP)
v = 1.0e15 * vl[kl->idx].value.dval; /* F -> fF */
+780 -66
View File
File diff suppressed because it is too large Load Diff
+134 -71
View File
@@ -33,22 +33,25 @@ unsigned long (*hashfunc)(char *, int) = NULL;
int (*matchfunc)(char *, char *) = NULL;
int (*matchintfunc)(char *, char *, int, int) = NULL;
void InitializeHashTable(struct hashlist **tab, int size)
void InitializeHashTable(struct hashdict *dict, int size)
{
int i;
for (i = 0; i < size; i++) tab[i] = NULL;
struct hashlist **hashtab;
dict->hashtab = (struct hashlist **)CALLOC(size, sizeof(struct hashlist *));
dict->hashsize = size;
dict->hashfirstindex = 0;
dict->hashfirstptr = NULL;
}
int RecurseHashTable(struct hashlist **hashtab, int hashsize,
int (*func)(struct hashlist *elem))
int RecurseHashTable(struct hashdict *dict, int (*func)(struct hashlist *elem))
/* returns the sum of the return values of (*func) */
{
int i, sum;
struct hashlist *p;
sum = 0;
for (i = 0; i < hashsize; i++)
for (p = hashtab[i]; p != NULL; p = p->next)
for (i = 0; i < dict->hashsize; i++)
for (p = dict->hashtab[i]; p != NULL; p = p->next)
sum += (*func)(p);
return(sum);
}
@@ -57,15 +60,15 @@ int RecurseHashTable(struct hashlist **hashtab, int hashsize,
* type int value to the function.
*/
int RecurseHashTableValue(struct hashlist **hashtab, int hashsize,
int RecurseHashTableValue(struct hashdict *dict,
int (*func)(struct hashlist *elem, int), int value)
{
int i, sum;
struct hashlist *p;
sum = 0;
for (i = 0; i < hashsize; i++)
for (p = hashtab[i]; p != NULL; p = p->next)
for (i = 0; i < dict->hashsize; i++)
for (p = dict->hashtab[i]; p != NULL; p = p->next)
sum += (*func)(p, value);
return(sum);
}
@@ -76,7 +79,7 @@ int RecurseHashTableValue(struct hashlist **hashtab, int hashsize,
* function through that structure.
*/
struct nlist *RecurseHashTablePointer(struct hashlist **hashtab, int hashsize,
struct nlist *RecurseHashTablePointer(struct hashdict *dict,
struct nlist *(*func)(struct hashlist *elem, void *),
void *pointer)
{
@@ -84,8 +87,8 @@ struct nlist *RecurseHashTablePointer(struct hashlist **hashtab, int hashsize,
struct hashlist *p;
struct nlist *tp;
for (i = 0; i < hashsize; i++) {
for (p = hashtab[i]; p != NULL; p = p->next) {
for (i = 0; i < dict->hashsize; i++) {
for (p = dict->hashtab[i]; p != NULL; p = p->next) {
tp = (*func)(p, pointer);
if (tp != NULL) return tp;
}
@@ -150,19 +153,28 @@ unsigned long hash(char *s, int hashsize)
return (hashsize == 0) ? hashval : (hashval % hashsize);
}
unsigned long genhash(char *s, int c, int hashsize)
{
unsigned long hashval;
for (hashval = (unsigned long)c; *s != '\0'; )
hashval = (*s++) + (hashval << 6) + (hashval << 16) - hashval;
return (hashsize == 0) ? hashval : (hashval % hashsize);
}
/*----------------------------------------------------------------------*/
/* HashLookup -- */
/* return the 'ptr' field of the hash table entry, or NULL if not found */
/*----------------------------------------------------------------------*/
void *HashLookup(char *s, struct hashlist **hashtab, int hashsize)
void *HashLookup(char *s, struct hashdict *dict)
{
struct hashlist *np;
unsigned long hashval;
hashval = (*hashfunc)(s, hashsize);
hashval = (*hashfunc)(s, dict->hashsize);
for (np = hashtab[hashval]; np != NULL; np = np->next)
for (np = dict->hashtab[hashval]; np != NULL; np = np->next)
if ((*matchfunc)(s, np->name)) return (np->ptr); /* correct match */
return (NULL); /* not found */
}
@@ -174,14 +186,14 @@ void *HashLookup(char *s, struct hashlist **hashtab, int hashsize)
/* passed integer value i */
/*----------------------------------------------------------------------*/
void *HashIntLookup(char *s, int i, struct hashlist **hashtab, int hashsize)
void *HashIntLookup(char *s, int i, struct hashdict *dict)
{
struct hashlist *np;
unsigned long hashval;
hashval = (*hashfunc)(s, hashsize);
hashval = (*hashfunc)(s, dict->hashsize);
for (np = hashtab[hashval]; np != NULL; np = np->next) {
for (np = dict->hashtab[hashval]; np != NULL; np = np->next) {
if (np->ptr == NULL) {
if ((*matchintfunc)(s, np->name, i, -1))
return NULL;
@@ -195,17 +207,37 @@ void *HashIntLookup(char *s, int i, struct hashlist **hashtab, int hashsize)
}
/*----------------------------------------------------------------------*/
/* return the hashlist entry, after (re)initializing its 'ptr' field */
/* Similar to HashIntLookup, but HashInt2Lookup adds the integer c as */
/* part of the hash, using a special hash function to hash the char */
/* first, then the character string. */
/*----------------------------------------------------------------------*/
struct hashlist *HashPtrInstall(char *name, void *ptr,
struct hashlist **hashtab, int hashsize)
void *HashInt2Lookup(char *s, int c, struct hashdict *dict)
{
struct hashlist *np;
unsigned long hashval;
hashval = (*hashfunc)(name,hashsize);
for (np = hashtab[hashval]; np != NULL; np = np->next)
hashval = genhash(s, c, dict->hashsize);
for (np = dict->hashtab[hashval]; np != NULL; np = np->next)
if (!strcmp(s, np->name))
return (np->ptr); /* correct match */
return (NULL); /* not found */
}
/*----------------------------------------------------------------------*/
/* return the hashlist entry, after (re)initializing its 'ptr' field */
/*----------------------------------------------------------------------*/
struct hashlist *HashPtrInstall(char *name, void *ptr, struct hashdict *dict)
{
struct hashlist *np;
unsigned long hashval;
hashval = (*hashfunc)(name, dict->hashsize);
for (np = dict->hashtab[hashval]; np != NULL; np = np->next)
if ((*matchfunc)(name, np->name)) {
np->ptr = ptr;
return (np); /* match found in hash table */
@@ -216,8 +248,8 @@ struct hashlist *HashPtrInstall(char *name, void *ptr,
return (NULL);
if ((np->name = strsave(name)) == NULL) return (NULL);
np->ptr = ptr;
np->next = hashtab[hashval];
return(hashtab[hashval] = np);
np->next = dict->hashtab[hashval];
return(dict->hashtab[hashval] = np);
}
/*----------------------------------------------------------------------*/
@@ -226,13 +258,13 @@ struct hashlist *HashPtrInstall(char *name, void *ptr,
/*----------------------------------------------------------------------*/
struct hashlist *HashIntPtrInstall(char *name, int value, void *ptr,
struct hashlist **hashtab, int hashsize)
struct hashdict *dict)
{
struct hashlist *np;
unsigned long hashval;
hashval = (*hashfunc)(name,hashsize);
for (np = hashtab[hashval]; np != NULL; np = np->next)
hashval = (*hashfunc)(name, dict->hashsize);
for (np = dict->hashtab[hashval]; np != NULL; np = np->next)
if ((*matchintfunc)(name, np->name, value, (int)(*((int *)np->ptr)))) {
np->ptr = ptr;
return (np); /* match found in hash table */
@@ -243,27 +275,57 @@ struct hashlist *HashIntPtrInstall(char *name, int value, void *ptr,
return (NULL);
if ((np->name = strsave(name)) == NULL) return (NULL);
np->ptr = ptr;
np->next = hashtab[hashval];
return(hashtab[hashval] = np);
np->next = dict->hashtab[hashval];
return(dict->hashtab[hashval] = np);
}
/*----------------------------------------------------------------------*/
/* And the following is used with HashInt2. */
/*----------------------------------------------------------------------*/
struct hashlist *HashInt2PtrInstall(char *name, int c, void *ptr,
struct hashdict *dict)
{
struct hashlist *np;
unsigned long hashval;
hashval = genhash(name, c, dict->hashsize);
for (np = dict->hashtab[hashval]; np != NULL; np = np->next)
if (!strcmp(name, np->name)) {
np->ptr = ptr;
return (np); /* match found in hash table */
}
/* not in table, so install it */
if ((np = (struct hashlist *) CALLOC(1,sizeof(struct hashlist))) == NULL)
return (NULL);
if ((np->name = strsave(name)) == NULL) return (NULL);
np->ptr = ptr;
np->next = dict->hashtab[hashval];
return(dict->hashtab[hashval] = np);
}
/*----------------------------------------------------------------------*/
/* destroy a hash table, freeing associated memory */
/*----------------------------------------------------------------------*/
void *HashKill(struct hashlist **hashtab, int hashsize)
void *HashKill(struct hashdict *dict)
{
struct hashlist *np, *p;
int i;
for (i = 0; i < hashsize; i++) {
for (p = hashtab[i]; p != NULL; ) {
if (dict->hashtab == NULL) return; // Hash not initialized
for (i = 0; i < dict->hashsize; i++) {
for (p = dict->hashtab[i]; p != NULL; ) {
np = p->next;
FREE(p->name);
FREE(p);
p = np;
}
}
FREE(dict->hashtab);
dict->hashtab = NULL;
}
/*----------------------------------------------------------------------*/
@@ -271,14 +333,13 @@ void *HashKill(struct hashlist **hashtab, int hashsize)
/* to the new hash entry. */
/*----------------------------------------------------------------------*/
struct hashlist *HashInstall(char *name,
struct hashlist **hashtab, int hashsize)
struct hashlist *HashInstall(char *name, struct hashdict *dict)
{
struct hashlist *np;
unsigned long hashval;
hashval = (*hashfunc)(name,hashsize);
for (np = hashtab[hashval]; np != NULL; np = np->next)
hashval = (*hashfunc)(name, dict->hashsize);
for (np = dict->hashtab[hashval]; np != NULL; np = np->next)
if ((*matchfunc)(name, np->name)) return (np); /* match found in hash table */
/* not in table, so install it */
@@ -286,27 +347,27 @@ struct hashlist *HashInstall(char *name,
return (NULL);
if ((np->name = strsave(name)) == NULL) return (NULL);
np->ptr = NULL;
np->next = hashtab[hashval];
return(hashtab[hashval] = np);
np->next = dict->hashtab[hashval];
return(dict->hashtab[hashval] = np);
}
/*----------------------------------------------------------------------*/
/* frees a hash table entry, (but not the 'ptr' field) */
/*----------------------------------------------------------------------*/
void HashDelete(char *name, struct hashlist **hashtab, int hashsize)
void HashDelete(char *name, struct hashdict *dict)
{
unsigned long hashval;
struct hashlist *np;
struct hashlist *np2;
hashval = (*hashfunc)(name, hashsize);
np = hashtab[hashval];
hashval = (*hashfunc)(name, dict->hashsize);
np = dict->hashtab[hashval];
if (np == NULL) return;
if ((*matchfunc)(name, np->name)) {
/* it is the first element in the list */
hashtab[hashval] = np->next;
dict->hashtab[hashval] = np->next;
FREE(np->name);
FREE(np);
return;
@@ -329,19 +390,19 @@ void HashDelete(char *name, struct hashlist **hashtab, int hashsize)
/* HashDelete with additional integer value matching */
/*----------------------------------------------------------------------*/
void HashIntDelete(char *name, int value, struct hashlist **hashtab, int hashsize)
void HashIntDelete(char *name, int value, struct hashdict *dict)
{
unsigned long hashval;
struct hashlist *np;
struct hashlist *np2;
hashval = (*hashfunc)(name, hashsize);
np = hashtab[hashval];
hashval = (*hashfunc)(name, dict->hashsize);
np = dict->hashtab[hashval];
if (np == NULL) return;
if ((*matchintfunc)(name, np->name, value, (int)(*((int *)np->ptr)))) {
/* it is the first element in the list */
hashtab[hashval] = np->next;
dict->hashtab[hashval] = np->next;
FREE(np->name);
FREE(np);
return;
@@ -361,33 +422,35 @@ void HashIntDelete(char *name, int value, struct hashlist **hashtab, int hashsiz
}
}
/*----------------------------------------------------------------------*/
/* Hash key iterator */
/* returns 'ptr' field of next element, NULL when done */
/*----------------------------------------------------------------------*/
static int hashfirstindex; /* was long */
static struct hashlist *hashfirstptr;
void *HashNext(struct hashlist **hashtab, int hashsize)
/* returns 'ptr' field of next element, NULL when done */
void *HashNext(struct hashdict *dict)
{
if (hashfirstptr != NULL && hashfirstptr->next != NULL) {
hashfirstptr = hashfirstptr->next;
return(hashfirstptr->ptr);
}
while (hashfirstindex < hashsize) {
if ((hashfirstptr = hashtab[hashfirstindex++]) != NULL) {
return(hashfirstptr->ptr);
}
}
hashfirstindex = 0;
hashfirstptr = NULL;
return(NULL);
if (dict->hashfirstptr != NULL && dict->hashfirstptr->next != NULL) {
dict->hashfirstptr = dict->hashfirstptr->next;
return(dict->hashfirstptr->ptr);
}
while (dict->hashfirstindex < dict->hashsize) {
if ((dict->hashfirstptr = dict->hashtab[dict->hashfirstindex++]) != NULL) {
return(dict->hashfirstptr->ptr);
}
}
dict->hashfirstindex = 0;
dict->hashfirstptr = NULL;
return(NULL);
}
void *HashFirst(struct hashlist **hashtab, int hashsize)
/*----------------------------------------------------------------------*/
/* Hash key iterator setup */
/*----------------------------------------------------------------------*/
void *HashFirst(struct hashdict *dict)
{
hashfirstindex = 0;
hashfirstptr = NULL;
return(HashNext(hashtab,hashsize));
dict->hashfirstindex = 0;
dict->hashfirstptr = NULL;
return HashNext(dict);
}
+26 -17
View File
@@ -7,35 +7,44 @@ struct hashlist {
struct hashlist *next;
};
extern void InitializeHashTable(struct hashlist **tab, int size);
extern int RecurseHashTable(struct hashlist **hashtab, int hashsize,
struct hashdict {
int hashsize;
int hashfirstindex;
struct hashlist *hashfirstptr;
struct hashlist **hashtab;
};
extern void InitializeHashTable(struct hashdict *dict, int size);
extern int RecurseHashTable(struct hashdict *dict,
int (*func)(struct hashlist *elem));
extern int RecurseHashTableValue(struct hashlist **hashtab, int hashsize,
extern int RecurseHashTableValue(struct hashdict *dict,
int (*func)(struct hashlist *elem, int), int);
extern struct nlist *RecurseHashTablePointer(struct hashlist **hashtab,
int hashsize, struct nlist *(*func)(struct hashlist *elem,
void *), void *pointer);
extern struct nlist *RecurseHashTablePointer(struct hashdict *dict,
struct nlist *(*func)(struct hashlist *elem, void *),
void *pointer);
extern void HashDelete(char *name, struct hashdict *dict);
extern void HashIntDelete(char *name, int value, struct hashdict *dict);
extern int CountHashTableEntries(struct hashlist *p);
extern int CountHashTableBinsUsed(struct hashlist *p);
extern void HashDelete(char *name, struct hashlist **hashtab, int hashsize);
extern void HashIntDelete(char *name, int value, struct hashlist **hashtab,
int hashsize);
/* these functions return a pointer to a hash list element */
extern struct hashlist *HashInstall(char *name, struct hashlist **hashtab,
int hashsize);
extern struct hashlist *HashInstall(char *name, struct hashdict *dict);
extern struct hashlist *HashPtrInstall(char *name, void *ptr,
struct hashlist **hashtab, int hashsize);
struct hashdict *dict);
extern struct hashlist *HashIntPtrInstall(char *name, int value, void *ptr,
struct hashlist **hashtab, int hashsize);
struct hashdict *dict);
extern struct hashlist *HashInt2PtrInstall(char *name, int c, void *ptr,
struct hashdict *dict);
/* these functions return the ->ptr field of a struct hashlist */
extern void *HashLookup(char *s, struct hashlist **hashtab, int hashsize);
extern void *HashIntLookup(char *s, int i, struct hashlist **hashtab, int hashsize);
extern void *HashFirst(struct hashlist **hashtab, int hashsize);
extern void *HashNext(struct hashlist **hashtab, int hashsize);
extern void *HashLookup(char *s, struct hashdict *dict);
extern void *HashIntLookup(char *s, int i, struct hashdict *dict);
extern void *HashInt2Lookup(char *s, int c, struct hashdict *dict);
extern void *HashFirst(struct hashdict *dict);
extern void *HashNext(struct hashdict *dict);
extern unsigned long hashnocase(char *s, int hashsize);
extern unsigned long hash(char *s, int hashsize);
+192 -54
View File
@@ -2486,14 +2486,16 @@ int FirstElementPass(struct Element *E, int noflat)
if (Ecorr->hashval == 0) {
if (Ecorr->graph == Circuit2->file) {
tp = LookupCellFile(Ecorr->object->model.class, Circuit2->file);
if (tp == tp2) {
// if (tp == tp2) {
if (tp && tp2 && (tp->classhash == tp2->classhash)) {
Ecorr->hashval = 1;
C2++;
}
}
else if (Ecorr->graph == Circuit1->file) {
tp = LookupCellFile(Ecorr->object->model.class, Circuit1->file);
if (tp == tp1) {
// if (tp == tp1) {
if (tp && tp1 && (tp->classhash == tp1->classhash)) {
Ecorr->hashval = 1;
C1++;
}
@@ -2535,7 +2537,8 @@ int FirstElementPass(struct Element *E, int noflat)
if (Ecorr->hashval == 0) {
if (Ecorr->graph == Circuit2->file) {
tp = LookupCellFile(Ecorr->object->model.class, Circuit2->file);
if (tp == tp2) {
// if (tp == tp2) {
if (tp->classhash == tp2->classhash) {
Ecorr->hashval = 1;
C2++;
}
@@ -2648,8 +2651,14 @@ void MatchFail(char *name1, char *name2)
tc1 = LookupCell(name1);
tc2 = LookupCell(name2);
tc1->flags &= ~CELL_MATCHED;
tc2->flags &= ~CELL_MATCHED;
if (!(tc1->flags & CELL_DUPLICATE) && !(tc2->flags & CELL_DUPLICATE)) {
tc1->flags &= ~CELL_MATCHED;
tc2->flags &= ~CELL_MATCHED;
}
else if (tc1->flags & CELL_DUPLICATE)
tc1->flags &= ~CELL_MATCHED;
else if (tc2->flags & CELL_DUPLICATE)
tc2->flags &= ~CELL_MATCHED;
}
/*--------------------------------------------------------------*/
@@ -2666,7 +2675,7 @@ int FlattenUnmatched(struct nlist *tc, char *parent, int stoplevel, int loclevel
Fprintf(stdout, "Flattening unmatched subcell %s in circuit %s ",
tc->name, parent);
changed = flattenInstancesOf(parent, tc->file, tc->name);
Fprintf(stdout, "(%d instances)\n", changed);
Fprintf(stdout, "(%d instance%s)\n", changed, ((changed == 1) ? "" : "s"));
return 1;
}
@@ -2674,8 +2683,8 @@ int FlattenUnmatched(struct nlist *tc, char *parent, int stoplevel, int loclevel
changed = 1;
while (changed) {
changed = 0;
for (ob = tc->cell; ob != NULL; ob = ob->next) {
changed = 0;
tcsub = NULL;
if (ob->type == FIRSTPIN) {
/* First check if there is a class equivalent */
@@ -2722,9 +2731,16 @@ void DescendCompareQueue(struct nlist *tc, struct nlist *tctop, int stoplevel,
struct nlist *tcsub, *tc2, *tctest;
struct objlist *ob;
struct Correspond *scomp, *newcomp;
char *sdup = NULL;
if (loclevel == stoplevel && !(tc->flags & CELL_MATCHED)) {
// Any duplicate cell should be name-matched against a non-duplicate
if (tc->flags & CELL_DUPLICATE) {
sdup = strstr(tc->name, "[[");
if (sdup) *sdup = '\0';
}
// Find exact-name equivalents or cells that have been specified
// as equivalent using the "equate class" command.
@@ -2742,10 +2758,15 @@ void DescendCompareQueue(struct nlist *tc, struct nlist *tctop, int stoplevel,
if (tc2 != NULL) {
tctest = LookupPrematchedClass(tc2, tc->file);
if (tctest != NULL && tctest != tc) return;
if (tctest != NULL && tctest != tc) {
if (sdup) *sdup = '[';
return;
}
}
}
if (sdup) *sdup = '[';
if (tc2 != NULL) {
newcomp = (struct Correspond *)CALLOC(1, sizeof(struct Correspond));
newcomp->next = NULL;
@@ -3243,6 +3264,10 @@ int Iterate(void)
/* return the number of mismatched properties (0 = perfect */
/* match of all properties, or there were no properties to */
/* compare). */
/* */
/* NOTE: ob1 must belong to Circuit1, and ob2 must belong to */
/* Circuit2. The calling procedure is responsble for ensuring */
/* that this is true. */
/*--------------------------------------------------------------*/
int PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print)
@@ -3268,8 +3293,8 @@ int PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print)
/* Check if there are any properties to match */
if ((tp1 == NULL) && (tp2 == NULL)) return 0;
if (tp1 != NULL) t1type = tp1->type;
if (tp2 != NULL) t2type = tp2->type;
t1type = (tp1 != NULL) ? tp1->type : 0;
t2type = (tp2 != NULL) ? tp2->type : 0;
if (tp1 == NULL)
if (t2type != PROPERTY) return 0;
@@ -3278,8 +3303,10 @@ int PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print)
if (t1type != PROPERTY) return 0;
// Sanity check---shouldn't happen
if ((t1type == PROPERTY) && (tp1->instance.props == NULL)) t1type = UNKNOWN;
if ((t2type == PROPERTY) && (tp2->instance.props == NULL)) t2type = UNKNOWN;
if (tp1 && (t1type == PROPERTY) && (tp1->instance.props == NULL))
t1type = UNKNOWN;
if (tp2 && (t2type == PROPERTY) && (tp2->instance.props == NULL))
t2type = UNKNOWN;
if ((t1type != PROPERTY) && (t2type != PROPERTY)) return 0;
@@ -3292,7 +3319,7 @@ int PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print)
if (vl2->type == PROP_ENDLIST) break;
if (vl2 == NULL) continue;
if (vl2->key == NULL) continue;
kl2 = (struct property *)HashLookup(vl2->key, tc2->proptab, OBJHASHSIZE);
kl2 = (struct property *)HashLookup(vl2->key, &(tc2->propdict));
if (kl2 != NULL) break; // Property is required
else if ((*matchfunc)(vl2->key, "M")) {
if (vl2->type == PROP_INTEGER)
@@ -3300,8 +3327,8 @@ int PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print)
}
}
if (vl2->type != PROP_ENDLIST) {
if (do_print) Fprintf(stdout, "Circuit 2 %s instance %s does not"
" define required properties.\n",
if (do_print) Fprintf(stdout, "Circuit 2 %s instance %s missing"
" required properties.\n",
Circuit2->name, ob2->instance.name);
return -1;
}
@@ -3317,7 +3344,7 @@ int PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print)
if (vl1->type == PROP_ENDLIST) break;
if (vl1 == NULL) continue;
if (vl1->key == NULL) continue;
kl1 = (struct property *)HashLookup(vl1->key, tc1->proptab, OBJHASHSIZE);
kl1 = (struct property *)HashLookup(vl1->key, &(tc1->propdict));
if (kl1 != NULL) break; // Property is required
else if ((*matchfunc)(vl1->key, "M")) {
if (vl1->type == PROP_INTEGER)
@@ -3325,8 +3352,8 @@ int PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print)
}
}
if (vl1->type != PROP_ENDLIST) {
if (do_print) Fprintf(stdout, "Circuit 1 %s instance %s does not"
" define required properties.\n",
if (do_print) Fprintf(stdout, "Circuit 1 %s instance %s missing"
" required properties.\n",
Circuit1->name, ob1->instance.name);
return -1;
}
@@ -3342,7 +3369,7 @@ int PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print)
if (vl1->key == NULL) continue;
/* Check if this is a "property of interest". */
kl1 = (struct property *)HashLookup(vl1->key, tc1->proptab, OBJHASHSIZE);
kl1 = (struct property *)HashLookup(vl1->key, &(tc1->propdict));
if (kl1 == NULL) continue;
/* Find the matching property in vl2. With luck, they're in order. */
@@ -3359,9 +3386,17 @@ int PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print)
if (vl2->key == NULL) continue;
/* Both device classes must agree on the properties to compare */
kl2 = (struct property *)HashLookup(vl2->key, tc2->proptab, OBJHASHSIZE);
kl2 = (struct property *)HashLookup(vl2->key, &(tc2->propdict));
if (kl2 == NULL) continue;
/* Watch out for uninitialized entries in cell def */
if (vl1->type == vl2->type) {
if (kl1->type == PROP_STRING && kl1->pdefault.string == NULL)
SetPropertyDefault(kl1, vl1);
if (kl2->type == PROP_STRING && kl2->pdefault.string == NULL)
SetPropertyDefault(kl2, vl2);
}
if (vl1->type != vl2->type) {
if (kl1->type != vl1->type) PromoteProperty(kl1, vl1);
if (kl2->type != vl2->type) PromoteProperty(kl2, vl2);
@@ -3737,7 +3772,11 @@ int ResolveAutomorphsByProperty()
badmatch = FALSE;
for (E2 = E1->next; E2 != NULL; E2 = E2->next) {
if (E2->hashval != orighash) continue;
result = PropertyMatch(E1->object, E2->object, FALSE);
if (E2->graph == E1->graph) continue;
if (E1->graph == Circuit1->file)
result = PropertyMatch(E1->object, E2->object, FALSE);
else
result = PropertyMatch(E2->object, E1->object, FALSE);
if (result == 0) {
E2->hashval = newhash;
if (E2->graph == E1->graph)
@@ -4309,7 +4348,9 @@ int EquivalenceClasses(char *name1, int file1, char *name2, int file2)
{
char *class1, *class2;
struct Correspond *newc;
struct nlist *tp, *tp2;
struct nlist *tp, *tp2, *tpx;
unsigned char need_new_seed = 0;
int reverse = 0;
if (file1 != -1 && file2 != -1) {
@@ -4319,7 +4360,49 @@ int EquivalenceClasses(char *name1, int file1, char *name2, int file2)
tp = LookupCellFile(name1, file1);
tp2 = LookupCellFile(name2, file2);
tp2->classhash = tp->classhash;
if (tp->classhash == tp2->classhash)
return 1; /* Already equivalent */
/* Where cells with duplicate cell names have been checked and */
/* found to be equivalent, the original keeps the hash value. */
if (tp->flags & CELL_DUPLICATE)
reverse = 1;
/* Do a cross-check for each name in the other netlist. If */
/* conflicting names exist, then alter the classhash to make it */
/* unique. In the case of duplicate cells, don't do this. */
if (!(tp->flags & CELL_DUPLICATE) && !(tp2->flags & CELL_DUPLICATE)) {
tpx = LookupCellFile(name1, file2);
if (tpx != NULL) need_new_seed = 1;
tpx = LookupCellFile(name2, file1);
if (tpx != NULL) need_new_seed = 1;
}
/* Now make the classhash values the same so that these cells */
/* are indistinguishable by the netlist comparator. */
if (need_new_seed == 1) {
char *altname;
while (need_new_seed == 1) {
altname = (char *)MALLOC(strlen(name1) + 2);
sprintf(altname, "%s%c", name1, (char)(65 + Random(26)));
tp->classhash = (*hashfunc)(altname, 0);
/* Make sure randomly-altered name is not in any netlist */
if ((LookupCellFile(altname, file1) == NULL) &&
(LookupCellFile(altname, file2) == NULL))
need_new_seed = 0;
FREE(altname);
}
}
if (reverse)
tp->classhash = tp2->classhash;
else
tp2->classhash = tp->classhash;
return 1;
}
@@ -4383,10 +4466,21 @@ int reorderpins(struct hashlist *p, int file)
firstpin = ob;
ob2 = tc2->cell;
for (i = 0; i < numports; i++) {
nodes[ob2->model.port] = ob->node;
names[ob2->model.port] = ob->name;
if (ob2->model.port >= numports) {
Fprintf(stderr, "Port number %d greater than number "
"of ports %d\n", ob2->model.port + 1, numports);
}
else {
nodes[ob2->model.port] = ob->node;
names[ob2->model.port] = ob->name;
}
ob = ob->next;
ob2 = ob2->next;
if (ob == NULL) {
Fprintf(stderr, "Instance of %s has only %d of %d ports\n",
tc2->name, i + 1, numports);
break;
}
}
ob = firstpin;
@@ -4399,9 +4493,10 @@ int reorderpins(struct hashlist *p, int file)
ob->node = nodes[i];
ob->name = names[i];
}
HashPtrInstall(ob->name, ob, ptr->objtab, OBJHASHSIZE);
HashPtrInstall(ob->name, ob, &(ptr->objdict));
ob = ob->next;
names[i] = NULL;
if (ob == NULL) break; // Error message already output
}
}
else
@@ -4477,12 +4572,11 @@ struct nlist *addproxies(struct hashlist *p, void *clientdata)
lob = obn;
// Hash the new pin record for "LookupObject()"
HashPtrInstall(obn->name, obn, ptr->objtab, OBJHASHSIZE);
HashPtrInstall(obn->name, obn, &(ptr->objdict));
if (tob == tc->cell) {
// Rehash the instance in insttab
HashPtrInstall(firstpin->instance.name, firstpin,
ptr->insttab, OBJHASHSIZE);
// Rehash the instance in instdict
HashPtrInstall(firstpin->instance.name, firstpin, &(ptr->instdict));
}
}
else {
@@ -4506,7 +4600,7 @@ struct nlist *addproxies(struct hashlist *p, void *clientdata)
obn->next = NULL;
lob->next = obn;
lob = obn;
HashPtrInstall(obn->name, obn, ptr->objtab, OBJHASHSIZE);
HashPtrInstall(obn->name, obn, &(ptr->objdict));
}
// We messed with the node name list, so have to re-cache them
@@ -4697,7 +4791,42 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2)
}
}
/* Find the end of the pin list in tc1 */
/* Do any unmatched pins have the same name? */
/* (This should not happen if unconnected pins are eliminated) */
ob1 = tc1->cell;
for (i = 0; i < numorig; i++) {
if (*(cover + i) == (char)0) {
j = 0;
for (ob2 = tc2->cell; ob2 != NULL; ob2 = ob2->next) {
if (!IsPort(ob2)) break;
if ((*matchfunc)(ob1->name, ob2->name)) {
ob2->model.port = i; /* save order */
*(cover + i) = (char)1;
if (Debug == 0) {
for (m = 0; m < 43; m++) *(ostr + m) = ' ';
for (m = 44; m < 87; m++) *(ostr + m) = ' ';
sprintf(ostr, "%s", ob1->name);
sprintf(ostr + 44, "%s", ob2->name);
for (m = 0; m < 88; m++)
if (*(ostr + m) == '\0') *(ostr + m) = ' ';
Fprintf(stdout, ostr);
}
else {
Fprintf(stdout, "Circuit %s port %d \"%s\""
" = cell %s port %d \"%s\"\n",
tc1->name, i, ob1->name,
tc2->name, j, ob2->name);
}
}
j++;
}
}
ob1 = ob1->next;
}
/* Find the end of the pin list in tc1, for adding proxy pins */
for (ob1 = tc1->cell; ob1 != NULL; ob1 = ob1->next) {
if (ob1 && ob1->next && ob1->next->type != PORT)
@@ -4764,33 +4893,25 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2)
ob1 = obn;
hasproxy1 = 1;
HashPtrInstall(obn->name, obn, tc1->objtab, OBJHASHSIZE);
HashPtrInstall(obn->name, obn, &(tc1->objdict));
}
}
/* Find the end of the pin list in tc2, for adding proxy pins */
for (ob2 = tc2->cell; ob2 != NULL; ob2 = ob2->next) {
if (ob2 && ob2->next && ob2->next->type != PORT)
break;
}
/* If cell 2 has fewer nodes than cell 1, then add dummy (unconnected) */
/* pins to cell 2. If these correspond to numbers missing in the match */
/* sequence, then fill in the missing numbers. Otherwise, add the */
/* extra nodes to the end. */
j = 0;
for (ob2 = tc2->cell; ob2 != NULL; ob2 = ob2->next) {
j++;
if (ob2->next->type != PORT) break;
}
if (numnodes > numorig) {
ctemp = (char *)CALLOC(numnodes, sizeof(char));
for (i = 0; i < numorig; i++)
ctemp[i] = cover[i];
FREE(cover);
cover = ctemp;
}
i = 0;
while (j < numnodes) {
while (*(cover + i) != (char)0) i++;
if (i >= numnodes) break;
for (i = 0; i < numorig; i++) {
if (*(cover + i) == (char)1) continue;
/* If the equivalent node in tc1 is not disconnected */
/* (node != -1) then we should report a match error, */
@@ -4801,6 +4922,14 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2)
for (k = i; k > 0 && ob1 != NULL; k--)
ob1 = ob1->next;
if (ob1 == NULL || ob1->type != PORT || ob1->node >= 0) {
/* Check if ob1->node might really be disconnected */
for (obn = ob1->next; obn; obn = obn->next) {
if (obn->node == ob1->node) break;
}
if (obn == NULL) ob1->node = -1; /* Make disconnected */
}
if (ob1 == NULL || ob1->type != PORT || ob1->node >= 0) {
/* Add a proxy pin to tc2 */
@@ -4814,7 +4943,7 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2)
sprintf(obn->name, "proxy%s", ob1->name);
}
obn->type = UNKNOWN;
obn->model.port = i;
obn->model.port = (i - j);
obn->instance.name = NULL;
obn->node = -1;
obn->next = ob2->next;
@@ -4822,10 +4951,19 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2)
ob2 = obn;
hasproxy2 = 1;
HashPtrInstall(obn->name, obn, tc2->objtab, OBJHASHSIZE);
HashPtrInstall(obn->name, obn, &(tc2->objdict));
}
j++;
i++;
else if (ob1 != NULL && ob1->type == PORT) {
/* Disconnected node was not meaningful, has no pin match in */
/* the compared circuit, and so should be discarded. */
needclean1 = 1;
/* Adjust numbering around removed node */
for (ob2s = tc2->cell; ob2s != NULL && ob2s->type == PORT; ob2s = ob2s->next) {
if (ob2s->model.port > (i - j)) ob2s->model.port--;
}
j++;
}
}
FREE(cover);
+191 -67
View File
@@ -54,7 +54,7 @@ extern int errno; /* Defined in stdlib.h */
static char staticstrings[MAX_STATIC_STRINGS][200];
static int laststring;
extern struct hashlist **spiceparams; /* From spice.c */
extern struct hashdict spiceparams; /* From spice.c */
char *Str(char *format, ...)
{
@@ -168,12 +168,18 @@ struct tokstack *CopyTokStack(struct tokstack *stack)
/* value was successfully converted, 0 if there was no value to */
/* convert (empty string), and -1 if unable to convert the */
/* string to a value (e.g., unknown parameter name). */
/* */
/* Inheritance is taken from "parprops" (instanced property */
/* values) if available, and from parent->propdict if not, or */
/* if the property is not instanced. */
/*--------------------------------------------------------------*/
int TokGetValue(char *estr, struct nlist *parent, int glob, double *dval)
int TokGetValue(char *estr, struct nlist *parent, struct objlist *parprops,
int glob, double *dval)
{
struct property *kl = NULL;
int result;
struct valuelist *kv;
int i, result;
if (*estr == '\0') return 0;
@@ -188,18 +194,42 @@ int TokGetValue(char *estr, struct nlist *parent, int glob, double *dval)
if (glob == TRUE) {
/* Check global parameters */
if (spiceparams != NULL) {
kl = (struct property *)HashLookup(estr,
spiceparams, OBJHASHSIZE);
if (kl != NULL) {
result = ConvertStringToFloat(kl->pdefault.string, dval);
kl = (struct property *)HashLookup(estr, &spiceparams);
if (kl != NULL) {
result = ConvertStringToFloat(kl->pdefault.string, dval);
return ((result == 0) ? -1 : 1);
}
}
/* Check local instanced parameters */
result = 0;
if ((parprops != NULL) && (parprops->type == PROPERTY)) {
for (i = 0; ; i++) {
kv = &(parprops->instance.props[i]);
if (kv->type == PROP_ENDLIST) break;
else if ((*matchfunc)(estr, kv->key)) {
switch (kv->type) {
case PROP_STRING:
result = ConvertStringToFloat(kv->value.string, dval);
break;
case PROP_DOUBLE:
case PROP_VALUE:
*dval = kv->value.dval;
result = 1;
break;
case PROP_INTEGER:
*dval = (double)kv->value.ival;
result = 1;
break;
}
break;
}
}
}
else {
/* Check local parameters */
kl = (struct property *)HashLookup(estr,
parent->proptab, OBJHASHSIZE);
/* Check local parent parameters */
if (result == 0) {
kl = (struct property *)HashLookup(estr, &(parent->propdict));
if (kl != NULL) {
switch(kl->type) {
case PROP_STRING:
@@ -232,14 +262,14 @@ int TokGetValue(char *estr, struct nlist *parent, int glob, double *dval)
/* single value, then replace the property type. */
/*--------------------------------------------------------------*/
int ReduceExpressions(struct objlist *instprop,
int ReduceExpressions(struct objlist *instprop, struct objlist *parprops,
struct nlist *parent, int glob) {
struct tokstack *expstack, *stackptr, *lptr, *nptr;
struct valuelist *kv;
struct property *kl = NULL;
char *estr, *tstr, *sstr;
int toktype, functype, i, result, modified, numlast;
int toktype, functype, i, result, modified, numlast, savetok;
double dval;
if (instprop == NULL) return 0; // Nothing to do
@@ -249,7 +279,9 @@ int ReduceExpressions(struct objlist *instprop,
kv = &(instprop->instance.props[i]);
if (kv->type == PROP_EXPRESSION) {
if (kv->type == PROP_ENDLIST)
break;
else if (kv->type == PROP_EXPRESSION) {
expstack = kv->value.stack;
}
else if (kv->type == PROP_STRING) {
@@ -273,7 +305,7 @@ int ReduceExpressions(struct objlist *instprop,
}
/* Not a number, so must be arithmetic */
*tstr = '\0';
result = TokGetValue(estr, parent, glob, &dval);
result = TokGetValue(estr, parent, parprops, glob, &dval);
if (result == 1) PushTok(TOK_DOUBLE, &dval, &expstack);
else if (result == -1) PushTok(TOK_STRING, estr, &expstack);
PushTok(TOK_PLUS, NULL, &expstack);
@@ -293,7 +325,7 @@ int ReduceExpressions(struct objlist *instprop,
}
/* Not a number, so must be arithmetic */
*tstr = '\0';
result = TokGetValue(estr, parent, glob, &dval);
result = TokGetValue(estr, parent, parprops, glob, &dval);
if (result == 1) PushTok(TOK_DOUBLE, &dval, &expstack);
else if (result == -1) PushTok(TOK_STRING, estr, &expstack);
PushTok(TOK_MINUS, NULL, &expstack);
@@ -314,7 +346,7 @@ int ReduceExpressions(struct objlist *instprop,
case '/':
*tstr = '\0';
result = TokGetValue(estr, parent, glob, &dval);
result = TokGetValue(estr, parent, parprops, glob, &dval);
if (result == 1) PushTok(TOK_DOUBLE, &dval, &expstack);
else if (result == -1) PushTok(TOK_STRING, estr, &expstack);
PushTok(TOK_DIVIDE, NULL, &expstack);
@@ -324,7 +356,7 @@ int ReduceExpressions(struct objlist *instprop,
case '*':
*tstr = '\0';
result = TokGetValue(estr, parent, glob, &dval);
result = TokGetValue(estr, parent, parprops, glob, &dval);
if (result == 1) PushTok(TOK_DOUBLE, &dval, &expstack);
else if (result == -1) PushTok(TOK_STRING, estr, &expstack);
PushTok(TOK_MULTIPLY, NULL, &expstack);
@@ -343,7 +375,7 @@ int ReduceExpressions(struct objlist *instprop,
else {
/* Treat as a parenthetical grouping */
result = TokGetValue(estr, parent, glob, &dval);
result = TokGetValue(estr, parent, parprops, glob, &dval);
if (result == 1) PushTok(TOK_DOUBLE, &dval, &expstack);
else if (result == -1) PushTok(TOK_STRING, estr, &expstack);
PushTok(TOK_FUNC_OPEN, NULL, &expstack);
@@ -354,8 +386,15 @@ int ReduceExpressions(struct objlist *instprop,
case ')':
*tstr = '\0';
if (expstack == NULL) break;
switch (expstack->toktype) {
savetok = expstack->toktype;
result = TokGetValue(estr, parent, parprops, glob, &dval);
if (result == 1) PushTok(TOK_DOUBLE, &dval, &expstack);
else if (result == -1) PushTok(TOK_STRING, estr, &expstack);
switch (savetok) {
case TOK_FUNC_THEN:
PushTok(TOK_FUNC_ELSE, NULL, &expstack);
break;
@@ -369,7 +408,7 @@ int ReduceExpressions(struct objlist *instprop,
case '\'':
*tstr = '\0';
result = TokGetValue(estr, parent, glob, &dval);
result = TokGetValue(estr, parent, parprops, glob, &dval);
if (result == 1) PushTok(TOK_DOUBLE, &dval, &expstack);
else if (result == -1) PushTok(TOK_STRING, estr, &expstack);
PushTok(TOK_SGL_QUOTE, NULL, &expstack);
@@ -379,7 +418,7 @@ int ReduceExpressions(struct objlist *instprop,
case '"':
*tstr = '\0';
result = TokGetValue(estr, parent, glob, &dval);
result = TokGetValue(estr, parent, parprops, glob, &dval);
if (result == 1) PushTok(TOK_DOUBLE, &dval, &expstack);
else if (result == -1) PushTok(TOK_STRING, estr, &expstack);
PushTok(TOK_DBL_QUOTE, NULL, &expstack);
@@ -389,7 +428,7 @@ int ReduceExpressions(struct objlist *instprop,
case '{':
*tstr = '\0';
result = TokGetValue(estr, parent, glob, &dval);
result = TokGetValue(estr, parent, parprops, glob, &dval);
if (result == 1) PushTok(TOK_DOUBLE, &dval, &expstack);
else if (result == -1) PushTok(TOK_STRING, estr, &expstack);
PushTok(TOK_GROUP_OPEN, NULL, &expstack);
@@ -399,7 +438,7 @@ int ReduceExpressions(struct objlist *instprop,
case '}':
*tstr = '\0';
result = TokGetValue(estr, parent, glob, &dval);
result = TokGetValue(estr, parent, parprops, glob, &dval);
if (result == 1) PushTok(TOK_DOUBLE, &dval, &expstack);
PushTok(TOK_GROUP_CLOSE, NULL, &expstack);
estr = tstr + 1;
@@ -409,7 +448,7 @@ int ReduceExpressions(struct objlist *instprop,
case '!':
if (*(tstr + 1) == '=') {
*tstr = '\0';
result = TokGetValue(estr, parent, glob, &dval);
result = TokGetValue(estr, parent, parprops, glob, &dval);
if (result == 1) PushTok(TOK_DOUBLE, &dval, &expstack);
else if (result == -1) PushTok(TOK_STRING, estr, &expstack);
PushTok(TOK_NE, NULL, &expstack);
@@ -420,7 +459,7 @@ int ReduceExpressions(struct objlist *instprop,
case '=':
if (*(tstr + 1) == '=') {
*tstr = '\0';
result = TokGetValue(estr, parent, glob, &dval);
result = TokGetValue(estr, parent, parprops, glob, &dval);
if (result == 1) PushTok(TOK_DOUBLE, &dval, &expstack);
else if (result == -1) PushTok(TOK_STRING, estr, &expstack);
PushTok(TOK_EQ, NULL, &expstack);
@@ -430,7 +469,7 @@ int ReduceExpressions(struct objlist *instprop,
case '>':
*tstr = '\0';
result = TokGetValue(estr, parent, glob, &dval);
result = TokGetValue(estr, parent, parprops, glob, &dval);
if (result == 1) PushTok(TOK_DOUBLE, &dval, &expstack);
else if (result == -1) PushTok(TOK_STRING, estr, &expstack);
@@ -446,7 +485,7 @@ int ReduceExpressions(struct objlist *instprop,
case '<':
*tstr = '\0';
result = TokGetValue(estr, parent, glob, &dval);
result = TokGetValue(estr, parent, parprops, glob, &dval);
if (result == 1) PushTok(TOK_DOUBLE, &dval, &expstack);
else if (result == -1) PushTok(TOK_STRING, estr, &expstack);
@@ -462,7 +501,7 @@ int ReduceExpressions(struct objlist *instprop,
case ',':
*tstr = '\0';
result = TokGetValue(estr, parent, glob, &dval);
result = TokGetValue(estr, parent, parprops, glob, &dval);
if (result == 1) PushTok(TOK_DOUBLE, &dval, &expstack);
else if (result == -1) PushTok(TOK_STRING, estr, &expstack);
if (expstack == NULL) break;
@@ -487,7 +526,7 @@ int ReduceExpressions(struct objlist *instprop,
}
tstr++;
}
result = TokGetValue(estr, parent, glob, &dval);
result = TokGetValue(estr, parent, parprops, glob, &dval);
if (result == 1) PushTok(TOK_DOUBLE, &dval, &expstack);
else if (result == -1) PushTok(TOK_STRING, estr, &expstack);
@@ -758,7 +797,7 @@ int ReduceExpressions(struct objlist *instprop,
switch (stackptr->toktype) {
case TOK_STRING:
result = TokGetValue(stackptr->data.string, parent,
glob, &dval);
parprops, glob, &dval);
if (result == 1) {
stackptr->toktype = TOK_DOUBLE;
FREE(stackptr->data.string);
@@ -835,19 +874,17 @@ PropertyDelete(char *name, int fnum, char *key)
/* key == NULL means delete all properties. */
RecurseHashTable(tc->proptab, OBJHASHSIZE, freeprop);
HashKill(tc->proptab, OBJHASHSIZE);
FREE(tc->proptab);
tc->proptab = (struct hashlist **)CALLOC(OBJHASHSIZE,
sizeof(struct hashlist *));
RecurseHashTable(&(tc->propdict), freeprop);
HashKill(&(tc->propdict));
InitializeHashTable(&(tc->propdict), OBJHASHSIZE);
}
else {
kl = (struct property *)HashLookup(key, tc->proptab, OBJHASHSIZE);
kl = (struct property *)HashLookup(key, &(tc->propdict));
if (kl != NULL) {
if (kl->type == PROP_STRING || kl->type == PROP_EXPRESSION)
FREE(kl->pdefault.string);
FREE(kl->key);
HashDelete(key, tc->proptab, OBJHASHSIZE);
HashDelete(key, &(tc->propdict));
}
else {
Printf("No property %s found for device %s\n", key, name);
@@ -880,7 +917,7 @@ PropertyTolerance(char *name, int fnum, char *key, int ival, double dval)
return -1;
}
kl = (struct property *)HashLookup(key, tc->proptab, OBJHASHSIZE);
kl = (struct property *)HashLookup(key, &(tc->propdict));
if (kl == NULL) {
Printf("No property %s found for device %s\n", key, name);
return -1;
@@ -901,6 +938,40 @@ PropertyTolerance(char *name, int fnum, char *key, int ival, double dval)
return 0;
}
/*----------------------------------------------------------------------*/
/* Set the merge type of a property in the master cell record. */
/*----------------------------------------------------------------------*/
int
PropertyMerge(char *name, int fnum, char *key, int merge_type)
{
struct property *kl = NULL;
struct nlist *tc;
int result;
if ((fnum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
result = PropertyMerge(name, Circuit1->file, key, merge_type);
result = PropertyMerge(name, Circuit2->file, key, merge_type);
return result;
}
tc = LookupCellFile(name, fnum);
if (tc == NULL) {
Printf("No device %s found for PropertyTolerance()\n", name);
return -1;
}
kl = (struct property *)HashLookup(key, &(tc->propdict));
if (kl == NULL) {
Printf("No property %s found for device %s\n", key, name);
return -1;
}
else {
kl->merge = merge_type;
}
return 0;
}
/*----------------------------------------------------------------------*/
/* Add a new value property to the indicated cell */
/* Value properties are used for resistors and capacitors in SPICE */
@@ -924,18 +995,18 @@ struct property *PropertyValue(char *name, int fnum, char *key,
tc = LookupCellFile(name, fnum);
if (tc == NULL)
Printf("No device %s found for PropertyValue()\n", name);
else if ((kl = (struct property *)HashLookup(key, tc->proptab,
OBJHASHSIZE)) != NULL) {
else if ((kl = (struct property *)HashLookup(key, &(tc->propdict))) != NULL) {
Printf("Device %s already has property named \"%s\"\n", name, key);
}
else {
kl = NewProperty();
kl->key = strsave(key);
kl->idx = 0;
kl->merge = MERGE_NONE;
kl->type = PROP_VALUE;
kl->slop.dval = slop;
kl->pdefault.dval = pdefault;
HashPtrInstall(kl->key, kl, tc->proptab, OBJHASHSIZE);
HashPtrInstall(kl->key, kl, &(tc->propdict));
}
return kl;
}
@@ -959,18 +1030,18 @@ struct property *PropertyDouble(char *name, int fnum, char *key,
tc = LookupCellFile(name, fnum);
if (tc == NULL)
Printf("No device %s found for PropertyDouble()\n", name);
else if ((kl = (struct property *)HashLookup(key, tc->proptab,
OBJHASHSIZE)) != NULL) {
else if ((kl = (struct property *)HashLookup(key, &(tc->propdict))) != NULL) {
Printf("Device %s already has property named \"%s\"\n", name, key);
}
else {
kl = NewProperty();
kl->key = strsave(key);
kl->idx = 0;
kl->merge = MERGE_NONE;
kl->type = PROP_DOUBLE;
kl->slop.dval = slop;
kl->pdefault.dval = pdefault;
HashPtrInstall(kl->key, kl, tc->proptab, OBJHASHSIZE);
HashPtrInstall(kl->key, kl, &(tc->propdict));
}
return kl;
}
@@ -992,18 +1063,18 @@ struct property *PropertyInteger(char *name, int fnum, char *key,
tc = LookupCellFile(name, fnum);
if (tc == NULL)
Printf("No device %s found for PropertyInteger()\n", name);
else if ((kl = (struct property *)HashLookup(key, tc->proptab,
OBJHASHSIZE)) != NULL) {
else if ((kl = (struct property *)HashLookup(key, &(tc->propdict))) != NULL) {
Printf("Device %s already has property named \"%s\"\n", name, key);
}
else {
kl = NewProperty();
kl->key = strsave(key);
kl->idx = 0;
kl->merge = MERGE_NONE;
kl->type = PROP_INTEGER;
kl->slop.ival = slop;
kl->pdefault.ival = pdefault;
HashPtrInstall(kl->key, kl, tc->proptab, OBJHASHSIZE);
HashPtrInstall(kl->key, kl, &(tc->propdict));
}
return kl;
}
@@ -1025,21 +1096,21 @@ struct property *PropertyString(char *name, int fnum, char *key, int range,
tc = LookupCellFile(name, fnum);
if (tc == NULL)
Printf("No device %s found for PropertyString()\n", name);
else if ((kl = (struct property *)HashLookup(key, tc->proptab,
OBJHASHSIZE)) != NULL) {
else if ((kl = (struct property *)HashLookup(key, &(tc->propdict))) != NULL) {
Printf("Device %s already has property named \"%s\"\n", name, key);
}
else {
kl = NewProperty();
kl->key = strsave(key);
kl->idx = 0;
kl->merge = MERGE_NONE;
kl->type = PROP_STRING;
kl->slop.ival = (range >= 0) ? range : 0;
if (pdefault != NULL)
kl->pdefault.string = strsave(pdefault);
else
kl->pdefault.string = NULL;
HashPtrInstall(kl->key, kl, tc->proptab, OBJHASHSIZE);
HashPtrInstall(kl->key, kl, &(tc->propdict));
}
return kl;
}
@@ -1924,10 +1995,6 @@ void DeleteProperties(struct keyvalue **topptr)
/* to relate them to the cell that is being instanced. Because this */
/* is used to link the same properties multiple times for parallel */
/* devices, copy the list (a refcount would work better. . .) */
/* */
/* If "isdefault" is "true", then the record is installed in the */
/* object hash under the name "defaults"; otherwise, it gets the */
/* name "properties" and is not added to the object hash. */
/*----------------------------------------------------------------------*/
struct objlist *LinkProperties(char *model, struct keyvalue *topptr)
@@ -1953,10 +2020,6 @@ struct objlist *LinkProperties(char *model, struct keyvalue *topptr)
return NULL;
}
cell = LookupCellFile(model, filenum);
if (cell == NULL) {
Printf("No cell '%s' found to link properties to.\n", model);
return NULL;
}
tp = GetObject();
tp->type = PROPERTY;
@@ -1977,6 +2040,33 @@ struct objlist *LinkProperties(char *model, struct keyvalue *topptr)
/* No promotion to types other than string at this point */
newkv->type = PROP_STRING;
newkv->value.string = strsave(kv->value);
if (cell != NULL) {
struct property *kl = NULL;
/* If there is a matching cell, make sure that the property */
/* key exists. If not, create it and flag a warning. */
kl = (struct property *)HashLookup(newkv->key, &(cell->propdict));
if (kl == NULL) {
/* Ideally, for devices, one should check against all */
/* known standard properties. That's a pain, so */
/* instead just assume that the property is correct. */
if (cell->class == CLASS_SUBCKT)
Fprintf(stderr, "Warning: Property %s passed to cell %s which "
"does not define a default.\n",
newkv->key, cell->name);
kl = NewProperty();
kl->key = strsave(newkv->key);
kl->idx = 0;
kl->merge = MERGE_NONE;
kl->type = PROP_STRING;
kl->slop.ival = 0;
kl->pdefault.string = NULL;
HashPtrInstall(kl->key, kl, &(cell->propdict));
}
}
}
/* Final entry marks the end of the list */
@@ -1989,6 +2079,40 @@ struct objlist *LinkProperties(char *model, struct keyvalue *topptr)
return tp;
}
/*----------------------------------------------------------------------*/
/* SetPropertyDefault() --- */
/* */
/* If a cell does not set property defaults, but an instance of that */
/* cell passes a property to it, then there will be a default value */
/* with a string type and a NULL value. Set the default to be equal */
/* to the instance type and value. */
/*----------------------------------------------------------------------*/
int SetPropertyDefault(struct property *prop, struct valuelist *vl)
{
if (prop == NULL || vl == NULL) return -1;
if (prop->type != PROP_STRING || prop->pdefault.string != NULL) return 1;
prop->type = vl->type;
switch (vl->type) {
case PROP_STRING:
prop->pdefault.string = strsave(vl->value.string);
break;
case PROP_INTEGER:
prop->pdefault.ival = vl->value.ival;
break;
case PROP_DOUBLE:
case PROP_VALUE:
prop->pdefault.dval = vl->value.dval;
break;
case PROP_EXPRESSION:
prop->pdefault.stack = CopyTokStack(vl->value.stack);
break;
}
return 1;
}
/*----------------------------------------------------------------------*/
/* PromoteProperty() --- */
/* */
@@ -2132,7 +2256,7 @@ struct nlist *resolveprops(struct hashlist *p, void *clientdata)
for (i = 0;; i++) {
vl = &(ob->instance.props[i]);
if (vl->type == PROP_ENDLIST) break;
prop = (struct property *)HashLookup(vl->key, tc->proptab, OBJHASHSIZE);
prop = (struct property *)HashLookup(vl->key, &(tc->propdict));
/* Warning: prop should never be null, but condition */
/* should be handled. */
@@ -2187,7 +2311,7 @@ void ResolveProperties(char *name1, int file1, char *name2, int file2)
/* index. If the property does not exist in the second cell, then */
/* create it. */
kl1 = (struct property *)HashFirst(tp1->proptab, OBJHASHSIZE);
kl1 = (struct property *)HashFirst(&(tp1->propdict));
/* If indexes are not zero, then properties have already been matched. */
if (kl1 == NULL) return; /* Cell has no properties */
if (kl1->idx != 0) return;
@@ -2196,7 +2320,7 @@ void ResolveProperties(char *name1, int file1, char *name2, int file2)
while (kl1 != NULL) {
kl1->idx = i;
kl2 = (struct property *)HashLookup(kl1->key, tp2->proptab, OBJHASHSIZE);
kl2 = (struct property *)HashLookup(kl1->key, &(tp2->propdict));
if (kl2 == NULL) {
/* No such property in tp2 */
switch (kl1->type) {
@@ -2219,16 +2343,16 @@ void ResolveProperties(char *name1, int file1, char *name2, int file2)
}
}
if (kl2 != NULL) kl2->idx = i;
kl1 = (struct property *)HashNext(tp1->proptab, OBJHASHSIZE);
kl1 = (struct property *)HashNext(&(tp1->propdict));
i++;
}
/* Now check tp2 for properties not in tp1 */
kl2 = (struct property *)HashFirst(tp2->proptab, OBJHASHSIZE);
kl2 = (struct property *)HashFirst(&(tp2->propdict));
while (kl2 != NULL) {
kl1 = (struct property *)HashLookup(kl2->key, tp1->proptab, OBJHASHSIZE);
kl1 = (struct property *)HashLookup(kl2->key, &(tp1->propdict));
if (kl1 == NULL) {
/* No such property in tp1 */
switch (kl2->type) {
@@ -2251,7 +2375,7 @@ void ResolveProperties(char *name1, int file1, char *name2, int file2)
}
}
if (kl1 != NULL) kl1->idx = i;
kl2 = (struct property *)HashNext(tp1->proptab, OBJHASHSIZE);
kl2 = (struct property *)HashNext(&(tp1->propdict));
i++;
}
+4 -2
View File
@@ -37,12 +37,14 @@ extern struct property *PropertyString(char *name, int fnum, char *key,
extern int PropertyDelete(char *name, int fnum, char *key);
extern int PropertyTolerance(char *name, int fnum, char *key, int ival,
double dval);
extern int PropertyMerge(char *name, int fnum, char *key, int merge_type);
extern void ResolveProperties(char *name1, int file1, char *name2, int file2);
extern void CopyProperties(struct objlist *obj_to, struct objlist *obj_from);
extern int PromoteProperty(struct property *, struct valuelist *);
extern int SetPropertyDefault(struct property *, struct valuelist *);
extern struct objlist *LinkProperties(char *model, struct keyvalue *topptr);
extern int ReduceExpressions(struct objlist *instprop, struct nlist *parent,
int glob);
extern int ReduceExpressions(struct objlist *instprop, struct objlist *parprops,
struct nlist *parent, int glob);
extern void Node(char *name);
extern void Global(char *name);
extern void UniqueGlobal(char *name);
+45 -58
View File
@@ -251,18 +251,18 @@ void PrintMemoryStats(void)
#define CELLHASHSIZE 1000
static struct hashlist *cell_hashtab[CELLHASHSIZE];
static struct hashdict cell_dict;
void InitCellHashTable(void)
{
hashfunc = hash;
matchfunc = match;
InitializeHashTable(cell_hashtab, CELLHASHSIZE);
hashfunc = hash;
matchfunc = match;
InitializeHashTable(&cell_dict, CELLHASHSIZE);
}
struct nlist *LookupCell(char *s)
{
return((struct nlist *)HashLookup(s, cell_hashtab, CELLHASHSIZE));
return((struct nlist *)HashLookup(s, &cell_dict));
}
/* Similar hash lookup to the above, but will check if the matching */
@@ -274,7 +274,7 @@ struct nlist *LookupCellFile(char *s, int f)
struct nlist *he;
if (f == -1) return LookupCell(s);
return HashIntLookup(s, f, cell_hashtab, CELLHASHSIZE);
return HashIntLookup(s, f, &cell_dict);
}
struct nlist *InstallInCellHashTable(char *name, int fnum)
@@ -291,34 +291,23 @@ struct nlist *InstallInCellHashTable(char *name, int fnum)
if (p == NULL) return(NULL);
if ((p->name = strsave(name)) == NULL) goto fail;
p->file = fnum;
if ((p->objtab = (struct hashlist **)CALLOC(OBJHASHSIZE,
sizeof(struct hashlist *))) == NULL) goto fail;
if ((p->insttab = (struct hashlist **)CALLOC(OBJHASHSIZE,
sizeof(struct hashlist *))) == NULL) goto fail;
if ((p->proptab = (struct hashlist **)CALLOC(OBJHASHSIZE,
sizeof(struct hashlist *))) == NULL) goto fail;
InitializeHashTable(&(p->objdict), OBJHASHSIZE);
InitializeHashTable(&(p->instdict), OBJHASHSIZE);
InitializeHashTable(&(p->propdict), OBJHASHSIZE);
p->permutes = NULL;
// Hash size 0 indicates to hash function that no binning is being done
p->classhash = (*hashfunc)(name, 0);
ptr = HashIntPtrInstall(name, fnum, p, cell_hashtab, CELLHASHSIZE);
ptr = HashIntPtrInstall(name, fnum, p, &cell_dict);
if (ptr == NULL) return(NULL);
return(p);
fail:
if (p->name != NULL) FREE(p->name);
if (p->objtab != NULL) {
HashKill(p->objtab, OBJHASHSIZE);
FREE(p->objtab);
}
if (p->insttab != NULL) {
HashKill(p->insttab, OBJHASHSIZE);
FREE(p->insttab);
}
if (p->proptab != NULL) {
HashKill(p->proptab, OBJHASHSIZE);
FREE(p->proptab);
}
HashKill(&(p->objdict));
HashKill(&(p->instdict));
RecurseHashTable(&(p->propdict), freeprop);
HashKill(&(p->propdict));
FREE(p);
return(NULL);
}
@@ -341,9 +330,9 @@ void CellRehash(char *name, char *newname, int file)
FREE(tp->name);
tp->name = strsave(newname);
ptr = HashIntPtrInstall(newname, file, (void *)tp, cell_hashtab, CELLHASHSIZE);
ptr = HashIntPtrInstall(newname, file, (void *)tp, &cell_dict);
if (ptr != NULL)
HashIntDelete(name, file, cell_hashtab, CELLHASHSIZE);
HashIntDelete(name, file, &cell_dict);
// Change the classhash to reflect the new name
tp->classhash = (*hashfunc)(newname, 0);
@@ -365,7 +354,7 @@ int deleteclass(struct hashlist *p, int file)
nob = ob->next;
if ((ob->type == FIRSTPIN) && (ob->model.class != NULL)) {
if ((*matchfunc)(ob->model.class, OldCell->name)) {
HashDelete(ob->instance.name, ptr->insttab, OBJHASHSIZE);
HashDelete(ob->instance.name, &(ptr->instdict));
while (1) {
FreeObjectAndHash(ob, ptr);
ob = nob;
@@ -482,22 +471,13 @@ void CellDelete(char *name, int fnum)
return;
}
HashIntDelete(name, fnum, cell_hashtab, CELLHASHSIZE);
HashIntDelete(name, fnum, &cell_dict);
/* now make sure that we free all the fields of the nlist struct */
if (tp->name != NULL) FREE(tp->name);
if (tp->objtab != NULL) {
HashKill(tp->objtab, OBJHASHSIZE);
FREE(tp->objtab);
}
if (tp->insttab != NULL) {
HashKill(tp->insttab, OBJHASHSIZE);
FREE(tp->insttab);
}
if (tp->proptab != NULL) {
RecurseHashTable(tp->proptab, OBJHASHSIZE, freeprop);
HashKill(tp->proptab, OBJHASHSIZE);
FREE(tp->proptab);
}
HashKill(&(tp->objdict));
HashKill(&(tp->instdict));
RecurseHashTable(&(tp->propdict), freeprop);
HashKill(&(tp->propdict));
FreeNodeNames(tp);
ob = tp->cell;
while (ob != NULL) {
@@ -548,8 +528,8 @@ void PrintCellHashTable(int full, int filenum)
TopFile = filenum;
bins = RecurseHashTable(cell_hashtab, CELLHASHSIZE, CountHashTableBinsUsed);
total = RecurseHashTable(cell_hashtab, CELLHASHSIZE, CountHashTableEntries);
bins = RecurseHashTable(&cell_dict, CountHashTableBinsUsed);
total = RecurseHashTable(&cell_dict, CountHashTableEntries);
if (full != 2)
Printf("Hash table: %d of %d bins used; %d cells total (%.2f per bin)\n",
bins, CELLHASHSIZE, total, (bins == 0) ? 0 :
@@ -557,7 +537,7 @@ void PrintCellHashTable(int full, int filenum)
OldDebug = Debug;
Debug = full;
RecurseHashTable(cell_hashtab, CELLHASHSIZE, PrintCellHashTableElement);
RecurseHashTable(&cell_dict, PrintCellHashTableElement);
Debug = OldDebug;
#ifndef TCL_NETGEN
if (full == 2) Printf("\n");
@@ -566,12 +546,12 @@ void PrintCellHashTable(int full, int filenum)
struct nlist *FirstCell(void)
{
return((struct nlist *)HashFirst(cell_hashtab, CELLHASHSIZE));
return((struct nlist *)HashFirst(&cell_dict));
}
struct nlist *NextCell(void)
{
return((struct nlist *)HashNext(cell_hashtab, CELLHASHSIZE));
return((struct nlist *)HashNext(&cell_dict));
}
static int ClearDumpedElement(struct hashlist *np)
@@ -585,17 +565,17 @@ static int ClearDumpedElement(struct hashlist *np)
void ClearDumpedList(void)
{
RecurseHashTable(cell_hashtab, CELLHASHSIZE, ClearDumpedElement);
RecurseHashTable(&cell_dict, ClearDumpedElement);
}
int RecurseCellHashTable(int (*foo)(struct hashlist *np))
{
return RecurseHashTable(cell_hashtab, CELLHASHSIZE, foo);
return RecurseHashTable(&cell_dict, foo);
}
int RecurseCellFileHashTable(int (*foo)(struct hashlist *, int), int value)
{
return RecurseHashTableValue(cell_hashtab, CELLHASHSIZE, foo, value);
return RecurseHashTableValue(&cell_dict, foo, value);
}
/* Yet another version, passing one parameter that is a pointer */
@@ -603,7 +583,7 @@ int RecurseCellFileHashTable(int (*foo)(struct hashlist *, int), int value)
struct nlist *RecurseCellHashTable2(struct nlist *(*foo)(struct hashlist *,
void *), void *pointer)
{
return RecurseHashTablePointer(cell_hashtab, CELLHASHSIZE, foo, pointer);
return RecurseHashTablePointer(&cell_dict, foo, pointer);
}
/************************** WILD-CARD STUFF *******************************/
@@ -863,7 +843,7 @@ int ListLength(char *list_template)
struct objlist *CopyObjList(struct objlist *oldlist)
struct objlist *CopyObjList(struct objlist *oldlist, unsigned char doforall)
/* copies list pointed to by oldlist, creating
a list whose head pointer is returned */
{
@@ -900,6 +880,13 @@ struct objlist *CopyObjList(struct objlist *oldlist)
tail->next = newob;
tail = newob;
tmp = tmp->next;
// If "doforall" is 0, then only copy one object; otherwise,
// copy to the end of the list.
if (!doforall) {
if ((tmp == NULL) || ((tmp->type <= FIRSTPIN) && (tmp->type != PROPERTY)))
break;
}
}
return (head);
}
@@ -914,13 +901,13 @@ struct objlist *CopyObjList(struct objlist *oldlist)
struct objlist *LookupObject(char *name, struct nlist *WhichCell)
{
return((struct objlist *)HashLookup(name, WhichCell->objtab, OBJHASHSIZE));
return((struct objlist *)HashLookup(name, &(WhichCell->objdict)));
}
struct objlist *LookupInstance(char *name, struct nlist *WhichCell)
/* searches for exact match of instance 'name' in cell 'WhichCell' */
{
return((struct objlist *)HashLookup(name, WhichCell->insttab, OBJHASHSIZE));
return((struct objlist *)HashLookup(name, &(WhichCell->instdict)));
}
@@ -939,7 +926,7 @@ void AddToCurrentCell(struct objlist *ob)
/* add to object hash table for this cell */
if (CurrentCell != NULL) {
HashPtrInstall(ob->name, ob, CurrentCell->objtab, OBJHASHSIZE);
HashPtrInstall(ob->name, ob, &(CurrentCell->objdict));
}
}
@@ -966,13 +953,13 @@ void AddToCurrentCellNoHash(struct objlist *ob)
void AddInstanceToCurrentCell(struct objlist *ob)
{
/* add to instance hash table for this cell */
HashPtrInstall(ob->instance.name, ob, CurrentCell->insttab, OBJHASHSIZE);
HashPtrInstall(ob->instance.name, ob, &(CurrentCell->instdict));
}
void FreeObject(struct objlist *ob)
{
/* This just frees the object record. Beware of pointer left */
/* in the objtab hash table. Hash table records should be */
/* in the objlist hash table. Hash table records should be */
/* removed first. */
if (ob->name != NULL) FreeString(ob->name);
@@ -1013,7 +1000,7 @@ void FreeObject(struct objlist *ob)
void FreeObjectAndHash(struct objlist *ob, struct nlist *ptr)
{
HashDelete(ob->name, ptr->objtab, OBJHASHSIZE);
HashDelete(ob->name, &(ptr->objdict));
FreeObject(ob);
}
+21 -4
View File
@@ -3,6 +3,10 @@
#ifndef _OBJLIST_H
#define _OBJLIST_H
#ifndef _HASH_H
#include "hash.h"
#endif
#define SEPARATOR "/"
#define INSTANCE_DELIMITER "#"
#define PORT_DELIMITER "."
@@ -99,10 +103,22 @@ struct valuelist {
/* Part 3: Keys & Defaults (kept in the cell record as a hash table) */
#define MERGE_NONE 0 /* Property does not change when devices merge */
#define MERGE_ADD 1 /* Properties sum with device merge */
#define MERGE_ADD_CRIT 2 /* Properties sum with device merge */
#define MERGE_PAR 3 /* Properties add in parallel with device merge */
#define MERGE_PAR_CRIT 4 /* Properties add in parallel with device merge */
/* Note: A "critical" merge means that the property causes the number of */
/* devices to change. e.g., transistor width is critical; transistor drain */
/* area sums when devices are merged, but does not change the number of devices.*/
/* More than one property can be critical. e.g., width and number of fingers. */
struct property {
char *key; /* name of the property */
unsigned char idx; /* index into valuelist */
unsigned char type; /* string, integer, double, value, expression */
unsigned char merge; /* how property changes when devices are merged */
union {
char *string;
double dval;
@@ -172,9 +188,9 @@ struct nlist {
unsigned long classhash; /* randomized hash value for cell class */
struct Permutation *permutes; /* list of permuting pins */
struct objlist *cell;
struct hashlist **objtab; /* hash table of object names */
struct hashlist **insttab; /* hash table of instance names */
struct hashlist **proptab; /* hash table of property keys */
struct hashdict objdict; /* hash table of object names */
struct hashdict instdict; /* hash table of instance names */
struct hashdict propdict; /* hash table of property keys */
struct objlist **nodename_cache;
long nodename_cache_maxnodenum; /* largest node number in cache */
void *embedding; /* this will be cast to the appropriate data structure */
@@ -188,6 +204,7 @@ struct nlist {
#define CELL_TOP 0x04 /* cell is a top-level cell */
#define CELL_PLACEHOLDER 0x08 /* cell is a placeholder cell */
#define CELL_PROPSMATCHED 0x10 /* properties matched to matching cell */
#define CELL_DUPLICATE 0x20 /* cell has a duplicate */
/* Flags for combination allowances */
@@ -215,7 +232,7 @@ extern int ListLength(char *list_template);
extern struct nlist *LookupPrematchedClass(struct nlist *, int);
extern struct objlist *LookupObject(char *name, struct nlist *WhichCell);
extern struct objlist *LookupInstance(char *name, struct nlist *WhichCell);
extern struct objlist *CopyObjList(struct objlist *oldlist);
extern struct objlist *CopyObjList(struct objlist *oldlist, unsigned char doforall);
extern void UpdateNodeNumbers(struct objlist *lst, int from, int to);
/* Function pointer to List or ListExact, allowing regular expressions */
+21 -19
View File
@@ -797,8 +797,9 @@ void DescribeInstance(char *name, int file)
{
if (ob->node > nodemax) nodemax = ob->node;
else if ((ob->node == -1) && (ob->model.port != PROXY)) {
if (disconnectednodes == 0) Fprintf(stderr, "\n");
disconnectednodes++;
Fprintf(stderr, " disconnected node: %s\n", ob->name);
Fprintf(stderr, "Cell %s disconnected node: %s\n", tp->name, ob->name);
}
}
instlist = (unsigned char *) CALLOC((nodemax + 1), sizeof(unsigned char));
@@ -948,6 +949,7 @@ void Query(void)
char repstr2[100];
float StartTime; /* for elapsed CPU times */
int Timing; /* if true, print times of each command */
int filenum = -1;
if (!SuppressPrompts)
Printf("Netgen %s.%s: %s, %s, %s\n", NETGEN_VERSION, NETGEN_REVISION,
@@ -961,8 +963,8 @@ void Query(void)
if (Timing) StartTime = CPUTime();
reply = repstr[0];
switch (reply) {
case 'h' : PrintCellHashTable(0, -1); break;
case 'H' : PrintCellHashTable(1, -1); break;
case 'h' : PrintCellHashTable(0, filenum); break;
case 'H' : PrintCellHashTable(1, filenum); break;
case 'N' :
promptstring("Enter circuit name: ", repstr);
PrintNodes(repstr, -1);
@@ -983,15 +985,15 @@ void Query(void)
break;
case 'c' :
promptstring("Enter circuit name: ", repstr);
PrintCell(repstr);
PrintCell(repstr, filenum);
break;
case 'i' :
promptstring("Enter circuit name: ", repstr);
PrintInstances(repstr, -1);
PrintInstances(repstr, filenum);
break;
case 'd':
promptstring("Enter circuit name: ", repstr);
DescribeInstance(repstr, -1);
DescribeInstance(repstr, filenum);
break;
/* output file formats */
case 'k' :
@@ -1000,11 +1002,11 @@ void Query(void)
break;
case 'x' :
promptstring("Write EXT: Enter circuit name: ", repstr);
Ext(repstr);
Ext(repstr, filenum);
break;
case 'z' :
promptstring("Write SIM: Enter circuit name: ", repstr);
Sim(repstr);
Sim(repstr, filenum);
break;
case 'w' :
promptstring("Write WOMBAT: circuit name: ", repstr);
@@ -1016,7 +1018,7 @@ void Query(void)
break;
case 's':
promptstring("Write SPICE: circuit name: ", repstr);
SpiceCell(repstr, -1, "");
SpiceCell(repstr, filenum, "");
break;
case 'E':
promptstring("Write ESACAP: circuit name: ", repstr);
@@ -1034,19 +1036,19 @@ void Query(void)
case 'r':
case 'R':
promptstring("Read file: ",repstr);
ReadNetlist(repstr);
ReadNetlist(repstr, &filenum);
break;
case 'X' :
promptstring("Read EXT: Enter file name: ", repstr);
ReadExtHier(repstr);
ReadExtHier(repstr, &filenum);
break;
case 'Z' :
promptstring("Read SIM: Enter file name: ", repstr);
ReadSim(repstr);
ReadSim(repstr, &filenum);
break;
case 'K' :
promptstring("Read NTK: file? ", repstr);
ReadNtk(repstr);
ReadNtk(repstr, &filenum);
break;
case 'A' :
printf("Reading ACTEL library.\n");
@@ -1054,24 +1056,24 @@ void Query(void)
break;
case 'S':
promptstring("Read SPICE (.ckt) file? ", repstr);
ReadSpice(repstr);
ReadSpice(repstr, &filenum);
break;
case 'G' :
promptstring("Read NETGEN: file? ", repstr);
ReadNetgenFile(repstr);
ReadNetgenFile(repstr, &filenum);
break;
case 'f' :
promptstring("Enter circuit name to flatten: ", repstr);
Flatten(repstr, -1);
Flatten(repstr, filenum);
break;
case 'F' :
promptstring("Enter class of circuit to flatten: ", repstr);
FlattenInstancesOf(repstr, -1);
FlattenInstancesOf(repstr, filenum);
break;
case 'p' :
promptstring("Enter circuit name: ", repstr);
PrintPortsInCell(repstr, -1);
PrintPortsInCell(repstr, filenum);
break;
case 'T' :
NETCOMP();
@@ -1079,7 +1081,7 @@ void Query(void)
case 'l' :
ClearDumpedList();
promptstring("Enter circuit name: ", repstr);
PrintLeavesInCell(repstr, -1);
PrintLeavesInCell(repstr, filenum);
break;
case 'L' :
printf("List of all leaf circuits:\n");
+31 -23
View File
@@ -40,7 +40,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "print.h"
// Global storage for parameters from .PARAM
struct hashlist **spiceparams;
struct hashdict spiceparams;
void SpiceSubCell(struct nlist *tp, int IsSubCell)
{
@@ -358,6 +358,12 @@ int renamepins(struct hashlist *p, int file)
obp = ob;
for (ob2 = tc->cell; ob2 != NULL; ob2 = ob2->next) {
if (ob2->type != PORT) break;
else if ((obp->type < FIRSTPIN) || (obp->type == FIRSTPIN && obp != ob)) {
Fprintf(stderr, "Pin count mismatch between cell and instance of %s\n",
tc->name);
InputParseError(stderr);
break;
}
if (!matchnocase(ob2->name, obp->name + strlen(obp->instance.name) + 1)) {
// Printf("Cell %s pin correspondence: %s vs. %s\n",
// tc->name, obp->name, ob2->name);
@@ -520,6 +526,10 @@ void ReadSpiceFile(char *fname, int filenum, struct cellstack **CellStackPtr,
int n;
char *ds;
// NOTE: Use this to ignore the new definition---should be
// an option to netgen.
/* goto skip_ends; */
ds = strrchr(model, '[');
if ((ds != NULL) && (*(ds + 1) == '['))
sscanf(ds + 2, "%d", &n);
@@ -530,6 +540,7 @@ void ReadSpiceFile(char *fname, int filenum, struct cellstack **CellStackPtr,
}
Printf("Duplicate cell %s in file\n", nexttok);
tp->flags |= CELL_DUPLICATE;
while (tp != NULL) {
n++;
/* Append "[[n]]" to the preexisting model name to force uniqueness */
@@ -773,7 +784,7 @@ skip_ends:
kl->type = PROP_STRING;
kl->slop.ival = 0;
kl->pdefault.string = strsave(eqptr + 1);
HashPtrInstall(nexttok, kl, spiceparams, OBJHASHSIZE);
HashPtrInstall(nexttok, kl, &spiceparams);
}
}
}
@@ -849,7 +860,7 @@ skip_ends:
if (multi) snprintf(instname, 255, "%s%s.%d", model, inst, ndev);
Cell(instname, model, collector, base, emitter);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
ndev--;
}
DeleteProperties(&kvlist);
@@ -898,9 +909,9 @@ skip_ends:
if (!strcasecmp(nexttok, "M"))
sscanf(eqptr + 1, "%d", &ndev);
else if (!strcasecmp(nexttok, "L"))
AddProperty(&kvlist, "length", eqptr + 1);
AddProperty(&kvlist, "L", eqptr + 1);
else if (!strcasecmp(nexttok, "W"))
AddProperty(&kvlist, "width", eqptr + 1);
AddProperty(&kvlist, "W", eqptr + 1);
else
AddProperty(&kvlist, nexttok, eqptr + 1);
}
@@ -916,8 +927,8 @@ skip_ends:
Port("gate");
Port("source");
Port("bulk");
PropertyDouble(model, filenum, "length", 0.01, 0.0);
PropertyDouble(model, filenum, "width", 0.01, 0.0);
PropertyDouble(model, filenum, "L", 0.01, 0.0);
PropertyDouble(model, filenum, "W", 0.01, 0.0);
SetClass(CLASS_FET);
EndCell();
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
@@ -935,7 +946,7 @@ skip_ends:
if (multi) snprintf(instname, 255, "%s%s.%d", model, inst, ndev);
Cell(instname, model, drain, gate, source, bulk);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
ndev--;
}
DeleteProperties(&kvlist);
@@ -1038,7 +1049,7 @@ skip_ends:
else
Cap((*CellStackPtr)->cellname, instname, ctop, cbot);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
ndev--;
}
DeleteProperties(&kvlist);
@@ -1140,7 +1151,7 @@ skip_ends:
else
Res((*CellStackPtr)->cellname, instname, rtop, rbot);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
ndev--;
}
DeleteProperties(&kvlist);
@@ -1204,7 +1215,7 @@ skip_ends:
if (multi) snprintf(instname, 255, "%s%s.%d", model, inst, ndev);
Cell(instname, model, anode, cathode);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
ndev--;
}
DeleteProperties(&kvlist);
@@ -1296,7 +1307,7 @@ skip_ends:
XLine((*CellStackPtr)->cellname, instname, node1, node2,
node3, node4);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
ndev--;
}
DeleteProperties(&kvlist);
@@ -1386,7 +1397,7 @@ skip_ends:
else
Inductor((*CellStackPtr)->cellname, instname, end_a, end_b);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
ndev--;
}
DeleteProperties(&kvlist);
@@ -1446,7 +1457,7 @@ skip_ends:
}
Cell(instname, model, pos, neg);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
DeleteProperties(&kvlist);
}
else if (toupper(nexttok[0]) == 'I') { /* current source */
@@ -1499,7 +1510,7 @@ skip_ends:
}
Cell(instname, model, pos, neg);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
DeleteProperties(&kvlist);
}
else if (toupper(nexttok[0]) == 'E') { /* controlled voltage source */
@@ -1563,7 +1574,7 @@ skip_ends:
}
Cell(instname, model, pos, neg, ctrlp, ctrln);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
DeleteProperties(&kvlist);
}
@@ -1709,7 +1720,7 @@ skip_ends:
}
Instance(subcktname, instancename);
pobj = LinkProperties(subcktname, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
ndev--;
/* (Diagnostic) */
@@ -1839,8 +1850,7 @@ char *ReadSpiceTop(char *fname, int *fnum, int blackbox)
matchintfunc = matchfilenocase;
hashfunc = hashnocase;
spiceparams = (struct hashlist **)CALLOC(OBJHASHSIZE,
sizeof(struct hashlist *));
InitializeHashTable(&spiceparams, OBJHASHSIZE);
/* All spice files should start with a comment line, */
/* but we won't depend upon it. Any comment line */
@@ -1852,10 +1862,8 @@ char *ReadSpiceTop(char *fname, int *fnum, int blackbox)
// Cleanup
while (CellStack != NULL) PopStack(&CellStack);
RecurseHashTable(spiceparams, OBJHASHSIZE, freeprop);
HashKill(spiceparams, OBJHASHSIZE);
FREE(spiceparams);
spiceparams = NULL;
RecurseHashTable(&spiceparams, freeprop);
HashKill(&spiceparams);
// Important: If the file is a library, containing subcircuit
// definitions but no components, then it needs to be registered
+2 -2
View File
@@ -36,7 +36,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#define XILINXHASHSIZE 99
static long xilinxhashbase = 0xA00;
static struct hashlist *xilinxnametab[XILINXHASHSIZE];
static struct hashdict xilinxnamedict;
static FILE *xilinxfile;
char *gndnet = "0";
@@ -156,7 +156,7 @@ Xilinx(cellname, filename)
return;
}
ClearDumpedList();
InitializeHashTable(xilinxnametab, XILINXHASHSIZE);
InitializeHashTable(&xilinxnamedict, XILINXHASHSIZE);
if (LookupCell(cellname) != NULL)
xilinxCell(cellname);
CloseFile(FileName);
+1 -1
View File
@@ -65,7 +65,7 @@ CPP = gcc -E -x c
CXX = @CXX@
CPPFLAGS = -I. -I${NETGENDIR}
DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"45\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"54\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
CFLAGS = -g -m64 -fPIC -fPIC
DEPEND_FILE = Depend
-668
View File
@@ -1,668 +0,0 @@
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
-1816
View File
File diff suppressed because it is too large Load Diff
+3 -2
View File
@@ -52,6 +52,7 @@ int main(int argc, char *argv[])
{
#ifndef HAVE_GETOPT
char cell1[200], cell2[200];
int filenum = -1;
Debug = 0;
if (argc < 3 || argc > 5) {
@@ -60,10 +61,10 @@ int main(int argc, char *argv[])
}
Initialize();
STRCPY(cell1, ReadNetlist(argv[1]));
STRCPY(cell1, ReadNetlist(argv[1], &filenum));
if (argc >= 4) STRCPY(cell1, argv[3]); /* if explicit cell name specified */
STRCPY(cell2, ReadNetlist(argv[2]));
STRCPY(cell2, ReadNetlist(argv[2], &filenum));
if (argc == 5) STRCPY(cell2, argv[4]); /* if explicit cell name specified */
#else
char cell1[200], cell2[200];
+2 -1
View File
@@ -46,6 +46,7 @@ void STRCPY(char *dest, char *source)
int main(int argc, char *argv[])
{
char cellname[200];
int filenum = -1;
Debug = 0;
if (argc < 2 || argc > 3) {
@@ -55,7 +56,7 @@ int main(int argc, char *argv[])
Initialize();
ActelLib();
STRCPY(cellname, ReadNetlist(argv[1]));
STRCPY(cellname, ReadNetlist(argv[1], &filenum));
if (argc == 3) STRCPY(cellname, argv[2]);
Actel(cellname, NULL);
+2 -1
View File
@@ -48,6 +48,7 @@ void STRCPY(char *dest, char *source)
int main(int argc, char *argv[])
{
char cellname[200];
int filenum = -1;
Debug = 0;
if (argc < 2 || argc > 3) {
@@ -57,7 +58,7 @@ int main(int argc, char *argv[])
Initialize();
XilinxLib();
STRCPY(cellname, ReadNetlist(argv[1]));
STRCPY(cellname, ReadNetlist(argv[1], &filenum));
if (argc == 3) STRCPY(cellname, argv[2]);
Xilinx(cellname, NULL);
Binary file not shown.
+9 -8
View File
@@ -33,6 +33,7 @@ PATH: /sbin
PATH: /usr/bin
PATH: /usr/sbin
PATH: /usr/local/bin
PATH: /home/tim/src/timberwolf-6.3/bin
## ----------- ##
@@ -125,7 +126,7 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "45"
| #define NETGEN_REVISION "54"
| /* end confdefs.h. */
| #include <ac_nonexistent.h>
configure:3382: result: gcc -E
@@ -146,7 +147,7 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "45"
| #define NETGEN_REVISION "54"
| /* end confdefs.h. */
| #include <ac_nonexistent.h>
configure:3445: checking for library containing strerror
@@ -261,7 +262,7 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "45"
| #define NETGEN_REVISION "54"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
@@ -302,7 +303,7 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "45"
| #define NETGEN_REVISION "54"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
@@ -382,7 +383,7 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "45"
| #define NETGEN_REVISION "54"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
@@ -454,7 +455,7 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "45"
| #define NETGEN_REVISION "54"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
@@ -621,7 +622,7 @@ CC='gcc'
CFLAGS='-g -m64 -fPIC'
CPP='gcc -E -x c'
CPPFLAGS=''
DEFS='-DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"45\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1'
DEFS='-DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"54\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1'
DEPEND_FLAG='-MM'
ECHO_C=''
ECHO_N='printf'
@@ -734,7 +735,7 @@ unused=''
#define PACKAGE_BUGREPORT "[email protected]"
#define PACKAGE_URL ""
#define NETGEN_VERSION "1.5"
#define NETGEN_REVISION "45"
#define NETGEN_REVISION "54"
#define STDC_HEADERS 1
#define HAVE_SYS_TYPES_H 1
#define HAVE_SYS_STAT_H 1
+1 -1
View File
@@ -657,7 +657,7 @@ S["ECHO_T"]=""
S["ECHO_N"]="-n"
S["ECHO_C"]=""
S["DEFS"]="-DPACKAGE_NAME=\\\"netgen\\\" -DPACKAGE_TARNAME=\\\"netgen\\\" -DPACKAGE_VERSION=\\\"1.3\\\" -DPACKAGE_STRING=\\\"netgen\\ 1.3\\\" -DPACKAGE_BUGREPORT=\\\"eda-dev@open"\
"circuitdesign.com\\\" -DPACKAGE_URL=\\\"\\\" -DNETGEN_VERSION=\\\"1.5\\\" -DNETGEN_REVISION=\\\"45\\\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -"\
"circuitdesign.com\\\" -DPACKAGE_URL=\\\"\\\" -DNETGEN_VERSION=\\\"1.5\\\" -DNETGEN_REVISION=\\\"54\\\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -"\
"DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -D"\
"SIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHA"\
"VE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1"
+1 -1
View File
@@ -65,7 +65,7 @@ CPP = gcc -E -x c
CXX = @CXX@
CPPFLAGS = -I. -I${NETGENDIR}
DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"45\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"54\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
CFLAGS = -g -m64 -fPIC -fPIC
DEPEND_FILE = Depend
+9 -4
View File
@@ -145,8 +145,8 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out}} {
if {[verify equivalent]} {
# Resolve automorphisms by pin and property
netgen::run resolve
set result [verify unique]
if {$result == 0} {
set uresult [verify unique]
if {$uresult == 0} {
netgen::log put " Networks match locally but not globally.\n"
netgen::log put " Probably connections are swapped.\n"
netgen::log put " Check the end of logfile ${logfile} for implicated nodes.\n"
@@ -161,10 +161,15 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out}} {
} else {
# Match pins
netgen::log echo off
equate pins "$fnum1 [lindex $endval 0]" "$fnum2 [lindex $endval 1]"
set result [equate pins "$fnum1 [lindex $endval 0]" \
"$fnum2 [lindex $endval 1]"]
if {$result != 0} {
equate classes "$fnum1 [lindex $endval 0]" \
"$fnum2 [lindex $endval 1]"
}
netgen::log echo on
}
if {$result == 2} {lappend properr [lindex $endval 0]}
if {$uresult == 2} {lappend properr [lindex $endval 0]}
} else {
# Flatten the non-matching subcircuit (but not the top-level cells)
if {[netgen::print queue] != {}} {
+116 -27
View File
@@ -122,7 +122,7 @@ Command netgen_cmds[] = {
"<format> <file>\n "
"write a netlist file"},
{"flatten", _netgen_flatten,
"[class] <cell>\n "
"[class] [<parent>] <cell>\n "
"flatten a hierarchical cell"},
{"nodes", _netgen_nodes,
"[<element>] <cell> <file>\n "
@@ -1005,9 +1005,9 @@ _netgen_flatten(ClientData clientData,
{
char *repstr, *file;
int result, llen, filenum;
struct nlist *tp;
struct nlist *tp, *tp2;
if ((objc < 2) || (objc > 3)) {
if ((objc < 2) || (objc > 4)) {
Tcl_WrongNumArgs(interp, 1, objv, "?class? valid_cellname");
return TCL_ERROR;
}
@@ -1016,12 +1016,32 @@ _netgen_flatten(ClientData clientData,
if (result != TCL_OK) return result;
repstr = tp->name;
if (objc == 3) {
if (objc >= 3) {
char *argv = Tcl_GetString(objv[1]);
if (!strcmp(argv, "class")) {
tp = GetTopCell(filenum);
Printf("Flattening instances of %s in file %s\n", repstr, tp->name);
FlattenInstancesOf(repstr, filenum);
if (objc == 4) {
int numflat;
tp2 = LookupCellFile(Tcl_GetString(objv[2]), filenum);
if (tp2 == NULL) {
Tcl_SetResult(interp, "No such cell.", NULL);
return TCL_ERROR;
}
else {
Printf("Flattening instances of %s in cell %s within file %s\n",
repstr, tp2->name, tp->name);
numflat = flattenInstancesOf(tp2->name, filenum, repstr);
if (numflat == 0) {
Tcl_SetResult(interp, "No instances found to flatten.", NULL);
return TCL_ERROR;
}
}
}
else {
Printf("Flattening instances of %s in file %s\n", repstr, tp->name);
FlattenInstancesOf(repstr, filenum);
}
}
else {
Tcl_WrongNumArgs(interp, 1, objv, "class valid_cellname");
@@ -2009,8 +2029,9 @@ _netcmp_compare(ClientData clientData,
return TCL_ERROR;
}
CleanupPins(name1, fnum1); // Remove unconnected pins
CleanupPins(name2, fnum2); // Remove unconnected pins
// WIP!
// CleanupPins(name1, fnum1); // Remove unconnected pins
// CleanupPins(name2, fnum2); // Remove unconnected pins
UniquePins(name1, fnum1); // Check for and remove duplicate pins
UniquePins(name2, fnum2); // Check for and remove duplicate pins
@@ -2025,8 +2046,9 @@ _netcmp_compare(ClientData clientData,
// but define global nodes that are brought out as ports by
// ConvertGlobals().
CleanupPins(name1, fnum1);
CleanupPins(name2, fnum2);
// WIP!
// CleanupPins(name1, fnum1);
// CleanupPins(name2, fnum2);
CreateTwoLists(name1, fnum1, name2, fnum2);
while (PrematchLists(name1, fnum1, name2, fnum2) > 0) {
@@ -2342,8 +2364,11 @@ _netcmp_verify(ClientData clientData,
if (ElementClasses == NULL || NodeClasses == NULL) {
if (index == EQUIV_IDX || index == UNIQUE_IDX)
Tcl_SetObjResult(interp, Tcl_NewIntObj(-1));
else if (CurrentCell != NULL)
Fprintf(stdout, "Verify: cell %s has no elements and/or nodes."
" Not checked.\n", CurrentCell->name);
else
Fprintf(stdout, "Cell has no elements and/or nodes. Not checked.\n");
Fprintf(stdout, "Verify: no current cell to verify.\n");
return TCL_OK;
}
else {
@@ -2691,7 +2716,10 @@ _netcmp_equate(ClientData clientData,
case ELEM_IDX:
if (ElementClasses == NULL) {
Fprintf(stderr, "Cell has no elements.\n");
if (CurrentCell == NULL)
Fprintf(stderr, "Equate elements: no current cell.\n");
Fprintf(stderr, "Equate elements: cell %s and/or %s has no elements.\n",
name1, name2);
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(0));
return TCL_OK;
}
@@ -2707,7 +2735,10 @@ _netcmp_equate(ClientData clientData,
case PINS_IDX:
if (ElementClasses == NULL) {
Fprintf(stderr, "Cell has no elements.\n");
if (CurrentCell == NULL)
Fprintf(stderr, "Equate elements: no current cell.\n");
Fprintf(stderr, "Equate pins: cell %s and/or %s has no elements.\n",
name1, name2);
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(0));
return TCL_OK;
}
@@ -2939,6 +2970,7 @@ _netcmp_equate(ClientData clientData,
/* add --- add new property */
/* remove --- delete existing property */
/* tolerance --- set property tolerance */
/* merge --- set property merge behavior */
/* Formerly: (none) */
/* Results: */
/* Side Effects: */
@@ -2956,10 +2988,10 @@ _netcmp_property(ClientData clientData,
int ival, argstart;
char *options[] = {
"add", "create", "remove", "delete", "tolerance", NULL
"add", "create", "remove", "delete", "tolerance", "merge", NULL
};
enum OptionIdx {
ADD_IDX, CREATE_IDX, REMOVE_IDX, DELETE_IDX, TOLERANCE_IDX
ADD_IDX, CREATE_IDX, REMOVE_IDX, DELETE_IDX, TOLERANCE_IDX, MERGE_IDX
};
int result, index, idx2;
@@ -2970,6 +3002,13 @@ _netcmp_property(ClientData clientData,
INTEGER_IDX, DOUBLE_IDX, VALUE_IDX, STRING_IDX
};
char *mergeoptions[] = {
"none", "add", "add_critical", "par", "par_critical", NULL
};
enum MergeOptionIdx {
NONE_IDX, ADD_ONLY_IDX, ADD_CRIT_IDX, PAR_ONLY_IDX, PAR_CRIT_IDX
};
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "valid_cellname ?option?");
return TCL_ERROR;
@@ -2981,7 +3020,7 @@ _netcmp_property(ClientData clientData,
/* Print all properties of the cell as key/type/tolerance triplets */
tobj1 = Tcl_NewListObj(0, NULL);
kl = (struct property *)HashFirst(tp->proptab, OBJHASHSIZE);
kl = (struct property *)HashFirst(&(tp->propdict));
while (kl != NULL) {
tobj2 = Tcl_NewListObj(0, NULL);
@@ -3008,7 +3047,7 @@ _netcmp_property(ClientData clientData,
Tcl_ListObjAppendElement(interp, tobj1, tobj2);
kl = (struct property *)HashNext(tp->proptab, OBJHASHSIZE);
kl = (struct property *)HashNext(&(tp->propdict));
}
Tcl_SetObjResult(interp, tobj1);
}
@@ -3144,11 +3183,9 @@ _netcmp_property(ClientData clientData,
if (objc == 3) {
/* "remove" without additional arguments means */
/* delete all properties. */
RecurseHashTable(tp->proptab, OBJHASHSIZE, freeprop);
HashKill(tp->proptab, OBJHASHSIZE);
FREE(tp->proptab);
tp->proptab = (struct hashlist **)CALLOC(OBJHASHSIZE,
sizeof(struct hashlist *));
RecurseHashTable(&(tp->propdict), freeprop);
HashKill(&(tp->propdict));
InitializeHashTable(&(tp->propdict), OBJHASHSIZE);
}
else {
for (i = 3; i < objc; i++)
@@ -3175,16 +3212,68 @@ _netcmp_property(ClientData clientData,
if (result != TCL_OK) return result;
result = Tcl_GetIntFromObj(interp, tobj2, &ival);
if (result != TCL_OK) Tcl_ResetResult(interp);
if ((result = Tcl_GetDoubleFromObj(interp, tobj2, &dval))
!= TCL_OK)
return result;
if (result != TCL_OK) {
Tcl_ResetResult(interp);
if (!strncasecmp(Tcl_GetString(tobj2), "inf", 3)) {
ival = 1<<30;
dval = 1.0E+300;
}
else if ((result = Tcl_GetDoubleFromObj(interp, tobj2, &dval))
!= TCL_OK)
return result;
}
PropertyTolerance(tp->name, fnum, Tcl_GetString(tobj1),
ival, dval);
}
}
break;
case MERGE_IDX:
if (objc == 3) {
Tcl_WrongNumArgs(interp, 1, objv, "{property_key merge_type} ...");
return TCL_ERROR;
}
for (i = 3; i < objc; i++) {
// Each value must be a duplet
result = Tcl_ListObjLength(interp, objv[i], &llen);
if ((result != TCL_OK) || (llen != 2)) {
Tcl_SetResult(interp, "Not a {key merge_type} pair list.",
NULL);
}
else {
int mergeval;
result = Tcl_ListObjIndex(interp, objv[i], 0, &tobj1);
if (result != TCL_OK) return result;
result = Tcl_ListObjIndex(interp, objv[i], 1, &tobj2);
if (result != TCL_OK) return result;
result = Tcl_GetIndexFromObj(interp, tobj2,
(CONST84 char **)mergeoptions,
"merge_type", 0, &idx2);
if (result != TCL_OK) return result;
switch (idx2) {
case NONE_IDX:
mergeval = MERGE_NONE;
break;
case ADD_ONLY_IDX:
mergeval = MERGE_ADD;
break;
case ADD_CRIT_IDX:
mergeval = MERGE_ADD_CRIT;
break;
case PAR_ONLY_IDX:
mergeval = MERGE_PAR;
break;
case PAR_CRIT_IDX:
mergeval = MERGE_PAR_CRIT;
break;
}
PropertyMerge(tp->name, fnum, Tcl_GetString(tobj1), mergeval);
}
}
break;
}
}
return TCL_OK;