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
00038 #ifndef __NUSMV_CORE_ENC_BDD_BDD_ENC_H__
00039 #define __NUSMV_CORE_ENC_BDD_BDD_ENC_H__
00040
00041 #include "nusmv/core/enc/bdd/bdd.h"
00042 #include "nusmv/core/enc/base/BoolEncClient.h"
00043 #include "nusmv/core/enc/bool/BoolEnc.h"
00044 #include "nusmv/core/enc/utils/OrdGroups.h"
00045
00046 #include "nusmv/core/compile/symb_table/SymbTable.h"
00047 #include "nusmv/core/wff/ExprMgr.h"
00048 #include "nusmv/core/fsm/bdd/bdd.h"
00049 #include "nusmv/core/dd/dd.h"
00050 #include "nusmv/core/dd/VarsHandler.h"
00051
00052 #include "nusmv/core/utils/utils.h"
00053 #include "nusmv/core/utils/object.h"
00054 #include "nusmv/core/utils/assoc.h"
00055 #include "nusmv/core/utils/OStream.h"
00056
00057 #include "nusmv/core/enc/utils/AddArray.h"
00058
00065 typedef struct BddEnc_TAG* BddEnc_ptr;
00066
00072 typedef void (*VPFNNF)(FILE*, node_ptr, node_ptr);
00073
00074 typedef void (*VPFBEFNNV)(BddEnc_ptr, OStream_ptr, node_ptr, node_ptr, void*);
00075
00081 typedef enum { DUMP_FORMAT_INVALID,
00082 DUMP_FORMAT_DOT,
00083 DUMP_FORMAT_DAVINCI,
00084 } t_format;
00085
00092 #define BDD_ENC(self) \
00093 ((BddEnc_ptr) self)
00094
00100 #define BDD_ENC_CHECK_INSTANCE(self) \
00101 (nusmv_assert(BDD_ENC(self) != BDD_ENC(NULL)))
00102
00108 typedef enum {
00109 DUMP_DEFAULT,
00110 DUMP_BITS,
00111 DUMP_SCALARS_ONLY
00112 } VarOrderingType;
00113
00114
00115
00121 #define __BDDENC_LAZY_COMMIT_LAYER__ 1
00122
00125
00126
00127
00128
00139 BddEnc_ptr
00140 BddEnc_create(SymbTable_ptr symb_table,
00141 BoolEnc_ptr bool_enc, VarsHandler_ptr dd_vars_hndr,
00142 OrdGroups_ptr ord_groups);
00143
00152 VIRTUAL
00153 void BddEnc_destroy(BddEnc_ptr self);
00154
00161 VarsHandler_ptr
00162 BddEnc_get_dd_vars_handler(const BddEnc_ptr self);
00163
00170 DDMgr_ptr BddEnc_get_dd_manager(const BddEnc_ptr self);
00171
00182 OrdGroups_ptr BddEnc_get_ord_groups(const BddEnc_ptr self);
00183
00198 add_ptr
00199 BddEnc_expr_to_add(BddEnc_ptr self, const Expr_ptr expr,
00200 const node_ptr context);
00201
00219 AddArray_ptr
00220 BddEnc_expr_to_addarray(BddEnc_ptr self, const Expr_ptr expr,
00221 const node_ptr context);
00222
00236 bdd_ptr
00237 BddEnc_expr_to_bdd(BddEnc_ptr self, const Expr_ptr expr,
00238 const node_ptr context);
00239
00264 node_ptr
00265 BddEnc_add_to_expr(BddEnc_ptr self, const add_ptr add,
00266 SymbLayer_ptr det_layer);
00267
00289 node_ptr
00290 BddEnc_add_to_scalar_expr(BddEnc_ptr self, const add_ptr add,
00291 SymbLayer_ptr det_layer);
00292
00302 node_ptr
00303 BddEnc_bdd_to_expr(BddEnc_ptr self, const bdd_ptr bdd);
00304
00313 BddVarSet_ptr
00314 BddEnc_get_state_vars_cube(const BddEnc_ptr self);
00315
00324 BddVarSet_ptr
00325 BddEnc_get_next_state_vars_cube(const BddEnc_ptr self);
00326
00335 BddVarSet_ptr
00336 BddEnc_get_frozen_vars_cube(const BddEnc_ptr self);
00337
00349 BddVarSet_ptr
00350 BddEnc_get_state_frozen_vars_cube(const BddEnc_ptr self);
00351
00363 BddVarSet_ptr
00364 BddEnc_get_state_next_state_frozen_vars_cube(const BddEnc_ptr self);
00365
00374 BddVarSet_ptr
00375 BddEnc_get_input_vars_cube(const BddEnc_ptr self);
00376
00387 BddVarSet_ptr
00388 BddEnc_get_layer_vars_cube(const BddEnc_ptr self,
00389 SymbLayer_ptr layer,
00390 SymbFilterType vt);
00391
00404 boolean
00405 BddEnc_is_var_in_cube(const BddEnc_ptr self,
00406 node_ptr name, add_ptr cube);
00407
00418 add_ptr
00419 BddEnc_state_var_to_next_state_var_add(const BddEnc_ptr self,
00420 add_ptr add);
00421
00432 add_ptr
00433 BddEnc_next_state_var_to_state_var_add(const BddEnc_ptr self,
00434 add_ptr add);
00435
00445 bdd_ptr
00446 BddEnc_state_var_to_next_state_var(const BddEnc_ptr self, bdd_ptr bdd);
00447
00457 bdd_ptr
00458 BddEnc_next_state_var_to_state_var(const BddEnc_ptr self, bdd_ptr bdd);
00459
00471 void
00472 BddEnc_print_bdd_begin(BddEnc_ptr self, NodeList_ptr symbols,
00473 boolean changes_only);
00474
00483 void
00484 BddEnc_print_bdd_end(BddEnc_ptr self);
00485
00498 int
00499 BddEnc_print_bdd(BddEnc_ptr self,
00500 bdd_ptr bdd,
00501 VPFBEFNNV p_fun,
00502 OStream_ptr file,
00503 void* arg);
00504
00512 void
00513 BddEnc_print_set_of_states(BddEnc_ptr self,
00514 bdd_ptr states,
00515 boolean changes_only,
00516 boolean print_defines,
00517 VPFBEFNNV p_fun,
00518 OStream_ptr file,
00519 void* arg);
00520
00528 void
00529 BddEnc_print_set_of_inputs(BddEnc_ptr self,
00530 bdd_ptr inputs,
00531 boolean changes_only,
00532 VPFBEFNNV p_fun,
00533 OStream_ptr file,
00534 void* arg);
00535
00544 void
00545 BddEnc_print_set_of_state_input_pairs(BddEnc_ptr self,
00546 bdd_ptr state_input_pairs,
00547 boolean changes_only,
00548 VPFBEFNNV p_fun,
00549 OStream_ptr file,
00550 void* arg);
00551
00560 void
00561 BddEnc_print_set_of_trans_models(BddEnc_ptr self,
00562 bdd_ptr state_input_pairs,
00563
00564 OStream_ptr file);
00565
00598 node_ptr
00599 BddEnc_assign_symbols(BddEnc_ptr self, bdd_ptr bdd,
00600 NodeList_ptr symbols,
00601 boolean onlyRequiredSymbs,
00602 bdd_ptr* resultBdd);
00603
00616 void
00617 BddEnc_print_vars_in_cube(BddEnc_ptr self, bdd_ptr cube,
00618 node_ptr list_of_sym,
00619 OStream_ptr file);
00620
00634 NodeList_ptr BddEnc_get_vars_in_cube(const BddEnc_ptr self,
00635 bdd_ptr cube,
00636 node_ptr list_of_sym,
00637 boolean include_next);
00638
00643 NodeList_ptr BddEnc_get_var_ordering(const BddEnc_ptr self,
00644 const VarOrderingType ord_type);
00645
00663 int
00664 BddEnc_write_var_ordering(const BddEnc_ptr self,
00665 const char* oo_filename,
00666 const VarOrderingType dump_type);
00667
00682 int BddEnc_get_reordering_count(const BddEnc_ptr self);
00683
00696 void BddEnc_reset_reordering_count(BddEnc_ptr self);
00697
00706 double
00707 BddEnc_count_states_of_add(const BddEnc_ptr self, add_ptr add);
00708
00716 double
00717 BddEnc_count_states_of_bdd(const BddEnc_ptr self, bdd_ptr bdd);
00718
00725 double
00726 BddEnc_count_inputs_of_bdd(const BddEnc_ptr self, bdd_ptr bdd);
00727
00735 double
00736 BddEnc_count_states_inputs_of_bdd(const BddEnc_ptr self, bdd_ptr bdd);
00737
00745 double
00746 BddEnc_get_minterms_of_add(const BddEnc_ptr self, add_ptr add);
00747
00755 double
00756 BddEnc_get_minterms_of_bdd(const BddEnc_ptr self, bdd_ptr bdd);
00757
00768 bdd_ptr
00769 BddEnc_pick_one_state(const BddEnc_ptr self, bdd_ptr states);
00770
00780 bdd_ptr
00781 BddEnc_pick_one_input(const BddEnc_ptr self, bdd_ptr inputs);
00782
00795 bdd_ptr
00796 BddEnc_pick_one_input_state(const BddEnc_ptr self,
00797 bdd_ptr inputs_states);
00798
00817 boolean
00818 BddEnc_pick_all_terms_states_inputs(const BddEnc_ptr self,
00819 bdd_ptr bdd,
00820 bdd_ptr* result_array,
00821 const int array_len);
00822
00840 boolean
00841 BddEnc_pick_all_terms_states(const BddEnc_ptr self, bdd_ptr bdd,
00842 bdd_ptr* result_array,
00843 const int array_len);
00844
00860 boolean
00861 BddEnc_pick_all_terms_inputs(const BddEnc_ptr self, bdd_ptr bdd,
00862 bdd_ptr* result_array,
00863 const int array_len);
00864
00876 bdd_ptr
00877 BddEnc_pick_one_state_rand(const BddEnc_ptr self, bdd_ptr states);
00878
00888 bdd_ptr
00889 BddEnc_pick_one_input_rand(const BddEnc_ptr self, bdd_ptr inputs);
00890
00903 bdd_ptr
00904 BddEnc_pick_one_input_state_rand(const BddEnc_ptr self,
00905 bdd_ptr inputs_states);
00906
00918 node_ptr
00919 BddEnc_get_var_name_from_index(const BddEnc_ptr self, int index);
00920
00932 boolean
00933 BddEnc_has_var_at_index(const BddEnc_ptr self, int index);
00934
00945 int
00946 BddEnc_get_var_index_from_name(const BddEnc_ptr self, node_ptr name);
00947
00965 add_ptr
00966 BddEnc_constant_to_add(const BddEnc_ptr self, node_ptr constant);
00967
00980 add_ptr
00981 BddEnc_eval_sign_add(BddEnc_ptr self, add_ptr a, int flag);
00982
00994 bdd_ptr
00995 BddEnc_eval_sign_bdd(BddEnc_ptr self, bdd_ptr a, int flag);
00996
01007 int
01008 BddEnc_eval_num(BddEnc_ptr self, node_ptr e, node_ptr context);
01009
01020 add_ptr
01021 BddEnc_eval_constant(BddEnc_ptr self, Expr_ptr expr, node_ptr context);
01022
01038 AddArray_ptr
01039 BddEnc_get_symbol_add(BddEnc_ptr self, node_ptr name);
01040
01050 add_ptr
01051 BddEnc_get_state_frozen_vars_mask_add(BddEnc_ptr self);
01052
01061 add_ptr
01062 BddEnc_get_input_vars_mask_add(BddEnc_ptr self);
01063
01073 add_ptr
01074 BddEnc_get_state_frozen_input_vars_mask_add(BddEnc_ptr self);
01075
01085 bdd_ptr
01086 BddEnc_get_state_frozen_vars_mask_bdd(BddEnc_ptr self);
01087
01096 bdd_ptr
01097 BddEnc_get_input_vars_mask_bdd(BddEnc_ptr self);
01098
01108 bdd_ptr
01109 BddEnc_get_state_frozen_input_vars_mask_bdd(BddEnc_ptr self);
01110
01120 add_ptr
01121 BddEnc_apply_state_frozen_vars_mask_add(BddEnc_ptr self, add_ptr states);
01122
01132 add_ptr
01133 BddEnc_apply_input_vars_mask_add(BddEnc_ptr self, add_ptr inputs);
01134
01144 add_ptr
01145 BddEnc_apply_state_frozen_input_vars_mask_add(BddEnc_ptr self,
01146 add_ptr states_inputs);
01147
01157 BddStates
01158 BddEnc_apply_state_frozen_vars_mask_bdd(BddEnc_ptr self,
01159 BddStates states);
01160
01170 BddInputs
01171 BddEnc_apply_input_vars_mask_bdd(BddEnc_ptr self, BddInputs inputs);
01172
01182 BddStatesInputs
01183 BddEnc_apply_state_frozen_input_vars_mask_bdd(BddEnc_ptr self,
01184 BddStatesInputs states_inputs);
01185
01195 add_ptr
01196 BddEnc_get_var_mask(BddEnc_ptr self, node_ptr var_name);
01197
01227 array_t*
01228 BddEnc_ComputePrimeImplicants(BddEnc_ptr self,
01229 const array_t* layer_names,
01230 bdd_ptr formula);
01231
01242 void
01243 BddEnc_force_order(BddEnc_ptr self, OrdGroups_ptr new_po_grps);
01244
01257 void
01258 BddEnc_force_order_from_file(BddEnc_ptr self, FILE* orderfile);
01259
01278 void
01279 BddEnc_print_bdd_wff(BddEnc_ptr self, bdd_ptr bdd, NodeList_ptr vars,
01280 boolean do_sharing, boolean do_indent,
01281 int start_at_column, OStream_ptr out);
01282
01291 void
01292 BddEnc_print_formula_info(BddEnc_ptr self, Expr_ptr formula,
01293 boolean print_models, boolean print_formula,
01294 OStream_ptr out);
01295
01318 node_ptr
01319 BddEnc_bdd_to_wff(BddEnc_ptr self, bdd_ptr bdd, NodeList_ptr vars);
01320
01330 void
01331 BddEnc_clean_evaluation_cache(BddEnc_ptr self);
01332
01349 BddVarSet_ptr BddEnc_get_vars_cube(const BddEnc_ptr self,
01350 Set_t vars,
01351 SymbFilterType vt);
01352
01367 BddVarSet_ptr
01368 BddEnc_get_unfiltered_vars_cube(const BddEnc_ptr self, Set_t vars);
01369
01379 int BddEnc_dump_addarray_dot(BddEnc_ptr self,
01380 AddArray_ptr addarray,
01381 const char** labels,
01382 FILE* outfile);
01383
01393 int BddEnc_dump_addarray_davinci(BddEnc_ptr self,
01394 AddArray_ptr addarray,
01395 const char** labels,
01396 FILE* outfile);
01397
01398
01399
01405 void
01406 BddEnc_print_formula(const NuSMVEnv_ptr env, node_ptr constr,
01407 const boolean verbose, const boolean formula);
01408
01415 int
01416 BddEnc_dump_expr(const BddEnc_ptr self, const node_ptr parsed_expr,
01417 const char* str_constr, const t_format format,
01418 FILE* outfile);
01419
01422 #endif