method vfunc f =
let spec= Kernel_function.get_spec (Globals.Functions.get f.svar) in
let preds_pre = Aorai_utils.pre_post_to_term (Data_for_aorai.get_func_pre f.svar.vname) in
let preds_post_bc = Data_for_aorai.get_func_post_bycase f.svar.vname in
let preds_pre_with_called_stat = fun preds_pre -> (
if Aorai_option.AddingOperationNameAndStatusInSpecification.get() then begin
let called_pre = Logic_const.prel (Req ,Aorai_utils.mk_term_from_vi (Data_for_aorai.get_varinfo Data_for_aorai.curOpStatus), (Logic_utils.mk_dummy_term (TConst(Data_for_aorai.op_status_to_cenum Promelaast.Call)) Cil.intType)) in
let called_pre_2 = Logic_const.prel (Req ,Aorai_utils.mk_term_from_vi (Data_for_aorai.get_varinfo Data_for_aorai.curOp), (Logic_utils.mk_dummy_term (TConst(Data_for_aorai.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
let pre_wrt_params = Aorai_utils.get_preds_pre_wrt_params f.svar.vname in
let preds_pre = match pre_wrt_params with
| None -> preds_pre
| Some (p) -> (Logic_const.unamed p)::preds_pre
in
let new_requires = List.map Logic_const.new_predicate preds_pre in
let behavior =
(Cil.mk_behavior ~requires:new_requires ()) in
spec.spec_behavior <- Logic_utils.merge_behaviors ~silent:true spec.spec_behavior [behavior] ;
let nb_states=Data_for_aorai.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 (Cil.mk_behavior ~name:"" ())
in
Array.iteri
(fun case preds_post ->
if (not (Spec_tools.is_empty_behavior preds_post) )
&& (not (!treated).(case))
then begin
let new_behavior = Cil.mk_behavior ~name:("Buchi_property_behavior_"^(string_of_int case)) () 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,
Aorai_utils.zero_term(),
Aorai_utils.mk_offseted_array_states_as_enum
(Logic_utils.lval_to_term_lval ~cast:true (Cil.var (Data_for_aorai.get_varinfo Data_for_aorai.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;
Aorai_option.debug "one behavior"
| 1 -> nb_behavior:=2;
new_behavior.b_assumes<-[Logic_const.new_predicate (Aorai_utils.mk_disjunction_named !assumes_l)];
(!old_behavior).b_assumes<-[Logic_const.new_predicate (Aorai_utils.mk_disjunction_named !save_assumes_l)];
Aorai_option.debug "2 behaviors"
| _ -> new_behavior.b_assumes<-[Logic_const.new_predicate (Aorai_utils.mk_disjunction_named !assumes_l)];
end;
Aorai_option.debug "behaviors registration";
treated:=bool_array_or !treated all_eqs_states;
let preds_list = Aorai_utils.pre_post_to_term (preds_post,(snd preds_post_bc).(case)) in
List.iter
(fun p ->
new_behavior.b_post_cond <-
((Normal, Logic_const.new_predicate p) ::
new_behavior.b_post_cond))
preds_list;
begin
let post_wrt_params = Aorai_utils.get_preds_post_bc_wrt_params f.svar.vname in
match post_wrt_params with
| None -> ()
| Some (p) -> new_behavior.b_post_cond <- (Normal, Logic_const.new_predicate (Logic_const.unamed p))::new_behavior.b_post_cond
end;
spec.spec_behavior <- new_behavior::spec.spec_behavior
end
)
(fst preds_post_bc);
let preds_post_with_return_status = fun spec -> (
if Aorai_option.AddingOperationNameAndStatusInSpecification.get() then begin
let called_post = Logic_const.new_predicate (Logic_const.prel (Req ,Aorai_utils.mk_term_from_vi (Data_for_aorai.get_varinfo Data_for_aorai.curOpStatus), (Logic_utils.mk_dummy_term (TConst(Data_for_aorai.op_status_to_cenum Promelaast.Return)) Cil.intType))) in
let called_post_2 = Logic_const.new_predicate (Logic_const.prel (Req ,Aorai_utils.mk_term_from_vi (Data_for_aorai.get_varinfo Data_for_aorai.curOp), (Logic_utils.mk_dummy_term (TConst(Data_for_aorai.func_to_cenum f.svar.vname)) Cil.intType))) in
let new_behavior =
{
b_name = "Buchi_property_behavior_function_states";
b_assumes = [] ;
b_requires = [] ;
b_post_cond = [Normal, called_post; Normal, called_post_2] ;
b_assigns = WritesAny ;
b_extended = []
}
in
spec.spec_behavior <- new_behavior::spec.spec_behavior
end
else
()
)in
preds_post_with_return_status spec;
DoChildren