]> matita.cs.unibo.it Git - pkg-cerco/acc-trusted.git/blob - extracted/eRTLToLTL.ml
Imported Upstream version 0.1
[pkg-cerco/acc-trusted.git] / extracted / eRTLToLTL.ml
1 open Preamble
2
3 open Extra_bool
4
5 open Coqlib
6
7 open Values
8
9 open FrontEndVal
10
11 open GenMem
12
13 open FrontEndMem
14
15 open Globalenvs
16
17 open String
18
19 open Sets
20
21 open Listb
22
23 open LabelledObjects
24
25 open BitVectorTrie
26
27 open Graphs
28
29 open I8051
30
31 open Order
32
33 open Registers
34
35 open CostLabel
36
37 open Hide
38
39 open Proper
40
41 open PositiveMap
42
43 open Deqsets
44
45 open ErrorMessages
46
47 open PreIdentifiers
48
49 open Errors
50
51 open Extralib
52
53 open Lists
54
55 open Identifiers
56
57 open Integers
58
59 open AST
60
61 open Division
62
63 open Exp
64
65 open Arithmetic
66
67 open Setoids
68
69 open Monad
70
71 open Option
72
73 open Extranat
74
75 open Vector
76
77 open Div_and_mod
78
79 open Jmeq
80
81 open Russell
82
83 open List
84
85 open Util
86
87 open FoldStuff
88
89 open BitVector
90
91 open Types
92
93 open Bool
94
95 open Relations
96
97 open Nat
98
99 open Hints_declaration
100
101 open Core_notation
102
103 open Pts
104
105 open Logic
106
107 open Positive
108
109 open Z
110
111 open BitVectorZ
112
113 open Pointers
114
115 open ByteValues
116
117 open BackEndOps
118
119 open Joint
120
121 open Joint_LTL_LIN
122
123 open LTL
124
125 open Fixpoints
126
127 open Set_adt
128
129 open ERTL
130
131 open Liveness
132
133 open Interference
134
135 open Deqsets_extra
136
137 open State
138
139 open Bind_new
140
141 open BindLists
142
143 open Blocks
144
145 open TranslateUtils
146
147 (** val dpi1__o__Reg_to_dec__o__inject :
148     (I8051.register, 'a1) Types.dPair -> Interference.decision Types.sig0 **)
149 let dpi1__o__Reg_to_dec__o__inject x2 =
150   Interference.Decision_colour x2.Types.dpi1
151
152 (** val eject__o__Reg_to_dec__o__inject :
153     I8051.register Types.sig0 -> Interference.decision Types.sig0 **)
154 let eject__o__Reg_to_dec__o__inject x2 =
155   Interference.Decision_colour (Types.pi1 x2)
156
157 (** val reg_to_dec__o__inject :
158     I8051.register -> Interference.decision Types.sig0 **)
159 let reg_to_dec__o__inject x1 =
160   Interference.Decision_colour x1
161
162 (** val dpi1__o__Reg_to_dec :
163     (I8051.register, 'a1) Types.dPair -> Interference.decision **)
164 let dpi1__o__Reg_to_dec x1 =
165   Interference.Decision_colour x1.Types.dpi1
166
167 (** val eject__o__Reg_to_dec :
168     I8051.register Types.sig0 -> Interference.decision **)
169 let eject__o__Reg_to_dec x1 =
170   Interference.Decision_colour (Types.pi1 x1)
171
172 type arg_decision =
173 | Arg_decision_colour of I8051.register
174 | Arg_decision_spill of Nat.nat
175 | Arg_decision_imm of BitVector.byte
176
177 (** val arg_decision_rect_Type4 :
178     (I8051.register -> 'a1) -> (Nat.nat -> 'a1) -> (BitVector.byte -> 'a1) ->
179     arg_decision -> 'a1 **)
180 let rec arg_decision_rect_Type4 h_arg_decision_colour h_arg_decision_spill h_arg_decision_imm = function
181 | Arg_decision_colour x_19045 -> h_arg_decision_colour x_19045
182 | Arg_decision_spill x_19046 -> h_arg_decision_spill x_19046
183 | Arg_decision_imm x_19047 -> h_arg_decision_imm x_19047
184
185 (** val arg_decision_rect_Type5 :
186     (I8051.register -> 'a1) -> (Nat.nat -> 'a1) -> (BitVector.byte -> 'a1) ->
187     arg_decision -> 'a1 **)
188 let rec arg_decision_rect_Type5 h_arg_decision_colour h_arg_decision_spill h_arg_decision_imm = function
189 | Arg_decision_colour x_19052 -> h_arg_decision_colour x_19052
190 | Arg_decision_spill x_19053 -> h_arg_decision_spill x_19053
191 | Arg_decision_imm x_19054 -> h_arg_decision_imm x_19054
192
193 (** val arg_decision_rect_Type3 :
194     (I8051.register -> 'a1) -> (Nat.nat -> 'a1) -> (BitVector.byte -> 'a1) ->
195     arg_decision -> 'a1 **)
196 let rec arg_decision_rect_Type3 h_arg_decision_colour h_arg_decision_spill h_arg_decision_imm = function
197 | Arg_decision_colour x_19059 -> h_arg_decision_colour x_19059
198 | Arg_decision_spill x_19060 -> h_arg_decision_spill x_19060
199 | Arg_decision_imm x_19061 -> h_arg_decision_imm x_19061
200
201 (** val arg_decision_rect_Type2 :
202     (I8051.register -> 'a1) -> (Nat.nat -> 'a1) -> (BitVector.byte -> 'a1) ->
203     arg_decision -> 'a1 **)
204 let rec arg_decision_rect_Type2 h_arg_decision_colour h_arg_decision_spill h_arg_decision_imm = function
205 | Arg_decision_colour x_19066 -> h_arg_decision_colour x_19066
206 | Arg_decision_spill x_19067 -> h_arg_decision_spill x_19067
207 | Arg_decision_imm x_19068 -> h_arg_decision_imm x_19068
208
209 (** val arg_decision_rect_Type1 :
210     (I8051.register -> 'a1) -> (Nat.nat -> 'a1) -> (BitVector.byte -> 'a1) ->
211     arg_decision -> 'a1 **)
212 let rec arg_decision_rect_Type1 h_arg_decision_colour h_arg_decision_spill h_arg_decision_imm = function
213 | Arg_decision_colour x_19073 -> h_arg_decision_colour x_19073
214 | Arg_decision_spill x_19074 -> h_arg_decision_spill x_19074
215 | Arg_decision_imm x_19075 -> h_arg_decision_imm x_19075
216
217 (** val arg_decision_rect_Type0 :
218     (I8051.register -> 'a1) -> (Nat.nat -> 'a1) -> (BitVector.byte -> 'a1) ->
219     arg_decision -> 'a1 **)
220 let rec arg_decision_rect_Type0 h_arg_decision_colour h_arg_decision_spill h_arg_decision_imm = function
221 | Arg_decision_colour x_19080 -> h_arg_decision_colour x_19080
222 | Arg_decision_spill x_19081 -> h_arg_decision_spill x_19081
223 | Arg_decision_imm x_19082 -> h_arg_decision_imm x_19082
224
225 (** val arg_decision_inv_rect_Type4 :
226     arg_decision -> (I8051.register -> __ -> 'a1) -> (Nat.nat -> __ -> 'a1)
227     -> (BitVector.byte -> __ -> 'a1) -> 'a1 **)
228 let arg_decision_inv_rect_Type4 hterm h1 h2 h3 =
229   let hcut = arg_decision_rect_Type4 h1 h2 h3 hterm in hcut __
230
231 (** val arg_decision_inv_rect_Type3 :
232     arg_decision -> (I8051.register -> __ -> 'a1) -> (Nat.nat -> __ -> 'a1)
233     -> (BitVector.byte -> __ -> 'a1) -> 'a1 **)
234 let arg_decision_inv_rect_Type3 hterm h1 h2 h3 =
235   let hcut = arg_decision_rect_Type3 h1 h2 h3 hterm in hcut __
236
237 (** val arg_decision_inv_rect_Type2 :
238     arg_decision -> (I8051.register -> __ -> 'a1) -> (Nat.nat -> __ -> 'a1)
239     -> (BitVector.byte -> __ -> 'a1) -> 'a1 **)
240 let arg_decision_inv_rect_Type2 hterm h1 h2 h3 =
241   let hcut = arg_decision_rect_Type2 h1 h2 h3 hterm in hcut __
242
243 (** val arg_decision_inv_rect_Type1 :
244     arg_decision -> (I8051.register -> __ -> 'a1) -> (Nat.nat -> __ -> 'a1)
245     -> (BitVector.byte -> __ -> 'a1) -> 'a1 **)
246 let arg_decision_inv_rect_Type1 hterm h1 h2 h3 =
247   let hcut = arg_decision_rect_Type1 h1 h2 h3 hterm in hcut __
248
249 (** val arg_decision_inv_rect_Type0 :
250     arg_decision -> (I8051.register -> __ -> 'a1) -> (Nat.nat -> __ -> 'a1)
251     -> (BitVector.byte -> __ -> 'a1) -> 'a1 **)
252 let arg_decision_inv_rect_Type0 hterm h1 h2 h3 =
253   let hcut = arg_decision_rect_Type0 h1 h2 h3 hterm in hcut __
254
255 (** val arg_decision_discr : arg_decision -> arg_decision -> __ **)
256 let arg_decision_discr x y =
257   Logic.eq_rect_Type2 x
258     (match x with
259      | Arg_decision_colour a0 -> Obj.magic (fun _ dH -> dH __)
260      | Arg_decision_spill a0 -> Obj.magic (fun _ dH -> dH __)
261      | Arg_decision_imm a0 -> Obj.magic (fun _ dH -> dH __)) y
262
263 (** val arg_decision_jmdiscr : arg_decision -> arg_decision -> __ **)
264 let arg_decision_jmdiscr x y =
265   Logic.eq_rect_Type2 x
266     (match x with
267      | Arg_decision_colour a0 -> Obj.magic (fun _ dH -> dH __)
268      | Arg_decision_spill a0 -> Obj.magic (fun _ dH -> dH __)
269      | Arg_decision_imm a0 -> Obj.magic (fun _ dH -> dH __)) y
270
271 (** val dpi1__o__Reg_to_arg_dec__o__inject :
272     (I8051.register, 'a1) Types.dPair -> arg_decision Types.sig0 **)
273 let dpi1__o__Reg_to_arg_dec__o__inject x2 =
274   Arg_decision_colour x2.Types.dpi1
275
276 (** val eject__o__Reg_to_arg_dec__o__inject :
277     I8051.register Types.sig0 -> arg_decision Types.sig0 **)
278 let eject__o__Reg_to_arg_dec__o__inject x2 =
279   Arg_decision_colour (Types.pi1 x2)
280
281 (** val reg_to_arg_dec__o__inject :
282     I8051.register -> arg_decision Types.sig0 **)
283 let reg_to_arg_dec__o__inject x1 =
284   Arg_decision_colour x1
285
286 (** val dpi1__o__Reg_to_arg_dec :
287     (I8051.register, 'a1) Types.dPair -> arg_decision **)
288 let dpi1__o__Reg_to_arg_dec x1 =
289   Arg_decision_colour x1.Types.dpi1
290
291 (** val eject__o__Reg_to_arg_dec :
292     I8051.register Types.sig0 -> arg_decision **)
293 let eject__o__Reg_to_arg_dec x1 =
294   Arg_decision_colour (Types.pi1 x1)
295
296 (** val preserve_carry_bit :
297     AST.ident List.list -> Bool.bool -> Joint.joint_seq List.list ->
298     Joint.joint_seq List.list **)
299 let preserve_carry_bit globals do_it steps =
300   match do_it with
301   | Bool.True ->
302     List.Cons ((Joint.Extension_seq (Obj.magic Joint_LTL_LIN.SAVE_CARRY)),
303       (List.append steps (List.Cons ((Joint.Extension_seq
304         (Obj.magic Joint_LTL_LIN.RESTORE_CARRY)), List.Nil))))
305   | Bool.False -> steps
306
307 (** val a : Types.unit0 **)
308 let a =
309   Types.It
310
311 (** val dpi1__o__beval_of_byte__o__inject :
312     (BitVector.byte, 'a1) Types.dPair -> ByteValues.beval Types.sig0 **)
313 let dpi1__o__beval_of_byte__o__inject x2 =
314   ByteValues.BVByte x2.Types.dpi1
315
316 (** val eject__o__beval_of_byte__o__inject :
317     BitVector.byte Types.sig0 -> ByteValues.beval Types.sig0 **)
318 let eject__o__beval_of_byte__o__inject x2 =
319   ByteValues.BVByte (Types.pi1 x2)
320
321 (** val beval_of_byte__o__inject :
322     BitVector.byte -> ByteValues.beval Types.sig0 **)
323 let beval_of_byte__o__inject x1 =
324   ByteValues.BVByte x1
325
326 (** val dpi1__o__beval_of_byte :
327     (BitVector.byte, 'a1) Types.dPair -> ByteValues.beval **)
328 let dpi1__o__beval_of_byte x1 =
329   ByteValues.BVByte x1.Types.dpi1
330
331 (** val eject__o__beval_of_byte :
332     BitVector.byte Types.sig0 -> ByteValues.beval **)
333 let eject__o__beval_of_byte x1 =
334   ByteValues.BVByte (Types.pi1 x1)
335
336 (** val set_dp_by_offset :
337     AST.ident List.list -> Nat.nat -> Joint.joint_seq List.list **)
338 let set_dp_by_offset globals off =
339   List.Cons ((Joint.MOVE
340     (Obj.magic (Joint_LTL_LIN.Int_to_acc (a, (Joint.byte_of_nat off))))),
341     (List.Cons ((Joint.OP2 (BackEndOps.Add, (Obj.magic a), (Obj.magic a),
342     (Obj.magic (Joint.hdw_argument_from_reg I8051.registerSPL)))), (List.Cons
343     ((Joint.MOVE
344     (Obj.magic (Joint_LTL_LIN.From_acc (I8051.RegisterDPL, a)))), (List.Cons
345     ((Joint.MOVE
346     (Obj.magic (Joint_LTL_LIN.Int_to_acc (a, Joint.zero_byte)))), (List.Cons
347     ((Joint.OP2 (BackEndOps.Addc, (Obj.magic a), (Obj.magic a),
348     (Obj.magic (Joint.hdw_argument_from_reg I8051.registerSPH)))), (List.Cons
349     ((Joint.MOVE
350     (Obj.magic (Joint_LTL_LIN.From_acc (I8051.RegisterDPH, a)))),
351     List.Nil)))))))))))
352
353 (** val get_stack :
354     AST.ident List.list -> Nat.nat -> I8051.register -> Nat.nat ->
355     Joint.joint_seq List.list **)
356 let get_stack globals localss r off =
357   let off0 = Nat.plus localss off in
358   List.append (set_dp_by_offset globals off0)
359     (List.append (List.Cons ((Joint.LOAD ((Obj.magic a),
360       (Obj.magic Types.It), (Obj.magic Types.It))), List.Nil))
361       (match I8051.eq_Register r I8051.RegisterA with
362        | Bool.True -> List.Nil
363        | Bool.False ->
364          List.Cons ((Joint.MOVE (Obj.magic (Joint_LTL_LIN.From_acc (r, a)))),
365            List.Nil)))
366
367 (** val set_stack_not_a :
368     AST.ident List.list -> Nat.nat -> Nat.nat -> I8051.register ->
369     Joint.joint_seq List.list **)
370 let set_stack_not_a globals localss off r =
371   let off0 = Nat.plus localss off in
372   List.append (set_dp_by_offset globals off0) (List.Cons ((Joint.MOVE
373     (Obj.magic (Joint_LTL_LIN.To_acc (a, r)))), (List.Cons ((Joint.STORE
374     ((Obj.magic Types.It), (Obj.magic Types.It), (Obj.magic a))),
375     List.Nil))))
376
377 (** val set_stack_a :
378     AST.ident List.list -> Nat.nat -> Nat.nat -> Joint.joint_seq List.list **)
379 let set_stack_a globals localss off =
380   List.append (List.Cons ((Joint.MOVE
381     (Obj.magic (Joint_LTL_LIN.From_acc (I8051.registerST1, a)))), List.Nil))
382     (set_stack_not_a globals localss off I8051.registerST1)
383
384 (** val set_stack :
385     AST.ident List.list -> Nat.nat -> Nat.nat -> I8051.register ->
386     Joint.joint_seq List.list **)
387 let set_stack globals localss off r =
388   match I8051.eq_Register r I8051.RegisterA with
389   | Bool.True -> set_stack_a globals localss off
390   | Bool.False -> set_stack_not_a globals localss off r
391
392 (** val set_stack_int :
393     AST.ident List.list -> Nat.nat -> Nat.nat -> BitVector.byte ->
394     Joint.joint_seq List.list **)
395 let set_stack_int globals localss off int =
396   let off0 = Nat.plus localss off in
397   List.append (set_dp_by_offset globals off0) (List.Cons ((Joint.MOVE
398     (Obj.magic (Joint_LTL_LIN.Int_to_acc (a, int)))), (List.Cons
399     ((Joint.STORE ((Obj.magic Types.It), (Obj.magic Types.It),
400     (Obj.magic a))), List.Nil))))
401
402 (** val move :
403     AST.ident List.list -> Nat.nat -> Bool.bool -> Interference.decision ->
404     arg_decision -> Joint.joint_seq List.list **)
405 let move globals localss carry_lives_after dst src =
406   match dst with
407   | Interference.Decision_spill dsto ->
408     (match src with
409      | Arg_decision_colour srcr ->
410        preserve_carry_bit globals carry_lives_after
411          (set_stack globals localss dsto srcr)
412      | Arg_decision_spill srco ->
413        (match Nat.eqb srco dsto with
414         | Bool.True -> List.Nil
415         | Bool.False ->
416           preserve_carry_bit globals carry_lives_after
417             (List.append (get_stack globals localss I8051.RegisterA srco)
418               (set_stack globals localss dsto I8051.RegisterA)))
419      | Arg_decision_imm int ->
420        preserve_carry_bit globals carry_lives_after
421          (set_stack_int globals localss dsto int))
422   | Interference.Decision_colour dstr ->
423     (match src with
424      | Arg_decision_colour srcr ->
425        (match I8051.eq_Register dstr srcr with
426         | Bool.True -> List.Nil
427         | Bool.False ->
428           (match I8051.eq_Register dstr I8051.RegisterA with
429            | Bool.True ->
430              List.Cons ((Joint.MOVE
431                (Obj.magic (Joint_LTL_LIN.To_acc (a, srcr)))), List.Nil)
432            | Bool.False ->
433              (match I8051.eq_Register srcr I8051.RegisterA with
434               | Bool.True ->
435                 List.Cons ((Joint.MOVE
436                   (Obj.magic (Joint_LTL_LIN.From_acc (dstr, a)))), List.Nil)
437               | Bool.False ->
438                 List.Cons ((Joint.MOVE
439                   (Obj.magic (Joint_LTL_LIN.To_acc (a, srcr)))), (List.Cons
440                   ((Joint.MOVE
441                   (Obj.magic (Joint_LTL_LIN.From_acc (dstr, a)))),
442                   List.Nil))))))
443      | Arg_decision_spill srco ->
444        preserve_carry_bit globals carry_lives_after
445          (get_stack globals localss dstr srco)
446      | Arg_decision_imm int ->
447        List.append (List.Cons ((Joint.MOVE
448          (Obj.magic (Joint_LTL_LIN.Int_to_acc (a, int)))), List.Nil))
449          (match I8051.eq_Register dstr I8051.RegisterA with
450           | Bool.True -> List.Nil
451           | Bool.False ->
452             List.Cons ((Joint.MOVE
453               (Obj.magic (Joint_LTL_LIN.From_acc (dstr, a)))), List.Nil)))
454
455 (** val arg_is_spilled : arg_decision -> Bool.bool **)
456 let arg_is_spilled = function
457 | Arg_decision_colour x0 -> Bool.False
458 | Arg_decision_spill x0 -> Bool.True
459 | Arg_decision_imm x0 -> Bool.False
460
461 (** val is_spilled : Interference.decision -> Bool.bool **)
462 let is_spilled = function
463 | Interference.Decision_spill x0 -> Bool.True
464 | Interference.Decision_colour x0 -> Bool.False
465
466 (** val newframe :
467     AST.ident List.list -> Nat.nat -> Joint.joint_seq List.list **)
468 let newframe globals stack_sz =
469   List.Cons (Joint.CLEAR_CARRY, (List.Cons ((Joint.MOVE
470     (Obj.magic (Joint_LTL_LIN.To_acc (a, I8051.registerSPL)))), (List.Cons
471     ((Joint.OP2 (BackEndOps.Sub, (Obj.magic a), (Obj.magic a),
472     (Obj.magic (Joint.hdw_argument_from_byte (Joint.byte_of_nat stack_sz))))),
473     (List.Cons ((Joint.MOVE
474     (Obj.magic (Joint_LTL_LIN.From_acc (I8051.registerSPL, a)))), (List.Cons
475     ((Joint.MOVE (Obj.magic (Joint_LTL_LIN.To_acc (a, I8051.registerSPH)))),
476     (List.Cons ((Joint.OP2 (BackEndOps.Sub, (Obj.magic a), (Obj.magic a),
477     (Obj.magic (Joint.hdw_argument_from_byte Joint.zero_byte)))), (List.Cons
478     ((Joint.MOVE
479     (Obj.magic (Joint_LTL_LIN.From_acc (I8051.registerSPH, a)))),
480     List.Nil)))))))))))))
481
482 (** val delframe :
483     AST.ident List.list -> Nat.nat -> Joint.joint_seq List.list **)
484 let delframe globals stack_sz =
485   List.Cons ((Joint.MOVE
486     (Obj.magic (Joint_LTL_LIN.To_acc (a, I8051.registerSPL)))), (List.Cons
487     ((Joint.OP2 (BackEndOps.Add, (Obj.magic a), (Obj.magic a),
488     (Obj.magic (Joint.hdw_argument_from_byte (Joint.byte_of_nat stack_sz))))),
489     (List.Cons ((Joint.MOVE
490     (Obj.magic (Joint_LTL_LIN.From_acc (I8051.registerSPL, a)))), (List.Cons
491     ((Joint.MOVE (Obj.magic (Joint_LTL_LIN.To_acc (a, I8051.registerSPH)))),
492     (List.Cons ((Joint.OP2 (BackEndOps.Addc, (Obj.magic a), (Obj.magic a),
493     (Obj.magic (Joint.hdw_argument_from_byte Joint.zero_byte)))), (List.Cons
494     ((Joint.MOVE
495     (Obj.magic (Joint_LTL_LIN.From_acc (I8051.registerSPH, a)))),
496     List.Nil)))))))))))
497
498 (** val commutative : BackEndOps.op2 -> Bool.bool **)
499 let commutative = function
500 | BackEndOps.Add -> Bool.True
501 | BackEndOps.Addc -> Bool.True
502 | BackEndOps.Sub -> Bool.False
503 | BackEndOps.And -> Bool.True
504 | BackEndOps.Or -> Bool.True
505 | BackEndOps.Xor -> Bool.True
506
507 (** val uses_carry : BackEndOps.op2 -> Bool.bool **)
508 let uses_carry = function
509 | BackEndOps.Add -> Bool.False
510 | BackEndOps.Addc -> Bool.True
511 | BackEndOps.Sub -> Bool.True
512 | BackEndOps.And -> Bool.False
513 | BackEndOps.Or -> Bool.False
514 | BackEndOps.Xor -> Bool.False
515
516 (** val sets_carry : BackEndOps.op2 -> Bool.bool **)
517 let sets_carry = function
518 | BackEndOps.Add -> Bool.True
519 | BackEndOps.Addc -> Bool.True
520 | BackEndOps.Sub -> Bool.True
521 | BackEndOps.And -> Bool.False
522 | BackEndOps.Or -> Bool.False
523 | BackEndOps.Xor -> Bool.False
524
525 (** val translate_op2 :
526     AST.ident List.list -> Nat.nat -> Bool.bool -> BackEndOps.op2 ->
527     Interference.decision -> arg_decision -> arg_decision -> Joint.joint_seq
528     List.list **)
529 let translate_op2 globals localss carry_lives_after op dst arg1 arg2 =
530   List.append
531     (preserve_carry_bit globals
532       (Bool.andb (uses_carry op)
533         (Bool.orb (arg_is_spilled arg1) (arg_is_spilled arg2)))
534       (List.append
535         (move globals localss Bool.False (Interference.Decision_colour
536           I8051.RegisterB) arg2)
537         (move globals localss Bool.False (Interference.Decision_colour
538           I8051.RegisterA) arg1)))
539     (List.append (List.Cons ((Joint.OP2 (op, (Obj.magic a), (Obj.magic a),
540       (Obj.magic (Joint.hdw_argument_from_reg I8051.RegisterB)))), List.Nil))
541       (move globals localss (Bool.andb (sets_carry op) carry_lives_after) dst
542         (Arg_decision_colour I8051.RegisterA)))
543
544 (** val translate_op2_smart :
545     AST.ident List.list -> Nat.nat -> Bool.bool -> BackEndOps.op2 ->
546     Interference.decision -> arg_decision -> arg_decision -> Joint.joint_seq
547     List.list **)
548 let translate_op2_smart globals localss carry_lives_after op dst arg1 arg2 =
549   preserve_carry_bit globals
550     (Bool.andb (Bool.andb (Bool.notb (sets_carry op)) carry_lives_after)
551       (Bool.orb (Bool.orb (arg_is_spilled arg1) (arg_is_spilled arg2))
552         (is_spilled dst)))
553     (match arg2 with
554      | Arg_decision_colour arg2r ->
555        List.append
556          (move globals localss (uses_carry op) (Interference.Decision_colour
557            I8051.RegisterA) arg1)
558          (List.append (List.Cons ((Joint.OP2 (op, (Obj.magic a),
559            (Obj.magic a), (Obj.magic (Joint.hdw_argument_from_reg arg2r)))),
560            List.Nil))
561            (move globals localss
562              (Bool.andb (sets_carry op) carry_lives_after) dst
563              (Arg_decision_colour I8051.RegisterA)))
564      | Arg_decision_spill x ->
565        (match commutative op with
566         | Bool.True ->
567           (match arg1 with
568            | Arg_decision_colour arg1r ->
569              List.append
570                (move globals localss (uses_carry op)
571                  (Interference.Decision_colour I8051.RegisterA) arg2)
572                (List.append (List.Cons ((Joint.OP2 (op, (Obj.magic a),
573                  (Obj.magic a),
574                  (Obj.magic (Joint.hdw_argument_from_reg arg1r)))),
575                  List.Nil))
576                  (move globals localss
577                    (Bool.andb (sets_carry op) carry_lives_after) dst
578                    (Arg_decision_colour I8051.RegisterA)))
579            | Arg_decision_spill x0 ->
580              translate_op2 globals localss carry_lives_after op dst arg1 arg2
581            | Arg_decision_imm arg1i ->
582              List.append
583                (move globals localss (uses_carry op)
584                  (Interference.Decision_colour I8051.RegisterA) arg2)
585                (List.append (List.Cons ((Joint.OP2 (op, (Obj.magic a),
586                  (Obj.magic a),
587                  (Obj.magic (Joint.hdw_argument_from_byte arg1i)))),
588                  List.Nil))
589                  (move globals localss
590                    (Bool.andb (sets_carry op) carry_lives_after) dst
591                    (Arg_decision_colour I8051.RegisterA))))
592         | Bool.False ->
593           translate_op2 globals localss carry_lives_after op dst arg1 arg2)
594      | Arg_decision_imm arg2i ->
595        List.append
596          (move globals localss (uses_carry op) (Interference.Decision_colour
597            I8051.RegisterA) arg1)
598          (List.append (List.Cons ((Joint.OP2 (op, (Obj.magic a),
599            (Obj.magic a), (Obj.magic (Joint.hdw_argument_from_byte arg2i)))),
600            List.Nil))
601            (move globals localss
602              (Bool.andb (sets_carry op) carry_lives_after) dst
603              (Arg_decision_colour I8051.RegisterA))))
604
605 (** val dec_to_arg_dec : Interference.decision -> arg_decision **)
606 let dec_to_arg_dec = function
607 | Interference.Decision_spill n -> Arg_decision_spill n
608 | Interference.Decision_colour r -> Arg_decision_colour r
609
610 (** val reg_to_dec__o__dec_arg_dec__o__inject :
611     I8051.register -> arg_decision Types.sig0 **)
612 let reg_to_dec__o__dec_arg_dec__o__inject x0 =
613   dec_to_arg_dec (Interference.Decision_colour x0)
614
615 (** val dpi1__o__Reg_to_dec__o__dec_arg_dec__o__inject :
616     (I8051.register, 'a1) Types.dPair -> arg_decision Types.sig0 **)
617 let dpi1__o__Reg_to_dec__o__dec_arg_dec__o__inject x2 =
618   dec_to_arg_dec (dpi1__o__Reg_to_dec x2)
619
620 (** val eject__o__Reg_to_dec__o__dec_arg_dec__o__inject :
621     I8051.register Types.sig0 -> arg_decision Types.sig0 **)
622 let eject__o__Reg_to_dec__o__dec_arg_dec__o__inject x2 =
623   dec_to_arg_dec (eject__o__Reg_to_dec x2)
624
625 (** val dpi1__o__dec_arg_dec__o__inject :
626     (Interference.decision, 'a1) Types.dPair -> arg_decision Types.sig0 **)
627 let dpi1__o__dec_arg_dec__o__inject x2 =
628   dec_to_arg_dec x2.Types.dpi1
629
630 (** val eject__o__dec_arg_dec__o__inject :
631     Interference.decision Types.sig0 -> arg_decision Types.sig0 **)
632 let eject__o__dec_arg_dec__o__inject x2 =
633   dec_to_arg_dec (Types.pi1 x2)
634
635 (** val dec_arg_dec__o__inject :
636     Interference.decision -> arg_decision Types.sig0 **)
637 let dec_arg_dec__o__inject x1 =
638   dec_to_arg_dec x1
639
640 (** val reg_to_dec__o__dec_arg_dec : I8051.register -> arg_decision **)
641 let reg_to_dec__o__dec_arg_dec x0 =
642   dec_to_arg_dec (Interference.Decision_colour x0)
643
644 (** val dpi1__o__Reg_to_dec__o__dec_arg_dec :
645     (I8051.register, 'a1) Types.dPair -> arg_decision **)
646 let dpi1__o__Reg_to_dec__o__dec_arg_dec x1 =
647   dec_to_arg_dec (dpi1__o__Reg_to_dec x1)
648
649 (** val eject__o__Reg_to_dec__o__dec_arg_dec :
650     I8051.register Types.sig0 -> arg_decision **)
651 let eject__o__Reg_to_dec__o__dec_arg_dec x1 =
652   dec_to_arg_dec (eject__o__Reg_to_dec x1)
653
654 (** val dpi1__o__dec_arg_dec :
655     (Interference.decision, 'a1) Types.dPair -> arg_decision **)
656 let dpi1__o__dec_arg_dec x1 =
657   dec_to_arg_dec x1.Types.dpi1
658
659 (** val eject__o__dec_arg_dec :
660     Interference.decision Types.sig0 -> arg_decision **)
661 let eject__o__dec_arg_dec x1 =
662   dec_to_arg_dec (Types.pi1 x1)
663
664 (** val translate_op1 :
665     AST.ident List.list -> Nat.nat -> Bool.bool -> BackEndOps.op1 ->
666     Interference.decision -> Interference.decision -> Joint.joint_seq
667     List.list **)
668 let translate_op1 globals localss carry_lives_after op dst arg =
669   let preserve_carry =
670     Bool.andb carry_lives_after (Bool.orb (is_spilled dst) (is_spilled arg))
671   in
672   preserve_carry_bit globals preserve_carry
673     (List.append
674       (move globals localss Bool.False (Interference.Decision_colour
675         I8051.RegisterA) (dec_to_arg_dec arg)) (List.Cons ((Joint.OP1 (op,
676       (Obj.magic Types.It), (Obj.magic Types.It))),
677       (move globals localss Bool.False dst (Arg_decision_colour
678         I8051.RegisterA)))))
679
680 (** val translate_opaccs :
681     AST.ident List.list -> Nat.nat -> Bool.bool -> BackEndOps.opAccs ->
682     Interference.decision -> Interference.decision -> arg_decision ->
683     arg_decision -> Joint.joint_seq List.list **)
684 let translate_opaccs globals localss carry_lives_after op dst1 dst2 arg1 arg2 =
685   List.append
686     (move globals localss Bool.False (Interference.Decision_colour
687       I8051.RegisterB) arg2)
688     (List.append
689       (move globals localss Bool.False (Interference.Decision_colour
690         I8051.RegisterA) arg1) (List.Cons ((Joint.OPACCS (op,
691       (Obj.magic Types.It), (Obj.magic Types.It), (Obj.magic Types.It),
692       (Obj.magic Types.It))),
693       (List.append
694         (move globals localss Bool.False dst1 (Arg_decision_colour
695           I8051.RegisterA))
696         (List.append
697           (move globals localss Bool.False dst2 (Arg_decision_colour
698             I8051.RegisterB))
699           (match Bool.andb carry_lives_after
700                    (Bool.orb (is_spilled dst1) (is_spilled dst2)) with
701            | Bool.True -> List.Cons (Joint.CLEAR_CARRY, List.Nil)
702            | Bool.False -> List.Nil))))))
703
704 (** val move_to_dp :
705     AST.ident List.list -> Nat.nat -> arg_decision -> arg_decision ->
706     Joint.joint_seq List.list **)
707 let move_to_dp globals localss arg1 arg2 =
708   match Bool.notb (arg_is_spilled arg1) with
709   | Bool.True ->
710     List.append
711       (move globals localss Bool.False (Interference.Decision_colour
712         I8051.RegisterDPH) arg2)
713       (move globals localss Bool.False (Interference.Decision_colour
714         I8051.RegisterDPL) arg1)
715   | Bool.False ->
716     (match Bool.notb (arg_is_spilled arg2) with
717      | Bool.True ->
718        List.append
719          (move globals localss Bool.False (Interference.Decision_colour
720            I8051.RegisterDPL) arg1)
721          (move globals localss Bool.False (Interference.Decision_colour
722            I8051.RegisterDPH) arg2)
723      | Bool.False ->
724        List.append
725          (move globals localss Bool.False (Interference.Decision_colour
726            I8051.RegisterB) arg1)
727          (List.append
728            (move globals localss Bool.False (Interference.Decision_colour
729              I8051.RegisterDPH) arg2)
730            (move globals localss Bool.False (Interference.Decision_colour
731              I8051.RegisterDPL) (Arg_decision_colour I8051.RegisterB))))
732
733 (** val translate_store :
734     AST.ident List.list -> Nat.nat -> Bool.bool -> arg_decision ->
735     arg_decision -> arg_decision -> Joint.joint_seq List.list **)
736 let translate_store globals localss carry_lives_after addr1 addr2 src =
737   preserve_carry_bit globals
738     (Bool.andb carry_lives_after
739       (Bool.orb (Bool.orb (arg_is_spilled addr1) (arg_is_spilled addr1))
740         (arg_is_spilled src)))
741     (let move_to_dptr = move_to_dp globals localss addr1 addr2 in
742     List.append
743       (match arg_is_spilled src with
744        | Bool.True ->
745          List.append
746            (move globals localss Bool.False (Interference.Decision_colour
747              I8051.registerST0) src)
748            (List.append move_to_dptr (List.Cons ((Joint.MOVE
749              (Obj.magic (Joint_LTL_LIN.To_acc (a, I8051.registerST0)))),
750              List.Nil)))
751        | Bool.False ->
752          List.append move_to_dptr
753            (move globals localss Bool.False (Interference.Decision_colour
754              I8051.RegisterA) src)) (List.Cons ((Joint.STORE
755       ((Obj.magic Types.It), (Obj.magic Types.It), (Obj.magic a))),
756       List.Nil)))
757
758 (** val translate_load :
759     AST.ident List.list -> Nat.nat -> Bool.bool -> Interference.decision ->
760     arg_decision -> arg_decision -> Joint.joint_seq List.list **)
761 let translate_load globals localss carry_lives_after dst addr1 addr2 =
762   preserve_carry_bit globals
763     (Bool.andb carry_lives_after
764       (Bool.orb (Bool.orb (is_spilled dst) (arg_is_spilled addr1))
765         (arg_is_spilled addr1)))
766     (List.append (move_to_dp globals localss addr1 addr2)
767       (List.append (List.Cons ((Joint.LOAD ((Obj.magic a),
768         (Obj.magic Types.It), (Obj.magic Types.It))), List.Nil))
769         (move globals localss Bool.False dst (Arg_decision_colour
770           I8051.RegisterA))))
771
772 (** val translate_address :
773     __ List.list -> Nat.nat -> Bool.bool -> __ -> BitVector.word ->
774     Interference.decision -> Interference.decision -> Joint.joint_seq
775     List.list **)
776 let translate_address globals localss carry_lives_after id off addr1 addr2 =
777   preserve_carry_bit (Obj.magic globals)
778     (Bool.andb carry_lives_after
779       (Bool.orb (is_spilled addr1) (is_spilled addr2))) (List.Cons
780     ((Joint.ADDRESS ((Obj.magic id), off, (Obj.magic Types.It),
781     (Obj.magic Types.It))),
782     (List.append
783       (move (Obj.magic globals) localss Bool.False addr1 (Arg_decision_colour
784         I8051.RegisterDPL))
785       (move (Obj.magic globals) localss Bool.False addr2 (Arg_decision_colour
786         I8051.RegisterDPH)))))
787
788 (** val translate_step :
789     AST.ident List.list -> Joint.joint_internal_function -> Nat.nat ->
790     Fixpoints.valuation -> Interference.coloured_graph -> Nat.nat ->
791     Graphs.label -> Joint.joint_step -> Blocks.bind_step_block **)
792 let translate_step globals fn localss after grph stack_sz lbl s =
793   Bind_new.Bret
794     (let lookup = fun r -> grph.Interference.colouring (Types.Inl r) in
795     let lookup_arg = fun a0 ->
796       match a0 with
797       | Joint.Reg r -> dec_to_arg_dec (lookup r)
798       | Joint.Imm b -> Arg_decision_imm b
799     in
800     let carry_lives_after = Liveness.hlives I8051.RegisterCarry (after lbl)
801     in
802     let move0 = move globals localss carry_lives_after in
803     (match Liveness.eliminable_step globals (after lbl) s with
804      | Bool.True ->
805        let x =
806          Blocks.ensure_step_block (Joint.graph_params_to_params LTL.lTL)
807            globals List.Nil
808        in
809        x
810      | Bool.False ->
811        (match s with
812         | Joint.COST_LABEL cost_lbl ->
813           { Types.fst = { Types.fst = List.Nil; Types.snd = (fun x ->
814             Joint.COST_LABEL cost_lbl) }; Types.snd = List.Nil }
815         | Joint.CALL (f, n_args, x) ->
816           (match f with
817            | Types.Inl f0 ->
818              { Types.fst = { Types.fst = List.Nil; Types.snd = (fun x0 ->
819                Joint.CALL ((Types.Inl f0), n_args, (Obj.magic Types.It))) };
820                Types.snd = List.Nil }
821            | Types.Inr dp ->
822              let { Types.fst = dpl; Types.snd = dph } = dp in
823              { Types.fst = { Types.fst =
824              (List.append
825                (Blocks.add_dummy_variance
826                  (move_to_dp globals localss (Obj.magic lookup_arg dpl)
827                    (Obj.magic lookup_arg dph))) (List.Cons ((fun l ->
828                let x0 = Joint.Extension_seq
829                  (Obj.magic (Joint_LTL_LIN.LOW_ADDRESS (Obj.magic l)))
830                in
831                x0), (List.Cons ((fun x0 -> Joint.PUSH (Obj.magic Types.It)),
832                (List.Cons ((fun l -> Joint.Extension_seq
833                (Obj.magic (Joint_LTL_LIN.HIGH_ADDRESS (Obj.magic l)))),
834                (List.Cons ((fun x0 -> Joint.PUSH (Obj.magic Types.It)),
835                (List.Cons ((fun x0 -> Joint.MOVE
836                (Obj.magic (Joint_LTL_LIN.Int_to_acc (a, Joint.zero_byte)))),
837                List.Nil))))))))))); Types.snd = (fun x0 -> Joint.CALL
838              ((Types.Inr { Types.fst = (Obj.magic Types.It); Types.snd =
839              (Obj.magic Types.It) }), n_args, (Obj.magic Types.It))) };
840              Types.snd = List.Nil })
841         | Joint.COND (r, ltrue) ->
842           { Types.fst = { Types.fst =
843             (Blocks.add_dummy_variance
844               (move0 (Interference.Decision_colour I8051.RegisterA)
845                 (dec_to_arg_dec (Obj.magic lookup r)))); Types.snd =
846             (fun x -> Joint.COND ((Obj.magic Types.It), ltrue)) };
847             Types.snd = List.Nil }
848         | Joint.Step_seq s' ->
849           (match s' with
850            | Joint.COMMENT c ->
851              Blocks.ensure_step_block (Joint.graph_params_to_params LTL.lTL)
852                globals (List.Cons ((Joint.COMMENT c), List.Nil))
853            | Joint.MOVE pair_regs ->
854              let lookup_move_dst = fun x ->
855                match x with
856                | ERTL.PSD r -> lookup r
857                | ERTL.HDW r -> Interference.Decision_colour r
858              in
859              let dst = lookup_move_dst (Obj.magic pair_regs).Types.fst in
860              let src =
861                match (Obj.magic pair_regs).Types.snd with
862                | Joint.Reg r -> dec_to_arg_dec (lookup_move_dst r)
863                | Joint.Imm b -> Arg_decision_imm b
864              in
865              Blocks.ensure_step_block (Joint.graph_params_to_params LTL.lTL)
866                globals (move0 dst src)
867            | Joint.POP r ->
868              Blocks.ensure_step_block (Joint.graph_params_to_params LTL.lTL)
869                globals (List.Cons ((Joint.POP (Obj.magic a)),
870                (move0 (Obj.magic lookup r) (Arg_decision_colour
871                  I8051.RegisterA))))
872            | Joint.PUSH a0 ->
873              Blocks.ensure_step_block (Joint.graph_params_to_params LTL.lTL)
874                globals
875                (List.append
876                  (move0 (Interference.Decision_colour I8051.RegisterA)
877                    (Obj.magic lookup_arg a0)) (List.Cons ((Joint.PUSH
878                  (Obj.magic a)), List.Nil)))
879            | Joint.ADDRESS (lbl0, off, dpl, dph) ->
880              Blocks.ensure_step_block (Joint.graph_params_to_params LTL.lTL)
881                globals
882                (translate_address (Obj.magic globals) localss
883                  carry_lives_after (Obj.magic lbl0) off
884                  (Obj.magic lookup dpl) (Obj.magic lookup dph))
885            | Joint.OPACCS (op, dst1, dst2, arg1, arg2) ->
886              Blocks.ensure_step_block (Joint.graph_params_to_params LTL.lTL)
887                globals
888                (translate_opaccs globals localss carry_lives_after op
889                  (Obj.magic lookup dst1) (Obj.magic lookup dst2)
890                  (Obj.magic lookup_arg arg1) (Obj.magic lookup_arg arg2))
891            | Joint.OP1 (op, dst, arg) ->
892              Blocks.ensure_step_block (Joint.graph_params_to_params LTL.lTL)
893                globals
894                (translate_op1 globals localss carry_lives_after op
895                  (Obj.magic lookup dst) (Obj.magic lookup arg))
896            | Joint.OP2 (op, dst, arg1, arg2) ->
897              Blocks.ensure_step_block (Joint.graph_params_to_params LTL.lTL)
898                globals
899                (translate_op2_smart globals localss carry_lives_after op
900                  (Obj.magic lookup dst) (Obj.magic lookup_arg arg1)
901                  (Obj.magic lookup_arg arg2))
902            | Joint.CLEAR_CARRY ->
903              Blocks.ensure_step_block (Joint.graph_params_to_params LTL.lTL)
904                globals (List.Cons (Joint.CLEAR_CARRY, List.Nil))
905            | Joint.SET_CARRY ->
906              Blocks.ensure_step_block (Joint.graph_params_to_params LTL.lTL)
907                globals (List.Cons (Joint.SET_CARRY, List.Nil))
908            | Joint.LOAD (dstr, addr1, addr2) ->
909              Blocks.ensure_step_block (Joint.graph_params_to_params LTL.lTL)
910                globals
911                (translate_load globals localss carry_lives_after
912                  (Obj.magic lookup dstr) (Obj.magic lookup_arg addr1)
913                  (Obj.magic lookup_arg addr2))
914            | Joint.STORE (addr1, addr2, srcr) ->
915              Blocks.ensure_step_block (Joint.graph_params_to_params LTL.lTL)
916                globals
917                (translate_store globals localss carry_lives_after
918                  (Obj.magic lookup_arg addr1) (Obj.magic lookup_arg addr2)
919                  (Obj.magic lookup_arg srcr))
920            | Joint.Extension_seq ext ->
921              Blocks.ensure_step_block (Joint.graph_params_to_params LTL.lTL)
922                globals
923                (match Obj.magic ext with
924                 | ERTL.Ertl_new_frame -> newframe globals stack_sz
925                 | ERTL.Ertl_del_frame -> delframe globals stack_sz
926                 | ERTL.Ertl_frame_size r ->
927                   move0 (lookup r) (Arg_decision_imm
928                     (Joint.byte_of_nat stack_sz)))))))
929
930 (** val translate_fin_step :
931     AST.ident List.list -> Graphs.label -> Joint.joint_fin_step ->
932     Blocks.bind_fin_block **)
933 let translate_fin_step globals lbl s =
934   Bind_new.Bret { Types.fst = List.Nil; Types.snd =
935     (match s with
936      | Joint.GOTO l -> Joint.GOTO l
937      | Joint.RETURN -> Joint.RETURN
938      | Joint.TAILCALL (x, x0) -> assert false (* absurd case *)) }
939
940 (** val translate_data :
941     Fixpoints.fixpoint_computer -> Interference.coloured_graph_computer ->
942     AST.ident List.list -> Joint.joint_closed_internal_function ->
943     (Registers.register, TranslateUtils.b_graph_translate_data)
944     Bind_new.bind_new **)
945 let translate_data the_fixpoint build globals int_fun =
946   let after =
947     Liveness.analyse_liveness the_fixpoint globals (Types.pi1 int_fun)
948   in
949   let coloured_graph =
950     build globals (Types.pi1 int_fun)
951       (Fixpoints.fix_lfp Liveness.register_lattice
952         (Liveness.liveafter globals (Types.pi1 int_fun)) after)
953   in
954   let stack_sz =
955     Nat.plus coloured_graph.Interference.spilled_no
956       (Types.pi1 int_fun).Joint.joint_if_stacksize
957   in
958   Bind_new.Bret { TranslateUtils.init_ret = (Obj.magic Types.It);
959   TranslateUtils.init_params = (Obj.magic Types.It);
960   TranslateUtils.init_stack_size = stack_sz; TranslateUtils.added_prologue =
961   List.Nil; TranslateUtils.new_regs = List.Nil; TranslateUtils.f_step =
962   (translate_step globals (Types.pi1 int_fun)
963     (Types.pi1 int_fun).Joint.joint_if_local_stacksize
964     (Fixpoints.fix_lfp Liveness.register_lattice
965       (Liveness.liveafter globals (Types.pi1 int_fun)) after) coloured_graph
966     stack_sz); TranslateUtils.f_fin = (translate_fin_step globals) }
967
968 (** val ertl_to_ltl :
969     Fixpoints.fixpoint_computer -> Interference.coloured_graph_computer ->
970     ERTL.ertl_program -> ((LTL.ltl_program, Joint.stack_cost_model)
971     Types.prod, Nat.nat) Types.prod **)
972 let ertl_to_ltl the_fixpoint build pr =
973   let ltlprog =
974     TranslateUtils.b_graph_transform_program ERTL.eRTL LTL.lTL
975       (fun globals h -> translate_data the_fixpoint build globals h) pr
976   in
977   { Types.fst = { Types.fst = ltlprog; Types.snd =
978   (Joint.stack_cost (Joint.graph_params_to_params LTL.lTL) ltlprog) };
979   Types.snd =
980   (Nat.minus
981     (Exp.exp (Nat.S (Nat.S Nat.O)) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
982       (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
983       Nat.O)))))))))))))))))
984     (Joint.globals_stacksize (Joint.graph_params_to_params LTL.lTL) ltlprog)) }
985