include "LIN/joint_LTL_LIN.ma". include "joint/semanticsUtils.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 … (BVByte 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 (BVByte v) e | int_to_acc _ v ⇒ hw_reg_store RegisterA (BVByte 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). definition LTL_LIN_save_frame : call_kind → unit → state_pc LTL_LIN_state → res(state LTL_LIN_state) ≝ λk.λ_.λst. match k with [ PTR ⇒ ! v ← Byte_of_val BadFunction (hwreg_retrieve (regs … st) RegisterA) ; if eq_bv … v (bv_zero …) then return (st_no_pc … st) else Error … [MSG BadFunction; MSG BadPointer] | ID ⇒ push_ra … st (pc … st) ]. definition eval_LTL_LIN_ext_seq : ∀F.∀globals.∀ge : genv_gen F globals.ltl_lin_seq → ident → state LTL_LIN_state → res (state LTL_LIN_state) ≝ λF,globals,ge,s,curr_id,st. match s with [ SAVE_CARRY ⇒ let regs ≝ hwreg_set_other … (carry … st) (regs … st) in return set_regs LTL_LIN_state regs st | RESTORE_CARRY ⇒ let carry ≝ other_bit (regs … st) in return set_carry LTL_LIN_state carry st | LOW_ADDRESS l ⇒ ! pc_lab ← gen_pc_from_label … ge curr_id l; let 〈addrl,addrh〉 ≝ beval_pair_of_pc pc_lab in let regs ≝ hwreg_store RegisterA addrl (regs … st) in return set_regs LTL_LIN_state regs st | HIGH_ADDRESS l ⇒ ! pc_lab ← gen_pc_from_label … ge curr_id l; let 〈addrl,addrh〉 ≝ beval_pair_of_pc pc_lab in let regs ≝ hwreg_store RegisterA addrh (regs … st) in return set_regs LTL_LIN_state regs st ]. 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 ≝ *) LTL_LIN_save_frame (* 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 ≝ *) (eval_LTL_LIN_ext_seq ?) (* pop_frame ≝ *) ((λ_.λ_.λ_.λ_.λst.pop_ra … st)).