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