mirror of
https://github.com/RTimothyEdwards/netgen.git
synced 2026-08-22 14:07:07 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dbcd36d3ec | ||
|
|
25c17abb70 | ||
|
|
fd019b4afd | ||
|
|
cdfd74bac4 | ||
|
|
dd9e02c5f3 | ||
|
|
26cd16f3ff | ||
|
|
ccdd47bc0b | ||
|
|
ace1c28507 | ||
|
|
5e9635e05f | ||
|
|
5c168946e3 | ||
|
|
1471f0c09f | ||
|
|
73b81fcfe3 | ||
|
|
b083a6df7c | ||
|
|
2b5a96500c | ||
|
|
66f94b47e6 | ||
|
|
09532ee628 | ||
|
|
2b7d416a41 | ||
|
|
090e9e122a | ||
|
|
67f1c1a2e9 | ||
|
|
a7dcb4ef45 | ||
|
|
a0f1b4cc92 | ||
|
|
b5d5496e40 | ||
|
|
7cac67c81b | ||
|
|
ede7406b08 | ||
|
|
516d1c33fb | ||
|
|
0ad5730701 | ||
|
|
24d98ff0d3 | ||
|
|
092c99dc1b | ||
|
|
4659b0795d | ||
|
|
b1924bff65 | ||
|
|
bd356553fd | ||
|
|
46458f2836 | ||
|
|
8deccaad9c | ||
|
|
4f24915661 | ||
|
|
fdab366627 | ||
|
|
310d7512a0 | ||
|
|
86f52b164a | ||
|
|
4a47c3076d | ||
|
|
777498b30e | ||
|
|
8300531858 | ||
|
|
80378d8816 | ||
|
|
80d981a672 | ||
|
|
809a3c16e9 | ||
|
|
8d976e5686 | ||
|
|
577dfb5a28 | ||
|
|
46252ad6b9 | ||
|
|
564fab9667 | ||
|
|
0df4190e19 | ||
|
|
2f661ea256 | ||
|
|
fca075e1ed | ||
|
|
cc2a5e0ee6 | ||
|
|
b7a8d3cfda | ||
|
|
0205902baa | ||
|
|
646b351ee5 | ||
|
|
31a0f10602 | ||
|
|
a2b1f5c85f | ||
|
|
9148edde69 | ||
|
|
bb07a84ae1 | ||
|
|
d753e2c208 | ||
|
|
bd3b88de4a | ||
|
|
668aa38340 | ||
|
|
d99bffa74f | ||
|
|
7ce3b1dcd8 | ||
|
|
366821fe7f | ||
|
|
7ef7ae36de | ||
|
|
675b3e0743 | ||
|
|
cad7e0e293 | ||
|
|
19fdbfd185 | ||
|
|
22c2a31e7f | ||
|
|
950bb976e6 | ||
|
|
b7363862b3 | ||
|
|
29566bde4d | ||
|
|
99d096cfc1 | ||
|
|
9943676df4 | ||
|
|
568ed65c05 | ||
|
|
cb85aa7115 | ||
|
|
be819b7200 | ||
|
|
618f912cac | ||
|
|
17c2bff72b | ||
|
|
7e68f3a32e | ||
|
|
c60443b862 | ||
|
|
4a295dbfe4 | ||
|
|
eb72af6d54 | ||
|
|
e7f2cacc88 | ||
|
|
7dfe6ee19f | ||
|
|
c7f27c909f | ||
|
|
758b5a249a | ||
|
|
15d10f1d93 | ||
|
|
a6e3e7e457 | ||
|
|
5f634b2a91 |
+11
-10
@@ -1,12 +1,13 @@
|
||||
*.*%
|
||||
*.cdslck
|
||||
.inca.db.*
|
||||
inca.*.pak
|
||||
*.swp
|
||||
*.log
|
||||
netgen
|
||||
netgenexec
|
||||
defs.mak
|
||||
Depend
|
||||
config.cache
|
||||
config.log
|
||||
config.status
|
||||
*.o
|
||||
*.so
|
||||
*~
|
||||
*/av_extracted*/
|
||||
.nfs*
|
||||
*.cd-
|
||||
*/mommdl/
|
||||
*.log
|
||||
UPDATE_ME
|
||||
VERSION
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
TO_DO list for version 1.5
|
||||
------------------------------
|
||||
|
||||
1) Parallel (transistors and capacitors) and serial (resistors)
|
||||
device merging, plus methods for describing how any device
|
||||
class may be merged.
|
||||
As of version 1.5.70, the major to-do item list is complete.
|
||||
|
||||
Possible useful additions (not critical)
|
||||
----------------------
|
||||
|
||||
1) Add new output style allowing netlists to be described by Tcl scripts
|
||||
(similar to the C-Code format, but does not require compiling).
|
||||
(similar to the C-Code format, but does not require compiling) (this
|
||||
was done in 1.5.72, but now needs some scripts to make use of it.)
|
||||
2) Add automatic file format guessing from file extension for "write" command
|
||||
3) Add Tk GUI to match (and improve upon!) the original X11 GUI.
|
||||
4) Incorporate into Tcl-based xcircuit
|
||||
@@ -33,5 +32,7 @@ Possible useful additions (not critical)
|
||||
ntk and ext formats, SPICE format writing, and sim format reading).
|
||||
11) Add a "property" command to add/remove properties to check, and change
|
||||
the slop values (done).
|
||||
12) Add a "subcircuit" command to mimic a SPICE ".SUBCKT ... .ENDS" card.
|
||||
12) Add a "subcircuit" command to mimic a SPICE ".SUBCKT ... .ENDS" card
|
||||
(i.e., the ability to add subcircuit "stub" definitions from the
|
||||
command line or from a setup file).
|
||||
|
||||
|
||||
+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);
|
||||
|
||||
@@ -20,7 +20,6 @@ int MaxCPUTime = 100; /* max number of seconds to burn */
|
||||
#define MAX_CHANGES_PER_ITER 2
|
||||
|
||||
#if 0
|
||||
/* INLINE */
|
||||
float RandomUniform(void)
|
||||
{
|
||||
/* DANGER! DANGER! Non-portable code below!! */
|
||||
|
||||
@@ -36,7 +36,6 @@ int CountFanoutOK;
|
||||
int CountSwallowedElements;
|
||||
|
||||
|
||||
INLINE
|
||||
int Independent(int E1, int E2)
|
||||
/* return 1 if E1 and E2 share no leaves in common */
|
||||
{
|
||||
@@ -47,7 +46,6 @@ int Independent(int E1, int E2)
|
||||
return(1);
|
||||
}
|
||||
|
||||
INLINE
|
||||
int FanoutOK(int E1, int E2)
|
||||
{
|
||||
int approxfanout;
|
||||
@@ -67,7 +65,6 @@ int FanoutOK(int E1, int E2)
|
||||
}
|
||||
|
||||
|
||||
INLINE
|
||||
int Swallowed(int Parent, int Child)
|
||||
/* returns 1 if Child's fanout is contained in Parent's */
|
||||
{
|
||||
@@ -107,7 +104,6 @@ int SmallEnough(int E1, int E2)
|
||||
}
|
||||
#endif
|
||||
|
||||
INLINE
|
||||
int SuccessfulEmbedding(int E)
|
||||
/* returns 1 if element E is a successful embedding */
|
||||
{
|
||||
|
||||
@@ -117,15 +117,6 @@
|
||||
#define memzero(ptr, len) memset(ptr, 0, len)
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef INLINE
|
||||
#ifdef __GNUC__
|
||||
#define INLINE inline
|
||||
#else
|
||||
#define INLINE
|
||||
#endif /* __GNUC__ */
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYSV_STRING
|
||||
#undef NEED_STRING
|
||||
#endif
|
||||
|
||||
@@ -348,7 +348,6 @@ void PRINTPACKED(unsigned long *mstar)
|
||||
#ifdef IBMPC
|
||||
static unsigned int lochash(unsigned long *mstar)
|
||||
#else
|
||||
INLINE
|
||||
static unsigned long lochash(unsigned long *mstar)
|
||||
#endif
|
||||
{
|
||||
@@ -432,7 +431,6 @@ static struct ex_entry *hashinstall(unsigned long *mstar)
|
||||
return(ex_tab[hashval] = np);
|
||||
}
|
||||
|
||||
/* INLINE */
|
||||
int Exists(int E1, int E2)
|
||||
{
|
||||
int i;
|
||||
@@ -470,7 +468,6 @@ int InitializeExistTest(void)
|
||||
return(1);
|
||||
}
|
||||
|
||||
/* INLINE */
|
||||
void AddToExistSet(int E1, int E2)
|
||||
{
|
||||
int i;
|
||||
|
||||
+5
-5
@@ -170,7 +170,7 @@ char *ReadExt(char *fname, int doflat, int *fnum)
|
||||
|
||||
SetExtension(name, fname, EXT_EXTENSION);
|
||||
if ((filenum = OpenParseFile(name, *fnum)) < 0) {
|
||||
Printf("No file: %s\n",name);
|
||||
Printf("Error in ext file read: No file %s\n",name);
|
||||
*fnum = filenum;
|
||||
return NULL;
|
||||
}
|
||||
@@ -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 */
|
||||
@@ -643,7 +643,7 @@ char *ReadSim(char *fname, int *fnum)
|
||||
|
||||
SetExtension(name, fname, SIM_EXTENSION);
|
||||
if (OpenParseFile(name, *fnum) < 0) {
|
||||
Printf("No file: %s\n",name);
|
||||
Printf("Error in ext file read: No file %s\n",name);
|
||||
*fnum = filenum;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+83
-94
@@ -24,6 +24,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
|
||||
#ifdef IBMPC
|
||||
#include <alloc.h>
|
||||
@@ -39,6 +40,8 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
#include "print.h"
|
||||
#include "netcmp.h"
|
||||
|
||||
extern struct hashdict spiceparams;
|
||||
|
||||
#define OLDPREFIX 1
|
||||
|
||||
void flattenCell(char *name, int file)
|
||||
@@ -95,7 +98,7 @@ void flattenCell(char *name, int file)
|
||||
if (ChildCell->dumped == 0) flattenCell(ParentParams->model.class,
|
||||
ChildCell->file);
|
||||
|
||||
ChildObjList = CopyObjList(ChildCell->cell);
|
||||
ChildObjList = CopyObjList(ChildCell->cell, 1);
|
||||
|
||||
/* update node numbers in child to unique numbers */
|
||||
oldmax = 0;
|
||||
@@ -177,7 +180,7 @@ void flattenCell(char *name, int file)
|
||||
}
|
||||
}
|
||||
}
|
||||
HashPtrInstall(tmp->name, tmp, ThisCell->objtab, OBJHASHSIZE);
|
||||
HashPtrInstall(tmp->name, tmp, &(ThisCell->objdict));
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -198,9 +201,9 @@ void flattenCell(char *name, int file)
|
||||
#endif
|
||||
FreeString(tmp->instance.name);
|
||||
tmp->instance.name = strsave(tmpstr);
|
||||
HashPtrInstall(tmp->name, tmp, ThisCell->objtab, OBJHASHSIZE);
|
||||
HashPtrInstall(tmp->name, tmp, &(ThisCell->objdict));
|
||||
if (tmp->type == FIRSTPIN)
|
||||
HashPtrInstall(tmp->instance.name, tmp, ThisCell->insttab, OBJHASHSIZE);
|
||||
HashPtrInstall(tmp->instance.name, tmp, &(ThisCell->instdict));
|
||||
}
|
||||
|
||||
/* splice instance out of parent */
|
||||
@@ -322,7 +325,7 @@ int flattenInstancesOf(char *name, int fnum, char *instance)
|
||||
/* if this is a new instance, flatten it */
|
||||
/* if (ChildCell->dumped == 0) flattenCell(ParentParams->model.class, file); */
|
||||
|
||||
ChildObjList = CopyObjList(ChildCell->cell);
|
||||
ChildObjList = CopyObjList(ChildCell->cell, 1);
|
||||
numflat++;
|
||||
|
||||
/* update node numbers in child to unique numbers */
|
||||
@@ -440,7 +443,7 @@ int flattenInstancesOf(char *name, int fnum, char *instance)
|
||||
}
|
||||
// Don't hash this if the parent had a port of this name
|
||||
if (!ob2 || ob2->type != PORT)
|
||||
HashPtrInstall(tmp->name, tmp, ThisCell->objtab, OBJHASHSIZE);
|
||||
HashPtrInstall(tmp->name, tmp, &(ThisCell->objdict));
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -461,55 +464,52 @@ int flattenInstancesOf(char *name, int fnum, char *instance)
|
||||
#endif
|
||||
FreeString(tmp->instance.name);
|
||||
tmp->instance.name = strsave(tmpstr);
|
||||
HashPtrInstall(tmp->name, tmp, ThisCell->objtab, OBJHASHSIZE);
|
||||
HashPtrInstall(tmp->name, tmp, &(ThisCell->objdict));
|
||||
if (tmp->type == FIRSTPIN)
|
||||
HashPtrInstall(tmp->instance.name, tmp, ThisCell->insttab, OBJHASHSIZE);
|
||||
HashPtrInstall(tmp->instance.name, tmp, &(ThisCell->instdict));
|
||||
}
|
||||
|
||||
/* do property inheritance */
|
||||
/* Do property inheritance */
|
||||
|
||||
if (ParentProps) {
|
||||
for (ob2 = ChildObjList; ob2 != NULL; ob2=ob2->next) {
|
||||
|
||||
/* If the parent cell has properties to declare, then */
|
||||
/* pass them on to children. */
|
||||
/* pass them on to children. Use globals only if the */
|
||||
/* spiceparams dictionary is active (during file reading */
|
||||
/* only). */
|
||||
|
||||
if (ob2->type == PROPERTY) {
|
||||
struct valuelist *vl;
|
||||
int i;
|
||||
for (i == 0;; i++) {
|
||||
vl = &(ob2->instance.props[i]);
|
||||
if (vl->type == PROP_ENDLIST) break;
|
||||
else if (vl->type == PROP_EXPRESSION) {
|
||||
/* Only expressions take substitutions */
|
||||
struct tokstack *token;
|
||||
for (token = vl->value.stack; token; token = token->next) {
|
||||
/* WIP */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ob2->type == PROPERTY)
|
||||
ReduceExpressions(ob2, ParentProps, ChildCell,
|
||||
(spiceparams.hashtab == NULL) ? 0 : 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* splice instance out of parent */
|
||||
if (ParentParams == ThisCell->cell) {
|
||||
/* ParentParams are the very first thing in the list */
|
||||
ThisCell->cell = ChildObjList;
|
||||
for (ob2 = ChildObjList; ob2 && ob2->next != NULL; ob2 = ob2->next) ;
|
||||
if ((ParentParams == ThisCell->cell) && (ChildObjList == NULL)) {
|
||||
ThisCell->cell = ob2; /* Child cell was empty */
|
||||
tmp = ob2;
|
||||
}
|
||||
else {
|
||||
/* find ParentParams in ThisCell list */
|
||||
for (ob2 = ThisCell->cell; ob2 && ob2->next != ParentParams; ob2=ob2->next);
|
||||
if (ob2)
|
||||
for (ob2->next = ChildObjList; ob2->next != NULL; ob2 = ob2->next) ;
|
||||
}
|
||||
/* now, ob2 is last element in child list, so skip and reclaim parent */
|
||||
if (ParentParams == ThisCell->cell) {
|
||||
/* ParentParams are the very first thing in the list */
|
||||
ThisCell->cell = ChildObjList;
|
||||
for (ob2 = ChildObjList; ob2 && ob2->next != NULL; ob2 = ob2->next) ;
|
||||
}
|
||||
else {
|
||||
/* find ParentParams in ThisCell list */
|
||||
for (ob2 = ThisCell->cell; ob2 && ob2->next != ParentParams; ob2=ob2->next);
|
||||
if (ob2)
|
||||
for (ob2->next = ChildObjList; ob2->next != NULL; ob2 = ob2->next) ;
|
||||
}
|
||||
/* now, ob2 is last element in child list, so skip and reclaim parent */
|
||||
|
||||
tmp = ParentParams;
|
||||
do {
|
||||
tmp = tmp->next;
|
||||
} while ((tmp != NULL) && (tmp->type > FIRSTPIN));
|
||||
if (ob2) ob2->next = tmp;
|
||||
tmp = ParentParams;
|
||||
do {
|
||||
tmp = tmp->next;
|
||||
} while ((tmp != NULL) && ((tmp->type > FIRSTPIN) || (tmp->type == PROPERTY)));
|
||||
if (ob2) ob2->next = tmp;
|
||||
}
|
||||
while (ParentParams != tmp) {
|
||||
ob2 = ParentParams->next;
|
||||
FreeObjectAndHash(ParentParams, ThisCell);
|
||||
@@ -526,8 +526,8 @@ int flattenInstancesOf(char *name, int fnum, char *instance)
|
||||
|
||||
void Flatten(char *name, int file)
|
||||
{
|
||||
ClearDumpedList(); /* keep track of flattened cells */
|
||||
flattenCell(name, file);
|
||||
ClearDumpedList(); /* keep track of flattened cells */
|
||||
flattenCell(name, file);
|
||||
}
|
||||
|
||||
|
||||
@@ -704,7 +704,7 @@ void convertGlobalsOf(char *name, int fnum, char *instance)
|
||||
newnode->instance.name = NULL;
|
||||
newnode->model.class = NULL;
|
||||
newpin->node = maxnode;
|
||||
HashPtrInstall(newnode->name, newnode, ThisCell->objtab, OBJHASHSIZE);
|
||||
HashPtrInstall(newnode->name, newnode, &(ThisCell->objdict));
|
||||
}
|
||||
|
||||
// Remove any references to the net as a GLOBAL type in the instance
|
||||
@@ -727,7 +727,7 @@ void convertGlobalsOf(char *name, int fnum, char *instance)
|
||||
// Now there should be only one object of this name in the instance,
|
||||
// which is the pin, and we will set the hash table to point to it.
|
||||
|
||||
HashPtrInstall(newpin->name, newpin, ThisCell->objtab, OBJHASHSIZE);
|
||||
HashPtrInstall(newpin->name, newpin, &(ThisCell->objdict));
|
||||
|
||||
}
|
||||
CacheNodeNames(ThisCell);
|
||||
@@ -840,7 +840,7 @@ void ConvertGlobals(char *name, int filenum)
|
||||
strsave(ObjList->instance.name) : NULL;
|
||||
NewObj->name = (ObjList->name) ? strsave(ObjList->name) : NULL;
|
||||
|
||||
HashPtrInstall(NewObj->name, NewObj, ThisCell->objtab, OBJHASHSIZE);
|
||||
HashPtrInstall(NewObj->name, NewObj, &(ThisCell->objdict));
|
||||
|
||||
/* Find all parent cells of this cell. Find the global node */
|
||||
/* if it exists or create it if it doesn't. Add the node to */
|
||||
@@ -959,11 +959,11 @@ struct nlist *uniquepins(struct hashlist *p, void *clientdata)
|
||||
modified = 1;
|
||||
|
||||
// Check if the node we're about to remove is in the
|
||||
// objtab hash table; if so, replace it with the one
|
||||
// objdict hash table; if so, replace it with the one
|
||||
// that we are going to keep.
|
||||
|
||||
if (LookupObject(ob->name, ptr) == ob) {
|
||||
HashPtrInstall(ob->name, saveob, ptr->objtab, OBJHASHSIZE);
|
||||
HashPtrInstall(ob->name, saveob, &(ptr->objdict));
|
||||
}
|
||||
}
|
||||
tob = tob->next;
|
||||
@@ -998,7 +998,7 @@ struct nlist *uniquepins(struct hashlist *p, void *clientdata)
|
||||
|
||||
// Renumber the pins in order. Since when removing duplicates, the
|
||||
// first entry is always kept, the first pin is never changed, so
|
||||
// the insttab record is never corrupted.
|
||||
// the instdict record is never corrupted.
|
||||
|
||||
i = FIRSTPIN;
|
||||
firstpin->type = i++;
|
||||
@@ -1093,8 +1093,7 @@ int UniquePins(char *name, int filenum)
|
||||
// The hash table is pointing at the cell we are
|
||||
// about to delete. Hash the one we're keeping instead.
|
||||
|
||||
HashPtrInstall(ob->name, firstport[ob->node],
|
||||
ThisCell->objtab, OBJHASHSIZE);
|
||||
HashPtrInstall(ob->name, firstport[ob->node], &(ThisCell->objdict));
|
||||
}
|
||||
|
||||
if (lob == NULL) {
|
||||
@@ -1131,7 +1130,7 @@ int UniquePins(char *name, int filenum)
|
||||
/* Callback function for CleanupPins */
|
||||
/* Note that if the first pin of the instance is a */
|
||||
/* disconnected node, then removing it invalidates the */
|
||||
/* insttab hash. */
|
||||
/* instdict hash. */
|
||||
/*------------------------------------------------------*/
|
||||
|
||||
struct nlist *cleanuppins(struct hashlist *p, void *clientdata)
|
||||
@@ -1181,9 +1180,9 @@ struct nlist *cleanuppins(struct hashlist *p, void *clientdata)
|
||||
}
|
||||
|
||||
// Check if the node we're about to remove is in the
|
||||
// objtab hash table
|
||||
// objdict hash table
|
||||
if (LookupObject(ob->name, ptr) == ob) {
|
||||
HashDelete(ob->name, ptr->objtab, OBJHASHSIZE);
|
||||
HashDelete(ob->name, &(ptr->objdict));
|
||||
}
|
||||
|
||||
FREE(ob->name);
|
||||
@@ -1199,10 +1198,9 @@ struct nlist *cleanuppins(struct hashlist *p, void *clientdata)
|
||||
obt = obt->next;
|
||||
}
|
||||
|
||||
/* Rehash the insttab, in case the first pin got removed */
|
||||
/* Rehash the instdict, in case the first pin got removed */
|
||||
if (firstpin && (firstpin->type == FIRSTPIN))
|
||||
HashPtrInstall(firstpin->instance.name, firstpin, ptr->insttab,
|
||||
OBJHASHSIZE);
|
||||
HashPtrInstall(firstpin->instance.name, firstpin, &(ptr->instdict));
|
||||
}
|
||||
}
|
||||
return NULL; /* Keep the search going */
|
||||
@@ -1272,9 +1270,9 @@ int CleanupPins(char *name, int filenum)
|
||||
}
|
||||
|
||||
// Check if the node we're about to remove is in the
|
||||
// objtab hash table
|
||||
// objdict hash table
|
||||
if (LookupObject(ob->name, ThisCell) == ob) {
|
||||
HashDelete(ob->name, ThisCell->objtab, OBJHASHSIZE);
|
||||
HashDelete(ob->name, &(ThisCell->objdict));
|
||||
}
|
||||
|
||||
FREE(ob->name);
|
||||
@@ -1307,11 +1305,11 @@ typedef struct ecomplist {
|
||||
} ECompList;
|
||||
|
||||
/*------------------------------------------------------*/
|
||||
/* Survey the contents of a cell and
|
||||
/* Survey the contents of a cell and sort into a hash */
|
||||
/*------------------------------------------------------*/
|
||||
|
||||
void
|
||||
SurveyCell(struct nlist *tc, struct hashlist **comptab, int file1, int file2, int which)
|
||||
SurveyCell(struct nlist *tc, struct hashdict *compdict, int file1, int file2, int which)
|
||||
{
|
||||
struct objlist *ob;
|
||||
struct nlist *tsub, *teq;
|
||||
@@ -1331,8 +1329,7 @@ SurveyCell(struct nlist *tc, struct hashlist **comptab, int file1, int file2, in
|
||||
else dstr = NULL;
|
||||
|
||||
teq = LookupClassEquivalent(ob->model.class, file, ofile);
|
||||
ecomp = (ECompare *)HashInt2Lookup(ob->model.class, file,
|
||||
comptab, OBJHASHSIZE);
|
||||
ecomp = (ECompare *)HashInt2Lookup(ob->model.class, file, compdict);
|
||||
|
||||
if (ecomp == NULL) {
|
||||
ncomp = (ECompare *)MALLOC(sizeof(ECompare));
|
||||
@@ -1352,19 +1349,16 @@ SurveyCell(struct nlist *tc, struct hashlist **comptab, int file1, int file2, in
|
||||
ncomp->add2 = 0;
|
||||
ncomp->refcount = (char)1;
|
||||
|
||||
HashInt2PtrInstall(ob->model.class, file, ncomp, comptab,
|
||||
OBJHASHSIZE);
|
||||
HashInt2PtrInstall(ob->model.class, file, ncomp, compdict);
|
||||
if (teq != NULL) {
|
||||
char *bstr = NULL;
|
||||
if (teq->flags & CELL_DUPLICATE) {
|
||||
bstr = strstr(teq->name, "[[");
|
||||
if (bstr) *bstr = '\0';
|
||||
}
|
||||
qcomp = (ECompare *)HashInt2Lookup(teq->name, ofile,
|
||||
comptab, OBJHASHSIZE);
|
||||
qcomp = (ECompare *)HashInt2Lookup(teq->name, ofile, compdict);
|
||||
if (qcomp == NULL) {
|
||||
HashInt2PtrInstall(teq->name, ofile, ncomp, comptab,
|
||||
OBJHASHSIZE);
|
||||
HashInt2PtrInstall(teq->name, ofile, ncomp, compdict);
|
||||
ncomp->refcount++;
|
||||
}
|
||||
if (bstr) *bstr = '[';
|
||||
@@ -1393,7 +1387,7 @@ SurveyCell(struct nlist *tc, struct hashlist **comptab, int file1, int file2, in
|
||||
/* */
|
||||
/* If there is a mismatch between instances of low- */
|
||||
/* level devices, determine if the mismatches can be */
|
||||
/* resolved by parallel/serial combining, accoring to */
|
||||
/* resolved by parallel/serial combining, according to */
|
||||
/* combination rules. */
|
||||
/* */
|
||||
/* Return the number of modifications made. */
|
||||
@@ -1404,7 +1398,7 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
{
|
||||
struct nlist *tc1, *tc2, *tsub1, *tsub2;
|
||||
struct objlist *ob1, *ob2, *lob;
|
||||
struct hashlist **comptab;
|
||||
struct hashdict compdict;
|
||||
ECompare *ecomp, *ncomp;
|
||||
ECompList *list0X, *listX0;
|
||||
int match, modified = 0;
|
||||
@@ -1421,14 +1415,13 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
|
||||
if (tc1 == NULL || tc2 == NULL) return;
|
||||
|
||||
comptab = (struct hashlist **)CALLOC(OBJHASHSIZE,
|
||||
sizeof(struct hashlist *));
|
||||
InitializeHashTable(&compdict, OBJHASHSIZE);
|
||||
|
||||
// Gather information about instances of cell "name1"
|
||||
SurveyCell(tc1, comptab, file1, file2, 0);
|
||||
SurveyCell(tc1, &compdict, file1, file2, 0);
|
||||
|
||||
// Gather information about instances of cell "name2"
|
||||
SurveyCell(tc2, comptab, file1, file2, 1);
|
||||
SurveyCell(tc2, &compdict, file1, file2, 1);
|
||||
|
||||
// Find all instances of one cell that have fewer in
|
||||
// the compared circuit. Check whether subcircuits
|
||||
@@ -1436,7 +1429,7 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
// or subcircuits that have more in the compared circuit.
|
||||
|
||||
listX0 = list0X = NULL;
|
||||
ecomp = (ECompare *)HashFirst(comptab, OBJHASHSIZE);
|
||||
ecomp = (ECompare *)HashFirst(&compdict);
|
||||
while (ecomp != NULL) {
|
||||
|
||||
/* Case 1: Both cell1 and cell2 classes are subcircuits, */
|
||||
@@ -1452,7 +1445,7 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
for (ob2 = ecomp->cell2->cell; ob2; ob2 = ob2->next) {
|
||||
if (ob2->type == FIRSTPIN) {
|
||||
ncomp = (ECompare *)HashInt2Lookup(ob2->model.class,
|
||||
ecomp->cell2->file, comptab, OBJHASHSIZE);
|
||||
ecomp->cell2->file, &compdict);
|
||||
if (ncomp != NULL) {
|
||||
if ((ncomp->num1 > ncomp->num2) &&
|
||||
((ncomp->add2 + ecomp->num2) >=
|
||||
@@ -1498,8 +1491,7 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
for (ob2 = ecomp->cell2->cell; ob2; ob2 = ob2->next) {
|
||||
if (ob2->type == FIRSTPIN) {
|
||||
ncomp = (ECompare *)HashInt2Lookup(ob2->model.class,
|
||||
ecomp->cell2->file, comptab,
|
||||
OBJHASHSIZE);
|
||||
ecomp->cell2->file, &compdict);
|
||||
if (ncomp != NULL) {
|
||||
if (match) {
|
||||
ncomp->num1 += ncomp->add1;
|
||||
@@ -1549,7 +1541,7 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
for (ob2 = ecomp->cell2->cell; ob2; ob2 = ob2->next) {
|
||||
if (ob2->type == FIRSTPIN) {
|
||||
ncomp = (ECompare *)HashInt2Lookup(ob2->model.class,
|
||||
ecomp->cell2->file, comptab, OBJHASHSIZE);
|
||||
ecomp->cell2->file, &compdict);
|
||||
if (ncomp != NULL) {
|
||||
if ((ncomp->num1 > ncomp->num2) &&
|
||||
((ncomp->add2 + ecomp->num2) <=
|
||||
@@ -1582,8 +1574,7 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
for (ob2 = ecomp->cell2->cell; ob2; ob2 = ob2->next) {
|
||||
if (ob2->type == FIRSTPIN) {
|
||||
ncomp = (ECompare *)HashInt2Lookup(ob2->model.class,
|
||||
ecomp->cell2->file, comptab,
|
||||
OBJHASHSIZE);
|
||||
ecomp->cell2->file, &compdict);
|
||||
if (ncomp != NULL) {
|
||||
if (match) {
|
||||
ncomp->num2 += ncomp->add2;
|
||||
@@ -1608,7 +1599,7 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
for (ob2 = ecomp->cell1->cell; ob2; ob2 = ob2->next) {
|
||||
if (ob2->type == FIRSTPIN) {
|
||||
ncomp = (ECompare *)HashInt2Lookup(ob2->model.class,
|
||||
ecomp->cell1->file, comptab, OBJHASHSIZE);
|
||||
ecomp->cell1->file, &compdict);
|
||||
if (ncomp != NULL) {
|
||||
if ((ncomp->num2 > ncomp->num1) &&
|
||||
((ncomp->add1 + ecomp->num1) <=
|
||||
@@ -1641,8 +1632,7 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
for (ob2 = ecomp->cell1->cell; ob2; ob2 = ob2->next) {
|
||||
if (ob2->type == FIRSTPIN) {
|
||||
ncomp = (ECompare *)HashInt2Lookup(ob2->model.class,
|
||||
ecomp->cell1->file, comptab,
|
||||
OBJHASHSIZE);
|
||||
ecomp->cell1->file, &compdict);
|
||||
if (ncomp != NULL) {
|
||||
if (match) {
|
||||
ncomp->num1 += ncomp->add1;
|
||||
@@ -1656,13 +1646,13 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
}
|
||||
ecomp->add1 = 0;
|
||||
}
|
||||
ecomp = (ECompare *)HashNext(comptab, OBJHASHSIZE);
|
||||
}
|
||||
ecomp = (ECompare *)HashNext(&compdict);
|
||||
}
|
||||
|
||||
// Remove non-matching zero-value devices. This can
|
||||
// be done on a per-instance basis.
|
||||
|
||||
ecomp = (ECompare *)HashFirst(comptab, OBJHASHSIZE);
|
||||
ecomp = (ECompare *)HashFirst(&compdict);
|
||||
while (ecomp != NULL) {
|
||||
if ((ecomp->num1 != ecomp->num2) && (ecomp->cell1 != NULL) &&
|
||||
(ecomp->cell1->class == CLASS_RES)) {
|
||||
@@ -1869,7 +1859,7 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
}
|
||||
}
|
||||
}
|
||||
ecomp = (ECompare *)HashNext(comptab, OBJHASHSIZE);
|
||||
ecomp = (ECompare *)HashNext(&compdict);
|
||||
}
|
||||
|
||||
// Finally, check all entries in listX0 vs. all entries in list0X to see
|
||||
@@ -1901,7 +1891,7 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
if (dstr) *dstr = '\0';
|
||||
}
|
||||
ncomp = (ECompare *)HashInt2Lookup(ob1->model.class,
|
||||
ecompX0->cell1->file, comptab, OBJHASHSIZE);
|
||||
ecompX0->cell1->file, &compdict);
|
||||
if (dstr) *dstr = '[';
|
||||
if ((ncomp == ecomp0X) && (ecomp0X->num2 <= ecompX0->num1)) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s"
|
||||
@@ -1927,7 +1917,7 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
if (dstr) *dstr = '\0';
|
||||
}
|
||||
ncomp = (ECompare *)HashInt2Lookup(ob2->model.class,
|
||||
ecomp0X->cell2->file, comptab, OBJHASHSIZE);
|
||||
ecomp0X->cell2->file, &compdict);
|
||||
if (dstr) *dstr = '[';
|
||||
if ((ncomp == ecompX0) && (ecompX0->num1 <= ecomp0X->num2)) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s"
|
||||
@@ -1948,13 +1938,12 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
|
||||
// Free the hash table and its contents.
|
||||
|
||||
ecomp = (ECompare *)HashFirst(comptab, OBJHASHSIZE);
|
||||
ecomp = (ECompare *)HashFirst(&compdict);
|
||||
while (ecomp != NULL) {
|
||||
if (--ecomp->refcount == (char)0) FREE(ecomp);
|
||||
ecomp = (ECompare *)HashNext(comptab, OBJHASHSIZE);
|
||||
ecomp = (ECompare *)HashNext(&compdict);
|
||||
}
|
||||
HashKill(comptab, OBJHASHSIZE);
|
||||
FREE(comptab);
|
||||
HashKill(&compdict);
|
||||
|
||||
// Free the 0:X and X:0 lists
|
||||
while (listX0 != NULL) {
|
||||
|
||||
+85
-78
@@ -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;
|
||||
}
|
||||
@@ -164,14 +167,14 @@ unsigned long genhash(char *s, int c, int hashsize)
|
||||
/* 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 */
|
||||
}
|
||||
@@ -183,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;
|
||||
@@ -209,14 +212,14 @@ void *HashIntLookup(char *s, int i, struct hashlist **hashtab, int hashsize)
|
||||
/* first, then the character string. */
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
void *HashInt2Lookup(char *s, int c, struct hashlist **hashtab, int hashsize)
|
||||
void *HashInt2Lookup(char *s, int c, struct hashdict *dict)
|
||||
{
|
||||
struct hashlist *np;
|
||||
unsigned long hashval;
|
||||
|
||||
hashval = genhash(s, c, hashsize);
|
||||
hashval = genhash(s, c, dict->hashsize);
|
||||
|
||||
for (np = hashtab[hashval]; np != NULL; np = np->next)
|
||||
for (np = dict->hashtab[hashval]; np != NULL; np = np->next)
|
||||
if (!strcmp(s, np->name))
|
||||
return (np->ptr); /* correct match */
|
||||
|
||||
@@ -228,14 +231,13 @@ void *HashInt2Lookup(char *s, int c, struct hashlist **hashtab, int hashsize)
|
||||
/* return the hashlist entry, after (re)initializing its 'ptr' field */
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
struct hashlist *HashPtrInstall(char *name, void *ptr,
|
||||
struct hashlist **hashtab, int hashsize)
|
||||
struct hashlist *HashPtrInstall(char *name, void *ptr, 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)) {
|
||||
np->ptr = ptr;
|
||||
return (np); /* match found in hash table */
|
||||
@@ -246,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);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
@@ -256,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 */
|
||||
@@ -273,8 +275,8 @@ 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);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
@@ -282,13 +284,13 @@ struct hashlist *HashIntPtrInstall(char *name, int value, void *ptr,
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
struct hashlist *HashInt2PtrInstall(char *name, int c, void *ptr,
|
||||
struct hashlist **hashtab, int hashsize)
|
||||
struct hashdict *dict)
|
||||
{
|
||||
struct hashlist *np;
|
||||
unsigned long hashval;
|
||||
|
||||
hashval = genhash(name, c, hashsize);
|
||||
for (np = hashtab[hashval]; np != NULL; np = np->next)
|
||||
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 */
|
||||
@@ -299,27 +301,31 @@ struct hashlist *HashInt2PtrInstall(char *name, int c, 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);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
@@ -327,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 */
|
||||
@@ -342,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;
|
||||
@@ -385,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;
|
||||
@@ -417,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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
+25
-19
@@ -7,38 +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 hashlist **hashtab, int hashsize);
|
||||
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 *HashInt2Lookup(char *s, int c, 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);
|
||||
|
||||
+2038
-299
File diff suppressed because it is too large
Load Diff
+6423
File diff suppressed because it is too large
Load Diff
+10
-4
@@ -9,6 +9,7 @@ extern struct nlist *Circuit2;
|
||||
extern int ExhaustiveSubdivision;
|
||||
|
||||
#ifdef TCL_NETGEN
|
||||
#include <tcl.h>
|
||||
extern int InterruptPending;
|
||||
#endif
|
||||
|
||||
@@ -17,10 +18,11 @@ extern int InterruptPending;
|
||||
extern void PrintElementClasses(struct ElementClass *EC, int type, int dolist);
|
||||
extern void PrintNodeClasses(struct NodeClass *NC, int type, int dolist);
|
||||
extern void SummarizeNodeClasses(struct NodeClass *NC);
|
||||
extern void PrintPropertyResults(void);
|
||||
extern void PrintPropertyResults(int do_list);
|
||||
extern void PrintCoreStats(void);
|
||||
extern void ResetState(void);
|
||||
extern void CreateTwoLists(char *name1, int file1, char *name2, int file2);
|
||||
extern void CreateTwoLists(char *name1, int file1, char *name2, int file2,
|
||||
int dolist);
|
||||
extern int Iterate(void);
|
||||
extern int VerifyMatching(void);
|
||||
extern void PrintAutomorphisms(void);
|
||||
@@ -32,8 +34,9 @@ extern int PermuteForget(char *model, int filenum, char *pin1, char *pin2);
|
||||
extern int EquivalenceElements(char *name1, int file1, char *name2, int file2);
|
||||
extern int EquivalenceNodes(char *name1, int file1, char *name2, int file2);
|
||||
extern int EquivalenceClasses(char *name1, int file1, char *name2, int file2);
|
||||
extern int IgnoreClass(char *name, int file);
|
||||
extern int MatchPins(struct nlist *tp1, struct nlist *tp2);
|
||||
extern int IgnoreClass(char *name, int file, unsigned char type);
|
||||
extern int MatchPins(struct nlist *tp1, struct nlist *tp2, int dolist);
|
||||
extern int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int serial);
|
||||
|
||||
extern int CreateCompareQueue(char *, int, char *, int);
|
||||
extern int GetCompareQueueTop(char **, int *, char **, int *);
|
||||
@@ -50,5 +53,8 @@ extern int EquivalentElement();
|
||||
|
||||
extern void enable_interrupt();
|
||||
extern void disable_interrupt();
|
||||
|
||||
extern Tcl_Obj *ListNodeClasses(int legal);
|
||||
extern Tcl_Obj *ListElementClasses(int legal);
|
||||
#endif
|
||||
|
||||
|
||||
+5
-5
@@ -77,8 +77,9 @@ extern char *SetExtension(char *buffer, char *path, char *extension)
|
||||
strcat(tmpbuf, extension);
|
||||
|
||||
/* step 4: lower-case the entire name */
|
||||
for (pt = tmpbuf; *pt != '\0'; pt++)
|
||||
if (isupper(*pt)) *pt = tolower(*pt);
|
||||
/* (Commented out because this is really stupid.) */
|
||||
// for (pt = tmpbuf; *pt != '\0'; pt++)
|
||||
// if (isupper(*pt)) *pt = tolower(*pt);
|
||||
|
||||
if (buffer != NULL) {
|
||||
strcpy(buffer, tmpbuf);
|
||||
@@ -567,7 +568,7 @@ char *ReadNetgenFile (char *fname, int *fnum)
|
||||
if ((filenum = OpenParseFile(fname, *fnum)) < 0) {
|
||||
SetExtension(name, fname, NETGEN_EXTENSION);
|
||||
if ((filenum = OpenParseFile(name, *fnum)) < 0) {
|
||||
Printf("No file: %s\n",name);
|
||||
Printf("Error in netgen read: No file %s\n",name);
|
||||
*fnum = -1;
|
||||
return NULL;
|
||||
}
|
||||
@@ -730,7 +731,6 @@ char *readbuf;
|
||||
int bytes_in_buffer;
|
||||
char *bufptr;
|
||||
|
||||
INLINE
|
||||
int READ(void *buf, int bytes)
|
||||
{
|
||||
if (bytes_in_buffer >= bytes) {
|
||||
@@ -804,7 +804,7 @@ char *ReadNetgenFile (char *fname, int *fnum)
|
||||
if ((File = open(fname, O_RDONLY, FILE_ACCESS_BITS)) == -1) {
|
||||
SetExtension(name, fname, NETGEN_EXTENSION);
|
||||
if ((File = open(name, O_RDONLY, FILE_ACCESS_BITS)) == -1) {
|
||||
Printf("No file: %s\n",name);
|
||||
Printf("Error in netgen read: No file %s\n",name);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
+1089
-353
File diff suppressed because it is too large
Load Diff
+8
-5
@@ -33,17 +33,18 @@ extern struct property *PropertyDouble(char *name, int fnum, char *key,
|
||||
extern struct property *PropertyInteger(char *name, int fnum, char *key,
|
||||
int slop, int pdefault);
|
||||
extern struct property *PropertyString(char *name, int fnum, char *key,
|
||||
int range, char *pdefault);
|
||||
double slop, char *pdefault);
|
||||
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);
|
||||
@@ -99,9 +100,9 @@ extern char *Res(char *fname, char *inststr, char *, char *);
|
||||
extern char *XLine(char *fname, char *inststr, char *, char *, char *, char *);
|
||||
extern char *Inductor(char *fname, char *inststr, char *, char *);
|
||||
|
||||
extern int StringIsValue(char *);
|
||||
extern int StringIsValue(char *);
|
||||
extern char *ConvertParam(char *);
|
||||
extern int ConvertStringToFloat(char *, double *);
|
||||
extern int ConvertStringToFloat(char *, double *);
|
||||
extern char *ScaleStringFloatValue(char *, double);
|
||||
extern void join(char *node1, char *node2);
|
||||
extern void Connect(char *tplt1, char *tplt2);
|
||||
@@ -115,6 +116,8 @@ extern void FlattenCurrent();
|
||||
extern void ConvertGlobals(char *name, int fnum);
|
||||
extern int CleanupPins(char *name, int fnum);
|
||||
extern void ConnectAllNodes(char *model, int fnum);
|
||||
extern int CombineParallel(char *model, int fnum);
|
||||
extern int CombineSerial(char *model, int fnum);
|
||||
extern int NoDisconnectedNodes;
|
||||
extern int PropertyKeyMatch(char *, char *);
|
||||
extern int PropertyValueMatch(char *, char *);
|
||||
|
||||
+1
-1
@@ -186,7 +186,7 @@ char *ReadNtk (char *fname, int *fnum)
|
||||
if ((filenum = OpenParseFile(fname, *fnum)) < 0) {
|
||||
SetExtension(name, fname, NTK_EXTENSION);
|
||||
if ((filenum = OpenParseFile(name, *fnum)) < 0) {
|
||||
Printf("No file: %s\n",name);
|
||||
Printf("Error in ntk file read: No file %s\n",name);
|
||||
*fnum = filenum;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+111
-59
@@ -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);
|
||||
@@ -351,6 +340,71 @@ void CellRehash(char *name, char *newname, int file)
|
||||
|
||||
struct nlist *OldCell;
|
||||
|
||||
int removeshorted(struct hashlist *p, int file)
|
||||
{
|
||||
struct nlist *ptr;
|
||||
struct objlist *ob, *lob, *nob, *tob;
|
||||
unsigned char shorted;
|
||||
|
||||
ptr = (struct nlist *)(p->ptr);
|
||||
|
||||
if ((file != -1) && (ptr->file != file)) return;
|
||||
|
||||
lob = NULL;
|
||||
for (ob = ptr->cell; ob != NULL;) {
|
||||
nob = ob->next;
|
||||
if ((ob->type == FIRSTPIN) && (ob->model.class != NULL)) {
|
||||
if ((*matchfunc)(ob->model.class, OldCell->name)) {
|
||||
shorted = (unsigned char)1;
|
||||
for (tob = nob; tob->type > FIRSTPIN; tob = tob->next) {
|
||||
if (tob->node != ob->node) {
|
||||
shorted = (unsigned char)0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (shorted == (unsigned char)0) {
|
||||
lob = ob;
|
||||
ob = nob;
|
||||
continue;
|
||||
}
|
||||
HashDelete(ob->instance.name, &(ptr->instdict));
|
||||
while (1) {
|
||||
FreeObjectAndHash(ob, ptr);
|
||||
ob = nob;
|
||||
if (ob == NULL) break;
|
||||
nob = ob->next;
|
||||
if (ob->type != PROPERTY && ob->type <= FIRSTPIN) break;
|
||||
}
|
||||
if (lob == NULL)
|
||||
ptr->cell = ob;
|
||||
else
|
||||
lob->next = ob;
|
||||
}
|
||||
else {
|
||||
lob = ob;
|
||||
ob = nob;
|
||||
}
|
||||
}
|
||||
else {
|
||||
lob = ob;
|
||||
ob = nob;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Remove shorted instances of class "class" from the database */
|
||||
|
||||
void RemoveShorted(char *class, int file)
|
||||
{
|
||||
if (file == -1)
|
||||
OldCell = LookupCell(class);
|
||||
else
|
||||
OldCell = LookupCellFile(class, file);
|
||||
|
||||
if (OldCell == NULL) return;
|
||||
RecurseCellFileHashTable(removeshorted, file);
|
||||
}
|
||||
|
||||
int deleteclass(struct hashlist *p, int file)
|
||||
{
|
||||
struct nlist *ptr;
|
||||
@@ -365,13 +419,13 @@ 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;
|
||||
if (ob == NULL) break;
|
||||
nob = ob->next;
|
||||
if (ob->type <= FIRSTPIN) break;
|
||||
if (ob->type != PROPERTY && ob->type <= FIRSTPIN) break;
|
||||
}
|
||||
if (lob == NULL)
|
||||
ptr->cell = ob;
|
||||
@@ -482,22 +536,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 +593,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 +602,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 +611,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 +630,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 +648,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 +908,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 +945,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 +966,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 +991,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 +1018,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 +1065,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);
|
||||
}
|
||||
|
||||
|
||||
+32
-7
@@ -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,24 @@ 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 parallel merge */
|
||||
#define MERGE_ADD_CRIT 2 /* Properties sum with device parallel merge */
|
||||
#define MERGE_PAR 3 /* Properties add in parallel with device merge */
|
||||
#define MERGE_PAR_CRIT 4 /* Properties add in parallel with device merge */
|
||||
#define MERGE_SER 5 /* Properties sum with device parallel merge */
|
||||
#define MERGE_SER_CRIT 6 /* Properties sum with device parallel 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;
|
||||
@@ -143,9 +161,16 @@ extern struct objlist *LastPlaced;
|
||||
struct IgnoreList {
|
||||
char *class;
|
||||
int file;
|
||||
unsigned char type;
|
||||
struct IgnoreList *next;
|
||||
};
|
||||
|
||||
/* Types used by IgnoreList above */
|
||||
|
||||
#define IGNORE_NONE (unsigned char)0
|
||||
#define IGNORE_CLASS (unsigned char)1
|
||||
#define IGNORE_SHORTED (unsigned char)2
|
||||
|
||||
/* Record structure for handling pin permutations in a cell */
|
||||
/* Linked list structure allows multiple permutations per cell. */
|
||||
|
||||
@@ -172,9 +197,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 */
|
||||
@@ -190,10 +215,10 @@ struct nlist {
|
||||
#define CELL_PROPSMATCHED 0x10 /* properties matched to matching cell */
|
||||
#define CELL_DUPLICATE 0x20 /* cell has a duplicate */
|
||||
|
||||
/* Flags for combination allowances */
|
||||
/* Flags for combination allowances and prohibitions */
|
||||
|
||||
#define COMB_SERIAL 0x20
|
||||
#define COMB_PARALLEL 0x40
|
||||
#define COMB_SERIAL 0x40
|
||||
#define COMB_NO_PARALLEL 0x80
|
||||
|
||||
extern struct nlist *CurrentCell;
|
||||
extern struct objlist *CurrentTail;
|
||||
@@ -216,7 +241,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 */
|
||||
|
||||
@@ -315,7 +315,6 @@ void PrintE(FILE *outfile, int E)
|
||||
|
||||
|
||||
#if 0
|
||||
INLINE
|
||||
int UsedLeaves(int E1, int E2)
|
||||
/* returns the number of leaves in E1 + E2, which are assumed independent */
|
||||
{
|
||||
@@ -327,7 +326,6 @@ int UsedLeaves(int E1, int E2)
|
||||
#endif
|
||||
|
||||
|
||||
INLINE
|
||||
int CommonNodes(int E1, int E2, int IncludeGlobals)
|
||||
/* returns the number of nodes that E1 and E2 share */
|
||||
/* if IncludeGlobals == 0, do not count large connectivity nodes */
|
||||
@@ -350,7 +348,6 @@ int CommonNodes(int E1, int E2, int IncludeGlobals)
|
||||
return(result);
|
||||
}
|
||||
|
||||
INLINE
|
||||
int GlobalNodes(int E)
|
||||
/* return the number of global nodes that E contacts */
|
||||
/* for now, global nodes are just cell ports */
|
||||
|
||||
+10
-6
@@ -345,7 +345,7 @@ void ElementNodes(char *cell, char *element, int fnum)
|
||||
struct nlist *np;
|
||||
struct objlist *ob, *nob, *nob2;
|
||||
int ckto;
|
||||
char *elementname;
|
||||
char *elementname, *obname;
|
||||
|
||||
if ((fnum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
|
||||
ElementNodes(cell, element, Circuit1->file);
|
||||
@@ -368,8 +368,10 @@ void ElementNodes(char *cell, char *element, int fnum)
|
||||
|
||||
ckto = strlen(elementname);
|
||||
for (ob = np->cell; ob != NULL; ob = ob->next) {
|
||||
if (!strncmp(elementname, ob->name, ckto))
|
||||
if (*(ob->name + ckto) == '/' || *(ob->name + ckto) == '\0')
|
||||
obname = ob->name;
|
||||
if (*obname == '/') obname++;
|
||||
if (!strncmp(elementname, obname, ckto))
|
||||
if (*(obname + ckto) == '/' || *(obname + ckto) == '\0')
|
||||
break;
|
||||
}
|
||||
if (ob == NULL) {
|
||||
@@ -379,13 +381,15 @@ void ElementNodes(char *cell, char *element, int fnum)
|
||||
|
||||
Printf("Device '%s' Pins:\n", elementname);
|
||||
for (; ob != NULL; ob = ob->next) {
|
||||
if (!strncmp(elementname, ob->name, ckto)) {
|
||||
if (*(ob->name + ckto) != '/' && *(ob->name + ckto) != '\0')
|
||||
obname = ob->name;
|
||||
if (*obname == '/') obname++;
|
||||
if (!strncmp(elementname, obname, ckto)) {
|
||||
if (*(obname + ckto) != '/' && *(obname + ckto) != '\0')
|
||||
continue;
|
||||
|
||||
Printf(" ");
|
||||
PrintObjectType(ob->type);
|
||||
Printf(" (%s)", ob->name + ckto + 1);
|
||||
Printf(" (%s)", obname + ckto + 1);
|
||||
for (nob = np->cell; nob != NULL; nob = nob->next) {
|
||||
if (nob->node == ob->node) {
|
||||
if (nob->type == NODE) {
|
||||
|
||||
+153
-181
@@ -40,7 +40,21 @@ 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;
|
||||
|
||||
// Check if a token represents a numerical value (with
|
||||
// units) or an expression. This is basically a hack
|
||||
// to see if it either passes StringIsValue() or is
|
||||
// enclosed in braces. Probably should attempt to
|
||||
// parse the expression, to be pedantic. Not sure all
|
||||
// expressions have to be in braces.
|
||||
|
||||
int StringIsValueOrExpression(char *token)
|
||||
{
|
||||
if (StringIsValue(token)) return TRUE;
|
||||
else if (*token == '{') return TRUE;
|
||||
else return FALSE;
|
||||
}
|
||||
|
||||
void SpiceSubCell(struct nlist *tp, int IsSubCell)
|
||||
{
|
||||
@@ -73,7 +87,7 @@ void SpiceSubCell(struct nlist *tp, int IsSubCell)
|
||||
for (ob = tp->cell; ob != NULL; ob = ob->next)
|
||||
if (ob->node > maxnode) maxnode = ob->node;
|
||||
|
||||
/* was: for (node = 0; node <= maxnode; node++) */
|
||||
/* was: for (node = 0; node <= maxnode; node++) */
|
||||
for (node = 1; node <= maxnode; node++)
|
||||
FlushString("# %3d = %s\n", node, NodeName(tp, node));
|
||||
|
||||
@@ -154,7 +168,6 @@ void SpiceSubCell(struct nlist *tp, int IsSubCell)
|
||||
|
||||
/* caps and resistors, print out device value */
|
||||
|
||||
|
||||
/* print out device type (model/subcircuit name) */
|
||||
|
||||
switch (tp2->class) {
|
||||
@@ -358,6 +371,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);
|
||||
@@ -467,7 +486,7 @@ extern void IncludeSpice(char *, int, struct cellstack **, int);
|
||||
void ReadSpiceFile(char *fname, int filenum, struct cellstack **CellStackPtr,
|
||||
int blackbox)
|
||||
{
|
||||
int cdnum = 1, rdnum = 1, ndev, multi;
|
||||
int cdnum = 1, rdnum = 1;
|
||||
int warnings = 0, update = 0, hasports = 0;
|
||||
char *eqptr, devtype, in_subckt;
|
||||
struct keyvalue *kvlist = NULL;
|
||||
@@ -776,9 +795,9 @@ skip_ends:
|
||||
kl->key = strsave(nexttok);
|
||||
kl->idx = 0;
|
||||
kl->type = PROP_STRING;
|
||||
kl->slop.ival = 0;
|
||||
kl->slop.dval = 0.0;
|
||||
kl->pdefault.string = strsave(eqptr + 1);
|
||||
HashPtrInstall(nexttok, kl, spiceparams, OBJHASHSIZE);
|
||||
HashPtrInstall(nexttok, kl, &spiceparams);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -815,7 +834,6 @@ skip_ends:
|
||||
/* Read the device model */
|
||||
snprintf(model, 99, "%s", nexttok);
|
||||
|
||||
ndev = 1;
|
||||
while (nexttok != NULL)
|
||||
{
|
||||
/* Parse for M and other parameters */
|
||||
@@ -825,10 +843,7 @@ skip_ends:
|
||||
if ((eqptr = strchr(nexttok, '=')) != NULL)
|
||||
{
|
||||
*eqptr = '\0';
|
||||
if (!strcasecmp(nexttok, "M"))
|
||||
sscanf(eqptr + 1, "%d", &ndev);
|
||||
else
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -837,6 +852,7 @@ skip_ends:
|
||||
Port("collector");
|
||||
Port("base");
|
||||
Port("emitter");
|
||||
PropertyInteger(model, filenum, "M", 0, 1);
|
||||
SetClass(CLASS_BJT);
|
||||
EndCell();
|
||||
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
|
||||
@@ -847,16 +863,10 @@ skip_ends:
|
||||
goto baddevice;
|
||||
}
|
||||
|
||||
multi = (ndev > 1) ? 1 : 0;
|
||||
if (!multi) snprintf(instname, 255, "%s%s", model, inst);
|
||||
while (ndev > 0)
|
||||
{
|
||||
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);
|
||||
ndev--;
|
||||
}
|
||||
snprintf(instname, 255, "%s%s", model, inst);
|
||||
Cell(instname, model, collector, base, emitter);
|
||||
pobj = LinkProperties(model, kvlist);
|
||||
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
|
||||
DeleteProperties(&kvlist);
|
||||
}
|
||||
else if (toupper(nexttok[0]) == 'M') {
|
||||
@@ -890,7 +900,6 @@ skip_ends:
|
||||
/* Read the device model */
|
||||
snprintf(model, 99, "%s", nexttok);
|
||||
|
||||
ndev = 1;
|
||||
while (nexttok != NULL)
|
||||
{
|
||||
/* Parse for parameters; treat "M" separately */
|
||||
@@ -900,14 +909,7 @@ skip_ends:
|
||||
if ((eqptr = strchr(nexttok, '=')) != NULL)
|
||||
{
|
||||
*eqptr = '\0';
|
||||
if (!strcasecmp(nexttok, "M"))
|
||||
sscanf(eqptr + 1, "%d", &ndev);
|
||||
else if (!strcasecmp(nexttok, "L"))
|
||||
AddProperty(&kvlist, "L", eqptr + 1);
|
||||
else if (!strcasecmp(nexttok, "W"))
|
||||
AddProperty(&kvlist, "W", eqptr + 1);
|
||||
else
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -921,8 +923,9 @@ 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);
|
||||
PropertyInteger(model, filenum, "M", 0, 1);
|
||||
SetClass(CLASS_FET);
|
||||
EndCell();
|
||||
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
|
||||
@@ -933,16 +936,10 @@ skip_ends:
|
||||
goto baddevice;
|
||||
}
|
||||
|
||||
multi = (ndev > 1) ? 1 : 0;
|
||||
if (!multi) snprintf(instname, 255, "%s%s", model, inst);
|
||||
while (ndev > 0)
|
||||
{
|
||||
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);
|
||||
ndev--;
|
||||
}
|
||||
snprintf(instname, 255, "%s%s", model, inst);
|
||||
Cell(instname, model, drain, gate, source, bulk);
|
||||
pobj = LinkProperties(model, kvlist);
|
||||
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
|
||||
DeleteProperties(&kvlist);
|
||||
SpiceSkipNewLine();
|
||||
}
|
||||
@@ -973,7 +970,7 @@ skip_ends:
|
||||
|
||||
/* Get capacitor value (if present), save as property "value" */
|
||||
if (nexttok != NULL) {
|
||||
if (StringIsValue(nexttok)) {
|
||||
if (StringIsValueOrExpression(nexttok)) {
|
||||
AddProperty(&kvlist, "value", nexttok);
|
||||
SpiceTokNoNewline();
|
||||
}
|
||||
@@ -987,17 +984,13 @@ skip_ends:
|
||||
snprintf(model, 99, "%s", nexttok);
|
||||
|
||||
/* Any other device properties? */
|
||||
ndev = 1;
|
||||
while (nexttok != NULL)
|
||||
{
|
||||
SpiceTokNoNewline();
|
||||
if ((nexttok == NULL) || (nexttok[0] == '\0')) break;
|
||||
if ((eqptr = strchr(nexttok, '=')) != NULL) {
|
||||
*eqptr = '\0';
|
||||
if (!strcasecmp(nexttok, "M"))
|
||||
sscanf(eqptr + 1, "%d", &ndev);
|
||||
else
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
}
|
||||
else if (!strncmp(nexttok, "$[", 2)) {
|
||||
// Support for CDL modeled capacitor format
|
||||
@@ -1005,7 +998,7 @@ skip_ends:
|
||||
if ((eqptr = strchr(model, ']')) != NULL)
|
||||
*eqptr = '\0';
|
||||
}
|
||||
else if (StringIsValue(nexttok)) {
|
||||
else if (StringIsValueOrExpression(nexttok)) {
|
||||
// Suport for value passed to modeled capacitor
|
||||
AddProperty(&kvlist, "value", nexttok);
|
||||
}
|
||||
@@ -1020,6 +1013,7 @@ skip_ends:
|
||||
Port("top");
|
||||
Port("bottom");
|
||||
PropertyValue(model, filenum, "value", 0.01, 0.0);
|
||||
PropertyInteger(model, filenum, "M", 0, 1);
|
||||
SetClass(CLASS_CAP);
|
||||
EndCell();
|
||||
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
|
||||
@@ -1033,19 +1027,13 @@ skip_ends:
|
||||
usemodel = 1;
|
||||
}
|
||||
|
||||
multi = (ndev > 1) ? 1 : 0;
|
||||
if (!multi) snprintf(instname, 255, "%s%s", model, inst);
|
||||
|
||||
while (ndev > 0) {
|
||||
if (multi) snprintf(instname, 255, "%s%s.%d", model, inst, ndev);
|
||||
if (usemodel)
|
||||
Cell(instname, model, ctop, cbot);
|
||||
else
|
||||
Cap((*CellStackPtr)->cellname, instname, ctop, cbot);
|
||||
pobj = LinkProperties(model, kvlist);
|
||||
ReduceExpressions(pobj, CurrentCell, TRUE);
|
||||
ndev--;
|
||||
}
|
||||
snprintf(instname, 255, "%s%s", model, inst);
|
||||
if (usemodel)
|
||||
Cell(instname, model, ctop, cbot);
|
||||
else
|
||||
Cap((*CellStackPtr)->cellname, instname, ctop, cbot);
|
||||
pobj = LinkProperties(model, kvlist);
|
||||
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
|
||||
DeleteProperties(&kvlist);
|
||||
}
|
||||
}
|
||||
@@ -1076,7 +1064,7 @@ skip_ends:
|
||||
/* Get resistor value (if present); save as property "value" */
|
||||
|
||||
if (nexttok != NULL) {
|
||||
if (StringIsValue(nexttok)) {
|
||||
if (StringIsValueOrExpression(nexttok)) {
|
||||
AddProperty(&kvlist, "value", nexttok);
|
||||
SpiceTokNoNewline();
|
||||
}
|
||||
@@ -1090,16 +1078,12 @@ skip_ends:
|
||||
snprintf(model, 99, "%s", nexttok);
|
||||
|
||||
/* Any other device properties? */
|
||||
ndev = 1;
|
||||
while (nexttok != NULL) {
|
||||
SpiceTokNoNewline();
|
||||
if ((nexttok == NULL) || (nexttok[0] == '\0')) break;
|
||||
if ((eqptr = strchr(nexttok, '=')) != NULL) {
|
||||
*eqptr = '\0';
|
||||
if (!strcasecmp(nexttok, "M"))
|
||||
sscanf(eqptr + 1, "%d", &ndev);
|
||||
else
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
}
|
||||
else if (!strncmp(nexttok, "$[", 2)) {
|
||||
// Support for CDL modeled resistor format
|
||||
@@ -1107,7 +1091,7 @@ skip_ends:
|
||||
if ((eqptr = strchr(model, ']')) != NULL)
|
||||
*eqptr = '\0';
|
||||
}
|
||||
else if (StringIsValue(nexttok)) {
|
||||
else if (StringIsValueOrExpression(nexttok)) {
|
||||
// Suport for value passed to modeled resistor
|
||||
AddProperty(&kvlist, "value", nexttok);
|
||||
}
|
||||
@@ -1120,6 +1104,7 @@ skip_ends:
|
||||
Port("end_a");
|
||||
Port("end_b");
|
||||
PropertyValue(model, filenum, "value", 0.01, 0.0);
|
||||
PropertyInteger(model, filenum, "M", 0, 1);
|
||||
SetClass(CLASS_RES);
|
||||
EndCell();
|
||||
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
|
||||
@@ -1135,19 +1120,13 @@ skip_ends:
|
||||
else
|
||||
strcpy(model, "r"); /* Use default resistor model */
|
||||
|
||||
multi = (ndev > 1) ? 1 : 0;
|
||||
if (!multi) snprintf(instname, 255, "%s%s", model, inst);
|
||||
|
||||
while (ndev > 0) {
|
||||
if (multi) snprintf(instname, 255, "%s%s.%d", model, inst, ndev);
|
||||
if (usemodel)
|
||||
Cell(instname, model, rtop, rbot);
|
||||
else
|
||||
Res((*CellStackPtr)->cellname, instname, rtop, rbot);
|
||||
pobj = LinkProperties(model, kvlist);
|
||||
ReduceExpressions(pobj, CurrentCell, TRUE);
|
||||
ndev--;
|
||||
}
|
||||
snprintf(instname, 255, "%s%s", model, inst);
|
||||
if (usemodel)
|
||||
Cell(instname, model, rtop, rbot);
|
||||
else
|
||||
Res((*CellStackPtr)->cellname, instname, rtop, rbot);
|
||||
pobj = LinkProperties(model, kvlist);
|
||||
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
|
||||
DeleteProperties(&kvlist);
|
||||
}
|
||||
}
|
||||
@@ -1172,7 +1151,6 @@ skip_ends:
|
||||
/* Read the device model */
|
||||
snprintf(model, 99, "%s", nexttok);
|
||||
|
||||
ndev = 1;
|
||||
while (nexttok != NULL)
|
||||
{
|
||||
/* Parse for M and other parameters */
|
||||
@@ -1182,10 +1160,7 @@ skip_ends:
|
||||
if ((eqptr = strchr(nexttok, '=')) != NULL)
|
||||
{
|
||||
*eqptr = '\0';
|
||||
if (!strcasecmp(nexttok, "M"))
|
||||
sscanf(eqptr + 1, "%d", &ndev);
|
||||
else
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1193,6 +1168,7 @@ skip_ends:
|
||||
CellDefNoCase(model, filenum);
|
||||
Port("anode");
|
||||
Port("cathode");
|
||||
PropertyInteger(model, filenum, "M", 0, 1);
|
||||
SetClass(CLASS_DIODE);
|
||||
EndCell();
|
||||
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
|
||||
@@ -1202,16 +1178,10 @@ skip_ends:
|
||||
Fprintf(stderr, "Device \"%s\" has wrong number of ports for a diode.\n");
|
||||
goto baddevice;
|
||||
}
|
||||
multi = (ndev > 1) ? 1 : 0;
|
||||
if (!multi) snprintf(instname, 255, "%s%s", model, inst);
|
||||
while (ndev > 0)
|
||||
{
|
||||
if (multi) snprintf(instname, 255, "%s%s.%d", model, inst, ndev);
|
||||
Cell(instname, model, anode, cathode);
|
||||
pobj = LinkProperties(model, kvlist);
|
||||
ReduceExpressions(pobj, CurrentCell, TRUE);
|
||||
ndev--;
|
||||
}
|
||||
snprintf(instname, 255, "%s%s", model, inst);
|
||||
Cell(instname, model, anode, cathode);
|
||||
pobj = LinkProperties(model, kvlist);
|
||||
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
|
||||
DeleteProperties(&kvlist);
|
||||
}
|
||||
else if (toupper(nexttok[0]) == 'T') { /* transmission line */
|
||||
@@ -1254,16 +1224,12 @@ skip_ends:
|
||||
snprintf(model, 99, "%s", nexttok);
|
||||
|
||||
/* Any other device properties? */
|
||||
ndev = 1;
|
||||
while (nexttok != NULL) {
|
||||
SpiceTokNoNewline();
|
||||
if ((nexttok == NULL) || (nexttok[0] == '\0')) break;
|
||||
if ((eqptr = strchr(nexttok, '=')) != NULL) {
|
||||
*eqptr = '\0';
|
||||
if (!strcasecmp(nexttok, "M"))
|
||||
sscanf(eqptr + 1, "%d", &ndev);
|
||||
else
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1275,6 +1241,7 @@ skip_ends:
|
||||
Port("node2");
|
||||
Port("node3");
|
||||
Port("node4");
|
||||
PropertyInteger(model, filenum, "M", 0, 1);
|
||||
SetClass(CLASS_XLINE);
|
||||
EndCell();
|
||||
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
|
||||
@@ -1290,20 +1257,15 @@ skip_ends:
|
||||
else
|
||||
strcpy(model, "t"); /* Use default xline model */
|
||||
|
||||
multi = (ndev > 1) ? 1 : 0;
|
||||
if (!multi) snprintf(instname, 255, "%s%s", model, inst);
|
||||
snprintf(instname, 255, "%s%s", model, inst);
|
||||
|
||||
while (ndev > 0) {
|
||||
if (multi) snprintf(instname, 255, "%s%s.%d", model, inst, ndev);
|
||||
if (usemodel)
|
||||
Cell(instname, model, node1, node2, node3, node4);
|
||||
else
|
||||
XLine((*CellStackPtr)->cellname, instname, node1, node2,
|
||||
if (usemodel)
|
||||
Cell(instname, model, node1, node2, node3, node4);
|
||||
else
|
||||
XLine((*CellStackPtr)->cellname, instname, node1, node2,
|
||||
node3, node4);
|
||||
pobj = LinkProperties(model, kvlist);
|
||||
ReduceExpressions(pobj, CurrentCell, TRUE);
|
||||
ndev--;
|
||||
}
|
||||
pobj = LinkProperties(model, kvlist);
|
||||
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
|
||||
DeleteProperties(&kvlist);
|
||||
}
|
||||
}
|
||||
@@ -1329,7 +1291,7 @@ skip_ends:
|
||||
/* Get inductance value (if present); save as property "value" */
|
||||
|
||||
if (nexttok != NULL) {
|
||||
if (StringIsValue(nexttok)) {
|
||||
if (StringIsValueOrExpression(nexttok)) {
|
||||
AddProperty(&kvlist, "value", nexttok);
|
||||
SpiceTokNoNewline();
|
||||
}
|
||||
@@ -1343,7 +1305,6 @@ skip_ends:
|
||||
snprintf(model, 99, "%s", nexttok);
|
||||
|
||||
/* Any other device properties? */
|
||||
ndev = 1;
|
||||
while (nexttok != NULL)
|
||||
{
|
||||
/* Parse for M and other parameters */
|
||||
@@ -1353,10 +1314,7 @@ skip_ends:
|
||||
if ((eqptr = strchr(nexttok, '=')) != NULL)
|
||||
{
|
||||
*eqptr = '\0';
|
||||
if (!strcasecmp(nexttok, "M"))
|
||||
sscanf(eqptr + 1, "%d", &ndev);
|
||||
else
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1366,6 +1324,7 @@ skip_ends:
|
||||
CellDefNoCase(model, filenum);
|
||||
Port("end_a");
|
||||
Port("end_b");
|
||||
PropertyInteger(model, filenum, "M", 0, 1);
|
||||
SetClass(CLASS_INDUCTOR);
|
||||
EndCell();
|
||||
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
|
||||
@@ -1381,19 +1340,13 @@ skip_ends:
|
||||
else
|
||||
strcpy(model, "l"); /* Use default inductor model */
|
||||
|
||||
multi = (ndev > 1) ? 1 : 0;
|
||||
if (!multi) snprintf(instname, 255, "%s%s", model, inst);
|
||||
while (ndev > 0)
|
||||
{
|
||||
if (multi) snprintf(instname, 255, "%s%s.%d", model, inst, ndev);
|
||||
if (usemodel)
|
||||
Cell(instname, model, end_a, end_b);
|
||||
else
|
||||
Inductor((*CellStackPtr)->cellname, instname, end_a, end_b);
|
||||
pobj = LinkProperties(model, kvlist);
|
||||
ReduceExpressions(pobj, CurrentCell, TRUE);
|
||||
ndev--;
|
||||
}
|
||||
snprintf(instname, 255, "%s%s", model, inst);
|
||||
if (usemodel)
|
||||
Cell(instname, model, end_a, end_b);
|
||||
else
|
||||
Inductor((*CellStackPtr)->cellname, instname, end_a, end_b);
|
||||
pobj = LinkProperties(model, kvlist);
|
||||
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
|
||||
DeleteProperties(&kvlist);
|
||||
}
|
||||
|
||||
@@ -1429,7 +1382,7 @@ skip_ends:
|
||||
*eqptr = '\0';
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
}
|
||||
else if (StringIsValue(nexttok)) {
|
||||
else if (StringIsValueOrExpression(nexttok)) {
|
||||
AddProperty(&kvlist, "value", nexttok);
|
||||
SpiceTokNoNewline();
|
||||
}
|
||||
@@ -1439,6 +1392,7 @@ skip_ends:
|
||||
CellDefNoCase(model, filenum);
|
||||
Port("pos");
|
||||
Port("neg");
|
||||
PropertyInteger(model, filenum, "M", 0, 1);
|
||||
SetClass(CLASS_MODULE);
|
||||
EndCell();
|
||||
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
|
||||
@@ -1451,7 +1405,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 */
|
||||
@@ -1482,7 +1436,7 @@ skip_ends:
|
||||
*eqptr = '\0';
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
}
|
||||
else if (StringIsValue(nexttok)) {
|
||||
else if (StringIsValueOrExpression(nexttok)) {
|
||||
AddProperty(&kvlist, "value", nexttok);
|
||||
SpiceTokNoNewline();
|
||||
}
|
||||
@@ -1492,6 +1446,7 @@ skip_ends:
|
||||
CellDefNoCase(model, filenum);
|
||||
Port("pos");
|
||||
Port("neg");
|
||||
PropertyInteger(model, filenum, "M", 0, 1);
|
||||
SetClass(CLASS_MODULE);
|
||||
EndCell();
|
||||
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
|
||||
@@ -1504,7 +1459,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 */
|
||||
@@ -1544,7 +1499,7 @@ skip_ends:
|
||||
*eqptr = '\0';
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
}
|
||||
else if (StringIsValue(nexttok)) {
|
||||
else if (StringIsValueOrExpression(nexttok)) {
|
||||
AddProperty(&kvlist, "value", nexttok);
|
||||
SpiceTokNoNewline();
|
||||
}
|
||||
@@ -1556,6 +1511,7 @@ skip_ends:
|
||||
Port("neg");
|
||||
Port("ctrlp");
|
||||
Port("ctrln");
|
||||
PropertyInteger(model, filenum, "M", 0, 1);
|
||||
SetClass(CLASS_MODULE);
|
||||
EndCell();
|
||||
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
|
||||
@@ -1568,12 +1524,14 @@ skip_ends:
|
||||
}
|
||||
Cell(instname, model, pos, neg, ctrlp, ctrln);
|
||||
pobj = LinkProperties(model, kvlist);
|
||||
ReduceExpressions(pobj, CurrentCell, TRUE);
|
||||
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
|
||||
DeleteProperties(&kvlist);
|
||||
}
|
||||
|
||||
else if (toupper(nexttok[0]) == 'X') { /* subcircuit instances */
|
||||
char instancename[100], subcktname[100];
|
||||
int itype;
|
||||
|
||||
instancename[99] = '\0';
|
||||
subcktname[99] = '\0';
|
||||
|
||||
@@ -1595,7 +1553,6 @@ skip_ends:
|
||||
head = NULL;
|
||||
tail = NULL;
|
||||
SpiceTokNoNewline();
|
||||
ndev = 1;
|
||||
while (nexttok != NULL) {
|
||||
/* must still be a node or a parameter */
|
||||
struct portelement *new_port;
|
||||
@@ -1623,10 +1580,7 @@ skip_ends:
|
||||
((tp = LookupCellFile(nexttok, filenum)) == NULL))
|
||||
{
|
||||
*eqptr = '\0';
|
||||
if (!strcasecmp(nexttok, "M"))
|
||||
sscanf(eqptr + 1, "%d", &ndev);
|
||||
else
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
AddProperty(&kvlist, nexttok, eqptr + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1650,6 +1604,34 @@ skip_ends:
|
||||
if (scan->next != NULL) scan = scan->next;
|
||||
tail->next = NULL;
|
||||
|
||||
/* Check for ignored class */
|
||||
|
||||
if ((itype = IsIgnored(subcktname, filenum)) == IGNORE_CLASS) {
|
||||
Printf("Class '%s' instanced in input but is being ignored.\n", model);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Check for shorted pins */
|
||||
|
||||
if ((itype == IGNORE_SHORTED) && (head != NULL)) {
|
||||
unsigned char shorted = (unsigned char)1;
|
||||
struct portelement *p;
|
||||
for (p = head->next; p; p = p->next) {
|
||||
if (strcasecmp(head->name, p->name))
|
||||
shorted = (unsigned char)0;
|
||||
break;
|
||||
}
|
||||
if (shorted == (unsigned char)1) {
|
||||
Printf("Instance of '%s' is shorted, ignoring.\n", subcktname);
|
||||
while (head) {
|
||||
p = head->next;
|
||||
FREE(head);
|
||||
head = p;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Create cell name and revise instance name based on the cell name */
|
||||
/* For clarity, if "instancename" does not contain the cellname, */
|
||||
/* then prepend the cellname to the instance name. HOWEVER, if any */
|
||||
@@ -1698,6 +1680,7 @@ skip_ends:
|
||||
if (head == NULL) {
|
||||
Port((char *)NULL); // Must have something for pin 1
|
||||
}
|
||||
PropertyInteger(subcktname, filenum, "M", 0, 1);
|
||||
SetClass(CLASS_MODULE);
|
||||
EndCell();
|
||||
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
|
||||
@@ -1705,38 +1688,31 @@ skip_ends:
|
||||
}
|
||||
|
||||
/* nexttok is now NULL, scan->name points to class */
|
||||
multi = (ndev > 1) ? 1 : 0;
|
||||
if (multi) strcat(instancename, ".");
|
||||
while (ndev > 0) {
|
||||
if (multi) {
|
||||
char *dotptr = strrchr(instancename, '.');
|
||||
sprintf(dotptr + 1, "%d", ndev);
|
||||
}
|
||||
Instance(subcktname, instancename);
|
||||
pobj = LinkProperties(subcktname, kvlist);
|
||||
ReduceExpressions(pobj, CurrentCell, TRUE);
|
||||
ndev--;
|
||||
|
||||
/* (Diagnostic) */
|
||||
/* Fprintf(stderr, "instancing subcell: %s (%s):", subcktname, instancename); */
|
||||
/*
|
||||
Instance(subcktname, instancename);
|
||||
pobj = LinkProperties(subcktname, kvlist);
|
||||
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
|
||||
|
||||
/* (Diagnostic) */
|
||||
/* Fprintf(stderr, "instancing subcell: %s (%s):", subcktname, instancename); */
|
||||
/*
|
||||
for (scan = head; scan != NULL; scan = scan->next)
|
||||
Fprintf(stderr," %s", scan->name);
|
||||
Fprintf(stderr," %s", scan->name);
|
||||
Fprintf(stderr,"\n");
|
||||
*/
|
||||
*/
|
||||
|
||||
obptr = LookupInstance(instancename, CurrentCell);
|
||||
if (obptr != NULL) {
|
||||
scan = head;
|
||||
if (scan != NULL)
|
||||
do {
|
||||
if (LookupObject(scan->name, CurrentCell) == NULL) Node(scan->name);
|
||||
join(scan->name, obptr->name);
|
||||
obptr = obptr->next;
|
||||
scan = scan->next;
|
||||
} while (obptr != NULL && obptr->type > FIRSTPIN && scan != NULL);
|
||||
obptr = LookupInstance(instancename, CurrentCell);
|
||||
if (obptr != NULL) {
|
||||
scan = head;
|
||||
if (scan != NULL)
|
||||
do {
|
||||
if (LookupObject(scan->name, CurrentCell) == NULL) Node(scan->name);
|
||||
join(scan->name, obptr->name);
|
||||
obptr = obptr->next;
|
||||
scan = scan->next;
|
||||
} while (obptr != NULL && obptr->type > FIRSTPIN && scan != NULL);
|
||||
|
||||
if ((obptr == NULL && scan != NULL) ||
|
||||
if ((obptr == NULL && scan != NULL) ||
|
||||
(obptr != NULL && scan == NULL && obptr->type > FIRSTPIN)) {
|
||||
if (warnings <= 100) {
|
||||
Fprintf(stderr,"Parameter list mismatch in %s: ", instancename);
|
||||
@@ -1750,8 +1726,7 @@ skip_ends:
|
||||
Fprintf(stderr, "Too many warnings. . . will not report any more.\n");
|
||||
}
|
||||
warnings++;
|
||||
}
|
||||
} // repeat over ndev
|
||||
}
|
||||
}
|
||||
DeleteProperties(&kvlist);
|
||||
|
||||
@@ -1833,7 +1808,7 @@ char *ReadSpiceTop(char *fname, int *fnum, int blackbox)
|
||||
|
||||
SetExtension(name, fname, SPICE_EXTENSION);
|
||||
if ((filenum = OpenParseFile(name, *fnum)) < 0) {
|
||||
Fprintf(stderr,"No file: %s\n",name);
|
||||
Fprintf(stderr,"Error in SPICE file read: No file %s\n",name);
|
||||
*fnum = filenum;
|
||||
return NULL;
|
||||
}
|
||||
@@ -1844,8 +1819,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 */
|
||||
@@ -1857,10 +1831,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
|
||||
@@ -1931,7 +1903,7 @@ void IncludeSpice(char *fname, int parent, struct cellstack **CellStackPtr,
|
||||
|
||||
SetExtension(name, fname, SPICE_EXTENSION);
|
||||
if ((filenum = OpenParseFile(name, parent)) < 0) {
|
||||
Fprintf(stderr,"No file: %s\n",name);
|
||||
Fprintf(stderr,"Error in SPICE file read: No file %s\n",name);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
+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);
|
||||
|
||||
+1
-1
@@ -271,7 +271,7 @@ void initialize_netcmp_datastructures(Widget w, Widget textwidget,
|
||||
{
|
||||
X_START();
|
||||
Printf("Comparing cells '%s' and '%s'\n", get_cell(), get_other());
|
||||
CreateTwoLists(get_cell(), get_other());
|
||||
CreateTwoLists(get_cell(), get_other(), 0);
|
||||
Permute();
|
||||
#ifdef DEBUG_ALLOC
|
||||
PrintCoreStats();
|
||||
|
||||
@@ -56,7 +56,8 @@ RANLIB = ranlib
|
||||
SHDLIB_EXT = .so
|
||||
LDDL_FLAGS = -shared -Wl,-soname,$@ -Wl,--version-script=${NETGENDIR}/netgen/symbol.map
|
||||
LD_RUN_PATH =
|
||||
LIB_SPECS = -L/usr/lib64 -ltk8.6 -L/usr/lib64 -ltcl8.6
|
||||
LIB_SPECS = -L/usr/lib64 -ltkstub8.6 -L/usr/lib64 -ltclstub8.6
|
||||
LIB_SPECS_NOSTUB = -L/usr/lib64 -ltk8.6 -L/usr/lib64 -ltcl8.6
|
||||
WISH_EXE = /usr/bin/wish
|
||||
TCL_LIB_DIR = /usr/lib
|
||||
|
||||
@@ -65,7 +66,8 @@ 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=\"50\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
|
||||
DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DUSE_TCL_STUBS -DUSE_TK_STUBS -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"60\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
|
||||
DFLAGS_NOSTUB = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"60\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
|
||||
CFLAGS = -g -m64 -fPIC -fPIC
|
||||
|
||||
DEPEND_FILE = Depend
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ tclnetgen${SHDLIB_EXT}: ${EXTRA_LIBS}
|
||||
${RM} tclnetgen${SHDLIB_EXT}
|
||||
${CC} ${CFLAGS} ${CPPFLAGS} -o $@ ${LDDL_FLAGS} \
|
||||
${LD_RUN_PATH} ${EXTRA_LIBS} ${LD_EXTRA_LIBS} -lc ${LIBS} \
|
||||
${TCL_LIB_SPEC} ${LDFLAGS}
|
||||
${LIB_SPECS} ${LDFLAGS}
|
||||
|
||||
$(DESTDIR)${BINDIR}/netgen:
|
||||
${RM} $@
|
||||
|
||||
+260
-258
@@ -39,24 +39,24 @@ PATH: /usr/local/bin
|
||||
## Core tests. ##
|
||||
## ----------- ##
|
||||
|
||||
configure:2395: checking build system type
|
||||
configure:2409: result: x86_64-unknown-linux-gnu
|
||||
configure:2429: checking host system type
|
||||
configure:2442: result: x86_64-unknown-linux-gnu
|
||||
configure:2462: checking target system type
|
||||
configure:2475: result: x86_64-unknown-linux-gnu
|
||||
configure:2566: checking for gcc
|
||||
configure:2582: found /bin/gcc
|
||||
configure:2593: result: gcc
|
||||
configure:2822: checking for C compiler version
|
||||
configure:2831: gcc --version >&5
|
||||
configure:2397: checking build system type
|
||||
configure:2411: result: x86_64-unknown-linux-gnu
|
||||
configure:2431: checking host system type
|
||||
configure:2444: result: x86_64-unknown-linux-gnu
|
||||
configure:2464: checking target system type
|
||||
configure:2477: result: x86_64-unknown-linux-gnu
|
||||
configure:2568: checking for gcc
|
||||
configure:2584: found /bin/gcc
|
||||
configure:2595: result: gcc
|
||||
configure:2824: checking for C compiler version
|
||||
configure:2833: gcc --version >&5
|
||||
gcc (GCC) 4.9.2 20141101 (Red Hat 4.9.2-1)
|
||||
Copyright (C) 2014 Free Software Foundation, Inc.
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
configure:2842: $? = 0
|
||||
configure:2831: gcc -v >&5
|
||||
configure:2844: $? = 0
|
||||
configure:2833: gcc -v >&5
|
||||
Using built-in specs.
|
||||
COLLECT_GCC=gcc
|
||||
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.9.2/lto-wrapper
|
||||
@@ -64,58 +64,58 @@ Target: x86_64-redhat-linux
|
||||
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.9.2-20141101/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.9.2-20141101/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
|
||||
Thread model: posix
|
||||
gcc version 4.9.2 20141101 (Red Hat 4.9.2-1) (GCC)
|
||||
configure:2842: $? = 0
|
||||
configure:2831: gcc -V >&5
|
||||
configure:2844: $? = 0
|
||||
configure:2833: gcc -V >&5
|
||||
gcc: error: unrecognized command line option '-V'
|
||||
gcc: fatal error: no input files
|
||||
compilation terminated.
|
||||
configure:2842: $? = 4
|
||||
configure:2831: gcc -qversion >&5
|
||||
configure:2844: $? = 4
|
||||
configure:2833: gcc -qversion >&5
|
||||
gcc: error: unrecognized command line option '-qversion'
|
||||
gcc: fatal error: no input files
|
||||
compilation terminated.
|
||||
configure:2842: $? = 4
|
||||
configure:2862: checking whether the C compiler works
|
||||
configure:2884: gcc -g conftest.c >&5
|
||||
configure:2888: $? = 0
|
||||
configure:2936: result: yes
|
||||
configure:2939: checking for C compiler default output file name
|
||||
configure:2941: result: a.out
|
||||
configure:2947: checking for suffix of executables
|
||||
configure:2954: gcc -o conftest -g conftest.c >&5
|
||||
configure:2958: $? = 0
|
||||
configure:2980: result:
|
||||
configure:3002: checking whether we are cross compiling
|
||||
configure:3010: gcc -o conftest -g conftest.c >&5
|
||||
configure:3014: $? = 0
|
||||
configure:3021: ./conftest
|
||||
configure:3025: $? = 0
|
||||
configure:3040: result: no
|
||||
configure:3045: checking for suffix of object files
|
||||
configure:3067: gcc -c -g conftest.c >&5
|
||||
configure:3071: $? = 0
|
||||
configure:3092: result: o
|
||||
configure:3096: checking whether we are using the GNU C compiler
|
||||
configure:3115: gcc -c -g conftest.c >&5
|
||||
configure:3115: $? = 0
|
||||
configure:3124: result: yes
|
||||
configure:3133: checking whether gcc accepts -g
|
||||
configure:3153: gcc -c -g conftest.c >&5
|
||||
configure:3153: $? = 0
|
||||
configure:3194: result: yes
|
||||
configure:3211: checking for gcc option to accept ISO C89
|
||||
configure:3274: gcc -c -g conftest.c >&5
|
||||
configure:3274: $? = 0
|
||||
configure:3287: result: none needed
|
||||
configure:3312: checking how to run the C preprocessor
|
||||
configure:3343: gcc -E conftest.c
|
||||
configure:3343: $? = 0
|
||||
configure:3357: gcc -E conftest.c
|
||||
configure:2844: $? = 4
|
||||
configure:2864: checking whether the C compiler works
|
||||
configure:2886: gcc -g conftest.c >&5
|
||||
configure:2890: $? = 0
|
||||
configure:2938: result: yes
|
||||
configure:2941: checking for C compiler default output file name
|
||||
configure:2943: result: a.out
|
||||
configure:2949: checking for suffix of executables
|
||||
configure:2956: gcc -o conftest -g conftest.c >&5
|
||||
configure:2960: $? = 0
|
||||
configure:2982: result:
|
||||
configure:3004: checking whether we are cross compiling
|
||||
configure:3012: gcc -o conftest -g conftest.c >&5
|
||||
configure:3016: $? = 0
|
||||
configure:3023: ./conftest
|
||||
configure:3027: $? = 0
|
||||
configure:3042: result: no
|
||||
configure:3047: checking for suffix of object files
|
||||
configure:3069: gcc -c -g conftest.c >&5
|
||||
configure:3073: $? = 0
|
||||
configure:3094: result: o
|
||||
configure:3098: checking whether we are using the GNU C compiler
|
||||
configure:3117: gcc -c -g conftest.c >&5
|
||||
configure:3117: $? = 0
|
||||
configure:3126: result: yes
|
||||
configure:3135: checking whether gcc accepts -g
|
||||
configure:3155: gcc -c -g conftest.c >&5
|
||||
configure:3155: $? = 0
|
||||
configure:3196: result: yes
|
||||
configure:3213: checking for gcc option to accept ISO C89
|
||||
configure:3276: gcc -c -g conftest.c >&5
|
||||
configure:3276: $? = 0
|
||||
configure:3289: result: none needed
|
||||
configure:3314: checking how to run the C preprocessor
|
||||
configure:3345: gcc -E conftest.c
|
||||
configure:3345: $? = 0
|
||||
configure:3359: gcc -E conftest.c
|
||||
conftest.c:11:28: fatal error: ac_nonexistent.h: No such file or directory
|
||||
#include <ac_nonexistent.h>
|
||||
^
|
||||
compilation terminated.
|
||||
configure:3357: $? = 1
|
||||
configure:3359: $? = 1
|
||||
configure: failed program was:
|
||||
| /* confdefs.h */
|
||||
| #define PACKAGE_NAME "netgen"
|
||||
@@ -125,18 +125,18 @@ configure: failed program was:
|
||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||
| #define PACKAGE_URL ""
|
||||
| #define NETGEN_VERSION "1.5"
|
||||
| #define NETGEN_REVISION "50"
|
||||
| #define NETGEN_REVISION "60"
|
||||
| /* end confdefs.h. */
|
||||
| #include <ac_nonexistent.h>
|
||||
configure:3382: result: gcc -E
|
||||
configure:3402: gcc -E conftest.c
|
||||
configure:3402: $? = 0
|
||||
configure:3416: gcc -E conftest.c
|
||||
configure:3384: result: gcc -E
|
||||
configure:3404: gcc -E conftest.c
|
||||
configure:3404: $? = 0
|
||||
configure:3418: gcc -E conftest.c
|
||||
conftest.c:11:28: fatal error: ac_nonexistent.h: No such file or directory
|
||||
#include <ac_nonexistent.h>
|
||||
^
|
||||
compilation terminated.
|
||||
configure:3416: $? = 1
|
||||
configure:3418: $? = 1
|
||||
configure: failed program was:
|
||||
| /* confdefs.h */
|
||||
| #define PACKAGE_NAME "netgen"
|
||||
@@ -146,104 +146,104 @@ configure: failed program was:
|
||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||
| #define PACKAGE_URL ""
|
||||
| #define NETGEN_VERSION "1.5"
|
||||
| #define NETGEN_REVISION "50"
|
||||
| #define NETGEN_REVISION "60"
|
||||
| /* end confdefs.h. */
|
||||
| #include <ac_nonexistent.h>
|
||||
configure:3445: checking for library containing strerror
|
||||
configure:3476: gcc -o conftest -g conftest.c >&5
|
||||
configure:3476: $? = 0
|
||||
configure:3493: result: none required
|
||||
configure:3515: checking for a BSD-compatible install
|
||||
configure:3583: result: /bin/install -c
|
||||
configure:3637: checking for ranlib
|
||||
configure:3653: found /bin/ranlib
|
||||
configure:3664: result: ranlib
|
||||
configure:3691: checking for gm4
|
||||
configure:3724: result: no
|
||||
configure:3691: checking for gnum4
|
||||
configure:3724: result: no
|
||||
configure:3691: checking for m4
|
||||
configure:3709: found /bin/m4
|
||||
configure:3721: result: /bin/m4
|
||||
configure:3762: checking for ld used by GCC
|
||||
configure:3825: result: /bin/ld
|
||||
configure:3832: checking if the linker (/bin/ld) is GNU ld
|
||||
configure:3447: checking for library containing strerror
|
||||
configure:3478: gcc -o conftest -g conftest.c >&5
|
||||
configure:3478: $? = 0
|
||||
configure:3495: result: none required
|
||||
configure:3517: checking for a BSD-compatible install
|
||||
configure:3585: result: /bin/install -c
|
||||
configure:3639: checking for ranlib
|
||||
configure:3655: found /bin/ranlib
|
||||
configure:3666: result: ranlib
|
||||
configure:3693: checking for gm4
|
||||
configure:3726: result: no
|
||||
configure:3693: checking for gnum4
|
||||
configure:3726: result: no
|
||||
configure:3693: checking for m4
|
||||
configure:3711: found /bin/m4
|
||||
configure:3723: result: /bin/m4
|
||||
configure:3764: checking for ld used by GCC
|
||||
configure:3827: result: /bin/ld
|
||||
configure:3834: checking if the linker (/bin/ld) is GNU ld
|
||||
GNU ld version 2.24
|
||||
configure:3844: result: yes
|
||||
configure:3851: checking for grep that handles long lines and -e
|
||||
configure:3909: result: /bin/grep
|
||||
configure:3914: checking for egrep
|
||||
configure:3976: result: /bin/grep -E
|
||||
configure:3981: checking for ANSI C header files
|
||||
configure:4001: gcc -c -g conftest.c >&5
|
||||
configure:4001: $? = 0
|
||||
configure:4074: gcc -o conftest -g conftest.c >&5
|
||||
configure:4074: $? = 0
|
||||
configure:4074: ./conftest
|
||||
configure:4074: $? = 0
|
||||
configure:4085: result: yes
|
||||
configure:4098: checking for sys/types.h
|
||||
configure:4098: gcc -c -g conftest.c >&5
|
||||
configure:4098: $? = 0
|
||||
configure:4098: result: yes
|
||||
configure:4098: checking for sys/stat.h
|
||||
configure:4098: gcc -c -g conftest.c >&5
|
||||
configure:4098: $? = 0
|
||||
configure:4098: result: yes
|
||||
configure:4098: checking for stdlib.h
|
||||
configure:4098: gcc -c -g conftest.c >&5
|
||||
configure:4098: $? = 0
|
||||
configure:4098: result: yes
|
||||
configure:4098: checking for string.h
|
||||
configure:4098: gcc -c -g conftest.c >&5
|
||||
configure:4098: $? = 0
|
||||
configure:4098: result: yes
|
||||
configure:4098: checking for memory.h
|
||||
configure:4098: gcc -c -g conftest.c >&5
|
||||
configure:4098: $? = 0
|
||||
configure:4098: result: yes
|
||||
configure:4098: checking for strings.h
|
||||
configure:4098: gcc -c -g conftest.c >&5
|
||||
configure:4098: $? = 0
|
||||
configure:4098: result: yes
|
||||
configure:4098: checking for inttypes.h
|
||||
configure:4098: gcc -c -g conftest.c >&5
|
||||
configure:4098: $? = 0
|
||||
configure:4098: result: yes
|
||||
configure:4098: checking for stdint.h
|
||||
configure:4098: gcc -c -g conftest.c >&5
|
||||
configure:4098: $? = 0
|
||||
configure:4098: result: yes
|
||||
configure:4098: checking for unistd.h
|
||||
configure:4098: gcc -c -g conftest.c >&5
|
||||
configure:4098: $? = 0
|
||||
configure:4098: result: yes
|
||||
configure:4114: checking size of void *
|
||||
configure:4119: gcc -o conftest -g conftest.c >&5
|
||||
configure:4119: $? = 0
|
||||
configure:4119: ./conftest
|
||||
configure:4119: $? = 0
|
||||
configure:4133: result: 8
|
||||
configure:4147: checking size of unsigned int
|
||||
configure:4152: gcc -o conftest -g conftest.c >&5
|
||||
configure:4152: $? = 0
|
||||
configure:4152: ./conftest
|
||||
configure:4152: $? = 0
|
||||
configure:4166: result: 4
|
||||
configure:4180: checking size of unsigned long
|
||||
configure:4185: gcc -o conftest -g conftest.c >&5
|
||||
configure:4185: $? = 0
|
||||
configure:4185: ./conftest
|
||||
configure:4185: $? = 0
|
||||
configure:4199: result: 8
|
||||
configure:4213: checking size of unsigned long long
|
||||
configure:4218: gcc -o conftest -g conftest.c >&5
|
||||
configure:4218: $? = 0
|
||||
configure:4218: ./conftest
|
||||
configure:4218: $? = 0
|
||||
configure:4232: result: 8
|
||||
configure:4243: checking whether byte ordering is bigendian
|
||||
configure:4258: gcc -c -g conftest.c >&5
|
||||
configure:3846: result: yes
|
||||
configure:3853: checking for grep that handles long lines and -e
|
||||
configure:3911: result: /bin/grep
|
||||
configure:3916: checking for egrep
|
||||
configure:3978: result: /bin/grep -E
|
||||
configure:3983: checking for ANSI C header files
|
||||
configure:4003: gcc -c -g conftest.c >&5
|
||||
configure:4003: $? = 0
|
||||
configure:4076: gcc -o conftest -g conftest.c >&5
|
||||
configure:4076: $? = 0
|
||||
configure:4076: ./conftest
|
||||
configure:4076: $? = 0
|
||||
configure:4087: result: yes
|
||||
configure:4100: checking for sys/types.h
|
||||
configure:4100: gcc -c -g conftest.c >&5
|
||||
configure:4100: $? = 0
|
||||
configure:4100: result: yes
|
||||
configure:4100: checking for sys/stat.h
|
||||
configure:4100: gcc -c -g conftest.c >&5
|
||||
configure:4100: $? = 0
|
||||
configure:4100: result: yes
|
||||
configure:4100: checking for stdlib.h
|
||||
configure:4100: gcc -c -g conftest.c >&5
|
||||
configure:4100: $? = 0
|
||||
configure:4100: result: yes
|
||||
configure:4100: checking for string.h
|
||||
configure:4100: gcc -c -g conftest.c >&5
|
||||
configure:4100: $? = 0
|
||||
configure:4100: result: yes
|
||||
configure:4100: checking for memory.h
|
||||
configure:4100: gcc -c -g conftest.c >&5
|
||||
configure:4100: $? = 0
|
||||
configure:4100: result: yes
|
||||
configure:4100: checking for strings.h
|
||||
configure:4100: gcc -c -g conftest.c >&5
|
||||
configure:4100: $? = 0
|
||||
configure:4100: result: yes
|
||||
configure:4100: checking for inttypes.h
|
||||
configure:4100: gcc -c -g conftest.c >&5
|
||||
configure:4100: $? = 0
|
||||
configure:4100: result: yes
|
||||
configure:4100: checking for stdint.h
|
||||
configure:4100: gcc -c -g conftest.c >&5
|
||||
configure:4100: $? = 0
|
||||
configure:4100: result: yes
|
||||
configure:4100: checking for unistd.h
|
||||
configure:4100: gcc -c -g conftest.c >&5
|
||||
configure:4100: $? = 0
|
||||
configure:4100: result: yes
|
||||
configure:4116: checking size of void *
|
||||
configure:4121: gcc -o conftest -g conftest.c >&5
|
||||
configure:4121: $? = 0
|
||||
configure:4121: ./conftest
|
||||
configure:4121: $? = 0
|
||||
configure:4135: result: 8
|
||||
configure:4149: checking size of unsigned int
|
||||
configure:4154: gcc -o conftest -g conftest.c >&5
|
||||
configure:4154: $? = 0
|
||||
configure:4154: ./conftest
|
||||
configure:4154: $? = 0
|
||||
configure:4168: result: 4
|
||||
configure:4182: checking size of unsigned long
|
||||
configure:4187: gcc -o conftest -g conftest.c >&5
|
||||
configure:4187: $? = 0
|
||||
configure:4187: ./conftest
|
||||
configure:4187: $? = 0
|
||||
configure:4201: result: 8
|
||||
configure:4215: checking size of unsigned long long
|
||||
configure:4220: gcc -o conftest -g conftest.c >&5
|
||||
configure:4220: $? = 0
|
||||
configure:4220: ./conftest
|
||||
configure:4220: $? = 0
|
||||
configure:4234: result: 8
|
||||
configure:4245: checking whether byte ordering is bigendian
|
||||
configure:4260: gcc -c -g conftest.c >&5
|
||||
conftest.c:26:9: error: unknown type name 'not'
|
||||
not a universal capable compiler
|
||||
^
|
||||
@@ -251,7 +251,7 @@ conftest.c:26:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before
|
||||
not a universal capable compiler
|
||||
^
|
||||
conftest.c:26:15: error: unknown type name 'universal'
|
||||
configure:4258: $? = 1
|
||||
configure:4260: $? = 1
|
||||
configure: failed program was:
|
||||
| /* confdefs.h */
|
||||
| #define PACKAGE_NAME "netgen"
|
||||
@@ -261,7 +261,7 @@ configure: failed program was:
|
||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||
| #define PACKAGE_URL ""
|
||||
| #define NETGEN_VERSION "1.5"
|
||||
| #define NETGEN_REVISION "50"
|
||||
| #define NETGEN_REVISION "60"
|
||||
| #define STDC_HEADERS 1
|
||||
| #define HAVE_SYS_TYPES_H 1
|
||||
| #define HAVE_SYS_STAT_H 1
|
||||
@@ -282,9 +282,9 @@ configure: failed program was:
|
||||
| #endif
|
||||
| typedef int dummy;
|
||||
|
|
||||
configure:4303: gcc -c -g conftest.c >&5
|
||||
configure:4303: $? = 0
|
||||
configure:4321: gcc -c -g conftest.c >&5
|
||||
configure:4305: gcc -c -g conftest.c >&5
|
||||
configure:4305: $? = 0
|
||||
configure:4323: gcc -c -g conftest.c >&5
|
||||
conftest.c: In function 'main':
|
||||
conftest.c:32:4: error: unknown type name 'not'
|
||||
not big endian
|
||||
@@ -292,7 +292,7 @@ conftest.c:32:4: error: unknown type name 'not'
|
||||
conftest.c:32:12: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'endian'
|
||||
not big endian
|
||||
^
|
||||
configure:4321: $? = 1
|
||||
configure:4323: $? = 1
|
||||
configure: failed program was:
|
||||
| /* confdefs.h */
|
||||
| #define PACKAGE_NAME "netgen"
|
||||
@@ -302,7 +302,7 @@ configure: failed program was:
|
||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||
| #define PACKAGE_URL ""
|
||||
| #define NETGEN_VERSION "1.5"
|
||||
| #define NETGEN_REVISION "50"
|
||||
| #define NETGEN_REVISION "60"
|
||||
| #define STDC_HEADERS 1
|
||||
| #define HAVE_SYS_TYPES_H 1
|
||||
| #define HAVE_SYS_STAT_H 1
|
||||
@@ -331,48 +331,48 @@ configure: failed program was:
|
||||
| ;
|
||||
| return 0;
|
||||
| }
|
||||
configure:4449: result: no
|
||||
configure:4468: checking for ANSI C header files
|
||||
configure:4572: result: yes
|
||||
configure:4584: checking for setenv
|
||||
configure:4584: gcc -o conftest -g conftest.c >&5
|
||||
configure:4584: $? = 0
|
||||
configure:4584: result: yes
|
||||
configure:4584: checking for putenv
|
||||
configure:4584: gcc -o conftest -g conftest.c >&5
|
||||
configure:4584: $? = 0
|
||||
configure:4584: result: yes
|
||||
configure:4594: checking for vfork
|
||||
configure:4594: gcc -o conftest -g conftest.c >&5
|
||||
configure:4594: $? = 0
|
||||
configure:4594: result: yes
|
||||
configure:4602: checking dirent.h usability
|
||||
configure:4602: gcc -c -g conftest.c >&5
|
||||
configure:4602: $? = 0
|
||||
configure:4602: result: yes
|
||||
configure:4602: checking dirent.h presence
|
||||
configure:4602: gcc -E -x c conftest.c
|
||||
configure:4602: $? = 0
|
||||
configure:4602: result: yes
|
||||
configure:4602: checking for dirent.h
|
||||
configure:4602: result: yes
|
||||
configure:4615: checking limits.h usability
|
||||
configure:4615: gcc -c -g conftest.c >&5
|
||||
configure:4615: $? = 0
|
||||
configure:4615: result: yes
|
||||
configure:4615: checking limits.h presence
|
||||
configure:4615: gcc -E -x c conftest.c
|
||||
configure:4615: $? = 0
|
||||
configure:4615: result: yes
|
||||
configure:4615: checking for limits.h
|
||||
configure:4615: result: yes
|
||||
configure:4628: checking param.h usability
|
||||
configure:4628: gcc -c -g conftest.c >&5
|
||||
configure:4451: result: no
|
||||
configure:4470: checking for ANSI C header files
|
||||
configure:4574: result: yes
|
||||
configure:4586: checking for setenv
|
||||
configure:4586: gcc -o conftest -g conftest.c >&5
|
||||
configure:4586: $? = 0
|
||||
configure:4586: result: yes
|
||||
configure:4586: checking for putenv
|
||||
configure:4586: gcc -o conftest -g conftest.c >&5
|
||||
configure:4586: $? = 0
|
||||
configure:4586: result: yes
|
||||
configure:4596: checking for vfork
|
||||
configure:4596: gcc -o conftest -g conftest.c >&5
|
||||
configure:4596: $? = 0
|
||||
configure:4596: result: yes
|
||||
configure:4604: checking dirent.h usability
|
||||
configure:4604: gcc -c -g conftest.c >&5
|
||||
configure:4604: $? = 0
|
||||
configure:4604: result: yes
|
||||
configure:4604: checking dirent.h presence
|
||||
configure:4604: gcc -E -x c conftest.c
|
||||
configure:4604: $? = 0
|
||||
configure:4604: result: yes
|
||||
configure:4604: checking for dirent.h
|
||||
configure:4604: result: yes
|
||||
configure:4617: checking limits.h usability
|
||||
configure:4617: gcc -c -g conftest.c >&5
|
||||
configure:4617: $? = 0
|
||||
configure:4617: result: yes
|
||||
configure:4617: checking limits.h presence
|
||||
configure:4617: gcc -E -x c conftest.c
|
||||
configure:4617: $? = 0
|
||||
configure:4617: result: yes
|
||||
configure:4617: checking for limits.h
|
||||
configure:4617: result: yes
|
||||
configure:4630: checking param.h usability
|
||||
configure:4630: gcc -c -g conftest.c >&5
|
||||
conftest.c:63:19: fatal error: param.h: No such file or directory
|
||||
#include <param.h>
|
||||
^
|
||||
compilation terminated.
|
||||
configure:4628: $? = 1
|
||||
configure:4630: $? = 1
|
||||
configure: failed program was:
|
||||
| /* confdefs.h */
|
||||
| #define PACKAGE_NAME "netgen"
|
||||
@@ -382,7 +382,7 @@ configure: failed program was:
|
||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||
| #define PACKAGE_URL ""
|
||||
| #define NETGEN_VERSION "1.5"
|
||||
| #define NETGEN_REVISION "50"
|
||||
| #define NETGEN_REVISION "60"
|
||||
| #define STDC_HEADERS 1
|
||||
| #define HAVE_SYS_TYPES_H 1
|
||||
| #define HAVE_SYS_STAT_H 1
|
||||
@@ -437,14 +437,14 @@ configure: failed program was:
|
||||
| # include <unistd.h>
|
||||
| #endif
|
||||
| #include <param.h>
|
||||
configure:4628: result: no
|
||||
configure:4628: checking param.h presence
|
||||
configure:4628: gcc -E -x c conftest.c
|
||||
configure:4630: result: no
|
||||
configure:4630: checking param.h presence
|
||||
configure:4630: gcc -E -x c conftest.c
|
||||
conftest.c:30:19: fatal error: param.h: No such file or directory
|
||||
#include <param.h>
|
||||
^
|
||||
compilation terminated.
|
||||
configure:4628: $? = 1
|
||||
configure:4630: $? = 1
|
||||
configure: failed program was:
|
||||
| /* confdefs.h */
|
||||
| #define PACKAGE_NAME "netgen"
|
||||
@@ -454,7 +454,7 @@ configure: failed program was:
|
||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||
| #define PACKAGE_URL ""
|
||||
| #define NETGEN_VERSION "1.5"
|
||||
| #define NETGEN_REVISION "50"
|
||||
| #define NETGEN_REVISION "60"
|
||||
| #define STDC_HEADERS 1
|
||||
| #define HAVE_SYS_TYPES_H 1
|
||||
| #define HAVE_SYS_STAT_H 1
|
||||
@@ -476,52 +476,52 @@ configure: failed program was:
|
||||
| #define HAVE_LIMITS_H 1
|
||||
| /* end confdefs.h. */
|
||||
| #include <param.h>
|
||||
configure:4628: result: no
|
||||
configure:4628: checking for param.h
|
||||
configure:4628: result: no
|
||||
configure:4639: checking for va_copy
|
||||
configure:4657: gcc -o conftest -g conftest.c >&5
|
||||
configure:4657: $? = 0
|
||||
configure:4666: result: yes
|
||||
configure:4674: checking for __va_copy
|
||||
configure:4692: gcc -o conftest -g conftest.c >&5
|
||||
configure:4692: $? = 0
|
||||
configure:4701: result: yes
|
||||
configure:4831: checking for tclConfig.sh
|
||||
configure:4903: result: /usr/lib64/tclConfig.sh
|
||||
configure:4919: checking for tkConfig.sh
|
||||
configure:4992: result: /usr/lib64/tkConfig.sh
|
||||
configure:5106: checking for wish executable
|
||||
configure:5133: result: /usr/bin/wish
|
||||
configure:5139: checking for tclsh executable
|
||||
configure:5165: result: /usr/bin/tclsh
|
||||
configure:5288: checking for X
|
||||
configure:5427: gcc -o conftest -g conftest.c -lX11 >&5
|
||||
configure:5427: $? = 0
|
||||
configure:5477: result: libraries , headers
|
||||
configure:5576: gcc -o conftest -g conftest.c -lX11 >&5
|
||||
configure:5576: $? = 0
|
||||
configure:5674: checking for gethostbyname
|
||||
configure:5674: gcc -o conftest -g conftest.c >&5
|
||||
configure:5674: $? = 0
|
||||
configure:5674: result: yes
|
||||
configure:5771: checking for connect
|
||||
configure:5771: gcc -o conftest -g conftest.c >&5
|
||||
configure:5771: $? = 0
|
||||
configure:5771: result: yes
|
||||
configure:5820: checking for remove
|
||||
configure:5820: gcc -o conftest -g conftest.c >&5
|
||||
configure:5820: $? = 0
|
||||
configure:5820: result: yes
|
||||
configure:5869: checking for shmat
|
||||
configure:5869: gcc -o conftest -g conftest.c >&5
|
||||
configure:5869: $? = 0
|
||||
configure:5869: result: yes
|
||||
configure:5927: checking for IceConnectionNumber in -lICE
|
||||
configure:5952: gcc -o conftest -g conftest.c -lICE >&5
|
||||
configure:5952: $? = 0
|
||||
configure:5961: result: yes
|
||||
configure:6675: creating ./config.status
|
||||
configure:4630: result: no
|
||||
configure:4630: checking for param.h
|
||||
configure:4630: result: no
|
||||
configure:4641: checking for va_copy
|
||||
configure:4659: gcc -o conftest -g conftest.c >&5
|
||||
configure:4659: $? = 0
|
||||
configure:4668: result: yes
|
||||
configure:4676: checking for __va_copy
|
||||
configure:4694: gcc -o conftest -g conftest.c >&5
|
||||
configure:4694: $? = 0
|
||||
configure:4703: result: yes
|
||||
configure:4834: checking for tclConfig.sh
|
||||
configure:4906: result: /usr/lib64/tclConfig.sh
|
||||
configure:4922: checking for tkConfig.sh
|
||||
configure:4995: result: /usr/lib64/tkConfig.sh
|
||||
configure:5128: checking for wish executable
|
||||
configure:5155: result: /usr/bin/wish
|
||||
configure:5161: checking for tclsh executable
|
||||
configure:5187: result: /usr/bin/tclsh
|
||||
configure:5310: checking for X
|
||||
configure:5449: gcc -o conftest -g conftest.c -lX11 >&5
|
||||
configure:5449: $? = 0
|
||||
configure:5499: result: libraries , headers
|
||||
configure:5598: gcc -o conftest -g conftest.c -lX11 >&5
|
||||
configure:5598: $? = 0
|
||||
configure:5696: checking for gethostbyname
|
||||
configure:5696: gcc -o conftest -g conftest.c >&5
|
||||
configure:5696: $? = 0
|
||||
configure:5696: result: yes
|
||||
configure:5793: checking for connect
|
||||
configure:5793: gcc -o conftest -g conftest.c >&5
|
||||
configure:5793: $? = 0
|
||||
configure:5793: result: yes
|
||||
configure:5842: checking for remove
|
||||
configure:5842: gcc -o conftest -g conftest.c >&5
|
||||
configure:5842: $? = 0
|
||||
configure:5842: result: yes
|
||||
configure:5891: checking for shmat
|
||||
configure:5891: gcc -o conftest -g conftest.c >&5
|
||||
configure:5891: $? = 0
|
||||
configure:5891: result: yes
|
||||
configure:5949: checking for IceConnectionNumber in -lICE
|
||||
configure:5974: gcc -o conftest -g conftest.c -lICE >&5
|
||||
configure:5974: $? = 0
|
||||
configure:5983: result: yes
|
||||
configure:6705: creating ./config.status
|
||||
|
||||
## ---------------------- ##
|
||||
## Running config.status. ##
|
||||
@@ -538,8 +538,8 @@ generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
on stravinsky
|
||||
|
||||
config.status:781: creating defs.mak
|
||||
config.status:884: WARNING: 'defs.mak.in' seems to ignore the --datarootdir setting
|
||||
config.status:783: creating defs.mak
|
||||
config.status:886: WARNING: 'defs.mak.in' seems to ignore the --datarootdir setting
|
||||
|
||||
## ---------------- ##
|
||||
## Cache variables. ##
|
||||
@@ -621,7 +621,7 @@ CC='gcc'
|
||||
CFLAGS='-g -m64 -fPIC'
|
||||
CPP='gcc -E -x c'
|
||||
CPPFLAGS=''
|
||||
DEFS='-DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"50\" -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=\"60\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1'
|
||||
DEPEND_FLAG='-MM'
|
||||
ECHO_C=''
|
||||
ECHO_N='printf'
|
||||
@@ -641,7 +641,8 @@ LDFLAGS=''
|
||||
LD_RUN_PATH=''
|
||||
LIBOBJS=''
|
||||
LIBS=''
|
||||
LIB_SPECS=' -L/usr/lib64 -ltk8.6 -L/usr/lib64 -ltcl8.6'
|
||||
LIB_SPECS=' -L/usr/lib64 -ltkstub8.6 -L/usr/lib64 -ltclstub8.6'
|
||||
LIB_SPECS_NOSTUB=' -L/usr/lib64 -ltk8.6 -L/usr/lib64 -ltcl8.6'
|
||||
LTLIBOBJS=''
|
||||
M4='/bin/m4'
|
||||
OBJEXT='o'
|
||||
@@ -712,6 +713,7 @@ programs=' tcltk'
|
||||
psdir='${docdir}'
|
||||
sbindir='${exec_prefix}/sbin'
|
||||
sharedstatedir='${prefix}/com'
|
||||
stub_defs=' -DUSE_TCL_STUBS -DUSE_TK_STUBS'
|
||||
sub_extra_libs=''
|
||||
sysconfdir='${prefix}/etc'
|
||||
target='x86_64-unknown-linux-gnu'
|
||||
@@ -734,7 +736,7 @@ unused=''
|
||||
#define PACKAGE_BUGREPORT "[email protected]"
|
||||
#define PACKAGE_URL ""
|
||||
#define NETGEN_VERSION "1.5"
|
||||
#define NETGEN_REVISION "50"
|
||||
#define NETGEN_REVISION "60"
|
||||
#define STDC_HEADERS 1
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
@@ -601,6 +601,7 @@ S["sub_extra_libs"]=""
|
||||
S["top_extra_libs"]=""
|
||||
S["ld_extra_objs"]=""
|
||||
S["ld_extra_libs"]=""
|
||||
S["stub_defs"]=" -DUSE_TCL_STUBS -DUSE_TK_STUBS"
|
||||
S["extra_defs"]=" -DCAD_DIR=\\\"${LIBDIR}\\\" -DTCL_DIR=\\\"${TCLDIR}\\\""
|
||||
S["extra_libs"]=" ${NETGENDIR}/tcltk/libtcltk.o"
|
||||
S["SCRIPTS"]=""
|
||||
@@ -609,7 +610,8 @@ S["VERSION"]=""
|
||||
S["TCL_LIB_DIR"]="/usr/lib"
|
||||
S["TCLSH_EXE"]="/usr/bin/tclsh"
|
||||
S["WISH_EXE"]="/usr/bin/wish"
|
||||
S["LIB_SPECS"]=" -L/usr/lib64 -ltk8.6 -L/usr/lib64 -ltcl8.6"
|
||||
S["LIB_SPECS_NOSTUB"]=" -L/usr/lib64 -ltk8.6 -L/usr/lib64 -ltcl8.6"
|
||||
S["LIB_SPECS"]=" -L/usr/lib64 -ltkstub8.6 -L/usr/lib64 -ltclstub8.6"
|
||||
S["INC_SPECS"]=""
|
||||
S["EXTRA_LIB_SPECS"]="-ldl"
|
||||
S["SHLIB_LIB_SPECS"]=""
|
||||
@@ -657,7 +659,7 @@ S["ECHO_T"]=""
|
||||
S["ECHO_N"]="-n"
|
||||
S["ECHO_C"]=""
|
||||
S["DEFS"]="-DPACKAGE_NAME=\\\"netgen\\\" -DPACKAGE_TARNAME=\\\"netgen\\\" -DPACKAGE_VERSION=\\\"1.3\\\" -DPACKAGE_STRING=\\\"netgen\\ 1.3\\\" -DPACKAGE_BUGREPORT=\\\"eda-dev@open"\
|
||||
"circuitdesign.com\\\" -DPACKAGE_URL=\\\"\\\" -DNETGEN_VERSION=\\\"1.5\\\" -DNETGEN_REVISION=\\\"50\\\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -"\
|
||||
"circuitdesign.com\\\" -DPACKAGE_URL=\\\"\\\" -DNETGEN_VERSION=\\\"1.5\\\" -DNETGEN_REVISION=\\\"60\\\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -"\
|
||||
"DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -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"
|
||||
|
||||
Vendored
+36
-6
@@ -641,6 +641,7 @@ sub_extra_libs
|
||||
top_extra_libs
|
||||
ld_extra_objs
|
||||
ld_extra_libs
|
||||
stub_defs
|
||||
extra_defs
|
||||
extra_libs
|
||||
SCRIPTS
|
||||
@@ -649,6 +650,7 @@ VERSION
|
||||
TCL_LIB_DIR
|
||||
TCLSH_EXE
|
||||
WISH_EXE
|
||||
LIB_SPECS_NOSTUB
|
||||
LIB_SPECS
|
||||
INC_SPECS
|
||||
EXTRA_LIB_SPECS
|
||||
@@ -4712,6 +4714,7 @@ fi
|
||||
$as_echo "#define DBUG_OFF 1" >>confdefs.h
|
||||
|
||||
|
||||
stub_defs=""
|
||||
extra_defs="$extra_defs -DCAD_DIR=\\\"\${LIBDIR}\\\""
|
||||
X_LIBS=
|
||||
X_CFLAGS=
|
||||
@@ -4861,7 +4864,7 @@ $as_echo_n "checking for tclConfig.sh... " >&6; }
|
||||
# 1. Search previously named locations.
|
||||
|
||||
for dir in \
|
||||
$prefix \
|
||||
$ac_default_prefix \
|
||||
$exec_prefix
|
||||
do
|
||||
if test -r "$dir/tclConfig.sh" ; then
|
||||
@@ -4948,7 +4951,7 @@ $as_echo_n "checking for tkConfig.sh... " >&6; }
|
||||
# 1. Search previously named locations.
|
||||
#
|
||||
for dir in \
|
||||
$prefix \
|
||||
$ac_default_prefix \
|
||||
$exec_prefix
|
||||
do
|
||||
if test -r "$dir/tkConfig.sh" ; then
|
||||
@@ -5007,6 +5010,25 @@ if test $usingTcl ; then
|
||||
. $tcl_config_sh
|
||||
. $tk_config_sh
|
||||
|
||||
# Should probably trust the config file contents, but this configure
|
||||
# file checks the Tcl and Tk include and lib directories. Since
|
||||
# the config file doesn't separate out the libraries from the strings
|
||||
# passed to the compiler/linker, do it manually here.
|
||||
#
|
||||
# Extract TCL_LIB_DIR from TCL_LIB_SPEC
|
||||
# Extract TK_LIB_DIR from TK_LIB_SPEC
|
||||
# Extract TCL_INC_DIR from TCL_INCLUDE_SPEC
|
||||
# Extract TK_INC_DIR from TK_INCLUDE_SPEC
|
||||
#
|
||||
# These will be the defaults unless overridden by configure command line
|
||||
|
||||
tmpstr=${TCL_LIB_SPEC#*-L}
|
||||
TCL_LIB_DIR=${tmpstr% -l*}
|
||||
tmpstr=${TK_LIB_SPEC#*-L}
|
||||
TK_LIB_DIR=${tmpstr% -l*}
|
||||
TCL_INC_DIR=${TCL_INCLUDE_SPEC#*-I}
|
||||
TK_INC_DIR=${TK_INCLUDE_SPEC#*-I}
|
||||
|
||||
if test "$TCL_VERSION" = "7.6" -a "$TK_VERSION" = "4.2" ; then
|
||||
:
|
||||
elif test "$TCL_VERSION" = "7.5" -a "$TK_VERSION" = "4.1" ; then
|
||||
@@ -5992,6 +6014,7 @@ if test $usingTcl ; then
|
||||
|
||||
extra_libs="$extra_libs \${NETGENDIR}/tcltk/libtcltk.o"
|
||||
extra_defs="$extra_defs -DTCL_DIR=\\\"\${TCLDIR}\\\""
|
||||
stub_defs="$stub_defs -DUSE_TCL_STUBS -DUSE_TK_STUBS"
|
||||
else
|
||||
programs="$programs netgen"
|
||||
unused="$unused tcltk"
|
||||
@@ -6070,6 +6093,7 @@ esac
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
if test $usingTcl ; then
|
||||
LIB_SPECS_NOSTUB="${LIB_SPECS}"
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
#
|
||||
@@ -6081,9 +6105,11 @@ if test $usingTcl ; then
|
||||
fi
|
||||
if test "${TK_LIB_DIR}" = "/usr/lib" -o \
|
||||
"${TK_LIB_DIR}" = "/usr/lib64" ; then
|
||||
LIB_SPECS="${LIB_SPECS} ${TK_LIB_SPEC}"
|
||||
LIB_SPECS_NOSTUB="${LIB_SPECS_NOSTUB} ${TK_LIB_SPEC}"
|
||||
LIB_SPECS="${LIB_SPECS} ${TK_STUB_LIB_SPEC}"
|
||||
else
|
||||
LIB_SPECS="${LIB_SPECS} -L${TK_LIB_DIR} ${TK_LIB_SPEC}"
|
||||
LIB_SPECS_NOSTUB="${LIB_SPECS_NOSTUB} -L${TK_LIB_DIR} ${TK_LIB_SPEC}"
|
||||
LIB_SPECS="${LIB_SPECS} -L${TK_LIB_DIR} ${TK_STUB_LIB_SPEC}"
|
||||
if test "x${loader_run_path}" = "x" ; then
|
||||
loader_run_path="${TK_LIB_DIR}"
|
||||
else
|
||||
@@ -6107,9 +6133,11 @@ if test $usingTcl ; then
|
||||
if test "${TCL_LIB_DIR}" = "/usr/lib" -o \
|
||||
"${TCL_LIB_DIR}" = "/usr/lib64" -o \
|
||||
"${TCL_LIB_DIR}" = "${TK_LIB_DIR}" ; then
|
||||
LIB_SPECS="${LIB_SPECS} ${TCL_LIB_SPEC}"
|
||||
LIB_SPECS_NOSTUB="${LIB_SPECS_NOSTUB} ${TCL_LIB_SPEC}"
|
||||
LIB_SPECS="${LIB_SPECS} ${TCL_STUB_LIB_SPEC}"
|
||||
else
|
||||
LIB_SPECS="${LIB_SPECS} -L${TCL_LIB_DIR} ${TCL_LIB_SPEC}"
|
||||
LIB_SPECS_NOSTUB="${LIB_SPECS_NOSTUB} -L${TCL_LIB_DIR} ${TCL_LIB_SPEC}"
|
||||
LIB_SPECS="${LIB_SPECS} -L${TCL_LIB_DIR} ${TCL_STUB_LIB_SPEC}"
|
||||
if test "x${loader_run_path}" = "x" ; then
|
||||
loader_run_path="${TCL_LIB_DIR}"
|
||||
else
|
||||
@@ -6482,6 +6510,7 @@ fi
|
||||
|
||||
|
||||
|
||||
|
||||
fi
|
||||
|
||||
if test "$GCC" = "yes" ; then
|
||||
@@ -6517,6 +6546,7 @@ fi
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
ac_config_files="$ac_config_files defs.mak"
|
||||
|
||||
+32
-4
@@ -195,6 +195,7 @@ fi
|
||||
# not ANSI-compliant and won't compile without quite a bit of work.
|
||||
AC_DEFINE(DBUG_OFF)
|
||||
|
||||
stub_defs=""
|
||||
extra_defs="$extra_defs -DCAD_DIR=\\\"\${LIBDIR}\\\""
|
||||
X_LIBS=
|
||||
X_CFLAGS=
|
||||
@@ -472,6 +473,25 @@ if test $usingTcl ; then
|
||||
. $tcl_config_sh
|
||||
. $tk_config_sh
|
||||
|
||||
# Should probably trust the config file contents, but this configure
|
||||
# file checks the Tcl and Tk include and lib directories. Since
|
||||
# the config file doesn't separate out the libraries from the strings
|
||||
# passed to the compiler/linker, do it manually here.
|
||||
#
|
||||
# Extract TCL_LIB_DIR from TCL_LIB_SPEC
|
||||
# Extract TK_LIB_DIR from TK_LIB_SPEC
|
||||
# Extract TCL_INC_DIR from TCL_INCLUDE_SPEC
|
||||
# Extract TK_INC_DIR from TK_INCLUDE_SPEC
|
||||
#
|
||||
# These will be the defaults unless overridden by configure command line
|
||||
|
||||
tmpstr=${TCL_LIB_SPEC#*-L}
|
||||
TCL_LIB_DIR=${tmpstr% -l*}
|
||||
tmpstr=${TK_LIB_SPEC#*-L}
|
||||
TK_LIB_DIR=${tmpstr% -l*}
|
||||
TCL_INC_DIR=${TCL_INCLUDE_SPEC#*-I}
|
||||
TK_INC_DIR=${TK_INCLUDE_SPEC#*-I}
|
||||
|
||||
if test "$TCL_VERSION" = "7.6" -a "$TK_VERSION" = "4.2" ; then
|
||||
:
|
||||
elif test "$TCL_VERSION" = "7.5" -a "$TK_VERSION" = "4.1" ; then
|
||||
@@ -779,6 +799,7 @@ if test $usingTcl ; then
|
||||
AC_DEFINE(TCL_NETGEN)
|
||||
extra_libs="$extra_libs \${NETGENDIR}/tcltk/libtcltk.o"
|
||||
extra_defs="$extra_defs -DTCL_DIR=\\\"\${TCLDIR}\\\""
|
||||
stub_defs="$stub_defs -DUSE_TCL_STUBS -DUSE_TK_STUBS"
|
||||
else
|
||||
programs="$programs netgen"
|
||||
unused="$unused tcltk"
|
||||
@@ -858,6 +879,7 @@ esac
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
if test $usingTcl ; then
|
||||
LIB_SPECS_NOSTUB="${LIB_SPECS}"
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
#
|
||||
@@ -869,9 +891,11 @@ if test $usingTcl ; then
|
||||
fi
|
||||
if test "${TK_LIB_DIR}" = "/usr/lib" -o \
|
||||
"${TK_LIB_DIR}" = "/usr/lib64" ; then
|
||||
LIB_SPECS="${LIB_SPECS} ${TK_LIB_SPEC}"
|
||||
LIB_SPECS_NOSTUB="${LIB_SPECS_NOSTUB} ${TK_LIB_SPEC}"
|
||||
LIB_SPECS="${LIB_SPECS} ${TK_STUB_LIB_SPEC}"
|
||||
else
|
||||
LIB_SPECS="${LIB_SPECS} -L${TK_LIB_DIR} ${TK_LIB_SPEC}"
|
||||
LIB_SPECS_NOSTUB="${LIB_SPECS_NOSTUB} -L${TK_LIB_DIR} ${TK_LIB_SPEC}"
|
||||
LIB_SPECS="${LIB_SPECS} -L${TK_LIB_DIR} ${TK_STUB_LIB_SPEC}"
|
||||
if test "x${loader_run_path}" = "x" ; then
|
||||
loader_run_path="${TK_LIB_DIR}"
|
||||
else
|
||||
@@ -895,9 +919,11 @@ if test $usingTcl ; then
|
||||
if test "${TCL_LIB_DIR}" = "/usr/lib" -o \
|
||||
"${TCL_LIB_DIR}" = "/usr/lib64" -o \
|
||||
"${TCL_LIB_DIR}" = "${TK_LIB_DIR}" ; then
|
||||
LIB_SPECS="${LIB_SPECS} ${TCL_LIB_SPEC}"
|
||||
LIB_SPECS_NOSTUB="${LIB_SPECS_NOSTUB} ${TCL_LIB_SPEC}"
|
||||
LIB_SPECS="${LIB_SPECS} ${TCL_STUB_LIB_SPEC}"
|
||||
else
|
||||
LIB_SPECS="${LIB_SPECS} -L${TCL_LIB_DIR} ${TCL_LIB_SPEC}"
|
||||
LIB_SPECS_NOSTUB="${LIB_SPECS_NOSTUB} -L${TCL_LIB_DIR} ${TCL_LIB_SPEC}"
|
||||
LIB_SPECS="${LIB_SPECS} -L${TCL_LIB_DIR} ${TCL_STUB_LIB_SPEC}"
|
||||
if test "x${loader_run_path}" = "x" ; then
|
||||
loader_run_path="${TCL_LIB_DIR}"
|
||||
else
|
||||
@@ -1216,6 +1242,7 @@ if test $usingTcl ; then
|
||||
AC_SUBST(LDFLAGS)
|
||||
AC_SUBST(INC_SPECS)
|
||||
AC_SUBST(LIB_SPECS)
|
||||
AC_SUBST(LIB_SPECS_NOSTUB)
|
||||
AC_SUBST(WISH_EXE)
|
||||
AC_SUBST(TCLSH_EXE)
|
||||
AC_SUBST(TCL_LIB_DIR)
|
||||
@@ -1233,6 +1260,7 @@ AC_SUBST(PACKAGE)
|
||||
AC_SUBST(SCRIPTS)
|
||||
AC_SUBST(extra_libs)
|
||||
AC_SUBST(extra_defs)
|
||||
AC_SUBST(stub_defs)
|
||||
AC_SUBST(ld_extra_libs)
|
||||
AC_SUBST(ld_extra_objs)
|
||||
AC_SUBST(top_extra_libs)
|
||||
|
||||
+4
-2
@@ -56,7 +56,8 @@ RANLIB = ranlib
|
||||
SHDLIB_EXT = .so
|
||||
LDDL_FLAGS = -shared -Wl,-soname,$@ -Wl,--version-script=${NETGENDIR}/netgen/symbol.map
|
||||
LD_RUN_PATH =
|
||||
LIB_SPECS = -L/usr/lib64 -ltk8.6 -L/usr/lib64 -ltcl8.6
|
||||
LIB_SPECS = -L/usr/lib64 -ltkstub8.6 -L/usr/lib64 -ltclstub8.6
|
||||
LIB_SPECS_NOSTUB = -L/usr/lib64 -ltk8.6 -L/usr/lib64 -ltcl8.6
|
||||
WISH_EXE = /usr/bin/wish
|
||||
TCL_LIB_DIR = /usr/lib
|
||||
|
||||
@@ -65,7 +66,8 @@ 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=\"50\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
|
||||
DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DUSE_TCL_STUBS -DUSE_TK_STUBS -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"60\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
|
||||
DFLAGS_NOSTUB = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"60\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
|
||||
CFLAGS = -g -m64 -fPIC -fPIC
|
||||
|
||||
DEPEND_FILE = Depend
|
||||
|
||||
+3
-1
@@ -57,6 +57,7 @@ SHDLIB_EXT = @SHDLIB_EXT@
|
||||
LDDL_FLAGS = @LDDL_FLAGS@
|
||||
LD_RUN_PATH = @LD_RUN_PATH@
|
||||
LIB_SPECS = @LIB_SPECS@
|
||||
LIB_SPECS_NOSTUB = @LIB_SPECS_NOSTUB@
|
||||
WISH_EXE = @WISH_EXE@
|
||||
TCL_LIB_DIR = @TCL_LIB_DIR@
|
||||
|
||||
@@ -65,7 +66,8 @@ CPP = @CPP@
|
||||
CXX = @CXX@
|
||||
|
||||
CPPFLAGS = -I. -I${NETGENDIR} @CPPFLAGS@
|
||||
DFLAGS = @extra_defs@ @DEFS@ -DSHDLIB_EXT=\"@SHDLIB_EXT@\" -DNDEBUG
|
||||
DFLAGS = @extra_defs@ @stub_defs@ @DEFS@ -DSHDLIB_EXT=\"@SHDLIB_EXT@\" -DNDEBUG
|
||||
DFLAGS_NOSTUB = @extra_defs@ @DEFS@ -DSHDLIB_EXT=\"@SHDLIB_EXT@\" -DNDEBUG
|
||||
CFLAGS = @CFLAGS@ @SHLIB_CFLAGS@ @INC_SPECS@
|
||||
|
||||
DEPEND_FILE = Depend
|
||||
|
||||
+3
-2
@@ -23,8 +23,9 @@ install-tcl: netgenexec${EXEEXT} $(DESTDIR)${BINDIR}/netgen.sh ${TCL_FILES}
|
||||
${CP} netgenexec${EXEEXT} $(DESTDIR)${TCLDIR}/netgenexec${EXEEXT}
|
||||
|
||||
netgenexec${EXEEXT}: netgenexec.c
|
||||
${CC} ${CFLAGS} ${CPPFLAGS} ${DFLAGS} netgenexec.c -o netgenexec${EXEEXT} \
|
||||
${LDFLAGS} ${LIBS} ${LIB_SPECS}
|
||||
${CC} ${CFLAGS} ${CPPFLAGS} ${DFLAGS_NOSTUB} netgenexec.c \
|
||||
-o netgenexec${EXEEXT} \
|
||||
${LDFLAGS} ${LIBS} ${LIB_SPECS_NOSTUB}
|
||||
|
||||
netgen.tcl: netgen.tcl.in
|
||||
sed -e /TCL_DIR/s%TCL_DIR%${TCLDIR}%g \
|
||||
|
||||
+386
-9
@@ -20,7 +20,338 @@ foreach i $nlist {
|
||||
}
|
||||
}
|
||||
|
||||
load TCL_DIR/tclnetgenSHDLIB_EXT
|
||||
if {${tcl_version} >= 8.6} {
|
||||
load -lazy TCL_DIR/tclnetgenSHDLIB_EXT
|
||||
} else {
|
||||
load TCL_DIR/tclnetgenSHDLIB_EXT
|
||||
}
|
||||
|
||||
#----------------------------------------------------------------
|
||||
# Convert LVS list result into a JSON file
|
||||
#----------------------------------------------------------------
|
||||
|
||||
proc netgen::convert_to_json {filename lvs_final} {
|
||||
set pidx [string last . $filename]
|
||||
set jsonname [string replace $filename $pidx end ".json"]
|
||||
if {![catch {open $jsonname w} fjson]} {
|
||||
puts $fjson "\["
|
||||
# Outer list is of each cell compared
|
||||
set clen [llength $lvs_final]
|
||||
set cidx 0
|
||||
foreach circuit $lvs_final {
|
||||
incr cidx
|
||||
puts $fjson " \{"
|
||||
set nkeys [llength $circuit]
|
||||
set kidx 0
|
||||
foreach {key value} $circuit {
|
||||
incr kidx 2
|
||||
switch $key {
|
||||
name {
|
||||
puts $fjson " \"${key}\": \["
|
||||
set cktval [lindex $value 0]
|
||||
puts $fjson " \"${cktval}\","
|
||||
set cktval [lindex $value 1]
|
||||
puts $fjson " \"${cktval}\""
|
||||
if {$kidx == $nkeys} {
|
||||
puts $fjson " \]"
|
||||
} else {
|
||||
puts $fjson " \],"
|
||||
}
|
||||
}
|
||||
pins {
|
||||
puts $fjson " \"${key}\": \["
|
||||
puts $fjson " \["
|
||||
set cktval [lindex $value 0]
|
||||
foreach pin [lrange $cktval 0 end-1] {
|
||||
puts $fjson " \"$pin\","
|
||||
}
|
||||
set pin [lindex $cktval end]
|
||||
puts $fjson " \"$pin\""
|
||||
puts $fjson " \], \["
|
||||
set cktval [lindex $value 1]
|
||||
foreach pin [lrange $cktval 0 end-1] {
|
||||
puts $fjson " \"$pin\","
|
||||
}
|
||||
set pin [lindex $cktval end]
|
||||
puts $fjson " \"$pin\""
|
||||
puts $fjson " \]"
|
||||
if {$kidx == $nkeys} {
|
||||
puts $fjson " \]"
|
||||
} else {
|
||||
puts $fjson " \],"
|
||||
}
|
||||
}
|
||||
nets {
|
||||
puts $fjson " \"${key}\": \["
|
||||
set cktval [lindex $value 0]
|
||||
puts $fjson " $cktval,"
|
||||
set cktval [lindex $value 1]
|
||||
puts $fjson " $cktval"
|
||||
if {$kidx == $nkeys} {
|
||||
puts $fjson " \]"
|
||||
} else {
|
||||
puts $fjson " \],"
|
||||
}
|
||||
}
|
||||
devices {
|
||||
puts $fjson " \"${key}\": \["
|
||||
puts $fjson " \["
|
||||
set cktval [lindex $value 0]
|
||||
foreach dev [lrange $cktval 0 end-1] {
|
||||
set devname [lindex $dev 0]
|
||||
set devnum [lindex $dev 1]
|
||||
puts $fjson " \[\"${devname}\", ${devnum}\],"
|
||||
}
|
||||
set dev [lindex $cktval end]
|
||||
set devname [lindex $dev 0]
|
||||
set devnum [lindex $dev 1]
|
||||
puts $fjson " \[\"${devname}\", ${devnum} \]"
|
||||
puts $fjson " \], \["
|
||||
set cktval [lindex $value 1]
|
||||
foreach dev [lrange $cktval 0 end-1] {
|
||||
set devname [lindex $dev 0]
|
||||
set devnum [lindex $dev 1]
|
||||
puts $fjson " \[\"${devname}\", ${devnum} \],"
|
||||
}
|
||||
set dev [lindex $cktval end]
|
||||
set devname [lindex $dev 0]
|
||||
set devnum [lindex $dev 1]
|
||||
puts $fjson " \[\"${devname}\", ${devnum} \]"
|
||||
puts $fjson " \]"
|
||||
if {$kidx == $nkeys} {
|
||||
puts $fjson " \]"
|
||||
} else {
|
||||
puts $fjson " \],"
|
||||
}
|
||||
}
|
||||
goodnets -
|
||||
badnets {
|
||||
puts $fjson " \"${key}\": \["
|
||||
set glen [llength $value]
|
||||
set gidx 0
|
||||
foreach group $value {
|
||||
incr gidx
|
||||
puts $fjson " \["
|
||||
puts $fjson " \["
|
||||
set cktval [lindex $group 0]
|
||||
set nlen [llength $cktval]
|
||||
set nidx 0
|
||||
foreach net $cktval {
|
||||
incr nidx
|
||||
puts $fjson " \["
|
||||
set netname [lindex $net 0]
|
||||
puts $fjson " \"$netname\","
|
||||
puts $fjson " \["
|
||||
set netconn [lindex $net 1]
|
||||
foreach fanout [lrange $netconn 0 end-1] {
|
||||
set devname [lindex $fanout 0]
|
||||
set pinname [lindex $fanout 1]
|
||||
set count [lindex $fanout 2]
|
||||
if {$count == {}} {set count 0}
|
||||
puts $fjson " \[ \"$devname\", \"$pinname\", $count \],"
|
||||
}
|
||||
set fanout [lindex $netconn end]
|
||||
set devname [lindex $fanout 0]
|
||||
set pinname [lindex $fanout 1]
|
||||
set count [lindex $fanout 2]
|
||||
if {$count == {}} {set count 0}
|
||||
puts $fjson " \[ \"$devname\", \"$pinname\", $count \]"
|
||||
puts $fjson " \]"
|
||||
if {$nidx == $nlen} {
|
||||
puts $fjson " \]"
|
||||
} else {
|
||||
puts $fjson " \],"
|
||||
}
|
||||
}
|
||||
puts $fjson " \], \["
|
||||
set cktval [lindex $group 1]
|
||||
set nlen [llength $cktval]
|
||||
set nidx 0
|
||||
foreach net $cktval {
|
||||
incr nidx
|
||||
puts $fjson " \["
|
||||
set netname [lindex $net 0]
|
||||
puts $fjson " \"$netname\","
|
||||
puts $fjson " \["
|
||||
set netconn [lindex $net 1]
|
||||
foreach fanout [lrange $netconn 0 end-1] {
|
||||
set devname [lindex $fanout 0]
|
||||
set pinname [lindex $fanout 1]
|
||||
set count [lindex $fanout 2]
|
||||
if {$count == {}} {set count 0}
|
||||
puts $fjson " \[ \"$devname\", \"$pinname\", $count \],"
|
||||
}
|
||||
set fanout [lindex $netconn end]
|
||||
set devname [lindex $fanout 0]
|
||||
set pinname [lindex $fanout 1]
|
||||
set count [lindex $fanout 2]
|
||||
if {$count == {}} {set count 0}
|
||||
puts $fjson " \[ \"$devname\", \"$pinname\", $count \]"
|
||||
puts $fjson " \]"
|
||||
if {$nidx == $nlen} {
|
||||
puts $fjson " \]"
|
||||
} else {
|
||||
puts $fjson " \],"
|
||||
}
|
||||
}
|
||||
puts $fjson " \]"
|
||||
if {$gidx == $glen} {
|
||||
puts $fjson " \]"
|
||||
} else {
|
||||
puts $fjson " \],"
|
||||
}
|
||||
}
|
||||
if {$kidx == $nkeys} {
|
||||
puts $fjson " \]"
|
||||
} else {
|
||||
puts $fjson " \],"
|
||||
}
|
||||
}
|
||||
goodelements -
|
||||
badelements {
|
||||
puts $fjson " \"${key}\": \["
|
||||
set glen [llength $value]
|
||||
set gidx 0
|
||||
foreach group $value {
|
||||
incr gidx
|
||||
puts $fjson " \["
|
||||
puts $fjson " \["
|
||||
set cktval [lindex $group 0]
|
||||
set ilen [llength $cktval]
|
||||
set iidx 0
|
||||
foreach inst $cktval {
|
||||
incr iidx
|
||||
puts $fjson " \["
|
||||
set instname [lindex $inst 0]
|
||||
puts $fjson " \"$instname\","
|
||||
puts $fjson " \["
|
||||
set instpins [lindex $inst 1]
|
||||
foreach fanout [lrange $instpins 0 end-1] {
|
||||
set pinname [lindex $fanout 0]
|
||||
set count [lindex $fanout 1]
|
||||
if {$count == {}} {set count 0}
|
||||
puts $fjson " \[ \"$pinname\", $count \],"
|
||||
}
|
||||
set fanout [lindex $instpins end]
|
||||
set pinname [lindex $fanout 0]
|
||||
set count [lindex $fanout 1]
|
||||
if {$count == {}} {set count 0}
|
||||
puts $fjson " \[ \"$pinname\", $count \]"
|
||||
puts $fjson " \]"
|
||||
if {$iidx == $ilen} {
|
||||
puts $fjson " \]"
|
||||
} else {
|
||||
puts $fjson " \],"
|
||||
}
|
||||
}
|
||||
puts $fjson " \], \["
|
||||
set cktval [lindex $group 1]
|
||||
set ilen [llength $cktval]
|
||||
set iidx 0
|
||||
foreach inst $cktval {
|
||||
incr iidx
|
||||
puts $fjson " \["
|
||||
set instname [lindex $inst 0]
|
||||
puts $fjson " \"$instname\","
|
||||
puts $fjson " \["
|
||||
set instpins [lindex $inst 1]
|
||||
foreach fanout [lrange $instpins 0 end-1] {
|
||||
set pinname [lindex $fanout 0]
|
||||
set count [lindex $fanout 1]
|
||||
if {$count == {}} {set count 0}
|
||||
puts $fjson " \[ \"$pinname\", $count \],"
|
||||
}
|
||||
set fanout [lindex $instpins end]
|
||||
set pinname [lindex $fanout 0]
|
||||
set count [lindex $fanout 1]
|
||||
if {$count == {}} {set count 0}
|
||||
puts $fjson " \[ \"$pinname\", $count \]"
|
||||
puts $fjson " \]"
|
||||
if {$iidx == $ilen} {
|
||||
puts $fjson " \]"
|
||||
} else {
|
||||
puts $fjson " \],"
|
||||
}
|
||||
}
|
||||
puts $fjson " \]"
|
||||
if {$gidx == $glen} {
|
||||
puts $fjson " \]"
|
||||
} else {
|
||||
puts $fjson " \],"
|
||||
}
|
||||
}
|
||||
if {$kidx == $nkeys} {
|
||||
puts $fjson " \]"
|
||||
} else {
|
||||
puts $fjson " \],"
|
||||
}
|
||||
}
|
||||
properties {
|
||||
puts $fjson " \"${key}\": \["
|
||||
set plen [llength $value]
|
||||
set pidx 0
|
||||
foreach instance $value {
|
||||
incr pidx
|
||||
puts $fjson " \["
|
||||
set instnames [lindex $instance 0]
|
||||
set instname0 [lindex $instnames 0]
|
||||
puts $fjson " \["
|
||||
puts $fjson " \"${instname0}\","
|
||||
puts $fjson " \["
|
||||
foreach property [lrange $instance 1 end-1] {
|
||||
set prop0 [lindex $property 0]
|
||||
set propname [lindex $prop0 0]
|
||||
set propval [lindex $prop0 1]
|
||||
puts $fjson " \[\"${propname}\", \"${propval}\"\],"
|
||||
}
|
||||
set property [lindex $instance end]
|
||||
set prop0 [lindex $property 0]
|
||||
set propname [lindex $prop0 0]
|
||||
set propval [lindex $prop0 1]
|
||||
puts $fjson " \[\"${propname}\", \"${propval}\"\]"
|
||||
puts $fjson " \]"
|
||||
puts $fjson " \],"
|
||||
set instname1 [lindex $instnames 1]
|
||||
puts $fjson " \["
|
||||
puts $fjson " \"${instname1}\","
|
||||
puts $fjson " \["
|
||||
foreach property [lrange $instance 1 end-1] {
|
||||
set prop1 [lindex $property 1]
|
||||
set propname [lindex $prop1 0]
|
||||
set propval [lindex $prop1 1]
|
||||
puts $fjson " \[\"${propname}\", \"${propval}\"\],"
|
||||
}
|
||||
set property [lindex $instance end]
|
||||
set prop1 [lindex $property 1]
|
||||
set propname [lindex $prop1 0]
|
||||
set propval [lindex $prop1 1]
|
||||
puts $fjson " \[\"${propname}\", \"${propval}\"\]"
|
||||
puts $fjson " \]"
|
||||
puts $fjson " \]"
|
||||
if {$pidx == $plen} {
|
||||
puts $fjson " \]"
|
||||
} else {
|
||||
puts $fjson " \],"
|
||||
}
|
||||
}
|
||||
if {$kidx == $nkeys} {
|
||||
puts $fjson " \]"
|
||||
} else {
|
||||
puts $fjson " \],"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if {$cidx == $clen} {
|
||||
puts $fjson " \}"
|
||||
} else {
|
||||
puts $fjson " \},"
|
||||
}
|
||||
}
|
||||
puts $fjson "\]"
|
||||
}
|
||||
close $fjson
|
||||
}
|
||||
|
||||
#----------------------------------------------------------------
|
||||
# Define the "lvs" command as a way of calling the netgen options
|
||||
@@ -30,9 +361,28 @@ load TCL_DIR/tclnetgenSHDLIB_EXT
|
||||
# Use the "canonical" command to parse the file and cell names,
|
||||
# although if the cells have not been read in yet, then the
|
||||
# original syntax of filename or {filename cellname} is required.
|
||||
#
|
||||
# "args" is passed to verify and may therefore contain only the
|
||||
# value "-list" or nothing. If "-list", then output is returned
|
||||
# as a nested list.
|
||||
#----------------------------------------------------------------
|
||||
|
||||
proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out}} {
|
||||
proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
|
||||
set dolist 0
|
||||
set dojson 0
|
||||
puts stdout "Diagnostic version"
|
||||
foreach arg $args {
|
||||
if {$arg == "-list"} {
|
||||
puts stdout "Generating list result"
|
||||
set dolist 1
|
||||
set lvs_final {}
|
||||
} elseif {$arg == "-json"} {
|
||||
puts stdout "Generating JSON file result"
|
||||
set dolist 1
|
||||
set dojson 1
|
||||
set lvs_final {}
|
||||
}
|
||||
}
|
||||
|
||||
# Allow name1 or name2 to be a list of {filename cellname},
|
||||
# A single <filename>, or any valid_cellname form if the
|
||||
@@ -126,31 +476,47 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out}} {
|
||||
}
|
||||
} else {
|
||||
netgen::permute default ;# transistors and resistors
|
||||
netgen::combine default ;# standard parallel/serial allowances
|
||||
netgen::property default
|
||||
}
|
||||
|
||||
puts stdout "Comparison output logged to file $logfile"
|
||||
netgen::log file $logfile
|
||||
netgen::log start
|
||||
netgen::log echo off
|
||||
set endval [netgen::compare hierarchical "$fnum1 $cell1" "$fnum2 $cell2"]
|
||||
if {$dolist == 1} {
|
||||
set endval [netgen::compare -list hierarchical "$fnum1 $cell1" "$fnum2 $cell2"]
|
||||
} else {
|
||||
set endval [netgen::compare hierarchical "$fnum1 $cell1" "$fnum2 $cell2"]
|
||||
}
|
||||
if {$endval == {}} {
|
||||
netgen::log put "No cells in queue!\n"
|
||||
return
|
||||
}
|
||||
set properr {}
|
||||
while {$endval != {}} {
|
||||
netgen::run converge
|
||||
if {$dolist == 1} {
|
||||
netgen::run -list converge
|
||||
} else {
|
||||
netgen::run converge
|
||||
}
|
||||
netgen::log echo on
|
||||
if {[verify equivalent]} {
|
||||
# Resolve automorphisms by pin and property
|
||||
netgen::run resolve
|
||||
if {$dolist == 1} {
|
||||
netgen::run -list resolve
|
||||
} else {
|
||||
netgen::run resolve
|
||||
}
|
||||
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"
|
||||
netgen::verify nodes
|
||||
if {$dolist == 1} {
|
||||
verify -list nodes
|
||||
} else {
|
||||
verify nodes
|
||||
}
|
||||
|
||||
# Flatten the non-matching subcircuit (but not the top-level cells)
|
||||
if {[netgen::print queue] != {}} {
|
||||
@@ -179,17 +545,28 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out}} {
|
||||
}
|
||||
}
|
||||
netgen::log echo off
|
||||
set endval [netgen::compare hierarchical]
|
||||
if {$dolist == 1} {
|
||||
catch {lappend lvs_final $lvs_out}
|
||||
set lvs_out {}
|
||||
set endval [netgen::compare -list hierarchical]
|
||||
} else {
|
||||
set endval [netgen::compare hierarchical]
|
||||
}
|
||||
}
|
||||
netgen::log echo off
|
||||
puts stdout "Result: " nonewline
|
||||
netgen::log echo on
|
||||
netgen::verify only
|
||||
verify only
|
||||
if {$properr != {}} {
|
||||
netgen::log put "The following cells had property errors: $properr\n"
|
||||
}
|
||||
netgen::log end
|
||||
puts stdout "LVS Done."
|
||||
if {$dojson == 1} {
|
||||
netgen::convert_to_json $logfile $lvs_final
|
||||
} elseif {$dolist == 1} {
|
||||
return $lvs_final
|
||||
}
|
||||
}
|
||||
|
||||
# It is important to make sure no netgen commands overlap with Tcl built-in
|
||||
|
||||
+329
-220
@@ -91,7 +91,6 @@ int _netcmp_automorphs(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_equate(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_ignore(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_permute(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_combine(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_property(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_exhaustive(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
int _netcmp_restart(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[]);
|
||||
@@ -231,14 +230,8 @@ Command netcmp_cmds[] = {
|
||||
"capacitor: enable capacitor permutations\n "
|
||||
"transistor: enable transistor permutations\n "
|
||||
"(none): enable transistor and resistor permutations"},
|
||||
{"combine", _netcmp_combine,
|
||||
"[transistors|resistors|capacitors|<model>]\n "
|
||||
"<model> [<serial>|<parallel>]: enable combinations of device model\n "
|
||||
"resistor: enable resistor serial/parallel combinations\n "
|
||||
"capacitor: enable capacitor parallel combinations\n "
|
||||
"transistor: enable transistor parallel combinations\n "
|
||||
"(none): enable standard combinations"},
|
||||
{"property", _netcmp_property,
|
||||
"default: apply property defaults\n "
|
||||
"<device>|<model> <property_key> [...]\n "
|
||||
"<device>: name of a device type (capacitor, etc.)\n "
|
||||
"<model>: name of a device model\n "
|
||||
@@ -504,7 +497,9 @@ CommonParseCell(Tcl_Interp *interp, Tcl_Obj *objv,
|
||||
fnum = -1;
|
||||
}
|
||||
else
|
||||
filename = Tcl_GetString(fobj);
|
||||
/* Both file numbers have been provided, so a */
|
||||
/* filename is not required. */
|
||||
filename = NULL;
|
||||
}
|
||||
else {
|
||||
filename = NULL;
|
||||
@@ -1944,13 +1939,24 @@ int
|
||||
_netcmp_compare(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *name1, *name2, *file1, *file2;
|
||||
int fnum1, fnum2;
|
||||
char *name1, *name2, *file1, *file2, *optstart;
|
||||
int fnum1, fnum2, dolist = 0;
|
||||
int dohierarchy = FALSE;
|
||||
int assignonly = FALSE;
|
||||
int argstart = 1, qresult, llen, result;
|
||||
struct Correspond *nextcomp;
|
||||
struct nlist *tp;
|
||||
Tcl_Obj *flist = NULL;
|
||||
|
||||
if (objc > 1) {
|
||||
optstart = Tcl_GetString(objv[1]);
|
||||
if (*optstart == '-') optstart++;
|
||||
if (!strcmp(optstart, "list")) {
|
||||
dolist = 1;
|
||||
objv++;
|
||||
objc--;
|
||||
}
|
||||
}
|
||||
|
||||
if (objc > 1) {
|
||||
if (!strncmp(Tcl_GetString(objv[argstart]), "assign", 6)) {
|
||||
@@ -2029,10 +2035,6 @@ _netcmp_compare(ClientData clientData,
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
// 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
|
||||
|
||||
@@ -2042,22 +2044,15 @@ _netcmp_compare(ClientData clientData,
|
||||
ConvertGlobals(name2, fnum2);
|
||||
}
|
||||
|
||||
// Run cleanup a 2nd time; this corrects for cells that have no ports
|
||||
// but define global nodes that are brought out as ports by
|
||||
// ConvertGlobals().
|
||||
|
||||
// WIP!
|
||||
// CleanupPins(name1, fnum1);
|
||||
// CleanupPins(name2, fnum2);
|
||||
|
||||
CreateTwoLists(name1, fnum1, name2, fnum2);
|
||||
CreateTwoLists(name1, fnum1, name2, fnum2, dolist);
|
||||
while (PrematchLists(name1, fnum1, name2, fnum2) > 0) {
|
||||
Fprintf(stdout, "Making another compare attempt.\n");
|
||||
CreateTwoLists(name1, fnum1, name2, fnum2);
|
||||
CreateTwoLists(name1, fnum1, name2, fnum2, dolist);
|
||||
}
|
||||
|
||||
// Return the names of the two cells being compared, if doing "compare
|
||||
// hierarchical"
|
||||
// hierarchical". If "-list" was specified, then append the output
|
||||
// to the end of the list.
|
||||
|
||||
if (dohierarchy) {
|
||||
Tcl_Obj *lobj;
|
||||
@@ -2255,6 +2250,19 @@ _netcmp_run(ClientData clientData,
|
||||
};
|
||||
int result, index;
|
||||
int automorphisms;
|
||||
char *optstart;
|
||||
int dolist;
|
||||
|
||||
dolist = 0;
|
||||
if (objc > 1) {
|
||||
optstart = Tcl_GetString(objv[1]);
|
||||
if (*optstart == '-') optstart++;
|
||||
if (!strcmp(optstart, "list")) {
|
||||
dolist = 1;
|
||||
objv++;
|
||||
objc--;
|
||||
}
|
||||
}
|
||||
|
||||
if (objc == 1)
|
||||
index = RESOLVE_IDX;
|
||||
@@ -2273,8 +2281,13 @@ _netcmp_run(ClientData clientData,
|
||||
else {
|
||||
enable_interrupt();
|
||||
while (!Iterate() && !InterruptPending);
|
||||
_netcmp_verify(clientData, interp, 1, NULL);
|
||||
if (dolist) {
|
||||
result = _netcmp_verify(clientData, interp, 2, objv - 1);
|
||||
}
|
||||
else
|
||||
result = _netcmp_verify(clientData, interp, 1, NULL);
|
||||
disable_interrupt();
|
||||
if (result != TCL_OK) return result;
|
||||
}
|
||||
break;
|
||||
case RESOLVE_IDX:
|
||||
@@ -2317,7 +2330,7 @@ _netcmp_run(ClientData clientData,
|
||||
}
|
||||
if (PropertyErrorDetected) {
|
||||
Fprintf(stdout, "There were property errors.\n");
|
||||
PrintPropertyResults();
|
||||
PrintPropertyResults(dolist);
|
||||
}
|
||||
disable_interrupt();
|
||||
}
|
||||
@@ -2331,9 +2344,17 @@ _netcmp_run(ClientData clientData,
|
||||
/* Syntax: netgen::verify [option] */
|
||||
/* options: nodes, elements, only, all, */
|
||||
/* equivalent, or unique. */
|
||||
/* option "-list" may be used with nodes, elements */
|
||||
/* all, or no option. */
|
||||
/* Formerly: v */
|
||||
/* Results: */
|
||||
/* For only, equivalent, unique: Return 1 if */
|
||||
/* verified, zero if not. */
|
||||
/* Side Effects: */
|
||||
/* For options elements, nodes, and all without */
|
||||
/* option -list: Write output to log file. */
|
||||
/* For -list options, append list to global */
|
||||
/* variable "lvs_out", if it exists. */
|
||||
/*------------------------------------------------------*/
|
||||
|
||||
int
|
||||
@@ -2346,8 +2367,23 @@ _netcmp_verify(ClientData clientData,
|
||||
enum OptionIdx {
|
||||
NODE_IDX, ELEM_IDX, PROP_IDX, ONLY_IDX, ALL_IDX, EQUIV_IDX, UNIQUE_IDX
|
||||
};
|
||||
char *optstart;
|
||||
int result, index = -1;
|
||||
int automorphisms;
|
||||
int dolist = 0;
|
||||
Tcl_Obj *egood, *ebad, *ngood, *nbad;
|
||||
|
||||
if (objc > 1) {
|
||||
optstart = Tcl_GetString(objv[1]);
|
||||
if (*optstart == '-') optstart++;
|
||||
if (!strcmp(optstart, "list")) {
|
||||
dolist = 1;
|
||||
egood = ngood = NULL;
|
||||
ebad = nbad = NULL;
|
||||
objv++;
|
||||
objc--;
|
||||
}
|
||||
}
|
||||
|
||||
if (objc != 1 && objc != 2) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv,
|
||||
@@ -2378,14 +2414,28 @@ _netcmp_verify(ClientData clientData,
|
||||
if (objc == 1 || index == NODE_IDX || index == ALL_IDX) {
|
||||
if (Debug == TRUE)
|
||||
PrintIllegalNodeClasses(); // Old style
|
||||
else
|
||||
FormatIllegalNodeClasses(); // Side-by-side
|
||||
else {
|
||||
FormatIllegalNodeClasses(); // Side-by-side, to log file
|
||||
if (dolist) {
|
||||
nbad = ListNodeClasses(FALSE); // As Tcl nested list
|
||||
#if 0
|
||||
ngood = ListNodeClasses(TRUE); // As Tcl nested list
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
if (objc == 1 || index == ELEM_IDX || index == ALL_IDX) {
|
||||
if (Debug == TRUE)
|
||||
PrintIllegalElementClasses(); // Old style
|
||||
else
|
||||
FormatIllegalElementClasses(); // Side-by-side
|
||||
else {
|
||||
FormatIllegalElementClasses(); // Side-by-side, to log file
|
||||
if (dolist) {
|
||||
ebad = ListElementClasses(FALSE); // As Tcl nested list
|
||||
#if 0
|
||||
egood = ListElementClasses(TRUE); // As Tcl nested list
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
disable_interrupt();
|
||||
if (index == EQUIV_IDX || index == UNIQUE_IDX)
|
||||
@@ -2416,9 +2466,57 @@ _netcmp_verify(ClientData clientData,
|
||||
Fprintf(stdout, "Property errors were found.\n");
|
||||
}
|
||||
}
|
||||
if ((index == PROP_IDX) && (PropertyErrorDetected != 0)) {
|
||||
PrintPropertyResults();
|
||||
#if 0
|
||||
if (dolist) {
|
||||
ngood = ListNodeClasses(TRUE); // As Tcl nested list
|
||||
egood = ListElementClasses(TRUE); // As Tcl nested list
|
||||
}
|
||||
#endif
|
||||
if ((index == PROP_IDX) && (PropertyErrorDetected != 0)) {
|
||||
PrintPropertyResults(dolist);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* If "dolist" has been specified, then return the */
|
||||
/* list-formatted output. For "verify nodes" or */
|
||||
/* "verify elements", return the associated list. */
|
||||
/* For "verify" or "verify all", return a nested */
|
||||
/* list of {node list, element list}. */
|
||||
|
||||
if (dolist)
|
||||
{
|
||||
if (objc == 1 || index == NODE_IDX || index == ALL_IDX) {
|
||||
if (nbad == NULL) nbad = Tcl_NewListObj(0, NULL);
|
||||
Tcl_SetVar2Ex(interp, "lvs_out", NULL,
|
||||
Tcl_NewStringObj("badnets", -1),
|
||||
TCL_APPEND_VALUE | TCL_LIST_ELEMENT);
|
||||
Tcl_SetVar2Ex(interp, "lvs_out", NULL, nbad,
|
||||
TCL_APPEND_VALUE | TCL_LIST_ELEMENT);
|
||||
#if 0
|
||||
if (ngood == NULL) ngood = Tcl_NewListObj(0, NULL);
|
||||
Tcl_SetVar2Ex(interp, "lvs_out", NULL,
|
||||
Tcl_NewStringObj("goodnets", -1),
|
||||
TCL_APPEND_VALUE | TCL_LIST_ELEMENT);
|
||||
Tcl_SetVar2Ex(interp, "lvs_out", NULL, ngood,
|
||||
TCL_APPEND_VALUE | TCL_LIST_ELEMENT);
|
||||
#endif
|
||||
}
|
||||
if (objc == 1 || index == ELEM_IDX || index == ALL_IDX) {
|
||||
if (ebad == NULL) ebad = Tcl_NewListObj(0, NULL);
|
||||
Tcl_SetVar2Ex(interp, "lvs_out", NULL,
|
||||
Tcl_NewStringObj("badelements", -1),
|
||||
TCL_APPEND_VALUE | TCL_LIST_ELEMENT);
|
||||
Tcl_SetVar2Ex(interp, "lvs_out", NULL, ebad,
|
||||
TCL_APPEND_VALUE | TCL_LIST_ELEMENT);
|
||||
#if 0
|
||||
if (egood == NULL) egood = Tcl_NewListObj(0, NULL);
|
||||
Tcl_SetVar2Ex(interp, "lvs_out", NULL,
|
||||
Tcl_NewStringObj("goodelements", -1),
|
||||
TCL_APPEND_VALUE | TCL_LIST_ELEMENT);
|
||||
Tcl_SetVar2Ex(interp, "lvs_out", NULL, egood,
|
||||
TCL_APPEND_VALUE | TCL_LIST_ELEMENT);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
return TCL_OK;
|
||||
@@ -2525,10 +2623,10 @@ _netcmp_ignore(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *options[] = {
|
||||
"class", NULL
|
||||
"class", "shorted", NULL
|
||||
};
|
||||
enum OptionIdx {
|
||||
CLASS_IDX
|
||||
CLASS_IDX, SHORTED_IDX
|
||||
};
|
||||
int result, index;
|
||||
int file = -1;
|
||||
@@ -2549,7 +2647,14 @@ _netcmp_ignore(ClientData clientData,
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "[class] valid_cellname");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
IgnoreClass(name, file);
|
||||
switch (index) {
|
||||
case CLASS_IDX:
|
||||
IgnoreClass(name, file, IGNORE_CLASS);
|
||||
break;
|
||||
case SHORTED_IDX:
|
||||
IgnoreClass(name, file, IGNORE_SHORTED);
|
||||
break;
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -2572,13 +2677,23 @@ _netcmp_equate(ClientData clientData,
|
||||
NODE_IDX, ELEM_IDX, CLASS_IDX, PINS_IDX
|
||||
};
|
||||
int result, index;
|
||||
char *name1 = NULL, *name2 = NULL;
|
||||
char *name1 = NULL, *name2 = NULL, *optstart;
|
||||
struct nlist *tp1, *tp2;
|
||||
struct objlist *ob1, *ob2;
|
||||
int file1, file2;
|
||||
int i, l1, l2, ltest, lent;
|
||||
int i, l1, l2, ltest, lent, dolist;
|
||||
Tcl_Obj *tobj1, *tobj2, *tobj3;
|
||||
|
||||
if (objc > 1) {
|
||||
optstart = Tcl_GetString(objv[1]);
|
||||
if (*optstart == '-') optstart++;
|
||||
if (!strcmp(optstart, "list")) {
|
||||
dolist = 1;
|
||||
objv++;
|
||||
objc--;
|
||||
}
|
||||
}
|
||||
|
||||
if ((objc != 2) && (objc != 4) && (objc != 6)) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "?nodes|elements|classes|pins? name1 name2");
|
||||
return TCL_ERROR;
|
||||
@@ -2743,7 +2858,8 @@ _netcmp_equate(ClientData clientData,
|
||||
return TCL_OK;
|
||||
}
|
||||
if (tp1 == Circuit1 && tp2 == Circuit2) {
|
||||
if (MatchPins(tp1, tp2)) {
|
||||
int result;
|
||||
if (MatchPins(tp1, tp2, dolist)) {
|
||||
Fprintf(stdout, "Cell pin lists are equivalent.\n");
|
||||
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(1));
|
||||
}
|
||||
@@ -2754,7 +2870,7 @@ _netcmp_equate(ClientData clientData,
|
||||
}
|
||||
}
|
||||
else {
|
||||
Fprintf(stderr, "Function not yet defined outside of LVS scope.\n");
|
||||
Fprintf(stderr, "Function not defined outside of LVS scope.\n");
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -2970,6 +3086,16 @@ _netcmp_equate(ClientData clientData,
|
||||
/* add --- add new property */
|
||||
/* remove --- delete existing property */
|
||||
/* tolerance --- set property tolerance */
|
||||
/* merge --- set property merge behavior */
|
||||
/* or */
|
||||
/* netgen::property default */
|
||||
/* or */
|
||||
/* netgen::property <device>|<model> <option> */
|
||||
/* yes|no */
|
||||
/* Where <option> is one of: */
|
||||
/* serial --- allow/prohibit serial combination */
|
||||
/* parallel --- allow/prohibit parallel combination */
|
||||
/* */
|
||||
/* Formerly: (none) */
|
||||
/* Results: */
|
||||
/* Side Effects: */
|
||||
@@ -2987,10 +3113,12 @@ _netcmp_property(ClientData clientData,
|
||||
int ival, argstart;
|
||||
|
||||
char *options[] = {
|
||||
"add", "create", "remove", "delete", "tolerance", NULL
|
||||
"add", "create", "remove", "delete", "tolerance", "merge", "serial",
|
||||
"parallel", 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,
|
||||
SERIAL_IDX, PARALLEL_IDX
|
||||
};
|
||||
int result, index, idx2;
|
||||
|
||||
@@ -3001,10 +3129,66 @@ _netcmp_property(ClientData clientData,
|
||||
INTEGER_IDX, DOUBLE_IDX, VALUE_IDX, STRING_IDX
|
||||
};
|
||||
|
||||
char *mergeoptions[] = {
|
||||
"none", "add", "add_critical", "par", "par_critical",
|
||||
"parallel", "parallel_critical", "ser_critical", "ser",
|
||||
"serial_critical", "serial", NULL
|
||||
};
|
||||
enum MergeOptionIdx {
|
||||
NONE_IDX, ADD_ONLY_IDX, ADD_CRIT_IDX,
|
||||
PAR_ONLY_IDX, PAR_CRIT_IDX, PAR2_ONLY_IDX, PAR2_CRIT_IDX,
|
||||
SER_CRIT_IDX, SER_IDX, SER2_CRIT_IDX, SER2_IDX
|
||||
};
|
||||
char *yesno[] = {
|
||||
"on", "yes", "true", "enable", "allow",
|
||||
"off", "no", "false", "disable", "prohibit", NULL
|
||||
};
|
||||
|
||||
if (objc < 2) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "valid_cellname ?option?");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
/* Check for special command "property default" */
|
||||
if ((objc == 2) && (!strcmp(Tcl_GetString(objv[1]), "default"))) {
|
||||
|
||||
/* For each FET device, do "merge {w add_critical}" and */
|
||||
/* "remove as ad ps pd". This allows parallel devices */
|
||||
/* to be added by width, and prevents attempts to */
|
||||
/* compare source/drain area and perimeter. */
|
||||
|
||||
tp = FirstCell();
|
||||
while (tp != NULL) {
|
||||
switch (tp->class) {
|
||||
case CLASS_NMOS: case CLASS_PMOS: case CLASS_FET3:
|
||||
case CLASS_NMOS4: case CLASS_PMOS4: case CLASS_FET4:
|
||||
case CLASS_FET:
|
||||
PropertyMerge(tp->name, tp->file, "w", MERGE_ADD_CRIT);
|
||||
PropertyDelete(tp->name, tp->file, "as");
|
||||
PropertyDelete(tp->name, tp->file, "ad");
|
||||
PropertyDelete(tp->name, tp->file, "ps");
|
||||
PropertyDelete(tp->name, tp->file, "pd");
|
||||
break;
|
||||
case CLASS_RES: case CLASS_RES3:
|
||||
PropertyMerge(tp->name, tp->file, "w", MERGE_ADD_CRIT);
|
||||
PropertyMerge(tp->name, tp->file, "l", MERGE_SER_CRIT);
|
||||
tp->flags |= COMB_SERIAL;
|
||||
break;
|
||||
case CLASS_CAP: case CLASS_ECAP: case CLASS_CAP3:
|
||||
// NOTE: No attempt to combine area, width, or length;
|
||||
// only value.
|
||||
PropertyMerge(tp->name, tp->file, "value", MERGE_ADD_CRIT);
|
||||
break;
|
||||
case CLASS_INDUCTOR:
|
||||
PropertyMerge(tp->name, tp->file, "value", MERGE_PAR_CRIT);
|
||||
tp->flags |= COMB_SERIAL;
|
||||
break;
|
||||
}
|
||||
tp = NextCell();
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
result = CommonParseCell(interp, objv[1], &tp, &fnum);
|
||||
if (result != TCL_OK) return result;
|
||||
|
||||
@@ -3012,7 +3196,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);
|
||||
|
||||
@@ -3039,7 +3223,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);
|
||||
}
|
||||
@@ -3053,6 +3237,45 @@ _netcmp_property(ClientData clientData,
|
||||
argstart = 3;
|
||||
|
||||
switch (index) {
|
||||
case SERIAL_IDX:
|
||||
case PARALLEL_IDX:
|
||||
if (objc == 3) {
|
||||
if (index == SERIAL_IDX) {
|
||||
tobj1 = Tcl_NewBooleanObj((tp->flags & COMB_SERIAL) ? 1 : 0);
|
||||
Tcl_SetObjResult(interp, tobj1);
|
||||
return TCL_OK;
|
||||
}
|
||||
else {
|
||||
tobj1 = Tcl_NewBooleanObj((tp->flags & COMB_NO_PARALLEL) ? 0 : 1);
|
||||
Tcl_SetObjResult(interp, tobj1);
|
||||
return TCL_OK;
|
||||
}
|
||||
}
|
||||
else if (objc == 4) {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[3],
|
||||
(CONST84 char **)yesno,
|
||||
"combine", 0, &idx2) != TCL_OK) {
|
||||
Tcl_WrongNumArgs(interp, 3, objv, "enable|disable");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (idx2 <= 4) { /* true, enable, etc. */
|
||||
if (index == SERIAL_IDX)
|
||||
tp->flags |= COMB_SERIAL;
|
||||
else
|
||||
tp->flags &= ~COMB_NO_PARALLEL;
|
||||
}
|
||||
else { /* false, disable, etc. */
|
||||
if (index == SERIAL_IDX)
|
||||
tp->flags &= ~COMB_SERIAL;
|
||||
else
|
||||
tp->flags |= COMB_NO_PARALLEL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
Tcl_WrongNumArgs(interp, 2, objv, "serial|parallel enable|disable");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
break;
|
||||
|
||||
case ADD_IDX:
|
||||
case CREATE_IDX:
|
||||
@@ -3175,11 +3398,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++)
|
||||
@@ -3221,180 +3442,68 @@ _netcmp_property(ClientData clientData,
|
||||
}
|
||||
}
|
||||
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:
|
||||
case PAR2_ONLY_IDX:
|
||||
mergeval = MERGE_PAR;
|
||||
break;
|
||||
case PAR_CRIT_IDX:
|
||||
case PAR2_CRIT_IDX:
|
||||
mergeval = MERGE_PAR_CRIT;
|
||||
break;
|
||||
case SER_CRIT_IDX:
|
||||
case SER2_CRIT_IDX:
|
||||
mergeval = MERGE_SER_CRIT;
|
||||
break;
|
||||
case SER_IDX:
|
||||
case SER2_IDX:
|
||||
mergeval = MERGE_SER;
|
||||
break;
|
||||
}
|
||||
PropertyMerge(tp->name, fnum, Tcl_GetString(tobj1), mergeval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------*/
|
||||
/* Function name: _netcmp_combine */
|
||||
/* Syntax: netgen::combine [default] */
|
||||
/* netgen::combine combine_class */
|
||||
/* netgen::combine valid_cellname serial|parallel */
|
||||
/* netgen::combine forget valid_cellname */
|
||||
/* netgen::combine forget */
|
||||
/* Formerly: t */
|
||||
/* Results: */
|
||||
/* Side Effects: */
|
||||
/*--------------------------------------------------------------*/
|
||||
|
||||
int
|
||||
_netcmp_combine(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
|
||||
{
|
||||
char *model;
|
||||
char *combineclass[] = {
|
||||
"transistors", "resistors", "capacitors", "default", "forget",
|
||||
"cell", NULL
|
||||
};
|
||||
enum OptionIdx {
|
||||
TRANS_IDX, RES_IDX, CAP_IDX, DEFLT_IDX, FORGET_IDX, CELL_IDX
|
||||
};
|
||||
int result, index, index2, fnum = -1;
|
||||
struct nlist *tp = NULL;
|
||||
|
||||
char *combinetype[] = {
|
||||
"serial", "parallel", NULL
|
||||
};
|
||||
enum SubOptionIdx {
|
||||
SERIAL_IDX, PARALLEL_IDX
|
||||
};
|
||||
|
||||
if (objc > 3) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "?valid_cellname serial|parallel?");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (objc == 1) {
|
||||
index = DEFLT_IDX;
|
||||
}
|
||||
else {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], (CONST84 char **)combineclass,
|
||||
"combine class", 0, &index) != TCL_OK) {
|
||||
if (objc != 3) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "?valid_cellname serial|parallel?");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
result = CommonParseCell(interp, objv[1], &tp, &fnum);
|
||||
if (result != TCL_OK) {
|
||||
Fprintf(stdout, "No such device \"%s\".\n",
|
||||
Tcl_GetString(objv[1]));
|
||||
return result;
|
||||
}
|
||||
index = CELL_IDX;
|
||||
if (Tcl_GetIndexFromObj(interp, objv[2],
|
||||
(CONST84 char **)combinetype,
|
||||
"combine type", 0, &index2) != TCL_OK) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv,
|
||||
"?valid_cellname serial|parallel?");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
}
|
||||
else if (index == CELL_IDX) {
|
||||
if (objc != 4) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "cell ?valid_cellname serial|parallel?");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
result = CommonParseCell(interp, objv[2], &tp, &fnum);
|
||||
if (result != TCL_OK) {
|
||||
Fprintf(stdout, "No such device \"%s\".\n",
|
||||
Tcl_GetString(objv[2]));
|
||||
return result;
|
||||
}
|
||||
if (Tcl_GetIndexFromObj(interp, objv[3],
|
||||
(CONST84 char **)combinetype,
|
||||
"combine type", 0, &index2) != TCL_OK) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv,
|
||||
"?valid_cellname serial|parallel?");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
}
|
||||
else if (index == FORGET_IDX) {
|
||||
if (objc < 3) {
|
||||
/* General purpose combine forget */
|
||||
tp = FirstCell();
|
||||
while (tp != NULL) {
|
||||
CombineForget(tp->name, tp->file, NULL);
|
||||
tp = NextCell();
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
else {
|
||||
/* Specific combine forget */
|
||||
result = CommonParseCell(interp, objv[2], &tp, &fnum);
|
||||
if (result != TCL_OK) {
|
||||
Fprintf(stdout, "No such device \"%s\".\n",
|
||||
Tcl_GetString(objv[2]));
|
||||
return result;
|
||||
}
|
||||
if (objc != 4) {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[3],
|
||||
(CONST84 char **)combinetype,
|
||||
"combine type", 0, &index2) != TCL_OK) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv,
|
||||
"?valid_cellname serial|parallel?");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (CombineForget(tp->name, fnum, (index2 == SERIAL_IDX)
|
||||
? COMB_SERIAL : COMB_PARALLEL))
|
||||
Fprintf(stdout, "Model %s combine %s\n", tp->name,
|
||||
(index2 == SERIAL_IDX) ? "serial" : "parallel");
|
||||
else
|
||||
Fprintf(stderr, "Unable to reset model %s %s combination.\n",
|
||||
tp->name, (index2 == SERIAL_IDX) ? "serial" : "parallel");
|
||||
}
|
||||
else {
|
||||
if (CombineForget(tp->name, fnum, NULL))
|
||||
Fprintf(stdout, "No combinations of circuit %s allowed\n", tp->name);
|
||||
else
|
||||
Fprintf(stderr, "Unable to reset model %s %s combinations\n",
|
||||
tp->name, (index2 == SERIAL_IDX) ? "serial" : "parallel");
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (objc == 1 || objc == 2) {
|
||||
tp = FirstCell();
|
||||
while (tp != NULL) {
|
||||
switch (tp->class) {
|
||||
case CLASS_NMOS: case CLASS_PMOS: case CLASS_FET3:
|
||||
case CLASS_NMOS4: case CLASS_PMOS4: case CLASS_FET4:
|
||||
case CLASS_FET:
|
||||
if (index == TRANS_IDX || index == DEFLT_IDX)
|
||||
CombineSetup(tp->name, tp->file, COMB_PARALLEL);
|
||||
break;
|
||||
case CLASS_RES: case CLASS_RES3:
|
||||
if (index == RES_IDX || index == DEFLT_IDX) {
|
||||
CombineSetup(tp->name, tp->file, COMB_SERIAL);
|
||||
CombineSetup(tp->name, tp->file, COMB_PARALLEL);
|
||||
}
|
||||
break;
|
||||
case CLASS_CAP: case CLASS_ECAP: case CLASS_CAP3:
|
||||
if (index == CAP_IDX)
|
||||
CombineSetup(tp->name, tp->file, COMB_PARALLEL);
|
||||
break;
|
||||
}
|
||||
tp = NextCell();
|
||||
}
|
||||
}
|
||||
else if (index == CELL_IDX) {
|
||||
if (CombineSetup(tp->name, fnum, ((index2 == SERIAL_IDX) ?
|
||||
COMB_SERIAL : COMB_PARALLEL)))
|
||||
Fprintf(stdout, "Model %s allow %s combinations\n", tp->name,
|
||||
(index2 == SERIAL_IDX) ? "serial" : "parallel");
|
||||
else
|
||||
Fprintf(stderr, "Unable to set model %s %s combinations.\n",
|
||||
tp->name, (index2 == SERIAL_IDX) ?
|
||||
"serial" : "parallel");
|
||||
}
|
||||
else {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "?valid_cellname serial|parallel?");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------*/
|
||||
/* Function name: _netcmp_permute */
|
||||
/* Syntax: netgen::permute [default] */
|
||||
@@ -3869,7 +3978,7 @@ int Tclnetgen_Init(Tcl_Interp *interp)
|
||||
/* Remember the interpreter */
|
||||
netgeninterp = interp;
|
||||
|
||||
if (Tcl_InitStubs(interp, "8.1", 0) == NULL) return TCL_ERROR;
|
||||
if (Tcl_InitStubs(interp, "8.5", 0) == NULL) return TCL_ERROR;
|
||||
|
||||
for (n = 0; netgen_cmds[n].name != NULL; n++) {
|
||||
sprintf(keyword, "netgen::%s", netgen_cmds[n].name);
|
||||
|
||||
Reference in New Issue
Block a user