decode: Remove const fields from decode_rom_t
[microwatt.git] / decode_types.vhdl
1 library ieee;
2 use ieee.std_logic_1164.all;
3
4 package decode_types is
5 type insn_type_t is (OP_ILLEGAL, OP_NOP, OP_ADD, OP_ADDE, OP_ADDEX, OP_ADDME,
6 OP_ADDPCIS, OP_AND, OP_ANDC, OP_ATTN, OP_B, OP_BC, OP_BCREG,
7 OP_BPERM, OP_CMP, OP_CMPB, OP_CMPEQB, OP_CMPL, OP_CMPRB,
8 OP_CNTLZD, OP_CNTLZW, OP_CNTTZD, OP_CNTTZW, OP_CRAND,
9 OP_CRANDC, OP_CREQV, OP_CRNAND, OP_CRNOR, OP_CROR, OP_CRORC,
10 OP_CRXOR, OP_DARN, OP_DCBF, OP_DCBST, OP_DCBT, OP_DCBTST,
11 OP_DCBZ, OP_DIV, OP_EQV, OP_EXTSB, OP_EXTSH,
12 OP_EXTSW, OP_EXTSWSLI, OP_ICBI, OP_ICBT, OP_ISEL, OP_ISYNC,
13 OP_LOAD, OP_STORE, OP_MADDHD, OP_MADDHDU, OP_MADDLD, OP_MCRF,
14 OP_MCRXR, OP_MCRXRX, OP_MFCR, OP_MFSPR, OP_MOD,
15 OP_MTCRF, OP_MTSPR, OP_MUL_L64,
16 OP_MUL_H64, OP_MUL_H32, OP_NAND, OP_NEG, OP_NOR, OP_OR,
17 OP_ORC, OP_POPCNTB, OP_POPCNTD, OP_POPCNTW, OP_PRTYD,
18 OP_PRTYW, OP_RLDCX, OP_RLDIC, OP_RLDICL, OP_RLDICR,
19 OP_RLDIMI, OP_RLWIMI, OP_RLWINM, OP_RLWNM, OP_SETB, OP_SLD,
20 OP_SLW, OP_SRAD, OP_SRADI, OP_SRAW, OP_SRAWI, OP_SRD, OP_SRW,
21 OP_SUBF, OP_SUBFE, OP_SUBFME, OP_SYNC, OP_TD, OP_TDI, OP_TW,
22 OP_TWI, OP_XOR, OP_SIM_CONFIG);
23
24 type input_reg_a_t is (NONE, RA, RA_OR_ZERO, RS);
25 type input_reg_b_t is (NONE, RB, RS, CONST_UI, CONST_SI, CONST_SI_HI, CONST_UI_HI, CONST_LI, CONST_BD, CONST_DS);
26 type input_reg_c_t is (NONE, RS);
27 type output_reg_a_t is (NONE, RT, RA);
28 type rc_t is (NONE, ONE, RC);
29
30 constant SH_OFFSET : integer := 0;
31 constant MB_OFFSET : integer := 1;
32 constant ME_OFFSET : integer := 1;
33 constant SH32_OFFSET : integer := 0;
34 constant MB32_OFFSET : integer := 1;
35 constant ME32_OFFSET : integer := 2;
36
37 constant FXM_OFFSET : integer := 0;
38
39 constant BO_OFFSET : integer := 0;
40 constant BI_OFFSET : integer := 1;
41 constant BH_OFFSET : integer := 2;
42
43 constant BF_OFFSET : integer := 0;
44 constant L_OFFSET : integer := 1;
45
46 constant TOO_OFFSET : integer := 0;
47
48 type unit_t is (NONE, ALU, LDST, MUL, DIV);
49 type length_t is (NONE, is1B, is2B, is4B, is8B);
50
51 type decode_rom_t is record
52 unit : unit_t;
53 insn_type : insn_type_t;
54 input_reg_a : input_reg_a_t;
55 input_reg_b : input_reg_b_t;
56 input_reg_c : input_reg_c_t;
57 output_reg_a : output_reg_a_t;
58
59 input_cr : std_ulogic;
60 output_cr : std_ulogic;
61
62 input_carry : std_ulogic;
63 output_carry : std_ulogic;
64
65 -- load/store signals
66 length : length_t;
67 byte_reverse : std_ulogic;
68 sign_extend : std_ulogic;
69 update : std_ulogic;
70 reserve : std_ulogic;
71
72 -- multiplier signals
73 mul_32bit : std_ulogic;
74 mul_signed : std_ulogic;
75
76 rc : rc_t;
77 lr : std_ulogic;
78
79 sgl_pipe : std_ulogic;
80 end record;
81 constant decode_rom_init : decode_rom_t := (unit => NONE,
82 insn_type => OP_ILLEGAL, input_reg_a => NONE,
83 input_reg_b => NONE, input_reg_c => NONE,
84 output_reg_a => NONE, input_cr => '0', output_cr => '0',
85 input_carry => '0', output_carry => '0',
86 length => NONE, byte_reverse => '0', sign_extend => '0',
87 update => '0', reserve => '0', mul_32bit => '0',
88 mul_signed => '0', rc => NONE, lr => '0', sgl_pipe => '0');
89
90 end decode_types;
91
92 package body decode_types is
93 end decode_types;