You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							1188 lines
						
					
					
						
							46 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							1188 lines
						
					
					
						
							46 KiB
						
					
					
				
								/**CHeaderFile*****************************************************************
							 | 
						|
								
							 | 
						|
								  FileName    [cuddInt.h]
							 | 
						|
								
							 | 
						|
								  PackageName [cudd]
							 | 
						|
								
							 | 
						|
								  Synopsis    [Internal data structures of the CUDD package.]
							 | 
						|
								
							 | 
						|
								  Description []
							 | 
						|
								
							 | 
						|
								  SeeAlso     []
							 | 
						|
								
							 | 
						|
								  Author      [Fabio Somenzi]
							 | 
						|
								
							 | 
						|
								  Copyright   [Copyright (c) 1995-2012, 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.142 2012/02/05 01:07:19 fabio Exp $]
							 | 
						|
								
							 | 
						|
								******************************************************************************/
							 | 
						|
								
							 | 
						|
								#ifndef _CUDDINT
							 | 
						|
								#define _CUDDINT
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Nested includes                                                           */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								#ifdef DD_MIS
							 | 
						|
								#include "array.h"
							 | 
						|
								#include "list.h"
							 | 
						|
								#include "st.h"
							 | 
						|
								#include "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 "st.h"
							 | 
						|
								
							 | 
						|
								#ifdef __cplusplus
							 | 
						|
								extern "C" {
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								#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.2
							 | 
						|
								#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
							 | 
						|
								#define DD_BDD_MAX_EXP_TAG			0x8a 
							 | 
						|
								
							 | 
						|
								/* 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;
							 | 
						|
									DdNode	**stack;
							 | 
						|
								    } 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 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
							 | 
						|
								} 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 */
							 | 
						|
												/* (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 */
							 | 
						|
								    unsigned int reorderings;	/* number of calls to Cudd_ReduceHeap */
							 | 
						|
								    unsigned int maxReorderings;/* maximum 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 */
							 | 
						|
								    unsigned int randomizeOrder; /* perturb the next reordering threshold */
							 | 
						|
								    DdLocalCache *localCaches;	/* local caches currently in existence */
							 | 
						|
								    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 */
							 | 
						|
								    Cudd_ErrorType errorCode;	/* info on last error */
							 | 
						|
								    unsigned long startTime;    /* start time in milliseconds */
							 | 
						|
								    unsigned long timeLimit;    /* CPU time limit */
							 | 
						|
								    /* 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 */
							 | 
						|
								    unsigned long GCTime;	/* total time spent in garbage collection */
							 | 
						|
								    unsigned 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
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								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;
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* 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    [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))
							 | 
						|
								#else
							 | 
						|
								#define ddCHash2(o,f,g,s) \
							 | 
						|
								(((((unsigned)(f) + (unsigned)(o)) * DD_P1 + (unsigned)(g)) * DD_P2) >> (s))
							 | 
						|
								#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 * (*op)(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 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 void cuddHashTableGenericQuit (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 int cuddHashTableGenericInsert(DdHashTable * hash, DdNode * f, void * value);
							 | 
						|
								extern void * cuddHashTableGenericLookup(DdHashTable * hash, DdNode * f);
							 | 
						|
								extern DdLevelQueue * cuddLevelQueueInit (int levels, int itemSize, int numBuckets);
							 | 
						|
								extern void cuddLevelQueueQuit (DdLevelQueue *queue);
							 | 
						|
								extern void * cuddLevelQueueFirst(DdLevelQueue * queue, void * key, int  level);
							 | 
						|
								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***************************************************************/
							 | 
						|
								
							 | 
						|
								#ifdef __cplusplus
							 | 
						|
								} /* end of extern "C" */
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								#endif /* _CUDDINT */
							 |