include "ASM/Status.ma". lemma get_register_set_program_counter: ∀T,s,pc. get_register T (set_program_counter … s pc) = get_register … s. #T #s #pc % qed. lemma get_8051_sfr_set_program_counter: ∀T,s,pc. get_8051_sfr T (set_program_counter … s pc) = get_8051_sfr … s. #T #s #pc % qed. lemma get_bit_addressable_sfr_set_program_counter: ∀T,s,pc. get_bit_addressable_sfr T (set_program_counter … s pc) = get_bit_addressable_sfr … s. #T #s #pc % qed. lemma low_internal_ram_set_program_counter: ∀T,s,pc. low_internal_ram T (set_program_counter … s pc) = low_internal_ram … s. #T #s #pc % qed. example get_arg_8_set_program_counter: ∀n.∀l:Vector addressing_mode_tag (S n). ∀T,s,pc,b.∀arg:l. ∀prf:is_in ? [[direct;indirect;registr;acc_a;acc_b;data;acc_dptr;ext_indirect;ext_indirect_dptr]] arg. get_arg_8 T (set_program_counter … s pc) b arg = get_arg_8 … s b arg. [ #n #l #T #s #pc #b * *; #X try (#Y #H) try #H try % @⊥ @H | cases arg in prf; *; normalize // | skip ] qed. lemma set_bit_addressable_sfr_set_code_memory: ∀T, U: Type[0]. ∀ps: PreStatus ?. ∀code_mem. ∀x. ∀val. set_bit_addressable_sfr ? (set_code_memory T U ps code_mem) x val = set_code_memory T U (set_bit_addressable_sfr ? ps x val) code_mem. #T #U #ps #code_mem #x #val whd in ⊢ (??%?) whd in ⊢ (???(???%?)) cases (eqb ? 128) [ normalize nodelta cases not_implemented | normalize nodelta cases (eqb (nat_of_bitvector 8 x) ?) [ normalize nodelta cases not_implemented | normalize nodelta cases (eqb (nat_of_bitvector 8 x) ?) [ normalize nodelta cases not_implemented | normalize nodelta cases (eqb ? 176) [ normalize nodelta % | normalize nodelta cases (eqb ? 153) [ normalize nodelta % | normalize nodelta cases (eqb ? 138) [ normalize nodelta % | normalize nodelta cases (eqb ? 139) [ normalize nodelta % | normalize nodelta cases (eqb ? 140) [ normalize nodelta % | normalize nodelta cases (eqb ? 141) [ normalize nodelta % | normalize nodelta cases (eqb ? 200) [ normalize nodelta % | normalize nodelta cases (eqb ? 202) [ normalize nodelta % | normalize nodelta cases (eqb ? 203) [ normalize nodelta % | normalize nodelta cases (eqb ? 204) [ normalize nodelta % | normalize nodelta cases (eqb ? 205) [ normalize nodelta % | normalize nodelta cases (eqb ? 135) [ normalize nodelta % | normalize nodelta cases (eqb ? 136) [ normalize nodelta % | normalize nodelta cases (eqb ? 137) [ normalize nodelta % | normalize nodelta cases (eqb ? 152) [ normalize nodelta % | normalize nodelta cases (eqb ? 168) [ normalize nodelta % | normalize nodelta cases (eqb ? 184) [ normalize nodelta % | normalize nodelta cases (eqb ? 129) [ normalize nodelta % | normalize nodelta cases (eqb ? 130) [ normalize nodelta % | normalize nodelta cases (eqb ? 131) [ normalize nodelta % | normalize nodelta cases (eqb ? 208) [ normalize nodelta % | normalize nodelta cases (eqb ? 224) [ normalize nodelta % | normalize nodelta cases (eqb ? 240) [ normalize nodelta % | normalize nodelta cases not_implemented ]]]]]]]]]]]]]]]]]]]]]]]]]] qed. example set_arg_8_set_code_memory: ∀n:nat. ∀l:Vector addressing_mode_tag (S n). ∀T: Type[0]. ∀U: Type[0]. ∀ps: PreStatus ?. ∀code_mem. ∀val. ∀b: l. ∀prf:is_in ? [[direct;indirect;registr;acc_a;acc_b;ext_indirect;ext_indirect_dptr]] b. set_arg_8 ? (set_code_memory T U ps code_mem) b val = set_code_memory T U (set_arg_8 ? ps b val) code_mem. [2,3: cases b in prf; *; normalize //] #n #l #T #U #ps #code_mem #val * *; #x try (#y #H) try #H whd in H; try cases H whd in ⊢ (??(%)?) whd in ⊢ (???(???(%)?)) try % cases (split bool 4 4 ?) #nu' #nl' normalize nodelta cases (split bool 1 3 nu') #bit1' #ignore' normalize nodelta cases (get_index_v bool 4 nu' 0 ?) normalize nodelta try % @set_bit_addressable_sfr_set_code_memory qed. example set_arg_8_set_program_counter: ∀n:nat. ∀l:Vector addressing_mode_tag (S n). ∀T: Type[0]. ∀ps: PreStatus ?. ∀pc. ∀val. ∀b: l. ∀prf:is_in ? [[direct;indirect;registr;acc_a;acc_b;ext_indirect;ext_indirect_dptr]] b. set_arg_8 ? (set_program_counter T ps pc) b val = set_program_counter T (set_arg_8 ? ps b val) pc. [2,3: cases b in prf; *; normalize //] #n #l #T #ps #pc #val * *; #x try (#y #H) try #H whd in H; try cases H whd in ⊢ (??(%)?) whd in ⊢ (???(??(%)?)) try % cases (split bool 4 4 ?) #nu' #nl' normalize nodelta cases (split bool 1 3 nu') #bit1' #ignore' normalize nodelta cases (get_index_v bool 4 nu' 0 ?) normalize nodelta try % cases daemon (*@(set_bit_addressable_sfr_set_program_counter)*) qed. lemma get_arg_8_set_code_memory: ∀T1,T2,s,code_mem,b,arg. get_arg_8 T1 (set_code_memory T2 T1 s code_mem) b arg = get_arg_8 … s b arg. #T1 #T2 #s #code_mem #b #arg % qed. lemma set_code_memory_set_flags: ∀T1,T2,s,f1,f2,f3,code_mem. set_code_memory T1 T2 (set_flags T1 s f1 f2 f3) code_mem = set_flags … (set_code_memory … s code_mem) f1 f2 f3. #T1 #T2 #s #f1 #f2 #f3 #code_mem % qed. lemma set_program_counter_set_flags: ∀T1,s,f1,f2,f3,pc. set_program_counter T1 (set_flags T1 s f1 f2 f3) pc = set_flags … (set_program_counter … s pc) f1 f2 f3. #T1 #s #f1 #f2 #f3 #pc % qed. lemma program_counter_set_flags: ∀T1,s,f1,f2,f3. program_counter T1 (set_flags T1 s f1 f2 f3) = program_counter … s. #T1 #s #f1 #f2 #f3 % qed. lemma special_function_registers_8051_write_at_stack_pointer: ∀T,s,x. special_function_registers_8051 T (write_at_stack_pointer T s x) = special_function_registers_8051 T s. #T #s #x whd in ⊢ (??(??%)?) cases (split ????) #nu #nl normalize nodelta; cases (get_index_v bool ????) % qed. lemma get_8051_sfr_write_at_stack_pointer: ∀T,s,x,y. get_8051_sfr T (write_at_stack_pointer T s x) y = get_8051_sfr T s y. #T #s #x #y whd in ⊢ (??%%) // qed. lemma code_memory_write_at_stack_pointer: ∀T,s,x. code_memory T (write_at_stack_pointer T s x) = code_memory T s. #T #s #x whd in ⊢ (??(??%)?) cases (split ????) #nu #nl normalize nodelta; cases (get_index_v bool ????) % qed. lemma set_program_counter_set_low_internal_ram: ∀T,s,x,y. set_program_counter T (set_low_internal_ram … s x) y = set_low_internal_ram … (set_program_counter … s y) x. // qed. lemma set_clock_set_low_internal_ram: ∀T,s,x,y. set_clock T (set_low_internal_ram … s x) y = set_low_internal_ram … (set_clock … s y) x. // qed. lemma set_program_counter_set_high_internal_ram: ∀T,s,x,y. set_program_counter T (set_high_internal_ram … s x) y = set_high_internal_ram … (set_program_counter … s y) x. // qed. lemma set_clock_set_high_internal_ram: ∀T,s,x,y. set_clock T (set_high_internal_ram … s x) y = set_high_internal_ram … (set_clock … s y) x. // qed. lemma set_low_internal_ram_set_high_internal_ram: ∀T,s,x,y. set_low_internal_ram T (set_high_internal_ram … s x) y = set_high_internal_ram … (set_low_internal_ram … s y) x. // qed. lemma external_ram_write_at_stack_pointer: ∀T,s,x. external_ram T (write_at_stack_pointer T s x) = external_ram T s. #T #s #x whd in ⊢ (??(??%)?) cases (split ????) #nu #nl normalize nodelta; cases (get_index_v bool ????) % qed. lemma special_function_registers_8052_write_at_stack_pointer: ∀T,s,x. special_function_registers_8052 T (write_at_stack_pointer T s x) = special_function_registers_8052 T s. #T #s #x whd in ⊢ (??(??%)?) cases (split ????) #nu #nl normalize nodelta; cases (get_index_v bool ????) % qed. lemma p1_latch_write_at_stack_pointer: ∀T,s,x. p1_latch T (write_at_stack_pointer T s x) = p1_latch T s. #T #s #x whd in ⊢ (??(??%)?) cases (split ????) #nu #nl normalize nodelta; cases (get_index_v bool ????) % qed. lemma p3_latch_write_at_stack_pointer: ∀T,s,x. p3_latch T (write_at_stack_pointer T s x) = p3_latch T s. #T #s #x whd in ⊢ (??(??%)?) cases (split ????) #nu #nl normalize nodelta; cases (get_index_v bool ????) % qed. lemma clock_write_at_stack_pointer: ∀T,s,x. clock T (write_at_stack_pointer T s x) = clock T s. #T #s #x whd in ⊢ (??(??%)?) cases (split ????) #nu #nl normalize nodelta; cases (get_index_v bool ????) % qed. axiom get_index_v_set_index: ∀T,n,x,m,p,y. get_index_v T n (set_index T n x m y p) m p = y. lemma get_8051_sfr_set_8051_sfr: ∀T,s,x,y. get_8051_sfr T (set_8051_sfr ? s x y) x = y. #T *; #A #B #C #D #E #F #G #H #I #J *; #y whd in ⊢ (??(??%?)?) whd in match get_8051_sfr; normalize nodelta @get_index_v_set_index qed. lemma program_counter_set_8051_sfr: ∀T,s,x,y. program_counter T (set_8051_sfr ? s x y) = program_counter ? s. // qed. axiom get_arg_8_set_low_internal_ram: ∀M,s,x,b,z. get_arg_8 M (set_low_internal_ram ? s x) b z = get_arg_8 ? s b z. lemma split_eq_status: ∀T. ∀A1,A2,A3,A4,A5,A6,A7,A8,A9,A10. ∀B1,B2,B3,B4,B5,B6,B7,B8,B9,B10. A1=B1 → A2=B2 → A3=B3 → A4=B4 → A5=B5 → A6=B6 → A7=B7 → A8=B8 → A9=B9 → A10=B10 → mk_PreStatus T A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 = mk_PreStatus T B1 B2 B3 B4 B5 B6 B7 B8 B9 B10. // qed.