Ltac exploit_match:=
      unfold match_thread_target,match_thread_source,match_thread_compiled in *;
      match goal with
      | [ H: getThreadC ?i = _ ?c,
             H0: context[match_state2match_thread] |- _ ] =>
        rewrite H in H0; inversion H0; subst; simpl in *; clear H0
      end;
      fold match_thread_target in *;
      fold match_thread_source in *;
      fold match_thread_compiled in *.(* Build the concur_match *)
    Ltac destroy_ev_step_sum:=
      match goal with
      | [ H: ev_step_sum _ _ _ _ _ _ _ |- _ ] => inversion H; clear H
      end.

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'.