open Access
open DFMapAVL
open DMem
open DomAbs
open DomBasic
open Global
open InterNode
open IntraNode
open Syn
open TStr
open UserInputType
type __ = Obj.t
module Acc = Access.Make(Loc)(PowLoc)
module Mem = Make(Loc)(Val)(PowLoc)
module Index = InterNode
module Table = FMapAVL'.Make(Index)
module type MemBasic =
functor (M:Monad.Monad) ->
sig
val mem_find : Loc.t -> Mem.t -> Val.t M.m
val mem_add : Loc.t -> Val.t -> Mem.t -> Mem.t M.m
val mem_weak_add : Loc.t -> Val.t -> Mem.t -> Mem.t M.m
val mem_pre_weak_add : Loc.t -> Val.t -> Mem.t -> Mem.t M.m
end
module AccMem =
struct
(** val mem_find : Loc.t' -> Mem.t -> Val.t * Acc.t **)
let mem_find l m0 =
((Mem.find l m0), (Acc.add Acc.USE l Acc.bot))
(** val mem_add : Loc.t' -> Val.t -> Mem.t -> Mem.t * Acc.t **)
let mem_add l v m0 =
((Mem.add l v m0), (Acc.add Acc.DEF l Acc.bot))
(** val mem_weak_add : Loc.t' -> Val.t -> Mem.t -> Mem.t * Acc.t **)
let mem_weak_add l v m0 =
((Mem.weak_add l v m0), (Acc.add Acc.ALL l Acc.bot))
(** val mem_pre_weak_add : Loc.t' -> Val.t -> Mem.t -> Mem.t * Acc.t **)
let mem_pre_weak_add l v m0 =
((Mem.fast_weak_add l v m0), (Acc.add Acc.ALL l Acc.bot))
end
module IdMem =
struct
(** val mem_find : Loc.t' -> Mem.t -> Val.t **)
let mem_find l m0 =
Mem.find l m0
(** val mem_add : Loc.t' -> Val.t -> Mem.t -> Mem.t **)
let mem_add l v m0 =
Mem.add l v m0
(** val mem_weak_add : Loc.t' -> Val.t -> Mem.t -> Mem.t **)
let mem_weak_add l v m0 =
Mem.weak_add l v m0
(** val mem_pre_weak_add : Loc.t' -> Val.t -> Mem.t -> Mem.t **)
let mem_pre_weak_add l v m0 =
Mem.fast_weak_add l v m0
end
module MemOp =
functor (M:Monad.Monad) ->
functor (MB:sig
val mem_find : Loc.t -> Mem.t -> Val.t M.m
val mem_add : Loc.t -> Val.t -> Mem.t -> Mem.t M.m
val mem_weak_add : Loc.t -> Val.t -> Mem.t -> Mem.t M.m
val mem_pre_weak_add : Loc.t -> Val.t -> Mem.t -> Mem.t M.m
end) ->
struct
(** val can_strong_update : update_mode -> G.t -> Loc.t -> bool **)
let can_strong_update mode g l =
match mode with
| Weak -> false
| Strong -> approx_one_loc g l
(** val mem_lookup : PowLoc.t -> Mem.t -> Val.t M.m **)
let mem_lookup lvs m0 =
let find_join = fun loc acc_a ->
M.bind acc_a (fun acc ->
M.bind (MB.mem_find loc m0) (fun v -> M.ret (Val.join acc v)))
in
PowLoc.fold find_join lvs (M.ret Val.bot)
(** val add : Loc.t -> Val.t -> Mem.t -> Mem.t M.m **)
let add =
MB.mem_add
(** val weak_add : update_mode -> Loc.t -> Val.t -> Mem.t -> Mem.t M.m **)
let weak_add = function
| Weak -> MB.mem_pre_weak_add
| Strong -> MB.mem_weak_add
(** val mem_update :
update_mode -> G.t -> Loc.t -> Val.t -> Mem.t -> Mem.t M.m **)
let mem_update mode g l v m0 =
if can_strong_update mode g l then add l v m0 else weak_add mode l v m0
(** val mem_wupdate :
update_mode -> PowLoc.t -> Val.t -> Mem.t -> Mem.t M.m **)
let mem_wupdate mode lvs v m0 =
let weak_add_v = fun lv m_a ->
M.bind m_a (fun m1 -> weak_add mode lv v m1)
in
PowLoc.fold weak_add_v lvs (M.ret m0)
end