| @@ -0,0 +1,89 @@ |
| 1 | +theory Isolation |
| 2 | + imports Model |
| 3 | +begin |
| 4 | + |
| 5 | +lemma write_target: |
| 6 | + assumes "bounded n s" "k < n" |
| 7 | + shows "view (store s k offset byte) k = (view s k)(offset := byte)" |
| 8 | + using prepare_view[OF assms, of k] |
| 9 | + by (simp add: view_def store_def Let_def) |
| 10 | + |
| 11 | +lemma write_other: |
| 12 | + assumes inv: "invariant n s" and valid: "k < n" "j < n" and different: "j \<noteq> k" |
| 13 | + shows "view (store s k offset byte) j = view s j" |
| 14 | +proof - |
| 15 | + have prepared: "invariant n (prepare s k)" |
| 16 | + using inv by (rule prepare_invariant) |
| 17 | + have distinct: "ptable (prepare s k) j \<noteq> ptable (prepare s k) k" |
| 18 | + using writable_unique[of n "prepare s k" k j] prepared valid different |
| 19 | + by (auto simp: invariant_def) |
| 20 | + have preserved: "view (prepare s k) j = view s j" |
| 21 | + using prepare_view[of n s j k] inv valid by (auto simp: invariant_def) |
| 22 | + show ?thesis |
| 23 | + using distinct preserved by (simp add: store_def view_def Let_def) |
| 24 | +qed |
| 25 | + |
| 26 | +theorem write_refinement: |
| 27 | + assumes "invariant n s" "k < n" "j < n" |
| 28 | + shows "view (store s k offset byte) j = |
| 29 | + (if j = k then (view s k)(offset := byte) else view s j)" |
| 30 | + using assms write_target write_other by (auto simp: invariant_def) |
| 31 | + |
| 32 | +corollary read_after_write: |
| 33 | + "invariant n s \<Longrightarrow> k < n \<Longrightarrow> |
| 34 | + view (store s k offset byte) k offset = byte" |
| 35 | + using write_refinement[of n s k k offset byte] by simp |
| 36 | + |
| 37 | +corollary other_offset: |
| 38 | + "invariant n s \<Longrightarrow> k < n \<Longrightarrow> address \<noteq> offset \<Longrightarrow> |
| 39 | + view (store s k offset byte) k address = view s k address" |
| 40 | + using write_refinement[of n s k k offset byte] by simp |
| 41 | + |
| 42 | +definition reference_write :: "memory \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> memory" where |
| 43 | + "reference_write m k offset byte = m(k := (m k)(offset := byte))" |
| 44 | + |
| 45 | +definition represents :: "nat \<Rightarrow> pager \<Rightarrow> memory \<Rightarrow> bool" where |
| 46 | + "represents n s m \<longleftrightarrow> (\<forall>k<n. view s k = m k)" |
| 47 | + |
| 48 | +lemma represents_initial: |
| 49 | + "represents n (initial pages contents) (\<lambda>k. contents (k mod pages))" |
| 50 | + by (simp add: represents_def) |
| 51 | + |
| 52 | +theorem simulation: |
| 53 | + assumes "invariant n s" "represents n s m" "k < n" |
| 54 | + shows "represents n (store s k offset byte) (reference_write m k offset byte)" |
| 55 | + using assms write_refinement[of n s k] |
| 56 | + by (auto simp: represents_def reference_write_def) |
| 57 | + |
| 58 | +lemma prepared_exclusive: |
| 59 | + "invariant n s \<Longrightarrow> k < n \<Longrightarrow> j < n \<Longrightarrow> j \<noteq> k \<Longrightarrow> |
| 60 | + ptable (prepare s k) j \<noteq> ptable (prepare s k) k" |
| 61 | + using prepare_invariant writable_unique prepare_writable |
| 62 | + unfolding invariant_def by blast |
| 63 | + |
| 64 | +lemma writable_no_copy: |
| 65 | + "writable s k \<Longrightarrow> frontier (store s k offset byte) = frontier s" |
| 66 | + by (simp add: prepare_def) |
| 67 | + |
| 68 | +lemma readonly_one_copy: |
| 69 | + "\<not> writable s k \<Longrightarrow> frontier (store s k offset byte) = Suc (frontier s)" |
| 70 | + by (simp add: prepare_def) |
| 71 | + |
| 72 | +lemma subsequent_write_no_copy: |
| 73 | + "frontier (store (store s k a x) k b y) = frontier (store s k a x)" |
| 74 | + by (rule writable_no_copy) simp |
| 75 | + |
| 76 | +lemma write_writable_target [simp]: "writable (store s k offset byte) k" |
| 77 | + by simp |
| 78 | + |
| 79 | +lemma write_writable_other: |
| 80 | + "j \<noteq> k \<Longrightarrow> writable (store s k offset byte) j = writable s j" |
| 81 | + by (simp add: prepare_def) |
| 82 | + |
| 83 | +lemma write_preserves_unallocated: |
| 84 | + "f > frontier s \<Longrightarrow> physical (store s k offset byte) f = physical s f" |
| 85 | + if "bounded n s" "k < n" for f s k n offset byte |
| 86 | + using that bounded_frame[OF that] |
| 87 | + by (auto simp: store_def prepare_def detach_def Let_def split: if_splits) |
| 88 | + |
| 89 | +end |