/*! \brief Private method called by the constructor Called by the constructor */ static void symb_layer_init(SymbLayer_ptr self, const char* name, const LayerInsertPolicy policy, SymbCache_ptr cache) { NuSMVEnv_ptr env = SymbCache_get_environment(cache); self->options = OPTS_HANDLER(NuSMVEnv_get_value(env, ENV_OPTS_HANDLER)); self->streams = STREAM_MGR(NuSMVEnv_get_value(env, ENV_STREAM_MANAGER)); self->logger = LOGGER(NuSMVEnv_get_value(env, ENV_LOGGER)); self->printer = MASTER_PRINTER(NuSMVEnv_get_value(env, ENV_WFF_PRINTER)); self->errors = ERROR_MGR(NuSMVEnv_get_value(env, ENV_ERROR_MANAGER)); self->name = (char*) NULL; SymbLayer_set_name(self, name); self->insert_policy = policy; self->committed_to_encs = 0; self->cache = cache; self->symbols_allocated = INITIAL_SYMBOLS_ARRAY_SIZE; self->symbols_index = 0; self->symbols_empty = 0; self->symbols = ALLOC(node_ptr, self->symbols_allocated); self->symbol2position = new_assoc(); /* Counters */ self->constants_num = 0; self->state_vars_num = 0; self->input_vars_num = 0; self->frozen_vars_num = 0; self->bool_state_vars_num = 0; self->bool_input_vars_num = 0; self->bool_frozen_vars_num = 0; self->defines_num = 0; self->functions_num = 0; self->array_defines_num = 0; self->variable_arrays_num = 0; self->parameters_num = 0; }
void Be_Cnf_RemoveDuplicateLiterals(Be_Cnf_ptr self) { int i, j; Siter iter; int * clause = (int *)NULL; hash_ptr lits = (hash_ptr)NULL; nusmv_assert(self != NULL); lits = new_assoc(); for (iter = Slist_first(Be_Cnf_GetClausesList(self)); !Siter_is_end(iter); iter = Siter_next(iter)) { clause = (int*) Siter_element(iter); i = 0; while (clause[i] != 0) { if (Nil != find_assoc(lits, NODE_FROM_INT(clause[i]))) { j = i+1; while (clause[j] != 0) { clause[j-1] = clause[j]; j++; } } else { insert_assoc(lits, NODE_FROM_INT(clause[i]), NODE_FROM_INT(1)); } i++; } /* this clear the hash */ clear_assoc(lits); } free_assoc(lits); }
Trace_ptr Bmc_fill_trace_from_cnf_model(const BeEnc_ptr be_enc, const Slist_ptr cnf_model, int k, Trace_ptr trace) { TraceIter first; /* local refs */ const NuSMVEnv_ptr env = EnvObject_get_environment(ENV_OBJECT(be_enc)); const ExprMgr_ptr exprs = EXPR_MGR(NuSMVEnv_get_value(env, ENV_EXPR_MANAGER)); const BoolEnc_ptr bool_enc = \ BoolEncClient_get_bool_enc(BOOL_ENC_CLIENT(be_enc)); const NodeMgr_ptr nodemgr = NODE_MGR(NuSMVEnv_get_value(env, ENV_NODE_MGR)); const Be_Manager_ptr be_mgr = BeEnc_get_be_manager(be_enc); const SymbTable_ptr st = BaseEnc_get_symb_table(BASE_ENC(be_enc)); hash_ptr tvar_2_bval = new_assoc(); hash_ptr time_2_step = new_assoc(); Siter genLiteral; nusmv_ptrint cnfLiteral; nusmv_ptrint beLiteral; int i; TRACE_CHECK_INSTANCE(trace); nusmv_assert(Trace_is_empty(trace)); first = Trace_first_iter(trace); /* phase 0: setup trace iterators for all times */ insert_assoc(time_2_step, NODE_FROM_INT(0), (node_ptr)(first)); for (i = 1; i <= k; ++ i) { TraceIter step = Trace_append_step(trace); insert_assoc(time_2_step, NODE_FROM_INT(i), (node_ptr)(step)); } /* phase 1: we consider only the cnf variables corresponding to BE variables in the range [0, k]. Thus we ignore the cnf variables that are not corresponding to the encoding of the: - model variables; - encoding variables (sub formulas, loop variables, ...) */ SLIST_FOREACH(cnf_model, genLiteral) { int var_idx, ut_index, vtime; node_ptr var, key; cnfLiteral = (nusmv_ptrint) Siter_element(genLiteral); beLiteral = (nusmv_ptrint) Be_CnfLiteral2BeLiteral(be_mgr, cnfLiteral); /* if there is no corresponding rbc variable skip this */ if (0 == beLiteral) continue; /* get timed var */ var_idx = Be_BeLiteral2BeIndex(be_mgr, beLiteral); ut_index = BeEnc_index_to_untimed_index(be_enc, var_idx); vtime = BeEnc_index_to_time(be_enc, var_idx); var = BeEnc_index_to_name(be_enc, ut_index); /* needed to adapt to new trace timing format, input is stored in the next step */ if (SymbTable_is_symbol_input_var(st, var)) { ++ vtime; } if (vtime > k) continue; /* if it's a bit get/create a BitValues structure for the scalar variable which this bit belongs */ if (BoolEnc_is_var_bit(bool_enc, var)) { node_ptr scalar_var = BoolEnc_get_scalar_var_from_bit(bool_enc, var); BitValues_ptr bv; key = find_node(nodemgr, ATTIME, scalar_var, NODE_FROM_INT(vtime)); bv = BIT_VALUES(find_assoc(tvar_2_bval, key)); if (BIT_VALUES(NULL) == bv) { bv = BitValues_create(bool_enc, scalar_var); insert_assoc(tvar_2_bval, key, (node_ptr)(bv)); } /* set the bit value */ BitValues_set(bv, BoolEnc_get_index_from_bit(bool_enc, var), (beLiteral >= 0) ? BIT_VALUE_TRUE : BIT_VALUE_FALSE); } else { /* boolean variables do not require any further processing */ TraceIter timed_step = (-1 != vtime) /* frozenvars */ ? TRACE_ITER(find_assoc(time_2_step, NODE_FROM_INT(vtime))) : first ; nusmv_assert(TRACE_END_ITER != timed_step); Trace_step_put_value(trace, timed_step, var, beLiteral >= 0 ? ExprMgr_true(exprs) : ExprMgr_false(exprs)); } } /* SLIST_FOREACH (phase 1) */
int trace_explainer_action(const TracePlugin_ptr self) { const Trace_ptr trace = self->trace; const SymbTable_ptr symb_table = Trace_get_symb_table(trace); const NuSMVEnv_ptr env = EnvObject_get_environment(ENV_OBJECT(symb_table)); TraceIter start_iter; TraceIter stop_iter; TraceIter step; TraceIteratorType input_iter_type; TraceIteratorType state_iter_type; TraceIteratorType combo_iter_type; hash_ptr changed_states; int i; OStream_ptr out = TraceOpt_output_stream(self->opt); start_iter = (0 != TraceOpt_from_here(self->opt)) ? trace_ith_iter(trace, TraceOpt_from_here(self->opt)) : trace_first_iter(trace); stop_iter = (0 != TraceOpt_to_here(self->opt)) ? trace_ith_iter(trace, 1 + TraceOpt_to_here(self->opt)) : TRACE_END_ITER; input_iter_type = TraceOpt_show_defines(self->opt) ? TRACE_ITER_I_SYMBOLS : TRACE_ITER_I_VARS; state_iter_type = TraceOpt_show_defines(self->opt) ? TRACE_ITER_SF_SYMBOLS : TRACE_ITER_SF_VARS; combo_iter_type = TraceOpt_show_defines(self->opt) ? (TraceOpt_show_defines_with_next(self->opt) ? TRACE_ITER_COMBINATORIAL : TRACE_ITER_SI_DEFINES) : TRACE_ITER_NONE; OStream_printf(out, "Trace Description: %s \n", Trace_get_desc(trace)); OStream_printf(out, "Trace Type: %s \n", TraceType_to_string(env, Trace_get_type(trace))); /* indent */ OStream_inc_indent_size(out); changed_states = new_assoc(); nusmv_assert(changed_states != (hash_ptr)NULL); i = MAX(1, TraceOpt_from_here(self->opt)); step = start_iter; while (stop_iter != step) { TraceStepIter iter; node_ptr symb; node_ptr val; boolean input_header = false; /* lazy defines evaluation */ if (TraceOpt_show_defines(self->opt)) { trace_step_evaluate_defines(trace, step); } /* COMBINATORIAL SECTION (optional) */ TRACE_STEP_FOREACH(trace, step, combo_iter_type, iter, symb, val) { /* skip non-visible symbols */ if (!trace_plugin_is_visible_symbol(self, symb)) continue; /* if required, print only symbols with changed values */ if (TRACE_EXPLAINER(self)->changes_only) { if (val == find_assoc(changed_states, symb)) { continue; } insert_assoc(changed_states, symb, val); } TracePlugin_print_assignment(self, symb, val); } /* foreach SI_DEFINES */ /* INPUT SECTION (optional) */ TRACE_STEP_FOREACH(trace, step, input_iter_type, iter, symb, val) { if (false == input_header) { OStream_printf(out, "-> Input: %d.%d <-\n", Trace_get_id(trace), i); input_header = true; } /* skip non-visible symbols */ if (!trace_plugin_is_visible_symbol(self, symb)) continue; /* if required, print only symbols with changed values */ if (TRACE_EXPLAINER(self)->changes_only) { if (val == find_assoc(changed_states, symb)) { continue; } insert_assoc(changed_states, symb, val); } TracePlugin_print_assignment(self, symb, val); } /* foreach I_SYMBOLS */ if (Trace_step_is_loopback(trace, step)) { OStream_printf(out, "-- Loop starts here\n"); } /* STATE SECTION (mandatory) */ OStream_printf(out, "-> State: %d.%d <-\n", Trace_get_id(trace), i); TRACE_STEP_FOREACH(trace, step, state_iter_type, iter, symb, val) { /* skip non-visible symbols */ if (!trace_plugin_is_visible_symbol(self, symb)) continue; /* if required, print only symbols with changed values */ if (TRACE_EXPLAINER(self)->changes_only) { if (val == find_assoc(changed_states, symb)) { continue; } insert_assoc(changed_states, symb, val); } TracePlugin_print_assignment(self, symb, val); } /* foreach SF_SYMBOLS */ ++ i; step = TraceIter_get_next(step); } /* while */ free_assoc(changed_states); /* deindent */ OStream_dec_indent_size(out); return 0; }
/**Function******************************************************************** Synopsis [Inline caching private service] Description [] SideEffects [] SeeAlso [] ******************************************************************************/ void rbc_inlining_cache_init() { nusmv_assert(inlining_cache == (hash_ptr) NULL); inlining_cache = new_assoc(); }
/**Function******************************************************************** Synopsis [Initializes the wff2nff conversion system] Description [Initializes the wff2nff conversion system] SideEffects [] SeeAlso [] ******************************************************************************/ void w2w_init_wff2nnf() { nusmv_assert(wff2nnf_hash == (hash_ptr) NULL); wff2nnf_hash = new_assoc(); }