let assignable_range te loc rg =
match loc with
| Model.Loc(x,d) ->
let b = D.Xindex.get_ind x in
begin
match rg with
| {D.inf=None;D.sup=Some h} ->
Arange(b,d,n_size (add h one) te)
| {D.inf=Some l;D.sup=Some h} ->
Arange(b,add_offset d te l,n_size (cardinal l h) te)
| _ -> unsupported "infinite range for array"
end
| Model.Addr p ->
begin
match rg with
| {D.inf=None;D.sup=Some h} ->
Arange(p,zero,n_size (add h one) te)
| {D.inf=Some l;D.sup=Some h} ->
Arange(p,n_size l te,n_size (cardinal l h) te)
| _ -> unsupported "infinite range for array"
end