let assignable_range mem te loc rg =
match loc with
| Loc lc ->
begin
match rg with
| {F.inf = Some l ; F.sup = Some h} ->
Xrange(lc.base,add_offset lc.off te l,n_size (cardinal l h) te)
| {F.inf = None ; F.sup = Some h} ->
Xrange(lc.base,lc.off,n_size (F.i_add h F.i_one) te)
| {F.inf = Some l;F.sup = None} ->
let h =
F.i_sub (F.unwrap (F.e_access mem.alloc lc.base)) F.i_one
in
Xrange(lc.base,add_offset lc.off te l,n_size (cardinal l h) te)
| {F.inf = None ; F.sup = None} ->
let h = F.unwrap (F.e_access mem.alloc lc.base) in
Xrange(lc.base,lc.off,n_size h te)
end
| Addr (p,_) ->
begin
match rg with
| {F.inf = Some l;F.sup = Some h} ->
Arange(p,n_size l te,n_size (cardinal l h) te)
| {F.inf = None;F.sup = Some h} ->
Arange(p,F.i_zero,n_size (F.i_add h F.i_one) te)
| {F.inf = Some l ; F.sup = None} ->
let h =
F.i_sub (F.unwrap (F.e_access mem.alloc (model_base p)))
F.i_one
in
Arange(p,n_size l te,n_size (cardinal l h) te)
|{F.inf = None ; F.sup = None} ->
let b = model_base p in
let h = F.unwrap (F.e_access mem.alloc b) in
Xrange(b,F.i_zero,n_size h te)
end