Module GlobSemantics_Lemmas

Require Import Coqlib Maps AST Values Footprint GMemory InteractionSemantics GAST GlobDefs ETrace Blockset Injections Coq.Lists.Streams GlobSemantics MemAux.

Definition GE_mod_wd (GE: GlobEnv.t): Prop:=
  let: modules := GlobEnv.modules GE in
  forall i,
    let: Mod := modules i in
    let: lang := ModSem.lang Mod in
    wd lang.
Lemma get_top_in_cs:
  forall GE (thdp: @ThreadPool.t GE) i c,
    ThreadPool.get_top thdp i = Some c ->
    exists cs,
      ThreadPool.get_cs thdp i = Some cs /\
      CallStack.top cs = Some c.
Proof.

Lemma GE_mod_wd_forward:
  forall GE pc l fp pc',
    GE_mod_wd GE ->
    @glob_step GE pc l fp pc' ->
    GMem.forward (gm pc) (gm pc').
Proof.

Lemma GE_mod_wd_star_forward:
  forall GE (pc pc': @ProgConfig GE) fp,
    GE_mod_wd GE ->
    tau_star glob_step pc fp pc' ->
    GMem.forward (gm pc) (gm pc').
Proof.

Lemma GE_mod_wd_plus_forward:
  forall GE (pc pc': @ProgConfig GE) fp,
    GE_mod_wd GE ->
    tau_plus glob_step pc fp pc' ->
    GMem.forward (gm pc) (gm pc').
Proof.

Lemma GE_mod_wd_tp_inv:
  forall GE pc l fp pc',
    GlobEnv.wd GE ->
    ThreadPool.inv (thread_pool pc) ->
    @glob_step GE pc l fp pc' ->
    ThreadPool.inv (thread_pool pc').
Proof.

Lemma GE_mod_wd_plus_tp_inv:
  forall GE pc fp pc',
    GlobEnv.wd GE ->
    ThreadPool.inv (thread_pool pc) ->
    tau_plus (@glob_step GE) pc fp pc' ->
    ThreadPool.inv (thread_pool pc').
Proof.
Lemma GE_mod_wd_star_tp_inv:
  forall GE pc fp pc',
    GlobEnv.wd GE ->
    ThreadPool.inv (thread_pool pc) ->
    tau_star (@glob_step GE) pc fp pc' ->
    ThreadPool.inv (thread_pool pc').
Proof.
Lemma GE_mod_wd_tp_inv_mem:
  forall GE pc l fp pc',
    GE_mod_wd GE ->
    GlobEnv.wd GE ->
    ThreadPool.inv (thread_pool pc) ->
    ThreadPool.inv_mem (thread_pool pc) (gm pc) ->
    @glob_step GE pc l fp pc' ->
    ThreadPool.inv_mem (thread_pool pc') (gm pc').
Proof.

Lemma GE_mod_wd_star_tp_inv_mem:
  forall GE pc fp pc',
    GE_mod_wd GE ->
    GlobEnv.wd GE ->
    ThreadPool.inv (thread_pool pc) ->
    ThreadPool.inv_mem (thread_pool pc) (gm pc) ->
    tau_star (@glob_step GE) pc fp pc' ->
    ThreadPool.inv_mem (thread_pool pc') (gm pc').
Proof.

Lemma GE_mod_wd_plus_tp_inv_mem:
  forall GE pc fp pc',
    GE_mod_wd GE ->
    GlobEnv.wd GE ->
    ThreadPool.inv (thread_pool pc) ->
    ThreadPool.inv_mem (thread_pool pc) (gm pc) ->
    tau_plus (@glob_step GE) pc fp pc' ->
    ThreadPool.inv_mem (thread_pool pc') (gm pc').
Proof.