summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAlasdair Armstrong2019-04-19 19:57:17 +0100
committerAlasdair Armstrong2019-04-20 18:18:16 +0100
commit7dc18d54da0804c9a99bd91eda2bc17b419d426e (patch)
tree31c1a736f7fd1b2352350ded1eaab1ae91fb20fc /test
parent403eabafb1289b173bd0048e798025b71ce5b4ea (diff)
SMT: Support writing to register references
Add a new AE_write_ref constructor in the ANF representation to make writes to register references explicit in Jib_compile
Diffstat (limited to 'test')
-rw-r--r--test/smt/write_ref.sat.sail28
-rw-r--r--test/smt/write_ref.unsat.sail28
2 files changed, 56 insertions, 0 deletions
diff --git a/test/smt/write_ref.sat.sail b/test/smt/write_ref.sat.sail
new file mode 100644
index 00000000..637f5808
--- /dev/null
+++ b/test/smt/write_ref.sat.sail
@@ -0,0 +1,28 @@
+default Order dec
+
+$include <prelude.sail>
+
+register R0 : bits(32)
+register R1 : bits(32)
+register R2 : bits(32)
+register R3 : bits(32)
+
+val "reg_deref" : forall ('a : Type). register('a) -> 'a effect {rreg}
+
+let GPRs = [ref R3, ref R2, ref R1, ref R0]
+
+function wGPR(n: range(0, 3), v: bits(32)) -> unit = {
+ (*GPRs[n]) = v
+}
+
+function rGPR(n: range(0, 3)) -> bits(32) = {
+ reg_deref(GPRs[n])
+}
+
+overload R = {wGPR, rGPR}
+
+$property
+function prop() -> bool = {
+ R(0) = 0x1234_5679;
+ R(0) == 0x1234_5678
+}
diff --git a/test/smt/write_ref.unsat.sail b/test/smt/write_ref.unsat.sail
new file mode 100644
index 00000000..4f786907
--- /dev/null
+++ b/test/smt/write_ref.unsat.sail
@@ -0,0 +1,28 @@
+default Order dec
+
+$include <prelude.sail>
+
+register R0 : bits(32)
+register R1 : bits(32)
+register R2 : bits(32)
+register R3 : bits(32)
+
+val "reg_deref" : forall ('a : Type). register('a) -> 'a effect {rreg}
+
+let GPRs = [ref R3, ref R2, ref R1, ref R0]
+
+function wGPR(n: range(0, 3), v: bits(32)) -> unit = {
+ (*GPRs[n]) = v
+}
+
+function rGPR(n: range(0, 3)) -> bits(32) = {
+ reg_deref(GPRs[n])
+}
+
+overload R = {wGPR, rGPR}
+
+$property
+function prop() -> bool = {
+ R(0) = 0x1234_5678;
+ R(0) == 0x1234_5678
+}