decode_types.vhdl 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. package decode_types is
  4. type insn_type_t is (OP_ILLEGAL, OP_NOP, OP_ADD,
  5. OP_AND, OP_ATTN, OP_B, OP_BC, OP_BCREG,
  6. OP_BPERM, OP_CMP, OP_CMPB, OP_CMPEQB, OP_CMPRB,
  7. OP_CNTZ, OP_CROP,
  8. OP_DARN, OP_DCBF, OP_DCBST, OP_DCBT, OP_DCBTST,
  9. OP_DCBZ, OP_DIV, OP_DIVE, OP_EXTS, OP_EXTSWSLI,
  10. OP_FPOP, OP_FPOP_I,
  11. OP_ICBI, OP_ICBT, OP_ISEL, OP_ISYNC,
  12. OP_LOAD, OP_STORE,
  13. OP_MCRXRX, OP_MFCR, OP_MFMSR, OP_MFSPR, OP_MOD,
  14. OP_MTCRF, OP_MTMSRD, OP_MTSPR, OP_MUL_L64,
  15. OP_MUL_H64, OP_MUL_H32, OP_OR,
  16. OP_POPCNT, OP_PRTY, OP_RFID,
  17. OP_RLC, OP_RLCL, OP_RLCR, OP_SC, OP_SETB,
  18. OP_SHL, OP_SHR,
  19. OP_SYNC, OP_TLBIE, OP_TRAP,
  20. OP_XOR,
  21. OP_BCD, OP_ADDG6S,
  22. OP_FETCH_FAILED
  23. );
  24. type input_reg_a_t is (NONE, RA, RA_OR_ZERO, SPR, CIA, FRA);
  25. type input_reg_b_t is (NONE, RB, CONST_UI, CONST_SI, CONST_SI_HI, CONST_UI_HI, CONST_LI, CONST_BD,
  26. CONST_DXHI4, CONST_DS, CONST_DQ, CONST_M1, CONST_SH, CONST_SH32, SPR, FRB);
  27. type input_reg_c_t is (NONE, RS, RCR, FRC, FRS);
  28. type output_reg_a_t is (NONE, RT, RA, SPR, FRT);
  29. type rc_t is (NONE, ONE, RC);
  30. type carry_in_t is (ZERO, CA, OV, ONE);
  31. constant SH_OFFSET : integer := 0;
  32. constant MB_OFFSET : integer := 1;
  33. constant ME_OFFSET : integer := 1;
  34. constant SH32_OFFSET : integer := 0;
  35. constant MB32_OFFSET : integer := 1;
  36. constant ME32_OFFSET : integer := 2;
  37. constant FXM_OFFSET : integer := 0;
  38. constant BO_OFFSET : integer := 0;
  39. constant BI_OFFSET : integer := 1;
  40. constant BH_OFFSET : integer := 2;
  41. constant BF_OFFSET : integer := 0;
  42. constant L_OFFSET : integer := 1;
  43. constant TOO_OFFSET : integer := 0;
  44. type unit_t is (NONE, ALU, LDST, FPU);
  45. type facility_t is (NONE, FPU);
  46. type length_t is (NONE, is1B, is2B, is4B, is8B);
  47. type repeat_t is (NONE, -- instruction is not repeated
  48. DRSE, -- double RS, endian twist
  49. DRTE, -- double RT, endian twist
  50. DUPD); -- update-form load
  51. type decode_rom_t is record
  52. unit : unit_t;
  53. facility : facility_t;
  54. insn_type : insn_type_t;
  55. input_reg_a : input_reg_a_t;
  56. input_reg_b : input_reg_b_t;
  57. input_reg_c : input_reg_c_t;
  58. output_reg_a : output_reg_a_t;
  59. input_cr : std_ulogic;
  60. output_cr : std_ulogic;
  61. invert_a : std_ulogic;
  62. invert_out : std_ulogic;
  63. input_carry : carry_in_t;
  64. output_carry : std_ulogic;
  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. -- multiplier and ALU signals
  72. is_32bit : std_ulogic;
  73. is_signed : std_ulogic;
  74. rc : rc_t;
  75. lr : std_ulogic;
  76. sgl_pipe : std_ulogic;
  77. repeat : repeat_t;
  78. end record;
  79. constant decode_rom_init : decode_rom_t := (unit => NONE, facility => NONE,
  80. insn_type => OP_ILLEGAL, input_reg_a => NONE,
  81. input_reg_b => NONE, input_reg_c => NONE,
  82. output_reg_a => NONE, input_cr => '0', output_cr => '0',
  83. invert_a => '0', invert_out => '0', input_carry => ZERO, output_carry => '0',
  84. length => NONE, byte_reverse => '0', sign_extend => '0',
  85. update => '0', reserve => '0', is_32bit => '0',
  86. is_signed => '0', rc => NONE, lr => '0', sgl_pipe => '0', repeat => NONE);
  87. end decode_types;
  88. package body decode_types is
  89. end decode_types;