(* * Copyright 2016, NICTA * * This software may be distributed and modified according to the terms of * the BSD 2-Clause license. Note that NO WARRANTY is provided. * See "LICENSE_BSD2.txt" for details. * * @TAG(NICTA_BSD) *) theory BitFieldProofsLib imports Eisbach_Methods TypHeapLib begin lemmas guard_simps = word_sle_def word_sless_def scast_id lemmas mask_shift_simps = ucast_def shift_over_ao_dists word_bw_assocs word_size multi_shift_simps mask_def word_ao_dist NOT_eq scast_id word_and_max_word max_word_def lemmas sep_heap_simps = sep_app_def hrs_mem_update_def hrs_htd_def split_def lemma tag_eq_to_tag_masked_eq: "tag == v ==> tag && m = v && m" by simp lemma clift_heap_update_footprint: "\p' :: 'a ptr. hrs_htd hp,g \\<^sub>t p' \ s_footprint p \ s_footprint p' = {} \ (lift_t g (hrs_mem_update (heap_update p (v :: 'b :: wf_type)) hp) :: ('a :: mem_type) typ_heap) = lift_t g hp" apply (cases hp, simp add: lift_t_if fun_eq_iff hrs_mem_update_def hrs_htd_def) apply clarsimp apply (drule spec, drule(1) mp) apply (simp add: h_val_def heap_update_def) apply (subst heap_list_update_disjoint_same, simp_all) apply (simp add: set_eq_iff s_footprint_intvl[symmetric]) done lemma s_footprint_field_lvalue_disj_helper: "field_lookup (typ_info_t TYPE('b::mem_type)) f 0 = Some (ti,b) \ export_uinfo ti = typ_uinfo_t TYPE('a) \ (\x. P x \ s_footprint (p::'b ptr) \ S x = {}) \ (\x. P x \ s_footprint ((Ptr &(p\f))::'a::mem_type ptr) \ S x = {})" apply (drule field_lookup_export_uinfo_Some) apply simp apply (drule field_ti_s_sub_typ) apply blast done lemma s_footprint_distinct_helper: "h_t_valid htd g (p :: 'a ptr) \ typ_uinfo_t TYPE('a :: c_type) \\<^sub>t typ_uinfo_t TYPE('b :: c_type) \ (\q :: 'b ptr. h_t_valid htd g' q \ s_footprint p \ s_footprint q = {})" apply clarsimp apply (drule(1) h_t_valid_neq_disjoint) apply (clarsimp simp: sub_typ_proper_def tag_disj_def preorder_class.less_imp_le) apply (clarsimp simp: field_of_t_def) apply (drule field_of_sub) apply (simp add: tag_disj_def) apply (simp add: set_eq_iff ) apply (blast dest: s_footprintD) done text {* Use these handy rules to prove that clift doesn't change over various updates. *} method prove_one_bf_clift_invariance = (intro clift_heap_update_footprint[THEN trans] s_footprint_field_lvalue_disj_helper s_footprint_distinct_helper, simp_all only: hrs_htd_mem_update, tactic {* distinct_subgoals_tac *}, (auto simp: typ_uinfo_t_def[symmetric] tag_disj_via_td_name ntbs elim: h_t_valid_clift)+)[1] text {* Select points in the goal where we need to prove that clift doesn't change over updates, and prove them with the above. *} method prove_bf_clift_invariance = ((subst Eq_TrueI[where P="lift_t g h = lift_t g h'" for g h h'], prove_one_bf_clift_invariance)+, simp) end