let rec t_of_l (loc:F.data) = match loc with
| F.D1null -> D.null
| F.D1base x -> Hlib.base (t_of_l x)
| F.D1addr (v,_) -> fterm_of_addr v
| F.D1var (_,v) -> F.term_of_var v
| F.D1indir l ->
(CavLib.indir (t_of_l l) (c_object_of_data ~indir:false loc))
| F.D1depl (l, F.Pidx i) ->
fterm_of_shift_index (t_of_l l) (fterm_of_term i)
| F.D1depl (l, F.Pfield f) -> fterm_of_shift_field (t_of_l l) f
| F.D1shift (l,i) -> fterm_of_shift_pointer (t_of_l l) (fterm_of_term i)
| F.D1proj (x, F.Pfield f) -> fterm_of_field_access (t_of_l x) f
| F.D1proj (x, F.Pidx i) -> D.acc_index (t_of_l x) (fterm_of_term i)
| F.D1mu (x, F.Pfield f, None) ->
fterm_of_havoc_field (t_of_l x) f
| F.D1mu (x, F.Pfield f, Some v) ->
fterm_of_mu_field (t_of_l x) f (fterm_of_term v)
| F.D1mu (x, F.Pidx i, None) ->
fterm_of_havoc_index (t_of_l x) (fterm_of_term i)
| F.D1mu (x, F.Pidx i, Some v) ->
fterm_of_mu_index (t_of_l x) (fterm_of_term i) (fterm_of_term v)
| F.D1muRange (x, i) ->
fterm_of_havoc_range (t_of_l x) (fterm_of_term i)
| F.D1muI (p,None, None) ->
let i = F.e_int 0 in
let idx = D.singleton (fterm_of_term i) in
CavLib.mu_range_indir (t_of_l p) idx
| F.D1muI (p,None, Some x) ->
let format = c_object_of_data ~indir:true p in
CavLib.mu_indir (t_of_l p) (F.e_int 0) format (fterm_of_term x)
| F.D1muI (p,Some i, None) ->
let idx = D.singleton (fterm_of_term i) in
CavLib.mu_range_indir (t_of_l p) idx
| F.D1muI (p,Some i, Some x) ->
let format = c_object_of_data ~indir:true p in
CavLib.mu_indir (t_of_l p) (fterm_of_term i) format (fterm_of_term x)
| F.D1muIrange (p, x) ->
CavLib.mu_range_indir (t_of_l p) (fterm_of_term x)
and fterm_of_term (t : F.dterm) : F.dterm =
Fol.translate_data_in_term t_of_l t