summaryrefslogtreecommitdiff
path: root/aarch64_small/prelude.sail
diff options
context:
space:
mode:
Diffstat (limited to 'aarch64_small/prelude.sail')
-rw-r--r--aarch64_small/prelude.sail31
1 files changed, 29 insertions, 2 deletions
diff --git a/aarch64_small/prelude.sail b/aarch64_small/prelude.sail
index e16e0a98..2516f32c 100644
--- a/aarch64_small/prelude.sail
+++ b/aarch64_small/prelude.sail
@@ -22,13 +22,20 @@ infix 7 >>
infix 7 <<
infix 7 ^^
-val operator >> = "shift_bits_right" : forall 'n 'm. (bits('n), bits('m)) -> bits('n)
-val operator << = "shift_bits_left" : forall 'n 'm. (bits('n), bits('m)) -> bits('n)
+val shift_bits_left = "shift_bits_left" : forall 'n 'm. (bits('n), bits('m)) -> bits('n)
+val shift_bits_right = "shift_bits_right" : forall 'n 'm. (bits('n), bits('m)) -> bits('n)
+val shift_left = "shiftl" : forall 'm. (bits('m), int) -> bits('m)
+val shift_right = "shiftr" : forall 'm. (bits('m), int) -> bits('m)
+
+overload operator << = {shift_bits_left, shift_left}
+overload operator >> = {shift_bits_right, shift_right}
+
val replicate_bits = "replicate_bits" : forall 'n 'm. (bits('n), atom('m)) -> bits('n * 'm)
val operator ^^ = "replicate_bits" : forall 'n 'm. (bits('n), atom('m)) -> bits('n * 'm)
+
infix 4 <_s
infix 4 >=_s
infix 4 <_u
@@ -74,6 +81,10 @@ val and_bits = {c:"and_bits", _: "and_vec"} : forall 'n. (bits('n), bits('n)) ->
overload operator & = {and_bool, and_bits}
+val or_bits = {c:"or_bits", _: "or_vec"} : forall 'n. (bits('n), bits('n)) -> bits('n)
+
+overload operator | = {or_bool, or_bits}
+
val not_vec = {c:"not_bits", _:"not_vec"} : forall 'n. bits('n) -> bits('n)
@@ -115,3 +126,19 @@ val xor_vec = {c: "xor_bits", _: "xor_vec"} : forall 'n. (bits('n), bits('n)) ->
val int_power = {ocaml: "int_power", lem: "pow", coq: "pow", c: "pow_int"} : (int, int) -> int
overload operator ^ = {xor_vec, int_power, concat_str}
+
+
+val mask : forall 'l 'm, 'l >= 0 & 'm >= 0. (implicit('l), bits('m)) -> bits('l)
+
+
+/* put this val spec into Sail lib for "%" */
+
+val mod = {
+ smt: "mod",
+ ocaml: "modulus",
+ lem: "integerMod",
+ c: "tmod_int",
+ coq: "Z.rem"
+} : forall 'M 'N. (atom('M), atom('N)) -> {'O, 0 <= 'O & 'O < N . atom('O)}
+
+/* overload operator % = {mod_int} */ \ No newline at end of file