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

Generated on Fri Sep 24 10:39:12 CEST 2010
Home