(** * Abstracting read-only global variables *)
Definition romem := PTree.t ablock.
Definition romatch  (m: mem) (rm: romem) : Prop :=
forall b id ab,
bc b = BCglob id ->
rm!id = Some ab ->
pge Glob ab.(ab_summary)
/\ bmatch m b ab
/\ forall ofs, ~Mem.perm m b ofs Max Writable.

(* Specifications: *)
Lemma romatch_store:
forall chunk m b ofs v m' rm,
Mem.store chunk m b ofs v = Some m' ->
romatch m rm ->
romatch m' rm.
Lemma romatch_storebytes:
forall m b ofs bytes m' rm,
Mem.storebytes m b ofs bytes = Some m' ->
romatch m rm ->
romatch m' rm.
Lemma romatch_ext:
forall m rm m',
romatch m rm ->
(forall b id ofs n bytes, bc b = BCglob id -> Mem.loadbytes m' b ofs n = Some bytes -> Mem.loadbytes m b ofs n = Some bytes) ->
(forall b id ofs p, bc b = BCglob id -> Mem.perm m' b ofs Max p -> Mem.perm m b ofs Max p) ->
romatch m' rm.
Lemma romatch_free:
forall m b lo hi m' rm,
Mem.free m b lo hi = Some m' ->
romatch m rm ->
romatch m' rm.
Lemma romatch_alloc:
forall m b lo hi m' rm,
Mem.alloc m lo hi = (m', b) ->
bc_below bc (Mem.nextblock m) ->
romatch m rm ->
romatch m' rm.