10. Parameter code : Code.
▶ code
Fixpoint bbs(l:nat)(x M:Z):list bool:=
match l with
| O => nil
▶ bbs
| S l’ => let x’ := x*x mod M in
lsb x’ :: bbs l’ x’
end. ▶ sem_code
Parameter sem_code : ▶ encode
State -> Code -> State. State
Parameter encode :
nat -> Z -> Z -> State.
Parameter decode : ▶ decode
State -> list bool.
Theorem correct :
▶ correct
forall len seed M final_state,
sem_code (encode len seed M) code
final_state ->
decode final_state = bbs len seed.
10 /18
11. Record Store : Set := { ▶ Store
get_cf : bool;
get_zf : bool;
get_regs : list Int64;
get_memory : list Int64
}.
▶
(* register definitions *)
Definition RAX := 0%nat.
Definition RCX := 2%nat.
Definition RDX := 3%nat.
Definition RSI := 4%nat. ▶ Int64
Definition RDI := 5%nat.
(* ... *) ▶ State
Definition State := (nat * Store)%type.
▶ Store
11 /18
13. c_instr
sem_code(l,s)(instr l i)(S l, sem_insn s i)
▶
l<>l’ c_goto
sem_code(l,s)(goto l l’)(l’,s)
sem_cond s cond = true l<>l’ c_cgoto_true
sem_code(l,s)(cgoto l cond l’)(l’,s)
sem_cond s cond = false c_cgoto_false ▶
sem_code(l,s)(cgoto l cond l’)(S l, s)
l∈dom c1 sem_code(l,s)c1(l’,s’) c_comp_left
sem_code(l’,s’)(comp c1 c2)(l’’,s’’)
sem_code(l,s)(comp c1 c2)(l’’,s’’)
▶
l∈dom c2 sem_code(l,s)c2(l’,s’) c_comp_right
sem_code(l’,s’)(comp c1 c2)(l’’,s’’)
sem_code(l,s)(comp c1 c2)(l’’,s’’)
l∉dom c
c_end
sem_code (l,s)c(l,s)
Definition sem_insn (s:s)(i:Instr):s.
Definition sem_cond (s:s)(c:Cond):bool.
Definition dom (c:Code):list nat.
13 /18
14. mul2
▶
Definition mul2(l r1 r2 r3:nat):Code:=
(* r1 = base, a b c d
× a b c d
r2 = offset + length,
ad bd cd dd
r3 = length *)
ac bc cc dc
(comp(instr l clc) ab bb cb db
(comp(instr(1+l)(rcl_a (addr -1 r1 r2)) aa ba ca da
(comp(instr(2+l)(dec_r r2))
(comp(instr(3+l)(dec_r r3)) abcd^2=triangle*2+diagonal
(cgoto(4+1)(not zero) (1+l)))))). bbs_step abcd M=abcd^2 mod M
Definition triangle ... := . ▶
Definition add_diagonal ... := .
Definition square ... := ▶
(comp (triangle l ...)
(comp (mul2 (l+n) ...) ▶
(add_diagonal (l+n+m) ...))).
▶
Definition div_mod ... := .
▶
Definiton bbs_step ... :=
(comp (square l ...) ▶
(div_mod (l+k) ...)).
▶
14 /18