(** *Diagrams for machine steps*)

Lemma acquire_step_diagram:
forall (cd : option compiler_index) (m1 : mem) (st1 : ThreadPool (Some hb)) (st2 : ThreadPool.t) (mu : meminj) (m2 : mem)
(tr1 tr2 : HybridMachineSig.event_trace)
(Hmatch : concur_match cd mu st1 m1 st2 m2) (Htr : List.Forall2 (inject_mevent mu) tr1 tr2)
(U : list nat)
(m1' : mem) (tid : nat)
(Htid : ThreadPool.containsThread st1 tid) (Hpeek : HybridMachineSig.schedPeek U = Some tid) (c : semC) (b : block)
(ofs : Integers.Ptrofs.int) (virtueThread : delta_map * delta_map)
(newThreadPerm : access_map * access_map) (pmap : lock_info)
(Hcmpt: mem_compatible st1 m1)
(Hlt': permMapLt
(setPermBlock (Some Writable) b (Integers.Ptrofs.intval ofs)
(snd (ThreadPool.getThreadR Htid)) LKSIZE_nat) (getMaxPerm m1))
(Hbounded : bounded_maps.sub_map (fst virtueThread) (snd (getMaxPerm m1)) /\
bounded_maps.sub_map (snd virtueThread) (snd (getMaxPerm m1)))
(Hinv : invariant st1),
semantics.at_external (semantics.csem (event_semantics.msem semSem))
c (restrPermMap (fst (ssrfun.pair_of_and (Hcmpt tid Htid)))) =
Some (LOCK, (Vptr b ofs :: nil)%list) ->
getThreadC Htid = Kblocked c ->
Mem.load AST.Mint32 (restrPermMap (snd (ssrfun.pair_of_and (Hcmpt tid Htid)))) b
(Integers.Ptrofs.intval ofs) = Some (Vint Integers.Int.one) ->
Mem.range_perm (restrPermMap (snd (ssrfun.pair_of_and (Hcmpt tid Htid)))) b
(Integers.Ptrofs.intval ofs) (BinInt.Z.add (Integers.Ptrofs.intval ofs) LKSIZE)
Cur Readable ->
Mem.store AST.Mint32 (restrPermMap Hlt') b (Integers.Ptrofs.intval ofs)
(Vint Integers.Int.zero) = Some m1' ->
ThreadPool.lockRes st1 (b, Integers.Ptrofs.intval ofs) = Some pmap ->
permMapJoin (fst pmap) (fst (ThreadPool.getThreadR Htid)) (fst newThreadPerm) ->
permMapJoin (snd pmap) (snd (ThreadPool.getThreadR Htid)) (snd newThreadPerm) ->
exists e' (st2' : ThreadPool.t) (m2' : mem) (cd' : option compiler_index) (mu' : meminj),
concur_match cd' mu'
(ThreadPool.updLockSet (ThreadPool.updThread Htid (Kresume c Vundef) newThreadPerm)
(b, Integers.Ptrofs.intval ofs) (empty_map, empty_map)) m1' st2' m2' /\
List.Forall2 (inject_mevent mu')
(seq.cat tr1
(Events.external tid
(Events.acquire
(b, Integers.Ptrofs.intval ofs)
(Some (build_delta_content (fst virtueThread) m1'))) :: nil))
(seq.cat tr2 (Events.external tid e' :: nil)) /\
HybridMachineSig.external_step(scheduler:=HybridMachineSig.HybridCoarseMachine.scheduler)
U tr2 st2 m2 (HybridMachineSig.schedSkip U)
(seq.cat tr2
(Events.external tid e' :: nil)) st2'
m2'.