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