diff --git a/crhelpers.vhdl b/crhelpers.vhdl index 350fd13..f51110c 100644 --- a/crhelpers.vhdl +++ b/crhelpers.vhdl @@ -5,130 +5,50 @@ library work; use work.common.all; package crhelpers is - function fxm_to_num(fxm: std_ulogic_vector(7 downto 0)) return integer; - function num_to_fxm(num: integer) return std_ulogic_vector; - --function from_crfile(cr: crfile) return std_ulogic_vector; - --function extract_one_crfield(cr: crfile; fxm: std_ulogic_vector(7 downto 0)) return std_ulogic_vector; - --function insert_multiple_crfields(cr_in: crfile; rs: std_ulogic_vector(63 downto 0); fxm: std_ulogic_vector(7 downto 0)) return crfile; - --function insert_one_crfield(cr_in: crfile; rs: std_ulogic_vector(63 downto 0); fxm: std_ulogic_vector(7 downto 0)) return crfile; + function fxm_to_num(fxm: std_ulogic_vector(7 downto 0)) return integer; + function num_to_fxm(num: integer) return std_ulogic_vector; end package crhelpers; package body crhelpers is - function fxm_to_num(fxm: std_ulogic_vector(7 downto 0)) return integer is - begin - -- If multiple fields are set (undefined), match existing - -- hardware by returning the first one. - for i in 0 to 7 loop - -- Big endian bit numbering - if fxm(7-i) = '1' then - return i; - end if; - end loop; + function fxm_to_num(fxm: std_ulogic_vector(7 downto 0)) return integer is + begin + -- If multiple fields are set (undefined), match existing + -- hardware by returning the first one. + for i in 0 to 7 loop + -- Big endian bit numbering + if fxm(7-i) = '1' then + return i; + end if; + end loop; - -- If no fields are set (undefined), also match existing - -- hardware by returning cr7. - return 7; - end; + -- If no fields are set (undefined), also match existing + -- hardware by returning cr7. + return 7; + end; - function num_to_fxm(num: integer) return std_ulogic_vector is - begin - case num is - when 0 => - return "10000000"; - when 1 => - return "01000000"; - when 2 => - return "00100000"; - when 3 => - return "00010000"; - when 4 => - return "00001000"; - when 5 => - return "00000100"; - when 6 => - return "00000010"; - when 7 => - return "00000001"; - when others => - return "00000000"; - end case; - end; + function num_to_fxm(num: integer) return std_ulogic_vector is + begin + case num is + when 0 => + return "10000000"; + when 1 => + return "01000000"; + when 2 => + return "00100000"; + when 3 => + return "00010000"; + when 4 => + return "00001000"; + when 5 => + return "00000100"; + when 6 => + return "00000010"; + when 7 => + return "00000001"; + when others => + return "00000000"; + end case; + end; --- function from_crfile(cr: crfile) return std_ulogic_vector is --- variable combined_cr : std_ulogic_vector(31 downto 0) := (others => '0'); --- variable high, low: integer range 0 to 31 := 0; --- begin --- for i in 0 to cr'length-1 loop --- low := 4*(7-i); --- high := low+3; --- combined_cr(high downto low) := cr(i); --- end loop; --- --- return combined_cr; --- end function; --- --- function extract_one_crfield(cr: crfile; fxm: std_ulogic_vector(7 downto 0)) return std_ulogic_vector is --- variable combined_cr : std_ulogic_vector(63 downto 0) := (others => '0'); --- variable crnum: integer range 0 to 7 := 0; --- begin --- crnum := fxm_to_num(fxm); --- --- -- Vivado doesn't support non constant vector slice --- -- low := 4*(7-crnum); --- -- high := low+3; --- -- combined_cr(high downto low) := cr(crnum); --- case_0: case crnum is --- when 0 => --- combined_cr(31 downto 28) := cr(0); --- when 1 => --- combined_cr(27 downto 24) := cr(1); --- when 2 => --- combined_cr(23 downto 20) := cr(2); --- when 3 => --- combined_cr(19 downto 16) := cr(3); --- when 4 => --- combined_cr(15 downto 12) := cr(4); --- when 5 => --- combined_cr(11 downto 8) := cr(5); --- when 6 => --- combined_cr(7 downto 4) := cr(6); --- when 7 => --- combined_cr(3 downto 0) := cr(7); --- end case; --- --- return combined_cr; --- end; --- --- function insert_multiple_crfields(cr_in: crfile; rs: std_ulogic_vector(63 downto 0); fxm: std_ulogic_vector(7 downto 0)) return crfile is --- variable cr : crfile; --- variable combined_cr : std_ulogic_vector(63 downto 0) := (others => '0'); --- variable high, low: integer range 0 to 31 := 0; --- begin --- cr := cr_in; --- --- for i in 0 to 7 loop --- -- BE bit numbering --- if fxm(7-i) = '1' then --- low := 4*(7-i); --- high := low+3; --- cr(i) := rs(high downto low); --- end if; --- end loop; --- --- return cr; --- end; --- --- function insert_one_crfield(cr_in: crfile; rs: std_ulogic_vector(63 downto 0); fxm: std_ulogic_vector(7 downto 0)) return crfile is --- variable cr : crfile; --- variable crnum: integer range 0 to 7 := 0; --- variable high, low: integer range 0 to 31 := 0; --- begin --- cr := cr_in; --- crnum := fxm_to_num(fxm); --- low := 4*(7-crnum); --- high := low+3; --- cr(crnum) := rs(high downto low); --- return cr; --- end; end package body crhelpers; diff --git a/helpers.vhdl b/helpers.vhdl index f0bce95..3961332 100644 --- a/helpers.vhdl +++ b/helpers.vhdl @@ -5,205 +5,205 @@ use ieee.numeric_std.all; library work; package helpers is - function fls_32 (val: std_ulogic_vector(31 downto 0)) return integer; - function ffs_32 (val: std_ulogic_vector(31 downto 0)) return integer; + function fls_32 (val: std_ulogic_vector(31 downto 0)) return integer; + function ffs_32 (val: std_ulogic_vector(31 downto 0)) return integer; - function fls_64 (val: std_ulogic_vector(63 downto 0)) return integer; - function ffs_64 (val: std_ulogic_vector(63 downto 0)) return integer; + function fls_64 (val: std_ulogic_vector(63 downto 0)) return integer; + function ffs_64 (val: std_ulogic_vector(63 downto 0)) return integer; - function popcnt8(val: std_ulogic_vector(7 downto 0)) return std_ulogic_vector; - function popcnt32(val: std_ulogic_vector(31 downto 0)) return std_ulogic_vector; - function popcnt64(val: std_ulogic_vector(63 downto 0)) return std_ulogic_vector; + function popcnt8(val: std_ulogic_vector(7 downto 0)) return std_ulogic_vector; + function popcnt32(val: std_ulogic_vector(31 downto 0)) return std_ulogic_vector; + function popcnt64(val: std_ulogic_vector(63 downto 0)) return std_ulogic_vector; - function cmp_one_byte(a, b: std_ulogic_vector(7 downto 0)) return std_ulogic_vector; + function cmp_one_byte(a, b: std_ulogic_vector(7 downto 0)) return std_ulogic_vector; - function ppc_signed_compare(a, b: signed(63 downto 0)) return std_ulogic_vector; - function ppc_unsigned_compare(a, b: unsigned(63 downto 0)) return std_ulogic_vector; + function ppc_signed_compare(a, b: signed(63 downto 0)) return std_ulogic_vector; + function ppc_unsigned_compare(a, b: unsigned(63 downto 0)) return std_ulogic_vector; - function ra_or_zero(ra: std_ulogic_vector(63 downto 0); reg: std_ulogic_vector(4 downto 0)) return std_ulogic_vector; + function ra_or_zero(ra: std_ulogic_vector(63 downto 0); reg: std_ulogic_vector(4 downto 0)) return std_ulogic_vector; - function byte_reverse(val: std_ulogic_vector(63 downto 0); size: integer) return std_ulogic_vector; + function byte_reverse(val: std_ulogic_vector(63 downto 0); size: integer) return std_ulogic_vector; - function sign_extend(val: std_ulogic_vector(63 downto 0); size: natural) return std_ulogic_vector; + function sign_extend(val: std_ulogic_vector(63 downto 0); size: natural) return std_ulogic_vector; end package helpers; package body helpers is - function fls_32 (val: std_ulogic_vector(31 downto 0)) return integer is - variable ret: integer; - begin - ret := 32; - for i in val'range loop - if val(i) = '1' then - ret := 31 - i; - exit; - end if; - end loop; - - return ret; - end; - - function ffs_32 (val: std_ulogic_vector(31 downto 0)) return integer is - variable ret: integer; - begin - ret := 32; - for i in val'reverse_range loop - if val(i) = '1' then - ret := i; - exit; - end if; - end loop; - - return ret; - end; - - function fls_64 (val: std_ulogic_vector(63 downto 0)) return integer is - variable ret: integer; - begin - ret := 64; - for i in val'range loop - if val(i) = '1' then - ret := 63 - i; - exit; - end if; - end loop; - - return ret; - end; - - function ffs_64 (val: std_ulogic_vector(63 downto 0)) return integer is - variable ret: integer; - begin - ret := 64; - for i in val'reverse_range loop - if val(i) = '1' then - ret := i; - exit; - end if; - end loop; - - return ret; - end; - - function popcnt8(val: std_ulogic_vector(7 downto 0)) return std_ulogic_vector is - variable ret: unsigned(3 downto 0) := (others => '0'); - begin - for i in val'range loop - ret := ret + ("000" & val(i)); - end loop; - - return std_ulogic_vector(resize(ret, val'length)); - end; - - function popcnt32(val: std_ulogic_vector(31 downto 0)) return std_ulogic_vector is - variable ret: unsigned(5 downto 0) := (others => '0'); - begin - for i in val'range loop - ret := ret + ("00000" & val(i)); - end loop; - - return std_ulogic_vector(resize(ret, val'length)); - end; - - function popcnt64(val: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is - variable ret: unsigned(6 downto 0) := (others => '0'); - begin - for i in val'range loop - ret := ret + ("000000" & val(i)); - end loop; - - return std_ulogic_vector(resize(ret, val'length)); - end; - - function cmp_one_byte(a, b: std_ulogic_vector(7 downto 0)) return std_ulogic_vector is - variable ret: std_ulogic_vector(7 downto 0); - begin - if a = b then - ret := x"ff"; - else - ret := x"00"; - end if; - - return ret; - end; - - function ppc_signed_compare(a, b: signed(63 downto 0)) return std_ulogic_vector is - variable ret: std_ulogic_vector(3 downto 0); - begin - if a < b then - ret := "1000"; - elsif a > b then - ret := "0100"; - else - ret := "0010"; - end if; - - return ret; - end; - - function ppc_unsigned_compare(a, b: unsigned(63 downto 0)) return std_ulogic_vector is - variable ret: std_ulogic_vector(3 downto 0); - begin - if a < b then - ret := "1000"; - elsif a > b then - ret := "0100"; - else - ret := "0010"; - end if; - - return ret; - end; - - function ra_or_zero(ra: std_ulogic_vector(63 downto 0); reg: std_ulogic_vector(4 downto 0)) return std_ulogic_vector is - begin - if to_integer(unsigned(reg)) = 0 then - return x"0000000000000000"; - else - return ra; - end if; - end; - - function byte_reverse(val: std_ulogic_vector(63 downto 0); size: integer) return std_ulogic_vector is - variable ret : std_ulogic_vector(63 downto 0) := (others => '0'); - begin - -- Vivado doesn't support non constant vector slices, so we have to code - -- each of these. - case_0: case size is - when 2 => - for_2 : for k in 0 to 1 loop - ret(((8*k)+7) downto (8*k)) := val((8*(1-k)+7) downto (8*(1-k))); - end loop; - when 4 => - for_4 : for k in 0 to 3 loop - ret(((8*k)+7) downto (8*k)) := val((8*(3-k)+7) downto (8*(3-k))); - end loop; - when 8 => - for_8 : for k in 0 to 7 loop - ret(((8*k)+7) downto (8*k)) := val((8*(7-k)+7) downto (8*(7-k))); - end loop; - when others => - report "bad byte reverse length " & integer'image(size) severity failure; - end case; - - return ret; - end; - - function sign_extend(val: std_ulogic_vector(63 downto 0); size: natural) return std_ulogic_vector is - variable ret : signed(63 downto 0) := (others => '0'); - variable upper : integer := 0; - begin - case_0: case size is - when 2 => - ret := resize(signed(val(15 downto 0)), 64); - when 4 => - ret := resize(signed(val(31 downto 0)), 64); - when 8 => - ret := resize(signed(val(63 downto 0)), 64); - when others => - report "bad byte reverse length " & integer'image(size) severity failure; - end case; - - return std_ulogic_vector(ret); - - end; + function fls_32 (val: std_ulogic_vector(31 downto 0)) return integer is + variable ret: integer; + begin + ret := 32; + for i in val'range loop + if val(i) = '1' then + ret := 31 - i; + exit; + end if; + end loop; + + return ret; + end; + + function ffs_32 (val: std_ulogic_vector(31 downto 0)) return integer is + variable ret: integer; + begin + ret := 32; + for i in val'reverse_range loop + if val(i) = '1' then + ret := i; + exit; + end if; + end loop; + + return ret; + end; + + function fls_64 (val: std_ulogic_vector(63 downto 0)) return integer is + variable ret: integer; + begin + ret := 64; + for i in val'range loop + if val(i) = '1' then + ret := 63 - i; + exit; + end if; + end loop; + + return ret; + end; + + function ffs_64 (val: std_ulogic_vector(63 downto 0)) return integer is + variable ret: integer; + begin + ret := 64; + for i in val'reverse_range loop + if val(i) = '1' then + ret := i; + exit; + end if; + end loop; + + return ret; + end; + + function popcnt8(val: std_ulogic_vector(7 downto 0)) return std_ulogic_vector is + variable ret: unsigned(3 downto 0) := (others => '0'); + begin + for i in val'range loop + ret := ret + ("000" & val(i)); + end loop; + + return std_ulogic_vector(resize(ret, val'length)); + end; + + function popcnt32(val: std_ulogic_vector(31 downto 0)) return std_ulogic_vector is + variable ret: unsigned(5 downto 0) := (others => '0'); + begin + for i in val'range loop + ret := ret + ("00000" & val(i)); + end loop; + + return std_ulogic_vector(resize(ret, val'length)); + end; + + function popcnt64(val: std_ulogic_vector(63 downto 0)) return std_ulogic_vector is + variable ret: unsigned(6 downto 0) := (others => '0'); + begin + for i in val'range loop + ret := ret + ("000000" & val(i)); + end loop; + + return std_ulogic_vector(resize(ret, val'length)); + end; + + function cmp_one_byte(a, b: std_ulogic_vector(7 downto 0)) return std_ulogic_vector is + variable ret: std_ulogic_vector(7 downto 0); + begin + if a = b then + ret := x"ff"; + else + ret := x"00"; + end if; + + return ret; + end; + + function ppc_signed_compare(a, b: signed(63 downto 0)) return std_ulogic_vector is + variable ret: std_ulogic_vector(3 downto 0); + begin + if a < b then + ret := "1000"; + elsif a > b then + ret := "0100"; + else + ret := "0010"; + end if; + + return ret; + end; + + function ppc_unsigned_compare(a, b: unsigned(63 downto 0)) return std_ulogic_vector is + variable ret: std_ulogic_vector(3 downto 0); + begin + if a < b then + ret := "1000"; + elsif a > b then + ret := "0100"; + else + ret := "0010"; + end if; + + return ret; + end; + + function ra_or_zero(ra: std_ulogic_vector(63 downto 0); reg: std_ulogic_vector(4 downto 0)) return std_ulogic_vector is + begin + if to_integer(unsigned(reg)) = 0 then + return x"0000000000000000"; + else + return ra; + end if; + end; + + function byte_reverse(val: std_ulogic_vector(63 downto 0); size: integer) return std_ulogic_vector is + variable ret : std_ulogic_vector(63 downto 0) := (others => '0'); + begin + -- Vivado doesn't support non constant vector slices, so we have to code + -- each of these. + case_0: case size is + when 2 => + for_2 : for k in 0 to 1 loop + ret(((8*k)+7) downto (8*k)) := val((8*(1-k)+7) downto (8*(1-k))); + end loop; + when 4 => + for_4 : for k in 0 to 3 loop + ret(((8*k)+7) downto (8*k)) := val((8*(3-k)+7) downto (8*(3-k))); + end loop; + when 8 => + for_8 : for k in 0 to 7 loop + ret(((8*k)+7) downto (8*k)) := val((8*(7-k)+7) downto (8*(7-k))); + end loop; + when others => + report "bad byte reverse length " & integer'image(size) severity failure; + end case; + + return ret; + end; + + function sign_extend(val: std_ulogic_vector(63 downto 0); size: natural) return std_ulogic_vector is + variable ret : signed(63 downto 0) := (others => '0'); + variable upper : integer := 0; + begin + case_0: case size is + when 2 => + ret := resize(signed(val(15 downto 0)), 64); + when 4 => + ret := resize(signed(val(31 downto 0)), 64); + when 8 => + ret := resize(signed(val(63 downto 0)), 64); + when others => + report "bad byte reverse length " & integer'image(size) severity failure; + end case; + + return std_ulogic_vector(ret); + + end; end package body helpers; diff --git a/insn_helpers.vhdl b/insn_helpers.vhdl index 09d3b98..e91e9e6 100644 --- a/insn_helpers.vhdl +++ b/insn_helpers.vhdl @@ -2,162 +2,162 @@ library ieee; use ieee.std_logic_1164.all; package insn_helpers is - function insn_rs (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_rt (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_ra (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_rb (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_si (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_ui (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_l (insn_in : std_ulogic_vector) return std_ulogic; - function insn_sh32 (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_mb32 (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_me32 (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_li (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_lk (insn_in : std_ulogic_vector) return std_ulogic; - function insn_rc (insn_in : std_ulogic_vector) return std_ulogic; - function insn_bd (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_bf (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_fxm (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_bo (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_bi (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_bh (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_d (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_ds (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_to (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_bc (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_sh (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_me (insn_in : std_ulogic_vector) return std_ulogic_vector; - function insn_mb (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_rs (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_rt (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_ra (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_rb (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_si (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_ui (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_l (insn_in : std_ulogic_vector) return std_ulogic; + function insn_sh32 (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_mb32 (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_me32 (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_li (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_lk (insn_in : std_ulogic_vector) return std_ulogic; + function insn_rc (insn_in : std_ulogic_vector) return std_ulogic; + function insn_bd (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_bf (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_fxm (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_bo (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_bi (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_bh (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_d (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_ds (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_to (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_bc (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_sh (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_me (insn_in : std_ulogic_vector) return std_ulogic_vector; + function insn_mb (insn_in : std_ulogic_vector) return std_ulogic_vector; end package insn_helpers; package body insn_helpers is - function insn_rs (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(25 downto 21); - end; - - function insn_rt (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(25 downto 21); - end; - - function insn_ra (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(20 downto 16); - end; - - function insn_rb (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(15 downto 11); - end; - - function insn_si (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(15 downto 0); - end; - - function insn_ui (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(15 downto 0); - end; - - function insn_l (insn_in : std_ulogic_vector) return std_ulogic is - begin - return insn_in(21); - end; - - function insn_sh32 (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(15 downto 11); - end; - - function insn_mb32 (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(10 downto 6); - end; - - function insn_me32 (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(5 downto 1); - end; - - function insn_li (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(25 downto 2); - end; - - function insn_lk (insn_in : std_ulogic_vector) return std_ulogic is - begin - return insn_in(0); - end; - - function insn_rc (insn_in : std_ulogic_vector) return std_ulogic is - begin - return insn_in(0); - end; - - function insn_bd (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(15 downto 2); - end; - - function insn_bf (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(25 downto 23); - end; - - function insn_fxm (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(19 downto 12); - end; - - function insn_bo (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(25 downto 21); - end; - - function insn_bi (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(20 downto 16); - end; - - function insn_bh (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(12 downto 11); - end; - - function insn_d (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(15 downto 0); - end; - - function insn_ds (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(15 downto 2); - end; - - function insn_to (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(25 downto 21); - end; - - function insn_bc (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(10 downto 6); - end; - - function insn_sh (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(1) & insn_in(15 downto 11); - end; - - function insn_me (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(5) & insn_in(10 downto 6); - end; - - function insn_mb (insn_in : std_ulogic_vector) return std_ulogic_vector is - begin - return insn_in(5) & insn_in(10 downto 6); - end; + function insn_rs (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(25 downto 21); + end; + + function insn_rt (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(25 downto 21); + end; + + function insn_ra (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(20 downto 16); + end; + + function insn_rb (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(15 downto 11); + end; + + function insn_si (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(15 downto 0); + end; + + function insn_ui (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(15 downto 0); + end; + + function insn_l (insn_in : std_ulogic_vector) return std_ulogic is + begin + return insn_in(21); + end; + + function insn_sh32 (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(15 downto 11); + end; + + function insn_mb32 (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(10 downto 6); + end; + + function insn_me32 (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(5 downto 1); + end; + + function insn_li (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(25 downto 2); + end; + + function insn_lk (insn_in : std_ulogic_vector) return std_ulogic is + begin + return insn_in(0); + end; + + function insn_rc (insn_in : std_ulogic_vector) return std_ulogic is + begin + return insn_in(0); + end; + + function insn_bd (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(15 downto 2); + end; + + function insn_bf (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(25 downto 23); + end; + + function insn_fxm (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(19 downto 12); + end; + + function insn_bo (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(25 downto 21); + end; + + function insn_bi (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(20 downto 16); + end; + + function insn_bh (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(12 downto 11); + end; + + function insn_d (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(15 downto 0); + end; + + function insn_ds (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(15 downto 2); + end; + + function insn_to (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(25 downto 21); + end; + + function insn_bc (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(10 downto 6); + end; + + function insn_sh (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(1) & insn_in(15 downto 11); + end; + + function insn_me (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(5) & insn_in(10 downto 6); + end; + + function insn_mb (insn_in : std_ulogic_vector) return std_ulogic_vector is + begin + return insn_in(5) & insn_in(10 downto 6); + end; end package body insn_helpers;