Library topsy_hmInit

Load seplog_header.

Require Import topsy_hm.
Require Import frag.

Definition hmInit (adr:loc) (size:nat) :=
  hmStart <- (nat_e adr);
  hmStart -.> next *<- (nat_e adr) +e (nat_e size) -e (int_e 2%Z);
  hmStart -.> status *<- Free;
  hmEnd <-* (hmStart -.> next);
  hmEnd -.> next *<- (int_e 0%Z);
  hmEnd -.> status *<- Allocated.

Definition hmInit_specif := forall p size, size >= 4 ->
   {{ Array p size }}
   hmInit p size
   {{ Heap_List ((size - 4, free)::nil) p }}.

Definition hmInit_precond (adr:loc) (size:nat):=
  (true_b,
      star
      (star (cell (nat_e adr)) (cell (nat_e adr +e int_e 1%Z)))
      (star (cell (nat_e adr +e nat_e size -e int_e 2%Z)) (cell (nat_e adr +e nat_e size -e int_e 1%Z)))
  ).

Definition hmInit_postcond (adr:loc) (size:nat):=
  (true_b,
      star
      (star (singl (nat_e adr) Free) (singl (nat_e adr +e int_e 1%Z) (nat_e adr +e nat_e size -e int_e 2%Z)))
      (star (singl (nat_e adr +e nat_e size -e int_e 2%Z) Allocated) (singl (nat_e adr +e nat_e size -e int_e 1%Z) (nat_e 0)))
  ).

Lemma frag_precond: forall startp sizep, sizep >= 4 ->
   Array startp sizep ==> (assrt_interp (hmInit_precond startp sizep)) ** Array (startp + 2) (sizep - 4).

Lemma frag_postcond: forall startp sizep, sizep >= 4 ->
  (assrt_interp (hmInit_postcond startp sizep)) ** Array (startp + 2) (sizep - 4) ==> Heap_List ((sizep - 4, true)::nil) startp.

Lemma hmInit_verif_auto : hmInit_specif.

Lemma hmInit_verif_manual : hmInit_specif.