let cast v ty_from ty_to =
    if kind_equal ty_from ty_to then v
    else
      match ty_from with
        | Kcint i ->
            let vi = integer_of_data ty_from v in
            begin match ty_to with
              | Kcint j ->
                  if Ctypes.sub_c_int i j then v
                  else
                    Value (M.V_int(j,F.modulo j vi))
              | Kint -> Data(F.wrap vi)
              | Kreal -> Data(F.wrap (F.real_of_integer vi))
              | Kptr te -> Loc (M.cast_int_to_loc i vi te)
              | k -> WpLog.not_yet_implemented "logic cast from %a to %a"
                  Ctypes.pp_int i pp_kind k
            end
        | Kint ->
            let vi = integer_of_data ty_from v in
            begin match ty_to with
              | Kcint j -> Value (M.V_int(j,F.modulo j vi))
              | Kint -> Data(F.wrap vi)
              | Kptr te -> Loc (M.cast_int_to_loc (Ctypes.c_ptr()) vi te)
              | Kreal -> Data(F.wrap (F.real_of_integer vi))
              | k -> WpLog.not_yet_implemented
                  "logic cast from integer to %a" pp_kind k
            end
        | Kreal ->
            let vr = real_of_data ty_from v in
            begin match ty_to with
              | Kcint j -> Value(M.V_int(j,F.modulo j
                                               (F.integer_of_real vr)))
              | Kint -> Data(F.wrap (F.integer_of_real vr))
              | Kreal -> Data(F.wrap vr)
              | k ->  WpLog.not_yet_implemented
                  "logic cast from real to %a" pp_kind k
            end
        | Kptr tfrom ->
            let loc = loc_of_data (object_of tfrom) v in
            begin match ty_to with
              | Kcint j -> Value (M.V_int(j, M.cast_loc_to_int tfrom loc j))
              | Kptr tto -> Loc (M.cast_loc_to_loc tfrom tto loc)
              | k -> WpLog.not_yet_implemented
                  "logic cast from pointer over %a to %a"
                    !Ast_printer.d_type tfrom pp_kind k
            end
        | k -> WpLog.not_yet_implemented "logic cast from %a to %a"
                 pp_kind k pp_kind ty_to