diff options
Diffstat (limited to 'test/smt/store_load.sat.sail')
| -rw-r--r-- | test/smt/store_load.sat.sail | 55 |
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) +} |
