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 */
|