include "ASM/Assembly.ma". include "ASM/Interpret.ma". include "ASM/StatusProofs.ma". include alias "arithmetics/nat.ma". include "ASM/AssemblyProof.ma". lemma let_pair_in_status_of_pseudo_status: ∀A, B, M, cm, sigma, policy. ∀c, c': A × B. ∀s, s'. c = c' → (∀left, right. status_of_pseudo_status M cm (s left right c') sigma policy = s' left right c') → (let 〈left, right〉 ≝ c' in s' left right c') = status_of_pseudo_status M cm (let 〈left, right〉 ≝ c in s left right c) sigma policy. #A #B #M #cm #sigma #policy * #a #b * #a' #b' #s #s' normalize nodelta // qed. lemma let_pair_as_in_status_of_pseudo_status: ∀A, B, M, cm, sigma, policy. ∀c, c': A × B. ∀s, s'. c = c' → (∀left, right, H, H'. status_of_pseudo_status M cm (s left right H c) sigma policy = s' left right H' c') → (let 〈left, right〉 as H' ≝ c' in s' left right H' c') = status_of_pseudo_status M cm (let 〈left, right〉 as H ≝ c in s left right H c) sigma policy. #A #B #M #cm #sigma #policy * #a #b * #a' #b' #s #s' normalize nodelta #destruct_refl destruct(destruct_refl) /2/ qed. lemma if_then_else_status_of_pseudo_status: ∀M: internal_pseudo_address_map. ∀cm: pseudo_assembly_program. ∀sigma: Word → Word. ∀policy: Word → bool. ∀s, s', s'', s'''. ∀t, t': bool. t = t' → status_of_pseudo_status M cm s sigma policy = s' → status_of_pseudo_status M cm s'' sigma policy = s''' → if t then s' else s''' = status_of_pseudo_status M cm (if t' then s else s'') sigma policy. #M #cm #sigma #policy #s #s' #s'' #s''' #t #t' #t_refl #s_refl >t_refl normalize nodelta >s_refl cases t' normalize nodelta // qed. lemma set_program_counter_status_of_pseudo_status: ∀M. ∀cm. ∀sigma. ∀policy. ∀s, s'. ∀new_ppc, new_ppc'. sigma new_ppc = new_ppc' → status_of_pseudo_status M cm s sigma policy = s' → set_program_counter (BitVectorTrie Byte 16) (code_memory_of_pseudo_assembly_program cm sigma policy) s' new_ppc' = status_of_pseudo_status M cm (set_program_counter … cm s new_ppc) sigma policy. #M #cm #sigma #policy #s #s' #new_ppc #new_ppc' #new_ppc_refl #s_refl relevant in o_neq_m_assm; #relevant @(absurd ?? relevant) % ] ] qed. (* XXX: move elsewhere *) lemma get_index_v_set_index_miss: ∀a: Type[0]. ∀n: nat. ∀v: Vector a n. ∀i, j: nat. ∀e: a. ∀i_proof: i < n. ∀j_proof: j < n. i ≠ j → get_index_v a n (set_index a n v i e i_proof) j j_proof = get_index_v a n v j j_proof. #a #n #v elim v [1: #i #j #e #i_proof cases (lt_to_not_zero … i_proof) |2: #n' #hd #tl #inductive_hypothesis #i #j cases i cases j [1: #e #i_proof #j_proof #neq_assm cases (absurd ? (refl … 0) neq_assm) |2,3: #i' #e #i_proof #j_proof #_ % |4: #i' #j' #e #i_proof #j_proof #neq_assm @inductive_hypothesis @nmk #eq_assm >eq_assm in neq_assm; #neq_assm cases (absurd ? (refl ??) neq_assm) ] ] qed. lemma set_index_status_of_pseudo_status: ∀M, code_memory, sigma, policy, s, sfr, v, v'. map_address_using_internal_pseudo_address_map M sigma sfr v = v' → (set_index Byte 19 (special_function_registers_8051 (BitVectorTrie Byte 16) (code_memory_of_pseudo_assembly_program code_memory sigma policy) (status_of_pseudo_status M code_memory s sigma policy)) (sfr_8051_index sfr) v' (sfr8051_index_19 sfr) =sfr_8051_of_pseudo_sfr_8051 M (special_function_registers_8051 pseudo_assembly_program code_memory (set_8051_sfr pseudo_assembly_program code_memory s sfr v)) sigma). #M #code_memory #sigma #policy #s #sfr #v #v' #sfr_neq_acc_a_assm whd in match status_of_pseudo_status; normalize nodelta whd in match sfr_8051_of_pseudo_sfr_8051; normalize nodelta inversion (\snd M) try (#upper_lower #address) #sndM_refl normalize nodelta [1: sndM_refl % ] % |2: @pair_elim #high #low #high_low_refl normalize nodelta inversion (eq_upper_lower upper_lower upper) #eq_upper_lower_refl normalize nodelta sndM_refl normalize nodelta >high_low_refl normalize nodelta >eq_upper_lower_refl normalize nodelta whd in match (set_8051_sfr ?????); [1: sndM_refl % ] % |2: @pair_elim #high #low #high_low_refl normalize nodelta inversion (eq_upper_lower upper_lower upper) #eq_upper_lower_refl normalize nodelta cases sfr [18,37: whd in match map_address_using_internal_pseudo_address_map; normalize nodelta whd in match map_acc_a_using_internal_pseudo_address_map; normalize nodelta >sndM_refl normalize nodelta >high_low_refl normalize nodelta >eq_upper_lower_refl normalize nodelta whd in match (set_8051_sfr ?????); // ] @get_index_v_set_index_miss whd in ⊢ (?(??%%)); @nmk #absurd destruct(absurd) ] qed. lemma set_8051_sfr_status_of_pseudo_status: ∀M, code_memory, sigma, policy, s, s', sfr, v,v'. status_of_pseudo_status M code_memory s sigma policy = s' → map_address_using_internal_pseudo_address_map M sigma sfr v = v' → set_8051_sfr ? (code_memory_of_pseudo_assembly_program code_memory sigma policy) s' sfr v' = status_of_pseudo_status M code_memory (set_8051_sfr pseudo_assembly_program code_memory s sfr v) sigma policy. #M #code_memory #sigma #policy #s #s' #sfr #v #v' #s_ok #v_ok v_refl // qed. lemma set_bit_addressable_sfr_status_of_pseudo_status: ∀code_memory: pseudo_assembly_program. ∀s: PreStatus … code_memory. ∀d: Byte. ∀v: Byte. ∀M. ∀sigma. ∀policy. ∀s': Status ?. ∀v'. status_of_pseudo_status M code_memory s sigma policy = s' → map_address_Byte_using_internal_pseudo_address_map M sigma d v = v' → (set_bit_addressable_sfr (BitVectorTrie Byte 16) (code_memory_of_pseudo_assembly_program code_memory sigma policy) s' d v' =status_of_pseudo_status M code_memory (set_bit_addressable_sfr pseudo_assembly_program code_memory s d v) sigma policy). #code #s #d #v cases (set_bit_addressable_sfr_status_of_pseudo_status' code s d v) #_ #H @H qed. lemma set_low_internal_ram_status_of_pseudo_status: ∀cm,sigma,policy,M,s,s',ram. status_of_pseudo_status M cm s sigma policy = s' → set_low_internal_ram (BitVectorTrie Byte 16) (code_memory_of_pseudo_assembly_program cm sigma policy) s' (low_internal_ram_of_pseudo_low_internal_ram M ram) = status_of_pseudo_status M cm (set_low_internal_ram pseudo_assembly_program cm s ram) sigma policy. #cm #sigma #policy #M #s #s' #ram #s_refl (get_8051_sfr_status_of_pseudo_status … (refl …) (refl …)) @pair_elim #un #ln #_ @pair_elim #r1 #r0 #_ % qed. (*CSC: provable using the axiom in AssemblyProof, but this one seems more primitive *) axiom lookup_low_internal_ram_of_pseudo_low_internal_ram: ∀M,sigma,cm,s,s',addr. map_internal_ram_address_using_pseudo_address_map M sigma (false:::addr) (lookup Byte 7 addr (low_internal_ram pseudo_assembly_program cm s) (zero 8)) = s' → lookup Byte 7 addr (low_internal_ram_of_pseudo_low_internal_ram M (low_internal_ram pseudo_assembly_program cm s)) (zero 8) = s'. (*CSC: provable using the axiom in AssemblyProof, but this one seems more primitive *) axiom lookup_high_internal_ram_of_pseudo_high_internal_ram: ∀M,sigma,cm,s,s',addr. map_internal_ram_address_using_pseudo_address_map M sigma (true:::addr) (lookup Byte 7 addr (high_internal_ram pseudo_assembly_program cm s) (zero 8)) = s' → lookup Byte 7 addr (high_internal_ram_of_pseudo_high_internal_ram M (high_internal_ram pseudo_assembly_program cm s)) (zero 8) = s'. lemma get_register_status_of_pseudo_status: ∀M,cm,sigma,policy,s,s',s'',r. status_of_pseudo_status M cm s sigma policy = s' → map_internal_ram_address_using_pseudo_address_map M sigma (false:::bit_address_of_register pseudo_assembly_program cm s r) (get_register … cm s r) = s'' → get_register … (code_memory_of_pseudo_assembly_program cm sigma policy) s' r = s''. #M #cm #sigma #policy #s #s' #s'' #r #s_refl #s_refl' bit_address_of_register_status_of_pseudo_status @(lookup_low_internal_ram_of_pseudo_low_internal_ram … (refl …)) qed. lemma external_ram_status_of_pseudo_status: ∀M,cm,s,sigma,policy. external_ram … (code_memory_of_pseudo_assembly_program cm sigma policy) (status_of_pseudo_status M cm s sigma policy) = external_ram … cm s. // qed. lemma set_external_ram_status_of_pseudo_status: ∀M,cm,ps,sigma,policy,ram. set_external_ram … (code_memory_of_pseudo_assembly_program cm sigma policy) (status_of_pseudo_status M cm ps sigma policy) ram = status_of_pseudo_status M cm (set_external_ram … cm ps ram) sigma policy. // qed. lemma set_register_status_of_pseudo_status: ∀M,sigma,policy,cm,s,s',r,v,v'. status_of_pseudo_status M cm s sigma policy = s' → map_internal_ram_address_using_pseudo_address_map M sigma (false:::bit_address_of_register pseudo_assembly_program cm s r) v =v' → set_register (BitVectorTrie Byte 16) (code_memory_of_pseudo_assembly_program cm sigma policy) s' r v' = status_of_pseudo_status M cm (set_register pseudo_assembly_program cm s r v) sigma policy. #M #sigma #policy #cm #s #s' #r #v #v' #s_refl bit_address_of_register_status_of_pseudo_status >(insert_low_internal_ram_status_of_pseudo_status … v_ok) @set_low_internal_ram_status_of_pseudo_status % qed. definition map_address_mode_using_internal_pseudo_address_map_ok1 ≝ λM:internal_pseudo_address_map.λcm.λs:PreStatus ? cm.λsigma. λaddr. match addr with [ INDIRECT i ⇒ assoc_list_lookup ?? (false:::bit_address_of_register pseudo_assembly_program cm s [[false; false; i]]) (eq_bv …) (\fst M) = None … | EXT_INDIRECT e ⇒ assoc_list_lookup ?? (false:::bit_address_of_register pseudo_assembly_program cm s [[false; false; e]]) (eq_bv …) (\fst M) = None … | ACC_DPTR ⇒ (* XXX: \snd M = None plus in the very rare case when we are trying to dereference a null (O) pointer in the ACC_A *) map_acc_a_using_internal_pseudo_address_map M sigma (get_8051_sfr pseudo_assembly_program cm s SFR_ACC_A) = get_8051_sfr … cm s SFR_ACC_A | ACC_PC ⇒ (* XXX: as above *) map_acc_a_using_internal_pseudo_address_map M sigma (get_8051_sfr pseudo_assembly_program cm s SFR_ACC_A) = get_8051_sfr … cm s SFR_ACC_A ∧ sigma (program_counter … s) = program_counter … s | _ ⇒ True ]. definition map_address_mode_using_internal_pseudo_address_map_ok2 ≝ λT,M,sigma,cm.λs:PreStatus T cm.λaddr,v. match addr with [ DIRECT d ⇒ let 〈 bit_one, seven_bits 〉 as vsplit_refl ≝ vsplit … 1 7 d in match head' … bit_one with [ true ⇒ map_address_Byte_using_internal_pseudo_address_map M sigma (true:::seven_bits) v | false ⇒ map_internal_ram_address_using_pseudo_address_map M sigma (false:::seven_bits) v ] | INDIRECT i ⇒ let register ≝ get_register ?? s [[ false; false; i ]] in map_internal_ram_address_using_pseudo_address_map M sigma register v | REGISTER r ⇒ map_internal_ram_address_using_pseudo_address_map M sigma (false:::bit_address_of_register … s r) v | ACC_A ⇒ map_address_using_internal_pseudo_address_map M sigma SFR_ACC_A v | _ ⇒ v ]. (*CSC: move elsewhere*) lemma eq_head': ∀A,n,v. v = head' A n v ::: tail … v. #A #n #v inversion v in ⊢ ?; [ #abs @⊥ lapply (jmeq_to_eq ??? abs) /2/ | #m #hd #tl #_ #EQ <(injective_S … EQ) in tl; #tl #EQ' >EQ' % ] qed. (*CSC: move elsewhere*) lemma tail_singleton: ∀A,v. tail A 0 v = [[]]. #A #v inversion v in ⊢ ?; [ #abs @⊥ lapply (jmeq_to_eq ??? abs) #H destruct(H) | #n #hd #tl #_ #EQ <(injective_S … EQ) in tl; #tl #EQ1 >EQ1 normalize /2 by jmeq_to_eq/ ] qed. (*CSC: move elsewhere*) lemma eq_cons_head_append: ∀A,n.∀hd: Vector A 1. ∀tl: Vector A n. head' A 0 hd:::tl = hd@@tl. #A #n #hd #tl >(eq_head' … hd) >tail_singleton % qed. lemma set_arg_8_status_of_pseudo_status': ∀cm. ∀ps. ∀addr:[[ direct ; indirect ; registr ; acc_a ; acc_b ; ext_indirect ; ext_indirect_dptr ]]. ∀value. Σp: PreStatus ? cm. ∀M. ∀sigma. ∀policy. ∀s'. ∀value'. status_of_pseudo_status M cm ps sigma policy = s' → map_address_mode_using_internal_pseudo_address_map_ok1 M cm ps sigma addr → map_address_mode_using_internal_pseudo_address_map_ok2 … M sigma cm ps addr value = value' → set_arg_8 (BitVectorTrie Byte 16) (code_memory_of_pseudo_assembly_program cm sigma policy) s' addr value' = status_of_pseudo_status M cm (set_arg_8 … cm ps addr value) sigma policy. whd in match set_arg_8; normalize nodelta @(let m ≝ pseudo_assembly_program in λcm, s. λa: [[ direct ; indirect ; registr ; acc_a ; acc_b ; ext_indirect ; ext_indirect_dptr ]]. λv. match a return λaddr. bool_to_Prop (is_in ? [[ direct ; indirect ; registr ; acc_a ; acc_b ; ext_indirect ; ext_indirect_dptr ]] addr) → Σp.? with [ DIRECT d ⇒ λdirect: True. deplet 〈 bit_one, seven_bits 〉 as vsplit_refl ≝ vsplit ? 1 7 d in match head' … bit_one with [ true ⇒ set_bit_addressable_sfr ?? s (true:::seven_bits) v | false ⇒ let memory ≝ insert ? 7 seven_bits v (low_internal_ram ?? s) in set_low_internal_ram ?? s memory ] | INDIRECT i ⇒ λindirect: True. let register ≝ get_register ?? s [[ false; false; i ]] in let 〈bit_one, seven_bits〉 ≝ vsplit ? 1 7 register in match head' … bit_one with [ false ⇒ let memory ≝ insert … seven_bits v (low_internal_ram ?? s) in set_low_internal_ram ?? s memory | true ⇒ let memory ≝ insert … seven_bits v (high_internal_ram ?? s) in set_high_internal_ram ?? s memory ] | REGISTER r ⇒ λregister: True. set_register ?? s r v | ACC_A ⇒ λacc_a: True. set_8051_sfr ?? s SFR_ACC_A v | ACC_B ⇒ λacc_b: True. set_8051_sfr ?? s SFR_ACC_B v | EXT_INDIRECT e ⇒ λext_indirect: True. let address ≝ get_register ?? s [[ false; false; e ]] in let padded_address ≝ pad 8 8 address in let memory ≝ insert ? 16 padded_address v (external_ram ?? s) in set_external_ram ?? s memory | EXT_INDIRECT_DPTR ⇒ λext_indirect_dptr: True. let address ≝ (get_8051_sfr ?? s SFR_DPH) @@ (get_8051_sfr ?? s SFR_DPL) in let memory ≝ insert ? 16 address v (external_ram ?? s) in set_external_ram ?? s memory | _ ⇒ λother: False. match other in False with [ ] ] (subaddressing_modein … a)) normalize nodelta #M #sigma #policy #s' #v' #s_refl p normalize nodelta [ >(vsplit_ok … vsplit_refl) #_ @set_bit_addressable_sfr_status_of_pseudo_status | #_ #v_ok >(insert_low_internal_ram_status_of_pseudo_status … v) // ] |3,4: #EQ1 #EQ2 change with (get_register ????) in match register in p; >(get_register_status_of_pseudo_status … (refl …) (refl …)) whd in match map_internal_ram_address_using_pseudo_address_map; normalize nodelta >EQ1 normalize nodelta >p normalize nodelta >p1 normalize nodelta [ >(insert_high_internal_ram_status_of_pseudo_status … v) | >(insert_low_internal_ram_status_of_pseudo_status … v) ] // p1 % |5: #EQ1 #EQ2 (get_register_status_of_pseudo_status … (refl …) (refl …)) whd in match map_internal_ram_address_using_pseudo_address_map; normalize nodelta >EQ1 normalize nodelta >external_ram_status_of_pseudo_status @set_external_ram_status_of_pseudo_status |6: #EQ1 #EQ2 (get_8051_sfr_status_of_pseudo_status … (refl …) (refl …)) >(get_8051_sfr_status_of_pseudo_status … (refl …) (refl …)) >external_ram_status_of_pseudo_status @set_external_ram_status_of_pseudo_status ] % qed. lemma set_arg_8_status_of_pseudo_status: ∀cm. ∀ps. ∀addr, addr':[[ direct ; indirect ; registr ; acc_a ; acc_b ; ext_indirect ; ext_indirect_dptr ]]. ∀value. ∀M. ∀sigma. ∀policy. ∀s'. ∀value'. addr = addr' → status_of_pseudo_status M cm ps sigma policy = s' → map_address_mode_using_internal_pseudo_address_map_ok1 M cm ps sigma addr → map_address_mode_using_internal_pseudo_address_map_ok2 … M sigma cm ps addr value = value' → set_arg_8 (BitVectorTrie Byte 16) (code_memory_of_pseudo_assembly_program cm sigma policy) s' addr value' = status_of_pseudo_status M cm (set_arg_8 … cm ps addr' value) sigma policy. #cm #ps #addr #addr' #value cases (set_arg_8_status_of_pseudo_status' cm ps addr value) #_ #relevant #M #sigma #policy #s' #value' #addr_refl (get_index_v_status_of_pseudo_status … (refl …)) % qed. lemma get_arg_8_status_of_pseudo_status': ∀cm. ∀ps. ∀l. ∀addr:[[ direct ; indirect ; registr ; acc_a ; acc_b ; data ; acc_dptr ; acc_pc ; ext_indirect ; ext_indirect_dptr ]]. Σp: Byte. ∀M. ∀sigma. ∀policy. ∀s'. (status_of_pseudo_status M cm ps sigma policy) = s' → map_address_mode_using_internal_pseudo_address_map_ok1 M cm ps sigma addr → get_arg_8 (BitVectorTrie Byte 16) (code_memory_of_pseudo_assembly_program cm sigma policy) s' l addr = map_address_mode_using_internal_pseudo_address_map_ok2 … M sigma cm ps addr (get_arg_8 … cm ps l addr). whd in match get_arg_8; normalize nodelta @(let m ≝ pseudo_assembly_program in λcm: m. λs: PreStatus m cm. λl: bool. λa: [[direct; indirect; registr; acc_a; acc_b; data; acc_dptr; acc_pc; ext_indirect; ext_indirect_dptr]]. match a return λx. bool_to_Prop (is_in ? [[ direct; indirect; registr; acc_a; acc_b; data; acc_dptr; acc_pc; ext_indirect; ext_indirect_dptr ]] x) → Σp. ? with [ ACC_A ⇒ λacc_a: True. get_8051_sfr ?? s SFR_ACC_A | ACC_B ⇒ λacc_b: True. get_8051_sfr ?? s SFR_ACC_B | DATA d ⇒ λdata: True. d | REGISTER r ⇒ λregister: True. get_register ?? s r | EXT_INDIRECT_DPTR ⇒ λext_indirect_dptr: True. let address ≝ (get_8051_sfr ?? s SFR_DPH) @@ (get_8051_sfr ?? s SFR_DPL) in lookup ? 16 address (external_ram ?? s) (zero 8) | EXT_INDIRECT e ⇒ λext_indirect: True. let address ≝ get_register ?? s [[ false; false; e ]] in let padded_address ≝ pad 8 8 address in lookup ? 16 padded_address (external_ram ?? s) (zero 8) | ACC_DPTR ⇒ λacc_dptr: True. let dptr ≝ (get_8051_sfr ?? s SFR_DPH) @@ (get_8051_sfr ?? s SFR_DPL) in let padded_acc ≝ pad 8 8 (get_8051_sfr ?? s SFR_ACC_A) in let 〈carry, address〉 ≝ half_add 16 dptr padded_acc in lookup ? 16 address (external_ram ?? s) (zero 8) | ACC_PC ⇒ λacc_pc: True. let padded_acc ≝ pad 8 8 (get_8051_sfr ?? s SFR_ACC_A) in let 〈 carry, address 〉 ≝ half_add 16 (program_counter ?? s) padded_acc in lookup ? 16 address (external_ram ?? s) (zero 8) | DIRECT d ⇒ λdirect: True. let 〈hd, seven_bits〉 ≝ vsplit bool 1 7 d in match head' … hd with [ true ⇒ get_bit_addressable_sfr m cm s (true:::seven_bits) l | false ⇒ lookup ? 7 seven_bits (low_internal_ram … s) (zero …) ] | INDIRECT i ⇒ λindirect: True. let 〈hd, seven_bits〉 ≝ vsplit bool 1 7 (get_register … s [[false;false;i]]) in match head' … hd with [ true ⇒ lookup ? 7 seven_bits (high_internal_ram … s) (zero …) | false ⇒ lookup ? 7 seven_bits (low_internal_ram … s) (zero …) ] | _ ⇒ λother: False. match other in False with [ ] ] (subaddressing_modein … a)) normalize nodelta #M #sigma #policy #s' #s_refl p normalize nodelta >p1 normalize nodelta @(get_bit_addressable_sfr_status_of_pseudo_status … (refl …)) % |2: #_>p normalize nodelta >p1 normalize nodelta @(lookup_low_internal_ram_of_pseudo_low_internal_ram … sigma) % |3,4: #assoc_list_assm >(get_register_status_of_pseudo_status … (refl …) (refl …)) whd in match map_internal_ram_address_using_pseudo_address_map in ⊢ (??%?); normalize nodelta >assoc_list_assm normalize nodelta >p normalize nodelta >p1 normalize nodelta [1: @(lookup_high_internal_ram_of_pseudo_high_internal_ram … sigma) |2: @(lookup_low_internal_ram_of_pseudo_low_internal_ram … sigma) ] @eq_f2 try % <(vsplit_ok … (sym_eq … p)) p1 % |5: #assoc_list_assm >(get_register_status_of_pseudo_status … (refl …) (refl …)) whd in match map_internal_ram_address_using_pseudo_address_map in ⊢ (??%?); normalize nodelta >assoc_list_assm normalize nodelta % |6,7,8,9: #_ /2 by refl, get_register_status_of_pseudo_status, get_index_v_status_of_pseudo_status/ |10: #acc_a_assm >(get_8051_sfr_status_of_pseudo_status … (refl …) (refl …)) >(get_8051_sfr_status_of_pseudo_status … (refl …) (refl …)) >(get_8051_sfr_status_of_pseudo_status … (refl …) (refl …)) whd in match map_address_using_internal_pseudo_address_map; normalize nodelta >acc_a_assm >p normalize nodelta // |11: * #map_acc_a_assm #sigma_assm >(get_8051_sfr_status_of_pseudo_status … (refl …) (refl …)) >(program_counter_status_of_pseudo_status … (refl …) (refl …)) whd in match map_address_using_internal_pseudo_address_map; normalize nodelta >sigma_assm >map_acc_a_assm >p normalize nodelta // |12: #_ >(get_8051_sfr_status_of_pseudo_status … (refl …) (refl …)) >(get_8051_sfr_status_of_pseudo_status … (refl …) (refl …)) >external_ram_status_of_pseudo_status // ] qed. lemma get_arg_8_status_of_pseudo_status: ∀cm. ∀ps. ∀l. ∀addr:[[ direct ; indirect ; registr ; acc_a ; acc_b ; data ; acc_dptr ; acc_pc ; ext_indirect ; ext_indirect_dptr ]]. ∀M. ∀sigma. ∀policy. ∀s', s''. (status_of_pseudo_status M cm ps sigma policy) = s' → map_address_mode_using_internal_pseudo_address_map_ok2 … M sigma cm ps addr (get_arg_8 … cm ps l addr) = s'' → map_address_mode_using_internal_pseudo_address_map_ok1 M cm ps sigma addr → get_arg_8 (BitVectorTrie Byte 16) (code_memory_of_pseudo_assembly_program cm sigma policy) s' l addr = s''. #cm #ps #l #addr cases (get_arg_8_status_of_pseudo_status' cm ps l addr) #_ #relevant #M #sigma #policy #s' #s'' #s_refl #s_refl' (get_cy_flag_status_of_pseudo_status … (refl …)) % |2,4: whd in ⊢ (% → ?); >p normalize nodelta >p1 normalize nodelta >(get_bit_addressable_sfr_status_of_pseudo_status … (refl …) (refl …)) #map_address_assm >map_address_assm % |3,5: whd in ⊢ (% → ?); >p normalize nodelta >p1 normalize nodelta whd in match status_of_pseudo_status; normalize nodelta >(lookup_low_internal_ram_of_pseudo_low_internal_ram … sigma … (refl …)) #map_address_assm >map_address_assm % ] qed. lemma get_arg_1_status_of_pseudo_status: ∀cm. ∀ps. ∀addr, addr': [[bit_addr; n_bit_addr; carry]]. ∀l. ∀M. ∀sigma. ∀policy. ∀s'. addr = addr' → status_of_pseudo_status M cm ps sigma policy = s' → map_bit_address_mode_using_internal_pseudo_address_map_get M cm ps sigma addr l → get_arg_1 (BitVectorTrie Byte 16) (code_memory_of_pseudo_assembly_program cm sigma policy) s' addr l = (get_arg_1 … cm ps addr' l). #cm #ps #addr #addr' #l cases (get_arg_1_status_of_pseudo_status' cm ps addr l) #_ #assm #M #sigma #policy #s' #addr_refl (get_8051_sfr_status_of_pseudo_status … (refl …) (refl …)) whd in match map_address_using_internal_pseudo_address_map; normalize nodelta >p normalize nodelta @set_8051_sfr_status_of_pseudo_status % |2,3: >p normalize nodelta >p1 normalize nodelta #map_bit_address_assm_1 #map_bit_address_assm_2 [1: >(get_bit_addressable_sfr_status_of_pseudo_status … (refl …) (refl …)) >map_bit_address_assm_1 >(set_bit_addressable_sfr_status_of_pseudo_status cm s … map_bit_address_assm_2) % |2: whd in match status_of_pseudo_status in ⊢ (??(????%)?); normalize nodelta >(lookup_low_internal_ram_of_pseudo_low_internal_ram … sigma … (refl …)) >map_bit_address_assm_1 >(insert_low_internal_ram_of_pseudo_low_internal_ram … map_bit_address_assm_2) >set_low_internal_ram_status_of_pseudo_status in ⊢ (??%?); % ] ] qed. lemma set_arg_1_status_of_pseudo_status: ∀cm: pseudo_assembly_program. ∀ps: PreStatus pseudo_assembly_program cm. ∀addr: [[bit_addr; carry]]. ∀b: Bit. ∀M. ∀sigma. ∀policy. ∀s'. ∀b'. b = b' → status_of_pseudo_status M cm ps sigma policy = s' → map_bit_address_mode_using_internal_pseudo_address_map_set_1 M cm ps sigma addr b → map_bit_address_mode_using_internal_pseudo_address_map_set_2 M cm ps sigma addr b → set_arg_1 (BitVectorTrie Byte 16) (code_memory_of_pseudo_assembly_program cm sigma policy) s' addr b = status_of_pseudo_status M cm (set_arg_1 … cm ps addr b') sigma policy. #cm #ps #addr #b cases (set_arg_1_status_of_pseudo_status' cm ps addr b) #_ #relevant @relevant qed. lemma clock_status_of_pseudo_status: ∀M,cm,sigma,policy,s,s'. (status_of_pseudo_status M cm s sigma policy) = s' → clock … (code_memory_of_pseudo_assembly_program cm sigma policy) s' = clock … cm s. #M #cm #sigma #policy #s #s' #s_refl get_index_v_set_index_miss [2,4: /2/] % qed. lemma get_ov_flag_status_of_pseudo_status: ∀M: internal_pseudo_address_map. ∀sigma: Word → Word. ∀policy: Word → bool. ∀code_memory: pseudo_assembly_program. ∀s: PreStatus ? code_memory. ∀s'. status_of_pseudo_status M code_memory s sigma policy = s' → get_ov_flag ?? s' = get_ov_flag ? code_memory s. #M #sigma #policy #code_memory #s #s' #s_refl get_index_v_set_index_miss [2,4: /2/] % qed.