(*Some (ThreadPool.getThreadR Htid, virtue1)*)
(*Some virtue2*)

Lemma make_step_diagram:
forall (U : list nat) (tr1 tr2 : HybridMachineSig.event_trace)
(st1 : ThreadPool (Some hb)) (m1 m1' : mem)
(tid : nat) (cd : option compiler_index)
(st2 : ThreadPool (Some (S hb))) (mu : meminj)
(m2 : mem) (Htid : ThreadPool.containsThread st1 tid)
(c : semC) (b : block) (ofs : Integers.Ptrofs.int)
(pmap_tid' : access_map * access_map),
concur_match cd mu st1 m1 st2 m2 ->
List.Forall2 (inject_mevent mu) tr1 tr2 ->
forall Hcmpt : mem_compatible st1 m1,
HybridMachineSig.schedPeek U = Some tid ->
invariant st1 ->
ThreadPool.getThreadC Htid = Kblocked c ->
semantics.at_external
(semantics.csem (event_semantics.msem semSem)) c
(restrPermMap (fst (ssrfun.pair_of_and (Hcmpt tid Htid)))) =
Some (MKLOCK, (Vptr b ofs :: nil)%list) ->
Mem.store AST.Mint32
(restrPermMap (fst (ssrfun.pair_of_and (Hcmpt tid Htid)))) b
(Integers.Ptrofs.intval ofs) (Vint Integers.Int.zero) =
Some m1' ->
Mem.range_perm
(restrPermMap (fst (ssrfun.pair_of_and (Hcmpt tid Htid)))) b
(Integers.Ptrofs.intval ofs)
(BinInt.Z.add (Integers.Ptrofs.intval ofs) LKSIZE) Cur Writable ->
setPermBlock (Some Nonempty) b (Integers.Ptrofs.intval ofs)
(fst (ThreadPool.getThreadR Htid)) LKSIZE_nat =
fst pmap_tid' ->
setPermBlock (Some Writable) b (Integers.Ptrofs.intval ofs)
(snd (ThreadPool.getThreadR Htid)) LKSIZE_nat =
snd pmap_tid' ->
ThreadPool.lockRes st1 (b, Integers.Ptrofs.intval ofs) = None ->
exists
e' (st2' : t) (m2' : mem) (cd' : option compiler_index)
(mu' : meminj),
concur_match cd' mu'
(ThreadPool.updLockSet
(ThreadPool.updThread Htid (Kresume c Vundef) pmap_tid')
(b, Integers.Ptrofs.intval ofs) (empty_map, empty_map))
m1' st2' m2' /\
List.Forall2 (inject_mevent mu') (seq.cat tr1 (Events.external tid (Events.mklock (b, Integers.Ptrofs.intval ofs)) :: 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'.