-- Copyright 2000 UCR all rights reserved
-- this program may be copy or altered so
-- long as this header stays intake
-- Original design Randy January rjanuary@cs.ucr.edu

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;

entity scpu_shftr is
  
  port (
    reset    : in  std_logic;
    shft_sel : in unsigned (1 downto 0); 
    Input    : in  unsigned (31 downto 0);
    Output   : out unsigned (31 downto 0)
    );

end scpu_shftr;

architecture beh of scpu_shftr is

begin  

  process(reset, shft_sel, Input)
    begin

--****************************************************************************
      
      if (reset = '1') then
        
        Output <= "00000000000000000000000000000000";

--****************************************************************************
        
      else
        
        case shft_sel is

          -- pass
          when "00" => Output <= Input;

          -- shift right
          when "01" => 
		  Output(0) <= Input(1);
		  Output(1) <= Input(2);
		  Output(2) <= Input(3);
		  Output(3) <= Input(4);
		  Output(4) <= Input(5);
		  Output(5) <= Input(6);	
		  Output(6) <= Input(7);
		  Output(7) <= Input(8);
                  Output(8) <= Input(9);
		  Output(9) <= Input(10);
		  Output(10) <= Input(11);
		  Output(11) <= Input(12);
		  Output(12) <= Input(13);
		  Output(13) <= Input(14);	
		  Output(14) <= Input(15);
		  Output(15) <= Input(16);
                  Output(16) <= Input(17);
		  Output(17) <= Input(18);
		  Output(18) <= Input(19);
		  Output(19) <= Input(20);
		  Output(20) <= Input(21);
		  Output(21) <= Input(22);	
		  Output(22) <= Input(23);
		  Output(23) <= Input(24);
                  Output(24) <= Input(25);
		  Output(25) <= Input(26);
		  Output(26) <= Input(27);
		  Output(27) <= Input(28);
		  Output(28) <= Input(29);
		  Output(29) <= Input(30);	
		  Output(30) <= Input(31);
		  Output(31) <= '0';

          -- shift left
          when "10" =>
                  Output(31) <= Input(30);
		  Output(30) <= Input(29);
		  Output(29) <= Input(28);
		  Output(28) <= Input(27);
		  Output(27) <= Input(26);
		  Output(26) <= Input(25);	
		  Output(25) <= Input(24);
		  Output(24) <= Input(23);
                  Output(23) <= Input(22);
		  Output(22) <= Input(21);
		  Output(21) <= Input(20);
		  Output(20) <= Input(19);
		  Output(19) <= Input(18);
		  Output(18) <= Input(17);	
		  Output(17) <= Input(16);
		  Output(16) <= Input(15);
                  Output(15) <= Input(14);
		  Output(14) <= Input(13);
		  Output(13) <= Input(12);
		  Output(12) <= Input(11);
		  Output(11) <= Input(10);
		  Output(10) <= Input(9);	
		  Output(9) <= Input(8);
		  Output(8) <= Input(7);
		  Output(7) <= Input(6);
		  Output(6) <= Input(5);
		  Output(5) <= Input(4);
		  Output(4) <= Input(3);
		  Output(3) <= Input(2);
		  Output(2) <= Input(1);	
		  Output(1) <= Input(0);
		  Output(0) <= '0';
          when others => null;
        end case;
      end if;
    end process;
end beh;



