]> matita.cs.unibo.it Git - pkg-cerco/acc-trusted.git/blob - extracted/policyStep.ml
ddc45e972de4e13ec6323beab9ecbb3733a61e8d
[pkg-cerco/acc-trusted.git] / extracted / policyStep.ml
1 open Preamble
2
3 open Assembly
4
5 open Status
6
7 open Fetch
8
9 open BitVectorTrie
10
11 open String
12
13 open Exp
14
15 open Arithmetic
16
17 open Vector
18
19 open FoldStuff
20
21 open BitVector
22
23 open Extranat
24
25 open Integers
26
27 open AST
28
29 open LabelledObjects
30
31 open Proper
32
33 open PositiveMap
34
35 open Deqsets
36
37 open ErrorMessages
38
39 open PreIdentifiers
40
41 open Errors
42
43 open Extralib
44
45 open Setoids
46
47 open Monad
48
49 open Option
50
51 open Div_and_mod
52
53 open Jmeq
54
55 open Russell
56
57 open Util
58
59 open List
60
61 open Lists
62
63 open Bool
64
65 open Relations
66
67 open Nat
68
69 open Positive
70
71 open Hints_declaration
72
73 open Core_notation
74
75 open Pts
76
77 open Logic
78
79 open Types
80
81 open Identifiers
82
83 open CostLabel
84
85 open ASM
86
87 open PolicyFront
88
89 (** val jump_expansion_step :
90     ASM.labelled_instruction List.list Types.sig0 -> Fetch.label_map
91     Types.sig0 -> PolicyFront.ppc_pc_map Types.sig0 -> (Bool.bool,
92     PolicyFront.ppc_pc_map Types.option) Types.prod Types.sig0 **)
93 let jump_expansion_step program labels old_sigma =
94   (let { Types.fst = final_added; Types.snd = final_policy } =
95      Types.pi1
96        (FoldStuff.foldl_strong (Types.pi1 program) (fun prefix x tl _ acc ->
97          (let { Types.fst = inc_added; Types.snd = inc_pc_sigma } =
98             Types.pi1 acc
99           in
100          (fun _ ->
101          (let { Types.fst = label; Types.snd = instr } = x in
102          (fun _ ->
103          let add_instr =
104            match instr with
105            | ASM.Instruction i ->
106              PolicyFront.jump_expansion_step_instruction (Types.pi1 labels)
107                (Types.pi1 old_sigma) inc_pc_sigma (List.length prefix) i
108            | ASM.Comment x0 -> Types.None
109            | ASM.Cost x0 -> Types.None
110            | ASM.Jmp j ->
111              Types.Some
112                (PolicyFront.select_jump_length (Types.pi1 labels)
113                  (Types.pi1 old_sigma) inc_pc_sigma (List.length prefix) j)
114            | ASM.Jnz (x0, x1, x2) -> Types.None
115            | ASM.Call c ->
116              Types.Some
117                (PolicyFront.select_call_length (Types.pi1 labels)
118                  (Types.pi1 old_sigma) inc_pc_sigma (List.length prefix) c)
119            | ASM.Mov (x0, x1, x2) -> Types.None
120          in
121          let { Types.fst = inc_pc; Types.snd = inc_sigma } = inc_pc_sigma in
122          let old_length =
123            (BitVectorTrie.lookup (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
124              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
125              (Nat.S Nat.O))))))))))))))))
126              (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
127                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
128                (Nat.S (Nat.S Nat.O)))))))))))))))) (List.length prefix))
129              (Types.pi1 old_sigma).Types.snd { Types.fst = Nat.O; Types.snd =
130              Assembly.Short_jump }).Types.snd
131          in
132          let old_size = PolicyFront.instruction_size_jmplen old_length instr
133          in
134          let { Types.fst = new_length; Types.snd = isize } =
135            match add_instr with
136            | Types.None ->
137              { Types.fst = Assembly.Short_jump; Types.snd =
138                (PolicyFront.instruction_size_jmplen Assembly.Short_jump
139                  instr) }
140            | Types.Some pl ->
141              { Types.fst = (PolicyFront.max_length old_length pl);
142                Types.snd =
143                (PolicyFront.instruction_size_jmplen
144                  (PolicyFront.max_length old_length pl) instr) }
145          in
146          let new_added =
147            match add_instr with
148            | Types.None -> inc_added
149            | Types.Some x0 -> Nat.plus inc_added (Nat.minus isize old_size)
150          in
151          let old_Slength =
152            (BitVectorTrie.lookup (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
153              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
154              (Nat.S Nat.O))))))))))))))))
155              (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
156                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
157                (Nat.S (Nat.S Nat.O)))))))))))))))) (Nat.S
158                (List.length prefix))) (Types.pi1 old_sigma).Types.snd
159              { Types.fst = Nat.O; Types.snd = Assembly.Short_jump }).Types.snd
160          in
161          let updated_sigma =
162            BitVectorTrie.insert (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
163              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
164              (Nat.S Nat.O))))))))))))))))
165              (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
166                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
167                (Nat.S (Nat.S Nat.O)))))))))))))))) (Nat.S
168                (List.length prefix))) { Types.fst = (Nat.plus inc_pc isize);
169              Types.snd = old_Slength }
170              (BitVectorTrie.insert (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
171                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
172                (Nat.S Nat.O))))))))))))))))
173                (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
174                  (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
175                  (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))))))))))
176                  (List.length prefix)) { Types.fst = inc_pc; Types.snd =
177                new_length } inc_sigma)
178          in
179          { Types.fst = new_added; Types.snd = { Types.fst =
180          (Nat.plus inc_pc isize); Types.snd = updated_sigma } })) __)) __)
181          { Types.fst = Nat.O; Types.snd = { Types.fst = Nat.O; Types.snd =
182          (BitVectorTrie.insert (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
183            (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
184            (Nat.S Nat.O))))))))))))))))
185            (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
186              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
187              (Nat.S (Nat.S Nat.O)))))))))))))))) Nat.O) { Types.fst = Nat.O;
188            Types.snd =
189            (BitVectorTrie.lookup (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
190              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
191              (Nat.S Nat.O))))))))))))))))
192              (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
193                (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
194                (Nat.S (Nat.S Nat.O)))))))))))))))) Nat.O)
195              (Types.pi1 old_sigma).Types.snd { Types.fst = Nat.O; Types.snd =
196              Assembly.Short_jump }).Types.snd } (BitVectorTrie.Stub (Nat.S
197            (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
198            (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))))))))))) } })
199    in
200   (fun _ ->
201   (match Util.gtb final_policy.Types.fst
202            (Exp.exp (Nat.S (Nat.S Nat.O)) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
203              (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
204              (Nat.S (Nat.S Nat.O))))))))))))))))) with
205    | Bool.True ->
206      (fun _ -> { Types.fst = (Nat.eqb final_added Nat.O); Types.snd =
207        Types.None })
208    | Bool.False ->
209      (fun _ -> { Types.fst = (Nat.eqb final_added Nat.O); Types.snd =
210        (Types.Some final_policy) })) __)) __
211