00001
00051 #ifndef _CUDDINT
00052 #define _CUDDINT
00053
00054
00055
00056
00057
00058
00059 #ifdef DD_MIS
00060 #include "array.h"
00061 #include "list.h"
00062 #include "st.h"
00063 #include "espresso.h"
00064 #include "node.h"
00065 #ifdef SIS
00066 #include "graph.h"
00067 #include "astg.h"
00068 #endif
00069 #include "network.h"
00070 #endif
00071
00072 #include <math.h>
00073 #include "cudd.h"
00074 #include "st.h"
00075
00076 #ifdef __cplusplus
00077 extern "C" {
00078 #endif
00079
00080 #if defined(__GNUC__)
00081 # define DD_INLINE __inline__
00082 # if (__GNUC__ >2 || __GNUC_MINOR__ >=7)
00083 # define DD_UNUSED __attribute__ ((__unused__))
00084 # else
00085 # define DD_UNUSED
00086 # endif
00087 #else
00088 # if defined(__cplusplus)
00089 # define DD_INLINE inline
00090 # else
00091 # define DD_INLINE
00092 # endif
00093 # define DD_UNUSED
00094 #endif
00095
00096
00097
00098
00099
00100
00101 #define DD_MAXREF ((DdHalfWord) ~0)
00102
00103 #define DD_DEFAULT_RESIZE 10
00104
00105 #define DD_MEM_CHUNK 1022
00106
00107
00108 #define DD_ONE_VAL (1.0)
00109 #define DD_ZERO_VAL (0.0)
00110 #define DD_EPSILON (1.0e-12)
00111
00112
00113
00114
00115 #ifdef HAVE_IEEE_754
00116 # define DD_PLUS_INF_VAL (HUGE_VAL)
00117 #else
00118 # define DD_PLUS_INF_VAL (10e301)
00119 # define DD_CRI_HI_MARK (10e150)
00120 # define DD_CRI_LO_MARK (-(DD_CRI_HI_MARK))
00121 #endif
00122 #define DD_MINUS_INF_VAL (-(DD_PLUS_INF_VAL))
00123
00124 #define DD_NON_CONSTANT ((DdNode *) 1)
00125
00126
00127 #define DD_MAX_SUBTABLE_DENSITY 4
00128
00129
00130
00131
00132
00133
00134 #define DD_GC_FRAC_LO DD_MAX_SUBTABLE_DENSITY * 0.25
00135 #define DD_GC_FRAC_HI DD_MAX_SUBTABLE_DENSITY * 1.0
00136 #define DD_GC_FRAC_MIN 0.2
00137 #define DD_MIN_HIT 30
00138
00139 #define DD_MAX_LOOSE_FRACTION 5
00140
00141 #define DD_MAX_CACHE_FRACTION 3
00142
00143 #define DD_STASH_FRACTION 64
00144
00145 #define DD_MAX_CACHE_TO_SLOTS_RATIO 4
00146
00147
00148 #define DD_SIFT_MAX_VAR 1000
00149 #define DD_SIFT_MAX_SWAPS 2000000
00150 #define DD_DEFAULT_RECOMB 0
00151 #define DD_MAX_REORDER_GROWTH 1.2
00152 #define DD_FIRST_REORDER 4004
00153 #define DD_DYN_RATIO 2
00154
00155
00156 #define DD_P1 12582917
00157 #define DD_P2 4256249
00158 #define DD_P3 741457
00159 #define DD_P4 1618033999
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173 #define DD_ADD_ITE_TAG 0x02
00174 #define DD_BDD_AND_ABSTRACT_TAG 0x06
00175 #define DD_BDD_XOR_EXIST_ABSTRACT_TAG 0x0a
00176 #define DD_BDD_ITE_TAG 0x0e
00177 #define DD_ADD_BDD_DO_INTERVAL_TAG 0x22
00178 #define DD_BDD_CLIPPING_AND_ABSTRACT_UP_TAG 0x26
00179 #define DD_BDD_CLIPPING_AND_ABSTRACT_DOWN_TAG 0x2a
00180 #define DD_BDD_COMPOSE_RECUR_TAG 0x2e
00181 #define DD_ADD_COMPOSE_RECUR_TAG 0x42
00182 #define DD_ADD_NON_SIM_COMPOSE_TAG 0x46
00183 #define DD_EQUIV_DC_TAG 0x4a
00184 #define DD_ZDD_ITE_TAG 0x4e
00185 #define DD_ADD_ITE_CONSTANT_TAG 0x62
00186 #define DD_ADD_EVAL_CONST_TAG 0x66
00187 #define DD_BDD_ITE_CONSTANT_TAG 0x6a
00188 #define DD_ADD_OUT_SUM_TAG 0x6e
00189 #define DD_BDD_LEQ_UNLESS_TAG 0x82
00190 #define DD_ADD_TRIANGLE_TAG 0x86
00191
00192
00193 #define CUDD_GEN_CUBES 0
00194 #define CUDD_GEN_PRIMES 1
00195 #define CUDD_GEN_NODES 2
00196 #define CUDD_GEN_ZDD_PATHS 3
00197 #define CUDD_GEN_EMPTY 0
00198 #define CUDD_GEN_NONEMPTY 1
00199
00200
00201
00202
00203
00204
00205 struct DdGen {
00206 DdManager *manager;
00207 int type;
00208 int status;
00209 union {
00210 struct {
00211 int *cube;
00212 CUDD_VALUE_TYPE value;
00213 } cubes;
00214 struct {
00215 int *cube;
00216 DdNode *ub;
00217 } primes;
00218 struct {
00219 int size;
00220 } nodes;
00221 } gen;
00222 struct {
00223 int sp;
00224 #ifdef __osf__
00225 #pragma pointer_size save
00226 #pragma pointer_size short
00227 #endif
00228 DdNode **stack;
00229 #ifdef __osf__
00230 #pragma pointer_size restore
00231 #endif
00232 } stack;
00233 DdNode *node;
00234 };
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246 typedef struct DdHook {
00247 DD_HFP f;
00248 struct DdHook *next;
00249 } DdHook;
00250
00251 #if SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
00252 typedef long ptrint;
00253 typedef unsigned long ptruint;
00254 #else
00255 typedef int ptrint;
00256 typedef unsigned int ptruint;
00257 #endif
00258
00259 #ifdef __osf__
00260 #pragma pointer_size save
00261 #pragma pointer_size short
00262 #endif
00263
00264 typedef DdNode *DdNodePtr;
00265
00266
00267 typedef struct DdLocalCacheItem {
00268 DdNode *value;
00269 #ifdef DD_CACHE_PROFILE
00270 ptrint count;
00271 #endif
00272 DdNode *key[1];
00273 } DdLocalCacheItem;
00274
00275
00276 typedef struct DdLocalCache {
00277 DdLocalCacheItem *item;
00278 unsigned int itemsize;
00279 unsigned int keysize;
00280 unsigned int slots;
00281 int shift;
00282 double lookUps;
00283 double minHit;
00284 double hits;
00285 unsigned int maxslots;
00286 DdManager *manager;
00287 struct DdLocalCache *next;
00288 } DdLocalCache;
00289
00290
00291 typedef struct DdHashItem {
00292 struct DdHashItem *next;
00293 ptrint count;
00294 DdNode *value;
00295 DdNode *key[1];
00296 } DdHashItem;
00297
00298
00299 typedef struct DdHashTable {
00300 unsigned int keysize;
00301 unsigned int itemsize;
00302 DdHashItem **bucket;
00303 DdHashItem *nextFree;
00304 DdHashItem **memoryList;
00305 unsigned int numBuckets;
00306 int shift;
00307 unsigned int size;
00308 unsigned int maxsize;
00309 DdManager *manager;
00310 } DdHashTable;
00311
00312 typedef struct DdCache {
00313 DdNode *f,*g;
00314 ptruint h;
00315 DdNode *data;
00316 #ifdef DD_CACHE_PROFILE
00317 ptrint count;
00318 #endif
00319 } DdCache;
00320
00321 typedef struct DdSubtable {
00322 DdNode **nodelist;
00323 int shift;
00324 unsigned int slots;
00325 unsigned int keys;
00326 unsigned int maxKeys;
00327 unsigned int dead;
00328 unsigned int next;
00329 int bindVar;
00330
00331 Cudd_VariableType varType;
00332 int pairIndex;
00333 int varHandled;
00334 Cudd_LazyGroupType varToBeGrouped;
00335 } DdSubtable;
00336
00337 struct DdManager {
00338
00339 DdNode sentinel;
00340 DdNode *one;
00341 DdNode *zero;
00342 DdNode *plusinfinity;
00343 DdNode *minusinfinity;
00344 DdNode *background;
00345
00346 DdCache *acache;
00347 DdCache *cache;
00348 unsigned int cacheSlots;
00349 int cacheShift;
00350 double cacheMisses;
00351 double cacheHits;
00352 double minHit;
00353 int cacheSlack;
00354 unsigned int maxCacheHard;
00355
00356 int size;
00357 int sizeZ;
00358 int maxSize;
00359 int maxSizeZ;
00360 DdSubtable *subtables;
00361 DdSubtable *subtableZ;
00362 DdSubtable constants;
00363 unsigned int slots;
00364 unsigned int keys;
00365 unsigned int keysZ;
00366 unsigned int dead;
00367 unsigned int deadZ;
00368 unsigned int maxLive;
00369 unsigned int minDead;
00370 double gcFrac;
00371 int gcEnabled;
00372 unsigned int looseUpTo;
00373
00374 unsigned int initSlots;
00375 DdNode **stack;
00376 double allocated;
00377
00378 double reclaimed;
00379 int isolated;
00380 int *perm;
00381 int *permZ;
00382 int *invperm;
00383 int *invpermZ;
00384 DdNode **vars;
00385 int *map;
00386 DdNode **univ;
00387 int linearSize;
00388 long *interact;
00389 long *linear;
00390
00391 DdNode **memoryList;
00392 DdNode *nextFree;
00393 char *stash;
00394 #ifndef DD_NO_DEATH_ROW
00395 DdNode **deathRow;
00396 int deathRowDepth;
00397 int nextDead;
00398 unsigned deadMask;
00399 #endif
00400
00401 CUDD_VALUE_TYPE epsilon;
00402
00403 int reordered;
00404 int reorderings;
00405 int siftMaxVar;
00406 int siftMaxSwap;
00407 double maxGrowth;
00408 double maxGrowthAlt;
00409 int reordCycle;
00410 int autoDyn;
00411 int autoDynZ;
00412 Cudd_ReorderingType autoMethod;
00413 Cudd_ReorderingType autoMethodZ;
00414 int realign;
00415 int realignZ;
00416 unsigned int nextDyn;
00417 unsigned int countDead;
00418 MtrNode *tree;
00419 MtrNode *treeZ;
00420 Cudd_AggregationType groupcheck;
00421 int recomb;
00422 int symmviolation;
00423 int arcviolation;
00424 int populationSize;
00425 int numberXovers;
00426 DdLocalCache *localCaches;
00427 #ifdef __osf__
00428 #pragma pointer_size restore
00429 #endif
00430 char *hooks;
00431 DdHook *preGCHook;
00432 DdHook *postGCHook;
00433 DdHook *preReorderingHook;
00434 DdHook *postReorderingHook;
00435 FILE *out;
00436 FILE *err;
00437 #ifdef __osf__
00438 #pragma pointer_size save
00439 #pragma pointer_size short
00440 #endif
00441 Cudd_ErrorType errorCode;
00442
00443 unsigned long memused;
00444 unsigned long maxmem;
00445 unsigned long maxmemhard;
00446 int garbageCollections;
00447 long GCTime;
00448 long reordTime;
00449 double totCachehits;
00450 double totCacheMisses;
00451 double cachecollisions;
00452 double cacheinserts;
00453 double cacheLastInserts;
00454 double cachedeletions;
00455 #ifdef DD_STATS
00456 double nodesFreed;
00457 double nodesDropped;
00458 #endif
00459 unsigned int peakLiveNodes;
00460 #ifdef DD_UNIQUE_PROFILE
00461 double uniqueLookUps;
00462 double uniqueLinks;
00463 #endif
00464 #ifdef DD_COUNT
00465 double recursiveCalls;
00466 #ifdef DD_STATS
00467 double nextSample;
00468 #endif
00469 double swapSteps;
00470 #endif
00471 #ifdef DD_MIS
00472
00473 array_t *iton;
00474 array_t *order;
00475 lsHandle handle;
00476 network_t *network;
00477 st_table *local_order;
00478 int nvars;
00479 int threshold;
00480 #endif
00481 };
00482
00483 typedef struct Move {
00484 DdHalfWord x;
00485 DdHalfWord y;
00486 unsigned int flags;
00487 int size;
00488 struct Move *next;
00489 } Move;
00490
00491
00492 typedef struct DdQueueItem {
00493 struct DdQueueItem *next;
00494 struct DdQueueItem *cnext;
00495 void *key;
00496 } DdQueueItem;
00497
00498
00499 typedef struct DdLevelQueue {
00500 void *first;
00501 DdQueueItem **last;
00502 DdQueueItem *freelist;
00503 DdQueueItem **buckets;
00504 int levels;
00505 int itemsize;
00506 int size;
00507 int maxsize;
00508 int numBuckets;
00509 int shift;
00510 } DdLevelQueue;
00511
00512 #ifdef __osf__
00513 #pragma pointer_size restore
00514 #endif
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00538 #define cuddDeallocNode(unique,node) \
00539 (node)->next = (unique)->nextFree; \
00540 (unique)->nextFree = node;
00541
00555 #define cuddDeallocMove(unique,node) \
00556 ((DdNode *)(node))->ref = 0; \
00557 ((DdNode *)(node))->next = (unique)->nextFree; \
00558 (unique)->nextFree = (DdNode *)(node);
00559
00560
00575 #define cuddRef(n) cuddSatInc(Cudd_Regular(n)->ref)
00576
00577
00595 #define cuddDeref(n) cuddSatDec(Cudd_Regular(n)->ref)
00596
00597
00611 #define cuddIsConstant(node) ((node)->index == CUDD_CONST_INDEX)
00612
00613
00627 #define cuddT(node) ((node)->type.kids.T)
00628
00629
00643 #define cuddE(node) ((node)->type.kids.E)
00644
00645
00659 #define cuddV(node) ((node)->type.value)
00660
00661
00677 #define cuddI(dd,index) (((index)==CUDD_CONST_INDEX)?(int)(index):(dd)->perm[(index)])
00678
00679
00695 #define cuddIZ(dd,index) (((index)==CUDD_CONST_INDEX)?(int)(index):(dd)->permZ[(index)])
00696
00697
00709 #if SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
00710 #define ddHash(f,g,s) \
00711 ((((unsigned)(ptruint)(f) * DD_P1 + \
00712 (unsigned)(ptruint)(g)) * DD_P2) >> (s))
00713 #else
00714 #define ddHash(f,g,s) \
00715 ((((unsigned)(f) * DD_P1 + (unsigned)(g)) * DD_P2) >> (s))
00716 #endif
00717
00718
00730 #if SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
00731 #define ddCHash(o,f,g,h,s) \
00732 ((((((unsigned)(ptruint)(f) + (unsigned)(ptruint)(o)) * DD_P1 + \
00733 (unsigned)(ptruint)(g)) * DD_P2 + \
00734 (unsigned)(ptruint)(h)) * DD_P3) >> (s))
00735 #else
00736 #define ddCHash(o,f,g,h,s) \
00737 ((((((unsigned)(f) + (unsigned)(o)) * DD_P1 + (unsigned)(g)) * DD_P2 + \
00738 (unsigned)(h)) * DD_P3) >> (s))
00739 #endif
00740
00741
00754 #if SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
00755 #define ddCHash2(o,f,g,s) \
00756 (((((unsigned)(ptruint)(f) + (unsigned)(ptruint)(o)) * DD_P1 + \
00757 (unsigned)(ptruint)(g)) * DD_P2) >> (s))
00758 #else
00759 #define ddCHash2(o,f,g,s) \
00760 (((((unsigned)(f) + (unsigned)(o)) * DD_P1 + (unsigned)(g)) * DD_P2) >> (s))
00761 #endif
00762
00763
00775 #define cuddClean(p) ((DdNode *)((ptruint)(p) & ~0xf))
00776
00777
00789 #define ddMin(x,y) (((y) < (x)) ? (y) : (x))
00790
00791
00803 #define ddMax(x,y) (((y) > (x)) ? (y) : (x))
00804
00805
00817 #define ddAbs(x) (((x)<0) ? -(x) : (x))
00818
00819
00832 #define ddEqualVal(x,y,e) (ddAbs((x)-(y))<(e))
00833
00834
00846 #if SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
00847 #define cuddSatInc(x) ((x)++)
00848 #else
00849 #define cuddSatInc(x) ((x) += (x) != (DdHalfWord)DD_MAXREF)
00850 #endif
00851
00852
00864 #if SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
00865 #define cuddSatDec(x) ((x)--)
00866 #else
00867 #define cuddSatDec(x) ((x) -= (x) != (DdHalfWord)DD_MAXREF)
00868 #endif
00869
00870
00882 #define DD_ONE(dd) ((dd)->one)
00883
00884
00898 #define DD_ZERO(dd) ((dd)->zero)
00899
00900
00912 #define DD_PLUS_INFINITY(dd) ((dd)->plusinfinity)
00913
00914
00926 #define DD_MINUS_INFINITY(dd) ((dd)->minusinfinity)
00927
00928
00947 #ifdef HAVE_IEEE_754
00948 #define cuddAdjust(x)
00949 #else
00950 #define cuddAdjust(x) ((x) = ((x) >= DD_CRI_HI_MARK) ? DD_PLUS_INF_VAL : (((x) <= DD_CRI_LO_MARK) ? DD_MINUS_INF_VAL : (x)))
00951 #endif
00952
00953
00966 #define DD_LSDIGIT(x) ((x) & DD_APA_MASK)
00967
00968
00981 #define DD_MSDIGIT(x) ((x) >> DD_APA_BITS)
00982
00983
00997 #ifdef DD_COUNT
00998 #ifdef DD_STATS
00999 #define statLine(dd) dd->recursiveCalls++; \
01000 if (dd->recursiveCalls == dd->nextSample) {(void) fprintf(dd->err, \
01001 "@%.0f: %u nodes %u live %.0f dropped %.0f reclaimed\n", dd->recursiveCalls, \
01002 dd->keys, dd->keys - dd->dead, dd->nodesDropped, dd->reclaimed); \
01003 dd->nextSample += 250000;}
01004 #else
01005 #define statLine(dd) dd->recursiveCalls++;
01006 #endif
01007 #else
01008 #define statLine(dd)
01009 #endif
01010
01011
01014
01015
01016
01017
01018 extern DdNode * cuddAddExistAbstractRecur (DdManager *manager, DdNode *f, DdNode *cube);
01019 extern DdNode * cuddAddUnivAbstractRecur (DdManager *manager, DdNode *f, DdNode *cube);
01020 extern DdNode * cuddAddOrAbstractRecur (DdManager *manager, DdNode *f, DdNode *cube);
01021 extern DdNode * cuddAddApplyRecur (DdManager *dd, DdNode * (*)(DdManager *, DdNode **, DdNode **), DdNode *f, DdNode *g);
01022 extern DdNode * cuddAddMonadicApplyRecur (DdManager * dd, DdNode * (*op)(DdManager *, DdNode *), DdNode * f);
01023 extern DdNode * cuddAddScalarInverseRecur (DdManager *dd, DdNode *f, DdNode *epsilon);
01024 extern DdNode * cuddAddIteRecur (DdManager *dd, DdNode *f, DdNode *g, DdNode *h);
01025 extern DdNode * cuddAddCmplRecur (DdManager *dd, DdNode *f);
01026 extern DdNode * cuddAddNegateRecur (DdManager *dd, DdNode *f);
01027 extern DdNode * cuddAddRoundOffRecur (DdManager *dd, DdNode *f, double trunc);
01028 extern DdNode * cuddUnderApprox (DdManager *dd, DdNode *f, int numVars, int threshold, int safe, double quality);
01029 extern DdNode * cuddRemapUnderApprox (DdManager *dd, DdNode *f, int numVars, int threshold, double quality);
01030 extern DdNode * cuddBiasedUnderApprox (DdManager *dd, DdNode *f, DdNode *b, int numVars, int threshold, double quality1, double quality0);
01031 extern DdNode * cuddBddAndAbstractRecur (DdManager *manager, DdNode *f, DdNode *g, DdNode *cube);
01032 extern int cuddAnnealing (DdManager *table, int lower, int upper);
01033 extern DdNode * cuddBddExistAbstractRecur (DdManager *manager, DdNode *f, DdNode *cube);
01034 extern DdNode * cuddBddXorExistAbstractRecur (DdManager *manager, DdNode *f, DdNode *g, DdNode *cube);
01035 extern DdNode * cuddBddBooleanDiffRecur (DdManager *manager, DdNode *f, DdNode *var);
01036 extern DdNode * cuddBddIteRecur (DdManager *dd, DdNode *f, DdNode *g, DdNode *h);
01037 extern DdNode * cuddBddIntersectRecur (DdManager *dd, DdNode *f, DdNode *g);
01038 extern DdNode * cuddBddAndRecur (DdManager *manager, DdNode *f, DdNode *g);
01039 extern DdNode * cuddBddXorRecur (DdManager *manager, DdNode *f, DdNode *g);
01040 extern DdNode * cuddBddTransfer (DdManager *ddS, DdManager *ddD, DdNode *f);
01041 extern DdNode * cuddAddBddDoPattern (DdManager *dd, DdNode *f);
01042 extern int cuddInitCache (DdManager *unique, unsigned int cacheSize, unsigned int maxCacheSize);
01043 extern void cuddCacheInsert (DdManager *table, ptruint op, DdNode *f, DdNode *g, DdNode *h, DdNode *data);
01044 extern void cuddCacheInsert2 (DdManager *table, DdNode * (*)(DdManager *, DdNode *, DdNode *), DdNode *f, DdNode *g, DdNode *data);
01045 extern void cuddCacheInsert1 (DdManager *table, DdNode * (*)(DdManager *, DdNode *), DdNode *f, DdNode *data);
01046 extern DdNode * cuddCacheLookup (DdManager *table, ptruint op, DdNode *f, DdNode *g, DdNode *h);
01047 extern DdNode * cuddCacheLookupZdd (DdManager *table, ptruint op, DdNode *f, DdNode *g, DdNode *h);
01048 extern DdNode * cuddCacheLookup2 (DdManager *table, DdNode * (*)(DdManager *, DdNode *, DdNode *), DdNode *f, DdNode *g);
01049 extern DdNode * cuddCacheLookup1 (DdManager *table, DdNode * (*)(DdManager *, DdNode *), DdNode *f);
01050 extern DdNode * cuddCacheLookup2Zdd (DdManager *table, DdNode * (*)(DdManager *, DdNode *, DdNode *), DdNode *f, DdNode *g);
01051 extern DdNode * cuddCacheLookup1Zdd (DdManager *table, DdNode * (*)(DdManager *, DdNode *), DdNode *f);
01052 extern DdNode * cuddConstantLookup (DdManager *table, ptruint op, DdNode *f, DdNode *g, DdNode *h);
01053 extern int cuddCacheProfile (DdManager *table, FILE *fp);
01054 extern void cuddCacheResize (DdManager *table);
01055 extern void cuddCacheFlush (DdManager *table);
01056 extern int cuddComputeFloorLog2 (unsigned int value);
01057 extern int cuddHeapProfile (DdManager *dd);
01058 extern void cuddPrintNode (DdNode *f, FILE *fp);
01059 extern void cuddPrintVarGroups (DdManager * dd, MtrNode * root, int zdd, int silent);
01060 extern DdNode * cuddBddClippingAnd (DdManager *dd, DdNode *f, DdNode *g, int maxDepth, int direction);
01061 extern DdNode * cuddBddClippingAndAbstract (DdManager *dd, DdNode *f, DdNode *g, DdNode *cube, int maxDepth, int direction);
01062 extern void cuddGetBranches (DdNode *g, DdNode **g1, DdNode **g0);
01063 extern int cuddCheckCube (DdManager *dd, DdNode *g);
01064 extern DdNode * cuddCofactorRecur (DdManager *dd, DdNode *f, DdNode *g);
01065 extern DdNode * cuddBddComposeRecur (DdManager *dd, DdNode *f, DdNode *g, DdNode *proj);
01066 extern DdNode * cuddAddComposeRecur (DdManager *dd, DdNode *f, DdNode *g, DdNode *proj);
01067 extern int cuddExact (DdManager *table, int lower, int upper);
01068 extern DdNode * cuddBddConstrainRecur (DdManager *dd, DdNode *f, DdNode *c);
01069 extern DdNode * cuddBddRestrictRecur (DdManager *dd, DdNode *f, DdNode *c);
01070 extern DdNode * cuddBddNPAndRecur (DdManager *dd, DdNode *f, DdNode *c);
01071 extern DdNode * cuddAddConstrainRecur (DdManager *dd, DdNode *f, DdNode *c);
01072 extern DdNode * cuddAddRestrictRecur (DdManager *dd, DdNode *f, DdNode *c);
01073 extern DdNode * cuddBddLICompaction (DdManager *dd, DdNode *f, DdNode *c);
01074 extern int cuddGa (DdManager *table, int lower, int upper);
01075 extern int cuddTreeSifting (DdManager *table, Cudd_ReorderingType method);
01076 extern int cuddZddInitUniv (DdManager *zdd);
01077 extern void cuddZddFreeUniv (DdManager *zdd);
01078 extern void cuddSetInteract (DdManager *table, int x, int y);
01079 extern int cuddTestInteract (DdManager *table, int x, int y);
01080 extern int cuddInitInteract (DdManager *table);
01081 extern DdLocalCache * cuddLocalCacheInit (DdManager *manager, unsigned int keySize, unsigned int cacheSize, unsigned int maxCacheSize);
01082 extern void cuddLocalCacheQuit (DdLocalCache *cache);
01083 extern void cuddLocalCacheInsert (DdLocalCache *cache, DdNodePtr *key, DdNode *value);
01084 extern DdNode * cuddLocalCacheLookup (DdLocalCache *cache, DdNodePtr *key);
01085 extern void cuddLocalCacheClearDead (DdManager *manager);
01086 extern int cuddIsInDeathRow (DdManager *dd, DdNode *f);
01087 extern int cuddTimesInDeathRow (DdManager *dd, DdNode *f);
01088 extern void cuddLocalCacheClearAll (DdManager *manager);
01089 #ifdef DD_CACHE_PROFILE
01090 extern int cuddLocalCacheProfile (DdLocalCache *cache);
01091 #endif
01092 extern DdHashTable * cuddHashTableInit (DdManager *manager, unsigned int keySize, unsigned int initSize);
01093 extern void cuddHashTableQuit (DdHashTable *hash);
01094 extern int cuddHashTableInsert (DdHashTable *hash, DdNodePtr *key, DdNode *value, ptrint count);
01095 extern DdNode * cuddHashTableLookup (DdHashTable *hash, DdNodePtr *key);
01096 extern int cuddHashTableInsert1 (DdHashTable *hash, DdNode *f, DdNode *value, ptrint count);
01097 extern DdNode * cuddHashTableLookup1 (DdHashTable *hash, DdNode *f);
01098 extern int cuddHashTableInsert2 (DdHashTable *hash, DdNode *f, DdNode *g, DdNode *value, ptrint count);
01099 extern DdNode * cuddHashTableLookup2 (DdHashTable *hash, DdNode *f, DdNode *g);
01100 extern int cuddHashTableInsert3 (DdHashTable *hash, DdNode *f, DdNode *g, DdNode *h, DdNode *value, ptrint count);
01101 extern DdNode * cuddHashTableLookup3 (DdHashTable *hash, DdNode *f, DdNode *g, DdNode *h);
01102 extern DdLevelQueue * cuddLevelQueueInit (int levels, int itemSize, int numBuckets);
01103 extern void cuddLevelQueueQuit (DdLevelQueue *queue);
01104 extern void * cuddLevelQueueEnqueue (DdLevelQueue *queue, void *key, int level);
01105 extern void cuddLevelQueueDequeue (DdLevelQueue *queue, int level);
01106 extern int cuddLinearAndSifting (DdManager *table, int lower, int upper);
01107 extern int cuddLinearInPlace (DdManager * table, int x, int y);
01108 extern void cuddUpdateInteractionMatrix (DdManager * table, int xindex, int yindex);
01109 extern int cuddInitLinear (DdManager *table);
01110 extern int cuddResizeLinear (DdManager *table);
01111 extern DdNode * cuddBddLiteralSetIntersectionRecur (DdManager *dd, DdNode *f, DdNode *g);
01112 extern DdNode * cuddCProjectionRecur (DdManager *dd, DdNode *R, DdNode *Y, DdNode *Ysupp);
01113 extern DdNode * cuddBddClosestCube (DdManager *dd, DdNode *f, DdNode *g, CUDD_VALUE_TYPE bound);
01114 extern void cuddReclaim (DdManager *table, DdNode *n);
01115 extern void cuddReclaimZdd (DdManager *table, DdNode *n);
01116 extern void cuddClearDeathRow (DdManager *table);
01117 extern void cuddShrinkDeathRow (DdManager *table);
01118 extern DdNode * cuddDynamicAllocNode (DdManager *table);
01119 extern int cuddSifting (DdManager *table, int lower, int upper);
01120 extern int cuddSwapping (DdManager *table, int lower, int upper, Cudd_ReorderingType heuristic);
01121 extern int cuddNextHigh (DdManager *table, int x);
01122 extern int cuddNextLow (DdManager *table, int x);
01123 extern int cuddSwapInPlace (DdManager *table, int x, int y);
01124 extern int cuddBddAlignToZdd (DdManager *table);
01125 extern DdNode * cuddBddMakePrime (DdManager *dd, DdNode *cube, DdNode *f);
01126 extern DdNode * cuddSolveEqnRecur (DdManager *bdd, DdNode *F, DdNode *Y, DdNode **G, int n, int *yIndex, int i);
01127 extern DdNode * cuddVerifySol (DdManager *bdd, DdNode *F, DdNode **G, int *yIndex, int n);
01128 #ifdef ST_INCLUDED
01129 extern DdNode* cuddSplitSetRecur (DdManager *manager, st_table *mtable, int *varSeen, DdNode *p, double n, double max, int index);
01130 #endif
01131 extern DdNode * cuddSubsetHeavyBranch (DdManager *dd, DdNode *f, int numVars, int threshold);
01132 extern DdNode * cuddSubsetShortPaths (DdManager *dd, DdNode *f, int numVars, int threshold, int hardlimit);
01133 extern int cuddSymmCheck (DdManager *table, int x, int y);
01134 extern int cuddSymmSifting (DdManager *table, int lower, int upper);
01135 extern int cuddSymmSiftingConv (DdManager *table, int lower, int upper);
01136 extern DdNode * cuddAllocNode (DdManager *unique);
01137 extern DdManager * cuddInitTable (unsigned int numVars, unsigned int numVarsZ, unsigned int numSlots, unsigned int looseUpTo);
01138 extern void cuddFreeTable (DdManager *unique);
01139 extern int cuddGarbageCollect (DdManager *unique, int clearCache);
01140 extern DdNode * cuddZddGetNode (DdManager *zdd, int id, DdNode *T, DdNode *E);
01141 extern DdNode * cuddZddGetNodeIVO (DdManager *dd, int index, DdNode *g, DdNode *h);
01142 extern DdNode * cuddUniqueInter (DdManager *unique, int index, DdNode *T, DdNode *E);
01143 extern DdNode * cuddUniqueInterIVO (DdManager *unique, int index, DdNode *T, DdNode *E);
01144 extern DdNode * cuddUniqueInterZdd (DdManager *unique, int index, DdNode *T, DdNode *E);
01145 extern DdNode * cuddUniqueConst (DdManager *unique, CUDD_VALUE_TYPE value);
01146 extern void cuddRehash (DdManager *unique, int i);
01147 extern void cuddShrinkSubtable (DdManager *unique, int i);
01148 extern int cuddInsertSubtables (DdManager *unique, int n, int level);
01149 extern int cuddDestroySubtables (DdManager *unique, int n);
01150 extern int cuddResizeTableZdd (DdManager *unique, int index);
01151 extern void cuddSlowTableGrowth (DdManager *unique);
01152 extern int cuddP (DdManager *dd, DdNode *f);
01153 #ifdef ST_INCLUDED
01154 extern enum st_retval cuddStCountfree (char *key, char *value, char *arg);
01155 extern int cuddCollectNodes (DdNode *f, st_table *visited);
01156 #endif
01157 extern DdNodePtr * cuddNodeArray (DdNode *f, int *n);
01158 extern int cuddWindowReorder (DdManager *table, int low, int high, Cudd_ReorderingType submethod);
01159 extern DdNode * cuddZddProduct (DdManager *dd, DdNode *f, DdNode *g);
01160 extern DdNode * cuddZddUnateProduct (DdManager *dd, DdNode *f, DdNode *g);
01161 extern DdNode * cuddZddWeakDiv (DdManager *dd, DdNode *f, DdNode *g);
01162 extern DdNode * cuddZddWeakDivF (DdManager *dd, DdNode *f, DdNode *g);
01163 extern DdNode * cuddZddDivide (DdManager *dd, DdNode *f, DdNode *g);
01164 extern DdNode * cuddZddDivideF (DdManager *dd, DdNode *f, DdNode *g);
01165 extern int cuddZddGetCofactors3 (DdManager *dd, DdNode *f, int v, DdNode **f1, DdNode **f0, DdNode **fd);
01166 extern int cuddZddGetCofactors2 (DdManager *dd, DdNode *f, int v, DdNode **f1, DdNode **f0);
01167 extern DdNode * cuddZddComplement (DdManager *dd, DdNode *node);
01168 extern int cuddZddGetPosVarIndex(DdManager * dd, int index);
01169 extern int cuddZddGetNegVarIndex(DdManager * dd, int index);
01170 extern int cuddZddGetPosVarLevel(DdManager * dd, int index);
01171 extern int cuddZddGetNegVarLevel(DdManager * dd, int index);
01172 extern int cuddZddTreeSifting (DdManager *table, Cudd_ReorderingType method);
01173 extern DdNode * cuddZddIsop (DdManager *dd, DdNode *L, DdNode *U, DdNode **zdd_I);
01174 extern DdNode * cuddBddIsop (DdManager *dd, DdNode *L, DdNode *U);
01175 extern DdNode * cuddMakeBddFromZddCover (DdManager *dd, DdNode *node);
01176 extern int cuddZddLinearSifting (DdManager *table, int lower, int upper);
01177 extern int cuddZddAlignToBdd (DdManager *table);
01178 extern int cuddZddNextHigh (DdManager *table, int x);
01179 extern int cuddZddNextLow (DdManager *table, int x);
01180 extern int cuddZddUniqueCompare (int *ptr_x, int *ptr_y);
01181 extern int cuddZddSwapInPlace (DdManager *table, int x, int y);
01182 extern int cuddZddSwapping (DdManager *table, int lower, int upper, Cudd_ReorderingType heuristic);
01183 extern int cuddZddSifting (DdManager *table, int lower, int upper);
01184 extern DdNode * cuddZddIte (DdManager *dd, DdNode *f, DdNode *g, DdNode *h);
01185 extern DdNode * cuddZddUnion (DdManager *zdd, DdNode *P, DdNode *Q);
01186 extern DdNode * cuddZddIntersect (DdManager *zdd, DdNode *P, DdNode *Q);
01187 extern DdNode * cuddZddDiff (DdManager *zdd, DdNode *P, DdNode *Q);
01188 extern DdNode * cuddZddChangeAux (DdManager *zdd, DdNode *P, DdNode *zvar);
01189 extern DdNode * cuddZddSubset1 (DdManager *dd, DdNode *P, int var);
01190 extern DdNode * cuddZddSubset0 (DdManager *dd, DdNode *P, int var);
01191 extern DdNode * cuddZddChange (DdManager *dd, DdNode *P, int var);
01192 extern int cuddZddSymmCheck (DdManager *table, int x, int y);
01193 extern int cuddZddSymmSifting (DdManager *table, int lower, int upper);
01194 extern int cuddZddSymmSiftingConv (DdManager *table, int lower, int upper);
01195 extern int cuddZddP (DdManager *zdd, DdNode *f);
01196
01199 #ifdef __cplusplus
01200 }
01201 #endif
01202
01203 #endif