/**CHeaderFile*****************************************************************

  FileName    [cuddInt.h]

  PackageName [cudd]

  Synopsis    [Internal data structures of the CUDD package.]

  Description []

  SeeAlso     []

  Author      [Fabio Somenzi]

  Copyright   [Copyright (c) 1995-2004, Regents of the University of Colorado

  All rights reserved.

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions
  are met:

  Redistributions of source code must retain the above copyright
  notice, this list of conditions and the following disclaimer.

  Redistributions in binary form must reproduce the above copyright
  notice, this list of conditions and the following disclaimer in the
  documentation and/or other materials provided with the distribution.

  Neither the name of the University of Colorado nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.]

  Revision    [$Id: cuddInt.h,v 1.139 2009/03/08 02:49:02 fabio Exp $]

******************************************************************************/

#ifndef ABC__bdd__cudd__cuddInt_h
#define ABC__bdd__cudd__cuddInt_h


/*---------------------------------------------------------------------------*/
/* Nested includes                                                           */
/*---------------------------------------------------------------------------*/

#ifdef DD_MIS
#include "array.h"
#include "list.h"
#include "misc/st/st.h"
#include "misc/espresso/espresso.h"
#include "node.h"
#ifdef SIS
#include "graph.h"
#include "astg.h"
#endif
#include "network.h"
#endif

#include <math.h>
#include "cudd.h"
#include "misc/st/st.h"

ABC_NAMESPACE_HEADER_START


#if defined(__GNUC__)
# define DD_INLINE __inline__
# if (__GNUC__ >2 || __GNUC_MINOR__ >=7)
#   define DD_UNUSED __attribute__ ((__unused__))
# else
#   define DD_UNUSED
# endif
#else
# if defined(__cplusplus)
#   define DD_INLINE inline
# else
#   define DD_INLINE
# endif
# define DD_UNUSED
#endif


/*---------------------------------------------------------------------------*/
/* Constant declarations                                                     */
/*---------------------------------------------------------------------------*/

#define DD_MAXREF               ((DdHalfWord) ~0)

#define DD_DEFAULT_RESIZE       10      /* how many extra variables */
                                        /* should be added when resizing */
#define DD_MEM_CHUNK            1022

/* These definitions work for CUDD_VALUE_TYPE == double */
#define DD_ONE_VAL              (1.0)
#define DD_ZERO_VAL             (0.0)
#define DD_EPSILON              (1.0e-12)

/* The definitions of +/- infinity in terms of HUGE_VAL work on
** the DECstations and on many other combinations of OS/compiler.
*/
#ifdef HAVE_IEEE_754
#  define DD_PLUS_INF_VAL       (HUGE_VAL)
#else
#  define DD_PLUS_INF_VAL       (10e301)
#  define DD_CRI_HI_MARK        (10e150)
#  define DD_CRI_LO_MARK        (-(DD_CRI_HI_MARK))
#endif
#define DD_MINUS_INF_VAL        (-(DD_PLUS_INF_VAL))

#define DD_NON_CONSTANT         ((DdNode *) 1)  /* for Cudd_bddIteConstant */

/* Unique table and cache management constants. */
#define DD_MAX_SUBTABLE_DENSITY 4       /* tells when to resize a subtable */
/* gc when this percent are dead (measured w.r.t. slots, not keys)
** The first limit (LO) applies normally. The second limit applies when
** the package believes more space for the unique table (i.e., more dead
** nodes) would improve performance, and the unique table is not already
** too large. The third limit applies when memory is low.
*/
#define DD_GC_FRAC_LO           DD_MAX_SUBTABLE_DENSITY * 0.25
#define DD_GC_FRAC_HI           DD_MAX_SUBTABLE_DENSITY * 1.0
#define DD_GC_FRAC_MIN          0.2
#define DD_MIN_HIT              30      /* resize cache when hit ratio
                                           above this percentage (default) */
#define DD_MAX_LOOSE_FRACTION   5 /* 1 / (max fraction of memory used for
                                     unique table in fast growth mode) */
#define DD_MAX_CACHE_FRACTION   3 /* 1 / (max fraction of memory used for
                                     computed table if resizing enabled) */
#define DD_STASH_FRACTION       64 /* 1 / (fraction of memory set
                                      aside for emergencies) */
#define DD_MAX_CACHE_TO_SLOTS_RATIO 4 /* used to limit the cache size */

/* Variable ordering default parameter values. */
#define DD_SIFT_MAX_VAR         1000
#define DD_SIFT_MAX_SWAPS       2000000
#define DD_DEFAULT_RECOMB       0
#define DD_MAX_REORDER_GROWTH   1.1
#define DD_FIRST_REORDER        4004    /* 4 for the constants */
#define DD_DYN_RATIO            2       /* when to dynamically reorder */

/* Primes for cache hash functions. */
#define DD_P1                   12582917
#define DD_P2                   4256249
#define DD_P3                   741457
#define DD_P4                   1618033999

/* Cache tags for 3-operand operators.  These tags are stored in the
** least significant bits of the cache operand pointers according to
** the following scheme.  The tag consists of two hex digits.  Both digits
** must be even, so that they do not interfere with complementation bits.
** The least significant one is stored in Bits 3:1 of the f operand in the
** cache entry.  Bit 1 is always 1, so that we can differentiate
** three-operand operations from one- and two-operand operations.
** Therefore, the least significant digit is one of {2,6,a,e}.  The most
** significant digit occupies Bits 3:1 of the g operand in the cache
** entry.  It can by any even digit between 0 and e.  This gives a total
** of 5 bits for the tag proper, which means a maximum of 32 three-operand
** operations. */
#define DD_ADD_ITE_TAG                          0x02
#define DD_BDD_AND_ABSTRACT_TAG                 0x06
#define DD_BDD_XOR_EXIST_ABSTRACT_TAG           0x0a
#define DD_BDD_ITE_TAG                          0x0e
#define DD_ADD_BDD_DO_INTERVAL_TAG              0x22
#define DD_BDD_CLIPPING_AND_ABSTRACT_UP_TAG     0x26
#define DD_BDD_CLIPPING_AND_ABSTRACT_DOWN_TAG   0x2a
#define DD_BDD_COMPOSE_RECUR_TAG                0x2e
#define DD_ADD_COMPOSE_RECUR_TAG                0x42
#define DD_ADD_NON_SIM_COMPOSE_TAG              0x46
#define DD_EQUIV_DC_TAG                         0x4a
#define DD_ZDD_ITE_TAG                          0x4e
#define DD_ADD_ITE_CONSTANT_TAG                 0x62
#define DD_ADD_EVAL_CONST_TAG                   0x66
#define DD_BDD_ITE_CONSTANT_TAG                 0x6a
#define DD_ADD_OUT_SUM_TAG                      0x6e
#define DD_BDD_LEQ_UNLESS_TAG                   0x82
#define DD_ADD_TRIANGLE_TAG                     0x86

/* Generator constants. */
#define CUDD_GEN_CUBES 0
#define CUDD_GEN_PRIMES 1
#define CUDD_GEN_NODES 2
#define CUDD_GEN_ZDD_PATHS 3
#define CUDD_GEN_EMPTY 0
#define CUDD_GEN_NONEMPTY 1


/*---------------------------------------------------------------------------*/
/* Stucture declarations                                                     */
/*---------------------------------------------------------------------------*/

struct DdGen {
    DdManager   *manager;
    int         type;
    int         status;
    union {
        struct {
            int                 *cube;
            CUDD_VALUE_TYPE     value;
        } cubes;
        struct {
            int                 *cube;
            DdNode              *ub;
        } primes;
        struct {
            int                 size;
        } nodes;
    } gen;
    struct {
        int     sp;
#ifdef __osf__
#pragma pointer_size save
#pragma pointer_size short
#endif
        DdNode  **stack;
#ifdef __osf__
#pragma pointer_size restore
#endif
    } stack;
    DdNode      *node;
};


/*---------------------------------------------------------------------------*/
/* Type declarations                                                         */
/*---------------------------------------------------------------------------*/

/* Hooks in CUDD are functions that the application registers with the
** manager so that they are called at appropriate times. The functions
** are passed the manager as argument; they should return 1 if
** successful and 0 otherwise.
*/
typedef struct DdHook {         /* hook list element */
    DD_HFP f; /* function to be called */
    struct DdHook *next;        /* next element in the list */
} DdHook;

/*
#if SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
typedef long ptrint;
typedef unsigned long ptruint;
#else
typedef int ptrint;
typedef unsigned int ptruint;
#endif
*/

typedef ABC_PTRINT_T ptrint;
typedef ABC_PTRUINT_T ptruint;

#ifdef __osf__
#pragma pointer_size save
#pragma pointer_size short
#endif

typedef DdNode *DdNodePtr;

/* Generic local cache item. */
typedef struct DdLocalCacheItem {
    DdNode *value;
#ifdef DD_CACHE_PROFILE
    ptrint count;
#endif
    DdNode *key[1];
} DdLocalCacheItem;

/* Local cache. */
typedef struct DdLocalCache {
    DdLocalCacheItem *item;
    unsigned int itemsize;
    unsigned int keysize;
    unsigned int slots;
    int shift;
    double lookUps;
    double minHit;
    double hits;
    unsigned int maxslots;
    DdManager *manager;
    struct DdLocalCache *next;
} DdLocalCache;

/* Generic hash item. */
typedef struct DdHashItem {
    struct DdHashItem *next;
    ptrint count;
    DdNode *value;
    DdNode *key[1];
} DdHashItem;

/* Local hash table */
typedef struct DdHashTable {
    unsigned int keysize;
    unsigned int itemsize;
    DdHashItem **bucket;
    DdHashItem *nextFree;
    DdHashItem **memoryList;
    unsigned int numBuckets;
    int shift;
    unsigned int size;
    unsigned int maxsize;
    DdManager *manager;
} DdHashTable;

typedef struct DdCache {
    DdNode *f,*g;               /* DDs */
    ptruint h;                  /* either operator or DD */
    DdNode *data;               /* already constructed DD */
#ifdef DD_CACHE_PROFILE
    ptrint count;
#endif
    unsigned hash;
} DdCache;

typedef struct DdSubtable {     /* subtable for one index */
    DdNode **nodelist;          /* hash table */
    int shift;                  /* shift for hash function */
    unsigned int slots;         /* size of the hash table */
    unsigned int keys;          /* number of nodes stored in this table */
    unsigned int maxKeys;       /* slots * DD_MAX_SUBTABLE_DENSITY */
    unsigned int dead;          /* number of dead nodes in this table */
    unsigned int next;          /* index of next variable in group */
    int bindVar;                /* flag to bind this variable to its level */
    /* Fields for lazy sifting. */
    Cudd_VariableType varType;  /* variable type (ps, ns, pi) */
    int pairIndex;              /* corresponding variable index (ps <-> ns) */
    int varHandled;             /* flag: 1 means variable is already handled */
    Cudd_LazyGroupType varToBeGrouped; /* tells what grouping to apply */
} DdSubtable;

struct DdManager {      /* specialized DD symbol table */
    /* Constants */
    DdNode sentinel;            /* for collision lists */
    DdNode *one;                /* constant 1 */
    DdNode *zero;               /* constant 0 */
    DdNode *plusinfinity;       /* plus infinity */
    DdNode *minusinfinity;      /* minus infinity */
    DdNode *background;         /* background value */
    /* Computed Table */
    DdCache *acache;            /* address of allocated memory for cache */
    DdCache *cache;             /* the cache-based computed table */
    unsigned int cacheSlots;    /* total number of cache entries */
    int cacheShift;             /* shift value for cache hash function */
    double cacheMisses;         /* number of cache misses (since resizing) */
    double cacheHits;           /* number of cache hits (since resizing) */
    double minHit;              /* hit percentage above which to resize */
    int cacheSlack;             /* slots still available for resizing */
    unsigned int maxCacheHard;  /* hard limit for cache size */
    /* Unique Table */
    int size;                   /* number of unique subtables */
    int sizeZ;                  /* for ZDD */
    int maxSize;                /* max number of subtables before resizing */
    int maxSizeZ;               /* for ZDD */
    DdSubtable *subtables;      /* array of unique subtables */
    DdSubtable *subtableZ;      /* for ZDD */
    DdSubtable constants;       /* unique subtable for the constants */
    unsigned int slots;         /* total number of hash buckets */
    unsigned int keys;          /* total number of BDD and ADD nodes */
    unsigned int keysZ;         /* total number of ZDD nodes */
    unsigned int dead;          /* total number of dead BDD and ADD nodes */
    unsigned int deadZ;         /* total number of dead ZDD nodes */
    unsigned int maxLive;       /* maximum number of live nodes */
    unsigned int minDead;       /* do not GC if fewer than these dead */
    double gcFrac;              /* gc when this fraction is dead */
    int gcEnabled;              /* gc is enabled */
    unsigned int looseUpTo;     /* slow growth beyond this limit */
                                /* (measured w.r.t. slots, not keys) */
    unsigned int initSlots;     /* initial size of a subtable */
    DdNode **stack;             /* stack for iterative procedures */
//    double allocated;           /* number of nodes allocated */
    ABC_INT64_T allocated;      /* number of nodes allocated */
                                /* (not during reordering) */
    double reclaimed;           /* number of nodes brought back from the dead */
    int isolated;               /* isolated projection functions */
    int *perm;                  /* current variable perm. (index to level) */
    int *permZ;                 /* for ZDD */
    int *invperm;               /* current inv. var. perm. (level to index) */
    int *invpermZ;              /* for ZDD */
    DdNode **vars;              /* projection functions */
    int *map;                   /* variable map for fast swap */
    DdNode **univ;              /* ZDD 1 for each variable */
    int linearSize;             /* number of rows and columns of linear */
    long *interact;             /* interacting variable matrix */
    long *linear;               /* linear transform matrix */
    /* Memory Management */
    DdNode **memoryList;        /* memory manager for symbol table */
    DdNode *nextFree;           /* list of free nodes */
    char *stash;                /* memory reserve */
#ifndef DD_NO_DEATH_ROW
    DdNode **deathRow;          /* queue for dereferencing */
    int deathRowDepth;          /* number of slots in the queue */
    int nextDead;               /* index in the queue */
    unsigned deadMask;          /* mask for circular index update */
#endif
    /* General Parameters */
    CUDD_VALUE_TYPE epsilon;    /* tolerance on comparisons */
    /* Dynamic Reordering Parameters */
    int reordered;              /* flag set at the end of reordering */
    int reorderings;            /* number of calls to Cudd_ReduceHeap */
    int siftMaxVar;             /* maximum number of vars sifted */
    int siftMaxSwap;            /* maximum number of swaps per sifting */
    double maxGrowth;           /* maximum growth during reordering */
    double maxGrowthAlt;        /* alternate maximum growth for reordering */
    int reordCycle;             /* how often to apply alternate threshold */
    int autoDyn;                /* automatic dynamic reordering flag (BDD) */
    int autoDynZ;               /* automatic dynamic reordering flag (ZDD) */
    Cudd_ReorderingType autoMethod;  /* default reordering method */
    Cudd_ReorderingType autoMethodZ; /* default reordering method (ZDD) */
    int realign;                /* realign ZDD order after BDD reordering */
    int realignZ;               /* realign BDD order after ZDD reordering */
    unsigned int nextDyn;       /* reorder if this size is reached */
    unsigned int countDead;     /* if 0, count deads to trigger reordering */
    MtrNode *tree;              /* Variable group tree (BDD) */
    MtrNode *treeZ;             /* Variable group tree (ZDD) */
    Cudd_AggregationType groupcheck; /* Used during group sifting */
    int recomb;                 /* Used during group sifting */
    int symmviolation;          /* Used during group sifting */
    int arcviolation;           /* Used during group sifting */
    int populationSize;         /* population size for GA */
    int numberXovers;           /* number of crossovers for GA */
    DdLocalCache *localCaches;  /* local caches currently in existence */
#ifdef __osf__
#pragma pointer_size restore
#endif
    char *hooks;                /* application-specific field (used by vis) */
    DdHook *preGCHook;          /* hooks to be called before GC */
    DdHook *postGCHook;         /* hooks to be called after GC */
    DdHook *preReorderingHook;  /* hooks to be called before reordering */
    DdHook *postReorderingHook; /* hooks to be called after reordering */
    FILE *out;                  /* stdout for this manager */
    FILE *err;                  /* stderr for this manager */
#ifdef __osf__
#pragma pointer_size save
#pragma pointer_size short
#endif
    Cudd_ErrorType errorCode;   /* info on last error */
    /* Statistical counters. */
    unsigned long memused;      /* total memory allocated for the manager */
    unsigned long maxmem;       /* target maximum memory */
    unsigned long maxmemhard;   /* hard limit for maximum memory */
    int garbageCollections;     /* number of garbage collections */
    long GCTime;                /* total time spent in garbage collection */
    long reordTime;             /* total time spent in reordering */
    double totCachehits;        /* total number of cache hits */
    double totCacheMisses;      /* total number of cache misses */
    double cachecollisions;     /* number of cache collisions */
    double cacheinserts;        /* number of cache insertions */
    double cacheLastInserts;    /* insertions at the last cache resizing */
    double cachedeletions;      /* number of deletions during garbage coll. */
#ifdef DD_STATS
    double nodesFreed;          /* number of nodes returned to the free list */
    double nodesDropped;        /* number of nodes killed by dereferencing */
#endif
    unsigned int peakLiveNodes; /* maximum number of live nodes */
#ifdef DD_UNIQUE_PROFILE
    double uniqueLookUps;       /* number of unique table lookups */
    double uniqueLinks;         /* total distance traveled in coll. chains */
#endif
#ifdef DD_COUNT
    double recursiveCalls;      /* number of recursive calls */
#ifdef DD_STATS
    double nextSample;          /* when to write next line of stats */
#endif
    double swapSteps;           /* number of elementary reordering steps */
#endif
#ifdef DD_MIS
    /* mis/verif compatibility fields */
    array_t *iton;              /* maps ids in ddNode to node_t */
    array_t *order;             /* copy of order_list */
    lsHandle handle;            /* where it is in network BDD list */
    network_t *network;
    st__table *local_order;      /* for local BDDs */
    int nvars;                  /* variables used so far */
    int threshold;              /* for pseudo var threshold value*/
#endif
    DdNode * bFunc;
    DdNode * bFunc2;
    abctime TimeStop;           /* timeout for reordering */
};

typedef struct Move {
    DdHalfWord x;
    DdHalfWord y;
    unsigned int flags;
    int size;
    struct Move *next;
} Move;

/* Generic level queue item. */
typedef struct DdQueueItem {
    struct DdQueueItem *next;
    struct DdQueueItem *cnext;
    void *key;
} DdQueueItem;

/* Level queue. */
typedef struct DdLevelQueue {
    void *first;
    DdQueueItem **last;
    DdQueueItem *freelist;
    DdQueueItem **buckets;
    int levels;
    int itemsize;
    int size;
    int maxsize;
    int numBuckets;
    int shift;
} DdLevelQueue;

#ifdef __osf__
#pragma pointer_size restore
#endif

/*---------------------------------------------------------------------------*/
/* Variable declarations                                                     */
/*---------------------------------------------------------------------------*/


/*---------------------------------------------------------------------------*/
/* Macro declarations                                                        */
/*---------------------------------------------------------------------------*/

/**Macro***********************************************************************

  Synopsis    [Adds node to the head of the free list.]

  Description [Adds node to the head of the free list.  Does not
  deallocate memory chunks that become free.  This function is also
  used by the dynamic reordering functions.]

  SideEffects [None]

  SeeAlso     [cuddAllocNode cuddDynamicAllocNode cuddDeallocMove]

******************************************************************************/
#define cuddDeallocNode(unique,node) \
    (node)->next = (unique)->nextFree; \
    (unique)->nextFree = node;

/**Macro***********************************************************************

  Synopsis    [Adds node to the head of the free list.]

  Description [Adds node to the head of the free list.  Does not
  deallocate memory chunks that become free.  This function is also
  used by the dynamic reordering functions.]

  SideEffects [None]

  SeeAlso     [cuddDeallocNode cuddDynamicAllocNode]

******************************************************************************/
#define cuddDeallocMove(unique,node) \
    ((DdNode *)(node))->ref = 0; \
    ((DdNode *)(node))->next = (unique)->nextFree; \
    (unique)->nextFree = (DdNode *)(node);


/**Macro***********************************************************************

  Synopsis     [Increases the reference count of a node, if it is not
  saturated.]

  Description  [Increases the reference count of a node, if it is not
  saturated. This being a macro, it is faster than Cudd_Ref, but it
  cannot be used in constructs like cuddRef(a = b()).]

  SideEffects  [none]

  SeeAlso      [Cudd_Ref]

******************************************************************************/
#define cuddRef(n) cuddSatInc(Cudd_Regular(n)->ref)


/**Macro***********************************************************************

  Synopsis     [Decreases the reference count of a node, if it is not
  saturated.]

  Description  [Decreases the reference count of node. It is primarily
  used in recursive procedures to decrease the ref count of a result
  node before returning it. This accomplishes the goal of removing the
  protection applied by a previous cuddRef. This being a macro, it is
  faster than Cudd_Deref, but it cannot be used in constructs like
  cuddDeref(a = b()).]

  SideEffects  [none]

  SeeAlso      [Cudd_Deref]

******************************************************************************/
#define cuddDeref(n) cuddSatDec(Cudd_Regular(n)->ref)


/**Macro***********************************************************************

  Synopsis     [Returns 1 if the node is a constant node.]

  Description  [Returns 1 if the node is a constant node (rather than an
  internal node). All constant nodes have the same index
  (CUDD_CONST_INDEX). The pointer passed to cuddIsConstant must be regular.]

  SideEffects  [none]

  SeeAlso      [Cudd_IsConstant]

******************************************************************************/
#define cuddIsConstant(node) ((node)->index == CUDD_CONST_INDEX)


/**Macro***********************************************************************

  Synopsis     [Returns the then child of an internal node.]

  Description  [Returns the then child of an internal node. If
  <code>node</code> is a constant node, the result is unpredictable.
  The pointer passed to cuddT must be regular.]

  SideEffects  [none]

  SeeAlso      [Cudd_T]

******************************************************************************/
#define cuddT(node) ((node)->type.kids.T)


/**Macro***********************************************************************

  Synopsis     [Returns the else child of an internal node.]

  Description  [Returns the else child of an internal node. If
  <code>node</code> is a constant node, the result is unpredictable.
  The pointer passed to cuddE must be regular.]

  SideEffects  [none]

  SeeAlso      [Cudd_E]

******************************************************************************/
#define cuddE(node) ((node)->type.kids.E)


/**Macro***********************************************************************

  Synopsis     [Returns the value of a constant node.]

  Description  [Returns the value of a constant node. If
  <code>node</code> is an internal node, the result is unpredictable.
  The pointer passed to cuddV must be regular.]

  SideEffects  [none]

  SeeAlso      [Cudd_V]

******************************************************************************/
#define cuddV(node) ((node)->type.value)


/**Macro***********************************************************************

  Synopsis    [Finds the current position of variable index in the
  order.]

  Description [Finds the current position of variable index in the
  order.  This macro duplicates the functionality of Cudd_ReadPerm,
  but it does not check for out-of-bounds indices and it is more
  efficient.]

  SideEffects [none]

  SeeAlso     [Cudd_ReadPerm]

******************************************************************************/
#define cuddI(dd,index) (((index)==CUDD_CONST_INDEX)?(int)(index):(dd)->perm[(index)])


/**Macro***********************************************************************

  Synopsis    [Finds the current position of ZDD variable index in the
  order.]

  Description [Finds the current position of ZDD variable index in the
  order.  This macro duplicates the functionality of Cudd_ReadPermZdd,
  but it does not check for out-of-bounds indices and it is more
  efficient.]

  SideEffects [none]

  SeeAlso     [Cudd_ReadPermZdd]

******************************************************************************/
#define cuddIZ(dd,index) (((index)==CUDD_CONST_INDEX)?(int)(index):(dd)->permZ[(index)])


/**Macro***********************************************************************

  Synopsis    [Converts pointer into a literal.]

  Description []

  SideEffects []

  SeeAlso     []

******************************************************************************/
#define cuddF2L(f) ((Cudd_Regular(f)->Id << 1) | Cudd_IsComplement(f))


/**Macro***********************************************************************

  Synopsis    [Hash function for the unique table.]

  Description []

  SideEffects [none]

  SeeAlso     [ddCHash ddCHash2]

******************************************************************************/
#if SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
#define ddHash(f,g,s) \
((((unsigned)(ptruint)(f) * DD_P1 + \
   (unsigned)(ptruint)(g)) * DD_P2) >> (s))
#else
#define ddHash(f,g,s) \
((((unsigned)(f) * DD_P1 + (unsigned)(g)) * DD_P2) >> (s))
#endif


/**Macro***********************************************************************

  Synopsis    [Hash function for the cache.]

  Description []

  SideEffects [none]

  SeeAlso     [ddHash ddCHash2]

******************************************************************************/
/*
#if SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
#define ddCHash(o,f,g,h,s) \
((((((unsigned)(ptruint)(f) + (unsigned)(ptruint)(o)) * DD_P1 + \
    (unsigned)(ptruint)(g)) * DD_P2 + \
   (unsigned)(ptruint)(h)) * DD_P3) >> (s))
#else
#define ddCHash(o,f,g,h,s) \
((((((unsigned)(f) + (unsigned)(o)) * DD_P1 + (unsigned)(g)) * DD_P2 + \
   (unsigned)(h)) * DD_P3) >> (s))
#endif
*/

/**Macro***********************************************************************

  Synopsis    [Hash function for the cache for functions with two
  operands.]

  Description []

  SideEffects [none]

  SeeAlso     [ddHash ddCHash]

******************************************************************************/
#if SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
#define ddCHash2(o,f,g,s) \
(((((unsigned)(ptruint)(f) + (unsigned)(ptruint)(o)) * DD_P1 + \
   (unsigned)(ptruint)(g)) * DD_P2) >> (s))
#define ddCHash2_(o,f,g) \
(((((unsigned)(ptruint)(f) + (unsigned)(ptruint)(o)) * DD_P1 + \
   (unsigned)(ptruint)(g)) * DD_P2))
#else
#define ddCHash2(o,f,g,s) \
(((((unsigned)(f) + (unsigned)(o)) * DD_P1 + (unsigned)(g)) * DD_P2) >> (s))
#define ddCHash2_(o,f,g) \
(((((unsigned)(f) + (unsigned)(o)) * DD_P1 + (unsigned)(g)) * DD_P2))
#endif


/**Macro***********************************************************************

  Synopsis    [Clears the 4 least significant bits of a pointer.]

  Description []

  SideEffects [none]

  SeeAlso     []

******************************************************************************/
#define cuddClean(p) ((DdNode *)((ptruint)(p) & ~0xf))


/**Macro***********************************************************************

  Synopsis    [Computes the minimum of two numbers.]

  Description []

  SideEffects [none]

  SeeAlso     [ddMax]

******************************************************************************/
#define ddMin(x,y) (((y) < (x)) ? (y) : (x))


/**Macro***********************************************************************

  Synopsis    [Computes the maximum of two numbers.]

  Description []

  SideEffects [none]

  SeeAlso     [ddMin]

******************************************************************************/
#define ddMax(x,y) (((y) > (x)) ? (y) : (x))


/**Macro***********************************************************************

  Synopsis    [Computes the absolute value of a number.]

  Description []

  SideEffects [none]

  SeeAlso     []

******************************************************************************/
#define ddAbs(x) (((x)<0) ? -(x) : (x))


/**Macro***********************************************************************

  Synopsis    [Returns 1 if the absolute value of the difference of the two
  arguments x and y is less than e.]

  Description []

  SideEffects [none]

  SeeAlso     []

******************************************************************************/
#define ddEqualVal(x,y,e) (ddAbs((x)-(y))<(e))


/**Macro***********************************************************************

  Synopsis    [Saturating increment operator.]

  Description []

  SideEffects [none]

  SeeAlso     [cuddSatDec]

******************************************************************************/
#if SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
#define cuddSatInc(x) ((x)++)
#else
#define cuddSatInc(x) ((x) += (x) != (DdHalfWord)DD_MAXREF)
#endif


/**Macro***********************************************************************

  Synopsis    [Saturating decrement operator.]

  Description []

  SideEffects [none]

  SeeAlso     [cuddSatInc]

******************************************************************************/
#if SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
#define cuddSatDec(x) ((x)--)
#else
#define cuddSatDec(x) ((x) -= (x) != (DdHalfWord)DD_MAXREF)
#endif


/**Macro***********************************************************************

  Synopsis    [Returns the constant 1 node.]

  Description []

  SideEffects [none]

  SeeAlso     [DD_ZERO DD_PLUS_INFINITY DD_MINUS_INFINITY]

******************************************************************************/
#define DD_ONE(dd)              ((dd)->one)


/**Macro***********************************************************************

  Synopsis    [Returns the arithmetic 0 constant node.]

  Description [Returns the arithmetic 0 constant node. This is different
  from the logical zero. The latter is obtained by
  Cudd_Not(DD_ONE(dd)).]

  SideEffects [none]

  SeeAlso     [DD_ONE Cudd_Not DD_PLUS_INFINITY DD_MINUS_INFINITY]

******************************************************************************/
#define DD_ZERO(dd) ((dd)->zero)


/**Macro***********************************************************************

  Synopsis    [Returns the plus infinity constant node.]

  Description []

  SideEffects [none]

  SeeAlso     [DD_ONE DD_ZERO DD_MINUS_INFINITY]

******************************************************************************/
#define DD_PLUS_INFINITY(dd) ((dd)->plusinfinity)


/**Macro***********************************************************************

  Synopsis    [Returns the minus infinity constant node.]

  Description []

  SideEffects [none]

  SeeAlso     [DD_ONE DD_ZERO DD_PLUS_INFINITY]

******************************************************************************/
#define DD_MINUS_INFINITY(dd) ((dd)->minusinfinity)


/**Macro***********************************************************************

  Synopsis    [Enforces DD_MINUS_INF_VAL <= x <= DD_PLUS_INF_VAL.]

  Description [Enforces DD_MINUS_INF_VAL <= x <= DD_PLUS_INF_VAL.
  Furthermore, if x <= DD_MINUS_INF_VAL/2, x is set to
  DD_MINUS_INF_VAL. Similarly, if DD_PLUS_INF_VAL/2 <= x, x is set to
  DD_PLUS_INF_VAL.  Normally this macro is a NOOP. However, if
  HAVE_IEEE_754 is not defined, it makes sure that a value does not
  get larger than infinity in absolute value, and once it gets to
  infinity, stays there.  If the value overflows before this macro is
  applied, no recovery is possible.]

  SideEffects [none]

  SeeAlso     []

******************************************************************************/
#ifdef HAVE_IEEE_754
#define cuddAdjust(x)
#else
#define cuddAdjust(x)           ((x) = ((x) >= DD_CRI_HI_MARK) ? DD_PLUS_INF_VAL : (((x) <= DD_CRI_LO_MARK) ? DD_MINUS_INF_VAL : (x)))
#endif


/**Macro***********************************************************************

  Synopsis    [Extract the least significant digit of a double digit.]

  Description [Extract the least significant digit of a double digit. Used
  in the manipulation of arbitrary precision integers.]

  SideEffects [None]

  SeeAlso     [DD_MSDIGIT]

******************************************************************************/
#define DD_LSDIGIT(x)   ((x) & DD_APA_MASK)


/**Macro***********************************************************************

  Synopsis    [Extract the most significant digit of a double digit.]

  Description [Extract the most significant digit of a double digit. Used
  in the manipulation of arbitrary precision integers.]

  SideEffects [None]

  SeeAlso     [DD_LSDIGIT]

******************************************************************************/
#define DD_MSDIGIT(x)   ((x) >> DD_APA_BITS)


/**Macro***********************************************************************

  Synopsis    [Outputs a line of stats.]

  Description [Outputs a line of stats if DD_COUNT and DD_STATS are
  defined. Increments the number of recursive calls if DD_COUNT is
  defined.]

  SideEffects [None]

  SeeAlso     []

******************************************************************************/
#ifdef DD_COUNT
#ifdef DD_STATS
#define statLine(dd) dd->recursiveCalls++; \
if (dd->recursiveCalls == dd->nextSample) {(void) fprintf(dd->err, \
"@%.0f: %u nodes %u live %.0f dropped %.0f reclaimed\n", dd->recursiveCalls, \
dd->keys, dd->keys - dd->dead, dd->nodesDropped, dd->reclaimed); \
dd->nextSample += 250000;}
#else
#define statLine(dd) dd->recursiveCalls++;
#endif
#else
#define statLine(dd)
#endif


/**AutomaticStart*************************************************************/

/*---------------------------------------------------------------------------*/
/* Function prototypes                                                       */
/*---------------------------------------------------------------------------*/

extern DdNode *        cuddAddExistAbstractRecur( DdManager * manager, DdNode * f, DdNode * cube );
extern DdNode *        cuddAddUnivAbstractRecur( DdManager * manager, DdNode * f, DdNode * cube );
extern DdNode *        cuddAddOrAbstractRecur( DdManager * manager, DdNode * f, DdNode * cube );
extern DdNode *        cuddAddApplyRecur( DdManager * dd, DdNode * (*)(DdManager * , DdNode ** , DdNode **), DdNode * f, DdNode * g );
extern DdNode *        cuddAddMonadicApplyRecur( DdManager *  dd, DdNode * (*)(DdManager * , DdNode *), DdNode *  f );
extern DdNode *        cuddAddScalarInverseRecur( DdManager * dd, DdNode * f, DdNode * epsilon );
extern DdNode *        cuddAddIteRecur( DdManager * dd, DdNode * f, DdNode * g, DdNode * h );
extern DdNode *        cuddAddCmplRecur( DdManager * dd, DdNode * f );
extern DdNode *        cuddAddNegateRecur( DdManager * dd, DdNode * f );
extern DdNode *        cuddAddRoundOffRecur( DdManager * dd, DdNode * f, double trunc );
extern DdNode *        cuddUnderApprox( DdManager * dd, DdNode * f, int numVars, int threshold, int safe, double quality );
extern DdNode *        cuddRemapUnderApprox( DdManager * dd, DdNode * f, int numVars, int threshold, double quality );
extern DdNode *        cuddBiasedUnderApprox( DdManager * dd, DdNode * f, DdNode * b, int numVars, int threshold, double quality1, double quality0 );
extern DdNode *        cuddBddAndAbstractRecur( DdManager * manager, DdNode * f, DdNode * g, DdNode * cube );
extern int             cuddAnnealing( DdManager * table, int lower, int upper );
extern DdNode *        cuddBddExistAbstractRecur( DdManager * manager, DdNode * f, DdNode * cube );
extern DdNode *        cuddBddXorExistAbstractRecur( DdManager * manager, DdNode * f, DdNode * g, DdNode * cube );
extern DdNode *        cuddBddBooleanDiffRecur( DdManager * manager, DdNode * f, DdNode * var );
extern DdNode *        cuddBddIteRecur( DdManager * dd, DdNode * f, DdNode * g, DdNode * h );
extern DdNode *        cuddBddIntersectRecur( DdManager * dd, DdNode * f, DdNode * g );
extern DdNode *        cuddBddAndRecur( DdManager * manager, DdNode * f, DdNode * g );
extern DdNode *        cuddBddXorRecur( DdManager * manager, DdNode * f, DdNode * g );
extern DdNode *        cuddBddTransfer( DdManager * ddS, DdManager * ddD, DdNode * f );
extern DdNode *        cuddAddBddDoPattern( DdManager * dd, DdNode * f );
extern int             cuddInitCache( DdManager * unique, unsigned int cacheSize, unsigned int maxCacheSize );
extern void            cuddCacheInsert( DdManager * table, ptruint op, DdNode * f, DdNode * g, DdNode * h, DdNode * data );
extern void            cuddCacheInsert2( DdManager * table, DdNode * (*)(DdManager * , DdNode * , DdNode *), DdNode * f, DdNode * g, DdNode * data );
extern void            cuddCacheInsert1( DdManager * table, DdNode * (*)(DdManager * , DdNode *), DdNode * f, DdNode * data );
extern DdNode *        cuddCacheLookup( DdManager * table, ptruint op, DdNode * f, DdNode * g, DdNode * h );
extern DdNode *        cuddCacheLookupZdd( DdManager * table, ptruint op, DdNode * f, DdNode * g, DdNode * h );
extern DdNode *        cuddCacheLookup2( DdManager * table, DdNode * (*)(DdManager * , DdNode * , DdNode *), DdNode * f, DdNode * g );
extern DdNode *        cuddCacheLookup1( DdManager * table, DdNode * (*)(DdManager * , DdNode *), DdNode * f );
extern DdNode *        cuddCacheLookup2Zdd( DdManager * table, DdNode * (*)(DdManager * , DdNode * , DdNode *), DdNode * f, DdNode * g );
extern DdNode *        cuddCacheLookup1Zdd( DdManager * table, DdNode * (*)(DdManager * , DdNode *), DdNode * f );
extern DdNode *        cuddConstantLookup( DdManager * table, ptruint op, DdNode * f, DdNode * g, DdNode * h );
extern int             cuddCacheProfile( DdManager * table, FILE * fp );
extern void            cuddCacheResize( DdManager * table );
extern void            cuddCacheFlush( DdManager * table );
extern int             cuddComputeFloorLog2( unsigned int value );
extern int             cuddHeapProfile( DdManager * dd );
extern void            cuddPrintNode( DdNode * f, FILE * fp );
extern void            cuddPrintVarGroups( DdManager *  dd, MtrNode *  root, int zdd, int silent );
extern DdNode *        cuddBddClippingAnd( DdManager * dd, DdNode * f, DdNode * g, int maxDepth, int direction );
extern DdNode *        cuddBddClippingAndAbstract( DdManager * dd, DdNode * f, DdNode * g, DdNode * cube, int maxDepth, int direction );
extern void            cuddGetBranches( DdNode * g, DdNode ** g1, DdNode ** g0 );
extern int             cuddCheckCube( DdManager * dd, DdNode * g );
extern DdNode *        cuddCofactorRecur( DdManager * dd, DdNode * f, DdNode * g );
extern DdNode *        cuddBddComposeRecur( DdManager * dd, DdNode * f, DdNode * g, DdNode * proj );
extern DdNode *        cuddAddComposeRecur( DdManager * dd, DdNode * f, DdNode * g, DdNode * proj );
extern int             cuddExact( DdManager * table, int lower, int upper );
extern DdNode *        cuddBddConstrainRecur( DdManager * dd, DdNode * f, DdNode * c );
extern DdNode *        cuddBddRestrictRecur( DdManager * dd, DdNode * f, DdNode * c );
extern DdNode *        cuddBddNPAndRecur( DdManager * dd, DdNode * f, DdNode * c );
extern DdNode *        cuddAddConstrainRecur( DdManager * dd, DdNode * f, DdNode * c );
extern DdNode *        cuddAddRestrictRecur( DdManager * dd, DdNode * f, DdNode * c );
extern DdNode *        cuddBddLICompaction( DdManager * dd, DdNode * f, DdNode * c );
extern int             cuddGa( DdManager * table, int lower, int upper );
extern int             cuddTreeSifting( DdManager * table, Cudd_ReorderingType method );
extern int             cuddZddInitUniv( DdManager * zdd );
extern void            cuddZddFreeUniv( DdManager * zdd );
extern void            cuddSetInteract( DdManager * table, int x, int y );
extern int             cuddTestInteract( DdManager * table, int x, int y );
extern int             cuddInitInteract( DdManager * table );
extern DdLocalCache *  cuddLocalCacheInit( DdManager * manager, unsigned int keySize, unsigned int cacheSize, unsigned int maxCacheSize );
extern void            cuddLocalCacheQuit( DdLocalCache * cache );
extern void            cuddLocalCacheInsert( DdLocalCache * cache, DdNodePtr * key, DdNode * value );
extern DdNode *        cuddLocalCacheLookup( DdLocalCache * cache, DdNodePtr * key );
extern void            cuddLocalCacheClearDead( DdManager * manager );
extern int             cuddIsInDeathRow( DdManager * dd, DdNode * f );
extern int             cuddTimesInDeathRow( DdManager * dd, DdNode * f );
extern void            cuddLocalCacheClearAll( DdManager * manager );
#ifdef DD_CACHE_PROFILE
extern int             cuddLocalCacheProfile( DdLocalCache * cache );
#endif
extern DdHashTable *   cuddHashTableInit( DdManager * manager, unsigned int keySize, unsigned int initSize );
extern void            cuddHashTableQuit( DdHashTable * hash );
extern int             cuddHashTableInsert( DdHashTable * hash, DdNodePtr * key, DdNode * value, ptrint count );
extern DdNode *        cuddHashTableLookup( DdHashTable * hash, DdNodePtr * key );
extern int             cuddHashTableInsert1( DdHashTable * hash, DdNode * f, DdNode * value, ptrint count );
extern DdNode *        cuddHashTableLookup1( DdHashTable * hash, DdNode * f );
extern int             cuddHashTableInsert2( DdHashTable * hash, DdNode * f, DdNode * g, DdNode * value, ptrint count );
extern DdNode *        cuddHashTableLookup2( DdHashTable * hash, DdNode * f, DdNode * g );
extern int             cuddHashTableInsert3( DdHashTable * hash, DdNode * f, DdNode * g, DdNode * h, DdNode * value, ptrint count );
extern DdNode *        cuddHashTableLookup3( DdHashTable * hash, DdNode * f, DdNode * g, DdNode * h );
extern DdLevelQueue *  cuddLevelQueueInit( int levels, int itemSize, int numBuckets );
extern void            cuddLevelQueueQuit( DdLevelQueue * queue );
extern void *          cuddLevelQueueEnqueue( DdLevelQueue * queue, void * key, int level );
extern void            cuddLevelQueueDequeue( DdLevelQueue * queue, int level );
extern int             cuddLinearAndSifting( DdManager * table, int lower, int upper );
extern int             cuddLinearInPlace( DdManager *  table, int  x, int  y );
extern void            cuddUpdateInteractionMatrix( DdManager *  table, int  xindex, int  yindex );
extern int             cuddInitLinear( DdManager * table );
extern int             cuddResizeLinear( DdManager * table );
extern DdNode *        cuddBddLiteralSetIntersectionRecur( DdManager * dd, DdNode * f, DdNode * g );
extern DdNode *        cuddCProjectionRecur( DdManager * dd, DdNode * R, DdNode * Y, DdNode * Ysupp );
extern DdNode *        cuddBddClosestCube( DdManager * dd, DdNode * f, DdNode * g, CUDD_VALUE_TYPE bound );
extern void            cuddReclaim( DdManager * table, DdNode * n );
extern void            cuddReclaimZdd( DdManager * table, DdNode * n );
extern void            cuddClearDeathRow( DdManager * table );
extern void            cuddShrinkDeathRow( DdManager * table );
extern DdNode *        cuddDynamicAllocNode( DdManager * table );
extern int             cuddSifting( DdManager * table, int lower, int upper );
extern int             cuddSwapping( DdManager * table, int lower, int upper, Cudd_ReorderingType heuristic );
extern int             cuddNextHigh( DdManager * table, int x );
extern int             cuddNextLow( DdManager * table, int x );
extern int             cuddSwapInPlace( DdManager * table, int x, int y );
extern int             cuddBddAlignToZdd( DdManager * table );
extern DdNode *        cuddBddMakePrime( DdManager * dd, DdNode * cube, DdNode * f );
extern DdNode *        cuddSolveEqnRecur( DdManager * bdd, DdNode * F, DdNode * Y, DdNode ** G, int n, int * yIndex, int i );
extern DdNode *        cuddVerifySol( DdManager * bdd, DdNode * F, DdNode ** G, int * yIndex, int n );
#ifdef st__INCLUDED
extern DdNode *        cuddSplitSetRecur( DdManager * manager, st__table * mtable, int * varSeen, DdNode * p, double n, double max, int index );
#endif
extern DdNode *        cuddSubsetHeavyBranch( DdManager * dd, DdNode * f, int numVars, int threshold );
extern DdNode *        cuddSubsetShortPaths( DdManager * dd, DdNode * f, int numVars, int threshold, int hardlimit );
extern int             cuddSymmCheck( DdManager * table, int x, int y );
extern int             cuddSymmSifting( DdManager * table, int lower, int upper );
extern int             cuddSymmSiftingConv( DdManager * table, int lower, int upper );
extern DdNode *        cuddAllocNode( DdManager * unique );
extern DdManager *     cuddInitTable( unsigned int numVars, unsigned int numVarsZ, unsigned int numSlots, unsigned int looseUpTo );
extern void            cuddFreeTable( DdManager * unique );
extern int             cuddGarbageCollect( DdManager * unique, int clearCache );
extern DdNode *        cuddZddGetNode( DdManager * zdd, int id, DdNode * T, DdNode * E );
extern DdNode *        cuddZddGetNodeIVO( DdManager * dd, int index, DdNode * g, DdNode * h );
extern DdNode *        cuddUniqueInter( DdManager * unique, int index, DdNode * T, DdNode * E );
extern DdNode *        cuddUniqueInterIVO( DdManager * unique, int index, DdNode * T, DdNode * E );
extern DdNode *        cuddUniqueInterZdd( DdManager * unique, int index, DdNode * T, DdNode * E );
extern DdNode *        cuddUniqueConst( DdManager * unique, CUDD_VALUE_TYPE value );
extern void            cuddRehash( DdManager * unique, int i );
extern void            cuddShrinkSubtable( DdManager * unique, int i );
extern int             cuddInsertSubtables( DdManager * unique, int n, int level );
extern int             cuddDestroySubtables( DdManager * unique, int n );
extern int             cuddResizeTableZdd( DdManager * unique, int index );
extern void            cuddSlowTableGrowth( DdManager * unique );
extern int             cuddP( DdManager * dd, DdNode * f );
#ifdef st__INCLUDED
extern enum st__retval  cuddStCountfree( char * key, char * value, char * arg );
extern int             cuddCollectNodes( DdNode * f, st__table * visited );
#endif
extern DdNodePtr *     cuddNodeArray( DdNode * f, int * n );
extern int             cuddWindowReorder( DdManager * table, int low, int high, Cudd_ReorderingType submethod );
extern DdNode *        cuddZddProduct( DdManager * dd, DdNode * f, DdNode * g );
extern DdNode *        cuddZddUnateProduct( DdManager * dd, DdNode * f, DdNode * g );
extern DdNode *        cuddZddWeakDiv( DdManager * dd, DdNode * f, DdNode * g );
extern DdNode *        cuddZddWeakDivF( DdManager * dd, DdNode * f, DdNode * g );
extern DdNode *        cuddZddDivide( DdManager * dd, DdNode * f, DdNode * g );
extern DdNode *        cuddZddDivideF( DdManager * dd, DdNode * f, DdNode * g );
extern int             cuddZddGetCofactors3( DdManager * dd, DdNode * f, int v, DdNode ** f1, DdNode ** f0, DdNode ** fd );
extern int             cuddZddGetCofactors2( DdManager * dd, DdNode * f, int v, DdNode ** f1, DdNode ** f0 );
extern DdNode *        cuddZddComplement( DdManager * dd, DdNode * node );
extern int             cuddZddGetPosVarIndex(DdManager *  dd, int index );
extern int             cuddZddGetNegVarIndex(DdManager *  dd, int index );
extern int             cuddZddGetPosVarLevel(DdManager *  dd, int index );
extern int             cuddZddGetNegVarLevel(DdManager *  dd, int index );
extern int             cuddZddTreeSifting( DdManager * table, Cudd_ReorderingType method );
extern DdNode *        cuddZddIsop( DdManager * dd, DdNode * L, DdNode * U, DdNode ** zdd_I );
extern DdNode *        cuddBddIsop( DdManager * dd, DdNode * L, DdNode * U );
extern DdNode *        cuddMakeBddFromZddCover( DdManager * dd, DdNode * node );
extern int             cuddZddLinearSifting( DdManager * table, int lower, int upper );
extern int             cuddZddAlignToBdd( DdManager * table );
extern int             cuddZddNextHigh( DdManager * table, int x );
extern int             cuddZddNextLow( DdManager * table, int x );
extern int             cuddZddUniqueCompare( int * ptr_x, int * ptr_y );
extern int             cuddZddSwapInPlace( DdManager * table, int x, int y );
extern int             cuddZddSwapping( DdManager * table, int lower, int upper, Cudd_ReorderingType heuristic );
extern int             cuddZddSifting( DdManager * table, int lower, int upper );
extern DdNode *        cuddZddIte( DdManager * dd, DdNode * f, DdNode * g, DdNode * h );
extern DdNode *        cuddZddUnion( DdManager * zdd, DdNode * P, DdNode * Q );
extern DdNode *        cuddZddIntersect( DdManager * zdd, DdNode * P, DdNode * Q );
extern DdNode *        cuddZddDiff( DdManager * zdd, DdNode * P, DdNode * Q );
extern DdNode *        cuddZddChangeAux( DdManager * zdd, DdNode * P, DdNode * zvar );
extern DdNode *        cuddZddSubset1( DdManager * dd, DdNode * P, int var );
extern DdNode *        cuddZddSubset0( DdManager * dd, DdNode * P, int var );
extern DdNode *        cuddZddChange( DdManager * dd, DdNode * P, int var );
extern int             cuddZddSymmCheck( DdManager * table, int x, int y );
extern int             cuddZddSymmSifting( DdManager * table, int lower, int upper );
extern int             cuddZddSymmSiftingConv( DdManager * table, int lower, int upper );
extern int             cuddZddP( DdManager * zdd, DdNode * f );

/**AutomaticEnd***************************************************************/



ABC_NAMESPACE_HEADER_END

#endif /* _CUDDINT */
