aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2019-05-07 20:05:57 +0200
committerTristan Gingold <tgingold@free.fr>2019-05-07 20:05:57 +0200
commit34666ab2dc542936871357d4fe6f54600c5aa325 (patch)
tree5713c8b4077f263641e25788e4bc3080289016d1
parenta5b13e2e4b25d8b1258fa2af19b8840b39a2942f (diff)
downloadghdl-34666ab2dc542936871357d4fe6f54600c5aa325.tar.gz
ghdl-34666ab2dc542936871357d4fe6f54600c5aa325.tar.bz2
ghdl-34666ab2dc542936871357d4fe6f54600c5aa325.zip
Add reproducer for #816
-rw-r--r--testsuite/gna/issue816/repro.vhdl40
-rw-r--r--testsuite/gna/issue816/test.vhdl74
-rwxr-xr-xtestsuite/gna/issue816/testsuite.sh10
3 files changed, 124 insertions, 0 deletions
diff --git a/testsuite/gna/issue816/repro.vhdl b/testsuite/gna/issue816/repro.vhdl
new file mode 100644
index 000000000..f67e38825
--- /dev/null
+++ b/testsuite/gna/issue816/repro.vhdl
@@ -0,0 +1,40 @@
+library ieee;
+context ieee.ieee_std_context;
+
+package integer_vector_ptr_pkg is
+ subtype index_t is integer range -1 to integer'high;
+ type integer_vector_ptr_t is record
+ index : index_t;
+ end record;
+
+ impure function get(ptr : integer_vector_ptr_t; index : integer)
+ return integer;
+
+end package;
+
+entity tb_test is
+ generic ( runner_cfg : string );
+end entity;
+
+use work.integer_vector_ptr_pkg.all;
+
+architecture tb of tb_test is
+
+ constant params: integer_vector_ptr_t := (index => 0);
+
+ type time_t is array (natural range 0 to 1) of natural;
+
+ procedure get_time(variable t: inout time_t) is begin
+ t(0) := get(params, 0);
+ t(1) := get(params, 1);
+ end;
+
+begin
+
+ run: process(all)
+ variable r: time_t;
+ begin
+ get_time(r);
+ end process;
+
+end architecture;
diff --git a/testsuite/gna/issue816/test.vhdl b/testsuite/gna/issue816/test.vhdl
new file mode 100644
index 000000000..c7ed25851
--- /dev/null
+++ b/testsuite/gna/issue816/test.vhdl
@@ -0,0 +1,74 @@
+library ieee;
+context ieee.ieee_std_context;
+
+library vunit_lib;
+context vunit_lib.vunit_context;
+
+entity tb_test is
+ generic ( runner_cfg : string );
+end entity;
+
+architecture tb of tb_test is
+
+ constant params: integer_vector_ptr_t := new_integer_vector_ptr(2, -1);
+
+ constant clk_period : time := 20 ns;
+
+ type time_t is array (natural range 0 to 1) of natural;
+
+ procedure set_time(t: time_t) is begin
+ set(params, 0, t(0));
+ set(params, 1, t(1));
+ end;
+
+ procedure get_time(variable t: inout time_t) is begin
+ t(0) := get(params, 0);
+ t(1) := get(params, 1);
+ end;
+
+ impure function get_time return time_t is
+ variable t: time_t;
+ begin
+-- t(0) := get(params, 0);
+-- t(1) := get(params, 1);
+ return t;
+ end;
+
+ constant null_time: time_t := (others => 0);
+
+ impure function to_string(t: time_t) return string is begin
+ return to_string(t(0)) & " " & to_string(t(1));
+ end;
+
+ signal clk: std_logic;
+
+begin
+
+ clk <= not clk after (clk_period/2);
+
+ run: process(all)
+ variable r: time_t;
+ begin
+ if rising_edge(clk) then
+-- info("Time: " & to_string(get_time));
+-- get_time(r);
+ end if;
+ end process;
+
+ main: process
+ variable t: time_t;
+ begin
+ test_runner_setup(runner, runner_cfg);
+ get_time(t);
+ if t = null_time then
+ set_time((others=>natural'high));
+ end if;
+ get_time(t);
+ info("Init test | time: " & to_string(t));
+ info("Test done");
+ test_runner_cleanup(runner);
+ wait;
+ end process;
+ test_runner_watchdog(runner, 500 ms);
+
+end architecture;
diff --git a/testsuite/gna/issue816/testsuite.sh b/testsuite/gna/issue816/testsuite.sh
new file mode 100755
index 000000000..7b37332aa
--- /dev/null
+++ b/testsuite/gna/issue816/testsuite.sh
@@ -0,0 +1,10 @@
+#! /bin/sh
+
+. ../../testenv.sh
+
+export GHDL_STD_FLAGS=--std=08
+analyze repro.vhdl
+
+clean
+
+echo "Test successful"