End EFF_InternalCall.

(* Specifications: *)
Lemma Match_effcore_diagram:
forall st1 m1 st1' m1' (U1 : Values.block -> Z -> bool)
(EFFSTEP: effstep csharpmin_eff_sem ge U1 st1 m1 st1' m1')
st2 mu m2
(UHyp: forall b ofs,  U1 b ofs = true -> Mem.valid_block m1 b ->
vis mu b = true)
(MC: Match_cores st1 mu st1 m1 st2 m2),
exists st2' m2' mu',
intern_incr mu mu' /\
sm_inject_separated mu mu' m1 m2 /\
sm_locally_allocated mu mu' m1 m2 m1' m2' /\
Match_cores st1' mu' st1' m1' st2' m2' /\
(exists U2 : Values.block -> Z -> bool,
(effstep_plus cmin_eff_sem tge U2 st2 m2 st2' m2' \/
(MC_measure st1' < MC_measure st1)%nat /\
effstep_star cmin_eff_sem tge U2 st2 m2 st2' m2') /\
(forall (b : Values.block) (ofs : Z),
U2 b ofs = true ->
Mem.valid_block m2 b /\
(locBlocksTgt mu b = false ->
exists (b1 : Values.block) (delta1 : Z),
foreign_of mu b1 = Some (b, delta1) /\
U1 b1 (ofs - delta1) = true /\
Mem.perm m1 b1 (ofs - delta1) Max Nonempty))).
(*program structure not yet updated to module*)
Theorem transl_program_correct:
forall  (R: list_norepet (map fst (prog_defs prog)))
entrypoints
(entry_points_ok :
forall v1 v2 sig,
In (v1, v2, sig) entrypoints ->
exists b f1 f2,
v1 = Vptr b Int.zero
/\ v2 = Vptr b Int.zero
/\ Genv.find_funct_ptr ge b = Some f1
/\ Genv.find_funct_ptr tge b = Some f2)
(init_mem: exists m0, Genv.init_mem prog = Some m0),
SM_simulation.SM_simulation_inject csharpmin_eff_sem
cmin_eff_sem ge tge entrypoints.