Merge pull request #34 from antonblanchard/decode-table
[microwatt.git] / decode_types.vhdl
1 library ieee;
2 use ieee.std_logic_1164.all;
3
4 package decode_types is
5 type ppc_insn_t is (PPC_ILLEGAL, PPC_ADD, PPC_ADDC, PPC_ADDE,
6 PPC_ADDEX, PPC_ADDI, PPC_ADDIC, PPC_ADDIC_RC, PPC_ADDIS,
7 PPC_ADDME, PPC_ADDPCIS, PPC_ADDZE, PPC_AND, PPC_ANDC,
8 PPC_ANDI_RC, PPC_ANDIS_RC, PPC_ATTN, PPC_B, PPC_BA, PPC_BC,
9 PPC_BCA, PPC_BCCTR, PPC_BCLA, PPC_BCLR, PPC_BCTAR, PPC_BPERM,
10 PPC_CMP, PPC_CMPB, PPC_CMPEQB, PPC_CMPI, PPC_CMPL, PPC_CMPLI,
11 PPC_CMPRB, PPC_CNTLZD, PPC_CNTLZW, PPC_CNTTZD, PPC_CNTTZW,
12 PPC_CRAND, PPC_CRANDC, PPC_CREQV, PPC_CRNAND, PPC_CRNOR,
13 PPC_CROR, PPC_CRORC, PPC_CRXOR, PPC_DARN, PPC_DCBF, PPC_DCBST,
14 PPC_DCBT, PPC_DCBTST, PPC_DCBZ, PPC_DIVD, PPC_DIVDE,
15 PPC_DIVDEU, PPC_DIVDU, PPC_DIVW, PPC_DIVWE, PPC_DIVWEU,
16 PPC_DIVWU, PPC_EQV, PPC_EXTSB, PPC_EXTSH, PPC_EXTSW,
17 PPC_EXTSWSLI, PPC_ICBI, PPC_ICBT, PPC_ISEL, PPC_ISYNC,
18 PPC_LBARX, PPC_LBZ, PPC_LBZU, PPC_LBZUX, PPC_LBZX, PPC_LD,
19 PPC_LDARX, PPC_LDBRX, PPC_LDU, PPC_LDUX, PPC_LDX, PPC_LHA,
20 PPC_LHARX, PPC_LHAU, PPC_LHAUX, PPC_LHAX, PPC_LHBRX, PPC_LHZ,
21 PPC_LHZU, PPC_LHZUX, PPC_LHZX, PPC_LWA, PPC_LWARX, PPC_LWAUX,
22 PPC_LWAX, PPC_LWBRX, PPC_LWZ, PPC_LWZU, PPC_LWZUX, PPC_LWZX,
23 PPC_MADDHD, PPC_MADDHDU, PPC_MADDLD, PPC_MCRF, PPC_MCRXR,
24 PPC_MCRXRX, PPC_MFCR, PPC_MFOCRF, PPC_MFSPR, PPC_MFTB,
25 PPC_MODSD, PPC_MODSW, PPC_MODUD, PPC_MODUW, PPC_MTCRF,
26 PPC_MFCTR, PPC_MTCTR, PPC_MFLR, PPC_MTLR, PPC_MTOCRF,
27 PPC_MTSPR, PPC_MULHD, PPC_MULHDU, PPC_MULHW, PPC_MULHWU,
28 PPC_MULLD, PPC_MULLI, PPC_MULLW, PPC_NAND, PPC_NEG, PPC_NOR,
29 PPC_OR, PPC_ORC, PPC_ORI, PPC_ORIS, PPC_POPCNTB, PPC_POPCNTD,
30 PPC_POPCNTW, PPC_PRTYD, PPC_PRTYW, PPC_RLDCL, PPC_RLDCR,
31 PPC_RLDIC, PPC_RLDICL, PPC_RLDICR, PPC_RLDIMI, PPC_RLWIMI,
32 PPC_RLWINM, PPC_RLWNM, PPC_SETB, PPC_SLD, PPC_SLW, PPC_SRAD,
33 PPC_SRADI, PPC_SRAW, PPC_SRAWI, PPC_SRD, PPC_SRW, PPC_STB,
34 PPC_STBCX, PPC_STBU, PPC_STBUX, PPC_STBX, PPC_STD, PPC_STDBRX,
35 PPC_STDCX, PPC_STDU, PPC_STDUX, PPC_STDX, PPC_STH, PPC_STHBRX,
36 PPC_STHCX, PPC_STHU, PPC_STHUX, PPC_STHX, PPC_STW, PPC_STWBRX,
37 PPC_STWCX, PPC_STWU, PPC_STWUX, PPC_STWX, PPC_SUBF, PPC_SUBFC,
38 PPC_SUBFE, PPC_SUBFIC, PPC_SUBFME, PPC_SUBFZE, PPC_SYNC, PPC_TD,
39 PPC_TDI, PPC_TW, PPC_TWI, PPC_XOR, PPC_XORI, PPC_XORIS,
40 PPC_SIM_READ, PPC_SIM_POLL, PPC_SIM_WRITE, PPC_SIM_CONFIG);
41
42 type insn_type_t is (OP_ILLEGAL, OP_NOP, OP_ADD, OP_ADDC, OP_ADDEX, OP_ADDME,
43 OP_ADDPCIS, OP_AND, OP_ANDC, OP_ATTN, OP_B, OP_BA, OP_BC,
44 OP_BCA, OP_BCCTR, OP_BCLA, OP_BCLR, OP_BCTAR, OP_BPERM, OP_CMP,
45 OP_CMPB, OP_CMPEQB, OP_CMPL, OP_CMPRB,
46 OP_CNTLZD, OP_CNTLZW, OP_CNTTZD, OP_CNTTZW, OP_CRAND,
47 OP_CRANDC, OP_CREQV, OP_CRNAND, OP_CRNOR, OP_CROR, OP_CRORC,
48 OP_CRXOR, OP_DARN, OP_DCBF, OP_DCBST, OP_DCBT, OP_DCBTST,
49 OP_DCBZ, OP_DIVD, OP_DIVDE, OP_DIVDEU, OP_DIVDU, OP_DIVW,
50 OP_DIVWE, OP_DIVWEU, OP_DIVWU, OP_EQV, OP_EXTSB, OP_EXTSH,
51 OP_EXTSW, OP_EXTSWSLI, OP_ICBI, OP_ICBT, OP_ISEL, OP_ISYNC,
52 OP_LOAD, OP_STORE, OP_MADDHD, OP_MADDHDU, OP_MADDLD, OP_MCRF,
53 OP_MCRXR, OP_MCRXRX, OP_MFCR, OP_MFOCRF, OP_MFCTR, OP_MFLR,
54 OP_MFTB, OP_MFSPR, OP_MODSD, OP_MODSW, OP_MODUD, OP_MODUW,
55 OP_MTCRF, OP_MTOCRF, OP_MTCTR, OP_MTLR, OP_MTSPR, OP_MUL_L64,
56 OP_MUL_H64, OP_MUL_H32, OP_NAND, OP_NEG, OP_NOR, OP_OR,
57 OP_ORC, OP_POPCNTB, OP_POPCNTD, OP_POPCNTW, OP_PRTYD,
58 OP_PRTYW, OP_RLDCL, OP_RLDCR, OP_RLDIC, OP_RLDICL, OP_RLDICR,
59 OP_RLDIMI, OP_RLWIMI, OP_RLWINM, OP_RLWNM, OP_SETB, OP_SLD,
60 OP_SLW, OP_SRAD, OP_SRADI, OP_SRAW, OP_SRAWI, OP_SRD, OP_SRW,
61 OP_SUBF, OP_SUBFC, OP_SUBFME, OP_SYNC, OP_TD, OP_TDI, OP_TW,
62 OP_TWI, OP_XOR, OP_SIM_READ, OP_SIM_POLL, OP_SIM_WRITE,
63 OP_SIM_CONFIG);
64
65 type input_reg_a_t is (NONE, RA, RA_OR_ZERO, RS);
66 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);
67 type input_reg_c_t is (NONE, RS);
68 type output_reg_a_t is (NONE, RT, RA);
69 type constant_a_t is (NONE, SH, SH32, FXM, BO, BF, TOO, BC);
70 type constant_b_t is (NONE, MB, ME, MB32, BI, L);
71 type constant_c_t is (NONE, ME32, BH);
72 type rc_t is (NONE, ONE, RC);
73
74 constant SH_OFFSET : integer := 0;
75 constant MB_OFFSET : integer := 1;
76 constant ME_OFFSET : integer := 1;
77 constant SH32_OFFSET : integer := 0;
78 constant MB32_OFFSET : integer := 1;
79 constant ME32_OFFSET : integer := 2;
80
81 constant FXM_OFFSET : integer := 0;
82
83 constant BO_OFFSET : integer := 0;
84 constant BI_OFFSET : integer := 1;
85 constant BH_OFFSET : integer := 2;
86
87 constant BF_OFFSET : integer := 0;
88 constant L_OFFSET : integer := 1;
89
90 constant TOO_OFFSET : integer := 0;
91
92 type unit_t is (NONE, ALU, LDST, MUL);
93 type length_t is (NONE, is1B, is2B, is4B, is8B);
94
95 type decode_rom_t is record
96 unit : unit_t;
97 insn_type : insn_type_t;
98 input_reg_a : input_reg_a_t;
99 input_reg_b : input_reg_b_t;
100 input_reg_c : input_reg_c_t;
101 output_reg_a : output_reg_a_t;
102
103 const_a : constant_a_t;
104 const_b : constant_b_t;
105 const_c : constant_c_t;
106
107 input_cr : std_ulogic;
108 output_cr : std_ulogic;
109
110 input_carry : std_ulogic;
111 output_carry : std_ulogic;
112
113 -- load/store signals
114 length : length_t;
115 byte_reverse : std_ulogic;
116 sign_extend : std_ulogic;
117 update : std_ulogic;
118 reserve : std_ulogic;
119
120 -- multiplier signals
121 mul_32bit : std_ulogic;
122 mul_signed : std_ulogic;
123
124 rc : rc_t;
125 lr : std_ulogic;
126
127 sgl_pipe : std_ulogic;
128 end record;
129 constant decode_rom_init : decode_rom_t := (unit => NONE,
130 insn_type => OP_ILLEGAL, input_reg_a => NONE,
131 input_reg_b => NONE, input_reg_c => NONE,
132 output_reg_a => NONE, const_a => NONE, const_b => NONE,
133 const_c => NONE, input_cr => '0', output_cr => '0',
134 input_carry => '0', output_carry => '0',
135 length => NONE, byte_reverse => '0', sign_extend => '0',
136 update => '0', reserve => '0', mul_32bit => '0',
137 mul_signed => '0', rc => NONE, lr => '0', sgl_pipe => '0');
138
139 end decode_types;
140
141 package body decode_types is
142 end decode_types;