From 708cbe6c1ff75f5bccb09af043577b50982529b9 Mon Sep 17 00:00:00 2001
From: Tristan Gingold <tgingold@free.fr>
Date: Tue, 29 Dec 2020 18:33:35 +0100
Subject: testsuite/gna: add tests for #1549

---
 testsuite/gna/issue1549/ent.vhdl | 67 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 67 insertions(+)
 create mode 100644 testsuite/gna/issue1549/ent.vhdl

(limited to 'testsuite/gna/issue1549/ent.vhdl')

diff --git a/testsuite/gna/issue1549/ent.vhdl b/testsuite/gna/issue1549/ent.vhdl
new file mode 100644
index 000000000..46cab39c3
--- /dev/null
+++ b/testsuite/gna/issue1549/ent.vhdl
@@ -0,0 +1,67 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity ent is
+  generic (
+    TUSER_WIDTH : natural := 1); -- Changing TUSER_WIDTH to a local constant inside ent fixes the issue
+end ent;
+
+architecture ent of ent is
+
+  -- constant TUSER_WIDTH : natural := 1;
+
+  type data_t is record
+    tuser : std_logic_vector;
+  end record;
+
+  type data_array_t is array (natural range <>) of data_t;
+  type std_logic_array_t is array (natural range <>) of std_logic_vector;
+  subtype tuser_array_t is std_logic_array_t(open)(TUSER_WIDTH - 1 downto 0);
+
+begin
+
+  process
+    ------------------------------------------------------------------------------------
+    procedure write_data (
+      constant tuser : tuser_array_t                    -- Fails!
+      -- constant tuser : std_logic_array_t(open)(open) -- Works
+      -- constant tuser : std_logic_array_t             -- Works
+     ) is
+    begin
+
+      -- All entries will show as zero when it fails!
+      for i in tuser'range loop
+        report integer'image(i) & " =>" & integer'image(to_integer(unsigned(tuser(i))));
+      end loop;
+
+      assert tuser(1)(0) = '1'; -- <<<<<====== This should not fail
+    end procedure;
+
+    ------------------------------------------------------------------------------------
+    procedure handle_data_array ( constant data : data_array_t) is
+      variable local_tuser : std_logic_array_t(data'range)(TUSER_WIDTH - 1 downto 0);
+      -- variable local_tuser : tuser_array_t(data'range); -- This fails in this procedure!
+    begin
+      -- Convert a list of tuples into two lists
+      for i in data'range loop
+        local_tuser(i) := data(i).tuser;
+        -- This assertion fails when local_tuser type is one of
+        --  tuser_array_t(data'range)
+        --  tuser_array_t(0 to 1)
+        -- It will pass if the local_tuser is of type std_logic_array_t(data'range)(TUSER_WIDTH - 1 downto 0);
+        assert local_tuser(i) = data(i).tuser
+          report "local_tuser and data(i).tuser should not be different here";
+      end loop;
+
+      write_data(tuser => local_tuser);
+    end;
+
+    ------------------------------------------------------------------------------------
+    constant data : data_array_t(0 to 1)(tuser(0 downto 0)) := (0 => (tuser => (0 downto 0 => '0')),
+                                                                1 => (tuser => (0 downto 0 => '1')));
+  begin
+    handle_data_array(data);
+    wait;
+  end process;
+end ent;
-- 
cgit v1.2.3