OpenCores
URL https://opencores.org/ocsvn/des/des/trunk

Subversion Repositories des

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 6 to Rev 7
    Reverse comparison

Rev 6 → Rev 7

/trunk/bench/verilog/des3_test_po.v
0,0 → 1,155
/////////////////////////////////////////////////////////////////////
//// ////
//// DES TEST BENCH ////
//// ////
//// Author: Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2001 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
//// ////
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ////
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ////
//// POSSIBILITY OF SUCH DAMAGE. ////
//// ////
/////////////////////////////////////////////////////////////////////
 
module test;
 
reg clk;
reg [319:0] x[512:0];
reg [319:0] tmp;
reg [3:0] cnt;
integer select;
wire [63:0] desOut;
wire [63:0] des_in;
wire [63:0] exp_out_d;
wire [55:0] key1;
wire [55:0] key2;
wire [55:0] key3;
integer ZZZ;
reg [63:0] des_exp[0:52];
integer decrypt;
 
integer i;
 
always @(posedge clk)
des_exp[0] <= #1 exp_out_d;
 
always @(posedge clk)
for(i=0;i<51;i=i+1)
des_exp[i+1] <= #1 des_exp[i];
initial
begin
$display("\n\n");
$display("*********************************************************");
$display("* Performance Optimized DES core simulation started ... *");
$display("*********************************************************");
$display("\n");
 
`ifdef WAVES
$shm_open("waves");
$shm_probe("AS",test,"AS");
$display("INFO: Signal dump enabled ...\n\n");
`endif
clk=0;
ZZZ=0;
 
// key1 key2 key3 Test data Out data
x[0]=320'h0101010101010101_0101010101010101_0101010101010101_95F8A5E5DD31D900_8000000000000000;
x[1]=320'h0101010101010101_0101010101010101_0101010101010101_9D64555A9A10B852_0000001000000000;
x[2]=320'h3849674C2602319E_3849674C2602319E_3849674C2602319E_51454B582DDF440A_7178876E01F19B2A;
x[3]=320'h04B915BA43FEB5B6_04B915BA43FEB5B6_04B915BA43FEB5B6_42FD443059577FA2_AF37FB421F8C4095;
x[4]=320'h0123456789ABCDEF_0123456789ABCDEF_0123456789ABCDEF_736F6D6564617461_3D124FE2198BA318;
x[5]=320'h0123456789ABCDEF_5555555555555555_0123456789ABCDEF_736F6D6564617461_FBABA1FF9D05E9B1;
x[6]=320'h0123456789ABCDEF_5555555555555555_FEDCBA9876543210_736F6D6564617461_18d748e563620572;
x[7]=320'h0352020767208217_8602876659082198_64056ABDFEA93457_7371756967676C65_c07d2a0fa566fa30;
x[8]=320'h0101010101010101_8001010101010101_0101010101010102_0000000000000000_e6e6dd5b7e722974;
x[9]=320'h1046103489988020_9107D01589190101_19079210981A0101_0000000000000000_e1ef62c332fe825b;
 
 
// Wait for clock edge
decrypt = 0;
@(posedge clk);
 
$display("");
$display("**************************************");
$display("* Starting DES Test ... *");
$display("**************************************");
$display("");
 
for(decrypt=0;decrypt<2;decrypt=decrypt+1)
begin
if(decrypt) $display("Running Encrypt test ...\n");
else $display("Running Decrypt test ...\n");
// Begin for loop
for(select=0;select<(9+50);select=select+1)
begin
tmp=x[select];
@(posedge clk);
if(select>50)
if((des_exp[50] !== desOut) | (^des_exp[50]===1'bx) | (^desOut===1'bx))
$display("ERROR: (%0d) Expected %x Got %x", select-51, des_exp[50], desOut);
else
$display("PASS : (%0d) Expected %x Got %x", select-51, des_exp[50], desOut);
 
//#2 $display("%h %h %h %h %h", key3, key2, key1, des_in, exp_out_d);
end
end
 
$display("");
$display("**************************************");
$display("* DES Test done ... *");
$display("**************************************");
$display("");
 
$finish;
end // end of initial
 
// DES Clock
always #50 clk=~clk;
 
// Create the key w/o the parity bits
assign #1 key1 = {tmp[319:313],tmp[311:305],tmp[303:297],tmp[295:289],
tmp[287:281],tmp[279:273],tmp[271:265],tmp[263:257]};
 
assign #1 key2 = {tmp[255:249],tmp[247:241],tmp[239:233],tmp[231:225],
tmp[223:217],tmp[215:209],tmp[207:201],tmp[199:193]};
 
assign #1 key3 = {tmp[191:185],tmp[183:177],tmp[175:169],tmp[167:161],
tmp[159:153],tmp[151:145],tmp[143:137],tmp[135:129]};
 
assign #1 des_in = decrypt[0] ? tmp[63:0] : tmp[127:64];
assign exp_out_d = decrypt[0] ? tmp[127:64] : tmp[63:0];
 
// The DES instance
des3 u0(.clk( clk ),
.desOut( desOut ),
.desIn( des_in ),
.key1( key1 ),
.key2( key2 ),
.key3( key3 ),
.decrypt( decrypt[0] )
);
 
endmodule
/trunk/bench/verilog/des3_test_ao.v
0,0 → 1,148
/////////////////////////////////////////////////////////////////////
//// ////
//// DES TEST BENCH ////
//// ////
//// Author: Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2001 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
//// ////
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ////
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ////
//// POSSIBILITY OF SUCH DAMAGE. ////
//// ////
/////////////////////////////////////////////////////////////////////
 
module test;
 
reg clk;
reg [319:0] x[512:0];
 
reg [319:0] tmp;
 
reg [5:0] cnt;
integer select;
integer decrypt;
wire [63:0] desOut;
wire [63:0] des_in;
wire [63:0] exp_out;
wire [55:0] key1;
wire [55:0] key2;
wire [55:0] key3;
integer ZZZ;
 
initial
begin
$display("\n\n");
$display("*********************************************************");
$display("* Area Optimized DES core simulation started ... *");
$display("*********************************************************");
$display("\n");
 
`ifdef WAVES
$shm_open("waves");
$shm_probe("AS",test,"AS");
$display("INFO: Signal dump enabled ...\n\n");
`endif
 
clk=0;
 
ZZZ=0;
// key1 key2 key3 Test data Out data
x[0]=320'h0101010101010101_0101010101010101_0101010101010101_95F8A5E5DD31D900_8000000000000000;
x[1]=320'h0101010101010101_0101010101010101_0101010101010101_9D64555A9A10B852_0000001000000000;
x[2]=320'h3849674C2602319E_3849674C2602319E_3849674C2602319E_51454B582DDF440A_7178876E01F19B2A;
x[3]=320'h04B915BA43FEB5B6_04B915BA43FEB5B6_04B915BA43FEB5B6_42FD443059577FA2_AF37FB421F8C4095;
x[4]=320'h0123456789ABCDEF_0123456789ABCDEF_0123456789ABCDEF_736F6D6564617461_3D124FE2198BA318;
x[5]=320'h0123456789ABCDEF_5555555555555555_0123456789ABCDEF_736F6D6564617461_FBABA1FF9D05E9B1;
x[6]=320'h0123456789ABCDEF_5555555555555555_FEDCBA9876543210_736F6D6564617461_18d748e563620572;
x[7]=320'h0352020767208217_8602876659082198_64056ABDFEA93457_7371756967676C65_c07d2a0fa566fa30;
x[8]=320'h0101010101010101_8001010101010101_0101010101010102_0000000000000000_e6e6dd5b7e722974;
x[9]=320'h1046103489988020_9107D01589190101_19079210981A0101_0000000000000000_e1ef62c332fe825b;
 
decrypt = 0;
@(posedge clk);
$display("");
$display("**************************************");
$display("* Starting DES Test ... *");
$display("**************************************");
$display("");
for(decrypt=0;decrypt<2;decrypt=decrypt+1)
begin
if(decrypt) $display("Running Encrypt test ...\n");
else $display("Running Decrypt test ...\n");
 
for(select=0;select<16;select=select+1)
begin
tmp=x[select];
for(cnt=0;cnt<47;cnt=cnt+1) @(posedge clk);
 
#10;
if((exp_out !== desOut) | (^exp_out===1'bx) | (^desOut===1'bx))
 
$display("ERROR: (%0d) Expected %x Got %x", select, exp_out, desOut);
else
$display("PASS : (%0d) Expected %x Got %x", select, exp_out, desOut);
 
//#2 $display("%h %h %h %h %h", key3, key2, key1, des_in, exp_out);
@(posedge clk);
end
end
 
$display("");
$display("**************************************");
$display("* DES Test done ... *");
$display("**************************************");
$display("");
 
$finish;
end // end of innitial
 
always #100 clk=~clk;
 
assign #1 key1 = {tmp[319:313],tmp[311:305],tmp[303:297],tmp[295:289],
tmp[287:281],tmp[279:273],tmp[271:265],tmp[263:257]};
 
assign #1 key2 = {tmp[255:249],tmp[247:241],tmp[239:233],tmp[231:225],
tmp[223:217],tmp[215:209],tmp[207:201],tmp[199:193]};
 
assign #1 key3 = {tmp[191:185],tmp[183:177],tmp[175:169],tmp[167:161],
tmp[159:153],tmp[151:145],tmp[143:137],tmp[135:129]};
 
 
assign #1 des_in = decrypt[0] ? tmp[63:0] : tmp[127:64];
assign exp_out = decrypt[0] ? tmp[127:64] : tmp[63:0];
 
des3 u0( .clk( clk ),
.desOut( desOut ),
.desIn( des_in ),
.key1( key1 ),
.key2( key2 ),
.key3( key3 ),
.roundSel( cnt ),
.decrypt( decrypt[0] )
);
 
endmodule
/trunk/bench/verilog/des_test_po.v
34,7 → 34,7
module test;
 
reg clk;
reg [191:0] x[128:0];
reg [191:0] x[512:0];
reg [191:0] tmp;
reg [3:0] cnt;
integer select;
42,6 → 42,7
wire [63:0] des_in;
wire [63:0] exp_out_d;
wire [55:0] key;
integer ZZZ;
reg [63:0] des_exp[0:17];
integer decrypt;
 
68,98 → 69,344
$display("INFO: Signal dump enabled ...\n\n");
`endif
clk=0;
ZZZ=0;
 
// Key Test data Out data
x[00]=192'h8001010101010101_0000000000000000_95A8D72813DAA94D;
x[01]=192'h4001010101010101_0000000000000000_0EEC1487DD8C26D5;
x[02]=192'h2001010101010101_0000000000000000_7AD16FFB79C45926;
x[03]=192'h1001010101010101_0000000000000000_D3746294CA6A6CF3;
x[04]=192'h0801010101010101_0000000000000000_809F5F873C1FD761;
x[05]=192'h0401010101010101_0000000000000000_C02FAFFEC989D1FC;
x[06]=192'h0201010101010101_0000000000000000_4615AA1D33E72F10;
x[07]=192'h0180010101010101_0000000000000000_2055123350C00858;
x[08]=192'h0140010101010101_0000000000000000_DF3B99D6577397C8;
x[09]=192'h0120010101010101_0000000000000000_31FE17369B5288C9;
x[10]=192'h0110010101010101_0000000000000000_DFDD3CC64DAE1642;
x[11]=192'h0108010101010101_0000000000000000_178C83CE2B399D94;
x[12]=192'h0104010101010101_0000000000000000_50F636324A9B7F80;
x[13]=192'h0102010101010101_0000000000000000_A8468EE3BC18F06D;
x[14]=192'h0101800101010101_0000000000000000_A2DC9E92FD3CDE92;
x[15]=192'h0101400101010101_0000000000000000_CAC09F797D031287;
x[16]=192'h0101200101010101_0000000000000000_90BA680B22AEB525;
x[17]=192'h0101100101010101_0000000000000000_CE7A24F350E280B6;
x[18]=192'h0101080101010101_0000000000000000_882BFF0AA01A0B87;
x[19]=192'h0101040101010101_0000000000000000_25610288924511C2;
x[20]=192'h0101020101010101_0000000000000000_C71516C29C75D170;
x[21]=192'h0101018001010101_0000000000000000_5199C29A52C9F059;
x[22]=192'h0101014001010101_0000000000000000_C22F0A294A71F29F;
x[23]=192'h0101012001010101_0000000000000000_EE371483714C02EA;
x[24]=192'h0101011001010101_0000000000000000_A81FBD448F9E522F;
x[25]=192'h0101010801010101_0000000000000000_4F644C92E192DFED;
x[26]=192'h0101010401010101_0000000000000000_1AFA9A66A6DF92AE;
x[27]=192'h0101010201010101_0000000000000000_B3C1CC715CB879D8;
x[28]=192'h0101010180010101_0000000000000000_19D032E64AB0BD8B;
x[29]=192'h0101010140010101_0000000000000000_3CFAA7A7DC8720DC;
x[30]=192'h0101010120010101_0000000000000000_B7265F7F447AC6F3;
x[31]=192'h0101010110010101_0000000000000000_9DB73B3C0D163F54;
x[32]=192'h0101010108010101_0000000000000000_8181B65BABF4A975;
x[33]=192'h0101010104010101_0000000000000000_93C9B64042EAA240;
x[34]=192'h0101010102010101_0000000000000000_5570530829705592;
x[35]=192'h0101010101800101_0000000000000000_8638809E878787A0;
x[36]=192'h0101010101400101_0000000000000000_41B9A79AF79AC208;
x[37]=192'h0101010101200101_0000000000000000_7A9BE42F2009A892;
x[38]=192'h0101010101100101_0000000000000000_29038D56BA6D2745;
x[39]=192'h0101010101080101_0000000000000000_5495C6ABF1E5DF51;
x[40]=192'h0101010101040101_0000000000000000_AE13DBD561488933;
x[41]=192'h0101010101020101_0000000000000000_024D1FFA8904E389;
x[42]=192'h0101010101018001_0000000000000000_D1399712F99BF02E;
x[43]=192'h0101010101014001_0000000000000000_14C1D7C1CFFEC79E;
x[44]=192'h0101010101012001_0000000000000000_1DE5279DAE3BED6F;
x[45]=192'h0101010101011001_0000000000000000_E941A33F85501303;
x[46]=192'h0101010101010801_0000000000000000_DA99DBBC9A03F379;
x[47]=192'h0101010101010401_0000000000000000_B7FC92F91D8E92E9;
x[48]=192'h0101010101010201_0000000000000000_AE8E5CAA3CA04E85;
x[49]=192'h0101010101010180_0000000000000000_9CC62DF43B6EED74;
x[50]=192'h0101010101010140_0000000000000000_D863DBB5C59A91A0;
x[51]=192'h0101010101010120_0000000000000000_A1AB2190545B91D7;
x[52]=192'h0101010101010110_0000000000000000_0875041E64C570F7;
x[53]=192'h0101010101010108_0000000000000000_5A594528BEBEF1CC;
x[54]=192'h0101010101010104_0000000000000000_FCDB3291DE21F0C0;
x[55]=192'h0101010101010102_0000000000000000_869EFD7F9F265A09;
x[56]=192'h0000000000000000_0000000000000000_8CA64DE9C1B123A7;
x[57]=192'hFFFFFFFFFFFFFFFF_FFFFFFFFFFFFFFFF_7359B2163E4EDC58;
x[58]=192'h3000000000000000_1000000000000001_958E6E627A05557B;
x[59]=192'h1111111111111111_1111111111111111_F40379AB9E0EC533;
x[60]=192'h0123456789ABCDEF_1111111111111111_17668DFC7292532D;
x[61]=192'h1111111111111111_0123456789ABCDEF_8A5AE1F81AB8F2DD;
x[62]=192'h0000000000000000_0000000000000000_8CA64DE9C1B123A7;
x[63]=192'hFEDCBA9876543210_0123456789ABCDEF_ED39D950FA74BCC4;
x[64]=192'h7CA110454A1A6E57_01A1D6D039776742_690F5B0D9A26939B;
x[65]=192'h0131D9619DC1376E_5CD54CA83DEF57DA_7A389D10354BD271;
x[66]=192'h07A1133E4A0B2686_0248D43806F67172_868EBB51CAB4599A;
x[67]=192'h3849674C2602319E_51454B582DDF440A_7178876E01F19B2A;
x[68]=192'h04B915BA43FEB5B6_42FD443059577FA2_AF37FB421F8C4095;
x[69]=192'h0113B970FD34F2CE_059B5E0851CF143A_86A560F10EC6D85B;
x[70]=192'h0170F175468FB5E6_0756D8E0774761D2_0CD3DA020021DC09;
x[71]=192'h43297FAD38E373FE_762514B829BF486A_EA676B2CB7DB2B7A;
x[72]=192'h07A7137045DA2A16_3BDD119049372802_DFD64A815CAF1A0F;
x[73]=192'h04689104C2FD3B2F_26955F6835AF609A_5C513C9C4886C088;
x[74]=192'h37D06BB516CB7546_164D5E404F275232_0A2AEEAE3FF4AB77;
x[75]=192'h1F08260D1AC2465E_6B056E18759F5CCA_EF1BF03E5DFA575A;
x[76]=192'h584023641ABA6176_004BD6EF09176062_88BF0DB6D70DEE56;
x[77]=192'h025816164629B007_480D39006EE762F2_A1F9915541020B56;
x[78]=192'h49793EBC79B3258F_437540C8698F3CFA_6FBF1CAFCFFD0556;
x[79]=192'h4FB05E1515AB73A7_072D43A077075292_2F22E49BAB7CA1AC;
x[80]=192'h49E95D6D4CA229BF_02FE55778117F12A_5A6B612CC26CCE4A;
x[81]=192'h018310DC409B26D6_1D9D5C5018F728C2_5F4C038ED12B2E41;
x[82]=192'h1C587F1C13924FEF_305532286D6F295A_63FAC0D034D9F793;
x[83]=192'h0101010101010101_0123456789ABCDEF_617B3A0CE8F07100;
x[84]=192'h1F1F1F1F0E0E0E0E_0123456789ABCDEF_DB958605F8C8C606;
x[85]=192'hE0FEE0FEF1FEF1FE_0123456789ABCDEF_EDBFD1C66C29CCC7;
x[86]=192'h0000000000000000_FFFFFFFFFFFFFFFF_355550B2150E2451;
x[87]=192'hFFFFFFFFFFFFFFFF_0000000000000000_CAAAAF4DEAF1DBAE;
x[88]=192'h0123456789ABCDEF_0000000000000000_D5D44FF720683D0D;
x[89]=192'hFEDCBA9876543210_FFFFFFFFFFFFFFFF_2A2BB008DF97C2F2;
 
x[ZZZ]=192'h10316E028C8F3B4A_0000000000000000_82DCBAFBDEAB6602; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_95F8A5E5DD31D900_8000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_DD7F121CA5015619_4000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_2E8653104F3834EA_2000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_4BD388FF6CD81D4F_1000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_20B9E767B2FB1456_0800000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_55579380D77138EF_0400000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_6CC5DEFAAF04512F_0200000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0D9F279BA5D87260_0100000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_D9031B0271BD5A0A_0080000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_424250B37C3DD951_0040000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_B8061B7ECD9A21E5_0020000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_F15D0F286B65BD28_0010000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_ADD0CC8D6E5DEBA1_0008000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_E6D5F82752AD63D1_0004000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_ECBFE3BD3F591A5E_0002000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_F356834379D165CD_0001000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_2B9F982F20037FA9_0000800000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_889DE068A16F0BE6_0000400000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_E19E275D846A1298_0000200000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_329A8ED523D71AEC_0000100000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_E7FCE22557D23C97_0000080000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_12A9F5817FF2D65D_0000040000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_A484C3AD38DC9C19_0000020000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_FBE00A8A1EF8AD72_0000010000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_750D079407521363_0000008000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_64FEED9C724C2FAF_0000004000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_F02B263B328E2B60_0000002000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_9D64555A9A10B852_0000001000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_D106FF0BED5255D7_0000000800000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_E1652C6B138C64A5_0000000400000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_E428581186EC8F46_0000000200000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_AEB5F5EDE22D1A36_0000000100000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_E943D7568AEC0C5C_0000000080000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_DF98C8276F54B04B_0000000040000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_B160E4680F6C696F_0000000020000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_FA0752B07D9C4AB8_0000000010000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_CA3A2B036DBC8502_0000000008000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_5E0905517BB59BCF_0000000004000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_814EEB3B91D90726_0000000002000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_4D49DB1532919C9F_0000000001000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_25EB5FC3F8CF0621_0000000000800000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_AB6A20C0620D1C6F_0000000000400000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_79E90DBC98F92CCA_0000000000200000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_866ECEDD8072BB0E_0000000000100000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_8B54536F2F3E64A8_0000000000080000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_EA51D3975595B86B_0000000000040000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_CAFFC6AC4542DE31_0000000000020000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_8DD45A2DDF90796C_0000000000010000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_1029D55E880EC2D0_0000000000008000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_5D86CB23639DBEA9_0000000000004000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_1D1CA853AE7C0C5F_0000000000002000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_CE332329248F3228_0000000000001000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_8405D1ABE24FB942_0000000000000800; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_E643D78090CA4207_0000000000000400; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_48221B9937748A23_0000000000000200; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_DD7C0BBD61FAFD54_0000000000000100; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_2FBC291A570DB5C4_0000000000000080; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_E07C30D7E4E26E12_0000000000000040; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0953E2258E8E90A1_0000000000000020; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_5B711BC4CEEBF2EE_0000000000000010; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_CC083F1E6D9E85F6_0000000000000008; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_D2FD8867D50D2DFE_0000000000000004; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_06E7EA22CE92708F_0000000000000002; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_166B40B44ABA4BD6_0000000000000001; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_8000000000000000_95F8A5E5DD31D900; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_4000000000000000_DD7F121CA5015619; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_2000000000000000_2E8653104F3834EA; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_1000000000000000_4BD388FF6CD81D4F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0800000000000000_20B9E767B2FB1456; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0400000000000000_55579380D77138EF; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0200000000000000_6CC5DEFAAF04512F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0100000000000000_0D9F279BA5D87260; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0080000000000000_D9031B0271BD5A0A; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0040000000000000_424250B37C3DD951; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0020000000000000_B8061B7ECD9A21E5; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0010000000000000_F15D0F286B65BD28; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0008000000000000_ADD0CC8D6E5DEBA1; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0004000000000000_E6D5F82752AD63D1; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0002000000000000_ECBFE3BD3F591A5E; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0001000000000000_F356834379D165CD; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000800000000000_2B9F982F20037FA9; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000400000000000_889DE068A16F0BE6; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000200000000000_E19E275D846A1298; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000100000000000_329A8ED523D71AEC; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000080000000000_E7FCE22557D23C97; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000040000000000_12A9F5817FF2D65D; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000020000000000_A484C3AD38DC9C19; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000010000000000_FBE00A8A1EF8AD72; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000008000000000_750D079407521363; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000004000000000_64FEED9C724C2FAF; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000002000000000_F02B263B328E2B60; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000001000000000_9D64555A9A10B852; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000800000000_D106FF0BED5255D7; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000400000000_E1652C6B138C64A5; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000200000000_E428581186EC8F46; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000100000000_AEB5F5EDE22D1A36; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000080000000_E943D7568AEC0C5C; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000040000000_DF98C8276F54B04B; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000020000000_B160E4680F6C696F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000010000000_FA0752B07D9C4AB8; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000008000000_CA3A2B036DBC8502; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000004000000_5E0905517BB59BCF; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000002000000_814EEB3B91D90726; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000001000000_4D49DB1532919C9F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000800000_25EB5FC3F8CF0621; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000400000_AB6A20C0620D1C6F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000200000_79E90DBC98F92CCA; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000100000_866ECEDD8072BB0E; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000080000_8B54536F2F3E64A8; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000040000_EA51D3975595B86B; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000020000_CAFFC6AC4542DE31; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000010000_8DD45A2DDF90796C; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000008000_1029D55E880EC2D0; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000004000_5D86CB23639DBEA9; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000002000_1D1CA853AE7C0C5F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000001000_CE332329248F3228; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000800_8405D1ABE24FB942; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000400_E643D78090CA4207; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000200_48221B9937748A23; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000100_DD7C0BBD61FAFD54; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000080_2FBC291A570DB5C4; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000040_E07C30D7E4E26E12; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000020_0953E2258E8E90A1; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000010_5B711BC4CEEBF2EE; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000008_CC083F1E6D9E85F6; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000004_D2FD8867D50D2DFE; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000002_06E7EA22CE92708F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000001_166B40B44ABA4BD6; ZZZ=ZZZ+1;
x[ZZZ]=192'h8001010101010101_0000000000000000_95A8D72813DAA94D; ZZZ=ZZZ+1;
x[ZZZ]=192'h4001010101010101_0000000000000000_0EEC1487DD8C26D5; ZZZ=ZZZ+1;
x[ZZZ]=192'h2001010101010101_0000000000000000_7AD16FFB79C45926; ZZZ=ZZZ+1;
x[ZZZ]=192'h1001010101010101_0000000000000000_D3746294CA6A6CF3; ZZZ=ZZZ+1;
x[ZZZ]=192'h0801010101010101_0000000000000000_809F5F873C1FD761; ZZZ=ZZZ+1;
x[ZZZ]=192'h0401010101010101_0000000000000000_C02FAFFEC989D1FC; ZZZ=ZZZ+1;
x[ZZZ]=192'h0201010101010101_0000000000000000_4615AA1D33E72F10; ZZZ=ZZZ+1;
x[ZZZ]=192'h0180010101010101_0000000000000000_2055123350C00858; ZZZ=ZZZ+1;
x[ZZZ]=192'h0140010101010101_0000000000000000_DF3B99D6577397C8; ZZZ=ZZZ+1;
x[ZZZ]=192'h0120010101010101_0000000000000000_31FE17369B5288C9; ZZZ=ZZZ+1;
x[ZZZ]=192'h0110010101010101_0000000000000000_DFDD3CC64DAE1642; ZZZ=ZZZ+1;
x[ZZZ]=192'h0108010101010101_0000000000000000_178C83CE2B399D94; ZZZ=ZZZ+1;
x[ZZZ]=192'h0104010101010101_0000000000000000_50F636324A9B7F80; ZZZ=ZZZ+1;
x[ZZZ]=192'h0102010101010101_0000000000000000_A8468EE3BC18F06D; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101800101010101_0000000000000000_A2DC9E92FD3CDE92; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101400101010101_0000000000000000_CAC09F797D031287; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101200101010101_0000000000000000_90BA680B22AEB525; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101100101010101_0000000000000000_CE7A24F350E280B6; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101080101010101_0000000000000000_882BFF0AA01A0B87; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101040101010101_0000000000000000_25610288924511C2; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101020101010101_0000000000000000_C71516C29C75D170; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101018001010101_0000000000000000_5199C29A52C9F059; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101014001010101_0000000000000000_C22F0A294A71F29F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101012001010101_0000000000000000_EE371483714C02EA; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101011001010101_0000000000000000_A81FBD448F9E522F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010801010101_0000000000000000_4F644C92E192DFED; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010401010101_0000000000000000_1AFA9A66A6DF92AE; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010201010101_0000000000000000_B3C1CC715CB879D8; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010180010101_0000000000000000_19D032E64AB0BD8B; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010140010101_0000000000000000_3CFAA7A7DC8720DC; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010120010101_0000000000000000_B7265F7F447AC6F3; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010110010101_0000000000000000_9DB73B3C0D163F54; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010108010101_0000000000000000_8181B65BABF4A975; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010104010101_0000000000000000_93C9B64042EAA240; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010102010101_0000000000000000_5570530829705592; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101800101_0000000000000000_8638809E878787A0; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101400101_0000000000000000_41B9A79AF79AC208; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101200101_0000000000000000_7A9BE42F2009A892; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101100101_0000000000000000_29038D56BA6D2745; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101080101_0000000000000000_5495C6ABF1E5DF51; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101040101_0000000000000000_AE13DBD561488933; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101020101_0000000000000000_024D1FFA8904E389; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101018001_0000000000000000_D1399712F99BF02E; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101014001_0000000000000000_14C1D7C1CFFEC79E; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101012001_0000000000000000_1DE5279DAE3BED6F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101011001_0000000000000000_E941A33F85501303; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010801_0000000000000000_DA99DBBC9A03F379; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010401_0000000000000000_B7FC92F91D8E92E9; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010201_0000000000000000_AE8E5CAA3CA04E85; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010180_0000000000000000_9CC62DF43B6EED74; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010140_0000000000000000_D863DBB5C59A91A0; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010120_0000000000000000_A1AB2190545B91D7; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010110_0000000000000000_0875041E64C570F7; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010108_0000000000000000_5A594528BEBEF1CC; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010104_0000000000000000_FCDB3291DE21F0C0; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010102_0000000000000000_869EFD7F9F265A09; ZZZ=ZZZ+1;
x[ZZZ]=192'h1046913489980131_0000000000000000_88D55E54F54C97B4; ZZZ=ZZZ+1;
x[ZZZ]=192'h1007103489988020_0000000000000000_0C0CC00C83EA48FD; ZZZ=ZZZ+1;
x[ZZZ]=192'h10071034C8980120_0000000000000000_83BC8EF3A6570183; ZZZ=ZZZ+1;
x[ZZZ]=192'h1046103489988020_0000000000000000_DF725DCAD94EA2E9; ZZZ=ZZZ+1;
x[ZZZ]=192'h1086911519190101_0000000000000000_E652B53B550BE8B0; ZZZ=ZZZ+1;
x[ZZZ]=192'h1086911519580101_0000000000000000_AF527120C485CBB0; ZZZ=ZZZ+1;
x[ZZZ]=192'h5107B01519580101_0000000000000000_0F04CE393DB926D5; ZZZ=ZZZ+1;
x[ZZZ]=192'h1007B01519190101_0000000000000000_C9F00FFC74079067; ZZZ=ZZZ+1;
x[ZZZ]=192'h3107915498080101_0000000000000000_7CFD82A593252B4E; ZZZ=ZZZ+1;
x[ZZZ]=192'h3107919498080101_0000000000000000_CB49A2F9E91363E3; ZZZ=ZZZ+1;
x[ZZZ]=192'h10079115B9080140_0000000000000000_00B588BE70D23F56; ZZZ=ZZZ+1;
x[ZZZ]=192'h3107911598080140_0000000000000000_406A9A6AB43399AE; ZZZ=ZZZ+1;
x[ZZZ]=192'h1007D01589980101_0000000000000000_6CB773611DCA9ADA; ZZZ=ZZZ+1;
x[ZZZ]=192'h9107911589980101_0000000000000000_67FD21C17DBB5D70; ZZZ=ZZZ+1;
x[ZZZ]=192'h9107D01589190101_0000000000000000_9592CB4110430787; ZZZ=ZZZ+1;
x[ZZZ]=192'h1007D01598980120_0000000000000000_A6B7FF68A318DDD3; ZZZ=ZZZ+1;
x[ZZZ]=192'h1007940498190101_0000000000000000_4D102196C914CA16; ZZZ=ZZZ+1;
x[ZZZ]=192'h0107910491190401_0000000000000000_2DFA9F4573594965; ZZZ=ZZZ+1;
x[ZZZ]=192'h0107910491190101_0000000000000000_B46604816C0E0774; ZZZ=ZZZ+1;
x[ZZZ]=192'h0107940491190401_0000000000000000_6E7E6221A4F34E87; ZZZ=ZZZ+1;
x[ZZZ]=192'h19079210981A0101_0000000000000000_AA85E74643233199; ZZZ=ZZZ+1;
x[ZZZ]=192'h1007911998190801_0000000000000000_2E5A19DB4D1962D6; ZZZ=ZZZ+1;
x[ZZZ]=192'h10079119981A0801_0000000000000000_23A866A809D30894; ZZZ=ZZZ+1;
x[ZZZ]=192'h1007921098190101_0000000000000000_D812D961F017D320; ZZZ=ZZZ+1;
x[ZZZ]=192'h100791159819010B_0000000000000000_055605816E58608F; ZZZ=ZZZ+1;
x[ZZZ]=192'h1004801598190101_0000000000000000_ABD88E8B1B7716F1; ZZZ=ZZZ+1;
x[ZZZ]=192'h1004801598190102_0000000000000000_537AC95BE69DA1E1; ZZZ=ZZZ+1;
x[ZZZ]=192'h1004801598190108_0000000000000000_AED0F6AE3C25CDD8; ZZZ=ZZZ+1;
x[ZZZ]=192'h1002911498100104_0000000000000000_B3E35A5EE53E7B8D; ZZZ=ZZZ+1;
x[ZZZ]=192'h1002911598190104_0000000000000000_61C79C71921A2EF8; ZZZ=ZZZ+1;
x[ZZZ]=192'h1002911598100201_0000000000000000_E2F5728F0995013C; ZZZ=ZZZ+1;
x[ZZZ]=192'h1002911698100101_0000000000000000_1AEAC39A61F0A464; ZZZ=ZZZ+1;
x[ZZZ]=192'h7CA110454A1A6E57_01A1D6D039776742_690F5B0D9A26939B; ZZZ=ZZZ+1;
x[ZZZ]=192'h0131D9619DC1376E_5CD54CA83DEF57DA_7A389D10354BD271; ZZZ=ZZZ+1;
x[ZZZ]=192'h07A1133E4A0B2686_0248D43806F67172_868EBB51CAB4599A; ZZZ=ZZZ+1;
x[ZZZ]=192'h3849674C2602319E_51454B582DDF440A_7178876E01F19B2A; ZZZ=ZZZ+1;
x[ZZZ]=192'h04B915BA43FEB5B6_42FD443059577FA2_AF37FB421F8C4095; ZZZ=ZZZ+1;
x[ZZZ]=192'h0113B970FD34F2CE_059B5E0851CF143A_86A560F10EC6D85B; ZZZ=ZZZ+1;
x[ZZZ]=192'h0170F175468FB5E6_0756D8E0774761D2_0CD3DA020021DC09; ZZZ=ZZZ+1;
x[ZZZ]=192'h43297FAD38E373FE_762514B829BF486A_EA676B2CB7DB2B7A; ZZZ=ZZZ+1;
x[ZZZ]=192'h07A7137045DA2A16_3BDD119049372802_DFD64A815CAF1A0F; ZZZ=ZZZ+1;
x[ZZZ]=192'h04689104C2FD3B2F_26955F6835AF609A_5C513C9C4886C088; ZZZ=ZZZ+1;
x[ZZZ]=192'h37D06BB516CB7546_164D5E404F275232_0A2AEEAE3FF4AB77; ZZZ=ZZZ+1;
x[ZZZ]=192'h1F08260D1AC2465E_6B056E18759F5CCA_EF1BF03E5DFA575A; ZZZ=ZZZ+1;
x[ZZZ]=192'h584023641ABA6176_004BD6EF09176062_88BF0DB6D70DEE56; ZZZ=ZZZ+1;
x[ZZZ]=192'h025816164629B007_480D39006EE762F2_A1F9915541020B56; ZZZ=ZZZ+1;
x[ZZZ]=192'h49793EBC79B3258F_437540C8698F3CFA_6FBF1CAFCFFD0556; ZZZ=ZZZ+1;
x[ZZZ]=192'h4FB05E1515AB73A7_072D43A077075292_2F22E49BAB7CA1AC; ZZZ=ZZZ+1;
x[ZZZ]=192'h49E95D6D4CA229BF_02FE55778117F12A_5A6B612CC26CCE4A; ZZZ=ZZZ+1;
x[ZZZ]=192'h018310DC409B26D6_1D9D5C5018F728C2_5F4C038ED12B2E41; ZZZ=ZZZ+1;
x[ZZZ]=192'h1C587F1C13924FEF_305532286D6F295A_63FAC0D034D9F793; ZZZ=ZZZ+1;
x[ZZZ]=192'h0000000000000000_0000000000000000_8CA64DE9C1B123A7; ZZZ=ZZZ+1;
x[ZZZ]=192'hFFFFFFFFFFFFFFFF_FFFFFFFFFFFFFFFF_7359B2163E4EDC58; ZZZ=ZZZ+1;
x[ZZZ]=192'h3000000000000000_1000000000000001_958E6E627A05557B; ZZZ=ZZZ+1;
x[ZZZ]=192'h1111111111111111_1111111111111111_F40379AB9E0EC533; ZZZ=ZZZ+1;
x[ZZZ]=192'h0123456789ABCDEF_1111111111111111_17668DFC7292532D; ZZZ=ZZZ+1;
x[ZZZ]=192'h1111111111111111_0123456789ABCDEF_8A5AE1F81AB8F2DD; ZZZ=ZZZ+1;
x[ZZZ]=192'h0000000000000000_0000000000000000_8CA64DE9C1B123A7; ZZZ=ZZZ+1;
x[ZZZ]=192'hFEDCBA9876543210_0123456789ABCDEF_ED39D950FA74BCC4; ZZZ=ZZZ+1;
x[ZZZ]=192'h7CA110454A1A6E57_01A1D6D039776742_690F5B0D9A26939B; ZZZ=ZZZ+1;
x[ZZZ]=192'h0131D9619DC1376E_5CD54CA83DEF57DA_7A389D10354BD271; ZZZ=ZZZ+1;
x[ZZZ]=192'h07A1133E4A0B2686_0248D43806F67172_868EBB51CAB4599A; ZZZ=ZZZ+1;
x[ZZZ]=192'h3849674C2602319E_51454B582DDF440A_7178876E01F19B2A; ZZZ=ZZZ+1;
x[ZZZ]=192'h04B915BA43FEB5B6_42FD443059577FA2_AF37FB421F8C4095; ZZZ=ZZZ+1;
x[ZZZ]=192'h0113B970FD34F2CE_059B5E0851CF143A_86A560F10EC6D85B; ZZZ=ZZZ+1;
x[ZZZ]=192'h0170F175468FB5E6_0756D8E0774761D2_0CD3DA020021DC09; ZZZ=ZZZ+1;
x[ZZZ]=192'h43297FAD38E373FE_762514B829BF486A_EA676B2CB7DB2B7A; ZZZ=ZZZ+1;
x[ZZZ]=192'h07A7137045DA2A16_3BDD119049372802_DFD64A815CAF1A0F; ZZZ=ZZZ+1;
x[ZZZ]=192'h04689104C2FD3B2F_26955F6835AF609A_5C513C9C4886C088; ZZZ=ZZZ+1;
x[ZZZ]=192'h37D06BB516CB7546_164D5E404F275232_0A2AEEAE3FF4AB77; ZZZ=ZZZ+1;
x[ZZZ]=192'h1F08260D1AC2465E_6B056E18759F5CCA_EF1BF03E5DFA575A; ZZZ=ZZZ+1;
x[ZZZ]=192'h584023641ABA6176_004BD6EF09176062_88BF0DB6D70DEE56; ZZZ=ZZZ+1;
x[ZZZ]=192'h025816164629B007_480D39006EE762F2_A1F9915541020B56; ZZZ=ZZZ+1;
x[ZZZ]=192'h49793EBC79B3258F_437540C8698F3CFA_6FBF1CAFCFFD0556; ZZZ=ZZZ+1;
x[ZZZ]=192'h4FB05E1515AB73A7_072D43A077075292_2F22E49BAB7CA1AC; ZZZ=ZZZ+1;
x[ZZZ]=192'h49E95D6D4CA229BF_02FE55778117F12A_5A6B612CC26CCE4A; ZZZ=ZZZ+1;
x[ZZZ]=192'h018310DC409B26D6_1D9D5C5018F728C2_5F4C038ED12B2E41; ZZZ=ZZZ+1;
x[ZZZ]=192'h1C587F1C13924FEF_305532286D6F295A_63FAC0D034D9F793; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0123456789ABCDEF_617B3A0CE8F07100; ZZZ=ZZZ+1;
x[ZZZ]=192'h1F1F1F1F0E0E0E0E_0123456789ABCDEF_DB958605F8C8C606; ZZZ=ZZZ+1;
x[ZZZ]=192'hE0FEE0FEF1FEF1FE_0123456789ABCDEF_EDBFD1C66C29CCC7; ZZZ=ZZZ+1;
x[ZZZ]=192'h0000000000000000_FFFFFFFFFFFFFFFF_355550B2150E2451; ZZZ=ZZZ+1;
x[ZZZ]=192'hFFFFFFFFFFFFFFFF_0000000000000000_CAAAAF4DEAF1DBAE; ZZZ=ZZZ+1;
x[ZZZ]=192'h0123456789ABCDEF_0000000000000000_D5D44FF720683D0D; ZZZ=ZZZ+1;
x[ZZZ]=192'hFEDCBA9876543210_FFFFFFFFFFFFFFFF_2A2BB008DF97C2F2; ZZZ=ZZZ+1;
//decrypt
x[ZZZ]=192'h8001010101010101_95A8D72813DAA94D_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h4001010101010101_0EEC1487DD8C26D5_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h2001010101010101_7AD16FFB79C45926_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h1001010101010101_D3746294CA6A6CF3_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0801010101010101_809F5F873C1FD761_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0401010101010101_C02FAFFEC989D1FC_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0201010101010101_4615AA1D33E72F10_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0180010101010101_2055123350C00858_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0140010101010101_DF3B99D6577397C8_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0120010101010101_31FE17369B5288C9_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0110010101010101_DFDD3CC64DAE1642_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0108010101010101_178C83CE2B399D94_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0104010101010101_50F636324A9B7F80_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0102010101010101_A8468EE3BC18F06D_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101800101010101_A2DC9E92FD3CDE92_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101400101010101_CAC09F797D031287_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101200101010101_90BA680B22AEB525_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101100101010101_CE7A24F350E280B6_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101080101010101_882BFF0AA01A0B87_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101040101010101_25610288924511C2_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101020101010101_C71516C29C75D170_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101018001010101_5199C29A52C9F059_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101014001010101_C22F0A294A71F29F_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101012001010101_EE371483714C02EA_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101011001010101_A81FBD448F9E522F_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010801010101_4F644C92E192DFED_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010401010101_1AFA9A66A6DF92AE_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010201010101_B3C1CC715CB879D8_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010180010101_19D032E64AB0BD8B_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010140010101_3CFAA7A7DC8720DC_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010120010101_B7265F7F447AC6F3_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010110010101_9DB73B3C0D163F54_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010108010101_8181B65BABF4A975_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010104010101_93C9B64042EAA240_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010102010101_5570530829705592_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101800101_8638809E878787A0_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101400101_41B9A79AF79AC208_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101200101_7A9BE42F2009A892_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101100101_29038D56BA6D2745_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101080101_5495C6ABF1E5DF51_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101040101_AE13DBD561488933_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101020101_024D1FFA8904E389_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101018001_D1399712F99BF02E_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101014001_14C1D7C1CFFEC79E_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101012001_1DE5279DAE3BED6F_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101011001_E941A33F85501303_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010801_DA99DBBC9A03F379_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010401_B7FC92F91D8E92E9_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010201_AE8E5CAA3CA04E85_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010180_9CC62DF43B6EED74_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010140_D863DBB5C59A91A0_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010120_A1AB2190545B91D7_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010110_0875041E64C570F7_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010108_5A594528BEBEF1CC_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010104_FCDB3291DE21F0C0_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010102_869EFD7F9F265A09_0000000000000000; ZZZ=ZZZ+1;
// Wait for clock edge
decrypt = 0;
@(posedge clk);
175,7 → 422,7
if(decrypt) $display("Running Encrypt test ...\n");
else $display("Running Decrypt test ...\n");
// Begin for loop
for(select=0;select<107;select=select+1)
for(select=0;select<(326+16);select=select+1)
begin
tmp=x[select];
@(posedge clk);
199,12 → 446,13
 
// DES Clock
always #50 clk=~clk;
wire reverse = select > 269;
 
// Create the key w/o the parity bits
assign #1 key = {tmp[191:185],tmp[183:177],tmp[175:169],tmp[167:161],
tmp[159:153],tmp[151:145],tmp[143:137],tmp[135:129]};
assign #1 des_in = decrypt ? tmp[63:0] : tmp[127:64];
assign exp_out_d = decrypt ? tmp[127:64] : tmp[63:0];
assign #1 des_in = (decrypt[0]^reverse) ? tmp[63:0] : tmp[127:64];
assign exp_out_d = (decrypt[0]^reverse) ? tmp[127:64] : tmp[63:0];
 
// The DES instance
des u0( .clk( clk ),
/trunk/bench/verilog/des_test_ao.v
34,7 → 34,7
module test;
 
reg clk;
reg [191:0] x[128:0];
reg [191:0] x[512:0];
 
reg [191:0] tmp;
 
45,6 → 45,7
wire [63:0] des_in;
wire [63:0] exp_out;
wire [55:0] key;
integer ZZZ;
 
initial
begin
61,124 → 62,370
`endif
 
clk=0;
 
ZZZ=0;
// Key Test data Out data
x[00]=192'h8001010101010101_0000000000000000_95A8D72813DAA94D;
x[01]=192'h4001010101010101_0000000000000000_0EEC1487DD8C26D5;
x[02]=192'h2001010101010101_0000000000000000_7AD16FFB79C45926;
x[03]=192'h1001010101010101_0000000000000000_D3746294CA6A6CF3;
x[04]=192'h0801010101010101_0000000000000000_809F5F873C1FD761;
x[05]=192'h0401010101010101_0000000000000000_C02FAFFEC989D1FC;
x[06]=192'h0201010101010101_0000000000000000_4615AA1D33E72F10;
x[07]=192'h0180010101010101_0000000000000000_2055123350C00858;
x[08]=192'h0140010101010101_0000000000000000_DF3B99D6577397C8;
x[09]=192'h0120010101010101_0000000000000000_31FE17369B5288C9;
x[10]=192'h0110010101010101_0000000000000000_DFDD3CC64DAE1642;
x[11]=192'h0108010101010101_0000000000000000_178C83CE2B399D94;
x[12]=192'h0104010101010101_0000000000000000_50F636324A9B7F80;
x[13]=192'h0102010101010101_0000000000000000_A8468EE3BC18F06D;
x[14]=192'h0101800101010101_0000000000000000_A2DC9E92FD3CDE92;
x[15]=192'h0101400101010101_0000000000000000_CAC09F797D031287;
x[16]=192'h0101200101010101_0000000000000000_90BA680B22AEB525;
x[17]=192'h0101100101010101_0000000000000000_CE7A24F350E280B6;
x[18]=192'h0101080101010101_0000000000000000_882BFF0AA01A0B87;
x[19]=192'h0101040101010101_0000000000000000_25610288924511C2;
x[20]=192'h0101020101010101_0000000000000000_C71516C29C75D170;
x[21]=192'h0101018001010101_0000000000000000_5199C29A52C9F059;
x[22]=192'h0101014001010101_0000000000000000_C22F0A294A71F29F;
x[23]=192'h0101012001010101_0000000000000000_EE371483714C02EA;
x[24]=192'h0101011001010101_0000000000000000_A81FBD448F9E522F;
x[25]=192'h0101010801010101_0000000000000000_4F644C92E192DFED;
x[26]=192'h0101010401010101_0000000000000000_1AFA9A66A6DF92AE;
x[27]=192'h0101010201010101_0000000000000000_B3C1CC715CB879D8;
x[28]=192'h0101010180010101_0000000000000000_19D032E64AB0BD8B;
x[29]=192'h0101010140010101_0000000000000000_3CFAA7A7DC8720DC;
x[30]=192'h0101010120010101_0000000000000000_B7265F7F447AC6F3;
x[31]=192'h0101010110010101_0000000000000000_9DB73B3C0D163F54;
x[32]=192'h0101010108010101_0000000000000000_8181B65BABF4A975;
x[33]=192'h0101010104010101_0000000000000000_93C9B64042EAA240;
x[34]=192'h0101010102010101_0000000000000000_5570530829705592;
x[35]=192'h0101010101800101_0000000000000000_8638809E878787A0;
x[36]=192'h0101010101400101_0000000000000000_41B9A79AF79AC208;
x[37]=192'h0101010101200101_0000000000000000_7A9BE42F2009A892;
x[38]=192'h0101010101100101_0000000000000000_29038D56BA6D2745;
x[39]=192'h0101010101080101_0000000000000000_5495C6ABF1E5DF51;
x[40]=192'h0101010101040101_0000000000000000_AE13DBD561488933;
x[41]=192'h0101010101020101_0000000000000000_024D1FFA8904E389;
x[42]=192'h0101010101018001_0000000000000000_D1399712F99BF02E;
x[43]=192'h0101010101014001_0000000000000000_14C1D7C1CFFEC79E;
x[44]=192'h0101010101012001_0000000000000000_1DE5279DAE3BED6F;
x[45]=192'h0101010101011001_0000000000000000_E941A33F85501303;
x[46]=192'h0101010101010801_0000000000000000_DA99DBBC9A03F379;
x[47]=192'h0101010101010401_0000000000000000_B7FC92F91D8E92E9;
x[48]=192'h0101010101010201_0000000000000000_AE8E5CAA3CA04E85;
x[49]=192'h0101010101010180_0000000000000000_9CC62DF43B6EED74;
x[50]=192'h0101010101010140_0000000000000000_D863DBB5C59A91A0;
x[51]=192'h0101010101010120_0000000000000000_A1AB2190545B91D7;
x[52]=192'h0101010101010110_0000000000000000_0875041E64C570F7;
x[53]=192'h0101010101010108_0000000000000000_5A594528BEBEF1CC;
x[54]=192'h0101010101010104_0000000000000000_FCDB3291DE21F0C0;
x[55]=192'h0101010101010102_0000000000000000_869EFD7F9F265A09;
x[56]=192'h0000000000000000_0000000000000000_8CA64DE9C1B123A7;
x[57]=192'hFFFFFFFFFFFFFFFF_FFFFFFFFFFFFFFFF_7359B2163E4EDC58;
x[58]=192'h3000000000000000_1000000000000001_958E6E627A05557B;
x[59]=192'h1111111111111111_1111111111111111_F40379AB9E0EC533;
x[60]=192'h0123456789ABCDEF_1111111111111111_17668DFC7292532D;
x[61]=192'h1111111111111111_0123456789ABCDEF_8A5AE1F81AB8F2DD;
x[62]=192'h0000000000000000_0000000000000000_8CA64DE9C1B123A7;
x[63]=192'hFEDCBA9876543210_0123456789ABCDEF_ED39D950FA74BCC4;
x[64]=192'h7CA110454A1A6E57_01A1D6D039776742_690F5B0D9A26939B;
x[65]=192'h0131D9619DC1376E_5CD54CA83DEF57DA_7A389D10354BD271;
x[66]=192'h07A1133E4A0B2686_0248D43806F67172_868EBB51CAB4599A;
x[67]=192'h3849674C2602319E_51454B582DDF440A_7178876E01F19B2A;
x[68]=192'h04B915BA43FEB5B6_42FD443059577FA2_AF37FB421F8C4095;
x[69]=192'h0113B970FD34F2CE_059B5E0851CF143A_86A560F10EC6D85B;
x[70]=192'h0170F175468FB5E6_0756D8E0774761D2_0CD3DA020021DC09;
x[71]=192'h43297FAD38E373FE_762514B829BF486A_EA676B2CB7DB2B7A;
x[72]=192'h07A7137045DA2A16_3BDD119049372802_DFD64A815CAF1A0F;
x[73]=192'h04689104C2FD3B2F_26955F6835AF609A_5C513C9C4886C088;
x[74]=192'h37D06BB516CB7546_164D5E404F275232_0A2AEEAE3FF4AB77;
x[75]=192'h1F08260D1AC2465E_6B056E18759F5CCA_EF1BF03E5DFA575A;
x[76]=192'h584023641ABA6176_004BD6EF09176062_88BF0DB6D70DEE56;
x[77]=192'h025816164629B007_480D39006EE762F2_A1F9915541020B56;
x[78]=192'h49793EBC79B3258F_437540C8698F3CFA_6FBF1CAFCFFD0556;
x[79]=192'h4FB05E1515AB73A7_072D43A077075292_2F22E49BAB7CA1AC;
x[80]=192'h49E95D6D4CA229BF_02FE55778117F12A_5A6B612CC26CCE4A;
x[81]=192'h018310DC409B26D6_1D9D5C5018F728C2_5F4C038ED12B2E41;
x[82]=192'h1C587F1C13924FEF_305532286D6F295A_63FAC0D034D9F793;
x[83]=192'h0101010101010101_0123456789ABCDEF_617B3A0CE8F07100;
x[84]=192'h1F1F1F1F0E0E0E0E_0123456789ABCDEF_DB958605F8C8C606;
x[85]=192'hE0FEE0FEF1FEF1FE_0123456789ABCDEF_EDBFD1C66C29CCC7;
x[86]=192'h0000000000000000_FFFFFFFFFFFFFFFF_355550B2150E2451;
x[87]=192'hFFFFFFFFFFFFFFFF_0000000000000000_CAAAAF4DEAF1DBAE;
x[88]=192'h0123456789ABCDEF_0000000000000000_D5D44FF720683D0D;
x[89]=192'hFEDCBA9876543210_FFFFFFFFFFFFFFFF_2A2BB008DF97C2F2;
 
x[ZZZ]=192'h10316E028C8F3B4A_0000000000000000_82DCBAFBDEAB6602; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_95F8A5E5DD31D900_8000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_DD7F121CA5015619_4000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_2E8653104F3834EA_2000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_4BD388FF6CD81D4F_1000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_20B9E767B2FB1456_0800000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_55579380D77138EF_0400000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_6CC5DEFAAF04512F_0200000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0D9F279BA5D87260_0100000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_D9031B0271BD5A0A_0080000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_424250B37C3DD951_0040000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_B8061B7ECD9A21E5_0020000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_F15D0F286B65BD28_0010000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_ADD0CC8D6E5DEBA1_0008000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_E6D5F82752AD63D1_0004000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_ECBFE3BD3F591A5E_0002000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_F356834379D165CD_0001000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_2B9F982F20037FA9_0000800000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_889DE068A16F0BE6_0000400000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_E19E275D846A1298_0000200000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_329A8ED523D71AEC_0000100000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_E7FCE22557D23C97_0000080000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_12A9F5817FF2D65D_0000040000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_A484C3AD38DC9C19_0000020000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_FBE00A8A1EF8AD72_0000010000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_750D079407521363_0000008000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_64FEED9C724C2FAF_0000004000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_F02B263B328E2B60_0000002000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_9D64555A9A10B852_0000001000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_D106FF0BED5255D7_0000000800000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_E1652C6B138C64A5_0000000400000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_E428581186EC8F46_0000000200000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_AEB5F5EDE22D1A36_0000000100000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_E943D7568AEC0C5C_0000000080000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_DF98C8276F54B04B_0000000040000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_B160E4680F6C696F_0000000020000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_FA0752B07D9C4AB8_0000000010000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_CA3A2B036DBC8502_0000000008000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_5E0905517BB59BCF_0000000004000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_814EEB3B91D90726_0000000002000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_4D49DB1532919C9F_0000000001000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_25EB5FC3F8CF0621_0000000000800000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_AB6A20C0620D1C6F_0000000000400000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_79E90DBC98F92CCA_0000000000200000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_866ECEDD8072BB0E_0000000000100000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_8B54536F2F3E64A8_0000000000080000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_EA51D3975595B86B_0000000000040000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_CAFFC6AC4542DE31_0000000000020000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_8DD45A2DDF90796C_0000000000010000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_1029D55E880EC2D0_0000000000008000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_5D86CB23639DBEA9_0000000000004000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_1D1CA853AE7C0C5F_0000000000002000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_CE332329248F3228_0000000000001000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_8405D1ABE24FB942_0000000000000800; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_E643D78090CA4207_0000000000000400; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_48221B9937748A23_0000000000000200; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_DD7C0BBD61FAFD54_0000000000000100; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_2FBC291A570DB5C4_0000000000000080; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_E07C30D7E4E26E12_0000000000000040; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0953E2258E8E90A1_0000000000000020; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_5B711BC4CEEBF2EE_0000000000000010; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_CC083F1E6D9E85F6_0000000000000008; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_D2FD8867D50D2DFE_0000000000000004; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_06E7EA22CE92708F_0000000000000002; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_166B40B44ABA4BD6_0000000000000001; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_8000000000000000_95F8A5E5DD31D900; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_4000000000000000_DD7F121CA5015619; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_2000000000000000_2E8653104F3834EA; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_1000000000000000_4BD388FF6CD81D4F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0800000000000000_20B9E767B2FB1456; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0400000000000000_55579380D77138EF; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0200000000000000_6CC5DEFAAF04512F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0100000000000000_0D9F279BA5D87260; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0080000000000000_D9031B0271BD5A0A; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0040000000000000_424250B37C3DD951; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0020000000000000_B8061B7ECD9A21E5; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0010000000000000_F15D0F286B65BD28; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0008000000000000_ADD0CC8D6E5DEBA1; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0004000000000000_E6D5F82752AD63D1; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0002000000000000_ECBFE3BD3F591A5E; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0001000000000000_F356834379D165CD; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000800000000000_2B9F982F20037FA9; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000400000000000_889DE068A16F0BE6; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000200000000000_E19E275D846A1298; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000100000000000_329A8ED523D71AEC; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000080000000000_E7FCE22557D23C97; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000040000000000_12A9F5817FF2D65D; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000020000000000_A484C3AD38DC9C19; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000010000000000_FBE00A8A1EF8AD72; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000008000000000_750D079407521363; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000004000000000_64FEED9C724C2FAF; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000002000000000_F02B263B328E2B60; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000001000000000_9D64555A9A10B852; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000800000000_D106FF0BED5255D7; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000400000000_E1652C6B138C64A5; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000200000000_E428581186EC8F46; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000100000000_AEB5F5EDE22D1A36; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000080000000_E943D7568AEC0C5C; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000040000000_DF98C8276F54B04B; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000020000000_B160E4680F6C696F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000010000000_FA0752B07D9C4AB8; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000008000000_CA3A2B036DBC8502; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000004000000_5E0905517BB59BCF; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000002000000_814EEB3B91D90726; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000001000000_4D49DB1532919C9F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000800000_25EB5FC3F8CF0621; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000400000_AB6A20C0620D1C6F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000200000_79E90DBC98F92CCA; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000100000_866ECEDD8072BB0E; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000080000_8B54536F2F3E64A8; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000040000_EA51D3975595B86B; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000020000_CAFFC6AC4542DE31; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000010000_8DD45A2DDF90796C; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000008000_1029D55E880EC2D0; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000004000_5D86CB23639DBEA9; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000002000_1D1CA853AE7C0C5F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000001000_CE332329248F3228; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000800_8405D1ABE24FB942; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000400_E643D78090CA4207; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000200_48221B9937748A23; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000100_DD7C0BBD61FAFD54; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000080_2FBC291A570DB5C4; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000040_E07C30D7E4E26E12; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000020_0953E2258E8E90A1; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000010_5B711BC4CEEBF2EE; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000008_CC083F1E6D9E85F6; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000004_D2FD8867D50D2DFE; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000002_06E7EA22CE92708F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0000000000000001_166B40B44ABA4BD6; ZZZ=ZZZ+1;
x[ZZZ]=192'h8001010101010101_0000000000000000_95A8D72813DAA94D; ZZZ=ZZZ+1;
x[ZZZ]=192'h4001010101010101_0000000000000000_0EEC1487DD8C26D5; ZZZ=ZZZ+1;
x[ZZZ]=192'h2001010101010101_0000000000000000_7AD16FFB79C45926; ZZZ=ZZZ+1;
x[ZZZ]=192'h1001010101010101_0000000000000000_D3746294CA6A6CF3; ZZZ=ZZZ+1;
x[ZZZ]=192'h0801010101010101_0000000000000000_809F5F873C1FD761; ZZZ=ZZZ+1;
x[ZZZ]=192'h0401010101010101_0000000000000000_C02FAFFEC989D1FC; ZZZ=ZZZ+1;
x[ZZZ]=192'h0201010101010101_0000000000000000_4615AA1D33E72F10; ZZZ=ZZZ+1;
x[ZZZ]=192'h0180010101010101_0000000000000000_2055123350C00858; ZZZ=ZZZ+1;
x[ZZZ]=192'h0140010101010101_0000000000000000_DF3B99D6577397C8; ZZZ=ZZZ+1;
x[ZZZ]=192'h0120010101010101_0000000000000000_31FE17369B5288C9; ZZZ=ZZZ+1;
x[ZZZ]=192'h0110010101010101_0000000000000000_DFDD3CC64DAE1642; ZZZ=ZZZ+1;
x[ZZZ]=192'h0108010101010101_0000000000000000_178C83CE2B399D94; ZZZ=ZZZ+1;
x[ZZZ]=192'h0104010101010101_0000000000000000_50F636324A9B7F80; ZZZ=ZZZ+1;
x[ZZZ]=192'h0102010101010101_0000000000000000_A8468EE3BC18F06D; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101800101010101_0000000000000000_A2DC9E92FD3CDE92; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101400101010101_0000000000000000_CAC09F797D031287; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101200101010101_0000000000000000_90BA680B22AEB525; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101100101010101_0000000000000000_CE7A24F350E280B6; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101080101010101_0000000000000000_882BFF0AA01A0B87; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101040101010101_0000000000000000_25610288924511C2; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101020101010101_0000000000000000_C71516C29C75D170; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101018001010101_0000000000000000_5199C29A52C9F059; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101014001010101_0000000000000000_C22F0A294A71F29F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101012001010101_0000000000000000_EE371483714C02EA; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101011001010101_0000000000000000_A81FBD448F9E522F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010801010101_0000000000000000_4F644C92E192DFED; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010401010101_0000000000000000_1AFA9A66A6DF92AE; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010201010101_0000000000000000_B3C1CC715CB879D8; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010180010101_0000000000000000_19D032E64AB0BD8B; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010140010101_0000000000000000_3CFAA7A7DC8720DC; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010120010101_0000000000000000_B7265F7F447AC6F3; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010110010101_0000000000000000_9DB73B3C0D163F54; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010108010101_0000000000000000_8181B65BABF4A975; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010104010101_0000000000000000_93C9B64042EAA240; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010102010101_0000000000000000_5570530829705592; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101800101_0000000000000000_8638809E878787A0; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101400101_0000000000000000_41B9A79AF79AC208; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101200101_0000000000000000_7A9BE42F2009A892; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101100101_0000000000000000_29038D56BA6D2745; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101080101_0000000000000000_5495C6ABF1E5DF51; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101040101_0000000000000000_AE13DBD561488933; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101020101_0000000000000000_024D1FFA8904E389; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101018001_0000000000000000_D1399712F99BF02E; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101014001_0000000000000000_14C1D7C1CFFEC79E; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101012001_0000000000000000_1DE5279DAE3BED6F; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101011001_0000000000000000_E941A33F85501303; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010801_0000000000000000_DA99DBBC9A03F379; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010401_0000000000000000_B7FC92F91D8E92E9; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010201_0000000000000000_AE8E5CAA3CA04E85; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010180_0000000000000000_9CC62DF43B6EED74; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010140_0000000000000000_D863DBB5C59A91A0; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010120_0000000000000000_A1AB2190545B91D7; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010110_0000000000000000_0875041E64C570F7; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010108_0000000000000000_5A594528BEBEF1CC; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010104_0000000000000000_FCDB3291DE21F0C0; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010102_0000000000000000_869EFD7F9F265A09; ZZZ=ZZZ+1;
x[ZZZ]=192'h1046913489980131_0000000000000000_88D55E54F54C97B4; ZZZ=ZZZ+1;
x[ZZZ]=192'h1007103489988020_0000000000000000_0C0CC00C83EA48FD; ZZZ=ZZZ+1;
x[ZZZ]=192'h10071034C8980120_0000000000000000_83BC8EF3A6570183; ZZZ=ZZZ+1;
x[ZZZ]=192'h1046103489988020_0000000000000000_DF725DCAD94EA2E9; ZZZ=ZZZ+1;
x[ZZZ]=192'h1086911519190101_0000000000000000_E652B53B550BE8B0; ZZZ=ZZZ+1;
x[ZZZ]=192'h1086911519580101_0000000000000000_AF527120C485CBB0; ZZZ=ZZZ+1;
x[ZZZ]=192'h5107B01519580101_0000000000000000_0F04CE393DB926D5; ZZZ=ZZZ+1;
x[ZZZ]=192'h1007B01519190101_0000000000000000_C9F00FFC74079067; ZZZ=ZZZ+1;
x[ZZZ]=192'h3107915498080101_0000000000000000_7CFD82A593252B4E; ZZZ=ZZZ+1;
x[ZZZ]=192'h3107919498080101_0000000000000000_CB49A2F9E91363E3; ZZZ=ZZZ+1;
x[ZZZ]=192'h10079115B9080140_0000000000000000_00B588BE70D23F56; ZZZ=ZZZ+1;
x[ZZZ]=192'h3107911598080140_0000000000000000_406A9A6AB43399AE; ZZZ=ZZZ+1;
x[ZZZ]=192'h1007D01589980101_0000000000000000_6CB773611DCA9ADA; ZZZ=ZZZ+1;
x[ZZZ]=192'h9107911589980101_0000000000000000_67FD21C17DBB5D70; ZZZ=ZZZ+1;
x[ZZZ]=192'h9107D01589190101_0000000000000000_9592CB4110430787; ZZZ=ZZZ+1;
x[ZZZ]=192'h1007D01598980120_0000000000000000_A6B7FF68A318DDD3; ZZZ=ZZZ+1;
x[ZZZ]=192'h1007940498190101_0000000000000000_4D102196C914CA16; ZZZ=ZZZ+1;
x[ZZZ]=192'h0107910491190401_0000000000000000_2DFA9F4573594965; ZZZ=ZZZ+1;
x[ZZZ]=192'h0107910491190101_0000000000000000_B46604816C0E0774; ZZZ=ZZZ+1;
x[ZZZ]=192'h0107940491190401_0000000000000000_6E7E6221A4F34E87; ZZZ=ZZZ+1;
x[ZZZ]=192'h19079210981A0101_0000000000000000_AA85E74643233199; ZZZ=ZZZ+1;
x[ZZZ]=192'h1007911998190801_0000000000000000_2E5A19DB4D1962D6; ZZZ=ZZZ+1;
x[ZZZ]=192'h10079119981A0801_0000000000000000_23A866A809D30894; ZZZ=ZZZ+1;
x[ZZZ]=192'h1007921098190101_0000000000000000_D812D961F017D320; ZZZ=ZZZ+1;
x[ZZZ]=192'h100791159819010B_0000000000000000_055605816E58608F; ZZZ=ZZZ+1;
x[ZZZ]=192'h1004801598190101_0000000000000000_ABD88E8B1B7716F1; ZZZ=ZZZ+1;
x[ZZZ]=192'h1004801598190102_0000000000000000_537AC95BE69DA1E1; ZZZ=ZZZ+1;
x[ZZZ]=192'h1004801598190108_0000000000000000_AED0F6AE3C25CDD8; ZZZ=ZZZ+1;
x[ZZZ]=192'h1002911498100104_0000000000000000_B3E35A5EE53E7B8D; ZZZ=ZZZ+1;
x[ZZZ]=192'h1002911598190104_0000000000000000_61C79C71921A2EF8; ZZZ=ZZZ+1;
x[ZZZ]=192'h1002911598100201_0000000000000000_E2F5728F0995013C; ZZZ=ZZZ+1;
x[ZZZ]=192'h1002911698100101_0000000000000000_1AEAC39A61F0A464; ZZZ=ZZZ+1;
x[ZZZ]=192'h7CA110454A1A6E57_01A1D6D039776742_690F5B0D9A26939B; ZZZ=ZZZ+1;
x[ZZZ]=192'h0131D9619DC1376E_5CD54CA83DEF57DA_7A389D10354BD271; ZZZ=ZZZ+1;
x[ZZZ]=192'h07A1133E4A0B2686_0248D43806F67172_868EBB51CAB4599A; ZZZ=ZZZ+1;
x[ZZZ]=192'h3849674C2602319E_51454B582DDF440A_7178876E01F19B2A; ZZZ=ZZZ+1;
x[ZZZ]=192'h04B915BA43FEB5B6_42FD443059577FA2_AF37FB421F8C4095; ZZZ=ZZZ+1;
x[ZZZ]=192'h0113B970FD34F2CE_059B5E0851CF143A_86A560F10EC6D85B; ZZZ=ZZZ+1;
x[ZZZ]=192'h0170F175468FB5E6_0756D8E0774761D2_0CD3DA020021DC09; ZZZ=ZZZ+1;
x[ZZZ]=192'h43297FAD38E373FE_762514B829BF486A_EA676B2CB7DB2B7A; ZZZ=ZZZ+1;
x[ZZZ]=192'h07A7137045DA2A16_3BDD119049372802_DFD64A815CAF1A0F; ZZZ=ZZZ+1;
x[ZZZ]=192'h04689104C2FD3B2F_26955F6835AF609A_5C513C9C4886C088; ZZZ=ZZZ+1;
x[ZZZ]=192'h37D06BB516CB7546_164D5E404F275232_0A2AEEAE3FF4AB77; ZZZ=ZZZ+1;
x[ZZZ]=192'h1F08260D1AC2465E_6B056E18759F5CCA_EF1BF03E5DFA575A; ZZZ=ZZZ+1;
x[ZZZ]=192'h584023641ABA6176_004BD6EF09176062_88BF0DB6D70DEE56; ZZZ=ZZZ+1;
x[ZZZ]=192'h025816164629B007_480D39006EE762F2_A1F9915541020B56; ZZZ=ZZZ+1;
x[ZZZ]=192'h49793EBC79B3258F_437540C8698F3CFA_6FBF1CAFCFFD0556; ZZZ=ZZZ+1;
x[ZZZ]=192'h4FB05E1515AB73A7_072D43A077075292_2F22E49BAB7CA1AC; ZZZ=ZZZ+1;
x[ZZZ]=192'h49E95D6D4CA229BF_02FE55778117F12A_5A6B612CC26CCE4A; ZZZ=ZZZ+1;
x[ZZZ]=192'h018310DC409B26D6_1D9D5C5018F728C2_5F4C038ED12B2E41; ZZZ=ZZZ+1;
x[ZZZ]=192'h1C587F1C13924FEF_305532286D6F295A_63FAC0D034D9F793; ZZZ=ZZZ+1;
x[ZZZ]=192'h0000000000000000_0000000000000000_8CA64DE9C1B123A7; ZZZ=ZZZ+1;
x[ZZZ]=192'hFFFFFFFFFFFFFFFF_FFFFFFFFFFFFFFFF_7359B2163E4EDC58; ZZZ=ZZZ+1;
x[ZZZ]=192'h3000000000000000_1000000000000001_958E6E627A05557B; ZZZ=ZZZ+1;
x[ZZZ]=192'h1111111111111111_1111111111111111_F40379AB9E0EC533; ZZZ=ZZZ+1;
x[ZZZ]=192'h0123456789ABCDEF_1111111111111111_17668DFC7292532D; ZZZ=ZZZ+1;
x[ZZZ]=192'h1111111111111111_0123456789ABCDEF_8A5AE1F81AB8F2DD; ZZZ=ZZZ+1;
x[ZZZ]=192'h0000000000000000_0000000000000000_8CA64DE9C1B123A7; ZZZ=ZZZ+1;
x[ZZZ]=192'hFEDCBA9876543210_0123456789ABCDEF_ED39D950FA74BCC4; ZZZ=ZZZ+1;
x[ZZZ]=192'h7CA110454A1A6E57_01A1D6D039776742_690F5B0D9A26939B; ZZZ=ZZZ+1;
x[ZZZ]=192'h0131D9619DC1376E_5CD54CA83DEF57DA_7A389D10354BD271; ZZZ=ZZZ+1;
x[ZZZ]=192'h07A1133E4A0B2686_0248D43806F67172_868EBB51CAB4599A; ZZZ=ZZZ+1;
x[ZZZ]=192'h3849674C2602319E_51454B582DDF440A_7178876E01F19B2A; ZZZ=ZZZ+1;
x[ZZZ]=192'h04B915BA43FEB5B6_42FD443059577FA2_AF37FB421F8C4095; ZZZ=ZZZ+1;
x[ZZZ]=192'h0113B970FD34F2CE_059B5E0851CF143A_86A560F10EC6D85B; ZZZ=ZZZ+1;
x[ZZZ]=192'h0170F175468FB5E6_0756D8E0774761D2_0CD3DA020021DC09; ZZZ=ZZZ+1;
x[ZZZ]=192'h43297FAD38E373FE_762514B829BF486A_EA676B2CB7DB2B7A; ZZZ=ZZZ+1;
x[ZZZ]=192'h07A7137045DA2A16_3BDD119049372802_DFD64A815CAF1A0F; ZZZ=ZZZ+1;
x[ZZZ]=192'h04689104C2FD3B2F_26955F6835AF609A_5C513C9C4886C088; ZZZ=ZZZ+1;
x[ZZZ]=192'h37D06BB516CB7546_164D5E404F275232_0A2AEEAE3FF4AB77; ZZZ=ZZZ+1;
x[ZZZ]=192'h1F08260D1AC2465E_6B056E18759F5CCA_EF1BF03E5DFA575A; ZZZ=ZZZ+1;
x[ZZZ]=192'h584023641ABA6176_004BD6EF09176062_88BF0DB6D70DEE56; ZZZ=ZZZ+1;
x[ZZZ]=192'h025816164629B007_480D39006EE762F2_A1F9915541020B56; ZZZ=ZZZ+1;
x[ZZZ]=192'h49793EBC79B3258F_437540C8698F3CFA_6FBF1CAFCFFD0556; ZZZ=ZZZ+1;
x[ZZZ]=192'h4FB05E1515AB73A7_072D43A077075292_2F22E49BAB7CA1AC; ZZZ=ZZZ+1;
x[ZZZ]=192'h49E95D6D4CA229BF_02FE55778117F12A_5A6B612CC26CCE4A; ZZZ=ZZZ+1;
x[ZZZ]=192'h018310DC409B26D6_1D9D5C5018F728C2_5F4C038ED12B2E41; ZZZ=ZZZ+1;
x[ZZZ]=192'h1C587F1C13924FEF_305532286D6F295A_63FAC0D034D9F793; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010101_0123456789ABCDEF_617B3A0CE8F07100; ZZZ=ZZZ+1;
x[ZZZ]=192'h1F1F1F1F0E0E0E0E_0123456789ABCDEF_DB958605F8C8C606; ZZZ=ZZZ+1;
x[ZZZ]=192'hE0FEE0FEF1FEF1FE_0123456789ABCDEF_EDBFD1C66C29CCC7; ZZZ=ZZZ+1;
x[ZZZ]=192'h0000000000000000_FFFFFFFFFFFFFFFF_355550B2150E2451; ZZZ=ZZZ+1;
x[ZZZ]=192'hFFFFFFFFFFFFFFFF_0000000000000000_CAAAAF4DEAF1DBAE; ZZZ=ZZZ+1;
x[ZZZ]=192'h0123456789ABCDEF_0000000000000000_D5D44FF720683D0D; ZZZ=ZZZ+1;
x[ZZZ]=192'hFEDCBA9876543210_FFFFFFFFFFFFFFFF_2A2BB008DF97C2F2; ZZZ=ZZZ+1;
//decrypt
x[ZZZ]=192'h8001010101010101_95A8D72813DAA94D_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h4001010101010101_0EEC1487DD8C26D5_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h2001010101010101_7AD16FFB79C45926_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h1001010101010101_D3746294CA6A6CF3_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0801010101010101_809F5F873C1FD761_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0401010101010101_C02FAFFEC989D1FC_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0201010101010101_4615AA1D33E72F10_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0180010101010101_2055123350C00858_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0140010101010101_DF3B99D6577397C8_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0120010101010101_31FE17369B5288C9_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0110010101010101_DFDD3CC64DAE1642_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0108010101010101_178C83CE2B399D94_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0104010101010101_50F636324A9B7F80_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0102010101010101_A8468EE3BC18F06D_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101800101010101_A2DC9E92FD3CDE92_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101400101010101_CAC09F797D031287_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101200101010101_90BA680B22AEB525_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101100101010101_CE7A24F350E280B6_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101080101010101_882BFF0AA01A0B87_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101040101010101_25610288924511C2_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101020101010101_C71516C29C75D170_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101018001010101_5199C29A52C9F059_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101014001010101_C22F0A294A71F29F_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101012001010101_EE371483714C02EA_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101011001010101_A81FBD448F9E522F_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010801010101_4F644C92E192DFED_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010401010101_1AFA9A66A6DF92AE_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010201010101_B3C1CC715CB879D8_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010180010101_19D032E64AB0BD8B_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010140010101_3CFAA7A7DC8720DC_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010120010101_B7265F7F447AC6F3_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010110010101_9DB73B3C0D163F54_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010108010101_8181B65BABF4A975_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010104010101_93C9B64042EAA240_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010102010101_5570530829705592_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101800101_8638809E878787A0_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101400101_41B9A79AF79AC208_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101200101_7A9BE42F2009A892_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101100101_29038D56BA6D2745_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101080101_5495C6ABF1E5DF51_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101040101_AE13DBD561488933_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101020101_024D1FFA8904E389_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101018001_D1399712F99BF02E_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101014001_14C1D7C1CFFEC79E_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101012001_1DE5279DAE3BED6F_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101011001_E941A33F85501303_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010801_DA99DBBC9A03F379_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010401_B7FC92F91D8E92E9_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010201_AE8E5CAA3CA04E85_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010180_9CC62DF43B6EED74_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010140_D863DBB5C59A91A0_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010120_A1AB2190545B91D7_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010110_0875041E64C570F7_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010108_5A594528BEBEF1CC_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010104_FCDB3291DE21F0C0_0000000000000000; ZZZ=ZZZ+1;
x[ZZZ]=192'h0101010101010102_869EFD7F9F265A09_0000000000000000; ZZZ=ZZZ+1;
decrypt = 0;
@(posedge clk);
 
$display("");
$display("**************************************");
$display("* Starting DES Test ... *");
$display("**************************************");
$display("");
 
for(decrypt=0;decrypt<2;decrypt=decrypt+1)
begin
if(decrypt) $display("Running Encrypt test ...\n");
else $display("Running Decrypt test ...\n");
 
for(select=0;select<90;select=select+1)
for(select=0;select<326;select=select+1)
begin
tmp=x[select];
for(cnt=0;cnt<15;cnt=cnt+1) @(posedge clk);
 
#10;
//if(desOut !== exp_out)
if((exp_out !== desOut) | (^exp_out===1'bx) | (^desOut===1'bx))
 
$display("ERROR: (%0d) Expected %x Got %x", select, exp_out, desOut);
//else
// $display("PASS : (%0d) Expected %x Got %x", select, exp_out, desOut);
// $display("PASS : (%0d) Expected %x Got %x", select, exp_out, desOut);
 
@(posedge clk);
end
193,13 → 440,15
$finish;
end // end of innitial
 
wire reverse = select > 269;
 
always #100 clk=~clk;
 
assign #1 key = {tmp[191:185],tmp[183:177],tmp[175:169],tmp[167:161],
tmp[159:153],tmp[151:145],tmp[143:137],tmp[135:129]};
 
assign #1 des_in = decrypt ? tmp[63:0] : tmp[127:64];
assign exp_out = decrypt ? tmp[127:64] : tmp[63:0];
assign #1 des_in = (decrypt[0]^reverse) ? tmp[63:0] : tmp[127:64];
assign exp_out = (decrypt[0]^reverse) ? tmp[127:64] : tmp[63:0];
 
des u0( .clk( clk ),
.desOut( desOut ),
206,7 → 455,7
.desIn( des_in ),
.key( key ),
.roundSel( cnt ),
.decrypt( decrypt[0] )
.decrypt( decrypt[0] )
);
 
endmodule
/trunk/rtl/verilog/common/crp.v
39,7 → 39,7
 
wire [1:48] E;
wire [1:48] X;
wire [1:48] S;
wire [1:32] S;
 
assign E[1:48] = { R[32], R[1], R[2], R[3], R[4], R[5], R[4], R[5],
R[6], R[7], R[8], R[9], R[8], R[9], R[10], R[11],
/trunk/rtl/verilog/area_opt/des3.v
0,0 → 1,148
/////////////////////////////////////////////////////////////////////
//// ////
//// DES ////
//// DES Top Level module ////
//// ////
//// Author: Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2001 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
//// ////
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ////
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ////
//// POSSIBILITY OF SUCH DAMAGE. ////
//// ////
/////////////////////////////////////////////////////////////////////
 
module des3(desOut, desIn, key1, key2, key3, decrypt, roundSel, clk);
output [63:0] desOut;
input [63:0] desIn;
input [55:0] key1;
input [55:0] key2;
input [55:0] key3;
input decrypt;
input [5:0] roundSel;
input clk;
 
wire [1:48] K_sub;
wire [1:64] IP, FP, tmp;
reg [1:64] FP_R;
reg [1:32] L, R;
wire [1:32] Xin;
wire [1:32] Lout;
wire [1:32] Rout;
wire [1:32] out;
 
//assign Lout = (roundSel == 0) ? IP[33:64] : R;
//assign Xin = (roundSel == 0) ? IP[01:32] : L;
 
 
assign Lout = (roundSel == 0) ? IP[33:64] :
( (roundSel == 16) ? FP_R[33:64] :
( (roundSel == 32) ? FP_R[33:64] :
R ));
 
assign Xin = (roundSel == 0) ? IP[01:32] :
( (roundSel == 16) ? FP_R[01:32] :
( (roundSel == 32) ? FP_R[01:32] :
L ));
 
 
 
/*
always @(roundSel or IP or tmp or R or FP)
case(roundSel)
6'h0: Lout = IP[33:64];
6'h10: Lout = FP[33:64];
6'h20: Lout = FP[33:64];
default: Lout = R;
endcase
 
always @(roundSel or IP or tmp or L or FP)
case(roundSel)
6'h0: Xin = IP[01:32];
6'h10: Xin = FP[01:32];
6'h20: Xin = FP[01:32];
default: Xin = L;
endcase
*/
 
always @(posedge clk)
FP_R <= #1 FP;
 
assign Rout = Xin ^ out;
assign FP = { Rout, Lout};
 
crp u0( .P(out), .R(Lout), .K_sub(K_sub) );
 
always @(posedge clk)
L <= #1 Lout;
 
always @(posedge clk)
R <= #1 Rout;
// Select a subkey from key.
key_sel3 u1(
.K_sub( K_sub ),
.key1( key1 ),
.key2( key2 ),
.key3( key3 ),
.roundSel( roundSel ),
.decrypt( decrypt )
);
 
assign tmp[1:64] = { desOut[06], desOut[14], desOut[22], desOut[30], desOut[38], desOut[46],
desOut[54], desOut[62], desOut[04], desOut[12], desOut[20], desOut[28],
desOut[36], desOut[44], desOut[52], desOut[60], desOut[02], desOut[10],
desOut[18], desOut[26], desOut[34], desOut[42], desOut[50], desOut[58],
desOut[00], desOut[08], desOut[16], desOut[24], desOut[32], desOut[40],
desOut[48], desOut[56], desOut[07], desOut[15], desOut[23], desOut[31],
desOut[39], desOut[47], desOut[55], desOut[63], desOut[05], desOut[13],
desOut[21], desOut[29], desOut[37], desOut[45], desOut[53], desOut[61],
desOut[03], desOut[11], desOut[19], desOut[27], desOut[35], desOut[43],
desOut[51], desOut[59], desOut[01], desOut[09], desOut[17], desOut[25],
desOut[33], desOut[41], desOut[49], desOut[57] };
 
// Perform initial permutation
assign IP[1:64] = { desIn[06], desIn[14], desIn[22], desIn[30], desIn[38], desIn[46],
desIn[54], desIn[62], desIn[04], desIn[12], desIn[20], desIn[28],
desIn[36], desIn[44], desIn[52], desIn[60], desIn[02], desIn[10],
desIn[18], desIn[26], desIn[34], desIn[42], desIn[50], desIn[58],
desIn[00], desIn[08], desIn[16], desIn[24], desIn[32], desIn[40],
desIn[48], desIn[56], desIn[07], desIn[15], desIn[23], desIn[31],
desIn[39], desIn[47], desIn[55], desIn[63], desIn[05], desIn[13],
desIn[21], desIn[29], desIn[37], desIn[45], desIn[53], desIn[61],
desIn[03], desIn[11], desIn[19], desIn[27], desIn[35], desIn[43],
desIn[51], desIn[59], desIn[01], desIn[09], desIn[17], desIn[25],
desIn[33], desIn[41], desIn[49], desIn[57] };
 
// Perform final permutation
assign desOut = { FP[40], FP[08], FP[48], FP[16], FP[56], FP[24], FP[64], FP[32],
FP[39], FP[07], FP[47], FP[15], FP[55], FP[23], FP[63], FP[31],
FP[38], FP[06], FP[46], FP[14], FP[54], FP[22], FP[62], FP[30],
FP[37], FP[05], FP[45], FP[13], FP[53], FP[21], FP[61], FP[29],
FP[36], FP[04], FP[44], FP[12], FP[52], FP[20], FP[60], FP[28],
FP[35], FP[03], FP[43], FP[11], FP[51], FP[19], FP[59], FP[27],
FP[34], FP[02], FP[42], FP[10], FP[50], FP[18], FP[58], FP[26],
FP[33], FP[01], FP[41], FP[09], FP[49], FP[17], FP[57], FP[25] };
 
 
endmodule
/trunk/rtl/verilog/area_opt/key_sel3.v
0,0 → 1,865
/////////////////////////////////////////////////////////////////////
//// ////
//// KEY_SEL ////
//// Select one of 16 sub-keys for round ////
//// ////
//// Author: Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2001 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
//// ////
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ////
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ////
//// POSSIBILITY OF SUCH DAMAGE. ////
//// ////
/////////////////////////////////////////////////////////////////////
 
module key_sel3(K_sub, key1, key2, key3, roundSel, decrypt);
output [1:48] K_sub;
input [55:0] key1, key2, key3;
input [5:0] roundSel;
input decrypt;
 
wire decrypt_int;
reg [55:0] K;
reg [1:48] K_sub;
wire [1:48] K1, K2, K3, K4, K5, K6, K7, K8, K9;
wire [1:48] K10, K11, K12, K13, K14, K15, K16;
 
always @(roundSel or decrypt or key1 or key2 or key3)
case ({decrypt, roundSel[5:4]}) // synopsys full_case parallel_case
3'b0_00: K = key1;
3'b0_01: K = key2;
3'b0_10: K = key3;
3'b1_00: K = key3;
3'b1_01: K = key2;
3'b1_10: K = key1;
endcase
 
assign decrypt_int = (roundSel[5:4]==2'h1) ? !decrypt : decrypt;
 
always @(K1 or K2 or K3 or K4 or K5 or K6 or K7 or K8 or K9 or K10
or K11 or K12 or K13 or K14 or K15 or K16 or roundSel)
case(roundSel[3:0]) // synopsys full_case parallel_case
0: K_sub = K1;
1: K_sub = K2;
2: K_sub = K3;
3: K_sub = K4;
4: K_sub = K5;
5: K_sub = K6;
6: K_sub = K7;
7: K_sub = K8;
8: K_sub = K9;
9: K_sub = K10;
10: K_sub = K11;
11: K_sub = K12;
12: K_sub = K13;
13: K_sub = K14;
14: K_sub = K15;
15: K_sub = K16;
endcase
 
 
assign K16[1] = decrypt_int ? K[47] : K[40];
assign K16[2] = decrypt_int ? K[11] : K[4];
assign K16[3] = decrypt_int ? K[26] : K[19];
assign K16[4] = decrypt_int ? K[3] : K[53];
assign K16[5] = decrypt_int ? K[13] : K[6];
assign K16[6] = decrypt_int ? K[41] : K[34];
assign K16[7] = decrypt_int ? K[27] : K[20];
assign K16[8] = decrypt_int ? K[6] : K[24];
assign K16[9] = decrypt_int ? K[54] : K[47];
assign K16[10] = decrypt_int ? K[48] : K[41];
assign K16[11] = decrypt_int ? K[39] : K[32];
assign K16[12] = decrypt_int ? K[19] : K[12];
assign K16[13] = decrypt_int ? K[53] : K[46];
assign K16[14] = decrypt_int ? K[25] : K[18];
assign K16[15] = decrypt_int ? K[33] : K[26];
assign K16[16] = decrypt_int ? K[34] : K[27];
assign K16[17] = decrypt_int ? K[17] : K[10];
assign K16[18] = decrypt_int ? K[5] : K[55];
assign K16[19] = decrypt_int ? K[4] : K[54];
assign K16[20] = decrypt_int ? K[55] : K[48];
assign K16[21] = decrypt_int ? K[24] : K[17];
assign K16[22] = decrypt_int ? K[32] : K[25];
assign K16[23] = decrypt_int ? K[40] : K[33];
assign K16[24] = decrypt_int ? K[20] : K[13];
assign K16[25] = decrypt_int ? K[36] : K[29];
assign K16[26] = decrypt_int ? K[31] : K[51];
assign K16[27] = decrypt_int ? K[21] : K[14];
assign K16[28] = decrypt_int ? K[8] : K[1];
assign K16[29] = decrypt_int ? K[23] : K[16];
assign K16[30] = decrypt_int ? K[52] : K[45];
assign K16[31] = decrypt_int ? K[14] : K[7];
assign K16[32] = decrypt_int ? K[29] : K[22];
assign K16[33] = decrypt_int ? K[51] : K[44];
assign K16[34] = decrypt_int ? K[9] : K[2];
assign K16[35] = decrypt_int ? K[35] : K[28];
assign K16[36] = decrypt_int ? K[30] : K[23];
assign K16[37] = decrypt_int ? K[2] : K[50];
assign K16[38] = decrypt_int ? K[37] : K[30];
assign K16[39] = decrypt_int ? K[22] : K[15];
assign K16[40] = decrypt_int ? K[0] : K[52];
assign K16[41] = decrypt_int ? K[42] : K[35];
assign K16[42] = decrypt_int ? K[38] : K[31];
assign K16[43] = decrypt_int ? K[16] : K[9];
assign K16[44] = decrypt_int ? K[43] : K[36];
assign K16[45] = decrypt_int ? K[44] : K[37];
assign K16[46] = decrypt_int ? K[1] : K[49];
assign K16[47] = decrypt_int ? K[7] : K[0];
assign K16[48] = decrypt_int ? K[28] : K[21];
 
assign K15[1] = decrypt_int ? K[54] : K[33];
assign K15[2] = decrypt_int ? K[18] : K[54];
assign K15[3] = decrypt_int ? K[33] : K[12];
assign K15[4] = decrypt_int ? K[10] : K[46];
assign K15[5] = decrypt_int ? K[20] : K[24];
assign K15[6] = decrypt_int ? K[48] : K[27];
assign K15[7] = decrypt_int ? K[34] : K[13];
assign K15[8] = decrypt_int ? K[13] : K[17];
assign K15[9] = decrypt_int ? K[4] : K[40];
assign K15[10] = decrypt_int ? K[55] : K[34];
assign K15[11] = decrypt_int ? K[46] : K[25];
assign K15[12] = decrypt_int ? K[26] : K[5];
assign K15[13] = decrypt_int ? K[3] : K[39];
assign K15[14] = decrypt_int ? K[32] : K[11];
assign K15[15] = decrypt_int ? K[40] : K[19];
assign K15[16] = decrypt_int ? K[41] : K[20];
assign K15[17] = decrypt_int ? K[24] : K[3];
assign K15[18] = decrypt_int ? K[12] : K[48];
assign K15[19] = decrypt_int ? K[11] : K[47];
assign K15[20] = decrypt_int ? K[5] : K[41];
assign K15[21] = decrypt_int ? K[6] : K[10];
assign K15[22] = decrypt_int ? K[39] : K[18];
assign K15[23] = decrypt_int ? K[47] : K[26];
assign K15[24] = decrypt_int ? K[27] : K[6];
assign K15[25] = decrypt_int ? K[43] : K[22];
assign K15[26] = decrypt_int ? K[38] : K[44];
assign K15[27] = decrypt_int ? K[28] : K[7];
assign K15[28] = decrypt_int ? K[15] : K[49];
assign K15[29] = decrypt_int ? K[30] : K[9];
assign K15[30] = decrypt_int ? K[0] : K[38];
assign K15[31] = decrypt_int ? K[21] : K[0];
assign K15[32] = decrypt_int ? K[36] : K[15];
assign K15[33] = decrypt_int ? K[31] : K[37];
assign K15[34] = decrypt_int ? K[16] : K[50];
assign K15[35] = decrypt_int ? K[42] : K[21];
assign K15[36] = decrypt_int ? K[37] : K[16];
assign K15[37] = decrypt_int ? K[9] : K[43];
assign K15[38] = decrypt_int ? K[44] : K[23];
assign K15[39] = decrypt_int ? K[29] : K[8];
assign K15[40] = decrypt_int ? K[7] : K[45];
assign K15[41] = decrypt_int ? K[49] : K[28];
assign K15[42] = decrypt_int ? K[45] : K[51];
assign K15[43] = decrypt_int ? K[23] : K[2];
assign K15[44] = decrypt_int ? K[50] : K[29];
assign K15[45] = decrypt_int ? K[51] : K[30];
assign K15[46] = decrypt_int ? K[8] : K[42];
assign K15[47] = decrypt_int ? K[14] : K[52];
assign K15[48] = decrypt_int ? K[35] : K[14];
 
assign K14[1] = decrypt_int ? K[11] : K[19];
assign K14[2] = decrypt_int ? K[32] : K[40];
assign K14[3] = decrypt_int ? K[47] : K[55];
assign K14[4] = decrypt_int ? K[24] : K[32];
assign K14[5] = decrypt_int ? K[34] : K[10];
assign K14[6] = decrypt_int ? K[5] : K[13];
assign K14[7] = decrypt_int ? K[48] : K[24];
assign K14[8] = decrypt_int ? K[27] : K[3];
assign K14[9] = decrypt_int ? K[18] : K[26];
assign K14[10] = decrypt_int ? K[12] : K[20];
assign K14[11] = decrypt_int ? K[3] : K[11];
assign K14[12] = decrypt_int ? K[40] : K[48];
assign K14[13] = decrypt_int ? K[17] : K[25];
assign K14[14] = decrypt_int ? K[46] : K[54];
assign K14[15] = decrypt_int ? K[54] : K[5];
assign K14[16] = decrypt_int ? K[55] : K[6];
assign K14[17] = decrypt_int ? K[13] : K[46];
assign K14[18] = decrypt_int ? K[26] : K[34];
assign K14[19] = decrypt_int ? K[25] : K[33];
assign K14[20] = decrypt_int ? K[19] : K[27];
assign K14[21] = decrypt_int ? K[20] : K[53];
assign K14[22] = decrypt_int ? K[53] : K[4];
assign K14[23] = decrypt_int ? K[4] : K[12];
assign K14[24] = decrypt_int ? K[41] : K[17];
assign K14[25] = decrypt_int ? K[2] : K[8];
assign K14[26] = decrypt_int ? K[52] : K[30];
assign K14[27] = decrypt_int ? K[42] : K[52];
assign K14[28] = decrypt_int ? K[29] : K[35];
assign K14[29] = decrypt_int ? K[44] : K[50];
assign K14[30] = decrypt_int ? K[14] : K[51];
assign K14[31] = decrypt_int ? K[35] : K[45];
assign K14[32] = decrypt_int ? K[50] : K[1];
assign K14[33] = decrypt_int ? K[45] : K[23];
assign K14[34] = decrypt_int ? K[30] : K[36];
assign K14[35] = decrypt_int ? K[1] : K[7];
assign K14[36] = decrypt_int ? K[51] : K[2];
assign K14[37] = decrypt_int ? K[23] : K[29];
assign K14[38] = decrypt_int ? K[31] : K[9];
assign K14[39] = decrypt_int ? K[43] : K[49];
assign K14[40] = decrypt_int ? K[21] : K[31];
assign K14[41] = decrypt_int ? K[8] : K[14];
assign K14[42] = decrypt_int ? K[0] : K[37];
assign K14[43] = decrypt_int ? K[37] : K[43];
assign K14[44] = decrypt_int ? K[9] : K[15];
assign K14[45] = decrypt_int ? K[38] : K[16];
assign K14[46] = decrypt_int ? K[22] : K[28];
assign K14[47] = decrypt_int ? K[28] : K[38];
assign K14[48] = decrypt_int ? K[49] : K[0];
 
assign K13[1] = decrypt_int ? K[25] : K[5];
assign K13[2] = decrypt_int ? K[46] : K[26];
assign K13[3] = decrypt_int ? K[4] : K[41];
assign K13[4] = decrypt_int ? K[13] : K[18];
assign K13[5] = decrypt_int ? K[48] : K[53];
assign K13[6] = decrypt_int ? K[19] : K[24];
assign K13[7] = decrypt_int ? K[5] : K[10];
assign K13[8] = decrypt_int ? K[41] : K[46];
assign K13[9] = decrypt_int ? K[32] : K[12];
assign K13[10] = decrypt_int ? K[26] : K[6];
assign K13[11] = decrypt_int ? K[17] : K[54];
assign K13[12] = decrypt_int ? K[54] : K[34];
assign K13[13] = decrypt_int ? K[6] : K[11];
assign K13[14] = decrypt_int ? K[3] : K[40];
assign K13[15] = decrypt_int ? K[11] : K[48];
assign K13[16] = decrypt_int ? K[12] : K[17];
assign K13[17] = decrypt_int ? K[27] : K[32];
assign K13[18] = decrypt_int ? K[40] : K[20];
assign K13[19] = decrypt_int ? K[39] : K[19];
assign K13[20] = decrypt_int ? K[33] : K[13];
assign K13[21] = decrypt_int ? K[34] : K[39];
assign K13[22] = decrypt_int ? K[10] : K[47];
assign K13[23] = decrypt_int ? K[18] : K[55];
assign K13[24] = decrypt_int ? K[55] : K[3];
assign K13[25] = decrypt_int ? K[16] : K[49];
assign K13[26] = decrypt_int ? K[7] : K[16];
assign K13[27] = decrypt_int ? K[1] : K[38];
assign K13[28] = decrypt_int ? K[43] : K[21];
assign K13[29] = decrypt_int ? K[31] : K[36];
assign K13[30] = decrypt_int ? K[28] : K[37];
assign K13[31] = decrypt_int ? K[49] : K[31];
assign K13[32] = decrypt_int ? K[9] : K[42];
assign K13[33] = decrypt_int ? K[0] : K[9];
assign K13[34] = decrypt_int ? K[44] : K[22];
assign K13[35] = decrypt_int ? K[15] : K[52];
assign K13[36] = decrypt_int ? K[38] : K[43];
assign K13[37] = decrypt_int ? K[37] : K[15];
assign K13[38] = decrypt_int ? K[45] : K[50];
assign K13[39] = decrypt_int ? K[2] : K[35];
assign K13[40] = decrypt_int ? K[35] : K[44];
assign K13[41] = decrypt_int ? K[22] : K[0];
assign K13[42] = decrypt_int ? K[14] : K[23];
assign K13[43] = decrypt_int ? K[51] : K[29];
assign K13[44] = decrypt_int ? K[23] : K[1];
assign K13[45] = decrypt_int ? K[52] : K[2];
assign K13[46] = decrypt_int ? K[36] : K[14];
assign K13[47] = decrypt_int ? K[42] : K[51];
assign K13[48] = decrypt_int ? K[8] : K[45];
 
assign K12[1] = decrypt_int ? K[39] : K[48];
assign K12[2] = decrypt_int ? K[3] : K[12];
assign K12[3] = decrypt_int ? K[18] : K[27];
assign K12[4] = decrypt_int ? K[27] : K[4];
assign K12[5] = decrypt_int ? K[5] : K[39];
assign K12[6] = decrypt_int ? K[33] : K[10];
assign K12[7] = decrypt_int ? K[19] : K[53];
assign K12[8] = decrypt_int ? K[55] : K[32];
assign K12[9] = decrypt_int ? K[46] : K[55];
assign K12[10] = decrypt_int ? K[40] : K[17];
assign K12[11] = decrypt_int ? K[6] : K[40];
assign K12[12] = decrypt_int ? K[11] : K[20];
assign K12[13] = decrypt_int ? K[20] : K[54];
assign K12[14] = decrypt_int ? K[17] : K[26];
assign K12[15] = decrypt_int ? K[25] : K[34];
assign K12[16] = decrypt_int ? K[26] : K[3];
assign K12[17] = decrypt_int ? K[41] : K[18];
assign K12[18] = decrypt_int ? K[54] : K[6];
assign K12[19] = decrypt_int ? K[53] : K[5];
assign K12[20] = decrypt_int ? K[47] : K[24];
assign K12[21] = decrypt_int ? K[48] : K[25];
assign K12[22] = decrypt_int ? K[24] : K[33];
assign K12[23] = decrypt_int ? K[32] : K[41];
assign K12[24] = decrypt_int ? K[12] : K[46];
assign K12[25] = decrypt_int ? K[30] : K[35];
assign K12[26] = decrypt_int ? K[21] : K[2];
assign K12[27] = decrypt_int ? K[15] : K[51];
assign K12[28] = decrypt_int ? K[2] : K[7];
assign K12[29] = decrypt_int ? K[45] : K[22];
assign K12[30] = decrypt_int ? K[42] : K[23];
assign K12[31] = decrypt_int ? K[8] : K[44];
assign K12[32] = decrypt_int ? K[23] : K[28];
assign K12[33] = decrypt_int ? K[14] : K[50];
assign K12[34] = decrypt_int ? K[31] : K[8];
assign K12[35] = decrypt_int ? K[29] : K[38];
assign K12[36] = decrypt_int ? K[52] : K[29];
assign K12[37] = decrypt_int ? K[51] : K[1];
assign K12[38] = decrypt_int ? K[0] : K[36];
assign K12[39] = decrypt_int ? K[16] : K[21];
assign K12[40] = decrypt_int ? K[49] : K[30];
assign K12[41] = decrypt_int ? K[36] : K[45];
assign K12[42] = decrypt_int ? K[28] : K[9];
assign K12[43] = decrypt_int ? K[38] : K[15];
assign K12[44] = decrypt_int ? K[37] : K[42];
assign K12[45] = decrypt_int ? K[7] : K[43];
assign K12[46] = decrypt_int ? K[50] : K[0];
assign K12[47] = decrypt_int ? K[1] : K[37];
assign K12[48] = decrypt_int ? K[22] : K[31];
 
assign K11[1] = decrypt_int ? K[53] : K[34];
assign K11[2] = decrypt_int ? K[17] : K[55];
assign K11[3] = decrypt_int ? K[32] : K[13];
assign K11[4] = decrypt_int ? K[41] : K[47];
assign K11[5] = decrypt_int ? K[19] : K[25];
assign K11[6] = decrypt_int ? K[47] : K[53];
assign K11[7] = decrypt_int ? K[33] : K[39];
assign K11[8] = decrypt_int ? K[12] : K[18];
assign K11[9] = decrypt_int ? K[3] : K[41];
assign K11[10] = decrypt_int ? K[54] : K[3];
assign K11[11] = decrypt_int ? K[20] : K[26];
assign K11[12] = decrypt_int ? K[25] : K[6];
assign K11[13] = decrypt_int ? K[34] : K[40];
assign K11[14] = decrypt_int ? K[6] : K[12];
assign K11[15] = decrypt_int ? K[39] : K[20];
assign K11[16] = decrypt_int ? K[40] : K[46];
assign K11[17] = decrypt_int ? K[55] : K[4];
assign K11[18] = decrypt_int ? K[11] : K[17];
assign K11[19] = decrypt_int ? K[10] : K[48];
assign K11[20] = decrypt_int ? K[4] : K[10];
assign K11[21] = decrypt_int ? K[5] : K[11];
assign K11[22] = decrypt_int ? K[13] : K[19];
assign K11[23] = decrypt_int ? K[46] : K[27];
assign K11[24] = decrypt_int ? K[26] : K[32];
assign K11[25] = decrypt_int ? K[44] : K[21];
assign K11[26] = decrypt_int ? K[35] : K[43];
assign K11[27] = decrypt_int ? K[29] : K[37];
assign K11[28] = decrypt_int ? K[16] : K[52];
assign K11[29] = decrypt_int ? K[0] : K[8];
assign K11[30] = decrypt_int ? K[1] : K[9];
assign K11[31] = decrypt_int ? K[22] : K[30];
assign K11[32] = decrypt_int ? K[37] : K[14];
assign K11[33] = decrypt_int ? K[28] : K[36];
assign K11[34] = decrypt_int ? K[45] : K[49];
assign K11[35] = decrypt_int ? K[43] : K[51];
assign K11[36] = decrypt_int ? K[7] : K[15];
assign K11[37] = decrypt_int ? K[38] : K[42];
assign K11[38] = decrypt_int ? K[14] : K[22];
assign K11[39] = decrypt_int ? K[30] : K[7];
assign K11[40] = decrypt_int ? K[8] : K[16];
assign K11[41] = decrypt_int ? K[50] : K[31];
assign K11[42] = decrypt_int ? K[42] : K[50];
assign K11[43] = decrypt_int ? K[52] : K[1];
assign K11[44] = decrypt_int ? K[51] : K[28];
assign K11[45] = decrypt_int ? K[21] : K[29];
assign K11[46] = decrypt_int ? K[9] : K[45];
assign K11[47] = decrypt_int ? K[15] : K[23];
assign K11[48] = decrypt_int ? K[36] : K[44];
 
assign K10[1] = decrypt_int ? K[10] : K[20];
assign K10[2] = decrypt_int ? K[6] : K[41];
assign K10[3] = decrypt_int ? K[46] : K[24];
assign K10[4] = decrypt_int ? K[55] : K[33];
assign K10[5] = decrypt_int ? K[33] : K[11];
assign K10[6] = decrypt_int ? K[4] : K[39];
assign K10[7] = decrypt_int ? K[47] : K[25];
assign K10[8] = decrypt_int ? K[26] : K[4];
assign K10[9] = decrypt_int ? K[17] : K[27];
assign K10[10] = decrypt_int ? K[11] : K[46];
assign K10[11] = decrypt_int ? K[34] : K[12];
assign K10[12] = decrypt_int ? K[39] : K[17];
assign K10[13] = decrypt_int ? K[48] : K[26];
assign K10[14] = decrypt_int ? K[20] : K[55];
assign K10[15] = decrypt_int ? K[53] : K[6];
assign K10[16] = decrypt_int ? K[54] : K[32];
assign K10[17] = decrypt_int ? K[12] : K[47];
assign K10[18] = decrypt_int ? K[25] : K[3];
assign K10[19] = decrypt_int ? K[24] : K[34];
assign K10[20] = decrypt_int ? K[18] : K[53];
assign K10[21] = decrypt_int ? K[19] : K[54];
assign K10[22] = decrypt_int ? K[27] : K[5];
assign K10[23] = decrypt_int ? K[3] : K[13];
assign K10[24] = decrypt_int ? K[40] : K[18];
assign K10[25] = decrypt_int ? K[31] : K[7];
assign K10[26] = decrypt_int ? K[49] : K[29];
assign K10[27] = decrypt_int ? K[43] : K[23];
assign K10[28] = decrypt_int ? K[30] : K[38];
assign K10[29] = decrypt_int ? K[14] : K[49];
assign K10[30] = decrypt_int ? K[15] : K[50];
assign K10[31] = decrypt_int ? K[36] : K[16];
assign K10[32] = decrypt_int ? K[51] : K[0];
assign K10[33] = decrypt_int ? K[42] : K[22];
assign K10[34] = decrypt_int ? K[0] : K[35];
assign K10[35] = decrypt_int ? K[2] : K[37];
assign K10[36] = decrypt_int ? K[21] : K[1];
assign K10[37] = decrypt_int ? K[52] : K[28];
assign K10[38] = decrypt_int ? K[28] : K[8];
assign K10[39] = decrypt_int ? K[44] : K[52];
assign K10[40] = decrypt_int ? K[22] : K[2];
assign K10[41] = decrypt_int ? K[9] : K[44];
assign K10[42] = decrypt_int ? K[1] : K[36];
assign K10[43] = decrypt_int ? K[7] : K[42];
assign K10[44] = decrypt_int ? K[38] : K[14];
assign K10[45] = decrypt_int ? K[35] : K[15];
assign K10[46] = decrypt_int ? K[23] : K[31];
assign K10[47] = decrypt_int ? K[29] : K[9];
assign K10[48] = decrypt_int ? K[50] : K[30];
 
assign K9[1] = decrypt_int ? K[24] : K[6];
assign K9[2] = decrypt_int ? K[20] : K[27];
assign K9[3] = decrypt_int ? K[3] : K[10];
assign K9[4] = decrypt_int ? K[12] : K[19];
assign K9[5] = decrypt_int ? K[47] : K[54];
assign K9[6] = decrypt_int ? K[18] : K[25];
assign K9[7] = decrypt_int ? K[4] : K[11];
assign K9[8] = decrypt_int ? K[40] : K[47];
assign K9[9] = decrypt_int ? K[6] : K[13];
assign K9[10] = decrypt_int ? K[25] : K[32];
assign K9[11] = decrypt_int ? K[48] : K[55];
assign K9[12] = decrypt_int ? K[53] : K[3];
assign K9[13] = decrypt_int ? K[5] : K[12];
assign K9[14] = decrypt_int ? K[34] : K[41];
assign K9[15] = decrypt_int ? K[10] : K[17];
assign K9[16] = decrypt_int ? K[11] : K[18];
assign K9[17] = decrypt_int ? K[26] : K[33];
assign K9[18] = decrypt_int ? K[39] : K[46];
assign K9[19] = decrypt_int ? K[13] : K[20];
assign K9[20] = decrypt_int ? K[32] : K[39];
assign K9[21] = decrypt_int ? K[33] : K[40];
assign K9[22] = decrypt_int ? K[41] : K[48];
assign K9[23] = decrypt_int ? K[17] : K[24];
assign K9[24] = decrypt_int ? K[54] : K[4];
assign K9[25] = decrypt_int ? K[45] : K[52];
assign K9[26] = decrypt_int ? K[8] : K[15];
assign K9[27] = decrypt_int ? K[2] : K[9];
assign K9[28] = decrypt_int ? K[44] : K[51];
assign K9[29] = decrypt_int ? K[28] : K[35];
assign K9[30] = decrypt_int ? K[29] : K[36];
assign K9[31] = decrypt_int ? K[50] : K[2];
assign K9[32] = decrypt_int ? K[38] : K[45];
assign K9[33] = decrypt_int ? K[1] : K[8];
assign K9[34] = decrypt_int ? K[14] : K[21];
assign K9[35] = decrypt_int ? K[16] : K[23];
assign K9[36] = decrypt_int ? K[35] : K[42];
assign K9[37] = decrypt_int ? K[7] : K[14];
assign K9[38] = decrypt_int ? K[42] : K[49];
assign K9[39] = decrypt_int ? K[31] : K[38];
assign K9[40] = decrypt_int ? K[36] : K[43];
assign K9[41] = decrypt_int ? K[23] : K[30];
assign K9[42] = decrypt_int ? K[15] : K[22];
assign K9[43] = decrypt_int ? K[21] : K[28];
assign K9[44] = decrypt_int ? K[52] : K[0];
assign K9[45] = decrypt_int ? K[49] : K[1];
assign K9[46] = decrypt_int ? K[37] : K[44];
assign K9[47] = decrypt_int ? K[43] : K[50];
assign K9[48] = decrypt_int ? K[9] : K[16];
 
assign K8[1] = decrypt_int ? K[6] : K[24];
assign K8[2] = decrypt_int ? K[27] : K[20];
assign K8[3] = decrypt_int ? K[10] : K[3];
assign K8[4] = decrypt_int ? K[19] : K[12];
assign K8[5] = decrypt_int ? K[54] : K[47];
assign K8[6] = decrypt_int ? K[25] : K[18];
assign K8[7] = decrypt_int ? K[11] : K[4];
assign K8[8] = decrypt_int ? K[47] : K[40];
assign K8[9] = decrypt_int ? K[13] : K[6];
assign K8[10] = decrypt_int ? K[32] : K[25];
assign K8[11] = decrypt_int ? K[55] : K[48];
assign K8[12] = decrypt_int ? K[3] : K[53];
assign K8[13] = decrypt_int ? K[12] : K[5];
assign K8[14] = decrypt_int ? K[41] : K[34];
assign K8[15] = decrypt_int ? K[17] : K[10];
assign K8[16] = decrypt_int ? K[18] : K[11];
assign K8[17] = decrypt_int ? K[33] : K[26];
assign K8[18] = decrypt_int ? K[46] : K[39];
assign K8[19] = decrypt_int ? K[20] : K[13];
assign K8[20] = decrypt_int ? K[39] : K[32];
assign K8[21] = decrypt_int ? K[40] : K[33];
assign K8[22] = decrypt_int ? K[48] : K[41];
assign K8[23] = decrypt_int ? K[24] : K[17];
assign K8[24] = decrypt_int ? K[4] : K[54];
assign K8[25] = decrypt_int ? K[52] : K[45];
assign K8[26] = decrypt_int ? K[15] : K[8];
assign K8[27] = decrypt_int ? K[9] : K[2];
assign K8[28] = decrypt_int ? K[51] : K[44];
assign K8[29] = decrypt_int ? K[35] : K[28];
assign K8[30] = decrypt_int ? K[36] : K[29];
assign K8[31] = decrypt_int ? K[2] : K[50];
assign K8[32] = decrypt_int ? K[45] : K[38];
assign K8[33] = decrypt_int ? K[8] : K[1];
assign K8[34] = decrypt_int ? K[21] : K[14];
assign K8[35] = decrypt_int ? K[23] : K[16];
assign K8[36] = decrypt_int ? K[42] : K[35];
assign K8[37] = decrypt_int ? K[14] : K[7];
assign K8[38] = decrypt_int ? K[49] : K[42];
assign K8[39] = decrypt_int ? K[38] : K[31];
assign K8[40] = decrypt_int ? K[43] : K[36];
assign K8[41] = decrypt_int ? K[30] : K[23];
assign K8[42] = decrypt_int ? K[22] : K[15];
assign K8[43] = decrypt_int ? K[28] : K[21];
assign K8[44] = decrypt_int ? K[0] : K[52];
assign K8[45] = decrypt_int ? K[1] : K[49];
assign K8[46] = decrypt_int ? K[44] : K[37];
assign K8[47] = decrypt_int ? K[50] : K[43];
assign K8[48] = decrypt_int ? K[16] : K[9];
assign K7[1] = decrypt_int ? K[20] : K[10];
assign K7[2] = decrypt_int ? K[41] : K[6];
assign K7[3] = decrypt_int ? K[24] : K[46];
assign K7[4] = decrypt_int ? K[33] : K[55];
assign K7[5] = decrypt_int ? K[11] : K[33];
assign K7[6] = decrypt_int ? K[39] : K[4];
assign K7[7] = decrypt_int ? K[25] : K[47];
assign K7[8] = decrypt_int ? K[4] : K[26];
assign K7[9] = decrypt_int ? K[27] : K[17];
assign K7[10] = decrypt_int ? K[46] : K[11];
assign K7[11] = decrypt_int ? K[12] : K[34];
assign K7[12] = decrypt_int ? K[17] : K[39];
assign K7[13] = decrypt_int ? K[26] : K[48];
assign K7[14] = decrypt_int ? K[55] : K[20];
assign K7[15] = decrypt_int ? K[6] : K[53];
assign K7[16] = decrypt_int ? K[32] : K[54];
assign K7[17] = decrypt_int ? K[47] : K[12];
assign K7[18] = decrypt_int ? K[3] : K[25];
assign K7[19] = decrypt_int ? K[34] : K[24];
assign K7[20] = decrypt_int ? K[53] : K[18];
assign K7[21] = decrypt_int ? K[54] : K[19];
assign K7[22] = decrypt_int ? K[5] : K[27];
assign K7[23] = decrypt_int ? K[13] : K[3];
assign K7[24] = decrypt_int ? K[18] : K[40];
assign K7[25] = decrypt_int ? K[7] : K[31];
assign K7[26] = decrypt_int ? K[29] : K[49];
assign K7[27] = decrypt_int ? K[23] : K[43];
assign K7[28] = decrypt_int ? K[38] : K[30];
assign K7[29] = decrypt_int ? K[49] : K[14];
assign K7[30] = decrypt_int ? K[50] : K[15];
assign K7[31] = decrypt_int ? K[16] : K[36];
assign K7[32] = decrypt_int ? K[0] : K[51];
assign K7[33] = decrypt_int ? K[22] : K[42];
assign K7[34] = decrypt_int ? K[35] : K[0];
assign K7[35] = decrypt_int ? K[37] : K[2];
assign K7[36] = decrypt_int ? K[1] : K[21];
assign K7[37] = decrypt_int ? K[28] : K[52];
assign K7[38] = decrypt_int ? K[8] : K[28];
assign K7[39] = decrypt_int ? K[52] : K[44];
assign K7[40] = decrypt_int ? K[2] : K[22];
assign K7[41] = decrypt_int ? K[44] : K[9];
assign K7[42] = decrypt_int ? K[36] : K[1];
assign K7[43] = decrypt_int ? K[42] : K[7];
assign K7[44] = decrypt_int ? K[14] : K[38];
assign K7[45] = decrypt_int ? K[15] : K[35];
assign K7[46] = decrypt_int ? K[31] : K[23];
assign K7[47] = decrypt_int ? K[9] : K[29];
assign K7[48] = decrypt_int ? K[30] : K[50];
 
assign K6[1] = decrypt_int ? K[34] : K[53];
assign K6[2] = decrypt_int ? K[55] : K[17];
assign K6[3] = decrypt_int ? K[13] : K[32];
assign K6[4] = decrypt_int ? K[47] : K[41];
assign K6[5] = decrypt_int ? K[25] : K[19];
assign K6[6] = decrypt_int ? K[53] : K[47];
assign K6[7] = decrypt_int ? K[39] : K[33];
assign K6[8] = decrypt_int ? K[18] : K[12];
assign K6[9] = decrypt_int ? K[41] : K[3];
assign K6[10] = decrypt_int ? K[3] : K[54];
assign K6[11] = decrypt_int ? K[26] : K[20];
assign K6[12] = decrypt_int ? K[6] : K[25];
assign K6[13] = decrypt_int ? K[40] : K[34];
assign K6[14] = decrypt_int ? K[12] : K[6];
assign K6[15] = decrypt_int ? K[20] : K[39];
assign K6[16] = decrypt_int ? K[46] : K[40];
assign K6[17] = decrypt_int ? K[4] : K[55];
assign K6[18] = decrypt_int ? K[17] : K[11];
assign K6[19] = decrypt_int ? K[48] : K[10];
assign K6[20] = decrypt_int ? K[10] : K[4];
assign K6[21] = decrypt_int ? K[11] : K[5];
assign K6[22] = decrypt_int ? K[19] : K[13];
assign K6[23] = decrypt_int ? K[27] : K[46];
assign K6[24] = decrypt_int ? K[32] : K[26];
assign K6[25] = decrypt_int ? K[21] : K[44];
assign K6[26] = decrypt_int ? K[43] : K[35];
assign K6[27] = decrypt_int ? K[37] : K[29];
assign K6[28] = decrypt_int ? K[52] : K[16];
assign K6[29] = decrypt_int ? K[8] : K[0];
assign K6[30] = decrypt_int ? K[9] : K[1];
assign K6[31] = decrypt_int ? K[30] : K[22];
assign K6[32] = decrypt_int ? K[14] : K[37];
assign K6[33] = decrypt_int ? K[36] : K[28];
assign K6[34] = decrypt_int ? K[49] : K[45];
assign K6[35] = decrypt_int ? K[51] : K[43];
assign K6[36] = decrypt_int ? K[15] : K[7];
assign K6[37] = decrypt_int ? K[42] : K[38];
assign K6[38] = decrypt_int ? K[22] : K[14];
assign K6[39] = decrypt_int ? K[7] : K[30];
assign K6[40] = decrypt_int ? K[16] : K[8];
assign K6[41] = decrypt_int ? K[31] : K[50];
assign K6[42] = decrypt_int ? K[50] : K[42];
assign K6[43] = decrypt_int ? K[1] : K[52];
assign K6[44] = decrypt_int ? K[28] : K[51];
assign K6[45] = decrypt_int ? K[29] : K[21];
assign K6[46] = decrypt_int ? K[45] : K[9];
assign K6[47] = decrypt_int ? K[23] : K[15];
assign K6[48] = decrypt_int ? K[44] : K[36];
 
assign K5[1] = decrypt_int ? K[48] : K[39];
assign K5[2] = decrypt_int ? K[12] : K[3];
assign K5[3] = decrypt_int ? K[27] : K[18];
assign K5[4] = decrypt_int ? K[4] : K[27];
assign K5[5] = decrypt_int ? K[39] : K[5];
assign K5[6] = decrypt_int ? K[10] : K[33];
assign K5[7] = decrypt_int ? K[53] : K[19];
assign K5[8] = decrypt_int ? K[32] : K[55];
assign K5[9] = decrypt_int ? K[55] : K[46];
assign K5[10] = decrypt_int ? K[17] : K[40];
assign K5[11] = decrypt_int ? K[40] : K[6];
assign K5[12] = decrypt_int ? K[20] : K[11];
assign K5[13] = decrypt_int ? K[54] : K[20];
assign K5[14] = decrypt_int ? K[26] : K[17];
assign K5[15] = decrypt_int ? K[34] : K[25];
assign K5[16] = decrypt_int ? K[3] : K[26];
assign K5[17] = decrypt_int ? K[18] : K[41];
assign K5[18] = decrypt_int ? K[6] : K[54];
assign K5[19] = decrypt_int ? K[5] : K[53];
assign K5[20] = decrypt_int ? K[24] : K[47];
assign K5[21] = decrypt_int ? K[25] : K[48];
assign K5[22] = decrypt_int ? K[33] : K[24];
assign K5[23] = decrypt_int ? K[41] : K[32];
assign K5[24] = decrypt_int ? K[46] : K[12];
assign K5[25] = decrypt_int ? K[35] : K[30];
assign K5[26] = decrypt_int ? K[2] : K[21];
assign K5[27] = decrypt_int ? K[51] : K[15];
assign K5[28] = decrypt_int ? K[7] : K[2];
assign K5[29] = decrypt_int ? K[22] : K[45];
assign K5[30] = decrypt_int ? K[23] : K[42];
assign K5[31] = decrypt_int ? K[44] : K[8];
assign K5[32] = decrypt_int ? K[28] : K[23];
assign K5[33] = decrypt_int ? K[50] : K[14];
assign K5[34] = decrypt_int ? K[8] : K[31];
assign K5[35] = decrypt_int ? K[38] : K[29];
assign K5[36] = decrypt_int ? K[29] : K[52];
assign K5[37] = decrypt_int ? K[1] : K[51];
assign K5[38] = decrypt_int ? K[36] : K[0];
assign K5[39] = decrypt_int ? K[21] : K[16];
assign K5[40] = decrypt_int ? K[30] : K[49];
assign K5[41] = decrypt_int ? K[45] : K[36];
assign K5[42] = decrypt_int ? K[9] : K[28];
assign K5[43] = decrypt_int ? K[15] : K[38];
assign K5[44] = decrypt_int ? K[42] : K[37];
assign K5[45] = decrypt_int ? K[43] : K[7];
assign K5[46] = decrypt_int ? K[0] : K[50];
assign K5[47] = decrypt_int ? K[37] : K[1];
assign K5[48] = decrypt_int ? K[31] : K[22];
 
assign K4[1] = decrypt_int ? K[5] : K[25];
assign K4[2] = decrypt_int ? K[26] : K[46];
assign K4[3] = decrypt_int ? K[41] : K[4];
assign K4[4] = decrypt_int ? K[18] : K[13];
assign K4[5] = decrypt_int ? K[53] : K[48];
assign K4[6] = decrypt_int ? K[24] : K[19];
assign K4[7] = decrypt_int ? K[10] : K[5];
assign K4[8] = decrypt_int ? K[46] : K[41];
assign K4[9] = decrypt_int ? K[12] : K[32];
assign K4[10] = decrypt_int ? K[6] : K[26];
assign K4[11] = decrypt_int ? K[54] : K[17];
assign K4[12] = decrypt_int ? K[34] : K[54];
assign K4[13] = decrypt_int ? K[11] : K[6];
assign K4[14] = decrypt_int ? K[40] : K[3];
assign K4[15] = decrypt_int ? K[48] : K[11];
assign K4[16] = decrypt_int ? K[17] : K[12];
assign K4[17] = decrypt_int ? K[32] : K[27];
assign K4[18] = decrypt_int ? K[20] : K[40];
assign K4[19] = decrypt_int ? K[19] : K[39];
assign K4[20] = decrypt_int ? K[13] : K[33];
assign K4[21] = decrypt_int ? K[39] : K[34];
assign K4[22] = decrypt_int ? K[47] : K[10];
assign K4[23] = decrypt_int ? K[55] : K[18];
assign K4[24] = decrypt_int ? K[3] : K[55];
assign K4[25] = decrypt_int ? K[49] : K[16];
assign K4[26] = decrypt_int ? K[16] : K[7];
assign K4[27] = decrypt_int ? K[38] : K[1];
assign K4[28] = decrypt_int ? K[21] : K[43];
assign K4[29] = decrypt_int ? K[36] : K[31];
assign K4[30] = decrypt_int ? K[37] : K[28];
assign K4[31] = decrypt_int ? K[31] : K[49];
assign K4[32] = decrypt_int ? K[42] : K[9];
assign K4[33] = decrypt_int ? K[9] : K[0];
assign K4[34] = decrypt_int ? K[22] : K[44];
assign K4[35] = decrypt_int ? K[52] : K[15];
assign K4[36] = decrypt_int ? K[43] : K[38];
assign K4[37] = decrypt_int ? K[15] : K[37];
assign K4[38] = decrypt_int ? K[50] : K[45];
assign K4[39] = decrypt_int ? K[35] : K[2];
assign K4[40] = decrypt_int ? K[44] : K[35];
assign K4[41] = decrypt_int ? K[0] : K[22];
assign K4[42] = decrypt_int ? K[23] : K[14];
assign K4[43] = decrypt_int ? K[29] : K[51];
assign K4[44] = decrypt_int ? K[1] : K[23];
assign K4[45] = decrypt_int ? K[2] : K[52];
assign K4[46] = decrypt_int ? K[14] : K[36];
assign K4[47] = decrypt_int ? K[51] : K[42];
assign K4[48] = decrypt_int ? K[45] : K[8];
 
assign K3[1] = decrypt_int ? K[19] : K[11];
assign K3[2] = decrypt_int ? K[40] : K[32];
assign K3[3] = decrypt_int ? K[55] : K[47];
assign K3[4] = decrypt_int ? K[32] : K[24];
assign K3[5] = decrypt_int ? K[10] : K[34];
assign K3[6] = decrypt_int ? K[13] : K[5];
assign K3[7] = decrypt_int ? K[24] : K[48];
assign K3[8] = decrypt_int ? K[3] : K[27];
assign K3[9] = decrypt_int ? K[26] : K[18];
assign K3[10] = decrypt_int ? K[20] : K[12];
assign K3[11] = decrypt_int ? K[11] : K[3];
assign K3[12] = decrypt_int ? K[48] : K[40];
assign K3[13] = decrypt_int ? K[25] : K[17];
assign K3[14] = decrypt_int ? K[54] : K[46];
assign K3[15] = decrypt_int ? K[5] : K[54];
assign K3[16] = decrypt_int ? K[6] : K[55];
assign K3[17] = decrypt_int ? K[46] : K[13];
assign K3[18] = decrypt_int ? K[34] : K[26];
assign K3[19] = decrypt_int ? K[33] : K[25];
assign K3[20] = decrypt_int ? K[27] : K[19];
assign K3[21] = decrypt_int ? K[53] : K[20];
assign K3[22] = decrypt_int ? K[4] : K[53];
assign K3[23] = decrypt_int ? K[12] : K[4];
assign K3[24] = decrypt_int ? K[17] : K[41];
assign K3[25] = decrypt_int ? K[8] : K[2];
assign K3[26] = decrypt_int ? K[30] : K[52];
assign K3[27] = decrypt_int ? K[52] : K[42];
assign K3[28] = decrypt_int ? K[35] : K[29];
assign K3[29] = decrypt_int ? K[50] : K[44];
assign K3[30] = decrypt_int ? K[51] : K[14];
assign K3[31] = decrypt_int ? K[45] : K[35];
assign K3[32] = decrypt_int ? K[1] : K[50];
assign K3[33] = decrypt_int ? K[23] : K[45];
assign K3[34] = decrypt_int ? K[36] : K[30];
assign K3[35] = decrypt_int ? K[7] : K[1];
assign K3[36] = decrypt_int ? K[2] : K[51];
assign K3[37] = decrypt_int ? K[29] : K[23];
assign K3[38] = decrypt_int ? K[9] : K[31];
assign K3[39] = decrypt_int ? K[49] : K[43];
assign K3[40] = decrypt_int ? K[31] : K[21];
assign K3[41] = decrypt_int ? K[14] : K[8];
assign K3[42] = decrypt_int ? K[37] : K[0];
assign K3[43] = decrypt_int ? K[43] : K[37];
assign K3[44] = decrypt_int ? K[15] : K[9];
assign K3[45] = decrypt_int ? K[16] : K[38];
assign K3[46] = decrypt_int ? K[28] : K[22];
assign K3[47] = decrypt_int ? K[38] : K[28];
assign K3[48] = decrypt_int ? K[0] : K[49];
 
assign K2[1] = decrypt_int ? K[33] : K[54];
assign K2[2] = decrypt_int ? K[54] : K[18];
assign K2[3] = decrypt_int ? K[12] : K[33];
assign K2[4] = decrypt_int ? K[46] : K[10];
assign K2[5] = decrypt_int ? K[24] : K[20];
assign K2[6] = decrypt_int ? K[27] : K[48];
assign K2[7] = decrypt_int ? K[13] : K[34];
assign K2[8] = decrypt_int ? K[17] : K[13];
assign K2[9] = decrypt_int ? K[40] : K[4];
assign K2[10] = decrypt_int ? K[34] : K[55];
assign K2[11] = decrypt_int ? K[25] : K[46];
assign K2[12] = decrypt_int ? K[5] : K[26];
assign K2[13] = decrypt_int ? K[39] : K[3];
assign K2[14] = decrypt_int ? K[11] : K[32];
assign K2[15] = decrypt_int ? K[19] : K[40];
assign K2[16] = decrypt_int ? K[20] : K[41];
assign K2[17] = decrypt_int ? K[3] : K[24];
assign K2[18] = decrypt_int ? K[48] : K[12];
assign K2[19] = decrypt_int ? K[47] : K[11];
assign K2[20] = decrypt_int ? K[41] : K[5];
assign K2[21] = decrypt_int ? K[10] : K[6];
assign K2[22] = decrypt_int ? K[18] : K[39];
assign K2[23] = decrypt_int ? K[26] : K[47];
assign K2[24] = decrypt_int ? K[6] : K[27];
assign K2[25] = decrypt_int ? K[22] : K[43];
assign K2[26] = decrypt_int ? K[44] : K[38];
assign K2[27] = decrypt_int ? K[7] : K[28];
assign K2[28] = decrypt_int ? K[49] : K[15];
assign K2[29] = decrypt_int ? K[9] : K[30];
assign K2[30] = decrypt_int ? K[38] : K[0];
assign K2[31] = decrypt_int ? K[0] : K[21];
assign K2[32] = decrypt_int ? K[15] : K[36];
assign K2[33] = decrypt_int ? K[37] : K[31];
assign K2[34] = decrypt_int ? K[50] : K[16];
assign K2[35] = decrypt_int ? K[21] : K[42];
assign K2[36] = decrypt_int ? K[16] : K[37];
assign K2[37] = decrypt_int ? K[43] : K[9];
assign K2[38] = decrypt_int ? K[23] : K[44];
assign K2[39] = decrypt_int ? K[8] : K[29];
assign K2[40] = decrypt_int ? K[45] : K[7];
assign K2[41] = decrypt_int ? K[28] : K[49];
assign K2[42] = decrypt_int ? K[51] : K[45];
assign K2[43] = decrypt_int ? K[2] : K[23];
assign K2[44] = decrypt_int ? K[29] : K[50];
assign K2[45] = decrypt_int ? K[30] : K[51];
assign K2[46] = decrypt_int ? K[42] : K[8];
assign K2[47] = decrypt_int ? K[52] : K[14];
assign K2[48] = decrypt_int ? K[14] : K[35];
 
assign K1[1] = decrypt_int ? K[40] : K[47];
assign K1[2] = decrypt_int ? K[4] : K[11];
assign K1[3] = decrypt_int ? K[19] : K[26];
assign K1[4] = decrypt_int ? K[53] : K[3];
assign K1[5] = decrypt_int ? K[6] : K[13];
assign K1[6] = decrypt_int ? K[34] : K[41];
assign K1[7] = decrypt_int ? K[20] : K[27];
assign K1[8] = decrypt_int ? K[24] : K[6];
assign K1[9] = decrypt_int ? K[47] : K[54];
assign K1[10] = decrypt_int ? K[41] : K[48];
assign K1[11] = decrypt_int ? K[32] : K[39];
assign K1[12] = decrypt_int ? K[12] : K[19];
assign K1[13] = decrypt_int ? K[46] : K[53];
assign K1[14] = decrypt_int ? K[18] : K[25];
assign K1[15] = decrypt_int ? K[26] : K[33];
assign K1[16] = decrypt_int ? K[27] : K[34];
assign K1[17] = decrypt_int ? K[10] : K[17];
assign K1[18] = decrypt_int ? K[55] : K[5];
assign K1[19] = decrypt_int ? K[54] : K[4];
assign K1[20] = decrypt_int ? K[48] : K[55];
assign K1[21] = decrypt_int ? K[17] : K[24];
assign K1[22] = decrypt_int ? K[25] : K[32];
assign K1[23] = decrypt_int ? K[33] : K[40];
assign K1[24] = decrypt_int ? K[13] : K[20];
assign K1[25] = decrypt_int ? K[29] : K[36];
assign K1[26] = decrypt_int ? K[51] : K[31];
assign K1[27] = decrypt_int ? K[14] : K[21];
assign K1[28] = decrypt_int ? K[1] : K[8];
assign K1[29] = decrypt_int ? K[16] : K[23];
assign K1[30] = decrypt_int ? K[45] : K[52];
assign K1[31] = decrypt_int ? K[7] : K[14];
assign K1[32] = decrypt_int ? K[22] : K[29];
assign K1[33] = decrypt_int ? K[44] : K[51];
assign K1[34] = decrypt_int ? K[2] : K[9];
assign K1[35] = decrypt_int ? K[28] : K[35];
assign K1[36] = decrypt_int ? K[23] : K[30];
assign K1[37] = decrypt_int ? K[50] : K[2];
assign K1[38] = decrypt_int ? K[30] : K[37];
assign K1[39] = decrypt_int ? K[15] : K[22];
assign K1[40] = decrypt_int ? K[52] : K[0];
assign K1[41] = decrypt_int ? K[35] : K[42];
assign K1[42] = decrypt_int ? K[31] : K[38];
assign K1[43] = decrypt_int ? K[9] : K[16];
assign K1[44] = decrypt_int ? K[36] : K[43];
assign K1[45] = decrypt_int ? K[37] : K[44];
assign K1[46] = decrypt_int ? K[49] : K[1];
assign K1[47] = decrypt_int ? K[0] : K[7];
assign K1[48] = decrypt_int ? K[21] : K[28];
 
endmodule
/trunk/rtl/verilog/perf_opt/des.v
208,7 → 208,6
always @(posedge clk)
R15 <= #1 L14 ^ out15;
 
 
// Perform the initial permutationi with the registerd desIn
assign IP[1:64] = { desIn_r[06], desIn_r[14], desIn_r[22], desIn_r[30], desIn_r[38], desIn_r[46],
desIn_r[54], desIn_r[62], desIn_r[04], desIn_r[12], desIn_r[20], desIn_r[28],
/trunk/rtl/verilog/perf_opt/des3.v
0,0 → 1,79
/////////////////////////////////////////////////////////////////////
//// ////
//// Tripple DES ////
//// Tripple DES Top Level module ////
//// ////
//// Author: Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2002 Rudolf Usselmann ////
//// rudi@asics.ws ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
//// ////
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ////
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ////
//// POSSIBILITY OF SUCH DAMAGE. ////
//// ////
/////////////////////////////////////////////////////////////////////
 
module des3(desOut, desIn, key1, key2, key3, decrypt, clk);
output [63:0] desOut;
input [63:0] desIn;
input [55:0] key1;
input [55:0] key2;
input [55:0] key3;
input decrypt;
input clk;
 
wire [55:0] key_a;
wire [55:0] key_b;
wire [55:0] key_c;
wire [63:0] stage1_out, stage2_out;
reg [55:0] key_b_r [16:0];
reg [55:0] key_c_r [33:0];
integer i;
 
assign key_a = decrypt ? key3 : key1;
assign key_b = key2;
assign key_c = decrypt ? key1 : key3;
 
always @(posedge clk)
key_b_r[0] <= #1 key_b;
 
always @(posedge clk)
for(i=0;i<16;i=i+1)
key_b_r[i+1] <= #1 key_b_r[i];
 
 
always @(posedge clk)
key_c_r[0] <= #1 key_c;
 
always @(posedge clk)
for(i=0;i<33;i=i+1)
key_c_r[i+1] <= #1 key_c_r[i];
 
des u0( .desOut(stage1_out), .desIn(desIn), .key(key_a), .decrypt(decrypt), .clk(clk) );
 
des u1( .desOut(stage2_out), .desIn(stage1_out), .key(key_b_r[16]), .decrypt(!decrypt), .clk(clk) );
 
des u2( .desOut(desOut), .desIn(stage2_out), .key(key_c_r[33]), .decrypt(decrypt), .clk(clk) );
 
endmodule
 
 
/trunk/doc/README.txt
32,6 → 32,35
/////////////////////////////////////////////////////////////////////
 
 
 
Triple DES Core
===============
Attached is a Triple DES core implementation in verilog. It takes
three standard 56 bit keys and 64 bits of data as input and generates
a 64 bit encrypted/decrypted result. Two implementations are provided:
 
1) Area Optimized (CBC Mode)
This is a sequential implementation and needs 48 cycles to complete
a full encryption/decryption cycle.
 
 
2) Performance Optimized (EBC Mode)
This is a pipelined implementation that has a 48 cycle pipeline
(plus 1 input and 1 output register). It can perform a complete
encryption/decryption every cycle.
 
Performance
===========
1) Area Optimized (CBC Mode)
0.18u UMC ASIC process: 5.5K gates, > 160 Mhz
Spartan IIe 100-6 : 1450 LUTs (about 60%), 88MHz
 
2) Performance Optimized (EBC Mode)
0.18u UMC ASIC process: 55K Gates, 300MHz (19.2 Gbits/sec)
Virtex-II-1500-6: 79% utilization, 166Mhz (10.6 Gbits/sec)
 
 
 
DES Core
========
Attached is a DES core implementation in verilog. It takes a standard
62,8 → 91,10
Altera FLEX 10K130E-1: 6485 lcells >76 Mhz
 
 
 
Status
======
31-Oct-2002 Added Triple DES
05-Oct-2001 Added decrypt input (Thanks to Mark Cynar for
providing the code)
Reorganized directory structure
/trunk/sim/rtl_sim/bin/Makefile
21,9 → 21,18
_TARGETS_AO_= $(DUT_SRC_DIR)/area_opt/des.v \
$(DUT_SRC_DIR)/area_opt/key_sel.v
 
_TARGETS_AO3_= $(DUT_SRC_DIR)/area_opt/des3.v \
$(DUT_SRC_DIR)/area_opt/key_sel3.v
 
 
_TARGETS_PO_= $(DUT_SRC_DIR)/perf_opt/des.v \
$(DUT_SRC_DIR)/perf_opt/key_sel.v
 
_TARGETS_PO3_= $(DUT_SRC_DIR)/perf_opt/des3.v \
$(DUT_SRC_DIR)/perf_opt/des.v \
$(DUT_SRC_DIR)/perf_opt/key_sel.v
 
 
##########################################################################
#
# Test Bench Sources
33,9 → 42,13
 
_TB_PO_= $(TB_SRC_DIR)/des_test_po.v
 
_TB_PO3_= $(TB_SRC_DIR)/des3_test_po.v
 
_TB_AO_= $(TB_SRC_DIR)/des_test_ao.v
 
_TB_AO3_= $(TB_SRC_DIR)/des3_test_ao.v
 
 
##########################################################################
#
# Misc Variables
83,6 → 96,37
$(_TB_AO_)
 
 
simpow3:
@$(MAKE) simpo3 WAVES="+access+r +define+WAVES "
 
simpo3:
@echo ""
@echo "----- Running NCVLOG ... ----------"
ncverilog \
$(LOGF) \
$(WAVES) \
$(INCDIR) \
$(_TARGETS_COM_) $(_TARGETS_PO3_) \
$(_TB_PO3_)
 
simaow3:
@$(MAKE) simao3 WAVES="+define+WAVES +access+r "
 
 
simao3:
@echo ""
@echo "----- Running NCVLOG ... ----------"
ncverilog \
$(LOGF) \
$(WAVES) \
$(INCDIR) \
$(_TARGETS_COM_) $(_TARGETS_AO3_) \
$(_TB_AO3_)
 
 
 
 
 
clean:
rm -rf ./waves/*.dsn ./waves/*.trn \
INCA* \
/trunk/syn/bin/read_po3.dc
0,0 → 1,66
###############################################################################
#
# Pre Synthesis Script
#
# This script only reads in the design and saves it in a DB file
#
# Author: Rudolf Usselmann
# rudi@asics.ws
#
# Revision:
# 3/7/01 RU Initial Sript
#
#
###############################################################################
 
# ==============================================
# Setup Design Parameters
source ../bin/design_spec_po.dc
 
# ==============================================
# Setup Libraries
source ../bin/lib_spec.dc
 
# ==============================================
# Setup IO Files
 
append log_file ../log/$active_design "_pre.log"
append pre_comp_db_file ../out/$design_name "_pre.db"
 
sh rm -f $log_file
 
# ==============================================
# Setup Misc Variables
 
set hdlin_enable_vpp true ;# Important - this enables 'ifdefs
 
# ==============================================
# Read Design
 
echo "+++++++++ Analyzing all design files ..." >> $log_file
 
foreach module $design_files {
echo "+++++++++ Reading: $module" >> $log_file
echo +++++++++ Reading: $module
set module_file_name ""
append module_file_name $module ".v"
analyze -f verilog $module_file_name >> $log_file
elaborate $module >> $log_file
}
 
current_design $active_design
 
echo "+++++++++ Linking Design ..." >> $log_file
link >> $log_file
 
echo "+++++++++ Uniquifying Design ..." >> $log_file
uniquify >> $log_file
 
echo "+++++++++ Checking Design ..." >> $log_file
check_design >> $log_file
 
# ==============================================
# Save Design
echo "+++++++++ Saving Design ..." >> $log_file
write_file -hierarchy -format db -output $pre_comp_db_file
 
/trunk/syn/bin/read_ao3.dc
0,0 → 1,66
###############################################################################
#
# Pre Synthesis Script
#
# This script only reads in the design and saves it in a DB file
#
# Author: Rudolf Usselmann
# rudi@asics.ws
#
# Revision:
# 3/7/01 RU Initial Sript
#
#
###############################################################################
 
# ==============================================
# Setup Design Parameters
source ../bin/design_spec_ao3.dc
 
# ==============================================
# Setup Libraries
source ../bin/lib_spec.dc
 
# ==============================================
# Setup IO Files
 
append log_file ../log/$active_design "_pre.log"
append pre_comp_db_file ../out/$design_name "_pre.db"
 
sh rm -f $log_file
 
# ==============================================
# Setup Misc Variables
 
set hdlin_enable_vpp true ;# Important - this enables 'ifdefs
 
# ==============================================
# Read Design
 
echo "+++++++++ Analyzing all design files ..." >> $log_file
 
foreach module $design_files {
echo "+++++++++ Reading: $module" >> $log_file
echo +++++++++ Reading: $module
set module_file_name ""
append module_file_name $module ".v"
analyze -f verilog $module_file_name >> $log_file
elaborate $module >> $log_file
}
 
current_design $active_design
 
echo "+++++++++ Linking Design ..." >> $log_file
link >> $log_file
 
echo "+++++++++ Uniquifying Design ..." >> $log_file
uniquify >> $log_file
 
echo "+++++++++ Checking Design ..." >> $log_file
check_design >> $log_file
 
# ==============================================
# Save Design
echo "+++++++++ Saving Design ..." >> $log_file
write_file -hierarchy -format db -output $pre_comp_db_file
 
/trunk/syn/bin/comp_po3.dc
0,0 → 1,116
###############################################################################
#
# Actual Synthesis Script
#
# This script does the actual synthesis
#
# Author: Rudolf Usselmann
# rudi@asics.ws
#
# Revision:
# 3/7/01 RU Initial Sript
#
#
###############################################################################
 
# ==============================================
# Setup Design Parameters
source ../bin/design_spec_po.dc
 
# ==============================================
# Setup Libraries
source ../bin/lib_spec.dc
 
# ==============================================
# Setup IO Files
 
append log_file ../log/$active_design "_cmp.log"
append pre_comp_db_file ../out/$design_name "_pre.db"
append post_comp_db_file ../out/$design_name ".db"
append post_syn_verilog_file ../out/$design_name "_ps.v"
set junk_file /dev/null
 
sh rm -f $log_file
 
# ==============================================
# Setup Misc Variables
 
set hdlin_enable_vpp true ;# Important - this enables 'ifdefs
 
# ==============================================
# Read Design
 
echo "+++++++++ Reading Design ..." >> $log_file
read_file $pre_comp_db_file >> $log_file
 
# ==============================================
# Operating conditions
 
echo "+++++++++ Setting up Operation Conditions ..." >> $log_file
current_design $design_name
set_operating_conditions WORST >> $log_file
 
# ==============================================
# Setup Clocks and Resets
 
echo "+++++++++ Setting up Clocks ..." >> $log_file
 
set_drive 0 [find port {*clk*}]
set wb_clk_period 3.0
create_clock clk -period $wb_clk_period
set_clock_skew -uncertainty 0.1 clk
set_clock_transition 0.2 clk
set_dont_touch_network clk
# ==============================================
# Setup IOs
 
echo "+++++++++ Setting up IOs ..." >> $log_file
 
# Need to spell out external IOs
set_driving_cell -cell NAND2D2 -pin Z [all_inputs] >> $junk_file
set_load 0.2 [all_outputs]
 
set_input_delay 2.0 -clock clk [all_inputs]
set_output_delay 2.0 -clock clk [all_outputs]
 
# ==============================================
# Specify Multi Cycle Paths
 
# ==============================================
# Setup Area Constrains
set_max_area 0.0
set compile_sequential_area_recovery true
 
# ==============================================
# Force Ultra
set_ultra_optimization -f
set_balance_registers true
 
# ==============================================
# Compile Design
 
echo "+++++++++ Starting Compile ..." >> $log_file
ungroup -all -flatten >> $log_file
compile >> $log_file
optimize_registers -period 0 >> $log_file
#compile -incremental_mapping -map_effort high -area_effort high -boundary_optimization -ungroup_all >> $log_file
 
 
#compile -map_effort high -area_effort high -boundary_optimization -auto_ungroup >> $log_file
 
# ==============================================
# Write Out the optimized design
 
echo "+++++++++ Saving Optimized Design ..." >> $log_file
write_file -hierarchy -format verilog -output $post_syn_verilog_file
write_file -hierarchy -format db -output $post_comp_db_file
 
# ==============================================
# Create Some Basic Reports
 
echo "+++++++++ Reporting Final Results ..." >> $log_file
report_timing -nworst 10 >> $log_file
report_area >> $log_file
 
/trunk/syn/bin/comp_ao3.dc
0,0 → 1,110
###############################################################################
#
# Actual Synthesis Script
#
# This script does the actual synthesis
#
# Author: Rudolf Usselmann
# rudi@asics.ws
#
# Revision:
# 3/7/01 RU Initial Sript
#
#
###############################################################################
 
# ==============================================
# Setup Design Parameters
source ../bin/design_spec_ao3.dc
 
# ==============================================
# Setup Libraries
source ../bin/lib_spec.dc
 
# ==============================================
# Setup IO Files
 
append log_file ../log/$active_design "_cmp.log"
append pre_comp_db_file ../out/$design_name "_pre.db"
append post_comp_db_file ../out/$design_name ".db"
append post_syn_verilog_file ../out/$design_name "_ps.v"
set junk_file /dev/null
 
sh rm -f $log_file
 
# ==============================================
# Setup Misc Variables
 
set hdlin_enable_vpp true ;# Important - this enables 'ifdefs
 
# ==============================================
# Read Design
 
echo "+++++++++ Reading Design ..." >> $log_file
read_file $pre_comp_db_file >> $log_file
 
# ==============================================
# Operating conditions
 
echo "+++++++++ Setting up Operation Conditions ..." >> $log_file
current_design $design_name
set_operating_conditions WORST >> $log_file
 
# ==============================================
# Setup Clocks and Resets
 
echo "+++++++++ Setting up Clocks ..." >> $log_file
 
set_drive 0 [find port {*clk*}]
set wb_clk_period 5.0
create_clock clk -period $wb_clk_period
set_clock_skew -uncertainty 0.1 clk
set_clock_transition 0.2 clk
set_dont_touch_network clk
# ==============================================
# Setup IOs
 
echo "+++++++++ Setting up IOs ..." >> $log_file
 
# Need to spell out external IOs
set_driving_cell -cell NAND2D2 -pin Z [all_inputs] >> $junk_file
set_load 0.2 [all_outputs]
 
set_input_delay 2.0 -clock clk [all_inputs]
set_output_delay 2.0 -clock clk [all_outputs]
 
# ==============================================
# Specify Multi Cycle Paths
 
# ==============================================
# Setup Area Constrains
set_max_area 0.0
set compile_sequential_area_recovery true
 
# ==============================================
# Force Ultra
set_ultra_optimization -f
 
# ==============================================
# Compile Design
 
echo "+++++++++ Starting Compile ..." >> $log_file
compile >> $log_file
#compile -map_effort high -area_effort high -boundary_optimization -auto_ungroup >> $log_file
 
# ==============================================
# Write Out the optimized design
 
echo "+++++++++ Saving Optimized Design ..." >> $log_file
write_file -hierarchy -format verilog -output $post_syn_verilog_file
write_file -hierarchy -format db -output $post_comp_db_file
 
# ==============================================
# Create Some Basic Reports
 
echo "+++++++++ Reporting Final Results ..." >> $log_file
report_timing -nworst 10 >> $log_file
report_area >> $log_file
 
/trunk/syn/bin/design_spec_po3.dc
0,0 → 1,26
###############################################################################
#
# Design Specification
#
# Author: Rudolf Usselmann
# rudi@asics.ws
#
# Revision:
# 5/10/01 RU Initial Sript
#
#
###############################################################################
 
# ==============================================
# Setup Design Parameters
 
set design_files {sbox2 sbox4 sbox6 sbox8 sbox1 sbox3 sbox5 sbox7 crp des key_sel des3}
 
set design_name des3
set active_design des3
# Next Statement defines all clocks and resets in the design
set special_net {clk}
set hdl_src_dir {../../rtl/verilog/common ../../rtl/verilog/perf_opt}
 
/trunk/syn/bin/design_spec_ao3.dc
0,0 → 1,26
###############################################################################
#
# Design Specification
#
# Author: Rudolf Usselmann
# rudi@asics.ws
#
# Revision:
# 5/10/01 RU Initial Sript
#
#
###############################################################################
 
# ==============================================
# Setup Design Parameters
 
set design_files {sbox2 sbox4 sbox6 sbox8 sbox1 sbox3 sbox5 sbox7 crp key_sel3 des3}
 
set design_name des3
set active_design des3
# Next Statement defines all clocks and resets in the design
set special_net {clk}
set hdl_src_dir {../../rtl/verilog/common ../../rtl/verilog/area_opt}
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.