include "joint/semantics.ma". include alias "common/Identifiers.ma". include "utilities/hide.ma". include "ASM/BitVectorTrie.ma". record hw_register_env : Type[0] ≝ { reg_env : BitVectorTrie beval 6 ; other_bit : bebit }. definition empty_hw_register_env: hw_register_env ≝ mk_hw_register_env (Stub …) BBundef. include alias "ASM/BitVectorTrie.ma". definition hwreg_retrieve: hw_register_env → Register → beval ≝ λenv,r. lookup … (bitvector_of_register r) (reg_env env) BVundef. definition hwreg_store: Register → beval → hw_register_env → hw_register_env ≝ λr,v,env.mk_hw_register_env (insert … (bitvector_of_register r) v (reg_env env)) (other_bit env). definition hwreg_set_other : bebit → hw_register_env → hw_register_env ≝ λv,env.mk_hw_register_env (reg_env env) v. definition hwreg_retrieve_sp : hw_register_env → res xpointer ≝ λenv. let spl ≝ hwreg_retrieve env RegisterSPL in let sph ≝ hwreg_retrieve env RegisterSPH in ! ptr ← pointer_of_address 〈spl, sph〉 ; match ptype ptr return λx.ptype ptr = x → res xpointer with [ XData ⇒ λprf.return «ptr, prf» | _ ⇒ λ_.Error … [MSG BadPointer] ] (refl …). definition hwreg_store_sp : hw_register_env → xpointer → hw_register_env ≝ λenv,sp. let 〈spl, sph〉 ≝ beval_pair_of_pointer sp in hwreg_store RegisterSPH sph (hwreg_store RegisterSPL spl env). (*** Store/retrieve on pseudo-registers ***) include alias "common/Identifiers.ma". record reg_sp : Type[0] ≝ { reg_sp_env :> identifier_map RegisterTag beval ; stackp : xpointer }. axiom BadRegister : String. definition reg_store ≝ λreg,v,locals. update RegisterTag beval locals reg v. definition reg_retrieve : register_env beval → register → res beval ≝ λlocals,reg. opt_to_res … [MSG BadRegister; CTX ? reg] (lookup … locals reg). definition reg_sp_store ≝ λreg,v,locals. ! locals' ← reg_store reg v (reg_sp_env locals) ; return mk_reg_sp locals' (stackp locals). definition reg_sp_retrieve ≝ λlocals.reg_retrieve locals. (*** Store/retrieve on hardware registers ***) definition init_hw_register_env: xpointer → hw_register_env ≝ λsp.hwreg_store_sp empty_hw_register_env sp. (******************************** GRAPHS **************************************) definition make_sem_graph_params : ∀pars : unserialized_params. ∀g_pars : ∀F.sem_unserialized_params pars F. sem_params ≝ λpars,spars. let g_pars ≝ mk_graph_params pars in mk_sem_params g_pars (spars ?) (word_of_identifier ?) (an_identifier ?) ? (refl …). * #p % qed. (******************************** LINEAR **************************************) lemma succ_pos_of_nat_of_pos : ∀p.succ_pos_of_nat (nat_of_pos p) = succ p. @pos_elim [%] #p #IH >nat_possucc whd in ⊢ (??%?); >IH % qed. definition make_sem_lin_params : ∀pars : unserialized_params. (∀F.sem_unserialized_params pars F) → sem_params ≝ λpars,spars. let lin_pars ≝ mk_lin_params pars in mk_sem_params lin_pars (spars ?) succ_pos_of_nat (λp.pred (nat_of_pos p)) ??. [ #n >nat_succ_pos % | @pos_cases [%] #p >nat_possucc @succ_pos_of_nat_of_pos ] qed. lemma fetch_statement_eq : ∀p:sem_params.∀g. ∀ge : genv_t (joint_function p g).∀ptr : program_counter. ∀i,fn,s. fetch_internal_function … ge (pc_block ptr) = OK … 〈i, fn〉 → let pt ≝ point_of_pc … ptr in stmt_at … (joint_if_code … fn) pt = Some ? s → fetch_statement … ge ptr = OK … 〈i, fn, s〉. #p #g #ge #ptr #i #f #s #EQ1 #EQ2 whd in match fetch_statement; normalize nodelta >EQ1 >m_return_bind >EQ2 % qed. lemma fetch_statement_inv : ∀p:sem_params.∀g. ∀ge : genv_t (joint_function p g).∀ptr : program_counter. ∀i,fn,s. fetch_statement … ge ptr = OK … 〈i, fn, s〉 → fetch_internal_function … ge (pc_block ptr) = OK … 〈i, fn〉 ∧ let pt ≝ point_of_pc p ptr in stmt_at … (joint_if_code … fn) pt = Some ? s. #p #g #ge #ptr #i #fn #s #H elim (bind_inversion ????? H) * #i #f' * #EQ1 -H #H elim (bind_inversion ????? H) #s' * #H lapply (opt_eq_from_res ???? H) -H #EQ2 whd in ⊢ (??%%→?); #EQ destruct(EQ) %{EQ1 EQ2} qed.