mirror of
https://github.com/RTimothyEdwards/netgen.git
synced 2026-08-22 22:17:22 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
@@ -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;
|
||||
|
||||
+2
-2
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
-394
@@ -1298,230 +1298,6 @@ typedef struct ecomplist {
|
||||
ECompListPtr next;
|
||||
} ECompList;
|
||||
|
||||
/*------------------------------------------------------*/
|
||||
/* Split a device into multiple devices based on a */
|
||||
/* critical property; e.g., MOSFET width. Devices with */
|
||||
/* property name equal to kl->key and value "value" */
|
||||
/* will be split into "ndev" devices with the property */
|
||||
/* of each divided down by "ndev". */
|
||||
/*------------------------------------------------------*/
|
||||
|
||||
void
|
||||
SplitDevice(struct nlist *tc, struct nlist *cell, struct property *kl,
|
||||
double value, int ndev, int file1, int file2, int which)
|
||||
{
|
||||
struct objlist *ob, *ob2, *newdevs, *ob3, *lastob, *nob;
|
||||
struct nlist *tsub;
|
||||
unsigned char found;
|
||||
int file = (which == 0) ? file1 : file2;
|
||||
|
||||
newdevs = NULL; /* Linked list of the copied devices */
|
||||
|
||||
for (ob = tc->cell; ob; ob = ob->next) {
|
||||
if (ob->type == FIRSTPIN) {
|
||||
tsub = LookupCellFile(ob->model.class, file);
|
||||
if (tsub == cell) {
|
||||
|
||||
// Advance ob to property list
|
||||
found = 0;
|
||||
for (ob2 = ob->next; ob2 && ob2->type != FIRSTPIN; ob2 = ob2->next) {
|
||||
if (ob2->type == PROPERTY) {
|
||||
struct valuelist *kv;
|
||||
int i;
|
||||
double dval = 0.0;
|
||||
for (i = 0; ; i++) {
|
||||
kv = &(ob2->instance.props[i]);
|
||||
if (kv->type == PROP_ENDLIST) break;
|
||||
if ((*matchfunc)(kv->key, kl->key)) {
|
||||
switch(kv->type) {
|
||||
case PROP_INTEGER:
|
||||
dval = (double)kv->value.ival;
|
||||
break;
|
||||
case PROP_DOUBLE:
|
||||
case PROP_VALUE:
|
||||
dval = kv->value.dval;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* To-do: Account for slop */
|
||||
|
||||
if (dval == value) {
|
||||
switch(kv->type) {
|
||||
case PROP_INTEGER:
|
||||
kv->value.ival /= ndev;
|
||||
found = 1;
|
||||
break;
|
||||
case PROP_DOUBLE:
|
||||
case PROP_VALUE:
|
||||
kv->value.dval /= ndev;
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (found) break;
|
||||
}
|
||||
if (found) {
|
||||
int i;
|
||||
for (i = 1; i < ndev; i++) {
|
||||
ob3 = CopyObjList(ob, 0); // Make exact copy
|
||||
for (nob = ob3; nob->next != NULL; nob = nob->next);
|
||||
nob->next = newdevs;
|
||||
newdevs = ob3;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
lastob = ob;
|
||||
}
|
||||
lastob->next = newdevs; // Append new devices to list
|
||||
}
|
||||
|
||||
/*------------------------------------------------------*/
|
||||
/* Survey a specific device in a cell and sort into a */
|
||||
/* hash by critical property. */
|
||||
/*------------------------------------------------------*/
|
||||
|
||||
void
|
||||
SurveyDevice(struct nlist *tc, struct hashdict *devdict,
|
||||
struct nlist *cell, struct property *kl,
|
||||
int file1, int file2, int which)
|
||||
{
|
||||
struct objlist *ob, *ob2;
|
||||
struct nlist *tsub, *teq;
|
||||
ECompare *dcomp, *ncomp, *qcomp;
|
||||
int file = (which == 0) ? file1 : file2;
|
||||
int ofile = (which == 0) ? file2 : file1;
|
||||
char *p1str, *p2str, *d1str, *d2str;
|
||||
|
||||
for (ob = tc->cell; ob; ob = ob->next) {
|
||||
if (ob->type == FIRSTPIN) {
|
||||
|
||||
tsub = LookupCellFile(ob->model.class, file);
|
||||
if (tsub == cell) {
|
||||
|
||||
p1str = (char *)MALLOC(strlen(ob->model.class) + 20);
|
||||
sprintf(p1str, "%s", ob->model.class);
|
||||
|
||||
if (tsub->flags & CELL_DUPLICATE) {
|
||||
// Always register a duplicate under the original name
|
||||
d1str = strstr(p1str, "[[");
|
||||
if (d1str) *d1str = '\0';
|
||||
}
|
||||
d1str = p1str + strlen(p1str);
|
||||
sprintf(d1str, "::");
|
||||
d1str += 2;
|
||||
|
||||
teq = LookupClassEquivalent(ob->model.class, file, ofile);
|
||||
p2str = (char *)MALLOC(strlen(teq->name) + 20);
|
||||
sprintf(p2str, "%s", teq->name);
|
||||
|
||||
if (teq->flags & CELL_DUPLICATE) {
|
||||
// Always register a duplicate under the original name
|
||||
d2str = strstr(p2str, "[[");
|
||||
if (d2str) *d2str = '\0';
|
||||
}
|
||||
d2str = p2str + strlen(p2str);
|
||||
sprintf(d2str, "::");
|
||||
d2str += 2;
|
||||
|
||||
// Advance ob to property list
|
||||
// To-do: Quantize values according to slop
|
||||
|
||||
for (ob2 = ob->next; ob2 && ob2->type != FIRSTPIN; ob2 = ob2->next) {
|
||||
if (ob2->type == PROPERTY) {
|
||||
struct valuelist *kv;
|
||||
int i;
|
||||
for (i = 0; ; i++) {
|
||||
kv = &(ob2->instance.props[i]);
|
||||
if (kv->type == PROP_ENDLIST) break;
|
||||
if ((*matchfunc)(kv->key, kl->key)) {
|
||||
switch(kv->type) {
|
||||
case PROP_INTEGER:
|
||||
sprintf(d1str, "%d", kv->value.ival);
|
||||
sprintf(d2str, "%d", kv->value.ival);
|
||||
break;
|
||||
case PROP_DOUBLE:
|
||||
case PROP_VALUE:
|
||||
// To-do: Round to tolerance
|
||||
sprintf(d1str, "%g", kv->value.dval);
|
||||
sprintf(d2str, "%g", kv->value.dval);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (*d1str == '\0') {
|
||||
// No critical property instanced, so use default
|
||||
switch(kl->type) {
|
||||
case PROP_INTEGER:
|
||||
sprintf(d1str, "%d", kl->pdefault.ival);
|
||||
sprintf(d2str, "%d", kl->pdefault.ival);
|
||||
break;
|
||||
case PROP_DOUBLE:
|
||||
case PROP_VALUE:
|
||||
// To-do: Round to tolerance
|
||||
sprintf(d1str, "%g", kl->pdefault.dval);
|
||||
sprintf(d2str, "%g", kl->pdefault.dval);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Create hash key from object class and the critical
|
||||
// property affecting the device count.
|
||||
|
||||
dcomp = (ECompare *)HashInt2Lookup(p1str, file, devdict);
|
||||
|
||||
// Fill in the values for this device::property combination
|
||||
|
||||
if (dcomp == NULL) {
|
||||
ncomp = (ECompare *)MALLOC(sizeof(ECompare));
|
||||
if (which == 0) {
|
||||
ncomp->num1 = 1;
|
||||
ncomp->num2 = 0;
|
||||
ncomp->cell1 = tsub;
|
||||
ncomp->cell2 = teq;
|
||||
}
|
||||
else {
|
||||
ncomp->num1 = 0;
|
||||
ncomp->num2 = 1;
|
||||
ncomp->cell2 = tsub;
|
||||
ncomp->cell1 = teq;
|
||||
}
|
||||
ncomp->add1 = 0;
|
||||
ncomp->add2 = 0;
|
||||
ncomp->refcount = (char)1;
|
||||
|
||||
HashInt2PtrInstall(p1str, file, ncomp, devdict);
|
||||
if (teq != NULL) {
|
||||
qcomp = (ECompare *)HashInt2Lookup(p2str, ofile,
|
||||
devdict);
|
||||
if (qcomp == NULL) {
|
||||
HashInt2PtrInstall(p2str, ofile, ncomp, devdict);
|
||||
ncomp->refcount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (which == 0)
|
||||
dcomp->num1++;
|
||||
else
|
||||
dcomp->num2++;
|
||||
}
|
||||
|
||||
FREE(p1str);
|
||||
FREE(p2str);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*------------------------------------------------------*/
|
||||
/* Survey the contents of a cell and sort into a hash */
|
||||
/*------------------------------------------------------*/
|
||||
@@ -1867,176 +1643,6 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
ecomp = (ECompare *)HashNext(&compdict);
|
||||
}
|
||||
|
||||
// Check for cells, either low-level devices or subcircuits,
|
||||
// that have properties allowing devices to be merged. If
|
||||
// the classes of both cells are the same, and the number of
|
||||
// instances is different, and merging the device with more
|
||||
// instances improves the matching, then perform the merge.
|
||||
|
||||
ecomp = (ECompare *)HashFirst(&compdict);
|
||||
while (ecomp != NULL) {
|
||||
|
||||
if ((ecomp->num1 != ecomp->num2) &&
|
||||
(ecomp->cell1 != NULL) &&
|
||||
(ecomp->cell2 != NULL) &&
|
||||
(ecomp->cell1->classhash == ecomp->cell2->classhash)) {
|
||||
|
||||
struct hashdict devdict;
|
||||
ECompare *dcomp;
|
||||
|
||||
// Determine if either device has mergeable properties. If so,
|
||||
// sort the device into bins by critical (mergeable) property,
|
||||
// and merge devices where merging makes a better match.
|
||||
|
||||
struct property *kl1, *kl2;
|
||||
double slop = 0.0;
|
||||
|
||||
// Look for a mergeable property in cell1
|
||||
|
||||
kl1 = (struct property *)HashFirst(&(ecomp->cell1->propdict));
|
||||
while (kl1 != NULL) {
|
||||
if (kl1->merge == MERGE_ADD_CRIT || kl1->merge == MERGE_PAR_CRIT)
|
||||
break;
|
||||
kl1 = (struct property *)HashNext(&(ecomp->cell1->propdict));
|
||||
}
|
||||
|
||||
// Look for the equivalent property in cell2 (mergeable or not).
|
||||
// If cell1 had no mergeable properties, then look for one is cell2.
|
||||
|
||||
kl2 = (struct property *)HashFirst(&(ecomp->cell2->propdict));
|
||||
while (kl2 != NULL) {
|
||||
if (kl1 != NULL) {
|
||||
if ((*matchfunc)(kl1->key, kl2->key))
|
||||
break;
|
||||
}
|
||||
else if (kl2->merge == MERGE_ADD_CRIT || kl2->merge == MERGE_PAR_CRIT)
|
||||
break;
|
||||
kl2 = (struct property *)HashNext(&(ecomp->cell2->propdict));
|
||||
}
|
||||
if (kl2 != NULL) {
|
||||
// Get slop value
|
||||
switch (kl2->type) {
|
||||
case PROP_INTEGER:
|
||||
slop = (double)kl2->slop.ival;
|
||||
break;
|
||||
case PROP_DOUBLE:
|
||||
case PROP_VALUE:
|
||||
slop = kl2->slop.dval;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// If cell2 had a mergeable property but cell1 didn't, then look
|
||||
// through cell1 again to find the equivalent property.
|
||||
|
||||
if ((kl1 == NULL) && (kl2 != NULL)) {
|
||||
kl1 = (struct property *)HashFirst(&(ecomp->cell1->propdict));
|
||||
while (kl1 != NULL) {
|
||||
if ((*matchfunc)(kl1->key, kl2->key))
|
||||
break;
|
||||
kl1 = (struct property *)HashNext(&(ecomp->cell1->propdict));
|
||||
}
|
||||
}
|
||||
if (kl1 != NULL) {
|
||||
// Get slop value
|
||||
switch (kl1->type) {
|
||||
case PROP_INTEGER:
|
||||
slop = MAX(slop, (double)kl1->slop.ival);
|
||||
break;
|
||||
case PROP_DOUBLE:
|
||||
case PROP_VALUE:
|
||||
slop = MAX(slop, kl1->slop.dval);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ((kl1 != NULL) && (kl2 != NULL)) {
|
||||
|
||||
double dval, dval1, dval2, mindev, pd, df, dr;
|
||||
unsigned char dosplit;
|
||||
char *valptr;
|
||||
int ndev;
|
||||
|
||||
// Create the device hash table
|
||||
|
||||
InitializeHashTable(&devdict, OBJHASHSIZE);
|
||||
|
||||
// Populate the device hash table
|
||||
|
||||
SurveyDevice(tc1, &devdict, ecomp->cell1, kl1, file1, file2, 0);
|
||||
SurveyDevice(tc2, &devdict, ecomp->cell2, kl2, file1, file2, 1);
|
||||
|
||||
// Scan the device hash table. If devices can be merged
|
||||
// and this improves the matching between cells, then do
|
||||
// the merge.
|
||||
|
||||
mindev = 1E20;
|
||||
dval1 = dval2 = 0.0;
|
||||
|
||||
dcomp = (ECompare *)HashFirst(&devdict);
|
||||
while (dcomp != NULL) {
|
||||
if ((dcomp->num1 == 0) || (dcomp->num2 == 0)) {
|
||||
valptr = strstr(devdict.hashfirstptr->name, "::");
|
||||
if (sscanf(valptr + 2, "%lg", &dval) == 1) {
|
||||
if (dval < mindev) mindev = dval;
|
||||
if (dcomp->num1 == 0)
|
||||
dval2 += (dval * dcomp->num2) / dcomp->refcount;
|
||||
else
|
||||
dval1 += (dval * dcomp->num1) / dcomp->refcount;
|
||||
}
|
||||
}
|
||||
dcomp = (ECompare *)HashNext(&devdict);
|
||||
}
|
||||
|
||||
// If dval2 and dval1 agree within slop, and both are
|
||||
// divisible by mindev, then break up all devices into
|
||||
// sizes of mindev.
|
||||
|
||||
dosplit = 0;
|
||||
pd = 2 * fabs(dval1 - dval2) / (dval1 + dval2);
|
||||
if (pd < slop) {
|
||||
df = dval1 / mindev;
|
||||
dr = round(df);
|
||||
pd = 2 * fabs(df - dr) / (df + dr);
|
||||
if (pd < slop) dosplit = 1;
|
||||
}
|
||||
|
||||
if (dosplit) {
|
||||
dcomp = (ECompare *)HashFirst(&devdict);
|
||||
while (dcomp != NULL) {
|
||||
if (dcomp->num1 == 0 || dcomp->num2 == 0) {
|
||||
valptr = strstr(devdict.hashfirstptr->name, "::");
|
||||
sscanf(valptr + 2, "%lg", &dval);
|
||||
ndev = (int)round(dval / mindev);
|
||||
}
|
||||
if (dcomp->num1 == 0) {
|
||||
SplitDevice(tc2, ecomp->cell2, kl2, dval, ndev,
|
||||
file1, file2, 1);
|
||||
modified++;
|
||||
}
|
||||
else if (dcomp->num2 == 0) {
|
||||
SplitDevice(tc1, ecomp->cell1, kl1, dval, ndev,
|
||||
file1, file2, 0);
|
||||
modified++;
|
||||
}
|
||||
dcomp = (ECompare *)HashNext(&devdict);
|
||||
}
|
||||
}
|
||||
|
||||
// Free the device hash table
|
||||
|
||||
dcomp = (ECompare *)HashFirst(&devdict);
|
||||
while (dcomp != NULL) {
|
||||
if (--dcomp->refcount == (char)0) FREE(dcomp);
|
||||
dcomp = (ECompare *)HashNext(&devdict);
|
||||
}
|
||||
HashKill(&devdict);
|
||||
}
|
||||
}
|
||||
|
||||
ecomp = (ECompare *)HashNext(&compdict);
|
||||
}
|
||||
|
||||
// Remove non-matching zero-value devices. This can
|
||||
// be done on a per-instance basis.
|
||||
|
||||
|
||||
+1958
-279
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;
|
||||
}
|
||||
}
|
||||
|
||||
+972
-304
File diff suppressed because it is too large
Load Diff
+5
-3
@@ -33,7 +33,7 @@ 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);
|
||||
@@ -100,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);
|
||||
@@ -116,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;
|
||||
}
|
||||
|
||||
+66
-1
@@ -340,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;
|
||||
@@ -360,7 +425,7 @@ int deleteclass(struct hashlist *p, int file)
|
||||
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;
|
||||
|
||||
+14
-5
@@ -104,10 +104,12 @@ struct valuelist {
|
||||
/* Part 3: Keys & Defaults (kept in the cell record as a hash table) */
|
||||
|
||||
#define MERGE_NONE 0 /* Property does not change when devices merge */
|
||||
#define MERGE_ADD 1 /* Properties sum with device merge */
|
||||
#define MERGE_ADD_CRIT 2 /* Properties sum with device merge */
|
||||
#define MERGE_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 */
|
||||
@@ -159,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. */
|
||||
|
||||
@@ -206,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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
+137
-168
@@ -42,6 +42,20 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
// Global storage for parameters from .PARAM
|
||||
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)
|
||||
{
|
||||
struct objlist *ob;
|
||||
@@ -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) {
|
||||
@@ -473,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;
|
||||
@@ -782,7 +795,7 @@ 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);
|
||||
}
|
||||
@@ -821,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 */
|
||||
@@ -831,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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -843,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 */
|
||||
@@ -853,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, NULL, 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') {
|
||||
@@ -896,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 */
|
||||
@@ -906,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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -929,6 +925,7 @@ skip_ends:
|
||||
Port("bulk");
|
||||
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 */
|
||||
@@ -939,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, NULL, 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();
|
||||
}
|
||||
@@ -979,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();
|
||||
}
|
||||
@@ -993,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
|
||||
@@ -1011,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);
|
||||
}
|
||||
@@ -1026,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 */
|
||||
@@ -1039,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, NULL, 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);
|
||||
}
|
||||
}
|
||||
@@ -1082,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();
|
||||
}
|
||||
@@ -1096,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
|
||||
@@ -1113,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);
|
||||
}
|
||||
@@ -1126,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 */
|
||||
@@ -1141,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, NULL, 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);
|
||||
}
|
||||
}
|
||||
@@ -1178,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 */
|
||||
@@ -1188,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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1199,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 */
|
||||
@@ -1208,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, NULL, 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 */
|
||||
@@ -1260,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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1281,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 */
|
||||
@@ -1296,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, NULL, CurrentCell, TRUE);
|
||||
ndev--;
|
||||
}
|
||||
pobj = LinkProperties(model, kvlist);
|
||||
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
|
||||
DeleteProperties(&kvlist);
|
||||
}
|
||||
}
|
||||
@@ -1335,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();
|
||||
}
|
||||
@@ -1349,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 */
|
||||
@@ -1359,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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1372,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 */
|
||||
@@ -1387,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, NULL, 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);
|
||||
}
|
||||
|
||||
@@ -1435,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();
|
||||
}
|
||||
@@ -1445,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 */
|
||||
@@ -1488,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();
|
||||
}
|
||||
@@ -1498,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 */
|
||||
@@ -1550,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();
|
||||
}
|
||||
@@ -1562,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 */
|
||||
@@ -1580,6 +1530,8 @@ skip_ends:
|
||||
|
||||
else if (toupper(nexttok[0]) == 'X') { /* subcircuit instances */
|
||||
char instancename[100], subcktname[100];
|
||||
int itype;
|
||||
|
||||
instancename[99] = '\0';
|
||||
subcktname[99] = '\0';
|
||||
|
||||
@@ -1601,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;
|
||||
@@ -1629,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
|
||||
{
|
||||
@@ -1656,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 */
|
||||
@@ -1704,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 */
|
||||
@@ -1711,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, NULL, 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);
|
||||
@@ -1756,8 +1726,7 @@ skip_ends:
|
||||
Fprintf(stderr, "Too many warnings. . . will not report any more.\n");
|
||||
}
|
||||
warnings++;
|
||||
}
|
||||
} // repeat over ndev
|
||||
}
|
||||
}
|
||||
DeleteProperties(&kvlist);
|
||||
|
||||
@@ -1839,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;
|
||||
}
|
||||
@@ -1934,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;
|
||||
}
|
||||
}
|
||||
|
||||
+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=\"54\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
|
||||
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
-259
@@ -33,31 +33,30 @@ PATH: /sbin
|
||||
PATH: /usr/bin
|
||||
PATH: /usr/sbin
|
||||
PATH: /usr/local/bin
|
||||
PATH: /home/tim/src/timberwolf-6.3/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
|
||||
@@ -65,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"
|
||||
@@ -126,18 +125,18 @@ configure: failed program was:
|
||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||
| #define PACKAGE_URL ""
|
||||
| #define NETGEN_VERSION "1.5"
|
||||
| #define NETGEN_REVISION "54"
|
||||
| #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"
|
||||
@@ -147,104 +146,104 @@ configure: failed program was:
|
||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||
| #define PACKAGE_URL ""
|
||||
| #define NETGEN_VERSION "1.5"
|
||||
| #define NETGEN_REVISION "54"
|
||||
| #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
|
||||
^
|
||||
@@ -252,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"
|
||||
@@ -262,7 +261,7 @@ configure: failed program was:
|
||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||
| #define PACKAGE_URL ""
|
||||
| #define NETGEN_VERSION "1.5"
|
||||
| #define NETGEN_REVISION "54"
|
||||
| #define NETGEN_REVISION "60"
|
||||
| #define STDC_HEADERS 1
|
||||
| #define HAVE_SYS_TYPES_H 1
|
||||
| #define HAVE_SYS_STAT_H 1
|
||||
@@ -283,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
|
||||
@@ -293,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"
|
||||
@@ -303,7 +302,7 @@ configure: failed program was:
|
||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||
| #define PACKAGE_URL ""
|
||||
| #define NETGEN_VERSION "1.5"
|
||||
| #define NETGEN_REVISION "54"
|
||||
| #define NETGEN_REVISION "60"
|
||||
| #define STDC_HEADERS 1
|
||||
| #define HAVE_SYS_TYPES_H 1
|
||||
| #define HAVE_SYS_STAT_H 1
|
||||
@@ -332,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"
|
||||
@@ -383,7 +382,7 @@ configure: failed program was:
|
||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||
| #define PACKAGE_URL ""
|
||||
| #define NETGEN_VERSION "1.5"
|
||||
| #define NETGEN_REVISION "54"
|
||||
| #define NETGEN_REVISION "60"
|
||||
| #define STDC_HEADERS 1
|
||||
| #define HAVE_SYS_TYPES_H 1
|
||||
| #define HAVE_SYS_STAT_H 1
|
||||
@@ -438,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"
|
||||
@@ -455,7 +454,7 @@ configure: failed program was:
|
||||
| #define PACKAGE_BUGREPORT "[email protected]"
|
||||
| #define PACKAGE_URL ""
|
||||
| #define NETGEN_VERSION "1.5"
|
||||
| #define NETGEN_REVISION "54"
|
||||
| #define NETGEN_REVISION "60"
|
||||
| #define STDC_HEADERS 1
|
||||
| #define HAVE_SYS_TYPES_H 1
|
||||
| #define HAVE_SYS_STAT_H 1
|
||||
@@ -477,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. ##
|
||||
@@ -539,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. ##
|
||||
@@ -622,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=\"54\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1'
|
||||
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'
|
||||
@@ -642,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'
|
||||
@@ -713,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'
|
||||
@@ -735,7 +736,7 @@ unused=''
|
||||
#define PACKAGE_BUGREPORT "[email protected]"
|
||||
#define PACKAGE_URL ""
|
||||
#define NETGEN_VERSION "1.5"
|
||||
#define NETGEN_REVISION "54"
|
||||
#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=\\\"54\\\" -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=\"54\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
|
||||
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 \
|
||||
|
||||
+51
-9
@@ -20,7 +20,11 @@ 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
|
||||
}
|
||||
|
||||
#----------------------------------------------------------------
|
||||
# Define the "lvs" command as a way of calling the netgen options
|
||||
@@ -30,9 +34,22 @@ 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
|
||||
puts stdout "Diagnostic version"
|
||||
foreach arg $args {
|
||||
if {$arg == "-list"} {
|
||||
puts stdout "Generating list result"
|
||||
set dolist 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 +143,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 +212,26 @@ 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 {$dolist == 1} {
|
||||
return $lvs_final
|
||||
}
|
||||
}
|
||||
|
||||
# It is important to make sure no netgen commands overlap with Tcl built-in
|
||||
|
||||
+287
-215
@@ -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,73 @@ _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) {
|
||||
Tcl_Obj *n0, *n1;
|
||||
nbad = Tcl_NewListObj(0, NULL);
|
||||
n0 = Tcl_NewStringObj("badnets", -1);
|
||||
n1 = Tcl_NewListObj(0, NULL);
|
||||
Tcl_ListObjAppendElement(netgeninterp, nbad, n0);
|
||||
Tcl_ListObjAppendElement(netgeninterp, nbad, n1);
|
||||
}
|
||||
Tcl_SetVar2Ex(interp, "lvs_out", NULL, nbad,
|
||||
TCL_APPEND_VALUE | TCL_LIST_ELEMENT);
|
||||
#if 0
|
||||
if (ngood == NULL) {
|
||||
Tcl_Obj *n0, *n1;
|
||||
ngood = Tcl_NewListObj(0, NULL);
|
||||
n0 = Tcl_NewStringObj("goodnets", -1);
|
||||
n1 = Tcl_NewListObj(0, NULL);
|
||||
Tcl_ListObjAppendElement(netgeninterp, ngood, n0);
|
||||
Tcl_ListObjAppendElement(netgeninterp, ngood, n1);
|
||||
}
|
||||
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) {
|
||||
Tcl_Obj *e0, *e1;
|
||||
ebad = Tcl_NewListObj(0, NULL);
|
||||
e0 = Tcl_NewStringObj("badelements", -1);
|
||||
e1 = Tcl_NewListObj(0, NULL);
|
||||
Tcl_ListObjAppendElement(netgeninterp, ebad, e0);
|
||||
Tcl_ListObjAppendElement(netgeninterp, ebad, e1);
|
||||
}
|
||||
Tcl_SetVar2Ex(interp, "lvs_out", NULL, ebad,
|
||||
TCL_APPEND_VALUE | TCL_LIST_ELEMENT);
|
||||
#if 0
|
||||
if (egood == NULL) {
|
||||
Tcl_Obj *e0, *e1;
|
||||
ebad = Tcl_NewListObj(0, NULL);
|
||||
e0 = Tcl_NewStringObj("goodelements", -1);
|
||||
e1 = Tcl_NewListObj(0, NULL);
|
||||
Tcl_ListObjAppendElement(netgeninterp, egood, e0);
|
||||
Tcl_ListObjAppendElement(netgeninterp, egood, e1);
|
||||
}
|
||||
Tcl_SetVar2Ex(interp, "lvs_out", NULL, egood,
|
||||
TCL_APPEND_VALUE | TCL_LIST_ELEMENT);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
return TCL_OK;
|
||||
@@ -2525,10 +2639,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 +2663,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 +2693,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 +2874,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 +2886,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;
|
||||
|
||||
@@ -2971,6 +3103,15 @@ _netcmp_equate(ClientData clientData,
|
||||
/* 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: */
|
||||
@@ -2988,10 +3129,12 @@ _netcmp_property(ClientData clientData,
|
||||
int ival, argstart;
|
||||
|
||||
char *options[] = {
|
||||
"add", "create", "remove", "delete", "tolerance", "merge", NULL
|
||||
"add", "create", "remove", "delete", "tolerance", "merge", "serial",
|
||||
"parallel", NULL
|
||||
};
|
||||
enum OptionIdx {
|
||||
ADD_IDX, CREATE_IDX, REMOVE_IDX, DELETE_IDX, TOLERANCE_IDX, MERGE_IDX
|
||||
ADD_IDX, CREATE_IDX, REMOVE_IDX, DELETE_IDX, TOLERANCE_IDX, MERGE_IDX,
|
||||
SERIAL_IDX, PARALLEL_IDX
|
||||
};
|
||||
int result, index, idx2;
|
||||
|
||||
@@ -3003,16 +3146,65 @@ _netcmp_property(ClientData clientData,
|
||||
};
|
||||
|
||||
char *mergeoptions[] = {
|
||||
"none", "add", "add_critical", "par", "par_critical", NULL
|
||||
"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
|
||||
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;
|
||||
|
||||
@@ -3061,6 +3253,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:
|
||||
@@ -3264,11 +3495,21 @@ _netcmp_property(ClientData clientData,
|
||||
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);
|
||||
}
|
||||
@@ -3279,175 +3520,6 @@ _netcmp_property(ClientData clientData,
|
||||
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] */
|
||||
@@ -3922,7 +3994,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