From b603e4d7e7008db4f520cdd29badf46147a3f78b Mon Sep 17 00:00:00 2001 From: Thomas Bauereiss Date: Wed, 18 Mar 2020 12:39:20 +0000 Subject: Expose details of failed lexp bounds checks Allows ASL-to-Sail translation to automatically patch lexp bounds check errors. --- test/typecheck/pass/lexp_vec.sail | 10 ++++++++-- test/typecheck/pass/lexp_vec/v1.expect | 11 +++++++++++ test/typecheck/pass/lexp_vec/v1.sail | 17 +++++++++++++++++ test/typecheck/pass/lexp_vec/v2.expect | 7 +++++++ test/typecheck/pass/lexp_vec/v2.sail | 17 +++++++++++++++++ 5 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 test/typecheck/pass/lexp_vec/v1.expect create mode 100644 test/typecheck/pass/lexp_vec/v1.sail create mode 100644 test/typecheck/pass/lexp_vec/v2.expect create mode 100644 test/typecheck/pass/lexp_vec/v2.sail (limited to 'test') diff --git a/test/typecheck/pass/lexp_vec.sail b/test/typecheck/pass/lexp_vec.sail index b20da027..99ae0dca 100644 --- a/test/typecheck/pass/lexp_vec.sail +++ b/test/typecheck/pass/lexp_vec.sail @@ -2,10 +2,16 @@ default Order dec $include -register V : vector(1, dec, bitvector(32, dec)) +register V : vector(16, dec, bitvector(32, dec)) val zeros : forall 'n, 'n >= 0. unit -> bitvector('n, dec) +val write_V : forall 'i, 0 <= 'i < 16. (int('i), bitvector(32, dec)) -> unit effect {wreg} + +function write_V(i, v) = { + V[i] = v +} + function main() : unit -> unit = { - V[0] = zeros() + write_V(0, zeros()) } diff --git a/test/typecheck/pass/lexp_vec/v1.expect b/test/typecheck/pass/lexp_vec/v1.expect new file mode 100644 index 00000000..953aa7d1 --- /dev/null +++ b/test/typecheck/pass/lexp_vec/v1.expect @@ -0,0 +1,11 @@ +Type error: +[lexp_vec/v1.sail]:12:2-6 +12 | V[i] = v +  | ^--^ +  | Bounds check failed for l-expression: (0 <= 'i & 'i < 16) +  | This error was caused by: +  | [lexp_vec/v1.sail]:12:2-6 +  | 12 | V[i] = v +  |  | ^--^ +  |  | Bounds check failed for l-expression: (0 <= 'i & 'i < 16) +  | diff --git a/test/typecheck/pass/lexp_vec/v1.sail b/test/typecheck/pass/lexp_vec/v1.sail new file mode 100644 index 00000000..862f20dd --- /dev/null +++ b/test/typecheck/pass/lexp_vec/v1.sail @@ -0,0 +1,17 @@ +default Order dec + +$include + +register V : vector(16, dec, bitvector(32, dec)) + +val zeros : forall 'n, 'n >= 0. unit -> bitvector('n, dec) + +val write_V : forall 'i. (int('i), bitvector(32, dec)) -> unit effect {wreg} + +function write_V(i, v) = { + V[i] = v +} + +function main() : unit -> unit = { + write_V(0, zeros()) +} diff --git a/test/typecheck/pass/lexp_vec/v2.expect b/test/typecheck/pass/lexp_vec/v2.expect new file mode 100644 index 00000000..3cf52c8d --- /dev/null +++ b/test/typecheck/pass/lexp_vec/v2.expect @@ -0,0 +1,7 @@ +Type error: +[lexp_vec/v2.sail]:16:2-22 +16 | write_V(16, zeros()) +  | ^------------------^ +  | Could not resolve quantifiers for write_V +  | * (0 <= 16 & 16 < 16) +  | diff --git a/test/typecheck/pass/lexp_vec/v2.sail b/test/typecheck/pass/lexp_vec/v2.sail new file mode 100644 index 00000000..f0aaae1e --- /dev/null +++ b/test/typecheck/pass/lexp_vec/v2.sail @@ -0,0 +1,17 @@ +default Order dec + +$include + +register V : vector(16, dec, bitvector(32, dec)) + +val zeros : forall 'n, 'n >= 0. unit -> bitvector('n, dec) + +val write_V : forall 'i, 0 <= 'i < 16. (int('i), bitvector(32, dec)) -> unit effect {wreg} + +function write_V(i, v) = { + V[i] = v +} + +function main() : unit -> unit = { + write_V(16, zeros()) +} -- cgit v1.2.3