let region_range te loc rg =
match loc with
| Model.Loc(x,d) ->
begin
let base = Z.cvar (D.Xindex.get_ind x) x in
match rg with
| {D.inf=None;D.sup=None} ->
Z.block base
| {D.inf=None;D.sup=Some h} ->
Z.range base d (n_size (add h one) te)
| {D.inf=Some l;D.sup=Some h} ->
Z.range base (add_offset d te l) (n_size (cardinal l h) te)
| _ -> unsupported "infinite range for array"
end
| Model.Addr p ->
begin
let base = Z.base (model_base p) in
let ofs = model_offset p in
match rg with
| {D.inf=None;D.sup=None} ->
Z.block base
| {D.inf=None;D.sup=Some h} ->
Z.range base ofs (n_size (add h one) te)
| {D.inf=Some l;D.sup=Some h} ->
Z.range base (add_offset ofs te l) (n_size (cardinal l h) te)
| _ -> unsupported "infinite range for array"
end