End ThreadPoolErasure.
Hint Resolve erased_updLockSet erased_updThread
erased_addThread erased_remLockSet: erased.
End ThreadPoolErasure.
(** ** Erasure from FineConc to SC*)
Module SCErasure.
Section SCErasure.
Context {Sem: Semantics}
{SemAxioms: SemAxioms}
{SemD: SemDet}
{CE: CoreErasure}
{initU: seq.seq nat}.
Existing Instance OrdinalPool.OrdinalThreadPool.
Existing Instance DryHybridMachine.dryResources.
Existing Instance DryHybridMachine.DryHybridMachineSig.
Existing Instance dryFineMach.
Existing Instance FineDilMem.
Existing Instance HybridFineMachine.scheduler.
Existing Instance BareMachine.resources.
Existing Instance BareMachine.BareMachineSig.
Existing Instance BareDilMem.
Existing Instance bareMach.
Notation syncStepF := (@syncStep DryHybridMachine.dryResources _ OrdinalPool.OrdinalThreadPool
DryHybridMachine.DryHybridMachineSig).
Notation syncStepE := (@syncStep BareMachine.resources _ OrdinalPool.OrdinalThreadPool
BareMachine.BareMachineSig).
Notation start_threadF := (@start_thread DryHybridMachine.dryResources _ OrdinalPool.OrdinalThreadPool
DryHybridMachine.DryHybridMachineSig).
Notation start_threadE := (@start_thread BareMachine.resources _ OrdinalPool.OrdinalThreadPool
BareMachine.BareMachineSig).
Notation resume_threadF := (@resume_thread DryHybridMachine.dryResources _ OrdinalPool.OrdinalThreadPool
DryHybridMachine.DryHybridMachineSig).
Notation resume_threadE := (@resume_thread BareMachine.resources _ OrdinalPool.OrdinalThreadPool
BareMachine.BareMachineSig).
Notation suspend_threadF := (@suspend_thread DryHybridMachine.dryResources _ OrdinalPool.OrdinalThreadPool
DryHybridMachine.DryHybridMachineSig).
Notation suspend_threadE := (@suspend_thread BareMachine.resources _ OrdinalPool.OrdinalThreadPool
BareMachine.BareMachineSig).
Notation threadStepF := (@threadStep DryHybridMachine.dryResources _ OrdinalPool.OrdinalThreadPool
DryHybridMachine.DryHybridMachineSig).
Notation threadStepE := (@threadStep BareMachine.resources _ OrdinalPool.OrdinalThreadPool
BareMachine.BareMachineSig).
Notation fstep := (corestep (@fine_semantics _ initU)).
Notation scstep := (corestep (@bare_semantics _ initU)).
Notation fsafe := (@HybridFineMachine.fsafe DryHybridMachine.dryResources _ OrdinalPool.OrdinalThreadPool
DryHybridMachine.DryHybridMachineSig FineDilMem).
Notation sc_safe := (@HybridFineMachine.fsafe BareMachine.resources _ OrdinalPool.OrdinalThreadPool
BareMachine.BareMachineSig BareDilMem).
Notation fexecution := (@fine_execution _ FineDilMem DryHybridMachine.dryResources).
Notation sc_execution := (@fine_execution _ BareDilMem BareMachine.resources).
(** ** Simulation for syncStep, startStep, resumeStep, suspendStep *)
Hint Resolve mem_erasure_restr : erased.

Lemma syncStep_erase:
forall tp1 tp1' m1 m1' tp2 m2 i ev
(HerasePool: threadPool_erasure tp1 tp1')
(cnti: containsThread tp1 i)
(cnti': containsThread tp1' i)
(Hmem_erasure: mem_erasure m1 m1')
(Hcomp1: mem_compatible tp1 m1)
(Hcomp1': mem_compatible tp1' m1')
(Hstep: syncStepF false cnti Hcomp1 tp2 m2 ev),
exists tp2' m2',
syncStepE false cnti' Hcomp1' tp2' m2' (eraseSyncEvent ev) /\
threadPool_erasure tp2 tp2' /\ mem_erasure m2 m2'.