include "LIN/joint_LTL_LIN.ma". include "joint/SemanticUtils.ma". definition hw_reg_store ≝ λr,v,e. OK … (hwreg_store r v e). definition hw_reg_retrieve ≝ λl,r. OK … (hwreg_retrieve l r). definition ltl_lin_more_sem_params: ∀succT. more_sem_params (mk_params_ ltl_lin_params__ succT) := λsuccT. mk_more_sem_params ? unit it hw_register_env init_hw_register_env 0 it hw_reg_store hw_reg_retrieve (λ_.hw_reg_store RegisterA) (λe.λ_.hw_reg_retrieve e RegisterA) (λ_.hw_reg_store RegisterB) (λe.λ_.hw_reg_retrieve e RegisterB) (λ_.hw_reg_store RegisterDPL) (λe.λ_.hw_reg_retrieve e RegisterDPL) (λ_.hw_reg_store RegisterDPH) (λe.λ_.hw_reg_retrieve e RegisterDPH) (λlocals,dest_src. match dest_src with [ from_acc reg ⇒ do v ← hw_reg_retrieve locals RegisterA ; hw_reg_store reg v locals | to_acc reg ⇒ do v ← hw_reg_retrieve locals reg ; hw_reg_store RegisterA v locals ]). definition ltl_lin_sem_params: ∀succT. sem_params ≝ λsuccT.mk_sem_params … (ltl_lin_more_sem_params succT). definition ltl_lin_init_locals : unit → hw_register_env → hw_register_env ≝ λ_.λe.e. definition ltl_lin_pop_frame: ∀succT,codeT,lookup. ∀globals. genv globals (mk_params globals succT ltl_lin_params1 (codeT globals) (lookup globals)) → state … (ltl_lin_sem_params succT) → res (state … (ltl_lin_sem_params …)) ≝ λ_.λ_.λ_.λ_.λ_.λt.OK … t. definition ltl_lin_save_frame: ∀succT. address → nat → unit → nat → unit → state … (ltl_lin_sem_params succT) → res (state … (ltl_lin_sem_params …)) ≝ λ_.λl.λ_.λ_.λ_.λ_.λst.save_ra … st l. (* The following implementation only works for functions that return 32 bits *) definition ltl_lin_result_regs: ∀succT,codeT,lookup. ∀globals. genv globals (mk_params globals succT ltl_lin_params1 (codeT globals) (lookup globals)) → state (ltl_lin_sem_params succT) → res (list Register) ≝ λ_.λ_.λ_.λ_.λ_.λ_. OK … RegisterRets. (*CSC: XXXX, for external functions only*) axiom ltl_lin_fetch_external_args: ∀succT.external_function → state (ltl_lin_sem_params succT) → res (list val). axiom ltl_lin_set_result: ∀succT.list val → state (ltl_lin_sem_params succT) → res (state (ltl_lin_sem_params succT)). definition ltl_lin_exec_extended: ∀succT.∀p.∀globals. genv globals (p globals) → False → succT → state (ltl_lin_sem_params succT) → IO io_out io_in (trace × (state (ltl_lin_sem_params succT))) ≝ λsuccT,p,globals,ge,abs. ⊥. @abs qed. definition ltl_lin_more_sem_params2: ∀succT,codeT,lookup.∀succ: succT → address → res address.∀fetch. ∀pointer_of_label: ∀globals. genv globals (mk_params globals succT ltl_lin_params1 (codeT globals) (lookup globals)) →pointer→label→res (Σp0:pointer.ptype p0=Code). ∀globals. more_sem_params2 … (mk_params globals succT ltl_lin_params1 (codeT globals) (lookup globals)) ≝ λsuccT,codeT,lookup,succ,fetch,pointer_of_label,globals. mk_more_sem_params2 … (mk_more_sem_params1 … (ltl_lin_more_sem_params …) succ (pointer_of_label …) (fetch globals) (load_ra …) (ltl_lin_result_regs …) ltl_lin_init_locals (ltl_lin_save_frame …) (ltl_lin_pop_frame …) (ltl_lin_fetch_external_args …) (ltl_lin_set_result …)) (ltl_lin_exec_extended …). definition ltl_lin_fullexec ≝ λsuccT,codeT,lookup,succ,fetch,pointer_of_label. joint_fullexec … (λp. ltl_lin_more_sem_params2 succT codeT lookup succ fetch pointer_of_label (prog_var_names … p)).