method vfunc f =
let spec= Kernel_function.get_spec (Globals.Functions.get f.svar) in
let preds_pre = Ltl_utils.pre_post_to_term (Data_for_ltl.get_func_pre f.svar.vname) in
let preds_post_bc = Data_for_ltl.get_func_post_bycase f.svar.vname in
let preds_pre_with_called_stat = fun preds_pre -> (
if Ltl_to_acsl_option.AddingOperationNameAndStatusInSpecification.get() then begin
let called_pre = Logic_const.prel (Req ,Ltl_utils.mk_term_from_vi (Data_for_ltl.get_varinfo Data_for_ltl.curOpStatus), (Logic_utils.mk_dummy_term (TConst(Data_for_ltl.op_status_to_cenum Promelaast.Call)) Cil.intType)) in
let called_pre_2 = Logic_const.prel (Req ,Ltl_utils.mk_term_from_vi (Data_for_ltl.get_varinfo Data_for_ltl.curOp), (Logic_utils.mk_dummy_term (TConst(Data_for_ltl.func_to_cenum f.svar.vname)) Cil.intType)) in
List.append [called_pre;called_pre_2] preds_pre
end
else
preds_pre
)in
let preds_pre = preds_pre_with_called_stat preds_pre in
List.iter
(fun p -> spec.spec_requires <- ((Logic_const.new_predicate p) :: (spec.spec_requires)) )
preds_pre;
let nb_states=Data_for_ltl.getNumberOfStates() in
let treated=ref (Array.make nb_states false) in
let nb_behavior = ref 0 in
let save_assumes_l = ref [] in
let old_behavior = ref {b_name = ""; b_assumes = []; b_ensures = []; b_assigns = []; } in
Array.iteri
(fun case preds_post ->
if (not (Spec_tools.is_empty_behavior preds_post) )
&& (not (!treated).(case))
then begin
let new_behavior =
{
b_name = "Buchi_property_behavior_"^(string_of_int case);
b_assumes = [] ;
b_ensures = [] ;
b_assigns = [] ;
}
in
let all_eqs_states = get_other_states_with_equivalent_post nb_states preds_post_bc case in
let assumes_l = ref [] in
Array.iteri
(fun i b -> if b then
assumes_l:=Logic_const.prel(
Rneq,
Ltl_utils.zero_term(),
Ltl_utils.mk_offseted_array
(Logic_utils.lval_to_term_lval (Cil.var (Data_for_ltl.get_varinfo Data_for_ltl.curState)))
i
)::!assumes_l
)
all_eqs_states;
begin
match !nb_behavior with
| 0 -> nb_behavior:=1;
save_assumes_l := !assumes_l ;
old_behavior := new_behavior;
Ltl_to_acsl_option.debug "one behavior"
| 1 -> nb_behavior:=2;
new_behavior.b_assumes<-[Logic_const.new_predicate (Ltl_utils.mk_disjunction_named !assumes_l)];
(!old_behavior).b_assumes<-[Logic_const.new_predicate (Ltl_utils.mk_disjunction_named !save_assumes_l)];
Ltl_to_acsl_option.debug "2 behaviors"
| _ -> new_behavior.b_assumes<-[Logic_const.new_predicate (Ltl_utils.mk_disjunction_named !assumes_l)];
end;
Ltl_to_acsl_option.debug "behaviors registration";
treated:=bool_array_or !treated all_eqs_states;
let preds_list = Ltl_utils.pre_post_to_term (preds_post,(snd preds_post_bc).(case)) in
List.iter
(fun p -> new_behavior.b_ensures <- ((Logic_const.new_predicate p) :: (new_behavior.b_ensures)) )
preds_list;
spec.spec_behavior <- new_behavior::spec.spec_behavior
end
)
(fst preds_post_bc);
let preds_post_with_return_status = fun spec -> (
if Ltl_to_acsl_option.AddingOperationNameAndStatusInSpecification.get() then begin
let called_post = Logic_const.new_predicate (Logic_const.prel (Req ,Ltl_utils.mk_term_from_vi (Data_for_ltl.get_varinfo Data_for_ltl.curOpStatus), (Logic_utils.mk_dummy_term (TConst(Data_for_ltl.op_status_to_cenum Promelaast.Return)) Cil.intType))) in
let called_post_2 = Logic_const.new_predicate (Logic_const.prel (Req ,Ltl_utils.mk_term_from_vi (Data_for_ltl.get_varinfo Data_for_ltl.curOp), (Logic_utils.mk_dummy_term (TConst(Data_for_ltl.func_to_cenum f.svar.vname)) Cil.intType))) in
let new_behavior =
{
b_name = "Buchi_property_behavior_function_states";
b_assumes = [] ;
b_ensures = [called_post;called_post_2] ;
b_assigns = [] ;
}
in
spec.spec_behavior <- new_behavior::spec.spec_behavior
end
else
()
)in
preds_post_with_return_status spec;
DoChildren