(* This file contains three computational align criteria. 1: the hardware alignof is not larger than alignof (and additional criterion for array). 2: all fields are aligned as hardware requires. size as a multiple of hardware alignof. 3: all value is well-aligned stored. The third one is the final specification we want. *)
Section align_compatible_rec.
Context (cenv: composite_env).
Inductive align_compatible_rec: type -> Z -> Prop :=
| align_compatible_rec_by_value: forall t ch z, access_mode t = By_value ch -> (Memdata.align_chunk ch | z) -> align_compatible_rec t z
| align_compatible_rec_Tarray: forall t n a z, (forall i, 0 <= i < n -> align_compatible_rec t (z + sizeof cenv t * i)) -> align_compatible_rec (Tarray t n a) z
| align_compatible_rec_Tstruct: forall i a co z, cenv ! i = Some co -> (forall i0 t0 z0, field_type i0 (co_members co) = Errors.OK t0 -> field_offset cenv i0 (co_members co) = Errors.OK z0 -> align_compatible_rec t0 (z + z0)) -> align_compatible_rec (Tstruct i a) z
| align_compatible_rec_Tunion: forall i a co z, cenv ! i = Some co -> (forall i0 t0, field_type i0 (co_members co) = Errors.OK t0 -> align_compatible_rec t0 z) -> align_compatible_rec (Tunion i a) z.

(* Specifications: *)
Lemma align_compatible_rec_by_value_inv : forall t ch z,
access_mode t = By_value ch ->
align_compatible_rec t z -> (Memdata.align_chunk ch | z).
Lemma align_compatible_rec_Tarray_inv: forall t n a z,
align_compatible_rec (Tarray t n a) z ->
(forall i : Z, 0 <= i < n -> align_compatible_rec t (z + sizeof cenv t * i)).
Lemma align_compatible_rec_Tstruct_inv: forall i a co z,
cenv ! i = Some co ->
align_compatible_rec (Tstruct i a) z ->
(forall i0 t0 z0, field_type i0 (co_members co) = Errors.OK t0 -> field_offset cenv i0 (co_members co) = Errors.OK z0 -> align_compatible_rec t0 (z + z0)).
Lemma align_compatible_rec_Tunion_inv: forall i a co z,
cenv ! i = Some co ->
align_compatible_rec (Tunion i a) z ->
(forall i0 t0, field_type i0 (co_members co) = Errors.OK t0 -> align_compatible_rec t0 z).