summaryrefslogtreecommitdiff
path: root/src/gen_lib/power_extras.lem
blob: 8515a406b94e058f4423016951046f0df4c44587 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
open import Pervasives
open import Vector
open import State
open import Sail_values

(*
let rec countLeadingZeros_helper bits =  
((match bits with
    | (Interp.V_lit (L_aux( L_zero, _)))::bits -> 
      let (Interp.V_lit (L_aux( (L_num n), loc))) = (countLeadingZeros_helper bits) in
      Interp.V_lit (L_aux( (L_num (Nat_big_num.add n(Nat_big_num.of_int 1))), loc))
    | _ -> Interp.V_lit (L_aux( (L_num(Nat_big_num.of_int 0)), Interp_ast.Unknown))
))
let rec countLeadingZeros (Interp.V_tuple v) = ((match v with
  | [Interp.V_track( v, r);Interp.V_track( v2, r2)] -> 
    Interp.taint (countLeadingZeros (Interp.V_tuple [v;v2])) ( Pset.(union) r r2)
  | [Interp.V_track( v, r);v2] -> Interp.taint (countLeadingZeros (Interp.V_tuple [v;v2])) r
  | [v;Interp.V_track( v2, r2)] -> Interp.taint (countLeadingZeros (Interp.V_tuple [v;v2])) r2
  | [Interp.V_unknown;_] -> Interp.V_unknown
  | [_;Interp.V_unknown] -> Interp.V_unknown
  | [Interp.V_vector( _, _, bits);Interp.V_lit (L_aux( (L_num n), _))] -> 
    countLeadingZeros_helper (snd (Lem_list.split_at (abs (Nat_big_num.to_int n)) bits))
))
 *)

let MEMr (addr,l) = read_memory (unsigned addr) l
let MEMr_reserve (addr,l) = read_memory (unsigned addr) l

let MEMw (addr,l,value) = write_memory (unsigned addr) l value
let MEMw_conditional (addr,l,value) = write_memory (unsigned addr) l value >> return true

let I_Sync () = return ()
let H_Sync () = return ()
let LW_Sync () = return ()
let EIEIO_Sync () = return ()

let recalculate_dependency () = return ()

let trap () = ()
(* this needs to change, but for that we'd have to make the type checker know about trap 
 * as an effect *)

val countLeadingZeroes : vector bit * integer -> integer
let countLeadingZeroes (V bits _ _ ,n)  = 
  let (_,bits) = List.splitAt (natFromInteger n) bits in
  integerFromNat (List.length (takeWhile ((=) O) bits))