diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/c/reg_32_64.expect | 2 | ||||
| -rw-r--r-- | test/c/reg_32_64.sail | 39 | ||||
| -rw-r--r-- | test/typecheck/pass/reg_32_64.sail | 39 | ||||
| -rw-r--r-- | test/typecheck/pass/reg_32_64/v1.expect | 11 | ||||
| -rw-r--r-- | test/typecheck/pass/reg_32_64/v1.sail | 39 | ||||
| -rw-r--r-- | test/typecheck/pass/reg_32_64/v2.expect | 13 | ||||
| -rw-r--r-- | test/typecheck/pass/reg_32_64/v2.sail | 39 | ||||
| -rw-r--r-- | test/typecheck/pass/reg_32_64/v3.expect | 10 | ||||
| -rw-r--r-- | test/typecheck/pass/reg_32_64/v3.sail | 39 |
9 files changed, 231 insertions, 0 deletions
diff --git a/test/c/reg_32_64.expect b/test/c/reg_32_64.expect new file mode 100644 index 00000000..c381486c --- /dev/null +++ b/test/c/reg_32_64.expect @@ -0,0 +1,2 @@ +R = 0xCAFECAFEFFFFFFFF +R = 0xFFFFFFFF diff --git a/test/c/reg_32_64.sail b/test/c/reg_32_64.sail new file mode 100644 index 00000000..79dfc862 --- /dev/null +++ b/test/c/reg_32_64.sail @@ -0,0 +1,39 @@ +default Order dec + +$include <prelude.sail> + +val "reg_deref" : forall ('a : Type). register('a) -> 'a effect {rreg} + +register R0 : bits(64) +register R1 : bits(64) +register R2 : bits(64) +register R3 : bits(64) + +let GPRs : vector(4, dec, register(bits(64))) = [ref R3, ref R2, ref R1, ref R0] + +type regno('r: Int) -> Bool = 0 <= 'r <= 3 + +val set_R : forall 'r 'd, regno('r) & 'd in {32, 64}. + (int('r), bits('d)) -> unit effect {wreg} + +function set_R(r, data) = { + let R = GPRs[r]; + (*R)['d - 1 .. 0] = data +} + +val get_R : forall 'r 'd, regno('r) & 'd in {32, 64}. + (implicit('d), int('r)) -> bits('d) effect {rreg} + +function get_R(datasize, r) = { + let R = GPRs[r]; + reg_deref(R)[datasize - 1 .. 0] +} + +overload R = {set_R, get_R} + +function main() -> unit = { + R(0) = 0xCAFE_CAFE_0000_0000; + R(0) = 0xFFFF_FFFF; + print_bits("R = ", R(0) : bits(64)); + print_bits("R = ", R(0) : bits(32)) +} diff --git a/test/typecheck/pass/reg_32_64.sail b/test/typecheck/pass/reg_32_64.sail new file mode 100644 index 00000000..79dfc862 --- /dev/null +++ b/test/typecheck/pass/reg_32_64.sail @@ -0,0 +1,39 @@ +default Order dec + +$include <prelude.sail> + +val "reg_deref" : forall ('a : Type). register('a) -> 'a effect {rreg} + +register R0 : bits(64) +register R1 : bits(64) +register R2 : bits(64) +register R3 : bits(64) + +let GPRs : vector(4, dec, register(bits(64))) = [ref R3, ref R2, ref R1, ref R0] + +type regno('r: Int) -> Bool = 0 <= 'r <= 3 + +val set_R : forall 'r 'd, regno('r) & 'd in {32, 64}. + (int('r), bits('d)) -> unit effect {wreg} + +function set_R(r, data) = { + let R = GPRs[r]; + (*R)['d - 1 .. 0] = data +} + +val get_R : forall 'r 'd, regno('r) & 'd in {32, 64}. + (implicit('d), int('r)) -> bits('d) effect {rreg} + +function get_R(datasize, r) = { + let R = GPRs[r]; + reg_deref(R)[datasize - 1 .. 0] +} + +overload R = {set_R, get_R} + +function main() -> unit = { + R(0) = 0xCAFE_CAFE_0000_0000; + R(0) = 0xFFFF_FFFF; + print_bits("R = ", R(0) : bits(64)); + print_bits("R = ", R(0) : bits(32)) +} diff --git a/test/typecheck/pass/reg_32_64/v1.expect b/test/typecheck/pass/reg_32_64/v1.expect new file mode 100644 index 00000000..eb398991 --- /dev/null +++ b/test/typecheck/pass/reg_32_64/v1.expect @@ -0,0 +1,11 @@ +Type error: +[[96mreg_32_64/v1.sail[0m]:35:9-28 +35[96m |[0m R(0) = 0xCAFE_CAFE_0000_00; + [91m |[0m [91m^-----------------^[0m + [91m |[0m No overloading for R, tried: + [91m |[0m [94m*[0m set_R + [91m |[0m Could not resolve quantifiers for set_R + [91m |[0m [94m*[0m (regno(0) & (56 == 32 | 56 == 64)) + [91m |[0m [94m*[0m get_R + [91m |[0m No valid casts resulted in unification + [91m |[0m diff --git a/test/typecheck/pass/reg_32_64/v1.sail b/test/typecheck/pass/reg_32_64/v1.sail new file mode 100644 index 00000000..8c0e980b --- /dev/null +++ b/test/typecheck/pass/reg_32_64/v1.sail @@ -0,0 +1,39 @@ +default Order dec + +$include <prelude.sail> + +val "reg_deref" : forall ('a : Type). register('a) -> 'a effect {rreg} + +register R0 : bits(64) +register R1 : bits(64) +register R2 : bits(64) +register R3 : bits(64) + +let GPRs : vector(4, dec, register(bits(64))) = [ref R3, ref R2, ref R1, ref R0] + +type regno('r: Int) -> Bool = 0 <= 'r <= 3 + +val set_R : forall 'r 'd, regno('r) & 'd in {32, 64}. + (int('r), bits('d)) -> unit effect {wreg} + +function set_R(r, data) = { + let R = GPRs[r]; + (*R)['d - 1 .. 0] = data +} + +val get_R : forall 'r 'd, regno('r) & 'd in {32, 64}. + (implicit('d), int('r)) -> bits('d) effect {rreg} + +function get_R(datasize, r) = { + let R = GPRs[r]; + reg_deref(R)[datasize - 1 .. 0] +} + +overload R = {set_R, get_R} + +function main() -> unit = { + R(0) = 0xCAFE_CAFE_0000_00; + R(0) = 0xFFFF_FFFF; + print_bits("R = ", R(0) : bits(64)); + print_bits("R = ", R(0) : bits(32)) +} diff --git a/test/typecheck/pass/reg_32_64/v2.expect b/test/typecheck/pass/reg_32_64/v2.expect new file mode 100644 index 00000000..f007c917 --- /dev/null +++ b/test/typecheck/pass/reg_32_64/v2.expect @@ -0,0 +1,13 @@ +Type error: +[[96mreg_32_64/v2.sail[0m]:21:18-22 +21[96m |[0m (*R)['d .. 0] = data + [91m |[0m [91m^--^[0m + [91m |[0m Tried performing type coercion from vector('d, dec, bit) to vector((('d - 0) + 1), dec, bit) on data + [91m |[0m Coercion failed because: + [91m |[0m Mismatched argument types in subtype check + [91m |[0m This error occured because of a previous error: + [91m |[0m [[96mreg_32_64/v2.sail[0m]:21:2-15 + [91m |[0m 21[96m |[0m (*R)['d .. 0] = data + [91m |[0m [91m |[0m [91m^-----------^[0m + [91m |[0m [91m |[0m Mismatched argument types in subtype check + [91m |[0m diff --git a/test/typecheck/pass/reg_32_64/v2.sail b/test/typecheck/pass/reg_32_64/v2.sail new file mode 100644 index 00000000..64daea4a --- /dev/null +++ b/test/typecheck/pass/reg_32_64/v2.sail @@ -0,0 +1,39 @@ +default Order dec + +$include <prelude.sail> + +val "reg_deref" : forall ('a : Type). register('a) -> 'a effect {rreg} + +register R0 : bits(64) +register R1 : bits(64) +register R2 : bits(64) +register R3 : bits(64) + +let GPRs : vector(4, dec, register(bits(64))) = [ref R3, ref R2, ref R1, ref R0] + +type regno('r: Int) -> Bool = 0 <= 'r <= 3 + +val set_R : forall 'r 'd, regno('r) & 'd in {32, 64}. + (int('r), bits('d)) -> unit effect {wreg} + +function set_R(r, data) = { + let R = GPRs[r]; + (*R)['d .. 0] = data +} + +val get_R : forall 'r 'd, regno('r) & 'd in {32, 64}. + (implicit('d), int('r)) -> bits('d) effect {rreg} + +function get_R(datasize, r) = { + let R = GPRs[r]; + reg_deref(R)[datasize - 1 .. 0] +} + +overload R = {set_R, get_R} + +function main() -> unit = { + R(0) = 0xCAFE_CAFE_0000_0000; + R(0) = 0xFFFF_FFFF; + print_bits("R = ", R(0) : bits(64)); + print_bits("R = ", R(0) : bits(32)) +} diff --git a/test/typecheck/pass/reg_32_64/v3.expect b/test/typecheck/pass/reg_32_64/v3.expect new file mode 100644 index 00000000..cea45127 --- /dev/null +++ b/test/typecheck/pass/reg_32_64/v3.expect @@ -0,0 +1,10 @@ +Type error: +[[96mreg_32_64/v3.sail[0m]:29:15-21 +29[96m |[0m reg_deref(R)['d - 1 .. 0] + [91m |[0m [91m^----^[0m + [91m |[0m No overloading for (operator -), tried: + [91m |[0m [94m*[0m sub_atom + [91m |[0m Cannot re-write sizeof('d) + [91m |[0m [94m*[0m sub_int + [91m |[0m Cannot re-write sizeof('d) + [91m |[0m diff --git a/test/typecheck/pass/reg_32_64/v3.sail b/test/typecheck/pass/reg_32_64/v3.sail new file mode 100644 index 00000000..dda787ab --- /dev/null +++ b/test/typecheck/pass/reg_32_64/v3.sail @@ -0,0 +1,39 @@ +default Order dec + +$include <prelude.sail> + +val "reg_deref" : forall ('a : Type). register('a) -> 'a effect {rreg} + +register R0 : bits(64) +register R1 : bits(64) +register R2 : bits(64) +register R3 : bits(64) + +let GPRs : vector(4, dec, register(bits(64))) = [ref R3, ref R2, ref R1, ref R0] + +type regno('r: Int) -> Bool = 0 <= 'r <= 3 + +val set_R : forall 'r 'd, regno('r) & 'd in {32, 64}. + (int('r), bits('d)) -> unit effect {wreg} + +function set_R(r, data) = { + let R = GPRs[r]; + (*R)['d - 1 .. 0] = data +} + +val get_R : forall 'r 'd, regno('r) & 'd in {32, 64}. + (implicit('d), int('r)) -> bits('d) effect {rreg} + +function get_R(_, r) = { + let R = GPRs[r]; + reg_deref(R)['d - 1 .. 0] +} + +overload R = {set_R, get_R} + +function main() -> unit = { + R(0) = 0xCAFE_CAFE_0000_0000; + R(0) = 0xFFFF_FFFF; + print_bits("R = ", R(0) : bits(64)); + print_bits("R = ", R(0) : bits(32)) +} |
