1 (**************************************************************************)
4 (* ||A|| A project by Andrea Asperti *)
6 (* ||I|| Developers: *)
7 (* ||T|| The HELM team. *)
8 (* ||A|| http://helm.cs.unibo.it *)
10 (* \ / This file is distributed under the terms of the *)
11 (* v GNU General Public License Version 2 *)
13 (**************************************************************************)
15 (* ********************************************************************** *)
16 (* Progetto FreeScale *)
19 (* Cosimo Oliboni, oliboni@cs.unibo.it *)
21 (* Questo materiale fa parte della tesi: *)
22 (* "Formalizzazione Interattiva dei Microcontroller a 8bit FreeScale" *)
24 (* data ultima modifica 15/11/2007 *)
25 (* ********************************************************************** *)
27 include "freescale/memory_func.ma".
28 include "freescale/memory_trees.ma".
29 include "freescale/memory_bits.ma".
31 (* ********************************************* *)
32 (* ASTRAZIONE DALL'IMPLEMENTAZIONE DELLA MEMORIA *)
33 (* ********************************************* *)
35 (* tipi di implementazione della memoria *)
36 inductive memory_impl : Type ≝
38 | MEM_TREE: memory_impl
39 | MEM_BITS: memory_impl.
41 (* ausiliario per il tipo della memoria *)
42 definition aux_mem_type ≝
43 λt:memory_impl.match t with
44 [ MEM_FUNC ⇒ word16 → byte8
45 | MEM_TREE ⇒ Prod16T (Prod16T (Prod16T (Prod16T byte8)))
46 | MEM_BITS ⇒ Prod16T (Prod16T (Prod16T (Prod16T (Prod8T bool))))
49 (* ausiliario per il tipo del checker *)
50 definition aux_chk_type ≝
51 λt:memory_impl.match t with
52 [ MEM_FUNC ⇒ word16 → memory_type
53 | MEM_TREE ⇒ Prod16T (Prod16T (Prod16T (Prod16T memory_type)))
54 | MEM_BITS ⇒ Prod16T (Prod16T (Prod16T (Prod16T (Prod8T memory_type))))
57 (* unificazione di out_of_bound_memory *)
58 definition out_of_bound_memory ≝
61 return λt.aux_chk_type t
63 [ MEM_FUNC ⇒ mf_out_of_bound_memory
64 | MEM_TREE ⇒ mt_out_of_bound_memory
65 | MEM_BITS ⇒ mb_out_of_bound_memory
68 (* unificazione di zero_memory *)
69 definition zero_memory ≝
72 return λt.aux_mem_type t
74 [ MEM_FUNC ⇒ mf_zero_memory
75 | MEM_TREE ⇒ mt_zero_memory
76 | MEM_BITS ⇒ mb_zero_memory
79 (* unificazione della lettura senza chk: mem_read_abs mem addr *)
80 definition mem_read_abs ≝
83 return λt.aux_mem_type t → word16 → byte8
85 [ MEM_FUNC ⇒ λm:aux_mem_type MEM_FUNC.
88 | MEM_TREE ⇒ λm:aux_mem_type MEM_TREE.
91 | MEM_BITS ⇒ λm:aux_mem_type MEM_BITS.
93 byte8_of_bits (mt_visit (Prod8T bool) m addr)
96 (* unificazione del chk *)
98 λt:memory_impl.λc:aux_chk_type t.λaddr:word16.
100 return λt.aux_chk_type t → word16 → Prod8T memory_type
102 [ MEM_FUNC ⇒ mf_chk_get
103 | MEM_TREE ⇒ mt_chk_get
104 | MEM_BITS ⇒ mb_chk_get
107 (* unificazione della lettura con chk: mem_read mem chk addr *)
108 definition mem_read ≝
109 λt:memory_impl.λm:aux_mem_type t.λc:aux_chk_type t.λaddr:word16.
111 return λt.aux_mem_type t → aux_chk_type t → word16 → option byte8
113 [ MEM_FUNC ⇒ mf_mem_read
114 | MEM_TREE ⇒ mt_mem_read
115 | MEM_BITS ⇒ mb_mem_read
118 (* unificazione della lettura di bit con chk: mem_read mem chk addr sub *)
119 definition mem_read_bit ≝
122 return λt.aux_mem_type t → aux_chk_type t → word16 → oct → option bool
124 [ MEM_FUNC ⇒ λm:aux_mem_type MEM_FUNC.
125 λc:aux_chk_type MEM_FUNC.
128 opt_map ?? (mf_mem_read m c addr)
129 (λb.Some ? (getn_array8T o bool (bits_of_byte8 b)))
130 | MEM_TREE ⇒ λm:aux_mem_type MEM_TREE.
131 λc:aux_chk_type MEM_TREE.
134 opt_map ?? (mt_mem_read m c addr)
135 (λb.Some ? (getn_array8T o bool (bits_of_byte8 b)))
136 | MEM_BITS ⇒ λm:aux_mem_type MEM_BITS.
137 λc:aux_chk_type MEM_BITS.
140 mb_mem_read_bit m c addr o
143 (* unificazione della scrittura con chk: mem_update mem chk addr val *)
144 definition mem_update ≝
145 λt:memory_impl.λm:aux_mem_type t.λc:aux_chk_type t.λaddr:word16.λv:byte8.
147 return λt.aux_mem_type t → Prod8T memory_type → word16 → byte8 → option (aux_mem_type t)
149 [ MEM_FUNC ⇒ mf_mem_update
150 | MEM_TREE ⇒ mt_mem_update
151 | MEM_BITS ⇒ mb_mem_update
152 ] m (chk_get t c addr) addr v.
154 (* unificazione della scrittura di bit con chk: mem_update mem chk addr sub val *)
155 definition mem_update_bit ≝
158 return λt.aux_mem_type t → aux_chk_type t → word16 → oct → bool → option (aux_mem_type t)
160 [ MEM_FUNC ⇒ λm:aux_mem_type MEM_FUNC.
161 λc:aux_chk_type MEM_FUNC.
165 opt_map ?? (mf_mem_read m c addr)
166 (λb.mf_mem_update m (chk_get MEM_FUNC c addr) addr (byte8_of_bits (setn_array8T o bool (bits_of_byte8 b) v)))
167 | MEM_TREE ⇒ λm:aux_mem_type MEM_TREE.
168 λc:aux_chk_type MEM_TREE.
172 opt_map ?? (mt_mem_read m c addr)
173 (λb.mt_mem_update m (chk_get MEM_TREE c addr) addr (byte8_of_bits (setn_array8T o bool (bits_of_byte8 b) v)))
174 | MEM_BITS ⇒ λm:aux_mem_type MEM_BITS.
175 λc:aux_chk_type MEM_BITS.
179 mb_mem_update_bit m c addr o v
182 (* unificazione del caricamento: load_from_source_at old_mem source addr *)
183 definition load_from_source_at ≝
184 λt:memory_impl.λm:aux_mem_type t.λl:list byte8.λaddr:word16.
186 return λt.aux_mem_type t → list byte8 → word16 → aux_mem_type t
188 [ MEM_FUNC ⇒ mf_load_from_source_at
189 | MEM_TREE ⇒ mt_load_from_source_at
190 | MEM_BITS ⇒ mb_load_from_source_at
193 (* unificazione dell'impostazione della memoria: chk_update_ranged chk inf sup v *)
194 definition check_update_ranged ≝
197 return λt.aux_chk_type t → word16 → word16 → memory_type → aux_chk_type t
199 [ MEM_FUNC ⇒ λc:aux_chk_type MEM_FUNC.
202 mf_check_update_ranged c inf sup v
203 | MEM_TREE ⇒ λc:aux_chk_type MEM_TREE.
206 mt_update_ranged memory_type c inf sup v
207 | MEM_BITS ⇒ λc:aux_chk_type MEM_BITS.
210 mt_update_ranged (Prod8T memory_type) c inf sup (array_8T memory_type v v v v v v v v)
213 (* unificazione dell'impostazione dei bit: chk_update_bit chk addr sub v *)
214 (* NB: dove non esiste la granularita' del bit, lascio inalterato *)
215 definition check_update_bit ≝
218 return λt.aux_chk_type t → word16 → oct → memory_type → aux_chk_type t
220 [ MEM_FUNC ⇒ λc:aux_chk_type MEM_FUNC.
225 | MEM_TREE ⇒ λc:aux_chk_type MEM_TREE.
230 | MEM_BITS ⇒ λc:aux_chk_type MEM_BITS.
234 mb_chk_update_bit c addr o v