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