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.
		
		
		
		
		
			
		
			
				
					
					
						
							382 lines
						
					
					
						
							13 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							382 lines
						
					
					
						
							13 KiB
						
					
					
				| /**CHeaderFile***************************************************************** | |
|  | |
|   FileName    [cuddBdd.h] | |
|  | |
|   PackageName [cudd] | |
|  | |
|   Synopsis    [Defines interface for the CU package to work with the | |
|   ucb interface.] | |
|  | |
|   Description [] | |
|  | |
|   Author      [Abelardo Pardo] | |
|  | |
|   Copyright   [Copyright (c) 1994-1996 The Univ. of Colorado. | |
|   All rights reserved. | |
|  | |
|   Permission is hereby granted, without written agreement and without license | |
|   or royalty fees, to use, copy, modify, and distribute this software and its | |
|   documentation for any purpose, provided that the above copyright notice and | |
|   the following two paragraphs appear in all copies of this software. | |
|  | |
|   IN NO EVENT SHALL THE UNIVERSITY OF COLORADO BE LIABLE TO ANY PARTY FOR | |
|   DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT | |
|   OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF | |
|   COLORADO HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
|  | |
|   THE UNIVERSITY OF COLORADO SPECIFICALLY DISCLAIMS ANY WARRANTIES, | |
|   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | |
|   FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS ON AN | |
|   "AS IS" BASIS, AND THE UNIVERSITY OF COLORADO HAS NO OBLIGATION TO PROVIDE | |
|   MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.] | |
|  | |
|   Revision    [$Id: cuddBdd.h,v 1.2 1996/07/30 20:42:04 bobbie Exp $] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| #ifndef _BDD | |
| #define _BDD | |
|  | |
| /*---------------------------------------------------------------------------*/ | |
| /* Nested includes                                                           */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| #include "var_set.h" | |
|  | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif | |
|  | |
| /*---------------------------------------------------------------------------*/ | |
| /* Constant declarations                                                     */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Stucture declarations                                                     */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| #define boolean		int | |
| /* | |
|  *    foreach macro in the most misesque tradition | |
|  *    bdd_gen_free always returns 0 | |
|  * | |
|  *    CAUTION: in the context of the port to the CUDD package, it is assumed that | |
|  *    dynamic reordering will not occur while there are open generators.  It is  | |
|  *    the user's responsibility to make sure dynamic reordering doesn't occur. | |
|  *    As long as new nodes are not created during generation, and you don't  | |
|  *    explicitly call dynamic reordering, you should be okay. | |
|  */ | |
| 
 | |
| /* | |
|  *    foreach_bdd_cube(fn, gen, cube) | |
|  *    bdd_t *fn; | |
|  *    bdd_gen *gen; | |
|  *    array_t *cube;	- return | |
|  * | |
|  *    foreach_bdd_cube(fn, gen, cube) { | |
|  *        ... | |
|  *    } | |
|  */ | |
| #define foreach_bdd_cube(fn, gen, cube)\ | |
|   for((gen) = bdd_first_cube(fn, &cube);\ | |
|       bdd_is_gen_empty(gen) ? bdd_gen_free(gen) : TRUE;\ | |
|       (void) bdd_next_cube(gen, &cube)) | |
|  | |
| /* | |
|  *    foreach_bdd_node(fn, gen, node) | |
|  *    bdd_t *fn; | |
|  *    bdd_gen *gen; | |
|  *    bdd_node *node;	- return | |
|  */ | |
| #define foreach_bdd_node(fn, gen, node)\ | |
|   for((gen) = bdd_first_node(fn, &node);\ | |
|       bdd_is_gen_empty(gen) ? bdd_gen_free(gen) : TRUE;\ | |
|       (void) bdd_next_node(gen, &node)) | |
|  | |
| /* | |
|  * Default settings. | |
|  */ | |
| #define BDD_NO_LIMIT                      ((1<<30)-2) | |
| #define BDD_DFLT_ITE_ON                   TRUE | |
| #define BDD_DFLT_ITE_RESIZE_AT            75 | |
| #define BDD_DFLT_ITE_MAX_SIZE             1000000 | |
| #define BDD_DFLT_ITE_CONST_ON             TRUE | |
| #define BDD_DFLT_ITE_CONST_RESIZE_AT      75 | |
| #define BDD_DFLT_ITE_CONST_MAX_SIZE       1000000 | |
| #define BDD_DFLT_ADHOC_ON                 TRUE | |
| #define BDD_DFLT_ADHOC_RESIZE_AT          0 | |
| #define BDD_DFLT_ADHOC_MAX_SIZE           10000000 | |
| #define BDD_DFLT_GARB_COLLECT_ON          TRUE | |
| #define BDD_DFLT_DAEMON                   NIL(void) | |
| #define BDD_DFLT_MEMORY_LIMIT             BDD_NO_LIMIT    | |
| #define BDD_DFLT_NODE_RATIO               2.0 | |
| #define BDD_DFLT_INIT_BLOCKS              10 | |
|  | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Type declarations                                                         */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| typedef struct DdManager bdd_manager;	        /* referenced via a pointer only */ | |
| typedef unsigned int bdd_variableId;		/* the id of the variable in a bdd node */ | |
| typedef struct DdNode bdd_node;                 /* referenced via a pointer only */ | |
| typedef int bdd_literal;	                /* integers in the set { 0, 1, 2 } */ | |
| 
 | |
| /* This is to avoid problems with the mnemosyne library, which redefines | |
| ** free. | |
| */ | |
| #ifdef MNEMOSYNE | |
| #undef free | |
| #endif | |
|  | |
| typedef struct bdd_t { | |
|     boolean free;	                        /* TRUE if this is free, FALSE otherwise ... */ | |
|     bdd_node *node;                             /* ptr to the top node of the function */ | |
|     bdd_manager *mgr;                           /* the manager */ | |
| } bdd_t;	 | |
| 
 | |
| /*  | |
|  * Initialization data structure.   Not supported in CMU package. | |
|  */ | |
| typedef struct bdd_mgr_init { | |
|     struct { | |
|         boolean on;                   /* TRUE/FALSE: is the cache on */ | |
|         unsigned int resize_at;       /* percentage at which to resize (e.g. 85% is 85); doesn't apply to adhoc */ | |
|         unsigned int max_size;        /* max allowable number of buckets; for adhoc, max allowable number of entries */ | |
|     } ITE_cache, | |
|       ITE_const_cache, | |
|       adhoc_cache; | |
|     struct { | |
|       boolean on;                     /* TRUE/FALSE: is the garbage collector on */ | |
|     } garbage_collector; | |
|     struct { | |
|       void (*daemon)();               /* used for callback when memory limit exceeded */ | |
|       unsigned int limit;             /* upper bound on memory allocated by the manager; in megabytes */ | |
|     } memory; | |
|     struct { | |
|       float ratio;                    /* allocate new bdd_nodes to achieve ratio of used to unused nodes */ | |
|       unsigned int init_blocks;       /* number of bdd_nodeBlocks initially allocated */ | |
|     } nodes; | |
| } bdd_mgr_init; | |
| 
 | |
| /* | |
|  * Match types for BDD minimization. | |
|  */ | |
| typedef enum { | |
|     BDD_MIN_TSM,		/* two-side match */ | |
|     BDD_MIN_OSM,		/* one-side match */ | |
|     BDD_MIN_OSDM		/* one-side DC match */ | |
| } bdd_min_match_type_t; | |
| 
 | |
| /* | |
|  * Statistics and Other Queries | |
|  */ | |
| typedef struct bdd_cache_stats { | |
|     unsigned int hits; | |
|     unsigned int misses; | |
|     unsigned int collisions; | |
|     unsigned int inserts; | |
| } bdd_cache_stats; | |
| 
 | |
| typedef struct bdd_stats { | |
|     struct { | |
| 	bdd_cache_stats hashtable;   /* the unique table; collisions and inserts fields not used */  | |
| 	bdd_cache_stats itetable; | |
| 	bdd_cache_stats consttable; | |
| 	bdd_cache_stats adhoc; | |
|     } cache;		/* various cache statistics */ | |
|     struct { | |
| 	unsigned int calls; | |
| 	struct { | |
| 	    unsigned int trivial; | |
| 	    unsigned int cached; | |
| 	    unsigned int full; | |
| 	} returns; | |
|     } ITE_ops, | |
|       ITE_constant_ops, | |
|       adhoc_ops; | |
|     struct { | |
| 	unsigned int total; | |
|     } blocks;		/* bdd_nodeBlock count */ | |
|     struct { | |
| 	unsigned int used; | |
| 	unsigned int unused; | |
| 	unsigned int total; | |
|         unsigned int peak; | |
|     } nodes;		/* bdd_node count */ | |
|     struct { | |
| 	unsigned int used; | |
| 	unsigned int unused; | |
| 	unsigned int total; | |
|         unsigned int blocks;  | |
|     } extptrs;		/* bdd_t count */ | |
|     struct { | |
| 	unsigned int times;     /* the number of times the garbage-collector has run */ | |
|         unsigned int nodes_collected; /* cumulative number of nodes collected over life of manager */ | |
|         long runtime;           /* cumulative CPU time spent garbage collecting */ | |
|     } gc; | |
|     struct { | |
|         int first_sbrk;         /* value of sbrk at start of manager; used to analyze memory usage */ | |
|         int last_sbrk;          /* value of last sbrk (see "man sbrk") fetched; used to analyze memory usage */ | |
|         unsigned int manager; | |
| 	unsigned int nodes; | |
| 	unsigned int hashtable; | |
| 	unsigned int ext_ptrs; | |
| 	unsigned int ITE_cache; | |
| 	unsigned int ITE_const_cache; | |
| 	unsigned int adhoc_cache; | |
| 	unsigned int total; | |
|     } memory;           /* memory usage */ | |
| } bdd_stats; | |
| 
 | |
| /* | |
|  * Traversal of BDD Formulas | |
|  */ | |
| 
 | |
| typedef struct bdd_gen bdd_gen; | |
| 
 | |
| /* | |
|  *    These are the hooks for stuff that uses bdd's | |
|  * | |
|  *    There are three hooks, and users may use them in whatever | |
|  *    way they wish; these hooks are guaranteed to never be used | |
|  *    by the bdd package. | |
|  */ | |
| typedef struct bdd_external_hooks { | |
|     char *network; | |
|     char *mdd; | |
|     char *undef1; | |
| } bdd_external_hooks; | |
| 
 | |
| /* | |
|  * Dynamic reordering. | |
|  */ | |
| typedef enum { | |
|     BDD_REORDER_SIFT, | |
|     BDD_REORDER_WINDOW, | |
|     BDD_REORDER_NONE, | |
|     BDD_REORDER_SAME, | |
|     BDD_REORDER_RANDOM, | |
|     BDD_REORDER_RANDOM_PIVOT, | |
|     BDD_REORDER_SIFT_CONVERGE, | |
|     BDD_REORDER_SYMM_SIFT, | |
|     BDD_REORDER_SYMM_SIFT_CONV, | |
|     BDD_REORDER_WINDOW2, | |
|     BDD_REORDER_WINDOW3, | |
|     BDD_REORDER_WINDOW4, | |
|     BDD_REORDER_WINDOW2_CONV, | |
|     BDD_REORDER_WINDOW3_CONV, | |
|     BDD_REORDER_WINDOW4_CONV, | |
|     BDD_REORDER_GROUP_SIFT, | |
|     BDD_REORDER_GROUP_SIFT_CONV, | |
|     BDD_REORDER_ANNEALING, | |
|     BDD_REORDER_GENETIC | |
| } bdd_reorder_type_t; | |
| 
 | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Variable declarations                                                     */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Macro declarations                                                        */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /* | |
|  * BDD Manager Allocation And Destruction | |
|  */ | |
| extern void bdd_end (bdd_manager *); | |
| extern void bdd_register_daemon (bdd_manager *, void (*daemon)()); | |
| extern void bdd_set_mgr_init_dflts (bdd_mgr_init *); | |
| extern bdd_manager *bdd_start (int); | |
| extern bdd_manager *bdd_start_with_params (int, bdd_mgr_init *); | |
| 
 | |
| /* | |
|  * BDD Variable Allocation | |
|  */ | |
| extern bdd_t *bdd_create_variable (bdd_manager *);		 | |
| extern bdd_t *bdd_get_variable (bdd_manager *, bdd_variableId);	 | |
| 
 | |
| /* | |
|  * BDD Formula Management | |
|  */ | |
| extern bdd_t *bdd_dup (bdd_t *); | |
| extern void bdd_free (bdd_t *); | |
| 
 | |
| /*  | |
|  * Operations on BDD Formulas | |
|  */ | |
| extern bdd_t *bdd_and (bdd_t *, bdd_t *, boolean, boolean); | |
| extern bdd_t *bdd_and_smooth (bdd_t *, bdd_t *, array_t *); | |
| extern bdd_t *bdd_between (bdd_t *, bdd_t *); | |
| extern bdd_t *bdd_cofactor (bdd_t *, bdd_t *); | |
| extern bdd_t *bdd_compose (bdd_t *, bdd_t *, bdd_t *); | |
| extern bdd_t *bdd_consensus (bdd_t *, array_t *); | |
| extern bdd_t *bdd_cproject (bdd_t *, array_t *); | |
| extern bdd_t *bdd_else (bdd_t *); | |
| extern bdd_t *bdd_ite (bdd_t *, bdd_t *, bdd_t *, boolean, boolean, boolean); | |
| extern bdd_t *bdd_minimize (bdd_t *, bdd_t *); | |
| extern bdd_t *bdd_minimize_with_params (bdd_t *, bdd_t *, bdd_min_match_type_t, boolean, boolean, boolean); | |
| extern bdd_t *bdd_not (bdd_t *); | |
| extern bdd_t *bdd_one (bdd_manager *); | |
| extern bdd_t *bdd_or (bdd_t *, bdd_t *, boolean, boolean); | |
| extern bdd_t *bdd_smooth (bdd_t *, array_t *); | |
| extern bdd_t *bdd_substitute (bdd_t *, array_t *, array_t *); | |
| extern bdd_t *bdd_then (bdd_t *); | |
| extern bdd_t *bdd_top_var (bdd_t *); | |
| extern bdd_t *bdd_xnor (bdd_t *, bdd_t *); | |
| extern bdd_t *bdd_xor (bdd_t *, bdd_t *); | |
| extern bdd_t *bdd_zero (bdd_manager *); | |
| 
 | |
| /* | |
|  * Queries about BDD Formulas | |
|  */ | |
| extern boolean bdd_equal (bdd_t *, bdd_t *); | |
| extern boolean bdd_is_cube (bdd_t *); | |
| extern boolean bdd_is_tautology (bdd_t *, boolean); | |
| extern boolean bdd_leq (bdd_t *, bdd_t *, boolean, boolean); | |
| 
 | |
| extern double bdd_count_onset (bdd_t *, array_t *); | |
| extern bdd_manager *bdd_get_manager (bdd_t *); | |
| extern bdd_node *bdd_get_node (bdd_t *, boolean *); | |
| extern void bdd_get_stats (bdd_manager *, bdd_stats *); | |
| extern var_set_t *bdd_get_support (bdd_t *); | |
| extern array_t *bdd_get_varids (array_t *); | |
| extern unsigned int bdd_num_vars (bdd_manager *); | |
| extern void bdd_print (bdd_t *); | |
| extern void bdd_print_stats (bdd_stats, FILE *); | |
| extern int bdd_size (bdd_t *); | |
| extern bdd_variableId bdd_top_var_id (bdd_t *); | |
| extern bdd_t *bdd_create_variable_after (bdd_manager *, bdd_variableId); | |
| extern bdd_variableId bdd_get_id_from_level (bdd_manager *, long); | |
| extern long bdd_top_var_level (bdd_manager *, bdd_t *); | |
| 
 | |
| extern int bdd_gen_free (bdd_gen *); | |
| 
 | |
| /* | |
|  * These are NOT to be used directly; only indirectly in the macros. | |
|  */ | |
| extern bdd_gen *bdd_first_cube (bdd_t *, array_t **); | |
| extern boolean bdd_next_cube (bdd_gen *, array_t **); | |
| extern bdd_gen *bdd_first_node (bdd_t *, bdd_node **); | |
| extern boolean bdd_next_node (bdd_gen *, bdd_node **); | |
| extern boolean bdd_is_gen_empty (bdd_gen *); | |
| 
 | |
| /*  | |
|  * Miscellaneous | |
|  */ | |
| extern void bdd_set_gc_mode (bdd_manager *, boolean); | |
| 
 | |
| extern bdd_external_hooks *bdd_get_external_hooks (bdd_manager *); | |
| 
 | |
| extern void bdd_dynamic_reordering (bdd_manager *, bdd_reorder_type_t); | |
| 
 | |
| extern int bdd_read_reordering_flag (bdd_manager *); | |
| 
 | |
| #ifdef __cplusplus | |
| } | |
| #endif | |
|  | |
| #endif /* _BDD */
 |