summaryrefslogtreecommitdiff
path: root/test/smt/store_load.sat.sail
diff options
context:
space:
mode:
Diffstat (limited to 'test/smt/store_load.sat.sail')
-rw-r--r--test/smt/store_load.sat.sail55
1 files changed, 55 insertions, 0 deletions
diff --git a/test/smt/store_load.sat.sail b/test/smt/store_load.sat.sail
new file mode 100644
index 00000000..810bbfbb
--- /dev/null
+++ b/test/smt/store_load.sat.sail
@@ -0,0 +1,55 @@
+default Order dec
+
+$include <prelude.sail>
+$include <regfp.sail>
+
+register x0 : bits(32)
+register x1 : bits(32)
+register x2 : bits(32)
+register x3 : bits(32)
+
+function wX(r: bits(2), v: bits(32)) -> unit = {
+ match r {
+ 0b00 => x0 = v,
+ 0b01 => x1 = v,
+ 0b10 => x2 = v,
+ 0b11 => x3 = v
+ }
+}
+
+function rX(r: bits(2)) -> bits(32) = {
+ match r {
+ 0b00 => x0,
+ 0b01 => x1,
+ 0b10 => x2,
+ 0b11 => x3
+ }
+}
+
+overload X = {rX, wX}
+
+scattered union ast
+
+val execute : ast -> bool
+
+union clause ast = LOAD : (bits(2), bits(2))
+
+function clause execute(LOAD(rd, rs)) = {
+ X(rd) = __read_mem(Read_plain, 32, X(rs), 4);
+ true
+}
+
+union clause ast = STORE : (bits(2), bits(2))
+
+function clause execute(STORE(rd, rs)) = {
+ let addr = X(rd);
+ __write_mem(Write_plain, 32, addr, 4, X(rs))
+}
+
+/* Default memory model is as weak as possible, so this is not true */
+$counterexample
+function prop() -> bool = {
+ let _ = execute(STORE(0b01, 0b10));
+ let _ = execute(LOAD(0b00, 0b01));
+ X(0b00) == X(0b10)
+}