00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00043 #ifndef __NUSMV_CORE_DD_DD_H__
00044 #define __NUSMV_CORE_DD_DD_H__
00045
00046 #include "nusmv/core/dd/DDMgr.h"
00047 #include "nusmv/core/utils/utils.h"
00048 #include "nusmv/core/utils/array.h"
00049 #include "nusmv/core/utils/avl.h"
00050 #include "nusmv/core/node/node.h"
00051 #include "cudd/cudd.h"
00052 #include "nusmv/core/opt/OptsHandler.h"
00053 #include "nusmv/core/cinit/NuSMVEnv.h"
00054
00055
00056
00057
00058
00065 typedef struct DdNode * add_ptr;
00066 typedef struct DdNode * bdd_ptr;
00067 typedef struct DdNode * dd_ptr;
00068
00075 typedef struct MtrNode dd_block;
00076
00082 typedef Cudd_ReorderingType dd_reorderingtype;
00083
00089 typedef void (*VPFDD)(DDMgr_ptr , bdd_ptr);
00090
00096 typedef node_ptr (*NPFDD)(DDMgr_ptr , bdd_ptr);
00097 typedef void (*VPFCVT)(CUDD_VALUE_TYPE);
00098 typedef void (*VPFDDCVT)(DDMgr_ptr, CUDD_VALUE_TYPE);
00099 typedef node_ptr (*NPFCVT)(CUDD_VALUE_TYPE);
00100
00106 typedef add_ptr (*FP_A_DA)(DDMgr_ptr , add_ptr);
00107 typedef add_ptr (*FP_A_DAA)(DDMgr_ptr , add_ptr, add_ptr);
00108
00109 typedef node_ptr (*NPFNNE)(node_ptr, node_ptr, const NuSMVEnv_ptr);
00110
00116 typedef DdGen dd_gen;
00117
00124 typedef enum DdDynVarOrderAction_TAG {
00125 DD_DYN_VAR_ORDER_ACTION_DISABLE = 1,
00126 DD_DYN_VAR_ORDER_ACTION_ENABLE,
00127 DD_DYN_VAR_ORDER_ACTION_FORCE
00128 } DdDynVarOrderAction;
00129
00130 DdDynVarOrderAction Dd_action_str_to_enum(char* action);
00131 char* Dd_action_enum_to_str(DdDynVarOrderAction action);
00132
00133
00134
00135
00136 #ifndef MAX_VAR_INDEX
00137
00143 #define MAX_VAR_INDEX CUDD_MAXINDEX
00144 #endif
00145
00146
00147
00153 #define UNIQUE_SLOTS CUDD_UNIQUE_SLOTS
00154
00155
00156
00162 #define CACHE_SLOTS CUDD_CACHE_SLOTS
00163
00164
00165
00171 #define REORDER_SAME CUDD_REORDER_SAME
00172
00173
00179 #define REORDER_NONE CUDD_REORDER_NONE
00180
00186 #define REORDER_RANDOM CUDD_REORDER_RANDOM
00187
00193 #define REORDER_RANDOM_PIVOT CUDD_REORDER_RANDOM_PIVOT
00194
00200 #define REORDER_SIFT CUDD_REORDER_SIFT
00201
00207 #define REORDER_SIFT_CONV CUDD_REORDER_SIFT_CONVERGE
00208
00214 #define REORDER_SYMM_SIFT CUDD_REORDER_SYMM_SIFT
00215
00221 #define REORDER_SYMM_SIFT_CONV CUDD_REORDER_SYMM_SIFT_CONV
00222
00228 #define REORDER_WINDOW2 CUDD_REORDER_WINDOW2
00229
00235 #define REORDER_WINDOW3 CUDD_REORDER_WINDOW3
00236
00242 #define REORDER_WINDOW4 CUDD_REORDER_WINDOW4
00243
00249 #define REORDER_WINDOW2_CONV CUDD_REORDER_WINDOW2_CONV
00250
00256 #define REORDER_WINDOW3_CONV CUDD_REORDER_WINDOW3_CONV
00257
00263 #define REORDER_WINDOW4_CONV CUDD_REORDER_WINDOW4_CONV
00264
00270 #define REORDER_GROUP_SIFT CUDD_REORDER_GROUP_SIFT
00271
00277 #define REORDER_GROUP_SIFT_CONV CUDD_REORDER_GROUP_SIFT_CONV
00278
00284 #define REORDER_ANNEALING CUDD_REORDER_ANNEALING
00285
00291 #define REORDER_GENETIC CUDD_REORDER_GENETIC
00292
00298 #define REORDER_LINEAR CUDD_REORDER_LINEAR
00299
00305 #define REORDER_LINEAR_CONV CUDD_REORDER_LINEAR_CONVERGE
00306
00312 #define REORDER_EXACT CUDD_REORDER_EXACT
00313
00319 #define DEFAULT_REORDER REORDER_SIFT
00320
00326 #define DEFAULT_MINSIZE 10
00327
00333 #define ADD_FOREACH_NODE(manager, f, gen, node) \
00334 Cudd_ForeachNode(DDMgr_get_dd_manager(manager), f, gen, node)
00335
00341 #define BDD_FOREACH_NODE(manager, f, gen, node) \
00342 ADD_FOREACH_NODE(manager, f, gen, node)
00343
00344
00345
00346
00347
00348
00356 void Dd_init(NuSMVEnv_ptr env);
00357
00365 void Dd_quit(NuSMVEnv_ptr env);
00366
00373 int Dd_dynamic_var_ordering(NuSMVEnv_ptr env,
00374 DDMgr_ptr dd,
00375 int dynOrderingMethod,
00376 DdDynVarOrderAction action);
00377
00385 int Dd_set_bdd_parameters(NuSMVEnv_ptr env,
00386 DDMgr_ptr dd_manager,
00387 boolean showAfter);
00388
00398 node_ptr map_dd(DDMgr_ptr , NPFDD, node_ptr);
00399
00409 void walk_dd(DDMgr_ptr , VPFDD, node_ptr);
00410
00423 dd_block* dd_new_var_block(DDMgr_ptr , int, int);
00424
00434 int dd_free_var_block(DDMgr_ptr , dd_block*);
00435
00444 int dd_get_index_at_level(DDMgr_ptr , int);
00445
00458 int dd_get_level_at_index(DDMgr_ptr , int);
00459
00465 int dd_get_size(DDMgr_ptr );
00466
00479 int dd_set_order(DDMgr_ptr , int *permutation);
00480
00491 void dd_autodyn_enable(DDMgr_ptr , dd_reorderingtype);
00492
00500 void dd_autodyn_disable(DDMgr_ptr );
00501
00516 int dd_reordering_status(DDMgr_ptr , dd_reorderingtype *);
00517
00554 int dd_reorder(DDMgr_ptr , int, int);
00555
00568 int dd_get_reorderings(DDMgr_ptr );
00569
00575 dd_reorderingtype dd_get_ordering_method(DDMgr_ptr );
00576
00583 int StringConvertToDynOrderType(char *string);
00584
00591 char * DynOrderTypeConvertToString(int method);
00592
00605 int dd_checkzeroref(DDMgr_ptr );
00606
00616 int dd_set_parameters(DDMgr_ptr , OptsHandler_ptr, FILE *);
00617
00623 int dd_print_stats(NuSMVEnv_ptr, DDMgr_ptr , FILE *);
00624
00634 int dd_printminterm(DDMgr_ptr , dd_ptr);
00635
00664 int dd_dump_dot(DDMgr_ptr , int, dd_ptr *, const char **, const char **, FILE *);
00665
00675 int dd_dump_davinci(DDMgr_ptr , int, dd_ptr *, const char **, const char **, FILE *);
00676
00686 bdd_ptr add_to_bdd(DDMgr_ptr , add_ptr);
00687
00698 bdd_ptr add_to_bdd_strict_threshold(DDMgr_ptr , add_ptr, int);
00699
00708 add_ptr bdd_to_add(DDMgr_ptr , bdd_ptr);
00709
00718 add_ptr bdd_to_01_add(DDMgr_ptr , bdd_ptr);
00719
00726 add_ptr add_exist_abstract(DDMgr_ptr dd, add_ptr a, bdd_ptr b);
00727
00728
00729
00730
00738 add_ptr add_true(DDMgr_ptr );
00739
00752 add_ptr add_then(DDMgr_ptr , add_ptr);
00753
00766 add_ptr add_else(DDMgr_ptr , add_ptr);
00767
00775 int add_index(DDMgr_ptr , add_ptr);
00776
00784 add_ptr add_false(DDMgr_ptr );
00785
00793 int add_is_true(DDMgr_ptr , add_ptr);
00794
00802 int add_is_false(DDMgr_ptr , add_ptr);
00803
00811 add_ptr add_one(DDMgr_ptr );
00812
00820 add_ptr add_zero(DDMgr_ptr );
00821
00829 int add_is_one(DDMgr_ptr , add_ptr);
00830
00838 int add_is_zero(DDMgr_ptr , add_ptr);
00839
00849 void add_ref(add_ptr);
00850
00860 void add_deref(add_ptr);
00861
00871 add_ptr add_dup(add_ptr);
00872
00884 void add_free(DDMgr_ptr , add_ptr);
00885
00898 add_ptr add_new_var_with_index(DDMgr_ptr , int);
00899
00911 add_ptr add_build(DDMgr_ptr , int, add_ptr , add_ptr);
00912
00924 add_ptr add_new_var_at_level(DDMgr_ptr , int);
00925
00932 int add_isleaf(add_ptr);
00933
00943 add_ptr add_leaf(DDMgr_ptr , node_ptr);
00944
00951 node_ptr add_get_leaf(DDMgr_ptr , add_ptr);
00952
00963 add_ptr add_and(DDMgr_ptr , add_ptr, add_ptr);
00964
00976 void add_and_accumulate(DDMgr_ptr , add_ptr *, add_ptr);
00977
00988 add_ptr add_or(DDMgr_ptr , add_ptr, add_ptr);
00989
01001 void add_or_accumulate(DDMgr_ptr , add_ptr *, add_ptr);
01002
01013 add_ptr add_not(DDMgr_ptr , add_ptr);
01014
01025 add_ptr add_implies(DDMgr_ptr , add_ptr, add_ptr);
01026
01037 add_ptr add_iff(DDMgr_ptr , add_ptr, add_ptr);
01038
01049 add_ptr add_xor(DDMgr_ptr , add_ptr, add_ptr);
01050
01061 add_ptr add_xnor(DDMgr_ptr , add_ptr, add_ptr);
01062
01069 add_ptr add_apply(DDMgr_ptr , NPFNNE, add_ptr, add_ptr);
01070
01081 add_ptr add_monadic_apply(DDMgr_ptr , NPFNNE, add_ptr);
01082
01090 add_ptr add_ifthenelse(DDMgr_ptr , add_ptr, add_ptr, add_ptr);
01091
01102 add_ptr add_cube_diff(DDMgr_ptr , add_ptr , add_ptr);
01103
01113 add_ptr add_simplify_assuming(DDMgr_ptr , add_ptr, add_ptr);
01114
01127 add_ptr add_permute(DDMgr_ptr , add_ptr, int *);
01128
01138 add_ptr add_support(DDMgr_ptr , add_ptr);
01139
01146 void add_walkleaves(DDMgr_ptr , VPFDDCVT, add_ptr);
01147
01156 int add_size(DDMgr_ptr , add_ptr);
01157
01169 double add_count_minterm(DDMgr_ptr , add_ptr, int);
01170
01177 int get_dd_nodes_allocated(DDMgr_ptr );
01178
01191 node_ptr add_value(DDMgr_ptr , add_ptr);
01192
01202 add_ptr add_if_then(DDMgr_ptr , add_ptr, add_ptr);
01203
01204
01205
01206
01213 int bdd_isleaf(bdd_ptr);
01214
01224 void bdd_ref(bdd_ptr);
01225
01235 void bdd_deref(bdd_ptr);
01236
01246 bdd_ptr bdd_dup(bdd_ptr);
01247
01255 bdd_ptr bdd_true(DDMgr_ptr );
01256
01264 bdd_ptr bdd_false(DDMgr_ptr );
01265
01273 int bdd_is_true(DDMgr_ptr , bdd_ptr);
01274
01282 int bdd_is_false(DDMgr_ptr , bdd_ptr);
01283
01291 int bdd_isnot_true(DDMgr_ptr , bdd_ptr);
01292
01300 int bdd_isnot_false(DDMgr_ptr , bdd_ptr);
01301
01313 void bdd_free(DDMgr_ptr , bdd_ptr);
01314
01324 bdd_ptr bdd_not(DDMgr_ptr , bdd_ptr);
01325
01335 bdd_ptr bdd_and(DDMgr_ptr , bdd_ptr, bdd_ptr);
01336
01348 void bdd_and_accumulate(DDMgr_ptr , bdd_ptr *, bdd_ptr);
01349
01359 bdd_ptr bdd_or(DDMgr_ptr , bdd_ptr, bdd_ptr);
01360
01372 void bdd_or_accumulate(DDMgr_ptr , bdd_ptr *, bdd_ptr);
01373
01383 bdd_ptr bdd_xor(DDMgr_ptr , bdd_ptr, bdd_ptr);
01384
01394 bdd_ptr bdd_iff(DDMgr_ptr , bdd_ptr, bdd_ptr);
01395
01405 bdd_ptr bdd_imply(DDMgr_ptr , bdd_ptr, bdd_ptr);
01406
01416 bdd_ptr bdd_forsome(DDMgr_ptr , bdd_ptr, bdd_ptr);
01417
01427 bdd_ptr bdd_forall(DDMgr_ptr , bdd_ptr, bdd_ptr);
01428
01441 bdd_ptr bdd_permute(DDMgr_ptr , bdd_ptr, int *);
01442
01454 bdd_ptr bdd_and_abstract(DDMgr_ptr , bdd_ptr, bdd_ptr, bdd_ptr);
01455
01466 bdd_ptr bdd_simplify_assuming(DDMgr_ptr , bdd_ptr, bdd_ptr);
01467
01478 bdd_ptr bdd_minimize(DDMgr_ptr , bdd_ptr, bdd_ptr);
01479
01499 bdd_ptr bdd_cofactor(DDMgr_ptr , bdd_ptr, bdd_ptr);
01500
01508 bdd_ptr bdd_between(DDMgr_ptr , bdd_ptr, bdd_ptr);
01509
01518 int bdd_entailed(DDMgr_ptr dd, bdd_ptr f, bdd_ptr g);
01519
01530 int bdd_intersected(DDMgr_ptr dd, bdd_ptr f, bdd_ptr g);
01531
01541 bdd_ptr bdd_then(DDMgr_ptr , bdd_ptr);
01542
01552 bdd_ptr bdd_else(DDMgr_ptr , bdd_ptr);
01553
01563 bdd_ptr bdd_ite(DDMgr_ptr , bdd_ptr, bdd_ptr, bdd_ptr);
01564
01572 int bdd_iscomplement(DDMgr_ptr , bdd_ptr);
01573
01583 int bdd_readperm(DDMgr_ptr , bdd_ptr);
01584
01592 int bdd_index(DDMgr_ptr , bdd_ptr);
01593
01604 bdd_ptr bdd_pick_one_minterm(DDMgr_ptr , bdd_ptr, bdd_ptr *, int);
01605
01615 bdd_ptr bdd_pick_one_minterm_rand(DDMgr_ptr , bdd_ptr, bdd_ptr *, int);
01616
01630 int bdd_pick_all_terms(DDMgr_ptr , bdd_ptr, bdd_ptr *, int, bdd_ptr *, int);
01631
01641 bdd_ptr bdd_support(DDMgr_ptr , bdd_ptr);
01642
01651 int bdd_size(DDMgr_ptr , bdd_ptr);
01652
01664 double bdd_count_minterm(DDMgr_ptr , bdd_ptr, int);
01665
01676 bdd_ptr bdd_new_var_with_index(DDMgr_ptr , int);
01677
01685 bdd_ptr bdd_get_one_sparse_sat(DDMgr_ptr , bdd_ptr);
01686
01697 bdd_ptr bdd_cube_diff(DDMgr_ptr , bdd_ptr, bdd_ptr);
01698
01709 bdd_ptr bdd_cube_union(DDMgr_ptr , bdd_ptr, bdd_ptr);
01710
01721 bdd_ptr bdd_cube_intersection(DDMgr_ptr , bdd_ptr, bdd_ptr);
01722
01730 int bdd_get_lowest_index(DDMgr_ptr , bdd_ptr);
01731
01740 bdd_ptr bdd_largest_cube(DDMgr_ptr , bdd_ptr, int *);
01741
01750 bdd_ptr bdd_compute_prime_low(DDMgr_ptr , bdd_ptr, bdd_ptr);
01751
01760 array_t * bdd_compute_primes_low(DDMgr_ptr , bdd_ptr, bdd_ptr);
01761
01769 array_t * bdd_compute_primes(DDMgr_ptr dd, bdd_ptr b);
01770
01780 bdd_ptr bdd_make_prime(DDMgr_ptr dd, bdd_ptr cube, bdd_ptr b);
01781
01793 bdd_ptr bdd_compute_essentials(DDMgr_ptr dd, bdd_ptr b);
01794
01812 int bdd_DumpBlif(DDMgr_ptr dd, int n, bdd_ptr *f, char **inames, char **onames, char *mname, FILE *fp);
01813
01833 int bdd_DumpBlifBody(DDMgr_ptr dd, int n, bdd_ptr *f, char **inames, char **onames, FILE *fp);
01834
01843 int bdd_leq(DDMgr_ptr dd, bdd_ptr f, bdd_ptr g);
01844
01857 bdd_ptr bdd_swap_variables(DDMgr_ptr dd, bdd_ptr f, bdd_ptr *x_varlist, bdd_ptr *y_varlist, int n);
01858
01871 bdd_ptr bdd_compose(DDMgr_ptr dd, bdd_ptr f, bdd_ptr g, int v);
01872
01881 int bdd_ref_count(DDMgr_ptr dd, bdd_ptr n);
01882
01892 int calculate_bdd_value(DDMgr_ptr mgr, bdd_ptr f, int* values);
01893
01894
01895
01896 #endif