verilog: add sv_maps iterators
[ghdl-vlg.git] / testsuite / synth / issue1319 / ent.vhdl
blob4e7960724acf6bd6a0ba65943fea67a19c2656eb
1 library ieee;
2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
5 library work;
7 entity ent is
8         port (
9                 insn_i     : in std_ulogic_vector(31 downto 0);
10                 ispr1_o    : out std_ulogic_vector(5 downto 0);
11                 ispr2_o    : out std_ulogic_vector(5 downto 0)
12         );
13 end entity ent;
15 architecture behaviour of ent is
16     -- SPR numbers
17     subtype spr_num_t is integer range 0 to 1023;
19     function decode_spr_num(insn: std_ulogic_vector(31 downto 0)) return spr_num_t;
21     constant SPR_XER    : spr_num_t := 1;
22     constant SPR_LR     : spr_num_t := 8;
23     constant SPR_CTR    : spr_num_t := 9;
25     -- Extended GPR indice (can hold an SPR)
26     subtype gspr_index_t is std_ulogic_vector(5 downto 0);
28     function decode_spr_num(insn: std_ulogic_vector(31 downto 0)) return spr_num_t is
29     begin
30         return to_integer(unsigned(insn(15 downto 11) & insn(20 downto 16)));
31     end;
32     function fast_spr_num(spr: spr_num_t) return gspr_index_t is
33        variable n : integer range 0 to 31;
34     begin
35        case spr is
36        when SPR_LR =>
37            n := 0;
38        when SPR_CTR =>
39            n:= 1;
40        when SPR_XER =>
41            n := 12;
42        when others =>
43            n := 0;
44            return "000000";
45        end case;
46        return "1" & std_ulogic_vector(to_unsigned(n, 5));
47     end;
49 begin
50         decode1_1: process(all)
51         begin
52                 ispr1_o <= fast_spr_num(decode_spr_num(insn_i));
53                 ispr2_o <= fast_spr_num(SPR_XER);
54         end process;
55 end architecture behaviour;