------------------------------------------------------------
-- Copyright: 2010 Integrated Sytems Laboratory, ETH Zurich
-- http://www.iis.ee.ethz.ch/~sha3
------------------------------------------------------------
library ieee;
use ieee.numeric_std.all;
use ieee.std_logic_1164.all;
use work.luffapkg.all;
entity step is
port (
StateInxDI : in data;
CInxDI : in constcouple;
StateOutxDO : out data;
COutxDO : out constcouple);
end step;
architecture rtl of step is
component subcrumb
port (
SxDI : in halfdata;
SxDO : out halfdata);
end component;
component mixword
port (
MxDI : in mixdata;
MxDO : out mixdata);
end component;
signal SubCrumbIn1xD, SubCrumbOut1xD : halfdata;
signal SubCrumbIn2xD, SubCrumbOut2xD : halfdata;
signal MixWordIn1xD, MixWordOut1xD : mixdata;
signal MixWordIn2xD, MixWordOut2xD : mixdata;
signal MixWordIn3xD, MixWordOut3xD : mixdata;
signal MixWordIn4xD, MixWordOut4xD : mixdata;
signal CnsxD : constcouple;
signal TmpCxD, TmpC1xD, TmpC2xD, TmpC3xD : constcouple;
begin -- rtl
subcrumb_1: subcrumb
port map (
SxDI => SubCrumbIn1xD,
SxDO => SubCrumbOut1xD);
subcrumb_2: subcrumb
port map (
SxDI => SubCrumbIn2xD,
SxDO => SubCrumbOut2xD);
mixword_1: mixword
port map (
MxDI => MixWordIn1xD,
MxDO => MixWordOut1xD);
mixword_2: mixword
port map (
MxDI => MixWordIn2xD,
MxDO => MixWordOut2xD);
mixword_3: mixword
port map (
MxDI => MixWordIn3xD,
MxDO => MixWordOut3xD);
mixword_4: mixword
port map (
MxDI => MixWordIn4xD,
MxDO => MixWordOut4xD);
sc01: for i in 0 to 3 generate
SubCrumbIn1xD(i) <= StateInxDI(i);
end generate sc01;
SubCrumbIn2xD(0) <= StateInxDI(5);
SubCrumbIn2xD(1) <= StateInxDI(6);
SubCrumbIn2xD(2) <= StateInxDI(7);
SubCrumbIn2xD(3) <= StateInxDI(4);
-- Connections
-----------------------------------------------------------------------------
MixWordIn1xD(0) <= SubCrumbOut1xD(0);
MixWordIn2xD(0) <= SubCrumbOut1xD(1);
MixWordIn3xD(0) <= SubCrumbOut1xD(2);
MixWordIn4xD(0) <= SubCrumbOut1xD(3);
MixWordIn1xD(1) <= SubCrumbOut2xD(3);
MixWordIn2xD(1) <= SubCrumbOut2xD(0);
MixWordIn3xD(1) <= SubCrumbOut2xD(1);
MixWordIn4xD(1) <= SubCrumbOut2xD(2);
-- Constants Generator
-----------------------------------------------------------------------------
constgen: process (CInxDI, TmpCxD)
begin
TmpCxD(0)(31) <= CInxDI(0)(30) xor CInxDI(0)(31);
TmpCxD(0)(30) <= CInxDI(0)(29) xor CInxDI(0)(31);
TmpCxD(0)(29) <= CInxDI(0)(28);
TmpCxD(0)(28) <= CInxDI(0)(27);
TmpCxD(0)(27) <= CInxDI(0)(26);
TmpCxD(0)(26) <= CInxDI(0)(25) xor CInxDI(0)(31);
TmpCxD(0)(25) <= CInxDI(0)(24);
TmpCxD(0)(24) <= CInxDI(0)(23);
TmpCxD(0)(23) <= CInxDI(0)(22) xor CInxDI(0)(31);
TmpCxD(0)(22) <= CInxDI(0)(21) xor CInxDI(0)(31);
TmpCxD(0)(21) <= CInxDI(0)(20);
TmpCxD(0)(20) <= CInxDI(0)(19) xor CInxDI(0)(31);
TmpCxD(0)(19) <= CInxDI(0)(18);
TmpCxD(0)(18) <= CInxDI(0)(17) xor CInxDI(0)(31);
TmpCxD(0)(17) <= CInxDI(0)(16) xor CInxDI(0)(31);
TmpCxD(0)(16) <= CInxDI(0)(15);
TmpCxD(0)(15) <= CInxDI(0)(14);
TmpCxD(0)(14) <= CInxDI(0)(13) xor CInxDI(0)(31);
TmpCxD(0)(13) <= CInxDI(0)(12);
TmpCxD(0)(12) <= CInxDI(0)(11);
TmpCxD(0)(11) <= CInxDI(0)(10) xor CInxDI(0)(31);
TmpCxD(0)(10) <= CInxDI(0)(9);
TmpCxD(0)(9) <= CInxDI(0)(8);
TmpCxD(0)(8) <= CInxDI(0)(7) xor CInxDI(0)(31);
TmpCxD(0)(7) <= CInxDI(0)(6);
TmpCxD(0)(6) <= CInxDI(0)(5) xor CInxDI(0)(31);
TmpCxD(0)(5) <= CInxDI(0)(4) xor CInxDI(0)(31);
TmpCxD(0)(4) <= CInxDI(0)(3);
TmpCxD(0)(3) <= CInxDI(0)(2) xor CInxDI(0)(31);
TmpCxD(0)(2) <= CInxDI(0)(1) xor CInxDI(0)(31);
TmpCxD(0)(1) <= CInxDI(0)(0);
TmpCxD(0)(0) <= CInxDI(1)(31);
TmpCxD(1)(31) <= CInxDI(1)(30);
TmpCxD(1)(30) <= CInxDI(1)(29) xor CInxDI(0)(31);
TmpCxD(1)(29) <= CInxDI(1)(28);
TmpCxD(1)(28) <= CInxDI(1)(27) xor CInxDI(0)(31);
TmpCxD(1)(27) <= CInxDI(1)(26);
TmpCxD(1)(26) <= CInxDI(1)(25) xor CInxDI(0)(31);
TmpCxD(1)(25) <= CInxDI(1)(24);
TmpCxD(1)(24) <= CInxDI(1)(23) xor CInxDI(0)(31);
TmpCxD(1)(23) <= CInxDI(1)(22) xor CInxDI(0)(31);
TmpCxD(1)(22) <= CInxDI(1)(21) xor CInxDI(0)(31);
TmpCxD(1)(21) <= CInxDI(1)(20);
TmpCxD(1)(20) <= CInxDI(1)(19);
TmpCxD(1)(19) <= CInxDI(1)(18);
TmpCxD(1)(18) <= CInxDI(1)(17) xor CInxDI(0)(31);
TmpCxD(1)(17) <= CInxDI(1)(16) xor CInxDI(0)(31);
TmpCxD(1)(16) <= CInxDI(1)(15);
TmpCxD(1)(15) <= CInxDI(1)(14);
TmpCxD(1)(14) <= CInxDI(1)(13);
TmpCxD(1)(13) <= CInxDI(1)(12);
TmpCxD(1)(12) <= CInxDI(1)(11) xor CInxDI(0)(31);
TmpCxD(1)(11) <= CInxDI(1)(10) xor CInxDI(0)(31);
TmpCxD(1)(10) <= CInxDI(1)(9) xor CInxDI(0)(31);
TmpCxD(1)(9) <= CInxDI(1)(8);
TmpCxD(1)(8) <= CInxDI(1)(7);
TmpCxD(1)(7) <= CInxDI(1)(6) xor CInxDI(0)(31);
TmpCxD(1)(6) <= CInxDI(1)(5);
TmpCxD(1)(5) <= CInxDI(1)(4);
TmpCxD(1)(4) <= CInxDI(1)(3);
TmpCxD(1)(3) <= CInxDI(1)(2) xor CInxDI(0)(31);
TmpCxD(1)(2) <= CInxDI(1)(1) xor CInxDI(0)(31);
TmpCxD(1)(1) <= CInxDI(1)(0);
TmpCxD(1)(0) <= CInxDI(0)(31);
TmpC1xD(0)(31) <= TmpCxD(1)(30) xor TmpCxD(1)(31);
TmpC1xD(0)(30) <= TmpCxD(1)(29) xor TmpCxD(1)(31);
TmpC1xD(0)(29) <= TmpCxD(1)(28);
TmpC1xD(0)(28) <= TmpCxD(1)(27);
TmpC1xD(0)(27) <= TmpCxD(1)(26);
TmpC1xD(0)(26) <= TmpCxD(1)(25) xor TmpCxD(1)(31);
TmpC1xD(0)(25) <= TmpCxD(1)(24);
TmpC1xD(0)(24) <= TmpCxD(1)(23);
TmpC1xD(0)(23) <= TmpCxD(1)(22) xor TmpCxD(1)(31);
TmpC1xD(0)(22) <= TmpCxD(1)(21) xor TmpCxD(1)(31);
TmpC1xD(0)(21) <= TmpCxD(1)(20);
TmpC1xD(0)(20) <= TmpCxD(1)(19) xor TmpCxD(1)(31);
TmpC1xD(0)(19) <= TmpCxD(1)(18);
TmpC1xD(0)(18) <= TmpCxD(1)(17) xor TmpCxD(1)(31);
TmpC1xD(0)(17) <= TmpCxD(1)(16) xor TmpCxD(1)(31);
TmpC1xD(0)(16) <= TmpCxD(1)(15);
TmpC1xD(0)(15) <= TmpCxD(1)(14);
TmpC1xD(0)(14) <= TmpCxD(1)(13) xor TmpCxD(1)(31);
TmpC1xD(0)(13) <= TmpCxD(1)(12);
TmpC1xD(0)(12) <= TmpCxD(1)(11);
TmpC1xD(0)(11) <= TmpCxD(1)(10) xor TmpCxD(1)(31);
TmpC1xD(0)(10) <= TmpCxD(1)(9);
TmpC1xD(0)(9) <= TmpCxD(1)(8);
TmpC1xD(0)(8) <= TmpCxD(1)(7) xor TmpCxD(1)(31);
TmpC1xD(0)(7) <= TmpCxD(1)(6);
TmpC1xD(0)(6) <= TmpCxD(1)(5) xor TmpCxD(1)(31);
TmpC1xD(0)(5) <= TmpCxD(1)(4) xor TmpCxD(1)(31);
TmpC1xD(0)(4) <= TmpCxD(1)(3);
TmpC1xD(0)(3) <= TmpCxD(1)(2) xor TmpCxD(1)(31);
TmpC1xD(0)(2) <= TmpCxD(1)(1) xor TmpCxD(1)(31);
TmpC1xD(0)(1) <= TmpCxD(1)(0);
TmpC1xD(0)(0) <= TmpCxD(0)(31);
TmpC1xD(1)(31) <= TmpCxD(0)(30);
TmpC1xD(1)(30) <= TmpCxD(0)(29) xor TmpCxD(1)(31);
TmpC1xD(1)(29) <= TmpCxD(0)(28);
TmpC1xD(1)(28) <= TmpCxD(0)(27) xor TmpCxD(1)(31);
TmpC1xD(1)(27) <= TmpCxD(0)(26);
TmpC1xD(1)(26) <= TmpCxD(0)(25) xor TmpCxD(1)(31);
TmpC1xD(1)(25) <= TmpCxD(0)(24);
TmpC1xD(1)(24) <= TmpCxD(0)(23) xor TmpCxD(1)(31);
TmpC1xD(1)(23) <= TmpCxD(0)(22) xor TmpCxD(1)(31);
TmpC1xD(1)(22) <= TmpCxD(0)(21) xor TmpCxD(1)(31);
TmpC1xD(1)(21) <= TmpCxD(0)(20);
TmpC1xD(1)(20) <= TmpCxD(0)(19);
TmpC1xD(1)(19) <= TmpCxD(0)(18);
TmpC1xD(1)(18) <= TmpCxD(0)(17) xor TmpCxD(1)(31);
TmpC1xD(1)(17) <= TmpCxD(0)(16) xor TmpCxD(1)(31);
TmpC1xD(1)(16) <= TmpCxD(0)(15);
TmpC1xD(1)(15) <= TmpCxD(0)(14);
TmpC1xD(1)(14) <= TmpCxD(0)(13);
TmpC1xD(1)(13) <= TmpCxD(0)(12);
TmpC1xD(1)(12) <= TmpCxD(0)(11) xor TmpCxD(1)(31);
TmpC1xD(1)(11) <= TmpCxD(0)(10) xor TmpCxD(1)(31);
TmpC1xD(1)(10) <= TmpCxD(0)(9) xor TmpCxD(1)(31);
TmpC1xD(1)(9) <= TmpCxD(0)(8);
TmpC1xD(1)(8) <= TmpCxD(0)(7);
TmpC1xD(1)(7) <= TmpCxD(0)(6) xor TmpCxD(1)(31);
TmpC1xD(1)(6) <= TmpCxD(0)(5);
TmpC1xD(1)(5) <= TmpCxD(0)(4);
TmpC1xD(1)(4) <= TmpCxD(0)(3);
TmpC1xD(1)(3) <= TmpCxD(0)(2) xor TmpCxD(1)(31);
TmpC1xD(1)(2) <= TmpCxD(0)(1) xor TmpCxD(1)(31);
TmpC1xD(1)(1) <= TmpCxD(0)(0);
TmpC1xD(1)(0) <= TmpCxD(1)(31);
end process constgen;
CnsxD(0) <= TmpCxD(0);
CnsxD(1) <= TmpC1xD(0);
COutxDO(0) <= TmpC1xD(1);
COutxDO(1) <= CnsxD(1);
-- Output
-----------------------------------------------------------------------------
StateOutxDO(0) <= MixWordOut1xD(0) xor CnsxD(0);
StateOutxDO(1) <= MixWordOut2xD(0);
StateOutxDO(2) <= MixWordOut3xD(0);
StateOutxDO(3) <= MixWordOut4xD(0);
StateOutxDO(4) <= MixWordOut1xD(1) xor CnsxD(1);
StateOutxDO(5) <= MixWordOut2xD(1);
StateOutxDO(6) <= MixWordOut3xD(1);
StateOutxDO(7) <= MixWordOut4xD(1);
end rtl;