mirror of
https://github.com/RTimothyEdwards/netgen.git
synced 2026-08-22 22:17:22 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
758b5a249a | ||
|
|
15d10f1d93 | ||
|
|
a6e3e7e457 | ||
|
|
5f634b2a91 | ||
|
|
cbb2f78ee9 | ||
|
|
99c942eb2b | ||
|
|
4306562a1a | ||
|
|
2f8d50159f | ||
|
|
bbc9110431 | ||
|
|
f9c4fc86a0 | ||
|
|
e0527a0a89 | ||
|
|
be6a5a87ce | ||
|
|
317eb8ff0f | ||
|
|
6bf29235bc | ||
|
|
6428d5995c | ||
|
|
acd9a0e846 | ||
|
|
7edeb2e37d | ||
|
|
06d772edd0 | ||
|
|
9ae51e0150 | ||
|
|
f7cbae9efe | ||
|
|
086495bc28 | ||
|
|
846ab5369a | ||
|
|
8667bf0799 | ||
|
|
0caf47006c | ||
|
|
a7a94ab2be | ||
|
|
d612485a9b | ||
|
|
b245b79c20 | ||
|
|
c11252f196 | ||
|
|
5735181f88 | ||
|
|
6e144bf5fe | ||
|
|
c015bbe432 | ||
|
|
7a87a6f0d9 | ||
|
|
5e3cf08bfb |
@@ -3,6 +3,8 @@
|
||||
.inca.db.*
|
||||
inca.*.pak
|
||||
*.swp
|
||||
*.log
|
||||
*.so
|
||||
*~
|
||||
*/av_extracted*/
|
||||
.nfs*
|
||||
|
||||
+5
-5
@@ -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
@@ -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
File diff suppressed because it is too large
Load Diff
+134
-71
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
@@ -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
@@ -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'
|
||||
+3
-2
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user