121 #define MODULUS1 2147483563 125 #define MODULUS2 2147483399 130 #define STAB_DIV (1 + (MODULUS1 - 1) / STAB_SIZE) 146 static char rcsid[]
DD_UNUSED =
"$Id: cuddUtil.c,v 1.83 2012/02/05 01:07:19 fabio Exp $";
160 #define bang(f) ((Cudd_IsComplement(f)) ? '!' : ' ') 233 for (i = 0; i < manager->
size; i++) list[i] = 2;
270 if (array == NULL)
return(0);
278 DdNode *implicant, *prime, *tmp;
281 if (implicant == NULL) {
313 for (q = 0; q < dd->
size; q++) {
316 (void) fprintf(dd->
out,
"0");
319 (void) fprintf(dd->
out,
"1");
322 (void) fprintf(dd->
out,
"-");
325 (void) fprintf(dd->
out,
"?");
328 (void) fprintf(dd->
out,
" 1\n");
344 (void) fprintf(dd->
out,
"\n");
399 (void) fprintf(dd->
out,
": is the NULL DD\n");
400 (void) fflush(dd->
out);
405 if ((f == azero || f == bzero) && pr > 0){
406 (void) fprintf(dd->
out,
": is the zero DD\n");
407 (void) fflush(dd->
out);
417 (void) fprintf(dd->
out,
": %d nodes %d leaves %g minterms\n",
418 nodes, leaves, minterms);
420 if (!
cuddP(dd, f)) retval = 0;
422 if (pr == 2 || pr > 3) {
424 (void) fprintf(dd->
out,
"\n");
426 (void) fflush(dd->
out);
555 for (j = 0; j < n; j++) {
558 for (j = 0; j < n; j++) {
595 max = pow(2.0,(
double)nvars);
756 *indices =
ALLOC(
int, SP);
757 if (*indices == NULL) {
762 for (i = 0; i < SP; i++)
805 for (j = size - 1; j >= 0; j--) {
806 int index = support[j];
852 support =
ALLOC(
int,size);
853 if (support == NULL) {
857 for (i = 0; i < size; i++) {
922 for (i = 0; i < n; i++) {
925 for (i = 0; i < n; i++) {
932 *indices =
ALLOC(
int, SP);
933 if (*indices == NULL) {
938 for (i = 0; i < SP; i++)
982 for (j = size - 1; j >= 0; j--) {
983 int index = support[j];
1028 support =
ALLOC(
int,size);
1029 if (support == NULL) {
1033 for (i = 0; i < size; i++) {
1038 for (i = 0; i < n; i++) {
1041 for (i = 0; i < n; i++) {
1072 for (i = 0; i < n; i++) {
1075 for (i = 0; i < n; i++) {
1109 int *supportF, *supportG;
1126 *common = *onlyF = *onlyG =
DD_ONE(dd);
1130 while (fi >= 0 || gi >= 0) {
1131 int indexF = fi >= 0 ? supportF[fi] : -1;
1132 int indexG = gi >= 0 ? supportG[gi] : -1;
1133 int index =
ddMax(indexF, indexG);
1138 if (indexF == indexG) {
1152 }
else if (index == indexF) {
1239 if (
string == NULL || node == NULL)
return(0);
1244 if (node == bzero)
return(0);
1246 for (i = 0; i < ddm->
size; i++)
string[i] = 2;
1250 if (node == one)
break;
1259 string[N->
index] = 0;
1261 }
else if (E == bzero) {
1262 string[N->
index] = 1;
1266 string[N->
index] = dir;
1312 string =
ALLOC(
char, size);
1313 if (
string == NULL) {
1317 indices =
ALLOC(
int,n);
1318 if (indices == NULL) {
1324 for (i = 0; i < n; i++) {
1325 indices[i] = vars[i]->
index;
1336 for (i = 0; i < n; i++) {
1337 if (
string[indices[i]] == 2)
1338 string[indices[i]] = (char) ((
Cudd_Random() & 0x20) >> 5);
1345 for (i = n-1; i >= 0; i--) {
1415 int saveFlag, savePoint, isSame;
1418 if ((
double)k > minterms) {
1423 string =
ALLOC(
char *, k);
1424 if (
string == NULL) {
1428 for (i = 0; i < k; i++) {
1429 string[i] =
ALLOC(
char, size + 1);
1430 if (
string[i] == NULL) {
1431 for (j = 0; j < i; j++)
1437 for (j = 0; j < size; j++)
string[i][j] =
'2';
1438 string[i][size] =
'\0';
1440 indices =
ALLOC(
int,n);
1441 if (indices == NULL) {
1443 for (i = 0; i < k; i++)
1449 for (i = 0; i < n; i++) {
1450 indices[i] = vars[i]->
index;
1455 for (i = 0; i < k; i++)
1465 for (i = 0; i < k; i++)
1471 saveString =
ALLOC(
char, size + 1);
1472 if (saveString == NULL) {
1474 for (i = 0; i < k; i++)
1484 for (i = 0; i < k; i++) {
1487 for (j = i + 1; j < k; j++) {
1488 if (
strcmp(
string[i],
string[j]) == 0) {
1490 strcpy(saveString,
string[i]);
1496 if (
strcmp(
string[i], saveString) == 0) {
1500 for (j = i + 1; j < k; j++) {
1501 if (
strcmp(
string[i],
string[j]) == 0) {
1503 strcpy(saveString,
string[i]);
1511 for (j = 0; j < n; j++) {
1512 if (
string[i][indices[j]] ==
'2')
1513 string[i][indices[j]] =
1519 for (j = savePoint; j < i; j++) {
1520 if (
strcmp(
string[i],
string[j]) == 0) {
1526 strcpy(
string[i], saveString);
1528 for (j = 0; j < n; j++) {
1529 if (
string[i][indices[j]] ==
'2')
1530 string[i][indices[j]] =
1539 for (j = 0; j < n; j++) {
1540 if (
string[i][indices[j]] ==
'0') {
1547 for (l = 0; l < k; l++)
1551 for (l = 0; l <= i; l++)
1564 for (l = 0; l < k; l++)
1568 for (l = 0; l <= i; l++)
1576 for (i = 0; i < k; i++) {
1621 int *indices, *mask;
1634 weight =
ALLOC(
double,size);
1635 if (weight == NULL) {
1639 for (i = 0; i < size; i++) {
1642 for (i = 0; i < mvars; i++) {
1654 string =
ALLOC(
char, size + 1);
1655 if (
string == NULL) {
1660 mask =
ALLOC(
int, size);
1667 for (i = 0; i < size; i++) {
1671 string[size] =
'\0';
1672 indices =
ALLOC(
int,nvars);
1673 if (indices == NULL) {
1680 for (i = 0; i < nvars; i++) {
1681 indices[i] = vars[i]->
index;
1696 for (i = 0; i < nvars; i++) {
1697 if (
string[indices[i]] ==
'0') {
1699 }
else if (
string[indices[i]] ==
'1') {
1703 if (newCube == NULL) {
1717 for (i = 0; i < mvars; i++) {
1718 mask[maskVars[i]->
index] = 1;
1720 for (i = 0; i < nvars; i++) {
1721 if (mask[indices[i]]) {
1722 if (
string[indices[i]] ==
'2') {
1723 if (weight[indices[i]] >= 0.0)
1724 string[indices[i]] =
'1';
1726 string[indices[i]] =
'0';
1729 string[indices[i]] =
'2';
1738 for (i = 0; i < nvars; i++) {
1739 if (
string[indices[i]] ==
'0') {
1741 }
else if (
string[indices[i]] ==
'1') {
1745 if (newCube == NULL) {
1813 DdNode *top, *treg, *next, *nreg, *prev, *preg;
1818 if (dd == NULL || f == NULL)
return(NULL);
1833 gen->
stack.stack = NULL;
1843 for (i = 0; i < nvars; i++) gen->
gen.
cubes.cube[i] = 2;
1850 if (gen->
stack.stack == NULL) {
1856 for (i = 0; i <= nvars; i++) gen->
stack.stack[i] = NULL;
1868 if (top != treg) next =
Cudd_Not(next);
1873 if (gen->
stack.sp == 1) {
1882 if (prev != preg) {next =
Cudd_Not(nreg);}
else {next = nreg;}
1930 DdNode *top, *treg, *next, *nreg, *prev, *preg;
1935 if (gen->
stack.sp == 1) {
1946 if (prev != preg) {next =
Cudd_Not(nreg);}
else {next = nreg;}
1964 if (top != treg) next =
Cudd_Not(next);
1969 if (gen->
stack.sp == 1) {
1978 if (prev != preg) {next =
Cudd_Not(nreg);}
else {next = nreg;}
2043 DdNode *implicant, *prime, *tmp;
2047 if (dd == NULL || l == NULL || u == NULL)
return(NULL);
2062 gen->
stack.stack = NULL;
2077 if (implicant == NULL) {
2085 if (prime == NULL) {
2142 DdNode *implicant, *prime, *tmp;
2150 if (implicant == NULL) {
2156 if (prime == NULL) {
2217 for (i = n - 1; i >= 0; i--) {
2218 if (phase == NULL || phase[i] != 0) {
2268 for (i = n - 1; i >= 0; i--) {
2269 if (phase == NULL || phase[i] != 0) {
2310 DdNode *cube, *var, *tmp;
2316 for (i = size - 1; i >= 0; i--) {
2317 if ((array[i] & ~1) == 0) {
2364 for (i = size-1; i >= 0; i--) {
2374 }
else if (e == zero) {
2417 if (dd == NULL || f == NULL)
return(NULL);
2434 if (gen->
stack.stack == NULL) {
2502 if (gen == NULL)
return(0);
2503 switch (gen->
type) {
2542 if (gen == NULL)
return(1);
2571 for (i = n - 1; i >= 0; i--) {
2625 double tetotal, nexttotal;
2626 double tesubtotal, nextsubtotal;
2627 double temeasured, nextmeasured;
2636 if (nvars == 0)
return(0.0);
2645 for (i = 0; i < nvars; i++) {
2650 for (j = 0; j < slots; j++) {
2652 while (scan != sentinel) {
2653 diff = (long) scan - (
long)
cuddT(scan);
2654 tesubtotal += (double)
ddAbs(diff);
2656 tesubtotal += (double)
ddAbs(diff);
2658 if (scan->
next != sentinel) {
2659 diff = (long) scan - (
long) scan->
next;
2660 nextsubtotal += (double)
ddAbs(diff);
2661 nextmeasured += 1.0;
2666 tetotal += tesubtotal;
2667 nexttotal += nextsubtotal;
2674 for (j = 0; j < slots; j++) {
2676 while (scan != NULL) {
2677 if (scan->
next != NULL) {
2678 diff = (long) scan - (
long) scan->
next;
2679 nextsubtotal += (double)
ddAbs(diff);
2680 nextmeasured += 1.0;
2685 nexttotal += nextsubtotal;
2687 return((tetotal + nexttotal) / (temeasured + nextmeasured));
2819 if (nvars == 0) nvars = dd->
size;
2823 density = minterms / (double) nodes;
2848 (void) fflush(stdout);
2849 (void) fprintf(stderr,
"\nunable to allocate %ld bytes\n", size);
2881 if (table == NULL)
return(0);
2883 retval =
dp2(dd,f,table);
2885 (void) fputc(
'\n',dd->
out);
2910 d = (
double *)value;
2963 if (retval != 1)
return(retval);
2996 if (table == NULL) {
3039 #if SIZEOF_VOID_P == 8 3040 (void) fprintf(dd->
out,
"ID = %c0x%lx\tvalue = %-9g\n",
bang(f),
3043 (void) fprintf(dd->
out,
"ID = %c0x%x\tvalue = %-9g\n",
bang(f),
3054 #if SIZEOF_VOID_P == 8 3055 (void) fprintf(dd->
out,
"ID = %c0x%lx\tindex = %d\tr = %d\t",
bang(f),
3058 (void) fprintf(dd->
out,
"ID = %c0x%x\tindex = %d\tr = %d\t",
bang(f),
3062 #if SIZEOF_VOID_P == 8 3063 (void) fprintf(dd->
out,
"ID = %c0x%lx\tindex = %u\t",
bang(f),
3066 (void) fprintf(dd->
out,
"ID = %c0x%x\tindex = %hu\t",
bang(f),
3072 (void) fprintf(dd->
out,
"T = %-9g\t",
cuddV(n));
3075 #if SIZEOF_VOID_P == 8 3086 (void) fprintf(dd->
out,
"E = %c%-9g\n",
bang(n),
cuddV(N));
3089 #if SIZEOF_VOID_P == 8 3097 if (
dp2(dd,N,t) == 0)
3134 if (node != background && node != zero) {
3135 for (i = 0; i < dd->
size; i++) {
3137 if (v == 0) (void) fprintf(dd->
out,
"0");
3138 else if (v == 1) (void) fprintf(dd->
out,
"1");
3139 else (
void) fprintf(dd->
out,
"-");
3141 (void) fprintf(dd->
out,
" % g\n",
cuddV(node));
3187 return(1 + tval + eval);
3256 int tval, eval, val;
3260 if (!
st_lookup(table,(
char *)node,(
char **)ptr)) {
3275 if ((
int) node->
index == i) {
3283 if (node->
ref > 1) {
3294 if (node->
ref > 1) {
3299 val = 1 + tval + eval;
3309 if (node->
ref > 1) {
3314 }
else if ((ptrT !=
cuddT(node) || ptrE !=
cuddE(node)) &&
3319 val = 1 + tval + eval;
3321 if (node->
ref > 1) {
3328 val = 1 + tval + eval;
3360 if (index >= unique->
size) {
3364 level = unique->
perm[index];
3374 looking = nodelist[posn];
3376 while (T <
cuddT(looking)) {
3379 while (T ==
cuddT(looking) && E <
cuddE(looking)) {
3382 if (
cuddT(looking) == T &&
cuddE(looking) == E) {
3421 if ((
int) node->
index == i)
return(tval);
3423 return(1 + tval + eval);
3453 double min, minT, minE;
3459 if (node == background || node == zero) {
3467 if (res->
ref == 0) {
3483 if (minE == (
double)CUDD_OUT_OF_MEM)
return((
double)CUDD_OUT_OF_MEM);
3493 return((
double)CUDD_OUT_OF_MEM);
3526 double paths, *ppaths, paths1, paths2;
3541 if (paths1 == (
double)
CUDD_OUT_OF_MEM)
return((
double)CUDD_OUT_OF_MEM);
3543 if (paths2 == (
double)CUDD_OUT_OF_MEM)
return((
double)CUDD_OUT_OF_MEM);
3544 paths = paths1 + paths2;
3546 ppaths =
ALLOC(
double,1);
3547 if (ppaths == NULL) {
3548 return((
double)CUDD_OUT_OF_MEM);
3555 return((
double)CUDD_OUT_OF_MEM);
3594 if (node == background || node == zero) {
3620 if (node->
ref > 1) {
3659 double paths, *ppaths, paths1, paths2;
3677 if (paths1 == (
double)
CUDD_OUT_OF_MEM)
return((
double)CUDD_OUT_OF_MEM);
3679 if (paths2 == (
double)CUDD_OUT_OF_MEM)
return((
double)CUDD_OUT_OF_MEM);
3680 paths = paths1 + paths2;
3682 ppaths =
ALLOC(
double,1);
3683 if (ppaths == NULL) {
3684 return((
double)CUDD_OUT_OF_MEM);
3691 return((
double)CUDD_OUT_OF_MEM);
3719 support[f->
index] = 1;
3786 return(tval + eval);
3816 if (
string == NULL || node == NULL)
return(0);
3821 if (nminterms == 0 || node == bzero)
return(1);
3835 if (min2 == (
double)CUDD_OUT_OF_MEM)
return(0);
3837 t = (int)((
double)nminterms * min1 / (min1 + min2) + 0.5);
3838 for (i = 0; i < t; i++)
3839 string[i][N->
index] =
'1';
3840 for (i = t; i < nminterms; i++)
3841 string[i][N->
index] =
'0';
3874 if (
string == NULL || node == NULL)
return(0);
3879 if (node == bzero)
return(0);
3881 if (node ==
DD_ONE(dd))
return(1);
3893 if (weight[N->
index] >= 0.0) {
3896 string[N->
index] =
'0';
3899 string[N->
index] =
'1';
3904 string[N->
index] =
'1';
3907 string[N->
index] =
'0';
3970 var = dd->
vars[index];
4004 for (i = 0; i < SP; i++) {
4028 int ia = *((
int *) a);
4029 int ib = *((
int *) b);
DdNode * Cudd_bddPickOneMinterm(DdManager *dd, DdNode *f, DdNode **vars, int n)
int cuddCollectNodes(DdNode *f, st_table *visited)
DdGen * Cudd_FirstPrime(DdManager *dd, DdNode *l, DdNode *u, int **cube)
DdNode * Cudd_SubsetWithMaskVars(DdManager *dd, DdNode *f, DdNode **vars, int nvars, DdNode **maskVars, int mvars)
int Cudd_NextNode(DdGen *gen, DdNode **node)
static void ddFindSupport(DdManager *dd, DdNode *f, int *SP)
DdNode ** Cudd_bddPickArbitraryMinterms(DdManager *dd, DdNode *f, DdNode **vars, int n, int k)
void EpdMultiply(EpDouble *epd1, double value)
void EpdFree(EpDouble *epd)
int st_lookup(st_table *, void *, void *)
int Cudd_SupportSize(DdManager *dd, DdNode *f)
int Cudd_SupportIndices(DdManager *dd, DdNode *f, int **indices)
double Cudd_Density(DdManager *dd, DdNode *f, int nvars)
void Cudd_RecursiveDeref(DdManager *table, DdNode *n)
void Cudd_Srandom(long seed)
void Cudd_PrintVersion(FILE *fp)
#define CUDD_GEN_ZDD_PATHS
int st_foreach(st_table *, ST_PFSR, char *)
DdNode * Cudd_bddComputeCube(DdManager *dd, DdNode **vars, int *phase, int n)
static double ddCountPathsToNonZero(DdNode *N, st_table *table)
DdNode * cuddUniqueConst(DdManager *unique, CUDD_VALUE_TYPE value)
static int ddPickArbitraryMinterms(DdManager *dd, DdNode *node, int nvars, int nminterms, char **string)
static int cuddEstimateCofactorSimple(DdNode *node, int i)
void st_free_table(st_table *)
#define Cudd_IsConstant(node)
int Cudd_PrintDebug(DdManager *dd, DdNode *f, int n, int pr)
struct DdGen::@1::@5 nodes
DdNode * Cudd_ReadLogicZero(DdManager *dd)
#define Cudd_Regular(node)
int Cudd_EstimateCofactor(DdManager *dd, DdNode *f, int i, int phase)
void Cudd_OutOfMem(long size)
static DdNode * cuddUniqueLookup(DdManager *unique, int index, DdNode *T, DdNode *E)
int Cudd_DagSize(DdNode *node)
static double ddCountPathAux(DdNode *node, st_table *table)
static int dp2(DdManager *dd, DdNode *f, st_table *t)
DdGen * Cudd_FirstCube(DdManager *dd, DdNode *f, int **cube, CUDD_VALUE_TYPE *value)
DdNode * Cudd_bddIte(DdManager *dd, DdNode *f, DdNode *g, DdNode *h)
DdNode * Cudd_addComputeCube(DdManager *dd, DdNode **vars, int *phase, int n)
int EpdCmp(const char *key1, const char *key2)
DdGen * Cudd_FirstNode(DdManager *dd, DdNode *f, DdNode **node)
static DdNode * background
static int ddPickRepresentativeCube(DdManager *dd, DdNode *node, double *weight, char *string)
int Cudd_NextCube(DdGen *gen, int **cube, CUDD_VALUE_TYPE *value)
DdNode * cuddHashTableLookup1(DdHashTable *hash, DdNode *f)
int Cudd_ReadSize(DdManager *dd)
int Cudd_SharingSize(DdNode **nodeArray, int n)
double Cudd_CountPathsToNonZero(DdNode *node)
#define CUDD_GEN_NONEMPTY
DdNode * Cudd_LargestCube(DdManager *manager, DdNode *f, int *length)
int st_insert(st_table *, void *, void *)
static long shuffleSelect
double Cudd_CountMinterm(DdManager *manager, DdNode *node, int nvars)
static long shuffleTable[STAB_SIZE]
double Cudd_AverageDistance(DdManager *dd)
int Cudd_bddPrintCover(DdManager *dd, DdNode *l, DdNode *u)
#define Cudd_IsComplement(node)
static char rcsid [] DD_UNUSED
void Cudd_SetEpsilon(DdManager *dd, CUDD_VALUE_TYPE ep)
DdNode * Cudd_bddMakePrime(DdManager *dd, DdNode *cube, DdNode *f)
int Cudd_BddToCubeArray(DdManager *dd, DdNode *cube, int *array)
DdNode * Cudd_Cofactor(DdManager *dd, DdNode *f, DdNode *g)
DdNode * Cudd_IndicesToCube(DdManager *dd, int *array, int n)
int Cudd_NextPrime(DdGen *gen, int **cube)
static enum st_retval ddEpdFree(char *key, char *value, char *arg)
int Cudd_GenFree(DdGen *gen)
int Cudd_PrintMinterm(DdManager *manager, DdNode *node)
static int cuddEstimateCofactor(DdManager *dd, st_table *table, DdNode *node, int i, int phase, DdNode **ptr)
struct DdGen::@1::@4 primes
DdNode * Cudd_VectorSupport(DdManager *dd, DdNode **F, int n)
static void ddSupportStep(DdNode *f, int *support)
int Cudd_CountLeaves(DdNode *node)
double Cudd_CountPath(DdNode *node)
static int ddEpdCountMintermAux(DdNode *node, EpDouble *max, EpDouble *epd, st_table *table)
static void ddPrintMintermAux(DdManager *dd, DdNode *node, int *list)
#define cuddIsConstant(node)
int Cudd_EpdCountMinterm(DdManager *manager, DdNode *node, int nvars, EpDouble *epd)
int cuddP(DdManager *dd, DdNode *f)
#define Cudd_Complement(node)
DdNodePtr * cuddNodeArray(DdNode *f, int *n)
static int ddDagInt(DdNode *n)
int st_ptrcmp(const char *, const char *)
void cuddHashTableQuit(DdHashTable *hash)
int Cudd_IsGenEmpty(DdGen *gen)
DdNode * Cudd_bddOr(DdManager *dd, DdNode *f, DdNode *g)
enum st_retval cuddStCountfree(char *key, char *value, char *arg)
st_table * st_init_table(ST_PFICPCP, ST_PFICPI)
int Cudd_VectorSupportIndices(DdManager *dd, DdNode **F, int n, int **indices)
void EpdAdd3(EpDouble *epd1, EpDouble *epd2, EpDouble *epd3)
int st_add_direct(st_table *, void *, void *)
DdNode * Cudd_ReadOne(DdManager *dd)
int Cudd_bddLeq(DdManager *dd, DdNode *f, DdNode *g)
DdNode * Cudd_addIte(DdManager *dd, DdNode *f, DdNode *g, DdNode *h)
#define st_is_member(table, key)
static int ddLeavesInt(DdNode *n)
int Cudd_bddPickOneCube(DdManager *ddm, DdNode *node, char *string)
int cuddHashTableInsert1(DdHashTable *hash, DdNode *f, DdNode *value, ptrint count)
void EpdPow2(int n, EpDouble *epd)
void cuddGetBranches(DdNode *g, DdNode **g1, DdNode **g0)
struct DdGen::@1::@3 cubes
DdNode * Cudd_CubeArrayToBdd(DdManager *dd, int *array)
void EpdSubtract3(EpDouble *epd1, EpDouble *epd2, EpDouble *epd3)
DdNode * Cudd_bddIthVar(DdManager *dd, int i)
void EpdMakeZero(EpDouble *epd, int sign)
int * Cudd_VectorSupportIndex(DdManager *dd, DdNode **F, int n)
EpDouble * EpdAlloc(void)
#define Cudd_NotCond(node, c)
DdNode * Cudd_bddAnd(DdManager *dd, DdNode *f, DdNode *g)
static void ddClearFlag(DdNode *f)
static double ddCountMintermAux(DdNode *node, double max, DdHashTable *table)
static int indexCompare(const void *a, const void *b)
DdHashTable * cuddHashTableInit(DdManager *manager, unsigned int keySize, unsigned int initSize)
int st_ptrhash(char *, int)
int Cudd_EstimateCofactorSimple(DdNode *node, int i)
int Cudd_VectorSupportSize(DdManager *dd, DdNode **F, int n)
int * Cudd_SupportIndex(DdManager *dd, DdNode *f)
void EpdCopy(EpDouble *from, EpDouble *to)
int Cudd_ClassifySupport(DdManager *dd, DdNode *f, DdNode *g, DdNode **common, DdNode **onlyF, DdNode **onlyG)
DdNode * Cudd_Support(DdManager *dd, DdNode *f)
CUDD_VALUE_TYPE Cudd_ReadEpsilon(DdManager *dd)
static void ddClearVars(DdManager *dd, int SP)
static int cuddNodeArrayRecur(DdNode *f, DdNodePtr *table, int index)