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.