NodeList_ptr SymbLayer_iter_to_list(const SymbLayer_ptr self, SymbLayerIter iter) { NodeList_ptr res = NodeList_create(); while (!SymbLayer_iter_is_end(self, &iter)) { NodeList_append(res, SymbLayer_iter_get_symbol(self, &iter)); SymbLayer_iter_next(self, &iter); } return res; }
/**Function******************************************************************** Synopsis [Prints statistical information of a formula.] Description [Prints statistical information about a given formula. It is computed taking care of the encoding and of the indifferent variables in the encoding.] SideEffects [] SeeAlso [] ******************************************************************************/ void BddEnc_print_formula_info(BddEnc_ptr self, Expr_ptr formula, boolean print_models, boolean print_formula, FILE* out) { bdd_ptr phi; double cardinality; phi = BddEnc_expr_to_bdd(self, formula, Nil); cardinality = BddEnc_get_minterms_of_bdd(self, phi); fprintf(out, "formula models: %g (2^%g)\n", cardinality, log(cardinality)/log(2.0)); /* one of these flags can be enabled, not both */ nusmv_assert(!print_models || !print_formula); if (print_models) { BddEnc_print_set_of_trans_models(self, phi, /* false, */ out); } else if (print_formula) { BoolEnc_ptr benc = BoolEncClient_get_bool_enc(BOOL_ENC_CLIENT(self)); const array_t* layer_names = BaseEnc_get_committed_layer_names(BASE_ENC(self)); SymbTable_ptr st = BaseEnc_get_symb_table(BASE_ENC(self)); NodeList_ptr all_vars = SymbTable_get_layers_sf_vars(st, layer_names); NodeList_ptr scalar_vars = NodeList_create(); ListIter_ptr iter; /* encoding variables are not allowed in the wff printer */ NODE_LIST_FOREACH(all_vars, iter) { node_ptr v = NodeList_get_elem_at(all_vars, iter); if (BoolEnc_is_var_bit(benc, v)) continue; NodeList_append(scalar_vars, v); } NodeList_destroy(all_vars); fprintf(nusmv_stdout, "\nFORMULA = \n"); BddEnc_print_bdd_wff(self, phi, scalar_vars, true, false, 0, out); NodeList_destroy(scalar_vars); }
int Compass_write_sigref(NuSMVEnv_ptr env, BddFsm_ptr fsm, FILE* sigref_file, FILE* prob_file, /* can be NULL */ FILE* ap_file, /* can be NULL */ Expr_ptr tau, /* can be NULL */ boolean do_indent /* Beautify the XML output */ ) { BddEnc_ptr enc = BddFsm_get_bdd_encoding(fsm); DDMgr_ptr dd = BddEnc_get_dd_manager(enc); const NodeMgr_ptr nodemgr = NODE_MGR(NuSMVEnv_get_value(env, ENV_NODE_MGR)); const TypeChecker_ptr tc = BaseEnc_get_type_checker(BASE_ENC(enc)); NodeList_ptr ap_list_add = NODE_LIST(NULL); NodeList_ptr probs_list = NULL; NodeList_ptr ap_list = NULL; int retval = 0; add_ptr prob_add; add_ptr init_add; add_ptr trans_add; add_ptr tau_add; bdd_ptr bdd_trans; bdd_ptr state_mask = NULL; bdd_ptr input_mask = NULL; bdd_ptr next_state_mask = NULL; bdd_ptr next_and_curr_state_mask = NULL; /* preprocessing of the parameters */ /* tau */ if (EXPR(NULL) != tau) { tau = Compile_FlattenSexp(BaseEnc_get_symb_table(BASE_ENC(enc)), car(tau) /* gets rid of SIMPWFF */, Nil); } /* prob_file */ if (NULL != prob_file) { ParserProb_ptr pl_parser = NULL; pl_parser = ParserProb_create(env); ParserProb_parse_from_file(pl_parser, prob_file); probs_list = ParserProb_get_prob_list(pl_parser); if (NODE_LIST(NULL) != probs_list) { Compass_check_prob_list(tc, probs_list); } ParserProb_destroy(pl_parser); } /* ap_file */ if (NULL != ap_file) { ParserAp_ptr ap_parser = NULL; ap_parser = ParserAp_create(env); ParserAp_parse_from_file(ap_parser, ap_file); ap_list = ParserAp_get_ap_list(ap_parser); if (NODE_LIST(NULL) != ap_list) { Compass_check_ap_list(tc, ap_list); } ParserAp_destroy(ap_parser); } /* collects all required pieces */ state_mask = BddEnc_get_state_frozen_vars_mask_bdd(enc); input_mask = BddEnc_get_input_vars_mask_bdd(enc); next_state_mask = BddEnc_state_var_to_next_state_var(enc, state_mask); next_and_curr_state_mask = bdd_and(dd, state_mask, next_state_mask); { /* calculates the initial states */ bdd_ptr bdd_init = BddFsm_get_init(fsm); bdd_ptr bdd_sinvar = BddFsm_get_state_constraints(fsm); bdd_ptr bdd_iinvar = BddFsm_get_input_constraints(fsm); bdd_and_accumulate(dd, &bdd_init, bdd_sinvar); bdd_and_accumulate(dd, &bdd_init, bdd_iinvar); bdd_and_accumulate(dd, &bdd_init, state_mask); init_add = bdd_to_add(dd, bdd_init); bdd_free(dd, bdd_iinvar); bdd_free(dd, bdd_sinvar); bdd_free(dd, bdd_init); } { /* to control dynamic reordering */ dd_reorderingtype method; int dd_reord_status; /* Dynamic reordering during monolithic trans can improve performances */ dd_reord_status = dd_reordering_status(dd, &method); dd_autodyn_enable(dd, method); { /* calculates the transition relation */ bdd_ptr bdd_sinvar = BddFsm_get_state_constraints(fsm); bdd_ptr bdd_nsinvar = BddEnc_state_var_to_next_state_var(enc, bdd_sinvar); bdd_ptr bdd_iinvar = BddFsm_get_input_constraints(fsm); bdd_trans = BddFsm_get_monolithic_trans_bdd(fsm); bdd_and_accumulate(dd, &bdd_trans, bdd_sinvar); bdd_and_accumulate(dd, &bdd_trans, bdd_nsinvar); bdd_and_accumulate(dd, &bdd_trans, bdd_iinvar); bdd_and_accumulate(dd, &bdd_trans, next_and_curr_state_mask); bdd_and_accumulate(dd, &bdd_trans, input_mask); /* #define DEBUG_TRANS */ #ifdef DEBUG_TRANS FILE * p = stdout; // fopen("TRANS.txt", "w"); fprintf(p, "==================================================\n"); fprintf(p, "TRANS\n"); fprintf(p, "==================================================\n"); // print_trans(enc, bdd_trans, p); dd_printminterm(dd, bdd_trans); fprintf(p, "==================================================\n"); dd_printminterm(dd, input_mask); fprintf(p, "==================================================\n"); // fclose(p); #endif trans_add = bdd_to_add(dd, bdd_trans); bdd_free(dd, bdd_iinvar); bdd_free(dd, bdd_nsinvar); bdd_free(dd, bdd_sinvar); } /* Dynamic reordering is disabled after monolitic construction. Later it will be re-enabled if it was enable before entering this block */ dd_autodyn_disable(dd); /* probability and tau are optional */ if (probs_list != NODE_LIST(NULL)) { prob_add = Compass_process_prob_list(enc, probs_list, bdd_trans); } else prob_add = (add_ptr) NULL; bdd_free(dd, bdd_trans); if (tau != (Expr_ptr) NULL) { tau_add = BddEnc_expr_to_add(enc, tau, Nil); /* [RC]: This code was disable because it seems masks for input * var do not work */ /* mask_tau_add = BddEnc_apply_input_vars_mask_add(enc, tau_add); */ /* add_free(dd, tau_add); */ /* tau_add = mask_tau_add; */ } else tau_add = (add_ptr) NULL; if (NODE_LIST(NULL) != ap_list) { add_ptr expr_add, expr_add_mask; ListIter_ptr iter; ap_list_add = NodeList_create(); NODE_LIST_FOREACH(ap_list, iter) { node_ptr ap_el = (node_ptr)NodeList_get_elem_at(ap_list, iter); node_ptr lab = car(ap_el); node_ptr expr = cdr(ap_el); expr_add = BddEnc_expr_to_add(enc, expr, Nil); expr_add_mask = BddEnc_apply_state_frozen_vars_mask_add(enc, expr_add); NodeList_append(ap_list_add, cons(nodemgr, lab, (node_ptr)expr_add_mask)); add_free(dd, expr_add); /* The expr_add_mask will be freed later when the ap_list_add will be destroyed */ } }