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 hw_arg_retrieve ≝ λl,a.match a with [ Reg r ⇒ hw_reg_retrieve l r | Imm b ⇒ OK … b ]. definition eval_registers_move ≝ λe,m. match m with [ from_acc r _ ⇒ hw_reg_store r (hwreg_retrieve e RegisterA) e | to_acc _ r ⇒ hw_reg_store RegisterA (hwreg_retrieve e r) e | int_to_reg r v ⇒ hw_reg_store r v e | int_to_acc _ v ⇒ hw_reg_store RegisterA v e ]. definition LTL_LIN_state : sem_state_params ≝ mk_sem_state_params (* framesT ≝ *) unit (* empty_framesT ≝ *) it (* regsT ≝ *) hw_register_env (* empty_regsT ≝ *) init_hw_register_env (* load_sp ≝ *) hwreg_retrieve_sp (* store_sp ≝ *) hwreg_store_sp. (*CSC: XXXX, for external functions only*) axiom ltl_lin_fetch_external_args: external_function → state LTL_LIN_state → res (list val). axiom ltl_lin_set_result: list val → unit → state LTL_LIN_state → res (state LTL_LIN_state). (* TODO (needs another bit to be added to hdw) *) axiom eval_ltl_lin_seq : ltl_lin_seq → state LTL_LIN_state → IO io_out io_in (state LTL_LIN_state). definition LTL_LIN_semantics ≝ λF.mk_sem_unserialized_params LTL_LIN F (* st_pars ≝ *) LTL_LIN_state (* acca_store_ ≝ *) (λ_.hw_reg_store RegisterA) (* acca_retrieve_ ≝ *) (λe.λ_.hw_reg_retrieve e RegisterA) (* acca_arg_retrieve_ ≝ *) (λe.λ_.hw_reg_retrieve e RegisterA) (* accb_store_ ≝ *) (λ_.hw_reg_store RegisterB) (* accb_retrieve_ ≝ *) (λe.λ_.hw_reg_retrieve e RegisterB) (* accb_arg_retrieve_ ≝ *) (λe.λ_.hw_reg_retrieve e RegisterB) (* dpl_store_ ≝ *) (λ_.hw_reg_store RegisterDPL) (* dpl_retrieve_ ≝ *) (λe.λ_.hw_reg_retrieve e RegisterDPL) (* dpl_arg_retrieve_ ≝ *) (λe.λ_.hw_reg_retrieve e RegisterDPL) (* dph_store_ ≝ *) (λ_.hw_reg_store RegisterDPH) (* dph_retrieve_ ≝ *) (λe.λ_.hw_reg_retrieve e RegisterDPH) (* dph_arg_retrieve_ ≝ *) (λe.λ_.hw_reg_retrieve e RegisterDPH) (* snd_arg_retrieve_ ≝ *) hw_arg_retrieve (* pair_reg_move_ ≝ *) eval_registers_move (* fetch_ra ≝ *) (load_ra …) (* allocate_local ≝ *) (λabs.match abs in void with [ ]) (* save_frame ≝ *) (λp.λ_.λst.save_ra … st p) (* setup_call ≝ *) (λ_.λ_.λ_.λst.return st) (* fetch_external_args≝ *) ltl_lin_fetch_external_args (* set_result ≝ *) ltl_lin_set_result (* call_args_for_main ≝ *) 0 (* call_dest_for_main ≝ *) it (* read_result ≝ *) (λ_.λ_.λ_. λst.return map … (hwreg_retrieve (regs … st)) RegisterRets) (* eval_ext_seq ≝ *) (λ_.λ_.λs.λ_.eval_ltl_lin_seq s) (* eval_ext_tailcall ≝ *) (λ_.λ_.λabs.match abs in void with [ ]) (* eval_ext_call ≝ *) (λ_.λ_.λabs.match abs in void with [ ]) (* pop_frame ≝ *) (λ_.λ_.λ_.λst.return st) (* post_op2 ≝ *) (λ_.λ_.λ_.λ_.λ_.λ_.λst.st).