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,NoneNone->
          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,NoneSome 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