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