------------------------------------------------------------ -- 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;