let range_of_assignable = function
    | F.Aloc(te,loc) ->
        let size = sizeof te in
        begin
          match loc with
            | Model.Addr(b,d) -> model_range b d size
            | Model.Ptr p -> model_range_of_ptr p size
        end
    | F.Arange(te,loc,rg) ->
        begin
        match rg with
          |{F.inf=None;F.sup=Some h} ->
             let size = n_size (F.i_add h F.i_one) te in
           (match loc with
              | Model.Addr(b,d) -> model_range b d size
              | Model.Ptr p -> model_range_of_ptr p size
           )
          | {F.inf=Some l;F.sup=Some h} ->
              let delta = n_size l te in
              let size = n_size (cardinal l h) te in
            (match loc with
              | Model.Addr(b,d) ->
                  model_range b (F.i_add d delta) size
              | Model.Ptr p ->
                  model_range_of_ptr (model_shift p delta) size
           )
          | _ -> unsupported "infinite range for array"

        end