let add_behavior_pebble_actions ~loc event behaviors state trans =
match state.multi_state with
| None -> behaviors
| Some (set,aux) ->
let name = Printf.sprintf "pebble_%s" state.name in
let assumes =
List.fold_left
(fun acc b ->
let assumes = List.map pred_of_id_pred b.b_assumes in
Logic_const.por ~loc (acc, Logic_const.pands assumes))
pfalse behaviors
in
let assumes = [ Logic_const.new_predicate assumes ] in
let set = Data_for_aorai.pebble_set_at set Logic_const.here_label in
let treat_action guard res action =
match action with
| Copy_value _ | Counter_incr _ | Counter_init _ -> res
| Pebble_init (_,_,v) ->
let a = Cil_const.make_logic_var aux.lv_name aux.lv_type in
let guard = rename_pred aux a guard in
let guard =
Logic_const.pand ~loc
(Logic_const.prel
~loc (Req,Logic_const.tvar a,Logic_const.tvar v),
guard)
in
Logic_const.term ~loc
(Tcomprehension (Logic_const.tvar a,[a], Some guard))
set.term_type
:: res
| Pebble_move(_,_,s1,_) ->
let a = Cil_const.make_logic_var aux.lv_name aux.lv_type in
let guard = rename_pred aux a guard in
let in_s =
mk_sub ~loc
(Data_for_aorai.pebble_set_at s1 Logic_const.pre_label) a
in
let guard = Logic_const.pand ~loc (in_s,guard) in
Logic_const.term ~loc
(Tcomprehension (Logic_const.tvar a,[a], Some guard))
set.term_type
:: res
in
let treat_one_trans acc tr =
let guard = crosscond_to_pred ~event (fst tr.cross)
(Data_for_aorai.get_logic_var Data_for_aorai.curOp)
(Data_for_aorai.get_logic_var Data_for_aorai.curOpStatus)
in
let guard = Logic_const.pold guard in
List.fold_left (treat_action guard) acc (snd tr.cross)
in
let res = List.fold_left treat_one_trans [] trans in
let res = Logic_const.term (Tunion res) set.term_type in
let post_cond =
[ Normal, Logic_const.new_predicate (Logic_const.prel (Req,set,res))]
in
Cil.mk_behavior ~name ~assumes ~post_cond () :: behaviors