-- "blowfishvhdl" is a free synthesizable VHDL Blowfish implementation
-- Copyright (C) 2000  Wesley J. Landaker <wjl@mindless.com>

-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.

-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.

-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

-- See http://blowfishvhdl.sourceforge.net for more information.

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity sbox1_init is
port (
  address : in     std_logic_vector(7 downto 0);
  data    : inout std_logic_vector(31 downto 0)
);
end sbox1_init;

architecture fishy of sbox1_init is
  type sbox_data is array (0 to 255) of std_logic_vector(31 downto 0); 
  signal contents : sbox_data;
begin

  contents(0 ) <= x"4b7a70e9";
  contents(1 ) <= x"b5b32944";
  contents(2 ) <= x"db75092e";
  contents(3 ) <= x"c4192623";
  contents(4 ) <= x"ad6ea6b0";
  contents(5 ) <= x"49a7df7d";
  contents(6 ) <= x"9cee60b8";
  contents(7 ) <= x"8fedb266";
  contents(8 ) <= x"ecaa8c71";
  contents(9 ) <= x"699a17ff";
  contents(10) <= x"5664526c";
  contents(11) <= x"c2b19ee1";
  contents(12) <= x"193602a5";
  contents(13) <= x"75094c29";
  contents(14) <= x"a0591340";
  contents(15) <= x"e4183a3e";
  contents(16) <= x"3f54989a";
  contents(17) <= x"5b429d65";
  contents(18) <= x"6b8fe4d6";
  contents(19) <= x"99f73fd6";
  contents(20) <= x"a1d29c07";
  contents(21) <= x"efe830f5";
  contents(22) <= x"4d2d38e6";
  contents(23) <= x"f0255dc1";
  contents(24) <= x"4cdd2086";
  contents(25) <= x"8470eb26";
  contents(26) <= x"6382e9c6";
  contents(27) <= x"021ecc5e";
  contents(28) <= x"09686b3f";
  contents(29) <= x"3ebaefc9";
  contents(30) <= x"3c971814";
  contents(31) <= x"6b6a70a1";
  contents(32) <= x"687f3584";
  contents(33) <= x"52a0e286";
  contents(34) <= x"b79c5305";
  contents(35) <= x"aa500737";
  contents(36) <= x"3e07841c";
  contents(37) <= x"7fdeae5c";
  contents(38) <= x"8e7d44ec";
  contents(39) <= x"5716f2b8";
  contents(40) <= x"b03ada37";
  contents(41) <= x"f0500c0d";
  contents(42) <= x"f01c1f04";
  contents(43) <= x"0200b3ff";
  contents(44) <= x"ae0cf51a";
  contents(45) <= x"3cb574b2";
  contents(46) <= x"25837a58";
  contents(47) <= x"dc0921bd";
  contents(48) <= x"d19113f9";
  contents(49) <= x"7ca92ff6";
  contents(50) <= x"94324773";
  contents(51) <= x"22f54701";
  contents(52) <= x"3ae5e581";
  contents(53) <= x"37c2dadc";
  contents(54) <= x"c8b57634";
  contents(55) <= x"9af3dda7";
  contents(56) <= x"a9446146";
  contents(57) <= x"0fd0030e";
  contents(58) <= x"ecc8c73e";
  contents(59) <= x"a4751e41";
  contents(60) <= x"e238cd99";
  contents(61) <= x"3bea0e2f";
  contents(62) <= x"3280bba1";
  contents(63) <= x"183eb331";
  contents(64) <= x"4e548b38";
  contents(65) <= x"4f6db908";
  contents(66) <= x"6f420d03";
  contents(67) <= x"f60a04bf";
  contents(68) <= x"2cb81290";
  contents(69) <= x"24977c79";
  contents(70) <= x"5679b072";
  contents(71) <= x"bcaf89af";
  contents(72) <= x"de9a771f";
  contents(73) <= x"d9930810";
  contents(74) <= x"b38bae12";
  contents(75) <= x"dccf3f2e";
  contents(76) <= x"5512721f";
  contents(77) <= x"2e6b7124";
  contents(78) <= x"501adde6";
  contents(79) <= x"9f84cd87";
  contents(80) <= x"7a584718";
  contents(81) <= x"7408da17";
  contents(82) <= x"bc9f9abc";
  contents(83) <= x"e94b7d8c";
  contents(84) <= x"ec7aec3a";
  contents(85) <= x"db851dfa";
  contents(86) <= x"63094366";
  contents(87) <= x"c464c3d2";
  contents(88) <= x"ef1c1847";
  contents(89) <= x"3215d908";
  contents(90) <= x"dd433b37";
  contents(91) <= x"24c2ba16";
  contents(92) <= x"12a14d43";
  contents(93) <= x"2a65c451";
  contents(94) <= x"50940002";
  contents(95) <= x"133ae4dd";
  contents(96) <= x"71dff89e";
  contents(97) <= x"10314e55";
  contents(98) <= x"81ac77d6";
  contents(99) <= x"5f11199b";
  contents(100) <= x"043556f1";
  contents(101) <= x"d7a3c76b";
  contents(102) <= x"3c11183b";
  contents(103) <= x"5924a509";
  contents(104) <= x"f28fe6ed";
  contents(105) <= x"97f1fbfa";
  contents(106) <= x"9ebabf2c";
  contents(107) <= x"1e153c6e";
  contents(108) <= x"86e34570";
  contents(109) <= x"eae96fb1";
  contents(110) <= x"860e5e0a";
  contents(111) <= x"5a3e2ab3";
  contents(112) <= x"771fe71c";
  contents(113) <= x"4e3d06fa";
  contents(114) <= x"2965dcb9";
  contents(115) <= x"99e71d0f";
  contents(116) <= x"803e89d6";
  contents(117) <= x"5266c825";
  contents(118) <= x"2e4cc978";
  contents(119) <= x"9c10b36a";
  contents(120) <= x"c6150eba";
  contents(121) <= x"94e2ea78";
  contents(122) <= x"a5fc3c53";
  contents(123) <= x"1e0a2df4";
  contents(124) <= x"f2f74ea7";
  contents(125) <= x"361d2b3d";
  contents(126) <= x"1939260f";
  contents(127) <= x"19c27960";
  contents(128) <= x"5223a708";
  contents(129) <= x"f71312b6";
  contents(130) <= x"ebadfe6e";
  contents(131) <= x"eac31f66";
  contents(132) <= x"e3bc4595";
  contents(133) <= x"a67bc883";
  contents(134) <= x"b17f37d1";
  contents(135) <= x"018cff28";
  contents(136) <= x"c332ddef";
  contents(137) <= x"be6c5aa5";
  contents(138) <= x"65582185";
  contents(139) <= x"68ab9802";
  contents(140) <= x"eecea50f";
  contents(141) <= x"db2f953b";
  contents(142) <= x"2aef7dad";
  contents(143) <= x"5b6e2f84";
  contents(144) <= x"1521b628";
  contents(145) <= x"29076170";
  contents(146) <= x"ecdd4775";
  contents(147) <= x"619f1510";
  contents(148) <= x"13cca830";
  contents(149) <= x"eb61bd96";
  contents(150) <= x"0334fe1e";
  contents(151) <= x"aa0363cf";
  contents(152) <= x"b5735c90";
  contents(153) <= x"4c70a239";
  contents(154) <= x"d59e9e0b";
  contents(155) <= x"cbaade14";
  contents(156) <= x"eecc86bc";
  contents(157) <= x"60622ca7";
  contents(158) <= x"9cab5cab";
  contents(159) <= x"b2f3846e";
  contents(160) <= x"648b1eaf";
  contents(161) <= x"19bdf0ca";
  contents(162) <= x"a02369b9";
  contents(163) <= x"655abb50";
  contents(164) <= x"40685a32";
  contents(165) <= x"3c2ab4b3";
  contents(166) <= x"319ee9d5";
  contents(167) <= x"c021b8f7";
  contents(168) <= x"9b540b19";
  contents(169) <= x"875fa099";
  contents(170) <= x"95f7997e";
  contents(171) <= x"623d7da8";
  contents(172) <= x"f837889a";
  contents(173) <= x"97e32d77";
  contents(174) <= x"11ed935f";
  contents(175) <= x"16681281";
  contents(176) <= x"0e358829";
  contents(177) <= x"c7e61fd6";
  contents(178) <= x"96dedfa1";
  contents(179) <= x"7858ba99";
  contents(180) <= x"57f584a5";
  contents(181) <= x"1b227263";
  contents(182) <= x"9b83c3ff";
  contents(183) <= x"1ac24696";
  contents(184) <= x"cdb30aeb";
  contents(185) <= x"532e3054";
  contents(186) <= x"8fd948e4";
  contents(187) <= x"6dbc3128";
  contents(188) <= x"58ebf2ef";
  contents(189) <= x"34c6ffea";
  contents(190) <= x"fe28ed61";
  contents(191) <= x"ee7c3c73";
  contents(192) <= x"5d4a14d9";
  contents(193) <= x"e864b7e3";
  contents(194) <= x"42105d14";
  contents(195) <= x"203e13e0";
  contents(196) <= x"45eee2b6";
  contents(197) <= x"a3aaabea";
  contents(198) <= x"db6c4f15";
  contents(199) <= x"facb4fd0";
  contents(200) <= x"c742f442";
  contents(201) <= x"ef6abbb5";
  contents(202) <= x"654f3b1d";
  contents(203) <= x"41cd2105";
  contents(204) <= x"d81e799e";
  contents(205) <= x"86854dc7";
  contents(206) <= x"e44b476a";
  contents(207) <= x"3d816250";
  contents(208) <= x"cf62a1f2";
  contents(209) <= x"5b8d2646";
  contents(210) <= x"fc8883a0";
  contents(211) <= x"c1c7b6a3";
  contents(212) <= x"7f1524c3";
  contents(213) <= x"69cb7492";
  contents(214) <= x"47848a0b";
  contents(215) <= x"5692b285";
  contents(216) <= x"095bbf00";
  contents(217) <= x"ad19489d";
  contents(218) <= x"1462b174";
  contents(219) <= x"23820e00";
  contents(220) <= x"58428d2a";
  contents(221) <= x"0c55f5ea";
  contents(222) <= x"1dadf43e";
  contents(223) <= x"233f7061";
  contents(224) <= x"3372f092";
  contents(225) <= x"8d937e41";
  contents(226) <= x"d65fecf1";
  contents(227) <= x"6c223bdb";
  contents(228) <= x"7cde3759";
  contents(229) <= x"cbee7460";
  contents(230) <= x"4085f2a7";
  contents(231) <= x"ce77326e";
  contents(232) <= x"a6078084";
  contents(233) <= x"19f8509e";
  contents(234) <= x"e8efd855";
  contents(235) <= x"61d99735";
  contents(236) <= x"a969a7aa";
  contents(237) <= x"c50c06c2";
  contents(238) <= x"5a04abfc";
  contents(239) <= x"800bcadc";
  contents(240) <= x"9e447a2e";
  contents(241) <= x"c3453484";
  contents(242) <= x"fdd56705";
  contents(243) <= x"0e1e9ec9";
  contents(244) <= x"db73dbd3";
  contents(245) <= x"105588cd";
  contents(246) <= x"675fda79";
  contents(247) <= x"e3674340";
  contents(248) <= x"c5c43465";
  contents(249) <= x"713e38d8";
  contents(250) <= x"3d28f89e";
  contents(251) <= x"f16dff20";
  contents(252) <= x"153e21e7";
  contents(253) <= x"8fb03d4a";
  contents(254) <= x"e6e39f2b";
  contents(255) <= x"db83adf7";

  with address select data 
    <= contents(  0) when x"00",
       contents(  1) when x"01",
       contents(  2) when x"02",
       contents(  3) when x"03",
       contents(  4) when x"04",
       contents(  5) when x"05",
       contents(  6) when x"06",
       contents(  7) when x"07",
       contents(  8) when x"08",
       contents(  9) when x"09",
       contents( 10) when x"0a",
       contents( 11) when x"0b",
       contents( 12) when x"0c",
       contents( 13) when x"0d",
       contents( 14) when x"0e",
       contents( 15) when x"0f",
       contents( 16) when x"10",
       contents( 17) when x"11",
       contents( 18) when x"12",
       contents( 19) when x"13",
       contents( 20) when x"14",
       contents( 21) when x"15",
       contents( 22) when x"16",
       contents( 23) when x"17",
       contents( 24) when x"18",
       contents( 25) when x"19",
       contents( 26) when x"1a",
       contents( 27) when x"1b",
       contents( 28) when x"1c",
       contents( 29) when x"1d",
       contents( 30) when x"1e",
       contents( 31) when x"1f",
       contents( 32) when x"20",
       contents( 33) when x"21",
       contents( 34) when x"22",
       contents( 35) when x"23",
       contents( 36) when x"24",
       contents( 37) when x"25",
       contents( 38) when x"26",
       contents( 39) when x"27",
       contents( 40) when x"28",
       contents( 41) when x"29",
       contents( 42) when x"2a",
       contents( 43) when x"2b",
       contents( 44) when x"2c",
       contents( 45) when x"2d",
       contents( 46) when x"2e",
       contents( 47) when x"2f",
       contents( 48) when x"30",
       contents( 49) when x"31",
       contents( 50) when x"32",
       contents( 51) when x"33",
       contents( 52) when x"34",
       contents( 53) when x"35",
       contents( 54) when x"36",
       contents( 55) when x"37",
       contents( 56) when x"38",
       contents( 57) when x"39",
       contents( 58) when x"3a",
       contents( 59) when x"3b",
       contents( 60) when x"3c",
       contents( 61) when x"3d",
       contents( 62) when x"3e",
       contents( 63) when x"3f",
       contents( 64) when x"40",
       contents( 65) when x"41",
       contents( 66) when x"42",
       contents( 67) when x"43",
       contents( 68) when x"44",
       contents( 69) when x"45",
       contents( 70) when x"46",
       contents( 71) when x"47",
       contents( 72) when x"48",
       contents( 73) when x"49",
       contents( 74) when x"4a",
       contents( 75) when x"4b",
       contents( 76) when x"4c",
       contents( 77) when x"4d",
       contents( 78) when x"4e",
       contents( 79) when x"4f",
       contents( 80) when x"50",
       contents( 81) when x"51",
       contents( 82) when x"52",
       contents( 83) when x"53",
       contents( 84) when x"54",
       contents( 85) when x"55",
       contents( 86) when x"56",
       contents( 87) when x"57",
       contents( 88) when x"58",
       contents( 89) when x"59",
       contents( 90) when x"5a",
       contents( 91) when x"5b",
       contents( 92) when x"5c",
       contents( 93) when x"5d",
       contents( 94) when x"5e",
       contents( 95) when x"5f",
       contents( 96) when x"60",
       contents( 97) when x"61",
       contents( 98) when x"62",
       contents( 99) when x"63",
       contents(100) when x"64",
       contents(101) when x"65",
       contents(102) when x"66",
       contents(103) when x"67",
       contents(104) when x"68",
       contents(105) when x"69",
       contents(106) when x"6a",
       contents(107) when x"6b",
       contents(108) when x"6c",
       contents(109) when x"6d",
       contents(110) when x"6e",
       contents(111) when x"6f",
       contents(112) when x"70",
       contents(113) when x"71",
       contents(114) when x"72",
       contents(115) when x"73",
       contents(116) when x"74",
       contents(117) when x"75",
       contents(118) when x"76",
       contents(119) when x"77",
       contents(120) when x"78",
       contents(121) when x"79",
       contents(122) when x"7a",
       contents(123) when x"7b",
       contents(124) when x"7c",
       contents(125) when x"7d",
       contents(126) when x"7e",
       contents(127) when x"7f",
       contents(128) when x"80",
       contents(129) when x"81",
       contents(130) when x"82",
       contents(131) when x"83",
       contents(132) when x"84",
       contents(133) when x"85",
       contents(134) when x"86",
       contents(135) when x"87",
       contents(136) when x"88",
       contents(137) when x"89",
       contents(138) when x"8a",
       contents(139) when x"8b",
       contents(140) when x"8c",
       contents(141) when x"8d",
       contents(142) when x"8e",
       contents(143) when x"8f",
       contents(144) when x"90",
       contents(145) when x"91",
       contents(146) when x"92",
       contents(147) when x"93",
       contents(148) when x"94",
       contents(149) when x"95",
       contents(150) when x"96",
       contents(151) when x"97",
       contents(152) when x"98",
       contents(153) when x"99",
       contents(154) when x"9a",
       contents(155) when x"9b",
       contents(156) when x"9c",
       contents(157) when x"9d",
       contents(158) when x"9e",
       contents(159) when x"9f",
       contents(160) when x"a0",
       contents(161) when x"a1",
       contents(162) when x"a2",
       contents(163) when x"a3",
       contents(164) when x"a4",
       contents(165) when x"a5",
       contents(166) when x"a6",
       contents(167) when x"a7",
       contents(168) when x"a8",
       contents(169) when x"a9",
       contents(170) when x"aa",
       contents(171) when x"ab",
       contents(172) when x"ac",
       contents(173) when x"ad",
       contents(174) when x"ae",
       contents(175) when x"af",
       contents(176) when x"b0",
       contents(177) when x"b1",
       contents(178) when x"b2",
       contents(179) when x"b3",
       contents(180) when x"b4",
       contents(181) when x"b5",
       contents(182) when x"b6",
       contents(183) when x"b7",
       contents(184) when x"b8",
       contents(185) when x"b9",
       contents(186) when x"ba",
       contents(187) when x"bb",
       contents(188) when x"bc",
       contents(189) when x"bd",
       contents(190) when x"be",
       contents(191) when x"bf",
       contents(192) when x"c0",
       contents(193) when x"c1",
       contents(194) when x"c2",
       contents(195) when x"c3",
       contents(196) when x"c4",
       contents(197) when x"c5",
       contents(198) when x"c6",
       contents(199) when x"c7",
       contents(200) when x"c8",
       contents(201) when x"c9",
       contents(202) when x"ca",
       contents(203) when x"cb",
       contents(204) when x"cc",
       contents(205) when x"cd",
       contents(206) when x"ce",
       contents(207) when x"cf",
       contents(208) when x"d0",
       contents(209) when x"d1",
       contents(210) when x"d2",
       contents(211) when x"d3",
       contents(212) when x"d4",
       contents(213) when x"d5",
       contents(214) when x"d6",
       contents(215) when x"d7",
       contents(216) when x"d8",
       contents(217) when x"d9",
       contents(218) when x"da",
       contents(219) when x"db",
       contents(220) when x"dc",
       contents(221) when x"dd",
       contents(222) when x"de",
       contents(223) when x"df",
       contents(224) when x"e0",
       contents(225) when x"e1",
       contents(226) when x"e2",
       contents(227) when x"e3",
       contents(228) when x"e4",
       contents(229) when x"e5",
       contents(230) when x"e6",
       contents(231) when x"e7",
       contents(232) when x"e8",
       contents(233) when x"e9",
       contents(234) when x"ea",
       contents(235) when x"eb",
       contents(236) when x"ec",
       contents(237) when x"ed",
       contents(238) when x"ee",
       contents(239) when x"ef",
       contents(240) when x"f0",
       contents(241) when x"f1",
       contents(242) when x"f2",
       contents(243) when x"f3",
       contents(244) when x"f4",
       contents(245) when x"f5",
       contents(246) when x"f6",
       contents(247) when x"f7",
       contents(248) when x"f8",
       contents(249) when x"f9",
       contents(250) when x"fa",
       contents(251) when x"fb",
       contents(252) when x"fc",
       contents(253) when x"fd",
       contents(254) when x"fe",
       contents(255) when x"ff",
       "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" when others;
       
end;
