summaryrefslogtreecommitdiff
path: root/test/ocaml/lsl/lsl.sail
blob: ce270c4ecb4af7840df446adaca19ed175324870 (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
val lslc : forall ('n : Int) ('shift : Int), 'n >= 1.
  (bits('n), atom('shift)) -> (bits('n), bit) effect {escape}

function lslc (vec, shift) = {
  assert(constraint('shift >= 1), "shift must be positive");
  extended : bits('shift + 'n) = vec @ sail_zeros(shift);
  result : bits('n) = extended[sizeof('n - 1) .. 0];
  c : bit = extended['n];
  return((result, c))
}

val lsl : forall ('n : Int) ('shift : Int), 'n >= 1.
  (bits('n), atom('shift)) -> bits('n) effect {escape}

function lsl (vec, shift) = if shift == 0 then vec else let (result, _) = lslc(vec, shift) in result

val main : unit -> unit effect {escape}

function main () = {
  print(if lsl(0b0110, 1) == 0b1100 then "pass" else "fail");
  print(if lsl(0b1111, 2) == 0b1100 then "pass" else "fail");
  print(if lsl(0x0F, 4) == 0xF0 then "pass" else "fail");
  let (result, c) = lslc(0xF000, 2) in print(if (result == 0xC000) & (c == bitone) then "pass" else "fail")
}