------------------------------------------------------------
-- Copyright: 2011 George Mason University, Virginia USA
-- http://www.iis.ee.ethz.ch/~sha3
------------------------------------------------------------
-- =====================================================================
-- Copyright © 2010-2011 by Cryptographic Engineering Research Group (CERG),
-- ECE Department, George Mason University
-- Fairfax, VA, U.S.A.
-- =====================================================================
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
use work.sha3_pkg.all;
use work.sha3_blake_package.all;
entity gfunc_modified is
generic ( iw : integer := 32;
h : integer := 256;
ADDER_TYPE : integer := SCCA_BASED );
port(
ain : in std_logic_vector(iw-1 downto 0);
bin : in std_logic_vector(iw-1 downto 0);
cin : in std_logic_vector(iw-1 downto 0);
din : in std_logic_vector(iw-1 downto 0);
const_0 : in std_logic_vector(iw-1 downto 0);
const_1 : in std_logic_vector(iw-1 downto 0);
aout : out std_logic_vector(iw-1 downto 0);
bout : out std_logic_vector(iw-1 downto 0);
cout : out std_logic_vector(iw-1 downto 0);
dout : out std_logic_vector(iw-1 downto 0)
);
end gfunc_modified;
--}} end of automatically maintained section
architecture struct of gfunc_modified is
signal csa_a1_1, csa_a1_2, csa_a2_1, csa_a2_2 : std_logic_vector(iw-1 downto 0);
signal D_hold2, D_hold3 : STD_LOGIC_VECTOR(iw-1 downto 0);
signal hold_D1, hold_B2 : STD_LOGIC_VECTOR(iw-1 downto 0);
signal hold_B1, hold_D2 : STD_LOGIC_VECTOR(iw-1 downto 0);
signal D_hold5, D_hold6 : STD_LOGIC_VECTOR(iw-1 downto 0);
signal hold_A1, hold_C1 : std_logic_vector (iw-1 downto 0);
signal hold_A2, hold_C2 : std_logic_vector (iw-1 downto 0);
begin
D_hold2 <= din xor hold_A1;
hold_C1 <= hold_D1+ cin;
D_hold3 <= hold_C1 xor bin;
D_hold5 <= hold_A2 xor hold_D1;
hold_C2 <= hold_C1 + hold_D2;
D_hold6 <= hold_C2 xor hold_B1;
-- output data
aout <= hold_A2;
bout <= hold_B2;
cout <= hold_C2;
dout <= hold_D2;
SCCA_BASED_GEN : if ADDER_TYPE = SCCA_BASED generate
hold_A1 <= const_0 + ain + bin;
hold_A2 <= const_1 + hold_A1 + hold_B1;
end generate;
CSA_BASED_GEN : if ADDER_TYPE = CSA_BASED generate
csa_a1 : csa generic map ( n => iw ) port map ( a => const_0, b => ain, cin => bin, s => csa_a1_1,cout => csa_a1_2);
csa_a2 : csa generic map ( n => iw ) port map ( a => const_1, b => hold_A1, cin => hold_B1, s => csa_a2_1,cout => csa_a2_2);
hold_A1 <= csa_a1_1 + (csa_a1_2(iw-2 downto 0) & '0');
hold_A2 <= csa_a2_1 + (csa_a2_2(iw-2 downto 0) & '0');
end generate;
arch_32 : if h <= 256 generate
hold_d1 <= rolx(D_hold2, 32-g_rot_arch32(0));
hold_B1 <= rolx(D_hold3, 32-g_rot_arch32(1));
hold_D2 <= rolx(D_hold5, 32-g_rot_arch32(2));
hold_B2 <= rolx(D_hold6, 32-g_rot_arch32(3));
end generate;
arch_64 : if h > 256 generate
hold_d1 <= rolx(D_hold2, 64-g_rot_arch64(0));
hold_B1 <= rolx(D_hold3, 64-g_rot_arch64(1));
hold_D2 <= rolx(D_hold5, 64-g_rot_arch64(2));
hold_B2 <= rolx(D_hold6, 64-g_rot_arch64(3));
end generate;
end struct;