Library MiniC.MiniC.Memory


Require Import List.
Require Import Dictionary.
Require Import Exceptions.
Require Import PrettyPrint.

Require Import BasicTypes.
Require Import CAbstractSyntax.

Set Implicit Arguments.
Unset Strict Implicit.


Parameter memory : Set.


Parameter memo_new : memory.
Parameter memo_access : memory -> address -> c_basicValue.
Parameter memo_store : memory -> address -> c_basicValue -> memory.


Axiom
  memoNeeDef :
    forall (v : c_value) (i : address), memo_access memo_new i = C_NoVal.

Axiom
  memoStoreDef1 :
    forall (t : memory) (v : c_basicValue) (i : address),
    memo_access (memo_store t i v) i = v.

Axiom
  memoStoreDef2 :
    forall (t : memory) (v : c_basicValue) (i j : address),
    i <> j -> memo_access (memo_store t i v) j = memo_access t j.


Section Copy_Block.
Variable memo : memory.
Fixpoint memo_copy (n : nat) : address -> address -> memory :=
  fun adrs1 adrs2 =>
  match n with
  | O => memo
  | S m =>
      memo_store (memo_copy m (newAddress adrs1) (newAddress adrs2)) adrs1
        (memo_access memo adrs2)
  end.
End Copy_Block.
Section Compare_Block.
Variable memo : memory.
Fixpoint memo_comp (n : nat) : address -> address -> bool :=
  fun adrs1 adrs2 =>
  match n with
  | O => true
  | S m =>
      If (c_basicValueEq (memo_access memo adrs1) (memo_access memo adrs2))
      then (memo_comp m (newAddress adrs1) (newAddress adrs2)) else false
  end.
End Compare_Block.


Inductive c_dynError : Set :=
 
  | MemoryFault : address -> c_dynError
  | IdentNotFound : c_ident -> c_dynError
  | TypeIdentNotFound : c_typeIdent -> c_dynError
  | ImpossibleCoercion : c_value -> c_predefType -> c_dynError
  | WrongType : c_value -> list c_predefType -> c_dynError
  | ShouldBeBasicType : c_value -> c_dynError
  | AccessPointer : c_value -> c_dynError
  | AccessArray : c_value -> c_dynError
  | AccessStruct : c_value -> c_dynError
  | BadProjection :
      c_value ->
      c_dynError
      
  | C_SkipOver : memory -> c_value -> c_dynError.


Definition c_execution (A : Set) : Set := exc A c_dynError.
Definition eval (A : Set) (a : A) : c_execution A := excValue c_dynError a.

Definition memo_result : Set := c_execution c_value.
Definition dynError (e : c_dynError) : memo_result := excRaise c_value e.