diff options
| author | Alasdair Armstrong | 2019-04-19 19:57:17 +0100 |
|---|---|---|
| committer | Alasdair Armstrong | 2019-04-20 18:18:16 +0100 |
| commit | 7dc18d54da0804c9a99bd91eda2bc17b419d426e (patch) | |
| tree | 31c1a736f7fd1b2352350ded1eaab1ae91fb20fc /test | |
| parent | 403eabafb1289b173bd0048e798025b71ce5b4ea (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.sail | 28 | ||||
| -rw-r--r-- | test/smt/write_ref.unsat.sail | 28 |
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 +} |
