Module CminorWD

Require Import Coqlib FMemory GMemory Footprint FMemLemmas DetLemma InteractionSemantics CminorLang.

Lemma embed_eq:
  forall fm m,
    embed (strip fm) (Mem.freelist fm) m ->
    m = fm.
Proof.

Section EVALDET.
  Lemma eval_expr_det:
    forall ge sp e m a v,
      eval_expr ge sp e m a v ->
      forall v', eval_expr ge sp e m a v' -> v = v'.
Proof.
  Lemma eval_expr_fp_det:
    forall ge sp e m a v,
      eval_expr_fp ge sp e m a v ->
      forall v', eval_expr_fp ge sp e m a v' -> v = v'.
Proof.
      
  Lemma eval_exprlist_det:
    forall ge sp e m al vl,
      eval_exprlist ge sp e m al vl ->
      forall vl', eval_exprlist ge sp e m al vl' -> vl = vl'.
Proof.

  Lemma eval_exprlist_fp_det:
    forall ge sp e m al vl,
      eval_exprlist_fp ge sp e m al vl ->
      forall vl', eval_exprlist_fp ge sp e m al vl' -> vl = vl'.
Proof.
End EVALDET.
Local Ltac solv_eq:=
  match goal with
  | [H1: ?P , H2 : ?P |- _] => clear H1
  | [H1: ?P = _, H2: ?P = _ |- _] =>
    rewrite H1 in H2; inv H2
  | [H1: ?P = _ , H2: _ = ?P |- _] =>
    rewrite H1 in H2; inv H2
  end
.
Local Ltac eval_det:=
  repeat match goal with
         | H1: eval_expr ?a ?b ?c ?d ?e _, H2: eval_expr ?a ?b ?c ?d ?e _ |- _ =>
           eapply eval_expr_det in H1;try apply H2;subst
         | H1: eval_expr_fp ?a ?b ?c ?d ?e _, H2: eval_expr_fp ?a ?b ?c ?d ?e _ |- _ => eapply eval_expr_fp_det in H1;try apply H2;subst
         | H1: eval_exprlist ?a ?b ?c ?d ?e _, H2: eval_exprlist ?a ?b ?c ?d ?e _ |- _ => eapply eval_exprlist_det in H1;try apply H2;subst
         | H1: eval_exprlist_fp ?a ?b ?c ?d ?e _, H2: eval_exprlist_fp ?a ?b ?c ?d ?e _ |- _ => eapply eval_exprlist_fp_det in H1;try apply H2;subst
         end.
Local Ltac inv_eq:=
  repeat (try match goal with
         | H:?P , H1: ?P |- _ => clear H
         | H: Cminor.funsig _ |- _ => unfold Cminor.funsig in H
         | H: context[match ?x with _ => _ end] |- _ => destruct x eqn:?; try (inversion H; fail)
         | H: false = true |- _ => inv H
         | H: true = false |- _ => inv H
         | H: None = Some _ |- _=> inv H
         | H: Some _ = Some _ |- _ => inv H
         | H: Some _ = None |- _=> inv H
         | H: Values.Val.bool_of_val _ _ |- _ => inv H
         | H: Switch.switch_argument _ _ _ |- _ => inv H
         | H:?P = ?Q, H1:context [ ?P ] |- _ => rewrite H in H1
         | H:?P = ?Q |- context [ ?P ] => rewrite H
         end;try eval_det;simpl in *;subst;try contradiction).
Section DET.

  Lemma Cminor_det:
    lang_det CminorLang.
Proof.
End DET.


Local Ltac emp_eff:=
  try (unfold FP.emp,effects;simpl;repeat rewrite Locs.emp_union_locs;repeat rewrite Locs.locs_union_emp;apply Locs.eq_refl).


Lemma Cminor_eff:
  corestep_local_eff (InteractionSemantics.step CminorLang).
Proof.
Lemma eval_binop_fp_empeff:
  forall b v1 v2 m fp,
    eval_binop_fp b v1 v2 m = Some fp ->
    Locs.eq (effects fp) Locs.emp.
Proof.
Lemma eval_expr_fp_empeff:
  forall ge sp e m a fp,
    eval_expr_fp ge sp e m a fp ->
    Locs.eq (effects fp) Locs.emp.
Proof.
Lemma MemPre_weak_valid_pointer_fp_eq:
  forall m b i m' fp,
    FMemOpFP.weak_valid_pointer_fp m b i = fp ->
    MemPre (strip m) (strip m') fp ->
    FMemOpFP.weak_valid_pointer_fp m' b i = fp.
Proof.
Lemma MemPre_eval_binop_eq:
  forall b v1 v2 m v fp m',
    MemPre (strip m)(strip m') fp ->
    eval_binop b v1 v2 m = Some v->
    eval_binop_fp b v1 v2 m = Some fp ->
    eval_binop b v1 v2 m' = Some v /\ eval_binop_fp b v1 v2 m' = Some fp.
Proof.
Lemma MemPre_eval_expr_eq:
  forall a ge sp e m v fp m',
    MemPre (strip m)(strip m') fp->
    FreelistEq (strip m)(strip m')(Mem.freelist m)->
    eval_expr ge sp e m a v ->
    eval_expr_fp ge sp e m a fp->
    eval_expr ge sp e m' a v /\ eval_expr_fp ge sp e m' a fp .
Proof.
Lemma MemPre_eval_exprlist_eq:
  forall a ge sp e m v fp m',
    MemPre (strip m)(strip m') fp->
    FreelistEq (strip m)(strip m')(Mem.freelist m)->
    eval_exprlist ge sp e m a v ->
    eval_exprlist_fp ge sp e m a fp->
    eval_exprlist ge sp e m' a v /\ eval_exprlist_fp ge sp e m' a fp .
Proof.
Lemma eval_exprlist_fp_empeff:
  forall ge sp e m a fp,
    eval_exprlist_fp ge sp e m a fp ->
    Locs.eq (effects fp) Locs.emp.
Proof.
Lemma Cminor_loc1:
  corestep_locality_1 (InteractionSemantics.step CminorLang).
Proof.
Theorem Cminor_wd: wd CminorLang.CminorLang.
Proof.