From f2b214b0dff95d6bb79cbb5b6ff5ba9d90f655c9 Mon Sep 17 00:00:00 2001 From: oharboe Date: Wed, 2 Jan 2008 21:52:27 +0000 Subject: Initial import from www.ecosforge.net --- zpu/hdl/zpu4/src/.cvsignore | 5 + zpu/hdl/zpu4/src/bram.vhd | 3807 +++++++++++++++++++++++++++++ zpu/hdl/zpu4/src/bram_dmips.vhd | 3717 ++++++++++++++++++++++++++++ zpu/hdl/zpu4/src/build.xml | 114 + zpu/hdl/zpu4/src/clocks.vhd | 246 ++ zpu/hdl/zpu4/src/dmipssmalltrace.do | 26 + zpu/hdl/zpu4/src/dmipstrace.do | 25 + zpu/hdl/zpu4/src/dmipstraceintstack.do | 25 + zpu/hdl/zpu4/src/dram_dmips.vhd | 3702 ++++++++++++++++++++++++++++ zpu/hdl/zpu4/src/dram_hello.vhd | 3214 ++++++++++++++++++++++++ zpu/hdl/zpu4/src/fastdmips.do | 19 + zpu/hdl/zpu4/src/fastdmipsintstack.do | 19 + zpu/hdl/zpu4/src/fastdmipssmall.do | 21 + zpu/hdl/zpu4/src/fastsimzpu.do | 19 + zpu/hdl/zpu4/src/ic300.bitgen | 27 + zpu/hdl/zpu4/src/ic300.lso | 1 + zpu/hdl/zpu4/src/ic300.ucf | 146 ++ zpu/hdl/zpu4/src/ic300.vhd | 144 ++ zpu/hdl/zpu4/src/ic300_config.vhd | 26 + zpu/hdl/zpu4/src/ic300pkg.vhd | 88 + zpu/hdl/zpu4/src/io.vhd | 92 + zpu/hdl/zpu4/src/log.txt | 380 +++ zpu/hdl/zpu4/src/niltrace.vhd | 26 + zpu/hdl/zpu4/src/sim_fpga_top.vhd | 190 ++ zpu/hdl/zpu4/src/simzpu.do | 23 + zpu/hdl/zpu4/src/simzpu_intstack.do | 23 + zpu/hdl/zpu4/src/status.txt | 109 + zpu/hdl/zpu4/src/testlut.vhd | 114 + zpu/hdl/zpu4/src/timer.vhd | 61 + zpu/hdl/zpu4/src/trace.vhd | 84 + zpu/hdl/zpu4/src/txt_util.vhd | 587 +++++ zpu/hdl/zpu4/src/xmake.filelist | 12 + zpu/hdl/zpu4/src/xmake.filelist.bramsmall | 5 + zpu/hdl/zpu4/src/xmake.xst | 53 + zpu/hdl/zpu4/src/zpu_config.vhd | 16 + zpu/hdl/zpu4/src/zpu_config_fastsim.vhd | 15 + zpu/hdl/zpu4/src/zpu_config_trace.vhd | 15 + zpu/hdl/zpu4/src/zpu_core.vhd | 900 +++++++ zpu/hdl/zpu4/src/zpu_core_small.vhd | 433 ++++ zpu/hdl/zpu4/src/zpuio.vhd | 256 ++ zpu/hdl/zpu4/src/zpuio_bram.vhd | 229 ++ zpu/hdl/zpu4/src/zpupkg.vhd | 168 ++ 42 files changed, 19182 insertions(+) create mode 100644 zpu/hdl/zpu4/src/.cvsignore create mode 100644 zpu/hdl/zpu4/src/bram.vhd create mode 100644 zpu/hdl/zpu4/src/bram_dmips.vhd create mode 100644 zpu/hdl/zpu4/src/build.xml create mode 100644 zpu/hdl/zpu4/src/clocks.vhd create mode 100644 zpu/hdl/zpu4/src/dmipssmalltrace.do create mode 100644 zpu/hdl/zpu4/src/dmipstrace.do create mode 100644 zpu/hdl/zpu4/src/dmipstraceintstack.do create mode 100644 zpu/hdl/zpu4/src/dram_dmips.vhd create mode 100644 zpu/hdl/zpu4/src/dram_hello.vhd create mode 100644 zpu/hdl/zpu4/src/fastdmips.do create mode 100644 zpu/hdl/zpu4/src/fastdmipsintstack.do create mode 100644 zpu/hdl/zpu4/src/fastdmipssmall.do create mode 100644 zpu/hdl/zpu4/src/fastsimzpu.do create mode 100644 zpu/hdl/zpu4/src/ic300.bitgen create mode 100644 zpu/hdl/zpu4/src/ic300.lso create mode 100644 zpu/hdl/zpu4/src/ic300.ucf create mode 100644 zpu/hdl/zpu4/src/ic300.vhd create mode 100644 zpu/hdl/zpu4/src/ic300_config.vhd create mode 100644 zpu/hdl/zpu4/src/ic300pkg.vhd create mode 100644 zpu/hdl/zpu4/src/io.vhd create mode 100644 zpu/hdl/zpu4/src/log.txt create mode 100644 zpu/hdl/zpu4/src/niltrace.vhd create mode 100644 zpu/hdl/zpu4/src/sim_fpga_top.vhd create mode 100644 zpu/hdl/zpu4/src/simzpu.do create mode 100644 zpu/hdl/zpu4/src/simzpu_intstack.do create mode 100644 zpu/hdl/zpu4/src/status.txt create mode 100644 zpu/hdl/zpu4/src/testlut.vhd create mode 100644 zpu/hdl/zpu4/src/timer.vhd create mode 100644 zpu/hdl/zpu4/src/trace.vhd create mode 100644 zpu/hdl/zpu4/src/txt_util.vhd create mode 100644 zpu/hdl/zpu4/src/xmake.filelist create mode 100644 zpu/hdl/zpu4/src/xmake.filelist.bramsmall create mode 100644 zpu/hdl/zpu4/src/xmake.xst create mode 100644 zpu/hdl/zpu4/src/zpu_config.vhd create mode 100644 zpu/hdl/zpu4/src/zpu_config_fastsim.vhd create mode 100644 zpu/hdl/zpu4/src/zpu_config_trace.vhd create mode 100644 zpu/hdl/zpu4/src/zpu_core.vhd create mode 100644 zpu/hdl/zpu4/src/zpu_core_small.vhd create mode 100644 zpu/hdl/zpu4/src/zpuio.vhd create mode 100644 zpu/hdl/zpu4/src/zpuio_bram.vhd create mode 100644 zpu/hdl/zpu4/src/zpupkg.vhd (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/.cvsignore b/zpu/hdl/zpu4/src/.cvsignore new file mode 100644 index 0000000..41c40a0 --- /dev/null +++ b/zpu/hdl/zpu4/src/.cvsignore @@ -0,0 +1,5 @@ +work +vsim.wlf +xilinx_device_details.xml +tcl_stacktrace.txt +vish_stacktrace.vstf diff --git a/zpu/hdl/zpu4/src/bram.vhd b/zpu/hdl/zpu4/src/bram.vhd new file mode 100644 index 0000000..435f3f4 --- /dev/null +++ b/zpu/hdl/zpu4/src/bram.vhd @@ -0,0 +1,3807 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; + + +library zylin; +use zylin.zpu_config.all; +use zylin.zpupkg.all; + +entity dram is +port (clk : in std_logic; + areset : in std_logic; + mem_writeEnable : in std_logic; + mem_readEnable : in std_logic; + mem_addr : in std_logic_vector(maxAddrBit downto 0); + mem_write : in std_logic_vector(wordSize-1 downto 0); + mem_read : out std_logic_vector(wordSize-1 downto 0); + mem_busy : out std_logic; + mem_writeMask : in std_logic_vector(wordBytes-1 downto 0)); +end dram; + +architecture dram_arch of dram is + +type ram_type is array(0 to ((2**(maxAddrBit+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); + +shared variable ram : ram_type := +( +0 => x"800b0b0b", +1 => x"0b0b8070", +2 => x"0b0b80e5", +3 => x"d00c3a0b", +4 => x"0b0bbed7", +5 => x"04000000", +6 => x"00000000", +7 => x"00000000", +8 => x"80088408", +9 => x"88080b0b", +10 => x"0bbfa72d", +11 => x"880c840c", +12 => x"800c0400", +13 => x"00000000", +14 => x"00000000", +15 => x"00000000", +16 => x"71fd0608", +17 => x"72830609", +18 => x"81058205", +19 => x"832b2a83", +20 => x"ffff0652", +21 => x"0b0b0400", +22 => x"00000000", +23 => x"00000000", +24 => x"71fd0608", +25 => x"83ffff73", +26 => x"83060981", +27 => x"05820583", +28 => x"2b2b0906", +29 => x"7383ffff", +30 => x"0b0b0b0b", +31 => x"83a70400", +32 => x"72098105", +33 => x"72057373", +34 => x"09060906", +35 => x"73097306", +36 => x"070a8106", +37 => x"530b0b51", +38 => x"04000000", +39 => x"00000000", +40 => x"72722473", +41 => x"732e0753", +42 => x"0b0b5104", +43 => x"00000000", +44 => x"00000000", +45 => x"00000000", +46 => x"00000000", +47 => x"00000000", +48 => x"71737109", +49 => x"71068106", +50 => x"30720a10", +51 => x"0a720a10", +52 => x"0a31050a", +53 => x"81065151", +54 => x"530b0b51", +55 => x"04000000", +56 => x"72722673", +57 => x"732e0753", +58 => x"0b0b5104", +59 => x"00000000", +60 => x"00000000", +61 => x"00000000", +62 => x"00000000", +63 => x"00000000", +64 => x"00000000", +65 => x"00000000", +66 => x"00000000", +67 => x"00000000", +68 => x"00000000", +69 => x"00000000", +70 => x"00000000", +71 => x"00000000", +72 => x"0b0b0b88", +73 => x"c6040000", +74 => x"00000000", +75 => x"00000000", +76 => x"00000000", +77 => x"00000000", +78 => x"00000000", +79 => x"00000000", +80 => x"720a722b", +81 => x"0a530b0b", +82 => x"51040000", +83 => x"00000000", +84 => x"00000000", +85 => x"00000000", +86 => x"00000000", +87 => x"00000000", +88 => x"72729f06", +89 => x"0981050b", +90 => x"0b0b88a7", +91 => x"05040000", +92 => x"00000000", +93 => x"00000000", +94 => x"00000000", +95 => x"00000000", +96 => x"72722aff", +97 => x"739f062a", +98 => x"0974090a", +99 => x"8106ff05", +100 => x"0607530b", +101 => x"0b510400", +102 => x"00000000", +103 => x"00000000", +104 => x"7171530b", +105 => x"0b510406", +106 => x"73830609", +107 => x"81058205", +108 => x"832b0b2b", +109 => x"0772fc06", +110 => x"0c515104", +111 => x"00000000", +112 => x"72098105", +113 => x"72050970", +114 => x"81050906", +115 => x"0a810653", +116 => x"0b0b5104", +117 => x"00000000", +118 => x"00000000", +119 => x"00000000", +120 => x"72098105", +121 => x"72050970", +122 => x"81050906", +123 => x"0a098106", +124 => x"530b0b51", +125 => x"04000000", +126 => x"00000000", +127 => x"00000000", +128 => x"71098105", +129 => x"520b0b04", +130 => x"00000000", +131 => x"00000000", +132 => x"00000000", +133 => x"00000000", +134 => x"00000000", +135 => x"00000000", +136 => x"72720981", +137 => x"0505530b", +138 => x"0b510400", +139 => x"00000000", +140 => x"00000000", +141 => x"00000000", +142 => x"00000000", +143 => x"00000000", +144 => x"72097206", +145 => x"73730906", +146 => x"07530b0b", +147 => x"51040000", +148 => x"00000000", +149 => x"00000000", +150 => x"00000000", +151 => x"00000000", +152 => x"71fc0608", +153 => x"72830609", +154 => x"81058305", +155 => x"1010102a", +156 => x"81ff0652", +157 => x"0b0b0400", +158 => x"00000000", +159 => x"00000000", +160 => x"71fc0608", +161 => x"0b0b80e5", +162 => x"bc738306", +163 => x"10100508", +164 => x"060b0b0b", +165 => x"88ac0400", +166 => x"00000000", +167 => x"00000000", +168 => x"80088408", +169 => x"88087575", +170 => x"0b0b0ba3", +171 => x"fa2d5050", +172 => x"80085688", +173 => x"0c840c80", +174 => x"0c510400", +175 => x"00000000", +176 => x"80088408", +177 => x"88087575", +178 => x"0b0b0ba4", +179 => x"ca2d5050", +180 => x"80085688", +181 => x"0c840c80", +182 => x"0c510400", +183 => x"00000000", +184 => x"72097081", +185 => x"0509060a", +186 => x"8106ff05", +187 => x"70540b0b", +188 => x"71067309", +189 => x"727405ff", +190 => x"05060751", +191 => x"51510400", +192 => x"72097081", +193 => x"0509060a", +194 => x"098106ff", +195 => x"0570540b", +196 => x"0b710673", +197 => x"09727405", +198 => x"ff050607", +199 => x"51515104", +200 => x"05ff0504", +201 => x"00000000", +202 => x"00000000", +203 => x"00000000", +204 => x"00000000", +205 => x"00000000", +206 => x"00000000", +207 => x"00000000", +208 => x"810b0b0b", +209 => x"80e5cc0c", +210 => x"51040000", +211 => x"00000000", +212 => x"00000000", +213 => x"00000000", +214 => x"00000000", +215 => x"00000000", +216 => x"71810552", +217 => x"0b0b0400", +218 => x"00000000", +219 => x"00000000", +220 => x"00000000", +221 => x"00000000", +222 => x"00000000", +223 => x"00000000", +224 => x"00000000", +225 => x"00000000", +226 => x"00000000", +227 => x"00000000", +228 => x"00000000", +229 => x"00000000", +230 => x"00000000", +231 => x"00000000", +232 => x"02840572", +233 => x"10100552", +234 => x"0b0b0400", +235 => x"00000000", +236 => x"00000000", +237 => x"00000000", +238 => x"00000000", +239 => x"00000000", +240 => x"00000000", +241 => x"00000000", +242 => x"00000000", +243 => x"00000000", +244 => x"00000000", +245 => x"00000000", +246 => x"00000000", +247 => x"00000000", +248 => x"717105ff", +249 => x"0571530b", +250 => x"0b510400", +251 => x"00000000", +252 => x"00000000", +253 => x"00000000", +254 => x"00000000", +255 => x"00000000", +256 => x"84803f80", +257 => x"cef23f04", +258 => x"10101010", +259 => x"10101010", +260 => x"10101010", +261 => x"10101010", +262 => x"10101010", +263 => x"10101010", +264 => x"10101010", +265 => x"10101053", +266 => x"0b0b5104", +267 => x"7381ff06", +268 => x"73830609", +269 => x"81058305", +270 => x"1010102b", +271 => x"0772fc06", +272 => x"0c515104", +273 => x"3c047272", +274 => x"80728106", +275 => x"ff050972", +276 => x"06057110", +277 => x"520b0b72", +278 => x"0a100a53", +279 => x"0b0b72e9", +280 => x"38515153", +281 => x"0b0b5104", +282 => x"70700b0b", +283 => x"80f5c008", +284 => x"520b0b84", +285 => x"0b720508", +286 => x"70810651", +287 => x"510b0b70", +288 => x"f2387108", +289 => x"81ff0680", +290 => x"0c505004", +291 => x"70700b0b", +292 => x"80f5c008", +293 => x"520b0b84", +294 => x"0b720508", +295 => x"700a100a", +296 => x"70810651", +297 => x"51510b0b", +298 => x"70ed3873", +299 => x"720c5050", +300 => x"0480e5cc", +301 => x"08802ea8", +302 => x"38838080", +303 => x"0b0b0b80", +304 => x"f5c00c82", +305 => x"a0800b0b", +306 => x"0b80f5c4", +307 => x"0c829080", +308 => x"0b80f5d4", +309 => x"0c0b0b80", +310 => x"f5c80b80", +311 => x"f5d80c04", +312 => x"f8808080", +313 => x"a40b0b0b", +314 => x"80f5c00c", +315 => x"f8808082", +316 => x"800b0b0b", +317 => x"80f5c40c", +318 => x"f8808084", +319 => x"800b80f5", +320 => x"d40cf880", +321 => x"8080940b", +322 => x"80f5d80c", +323 => x"f8808080", +324 => x"9c0b80f5", +325 => x"d00cf880", +326 => x"8080a00b", +327 => x"80f5dc0c", +328 => x"04f23d0d", +329 => x"600b0b80", +330 => x"f5c40856", +331 => x"5d82750c", +332 => x"8059805a", +333 => x"800b8f3d", +334 => x"71101017", +335 => x"70085957", +336 => x"5d5b8076", +337 => x"81ff067c", +338 => x"832b5658", +339 => x"520b0b0b", +340 => x"76530b0b", +341 => x"7b5198c6", +342 => x"3f7d7f7a", +343 => x"72077c72", +344 => x"07717160", +345 => x"8105415f", +346 => x"5d5b5957", +347 => x"557a8724", +348 => x"80c1380b", +349 => x"0b80f5c4", +350 => x"087b1010", +351 => x"71057008", +352 => x"58515580", +353 => x"7681ff06", +354 => x"7c832b56", +355 => x"58520b0b", +356 => x"0b76530b", +357 => x"0b7b5198", +358 => x"853f7d7f", +359 => x"7a72077c", +360 => x"72077171", +361 => x"60810541", +362 => x"5f5d5b59", +363 => x"5755877b", +364 => x"25c13876", +365 => x"7d0c7784", +366 => x"1e0c7c80", +367 => x"0c903d0d", +368 => x"04707080", +369 => x"f5cc3351", +370 => x"0b0b70b2", +371 => x"3880e5d8", +372 => x"08700852", +373 => x"0b0b520b", +374 => x"0b0b7080", +375 => x"2e9a3884", +376 => x"720580e5", +377 => x"d80c702d", +378 => x"80e5d808", +379 => x"7008520b", +380 => x"0b520b0b", +381 => x"0b70e838", +382 => x"810b80f5", +383 => x"cc345050", +384 => x"0404700b", +385 => x"0b80f5bc", +386 => x"08802e8e", +387 => x"380b0b0b", +388 => x"0b800b80", +389 => x"2e098106", +390 => x"83385004", +391 => x"0b0b80f5", +392 => x"bc510b0b", +393 => x"0bf3d93f", +394 => x"50040470", +395 => x"70028f05", +396 => x"33520b0b", +397 => x"0b0b718a", +398 => x"2e893871", +399 => x"51fccd3f", +400 => x"5050048d", +401 => x"51fcc53f", +402 => x"7151fcc0", +403 => x"3f505004", +404 => x"cd3d0db6", +405 => x"3d707084", +406 => x"05520b0b", +407 => x"088cab5d", +408 => x"56a63d5f", +409 => x"5d807570", +410 => x"81055733", +411 => x"765c5559", +412 => x"0b730b79", +413 => x"2e80ca38", +414 => x"8f3d5c73", +415 => x"a52e0981", +416 => x"0680cf38", +417 => x"79708105", +418 => x"5b33540b", +419 => x"0b7380e4", +420 => x"2e81c838", +421 => x"7380e424", +422 => x"80d13873", +423 => x"80e32ea8", +424 => x"3880520b", +425 => x"0ba5517a", +426 => x"2d80520b", +427 => x"0b73517a", +428 => x"2d821959", +429 => x"79708105", +430 => x"5b33540b", +431 => x"0b73ffbb", +432 => x"3878800c", +433 => x"b53d0d04", +434 => x"7c841e83", +435 => x"72053356", +436 => x"5e578052", +437 => x"0b0b7351", +438 => x"7a2d8119", +439 => x"7a708105", +440 => x"5c335559", +441 => x"0b73ff93", +442 => x"38d73973", +443 => x"80f32e09", +444 => x"8106ffad", +445 => x"387c841e", +446 => x"7108595e", +447 => x"56807733", +448 => x"56560b74", +449 => x"0b762e8d", +450 => x"38811670", +451 => x"1870335a", +452 => x"555677f5", +453 => x"38ff1655", +454 => x"807625ff", +455 => x"97387670", +456 => x"81055833", +457 => x"5880520b", +458 => x"0b77517a", +459 => x"2d811975", +460 => x"ff175757", +461 => x"59807625", +462 => x"fefa3876", +463 => x"70810558", +464 => x"33588052", +465 => x"0b0b7751", +466 => x"7a2d8119", +467 => x"75ff1757", +468 => x"57590b75", +469 => x"8024c738", +470 => x"feda397c", +471 => x"841e7108", +472 => x"70719f2c", +473 => x"59530b0b", +474 => x"595e5680", +475 => x"7524818d", +476 => x"38757e7d", +477 => x"58595580", +478 => x"57740b77", +479 => x"2e098106", +480 => x"bc38b07c", +481 => x"3402b905", +482 => x"567b0b76", +483 => x"2e9938ff", +484 => x"16560b0b", +485 => x"75337870", +486 => x"81055a34", +487 => x"8117577b", +488 => x"762e0981", +489 => x"06e93880", +490 => x"7834767e", +491 => x"ff720557", +492 => x"58560b0b", +493 => x"758024fe", +494 => x"e538fdf8", +495 => x"398a7536", +496 => x"0b0b80d7", +497 => x"b005540b", +498 => x"0b733376", +499 => x"70810558", +500 => x"348a7535", +501 => x"550b0b74", +502 => x"802effad", +503 => x"388a7536", +504 => x"0b0b80d7", +505 => x"b005540b", +506 => x"0b733376", +507 => x"70810558", +508 => x"348a7535", +509 => x"550b0b74", +510 => x"c438ff8d", +511 => x"3974520b", +512 => x"0b76530b", +513 => x"0bb53dff", +514 => x"b8055192", +515 => x"dc3fa43d", +516 => x"0856fedd", +517 => x"397080c1", +518 => x"0b81c48c", +519 => x"34800b81", +520 => x"c5e40c70", +521 => x"800c5004", +522 => x"7070800b", +523 => x"81c48c33", +524 => x"520b0b52", +525 => x"0b0b0b70", +526 => x"80c12e98", +527 => x"387181c5", +528 => x"e4080781", +529 => x"c5e40c80", +530 => x"c20b81c4", +531 => x"90347080", +532 => x"0c505004", +533 => x"810b81c5", +534 => x"e4080781", +535 => x"c5e40c80", +536 => x"c20b81c4", +537 => x"90347080", +538 => x"0c505004", +539 => x"70707070", +540 => x"7570088a", +541 => x"05530b0b", +542 => x"530b0b81", +543 => x"c48c3351", +544 => x"0b0b7080", +545 => x"c12e8c38", +546 => x"73f13870", +547 => x"800c5050", +548 => x"505004ff", +549 => x"72057081", +550 => x"c4880831", +551 => x"740c800c", +552 => x"50505050", +553 => x"04fc3d0d", +554 => x"81c49408", +555 => x"550b0b74", +556 => x"802e8e38", +557 => x"76750871", +558 => x"0c81c494", +559 => x"0856540b", +560 => x"0b8c1553", +561 => x"0b0b81c4", +562 => x"8808520b", +563 => x"0b8a518e", +564 => x"e93f7380", +565 => x"0c863d0d", +566 => x"04fb3d0d", +567 => x"77700856", +568 => x"56b0530b", +569 => x"0b81c494", +570 => x"08520b0b", +571 => x"7451a1ff", +572 => x"3f850b8c", +573 => x"170c850b", +574 => x"8c160c75", +575 => x"08750c81", +576 => x"c4940854", +577 => x"0b0b7380", +578 => x"2e8c3873", +579 => x"08750c81", +580 => x"c4940854", +581 => x"0b0b8c14", +582 => x"530b0b81", +583 => x"c4880852", +584 => x"0b0b8a51", +585 => x"8e943f84", +586 => x"1508b738", +587 => x"860b8c16", +588 => x"0c881552", +589 => x"0b0b8816", +590 => x"08518d96", +591 => x"3f81c494", +592 => x"08700876", +593 => x"0c540b0b", +594 => x"8c157054", +595 => x"0b0b540b", +596 => x"0b8a520b", +597 => x"0b730851", +598 => x"8de03f73", +599 => x"800c873d", +600 => x"0d047508", +601 => x"540b0bb0", +602 => x"530b0b73", +603 => x"520b0b75", +604 => x"51a0fc3f", +605 => x"73800c87", +606 => x"3d0d04e1", +607 => x"3d0db051", +608 => x"93833f80", +609 => x"0881c484", +610 => x"0cb05192", +611 => x"f83f8008", +612 => x"81c4940c", +613 => x"81c48408", +614 => x"80080c80", +615 => x"0b800884", +616 => x"050c820b", +617 => x"80088805", +618 => x"0ca80b80", +619 => x"088c050c", +620 => x"9f530b0b", +621 => x"0b0b80d7", +622 => x"bc520b0b", +623 => x"80089005", +624 => x"51a0ac3f", +625 => x"993d5c9f", +626 => x"530b0b0b", +627 => x"0b80d7dc", +628 => x"520b0b7b", +629 => x"51a0983f", +630 => x"8a0b8182", +631 => x"cc0c0b0b", +632 => x"80e28051", +633 => x"f8ea3f0b", +634 => x"0b80d7fc", +635 => x"51f8e13f", +636 => x"0b0b80e2", +637 => x"8051f8d8", +638 => x"3f80e5e0", +639 => x"08802e8a", +640 => x"a1380b0b", +641 => x"80d8ac51", +642 => x"f8c63f0b", +643 => x"0b80e280", +644 => x"51f8bd3f", +645 => x"80e5dc08", +646 => x"520b0b0b", +647 => x"0b80d8d8", +648 => x"51f8ad3f", +649 => x"8051b488", +650 => x"3f800880", +651 => x"f5ec0c81", +652 => x"0b923d5c", +653 => x"58800b80", +654 => x"e5dc0825", +655 => x"8383388e", +656 => x"3d5d80c1", +657 => x"0b81c48c", +658 => x"34810b81", +659 => x"c5e40c80", +660 => x"c20b81c4", +661 => x"9034825e", +662 => x"835a9f53", +663 => x"0b0b0b0b", +664 => x"80d98852", +665 => x"0b0b7a51", +666 => x"9f853f81", +667 => x"5f807b53", +668 => x"0b0b7c52", +669 => x"0b0b558c", +670 => x"f43f8008", +671 => x"752e0981", +672 => x"06833881", +673 => x"550b0b74", +674 => x"81c5e40c", +675 => x"7d705755", +676 => x"0b0b7483", +677 => x"25a63874", +678 => x"101015fd", +679 => x"0540a13d", +680 => x"ffbc0553", +681 => x"0b0b8352", +682 => x"0b0b7551", +683 => x"8b8c3f81", +684 => x"1e705f70", +685 => x"5755830b", +686 => x"7524dc38", +687 => x"7f540b0b", +688 => x"74530b0b", +689 => x"80f5f052", +690 => x"0b0b81c4", +691 => x"9c518af6", +692 => x"3f81c494", +693 => x"08700857", +694 => x"57b0530b", +695 => x"0b76520b", +696 => x"0b75519e", +697 => x"8a3f850b", +698 => x"8c180c85", +699 => x"0b8c170c", +700 => x"7608760c", +701 => x"81c49408", +702 => x"550b0b74", +703 => x"802e8a38", +704 => x"7408760c", +705 => x"81c49408", +706 => x"558c1553", +707 => x"0b0b81c4", +708 => x"8808520b", +709 => x"0b8a518a", +710 => x"a13f8416", +711 => x"08888c38", +712 => x"860b8c17", +713 => x"0c881652", +714 => x"0b0b8817", +715 => x"085189a2", +716 => x"3f81c494", +717 => x"08700877", +718 => x"0c578c16", +719 => x"70540b0b", +720 => x"558a520b", +721 => x"0b740851", +722 => x"89f03f80", +723 => x"c10b81c4", +724 => x"90335656", +725 => x"0b0b7575", +726 => x"26a83880", +727 => x"c3520b0b", +728 => x"75518adb", +729 => x"3f80087f", +730 => x"2e87ff38", +731 => x"81167081", +732 => x"ff0681c4", +733 => x"9033520b", +734 => x"0b57550b", +735 => x"0b747627", +736 => x"da38797e", +737 => x"29607072", +738 => x"35704172", +739 => x"72317087", +740 => x"2972315e", +741 => x"530b0b8a", +742 => x"0581c48c", +743 => x"3381c488", +744 => x"085a520b", +745 => x"0b520b0b", +746 => x"58550b76", +747 => x"80c12e87", +748 => x"f03878f6", +749 => x"38811858", +750 => x"80e5dc08", +751 => x"7825fd82", +752 => x"388051b0", +753 => x"eb3f8008", +754 => x"81c4800c", +755 => x"0b0b80d9", +756 => x"a851f4fc", +757 => x"3f0b0b80", +758 => x"e28051f4", +759 => x"f33f0b0b", +760 => x"80d9b851", +761 => x"f4ea3f0b", +762 => x"0b80e280", +763 => x"51f4e13f", +764 => x"81c48808", +765 => x"520b0b0b", +766 => x"0b80d9f0", +767 => x"51f4d13f", +768 => x"85520b0b", +769 => x"0b0b80da", +770 => x"8c51f4c4", +771 => x"3f81c5e4", +772 => x"08520b0b", +773 => x"0b0b80da", +774 => x"a851f4b4", +775 => x"3f81520b", +776 => x"0b0b0b80", +777 => x"da8c51f4", +778 => x"a73f81c4", +779 => x"8c33520b", +780 => x"0b0b0b80", +781 => x"dac451f4", +782 => x"973f80c1", +783 => x"520b0b0b", +784 => x"0b80dae0", +785 => x"51f4893f", +786 => x"81c49033", +787 => x"520b0b0b", +788 => x"0b80dafc", +789 => x"51f3f93f", +790 => x"80c2520b", +791 => x"0b0b0b80", +792 => x"dae051f3", +793 => x"eb3f81c4", +794 => x"bc08520b", +795 => x"0b0b0b80", +796 => x"db9851f3", +797 => x"db3f8752", +798 => x"0b0b0b0b", +799 => x"80da8c51", +800 => x"f3ce3f81", +801 => x"82cc0852", +802 => x"0b0b0b0b", +803 => x"80dbb451", +804 => x"f3be3f0b", +805 => x"0b80dbd0", +806 => x"51f3b53f", +807 => x"0b0b80db", +808 => x"fc51f3ac", +809 => x"3f81c494", +810 => x"08700853", +811 => x"0b0b560b", +812 => x"0b80dc88", +813 => x"51f3993f", +814 => x"0b0b80dc", +815 => x"a451f390", +816 => x"3f81c494", +817 => x"08847105", +818 => x"08530b0b", +819 => x"5d0b0b80", +820 => x"dcd851f2", +821 => x"fb3f8052", +822 => x"0b0b0b0b", +823 => x"80da8c51", +824 => x"f2ee3f81", +825 => x"c4940888", +826 => x"71050853", +827 => x"0b0b580b", +828 => x"0b80dcf4", +829 => x"51f2d93f", +830 => x"82520b0b", +831 => x"0b0b80da", +832 => x"8c51f2cc", +833 => x"3f81c494", +834 => x"088c7105", +835 => x"08530b0b", +836 => x"590b0b80", +837 => x"dd9051f2", +838 => x"b73f9152", +839 => x"0b0b0b0b", +840 => x"80da8c51", +841 => x"f2aa3f81", +842 => x"c4940890", +843 => x"05520b0b", +844 => x"0b0b80dd", +845 => x"ac51f298", +846 => x"3f0b0b80", +847 => x"ddc851f2", +848 => x"8f3f0b0b", +849 => x"80de8051", +850 => x"f2863f81", +851 => x"c4840870", +852 => x"08530b0b", +853 => x"570b0b80", +854 => x"dc8851f1", +855 => x"f33f0b0b", +856 => x"80de9451", +857 => x"f1ea3f81", +858 => x"c4840884", +859 => x"71050853", +860 => x"0b0b550b", +861 => x"0b80dcd8", +862 => x"51f1d53f", +863 => x"80520b0b", +864 => x"0b0b80da", +865 => x"8c51f1c8", +866 => x"3f81c484", +867 => x"08887105", +868 => x"08530b0b", +869 => x"560b0b80", +870 => x"dcf451f1", +871 => x"b33f8152", +872 => x"0b0b0b0b", +873 => x"80da8c51", +874 => x"f1a63f81", +875 => x"c484088c", +876 => x"71050853", +877 => x"0b0b5d0b", +878 => x"0b80dd90", +879 => x"51f1913f", +880 => x"92520b0b", +881 => x"0b0b80da", +882 => x"8c51f184", +883 => x"3f81c484", +884 => x"08900552", +885 => x"0b0b0b0b", +886 => x"80ddac51", +887 => x"f0f23f0b", +888 => x"0b80ddc8", +889 => x"51f0e93f", +890 => x"7d520b0b", +891 => x"0b0b80de", +892 => x"d451f0dc", +893 => x"3f85520b", +894 => x"0b0b0b80", +895 => x"da8c51f0", +896 => x"cf3f7952", +897 => x"0b0b0b0b", +898 => x"80def051", +899 => x"f0c23f8d", +900 => x"520b0b0b", +901 => x"0b80da8c", +902 => x"51f0b53f", +903 => x"7f520b0b", +904 => x"0b0b80df", +905 => x"8c51f0a8", +906 => x"3f87520b", +907 => x"0b0b0b80", +908 => x"da8c51f0", +909 => x"9b3f7e52", +910 => x"0b0b0b0b", +911 => x"80dfa851", +912 => x"f08e3f81", +913 => x"520b0b0b", +914 => x"0b80da8c", +915 => x"51f0813f", +916 => x"7b520b0b", +917 => x"0b0b80df", +918 => x"c451eff4", +919 => x"3f0b0b80", +920 => x"dfe051ef", +921 => x"eb3f7a52", +922 => x"0b0b0b0b", +923 => x"80e09851", +924 => x"efde3f0b", +925 => x"0b80e0b4", +926 => x"51efd53f", +927 => x"0b0b80e2", +928 => x"8051efcc", +929 => x"3f81c480", +930 => x"0880f5ec", +931 => x"08317080", +932 => x"f5e80c52", +933 => x"0b0b0b0b", +934 => x"80e0ec51", +935 => x"efb23f80", +936 => x"f5e80856", +937 => x"810b7625", +938 => x"819d3880", +939 => x"e5dc0870", +940 => x"77bd84c0", +941 => x"293580f5", +942 => x"e00c7671", +943 => x"3580f5e4", +944 => x"0c768ddd", +945 => x"297187e8", +946 => x"293581c4", +947 => x"980c5b0b", +948 => x"0b80e0fc", +949 => x"51eef93f", +950 => x"80f5e008", +951 => x"520b0b0b", +952 => x"0b80e1ac", +953 => x"51eee93f", +954 => x"0b0b80e1", +955 => x"b451eee0", +956 => x"3f80f5e4", +957 => x"08520b0b", +958 => x"0b0b80e1", +959 => x"ac51eed0", +960 => x"3f81c498", +961 => x"08520b0b", +962 => x"0b0b80e1", +963 => x"e451eec0", +964 => x"3f0b0b80", +965 => x"e28051ee", +966 => x"b73f800b", +967 => x"800ca13d", +968 => x"0d040b0b", +969 => x"80e28451", +970 => x"f5de3976", +971 => x"0856b053", +972 => x"0b0b7552", +973 => x"0b0b7651", +974 => x"95b53f80", +975 => x"c10b81c4", +976 => x"90335656", +977 => x"f88e390b", +978 => x"0b80e2b4", +979 => x"51ee813f", +980 => x"0b0b80e2", +981 => x"ec51edf8", +982 => x"3f0b0b80", +983 => x"e28051ed", +984 => x"ef3f800b", +985 => x"800ca13d", +986 => x"0d04a13d", +987 => x"ffb80552", +988 => x"0b0b8051", +989 => x"80dc3f9f", +990 => x"530b0b0b", +991 => x"0b80e38c", +992 => x"520b0b7a", +993 => x"5194e83f", +994 => x"777881c4", +995 => x"880c8117", +996 => x"7081ff06", +997 => x"81c49033", +998 => x"520b0b58", +999 => x"565af7db", +1000 => x"39ff1570", +1001 => x"77317e0c", +1002 => x"59800b81", +1003 => x"19595980", +1004 => x"e5dc0878", +1005 => x"25f58b38", +1006 => x"f8873970", +1007 => x"70738232", +1008 => x"70307072", +1009 => x"07802580", +1010 => x"0c520b0b", +1011 => x"520b0b50", +1012 => x"50047070", +1013 => x"70747671", +1014 => x"530b0b54", +1015 => x"0b0b520b", +1016 => x"0b0b0b71", +1017 => x"822e8338", +1018 => x"83517181", +1019 => x"2e9a3881", +1020 => x"72269f38", +1021 => x"71822eb8", +1022 => x"3871842e", +1023 => x"a9387073", +1024 => x"0c70800c", +1025 => x"50505004", +1026 => x"80e40b81", +1027 => x"c4880825", +1028 => x"8b388073", +1029 => x"0c70800c", +1030 => x"50505004", +1031 => x"83730c70", +1032 => x"800c5050", +1033 => x"50048273", +1034 => x"0c70800c", +1035 => x"50505004", +1036 => x"81730c70", +1037 => x"800c5050", +1038 => x"50047074", +1039 => x"74148205", +1040 => x"710c800c", +1041 => x"5004f73d", +1042 => x"0d7b7d7f", +1043 => x"61857205", +1044 => x"70822b75", +1045 => x"71057074", +1046 => x"71708405", +1047 => x"530b0b0c", +1048 => x"5a5a5d5b", +1049 => x"760c7980", +1050 => x"f8180c79", +1051 => x"86720552", +1052 => x"0b0b5758", +1053 => x"5a5a7676", +1054 => x"249e3876", +1055 => x"b329822b", +1056 => x"79710551", +1057 => x"530b0b76", +1058 => x"73708405", +1059 => x"550c8114", +1060 => x"540b0b75", +1061 => x"7425f038", +1062 => x"7681cc29", +1063 => x"19fc7105", +1064 => x"088105fc", +1065 => x"72050c7a", +1066 => x"1970089f", +1067 => x"a073050c", +1068 => x"5856850b", +1069 => x"81c4880c", +1070 => x"75800c8b", +1071 => x"3d0d0470", +1072 => x"70700293", +1073 => x"05335180", +1074 => x"02840597", +1075 => x"0533540b", +1076 => x"0b520b0b", +1077 => x"70732e88", +1078 => x"3871800c", +1079 => x"50505004", +1080 => x"7081c48c", +1081 => x"34810b80", +1082 => x"0c505050", +1083 => x"04f83d0d", +1084 => x"7a7c5956", +1085 => x"820b8319", +1086 => x"55550b0b", +1087 => x"74167033", +1088 => x"75335b51", +1089 => x"530b0b72", +1090 => x"792e80cf", +1091 => x"3880c10b", +1092 => x"81168116", +1093 => x"56565782", +1094 => x"7525df38", +1095 => x"ffa91770", +1096 => x"81ff0655", +1097 => x"590b7382", +1098 => x"26833887", +1099 => x"5581530b", +1100 => x"0b7680d2", +1101 => x"2e9e3877", +1102 => x"520b0b75", +1103 => x"5193b53f", +1104 => x"80530b0b", +1105 => x"72800825", +1106 => x"8b388715", +1107 => x"81c4880c", +1108 => x"81530b0b", +1109 => x"72800c8a", +1110 => x"3d0d0472", +1111 => x"81c48c34", +1112 => x"827525ff", +1113 => x"9538ffb4", +1114 => x"39f93d0d", +1115 => x"797b7d54", +1116 => x"0b0b5872", +1117 => x"59773079", +1118 => x"70307072", +1119 => x"079f2a73", +1120 => x"71315a52", +1121 => x"0b0b5977", +1122 => x"0b795673", +1123 => x"0c530b0b", +1124 => x"73847305", +1125 => x"0c540b0b", +1126 => x"800c893d", +1127 => x"0d04f93d", +1128 => x"0d797b7d", +1129 => x"7f56540b", +1130 => x"0b520b0b", +1131 => x"540b0b72", +1132 => x"802ea638", +1133 => x"70577158", +1134 => x"a0733152", +1135 => x"0b0b800b", +1136 => x"7225a638", +1137 => x"7770742b", +1138 => x"5770732a", +1139 => x"78752b07", +1140 => x"56510b74", +1141 => x"76530b0b", +1142 => x"510b0b70", +1143 => x"740c7184", +1144 => x"150c7380", +1145 => x"0c893d0d", +1146 => x"04805677", +1147 => x"72302b55", +1148 => x"0b0b7476", +1149 => x"530b0b51", +1150 => x"e039fb3d", +1151 => x"0d777955", +1152 => x"5580560b", +1153 => x"0b757524", +1154 => x"b5388074", +1155 => x"24a53880", +1156 => x"530b0b73", +1157 => x"520b0b74", +1158 => x"5180f33f", +1159 => x"8008540b", +1160 => x"0b75802e", +1161 => x"87388008", +1162 => x"30540b0b", +1163 => x"73800c87", +1164 => x"3d0d0473", +1165 => x"30768132", +1166 => x"57540b0b", +1167 => x"d2397430", +1168 => x"55815673", +1169 => x"8025c838", +1170 => x"ea39fa3d", +1171 => x"0d787a57", +1172 => x"5580570b", +1173 => x"0b767524", +1174 => x"ae38759f", +1175 => x"2c540b0b", +1176 => x"81530b0b", +1177 => x"75743274", +1178 => x"31520b0b", +1179 => x"74519f3f", +1180 => x"8008540b", +1181 => x"0b76802e", +1182 => x"87388008", +1183 => x"30540b0b", +1184 => x"73800c88", +1185 => x"3d0d0474", +1186 => x"30558157", +1187 => x"cd39fc3d", +1188 => x"0d767853", +1189 => x"0b0b540b", +1190 => x"0b81530b", +1191 => x"0b807473", +1192 => x"26520b0b", +1193 => x"5572802e", +1194 => x"9e387080", +1195 => x"2eb73880", +1196 => x"7224b238", +1197 => x"71107310", +1198 => x"75722653", +1199 => x"0b0b540b", +1200 => x"0b520b0b", +1201 => x"72e43873", +1202 => x"51788338", +1203 => x"74510b0b", +1204 => x"70800c86", +1205 => x"3d0d0472", +1206 => x"0a100a72", +1207 => x"0a100a53", +1208 => x"0b0b530b", +1209 => x"0b72802e", +1210 => x"de387174", +1211 => x"26e93873", +1212 => x"72317574", +1213 => x"07740a10", +1214 => x"0a740a10", +1215 => x"0a555556", +1216 => x"540b0be1", +1217 => x"39707073", +1218 => x"520b0b80", +1219 => x"eea80851", +1220 => x"953f5050", +1221 => x"04707073", +1222 => x"520b0b80", +1223 => x"eea80851", +1224 => x"92dc3f50", +1225 => x"5004f43d", +1226 => x"0d7e608b", +1227 => x"710570f8", +1228 => x"065b5555", +1229 => x"5d729626", +1230 => x"83389058", +1231 => x"800b7824", +1232 => x"74792607", +1233 => x"5580540b", +1234 => x"0b74742e", +1235 => x"09810680", +1236 => x"d5387c51", +1237 => x"8edf3f77", +1238 => x"83f72680", +1239 => x"d0387783", +1240 => x"2a701010", +1241 => x"1080e6a0", +1242 => x"058c7105", +1243 => x"08585854", +1244 => x"0b0b7577", +1245 => x"2e828a38", +1246 => x"841608fc", +1247 => x"068c1708", +1248 => x"88180871", +1249 => x"8c72050c", +1250 => x"8872050c", +1251 => x"5b760584", +1252 => x"71050881", +1253 => x"07847205", +1254 => x"0c530b0b", +1255 => x"7c518e96", +1256 => x"3f881654", +1257 => x"0b0b7380", +1258 => x"0c8e3d0d", +1259 => x"0477892a", +1260 => x"78832a58", +1261 => x"540b0b73", +1262 => x"802ebf38", +1263 => x"77862ab8", +1264 => x"05578474", +1265 => x"27b43880", +1266 => x"db145794", +1267 => x"7427ab38", +1268 => x"778c2a80", +1269 => x"ee055780", +1270 => x"d474279e", +1271 => x"38778f2a", +1272 => x"80f70557", +1273 => x"82d47427", +1274 => x"91387792", +1275 => x"2a80fc05", +1276 => x"578ad474", +1277 => x"27843880", +1278 => x"fe570b0b", +1279 => x"76101010", +1280 => x"80e6a005", +1281 => x"8c710508", +1282 => x"56530b0b", +1283 => x"74732ea6", +1284 => x"38841508", +1285 => x"fc067079", +1286 => x"3155560b", +1287 => x"738f2489", +1288 => x"d2387380", +1289 => x"2589d438", +1290 => x"8c150855", +1291 => x"0b0b7473", +1292 => x"2e098106", +1293 => x"dc388117", +1294 => x"5980e6b0", +1295 => x"08560b0b", +1296 => x"7580e6a8", +1297 => x"2e82f938", +1298 => x"841608fc", +1299 => x"06707931", +1300 => x"55550b73", +1301 => x"8f2480c2", +1302 => x"3880e6a8", +1303 => x"0b80e6b4", +1304 => x"0c80e6a8", +1305 => x"0b80e6b0", +1306 => x"0c807424", +1307 => x"80e83874", +1308 => x"16847105", +1309 => x"08810784", +1310 => x"72050c53", +1311 => x"0b0bfe9c", +1312 => x"3988168c", +1313 => x"71050857", +1314 => x"590b750b", +1315 => x"792e0981", +1316 => x"06fde538", +1317 => x"821459ff", +1318 => x"a0397716", +1319 => x"78810784", +1320 => x"180c7080", +1321 => x"e6b40c70", +1322 => x"80e6b00c", +1323 => x"80e6a80b", +1324 => x"8c72050c", +1325 => x"8c710508", +1326 => x"8872050c", +1327 => x"74810784", +1328 => x"72050c74", +1329 => x"0574710c", +1330 => x"5b7c518b", +1331 => x"e93f8816", +1332 => x"540b0bfd", +1333 => x"d13983ff", +1334 => x"752783c1", +1335 => x"3874892a", +1336 => x"75832a54", +1337 => x"0b0b540b", +1338 => x"0b73802e", +1339 => x"80cb3874", +1340 => x"862ab805", +1341 => x"530b0b84", +1342 => x"7427be38", +1343 => x"80db1453", +1344 => x"0b0b9474", +1345 => x"27b33874", +1346 => x"8c2a80ee", +1347 => x"05530b0b", +1348 => x"80d47427", +1349 => x"a438748f", +1350 => x"2a80f705", +1351 => x"530b0b82", +1352 => x"d4742795", +1353 => x"3874922a", +1354 => x"80fc0553", +1355 => x"0b0b8ad4", +1356 => x"74278638", +1357 => x"80fe530b", +1358 => x"0b721010", +1359 => x"1080e6a0", +1360 => x"05887105", +1361 => x"0855570b", +1362 => x"730b772e", +1363 => x"86cd3884", +1364 => x"1408fc06", +1365 => x"5b740b7b", +1366 => x"278f3888", +1367 => x"1408540b", +1368 => x"0b73772e", +1369 => x"098106e7", +1370 => x"388c1408", +1371 => x"80e6a00b", +1372 => x"84050871", +1373 => x"8c190c75", +1374 => x"88190c77", +1375 => x"8873050c", +1376 => x"5c57758c", +1377 => x"150c7853", +1378 => x"0b0b8079", +1379 => x"2483be38", +1380 => x"72822c81", +1381 => x"712b5656", +1382 => x"0b747b26", +1383 => x"80d1387a", +1384 => x"7506570b", +1385 => x"0b7682bc", +1386 => x"3878fc06", +1387 => x"84055974", +1388 => x"10707c06", +1389 => x"55550b73", +1390 => x"82aa3884", +1391 => x"1959f039", +1392 => x"80e6a00b", +1393 => x"84050879", +1394 => x"540b0b5b", +1395 => x"788025c0", +1396 => x"3882fa39", +1397 => x"74097b06", +1398 => x"7080e6a0", +1399 => x"0b84050c", +1400 => x"5b741055", +1401 => x"0b0b747b", +1402 => x"26853874", +1403 => x"85f33880", +1404 => x"e6a00b88", +1405 => x"05087084", +1406 => x"720508fc", +1407 => x"06707b31", +1408 => x"7b72268f", +1409 => x"7225075d", +1410 => x"575c5c55", +1411 => x"78802e80", +1412 => x"e3387915", +1413 => x"80e69808", +1414 => x"19907105", +1415 => x"59540b0b", +1416 => x"5680e694", +1417 => x"08ff2e89", +1418 => x"38a08f73", +1419 => x"05e08006", +1420 => x"570b0b76", +1421 => x"520b0b7c", +1422 => x"5188fc3f", +1423 => x"8008540b", +1424 => x"0b8008ff", +1425 => x"2e903880", +1426 => x"08762782", +1427 => x"c2387480", +1428 => x"e6a02e82", +1429 => x"ba3880e6", +1430 => x"a00b8805", +1431 => x"08558415", +1432 => x"08fc0670", +1433 => x"79317972", +1434 => x"268f7225", +1435 => x"075d555a", +1436 => x"7a849b38", +1437 => x"77810784", +1438 => x"160c7715", +1439 => x"7080e6a0", +1440 => x"0b88050c", +1441 => x"74810784", +1442 => x"72050c56", +1443 => x"7c5188a6", +1444 => x"3f881554", +1445 => x"0b0b7380", +1446 => x"0c8e3d0d", +1447 => x"0474832a", +1448 => x"70540b0b", +1449 => x"540b0b80", +1450 => x"742481a9", +1451 => x"3872822c", +1452 => x"81712b80", +1453 => x"e6a40807", +1454 => x"7080e6a0", +1455 => x"0b84050c", +1456 => x"75101010", +1457 => x"80e6a005", +1458 => x"88710508", +1459 => x"718c1b0c", +1460 => x"70881b0c", +1461 => x"79887305", +1462 => x"0c57555c", +1463 => x"55758c15", +1464 => x"0cfda339", +1465 => x"78791010", +1466 => x"1080e6a0", +1467 => x"0570565b", +1468 => x"5c8c1408", +1469 => x"560b0b75", +1470 => x"742ea738", +1471 => x"841608fc", +1472 => x"06707931", +1473 => x"58530b0b", +1474 => x"768f2484", +1475 => x"98387680", +1476 => x"2584de38", +1477 => x"8c160856", +1478 => x"0b0b7574", +1479 => x"2e098106", +1480 => x"db388814", +1481 => x"811a7083", +1482 => x"06555a54", +1483 => x"0b0b72c1", +1484 => x"387b8306", +1485 => x"560b0b75", +1486 => x"802efd98", +1487 => x"38ff1cf8", +1488 => x"1b5b5c88", +1489 => x"1a087a2e", +1490 => x"e838fd95", +1491 => x"39831953", +1492 => x"0b0bfcbc", +1493 => x"39831470", +1494 => x"822c8171", +1495 => x"2b80e6a4", +1496 => x"08077080", +1497 => x"e6a00b84", +1498 => x"050c7610", +1499 => x"101080e6", +1500 => x"a0058871", +1501 => x"0508718c", +1502 => x"1c0c7088", +1503 => x"1c0c7a88", +1504 => x"73050c58", +1505 => x"530b0b5d", +1506 => x"56530b0b", +1507 => x"fecf3980", +1508 => x"e5e40817", +1509 => x"59800876", +1510 => x"2e819438", +1511 => x"80e69408", +1512 => x"ff2e84b7", +1513 => x"38737631", +1514 => x"1980e5e4", +1515 => x"0c738706", +1516 => x"7056530b", +1517 => x"0b72802e", +1518 => x"88388873", +1519 => x"31701555", +1520 => x"5576149f", +1521 => x"ff06a080", +1522 => x"71311670", +1523 => x"540b0b7e", +1524 => x"530b0b51", +1525 => x"530b0b85", +1526 => x"de3f8008", +1527 => x"568008ff", +1528 => x"2e81a238", +1529 => x"80e5e408", +1530 => x"73057080", +1531 => x"e5e40c74", +1532 => x"7580e6a0", +1533 => x"0b88050c", +1534 => x"77763115", +1535 => x"81075556", +1536 => x"597a80e6", +1537 => x"a02e83e0", +1538 => x"38798f26", +1539 => x"838d3881", +1540 => x"0b84150c", +1541 => x"841508fc", +1542 => x"06707931", +1543 => x"7972268f", +1544 => x"7225075d", +1545 => x"555a7a80", +1546 => x"2efcc938", +1547 => x"80e03980", +1548 => x"089fff06", +1549 => x"550b0b74", +1550 => x"fee23878", +1551 => x"80e5e40c", +1552 => x"80e6a00b", +1553 => x"8805087a", +1554 => x"18810784", +1555 => x"72050c55", +1556 => x"80e69008", +1557 => x"79278638", +1558 => x"7880e690", +1559 => x"0c80e68c", +1560 => x"087927fb", +1561 => x"f9387880", +1562 => x"e68c0c84", +1563 => x"1508fc06", +1564 => x"70793179", +1565 => x"72268f72", +1566 => x"25075d55", +1567 => x"5a7a802e", +1568 => x"fbf2388a", +1569 => x"39807457", +1570 => x"530b0bfe", +1571 => x"d7397c51", +1572 => x"84a43f80", +1573 => x"0b800c8e", +1574 => x"3d0d0480", +1575 => x"7324a538", +1576 => x"72822c81", +1577 => x"712b80e6", +1578 => x"a4080770", +1579 => x"80e6a00b", +1580 => x"84050c5c", +1581 => x"5a768c17", +1582 => x"0c738817", +1583 => x"0c758818", +1584 => x"0cf9bf39", +1585 => x"83730570", +1586 => x"822c8171", +1587 => x"2b80e6a4", +1588 => x"08077080", +1589 => x"e6a00b84", +1590 => x"050c5d5b", +1591 => x"530b0bd5", +1592 => x"397a7506", +1593 => x"5c0b0b7b", +1594 => x"fbfa3884", +1595 => x"19751056", +1596 => x"59ef39ff", +1597 => x"17810559", +1598 => x"f6bf398c", +1599 => x"15088816", +1600 => x"08718c72", +1601 => x"050c8872", +1602 => x"050c5975", +1603 => x"15847105", +1604 => x"08810784", +1605 => x"72050c58", +1606 => x"7c51839a", +1607 => x"3f881554", +1608 => x"0b0bfaf2", +1609 => x"39771678", +1610 => x"81078418", +1611 => x"0c8c1708", +1612 => x"88180871", +1613 => x"8c72050c", +1614 => x"8872050c", +1615 => x"5c7080e6", +1616 => x"b40c7080", +1617 => x"e6b00c80", +1618 => x"e6a80b8c", +1619 => x"72050c8c", +1620 => x"71050888", +1621 => x"72050c77", +1622 => x"81078472", +1623 => x"050c7705", +1624 => x"77710c55", +1625 => x"7c5182ce", +1626 => x"3f881654", +1627 => x"0b0bf4b6", +1628 => x"39721684", +1629 => x"71050881", +1630 => x"07847205", +1631 => x"0c588c16", +1632 => x"08881708", +1633 => x"718c7205", +1634 => x"0c887205", +1635 => x"0c577c51", +1636 => x"82a43f88", +1637 => x"16540b0b", +1638 => x"f48c3972", +1639 => x"84150cf4", +1640 => x"1af80670", +1641 => x"841d0881", +1642 => x"0607841d", +1643 => x"0c701c55", +1644 => x"56850b84", +1645 => x"150c850b", +1646 => x"88150c8f", +1647 => x"7627fd90", +1648 => x"38881b52", +1649 => x"0b0b7c51", +1650 => x"85b43f80", +1651 => x"e6a00b88", +1652 => x"050880e5", +1653 => x"e4085a55", +1654 => x"fcf63978", +1655 => x"80e5e40c", +1656 => x"7380e694", +1657 => x"0cfbc639", +1658 => x"7284150c", +1659 => x"fce239fb", +1660 => x"3d0d7770", +1661 => x"7a7c5855", +1662 => x"530b0b56", +1663 => x"8f752781", +1664 => x"85387276", +1665 => x"07830651", +1666 => x"0b0b7080", +1667 => x"f9387573", +1668 => x"520b0b54", +1669 => x"0b0b7070", +1670 => x"8405520b", +1671 => x"0b087470", +1672 => x"8405560c", +1673 => x"73717084", +1674 => x"05530b0b", +1675 => x"08717084", +1676 => x"05530b0b", +1677 => x"0c717084", +1678 => x"05530b0b", +1679 => x"08717084", +1680 => x"05530b0b", +1681 => x"0c717084", +1682 => x"05530b0b", +1683 => x"08717084", +1684 => x"05530b0b", +1685 => x"0cf01656", +1686 => x"540b0b74", +1687 => x"8f26ffb6", +1688 => x"38837527", +1689 => x"99387070", +1690 => x"8405520b", +1691 => x"0b087470", +1692 => x"8405560c", +1693 => x"fc15550b", +1694 => x"0b748326", +1695 => x"e9387371", +1696 => x"540b0b52", +1697 => x"0b0bff15", +1698 => x"510b0b70", +1699 => x"ff2e9f38", +1700 => x"72708105", +1701 => x"540b0b33", +1702 => x"72708105", +1703 => x"540b0b34", +1704 => x"ff710551", +1705 => x"0b0b70ff", +1706 => x"2e098106", +1707 => x"e3387580", +1708 => x"0c873d0d", +1709 => x"04040470", +1710 => x"70707080", +1711 => x"0b81c5e8", +1712 => x"0c765188", +1713 => x"d93f8008", +1714 => x"530b0b80", +1715 => x"08ff2e89", +1716 => x"3872800c", +1717 => x"50505050", +1718 => x"0481c5e8", +1719 => x"08540b0b", +1720 => x"73802eed", +1721 => x"38757471", +1722 => x"0c520b0b", +1723 => x"72800c50", +1724 => x"50505004", +1725 => x"fb3d0d77", +1726 => x"79707207", +1727 => x"8306530b", +1728 => x"0b540b0b", +1729 => x"520b0b70", +1730 => x"9b387173", +1731 => x"7308540b", +1732 => x"0b56540b", +1733 => x"0b717308", +1734 => x"2e80d838", +1735 => x"7375540b", +1736 => x"0b520b0b", +1737 => x"0b0b7133", +1738 => x"7081ff06", +1739 => x"520b0b54", +1740 => x"0b0b7080", +1741 => x"2ea53872", +1742 => x"3355700b", +1743 => x"752e0981", +1744 => x"069c3881", +1745 => x"72058114", +1746 => x"71337081", +1747 => x"ff06540b", +1748 => x"0b56540b", +1749 => x"0b520b0b", +1750 => x"70dd3872", +1751 => x"33557381", +1752 => x"ff067581", +1753 => x"ff067171", +1754 => x"31800c55", +1755 => x"520b0b87", +1756 => x"3d0d0471", +1757 => x"09f7fbfd", +1758 => x"ff730506", +1759 => x"f8848281", +1760 => x"8006520b", +1761 => x"0b0b0b71", +1762 => x"9f388414", +1763 => x"84167108", +1764 => x"540b0b56", +1765 => x"540b0b71", +1766 => x"75082ed7", +1767 => x"38737554", +1768 => x"0b0b520b", +1769 => x"0bfefd39", +1770 => x"800b800c", +1771 => x"873d0d04", +1772 => x"fb3d0d77", +1773 => x"70520b0b", +1774 => x"56fdfa3f", +1775 => x"80e6a00b", +1776 => x"88050884", +1777 => x"710508fc", +1778 => x"06707b31", +1779 => x"9fef05e0", +1780 => x"8006e080", +1781 => x"05520b0b", +1782 => x"5555a080", +1783 => x"75249838", +1784 => x"80520b0b", +1785 => x"7551fdcf", +1786 => x"3f80e6a8", +1787 => x"0814530b", +1788 => x"0b728008", +1789 => x"2e913875", +1790 => x"51fdbb3f", +1791 => x"80530b0b", +1792 => x"72800c87", +1793 => x"3d0d0474", +1794 => x"30520b0b", +1795 => x"7551fda7", +1796 => x"3f8008ff", +1797 => x"2eab3880", +1798 => x"e6a00b88", +1799 => x"05087476", +1800 => x"31810784", +1801 => x"72050c53", +1802 => x"0b0b80e5", +1803 => x"e4087531", +1804 => x"80e5e40c", +1805 => x"7551fcfe", +1806 => x"3f810b80", +1807 => x"0c873d0d", +1808 => x"0480520b", +1809 => x"0b7551fc", +1810 => x"ee3f80e6", +1811 => x"a00b8805", +1812 => x"08800871", +1813 => x"31540b0b", +1814 => x"540b0b8f", +1815 => x"7325ff97", +1816 => x"38800880", +1817 => x"e6940831", +1818 => x"80e5e40c", +1819 => x"72810784", +1820 => x"150c7551", +1821 => x"fcc03f80", +1822 => x"530b0bff", +1823 => x"8339f73d", +1824 => x"0d7b7d54", +1825 => x"0b0b5a72", +1826 => x"802e82ab", +1827 => x"387951fc", +1828 => x"a43ff873", +1829 => x"05847105", +1830 => x"0870fe06", +1831 => x"70730584", +1832 => x"710508fc", +1833 => x"065c5758", +1834 => x"540b0b57", +1835 => x"80e6a808", +1836 => x"742e838b", +1837 => x"38778415", +1838 => x"0c807381", +1839 => x"0656590b", +1840 => x"740b792e", +1841 => x"81f53877", +1842 => x"14847105", +1843 => x"08810656", +1844 => x"530b0b74", +1845 => x"a3387716", +1846 => x"56788287", +1847 => x"38881408", +1848 => x"550b0b74", +1849 => x"80e6a82e", +1850 => x"83a7388c", +1851 => x"1408708c", +1852 => x"170c7588", +1853 => x"72050c58", +1854 => x"75810784", +1855 => x"180c7517", +1856 => x"76710c54", +1857 => x"0b0b7881", +1858 => x"a93883ff", +1859 => x"762781e5", +1860 => x"3875892a", +1861 => x"76832a54", +1862 => x"0b0b540b", +1863 => x"0b73802e", +1864 => x"80cb3875", +1865 => x"862ab805", +1866 => x"530b0b84", +1867 => x"7427be38", +1868 => x"80db1453", +1869 => x"0b0b9474", +1870 => x"27b33875", +1871 => x"8c2a80ee", +1872 => x"05530b0b", +1873 => x"80d47427", +1874 => x"a438758f", +1875 => x"2a80f705", +1876 => x"530b0b82", +1877 => x"d4742795", +1878 => x"3875922a", +1879 => x"80fc0553", +1880 => x"0b0b8ad4", +1881 => x"74278638", +1882 => x"80fe530b", +1883 => x"0b721010", +1884 => x"1080e6a0", +1885 => x"05887105", +1886 => x"0855550b", +1887 => x"730b752e", +1888 => x"82da3884", +1889 => x"1408fc06", +1890 => x"59750b79", +1891 => x"278f3888", +1892 => x"1408540b", +1893 => x"0b73752e", +1894 => x"098106e7", +1895 => x"388c1408", +1896 => x"708c190c", +1897 => x"7488190c", +1898 => x"77887205", +1899 => x"0c55768c", +1900 => x"150c7951", +1901 => x"fa803f8b", +1902 => x"3d0d0476", +1903 => x"08777131", +1904 => x"58760588", +1905 => x"18085656", +1906 => x"0b7480e6", +1907 => x"a82e80ea", +1908 => x"388c1708", +1909 => x"708c170c", +1910 => x"75887205", +1911 => x"0c530b0b", +1912 => x"fde53988", +1913 => x"14088c15", +1914 => x"08708c73", +1915 => x"050c5988", +1916 => x"190cfe84", +1917 => x"3975832a", +1918 => x"70540b0b", +1919 => x"540b0b80", +1920 => x"742481a2", +1921 => x"3872822c", +1922 => x"81712b80", +1923 => x"e6a40807", +1924 => x"80e6a00b", +1925 => x"84050c74", +1926 => x"10101080", +1927 => x"e6a00588", +1928 => x"71050871", +1929 => x"8c1b0c70", +1930 => x"881b0c79", +1931 => x"8873050c", +1932 => x"565a5576", +1933 => x"8c150cfe", +1934 => x"f9398159", +1935 => x"fd893977", +1936 => x"16738106", +1937 => x"540b0b55", +1938 => x"729a3876", +1939 => x"08777131", +1940 => x"5875058c", +1941 => x"18088819", +1942 => x"08718c72", +1943 => x"050c8872", +1944 => x"050c5555", +1945 => x"0b0b7481", +1946 => x"0784180c", +1947 => x"7680e6a0", +1948 => x"0b88050c", +1949 => x"80e69c08", +1950 => x"7526feb6", +1951 => x"3880e698", +1952 => x"08520b0b", +1953 => x"7951faa8", +1954 => x"3f7951f8", +1955 => x"a93ffea7", +1956 => x"3981778c", +1957 => x"170c7788", +1958 => x"170c758c", +1959 => x"190c7588", +1960 => x"190c59fc", +1961 => x"d3398314", +1962 => x"70822c81", +1963 => x"712b80e6", +1964 => x"a4080780", +1965 => x"e6a00b84", +1966 => x"050c7510", +1967 => x"101080e6", +1968 => x"a0058871", +1969 => x"0508718c", +1970 => x"1c0c7088", +1971 => x"1c0c7a88", +1972 => x"73050c57", +1973 => x"5b56530b", +1974 => x"0bfed839", +1975 => x"807324a3", +1976 => x"3872822c", +1977 => x"81712b80", +1978 => x"e6a40807", +1979 => x"80e6a00b", +1980 => x"84050c58", +1981 => x"748c180c", +1982 => x"7388180c", +1983 => x"7688160c", +1984 => x"fdac3983", +1985 => x"73057082", +1986 => x"2c81712b", +1987 => x"80e6a408", +1988 => x"0780e6a0", +1989 => x"0b84050c", +1990 => x"59530b0b", +1991 => x"d7397070", +1992 => x"7081c5ec", +1993 => x"08510b0b", +1994 => x"708a3881", +1995 => x"c5f47081", +1996 => x"c5ec0c51", +1997 => x"740b7105", +1998 => x"520b0bff", +1999 => x"530b0b71", +2000 => x"87fb8080", +2001 => x"268a3871", +2002 => x"81c5ec0c", +2003 => x"70530b0b", +2004 => x"72800c50", +2005 => x"50500470", +2006 => x"70707080", +2007 => x"0b80e5d0", +2008 => x"08540b0b", +2009 => x"540b0b72", +2010 => x"812e9d38", +2011 => x"7381c5f0", +2012 => x"0ccabe3f", +2013 => x"c98a3f80", +2014 => x"f5a8520b", +2015 => x"0b8151d3", +2016 => x"fa3f8008", +2017 => x"518a8f3f", +2018 => x"7281c5f0", +2019 => x"0ccaa23f", +2020 => x"c8ee3f80", +2021 => x"f5a8520b", +2022 => x"0b8151d3", +2023 => x"de3f8008", +2024 => x"5189f33f", +2025 => x"00ff3900", +2026 => x"ff39f53d", +2027 => x"0d7e6081", +2028 => x"c5f00870", +2029 => x"5b585b5b", +2030 => x"7580c538", +2031 => x"777a25a2", +2032 => x"38771b70", +2033 => x"337081ff", +2034 => x"06585859", +2035 => x"758a2e99", +2036 => x"387681ff", +2037 => x"0651c9b4", +2038 => x"3f811858", +2039 => x"790b7824", +2040 => x"e0387980", +2041 => x"0c8d3d0d", +2042 => x"048d51c9", +2043 => x"9f3f7833", +2044 => x"7081ff06", +2045 => x"520b0b57", +2046 => x"c9923f81", +2047 => x"1858dd39", +2048 => x"79557a54", +2049 => x"0b0b7d53", +2050 => x"0b0b8552", +2051 => x"0b0b8d3d", +2052 => x"fc0551c8", +2053 => x"af3f8008", +2054 => x"5688f43f", +2055 => x"7b80080c", +2056 => x"75800c8d", +2057 => x"3d0d04f6", +2058 => x"3d0d7d7f", +2059 => x"81c5f008", +2060 => x"705a585a", +2061 => x"5a7580ca", +2062 => x"38767925", +2063 => x"b638761a", +2064 => x"58c8a53f", +2065 => x"80087834", +2066 => x"800b8008", +2067 => x"81ff0657", +2068 => x"580b758a", +2069 => x"2ea83875", +2070 => x"8d327030", +2071 => x"7080257a", +2072 => x"07515156", +2073 => x"0b0b7580", +2074 => x"c0388117", +2075 => x"57780b77", +2076 => x"24cc3876", +2077 => x"560b0b75", +2078 => x"800c8c3d", +2079 => x"0d048158", +2080 => x"d6397855", +2081 => x"79540b0b", +2082 => x"7c530b0b", +2083 => x"84520b0b", +2084 => x"8c3dfc05", +2085 => x"51c7ad3f", +2086 => x"80085687", +2087 => x"f23f7a80", +2088 => x"080c7580", +2089 => x"0c8c3d0d", +2090 => x"04811756", +2091 => x"c839f93d", +2092 => x"0d795781", +2093 => x"c5f00880", +2094 => x"2eb23876", +2095 => x"518ac03f", +2096 => x"7b567a55", +2097 => x"80088105", +2098 => x"540b0b76", +2099 => x"530b0b82", +2100 => x"520b0b89", +2101 => x"3dfc0551", +2102 => x"c6ea3f80", +2103 => x"085787af", +2104 => x"3f778008", +2105 => x"0c76800c", +2106 => x"893d0d04", +2107 => x"87a13f85", +2108 => x"0b80080c", +2109 => x"ff0b800c", +2110 => x"893d0d04", +2111 => x"fb3d0d81", +2112 => x"c5f00870", +2113 => x"56540b0b", +2114 => x"73883874", +2115 => x"800c873d", +2116 => x"0d047753", +2117 => x"0b0b8352", +2118 => x"0b0b873d", +2119 => x"fc0551c6", +2120 => x"a33f8008", +2121 => x"540b0b86", +2122 => x"e63f7580", +2123 => x"080c7380", +2124 => x"0c873d0d", +2125 => x"04ff0b80", +2126 => x"0c04fb3d", +2127 => x"0d775581", +2128 => x"c5f00880", +2129 => x"2eae3874", +2130 => x"5189b43f", +2131 => x"80088105", +2132 => x"540b0b74", +2133 => x"530b0b87", +2134 => x"520b0b87", +2135 => x"3dfc0551", +2136 => x"c5e23f80", +2137 => x"085586a7", +2138 => x"3f758008", +2139 => x"0c74800c", +2140 => x"873d0d04", +2141 => x"86993f85", +2142 => x"0b80080c", +2143 => x"ff0b800c", +2144 => x"873d0d04", +2145 => x"fa3d0d81", +2146 => x"c5f00880", +2147 => x"2ea8387a", +2148 => x"5579540b", +2149 => x"0b78530b", +2150 => x"0b86520b", +2151 => x"0b883dfc", +2152 => x"0551c5a0", +2153 => x"3f800856", +2154 => x"85e53f76", +2155 => x"80080c75", +2156 => x"800c883d", +2157 => x"0d0485d7", +2158 => x"3f9d0b80", +2159 => x"080cff0b", +2160 => x"800c883d", +2161 => x"0d04f73d", +2162 => x"0d7b7d5b", +2163 => x"59bc530b", +2164 => x"0b80520b", +2165 => x"0b795186", +2166 => x"fd3f8070", +2167 => x"56579856", +2168 => x"74197033", +2169 => x"70782b79", +2170 => x"078118f8", +2171 => x"1a5a5859", +2172 => x"55588475", +2173 => x"24ea3876", +2174 => x"7a238419", +2175 => x"58807056", +2176 => x"57985674", +2177 => x"18703370", +2178 => x"782b7907", +2179 => x"8118f81a", +2180 => x"5a585951", +2181 => x"540b0b84", +2182 => x"7524e838", +2183 => x"76821b23", +2184 => x"88195880", +2185 => x"70565798", +2186 => x"56741870", +2187 => x"3370782b", +2188 => x"79078118", +2189 => x"f81a5a58", +2190 => x"5951540b", +2191 => x"0b847524", +2192 => x"e8387684", +2193 => x"1b0c8c19", +2194 => x"58807056", +2195 => x"57985674", +2196 => x"18703370", +2197 => x"782b7907", +2198 => x"8118f81a", +2199 => x"5a585951", +2200 => x"540b0b84", +2201 => x"7524e838", +2202 => x"76881b23", +2203 => x"90195880", +2204 => x"70565798", +2205 => x"56741870", +2206 => x"3370782b", +2207 => x"79078118", +2208 => x"f81a5a58", +2209 => x"5951540b", +2210 => x"0b847524", +2211 => x"e838768a", +2212 => x"1b239419", +2213 => x"58807056", +2214 => x"57985674", +2215 => x"18703370", +2216 => x"782b7907", +2217 => x"8118f81a", +2218 => x"5a585951", +2219 => x"540b0b84", +2220 => x"7524e838", +2221 => x"768c1b23", +2222 => x"98195880", +2223 => x"70565798", +2224 => x"56741870", +2225 => x"3370782b", +2226 => x"79078118", +2227 => x"f81a5a58", +2228 => x"5951540b", +2229 => x"0b847524", +2230 => x"e838768e", +2231 => x"1b239c19", +2232 => x"58807056", +2233 => x"57b85674", +2234 => x"18703370", +2235 => x"782b7907", +2236 => x"8118f81a", +2237 => x"5a58595a", +2238 => x"540b0b88", +2239 => x"7524e838", +2240 => x"76901b0c", +2241 => x"8b3d0d04", +2242 => x"e93d0d6a", +2243 => x"81c5f008", +2244 => x"57570b75", +2245 => x"933880c0", +2246 => x"800b8418", +2247 => x"0c75ac18", +2248 => x"0c75800c", +2249 => x"993d0d04", +2250 => x"893d7055", +2251 => x"6a540b0b", +2252 => x"558a520b", +2253 => x"0b993dff", +2254 => x"bc0551c2", +2255 => x"873f8008", +2256 => x"77530b0b", +2257 => x"75520b0b", +2258 => x"56fcfb3f", +2259 => x"82c13f77", +2260 => x"80080c75", +2261 => x"800c993d", +2262 => x"0d04e93d", +2263 => x"0d695781", +2264 => x"c5f00880", +2265 => x"2ebd3876", +2266 => x"5185943f", +2267 => x"893d7056", +2268 => x"80088105", +2269 => x"5577540b", +2270 => x"0b568f52", +2271 => x"0b0b993d", +2272 => x"ffbc0551", +2273 => x"c1be3f80", +2274 => x"086b530b", +2275 => x"0b76520b", +2276 => x"0b57fcb2", +2277 => x"3f81f83f", +2278 => x"7780080c", +2279 => x"76800c99", +2280 => x"3d0d0481", +2281 => x"ea3f850b", +2282 => x"80080cff", +2283 => x"0b800c99", +2284 => x"3d0d04fc", +2285 => x"3d0d8154", +2286 => x"0b0b81c5", +2287 => x"f0088838", +2288 => x"73800c86", +2289 => x"3d0d0476", +2290 => x"530b0b97", +2291 => x"b9520b0b", +2292 => x"863dfc05", +2293 => x"51c0ed3f", +2294 => x"8008540b", +2295 => x"0b81b03f", +2296 => x"7480080c", +2297 => x"73800c86", +2298 => x"3d0d04f4", +2299 => x"3d0d7e80", +2300 => x"f5d40870", +2301 => x"0881ff06", +2302 => x"913df805", +2303 => x"540b0b51", +2304 => x"5959c29d", +2305 => x"3f775780", +2306 => x"540b0b76", +2307 => x"557b7d58", +2308 => x"520b0b0b", +2309 => x"76530b0b", +2310 => x"8e3df005", +2311 => x"5184dc3f", +2312 => x"797b5879", +2313 => x"0c76841a", +2314 => x"0c78800c", +2315 => x"8e3d0d04", +2316 => x"f43d0d7e", +2317 => x"80f5d408", +2318 => x"70087081", +2319 => x"ff06923d", +2320 => x"f8055551", +2321 => x"5a5759c1", +2322 => x"d83f7757", +2323 => x"800b8b3d", +2324 => x"59540b0b", +2325 => x"76557b7d", +2326 => x"58520b0b", +2327 => x"0b76530b", +2328 => x"0b775184", +2329 => x"963f8056", +2330 => x"bd84c076", +2331 => x"5555797b", +2332 => x"58520b0b", +2333 => x"0b76530b", +2334 => x"0b775183", +2335 => x"fe3f7a57", +2336 => x"78802e84", +2337 => x"3876790c", +2338 => x"76800c8e", +2339 => x"3d0d0480", +2340 => x"eea80880", +2341 => x"0c04f73d", +2342 => x"0d7b80ee", +2343 => x"a80882c8", +2344 => x"7105085a", +2345 => x"540b0b5a", +2346 => x"77802e80", +2347 => x"eb388188", +2348 => x"18841908", +2349 => x"ff058171", +2350 => x"2b595559", +2351 => x"80742481", +2352 => x"80388074", +2353 => x"2480c138", +2354 => x"73822b78", +2355 => x"71058805", +2356 => x"56568180", +2357 => x"19087706", +2358 => x"530b0b72", +2359 => x"802e80c3", +2360 => x"38781670", +2361 => x"08530b0b", +2362 => x"530b0b79", +2363 => x"51740853", +2364 => x"0b0b722d", +2365 => x"ff14fc17", +2366 => x"fc177981", +2367 => x"2c5a5757", +2368 => x"540b0b73", +2369 => x"8025cb38", +2370 => x"7708580b", +2371 => x"0b77ff9e", +2372 => x"3880eea8", +2373 => x"08530b0b", +2374 => x"bc730508", +2375 => x"a9387951", +2376 => x"f5823f74", +2377 => x"08530b0b", +2378 => x"722dff14", +2379 => x"fc17fc17", +2380 => x"79812c5a", +2381 => x"5757540b", +2382 => x"0b738025", +2383 => x"ff9438c8", +2384 => x"398057fe", +2385 => x"fd397251", +2386 => x"bc730508", +2387 => x"540b0b73", +2388 => x"2d7951f4", +2389 => x"cf3ffb3d", +2390 => x"0d777a71", +2391 => x"028c05a3", +2392 => x"05335854", +2393 => x"0b0b540b", +2394 => x"0b568373", +2395 => x"2780e738", +2396 => x"75830651", +2397 => x"0b0b7080", +2398 => x"dd387488", +2399 => x"2b750770", +2400 => x"71902b07", +2401 => x"55518f73", +2402 => x"27b33873", +2403 => x"72708405", +2404 => x"540b0b0c", +2405 => x"71747170", +2406 => x"8405530b", +2407 => x"0b0c7471", +2408 => x"70840553", +2409 => x"0b0b0c74", +2410 => x"71708405", +2411 => x"530b0b0c", +2412 => x"f014540b", +2413 => x"0b520b0b", +2414 => x"728f26cf", +2415 => x"38837327", +2416 => x"95387372", +2417 => x"70840554", +2418 => x"0b0b0cfc", +2419 => x"7305530b", +2420 => x"0b728326", +2421 => x"ed38ff73", +2422 => x"05510b0b", +2423 => x"70ff2e98", +2424 => x"38747270", +2425 => x"8105540b", +2426 => x"0b34ff71", +2427 => x"05510b0b", +2428 => x"70ff2e09", +2429 => x"8106ea38", +2430 => x"75800c87", +2431 => x"3d0d0470", +2432 => x"70707075", +2433 => x"70718306", +2434 => x"530b0b55", +2435 => x"520b0b70", +2436 => x"80c53871", +2437 => x"70087009", +2438 => x"f7fbfdff", +2439 => x"720506f8", +2440 => x"84828180", +2441 => x"06540b0b", +2442 => x"520b0b53", +2443 => x"0b0b71a3", +2444 => x"38847305", +2445 => x"70087009", +2446 => x"f7fbfdff", +2447 => x"720506f8", +2448 => x"84828180", +2449 => x"06540b0b", +2450 => x"520b0b53", +2451 => x"0b0b7180", +2452 => x"2edf3872", +2453 => x"520b0b0b", +2454 => x"0b713353", +2455 => x"0b0b7280", +2456 => x"2e8f3881", +2457 => x"72057033", +2458 => x"540b0b52", +2459 => x"0b0b72f3", +2460 => x"38717431", +2461 => x"800c5050", +2462 => x"505004e4", +2463 => x"3d0d6ea1", +2464 => x"3d08a33d", +2465 => x"0859575f", +2466 => x"80764d77", +2467 => x"4ea33d08", +2468 => x"a53d0857", +2469 => x"4b0b754c", +2470 => x"5e0b0b7d", +2471 => x"6c2487b2", +2472 => x"38806a24", +2473 => x"87cd3869", +2474 => x"6b58566b", +2475 => x"6d5d460b", +2476 => x"7b477544", +2477 => x"76450b0b", +2478 => x"64646868", +2479 => x"5c5c5656", +2480 => x"0b7481f5", +2481 => x"38787627", +2482 => x"82dd3875", +2483 => x"81ff2683", +2484 => x"2b5583ff", +2485 => x"ff76278c", +2486 => x"389055fe", +2487 => x"800a7627", +2488 => x"83389855", +2489 => x"750b752a", +2490 => x"80e3bc05", +2491 => x"7033a077", +2492 => x"31713157", +2493 => x"55577480", +2494 => x"2e953875", +2495 => x"752ba076", +2496 => x"317a772b", +2497 => x"7c722a07", +2498 => x"7c782b5d", +2499 => x"5b59560b", +2500 => x"0b75902a", +2501 => x"7683ffff", +2502 => x"0671540b", +2503 => x"0b7a530b", +2504 => x"0b595788", +2505 => x"bf3f8008", +2506 => x"5b88a53f", +2507 => x"80088008", +2508 => x"79297c90", +2509 => x"2b7c902a", +2510 => x"07565659", +2511 => x"73752794", +2512 => x"388008ff", +2513 => x"05761555", +2514 => x"59757426", +2515 => x"87387474", +2516 => x"2687f438", +2517 => x"76520b0b", +2518 => x"73753151", +2519 => x"88863f80", +2520 => x"085587ec", +2521 => x"3f800880", +2522 => x"0879297b", +2523 => x"83ffff06", +2524 => x"77902b07", +2525 => x"56595773", +2526 => x"78279638", +2527 => x"8008ff05", +2528 => x"76155557", +2529 => x"75742689", +2530 => x"38777426", +2531 => x"77713158", +2532 => x"5678902b", +2533 => x"77075880", +2534 => x"5b0b0b7a", +2535 => x"4077417f", +2536 => x"0b615654", +2537 => x"0b0b7d80", +2538 => x"dd38737f", +2539 => x"0c747f84", +2540 => x"050c7e80", +2541 => x"0c9e3d0d", +2542 => x"0480705c", +2543 => x"58747926", +2544 => x"d8387481", +2545 => x"ff26832b", +2546 => x"577483ff", +2547 => x"ff2682bd", +2548 => x"3874772a", +2549 => x"80e3bc05", +2550 => x"7033a079", +2551 => x"31713159", +2552 => x"5c5d7682", +2553 => x"cf387654", +2554 => x"0b0b7479", +2555 => x"27853881", +2556 => x"540b0b79", +2557 => x"76277407", +2558 => x"59815878", +2559 => x"ff993876", +2560 => x"58805bff", +2561 => x"94397352", +2562 => x"0b0b7453", +2563 => x"0b0b9e3d", +2564 => x"e80551d2", +2565 => x"d43f6769", +2566 => x"567f0c74", +2567 => x"7f84050c", +2568 => x"7e800c9e", +2569 => x"3d0d0475", +2570 => x"802e81d2", +2571 => x"387581ff", +2572 => x"26832b55", +2573 => x"83ffff76", +2574 => x"278c3890", +2575 => x"55fe800a", +2576 => x"76278338", +2577 => x"9855750b", +2578 => x"752a80e3", +2579 => x"bc057033", +2580 => x"a0773171", +2581 => x"31575e54", +2582 => x"0b0b7484", +2583 => x"b8387876", +2584 => x"31540b0b", +2585 => x"8176902a", +2586 => x"7783ffff", +2587 => x"065f5d5b", +2588 => x"0b7b520b", +2589 => x"0b735185", +2590 => x"eb3f8008", +2591 => x"5785d13f", +2592 => x"80088008", +2593 => x"7e297890", +2594 => x"2b7c902a", +2595 => x"07565659", +2596 => x"73752794", +2597 => x"388008ff", +2598 => x"05761555", +2599 => x"59757426", +2600 => x"87387474", +2601 => x"26859738", +2602 => x"7b520b0b", +2603 => x"73753151", +2604 => x"85b23f80", +2605 => x"08558598", +2606 => x"3f800880", +2607 => x"087e297b", +2608 => x"83ffff06", +2609 => x"77902b07", +2610 => x"56595773", +2611 => x"78279638", +2612 => x"8008ff05", +2613 => x"76155557", +2614 => x"75742689", +2615 => x"38777426", +2616 => x"77713158", +2617 => x"5a78902b", +2618 => x"77077b41", +2619 => x"410b7f0b", +2620 => x"6156540b", +2621 => x"0b7d802e", +2622 => x"fdb038fe", +2623 => x"89397552", +2624 => x"0b0b8151", +2625 => x"84ca3f80", +2626 => x"0856fea1", +2627 => x"399057fe", +2628 => x"800a7527", +2629 => x"fdbb3898", +2630 => x"75712a80", +2631 => x"e3bc0570", +2632 => x"33a07331", +2633 => x"7131530b", +2634 => x"0b5d5e57", +2635 => x"0b0b7680", +2636 => x"2efdb338", +2637 => x"a0773175", +2638 => x"782b7772", +2639 => x"2a077779", +2640 => x"2b7b7a2b", +2641 => x"7d742a07", +2642 => x"7d7b2b73", +2643 => x"902a7483", +2644 => x"ffff0671", +2645 => x"597f772a", +2646 => x"585e5c41", +2647 => x"5f585c54", +2648 => x"0b0b8480", +2649 => x"3f800854", +2650 => x"0b0b83e4", +2651 => x"3f800880", +2652 => x"08792975", +2653 => x"902b7e90", +2654 => x"2a075656", +2655 => x"59737527", +2656 => x"99388008", +2657 => x"ff057b15", +2658 => x"55597a74", +2659 => x"268c3873", +2660 => x"75278738", +2661 => x"ff197b15", +2662 => x"55597652", +2663 => x"0b0b7375", +2664 => x"315183c0", +2665 => x"3f800855", +2666 => x"83a63f80", +2667 => x"08800879", +2668 => x"297d83ff", +2669 => x"ff067790", +2670 => x"2b075659", +2671 => x"57737827", +2672 => x"99388008", +2673 => x"ff057b15", +2674 => x"55577a74", +2675 => x"268c3873", +2676 => x"78278738", +2677 => x"ff177b15", +2678 => x"55570b73", +2679 => x"78317990", +2680 => x"2b780770", +2681 => x"83ffff06", +2682 => x"71902a79", +2683 => x"83ffff06", +2684 => x"7a902a73", +2685 => x"72297373", +2686 => x"29747329", +2687 => x"76742973", +2688 => x"902a0572", +2689 => x"05575543", +2690 => x"5f5b585a", +2691 => x"57595a74", +2692 => x"7c278638", +2693 => x"84808017", +2694 => x"5774902a", +2695 => x"177983ff", +2696 => x"ff067684", +2697 => x"80802905", +2698 => x"57570b0b", +2699 => x"767a269a", +2700 => x"38767a32", +2701 => x"70307072", +2702 => x"07802556", +2703 => x"5a5b7c76", +2704 => x"27fad438", +2705 => x"73802efa", +2706 => x"ce38ff18", +2707 => x"58805bfa", +2708 => x"c839ff76", +2709 => x"530b0b77", +2710 => x"540b0b9f", +2711 => x"3de80552", +2712 => x"0b0b5ece", +2713 => x"843f6769", +2714 => x"574c0b75", +2715 => x"4d698025", +2716 => x"f8b5387d", +2717 => x"096a6c5c", +2718 => x"530b0b7a", +2719 => x"540b0b9f", +2720 => x"3de80552", +2721 => x"0b0b5ecd", +2722 => x"e03f6769", +2723 => x"714c704d", +2724 => x"5856f897", +2725 => x"39a07531", +2726 => x"76762b7a", +2727 => x"772b7c73", +2728 => x"2a077c78", +2729 => x"2b72902a", +2730 => x"7383ffff", +2731 => x"0671587e", +2732 => x"762a5742", +2733 => x"405d5d57", +2734 => x"5881a93f", +2735 => x"80085781", +2736 => x"8f3f8008", +2737 => x"80087e29", +2738 => x"78902b7d", +2739 => x"902a0756", +2740 => x"56597375", +2741 => x"27993880", +2742 => x"08ff0576", +2743 => x"15555975", +2744 => x"74268c38", +2745 => x"73752787", +2746 => x"38ff1976", +2747 => x"1555597b", +2748 => x"520b0b73", +2749 => x"75315180", +2750 => x"eb3f8008", +2751 => x"5580d13f", +2752 => x"80088008", +2753 => x"7e297c83", +2754 => x"ffff0670", +2755 => x"78902b07", +2756 => x"51565858", +2757 => x"73772799", +2758 => x"388008ff", +2759 => x"05761555", +2760 => x"58757426", +2761 => x"8c387377", +2762 => x"278738ff", +2763 => x"18761555", +2764 => x"5878902b", +2765 => x"78077478", +2766 => x"31555bfa", +2767 => x"b339ff19", +2768 => x"76155559", +2769 => x"fae239ff", +2770 => x"19761555", +2771 => x"59f88539", +2772 => x"70707080", +2773 => x"530b0b75", +2774 => x"520b0b74", +2775 => x"51ceaf3f", +2776 => x"50505004", +2777 => x"70707081", +2778 => x"530b0b75", +2779 => x"520b0b74", +2780 => x"51ce9b3f", +2781 => x"50505004", +2782 => x"707080f5", +2783 => x"b00bfc05", +2784 => x"7008520b", +2785 => x"0b520b0b", +2786 => x"0b70ff2e", +2787 => x"9738702d", +2788 => x"fc720570", +2789 => x"08520b0b", +2790 => x"520b0b0b", +2791 => x"70ff2e09", +2792 => x"8106eb38", +2793 => x"50500404", +2794 => x"ffb4963f", +2795 => x"04000000", +2796 => x"30313233", +2797 => x"34353637", +2798 => x"38390000", +2799 => x"44485259", +2800 => x"53544f4e", +2801 => x"45205052", +2802 => x"4f475241", +2803 => x"4d2c2053", +2804 => x"4f4d4520", +2805 => x"53545249", +2806 => x"4e470000", +2807 => x"44485259", +2808 => x"53544f4e", +2809 => x"45205052", +2810 => x"4f475241", +2811 => x"4d2c2031", +2812 => x"27535420", +2813 => x"53545249", +2814 => x"4e470000", +2815 => x"44687279", +2816 => x"73746f6e", +2817 => x"65204265", +2818 => x"6e63686d", +2819 => x"61726b2c", +2820 => x"20566572", +2821 => x"73696f6e", +2822 => x"20322e31", +2823 => x"20284c61", +2824 => x"6e677561", +2825 => x"67653a20", +2826 => x"43290a00", +2827 => x"50726f67", +2828 => x"72616d20", +2829 => x"636f6d70", +2830 => x"696c6564", +2831 => x"20776974", +2832 => x"68202772", +2833 => x"65676973", +2834 => x"74657227", +2835 => x"20617474", +2836 => x"72696275", +2837 => x"74650a00", +2838 => x"45786563", +2839 => x"7574696f", +2840 => x"6e207374", +2841 => x"61727473", +2842 => x"2c202564", +2843 => x"2072756e", +2844 => x"73207468", +2845 => x"726f7567", +2846 => x"68204468", +2847 => x"72797374", +2848 => x"6f6e650a", +2849 => x"00000000", +2850 => x"44485259", +2851 => x"53544f4e", +2852 => x"45205052", +2853 => x"4f475241", +2854 => x"4d2c2032", +2855 => x"274e4420", +2856 => x"53545249", +2857 => x"4e470000", +2858 => x"45786563", +2859 => x"7574696f", +2860 => x"6e20656e", +2861 => x"64730a00", +2862 => x"46696e61", +2863 => x"6c207661", +2864 => x"6c756573", +2865 => x"206f6620", +2866 => x"74686520", +2867 => x"76617269", +2868 => x"61626c65", +2869 => x"73207573", +2870 => x"65642069", +2871 => x"6e207468", +2872 => x"65206265", +2873 => x"6e63686d", +2874 => x"61726b3a", +2875 => x"0a000000", +2876 => x"496e745f", +2877 => x"476c6f62", +2878 => x"3a202020", +2879 => x"20202020", +2880 => x"20202020", +2881 => x"2025640a", +2882 => x"00000000", +2883 => x"20202020", +2884 => x"20202020", +2885 => x"73686f75", +2886 => x"6c642062", +2887 => x"653a2020", +2888 => x"2025640a", +2889 => x"00000000", +2890 => x"426f6f6c", +2891 => x"5f476c6f", +2892 => x"623a2020", +2893 => x"20202020", +2894 => x"20202020", +2895 => x"2025640a", +2896 => x"00000000", +2897 => x"43685f31", +2898 => x"5f476c6f", +2899 => x"623a2020", +2900 => x"20202020", +2901 => x"20202020", +2902 => x"2025630a", +2903 => x"00000000", +2904 => x"20202020", +2905 => x"20202020", +2906 => x"73686f75", +2907 => x"6c642062", +2908 => x"653a2020", +2909 => x"2025630a", +2910 => x"00000000", +2911 => x"43685f32", +2912 => x"5f476c6f", +2913 => x"623a2020", +2914 => x"20202020", +2915 => x"20202020", +2916 => x"2025630a", +2917 => x"00000000", +2918 => x"4172725f", +2919 => x"315f476c", +2920 => x"6f625b38", +2921 => x"5d3a2020", +2922 => x"20202020", +2923 => x"2025640a", +2924 => x"00000000", +2925 => x"4172725f", +2926 => x"325f476c", +2927 => x"6f625b38", +2928 => x"5d5b375d", +2929 => x"3a202020", +2930 => x"2025640a", +2931 => x"00000000", +2932 => x"20202020", +2933 => x"20202020", +2934 => x"73686f75", +2935 => x"6c642062", +2936 => x"653a2020", +2937 => x"204e756d", +2938 => x"6265725f", +2939 => x"4f665f52", +2940 => x"756e7320", +2941 => x"2b203130", +2942 => x"0a000000", +2943 => x"5074725f", +2944 => x"476c6f62", +2945 => x"2d3e0a00", +2946 => x"20205074", +2947 => x"725f436f", +2948 => x"6d703a20", +2949 => x"20202020", +2950 => x"20202020", +2951 => x"2025640a", +2952 => x"00000000", +2953 => x"20202020", +2954 => x"20202020", +2955 => x"73686f75", +2956 => x"6c642062", +2957 => x"653a2020", +2958 => x"2028696d", +2959 => x"706c656d", +2960 => x"656e7461", +2961 => x"74696f6e", +2962 => x"2d646570", +2963 => x"656e6465", +2964 => x"6e74290a", +2965 => x"00000000", +2966 => x"20204469", +2967 => x"7363723a", +2968 => x"20202020", +2969 => x"20202020", +2970 => x"20202020", +2971 => x"2025640a", +2972 => x"00000000", +2973 => x"2020456e", +2974 => x"756d5f43", +2975 => x"6f6d703a", +2976 => x"20202020", +2977 => x"20202020", +2978 => x"2025640a", +2979 => x"00000000", +2980 => x"2020496e", +2981 => x"745f436f", +2982 => x"6d703a20", +2983 => x"20202020", +2984 => x"20202020", +2985 => x"2025640a", +2986 => x"00000000", +2987 => x"20205374", +2988 => x"725f436f", +2989 => x"6d703a20", +2990 => x"20202020", +2991 => x"20202020", +2992 => x"2025730a", +2993 => x"00000000", +2994 => x"20202020", +2995 => x"20202020", +2996 => x"73686f75", +2997 => x"6c642062", +2998 => x"653a2020", +2999 => x"20444852", +3000 => x"5953544f", +3001 => x"4e452050", +3002 => x"524f4752", +3003 => x"414d2c20", +3004 => x"534f4d45", +3005 => x"20535452", +3006 => x"494e470a", +3007 => x"00000000", +3008 => x"4e657874", +3009 => x"5f507472", +3010 => x"5f476c6f", +3011 => x"622d3e0a", +3012 => x"00000000", +3013 => x"20202020", +3014 => x"20202020", +3015 => x"73686f75", +3016 => x"6c642062", +3017 => x"653a2020", +3018 => x"2028696d", +3019 => x"706c656d", +3020 => x"656e7461", +3021 => x"74696f6e", +3022 => x"2d646570", +3023 => x"656e6465", +3024 => x"6e74292c", +3025 => x"2073616d", +3026 => x"65206173", +3027 => x"2061626f", +3028 => x"76650a00", +3029 => x"496e745f", +3030 => x"315f4c6f", +3031 => x"633a2020", +3032 => x"20202020", +3033 => x"20202020", +3034 => x"2025640a", +3035 => x"00000000", +3036 => x"496e745f", +3037 => x"325f4c6f", +3038 => x"633a2020", +3039 => x"20202020", +3040 => x"20202020", +3041 => x"2025640a", +3042 => x"00000000", +3043 => x"496e745f", +3044 => x"335f4c6f", +3045 => x"633a2020", +3046 => x"20202020", +3047 => x"20202020", +3048 => x"2025640a", +3049 => x"00000000", +3050 => x"456e756d", +3051 => x"5f4c6f63", +3052 => x"3a202020", +3053 => x"20202020", +3054 => x"20202020", +3055 => x"2025640a", +3056 => x"00000000", +3057 => x"5374725f", +3058 => x"315f4c6f", +3059 => x"633a2020", +3060 => x"20202020", +3061 => x"20202020", +3062 => x"2025730a", +3063 => x"00000000", +3064 => x"20202020", +3065 => x"20202020", +3066 => x"73686f75", +3067 => x"6c642062", +3068 => x"653a2020", +3069 => x"20444852", +3070 => x"5953544f", +3071 => x"4e452050", +3072 => x"524f4752", +3073 => x"414d2c20", +3074 => x"31275354", +3075 => x"20535452", +3076 => x"494e470a", +3077 => x"00000000", +3078 => x"5374725f", +3079 => x"325f4c6f", +3080 => x"633a2020", +3081 => x"20202020", +3082 => x"20202020", +3083 => x"2025730a", +3084 => x"00000000", +3085 => x"20202020", +3086 => x"20202020", +3087 => x"73686f75", +3088 => x"6c642062", +3089 => x"653a2020", +3090 => x"20444852", +3091 => x"5953544f", +3092 => x"4e452050", +3093 => x"524f4752", +3094 => x"414d2c20", +3095 => x"32274e44", +3096 => x"20535452", +3097 => x"494e470a", +3098 => x"00000000", +3099 => x"55736572", +3100 => x"2074696d", +3101 => x"653a2025", +3102 => x"640a0000", +3103 => x"4d696372", +3104 => x"6f736563", +3105 => x"6f6e6473", +3106 => x"20666f72", +3107 => x"206f6e65", +3108 => x"2072756e", +3109 => x"20746872", +3110 => x"6f756768", +3111 => x"20446872", +3112 => x"7973746f", +3113 => x"6e653a20", +3114 => x"00000000", +3115 => x"2564200a", +3116 => x"00000000", +3117 => x"44687279", +3118 => x"73746f6e", +3119 => x"65732070", +3120 => x"65722053", +3121 => x"65636f6e", +3122 => x"643a2020", +3123 => x"20202020", +3124 => x"20202020", +3125 => x"20202020", +3126 => x"20202020", +3127 => x"20202020", +3128 => x"00000000", +3129 => x"56415820", +3130 => x"4d495053", +3131 => x"20726174", +3132 => x"696e6720", +3133 => x"2a203130", +3134 => x"3030203d", +3135 => x"20256420", +3136 => x"0a000000", +3137 => x"50726f67", +3138 => x"72616d20", +3139 => x"636f6d70", +3140 => x"696c6564", +3141 => x"20776974", +3142 => x"686f7574", +3143 => x"20277265", +3144 => x"67697374", +3145 => x"65722720", +3146 => x"61747472", +3147 => x"69627574", +3148 => x"650a0000", +3149 => x"4d656173", +3150 => x"75726564", +3151 => x"2074696d", +3152 => x"6520746f", +3153 => x"6f20736d", +3154 => x"616c6c20", +3155 => x"746f206f", +3156 => x"62746169", +3157 => x"6e206d65", +3158 => x"616e696e", +3159 => x"6766756c", +3160 => x"20726573", +3161 => x"756c7473", +3162 => x"0a000000", +3163 => x"506c6561", +3164 => x"73652069", +3165 => x"6e637265", +3166 => x"61736520", +3167 => x"6e756d62", +3168 => x"6572206f", +3169 => x"66207275", +3170 => x"6e730a00", +3171 => x"44485259", +3172 => x"53544f4e", +3173 => x"45205052", +3174 => x"4f475241", +3175 => x"4d2c2033", +3176 => x"27524420", +3177 => x"53545249", +3178 => x"4e470000", +3179 => x"43000000", +3180 => x"64756d6d", +3181 => x"792e6578", +3182 => x"65000000", +3183 => x"00010202", +3184 => x"03030303", +3185 => x"04040404", +3186 => x"04040404", +3187 => x"05050505", +3188 => x"05050505", +3189 => x"05050505", +3190 => x"05050505", +3191 => x"06060606", +3192 => x"06060606", +3193 => x"06060606", +3194 => x"06060606", +3195 => x"06060606", +3196 => x"06060606", +3197 => x"06060606", +3198 => x"06060606", +3199 => x"07070707", +3200 => x"07070707", +3201 => x"07070707", +3202 => x"07070707", +3203 => x"07070707", +3204 => x"07070707", +3205 => x"07070707", +3206 => x"07070707", +3207 => x"07070707", +3208 => x"07070707", +3209 => x"07070707", +3210 => x"07070707", +3211 => x"07070707", +3212 => x"07070707", +3213 => x"07070707", +3214 => x"07070707", +3215 => x"08080808", +3216 => x"08080808", +3217 => x"08080808", +3218 => x"08080808", +3219 => x"08080808", +3220 => x"08080808", +3221 => x"08080808", +3222 => x"08080808", +3223 => x"08080808", +3224 => x"08080808", +3225 => x"08080808", +3226 => x"08080808", +3227 => x"08080808", +3228 => x"08080808", +3229 => x"08080808", +3230 => x"08080808", +3231 => x"08080808", +3232 => x"08080808", +3233 => x"08080808", +3234 => x"08080808", +3235 => x"08080808", +3236 => x"08080808", +3237 => x"08080808", +3238 => x"08080808", +3239 => x"08080808", +3240 => x"08080808", +3241 => x"08080808", +3242 => x"08080808", +3243 => x"08080808", +3244 => x"08080808", +3245 => x"08080808", +3246 => x"08080808", +3247 => x"00ffffff", +3248 => x"ff00ffff", +3249 => x"ffff00ff", +3250 => x"ffffff00", +3251 => x"00000000", +3252 => x"00000000", +3253 => x"00000000", +3254 => x"00003ab8", +3255 => x"000186a0", -- iterations +3256 => x"00000000", +3257 => x"00000000", +3258 => x"00000000", +3259 => x"00000000", +3260 => x"00000000", +3261 => x"00000000", +3262 => x"00000000", +3263 => x"00000000", +3264 => x"00000000", +3265 => x"00000000", +3266 => x"00000000", +3267 => x"00000000", +3268 => x"00000000", +3269 => x"ffffffff", +3270 => x"00000000", +3271 => x"00020000", +3272 => x"00000000", +3273 => x"00000000", +3274 => x"00003320", +3275 => x"00003320", +3276 => x"00003328", +3277 => x"00003328", +3278 => x"00003330", +3279 => x"00003330", +3280 => x"00003338", +3281 => x"00003338", +3282 => x"00003340", +3283 => x"00003340", +3284 => x"00003348", +3285 => x"00003348", +3286 => x"00003350", +3287 => x"00003350", +3288 => x"00003358", +3289 => x"00003358", +3290 => x"00003360", +3291 => x"00003360", +3292 => x"00003368", +3293 => x"00003368", +3294 => x"00003370", +3295 => x"00003370", +3296 => x"00003378", +3297 => x"00003378", +3298 => x"00003380", +3299 => x"00003380", +3300 => x"00003388", +3301 => x"00003388", +3302 => x"00003390", +3303 => x"00003390", +3304 => x"00003398", +3305 => x"00003398", +3306 => x"000033a0", +3307 => x"000033a0", +3308 => x"000033a8", +3309 => x"000033a8", +3310 => x"000033b0", +3311 => x"000033b0", +3312 => x"000033b8", +3313 => x"000033b8", +3314 => x"000033c0", +3315 => x"000033c0", +3316 => x"000033c8", +3317 => x"000033c8", +3318 => x"000033d0", +3319 => x"000033d0", +3320 => x"000033d8", +3321 => x"000033d8", +3322 => x"000033e0", +3323 => x"000033e0", +3324 => x"000033e8", +3325 => x"000033e8", +3326 => x"000033f0", +3327 => x"000033f0", +3328 => x"000033f8", +3329 => x"000033f8", +3330 => x"00003400", +3331 => x"00003400", +3332 => x"00003408", +3333 => x"00003408", +3334 => x"00003410", +3335 => x"00003410", +3336 => x"00003418", +3337 => x"00003418", +3338 => x"00003420", +3339 => x"00003420", +3340 => x"00003428", +3341 => x"00003428", +3342 => x"00003430", +3343 => x"00003430", +3344 => x"00003438", +3345 => x"00003438", +3346 => x"00003440", +3347 => x"00003440", +3348 => x"00003448", +3349 => x"00003448", +3350 => x"00003450", +3351 => x"00003450", +3352 => x"00003458", +3353 => x"00003458", +3354 => x"00003460", +3355 => x"00003460", +3356 => x"00003468", +3357 => x"00003468", +3358 => x"00003470", +3359 => x"00003470", +3360 => x"00003478", +3361 => x"00003478", +3362 => x"00003480", +3363 => x"00003480", +3364 => x"00003488", +3365 => x"00003488", +3366 => x"00003490", +3367 => x"00003490", +3368 => x"00003498", +3369 => x"00003498", +3370 => x"000034a0", +3371 => x"000034a0", +3372 => x"000034a8", +3373 => x"000034a8", +3374 => x"000034b0", +3375 => x"000034b0", +3376 => x"000034b8", +3377 => x"000034b8", +3378 => x"000034c0", +3379 => x"000034c0", +3380 => x"000034c8", +3381 => x"000034c8", +3382 => x"000034d0", +3383 => x"000034d0", +3384 => x"000034d8", +3385 => x"000034d8", +3386 => x"000034e0", +3387 => x"000034e0", +3388 => x"000034e8", +3389 => x"000034e8", +3390 => x"000034f0", +3391 => x"000034f0", +3392 => x"000034f8", +3393 => x"000034f8", +3394 => x"00003500", +3395 => x"00003500", +3396 => x"00003508", +3397 => x"00003508", +3398 => x"00003510", +3399 => x"00003510", +3400 => x"00003518", +3401 => x"00003518", +3402 => x"00003520", +3403 => x"00003520", +3404 => x"00003528", +3405 => x"00003528", +3406 => x"00003530", +3407 => x"00003530", +3408 => x"00003538", +3409 => x"00003538", +3410 => x"00003540", +3411 => x"00003540", +3412 => x"00003548", +3413 => x"00003548", +3414 => x"00003550", +3415 => x"00003550", +3416 => x"00003558", +3417 => x"00003558", +3418 => x"00003560", +3419 => x"00003560", +3420 => x"00003568", +3421 => x"00003568", +3422 => x"00003570", +3423 => x"00003570", +3424 => x"00003578", +3425 => x"00003578", +3426 => x"00003580", +3427 => x"00003580", +3428 => x"00003588", +3429 => x"00003588", +3430 => x"00003590", +3431 => x"00003590", +3432 => x"00003598", +3433 => x"00003598", +3434 => x"000035a0", +3435 => x"000035a0", +3436 => x"000035a8", +3437 => x"000035a8", +3438 => x"000035b0", +3439 => x"000035b0", +3440 => x"000035b8", +3441 => x"000035b8", +3442 => x"000035c0", +3443 => x"000035c0", +3444 => x"000035c8", +3445 => x"000035c8", +3446 => x"000035d0", +3447 => x"000035d0", +3448 => x"000035d8", +3449 => x"000035d8", +3450 => x"000035e0", +3451 => x"000035e0", +3452 => x"000035e8", +3453 => x"000035e8", +3454 => x"000035f0", +3455 => x"000035f0", +3456 => x"000035f8", +3457 => x"000035f8", +3458 => x"00003600", +3459 => x"00003600", +3460 => x"00003608", +3461 => x"00003608", +3462 => x"00003610", +3463 => x"00003610", +3464 => x"00003618", +3465 => x"00003618", +3466 => x"00003620", +3467 => x"00003620", +3468 => x"00003628", +3469 => x"00003628", +3470 => x"00003630", +3471 => x"00003630", +3472 => x"00003638", +3473 => x"00003638", +3474 => x"00003640", +3475 => x"00003640", +3476 => x"00003648", +3477 => x"00003648", +3478 => x"00003650", +3479 => x"00003650", +3480 => x"00003658", +3481 => x"00003658", +3482 => x"00003660", +3483 => x"00003660", +3484 => x"00003668", +3485 => x"00003668", +3486 => x"00003670", +3487 => x"00003670", +3488 => x"00003678", +3489 => x"00003678", +3490 => x"00003680", +3491 => x"00003680", +3492 => x"00003688", +3493 => x"00003688", +3494 => x"00003690", +3495 => x"00003690", +3496 => x"00003698", +3497 => x"00003698", +3498 => x"000036a0", +3499 => x"000036a0", +3500 => x"000036a8", +3501 => x"000036a8", +3502 => x"000036b0", +3503 => x"000036b0", +3504 => x"000036b8", +3505 => x"000036b8", +3506 => x"000036c0", +3507 => x"000036c0", +3508 => x"000036c8", +3509 => x"000036c8", +3510 => x"000036d0", +3511 => x"000036d0", +3512 => x"000036d8", +3513 => x"000036d8", +3514 => x"000036e0", +3515 => x"000036e0", +3516 => x"000036e8", +3517 => x"000036e8", +3518 => x"000036f0", +3519 => x"000036f0", +3520 => x"000036f8", +3521 => x"000036f8", +3522 => x"00003700", +3523 => x"00003700", +3524 => x"00003708", +3525 => x"00003708", +3526 => x"00003710", +3527 => x"00003710", +3528 => x"00003718", +3529 => x"00003718", +3530 => x"0000372c", +3531 => x"00000000", +3532 => x"00003994", +3533 => x"000039f0", +3534 => x"00003a4c", +3535 => x"00000000", +3536 => x"00000000", +3537 => x"00000000", +3538 => x"00000000", +3539 => x"00000000", +3540 => x"00000000", +3541 => x"00000000", +3542 => x"00000000", +3543 => x"00000000", +3544 => x"000031ac", +3545 => x"00000000", +3546 => x"00000000", +3547 => x"00000000", +3548 => x"00000000", +3549 => x"00000000", +3550 => x"00000000", +3551 => x"00000000", +3552 => x"00000000", +3553 => x"00000000", +3554 => x"00000000", +3555 => x"00000000", +3556 => x"00000000", +3557 => x"00000000", +3558 => x"00000000", +3559 => x"00000000", +3560 => x"00000000", +3561 => x"00000000", +3562 => x"00000000", +3563 => x"00000000", +3564 => x"00000000", +3565 => x"00000000", +3566 => x"00000000", +3567 => x"00000000", +3568 => x"00000000", +3569 => x"00000000", +3570 => x"00000000", +3571 => x"00000000", +3572 => x"00000000", +3573 => x"00000001", +3574 => x"330eabcd", +3575 => x"1234e66d", +3576 => x"deec0005", +3577 => x"000b0000", +3578 => x"00000000", +3579 => x"00000000", +3580 => x"00000000", +3581 => x"00000000", +3582 => x"00000000", +3583 => x"00000000", +3584 => x"00000000", +3585 => x"00000000", +3586 => x"00000000", +3587 => x"00000000", +3588 => x"00000000", +3589 => x"00000000", +3590 => x"00000000", +3591 => x"00000000", +3592 => x"00000000", +3593 => x"00000000", +3594 => x"00000000", +3595 => x"00000000", +3596 => x"00000000", +3597 => x"00000000", +3598 => x"00000000", +3599 => x"00000000", +3600 => x"00000000", +3601 => x"00000000", +3602 => x"00000000", +3603 => x"00000000", +3604 => x"00000000", +3605 => x"00000000", +3606 => x"00000000", +3607 => x"00000000", +3608 => x"00000000", +3609 => x"00000000", +3610 => x"00000000", +3611 => x"00000000", +3612 => x"00000000", +3613 => x"00000000", +3614 => x"00000000", +3615 => x"00000000", +3616 => x"00000000", +3617 => x"00000000", +3618 => x"00000000", +3619 => x"00000000", +3620 => x"00000000", +3621 => x"00000000", +3622 => x"00000000", +3623 => x"00000000", +3624 => x"00000000", +3625 => x"00000000", +3626 => x"00000000", +3627 => x"00000000", +3628 => x"00000000", +3629 => x"00000000", +3630 => x"00000000", +3631 => x"00000000", +3632 => x"00000000", +3633 => x"00000000", +3634 => x"00000000", +3635 => x"00000000", +3636 => x"00000000", +3637 => x"00000000", +3638 => x"00000000", +3639 => x"00000000", +3640 => x"00000000", +3641 => x"00000000", +3642 => x"00000000", +3643 => x"00000000", +3644 => x"00000000", +3645 => x"00000000", +3646 => x"00000000", +3647 => x"00000000", +3648 => x"00000000", +3649 => x"00000000", +3650 => x"00000000", +3651 => x"00000000", +3652 => x"00000000", +3653 => x"00000000", +3654 => x"00000000", +3655 => x"00000000", +3656 => x"00000000", +3657 => x"00000000", +3658 => x"00000000", +3659 => x"00000000", +3660 => x"00000000", +3661 => x"00000000", +3662 => x"00000000", +3663 => x"00000000", +3664 => x"00000000", +3665 => x"00000000", +3666 => x"00000000", +3667 => x"00000000", +3668 => x"00000000", +3669 => x"00000000", +3670 => x"00000000", +3671 => x"00000000", +3672 => x"00000000", +3673 => x"00000000", +3674 => x"00000000", +3675 => x"00000000", +3676 => x"00000000", +3677 => x"00000000", +3678 => x"00000000", +3679 => x"00000000", +3680 => x"00000000", +3681 => x"00000000", +3682 => x"00000000", +3683 => x"00000000", +3684 => x"00000000", +3685 => x"00000000", +3686 => x"00000000", +3687 => x"00000000", +3688 => x"00000000", +3689 => x"00000000", +3690 => x"00000000", +3691 => x"00000000", +3692 => x"00000000", +3693 => x"00000000", +3694 => x"00000000", +3695 => x"00000000", +3696 => x"00000000", +3697 => x"00000000", +3698 => x"00000000", +3699 => x"00000000", +3700 => x"00000000", +3701 => x"00000000", +3702 => x"00000000", +3703 => x"00000000", +3704 => x"00000000", +3705 => x"00000000", +3706 => x"00000000", +3707 => x"00000000", +3708 => x"00000000", +3709 => x"00000000", +3710 => x"00000000", +3711 => x"00000000", +3712 => x"00000000", +3713 => x"00000000", +3714 => x"00000000", +3715 => x"00000000", +3716 => x"00000000", +3717 => x"00000000", +3718 => x"00000000", +3719 => x"00000000", +3720 => x"00000000", +3721 => x"00000000", +3722 => x"00000000", +3723 => x"00000000", +3724 => x"00000000", +3725 => x"00000000", +3726 => x"00000000", +3727 => x"00000000", +3728 => x"00000000", +3729 => x"00000000", +3730 => x"00000000", +3731 => x"00000000", +3732 => x"00000000", +3733 => x"00000000", +3734 => x"00000000", +3735 => x"00000000", +3736 => x"00000000", +3737 => x"00000000", +3738 => x"00000000", +3739 => x"00000000", +3740 => x"00000000", +3741 => x"00000000", +3742 => x"00000000", +3743 => x"00000000", +3744 => x"00000000", +3745 => x"00000000", +3746 => x"00000000", +3747 => x"00000000", +3748 => x"00000000", +3749 => x"00000000", +3750 => x"00000000", +3751 => x"00000000", +3752 => x"00000000", +3753 => x"00000000", +3754 => x"000031b0", +3755 => x"ffffffff", +3756 => x"00000000", +3757 => x"ffffffff", +3758 => x"00000000", + others => x"00000000" +); + +begin + +mem_busy <= '0'; + +process (clk) +begin + if (clk'event and clk = '1') then + if (mem_writeEnable = '1') then + ram(conv_integer(mem_addr)) := mem_write; + end if; + mem_read <= ram(conv_integer(mem_addr)); + end if; +end process; + + + + +end dram_arch; diff --git a/zpu/hdl/zpu4/src/bram_dmips.vhd b/zpu/hdl/zpu4/src/bram_dmips.vhd new file mode 100644 index 0000000..1c85e0d --- /dev/null +++ b/zpu/hdl/zpu4/src/bram_dmips.vhd @@ -0,0 +1,3717 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; + + +library work; +use work.zpu_config.all; +use work.zpupkg.all; + +entity dualport_ram is +port (clk : in std_logic; + memAWriteEnable : in std_logic; + memAAddr : in std_logic_vector(maxAddrBit downto minAddrBit); + memAWrite : in std_logic_vector(wordSize-1 downto 0); + memARead : out std_logic_vector(wordSize-1 downto 0); + memBWriteEnable : in std_logic; + memBAddr : in std_logic_vector(maxAddrBit downto minAddrBit); + memBWrite : in std_logic_vector(wordSize-1 downto 0); + memBRead : out std_logic_vector(wordSize-1 downto 0)); +end dualport_ram; + +architecture dualport_ram_arch of dualport_ram is + + +type ram_type is array(0 to ((2**(maxAddrBit+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); + +shared variable ram : ram_type := +( +0 => x"0b0b0b0b", +1 => x"80700b0b", +2 => x"80e2a40c", +3 => x"3a0b0b80", +4 => x"c6fc0400", +5 => x"00000000", +6 => x"00000000", +7 => x"00000000", +8 => x"80088408", +9 => x"88080b0b", +10 => x"80c7c32d", +11 => x"880c840c", +12 => x"800c0400", +13 => x"00000000", +14 => x"00000000", +15 => x"00000000", +16 => x"71fd0608", +17 => x"72830609", +18 => x"81058205", +19 => x"832b2a83", +20 => x"ffff0652", +21 => x"04000000", +22 => x"00000000", +23 => x"00000000", +24 => x"71fd0608", +25 => x"83ffff73", +26 => x"83060981", +27 => x"05820583", +28 => x"2b2b0906", +29 => x"7383ffff", +30 => x"0b0b0b0b", +31 => x"83a70400", +32 => x"72098105", +33 => x"72057373", +34 => x"09060906", +35 => x"73097306", +36 => x"070a8106", +37 => x"53510400", +38 => x"00000000", +39 => x"00000000", +40 => x"72722473", +41 => x"732e0753", +42 => x"51040000", +43 => x"00000000", +44 => x"00000000", +45 => x"00000000", +46 => x"00000000", +47 => x"00000000", +48 => x"71737109", +49 => x"71068106", +50 => x"30720a10", +51 => x"0a720a10", +52 => x"0a31050a", +53 => x"81065151", +54 => x"53510400", +55 => x"00000000", +56 => x"72722673", +57 => x"732e0753", +58 => x"51040000", +59 => x"00000000", +60 => x"00000000", +61 => x"00000000", +62 => x"00000000", +63 => x"00000000", +64 => x"00000000", +65 => x"00000000", +66 => x"00000000", +67 => x"00000000", +68 => x"00000000", +69 => x"00000000", +70 => x"00000000", +71 => x"00000000", +72 => x"0b0b0b88", +73 => x"c4040000", +74 => x"00000000", +75 => x"00000000", +76 => x"00000000", +77 => x"00000000", +78 => x"00000000", +79 => x"00000000", +80 => x"720a722b", +81 => x"0a535104", +82 => x"00000000", +83 => x"00000000", +84 => x"00000000", +85 => x"00000000", +86 => x"00000000", +87 => x"00000000", +88 => x"72729f06", +89 => x"0981050b", +90 => x"0b0b88a7", +91 => x"05040000", +92 => x"00000000", +93 => x"00000000", +94 => x"00000000", +95 => x"00000000", +96 => x"72722aff", +97 => x"739f062a", +98 => x"0974090a", +99 => x"8106ff05", +100 => x"06075351", +101 => x"04000000", +102 => x"00000000", +103 => x"00000000", +104 => x"71715351", +105 => x"020d0406", +106 => x"73830609", +107 => x"81058205", +108 => x"832b0b2b", +109 => x"0772fc06", +110 => x"0c515104", +111 => x"00000000", +112 => x"72098105", +113 => x"72050970", +114 => x"81050906", +115 => x"0a810653", +116 => x"51040000", +117 => x"00000000", +118 => x"00000000", +119 => x"00000000", +120 => x"72098105", +121 => x"72050970", +122 => x"81050906", +123 => x"0a098106", +124 => x"53510400", +125 => x"00000000", +126 => x"00000000", +127 => x"00000000", +128 => x"71098105", +129 => x"52040000", +130 => x"00000000", +131 => x"00000000", +132 => x"00000000", +133 => x"00000000", +134 => x"00000000", +135 => x"00000000", +136 => x"72720981", +137 => x"05055351", +138 => x"04000000", +139 => x"00000000", +140 => x"00000000", +141 => x"00000000", +142 => x"00000000", +143 => x"00000000", +144 => x"72097206", +145 => x"73730906", +146 => x"07535104", +147 => x"00000000", +148 => x"00000000", +149 => x"00000000", +150 => x"00000000", +151 => x"00000000", +152 => x"71fc0608", +153 => x"72830609", +154 => x"81058305", +155 => x"1010102a", +156 => x"81ff0652", +157 => x"04000000", +158 => x"00000000", +159 => x"00000000", +160 => x"71fc0608", +161 => x"0b0b80e2", +162 => x"90738306", +163 => x"10100508", +164 => x"060b0b0b", +165 => x"88aa0400", +166 => x"00000000", +167 => x"00000000", +168 => x"80088408", +169 => x"88087575", +170 => x"0b0b0baf", +171 => x"ac2d5050", +172 => x"80085688", +173 => x"0c840c80", +174 => x"0c510400", +175 => x"00000000", +176 => x"80088408", +177 => x"88087575", +178 => x"0b0b0baf", +179 => x"f02d5050", +180 => x"80085688", +181 => x"0c840c80", +182 => x"0c510400", +183 => x"00000000", +184 => x"72097081", +185 => x"0509060a", +186 => x"8106ff05", +187 => x"70547106", +188 => x"73097274", +189 => x"05ff0506", +190 => x"07515151", +191 => x"04000000", +192 => x"72097081", +193 => x"0509060a", +194 => x"098106ff", +195 => x"05705471", +196 => x"06730972", +197 => x"7405ff05", +198 => x"06075151", +199 => x"51040000", +200 => x"05ff0504", +201 => x"00000000", +202 => x"00000000", +203 => x"00000000", +204 => x"00000000", +205 => x"00000000", +206 => x"00000000", +207 => x"00000000", +208 => x"810b0b0b", +209 => x"80e2a00c", +210 => x"51040000", +211 => x"00000000", +212 => x"00000000", +213 => x"00000000", +214 => x"00000000", +215 => x"00000000", +216 => x"71810552", +217 => x"04000000", +218 => x"00000000", +219 => x"00000000", +220 => x"00000000", +221 => x"00000000", +222 => x"00000000", +223 => x"00000000", +224 => x"00000000", +225 => x"00000000", +226 => x"00000000", +227 => x"00000000", +228 => x"00000000", +229 => x"00000000", +230 => x"00000000", +231 => x"00000000", +232 => x"02840572", +233 => x"10100552", +234 => x"04000000", +235 => x"00000000", +236 => x"00000000", +237 => x"00000000", +238 => x"00000000", +239 => x"00000000", +240 => x"00000000", +241 => x"00000000", +242 => x"00000000", +243 => x"00000000", +244 => x"00000000", +245 => x"00000000", +246 => x"00000000", +247 => x"00000000", +248 => x"717105ff", +249 => x"05715351", +250 => x"020d0400", +251 => x"00000000", +252 => x"00000000", +253 => x"00000000", +254 => x"00000000", +255 => x"00000000", +256 => x"83d93f80", +257 => x"cbcf3f04", +258 => x"10101010", +259 => x"10101010", +260 => x"10101010", +261 => x"10101010", +262 => x"10101010", +263 => x"10101010", +264 => x"10101010", +265 => x"10101053", +266 => x"51047381", +267 => x"ff067383", +268 => x"06098105", +269 => x"83051010", +270 => x"102b0772", +271 => x"fc060c51", +272 => x"51043c04", +273 => x"72728072", +274 => x"8106ff05", +275 => x"09720605", +276 => x"71105272", +277 => x"0a100a53", +278 => x"72ed3851", +279 => x"51535104", +280 => x"ff3d0d0b", +281 => x"0b80f294", +282 => x"08528412", +283 => x"08708106", +284 => x"515170f6", +285 => x"38710881", +286 => x"ff06800c", +287 => x"833d0d04", +288 => x"ff3d0d0b", +289 => x"0b80f294", +290 => x"08528412", +291 => x"08700a10", +292 => x"0a708106", +293 => x"51515170", +294 => x"f1387372", +295 => x"0c833d0d", +296 => x"0480e2a0", +297 => x"08802ea8", +298 => x"38838080", +299 => x"0b0b0b80", +300 => x"f2940c82", +301 => x"a0800b0b", +302 => x"0b80f298", +303 => x"0c829080", +304 => x"0b80f2a8", +305 => x"0c0b0b80", +306 => x"f29c0b80", +307 => x"f2ac0c04", +308 => x"f8808080", +309 => x"a40b0b0b", +310 => x"80f2940c", +311 => x"f8808082", +312 => x"800b0b0b", +313 => x"80f2980c", +314 => x"f8808084", +315 => x"800b80f2", +316 => x"a80cf880", +317 => x"8080940b", +318 => x"80f2ac0c", +319 => x"f8808080", +320 => x"9c0b80f2", +321 => x"a40cf880", +322 => x"8080a00b", +323 => x"80f2b00c", +324 => x"04f23d0d", +325 => x"600b0b80", +326 => x"f2980856", +327 => x"5d82750c", +328 => x"8059805a", +329 => x"800b8f3d", +330 => x"71101017", +331 => x"70085957", +332 => x"5d5b8076", +333 => x"81ff067c", +334 => x"832b5658", +335 => x"5276537b", +336 => x"519af33f", +337 => x"7d7f7a72", +338 => x"077c7207", +339 => x"71716081", +340 => x"05415f5d", +341 => x"5b595755", +342 => x"7a8724bb", +343 => x"380b0b80", +344 => x"f298087b", +345 => x"10101170", +346 => x"08585155", +347 => x"807681ff", +348 => x"067c832b", +349 => x"56585276", +350 => x"537b519a", +351 => x"b93f7d7f", +352 => x"7a72077c", +353 => x"72077171", +354 => x"60810541", +355 => x"5f5d5b59", +356 => x"5755877b", +357 => x"25c73876", +358 => x"7d0c7784", +359 => x"1e0c7c80", +360 => x"0c903d0d", +361 => x"04ff3d0d", +362 => x"80f2a033", +363 => x"5170a738", +364 => x"80e2ac08", +365 => x"70085252", +366 => x"70802e94", +367 => x"38841280", +368 => x"e2ac0c70", +369 => x"2d80e2ac", +370 => x"08700852", +371 => x"5270ee38", +372 => x"810b80f2", +373 => x"a034833d", +374 => x"0d040480", +375 => x"3d0d0b0b", +376 => x"80f29008", +377 => x"802e8e38", +378 => x"0b0b0b0b", +379 => x"800b802e", +380 => x"09810685", +381 => x"38823d0d", +382 => x"040b0b80", +383 => x"f290510b", +384 => x"0b0bf3fc", +385 => x"3f823d0d", +386 => x"0404ff3d", +387 => x"0d028f05", +388 => x"3352718a", +389 => x"2e8a3871", +390 => x"51fce53f", +391 => x"833d0d04", +392 => x"8d51fcdc", +393 => x"3f7151fc", +394 => x"d73f833d", +395 => x"0d04ce3d", +396 => x"0db53d70", +397 => x"70840552", +398 => x"088c8a5c", +399 => x"56a53d5e", +400 => x"5c807570", +401 => x"81055733", +402 => x"765b5558", +403 => x"73782e80", +404 => x"c1388e3d", +405 => x"5b73a52e", +406 => x"09810680", +407 => x"c5387870", +408 => x"81055a33", +409 => x"547380e4", +410 => x"2e81b638", +411 => x"7380e424", +412 => x"80c63873", +413 => x"80e32ea1", +414 => x"388052a5", +415 => x"51792d80", +416 => x"52735179", +417 => x"2d821858", +418 => x"78708105", +419 => x"5a335473", +420 => x"c4387780", +421 => x"0cb43d0d", +422 => x"047b841d", +423 => x"83123356", +424 => x"5d578052", +425 => x"7351792d", +426 => x"81187970", +427 => x"81055b33", +428 => x"555873ff", +429 => x"a038db39", +430 => x"7380f32e", +431 => x"098106ff", +432 => x"b8387b84", +433 => x"1d710859", +434 => x"5d568077", +435 => x"33555673", +436 => x"762e8d38", +437 => x"81167018", +438 => x"70335755", +439 => x"5674f538", +440 => x"ff165580", +441 => x"7625ffa0", +442 => x"38767081", +443 => x"05583354", +444 => x"80527351", +445 => x"792d8118", +446 => x"75ff1757", +447 => x"57588076", +448 => x"25ff8538", +449 => x"76708105", +450 => x"58335480", +451 => x"52735179", +452 => x"2d811875", +453 => x"ff175757", +454 => x"58758024", +455 => x"cc38fee8", +456 => x"397b841d", +457 => x"71087071", +458 => x"9f2c5953", +459 => x"595d5680", +460 => x"75248195", +461 => x"38757d7c", +462 => x"58565480", +463 => x"5773772e", +464 => x"098106b6", +465 => x"38b07b34", +466 => x"02b50556", +467 => x"7a762e97", +468 => x"38ff1656", +469 => x"75337570", +470 => x"81055734", +471 => x"8117577a", +472 => x"762e0981", +473 => x"06eb3880", +474 => x"7534767d", +475 => x"ff125758", +476 => x"56758024", +477 => x"fef338fe", +478 => x"8f398a52", +479 => x"7351a0f0", +480 => x"3f80080b", +481 => x"0b80d484", +482 => x"05337670", +483 => x"81055834", +484 => x"8a527351", +485 => x"a0963f80", +486 => x"08548008", +487 => x"802effac", +488 => x"388a5273", +489 => x"51a0c93f", +490 => x"80080b0b", +491 => x"80d48405", +492 => x"33767081", +493 => x"0558348a", +494 => x"5273519f", +495 => x"ef3f8008", +496 => x"548008ff", +497 => x"b538ff84", +498 => x"39745276", +499 => x"53b43dff", +500 => x"b8055195", +501 => x"b63fa33d", +502 => x"0856fed9", +503 => x"39803d0d", +504 => x"80c10b81", +505 => x"c0f43480", +506 => x"0b81c2d0", +507 => x"0c70800c", +508 => x"823d0d04", +509 => x"ff3d0d80", +510 => x"0b81c0f4", +511 => x"33525270", +512 => x"80c12e99", +513 => x"387181c2", +514 => x"d0080781", +515 => x"c2d00c80", +516 => x"c20b81c0", +517 => x"f8347080", +518 => x"0c833d0d", +519 => x"04810b81", +520 => x"c2d00807", +521 => x"81c2d00c", +522 => x"80c20b81", +523 => x"c0f83470", +524 => x"800c833d", +525 => x"0d04fd3d", +526 => x"0d757008", +527 => x"8a055353", +528 => x"81c0f433", +529 => x"517080c1", +530 => x"2e8b3873", +531 => x"f3387080", +532 => x"0c853d0d", +533 => x"04ff1270", +534 => x"81c0f008", +535 => x"31740c80", +536 => x"0c853d0d", +537 => x"04fc3d0d", +538 => x"81c0fc08", +539 => x"5574802e", +540 => x"8c387675", +541 => x"08710c81", +542 => x"c0fc0856", +543 => x"548c1553", +544 => x"81c0f008", +545 => x"528a5190", +546 => x"f03f7380", +547 => x"0c863d0d", +548 => x"04fb3d0d", +549 => x"77700856", +550 => x"56b05381", +551 => x"c0fc0852", +552 => x"7451acb4", +553 => x"3f850b8c", +554 => x"170c850b", +555 => x"8c160c75", +556 => x"08750c81", +557 => x"c0fc0854", +558 => x"73802e8a", +559 => x"38730875", +560 => x"0c81c0fc", +561 => x"08548c14", +562 => x"5381c0f0", +563 => x"08528a51", +564 => x"90a73f84", +565 => x"1508ad38", +566 => x"860b8c16", +567 => x"0c881552", +568 => x"88160851", +569 => x"8fb33f81", +570 => x"c0fc0870", +571 => x"08760c54", +572 => x"8c157054", +573 => x"548a5273", +574 => x"08518ffd", +575 => x"3f73800c", +576 => x"873d0d04", +577 => x"750854b0", +578 => x"53735275", +579 => x"51abc93f", +580 => x"73800c87", +581 => x"3d0d04d9", +582 => x"3d0db051", +583 => x"9eeb3f80", +584 => x"0881c0ec", +585 => x"0cb0519e", +586 => x"e03f8008", +587 => x"81c0fc0c", +588 => x"81c0ec08", +589 => x"80080c80", +590 => x"0b800884", +591 => x"050c820b", +592 => x"80088805", +593 => x"0ca80b80", +594 => x"088c050c", +595 => x"9f530b0b", +596 => x"80d49052", +597 => x"80089005", +598 => x"51aafd3f", +599 => x"a13d5e9f", +600 => x"530b0b80", +601 => x"d4b0527d", +602 => x"51aaed3f", +603 => x"8a0b80ff", +604 => x"b00c0b0b", +605 => x"80ded451", +606 => x"f9b43f0b", +607 => x"0b80d4d0", +608 => x"51f9ab3f", +609 => x"0b0b80de", +610 => x"d451f9a2", +611 => x"3f80e2b4", +612 => x"08802e8a", +613 => x"cf380b0b", +614 => x"80d58051", +615 => x"f9903f0b", +616 => x"0b80ded4", +617 => x"51f9873f", +618 => x"80e2b008", +619 => x"520b0b80", +620 => x"d5ac51f8", +621 => x"f93f80f2", +622 => x"cc51bbf8", +623 => x"3f810b9a", +624 => x"3d5e5b80", +625 => x"0b80e2b0", +626 => x"082582d6", +627 => x"38903d5f", +628 => x"80c10b81", +629 => x"c0f43481", +630 => x"0b81c2d0", +631 => x"0c80c20b", +632 => x"81c0f834", +633 => x"8240835a", +634 => x"9f530b0b", +635 => x"80d5dc52", +636 => x"7c51a9e4", +637 => x"3f814180", +638 => x"7d537e52", +639 => x"568f9e3f", +640 => x"8008762e", +641 => x"09810683", +642 => x"38815675", +643 => x"81c2d00c", +644 => x"7f705856", +645 => x"758325a2", +646 => x"38751010", +647 => x"16fd0542", +648 => x"a93dffa4", +649 => x"05538352", +650 => x"76518dcd", +651 => x"3f7f8105", +652 => x"70417058", +653 => x"56837624", +654 => x"e0386154", +655 => x"755380f2", +656 => x"d45281c1", +657 => x"88518dc1", +658 => x"3f81c0fc", +659 => x"08700858", +660 => x"58b05377", +661 => x"527651a8", +662 => x"ff3f850b", +663 => x"8c190c85", +664 => x"0b8c180c", +665 => x"7708770c", +666 => x"81c0fc08", +667 => x"5675802e", +668 => x"8a387508", +669 => x"770c81c0", +670 => x"fc08568c", +671 => x"165381c0", +672 => x"f008528a", +673 => x"518cf23f", +674 => x"84170888", +675 => x"e038860b", +676 => x"8c180c88", +677 => x"17528818", +678 => x"08518bfd", +679 => x"3f81c0fc", +680 => x"08700878", +681 => x"0c568c17", +682 => x"7054598a", +683 => x"52780851", +684 => x"8cc73f80", +685 => x"c10b81c0", +686 => x"f8335757", +687 => x"767626a2", +688 => x"3880c352", +689 => x"76518dab", +690 => x"3f800861", +691 => x"2e8aec38", +692 => x"81177081", +693 => x"ff0681c0", +694 => x"f8335858", +695 => x"58757727", +696 => x"e0387960", +697 => x"29627054", +698 => x"71535b59", +699 => x"99be3f80", +700 => x"0840787a", +701 => x"31708729", +702 => x"80083180", +703 => x"088a0581", +704 => x"c0f43381", +705 => x"c0f0085e", +706 => x"5b525a56", +707 => x"7780c12e", +708 => x"8ad8387b", +709 => x"f738811b", +710 => x"5b80e2b0", +711 => x"087b25fd", +712 => x"af3881c0", +713 => x"e451b98c", +714 => x"3f0b0b80", +715 => x"d5fc51f5", +716 => x"fd3f0b0b", +717 => x"80ded451", +718 => x"f5f43f0b", +719 => x"0b80d68c", +720 => x"51f5eb3f", +721 => x"0b0b80de", +722 => x"d451f5e2", +723 => x"3f81c0f0", +724 => x"08520b0b", +725 => x"80d6c451", +726 => x"f5d43f85", +727 => x"520b0b80", +728 => x"d6e051f5", +729 => x"c93f81c2", +730 => x"d008520b", +731 => x"0b80d6fc", +732 => x"51f5bb3f", +733 => x"81520b0b", +734 => x"80d6e051", +735 => x"f5b03f81", +736 => x"c0f43352", +737 => x"0b0b80d7", +738 => x"9851f5a2", +739 => x"3f80c152", +740 => x"0b0b80d7", +741 => x"b451f596", +742 => x"3f81c0f8", +743 => x"33520b0b", +744 => x"80d7d051", +745 => x"f5883f80", +746 => x"c2520b0b", +747 => x"80d7b451", +748 => x"f4fc3f81", +749 => x"c1a80852", +750 => x"0b0b80d7", +751 => x"ec51f4ee", +752 => x"3f87520b", +753 => x"0b80d6e0", +754 => x"51f4e33f", +755 => x"80ffb008", +756 => x"520b0b80", +757 => x"d88851f4", +758 => x"d53f0b0b", +759 => x"80d8a451", +760 => x"f4cc3f0b", +761 => x"0b80d8d0", +762 => x"51f4c33f", +763 => x"81c0fc08", +764 => x"7008535a", +765 => x"0b0b80d8", +766 => x"dc51f4b2", +767 => x"3f0b0b80", +768 => x"d8f851f4", +769 => x"a93f81c0", +770 => x"fc088411", +771 => x"0853560b", +772 => x"0b80d9ac", +773 => x"51f4973f", +774 => x"80520b0b", +775 => x"80d6e051", +776 => x"f48c3f81", +777 => x"c0fc0888", +778 => x"11085358", +779 => x"0b0b80d9", +780 => x"c851f3fa", +781 => x"3f82520b", +782 => x"0b80d6e0", +783 => x"51f3ef3f", +784 => x"81c0fc08", +785 => x"8c110853", +786 => x"570b0b80", +787 => x"d9e451f3", +788 => x"dd3f9152", +789 => x"0b0b80d6", +790 => x"e051f3d2", +791 => x"3f81c0fc", +792 => x"08900552", +793 => x"0b0b80da", +794 => x"8051f3c2", +795 => x"3f0b0b80", +796 => x"da9c51f3", +797 => x"b93f0b0b", +798 => x"80dad451", +799 => x"f3b03f81", +800 => x"c0ec0870", +801 => x"08535f0b", +802 => x"0b80d8dc", +803 => x"51f39f3f", +804 => x"0b0b80da", +805 => x"e851f396", +806 => x"3f81c0ec", +807 => x"08841108", +808 => x"535b0b0b", +809 => x"80d9ac51", +810 => x"f3843f80", +811 => x"520b0b80", +812 => x"d6e051f2", +813 => x"f93f81c0", +814 => x"ec088811", +815 => x"08535c0b", +816 => x"0b80d9c8", +817 => x"51f2e73f", +818 => x"81520b0b", +819 => x"80d6e051", +820 => x"f2dc3f81", +821 => x"c0ec088c", +822 => x"1108535a", +823 => x"0b0b80d9", +824 => x"e451f2ca", +825 => x"3f92520b", +826 => x"0b80d6e0", +827 => x"51f2bf3f", +828 => x"81c0ec08", +829 => x"9005520b", +830 => x"0b80da80", +831 => x"51f2af3f", +832 => x"0b0b80da", +833 => x"9c51f2a6", +834 => x"3f7f520b", +835 => x"0b80dba8", +836 => x"51f29b3f", +837 => x"85520b0b", +838 => x"80d6e051", +839 => x"f2903f78", +840 => x"520b0b80", +841 => x"dbc451f2", +842 => x"853f8d52", +843 => x"0b0b80d6", +844 => x"e051f1fa", +845 => x"3f61520b", +846 => x"0b80dbe0", +847 => x"51f1ef3f", +848 => x"87520b0b", +849 => x"80d6e051", +850 => x"f1e43f60", +851 => x"520b0b80", +852 => x"dbfc51f1", +853 => x"d93f8152", +854 => x"0b0b80d6", +855 => x"e051f1ce", +856 => x"3f7d520b", +857 => x"0b80dc98", +858 => x"51f1c33f", +859 => x"0b0b80dc", +860 => x"b451f1ba", +861 => x"3f7c520b", +862 => x"0b80dcec", +863 => x"51f1af3f", +864 => x"0b0b80dd", +865 => x"8851f1a6", +866 => x"3f0b0b80", +867 => x"ded451f1", +868 => x"9d3f81c0", +869 => x"e40881c0", +870 => x"e80880f2", +871 => x"cc0880f2", +872 => x"d0087271", +873 => x"31707426", +874 => x"75743170", +875 => x"723180f2", +876 => x"c40c4444", +877 => x"80f2c80c", +878 => x"80f2c808", +879 => x"560b0b80", +880 => x"ddc0555c", +881 => x"595758f0", +882 => x"e53f80f2", +883 => x"c4085680", +884 => x"762582b1", +885 => x"3880e2b0", +886 => x"0870719f", +887 => x"2c9a3d53", +888 => x"565680f2", +889 => x"c40880f2", +890 => x"c8084153", +891 => x"7f547052", +892 => x"5a8a8d3f", +893 => x"66685f80", +894 => x"f2b40c7d", +895 => x"80f2b80c", +896 => x"80e2b008", +897 => x"709f2c58", +898 => x"568058bd", +899 => x"84c07855", +900 => x"55765275", +901 => x"53795187", +902 => x"f33f953d", +903 => x"80f2c408", +904 => x"80f2c808", +905 => x"41557f56", +906 => x"67694053", +907 => x"7e547052", +908 => x"5c89cd3f", +909 => x"64665e80", +910 => x"f2bc0c7c", +911 => x"80f2c00c", +912 => x"80e2b008", +913 => x"709f2c40", +914 => x"58805783", +915 => x"dceb9480", +916 => x"7755557e", +917 => x"5277537b", +918 => x"5187b13f", +919 => x"64665d5b", +920 => x"805e8ddd", +921 => x"7e555580", +922 => x"f2c40880", +923 => x"f2c80859", +924 => x"52775379", +925 => x"5187953f", +926 => x"66684054", +927 => x"7e557a52", +928 => x"7b53a93d", +929 => x"ffa80551", +930 => x"88f63f62", +931 => x"645e81c1", +932 => x"800c7c81", +933 => x"c1840c0b", +934 => x"0b80ddd0", +935 => x"51ef8f3f", +936 => x"80f2b808", +937 => x"520b0b80", +938 => x"de8051ef", +939 => x"813f0b0b", +940 => x"80de8851", +941 => x"eef83f80", +942 => x"f2c00852", +943 => x"0b0b80de", +944 => x"8051eeea", +945 => x"3f81c184", +946 => x"08520b0b", +947 => x"80deb851", +948 => x"eedc3f0b", +949 => x"0b80ded4", +950 => x"51eed33f", +951 => x"800b800c", +952 => x"a93d0d04", +953 => x"0b0b80de", +954 => x"d851f5b0", +955 => x"39770857", +956 => x"b0537652", +957 => x"77519fe0", +958 => x"3f80c10b", +959 => x"81c0f833", +960 => x"5757f7b8", +961 => x"39758a38", +962 => x"80f2c808", +963 => x"8126fdc5", +964 => x"380b0b80", +965 => x"df8851ee", +966 => x"953f0b0b", +967 => x"80dfc051", +968 => x"ee8c3f0b", +969 => x"0b80ded4", +970 => x"51ee833f", +971 => x"80e2b008", +972 => x"70719f2c", +973 => x"9a3d5356", +974 => x"5680f2c4", +975 => x"0880f2c8", +976 => x"0841537f", +977 => x"5470525a", +978 => x"87b63f66", +979 => x"685f80f2", +980 => x"b40c7d80", +981 => x"f2b80c80", +982 => x"e2b00870", +983 => x"9f2c5856", +984 => x"8058bd84", +985 => x"c0785555", +986 => x"76527553", +987 => x"7951859c", +988 => x"3f953d80", +989 => x"f2c40880", +990 => x"f2c80841", +991 => x"557f5667", +992 => x"6940537e", +993 => x"5470525c", +994 => x"86f63f64", +995 => x"665e80f2", +996 => x"bc0c7c80", +997 => x"f2c00c80", +998 => x"e2b00870", +999 => x"9f2c4058", +1000 => x"805783dc", +1001 => x"eb948077", +1002 => x"55557e52", +1003 => x"77537b51", +1004 => x"84da3f64", +1005 => x"665d5b80", +1006 => x"5e8ddd7e", +1007 => x"555580f2", +1008 => x"c40880f2", +1009 => x"c8085952", +1010 => x"77537951", +1011 => x"84be3f66", +1012 => x"6840547e", +1013 => x"557a527b", +1014 => x"53a93dff", +1015 => x"a8055186", +1016 => x"9f3f6264", +1017 => x"5e81c180", +1018 => x"0c7c81c1", +1019 => x"840c0b0b", +1020 => x"80ddd051", +1021 => x"ecb83f80", +1022 => x"f2b80852", +1023 => x"0b0b80de", +1024 => x"8051ecaa", +1025 => x"3f0b0b80", +1026 => x"de8851ec", +1027 => x"a13f80f2", +1028 => x"c008520b", +1029 => x"0b80de80", +1030 => x"51ec933f", +1031 => x"81c18408", +1032 => x"520b0b80", +1033 => x"deb851ec", +1034 => x"853f0b0b", +1035 => x"80ded451", +1036 => x"ebfc3f80", +1037 => x"0b800ca9", +1038 => x"3d0d04a9", +1039 => x"3dffa005", +1040 => x"52805180", +1041 => x"d43f9f53", +1042 => x"0b0b80df", +1043 => x"e0527c51", +1044 => x"9d863f7a", +1045 => x"7b81c0f0", +1046 => x"0c811870", +1047 => x"81ff0681", +1048 => x"c0f83359", +1049 => x"59595af4", +1050 => x"f439ff16", +1051 => x"707b3160", +1052 => x"0c5c800b", +1053 => x"811c5c5c", +1054 => x"80e2b008", +1055 => x"7b25f2d0", +1056 => x"38f59f39", +1057 => x"ff3d0d73", +1058 => x"82327030", +1059 => x"70720780", +1060 => x"25800c52", +1061 => x"52833d0d", +1062 => x"04fe3d0d", +1063 => x"74767153", +1064 => x"54527182", +1065 => x"2e833883", +1066 => x"5171812e", +1067 => x"9a388172", +1068 => x"269f3871", +1069 => x"822eb838", +1070 => x"71842ea9", +1071 => x"3870730c", +1072 => x"70800c84", +1073 => x"3d0d0480", +1074 => x"e40b81c0", +1075 => x"f008258b", +1076 => x"3880730c", +1077 => x"70800c84", +1078 => x"3d0d0483", +1079 => x"730c7080", +1080 => x"0c843d0d", +1081 => x"0482730c", +1082 => x"70800c84", +1083 => x"3d0d0481", +1084 => x"730c7080", +1085 => x"0c843d0d", +1086 => x"04803d0d", +1087 => x"74741482", +1088 => x"05710c80", +1089 => x"0c823d0d", +1090 => x"04f73d0d", +1091 => x"7b7d7f61", +1092 => x"85127082", +1093 => x"2b751170", +1094 => x"74717084", +1095 => x"05530c5a", +1096 => x"5a5d5b76", +1097 => x"0c7980f8", +1098 => x"180c7986", +1099 => x"12525758", +1100 => x"5a5a7676", +1101 => x"24993876", +1102 => x"b329822b", +1103 => x"79115153", +1104 => x"76737084", +1105 => x"05550c81", +1106 => x"14547574", +1107 => x"25f23876", +1108 => x"81cc2919", +1109 => x"fc110881", +1110 => x"05fc120c", +1111 => x"7a197008", +1112 => x"9fa0130c", +1113 => x"5856850b", +1114 => x"81c0f00c", +1115 => x"75800c8b", +1116 => x"3d0d04fe", +1117 => x"3d0d0293", +1118 => x"05335180", +1119 => x"02840597", +1120 => x"05335452", +1121 => x"70732e88", +1122 => x"3871800c", +1123 => x"843d0d04", +1124 => x"7081c0f4", +1125 => x"34810b80", +1126 => x"0c843d0d", +1127 => x"04f83d0d", +1128 => x"7a7c5956", +1129 => x"820b8319", +1130 => x"55557416", +1131 => x"70337533", +1132 => x"5b515372", +1133 => x"792e80c6", +1134 => x"3880c10b", +1135 => x"81168116", +1136 => x"56565782", +1137 => x"7525e338", +1138 => x"ffa91770", +1139 => x"81ff0655", +1140 => x"59738226", +1141 => x"83388755", +1142 => x"81537680", +1143 => x"d22e9838", +1144 => x"77527551", +1145 => x"9bc43f80", +1146 => x"53728008", +1147 => x"25893887", +1148 => x"1581c0f0", +1149 => x"0c815372", +1150 => x"800c8a3d", +1151 => x"0d047281", +1152 => x"c0f43482", +1153 => x"7525ffa2", +1154 => x"38ffbd39", +1155 => x"ef3d0d63", +1156 => x"65675b42", +1157 => x"79436769", +1158 => x"59407741", +1159 => x"5a805d80", +1160 => x"5e617083", +1161 => x"ffff0671", +1162 => x"902a6270", +1163 => x"83ffff06", +1164 => x"71902a74", +1165 => x"72297473", +1166 => x"29757329", +1167 => x"77742973", +1168 => x"902a0572", +1169 => x"11515856", +1170 => x"535f5a57", +1171 => x"5a585558", +1172 => x"73732786", +1173 => x"38848080", +1174 => x"16567390", +1175 => x"2a165b78", +1176 => x"83ffff06", +1177 => x"74848080", +1178 => x"29055c7a", +1179 => x"7c5a5d78", +1180 => x"5e777f29", +1181 => x"61782905", +1182 => x"7d055d7c", +1183 => x"7e567a0c", +1184 => x"74841b0c", +1185 => x"79800c93", +1186 => x"3d0d04f9", +1187 => x"3d0d797b", +1188 => x"7d545872", +1189 => x"59773079", +1190 => x"70307072", +1191 => x"079f2a73", +1192 => x"71315a52", +1193 => x"59777956", +1194 => x"730c5373", +1195 => x"84130c54", +1196 => x"800c893d", +1197 => x"0d04f93d", +1198 => x"0d797b7d", +1199 => x"7f565452", +1200 => x"5472802e", +1201 => x"a0387057", +1202 => x"7158a073", +1203 => x"31528072", +1204 => x"25a13877", +1205 => x"70742b57", +1206 => x"70732a78", +1207 => x"752b0756", +1208 => x"51747653", +1209 => x"5170740c", +1210 => x"7184150c", +1211 => x"73800c89", +1212 => x"3d0d0480", +1213 => x"56777230", +1214 => x"2b557476", +1215 => x"5351e639", +1216 => x"e43d0d6e", +1217 => x"a13d08a3", +1218 => x"3d085957", +1219 => x"5f80764d", +1220 => x"774ea33d", +1221 => x"08a53d08", +1222 => x"574b754c", +1223 => x"5e7d6c24", +1224 => x"86fb3880", +1225 => x"6a24878f", +1226 => x"38696b58", +1227 => x"566b6d5d", +1228 => x"467b4775", +1229 => x"44764564", +1230 => x"6468685c", +1231 => x"5c565674", +1232 => x"81e73878", +1233 => x"762782c7", +1234 => x"387581ff", +1235 => x"26832b55", +1236 => x"83ffff76", +1237 => x"278c3890", +1238 => x"55fe800a", +1239 => x"76278338", +1240 => x"98557575", +1241 => x"2a80e080", +1242 => x"057033a0", +1243 => x"77317131", +1244 => x"57555774", +1245 => x"802e9538", +1246 => x"75752ba0", +1247 => x"76317a77", +1248 => x"2b7c722a", +1249 => x"077c782b", +1250 => x"5d5b5956", +1251 => x"75902a76", +1252 => x"83ffff06", +1253 => x"71547a53", +1254 => x"59578880", +1255 => x"3f80085b", +1256 => x"87ea3f80", +1257 => x"08800879", +1258 => x"297c902b", +1259 => x"7c902a07", +1260 => x"56565973", +1261 => x"75279438", +1262 => x"8008ff05", +1263 => x"76155559", +1264 => x"75742687", +1265 => x"38747426", +1266 => x"87b93876", +1267 => x"52737531", +1268 => x"5187c93f", +1269 => x"80085587", +1270 => x"b33f8008", +1271 => x"80087929", +1272 => x"7b83ffff", +1273 => x"0677902b", +1274 => x"07565957", +1275 => x"73782796", +1276 => x"388008ff", +1277 => x"05761555", +1278 => x"57757426", +1279 => x"89387774", +1280 => x"26777131", +1281 => x"58567890", +1282 => x"2b770758", +1283 => x"805b7a40", +1284 => x"77417f61", +1285 => x"56547d80", +1286 => x"d938737f", +1287 => x"0c747f84", +1288 => x"050c7e80", +1289 => x"0c9e3d0d", +1290 => x"0480705c", +1291 => x"58747926", +1292 => x"dd387481", +1293 => x"ff26832b", +1294 => x"577483ff", +1295 => x"ff2682a5", +1296 => x"3874772a", +1297 => x"80e08005", +1298 => x"7033a079", +1299 => x"31713159", +1300 => x"5c5d7682", +1301 => x"b3387654", +1302 => x"74792783", +1303 => x"38815479", +1304 => x"76277407", +1305 => x"59815878", +1306 => x"ffa23876", +1307 => x"58805bff", +1308 => x"9d397352", +1309 => x"74539e3d", +1310 => x"e80551fc", +1311 => x"8e3f6769", +1312 => x"567f0c74", +1313 => x"7f84050c", +1314 => x"7e800c9e", +1315 => x"3d0d0475", +1316 => x"802e81c4", +1317 => x"387581ff", +1318 => x"26832b55", +1319 => x"83ffff76", +1320 => x"278c3890", +1321 => x"55fe800a", +1322 => x"76278338", +1323 => x"98557575", +1324 => x"2a80e080", +1325 => x"057033a0", +1326 => x"77317131", +1327 => x"575e5474", +1328 => x"84913878", +1329 => x"76315481", +1330 => x"76902a77", +1331 => x"83ffff06", +1332 => x"5f5d5b7b", +1333 => x"52735185", +1334 => x"c33f8008", +1335 => x"5785ad3f", +1336 => x"80088008", +1337 => x"7e297890", +1338 => x"2b7c902a", +1339 => x"07565659", +1340 => x"73752794", +1341 => x"388008ff", +1342 => x"05761555", +1343 => x"59757426", +1344 => x"87387474", +1345 => x"2684f338", +1346 => x"7b527375", +1347 => x"3151858c", +1348 => x"3f800855", +1349 => x"84f63f80", +1350 => x"0880087e", +1351 => x"297b83ff", +1352 => x"ff067790", +1353 => x"2b075659", +1354 => x"57737827", +1355 => x"96388008", +1356 => x"ff057615", +1357 => x"55577574", +1358 => x"26893877", +1359 => x"74267771", +1360 => x"31585a78", +1361 => x"902b7707", +1362 => x"7b41417f", +1363 => x"6156547d", +1364 => x"802efdc6", +1365 => x"38fe9b39", +1366 => x"75528151", +1367 => x"84ae3f80", +1368 => x"0856feb1", +1369 => x"399057fe", +1370 => x"800a7527", +1371 => x"fdd33898", +1372 => x"75712a80", +1373 => x"e0800570", +1374 => x"33a07331", +1375 => x"7131535d", +1376 => x"5e577680", +1377 => x"2efdcf38", +1378 => x"a0773175", +1379 => x"782b7772", +1380 => x"2a077779", +1381 => x"2b7b7a2b", +1382 => x"7d742a07", +1383 => x"7d7b2b73", +1384 => x"902a7483", +1385 => x"ffff0671", +1386 => x"597f772a", +1387 => x"585e5c41", +1388 => x"5f585c54", +1389 => x"83e63f80", +1390 => x"085483d0", +1391 => x"3f800880", +1392 => x"08792975", +1393 => x"902b7e90", +1394 => x"2a075656", +1395 => x"59737527", +1396 => x"99388008", +1397 => x"ff057b15", +1398 => x"55597a74", +1399 => x"268c3873", +1400 => x"75278738", +1401 => x"ff197b15", +1402 => x"55597652", +1403 => x"73753151", +1404 => x"83aa3f80", +1405 => x"08558394", +1406 => x"3f800880", +1407 => x"0879297d", +1408 => x"83ffff06", +1409 => x"77902b07", +1410 => x"56595773", +1411 => x"78279938", +1412 => x"8008ff05", +1413 => x"7b155557", +1414 => x"7a74268c", +1415 => x"38737827", +1416 => x"8738ff17", +1417 => x"7b155557", +1418 => x"73783179", +1419 => x"902b7807", +1420 => x"7083ffff", +1421 => x"0671902a", +1422 => x"7983ffff", +1423 => x"067a902a", +1424 => x"73722973", +1425 => x"73297473", +1426 => x"29767429", +1427 => x"73902a05", +1428 => x"72055755", +1429 => x"435f5b58", +1430 => x"5a57595a", +1431 => x"747c2786", +1432 => x"38848080", +1433 => x"17577490", +1434 => x"2a177983", +1435 => x"ffff0676", +1436 => x"84808029", +1437 => x"05575776", +1438 => x"7a269a38", +1439 => x"767a3270", +1440 => x"30707207", +1441 => x"8025565a", +1442 => x"5b7c7627", +1443 => x"fafe3873", +1444 => x"802efaf8", +1445 => x"38ff1858", +1446 => x"805bfaf2", +1447 => x"39ff7653", +1448 => x"77549f3d", +1449 => x"e805525e", +1450 => x"f7e13f67", +1451 => x"69574c75", +1452 => x"4d698025", +1453 => x"f8f3387d", +1454 => x"096a6c5c", +1455 => x"537a549f", +1456 => x"3de80552", +1457 => x"5ef7c43f", +1458 => x"6769714c", +1459 => x"704d5856", +1460 => x"f8db39a0", +1461 => x"75317676", +1462 => x"2b7a772b", +1463 => x"7c732a07", +1464 => x"7c782b72", +1465 => x"902a7383", +1466 => x"ffff0671", +1467 => x"587e762a", +1468 => x"5742405d", +1469 => x"5d575881", +1470 => x"a33f8008", +1471 => x"57818d3f", +1472 => x"80088008", +1473 => x"7e297890", +1474 => x"2b7d902a", +1475 => x"07565659", +1476 => x"73752799", +1477 => x"388008ff", +1478 => x"05761555", +1479 => x"59757426", +1480 => x"8c387375", +1481 => x"278738ff", +1482 => x"19761555", +1483 => x"597b5273", +1484 => x"75315180", +1485 => x"e73f8008", +1486 => x"5580d13f", +1487 => x"80088008", +1488 => x"7e297c83", +1489 => x"ffff0670", +1490 => x"78902b07", +1491 => x"51565858", +1492 => x"73772799", +1493 => x"388008ff", +1494 => x"05761555", +1495 => x"58757426", +1496 => x"8c387377", +1497 => x"278738ff", +1498 => x"18761555", +1499 => x"5878902b", +1500 => x"78077478", +1501 => x"31555bfa", +1502 => x"da39ff19", +1503 => x"76155559", +1504 => x"fb8639ff", +1505 => x"19761555", +1506 => x"59f8c039", +1507 => x"fe3d0d80", +1508 => x"53755274", +1509 => x"5181913f", +1510 => x"843d0d04", +1511 => x"fe3d0d81", +1512 => x"53755274", +1513 => x"5181813f", +1514 => x"843d0d04", +1515 => x"fb3d0d77", +1516 => x"79555580", +1517 => x"56757524", +1518 => x"ab388074", +1519 => x"249d3880", +1520 => x"53735274", +1521 => x"5180e13f", +1522 => x"80085475", +1523 => x"802e8538", +1524 => x"80083054", +1525 => x"73800c87", +1526 => x"3d0d0473", +1527 => x"30768132", +1528 => x"5754dc39", +1529 => x"74305581", +1530 => x"56738025", +1531 => x"d238ec39", +1532 => x"fa3d0d78", +1533 => x"7a575580", +1534 => x"57767524", +1535 => x"a438759f", +1536 => x"2c548153", +1537 => x"75743274", +1538 => x"31527451", +1539 => x"9b3f8008", +1540 => x"5476802e", +1541 => x"85388008", +1542 => x"30547380", +1543 => x"0c883d0d", +1544 => x"04743055", +1545 => x"8157d739", +1546 => x"fc3d0d76", +1547 => x"78535481", +1548 => x"53807473", +1549 => x"26525572", +1550 => x"802e9838", +1551 => x"70802eab", +1552 => x"38807224", +1553 => x"a6387110", +1554 => x"73107572", +1555 => x"26535452", +1556 => x"72ea3873", +1557 => x"51788338", +1558 => x"74517080", +1559 => x"0c863d0d", +1560 => x"04720a10", +1561 => x"0a720a10", +1562 => x"0a535372", +1563 => x"802ee438", +1564 => x"717426ed", +1565 => x"38737231", +1566 => x"75740774", +1567 => x"0a100a74", +1568 => x"0a100a55", +1569 => x"555654e3", +1570 => x"39ff3d0d", +1571 => x"735280ea", +1572 => x"fc085196", +1573 => x"3f833d0d", +1574 => x"04ff3d0d", +1575 => x"735280ea", +1576 => x"fc085190", +1577 => x"cc3f833d", +1578 => x"0d04f43d", +1579 => x"0d7e608b", +1580 => x"1170f806", +1581 => x"5b55555d", +1582 => x"72962683", +1583 => x"38905880", +1584 => x"78247479", +1585 => x"26075580", +1586 => x"5474742e", +1587 => x"09810680", +1588 => x"ca387c51", +1589 => x"8d9e3f77", +1590 => x"83f72680", +1591 => x"c5387783", +1592 => x"2a701010", +1593 => x"1080e2f4", +1594 => x"058c1108", +1595 => x"58585475", +1596 => x"772e81f0", +1597 => x"38841608", +1598 => x"fc068c17", +1599 => x"08881808", +1600 => x"718c120c", +1601 => x"88120c5b", +1602 => x"76058411", +1603 => x"08810784", +1604 => x"120c537c", +1605 => x"518cde3f", +1606 => x"88165473", +1607 => x"800c8e3d", +1608 => x"0d047789", +1609 => x"2a78832a", +1610 => x"58547380", +1611 => x"2ebf3877", +1612 => x"862ab805", +1613 => x"57847427", +1614 => x"b43880db", +1615 => x"14579474", +1616 => x"27ab3877", +1617 => x"8c2a80ee", +1618 => x"055780d4", +1619 => x"74279e38", +1620 => x"778f2a80", +1621 => x"f7055782", +1622 => x"d4742791", +1623 => x"3877922a", +1624 => x"80fc0557", +1625 => x"8ad47427", +1626 => x"843880fe", +1627 => x"57761010", +1628 => x"1080e2f4", +1629 => x"058c1108", +1630 => x"56537473", +1631 => x"2ea33884", +1632 => x"1508fc06", +1633 => x"70793155", +1634 => x"56738f24", +1635 => x"88e43873", +1636 => x"802588e6", +1637 => x"388c1508", +1638 => x"5574732e", +1639 => x"098106df", +1640 => x"38811759", +1641 => x"80e38408", +1642 => x"567580e2", +1643 => x"fc2e82cc", +1644 => x"38841608", +1645 => x"fc067079", +1646 => x"31555573", +1647 => x"8f24bb38", +1648 => x"80e2fc0b", +1649 => x"80e3880c", +1650 => x"80e2fc0b", +1651 => x"80e3840c", +1652 => x"80742480", +1653 => x"db387416", +1654 => x"84110881", +1655 => x"0784120c", +1656 => x"53feb039", +1657 => x"88168c11", +1658 => x"08575975", +1659 => x"792e0981", +1660 => x"06fe8238", +1661 => x"821459ff", +1662 => x"ab397716", +1663 => x"78810784", +1664 => x"180c7080", +1665 => x"e3880c70", +1666 => x"80e3840c", +1667 => x"80e2fc0b", +1668 => x"8c120c8c", +1669 => x"11088812", +1670 => x"0c748107", +1671 => x"84120c74", +1672 => x"0574710c", +1673 => x"5b7c518a", +1674 => x"cc3f8816", +1675 => x"54fdec39", +1676 => x"83ff7527", +1677 => x"83913874", +1678 => x"892a7583", +1679 => x"2a545473", +1680 => x"802ebf38", +1681 => x"74862ab8", +1682 => x"05538474", +1683 => x"27b43880", +1684 => x"db145394", +1685 => x"7427ab38", +1686 => x"748c2a80", +1687 => x"ee055380", +1688 => x"d474279e", +1689 => x"38748f2a", +1690 => x"80f70553", +1691 => x"82d47427", +1692 => x"91387492", +1693 => x"2a80fc05", +1694 => x"538ad474", +1695 => x"27843880", +1696 => x"fe537210", +1697 => x"101080e2", +1698 => x"f4058811", +1699 => x"08555773", +1700 => x"772e868b", +1701 => x"38841408", +1702 => x"fc065b74", +1703 => x"7b278d38", +1704 => x"88140854", +1705 => x"73772e09", +1706 => x"8106ea38", +1707 => x"8c140880", +1708 => x"e2f40b84", +1709 => x"0508718c", +1710 => x"190c7588", +1711 => x"190c7788", +1712 => x"130c5c57", +1713 => x"758c150c", +1714 => x"78538079", +1715 => x"24839838", +1716 => x"72822c81", +1717 => x"712b5656", +1718 => x"747b2680", +1719 => x"ca387a75", +1720 => x"06577682", +1721 => x"a33878fc", +1722 => x"06840559", +1723 => x"7410707c", +1724 => x"06555573", +1725 => x"82923884", +1726 => x"1959f139", +1727 => x"80e2f40b", +1728 => x"84050879", +1729 => x"545b7880", +1730 => x"25c63882", +1731 => x"da397409", +1732 => x"7b067080", +1733 => x"e2f40b84", +1734 => x"050c5b74", +1735 => x"1055747b", +1736 => x"26853874", +1737 => x"85bc3880", +1738 => x"e2f40b88", +1739 => x"05087084", +1740 => x"1208fc06", +1741 => x"707b317b", +1742 => x"72268f72", +1743 => x"25075d57", +1744 => x"5c5c5578", +1745 => x"802e80d9", +1746 => x"38791580", +1747 => x"e2ec0819", +1748 => x"90115954", +1749 => x"5680e2e8", +1750 => x"08ff2e88", +1751 => x"38a08f13", +1752 => x"e0800657", +1753 => x"76527c51", +1754 => x"888c3f80", +1755 => x"08548008", +1756 => x"ff2e9038", +1757 => x"80087627", +1758 => x"82a73874", +1759 => x"80e2f42e", +1760 => x"829f3880", +1761 => x"e2f40b88", +1762 => x"05085584", +1763 => x"1508fc06", +1764 => x"70793179", +1765 => x"72268f72", +1766 => x"25075d55", +1767 => x"5a7a83f2", +1768 => x"38778107", +1769 => x"84160c77", +1770 => x"157080e2", +1771 => x"f40b8805", +1772 => x"0c748107", +1773 => x"84120c56", +1774 => x"7c5187b9", +1775 => x"3f881554", +1776 => x"73800c8e", +1777 => x"3d0d0474", +1778 => x"832a7054", +1779 => x"54807424", +1780 => x"819b3872", +1781 => x"822c8171", +1782 => x"2b80e2f8", +1783 => x"08077080", +1784 => x"e2f40b84", +1785 => x"050c7510", +1786 => x"101080e2", +1787 => x"f4058811", +1788 => x"08718c1b", +1789 => x"0c70881b", +1790 => x"0c798813", +1791 => x"0c57555c", +1792 => x"55758c15", +1793 => x"0cfdc139", +1794 => x"78791010", +1795 => x"1080e2f4", +1796 => x"0570565b", +1797 => x"5c8c1408", +1798 => x"5675742e", +1799 => x"a3388416", +1800 => x"08fc0670", +1801 => x"79315853", +1802 => x"768f2483", +1803 => x"f1387680", +1804 => x"2584af38", +1805 => x"8c160856", +1806 => x"75742e09", +1807 => x"8106df38", +1808 => x"8814811a", +1809 => x"70830655", +1810 => x"5a5472c9", +1811 => x"387b8306", +1812 => x"5675802e", +1813 => x"fdb838ff", +1814 => x"1cf81b5b", +1815 => x"5c881a08", +1816 => x"7a2eea38", +1817 => x"fdb53983", +1818 => x"1953fce4", +1819 => x"39831470", +1820 => x"822c8171", +1821 => x"2b80e2f8", +1822 => x"08077080", +1823 => x"e2f40b84", +1824 => x"050c7610", +1825 => x"101080e2", +1826 => x"f4058811", +1827 => x"08718c1c", +1828 => x"0c70881c", +1829 => x"0c7a8813", +1830 => x"0c58535d", +1831 => x"5653fee1", +1832 => x"3980e2b8", +1833 => x"08175980", +1834 => x"08762e81", +1835 => x"8b3880e2", +1836 => x"e808ff2e", +1837 => x"848e3873", +1838 => x"76311980", +1839 => x"e2b80c73", +1840 => x"87067056", +1841 => x"5372802e", +1842 => x"88388873", +1843 => x"31701555", +1844 => x"5576149f", +1845 => x"ff06a080", +1846 => x"71311670", +1847 => x"547e5351", +1848 => x"5385933f", +1849 => x"80085680", +1850 => x"08ff2e81", +1851 => x"9e3880e2", +1852 => x"b8081370", +1853 => x"80e2b80c", +1854 => x"747580e2", +1855 => x"f40b8805", +1856 => x"0c777631", +1857 => x"15810755", +1858 => x"56597a80", +1859 => x"e2f42e83", +1860 => x"c038798f", +1861 => x"2682ef38", +1862 => x"810b8415", +1863 => x"0c841508", +1864 => x"fc067079", +1865 => x"31797226", +1866 => x"8f722507", +1867 => x"5d555a7a", +1868 => x"802efced", +1869 => x"3880db39", +1870 => x"80089fff", +1871 => x"065574fe", +1872 => x"ed387880", +1873 => x"e2b80c80", +1874 => x"e2f40b88", +1875 => x"05087a18", +1876 => x"81078412", +1877 => x"0c5580e2", +1878 => x"e4087927", +1879 => x"86387880", +1880 => x"e2e40c80", +1881 => x"e2e00879", +1882 => x"27fca038", +1883 => x"7880e2e0", +1884 => x"0c841508", +1885 => x"fc067079", +1886 => x"31797226", +1887 => x"8f722507", +1888 => x"5d555a7a", +1889 => x"802efc99", +1890 => x"38883980", +1891 => x"745753fe", +1892 => x"dd397c51", +1893 => x"83df3f80", +1894 => x"0b800c8e", +1895 => x"3d0d0480", +1896 => x"7324a538", +1897 => x"72822c81", +1898 => x"712b80e2", +1899 => x"f8080770", +1900 => x"80e2f40b", +1901 => x"84050c5c", +1902 => x"5a768c17", +1903 => x"0c738817", +1904 => x"0c758818", +1905 => x"0cf9fd39", +1906 => x"83137082", +1907 => x"2c81712b", +1908 => x"80e2f808", +1909 => x"077080e2", +1910 => x"f40b8405", +1911 => x"0c5d5b53", +1912 => x"d8397a75", +1913 => x"065c7bfc", +1914 => x"9f388419", +1915 => x"75105659", +1916 => x"f139ff17", +1917 => x"810559f7", +1918 => x"ab398c15", +1919 => x"08881608", +1920 => x"718c120c", +1921 => x"88120c59", +1922 => x"75158411", +1923 => x"08810784", +1924 => x"120c587c", +1925 => x"5182de3f", +1926 => x"881554fb", +1927 => x"a3397716", +1928 => x"78810784", +1929 => x"180c8c17", +1930 => x"08881808", +1931 => x"718c120c", +1932 => x"88120c5c", +1933 => x"7080e388", +1934 => x"0c7080e3", +1935 => x"840c80e2", +1936 => x"fc0b8c12", +1937 => x"0c8c1108", +1938 => x"88120c77", +1939 => x"81078412", +1940 => x"0c770577", +1941 => x"710c557c", +1942 => x"51829a3f", +1943 => x"881654f5", +1944 => x"ba397216", +1945 => x"84110881", +1946 => x"0784120c", +1947 => x"588c1608", +1948 => x"88170871", +1949 => x"8c120c88", +1950 => x"120c577c", +1951 => x"5181f63f", +1952 => x"881654f5", +1953 => x"96397284", +1954 => x"150cf41a", +1955 => x"f8067084", +1956 => x"1d088106", +1957 => x"07841d0c", +1958 => x"701c5556", +1959 => x"850b8415", +1960 => x"0c850b88", +1961 => x"150c8f76", +1962 => x"27fdab38", +1963 => x"881b527c", +1964 => x"5184be3f", +1965 => x"80e2f40b", +1966 => x"88050880", +1967 => x"e2b8085a", +1968 => x"55fd9339", +1969 => x"7880e2b8", +1970 => x"0c7380e2", +1971 => x"e80cfbef", +1972 => x"39728415", +1973 => x"0cfcff39", +1974 => x"fb3d0d77", +1975 => x"707a7c58", +1976 => x"5553568f", +1977 => x"752780e6", +1978 => x"38727607", +1979 => x"83065170", +1980 => x"80dc3875", +1981 => x"73525470", +1982 => x"70840552", +1983 => x"08747084", +1984 => x"05560c73", +1985 => x"71708405", +1986 => x"53087170", +1987 => x"8405530c", +1988 => x"71708405", +1989 => x"53087170", +1990 => x"8405530c", +1991 => x"71708405", +1992 => x"53087170", +1993 => x"8405530c", +1994 => x"f0165654", +1995 => x"748f26c7", +1996 => x"38837527", +1997 => x"95387070", +1998 => x"84055208", +1999 => x"74708405", +2000 => x"560cfc15", +2001 => x"55748326", +2002 => x"ed387371", +2003 => x"5452ff15", +2004 => x"5170ff2e", +2005 => x"98387270", +2006 => x"81055433", +2007 => x"72708105", +2008 => x"5434ff11", +2009 => x"5170ff2e", +2010 => x"098106ea", +2011 => x"3875800c", +2012 => x"873d0d04", +2013 => x"0404fd3d", +2014 => x"0d800b81", +2015 => x"c2d40c76", +2016 => x"5187ca3f", +2017 => x"80085380", +2018 => x"08ff2e88", +2019 => x"3872800c", +2020 => x"853d0d04", +2021 => x"81c2d408", +2022 => x"5473802e", +2023 => x"f0387574", +2024 => x"710c5272", +2025 => x"800c853d", +2026 => x"0d04fb3d", +2027 => x"0d777970", +2028 => x"72078306", +2029 => x"53545270", +2030 => x"93387173", +2031 => x"73085456", +2032 => x"54717308", +2033 => x"2e80c438", +2034 => x"73755452", +2035 => x"71337081", +2036 => x"ff065254", +2037 => x"70802e9d", +2038 => x"38723355", +2039 => x"70752e09", +2040 => x"81069538", +2041 => x"81128114", +2042 => x"71337081", +2043 => x"ff065456", +2044 => x"545270e5", +2045 => x"38723355", +2046 => x"7381ff06", +2047 => x"7581ff06", +2048 => x"71713180", +2049 => x"0c555287", +2050 => x"3d0d0471", +2051 => x"09f7fbfd", +2052 => x"ff1306f8", +2053 => x"84828180", +2054 => x"06527197", +2055 => x"38841484", +2056 => x"16710854", +2057 => x"56547175", +2058 => x"082ee038", +2059 => x"73755452", +2060 => x"ff9a3980", +2061 => x"0b800c87", +2062 => x"3d0d04fb", +2063 => x"3d0d7770", +2064 => x"5256feb0", +2065 => x"3f80e2f4", +2066 => x"0b880508", +2067 => x"841108fc", +2068 => x"06707b31", +2069 => x"9fef05e0", +2070 => x"8006e080", +2071 => x"05525555", +2072 => x"a0807524", +2073 => x"94388052", +2074 => x"7551fe8a", +2075 => x"3f80e2fc", +2076 => x"08145372", +2077 => x"80082e8f", +2078 => x"387551fd", +2079 => x"f83f8053", +2080 => x"72800c87", +2081 => x"3d0d0474", +2082 => x"30527551", +2083 => x"fde83f80", +2084 => x"08ff2ea8", +2085 => x"3880e2f4", +2086 => x"0b880508", +2087 => x"74763181", +2088 => x"0784120c", +2089 => x"5380e2b8", +2090 => x"08753180", +2091 => x"e2b80c75", +2092 => x"51fdc23f", +2093 => x"810b800c", +2094 => x"873d0d04", +2095 => x"80527551", +2096 => x"fdb43f80", +2097 => x"e2f40b88", +2098 => x"05088008", +2099 => x"71315454", +2100 => x"8f7325ff", +2101 => x"a4388008", +2102 => x"80e2e808", +2103 => x"3180e2b8", +2104 => x"0c728107", +2105 => x"84150c75", +2106 => x"51fd8a3f", +2107 => x"8053ff90", +2108 => x"39f73d0d", +2109 => x"7b7d545a", +2110 => x"72802e82", +2111 => x"83387951", +2112 => x"fcf23ff8", +2113 => x"13841108", +2114 => x"70fe0670", +2115 => x"13841108", +2116 => x"fc065c57", +2117 => x"58545780", +2118 => x"e2fc0874", +2119 => x"2e82de38", +2120 => x"7784150c", +2121 => x"80738106", +2122 => x"56597479", +2123 => x"2e81d538", +2124 => x"77148411", +2125 => x"08810656", +2126 => x"5374a038", +2127 => x"77165678", +2128 => x"81e63888", +2129 => x"14085574", +2130 => x"80e2fc2e", +2131 => x"82f9388c", +2132 => x"1408708c", +2133 => x"170c7588", +2134 => x"120c5875", +2135 => x"81078418", +2136 => x"0c751776", +2137 => x"710c5478", +2138 => x"81913883", +2139 => x"ff762781", +2140 => x"c8387589", +2141 => x"2a76832a", +2142 => x"54547380", +2143 => x"2ebf3875", +2144 => x"862ab805", +2145 => x"53847427", +2146 => x"b43880db", +2147 => x"14539474", +2148 => x"27ab3875", +2149 => x"8c2a80ee", +2150 => x"055380d4", +2151 => x"74279e38", +2152 => x"758f2a80", +2153 => x"f7055382", +2154 => x"d4742791", +2155 => x"3875922a", +2156 => x"80fc0553", +2157 => x"8ad47427", +2158 => x"843880fe", +2159 => x"53721010", +2160 => x"1080e2f4", +2161 => x"05881108", +2162 => x"55557375", +2163 => x"2e82bf38", +2164 => x"841408fc", +2165 => x"06597579", +2166 => x"278d3888", +2167 => x"14085473", +2168 => x"752e0981", +2169 => x"06ea388c", +2170 => x"1408708c", +2171 => x"190c7488", +2172 => x"190c7788", +2173 => x"120c5576", +2174 => x"8c150c79", +2175 => x"51faf63f", +2176 => x"8b3d0d04", +2177 => x"76087771", +2178 => x"31587605", +2179 => x"88180856", +2180 => x"567480e2", +2181 => x"fc2e80e0", +2182 => x"388c1708", +2183 => x"708c170c", +2184 => x"7588120c", +2185 => x"53fe8939", +2186 => x"8814088c", +2187 => x"1508708c", +2188 => x"130c5988", +2189 => x"190cfea3", +2190 => x"3975832a", +2191 => x"70545480", +2192 => x"74248198", +2193 => x"3872822c", +2194 => x"81712b80", +2195 => x"e2f80807", +2196 => x"80e2f40b", +2197 => x"84050c74", +2198 => x"10101080", +2199 => x"e2f40588", +2200 => x"1108718c", +2201 => x"1b0c7088", +2202 => x"1b0c7988", +2203 => x"130c565a", +2204 => x"55768c15", +2205 => x"0cff8439", +2206 => x"8159fdb4", +2207 => x"39771673", +2208 => x"81065455", +2209 => x"72983876", +2210 => x"08777131", +2211 => x"5875058c", +2212 => x"18088819", +2213 => x"08718c12", +2214 => x"0c88120c", +2215 => x"55557481", +2216 => x"0784180c", +2217 => x"7680e2f4", +2218 => x"0b88050c", +2219 => x"80e2f008", +2220 => x"7526fec7", +2221 => x"3880e2ec", +2222 => x"08527951", +2223 => x"fafd3f79", +2224 => x"51f9b23f", +2225 => x"feba3981", +2226 => x"778c170c", +2227 => x"7788170c", +2228 => x"758c190c", +2229 => x"7588190c", +2230 => x"59fd8039", +2231 => x"83147082", +2232 => x"2c81712b", +2233 => x"80e2f808", +2234 => x"0780e2f4", +2235 => x"0b84050c", +2236 => x"75101010", +2237 => x"80e2f405", +2238 => x"88110871", +2239 => x"8c1c0c70", +2240 => x"881c0c7a", +2241 => x"88130c57", +2242 => x"5b5653fe", +2243 => x"e4398073", +2244 => x"24a33872", +2245 => x"822c8171", +2246 => x"2b80e2f8", +2247 => x"080780e2", +2248 => x"f40b8405", +2249 => x"0c58748c", +2250 => x"180c7388", +2251 => x"180c7688", +2252 => x"160cfdc3", +2253 => x"39831370", +2254 => x"822c8171", +2255 => x"2b80e2f8", +2256 => x"080780e2", +2257 => x"f40b8405", +2258 => x"0c5953da", +2259 => x"39fe3d0d", +2260 => x"81c2d808", +2261 => x"51708a38", +2262 => x"81c2e070", +2263 => x"81c2d80c", +2264 => x"51741152", +2265 => x"ff537187", +2266 => x"fb808026", +2267 => x"88387181", +2268 => x"c2d80c70", +2269 => x"5372800c", +2270 => x"843d0d04", +2271 => x"fd3d0d80", +2272 => x"0b80e2a4", +2273 => x"08545472", +2274 => x"812e9b38", +2275 => x"7381c2dc", +2276 => x"0cc28e3f", +2277 => x"c0ea3f80", +2278 => x"f1fc5281", +2279 => x"51caf83f", +2280 => x"80085189", +2281 => x"a73f7281", +2282 => x"c2dc0cc1", +2283 => x"f43fc0d0", +2284 => x"3f80f1fc", +2285 => x"528151ca", +2286 => x"de3f8008", +2287 => x"51898d3f", +2288 => x"00ff3900", +2289 => x"ff39f53d", +2290 => x"0d7e6081", +2291 => x"c2dc0870", +2292 => x"5b585b5b", +2293 => x"7580c238", +2294 => x"777a25a1", +2295 => x"38771b70", +2296 => x"337081ff", +2297 => x"06585859", +2298 => x"758a2e98", +2299 => x"387681ff", +2300 => x"0651c18c", +2301 => x"3f811858", +2302 => x"797824e1", +2303 => x"3879800c", +2304 => x"8d3d0d04", +2305 => x"8d51c0f8", +2306 => x"3f783370", +2307 => x"81ff0652", +2308 => x"57c0ed3f", +2309 => x"811858e0", +2310 => x"3979557a", +2311 => x"547d5385", +2312 => x"528d3dfc", +2313 => x"0551c09a", +2314 => x"3f800856", +2315 => x"88973f7b", +2316 => x"80080c75", +2317 => x"800c8d3d", +2318 => x"0d04f63d", +2319 => x"0d7d7f81", +2320 => x"c2dc0870", +2321 => x"5a585a5a", +2322 => x"7580c338", +2323 => x"767925b1", +2324 => x"38761a58", +2325 => x"c08a3f80", +2326 => x"08783480", +2327 => x"0b800881", +2328 => x"ff065758", +2329 => x"758a2ea2", +2330 => x"38758d32", +2331 => x"70307080", +2332 => x"257a0751", +2333 => x"515675b8", +2334 => x"38811757", +2335 => x"787724d1", +2336 => x"38765675", +2337 => x"800c8c3d", +2338 => x"0d048158", +2339 => x"dc397855", +2340 => x"79547c53", +2341 => x"84528c3d", +2342 => x"fc0551ff", +2343 => x"bfa43f80", +2344 => x"085687a1", +2345 => x"3f7a8008", +2346 => x"0c75800c", +2347 => x"8c3d0d04", +2348 => x"811756cf", +2349 => x"39f93d0d", +2350 => x"795781c2", +2351 => x"dc08802e", +2352 => x"ad387651", +2353 => x"89b43f7b", +2354 => x"567a5580", +2355 => x"08810554", +2356 => x"76538252", +2357 => x"893dfc05", +2358 => x"51ffbee6", +2359 => x"3f800857", +2360 => x"86e33f77", +2361 => x"80080c76", +2362 => x"800c893d", +2363 => x"0d0486d5", +2364 => x"3f850b80", +2365 => x"080cff0b", +2366 => x"800c893d", +2367 => x"0d04fb3d", +2368 => x"0d81c2dc", +2369 => x"08705654", +2370 => x"73883874", +2371 => x"800c873d", +2372 => x"0d047753", +2373 => x"8352873d", +2374 => x"fc0551ff", +2375 => x"bea43f80", +2376 => x"085486a1", +2377 => x"3f758008", +2378 => x"0c73800c", +2379 => x"873d0d04", +2380 => x"ff0b800c", +2381 => x"04fb3d0d", +2382 => x"775581c2", +2383 => x"dc08802e", +2384 => x"a9387451", +2385 => x"88b43f80", +2386 => x"08810554", +2387 => x"74538752", +2388 => x"873dfc05", +2389 => x"51ffbdea", +2390 => x"3f800855", +2391 => x"85e73f75", +2392 => x"80080c74", +2393 => x"800c873d", +2394 => x"0d0485d9", +2395 => x"3f850b80", +2396 => x"080cff0b", +2397 => x"800c873d", +2398 => x"0d04fa3d", +2399 => x"0d81c2dc", +2400 => x"08802ea3", +2401 => x"387a5579", +2402 => x"54785386", +2403 => x"52883dfc", +2404 => x"0551ffbd", +2405 => x"ad3f8008", +2406 => x"5685aa3f", +2407 => x"7680080c", +2408 => x"75800c88", +2409 => x"3d0d0485", +2410 => x"9c3f9d0b", +2411 => x"80080cff", +2412 => x"0b800c88", +2413 => x"3d0d04f7", +2414 => x"3d0d7b7d", +2415 => x"5b59bc53", +2416 => x"80527951", +2417 => x"86aa3f80", +2418 => x"70565798", +2419 => x"56741970", +2420 => x"3370782b", +2421 => x"79078118", +2422 => x"f81a5a58", +2423 => x"59555884", +2424 => x"7524ea38", +2425 => x"767a2384", +2426 => x"19588070", +2427 => x"56579856", +2428 => x"74187033", +2429 => x"70782b79", +2430 => x"078118f8", +2431 => x"1a5a5859", +2432 => x"51548475", +2433 => x"24ea3876", +2434 => x"821b2388", +2435 => x"19588070", +2436 => x"56579856", +2437 => x"74187033", +2438 => x"70782b79", +2439 => x"078118f8", +2440 => x"1a5a5859", +2441 => x"51548475", +2442 => x"24ea3876", +2443 => x"841b0c8c", +2444 => x"19588070", +2445 => x"56579856", +2446 => x"74187033", +2447 => x"70782b79", +2448 => x"078118f8", +2449 => x"1a5a5859", +2450 => x"51548475", +2451 => x"24ea3876", +2452 => x"881b2390", +2453 => x"19588070", +2454 => x"56579856", +2455 => x"74187033", +2456 => x"70782b79", +2457 => x"078118f8", +2458 => x"1a5a5859", +2459 => x"51548475", +2460 => x"24ea3876", +2461 => x"8a1b2394", +2462 => x"19588070", +2463 => x"56579856", +2464 => x"74187033", +2465 => x"70782b79", +2466 => x"078118f8", +2467 => x"1a5a5859", +2468 => x"51548475", +2469 => x"24ea3876", +2470 => x"8c1b2398", +2471 => x"19588070", +2472 => x"56579856", +2473 => x"74187033", +2474 => x"70782b79", +2475 => x"078118f8", +2476 => x"1a5a5859", +2477 => x"51548475", +2478 => x"24ea3876", +2479 => x"8e1b239c", +2480 => x"19588070", +2481 => x"5657b856", +2482 => x"74187033", +2483 => x"70782b79", +2484 => x"078118f8", +2485 => x"1a5a5859", +2486 => x"5a548875", +2487 => x"24ea3876", +2488 => x"901b0c8b", +2489 => x"3d0d04e9", +2490 => x"3d0d6a81", +2491 => x"c2dc0857", +2492 => x"57759338", +2493 => x"80c0800b", +2494 => x"84180c75", +2495 => x"ac180c75", +2496 => x"800c993d", +2497 => x"0d04893d", +2498 => x"70556a54", +2499 => x"558a5299", +2500 => x"3dffbc05", +2501 => x"51ffbaaa", +2502 => x"3f800877", +2503 => x"53755256", +2504 => x"fd953f82", +2505 => x"a03f7780", +2506 => x"080c7580", +2507 => x"0c993d0d", +2508 => x"04e93d0d", +2509 => x"695781c2", +2510 => x"dc08802e", +2511 => x"b6387651", +2512 => x"84b83f89", +2513 => x"3d705680", +2514 => x"08810555", +2515 => x"7754568f", +2516 => x"52993dff", +2517 => x"bc0551ff", +2518 => x"b9e83f80", +2519 => x"086b5376", +2520 => x"5257fcd3", +2521 => x"3f81de3f", +2522 => x"7780080c", +2523 => x"76800c99", +2524 => x"3d0d0481", +2525 => x"d03f850b", +2526 => x"80080cff", +2527 => x"0b800c99", +2528 => x"3d0d04fc", +2529 => x"3d0d8154", +2530 => x"81c2dc08", +2531 => x"88387380", +2532 => x"0c863d0d", +2533 => x"04765397", +2534 => x"b952863d", +2535 => x"fc0551ff", +2536 => x"b9a03f80", +2537 => x"0854819d", +2538 => x"3f748008", +2539 => x"0c73800c", +2540 => x"863d0d04", +2541 => x"f43d0d7e", +2542 => x"80f2a808", +2543 => x"700881ff", +2544 => x"06913df8", +2545 => x"05545159", +2546 => x"59ffbac5", +2547 => x"3f775780", +2548 => x"5476557b", +2549 => x"7d585276", +2550 => x"538e3df0", +2551 => x"0551d6a0", +2552 => x"3f797b58", +2553 => x"790c7684", +2554 => x"1a0c7880", +2555 => x"0c8e3d0d", +2556 => x"04f43d0d", +2557 => x"7e80f2a8", +2558 => x"08700870", +2559 => x"81ff0692", +2560 => x"3df80555", +2561 => x"515a5759", +2562 => x"ffba863f", +2563 => x"7757800b", +2564 => x"8b3d5954", +2565 => x"76557b7d", +2566 => x"58527653", +2567 => x"7751d5e0", +2568 => x"3f8056bd", +2569 => x"84c07655", +2570 => x"55797b58", +2571 => x"52765377", +2572 => x"51d5cd3f", +2573 => x"7a577880", +2574 => x"2e843876", +2575 => x"790c7680", +2576 => x"0c8e3d0d", +2577 => x"0480eafc", +2578 => x"08800c04", +2579 => x"f73d0d7b", +2580 => x"80eafc08", +2581 => x"82c81108", +2582 => x"5a545a77", +2583 => x"802e80da", +2584 => x"38818818", +2585 => x"841908ff", +2586 => x"0581712b", +2587 => x"59555980", +2588 => x"742480ea", +2589 => x"38807424", +2590 => x"b5387382", +2591 => x"2b781188", +2592 => x"05565681", +2593 => x"80190877", +2594 => x"06537280", +2595 => x"2eb63878", +2596 => x"16700853", +2597 => x"53795174", +2598 => x"0853722d", +2599 => x"ff14fc17", +2600 => x"fc177981", +2601 => x"2c5a5757", +2602 => x"54738025", +2603 => x"d6387708", +2604 => x"5877ffad", +2605 => x"3880eafc", +2606 => x"0853bc13", +2607 => x"08a53879", +2608 => x"51f5fd3f", +2609 => x"74085372", +2610 => x"2dff14fc", +2611 => x"17fc1779", +2612 => x"812c5a57", +2613 => x"57547380", +2614 => x"25ffa838", +2615 => x"d1398057", +2616 => x"ff933972", +2617 => x"51bc1308", +2618 => x"54732d79", +2619 => x"51f5d13f", +2620 => x"fb3d0d77", +2621 => x"7a71028c", +2622 => x"05a30533", +2623 => x"58545456", +2624 => x"83732780", +2625 => x"d4387583", +2626 => x"06517080", +2627 => x"cc387488", +2628 => x"2b750770", +2629 => x"71902b07", +2630 => x"55518f73", +2631 => x"27a73873", +2632 => x"72708405", +2633 => x"540c7174", +2634 => x"71708405", +2635 => x"530c7471", +2636 => x"70840553", +2637 => x"0c747170", +2638 => x"8405530c", +2639 => x"f0145452", +2640 => x"728f26db", +2641 => x"38837327", +2642 => x"90387372", +2643 => x"70840554", +2644 => x"0cfc1353", +2645 => x"728326f2", +2646 => x"38ff1351", +2647 => x"70ff2e93", +2648 => x"38747270", +2649 => x"81055434", +2650 => x"ff115170", +2651 => x"ff2e0981", +2652 => x"06ef3875", +2653 => x"800c873d", +2654 => x"0d04fd3d", +2655 => x"0d757071", +2656 => x"83065355", +2657 => x"5270b438", +2658 => x"71700870", +2659 => x"09f7fbfd", +2660 => x"ff1206f8", +2661 => x"84828180", +2662 => x"06545253", +2663 => x"719b3884", +2664 => x"13700870", +2665 => x"09f7fbfd", +2666 => x"ff1206f8", +2667 => x"84828180", +2668 => x"06545253", +2669 => x"71802ee7", +2670 => x"38725271", +2671 => x"33537280", +2672 => x"2e8a3881", +2673 => x"12703354", +2674 => x"5272f838", +2675 => x"71743180", +2676 => x"0c853d0d", +2677 => x"04ff3d0d", +2678 => x"80f2840b", +2679 => x"fc057008", +2680 => x"525270ff", +2681 => x"2e913870", +2682 => x"2dfc1270", +2683 => x"08525270", +2684 => x"ff2e0981", +2685 => x"06f13883", +2686 => x"3d0d0404", +2687 => x"ffb7a63f", +2688 => x"04000000", +2689 => x"30313233", +2690 => x"34353637", +2691 => x"38390000", +2692 => x"44485259", +2693 => x"53544f4e", +2694 => x"45205052", +2695 => x"4f475241", +2696 => x"4d2c2053", +2697 => x"4f4d4520", +2698 => x"53545249", +2699 => x"4e470000", +2700 => x"44485259", +2701 => x"53544f4e", +2702 => x"45205052", +2703 => x"4f475241", +2704 => x"4d2c2031", +2705 => x"27535420", +2706 => x"53545249", +2707 => x"4e470000", +2708 => x"44687279", +2709 => x"73746f6e", +2710 => x"65204265", +2711 => x"6e63686d", +2712 => x"61726b2c", +2713 => x"20566572", +2714 => x"73696f6e", +2715 => x"20322e31", +2716 => x"20284c61", +2717 => x"6e677561", +2718 => x"67653a20", +2719 => x"43290a00", +2720 => x"50726f67", +2721 => x"72616d20", +2722 => x"636f6d70", +2723 => x"696c6564", +2724 => x"20776974", +2725 => x"68202772", +2726 => x"65676973", +2727 => x"74657227", +2728 => x"20617474", +2729 => x"72696275", +2730 => x"74650a00", +2731 => x"45786563", +2732 => x"7574696f", +2733 => x"6e207374", +2734 => x"61727473", +2735 => x"2c202564", +2736 => x"2072756e", +2737 => x"73207468", +2738 => x"726f7567", +2739 => x"68204468", +2740 => x"72797374", +2741 => x"6f6e650a", +2742 => x"00000000", +2743 => x"44485259", +2744 => x"53544f4e", +2745 => x"45205052", +2746 => x"4f475241", +2747 => x"4d2c2032", +2748 => x"274e4420", +2749 => x"53545249", +2750 => x"4e470000", +2751 => x"45786563", +2752 => x"7574696f", +2753 => x"6e20656e", +2754 => x"64730a00", +2755 => x"46696e61", +2756 => x"6c207661", +2757 => x"6c756573", +2758 => x"206f6620", +2759 => x"74686520", +2760 => x"76617269", +2761 => x"61626c65", +2762 => x"73207573", +2763 => x"65642069", +2764 => x"6e207468", +2765 => x"65206265", +2766 => x"6e63686d", +2767 => x"61726b3a", +2768 => x"0a000000", +2769 => x"496e745f", +2770 => x"476c6f62", +2771 => x"3a202020", +2772 => x"20202020", +2773 => x"20202020", +2774 => x"2025640a", +2775 => x"00000000", +2776 => x"20202020", +2777 => x"20202020", +2778 => x"73686f75", +2779 => x"6c642062", +2780 => x"653a2020", +2781 => x"2025640a", +2782 => x"00000000", +2783 => x"426f6f6c", +2784 => x"5f476c6f", +2785 => x"623a2020", +2786 => x"20202020", +2787 => x"20202020", +2788 => x"2025640a", +2789 => x"00000000", +2790 => x"43685f31", +2791 => x"5f476c6f", +2792 => x"623a2020", +2793 => x"20202020", +2794 => x"20202020", +2795 => x"2025630a", +2796 => x"00000000", +2797 => x"20202020", +2798 => x"20202020", +2799 => x"73686f75", +2800 => x"6c642062", +2801 => x"653a2020", +2802 => x"2025630a", +2803 => x"00000000", +2804 => x"43685f32", +2805 => x"5f476c6f", +2806 => x"623a2020", +2807 => x"20202020", +2808 => x"20202020", +2809 => x"2025630a", +2810 => x"00000000", +2811 => x"4172725f", +2812 => x"315f476c", +2813 => x"6f625b38", +2814 => x"5d3a2020", +2815 => x"20202020", +2816 => x"2025640a", +2817 => x"00000000", +2818 => x"4172725f", +2819 => x"325f476c", +2820 => x"6f625b38", +2821 => x"5d5b375d", +2822 => x"3a202020", +2823 => x"2025640a", +2824 => x"00000000", +2825 => x"20202020", +2826 => x"20202020", +2827 => x"73686f75", +2828 => x"6c642062", +2829 => x"653a2020", +2830 => x"204e756d", +2831 => x"6265725f", +2832 => x"4f665f52", +2833 => x"756e7320", +2834 => x"2b203130", +2835 => x"0a000000", +2836 => x"5074725f", +2837 => x"476c6f62", +2838 => x"2d3e0a00", +2839 => x"20205074", +2840 => x"725f436f", +2841 => x"6d703a20", +2842 => x"20202020", +2843 => x"20202020", +2844 => x"2025640a", +2845 => x"00000000", +2846 => x"20202020", +2847 => x"20202020", +2848 => x"73686f75", +2849 => x"6c642062", +2850 => x"653a2020", +2851 => x"2028696d", +2852 => x"706c656d", +2853 => x"656e7461", +2854 => x"74696f6e", +2855 => x"2d646570", +2856 => x"656e6465", +2857 => x"6e74290a", +2858 => x"00000000", +2859 => x"20204469", +2860 => x"7363723a", +2861 => x"20202020", +2862 => x"20202020", +2863 => x"20202020", +2864 => x"2025640a", +2865 => x"00000000", +2866 => x"2020456e", +2867 => x"756d5f43", +2868 => x"6f6d703a", +2869 => x"20202020", +2870 => x"20202020", +2871 => x"2025640a", +2872 => x"00000000", +2873 => x"2020496e", +2874 => x"745f436f", +2875 => x"6d703a20", +2876 => x"20202020", +2877 => x"20202020", +2878 => x"2025640a", +2879 => x"00000000", +2880 => x"20205374", +2881 => x"725f436f", +2882 => x"6d703a20", +2883 => x"20202020", +2884 => x"20202020", +2885 => x"2025730a", +2886 => x"00000000", +2887 => x"20202020", +2888 => x"20202020", +2889 => x"73686f75", +2890 => x"6c642062", +2891 => x"653a2020", +2892 => x"20444852", +2893 => x"5953544f", +2894 => x"4e452050", +2895 => x"524f4752", +2896 => x"414d2c20", +2897 => x"534f4d45", +2898 => x"20535452", +2899 => x"494e470a", +2900 => x"00000000", +2901 => x"4e657874", +2902 => x"5f507472", +2903 => x"5f476c6f", +2904 => x"622d3e0a", +2905 => x"00000000", +2906 => x"20202020", +2907 => x"20202020", +2908 => x"73686f75", +2909 => x"6c642062", +2910 => x"653a2020", +2911 => x"2028696d", +2912 => x"706c656d", +2913 => x"656e7461", +2914 => x"74696f6e", +2915 => x"2d646570", +2916 => x"656e6465", +2917 => x"6e74292c", +2918 => x"2073616d", +2919 => x"65206173", +2920 => x"2061626f", +2921 => x"76650a00", +2922 => x"496e745f", +2923 => x"315f4c6f", +2924 => x"633a2020", +2925 => x"20202020", +2926 => x"20202020", +2927 => x"2025640a", +2928 => x"00000000", +2929 => x"496e745f", +2930 => x"325f4c6f", +2931 => x"633a2020", +2932 => x"20202020", +2933 => x"20202020", +2934 => x"2025640a", +2935 => x"00000000", +2936 => x"496e745f", +2937 => x"335f4c6f", +2938 => x"633a2020", +2939 => x"20202020", +2940 => x"20202020", +2941 => x"2025640a", +2942 => x"00000000", +2943 => x"456e756d", +2944 => x"5f4c6f63", +2945 => x"3a202020", +2946 => x"20202020", +2947 => x"20202020", +2948 => x"2025640a", +2949 => x"00000000", +2950 => x"5374725f", +2951 => x"315f4c6f", +2952 => x"633a2020", +2953 => x"20202020", +2954 => x"20202020", +2955 => x"2025730a", +2956 => x"00000000", +2957 => x"20202020", +2958 => x"20202020", +2959 => x"73686f75", +2960 => x"6c642062", +2961 => x"653a2020", +2962 => x"20444852", +2963 => x"5953544f", +2964 => x"4e452050", +2965 => x"524f4752", +2966 => x"414d2c20", +2967 => x"31275354", +2968 => x"20535452", +2969 => x"494e470a", +2970 => x"00000000", +2971 => x"5374725f", +2972 => x"325f4c6f", +2973 => x"633a2020", +2974 => x"20202020", +2975 => x"20202020", +2976 => x"2025730a", +2977 => x"00000000", +2978 => x"20202020", +2979 => x"20202020", +2980 => x"73686f75", +2981 => x"6c642062", +2982 => x"653a2020", +2983 => x"20444852", +2984 => x"5953544f", +2985 => x"4e452050", +2986 => x"524f4752", +2987 => x"414d2c20", +2988 => x"32274e44", +2989 => x"20535452", +2990 => x"494e470a", +2991 => x"00000000", +2992 => x"55736572", +2993 => x"2074696d", +2994 => x"653a2025", +2995 => x"640a0000", +2996 => x"4d696372", +2997 => x"6f736563", +2998 => x"6f6e6473", +2999 => x"20666f72", +3000 => x"206f6e65", +3001 => x"2072756e", +3002 => x"20746872", +3003 => x"6f756768", +3004 => x"20446872", +3005 => x"7973746f", +3006 => x"6e653a20", +3007 => x"00000000", +3008 => x"2564200a", +3009 => x"00000000", +3010 => x"44687279", +3011 => x"73746f6e", +3012 => x"65732070", +3013 => x"65722053", +3014 => x"65636f6e", +3015 => x"643a2020", +3016 => x"20202020", +3017 => x"20202020", +3018 => x"20202020", +3019 => x"20202020", +3020 => x"20202020", +3021 => x"00000000", +3022 => x"56415820", +3023 => x"4d495053", +3024 => x"20726174", +3025 => x"696e6720", +3026 => x"2a203130", +3027 => x"3030203d", +3028 => x"20256420", +3029 => x"0a000000", +3030 => x"50726f67", +3031 => x"72616d20", +3032 => x"636f6d70", +3033 => x"696c6564", +3034 => x"20776974", +3035 => x"686f7574", +3036 => x"20277265", +3037 => x"67697374", +3038 => x"65722720", +3039 => x"61747472", +3040 => x"69627574", +3041 => x"650a0000", +3042 => x"4d656173", +3043 => x"75726564", +3044 => x"2074696d", +3045 => x"6520746f", +3046 => x"6f20736d", +3047 => x"616c6c20", +3048 => x"746f206f", +3049 => x"62746169", +3050 => x"6e206d65", +3051 => x"616e696e", +3052 => x"6766756c", +3053 => x"20726573", +3054 => x"756c7473", +3055 => x"0a000000", +3056 => x"506c6561", +3057 => x"73652069", +3058 => x"6e637265", +3059 => x"61736520", +3060 => x"6e756d62", +3061 => x"6572206f", +3062 => x"66207275", +3063 => x"6e730a00", +3064 => x"44485259", +3065 => x"53544f4e", +3066 => x"45205052", +3067 => x"4f475241", +3068 => x"4d2c2033", +3069 => x"27524420", +3070 => x"53545249", +3071 => x"4e470000", +3072 => x"00010202", +3073 => x"03030303", +3074 => x"04040404", +3075 => x"04040404", +3076 => x"05050505", +3077 => x"05050505", +3078 => x"05050505", +3079 => x"05050505", +3080 => x"06060606", +3081 => x"06060606", +3082 => x"06060606", +3083 => x"06060606", +3084 => x"06060606", +3085 => x"06060606", +3086 => x"06060606", +3087 => x"06060606", +3088 => x"07070707", +3089 => x"07070707", +3090 => x"07070707", +3091 => x"07070707", +3092 => x"07070707", +3093 => x"07070707", +3094 => x"07070707", +3095 => x"07070707", +3096 => x"07070707", +3097 => x"07070707", +3098 => x"07070707", +3099 => x"07070707", +3100 => x"07070707", +3101 => x"07070707", +3102 => x"07070707", +3103 => x"07070707", +3104 => x"08080808", +3105 => x"08080808", +3106 => x"08080808", +3107 => x"08080808", +3108 => x"08080808", +3109 => x"08080808", +3110 => x"08080808", +3111 => x"08080808", +3112 => x"08080808", +3113 => x"08080808", +3114 => x"08080808", +3115 => x"08080808", +3116 => x"08080808", +3117 => x"08080808", +3118 => x"08080808", +3119 => x"08080808", +3120 => x"08080808", +3121 => x"08080808", +3122 => x"08080808", +3123 => x"08080808", +3124 => x"08080808", +3125 => x"08080808", +3126 => x"08080808", +3127 => x"08080808", +3128 => x"08080808", +3129 => x"08080808", +3130 => x"08080808", +3131 => x"08080808", +3132 => x"08080808", +3133 => x"08080808", +3134 => x"08080808", +3135 => x"08080808", +3136 => x"43000000", +3137 => x"64756d6d", +3138 => x"792e6578", +3139 => x"65000000", +3140 => x"00ffffff", +3141 => x"ff00ffff", +3142 => x"ffff00ff", +3143 => x"ffffff00", +3144 => x"00000000", +3145 => x"00000000", +3146 => x"00000000", +3147 => x"0000390c", +3148 => x"000004d2", -- iterations 0x4d2=1234 +3149 => x"00000000", +3150 => x"00000000", +3151 => x"00000000", +3152 => x"00000000", +3153 => x"00000000", +3154 => x"00000000", +3155 => x"00000000", +3156 => x"00000000", +3157 => x"00000000", +3158 => x"00000000", +3159 => x"00000000", +3160 => x"00000000", +3161 => x"00000000", +3162 => x"ffffffff", +3163 => x"00000000", +3164 => x"00020000", +3165 => x"00000000", +3166 => x"00000000", +3167 => x"00003174", +3168 => x"00003174", +3169 => x"0000317c", +3170 => x"0000317c", +3171 => x"00003184", +3172 => x"00003184", +3173 => x"0000318c", +3174 => x"0000318c", +3175 => x"00003194", +3176 => x"00003194", +3177 => x"0000319c", +3178 => x"0000319c", +3179 => x"000031a4", +3180 => x"000031a4", +3181 => x"000031ac", +3182 => x"000031ac", +3183 => x"000031b4", +3184 => x"000031b4", +3185 => x"000031bc", +3186 => x"000031bc", +3187 => x"000031c4", +3188 => x"000031c4", +3189 => x"000031cc", +3190 => x"000031cc", +3191 => x"000031d4", +3192 => x"000031d4", +3193 => x"000031dc", +3194 => x"000031dc", +3195 => x"000031e4", +3196 => x"000031e4", +3197 => x"000031ec", +3198 => x"000031ec", +3199 => x"000031f4", +3200 => x"000031f4", +3201 => x"000031fc", +3202 => x"000031fc", +3203 => x"00003204", +3204 => x"00003204", +3205 => x"0000320c", +3206 => x"0000320c", +3207 => x"00003214", +3208 => x"00003214", +3209 => x"0000321c", +3210 => x"0000321c", +3211 => x"00003224", +3212 => x"00003224", +3213 => x"0000322c", +3214 => x"0000322c", +3215 => x"00003234", +3216 => x"00003234", +3217 => x"0000323c", +3218 => x"0000323c", +3219 => x"00003244", +3220 => x"00003244", +3221 => x"0000324c", +3222 => x"0000324c", +3223 => x"00003254", +3224 => x"00003254", +3225 => x"0000325c", +3226 => x"0000325c", +3227 => x"00003264", +3228 => x"00003264", +3229 => x"0000326c", +3230 => x"0000326c", +3231 => x"00003274", +3232 => x"00003274", +3233 => x"0000327c", +3234 => x"0000327c", +3235 => x"00003284", +3236 => x"00003284", +3237 => x"0000328c", +3238 => x"0000328c", +3239 => x"00003294", +3240 => x"00003294", +3241 => x"0000329c", +3242 => x"0000329c", +3243 => x"000032a4", +3244 => x"000032a4", +3245 => x"000032ac", +3246 => x"000032ac", +3247 => x"000032b4", +3248 => x"000032b4", +3249 => x"000032bc", +3250 => x"000032bc", +3251 => x"000032c4", +3252 => x"000032c4", +3253 => x"000032cc", +3254 => x"000032cc", +3255 => x"000032d4", +3256 => x"000032d4", +3257 => x"000032dc", +3258 => x"000032dc", +3259 => x"000032e4", +3260 => x"000032e4", +3261 => x"000032ec", +3262 => x"000032ec", +3263 => x"000032f4", +3264 => x"000032f4", +3265 => x"000032fc", +3266 => x"000032fc", +3267 => x"00003304", +3268 => x"00003304", +3269 => x"0000330c", +3270 => x"0000330c", +3271 => x"00003314", +3272 => x"00003314", +3273 => x"0000331c", +3274 => x"0000331c", +3275 => x"00003324", +3276 => x"00003324", +3277 => x"0000332c", +3278 => x"0000332c", +3279 => x"00003334", +3280 => x"00003334", +3281 => x"0000333c", +3282 => x"0000333c", +3283 => x"00003344", +3284 => x"00003344", +3285 => x"0000334c", +3286 => x"0000334c", +3287 => x"00003354", +3288 => x"00003354", +3289 => x"0000335c", +3290 => x"0000335c", +3291 => x"00003364", +3292 => x"00003364", +3293 => x"0000336c", +3294 => x"0000336c", +3295 => x"00003374", +3296 => x"00003374", +3297 => x"0000337c", +3298 => x"0000337c", +3299 => x"00003384", +3300 => x"00003384", +3301 => x"0000338c", +3302 => x"0000338c", +3303 => x"00003394", +3304 => x"00003394", +3305 => x"0000339c", +3306 => x"0000339c", +3307 => x"000033a4", +3308 => x"000033a4", +3309 => x"000033ac", +3310 => x"000033ac", +3311 => x"000033b4", +3312 => x"000033b4", +3313 => x"000033bc", +3314 => x"000033bc", +3315 => x"000033c4", +3316 => x"000033c4", +3317 => x"000033cc", +3318 => x"000033cc", +3319 => x"000033d4", +3320 => x"000033d4", +3321 => x"000033dc", +3322 => x"000033dc", +3323 => x"000033e4", +3324 => x"000033e4", +3325 => x"000033ec", +3326 => x"000033ec", +3327 => x"000033f4", +3328 => x"000033f4", +3329 => x"000033fc", +3330 => x"000033fc", +3331 => x"00003404", +3332 => x"00003404", +3333 => x"0000340c", +3334 => x"0000340c", +3335 => x"00003414", +3336 => x"00003414", +3337 => x"0000341c", +3338 => x"0000341c", +3339 => x"00003424", +3340 => x"00003424", +3341 => x"0000342c", +3342 => x"0000342c", +3343 => x"00003434", +3344 => x"00003434", +3345 => x"0000343c", +3346 => x"0000343c", +3347 => x"00003444", +3348 => x"00003444", +3349 => x"0000344c", +3350 => x"0000344c", +3351 => x"00003454", +3352 => x"00003454", +3353 => x"0000345c", +3354 => x"0000345c", +3355 => x"00003464", +3356 => x"00003464", +3357 => x"0000346c", +3358 => x"0000346c", +3359 => x"00003474", +3360 => x"00003474", +3361 => x"0000347c", +3362 => x"0000347c", +3363 => x"00003484", +3364 => x"00003484", +3365 => x"0000348c", +3366 => x"0000348c", +3367 => x"00003494", +3368 => x"00003494", +3369 => x"0000349c", +3370 => x"0000349c", +3371 => x"000034a4", +3372 => x"000034a4", +3373 => x"000034ac", +3374 => x"000034ac", +3375 => x"000034b4", +3376 => x"000034b4", +3377 => x"000034bc", +3378 => x"000034bc", +3379 => x"000034c4", +3380 => x"000034c4", +3381 => x"000034cc", +3382 => x"000034cc", +3383 => x"000034d4", +3384 => x"000034d4", +3385 => x"000034dc", +3386 => x"000034dc", +3387 => x"000034e4", +3388 => x"000034e4", +3389 => x"000034ec", +3390 => x"000034ec", +3391 => x"000034f4", +3392 => x"000034f4", +3393 => x"000034fc", +3394 => x"000034fc", +3395 => x"00003504", +3396 => x"00003504", +3397 => x"0000350c", +3398 => x"0000350c", +3399 => x"00003514", +3400 => x"00003514", +3401 => x"0000351c", +3402 => x"0000351c", +3403 => x"00003524", +3404 => x"00003524", +3405 => x"0000352c", +3406 => x"0000352c", +3407 => x"00003534", +3408 => x"00003534", +3409 => x"0000353c", +3410 => x"0000353c", +3411 => x"00003544", +3412 => x"00003544", +3413 => x"0000354c", +3414 => x"0000354c", +3415 => x"00003554", +3416 => x"00003554", +3417 => x"0000355c", +3418 => x"0000355c", +3419 => x"00003564", +3420 => x"00003564", +3421 => x"0000356c", +3422 => x"0000356c", +3423 => x"00003580", +3424 => x"00000000", +3425 => x"000037e8", +3426 => x"00003844", +3427 => x"000038a0", +3428 => x"00000000", +3429 => x"00000000", +3430 => x"00000000", +3431 => x"00000000", +3432 => x"00000000", +3433 => x"00000000", +3434 => x"00000000", +3435 => x"00000000", +3436 => x"00000000", +3437 => x"00003100", +3438 => x"00000000", +3439 => x"00000000", +3440 => x"00000000", +3441 => x"00000000", +3442 => x"00000000", +3443 => x"00000000", +3444 => x"00000000", +3445 => x"00000000", +3446 => x"00000000", +3447 => x"00000000", +3448 => x"00000000", +3449 => x"00000000", +3450 => x"00000000", +3451 => x"00000000", +3452 => x"00000000", +3453 => x"00000000", +3454 => x"00000000", +3455 => x"00000000", +3456 => x"00000000", +3457 => x"00000000", +3458 => x"00000000", +3459 => x"00000000", +3460 => x"00000000", +3461 => x"00000000", +3462 => x"00000000", +3463 => x"00000000", +3464 => x"00000000", +3465 => x"00000000", +3466 => x"00000001", +3467 => x"330eabcd", +3468 => x"1234e66d", +3469 => x"deec0005", +3470 => x"000b0000", +3471 => x"00000000", +3472 => x"00000000", +3473 => x"00000000", +3474 => x"00000000", +3475 => x"00000000", +3476 => x"00000000", +3477 => x"00000000", +3478 => x"00000000", +3479 => x"00000000", +3480 => x"00000000", +3481 => x"00000000", +3482 => x"00000000", +3483 => x"00000000", +3484 => x"00000000", +3485 => x"00000000", +3486 => x"00000000", +3487 => x"00000000", +3488 => x"00000000", +3489 => x"00000000", +3490 => x"00000000", +3491 => x"00000000", +3492 => x"00000000", +3493 => x"00000000", +3494 => x"00000000", +3495 => x"00000000", +3496 => x"00000000", +3497 => x"00000000", +3498 => x"00000000", +3499 => x"00000000", +3500 => x"00000000", +3501 => x"00000000", +3502 => x"00000000", +3503 => x"00000000", +3504 => x"00000000", +3505 => x"00000000", +3506 => x"00000000", +3507 => x"00000000", +3508 => x"00000000", +3509 => x"00000000", +3510 => x"00000000", +3511 => x"00000000", +3512 => x"00000000", +3513 => x"00000000", +3514 => x"00000000", +3515 => x"00000000", +3516 => x"00000000", +3517 => x"00000000", +3518 => x"00000000", +3519 => x"00000000", +3520 => x"00000000", +3521 => x"00000000", +3522 => x"00000000", +3523 => x"00000000", +3524 => x"00000000", +3525 => x"00000000", +3526 => x"00000000", +3527 => x"00000000", +3528 => x"00000000", +3529 => x"00000000", +3530 => x"00000000", +3531 => x"00000000", +3532 => x"00000000", +3533 => x"00000000", +3534 => x"00000000", +3535 => x"00000000", +3536 => x"00000000", +3537 => x"00000000", +3538 => x"00000000", +3539 => x"00000000", +3540 => x"00000000", +3541 => x"00000000", +3542 => x"00000000", +3543 => x"00000000", +3544 => x"00000000", +3545 => x"00000000", +3546 => x"00000000", +3547 => x"00000000", +3548 => x"00000000", +3549 => x"00000000", +3550 => x"00000000", +3551 => x"00000000", +3552 => x"00000000", +3553 => x"00000000", +3554 => x"00000000", +3555 => x"00000000", +3556 => x"00000000", +3557 => x"00000000", +3558 => x"00000000", +3559 => x"00000000", +3560 => x"00000000", +3561 => x"00000000", +3562 => x"00000000", +3563 => x"00000000", +3564 => x"00000000", +3565 => x"00000000", +3566 => x"00000000", +3567 => x"00000000", +3568 => x"00000000", +3569 => x"00000000", +3570 => x"00000000", +3571 => x"00000000", +3572 => x"00000000", +3573 => x"00000000", +3574 => x"00000000", +3575 => x"00000000", +3576 => x"00000000", +3577 => x"00000000", +3578 => x"00000000", +3579 => x"00000000", +3580 => x"00000000", +3581 => x"00000000", +3582 => x"00000000", +3583 => x"00000000", +3584 => x"00000000", +3585 => x"00000000", +3586 => x"00000000", +3587 => x"00000000", +3588 => x"00000000", +3589 => x"00000000", +3590 => x"00000000", +3591 => x"00000000", +3592 => x"00000000", +3593 => x"00000000", +3594 => x"00000000", +3595 => x"00000000", +3596 => x"00000000", +3597 => x"00000000", +3598 => x"00000000", +3599 => x"00000000", +3600 => x"00000000", +3601 => x"00000000", +3602 => x"00000000", +3603 => x"00000000", +3604 => x"00000000", +3605 => x"00000000", +3606 => x"00000000", +3607 => x"00000000", +3608 => x"00000000", +3609 => x"00000000", +3610 => x"00000000", +3611 => x"00000000", +3612 => x"00000000", +3613 => x"00000000", +3614 => x"00000000", +3615 => x"00000000", +3616 => x"00000000", +3617 => x"00000000", +3618 => x"00000000", +3619 => x"00000000", +3620 => x"00000000", +3621 => x"00000000", +3622 => x"00000000", +3623 => x"00000000", +3624 => x"00000000", +3625 => x"00000000", +3626 => x"00000000", +3627 => x"00000000", +3628 => x"00000000", +3629 => x"00000000", +3630 => x"00000000", +3631 => x"00000000", +3632 => x"00000000", +3633 => x"00000000", +3634 => x"00000000", +3635 => x"00000000", +3636 => x"00000000", +3637 => x"00000000", +3638 => x"00000000", +3639 => x"00000000", +3640 => x"00000000", +3641 => x"00000000", +3642 => x"00000000", +3643 => x"00000000", +3644 => x"00000000", +3645 => x"00000000", +3646 => x"00000000", +3647 => x"00003104", +3648 => x"ffffffff", +3649 => x"00000000", +3650 => x"ffffffff", +3651 => x"00000000", + others => x"00000000" +); + +begin + +process (clk) +begin + if (clk'event and clk = '1') then + if (memAWriteEnable = '1') and (memBWriteEnable = '1') and (memAAddr=memBAddr) and (memAWrite/=memBWrite) then + report "write collision" severity failure; + end if; + + if (memAWriteEnable = '1') then + ram(conv_integer(memAAddr)) := memAWrite; + memARead <= memAWrite; + else + memARead <= ram(conv_integer(memAAddr)); + end if; + end if; +end process; + +process (clk) +begin + if (clk'event and clk = '1') then + if (memBWriteEnable = '1') then + ram(conv_integer(memBAddr)) := memBWrite; + memBRead <= memBWrite; + else + memBRead <= ram(conv_integer(memBAddr)); + end if; + end if; +end process; + + + + +end dualport_ram_arch; diff --git a/zpu/hdl/zpu4/src/build.xml b/zpu/hdl/zpu4/src/build.xml new file mode 100644 index 0000000..e1b268a --- /dev/null +++ b/zpu/hdl/zpu4/src/build.xml @@ -0,0 +1,114 @@ + + + + + + + eCosBoard firmware build file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/zpu/hdl/zpu4/src/clocks.vhd b/zpu/hdl/zpu4/src/clocks.vhd new file mode 100644 index 0000000..a352b3c --- /dev/null +++ b/zpu/hdl/zpu4/src/clocks.vhd @@ -0,0 +1,246 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +library UNISIM; +use UNISIM.vcomponents.all; + +entity clocks is + port ( areset : in std_logic; + cpu_clk_p : in std_logic; + sdr_clk_fb_p : in std_logic; + cpu_clk : out std_logic; + cpu_clk_2x : out std_logic; + cpu_clk_4x : out std_logic; + ddr_in_clk : out std_logic; + ddr_in_clk_2x : out std_logic; + locked : out std_logic_vector(2 downto 0)); +end clocks; + +architecture behave of clocks is + +signal low : std_logic; + +signal cpu_clk_in : std_logic; +signal sdr_clk_fb_in : std_logic; + +signal dcm_cpu1 : std_logic; +signal dcm_cpu2 : std_logic; +signal dcm_cpu2_dum : std_logic; +signal dcm_cpu4 : std_logic; +signal dcm_ddr2 : std_logic; +signal dcm_ddr2_2x : std_logic; + +signal cpu_clk_int : std_logic; +signal cpu_clk_2x_int : std_logic; +signal cpu_clk_2x_dum_int : std_logic; +signal cpu_clk_4x_int : std_logic; +signal ddr_in_clk_int : std_logic; +signal ddr_in_clk_2x_int : std_logic; + +signal dcm1_locked_del : std_logic; +signal dcm2_locked_del : std_logic; +signal dcm2_reset : std_logic; +signal dcm3_reset : std_logic; + +signal locked_int : std_logic_vector(2 downto 0); +signal del_addr : std_logic_vector(3 downto 0); + +begin + + low <= '0'; + del_addr <= "1111"; + + cpu_clk <= cpu_clk_int; + cpu_clk_2x <= cpu_clk_2x_int; + cpu_clk_4x <= cpu_clk_4x_int; + ddr_in_clk <= ddr_in_clk_int; + ddr_in_clk_2x <= ddr_in_clk_2x_int; + locked <= locked_int; + + + CPU_IBUFG: + IBUFG port map ( + O => cpu_clk_in, + I => cpu_clk_p); + + SDR_FB_IBUFG: + IBUFG port map ( + O => sdr_clk_fb_in, + I => sdr_clk_fb_p); + + dcm2_rst: + SRL16 generic map ( + INIT => X"0000") + port map ( + Q => dcm1_locked_del, + A0 => del_addr(0), + A1 => del_addr(1), + A2 => del_addr(2), + A3 => del_addr(3), + CLK => cpu_clk_int, + D => locked_int(0)); + + dcm2_reset <= not(dcm1_locked_del); + + dcm3_rst: + SRL16 generic map ( + INIT => X"0000") + port map ( + Q => dcm2_locked_del, + A0 => del_addr(0), + A1 => del_addr(1), + A2 => del_addr(2), + A3 => del_addr(3), + CLK => cpu_clk_int, + D => locked_int(1)); + + dcm3_reset <= not(dcm2_locked_del); + + cpu1_dcm: + DCM generic map ( + CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5 + -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0 + CLKFX_DIVIDE => 1, -- Can be any interger from 1 to 32 + CLKFX_MULTIPLY => 4, -- Can be any integer from 1 to 32 + CLKIN_DIVIDE_BY_2 => FALSE, -- TRUE/FALSE to enable CLKIN divide by two feature + CLKIN_PERIOD => 15.625, -- Specify period of input clock + CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift of NONE, FIXED or VARIABLE + CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE, 1X or 2X + DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or + -- an integer from 0 to 15 + DFS_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for frequency synthesis + DLL_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for DLL + DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSE + FACTORY_JF => X"8080", -- FACTORY JF Values + PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 255 + STARTUP_WAIT => FALSE) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE + port map ( + CLK0 => dcm_cpu1, -- 0 degree DCM CLK ouptput + CLK180 => open, -- 180 degree DCM CLK output + CLK270 => open, -- 270 degree DCM CLK output + CLK2X => dcm_cpu2, -- 2X DCM CLK output + CLK2X180 => open, -- 2X, 180 degree DCM CLK out + CLK90 => open, -- 90 degree DCM CLK output + CLKDV => open, -- Divided DCM CLK out (CLKDV_DIVIDE) + CLKFX => open, -- DCM CLK synthesis out (M/D) + CLKFX180 => open, -- 180 degree CLK synthesis out + LOCKED => locked_int(0), -- DCM LOCK status output + PSDONE => open, -- Dynamic phase adjust done output + STATUS => open, -- 8-bit DCM status bits output + CLKFB => cpu_clk_int, -- DCM clock feedback + CLKIN => cpu_clk_in, -- Clock input (from IBUFG, BUFG or DCM) + PSCLK => low, -- Dynamic phase adjust clock input + PSEN => low, -- Dynamic phase adjust enable input + PSINCDEC => low, -- Dynamic phase adjust increment/decrement + RST => areset); -- DCM asynchronous reset input + + cpu2_dcm: + DCM generic map ( + CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5 + -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0 + CLKFX_DIVIDE => 1, -- Can be any interger from 1 to 32 + CLKFX_MULTIPLY => 4, -- Can be any integer from 1 to 32 + CLKIN_DIVIDE_BY_2 => FALSE, -- TRUE/FALSE to enable CLKIN divide by two feature + CLKIN_PERIOD => 7.8125, -- Specify period of input clock + CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift of NONE, FIXED or VARIABLE + CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE, 1X or 2X + DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or + -- an integer from 0 to 15 + DFS_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for frequency synthesis + DLL_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for DLL + DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSE + FACTORY_JF => X"8080", -- FACTORY JF Values + PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 255 + STARTUP_WAIT => FALSE) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE + port map ( + CLK0 => dcm_cpu2_dum, -- 0 degree DCM CLK ouptput + CLK180 => open, -- 180 degree DCM CLK output + CLK270 => open, -- 270 degree DCM CLK output + CLK2X => dcm_cpu4, -- 2X DCM CLK output + CLK2X180 => open, -- 2X, 180 degree DCM CLK out + CLK90 => open, -- 90 degree DCM CLK output + CLKDV => open, -- Divided DCM CLK out (CLKDV_DIVIDE) + CLKFX => open, -- DCM CLK synthesis out (M/D) + CLKFX180 => open, -- 180 degree CLK synthesis out + LOCKED => locked_int(1), -- DCM LOCK status output + PSDONE => open, -- Dynamic phase adjust done output + STATUS => open, -- 8-bit DCM status bits output + CLKFB => cpu_clk_2x_dum_int, -- DCM clock feedback + CLKIN => cpu_clk_2x_int, -- Clock input (from IBUFG, BUFG or DCM) + PSCLK => low, -- Dynamic phase adjust clock input + PSEN => low, -- Dynamic phase adjust enable input + PSINCDEC => low, -- Dynamic phase adjust increment/decrement + RST => dcm2_reset); -- DCM asynchronous reset input + + ddr_read_dcm: + DCM generic map ( + CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5 + -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0 + CLKFX_DIVIDE => 1, -- Can be any interger from 1 to 32 + CLKFX_MULTIPLY => 4, -- Can be any integer from 1 to 32 + CLKIN_DIVIDE_BY_2 => FALSE, -- TRUE/FALSE to enable CLKIN divide by two feature + CLKIN_PERIOD => 7.8125, -- Specify period of input clock + CLKOUT_PHASE_SHIFT => "FIXED", -- Specify phase shift of NONE, FIXED or VARIABLE +-- CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift of NONE, FIXED or VARIABLE + CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE, 1X or 2X + DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or + -- an integer from 0 to 15 + DFS_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for frequency synthesis + DLL_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for DLL + DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSE + FACTORY_JF => X"8080", -- FACTORY JF Values + PHASE_SHIFT => 103, -- Amount of fixed phase shift from -255 to 255 +-- PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 255 + STARTUP_WAIT => FALSE) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE + port map ( + CLK0 => dcm_ddr2, -- 0 degree DCM CLK ouptput + CLK180 => open, -- 180 degree DCM CLK output + CLK270 => open, -- 270 degree DCM CLK output + CLK2X => dcm_ddr2_2x, -- 2X DCM CLK output + CLK2X180 => open, -- 2X, 180 degree DCM CLK out + CLK90 => open, -- 90 degree DCM CLK output + CLKDV => open, -- Divided DCM CLK out (CLKDV_DIVIDE) + CLKFX => open, -- DCM CLK synthesis out (M/D) + CLKFX180 => open, -- 180 degree CLK synthesis out + LOCKED => locked_int(2), -- DCM LOCK status output + PSDONE => open, -- Dynamic phase adjust done output + STATUS => open, -- 8-bit DCM status bits output + CLKFB => ddr_in_clk_int, -- DCM clock feedback + CLKIN => sdr_clk_fb_in, -- Clock input (from IBUFG, BUFG or DCM) + PSCLK => low, -- Dynamic phase adjust clock input + PSEN => low, -- Dynamic phase adjust enable input + PSINCDEC => low, -- Dynamic phase adjust increment/decrement + RST => dcm3_reset); -- DCM asynchronous reset input + + cpu1: + BUFG port map ( + I => dcm_cpu1, + O => cpu_clk_int); + + cpu2: + BUFG port map ( + I => dcm_cpu2, + O => cpu_clk_2x_int); + + cpu2_dum: + BUFG port map ( + I => dcm_cpu2_dum, + O => cpu_clk_2x_dum_int); + + cpu4: + BUFG port map ( + I => dcm_cpu4, + O => cpu_clk_4x_int); + + ddr_clk: + BUFG port map ( + I => dcm_ddr2, + O => ddr_in_clk_int); + + ddr_clk_2x: + BUFG port map ( + I => dcm_ddr2_2x, + O => ddr_in_clk_2x_int); + +end behave; \ No newline at end of file diff --git a/zpu/hdl/zpu4/src/dmipssmalltrace.do b/zpu/hdl/zpu4/src/dmipssmalltrace.do new file mode 100644 index 0000000..eb4c6fe --- /dev/null +++ b/zpu/hdl/zpu4/src/dmipssmalltrace.do @@ -0,0 +1,26 @@ +set BreakOnAssertion 1 +vlib work + +vcom -93 -explicit zpu_config_trace.vhd +vcom -93 -explicit zpupkg.vhd +vcom -93 -explicit txt_util.vhd +vcom -93 -explicit sim_fpga_top.vhd +vcom -93 -explicit zpu_core_small.vhd +vcom -93 -explicit bram_dmips.vhd +vcom -93 -explicit dram_dmips.vhd +vcom -93 -explicit timer.vhd +vcom -93 -explicit io.vhd +vcom -93 -explicit trace.vhd + + +vsim fpga_top +view wave + +add wave -recursive fpga_top/zpu/* +#--add wave -recursive fpga_top/ioMap/* +#add wave -recursive fpga_top/* +view structure + + +# run ZPU +run 5 ms diff --git a/zpu/hdl/zpu4/src/dmipstrace.do b/zpu/hdl/zpu4/src/dmipstrace.do new file mode 100644 index 0000000..8d5f430 --- /dev/null +++ b/zpu/hdl/zpu4/src/dmipstrace.do @@ -0,0 +1,25 @@ +set BreakOnAssertion 1 +vlib work + +vcom -93 -explicit zpu_config_trace.vhd +vcom -93 -explicit zpupkg.vhd +vcom -93 -explicit txt_util.vhd +vcom -93 -explicit sim_fpga_top.vhd +vcom -93 -explicit zpu_core.vhd +vcom -93 -explicit dram_dmips.vhd +vcom -93 -explicit timer.vhd +vcom -93 -explicit io.vhd +vcom -93 -explicit trace.vhd + + +vsim fpga_top +view wave + +add wave -recursive fpga_top/zpu/* +#--add wave -recursive fpga_top/ioMap/* +#add wave -recursive fpga_top/* +view structure + + +# run ZPU +run 5 ms diff --git a/zpu/hdl/zpu4/src/dmipstraceintstack.do b/zpu/hdl/zpu4/src/dmipstraceintstack.do new file mode 100644 index 0000000..b2addb4 --- /dev/null +++ b/zpu/hdl/zpu4/src/dmipstraceintstack.do @@ -0,0 +1,25 @@ +set BreakOnAssertion 1 +vlib work + +vcom -93 -explicit zpu_config_trace.vhd +vcom -93 -explicit zpupkg.vhd +vcom -93 -explicit txt_util.vhd +vcom -93 -explicit sim_fpga_top.vhd +vcom -93 -explicit zpu_core_intstack.vhd +vcom -93 -explicit dram_dmips.vhd +vcom -93 -explicit timer.vhd +vcom -93 -explicit io.vhd +vcom -93 -explicit trace.vhd + + +vsim fpga_top +view wave + +add wave -recursive fpga_top/zpu/* +#--add wave -recursive fpga_top/ioMap/* +#add wave -recursive fpga_top/* +view structure + + +# run ZPU +run 5 ms diff --git a/zpu/hdl/zpu4/src/dram_dmips.vhd b/zpu/hdl/zpu4/src/dram_dmips.vhd new file mode 100644 index 0000000..e63a27a --- /dev/null +++ b/zpu/hdl/zpu4/src/dram_dmips.vhd @@ -0,0 +1,3702 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; + + +library work; +use work.zpu_config.all; +use work.zpupkg.all; + +entity dram is +port (clk : in std_logic; +areset : std_logic; + mem_writeEnable : in std_logic; + mem_readEnable : in std_logic; + mem_addr : in std_logic_vector(maxAddrBit downto 0); + mem_write : in std_logic_vector(wordSize-1 downto 0); + mem_read : out std_logic_vector(wordSize-1 downto 0); + mem_busy : out std_logic; + mem_writeMask : in std_logic_vector(wordBytes-1 downto 0)); +end dram; + +architecture dram_arch of dram is + + +type ram_type is array(0 to ((2**(maxAddrBit+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); + +shared variable ram : ram_type := +( +0 => x"0b0b0b0b", +1 => x"80700b0b", +2 => x"80e2a40c", +3 => x"3a0b0b80", +4 => x"c6fc0400", +5 => x"00000000", +6 => x"00000000", +7 => x"00000000", +8 => x"80088408", +9 => x"88080b0b", +10 => x"80c7c32d", +11 => x"880c840c", +12 => x"800c0400", +13 => x"00000000", +14 => x"00000000", +15 => x"00000000", +16 => x"71fd0608", +17 => x"72830609", +18 => x"81058205", +19 => x"832b2a83", +20 => x"ffff0652", +21 => x"04000000", +22 => x"00000000", +23 => x"00000000", +24 => x"71fd0608", +25 => x"83ffff73", +26 => x"83060981", +27 => x"05820583", +28 => x"2b2b0906", +29 => x"7383ffff", +30 => x"0b0b0b0b", +31 => x"83a70400", +32 => x"72098105", +33 => x"72057373", +34 => x"09060906", +35 => x"73097306", +36 => x"070a8106", +37 => x"53510400", +38 => x"00000000", +39 => x"00000000", +40 => x"72722473", +41 => x"732e0753", +42 => x"51040000", +43 => x"00000000", +44 => x"00000000", +45 => x"00000000", +46 => x"00000000", +47 => x"00000000", +48 => x"71737109", +49 => x"71068106", +50 => x"30720a10", +51 => x"0a720a10", +52 => x"0a31050a", +53 => x"81065151", +54 => x"53510400", +55 => x"00000000", +56 => x"72722673", +57 => x"732e0753", +58 => x"51040000", +59 => x"00000000", +60 => x"00000000", +61 => x"00000000", +62 => x"00000000", +63 => x"00000000", +64 => x"00000000", +65 => x"00000000", +66 => x"00000000", +67 => x"00000000", +68 => x"00000000", +69 => x"00000000", +70 => x"00000000", +71 => x"00000000", +72 => x"0b0b0b88", +73 => x"c4040000", +74 => x"00000000", +75 => x"00000000", +76 => x"00000000", +77 => x"00000000", +78 => x"00000000", +79 => x"00000000", +80 => x"720a722b", +81 => x"0a535104", +82 => x"00000000", +83 => x"00000000", +84 => x"00000000", +85 => x"00000000", +86 => x"00000000", +87 => x"00000000", +88 => x"72729f06", +89 => x"0981050b", +90 => x"0b0b88a7", +91 => x"05040000", +92 => x"00000000", +93 => x"00000000", +94 => x"00000000", +95 => x"00000000", +96 => x"72722aff", +97 => x"739f062a", +98 => x"0974090a", +99 => x"8106ff05", +100 => x"06075351", +101 => x"04000000", +102 => x"00000000", +103 => x"00000000", +104 => x"71715351", +105 => x"020d0406", +106 => x"73830609", +107 => x"81058205", +108 => x"832b0b2b", +109 => x"0772fc06", +110 => x"0c515104", +111 => x"00000000", +112 => x"72098105", +113 => x"72050970", +114 => x"81050906", +115 => x"0a810653", +116 => x"51040000", +117 => x"00000000", +118 => x"00000000", +119 => x"00000000", +120 => x"72098105", +121 => x"72050970", +122 => x"81050906", +123 => x"0a098106", +124 => x"53510400", +125 => x"00000000", +126 => x"00000000", +127 => x"00000000", +128 => x"71098105", +129 => x"52040000", +130 => x"00000000", +131 => x"00000000", +132 => x"00000000", +133 => x"00000000", +134 => x"00000000", +135 => x"00000000", +136 => x"72720981", +137 => x"05055351", +138 => x"04000000", +139 => x"00000000", +140 => x"00000000", +141 => x"00000000", +142 => x"00000000", +143 => x"00000000", +144 => x"72097206", +145 => x"73730906", +146 => x"07535104", +147 => x"00000000", +148 => x"00000000", +149 => x"00000000", +150 => x"00000000", +151 => x"00000000", +152 => x"71fc0608", +153 => x"72830609", +154 => x"81058305", +155 => x"1010102a", +156 => x"81ff0652", +157 => x"04000000", +158 => x"00000000", +159 => x"00000000", +160 => x"71fc0608", +161 => x"0b0b80e2", +162 => x"90738306", +163 => x"10100508", +164 => x"060b0b0b", +165 => x"88aa0400", +166 => x"00000000", +167 => x"00000000", +168 => x"80088408", +169 => x"88087575", +170 => x"0b0b0baf", +171 => x"ac2d5050", +172 => x"80085688", +173 => x"0c840c80", +174 => x"0c510400", +175 => x"00000000", +176 => x"80088408", +177 => x"88087575", +178 => x"0b0b0baf", +179 => x"f02d5050", +180 => x"80085688", +181 => x"0c840c80", +182 => x"0c510400", +183 => x"00000000", +184 => x"72097081", +185 => x"0509060a", +186 => x"8106ff05", +187 => x"70547106", +188 => x"73097274", +189 => x"05ff0506", +190 => x"07515151", +191 => x"04000000", +192 => x"72097081", +193 => x"0509060a", +194 => x"098106ff", +195 => x"05705471", +196 => x"06730972", +197 => x"7405ff05", +198 => x"06075151", +199 => x"51040000", +200 => x"05ff0504", +201 => x"00000000", +202 => x"00000000", +203 => x"00000000", +204 => x"00000000", +205 => x"00000000", +206 => x"00000000", +207 => x"00000000", +208 => x"810b0b0b", +209 => x"80e2a00c", +210 => x"51040000", +211 => x"00000000", +212 => x"00000000", +213 => x"00000000", +214 => x"00000000", +215 => x"00000000", +216 => x"71810552", +217 => x"04000000", +218 => x"00000000", +219 => x"00000000", +220 => x"00000000", +221 => x"00000000", +222 => x"00000000", +223 => x"00000000", +224 => x"00000000", +225 => x"00000000", +226 => x"00000000", +227 => x"00000000", +228 => x"00000000", +229 => x"00000000", +230 => x"00000000", +231 => x"00000000", +232 => x"02840572", +233 => x"10100552", +234 => x"04000000", +235 => x"00000000", +236 => x"00000000", +237 => x"00000000", +238 => x"00000000", +239 => x"00000000", +240 => x"00000000", +241 => x"00000000", +242 => x"00000000", +243 => x"00000000", +244 => x"00000000", +245 => x"00000000", +246 => x"00000000", +247 => x"00000000", +248 => x"717105ff", +249 => x"05715351", +250 => x"020d0400", +251 => x"00000000", +252 => x"00000000", +253 => x"00000000", +254 => x"00000000", +255 => x"00000000", +256 => x"83d93f80", +257 => x"cbcf3f04", +258 => x"10101010", +259 => x"10101010", +260 => x"10101010", +261 => x"10101010", +262 => x"10101010", +263 => x"10101010", +264 => x"10101010", +265 => x"10101053", +266 => x"51047381", +267 => x"ff067383", +268 => x"06098105", +269 => x"83051010", +270 => x"102b0772", +271 => x"fc060c51", +272 => x"51043c04", +273 => x"72728072", +274 => x"8106ff05", +275 => x"09720605", +276 => x"71105272", +277 => x"0a100a53", +278 => x"72ed3851", +279 => x"51535104", +280 => x"ff3d0d0b", +281 => x"0b80f294", +282 => x"08528412", +283 => x"08708106", +284 => x"515170f6", +285 => x"38710881", +286 => x"ff06800c", +287 => x"833d0d04", +288 => x"ff3d0d0b", +289 => x"0b80f294", +290 => x"08528412", +291 => x"08700a10", +292 => x"0a708106", +293 => x"51515170", +294 => x"f1387372", +295 => x"0c833d0d", +296 => x"0480e2a0", +297 => x"08802ea8", +298 => x"38838080", +299 => x"0b0b0b80", +300 => x"f2940c82", +301 => x"a0800b0b", +302 => x"0b80f298", +303 => x"0c829080", +304 => x"0b80f2a8", +305 => x"0c0b0b80", +306 => x"f29c0b80", +307 => x"f2ac0c04", +308 => x"f8808080", +309 => x"a40b0b0b", +310 => x"80f2940c", +311 => x"f8808082", +312 => x"800b0b0b", +313 => x"80f2980c", +314 => x"f8808084", +315 => x"800b80f2", +316 => x"a80cf880", +317 => x"8080940b", +318 => x"80f2ac0c", +319 => x"f8808080", +320 => x"9c0b80f2", +321 => x"a40cf880", +322 => x"8080a00b", +323 => x"80f2b00c", +324 => x"04f23d0d", +325 => x"600b0b80", +326 => x"f2980856", +327 => x"5d82750c", +328 => x"8059805a", +329 => x"800b8f3d", +330 => x"71101017", +331 => x"70085957", +332 => x"5d5b8076", +333 => x"81ff067c", +334 => x"832b5658", +335 => x"5276537b", +336 => x"519af33f", +337 => x"7d7f7a72", +338 => x"077c7207", +339 => x"71716081", +340 => x"05415f5d", +341 => x"5b595755", +342 => x"7a8724bb", +343 => x"380b0b80", +344 => x"f298087b", +345 => x"10101170", +346 => x"08585155", +347 => x"807681ff", +348 => x"067c832b", +349 => x"56585276", +350 => x"537b519a", +351 => x"b93f7d7f", +352 => x"7a72077c", +353 => x"72077171", +354 => x"60810541", +355 => x"5f5d5b59", +356 => x"5755877b", +357 => x"25c73876", +358 => x"7d0c7784", +359 => x"1e0c7c80", +360 => x"0c903d0d", +361 => x"04ff3d0d", +362 => x"80f2a033", +363 => x"5170a738", +364 => x"80e2ac08", +365 => x"70085252", +366 => x"70802e94", +367 => x"38841280", +368 => x"e2ac0c70", +369 => x"2d80e2ac", +370 => x"08700852", +371 => x"5270ee38", +372 => x"810b80f2", +373 => x"a034833d", +374 => x"0d040480", +375 => x"3d0d0b0b", +376 => x"80f29008", +377 => x"802e8e38", +378 => x"0b0b0b0b", +379 => x"800b802e", +380 => x"09810685", +381 => x"38823d0d", +382 => x"040b0b80", +383 => x"f290510b", +384 => x"0b0bf3fc", +385 => x"3f823d0d", +386 => x"0404ff3d", +387 => x"0d028f05", +388 => x"3352718a", +389 => x"2e8a3871", +390 => x"51fce53f", +391 => x"833d0d04", +392 => x"8d51fcdc", +393 => x"3f7151fc", +394 => x"d73f833d", +395 => x"0d04ce3d", +396 => x"0db53d70", +397 => x"70840552", +398 => x"088c8a5c", +399 => x"56a53d5e", +400 => x"5c807570", +401 => x"81055733", +402 => x"765b5558", +403 => x"73782e80", +404 => x"c1388e3d", +405 => x"5b73a52e", +406 => x"09810680", +407 => x"c5387870", +408 => x"81055a33", +409 => x"547380e4", +410 => x"2e81b638", +411 => x"7380e424", +412 => x"80c63873", +413 => x"80e32ea1", +414 => x"388052a5", +415 => x"51792d80", +416 => x"52735179", +417 => x"2d821858", +418 => x"78708105", +419 => x"5a335473", +420 => x"c4387780", +421 => x"0cb43d0d", +422 => x"047b841d", +423 => x"83123356", +424 => x"5d578052", +425 => x"7351792d", +426 => x"81187970", +427 => x"81055b33", +428 => x"555873ff", +429 => x"a038db39", +430 => x"7380f32e", +431 => x"098106ff", +432 => x"b8387b84", +433 => x"1d710859", +434 => x"5d568077", +435 => x"33555673", +436 => x"762e8d38", +437 => x"81167018", +438 => x"70335755", +439 => x"5674f538", +440 => x"ff165580", +441 => x"7625ffa0", +442 => x"38767081", +443 => x"05583354", +444 => x"80527351", +445 => x"792d8118", +446 => x"75ff1757", +447 => x"57588076", +448 => x"25ff8538", +449 => x"76708105", +450 => x"58335480", +451 => x"52735179", +452 => x"2d811875", +453 => x"ff175757", +454 => x"58758024", +455 => x"cc38fee8", +456 => x"397b841d", +457 => x"71087071", +458 => x"9f2c5953", +459 => x"595d5680", +460 => x"75248195", +461 => x"38757d7c", +462 => x"58565480", +463 => x"5773772e", +464 => x"098106b6", +465 => x"38b07b34", +466 => x"02b50556", +467 => x"7a762e97", +468 => x"38ff1656", +469 => x"75337570", +470 => x"81055734", +471 => x"8117577a", +472 => x"762e0981", +473 => x"06eb3880", +474 => x"7534767d", +475 => x"ff125758", +476 => x"56758024", +477 => x"fef338fe", +478 => x"8f398a52", +479 => x"7351a0f0", +480 => x"3f80080b", +481 => x"0b80d484", +482 => x"05337670", +483 => x"81055834", +484 => x"8a527351", +485 => x"a0963f80", +486 => x"08548008", +487 => x"802effac", +488 => x"388a5273", +489 => x"51a0c93f", +490 => x"80080b0b", +491 => x"80d48405", +492 => x"33767081", +493 => x"0558348a", +494 => x"5273519f", +495 => x"ef3f8008", +496 => x"548008ff", +497 => x"b538ff84", +498 => x"39745276", +499 => x"53b43dff", +500 => x"b8055195", +501 => x"b63fa33d", +502 => x"0856fed9", +503 => x"39803d0d", +504 => x"80c10b81", +505 => x"c0f43480", +506 => x"0b81c2d0", +507 => x"0c70800c", +508 => x"823d0d04", +509 => x"ff3d0d80", +510 => x"0b81c0f4", +511 => x"33525270", +512 => x"80c12e99", +513 => x"387181c2", +514 => x"d0080781", +515 => x"c2d00c80", +516 => x"c20b81c0", +517 => x"f8347080", +518 => x"0c833d0d", +519 => x"04810b81", +520 => x"c2d00807", +521 => x"81c2d00c", +522 => x"80c20b81", +523 => x"c0f83470", +524 => x"800c833d", +525 => x"0d04fd3d", +526 => x"0d757008", +527 => x"8a055353", +528 => x"81c0f433", +529 => x"517080c1", +530 => x"2e8b3873", +531 => x"f3387080", +532 => x"0c853d0d", +533 => x"04ff1270", +534 => x"81c0f008", +535 => x"31740c80", +536 => x"0c853d0d", +537 => x"04fc3d0d", +538 => x"81c0fc08", +539 => x"5574802e", +540 => x"8c387675", +541 => x"08710c81", +542 => x"c0fc0856", +543 => x"548c1553", +544 => x"81c0f008", +545 => x"528a5190", +546 => x"f03f7380", +547 => x"0c863d0d", +548 => x"04fb3d0d", +549 => x"77700856", +550 => x"56b05381", +551 => x"c0fc0852", +552 => x"7451acb4", +553 => x"3f850b8c", +554 => x"170c850b", +555 => x"8c160c75", +556 => x"08750c81", +557 => x"c0fc0854", +558 => x"73802e8a", +559 => x"38730875", +560 => x"0c81c0fc", +561 => x"08548c14", +562 => x"5381c0f0", +563 => x"08528a51", +564 => x"90a73f84", +565 => x"1508ad38", +566 => x"860b8c16", +567 => x"0c881552", +568 => x"88160851", +569 => x"8fb33f81", +570 => x"c0fc0870", +571 => x"08760c54", +572 => x"8c157054", +573 => x"548a5273", +574 => x"08518ffd", +575 => x"3f73800c", +576 => x"873d0d04", +577 => x"750854b0", +578 => x"53735275", +579 => x"51abc93f", +580 => x"73800c87", +581 => x"3d0d04d9", +582 => x"3d0db051", +583 => x"9eeb3f80", +584 => x"0881c0ec", +585 => x"0cb0519e", +586 => x"e03f8008", +587 => x"81c0fc0c", +588 => x"81c0ec08", +589 => x"80080c80", +590 => x"0b800884", +591 => x"050c820b", +592 => x"80088805", +593 => x"0ca80b80", +594 => x"088c050c", +595 => x"9f530b0b", +596 => x"80d49052", +597 => x"80089005", +598 => x"51aafd3f", +599 => x"a13d5e9f", +600 => x"530b0b80", +601 => x"d4b0527d", +602 => x"51aaed3f", +603 => x"8a0b80ff", +604 => x"b00c0b0b", +605 => x"80ded451", +606 => x"f9b43f0b", +607 => x"0b80d4d0", +608 => x"51f9ab3f", +609 => x"0b0b80de", +610 => x"d451f9a2", +611 => x"3f80e2b4", +612 => x"08802e8a", +613 => x"cf380b0b", +614 => x"80d58051", +615 => x"f9903f0b", +616 => x"0b80ded4", +617 => x"51f9873f", +618 => x"80e2b008", +619 => x"520b0b80", +620 => x"d5ac51f8", +621 => x"f93f80f2", +622 => x"cc51bbf8", +623 => x"3f810b9a", +624 => x"3d5e5b80", +625 => x"0b80e2b0", +626 => x"082582d6", +627 => x"38903d5f", +628 => x"80c10b81", +629 => x"c0f43481", +630 => x"0b81c2d0", +631 => x"0c80c20b", +632 => x"81c0f834", +633 => x"8240835a", +634 => x"9f530b0b", +635 => x"80d5dc52", +636 => x"7c51a9e4", +637 => x"3f814180", +638 => x"7d537e52", +639 => x"568f9e3f", +640 => x"8008762e", +641 => x"09810683", +642 => x"38815675", +643 => x"81c2d00c", +644 => x"7f705856", +645 => x"758325a2", +646 => x"38751010", +647 => x"16fd0542", +648 => x"a93dffa4", +649 => x"05538352", +650 => x"76518dcd", +651 => x"3f7f8105", +652 => x"70417058", +653 => x"56837624", +654 => x"e0386154", +655 => x"755380f2", +656 => x"d45281c1", +657 => x"88518dc1", +658 => x"3f81c0fc", +659 => x"08700858", +660 => x"58b05377", +661 => x"527651a8", +662 => x"ff3f850b", +663 => x"8c190c85", +664 => x"0b8c180c", +665 => x"7708770c", +666 => x"81c0fc08", +667 => x"5675802e", +668 => x"8a387508", +669 => x"770c81c0", +670 => x"fc08568c", +671 => x"165381c0", +672 => x"f008528a", +673 => x"518cf23f", +674 => x"84170888", +675 => x"e038860b", +676 => x"8c180c88", +677 => x"17528818", +678 => x"08518bfd", +679 => x"3f81c0fc", +680 => x"08700878", +681 => x"0c568c17", +682 => x"7054598a", +683 => x"52780851", +684 => x"8cc73f80", +685 => x"c10b81c0", +686 => x"f8335757", +687 => x"767626a2", +688 => x"3880c352", +689 => x"76518dab", +690 => x"3f800861", +691 => x"2e8aec38", +692 => x"81177081", +693 => x"ff0681c0", +694 => x"f8335858", +695 => x"58757727", +696 => x"e0387960", +697 => x"29627054", +698 => x"71535b59", +699 => x"99be3f80", +700 => x"0840787a", +701 => x"31708729", +702 => x"80083180", +703 => x"088a0581", +704 => x"c0f43381", +705 => x"c0f0085e", +706 => x"5b525a56", +707 => x"7780c12e", +708 => x"8ad8387b", +709 => x"f738811b", +710 => x"5b80e2b0", +711 => x"087b25fd", +712 => x"af3881c0", +713 => x"e451b98c", +714 => x"3f0b0b80", +715 => x"d5fc51f5", +716 => x"fd3f0b0b", +717 => x"80ded451", +718 => x"f5f43f0b", +719 => x"0b80d68c", +720 => x"51f5eb3f", +721 => x"0b0b80de", +722 => x"d451f5e2", +723 => x"3f81c0f0", +724 => x"08520b0b", +725 => x"80d6c451", +726 => x"f5d43f85", +727 => x"520b0b80", +728 => x"d6e051f5", +729 => x"c93f81c2", +730 => x"d008520b", +731 => x"0b80d6fc", +732 => x"51f5bb3f", +733 => x"81520b0b", +734 => x"80d6e051", +735 => x"f5b03f81", +736 => x"c0f43352", +737 => x"0b0b80d7", +738 => x"9851f5a2", +739 => x"3f80c152", +740 => x"0b0b80d7", +741 => x"b451f596", +742 => x"3f81c0f8", +743 => x"33520b0b", +744 => x"80d7d051", +745 => x"f5883f80", +746 => x"c2520b0b", +747 => x"80d7b451", +748 => x"f4fc3f81", +749 => x"c1a80852", +750 => x"0b0b80d7", +751 => x"ec51f4ee", +752 => x"3f87520b", +753 => x"0b80d6e0", +754 => x"51f4e33f", +755 => x"80ffb008", +756 => x"520b0b80", +757 => x"d88851f4", +758 => x"d53f0b0b", +759 => x"80d8a451", +760 => x"f4cc3f0b", +761 => x"0b80d8d0", +762 => x"51f4c33f", +763 => x"81c0fc08", +764 => x"7008535a", +765 => x"0b0b80d8", +766 => x"dc51f4b2", +767 => x"3f0b0b80", +768 => x"d8f851f4", +769 => x"a93f81c0", +770 => x"fc088411", +771 => x"0853560b", +772 => x"0b80d9ac", +773 => x"51f4973f", +774 => x"80520b0b", +775 => x"80d6e051", +776 => x"f48c3f81", +777 => x"c0fc0888", +778 => x"11085358", +779 => x"0b0b80d9", +780 => x"c851f3fa", +781 => x"3f82520b", +782 => x"0b80d6e0", +783 => x"51f3ef3f", +784 => x"81c0fc08", +785 => x"8c110853", +786 => x"570b0b80", +787 => x"d9e451f3", +788 => x"dd3f9152", +789 => x"0b0b80d6", +790 => x"e051f3d2", +791 => x"3f81c0fc", +792 => x"08900552", +793 => x"0b0b80da", +794 => x"8051f3c2", +795 => x"3f0b0b80", +796 => x"da9c51f3", +797 => x"b93f0b0b", +798 => x"80dad451", +799 => x"f3b03f81", +800 => x"c0ec0870", +801 => x"08535f0b", +802 => x"0b80d8dc", +803 => x"51f39f3f", +804 => x"0b0b80da", +805 => x"e851f396", +806 => x"3f81c0ec", +807 => x"08841108", +808 => x"535b0b0b", +809 => x"80d9ac51", +810 => x"f3843f80", +811 => x"520b0b80", +812 => x"d6e051f2", +813 => x"f93f81c0", +814 => x"ec088811", +815 => x"08535c0b", +816 => x"0b80d9c8", +817 => x"51f2e73f", +818 => x"81520b0b", +819 => x"80d6e051", +820 => x"f2dc3f81", +821 => x"c0ec088c", +822 => x"1108535a", +823 => x"0b0b80d9", +824 => x"e451f2ca", +825 => x"3f92520b", +826 => x"0b80d6e0", +827 => x"51f2bf3f", +828 => x"81c0ec08", +829 => x"9005520b", +830 => x"0b80da80", +831 => x"51f2af3f", +832 => x"0b0b80da", +833 => x"9c51f2a6", +834 => x"3f7f520b", +835 => x"0b80dba8", +836 => x"51f29b3f", +837 => x"85520b0b", +838 => x"80d6e051", +839 => x"f2903f78", +840 => x"520b0b80", +841 => x"dbc451f2", +842 => x"853f8d52", +843 => x"0b0b80d6", +844 => x"e051f1fa", +845 => x"3f61520b", +846 => x"0b80dbe0", +847 => x"51f1ef3f", +848 => x"87520b0b", +849 => x"80d6e051", +850 => x"f1e43f60", +851 => x"520b0b80", +852 => x"dbfc51f1", +853 => x"d93f8152", +854 => x"0b0b80d6", +855 => x"e051f1ce", +856 => x"3f7d520b", +857 => x"0b80dc98", +858 => x"51f1c33f", +859 => x"0b0b80dc", +860 => x"b451f1ba", +861 => x"3f7c520b", +862 => x"0b80dcec", +863 => x"51f1af3f", +864 => x"0b0b80dd", +865 => x"8851f1a6", +866 => x"3f0b0b80", +867 => x"ded451f1", +868 => x"9d3f81c0", +869 => x"e40881c0", +870 => x"e80880f2", +871 => x"cc0880f2", +872 => x"d0087271", +873 => x"31707426", +874 => x"75743170", +875 => x"723180f2", +876 => x"c40c4444", +877 => x"80f2c80c", +878 => x"80f2c808", +879 => x"560b0b80", +880 => x"ddc0555c", +881 => x"595758f0", +882 => x"e53f80f2", +883 => x"c4085680", +884 => x"762582b1", +885 => x"3880e2b0", +886 => x"0870719f", +887 => x"2c9a3d53", +888 => x"565680f2", +889 => x"c40880f2", +890 => x"c8084153", +891 => x"7f547052", +892 => x"5a8a8d3f", +893 => x"66685f80", +894 => x"f2b40c7d", +895 => x"80f2b80c", +896 => x"80e2b008", +897 => x"709f2c58", +898 => x"568058bd", +899 => x"84c07855", +900 => x"55765275", +901 => x"53795187", +902 => x"f33f953d", +903 => x"80f2c408", +904 => x"80f2c808", +905 => x"41557f56", +906 => x"67694053", +907 => x"7e547052", +908 => x"5c89cd3f", +909 => x"64665e80", +910 => x"f2bc0c7c", +911 => x"80f2c00c", +912 => x"80e2b008", +913 => x"709f2c40", +914 => x"58805783", +915 => x"dceb9480", +916 => x"7755557e", +917 => x"5277537b", +918 => x"5187b13f", +919 => x"64665d5b", +920 => x"805e8ddd", +921 => x"7e555580", +922 => x"f2c40880", +923 => x"f2c80859", +924 => x"52775379", +925 => x"5187953f", +926 => x"66684054", +927 => x"7e557a52", +928 => x"7b53a93d", +929 => x"ffa80551", +930 => x"88f63f62", +931 => x"645e81c1", +932 => x"800c7c81", +933 => x"c1840c0b", +934 => x"0b80ddd0", +935 => x"51ef8f3f", +936 => x"80f2b808", +937 => x"520b0b80", +938 => x"de8051ef", +939 => x"813f0b0b", +940 => x"80de8851", +941 => x"eef83f80", +942 => x"f2c00852", +943 => x"0b0b80de", +944 => x"8051eeea", +945 => x"3f81c184", +946 => x"08520b0b", +947 => x"80deb851", +948 => x"eedc3f0b", +949 => x"0b80ded4", +950 => x"51eed33f", +951 => x"800b800c", +952 => x"a93d0d04", +953 => x"0b0b80de", +954 => x"d851f5b0", +955 => x"39770857", +956 => x"b0537652", +957 => x"77519fe0", +958 => x"3f80c10b", +959 => x"81c0f833", +960 => x"5757f7b8", +961 => x"39758a38", +962 => x"80f2c808", +963 => x"8126fdc5", +964 => x"380b0b80", +965 => x"df8851ee", +966 => x"953f0b0b", +967 => x"80dfc051", +968 => x"ee8c3f0b", +969 => x"0b80ded4", +970 => x"51ee833f", +971 => x"80e2b008", +972 => x"70719f2c", +973 => x"9a3d5356", +974 => x"5680f2c4", +975 => x"0880f2c8", +976 => x"0841537f", +977 => x"5470525a", +978 => x"87b63f66", +979 => x"685f80f2", +980 => x"b40c7d80", +981 => x"f2b80c80", +982 => x"e2b00870", +983 => x"9f2c5856", +984 => x"8058bd84", +985 => x"c0785555", +986 => x"76527553", +987 => x"7951859c", +988 => x"3f953d80", +989 => x"f2c40880", +990 => x"f2c80841", +991 => x"557f5667", +992 => x"6940537e", +993 => x"5470525c", +994 => x"86f63f64", +995 => x"665e80f2", +996 => x"bc0c7c80", +997 => x"f2c00c80", +998 => x"e2b00870", +999 => x"9f2c4058", +1000 => x"805783dc", +1001 => x"eb948077", +1002 => x"55557e52", +1003 => x"77537b51", +1004 => x"84da3f64", +1005 => x"665d5b80", +1006 => x"5e8ddd7e", +1007 => x"555580f2", +1008 => x"c40880f2", +1009 => x"c8085952", +1010 => x"77537951", +1011 => x"84be3f66", +1012 => x"6840547e", +1013 => x"557a527b", +1014 => x"53a93dff", +1015 => x"a8055186", +1016 => x"9f3f6264", +1017 => x"5e81c180", +1018 => x"0c7c81c1", +1019 => x"840c0b0b", +1020 => x"80ddd051", +1021 => x"ecb83f80", +1022 => x"f2b80852", +1023 => x"0b0b80de", +1024 => x"8051ecaa", +1025 => x"3f0b0b80", +1026 => x"de8851ec", +1027 => x"a13f80f2", +1028 => x"c008520b", +1029 => x"0b80de80", +1030 => x"51ec933f", +1031 => x"81c18408", +1032 => x"520b0b80", +1033 => x"deb851ec", +1034 => x"853f0b0b", +1035 => x"80ded451", +1036 => x"ebfc3f80", +1037 => x"0b800ca9", +1038 => x"3d0d04a9", +1039 => x"3dffa005", +1040 => x"52805180", +1041 => x"d43f9f53", +1042 => x"0b0b80df", +1043 => x"e0527c51", +1044 => x"9d863f7a", +1045 => x"7b81c0f0", +1046 => x"0c811870", +1047 => x"81ff0681", +1048 => x"c0f83359", +1049 => x"59595af4", +1050 => x"f439ff16", +1051 => x"707b3160", +1052 => x"0c5c800b", +1053 => x"811c5c5c", +1054 => x"80e2b008", +1055 => x"7b25f2d0", +1056 => x"38f59f39", +1057 => x"ff3d0d73", +1058 => x"82327030", +1059 => x"70720780", +1060 => x"25800c52", +1061 => x"52833d0d", +1062 => x"04fe3d0d", +1063 => x"74767153", +1064 => x"54527182", +1065 => x"2e833883", +1066 => x"5171812e", +1067 => x"9a388172", +1068 => x"269f3871", +1069 => x"822eb838", +1070 => x"71842ea9", +1071 => x"3870730c", +1072 => x"70800c84", +1073 => x"3d0d0480", +1074 => x"e40b81c0", +1075 => x"f008258b", +1076 => x"3880730c", +1077 => x"70800c84", +1078 => x"3d0d0483", +1079 => x"730c7080", +1080 => x"0c843d0d", +1081 => x"0482730c", +1082 => x"70800c84", +1083 => x"3d0d0481", +1084 => x"730c7080", +1085 => x"0c843d0d", +1086 => x"04803d0d", +1087 => x"74741482", +1088 => x"05710c80", +1089 => x"0c823d0d", +1090 => x"04f73d0d", +1091 => x"7b7d7f61", +1092 => x"85127082", +1093 => x"2b751170", +1094 => x"74717084", +1095 => x"05530c5a", +1096 => x"5a5d5b76", +1097 => x"0c7980f8", +1098 => x"180c7986", +1099 => x"12525758", +1100 => x"5a5a7676", +1101 => x"24993876", +1102 => x"b329822b", +1103 => x"79115153", +1104 => x"76737084", +1105 => x"05550c81", +1106 => x"14547574", +1107 => x"25f23876", +1108 => x"81cc2919", +1109 => x"fc110881", +1110 => x"05fc120c", +1111 => x"7a197008", +1112 => x"9fa0130c", +1113 => x"5856850b", +1114 => x"81c0f00c", +1115 => x"75800c8b", +1116 => x"3d0d04fe", +1117 => x"3d0d0293", +1118 => x"05335180", +1119 => x"02840597", +1120 => x"05335452", +1121 => x"70732e88", +1122 => x"3871800c", +1123 => x"843d0d04", +1124 => x"7081c0f4", +1125 => x"34810b80", +1126 => x"0c843d0d", +1127 => x"04f83d0d", +1128 => x"7a7c5956", +1129 => x"820b8319", +1130 => x"55557416", +1131 => x"70337533", +1132 => x"5b515372", +1133 => x"792e80c6", +1134 => x"3880c10b", +1135 => x"81168116", +1136 => x"56565782", +1137 => x"7525e338", +1138 => x"ffa91770", +1139 => x"81ff0655", +1140 => x"59738226", +1141 => x"83388755", +1142 => x"81537680", +1143 => x"d22e9838", +1144 => x"77527551", +1145 => x"9bc43f80", +1146 => x"53728008", +1147 => x"25893887", +1148 => x"1581c0f0", +1149 => x"0c815372", +1150 => x"800c8a3d", +1151 => x"0d047281", +1152 => x"c0f43482", +1153 => x"7525ffa2", +1154 => x"38ffbd39", +1155 => x"ef3d0d63", +1156 => x"65675b42", +1157 => x"79436769", +1158 => x"59407741", +1159 => x"5a805d80", +1160 => x"5e617083", +1161 => x"ffff0671", +1162 => x"902a6270", +1163 => x"83ffff06", +1164 => x"71902a74", +1165 => x"72297473", +1166 => x"29757329", +1167 => x"77742973", +1168 => x"902a0572", +1169 => x"11515856", +1170 => x"535f5a57", +1171 => x"5a585558", +1172 => x"73732786", +1173 => x"38848080", +1174 => x"16567390", +1175 => x"2a165b78", +1176 => x"83ffff06", +1177 => x"74848080", +1178 => x"29055c7a", +1179 => x"7c5a5d78", +1180 => x"5e777f29", +1181 => x"61782905", +1182 => x"7d055d7c", +1183 => x"7e567a0c", +1184 => x"74841b0c", +1185 => x"79800c93", +1186 => x"3d0d04f9", +1187 => x"3d0d797b", +1188 => x"7d545872", +1189 => x"59773079", +1190 => x"70307072", +1191 => x"079f2a73", +1192 => x"71315a52", +1193 => x"59777956", +1194 => x"730c5373", +1195 => x"84130c54", +1196 => x"800c893d", +1197 => x"0d04f93d", +1198 => x"0d797b7d", +1199 => x"7f565452", +1200 => x"5472802e", +1201 => x"a0387057", +1202 => x"7158a073", +1203 => x"31528072", +1204 => x"25a13877", +1205 => x"70742b57", +1206 => x"70732a78", +1207 => x"752b0756", +1208 => x"51747653", +1209 => x"5170740c", +1210 => x"7184150c", +1211 => x"73800c89", +1212 => x"3d0d0480", +1213 => x"56777230", +1214 => x"2b557476", +1215 => x"5351e639", +1216 => x"e43d0d6e", +1217 => x"a13d08a3", +1218 => x"3d085957", +1219 => x"5f80764d", +1220 => x"774ea33d", +1221 => x"08a53d08", +1222 => x"574b754c", +1223 => x"5e7d6c24", +1224 => x"86fb3880", +1225 => x"6a24878f", +1226 => x"38696b58", +1227 => x"566b6d5d", +1228 => x"467b4775", +1229 => x"44764564", +1230 => x"6468685c", +1231 => x"5c565674", +1232 => x"81e73878", +1233 => x"762782c7", +1234 => x"387581ff", +1235 => x"26832b55", +1236 => x"83ffff76", +1237 => x"278c3890", +1238 => x"55fe800a", +1239 => x"76278338", +1240 => x"98557575", +1241 => x"2a80e080", +1242 => x"057033a0", +1243 => x"77317131", +1244 => x"57555774", +1245 => x"802e9538", +1246 => x"75752ba0", +1247 => x"76317a77", +1248 => x"2b7c722a", +1249 => x"077c782b", +1250 => x"5d5b5956", +1251 => x"75902a76", +1252 => x"83ffff06", +1253 => x"71547a53", +1254 => x"59578880", +1255 => x"3f80085b", +1256 => x"87ea3f80", +1257 => x"08800879", +1258 => x"297c902b", +1259 => x"7c902a07", +1260 => x"56565973", +1261 => x"75279438", +1262 => x"8008ff05", +1263 => x"76155559", +1264 => x"75742687", +1265 => x"38747426", +1266 => x"87b93876", +1267 => x"52737531", +1268 => x"5187c93f", +1269 => x"80085587", +1270 => x"b33f8008", +1271 => x"80087929", +1272 => x"7b83ffff", +1273 => x"0677902b", +1274 => x"07565957", +1275 => x"73782796", +1276 => x"388008ff", +1277 => x"05761555", +1278 => x"57757426", +1279 => x"89387774", +1280 => x"26777131", +1281 => x"58567890", +1282 => x"2b770758", +1283 => x"805b7a40", +1284 => x"77417f61", +1285 => x"56547d80", +1286 => x"d938737f", +1287 => x"0c747f84", +1288 => x"050c7e80", +1289 => x"0c9e3d0d", +1290 => x"0480705c", +1291 => x"58747926", +1292 => x"dd387481", +1293 => x"ff26832b", +1294 => x"577483ff", +1295 => x"ff2682a5", +1296 => x"3874772a", +1297 => x"80e08005", +1298 => x"7033a079", +1299 => x"31713159", +1300 => x"5c5d7682", +1301 => x"b3387654", +1302 => x"74792783", +1303 => x"38815479", +1304 => x"76277407", +1305 => x"59815878", +1306 => x"ffa23876", +1307 => x"58805bff", +1308 => x"9d397352", +1309 => x"74539e3d", +1310 => x"e80551fc", +1311 => x"8e3f6769", +1312 => x"567f0c74", +1313 => x"7f84050c", +1314 => x"7e800c9e", +1315 => x"3d0d0475", +1316 => x"802e81c4", +1317 => x"387581ff", +1318 => x"26832b55", +1319 => x"83ffff76", +1320 => x"278c3890", +1321 => x"55fe800a", +1322 => x"76278338", +1323 => x"98557575", +1324 => x"2a80e080", +1325 => x"057033a0", +1326 => x"77317131", +1327 => x"575e5474", +1328 => x"84913878", +1329 => x"76315481", +1330 => x"76902a77", +1331 => x"83ffff06", +1332 => x"5f5d5b7b", +1333 => x"52735185", +1334 => x"c33f8008", +1335 => x"5785ad3f", +1336 => x"80088008", +1337 => x"7e297890", +1338 => x"2b7c902a", +1339 => x"07565659", +1340 => x"73752794", +1341 => x"388008ff", +1342 => x"05761555", +1343 => x"59757426", +1344 => x"87387474", +1345 => x"2684f338", +1346 => x"7b527375", +1347 => x"3151858c", +1348 => x"3f800855", +1349 => x"84f63f80", +1350 => x"0880087e", +1351 => x"297b83ff", +1352 => x"ff067790", +1353 => x"2b075659", +1354 => x"57737827", +1355 => x"96388008", +1356 => x"ff057615", +1357 => x"55577574", +1358 => x"26893877", +1359 => x"74267771", +1360 => x"31585a78", +1361 => x"902b7707", +1362 => x"7b41417f", +1363 => x"6156547d", +1364 => x"802efdc6", +1365 => x"38fe9b39", +1366 => x"75528151", +1367 => x"84ae3f80", +1368 => x"0856feb1", +1369 => x"399057fe", +1370 => x"800a7527", +1371 => x"fdd33898", +1372 => x"75712a80", +1373 => x"e0800570", +1374 => x"33a07331", +1375 => x"7131535d", +1376 => x"5e577680", +1377 => x"2efdcf38", +1378 => x"a0773175", +1379 => x"782b7772", +1380 => x"2a077779", +1381 => x"2b7b7a2b", +1382 => x"7d742a07", +1383 => x"7d7b2b73", +1384 => x"902a7483", +1385 => x"ffff0671", +1386 => x"597f772a", +1387 => x"585e5c41", +1388 => x"5f585c54", +1389 => x"83e63f80", +1390 => x"085483d0", +1391 => x"3f800880", +1392 => x"08792975", +1393 => x"902b7e90", +1394 => x"2a075656", +1395 => x"59737527", +1396 => x"99388008", +1397 => x"ff057b15", +1398 => x"55597a74", +1399 => x"268c3873", +1400 => x"75278738", +1401 => x"ff197b15", +1402 => x"55597652", +1403 => x"73753151", +1404 => x"83aa3f80", +1405 => x"08558394", +1406 => x"3f800880", +1407 => x"0879297d", +1408 => x"83ffff06", +1409 => x"77902b07", +1410 => x"56595773", +1411 => x"78279938", +1412 => x"8008ff05", +1413 => x"7b155557", +1414 => x"7a74268c", +1415 => x"38737827", +1416 => x"8738ff17", +1417 => x"7b155557", +1418 => x"73783179", +1419 => x"902b7807", +1420 => x"7083ffff", +1421 => x"0671902a", +1422 => x"7983ffff", +1423 => x"067a902a", +1424 => x"73722973", +1425 => x"73297473", +1426 => x"29767429", +1427 => x"73902a05", +1428 => x"72055755", +1429 => x"435f5b58", +1430 => x"5a57595a", +1431 => x"747c2786", +1432 => x"38848080", +1433 => x"17577490", +1434 => x"2a177983", +1435 => x"ffff0676", +1436 => x"84808029", +1437 => x"05575776", +1438 => x"7a269a38", +1439 => x"767a3270", +1440 => x"30707207", +1441 => x"8025565a", +1442 => x"5b7c7627", +1443 => x"fafe3873", +1444 => x"802efaf8", +1445 => x"38ff1858", +1446 => x"805bfaf2", +1447 => x"39ff7653", +1448 => x"77549f3d", +1449 => x"e805525e", +1450 => x"f7e13f67", +1451 => x"69574c75", +1452 => x"4d698025", +1453 => x"f8f3387d", +1454 => x"096a6c5c", +1455 => x"537a549f", +1456 => x"3de80552", +1457 => x"5ef7c43f", +1458 => x"6769714c", +1459 => x"704d5856", +1460 => x"f8db39a0", +1461 => x"75317676", +1462 => x"2b7a772b", +1463 => x"7c732a07", +1464 => x"7c782b72", +1465 => x"902a7383", +1466 => x"ffff0671", +1467 => x"587e762a", +1468 => x"5742405d", +1469 => x"5d575881", +1470 => x"a33f8008", +1471 => x"57818d3f", +1472 => x"80088008", +1473 => x"7e297890", +1474 => x"2b7d902a", +1475 => x"07565659", +1476 => x"73752799", +1477 => x"388008ff", +1478 => x"05761555", +1479 => x"59757426", +1480 => x"8c387375", +1481 => x"278738ff", +1482 => x"19761555", +1483 => x"597b5273", +1484 => x"75315180", +1485 => x"e73f8008", +1486 => x"5580d13f", +1487 => x"80088008", +1488 => x"7e297c83", +1489 => x"ffff0670", +1490 => x"78902b07", +1491 => x"51565858", +1492 => x"73772799", +1493 => x"388008ff", +1494 => x"05761555", +1495 => x"58757426", +1496 => x"8c387377", +1497 => x"278738ff", +1498 => x"18761555", +1499 => x"5878902b", +1500 => x"78077478", +1501 => x"31555bfa", +1502 => x"da39ff19", +1503 => x"76155559", +1504 => x"fb8639ff", +1505 => x"19761555", +1506 => x"59f8c039", +1507 => x"fe3d0d80", +1508 => x"53755274", +1509 => x"5181913f", +1510 => x"843d0d04", +1511 => x"fe3d0d81", +1512 => x"53755274", +1513 => x"5181813f", +1514 => x"843d0d04", +1515 => x"fb3d0d77", +1516 => x"79555580", +1517 => x"56757524", +1518 => x"ab388074", +1519 => x"249d3880", +1520 => x"53735274", +1521 => x"5180e13f", +1522 => x"80085475", +1523 => x"802e8538", +1524 => x"80083054", +1525 => x"73800c87", +1526 => x"3d0d0473", +1527 => x"30768132", +1528 => x"5754dc39", +1529 => x"74305581", +1530 => x"56738025", +1531 => x"d238ec39", +1532 => x"fa3d0d78", +1533 => x"7a575580", +1534 => x"57767524", +1535 => x"a438759f", +1536 => x"2c548153", +1537 => x"75743274", +1538 => x"31527451", +1539 => x"9b3f8008", +1540 => x"5476802e", +1541 => x"85388008", +1542 => x"30547380", +1543 => x"0c883d0d", +1544 => x"04743055", +1545 => x"8157d739", +1546 => x"fc3d0d76", +1547 => x"78535481", +1548 => x"53807473", +1549 => x"26525572", +1550 => x"802e9838", +1551 => x"70802eab", +1552 => x"38807224", +1553 => x"a6387110", +1554 => x"73107572", +1555 => x"26535452", +1556 => x"72ea3873", +1557 => x"51788338", +1558 => x"74517080", +1559 => x"0c863d0d", +1560 => x"04720a10", +1561 => x"0a720a10", +1562 => x"0a535372", +1563 => x"802ee438", +1564 => x"717426ed", +1565 => x"38737231", +1566 => x"75740774", +1567 => x"0a100a74", +1568 => x"0a100a55", +1569 => x"555654e3", +1570 => x"39ff3d0d", +1571 => x"735280ea", +1572 => x"fc085196", +1573 => x"3f833d0d", +1574 => x"04ff3d0d", +1575 => x"735280ea", +1576 => x"fc085190", +1577 => x"cc3f833d", +1578 => x"0d04f43d", +1579 => x"0d7e608b", +1580 => x"1170f806", +1581 => x"5b55555d", +1582 => x"72962683", +1583 => x"38905880", +1584 => x"78247479", +1585 => x"26075580", +1586 => x"5474742e", +1587 => x"09810680", +1588 => x"ca387c51", +1589 => x"8d9e3f77", +1590 => x"83f72680", +1591 => x"c5387783", +1592 => x"2a701010", +1593 => x"1080e2f4", +1594 => x"058c1108", +1595 => x"58585475", +1596 => x"772e81f0", +1597 => x"38841608", +1598 => x"fc068c17", +1599 => x"08881808", +1600 => x"718c120c", +1601 => x"88120c5b", +1602 => x"76058411", +1603 => x"08810784", +1604 => x"120c537c", +1605 => x"518cde3f", +1606 => x"88165473", +1607 => x"800c8e3d", +1608 => x"0d047789", +1609 => x"2a78832a", +1610 => x"58547380", +1611 => x"2ebf3877", +1612 => x"862ab805", +1613 => x"57847427", +1614 => x"b43880db", +1615 => x"14579474", +1616 => x"27ab3877", +1617 => x"8c2a80ee", +1618 => x"055780d4", +1619 => x"74279e38", +1620 => x"778f2a80", +1621 => x"f7055782", +1622 => x"d4742791", +1623 => x"3877922a", +1624 => x"80fc0557", +1625 => x"8ad47427", +1626 => x"843880fe", +1627 => x"57761010", +1628 => x"1080e2f4", +1629 => x"058c1108", +1630 => x"56537473", +1631 => x"2ea33884", +1632 => x"1508fc06", +1633 => x"70793155", +1634 => x"56738f24", +1635 => x"88e43873", +1636 => x"802588e6", +1637 => x"388c1508", +1638 => x"5574732e", +1639 => x"098106df", +1640 => x"38811759", +1641 => x"80e38408", +1642 => x"567580e2", +1643 => x"fc2e82cc", +1644 => x"38841608", +1645 => x"fc067079", +1646 => x"31555573", +1647 => x"8f24bb38", +1648 => x"80e2fc0b", +1649 => x"80e3880c", +1650 => x"80e2fc0b", +1651 => x"80e3840c", +1652 => x"80742480", +1653 => x"db387416", +1654 => x"84110881", +1655 => x"0784120c", +1656 => x"53feb039", +1657 => x"88168c11", +1658 => x"08575975", +1659 => x"792e0981", +1660 => x"06fe8238", +1661 => x"821459ff", +1662 => x"ab397716", +1663 => x"78810784", +1664 => x"180c7080", +1665 => x"e3880c70", +1666 => x"80e3840c", +1667 => x"80e2fc0b", +1668 => x"8c120c8c", +1669 => x"11088812", +1670 => x"0c748107", +1671 => x"84120c74", +1672 => x"0574710c", +1673 => x"5b7c518a", +1674 => x"cc3f8816", +1675 => x"54fdec39", +1676 => x"83ff7527", +1677 => x"83913874", +1678 => x"892a7583", +1679 => x"2a545473", +1680 => x"802ebf38", +1681 => x"74862ab8", +1682 => x"05538474", +1683 => x"27b43880", +1684 => x"db145394", +1685 => x"7427ab38", +1686 => x"748c2a80", +1687 => x"ee055380", +1688 => x"d474279e", +1689 => x"38748f2a", +1690 => x"80f70553", +1691 => x"82d47427", +1692 => x"91387492", +1693 => x"2a80fc05", +1694 => x"538ad474", +1695 => x"27843880", +1696 => x"fe537210", +1697 => x"101080e2", +1698 => x"f4058811", +1699 => x"08555773", +1700 => x"772e868b", +1701 => x"38841408", +1702 => x"fc065b74", +1703 => x"7b278d38", +1704 => x"88140854", +1705 => x"73772e09", +1706 => x"8106ea38", +1707 => x"8c140880", +1708 => x"e2f40b84", +1709 => x"0508718c", +1710 => x"190c7588", +1711 => x"190c7788", +1712 => x"130c5c57", +1713 => x"758c150c", +1714 => x"78538079", +1715 => x"24839838", +1716 => x"72822c81", +1717 => x"712b5656", +1718 => x"747b2680", +1719 => x"ca387a75", +1720 => x"06577682", +1721 => x"a33878fc", +1722 => x"06840559", +1723 => x"7410707c", +1724 => x"06555573", +1725 => x"82923884", +1726 => x"1959f139", +1727 => x"80e2f40b", +1728 => x"84050879", +1729 => x"545b7880", +1730 => x"25c63882", +1731 => x"da397409", +1732 => x"7b067080", +1733 => x"e2f40b84", +1734 => x"050c5b74", +1735 => x"1055747b", +1736 => x"26853874", +1737 => x"85bc3880", +1738 => x"e2f40b88", +1739 => x"05087084", +1740 => x"1208fc06", +1741 => x"707b317b", +1742 => x"72268f72", +1743 => x"25075d57", +1744 => x"5c5c5578", +1745 => x"802e80d9", +1746 => x"38791580", +1747 => x"e2ec0819", +1748 => x"90115954", +1749 => x"5680e2e8", +1750 => x"08ff2e88", +1751 => x"38a08f13", +1752 => x"e0800657", +1753 => x"76527c51", +1754 => x"888c3f80", +1755 => x"08548008", +1756 => x"ff2e9038", +1757 => x"80087627", +1758 => x"82a73874", +1759 => x"80e2f42e", +1760 => x"829f3880", +1761 => x"e2f40b88", +1762 => x"05085584", +1763 => x"1508fc06", +1764 => x"70793179", +1765 => x"72268f72", +1766 => x"25075d55", +1767 => x"5a7a83f2", +1768 => x"38778107", +1769 => x"84160c77", +1770 => x"157080e2", +1771 => x"f40b8805", +1772 => x"0c748107", +1773 => x"84120c56", +1774 => x"7c5187b9", +1775 => x"3f881554", +1776 => x"73800c8e", +1777 => x"3d0d0474", +1778 => x"832a7054", +1779 => x"54807424", +1780 => x"819b3872", +1781 => x"822c8171", +1782 => x"2b80e2f8", +1783 => x"08077080", +1784 => x"e2f40b84", +1785 => x"050c7510", +1786 => x"101080e2", +1787 => x"f4058811", +1788 => x"08718c1b", +1789 => x"0c70881b", +1790 => x"0c798813", +1791 => x"0c57555c", +1792 => x"55758c15", +1793 => x"0cfdc139", +1794 => x"78791010", +1795 => x"1080e2f4", +1796 => x"0570565b", +1797 => x"5c8c1408", +1798 => x"5675742e", +1799 => x"a3388416", +1800 => x"08fc0670", +1801 => x"79315853", +1802 => x"768f2483", +1803 => x"f1387680", +1804 => x"2584af38", +1805 => x"8c160856", +1806 => x"75742e09", +1807 => x"8106df38", +1808 => x"8814811a", +1809 => x"70830655", +1810 => x"5a5472c9", +1811 => x"387b8306", +1812 => x"5675802e", +1813 => x"fdb838ff", +1814 => x"1cf81b5b", +1815 => x"5c881a08", +1816 => x"7a2eea38", +1817 => x"fdb53983", +1818 => x"1953fce4", +1819 => x"39831470", +1820 => x"822c8171", +1821 => x"2b80e2f8", +1822 => x"08077080", +1823 => x"e2f40b84", +1824 => x"050c7610", +1825 => x"101080e2", +1826 => x"f4058811", +1827 => x"08718c1c", +1828 => x"0c70881c", +1829 => x"0c7a8813", +1830 => x"0c58535d", +1831 => x"5653fee1", +1832 => x"3980e2b8", +1833 => x"08175980", +1834 => x"08762e81", +1835 => x"8b3880e2", +1836 => x"e808ff2e", +1837 => x"848e3873", +1838 => x"76311980", +1839 => x"e2b80c73", +1840 => x"87067056", +1841 => x"5372802e", +1842 => x"88388873", +1843 => x"31701555", +1844 => x"5576149f", +1845 => x"ff06a080", +1846 => x"71311670", +1847 => x"547e5351", +1848 => x"5385933f", +1849 => x"80085680", +1850 => x"08ff2e81", +1851 => x"9e3880e2", +1852 => x"b8081370", +1853 => x"80e2b80c", +1854 => x"747580e2", +1855 => x"f40b8805", +1856 => x"0c777631", +1857 => x"15810755", +1858 => x"56597a80", +1859 => x"e2f42e83", +1860 => x"c038798f", +1861 => x"2682ef38", +1862 => x"810b8415", +1863 => x"0c841508", +1864 => x"fc067079", +1865 => x"31797226", +1866 => x"8f722507", +1867 => x"5d555a7a", +1868 => x"802efced", +1869 => x"3880db39", +1870 => x"80089fff", +1871 => x"065574fe", +1872 => x"ed387880", +1873 => x"e2b80c80", +1874 => x"e2f40b88", +1875 => x"05087a18", +1876 => x"81078412", +1877 => x"0c5580e2", +1878 => x"e4087927", +1879 => x"86387880", +1880 => x"e2e40c80", +1881 => x"e2e00879", +1882 => x"27fca038", +1883 => x"7880e2e0", +1884 => x"0c841508", +1885 => x"fc067079", +1886 => x"31797226", +1887 => x"8f722507", +1888 => x"5d555a7a", +1889 => x"802efc99", +1890 => x"38883980", +1891 => x"745753fe", +1892 => x"dd397c51", +1893 => x"83df3f80", +1894 => x"0b800c8e", +1895 => x"3d0d0480", +1896 => x"7324a538", +1897 => x"72822c81", +1898 => x"712b80e2", +1899 => x"f8080770", +1900 => x"80e2f40b", +1901 => x"84050c5c", +1902 => x"5a768c17", +1903 => x"0c738817", +1904 => x"0c758818", +1905 => x"0cf9fd39", +1906 => x"83137082", +1907 => x"2c81712b", +1908 => x"80e2f808", +1909 => x"077080e2", +1910 => x"f40b8405", +1911 => x"0c5d5b53", +1912 => x"d8397a75", +1913 => x"065c7bfc", +1914 => x"9f388419", +1915 => x"75105659", +1916 => x"f139ff17", +1917 => x"810559f7", +1918 => x"ab398c15", +1919 => x"08881608", +1920 => x"718c120c", +1921 => x"88120c59", +1922 => x"75158411", +1923 => x"08810784", +1924 => x"120c587c", +1925 => x"5182de3f", +1926 => x"881554fb", +1927 => x"a3397716", +1928 => x"78810784", +1929 => x"180c8c17", +1930 => x"08881808", +1931 => x"718c120c", +1932 => x"88120c5c", +1933 => x"7080e388", +1934 => x"0c7080e3", +1935 => x"840c80e2", +1936 => x"fc0b8c12", +1937 => x"0c8c1108", +1938 => x"88120c77", +1939 => x"81078412", +1940 => x"0c770577", +1941 => x"710c557c", +1942 => x"51829a3f", +1943 => x"881654f5", +1944 => x"ba397216", +1945 => x"84110881", +1946 => x"0784120c", +1947 => x"588c1608", +1948 => x"88170871", +1949 => x"8c120c88", +1950 => x"120c577c", +1951 => x"5181f63f", +1952 => x"881654f5", +1953 => x"96397284", +1954 => x"150cf41a", +1955 => x"f8067084", +1956 => x"1d088106", +1957 => x"07841d0c", +1958 => x"701c5556", +1959 => x"850b8415", +1960 => x"0c850b88", +1961 => x"150c8f76", +1962 => x"27fdab38", +1963 => x"881b527c", +1964 => x"5184be3f", +1965 => x"80e2f40b", +1966 => x"88050880", +1967 => x"e2b8085a", +1968 => x"55fd9339", +1969 => x"7880e2b8", +1970 => x"0c7380e2", +1971 => x"e80cfbef", +1972 => x"39728415", +1973 => x"0cfcff39", +1974 => x"fb3d0d77", +1975 => x"707a7c58", +1976 => x"5553568f", +1977 => x"752780e6", +1978 => x"38727607", +1979 => x"83065170", +1980 => x"80dc3875", +1981 => x"73525470", +1982 => x"70840552", +1983 => x"08747084", +1984 => x"05560c73", +1985 => x"71708405", +1986 => x"53087170", +1987 => x"8405530c", +1988 => x"71708405", +1989 => x"53087170", +1990 => x"8405530c", +1991 => x"71708405", +1992 => x"53087170", +1993 => x"8405530c", +1994 => x"f0165654", +1995 => x"748f26c7", +1996 => x"38837527", +1997 => x"95387070", +1998 => x"84055208", +1999 => x"74708405", +2000 => x"560cfc15", +2001 => x"55748326", +2002 => x"ed387371", +2003 => x"5452ff15", +2004 => x"5170ff2e", +2005 => x"98387270", +2006 => x"81055433", +2007 => x"72708105", +2008 => x"5434ff11", +2009 => x"5170ff2e", +2010 => x"098106ea", +2011 => x"3875800c", +2012 => x"873d0d04", +2013 => x"0404fd3d", +2014 => x"0d800b81", +2015 => x"c2d40c76", +2016 => x"5187ca3f", +2017 => x"80085380", +2018 => x"08ff2e88", +2019 => x"3872800c", +2020 => x"853d0d04", +2021 => x"81c2d408", +2022 => x"5473802e", +2023 => x"f0387574", +2024 => x"710c5272", +2025 => x"800c853d", +2026 => x"0d04fb3d", +2027 => x"0d777970", +2028 => x"72078306", +2029 => x"53545270", +2030 => x"93387173", +2031 => x"73085456", +2032 => x"54717308", +2033 => x"2e80c438", +2034 => x"73755452", +2035 => x"71337081", +2036 => x"ff065254", +2037 => x"70802e9d", +2038 => x"38723355", +2039 => x"70752e09", +2040 => x"81069538", +2041 => x"81128114", +2042 => x"71337081", +2043 => x"ff065456", +2044 => x"545270e5", +2045 => x"38723355", +2046 => x"7381ff06", +2047 => x"7581ff06", +2048 => x"71713180", +2049 => x"0c555287", +2050 => x"3d0d0471", +2051 => x"09f7fbfd", +2052 => x"ff1306f8", +2053 => x"84828180", +2054 => x"06527197", +2055 => x"38841484", +2056 => x"16710854", +2057 => x"56547175", +2058 => x"082ee038", +2059 => x"73755452", +2060 => x"ff9a3980", +2061 => x"0b800c87", +2062 => x"3d0d04fb", +2063 => x"3d0d7770", +2064 => x"5256feb0", +2065 => x"3f80e2f4", +2066 => x"0b880508", +2067 => x"841108fc", +2068 => x"06707b31", +2069 => x"9fef05e0", +2070 => x"8006e080", +2071 => x"05525555", +2072 => x"a0807524", +2073 => x"94388052", +2074 => x"7551fe8a", +2075 => x"3f80e2fc", +2076 => x"08145372", +2077 => x"80082e8f", +2078 => x"387551fd", +2079 => x"f83f8053", +2080 => x"72800c87", +2081 => x"3d0d0474", +2082 => x"30527551", +2083 => x"fde83f80", +2084 => x"08ff2ea8", +2085 => x"3880e2f4", +2086 => x"0b880508", +2087 => x"74763181", +2088 => x"0784120c", +2089 => x"5380e2b8", +2090 => x"08753180", +2091 => x"e2b80c75", +2092 => x"51fdc23f", +2093 => x"810b800c", +2094 => x"873d0d04", +2095 => x"80527551", +2096 => x"fdb43f80", +2097 => x"e2f40b88", +2098 => x"05088008", +2099 => x"71315454", +2100 => x"8f7325ff", +2101 => x"a4388008", +2102 => x"80e2e808", +2103 => x"3180e2b8", +2104 => x"0c728107", +2105 => x"84150c75", +2106 => x"51fd8a3f", +2107 => x"8053ff90", +2108 => x"39f73d0d", +2109 => x"7b7d545a", +2110 => x"72802e82", +2111 => x"83387951", +2112 => x"fcf23ff8", +2113 => x"13841108", +2114 => x"70fe0670", +2115 => x"13841108", +2116 => x"fc065c57", +2117 => x"58545780", +2118 => x"e2fc0874", +2119 => x"2e82de38", +2120 => x"7784150c", +2121 => x"80738106", +2122 => x"56597479", +2123 => x"2e81d538", +2124 => x"77148411", +2125 => x"08810656", +2126 => x"5374a038", +2127 => x"77165678", +2128 => x"81e63888", +2129 => x"14085574", +2130 => x"80e2fc2e", +2131 => x"82f9388c", +2132 => x"1408708c", +2133 => x"170c7588", +2134 => x"120c5875", +2135 => x"81078418", +2136 => x"0c751776", +2137 => x"710c5478", +2138 => x"81913883", +2139 => x"ff762781", +2140 => x"c8387589", +2141 => x"2a76832a", +2142 => x"54547380", +2143 => x"2ebf3875", +2144 => x"862ab805", +2145 => x"53847427", +2146 => x"b43880db", +2147 => x"14539474", +2148 => x"27ab3875", +2149 => x"8c2a80ee", +2150 => x"055380d4", +2151 => x"74279e38", +2152 => x"758f2a80", +2153 => x"f7055382", +2154 => x"d4742791", +2155 => x"3875922a", +2156 => x"80fc0553", +2157 => x"8ad47427", +2158 => x"843880fe", +2159 => x"53721010", +2160 => x"1080e2f4", +2161 => x"05881108", +2162 => x"55557375", +2163 => x"2e82bf38", +2164 => x"841408fc", +2165 => x"06597579", +2166 => x"278d3888", +2167 => x"14085473", +2168 => x"752e0981", +2169 => x"06ea388c", +2170 => x"1408708c", +2171 => x"190c7488", +2172 => x"190c7788", +2173 => x"120c5576", +2174 => x"8c150c79", +2175 => x"51faf63f", +2176 => x"8b3d0d04", +2177 => x"76087771", +2178 => x"31587605", +2179 => x"88180856", +2180 => x"567480e2", +2181 => x"fc2e80e0", +2182 => x"388c1708", +2183 => x"708c170c", +2184 => x"7588120c", +2185 => x"53fe8939", +2186 => x"8814088c", +2187 => x"1508708c", +2188 => x"130c5988", +2189 => x"190cfea3", +2190 => x"3975832a", +2191 => x"70545480", +2192 => x"74248198", +2193 => x"3872822c", +2194 => x"81712b80", +2195 => x"e2f80807", +2196 => x"80e2f40b", +2197 => x"84050c74", +2198 => x"10101080", +2199 => x"e2f40588", +2200 => x"1108718c", +2201 => x"1b0c7088", +2202 => x"1b0c7988", +2203 => x"130c565a", +2204 => x"55768c15", +2205 => x"0cff8439", +2206 => x"8159fdb4", +2207 => x"39771673", +2208 => x"81065455", +2209 => x"72983876", +2210 => x"08777131", +2211 => x"5875058c", +2212 => x"18088819", +2213 => x"08718c12", +2214 => x"0c88120c", +2215 => x"55557481", +2216 => x"0784180c", +2217 => x"7680e2f4", +2218 => x"0b88050c", +2219 => x"80e2f008", +2220 => x"7526fec7", +2221 => x"3880e2ec", +2222 => x"08527951", +2223 => x"fafd3f79", +2224 => x"51f9b23f", +2225 => x"feba3981", +2226 => x"778c170c", +2227 => x"7788170c", +2228 => x"758c190c", +2229 => x"7588190c", +2230 => x"59fd8039", +2231 => x"83147082", +2232 => x"2c81712b", +2233 => x"80e2f808", +2234 => x"0780e2f4", +2235 => x"0b84050c", +2236 => x"75101010", +2237 => x"80e2f405", +2238 => x"88110871", +2239 => x"8c1c0c70", +2240 => x"881c0c7a", +2241 => x"88130c57", +2242 => x"5b5653fe", +2243 => x"e4398073", +2244 => x"24a33872", +2245 => x"822c8171", +2246 => x"2b80e2f8", +2247 => x"080780e2", +2248 => x"f40b8405", +2249 => x"0c58748c", +2250 => x"180c7388", +2251 => x"180c7688", +2252 => x"160cfdc3", +2253 => x"39831370", +2254 => x"822c8171", +2255 => x"2b80e2f8", +2256 => x"080780e2", +2257 => x"f40b8405", +2258 => x"0c5953da", +2259 => x"39fe3d0d", +2260 => x"81c2d808", +2261 => x"51708a38", +2262 => x"81c2e070", +2263 => x"81c2d80c", +2264 => x"51741152", +2265 => x"ff537187", +2266 => x"fb808026", +2267 => x"88387181", +2268 => x"c2d80c70", +2269 => x"5372800c", +2270 => x"843d0d04", +2271 => x"fd3d0d80", +2272 => x"0b80e2a4", +2273 => x"08545472", +2274 => x"812e9b38", +2275 => x"7381c2dc", +2276 => x"0cc28e3f", +2277 => x"c0ea3f80", +2278 => x"f1fc5281", +2279 => x"51caf83f", +2280 => x"80085189", +2281 => x"a73f7281", +2282 => x"c2dc0cc1", +2283 => x"f43fc0d0", +2284 => x"3f80f1fc", +2285 => x"528151ca", +2286 => x"de3f8008", +2287 => x"51898d3f", +2288 => x"00ff3900", +2289 => x"ff39f53d", +2290 => x"0d7e6081", +2291 => x"c2dc0870", +2292 => x"5b585b5b", +2293 => x"7580c238", +2294 => x"777a25a1", +2295 => x"38771b70", +2296 => x"337081ff", +2297 => x"06585859", +2298 => x"758a2e98", +2299 => x"387681ff", +2300 => x"0651c18c", +2301 => x"3f811858", +2302 => x"797824e1", +2303 => x"3879800c", +2304 => x"8d3d0d04", +2305 => x"8d51c0f8", +2306 => x"3f783370", +2307 => x"81ff0652", +2308 => x"57c0ed3f", +2309 => x"811858e0", +2310 => x"3979557a", +2311 => x"547d5385", +2312 => x"528d3dfc", +2313 => x"0551c09a", +2314 => x"3f800856", +2315 => x"88973f7b", +2316 => x"80080c75", +2317 => x"800c8d3d", +2318 => x"0d04f63d", +2319 => x"0d7d7f81", +2320 => x"c2dc0870", +2321 => x"5a585a5a", +2322 => x"7580c338", +2323 => x"767925b1", +2324 => x"38761a58", +2325 => x"c08a3f80", +2326 => x"08783480", +2327 => x"0b800881", +2328 => x"ff065758", +2329 => x"758a2ea2", +2330 => x"38758d32", +2331 => x"70307080", +2332 => x"257a0751", +2333 => x"515675b8", +2334 => x"38811757", +2335 => x"787724d1", +2336 => x"38765675", +2337 => x"800c8c3d", +2338 => x"0d048158", +2339 => x"dc397855", +2340 => x"79547c53", +2341 => x"84528c3d", +2342 => x"fc0551ff", +2343 => x"bfa43f80", +2344 => x"085687a1", +2345 => x"3f7a8008", +2346 => x"0c75800c", +2347 => x"8c3d0d04", +2348 => x"811756cf", +2349 => x"39f93d0d", +2350 => x"795781c2", +2351 => x"dc08802e", +2352 => x"ad387651", +2353 => x"89b43f7b", +2354 => x"567a5580", +2355 => x"08810554", +2356 => x"76538252", +2357 => x"893dfc05", +2358 => x"51ffbee6", +2359 => x"3f800857", +2360 => x"86e33f77", +2361 => x"80080c76", +2362 => x"800c893d", +2363 => x"0d0486d5", +2364 => x"3f850b80", +2365 => x"080cff0b", +2366 => x"800c893d", +2367 => x"0d04fb3d", +2368 => x"0d81c2dc", +2369 => x"08705654", +2370 => x"73883874", +2371 => x"800c873d", +2372 => x"0d047753", +2373 => x"8352873d", +2374 => x"fc0551ff", +2375 => x"bea43f80", +2376 => x"085486a1", +2377 => x"3f758008", +2378 => x"0c73800c", +2379 => x"873d0d04", +2380 => x"ff0b800c", +2381 => x"04fb3d0d", +2382 => x"775581c2", +2383 => x"dc08802e", +2384 => x"a9387451", +2385 => x"88b43f80", +2386 => x"08810554", +2387 => x"74538752", +2388 => x"873dfc05", +2389 => x"51ffbdea", +2390 => x"3f800855", +2391 => x"85e73f75", +2392 => x"80080c74", +2393 => x"800c873d", +2394 => x"0d0485d9", +2395 => x"3f850b80", +2396 => x"080cff0b", +2397 => x"800c873d", +2398 => x"0d04fa3d", +2399 => x"0d81c2dc", +2400 => x"08802ea3", +2401 => x"387a5579", +2402 => x"54785386", +2403 => x"52883dfc", +2404 => x"0551ffbd", +2405 => x"ad3f8008", +2406 => x"5685aa3f", +2407 => x"7680080c", +2408 => x"75800c88", +2409 => x"3d0d0485", +2410 => x"9c3f9d0b", +2411 => x"80080cff", +2412 => x"0b800c88", +2413 => x"3d0d04f7", +2414 => x"3d0d7b7d", +2415 => x"5b59bc53", +2416 => x"80527951", +2417 => x"86aa3f80", +2418 => x"70565798", +2419 => x"56741970", +2420 => x"3370782b", +2421 => x"79078118", +2422 => x"f81a5a58", +2423 => x"59555884", +2424 => x"7524ea38", +2425 => x"767a2384", +2426 => x"19588070", +2427 => x"56579856", +2428 => x"74187033", +2429 => x"70782b79", +2430 => x"078118f8", +2431 => x"1a5a5859", +2432 => x"51548475", +2433 => x"24ea3876", +2434 => x"821b2388", +2435 => x"19588070", +2436 => x"56579856", +2437 => x"74187033", +2438 => x"70782b79", +2439 => x"078118f8", +2440 => x"1a5a5859", +2441 => x"51548475", +2442 => x"24ea3876", +2443 => x"841b0c8c", +2444 => x"19588070", +2445 => x"56579856", +2446 => x"74187033", +2447 => x"70782b79", +2448 => x"078118f8", +2449 => x"1a5a5859", +2450 => x"51548475", +2451 => x"24ea3876", +2452 => x"881b2390", +2453 => x"19588070", +2454 => x"56579856", +2455 => x"74187033", +2456 => x"70782b79", +2457 => x"078118f8", +2458 => x"1a5a5859", +2459 => x"51548475", +2460 => x"24ea3876", +2461 => x"8a1b2394", +2462 => x"19588070", +2463 => x"56579856", +2464 => x"74187033", +2465 => x"70782b79", +2466 => x"078118f8", +2467 => x"1a5a5859", +2468 => x"51548475", +2469 => x"24ea3876", +2470 => x"8c1b2398", +2471 => x"19588070", +2472 => x"56579856", +2473 => x"74187033", +2474 => x"70782b79", +2475 => x"078118f8", +2476 => x"1a5a5859", +2477 => x"51548475", +2478 => x"24ea3876", +2479 => x"8e1b239c", +2480 => x"19588070", +2481 => x"5657b856", +2482 => x"74187033", +2483 => x"70782b79", +2484 => x"078118f8", +2485 => x"1a5a5859", +2486 => x"5a548875", +2487 => x"24ea3876", +2488 => x"901b0c8b", +2489 => x"3d0d04e9", +2490 => x"3d0d6a81", +2491 => x"c2dc0857", +2492 => x"57759338", +2493 => x"80c0800b", +2494 => x"84180c75", +2495 => x"ac180c75", +2496 => x"800c993d", +2497 => x"0d04893d", +2498 => x"70556a54", +2499 => x"558a5299", +2500 => x"3dffbc05", +2501 => x"51ffbaaa", +2502 => x"3f800877", +2503 => x"53755256", +2504 => x"fd953f82", +2505 => x"a03f7780", +2506 => x"080c7580", +2507 => x"0c993d0d", +2508 => x"04e93d0d", +2509 => x"695781c2", +2510 => x"dc08802e", +2511 => x"b6387651", +2512 => x"84b83f89", +2513 => x"3d705680", +2514 => x"08810555", +2515 => x"7754568f", +2516 => x"52993dff", +2517 => x"bc0551ff", +2518 => x"b9e83f80", +2519 => x"086b5376", +2520 => x"5257fcd3", +2521 => x"3f81de3f", +2522 => x"7780080c", +2523 => x"76800c99", +2524 => x"3d0d0481", +2525 => x"d03f850b", +2526 => x"80080cff", +2527 => x"0b800c99", +2528 => x"3d0d04fc", +2529 => x"3d0d8154", +2530 => x"81c2dc08", +2531 => x"88387380", +2532 => x"0c863d0d", +2533 => x"04765397", +2534 => x"b952863d", +2535 => x"fc0551ff", +2536 => x"b9a03f80", +2537 => x"0854819d", +2538 => x"3f748008", +2539 => x"0c73800c", +2540 => x"863d0d04", +2541 => x"f43d0d7e", +2542 => x"80f2a808", +2543 => x"700881ff", +2544 => x"06913df8", +2545 => x"05545159", +2546 => x"59ffbac5", +2547 => x"3f775780", +2548 => x"5476557b", +2549 => x"7d585276", +2550 => x"538e3df0", +2551 => x"0551d6a0", +2552 => x"3f797b58", +2553 => x"790c7684", +2554 => x"1a0c7880", +2555 => x"0c8e3d0d", +2556 => x"04f43d0d", +2557 => x"7e80f2a8", +2558 => x"08700870", +2559 => x"81ff0692", +2560 => x"3df80555", +2561 => x"515a5759", +2562 => x"ffba863f", +2563 => x"7757800b", +2564 => x"8b3d5954", +2565 => x"76557b7d", +2566 => x"58527653", +2567 => x"7751d5e0", +2568 => x"3f8056bd", +2569 => x"84c07655", +2570 => x"55797b58", +2571 => x"52765377", +2572 => x"51d5cd3f", +2573 => x"7a577880", +2574 => x"2e843876", +2575 => x"790c7680", +2576 => x"0c8e3d0d", +2577 => x"0480eafc", +2578 => x"08800c04", +2579 => x"f73d0d7b", +2580 => x"80eafc08", +2581 => x"82c81108", +2582 => x"5a545a77", +2583 => x"802e80da", +2584 => x"38818818", +2585 => x"841908ff", +2586 => x"0581712b", +2587 => x"59555980", +2588 => x"742480ea", +2589 => x"38807424", +2590 => x"b5387382", +2591 => x"2b781188", +2592 => x"05565681", +2593 => x"80190877", +2594 => x"06537280", +2595 => x"2eb63878", +2596 => x"16700853", +2597 => x"53795174", +2598 => x"0853722d", +2599 => x"ff14fc17", +2600 => x"fc177981", +2601 => x"2c5a5757", +2602 => x"54738025", +2603 => x"d6387708", +2604 => x"5877ffad", +2605 => x"3880eafc", +2606 => x"0853bc13", +2607 => x"08a53879", +2608 => x"51f5fd3f", +2609 => x"74085372", +2610 => x"2dff14fc", +2611 => x"17fc1779", +2612 => x"812c5a57", +2613 => x"57547380", +2614 => x"25ffa838", +2615 => x"d1398057", +2616 => x"ff933972", +2617 => x"51bc1308", +2618 => x"54732d79", +2619 => x"51f5d13f", +2620 => x"fb3d0d77", +2621 => x"7a71028c", +2622 => x"05a30533", +2623 => x"58545456", +2624 => x"83732780", +2625 => x"d4387583", +2626 => x"06517080", +2627 => x"cc387488", +2628 => x"2b750770", +2629 => x"71902b07", +2630 => x"55518f73", +2631 => x"27a73873", +2632 => x"72708405", +2633 => x"540c7174", +2634 => x"71708405", +2635 => x"530c7471", +2636 => x"70840553", +2637 => x"0c747170", +2638 => x"8405530c", +2639 => x"f0145452", +2640 => x"728f26db", +2641 => x"38837327", +2642 => x"90387372", +2643 => x"70840554", +2644 => x"0cfc1353", +2645 => x"728326f2", +2646 => x"38ff1351", +2647 => x"70ff2e93", +2648 => x"38747270", +2649 => x"81055434", +2650 => x"ff115170", +2651 => x"ff2e0981", +2652 => x"06ef3875", +2653 => x"800c873d", +2654 => x"0d04fd3d", +2655 => x"0d757071", +2656 => x"83065355", +2657 => x"5270b438", +2658 => x"71700870", +2659 => x"09f7fbfd", +2660 => x"ff1206f8", +2661 => x"84828180", +2662 => x"06545253", +2663 => x"719b3884", +2664 => x"13700870", +2665 => x"09f7fbfd", +2666 => x"ff1206f8", +2667 => x"84828180", +2668 => x"06545253", +2669 => x"71802ee7", +2670 => x"38725271", +2671 => x"33537280", +2672 => x"2e8a3881", +2673 => x"12703354", +2674 => x"5272f838", +2675 => x"71743180", +2676 => x"0c853d0d", +2677 => x"04ff3d0d", +2678 => x"80f2840b", +2679 => x"fc057008", +2680 => x"525270ff", +2681 => x"2e913870", +2682 => x"2dfc1270", +2683 => x"08525270", +2684 => x"ff2e0981", +2685 => x"06f13883", +2686 => x"3d0d0404", +2687 => x"ffb7a63f", +2688 => x"04000000", +2689 => x"30313233", +2690 => x"34353637", +2691 => x"38390000", +2692 => x"44485259", +2693 => x"53544f4e", +2694 => x"45205052", +2695 => x"4f475241", +2696 => x"4d2c2053", +2697 => x"4f4d4520", +2698 => x"53545249", +2699 => x"4e470000", +2700 => x"44485259", +2701 => x"53544f4e", +2702 => x"45205052", +2703 => x"4f475241", +2704 => x"4d2c2031", +2705 => x"27535420", +2706 => x"53545249", +2707 => x"4e470000", +2708 => x"44687279", +2709 => x"73746f6e", +2710 => x"65204265", +2711 => x"6e63686d", +2712 => x"61726b2c", +2713 => x"20566572", +2714 => x"73696f6e", +2715 => x"20322e31", +2716 => x"20284c61", +2717 => x"6e677561", +2718 => x"67653a20", +2719 => x"43290a00", +2720 => x"50726f67", +2721 => x"72616d20", +2722 => x"636f6d70", +2723 => x"696c6564", +2724 => x"20776974", +2725 => x"68202772", +2726 => x"65676973", +2727 => x"74657227", +2728 => x"20617474", +2729 => x"72696275", +2730 => x"74650a00", +2731 => x"45786563", +2732 => x"7574696f", +2733 => x"6e207374", +2734 => x"61727473", +2735 => x"2c202564", +2736 => x"2072756e", +2737 => x"73207468", +2738 => x"726f7567", +2739 => x"68204468", +2740 => x"72797374", +2741 => x"6f6e650a", +2742 => x"00000000", +2743 => x"44485259", +2744 => x"53544f4e", +2745 => x"45205052", +2746 => x"4f475241", +2747 => x"4d2c2032", +2748 => x"274e4420", +2749 => x"53545249", +2750 => x"4e470000", +2751 => x"45786563", +2752 => x"7574696f", +2753 => x"6e20656e", +2754 => x"64730a00", +2755 => x"46696e61", +2756 => x"6c207661", +2757 => x"6c756573", +2758 => x"206f6620", +2759 => x"74686520", +2760 => x"76617269", +2761 => x"61626c65", +2762 => x"73207573", +2763 => x"65642069", +2764 => x"6e207468", +2765 => x"65206265", +2766 => x"6e63686d", +2767 => x"61726b3a", +2768 => x"0a000000", +2769 => x"496e745f", +2770 => x"476c6f62", +2771 => x"3a202020", +2772 => x"20202020", +2773 => x"20202020", +2774 => x"2025640a", +2775 => x"00000000", +2776 => x"20202020", +2777 => x"20202020", +2778 => x"73686f75", +2779 => x"6c642062", +2780 => x"653a2020", +2781 => x"2025640a", +2782 => x"00000000", +2783 => x"426f6f6c", +2784 => x"5f476c6f", +2785 => x"623a2020", +2786 => x"20202020", +2787 => x"20202020", +2788 => x"2025640a", +2789 => x"00000000", +2790 => x"43685f31", +2791 => x"5f476c6f", +2792 => x"623a2020", +2793 => x"20202020", +2794 => x"20202020", +2795 => x"2025630a", +2796 => x"00000000", +2797 => x"20202020", +2798 => x"20202020", +2799 => x"73686f75", +2800 => x"6c642062", +2801 => x"653a2020", +2802 => x"2025630a", +2803 => x"00000000", +2804 => x"43685f32", +2805 => x"5f476c6f", +2806 => x"623a2020", +2807 => x"20202020", +2808 => x"20202020", +2809 => x"2025630a", +2810 => x"00000000", +2811 => x"4172725f", +2812 => x"315f476c", +2813 => x"6f625b38", +2814 => x"5d3a2020", +2815 => x"20202020", +2816 => x"2025640a", +2817 => x"00000000", +2818 => x"4172725f", +2819 => x"325f476c", +2820 => x"6f625b38", +2821 => x"5d5b375d", +2822 => x"3a202020", +2823 => x"2025640a", +2824 => x"00000000", +2825 => x"20202020", +2826 => x"20202020", +2827 => x"73686f75", +2828 => x"6c642062", +2829 => x"653a2020", +2830 => x"204e756d", +2831 => x"6265725f", +2832 => x"4f665f52", +2833 => x"756e7320", +2834 => x"2b203130", +2835 => x"0a000000", +2836 => x"5074725f", +2837 => x"476c6f62", +2838 => x"2d3e0a00", +2839 => x"20205074", +2840 => x"725f436f", +2841 => x"6d703a20", +2842 => x"20202020", +2843 => x"20202020", +2844 => x"2025640a", +2845 => x"00000000", +2846 => x"20202020", +2847 => x"20202020", +2848 => x"73686f75", +2849 => x"6c642062", +2850 => x"653a2020", +2851 => x"2028696d", +2852 => x"706c656d", +2853 => x"656e7461", +2854 => x"74696f6e", +2855 => x"2d646570", +2856 => x"656e6465", +2857 => x"6e74290a", +2858 => x"00000000", +2859 => x"20204469", +2860 => x"7363723a", +2861 => x"20202020", +2862 => x"20202020", +2863 => x"20202020", +2864 => x"2025640a", +2865 => x"00000000", +2866 => x"2020456e", +2867 => x"756d5f43", +2868 => x"6f6d703a", +2869 => x"20202020", +2870 => x"20202020", +2871 => x"2025640a", +2872 => x"00000000", +2873 => x"2020496e", +2874 => x"745f436f", +2875 => x"6d703a20", +2876 => x"20202020", +2877 => x"20202020", +2878 => x"2025640a", +2879 => x"00000000", +2880 => x"20205374", +2881 => x"725f436f", +2882 => x"6d703a20", +2883 => x"20202020", +2884 => x"20202020", +2885 => x"2025730a", +2886 => x"00000000", +2887 => x"20202020", +2888 => x"20202020", +2889 => x"73686f75", +2890 => x"6c642062", +2891 => x"653a2020", +2892 => x"20444852", +2893 => x"5953544f", +2894 => x"4e452050", +2895 => x"524f4752", +2896 => x"414d2c20", +2897 => x"534f4d45", +2898 => x"20535452", +2899 => x"494e470a", +2900 => x"00000000", +2901 => x"4e657874", +2902 => x"5f507472", +2903 => x"5f476c6f", +2904 => x"622d3e0a", +2905 => x"00000000", +2906 => x"20202020", +2907 => x"20202020", +2908 => x"73686f75", +2909 => x"6c642062", +2910 => x"653a2020", +2911 => x"2028696d", +2912 => x"706c656d", +2913 => x"656e7461", +2914 => x"74696f6e", +2915 => x"2d646570", +2916 => x"656e6465", +2917 => x"6e74292c", +2918 => x"2073616d", +2919 => x"65206173", +2920 => x"2061626f", +2921 => x"76650a00", +2922 => x"496e745f", +2923 => x"315f4c6f", +2924 => x"633a2020", +2925 => x"20202020", +2926 => x"20202020", +2927 => x"2025640a", +2928 => x"00000000", +2929 => x"496e745f", +2930 => x"325f4c6f", +2931 => x"633a2020", +2932 => x"20202020", +2933 => x"20202020", +2934 => x"2025640a", +2935 => x"00000000", +2936 => x"496e745f", +2937 => x"335f4c6f", +2938 => x"633a2020", +2939 => x"20202020", +2940 => x"20202020", +2941 => x"2025640a", +2942 => x"00000000", +2943 => x"456e756d", +2944 => x"5f4c6f63", +2945 => x"3a202020", +2946 => x"20202020", +2947 => x"20202020", +2948 => x"2025640a", +2949 => x"00000000", +2950 => x"5374725f", +2951 => x"315f4c6f", +2952 => x"633a2020", +2953 => x"20202020", +2954 => x"20202020", +2955 => x"2025730a", +2956 => x"00000000", +2957 => x"20202020", +2958 => x"20202020", +2959 => x"73686f75", +2960 => x"6c642062", +2961 => x"653a2020", +2962 => x"20444852", +2963 => x"5953544f", +2964 => x"4e452050", +2965 => x"524f4752", +2966 => x"414d2c20", +2967 => x"31275354", +2968 => x"20535452", +2969 => x"494e470a", +2970 => x"00000000", +2971 => x"5374725f", +2972 => x"325f4c6f", +2973 => x"633a2020", +2974 => x"20202020", +2975 => x"20202020", +2976 => x"2025730a", +2977 => x"00000000", +2978 => x"20202020", +2979 => x"20202020", +2980 => x"73686f75", +2981 => x"6c642062", +2982 => x"653a2020", +2983 => x"20444852", +2984 => x"5953544f", +2985 => x"4e452050", +2986 => x"524f4752", +2987 => x"414d2c20", +2988 => x"32274e44", +2989 => x"20535452", +2990 => x"494e470a", +2991 => x"00000000", +2992 => x"55736572", +2993 => x"2074696d", +2994 => x"653a2025", +2995 => x"640a0000", +2996 => x"4d696372", +2997 => x"6f736563", +2998 => x"6f6e6473", +2999 => x"20666f72", +3000 => x"206f6e65", +3001 => x"2072756e", +3002 => x"20746872", +3003 => x"6f756768", +3004 => x"20446872", +3005 => x"7973746f", +3006 => x"6e653a20", +3007 => x"00000000", +3008 => x"2564200a", +3009 => x"00000000", +3010 => x"44687279", +3011 => x"73746f6e", +3012 => x"65732070", +3013 => x"65722053", +3014 => x"65636f6e", +3015 => x"643a2020", +3016 => x"20202020", +3017 => x"20202020", +3018 => x"20202020", +3019 => x"20202020", +3020 => x"20202020", +3021 => x"00000000", +3022 => x"56415820", +3023 => x"4d495053", +3024 => x"20726174", +3025 => x"696e6720", +3026 => x"2a203130", +3027 => x"3030203d", +3028 => x"20256420", +3029 => x"0a000000", +3030 => x"50726f67", +3031 => x"72616d20", +3032 => x"636f6d70", +3033 => x"696c6564", +3034 => x"20776974", +3035 => x"686f7574", +3036 => x"20277265", +3037 => x"67697374", +3038 => x"65722720", +3039 => x"61747472", +3040 => x"69627574", +3041 => x"650a0000", +3042 => x"4d656173", +3043 => x"75726564", +3044 => x"2074696d", +3045 => x"6520746f", +3046 => x"6f20736d", +3047 => x"616c6c20", +3048 => x"746f206f", +3049 => x"62746169", +3050 => x"6e206d65", +3051 => x"616e696e", +3052 => x"6766756c", +3053 => x"20726573", +3054 => x"756c7473", +3055 => x"0a000000", +3056 => x"506c6561", +3057 => x"73652069", +3058 => x"6e637265", +3059 => x"61736520", +3060 => x"6e756d62", +3061 => x"6572206f", +3062 => x"66207275", +3063 => x"6e730a00", +3064 => x"44485259", +3065 => x"53544f4e", +3066 => x"45205052", +3067 => x"4f475241", +3068 => x"4d2c2033", +3069 => x"27524420", +3070 => x"53545249", +3071 => x"4e470000", +3072 => x"00010202", +3073 => x"03030303", +3074 => x"04040404", +3075 => x"04040404", +3076 => x"05050505", +3077 => x"05050505", +3078 => x"05050505", +3079 => x"05050505", +3080 => x"06060606", +3081 => x"06060606", +3082 => x"06060606", +3083 => x"06060606", +3084 => x"06060606", +3085 => x"06060606", +3086 => x"06060606", +3087 => x"06060606", +3088 => x"07070707", +3089 => x"07070707", +3090 => x"07070707", +3091 => x"07070707", +3092 => x"07070707", +3093 => x"07070707", +3094 => x"07070707", +3095 => x"07070707", +3096 => x"07070707", +3097 => x"07070707", +3098 => x"07070707", +3099 => x"07070707", +3100 => x"07070707", +3101 => x"07070707", +3102 => x"07070707", +3103 => x"07070707", +3104 => x"08080808", +3105 => x"08080808", +3106 => x"08080808", +3107 => x"08080808", +3108 => x"08080808", +3109 => x"08080808", +3110 => x"08080808", +3111 => x"08080808", +3112 => x"08080808", +3113 => x"08080808", +3114 => x"08080808", +3115 => x"08080808", +3116 => x"08080808", +3117 => x"08080808", +3118 => x"08080808", +3119 => x"08080808", +3120 => x"08080808", +3121 => x"08080808", +3122 => x"08080808", +3123 => x"08080808", +3124 => x"08080808", +3125 => x"08080808", +3126 => x"08080808", +3127 => x"08080808", +3128 => x"08080808", +3129 => x"08080808", +3130 => x"08080808", +3131 => x"08080808", +3132 => x"08080808", +3133 => x"08080808", +3134 => x"08080808", +3135 => x"08080808", +3136 => x"43000000", +3137 => x"64756d6d", +3138 => x"792e6578", +3139 => x"65000000", +3140 => x"00ffffff", +3141 => x"ff00ffff", +3142 => x"ffff00ff", +3143 => x"ffffff00", +3144 => x"00000000", +3145 => x"00000000", +3146 => x"00000000", +3147 => x"0000390c", +3148 => x"000004d2", -- iterations 0x4d2=1234 +3149 => x"00000000", +3150 => x"00000000", +3151 => x"00000000", +3152 => x"00000000", +3153 => x"00000000", +3154 => x"00000000", +3155 => x"00000000", +3156 => x"00000000", +3157 => x"00000000", +3158 => x"00000000", +3159 => x"00000000", +3160 => x"00000000", +3161 => x"00000000", +3162 => x"ffffffff", +3163 => x"00000000", +3164 => x"00020000", +3165 => x"00000000", +3166 => x"00000000", +3167 => x"00003174", +3168 => x"00003174", +3169 => x"0000317c", +3170 => x"0000317c", +3171 => x"00003184", +3172 => x"00003184", +3173 => x"0000318c", +3174 => x"0000318c", +3175 => x"00003194", +3176 => x"00003194", +3177 => x"0000319c", +3178 => x"0000319c", +3179 => x"000031a4", +3180 => x"000031a4", +3181 => x"000031ac", +3182 => x"000031ac", +3183 => x"000031b4", +3184 => x"000031b4", +3185 => x"000031bc", +3186 => x"000031bc", +3187 => x"000031c4", +3188 => x"000031c4", +3189 => x"000031cc", +3190 => x"000031cc", +3191 => x"000031d4", +3192 => x"000031d4", +3193 => x"000031dc", +3194 => x"000031dc", +3195 => x"000031e4", +3196 => x"000031e4", +3197 => x"000031ec", +3198 => x"000031ec", +3199 => x"000031f4", +3200 => x"000031f4", +3201 => x"000031fc", +3202 => x"000031fc", +3203 => x"00003204", +3204 => x"00003204", +3205 => x"0000320c", +3206 => x"0000320c", +3207 => x"00003214", +3208 => x"00003214", +3209 => x"0000321c", +3210 => x"0000321c", +3211 => x"00003224", +3212 => x"00003224", +3213 => x"0000322c", +3214 => x"0000322c", +3215 => x"00003234", +3216 => x"00003234", +3217 => x"0000323c", +3218 => x"0000323c", +3219 => x"00003244", +3220 => x"00003244", +3221 => x"0000324c", +3222 => x"0000324c", +3223 => x"00003254", +3224 => x"00003254", +3225 => x"0000325c", +3226 => x"0000325c", +3227 => x"00003264", +3228 => x"00003264", +3229 => x"0000326c", +3230 => x"0000326c", +3231 => x"00003274", +3232 => x"00003274", +3233 => x"0000327c", +3234 => x"0000327c", +3235 => x"00003284", +3236 => x"00003284", +3237 => x"0000328c", +3238 => x"0000328c", +3239 => x"00003294", +3240 => x"00003294", +3241 => x"0000329c", +3242 => x"0000329c", +3243 => x"000032a4", +3244 => x"000032a4", +3245 => x"000032ac", +3246 => x"000032ac", +3247 => x"000032b4", +3248 => x"000032b4", +3249 => x"000032bc", +3250 => x"000032bc", +3251 => x"000032c4", +3252 => x"000032c4", +3253 => x"000032cc", +3254 => x"000032cc", +3255 => x"000032d4", +3256 => x"000032d4", +3257 => x"000032dc", +3258 => x"000032dc", +3259 => x"000032e4", +3260 => x"000032e4", +3261 => x"000032ec", +3262 => x"000032ec", +3263 => x"000032f4", +3264 => x"000032f4", +3265 => x"000032fc", +3266 => x"000032fc", +3267 => x"00003304", +3268 => x"00003304", +3269 => x"0000330c", +3270 => x"0000330c", +3271 => x"00003314", +3272 => x"00003314", +3273 => x"0000331c", +3274 => x"0000331c", +3275 => x"00003324", +3276 => x"00003324", +3277 => x"0000332c", +3278 => x"0000332c", +3279 => x"00003334", +3280 => x"00003334", +3281 => x"0000333c", +3282 => x"0000333c", +3283 => x"00003344", +3284 => x"00003344", +3285 => x"0000334c", +3286 => x"0000334c", +3287 => x"00003354", +3288 => x"00003354", +3289 => x"0000335c", +3290 => x"0000335c", +3291 => x"00003364", +3292 => x"00003364", +3293 => x"0000336c", +3294 => x"0000336c", +3295 => x"00003374", +3296 => x"00003374", +3297 => x"0000337c", +3298 => x"0000337c", +3299 => x"00003384", +3300 => x"00003384", +3301 => x"0000338c", +3302 => x"0000338c", +3303 => x"00003394", +3304 => x"00003394", +3305 => x"0000339c", +3306 => x"0000339c", +3307 => x"000033a4", +3308 => x"000033a4", +3309 => x"000033ac", +3310 => x"000033ac", +3311 => x"000033b4", +3312 => x"000033b4", +3313 => x"000033bc", +3314 => x"000033bc", +3315 => x"000033c4", +3316 => x"000033c4", +3317 => x"000033cc", +3318 => x"000033cc", +3319 => x"000033d4", +3320 => x"000033d4", +3321 => x"000033dc", +3322 => x"000033dc", +3323 => x"000033e4", +3324 => x"000033e4", +3325 => x"000033ec", +3326 => x"000033ec", +3327 => x"000033f4", +3328 => x"000033f4", +3329 => x"000033fc", +3330 => x"000033fc", +3331 => x"00003404", +3332 => x"00003404", +3333 => x"0000340c", +3334 => x"0000340c", +3335 => x"00003414", +3336 => x"00003414", +3337 => x"0000341c", +3338 => x"0000341c", +3339 => x"00003424", +3340 => x"00003424", +3341 => x"0000342c", +3342 => x"0000342c", +3343 => x"00003434", +3344 => x"00003434", +3345 => x"0000343c", +3346 => x"0000343c", +3347 => x"00003444", +3348 => x"00003444", +3349 => x"0000344c", +3350 => x"0000344c", +3351 => x"00003454", +3352 => x"00003454", +3353 => x"0000345c", +3354 => x"0000345c", +3355 => x"00003464", +3356 => x"00003464", +3357 => x"0000346c", +3358 => x"0000346c", +3359 => x"00003474", +3360 => x"00003474", +3361 => x"0000347c", +3362 => x"0000347c", +3363 => x"00003484", +3364 => x"00003484", +3365 => x"0000348c", +3366 => x"0000348c", +3367 => x"00003494", +3368 => x"00003494", +3369 => x"0000349c", +3370 => x"0000349c", +3371 => x"000034a4", +3372 => x"000034a4", +3373 => x"000034ac", +3374 => x"000034ac", +3375 => x"000034b4", +3376 => x"000034b4", +3377 => x"000034bc", +3378 => x"000034bc", +3379 => x"000034c4", +3380 => x"000034c4", +3381 => x"000034cc", +3382 => x"000034cc", +3383 => x"000034d4", +3384 => x"000034d4", +3385 => x"000034dc", +3386 => x"000034dc", +3387 => x"000034e4", +3388 => x"000034e4", +3389 => x"000034ec", +3390 => x"000034ec", +3391 => x"000034f4", +3392 => x"000034f4", +3393 => x"000034fc", +3394 => x"000034fc", +3395 => x"00003504", +3396 => x"00003504", +3397 => x"0000350c", +3398 => x"0000350c", +3399 => x"00003514", +3400 => x"00003514", +3401 => x"0000351c", +3402 => x"0000351c", +3403 => x"00003524", +3404 => x"00003524", +3405 => x"0000352c", +3406 => x"0000352c", +3407 => x"00003534", +3408 => x"00003534", +3409 => x"0000353c", +3410 => x"0000353c", +3411 => x"00003544", +3412 => x"00003544", +3413 => x"0000354c", +3414 => x"0000354c", +3415 => x"00003554", +3416 => x"00003554", +3417 => x"0000355c", +3418 => x"0000355c", +3419 => x"00003564", +3420 => x"00003564", +3421 => x"0000356c", +3422 => x"0000356c", +3423 => x"00003580", +3424 => x"00000000", +3425 => x"000037e8", +3426 => x"00003844", +3427 => x"000038a0", +3428 => x"00000000", +3429 => x"00000000", +3430 => x"00000000", +3431 => x"00000000", +3432 => x"00000000", +3433 => x"00000000", +3434 => x"00000000", +3435 => x"00000000", +3436 => x"00000000", +3437 => x"00003100", +3438 => x"00000000", +3439 => x"00000000", +3440 => x"00000000", +3441 => x"00000000", +3442 => x"00000000", +3443 => x"00000000", +3444 => x"00000000", +3445 => x"00000000", +3446 => x"00000000", +3447 => x"00000000", +3448 => x"00000000", +3449 => x"00000000", +3450 => x"00000000", +3451 => x"00000000", +3452 => x"00000000", +3453 => x"00000000", +3454 => x"00000000", +3455 => x"00000000", +3456 => x"00000000", +3457 => x"00000000", +3458 => x"00000000", +3459 => x"00000000", +3460 => x"00000000", +3461 => x"00000000", +3462 => x"00000000", +3463 => x"00000000", +3464 => x"00000000", +3465 => x"00000000", +3466 => x"00000001", +3467 => x"330eabcd", +3468 => x"1234e66d", +3469 => x"deec0005", +3470 => x"000b0000", +3471 => x"00000000", +3472 => x"00000000", +3473 => x"00000000", +3474 => x"00000000", +3475 => x"00000000", +3476 => x"00000000", +3477 => x"00000000", +3478 => x"00000000", +3479 => x"00000000", +3480 => x"00000000", +3481 => x"00000000", +3482 => x"00000000", +3483 => x"00000000", +3484 => x"00000000", +3485 => x"00000000", +3486 => x"00000000", +3487 => x"00000000", +3488 => x"00000000", +3489 => x"00000000", +3490 => x"00000000", +3491 => x"00000000", +3492 => x"00000000", +3493 => x"00000000", +3494 => x"00000000", +3495 => x"00000000", +3496 => x"00000000", +3497 => x"00000000", +3498 => x"00000000", +3499 => x"00000000", +3500 => x"00000000", +3501 => x"00000000", +3502 => x"00000000", +3503 => x"00000000", +3504 => x"00000000", +3505 => x"00000000", +3506 => x"00000000", +3507 => x"00000000", +3508 => x"00000000", +3509 => x"00000000", +3510 => x"00000000", +3511 => x"00000000", +3512 => x"00000000", +3513 => x"00000000", +3514 => x"00000000", +3515 => x"00000000", +3516 => x"00000000", +3517 => x"00000000", +3518 => x"00000000", +3519 => x"00000000", +3520 => x"00000000", +3521 => x"00000000", +3522 => x"00000000", +3523 => x"00000000", +3524 => x"00000000", +3525 => x"00000000", +3526 => x"00000000", +3527 => x"00000000", +3528 => x"00000000", +3529 => x"00000000", +3530 => x"00000000", +3531 => x"00000000", +3532 => x"00000000", +3533 => x"00000000", +3534 => x"00000000", +3535 => x"00000000", +3536 => x"00000000", +3537 => x"00000000", +3538 => x"00000000", +3539 => x"00000000", +3540 => x"00000000", +3541 => x"00000000", +3542 => x"00000000", +3543 => x"00000000", +3544 => x"00000000", +3545 => x"00000000", +3546 => x"00000000", +3547 => x"00000000", +3548 => x"00000000", +3549 => x"00000000", +3550 => x"00000000", +3551 => x"00000000", +3552 => x"00000000", +3553 => x"00000000", +3554 => x"00000000", +3555 => x"00000000", +3556 => x"00000000", +3557 => x"00000000", +3558 => x"00000000", +3559 => x"00000000", +3560 => x"00000000", +3561 => x"00000000", +3562 => x"00000000", +3563 => x"00000000", +3564 => x"00000000", +3565 => x"00000000", +3566 => x"00000000", +3567 => x"00000000", +3568 => x"00000000", +3569 => x"00000000", +3570 => x"00000000", +3571 => x"00000000", +3572 => x"00000000", +3573 => x"00000000", +3574 => x"00000000", +3575 => x"00000000", +3576 => x"00000000", +3577 => x"00000000", +3578 => x"00000000", +3579 => x"00000000", +3580 => x"00000000", +3581 => x"00000000", +3582 => x"00000000", +3583 => x"00000000", +3584 => x"00000000", +3585 => x"00000000", +3586 => x"00000000", +3587 => x"00000000", +3588 => x"00000000", +3589 => x"00000000", +3590 => x"00000000", +3591 => x"00000000", +3592 => x"00000000", +3593 => x"00000000", +3594 => x"00000000", +3595 => x"00000000", +3596 => x"00000000", +3597 => x"00000000", +3598 => x"00000000", +3599 => x"00000000", +3600 => x"00000000", +3601 => x"00000000", +3602 => x"00000000", +3603 => x"00000000", +3604 => x"00000000", +3605 => x"00000000", +3606 => x"00000000", +3607 => x"00000000", +3608 => x"00000000", +3609 => x"00000000", +3610 => x"00000000", +3611 => x"00000000", +3612 => x"00000000", +3613 => x"00000000", +3614 => x"00000000", +3615 => x"00000000", +3616 => x"00000000", +3617 => x"00000000", +3618 => x"00000000", +3619 => x"00000000", +3620 => x"00000000", +3621 => x"00000000", +3622 => x"00000000", +3623 => x"00000000", +3624 => x"00000000", +3625 => x"00000000", +3626 => x"00000000", +3627 => x"00000000", +3628 => x"00000000", +3629 => x"00000000", +3630 => x"00000000", +3631 => x"00000000", +3632 => x"00000000", +3633 => x"00000000", +3634 => x"00000000", +3635 => x"00000000", +3636 => x"00000000", +3637 => x"00000000", +3638 => x"00000000", +3639 => x"00000000", +3640 => x"00000000", +3641 => x"00000000", +3642 => x"00000000", +3643 => x"00000000", +3644 => x"00000000", +3645 => x"00000000", +3646 => x"00000000", +3647 => x"00003104", +3648 => x"ffffffff", +3649 => x"00000000", +3650 => x"ffffffff", +3651 => x"00000000", + others => x"00000000" +); + +begin + +mem_busy<=mem_readEnable; -- we're done on the cycle after we serve the read request + +process (clk, areset) +begin + if areset = '1' then + elsif (clk'event and clk = '1') then + if (mem_writeEnable = '1') then + ram(conv_integer(mem_addr(maxAddrBit downto minAddrBit))) := mem_write; + end if; + mem_read <= ram(conv_integer(mem_addr(maxAddrBit downto minAddrBit))); + end if; +end process; + + + + +end dram_arch; diff --git a/zpu/hdl/zpu4/src/dram_hello.vhd b/zpu/hdl/zpu4/src/dram_hello.vhd new file mode 100644 index 0000000..dc46dbb --- /dev/null +++ b/zpu/hdl/zpu4/src/dram_hello.vhd @@ -0,0 +1,3214 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; + + +library work; +use work.zpu_config.all; +use work.zpupkg.all; + +entity dram is +port (clk : in std_logic; + mem_writeEnable : in std_logic; + mem_readEnable : in std_logic; + mem_addr : in std_logic_vector(maxAddrBit downto 0); + mem_write : in std_logic_vector(wordSize-1 downto 0); + mem_read : out std_logic_vector(wordSize-1 downto 0); + mem_busy : out std_logic; + mem_writeMask : in std_logic_vector(wordBytes-1 downto 0)); +end dram; + +architecture dram_arch of dram is + + +type ram_type is array(0 to ((2**(maxAddrBit+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); + +shared variable ram : ram_type := +( +0 => x"0b0b0b0b", +1 => x"80700b0b", +2 => x"80d3900c", +3 => x"3a0b0b80", +4 => x"c8b20400", +5 => x"00000000", +6 => x"00000000", +7 => x"00000000", +8 => x"80088408", +9 => x"88080b0b", +10 => x"80c8fb2d", +11 => x"880c840c", +12 => x"800c0400", +13 => x"00000000", +14 => x"00000000", +15 => x"00000000", +16 => x"71fd0608", +17 => x"72830609", +18 => x"81058205", +19 => x"832b2a83", +20 => x"ffff0652", +21 => x"04000000", +22 => x"00000000", +23 => x"00000000", +24 => x"71fd0608", +25 => x"83ffff73", +26 => x"83060981", +27 => x"05820583", +28 => x"2b2b0906", +29 => x"7383ffff", +30 => x"0b0b0b0b", +31 => x"83a70400", +32 => x"72098105", +33 => x"72057373", +34 => x"09060906", +35 => x"73097306", +36 => x"070a8106", +37 => x"53510400", +38 => x"00000000", +39 => x"00000000", +40 => x"72722473", +41 => x"732e0753", +42 => x"51040000", +43 => x"00000000", +44 => x"00000000", +45 => x"00000000", +46 => x"00000000", +47 => x"00000000", +48 => x"71737109", +49 => x"71068106", +50 => x"30720a10", +51 => x"0a720a10", +52 => x"0a31050a", +53 => x"81065151", +54 => x"53510400", +55 => x"00000000", +56 => x"72722673", +57 => x"732e0753", +58 => x"51040000", +59 => x"00000000", +60 => x"00000000", +61 => x"00000000", +62 => x"00000000", +63 => x"00000000", +64 => x"00000000", +65 => x"00000000", +66 => x"00000000", +67 => x"00000000", +68 => x"00000000", +69 => x"00000000", +70 => x"00000000", +71 => x"00000000", +72 => x"0b0b0b88", +73 => x"c4040000", +74 => x"00000000", +75 => x"00000000", +76 => x"00000000", +77 => x"00000000", +78 => x"00000000", +79 => x"00000000", +80 => x"720a722b", +81 => x"0a535104", +82 => x"00000000", +83 => x"00000000", +84 => x"00000000", +85 => x"00000000", +86 => x"00000000", +87 => x"00000000", +88 => x"72729f06", +89 => x"0981050b", +90 => x"0b0b88a7", +91 => x"05040000", +92 => x"00000000", +93 => x"00000000", +94 => x"00000000", +95 => x"00000000", +96 => x"72722aff", +97 => x"739f062a", +98 => x"0974090a", +99 => x"8106ff05", +100 => x"06075351", +101 => x"04000000", +102 => x"00000000", +103 => x"00000000", +104 => x"71715351", +105 => x"020d0406", +106 => x"73830609", +107 => x"81058205", +108 => x"832b0b2b", +109 => x"0772fc06", +110 => x"0c515104", +111 => x"00000000", +112 => x"72098105", +113 => x"72050970", +114 => x"81050906", +115 => x"0a810653", +116 => x"51040000", +117 => x"00000000", +118 => x"00000000", +119 => x"00000000", +120 => x"72098105", +121 => x"72050970", +122 => x"81050906", +123 => x"0a098106", +124 => x"53510400", +125 => x"00000000", +126 => x"00000000", +127 => x"00000000", +128 => x"71098105", +129 => x"52040000", +130 => x"00000000", +131 => x"00000000", +132 => x"00000000", +133 => x"00000000", +134 => x"00000000", +135 => x"00000000", +136 => x"72720981", +137 => x"05055351", +138 => x"04000000", +139 => x"00000000", +140 => x"00000000", +141 => x"00000000", +142 => x"00000000", +143 => x"00000000", +144 => x"72097206", +145 => x"73730906", +146 => x"07535104", +147 => x"00000000", +148 => x"00000000", +149 => x"00000000", +150 => x"00000000", +151 => x"00000000", +152 => x"71fc0608", +153 => x"72830609", +154 => x"81058305", +155 => x"1010102a", +156 => x"81ff0652", +157 => x"04000000", +158 => x"00000000", +159 => x"00000000", +160 => x"71fc0608", +161 => x"0b0b80d2", +162 => x"fc738306", +163 => x"10100508", +164 => x"060b0b0b", +165 => x"88aa0400", +166 => x"00000000", +167 => x"00000000", +168 => x"80088408", +169 => x"88087575", +170 => x"0b0b0b8d", +171 => x"872d5050", +172 => x"80085688", +173 => x"0c840c80", +174 => x"0c510400", +175 => x"00000000", +176 => x"80088408", +177 => x"88087575", +178 => x"0b0b0b8d", +179 => x"cb2d5050", +180 => x"80085688", +181 => x"0c840c80", +182 => x"0c510400", +183 => x"00000000", +184 => x"72097081", +185 => x"0509060a", +186 => x"8106ff05", +187 => x"70547106", +188 => x"73097274", +189 => x"05ff0506", +190 => x"07515151", +191 => x"04000000", +192 => x"72097081", +193 => x"0509060a", +194 => x"098106ff", +195 => x"05705471", +196 => x"06730972", +197 => x"7405ff05", +198 => x"06075151", +199 => x"51040000", +200 => x"05ff0504", +201 => x"00000000", +202 => x"00000000", +203 => x"00000000", +204 => x"00000000", +205 => x"00000000", +206 => x"00000000", +207 => x"00000000", +208 => x"810b0b0b", +209 => x"80d38c0c", +210 => x"51040000", +211 => x"00000000", +212 => x"00000000", +213 => x"00000000", +214 => x"00000000", +215 => x"00000000", +216 => x"71810552", +217 => x"04000000", +218 => x"00000000", +219 => x"00000000", +220 => x"00000000", +221 => x"00000000", +222 => x"00000000", +223 => x"00000000", +224 => x"00000000", +225 => x"00000000", +226 => x"00000000", +227 => x"00000000", +228 => x"00000000", +229 => x"00000000", +230 => x"00000000", +231 => x"00000000", +232 => x"02840572", +233 => x"10100552", +234 => x"04000000", +235 => x"00000000", +236 => x"00000000", +237 => x"00000000", +238 => x"00000000", +239 => x"00000000", +240 => x"00000000", +241 => x"00000000", +242 => x"00000000", +243 => x"00000000", +244 => x"00000000", +245 => x"00000000", +246 => x"00000000", +247 => x"00000000", +248 => x"717105ff", +249 => x"05715351", +250 => x"020d0400", +251 => x"00000000", +252 => x"00000000", +253 => x"00000000", +254 => x"00000000", +255 => x"00000000", +256 => x"83d93f80", +257 => x"ca953f04", +258 => x"10101010", +259 => x"10101010", +260 => x"10101010", +261 => x"10101010", +262 => x"10101010", +263 => x"10101010", +264 => x"10101010", +265 => x"10101053", +266 => x"51047381", +267 => x"ff067383", +268 => x"06098105", +269 => x"83051010", +270 => x"102b0772", +271 => x"fc060c51", +272 => x"51043c04", +273 => x"72728072", +274 => x"8106ff05", +275 => x"09720605", +276 => x"71105272", +277 => x"0a100a53", +278 => x"72ed3851", +279 => x"51535104", +280 => x"ff3d0d0b", +281 => x"0b80e2f8", +282 => x"08528412", +283 => x"08708106", +284 => x"515170f6", +285 => x"38710881", +286 => x"ff06800c", +287 => x"833d0d04", +288 => x"ff3d0d0b", +289 => x"0b80e2f8", +290 => x"08528412", +291 => x"08700a10", +292 => x"0a708106", +293 => x"51515170", +294 => x"f1387372", +295 => x"0c833d0d", +296 => x"0480d38c", +297 => x"08802ea8", +298 => x"38838080", +299 => x"0b0b0b80", +300 => x"e2f80c82", +301 => x"a0800b0b", +302 => x"0b80e2fc", +303 => x"0c829080", +304 => x"0b80e38c", +305 => x"0c0b0b80", +306 => x"e3800b80", +307 => x"e3900c04", +308 => x"f8808080", +309 => x"a40b0b0b", +310 => x"80e2f80c", +311 => x"f8808082", +312 => x"800b0b0b", +313 => x"80e2fc0c", +314 => x"f8808084", +315 => x"800b80e3", +316 => x"8c0cf880", +317 => x"8080940b", +318 => x"80e3900c", +319 => x"f8808080", +320 => x"9c0b80e3", +321 => x"880cf880", +322 => x"8080a00b", +323 => x"80e3940c", +324 => x"04f23d0d", +325 => x"600b0b80", +326 => x"e2fc0856", +327 => x"5d82750c", +328 => x"8059805a", +329 => x"800b8f3d", +330 => x"71101017", +331 => x"70085957", +332 => x"5d5b8076", +333 => x"81ff067c", +334 => x"832b5658", +335 => x"5276537b", +336 => x"5181fa3f", +337 => x"7d7f7a72", +338 => x"077c7207", +339 => x"71716081", +340 => x"05415f5d", +341 => x"5b595755", +342 => x"7a8724bb", +343 => x"380b0b80", +344 => x"e2fc087b", +345 => x"10101170", +346 => x"08585155", +347 => x"807681ff", +348 => x"067c832b", +349 => x"56585276", +350 => x"537b5181", +351 => x"c03f7d7f", +352 => x"7a72077c", +353 => x"72077171", +354 => x"60810541", +355 => x"5f5d5b59", +356 => x"5755877b", +357 => x"25c73876", +358 => x"7d0c7784", +359 => x"1e0c7c80", +360 => x"0c903d0d", +361 => x"04ff3d0d", +362 => x"80e38433", +363 => x"5170a738", +364 => x"80d39808", +365 => x"70085252", +366 => x"70802e94", +367 => x"38841280", +368 => x"d3980c70", +369 => x"2d80d398", +370 => x"08700852", +371 => x"5270ee38", +372 => x"810b80e3", +373 => x"8434833d", +374 => x"0d040480", +375 => x"3d0d0b0b", +376 => x"80e2f408", +377 => x"802e8e38", +378 => x"0b0b0b0b", +379 => x"800b802e", +380 => x"09810685", +381 => x"38823d0d", +382 => x"040b0b80", +383 => x"e2f4510b", +384 => x"0b0bf3fc", +385 => x"3f823d0d", +386 => x"0404fe3d", +387 => x"0d89530b", +388 => x"0b80d2c8", +389 => x"51838d3f", +390 => x"0b0b80d2", +391 => x"d8518384", +392 => x"3f810a0b", +393 => x"80e3980c", +394 => x"ff0b80e3", +395 => x"9c0cff13", +396 => x"53728025", +397 => x"da387280", +398 => x"0c843d0d", +399 => x"04f93d0d", +400 => x"797b7d7f", +401 => x"56545254", +402 => x"72802ea0", +403 => x"38705771", +404 => x"58a07331", +405 => x"52807225", +406 => x"a1387770", +407 => x"742b5770", +408 => x"732a7875", +409 => x"2b075651", +410 => x"74765351", +411 => x"70740c71", +412 => x"84150c73", +413 => x"800c893d", +414 => x"0d048056", +415 => x"7772302b", +416 => x"55747653", +417 => x"51e639fb", +418 => x"3d0d7779", +419 => x"55558056", +420 => x"757524ab", +421 => x"38807424", +422 => x"9d388053", +423 => x"73527451", +424 => x"80e13f80", +425 => x"08547580", +426 => x"2e853880", +427 => x"08305473", +428 => x"800c873d", +429 => x"0d047330", +430 => x"76813257", +431 => x"54dc3974", +432 => x"30558156", +433 => x"738025d2", +434 => x"38ec39fa", +435 => x"3d0d787a", +436 => x"57558057", +437 => x"767524a4", +438 => x"38759f2c", +439 => x"54815375", +440 => x"74327431", +441 => x"5274519b", +442 => x"3f800854", +443 => x"76802e85", +444 => x"38800830", +445 => x"5473800c", +446 => x"883d0d04", +447 => x"74305581", +448 => x"57d739fc", +449 => x"3d0d7678", +450 => x"53548153", +451 => x"80747326", +452 => x"52557280", +453 => x"2e983870", +454 => x"802eab38", +455 => x"807224a6", +456 => x"38711073", +457 => x"10757226", +458 => x"53545272", +459 => x"ea387351", +460 => x"78833874", +461 => x"5170800c", +462 => x"863d0d04", +463 => x"720a100a", +464 => x"720a100a", +465 => x"53537280", +466 => x"2ee43871", +467 => x"7426ed38", +468 => x"73723175", +469 => x"7407740a", +470 => x"100a740a", +471 => x"100a5555", +472 => x"5654e339", +473 => x"f73d0d7c", +474 => x"70525380", +475 => x"f93f7254", +476 => x"80085580", +477 => x"d2e85681", +478 => x"57800881", +479 => x"055a8b3d", +480 => x"e4115953", +481 => x"8259f413", +482 => x"527b8811", +483 => x"08525381", +484 => x"b03f8008", +485 => x"30708008", +486 => x"079f2c8a", +487 => x"07800c53", +488 => x"8b3d0d04", +489 => x"f63d0d7c", +490 => x"80d39c08", +491 => x"71535553", +492 => x"b53f7255", +493 => x"80085680", +494 => x"d2e85781", +495 => x"58800881", +496 => x"055b8c3d", +497 => x"e4115a53", +498 => x"825af413", +499 => x"52881408", +500 => x"5180ee3f", +501 => x"80083070", +502 => x"8008079f", +503 => x"2c8a0780", +504 => x"0c548c3d", +505 => x"0d04fd3d", +506 => x"0d757071", +507 => x"83065355", +508 => x"5270b438", +509 => x"71700870", +510 => x"09f7fbfd", +511 => x"ff1206f8", +512 => x"84828180", +513 => x"06545253", +514 => x"719b3884", +515 => x"13700870", +516 => x"09f7fbfd", +517 => x"ff1206f8", +518 => x"84828180", +519 => x"06545253", +520 => x"71802ee7", +521 => x"38725271", +522 => x"33537280", +523 => x"2e8a3881", +524 => x"12703354", +525 => x"5272f838", +526 => x"71743180", +527 => x"0c853d0d", +528 => x"04f23d0d", +529 => x"60628811", +530 => x"08705856", +531 => x"5f5a7380", +532 => x"2e818c38", +533 => x"8c1a2270", +534 => x"832a8132", +535 => x"81065658", +536 => x"74863890", +537 => x"1a089138", +538 => x"795190b7", +539 => x"3fff5580", +540 => x"0880ec38", +541 => x"8c1a2258", +542 => x"7d085580", +543 => x"7883ffff", +544 => x"06700a10", +545 => x"0a810641", +546 => x"5c577e77", +547 => x"2e80d738", +548 => x"76903874", +549 => x"08841608", +550 => x"88175758", +551 => x"5676802e", +552 => x"f2387654", +553 => x"88807727", +554 => x"84388880", +555 => x"54735375", +556 => x"529c1a08", +557 => x"51a41a08", +558 => x"58772d80", +559 => x"0b800825", +560 => x"82e03880", +561 => x"08167780", +562 => x"08317f88", +563 => x"05088008", +564 => x"31706188", +565 => x"050c5b58", +566 => x"5678ffb4", +567 => x"38805574", +568 => x"800c903d", +569 => x"0d047a81", +570 => x"32810677", +571 => x"40567580", +572 => x"2e81bd38", +573 => x"76903874", +574 => x"08841608", +575 => x"88175758", +576 => x"5976802e", +577 => x"f238881a", +578 => x"087883ff", +579 => x"ff067089", +580 => x"2a810656", +581 => x"59567380", +582 => x"2e82f838", +583 => x"7577278b", +584 => x"3877872a", +585 => x"81065c7b", +586 => x"82b53876", +587 => x"76278338", +588 => x"76567553", +589 => x"78527908", +590 => x"5185833f", +591 => x"881a0876", +592 => x"31881b0c", +593 => x"7908167a", +594 => x"0c765675", +595 => x"19777731", +596 => x"7f880508", +597 => x"78317061", +598 => x"88050c41", +599 => x"58597e80", +600 => x"2efefa38", +601 => x"8c1a2258", +602 => x"ff8a3978", +603 => x"79547c53", +604 => x"7b525684", +605 => x"c93f881a", +606 => x"08793188", +607 => x"1b0c7908", +608 => x"197a0c7c", +609 => x"76315d7c", +610 => x"8e387951", +611 => x"8ff23f80", +612 => x"08818f38", +613 => x"80085f75", +614 => x"1c777731", +615 => x"7f880508", +616 => x"78317061", +617 => x"88050c5d", +618 => x"585c7a80", +619 => x"2efeae38", +620 => x"76818338", +621 => x"74088416", +622 => x"08881757", +623 => x"585c7680", +624 => x"2ef23876", +625 => x"538a527b", +626 => x"5182d33f", +627 => x"80087c31", +628 => x"81055d80", +629 => x"08843881", +630 => x"175d815f", +631 => x"7c59767d", +632 => x"27833876", +633 => x"59941a08", +634 => x"881b0811", +635 => x"5758807a", +636 => x"085c5490", +637 => x"1a087b27", +638 => x"83388154", +639 => x"75792584", +640 => x"3873ba38", +641 => x"777924fe", +642 => x"e2387753", +643 => x"7b529c1a", +644 => x"0851a41a", +645 => x"0859782d", +646 => x"80085680", +647 => x"088024fe", +648 => x"e2388c1a", +649 => x"2280c007", +650 => x"5e7d8c1b", +651 => x"23ff5574", +652 => x"800c903d", +653 => x"0d047eff", +654 => x"a338ff87", +655 => x"3975537b", +656 => x"527a5182", +657 => x"f93f7908", +658 => x"167a0c79", +659 => x"518eb13f", +660 => x"8008cf38", +661 => x"7c76315d", +662 => x"7cfebc38", +663 => x"feac3990", +664 => x"1a087a08", +665 => x"71317811", +666 => x"70565a57", +667 => x"5280d39c", +668 => x"08518494", +669 => x"3f800880", +670 => x"2effa738", +671 => x"8008901b", +672 => x"0c800816", +673 => x"7a0c7794", +674 => x"1b0c7688", +675 => x"1b0c7656", +676 => x"fd993979", +677 => x"0858901a", +678 => x"08782783", +679 => x"38815475", +680 => x"77278438", +681 => x"73b33894", +682 => x"1a085473", +683 => x"772680d3", +684 => x"38735378", +685 => x"529c1a08", +686 => x"51a41a08", +687 => x"58772d80", +688 => x"08568008", +689 => x"8024fd83", +690 => x"388c1a22", +691 => x"80c0075e", +692 => x"7d8c1b23", +693 => x"ff55fed7", +694 => x"39755378", +695 => x"52775181", +696 => x"dd3f7908", +697 => x"167a0c79", +698 => x"518d953f", +699 => x"8008802e", +700 => x"fcd9388c", +701 => x"1a2280c0", +702 => x"075e7d8c", +703 => x"1b23ff55", +704 => x"fead3976", +705 => x"77547953", +706 => x"78525681", +707 => x"b13f881a", +708 => x"08773188", +709 => x"1b0c7908", +710 => x"177a0cfc", +711 => x"ae39fa3d", +712 => x"0d7a7902", +713 => x"8805a705", +714 => x"33555354", +715 => x"83742780", +716 => x"df387183", +717 => x"06517080", +718 => x"d7387171", +719 => x"57558351", +720 => x"75828029", +721 => x"13ff1252", +722 => x"56708025", +723 => x"f3388374", +724 => x"27bc3874", +725 => x"08763270", +726 => x"09f7fbfd", +727 => x"ff1206f8", +728 => x"84828180", +729 => x"06515170", +730 => x"802e9838", +731 => x"74518052", +732 => x"70335772", +733 => x"772eb938", +734 => x"81118113", +735 => x"53518372", +736 => x"27ee38fc", +737 => x"14841656", +738 => x"54738326", +739 => x"c6387452", +740 => x"ff145170", +741 => x"ff2e9738", +742 => x"71335472", +743 => x"742e9838", +744 => x"8112ff12", +745 => x"525270ff", +746 => x"2e098106", +747 => x"eb388051", +748 => x"70800c88", +749 => x"3d0d0471", +750 => x"800c883d", +751 => x"0d04fa3d", +752 => x"0d787a7c", +753 => x"72727259", +754 => x"57555856", +755 => x"57747727", +756 => x"b2387515", +757 => x"51767127", +758 => x"aa387076", +759 => x"18ff1853", +760 => x"535370ff", +761 => x"2e9638ff", +762 => x"12ff1454", +763 => x"52723372", +764 => x"34ff1151", +765 => x"70ff2e09", +766 => x"8106ec38", +767 => x"76800c88", +768 => x"3d0d048f", +769 => x"762780e6", +770 => x"38747707", +771 => x"83065170", +772 => x"80dc3876", +773 => x"75525370", +774 => x"70840552", +775 => x"08737084", +776 => x"05550c72", +777 => x"71708405", +778 => x"53087170", +779 => x"8405530c", +780 => x"71708405", +781 => x"53087170", +782 => x"8405530c", +783 => x"71708405", +784 => x"53087170", +785 => x"8405530c", +786 => x"f0155553", +787 => x"738f26c7", +788 => x"38837427", +789 => x"95387070", +790 => x"84055208", +791 => x"73708405", +792 => x"550cfc14", +793 => x"54738326", +794 => x"ed387271", +795 => x"5452ff14", +796 => x"5170ff2e", +797 => x"ff863872", +798 => x"70810554", +799 => x"33727081", +800 => x"055434ff", +801 => x"1151ea39", +802 => x"ef3d0d63", +803 => x"6567405d", +804 => x"427b802e", +805 => x"85823861", +806 => x"51a9eb3f", +807 => x"f81c7084", +808 => x"120870fc", +809 => x"0670628b", +810 => x"0570f806", +811 => x"4159455c", +812 => x"5f415796", +813 => x"742782c5", +814 => x"38807b24", +815 => x"7e7c2607", +816 => x"58805477", +817 => x"742e0981", +818 => x"0682ab38", +819 => x"787b2581", +820 => x"fe387817", +821 => x"80dad80b", +822 => x"8805085b", +823 => x"5679762e", +824 => x"84c53884", +825 => x"160870fe", +826 => x"06178411", +827 => x"08810641", +828 => x"55557e82", +829 => x"8d3874fc", +830 => x"06587976", +831 => x"2e84e338", +832 => x"78185f7e", +833 => x"7b2581ff", +834 => x"387c8106", +835 => x"547382c1", +836 => x"38767708", +837 => x"31841108", +838 => x"fc065657", +839 => x"75802e91", +840 => x"3879762e", +841 => x"84f03874", +842 => x"18195877", +843 => x"7b258491", +844 => x"3876802e", +845 => x"829b3878", +846 => x"15567a76", +847 => x"24829238", +848 => x"8c170888", +849 => x"1808718c", +850 => x"120c8812", +851 => x"0c5e7559", +852 => x"881761fc", +853 => x"055b5679", +854 => x"a42685ff", +855 => x"387b7659", +856 => x"55937a27", +857 => x"80c9387b", +858 => x"7084055d", +859 => x"087c5676", +860 => x"0c747084", +861 => x"0556088c", +862 => x"180c9017", +863 => x"589b7a27", +864 => x"ae387470", +865 => x"84055608", +866 => x"780c7470", +867 => x"84055608", +868 => x"94180c98", +869 => x"1758a37a", +870 => x"27953874", +871 => x"70840556", +872 => x"08780c74", +873 => x"70840556", +874 => x"089c180c", +875 => x"a0175874", +876 => x"70840556", +877 => x"08755f78", +878 => x"7084055a", +879 => x"0c777e70", +880 => x"84054008", +881 => x"71708405", +882 => x"530c7e08", +883 => x"710c5d78", +884 => x"7b315675", +885 => x"8f2680c9", +886 => x"38841708", +887 => x"81067907", +888 => x"84180c78", +889 => x"17841108", +890 => x"81078412", +891 => x"0c5b6151", +892 => x"a7953f88", +893 => x"17547380", +894 => x"0c933d0d", +895 => x"04905bfd", +896 => x"b8397756", +897 => x"fe83398c", +898 => x"16088817", +899 => x"08718c12", +900 => x"0c88120c", +901 => x"587e707c", +902 => x"3157598f", +903 => x"7627ffb9", +904 => x"387a1784", +905 => x"18088106", +906 => x"7c078419", +907 => x"0c768107", +908 => x"84120c76", +909 => x"11841108", +910 => x"81078412", +911 => x"0c5b8805", +912 => x"5261518f", +913 => x"de3f6151", +914 => x"a6bd3f88", +915 => x"1754ffa6", +916 => x"397d5261", +917 => x"5197db3f", +918 => x"80085a80", +919 => x"08802e81", +920 => x"ab388008", +921 => x"f8056084", +922 => x"0508fe06", +923 => x"61055855", +924 => x"74772e83", +925 => x"f238fc19", +926 => x"5877a426", +927 => x"81b0387b", +928 => x"80085657", +929 => x"93782780", +930 => x"dc387b70", +931 => x"70840552", +932 => x"08800870", +933 => x"8405800c", +934 => x"0c800871", +935 => x"70840553", +936 => x"085d567b", +937 => x"76708405", +938 => x"580c579b", +939 => x"7827b638", +940 => x"76708405", +941 => x"58087570", +942 => x"8405570c", +943 => x"76708405", +944 => x"58087570", +945 => x"8405570c", +946 => x"a3782799", +947 => x"38767084", +948 => x"05580875", +949 => x"70840557", +950 => x"0c767084", +951 => x"05580875", +952 => x"70840557", +953 => x"0c767084", +954 => x"05580877", +955 => x"5e757084", +956 => x"05570c74", +957 => x"7d708405", +958 => x"5f087170", +959 => x"8405530c", +960 => x"7d08710c", +961 => x"5f7b5261", +962 => x"518e983f", +963 => x"6151a4f7", +964 => x"3f79800c", +965 => x"933d0d04", +966 => x"7d526151", +967 => x"96943f80", +968 => x"08800c93", +969 => x"3d0d0484", +970 => x"160855fb", +971 => x"c9397753", +972 => x"7b528008", +973 => x"51a2a93f", +974 => x"7b526151", +975 => x"8de53fcc", +976 => x"398c1608", +977 => x"88170871", +978 => x"8c120c88", +979 => x"120c5d8c", +980 => x"17088818", +981 => x"08718c12", +982 => x"0c88120c", +983 => x"597759fb", +984 => x"ef397818", +985 => x"901c4055", +986 => x"7e7524fb", +987 => x"9c387a17", +988 => x"7080dad8", +989 => x"0b88050c", +990 => x"757c3181", +991 => x"0784120c", +992 => x"56841708", +993 => x"81067b07", +994 => x"84180c61", +995 => x"51a3f83f", +996 => x"881754fc", +997 => x"e1397418", +998 => x"19901c5e", +999 => x"5a7c7a24", +1000 => x"fb8f388c", +1001 => x"17088818", +1002 => x"08718c12", +1003 => x"0c88120c", +1004 => x"5e881761", +1005 => x"fc055759", +1006 => x"75a42681", +1007 => x"b6387b79", +1008 => x"59559376", +1009 => x"2780c938", +1010 => x"7b708405", +1011 => x"5d087c56", +1012 => x"790c7470", +1013 => x"84055608", +1014 => x"8c180c90", +1015 => x"17589b76", +1016 => x"27ae3874", +1017 => x"70840556", +1018 => x"08780c74", +1019 => x"70840556", +1020 => x"0894180c", +1021 => x"981758a3", +1022 => x"76279538", +1023 => x"74708405", +1024 => x"5608780c", +1025 => x"74708405", +1026 => x"56089c18", +1027 => x"0ca01758", +1028 => x"74708405", +1029 => x"56087541", +1030 => x"78708405", +1031 => x"5a0c7760", +1032 => x"70840542", +1033 => x"08717084", +1034 => x"05530c60", +1035 => x"08710c5e", +1036 => x"7a177080", +1037 => x"dad80b88", +1038 => x"050c7a7c", +1039 => x"31810784", +1040 => x"120c5884", +1041 => x"17088106", +1042 => x"7b078418", +1043 => x"0c6151a2", +1044 => x"b63f7854", +1045 => x"73800c93", +1046 => x"3d0d0479", +1047 => x"537b5275", +1048 => x"519ffd3f", +1049 => x"fae93984", +1050 => x"1508fc06", +1051 => x"19605859", +1052 => x"fadd3975", +1053 => x"537b5278", +1054 => x"519fe53f", +1055 => x"7a177080", +1056 => x"dad80b88", +1057 => x"050c7a7c", +1058 => x"31810784", +1059 => x"120c5884", +1060 => x"17088106", +1061 => x"7b078418", +1062 => x"0c6151a1", +1063 => x"ea3f7854", +1064 => x"ffb239fa", +1065 => x"3d0d7880", +1066 => x"d39c0854", +1067 => x"55b81308", +1068 => x"802e81af", +1069 => x"388c1522", +1070 => x"7083ffff", +1071 => x"0670832a", +1072 => x"81328106", +1073 => x"55555672", +1074 => x"802e80da", +1075 => x"3873842a", +1076 => x"81328106", +1077 => x"57ff5376", +1078 => x"80f23873", +1079 => x"822a8106", +1080 => x"5473802e", +1081 => x"b938b015", +1082 => x"08547380", +1083 => x"2e9c3880", +1084 => x"c0155373", +1085 => x"732e8f38", +1086 => x"735280d3", +1087 => x"9c08518a", +1088 => x"a23f8c15", +1089 => x"225676b0", +1090 => x"160c75db", +1091 => x"0657768c", +1092 => x"1623800b", +1093 => x"84160c90", +1094 => x"1508750c", +1095 => x"76567588", +1096 => x"0754738c", +1097 => x"16239015", +1098 => x"08802ebf", +1099 => x"388c1522", +1100 => x"70810655", +1101 => x"53739c38", +1102 => x"720a100a", +1103 => x"81065675", +1104 => x"85389415", +1105 => x"08547388", +1106 => x"160c8053", +1107 => x"72800c88", +1108 => x"3d0d0480", +1109 => x"0b88160c", +1110 => x"94150830", +1111 => x"98160c80", +1112 => x"53ea3972", +1113 => x"5182a63f", +1114 => x"fecb3974", +1115 => x"518fc03f", +1116 => x"8c152270", +1117 => x"81065553", +1118 => x"73802eff", +1119 => x"bb38d439", +1120 => x"f83d0d7a", +1121 => x"5776802e", +1122 => x"81973880", +1123 => x"d39c0854", +1124 => x"b8140880", +1125 => x"2e80eb38", +1126 => x"8c172270", +1127 => x"902b7090", +1128 => x"2c70832a", +1129 => x"81328106", +1130 => x"5b5b5755", +1131 => x"7780cb38", +1132 => x"90170856", +1133 => x"75802e80", +1134 => x"c1387608", +1135 => x"76317678", +1136 => x"0c798306", +1137 => x"55557385", +1138 => x"38941708", +1139 => x"58778818", +1140 => x"0c807525", +1141 => x"a5387453", +1142 => x"75529c17", +1143 => x"0851a417", +1144 => x"0854732d", +1145 => x"800b8008", +1146 => x"2580c938", +1147 => x"80081675", +1148 => x"80083156", +1149 => x"56748024", +1150 => x"dd38800b", +1151 => x"800c8a3d", +1152 => x"0d047351", +1153 => x"81873f8c", +1154 => x"17227090", +1155 => x"2b70902c", +1156 => x"70832a81", +1157 => x"3281065b", +1158 => x"5b575577", +1159 => x"dd38ff90", +1160 => x"39a38052", +1161 => x"80d39c08", +1162 => x"518cd43f", +1163 => x"8008800c", +1164 => x"8a3d0d04", +1165 => x"8c172280", +1166 => x"c0075877", +1167 => x"8c1823ff", +1168 => x"0b800c8a", +1169 => x"3d0d04fa", +1170 => x"3d0d7970", +1171 => x"80dc298c", +1172 => x"11547a53", +1173 => x"56578fda", +1174 => x"3f800880", +1175 => x"08555680", +1176 => x"08802ea2", +1177 => x"3880088c", +1178 => x"0554800b", +1179 => x"80080c76", +1180 => x"80088405", +1181 => x"0c738008", +1182 => x"88050c74", +1183 => x"53805273", +1184 => x"519cf93f", +1185 => x"75547380", +1186 => x"0c883d0d", +1187 => x"04fe3d0d", +1188 => x"74aacc0b", +1189 => x"bc120c53", +1190 => x"810bb814", +1191 => x"0c800b84", +1192 => x"dc140c83", +1193 => x"0b84e014", +1194 => x"0c84e813", +1195 => x"84e4140c", +1196 => x"84130851", +1197 => x"8070720c", +1198 => x"7084130c", +1199 => x"7088130c", +1200 => x"52840b8c", +1201 => x"1223718e", +1202 => x"12237190", +1203 => x"120c7194", +1204 => x"120c7198", +1205 => x"120c709c", +1206 => x"120c80c3", +1207 => x"bc0ba012", +1208 => x"0c80c488", +1209 => x"0ba4120c", +1210 => x"80c5840b", +1211 => x"a8120c80", +1212 => x"c5d50bac", +1213 => x"120c8813", +1214 => x"0872710c", +1215 => x"7284120c", +1216 => x"7288120c", +1217 => x"51890b8c", +1218 => x"1223810b", +1219 => x"8e122371", +1220 => x"90120c71", +1221 => x"94120c71", +1222 => x"98120c70", +1223 => x"9c120c80", +1224 => x"c3bc0ba0", +1225 => x"120c80c4", +1226 => x"880ba412", +1227 => x"0c80c584", +1228 => x"0ba8120c", +1229 => x"80c5d50b", +1230 => x"ac120c8c", +1231 => x"13087271", +1232 => x"0c728412", +1233 => x"0c728812", +1234 => x"0c518a0b", +1235 => x"8c122382", +1236 => x"0b8e1223", +1237 => x"7190120c", +1238 => x"7194120c", +1239 => x"7198120c", +1240 => x"709c120c", +1241 => x"80c3bc0b", +1242 => x"a0120c80", +1243 => x"c4880ba4", +1244 => x"120c80c5", +1245 => x"840ba812", +1246 => x"0c80c5d5", +1247 => x"0bac120c", +1248 => x"843d0d04", +1249 => x"f83d0d7a", +1250 => x"80d39c08", +1251 => x"b8110857", +1252 => x"57587481", +1253 => x"ec38aacc", +1254 => x"0bbc170c", +1255 => x"810bb817", +1256 => x"0c7484dc", +1257 => x"170c830b", +1258 => x"84e0170c", +1259 => x"84e81684", +1260 => x"e4170c84", +1261 => x"16087571", +1262 => x"0c758412", +1263 => x"0c758812", +1264 => x"0c59840b", +1265 => x"8c1a2374", +1266 => x"8e1a2374", +1267 => x"901a0c74", +1268 => x"941a0c74", +1269 => x"981a0c78", +1270 => x"9c1a0c80", +1271 => x"c3bc0ba0", +1272 => x"1a0c80c4", +1273 => x"880ba41a", +1274 => x"0c80c584", +1275 => x"0ba81a0c", +1276 => x"80c5d50b", +1277 => x"ac1a0c88", +1278 => x"16087571", +1279 => x"0c758412", +1280 => x"0c758812", +1281 => x"0c57890b", +1282 => x"8c182381", +1283 => x"0b8e1823", +1284 => x"7490180c", +1285 => x"7494180c", +1286 => x"7498180c", +1287 => x"769c180c", +1288 => x"80c3bc0b", +1289 => x"a0180c80", +1290 => x"c4880ba4", +1291 => x"180c80c5", +1292 => x"840ba818", +1293 => x"0c80c5d5", +1294 => x"0bac180c", +1295 => x"8c160875", +1296 => x"710c7584", +1297 => x"120c7588", +1298 => x"120c548a", +1299 => x"0b8c1523", +1300 => x"820b8e15", +1301 => x"23749015", +1302 => x"0c749415", +1303 => x"0c749815", +1304 => x"0c739c15", +1305 => x"0c80c3bc", +1306 => x"0ba0150c", +1307 => x"80c4880b", +1308 => x"a4150c80", +1309 => x"c5840ba8", +1310 => x"150c80c5", +1311 => x"d50bac15", +1312 => x"0c84dc16", +1313 => x"88110884", +1314 => x"1208ff05", +1315 => x"57575780", +1316 => x"75249f38", +1317 => x"8c162270", +1318 => x"902b7090", +1319 => x"2c515559", +1320 => x"73802e80", +1321 => x"ed3880dc", +1322 => x"16ff1656", +1323 => x"56748025", +1324 => x"e3387608", +1325 => x"5574802e", +1326 => x"8f387488", +1327 => x"11088412", +1328 => x"08ff0557", +1329 => x"5757c839", +1330 => x"82fc5277", +1331 => x"518ae33f", +1332 => x"80088008", +1333 => x"55568008", +1334 => x"802ea338", +1335 => x"80088c05", +1336 => x"7580080c", +1337 => x"54840b80", +1338 => x"0884050c", +1339 => x"73800888", +1340 => x"050c82f0", +1341 => x"53745273", +1342 => x"5198813f", +1343 => x"75547374", +1344 => x"780c5573", +1345 => x"ffb4388c", +1346 => x"780c800b", +1347 => x"800c8a3d", +1348 => x"0d04810b", +1349 => x"8c172373", +1350 => x"760c7388", +1351 => x"170c7384", +1352 => x"170c7390", +1353 => x"170c7394", +1354 => x"170c7398", +1355 => x"170cff0b", +1356 => x"8e172373", +1357 => x"b0170c73", +1358 => x"b4170c73", +1359 => x"80c4170c", +1360 => x"7380c817", +1361 => x"0c75800c", +1362 => x"8a3d0d04", +1363 => x"ff3d0da3", +1364 => x"80527351", +1365 => x"86a93f83", +1366 => x"3d0d04ff", +1367 => x"3d0da380", +1368 => x"5280d39c", +1369 => x"08518697", +1370 => x"3f833d0d", +1371 => x"04fb3d0d", +1372 => x"77705256", +1373 => x"98903f80", +1374 => x"dad80b88", +1375 => x"05088411", +1376 => x"08fc0670", +1377 => x"7b319fef", +1378 => x"05e08006", +1379 => x"e0800552", +1380 => x"5555a080", +1381 => x"75249438", +1382 => x"80527551", +1383 => x"97ea3f80", +1384 => x"dae00814", +1385 => x"53728008", +1386 => x"2e8f3875", +1387 => x"5197d83f", +1388 => x"80537280", +1389 => x"0c873d0d", +1390 => x"04743052", +1391 => x"755197c8", +1392 => x"3f8008ff", +1393 => x"2ea83880", +1394 => x"dad80b88", +1395 => x"05087476", +1396 => x"31810784", +1397 => x"120c5380", +1398 => x"da9c0875", +1399 => x"3180da9c", +1400 => x"0c755197", +1401 => x"a23f810b", +1402 => x"800c873d", +1403 => x"0d048052", +1404 => x"75519794", +1405 => x"3f80dad8", +1406 => x"0b880508", +1407 => x"80087131", +1408 => x"54548f73", +1409 => x"25ffa438", +1410 => x"800880da", +1411 => x"cc083180", +1412 => x"da9c0c72", +1413 => x"81078415", +1414 => x"0c755196", +1415 => x"ea3f8053", +1416 => x"ff9039f7", +1417 => x"3d0d7b7d", +1418 => x"545a7280", +1419 => x"2e828338", +1420 => x"795196d2", +1421 => x"3ff81384", +1422 => x"110870fe", +1423 => x"06701384", +1424 => x"1108fc06", +1425 => x"5c575854", +1426 => x"5780dae0", +1427 => x"08742e82", +1428 => x"de387784", +1429 => x"150c8073", +1430 => x"81065659", +1431 => x"74792e81", +1432 => x"d5387714", +1433 => x"84110881", +1434 => x"06565374", +1435 => x"a0387716", +1436 => x"567881e6", +1437 => x"38881408", +1438 => x"557480da", +1439 => x"e02e82f9", +1440 => x"388c1408", +1441 => x"708c170c", +1442 => x"7588120c", +1443 => x"58758107", +1444 => x"84180c75", +1445 => x"1776710c", +1446 => x"54788191", +1447 => x"3883ff76", +1448 => x"2781c838", +1449 => x"75892a76", +1450 => x"832a5454", +1451 => x"73802ebf", +1452 => x"3875862a", +1453 => x"b8055384", +1454 => x"7427b438", +1455 => x"80db1453", +1456 => x"947427ab", +1457 => x"38758c2a", +1458 => x"80ee0553", +1459 => x"80d47427", +1460 => x"9e38758f", +1461 => x"2a80f705", +1462 => x"5382d474", +1463 => x"27913875", +1464 => x"922a80fc", +1465 => x"05538ad4", +1466 => x"74278438", +1467 => x"80fe5372", +1468 => x"10101080", +1469 => x"dad80588", +1470 => x"11085555", +1471 => x"73752e82", +1472 => x"bf388414", +1473 => x"08fc0659", +1474 => x"7579278d", +1475 => x"38881408", +1476 => x"5473752e", +1477 => x"098106ea", +1478 => x"388c1408", +1479 => x"708c190c", +1480 => x"7488190c", +1481 => x"7788120c", +1482 => x"55768c15", +1483 => x"0c795194", +1484 => x"d63f8b3d", +1485 => x"0d047608", +1486 => x"77713158", +1487 => x"76058818", +1488 => x"08565674", +1489 => x"80dae02e", +1490 => x"80e0388c", +1491 => x"1708708c", +1492 => x"170c7588", +1493 => x"120c53fe", +1494 => x"89398814", +1495 => x"088c1508", +1496 => x"708c130c", +1497 => x"5988190c", +1498 => x"fea33975", +1499 => x"832a7054", +1500 => x"54807424", +1501 => x"81983872", +1502 => x"822c8171", +1503 => x"2b80dadc", +1504 => x"080780da", +1505 => x"d80b8405", +1506 => x"0c741010", +1507 => x"1080dad8", +1508 => x"05881108", +1509 => x"718c1b0c", +1510 => x"70881b0c", +1511 => x"7988130c", +1512 => x"565a5576", +1513 => x"8c150cff", +1514 => x"84398159", +1515 => x"fdb43977", +1516 => x"16738106", +1517 => x"54557298", +1518 => x"38760877", +1519 => x"71315875", +1520 => x"058c1808", +1521 => x"88190871", +1522 => x"8c120c88", +1523 => x"120c5555", +1524 => x"74810784", +1525 => x"180c7680", +1526 => x"dad80b88", +1527 => x"050c80da", +1528 => x"d4087526", +1529 => x"fec73880", +1530 => x"dad00852", +1531 => x"7951fafd", +1532 => x"3f795193", +1533 => x"923ffeba", +1534 => x"3981778c", +1535 => x"170c7788", +1536 => x"170c758c", +1537 => x"190c7588", +1538 => x"190c59fd", +1539 => x"80398314", +1540 => x"70822c81", +1541 => x"712b80da", +1542 => x"dc080780", +1543 => x"dad80b84", +1544 => x"050c7510", +1545 => x"101080da", +1546 => x"d8058811", +1547 => x"08718c1c", +1548 => x"0c70881c", +1549 => x"0c7a8813", +1550 => x"0c575b56", +1551 => x"53fee439", +1552 => x"807324a3", +1553 => x"3872822c", +1554 => x"81712b80", +1555 => x"dadc0807", +1556 => x"80dad80b", +1557 => x"84050c58", +1558 => x"748c180c", +1559 => x"7388180c", +1560 => x"7688160c", +1561 => x"fdc33983", +1562 => x"1370822c", +1563 => x"81712b80", +1564 => x"dadc0807", +1565 => x"80dad80b", +1566 => x"84050c59", +1567 => x"53da39f9", +1568 => x"3d0d797b", +1569 => x"5853800b", +1570 => x"80d39c08", +1571 => x"53567272", +1572 => x"2ebc3884", +1573 => x"dc135574", +1574 => x"762eb338", +1575 => x"88150884", +1576 => x"1608ff05", +1577 => x"54548073", +1578 => x"2499388c", +1579 => x"14227090", +1580 => x"2b535871", +1581 => x"80d43880", +1582 => x"dc14ff14", +1583 => x"54547280", +1584 => x"25e93874", +1585 => x"085574d4", +1586 => x"3880d39c", +1587 => x"085284dc", +1588 => x"12557480", +1589 => x"2ead3888", +1590 => x"15088416", +1591 => x"08ff0554", +1592 => x"54807324", +1593 => x"98388c14", +1594 => x"2270902b", +1595 => x"535871ad", +1596 => x"3880dc14", +1597 => x"ff145454", +1598 => x"728025ea", +1599 => x"38740855", +1600 => x"74d53875", +1601 => x"800c893d", +1602 => x"0d047351", +1603 => x"762d7580", +1604 => x"080780dc", +1605 => x"15ff1555", +1606 => x"5556ffa2", +1607 => x"39735176", +1608 => x"2d758008", +1609 => x"0780dc15", +1610 => x"ff155555", +1611 => x"56ca39ea", +1612 => x"3d0d688c", +1613 => x"1122700a", +1614 => x"100a8106", +1615 => x"57585674", +1616 => x"80e4388e", +1617 => x"16227090", +1618 => x"2b70902c", +1619 => x"51555880", +1620 => x"7424b138", +1621 => x"983dc405", +1622 => x"53735280", +1623 => x"d39c0851", +1624 => x"93fb3f80", +1625 => x"0b800824", +1626 => x"97387983", +1627 => x"e0800654", +1628 => x"7380c080", +1629 => x"2e818f38", +1630 => x"73828080", +1631 => x"2e819138", +1632 => x"8c162257", +1633 => x"76908007", +1634 => x"54738c17", +1635 => x"23888052", +1636 => x"80d39c08", +1637 => x"51819b3f", +1638 => x"80089d38", +1639 => x"8c162282", +1640 => x"0755748c", +1641 => x"172380c3", +1642 => x"1670770c", +1643 => x"90170c81", +1644 => x"0b94170c", +1645 => x"983d0d04", +1646 => x"80d39c08", +1647 => x"aacc0bbc", +1648 => x"120c588c", +1649 => x"16228180", +1650 => x"0754738c", +1651 => x"17238008", +1652 => x"760c8008", +1653 => x"90170c88", +1654 => x"800b9417", +1655 => x"0c74802e", +1656 => x"d3388e16", +1657 => x"2270902b", +1658 => x"70902c53", +1659 => x"56549cd0", +1660 => x"3f800880", +1661 => x"2effbd38", +1662 => x"8c162281", +1663 => x"0757768c", +1664 => x"1723983d", +1665 => x"0d04810b", +1666 => x"8c172258", +1667 => x"55fef539", +1668 => x"a8160880", +1669 => x"c5842e09", +1670 => x"8106fee4", +1671 => x"388c1622", +1672 => x"88800754", +1673 => x"738c1723", +1674 => x"88800b80", +1675 => x"cc170cfe", +1676 => x"dc39f43d", +1677 => x"0d7e608b", +1678 => x"1170f806", +1679 => x"5b55555d", +1680 => x"72962683", +1681 => x"38905880", +1682 => x"78247479", +1683 => x"26075580", +1684 => x"5474742e", +1685 => x"09810680", +1686 => x"ca387c51", +1687 => x"8ea83f77", +1688 => x"83f72680", +1689 => x"c5387783", +1690 => x"2a701010", +1691 => x"1080dad8", +1692 => x"058c1108", +1693 => x"58585475", +1694 => x"772e81f0", +1695 => x"38841608", +1696 => x"fc068c17", +1697 => x"08881808", +1698 => x"718c120c", +1699 => x"88120c5b", +1700 => x"76058411", +1701 => x"08810784", +1702 => x"120c537c", +1703 => x"518de83f", +1704 => x"88165473", +1705 => x"800c8e3d", +1706 => x"0d047789", +1707 => x"2a78832a", +1708 => x"58547380", +1709 => x"2ebf3877", +1710 => x"862ab805", +1711 => x"57847427", +1712 => x"b43880db", +1713 => x"14579474", +1714 => x"27ab3877", +1715 => x"8c2a80ee", +1716 => x"055780d4", +1717 => x"74279e38", +1718 => x"778f2a80", +1719 => x"f7055782", +1720 => x"d4742791", +1721 => x"3877922a", +1722 => x"80fc0557", +1723 => x"8ad47427", +1724 => x"843880fe", +1725 => x"57761010", +1726 => x"1080dad8", +1727 => x"058c1108", +1728 => x"56537473", +1729 => x"2ea33884", +1730 => x"1508fc06", +1731 => x"70793155", +1732 => x"56738f24", +1733 => x"88e43873", +1734 => x"802588e6", +1735 => x"388c1508", +1736 => x"5574732e", +1737 => x"098106df", +1738 => x"38811759", +1739 => x"80dae808", +1740 => x"567580da", +1741 => x"e02e82cc", +1742 => x"38841608", +1743 => x"fc067079", +1744 => x"31555573", +1745 => x"8f24bb38", +1746 => x"80dae00b", +1747 => x"80daec0c", +1748 => x"80dae00b", +1749 => x"80dae80c", +1750 => x"80742480", +1751 => x"db387416", +1752 => x"84110881", +1753 => x"0784120c", +1754 => x"53feb039", +1755 => x"88168c11", +1756 => x"08575975", +1757 => x"792e0981", +1758 => x"06fe8238", +1759 => x"821459ff", +1760 => x"ab397716", +1761 => x"78810784", +1762 => x"180c7080", +1763 => x"daec0c70", +1764 => x"80dae80c", +1765 => x"80dae00b", +1766 => x"8c120c8c", +1767 => x"11088812", +1768 => x"0c748107", +1769 => x"84120c74", +1770 => x"0574710c", +1771 => x"5b7c518b", +1772 => x"d63f8816", +1773 => x"54fdec39", +1774 => x"83ff7527", +1775 => x"83913874", +1776 => x"892a7583", +1777 => x"2a545473", +1778 => x"802ebf38", +1779 => x"74862ab8", +1780 => x"05538474", +1781 => x"27b43880", +1782 => x"db145394", +1783 => x"7427ab38", +1784 => x"748c2a80", +1785 => x"ee055380", +1786 => x"d474279e", +1787 => x"38748f2a", +1788 => x"80f70553", +1789 => x"82d47427", +1790 => x"91387492", +1791 => x"2a80fc05", +1792 => x"538ad474", +1793 => x"27843880", +1794 => x"fe537210", +1795 => x"101080da", +1796 => x"d8058811", +1797 => x"08555773", +1798 => x"772e868b", +1799 => x"38841408", +1800 => x"fc065b74", +1801 => x"7b278d38", +1802 => x"88140854", +1803 => x"73772e09", +1804 => x"8106ea38", +1805 => x"8c140880", +1806 => x"dad80b84", +1807 => x"0508718c", +1808 => x"190c7588", +1809 => x"190c7788", +1810 => x"130c5c57", +1811 => x"758c150c", +1812 => x"78538079", +1813 => x"24839838", +1814 => x"72822c81", +1815 => x"712b5656", +1816 => x"747b2680", +1817 => x"ca387a75", +1818 => x"06577682", +1819 => x"a33878fc", +1820 => x"06840559", +1821 => x"7410707c", +1822 => x"06555573", +1823 => x"82923884", +1824 => x"1959f139", +1825 => x"80dad80b", +1826 => x"84050879", +1827 => x"545b7880", +1828 => x"25c63882", +1829 => x"da397409", +1830 => x"7b067080", +1831 => x"dad80b84", +1832 => x"050c5b74", +1833 => x"1055747b", +1834 => x"26853874", +1835 => x"85bc3880", +1836 => x"dad80b88", +1837 => x"05087084", +1838 => x"1208fc06", +1839 => x"707b317b", +1840 => x"72268f72", +1841 => x"25075d57", +1842 => x"5c5c5578", +1843 => x"802e80d9", +1844 => x"38791580", +1845 => x"dad00819", +1846 => x"90115954", +1847 => x"5680dacc", +1848 => x"08ff2e88", +1849 => x"38a08f13", +1850 => x"e0800657", +1851 => x"76527c51", +1852 => x"89963f80", +1853 => x"08548008", +1854 => x"ff2e9038", +1855 => x"80087627", +1856 => x"82a73874", +1857 => x"80dad82e", +1858 => x"829f3880", +1859 => x"dad80b88", +1860 => x"05085584", +1861 => x"1508fc06", +1862 => x"70793179", +1863 => x"72268f72", +1864 => x"25075d55", +1865 => x"5a7a83f2", +1866 => x"38778107", +1867 => x"84160c77", +1868 => x"157080da", +1869 => x"d80b8805", +1870 => x"0c748107", +1871 => x"84120c56", +1872 => x"7c5188c3", +1873 => x"3f881554", +1874 => x"73800c8e", +1875 => x"3d0d0474", +1876 => x"832a7054", +1877 => x"54807424", +1878 => x"819b3872", +1879 => x"822c8171", +1880 => x"2b80dadc", +1881 => x"08077080", +1882 => x"dad80b84", +1883 => x"050c7510", +1884 => x"101080da", +1885 => x"d8058811", +1886 => x"08718c1b", +1887 => x"0c70881b", +1888 => x"0c798813", +1889 => x"0c57555c", +1890 => x"55758c15", +1891 => x"0cfdc139", +1892 => x"78791010", +1893 => x"1080dad8", +1894 => x"0570565b", +1895 => x"5c8c1408", +1896 => x"5675742e", +1897 => x"a3388416", +1898 => x"08fc0670", +1899 => x"79315853", +1900 => x"768f2483", +1901 => x"f1387680", +1902 => x"2584af38", +1903 => x"8c160856", +1904 => x"75742e09", +1905 => x"8106df38", +1906 => x"8814811a", +1907 => x"70830655", +1908 => x"5a5472c9", +1909 => x"387b8306", +1910 => x"5675802e", +1911 => x"fdb838ff", +1912 => x"1cf81b5b", +1913 => x"5c881a08", +1914 => x"7a2eea38", +1915 => x"fdb53983", +1916 => x"1953fce4", +1917 => x"39831470", +1918 => x"822c8171", +1919 => x"2b80dadc", +1920 => x"08077080", +1921 => x"dad80b84", +1922 => x"050c7610", +1923 => x"101080da", +1924 => x"d8058811", +1925 => x"08718c1c", +1926 => x"0c70881c", +1927 => x"0c7a8813", +1928 => x"0c58535d", +1929 => x"5653fee1", +1930 => x"3980da9c", +1931 => x"08175980", +1932 => x"08762e81", +1933 => x"8b3880da", +1934 => x"cc08ff2e", +1935 => x"848e3873", +1936 => x"76311980", +1937 => x"da9c0c73", +1938 => x"87067056", +1939 => x"5372802e", +1940 => x"88388873", +1941 => x"31701555", +1942 => x"5576149f", +1943 => x"ff06a080", +1944 => x"71311670", +1945 => x"547e5351", +1946 => x"53869d3f", +1947 => x"80085680", +1948 => x"08ff2e81", +1949 => x"9e3880da", +1950 => x"9c081370", +1951 => x"80da9c0c", +1952 => x"747580da", +1953 => x"d80b8805", +1954 => x"0c777631", +1955 => x"15810755", +1956 => x"56597a80", +1957 => x"dad82e83", +1958 => x"c038798f", +1959 => x"2682ef38", +1960 => x"810b8415", +1961 => x"0c841508", +1962 => x"fc067079", +1963 => x"31797226", +1964 => x"8f722507", +1965 => x"5d555a7a", +1966 => x"802efced", +1967 => x"3880db39", +1968 => x"80089fff", +1969 => x"065574fe", +1970 => x"ed387880", +1971 => x"da9c0c80", +1972 => x"dad80b88", +1973 => x"05087a18", +1974 => x"81078412", +1975 => x"0c5580da", +1976 => x"c8087927", +1977 => x"86387880", +1978 => x"dac80c80", +1979 => x"dac40879", +1980 => x"27fca038", +1981 => x"7880dac4", +1982 => x"0c841508", +1983 => x"fc067079", +1984 => x"31797226", +1985 => x"8f722507", +1986 => x"5d555a7a", +1987 => x"802efc99", +1988 => x"38883980", +1989 => x"745753fe", +1990 => x"dd397c51", +1991 => x"84e93f80", +1992 => x"0b800c8e", +1993 => x"3d0d0480", +1994 => x"7324a538", +1995 => x"72822c81", +1996 => x"712b80da", +1997 => x"dc080770", +1998 => x"80dad80b", +1999 => x"84050c5c", +2000 => x"5a768c17", +2001 => x"0c738817", +2002 => x"0c758818", +2003 => x"0cf9fd39", +2004 => x"83137082", +2005 => x"2c81712b", +2006 => x"80dadc08", +2007 => x"077080da", +2008 => x"d80b8405", +2009 => x"0c5d5b53", +2010 => x"d8397a75", +2011 => x"065c7bfc", +2012 => x"9f388419", +2013 => x"75105659", +2014 => x"f139ff17", +2015 => x"810559f7", +2016 => x"ab398c15", +2017 => x"08881608", +2018 => x"718c120c", +2019 => x"88120c59", +2020 => x"75158411", +2021 => x"08810784", +2022 => x"120c587c", +2023 => x"5183e83f", +2024 => x"881554fb", +2025 => x"a3397716", +2026 => x"78810784", +2027 => x"180c8c17", +2028 => x"08881808", +2029 => x"718c120c", +2030 => x"88120c5c", +2031 => x"7080daec", +2032 => x"0c7080da", +2033 => x"e80c80da", +2034 => x"e00b8c12", +2035 => x"0c8c1108", +2036 => x"88120c77", +2037 => x"81078412", +2038 => x"0c770577", +2039 => x"710c557c", +2040 => x"5183a43f", +2041 => x"881654f5", +2042 => x"ba397216", +2043 => x"84110881", +2044 => x"0784120c", +2045 => x"588c1608", +2046 => x"88170871", +2047 => x"8c120c88", +2048 => x"120c577c", +2049 => x"5183803f", +2050 => x"881654f5", +2051 => x"96397284", +2052 => x"150cf41a", +2053 => x"f8067084", +2054 => x"1d088106", +2055 => x"07841d0c", +2056 => x"701c5556", +2057 => x"850b8415", +2058 => x"0c850b88", +2059 => x"150c8f76", +2060 => x"27fdab38", +2061 => x"881b527c", +2062 => x"51ebe83f", +2063 => x"80dad80b", +2064 => x"88050880", +2065 => x"da9c085a", +2066 => x"55fd9339", +2067 => x"7880da9c", +2068 => x"0c7380da", +2069 => x"cc0cfbef", +2070 => x"39728415", +2071 => x"0cfcff39", +2072 => x"fb3d0d77", +2073 => x"707a7c58", +2074 => x"5553568f", +2075 => x"752780e6", +2076 => x"38727607", +2077 => x"83065170", +2078 => x"80dc3875", +2079 => x"73525470", +2080 => x"70840552", +2081 => x"08747084", +2082 => x"05560c73", +2083 => x"71708405", +2084 => x"53087170", +2085 => x"8405530c", +2086 => x"71708405", +2087 => x"53087170", +2088 => x"8405530c", +2089 => x"71708405", +2090 => x"53087170", +2091 => x"8405530c", +2092 => x"f0165654", +2093 => x"748f26c7", +2094 => x"38837527", +2095 => x"95387070", +2096 => x"84055208", +2097 => x"74708405", +2098 => x"560cfc15", +2099 => x"55748326", +2100 => x"ed387371", +2101 => x"5452ff15", +2102 => x"5170ff2e", +2103 => x"98387270", +2104 => x"81055433", +2105 => x"72708105", +2106 => x"5434ff11", +2107 => x"5170ff2e", +2108 => x"098106ea", +2109 => x"3875800c", +2110 => x"873d0d04", +2111 => x"fb3d0d77", +2112 => x"7a71028c", +2113 => x"05a30533", +2114 => x"58545456", +2115 => x"83732780", +2116 => x"d4387583", +2117 => x"06517080", +2118 => x"cc387488", +2119 => x"2b750770", +2120 => x"71902b07", +2121 => x"55518f73", +2122 => x"27a73873", +2123 => x"72708405", +2124 => x"540c7174", +2125 => x"71708405", +2126 => x"530c7471", +2127 => x"70840553", +2128 => x"0c747170", +2129 => x"8405530c", +2130 => x"f0145452", +2131 => x"728f26db", +2132 => x"38837327", +2133 => x"90387372", +2134 => x"70840554", +2135 => x"0cfc1353", +2136 => x"728326f2", +2137 => x"38ff1351", +2138 => x"70ff2e93", +2139 => x"38747270", +2140 => x"81055434", +2141 => x"ff115170", +2142 => x"ff2e0981", +2143 => x"06ef3875", +2144 => x"800c873d", +2145 => x"0d040404", +2146 => x"fd3d0d80", +2147 => x"0b80e3a0", +2148 => x"0c765184", +2149 => x"ee3f8008", +2150 => x"538008ff", +2151 => x"2e883872", +2152 => x"800c853d", +2153 => x"0d0480e3", +2154 => x"a0085473", +2155 => x"802ef038", +2156 => x"7574710c", +2157 => x"5272800c", +2158 => x"853d0d04", +2159 => x"f93d0d79", +2160 => x"7c557b54", +2161 => x"8e112270", +2162 => x"902b7090", +2163 => x"2c555780", +2164 => x"d39c0853", +2165 => x"585683f3", +2166 => x"3f800857", +2167 => x"800b8008", +2168 => x"24933880", +2169 => x"d0160880", +2170 => x"080580d0", +2171 => x"170c7680", +2172 => x"0c893d0d", +2173 => x"048c1622", +2174 => x"83dfff06", +2175 => x"55748c17", +2176 => x"2376800c", +2177 => x"893d0d04", +2178 => x"fa3d0d78", +2179 => x"8c112270", +2180 => x"882a7081", +2181 => x"06515758", +2182 => x"5674a938", +2183 => x"8c162283", +2184 => x"dfff0655", +2185 => x"748c1723", +2186 => x"7a547953", +2187 => x"8e162270", +2188 => x"902b7090", +2189 => x"2c545680", +2190 => x"d39c0852", +2191 => x"5681b23f", +2192 => x"883d0d04", +2193 => x"82548053", +2194 => x"8e162270", +2195 => x"902b7090", +2196 => x"2c545680", +2197 => x"d39c0852", +2198 => x"5782b83f", +2199 => x"8c162283", +2200 => x"dfff0655", +2201 => x"748c1723", +2202 => x"7a547953", +2203 => x"8e162270", +2204 => x"902b7090", +2205 => x"2c545680", +2206 => x"d39c0852", +2207 => x"5680f23f", +2208 => x"883d0d04", +2209 => x"f93d0d79", +2210 => x"7c557b54", +2211 => x"8e112270", +2212 => x"902b7090", +2213 => x"2c555780", +2214 => x"d39c0853", +2215 => x"585681f3", +2216 => x"3f800857", +2217 => x"8008ff2e", +2218 => x"99388c16", +2219 => x"22a08007", +2220 => x"55748c17", +2221 => x"23800880", +2222 => x"d0170c76", +2223 => x"800c893d", +2224 => x"0d048c16", +2225 => x"2283dfff", +2226 => x"0655748c", +2227 => x"17237680", +2228 => x"0c893d0d", +2229 => x"04fe3d0d", +2230 => x"748e1122", +2231 => x"70902b70", +2232 => x"902c5551", +2233 => x"515380d3", +2234 => x"9c0851bd", +2235 => x"3f843d0d", +2236 => x"04fb3d0d", +2237 => x"800b80e3", +2238 => x"a00c7a53", +2239 => x"79527851", +2240 => x"82fc3f80", +2241 => x"08558008", +2242 => x"ff2e8838", +2243 => x"74800c87", +2244 => x"3d0d0480", +2245 => x"e3a00856", +2246 => x"75802ef0", +2247 => x"38777671", +2248 => x"0c547480", +2249 => x"0c873d0d", +2250 => x"04fd3d0d", +2251 => x"800b80e3", +2252 => x"a00c7651", +2253 => x"85853f80", +2254 => x"08538008", +2255 => x"ff2e8838", +2256 => x"72800c85", +2257 => x"3d0d0480", +2258 => x"e3a00854", +2259 => x"73802ef0", +2260 => x"38757471", +2261 => x"0c527280", +2262 => x"0c853d0d", +2263 => x"04fc3d0d", +2264 => x"800b80e3", +2265 => x"a00c7852", +2266 => x"775188b8", +2267 => x"3f800854", +2268 => x"8008ff2e", +2269 => x"88387380", +2270 => x"0c863d0d", +2271 => x"0480e3a0", +2272 => x"08557480", +2273 => x"2ef03876", +2274 => x"75710c53", +2275 => x"73800c86", +2276 => x"3d0d04fb", +2277 => x"3d0d800b", +2278 => x"80e3a00c", +2279 => x"7a537952", +2280 => x"78518593", +2281 => x"3f800855", +2282 => x"8008ff2e", +2283 => x"88387480", +2284 => x"0c873d0d", +2285 => x"0480e3a0", +2286 => x"08567580", +2287 => x"2ef03877", +2288 => x"76710c54", +2289 => x"74800c87", +2290 => x"3d0d04fb", +2291 => x"3d0d800b", +2292 => x"80e3a00c", +2293 => x"7a537952", +2294 => x"7851829a", +2295 => x"3f800855", +2296 => x"8008ff2e", +2297 => x"88387480", +2298 => x"0c873d0d", +2299 => x"0480e3a0", +2300 => x"08567580", +2301 => x"2ef03877", +2302 => x"76710c54", +2303 => x"74800c87", +2304 => x"3d0d04fe", +2305 => x"3d0d80e3", +2306 => x"a4085170", +2307 => x"8a3880e3", +2308 => x"ac7080e3", +2309 => x"a40c5174", +2310 => x"1152ff53", +2311 => x"7187fb80", +2312 => x"80268838", +2313 => x"7180e3a4", +2314 => x"0c705372", +2315 => x"800c843d", +2316 => x"0d04fd3d", +2317 => x"0d800b80", +2318 => x"d3900854", +2319 => x"5472812e", +2320 => x"9c387380", +2321 => x"e3a80cc0", +2322 => x"d83fffbf", +2323 => x"b33f80e2", +2324 => x"e0528151", +2325 => x"c3b43f80", +2326 => x"0851889b", +2327 => x"3f7280e3", +2328 => x"a80cc0bd", +2329 => x"3fffbf98", +2330 => x"3f80e2e0", +2331 => x"528151c3", +2332 => x"993f8008", +2333 => x"5188803f", +2334 => x"00ff3900", +2335 => x"ff39f53d", +2336 => x"0d7e6080", +2337 => x"e3a80870", +2338 => x"5b585b5b", +2339 => x"7580c538", +2340 => x"777a25a2", +2341 => x"38771b70", +2342 => x"337081ff", +2343 => x"06585859", +2344 => x"758a2e99", +2345 => x"387681ff", +2346 => x"0651ffbf", +2347 => x"d33f8118", +2348 => x"58797824", +2349 => x"e0387980", +2350 => x"0c8d3d0d", +2351 => x"048d51ff", +2352 => x"bfbe3f78", +2353 => x"337081ff", +2354 => x"065257ff", +2355 => x"bfb23f81", +2356 => x"1858de39", +2357 => x"79557a54", +2358 => x"7d538552", +2359 => x"8d3dfc05", +2360 => x"51ffbede", +2361 => x"3f800856", +2362 => x"87863f7b", +2363 => x"80080c75", +2364 => x"800c8d3d", +2365 => x"0d04f63d", +2366 => x"0d7d7f80", +2367 => x"e3a80870", +2368 => x"5a585a5a", +2369 => x"7580c438", +2370 => x"767925b2", +2371 => x"38761a58", +2372 => x"ffbecd3f", +2373 => x"80087834", +2374 => x"800b8008", +2375 => x"81ff0657", +2376 => x"58758a2e", +2377 => x"a238758d", +2378 => x"32703070", +2379 => x"80257a07", +2380 => x"51515675", +2381 => x"b8388117", +2382 => x"57787724", +2383 => x"d0387656", +2384 => x"75800c8c", +2385 => x"3d0d0481", +2386 => x"58dc3978", +2387 => x"5579547c", +2388 => x"5384528c", +2389 => x"3dfc0551", +2390 => x"ffbde73f", +2391 => x"80085686", +2392 => x"8f3f7a80", +2393 => x"080c7580", +2394 => x"0c8c3d0d", +2395 => x"04811756", +2396 => x"cf39f93d", +2397 => x"0d795780", +2398 => x"e3a80880", +2399 => x"2ead3876", +2400 => x"51c4e33f", +2401 => x"7b567a55", +2402 => x"80088105", +2403 => x"54765382", +2404 => x"52893dfc", +2405 => x"0551ffbd", +2406 => x"a93f8008", +2407 => x"5785d13f", +2408 => x"7780080c", +2409 => x"76800c89", +2410 => x"3d0d0485", +2411 => x"c33f850b", +2412 => x"80080cff", +2413 => x"0b800c89", +2414 => x"3d0d04fb", +2415 => x"3d0d80e3", +2416 => x"a8087056", +2417 => x"54738838", +2418 => x"74800c87", +2419 => x"3d0d0477", +2420 => x"53835287", +2421 => x"3dfc0551", +2422 => x"ffbce73f", +2423 => x"80085485", +2424 => x"8f3f7580", +2425 => x"080c7380", +2426 => x"0c873d0d", +2427 => x"04ff0b80", +2428 => x"0c04fb3d", +2429 => x"0d775580", +2430 => x"e3a80880", +2431 => x"2ea93874", +2432 => x"51c3e33f", +2433 => x"80088105", +2434 => x"54745387", +2435 => x"52873dfc", +2436 => x"0551ffbc", +2437 => x"ad3f8008", +2438 => x"5584d53f", +2439 => x"7580080c", +2440 => x"74800c87", +2441 => x"3d0d0484", +2442 => x"c73f850b", +2443 => x"80080cff", +2444 => x"0b800c87", +2445 => x"3d0d04fa", +2446 => x"3d0d80e3", +2447 => x"a808802e", +2448 => x"a3387a55", +2449 => x"79547853", +2450 => x"8652883d", +2451 => x"fc0551ff", +2452 => x"bbf03f80", +2453 => x"08568498", +2454 => x"3f768008", +2455 => x"0c75800c", +2456 => x"883d0d04", +2457 => x"848a3f9d", +2458 => x"0b80080c", +2459 => x"ff0b800c", +2460 => x"883d0d04", +2461 => x"f73d0d7b", +2462 => x"7d5b59bc", +2463 => x"53805279", +2464 => x"51f4f93f", +2465 => x"80705657", +2466 => x"98567419", +2467 => x"70337078", +2468 => x"2b790781", +2469 => x"18f81a5a", +2470 => x"58595558", +2471 => x"847524ea", +2472 => x"38767a23", +2473 => x"84195880", +2474 => x"70565798", +2475 => x"56741870", +2476 => x"3370782b", +2477 => x"79078118", +2478 => x"f81a5a58", +2479 => x"59515484", +2480 => x"7524ea38", +2481 => x"76821b23", +2482 => x"88195880", +2483 => x"70565798", +2484 => x"56741870", +2485 => x"3370782b", +2486 => x"79078118", +2487 => x"f81a5a58", +2488 => x"59515484", +2489 => x"7524ea38", +2490 => x"76841b0c", +2491 => x"8c195880", +2492 => x"70565798", +2493 => x"56741870", +2494 => x"3370782b", +2495 => x"79078118", +2496 => x"f81a5a58", +2497 => x"59515484", +2498 => x"7524ea38", +2499 => x"76881b23", +2500 => x"90195880", +2501 => x"70565798", +2502 => x"56741870", +2503 => x"3370782b", +2504 => x"79078118", +2505 => x"f81a5a58", +2506 => x"59515484", +2507 => x"7524ea38", +2508 => x"768a1b23", +2509 => x"94195880", +2510 => x"70565798", +2511 => x"56741870", +2512 => x"3370782b", +2513 => x"79078118", +2514 => x"f81a5a58", +2515 => x"59515484", +2516 => x"7524ea38", +2517 => x"768c1b23", +2518 => x"98195880", +2519 => x"70565798", +2520 => x"56741870", +2521 => x"3370782b", +2522 => x"79078118", +2523 => x"f81a5a58", +2524 => x"59515484", +2525 => x"7524ea38", +2526 => x"768e1b23", +2527 => x"9c195880", +2528 => x"705657b8", +2529 => x"56741870", +2530 => x"3370782b", +2531 => x"79078118", +2532 => x"f81a5a58", +2533 => x"595a5488", +2534 => x"7524ea38", +2535 => x"76901b0c", +2536 => x"8b3d0d04", +2537 => x"e93d0d6a", +2538 => x"80e3a808", +2539 => x"57577593", +2540 => x"3880c080", +2541 => x"0b84180c", +2542 => x"75ac180c", +2543 => x"75800c99", +2544 => x"3d0d0489", +2545 => x"3d70556a", +2546 => x"54558a52", +2547 => x"993dffbc", +2548 => x"0551ffb8", +2549 => x"ed3f8008", +2550 => x"77537552", +2551 => x"56fd953f", +2552 => x"818e3f77", +2553 => x"80080c75", +2554 => x"800c993d", +2555 => x"0d04e93d", +2556 => x"0d695780", +2557 => x"e3a80880", +2558 => x"2eb73876", +2559 => x"51ffbfe6", +2560 => x"3f893d70", +2561 => x"56800881", +2562 => x"05557754", +2563 => x"568f5299", +2564 => x"3dffbc05", +2565 => x"51ffb8aa", +2566 => x"3f80086b", +2567 => x"53765257", +2568 => x"fcd23f80", +2569 => x"cb3f7780", +2570 => x"080c7680", +2571 => x"0c993d0d", +2572 => x"04be3f85", +2573 => x"0b80080c", +2574 => x"ff0b800c", +2575 => x"993d0d04", +2576 => x"fc3d0d81", +2577 => x"5480e3a8", +2578 => x"08883873", +2579 => x"800c863d", +2580 => x"0d047653", +2581 => x"97b95286", +2582 => x"3dfc0551", +2583 => x"ffb7e33f", +2584 => x"8008548c", +2585 => x"3f748008", +2586 => x"0c73800c", +2587 => x"863d0d04", +2588 => x"80d39c08", +2589 => x"800c04f7", +2590 => x"3d0d7b80", +2591 => x"d39c0882", +2592 => x"c811085a", +2593 => x"545a7780", +2594 => x"2e80da38", +2595 => x"81881884", +2596 => x"1908ff05", +2597 => x"81712b59", +2598 => x"55598074", +2599 => x"2480ea38", +2600 => x"807424b5", +2601 => x"3873822b", +2602 => x"78118805", +2603 => x"56568180", +2604 => x"19087706", +2605 => x"5372802e", +2606 => x"b6387816", +2607 => x"70085353", +2608 => x"79517408", +2609 => x"53722dff", +2610 => x"14fc17fc", +2611 => x"1779812c", +2612 => x"5a575754", +2613 => x"738025d6", +2614 => x"38770858", +2615 => x"77ffad38", +2616 => x"80d39c08", +2617 => x"53bc1308", +2618 => x"a5387951", +2619 => x"f78a3f74", +2620 => x"0853722d", +2621 => x"ff14fc17", +2622 => x"fc177981", +2623 => x"2c5a5757", +2624 => x"54738025", +2625 => x"ffa838d1", +2626 => x"398057ff", +2627 => x"93397251", +2628 => x"bc130854", +2629 => x"732d7951", +2630 => x"f6de3fff", +2631 => x"3d0d80e2", +2632 => x"e80bfc05", +2633 => x"70085252", +2634 => x"70ff2e91", +2635 => x"38702dfc", +2636 => x"12700852", +2637 => x"5270ff2e", +2638 => x"098106f1", +2639 => x"38833d0d", +2640 => x"0404ffb8", +2641 => x"e03f0400", +2642 => x"48656c6c", +2643 => x"6f20776f", +2644 => x"726c6420", +2645 => x"310a0000", +2646 => x"48656c6c", +2647 => x"6f20776f", +2648 => x"726c6420", +2649 => x"320a0000", +2650 => x"0a000000", +2651 => x"43000000", +2652 => x"64756d6d", +2653 => x"792e6578", +2654 => x"65000000", +2655 => x"00ffffff", +2656 => x"ff00ffff", +2657 => x"ffff00ff", +2658 => x"ffffff00", +2659 => x"00000000", +2660 => x"00000000", +2661 => x"00000000", +2662 => x"00003170", +2663 => x"000029a0", +2664 => x"00000000", +2665 => x"00002c08", +2666 => x"00002c64", +2667 => x"00002cc0", +2668 => x"00000000", +2669 => x"00000000", +2670 => x"00000000", +2671 => x"00000000", +2672 => x"00000000", +2673 => x"00000000", +2674 => x"00000000", +2675 => x"00000000", +2676 => x"00000000", +2677 => x"0000296c", +2678 => x"00000000", +2679 => x"00000000", +2680 => x"00000000", +2681 => x"00000000", +2682 => x"00000000", +2683 => x"00000000", +2684 => x"00000000", +2685 => x"00000000", +2686 => x"00000000", +2687 => x"00000000", +2688 => x"00000000", +2689 => x"00000000", +2690 => x"00000000", +2691 => x"00000000", +2692 => x"00000000", +2693 => x"00000000", +2694 => x"00000000", +2695 => x"00000000", +2696 => x"00000000", +2697 => x"00000000", +2698 => x"00000000", +2699 => x"00000000", +2700 => x"00000000", +2701 => x"00000000", +2702 => x"00000000", +2703 => x"00000000", +2704 => x"00000000", +2705 => x"00000000", +2706 => x"00000001", +2707 => x"330eabcd", +2708 => x"1234e66d", +2709 => x"deec0005", +2710 => x"000b0000", +2711 => x"00000000", +2712 => x"00000000", +2713 => x"00000000", +2714 => x"00000000", +2715 => x"00000000", +2716 => x"00000000", +2717 => x"00000000", +2718 => x"00000000", +2719 => x"00000000", +2720 => x"00000000", +2721 => x"00000000", +2722 => x"00000000", +2723 => x"00000000", +2724 => x"00000000", +2725 => x"00000000", +2726 => x"00000000", +2727 => x"00000000", +2728 => x"00000000", +2729 => x"00000000", +2730 => x"00000000", +2731 => x"00000000", +2732 => x"00000000", +2733 => x"00000000", +2734 => x"00000000", +2735 => x"00000000", +2736 => x"00000000", +2737 => x"00000000", +2738 => x"00000000", +2739 => x"00000000", +2740 => x"00000000", +2741 => x"00000000", +2742 => x"00000000", +2743 => x"00000000", +2744 => x"00000000", +2745 => x"00000000", +2746 => x"00000000", +2747 => x"00000000", +2748 => x"00000000", +2749 => x"00000000", +2750 => x"00000000", +2751 => x"00000000", +2752 => x"00000000", +2753 => x"00000000", +2754 => x"00000000", +2755 => x"00000000", +2756 => x"00000000", +2757 => x"00000000", +2758 => x"00000000", +2759 => x"00000000", +2760 => x"00000000", +2761 => x"00000000", +2762 => x"00000000", +2763 => x"00000000", +2764 => x"00000000", +2765 => x"00000000", +2766 => x"00000000", +2767 => x"00000000", +2768 => x"00000000", +2769 => x"00000000", +2770 => x"00000000", +2771 => x"00000000", +2772 => x"00000000", +2773 => x"00000000", +2774 => x"00000000", +2775 => x"00000000", +2776 => x"00000000", +2777 => x"00000000", +2778 => x"00000000", +2779 => x"00000000", +2780 => x"00000000", +2781 => x"00000000", +2782 => x"00000000", +2783 => x"00000000", +2784 => x"00000000", +2785 => x"00000000", +2786 => x"00000000", +2787 => x"00000000", +2788 => x"00000000", +2789 => x"00000000", +2790 => x"00000000", +2791 => x"00000000", +2792 => x"00000000", +2793 => x"00000000", +2794 => x"00000000", +2795 => x"00000000", +2796 => x"00000000", +2797 => x"00000000", +2798 => x"00000000", +2799 => x"00000000", +2800 => x"00000000", +2801 => x"00000000", +2802 => x"00000000", +2803 => x"00000000", +2804 => x"00000000", +2805 => x"00000000", +2806 => x"00000000", +2807 => x"00000000", +2808 => x"00000000", +2809 => x"00000000", +2810 => x"00000000", +2811 => x"00000000", +2812 => x"00000000", +2813 => x"00000000", +2814 => x"00000000", +2815 => x"00000000", +2816 => x"00000000", +2817 => x"00000000", +2818 => x"00000000", +2819 => x"00000000", +2820 => x"00000000", +2821 => x"00000000", +2822 => x"00000000", +2823 => x"00000000", +2824 => x"00000000", +2825 => x"00000000", +2826 => x"00000000", +2827 => x"00000000", +2828 => x"00000000", +2829 => x"00000000", +2830 => x"00000000", +2831 => x"00000000", +2832 => x"00000000", +2833 => x"00000000", +2834 => x"00000000", +2835 => x"00000000", +2836 => x"00000000", +2837 => x"00000000", +2838 => x"00000000", +2839 => x"00000000", +2840 => x"00000000", +2841 => x"00000000", +2842 => x"00000000", +2843 => x"00000000", +2844 => x"00000000", +2845 => x"00000000", +2846 => x"00000000", +2847 => x"00000000", +2848 => x"00000000", +2849 => x"00000000", +2850 => x"00000000", +2851 => x"00000000", +2852 => x"00000000", +2853 => x"00000000", +2854 => x"00000000", +2855 => x"00000000", +2856 => x"00000000", +2857 => x"00000000", +2858 => x"00000000", +2859 => x"00000000", +2860 => x"00000000", +2861 => x"00000000", +2862 => x"00000000", +2863 => x"00000000", +2864 => x"00000000", +2865 => x"00000000", +2866 => x"00000000", +2867 => x"00000000", +2868 => x"00000000", +2869 => x"00000000", +2870 => x"00000000", +2871 => x"00000000", +2872 => x"00000000", +2873 => x"00000000", +2874 => x"00000000", +2875 => x"00000000", +2876 => x"00000000", +2877 => x"00000000", +2878 => x"00000000", +2879 => x"00000000", +2880 => x"00000000", +2881 => x"00000000", +2882 => x"00000000", +2883 => x"00000000", +2884 => x"00000000", +2885 => x"00000000", +2886 => x"00000000", +2887 => x"00000000", +2888 => x"00000000", +2889 => x"00000000", +2890 => x"00000000", +2891 => x"00000000", +2892 => x"00000000", +2893 => x"00000000", +2894 => x"00000000", +2895 => x"00000000", +2896 => x"00000000", +2897 => x"00000000", +2898 => x"00000000", +2899 => x"ffffffff", +2900 => x"00000000", +2901 => x"00020000", +2902 => x"00000000", +2903 => x"00000000", +2904 => x"00002d58", +2905 => x"00002d58", +2906 => x"00002d60", +2907 => x"00002d60", +2908 => x"00002d68", +2909 => x"00002d68", +2910 => x"00002d70", +2911 => x"00002d70", +2912 => x"00002d78", +2913 => x"00002d78", +2914 => x"00002d80", +2915 => x"00002d80", +2916 => x"00002d88", +2917 => x"00002d88", +2918 => x"00002d90", +2919 => x"00002d90", +2920 => x"00002d98", +2921 => x"00002d98", +2922 => x"00002da0", +2923 => x"00002da0", +2924 => x"00002da8", +2925 => x"00002da8", +2926 => x"00002db0", +2927 => x"00002db0", +2928 => x"00002db8", +2929 => x"00002db8", +2930 => x"00002dc0", +2931 => x"00002dc0", +2932 => x"00002dc8", +2933 => x"00002dc8", +2934 => x"00002dd0", +2935 => x"00002dd0", +2936 => x"00002dd8", +2937 => x"00002dd8", +2938 => x"00002de0", +2939 => x"00002de0", +2940 => x"00002de8", +2941 => x"00002de8", +2942 => x"00002df0", +2943 => x"00002df0", +2944 => x"00002df8", +2945 => x"00002df8", +2946 => x"00002e00", +2947 => x"00002e00", +2948 => x"00002e08", +2949 => x"00002e08", +2950 => x"00002e10", +2951 => x"00002e10", +2952 => x"00002e18", +2953 => x"00002e18", +2954 => x"00002e20", +2955 => x"00002e20", +2956 => x"00002e28", +2957 => x"00002e28", +2958 => x"00002e30", +2959 => x"00002e30", +2960 => x"00002e38", +2961 => x"00002e38", +2962 => x"00002e40", +2963 => x"00002e40", +2964 => x"00002e48", +2965 => x"00002e48", +2966 => x"00002e50", +2967 => x"00002e50", +2968 => x"00002e58", +2969 => x"00002e58", +2970 => x"00002e60", +2971 => x"00002e60", +2972 => x"00002e68", +2973 => x"00002e68", +2974 => x"00002e70", +2975 => x"00002e70", +2976 => x"00002e78", +2977 => x"00002e78", +2978 => x"00002e80", +2979 => x"00002e80", +2980 => x"00002e88", +2981 => x"00002e88", +2982 => x"00002e90", +2983 => x"00002e90", +2984 => x"00002e98", +2985 => x"00002e98", +2986 => x"00002ea0", +2987 => x"00002ea0", +2988 => x"00002ea8", +2989 => x"00002ea8", +2990 => x"00002eb0", +2991 => x"00002eb0", +2992 => x"00002eb8", +2993 => x"00002eb8", +2994 => x"00002ec0", +2995 => x"00002ec0", +2996 => x"00002ec8", +2997 => x"00002ec8", +2998 => x"00002ed0", +2999 => x"00002ed0", +3000 => x"00002ed8", +3001 => x"00002ed8", +3002 => x"00002ee0", +3003 => x"00002ee0", +3004 => x"00002ee8", +3005 => x"00002ee8", +3006 => x"00002ef0", +3007 => x"00002ef0", +3008 => x"00002ef8", +3009 => x"00002ef8", +3010 => x"00002f00", +3011 => x"00002f00", +3012 => x"00002f08", +3013 => x"00002f08", +3014 => x"00002f10", +3015 => x"00002f10", +3016 => x"00002f18", +3017 => x"00002f18", +3018 => x"00002f20", +3019 => x"00002f20", +3020 => x"00002f28", +3021 => x"00002f28", +3022 => x"00002f30", +3023 => x"00002f30", +3024 => x"00002f38", +3025 => x"00002f38", +3026 => x"00002f40", +3027 => x"00002f40", +3028 => x"00002f48", +3029 => x"00002f48", +3030 => x"00002f50", +3031 => x"00002f50", +3032 => x"00002f58", +3033 => x"00002f58", +3034 => x"00002f60", +3035 => x"00002f60", +3036 => x"00002f68", +3037 => x"00002f68", +3038 => x"00002f70", +3039 => x"00002f70", +3040 => x"00002f78", +3041 => x"00002f78", +3042 => x"00002f80", +3043 => x"00002f80", +3044 => x"00002f88", +3045 => x"00002f88", +3046 => x"00002f90", +3047 => x"00002f90", +3048 => x"00002f98", +3049 => x"00002f98", +3050 => x"00002fa0", +3051 => x"00002fa0", +3052 => x"00002fa8", +3053 => x"00002fa8", +3054 => x"00002fb0", +3055 => x"00002fb0", +3056 => x"00002fb8", +3057 => x"00002fb8", +3058 => x"00002fc0", +3059 => x"00002fc0", +3060 => x"00002fc8", +3061 => x"00002fc8", +3062 => x"00002fd0", +3063 => x"00002fd0", +3064 => x"00002fd8", +3065 => x"00002fd8", +3066 => x"00002fe0", +3067 => x"00002fe0", +3068 => x"00002fe8", +3069 => x"00002fe8", +3070 => x"00002ff0", +3071 => x"00002ff0", +3072 => x"00002ff8", +3073 => x"00002ff8", +3074 => x"00003000", +3075 => x"00003000", +3076 => x"00003008", +3077 => x"00003008", +3078 => x"00003010", +3079 => x"00003010", +3080 => x"00003018", +3081 => x"00003018", +3082 => x"00003020", +3083 => x"00003020", +3084 => x"00003028", +3085 => x"00003028", +3086 => x"00003030", +3087 => x"00003030", +3088 => x"00003038", +3089 => x"00003038", +3090 => x"00003040", +3091 => x"00003040", +3092 => x"00003048", +3093 => x"00003048", +3094 => x"00003050", +3095 => x"00003050", +3096 => x"00003058", +3097 => x"00003058", +3098 => x"00003060", +3099 => x"00003060", +3100 => x"00003068", +3101 => x"00003068", +3102 => x"00003070", +3103 => x"00003070", +3104 => x"00003078", +3105 => x"00003078", +3106 => x"00003080", +3107 => x"00003080", +3108 => x"00003088", +3109 => x"00003088", +3110 => x"00003090", +3111 => x"00003090", +3112 => x"00003098", +3113 => x"00003098", +3114 => x"000030a0", +3115 => x"000030a0", +3116 => x"000030a8", +3117 => x"000030a8", +3118 => x"000030b0", +3119 => x"000030b0", +3120 => x"000030b8", +3121 => x"000030b8", +3122 => x"000030c0", +3123 => x"000030c0", +3124 => x"000030c8", +3125 => x"000030c8", +3126 => x"000030d0", +3127 => x"000030d0", +3128 => x"000030d8", +3129 => x"000030d8", +3130 => x"000030e0", +3131 => x"000030e0", +3132 => x"000030e8", +3133 => x"000030e8", +3134 => x"000030f0", +3135 => x"000030f0", +3136 => x"000030f8", +3137 => x"000030f8", +3138 => x"00003100", +3139 => x"00003100", +3140 => x"00003108", +3141 => x"00003108", +3142 => x"00003110", +3143 => x"00003110", +3144 => x"00003118", +3145 => x"00003118", +3146 => x"00003120", +3147 => x"00003120", +3148 => x"00003128", +3149 => x"00003128", +3150 => x"00003130", +3151 => x"00003130", +3152 => x"00003138", +3153 => x"00003138", +3154 => x"00003140", +3155 => x"00003140", +3156 => x"00003148", +3157 => x"00003148", +3158 => x"00003150", +3159 => x"00003150", +3160 => x"00002970", +3161 => x"ffffffff", +3162 => x"00000000", +3163 => x"ffffffff", +3164 => x"00000000", + others => x"00000000" +); + +begin + +process (clk) +begin + if (clk'event and clk = '1') then + mem_busy<=mem_writeEnable or mem_readEnable; + if (mem_writeEnable = '1') then + ram(conv_integer(mem_addr(maxAddrBit downto minAddrBit))) := mem_write; + end if; + if (mem_readEnable = '1') then + mem_read <= ram(conv_integer(mem_addr(maxAddrBit downto minAddrBit))); + end if; + end if; +end process; + + + + +end dram_arch; diff --git a/zpu/hdl/zpu4/src/fastdmips.do b/zpu/hdl/zpu4/src/fastdmips.do new file mode 100644 index 0000000..504bf60 --- /dev/null +++ b/zpu/hdl/zpu4/src/fastdmips.do @@ -0,0 +1,19 @@ +set BreakOnAssertion 1 +vlib work + +vcom -93 -explicit zpu_config_fastsim.vhd +vcom -93 -explicit zpupkg.vhd +vcom -93 -explicit txt_util.vhd +vcom -93 -explicit sim_fpga_top.vhd +vcom -93 -explicit zpu_core.vhd +vcom -93 -explicit dram_dmips.vhd +vcom -93 -explicit timer.vhd +vcom -93 -explicit io.vhd +vcom -93 -explicit trace.vhd + + +vsim fpga_top +view wave + +# run ZPU +run 60000 ms diff --git a/zpu/hdl/zpu4/src/fastdmipsintstack.do b/zpu/hdl/zpu4/src/fastdmipsintstack.do new file mode 100644 index 0000000..ee9571e --- /dev/null +++ b/zpu/hdl/zpu4/src/fastdmipsintstack.do @@ -0,0 +1,19 @@ +set BreakOnAssertion 1 +vlib work + +vcom -93 -explicit zpu_config_fastsim.vhd +vcom -93 -explicit zpupkg.vhd +vcom -93 -explicit txt_util.vhd +vcom -93 -explicit sim_fpga_top.vhd +vcom -93 -explicit zpu_core_intstack.vhd +vcom -93 -explicit dram_dmips.vhd +vcom -93 -explicit timer.vhd +vcom -93 -explicit io.vhd +vcom -93 -explicit trace.vhd + + +vsim fpga_top +view wave + +# run ZPU +run 60000 ms diff --git a/zpu/hdl/zpu4/src/fastdmipssmall.do b/zpu/hdl/zpu4/src/fastdmipssmall.do new file mode 100644 index 0000000..3eaa083 --- /dev/null +++ b/zpu/hdl/zpu4/src/fastdmipssmall.do @@ -0,0 +1,21 @@ +set BreakOnAssertion 1 +vlib work + + +vcom -93 -explicit zpu_config_trace.vhd +vcom -93 -explicit zpupkg.vhd +vcom -93 -explicit txt_util.vhd +vcom -93 -explicit sim_fpga_top.vhd +vcom -93 -explicit zpu_core_small.vhd +vcom -93 -explicit bram_dmips.vhd +vcom -93 -explicit dram_dmips.vhd +vcom -93 -explicit timer.vhd +vcom -93 -explicit io.vhd +vcom -93 -explicit trace.vhd + + +vsim fpga_top +view wave + +# run ZPU +run 60000 ms diff --git a/zpu/hdl/zpu4/src/fastsimzpu.do b/zpu/hdl/zpu4/src/fastsimzpu.do new file mode 100644 index 0000000..504bf60 --- /dev/null +++ b/zpu/hdl/zpu4/src/fastsimzpu.do @@ -0,0 +1,19 @@ +set BreakOnAssertion 1 +vlib work + +vcom -93 -explicit zpu_config_fastsim.vhd +vcom -93 -explicit zpupkg.vhd +vcom -93 -explicit txt_util.vhd +vcom -93 -explicit sim_fpga_top.vhd +vcom -93 -explicit zpu_core.vhd +vcom -93 -explicit dram_dmips.vhd +vcom -93 -explicit timer.vhd +vcom -93 -explicit io.vhd +vcom -93 -explicit trace.vhd + + +vsim fpga_top +view wave + +# run ZPU +run 60000 ms diff --git a/zpu/hdl/zpu4/src/ic300.bitgen b/zpu/hdl/zpu4/src/ic300.bitgen new file mode 100644 index 0000000..1095099 --- /dev/null +++ b/zpu/hdl/zpu4/src/ic300.bitgen @@ -0,0 +1,27 @@ +-g DebugBitstream:No +-g Binary:yes +-g CRC:Enable +-g ConfigRate:50 +-g CclkPin:Pullnone +-g M0Pin:Pullnone +-g M1Pin:Pullnone +-g M2Pin:Pullnone +-g ProgPin:PullUp +-g DonePin:Pullnone +-g TckPin:Pullnone +-g TdiPin:Pullnone +-g TdoPin:Pullnone +-g TmsPin:Pullnone +-g UnusedPin:Pullnone +-g UserID:0xFFFFFFFF +-g DCMShutDown:Disable +-g DCIUpdateMode:AsRequired +-g StartUpClk:CClk +-g DONE_cycle:4 +-g GTS_cycle:5 +-g GWE_cycle:6 +-g LCK_cycle:NoWait +-g Security:Level1 +-g DonePipe:No +-g DriveDone:Yes + diff --git a/zpu/hdl/zpu4/src/ic300.lso b/zpu/hdl/zpu4/src/ic300.lso new file mode 100644 index 0000000..22de730 --- /dev/null +++ b/zpu/hdl/zpu4/src/ic300.lso @@ -0,0 +1 @@ +work diff --git a/zpu/hdl/zpu4/src/ic300.ucf b/zpu/hdl/zpu4/src/ic300.ucf new file mode 100644 index 0000000..4a141b9 --- /dev/null +++ b/zpu/hdl/zpu4/src/ic300.ucf @@ -0,0 +1,146 @@ +# clock inputs +net "cpu_clk_p" loc = "R9" | iostandard=LVTTL; + +# input pins +net "cpu_a_p(0)" loc = "N15" | iostandard=LVTTL; +net "cpu_a_p(1)" loc = "P16" | iostandard=LVTTL; +net "cpu_a_p(2)" loc = "P13" | iostandard=LVTTL; +net "cpu_a_p(3)" loc = "N16" | iostandard=LVTTL; +net "cpu_a_p(4)" loc = "P15" | iostandard=LVTTL; +net "cpu_a_p(5)" loc = "R11" | iostandard=LVTTL; +net "cpu_a_p(6)" loc = "T14" | iostandard=LVTTL; +net "cpu_a_p(7)" loc = "R16" | iostandard=LVTTL; +net "cpu_a_p(8)" loc = "P14" | iostandard=LVTTL; +net "cpu_a_p(9)" loc = "T13" | iostandard=LVTTL; +net "cpu_a_p(10)" loc = "R13" | iostandard=LVTTL; +net "cpu_a_p(11)" loc = "P7" | iostandard=LVTTL; +net "cpu_a_p(12)" loc = "N12" | iostandard=LVTTL; +net "cpu_a_p(13)" loc = "R12" | iostandard=LVTTL; +net "cpu_a_p(14)" loc = "L13" | iostandard=LVTTL; +net "cpu_a_p(15)" loc = "K12" | iostandard=LVTTL; +net "cpu_a_p(16)" loc = "K15" | iostandard=LVTTL; +net "cpu_a_p(17)" loc = "T10" | iostandard=LVTTL; +net "cpu_a_p(18)" loc = "T9" | iostandard=LVTTL; +net "cpu_a_p(19)" loc = "N10" | iostandard=LVTTL; +net "cpu_a_p(20)" loc = "T8" | iostandard=LVTTL; +net "cpu_wr_n_p(0)" loc = "L15" | iostandard=LVTTL; +net "cpu_wr_n_p(1)" loc = "N14" | iostandard=LVTTL; +net "cpu_oe_n_p" loc = "T12" | iostandard=LVTTL; +net "cpu_cs_n_p(1)" loc = "R3" | iostandard=LVTTL; +net "cpu_cs_n_p(2)" loc = "M16" | iostandard=LVTTL; +net "cpu_cs_n_p(3)" loc = "P11" | iostandard=LVTTL; + +#net "sdr_clk_fb_p" loc = "B8" | iostandard=SSTL2_I; + +# output pins +net "cpu_fiq_p" loc = "K16" | iostandard=LVTTL; +net "cpu_irq_p(0)" loc = "M14" | iostandard=LVTTL; +net "cpu_irq_p(1)" loc = "J16" | iostandard=LVTTL; +net "cpu_wait_n_p" loc = "M15" | iostandard=LVTTL; + +#net "sdr_clk_p" loc = "D8" | iostandard=SSTL2_I | FAST; +#net "sdr_clk_n_p" loc = "F5" | iostandard=SSTL2_I | FAST; +#net "cke_q_p" loc = "F4" | iostandard=SSTL2_I | FAST; +#net "cs_qn_p" loc = "M2" | iostandard=SSTL2_I | FAST | PULLUP; +#net "ras_qn_p" loc = "J2" | iostandard=SSTL2_I | FAST | PULLUP | NODELAY; +#net "cas_qn_p" loc = "M3" | iostandard=SSTL2_I | FAST | PULLUP | NODELAY; +#net "we_qn_p" loc = "K4" | iostandard=SSTL2_I | FAST | PULLUP | NODELAY; +#net "dm_q_p(0)" loc = "L4" | iostandard=SSTL2_I | FAST; +#net "dm_q_p(1)" loc = "E4" | iostandard=SSTL2_I | FAST; +#net "dqs_q_p(0)" loc = "L3" | iostandard=SSTL2_I | FAST; +#net "dqs_q_p(1)" loc = "D3" | iostandard=SSTL2_I | FAST; +#net "ba_q_p(0)" loc = "M1" | iostandard=SSTL2_I | FAST; +#net "ba_q_p(1)" loc = "J3" | iostandard=SSTL2_I | FAST; +#net "sdr_a_p(0)" loc = "J4" | iostandard=SSTL2_I | FAST; +#net "sdr_a_p(1)" loc = "N2" | iostandard=SSTL2_I | FAST; +#net "sdr_a_p(2)" loc = "H4" | iostandard=SSTL2_I | FAST; +#net "sdr_a_p(3)" loc = "P2" | iostandard=SSTL2_I | FAST; +#net "sdr_a_p(4)" loc = "E7" | iostandard=SSTL2_I | FAST; +#net "sdr_a_p(5)" loc = "G4" | iostandard=SSTL2_I | FAST; +#net "sdr_a_p(6)" loc = "D7" | iostandard=SSTL2_I | FAST; +#net "sdr_a_p(7)" loc = "G5" | iostandard=SSTL2_I | FAST; +#net "sdr_a_p(8)" loc = "C7" | iostandard=SSTL2_I | FAST; +#net "sdr_a_p(9)" loc = "F3" | iostandard=SSTL2_I | FAST; +#net "sdr_a_p(10)" loc = "N3" | iostandard=SSTL2_I | FAST; +#net "sdr_a_p(11)" loc = "E6" | iostandard=SSTL2_I | FAST; +#net "sdr_a_p(12)" loc = "D6" | iostandard=SSTL2_I | FAST; + +# bidirectional pins +net "cpu_d_p(0)" loc = "M11" | iostandard=LVTTL; +net "cpu_d_p(1)" loc = "N11" | iostandard=LVTTL; +net "cpu_d_p(2)" loc = "P10" | iostandard=LVTTL; +net "cpu_d_p(3)" loc = "R10" | iostandard=LVTTL; +net "cpu_d_p(4)" loc = "T7" | iostandard=LVTTL; +net "cpu_d_p(5)" loc = "R7" | iostandard=LVTTL; +net "cpu_d_p(6)" loc = "N6" | iostandard=LVTTL; +net "cpu_d_p(7)" loc = "M6" | iostandard=LVTTL; +net "cpu_d_p(8)" loc = "K13" | iostandard=LVTTL; +net "cpu_d_p(9)" loc = "M10" | iostandard=LVTTL; +net "cpu_d_p(10)" loc = "L12" | iostandard=LVTTL; +net "cpu_d_p(11)" loc = "M13" | iostandard=LVTTL; +net "cpu_d_p(12)" loc = "K14" | iostandard=LVTTL; +net "cpu_d_p(13)" loc = "L14" | iostandard=LVTTL; +net "cpu_d_p(14)" loc = "J13" | iostandard=LVTTL; +net "cpu_d_p(15)" loc = "J14" | iostandard=LVTTL; + +#net "sdr_d_p(0)" loc = "G1" | iostandard=SSTL2_I | NODELAY | FAST; +#net "sdr_d_p(1)" loc = "H3" | iostandard=SSTL2_I | NODELAY | FAST; +#net "sdr_d_p(2)" loc = "G3" | iostandard=SSTL2_I | NODELAY | FAST; +#net "sdr_d_p(3)" loc = "K2" | iostandard=SSTL2_I | NODELAY | FAST; +#net "sdr_d_p(4)" loc = "F2" | iostandard=SSTL2_I | NODELAY | FAST; +#net "sdr_d_p(5)" loc = "L2" | iostandard=SSTL2_I | NODELAY | FAST; +#net "sdr_d_p(6)" loc = "E1" | iostandard=SSTL2_I | NODELAY | FAST; +#net "sdr_d_p(7)" loc = "M4" | iostandard=SSTL2_I | NODELAY | FAST; +#net "sdr_d_p(8)" loc = "C6" | iostandard=SSTL2_I | NODELAY | FAST; +#net "sdr_d_p(9)" loc = "E2" | iostandard=SSTL2_I | NODELAY | FAST; +#net "sdr_d_p(10)" loc = "C2" | iostandard=SSTL2_I | NODELAY | FAST; +#net "sdr_d_p(11)" loc = "D1" | iostandard=SSTL2_I | NODELAY | FAST; +#net "sdr_d_p(12)" loc = "B7" | iostandard=SSTL2_I | NODELAY | FAST; +#net "sdr_d_p(13)" loc = "D2" | iostandard=SSTL2_I | NODELAY | FAST; +#net "sdr_d_p(14)" loc = "B6" | iostandard=SSTL2_I | NODELAY | FAST; +#net "sdr_d_p(15)" loc = "B5" | iostandard=SSTL2_I | NODELAY | FAST; + +# TIMING +# Create timing names +NET "cpu_clk_p" TNM_NET = "cpu_clk_p"; +NET "sdr_clk_fb_p" TNM_NET = "sdr_clk_fb_p"; +#NET "cpu_clk" TNM_NET = "cpu_clk"; +#NET "cpu_clk_2x" TNM_NET = "cpu_clk_2x"; +#NET "cpu_clk_4x" TNM_NET = "cpu_clk_4x"; +#NET "ddr_in_clk" TNM_NET = "ddr_in_clk"; +#NET "ddr_in_clk_2x" TNM_NET = "ddr_in_clk_2x"; + +## Create timing + +# Periode timing +TIMESPEC "TS_cpu_clk" = PERIOD "cpu_clk_p" 10 ns HIGH 50 %; +#TIMESPEC "TS_sdr_clk_fb_p" = PERIOD "sdr_clk_fb_p" 7.8 ns HIGH 50 %; + +# Clock domain crossing timing +#TIMESPEC "TS_cpu1_to_cpu2" = FROM "cpu_clk" TO "cpu_clk_2x" 7.8 ns; +#TIMESPEC "TS_cpu1_to_cpu4" = FROM "cpu_clk" TO "cpu_clk_4x" 3.9 ns; +#TIMESPEC "TS_cpu1_to_ddr2" = FROM "cpu_clk" TO "ddr_in_clk" 7.8 ns; +#TIMESPEC "TS_cpu1_to_ddr2_2x" = FROM "cpu_clk" TO "ddr_in_clk_2x" 3.9 ns; + +#TIMESPEC "TS_cpu2_to_cpu1" = FROM "cpu_clk_2x" TO "cpu_clk" 7.8 ns; +#TIMESPEC "TS_cpu2_to_cpu4" = FROM "cpu_clk_2x" TO "cpu_clk_4x" 3.9 ns; +#TIMESPEC "TS_cpu2_to_ddr2" = FROM "cpu_clk_2x" TO "ddr_in_clk" 7.8 ns; +#TIMESPEC "TS_cpu2_to_ddr_2x" = FROM "cpu_clk_2x" TO "ddr_in_clk_2x" 3.9 ns; + +#TIMESPEC "TS_cpu4_to_cpu1" = FROM "cpu_clk_4x" TO "cpu_clk" 3.9 ns; +#TIMESPEC "TS_cpu4_to_cpu2" = FROM "cpu_clk_4x" TO "cpu_clk_2x" 3.9 ns; +#TIMESPEC "TS_cpu4_to_ddr2" = FROM "cpu_clk_4x" TO "ddr_in_clk" 3.9 ns; +#TIMESPEC "TS_cpu4_to_ddr2_2x" = FROM "cpu_clk_4x" TO "ddr_in_clk_2x" 3.9 ns; + +#TIMESPEC "TS_ddr2_to_cpu1" = FROM "ddr_in_clk" TO "cpu_clk" 7.8 ns; +#TIMESPEC "TS_ddr2_to_cpu2" = FROM "ddr_in_clk" TO "cpu_clk_2x" 7.8 ns; +#TIMESPEC "TS_ddr2_to_cpu4" = FROM "ddr_in_clk" TO "cpu_clk_4x" 3.9 ns; +#TIMESPEC "TS_ddr2_to_ddr2_2x" = FROM "ddr_in_clk" TO "ddr_in_clk_2x" 3.9 ns; + +#TIMESPEC "TS_ddr2_2x_to_cpu1" = FROM "ddr_in_clk_2x" TO "cpu_clk" 3.9 ns; +#TIMESPEC "TS_ddr2_2x_to_cpu2" = FROM "ddr_in_clk_2x" TO "cpu_clk_2x" 3.9 ns; +#TIMESPEC "TS_ddr2_2x_to_cpu4" = FROM "ddr_in_clk_2x" TO "cpu_clk_4x" 3.9 ns; +#TIMESPEC "TS_ddr2_2x_to_ddr2" = FROM "ddr_in_clk_2x" TO "ddr_in_clk" 3.9 ns; + + + diff --git a/zpu/hdl/zpu4/src/ic300.vhd b/zpu/hdl/zpu4/src/ic300.vhd new file mode 100644 index 0000000..a1b4f41 --- /dev/null +++ b/zpu/hdl/zpu4/src/ic300.vhd @@ -0,0 +1,144 @@ +-------------------------------------------------------------------------------- +-- Company: Zylin AS +-- Engineer: Tore Ramsland +-- +-- Create Date: 21:47:41 07/03/05 +-- Design Name: ic300 +-- Module Name: ic300 - behave +-- Project Name: eCosBoard +-- Target Device: XC3S400400-FG256 +-- Tool versions: 7.1i +-- Description: Top level +-- +-- Dependencies: +-- +-- Revision: +-- 2005-07-11 Updated to test FPGA +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +library UNISIM; +use UNISIM.VComponents.all; + +library zylin; +use zylin.arm7.all; + +library zylin; +use zylin.zpu_config.all; +use zylin.zpupkg.all; + +library work; +use work.phi_config.all; +use work.ic300pkg.all; + +entity ic300 is + generic( + simulate_io_time : boolean := false); + port ( -- Clock inputs + cpu_clk_p : in std_logic; + + -- CPU interface signals + cpu_a_p : in std_logic_vector(20 downto 0); + cpu_wr_n_p : in std_logic_vector(1 downto 0); + cpu_cs_n_p : in std_logic_vector(3 downto 1); + cpu_oe_n_p : in std_logic; + cpu_d_p : inout std_logic_vector(15 downto 0); + cpu_irq_p : out std_logic_vector(1 downto 0); + cpu_fiq_p : out std_logic; + cpu_wait_n_p : out std_logic; + + -- DDR SDRAM Signals + sdr_clk_p : out std_logic; -- ddr_sdram_clock + sdr_clk_n_p : out std_logic; -- /ddr_sdram_clock + cke_q_p : out std_logic; -- clock enable + cs_qn_p : out std_logic; -- /chip select + ras_qn_p : inout std_logic; -- /ras + cas_qn_p : inout std_logic; -- /cas + we_qn_p : inout std_logic; -- /write enable + dm_q_p : out std_logic_vector(1 downto 0); -- data mask bits, set to "00" + dqs_q_p : out std_logic_vector(1 downto 0); -- data strobe, only for write + ba_q_p : out std_logic_vector(1 downto 0); -- bank select + sdr_a_p : out std_logic_vector(12 downto 0); -- address bus + sdr_d_p : inout std_logic_vector(15 downto 0); -- bidir data bus + sdr_clk_fb_p : in std_logic -- DDR clock feedback + ); +end ic300; + +architecture behave of ic300 is + +signal cpu_we : std_logic_vector(1 downto 0); -- Write signal for lower(0) and upper(1) 8 data bits +signal cpu_re : std_logic; -- Read enable signal for all 16 bits +signal areset : std_logic; -- Asyncronous active high reset (for initialization) +signal areset_dummy : std_logic; + +-- Clock module signals +signal clk_status : std_logic_vector(2 downto 0); -- DLL lock status (from 3 DLL's) +signal cpu_clk : std_logic; -- 64 MHz CPU clk +signal cpu_clk_2x : std_logic; -- 128 MHz CPU clk (in phase with 64 MHz) +signal cpu_clk_4x : std_logic; -- 256 MHz CPU clk (in phase with 64 MHz) +signal ddr_in_clk : std_logic; -- 128 MHz clock from DDR SDRAM +signal ddr_in_clk_2x : std_logic; -- 256 MHz clock from DDR SDRAM + -- NOTE! Phase relation to 64 MHz clock unknown + +-- Internal CPU interface signals +signal cpu_din : std_logic_vector(15 downto 0); -- 16-bit data from CPU +signal cpu_dout : std_logic_vector(15 downto 0); -- 16-bit data to CPU +signal cpu_a : std_logic_vector(20 downto 0); -- 21-bit address from CPU + +begin + +-- areset <= '0'; + areset_dummy <= '0'; + + global_init_reset: + rocbuf port map(I=>areset_dummy,O=>areset); + + allclocks: + clocks port map( + areset => areset, + cpu_clk_p => cpu_clk_p, + cpu_clk => cpu_clk, + cpu_clk_2x => cpu_clk_2x, + cpu_clk_4x => cpu_clk_4x, + sdr_clk_fb_p => sdr_clk_fb_p, + ddr_in_clk => ddr_in_clk, + ddr_in_clk_2x => ddr_in_clk_2x, + locked => clk_status); + + arm7cpu: + arm7wb generic map (simulate_io_time => simulate_io_time) + port map( + areset => areset, + cpu_clk => cpu_clk, + cpu_clk_2x => cpu_clk_2x, + cpu_a_p => cpu_a_p, + cpu_wr_n_p => cpu_wr_n_p, + cpu_cs_n_p => cpu_cs_n_p, + cpu_oe_n_p => cpu_oe_n_p, + cpu_d_p => cpu_d_p, + cpu_irq_p => cpu_irq_p, + cpu_fiq_p => cpu_fiq_p, + cpu_wait_n_p => cpu_wait_n_p, + cpu_din => cpu_din, + cpu_a => cpu_a, + cpu_we => cpu_we, + cpu_re => cpu_re, + cpu_dout => cpu_dout); + + + cpu_fpga_regs: + zpuio port map( + areset => areset, + cpu_clk => cpu_clk, + clk_status => clk_status, + cpu_din => cpu_din, + cpu_a => cpu_a, + cpu_we => cpu_we, + cpu_re => cpu_re, + cpu_dout => cpu_dout); + + +end behave; diff --git a/zpu/hdl/zpu4/src/ic300_config.vhd b/zpu/hdl/zpu4/src/ic300_config.vhd new file mode 100644 index 0000000..b14ec79 --- /dev/null +++ b/zpu/hdl/zpu4/src/ic300_config.vhd @@ -0,0 +1,26 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.all; + +package phi_config is + + constant Fpga_Global_Base : std_logic_vector(19 downto 17) := "000"; -- 0x0800.... + constant Clock_Stat_Reg_Addr : std_logic_vector(5 downto 2) := "0000"; -- 0x....0000 + constant Ctrl_Reg_Addr : std_logic_vector(5 downto 2) := "0001"; -- 0x....0004 + constant output_enable : std_logic_vector(5 downto 2) := "0010"; -- 0x....0008 + constant output_disable : std_logic_vector(5 downto 2) := "0011"; -- 0x....000C + constant data_status : std_logic_vector(5 downto 2) := "0100"; -- 0x....0010 + constant set_output_data : std_logic_vector(5 downto 2) := "0101"; -- 0x....0014 + constant clear_output_data : std_logic_vector(5 downto 2) := "0110"; -- 0x....0018 + constant data_in_read : std_logic_vector(5 downto 2) := "0111"; -- 0x....001C + constant output_status : std_logic_vector(5 downto 2) := "1000"; -- 0x....0020 + constant cpu_access_address : std_logic_vector(5 downto 2) := "1001"; -- 0x....0024 + + constant Fpga_Ethernet_Reg_Base : std_logic_vector(19 downto 17) := "110"; -- 0x080C0000 + + constant Fpga_DDR_Ctrl_Base : std_logic_vector(19 downto 17) := "111"; -- 0x080E.... + constant DDR_Ctrl_Reg_Addr : std_logic_vector(3 downto 2) := "00"; -- 0x....0000 + constant DDR_Mode_Reg_Addr : std_logic_vector(3 downto 2) := "01"; -- 0x....0004 + constant DDR_Page_Select_Addr : std_logic_vector(3 downto 2) := "10"; -- 0x....0008 + + +end phi_config; diff --git a/zpu/hdl/zpu4/src/ic300pkg.vhd b/zpu/hdl/zpu4/src/ic300pkg.vhd new file mode 100644 index 0000000..13da306 --- /dev/null +++ b/zpu/hdl/zpu4/src/ic300pkg.vhd @@ -0,0 +1,88 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.all; + +package ic300pkg is + + component ic300 is + port ( -- Clock inputs + cpu_clk_p : in std_logic; + + -- CPU interface signals + cpu_a_p : in std_logic_vector(20 downto 0); + cpu_wr_n_p : in std_logic_vector(1 downto 0); + cpu_cs_n_p : in std_logic_vector(3 downto 1); + cpu_oe_n_p : in std_logic; + cpu_d_p : inout std_logic_vector(15 downto 0); + cpu_irq_p : out std_logic_vector(1 downto 0); + cpu_fiq_p : out std_logic; + cpu_wait_n_p : out std_logic; + + -- DDR SDRAM Signals + sdr_clk_p : out std_logic; -- ddr_sdram_clock + sdr_clk_n_p : out std_logic; -- /ddr_sdram_clock + cke_q_p : out std_logic; -- clock enable + cs_qn_p : out std_logic; -- /chip select + ras_qn_p : inout std_logic; -- /ras + cas_qn_p : inout std_logic; -- /cas + we_qn_p : inout std_logic; -- /write enable + dm_q_p : out std_logic_vector(1 downto 0); -- data mask bits, set to "00" + dqs_q_p : out std_logic_vector(1 downto 0); -- data strobe, only for write + ba_q_p : out std_logic_vector(1 downto 0); -- bank select + sdr_a_p : out std_logic_vector(12 downto 0); -- address bus + sdr_d_p : inout std_logic_vector(15 downto 0); -- bidir data bus + sdr_clk_fb_p : in std_logic -- DDR clock feedback + ); + end component; + + component clocks is + port ( areset : in std_logic; + cpu_clk_p : in std_logic; + sdr_clk_fb_p : in std_logic; + cpu_clk : out std_logic; + cpu_clk_2x : out std_logic; + cpu_clk_4x : out std_logic; + ddr_in_clk : out std_logic; + ddr_in_clk_2x : out std_logic; + locked : out std_logic_vector(2 downto 0)); + end component; + + component cpu_regs is + port ( areset : in std_logic; + cpu_clk : in std_logic; + clk_status : in std_logic_vector(2 downto 0); + cpu_din : in std_logic_vector(15 downto 0); + cpu_a : in std_logic_vector(20 downto 0); + cpu_we : in std_logic_vector(1 downto 0); + cpu_re : in std_logic; + cpu_dout : inout std_logic_vector(15 downto 0)); + end component; + + component ddr_bridge is + port ( areset : in std_logic; + cpu_clk : in std_logic; + cpu_clk_2x : in std_logic; + cpu_clk_4x : in std_logic; + ddr_in_clk : in std_logic; + ddr_in_clk_2x : in std_logic; + + cpu_we : in std_logic_vector(1 downto 0); + cpu_re : in std_logic; + cpu_din : in std_logic_vector(15 downto 0); + cpu_a : in std_logic_vector(20 downto 0); + cpu_dout : inout std_logic_vector(15 downto 0); + + sdr_clk_p : out std_logic; -- ddr_sdram_clock + sdr_clk_n_p : out std_logic; -- /ddr_sdram_clock + cke_q_p : out std_logic; -- clock enable + cs_qn_p : out std_logic; -- /chip select + ras_qn_p : inout std_logic; -- /ras + cas_qn_p : inout std_logic; -- /cas + we_qn_p : inout std_logic; -- /write enable + dm_q_p : out std_logic_vector(1 downto 0); -- data mask bits, set to "00" + dqs_q_p : out std_logic_vector(1 downto 0); -- data strobe, only for write + ba_q_p : out std_logic_vector(1 downto 0); -- bank select + sdr_a_p : out std_logic_vector(12 downto 0); -- address bus + sdr_d_p : inout std_logic_vector(15 downto 0)); -- bidir data bus + end component; + +end ic300pkg; diff --git a/zpu/hdl/zpu4/src/io.vhd b/zpu/hdl/zpu4/src/io.vhd new file mode 100644 index 0000000..b5465d1 --- /dev/null +++ b/zpu/hdl/zpu4/src/io.vhd @@ -0,0 +1,92 @@ +library ieee; +use ieee.std_logic_1164.all; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +use std.textio.all; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; +use work.txt_util.all; + +entity zpu_io is + generic ( + log_file: string := "log.txt" + ); + port( + clk : in std_logic; + areset : in std_logic; + busy : out std_logic; + writeEnable : in std_logic; + readEnable : in std_logic; + write : in std_logic_vector(7 downto 0); + read : out std_logic_vector(7 downto 0); + addr : in std_logic_vector(maxAddrBit downto minAddrBit) + ); +end zpu_io; + + +architecture behave of zpu_io is + + + +signal timer_read : std_logic_vector(7 downto 0); +--signal timer_write : std_logic_vector(7 downto 0); +signal timer_we : std_logic; + +signal serving : std_logic; + +file l_file : TEXT open write_mode is log_file; + +begin + + + timerinst: timer port map ( + clk => clk, + areset => areset, + we => timer_we, + din => write, + adr => addr(4 downto 2), + dout => timer_read); + + busy <= writeEnable or readEnable; + timer_we <= writeEnable and addr(12); + + process(areset, clk) + begin + if (areset = '1') then +-- timer_we <= '0'; + elsif (clk'event and clk = '1') then +-- timer_we <= '0'; + if writeEnable = '1' then + -- external interface + if addr=x"1000" then + -- Write to UART + -- report "" & character'image(conv_integer(memBint)) severity note; + print(l_file, character'val(conv_integer(write))); + elsif addr(12)='1' then +-- report "xxx" severity failure; +-- timer_we <= '1'; + else + report "Illegal IO write" severity failure; + end if; + + end if; + read <= (others => 'U'); + if (readEnable = '1') then + if addr=x"1001" then + read <= (0=>'1', others => '0'); -- recieve empty + elsif addr(12)='1' then + read <= timer_read; + elsif addr(11)='1' then + read <= ZPU_Frequency; + else + report "Illegal IO read" severity failure; + end if; + end if; + end if; + end process; + + +end behave; + diff --git a/zpu/hdl/zpu4/src/log.txt b/zpu/hdl/zpu4/src/log.txt new file mode 100644 index 0000000..af58c93 --- /dev/null +++ b/zpu/hdl/zpu4/src/log.txt @@ -0,0 +1,380 @@ +H +e +l +l +o + +w +o +r +l +d + +1 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +2 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +1 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +2 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +1 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +2 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +1 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +2 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +1 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +2 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +1 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +2 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +1 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +2 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +1 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +2 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +1 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +2 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +1 + + + + + + +H +e +l +l +o + +w +o +r +l +d + +2 + + + + + + diff --git a/zpu/hdl/zpu4/src/niltrace.vhd b/zpu/hdl/zpu4/src/niltrace.vhd new file mode 100644 index 0000000..40fc1ca --- /dev/null +++ b/zpu/hdl/zpu4/src/niltrace.vhd @@ -0,0 +1,26 @@ +library ieee; +use ieee.std_logic_1164.all; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +use std.textio.all; +use work.zpu_config.all; + + +entity trace is + port( + clk : in std_logic; + begin_inst : in std_logic; + pc : in std_logic_vector(maxAddrBit downto 0); + opcode : in std_logic_vector(7 downto 0); + sp : in std_logic_vector(maxAddrBit downto 2); + memA : in std_logic_vector(wordSize-1 downto 0); + busy : in std_logic); +end trace; + + +architecture behave of trace is + +begin + +end behave; + diff --git a/zpu/hdl/zpu4/src/sim_fpga_top.vhd b/zpu/hdl/zpu4/src/sim_fpga_top.vhd new file mode 100644 index 0000000..2905505 --- /dev/null +++ b/zpu/hdl/zpu4/src/sim_fpga_top.vhd @@ -0,0 +1,190 @@ +-------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 20:15:31 04/14/05 +-- Design Name: +-- Module Name: fpga_top - behave +-- Project Name: +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +library UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; + +entity fpga_top is +end fpga_top; + +architecture behave of fpga_top is + + +signal clk : std_logic; + +signal areset : std_logic; + + +component zpu_io is + generic ( + log_file: string := "log.txt" + ); + port( + clk : in std_logic; + areset : in std_logic; + busy : out std_logic; + writeEnable : in std_logic; + readEnable : in std_logic; + write : in std_logic_vector(7 downto 0); + read : out std_logic_vector(7 downto 0); + addr : in std_logic_vector(maxAddrBit downto minAddrBit) + ); +end component; + + + + + +signal mem_busy : std_logic; +signal mem_read : std_logic_vector(wordSize-1 downto 0); +signal mem_write : std_logic_vector(wordSize-1 downto 0); +signal mem_addr : std_logic_vector(maxAddrBitIncIO downto 0); +signal mem_writeEnable : std_logic; +signal mem_readEnable : std_logic; +signal mem_writeMask: std_logic_vector(wordBytes-1 downto 0); + +signal enable : std_logic; + +signal dram_mem_busy : std_logic; +signal dram_mem_read : std_logic_vector(wordSize-1 downto 0); +signal dram_mem_write : std_logic_vector(wordSize-1 downto 0); +signal dram_mem_writeEnable : std_logic; +signal dram_mem_readEnable : std_logic; +signal dram_mem_writeMask: std_logic_vector(wordBytes-1 downto 0); + + +signal io_busy : std_logic; + +signal io_mem_read : std_logic_vector(7 downto 0); +signal io_mem_writeEnable : std_logic; +signal io_mem_readEnable : std_logic; + + +signal dram_ready : std_logic; +signal io_ready : std_logic; +signal io_reading : std_logic; + + +signal break : std_logic; + +begin + poweronreset: roc port map (O => areset); + + + + zpu: zpu_core port map ( + clk => clk , + areset => areset, + enable => enable, + in_mem_busy => mem_busy, + mem_read => mem_read, + mem_write => mem_write, + out_mem_addr => mem_addr, + out_mem_writeEnable => mem_writeEnable, + out_mem_readEnable => mem_readEnable, + mem_writeMask => mem_writeMask, + interrupt => '0', + break => break); + + dram_imp: dram port map ( + clk => clk , + areset => areset, + mem_busy => dram_mem_busy, + mem_read => dram_mem_read, + mem_write => mem_write, + mem_addr => mem_addr(maxAddrBit downto 0), + mem_writeEnable => dram_mem_writeEnable, + mem_readEnable => dram_mem_readEnable, + mem_writeMask => mem_writeMask); + + + ioMap: zpu_io port map ( + clk => clk, + areset => areset, + busy => io_busy, + writeEnable => io_mem_writeEnable, + readEnable => io_mem_readEnable, + write => mem_write(7 downto 0), + read => io_mem_read, + addr => mem_addr(maxAddrBit downto minAddrBit) + ); + + dram_mem_writeEnable <= mem_writeEnable and not mem_addr(ioBit); + dram_mem_readEnable <= mem_readEnable and not mem_addr(ioBit); + io_mem_writeEnable <= mem_writeEnable and mem_addr(ioBit); + io_mem_readEnable <= mem_readEnable and mem_addr(ioBit); + mem_busy <= io_busy or dram_mem_busy or io_busy; + + + + -- Memory reads either come from IO or DRAM. We need to pick the right one. + memorycontrol: + process(dram_mem_read, dram_ready, io_ready, io_mem_read) + begin + mem_read <= (others => 'U'); + if dram_ready='1' then + mem_read <= dram_mem_read; + end if; + + if io_ready='1' then + mem_read <= (others => '0'); + mem_read(7 downto 0) <= io_mem_read; + end if; + end process; + + + io_ready <= (io_reading or io_mem_readEnable) and not io_busy; + + memoryControlSync: + process(clk, areset) + begin + if areset = '1' then + enable <= '0'; + io_reading <= '0'; + dram_ready <= '0'; + elsif (clk'event and clk = '1') then + enable <= '1'; + io_reading <= io_busy or io_mem_readEnable; + dram_ready<=dram_mem_readEnable; + + end if; + end process; + + -- wiggle the clock @ 100MHz + clock : PROCESS + begin + clk <= '0'; + wait for 5 ns; + clk <= '1'; + wait for 5 ns; + end PROCESS clock; + + +end behave; diff --git a/zpu/hdl/zpu4/src/simzpu.do b/zpu/hdl/zpu4/src/simzpu.do new file mode 100644 index 0000000..e6e3068 --- /dev/null +++ b/zpu/hdl/zpu4/src/simzpu.do @@ -0,0 +1,23 @@ +set BreakOnAssertion 1 +vlib work + +vcom -93 -explicit zpu_config.vhd +vcom -93 -explicit zpupkg.vhd +vcom -93 -explicit txt_util.vhd +vcom -93 -explicit sim_fpga_top.vhd +vcom -93 -explicit zpu_core.vhd +vcom -93 -explicit dram.vhd +vcom -93 -explicit timer.vhd +vcom -93 -explicit io.vhd +vcom -93 -explicit trace.vhd + +# run ZPU +vsim fpga_top +view wave +add wave -recursive fpga_top/zpu/* +#add wave -recursive fpga_top/* +view structure +#view signals + +# Enough to run tiny programs +run 1000 ms diff --git a/zpu/hdl/zpu4/src/simzpu_intstack.do b/zpu/hdl/zpu4/src/simzpu_intstack.do new file mode 100644 index 0000000..cec4873 --- /dev/null +++ b/zpu/hdl/zpu4/src/simzpu_intstack.do @@ -0,0 +1,23 @@ +set BreakOnAssertion 1 +vlib work + +vcom -93 -explicit zpu_config_trace.vhd +vcom -93 -explicit zpupkg.vhd +vcom -93 -explicit txt_util.vhd +vcom -93 -explicit sim_fpga_top.vhd +vcom -93 -explicit zpu_core_intstack.vhd +vcom -93 -explicit dram_hello.vhd +vcom -93 -explicit timer.vhd +vcom -93 -explicit io.vhd +vcom -93 -explicit trace.vhd + +# run ZPU +vsim fpga_top +view wave +add wave -recursive fpga_top/zpu/* +#add wave -recursive fpga_top/* +view structure +#view signals + +# Enough to run tiny programs +run 15 ms diff --git a/zpu/hdl/zpu4/src/status.txt b/zpu/hdl/zpu4/src/status.txt new file mode 100644 index 0000000..df01caf --- /dev/null +++ b/zpu/hdl/zpu4/src/status.txt @@ -0,0 +1,109 @@ +- Before NEQBRANCH opt 4.684 DMIPS 8.0 cycles average, after +- opcode pairs + +0x6060 0.1519223038446077 75961 9.048362120309708 LOADSP + LOADSP +0x4040 0.13967027934055867 69835 11.08668042546436 STORESP + STORESP +0x8038 0.10230620461240922 51153 10.251102204408818 IM + NEQBRANCH +0x4060 0.09856219712439425 49281 9.822802471596571 STORESP + LOADSP +0x6080 0.09734219468438937 48671 6.483415478886373 LOADSP + IM +0x3860 0.08642217284434568 43211 12.616350364963504 NEQBRANCH + LOADSP +0x8080 0.060966121932243864 30483 4.275915275634731 IM + IM +0x8005 0.05317010634021268 26585 6.572311495673671 IM + ADD +0x540 0.05215210430420861 26076 9.339541547277937 ADD + STORESP +0x3d0d 0.050808101616203236 25404 12.398243045387995 +0xd04 0.0466000932001864 23300 20.0 +0x6040 0.04389608779217558 21948 9.460344827586207 +0x4080 0.043648087296174594 21824 7.630769230769231 +0xc80 0.03966807933615867 19834 11.438292964244521 +0x8010 0.0391500783001566 19575 6.1248435544430535 +0x480 0.038798077596155195 19399 10.941342357586013 + + +- zpu_core.vhd: 1500 LUTs. Xilinx ISE reports 83MHz maximum frequency after P&R + which matches what I've found w/my ic300.vhd testbench + +- zpu_core_instack.vhd + - problems w/simulation trace since storeb/loadb will run into undefined memory + during emulation. Solution: implement loadb+storeb. + - simulation needs to read cycles from ModelSim trace so as to m ake readcycles + not cause false positives. This has other interesting potentials w.r.t. + knowing which instructions take the longest. + +- Ca. 1700 LUT inc. all instructions. Removing all higher level instructions + => 1300. + +- Review memory interface + - When is mem_busy high? Will it be high on the next cycle after + I've send mem_read/writeEnable? + - Should I hold off posting a read/write until mem_busy = '0'? + - Write posting could increase performance somewhat. Should there be + a seperate write busy signal? + - Synchronous reset? The ARM7 will have to copy the program to DRAM and + then start the ZPU. + +- Current instruction set has + - 31 DMIPS single cycle performance Simulator.java + - 8 DMIPS w/single cycle RAM access in ModelSim + +112 0.06100380865858346 67215918 +56 0.04139603650830458 45611457 +129 0.0375812381475752 41408192 +5 0.03703417264799563 40805418 +113 0.03540341331682748 39008596 +128 0.0343154384313754 37809831 +83 0.03322159422742951 36604599 +114 0.03213492807203279 35407276 +132 0.03158580962697109 34802240 +12 0.03049709687915076 33602662 +8 0.029409690138646426 32404523 +115 0.026690690908727877 29408644 +46 0.025054316381406774 27605635 +82 0.023965804208719754 26406278 +84 0.023961360698074072 26401382 +116 0.023417718589457643 25802380 +81 0.02179306727026773 24012288 +117 0.021783900714401432 24002188 +4 0.01797685126990833 19807461 +6 0.016340292503890113 18004249 +85 0.016339001017850734 18002826 +255 0.016338918428089957 18002735 +86 0.016337281154151066 18000931 +11 0.011984767180825744 13205194 +51 0.0114390303780569 12603884 +38 0.010892246228211845 12001420 +118 0.010347263624247446 11400941 +131 0.009257503529350904 10200209 +7 0.008713386756504965 9600684 +22 0.008712946580307425 9600199 + + +64 0.16176824859336478 178241352 +96 0.23147927881894828 255051161 +128 0.2646966482624612 291651105 + + +- Alternate memory interface to allow more caching in memory subsystem? + +-- The memory interface allows a dual port memory to be used +-- to increase performance. +-- +-- Also it is possible to implement a zero cycle register file instead +-- of memory, though obviously that will cause problems w.r.t. max +-- frequency for the ZPU. +-- +-- mem_writeEnable - set to '1' for a single cycle to send off a write request. +-- mem_write is valid only while mem_writeEnable='1'. +-- mem_readEnable - set to '1' for a single cycle to send off a read request. +-- mem_read is a single cycle while mem_read_busy='0'. +-- +-- mem_read/write_busy - It is illegal to send off a read/write request when mem_read/write_busy='1'. +-- Set to '0' when mem_read is valid after a read request. Note that +-- the definition allows zero wait state ram. +-- mem_read/write_addr - address for read/write request +-- mem_read - read data. Valid only on the cycle after mem_busy='0' after +-- mem_readEnable='1' for a single cycle. +-- mem_write - data to write +-- mem_writeMask - set to '1' for those bits that are to be written to memory upon +-- write request +-- break - set to '1' when CPU hits break instruction +-- interrupt - set to '1' until interrupts are cleared by CPU. diff --git a/zpu/hdl/zpu4/src/testlut.vhd b/zpu/hdl/zpu4/src/testlut.vhd new file mode 100644 index 0000000..668efcc --- /dev/null +++ b/zpu/hdl/zpu4/src/testlut.vhd @@ -0,0 +1,114 @@ +-- Company: Zylin AS +-- +-- Hooks up the ZPU to physical pads to ensure that it is not optimized to +-- oblivion. This is purely to have something to measure LUT usage against. +-- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; + +entity ic300 is + port ( -- Clock inputs + cpu_clk_p : in std_logic; + + -- CPU interface signals + cpu_a_p : in std_logic_vector(20 downto 0); + cpu_wr_n_p : in std_logic_vector(1 downto 0); + cpu_cs_n_p : in std_logic_vector(3 downto 1); + cpu_oe_n_p : in std_logic; + cpu_d_p : out std_logic_vector(15 downto 0); + cpu_irq_p : out std_logic_vector(1 downto 0); + cpu_fiq_p : out std_logic; + cpu_wait_n_p : out std_logic; + + sdr_clk_fb_p : in std_logic -- DDR clock feedback + ); +end ic300; + +architecture behave of ic300 is + + +signal io_busy : std_logic; +signal io_read : std_logic_vector(7 downto 0); +signal io_write : std_logic_vector(7 downto 0); +signal io_addr : std_logic_vector(maxAddrBit downto minAddrBit); +signal io_writeEnable : std_logic; +signal io_readEnable : std_logic; + + +signal cpu_we : std_logic_vector(1 downto 0); +signal cpu_re : std_logic; +signal areset : std_logic; + +-- Clock module signals +signal clk_status : std_logic_vector(2 downto 0); +signal cpu_clk : std_logic; +signal cpu_clk_2x : std_logic; +signal cpu_clk_4x : std_logic; +signal ddr_in_clk : std_logic; + + +-- Internal CPU interface signals +signal cpu_din : std_logic_vector(15 downto 0); +signal cpu_dout : std_logic_vector(15 downto 0); +signal cpu_a : std_logic_vector(20 downto 0); + +signal dummy : std_logic_vector(maxAddrBit downto minAddrBit+5); + +signal dummy2 : std_logic_vector(wordSize-1 downto 0); +signal dummy3 : std_logic_vector(wordSize-1 downto 0); +signal dummy4 : std_logic_vector(wordSize-1 downto 0); +begin + + areset <= '0'; -- MUST BE CHANGED TO SOMETHING CORRECT + +-- cpu_d_p <= (others => '0'); + cpu_irq_p <= (others => '0'); + cpu_fiq_p <= '0'; + cpu_wait_n_p <= '0'; + + cpu_d_p(15 downto 15) <= (others => '0'); + + -- delay signals going out/in w/1 clk so the + -- ZPU does not have to drive those pins. + -- + -- these registers can be placed close to the ZPU and these + -- registers then have a full clock to drive the pins. + process(cpu_clk_p, areset) + begin + if (cpu_clk_p'event and cpu_clk_p = '1') then + cpu_d_p(0) <= io_writeEnable; + cpu_d_p(1) <= io_readEnable; + cpu_d_p(9 downto 2) <= io_write; + io_read <= cpu_a_p(7 downto 0); + -- 32 read/write registers is plenty realisitic for a minimal size + -- soft-CPU + cpu_d_p(14 downto 10) <= io_addr(minAddrBit+4 downto minAddrBit); + end if; + end process; + + + zpu: zpu_core port map ( + clk => cpu_clk_p , + areset => areset, + enable => '1', + + in_mem_busy => '0', + out_mem_writeEnable => io_writeEnable, + out_mem_readEnable => io_readEnable, + mem_write(7 downto 0) => io_write, + mem_write(wordSize-1 downto 8) => dummy3(wordSize-1 downto 8), + mem_read(7 downto 0) => io_read, + mem_read(wordSize-1 downto 8) => dummy2(wordSize-1 downto 8), + out_mem_addr(maxAddrBitIncIO) => dummy4(maxAddrBitIncIO), + out_mem_addr(minAddrBit-1 downto 0) => dummy4(minAddrBit-1 downto 0) , + out_mem_addr(maxAddrBit downto minAddrBit) => io_addr, + interrupt => '0' + ); + + +end behave; diff --git a/zpu/hdl/zpu4/src/timer.vhd b/zpu/hdl/zpu4/src/timer.vhd new file mode 100644 index 0000000..60c8fe2 --- /dev/null +++ b/zpu/hdl/zpu4/src/timer.vhd @@ -0,0 +1,61 @@ +library ieee; +use ieee.std_logic_1164.all; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +entity timer is + port( + clk : in std_logic; + areset : in std_logic; + we : in std_logic; + din : in std_logic_vector(7 downto 0); + adr : in std_logic_vector(2 downto 0); + dout : out std_logic_vector(7 downto 0)); +end timer; + + +architecture behave of timer is + +signal sample : std_logic; +signal reset : std_logic; + + +signal cnt : std_logic_vector(63 downto 0); +signal cnt_smp : std_logic_vector(63 downto 0); + +begin + + reset <= '1' when (we = '1' and din(0) = '1') else '0'; + sample <= '1' when (we = '1' and din(1) = '1') else '0'; + + process(clk, areset) -- Carry generation + begin + if areset = '1' then + cnt <= (others => '0'); + cnt_smp <= (others => '0'); + elsif (clk'event and clk = '1') then + cnt <= cnt + 1; + if sample = '1' then +-- report "sampling" severity failure; + cnt_smp <= cnt; + end if; + end if; + end process; + + + process(cnt_smp, adr) + begin + case adr is + when "000" => dout <= cnt_smp(7 downto 0); + when "001" => dout <= cnt_smp(15 downto 8); + when "010" => dout <= cnt_smp(23 downto 16); + when "011" => dout <= cnt_smp(31 downto 24); + when "100" => dout <= cnt_smp(39 downto 32); + when "101" => dout <= cnt_smp(47 downto 40); + when "110" => dout <= cnt_smp(55 downto 48); + when others => dout <= cnt_smp(63 downto 56); + end case; + end process; + + +end behave; + diff --git a/zpu/hdl/zpu4/src/trace.vhd b/zpu/hdl/zpu4/src/trace.vhd new file mode 100644 index 0000000..bc5279f --- /dev/null +++ b/zpu/hdl/zpu4/src/trace.vhd @@ -0,0 +1,84 @@ +library ieee; +use ieee.std_logic_1164.all; +--use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +use std.textio.all; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; +use work.txt_util.all; + + +entity trace is + generic ( + log_file: string := "trace.txt" + ); + port( + clk : in std_logic; + begin_inst : in std_logic; + pc : in std_logic_vector(maxAddrBitIncIO downto 0); + opcode : in std_logic_vector(7 downto 0); + sp : in std_logic_vector(maxAddrBitIncIO downto 2); + memA : in std_logic_vector(wordSize-1 downto 0); + memB : in std_logic_vector(wordSize-1 downto 0); + busy : in std_logic; + intSp : in std_logic_vector(stack_bits-1 downto 0) + ); +end trace; + + +architecture behave of trace is + + +file l_file : TEXT open write_mode is log_file; + + +begin + + +-- write data and control information to a file + +receive_data: process + +variable l: line; +variable t : std_logic_vector(wordSize-1 downto 0); +variable t2 : std_logic_vector(maxAddrBitIncIO downto 0); +variable counter : std_logic_vector(63 downto 0); + + + +begin + + t:= (others => '0'); + t2:= (others => '0'); + +counter := (others => '0'); + -- print header for the logfile + print(l_file, "#pc,opcode,sp,top_of_stack "); + print(l_file, "#----------"); + print(l_file, " "); + + wait until clk = '1'; + wait until clk = '0'; + + while true loop + + counter := counter + 1; + if begin_inst = '1' then + t(maxAddrBitIncIO downto 2):=sp; + t2:=pc; + print(l_file, "0x" & hstr(t2) & " 0x" & hstr(opcode) & " 0x" & hstr(t) & " 0x" & hstr(memA) & " 0x" & hstr(memB) & " 0x" & hstr(intSp) & " 0x" & hstr(counter)); + end if; + + wait until clk = '0'; + + end loop; + + end process receive_data; + + + +end behave; + diff --git a/zpu/hdl/zpu4/src/txt_util.vhd b/zpu/hdl/zpu4/src/txt_util.vhd new file mode 100644 index 0000000..d3bf01a --- /dev/null +++ b/zpu/hdl/zpu4/src/txt_util.vhd @@ -0,0 +1,587 @@ +library ieee; +use ieee.std_logic_1164.all; +use std.textio.all; + +library work; + +package txt_util is + + -- prints a message to the screen + procedure print(text: string); + + -- prints the message when active + -- useful for debug switches + procedure print(active: boolean; text: string); + + -- converts std_logic into a character + function chr(sl: std_logic) return character; + + -- converts std_logic into a string (1 to 1) + function str(sl: std_logic) return string; + + -- converts std_logic_vector into a string (binary base) + function str(slv: std_logic_vector) return string; + + -- converts boolean into a string + function str(b: boolean) return string; + + -- converts an integer into a single character + -- (can also be used for hex conversion and other bases) + function chr(int: integer) return character; + + -- converts integer into string using specified base + function str(int: integer; base: integer) return string; + + -- converts integer to string, using base 10 + function str(int: integer) return string; + + -- convert std_logic_vector into a string in hex format + function hstr(slv: std_logic_vector) return string; + + + -- functions to manipulate strings + ----------------------------------- + + -- convert a character to upper case + function to_upper(c: character) return character; + + -- convert a character to lower case + function to_lower(c: character) return character; + + -- convert a string to upper case + function to_upper(s: string) return string; + + -- convert a string to lower case + function to_lower(s: string) return string; + + + + -- functions to convert strings into other formats + -------------------------------------------------- + + -- converts a character into std_logic + function to_std_logic(c: character) return std_logic; + + -- converts a string into std_logic_vector + function to_std_logic_vector(s: string) return std_logic_vector; + + + + -- file I/O + ----------- + + -- read variable length string from input file + procedure str_read(file in_file: TEXT; + res_string: out string); + + -- print string to a file and start new line + procedure print(file out_file: TEXT; + new_string: in string); + + -- print character to a file and start new line + procedure print(file out_file: TEXT; + char: in character); + +end txt_util; + + + + +package body txt_util is + + + + + -- prints text to the screen + + procedure print(text: string) is + variable msg_line: line; + begin + write(msg_line, text); + writeline(output, msg_line); + end print; + + + + + -- prints text to the screen when active + + procedure print(active: boolean; text: string) is + begin + if active then + print(text); + end if; + end print; + + + -- converts std_logic into a character + + function chr(sl: std_logic) return character is + variable c: character; + begin + case sl is + when 'U' => c:= 'U'; + when 'X' => c:= 'X'; + when '0' => c:= '0'; + when '1' => c:= '1'; + when 'Z' => c:= 'Z'; + when 'W' => c:= 'W'; + when 'L' => c:= 'L'; + when 'H' => c:= 'H'; + when '-' => c:= '-'; + end case; + return c; + end chr; + + + + -- converts std_logic into a string (1 to 1) + + function str(sl: std_logic) return string is + variable s: string(1 to 1); + begin + s(1) := chr(sl); + return s; + end str; + + + + -- converts std_logic_vector into a string (binary base) + -- (this also takes care of the fact that the range of + -- a string is natural while a std_logic_vector may + -- have an integer range) + + function str(slv: std_logic_vector) return string is + variable result : string (1 to slv'length); + variable r : integer; + begin + r := 1; + for i in slv'range loop + result(r) := chr(slv(i)); + r := r + 1; + end loop; + return result; + end str; + + + function str(b: boolean) return string is + + begin + if b then + return "true"; + else + return "false"; + end if; + end str; + + + -- converts an integer into a character + -- for 0 to 9 the obvious mapping is used, higher + -- values are mapped to the characters A-Z + -- (this is usefull for systems with base > 10) + -- (adapted from Steve Vogwell's posting in comp.lang.vhdl) + + function chr(int: integer) return character is + variable c: character; + begin + case int is + when 0 => c := '0'; + when 1 => c := '1'; + when 2 => c := '2'; + when 3 => c := '3'; + when 4 => c := '4'; + when 5 => c := '5'; + when 6 => c := '6'; + when 7 => c := '7'; + when 8 => c := '8'; + when 9 => c := '9'; + when 10 => c := 'A'; + when 11 => c := 'B'; + when 12 => c := 'C'; + when 13 => c := 'D'; + when 14 => c := 'E'; + when 15 => c := 'F'; + when 16 => c := 'G'; + when 17 => c := 'H'; + when 18 => c := 'I'; + when 19 => c := 'J'; + when 20 => c := 'K'; + when 21 => c := 'L'; + when 22 => c := 'M'; + when 23 => c := 'N'; + when 24 => c := 'O'; + when 25 => c := 'P'; + when 26 => c := 'Q'; + when 27 => c := 'R'; + when 28 => c := 'S'; + when 29 => c := 'T'; + when 30 => c := 'U'; + when 31 => c := 'V'; + when 32 => c := 'W'; + when 33 => c := 'X'; + when 34 => c := 'Y'; + when 35 => c := 'Z'; + when others => c := '?'; + end case; + return c; + end chr; + + + + -- convert integer to string using specified base + -- (adapted from Steve Vogwell's posting in comp.lang.vhdl) + + function str(int: integer; base: integer) return string is + + variable temp: string(1 to 10); + variable num: integer; + variable abs_int: integer; + variable len: integer := 1; + variable power: integer := 1; + + begin + + -- bug fix for negative numbers + abs_int := abs(int); + + num := abs_int; + + while num >= base loop -- Determine how many + len := len + 1; -- characters required + num := num / base; -- to represent the + end loop ; -- number. + + for i in len downto 1 loop -- Convert the number to + temp(i) := chr(abs_int/power mod base); -- a string starting + power := power * base; -- with the right hand + end loop ; -- side. + + -- return result and add sign if required + if int < 0 then + return '-'& temp(1 to len); + else + return temp(1 to len); + end if; + + end str; + + + -- convert integer to string, using base 10 + function str(int: integer) return string is + + begin + + return str(int, 10) ; + + end str; + + + + -- converts a std_logic_vector into a hex string. + function hstr(slv: std_logic_vector) return string is + variable hexlen: integer; + variable longslv : std_logic_vector(67 downto 0) := (others => '0'); + variable hex : string(1 to 16); + variable fourbit : std_logic_vector(3 downto 0); + begin + hexlen := (slv'left+1)/4; + if (slv'left+1) mod 4 /= 0 then + hexlen := hexlen + 1; + end if; + longslv(slv'left downto 0) := slv; + for i in (hexlen -1) downto 0 loop + fourbit := longslv(((i*4)+3) downto (i*4)); + case fourbit is + when "0000" => hex(hexlen -I) := '0'; + when "0001" => hex(hexlen -I) := '1'; + when "0010" => hex(hexlen -I) := '2'; + when "0011" => hex(hexlen -I) := '3'; + when "0100" => hex(hexlen -I) := '4'; + when "0101" => hex(hexlen -I) := '5'; + when "0110" => hex(hexlen -I) := '6'; + when "0111" => hex(hexlen -I) := '7'; + when "1000" => hex(hexlen -I) := '8'; + when "1001" => hex(hexlen -I) := '9'; + when "1010" => hex(hexlen -I) := 'A'; + when "1011" => hex(hexlen -I) := 'B'; + when "1100" => hex(hexlen -I) := 'C'; + when "1101" => hex(hexlen -I) := 'D'; + when "1110" => hex(hexlen -I) := 'E'; + when "1111" => hex(hexlen -I) := 'F'; + when "ZZZZ" => hex(hexlen -I) := 'z'; + when "UUUU" => hex(hexlen -I) := 'u'; + when "XXXX" => hex(hexlen -I) := 'x'; + when others => hex(hexlen -I) := '?'; + end case; + end loop; + return hex(1 to hexlen); + end hstr; + + + + -- functions to manipulate strings + ----------------------------------- + + + -- convert a character to upper case + + function to_upper(c: character) return character is + + variable u: character; + + begin + + case c is + when 'a' => u := 'A'; + when 'b' => u := 'B'; + when 'c' => u := 'C'; + when 'd' => u := 'D'; + when 'e' => u := 'E'; + when 'f' => u := 'F'; + when 'g' => u := 'G'; + when 'h' => u := 'H'; + when 'i' => u := 'I'; + when 'j' => u := 'J'; + when 'k' => u := 'K'; + when 'l' => u := 'L'; + when 'm' => u := 'M'; + when 'n' => u := 'N'; + when 'o' => u := 'O'; + when 'p' => u := 'P'; + when 'q' => u := 'Q'; + when 'r' => u := 'R'; + when 's' => u := 'S'; + when 't' => u := 'T'; + when 'u' => u := 'U'; + when 'v' => u := 'V'; + when 'w' => u := 'W'; + when 'x' => u := 'X'; + when 'y' => u := 'Y'; + when 'z' => u := 'Z'; + when others => u := c; + end case; + + return u; + + end to_upper; + + + -- convert a character to lower case + + function to_lower(c: character) return character is + + variable l: character; + + begin + + case c is + when 'A' => l := 'a'; + when 'B' => l := 'b'; + when 'C' => l := 'c'; + when 'D' => l := 'd'; + when 'E' => l := 'e'; + when 'F' => l := 'f'; + when 'G' => l := 'g'; + when 'H' => l := 'h'; + when 'I' => l := 'i'; + when 'J' => l := 'j'; + when 'K' => l := 'k'; + when 'L' => l := 'l'; + when 'M' => l := 'm'; + when 'N' => l := 'n'; + when 'O' => l := 'o'; + when 'P' => l := 'p'; + when 'Q' => l := 'q'; + when 'R' => l := 'r'; + when 'S' => l := 's'; + when 'T' => l := 't'; + when 'U' => l := 'u'; + when 'V' => l := 'v'; + when 'W' => l := 'w'; + when 'X' => l := 'x'; + when 'Y' => l := 'y'; + when 'Z' => l := 'z'; + when others => l := c; + end case; + + return l; + + end to_lower; + + + + -- convert a string to upper case + + function to_upper(s: string) return string is + + variable uppercase: string (s'range); + + begin + + for i in s'range loop + uppercase(i):= to_upper(s(i)); + end loop; + return uppercase; + + end to_upper; + + + + -- convert a string to lower case + + function to_lower(s: string) return string is + + variable lowercase: string (s'range); + + begin + + for i in s'range loop + lowercase(i):= to_lower(s(i)); + end loop; + return lowercase; + + end to_lower; + + + +-- functions to convert strings into other types + + +-- converts a character into a std_logic + +function to_std_logic(c: character) return std_logic is + variable sl: std_logic; + begin + case c is + when 'U' => + sl := 'U'; + when 'X' => + sl := 'X'; + when '0' => + sl := '0'; + when '1' => + sl := '1'; + when 'Z' => + sl := 'Z'; + when 'W' => + sl := 'W'; + when 'L' => + sl := 'L'; + when 'H' => + sl := 'H'; + when '-' => + sl := '-'; + when others => + sl := 'X'; + end case; + return sl; + end to_std_logic; + + +-- converts a string into std_logic_vector + +function to_std_logic_vector(s: string) return std_logic_vector is + variable slv: std_logic_vector(s'high-s'low downto 0); + variable k: integer; +begin + k := s'high-s'low; + for i in s'range loop + slv(k) := to_std_logic(s(i)); + k := k - 1; + end loop; + return slv; +end to_std_logic_vector; + + + + + + +---------------- +-- file I/O -- +---------------- + + + +-- read variable length string from input file + +procedure str_read(file in_file: TEXT; + res_string: out string) is + + variable l: line; + variable c: character; + variable is_string: boolean; + + begin + + readline(in_file, l); + -- clear the contents of the result string + for i in res_string'range loop + res_string(i) := ' '; + end loop; + -- read all characters of the line, up to the length + -- of the results string + for i in res_string'range loop + read(l, c, is_string); + res_string(i) := c; + if not is_string then -- found end of line + exit; + end if; + end loop; + +end str_read; + + +-- print string to a file +procedure print(file out_file: TEXT; + new_string: in string) is + + variable l: line; + + begin + + write(l, new_string); + writeline(out_file, l); + +end print; + + +-- print character to a file and start new line +procedure print(file out_file: TEXT; + char: in character) is + + variable l: line; + + begin + + write(l, char); + writeline(out_file, l); + +end print; + + + +-- appends contents of a string to a file until line feed occurs +-- (LF is considered to be the end of the string) + +procedure str_write(file out_file: TEXT; + new_string: in string) is + begin + + for i in new_string'range loop + print(out_file, new_string(i)); + if new_string(i) = LF then -- end of string + exit; + end if; + end loop; + +end str_write; + + + + +end txt_util; + + + + diff --git a/zpu/hdl/zpu4/src/xmake.filelist b/zpu/hdl/zpu4/src/xmake.filelist new file mode 100644 index 0000000..91e623f --- /dev/null +++ b/zpu/hdl/zpu4/src/xmake.filelist @@ -0,0 +1,12 @@ +vhdl work "ic300_config.vhd" +vhdl work "ic300pkg.vhd" +vhdl zylin "zpu_config.vhd" +vhdl zylin "zpupkg.vhd" +vhdl zylin "zpu_core.vhd" +vhdl work "bram.vhd" +vhdl zylin "zpuio.vhd" +vhdl zylin "..\dummyfpgalib\arm7\src\arm7pkg.vhd" +vhdl zylin "..\dummyfpgalib\arm7\src\arm7wb.vhd" +vhdl work "clocks.vhd" +vhdl work "timer.vhd" +vhdl work "ic300.vhd" \ No newline at end of file diff --git a/zpu/hdl/zpu4/src/xmake.filelist.bramsmall b/zpu/hdl/zpu4/src/xmake.filelist.bramsmall new file mode 100644 index 0000000..141633e --- /dev/null +++ b/zpu/hdl/zpu4/src/xmake.filelist.bramsmall @@ -0,0 +1,5 @@ +vhdl work "zpu_config.vhd" +vhdl work "zpupkg.vhd" +vhdl work "zpu_core_small.vhd" +vhdl work "bram_dmips.vhd" +vhdl work "testlut.vhd" diff --git a/zpu/hdl/zpu4/src/xmake.xst b/zpu/hdl/zpu4/src/xmake.xst new file mode 100644 index 0000000..bfdb23f --- /dev/null +++ b/zpu/hdl/zpu4/src/xmake.xst @@ -0,0 +1,53 @@ +set -tmpdir ../tmp +set -xsthdpdir ../xst +run +-ifn xmake.filelist +-ifmt mixed +-ofn ../syn/ic300 +-ofmt NGC +-p xc3s400-4-ft256 +-top ic300 +-opt_mode Area +-opt_level 2 +-iuc NO +-lso ic300.lso +-keep_hierarchy NO +-glob_opt AllClockNets +-rtlview Yes +-read_cores YES +-write_timing_constraints NO +-cross_clock_analysis NO +-hierarchy_separator / +-bus_delimiter <> +-case maintain +-slice_utilization_ratio 100 +-verilog2001 YES +-fsm_extract YES -fsm_encoding Auto +-safe_implementation No +-fsm_style lut +-ram_extract Yes +-ram_style Auto +-rom_extract Yes +-rom_style Auto +-mux_extract YES +-mux_style Auto +-decoder_extract YES +-priority_extract YES +-shreg_extract YES +-shift_extract YES +-xor_collapse YES +-resource_sharing YES +-mult_style auto +-iobuf YES +-max_fanout 500 +-bufg 8 +-register_duplication YES +-equivalent_register_removal NO +-register_balancing No +-slice_packing YES +-optimize_primitives NO +-use_clock_enable Yes +-use_sync_set No +-use_sync_reset No +-iob true +-slice_utilization_ratio_maxmargin 5 diff --git a/zpu/hdl/zpu4/src/zpu_config.vhd b/zpu/hdl/zpu4/src/zpu_config.vhd new file mode 100644 index 0000000..a13c0bf --- /dev/null +++ b/zpu/hdl/zpu4/src/zpu_config.vhd @@ -0,0 +1,16 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; + +package zpu_config is + -- generate trace output or not. + constant Generate_Trace : boolean := false; + constant wordPower : integer := 5; + -- during simulation, set this to '0' to get matching trace.txt + constant DontCareValue : std_logic := 'X'; + -- Clock frequency in MHz. + constant ZPU_Frequency : std_logic_vector(7 downto 0) := x"64"; + -- This is the msb address bit. bytes=2^(maxAddrBitIncIO+1) + constant maxAddrBitIncIO : integer := 15; + +end zpu_config; diff --git a/zpu/hdl/zpu4/src/zpu_config_fastsim.vhd b/zpu/hdl/zpu4/src/zpu_config_fastsim.vhd new file mode 100644 index 0000000..d39c9e9 --- /dev/null +++ b/zpu/hdl/zpu4/src/zpu_config_fastsim.vhd @@ -0,0 +1,15 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; + +package zpu_config is + + constant Generate_Trace : boolean := false; + constant wordPower : integer := 5; + -- during simulation, set this to '0' to get matching trace.txt + constant DontCareValue : std_logic := '0'; + -- Clock frequency in MHz. + constant ZPU_Frequency : std_logic_vector(7 downto 0) := x"50"; -- 80MHz + constant maxAddrBitIncIO : integer := 15; + +end zpu_config; diff --git a/zpu/hdl/zpu4/src/zpu_config_trace.vhd b/zpu/hdl/zpu4/src/zpu_config_trace.vhd new file mode 100644 index 0000000..d1bbbbb --- /dev/null +++ b/zpu/hdl/zpu4/src/zpu_config_trace.vhd @@ -0,0 +1,15 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; + +package zpu_config is + + constant Generate_Trace : boolean := true; + constant wordPower : integer := 5; + -- during simulation, set this to '0' to get matching trace.txt + constant DontCareValue : std_logic := '0'; + -- Clock frequency in MHz. + constant ZPU_Frequency : std_logic_vector(7 downto 0) := x"64"; + constant maxAddrBitIncIO : integer := 15; + +end zpu_config; diff --git a/zpu/hdl/zpu4/src/zpu_core.vhd b/zpu/hdl/zpu4/src/zpu_core.vhd new file mode 100644 index 0000000..c7093e2 --- /dev/null +++ b/zpu/hdl/zpu4/src/zpu_core.vhd @@ -0,0 +1,900 @@ + +-- Company: ZPU4 generic memory interface CPU +-- Engineer: Øyvind Harboe + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; +use IEEE.STD_LOGIC_arith.ALL; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; + + +-- mem_writeEnable - set to '1' for a single cycle to send off a write request. +-- mem_write is valid only while mem_writeEnable='1'. +-- mem_readEnable - set to '1' for a single cycle to send off a read request. +-- +-- mem_busy - It is illegal to send off a read/write request when mem_busy='1'. +-- Set to '0' when mem_read is valid after a read request. +-- If it goes to '1'(busy), it is on the cycle after mem_read/writeEnable +-- is '1'. +-- mem_addr - address for read/write request +-- mem_read - read data. Valid only on the cycle after mem_busy='0' after +-- mem_readEnable='1' for a single cycle. +-- mem_write - data to write +-- mem_writeMask - set to '1' for those bits that are to be written to memory upon +-- write request +-- break - set to '1' when CPU hits break instruction +-- interrupt - set to '1' until interrupts are cleared by CPU. + + + + +entity zpu_core is + Port ( clk : in std_logic; + areset : in std_logic; + enable : in std_logic; + in_mem_busy : in std_logic; + mem_read : in std_logic_vector(wordSize-1 downto 0); + mem_write : out std_logic_vector(wordSize-1 downto 0); + out_mem_addr : out std_logic_vector(maxAddrBitIncIO downto 0); + out_mem_writeEnable : out std_logic; + out_mem_readEnable : out std_logic; + mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); + interrupt : in std_logic; + break : out std_logic); +end zpu_core; + +architecture behave of zpu_core is + +type InsnType is +( +State_AddTop, +State_Dup, +State_DupStackB, +State_Pop, +State_Popdown, +State_Add, +State_Or, +State_And, +State_Store, +State_AddSP, +State_Shift, +State_Nop, +State_Im, +State_LoadSP, +State_StoreSP, +State_Emulate, +State_Load, +State_PushPC, +State_PushSP, +State_PopPC, +State_PopPCRel, +State_Not, +State_Flip, +State_PopSP, +State_Neqbranch, +State_Eq, +State_Loadb, +State_Mult, +State_Lessthan, +State_Lessthanorequal, +State_Ulessthanorequal, +State_Ulessthan, +State_Pushspadd, +State_Call, +State_Callpcrel, +State_Sub, +State_Break, +State_Storeb, +State_InsnFetch +); + +type StateType is +( +State_Load2, +State_Popped, +State_LoadSP2, +State_LoadSP3, +State_AddSP2, +State_Fetch, +State_Execute, +State_Decode, +State_Decode2, +State_Resync, + +State_StoreSP2, +State_Resync2, +State_Resync3, +State_Loadb2, +State_Storeb2, +State_Mult2, +State_Mult3, +State_Mult5, +State_Mult4, +State_BinaryOpResult2, +State_BinaryOpResult, +State_Idle +); + + +signal pc : std_logic_vector(maxAddrBitIncIO downto 0); +signal sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal incSp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal incIncSp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal decSp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal stackA : std_logic_vector(wordSize-1 downto 0); +signal binaryOpResult : std_logic_vector(wordSize-1 downto 0); +signal binaryOpResult2 : std_logic_vector(wordSize-1 downto 0); +signal multResult2 : std_logic_vector(wordSize-1 downto 0); +signal multResult3 : std_logic_vector(wordSize-1 downto 0); +signal multResult : std_logic_vector(wordSize-1 downto 0); +signal multA : std_logic_vector(wordSize-1 downto 0); +signal multB : std_logic_vector(wordSize-1 downto 0); +signal stackB : std_logic_vector(wordSize-1 downto 0); +signal idim_flag : std_logic; +signal busy : std_logic; +signal mem_writeEnable : std_logic; +signal mem_readEnable : std_logic; +signal mem_addr : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal mem_delayAddr : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal mem_delayReadEnable : std_logic; + +signal decodeWord : std_logic_vector(wordSize-1 downto 0); + + +signal state : StateType; +signal insn : InsnType; +type InsnArray is array(0 to wordBytes-1) of InsnType; +signal decodedOpcode : InsnArray; + +type OpcodeArray is array(0 to wordBytes-1) of std_logic_vector(7 downto 0); + +signal opcode : OpcodeArray; + + + + +signal begin_inst : std_logic; +signal trace_opcode : std_logic_vector(7 downto 0); +signal trace_pc : std_logic_vector(maxAddrBitIncIO downto 0); +signal trace_sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal trace_topOfStack : std_logic_vector(wordSize-1 downto 0); +signal trace_topOfStackB : std_logic_vector(wordSize-1 downto 0); + +-- state machine. + +begin + + + traceFileGenerate: + if Generate_Trace generate + trace_file: trace port map ( + clk => clk, + begin_inst => begin_inst, + pc => trace_pc, + opcode => trace_opcode, + sp => trace_sp, + memA => trace_topOfStack, + memB => trace_topOfStackB, + busy => busy, + intsp => (others => 'U') + ); + end generate; + + + -- the memory subsystem will tell us one cycle later whether or + -- not it is busy + out_mem_writeEnable <= mem_writeEnable; + out_mem_readEnable <= mem_readEnable; + out_mem_addr(maxAddrBitIncIO downto minAddrBit) <= mem_addr; + out_mem_addr(minAddrBit-1 downto 0) <= (others => '0'); + + incSp <= sp + 1; + incIncSp <= sp + 2; + decSp <= sp - 1; + + + opcodeControl: + process(clk, areset) + variable tOpcode : std_logic_vector(OpCode_Size-1 downto 0); + variable spOffset : std_logic_vector(4 downto 0); + variable tSpOffset : std_logic_vector(4 downto 0); + variable nextPC : std_logic_vector(maxAddrBitIncIO downto 0); + variable tNextState : InsnType; + variable tDecodedOpcode : InsnArray; + variable tMultResult : std_logic_vector(wordSize*2-1 downto 0); + begin + if areset = '1' then + state <= State_Idle; + break <= '0'; + -- point to top of RAM-8 + sp <= (others => '0'); + sp(maxAddrBit downto minAddrBit+1) <= (others => '1'); + + pc <= (others => '0'); + idim_flag <= '0'; + begin_inst <= '0'; + mem_writeEnable <= '0'; + mem_readEnable <= '0'; + multA <= (others => '0'); + multB <= (others => '0'); + mem_writeMask <= (others => '1'); + elsif (clk'event and clk = '1') then + -- we must multiply unconditionally to get pipelined multiplication + tMultResult := multA * multB; + multResult3 <= multResult2; + multResult2 <= multResult; + multResult <= tMultResult(wordSize-1 downto 0); + + + binaryOpResult2 <= binaryOpResult; -- pipeline a bit. + + + multA <= (others => DontCareValue); + multB <= (others => DontCareValue); + + + mem_addr <= (others => DontCareValue); + mem_readEnable <='0'; + mem_writeEnable <='0'; + mem_write <= (others => DontCareValue); + + if (mem_writeEnable = '1') and (mem_readEnable = '1') then + report "read/write collision" severity failure; + end if; + + + + + spOffset(4):=not opcode(conv_integer(pc(byteBits-1 downto 0)))(4); + spOffset(3 downto 0):=opcode(conv_integer(pc(byteBits-1 downto 0)))(3 downto 0); + nextPC := pc + 1; + + -- prepare trace snapshot + trace_opcode <= opcode(conv_integer(pc(byteBits-1 downto 0))); + trace_pc <= pc; + trace_sp <= sp; + trace_topOfStack <= stackA; + trace_topOfStackB <= stackB; + begin_inst <= '0'; + + + case state is + when State_Idle => + if enable='1' then + state <= State_Resync; + end if; + -- Initial state of ZPU, fetch top of stack + first instruction + when State_Resync => + if in_mem_busy='0' then + mem_addr <= sp; + mem_readEnable <= '1'; + state <= State_Resync2; + end if; + when State_Resync2 => + if in_mem_busy='0' then + stackA <= mem_read; + mem_addr <= incSp; + mem_readEnable <= '1'; + state <= State_Resync3; + end if; + when State_Resync3 => + if in_mem_busy='0' then + stackB <= mem_read; + mem_addr <= pc(maxAddrBitIncIO downto minAddrBit); + mem_readEnable <= '1'; + state <= State_Decode; + end if; + when State_Decode => + if in_mem_busy='0' then + decodeWord <= mem_read; + state <= State_Decode2; + end if; + when State_Decode2 => + -- decode 4 instructions in parallel + for i in 0 to wordBytes-1 loop + tOpcode := decodeWord((wordBytes-1-i+1)*8-1 downto (wordBytes-1-i)*8); + + tSpOffset(4):=not tOpcode(4); + tSpOffset(3 downto 0):=tOpcode(3 downto 0); + + opcode(i) <= tOpcode; + if (tOpcode(7 downto 7)=OpCode_Im) then + tNextState:=State_Im; + elsif (tOpcode(7 downto 5)=OpCode_StoreSP) then + if tSpOffset = 0 then + tNextState := State_Pop; + elsif tSpOffset=1 then + tNextState := State_PopDown; + else + tNextState :=State_StoreSP; + end if; + elsif (tOpcode(7 downto 5)=OpCode_LoadSP) then + if tSpOffset = 0 then + tNextState :=State_Dup; + elsif tSpOffset = 1 then + tNextState :=State_DupStackB; + else + tNextState :=State_LoadSP; + end if; + elsif (tOpcode(7 downto 5)=OpCode_Emulate) then + tNextState :=State_Emulate; + if tOpcode(5 downto 0)=OpCode_Neqbranch then + tNextState :=State_Neqbranch; + elsif tOpcode(5 downto 0)=OpCode_Eq then + tNextState :=State_Eq; + elsif tOpcode(5 downto 0)=OpCode_Lessthan then + tNextState :=State_Lessthan; + elsif tOpcode(5 downto 0)=OpCode_Lessthanorequal then + --tNextState :=State_Lessthanorequal; + elsif tOpcode(5 downto 0)=OpCode_Ulessthan then + tNextState :=State_Ulessthan; + elsif tOpcode(5 downto 0)=OpCode_Ulessthanorequal then + --tNextState :=State_Ulessthanorequal; + elsif tOpcode(5 downto 0)=OpCode_Loadb then + tNextState :=State_Loadb; + elsif tOpcode(5 downto 0)=OpCode_Mult then + tNextState :=State_Mult; + elsif tOpcode(5 downto 0)=OpCode_Storeb then + tNextState :=State_Storeb; + elsif tOpcode(5 downto 0)=OpCode_Pushspadd then + tNextState :=State_Pushspadd; + elsif tOpcode(5 downto 0)=OpCode_Callpcrel then + tNextState :=State_Callpcrel; + elsif tOpcode(5 downto 0)=OpCode_Call then + --tNextState :=State_Call; + elsif tOpcode(5 downto 0)=OpCode_Sub then + tNextState :=State_Sub; + elsif tOpcode(5 downto 0)=OpCode_PopPCRel then + --tNextState :=State_PopPCRel; + end if; + elsif (tOpcode(7 downto 4)=OpCode_AddSP) then + if tSpOffset = 0 then + tNextState := State_Shift; + elsif tSpOffset = 1 then + tNextState := State_AddTop; + else + tNextState :=State_AddSP; + end if; + else + case tOpcode(3 downto 0) is + when OpCode_Nop => + tNextState :=State_Nop; + when OpCode_PushSP => + tNextState :=State_PushSP; + when OpCode_PopPC => + tNextState :=State_PopPC; + when OpCode_Add => + tNextState :=State_Add; + when OpCode_Or => + tNextState :=State_Or; + when OpCode_And => + tNextState :=State_And; + when OpCode_Load => + tNextState :=State_Load; + when OpCode_Not => + tNextState :=State_Not; + when OpCode_Flip => + tNextState :=State_Flip; + when OpCode_Store => + tNextState :=State_Store; + when OpCode_PopSP => + tNextState :=State_PopSP; + when others => + tNextState := State_Break; + + end case; + end if; + tDecodedOpcode(i) := tNextState; + + end loop; + + insn <= tDecodedOpcode(conv_integer(pc(byteBits-1 downto 0))); + + -- once we wrap, we need to fetch + tDecodedOpcode(0) := State_InsnFetch; + + decodedOpcode <= tDecodedOpcode; + state <= State_Execute; + + + + -- Each instruction must: + -- + -- 1. set idim_flag + -- 2. increase pc if applicable + -- 3. set next state if appliable + -- 4. do it's operation + + when State_Execute => + insn <= decodedOpcode(conv_integer(nextPC(byteBits-1 downto 0))); + + case insn is + when State_InsnFetch => + state <= State_Fetch; + when State_Im => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '1'; + pc <= pc + 1; + + if idim_flag='1' then + stackA(wordSize-1 downto 7) <= stackA(wordSize-8 downto 0); + stackA(6 downto 0) <= opcode(conv_integer(pc(byteBits-1 downto 0)))(6 downto 0); + else + mem_writeEnable <= '1'; + mem_addr <= incSp; + mem_write <= stackB; + stackB <= stackA; + sp <= decSp; + for i in wordSize-1 downto 7 loop + stackA(i) <= opcode(conv_integer(pc(byteBits-1 downto 0)))(6); + end loop; + stackA(6 downto 0) <= opcode(conv_integer(pc(byteBits-1 downto 0)))(6 downto 0); + end if; + end if; + when State_StoreSP => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_StoreSP2; + + mem_writeEnable <= '1'; + mem_addr <= sp+spOffset; + mem_write <= stackA; + stackA <= stackB; + sp <= incSp; + end if; + + + when State_LoadSP => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_LoadSP2; + + sp <= decSp; + mem_writeEnable <= '1'; + mem_addr <= incSp; + mem_write <= stackB; + end if; + when State_Emulate => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + sp <= decSp; + mem_writeEnable <= '1'; + mem_addr <= incSp; + mem_write <= stackB; + stackA <= (others => DontCareValue); + stackA(maxAddrBitIncIO downto 0) <= pc + 1; + stackB <= stackA; + + -- The emulate address is: + -- 98 7654 3210 + -- 0000 00aa aaa0 0000 + pc <= (others => '0'); + pc(9 downto 5) <= opcode(conv_integer(pc(byteBits-1 downto 0)))(4 downto 0); + state <= State_Fetch; + end if; + when State_Callpcrel => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + stackA <= (others => DontCareValue); + stackA(maxAddrBitIncIO downto 0) <= pc + 1; + + pc <= pc + stackA(maxAddrBitIncIO downto 0); + state <= State_Fetch; + end if; + when State_Call => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + stackA <= (others => DontCareValue); + stackA(maxAddrBitIncIO downto 0) <= pc + 1; + pc <= stackA(maxAddrBitIncIO downto 0); + state <= State_Fetch; + end if; + when State_AddSP => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_AddSP2; + + mem_readEnable <= '1'; + mem_addr <= sp+spOffset; + end if; + when State_PushSP => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + sp <= decSp; + stackA <= (others => '0'); + stackA(maxAddrBitIncIO downto minAddrBit) <= sp; + stackB <= stackA; + mem_writeEnable <= '1'; + mem_addr <= incSp; + mem_write <= stackB; + end if; + when State_PopPC => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= stackA(maxAddrBitIncIO downto 0); + sp <= incSp; + + mem_writeEnable <= '1'; + mem_addr <= incSp; + mem_write <= stackB; + state <= State_Resync; + end if; + when State_PopPCRel => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= stackA(maxAddrBitIncIO downto 0) + pc; + sp <= incSp; + + mem_writeEnable <= '1'; + mem_addr <= incSp; + mem_write <= stackB; + state <= State_Resync; + end if; + when State_Add => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + stackA <= stackA + stackB; + + mem_readEnable <= '1'; + mem_addr <= incIncSp; + sp <= incSp; + state <= State_Popped; + end if; + when State_Sub => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + binaryOpResult <= stackB - stackA; + state <= State_BinaryOpResult; + end if; + when State_Pop => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + mem_addr <= incIncSp; + mem_readEnable <= '1'; + sp <= incSp; + stackA <= stackB; + state <= State_Popped; + end if; + when State_PopDown => + if in_mem_busy='0' then + -- PopDown leaves top of stack unchanged + begin_inst <= '1'; + idim_flag <= '0'; + mem_addr <= incIncSp; + mem_readEnable <= '1'; + sp <= incSp; + state <= State_Popped; + end if; + when State_Or => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + stackA <= stackA or stackB; + mem_readEnable <= '1'; + mem_addr <= incIncSp; + sp <= incSp; + state <= State_Popped; + end if; + when State_And => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + + stackA <= stackA and stackB; + mem_readEnable <= '1'; + mem_addr <= incIncSp; + sp <= incSp; + state <= State_Popped; + end if; + when State_Eq => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + + binaryOpResult <= (others => '0'); + if (stackA=stackB) then + binaryOpResult(0) <= '1'; + end if; + state <= State_BinaryOpResult; + end if; + when State_Ulessthan => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + + binaryOpResult <= (others => '0'); + if (stackA + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + + binaryOpResult <= (others => '0'); + if (stackA<=stackB) then + binaryOpResult(0) <= '1'; + end if; + state <= State_BinaryOpResult; + end if; + when State_Lessthan => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + + binaryOpResult <= (others => '0'); + if (signed(stackA) + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + + binaryOpResult <= (others => '0'); + if (signed(stackA)<=signed(stackB)) then + binaryOpResult(0) <= '1'; + end if; + state <= State_BinaryOpResult; + end if; + when State_Load => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_Load2; + + mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); + mem_readEnable <= '1'; + end if; + + when State_Dup => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + sp <= decSp; + stackB <= stackA; + mem_write <= stackB; + mem_addr <= incSp; + mem_writeEnable <= '1'; + end if; + when State_DupStackB => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + sp <= decSp; + stackA <= stackB; + stackB <= stackA; + mem_write <= stackB; + mem_addr <= incSp; + mem_writeEnable <= '1'; + end if; + when State_Store => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); + mem_write <= stackB; + mem_writeEnable <= '1'; + sp <= incIncSp; + state <= State_Resync; + end if; + when State_PopSP => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + mem_write <= stackB; + mem_addr <= incSp; + mem_writeEnable <= '1'; + sp <= stackA(maxAddrBitIncIO downto minAddrBit); + state <= State_Resync; + end if; + when State_Nop => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + when State_Not => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + stackA <= not stackA; + when State_Flip => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + for i in 0 to wordSize-1 loop + stackA(i) <= stackA(wordSize-1-i); + end loop; + when State_AddTop => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + stackA <= stackA + stackB; + when State_Shift => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + stackA(wordSize-1 downto 1) <= stackA(wordSize-2 downto 0); + stackA(0) <= '0'; + when State_Pushspadd => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + stackA <= (others => '0'); + stackA(maxAddrBitIncIO downto minAddrBit) <= stackA(maxAddrBitIncIO-minAddrBit downto 0)+sp; + when State_Neqbranch => + -- branches are almost always taken as they form loops + begin_inst <= '1'; + idim_flag <= '0'; + sp <= incIncSp; + if (stackB/=0) then + pc <= stackA(maxAddrBitIncIO downto 0) + pc; + else + pc <= pc + 1; + end if; + -- need to fetch stack again. + state <= State_Resync; + when State_Mult => + begin_inst <= '1'; + idim_flag <= '0'; + + multA <= stackA; + multB <= stackB; + state <= State_Mult2; + when State_Break => + report "Break instruction encountered" severity failure; + break <= '1'; + + when State_Loadb => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_Loadb2; + + mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); + mem_readEnable <= '1'; + end if; + when State_Storeb => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_Storeb2; + + mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); + mem_readEnable <= '1'; + end if; + + when others => + sp <= (others => DontCareValue); + report "Illegal instruction" severity failure; + break <= '1'; + end case; + + + when State_StoreSP2 => + if in_mem_busy='0' then + mem_addr <= incSp; + mem_readEnable <= '1'; + state <= State_Popped; + end if; + when State_LoadSP2 => + if in_mem_busy='0' then + state <= State_LoadSP3; + mem_readEnable <= '1'; + mem_addr <= sp+spOffset+1; + end if; + when State_LoadSP3 => + if in_mem_busy='0' then + pc <= pc + 1; + state <= State_Execute; + stackB <= stackA; + stackA <= mem_read; + end if; + when State_AddSP2 => + if in_mem_busy='0' then + pc <= pc + 1; + state <= State_Execute; + stackA <= stackA + mem_read; + end if; + when State_Load2 => + if in_mem_busy='0' then + stackA <= mem_read; + pc <= pc + 1; + state <= State_Execute; + end if; + when State_Loadb2 => + if in_mem_busy='0' then + stackA <= (others => '0'); + stackA(7 downto 0) <= mem_read(((wordBytes-1-conv_integer(stackA(byteBits-1 downto 0)))*8+7) downto (wordBytes-1-conv_integer(stackA(byteBits-1 downto 0)))*8); + pc <= pc + 1; + state <= State_Execute; + end if; + when State_Storeb2 => + if in_mem_busy='0' then + mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); + mem_write <= mem_read; + mem_write(((wordBytes-1-conv_integer(stackA(byteBits-1 downto 0)))*8+7) downto (wordBytes-1-conv_integer(stackA(byteBits-1 downto 0)))*8) <= stackB(7 downto 0) ; + mem_writeEnable <= '1'; + pc <= pc + 1; + sp <= incIncSp; + state <= State_Resync; + end if; + when State_Fetch => + if in_mem_busy='0' then + mem_addr <= pc(maxAddrBitIncIO downto minAddrBit); + mem_readEnable <= '1'; + state <= State_Decode; + end if; + when State_Mult2 => + state <= State_Mult3; + when State_Mult3 => + state <= State_Mult4; + when State_Mult4 => + state <= State_Mult5; + when State_Mult5 => + if in_mem_busy='0' then + stackA <= multResult3; + mem_readEnable <= '1'; + mem_addr <= incIncSp; + sp <= incSp; + state <= State_Popped; + end if; + when State_BinaryOpResult => + state <= State_BinaryOpResult2; + when State_BinaryOpResult2 => + mem_readEnable <= '1'; + mem_addr <= incIncSp; + sp <= incSp; + stackA <= binaryOpResult2; + state <= State_Popped; + when State_Popped => + if in_mem_busy='0' then + pc <= pc + 1; + stackB <= mem_read; + state <= State_Execute; + end if; + when others => + sp <= (others => DontCareValue); + report "Illegal state" severity failure; + break <= '1'; + end case; + end if; + end process; + + + +end behave; diff --git a/zpu/hdl/zpu4/src/zpu_core_small.vhd b/zpu/hdl/zpu4/src/zpu_core_small.vhd new file mode 100644 index 0000000..4d73f88 --- /dev/null +++ b/zpu/hdl/zpu4/src/zpu_core_small.vhd @@ -0,0 +1,433 @@ +-- Company: ZPU3 +-- Engineer: Øyvind Harboe + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; + + +entity zpu_core is + Port ( clk : in std_logic; + areset : in std_logic; + enable : in std_logic; + in_mem_busy : in std_logic; + mem_read : in std_logic_vector(wordSize-1 downto 0); + mem_write : out std_logic_vector(wordSize-1 downto 0); + out_mem_addr : out std_logic_vector(maxAddrBitIncIO downto 0); + out_mem_writeEnable : out std_logic; + out_mem_readEnable : out std_logic; + mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); + interrupt : in std_logic; + break : out std_logic); +end zpu_core; + +architecture behave of zpu_core is + +signal readIO : std_logic; + + + +signal memAWriteEnable : std_logic; +signal memAAddr : std_logic_vector(maxAddrBit downto minAddrBit); +signal memAWrite : std_logic_vector(wordSize-1 downto 0); +signal memARead : std_logic_vector(wordSize-1 downto 0); +signal memBWriteEnable : std_logic; +signal memBAddr : std_logic_vector(maxAddrBit downto minAddrBit); +signal memBWrite : std_logic_vector(wordSize-1 downto 0); +signal memBRead : std_logic_vector(wordSize-1 downto 0); + + + +signal pc : std_logic_vector(maxAddrBit downto 0); +signal sp : std_logic_vector(maxAddrBit downto minAddrBit); + +signal idim_flag : std_logic; + +--signal storeToStack : std_logic; +--signal fetchNextInstruction : std_logic; +--signal extraCycle : std_logic; +signal busy : std_logic; +--signal fetching : std_logic; + +signal begin_inst : std_logic; + + + +signal trace_opcode : std_logic_vector(7 downto 0); +signal trace_pc : std_logic_vector(maxAddrBitIncIO downto 0); +signal trace_sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal trace_topOfStack : std_logic_vector(wordSize-1 downto 0); +signal trace_topOfStackB : std_logic_vector(wordSize-1 downto 0); + +-- state machine. +type State_Type is +( +State_Fetch, +State_WriteIODone, +State_Execute, +State_StoreToStack, +State_Add, +State_Or, +State_And, +State_Store, +State_ReadIO, +State_WriteIO, +State_Load, +State_FetchNext, +State_AddSP, +State_ReadIODone, +State_Decode, +State_Resync +); + +type DecodedOpcodeType is +( +Decoded_Nop, +Decoded_Im, +Decoded_ImShift, +Decoded_LoadSP, +Decoded_StoreSP , +Decoded_AddSP, +Decoded_Emulate, +Decoded_Break, +Decoded_PushSP, +Decoded_PopPC, +Decoded_Add, +Decoded_Or, +Decoded_And, +Decoded_Load, +Decoded_Not, +Decoded_Flip, +Decoded_Store, +Decoded_PopSP +); + + + +signal sampledOpcode : std_logic_vector(OpCode_Size-1 downto 0); +signal opcode : std_logic_vector(OpCode_Size-1 downto 0); + +signal decodedOpcode : DecodedOpcodeType; +signal sampledDecodedOpcode : DecodedOpcodeType; + + +signal state : State_Type; + +begin + traceFileGenerate: + if Generate_Trace generate + trace_file: trace port map ( + clk => clk, + begin_inst => begin_inst, + pc => trace_pc, + opcode => trace_opcode, + sp => trace_sp, + memA => trace_topOfStack, + memB => trace_topOfStackB, + busy => busy, + intsp => (others => 'U') + ); + end generate; + + + memory: dualport_ram port map ( + clk => clk, + memAWriteEnable => memAWriteEnable, + memAAddr => memAAddr(maxAddrBitBRAM downto minAddrBit), + memAWrite => memAWrite, + memARead => memARead, + memBWriteEnable => memBWriteEnable, + memBAddr => memBAddr(maxAddrBitBRAM downto minAddrBit), + memBWrite => memBWrite, + memBRead => memBRead + ); + + + + decodeControl: + process(memBRead, pc) + variable tOpcode : std_logic_vector(OpCode_Size-1 downto 0); + begin + tOpcode := memBRead((wordBytes-1-conv_integer(pc(minAddrBit-1 downto 0))+1)*8-1 downto (wordBytes-1-conv_integer(pc(minAddrBit-1 downto 0)))*8); + + sampledOpcode <= tOpcode; + + if (tOpcode(7 downto 7)=OpCode_Im) then + sampledDecodedOpcode<=Decoded_Im; + elsif (tOpcode(7 downto 5)=OpCode_StoreSP) then + sampledDecodedOpcode<=Decoded_StoreSP; + elsif (tOpcode(7 downto 5)=OpCode_LoadSP) then + sampledDecodedOpcode<=Decoded_LoadSP; + elsif (tOpcode(7 downto 5)=OpCode_Emulate) then + sampledDecodedOpcode<=Decoded_Emulate; + elsif (tOpcode(7 downto 4)=OpCode_AddSP) then + sampledDecodedOpcode<=Decoded_AddSP; + else + case tOpcode(3 downto 0) is + when OpCode_Break => + sampledDecodedOpcode<=Decoded_Break; + when OpCode_PushSP => + sampledDecodedOpcode<=Decoded_PushSP; + when OpCode_PopPC => + sampledDecodedOpcode<=Decoded_PopPC; + when OpCode_Add => + sampledDecodedOpcode<=Decoded_Add; + when OpCode_Or => + sampledDecodedOpcode<=Decoded_Or; + when OpCode_And => + sampledDecodedOpcode<=Decoded_And; + when OpCode_Load => + sampledDecodedOpcode<=Decoded_Load; + when OpCode_Not => + sampledDecodedOpcode<=Decoded_Not; + when OpCode_Flip => + sampledDecodedOpcode<=Decoded_Flip; + when OpCode_Store => + sampledDecodedOpcode<=Decoded_Store; + when OpCode_PopSP => + sampledDecodedOpcode<=Decoded_PopSP; + when others => + sampledDecodedOpcode<=Decoded_Nop; + end case; + end if; + end process; + + + opcodeControl: + process(clk, areset) + variable spOffset : std_logic_vector(4 downto 0); + begin + if areset = '1' then + state <= State_Resync; + break <= '0'; + sp <= spStart(maxAddrBit downto minAddrBit); + pc <= (others => '0'); + idim_flag <= '0'; + begin_inst <= '0'; + memAAddr <= (others => '0'); + memBAddr <= (others => '0'); + memAWriteEnable <= '0'; + memBWriteEnable <= '0'; + out_mem_writeEnable <= '0'; + out_mem_readEnable <= '0'; + memAWrite <= (others => '0'); + memBWrite <= (others => '0'); + mem_writeMask <= (others => '1'); + elsif (clk'event and clk = '1') then + memAWriteEnable <= '0'; + memBWriteEnable <= '0'; + -- This saves ca. 100 LUT's, by explicitly declaring that the + -- memAWrite can be left at whatever value if memAWriteEnable is + -- not set. + memAWrite <= (others => DontCareValue); + memBWrite <= (others => DontCareValue); +-- out_mem_addr <= (others => DontCareValue); +-- mem_write <= (others => DontCareValue); + spOffset := (others => DontCareValue); + memAAddr <= (others => DontCareValue); + memBAddr <= (others => DontCareValue); + + out_mem_writeEnable <= '0'; + out_mem_readEnable <= '0'; + begin_inst <= '0'; + out_mem_addr <= memARead(maxAddrBitIncIO downto 0); + mem_write <= memBRead; + + decodedOpcode <= sampledDecodedOpcode; + opcode <= sampledOpcode; + + case state is + when State_Execute => + state <= State_Fetch; + -- at this point: + -- memBRead contains opcode word + -- memARead contains top of stack + pc <= pc + 1; + + -- trace + begin_inst <= '1'; + trace_pc <= (others => '0'); + trace_pc(maxAddrBit downto 0) <= pc; + trace_opcode <= opcode; + trace_sp <= (others => '0'); + trace_sp(maxAddrBit downto minAddrBit) <= sp; + trace_topOfStack <= memARead; + trace_topOfStackB <= memBRead; + + -- during the next cycle we'll be reading the next opcode + spOffset(4):=not opcode(4); + spOffset(3 downto 0):=opcode(3 downto 0); + + idim_flag <= '0'; + case decodedOpcode is + when Decoded_Im => + idim_flag <= '1'; + memAWriteEnable <= '1'; + if (idim_flag='0') then + sp <= sp - 1; + memAAddr <= sp-1; + for i in wordSize-1 downto 7 loop + memAWrite(i) <= opcode(6); + end loop; + memAWrite(6 downto 0) <= opcode(6 downto 0); + else + memAAddr <= sp; + memAWrite(wordSize-1 downto 7) <= memARead(wordSize-8 downto 0); + memAWrite(6 downto 0) <= opcode(6 downto 0); + end if; + when Decoded_StoreSP => + memBWriteEnable <= '1'; + memBAddr <= sp+spOffset; + memBWrite <= memARead; + sp <= sp + 1; + state <= State_Resync; + when Decoded_LoadSP => + sp <= sp - 1; + memAAddr <= sp+spOffset; + when Decoded_Emulate => + sp <= sp - 1; + memAWriteEnable <= '1'; + memAAddr <= sp - 1; + memAWrite <= (others => DontCareValue); + memAWrite(maxAddrBit downto 0) <= pc + 1; + -- The emulate address is: + -- 98 7654 3210 + -- 0000 00aa aaa0 0000 + pc <= (others => '0'); + pc(9 downto 5) <= opcode(4 downto 0); + when Decoded_AddSP => + memAAddr <= sp; + memBAddr <= sp+spOffset; + state <= State_AddSP; + when Decoded_Break => + report "Break instruction encountered" severity failure; + break <= '1'; + when Decoded_PushSP => + memAWriteEnable <= '1'; + memAAddr <= sp - 1; + sp <= sp - 1; + memAWrite <= (others => DontCareValue); + memAWrite(maxAddrBit downto minAddrBit) <= sp; + when Decoded_PopPC => + pc <= memARead(maxAddrBit downto 0); + sp <= sp + 1; + state <= State_Resync; + when Decoded_Add => + sp <= sp + 1; + state <= State_Add; + when Decoded_Or => + sp <= sp + 1; + state <= State_Or; + when Decoded_And => + sp <= sp + 1; + state <= State_And; + when Decoded_Load => + if (memARead(ioBit)='1') then + out_mem_addr <= memARead(maxAddrBitIncIO downto 0); + out_mem_readEnable <= '1'; + state <= State_ReadIO; + else + memAAddr <= memARead(maxAddrBit downto minAddrBit); + end if; + when Decoded_Not => + memAAddr <= sp(maxAddrBit downto minAddrBit); + memAWriteEnable <= '1'; + memAWrite <= not memARead; + when Decoded_Flip => + memAAddr <= sp(maxAddrBit downto minAddrBit); + memAWriteEnable <= '1'; + for i in 0 to wordSize-1 loop + memAWrite(i) <= memARead(wordSize-1-i); + end loop; + when Decoded_Store => + memBAddr <= sp + 1; + sp <= sp + 1; + if (memARead(ioBit)='1') then + state <= State_WriteIO; + else + state <= State_Store; + end if; + when Decoded_PopSP => + sp <= memARead(maxAddrBit downto minAddrBit); + state <= State_Resync; + when Decoded_Nop => + memAAddr <= sp; + when others => + null; + end case; + when State_ReadIO => + if (in_mem_busy = '0') then + state <= State_Fetch; + memAWriteEnable <= '1'; + memAWrite <= mem_read; + end if; + when State_WriteIO => + sp <= sp + 1; + out_mem_writeEnable <= '1'; + out_mem_addr <= memARead(maxAddrBitIncIO downto 0); + mem_write <= memBRead; + state <= State_WriteIODone; + when State_WriteIODone => + if (in_mem_busy = '0') then + state <= State_Resync; + end if; + when State_Fetch => + -- We need to resync. During the *next* cycle + -- we'll fetch the opcode @ pc and thus it will + -- be available for State_Execute the cycle after + -- next + memBAddr <= pc(maxAddrBit downto minAddrBit); + state <= State_FetchNext; + when State_FetchNext => + -- at this point memARead contains the value that is either + -- from the top of stack or should be copied to the top of the stack + memAWriteEnable <= '1'; + memAWrite <= memARead; + memAAddr <= sp; + memBAddr <= sp + 1; + state <= State_Decode; + when State_Decode => + -- during the State_Execute cycle we'll be fetching SP+1 + memAAddr <= sp; + memBAddr <= sp + 1; + state <= State_Execute; + when State_Store => + sp <= sp + 1; + memAWriteEnable <= '1'; + memAAddr <= memARead(maxAddrBit downto minAddrBit); + memAWrite <= memBRead; + state <= State_Resync; + when State_AddSP => + state <= State_Add; + when State_Add => + memAAddr <= sp; + memAWriteEnable <= '1'; + memAWrite <= memARead + memBRead; + state <= State_Fetch; + when State_Or => + memAAddr <= sp; + memAWriteEnable <= '1'; + memAWrite <= memARead or memBRead; + state <= State_Fetch; + when State_Resync => + memAAddr <= sp; + state <= State_Fetch; + when State_And => + memAAddr <= sp; + memAWriteEnable <= '1'; + memAWrite <= memARead and memBRead; + state <= State_Fetch; + when others => + null; + end case; + + end if; + end process; + + + +end behave; diff --git a/zpu/hdl/zpu4/src/zpuio.vhd b/zpu/hdl/zpu4/src/zpuio.vhd new file mode 100644 index 0000000..d14629e --- /dev/null +++ b/zpu/hdl/zpu4/src/zpuio.vhd @@ -0,0 +1,256 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; + +entity zpuio is + port ( areset : in std_logic; + cpu_clk : in std_logic; + clk_status : in std_logic_vector(2 downto 0); + cpu_din : in std_logic_vector(15 downto 0); + cpu_a : in std_logic_vector(20 downto 0); + cpu_we : in std_logic_vector(1 downto 0); + cpu_re : in std_logic; + cpu_dout : inout std_logic_vector(15 downto 0)); +end zpuio; + +architecture behave of zpuio is + +signal timer_read : std_logic_vector(7 downto 0); +--signal timer_write : std_logic_vector(7 downto 0); +signal timer_we : std_logic; + + +signal io_busy : std_logic; +signal io_read : std_logic_vector(7 downto 0); +--signal io_write : std_logic_vector(7 downto 0); +signal io_addr : std_logic_vector(maxAddrBit downto minAddrBit); +signal io_writeEnable : std_logic; +signal Enable : std_logic; + +signal din : std_logic_vector(7 downto 0); +signal dout : std_logic_vector(7 downto 0); +signal adr : std_logic_vector(15 downto 0); +signal break : std_logic; +signal we : std_logic; +signal re : std_logic; + + +-- uart forwarding... + +signal uartTXPending : std_logic; +signal uartTXCleared : std_logic; +signal uartData : std_logic_vector(7 downto 0); + +signal readingTimer : std_logic; + + + + +signal mem_busy : std_logic; +signal mem_read : std_logic_vector(wordSize-1 downto 0); +signal mem_write : std_logic_vector(wordSize-1 downto 0); +signal mem_addr : std_logic_vector(maxAddrBitIncIO downto 0); +signal mem_writeEnable : std_logic; +signal mem_readEnable : std_logic; +signal mem_writeMask: std_logic_vector(wordBytes-1 downto 0); + +signal dram_mem_busy : std_logic; +signal dram_mem_read : std_logic_vector(wordSize-1 downto 0); +signal dram_mem_write : std_logic_vector(wordSize-1 downto 0); +signal dram_mem_writeEnable : std_logic; +signal dram_mem_readEnable : std_logic; +signal dram_mem_writeMask: std_logic_vector(wordBytes-1 downto 0); + + + +--signal io_mem_read : std_logic_vector(7 downto 0); +--signal io_mem_writeEnable : std_logic; +--signal io_mem_readEnable : std_logic; +signal io_readEnable : std_logic; + + +signal dram_read : std_logic; + + + +begin + + io_addr <= mem_addr(maxAddrBit downto minAddrBit); + + timerinst: timer port map ( + clk => cpu_clk, + areset => areset, + we => timer_we, + din => mem_write(7 downto 0), + adr => io_addr(4 downto 2), + dout => timer_read); + + zpu: zpu_core port map ( + clk => cpu_clk , + areset => areset, + in_mem_busy => mem_busy, + mem_read => mem_read, + mem_write => mem_write, + out_mem_addr => mem_addr, + out_mem_writeEnable => mem_writeEnable, + out_mem_readEnable => mem_readEnable, + mem_writeMask => mem_writeMask, + interrupt => '0', + break => break); + + +ram_imp: dram port map ( + clk => cpu_clk , + areset => areset, + mem_busy => dram_mem_busy, + mem_read => dram_mem_read, + mem_write => mem_write, + mem_addr => mem_addr(maxAddrBit downto 0), + mem_writeEnable => dram_mem_writeEnable, + mem_readEnable => dram_mem_readEnable, + mem_writeMask => mem_writeMask); + + + -- Read/write are on different addresses + -- The registers are 8 bits and mapped to bit[7:0] + -- + -- 0xC000 Write: Writes to UART TX FIFO (4 byte FIFO) + -- Read : Reads from UART RX FIFO (4 byte FIFO) + -- 0xC004 Read : UART status register + -- Bit 0 = RX FIFO empty + -- Bit 1 = TX FIFO full + -- 0xA000 Skrive: LED's (8 stk.) + + -- 0x9000 Write: bit 0: 1= reset counter + -- 0= counter running + -- bit 1: 1= sample counter (when set to 1) + -- 0=not used + -- Read : counter bit[7:0] + -- 0x9004 Read: counter bit [15:8] + -- 0x9008 Read: counter bit [23:16] + -- 0x900C Read: counter bit [31:24] + -- 0x9010 Read: counter bit [39:32] + -- 0x9014 Read: counter bit [47:40] + -- 0x9018 Read: counter bit [55:48] + -- 0x901C Read: counter bit [63:56] + -- + -- 0x8800 Read: unsigned 8-bit integer with FPGA frequency (in MHz) + + fauxUart: + process(cpu_clk, areset) + begin + if areset = '1' then + io_busy <= '0'; + uartTXPending <= '0'; + timer_we <= '0'; + io_busy <= '0'; + uartData <= x"58"; -- 'X' + readingTimer <= '0'; + elsif (cpu_clk'event and cpu_clk = '1') then + timer_we <= '0'; + io_busy <= '0'; + if uartTXCleared = '1' then + uartTXPending <= '0'; + end if; + + if io_writeEnable = '1' then + if io_addr=x"1000" then + -- Write to UART + uartData <= mem_write(7 downto 0); + uartTXPending <= '1'; + io_busy <= '1'; + elsif io_addr(12)='1' then + timer_we <= '1'; + io_busy <= '1'; + else + report "Illegal IO write" severity failure; + end if; + end if; + if (io_readEnable = '1') then + if io_addr=x"1001" then + io_read <= (0=>'1', -- recieve empty + 1 => uartTXPending, -- tx full + others => '0'); + io_busy <= '1'; + elsif io_addr(12)='1' then + readingTimer <= '1'; + io_busy <= '1'; + elsif io_addr(11)='1' then + io_read <= ZPU_Frequency; + io_busy <= '1'; + else + report "Illegal IO read" severity failure; + end if; + + else + if (readingTimer = '1') then + readingTimer <= '0'; + io_read <= timer_read; + io_busy <= '0'; + else + io_read <= (others => '1'); + end if; + end if; + end if; + end process; + + + forwardUARTOutputToARM: + process(cpu_clk, areset) + begin + if areset = '1' then + uartTXCleared <= '0'; + elsif (cpu_clk = '1' and cpu_clk'event) then + if cpu_we(0) = '1' and cpu_a(3 downto 1) = "000" then + uartTXCleared <= cpu_din(0); + else + uartTXCleared <= uartTXCleared; + end if; + end if; + end process; + + cpu_dout(7 downto 0) <= uartData when (cpu_re = '1' and cpu_a(3 downto 1) = "001") else (others => 'Z'); + cpu_dout <= (0 => uartTXPending, others => '0') when (cpu_re = '1' and cpu_a(3 downto 1) = "000") else (others => 'Z'); + + dram_mem_writeEnable <= mem_writeEnable and not mem_addr(ioBit); + dram_mem_readEnable <= mem_readEnable and not mem_addr(ioBit); + io_writeEnable <= mem_writeEnable and mem_addr(ioBit); +-- io_readEnable <= mem_readEnable and mem_addr(ioBit); + mem_busy <= io_busy or dram_mem_busy or dram_read or io_readEnable; + + -- Memory reads either come from IO or DRAM. We need to pick the right one. + memorycontrol: + process(cpu_clk, areset) + begin + if areset = '1' then + dram_read <= '0'; + io_readEnable <= '0'; + + + elsif (cpu_clk'event and cpu_clk = '1') then + mem_read <= (others => '0'); + if mem_addr(ioBit)='0' and mem_readEnable='1' then + dram_read <= '1'; + end if; + if dram_read='1' and dram_mem_busy='0' then + dram_read <= '0'; + mem_read <= dram_mem_read; + end if; + + if mem_addr(ioBit)='1' and mem_readEnable='1' then + io_readEnable <= '1'; + end if; + if io_readEnable='1' and io_busy='0' then + io_readEnable <= '0'; + mem_read(7 downto 0) <= io_read; + end if; + + end if; + end process; + + +end behave; diff --git a/zpu/hdl/zpu4/src/zpuio_bram.vhd b/zpu/hdl/zpu4/src/zpuio_bram.vhd new file mode 100644 index 0000000..5d3f409 --- /dev/null +++ b/zpu/hdl/zpu4/src/zpuio_bram.vhd @@ -0,0 +1,229 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; + +entity zpuio is + port ( areset : in std_logic; + cpu_clk : in std_logic; + clk_status : in std_logic_vector(2 downto 0); + cpu_din : in std_logic_vector(15 downto 0); + cpu_a : in std_logic_vector(20 downto 0); + cpu_we : in std_logic_vector(1 downto 0); + cpu_re : in std_logic; + cpu_dout : inout std_logic_vector(15 downto 0)); +end zpuio; + +architecture behave of zpuio is + +signal timer_read : std_logic_vector(7 downto 0); +--signal timer_write : std_logic_vector(7 downto 0); +signal timer_we : std_logic; + + +signal io_busy : std_logic; +signal io_read : std_logic_vector(7 downto 0); +--signal io_write : std_logic_vector(7 downto 0); +signal io_addr : std_logic_vector(maxAddrBit downto minAddrBit); +signal io_writeEnable : std_logic; +signal Enable : std_logic; + +signal din : std_logic_vector(7 downto 0); +signal dout : std_logic_vector(7 downto 0); +signal adr : std_logic_vector(15 downto 0); +signal break : std_logic; +signal we : std_logic; +signal re : std_logic; + + +-- uart forwarding... + +signal uartTXPending : std_logic; +signal uartTXCleared : std_logic; +signal uartData : std_logic_vector(7 downto 0); + +signal readingTimer : std_logic; + + + + +signal mem_busy : std_logic; +signal mem_read : std_logic_vector(wordSize-1 downto 0); +signal mem_write : std_logic_vector(wordSize-1 downto 0); +signal mem_addr : std_logic_vector(maxAddrBitIncIO downto 0); +signal mem_writeEnable : std_logic; +signal mem_readEnable : std_logic; +signal mem_writeMask: std_logic_vector(wordBytes-1 downto 0); + + + + +--signal io_mem_read : std_logic_vector(7 downto 0); +--signal io_mem_writeEnable : std_logic; +--signal io_mem_readEnable : std_logic; +signal io_readEnable : std_logic; + + + + + +begin + + io_addr <= mem_addr(maxAddrBit downto minAddrBit); + + timerinst: timer port map ( + clk => cpu_clk, + areset => areset, + we => timer_we, + din => mem_write(7 downto 0), + adr => io_addr(4 downto 2), + dout => timer_read); + + zpu: zpu_core port map ( + clk => cpu_clk , + areset => areset, + in_mem_busy => mem_busy, + mem_read => mem_read, + mem_write => mem_write, + out_mem_addr => mem_addr, + out_mem_writeEnable => mem_writeEnable, + out_mem_readEnable => mem_readEnable, + mem_writeMask => mem_writeMask, + interrupt => '0', + break => break); + + + + + -- Read/write are on different addresses + -- The registers are 8 bits and mapped to bit[7:0] + -- + -- 0xC000 Write: Writes to UART TX FIFO (4 byte FIFO) + -- Read : Reads from UART RX FIFO (4 byte FIFO) + -- 0xC004 Read : UART status register + -- Bit 0 = RX FIFO empty + -- Bit 1 = TX FIFO full + -- 0xA000 Skrive: LED's (8 stk.) + + -- 0x9000 Write: bit 0: 1= reset counter + -- 0= counter running + -- bit 1: 1= sample counter (when set to 1) + -- 0=not used + -- Read : counter bit[7:0] + -- 0x9004 Read: counter bit [15:8] + -- 0x9008 Read: counter bit [23:16] + -- 0x900C Read: counter bit [31:24] + -- 0x9010 Read: counter bit [39:32] + -- 0x9014 Read: counter bit [47:40] + -- 0x9018 Read: counter bit [55:48] + -- 0x901C Read: counter bit [63:56] + -- + -- 0x8800 Read: unsigned 8-bit integer with FPGA frequency (in MHz) + + fauxUart: + process(cpu_clk, areset) + begin + if areset = '1' then + io_busy <= '0'; + uartTXPending <= '0'; + timer_we <= '0'; + io_busy <= '0'; + uartData <= x"58"; -- 'X' + readingTimer <= '0'; + elsif (cpu_clk'event and cpu_clk = '1') then + timer_we <= '0'; + io_busy <= '0'; + if uartTXCleared = '1' then + uartTXPending <= '0'; + end if; + + if io_writeEnable = '1' then + if io_addr=x"1000" then + -- Write to UART + uartData <= mem_write(7 downto 0); + uartTXPending <= '1'; + io_busy <= '1'; + elsif io_addr(12)='1' then + timer_we <= '1'; + io_busy <= '1'; + else + report "Illegal IO write" severity failure; + end if; + end if; + if (io_readEnable = '1') then + if io_addr=x"1001" then + io_read <= (0=>'1', -- recieve empty + 1 => uartTXPending, -- tx full + others => '0'); + io_busy <= '1'; + elsif io_addr(12)='1' then + readingTimer <= '1'; + io_busy <= '1'; + elsif io_addr(11)='1' then + io_read <= ZPU_Frequency; + io_busy <= '1'; + else + report "Illegal IO read" severity failure; + end if; + + else + if (readingTimer = '1') then + readingTimer <= '0'; + io_read <= timer_read; + io_busy <= '0'; + else + io_read <= (others => '1'); + end if; + end if; + end if; + end process; + + + forwardUARTOutputToARM: + process(cpu_clk, areset) + begin + if areset = '1' then + uartTXCleared <= '0'; + elsif (cpu_clk = '1' and cpu_clk'event) then + if cpu_we(0) = '1' and cpu_a(3 downto 1) = "000" then + uartTXCleared <= cpu_din(0); + else + uartTXCleared <= uartTXCleared; + end if; + end if; + end process; + + cpu_dout(7 downto 0) <= uartData when (cpu_re = '1' and cpu_a(3 downto 1) = "001") else (others => 'Z'); + cpu_dout <= (0 => uartTXPending, others => '0') when (cpu_re = '1' and cpu_a(3 downto 1) = "000") else (others => 'Z'); + + io_writeEnable <= mem_writeEnable and mem_addr(ioBit); +-- io_readEnable <= mem_readEnable and mem_addr(ioBit); + mem_busy <= io_busy or io_readEnable; + + -- Memory reads either come from IO or DRAM. We need to pick the right one. + memorycontrol: + process(cpu_clk, areset) + begin + if areset = '1' then + io_readEnable <= '0'; + + + elsif (cpu_clk'event and cpu_clk = '1') then + mem_read <= (others => '0'); + + if mem_addr(ioBit)='1' and mem_readEnable='1' then + io_readEnable <= '1'; + end if; + if io_readEnable='1' and io_busy='0' then + io_readEnable <= '0'; + mem_read(7 downto 0) <= io_read; + end if; + + end if; + end process; + + +end behave; diff --git a/zpu/hdl/zpu4/src/zpupkg.vhd b/zpu/hdl/zpu4/src/zpupkg.vhd new file mode 100644 index 0000000..30c3e46 --- /dev/null +++ b/zpu/hdl/zpu4/src/zpupkg.vhd @@ -0,0 +1,168 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.all; +use IEEE.STD_LOGIC_ARITH.all; + +library work; +use work.zpu_config.all; + +package zpupkg is + + -- This bit is set for read/writes to IO + -- FIX!!! eventually this should be set to wordSize-1 so as to + -- to make the address of IO independent of amount of memory + -- reserved for CPU. Requires trivial tweaks in toolchain/runtime + -- libraries. + + constant byteBits : integer := wordPower-3; -- # of bits in a word that addresses bytes + constant maxAddrBit : integer := maxAddrBitIncIO-1; + constant ioBit : integer := maxAddrBit+1; + constant wordSize : integer := 2**wordPower; + constant wordBytes : integer := wordSize/8; + constant minAddrBit : integer := byteBits; + -- configurable internal stack size. Probably going to be 16 after toolchain is done + constant stack_bits : integer := 5; + constant stack_size : integer := 2**stack_bits; + + component dualport_ram is + port (clk : in std_logic; + memAWriteEnable : in std_logic; + memAAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit); + memAWrite : in std_logic_vector(wordSize-1 downto 0); + memARead : out std_logic_vector(wordSize-1 downto 0); + memBWriteEnable : in std_logic; + memBAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit); + memBWrite : in std_logic_vector(wordSize-1 downto 0); + memBRead : out std_logic_vector(wordSize-1 downto 0)); + end component; + + component dram is + port (clk : in std_logic; + areset : in std_logic; + mem_writeEnable : in std_logic; + mem_readEnable : in std_logic; + mem_addr : in std_logic_vector(maxAddrBit downto 0); + mem_write : in std_logic_vector(wordSize-1 downto 0); + mem_read : out std_logic_vector(wordSize-1 downto 0); + mem_busy : out std_logic; + mem_writeMask : in std_logic_vector(wordBytes-1 downto 0)); + end component; + + + component trace is + port( + clk : in std_logic; + begin_inst : in std_logic; + pc : in std_logic_vector(maxAddrBitIncIO downto 0); + opcode : in std_logic_vector(7 downto 0); + sp : in std_logic_vector(maxAddrBitIncIO downto minAddrBit); + memA : in std_logic_vector(wordSize-1 downto 0); + memB : in std_logic_vector(wordSize-1 downto 0); + busy : in std_logic; + intSp : in std_logic_vector(stack_bits-1 downto 0) + ); + end component; + + component zpu_core is + port ( clk : in std_logic; + areset : in std_logic; + enable : in std_logic; + in_mem_busy : in std_logic; + mem_read : in std_logic_vector(wordSize-1 downto 0); + mem_write : out std_logic_vector(wordSize-1 downto 0); + out_mem_addr : out std_logic_vector(maxAddrBitIncIO downto 0); + out_mem_writeEnable : out std_logic; + out_mem_readEnable : out std_logic; + mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); + interrupt : in std_logic; + break : out std_logic); + end component; + + + + component timer is + port( + clk : in std_logic; + areset : in std_logic; + we : in std_logic; + din : in std_logic_vector(7 downto 0); + adr : in std_logic_vector(2 downto 0); + dout : out std_logic_vector(7 downto 0)); + end component; + + component zpuio is + port ( areset : in std_logic; + cpu_clk : in std_logic; + clk_status : in std_logic_vector(2 downto 0); + cpu_din : in std_logic_vector(15 downto 0); + cpu_a : in std_logic_vector(20 downto 0); + cpu_we : in std_logic_vector(1 downto 0); + cpu_re : in std_logic; + cpu_dout : inout std_logic_vector(15 downto 0)); + end component; + + + + + -- opcode decode constants + constant OpCode_Im : std_logic_vector(7 downto 7) := "1"; + constant OpCode_StoreSP : std_logic_vector(7 downto 5) := "010"; + constant OpCode_LoadSP : std_logic_vector(7 downto 5) := "011"; + constant OpCode_Emulate : std_logic_vector(7 downto 5) := "001"; + constant OpCode_AddSP : std_logic_vector(7 downto 4) := "0001"; + constant OpCode_Short : std_logic_vector(7 downto 4) := "0000"; + + constant OpCode_Break : std_logic_vector(3 downto 0) := "0000"; + constant OpCode_Shiftleft: std_logic_vector(3 downto 0) := "0001"; + constant OpCode_PushSP : std_logic_vector(3 downto 0) := "0010"; + constant OpCode_PushInt : std_logic_vector(3 downto 0) := "0011"; + + constant OpCode_PopPC : std_logic_vector(3 downto 0) := "0100"; + constant OpCode_Add : std_logic_vector(3 downto 0) := "0101"; + constant OpCode_And : std_logic_vector(3 downto 0) := "0110"; + constant OpCode_Or : std_logic_vector(3 downto 0) := "0111"; + + constant OpCode_Load : std_logic_vector(3 downto 0) := "1000"; + constant OpCode_Not : std_logic_vector(3 downto 0) := "1001"; + constant OpCode_Flip : std_logic_vector(3 downto 0) := "1010"; + constant OpCode_Nop : std_logic_vector(3 downto 0) := "1011"; + + constant OpCode_Store : std_logic_vector(3 downto 0) := "1100"; + constant OpCode_PopSP : std_logic_vector(3 downto 0) := "1101"; + constant OpCode_Compare : std_logic_vector(3 downto 0) := "1110"; + constant OpCode_PopInt : std_logic_vector(3 downto 0) := "1111"; + + constant OpCode_Lessthan : std_logic_vector(5 downto 0) := conv_std_logic_vector(36, 6); + constant OpCode_Lessthanorequal : std_logic_vector(5 downto 0) := conv_std_logic_vector(37, 6); + constant OpCode_Ulessthan : std_logic_vector(5 downto 0) := conv_std_logic_vector(38, 6); + constant OpCode_Ulessthanorequal : std_logic_vector(5 downto 0) := conv_std_logic_vector(39, 6); + + constant OpCode_Swap : std_logic_vector(5 downto 0) := conv_std_logic_vector(40, 6); + constant OpCode_Mult : std_logic_vector(5 downto 0) := conv_std_logic_vector(41, 6); + + constant OpCode_Lshiftright : std_logic_vector(5 downto 0) := conv_std_logic_vector(42, 6); + constant OpCode_Ashiftleft : std_logic_vector(5 downto 0) := conv_std_logic_vector(43, 6); + constant OpCode_Ashiftright : std_logic_vector(5 downto 0) := conv_std_logic_vector(44, 6); + constant OpCode_Call : std_logic_vector(5 downto 0) := conv_std_logic_vector(45, 6); + + constant OpCode_Eq : std_logic_vector(5 downto 0) := conv_std_logic_vector(46, 6); + constant OpCode_Neq : std_logic_vector(5 downto 0) := conv_std_logic_vector(47, 6); + + constant OpCode_Sub : std_logic_vector(5 downto 0) := conv_std_logic_vector(49, 6); + constant OpCode_Loadb : std_logic_vector(5 downto 0) := conv_std_logic_vector(51, 6); + constant OpCode_Storeb : std_logic_vector(5 downto 0) := conv_std_logic_vector(52, 6); + + constant OpCode_Eqbranch : std_logic_vector(5 downto 0) := conv_std_logic_vector(55, 6); + constant OpCode_Neqbranch : std_logic_vector(5 downto 0) := conv_std_logic_vector(56, 6); + constant OpCode_Poppcrel : std_logic_vector(5 downto 0) := conv_std_logic_vector(57, 6); + + constant OpCode_Pushspadd : std_logic_vector(5 downto 0) := conv_std_logic_vector(61, 6); + constant OpCode_Mult16x16 : std_logic_vector(5 downto 0) := conv_std_logic_vector(62, 6); + constant OpCode_Callpcrel : std_logic_vector(5 downto 0) := conv_std_logic_vector(63, 6); + + + + constant OpCode_Size : integer := 8; + + + +end zpupkg; -- cgit v1.1 From 4a419c5aa7ef974279042ebfba2aed2adab197db Mon Sep 17 00:00:00 2001 From: oharboe Date: Thu, 21 Feb 2008 18:59:45 +0000 Subject: * zpu/zpu/hdl/index.html. Sharpened instructions and shows two working examples. Small & medium ZPU. * got zpu4/src/simzpu_medium.do working again. --- zpu/hdl/zpu4/src/dram_hello.vhd | 5167 ++++++++++++++++----------------- zpu/hdl/zpu4/src/fasthello.do | 19 + zpu/hdl/zpu4/src/io.vhd | 23 +- zpu/hdl/zpu4/src/log.txt | 139 +- zpu/hdl/zpu4/src/sim_fpga_top.vhd | 11 +- zpu/hdl/zpu4/src/simzpu.do | 23 - zpu/hdl/zpu4/src/simzpu_intstack.do | 23 - zpu/hdl/zpu4/src/simzpu_medium.do | 28 + zpu/hdl/zpu4/src/zpu_config_trace.vhd | 6 +- zpu/hdl/zpu4/src/zpu_core.vhd | 4 +- zpu/hdl/zpu4/src/zpu_core_small.vhd | 13 + zpu/hdl/zpu4/src/zpuio.vhd | 32 +- zpu/hdl/zpu4/src/zpupkg.vhd | 11 - 13 files changed, 2650 insertions(+), 2849 deletions(-) create mode 100644 zpu/hdl/zpu4/src/fasthello.do delete mode 100644 zpu/hdl/zpu4/src/simzpu.do delete mode 100644 zpu/hdl/zpu4/src/simzpu_intstack.do create mode 100644 zpu/hdl/zpu4/src/simzpu_medium.do (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/dram_hello.vhd b/zpu/hdl/zpu4/src/dram_hello.vhd index dc46dbb..3f7788a 100644 --- a/zpu/hdl/zpu4/src/dram_hello.vhd +++ b/zpu/hdl/zpu4/src/dram_hello.vhd @@ -9,6 +9,7 @@ use work.zpupkg.all; entity dram is port (clk : in std_logic; +areset : std_logic; mem_writeEnable : in std_logic; mem_readEnable : in std_logic; mem_addr : in std_logic_vector(maxAddrBit downto 0); @@ -21,21 +22,21 @@ end dram; architecture dram_arch of dram is -type ram_type is array(0 to ((2**(maxAddrBit+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); +type ram_type is array(0 to ((2**(maxAddrBitDRAM+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); shared variable ram : ram_type := ( 0 => x"0b0b0b0b", -1 => x"80700b0b", -2 => x"80d3900c", +1 => x"82700b0b", +2 => x"80cfd80c", 3 => x"3a0b0b80", -4 => x"c8b20400", +4 => x"c6d00400", 5 => x"00000000", 6 => x"00000000", 7 => x"00000000", 8 => x"80088408", 9 => x"88080b0b", -10 => x"80c8fb2d", +10 => x"80c7972d", 11 => x"880c840c", 12 => x"800c0400", 13 => x"00000000", @@ -186,8 +187,8 @@ shared variable ram : ram_type := 158 => x"00000000", 159 => x"00000000", 160 => x"71fc0608", -161 => x"0b0b80d2", -162 => x"fc738306", +161 => x"0b0b80cf", +162 => x"c4738306", 163 => x"10100508", 164 => x"060b0b0b", 165 => x"88aa0400", @@ -195,16 +196,16 @@ shared variable ram : ram_type := 167 => x"00000000", 168 => x"80088408", 169 => x"88087575", -170 => x"0b0b0b8d", -171 => x"872d5050", +170 => x"0b0b0b8b", +171 => x"9f2d5050", 172 => x"80085688", 173 => x"0c840c80", 174 => x"0c510400", 175 => x"00000000", 176 => x"80088408", 177 => x"88087575", -178 => x"0b0b0b8d", -179 => x"cb2d5050", +178 => x"0b0b0b8b", +179 => x"e32d5050", 180 => x"80085688", 181 => x"0c840c80", 182 => x"0c510400", @@ -234,7 +235,7 @@ shared variable ram : ram_type := 206 => x"00000000", 207 => x"00000000", 208 => x"810b0b0b", -209 => x"80d38c0c", +209 => x"80cfd40c", 210 => x"51040000", 211 => x"00000000", 212 => x"00000000", @@ -281,8 +282,8 @@ shared variable ram : ram_type := 253 => x"00000000", 254 => x"00000000", 255 => x"00000000", -256 => x"83d93f80", -257 => x"ca953f04", +256 => x"82c53f80", +257 => x"c6d93f04", 258 => x"10101010", 259 => x"10101010", 260 => x"10101010", @@ -305,2394 +306,2394 @@ shared variable ram : ram_type := 277 => x"0a100a53", 278 => x"72ed3851", 279 => x"51535104", -280 => x"ff3d0d0b", -281 => x"0b80e2f8", -282 => x"08528412", -283 => x"08708106", -284 => x"515170f6", -285 => x"38710881", -286 => x"ff06800c", -287 => x"833d0d04", -288 => x"ff3d0d0b", -289 => x"0b80e2f8", -290 => x"08528412", -291 => x"08700a10", -292 => x"0a708106", -293 => x"51515170", -294 => x"f1387372", -295 => x"0c833d0d", -296 => x"0480d38c", -297 => x"08802ea8", -298 => x"38838080", -299 => x"0b0b0b80", -300 => x"e2f80c82", -301 => x"a0800b0b", -302 => x"0b80e2fc", -303 => x"0c829080", -304 => x"0b80e38c", -305 => x"0c0b0b80", -306 => x"e3800b80", -307 => x"e3900c04", -308 => x"f8808080", -309 => x"a40b0b0b", -310 => x"80e2f80c", -311 => x"f8808082", -312 => x"800b0b0b", -313 => x"80e2fc0c", -314 => x"f8808084", -315 => x"800b80e3", -316 => x"8c0cf880", -317 => x"8080940b", -318 => x"80e3900c", -319 => x"f8808080", -320 => x"9c0b80e3", -321 => x"880cf880", -322 => x"8080a00b", -323 => x"80e3940c", -324 => x"04f23d0d", -325 => x"600b0b80", -326 => x"e2fc0856", -327 => x"5d82750c", -328 => x"8059805a", -329 => x"800b8f3d", -330 => x"71101017", -331 => x"70085957", -332 => x"5d5b8076", -333 => x"81ff067c", -334 => x"832b5658", -335 => x"5276537b", -336 => x"5181fa3f", -337 => x"7d7f7a72", -338 => x"077c7207", -339 => x"71716081", -340 => x"05415f5d", -341 => x"5b595755", -342 => x"7a8724bb", -343 => x"380b0b80", -344 => x"e2fc087b", -345 => x"10101170", -346 => x"08585155", -347 => x"807681ff", -348 => x"067c832b", -349 => x"56585276", -350 => x"537b5181", -351 => x"c03f7d7f", -352 => x"7a72077c", -353 => x"72077171", -354 => x"60810541", -355 => x"5f5d5b59", -356 => x"5755877b", -357 => x"25c73876", -358 => x"7d0c7784", -359 => x"1e0c7c80", -360 => x"0c903d0d", -361 => x"04ff3d0d", -362 => x"80e38433", -363 => x"5170a738", -364 => x"80d39808", -365 => x"70085252", -366 => x"70802e94", -367 => x"38841280", -368 => x"d3980c70", -369 => x"2d80d398", -370 => x"08700852", -371 => x"5270ee38", -372 => x"810b80e3", -373 => x"8434833d", -374 => x"0d040480", -375 => x"3d0d0b0b", -376 => x"80e2f408", -377 => x"802e8e38", -378 => x"0b0b0b0b", -379 => x"800b802e", -380 => x"09810685", -381 => x"38823d0d", -382 => x"040b0b80", -383 => x"e2f4510b", -384 => x"0b0bf3fc", -385 => x"3f823d0d", -386 => x"0404fe3d", -387 => x"0d89530b", -388 => x"0b80d2c8", -389 => x"51838d3f", -390 => x"0b0b80d2", -391 => x"d8518384", -392 => x"3f810a0b", -393 => x"80e3980c", -394 => x"ff0b80e3", -395 => x"9c0cff13", -396 => x"53728025", -397 => x"da387280", -398 => x"0c843d0d", -399 => x"04f93d0d", -400 => x"797b7d7f", -401 => x"56545254", -402 => x"72802ea0", -403 => x"38705771", -404 => x"58a07331", -405 => x"52807225", -406 => x"a1387770", -407 => x"742b5770", -408 => x"732a7875", -409 => x"2b075651", -410 => x"74765351", -411 => x"70740c71", -412 => x"84150c73", -413 => x"800c893d", -414 => x"0d048056", -415 => x"7772302b", -416 => x"55747653", -417 => x"51e639fb", -418 => x"3d0d7779", -419 => x"55558056", -420 => x"757524ab", -421 => x"38807424", -422 => x"9d388053", -423 => x"73527451", -424 => x"80e13f80", -425 => x"08547580", -426 => x"2e853880", -427 => x"08305473", -428 => x"800c873d", -429 => x"0d047330", -430 => x"76813257", -431 => x"54dc3974", -432 => x"30558156", -433 => x"738025d2", -434 => x"38ec39fa", -435 => x"3d0d787a", -436 => x"57558057", -437 => x"767524a4", -438 => x"38759f2c", -439 => x"54815375", -440 => x"74327431", -441 => x"5274519b", -442 => x"3f800854", -443 => x"76802e85", -444 => x"38800830", -445 => x"5473800c", -446 => x"883d0d04", -447 => x"74305581", -448 => x"57d739fc", -449 => x"3d0d7678", -450 => x"53548153", -451 => x"80747326", -452 => x"52557280", -453 => x"2e983870", -454 => x"802eab38", -455 => x"807224a6", -456 => x"38711073", -457 => x"10757226", -458 => x"53545272", -459 => x"ea387351", -460 => x"78833874", -461 => x"5170800c", -462 => x"863d0d04", -463 => x"720a100a", -464 => x"720a100a", -465 => x"53537280", -466 => x"2ee43871", -467 => x"7426ed38", -468 => x"73723175", -469 => x"7407740a", -470 => x"100a740a", -471 => x"100a5555", -472 => x"5654e339", -473 => x"f73d0d7c", -474 => x"70525380", -475 => x"f93f7254", -476 => x"80085580", -477 => x"d2e85681", -478 => x"57800881", -479 => x"055a8b3d", -480 => x"e4115953", -481 => x"8259f413", -482 => x"527b8811", -483 => x"08525381", -484 => x"b03f8008", -485 => x"30708008", -486 => x"079f2c8a", -487 => x"07800c53", -488 => x"8b3d0d04", -489 => x"f63d0d7c", -490 => x"80d39c08", -491 => x"71535553", -492 => x"b53f7255", -493 => x"80085680", -494 => x"d2e85781", -495 => x"58800881", -496 => x"055b8c3d", -497 => x"e4115a53", -498 => x"825af413", -499 => x"52881408", -500 => x"5180ee3f", -501 => x"80083070", -502 => x"8008079f", -503 => x"2c8a0780", -504 => x"0c548c3d", -505 => x"0d04fd3d", -506 => x"0d757071", -507 => x"83065355", -508 => x"5270b438", -509 => x"71700870", -510 => x"09f7fbfd", -511 => x"ff1206f8", -512 => x"84828180", -513 => x"06545253", -514 => x"719b3884", -515 => x"13700870", -516 => x"09f7fbfd", -517 => x"ff1206f8", -518 => x"84828180", -519 => x"06545253", -520 => x"71802ee7", -521 => x"38725271", -522 => x"33537280", -523 => x"2e8a3881", -524 => x"12703354", -525 => x"5272f838", -526 => x"71743180", -527 => x"0c853d0d", -528 => x"04f23d0d", -529 => x"60628811", -530 => x"08705856", -531 => x"5f5a7380", -532 => x"2e818c38", -533 => x"8c1a2270", -534 => x"832a8132", -535 => x"81065658", -536 => x"74863890", -537 => x"1a089138", -538 => x"795190b7", -539 => x"3fff5580", -540 => x"0880ec38", -541 => x"8c1a2258", -542 => x"7d085580", -543 => x"7883ffff", -544 => x"06700a10", -545 => x"0a810641", -546 => x"5c577e77", -547 => x"2e80d738", -548 => x"76903874", -549 => x"08841608", -550 => x"88175758", -551 => x"5676802e", -552 => x"f2387654", -553 => x"88807727", -554 => x"84388880", -555 => x"54735375", -556 => x"529c1a08", -557 => x"51a41a08", -558 => x"58772d80", -559 => x"0b800825", -560 => x"82e03880", -561 => x"08167780", -562 => x"08317f88", -563 => x"05088008", -564 => x"31706188", -565 => x"050c5b58", -566 => x"5678ffb4", -567 => x"38805574", -568 => x"800c903d", -569 => x"0d047a81", -570 => x"32810677", -571 => x"40567580", -572 => x"2e81bd38", -573 => x"76903874", -574 => x"08841608", -575 => x"88175758", -576 => x"5976802e", -577 => x"f238881a", -578 => x"087883ff", -579 => x"ff067089", -580 => x"2a810656", -581 => x"59567380", -582 => x"2e82f838", -583 => x"7577278b", -584 => x"3877872a", -585 => x"81065c7b", -586 => x"82b53876", -587 => x"76278338", -588 => x"76567553", -589 => x"78527908", -590 => x"5185833f", -591 => x"881a0876", -592 => x"31881b0c", -593 => x"7908167a", -594 => x"0c765675", -595 => x"19777731", -596 => x"7f880508", -597 => x"78317061", -598 => x"88050c41", -599 => x"58597e80", -600 => x"2efefa38", -601 => x"8c1a2258", -602 => x"ff8a3978", -603 => x"79547c53", -604 => x"7b525684", -605 => x"c93f881a", -606 => x"08793188", -607 => x"1b0c7908", -608 => x"197a0c7c", -609 => x"76315d7c", -610 => x"8e387951", -611 => x"8ff23f80", -612 => x"08818f38", -613 => x"80085f75", -614 => x"1c777731", -615 => x"7f880508", -616 => x"78317061", -617 => x"88050c5d", -618 => x"585c7a80", -619 => x"2efeae38", -620 => x"76818338", -621 => x"74088416", -622 => x"08881757", -623 => x"585c7680", -624 => x"2ef23876", -625 => x"538a527b", -626 => x"5182d33f", -627 => x"80087c31", -628 => x"81055d80", -629 => x"08843881", -630 => x"175d815f", -631 => x"7c59767d", -632 => x"27833876", -633 => x"59941a08", -634 => x"881b0811", -635 => x"5758807a", -636 => x"085c5490", -637 => x"1a087b27", -638 => x"83388154", -639 => x"75792584", -640 => x"3873ba38", -641 => x"777924fe", -642 => x"e2387753", -643 => x"7b529c1a", -644 => x"0851a41a", -645 => x"0859782d", -646 => x"80085680", -647 => x"088024fe", -648 => x"e2388c1a", -649 => x"2280c007", -650 => x"5e7d8c1b", -651 => x"23ff5574", -652 => x"800c903d", -653 => x"0d047eff", -654 => x"a338ff87", -655 => x"3975537b", -656 => x"527a5182", -657 => x"f93f7908", -658 => x"167a0c79", -659 => x"518eb13f", -660 => x"8008cf38", -661 => x"7c76315d", -662 => x"7cfebc38", -663 => x"feac3990", -664 => x"1a087a08", -665 => x"71317811", -666 => x"70565a57", -667 => x"5280d39c", -668 => x"08518494", -669 => x"3f800880", -670 => x"2effa738", -671 => x"8008901b", -672 => x"0c800816", -673 => x"7a0c7794", -674 => x"1b0c7688", -675 => x"1b0c7656", -676 => x"fd993979", -677 => x"0858901a", -678 => x"08782783", -679 => x"38815475", -680 => x"77278438", -681 => x"73b33894", -682 => x"1a085473", -683 => x"772680d3", -684 => x"38735378", -685 => x"529c1a08", -686 => x"51a41a08", -687 => x"58772d80", -688 => x"08568008", -689 => x"8024fd83", -690 => x"388c1a22", -691 => x"80c0075e", -692 => x"7d8c1b23", -693 => x"ff55fed7", -694 => x"39755378", -695 => x"52775181", -696 => x"dd3f7908", -697 => x"167a0c79", -698 => x"518d953f", -699 => x"8008802e", -700 => x"fcd9388c", -701 => x"1a2280c0", -702 => x"075e7d8c", -703 => x"1b23ff55", -704 => x"fead3976", -705 => x"77547953", -706 => x"78525681", -707 => x"b13f881a", -708 => x"08773188", -709 => x"1b0c7908", -710 => x"177a0cfc", -711 => x"ae39fa3d", -712 => x"0d7a7902", -713 => x"8805a705", -714 => x"33555354", -715 => x"83742780", -716 => x"df387183", -717 => x"06517080", -718 => x"d7387171", -719 => x"57558351", -720 => x"75828029", -721 => x"13ff1252", -722 => x"56708025", -723 => x"f3388374", -724 => x"27bc3874", -725 => x"08763270", -726 => x"09f7fbfd", -727 => x"ff1206f8", -728 => x"84828180", -729 => x"06515170", -730 => x"802e9838", -731 => x"74518052", -732 => x"70335772", -733 => x"772eb938", -734 => x"81118113", -735 => x"53518372", -736 => x"27ee38fc", -737 => x"14841656", -738 => x"54738326", -739 => x"c6387452", -740 => x"ff145170", -741 => x"ff2e9738", -742 => x"71335472", -743 => x"742e9838", -744 => x"8112ff12", -745 => x"525270ff", -746 => x"2e098106", -747 => x"eb388051", -748 => x"70800c88", -749 => x"3d0d0471", -750 => x"800c883d", -751 => x"0d04fa3d", -752 => x"0d787a7c", -753 => x"72727259", -754 => x"57555856", -755 => x"57747727", -756 => x"b2387515", -757 => x"51767127", -758 => x"aa387076", -759 => x"18ff1853", -760 => x"535370ff", -761 => x"2e9638ff", -762 => x"12ff1454", -763 => x"52723372", -764 => x"34ff1151", -765 => x"70ff2e09", -766 => x"8106ec38", -767 => x"76800c88", -768 => x"3d0d048f", -769 => x"762780e6", -770 => x"38747707", -771 => x"83065170", -772 => x"80dc3876", -773 => x"75525370", -774 => x"70840552", -775 => x"08737084", -776 => x"05550c72", -777 => x"71708405", -778 => x"53087170", -779 => x"8405530c", -780 => x"71708405", -781 => x"53087170", -782 => x"8405530c", -783 => x"71708405", -784 => x"53087170", -785 => x"8405530c", -786 => x"f0155553", -787 => x"738f26c7", -788 => x"38837427", -789 => x"95387070", -790 => x"84055208", -791 => x"73708405", -792 => x"550cfc14", -793 => x"54738326", -794 => x"ed387271", -795 => x"5452ff14", -796 => x"5170ff2e", -797 => x"ff863872", -798 => x"70810554", -799 => x"33727081", -800 => x"055434ff", -801 => x"1151ea39", -802 => x"ef3d0d63", -803 => x"6567405d", -804 => x"427b802e", -805 => x"85823861", -806 => x"51a9eb3f", -807 => x"f81c7084", -808 => x"120870fc", -809 => x"0670628b", -810 => x"0570f806", -811 => x"4159455c", -812 => x"5f415796", -813 => x"742782c5", -814 => x"38807b24", -815 => x"7e7c2607", -816 => x"58805477", -817 => x"742e0981", -818 => x"0682ab38", -819 => x"787b2581", -820 => x"fe387817", -821 => x"80dad80b", -822 => x"8805085b", -823 => x"5679762e", -824 => x"84c53884", -825 => x"160870fe", -826 => x"06178411", -827 => x"08810641", -828 => x"55557e82", -829 => x"8d3874fc", -830 => x"06587976", -831 => x"2e84e338", -832 => x"78185f7e", -833 => x"7b2581ff", -834 => x"387c8106", -835 => x"547382c1", -836 => x"38767708", -837 => x"31841108", -838 => x"fc065657", -839 => x"75802e91", -840 => x"3879762e", -841 => x"84f03874", -842 => x"18195877", -843 => x"7b258491", -844 => x"3876802e", -845 => x"829b3878", -846 => x"15567a76", -847 => x"24829238", -848 => x"8c170888", -849 => x"1808718c", -850 => x"120c8812", -851 => x"0c5e7559", -852 => x"881761fc", -853 => x"055b5679", -854 => x"a42685ff", -855 => x"387b7659", -856 => x"55937a27", -857 => x"80c9387b", -858 => x"7084055d", -859 => x"087c5676", -860 => x"0c747084", -861 => x"0556088c", -862 => x"180c9017", -863 => x"589b7a27", -864 => x"ae387470", -865 => x"84055608", -866 => x"780c7470", -867 => x"84055608", -868 => x"94180c98", -869 => x"1758a37a", -870 => x"27953874", -871 => x"70840556", -872 => x"08780c74", -873 => x"70840556", -874 => x"089c180c", -875 => x"a0175874", -876 => x"70840556", -877 => x"08755f78", -878 => x"7084055a", -879 => x"0c777e70", -880 => x"84054008", -881 => x"71708405", -882 => x"530c7e08", -883 => x"710c5d78", -884 => x"7b315675", -885 => x"8f2680c9", -886 => x"38841708", -887 => x"81067907", -888 => x"84180c78", -889 => x"17841108", -890 => x"81078412", -891 => x"0c5b6151", -892 => x"a7953f88", -893 => x"17547380", -894 => x"0c933d0d", -895 => x"04905bfd", -896 => x"b8397756", -897 => x"fe83398c", -898 => x"16088817", -899 => x"08718c12", -900 => x"0c88120c", -901 => x"587e707c", -902 => x"3157598f", -903 => x"7627ffb9", -904 => x"387a1784", -905 => x"18088106", -906 => x"7c078419", -907 => x"0c768107", -908 => x"84120c76", -909 => x"11841108", -910 => x"81078412", -911 => x"0c5b8805", -912 => x"5261518f", -913 => x"de3f6151", -914 => x"a6bd3f88", -915 => x"1754ffa6", -916 => x"397d5261", -917 => x"5197db3f", -918 => x"80085a80", -919 => x"08802e81", -920 => x"ab388008", -921 => x"f8056084", -922 => x"0508fe06", -923 => x"61055855", -924 => x"74772e83", -925 => x"f238fc19", -926 => x"5877a426", -927 => x"81b0387b", -928 => x"80085657", -929 => x"93782780", -930 => x"dc387b70", -931 => x"70840552", -932 => x"08800870", -933 => x"8405800c", -934 => x"0c800871", -935 => x"70840553", -936 => x"085d567b", -937 => x"76708405", -938 => x"580c579b", -939 => x"7827b638", -940 => x"76708405", -941 => x"58087570", -942 => x"8405570c", -943 => x"76708405", -944 => x"58087570", -945 => x"8405570c", -946 => x"a3782799", -947 => x"38767084", -948 => x"05580875", -949 => x"70840557", -950 => x"0c767084", -951 => x"05580875", -952 => x"70840557", -953 => x"0c767084", -954 => x"05580877", -955 => x"5e757084", -956 => x"05570c74", -957 => x"7d708405", -958 => x"5f087170", -959 => x"8405530c", -960 => x"7d08710c", -961 => x"5f7b5261", -962 => x"518e983f", -963 => x"6151a4f7", -964 => x"3f79800c", -965 => x"933d0d04", -966 => x"7d526151", -967 => x"96943f80", -968 => x"08800c93", -969 => x"3d0d0484", -970 => x"160855fb", -971 => x"c9397753", -972 => x"7b528008", -973 => x"51a2a93f", -974 => x"7b526151", -975 => x"8de53fcc", -976 => x"398c1608", -977 => x"88170871", -978 => x"8c120c88", -979 => x"120c5d8c", -980 => x"17088818", -981 => x"08718c12", -982 => x"0c88120c", -983 => x"597759fb", -984 => x"ef397818", -985 => x"901c4055", -986 => x"7e7524fb", -987 => x"9c387a17", -988 => x"7080dad8", -989 => x"0b88050c", -990 => x"757c3181", -991 => x"0784120c", -992 => x"56841708", -993 => x"81067b07", -994 => x"84180c61", -995 => x"51a3f83f", -996 => x"881754fc", -997 => x"e1397418", -998 => x"19901c5e", -999 => x"5a7c7a24", -1000 => x"fb8f388c", -1001 => x"17088818", -1002 => x"08718c12", -1003 => x"0c88120c", -1004 => x"5e881761", -1005 => x"fc055759", -1006 => x"75a42681", -1007 => x"b6387b79", -1008 => x"59559376", -1009 => x"2780c938", -1010 => x"7b708405", -1011 => x"5d087c56", -1012 => x"790c7470", -1013 => x"84055608", -1014 => x"8c180c90", -1015 => x"17589b76", -1016 => x"27ae3874", -1017 => x"70840556", -1018 => x"08780c74", -1019 => x"70840556", -1020 => x"0894180c", -1021 => x"981758a3", -1022 => x"76279538", -1023 => x"74708405", -1024 => x"5608780c", -1025 => x"74708405", -1026 => x"56089c18", -1027 => x"0ca01758", -1028 => x"74708405", -1029 => x"56087541", -1030 => x"78708405", -1031 => x"5a0c7760", -1032 => x"70840542", -1033 => x"08717084", -1034 => x"05530c60", -1035 => x"08710c5e", -1036 => x"7a177080", -1037 => x"dad80b88", -1038 => x"050c7a7c", -1039 => x"31810784", -1040 => x"120c5884", -1041 => x"17088106", -1042 => x"7b078418", -1043 => x"0c6151a2", -1044 => x"b63f7854", -1045 => x"73800c93", -1046 => x"3d0d0479", -1047 => x"537b5275", -1048 => x"519ffd3f", -1049 => x"fae93984", -1050 => x"1508fc06", -1051 => x"19605859", -1052 => x"fadd3975", -1053 => x"537b5278", -1054 => x"519fe53f", -1055 => x"7a177080", -1056 => x"dad80b88", -1057 => x"050c7a7c", -1058 => x"31810784", -1059 => x"120c5884", -1060 => x"17088106", -1061 => x"7b078418", -1062 => x"0c6151a1", -1063 => x"ea3f7854", -1064 => x"ffb239fa", -1065 => x"3d0d7880", -1066 => x"d39c0854", -1067 => x"55b81308", -1068 => x"802e81af", -1069 => x"388c1522", -1070 => x"7083ffff", -1071 => x"0670832a", -1072 => x"81328106", -1073 => x"55555672", -1074 => x"802e80da", -1075 => x"3873842a", -1076 => x"81328106", -1077 => x"57ff5376", -1078 => x"80f23873", -1079 => x"822a8106", -1080 => x"5473802e", -1081 => x"b938b015", -1082 => x"08547380", -1083 => x"2e9c3880", -1084 => x"c0155373", -1085 => x"732e8f38", -1086 => x"735280d3", -1087 => x"9c08518a", -1088 => x"a23f8c15", -1089 => x"225676b0", -1090 => x"160c75db", -1091 => x"0657768c", -1092 => x"1623800b", -1093 => x"84160c90", -1094 => x"1508750c", -1095 => x"76567588", -1096 => x"0754738c", -1097 => x"16239015", -1098 => x"08802ebf", -1099 => x"388c1522", -1100 => x"70810655", -1101 => x"53739c38", -1102 => x"720a100a", -1103 => x"81065675", -1104 => x"85389415", -1105 => x"08547388", -1106 => x"160c8053", -1107 => x"72800c88", -1108 => x"3d0d0480", -1109 => x"0b88160c", -1110 => x"94150830", -1111 => x"98160c80", -1112 => x"53ea3972", -1113 => x"5182a63f", -1114 => x"fecb3974", -1115 => x"518fc03f", -1116 => x"8c152270", -1117 => x"81065553", -1118 => x"73802eff", -1119 => x"bb38d439", -1120 => x"f83d0d7a", -1121 => x"5776802e", -1122 => x"81973880", -1123 => x"d39c0854", -1124 => x"b8140880", -1125 => x"2e80eb38", -1126 => x"8c172270", -1127 => x"902b7090", -1128 => x"2c70832a", -1129 => x"81328106", -1130 => x"5b5b5755", -1131 => x"7780cb38", -1132 => x"90170856", -1133 => x"75802e80", -1134 => x"c1387608", -1135 => x"76317678", -1136 => x"0c798306", -1137 => x"55557385", -1138 => x"38941708", -1139 => x"58778818", -1140 => x"0c807525", -1141 => x"a5387453", -1142 => x"75529c17", -1143 => x"0851a417", -1144 => x"0854732d", -1145 => x"800b8008", -1146 => x"2580c938", -1147 => x"80081675", -1148 => x"80083156", -1149 => x"56748024", -1150 => x"dd38800b", -1151 => x"800c8a3d", -1152 => x"0d047351", -1153 => x"81873f8c", -1154 => x"17227090", -1155 => x"2b70902c", -1156 => x"70832a81", -1157 => x"3281065b", -1158 => x"5b575577", -1159 => x"dd38ff90", -1160 => x"39a38052", -1161 => x"80d39c08", -1162 => x"518cd43f", -1163 => x"8008800c", -1164 => x"8a3d0d04", -1165 => x"8c172280", -1166 => x"c0075877", -1167 => x"8c1823ff", -1168 => x"0b800c8a", -1169 => x"3d0d04fa", -1170 => x"3d0d7970", -1171 => x"80dc298c", -1172 => x"11547a53", -1173 => x"56578fda", -1174 => x"3f800880", -1175 => x"08555680", -1176 => x"08802ea2", -1177 => x"3880088c", -1178 => x"0554800b", -1179 => x"80080c76", -1180 => x"80088405", -1181 => x"0c738008", -1182 => x"88050c74", -1183 => x"53805273", -1184 => x"519cf93f", -1185 => x"75547380", -1186 => x"0c883d0d", -1187 => x"04fe3d0d", -1188 => x"74aacc0b", -1189 => x"bc120c53", -1190 => x"810bb814", -1191 => x"0c800b84", -1192 => x"dc140c83", -1193 => x"0b84e014", -1194 => x"0c84e813", -1195 => x"84e4140c", -1196 => x"84130851", -1197 => x"8070720c", -1198 => x"7084130c", -1199 => x"7088130c", -1200 => x"52840b8c", -1201 => x"1223718e", -1202 => x"12237190", -1203 => x"120c7194", -1204 => x"120c7198", -1205 => x"120c709c", -1206 => x"120c80c3", -1207 => x"bc0ba012", -1208 => x"0c80c488", -1209 => x"0ba4120c", -1210 => x"80c5840b", -1211 => x"a8120c80", -1212 => x"c5d50bac", -1213 => x"120c8813", -1214 => x"0872710c", -1215 => x"7284120c", -1216 => x"7288120c", -1217 => x"51890b8c", -1218 => x"1223810b", -1219 => x"8e122371", -1220 => x"90120c71", -1221 => x"94120c71", -1222 => x"98120c70", -1223 => x"9c120c80", -1224 => x"c3bc0ba0", -1225 => x"120c80c4", -1226 => x"880ba412", -1227 => x"0c80c584", -1228 => x"0ba8120c", -1229 => x"80c5d50b", -1230 => x"ac120c8c", -1231 => x"13087271", -1232 => x"0c728412", -1233 => x"0c728812", -1234 => x"0c518a0b", -1235 => x"8c122382", -1236 => x"0b8e1223", -1237 => x"7190120c", -1238 => x"7194120c", -1239 => x"7198120c", -1240 => x"709c120c", -1241 => x"80c3bc0b", -1242 => x"a0120c80", -1243 => x"c4880ba4", -1244 => x"120c80c5", -1245 => x"840ba812", -1246 => x"0c80c5d5", -1247 => x"0bac120c", -1248 => x"843d0d04", -1249 => x"f83d0d7a", -1250 => x"80d39c08", -1251 => x"b8110857", -1252 => x"57587481", -1253 => x"ec38aacc", -1254 => x"0bbc170c", -1255 => x"810bb817", -1256 => x"0c7484dc", -1257 => x"170c830b", -1258 => x"84e0170c", -1259 => x"84e81684", -1260 => x"e4170c84", -1261 => x"16087571", -1262 => x"0c758412", -1263 => x"0c758812", -1264 => x"0c59840b", -1265 => x"8c1a2374", -1266 => x"8e1a2374", -1267 => x"901a0c74", -1268 => x"941a0c74", -1269 => x"981a0c78", -1270 => x"9c1a0c80", -1271 => x"c3bc0ba0", -1272 => x"1a0c80c4", -1273 => x"880ba41a", -1274 => x"0c80c584", -1275 => x"0ba81a0c", -1276 => x"80c5d50b", -1277 => x"ac1a0c88", -1278 => x"16087571", -1279 => x"0c758412", -1280 => x"0c758812", -1281 => x"0c57890b", -1282 => x"8c182381", -1283 => x"0b8e1823", -1284 => x"7490180c", -1285 => x"7494180c", -1286 => x"7498180c", -1287 => x"769c180c", -1288 => x"80c3bc0b", -1289 => x"a0180c80", -1290 => x"c4880ba4", -1291 => x"180c80c5", -1292 => x"840ba818", -1293 => x"0c80c5d5", -1294 => x"0bac180c", -1295 => x"8c160875", -1296 => x"710c7584", -1297 => x"120c7588", -1298 => x"120c548a", -1299 => x"0b8c1523", -1300 => x"820b8e15", -1301 => x"23749015", -1302 => x"0c749415", -1303 => x"0c749815", -1304 => x"0c739c15", -1305 => x"0c80c3bc", -1306 => x"0ba0150c", -1307 => x"80c4880b", -1308 => x"a4150c80", -1309 => x"c5840ba8", -1310 => x"150c80c5", -1311 => x"d50bac15", -1312 => x"0c84dc16", -1313 => x"88110884", -1314 => x"1208ff05", -1315 => x"57575780", -1316 => x"75249f38", -1317 => x"8c162270", -1318 => x"902b7090", -1319 => x"2c515559", -1320 => x"73802e80", -1321 => x"ed3880dc", -1322 => x"16ff1656", -1323 => x"56748025", -1324 => x"e3387608", -1325 => x"5574802e", -1326 => x"8f387488", -1327 => x"11088412", -1328 => x"08ff0557", -1329 => x"5757c839", -1330 => x"82fc5277", -1331 => x"518ae33f", -1332 => x"80088008", -1333 => x"55568008", -1334 => x"802ea338", -1335 => x"80088c05", -1336 => x"7580080c", -1337 => x"54840b80", -1338 => x"0884050c", -1339 => x"73800888", -1340 => x"050c82f0", -1341 => x"53745273", -1342 => x"5198813f", -1343 => x"75547374", -1344 => x"780c5573", -1345 => x"ffb4388c", -1346 => x"780c800b", -1347 => x"800c8a3d", -1348 => x"0d04810b", -1349 => x"8c172373", -1350 => x"760c7388", -1351 => x"170c7384", -1352 => x"170c7390", -1353 => x"170c7394", -1354 => x"170c7398", -1355 => x"170cff0b", -1356 => x"8e172373", -1357 => x"b0170c73", -1358 => x"b4170c73", -1359 => x"80c4170c", -1360 => x"7380c817", -1361 => x"0c75800c", -1362 => x"8a3d0d04", -1363 => x"ff3d0da3", -1364 => x"80527351", -1365 => x"86a93f83", -1366 => x"3d0d04ff", -1367 => x"3d0da380", -1368 => x"5280d39c", -1369 => x"08518697", -1370 => x"3f833d0d", -1371 => x"04fb3d0d", -1372 => x"77705256", -1373 => x"98903f80", -1374 => x"dad80b88", -1375 => x"05088411", -1376 => x"08fc0670", -1377 => x"7b319fef", -1378 => x"05e08006", -1379 => x"e0800552", -1380 => x"5555a080", -1381 => x"75249438", -1382 => x"80527551", -1383 => x"97ea3f80", -1384 => x"dae00814", -1385 => x"53728008", -1386 => x"2e8f3875", -1387 => x"5197d83f", -1388 => x"80537280", -1389 => x"0c873d0d", -1390 => x"04743052", -1391 => x"755197c8", -1392 => x"3f8008ff", -1393 => x"2ea83880", -1394 => x"dad80b88", -1395 => x"05087476", -1396 => x"31810784", -1397 => x"120c5380", -1398 => x"da9c0875", -1399 => x"3180da9c", -1400 => x"0c755197", -1401 => x"a23f810b", -1402 => x"800c873d", -1403 => x"0d048052", -1404 => x"75519794", -1405 => x"3f80dad8", -1406 => x"0b880508", -1407 => x"80087131", -1408 => x"54548f73", -1409 => x"25ffa438", -1410 => x"800880da", -1411 => x"cc083180", -1412 => x"da9c0c72", -1413 => x"81078415", -1414 => x"0c755196", -1415 => x"ea3f8053", -1416 => x"ff9039f7", -1417 => x"3d0d7b7d", -1418 => x"545a7280", -1419 => x"2e828338", -1420 => x"795196d2", -1421 => x"3ff81384", -1422 => x"110870fe", -1423 => x"06701384", -1424 => x"1108fc06", -1425 => x"5c575854", -1426 => x"5780dae0", -1427 => x"08742e82", -1428 => x"de387784", -1429 => x"150c8073", -1430 => x"81065659", -1431 => x"74792e81", -1432 => x"d5387714", -1433 => x"84110881", -1434 => x"06565374", -1435 => x"a0387716", -1436 => x"567881e6", -1437 => x"38881408", -1438 => x"557480da", -1439 => x"e02e82f9", -1440 => x"388c1408", -1441 => x"708c170c", -1442 => x"7588120c", -1443 => x"58758107", -1444 => x"84180c75", -1445 => x"1776710c", -1446 => x"54788191", -1447 => x"3883ff76", -1448 => x"2781c838", -1449 => x"75892a76", -1450 => x"832a5454", -1451 => x"73802ebf", -1452 => x"3875862a", -1453 => x"b8055384", -1454 => x"7427b438", -1455 => x"80db1453", -1456 => x"947427ab", -1457 => x"38758c2a", -1458 => x"80ee0553", -1459 => x"80d47427", -1460 => x"9e38758f", -1461 => x"2a80f705", -1462 => x"5382d474", -1463 => x"27913875", -1464 => x"922a80fc", -1465 => x"05538ad4", -1466 => x"74278438", -1467 => x"80fe5372", -1468 => x"10101080", -1469 => x"dad80588", -1470 => x"11085555", -1471 => x"73752e82", -1472 => x"bf388414", -1473 => x"08fc0659", -1474 => x"7579278d", -1475 => x"38881408", -1476 => x"5473752e", -1477 => x"098106ea", -1478 => x"388c1408", -1479 => x"708c190c", -1480 => x"7488190c", -1481 => x"7788120c", -1482 => x"55768c15", -1483 => x"0c795194", -1484 => x"d63f8b3d", -1485 => x"0d047608", -1486 => x"77713158", -1487 => x"76058818", -1488 => x"08565674", -1489 => x"80dae02e", -1490 => x"80e0388c", -1491 => x"1708708c", -1492 => x"170c7588", -1493 => x"120c53fe", -1494 => x"89398814", -1495 => x"088c1508", -1496 => x"708c130c", -1497 => x"5988190c", -1498 => x"fea33975", -1499 => x"832a7054", -1500 => x"54807424", -1501 => x"81983872", -1502 => x"822c8171", -1503 => x"2b80dadc", -1504 => x"080780da", -1505 => x"d80b8405", -1506 => x"0c741010", -1507 => x"1080dad8", -1508 => x"05881108", -1509 => x"718c1b0c", -1510 => x"70881b0c", -1511 => x"7988130c", -1512 => x"565a5576", -1513 => x"8c150cff", -1514 => x"84398159", -1515 => x"fdb43977", -1516 => x"16738106", -1517 => x"54557298", -1518 => x"38760877", -1519 => x"71315875", -1520 => x"058c1808", -1521 => x"88190871", -1522 => x"8c120c88", -1523 => x"120c5555", -1524 => x"74810784", -1525 => x"180c7680", -1526 => x"dad80b88", -1527 => x"050c80da", -1528 => x"d4087526", -1529 => x"fec73880", -1530 => x"dad00852", -1531 => x"7951fafd", -1532 => x"3f795193", -1533 => x"923ffeba", -1534 => x"3981778c", -1535 => x"170c7788", -1536 => x"170c758c", -1537 => x"190c7588", -1538 => x"190c59fd", -1539 => x"80398314", -1540 => x"70822c81", -1541 => x"712b80da", -1542 => x"dc080780", -1543 => x"dad80b84", -1544 => x"050c7510", -1545 => x"101080da", -1546 => x"d8058811", -1547 => x"08718c1c", -1548 => x"0c70881c", -1549 => x"0c7a8813", -1550 => x"0c575b56", -1551 => x"53fee439", -1552 => x"807324a3", -1553 => x"3872822c", -1554 => x"81712b80", -1555 => x"dadc0807", -1556 => x"80dad80b", -1557 => x"84050c58", -1558 => x"748c180c", -1559 => x"7388180c", -1560 => x"7688160c", -1561 => x"fdc33983", -1562 => x"1370822c", -1563 => x"81712b80", -1564 => x"dadc0807", -1565 => x"80dad80b", -1566 => x"84050c59", -1567 => x"53da39f9", -1568 => x"3d0d797b", -1569 => x"5853800b", -1570 => x"80d39c08", -1571 => x"53567272", -1572 => x"2ebc3884", -1573 => x"dc135574", -1574 => x"762eb338", -1575 => x"88150884", -1576 => x"1608ff05", -1577 => x"54548073", -1578 => x"2499388c", -1579 => x"14227090", -1580 => x"2b535871", -1581 => x"80d43880", -1582 => x"dc14ff14", -1583 => x"54547280", -1584 => x"25e93874", -1585 => x"085574d4", -1586 => x"3880d39c", -1587 => x"085284dc", -1588 => x"12557480", -1589 => x"2ead3888", -1590 => x"15088416", -1591 => x"08ff0554", -1592 => x"54807324", -1593 => x"98388c14", -1594 => x"2270902b", -1595 => x"535871ad", -1596 => x"3880dc14", -1597 => x"ff145454", -1598 => x"728025ea", -1599 => x"38740855", -1600 => x"74d53875", -1601 => x"800c893d", -1602 => x"0d047351", -1603 => x"762d7580", -1604 => x"080780dc", -1605 => x"15ff1555", -1606 => x"5556ffa2", -1607 => x"39735176", -1608 => x"2d758008", -1609 => x"0780dc15", -1610 => x"ff155555", -1611 => x"56ca39ea", -1612 => x"3d0d688c", -1613 => x"1122700a", -1614 => x"100a8106", -1615 => x"57585674", -1616 => x"80e4388e", -1617 => x"16227090", -1618 => x"2b70902c", -1619 => x"51555880", -1620 => x"7424b138", -1621 => x"983dc405", -1622 => x"53735280", -1623 => x"d39c0851", -1624 => x"93fb3f80", -1625 => x"0b800824", -1626 => x"97387983", -1627 => x"e0800654", -1628 => x"7380c080", -1629 => x"2e818f38", -1630 => x"73828080", -1631 => x"2e819138", -1632 => x"8c162257", -1633 => x"76908007", -1634 => x"54738c17", -1635 => x"23888052", -1636 => x"80d39c08", -1637 => x"51819b3f", -1638 => x"80089d38", -1639 => x"8c162282", -1640 => x"0755748c", -1641 => x"172380c3", -1642 => x"1670770c", -1643 => x"90170c81", -1644 => x"0b94170c", -1645 => x"983d0d04", -1646 => x"80d39c08", -1647 => x"aacc0bbc", -1648 => x"120c588c", -1649 => x"16228180", -1650 => x"0754738c", -1651 => x"17238008", -1652 => x"760c8008", -1653 => x"90170c88", -1654 => x"800b9417", -1655 => x"0c74802e", -1656 => x"d3388e16", -1657 => x"2270902b", -1658 => x"70902c53", -1659 => x"56549cd0", -1660 => x"3f800880", -1661 => x"2effbd38", -1662 => x"8c162281", -1663 => x"0757768c", -1664 => x"1723983d", -1665 => x"0d04810b", -1666 => x"8c172258", -1667 => x"55fef539", -1668 => x"a8160880", -1669 => x"c5842e09", -1670 => x"8106fee4", -1671 => x"388c1622", -1672 => x"88800754", -1673 => x"738c1723", -1674 => x"88800b80", -1675 => x"cc170cfe", -1676 => x"dc39f43d", -1677 => x"0d7e608b", -1678 => x"1170f806", -1679 => x"5b55555d", -1680 => x"72962683", -1681 => x"38905880", -1682 => x"78247479", -1683 => x"26075580", -1684 => x"5474742e", -1685 => x"09810680", -1686 => x"ca387c51", -1687 => x"8ea83f77", -1688 => x"83f72680", -1689 => x"c5387783", -1690 => x"2a701010", -1691 => x"1080dad8", -1692 => x"058c1108", -1693 => x"58585475", -1694 => x"772e81f0", -1695 => x"38841608", -1696 => x"fc068c17", -1697 => x"08881808", -1698 => x"718c120c", -1699 => x"88120c5b", -1700 => x"76058411", -1701 => x"08810784", -1702 => x"120c537c", -1703 => x"518de83f", -1704 => x"88165473", -1705 => x"800c8e3d", -1706 => x"0d047789", -1707 => x"2a78832a", -1708 => x"58547380", -1709 => x"2ebf3877", -1710 => x"862ab805", -1711 => x"57847427", -1712 => x"b43880db", -1713 => x"14579474", -1714 => x"27ab3877", -1715 => x"8c2a80ee", -1716 => x"055780d4", -1717 => x"74279e38", -1718 => x"778f2a80", -1719 => x"f7055782", -1720 => x"d4742791", -1721 => x"3877922a", -1722 => x"80fc0557", -1723 => x"8ad47427", -1724 => x"843880fe", -1725 => x"57761010", -1726 => x"1080dad8", -1727 => x"058c1108", -1728 => x"56537473", -1729 => x"2ea33884", -1730 => x"1508fc06", -1731 => x"70793155", -1732 => x"56738f24", -1733 => x"88e43873", -1734 => x"802588e6", -1735 => x"388c1508", -1736 => x"5574732e", -1737 => x"098106df", -1738 => x"38811759", -1739 => x"80dae808", -1740 => x"567580da", -1741 => x"e02e82cc", -1742 => x"38841608", -1743 => x"fc067079", -1744 => x"31555573", -1745 => x"8f24bb38", -1746 => x"80dae00b", -1747 => x"80daec0c", -1748 => x"80dae00b", -1749 => x"80dae80c", -1750 => x"80742480", -1751 => x"db387416", -1752 => x"84110881", -1753 => x"0784120c", -1754 => x"53feb039", -1755 => x"88168c11", -1756 => x"08575975", -1757 => x"792e0981", -1758 => x"06fe8238", -1759 => x"821459ff", -1760 => x"ab397716", -1761 => x"78810784", -1762 => x"180c7080", -1763 => x"daec0c70", -1764 => x"80dae80c", -1765 => x"80dae00b", -1766 => x"8c120c8c", -1767 => x"11088812", -1768 => x"0c748107", -1769 => x"84120c74", -1770 => x"0574710c", -1771 => x"5b7c518b", -1772 => x"d63f8816", -1773 => x"54fdec39", -1774 => x"83ff7527", -1775 => x"83913874", -1776 => x"892a7583", -1777 => x"2a545473", -1778 => x"802ebf38", -1779 => x"74862ab8", -1780 => x"05538474", -1781 => x"27b43880", -1782 => x"db145394", -1783 => x"7427ab38", -1784 => x"748c2a80", -1785 => x"ee055380", -1786 => x"d474279e", -1787 => x"38748f2a", -1788 => x"80f70553", -1789 => x"82d47427", -1790 => x"91387492", -1791 => x"2a80fc05", -1792 => x"538ad474", -1793 => x"27843880", -1794 => x"fe537210", -1795 => x"101080da", -1796 => x"d8058811", -1797 => x"08555773", -1798 => x"772e868b", -1799 => x"38841408", -1800 => x"fc065b74", -1801 => x"7b278d38", -1802 => x"88140854", -1803 => x"73772e09", -1804 => x"8106ea38", -1805 => x"8c140880", -1806 => x"dad80b84", -1807 => x"0508718c", -1808 => x"190c7588", -1809 => x"190c7788", -1810 => x"130c5c57", -1811 => x"758c150c", -1812 => x"78538079", -1813 => x"24839838", -1814 => x"72822c81", -1815 => x"712b5656", -1816 => x"747b2680", -1817 => x"ca387a75", -1818 => x"06577682", -1819 => x"a33878fc", -1820 => x"06840559", -1821 => x"7410707c", -1822 => x"06555573", -1823 => x"82923884", -1824 => x"1959f139", -1825 => x"80dad80b", -1826 => x"84050879", -1827 => x"545b7880", -1828 => x"25c63882", -1829 => x"da397409", -1830 => x"7b067080", -1831 => x"dad80b84", -1832 => x"050c5b74", -1833 => x"1055747b", -1834 => x"26853874", -1835 => x"85bc3880", -1836 => x"dad80b88", -1837 => x"05087084", -1838 => x"1208fc06", -1839 => x"707b317b", -1840 => x"72268f72", -1841 => x"25075d57", -1842 => x"5c5c5578", -1843 => x"802e80d9", -1844 => x"38791580", -1845 => x"dad00819", -1846 => x"90115954", -1847 => x"5680dacc", -1848 => x"08ff2e88", -1849 => x"38a08f13", -1850 => x"e0800657", -1851 => x"76527c51", -1852 => x"89963f80", -1853 => x"08548008", -1854 => x"ff2e9038", -1855 => x"80087627", -1856 => x"82a73874", -1857 => x"80dad82e", -1858 => x"829f3880", -1859 => x"dad80b88", -1860 => x"05085584", -1861 => x"1508fc06", -1862 => x"70793179", -1863 => x"72268f72", -1864 => x"25075d55", -1865 => x"5a7a83f2", -1866 => x"38778107", -1867 => x"84160c77", -1868 => x"157080da", -1869 => x"d80b8805", -1870 => x"0c748107", -1871 => x"84120c56", -1872 => x"7c5188c3", -1873 => x"3f881554", -1874 => x"73800c8e", -1875 => x"3d0d0474", -1876 => x"832a7054", -1877 => x"54807424", -1878 => x"819b3872", -1879 => x"822c8171", -1880 => x"2b80dadc", -1881 => x"08077080", -1882 => x"dad80b84", -1883 => x"050c7510", -1884 => x"101080da", -1885 => x"d8058811", -1886 => x"08718c1b", -1887 => x"0c70881b", -1888 => x"0c798813", -1889 => x"0c57555c", -1890 => x"55758c15", -1891 => x"0cfdc139", -1892 => x"78791010", -1893 => x"1080dad8", -1894 => x"0570565b", -1895 => x"5c8c1408", -1896 => x"5675742e", -1897 => x"a3388416", -1898 => x"08fc0670", -1899 => x"79315853", -1900 => x"768f2483", -1901 => x"f1387680", -1902 => x"2584af38", -1903 => x"8c160856", -1904 => x"75742e09", -1905 => x"8106df38", -1906 => x"8814811a", -1907 => x"70830655", -1908 => x"5a5472c9", -1909 => x"387b8306", -1910 => x"5675802e", -1911 => x"fdb838ff", -1912 => x"1cf81b5b", -1913 => x"5c881a08", -1914 => x"7a2eea38", -1915 => x"fdb53983", -1916 => x"1953fce4", -1917 => x"39831470", -1918 => x"822c8171", -1919 => x"2b80dadc", -1920 => x"08077080", -1921 => x"dad80b84", -1922 => x"050c7610", -1923 => x"101080da", -1924 => x"d8058811", -1925 => x"08718c1c", -1926 => x"0c70881c", -1927 => x"0c7a8813", -1928 => x"0c58535d", -1929 => x"5653fee1", -1930 => x"3980da9c", -1931 => x"08175980", -1932 => x"08762e81", -1933 => x"8b3880da", -1934 => x"cc08ff2e", -1935 => x"848e3873", -1936 => x"76311980", -1937 => x"da9c0c73", -1938 => x"87067056", -1939 => x"5372802e", -1940 => x"88388873", -1941 => x"31701555", -1942 => x"5576149f", -1943 => x"ff06a080", -1944 => x"71311670", -1945 => x"547e5351", -1946 => x"53869d3f", -1947 => x"80085680", -1948 => x"08ff2e81", -1949 => x"9e3880da", -1950 => x"9c081370", -1951 => x"80da9c0c", -1952 => x"747580da", -1953 => x"d80b8805", -1954 => x"0c777631", -1955 => x"15810755", -1956 => x"56597a80", -1957 => x"dad82e83", -1958 => x"c038798f", -1959 => x"2682ef38", -1960 => x"810b8415", -1961 => x"0c841508", -1962 => x"fc067079", -1963 => x"31797226", -1964 => x"8f722507", -1965 => x"5d555a7a", -1966 => x"802efced", -1967 => x"3880db39", -1968 => x"80089fff", -1969 => x"065574fe", -1970 => x"ed387880", -1971 => x"da9c0c80", -1972 => x"dad80b88", -1973 => x"05087a18", -1974 => x"81078412", -1975 => x"0c5580da", -1976 => x"c8087927", -1977 => x"86387880", -1978 => x"dac80c80", -1979 => x"dac40879", -1980 => x"27fca038", -1981 => x"7880dac4", -1982 => x"0c841508", -1983 => x"fc067079", -1984 => x"31797226", -1985 => x"8f722507", -1986 => x"5d555a7a", -1987 => x"802efc99", -1988 => x"38883980", -1989 => x"745753fe", -1990 => x"dd397c51", -1991 => x"84e93f80", -1992 => x"0b800c8e", -1993 => x"3d0d0480", -1994 => x"7324a538", -1995 => x"72822c81", -1996 => x"712b80da", -1997 => x"dc080770", -1998 => x"80dad80b", -1999 => x"84050c5c", -2000 => x"5a768c17", -2001 => x"0c738817", -2002 => x"0c758818", -2003 => x"0cf9fd39", -2004 => x"83137082", -2005 => x"2c81712b", -2006 => x"80dadc08", -2007 => x"077080da", -2008 => x"d80b8405", -2009 => x"0c5d5b53", -2010 => x"d8397a75", -2011 => x"065c7bfc", -2012 => x"9f388419", -2013 => x"75105659", -2014 => x"f139ff17", -2015 => x"810559f7", -2016 => x"ab398c15", -2017 => x"08881608", -2018 => x"718c120c", -2019 => x"88120c59", -2020 => x"75158411", -2021 => x"08810784", -2022 => x"120c587c", -2023 => x"5183e83f", -2024 => x"881554fb", -2025 => x"a3397716", -2026 => x"78810784", -2027 => x"180c8c17", -2028 => x"08881808", -2029 => x"718c120c", -2030 => x"88120c5c", -2031 => x"7080daec", -2032 => x"0c7080da", -2033 => x"e80c80da", -2034 => x"e00b8c12", -2035 => x"0c8c1108", -2036 => x"88120c77", -2037 => x"81078412", -2038 => x"0c770577", -2039 => x"710c557c", -2040 => x"5183a43f", -2041 => x"881654f5", -2042 => x"ba397216", -2043 => x"84110881", -2044 => x"0784120c", -2045 => x"588c1608", -2046 => x"88170871", -2047 => x"8c120c88", -2048 => x"120c577c", -2049 => x"5183803f", -2050 => x"881654f5", -2051 => x"96397284", -2052 => x"150cf41a", -2053 => x"f8067084", -2054 => x"1d088106", -2055 => x"07841d0c", -2056 => x"701c5556", -2057 => x"850b8415", -2058 => x"0c850b88", -2059 => x"150c8f76", -2060 => x"27fdab38", -2061 => x"881b527c", -2062 => x"51ebe83f", -2063 => x"80dad80b", -2064 => x"88050880", -2065 => x"da9c085a", -2066 => x"55fd9339", -2067 => x"7880da9c", -2068 => x"0c7380da", -2069 => x"cc0cfbef", -2070 => x"39728415", -2071 => x"0cfcff39", -2072 => x"fb3d0d77", -2073 => x"707a7c58", -2074 => x"5553568f", -2075 => x"752780e6", -2076 => x"38727607", -2077 => x"83065170", -2078 => x"80dc3875", -2079 => x"73525470", -2080 => x"70840552", -2081 => x"08747084", -2082 => x"05560c73", -2083 => x"71708405", -2084 => x"53087170", -2085 => x"8405530c", -2086 => x"71708405", -2087 => x"53087170", -2088 => x"8405530c", -2089 => x"71708405", -2090 => x"53087170", -2091 => x"8405530c", -2092 => x"f0165654", -2093 => x"748f26c7", -2094 => x"38837527", -2095 => x"95387070", -2096 => x"84055208", -2097 => x"74708405", -2098 => x"560cfc15", -2099 => x"55748326", -2100 => x"ed387371", -2101 => x"5452ff15", -2102 => x"5170ff2e", -2103 => x"98387270", -2104 => x"81055433", -2105 => x"72708105", -2106 => x"5434ff11", -2107 => x"5170ff2e", -2108 => x"098106ea", -2109 => x"3875800c", -2110 => x"873d0d04", -2111 => x"fb3d0d77", -2112 => x"7a71028c", -2113 => x"05a30533", -2114 => x"58545456", -2115 => x"83732780", -2116 => x"d4387583", -2117 => x"06517080", -2118 => x"cc387488", -2119 => x"2b750770", -2120 => x"71902b07", -2121 => x"55518f73", -2122 => x"27a73873", -2123 => x"72708405", -2124 => x"540c7174", -2125 => x"71708405", -2126 => x"530c7471", -2127 => x"70840553", -2128 => x"0c747170", -2129 => x"8405530c", -2130 => x"f0145452", -2131 => x"728f26db", -2132 => x"38837327", -2133 => x"90387372", -2134 => x"70840554", -2135 => x"0cfc1353", -2136 => x"728326f2", -2137 => x"38ff1351", -2138 => x"70ff2e93", -2139 => x"38747270", -2140 => x"81055434", -2141 => x"ff115170", -2142 => x"ff2e0981", -2143 => x"06ef3875", -2144 => x"800c873d", -2145 => x"0d040404", -2146 => x"fd3d0d80", -2147 => x"0b80e3a0", -2148 => x"0c765184", -2149 => x"ee3f8008", -2150 => x"538008ff", -2151 => x"2e883872", -2152 => x"800c853d", -2153 => x"0d0480e3", -2154 => x"a0085473", -2155 => x"802ef038", -2156 => x"7574710c", -2157 => x"5272800c", -2158 => x"853d0d04", -2159 => x"f93d0d79", -2160 => x"7c557b54", -2161 => x"8e112270", -2162 => x"902b7090", -2163 => x"2c555780", -2164 => x"d39c0853", -2165 => x"585683f3", -2166 => x"3f800857", -2167 => x"800b8008", -2168 => x"24933880", -2169 => x"d0160880", -2170 => x"080580d0", -2171 => x"170c7680", -2172 => x"0c893d0d", -2173 => x"048c1622", -2174 => x"83dfff06", -2175 => x"55748c17", -2176 => x"2376800c", -2177 => x"893d0d04", -2178 => x"fa3d0d78", -2179 => x"8c112270", -2180 => x"882a7081", -2181 => x"06515758", -2182 => x"5674a938", -2183 => x"8c162283", -2184 => x"dfff0655", -2185 => x"748c1723", -2186 => x"7a547953", -2187 => x"8e162270", -2188 => x"902b7090", -2189 => x"2c545680", -2190 => x"d39c0852", -2191 => x"5681b23f", -2192 => x"883d0d04", -2193 => x"82548053", -2194 => x"8e162270", -2195 => x"902b7090", -2196 => x"2c545680", -2197 => x"d39c0852", -2198 => x"5782b83f", -2199 => x"8c162283", -2200 => x"dfff0655", -2201 => x"748c1723", -2202 => x"7a547953", -2203 => x"8e162270", -2204 => x"902b7090", -2205 => x"2c545680", -2206 => x"d39c0852", -2207 => x"5680f23f", -2208 => x"883d0d04", -2209 => x"f93d0d79", -2210 => x"7c557b54", -2211 => x"8e112270", -2212 => x"902b7090", -2213 => x"2c555780", -2214 => x"d39c0853", -2215 => x"585681f3", -2216 => x"3f800857", -2217 => x"8008ff2e", -2218 => x"99388c16", -2219 => x"22a08007", -2220 => x"55748c17", -2221 => x"23800880", -2222 => x"d0170c76", -2223 => x"800c893d", -2224 => x"0d048c16", -2225 => x"2283dfff", -2226 => x"0655748c", -2227 => x"17237680", -2228 => x"0c893d0d", -2229 => x"04fe3d0d", -2230 => x"748e1122", -2231 => x"70902b70", -2232 => x"902c5551", -2233 => x"515380d3", -2234 => x"9c0851bd", -2235 => x"3f843d0d", -2236 => x"04fb3d0d", -2237 => x"800b80e3", -2238 => x"a00c7a53", -2239 => x"79527851", -2240 => x"82fc3f80", -2241 => x"08558008", -2242 => x"ff2e8838", -2243 => x"74800c87", -2244 => x"3d0d0480", -2245 => x"e3a00856", -2246 => x"75802ef0", -2247 => x"38777671", -2248 => x"0c547480", -2249 => x"0c873d0d", -2250 => x"04fd3d0d", -2251 => x"800b80e3", -2252 => x"a00c7651", -2253 => x"85853f80", -2254 => x"08538008", -2255 => x"ff2e8838", -2256 => x"72800c85", -2257 => x"3d0d0480", -2258 => x"e3a00854", -2259 => x"73802ef0", -2260 => x"38757471", -2261 => x"0c527280", -2262 => x"0c853d0d", -2263 => x"04fc3d0d", -2264 => x"800b80e3", -2265 => x"a00c7852", -2266 => x"775188b8", -2267 => x"3f800854", -2268 => x"8008ff2e", -2269 => x"88387380", -2270 => x"0c863d0d", -2271 => x"0480e3a0", -2272 => x"08557480", -2273 => x"2ef03876", -2274 => x"75710c53", -2275 => x"73800c86", -2276 => x"3d0d04fb", -2277 => x"3d0d800b", -2278 => x"80e3a00c", -2279 => x"7a537952", -2280 => x"78518593", -2281 => x"3f800855", -2282 => x"8008ff2e", -2283 => x"88387480", -2284 => x"0c873d0d", -2285 => x"0480e3a0", -2286 => x"08567580", -2287 => x"2ef03877", -2288 => x"76710c54", -2289 => x"74800c87", -2290 => x"3d0d04fb", -2291 => x"3d0d800b", -2292 => x"80e3a00c", -2293 => x"7a537952", -2294 => x"7851829a", -2295 => x"3f800855", -2296 => x"8008ff2e", -2297 => x"88387480", -2298 => x"0c873d0d", -2299 => x"0480e3a0", -2300 => x"08567580", -2301 => x"2ef03877", -2302 => x"76710c54", -2303 => x"74800c87", -2304 => x"3d0d04fe", -2305 => x"3d0d80e3", -2306 => x"a4085170", -2307 => x"8a3880e3", -2308 => x"ac7080e3", -2309 => x"a40c5174", -2310 => x"1152ff53", -2311 => x"7187fb80", -2312 => x"80268838", -2313 => x"7180e3a4", -2314 => x"0c705372", -2315 => x"800c843d", -2316 => x"0d04fd3d", -2317 => x"0d800b80", -2318 => x"d3900854", -2319 => x"5472812e", -2320 => x"9c387380", -2321 => x"e3a80cc0", -2322 => x"d83fffbf", -2323 => x"b33f80e2", -2324 => x"e0528151", -2325 => x"c3b43f80", -2326 => x"0851889b", -2327 => x"3f7280e3", -2328 => x"a80cc0bd", -2329 => x"3fffbf98", -2330 => x"3f80e2e0", -2331 => x"528151c3", -2332 => x"993f8008", -2333 => x"5188803f", -2334 => x"00ff3900", -2335 => x"ff39f53d", -2336 => x"0d7e6080", -2337 => x"e3a80870", -2338 => x"5b585b5b", -2339 => x"7580c538", -2340 => x"777a25a2", -2341 => x"38771b70", -2342 => x"337081ff", -2343 => x"06585859", -2344 => x"758a2e99", -2345 => x"387681ff", -2346 => x"0651ffbf", -2347 => x"d33f8118", -2348 => x"58797824", -2349 => x"e0387980", -2350 => x"0c8d3d0d", -2351 => x"048d51ff", -2352 => x"bfbe3f78", -2353 => x"337081ff", -2354 => x"065257ff", -2355 => x"bfb23f81", -2356 => x"1858de39", -2357 => x"79557a54", -2358 => x"7d538552", -2359 => x"8d3dfc05", -2360 => x"51ffbede", -2361 => x"3f800856", -2362 => x"87863f7b", -2363 => x"80080c75", -2364 => x"800c8d3d", -2365 => x"0d04f63d", -2366 => x"0d7d7f80", -2367 => x"e3a80870", -2368 => x"5a585a5a", -2369 => x"7580c438", -2370 => x"767925b2", -2371 => x"38761a58", -2372 => x"ffbecd3f", -2373 => x"80087834", -2374 => x"800b8008", -2375 => x"81ff0657", -2376 => x"58758a2e", -2377 => x"a238758d", -2378 => x"32703070", -2379 => x"80257a07", -2380 => x"51515675", -2381 => x"b8388117", -2382 => x"57787724", -2383 => x"d0387656", -2384 => x"75800c8c", -2385 => x"3d0d0481", -2386 => x"58dc3978", -2387 => x"5579547c", -2388 => x"5384528c", -2389 => x"3dfc0551", -2390 => x"ffbde73f", -2391 => x"80085686", -2392 => x"8f3f7a80", -2393 => x"080c7580", -2394 => x"0c8c3d0d", -2395 => x"04811756", -2396 => x"cf39f93d", -2397 => x"0d795780", -2398 => x"e3a80880", -2399 => x"2ead3876", -2400 => x"51c4e33f", -2401 => x"7b567a55", -2402 => x"80088105", -2403 => x"54765382", -2404 => x"52893dfc", -2405 => x"0551ffbd", -2406 => x"a93f8008", -2407 => x"5785d13f", -2408 => x"7780080c", -2409 => x"76800c89", -2410 => x"3d0d0485", -2411 => x"c33f850b", -2412 => x"80080cff", -2413 => x"0b800c89", -2414 => x"3d0d04fb", -2415 => x"3d0d80e3", -2416 => x"a8087056", -2417 => x"54738838", -2418 => x"74800c87", -2419 => x"3d0d0477", -2420 => x"53835287", -2421 => x"3dfc0551", -2422 => x"ffbce73f", -2423 => x"80085485", -2424 => x"8f3f7580", -2425 => x"080c7380", -2426 => x"0c873d0d", -2427 => x"04ff0b80", -2428 => x"0c04fb3d", -2429 => x"0d775580", -2430 => x"e3a80880", -2431 => x"2ea93874", -2432 => x"51c3e33f", -2433 => x"80088105", -2434 => x"54745387", -2435 => x"52873dfc", -2436 => x"0551ffbc", -2437 => x"ad3f8008", -2438 => x"5584d53f", -2439 => x"7580080c", -2440 => x"74800c87", -2441 => x"3d0d0484", -2442 => x"c73f850b", -2443 => x"80080cff", -2444 => x"0b800c87", -2445 => x"3d0d04fa", -2446 => x"3d0d80e3", -2447 => x"a808802e", -2448 => x"a3387a55", -2449 => x"79547853", -2450 => x"8652883d", -2451 => x"fc0551ff", -2452 => x"bbf03f80", -2453 => x"08568498", -2454 => x"3f768008", -2455 => x"0c75800c", -2456 => x"883d0d04", -2457 => x"848a3f9d", -2458 => x"0b80080c", -2459 => x"ff0b800c", -2460 => x"883d0d04", -2461 => x"f73d0d7b", -2462 => x"7d5b59bc", -2463 => x"53805279", -2464 => x"51f4f93f", -2465 => x"80705657", -2466 => x"98567419", -2467 => x"70337078", -2468 => x"2b790781", -2469 => x"18f81a5a", -2470 => x"58595558", -2471 => x"847524ea", -2472 => x"38767a23", -2473 => x"84195880", -2474 => x"70565798", -2475 => x"56741870", -2476 => x"3370782b", -2477 => x"79078118", -2478 => x"f81a5a58", -2479 => x"59515484", -2480 => x"7524ea38", -2481 => x"76821b23", -2482 => x"88195880", -2483 => x"70565798", -2484 => x"56741870", -2485 => x"3370782b", -2486 => x"79078118", -2487 => x"f81a5a58", -2488 => x"59515484", -2489 => x"7524ea38", -2490 => x"76841b0c", -2491 => x"8c195880", -2492 => x"70565798", -2493 => x"56741870", -2494 => x"3370782b", -2495 => x"79078118", -2496 => x"f81a5a58", -2497 => x"59515484", -2498 => x"7524ea38", -2499 => x"76881b23", -2500 => x"90195880", -2501 => x"70565798", -2502 => x"56741870", -2503 => x"3370782b", -2504 => x"79078118", -2505 => x"f81a5a58", -2506 => x"59515484", -2507 => x"7524ea38", -2508 => x"768a1b23", -2509 => x"94195880", -2510 => x"70565798", -2511 => x"56741870", -2512 => x"3370782b", -2513 => x"79078118", -2514 => x"f81a5a58", -2515 => x"59515484", -2516 => x"7524ea38", -2517 => x"768c1b23", -2518 => x"98195880", -2519 => x"70565798", -2520 => x"56741870", -2521 => x"3370782b", -2522 => x"79078118", -2523 => x"f81a5a58", -2524 => x"59515484", -2525 => x"7524ea38", -2526 => x"768e1b23", -2527 => x"9c195880", -2528 => x"705657b8", -2529 => x"56741870", -2530 => x"3370782b", -2531 => x"79078118", -2532 => x"f81a5a58", -2533 => x"595a5488", -2534 => x"7524ea38", -2535 => x"76901b0c", -2536 => x"8b3d0d04", -2537 => x"e93d0d6a", -2538 => x"80e3a808", -2539 => x"57577593", -2540 => x"3880c080", -2541 => x"0b84180c", -2542 => x"75ac180c", -2543 => x"75800c99", -2544 => x"3d0d0489", -2545 => x"3d70556a", -2546 => x"54558a52", -2547 => x"993dffbc", -2548 => x"0551ffb8", -2549 => x"ed3f8008", -2550 => x"77537552", -2551 => x"56fd953f", -2552 => x"818e3f77", -2553 => x"80080c75", -2554 => x"800c993d", -2555 => x"0d04e93d", -2556 => x"0d695780", -2557 => x"e3a80880", -2558 => x"2eb73876", -2559 => x"51ffbfe6", -2560 => x"3f893d70", -2561 => x"56800881", -2562 => x"05557754", -2563 => x"568f5299", -2564 => x"3dffbc05", -2565 => x"51ffb8aa", -2566 => x"3f80086b", -2567 => x"53765257", -2568 => x"fcd23f80", -2569 => x"cb3f7780", -2570 => x"080c7680", -2571 => x"0c993d0d", -2572 => x"04be3f85", -2573 => x"0b80080c", -2574 => x"ff0b800c", -2575 => x"993d0d04", -2576 => x"fc3d0d81", -2577 => x"5480e3a8", -2578 => x"08883873", -2579 => x"800c863d", -2580 => x"0d047653", -2581 => x"97b95286", -2582 => x"3dfc0551", -2583 => x"ffb7e33f", -2584 => x"8008548c", -2585 => x"3f748008", -2586 => x"0c73800c", -2587 => x"863d0d04", -2588 => x"80d39c08", -2589 => x"800c04f7", -2590 => x"3d0d7b80", -2591 => x"d39c0882", -2592 => x"c811085a", -2593 => x"545a7780", -2594 => x"2e80da38", -2595 => x"81881884", -2596 => x"1908ff05", -2597 => x"81712b59", -2598 => x"55598074", -2599 => x"2480ea38", -2600 => x"807424b5", -2601 => x"3873822b", -2602 => x"78118805", -2603 => x"56568180", -2604 => x"19087706", -2605 => x"5372802e", -2606 => x"b6387816", -2607 => x"70085353", -2608 => x"79517408", -2609 => x"53722dff", -2610 => x"14fc17fc", -2611 => x"1779812c", -2612 => x"5a575754", -2613 => x"738025d6", -2614 => x"38770858", -2615 => x"77ffad38", -2616 => x"80d39c08", -2617 => x"53bc1308", -2618 => x"a5387951", -2619 => x"f78a3f74", -2620 => x"0853722d", -2621 => x"ff14fc17", -2622 => x"fc177981", -2623 => x"2c5a5757", -2624 => x"54738025", -2625 => x"ffa838d1", -2626 => x"398057ff", -2627 => x"93397251", -2628 => x"bc130854", -2629 => x"732d7951", -2630 => x"f6de3fff", -2631 => x"3d0d80e2", -2632 => x"e80bfc05", -2633 => x"70085252", -2634 => x"70ff2e91", -2635 => x"38702dfc", -2636 => x"12700852", -2637 => x"5270ff2e", -2638 => x"098106f1", -2639 => x"38833d0d", -2640 => x"0404ffb8", -2641 => x"e03f0400", -2642 => x"48656c6c", -2643 => x"6f20776f", -2644 => x"726c6420", -2645 => x"310a0000", -2646 => x"48656c6c", -2647 => x"6f20776f", -2648 => x"726c6420", -2649 => x"320a0000", -2650 => x"0a000000", -2651 => x"43000000", -2652 => x"64756d6d", -2653 => x"792e6578", -2654 => x"65000000", -2655 => x"00ffffff", -2656 => x"ff00ffff", -2657 => x"ffff00ff", -2658 => x"ffffff00", +280 => x"fe3d0d0b", +281 => x"0b80dfc0", +282 => x"08538413", +283 => x"0870882a", +284 => x"70810651", +285 => x"52527080", +286 => x"2ef03871", +287 => x"81ff0680", +288 => x"0c843d0d", +289 => x"04ff3d0d", +290 => x"0b0b80df", +291 => x"c0085271", +292 => x"0870882a", +293 => x"81327081", +294 => x"06515151", +295 => x"70f13873", +296 => x"720c833d", +297 => x"0d0480cf", +298 => x"d408802e", +299 => x"a43880cf", +300 => x"d808822e", +301 => x"bd388380", +302 => x"800b0b0b", +303 => x"80dfc00c", +304 => x"82a0800b", +305 => x"80dfc40c", +306 => x"8290800b", +307 => x"80dfc80c", +308 => x"04f88080", +309 => x"80a40b0b", +310 => x"0b80dfc0", +311 => x"0cf88080", +312 => x"82800b80", +313 => x"dfc40cf8", +314 => x"80808480", +315 => x"0b80dfc8", +316 => x"0c0480c0", +317 => x"a8808c0b", +318 => x"0b0b80df", +319 => x"c00c80c0", +320 => x"a880940b", +321 => x"80dfc40c", +322 => x"0b0b80cf", +323 => x"8c0b80df", +324 => x"c80c0470", +325 => x"7080dfcc", +326 => x"335170a7", +327 => x"3880cfe0", +328 => x"08700852", +329 => x"5270802e", +330 => x"94388412", +331 => x"80cfe00c", +332 => x"702d80cf", +333 => x"e0087008", +334 => x"525270ee", +335 => x"38810b80", +336 => x"dfcc3450", +337 => x"50040470", +338 => x"0b0b80df", +339 => x"bc08802e", +340 => x"8e380b0b", +341 => x"0b0b800b", +342 => x"802e0981", +343 => x"06833850", +344 => x"040b0b80", +345 => x"dfbc510b", +346 => x"0b0bf594", +347 => x"3f500404", +348 => x"fe3d0d89", +349 => x"5380cf90", +350 => x"5182c13f", +351 => x"80cfa051", +352 => x"82ba3f81", +353 => x"0a0b80df", +354 => x"d80cff0b", +355 => x"80dfdc0c", +356 => x"ff135372", +357 => x"8025de38", +358 => x"72800c84", +359 => x"3d0d04fb", +360 => x"3d0d7779", +361 => x"55558056", +362 => x"757524ab", +363 => x"38807424", +364 => x"9d388053", +365 => x"73527451", +366 => x"80e13f80", +367 => x"08547580", +368 => x"2e853880", +369 => x"08305473", +370 => x"800c873d", +371 => x"0d047330", +372 => x"76813257", +373 => x"54dc3974", +374 => x"30558156", +375 => x"738025d2", +376 => x"38ec39fa", +377 => x"3d0d787a", +378 => x"57558057", +379 => x"767524a4", +380 => x"38759f2c", +381 => x"54815375", +382 => x"74327431", +383 => x"5274519b", +384 => x"3f800854", +385 => x"76802e85", +386 => x"38800830", +387 => x"5473800c", +388 => x"883d0d04", +389 => x"74305581", +390 => x"57d739fc", +391 => x"3d0d7678", +392 => x"53548153", +393 => x"80747326", +394 => x"52557280", +395 => x"2e983870", +396 => x"802eab38", +397 => x"807224a6", +398 => x"38711073", +399 => x"10757226", +400 => x"53545272", +401 => x"ea387351", +402 => x"78833874", +403 => x"5170800c", +404 => x"863d0d04", +405 => x"720a100a", +406 => x"720a100a", +407 => x"53537280", +408 => x"2ee43871", +409 => x"7426ed38", +410 => x"73723175", +411 => x"7407740a", +412 => x"100a740a", +413 => x"100a5555", +414 => x"5654e339", +415 => x"f73d0d7c", +416 => x"70525380", +417 => x"f93f7254", +418 => x"80085580", +419 => x"cfb05681", +420 => x"57800881", +421 => x"055a8b3d", +422 => x"e4115953", +423 => x"8259f413", +424 => x"527b8811", +425 => x"08525381", +426 => x"b23f8008", +427 => x"30708008", +428 => x"079f2c8a", +429 => x"07800c53", +430 => x"8b3d0d04", +431 => x"f63d0d7c", +432 => x"80cfe408", +433 => x"71535553", +434 => x"b53f7255", +435 => x"80085680", +436 => x"cfb05781", +437 => x"58800881", +438 => x"055b8c3d", +439 => x"e4115a53", +440 => x"825af413", +441 => x"52881408", +442 => x"5180f03f", +443 => x"80083070", +444 => x"8008079f", +445 => x"2c8a0780", +446 => x"0c548c3d", +447 => x"0d047070", +448 => x"70707570", +449 => x"71830653", +450 => x"555270b4", +451 => x"38717008", +452 => x"7009f7fb", +453 => x"fdff1206", +454 => x"f8848281", +455 => x"80065452", +456 => x"53719b38", +457 => x"84137008", +458 => x"7009f7fb", +459 => x"fdff1206", +460 => x"f8848281", +461 => x"80065452", +462 => x"5371802e", +463 => x"e7387252", +464 => x"71335372", +465 => x"802e8a38", +466 => x"81127033", +467 => x"545272f8", +468 => x"38717431", +469 => x"800c5050", +470 => x"505004f2", +471 => x"3d0d6062", +472 => x"88110870", +473 => x"58565f5a", +474 => x"73802e81", +475 => x"8c388c1a", +476 => x"2270832a", +477 => x"81328106", +478 => x"56587486", +479 => x"38901a08", +480 => x"91387951", +481 => x"90b73fff", +482 => x"55800880", +483 => x"ec388c1a", +484 => x"22587d08", +485 => x"55807883", +486 => x"ffff0670", +487 => x"0a100a81", +488 => x"06415c57", +489 => x"7e772e80", +490 => x"d7387690", +491 => x"38740884", +492 => x"16088817", +493 => x"57585676", +494 => x"802ef238", +495 => x"76548880", +496 => x"77278438", +497 => x"88805473", +498 => x"5375529c", +499 => x"1a0851a4", +500 => x"1a085877", +501 => x"2d800b80", +502 => x"082582e0", +503 => x"38800816", +504 => x"77800831", +505 => x"7f880508", +506 => x"80083170", +507 => x"6188050c", +508 => x"5b585678", +509 => x"ffb43880", +510 => x"5574800c", +511 => x"903d0d04", +512 => x"7a813281", +513 => x"06774056", +514 => x"75802e81", +515 => x"bd387690", +516 => x"38740884", +517 => x"16088817", +518 => x"57585976", +519 => x"802ef238", +520 => x"881a0878", +521 => x"83ffff06", +522 => x"70892a81", +523 => x"06565956", +524 => x"73802e82", +525 => x"f8387577", +526 => x"278b3877", +527 => x"872a8106", +528 => x"5c7b82b5", +529 => x"38767627", +530 => x"83387656", +531 => x"75537852", +532 => x"79085185", +533 => x"833f881a", +534 => x"08763188", +535 => x"1b0c7908", +536 => x"167a0c76", +537 => x"56751977", +538 => x"77317f88", +539 => x"05087831", +540 => x"70618805", +541 => x"0c415859", +542 => x"7e802efe", +543 => x"fa388c1a", +544 => x"2258ff8a", +545 => x"39787954", +546 => x"7c537b52", +547 => x"5684c93f", +548 => x"881a0879", +549 => x"31881b0c", +550 => x"7908197a", +551 => x"0c7c7631", +552 => x"5d7c8e38", +553 => x"79518ff2", +554 => x"3f800881", +555 => x"8f388008", +556 => x"5f751c77", +557 => x"77317f88", +558 => x"05087831", +559 => x"70618805", +560 => x"0c5d585c", +561 => x"7a802efe", +562 => x"ae387681", +563 => x"83387408", +564 => x"84160888", +565 => x"1757585c", +566 => x"76802ef2", +567 => x"3876538a", +568 => x"527b5182", +569 => x"d33f8008", +570 => x"7c318105", +571 => x"5d800884", +572 => x"3881175d", +573 => x"815f7c59", +574 => x"767d2783", +575 => x"38765994", +576 => x"1a08881b", +577 => x"08115758", +578 => x"807a085c", +579 => x"54901a08", +580 => x"7b278338", +581 => x"81547579", +582 => x"25843873", +583 => x"ba387779", +584 => x"24fee238", +585 => x"77537b52", +586 => x"9c1a0851", +587 => x"a41a0859", +588 => x"782d8008", +589 => x"56800880", +590 => x"24fee238", +591 => x"8c1a2280", +592 => x"c0075e7d", +593 => x"8c1b23ff", +594 => x"5574800c", +595 => x"903d0d04", +596 => x"7effa338", +597 => x"ff873975", +598 => x"537b527a", +599 => x"5182f93f", +600 => x"7908167a", +601 => x"0c79518e", +602 => x"b13f8008", +603 => x"cf387c76", +604 => x"315d7cfe", +605 => x"bc38feac", +606 => x"39901a08", +607 => x"7a087131", +608 => x"78117056", +609 => x"5a575280", +610 => x"cfe40851", +611 => x"84943f80", +612 => x"08802eff", +613 => x"a7388008", +614 => x"901b0c80", +615 => x"08167a0c", +616 => x"77941b0c", +617 => x"76881b0c", +618 => x"7656fd99", +619 => x"39790858", +620 => x"901a0878", +621 => x"27833881", +622 => x"54757727", +623 => x"843873b3", +624 => x"38941a08", +625 => x"54737726", +626 => x"80d33873", +627 => x"5378529c", +628 => x"1a0851a4", +629 => x"1a085877", +630 => x"2d800856", +631 => x"80088024", +632 => x"fd83388c", +633 => x"1a2280c0", +634 => x"075e7d8c", +635 => x"1b23ff55", +636 => x"fed73975", +637 => x"53785277", +638 => x"5181dd3f", +639 => x"7908167a", +640 => x"0c79518d", +641 => x"953f8008", +642 => x"802efcd9", +643 => x"388c1a22", +644 => x"80c0075e", +645 => x"7d8c1b23", +646 => x"ff55fead", +647 => x"39767754", +648 => x"79537852", +649 => x"5681b13f", +650 => x"881a0877", +651 => x"31881b0c", +652 => x"7908177a", +653 => x"0cfcae39", +654 => x"fa3d0d7a", +655 => x"79028805", +656 => x"a7053355", +657 => x"53548374", +658 => x"2780df38", +659 => x"71830651", +660 => x"7080d738", +661 => x"71715755", +662 => x"83517582", +663 => x"802913ff", +664 => x"12525670", +665 => x"8025f338", +666 => x"837427bc", +667 => x"38740876", +668 => x"327009f7", +669 => x"fbfdff12", +670 => x"06f88482", +671 => x"81800651", +672 => x"5170802e", +673 => x"98387451", +674 => x"80527033", +675 => x"5772772e", +676 => x"b9388111", +677 => x"81135351", +678 => x"837227ee", +679 => x"38fc1484", +680 => x"16565473", +681 => x"8326c638", +682 => x"7452ff14", +683 => x"5170ff2e", +684 => x"97387133", +685 => x"5472742e", +686 => x"98388112", +687 => x"ff125252", +688 => x"70ff2e09", +689 => x"8106eb38", +690 => x"80517080", +691 => x"0c883d0d", +692 => x"0471800c", +693 => x"883d0d04", +694 => x"fa3d0d78", +695 => x"7a7c7272", +696 => x"72595755", +697 => x"58565774", +698 => x"7727b238", +699 => x"75155176", +700 => x"7127aa38", +701 => x"707618ff", +702 => x"18535353", +703 => x"70ff2e96", +704 => x"38ff12ff", +705 => x"14545272", +706 => x"337234ff", +707 => x"115170ff", +708 => x"2e098106", +709 => x"ec387680", +710 => x"0c883d0d", +711 => x"048f7627", +712 => x"80e63874", +713 => x"77078306", +714 => x"517080dc", +715 => x"38767552", +716 => x"53707084", +717 => x"05520873", +718 => x"70840555", +719 => x"0c727170", +720 => x"84055308", +721 => x"71708405", +722 => x"530c7170", +723 => x"84055308", +724 => x"71708405", +725 => x"530c7170", +726 => x"84055308", +727 => x"71708405", +728 => x"530cf015", +729 => x"5553738f", +730 => x"26c73883", +731 => x"74279538", +732 => x"70708405", +733 => x"52087370", +734 => x"8405550c", +735 => x"fc145473", +736 => x"8326ed38", +737 => x"72715452", +738 => x"ff145170", +739 => x"ff2eff86", +740 => x"38727081", +741 => x"05543372", +742 => x"70810554", +743 => x"34ff1151", +744 => x"ea39ef3d", +745 => x"0d636567", +746 => x"405d427b", +747 => x"802e8582", +748 => x"386151a9", +749 => x"e73ff81c", +750 => x"70841208", +751 => x"70fc0670", +752 => x"628b0570", +753 => x"f8064159", +754 => x"455c5f41", +755 => x"57967427", +756 => x"82c53880", +757 => x"7b247e7c", +758 => x"26075880", +759 => x"5477742e", +760 => x"09810682", +761 => x"ab38787b", +762 => x"2581fe38", +763 => x"781780d7", +764 => x"a00b8805", +765 => x"085b5679", +766 => x"762e84c5", +767 => x"38841608", +768 => x"70fe0617", +769 => x"84110881", +770 => x"06415555", +771 => x"7e828d38", +772 => x"74fc0658", +773 => x"79762e84", +774 => x"e3387818", +775 => x"5f7e7b25", +776 => x"81ff387c", +777 => x"81065473", +778 => x"82c13876", +779 => x"77083184", +780 => x"1108fc06", +781 => x"56577580", +782 => x"2e913879", +783 => x"762e84f0", +784 => x"38741819", +785 => x"58777b25", +786 => x"84913876", +787 => x"802e829b", +788 => x"38781556", +789 => x"7a762482", +790 => x"92388c17", +791 => x"08881808", +792 => x"718c120c", +793 => x"88120c5e", +794 => x"75598817", +795 => x"61fc055b", +796 => x"5679a426", +797 => x"85ff387b", +798 => x"76595593", +799 => x"7a2780c9", +800 => x"387b7084", +801 => x"055d087c", +802 => x"56760c74", +803 => x"70840556", +804 => x"088c180c", +805 => x"9017589b", +806 => x"7a27ae38", +807 => x"74708405", +808 => x"5608780c", +809 => x"74708405", +810 => x"56089418", +811 => x"0c981758", +812 => x"a37a2795", +813 => x"38747084", +814 => x"05560878", +815 => x"0c747084", +816 => x"0556089c", +817 => x"180ca017", +818 => x"58747084", +819 => x"05560875", +820 => x"5f787084", +821 => x"055a0c77", +822 => x"7e708405", +823 => x"40087170", +824 => x"8405530c", +825 => x"7e08710c", +826 => x"5d787b31", +827 => x"56758f26", +828 => x"80c93884", +829 => x"17088106", +830 => x"79078418", +831 => x"0c781784", +832 => x"11088107", +833 => x"84120c5b", +834 => x"6151a791", +835 => x"3f881754", +836 => x"73800c93", +837 => x"3d0d0490", +838 => x"5bfdb839", +839 => x"7756fe83", +840 => x"398c1608", +841 => x"88170871", +842 => x"8c120c88", +843 => x"120c587e", +844 => x"707c3157", +845 => x"598f7627", +846 => x"ffb9387a", +847 => x"17841808", +848 => x"81067c07", +849 => x"84190c76", +850 => x"81078412", +851 => x"0c761184", +852 => x"11088107", +853 => x"84120c5b", +854 => x"88055261", +855 => x"518fda3f", +856 => x"6151a6b9", +857 => x"3f881754", +858 => x"ffa6397d", +859 => x"52615197", +860 => x"d73f8008", +861 => x"5a800880", +862 => x"2e81ab38", +863 => x"8008f805", +864 => x"60840508", +865 => x"fe066105", +866 => x"58557477", +867 => x"2e83f238", +868 => x"fc195877", +869 => x"a42681b0", +870 => x"387b8008", +871 => x"56579378", +872 => x"2780dc38", +873 => x"7b707084", +874 => x"05520880", +875 => x"08708405", +876 => x"800c0c80", +877 => x"08717084", +878 => x"0553085d", +879 => x"567b7670", +880 => x"8405580c", +881 => x"579b7827", +882 => x"b6387670", +883 => x"84055808", +884 => x"75708405", +885 => x"570c7670", +886 => x"84055808", +887 => x"75708405", +888 => x"570ca378", +889 => x"27993876", +890 => x"70840558", +891 => x"08757084", +892 => x"05570c76", +893 => x"70840558", +894 => x"08757084", +895 => x"05570c76", +896 => x"70840558", +897 => x"08775e75", +898 => x"70840557", +899 => x"0c747d70", +900 => x"84055f08", +901 => x"71708405", +902 => x"530c7d08", +903 => x"710c5f7b", +904 => x"5261518e", +905 => x"943f6151", +906 => x"a4f33f79", +907 => x"800c933d", +908 => x"0d047d52", +909 => x"61519690", +910 => x"3f800880", +911 => x"0c933d0d", +912 => x"04841608", +913 => x"55fbc939", +914 => x"77537b52", +915 => x"800851a2", +916 => x"a53f7b52", +917 => x"61518de1", +918 => x"3fcc398c", +919 => x"16088817", +920 => x"08718c12", +921 => x"0c88120c", +922 => x"5d8c1708", +923 => x"88180871", +924 => x"8c120c88", +925 => x"120c5977", +926 => x"59fbef39", +927 => x"7818901c", +928 => x"40557e75", +929 => x"24fb9c38", +930 => x"7a177080", +931 => x"d7a00b88", +932 => x"050c757c", +933 => x"31810784", +934 => x"120c5684", +935 => x"17088106", +936 => x"7b078418", +937 => x"0c6151a3", +938 => x"f43f8817", +939 => x"54fce139", +940 => x"74181990", +941 => x"1c5e5a7c", +942 => x"7a24fb8f", +943 => x"388c1708", +944 => x"88180871", +945 => x"8c120c88", +946 => x"120c5e88", +947 => x"1761fc05", +948 => x"575975a4", +949 => x"2681b638", +950 => x"7b795955", +951 => x"93762780", +952 => x"c9387b70", +953 => x"84055d08", +954 => x"7c56790c", +955 => x"74708405", +956 => x"56088c18", +957 => x"0c901758", +958 => x"9b7627ae", +959 => x"38747084", +960 => x"05560878", +961 => x"0c747084", +962 => x"05560894", +963 => x"180c9817", +964 => x"58a37627", +965 => x"95387470", +966 => x"84055608", +967 => x"780c7470", +968 => x"84055608", +969 => x"9c180ca0", +970 => x"17587470", +971 => x"84055608", +972 => x"75417870", +973 => x"84055a0c", +974 => x"77607084", +975 => x"05420871", +976 => x"70840553", +977 => x"0c600871", +978 => x"0c5e7a17", +979 => x"7080d7a0", +980 => x"0b88050c", +981 => x"7a7c3181", +982 => x"0784120c", +983 => x"58841708", +984 => x"81067b07", +985 => x"84180c61", +986 => x"51a2b23f", +987 => x"78547380", +988 => x"0c933d0d", +989 => x"0479537b", +990 => x"5275519f", +991 => x"f93ffae9", +992 => x"39841508", +993 => x"fc061960", +994 => x"5859fadd", +995 => x"3975537b", +996 => x"5278519f", +997 => x"e13f7a17", +998 => x"7080d7a0", +999 => x"0b88050c", +1000 => x"7a7c3181", +1001 => x"0784120c", +1002 => x"58841708", +1003 => x"81067b07", +1004 => x"84180c61", +1005 => x"51a1e63f", +1006 => x"7854ffb2", +1007 => x"39fa3d0d", +1008 => x"7880cfe4", +1009 => x"085455b8", +1010 => x"1308802e", +1011 => x"81af388c", +1012 => x"15227083", +1013 => x"ffff0670", +1014 => x"832a8132", +1015 => x"81065555", +1016 => x"5672802e", +1017 => x"80da3873", +1018 => x"842a8132", +1019 => x"810657ff", +1020 => x"537680f2", +1021 => x"3873822a", +1022 => x"81065473", +1023 => x"802eb938", +1024 => x"b0150854", +1025 => x"73802e9c", +1026 => x"3880c015", +1027 => x"5373732e", +1028 => x"8f387352", +1029 => x"80cfe408", +1030 => x"518a9e3f", +1031 => x"8c152256", +1032 => x"76b0160c", +1033 => x"75db0657", +1034 => x"768c1623", +1035 => x"800b8416", +1036 => x"0c901508", +1037 => x"750c7656", +1038 => x"75880754", +1039 => x"738c1623", +1040 => x"90150880", +1041 => x"2ebf388c", +1042 => x"15227081", +1043 => x"06555373", +1044 => x"9c38720a", +1045 => x"100a8106", +1046 => x"56758538", +1047 => x"94150854", +1048 => x"7388160c", +1049 => x"80537280", +1050 => x"0c883d0d", +1051 => x"04800b88", +1052 => x"160c9415", +1053 => x"08309816", +1054 => x"0c8053ea", +1055 => x"39725182", +1056 => x"a63ffecb", +1057 => x"3974518f", +1058 => x"bc3f8c15", +1059 => x"22708106", +1060 => x"55537380", +1061 => x"2effbb38", +1062 => x"d439f83d", +1063 => x"0d7a5776", +1064 => x"802e8197", +1065 => x"3880cfe4", +1066 => x"0854b814", +1067 => x"08802e80", +1068 => x"eb388c17", +1069 => x"2270902b", +1070 => x"70902c70", +1071 => x"832a8132", +1072 => x"81065b5b", +1073 => x"57557780", +1074 => x"cb389017", +1075 => x"08567580", +1076 => x"2e80c138", +1077 => x"76087631", +1078 => x"76780c79", +1079 => x"83065555", +1080 => x"73853894", +1081 => x"17085877", +1082 => x"88180c80", +1083 => x"7525a538", +1084 => x"74537552", +1085 => x"9c170851", +1086 => x"a4170854", +1087 => x"732d800b", +1088 => x"80082580", +1089 => x"c9388008", +1090 => x"16758008", +1091 => x"31565674", +1092 => x"8024dd38", +1093 => x"800b800c", +1094 => x"8a3d0d04", +1095 => x"73518187", +1096 => x"3f8c1722", +1097 => x"70902b70", +1098 => x"902c7083", +1099 => x"2a813281", +1100 => x"065b5b57", +1101 => x"5577dd38", +1102 => x"ff9039a1", +1103 => x"9a5280cf", +1104 => x"e408518c", +1105 => x"d03f8008", +1106 => x"800c8a3d", +1107 => x"0d048c17", +1108 => x"2280c007", +1109 => x"58778c18", +1110 => x"23ff0b80", +1111 => x"0c8a3d0d", +1112 => x"04fa3d0d", +1113 => x"797080dc", +1114 => x"298c1154", +1115 => x"7a535657", +1116 => x"8fd63f80", +1117 => x"08800855", +1118 => x"56800880", +1119 => x"2ea23880", +1120 => x"088c0554", +1121 => x"800b8008", +1122 => x"0c768008", +1123 => x"84050c73", +1124 => x"80088805", +1125 => x"0c745380", +1126 => x"5273519c", +1127 => x"f53f7554", +1128 => x"73800c88", +1129 => x"3d0d0470", +1130 => x"707074a8", +1131 => x"e60bbc12", +1132 => x"0c53810b", +1133 => x"b8140c80", +1134 => x"0b84dc14", +1135 => x"0c830b84", +1136 => x"e0140c84", +1137 => x"e81384e4", +1138 => x"140c8413", +1139 => x"08518070", +1140 => x"720c7084", +1141 => x"130c7088", +1142 => x"130c5284", +1143 => x"0b8c1223", +1144 => x"718e1223", +1145 => x"7190120c", +1146 => x"7194120c", +1147 => x"7198120c", +1148 => x"709c120c", +1149 => x"80c1d50b", +1150 => x"a0120c80", +1151 => x"c2a10ba4", +1152 => x"120c80c3", +1153 => x"9d0ba812", +1154 => x"0c80c3ee", +1155 => x"0bac120c", +1156 => x"88130872", +1157 => x"710c7284", +1158 => x"120c7288", +1159 => x"120c5189", +1160 => x"0b8c1223", +1161 => x"810b8e12", +1162 => x"23719012", +1163 => x"0c719412", +1164 => x"0c719812", +1165 => x"0c709c12", +1166 => x"0c80c1d5", +1167 => x"0ba0120c", +1168 => x"80c2a10b", +1169 => x"a4120c80", +1170 => x"c39d0ba8", +1171 => x"120c80c3", +1172 => x"ee0bac12", +1173 => x"0c8c1308", +1174 => x"72710c72", +1175 => x"84120c72", +1176 => x"88120c51", +1177 => x"8a0b8c12", +1178 => x"23820b8e", +1179 => x"12237190", +1180 => x"120c7194", +1181 => x"120c7198", +1182 => x"120c709c", +1183 => x"120c80c1", +1184 => x"d50ba012", +1185 => x"0c80c2a1", +1186 => x"0ba4120c", +1187 => x"80c39d0b", +1188 => x"a8120c80", +1189 => x"c3ee0bac", +1190 => x"120c5050", +1191 => x"5004f83d", +1192 => x"0d7a80cf", +1193 => x"e408b811", +1194 => x"08575758", +1195 => x"7481ec38", +1196 => x"a8e60bbc", +1197 => x"170c810b", +1198 => x"b8170c74", +1199 => x"84dc170c", +1200 => x"830b84e0", +1201 => x"170c84e8", +1202 => x"1684e417", +1203 => x"0c841608", +1204 => x"75710c75", +1205 => x"84120c75", +1206 => x"88120c59", +1207 => x"840b8c1a", +1208 => x"23748e1a", +1209 => x"2374901a", +1210 => x"0c74941a", +1211 => x"0c74981a", +1212 => x"0c789c1a", +1213 => x"0c80c1d5", +1214 => x"0ba01a0c", +1215 => x"80c2a10b", +1216 => x"a41a0c80", +1217 => x"c39d0ba8", +1218 => x"1a0c80c3", +1219 => x"ee0bac1a", +1220 => x"0c881608", +1221 => x"75710c75", +1222 => x"84120c75", +1223 => x"88120c57", +1224 => x"890b8c18", +1225 => x"23810b8e", +1226 => x"18237490", +1227 => x"180c7494", +1228 => x"180c7498", +1229 => x"180c769c", +1230 => x"180c80c1", +1231 => x"d50ba018", +1232 => x"0c80c2a1", +1233 => x"0ba4180c", +1234 => x"80c39d0b", +1235 => x"a8180c80", +1236 => x"c3ee0bac", +1237 => x"180c8c16", +1238 => x"0875710c", +1239 => x"7584120c", +1240 => x"7588120c", +1241 => x"548a0b8c", +1242 => x"1523820b", +1243 => x"8e152374", +1244 => x"90150c74", +1245 => x"94150c74", +1246 => x"98150c73", +1247 => x"9c150c80", +1248 => x"c1d50ba0", +1249 => x"150c80c2", +1250 => x"a10ba415", +1251 => x"0c80c39d", +1252 => x"0ba8150c", +1253 => x"80c3ee0b", +1254 => x"ac150c84", +1255 => x"dc168811", +1256 => x"08841208", +1257 => x"ff055757", +1258 => x"57807524", +1259 => x"9f388c16", +1260 => x"2270902b", +1261 => x"70902c51", +1262 => x"55597380", +1263 => x"2e80ed38", +1264 => x"80dc16ff", +1265 => x"16565674", +1266 => x"8025e338", +1267 => x"76085574", +1268 => x"802e8f38", +1269 => x"74881108", +1270 => x"841208ff", +1271 => x"05575757", +1272 => x"c83982fc", +1273 => x"5277518a", +1274 => x"df3f8008", +1275 => x"80085556", +1276 => x"8008802e", +1277 => x"a3388008", +1278 => x"8c057580", +1279 => x"080c5484", +1280 => x"0b800884", +1281 => x"050c7380", +1282 => x"0888050c", +1283 => x"82f05374", +1284 => x"52735197", +1285 => x"fd3f7554", +1286 => x"7374780c", +1287 => x"5573ffb4", +1288 => x"388c780c", +1289 => x"800b800c", +1290 => x"8a3d0d04", +1291 => x"810b8c17", +1292 => x"2373760c", +1293 => x"7388170c", +1294 => x"7384170c", +1295 => x"7390170c", +1296 => x"7394170c", +1297 => x"7398170c", +1298 => x"ff0b8e17", +1299 => x"2373b017", +1300 => x"0c73b417", +1301 => x"0c7380c4", +1302 => x"170c7380", +1303 => x"c8170c75", +1304 => x"800c8a3d", +1305 => x"0d047070", +1306 => x"a19a5273", +1307 => x"5186a63f", +1308 => x"50500470", +1309 => x"70a19a52", +1310 => x"80cfe408", +1311 => x"5186963f", +1312 => x"505004fb", +1313 => x"3d0d7770", +1314 => x"52569890", +1315 => x"3f80d7a0", +1316 => x"0b880508", +1317 => x"841108fc", +1318 => x"06707b31", +1319 => x"9fef05e0", +1320 => x"8006e080", +1321 => x"05525555", +1322 => x"a0807524", +1323 => x"94388052", +1324 => x"755197ea", +1325 => x"3f80d7a8", +1326 => x"08145372", +1327 => x"80082e8f", +1328 => x"38755197", +1329 => x"d83f8053", +1330 => x"72800c87", +1331 => x"3d0d0474", +1332 => x"30527551", +1333 => x"97c83f80", +1334 => x"08ff2ea8", +1335 => x"3880d7a0", +1336 => x"0b880508", +1337 => x"74763181", +1338 => x"0784120c", +1339 => x"5380d6e4", +1340 => x"08753180", +1341 => x"d6e40c75", +1342 => x"5197a23f", +1343 => x"810b800c", +1344 => x"873d0d04", +1345 => x"80527551", +1346 => x"97943f80", +1347 => x"d7a00b88", +1348 => x"05088008", +1349 => x"71315454", +1350 => x"8f7325ff", +1351 => x"a4388008", +1352 => x"80d79408", +1353 => x"3180d6e4", +1354 => x"0c728107", +1355 => x"84150c75", +1356 => x"5196ea3f", +1357 => x"8053ff90", +1358 => x"39f73d0d", +1359 => x"7b7d545a", +1360 => x"72802e82", +1361 => x"83387951", +1362 => x"96d23ff8", +1363 => x"13841108", +1364 => x"70fe0670", +1365 => x"13841108", +1366 => x"fc065c57", +1367 => x"58545780", +1368 => x"d7a80874", +1369 => x"2e82de38", +1370 => x"7784150c", +1371 => x"80738106", +1372 => x"56597479", +1373 => x"2e81d538", +1374 => x"77148411", +1375 => x"08810656", +1376 => x"5374a038", +1377 => x"77165678", +1378 => x"81e63888", +1379 => x"14085574", +1380 => x"80d7a82e", +1381 => x"82f9388c", +1382 => x"1408708c", +1383 => x"170c7588", +1384 => x"120c5875", +1385 => x"81078418", +1386 => x"0c751776", +1387 => x"710c5478", +1388 => x"81913883", +1389 => x"ff762781", +1390 => x"c8387589", +1391 => x"2a76832a", +1392 => x"54547380", +1393 => x"2ebf3875", +1394 => x"862ab805", +1395 => x"53847427", +1396 => x"b43880db", +1397 => x"14539474", +1398 => x"27ab3875", +1399 => x"8c2a80ee", +1400 => x"055380d4", +1401 => x"74279e38", +1402 => x"758f2a80", +1403 => x"f7055382", +1404 => x"d4742791", +1405 => x"3875922a", +1406 => x"80fc0553", +1407 => x"8ad47427", +1408 => x"843880fe", +1409 => x"53721010", +1410 => x"1080d7a0", +1411 => x"05881108", +1412 => x"55557375", +1413 => x"2e82bf38", +1414 => x"841408fc", +1415 => x"06597579", +1416 => x"278d3888", +1417 => x"14085473", +1418 => x"752e0981", +1419 => x"06ea388c", +1420 => x"1408708c", +1421 => x"190c7488", +1422 => x"190c7788", +1423 => x"120c5576", +1424 => x"8c150c79", +1425 => x"5194d63f", +1426 => x"8b3d0d04", +1427 => x"76087771", +1428 => x"31587605", +1429 => x"88180856", +1430 => x"567480d7", +1431 => x"a82e80e0", +1432 => x"388c1708", +1433 => x"708c170c", +1434 => x"7588120c", +1435 => x"53fe8939", +1436 => x"8814088c", +1437 => x"1508708c", +1438 => x"130c5988", +1439 => x"190cfea3", +1440 => x"3975832a", +1441 => x"70545480", +1442 => x"74248198", +1443 => x"3872822c", +1444 => x"81712b80", +1445 => x"d7a40807", +1446 => x"80d7a00b", +1447 => x"84050c74", +1448 => x"10101080", +1449 => x"d7a00588", +1450 => x"1108718c", +1451 => x"1b0c7088", +1452 => x"1b0c7988", +1453 => x"130c565a", +1454 => x"55768c15", +1455 => x"0cff8439", +1456 => x"8159fdb4", +1457 => x"39771673", +1458 => x"81065455", +1459 => x"72983876", +1460 => x"08777131", +1461 => x"5875058c", +1462 => x"18088819", +1463 => x"08718c12", +1464 => x"0c88120c", +1465 => x"55557481", +1466 => x"0784180c", +1467 => x"7680d7a0", +1468 => x"0b88050c", +1469 => x"80d79c08", +1470 => x"7526fec7", +1471 => x"3880d798", +1472 => x"08527951", +1473 => x"fafd3f79", +1474 => x"5193923f", +1475 => x"feba3981", +1476 => x"778c170c", +1477 => x"7788170c", +1478 => x"758c190c", +1479 => x"7588190c", +1480 => x"59fd8039", +1481 => x"83147082", +1482 => x"2c81712b", +1483 => x"80d7a408", +1484 => x"0780d7a0", +1485 => x"0b84050c", +1486 => x"75101010", +1487 => x"80d7a005", +1488 => x"88110871", +1489 => x"8c1c0c70", +1490 => x"881c0c7a", +1491 => x"88130c57", +1492 => x"5b5653fe", +1493 => x"e4398073", +1494 => x"24a33872", +1495 => x"822c8171", +1496 => x"2b80d7a4", +1497 => x"080780d7", +1498 => x"a00b8405", +1499 => x"0c58748c", +1500 => x"180c7388", +1501 => x"180c7688", +1502 => x"160cfdc3", +1503 => x"39831370", +1504 => x"822c8171", +1505 => x"2b80d7a4", +1506 => x"080780d7", +1507 => x"a00b8405", +1508 => x"0c5953da", +1509 => x"39f93d0d", +1510 => x"797b5853", +1511 => x"800b80cf", +1512 => x"e4085356", +1513 => x"72722ebc", +1514 => x"3884dc13", +1515 => x"5574762e", +1516 => x"b3388815", +1517 => x"08841608", +1518 => x"ff055454", +1519 => x"80732499", +1520 => x"388c1422", +1521 => x"70902b53", +1522 => x"587180d4", +1523 => x"3880dc14", +1524 => x"ff145454", +1525 => x"728025e9", +1526 => x"38740855", +1527 => x"74d43880", +1528 => x"cfe40852", +1529 => x"84dc1255", +1530 => x"74802ead", +1531 => x"38881508", +1532 => x"841608ff", +1533 => x"05545480", +1534 => x"73249838", +1535 => x"8c142270", +1536 => x"902b5358", +1537 => x"71ad3880", +1538 => x"dc14ff14", +1539 => x"54547280", +1540 => x"25ea3874", +1541 => x"085574d5", +1542 => x"3875800c", +1543 => x"893d0d04", +1544 => x"7351762d", +1545 => x"75800807", +1546 => x"80dc15ff", +1547 => x"15555556", +1548 => x"ffa23973", +1549 => x"51762d75", +1550 => x"80080780", +1551 => x"dc15ff15", +1552 => x"555556ca", +1553 => x"39ea3d0d", +1554 => x"688c1122", +1555 => x"700a100a", +1556 => x"81065758", +1557 => x"567480e4", +1558 => x"388e1622", +1559 => x"70902b70", +1560 => x"902c5155", +1561 => x"58807424", +1562 => x"b138983d", +1563 => x"c4055373", +1564 => x"5280cfe4", +1565 => x"08519481", +1566 => x"3f800b80", +1567 => x"08249738", +1568 => x"7983e080", +1569 => x"06547380", +1570 => x"c0802e81", +1571 => x"8f387382", +1572 => x"80802e81", +1573 => x"91388c16", +1574 => x"22577690", +1575 => x"80075473", +1576 => x"8c172388", +1577 => x"805280cf", +1578 => x"e4085181", +1579 => x"9b3f8008", +1580 => x"9d388c16", +1581 => x"22820755", +1582 => x"748c1723", +1583 => x"80c31670", +1584 => x"770c9017", +1585 => x"0c810b94", +1586 => x"170c983d", +1587 => x"0d0480cf", +1588 => x"e408a8e6", +1589 => x"0bbc120c", +1590 => x"588c1622", +1591 => x"81800754", +1592 => x"738c1723", +1593 => x"8008760c", +1594 => x"80089017", +1595 => x"0c88800b", +1596 => x"94170c74", +1597 => x"802ed338", +1598 => x"8e162270", +1599 => x"902b7090", +1600 => x"2c535654", +1601 => x"9afe3f80", +1602 => x"08802eff", +1603 => x"bd388c16", +1604 => x"22810757", +1605 => x"768c1723", +1606 => x"983d0d04", +1607 => x"810b8c17", +1608 => x"225855fe", +1609 => x"f539a816", +1610 => x"0880c39d", +1611 => x"2e098106", +1612 => x"fee4388c", +1613 => x"16228880", +1614 => x"0754738c", +1615 => x"17238880", +1616 => x"0b80cc17", +1617 => x"0cfedc39", +1618 => x"f43d0d7e", +1619 => x"608b1170", +1620 => x"f8065b55", +1621 => x"555d7296", +1622 => x"26833890", +1623 => x"58807824", +1624 => x"74792607", +1625 => x"55805474", +1626 => x"742e0981", +1627 => x"0680ca38", +1628 => x"7c518ea8", +1629 => x"3f7783f7", +1630 => x"2680c538", +1631 => x"77832a70", +1632 => x"10101080", +1633 => x"d7a0058c", +1634 => x"11085858", +1635 => x"5475772e", +1636 => x"81f03884", +1637 => x"1608fc06", +1638 => x"8c170888", +1639 => x"1808718c", +1640 => x"120c8812", +1641 => x"0c5b7605", +1642 => x"84110881", +1643 => x"0784120c", +1644 => x"537c518d", +1645 => x"e83f8816", +1646 => x"5473800c", +1647 => x"8e3d0d04", +1648 => x"77892a78", +1649 => x"832a5854", +1650 => x"73802ebf", +1651 => x"3877862a", +1652 => x"b8055784", +1653 => x"7427b438", +1654 => x"80db1457", +1655 => x"947427ab", +1656 => x"38778c2a", +1657 => x"80ee0557", +1658 => x"80d47427", +1659 => x"9e38778f", +1660 => x"2a80f705", +1661 => x"5782d474", +1662 => x"27913877", +1663 => x"922a80fc", +1664 => x"05578ad4", +1665 => x"74278438", +1666 => x"80fe5776", +1667 => x"10101080", +1668 => x"d7a0058c", +1669 => x"11085653", +1670 => x"74732ea3", +1671 => x"38841508", +1672 => x"fc067079", +1673 => x"31555673", +1674 => x"8f2488e4", +1675 => x"38738025", +1676 => x"88e6388c", +1677 => x"15085574", +1678 => x"732e0981", +1679 => x"06df3881", +1680 => x"175980d7", +1681 => x"b0085675", +1682 => x"80d7a82e", +1683 => x"82cc3884", +1684 => x"1608fc06", +1685 => x"70793155", +1686 => x"55738f24", +1687 => x"bb3880d7", +1688 => x"a80b80d7", +1689 => x"b40c80d7", +1690 => x"a80b80d7", +1691 => x"b00c8074", +1692 => x"2480db38", +1693 => x"74168411", +1694 => x"08810784", +1695 => x"120c53fe", +1696 => x"b0398816", +1697 => x"8c110857", +1698 => x"5975792e", +1699 => x"098106fe", +1700 => x"82388214", +1701 => x"59ffab39", +1702 => x"77167881", +1703 => x"0784180c", +1704 => x"7080d7b4", +1705 => x"0c7080d7", +1706 => x"b00c80d7", +1707 => x"a80b8c12", +1708 => x"0c8c1108", +1709 => x"88120c74", +1710 => x"81078412", +1711 => x"0c740574", +1712 => x"710c5b7c", +1713 => x"518bd63f", +1714 => x"881654fd", +1715 => x"ec3983ff", +1716 => x"75278391", +1717 => x"3874892a", +1718 => x"75832a54", +1719 => x"5473802e", +1720 => x"bf387486", +1721 => x"2ab80553", +1722 => x"847427b4", +1723 => x"3880db14", +1724 => x"53947427", +1725 => x"ab38748c", +1726 => x"2a80ee05", +1727 => x"5380d474", +1728 => x"279e3874", +1729 => x"8f2a80f7", +1730 => x"055382d4", +1731 => x"74279138", +1732 => x"74922a80", +1733 => x"fc05538a", +1734 => x"d4742784", +1735 => x"3880fe53", +1736 => x"72101010", +1737 => x"80d7a005", +1738 => x"88110855", +1739 => x"5773772e", +1740 => x"868b3884", +1741 => x"1408fc06", +1742 => x"5b747b27", +1743 => x"8d388814", +1744 => x"08547377", +1745 => x"2e098106", +1746 => x"ea388c14", +1747 => x"0880d7a0", +1748 => x"0b840508", +1749 => x"718c190c", +1750 => x"7588190c", +1751 => x"7788130c", +1752 => x"5c57758c", +1753 => x"150c7853", +1754 => x"80792483", +1755 => x"98387282", +1756 => x"2c81712b", +1757 => x"5656747b", +1758 => x"2680ca38", +1759 => x"7a750657", +1760 => x"7682a338", +1761 => x"78fc0684", +1762 => x"05597410", +1763 => x"707c0655", +1764 => x"55738292", +1765 => x"38841959", +1766 => x"f13980d7", +1767 => x"a00b8405", +1768 => x"0879545b", +1769 => x"788025c6", +1770 => x"3882da39", +1771 => x"74097b06", +1772 => x"7080d7a0", +1773 => x"0b84050c", +1774 => x"5b741055", +1775 => x"747b2685", +1776 => x"387485bc", +1777 => x"3880d7a0", +1778 => x"0b880508", +1779 => x"70841208", +1780 => x"fc06707b", +1781 => x"317b7226", +1782 => x"8f722507", +1783 => x"5d575c5c", +1784 => x"5578802e", +1785 => x"80d93879", +1786 => x"1580d798", +1787 => x"08199011", +1788 => x"59545680", +1789 => x"d79408ff", +1790 => x"2e8838a0", +1791 => x"8f13e080", +1792 => x"06577652", +1793 => x"7c518996", +1794 => x"3f800854", +1795 => x"8008ff2e", +1796 => x"90388008", +1797 => x"762782a7", +1798 => x"387480d7", +1799 => x"a02e829f", +1800 => x"3880d7a0", +1801 => x"0b880508", +1802 => x"55841508", +1803 => x"fc067079", +1804 => x"31797226", +1805 => x"8f722507", +1806 => x"5d555a7a", +1807 => x"83f23877", +1808 => x"81078416", +1809 => x"0c771570", +1810 => x"80d7a00b", +1811 => x"88050c74", +1812 => x"81078412", +1813 => x"0c567c51", +1814 => x"88c33f88", +1815 => x"15547380", +1816 => x"0c8e3d0d", +1817 => x"0474832a", +1818 => x"70545480", +1819 => x"7424819b", +1820 => x"3872822c", +1821 => x"81712b80", +1822 => x"d7a40807", +1823 => x"7080d7a0", +1824 => x"0b84050c", +1825 => x"75101010", +1826 => x"80d7a005", +1827 => x"88110871", +1828 => x"8c1b0c70", +1829 => x"881b0c79", +1830 => x"88130c57", +1831 => x"555c5575", +1832 => x"8c150cfd", +1833 => x"c1397879", +1834 => x"10101080", +1835 => x"d7a00570", +1836 => x"565b5c8c", +1837 => x"14085675", +1838 => x"742ea338", +1839 => x"841608fc", +1840 => x"06707931", +1841 => x"5853768f", +1842 => x"2483f138", +1843 => x"76802584", +1844 => x"af388c16", +1845 => x"08567574", +1846 => x"2e098106", +1847 => x"df388814", +1848 => x"811a7083", +1849 => x"06555a54", +1850 => x"72c9387b", +1851 => x"83065675", +1852 => x"802efdb8", +1853 => x"38ff1cf8", +1854 => x"1b5b5c88", +1855 => x"1a087a2e", +1856 => x"ea38fdb5", +1857 => x"39831953", +1858 => x"fce43983", +1859 => x"1470822c", +1860 => x"81712b80", +1861 => x"d7a40807", +1862 => x"7080d7a0", +1863 => x"0b84050c", +1864 => x"76101010", +1865 => x"80d7a005", +1866 => x"88110871", +1867 => x"8c1c0c70", +1868 => x"881c0c7a", +1869 => x"88130c58", +1870 => x"535d5653", +1871 => x"fee13980", +1872 => x"d6e40817", +1873 => x"59800876", +1874 => x"2e818b38", +1875 => x"80d79408", +1876 => x"ff2e848e", +1877 => x"38737631", +1878 => x"1980d6e4", +1879 => x"0c738706", +1880 => x"70565372", +1881 => x"802e8838", +1882 => x"88733170", +1883 => x"15555576", +1884 => x"149fff06", +1885 => x"a0807131", +1886 => x"1670547e", +1887 => x"53515386", +1888 => x"9d3f8008", +1889 => x"568008ff", +1890 => x"2e819e38", +1891 => x"80d6e408", +1892 => x"137080d6", +1893 => x"e40c7475", +1894 => x"80d7a00b", +1895 => x"88050c77", +1896 => x"76311581", +1897 => x"07555659", +1898 => x"7a80d7a0", +1899 => x"2e83c038", +1900 => x"798f2682", +1901 => x"ef38810b", +1902 => x"84150c84", +1903 => x"1508fc06", +1904 => x"70793179", +1905 => x"72268f72", +1906 => x"25075d55", +1907 => x"5a7a802e", +1908 => x"fced3880", +1909 => x"db398008", +1910 => x"9fff0655", +1911 => x"74feed38", +1912 => x"7880d6e4", +1913 => x"0c80d7a0", +1914 => x"0b880508", +1915 => x"7a188107", +1916 => x"84120c55", +1917 => x"80d79008", +1918 => x"79278638", +1919 => x"7880d790", +1920 => x"0c80d78c", +1921 => x"087927fc", +1922 => x"a0387880", +1923 => x"d78c0c84", +1924 => x"1508fc06", +1925 => x"70793179", +1926 => x"72268f72", +1927 => x"25075d55", +1928 => x"5a7a802e", +1929 => x"fc993888", +1930 => x"39807457", +1931 => x"53fedd39", +1932 => x"7c5184e9", +1933 => x"3f800b80", +1934 => x"0c8e3d0d", +1935 => x"04807324", +1936 => x"a5387282", +1937 => x"2c81712b", +1938 => x"80d7a408", +1939 => x"077080d7", +1940 => x"a00b8405", +1941 => x"0c5c5a76", +1942 => x"8c170c73", +1943 => x"88170c75", +1944 => x"88180cf9", +1945 => x"fd398313", +1946 => x"70822c81", +1947 => x"712b80d7", +1948 => x"a4080770", +1949 => x"80d7a00b", +1950 => x"84050c5d", +1951 => x"5b53d839", +1952 => x"7a75065c", +1953 => x"7bfc9f38", +1954 => x"84197510", +1955 => x"5659f139", +1956 => x"ff178105", +1957 => x"59f7ab39", +1958 => x"8c150888", +1959 => x"1608718c", +1960 => x"120c8812", +1961 => x"0c597515", +1962 => x"84110881", +1963 => x"0784120c", +1964 => x"587c5183", +1965 => x"e83f8815", +1966 => x"54fba339", +1967 => x"77167881", +1968 => x"0784180c", +1969 => x"8c170888", +1970 => x"1808718c", +1971 => x"120c8812", +1972 => x"0c5c7080", +1973 => x"d7b40c70", +1974 => x"80d7b00c", +1975 => x"80d7a80b", +1976 => x"8c120c8c", +1977 => x"11088812", +1978 => x"0c778107", +1979 => x"84120c77", +1980 => x"0577710c", +1981 => x"557c5183", +1982 => x"a43f8816", +1983 => x"54f5ba39", +1984 => x"72168411", +1985 => x"08810784", +1986 => x"120c588c", +1987 => x"16088817", +1988 => x"08718c12", +1989 => x"0c88120c", +1990 => x"577c5183", +1991 => x"803f8816", +1992 => x"54f59639", +1993 => x"7284150c", +1994 => x"f41af806", +1995 => x"70841d08", +1996 => x"81060784", +1997 => x"1d0c701c", +1998 => x"5556850b", +1999 => x"84150c85", +2000 => x"0b88150c", +2001 => x"8f7627fd", +2002 => x"ab38881b", +2003 => x"527c51eb", +2004 => x"e83f80d7", +2005 => x"a00b8805", +2006 => x"0880d6e4", +2007 => x"085a55fd", +2008 => x"93397880", +2009 => x"d6e40c73", +2010 => x"80d7940c", +2011 => x"fbef3972", +2012 => x"84150cfc", +2013 => x"ff39fb3d", +2014 => x"0d77707a", +2015 => x"7c585553", +2016 => x"568f7527", +2017 => x"80e63872", +2018 => x"76078306", +2019 => x"517080dc", +2020 => x"38757352", +2021 => x"54707084", +2022 => x"05520874", +2023 => x"70840556", +2024 => x"0c737170", +2025 => x"84055308", +2026 => x"71708405", +2027 => x"530c7170", +2028 => x"84055308", +2029 => x"71708405", +2030 => x"530c7170", +2031 => x"84055308", +2032 => x"71708405", +2033 => x"530cf016", +2034 => x"5654748f", +2035 => x"26c73883", +2036 => x"75279538", +2037 => x"70708405", +2038 => x"52087470", +2039 => x"8405560c", +2040 => x"fc155574", +2041 => x"8326ed38", +2042 => x"73715452", +2043 => x"ff155170", +2044 => x"ff2e9838", +2045 => x"72708105", +2046 => x"54337270", +2047 => x"81055434", +2048 => x"ff115170", +2049 => x"ff2e0981", +2050 => x"06ea3875", +2051 => x"800c873d", +2052 => x"0d04fb3d", +2053 => x"0d777a71", +2054 => x"028c05a3", +2055 => x"05335854", +2056 => x"54568373", +2057 => x"2780d438", +2058 => x"75830651", +2059 => x"7080cc38", +2060 => x"74882b75", +2061 => x"07707190", +2062 => x"2b075551", +2063 => x"8f7327a7", +2064 => x"38737270", +2065 => x"8405540c", +2066 => x"71747170", +2067 => x"8405530c", +2068 => x"74717084", +2069 => x"05530c74", +2070 => x"71708405", +2071 => x"530cf014", +2072 => x"5452728f", +2073 => x"26db3883", +2074 => x"73279038", +2075 => x"73727084", +2076 => x"05540cfc", +2077 => x"13537283", +2078 => x"26f238ff", +2079 => x"135170ff", +2080 => x"2e933874", +2081 => x"72708105", +2082 => x"5434ff11", +2083 => x"5170ff2e", +2084 => x"098106ef", +2085 => x"3875800c", +2086 => x"873d0d04", +2087 => x"04047070", +2088 => x"7070800b", +2089 => x"80dfe00c", +2090 => x"765184f3", +2091 => x"3f800853", +2092 => x"8008ff2e", +2093 => x"89387280", +2094 => x"0c505050", +2095 => x"500480df", +2096 => x"e0085473", +2097 => x"802eef38", +2098 => x"7574710c", +2099 => x"5272800c", +2100 => x"50505050", +2101 => x"04f93d0d", +2102 => x"797c557b", +2103 => x"548e1122", +2104 => x"70902b70", +2105 => x"902c5557", +2106 => x"80cfe408", +2107 => x"53585683", +2108 => x"f63f8008", +2109 => x"57800b80", +2110 => x"08249338", +2111 => x"80d01608", +2112 => x"80080580", +2113 => x"d0170c76", +2114 => x"800c893d", +2115 => x"0d048c16", +2116 => x"2283dfff", +2117 => x"0655748c", +2118 => x"17237680", +2119 => x"0c893d0d", +2120 => x"04fa3d0d", +2121 => x"788c1122", +2122 => x"70882a70", +2123 => x"81065157", +2124 => x"585674a9", +2125 => x"388c1622", +2126 => x"83dfff06", +2127 => x"55748c17", +2128 => x"237a5479", +2129 => x"538e1622", +2130 => x"70902b70", +2131 => x"902c5456", +2132 => x"80cfe408", +2133 => x"525681b2", +2134 => x"3f883d0d", +2135 => x"04825480", +2136 => x"538e1622", +2137 => x"70902b70", +2138 => x"902c5456", +2139 => x"80cfe408", +2140 => x"525782bb", +2141 => x"3f8c1622", +2142 => x"83dfff06", +2143 => x"55748c17", +2144 => x"237a5479", +2145 => x"538e1622", +2146 => x"70902b70", +2147 => x"902c5456", +2148 => x"80cfe408", +2149 => x"525680f2", +2150 => x"3f883d0d", +2151 => x"04f93d0d", +2152 => x"797c557b", +2153 => x"548e1122", +2154 => x"70902b70", +2155 => x"902c5557", +2156 => x"80cfe408", +2157 => x"53585681", +2158 => x"f63f8008", +2159 => x"578008ff", +2160 => x"2e99388c", +2161 => x"1622a080", +2162 => x"0755748c", +2163 => x"17238008", +2164 => x"80d0170c", +2165 => x"76800c89", +2166 => x"3d0d048c", +2167 => x"162283df", +2168 => x"ff065574", +2169 => x"8c172376", +2170 => x"800c893d", +2171 => x"0d047070", +2172 => x"70748e11", +2173 => x"2270902b", +2174 => x"70902c55", +2175 => x"51515380", +2176 => x"cfe40851", +2177 => x"bd3f5050", +2178 => x"5004fb3d", +2179 => x"0d800b80", +2180 => x"dfe00c7a", +2181 => x"53795278", +2182 => x"5182ff3f", +2183 => x"80085580", +2184 => x"08ff2e88", +2185 => x"3874800c", +2186 => x"873d0d04", +2187 => x"80dfe008", +2188 => x"5675802e", +2189 => x"f0387776", +2190 => x"710c5474", +2191 => x"800c873d", +2192 => x"0d047070", +2193 => x"7070800b", +2194 => x"80dfe00c", +2195 => x"765184cc", +2196 => x"3f800853", +2197 => x"8008ff2e", +2198 => x"89387280", +2199 => x"0c505050", +2200 => x"500480df", +2201 => x"e0085473", +2202 => x"802eef38", +2203 => x"7574710c", +2204 => x"5272800c", +2205 => x"50505050", +2206 => x"04fc3d0d", +2207 => x"800b80df", +2208 => x"e00c7852", +2209 => x"775187b3", +2210 => x"3f800854", +2211 => x"8008ff2e", +2212 => x"88387380", +2213 => x"0c863d0d", +2214 => x"0480dfe0", +2215 => x"08557480", +2216 => x"2ef03876", +2217 => x"75710c53", +2218 => x"73800c86", +2219 => x"3d0d04fb", +2220 => x"3d0d800b", +2221 => x"80dfe00c", +2222 => x"7a537952", +2223 => x"7851848e", +2224 => x"3f800855", +2225 => x"8008ff2e", +2226 => x"88387480", +2227 => x"0c873d0d", +2228 => x"0480dfe0", +2229 => x"08567580", +2230 => x"2ef03877", +2231 => x"76710c54", +2232 => x"74800c87", +2233 => x"3d0d04fb", +2234 => x"3d0d800b", +2235 => x"80dfe00c", +2236 => x"7a537952", +2237 => x"78518296", +2238 => x"3f800855", +2239 => x"8008ff2e", +2240 => x"88387480", +2241 => x"0c873d0d", +2242 => x"0480dfe0", +2243 => x"08567580", +2244 => x"2ef03877", +2245 => x"76710c54", +2246 => x"74800c87", +2247 => x"3d0d0470", +2248 => x"707080df", +2249 => x"d0088938", +2250 => x"80dfe40b", +2251 => x"80dfd00c", +2252 => x"80dfd008", +2253 => x"75115252", +2254 => x"ff537087", +2255 => x"fb808026", +2256 => x"88387080", +2257 => x"dfd00c71", +2258 => x"5372800c", +2259 => x"50505004", +2260 => x"fd3d0d80", +2261 => x"0b80cfd8", +2262 => x"08545472", +2263 => x"812e9b38", +2264 => x"7380dfd4", +2265 => x"0cc2bf3f", +2266 => x"c1963f80", +2267 => x"dfa85281", +2268 => x"51c3fd3f", +2269 => x"80085186", +2270 => x"c23f7280", +2271 => x"dfd40cc2", +2272 => x"a53fc0fc", +2273 => x"3f80dfa8", +2274 => x"528151c3", +2275 => x"e33f8008", +2276 => x"5186a83f", +2277 => x"00ff3900", +2278 => x"ff39f53d", +2279 => x"0d7e6080", +2280 => x"dfd40870", +2281 => x"5b585b5b", +2282 => x"7580c238", +2283 => x"777a25a1", +2284 => x"38771b70", +2285 => x"337081ff", +2286 => x"06585859", +2287 => x"758a2e98", +2288 => x"387681ff", +2289 => x"0651c1bd", +2290 => x"3f811858", +2291 => x"797824e1", +2292 => x"3879800c", +2293 => x"8d3d0d04", +2294 => x"8d51c1a9", +2295 => x"3f783370", +2296 => x"81ff0652", +2297 => x"57c19e3f", +2298 => x"811858e0", +2299 => x"3979557a", +2300 => x"547d5385", +2301 => x"528d3dfc", +2302 => x"0551c0c6", +2303 => x"3f800856", +2304 => x"85b23f7b", +2305 => x"80080c75", +2306 => x"800c8d3d", +2307 => x"0d04f63d", +2308 => x"0d7d7f80", +2309 => x"dfd40870", +2310 => x"5b585a5a", +2311 => x"7580c138", +2312 => x"777925b3", +2313 => x"38c0b93f", +2314 => x"800881ff", +2315 => x"06708d32", +2316 => x"7030709f", +2317 => x"2a515157", +2318 => x"57768a2e", +2319 => x"80c43875", +2320 => x"802ebf38", +2321 => x"771a5676", +2322 => x"76347651", +2323 => x"c0b73f81", +2324 => x"18587878", +2325 => x"24cf3877", +2326 => x"5675800c", +2327 => x"8c3d0d04", +2328 => x"78557954", +2329 => x"7c538452", +2330 => x"8c3dfc05", +2331 => x"51ffbfd2", +2332 => x"3f800856", +2333 => x"84be3f7a", +2334 => x"80080c75", +2335 => x"800c8c3d", +2336 => x"0d04771a", +2337 => x"598a7934", +2338 => x"8118588d", +2339 => x"51ffbff5", +2340 => x"3f8a51ff", +2341 => x"bfef3f77", +2342 => x"56ffbe39", +2343 => x"fb3d0d80", +2344 => x"dfd40870", +2345 => x"56547388", +2346 => x"3874800c", +2347 => x"873d0d04", +2348 => x"77538352", +2349 => x"873dfc05", +2350 => x"51ffbf86", +2351 => x"3f800854", +2352 => x"83f23f75", +2353 => x"80080c73", +2354 => x"800c873d", +2355 => x"0d04fa3d", +2356 => x"0d80dfd4", +2357 => x"08802ea3", +2358 => x"387a5579", +2359 => x"54785386", +2360 => x"52883dfc", +2361 => x"0551ffbe", +2362 => x"d93f8008", +2363 => x"5683c53f", +2364 => x"7680080c", +2365 => x"75800c88", +2366 => x"3d0d0483", +2367 => x"b73f9d0b", +2368 => x"80080cff", +2369 => x"0b800c88", +2370 => x"3d0d04f7", +2371 => x"3d0d7b7d", +2372 => x"5b59bc53", +2373 => x"80527951", +2374 => x"f5f83f80", +2375 => x"70565798", +2376 => x"56741970", +2377 => x"3370782b", +2378 => x"79078118", +2379 => x"f81a5a58", +2380 => x"59555884", +2381 => x"7524ea38", +2382 => x"767a2384", +2383 => x"19588070", +2384 => x"56579856", +2385 => x"74187033", +2386 => x"70782b79", +2387 => x"078118f8", +2388 => x"1a5a5859", +2389 => x"51548475", +2390 => x"24ea3876", +2391 => x"821b2388", +2392 => x"19588070", +2393 => x"56579856", +2394 => x"74187033", +2395 => x"70782b79", +2396 => x"078118f8", +2397 => x"1a5a5859", +2398 => x"51548475", +2399 => x"24ea3876", +2400 => x"841b0c8c", +2401 => x"19588070", +2402 => x"56579856", +2403 => x"74187033", +2404 => x"70782b79", +2405 => x"078118f8", +2406 => x"1a5a5859", +2407 => x"51548475", +2408 => x"24ea3876", +2409 => x"881b2390", +2410 => x"19588070", +2411 => x"56579856", +2412 => x"74187033", +2413 => x"70782b79", +2414 => x"078118f8", +2415 => x"1a5a5859", +2416 => x"51548475", +2417 => x"24ea3876", +2418 => x"8a1b2394", +2419 => x"19588070", +2420 => x"56579856", +2421 => x"74187033", +2422 => x"70782b79", +2423 => x"078118f8", +2424 => x"1a5a5859", +2425 => x"51548475", +2426 => x"24ea3876", +2427 => x"8c1b2398", +2428 => x"19588070", +2429 => x"56579856", +2430 => x"74187033", +2431 => x"70782b79", +2432 => x"078118f8", +2433 => x"1a5a5859", +2434 => x"51548475", +2435 => x"24ea3876", +2436 => x"8e1b239c", +2437 => x"19588070", +2438 => x"5657b856", +2439 => x"74187033", +2440 => x"70782b79", +2441 => x"078118f8", +2442 => x"1a5a5859", +2443 => x"5a548875", +2444 => x"24ea3876", +2445 => x"901b0c8b", +2446 => x"3d0d04e9", +2447 => x"3d0d6a80", +2448 => x"dfd40857", +2449 => x"57759338", +2450 => x"80c0800b", +2451 => x"84180c75", +2452 => x"ac180c75", +2453 => x"800c993d", +2454 => x"0d04893d", +2455 => x"70556a54", +2456 => x"558a5299", +2457 => x"3dffbc05", +2458 => x"51ffbbd6", +2459 => x"3f800877", +2460 => x"53755256", +2461 => x"fd953fbc", +2462 => x"3f778008", +2463 => x"0c75800c", +2464 => x"993d0d04", +2465 => x"fc3d0d81", +2466 => x"5480dfd4", +2467 => x"08883873", +2468 => x"800c863d", +2469 => x"0d047653", +2470 => x"97b95286", +2471 => x"3dfc0551", +2472 => x"ffbb9f3f", +2473 => x"8008548c", +2474 => x"3f748008", +2475 => x"0c73800c", +2476 => x"863d0d04", +2477 => x"80cfe408", +2478 => x"800c04f7", +2479 => x"3d0d7b80", +2480 => x"cfe40882", +2481 => x"c811085a", +2482 => x"545a7780", +2483 => x"2e80da38", +2484 => x"81881884", +2485 => x"1908ff05", +2486 => x"81712b59", +2487 => x"55598074", +2488 => x"2480ea38", +2489 => x"807424b5", +2490 => x"3873822b", +2491 => x"78118805", +2492 => x"56568180", +2493 => x"19087706", +2494 => x"5372802e", +2495 => x"b6387816", +2496 => x"70085353", +2497 => x"79517408", +2498 => x"53722dff", +2499 => x"14fc17fc", +2500 => x"1779812c", +2501 => x"5a575754", +2502 => x"738025d6", +2503 => x"38770858", +2504 => x"77ffad38", +2505 => x"80cfe408", +2506 => x"53bc1308", +2507 => x"a5387951", +2508 => x"f8e23f74", +2509 => x"0853722d", +2510 => x"ff14fc17", +2511 => x"fc177981", +2512 => x"2c5a5757", +2513 => x"54738025", +2514 => x"ffa838d1", +2515 => x"398057ff", +2516 => x"93397251", +2517 => x"bc130854", +2518 => x"732d7951", +2519 => x"f8b63f70", +2520 => x"7080dfb0", +2521 => x"0bfc0570", +2522 => x"08525270", +2523 => x"ff2e9138", +2524 => x"702dfc12", +2525 => x"70085252", +2526 => x"70ff2e09", +2527 => x"8106f138", +2528 => x"50500404", +2529 => x"ffbb8c3f", +2530 => x"04000000", +2531 => x"00000040", +2532 => x"48656c6c", +2533 => x"6f20776f", +2534 => x"726c6420", +2535 => x"310a0000", +2536 => x"48656c6c", +2537 => x"6f20776f", +2538 => x"726c6420", +2539 => x"320a0000", +2540 => x"0a000000", +2541 => x"43000000", +2542 => x"64756d6d", +2543 => x"792e6578", +2544 => x"65000000", +2545 => x"00ffffff", +2546 => x"ff00ffff", +2547 => x"ffff00ff", +2548 => x"ffffff00", +2549 => x"00000000", +2550 => x"00000000", +2551 => x"00000000", +2552 => x"00002fb8", +2553 => x"000027e8", +2554 => x"00000000", +2555 => x"00002a50", +2556 => x"00002aac", +2557 => x"00002b08", +2558 => x"00000000", +2559 => x"00000000", +2560 => x"00000000", +2561 => x"00000000", +2562 => x"00000000", +2563 => x"00000000", +2564 => x"00000000", +2565 => x"00000000", +2566 => x"00000000", +2567 => x"000027b4", +2568 => x"00000000", +2569 => x"00000000", +2570 => x"00000000", +2571 => x"00000000", +2572 => x"00000000", +2573 => x"00000000", +2574 => x"00000000", +2575 => x"00000000", +2576 => x"00000000", +2577 => x"00000000", +2578 => x"00000000", +2579 => x"00000000", +2580 => x"00000000", +2581 => x"00000000", +2582 => x"00000000", +2583 => x"00000000", +2584 => x"00000000", +2585 => x"00000000", +2586 => x"00000000", +2587 => x"00000000", +2588 => x"00000000", +2589 => x"00000000", +2590 => x"00000000", +2591 => x"00000000", +2592 => x"00000000", +2593 => x"00000000", +2594 => x"00000000", +2595 => x"00000000", +2596 => x"00000001", +2597 => x"330eabcd", +2598 => x"1234e66d", +2599 => x"deec0005", +2600 => x"000b0000", +2601 => x"00000000", +2602 => x"00000000", +2603 => x"00000000", +2604 => x"00000000", +2605 => x"00000000", +2606 => x"00000000", +2607 => x"00000000", +2608 => x"00000000", +2609 => x"00000000", +2610 => x"00000000", +2611 => x"00000000", +2612 => x"00000000", +2613 => x"00000000", +2614 => x"00000000", +2615 => x"00000000", +2616 => x"00000000", +2617 => x"00000000", +2618 => x"00000000", +2619 => x"00000000", +2620 => x"00000000", +2621 => x"00000000", +2622 => x"00000000", +2623 => x"00000000", +2624 => x"00000000", +2625 => x"00000000", +2626 => x"00000000", +2627 => x"00000000", +2628 => x"00000000", +2629 => x"00000000", +2630 => x"00000000", +2631 => x"00000000", +2632 => x"00000000", +2633 => x"00000000", +2634 => x"00000000", +2635 => x"00000000", +2636 => x"00000000", +2637 => x"00000000", +2638 => x"00000000", +2639 => x"00000000", +2640 => x"00000000", +2641 => x"00000000", +2642 => x"00000000", +2643 => x"00000000", +2644 => x"00000000", +2645 => x"00000000", +2646 => x"00000000", +2647 => x"00000000", +2648 => x"00000000", +2649 => x"00000000", +2650 => x"00000000", +2651 => x"00000000", +2652 => x"00000000", +2653 => x"00000000", +2654 => x"00000000", +2655 => x"00000000", +2656 => x"00000000", +2657 => x"00000000", +2658 => x"00000000", 2659 => x"00000000", 2660 => x"00000000", 2661 => x"00000000", -2662 => x"00003170", -2663 => x"000029a0", +2662 => x"00000000", +2663 => x"00000000", 2664 => x"00000000", -2665 => x"00002c08", -2666 => x"00002c64", -2667 => x"00002cc0", +2665 => x"00000000", +2666 => x"00000000", +2667 => x"00000000", 2668 => x"00000000", 2669 => x"00000000", 2670 => x"00000000", @@ -2702,7 +2703,7 @@ shared variable ram : ram_type := 2674 => x"00000000", 2675 => x"00000000", 2676 => x"00000000", -2677 => x"0000296c", +2677 => x"00000000", 2678 => x"00000000", 2679 => x"00000000", 2680 => x"00000000", @@ -2731,11 +2732,11 @@ shared variable ram : ram_type := 2703 => x"00000000", 2704 => x"00000000", 2705 => x"00000000", -2706 => x"00000001", -2707 => x"330eabcd", -2708 => x"1234e66d", -2709 => x"deec0005", -2710 => x"000b0000", +2706 => x"00000000", +2707 => x"00000000", +2708 => x"00000000", +2709 => x"00000000", +2710 => x"00000000", 2711 => x"00000000", 2712 => x"00000000", 2713 => x"00000000", @@ -2814,121 +2815,121 @@ shared variable ram : ram_type := 2786 => x"00000000", 2787 => x"00000000", 2788 => x"00000000", -2789 => x"00000000", +2789 => x"ffffffff", 2790 => x"00000000", -2791 => x"00000000", +2791 => x"00020000", 2792 => x"00000000", 2793 => x"00000000", -2794 => x"00000000", -2795 => x"00000000", -2796 => x"00000000", -2797 => x"00000000", -2798 => x"00000000", -2799 => x"00000000", -2800 => x"00000000", -2801 => x"00000000", -2802 => x"00000000", -2803 => x"00000000", -2804 => x"00000000", -2805 => x"00000000", -2806 => x"00000000", -2807 => x"00000000", -2808 => x"00000000", -2809 => x"00000000", -2810 => x"00000000", -2811 => x"00000000", -2812 => x"00000000", -2813 => x"00000000", -2814 => x"00000000", -2815 => x"00000000", -2816 => x"00000000", -2817 => x"00000000", -2818 => x"00000000", -2819 => x"00000000", -2820 => x"00000000", -2821 => x"00000000", -2822 => x"00000000", -2823 => x"00000000", -2824 => x"00000000", -2825 => x"00000000", -2826 => x"00000000", -2827 => x"00000000", -2828 => x"00000000", -2829 => x"00000000", -2830 => x"00000000", -2831 => x"00000000", -2832 => x"00000000", -2833 => x"00000000", -2834 => x"00000000", -2835 => x"00000000", -2836 => x"00000000", -2837 => x"00000000", -2838 => x"00000000", -2839 => x"00000000", -2840 => x"00000000", -2841 => x"00000000", -2842 => x"00000000", -2843 => x"00000000", -2844 => x"00000000", -2845 => x"00000000", -2846 => x"00000000", -2847 => x"00000000", -2848 => x"00000000", -2849 => x"00000000", -2850 => x"00000000", -2851 => x"00000000", -2852 => x"00000000", -2853 => x"00000000", -2854 => x"00000000", -2855 => x"00000000", -2856 => x"00000000", -2857 => x"00000000", -2858 => x"00000000", -2859 => x"00000000", -2860 => x"00000000", -2861 => x"00000000", -2862 => x"00000000", -2863 => x"00000000", -2864 => x"00000000", -2865 => x"00000000", -2866 => x"00000000", -2867 => x"00000000", -2868 => x"00000000", -2869 => x"00000000", -2870 => x"00000000", -2871 => x"00000000", -2872 => x"00000000", -2873 => x"00000000", -2874 => x"00000000", -2875 => x"00000000", -2876 => x"00000000", -2877 => x"00000000", -2878 => x"00000000", -2879 => x"00000000", -2880 => x"00000000", -2881 => x"00000000", -2882 => x"00000000", -2883 => x"00000000", -2884 => x"00000000", -2885 => x"00000000", -2886 => x"00000000", -2887 => x"00000000", -2888 => x"00000000", -2889 => x"00000000", -2890 => x"00000000", -2891 => x"00000000", -2892 => x"00000000", -2893 => x"00000000", -2894 => x"00000000", -2895 => x"00000000", -2896 => x"00000000", -2897 => x"00000000", -2898 => x"00000000", -2899 => x"ffffffff", -2900 => x"00000000", -2901 => x"00020000", -2902 => x"00000000", -2903 => x"00000000", +2794 => x"00002ba0", +2795 => x"00002ba0", +2796 => x"00002ba8", +2797 => x"00002ba8", +2798 => x"00002bb0", +2799 => x"00002bb0", +2800 => x"00002bb8", +2801 => x"00002bb8", +2802 => x"00002bc0", +2803 => x"00002bc0", +2804 => x"00002bc8", +2805 => x"00002bc8", +2806 => x"00002bd0", +2807 => x"00002bd0", +2808 => x"00002bd8", +2809 => x"00002bd8", +2810 => x"00002be0", +2811 => x"00002be0", +2812 => x"00002be8", +2813 => x"00002be8", +2814 => x"00002bf0", +2815 => x"00002bf0", +2816 => x"00002bf8", +2817 => x"00002bf8", +2818 => x"00002c00", +2819 => x"00002c00", +2820 => x"00002c08", +2821 => x"00002c08", +2822 => x"00002c10", +2823 => x"00002c10", +2824 => x"00002c18", +2825 => x"00002c18", +2826 => x"00002c20", +2827 => x"00002c20", +2828 => x"00002c28", +2829 => x"00002c28", +2830 => x"00002c30", +2831 => x"00002c30", +2832 => x"00002c38", +2833 => x"00002c38", +2834 => x"00002c40", +2835 => x"00002c40", +2836 => x"00002c48", +2837 => x"00002c48", +2838 => x"00002c50", +2839 => x"00002c50", +2840 => x"00002c58", +2841 => x"00002c58", +2842 => x"00002c60", +2843 => x"00002c60", +2844 => x"00002c68", +2845 => x"00002c68", +2846 => x"00002c70", +2847 => x"00002c70", +2848 => x"00002c78", +2849 => x"00002c78", +2850 => x"00002c80", +2851 => x"00002c80", +2852 => x"00002c88", +2853 => x"00002c88", +2854 => x"00002c90", +2855 => x"00002c90", +2856 => x"00002c98", +2857 => x"00002c98", +2858 => x"00002ca0", +2859 => x"00002ca0", +2860 => x"00002ca8", +2861 => x"00002ca8", +2862 => x"00002cb0", +2863 => x"00002cb0", +2864 => x"00002cb8", +2865 => x"00002cb8", +2866 => x"00002cc0", +2867 => x"00002cc0", +2868 => x"00002cc8", +2869 => x"00002cc8", +2870 => x"00002cd0", +2871 => x"00002cd0", +2872 => x"00002cd8", +2873 => x"00002cd8", +2874 => x"00002ce0", +2875 => x"00002ce0", +2876 => x"00002ce8", +2877 => x"00002ce8", +2878 => x"00002cf0", +2879 => x"00002cf0", +2880 => x"00002cf8", +2881 => x"00002cf8", +2882 => x"00002d00", +2883 => x"00002d00", +2884 => x"00002d08", +2885 => x"00002d08", +2886 => x"00002d10", +2887 => x"00002d10", +2888 => x"00002d18", +2889 => x"00002d18", +2890 => x"00002d20", +2891 => x"00002d20", +2892 => x"00002d28", +2893 => x"00002d28", +2894 => x"00002d30", +2895 => x"00002d30", +2896 => x"00002d38", +2897 => x"00002d38", +2898 => x"00002d40", +2899 => x"00002d40", +2900 => x"00002d48", +2901 => x"00002d48", +2902 => x"00002d50", +2903 => x"00002d50", 2904 => x"00002d58", 2905 => x"00002d58", 2906 => x"00002d60", @@ -3075,133 +3076,25 @@ shared variable ram : ram_type := 3047 => x"00002f90", 3048 => x"00002f98", 3049 => x"00002f98", -3050 => x"00002fa0", -3051 => x"00002fa0", -3052 => x"00002fa8", -3053 => x"00002fa8", -3054 => x"00002fb0", -3055 => x"00002fb0", -3056 => x"00002fb8", -3057 => x"00002fb8", -3058 => x"00002fc0", -3059 => x"00002fc0", -3060 => x"00002fc8", -3061 => x"00002fc8", -3062 => x"00002fd0", -3063 => x"00002fd0", -3064 => x"00002fd8", -3065 => x"00002fd8", -3066 => x"00002fe0", -3067 => x"00002fe0", -3068 => x"00002fe8", -3069 => x"00002fe8", -3070 => x"00002ff0", -3071 => x"00002ff0", -3072 => x"00002ff8", -3073 => x"00002ff8", -3074 => x"00003000", -3075 => x"00003000", -3076 => x"00003008", -3077 => x"00003008", -3078 => x"00003010", -3079 => x"00003010", -3080 => x"00003018", -3081 => x"00003018", -3082 => x"00003020", -3083 => x"00003020", -3084 => x"00003028", -3085 => x"00003028", -3086 => x"00003030", -3087 => x"00003030", -3088 => x"00003038", -3089 => x"00003038", -3090 => x"00003040", -3091 => x"00003040", -3092 => x"00003048", -3093 => x"00003048", -3094 => x"00003050", -3095 => x"00003050", -3096 => x"00003058", -3097 => x"00003058", -3098 => x"00003060", -3099 => x"00003060", -3100 => x"00003068", -3101 => x"00003068", -3102 => x"00003070", -3103 => x"00003070", -3104 => x"00003078", -3105 => x"00003078", -3106 => x"00003080", -3107 => x"00003080", -3108 => x"00003088", -3109 => x"00003088", -3110 => x"00003090", -3111 => x"00003090", -3112 => x"00003098", -3113 => x"00003098", -3114 => x"000030a0", -3115 => x"000030a0", -3116 => x"000030a8", -3117 => x"000030a8", -3118 => x"000030b0", -3119 => x"000030b0", -3120 => x"000030b8", -3121 => x"000030b8", -3122 => x"000030c0", -3123 => x"000030c0", -3124 => x"000030c8", -3125 => x"000030c8", -3126 => x"000030d0", -3127 => x"000030d0", -3128 => x"000030d8", -3129 => x"000030d8", -3130 => x"000030e0", -3131 => x"000030e0", -3132 => x"000030e8", -3133 => x"000030e8", -3134 => x"000030f0", -3135 => x"000030f0", -3136 => x"000030f8", -3137 => x"000030f8", -3138 => x"00003100", -3139 => x"00003100", -3140 => x"00003108", -3141 => x"00003108", -3142 => x"00003110", -3143 => x"00003110", -3144 => x"00003118", -3145 => x"00003118", -3146 => x"00003120", -3147 => x"00003120", -3148 => x"00003128", -3149 => x"00003128", -3150 => x"00003130", -3151 => x"00003130", -3152 => x"00003138", -3153 => x"00003138", -3154 => x"00003140", -3155 => x"00003140", -3156 => x"00003148", -3157 => x"00003148", -3158 => x"00003150", -3159 => x"00003150", -3160 => x"00002970", -3161 => x"ffffffff", -3162 => x"00000000", -3163 => x"ffffffff", -3164 => x"00000000", +3050 => x"000027b8", +3051 => x"ffffffff", +3052 => x"00000000", +3053 => x"ffffffff", +3054 => x"00000000", others => x"00000000" ); begin -process (clk) +mem_busy<=mem_readEnable; -- we're done on the cycle after we serve the read request + +process (clk, areset) begin - if (clk'event and clk = '1') then - mem_busy<=mem_writeEnable or mem_readEnable; - if (mem_writeEnable = '1') then - ram(conv_integer(mem_addr(maxAddrBit downto minAddrBit))) := mem_write; - end if; + if areset = '1' then + elsif (clk'event and clk = '1') then + if (mem_writeEnable = '1') then + ram(conv_integer(mem_addr(maxAddrBit downto minAddrBit))) := mem_write; + end if; if (mem_readEnable = '1') then mem_read <= ram(conv_integer(mem_addr(maxAddrBit downto minAddrBit))); end if; diff --git a/zpu/hdl/zpu4/src/fasthello.do b/zpu/hdl/zpu4/src/fasthello.do new file mode 100644 index 0000000..d49aeab --- /dev/null +++ b/zpu/hdl/zpu4/src/fasthello.do @@ -0,0 +1,19 @@ +set BreakOnAssertion 1 +vlib work + +vcom -93 -explicit zpu_config_fastsim.vhd +vcom -93 -explicit zpupkg.vhd +vcom -93 -explicit txt_util.vhd +vcom -93 -explicit sim_fpga_top.vhd +vcom -93 -explicit zpu_core.vhd +vcom -93 -explicit dram_hello.vhd +vcom -93 -explicit timer.vhd +vcom -93 -explicit io.vhd +vcom -93 -explicit trace.vhd + + +vsim fpga_top +view wave + +# run ZPU +run 60000 ms diff --git a/zpu/hdl/zpu4/src/io.vhd b/zpu/hdl/zpu4/src/io.vhd index b5465d1..7dbe36f 100644 --- a/zpu/hdl/zpu4/src/io.vhd +++ b/zpu/hdl/zpu4/src/io.vhd @@ -19,8 +19,8 @@ entity zpu_io is busy : out std_logic; writeEnable : in std_logic; readEnable : in std_logic; - write : in std_logic_vector(7 downto 0); - read : out std_logic_vector(7 downto 0); + write : in std_logic_vector(wordSize-1 downto 0); + read : out std_logic_vector(wordSize-1 downto 0); addr : in std_logic_vector(maxAddrBit downto minAddrBit) ); end zpu_io; @@ -45,7 +45,7 @@ begin clk => clk, areset => areset, we => timer_we, - din => write, + din => write(7 downto 0), adr => addr(4 downto 2), dout => timer_read); @@ -60,7 +60,7 @@ begin -- timer_we <= '0'; if writeEnable = '1' then -- external interface - if addr=x"1000" then + if addr=x"2028003" then -- Write to UART -- report "" & character'image(conv_integer(memBint)) severity note; print(l_file, character'val(conv_integer(write))); @@ -68,20 +68,25 @@ begin -- report "xxx" severity failure; -- timer_we <= '1'; else - report "Illegal IO write" severity failure; + print(l_file, character'val(conv_integer(write))); + report "Illegal IO write" severity warning; end if; end if; - read <= (others => 'U'); + read <= (others => '0'); if (readEnable = '1') then if addr=x"1001" then read <= (0=>'1', others => '0'); -- recieve empty elsif addr(12)='1' then - read <= timer_read; + read(7 downto 0) <= timer_read; elsif addr(11)='1' then - read <= ZPU_Frequency; + read(7 downto 0) <= ZPU_Frequency; + elsif addr=x"2028003" then + read <= (others => '0'); else - report "Illegal IO read" severity failure; + read <= (others => '0'); + read(8) <= '1'; + report "Illegal IO read" severity warning; end if; end if; end if; diff --git a/zpu/hdl/zpu4/src/log.txt b/zpu/hdl/zpu4/src/log.txt index af58c93..10f0eaa 100644 --- a/zpu/hdl/zpu4/src/log.txt +++ b/zpu/hdl/zpu4/src/log.txt @@ -11,10 +11,10 @@ l d 1 + - - + H @@ -30,10 +30,10 @@ l d 2 + - - + H @@ -49,10 +49,10 @@ l d 1 + - - + H @@ -68,10 +68,10 @@ l d 2 + - - + H @@ -87,10 +87,10 @@ l d 1 + - - + H @@ -106,10 +106,10 @@ l d 2 + - - + H @@ -125,10 +125,10 @@ l d 1 + - - + H @@ -144,10 +144,10 @@ l d 2 + - - + H @@ -163,10 +163,10 @@ l d 1 + - - + H @@ -182,10 +182,10 @@ l d 2 + - - + H @@ -201,10 +201,10 @@ l d 1 + - - + H @@ -220,10 +220,10 @@ l d 2 + - - + H @@ -239,10 +239,10 @@ l d 1 + - - + H @@ -258,10 +258,10 @@ l d 2 + - - + H @@ -277,10 +277,10 @@ l d 1 + - - + H @@ -296,85 +296,10 @@ l d 2 + - - + H -e -l -l -o - -w -o -r -l -d - -1 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -2 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -1 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -2 - - - - - - diff --git a/zpu/hdl/zpu4/src/sim_fpga_top.vhd b/zpu/hdl/zpu4/src/sim_fpga_top.vhd index 2905505..4defc82 100644 --- a/zpu/hdl/zpu4/src/sim_fpga_top.vhd +++ b/zpu/hdl/zpu4/src/sim_fpga_top.vhd @@ -52,8 +52,8 @@ component zpu_io is busy : out std_logic; writeEnable : in std_logic; readEnable : in std_logic; - write : in std_logic_vector(7 downto 0); - read : out std_logic_vector(7 downto 0); + write : in std_logic_vector(wordSize-1 downto 0); + read : out std_logic_vector(wordSize-1 downto 0); addr : in std_logic_vector(maxAddrBit downto minAddrBit) ); end component; @@ -82,7 +82,7 @@ signal dram_mem_writeMask: std_logic_vector(wordBytes-1 downto 0); signal io_busy : std_logic; -signal io_mem_read : std_logic_vector(7 downto 0); +signal io_mem_read : std_logic_vector(wordSize-1 downto 0); signal io_mem_writeEnable : std_logic; signal io_mem_readEnable : std_logic; @@ -131,7 +131,7 @@ begin busy => io_busy, writeEnable => io_mem_writeEnable, readEnable => io_mem_readEnable, - write => mem_write(7 downto 0), + write => mem_write(wordSize-1 downto 0), read => io_mem_read, addr => mem_addr(maxAddrBit downto minAddrBit) ); @@ -154,8 +154,7 @@ begin end if; if io_ready='1' then - mem_read <= (others => '0'); - mem_read(7 downto 0) <= io_mem_read; + mem_read <= io_mem_read; end if; end process; diff --git a/zpu/hdl/zpu4/src/simzpu.do b/zpu/hdl/zpu4/src/simzpu.do deleted file mode 100644 index e6e3068..0000000 --- a/zpu/hdl/zpu4/src/simzpu.do +++ /dev/null @@ -1,23 +0,0 @@ -set BreakOnAssertion 1 -vlib work - -vcom -93 -explicit zpu_config.vhd -vcom -93 -explicit zpupkg.vhd -vcom -93 -explicit txt_util.vhd -vcom -93 -explicit sim_fpga_top.vhd -vcom -93 -explicit zpu_core.vhd -vcom -93 -explicit dram.vhd -vcom -93 -explicit timer.vhd -vcom -93 -explicit io.vhd -vcom -93 -explicit trace.vhd - -# run ZPU -vsim fpga_top -view wave -add wave -recursive fpga_top/zpu/* -#add wave -recursive fpga_top/* -view structure -#view signals - -# Enough to run tiny programs -run 1000 ms diff --git a/zpu/hdl/zpu4/src/simzpu_intstack.do b/zpu/hdl/zpu4/src/simzpu_intstack.do deleted file mode 100644 index cec4873..0000000 --- a/zpu/hdl/zpu4/src/simzpu_intstack.do +++ /dev/null @@ -1,23 +0,0 @@ -set BreakOnAssertion 1 -vlib work - -vcom -93 -explicit zpu_config_trace.vhd -vcom -93 -explicit zpupkg.vhd -vcom -93 -explicit txt_util.vhd -vcom -93 -explicit sim_fpga_top.vhd -vcom -93 -explicit zpu_core_intstack.vhd -vcom -93 -explicit dram_hello.vhd -vcom -93 -explicit timer.vhd -vcom -93 -explicit io.vhd -vcom -93 -explicit trace.vhd - -# run ZPU -vsim fpga_top -view wave -add wave -recursive fpga_top/zpu/* -#add wave -recursive fpga_top/* -view structure -#view signals - -# Enough to run tiny programs -run 15 ms diff --git a/zpu/hdl/zpu4/src/simzpu_medium.do b/zpu/hdl/zpu4/src/simzpu_medium.do new file mode 100644 index 0000000..a6c1fe2 --- /dev/null +++ b/zpu/hdl/zpu4/src/simzpu_medium.do @@ -0,0 +1,28 @@ +# Xilinx WebPack modelsim script +# +# cd C:/workspace/zpu/zpu/hdl/zpu4/src +# do simzpu_medium.do + +set BreakOnAssertion 1 +vlib work + +vcom -93 -explicit zpu_config_trace.vhd +vcom -93 -explicit zpupkg.vhd +vcom -93 -explicit txt_util.vhd +vcom -93 -explicit sim_fpga_top.vhd +vcom -93 -explicit zpu_core.vhd +vcom -93 -explicit dram_hello.vhd +vcom -93 -explicit timer.vhd +vcom -93 -explicit io.vhd +vcom -93 -explicit trace.vhd + +# run ZPU +vsim fpga_top +view wave +add wave -recursive fpga_top/zpu/* +#add wave -recursive fpga_top/* +view structure +#view signals + +# Enough to run tiny programs +run 1000 ms diff --git a/zpu/hdl/zpu4/src/zpu_config_trace.vhd b/zpu/hdl/zpu4/src/zpu_config_trace.vhd index d1bbbbb..a2d7d9d 100644 --- a/zpu/hdl/zpu4/src/zpu_config_trace.vhd +++ b/zpu/hdl/zpu4/src/zpu_config_trace.vhd @@ -5,11 +5,13 @@ use ieee.std_logic_unsigned.all; package zpu_config is constant Generate_Trace : boolean := true; - constant wordPower : integer := 5; + constant wordPower : integer := 5; -- during simulation, set this to '0' to get matching trace.txt constant DontCareValue : std_logic := '0'; -- Clock frequency in MHz. constant ZPU_Frequency : std_logic_vector(7 downto 0) := x"64"; - constant maxAddrBitIncIO : integer := 15; + constant maxAddrBitIncIO : integer := 27; + constant maxAddrBitDRAM : integer := 16; + constant spStart : std_logic_vector(maxAddrBitIncIO downto 0) := x"001fff8"; end zpu_config; diff --git a/zpu/hdl/zpu4/src/zpu_core.vhd b/zpu/hdl/zpu4/src/zpu_core.vhd index c7093e2..a603fe9 100644 --- a/zpu/hdl/zpu4/src/zpu_core.vhd +++ b/zpu/hdl/zpu4/src/zpu_core.vhd @@ -210,9 +210,7 @@ begin if areset = '1' then state <= State_Idle; break <= '0'; - -- point to top of RAM-8 - sp <= (others => '0'); - sp(maxAddrBit downto minAddrBit+1) <= (others => '1'); + sp <= spStart(maxAddrBitIncIO downto minAddrBit); pc <= (others => '0'); idim_flag <= '0'; diff --git a/zpu/hdl/zpu4/src/zpu_core_small.vhd b/zpu/hdl/zpu4/src/zpu_core_small.vhd index 4d73f88..8ebd40d 100644 --- a/zpu/hdl/zpu4/src/zpu_core_small.vhd +++ b/zpu/hdl/zpu4/src/zpu_core_small.vhd @@ -27,6 +27,19 @@ end zpu_core; architecture behave of zpu_core is +component dualport_ram is +port (clk : in std_logic; + memAWriteEnable : in std_logic; + memAAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit); + memAWrite : in std_logic_vector(wordSize-1 downto 0); + memARead : out std_logic_vector(wordSize-1 downto 0); + memBWriteEnable : in std_logic; + memBAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit); + memBWrite : in std_logic_vector(wordSize-1 downto 0); + memBRead : out std_logic_vector(wordSize-1 downto 0)); +end component; + + signal readIO : std_logic; diff --git a/zpu/hdl/zpu4/src/zpuio.vhd b/zpu/hdl/zpu4/src/zpuio.vhd index d14629e..09a1ddd 100644 --- a/zpu/hdl/zpu4/src/zpuio.vhd +++ b/zpu/hdl/zpu4/src/zpuio.vhd @@ -115,30 +115,6 @@ ram_imp: dram port map ( mem_writeMask => mem_writeMask); - -- Read/write are on different addresses - -- The registers are 8 bits and mapped to bit[7:0] - -- - -- 0xC000 Write: Writes to UART TX FIFO (4 byte FIFO) - -- Read : Reads from UART RX FIFO (4 byte FIFO) - -- 0xC004 Read : UART status register - -- Bit 0 = RX FIFO empty - -- Bit 1 = TX FIFO full - -- 0xA000 Skrive: LED's (8 stk.) - - -- 0x9000 Write: bit 0: 1= reset counter - -- 0= counter running - -- bit 1: 1= sample counter (when set to 1) - -- 0=not used - -- Read : counter bit[7:0] - -- 0x9004 Read: counter bit [15:8] - -- 0x9008 Read: counter bit [23:16] - -- 0x900C Read: counter bit [31:24] - -- 0x9010 Read: counter bit [39:32] - -- 0x9014 Read: counter bit [47:40] - -- 0x9018 Read: counter bit [55:48] - -- 0x901C Read: counter bit [63:56] - -- - -- 0x8800 Read: unsigned 8-bit integer with FPGA frequency (in MHz) fauxUart: process(cpu_clk, areset) @@ -158,7 +134,7 @@ ram_imp: dram port map ( end if; if io_writeEnable = '1' then - if io_addr=x"1000" then + if io_addr=x"2028003" then -- Write to UART uartData <= mem_write(7 downto 0); uartTXPending <= '1'; @@ -167,11 +143,11 @@ ram_imp: dram port map ( timer_we <= '1'; io_busy <= '1'; else - report "Illegal IO write" severity failure; +-- report "Illegal IO write" severity failure; end if; end if; if (io_readEnable = '1') then - if io_addr=x"1001" then + if io_addr=x"2028003" then io_read <= (0=>'1', -- recieve empty 1 => uartTXPending, -- tx full others => '0'); @@ -183,7 +159,7 @@ ram_imp: dram port map ( io_read <= ZPU_Frequency; io_busy <= '1'; else - report "Illegal IO read" severity failure; +-- report "Illegal IO read" severity failure; end if; else diff --git a/zpu/hdl/zpu4/src/zpupkg.vhd b/zpu/hdl/zpu4/src/zpupkg.vhd index 30c3e46..fd00b9e 100644 --- a/zpu/hdl/zpu4/src/zpupkg.vhd +++ b/zpu/hdl/zpu4/src/zpupkg.vhd @@ -23,17 +23,6 @@ package zpupkg is constant stack_bits : integer := 5; constant stack_size : integer := 2**stack_bits; - component dualport_ram is - port (clk : in std_logic; - memAWriteEnable : in std_logic; - memAAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit); - memAWrite : in std_logic_vector(wordSize-1 downto 0); - memARead : out std_logic_vector(wordSize-1 downto 0); - memBWriteEnable : in std_logic; - memBAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit); - memBWrite : in std_logic_vector(wordSize-1 downto 0); - memBRead : out std_logic_vector(wordSize-1 downto 0)); - end component; component dram is port (clk : in std_logic; -- cgit v1.1 From e5627082149dbce408555bd3a128fd5d128880d2 Mon Sep 17 00:00:00 2001 From: oharboe Date: Thu, 21 Feb 2008 19:17:03 +0000 Subject: * zpu/zpu/sw/index.html. Changed it a bit to make installation easier. --- zpu/hdl/zpu4/src/dmipstrace.do | 5 + zpu/hdl/zpu4/src/dmipstraceintstack.do | 25 - zpu/hdl/zpu4/src/dram_dmips.vhd | 6374 +++++++++++++++---------------- zpu/hdl/zpu4/src/fastdmips.do | 19 - zpu/hdl/zpu4/src/fastdmipsintstack.do | 19 - zpu/hdl/zpu4/src/fastdmipssmall.do | 21 - zpu/hdl/zpu4/src/fasthello.do | 19 - zpu/hdl/zpu4/src/fastsimzpu.do | 19 - zpu/hdl/zpu4/src/log.txt | 347 +- zpu/hdl/zpu4/src/zpu_config_fastsim.vhd | 15 - 10 files changed, 3094 insertions(+), 3769 deletions(-) delete mode 100644 zpu/hdl/zpu4/src/dmipstraceintstack.do delete mode 100644 zpu/hdl/zpu4/src/fastdmips.do delete mode 100644 zpu/hdl/zpu4/src/fastdmipsintstack.do delete mode 100644 zpu/hdl/zpu4/src/fastdmipssmall.do delete mode 100644 zpu/hdl/zpu4/src/fasthello.do delete mode 100644 zpu/hdl/zpu4/src/fastsimzpu.do delete mode 100644 zpu/hdl/zpu4/src/zpu_config_fastsim.vhd (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/dmipstrace.do b/zpu/hdl/zpu4/src/dmipstrace.do index 8d5f430..64cf8fd 100644 --- a/zpu/hdl/zpu4/src/dmipstrace.do +++ b/zpu/hdl/zpu4/src/dmipstrace.do @@ -1,3 +1,8 @@ +# Xilinx WebPack modelsim script +# +# cd C:/workspace/zpu/zpu/hdl/zpu4/src +# do dmipstrace.do + set BreakOnAssertion 1 vlib work diff --git a/zpu/hdl/zpu4/src/dmipstraceintstack.do b/zpu/hdl/zpu4/src/dmipstraceintstack.do deleted file mode 100644 index b2addb4..0000000 --- a/zpu/hdl/zpu4/src/dmipstraceintstack.do +++ /dev/null @@ -1,25 +0,0 @@ -set BreakOnAssertion 1 -vlib work - -vcom -93 -explicit zpu_config_trace.vhd -vcom -93 -explicit zpupkg.vhd -vcom -93 -explicit txt_util.vhd -vcom -93 -explicit sim_fpga_top.vhd -vcom -93 -explicit zpu_core_intstack.vhd -vcom -93 -explicit dram_dmips.vhd -vcom -93 -explicit timer.vhd -vcom -93 -explicit io.vhd -vcom -93 -explicit trace.vhd - - -vsim fpga_top -view wave - -add wave -recursive fpga_top/zpu/* -#--add wave -recursive fpga_top/ioMap/* -#add wave -recursive fpga_top/* -view structure - - -# run ZPU -run 5 ms diff --git a/zpu/hdl/zpu4/src/dram_dmips.vhd b/zpu/hdl/zpu4/src/dram_dmips.vhd index e63a27a..a289fd7 100644 --- a/zpu/hdl/zpu4/src/dram_dmips.vhd +++ b/zpu/hdl/zpu4/src/dram_dmips.vhd @@ -22,21 +22,21 @@ end dram; architecture dram_arch of dram is -type ram_type is array(0 to ((2**(maxAddrBit+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); +type ram_type is array(0 to ((2**(maxAddrBitDRAM+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); shared variable ram : ram_type := ( 0 => x"0b0b0b0b", -1 => x"80700b0b", -2 => x"80e2a40c", +1 => x"82700b0b", +2 => x"80d5f40c", 3 => x"3a0b0b80", -4 => x"c6fc0400", +4 => x"c4fb0400", 5 => x"00000000", 6 => x"00000000", 7 => x"00000000", 8 => x"80088408", 9 => x"88080b0b", -10 => x"80c7c32d", +10 => x"80c5c22d", 11 => x"880c840c", 12 => x"800c0400", 13 => x"00000000", @@ -99,7 +99,7 @@ shared variable ram : ram_type := 70 => x"00000000", 71 => x"00000000", 72 => x"0b0b0b88", -73 => x"c4040000", +73 => x"c3040000", 74 => x"00000000", 75 => x"00000000", 76 => x"00000000", @@ -116,7 +116,7 @@ shared variable ram : ram_type := 87 => x"00000000", 88 => x"72729f06", 89 => x"0981050b", -90 => x"0b0b88a7", +90 => x"0b0b88a6", 91 => x"05040000", 92 => x"00000000", 93 => x"00000000", @@ -187,25 +187,25 @@ shared variable ram : ram_type := 158 => x"00000000", 159 => x"00000000", 160 => x"71fc0608", -161 => x"0b0b80e2", -162 => x"90738306", +161 => x"0b0b80d5", +162 => x"e0738306", 163 => x"10100508", 164 => x"060b0b0b", -165 => x"88aa0400", +165 => x"88a90400", 166 => x"00000000", 167 => x"00000000", 168 => x"80088408", 169 => x"88087575", -170 => x"0b0b0baf", -171 => x"ac2d5050", +170 => x"0b0b0bad", +171 => x"aa2d5050", 172 => x"80085688", 173 => x"0c840c80", 174 => x"0c510400", 175 => x"00000000", 176 => x"80088408", 177 => x"88087575", -178 => x"0b0b0baf", -179 => x"f02d5050", +178 => x"0b0b0bad", +179 => x"ee2d5050", 180 => x"80085688", 181 => x"0c840c80", 182 => x"0c510400", @@ -235,7 +235,7 @@ shared variable ram : ram_type := 206 => x"00000000", 207 => x"00000000", 208 => x"810b0b0b", -209 => x"80e2a00c", +209 => x"80d5f00c", 210 => x"51040000", 211 => x"00000000", 212 => x"00000000", @@ -282,8 +282,8 @@ shared variable ram : ram_type := 253 => x"00000000", 254 => x"00000000", 255 => x"00000000", -256 => x"83d93f80", -257 => x"cbcf3f04", +256 => x"82fd3fbf", +257 => x"a03f0410", 258 => x"10101010", 259 => x"10101010", 260 => x"10101010", @@ -291,2890 +291,2890 @@ shared variable ram : ram_type := 262 => x"10101010", 263 => x"10101010", 264 => x"10101010", -265 => x"10101053", -266 => x"51047381", -267 => x"ff067383", -268 => x"06098105", -269 => x"83051010", -270 => x"102b0772", -271 => x"fc060c51", -272 => x"51043c04", -273 => x"72728072", -274 => x"8106ff05", -275 => x"09720605", -276 => x"71105272", -277 => x"0a100a53", -278 => x"72ed3851", -279 => x"51535104", -280 => x"ff3d0d0b", -281 => x"0b80f294", -282 => x"08528412", -283 => x"08708106", -284 => x"515170f6", -285 => x"38710881", -286 => x"ff06800c", +265 => x"10105351", +266 => x"047381ff", +267 => x"06738306", +268 => x"09810583", +269 => x"05101010", +270 => x"2b0772fc", +271 => x"060c5151", +272 => x"043c0472", +273 => x"72807281", +274 => x"06ff0509", +275 => x"72060571", +276 => x"1052720a", +277 => x"100a5372", +278 => x"ed385151", +279 => x"535104ff", +280 => x"3d0d0b0b", +281 => x"80e5e408", +282 => x"52710870", +283 => x"882a8132", +284 => x"70810651", +285 => x"515170f1", +286 => x"3873720c", 287 => x"833d0d04", -288 => x"ff3d0d0b", -289 => x"0b80f294", -290 => x"08528412", -291 => x"08700a10", -292 => x"0a708106", -293 => x"51515170", -294 => x"f1387372", -295 => x"0c833d0d", -296 => x"0480e2a0", -297 => x"08802ea8", -298 => x"38838080", -299 => x"0b0b0b80", -300 => x"f2940c82", -301 => x"a0800b0b", -302 => x"0b80f298", -303 => x"0c829080", -304 => x"0b80f2a8", -305 => x"0c0b0b80", -306 => x"f29c0b80", -307 => x"f2ac0c04", -308 => x"f8808080", -309 => x"a40b0b0b", -310 => x"80f2940c", -311 => x"f8808082", -312 => x"800b0b0b", -313 => x"80f2980c", -314 => x"f8808084", -315 => x"800b80f2", -316 => x"a80cf880", -317 => x"8080940b", -318 => x"80f2ac0c", -319 => x"f8808080", -320 => x"9c0b80f2", -321 => x"a40cf880", -322 => x"8080a00b", -323 => x"80f2b00c", -324 => x"04f23d0d", -325 => x"600b0b80", -326 => x"f2980856", -327 => x"5d82750c", -328 => x"8059805a", -329 => x"800b8f3d", -330 => x"71101017", -331 => x"70085957", -332 => x"5d5b8076", -333 => x"81ff067c", -334 => x"832b5658", -335 => x"5276537b", -336 => x"519af33f", -337 => x"7d7f7a72", -338 => x"077c7207", -339 => x"71716081", -340 => x"05415f5d", -341 => x"5b595755", -342 => x"7a8724bb", -343 => x"380b0b80", -344 => x"f298087b", -345 => x"10101170", -346 => x"08585155", -347 => x"807681ff", -348 => x"067c832b", -349 => x"56585276", -350 => x"537b519a", -351 => x"b93f7d7f", -352 => x"7a72077c", -353 => x"72077171", -354 => x"60810541", -355 => x"5f5d5b59", -356 => x"5755877b", -357 => x"25c73876", -358 => x"7d0c7784", -359 => x"1e0c7c80", -360 => x"0c903d0d", -361 => x"04ff3d0d", -362 => x"80f2a033", -363 => x"5170a738", -364 => x"80e2ac08", -365 => x"70085252", -366 => x"70802e94", -367 => x"38841280", -368 => x"e2ac0c70", -369 => x"2d80e2ac", -370 => x"08700852", -371 => x"5270ee38", -372 => x"810b80f2", -373 => x"a034833d", -374 => x"0d040480", -375 => x"3d0d0b0b", -376 => x"80f29008", -377 => x"802e8e38", -378 => x"0b0b0b0b", -379 => x"800b802e", -380 => x"09810685", -381 => x"38823d0d", -382 => x"040b0b80", -383 => x"f290510b", -384 => x"0b0bf3fc", -385 => x"3f823d0d", -386 => x"0404ff3d", -387 => x"0d028f05", -388 => x"3352718a", -389 => x"2e8a3871", -390 => x"51fce53f", -391 => x"833d0d04", -392 => x"8d51fcdc", -393 => x"3f7151fc", -394 => x"d73f833d", -395 => x"0d04ce3d", -396 => x"0db53d70", -397 => x"70840552", -398 => x"088c8a5c", -399 => x"56a53d5e", -400 => x"5c807570", -401 => x"81055733", -402 => x"765b5558", -403 => x"73782e80", -404 => x"c1388e3d", -405 => x"5b73a52e", -406 => x"09810680", -407 => x"c5387870", -408 => x"81055a33", -409 => x"547380e4", -410 => x"2e81b638", -411 => x"7380e424", -412 => x"80c63873", -413 => x"80e32ea1", -414 => x"388052a5", -415 => x"51792d80", -416 => x"52735179", -417 => x"2d821858", -418 => x"78708105", -419 => x"5a335473", -420 => x"c4387780", -421 => x"0cb43d0d", -422 => x"047b841d", -423 => x"83123356", -424 => x"5d578052", -425 => x"7351792d", -426 => x"81187970", -427 => x"81055b33", -428 => x"555873ff", -429 => x"a038db39", -430 => x"7380f32e", -431 => x"098106ff", -432 => x"b8387b84", -433 => x"1d710859", -434 => x"5d568077", -435 => x"33555673", -436 => x"762e8d38", -437 => x"81167018", -438 => x"70335755", -439 => x"5674f538", -440 => x"ff165580", -441 => x"7625ffa0", -442 => x"38767081", -443 => x"05583354", -444 => x"80527351", -445 => x"792d8118", -446 => x"75ff1757", -447 => x"57588076", -448 => x"25ff8538", -449 => x"76708105", -450 => x"58335480", -451 => x"52735179", -452 => x"2d811875", -453 => x"ff175757", -454 => x"58758024", -455 => x"cc38fee8", -456 => x"397b841d", -457 => x"71087071", -458 => x"9f2c5953", -459 => x"595d5680", -460 => x"75248195", -461 => x"38757d7c", -462 => x"58565480", -463 => x"5773772e", -464 => x"098106b6", -465 => x"38b07b34", -466 => x"02b50556", -467 => x"7a762e97", -468 => x"38ff1656", -469 => x"75337570", -470 => x"81055734", -471 => x"8117577a", -472 => x"762e0981", -473 => x"06eb3880", -474 => x"7534767d", -475 => x"ff125758", -476 => x"56758024", -477 => x"fef338fe", -478 => x"8f398a52", -479 => x"7351a0f0", -480 => x"3f80080b", -481 => x"0b80d484", -482 => x"05337670", -483 => x"81055834", -484 => x"8a527351", -485 => x"a0963f80", -486 => x"08548008", -487 => x"802effac", -488 => x"388a5273", -489 => x"51a0c93f", -490 => x"80080b0b", -491 => x"80d48405", -492 => x"33767081", -493 => x"0558348a", -494 => x"5273519f", -495 => x"ef3f8008", -496 => x"548008ff", -497 => x"b538ff84", -498 => x"39745276", -499 => x"53b43dff", -500 => x"b8055195", -501 => x"b63fa33d", -502 => x"0856fed9", -503 => x"39803d0d", -504 => x"80c10b81", -505 => x"c0f43480", -506 => x"0b81c2d0", -507 => x"0c70800c", -508 => x"823d0d04", -509 => x"ff3d0d80", -510 => x"0b81c0f4", -511 => x"33525270", -512 => x"80c12e99", -513 => x"387181c2", -514 => x"d0080781", -515 => x"c2d00c80", -516 => x"c20b81c0", -517 => x"f8347080", -518 => x"0c833d0d", -519 => x"04810b81", -520 => x"c2d00807", -521 => x"81c2d00c", -522 => x"80c20b81", -523 => x"c0f83470", -524 => x"800c833d", -525 => x"0d04fd3d", -526 => x"0d757008", -527 => x"8a055353", -528 => x"81c0f433", -529 => x"517080c1", -530 => x"2e8b3873", -531 => x"f3387080", -532 => x"0c853d0d", -533 => x"04ff1270", -534 => x"81c0f008", -535 => x"31740c80", -536 => x"0c853d0d", -537 => x"04fc3d0d", -538 => x"81c0fc08", -539 => x"5574802e", -540 => x"8c387675", -541 => x"08710c81", -542 => x"c0fc0856", -543 => x"548c1553", -544 => x"81c0f008", -545 => x"528a5190", -546 => x"f03f7380", -547 => x"0c863d0d", -548 => x"04fb3d0d", -549 => x"77700856", -550 => x"56b05381", -551 => x"c0fc0852", -552 => x"7451acb4", -553 => x"3f850b8c", -554 => x"170c850b", -555 => x"8c160c75", -556 => x"08750c81", -557 => x"c0fc0854", -558 => x"73802e8a", -559 => x"38730875", -560 => x"0c81c0fc", -561 => x"08548c14", -562 => x"5381c0f0", -563 => x"08528a51", -564 => x"90a73f84", -565 => x"1508ad38", -566 => x"860b8c16", -567 => x"0c881552", -568 => x"88160851", -569 => x"8fb33f81", -570 => x"c0fc0870", -571 => x"08760c54", -572 => x"8c157054", -573 => x"548a5273", -574 => x"08518ffd", -575 => x"3f73800c", -576 => x"873d0d04", -577 => x"750854b0", -578 => x"53735275", -579 => x"51abc93f", -580 => x"73800c87", -581 => x"3d0d04d9", -582 => x"3d0db051", -583 => x"9eeb3f80", -584 => x"0881c0ec", -585 => x"0cb0519e", -586 => x"e03f8008", -587 => x"81c0fc0c", -588 => x"81c0ec08", -589 => x"80080c80", -590 => x"0b800884", -591 => x"050c820b", -592 => x"80088805", -593 => x"0ca80b80", -594 => x"088c050c", -595 => x"9f530b0b", -596 => x"80d49052", -597 => x"80089005", -598 => x"51aafd3f", -599 => x"a13d5e9f", -600 => x"530b0b80", -601 => x"d4b0527d", -602 => x"51aaed3f", -603 => x"8a0b80ff", -604 => x"b00c0b0b", -605 => x"80ded451", -606 => x"f9b43f0b", -607 => x"0b80d4d0", -608 => x"51f9ab3f", -609 => x"0b0b80de", -610 => x"d451f9a2", -611 => x"3f80e2b4", -612 => x"08802e8a", -613 => x"cf380b0b", -614 => x"80d58051", -615 => x"f9903f0b", -616 => x"0b80ded4", -617 => x"51f9873f", -618 => x"80e2b008", -619 => x"520b0b80", -620 => x"d5ac51f8", -621 => x"f93f80f2", -622 => x"cc51bbf8", -623 => x"3f810b9a", -624 => x"3d5e5b80", -625 => x"0b80e2b0", -626 => x"082582d6", -627 => x"38903d5f", -628 => x"80c10b81", -629 => x"c0f43481", -630 => x"0b81c2d0", -631 => x"0c80c20b", -632 => x"81c0f834", -633 => x"8240835a", -634 => x"9f530b0b", -635 => x"80d5dc52", -636 => x"7c51a9e4", -637 => x"3f814180", -638 => x"7d537e52", -639 => x"568f9e3f", -640 => x"8008762e", -641 => x"09810683", -642 => x"38815675", -643 => x"81c2d00c", -644 => x"7f705856", -645 => x"758325a2", -646 => x"38751010", -647 => x"16fd0542", -648 => x"a93dffa4", -649 => x"05538352", -650 => x"76518dcd", -651 => x"3f7f8105", -652 => x"70417058", -653 => x"56837624", -654 => x"e0386154", -655 => x"755380f2", -656 => x"d45281c1", -657 => x"88518dc1", -658 => x"3f81c0fc", -659 => x"08700858", -660 => x"58b05377", -661 => x"527651a8", -662 => x"ff3f850b", -663 => x"8c190c85", -664 => x"0b8c180c", -665 => x"7708770c", -666 => x"81c0fc08", -667 => x"5675802e", -668 => x"8a387508", -669 => x"770c81c0", -670 => x"fc08568c", -671 => x"165381c0", -672 => x"f008528a", -673 => x"518cf23f", -674 => x"84170888", -675 => x"e038860b", -676 => x"8c180c88", -677 => x"17528818", -678 => x"08518bfd", -679 => x"3f81c0fc", -680 => x"08700878", -681 => x"0c568c17", -682 => x"7054598a", -683 => x"52780851", -684 => x"8cc73f80", -685 => x"c10b81c0", -686 => x"f8335757", -687 => x"767626a2", -688 => x"3880c352", -689 => x"76518dab", -690 => x"3f800861", -691 => x"2e8aec38", -692 => x"81177081", -693 => x"ff0681c0", -694 => x"f8335858", -695 => x"58757727", -696 => x"e0387960", -697 => x"29627054", -698 => x"71535b59", -699 => x"99be3f80", -700 => x"0840787a", -701 => x"31708729", -702 => x"80083180", -703 => x"088a0581", -704 => x"c0f43381", -705 => x"c0f0085e", -706 => x"5b525a56", -707 => x"7780c12e", -708 => x"8ad8387b", -709 => x"f738811b", -710 => x"5b80e2b0", -711 => x"087b25fd", -712 => x"af3881c0", -713 => x"e451b98c", -714 => x"3f0b0b80", -715 => x"d5fc51f5", -716 => x"fd3f0b0b", -717 => x"80ded451", -718 => x"f5f43f0b", -719 => x"0b80d68c", -720 => x"51f5eb3f", -721 => x"0b0b80de", -722 => x"d451f5e2", -723 => x"3f81c0f0", -724 => x"08520b0b", -725 => x"80d6c451", -726 => x"f5d43f85", -727 => x"520b0b80", -728 => x"d6e051f5", -729 => x"c93f81c2", -730 => x"d008520b", -731 => x"0b80d6fc", -732 => x"51f5bb3f", -733 => x"81520b0b", -734 => x"80d6e051", -735 => x"f5b03f81", -736 => x"c0f43352", -737 => x"0b0b80d7", -738 => x"9851f5a2", -739 => x"3f80c152", -740 => x"0b0b80d7", -741 => x"b451f596", -742 => x"3f81c0f8", -743 => x"33520b0b", -744 => x"80d7d051", -745 => x"f5883f80", -746 => x"c2520b0b", -747 => x"80d7b451", -748 => x"f4fc3f81", -749 => x"c1a80852", -750 => x"0b0b80d7", -751 => x"ec51f4ee", -752 => x"3f87520b", -753 => x"0b80d6e0", -754 => x"51f4e33f", -755 => x"80ffb008", -756 => x"520b0b80", -757 => x"d88851f4", -758 => x"d53f0b0b", -759 => x"80d8a451", -760 => x"f4cc3f0b", -761 => x"0b80d8d0", -762 => x"51f4c33f", -763 => x"81c0fc08", -764 => x"7008535a", -765 => x"0b0b80d8", -766 => x"dc51f4b2", -767 => x"3f0b0b80", -768 => x"d8f851f4", -769 => x"a93f81c0", -770 => x"fc088411", -771 => x"0853560b", -772 => x"0b80d9ac", -773 => x"51f4973f", -774 => x"80520b0b", -775 => x"80d6e051", -776 => x"f48c3f81", -777 => x"c0fc0888", -778 => x"11085358", -779 => x"0b0b80d9", -780 => x"c851f3fa", -781 => x"3f82520b", -782 => x"0b80d6e0", -783 => x"51f3ef3f", -784 => x"81c0fc08", -785 => x"8c110853", -786 => x"570b0b80", -787 => x"d9e451f3", -788 => x"dd3f9152", -789 => x"0b0b80d6", -790 => x"e051f3d2", -791 => x"3f81c0fc", -792 => x"08900552", -793 => x"0b0b80da", -794 => x"8051f3c2", -795 => x"3f0b0b80", -796 => x"da9c51f3", -797 => x"b93f0b0b", -798 => x"80dad451", -799 => x"f3b03f81", -800 => x"c0ec0870", -801 => x"08535f0b", -802 => x"0b80d8dc", -803 => x"51f39f3f", -804 => x"0b0b80da", -805 => x"e851f396", -806 => x"3f81c0ec", -807 => x"08841108", -808 => x"535b0b0b", -809 => x"80d9ac51", -810 => x"f3843f80", -811 => x"520b0b80", -812 => x"d6e051f2", -813 => x"f93f81c0", -814 => x"ec088811", -815 => x"08535c0b", -816 => x"0b80d9c8", -817 => x"51f2e73f", -818 => x"81520b0b", -819 => x"80d6e051", -820 => x"f2dc3f81", -821 => x"c0ec088c", -822 => x"1108535a", -823 => x"0b0b80d9", -824 => x"e451f2ca", -825 => x"3f92520b", -826 => x"0b80d6e0", -827 => x"51f2bf3f", -828 => x"81c0ec08", -829 => x"9005520b", -830 => x"0b80da80", -831 => x"51f2af3f", -832 => x"0b0b80da", -833 => x"9c51f2a6", -834 => x"3f7f520b", -835 => x"0b80dba8", -836 => x"51f29b3f", -837 => x"85520b0b", -838 => x"80d6e051", -839 => x"f2903f78", -840 => x"520b0b80", -841 => x"dbc451f2", -842 => x"853f8d52", -843 => x"0b0b80d6", -844 => x"e051f1fa", -845 => x"3f61520b", -846 => x"0b80dbe0", -847 => x"51f1ef3f", -848 => x"87520b0b", -849 => x"80d6e051", -850 => x"f1e43f60", -851 => x"520b0b80", -852 => x"dbfc51f1", -853 => x"d93f8152", -854 => x"0b0b80d6", -855 => x"e051f1ce", -856 => x"3f7d520b", -857 => x"0b80dc98", -858 => x"51f1c33f", -859 => x"0b0b80dc", -860 => x"b451f1ba", -861 => x"3f7c520b", -862 => x"0b80dcec", -863 => x"51f1af3f", -864 => x"0b0b80dd", -865 => x"8851f1a6", -866 => x"3f0b0b80", -867 => x"ded451f1", -868 => x"9d3f81c0", -869 => x"e40881c0", -870 => x"e80880f2", -871 => x"cc0880f2", -872 => x"d0087271", -873 => x"31707426", -874 => x"75743170", -875 => x"723180f2", -876 => x"c40c4444", -877 => x"80f2c80c", -878 => x"80f2c808", -879 => x"560b0b80", -880 => x"ddc0555c", -881 => x"595758f0", -882 => x"e53f80f2", -883 => x"c4085680", -884 => x"762582b1", -885 => x"3880e2b0", -886 => x"0870719f", -887 => x"2c9a3d53", -888 => x"565680f2", -889 => x"c40880f2", -890 => x"c8084153", -891 => x"7f547052", -892 => x"5a8a8d3f", -893 => x"66685f80", -894 => x"f2b40c7d", -895 => x"80f2b80c", -896 => x"80e2b008", -897 => x"709f2c58", -898 => x"568058bd", -899 => x"84c07855", -900 => x"55765275", -901 => x"53795187", -902 => x"f33f953d", -903 => x"80f2c408", -904 => x"80f2c808", -905 => x"41557f56", -906 => x"67694053", -907 => x"7e547052", -908 => x"5c89cd3f", -909 => x"64665e80", -910 => x"f2bc0c7c", -911 => x"80f2c00c", -912 => x"80e2b008", -913 => x"709f2c40", -914 => x"58805783", -915 => x"dceb9480", -916 => x"7755557e", -917 => x"5277537b", -918 => x"5187b13f", -919 => x"64665d5b", -920 => x"805e8ddd", -921 => x"7e555580", -922 => x"f2c40880", -923 => x"f2c80859", -924 => x"52775379", -925 => x"5187953f", -926 => x"66684054", -927 => x"7e557a52", -928 => x"7b53a93d", -929 => x"ffa80551", -930 => x"88f63f62", -931 => x"645e81c1", -932 => x"800c7c81", -933 => x"c1840c0b", -934 => x"0b80ddd0", -935 => x"51ef8f3f", -936 => x"80f2b808", -937 => x"520b0b80", -938 => x"de8051ef", -939 => x"813f0b0b", -940 => x"80de8851", -941 => x"eef83f80", -942 => x"f2c00852", -943 => x"0b0b80de", -944 => x"8051eeea", -945 => x"3f81c184", -946 => x"08520b0b", -947 => x"80deb851", -948 => x"eedc3f0b", -949 => x"0b80ded4", -950 => x"51eed33f", -951 => x"800b800c", -952 => x"a93d0d04", -953 => x"0b0b80de", -954 => x"d851f5b0", -955 => x"39770857", -956 => x"b0537652", -957 => x"77519fe0", -958 => x"3f80c10b", -959 => x"81c0f833", -960 => x"5757f7b8", -961 => x"39758a38", -962 => x"80f2c808", -963 => x"8126fdc5", -964 => x"380b0b80", -965 => x"df8851ee", -966 => x"953f0b0b", -967 => x"80dfc051", -968 => x"ee8c3f0b", -969 => x"0b80ded4", -970 => x"51ee833f", -971 => x"80e2b008", -972 => x"70719f2c", -973 => x"9a3d5356", -974 => x"5680f2c4", -975 => x"0880f2c8", -976 => x"0841537f", -977 => x"5470525a", -978 => x"87b63f66", -979 => x"685f80f2", -980 => x"b40c7d80", -981 => x"f2b80c80", -982 => x"e2b00870", -983 => x"9f2c5856", -984 => x"8058bd84", -985 => x"c0785555", -986 => x"76527553", -987 => x"7951859c", -988 => x"3f953d80", -989 => x"f2c40880", -990 => x"f2c80841", -991 => x"557f5667", -992 => x"6940537e", -993 => x"5470525c", -994 => x"86f63f64", -995 => x"665e80f2", -996 => x"bc0c7c80", -997 => x"f2c00c80", -998 => x"e2b00870", -999 => x"9f2c4058", -1000 => x"805783dc", -1001 => x"eb948077", -1002 => x"55557e52", -1003 => x"77537b51", -1004 => x"84da3f64", -1005 => x"665d5b80", -1006 => x"5e8ddd7e", -1007 => x"555580f2", -1008 => x"c40880f2", -1009 => x"c8085952", -1010 => x"77537951", -1011 => x"84be3f66", -1012 => x"6840547e", -1013 => x"557a527b", -1014 => x"53a93dff", -1015 => x"a8055186", -1016 => x"9f3f6264", -1017 => x"5e81c180", -1018 => x"0c7c81c1", -1019 => x"840c0b0b", -1020 => x"80ddd051", -1021 => x"ecb83f80", -1022 => x"f2b80852", -1023 => x"0b0b80de", -1024 => x"8051ecaa", -1025 => x"3f0b0b80", -1026 => x"de8851ec", -1027 => x"a13f80f2", -1028 => x"c008520b", -1029 => x"0b80de80", -1030 => x"51ec933f", -1031 => x"81c18408", -1032 => x"520b0b80", -1033 => x"deb851ec", -1034 => x"853f0b0b", -1035 => x"80ded451", -1036 => x"ebfc3f80", -1037 => x"0b800ca9", -1038 => x"3d0d04a9", -1039 => x"3dffa005", -1040 => x"52805180", -1041 => x"d43f9f53", -1042 => x"0b0b80df", -1043 => x"e0527c51", -1044 => x"9d863f7a", -1045 => x"7b81c0f0", -1046 => x"0c811870", -1047 => x"81ff0681", -1048 => x"c0f83359", -1049 => x"59595af4", -1050 => x"f439ff16", -1051 => x"707b3160", -1052 => x"0c5c800b", -1053 => x"811c5c5c", -1054 => x"80e2b008", -1055 => x"7b25f2d0", -1056 => x"38f59f39", -1057 => x"ff3d0d73", -1058 => x"82327030", -1059 => x"70720780", -1060 => x"25800c52", -1061 => x"52833d0d", -1062 => x"04fe3d0d", -1063 => x"74767153", -1064 => x"54527182", -1065 => x"2e833883", -1066 => x"5171812e", -1067 => x"9a388172", -1068 => x"269f3871", -1069 => x"822eb838", -1070 => x"71842ea9", -1071 => x"3870730c", -1072 => x"70800c84", -1073 => x"3d0d0480", -1074 => x"e40b81c0", -1075 => x"f008258b", -1076 => x"3880730c", -1077 => x"70800c84", -1078 => x"3d0d0483", -1079 => x"730c7080", -1080 => x"0c843d0d", -1081 => x"0482730c", -1082 => x"70800c84", -1083 => x"3d0d0481", -1084 => x"730c7080", -1085 => x"0c843d0d", -1086 => x"04803d0d", -1087 => x"74741482", -1088 => x"05710c80", -1089 => x"0c823d0d", -1090 => x"04f73d0d", -1091 => x"7b7d7f61", -1092 => x"85127082", -1093 => x"2b751170", -1094 => x"74717084", -1095 => x"05530c5a", -1096 => x"5a5d5b76", -1097 => x"0c7980f8", -1098 => x"180c7986", -1099 => x"12525758", -1100 => x"5a5a7676", -1101 => x"24993876", -1102 => x"b329822b", -1103 => x"79115153", -1104 => x"76737084", -1105 => x"05550c81", -1106 => x"14547574", -1107 => x"25f23876", -1108 => x"81cc2919", -1109 => x"fc110881", -1110 => x"05fc120c", -1111 => x"7a197008", -1112 => x"9fa0130c", -1113 => x"5856850b", -1114 => x"81c0f00c", -1115 => x"75800c8b", -1116 => x"3d0d04fe", -1117 => x"3d0d0293", -1118 => x"05335180", -1119 => x"02840597", -1120 => x"05335452", -1121 => x"70732e88", -1122 => x"3871800c", -1123 => x"843d0d04", -1124 => x"7081c0f4", -1125 => x"34810b80", -1126 => x"0c843d0d", -1127 => x"04f83d0d", -1128 => x"7a7c5956", -1129 => x"820b8319", -1130 => x"55557416", -1131 => x"70337533", -1132 => x"5b515372", -1133 => x"792e80c6", -1134 => x"3880c10b", -1135 => x"81168116", -1136 => x"56565782", -1137 => x"7525e338", -1138 => x"ffa91770", -1139 => x"81ff0655", -1140 => x"59738226", -1141 => x"83388755", -1142 => x"81537680", -1143 => x"d22e9838", -1144 => x"77527551", -1145 => x"9bc43f80", -1146 => x"53728008", -1147 => x"25893887", -1148 => x"1581c0f0", -1149 => x"0c815372", -1150 => x"800c8a3d", -1151 => x"0d047281", -1152 => x"c0f43482", -1153 => x"7525ffa2", -1154 => x"38ffbd39", -1155 => x"ef3d0d63", -1156 => x"65675b42", -1157 => x"79436769", -1158 => x"59407741", -1159 => x"5a805d80", -1160 => x"5e617083", -1161 => x"ffff0671", -1162 => x"902a6270", -1163 => x"83ffff06", -1164 => x"71902a74", -1165 => x"72297473", -1166 => x"29757329", -1167 => x"77742973", -1168 => x"902a0572", -1169 => x"11515856", -1170 => x"535f5a57", -1171 => x"5a585558", -1172 => x"73732786", -1173 => x"38848080", -1174 => x"16567390", -1175 => x"2a165b78", -1176 => x"83ffff06", -1177 => x"74848080", -1178 => x"29055c7a", -1179 => x"7c5a5d78", -1180 => x"5e777f29", -1181 => x"61782905", -1182 => x"7d055d7c", -1183 => x"7e567a0c", -1184 => x"74841b0c", -1185 => x"79800c93", -1186 => x"3d0d04f9", -1187 => x"3d0d797b", -1188 => x"7d545872", -1189 => x"59773079", -1190 => x"70307072", -1191 => x"079f2a73", -1192 => x"71315a52", -1193 => x"59777956", -1194 => x"730c5373", -1195 => x"84130c54", -1196 => x"800c893d", -1197 => x"0d04f93d", -1198 => x"0d797b7d", -1199 => x"7f565452", -1200 => x"5472802e", -1201 => x"a0387057", -1202 => x"7158a073", -1203 => x"31528072", -1204 => x"25a13877", -1205 => x"70742b57", -1206 => x"70732a78", -1207 => x"752b0756", -1208 => x"51747653", -1209 => x"5170740c", -1210 => x"7184150c", -1211 => x"73800c89", -1212 => x"3d0d0480", -1213 => x"56777230", -1214 => x"2b557476", -1215 => x"5351e639", -1216 => x"e43d0d6e", -1217 => x"a13d08a3", -1218 => x"3d085957", -1219 => x"5f80764d", -1220 => x"774ea33d", -1221 => x"08a53d08", -1222 => x"574b754c", -1223 => x"5e7d6c24", -1224 => x"86fb3880", -1225 => x"6a24878f", -1226 => x"38696b58", -1227 => x"566b6d5d", -1228 => x"467b4775", -1229 => x"44764564", -1230 => x"6468685c", -1231 => x"5c565674", -1232 => x"81e73878", -1233 => x"762782c7", -1234 => x"387581ff", -1235 => x"26832b55", -1236 => x"83ffff76", -1237 => x"278c3890", -1238 => x"55fe800a", -1239 => x"76278338", -1240 => x"98557575", -1241 => x"2a80e080", -1242 => x"057033a0", -1243 => x"77317131", -1244 => x"57555774", -1245 => x"802e9538", -1246 => x"75752ba0", -1247 => x"76317a77", -1248 => x"2b7c722a", -1249 => x"077c782b", -1250 => x"5d5b5956", -1251 => x"75902a76", -1252 => x"83ffff06", -1253 => x"71547a53", -1254 => x"59578880", -1255 => x"3f80085b", -1256 => x"87ea3f80", -1257 => x"08800879", -1258 => x"297c902b", -1259 => x"7c902a07", -1260 => x"56565973", -1261 => x"75279438", -1262 => x"8008ff05", -1263 => x"76155559", -1264 => x"75742687", -1265 => x"38747426", -1266 => x"87b93876", -1267 => x"52737531", -1268 => x"5187c93f", -1269 => x"80085587", -1270 => x"b33f8008", -1271 => x"80087929", -1272 => x"7b83ffff", -1273 => x"0677902b", -1274 => x"07565957", -1275 => x"73782796", -1276 => x"388008ff", -1277 => x"05761555", -1278 => x"57757426", -1279 => x"89387774", -1280 => x"26777131", -1281 => x"58567890", -1282 => x"2b770758", -1283 => x"805b7a40", -1284 => x"77417f61", -1285 => x"56547d80", -1286 => x"d938737f", -1287 => x"0c747f84", -1288 => x"050c7e80", -1289 => x"0c9e3d0d", -1290 => x"0480705c", -1291 => x"58747926", -1292 => x"dd387481", -1293 => x"ff26832b", -1294 => x"577483ff", -1295 => x"ff2682a5", -1296 => x"3874772a", -1297 => x"80e08005", -1298 => x"7033a079", -1299 => x"31713159", -1300 => x"5c5d7682", -1301 => x"b3387654", -1302 => x"74792783", -1303 => x"38815479", -1304 => x"76277407", -1305 => x"59815878", -1306 => x"ffa23876", -1307 => x"58805bff", -1308 => x"9d397352", -1309 => x"74539e3d", -1310 => x"e80551fc", -1311 => x"8e3f6769", -1312 => x"567f0c74", -1313 => x"7f84050c", -1314 => x"7e800c9e", -1315 => x"3d0d0475", -1316 => x"802e81c4", -1317 => x"387581ff", -1318 => x"26832b55", -1319 => x"83ffff76", -1320 => x"278c3890", -1321 => x"55fe800a", -1322 => x"76278338", -1323 => x"98557575", -1324 => x"2a80e080", -1325 => x"057033a0", -1326 => x"77317131", -1327 => x"575e5474", -1328 => x"84913878", -1329 => x"76315481", -1330 => x"76902a77", -1331 => x"83ffff06", -1332 => x"5f5d5b7b", -1333 => x"52735185", -1334 => x"c33f8008", -1335 => x"5785ad3f", -1336 => x"80088008", -1337 => x"7e297890", -1338 => x"2b7c902a", -1339 => x"07565659", -1340 => x"73752794", -1341 => x"388008ff", -1342 => x"05761555", -1343 => x"59757426", -1344 => x"87387474", -1345 => x"2684f338", -1346 => x"7b527375", -1347 => x"3151858c", -1348 => x"3f800855", -1349 => x"84f63f80", -1350 => x"0880087e", -1351 => x"297b83ff", -1352 => x"ff067790", -1353 => x"2b075659", -1354 => x"57737827", -1355 => x"96388008", -1356 => x"ff057615", -1357 => x"55577574", -1358 => x"26893877", -1359 => x"74267771", -1360 => x"31585a78", -1361 => x"902b7707", -1362 => x"7b41417f", -1363 => x"6156547d", -1364 => x"802efdc6", -1365 => x"38fe9b39", -1366 => x"75528151", -1367 => x"84ae3f80", -1368 => x"0856feb1", -1369 => x"399057fe", -1370 => x"800a7527", -1371 => x"fdd33898", -1372 => x"75712a80", -1373 => x"e0800570", -1374 => x"33a07331", -1375 => x"7131535d", -1376 => x"5e577680", -1377 => x"2efdcf38", -1378 => x"a0773175", -1379 => x"782b7772", -1380 => x"2a077779", -1381 => x"2b7b7a2b", -1382 => x"7d742a07", -1383 => x"7d7b2b73", -1384 => x"902a7483", -1385 => x"ffff0671", -1386 => x"597f772a", -1387 => x"585e5c41", -1388 => x"5f585c54", -1389 => x"83e63f80", -1390 => x"085483d0", -1391 => x"3f800880", -1392 => x"08792975", -1393 => x"902b7e90", -1394 => x"2a075656", -1395 => x"59737527", -1396 => x"99388008", -1397 => x"ff057b15", -1398 => x"55597a74", -1399 => x"268c3873", -1400 => x"75278738", -1401 => x"ff197b15", -1402 => x"55597652", -1403 => x"73753151", -1404 => x"83aa3f80", -1405 => x"08558394", -1406 => x"3f800880", -1407 => x"0879297d", -1408 => x"83ffff06", -1409 => x"77902b07", -1410 => x"56595773", -1411 => x"78279938", -1412 => x"8008ff05", -1413 => x"7b155557", -1414 => x"7a74268c", -1415 => x"38737827", -1416 => x"8738ff17", -1417 => x"7b155557", -1418 => x"73783179", -1419 => x"902b7807", -1420 => x"7083ffff", -1421 => x"0671902a", -1422 => x"7983ffff", -1423 => x"067a902a", -1424 => x"73722973", -1425 => x"73297473", -1426 => x"29767429", -1427 => x"73902a05", -1428 => x"72055755", -1429 => x"435f5b58", -1430 => x"5a57595a", -1431 => x"747c2786", -1432 => x"38848080", -1433 => x"17577490", -1434 => x"2a177983", -1435 => x"ffff0676", -1436 => x"84808029", -1437 => x"05575776", -1438 => x"7a269a38", -1439 => x"767a3270", -1440 => x"30707207", -1441 => x"8025565a", -1442 => x"5b7c7627", -1443 => x"fafe3873", -1444 => x"802efaf8", -1445 => x"38ff1858", -1446 => x"805bfaf2", -1447 => x"39ff7653", -1448 => x"77549f3d", -1449 => x"e805525e", -1450 => x"f7e13f67", -1451 => x"69574c75", -1452 => x"4d698025", -1453 => x"f8f3387d", -1454 => x"096a6c5c", -1455 => x"537a549f", -1456 => x"3de80552", -1457 => x"5ef7c43f", -1458 => x"6769714c", -1459 => x"704d5856", -1460 => x"f8db39a0", -1461 => x"75317676", -1462 => x"2b7a772b", -1463 => x"7c732a07", -1464 => x"7c782b72", -1465 => x"902a7383", -1466 => x"ffff0671", -1467 => x"587e762a", -1468 => x"5742405d", -1469 => x"5d575881", -1470 => x"a33f8008", -1471 => x"57818d3f", -1472 => x"80088008", -1473 => x"7e297890", -1474 => x"2b7d902a", -1475 => x"07565659", -1476 => x"73752799", -1477 => x"388008ff", -1478 => x"05761555", -1479 => x"59757426", -1480 => x"8c387375", -1481 => x"278738ff", -1482 => x"19761555", -1483 => x"597b5273", -1484 => x"75315180", -1485 => x"e73f8008", -1486 => x"5580d13f", -1487 => x"80088008", -1488 => x"7e297c83", -1489 => x"ffff0670", -1490 => x"78902b07", -1491 => x"51565858", -1492 => x"73772799", -1493 => x"388008ff", -1494 => x"05761555", -1495 => x"58757426", -1496 => x"8c387377", -1497 => x"278738ff", -1498 => x"18761555", -1499 => x"5878902b", -1500 => x"78077478", -1501 => x"31555bfa", -1502 => x"da39ff19", -1503 => x"76155559", -1504 => x"fb8639ff", -1505 => x"19761555", -1506 => x"59f8c039", -1507 => x"fe3d0d80", -1508 => x"53755274", -1509 => x"5181913f", -1510 => x"843d0d04", -1511 => x"fe3d0d81", -1512 => x"53755274", -1513 => x"5181813f", -1514 => x"843d0d04", -1515 => x"fb3d0d77", -1516 => x"79555580", -1517 => x"56757524", -1518 => x"ab388074", -1519 => x"249d3880", -1520 => x"53735274", -1521 => x"5180e13f", -1522 => x"80085475", -1523 => x"802e8538", -1524 => x"80083054", -1525 => x"73800c87", -1526 => x"3d0d0473", -1527 => x"30768132", -1528 => x"5754dc39", -1529 => x"74305581", -1530 => x"56738025", -1531 => x"d238ec39", -1532 => x"fa3d0d78", -1533 => x"7a575580", -1534 => x"57767524", -1535 => x"a438759f", -1536 => x"2c548153", -1537 => x"75743274", -1538 => x"31527451", -1539 => x"9b3f8008", -1540 => x"5476802e", -1541 => x"85388008", -1542 => x"30547380", -1543 => x"0c883d0d", -1544 => x"04743055", -1545 => x"8157d739", -1546 => x"fc3d0d76", -1547 => x"78535481", -1548 => x"53807473", -1549 => x"26525572", -1550 => x"802e9838", -1551 => x"70802eab", -1552 => x"38807224", -1553 => x"a6387110", -1554 => x"73107572", -1555 => x"26535452", -1556 => x"72ea3873", -1557 => x"51788338", -1558 => x"74517080", -1559 => x"0c863d0d", -1560 => x"04720a10", -1561 => x"0a720a10", -1562 => x"0a535372", -1563 => x"802ee438", -1564 => x"717426ed", -1565 => x"38737231", -1566 => x"75740774", -1567 => x"0a100a74", -1568 => x"0a100a55", -1569 => x"555654e3", -1570 => x"39ff3d0d", -1571 => x"735280ea", -1572 => x"fc085196", -1573 => x"3f833d0d", -1574 => x"04ff3d0d", -1575 => x"735280ea", -1576 => x"fc085190", -1577 => x"cc3f833d", -1578 => x"0d04f43d", -1579 => x"0d7e608b", -1580 => x"1170f806", -1581 => x"5b55555d", -1582 => x"72962683", -1583 => x"38905880", -1584 => x"78247479", -1585 => x"26075580", -1586 => x"5474742e", -1587 => x"09810680", -1588 => x"ca387c51", -1589 => x"8d9e3f77", -1590 => x"83f72680", -1591 => x"c5387783", -1592 => x"2a701010", -1593 => x"1080e2f4", -1594 => x"058c1108", -1595 => x"58585475", -1596 => x"772e81f0", -1597 => x"38841608", -1598 => x"fc068c17", -1599 => x"08881808", -1600 => x"718c120c", -1601 => x"88120c5b", -1602 => x"76058411", -1603 => x"08810784", -1604 => x"120c537c", -1605 => x"518cde3f", -1606 => x"88165473", -1607 => x"800c8e3d", -1608 => x"0d047789", -1609 => x"2a78832a", -1610 => x"58547380", -1611 => x"2ebf3877", -1612 => x"862ab805", -1613 => x"57847427", -1614 => x"b43880db", -1615 => x"14579474", -1616 => x"27ab3877", -1617 => x"8c2a80ee", -1618 => x"055780d4", -1619 => x"74279e38", -1620 => x"778f2a80", -1621 => x"f7055782", -1622 => x"d4742791", -1623 => x"3877922a", -1624 => x"80fc0557", -1625 => x"8ad47427", -1626 => x"843880fe", -1627 => x"57761010", -1628 => x"1080e2f4", -1629 => x"058c1108", -1630 => x"56537473", -1631 => x"2ea33884", -1632 => x"1508fc06", -1633 => x"70793155", -1634 => x"56738f24", -1635 => x"88e43873", -1636 => x"802588e6", -1637 => x"388c1508", -1638 => x"5574732e", -1639 => x"098106df", -1640 => x"38811759", -1641 => x"80e38408", -1642 => x"567580e2", -1643 => x"fc2e82cc", -1644 => x"38841608", -1645 => x"fc067079", -1646 => x"31555573", -1647 => x"8f24bb38", -1648 => x"80e2fc0b", -1649 => x"80e3880c", -1650 => x"80e2fc0b", -1651 => x"80e3840c", -1652 => x"80742480", -1653 => x"db387416", -1654 => x"84110881", -1655 => x"0784120c", -1656 => x"53feb039", -1657 => x"88168c11", -1658 => x"08575975", -1659 => x"792e0981", -1660 => x"06fe8238", -1661 => x"821459ff", -1662 => x"ab397716", -1663 => x"78810784", -1664 => x"180c7080", -1665 => x"e3880c70", -1666 => x"80e3840c", -1667 => x"80e2fc0b", -1668 => x"8c120c8c", -1669 => x"11088812", -1670 => x"0c748107", -1671 => x"84120c74", -1672 => x"0574710c", -1673 => x"5b7c518a", -1674 => x"cc3f8816", -1675 => x"54fdec39", -1676 => x"83ff7527", -1677 => x"83913874", -1678 => x"892a7583", -1679 => x"2a545473", -1680 => x"802ebf38", -1681 => x"74862ab8", -1682 => x"05538474", -1683 => x"27b43880", -1684 => x"db145394", -1685 => x"7427ab38", -1686 => x"748c2a80", -1687 => x"ee055380", -1688 => x"d474279e", -1689 => x"38748f2a", -1690 => x"80f70553", -1691 => x"82d47427", -1692 => x"91387492", -1693 => x"2a80fc05", -1694 => x"538ad474", -1695 => x"27843880", -1696 => x"fe537210", -1697 => x"101080e2", -1698 => x"f4058811", -1699 => x"08555773", -1700 => x"772e868b", -1701 => x"38841408", -1702 => x"fc065b74", -1703 => x"7b278d38", -1704 => x"88140854", -1705 => x"73772e09", -1706 => x"8106ea38", -1707 => x"8c140880", -1708 => x"e2f40b84", -1709 => x"0508718c", -1710 => x"190c7588", -1711 => x"190c7788", -1712 => x"130c5c57", -1713 => x"758c150c", -1714 => x"78538079", -1715 => x"24839838", -1716 => x"72822c81", -1717 => x"712b5656", -1718 => x"747b2680", -1719 => x"ca387a75", -1720 => x"06577682", -1721 => x"a33878fc", -1722 => x"06840559", -1723 => x"7410707c", -1724 => x"06555573", -1725 => x"82923884", -1726 => x"1959f139", -1727 => x"80e2f40b", -1728 => x"84050879", -1729 => x"545b7880", -1730 => x"25c63882", -1731 => x"da397409", -1732 => x"7b067080", -1733 => x"e2f40b84", -1734 => x"050c5b74", -1735 => x"1055747b", -1736 => x"26853874", -1737 => x"85bc3880", -1738 => x"e2f40b88", -1739 => x"05087084", -1740 => x"1208fc06", -1741 => x"707b317b", -1742 => x"72268f72", -1743 => x"25075d57", -1744 => x"5c5c5578", -1745 => x"802e80d9", -1746 => x"38791580", -1747 => x"e2ec0819", -1748 => x"90115954", -1749 => x"5680e2e8", -1750 => x"08ff2e88", -1751 => x"38a08f13", -1752 => x"e0800657", -1753 => x"76527c51", -1754 => x"888c3f80", -1755 => x"08548008", -1756 => x"ff2e9038", -1757 => x"80087627", -1758 => x"82a73874", -1759 => x"80e2f42e", -1760 => x"829f3880", -1761 => x"e2f40b88", -1762 => x"05085584", -1763 => x"1508fc06", -1764 => x"70793179", -1765 => x"72268f72", -1766 => x"25075d55", -1767 => x"5a7a83f2", -1768 => x"38778107", -1769 => x"84160c77", -1770 => x"157080e2", -1771 => x"f40b8805", -1772 => x"0c748107", -1773 => x"84120c56", -1774 => x"7c5187b9", -1775 => x"3f881554", -1776 => x"73800c8e", -1777 => x"3d0d0474", -1778 => x"832a7054", -1779 => x"54807424", -1780 => x"819b3872", -1781 => x"822c8171", -1782 => x"2b80e2f8", -1783 => x"08077080", -1784 => x"e2f40b84", -1785 => x"050c7510", -1786 => x"101080e2", -1787 => x"f4058811", -1788 => x"08718c1b", -1789 => x"0c70881b", -1790 => x"0c798813", -1791 => x"0c57555c", -1792 => x"55758c15", -1793 => x"0cfdc139", -1794 => x"78791010", -1795 => x"1080e2f4", -1796 => x"0570565b", -1797 => x"5c8c1408", -1798 => x"5675742e", -1799 => x"a3388416", -1800 => x"08fc0670", -1801 => x"79315853", -1802 => x"768f2483", -1803 => x"f1387680", -1804 => x"2584af38", -1805 => x"8c160856", -1806 => x"75742e09", -1807 => x"8106df38", -1808 => x"8814811a", -1809 => x"70830655", -1810 => x"5a5472c9", -1811 => x"387b8306", -1812 => x"5675802e", -1813 => x"fdb838ff", -1814 => x"1cf81b5b", -1815 => x"5c881a08", -1816 => x"7a2eea38", -1817 => x"fdb53983", -1818 => x"1953fce4", -1819 => x"39831470", -1820 => x"822c8171", -1821 => x"2b80e2f8", -1822 => x"08077080", -1823 => x"e2f40b84", -1824 => x"050c7610", -1825 => x"101080e2", -1826 => x"f4058811", -1827 => x"08718c1c", -1828 => x"0c70881c", -1829 => x"0c7a8813", -1830 => x"0c58535d", -1831 => x"5653fee1", -1832 => x"3980e2b8", -1833 => x"08175980", -1834 => x"08762e81", -1835 => x"8b3880e2", -1836 => x"e808ff2e", -1837 => x"848e3873", -1838 => x"76311980", -1839 => x"e2b80c73", -1840 => x"87067056", -1841 => x"5372802e", -1842 => x"88388873", -1843 => x"31701555", -1844 => x"5576149f", -1845 => x"ff06a080", -1846 => x"71311670", -1847 => x"547e5351", -1848 => x"5385933f", -1849 => x"80085680", -1850 => x"08ff2e81", -1851 => x"9e3880e2", -1852 => x"b8081370", -1853 => x"80e2b80c", -1854 => x"747580e2", -1855 => x"f40b8805", -1856 => x"0c777631", -1857 => x"15810755", -1858 => x"56597a80", -1859 => x"e2f42e83", -1860 => x"c038798f", -1861 => x"2682ef38", -1862 => x"810b8415", -1863 => x"0c841508", -1864 => x"fc067079", -1865 => x"31797226", -1866 => x"8f722507", -1867 => x"5d555a7a", -1868 => x"802efced", -1869 => x"3880db39", -1870 => x"80089fff", -1871 => x"065574fe", -1872 => x"ed387880", -1873 => x"e2b80c80", -1874 => x"e2f40b88", -1875 => x"05087a18", -1876 => x"81078412", -1877 => x"0c5580e2", -1878 => x"e4087927", -1879 => x"86387880", -1880 => x"e2e40c80", -1881 => x"e2e00879", -1882 => x"27fca038", -1883 => x"7880e2e0", -1884 => x"0c841508", -1885 => x"fc067079", -1886 => x"31797226", -1887 => x"8f722507", -1888 => x"5d555a7a", -1889 => x"802efc99", -1890 => x"38883980", -1891 => x"745753fe", -1892 => x"dd397c51", -1893 => x"83df3f80", -1894 => x"0b800c8e", -1895 => x"3d0d0480", -1896 => x"7324a538", -1897 => x"72822c81", -1898 => x"712b80e2", -1899 => x"f8080770", -1900 => x"80e2f40b", -1901 => x"84050c5c", -1902 => x"5a768c17", -1903 => x"0c738817", -1904 => x"0c758818", -1905 => x"0cf9fd39", -1906 => x"83137082", -1907 => x"2c81712b", -1908 => x"80e2f808", -1909 => x"077080e2", -1910 => x"f40b8405", -1911 => x"0c5d5b53", -1912 => x"d8397a75", -1913 => x"065c7bfc", -1914 => x"9f388419", -1915 => x"75105659", -1916 => x"f139ff17", -1917 => x"810559f7", -1918 => x"ab398c15", -1919 => x"08881608", -1920 => x"718c120c", -1921 => x"88120c59", -1922 => x"75158411", -1923 => x"08810784", -1924 => x"120c587c", -1925 => x"5182de3f", -1926 => x"881554fb", -1927 => x"a3397716", -1928 => x"78810784", -1929 => x"180c8c17", -1930 => x"08881808", -1931 => x"718c120c", -1932 => x"88120c5c", -1933 => x"7080e388", -1934 => x"0c7080e3", -1935 => x"840c80e2", -1936 => x"fc0b8c12", -1937 => x"0c8c1108", -1938 => x"88120c77", -1939 => x"81078412", -1940 => x"0c770577", -1941 => x"710c557c", -1942 => x"51829a3f", -1943 => x"881654f5", -1944 => x"ba397216", -1945 => x"84110881", -1946 => x"0784120c", -1947 => x"588c1608", -1948 => x"88170871", -1949 => x"8c120c88", -1950 => x"120c577c", -1951 => x"5181f63f", -1952 => x"881654f5", -1953 => x"96397284", -1954 => x"150cf41a", -1955 => x"f8067084", -1956 => x"1d088106", -1957 => x"07841d0c", -1958 => x"701c5556", -1959 => x"850b8415", -1960 => x"0c850b88", -1961 => x"150c8f76", -1962 => x"27fdab38", -1963 => x"881b527c", -1964 => x"5184be3f", -1965 => x"80e2f40b", -1966 => x"88050880", -1967 => x"e2b8085a", -1968 => x"55fd9339", -1969 => x"7880e2b8", -1970 => x"0c7380e2", -1971 => x"e80cfbef", -1972 => x"39728415", -1973 => x"0cfcff39", -1974 => x"fb3d0d77", -1975 => x"707a7c58", -1976 => x"5553568f", -1977 => x"752780e6", -1978 => x"38727607", -1979 => x"83065170", -1980 => x"80dc3875", -1981 => x"73525470", -1982 => x"70840552", -1983 => x"08747084", -1984 => x"05560c73", -1985 => x"71708405", -1986 => x"53087170", -1987 => x"8405530c", -1988 => x"71708405", -1989 => x"53087170", -1990 => x"8405530c", -1991 => x"71708405", -1992 => x"53087170", -1993 => x"8405530c", -1994 => x"f0165654", -1995 => x"748f26c7", -1996 => x"38837527", -1997 => x"95387070", -1998 => x"84055208", -1999 => x"74708405", -2000 => x"560cfc15", -2001 => x"55748326", -2002 => x"ed387371", -2003 => x"5452ff15", -2004 => x"5170ff2e", -2005 => x"98387270", -2006 => x"81055433", -2007 => x"72708105", -2008 => x"5434ff11", -2009 => x"5170ff2e", -2010 => x"098106ea", -2011 => x"3875800c", -2012 => x"873d0d04", -2013 => x"0404fd3d", -2014 => x"0d800b81", -2015 => x"c2d40c76", -2016 => x"5187ca3f", -2017 => x"80085380", -2018 => x"08ff2e88", -2019 => x"3872800c", -2020 => x"853d0d04", -2021 => x"81c2d408", -2022 => x"5473802e", -2023 => x"f0387574", -2024 => x"710c5272", -2025 => x"800c853d", -2026 => x"0d04fb3d", -2027 => x"0d777970", -2028 => x"72078306", -2029 => x"53545270", -2030 => x"93387173", -2031 => x"73085456", -2032 => x"54717308", -2033 => x"2e80c438", -2034 => x"73755452", -2035 => x"71337081", -2036 => x"ff065254", -2037 => x"70802e9d", -2038 => x"38723355", -2039 => x"70752e09", -2040 => x"81069538", -2041 => x"81128114", -2042 => x"71337081", -2043 => x"ff065456", -2044 => x"545270e5", -2045 => x"38723355", -2046 => x"7381ff06", -2047 => x"7581ff06", -2048 => x"71713180", -2049 => x"0c555287", -2050 => x"3d0d0471", -2051 => x"09f7fbfd", -2052 => x"ff1306f8", -2053 => x"84828180", -2054 => x"06527197", -2055 => x"38841484", -2056 => x"16710854", -2057 => x"56547175", -2058 => x"082ee038", -2059 => x"73755452", -2060 => x"ff9a3980", -2061 => x"0b800c87", -2062 => x"3d0d04fb", -2063 => x"3d0d7770", -2064 => x"5256feb0", -2065 => x"3f80e2f4", -2066 => x"0b880508", -2067 => x"841108fc", -2068 => x"06707b31", -2069 => x"9fef05e0", -2070 => x"8006e080", -2071 => x"05525555", -2072 => x"a0807524", -2073 => x"94388052", -2074 => x"7551fe8a", -2075 => x"3f80e2fc", -2076 => x"08145372", -2077 => x"80082e8f", -2078 => x"387551fd", -2079 => x"f83f8053", -2080 => x"72800c87", -2081 => x"3d0d0474", -2082 => x"30527551", -2083 => x"fde83f80", -2084 => x"08ff2ea8", -2085 => x"3880e2f4", -2086 => x"0b880508", -2087 => x"74763181", -2088 => x"0784120c", -2089 => x"5380e2b8", -2090 => x"08753180", -2091 => x"e2b80c75", -2092 => x"51fdc23f", -2093 => x"810b800c", -2094 => x"873d0d04", -2095 => x"80527551", -2096 => x"fdb43f80", -2097 => x"e2f40b88", -2098 => x"05088008", -2099 => x"71315454", -2100 => x"8f7325ff", -2101 => x"a4388008", -2102 => x"80e2e808", -2103 => x"3180e2b8", -2104 => x"0c728107", -2105 => x"84150c75", -2106 => x"51fd8a3f", -2107 => x"8053ff90", -2108 => x"39f73d0d", -2109 => x"7b7d545a", -2110 => x"72802e82", -2111 => x"83387951", -2112 => x"fcf23ff8", -2113 => x"13841108", -2114 => x"70fe0670", -2115 => x"13841108", -2116 => x"fc065c57", -2117 => x"58545780", -2118 => x"e2fc0874", -2119 => x"2e82de38", -2120 => x"7784150c", -2121 => x"80738106", -2122 => x"56597479", -2123 => x"2e81d538", -2124 => x"77148411", -2125 => x"08810656", -2126 => x"5374a038", -2127 => x"77165678", -2128 => x"81e63888", -2129 => x"14085574", -2130 => x"80e2fc2e", -2131 => x"82f9388c", -2132 => x"1408708c", -2133 => x"170c7588", -2134 => x"120c5875", -2135 => x"81078418", -2136 => x"0c751776", -2137 => x"710c5478", -2138 => x"81913883", -2139 => x"ff762781", -2140 => x"c8387589", -2141 => x"2a76832a", -2142 => x"54547380", -2143 => x"2ebf3875", -2144 => x"862ab805", -2145 => x"53847427", -2146 => x"b43880db", -2147 => x"14539474", -2148 => x"27ab3875", -2149 => x"8c2a80ee", -2150 => x"055380d4", -2151 => x"74279e38", -2152 => x"758f2a80", -2153 => x"f7055382", -2154 => x"d4742791", -2155 => x"3875922a", -2156 => x"80fc0553", -2157 => x"8ad47427", -2158 => x"843880fe", -2159 => x"53721010", -2160 => x"1080e2f4", -2161 => x"05881108", -2162 => x"55557375", -2163 => x"2e82bf38", -2164 => x"841408fc", -2165 => x"06597579", -2166 => x"278d3888", -2167 => x"14085473", -2168 => x"752e0981", -2169 => x"06ea388c", -2170 => x"1408708c", -2171 => x"190c7488", -2172 => x"190c7788", -2173 => x"120c5576", -2174 => x"8c150c79", -2175 => x"51faf63f", -2176 => x"8b3d0d04", -2177 => x"76087771", -2178 => x"31587605", -2179 => x"88180856", -2180 => x"567480e2", -2181 => x"fc2e80e0", -2182 => x"388c1708", -2183 => x"708c170c", -2184 => x"7588120c", -2185 => x"53fe8939", -2186 => x"8814088c", -2187 => x"1508708c", -2188 => x"130c5988", -2189 => x"190cfea3", -2190 => x"3975832a", -2191 => x"70545480", -2192 => x"74248198", -2193 => x"3872822c", -2194 => x"81712b80", -2195 => x"e2f80807", -2196 => x"80e2f40b", -2197 => x"84050c74", -2198 => x"10101080", -2199 => x"e2f40588", -2200 => x"1108718c", -2201 => x"1b0c7088", -2202 => x"1b0c7988", -2203 => x"130c565a", -2204 => x"55768c15", -2205 => x"0cff8439", -2206 => x"8159fdb4", -2207 => x"39771673", -2208 => x"81065455", -2209 => x"72983876", -2210 => x"08777131", -2211 => x"5875058c", -2212 => x"18088819", -2213 => x"08718c12", -2214 => x"0c88120c", -2215 => x"55557481", -2216 => x"0784180c", -2217 => x"7680e2f4", -2218 => x"0b88050c", -2219 => x"80e2f008", -2220 => x"7526fec7", -2221 => x"3880e2ec", -2222 => x"08527951", -2223 => x"fafd3f79", -2224 => x"51f9b23f", -2225 => x"feba3981", -2226 => x"778c170c", -2227 => x"7788170c", -2228 => x"758c190c", -2229 => x"7588190c", -2230 => x"59fd8039", -2231 => x"83147082", -2232 => x"2c81712b", -2233 => x"80e2f808", -2234 => x"0780e2f4", -2235 => x"0b84050c", -2236 => x"75101010", -2237 => x"80e2f405", -2238 => x"88110871", -2239 => x"8c1c0c70", -2240 => x"881c0c7a", -2241 => x"88130c57", -2242 => x"5b5653fe", -2243 => x"e4398073", -2244 => x"24a33872", -2245 => x"822c8171", -2246 => x"2b80e2f8", -2247 => x"080780e2", -2248 => x"f40b8405", -2249 => x"0c58748c", -2250 => x"180c7388", -2251 => x"180c7688", -2252 => x"160cfdc3", -2253 => x"39831370", -2254 => x"822c8171", -2255 => x"2b80e2f8", -2256 => x"080780e2", -2257 => x"f40b8405", -2258 => x"0c5953da", -2259 => x"39fe3d0d", -2260 => x"81c2d808", -2261 => x"51708a38", -2262 => x"81c2e070", -2263 => x"81c2d80c", -2264 => x"51741152", -2265 => x"ff537187", -2266 => x"fb808026", -2267 => x"88387181", -2268 => x"c2d80c70", -2269 => x"5372800c", -2270 => x"843d0d04", -2271 => x"fd3d0d80", -2272 => x"0b80e2a4", -2273 => x"08545472", -2274 => x"812e9b38", -2275 => x"7381c2dc", -2276 => x"0cc28e3f", -2277 => x"c0ea3f80", -2278 => x"f1fc5281", -2279 => x"51caf83f", -2280 => x"80085189", -2281 => x"a73f7281", -2282 => x"c2dc0cc1", -2283 => x"f43fc0d0", -2284 => x"3f80f1fc", -2285 => x"528151ca", -2286 => x"de3f8008", -2287 => x"51898d3f", -2288 => x"00ff3900", -2289 => x"ff39f53d", -2290 => x"0d7e6081", -2291 => x"c2dc0870", -2292 => x"5b585b5b", -2293 => x"7580c238", -2294 => x"777a25a1", -2295 => x"38771b70", -2296 => x"337081ff", -2297 => x"06585859", -2298 => x"758a2e98", -2299 => x"387681ff", -2300 => x"0651c18c", -2301 => x"3f811858", -2302 => x"797824e1", -2303 => x"3879800c", -2304 => x"8d3d0d04", -2305 => x"8d51c0f8", -2306 => x"3f783370", -2307 => x"81ff0652", -2308 => x"57c0ed3f", -2309 => x"811858e0", -2310 => x"3979557a", -2311 => x"547d5385", -2312 => x"528d3dfc", -2313 => x"0551c09a", -2314 => x"3f800856", -2315 => x"88973f7b", -2316 => x"80080c75", -2317 => x"800c8d3d", -2318 => x"0d04f63d", -2319 => x"0d7d7f81", -2320 => x"c2dc0870", -2321 => x"5a585a5a", -2322 => x"7580c338", -2323 => x"767925b1", -2324 => x"38761a58", -2325 => x"c08a3f80", -2326 => x"08783480", -2327 => x"0b800881", -2328 => x"ff065758", -2329 => x"758a2ea2", -2330 => x"38758d32", -2331 => x"70307080", -2332 => x"257a0751", -2333 => x"515675b8", -2334 => x"38811757", -2335 => x"787724d1", -2336 => x"38765675", -2337 => x"800c8c3d", -2338 => x"0d048158", -2339 => x"dc397855", -2340 => x"79547c53", -2341 => x"84528c3d", -2342 => x"fc0551ff", -2343 => x"bfa43f80", -2344 => x"085687a1", -2345 => x"3f7a8008", -2346 => x"0c75800c", -2347 => x"8c3d0d04", -2348 => x"811756cf", -2349 => x"39f93d0d", -2350 => x"795781c2", -2351 => x"dc08802e", -2352 => x"ad387651", -2353 => x"89b43f7b", -2354 => x"567a5580", -2355 => x"08810554", -2356 => x"76538252", -2357 => x"893dfc05", -2358 => x"51ffbee6", -2359 => x"3f800857", -2360 => x"86e33f77", -2361 => x"80080c76", -2362 => x"800c893d", -2363 => x"0d0486d5", -2364 => x"3f850b80", -2365 => x"080cff0b", -2366 => x"800c893d", -2367 => x"0d04fb3d", -2368 => x"0d81c2dc", -2369 => x"08705654", -2370 => x"73883874", -2371 => x"800c873d", -2372 => x"0d047753", -2373 => x"8352873d", -2374 => x"fc0551ff", -2375 => x"bea43f80", -2376 => x"085486a1", -2377 => x"3f758008", -2378 => x"0c73800c", -2379 => x"873d0d04", -2380 => x"ff0b800c", -2381 => x"04fb3d0d", -2382 => x"775581c2", -2383 => x"dc08802e", -2384 => x"a9387451", -2385 => x"88b43f80", -2386 => x"08810554", -2387 => x"74538752", -2388 => x"873dfc05", -2389 => x"51ffbdea", -2390 => x"3f800855", -2391 => x"85e73f75", -2392 => x"80080c74", -2393 => x"800c873d", -2394 => x"0d0485d9", -2395 => x"3f850b80", -2396 => x"080cff0b", -2397 => x"800c873d", -2398 => x"0d04fa3d", -2399 => x"0d81c2dc", -2400 => x"08802ea3", -2401 => x"387a5579", -2402 => x"54785386", -2403 => x"52883dfc", -2404 => x"0551ffbd", -2405 => x"ad3f8008", -2406 => x"5685aa3f", -2407 => x"7680080c", -2408 => x"75800c88", -2409 => x"3d0d0485", -2410 => x"9c3f9d0b", -2411 => x"80080cff", -2412 => x"0b800c88", -2413 => x"3d0d04f7", -2414 => x"3d0d7b7d", -2415 => x"5b59bc53", -2416 => x"80527951", -2417 => x"86aa3f80", -2418 => x"70565798", -2419 => x"56741970", -2420 => x"3370782b", -2421 => x"79078118", -2422 => x"f81a5a58", -2423 => x"59555884", -2424 => x"7524ea38", -2425 => x"767a2384", -2426 => x"19588070", -2427 => x"56579856", -2428 => x"74187033", -2429 => x"70782b79", -2430 => x"078118f8", -2431 => x"1a5a5859", -2432 => x"51548475", -2433 => x"24ea3876", -2434 => x"821b2388", -2435 => x"19588070", -2436 => x"56579856", -2437 => x"74187033", -2438 => x"70782b79", -2439 => x"078118f8", -2440 => x"1a5a5859", -2441 => x"51548475", -2442 => x"24ea3876", -2443 => x"841b0c8c", -2444 => x"19588070", -2445 => x"56579856", -2446 => x"74187033", -2447 => x"70782b79", -2448 => x"078118f8", -2449 => x"1a5a5859", -2450 => x"51548475", -2451 => x"24ea3876", -2452 => x"881b2390", -2453 => x"19588070", -2454 => x"56579856", -2455 => x"74187033", -2456 => x"70782b79", -2457 => x"078118f8", -2458 => x"1a5a5859", -2459 => x"51548475", -2460 => x"24ea3876", -2461 => x"8a1b2394", -2462 => x"19588070", -2463 => x"56579856", -2464 => x"74187033", -2465 => x"70782b79", -2466 => x"078118f8", -2467 => x"1a5a5859", -2468 => x"51548475", -2469 => x"24ea3876", -2470 => x"8c1b2398", -2471 => x"19588070", -2472 => x"56579856", -2473 => x"74187033", -2474 => x"70782b79", -2475 => x"078118f8", -2476 => x"1a5a5859", -2477 => x"51548475", -2478 => x"24ea3876", -2479 => x"8e1b239c", -2480 => x"19588070", -2481 => x"5657b856", -2482 => x"74187033", -2483 => x"70782b79", -2484 => x"078118f8", -2485 => x"1a5a5859", -2486 => x"5a548875", -2487 => x"24ea3876", -2488 => x"901b0c8b", -2489 => x"3d0d04e9", -2490 => x"3d0d6a81", -2491 => x"c2dc0857", -2492 => x"57759338", -2493 => x"80c0800b", -2494 => x"84180c75", -2495 => x"ac180c75", -2496 => x"800c993d", -2497 => x"0d04893d", -2498 => x"70556a54", -2499 => x"558a5299", -2500 => x"3dffbc05", -2501 => x"51ffbaaa", -2502 => x"3f800877", -2503 => x"53755256", -2504 => x"fd953f82", -2505 => x"a03f7780", -2506 => x"080c7580", -2507 => x"0c993d0d", -2508 => x"04e93d0d", -2509 => x"695781c2", -2510 => x"dc08802e", -2511 => x"b6387651", -2512 => x"84b83f89", -2513 => x"3d705680", -2514 => x"08810555", -2515 => x"7754568f", -2516 => x"52993dff", -2517 => x"bc0551ff", -2518 => x"b9e83f80", -2519 => x"086b5376", -2520 => x"5257fcd3", -2521 => x"3f81de3f", -2522 => x"7780080c", -2523 => x"76800c99", -2524 => x"3d0d0481", -2525 => x"d03f850b", -2526 => x"80080cff", -2527 => x"0b800c99", -2528 => x"3d0d04fc", -2529 => x"3d0d8154", -2530 => x"81c2dc08", -2531 => x"88387380", -2532 => x"0c863d0d", -2533 => x"04765397", -2534 => x"b952863d", -2535 => x"fc0551ff", -2536 => x"b9a03f80", -2537 => x"0854819d", -2538 => x"3f748008", -2539 => x"0c73800c", -2540 => x"863d0d04", -2541 => x"f43d0d7e", -2542 => x"80f2a808", -2543 => x"700881ff", -2544 => x"06913df8", -2545 => x"05545159", -2546 => x"59ffbac5", -2547 => x"3f775780", -2548 => x"5476557b", -2549 => x"7d585276", -2550 => x"538e3df0", -2551 => x"0551d6a0", -2552 => x"3f797b58", -2553 => x"790c7684", -2554 => x"1a0c7880", -2555 => x"0c8e3d0d", -2556 => x"04f43d0d", -2557 => x"7e80f2a8", -2558 => x"08700870", -2559 => x"81ff0692", -2560 => x"3df80555", -2561 => x"515a5759", -2562 => x"ffba863f", -2563 => x"7757800b", -2564 => x"8b3d5954", -2565 => x"76557b7d", -2566 => x"58527653", -2567 => x"7751d5e0", -2568 => x"3f8056bd", -2569 => x"84c07655", -2570 => x"55797b58", -2571 => x"52765377", -2572 => x"51d5cd3f", -2573 => x"7a577880", -2574 => x"2e843876", -2575 => x"790c7680", -2576 => x"0c8e3d0d", -2577 => x"0480eafc", -2578 => x"08800c04", -2579 => x"f73d0d7b", -2580 => x"80eafc08", -2581 => x"82c81108", -2582 => x"5a545a77", -2583 => x"802e80da", -2584 => x"38818818", -2585 => x"841908ff", -2586 => x"0581712b", -2587 => x"59555980", -2588 => x"742480ea", -2589 => x"38807424", -2590 => x"b5387382", -2591 => x"2b781188", -2592 => x"05565681", -2593 => x"80190877", -2594 => x"06537280", -2595 => x"2eb63878", -2596 => x"16700853", -2597 => x"53795174", -2598 => x"0853722d", -2599 => x"ff14fc17", -2600 => x"fc177981", -2601 => x"2c5a5757", -2602 => x"54738025", -2603 => x"d6387708", -2604 => x"5877ffad", -2605 => x"3880eafc", -2606 => x"0853bc13", -2607 => x"08a53879", -2608 => x"51f5fd3f", -2609 => x"74085372", -2610 => x"2dff14fc", -2611 => x"17fc1779", -2612 => x"812c5a57", -2613 => x"57547380", -2614 => x"25ffa838", -2615 => x"d1398057", -2616 => x"ff933972", -2617 => x"51bc1308", -2618 => x"54732d79", -2619 => x"51f5d13f", -2620 => x"fb3d0d77", -2621 => x"7a71028c", -2622 => x"05a30533", -2623 => x"58545456", -2624 => x"83732780", -2625 => x"d4387583", -2626 => x"06517080", -2627 => x"cc387488", -2628 => x"2b750770", -2629 => x"71902b07", -2630 => x"55518f73", -2631 => x"27a73873", -2632 => x"72708405", -2633 => x"540c7174", -2634 => x"71708405", -2635 => x"530c7471", -2636 => x"70840553", -2637 => x"0c747170", -2638 => x"8405530c", -2639 => x"f0145452", -2640 => x"728f26db", -2641 => x"38837327", -2642 => x"90387372", -2643 => x"70840554", -2644 => x"0cfc1353", -2645 => x"728326f2", -2646 => x"38ff1351", -2647 => x"70ff2e93", -2648 => x"38747270", -2649 => x"81055434", -2650 => x"ff115170", -2651 => x"ff2e0981", -2652 => x"06ef3875", -2653 => x"800c873d", -2654 => x"0d04fd3d", -2655 => x"0d757071", -2656 => x"83065355", -2657 => x"5270b438", -2658 => x"71700870", -2659 => x"09f7fbfd", -2660 => x"ff1206f8", -2661 => x"84828180", -2662 => x"06545253", -2663 => x"719b3884", -2664 => x"13700870", -2665 => x"09f7fbfd", -2666 => x"ff1206f8", -2667 => x"84828180", -2668 => x"06545253", -2669 => x"71802ee7", -2670 => x"38725271", -2671 => x"33537280", -2672 => x"2e8a3881", -2673 => x"12703354", -2674 => x"5272f838", -2675 => x"71743180", -2676 => x"0c853d0d", -2677 => x"04ff3d0d", -2678 => x"80f2840b", -2679 => x"fc057008", -2680 => x"525270ff", -2681 => x"2e913870", -2682 => x"2dfc1270", -2683 => x"08525270", -2684 => x"ff2e0981", -2685 => x"06f13883", -2686 => x"3d0d0404", -2687 => x"ffb7a63f", -2688 => x"04000000", -2689 => x"30313233", -2690 => x"34353637", -2691 => x"38390000", -2692 => x"44485259", -2693 => x"53544f4e", -2694 => x"45205052", -2695 => x"4f475241", -2696 => x"4d2c2053", -2697 => x"4f4d4520", -2698 => x"53545249", -2699 => x"4e470000", -2700 => x"44485259", -2701 => x"53544f4e", -2702 => x"45205052", -2703 => x"4f475241", -2704 => x"4d2c2031", -2705 => x"27535420", -2706 => x"53545249", -2707 => x"4e470000", -2708 => x"44687279", -2709 => x"73746f6e", -2710 => x"65204265", -2711 => x"6e63686d", -2712 => x"61726b2c", -2713 => x"20566572", -2714 => x"73696f6e", -2715 => x"20322e31", -2716 => x"20284c61", -2717 => x"6e677561", -2718 => x"67653a20", -2719 => x"43290a00", -2720 => x"50726f67", -2721 => x"72616d20", -2722 => x"636f6d70", -2723 => x"696c6564", -2724 => x"20776974", -2725 => x"68202772", -2726 => x"65676973", -2727 => x"74657227", -2728 => x"20617474", -2729 => x"72696275", -2730 => x"74650a00", -2731 => x"45786563", -2732 => x"7574696f", -2733 => x"6e207374", -2734 => x"61727473", -2735 => x"2c202564", -2736 => x"2072756e", -2737 => x"73207468", -2738 => x"726f7567", -2739 => x"68204468", -2740 => x"72797374", -2741 => x"6f6e650a", -2742 => x"00000000", -2743 => x"44485259", -2744 => x"53544f4e", -2745 => x"45205052", -2746 => x"4f475241", -2747 => x"4d2c2032", -2748 => x"274e4420", -2749 => x"53545249", -2750 => x"4e470000", -2751 => x"45786563", -2752 => x"7574696f", -2753 => x"6e20656e", -2754 => x"64730a00", -2755 => x"46696e61", -2756 => x"6c207661", -2757 => x"6c756573", -2758 => x"206f6620", -2759 => x"74686520", -2760 => x"76617269", -2761 => x"61626c65", -2762 => x"73207573", -2763 => x"65642069", -2764 => x"6e207468", -2765 => x"65206265", -2766 => x"6e63686d", -2767 => x"61726b3a", -2768 => x"0a000000", -2769 => x"496e745f", -2770 => x"476c6f62", -2771 => x"3a202020", -2772 => x"20202020", -2773 => x"20202020", -2774 => x"2025640a", -2775 => x"00000000", -2776 => x"20202020", -2777 => x"20202020", -2778 => x"73686f75", -2779 => x"6c642062", -2780 => x"653a2020", -2781 => x"2025640a", -2782 => x"00000000", -2783 => x"426f6f6c", -2784 => x"5f476c6f", -2785 => x"623a2020", -2786 => x"20202020", -2787 => x"20202020", -2788 => x"2025640a", -2789 => x"00000000", -2790 => x"43685f31", -2791 => x"5f476c6f", -2792 => x"623a2020", -2793 => x"20202020", -2794 => x"20202020", -2795 => x"2025630a", -2796 => x"00000000", -2797 => x"20202020", -2798 => x"20202020", -2799 => x"73686f75", -2800 => x"6c642062", -2801 => x"653a2020", -2802 => x"2025630a", -2803 => x"00000000", -2804 => x"43685f32", -2805 => x"5f476c6f", -2806 => x"623a2020", -2807 => x"20202020", -2808 => x"20202020", -2809 => x"2025630a", -2810 => x"00000000", -2811 => x"4172725f", -2812 => x"315f476c", -2813 => x"6f625b38", -2814 => x"5d3a2020", -2815 => x"20202020", -2816 => x"2025640a", -2817 => x"00000000", -2818 => x"4172725f", -2819 => x"325f476c", -2820 => x"6f625b38", -2821 => x"5d5b375d", -2822 => x"3a202020", -2823 => x"2025640a", -2824 => x"00000000", -2825 => x"20202020", -2826 => x"20202020", -2827 => x"73686f75", -2828 => x"6c642062", -2829 => x"653a2020", -2830 => x"204e756d", -2831 => x"6265725f", -2832 => x"4f665f52", -2833 => x"756e7320", -2834 => x"2b203130", -2835 => x"0a000000", -2836 => x"5074725f", -2837 => x"476c6f62", -2838 => x"2d3e0a00", -2839 => x"20205074", -2840 => x"725f436f", -2841 => x"6d703a20", -2842 => x"20202020", -2843 => x"20202020", -2844 => x"2025640a", -2845 => x"00000000", -2846 => x"20202020", -2847 => x"20202020", -2848 => x"73686f75", -2849 => x"6c642062", -2850 => x"653a2020", -2851 => x"2028696d", -2852 => x"706c656d", -2853 => x"656e7461", -2854 => x"74696f6e", -2855 => x"2d646570", -2856 => x"656e6465", -2857 => x"6e74290a", -2858 => x"00000000", -2859 => x"20204469", -2860 => x"7363723a", -2861 => x"20202020", -2862 => x"20202020", -2863 => x"20202020", -2864 => x"2025640a", -2865 => x"00000000", -2866 => x"2020456e", -2867 => x"756d5f43", -2868 => x"6f6d703a", -2869 => x"20202020", -2870 => x"20202020", -2871 => x"2025640a", -2872 => x"00000000", -2873 => x"2020496e", -2874 => x"745f436f", -2875 => x"6d703a20", -2876 => x"20202020", -2877 => x"20202020", -2878 => x"2025640a", -2879 => x"00000000", -2880 => x"20205374", -2881 => x"725f436f", -2882 => x"6d703a20", -2883 => x"20202020", -2884 => x"20202020", -2885 => x"2025730a", -2886 => x"00000000", -2887 => x"20202020", -2888 => x"20202020", -2889 => x"73686f75", -2890 => x"6c642062", -2891 => x"653a2020", -2892 => x"20444852", -2893 => x"5953544f", -2894 => x"4e452050", -2895 => x"524f4752", -2896 => x"414d2c20", -2897 => x"534f4d45", -2898 => x"20535452", -2899 => x"494e470a", -2900 => x"00000000", -2901 => x"4e657874", -2902 => x"5f507472", -2903 => x"5f476c6f", -2904 => x"622d3e0a", -2905 => x"00000000", -2906 => x"20202020", -2907 => x"20202020", -2908 => x"73686f75", -2909 => x"6c642062", -2910 => x"653a2020", -2911 => x"2028696d", -2912 => x"706c656d", -2913 => x"656e7461", -2914 => x"74696f6e", -2915 => x"2d646570", -2916 => x"656e6465", -2917 => x"6e74292c", -2918 => x"2073616d", -2919 => x"65206173", -2920 => x"2061626f", -2921 => x"76650a00", -2922 => x"496e745f", -2923 => x"315f4c6f", -2924 => x"633a2020", -2925 => x"20202020", -2926 => x"20202020", -2927 => x"2025640a", -2928 => x"00000000", -2929 => x"496e745f", -2930 => x"325f4c6f", -2931 => x"633a2020", -2932 => x"20202020", -2933 => x"20202020", -2934 => x"2025640a", -2935 => x"00000000", -2936 => x"496e745f", -2937 => x"335f4c6f", -2938 => x"633a2020", -2939 => x"20202020", -2940 => x"20202020", -2941 => x"2025640a", -2942 => x"00000000", -2943 => x"456e756d", -2944 => x"5f4c6f63", -2945 => x"3a202020", -2946 => x"20202020", -2947 => x"20202020", -2948 => x"2025640a", -2949 => x"00000000", -2950 => x"5374725f", -2951 => x"315f4c6f", -2952 => x"633a2020", -2953 => x"20202020", -2954 => x"20202020", -2955 => x"2025730a", -2956 => x"00000000", -2957 => x"20202020", -2958 => x"20202020", -2959 => x"73686f75", -2960 => x"6c642062", -2961 => x"653a2020", -2962 => x"20444852", -2963 => x"5953544f", -2964 => x"4e452050", -2965 => x"524f4752", -2966 => x"414d2c20", -2967 => x"31275354", -2968 => x"20535452", -2969 => x"494e470a", -2970 => x"00000000", -2971 => x"5374725f", -2972 => x"325f4c6f", -2973 => x"633a2020", -2974 => x"20202020", -2975 => x"20202020", -2976 => x"2025730a", -2977 => x"00000000", -2978 => x"20202020", -2979 => x"20202020", -2980 => x"73686f75", -2981 => x"6c642062", -2982 => x"653a2020", -2983 => x"20444852", -2984 => x"5953544f", -2985 => x"4e452050", -2986 => x"524f4752", -2987 => x"414d2c20", -2988 => x"32274e44", -2989 => x"20535452", -2990 => x"494e470a", -2991 => x"00000000", -2992 => x"55736572", -2993 => x"2074696d", -2994 => x"653a2025", -2995 => x"640a0000", -2996 => x"4d696372", -2997 => x"6f736563", -2998 => x"6f6e6473", -2999 => x"20666f72", -3000 => x"206f6e65", -3001 => x"2072756e", -3002 => x"20746872", -3003 => x"6f756768", -3004 => x"20446872", -3005 => x"7973746f", -3006 => x"6e653a20", -3007 => x"00000000", -3008 => x"2564200a", -3009 => x"00000000", -3010 => x"44687279", -3011 => x"73746f6e", -3012 => x"65732070", -3013 => x"65722053", -3014 => x"65636f6e", -3015 => x"643a2020", -3016 => x"20202020", -3017 => x"20202020", -3018 => x"20202020", -3019 => x"20202020", -3020 => x"20202020", -3021 => x"00000000", -3022 => x"56415820", -3023 => x"4d495053", -3024 => x"20726174", -3025 => x"696e6720", -3026 => x"2a203130", -3027 => x"3030203d", -3028 => x"20256420", -3029 => x"0a000000", -3030 => x"50726f67", -3031 => x"72616d20", -3032 => x"636f6d70", -3033 => x"696c6564", -3034 => x"20776974", -3035 => x"686f7574", -3036 => x"20277265", -3037 => x"67697374", -3038 => x"65722720", -3039 => x"61747472", -3040 => x"69627574", -3041 => x"650a0000", -3042 => x"4d656173", -3043 => x"75726564", -3044 => x"2074696d", -3045 => x"6520746f", -3046 => x"6f20736d", -3047 => x"616c6c20", -3048 => x"746f206f", -3049 => x"62746169", -3050 => x"6e206d65", -3051 => x"616e696e", -3052 => x"6766756c", -3053 => x"20726573", -3054 => x"756c7473", -3055 => x"0a000000", -3056 => x"506c6561", -3057 => x"73652069", -3058 => x"6e637265", -3059 => x"61736520", -3060 => x"6e756d62", -3061 => x"6572206f", -3062 => x"66207275", -3063 => x"6e730a00", -3064 => x"44485259", -3065 => x"53544f4e", -3066 => x"45205052", -3067 => x"4f475241", -3068 => x"4d2c2033", -3069 => x"27524420", -3070 => x"53545249", -3071 => x"4e470000", -3072 => x"00010202", -3073 => x"03030303", -3074 => x"04040404", -3075 => x"04040404", -3076 => x"05050505", -3077 => x"05050505", -3078 => x"05050505", -3079 => x"05050505", -3080 => x"06060606", -3081 => x"06060606", -3082 => x"06060606", -3083 => x"06060606", -3084 => x"06060606", -3085 => x"06060606", -3086 => x"06060606", -3087 => x"06060606", -3088 => x"07070707", -3089 => x"07070707", -3090 => x"07070707", -3091 => x"07070707", -3092 => x"07070707", -3093 => x"07070707", -3094 => x"07070707", -3095 => x"07070707", -3096 => x"07070707", -3097 => x"07070707", -3098 => x"07070707", -3099 => x"07070707", -3100 => x"07070707", -3101 => x"07070707", -3102 => x"07070707", -3103 => x"07070707", -3104 => x"08080808", -3105 => x"08080808", -3106 => x"08080808", -3107 => x"08080808", -3108 => x"08080808", -3109 => x"08080808", -3110 => x"08080808", -3111 => x"08080808", -3112 => x"08080808", -3113 => x"08080808", -3114 => x"08080808", -3115 => x"08080808", -3116 => x"08080808", -3117 => x"08080808", -3118 => x"08080808", -3119 => x"08080808", -3120 => x"08080808", -3121 => x"08080808", -3122 => x"08080808", -3123 => x"08080808", -3124 => x"08080808", -3125 => x"08080808", -3126 => x"08080808", -3127 => x"08080808", -3128 => x"08080808", -3129 => x"08080808", -3130 => x"08080808", -3131 => x"08080808", -3132 => x"08080808", -3133 => x"08080808", -3134 => x"08080808", -3135 => x"08080808", -3136 => x"43000000", -3137 => x"64756d6d", -3138 => x"792e6578", -3139 => x"65000000", -3140 => x"00ffffff", -3141 => x"ff00ffff", -3142 => x"ffff00ff", -3143 => x"ffffff00", +288 => x"80d5f008", +289 => x"802ea438", +290 => x"80d5f408", +291 => x"822ebd38", +292 => x"8380800b", +293 => x"0b0b80e5", +294 => x"e40c82a0", +295 => x"800b80e5", +296 => x"e80c8290", +297 => x"800b80e5", +298 => x"ec0c04f8", +299 => x"808080a4", +300 => x"0b0b0b80", +301 => x"e5e40cf8", +302 => x"80808280", +303 => x"0b80e5e8", +304 => x"0cf88080", +305 => x"84800b80", +306 => x"e5ec0c04", +307 => x"80c0a880", +308 => x"8c0b0b0b", +309 => x"80e5e40c", +310 => x"80c0a880", +311 => x"940b80e5", +312 => x"e80c0b0b", +313 => x"80c7d00b", +314 => x"80e5ec0c", +315 => x"04f23d0d", +316 => x"6080e5e8", +317 => x"08565d82", +318 => x"750c8059", +319 => x"805a800b", +320 => x"8f3d5d5b", +321 => x"7a101015", +322 => x"70087108", +323 => x"719f2c7e", +324 => x"852b5855", +325 => x"557d5359", +326 => x"5799993f", +327 => x"7d7f7a72", +328 => x"077c7207", +329 => x"71716081", +330 => x"05415f5d", +331 => x"5b595755", +332 => x"817b278f", +333 => x"38767d0c", +334 => x"77841e0c", +335 => x"7c800c90", +336 => x"3d0d0480", +337 => x"e5e80855", +338 => x"ffba3970", +339 => x"7080e5f0", +340 => x"335170a7", +341 => x"3880d5fc", +342 => x"08700852", +343 => x"5270802e", +344 => x"94388412", +345 => x"80d5fc0c", +346 => x"702d80d5", +347 => x"fc087008", +348 => x"525270ee", +349 => x"38810b80", +350 => x"e5f03450", +351 => x"50040470", +352 => x"0b0b80e5", +353 => x"e008802e", +354 => x"8e380b0b", +355 => x"0b0b800b", +356 => x"802e0981", +357 => x"06833850", +358 => x"040b0b80", +359 => x"e5e0510b", +360 => x"0b0bf4dc", +361 => x"3f500404", +362 => x"ff3d0d02", +363 => x"8f053352", +364 => x"718a2e8a", +365 => x"387151fd", +366 => x"a63f833d", +367 => x"0d048d51", +368 => x"fd9d3f71", +369 => x"51fd983f", +370 => x"833d0d04", +371 => x"ce3d0db5", +372 => x"3d707084", +373 => x"0552088b", +374 => x"a85c56a5", +375 => x"3d5e5c80", +376 => x"75708105", +377 => x"5733765b", +378 => x"55587378", +379 => x"2e80c138", +380 => x"8e3d5b73", +381 => x"a52e0981", +382 => x"0680c538", +383 => x"78708105", +384 => x"5a335473", +385 => x"80e42e81", +386 => x"b6387380", +387 => x"e42480c6", +388 => x"387380e3", +389 => x"2ea13880", +390 => x"52a55179", +391 => x"2d805273", +392 => x"51792d82", +393 => x"18587870", +394 => x"81055a33", +395 => x"5473c438", +396 => x"77800cb4", +397 => x"3d0d047b", +398 => x"841d8312", +399 => x"33565d57", +400 => x"80527351", +401 => x"792d8118", +402 => x"79708105", +403 => x"5b335558", +404 => x"73ffa038", +405 => x"db397380", +406 => x"f32e0981", +407 => x"06ffb838", +408 => x"7b841d71", +409 => x"08595d56", +410 => x"80773355", +411 => x"5673762e", +412 => x"8d388116", +413 => x"70187033", +414 => x"57555674", +415 => x"f538ff16", +416 => x"55807625", +417 => x"ffa03876", +418 => x"70810558", +419 => x"33548052", +420 => x"7351792d", +421 => x"811875ff", +422 => x"17575758", +423 => x"807625ff", +424 => x"85387670", +425 => x"81055833", +426 => x"54805273", +427 => x"51792d81", +428 => x"1875ff17", +429 => x"57575875", +430 => x"8024cc38", +431 => x"fee8397b", +432 => x"841d7108", +433 => x"70719f2c", +434 => x"5953595d", +435 => x"56807524", +436 => x"81913875", +437 => x"7d7c5856", +438 => x"54805773", +439 => x"772e0981", +440 => x"06b638b0", +441 => x"7b3402b5", +442 => x"05567a76", +443 => x"2e9738ff", +444 => x"16567533", +445 => x"75708105", +446 => x"57348117", +447 => x"577a762e", +448 => x"098106eb", +449 => x"38807534", +450 => x"767dff12", +451 => x"57585675", +452 => x"8024fef3", +453 => x"38fe8f39", +454 => x"8a527351", +455 => x"9fd03f80", +456 => x"0880c7d4", +457 => x"05337670", +458 => x"81055834", +459 => x"8a527351", +460 => x"9ef83f80", +461 => x"08548008", +462 => x"802effae", +463 => x"388a5273", +464 => x"519fab3f", +465 => x"800880c7", +466 => x"d4053376", +467 => x"70810558", +468 => x"348a5273", +469 => x"519ed33f", +470 => x"80085480", +471 => x"08ffb938", +472 => x"ff883974", +473 => x"527653b4", +474 => x"3dffb805", +475 => x"51949a3f", +476 => x"a33d0856", +477 => x"fedd3980", +478 => x"3d0d80c1", +479 => x"0b81b4bc", +480 => x"34800b81", +481 => x"b6980c70", +482 => x"800c823d", +483 => x"0d04ff3d", +484 => x"0d800b81", +485 => x"b4bc3352", +486 => x"527080c1", +487 => x"2e993871", +488 => x"81b69808", +489 => x"0781b698", +490 => x"0c80c20b", +491 => x"81b4c034", +492 => x"70800c83", +493 => x"3d0d0481", +494 => x"0b81b698", +495 => x"080781b6", +496 => x"980c80c2", +497 => x"0b81b4c0", +498 => x"3470800c", +499 => x"833d0d04", +500 => x"fd3d0d75", +501 => x"70088a05", +502 => x"535381b4", +503 => x"bc335170", +504 => x"80c12e8b", +505 => x"3873f338", +506 => x"70800c85", +507 => x"3d0d04ff", +508 => x"127081b4", +509 => x"b8083174", +510 => x"0c800c85", +511 => x"3d0d04fc", +512 => x"3d0d81b4", +513 => x"c4085574", +514 => x"802e8c38", +515 => x"76750871", +516 => x"0c81b4c4", +517 => x"0856548c", +518 => x"155381b4", +519 => x"b808528a", +520 => x"518fd43f", +521 => x"73800c86", +522 => x"3d0d04fb", +523 => x"3d0d7770", +524 => x"085656b0", +525 => x"5381b4c4", +526 => x"08527451", +527 => x"ab943f85", +528 => x"0b8c170c", +529 => x"850b8c16", +530 => x"0c750875", +531 => x"0c81b4c4", +532 => x"08547380", +533 => x"2e8a3873", +534 => x"08750c81", +535 => x"b4c40854", +536 => x"8c145381", +537 => x"b4b80852", +538 => x"8a518f8b", +539 => x"3f841508", +540 => x"ad38860b", +541 => x"8c160c88", +542 => x"15528816", +543 => x"08518e97", +544 => x"3f81b4c4", +545 => x"08700876", +546 => x"0c548c15", +547 => x"7054548a", +548 => x"52730851", +549 => x"8ee13f73", +550 => x"800c873d", +551 => x"0d047508", +552 => x"54b05373", +553 => x"527551aa", +554 => x"a93f7380", +555 => x"0c873d0d", +556 => x"04d93d0d", +557 => x"b0519dcf", +558 => x"3f800881", +559 => x"b4b40cb0", +560 => x"519dc43f", +561 => x"800881b4", +562 => x"c40c81b4", +563 => x"b4088008", +564 => x"0c800b80", +565 => x"0884050c", +566 => x"820b8008", +567 => x"88050ca8", +568 => x"0b80088c", +569 => x"050c9f53", +570 => x"80c7e052", +571 => x"80089005", +572 => x"51a9df3f", +573 => x"a13d5e9f", +574 => x"5380c880", +575 => x"527d51a9", +576 => x"d13f8a0b", +577 => x"80f2f80c", +578 => x"80d2a451", +579 => x"f9be3f80", +580 => x"c8a051f9", +581 => x"b73f80d2", +582 => x"a451f9b0", +583 => x"3f80d684", +584 => x"08802e89", +585 => x"d33880c8", +586 => x"d051f9a0", +587 => x"3f80d2a4", +588 => x"51f9993f", +589 => x"80d68008", +590 => x"5280c8fc", +591 => x"51f98d3f", +592 => x"80e69451", +593 => x"b2ff3f81", +594 => x"0b9a3d5e", +595 => x"5b800b80", +596 => x"d6800825", +597 => x"82d43890", +598 => x"3d5f80c1", +599 => x"0b81b4bc", +600 => x"34810b81", +601 => x"b6980c80", +602 => x"c20b81b4", +603 => x"c0348240", +604 => x"835a9f53", +605 => x"80c9ac52", +606 => x"7c51a8d6", +607 => x"3f814180", +608 => x"7d537e52", +609 => x"568e943f", +610 => x"8008762e", +611 => x"09810683", +612 => x"38815675", +613 => x"81b6980c", +614 => x"7f705856", +615 => x"758325a2", +616 => x"38751010", +617 => x"16fd0542", +618 => x"a93dffa4", +619 => x"05538352", +620 => x"76518cc3", +621 => x"3f7f8105", +622 => x"70417058", +623 => x"56837624", +624 => x"e0386154", +625 => x"755380e6", +626 => x"9c5281b4", +627 => x"d0518cb7", +628 => x"3f81b4c4", +629 => x"08700858", +630 => x"58b05377", +631 => x"527651a7", +632 => x"f13f850b", +633 => x"8c190c85", +634 => x"0b8c180c", +635 => x"7708770c", +636 => x"81b4c408", +637 => x"5675802e", +638 => x"8a387508", +639 => x"770c81b4", +640 => x"c408568c", +641 => x"165381b4", +642 => x"b808528a", +643 => x"518be83f", +644 => x"84170887", +645 => x"ea38860b", +646 => x"8c180c88", +647 => x"17528818", +648 => x"08518af3", +649 => x"3f81b4c4", +650 => x"08700878", +651 => x"0c568c17", +652 => x"7054598a", +653 => x"52780851", +654 => x"8bbd3f80", +655 => x"c10b81b4", +656 => x"c0335757", +657 => x"767626a2", +658 => x"3880c352", +659 => x"76518ca1", +660 => x"3f800861", +661 => x"2e89e438", +662 => x"81177081", +663 => x"ff0681b4", +664 => x"c0335858", +665 => x"58757727", +666 => x"e0387960", +667 => x"29627054", +668 => x"71535b59", +669 => x"98b43f80", +670 => x"0840787a", +671 => x"31708729", +672 => x"80083180", +673 => x"088a0581", +674 => x"b4bc3381", +675 => x"b4b8085e", +676 => x"5b525a56", +677 => x"7780c12e", +678 => x"89ce387b", +679 => x"f738811b", +680 => x"5b80d680", +681 => x"087b25fd", +682 => x"b13881b4", +683 => x"ac51b095", +684 => x"3f80c9cc", +685 => x"51f6953f", +686 => x"80d2a451", +687 => x"f68e3f80", +688 => x"c9dc51f6", +689 => x"873f80d2", +690 => x"a451f680", +691 => x"3f81b4b8", +692 => x"085280ca", +693 => x"9451f5f4", +694 => x"3f855280", +695 => x"cab051f5", +696 => x"eb3f81b6", +697 => x"98085280", +698 => x"cacc51f5", +699 => x"df3f8152", +700 => x"80cab051", +701 => x"f5d63f81", +702 => x"b4bc3352", +703 => x"80cae851", +704 => x"f5ca3f80", +705 => x"c15280cb", +706 => x"8451f5c0", +707 => x"3f81b4c0", +708 => x"335280cb", +709 => x"a051f5b4", +710 => x"3f80c252", +711 => x"80cb8451", +712 => x"f5aa3f81", +713 => x"b4f00852", +714 => x"80cbbc51", +715 => x"f59e3f87", +716 => x"5280cab0", +717 => x"51f5953f", +718 => x"80f2f808", +719 => x"5280cbd8", +720 => x"51f5893f", +721 => x"80cbf451", +722 => x"f5823f80", +723 => x"cca051f4", +724 => x"fb3f81b4", +725 => x"c4087008", +726 => x"535a80cc", +727 => x"ac51f4ec", +728 => x"3f80ccc8", +729 => x"51f4e53f", +730 => x"81b4c408", +731 => x"84110853", +732 => x"5680ccfc", +733 => x"51f4d53f", +734 => x"805280ca", +735 => x"b051f4cc", +736 => x"3f81b4c4", +737 => x"08881108", +738 => x"535880cd", +739 => x"9851f4bc", +740 => x"3f825280", +741 => x"cab051f4", +742 => x"b33f81b4", +743 => x"c4088c11", +744 => x"08535780", +745 => x"cdb451f4", +746 => x"a33f9152", +747 => x"80cab051", +748 => x"f49a3f81", +749 => x"b4c40890", +750 => x"055280cd", +751 => x"d051f48c", +752 => x"3f80cdec", +753 => x"51f4853f", +754 => x"80cea451", +755 => x"f3fe3f81", +756 => x"b4b40870", +757 => x"08535f80", +758 => x"ccac51f3", +759 => x"ef3f80ce", +760 => x"b851f3e8", +761 => x"3f81b4b4", +762 => x"08841108", +763 => x"535b80cc", +764 => x"fc51f3d8", +765 => x"3f805280", +766 => x"cab051f3", +767 => x"cf3f81b4", +768 => x"b4088811", +769 => x"08535c80", +770 => x"cd9851f3", +771 => x"bf3f8152", +772 => x"80cab051", +773 => x"f3b63f81", +774 => x"b4b4088c", +775 => x"1108535a", +776 => x"80cdb451", +777 => x"f3a63f92", +778 => x"5280cab0", +779 => x"51f39d3f", +780 => x"81b4b408", +781 => x"90055280", +782 => x"cdd051f3", +783 => x"8f3f80cd", +784 => x"ec51f388", +785 => x"3f7f5280", +786 => x"cef851f2", +787 => x"ff3f8552", +788 => x"80cab051", +789 => x"f2f63f78", +790 => x"5280cf94", +791 => x"51f2ed3f", +792 => x"8d5280ca", +793 => x"b051f2e4", +794 => x"3f615280", +795 => x"cfb051f2", +796 => x"db3f8752", +797 => x"80cab051", +798 => x"f2d23f60", +799 => x"5280cfcc", +800 => x"51f2c93f", +801 => x"815280ca", +802 => x"b051f2c0", +803 => x"3f7d5280", +804 => x"cfe851f2", +805 => x"b73f80d0", +806 => x"8451f2b0", +807 => x"3f7c5280", +808 => x"d0bc51f2", +809 => x"a73f80d0", +810 => x"d851f2a0", +811 => x"3f80d2a4", +812 => x"51f2993f", +813 => x"81b4ac08", +814 => x"81b4b008", +815 => x"80e69408", +816 => x"80e69808", +817 => x"72713170", +818 => x"74267574", +819 => x"31707231", +820 => x"80e68c0c", +821 => x"444480e6", +822 => x"900c80e6", +823 => x"90085680", +824 => x"d190555c", +825 => x"595758f1", +826 => x"e33f80e6", +827 => x"8c085680", +828 => x"762582a3", +829 => x"3880d680", +830 => x"0870719f", +831 => x"2c9a3d53", +832 => x"565680e6", +833 => x"8c0880e6", +834 => x"90084153", +835 => x"7f547052", +836 => x"5a89eb3f", +837 => x"66685f80", +838 => x"e5fc0c7d", +839 => x"80e6800c", +840 => x"80d68008", +841 => x"709f2c58", +842 => x"568058bd", +843 => x"84c07855", +844 => x"55765275", +845 => x"53795187", +846 => x"d13f953d", +847 => x"80e68c08", +848 => x"80e69008", +849 => x"41557f56", +850 => x"67694053", +851 => x"7e547052", +852 => x"5c89ab3f", +853 => x"64665e80", +854 => x"e6840c7c", +855 => x"80e6880c", +856 => x"80d68008", +857 => x"709f2c40", +858 => x"58805783", +859 => x"dceb9480", +860 => x"7755557e", +861 => x"5277537b", +862 => x"51878f3f", +863 => x"64665d5b", +864 => x"805e8ddd", +865 => x"7e555580", +866 => x"e68c0880", +867 => x"e6900859", +868 => x"52775379", +869 => x"5186f33f", +870 => x"66684054", +871 => x"7e557a52", +872 => x"7b53a93d", +873 => x"ffa80551", +874 => x"88d43f62", +875 => x"645e81b4", +876 => x"c80c7c81", +877 => x"b4cc0c80", +878 => x"d1a051f0", +879 => x"8f3f80e6", +880 => x"80085280", +881 => x"d1d051f0", +882 => x"833f80d1", +883 => x"d851effc", +884 => x"3f80e688", +885 => x"085280d1", +886 => x"d051eff0", +887 => x"3f81b4cc", +888 => x"085280d2", +889 => x"8851efe4", +890 => x"3f80d2a4", +891 => x"51efdd3f", +892 => x"800b800c", +893 => x"a93d0d04", +894 => x"80d2a851", +895 => x"f6ac3977", +896 => x"0857b053", +897 => x"76527751", +898 => x"9fc83f80", +899 => x"c10b81b4", +900 => x"c0335757", +901 => x"f8ae3975", +902 => x"8a3880e6", +903 => x"90088126", +904 => x"fdd33880", +905 => x"d2d851ef", +906 => x"a33f80d3", +907 => x"9051ef9c", +908 => x"3f80d2a4", +909 => x"51ef953f", +910 => x"80d68008", +911 => x"70719f2c", +912 => x"9a3d5356", +913 => x"5680e68c", +914 => x"0880e690", +915 => x"0841537f", +916 => x"5470525a", +917 => x"87a83f66", +918 => x"685f80e5", +919 => x"fc0c7d80", +920 => x"e6800c80", +921 => x"d6800870", +922 => x"9f2c5856", +923 => x"8058bd84", +924 => x"c0785555", +925 => x"76527553", +926 => x"7951858e", +927 => x"3f953d80", +928 => x"e68c0880", +929 => x"e6900841", +930 => x"557f5667", +931 => x"6940537e", +932 => x"5470525c", +933 => x"86e83f64", +934 => x"665e80e6", +935 => x"840c7c80", +936 => x"e6880c80", +937 => x"d6800870", +938 => x"9f2c4058", +939 => x"805783dc", +940 => x"eb948077", +941 => x"55557e52", +942 => x"77537b51", +943 => x"84cc3f64", +944 => x"665d5b80", +945 => x"5e8ddd7e", +946 => x"555580e6", +947 => x"8c0880e6", +948 => x"90085952", +949 => x"77537951", +950 => x"84b03f66", +951 => x"6840547e", +952 => x"557a527b", +953 => x"53a93dff", +954 => x"a8055186", +955 => x"913f6264", +956 => x"5e81b4c8", +957 => x"0c7c81b4", +958 => x"cc0c80d1", +959 => x"a051edcc", +960 => x"3f80e680", +961 => x"085280d1", +962 => x"d051edc0", +963 => x"3f80d1d8", +964 => x"51edb93f", +965 => x"80e68808", +966 => x"5280d1d0", +967 => x"51edad3f", +968 => x"81b4cc08", +969 => x"5280d288", +970 => x"51eda13f", +971 => x"80d2a451", +972 => x"ed9a3f80", +973 => x"0b800ca9", +974 => x"3d0d04a9", +975 => x"3dffa005", +976 => x"52805180", +977 => x"d23f9f53", +978 => x"80d3b052", +979 => x"7c519d82", +980 => x"3f7a7b81", +981 => x"b4b80c81", +982 => x"187081ff", +983 => x"0681b4c0", +984 => x"33595959", +985 => x"5af5fe39", +986 => x"ff16707b", +987 => x"31600c5c", +988 => x"800b811c", +989 => x"5c5c80d6", +990 => x"80087b25", +991 => x"f3dc38f6", +992 => x"a939ff3d", +993 => x"0d738232", +994 => x"70307072", +995 => x"07802580", +996 => x"0c525283", +997 => x"3d0d04fe", +998 => x"3d0d7476", +999 => x"71535452", +1000 => x"71822e83", +1001 => x"38835171", +1002 => x"812e9a38", +1003 => x"8172269f", +1004 => x"3871822e", +1005 => x"b8387184", +1006 => x"2ea93870", +1007 => x"730c7080", +1008 => x"0c843d0d", +1009 => x"0480e40b", +1010 => x"81b4b808", +1011 => x"258b3880", +1012 => x"730c7080", +1013 => x"0c843d0d", +1014 => x"0483730c", +1015 => x"70800c84", +1016 => x"3d0d0482", +1017 => x"730c7080", +1018 => x"0c843d0d", +1019 => x"0481730c", +1020 => x"70800c84", +1021 => x"3d0d0480", +1022 => x"3d0d7474", +1023 => x"14820571", +1024 => x"0c800c82", +1025 => x"3d0d04f7", +1026 => x"3d0d7b7d", +1027 => x"7f618512", +1028 => x"70822b75", +1029 => x"11707471", +1030 => x"70840553", +1031 => x"0c5a5a5d", +1032 => x"5b760c79", +1033 => x"80f8180c", +1034 => x"79861252", +1035 => x"57585a5a", +1036 => x"76762499", +1037 => x"3876b329", +1038 => x"822b7911", +1039 => x"51537673", +1040 => x"70840555", +1041 => x"0c811454", +1042 => x"757425f2", +1043 => x"387681cc", +1044 => x"2919fc11", +1045 => x"088105fc", +1046 => x"120c7a19", +1047 => x"70089fa0", +1048 => x"130c5856", +1049 => x"850b81b4", +1050 => x"b80c7580", +1051 => x"0c8b3d0d", +1052 => x"04fe3d0d", +1053 => x"02930533", +1054 => x"51800284", +1055 => x"05970533", +1056 => x"54527073", +1057 => x"2e883871", +1058 => x"800c843d", +1059 => x"0d047081", +1060 => x"b4bc3481", +1061 => x"0b800c84", +1062 => x"3d0d04f8", +1063 => x"3d0d7a7c", +1064 => x"5956820b", +1065 => x"83195555", +1066 => x"74167033", +1067 => x"75335b51", +1068 => x"5372792e", +1069 => x"80c63880", +1070 => x"c10b8116", +1071 => x"81165656", +1072 => x"57827525", +1073 => x"e338ffa9", +1074 => x"177081ff", +1075 => x"06555973", +1076 => x"82268338", +1077 => x"87558153", +1078 => x"7680d22e", +1079 => x"98387752", +1080 => x"75519bc3", +1081 => x"3f805372", +1082 => x"80082589", +1083 => x"38871581", +1084 => x"b4b80c81", +1085 => x"5372800c", +1086 => x"8a3d0d04", +1087 => x"7281b4bc", +1088 => x"34827525", +1089 => x"ffa238ff", +1090 => x"bd39ef3d", +1091 => x"0d636567", +1092 => x"5b427943", +1093 => x"67695940", +1094 => x"77415a80", +1095 => x"5d805e61", +1096 => x"7083ffff", +1097 => x"0671902a", +1098 => x"627083ff", +1099 => x"ff067190", +1100 => x"2a747229", +1101 => x"74732975", +1102 => x"73297774", +1103 => x"2973902a", +1104 => x"05721151", +1105 => x"5856535f", +1106 => x"5a575a58", +1107 => x"55587373", +1108 => x"27863884", +1109 => x"80801656", +1110 => x"73902a16", +1111 => x"5b7883ff", +1112 => x"ff067484", +1113 => x"80802905", +1114 => x"5c7a7c5a", +1115 => x"5d785e77", +1116 => x"7f296178", +1117 => x"29057d05", +1118 => x"5d7c7e56", +1119 => x"7a0c7484", +1120 => x"1b0c7980", +1121 => x"0c933d0d", +1122 => x"04f93d0d", +1123 => x"797b7d54", +1124 => x"58725977", +1125 => x"30797030", +1126 => x"7072079f", +1127 => x"2a737131", +1128 => x"5a525977", +1129 => x"7956730c", +1130 => x"53738413", +1131 => x"0c54800c", +1132 => x"893d0d04", +1133 => x"f93d0d79", +1134 => x"7b7d7f56", +1135 => x"54525472", +1136 => x"802ea038", +1137 => x"70577158", +1138 => x"a0733152", +1139 => x"807225a1", +1140 => x"38777074", +1141 => x"2b577073", +1142 => x"2a78752b", +1143 => x"07565174", +1144 => x"76535170", +1145 => x"740c7184", +1146 => x"150c7380", +1147 => x"0c893d0d", +1148 => x"04805677", +1149 => x"72302b55", +1150 => x"74765351", +1151 => x"e639e43d", +1152 => x"0d6ea13d", +1153 => x"08a33d08", +1154 => x"59575f80", +1155 => x"764d774e", +1156 => x"a33d08a5", +1157 => x"3d08574b", +1158 => x"754c5e7d", +1159 => x"6c2486fb", +1160 => x"38806a24", +1161 => x"878f3869", +1162 => x"6b58566b", +1163 => x"6d5d467b", +1164 => x"47754476", +1165 => x"45646468", +1166 => x"685c5c56", +1167 => x"567481e7", +1168 => x"38787627", +1169 => x"82c73875", +1170 => x"81ff2683", +1171 => x"2b5583ff", +1172 => x"ff76278c", +1173 => x"389055fe", +1174 => x"800a7627", +1175 => x"83389855", +1176 => x"75752a80", +1177 => x"d3d00570", +1178 => x"33a07731", +1179 => x"71315755", +1180 => x"5774802e", +1181 => x"95387575", +1182 => x"2ba07631", +1183 => x"7a772b7c", +1184 => x"722a077c", +1185 => x"782b5d5b", +1186 => x"59567590", +1187 => x"2a7683ff", +1188 => x"ff067154", +1189 => x"7a535957", +1190 => x"88803f80", +1191 => x"085b87ea", +1192 => x"3f800880", +1193 => x"0879297c", +1194 => x"902b7c90", +1195 => x"2a075656", +1196 => x"59737527", +1197 => x"94388008", +1198 => x"ff057615", +1199 => x"55597574", +1200 => x"26873874", +1201 => x"742687b9", +1202 => x"38765273", +1203 => x"75315187", +1204 => x"c93f8008", +1205 => x"5587b33f", +1206 => x"80088008", +1207 => x"79297b83", +1208 => x"ffff0677", +1209 => x"902b0756", +1210 => x"59577378", +1211 => x"27963880", +1212 => x"08ff0576", +1213 => x"15555775", +1214 => x"74268938", +1215 => x"77742677", +1216 => x"71315856", +1217 => x"78902b77", +1218 => x"0758805b", +1219 => x"7a407741", +1220 => x"7f615654", +1221 => x"7d80d938", +1222 => x"737f0c74", +1223 => x"7f84050c", +1224 => x"7e800c9e", +1225 => x"3d0d0480", +1226 => x"705c5874", +1227 => x"7926dd38", +1228 => x"7481ff26", +1229 => x"832b5774", +1230 => x"83ffff26", +1231 => x"82a53874", +1232 => x"772a80d3", +1233 => x"d0057033", +1234 => x"a0793171", +1235 => x"31595c5d", +1236 => x"7682b338", +1237 => x"76547479", +1238 => x"27833881", +1239 => x"54797627", +1240 => x"74075981", +1241 => x"5878ffa2", +1242 => x"38765880", +1243 => x"5bff9d39", +1244 => x"73527453", +1245 => x"9e3de805", +1246 => x"51fc8e3f", +1247 => x"6769567f", +1248 => x"0c747f84", +1249 => x"050c7e80", +1250 => x"0c9e3d0d", +1251 => x"0475802e", +1252 => x"81c43875", +1253 => x"81ff2683", +1254 => x"2b5583ff", +1255 => x"ff76278c", +1256 => x"389055fe", +1257 => x"800a7627", +1258 => x"83389855", +1259 => x"75752a80", +1260 => x"d3d00570", +1261 => x"33a07731", +1262 => x"7131575e", +1263 => x"54748491", +1264 => x"38787631", +1265 => x"54817690", +1266 => x"2a7783ff", +1267 => x"ff065f5d", +1268 => x"5b7b5273", +1269 => x"5185c33f", +1270 => x"80085785", +1271 => x"ad3f8008", +1272 => x"80087e29", +1273 => x"78902b7c", +1274 => x"902a0756", +1275 => x"56597375", +1276 => x"27943880", +1277 => x"08ff0576", +1278 => x"15555975", +1279 => x"74268738", +1280 => x"74742684", +1281 => x"f3387b52", +1282 => x"73753151", +1283 => x"858c3f80", +1284 => x"085584f6", +1285 => x"3f800880", +1286 => x"087e297b", +1287 => x"83ffff06", +1288 => x"77902b07", +1289 => x"56595773", +1290 => x"78279638", +1291 => x"8008ff05", +1292 => x"76155557", +1293 => x"75742689", +1294 => x"38777426", +1295 => x"77713158", +1296 => x"5a78902b", +1297 => x"77077b41", +1298 => x"417f6156", +1299 => x"547d802e", +1300 => x"fdc638fe", +1301 => x"9b397552", +1302 => x"815184ae", +1303 => x"3f800856", +1304 => x"feb13990", +1305 => x"57fe800a", +1306 => x"7527fdd3", +1307 => x"38987571", +1308 => x"2a80d3d0", +1309 => x"057033a0", +1310 => x"73317131", +1311 => x"535d5e57", +1312 => x"76802efd", +1313 => x"cf38a077", +1314 => x"3175782b", +1315 => x"77722a07", +1316 => x"77792b7b", +1317 => x"7a2b7d74", +1318 => x"2a077d7b", +1319 => x"2b73902a", +1320 => x"7483ffff", +1321 => x"0671597f", +1322 => x"772a585e", +1323 => x"5c415f58", +1324 => x"5c5483e6", +1325 => x"3f800854", +1326 => x"83d03f80", +1327 => x"08800879", +1328 => x"2975902b", +1329 => x"7e902a07", +1330 => x"56565973", +1331 => x"75279938", +1332 => x"8008ff05", +1333 => x"7b155559", +1334 => x"7a74268c", +1335 => x"38737527", +1336 => x"8738ff19", +1337 => x"7b155559", +1338 => x"76527375", +1339 => x"315183aa", +1340 => x"3f800855", +1341 => x"83943f80", +1342 => x"08800879", +1343 => x"297d83ff", +1344 => x"ff067790", +1345 => x"2b075659", +1346 => x"57737827", +1347 => x"99388008", +1348 => x"ff057b15", +1349 => x"55577a74", +1350 => x"268c3873", +1351 => x"78278738", +1352 => x"ff177b15", +1353 => x"55577378", +1354 => x"3179902b", +1355 => x"78077083", +1356 => x"ffff0671", +1357 => x"902a7983", +1358 => x"ffff067a", +1359 => x"902a7372", +1360 => x"29737329", +1361 => x"74732976", +1362 => x"74297390", +1363 => x"2a057205", +1364 => x"5755435f", +1365 => x"5b585a57", +1366 => x"595a747c", +1367 => x"27863884", +1368 => x"80801757", +1369 => x"74902a17", +1370 => x"7983ffff", +1371 => x"06768480", +1372 => x"80290557", +1373 => x"57767a26", +1374 => x"9a38767a", +1375 => x"32703070", +1376 => x"72078025", +1377 => x"565a5b7c", +1378 => x"7627fafe", +1379 => x"3873802e", +1380 => x"faf838ff", +1381 => x"1858805b", +1382 => x"faf239ff", +1383 => x"76537754", +1384 => x"9f3de805", +1385 => x"525ef7e1", +1386 => x"3f676957", +1387 => x"4c754d69", +1388 => x"8025f8f3", +1389 => x"387d096a", +1390 => x"6c5c537a", +1391 => x"549f3de8", +1392 => x"05525ef7", +1393 => x"c43f6769", +1394 => x"714c704d", +1395 => x"5856f8db", +1396 => x"39a07531", +1397 => x"76762b7a", +1398 => x"772b7c73", +1399 => x"2a077c78", +1400 => x"2b72902a", +1401 => x"7383ffff", +1402 => x"0671587e", +1403 => x"762a5742", +1404 => x"405d5d57", +1405 => x"5881a33f", +1406 => x"80085781", +1407 => x"8d3f8008", +1408 => x"80087e29", +1409 => x"78902b7d", +1410 => x"902a0756", +1411 => x"56597375", +1412 => x"27993880", +1413 => x"08ff0576", +1414 => x"15555975", +1415 => x"74268c38", +1416 => x"73752787", +1417 => x"38ff1976", +1418 => x"1555597b", +1419 => x"52737531", +1420 => x"5180e73f", +1421 => x"80085580", +1422 => x"d13f8008", +1423 => x"80087e29", +1424 => x"7c83ffff", +1425 => x"06707890", +1426 => x"2b075156", +1427 => x"58587377", +1428 => x"27993880", +1429 => x"08ff0576", +1430 => x"15555875", +1431 => x"74268c38", +1432 => x"73772787", +1433 => x"38ff1876", +1434 => x"15555878", +1435 => x"902b7807", +1436 => x"74783155", +1437 => x"5bfada39", +1438 => x"ff197615", +1439 => x"5559fb86", +1440 => x"39ff1976", +1441 => x"155559f8", +1442 => x"c0397070", +1443 => x"70805375", +1444 => x"52745181", +1445 => x"913f5050", +1446 => x"50047070", +1447 => x"70815375", +1448 => x"52745181", +1449 => x"813f5050", +1450 => x"5004fb3d", +1451 => x"0d777955", +1452 => x"55805675", +1453 => x"7524ab38", +1454 => x"8074249d", +1455 => x"38805373", +1456 => x"52745180", +1457 => x"e13f8008", +1458 => x"5475802e", +1459 => x"85388008", +1460 => x"30547380", +1461 => x"0c873d0d", +1462 => x"04733076", +1463 => x"81325754", +1464 => x"dc397430", +1465 => x"55815673", +1466 => x"8025d238", +1467 => x"ec39fa3d", +1468 => x"0d787a57", +1469 => x"55805776", +1470 => x"7524a438", +1471 => x"759f2c54", +1472 => x"81537574", +1473 => x"32743152", +1474 => x"74519b3f", +1475 => x"80085476", +1476 => x"802e8538", +1477 => x"80083054", +1478 => x"73800c88", +1479 => x"3d0d0474", +1480 => x"30558157", +1481 => x"d739fc3d", +1482 => x"0d767853", +1483 => x"54815380", +1484 => x"74732652", +1485 => x"5572802e", +1486 => x"98387080", +1487 => x"2eab3880", +1488 => x"7224a638", +1489 => x"71107310", +1490 => x"75722653", +1491 => x"545272ea", +1492 => x"38735178", +1493 => x"83387451", +1494 => x"70800c86", +1495 => x"3d0d0472", +1496 => x"0a100a72", +1497 => x"0a100a53", +1498 => x"5372802e", +1499 => x"e4387174", +1500 => x"26ed3873", +1501 => x"72317574", +1502 => x"07740a10", +1503 => x"0a740a10", +1504 => x"0a555556", +1505 => x"54e33970", +1506 => x"70735280", +1507 => x"decc0851", +1508 => x"933f5050", +1509 => x"04707073", +1510 => x"5280decc", +1511 => x"085190ce", +1512 => x"3f505004", +1513 => x"f43d0d7e", +1514 => x"608b1170", +1515 => x"f8065b55", +1516 => x"555d7296", +1517 => x"26833890", +1518 => x"58807824", +1519 => x"74792607", +1520 => x"55805474", +1521 => x"742e0981", +1522 => x"0680ca38", +1523 => x"7c518d9e", +1524 => x"3f7783f7", +1525 => x"2680c538", +1526 => x"77832a70", +1527 => x"10101080", +1528 => x"d6c4058c", +1529 => x"11085858", +1530 => x"5475772e", +1531 => x"81f03884", +1532 => x"1608fc06", +1533 => x"8c170888", +1534 => x"1808718c", +1535 => x"120c8812", +1536 => x"0c5b7605", +1537 => x"84110881", +1538 => x"0784120c", +1539 => x"537c518c", +1540 => x"de3f8816", +1541 => x"5473800c", +1542 => x"8e3d0d04", +1543 => x"77892a78", +1544 => x"832a5854", +1545 => x"73802ebf", +1546 => x"3877862a", +1547 => x"b8055784", +1548 => x"7427b438", +1549 => x"80db1457", +1550 => x"947427ab", +1551 => x"38778c2a", +1552 => x"80ee0557", +1553 => x"80d47427", +1554 => x"9e38778f", +1555 => x"2a80f705", +1556 => x"5782d474", +1557 => x"27913877", +1558 => x"922a80fc", +1559 => x"05578ad4", +1560 => x"74278438", +1561 => x"80fe5776", +1562 => x"10101080", +1563 => x"d6c4058c", +1564 => x"11085653", +1565 => x"74732ea3", +1566 => x"38841508", +1567 => x"fc067079", +1568 => x"31555673", +1569 => x"8f2488e4", +1570 => x"38738025", +1571 => x"88e6388c", +1572 => x"15085574", +1573 => x"732e0981", +1574 => x"06df3881", +1575 => x"175980d6", +1576 => x"d4085675", +1577 => x"80d6cc2e", +1578 => x"82cc3884", +1579 => x"1608fc06", +1580 => x"70793155", +1581 => x"55738f24", +1582 => x"bb3880d6", +1583 => x"cc0b80d6", +1584 => x"d80c80d6", +1585 => x"cc0b80d6", +1586 => x"d40c8074", +1587 => x"2480db38", +1588 => x"74168411", +1589 => x"08810784", +1590 => x"120c53fe", +1591 => x"b0398816", +1592 => x"8c110857", +1593 => x"5975792e", +1594 => x"098106fe", +1595 => x"82388214", +1596 => x"59ffab39", +1597 => x"77167881", +1598 => x"0784180c", +1599 => x"7080d6d8", +1600 => x"0c7080d6", +1601 => x"d40c80d6", +1602 => x"cc0b8c12", +1603 => x"0c8c1108", +1604 => x"88120c74", +1605 => x"81078412", +1606 => x"0c740574", +1607 => x"710c5b7c", +1608 => x"518acc3f", +1609 => x"881654fd", +1610 => x"ec3983ff", +1611 => x"75278391", +1612 => x"3874892a", +1613 => x"75832a54", +1614 => x"5473802e", +1615 => x"bf387486", +1616 => x"2ab80553", +1617 => x"847427b4", +1618 => x"3880db14", +1619 => x"53947427", +1620 => x"ab38748c", +1621 => x"2a80ee05", +1622 => x"5380d474", +1623 => x"279e3874", +1624 => x"8f2a80f7", +1625 => x"055382d4", +1626 => x"74279138", +1627 => x"74922a80", +1628 => x"fc05538a", +1629 => x"d4742784", +1630 => x"3880fe53", +1631 => x"72101010", +1632 => x"80d6c405", +1633 => x"88110855", +1634 => x"5773772e", +1635 => x"868b3884", +1636 => x"1408fc06", +1637 => x"5b747b27", +1638 => x"8d388814", +1639 => x"08547377", +1640 => x"2e098106", +1641 => x"ea388c14", +1642 => x"0880d6c4", +1643 => x"0b840508", +1644 => x"718c190c", +1645 => x"7588190c", +1646 => x"7788130c", +1647 => x"5c57758c", +1648 => x"150c7853", +1649 => x"80792483", +1650 => x"98387282", +1651 => x"2c81712b", +1652 => x"5656747b", +1653 => x"2680ca38", +1654 => x"7a750657", +1655 => x"7682a338", +1656 => x"78fc0684", +1657 => x"05597410", +1658 => x"707c0655", +1659 => x"55738292", +1660 => x"38841959", +1661 => x"f13980d6", +1662 => x"c40b8405", +1663 => x"0879545b", +1664 => x"788025c6", +1665 => x"3882da39", +1666 => x"74097b06", +1667 => x"7080d6c4", +1668 => x"0b84050c", +1669 => x"5b741055", +1670 => x"747b2685", +1671 => x"387485bc", +1672 => x"3880d6c4", +1673 => x"0b880508", +1674 => x"70841208", +1675 => x"fc06707b", +1676 => x"317b7226", +1677 => x"8f722507", +1678 => x"5d575c5c", +1679 => x"5578802e", +1680 => x"80d93879", +1681 => x"1580d6bc", +1682 => x"08199011", +1683 => x"59545680", +1684 => x"d6b808ff", +1685 => x"2e8838a0", +1686 => x"8f13e080", +1687 => x"06577652", +1688 => x"7c51888c", +1689 => x"3f800854", +1690 => x"8008ff2e", +1691 => x"90388008", +1692 => x"762782a7", +1693 => x"387480d6", +1694 => x"c42e829f", +1695 => x"3880d6c4", +1696 => x"0b880508", +1697 => x"55841508", +1698 => x"fc067079", +1699 => x"31797226", +1700 => x"8f722507", +1701 => x"5d555a7a", +1702 => x"83f23877", +1703 => x"81078416", +1704 => x"0c771570", +1705 => x"80d6c40b", +1706 => x"88050c74", +1707 => x"81078412", +1708 => x"0c567c51", +1709 => x"87b93f88", +1710 => x"15547380", +1711 => x"0c8e3d0d", +1712 => x"0474832a", +1713 => x"70545480", +1714 => x"7424819b", +1715 => x"3872822c", +1716 => x"81712b80", +1717 => x"d6c80807", +1718 => x"7080d6c4", +1719 => x"0b84050c", +1720 => x"75101010", +1721 => x"80d6c405", +1722 => x"88110871", +1723 => x"8c1b0c70", +1724 => x"881b0c79", +1725 => x"88130c57", +1726 => x"555c5575", +1727 => x"8c150cfd", +1728 => x"c1397879", +1729 => x"10101080", +1730 => x"d6c40570", +1731 => x"565b5c8c", +1732 => x"14085675", +1733 => x"742ea338", +1734 => x"841608fc", +1735 => x"06707931", +1736 => x"5853768f", +1737 => x"2483f138", +1738 => x"76802584", +1739 => x"af388c16", +1740 => x"08567574", +1741 => x"2e098106", +1742 => x"df388814", +1743 => x"811a7083", +1744 => x"06555a54", +1745 => x"72c9387b", +1746 => x"83065675", +1747 => x"802efdb8", +1748 => x"38ff1cf8", +1749 => x"1b5b5c88", +1750 => x"1a087a2e", +1751 => x"ea38fdb5", +1752 => x"39831953", +1753 => x"fce43983", +1754 => x"1470822c", +1755 => x"81712b80", +1756 => x"d6c80807", +1757 => x"7080d6c4", +1758 => x"0b84050c", +1759 => x"76101010", +1760 => x"80d6c405", +1761 => x"88110871", +1762 => x"8c1c0c70", +1763 => x"881c0c7a", +1764 => x"88130c58", +1765 => x"535d5653", +1766 => x"fee13980", +1767 => x"d6880817", +1768 => x"59800876", +1769 => x"2e818b38", +1770 => x"80d6b808", +1771 => x"ff2e848e", +1772 => x"38737631", +1773 => x"1980d688", +1774 => x"0c738706", +1775 => x"70565372", +1776 => x"802e8838", +1777 => x"88733170", +1778 => x"15555576", +1779 => x"149fff06", +1780 => x"a0807131", +1781 => x"1670547e", +1782 => x"53515385", +1783 => x"933f8008", +1784 => x"568008ff", +1785 => x"2e819e38", +1786 => x"80d68808", +1787 => x"137080d6", +1788 => x"880c7475", +1789 => x"80d6c40b", +1790 => x"88050c77", +1791 => x"76311581", +1792 => x"07555659", +1793 => x"7a80d6c4", +1794 => x"2e83c038", +1795 => x"798f2682", +1796 => x"ef38810b", +1797 => x"84150c84", +1798 => x"1508fc06", +1799 => x"70793179", +1800 => x"72268f72", +1801 => x"25075d55", +1802 => x"5a7a802e", +1803 => x"fced3880", +1804 => x"db398008", +1805 => x"9fff0655", +1806 => x"74feed38", +1807 => x"7880d688", +1808 => x"0c80d6c4", +1809 => x"0b880508", +1810 => x"7a188107", +1811 => x"84120c55", +1812 => x"80d6b408", +1813 => x"79278638", +1814 => x"7880d6b4", +1815 => x"0c80d6b0", +1816 => x"087927fc", +1817 => x"a0387880", +1818 => x"d6b00c84", +1819 => x"1508fc06", +1820 => x"70793179", +1821 => x"72268f72", +1822 => x"25075d55", +1823 => x"5a7a802e", +1824 => x"fc993888", +1825 => x"39807457", +1826 => x"53fedd39", +1827 => x"7c5183df", +1828 => x"3f800b80", +1829 => x"0c8e3d0d", +1830 => x"04807324", +1831 => x"a5387282", +1832 => x"2c81712b", +1833 => x"80d6c808", +1834 => x"077080d6", +1835 => x"c40b8405", +1836 => x"0c5c5a76", +1837 => x"8c170c73", +1838 => x"88170c75", +1839 => x"88180cf9", +1840 => x"fd398313", +1841 => x"70822c81", +1842 => x"712b80d6", +1843 => x"c8080770", +1844 => x"80d6c40b", +1845 => x"84050c5d", +1846 => x"5b53d839", +1847 => x"7a75065c", +1848 => x"7bfc9f38", +1849 => x"84197510", +1850 => x"5659f139", +1851 => x"ff178105", +1852 => x"59f7ab39", +1853 => x"8c150888", +1854 => x"1608718c", +1855 => x"120c8812", +1856 => x"0c597515", +1857 => x"84110881", +1858 => x"0784120c", +1859 => x"587c5182", +1860 => x"de3f8815", +1861 => x"54fba339", +1862 => x"77167881", +1863 => x"0784180c", +1864 => x"8c170888", +1865 => x"1808718c", +1866 => x"120c8812", +1867 => x"0c5c7080", +1868 => x"d6d80c70", +1869 => x"80d6d40c", +1870 => x"80d6cc0b", +1871 => x"8c120c8c", +1872 => x"11088812", +1873 => x"0c778107", +1874 => x"84120c77", +1875 => x"0577710c", +1876 => x"557c5182", +1877 => x"9a3f8816", +1878 => x"54f5ba39", +1879 => x"72168411", +1880 => x"08810784", +1881 => x"120c588c", +1882 => x"16088817", +1883 => x"08718c12", +1884 => x"0c88120c", +1885 => x"577c5181", +1886 => x"f63f8816", +1887 => x"54f59639", +1888 => x"7284150c", +1889 => x"f41af806", +1890 => x"70841d08", +1891 => x"81060784", +1892 => x"1d0c701c", +1893 => x"5556850b", +1894 => x"84150c85", +1895 => x"0b88150c", +1896 => x"8f7627fd", +1897 => x"ab38881b", +1898 => x"527c5184", +1899 => x"c13f80d6", +1900 => x"c40b8805", +1901 => x"0880d688", +1902 => x"085a55fd", +1903 => x"93397880", +1904 => x"d6880c73", +1905 => x"80d6b80c", +1906 => x"fbef3972", +1907 => x"84150cfc", +1908 => x"ff39fb3d", +1909 => x"0d77707a", +1910 => x"7c585553", +1911 => x"568f7527", +1912 => x"80e63872", +1913 => x"76078306", +1914 => x"517080dc", +1915 => x"38757352", +1916 => x"54707084", +1917 => x"05520874", +1918 => x"70840556", +1919 => x"0c737170", +1920 => x"84055308", +1921 => x"71708405", +1922 => x"530c7170", +1923 => x"84055308", +1924 => x"71708405", +1925 => x"530c7170", +1926 => x"84055308", +1927 => x"71708405", +1928 => x"530cf016", +1929 => x"5654748f", +1930 => x"26c73883", +1931 => x"75279538", +1932 => x"70708405", +1933 => x"52087470", +1934 => x"8405560c", +1935 => x"fc155574", +1936 => x"8326ed38", +1937 => x"73715452", +1938 => x"ff155170", +1939 => x"ff2e9838", +1940 => x"72708105", +1941 => x"54337270", +1942 => x"81055434", +1943 => x"ff115170", +1944 => x"ff2e0981", +1945 => x"06ea3875", +1946 => x"800c873d", +1947 => x"0d040404", +1948 => x"70707070", +1949 => x"800b81b6", +1950 => x"9c0c7651", +1951 => x"87cc3f80", +1952 => x"08538008", +1953 => x"ff2e8938", +1954 => x"72800c50", +1955 => x"50505004", +1956 => x"81b69c08", +1957 => x"5473802e", +1958 => x"ef387574", +1959 => x"710c5272", +1960 => x"800c5050", +1961 => x"505004fb", +1962 => x"3d0d7779", +1963 => x"70720783", +1964 => x"06535452", +1965 => x"70933871", +1966 => x"73730854", +1967 => x"56547173", +1968 => x"082e80c4", +1969 => x"38737554", +1970 => x"52713370", +1971 => x"81ff0652", +1972 => x"5470802e", +1973 => x"9d387233", +1974 => x"5570752e", +1975 => x"09810695", +1976 => x"38811281", +1977 => x"14713370", +1978 => x"81ff0654", +1979 => x"56545270", +1980 => x"e5387233", +1981 => x"557381ff", +1982 => x"067581ff", +1983 => x"06717131", +1984 => x"800c5552", +1985 => x"873d0d04", +1986 => x"7109f7fb", +1987 => x"fdff1306", +1988 => x"f8848281", +1989 => x"80065271", +1990 => x"97388414", +1991 => x"84167108", +1992 => x"54565471", +1993 => x"75082ee0", +1994 => x"38737554", +1995 => x"52ff9a39", +1996 => x"800b800c", +1997 => x"873d0d04", +1998 => x"fb3d0d77", +1999 => x"705256fe", +2000 => x"ad3f80d6", +2001 => x"c40b8805", +2002 => x"08841108", +2003 => x"fc06707b", +2004 => x"319fef05", +2005 => x"e08006e0", +2006 => x"80055255", +2007 => x"55a08075", +2008 => x"24943880", +2009 => x"527551fe", +2010 => x"873f80d6", +2011 => x"cc081453", +2012 => x"7280082e", +2013 => x"8f387551", +2014 => x"fdf53f80", +2015 => x"5372800c", +2016 => x"873d0d04", +2017 => x"74305275", +2018 => x"51fde53f", +2019 => x"8008ff2e", +2020 => x"a83880d6", +2021 => x"c40b8805", +2022 => x"08747631", +2023 => x"81078412", +2024 => x"0c5380d6", +2025 => x"88087531", +2026 => x"80d6880c", +2027 => x"7551fdbf", +2028 => x"3f810b80", +2029 => x"0c873d0d", +2030 => x"04805275", +2031 => x"51fdb13f", +2032 => x"80d6c40b", +2033 => x"88050880", +2034 => x"08713154", +2035 => x"548f7325", +2036 => x"ffa43880", +2037 => x"0880d6b8", +2038 => x"083180d6", +2039 => x"880c7281", +2040 => x"0784150c", +2041 => x"7551fd87", +2042 => x"3f8053ff", +2043 => x"9039f73d", +2044 => x"0d7b7d54", +2045 => x"5a72802e", +2046 => x"82833879", +2047 => x"51fcef3f", +2048 => x"f8138411", +2049 => x"0870fe06", +2050 => x"70138411", +2051 => x"08fc065c", +2052 => x"57585457", +2053 => x"80d6cc08", +2054 => x"742e82de", +2055 => x"38778415", +2056 => x"0c807381", +2057 => x"06565974", +2058 => x"792e81d5", +2059 => x"38771484", +2060 => x"11088106", +2061 => x"565374a0", +2062 => x"38771656", +2063 => x"7881e638", +2064 => x"88140855", +2065 => x"7480d6cc", +2066 => x"2e82f938", +2067 => x"8c140870", +2068 => x"8c170c75", +2069 => x"88120c58", +2070 => x"75810784", +2071 => x"180c7517", +2072 => x"76710c54", +2073 => x"78819138", +2074 => x"83ff7627", +2075 => x"81c83875", +2076 => x"892a7683", +2077 => x"2a545473", +2078 => x"802ebf38", +2079 => x"75862ab8", +2080 => x"05538474", +2081 => x"27b43880", +2082 => x"db145394", +2083 => x"7427ab38", +2084 => x"758c2a80", +2085 => x"ee055380", +2086 => x"d474279e", +2087 => x"38758f2a", +2088 => x"80f70553", +2089 => x"82d47427", +2090 => x"91387592", +2091 => x"2a80fc05", +2092 => x"538ad474", +2093 => x"27843880", +2094 => x"fe537210", +2095 => x"101080d6", +2096 => x"c4058811", +2097 => x"08555573", +2098 => x"752e82bf", +2099 => x"38841408", +2100 => x"fc065975", +2101 => x"79278d38", +2102 => x"88140854", +2103 => x"73752e09", +2104 => x"8106ea38", +2105 => x"8c140870", +2106 => x"8c190c74", +2107 => x"88190c77", +2108 => x"88120c55", +2109 => x"768c150c", +2110 => x"7951faf3", +2111 => x"3f8b3d0d", +2112 => x"04760877", +2113 => x"71315876", +2114 => x"05881808", +2115 => x"56567480", +2116 => x"d6cc2e80", +2117 => x"e0388c17", +2118 => x"08708c17", +2119 => x"0c758812", +2120 => x"0c53fe89", +2121 => x"39881408", +2122 => x"8c150870", +2123 => x"8c130c59", +2124 => x"88190cfe", +2125 => x"a3397583", +2126 => x"2a705454", +2127 => x"80742481", +2128 => x"98387282", +2129 => x"2c81712b", +2130 => x"80d6c808", +2131 => x"0780d6c4", +2132 => x"0b84050c", +2133 => x"74101010", +2134 => x"80d6c405", +2135 => x"88110871", +2136 => x"8c1b0c70", +2137 => x"881b0c79", +2138 => x"88130c56", +2139 => x"5a55768c", +2140 => x"150cff84", +2141 => x"398159fd", +2142 => x"b4397716", +2143 => x"73810654", +2144 => x"55729838", +2145 => x"76087771", +2146 => x"31587505", +2147 => x"8c180888", +2148 => x"1908718c", +2149 => x"120c8812", +2150 => x"0c555574", +2151 => x"81078418", +2152 => x"0c7680d6", +2153 => x"c40b8805", +2154 => x"0c80d6c0", +2155 => x"087526fe", +2156 => x"c73880d6", +2157 => x"bc085279", +2158 => x"51fafd3f", +2159 => x"7951f9af", +2160 => x"3ffeba39", +2161 => x"81778c17", +2162 => x"0c778817", +2163 => x"0c758c19", +2164 => x"0c758819", +2165 => x"0c59fd80", +2166 => x"39831470", +2167 => x"822c8171", +2168 => x"2b80d6c8", +2169 => x"080780d6", +2170 => x"c40b8405", +2171 => x"0c751010", +2172 => x"1080d6c4", +2173 => x"05881108", +2174 => x"718c1c0c", +2175 => x"70881c0c", +2176 => x"7a88130c", +2177 => x"575b5653", +2178 => x"fee43980", +2179 => x"7324a338", +2180 => x"72822c81", +2181 => x"712b80d6", +2182 => x"c8080780", +2183 => x"d6c40b84", +2184 => x"050c5874", +2185 => x"8c180c73", +2186 => x"88180c76", +2187 => x"88160cfd", +2188 => x"c3398313", +2189 => x"70822c81", +2190 => x"712b80d6", +2191 => x"c8080780", +2192 => x"d6c40b84", +2193 => x"050c5953", +2194 => x"da397070", +2195 => x"7080e5f4", +2196 => x"08893881", +2197 => x"b6a00b80", +2198 => x"e5f40c80", +2199 => x"e5f40875", +2200 => x"115252ff", +2201 => x"537087fb", +2202 => x"80802688", +2203 => x"387080e5", +2204 => x"f40c7153", +2205 => x"72800c50", +2206 => x"505004fd", +2207 => x"3d0d800b", +2208 => x"80d5f408", +2209 => x"54547281", +2210 => x"2e9b3873", +2211 => x"80e5f80c", +2212 => x"c3ee3fc2", +2213 => x"eb3f80e5", +2214 => x"cc528151", +2215 => x"cc933f80", +2216 => x"085180dd", +2217 => x"3f7280e5", +2218 => x"f80cc3d4", +2219 => x"3fc2d13f", +2220 => x"80e5cc52", +2221 => x"8151cbf9", +2222 => x"3f800851", +2223 => x"80c33f00", +2224 => x"ff3900ff", +2225 => x"39f43d0d", +2226 => x"7e80e5ec", +2227 => x"08700870", +2228 => x"81ff0692", +2229 => x"3df80555", +2230 => x"515a5759", +2231 => x"c48f3f80", +2232 => x"5477557b", +2233 => x"7d585276", +2234 => x"538e3df0", +2235 => x"0551de8e", +2236 => x"3f797b58", +2237 => x"790c7684", +2238 => x"1a0c7880", +2239 => x"0c8e3d0d", +2240 => x"04f73d0d", +2241 => x"7b80decc", +2242 => x"0882c811", +2243 => x"085a545a", +2244 => x"77802e80", +2245 => x"da388188", +2246 => x"18841908", +2247 => x"ff058171", +2248 => x"2b595559", +2249 => x"80742480", +2250 => x"ea388074", +2251 => x"24b53873", +2252 => x"822b7811", +2253 => x"88055656", +2254 => x"81801908", +2255 => x"77065372", +2256 => x"802eb638", +2257 => x"78167008", +2258 => x"53537951", +2259 => x"74085372", +2260 => x"2dff14fc", +2261 => x"17fc1779", +2262 => x"812c5a57", +2263 => x"57547380", +2264 => x"25d63877", +2265 => x"085877ff", +2266 => x"ad3880de", +2267 => x"cc0853bc", +2268 => x"1308a538", +2269 => x"7951fec7", +2270 => x"3f740853", +2271 => x"722dff14", +2272 => x"fc17fc17", +2273 => x"79812c5a", +2274 => x"57575473", +2275 => x"8025ffa8", +2276 => x"38d13980", +2277 => x"57ff9339", +2278 => x"7251bc13", +2279 => x"0854732d", +2280 => x"7951fe9b", +2281 => x"3f707080", +2282 => x"e5d40bfc", +2283 => x"05700852", +2284 => x"5270ff2e", +2285 => x"9138702d", +2286 => x"fc127008", +2287 => x"525270ff", +2288 => x"2e098106", +2289 => x"f1385050", +2290 => x"0404c2ff", +2291 => x"3f040000", +2292 => x"00000040", +2293 => x"30313233", +2294 => x"34353637", +2295 => x"38390000", +2296 => x"44485259", +2297 => x"53544f4e", +2298 => x"45205052", +2299 => x"4f475241", +2300 => x"4d2c2053", +2301 => x"4f4d4520", +2302 => x"53545249", +2303 => x"4e470000", +2304 => x"44485259", +2305 => x"53544f4e", +2306 => x"45205052", +2307 => x"4f475241", +2308 => x"4d2c2031", +2309 => x"27535420", +2310 => x"53545249", +2311 => x"4e470000", +2312 => x"44687279", +2313 => x"73746f6e", +2314 => x"65204265", +2315 => x"6e63686d", +2316 => x"61726b2c", +2317 => x"20566572", +2318 => x"73696f6e", +2319 => x"20322e31", +2320 => x"20284c61", +2321 => x"6e677561", +2322 => x"67653a20", +2323 => x"43290a00", +2324 => x"50726f67", +2325 => x"72616d20", +2326 => x"636f6d70", +2327 => x"696c6564", +2328 => x"20776974", +2329 => x"68202772", +2330 => x"65676973", +2331 => x"74657227", +2332 => x"20617474", +2333 => x"72696275", +2334 => x"74650a00", +2335 => x"45786563", +2336 => x"7574696f", +2337 => x"6e207374", +2338 => x"61727473", +2339 => x"2c202564", +2340 => x"2072756e", +2341 => x"73207468", +2342 => x"726f7567", +2343 => x"68204468", +2344 => x"72797374", +2345 => x"6f6e650a", +2346 => x"00000000", +2347 => x"44485259", +2348 => x"53544f4e", +2349 => x"45205052", +2350 => x"4f475241", +2351 => x"4d2c2032", +2352 => x"274e4420", +2353 => x"53545249", +2354 => x"4e470000", +2355 => x"45786563", +2356 => x"7574696f", +2357 => x"6e20656e", +2358 => x"64730a00", +2359 => x"46696e61", +2360 => x"6c207661", +2361 => x"6c756573", +2362 => x"206f6620", +2363 => x"74686520", +2364 => x"76617269", +2365 => x"61626c65", +2366 => x"73207573", +2367 => x"65642069", +2368 => x"6e207468", +2369 => x"65206265", +2370 => x"6e63686d", +2371 => x"61726b3a", +2372 => x"0a000000", +2373 => x"496e745f", +2374 => x"476c6f62", +2375 => x"3a202020", +2376 => x"20202020", +2377 => x"20202020", +2378 => x"2025640a", +2379 => x"00000000", +2380 => x"20202020", +2381 => x"20202020", +2382 => x"73686f75", +2383 => x"6c642062", +2384 => x"653a2020", +2385 => x"2025640a", +2386 => x"00000000", +2387 => x"426f6f6c", +2388 => x"5f476c6f", +2389 => x"623a2020", +2390 => x"20202020", +2391 => x"20202020", +2392 => x"2025640a", +2393 => x"00000000", +2394 => x"43685f31", +2395 => x"5f476c6f", +2396 => x"623a2020", +2397 => x"20202020", +2398 => x"20202020", +2399 => x"2025630a", +2400 => x"00000000", +2401 => x"20202020", +2402 => x"20202020", +2403 => x"73686f75", +2404 => x"6c642062", +2405 => x"653a2020", +2406 => x"2025630a", +2407 => x"00000000", +2408 => x"43685f32", +2409 => x"5f476c6f", +2410 => x"623a2020", +2411 => x"20202020", +2412 => x"20202020", +2413 => x"2025630a", +2414 => x"00000000", +2415 => x"4172725f", +2416 => x"315f476c", +2417 => x"6f625b38", +2418 => x"5d3a2020", +2419 => x"20202020", +2420 => x"2025640a", +2421 => x"00000000", +2422 => x"4172725f", +2423 => x"325f476c", +2424 => x"6f625b38", +2425 => x"5d5b375d", +2426 => x"3a202020", +2427 => x"2025640a", +2428 => x"00000000", +2429 => x"20202020", +2430 => x"20202020", +2431 => x"73686f75", +2432 => x"6c642062", +2433 => x"653a2020", +2434 => x"204e756d", +2435 => x"6265725f", +2436 => x"4f665f52", +2437 => x"756e7320", +2438 => x"2b203130", +2439 => x"0a000000", +2440 => x"5074725f", +2441 => x"476c6f62", +2442 => x"2d3e0a00", +2443 => x"20205074", +2444 => x"725f436f", +2445 => x"6d703a20", +2446 => x"20202020", +2447 => x"20202020", +2448 => x"2025640a", +2449 => x"00000000", +2450 => x"20202020", +2451 => x"20202020", +2452 => x"73686f75", +2453 => x"6c642062", +2454 => x"653a2020", +2455 => x"2028696d", +2456 => x"706c656d", +2457 => x"656e7461", +2458 => x"74696f6e", +2459 => x"2d646570", +2460 => x"656e6465", +2461 => x"6e74290a", +2462 => x"00000000", +2463 => x"20204469", +2464 => x"7363723a", +2465 => x"20202020", +2466 => x"20202020", +2467 => x"20202020", +2468 => x"2025640a", +2469 => x"00000000", +2470 => x"2020456e", +2471 => x"756d5f43", +2472 => x"6f6d703a", +2473 => x"20202020", +2474 => x"20202020", +2475 => x"2025640a", +2476 => x"00000000", +2477 => x"2020496e", +2478 => x"745f436f", +2479 => x"6d703a20", +2480 => x"20202020", +2481 => x"20202020", +2482 => x"2025640a", +2483 => x"00000000", +2484 => x"20205374", +2485 => x"725f436f", +2486 => x"6d703a20", +2487 => x"20202020", +2488 => x"20202020", +2489 => x"2025730a", +2490 => x"00000000", +2491 => x"20202020", +2492 => x"20202020", +2493 => x"73686f75", +2494 => x"6c642062", +2495 => x"653a2020", +2496 => x"20444852", +2497 => x"5953544f", +2498 => x"4e452050", +2499 => x"524f4752", +2500 => x"414d2c20", +2501 => x"534f4d45", +2502 => x"20535452", +2503 => x"494e470a", +2504 => x"00000000", +2505 => x"4e657874", +2506 => x"5f507472", +2507 => x"5f476c6f", +2508 => x"622d3e0a", +2509 => x"00000000", +2510 => x"20202020", +2511 => x"20202020", +2512 => x"73686f75", +2513 => x"6c642062", +2514 => x"653a2020", +2515 => x"2028696d", +2516 => x"706c656d", +2517 => x"656e7461", +2518 => x"74696f6e", +2519 => x"2d646570", +2520 => x"656e6465", +2521 => x"6e74292c", +2522 => x"2073616d", +2523 => x"65206173", +2524 => x"2061626f", +2525 => x"76650a00", +2526 => x"496e745f", +2527 => x"315f4c6f", +2528 => x"633a2020", +2529 => x"20202020", +2530 => x"20202020", +2531 => x"2025640a", +2532 => x"00000000", +2533 => x"496e745f", +2534 => x"325f4c6f", +2535 => x"633a2020", +2536 => x"20202020", +2537 => x"20202020", +2538 => x"2025640a", +2539 => x"00000000", +2540 => x"496e745f", +2541 => x"335f4c6f", +2542 => x"633a2020", +2543 => x"20202020", +2544 => x"20202020", +2545 => x"2025640a", +2546 => x"00000000", +2547 => x"456e756d", +2548 => x"5f4c6f63", +2549 => x"3a202020", +2550 => x"20202020", +2551 => x"20202020", +2552 => x"2025640a", +2553 => x"00000000", +2554 => x"5374725f", +2555 => x"315f4c6f", +2556 => x"633a2020", +2557 => x"20202020", +2558 => x"20202020", +2559 => x"2025730a", +2560 => x"00000000", +2561 => x"20202020", +2562 => x"20202020", +2563 => x"73686f75", +2564 => x"6c642062", +2565 => x"653a2020", +2566 => x"20444852", +2567 => x"5953544f", +2568 => x"4e452050", +2569 => x"524f4752", +2570 => x"414d2c20", +2571 => x"31275354", +2572 => x"20535452", +2573 => x"494e470a", +2574 => x"00000000", +2575 => x"5374725f", +2576 => x"325f4c6f", +2577 => x"633a2020", +2578 => x"20202020", +2579 => x"20202020", +2580 => x"2025730a", +2581 => x"00000000", +2582 => x"20202020", +2583 => x"20202020", +2584 => x"73686f75", +2585 => x"6c642062", +2586 => x"653a2020", +2587 => x"20444852", +2588 => x"5953544f", +2589 => x"4e452050", +2590 => x"524f4752", +2591 => x"414d2c20", +2592 => x"32274e44", +2593 => x"20535452", +2594 => x"494e470a", +2595 => x"00000000", +2596 => x"55736572", +2597 => x"2074696d", +2598 => x"653a2025", +2599 => x"640a0000", +2600 => x"4d696372", +2601 => x"6f736563", +2602 => x"6f6e6473", +2603 => x"20666f72", +2604 => x"206f6e65", +2605 => x"2072756e", +2606 => x"20746872", +2607 => x"6f756768", +2608 => x"20446872", +2609 => x"7973746f", +2610 => x"6e653a20", +2611 => x"00000000", +2612 => x"2564200a", +2613 => x"00000000", +2614 => x"44687279", +2615 => x"73746f6e", +2616 => x"65732070", +2617 => x"65722053", +2618 => x"65636f6e", +2619 => x"643a2020", +2620 => x"20202020", +2621 => x"20202020", +2622 => x"20202020", +2623 => x"20202020", +2624 => x"20202020", +2625 => x"00000000", +2626 => x"56415820", +2627 => x"4d495053", +2628 => x"20726174", +2629 => x"696e6720", +2630 => x"2a203130", +2631 => x"3030203d", +2632 => x"20256420", +2633 => x"0a000000", +2634 => x"50726f67", +2635 => x"72616d20", +2636 => x"636f6d70", +2637 => x"696c6564", +2638 => x"20776974", +2639 => x"686f7574", +2640 => x"20277265", +2641 => x"67697374", +2642 => x"65722720", +2643 => x"61747472", +2644 => x"69627574", +2645 => x"650a0000", +2646 => x"4d656173", +2647 => x"75726564", +2648 => x"2074696d", +2649 => x"6520746f", +2650 => x"6f20736d", +2651 => x"616c6c20", +2652 => x"746f206f", +2653 => x"62746169", +2654 => x"6e206d65", +2655 => x"616e696e", +2656 => x"6766756c", +2657 => x"20726573", +2658 => x"756c7473", +2659 => x"0a000000", +2660 => x"506c6561", +2661 => x"73652069", +2662 => x"6e637265", +2663 => x"61736520", +2664 => x"6e756d62", +2665 => x"6572206f", +2666 => x"66207275", +2667 => x"6e730a00", +2668 => x"44485259", +2669 => x"53544f4e", +2670 => x"45205052", +2671 => x"4f475241", +2672 => x"4d2c2033", +2673 => x"27524420", +2674 => x"53545249", +2675 => x"4e470000", +2676 => x"00010202", +2677 => x"03030303", +2678 => x"04040404", +2679 => x"04040404", +2680 => x"05050505", +2681 => x"05050505", +2682 => x"05050505", +2683 => x"05050505", +2684 => x"06060606", +2685 => x"06060606", +2686 => x"06060606", +2687 => x"06060606", +2688 => x"06060606", +2689 => x"06060606", +2690 => x"06060606", +2691 => x"06060606", +2692 => x"07070707", +2693 => x"07070707", +2694 => x"07070707", +2695 => x"07070707", +2696 => x"07070707", +2697 => x"07070707", +2698 => x"07070707", +2699 => x"07070707", +2700 => x"07070707", +2701 => x"07070707", +2702 => x"07070707", +2703 => x"07070707", +2704 => x"07070707", +2705 => x"07070707", +2706 => x"07070707", +2707 => x"07070707", +2708 => x"08080808", +2709 => x"08080808", +2710 => x"08080808", +2711 => x"08080808", +2712 => x"08080808", +2713 => x"08080808", +2714 => x"08080808", +2715 => x"08080808", +2716 => x"08080808", +2717 => x"08080808", +2718 => x"08080808", +2719 => x"08080808", +2720 => x"08080808", +2721 => x"08080808", +2722 => x"08080808", +2723 => x"08080808", +2724 => x"08080808", +2725 => x"08080808", +2726 => x"08080808", +2727 => x"08080808", +2728 => x"08080808", +2729 => x"08080808", +2730 => x"08080808", +2731 => x"08080808", +2732 => x"08080808", +2733 => x"08080808", +2734 => x"08080808", +2735 => x"08080808", +2736 => x"08080808", +2737 => x"08080808", +2738 => x"08080808", +2739 => x"08080808", +2740 => x"43000000", +2741 => x"64756d6d", +2742 => x"792e6578", +2743 => x"65000000", +2744 => x"00ffffff", +2745 => x"ff00ffff", +2746 => x"ffff00ff", +2747 => x"ffffff00", +2748 => x"00000000", +2749 => x"00000000", +2750 => x"00000000", +2751 => x"000032dc", +2752 => x"0000c350", +2753 => x"00000000", +2754 => x"00000000", +2755 => x"00000000", +2756 => x"00000000", +2757 => x"00000000", +2758 => x"00000000", +2759 => x"00000000", +2760 => x"00000000", +2761 => x"00000000", +2762 => x"00000000", +2763 => x"00000000", +2764 => x"00000000", +2765 => x"00000000", +2766 => x"ffffffff", +2767 => x"00000000", +2768 => x"00020000", +2769 => x"00000000", +2770 => x"00000000", +2771 => x"00002b44", +2772 => x"00002b44", +2773 => x"00002b4c", +2774 => x"00002b4c", +2775 => x"00002b54", +2776 => x"00002b54", +2777 => x"00002b5c", +2778 => x"00002b5c", +2779 => x"00002b64", +2780 => x"00002b64", +2781 => x"00002b6c", +2782 => x"00002b6c", +2783 => x"00002b74", +2784 => x"00002b74", +2785 => x"00002b7c", +2786 => x"00002b7c", +2787 => x"00002b84", +2788 => x"00002b84", +2789 => x"00002b8c", +2790 => x"00002b8c", +2791 => x"00002b94", +2792 => x"00002b94", +2793 => x"00002b9c", +2794 => x"00002b9c", +2795 => x"00002ba4", +2796 => x"00002ba4", +2797 => x"00002bac", +2798 => x"00002bac", +2799 => x"00002bb4", +2800 => x"00002bb4", +2801 => x"00002bbc", +2802 => x"00002bbc", +2803 => x"00002bc4", +2804 => x"00002bc4", +2805 => x"00002bcc", +2806 => x"00002bcc", +2807 => x"00002bd4", +2808 => x"00002bd4", +2809 => x"00002bdc", +2810 => x"00002bdc", +2811 => x"00002be4", +2812 => x"00002be4", +2813 => x"00002bec", +2814 => x"00002bec", +2815 => x"00002bf4", +2816 => x"00002bf4", +2817 => x"00002bfc", +2818 => x"00002bfc", +2819 => x"00002c04", +2820 => x"00002c04", +2821 => x"00002c0c", +2822 => x"00002c0c", +2823 => x"00002c14", +2824 => x"00002c14", +2825 => x"00002c1c", +2826 => x"00002c1c", +2827 => x"00002c24", +2828 => x"00002c24", +2829 => x"00002c2c", +2830 => x"00002c2c", +2831 => x"00002c34", +2832 => x"00002c34", +2833 => x"00002c3c", +2834 => x"00002c3c", +2835 => x"00002c44", +2836 => x"00002c44", +2837 => x"00002c4c", +2838 => x"00002c4c", +2839 => x"00002c54", +2840 => x"00002c54", +2841 => x"00002c5c", +2842 => x"00002c5c", +2843 => x"00002c64", +2844 => x"00002c64", +2845 => x"00002c6c", +2846 => x"00002c6c", +2847 => x"00002c74", +2848 => x"00002c74", +2849 => x"00002c7c", +2850 => x"00002c7c", +2851 => x"00002c84", +2852 => x"00002c84", +2853 => x"00002c8c", +2854 => x"00002c8c", +2855 => x"00002c94", +2856 => x"00002c94", +2857 => x"00002c9c", +2858 => x"00002c9c", +2859 => x"00002ca4", +2860 => x"00002ca4", +2861 => x"00002cac", +2862 => x"00002cac", +2863 => x"00002cb4", +2864 => x"00002cb4", +2865 => x"00002cbc", +2866 => x"00002cbc", +2867 => x"00002cc4", +2868 => x"00002cc4", +2869 => x"00002ccc", +2870 => x"00002ccc", +2871 => x"00002cd4", +2872 => x"00002cd4", +2873 => x"00002cdc", +2874 => x"00002cdc", +2875 => x"00002ce4", +2876 => x"00002ce4", +2877 => x"00002cec", +2878 => x"00002cec", +2879 => x"00002cf4", +2880 => x"00002cf4", +2881 => x"00002cfc", +2882 => x"00002cfc", +2883 => x"00002d04", +2884 => x"00002d04", +2885 => x"00002d0c", +2886 => x"00002d0c", +2887 => x"00002d14", +2888 => x"00002d14", +2889 => x"00002d1c", +2890 => x"00002d1c", +2891 => x"00002d24", +2892 => x"00002d24", +2893 => x"00002d2c", +2894 => x"00002d2c", +2895 => x"00002d34", +2896 => x"00002d34", +2897 => x"00002d3c", +2898 => x"00002d3c", +2899 => x"00002d44", +2900 => x"00002d44", +2901 => x"00002d4c", +2902 => x"00002d4c", +2903 => x"00002d54", +2904 => x"00002d54", +2905 => x"00002d5c", +2906 => x"00002d5c", +2907 => x"00002d64", +2908 => x"00002d64", +2909 => x"00002d6c", +2910 => x"00002d6c", +2911 => x"00002d74", +2912 => x"00002d74", +2913 => x"00002d7c", +2914 => x"00002d7c", +2915 => x"00002d84", +2916 => x"00002d84", +2917 => x"00002d8c", +2918 => x"00002d8c", +2919 => x"00002d94", +2920 => x"00002d94", +2921 => x"00002d9c", +2922 => x"00002d9c", +2923 => x"00002da4", +2924 => x"00002da4", +2925 => x"00002dac", +2926 => x"00002dac", +2927 => x"00002db4", +2928 => x"00002db4", +2929 => x"00002dbc", +2930 => x"00002dbc", +2931 => x"00002dc4", +2932 => x"00002dc4", +2933 => x"00002dcc", +2934 => x"00002dcc", +2935 => x"00002dd4", +2936 => x"00002dd4", +2937 => x"00002ddc", +2938 => x"00002ddc", +2939 => x"00002de4", +2940 => x"00002de4", +2941 => x"00002dec", +2942 => x"00002dec", +2943 => x"00002df4", +2944 => x"00002df4", +2945 => x"00002dfc", +2946 => x"00002dfc", +2947 => x"00002e04", +2948 => x"00002e04", +2949 => x"00002e0c", +2950 => x"00002e0c", +2951 => x"00002e14", +2952 => x"00002e14", +2953 => x"00002e1c", +2954 => x"00002e1c", +2955 => x"00002e24", +2956 => x"00002e24", +2957 => x"00002e2c", +2958 => x"00002e2c", +2959 => x"00002e34", +2960 => x"00002e34", +2961 => x"00002e3c", +2962 => x"00002e3c", +2963 => x"00002e44", +2964 => x"00002e44", +2965 => x"00002e4c", +2966 => x"00002e4c", +2967 => x"00002e54", +2968 => x"00002e54", +2969 => x"00002e5c", +2970 => x"00002e5c", +2971 => x"00002e64", +2972 => x"00002e64", +2973 => x"00002e6c", +2974 => x"00002e6c", +2975 => x"00002e74", +2976 => x"00002e74", +2977 => x"00002e7c", +2978 => x"00002e7c", +2979 => x"00002e84", +2980 => x"00002e84", +2981 => x"00002e8c", +2982 => x"00002e8c", +2983 => x"00002e94", +2984 => x"00002e94", +2985 => x"00002e9c", +2986 => x"00002e9c", +2987 => x"00002ea4", +2988 => x"00002ea4", +2989 => x"00002eac", +2990 => x"00002eac", +2991 => x"00002eb4", +2992 => x"00002eb4", +2993 => x"00002ebc", +2994 => x"00002ebc", +2995 => x"00002ec4", +2996 => x"00002ec4", +2997 => x"00002ecc", +2998 => x"00002ecc", +2999 => x"00002ed4", +3000 => x"00002ed4", +3001 => x"00002edc", +3002 => x"00002edc", +3003 => x"00002ee4", +3004 => x"00002ee4", +3005 => x"00002eec", +3006 => x"00002eec", +3007 => x"00002ef4", +3008 => x"00002ef4", +3009 => x"00002efc", +3010 => x"00002efc", +3011 => x"00002f04", +3012 => x"00002f04", +3013 => x"00002f0c", +3014 => x"00002f0c", +3015 => x"00002f14", +3016 => x"00002f14", +3017 => x"00002f1c", +3018 => x"00002f1c", +3019 => x"00002f24", +3020 => x"00002f24", +3021 => x"00002f2c", +3022 => x"00002f2c", +3023 => x"00002f34", +3024 => x"00002f34", +3025 => x"00002f3c", +3026 => x"00002f3c", +3027 => x"00002f50", +3028 => x"00000000", +3029 => x"000031b8", +3030 => x"00003214", +3031 => x"00003270", +3032 => x"00000000", +3033 => x"00000000", +3034 => x"00000000", +3035 => x"00000000", +3036 => x"00000000", +3037 => x"00000000", +3038 => x"00000000", +3039 => x"00000000", +3040 => x"00000000", +3041 => x"00002ad0", +3042 => x"00000000", +3043 => x"00000000", +3044 => x"00000000", +3045 => x"00000000", +3046 => x"00000000", +3047 => x"00000000", +3048 => x"00000000", +3049 => x"00000000", +3050 => x"00000000", +3051 => x"00000000", +3052 => x"00000000", +3053 => x"00000000", +3054 => x"00000000", +3055 => x"00000000", +3056 => x"00000000", +3057 => x"00000000", +3058 => x"00000000", +3059 => x"00000000", +3060 => x"00000000", +3061 => x"00000000", +3062 => x"00000000", +3063 => x"00000000", +3064 => x"00000000", +3065 => x"00000000", +3066 => x"00000000", +3067 => x"00000000", +3068 => x"00000000", +3069 => x"00000000", +3070 => x"00000001", +3071 => x"330eabcd", +3072 => x"1234e66d", +3073 => x"deec0005", +3074 => x"000b0000", +3075 => x"00000000", +3076 => x"00000000", +3077 => x"00000000", +3078 => x"00000000", +3079 => x"00000000", +3080 => x"00000000", +3081 => x"00000000", +3082 => x"00000000", +3083 => x"00000000", +3084 => x"00000000", +3085 => x"00000000", +3086 => x"00000000", +3087 => x"00000000", +3088 => x"00000000", +3089 => x"00000000", +3090 => x"00000000", +3091 => x"00000000", +3092 => x"00000000", +3093 => x"00000000", +3094 => x"00000000", +3095 => x"00000000", +3096 => x"00000000", +3097 => x"00000000", +3098 => x"00000000", +3099 => x"00000000", +3100 => x"00000000", +3101 => x"00000000", +3102 => x"00000000", +3103 => x"00000000", +3104 => x"00000000", +3105 => x"00000000", +3106 => x"00000000", +3107 => x"00000000", +3108 => x"00000000", +3109 => x"00000000", +3110 => x"00000000", +3111 => x"00000000", +3112 => x"00000000", +3113 => x"00000000", +3114 => x"00000000", +3115 => x"00000000", +3116 => x"00000000", +3117 => x"00000000", +3118 => x"00000000", +3119 => x"00000000", +3120 => x"00000000", +3121 => x"00000000", +3122 => x"00000000", +3123 => x"00000000", +3124 => x"00000000", +3125 => x"00000000", +3126 => x"00000000", +3127 => x"00000000", +3128 => x"00000000", +3129 => x"00000000", +3130 => x"00000000", +3131 => x"00000000", +3132 => x"00000000", +3133 => x"00000000", +3134 => x"00000000", +3135 => x"00000000", +3136 => x"00000000", +3137 => x"00000000", +3138 => x"00000000", +3139 => x"00000000", +3140 => x"00000000", +3141 => x"00000000", +3142 => x"00000000", +3143 => x"00000000", 3144 => x"00000000", 3145 => x"00000000", 3146 => x"00000000", -3147 => x"0000390c", -3148 => x"000004d2", -- iterations 0x4d2=1234 +3147 => x"00000000", +3148 => x"00000000", 3149 => x"00000000", 3150 => x"00000000", 3151 => x"00000000", @@ -3188,496 +3188,100 @@ shared variable ram : ram_type := 3159 => x"00000000", 3160 => x"00000000", 3161 => x"00000000", -3162 => x"ffffffff", +3162 => x"00000000", 3163 => x"00000000", -3164 => x"00020000", +3164 => x"00000000", 3165 => x"00000000", 3166 => x"00000000", -3167 => x"00003174", -3168 => x"00003174", -3169 => x"0000317c", -3170 => x"0000317c", -3171 => x"00003184", -3172 => x"00003184", -3173 => x"0000318c", -3174 => x"0000318c", -3175 => x"00003194", -3176 => x"00003194", -3177 => x"0000319c", -3178 => x"0000319c", -3179 => x"000031a4", -3180 => x"000031a4", -3181 => x"000031ac", -3182 => x"000031ac", -3183 => x"000031b4", -3184 => x"000031b4", -3185 => x"000031bc", -3186 => x"000031bc", -3187 => x"000031c4", -3188 => x"000031c4", -3189 => x"000031cc", -3190 => x"000031cc", -3191 => x"000031d4", -3192 => x"000031d4", -3193 => x"000031dc", -3194 => x"000031dc", -3195 => x"000031e4", -3196 => x"000031e4", -3197 => x"000031ec", -3198 => x"000031ec", -3199 => x"000031f4", -3200 => x"000031f4", -3201 => x"000031fc", -3202 => x"000031fc", -3203 => x"00003204", -3204 => x"00003204", -3205 => x"0000320c", -3206 => x"0000320c", -3207 => x"00003214", -3208 => x"00003214", -3209 => x"0000321c", -3210 => x"0000321c", -3211 => x"00003224", -3212 => x"00003224", -3213 => x"0000322c", -3214 => x"0000322c", -3215 => x"00003234", -3216 => x"00003234", -3217 => x"0000323c", -3218 => x"0000323c", -3219 => x"00003244", -3220 => x"00003244", -3221 => x"0000324c", -3222 => x"0000324c", -3223 => x"00003254", -3224 => x"00003254", -3225 => x"0000325c", -3226 => x"0000325c", -3227 => x"00003264", -3228 => x"00003264", -3229 => x"0000326c", -3230 => x"0000326c", -3231 => x"00003274", -3232 => x"00003274", -3233 => x"0000327c", -3234 => x"0000327c", -3235 => x"00003284", -3236 => x"00003284", -3237 => x"0000328c", -3238 => x"0000328c", -3239 => x"00003294", -3240 => x"00003294", -3241 => x"0000329c", -3242 => x"0000329c", -3243 => x"000032a4", -3244 => x"000032a4", -3245 => x"000032ac", -3246 => x"000032ac", -3247 => x"000032b4", -3248 => x"000032b4", -3249 => x"000032bc", -3250 => x"000032bc", -3251 => x"000032c4", -3252 => x"000032c4", -3253 => x"000032cc", -3254 => x"000032cc", -3255 => x"000032d4", -3256 => x"000032d4", -3257 => x"000032dc", -3258 => x"000032dc", -3259 => x"000032e4", -3260 => x"000032e4", -3261 => x"000032ec", -3262 => x"000032ec", -3263 => x"000032f4", -3264 => x"000032f4", -3265 => x"000032fc", -3266 => x"000032fc", -3267 => x"00003304", -3268 => x"00003304", -3269 => x"0000330c", -3270 => x"0000330c", -3271 => x"00003314", -3272 => x"00003314", -3273 => x"0000331c", -3274 => x"0000331c", -3275 => x"00003324", -3276 => x"00003324", -3277 => x"0000332c", -3278 => x"0000332c", -3279 => x"00003334", -3280 => x"00003334", -3281 => x"0000333c", -3282 => x"0000333c", -3283 => x"00003344", -3284 => x"00003344", -3285 => x"0000334c", -3286 => x"0000334c", -3287 => x"00003354", -3288 => x"00003354", -3289 => x"0000335c", -3290 => x"0000335c", -3291 => x"00003364", -3292 => x"00003364", -3293 => x"0000336c", -3294 => x"0000336c", -3295 => x"00003374", -3296 => x"00003374", -3297 => x"0000337c", -3298 => x"0000337c", -3299 => x"00003384", -3300 => x"00003384", -3301 => x"0000338c", -3302 => x"0000338c", -3303 => x"00003394", -3304 => x"00003394", -3305 => x"0000339c", -3306 => x"0000339c", -3307 => x"000033a4", -3308 => x"000033a4", -3309 => x"000033ac", -3310 => x"000033ac", -3311 => x"000033b4", -3312 => x"000033b4", -3313 => x"000033bc", -3314 => x"000033bc", -3315 => x"000033c4", -3316 => x"000033c4", -3317 => x"000033cc", -3318 => x"000033cc", -3319 => x"000033d4", -3320 => x"000033d4", -3321 => x"000033dc", -3322 => x"000033dc", -3323 => x"000033e4", -3324 => x"000033e4", -3325 => x"000033ec", -3326 => x"000033ec", -3327 => x"000033f4", -3328 => x"000033f4", -3329 => x"000033fc", -3330 => x"000033fc", -3331 => x"00003404", -3332 => x"00003404", -3333 => x"0000340c", -3334 => x"0000340c", -3335 => x"00003414", -3336 => x"00003414", -3337 => x"0000341c", -3338 => x"0000341c", -3339 => x"00003424", -3340 => x"00003424", -3341 => x"0000342c", -3342 => x"0000342c", -3343 => x"00003434", -3344 => x"00003434", -3345 => x"0000343c", -3346 => x"0000343c", -3347 => x"00003444", -3348 => x"00003444", -3349 => x"0000344c", -3350 => x"0000344c", -3351 => x"00003454", -3352 => x"00003454", -3353 => x"0000345c", -3354 => x"0000345c", -3355 => x"00003464", -3356 => x"00003464", -3357 => x"0000346c", -3358 => x"0000346c", -3359 => x"00003474", -3360 => x"00003474", -3361 => x"0000347c", -3362 => x"0000347c", -3363 => x"00003484", -3364 => x"00003484", -3365 => x"0000348c", -3366 => x"0000348c", -3367 => x"00003494", -3368 => x"00003494", -3369 => x"0000349c", -3370 => x"0000349c", -3371 => x"000034a4", -3372 => x"000034a4", -3373 => x"000034ac", -3374 => x"000034ac", -3375 => x"000034b4", -3376 => x"000034b4", -3377 => x"000034bc", -3378 => x"000034bc", -3379 => x"000034c4", -3380 => x"000034c4", -3381 => x"000034cc", -3382 => x"000034cc", -3383 => x"000034d4", -3384 => x"000034d4", -3385 => x"000034dc", -3386 => x"000034dc", -3387 => x"000034e4", -3388 => x"000034e4", -3389 => x"000034ec", -3390 => x"000034ec", -3391 => x"000034f4", -3392 => x"000034f4", -3393 => x"000034fc", -3394 => x"000034fc", -3395 => x"00003504", -3396 => x"00003504", -3397 => x"0000350c", -3398 => x"0000350c", -3399 => x"00003514", -3400 => x"00003514", -3401 => x"0000351c", -3402 => x"0000351c", -3403 => x"00003524", -3404 => x"00003524", -3405 => x"0000352c", -3406 => x"0000352c", -3407 => x"00003534", -3408 => x"00003534", -3409 => x"0000353c", -3410 => x"0000353c", -3411 => x"00003544", -3412 => x"00003544", -3413 => x"0000354c", -3414 => x"0000354c", -3415 => x"00003554", -3416 => x"00003554", -3417 => x"0000355c", -3418 => x"0000355c", -3419 => x"00003564", -3420 => x"00003564", -3421 => x"0000356c", -3422 => x"0000356c", -3423 => x"00003580", -3424 => x"00000000", -3425 => x"000037e8", -3426 => x"00003844", -3427 => x"000038a0", -3428 => x"00000000", -3429 => x"00000000", -3430 => x"00000000", -3431 => x"00000000", -3432 => x"00000000", -3433 => x"00000000", -3434 => x"00000000", -3435 => x"00000000", -3436 => x"00000000", -3437 => x"00003100", -3438 => x"00000000", -3439 => x"00000000", -3440 => x"00000000", -3441 => x"00000000", -3442 => x"00000000", -3443 => x"00000000", -3444 => x"00000000", -3445 => x"00000000", -3446 => x"00000000", -3447 => x"00000000", -3448 => x"00000000", -3449 => x"00000000", -3450 => x"00000000", -3451 => x"00000000", -3452 => x"00000000", -3453 => x"00000000", -3454 => x"00000000", -3455 => x"00000000", -3456 => x"00000000", -3457 => x"00000000", -3458 => x"00000000", -3459 => x"00000000", -3460 => x"00000000", -3461 => x"00000000", -3462 => x"00000000", -3463 => x"00000000", -3464 => x"00000000", -3465 => x"00000000", -3466 => x"00000001", -3467 => x"330eabcd", -3468 => x"1234e66d", -3469 => x"deec0005", -3470 => x"000b0000", -3471 => x"00000000", -3472 => x"00000000", -3473 => x"00000000", -3474 => x"00000000", -3475 => x"00000000", -3476 => x"00000000", -3477 => x"00000000", -3478 => x"00000000", -3479 => x"00000000", -3480 => x"00000000", -3481 => x"00000000", -3482 => x"00000000", -3483 => x"00000000", -3484 => x"00000000", -3485 => x"00000000", -3486 => x"00000000", -3487 => x"00000000", -3488 => x"00000000", -3489 => x"00000000", -3490 => x"00000000", -3491 => x"00000000", -3492 => x"00000000", -3493 => x"00000000", -3494 => x"00000000", -3495 => x"00000000", -3496 => x"00000000", -3497 => x"00000000", -3498 => x"00000000", -3499 => x"00000000", -3500 => x"00000000", -3501 => x"00000000", -3502 => x"00000000", -3503 => x"00000000", -3504 => x"00000000", -3505 => x"00000000", -3506 => x"00000000", -3507 => x"00000000", -3508 => x"00000000", -3509 => x"00000000", -3510 => x"00000000", -3511 => x"00000000", -3512 => x"00000000", -3513 => x"00000000", -3514 => x"00000000", -3515 => x"00000000", -3516 => x"00000000", -3517 => x"00000000", -3518 => x"00000000", -3519 => x"00000000", -3520 => x"00000000", -3521 => x"00000000", -3522 => x"00000000", -3523 => x"00000000", -3524 => x"00000000", -3525 => x"00000000", -3526 => x"00000000", -3527 => x"00000000", -3528 => x"00000000", -3529 => x"00000000", -3530 => x"00000000", -3531 => x"00000000", -3532 => x"00000000", -3533 => x"00000000", -3534 => x"00000000", -3535 => x"00000000", -3536 => x"00000000", -3537 => x"00000000", -3538 => x"00000000", -3539 => x"00000000", -3540 => x"00000000", -3541 => x"00000000", -3542 => x"00000000", -3543 => x"00000000", -3544 => x"00000000", -3545 => x"00000000", -3546 => x"00000000", -3547 => x"00000000", -3548 => x"00000000", -3549 => x"00000000", -3550 => x"00000000", -3551 => x"00000000", -3552 => x"00000000", -3553 => x"00000000", -3554 => x"00000000", -3555 => x"00000000", -3556 => x"00000000", -3557 => x"00000000", -3558 => x"00000000", -3559 => x"00000000", -3560 => x"00000000", -3561 => x"00000000", -3562 => x"00000000", -3563 => x"00000000", -3564 => x"00000000", -3565 => x"00000000", -3566 => x"00000000", -3567 => x"00000000", -3568 => x"00000000", -3569 => x"00000000", -3570 => x"00000000", -3571 => x"00000000", -3572 => x"00000000", -3573 => x"00000000", -3574 => x"00000000", -3575 => x"00000000", -3576 => x"00000000", -3577 => x"00000000", -3578 => x"00000000", -3579 => x"00000000", -3580 => x"00000000", -3581 => x"00000000", -3582 => x"00000000", -3583 => x"00000000", -3584 => x"00000000", -3585 => x"00000000", -3586 => x"00000000", -3587 => x"00000000", -3588 => x"00000000", -3589 => x"00000000", -3590 => x"00000000", -3591 => x"00000000", -3592 => x"00000000", -3593 => x"00000000", -3594 => x"00000000", -3595 => x"00000000", -3596 => x"00000000", -3597 => x"00000000", -3598 => x"00000000", -3599 => x"00000000", -3600 => x"00000000", -3601 => x"00000000", -3602 => x"00000000", -3603 => x"00000000", -3604 => x"00000000", -3605 => x"00000000", -3606 => x"00000000", -3607 => x"00000000", -3608 => x"00000000", -3609 => x"00000000", -3610 => x"00000000", -3611 => x"00000000", -3612 => x"00000000", -3613 => x"00000000", -3614 => x"00000000", -3615 => x"00000000", -3616 => x"00000000", -3617 => x"00000000", -3618 => x"00000000", -3619 => x"00000000", -3620 => x"00000000", -3621 => x"00000000", -3622 => x"00000000", -3623 => x"00000000", -3624 => x"00000000", -3625 => x"00000000", -3626 => x"00000000", -3627 => x"00000000", -3628 => x"00000000", -3629 => x"00000000", -3630 => x"00000000", -3631 => x"00000000", -3632 => x"00000000", -3633 => x"00000000", -3634 => x"00000000", -3635 => x"00000000", -3636 => x"00000000", -3637 => x"00000000", -3638 => x"00000000", -3639 => x"00000000", -3640 => x"00000000", -3641 => x"00000000", -3642 => x"00000000", -3643 => x"00000000", -3644 => x"00000000", -3645 => x"00000000", -3646 => x"00000000", -3647 => x"00003104", -3648 => x"ffffffff", -3649 => x"00000000", -3650 => x"ffffffff", -3651 => x"00000000", +3167 => x"00000000", +3168 => x"00000000", +3169 => x"00000000", +3170 => x"00000000", +3171 => x"00000000", +3172 => x"00000000", +3173 => x"00000000", +3174 => x"00000000", +3175 => x"00000000", +3176 => x"00000000", +3177 => x"00000000", +3178 => x"00000000", +3179 => x"00000000", +3180 => x"00000000", +3181 => x"00000000", +3182 => x"00000000", +3183 => x"00000000", +3184 => x"00000000", +3185 => x"00000000", +3186 => x"00000000", +3187 => x"00000000", +3188 => x"00000000", +3189 => x"00000000", +3190 => x"00000000", +3191 => x"00000000", +3192 => x"00000000", +3193 => x"00000000", +3194 => x"00000000", +3195 => x"00000000", +3196 => x"00000000", +3197 => x"00000000", +3198 => x"00000000", +3199 => x"00000000", +3200 => x"00000000", +3201 => x"00000000", +3202 => x"00000000", +3203 => x"00000000", +3204 => x"00000000", +3205 => x"00000000", +3206 => x"00000000", +3207 => x"00000000", +3208 => x"00000000", +3209 => x"00000000", +3210 => x"00000000", +3211 => x"00000000", +3212 => x"00000000", +3213 => x"00000000", +3214 => x"00000000", +3215 => x"00000000", +3216 => x"00000000", +3217 => x"00000000", +3218 => x"00000000", +3219 => x"00000000", +3220 => x"00000000", +3221 => x"00000000", +3222 => x"00000000", +3223 => x"00000000", +3224 => x"00000000", +3225 => x"00000000", +3226 => x"00000000", +3227 => x"00000000", +3228 => x"00000000", +3229 => x"00000000", +3230 => x"00000000", +3231 => x"00000000", +3232 => x"00000000", +3233 => x"00000000", +3234 => x"00000000", +3235 => x"00000000", +3236 => x"00000000", +3237 => x"00000000", +3238 => x"00000000", +3239 => x"00000000", +3240 => x"00000000", +3241 => x"00000000", +3242 => x"00000000", +3243 => x"00000000", +3244 => x"00000000", +3245 => x"00000000", +3246 => x"00000000", +3247 => x"00000000", +3248 => x"00000000", +3249 => x"00000000", +3250 => x"00000000", +3251 => x"00002ad4", +3252 => x"ffffffff", +3253 => x"00000000", +3254 => x"ffffffff", +3255 => x"00000000", others => x"00000000" ); @@ -3692,7 +3296,9 @@ begin if (mem_writeEnable = '1') then ram(conv_integer(mem_addr(maxAddrBit downto minAddrBit))) := mem_write; end if; + if (mem_readEnable = '1') then mem_read <= ram(conv_integer(mem_addr(maxAddrBit downto minAddrBit))); + end if; end if; end process; diff --git a/zpu/hdl/zpu4/src/fastdmips.do b/zpu/hdl/zpu4/src/fastdmips.do deleted file mode 100644 index 504bf60..0000000 --- a/zpu/hdl/zpu4/src/fastdmips.do +++ /dev/null @@ -1,19 +0,0 @@ -set BreakOnAssertion 1 -vlib work - -vcom -93 -explicit zpu_config_fastsim.vhd -vcom -93 -explicit zpupkg.vhd -vcom -93 -explicit txt_util.vhd -vcom -93 -explicit sim_fpga_top.vhd -vcom -93 -explicit zpu_core.vhd -vcom -93 -explicit dram_dmips.vhd -vcom -93 -explicit timer.vhd -vcom -93 -explicit io.vhd -vcom -93 -explicit trace.vhd - - -vsim fpga_top -view wave - -# run ZPU -run 60000 ms diff --git a/zpu/hdl/zpu4/src/fastdmipsintstack.do b/zpu/hdl/zpu4/src/fastdmipsintstack.do deleted file mode 100644 index ee9571e..0000000 --- a/zpu/hdl/zpu4/src/fastdmipsintstack.do +++ /dev/null @@ -1,19 +0,0 @@ -set BreakOnAssertion 1 -vlib work - -vcom -93 -explicit zpu_config_fastsim.vhd -vcom -93 -explicit zpupkg.vhd -vcom -93 -explicit txt_util.vhd -vcom -93 -explicit sim_fpga_top.vhd -vcom -93 -explicit zpu_core_intstack.vhd -vcom -93 -explicit dram_dmips.vhd -vcom -93 -explicit timer.vhd -vcom -93 -explicit io.vhd -vcom -93 -explicit trace.vhd - - -vsim fpga_top -view wave - -# run ZPU -run 60000 ms diff --git a/zpu/hdl/zpu4/src/fastdmipssmall.do b/zpu/hdl/zpu4/src/fastdmipssmall.do deleted file mode 100644 index 3eaa083..0000000 --- a/zpu/hdl/zpu4/src/fastdmipssmall.do +++ /dev/null @@ -1,21 +0,0 @@ -set BreakOnAssertion 1 -vlib work - - -vcom -93 -explicit zpu_config_trace.vhd -vcom -93 -explicit zpupkg.vhd -vcom -93 -explicit txt_util.vhd -vcom -93 -explicit sim_fpga_top.vhd -vcom -93 -explicit zpu_core_small.vhd -vcom -93 -explicit bram_dmips.vhd -vcom -93 -explicit dram_dmips.vhd -vcom -93 -explicit timer.vhd -vcom -93 -explicit io.vhd -vcom -93 -explicit trace.vhd - - -vsim fpga_top -view wave - -# run ZPU -run 60000 ms diff --git a/zpu/hdl/zpu4/src/fasthello.do b/zpu/hdl/zpu4/src/fasthello.do deleted file mode 100644 index d49aeab..0000000 --- a/zpu/hdl/zpu4/src/fasthello.do +++ /dev/null @@ -1,19 +0,0 @@ -set BreakOnAssertion 1 -vlib work - -vcom -93 -explicit zpu_config_fastsim.vhd -vcom -93 -explicit zpupkg.vhd -vcom -93 -explicit txt_util.vhd -vcom -93 -explicit sim_fpga_top.vhd -vcom -93 -explicit zpu_core.vhd -vcom -93 -explicit dram_hello.vhd -vcom -93 -explicit timer.vhd -vcom -93 -explicit io.vhd -vcom -93 -explicit trace.vhd - - -vsim fpga_top -view wave - -# run ZPU -run 60000 ms diff --git a/zpu/hdl/zpu4/src/fastsimzpu.do b/zpu/hdl/zpu4/src/fastsimzpu.do deleted file mode 100644 index 504bf60..0000000 --- a/zpu/hdl/zpu4/src/fastsimzpu.do +++ /dev/null @@ -1,19 +0,0 @@ -set BreakOnAssertion 1 -vlib work - -vcom -93 -explicit zpu_config_fastsim.vhd -vcom -93 -explicit zpupkg.vhd -vcom -93 -explicit txt_util.vhd -vcom -93 -explicit sim_fpga_top.vhd -vcom -93 -explicit zpu_core.vhd -vcom -93 -explicit dram_dmips.vhd -vcom -93 -explicit timer.vhd -vcom -93 -explicit io.vhd -vcom -93 -explicit trace.vhd - - -vsim fpga_top -view wave - -# run ZPU -run 60000 ms diff --git a/zpu/hdl/zpu4/src/log.txt b/zpu/hdl/zpu4/src/log.txt index 10f0eaa..47b8a65 100644 --- a/zpu/hdl/zpu4/src/log.txt +++ b/zpu/hdl/zpu4/src/log.txt @@ -1,305 +1,156 @@ -H -e -l -l -o - -w -o -r -l -d - -1 - - - -H -e -l -l -o - -w -o +D +h r -l -d - -2 - - - - - - -H -e -l -l +y +s +t o - -w -o -r -l -d - -1 - - - - - - -H +n e -l -l -o -w -o -r -l -d - -2 - - - - - - -H +B e -l -l -o - -w -o +n +c +h +m +a r -l -d +k +, -1 - - - - - - -H +V e -l -l -o - -w -o r -l -d - -2 - - - - - - -H -e -l -l +s +i o +n -w -o -r -l -d - +2 +. 1 - - - - - - -H -e -l -l -o -w -o -r -l -d - -2 - - - - - - -H +( +L +a +n +g +u +a +g e -l -l -o - -w -o -r -l -d +: -1 +C +) -H -e -l -l -o - -w -o +P r -l -d - -2 - - - - - - -H -e -l -l o +g +r +a +m -w +c o -r +m +p +i l -d - -1 - - - - - - -H e -l -l -o +d w +i +t +h o -r -l -d +u +t -2 - - - - - - -H +' +r +e +g +i +s +t e -l -l -o - -w -o r -l -d +' -1 +a +t +t +r +i +b +u +t +e -H +E +x e -l -l +c +u +t +i o +n -w -o +s +t +a r -l -d +t +s +, -2 - - - - - - -H -e -l -l -o +5 +0 +0 +0 +0 -w -o r -l -d +u +n +s -1 - - - - - - -H -e -l -l +t +h +r o +u +g +h -w -o +D +h r -l -d - -2 - - - +y +s +t +o +n +e -H + diff --git a/zpu/hdl/zpu4/src/zpu_config_fastsim.vhd b/zpu/hdl/zpu4/src/zpu_config_fastsim.vhd deleted file mode 100644 index d39c9e9..0000000 --- a/zpu/hdl/zpu4/src/zpu_config_fastsim.vhd +++ /dev/null @@ -1,15 +0,0 @@ -library ieee; -use ieee.std_logic_1164.all; -use ieee.std_logic_unsigned.all; - -package zpu_config is - - constant Generate_Trace : boolean := false; - constant wordPower : integer := 5; - -- during simulation, set this to '0' to get matching trace.txt - constant DontCareValue : std_logic := '0'; - -- Clock frequency in MHz. - constant ZPU_Frequency : std_logic_vector(7 downto 0) := x"50"; -- 80MHz - constant maxAddrBitIncIO : integer := 15; - -end zpu_config; -- cgit v1.1 From fbe743288c676e94b52849f083a9f3d5015a13ed Mon Sep 17 00:00:00 2001 From: oharboe Date: Fri, 22 Feb 2008 07:57:20 +0000 Subject: wip porting zpu_core_bram.vhd from ZPU3. --- zpu/hdl/zpu4/src/bram_dmips.vhd | 6 +- zpu/hdl/zpu4/src/simzpu_bram.do | 28 ++ zpu/hdl/zpu4/src/zpu_config_trace.vhd | 1 + zpu/hdl/zpu4/src/zpu_core_bram.vhd | 780 ++++++++++++++++++++++++++++++++++ zpu/hdl/zpu4/src/zpu_core_small.vhd | 13 - zpu/hdl/zpu4/src/zpupkg.vhd | 13 + 6 files changed, 825 insertions(+), 16 deletions(-) create mode 100644 zpu/hdl/zpu4/src/simzpu_bram.do create mode 100644 zpu/hdl/zpu4/src/zpu_core_bram.vhd (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/bram_dmips.vhd b/zpu/hdl/zpu4/src/bram_dmips.vhd index 1c85e0d..83bfc28 100644 --- a/zpu/hdl/zpu4/src/bram_dmips.vhd +++ b/zpu/hdl/zpu4/src/bram_dmips.vhd @@ -10,11 +10,11 @@ use work.zpupkg.all; entity dualport_ram is port (clk : in std_logic; memAWriteEnable : in std_logic; - memAAddr : in std_logic_vector(maxAddrBit downto minAddrBit); + memAAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit); memAWrite : in std_logic_vector(wordSize-1 downto 0); memARead : out std_logic_vector(wordSize-1 downto 0); memBWriteEnable : in std_logic; - memBAddr : in std_logic_vector(maxAddrBit downto minAddrBit); + memBAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit); memBWrite : in std_logic_vector(wordSize-1 downto 0); memBRead : out std_logic_vector(wordSize-1 downto 0)); end dualport_ram; @@ -22,7 +22,7 @@ end dualport_ram; architecture dualport_ram_arch of dualport_ram is -type ram_type is array(0 to ((2**(maxAddrBit+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); +type ram_type is array(0 to ((2**(maxAddrBitBRAM+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); shared variable ram : ram_type := ( diff --git a/zpu/hdl/zpu4/src/simzpu_bram.do b/zpu/hdl/zpu4/src/simzpu_bram.do new file mode 100644 index 0000000..1c8673d --- /dev/null +++ b/zpu/hdl/zpu4/src/simzpu_bram.do @@ -0,0 +1,28 @@ +# Xilinx WebPack modelsim script +# +# cd C:/workspace/zpu/zpu/hdl/zpu4/src +# do simzpu_bram.do + +set BreakOnAssertion 1 +vlib work + +vcom -93 -explicit zpu_config_trace.vhd +vcom -93 -explicit zpupkg.vhd +vcom -93 -explicit txt_util.vhd +vcom -93 -explicit sim_fpga_top.vhd +vcom -93 -explicit zpu_core_bram.vhd +vcom -93 -explicit bram_dmips.vhd +vcom -93 -explicit timer.vhd +vcom -93 -explicit io.vhd +vcom -93 -explicit trace.vhd + +# run ZPU +vsim fpga_top +view wave +add wave -recursive fpga_top/zpu/* +#add wave -recursive fpga_top/* +view structure +#view signals + +# Enough to run tiny programs +run 1us diff --git a/zpu/hdl/zpu4/src/zpu_config_trace.vhd b/zpu/hdl/zpu4/src/zpu_config_trace.vhd index a2d7d9d..4d0f15f 100644 --- a/zpu/hdl/zpu4/src/zpu_config_trace.vhd +++ b/zpu/hdl/zpu4/src/zpu_config_trace.vhd @@ -12,6 +12,7 @@ package zpu_config is constant ZPU_Frequency : std_logic_vector(7 downto 0) := x"64"; constant maxAddrBitIncIO : integer := 27; constant maxAddrBitDRAM : integer := 16; + constant maxAddrBitBRAM : integer := 16; constant spStart : std_logic_vector(maxAddrBitIncIO downto 0) := x"001fff8"; end zpu_config; diff --git a/zpu/hdl/zpu4/src/zpu_core_bram.vhd b/zpu/hdl/zpu4/src/zpu_core_bram.vhd new file mode 100644 index 0000000..0bedba3 --- /dev/null +++ b/zpu/hdl/zpu4/src/zpu_core_bram.vhd @@ -0,0 +1,780 @@ +-- Company: ZPU3 +-- Engineer: Øyvind Harboe + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; +use IEEE.STD_LOGIC_arith.ALL; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; + + +-- io_busy : in std_logic; +-- io_read : in std_logic_vector(7 downto 0); +-- io_write : out std_logic_vector(7 downto 0); +-- io_addr : out std_logic_vector(maxAddrBit downto minAddrBit); +-- io_writeEnable : out std_logic; +-- io_readEnable : out std_logic; + + +entity zpu_core is + Port ( clk : in std_logic; + areset : in std_logic; + enable : in std_logic; + in_mem_busy : in std_logic; + mem_read : in std_logic_vector(wordSize-1 downto 0); + mem_write : out std_logic_vector(wordSize-1 downto 0); + out_mem_addr : out std_logic_vector(maxAddrBitIncIO downto 0); + out_mem_writeEnable : out std_logic; + out_mem_readEnable : out std_logic; + mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); + interrupt : in std_logic; + break : out std_logic); +end zpu_core; + + +architecture behave of zpu_core is + +signal readIO : std_logic; + + + +signal memAWriteEnable : std_logic; +signal memAAddr : std_logic_vector(maxAddrBit downto minAddrBit); +signal memAWrite : std_logic_vector(wordSize-1 downto 0); +signal memARead : std_logic_vector(wordSize-1 downto 0); +signal memBWriteEnable : std_logic; +signal memBAddr : std_logic_vector(maxAddrBit downto minAddrBit); +signal memBWrite : std_logic_vector(wordSize-1 downto 0); +signal memBRead : std_logic_vector(wordSize-1 downto 0); + + + +signal pc : std_logic_vector(maxAddrBit downto 0); +signal sp : std_logic_vector(maxAddrBit downto minAddrBit); + +signal idim_flag : std_logic; + +--signal storeToStack : std_logic; +--signal fetchNextInstruction : std_logic; +--signal extraCycle : std_logic; +signal busy : std_logic; +--signal fetching : std_logic; + +signal begin_inst : std_logic; + + + +signal trace_opcode : std_logic_vector(7 downto 0); +signal trace_pc : std_logic_vector(maxAddrBitIncIO downto 0); +signal trace_sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal trace_topOfStack : std_logic_vector(wordSize-1 downto 0); +signal trace_topOfStackB : std_logic_vector(wordSize-1 downto 0); + +-- state machine. + +type State_Type is +( +State_ResyncDecode, +State_WriteIODone, +State_Execute, +State_StoreToStack, +State_Add, +State_Or, +State_And, +State_Store, +State_ReadIO, +State_WriteIO, +State_Load, +State_ResyncStack, +State_AddSP, +State_ReadIODone, +State_Decode, +State_LoadByte1, +State_LoadByte2, +State_StoreByte1, +State_StoreByte2, +State_Mult1, +State_Mult2, +State_Mult3 +); + +type DecodedOpcodeType is +( +Decoded_Nop, +Decoded_Im, +Decoded_ImShift, +Decoded_LoadSP, +Decoded_StoreSP, +Decoded_AddSP, +Decoded_Emulate, +Decoded_Break, +Decoded_PushPC, +Decoded_PushSP, +Decoded_PopPC, +Decoded_Add, +Decoded_Or, +Decoded_And, +Decoded_Load, +Decoded_Not, +Decoded_Flip, +Decoded_Store, +Decoded_PopSP, +Decoded_Ashiftleft, +Decoded_Ashiftright, +Decoded_Lshiftright, +Decoded_Eqbranch, +Decoded_Neqbranch, +Decoded_Eq, +Decoded_Neq, +Decoded_Loadb, +Decoded_Lessthan, +Decoded_Lessthanorequal, +Decoded_Ulessthan, +Decoded_Ulessthanorequal, +Decoded_Storeb, +Decoded_Lshift2, +Decoded_DoubleIm, +Decoded_AddIm, +Decoded_Mult16x16, +Decoded_Swap, +Decoded_Callpcrel, +Decoded_Pushspadd +); + + +signal mult1 : std_logic_vector(wordSize/2-1 downto 0); +signal mult2 : std_logic_vector(wordSize/2-1 downto 0); +signal multResult : std_logic_vector(wordSize-1 downto 0); + +signal storeByte : std_logic_vector(7 downto 0); +signal byteSelect : std_logic_vector(minAddrBit-1 downto 0); + +signal opcode : std_logic_vector(OpCode_Size-1 downto 0); +signal opcode2 : std_logic_vector(OpCode_Size-1 downto 0); + +signal decodedOpcode : DecodedOpcodeType; + +signal state : State_Type; + +begin + traceFileGenerate: + if Generate_Trace generate + trace_file: trace port map ( + clk => clk, + begin_inst => begin_inst, + pc => trace_pc, + opcode => trace_opcode, + sp => trace_sp, + memA => trace_topOfStack, + memB => trace_topOfStackB, + busy => busy, + intsp => (others => 'U') + ); + end generate; + + + memory: dualport_ram port map ( + clk => clk, + memAWriteEnable => memAWriteEnable, + memAAddr => memAAddr(maxAddrBitBRAM downto minAddrBit), + memAWrite => memAWrite, + memARead => memARead, + memBWriteEnable => memBWriteEnable, + memBAddr => memBAddr(maxAddrBitBRAM downto minAddrBit), + memBWrite => memBWrite, + memBRead => memBRead + ); + + + + process(clk, areset) + begin + if (clk'event and clk = '1') then + multResult <= mult1 * mult2; + end if; + end process; + + + + opcodeControl: + process(clk, areset) + variable tOpcode : std_logic_vector(OpCode_Size-1 downto 0); + variable tOpcode2 : std_logic_vector(OpCode_Size-1 downto 0); + variable spOffset : std_logic_vector(4 downto 0); + variable spOffset2 : std_logic_vector(4 downto 0); + variable nextPC : std_logic_vector(maxAddrBit downto 0); + variable pushspaddTemp : std_logic_vector(maxAddrBit downto minAddrBit); + variable tempVal : std_logic_vector(wordSize-1 downto 0); + variable compareA : signed(wordSize-1 downto 0); + variable compareB : signed(wordSize-1 downto 0); + begin + if areset = '1' then + mult1 <= (others => '0'); + mult2 <= (others => '0'); + state <= State_ResyncDecode; + break <= '0'; + sp <= spStart(maxAddrBit downto minAddrBit); + pc <= (others => '0'); + idim_flag <= '0'; + begin_inst <= '0'; + memAAddr <= (others => '0'); + memBAddr <= (others => '0'); + memAWriteEnable <= '0'; + memBWriteEnable <= '0'; + out_mem_writeEnable <= '0'; + out_mem_readEnable <= '0'; + decodedOpcode <= Decoded_Break; + memAWrite <= (others => '0'); + memBWrite <= (others => '0'); + opcode <= (others => '0'); + out_mem_addr <= (others => '0'); + mem_write <= (others => '0'); + elsif (clk'event and clk = '1') then + memAWriteEnable <= '0'; + memBWriteEnable <= '0'; + + out_mem_writeEnable <= '0'; + out_mem_readEnable <= '0'; + out_mem_addr <= memARead(maxAddrBitIncIO downto 0); + begin_inst <= '0'; + + case state is + when State_Decode => + nextPC:=pc+1; + case pc(1 downto 0) is + when "00" => tOpcode := memARead(31 downto 24); + when "01" => tOpcode := memARead(23 downto 16); + when "10" => tOpcode := memARead(15 downto 8); + when others => tOpcode := memARead(7 downto 0); + end case; + case nextPC(1 downto 0) is + when "00" => tOpcode2 := memBRead(31 downto 24); + when "01" => tOpcode2 := memBRead(23 downto 16); + when "10" => tOpcode2 := memBRead(15 downto 8); + when others => tOpcode2 := memBRead(7 downto 0); + end case; + idim_flag <= tOpcode(7); + opcode <= tOpcode; + opcode2 <= tOpcode2; + if (tOpcode(7 downto 7)=OpCode_Im and tOpcode2(7 downto 4)=0 and tOpcode2(3 downto 0)=Opcode_Add and idim_flag='0') then + idim_flag <= '0'; + decodedOpcode <= Decoded_AddIm; + nextPC := pc + 2; + elsif (tOpcode(7 downto 7)=OpCode_Im and tOpcode2(7 downto 7)=OpCode_Im and idim_flag='0') then + decodedOpcode <= Decoded_DoubleIm; + nextPC := pc + 2; + elsif (tOpcode(7 downto 4)=OpCode_AddSP and tOpcode(3 downto 0)=0 and + tOpcode2(7 downto 4)=OpCode_AddSP and tOpcode2(3 downto 0)=0) then + decodedOpcode <= Decoded_Lshift2; + nextPC := pc + 2; + elsif (tOpcode(7 downto 7)=OpCode_Im) then + if (idim_flag='1') then + decodedOpcode<=Decoded_ImShift; + else + decodedOpcode<=Decoded_Im; + end if; + elsif (tOpcode(7 downto 5)=OpCode_StoreSP) then + decodedOpcode<=Decoded_StoreSP; + elsif (tOpcode(7 downto 5)=OpCode_LoadSP) then + decodedOpcode<=Decoded_LoadSP; + elsif (tOpcode(7 downto 5)=OpCode_Emulate) then + if tOpcode(5 downto 0)=OpCode_Eqbranch then + decodedOpcode <= Decoded_Eqbranch; + elsif tOpcode(5 downto 0)=OpCode_Neqbranch then + decodedOpcode <= Decoded_Neqbranch; + elsif tOpcode(5 downto 0)=OpCode_Eq then + decodedOpcode <= Decoded_Eq; + elsif tOpcode(5 downto 0)=OpCode_Neq then + decodedOpcode <= Decoded_Neq; + elsif tOpcode(5 downto 0)=OpCode_Lessthan then + decodedOpcode <= Decoded_Lessthan; + elsif tOpcode(5 downto 0)=OpCode_Lessthanorequal then + decodedOpcode <= Decoded_Lessthanorequal; + elsif tOpcode(5 downto 0)=OpCode_Ulessthan then + decodedOpcode <= Decoded_Ulessthan; + elsif tOpcode(5 downto 0)=OpCode_Ulessthanorequal then + decodedOpcode <= Decoded_Ulessthanorequal; + elsif tOpcode(5 downto 0)=OpCode_Loadb then + decodedOpcode <= Decoded_Loadb; + elsif tOpcode(5 downto 0)=OpCode_Storeb then + decodedOpcode <= Decoded_Storeb; + elsif tOpcode(5 downto 0)=OpCode_Mult16x16 then + decodedOpcode <= Decoded_Mult16x16; + elsif tOpcode(5 downto 0)=OpCode_Swap then + decodedOpcode <= Decoded_Swap; + elsif tOpcode(5 downto 0)=OpCode_Callpcrel then + decodedOpcode <= Decoded_Callpcrel; + elsif tOpcode(5 downto 0)=OpCode_Pushspadd then + decodedOpcode <= Decoded_Pushspadd; +-- elsif tOpcode(5 downto 0)=OpCode_Lshiftright then +-- decodedOpcode <= Decoded_Lshiftright; +-- elsif tOpcode(5 downto 0)=OpCode_Ashiftleft then +-- decodedOpcode <= Decoded_Ashiftleft; +-- elsif tOpcode(5 downto 0)=OpCode_Ashiftright then +-- decodedOpcode <= Decoded_Ashiftright; + else + decodedOpcode<=Decoded_Emulate; + end if; + elsif (tOpcode(7 downto 4)=OpCode_AddSP) then + decodedOpcode<=Decoded_AddSP; + else + case tOpcode(3 downto 0) is + when OpCode_PushSP => + decodedOpcode<=Decoded_PushSP; + when OpCode_PopPC => + decodedOpcode<=Decoded_PopPC; + when OpCode_Add => + decodedOpcode<=Decoded_Add; + when OpCode_Or => + decodedOpcode<=Decoded_Or; + when OpCode_And => + decodedOpcode<=Decoded_And; + when OpCode_Load => + decodedOpcode<=Decoded_Load; + when OpCode_Not => + decodedOpcode<=Decoded_Not; + when OpCode_Flip => + decodedOpcode<=Decoded_Flip; + when OpCode_Store => + decodedOpcode<=Decoded_Store; + when OpCode_PopSP => + decodedOpcode<=Decoded_PopSP; + when OpCode_Break => + decodedOpcode<=Decoded_Break; + when others => + decodedOpcode<=Decoded_Nop; + end case; + end if; + -- Fetch the two next opcodes... :-) + memAAddr <= nextPC(maxAddrBit downto minAddrBit); + nextPC:=nextPC+1; + memBAddr <= nextPC(maxAddrBit downto minAddrBit); + state <= State_Execute; + when State_Execute => + state <= State_Decode; + -- at this point: + -- memBRead contains opcode word + -- memARead contains top of stack + pc <= pc + 1; + + -- trace + begin_inst <= '1'; + trace_pc <= (others => '0'); + trace_pc(maxAddrBit downto 0) <= pc; + trace_sp <= (others => '0'); + trace_sp(maxAddrBit downto minAddrBit) <= sp; + trace_opcode <= opcode; + trace_topOfStack <= memARead; + trace_topOfStackB <= memBRead; + + + -- during the next cycle we'll be reading the next opcode + spOffset(4):=not opcode(4); + spOffset(3 downto 0):=opcode(3 downto 0); + spOffset2(4):=not opcode2(4); + spOffset2(3 downto 0):=opcode2(3 downto 0); + + case decodedOpcode is + + when Decoded_DoubleIm => + memAWriteEnable <= '1'; + sp <= sp - 1; + memAAddr <= sp-1; + for i in wordSize-1 downto 14 loop + memAWrite(i) <= opcode(6); + end loop; + memAWrite(13 downto 7) <= opcode(6 downto 0); + memAWrite(6 downto 0) <= opcode2(6 downto 0); + memBAddr <= sp; + memBWrite <= memARead; + memBWriteEnable <= '1'; + pc <= pc + 2; + when Decoded_Im => + memAWriteEnable <= '1'; + sp <= sp - 1; + memAAddr <= sp-1; + for i in wordSize-1 downto 7 loop + memAWrite(i) <= opcode(6); + end loop; + memAWrite(6 downto 0) <= opcode(6 downto 0); + memBAddr <= sp; + memBWrite <= memARead; + memBWriteEnable <= '1'; + when Decoded_ImShift => + memAAddr <= sp; + memAWriteEnable <= '1'; + memAWrite(wordSize-1 downto 7) <= memARead(wordSize-8 downto 0); + memAWrite(6 downto 0) <= opcode(6 downto 0); + memBAddr <= sp + 1; + when Decoded_StoreSP => + memAWriteEnable <= '1'; + memAAddr <= sp+spOffset; + memAWrite <= memARead; + -- avoid address crashes. + memBAddr <= sp - 1; + sp <= sp + 1; + state <= State_ResyncDecode; + when Decoded_LoadSP => + sp <= sp - 1; + if (spOffset = 0) then + -- This is a duplicate instruction. + memAAddr <= sp-1; + memAWriteEnable <= '1'; + memAWrite <= memARead; + else + memAAddr <= sp+spOffset; + end if; + memBAddr <= sp; + memBWrite <= memARead; + memBWriteEnable <= '1'; + when Decoded_Callpcrel => + memAWriteEnable <= '1'; + memAAddr <= sp; + memAWrite <= (others => DontCareValue); + memAWrite(maxAddrBit downto 0) <= pc + 1; + memBAddr <= sp+1; + pc <= pc + memARead(maxAddrBit downto 0); + state <= State_ResyncDecode; + when Decoded_Emulate => + sp <= sp - 1; + memAWriteEnable <= '1'; + memAAddr <= sp - 1; + memAWrite <= (others => DontCareValue); + memAWrite(maxAddrBit downto 0) <= pc + 1; + memBAddr <= sp; + memBWrite <= memARead; + memBWriteEnable <= '1'; + -- The emulate address is: + -- 98 7654 3210 + -- 0000 00aa aaa0 0000 + pc <= (others => '0'); + pc(9 downto 5) <= opcode(4 downto 0); + state <= State_ResyncDecode; + when Decoded_AddSP => + if spOffset=0 then + -- avoid address line crashes... + -- FIX!!! is this an issue? + -- oh-well. While we are at it, we've got a faster + -- shift operation without updating the toolchain. + memAWriteEnable <= '1'; + memAAddr <= sp; + memAWrite <= memARead + memARead; + memBAddr <= sp+1; + else + memAWriteEnable <= '1'; + memAAddr <= sp; + memAWrite <= memARead; + memBAddr <= sp+spOffset; + state <= State_AddSP; + end if; + when Decoded_Break => + report "Break instruction encountered" severity failure; + break <= '1'; + when Decoded_PushSP => + memAWriteEnable <= '1'; + memAAddr <= sp - 1; + sp <= sp - 1; + memAWrite <= (others => DontCareValue); + memAWrite(maxAddrBit downto minAddrBit) <= sp; + memBAddr <= sp; + memBWrite <= memARead; + memBWriteEnable <= '1'; + when Decoded_Pushspadd => + memAWriteEnable <= '1'; + memAAddr <= sp; + memAWrite <= (others => DontCareValue); + pushspaddTemp := memARead(maxAddrBit-minAddrBit downto 0); + memAWrite(maxAddrBit downto minAddrBit) <= sp+pushspaddTemp; + memBAddr <= sp+1; + when Decoded_PopPC => + memAAddr <= sp; + pc <= memARead(maxAddrBit downto 0); + sp <= sp + 1; + state <= State_ResyncDecode; + when Decoded_AddIm => + memAWriteEnable <= '1'; + memAAddr <= sp; + tempVal(wordSize-1 downto 7) := (others => tOpcode(6)); + tempVal(6 downto 0) := tOpcode(6 downto 0); + memAWrite <= memARead + tempVal; + memBAddr <= sp + 1; + pc <= pc + 2; + when Decoded_Add => + memAWriteEnable <= '1'; + memAWrite <= memARead + memBRead; + memAAddr <= sp + 1; + memBAddr <= sp + 2; + sp <= sp + 1; + when Decoded_Or => + sp <= sp + 1; + memAWriteEnable <= '1'; + memAWrite <= memARead or memBRead; + memAWriteEnable <= '1'; + memAAddr <= sp + 1; + memBAddr <= sp + 2; + when Decoded_And => + sp <= sp + 1; + memAWriteEnable <= '1'; + memAWrite <= memARead and memBRead; + memAWriteEnable <= '1'; + memAAddr <= sp + 1; + memBAddr <= sp + 2; + when Decoded_Load => + if (memARead(ioBit)='1') then + out_mem_addr <= memARead(maxAddrBitIncIO downto 0); + out_mem_readEnable <= '1'; + state <= State_ReadIO; + else + memAAddr <= memARead(maxAddrBit downto minAddrBit); + memBAddr <= sp + 1; + end if; + when Decoded_Swap => + memAAddr <= sp; + memAWriteEnable <= '1'; + memAWrite(wordSize/2-1 downto 0) <= memARead(wordSize-1 downto wordSize/2); + memAWrite(wordSize-1 downto wordSize/2) <= memARead(wordSize/2-1 downto 0); + memBAddr <= sp + 1; + when Decoded_Not => + memAAddr <= sp; + memAWriteEnable <= '1'; + memAWrite <= not memARead; + memBAddr <= sp + 1; + when Decoded_Flip => + memAAddr <= sp; + memAWriteEnable <= '1'; + for i in 0 to wordSize-1 loop + memAWrite(i) <= memARead(wordSize-1-i); + end loop; + memBAddr <= sp + 1; + when Decoded_Lshift2 => + memAAddr <= sp; + memAWriteEnable <= '1'; + memAWrite(1 downto 0) <= (others => '0'); + memAWrite(wordSize-1 downto 2) <= memARead(wordSize-1-2 downto 0); + memBAddr <= sp + 1; + pc <= pc + 2; + when Decoded_Store => + sp <= sp + 2; + if (memARead(ioBit)='1') then + out_mem_writeEnable <= '1'; + out_mem_addr <= memARead(maxAddrBitIncIO downto 0); + mem_write <= memBRead; + state <= State_WriteIO; + else + memAWriteEnable <= '1'; + memAAddr <= memARead(maxAddrBit downto minAddrBit); + memAWrite <= memBRead; + state <= State_ResyncDecode; + end if; + when Decoded_PopSP => + sp <= memARead(maxAddrBit downto minAddrBit); + state <= State_ResyncDecode; + when Decoded_Ashiftleft => + memAWrite(wordSize-1 downto conv_integer(memARead(wordPower-1 downto 0))) <= + memBRead(wordSize-conv_integer(memARead(wordPower-1 downto 0))-1 downto 0); + if memARead(wordPower-1 downto 0)/=0 then + memAWrite(conv_integer(memARead(wordPower-1 downto 0))-1 downto 0) <= (others => '0'); + end if; + memAWriteEnable <= '1'; + memAAddr <= sp + 1; + memBAddr <= sp + 2; + sp <= sp + 1; + when Decoded_Ashiftright | Decoded_Lshiftright => + memAWrite(wordSize-1-conv_integer(memARead(wordPower-1 downto 0)) downto 0) <= + memBRead(wordSize-1 downto conv_integer(memARead(wordPower-1 downto 0))); + if memARead(wordPower-1 downto 0)/=0 then + if decodedOpcode=Decoded_Ashiftright and memBRead(wordSize-1)='1' then + memAWrite(wordSize-1 downto wordSize-conv_integer(memARead(wordPower-1 downto 0))-1) <= (others => '1'); + else + memAWrite(wordSize-1 downto wordSize-conv_integer(memARead(wordPower-1 downto 0))-1) <= (others => '0'); + end if; + end if; + memAWriteEnable <= '1'; + memAAddr <= sp + 1; + memBAddr <= sp + 2; + sp <= sp + 1; + when Decoded_Eqbranch => + sp <= sp + 2; + if (memBRead=0) then + pc <= memARead(maxAddrBit downto 0) + pc; + end if; + state <= State_ResyncDecode; + when Decoded_Neqbranch => + sp <= sp + 2; + if (memBRead/=0) then + pc <= memARead(maxAddrBit downto 0) + pc; + end if; + state <= State_ResyncDecode; + when Decoded_Eq => + sp <= sp + 1; + memAWrite <= (others => '0'); + if (memARead=memBRead) then + memAWrite(0) <= '1'; + end if; + memAAddr <= sp + 1; + memAWriteEnable <= '1'; + memBAddr <= sp + 2; + when Decoded_Neq => + sp <= sp + 1; + memAWrite <= (others => '0'); + if (memARead/=memBRead) then + memAWrite(0) <= '1'; + end if; + memAAddr <= sp + 1; + memAWriteEnable <= '1'; + memBAddr <= sp + 2; + when Decoded_Ulessthan => + sp <= sp + 1; + memAWrite <= (others => '0'); + if (memARead + sp <= sp + 1; + memAWrite <= (others => '0'); + if (memARead<=memBRead) then + memAWrite(0) <= '1'; + end if; + memAAddr <= sp + 1; + memAWriteEnable <= '1'; + memBAddr <= sp + 2; + when Decoded_Lessthan => + sp <= sp + 1; + memAWrite <= (others => '0'); + compareA := signed(memARead); + compareB := signed(memBRead); + if (compareA + sp <= sp + 1; + memAWrite <= (others => '0'); + compareA := signed(memARead); + compareB := signed(memBRead); + if (compareA<=compareB) then + memAWrite(0) <= '1'; + end if; + memAAddr <= sp + 1; + memAWriteEnable <= '1'; + memBAddr <= sp + 2; + when Decoded_Loadb => + byteSelect <= memARead(minAddrBit-1 downto 0); + memAAddr <= memARead(maxAddrBit downto minAddrBit); + state <= State_LoadByte1; + when Decoded_Storeb => + sp <= sp + 2; + byteSelect <= memARead(minAddrBit-1 downto 0); + storeByte <= memBRead(7 downto 0); + memAAddr <= memARead(maxAddrBit downto minAddrBit); + memBAddr <= sp; + state <= State_StoreByte1; + when Decoded_Mult16x16 => + mult1 <= memARead(wordSize/2-1 downto 0); + mult2 <= memBRead(wordSize/2-1 downto 0); + sp <= sp + 1; + state <= State_Mult1; + when others => + -- nop. Here we persist whatever was loaded into + -- memARead + memAAddr <= sp; + memAWriteEnable <= '1'; + memAWrite <= memARead; + memBAddr <= sp + 1; + + end case; + when State_ReadIO => + state <= State_ReadIODone; + when State_ReadIODone => + if (in_mem_busy = '0') then + state <= State_ResyncDecode; + memAWriteEnable <= '1'; + memAWrite <= (others => '0'); + memAWrite <= mem_read; + memAAddr <= sp; + end if; + when State_WriteIO => + state <= State_WriteIODone; + when State_WriteIODone => + if (in_mem_busy = '0') then + state <= State_ResyncDecode; + end if; + when State_ResyncDecode => + memAAddr <= pc(maxAddrBit downto minAddrBit); + nextPC:=pc+1; + memBAddr <= nextPC(maxAddrBit downto minAddrBit); + state <= State_ResyncStack; + when State_ResyncStack => + memAAddr <= sp; + memBAddr <= sp+1; + state <= State_Decode; + when State_AddSP => + memAAddr <= pc(maxAddrBit downto minAddrBit); + nextPC:=pc+1; + memBAddr <= nextPC(maxAddrBit downto minAddrBit); + state <= State_Add; + when State_Add => + memAWriteEnable <= '1'; + memAWrite <= memARead + memBRead; + memAAddr <= sp; + memBAddr <= sp + 1; + state <= State_Decode; + when State_LoadByte1 => + memAAddr <= pc(maxAddrBit downto minAddrBit); + nextPC:=pc+1; + memBAddr <= nextPC(maxAddrBit downto minAddrBit); + state <= State_LoadByte2; + when State_LoadByte2 => + memAWriteEnable <= '1'; + memAAddr <= sp; + memAWrite <= (others => '0'); + case byteSelect is + when "00" => memAWrite(7 downto 0) <= memARead(31 downto 24); + when "01" => memAWrite(7 downto 0) <= memARead(23 downto 16); + when "10" => memAWrite(7 downto 0) <= memARead(15 downto 8); + when others => memAWrite(7 downto 0) <= memARead(7 downto 0); + end case; + memBAddr <= sp + 1; + state <= State_Decode; + when State_StoreByte1 => + state <= State_StoreByte2; + when State_StoreByte2 => + memAWriteEnable <= '1'; + memAAddr <= memBRead(maxAddrBit downto minAddrBit); + memAWrite <= memARead; + case byteSelect is + when "00" => memAWrite(31 downto 24) <= storeByte; + when "01" => memAWrite(23 downto 16) <= storeByte; + when "10" => memAWrite(15 downto 8) <= storeByte; + when others => memAWrite(7 downto 0) <= storeByte; + end case; + state <= State_ResyncDecode; + when State_Mult1 => + memAAddr <= pc(maxAddrBit downto minAddrBit); + nextPC:=pc+1; + memBAddr <= nextPC(maxAddrBit downto minAddrBit); + state <= State_Mult2; + when State_Mult2 => + memAWriteEnable <= '1'; + memAWrite <= multResult; + memAAddr <= sp; + memBAddr <= sp + 1; + state <= State_Decode; + + when others => + null; + end case; + end if; + end process; + + + +end behave; diff --git a/zpu/hdl/zpu4/src/zpu_core_small.vhd b/zpu/hdl/zpu4/src/zpu_core_small.vhd index 8ebd40d..4d73f88 100644 --- a/zpu/hdl/zpu4/src/zpu_core_small.vhd +++ b/zpu/hdl/zpu4/src/zpu_core_small.vhd @@ -27,19 +27,6 @@ end zpu_core; architecture behave of zpu_core is -component dualport_ram is -port (clk : in std_logic; - memAWriteEnable : in std_logic; - memAAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit); - memAWrite : in std_logic_vector(wordSize-1 downto 0); - memARead : out std_logic_vector(wordSize-1 downto 0); - memBWriteEnable : in std_logic; - memBAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit); - memBWrite : in std_logic_vector(wordSize-1 downto 0); - memBRead : out std_logic_vector(wordSize-1 downto 0)); -end component; - - signal readIO : std_logic; diff --git a/zpu/hdl/zpu4/src/zpupkg.vhd b/zpu/hdl/zpu4/src/zpupkg.vhd index fd00b9e..32e162b 100644 --- a/zpu/hdl/zpu4/src/zpupkg.vhd +++ b/zpu/hdl/zpu4/src/zpupkg.vhd @@ -24,6 +24,19 @@ package zpupkg is constant stack_size : integer := 2**stack_bits; + component dualport_ram is + port (clk : in std_logic; + memAWriteEnable : in std_logic; + memAAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit); + memAWrite : in std_logic_vector(wordSize-1 downto 0); + memARead : out std_logic_vector(wordSize-1 downto 0); + memBWriteEnable : in std_logic; + memBAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit); + memBWrite : in std_logic_vector(wordSize-1 downto 0); + memBRead : out std_logic_vector(wordSize-1 downto 0)); + end component; + + component dram is port (clk : in std_logic; areset : in std_logic; -- cgit v1.1 From 4f29574821f2931771b30ee8e2be33030e7695a8 Mon Sep 17 00:00:00 2001 From: oharboe Date: Tue, 15 Apr 2008 05:58:32 +0000 Subject: * zpu/simzpu_bram.do - retired. * zpu/zpu_core_bram.vhd - retired * zpu/hdl/zpu3 - retired --- zpu/hdl/zpu4/src/simzpu_bram.do | 28 -- zpu/hdl/zpu4/src/zpu_core_bram.vhd | 780 ------------------------------------- 2 files changed, 808 deletions(-) delete mode 100644 zpu/hdl/zpu4/src/simzpu_bram.do delete mode 100644 zpu/hdl/zpu4/src/zpu_core_bram.vhd (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/simzpu_bram.do b/zpu/hdl/zpu4/src/simzpu_bram.do deleted file mode 100644 index 1c8673d..0000000 --- a/zpu/hdl/zpu4/src/simzpu_bram.do +++ /dev/null @@ -1,28 +0,0 @@ -# Xilinx WebPack modelsim script -# -# cd C:/workspace/zpu/zpu/hdl/zpu4/src -# do simzpu_bram.do - -set BreakOnAssertion 1 -vlib work - -vcom -93 -explicit zpu_config_trace.vhd -vcom -93 -explicit zpupkg.vhd -vcom -93 -explicit txt_util.vhd -vcom -93 -explicit sim_fpga_top.vhd -vcom -93 -explicit zpu_core_bram.vhd -vcom -93 -explicit bram_dmips.vhd -vcom -93 -explicit timer.vhd -vcom -93 -explicit io.vhd -vcom -93 -explicit trace.vhd - -# run ZPU -vsim fpga_top -view wave -add wave -recursive fpga_top/zpu/* -#add wave -recursive fpga_top/* -view structure -#view signals - -# Enough to run tiny programs -run 1us diff --git a/zpu/hdl/zpu4/src/zpu_core_bram.vhd b/zpu/hdl/zpu4/src/zpu_core_bram.vhd deleted file mode 100644 index 0bedba3..0000000 --- a/zpu/hdl/zpu4/src/zpu_core_bram.vhd +++ /dev/null @@ -1,780 +0,0 @@ --- Company: ZPU3 --- Engineer: Øyvind Harboe - -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.STD_LOGIC_UNSIGNED.ALL; -use IEEE.STD_LOGIC_arith.ALL; - -library work; -use work.zpu_config.all; -use work.zpupkg.all; - - --- io_busy : in std_logic; --- io_read : in std_logic_vector(7 downto 0); --- io_write : out std_logic_vector(7 downto 0); --- io_addr : out std_logic_vector(maxAddrBit downto minAddrBit); --- io_writeEnable : out std_logic; --- io_readEnable : out std_logic; - - -entity zpu_core is - Port ( clk : in std_logic; - areset : in std_logic; - enable : in std_logic; - in_mem_busy : in std_logic; - mem_read : in std_logic_vector(wordSize-1 downto 0); - mem_write : out std_logic_vector(wordSize-1 downto 0); - out_mem_addr : out std_logic_vector(maxAddrBitIncIO downto 0); - out_mem_writeEnable : out std_logic; - out_mem_readEnable : out std_logic; - mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); - interrupt : in std_logic; - break : out std_logic); -end zpu_core; - - -architecture behave of zpu_core is - -signal readIO : std_logic; - - - -signal memAWriteEnable : std_logic; -signal memAAddr : std_logic_vector(maxAddrBit downto minAddrBit); -signal memAWrite : std_logic_vector(wordSize-1 downto 0); -signal memARead : std_logic_vector(wordSize-1 downto 0); -signal memBWriteEnable : std_logic; -signal memBAddr : std_logic_vector(maxAddrBit downto minAddrBit); -signal memBWrite : std_logic_vector(wordSize-1 downto 0); -signal memBRead : std_logic_vector(wordSize-1 downto 0); - - - -signal pc : std_logic_vector(maxAddrBit downto 0); -signal sp : std_logic_vector(maxAddrBit downto minAddrBit); - -signal idim_flag : std_logic; - ---signal storeToStack : std_logic; ---signal fetchNextInstruction : std_logic; ---signal extraCycle : std_logic; -signal busy : std_logic; ---signal fetching : std_logic; - -signal begin_inst : std_logic; - - - -signal trace_opcode : std_logic_vector(7 downto 0); -signal trace_pc : std_logic_vector(maxAddrBitIncIO downto 0); -signal trace_sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal trace_topOfStack : std_logic_vector(wordSize-1 downto 0); -signal trace_topOfStackB : std_logic_vector(wordSize-1 downto 0); - --- state machine. - -type State_Type is -( -State_ResyncDecode, -State_WriteIODone, -State_Execute, -State_StoreToStack, -State_Add, -State_Or, -State_And, -State_Store, -State_ReadIO, -State_WriteIO, -State_Load, -State_ResyncStack, -State_AddSP, -State_ReadIODone, -State_Decode, -State_LoadByte1, -State_LoadByte2, -State_StoreByte1, -State_StoreByte2, -State_Mult1, -State_Mult2, -State_Mult3 -); - -type DecodedOpcodeType is -( -Decoded_Nop, -Decoded_Im, -Decoded_ImShift, -Decoded_LoadSP, -Decoded_StoreSP, -Decoded_AddSP, -Decoded_Emulate, -Decoded_Break, -Decoded_PushPC, -Decoded_PushSP, -Decoded_PopPC, -Decoded_Add, -Decoded_Or, -Decoded_And, -Decoded_Load, -Decoded_Not, -Decoded_Flip, -Decoded_Store, -Decoded_PopSP, -Decoded_Ashiftleft, -Decoded_Ashiftright, -Decoded_Lshiftright, -Decoded_Eqbranch, -Decoded_Neqbranch, -Decoded_Eq, -Decoded_Neq, -Decoded_Loadb, -Decoded_Lessthan, -Decoded_Lessthanorequal, -Decoded_Ulessthan, -Decoded_Ulessthanorequal, -Decoded_Storeb, -Decoded_Lshift2, -Decoded_DoubleIm, -Decoded_AddIm, -Decoded_Mult16x16, -Decoded_Swap, -Decoded_Callpcrel, -Decoded_Pushspadd -); - - -signal mult1 : std_logic_vector(wordSize/2-1 downto 0); -signal mult2 : std_logic_vector(wordSize/2-1 downto 0); -signal multResult : std_logic_vector(wordSize-1 downto 0); - -signal storeByte : std_logic_vector(7 downto 0); -signal byteSelect : std_logic_vector(minAddrBit-1 downto 0); - -signal opcode : std_logic_vector(OpCode_Size-1 downto 0); -signal opcode2 : std_logic_vector(OpCode_Size-1 downto 0); - -signal decodedOpcode : DecodedOpcodeType; - -signal state : State_Type; - -begin - traceFileGenerate: - if Generate_Trace generate - trace_file: trace port map ( - clk => clk, - begin_inst => begin_inst, - pc => trace_pc, - opcode => trace_opcode, - sp => trace_sp, - memA => trace_topOfStack, - memB => trace_topOfStackB, - busy => busy, - intsp => (others => 'U') - ); - end generate; - - - memory: dualport_ram port map ( - clk => clk, - memAWriteEnable => memAWriteEnable, - memAAddr => memAAddr(maxAddrBitBRAM downto minAddrBit), - memAWrite => memAWrite, - memARead => memARead, - memBWriteEnable => memBWriteEnable, - memBAddr => memBAddr(maxAddrBitBRAM downto minAddrBit), - memBWrite => memBWrite, - memBRead => memBRead - ); - - - - process(clk, areset) - begin - if (clk'event and clk = '1') then - multResult <= mult1 * mult2; - end if; - end process; - - - - opcodeControl: - process(clk, areset) - variable tOpcode : std_logic_vector(OpCode_Size-1 downto 0); - variable tOpcode2 : std_logic_vector(OpCode_Size-1 downto 0); - variable spOffset : std_logic_vector(4 downto 0); - variable spOffset2 : std_logic_vector(4 downto 0); - variable nextPC : std_logic_vector(maxAddrBit downto 0); - variable pushspaddTemp : std_logic_vector(maxAddrBit downto minAddrBit); - variable tempVal : std_logic_vector(wordSize-1 downto 0); - variable compareA : signed(wordSize-1 downto 0); - variable compareB : signed(wordSize-1 downto 0); - begin - if areset = '1' then - mult1 <= (others => '0'); - mult2 <= (others => '0'); - state <= State_ResyncDecode; - break <= '0'; - sp <= spStart(maxAddrBit downto minAddrBit); - pc <= (others => '0'); - idim_flag <= '0'; - begin_inst <= '0'; - memAAddr <= (others => '0'); - memBAddr <= (others => '0'); - memAWriteEnable <= '0'; - memBWriteEnable <= '0'; - out_mem_writeEnable <= '0'; - out_mem_readEnable <= '0'; - decodedOpcode <= Decoded_Break; - memAWrite <= (others => '0'); - memBWrite <= (others => '0'); - opcode <= (others => '0'); - out_mem_addr <= (others => '0'); - mem_write <= (others => '0'); - elsif (clk'event and clk = '1') then - memAWriteEnable <= '0'; - memBWriteEnable <= '0'; - - out_mem_writeEnable <= '0'; - out_mem_readEnable <= '0'; - out_mem_addr <= memARead(maxAddrBitIncIO downto 0); - begin_inst <= '0'; - - case state is - when State_Decode => - nextPC:=pc+1; - case pc(1 downto 0) is - when "00" => tOpcode := memARead(31 downto 24); - when "01" => tOpcode := memARead(23 downto 16); - when "10" => tOpcode := memARead(15 downto 8); - when others => tOpcode := memARead(7 downto 0); - end case; - case nextPC(1 downto 0) is - when "00" => tOpcode2 := memBRead(31 downto 24); - when "01" => tOpcode2 := memBRead(23 downto 16); - when "10" => tOpcode2 := memBRead(15 downto 8); - when others => tOpcode2 := memBRead(7 downto 0); - end case; - idim_flag <= tOpcode(7); - opcode <= tOpcode; - opcode2 <= tOpcode2; - if (tOpcode(7 downto 7)=OpCode_Im and tOpcode2(7 downto 4)=0 and tOpcode2(3 downto 0)=Opcode_Add and idim_flag='0') then - idim_flag <= '0'; - decodedOpcode <= Decoded_AddIm; - nextPC := pc + 2; - elsif (tOpcode(7 downto 7)=OpCode_Im and tOpcode2(7 downto 7)=OpCode_Im and idim_flag='0') then - decodedOpcode <= Decoded_DoubleIm; - nextPC := pc + 2; - elsif (tOpcode(7 downto 4)=OpCode_AddSP and tOpcode(3 downto 0)=0 and - tOpcode2(7 downto 4)=OpCode_AddSP and tOpcode2(3 downto 0)=0) then - decodedOpcode <= Decoded_Lshift2; - nextPC := pc + 2; - elsif (tOpcode(7 downto 7)=OpCode_Im) then - if (idim_flag='1') then - decodedOpcode<=Decoded_ImShift; - else - decodedOpcode<=Decoded_Im; - end if; - elsif (tOpcode(7 downto 5)=OpCode_StoreSP) then - decodedOpcode<=Decoded_StoreSP; - elsif (tOpcode(7 downto 5)=OpCode_LoadSP) then - decodedOpcode<=Decoded_LoadSP; - elsif (tOpcode(7 downto 5)=OpCode_Emulate) then - if tOpcode(5 downto 0)=OpCode_Eqbranch then - decodedOpcode <= Decoded_Eqbranch; - elsif tOpcode(5 downto 0)=OpCode_Neqbranch then - decodedOpcode <= Decoded_Neqbranch; - elsif tOpcode(5 downto 0)=OpCode_Eq then - decodedOpcode <= Decoded_Eq; - elsif tOpcode(5 downto 0)=OpCode_Neq then - decodedOpcode <= Decoded_Neq; - elsif tOpcode(5 downto 0)=OpCode_Lessthan then - decodedOpcode <= Decoded_Lessthan; - elsif tOpcode(5 downto 0)=OpCode_Lessthanorequal then - decodedOpcode <= Decoded_Lessthanorequal; - elsif tOpcode(5 downto 0)=OpCode_Ulessthan then - decodedOpcode <= Decoded_Ulessthan; - elsif tOpcode(5 downto 0)=OpCode_Ulessthanorequal then - decodedOpcode <= Decoded_Ulessthanorequal; - elsif tOpcode(5 downto 0)=OpCode_Loadb then - decodedOpcode <= Decoded_Loadb; - elsif tOpcode(5 downto 0)=OpCode_Storeb then - decodedOpcode <= Decoded_Storeb; - elsif tOpcode(5 downto 0)=OpCode_Mult16x16 then - decodedOpcode <= Decoded_Mult16x16; - elsif tOpcode(5 downto 0)=OpCode_Swap then - decodedOpcode <= Decoded_Swap; - elsif tOpcode(5 downto 0)=OpCode_Callpcrel then - decodedOpcode <= Decoded_Callpcrel; - elsif tOpcode(5 downto 0)=OpCode_Pushspadd then - decodedOpcode <= Decoded_Pushspadd; --- elsif tOpcode(5 downto 0)=OpCode_Lshiftright then --- decodedOpcode <= Decoded_Lshiftright; --- elsif tOpcode(5 downto 0)=OpCode_Ashiftleft then --- decodedOpcode <= Decoded_Ashiftleft; --- elsif tOpcode(5 downto 0)=OpCode_Ashiftright then --- decodedOpcode <= Decoded_Ashiftright; - else - decodedOpcode<=Decoded_Emulate; - end if; - elsif (tOpcode(7 downto 4)=OpCode_AddSP) then - decodedOpcode<=Decoded_AddSP; - else - case tOpcode(3 downto 0) is - when OpCode_PushSP => - decodedOpcode<=Decoded_PushSP; - when OpCode_PopPC => - decodedOpcode<=Decoded_PopPC; - when OpCode_Add => - decodedOpcode<=Decoded_Add; - when OpCode_Or => - decodedOpcode<=Decoded_Or; - when OpCode_And => - decodedOpcode<=Decoded_And; - when OpCode_Load => - decodedOpcode<=Decoded_Load; - when OpCode_Not => - decodedOpcode<=Decoded_Not; - when OpCode_Flip => - decodedOpcode<=Decoded_Flip; - when OpCode_Store => - decodedOpcode<=Decoded_Store; - when OpCode_PopSP => - decodedOpcode<=Decoded_PopSP; - when OpCode_Break => - decodedOpcode<=Decoded_Break; - when others => - decodedOpcode<=Decoded_Nop; - end case; - end if; - -- Fetch the two next opcodes... :-) - memAAddr <= nextPC(maxAddrBit downto minAddrBit); - nextPC:=nextPC+1; - memBAddr <= nextPC(maxAddrBit downto minAddrBit); - state <= State_Execute; - when State_Execute => - state <= State_Decode; - -- at this point: - -- memBRead contains opcode word - -- memARead contains top of stack - pc <= pc + 1; - - -- trace - begin_inst <= '1'; - trace_pc <= (others => '0'); - trace_pc(maxAddrBit downto 0) <= pc; - trace_sp <= (others => '0'); - trace_sp(maxAddrBit downto minAddrBit) <= sp; - trace_opcode <= opcode; - trace_topOfStack <= memARead; - trace_topOfStackB <= memBRead; - - - -- during the next cycle we'll be reading the next opcode - spOffset(4):=not opcode(4); - spOffset(3 downto 0):=opcode(3 downto 0); - spOffset2(4):=not opcode2(4); - spOffset2(3 downto 0):=opcode2(3 downto 0); - - case decodedOpcode is - - when Decoded_DoubleIm => - memAWriteEnable <= '1'; - sp <= sp - 1; - memAAddr <= sp-1; - for i in wordSize-1 downto 14 loop - memAWrite(i) <= opcode(6); - end loop; - memAWrite(13 downto 7) <= opcode(6 downto 0); - memAWrite(6 downto 0) <= opcode2(6 downto 0); - memBAddr <= sp; - memBWrite <= memARead; - memBWriteEnable <= '1'; - pc <= pc + 2; - when Decoded_Im => - memAWriteEnable <= '1'; - sp <= sp - 1; - memAAddr <= sp-1; - for i in wordSize-1 downto 7 loop - memAWrite(i) <= opcode(6); - end loop; - memAWrite(6 downto 0) <= opcode(6 downto 0); - memBAddr <= sp; - memBWrite <= memARead; - memBWriteEnable <= '1'; - when Decoded_ImShift => - memAAddr <= sp; - memAWriteEnable <= '1'; - memAWrite(wordSize-1 downto 7) <= memARead(wordSize-8 downto 0); - memAWrite(6 downto 0) <= opcode(6 downto 0); - memBAddr <= sp + 1; - when Decoded_StoreSP => - memAWriteEnable <= '1'; - memAAddr <= sp+spOffset; - memAWrite <= memARead; - -- avoid address crashes. - memBAddr <= sp - 1; - sp <= sp + 1; - state <= State_ResyncDecode; - when Decoded_LoadSP => - sp <= sp - 1; - if (spOffset = 0) then - -- This is a duplicate instruction. - memAAddr <= sp-1; - memAWriteEnable <= '1'; - memAWrite <= memARead; - else - memAAddr <= sp+spOffset; - end if; - memBAddr <= sp; - memBWrite <= memARead; - memBWriteEnable <= '1'; - when Decoded_Callpcrel => - memAWriteEnable <= '1'; - memAAddr <= sp; - memAWrite <= (others => DontCareValue); - memAWrite(maxAddrBit downto 0) <= pc + 1; - memBAddr <= sp+1; - pc <= pc + memARead(maxAddrBit downto 0); - state <= State_ResyncDecode; - when Decoded_Emulate => - sp <= sp - 1; - memAWriteEnable <= '1'; - memAAddr <= sp - 1; - memAWrite <= (others => DontCareValue); - memAWrite(maxAddrBit downto 0) <= pc + 1; - memBAddr <= sp; - memBWrite <= memARead; - memBWriteEnable <= '1'; - -- The emulate address is: - -- 98 7654 3210 - -- 0000 00aa aaa0 0000 - pc <= (others => '0'); - pc(9 downto 5) <= opcode(4 downto 0); - state <= State_ResyncDecode; - when Decoded_AddSP => - if spOffset=0 then - -- avoid address line crashes... - -- FIX!!! is this an issue? - -- oh-well. While we are at it, we've got a faster - -- shift operation without updating the toolchain. - memAWriteEnable <= '1'; - memAAddr <= sp; - memAWrite <= memARead + memARead; - memBAddr <= sp+1; - else - memAWriteEnable <= '1'; - memAAddr <= sp; - memAWrite <= memARead; - memBAddr <= sp+spOffset; - state <= State_AddSP; - end if; - when Decoded_Break => - report "Break instruction encountered" severity failure; - break <= '1'; - when Decoded_PushSP => - memAWriteEnable <= '1'; - memAAddr <= sp - 1; - sp <= sp - 1; - memAWrite <= (others => DontCareValue); - memAWrite(maxAddrBit downto minAddrBit) <= sp; - memBAddr <= sp; - memBWrite <= memARead; - memBWriteEnable <= '1'; - when Decoded_Pushspadd => - memAWriteEnable <= '1'; - memAAddr <= sp; - memAWrite <= (others => DontCareValue); - pushspaddTemp := memARead(maxAddrBit-minAddrBit downto 0); - memAWrite(maxAddrBit downto minAddrBit) <= sp+pushspaddTemp; - memBAddr <= sp+1; - when Decoded_PopPC => - memAAddr <= sp; - pc <= memARead(maxAddrBit downto 0); - sp <= sp + 1; - state <= State_ResyncDecode; - when Decoded_AddIm => - memAWriteEnable <= '1'; - memAAddr <= sp; - tempVal(wordSize-1 downto 7) := (others => tOpcode(6)); - tempVal(6 downto 0) := tOpcode(6 downto 0); - memAWrite <= memARead + tempVal; - memBAddr <= sp + 1; - pc <= pc + 2; - when Decoded_Add => - memAWriteEnable <= '1'; - memAWrite <= memARead + memBRead; - memAAddr <= sp + 1; - memBAddr <= sp + 2; - sp <= sp + 1; - when Decoded_Or => - sp <= sp + 1; - memAWriteEnable <= '1'; - memAWrite <= memARead or memBRead; - memAWriteEnable <= '1'; - memAAddr <= sp + 1; - memBAddr <= sp + 2; - when Decoded_And => - sp <= sp + 1; - memAWriteEnable <= '1'; - memAWrite <= memARead and memBRead; - memAWriteEnable <= '1'; - memAAddr <= sp + 1; - memBAddr <= sp + 2; - when Decoded_Load => - if (memARead(ioBit)='1') then - out_mem_addr <= memARead(maxAddrBitIncIO downto 0); - out_mem_readEnable <= '1'; - state <= State_ReadIO; - else - memAAddr <= memARead(maxAddrBit downto minAddrBit); - memBAddr <= sp + 1; - end if; - when Decoded_Swap => - memAAddr <= sp; - memAWriteEnable <= '1'; - memAWrite(wordSize/2-1 downto 0) <= memARead(wordSize-1 downto wordSize/2); - memAWrite(wordSize-1 downto wordSize/2) <= memARead(wordSize/2-1 downto 0); - memBAddr <= sp + 1; - when Decoded_Not => - memAAddr <= sp; - memAWriteEnable <= '1'; - memAWrite <= not memARead; - memBAddr <= sp + 1; - when Decoded_Flip => - memAAddr <= sp; - memAWriteEnable <= '1'; - for i in 0 to wordSize-1 loop - memAWrite(i) <= memARead(wordSize-1-i); - end loop; - memBAddr <= sp + 1; - when Decoded_Lshift2 => - memAAddr <= sp; - memAWriteEnable <= '1'; - memAWrite(1 downto 0) <= (others => '0'); - memAWrite(wordSize-1 downto 2) <= memARead(wordSize-1-2 downto 0); - memBAddr <= sp + 1; - pc <= pc + 2; - when Decoded_Store => - sp <= sp + 2; - if (memARead(ioBit)='1') then - out_mem_writeEnable <= '1'; - out_mem_addr <= memARead(maxAddrBitIncIO downto 0); - mem_write <= memBRead; - state <= State_WriteIO; - else - memAWriteEnable <= '1'; - memAAddr <= memARead(maxAddrBit downto minAddrBit); - memAWrite <= memBRead; - state <= State_ResyncDecode; - end if; - when Decoded_PopSP => - sp <= memARead(maxAddrBit downto minAddrBit); - state <= State_ResyncDecode; - when Decoded_Ashiftleft => - memAWrite(wordSize-1 downto conv_integer(memARead(wordPower-1 downto 0))) <= - memBRead(wordSize-conv_integer(memARead(wordPower-1 downto 0))-1 downto 0); - if memARead(wordPower-1 downto 0)/=0 then - memAWrite(conv_integer(memARead(wordPower-1 downto 0))-1 downto 0) <= (others => '0'); - end if; - memAWriteEnable <= '1'; - memAAddr <= sp + 1; - memBAddr <= sp + 2; - sp <= sp + 1; - when Decoded_Ashiftright | Decoded_Lshiftright => - memAWrite(wordSize-1-conv_integer(memARead(wordPower-1 downto 0)) downto 0) <= - memBRead(wordSize-1 downto conv_integer(memARead(wordPower-1 downto 0))); - if memARead(wordPower-1 downto 0)/=0 then - if decodedOpcode=Decoded_Ashiftright and memBRead(wordSize-1)='1' then - memAWrite(wordSize-1 downto wordSize-conv_integer(memARead(wordPower-1 downto 0))-1) <= (others => '1'); - else - memAWrite(wordSize-1 downto wordSize-conv_integer(memARead(wordPower-1 downto 0))-1) <= (others => '0'); - end if; - end if; - memAWriteEnable <= '1'; - memAAddr <= sp + 1; - memBAddr <= sp + 2; - sp <= sp + 1; - when Decoded_Eqbranch => - sp <= sp + 2; - if (memBRead=0) then - pc <= memARead(maxAddrBit downto 0) + pc; - end if; - state <= State_ResyncDecode; - when Decoded_Neqbranch => - sp <= sp + 2; - if (memBRead/=0) then - pc <= memARead(maxAddrBit downto 0) + pc; - end if; - state <= State_ResyncDecode; - when Decoded_Eq => - sp <= sp + 1; - memAWrite <= (others => '0'); - if (memARead=memBRead) then - memAWrite(0) <= '1'; - end if; - memAAddr <= sp + 1; - memAWriteEnable <= '1'; - memBAddr <= sp + 2; - when Decoded_Neq => - sp <= sp + 1; - memAWrite <= (others => '0'); - if (memARead/=memBRead) then - memAWrite(0) <= '1'; - end if; - memAAddr <= sp + 1; - memAWriteEnable <= '1'; - memBAddr <= sp + 2; - when Decoded_Ulessthan => - sp <= sp + 1; - memAWrite <= (others => '0'); - if (memARead - sp <= sp + 1; - memAWrite <= (others => '0'); - if (memARead<=memBRead) then - memAWrite(0) <= '1'; - end if; - memAAddr <= sp + 1; - memAWriteEnable <= '1'; - memBAddr <= sp + 2; - when Decoded_Lessthan => - sp <= sp + 1; - memAWrite <= (others => '0'); - compareA := signed(memARead); - compareB := signed(memBRead); - if (compareA - sp <= sp + 1; - memAWrite <= (others => '0'); - compareA := signed(memARead); - compareB := signed(memBRead); - if (compareA<=compareB) then - memAWrite(0) <= '1'; - end if; - memAAddr <= sp + 1; - memAWriteEnable <= '1'; - memBAddr <= sp + 2; - when Decoded_Loadb => - byteSelect <= memARead(minAddrBit-1 downto 0); - memAAddr <= memARead(maxAddrBit downto minAddrBit); - state <= State_LoadByte1; - when Decoded_Storeb => - sp <= sp + 2; - byteSelect <= memARead(minAddrBit-1 downto 0); - storeByte <= memBRead(7 downto 0); - memAAddr <= memARead(maxAddrBit downto minAddrBit); - memBAddr <= sp; - state <= State_StoreByte1; - when Decoded_Mult16x16 => - mult1 <= memARead(wordSize/2-1 downto 0); - mult2 <= memBRead(wordSize/2-1 downto 0); - sp <= sp + 1; - state <= State_Mult1; - when others => - -- nop. Here we persist whatever was loaded into - -- memARead - memAAddr <= sp; - memAWriteEnable <= '1'; - memAWrite <= memARead; - memBAddr <= sp + 1; - - end case; - when State_ReadIO => - state <= State_ReadIODone; - when State_ReadIODone => - if (in_mem_busy = '0') then - state <= State_ResyncDecode; - memAWriteEnable <= '1'; - memAWrite <= (others => '0'); - memAWrite <= mem_read; - memAAddr <= sp; - end if; - when State_WriteIO => - state <= State_WriteIODone; - when State_WriteIODone => - if (in_mem_busy = '0') then - state <= State_ResyncDecode; - end if; - when State_ResyncDecode => - memAAddr <= pc(maxAddrBit downto minAddrBit); - nextPC:=pc+1; - memBAddr <= nextPC(maxAddrBit downto minAddrBit); - state <= State_ResyncStack; - when State_ResyncStack => - memAAddr <= sp; - memBAddr <= sp+1; - state <= State_Decode; - when State_AddSP => - memAAddr <= pc(maxAddrBit downto minAddrBit); - nextPC:=pc+1; - memBAddr <= nextPC(maxAddrBit downto minAddrBit); - state <= State_Add; - when State_Add => - memAWriteEnable <= '1'; - memAWrite <= memARead + memBRead; - memAAddr <= sp; - memBAddr <= sp + 1; - state <= State_Decode; - when State_LoadByte1 => - memAAddr <= pc(maxAddrBit downto minAddrBit); - nextPC:=pc+1; - memBAddr <= nextPC(maxAddrBit downto minAddrBit); - state <= State_LoadByte2; - when State_LoadByte2 => - memAWriteEnable <= '1'; - memAAddr <= sp; - memAWrite <= (others => '0'); - case byteSelect is - when "00" => memAWrite(7 downto 0) <= memARead(31 downto 24); - when "01" => memAWrite(7 downto 0) <= memARead(23 downto 16); - when "10" => memAWrite(7 downto 0) <= memARead(15 downto 8); - when others => memAWrite(7 downto 0) <= memARead(7 downto 0); - end case; - memBAddr <= sp + 1; - state <= State_Decode; - when State_StoreByte1 => - state <= State_StoreByte2; - when State_StoreByte2 => - memAWriteEnable <= '1'; - memAAddr <= memBRead(maxAddrBit downto minAddrBit); - memAWrite <= memARead; - case byteSelect is - when "00" => memAWrite(31 downto 24) <= storeByte; - when "01" => memAWrite(23 downto 16) <= storeByte; - when "10" => memAWrite(15 downto 8) <= storeByte; - when others => memAWrite(7 downto 0) <= storeByte; - end case; - state <= State_ResyncDecode; - when State_Mult1 => - memAAddr <= pc(maxAddrBit downto minAddrBit); - nextPC:=pc+1; - memBAddr <= nextPC(maxAddrBit downto minAddrBit); - state <= State_Mult2; - when State_Mult2 => - memAWriteEnable <= '1'; - memAWrite <= multResult; - memAAddr <= sp; - memBAddr <= sp + 1; - state <= State_Decode; - - when others => - null; - end case; - end if; - end process; - - - -end behave; -- cgit v1.1 From af198f5c76764dd55a5eed7a29ab24b032792e89 Mon Sep 17 00:00:00 2001 From: oharboe Date: Tue, 15 Apr 2008 06:00:18 +0000 Subject: retired --- zpu/hdl/zpu4/src/status.txt | 109 -------------------------------------------- 1 file changed, 109 deletions(-) delete mode 100644 zpu/hdl/zpu4/src/status.txt (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/status.txt b/zpu/hdl/zpu4/src/status.txt deleted file mode 100644 index df01caf..0000000 --- a/zpu/hdl/zpu4/src/status.txt +++ /dev/null @@ -1,109 +0,0 @@ -- Before NEQBRANCH opt 4.684 DMIPS 8.0 cycles average, after -- opcode pairs - -0x6060 0.1519223038446077 75961 9.048362120309708 LOADSP + LOADSP -0x4040 0.13967027934055867 69835 11.08668042546436 STORESP + STORESP -0x8038 0.10230620461240922 51153 10.251102204408818 IM + NEQBRANCH -0x4060 0.09856219712439425 49281 9.822802471596571 STORESP + LOADSP -0x6080 0.09734219468438937 48671 6.483415478886373 LOADSP + IM -0x3860 0.08642217284434568 43211 12.616350364963504 NEQBRANCH + LOADSP -0x8080 0.060966121932243864 30483 4.275915275634731 IM + IM -0x8005 0.05317010634021268 26585 6.572311495673671 IM + ADD -0x540 0.05215210430420861 26076 9.339541547277937 ADD + STORESP -0x3d0d 0.050808101616203236 25404 12.398243045387995 -0xd04 0.0466000932001864 23300 20.0 -0x6040 0.04389608779217558 21948 9.460344827586207 -0x4080 0.043648087296174594 21824 7.630769230769231 -0xc80 0.03966807933615867 19834 11.438292964244521 -0x8010 0.0391500783001566 19575 6.1248435544430535 -0x480 0.038798077596155195 19399 10.941342357586013 - - -- zpu_core.vhd: 1500 LUTs. Xilinx ISE reports 83MHz maximum frequency after P&R - which matches what I've found w/my ic300.vhd testbench - -- zpu_core_instack.vhd - - problems w/simulation trace since storeb/loadb will run into undefined memory - during emulation. Solution: implement loadb+storeb. - - simulation needs to read cycles from ModelSim trace so as to m ake readcycles - not cause false positives. This has other interesting potentials w.r.t. - knowing which instructions take the longest. - -- Ca. 1700 LUT inc. all instructions. Removing all higher level instructions - => 1300. - -- Review memory interface - - When is mem_busy high? Will it be high on the next cycle after - I've send mem_read/writeEnable? - - Should I hold off posting a read/write until mem_busy = '0'? - - Write posting could increase performance somewhat. Should there be - a seperate write busy signal? - - Synchronous reset? The ARM7 will have to copy the program to DRAM and - then start the ZPU. - -- Current instruction set has - - 31 DMIPS single cycle performance Simulator.java - - 8 DMIPS w/single cycle RAM access in ModelSim - -112 0.06100380865858346 67215918 -56 0.04139603650830458 45611457 -129 0.0375812381475752 41408192 -5 0.03703417264799563 40805418 -113 0.03540341331682748 39008596 -128 0.0343154384313754 37809831 -83 0.03322159422742951 36604599 -114 0.03213492807203279 35407276 -132 0.03158580962697109 34802240 -12 0.03049709687915076 33602662 -8 0.029409690138646426 32404523 -115 0.026690690908727877 29408644 -46 0.025054316381406774 27605635 -82 0.023965804208719754 26406278 -84 0.023961360698074072 26401382 -116 0.023417718589457643 25802380 -81 0.02179306727026773 24012288 -117 0.021783900714401432 24002188 -4 0.01797685126990833 19807461 -6 0.016340292503890113 18004249 -85 0.016339001017850734 18002826 -255 0.016338918428089957 18002735 -86 0.016337281154151066 18000931 -11 0.011984767180825744 13205194 -51 0.0114390303780569 12603884 -38 0.010892246228211845 12001420 -118 0.010347263624247446 11400941 -131 0.009257503529350904 10200209 -7 0.008713386756504965 9600684 -22 0.008712946580307425 9600199 - - -64 0.16176824859336478 178241352 -96 0.23147927881894828 255051161 -128 0.2646966482624612 291651105 - - -- Alternate memory interface to allow more caching in memory subsystem? - --- The memory interface allows a dual port memory to be used --- to increase performance. --- --- Also it is possible to implement a zero cycle register file instead --- of memory, though obviously that will cause problems w.r.t. max --- frequency for the ZPU. --- --- mem_writeEnable - set to '1' for a single cycle to send off a write request. --- mem_write is valid only while mem_writeEnable='1'. --- mem_readEnable - set to '1' for a single cycle to send off a read request. --- mem_read is a single cycle while mem_read_busy='0'. --- --- mem_read/write_busy - It is illegal to send off a read/write request when mem_read/write_busy='1'. --- Set to '0' when mem_read is valid after a read request. Note that --- the definition allows zero wait state ram. --- mem_read/write_addr - address for read/write request --- mem_read - read data. Valid only on the cycle after mem_busy='0' after --- mem_readEnable='1' for a single cycle. --- mem_write - data to write --- mem_writeMask - set to '1' for those bits that are to be written to memory upon --- write request --- break - set to '1' when CPU hits break instruction --- interrupt - set to '1' until interrupts are cleared by CPU. -- cgit v1.1 From 748de9774226a19c32ee1ed6a4e6474e9e0acb27 Mon Sep 17 00:00:00 2001 From: oharboe Date: Thu, 17 Apr 2008 06:42:27 +0000 Subject: * retired Xilinx synthesizing example. It messes up the zpu4 directory. --- zpu/hdl/zpu4/src/build.xml | 114 --------------- zpu/hdl/zpu4/src/ic300.bitgen | 27 ---- zpu/hdl/zpu4/src/ic300.lso | 1 - zpu/hdl/zpu4/src/ic300.ucf | 146 ------------------- zpu/hdl/zpu4/src/ic300.vhd | 144 ------------------- zpu/hdl/zpu4/src/ic300_config.vhd | 26 ---- zpu/hdl/zpu4/src/ic300pkg.vhd | 88 ------------ zpu/hdl/zpu4/src/xmake.filelist | 12 -- zpu/hdl/zpu4/src/xmake.filelist.bramsmall | 5 - zpu/hdl/zpu4/src/xmake.xst | 53 ------- zpu/hdl/zpu4/src/zpuio_bram.vhd | 229 ------------------------------ 11 files changed, 845 deletions(-) delete mode 100644 zpu/hdl/zpu4/src/build.xml delete mode 100644 zpu/hdl/zpu4/src/ic300.bitgen delete mode 100644 zpu/hdl/zpu4/src/ic300.lso delete mode 100644 zpu/hdl/zpu4/src/ic300.ucf delete mode 100644 zpu/hdl/zpu4/src/ic300.vhd delete mode 100644 zpu/hdl/zpu4/src/ic300_config.vhd delete mode 100644 zpu/hdl/zpu4/src/ic300pkg.vhd delete mode 100644 zpu/hdl/zpu4/src/xmake.filelist delete mode 100644 zpu/hdl/zpu4/src/xmake.filelist.bramsmall delete mode 100644 zpu/hdl/zpu4/src/xmake.xst delete mode 100644 zpu/hdl/zpu4/src/zpuio_bram.vhd (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/build.xml b/zpu/hdl/zpu4/src/build.xml deleted file mode 100644 index e1b268a..0000000 --- a/zpu/hdl/zpu4/src/build.xml +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - eCosBoard firmware build file - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/zpu/hdl/zpu4/src/ic300.bitgen b/zpu/hdl/zpu4/src/ic300.bitgen deleted file mode 100644 index 1095099..0000000 --- a/zpu/hdl/zpu4/src/ic300.bitgen +++ /dev/null @@ -1,27 +0,0 @@ --g DebugBitstream:No --g Binary:yes --g CRC:Enable --g ConfigRate:50 --g CclkPin:Pullnone --g M0Pin:Pullnone --g M1Pin:Pullnone --g M2Pin:Pullnone --g ProgPin:PullUp --g DonePin:Pullnone --g TckPin:Pullnone --g TdiPin:Pullnone --g TdoPin:Pullnone --g TmsPin:Pullnone --g UnusedPin:Pullnone --g UserID:0xFFFFFFFF --g DCMShutDown:Disable --g DCIUpdateMode:AsRequired --g StartUpClk:CClk --g DONE_cycle:4 --g GTS_cycle:5 --g GWE_cycle:6 --g LCK_cycle:NoWait --g Security:Level1 --g DonePipe:No --g DriveDone:Yes - diff --git a/zpu/hdl/zpu4/src/ic300.lso b/zpu/hdl/zpu4/src/ic300.lso deleted file mode 100644 index 22de730..0000000 --- a/zpu/hdl/zpu4/src/ic300.lso +++ /dev/null @@ -1 +0,0 @@ -work diff --git a/zpu/hdl/zpu4/src/ic300.ucf b/zpu/hdl/zpu4/src/ic300.ucf deleted file mode 100644 index 4a141b9..0000000 --- a/zpu/hdl/zpu4/src/ic300.ucf +++ /dev/null @@ -1,146 +0,0 @@ -# clock inputs -net "cpu_clk_p" loc = "R9" | iostandard=LVTTL; - -# input pins -net "cpu_a_p(0)" loc = "N15" | iostandard=LVTTL; -net "cpu_a_p(1)" loc = "P16" | iostandard=LVTTL; -net "cpu_a_p(2)" loc = "P13" | iostandard=LVTTL; -net "cpu_a_p(3)" loc = "N16" | iostandard=LVTTL; -net "cpu_a_p(4)" loc = "P15" | iostandard=LVTTL; -net "cpu_a_p(5)" loc = "R11" | iostandard=LVTTL; -net "cpu_a_p(6)" loc = "T14" | iostandard=LVTTL; -net "cpu_a_p(7)" loc = "R16" | iostandard=LVTTL; -net "cpu_a_p(8)" loc = "P14" | iostandard=LVTTL; -net "cpu_a_p(9)" loc = "T13" | iostandard=LVTTL; -net "cpu_a_p(10)" loc = "R13" | iostandard=LVTTL; -net "cpu_a_p(11)" loc = "P7" | iostandard=LVTTL; -net "cpu_a_p(12)" loc = "N12" | iostandard=LVTTL; -net "cpu_a_p(13)" loc = "R12" | iostandard=LVTTL; -net "cpu_a_p(14)" loc = "L13" | iostandard=LVTTL; -net "cpu_a_p(15)" loc = "K12" | iostandard=LVTTL; -net "cpu_a_p(16)" loc = "K15" | iostandard=LVTTL; -net "cpu_a_p(17)" loc = "T10" | iostandard=LVTTL; -net "cpu_a_p(18)" loc = "T9" | iostandard=LVTTL; -net "cpu_a_p(19)" loc = "N10" | iostandard=LVTTL; -net "cpu_a_p(20)" loc = "T8" | iostandard=LVTTL; -net "cpu_wr_n_p(0)" loc = "L15" | iostandard=LVTTL; -net "cpu_wr_n_p(1)" loc = "N14" | iostandard=LVTTL; -net "cpu_oe_n_p" loc = "T12" | iostandard=LVTTL; -net "cpu_cs_n_p(1)" loc = "R3" | iostandard=LVTTL; -net "cpu_cs_n_p(2)" loc = "M16" | iostandard=LVTTL; -net "cpu_cs_n_p(3)" loc = "P11" | iostandard=LVTTL; - -#net "sdr_clk_fb_p" loc = "B8" | iostandard=SSTL2_I; - -# output pins -net "cpu_fiq_p" loc = "K16" | iostandard=LVTTL; -net "cpu_irq_p(0)" loc = "M14" | iostandard=LVTTL; -net "cpu_irq_p(1)" loc = "J16" | iostandard=LVTTL; -net "cpu_wait_n_p" loc = "M15" | iostandard=LVTTL; - -#net "sdr_clk_p" loc = "D8" | iostandard=SSTL2_I | FAST; -#net "sdr_clk_n_p" loc = "F5" | iostandard=SSTL2_I | FAST; -#net "cke_q_p" loc = "F4" | iostandard=SSTL2_I | FAST; -#net "cs_qn_p" loc = "M2" | iostandard=SSTL2_I | FAST | PULLUP; -#net "ras_qn_p" loc = "J2" | iostandard=SSTL2_I | FAST | PULLUP | NODELAY; -#net "cas_qn_p" loc = "M3" | iostandard=SSTL2_I | FAST | PULLUP | NODELAY; -#net "we_qn_p" loc = "K4" | iostandard=SSTL2_I | FAST | PULLUP | NODELAY; -#net "dm_q_p(0)" loc = "L4" | iostandard=SSTL2_I | FAST; -#net "dm_q_p(1)" loc = "E4" | iostandard=SSTL2_I | FAST; -#net "dqs_q_p(0)" loc = "L3" | iostandard=SSTL2_I | FAST; -#net "dqs_q_p(1)" loc = "D3" | iostandard=SSTL2_I | FAST; -#net "ba_q_p(0)" loc = "M1" | iostandard=SSTL2_I | FAST; -#net "ba_q_p(1)" loc = "J3" | iostandard=SSTL2_I | FAST; -#net "sdr_a_p(0)" loc = "J4" | iostandard=SSTL2_I | FAST; -#net "sdr_a_p(1)" loc = "N2" | iostandard=SSTL2_I | FAST; -#net "sdr_a_p(2)" loc = "H4" | iostandard=SSTL2_I | FAST; -#net "sdr_a_p(3)" loc = "P2" | iostandard=SSTL2_I | FAST; -#net "sdr_a_p(4)" loc = "E7" | iostandard=SSTL2_I | FAST; -#net "sdr_a_p(5)" loc = "G4" | iostandard=SSTL2_I | FAST; -#net "sdr_a_p(6)" loc = "D7" | iostandard=SSTL2_I | FAST; -#net "sdr_a_p(7)" loc = "G5" | iostandard=SSTL2_I | FAST; -#net "sdr_a_p(8)" loc = "C7" | iostandard=SSTL2_I | FAST; -#net "sdr_a_p(9)" loc = "F3" | iostandard=SSTL2_I | FAST; -#net "sdr_a_p(10)" loc = "N3" | iostandard=SSTL2_I | FAST; -#net "sdr_a_p(11)" loc = "E6" | iostandard=SSTL2_I | FAST; -#net "sdr_a_p(12)" loc = "D6" | iostandard=SSTL2_I | FAST; - -# bidirectional pins -net "cpu_d_p(0)" loc = "M11" | iostandard=LVTTL; -net "cpu_d_p(1)" loc = "N11" | iostandard=LVTTL; -net "cpu_d_p(2)" loc = "P10" | iostandard=LVTTL; -net "cpu_d_p(3)" loc = "R10" | iostandard=LVTTL; -net "cpu_d_p(4)" loc = "T7" | iostandard=LVTTL; -net "cpu_d_p(5)" loc = "R7" | iostandard=LVTTL; -net "cpu_d_p(6)" loc = "N6" | iostandard=LVTTL; -net "cpu_d_p(7)" loc = "M6" | iostandard=LVTTL; -net "cpu_d_p(8)" loc = "K13" | iostandard=LVTTL; -net "cpu_d_p(9)" loc = "M10" | iostandard=LVTTL; -net "cpu_d_p(10)" loc = "L12" | iostandard=LVTTL; -net "cpu_d_p(11)" loc = "M13" | iostandard=LVTTL; -net "cpu_d_p(12)" loc = "K14" | iostandard=LVTTL; -net "cpu_d_p(13)" loc = "L14" | iostandard=LVTTL; -net "cpu_d_p(14)" loc = "J13" | iostandard=LVTTL; -net "cpu_d_p(15)" loc = "J14" | iostandard=LVTTL; - -#net "sdr_d_p(0)" loc = "G1" | iostandard=SSTL2_I | NODELAY | FAST; -#net "sdr_d_p(1)" loc = "H3" | iostandard=SSTL2_I | NODELAY | FAST; -#net "sdr_d_p(2)" loc = "G3" | iostandard=SSTL2_I | NODELAY | FAST; -#net "sdr_d_p(3)" loc = "K2" | iostandard=SSTL2_I | NODELAY | FAST; -#net "sdr_d_p(4)" loc = "F2" | iostandard=SSTL2_I | NODELAY | FAST; -#net "sdr_d_p(5)" loc = "L2" | iostandard=SSTL2_I | NODELAY | FAST; -#net "sdr_d_p(6)" loc = "E1" | iostandard=SSTL2_I | NODELAY | FAST; -#net "sdr_d_p(7)" loc = "M4" | iostandard=SSTL2_I | NODELAY | FAST; -#net "sdr_d_p(8)" loc = "C6" | iostandard=SSTL2_I | NODELAY | FAST; -#net "sdr_d_p(9)" loc = "E2" | iostandard=SSTL2_I | NODELAY | FAST; -#net "sdr_d_p(10)" loc = "C2" | iostandard=SSTL2_I | NODELAY | FAST; -#net "sdr_d_p(11)" loc = "D1" | iostandard=SSTL2_I | NODELAY | FAST; -#net "sdr_d_p(12)" loc = "B7" | iostandard=SSTL2_I | NODELAY | FAST; -#net "sdr_d_p(13)" loc = "D2" | iostandard=SSTL2_I | NODELAY | FAST; -#net "sdr_d_p(14)" loc = "B6" | iostandard=SSTL2_I | NODELAY | FAST; -#net "sdr_d_p(15)" loc = "B5" | iostandard=SSTL2_I | NODELAY | FAST; - -# TIMING -# Create timing names -NET "cpu_clk_p" TNM_NET = "cpu_clk_p"; -NET "sdr_clk_fb_p" TNM_NET = "sdr_clk_fb_p"; -#NET "cpu_clk" TNM_NET = "cpu_clk"; -#NET "cpu_clk_2x" TNM_NET = "cpu_clk_2x"; -#NET "cpu_clk_4x" TNM_NET = "cpu_clk_4x"; -#NET "ddr_in_clk" TNM_NET = "ddr_in_clk"; -#NET "ddr_in_clk_2x" TNM_NET = "ddr_in_clk_2x"; - -## Create timing - -# Periode timing -TIMESPEC "TS_cpu_clk" = PERIOD "cpu_clk_p" 10 ns HIGH 50 %; -#TIMESPEC "TS_sdr_clk_fb_p" = PERIOD "sdr_clk_fb_p" 7.8 ns HIGH 50 %; - -# Clock domain crossing timing -#TIMESPEC "TS_cpu1_to_cpu2" = FROM "cpu_clk" TO "cpu_clk_2x" 7.8 ns; -#TIMESPEC "TS_cpu1_to_cpu4" = FROM "cpu_clk" TO "cpu_clk_4x" 3.9 ns; -#TIMESPEC "TS_cpu1_to_ddr2" = FROM "cpu_clk" TO "ddr_in_clk" 7.8 ns; -#TIMESPEC "TS_cpu1_to_ddr2_2x" = FROM "cpu_clk" TO "ddr_in_clk_2x" 3.9 ns; - -#TIMESPEC "TS_cpu2_to_cpu1" = FROM "cpu_clk_2x" TO "cpu_clk" 7.8 ns; -#TIMESPEC "TS_cpu2_to_cpu4" = FROM "cpu_clk_2x" TO "cpu_clk_4x" 3.9 ns; -#TIMESPEC "TS_cpu2_to_ddr2" = FROM "cpu_clk_2x" TO "ddr_in_clk" 7.8 ns; -#TIMESPEC "TS_cpu2_to_ddr_2x" = FROM "cpu_clk_2x" TO "ddr_in_clk_2x" 3.9 ns; - -#TIMESPEC "TS_cpu4_to_cpu1" = FROM "cpu_clk_4x" TO "cpu_clk" 3.9 ns; -#TIMESPEC "TS_cpu4_to_cpu2" = FROM "cpu_clk_4x" TO "cpu_clk_2x" 3.9 ns; -#TIMESPEC "TS_cpu4_to_ddr2" = FROM "cpu_clk_4x" TO "ddr_in_clk" 3.9 ns; -#TIMESPEC "TS_cpu4_to_ddr2_2x" = FROM "cpu_clk_4x" TO "ddr_in_clk_2x" 3.9 ns; - -#TIMESPEC "TS_ddr2_to_cpu1" = FROM "ddr_in_clk" TO "cpu_clk" 7.8 ns; -#TIMESPEC "TS_ddr2_to_cpu2" = FROM "ddr_in_clk" TO "cpu_clk_2x" 7.8 ns; -#TIMESPEC "TS_ddr2_to_cpu4" = FROM "ddr_in_clk" TO "cpu_clk_4x" 3.9 ns; -#TIMESPEC "TS_ddr2_to_ddr2_2x" = FROM "ddr_in_clk" TO "ddr_in_clk_2x" 3.9 ns; - -#TIMESPEC "TS_ddr2_2x_to_cpu1" = FROM "ddr_in_clk_2x" TO "cpu_clk" 3.9 ns; -#TIMESPEC "TS_ddr2_2x_to_cpu2" = FROM "ddr_in_clk_2x" TO "cpu_clk_2x" 3.9 ns; -#TIMESPEC "TS_ddr2_2x_to_cpu4" = FROM "ddr_in_clk_2x" TO "cpu_clk_4x" 3.9 ns; -#TIMESPEC "TS_ddr2_2x_to_ddr2" = FROM "ddr_in_clk_2x" TO "ddr_in_clk" 3.9 ns; - - - diff --git a/zpu/hdl/zpu4/src/ic300.vhd b/zpu/hdl/zpu4/src/ic300.vhd deleted file mode 100644 index a1b4f41..0000000 --- a/zpu/hdl/zpu4/src/ic300.vhd +++ /dev/null @@ -1,144 +0,0 @@ --------------------------------------------------------------------------------- --- Company: Zylin AS --- Engineer: Tore Ramsland --- --- Create Date: 21:47:41 07/03/05 --- Design Name: ic300 --- Module Name: ic300 - behave --- Project Name: eCosBoard --- Target Device: XC3S400400-FG256 --- Tool versions: 7.1i --- Description: Top level --- --- Dependencies: --- --- Revision: --- 2005-07-11 Updated to test FPGA --- --------------------------------------------------------------------------------- -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.STD_LOGIC_UNSIGNED.ALL; - -library UNISIM; -use UNISIM.VComponents.all; - -library zylin; -use zylin.arm7.all; - -library zylin; -use zylin.zpu_config.all; -use zylin.zpupkg.all; - -library work; -use work.phi_config.all; -use work.ic300pkg.all; - -entity ic300 is - generic( - simulate_io_time : boolean := false); - port ( -- Clock inputs - cpu_clk_p : in std_logic; - - -- CPU interface signals - cpu_a_p : in std_logic_vector(20 downto 0); - cpu_wr_n_p : in std_logic_vector(1 downto 0); - cpu_cs_n_p : in std_logic_vector(3 downto 1); - cpu_oe_n_p : in std_logic; - cpu_d_p : inout std_logic_vector(15 downto 0); - cpu_irq_p : out std_logic_vector(1 downto 0); - cpu_fiq_p : out std_logic; - cpu_wait_n_p : out std_logic; - - -- DDR SDRAM Signals - sdr_clk_p : out std_logic; -- ddr_sdram_clock - sdr_clk_n_p : out std_logic; -- /ddr_sdram_clock - cke_q_p : out std_logic; -- clock enable - cs_qn_p : out std_logic; -- /chip select - ras_qn_p : inout std_logic; -- /ras - cas_qn_p : inout std_logic; -- /cas - we_qn_p : inout std_logic; -- /write enable - dm_q_p : out std_logic_vector(1 downto 0); -- data mask bits, set to "00" - dqs_q_p : out std_logic_vector(1 downto 0); -- data strobe, only for write - ba_q_p : out std_logic_vector(1 downto 0); -- bank select - sdr_a_p : out std_logic_vector(12 downto 0); -- address bus - sdr_d_p : inout std_logic_vector(15 downto 0); -- bidir data bus - sdr_clk_fb_p : in std_logic -- DDR clock feedback - ); -end ic300; - -architecture behave of ic300 is - -signal cpu_we : std_logic_vector(1 downto 0); -- Write signal for lower(0) and upper(1) 8 data bits -signal cpu_re : std_logic; -- Read enable signal for all 16 bits -signal areset : std_logic; -- Asyncronous active high reset (for initialization) -signal areset_dummy : std_logic; - --- Clock module signals -signal clk_status : std_logic_vector(2 downto 0); -- DLL lock status (from 3 DLL's) -signal cpu_clk : std_logic; -- 64 MHz CPU clk -signal cpu_clk_2x : std_logic; -- 128 MHz CPU clk (in phase with 64 MHz) -signal cpu_clk_4x : std_logic; -- 256 MHz CPU clk (in phase with 64 MHz) -signal ddr_in_clk : std_logic; -- 128 MHz clock from DDR SDRAM -signal ddr_in_clk_2x : std_logic; -- 256 MHz clock from DDR SDRAM - -- NOTE! Phase relation to 64 MHz clock unknown - --- Internal CPU interface signals -signal cpu_din : std_logic_vector(15 downto 0); -- 16-bit data from CPU -signal cpu_dout : std_logic_vector(15 downto 0); -- 16-bit data to CPU -signal cpu_a : std_logic_vector(20 downto 0); -- 21-bit address from CPU - -begin - --- areset <= '0'; - areset_dummy <= '0'; - - global_init_reset: - rocbuf port map(I=>areset_dummy,O=>areset); - - allclocks: - clocks port map( - areset => areset, - cpu_clk_p => cpu_clk_p, - cpu_clk => cpu_clk, - cpu_clk_2x => cpu_clk_2x, - cpu_clk_4x => cpu_clk_4x, - sdr_clk_fb_p => sdr_clk_fb_p, - ddr_in_clk => ddr_in_clk, - ddr_in_clk_2x => ddr_in_clk_2x, - locked => clk_status); - - arm7cpu: - arm7wb generic map (simulate_io_time => simulate_io_time) - port map( - areset => areset, - cpu_clk => cpu_clk, - cpu_clk_2x => cpu_clk_2x, - cpu_a_p => cpu_a_p, - cpu_wr_n_p => cpu_wr_n_p, - cpu_cs_n_p => cpu_cs_n_p, - cpu_oe_n_p => cpu_oe_n_p, - cpu_d_p => cpu_d_p, - cpu_irq_p => cpu_irq_p, - cpu_fiq_p => cpu_fiq_p, - cpu_wait_n_p => cpu_wait_n_p, - cpu_din => cpu_din, - cpu_a => cpu_a, - cpu_we => cpu_we, - cpu_re => cpu_re, - cpu_dout => cpu_dout); - - - cpu_fpga_regs: - zpuio port map( - areset => areset, - cpu_clk => cpu_clk, - clk_status => clk_status, - cpu_din => cpu_din, - cpu_a => cpu_a, - cpu_we => cpu_we, - cpu_re => cpu_re, - cpu_dout => cpu_dout); - - -end behave; diff --git a/zpu/hdl/zpu4/src/ic300_config.vhd b/zpu/hdl/zpu4/src/ic300_config.vhd deleted file mode 100644 index b14ec79..0000000 --- a/zpu/hdl/zpu4/src/ic300_config.vhd +++ /dev/null @@ -1,26 +0,0 @@ -library IEEE; -use IEEE.STD_LOGIC_1164.all; - -package phi_config is - - constant Fpga_Global_Base : std_logic_vector(19 downto 17) := "000"; -- 0x0800.... - constant Clock_Stat_Reg_Addr : std_logic_vector(5 downto 2) := "0000"; -- 0x....0000 - constant Ctrl_Reg_Addr : std_logic_vector(5 downto 2) := "0001"; -- 0x....0004 - constant output_enable : std_logic_vector(5 downto 2) := "0010"; -- 0x....0008 - constant output_disable : std_logic_vector(5 downto 2) := "0011"; -- 0x....000C - constant data_status : std_logic_vector(5 downto 2) := "0100"; -- 0x....0010 - constant set_output_data : std_logic_vector(5 downto 2) := "0101"; -- 0x....0014 - constant clear_output_data : std_logic_vector(5 downto 2) := "0110"; -- 0x....0018 - constant data_in_read : std_logic_vector(5 downto 2) := "0111"; -- 0x....001C - constant output_status : std_logic_vector(5 downto 2) := "1000"; -- 0x....0020 - constant cpu_access_address : std_logic_vector(5 downto 2) := "1001"; -- 0x....0024 - - constant Fpga_Ethernet_Reg_Base : std_logic_vector(19 downto 17) := "110"; -- 0x080C0000 - - constant Fpga_DDR_Ctrl_Base : std_logic_vector(19 downto 17) := "111"; -- 0x080E.... - constant DDR_Ctrl_Reg_Addr : std_logic_vector(3 downto 2) := "00"; -- 0x....0000 - constant DDR_Mode_Reg_Addr : std_logic_vector(3 downto 2) := "01"; -- 0x....0004 - constant DDR_Page_Select_Addr : std_logic_vector(3 downto 2) := "10"; -- 0x....0008 - - -end phi_config; diff --git a/zpu/hdl/zpu4/src/ic300pkg.vhd b/zpu/hdl/zpu4/src/ic300pkg.vhd deleted file mode 100644 index 13da306..0000000 --- a/zpu/hdl/zpu4/src/ic300pkg.vhd +++ /dev/null @@ -1,88 +0,0 @@ -library IEEE; -use IEEE.STD_LOGIC_1164.all; - -package ic300pkg is - - component ic300 is - port ( -- Clock inputs - cpu_clk_p : in std_logic; - - -- CPU interface signals - cpu_a_p : in std_logic_vector(20 downto 0); - cpu_wr_n_p : in std_logic_vector(1 downto 0); - cpu_cs_n_p : in std_logic_vector(3 downto 1); - cpu_oe_n_p : in std_logic; - cpu_d_p : inout std_logic_vector(15 downto 0); - cpu_irq_p : out std_logic_vector(1 downto 0); - cpu_fiq_p : out std_logic; - cpu_wait_n_p : out std_logic; - - -- DDR SDRAM Signals - sdr_clk_p : out std_logic; -- ddr_sdram_clock - sdr_clk_n_p : out std_logic; -- /ddr_sdram_clock - cke_q_p : out std_logic; -- clock enable - cs_qn_p : out std_logic; -- /chip select - ras_qn_p : inout std_logic; -- /ras - cas_qn_p : inout std_logic; -- /cas - we_qn_p : inout std_logic; -- /write enable - dm_q_p : out std_logic_vector(1 downto 0); -- data mask bits, set to "00" - dqs_q_p : out std_logic_vector(1 downto 0); -- data strobe, only for write - ba_q_p : out std_logic_vector(1 downto 0); -- bank select - sdr_a_p : out std_logic_vector(12 downto 0); -- address bus - sdr_d_p : inout std_logic_vector(15 downto 0); -- bidir data bus - sdr_clk_fb_p : in std_logic -- DDR clock feedback - ); - end component; - - component clocks is - port ( areset : in std_logic; - cpu_clk_p : in std_logic; - sdr_clk_fb_p : in std_logic; - cpu_clk : out std_logic; - cpu_clk_2x : out std_logic; - cpu_clk_4x : out std_logic; - ddr_in_clk : out std_logic; - ddr_in_clk_2x : out std_logic; - locked : out std_logic_vector(2 downto 0)); - end component; - - component cpu_regs is - port ( areset : in std_logic; - cpu_clk : in std_logic; - clk_status : in std_logic_vector(2 downto 0); - cpu_din : in std_logic_vector(15 downto 0); - cpu_a : in std_logic_vector(20 downto 0); - cpu_we : in std_logic_vector(1 downto 0); - cpu_re : in std_logic; - cpu_dout : inout std_logic_vector(15 downto 0)); - end component; - - component ddr_bridge is - port ( areset : in std_logic; - cpu_clk : in std_logic; - cpu_clk_2x : in std_logic; - cpu_clk_4x : in std_logic; - ddr_in_clk : in std_logic; - ddr_in_clk_2x : in std_logic; - - cpu_we : in std_logic_vector(1 downto 0); - cpu_re : in std_logic; - cpu_din : in std_logic_vector(15 downto 0); - cpu_a : in std_logic_vector(20 downto 0); - cpu_dout : inout std_logic_vector(15 downto 0); - - sdr_clk_p : out std_logic; -- ddr_sdram_clock - sdr_clk_n_p : out std_logic; -- /ddr_sdram_clock - cke_q_p : out std_logic; -- clock enable - cs_qn_p : out std_logic; -- /chip select - ras_qn_p : inout std_logic; -- /ras - cas_qn_p : inout std_logic; -- /cas - we_qn_p : inout std_logic; -- /write enable - dm_q_p : out std_logic_vector(1 downto 0); -- data mask bits, set to "00" - dqs_q_p : out std_logic_vector(1 downto 0); -- data strobe, only for write - ba_q_p : out std_logic_vector(1 downto 0); -- bank select - sdr_a_p : out std_logic_vector(12 downto 0); -- address bus - sdr_d_p : inout std_logic_vector(15 downto 0)); -- bidir data bus - end component; - -end ic300pkg; diff --git a/zpu/hdl/zpu4/src/xmake.filelist b/zpu/hdl/zpu4/src/xmake.filelist deleted file mode 100644 index 91e623f..0000000 --- a/zpu/hdl/zpu4/src/xmake.filelist +++ /dev/null @@ -1,12 +0,0 @@ -vhdl work "ic300_config.vhd" -vhdl work "ic300pkg.vhd" -vhdl zylin "zpu_config.vhd" -vhdl zylin "zpupkg.vhd" -vhdl zylin "zpu_core.vhd" -vhdl work "bram.vhd" -vhdl zylin "zpuio.vhd" -vhdl zylin "..\dummyfpgalib\arm7\src\arm7pkg.vhd" -vhdl zylin "..\dummyfpgalib\arm7\src\arm7wb.vhd" -vhdl work "clocks.vhd" -vhdl work "timer.vhd" -vhdl work "ic300.vhd" \ No newline at end of file diff --git a/zpu/hdl/zpu4/src/xmake.filelist.bramsmall b/zpu/hdl/zpu4/src/xmake.filelist.bramsmall deleted file mode 100644 index 141633e..0000000 --- a/zpu/hdl/zpu4/src/xmake.filelist.bramsmall +++ /dev/null @@ -1,5 +0,0 @@ -vhdl work "zpu_config.vhd" -vhdl work "zpupkg.vhd" -vhdl work "zpu_core_small.vhd" -vhdl work "bram_dmips.vhd" -vhdl work "testlut.vhd" diff --git a/zpu/hdl/zpu4/src/xmake.xst b/zpu/hdl/zpu4/src/xmake.xst deleted file mode 100644 index bfdb23f..0000000 --- a/zpu/hdl/zpu4/src/xmake.xst +++ /dev/null @@ -1,53 +0,0 @@ -set -tmpdir ../tmp -set -xsthdpdir ../xst -run --ifn xmake.filelist --ifmt mixed --ofn ../syn/ic300 --ofmt NGC --p xc3s400-4-ft256 --top ic300 --opt_mode Area --opt_level 2 --iuc NO --lso ic300.lso --keep_hierarchy NO --glob_opt AllClockNets --rtlview Yes --read_cores YES --write_timing_constraints NO --cross_clock_analysis NO --hierarchy_separator / --bus_delimiter <> --case maintain --slice_utilization_ratio 100 --verilog2001 YES --fsm_extract YES -fsm_encoding Auto --safe_implementation No --fsm_style lut --ram_extract Yes --ram_style Auto --rom_extract Yes --rom_style Auto --mux_extract YES --mux_style Auto --decoder_extract YES --priority_extract YES --shreg_extract YES --shift_extract YES --xor_collapse YES --resource_sharing YES --mult_style auto --iobuf YES --max_fanout 500 --bufg 8 --register_duplication YES --equivalent_register_removal NO --register_balancing No --slice_packing YES --optimize_primitives NO --use_clock_enable Yes --use_sync_set No --use_sync_reset No --iob true --slice_utilization_ratio_maxmargin 5 diff --git a/zpu/hdl/zpu4/src/zpuio_bram.vhd b/zpu/hdl/zpu4/src/zpuio_bram.vhd deleted file mode 100644 index 5d3f409..0000000 --- a/zpu/hdl/zpu4/src/zpuio_bram.vhd +++ /dev/null @@ -1,229 +0,0 @@ -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.STD_LOGIC_UNSIGNED.ALL; - -library work; -use work.zpu_config.all; -use work.zpupkg.all; - -entity zpuio is - port ( areset : in std_logic; - cpu_clk : in std_logic; - clk_status : in std_logic_vector(2 downto 0); - cpu_din : in std_logic_vector(15 downto 0); - cpu_a : in std_logic_vector(20 downto 0); - cpu_we : in std_logic_vector(1 downto 0); - cpu_re : in std_logic; - cpu_dout : inout std_logic_vector(15 downto 0)); -end zpuio; - -architecture behave of zpuio is - -signal timer_read : std_logic_vector(7 downto 0); ---signal timer_write : std_logic_vector(7 downto 0); -signal timer_we : std_logic; - - -signal io_busy : std_logic; -signal io_read : std_logic_vector(7 downto 0); ---signal io_write : std_logic_vector(7 downto 0); -signal io_addr : std_logic_vector(maxAddrBit downto minAddrBit); -signal io_writeEnable : std_logic; -signal Enable : std_logic; - -signal din : std_logic_vector(7 downto 0); -signal dout : std_logic_vector(7 downto 0); -signal adr : std_logic_vector(15 downto 0); -signal break : std_logic; -signal we : std_logic; -signal re : std_logic; - - --- uart forwarding... - -signal uartTXPending : std_logic; -signal uartTXCleared : std_logic; -signal uartData : std_logic_vector(7 downto 0); - -signal readingTimer : std_logic; - - - - -signal mem_busy : std_logic; -signal mem_read : std_logic_vector(wordSize-1 downto 0); -signal mem_write : std_logic_vector(wordSize-1 downto 0); -signal mem_addr : std_logic_vector(maxAddrBitIncIO downto 0); -signal mem_writeEnable : std_logic; -signal mem_readEnable : std_logic; -signal mem_writeMask: std_logic_vector(wordBytes-1 downto 0); - - - - ---signal io_mem_read : std_logic_vector(7 downto 0); ---signal io_mem_writeEnable : std_logic; ---signal io_mem_readEnable : std_logic; -signal io_readEnable : std_logic; - - - - - -begin - - io_addr <= mem_addr(maxAddrBit downto minAddrBit); - - timerinst: timer port map ( - clk => cpu_clk, - areset => areset, - we => timer_we, - din => mem_write(7 downto 0), - adr => io_addr(4 downto 2), - dout => timer_read); - - zpu: zpu_core port map ( - clk => cpu_clk , - areset => areset, - in_mem_busy => mem_busy, - mem_read => mem_read, - mem_write => mem_write, - out_mem_addr => mem_addr, - out_mem_writeEnable => mem_writeEnable, - out_mem_readEnable => mem_readEnable, - mem_writeMask => mem_writeMask, - interrupt => '0', - break => break); - - - - - -- Read/write are on different addresses - -- The registers are 8 bits and mapped to bit[7:0] - -- - -- 0xC000 Write: Writes to UART TX FIFO (4 byte FIFO) - -- Read : Reads from UART RX FIFO (4 byte FIFO) - -- 0xC004 Read : UART status register - -- Bit 0 = RX FIFO empty - -- Bit 1 = TX FIFO full - -- 0xA000 Skrive: LED's (8 stk.) - - -- 0x9000 Write: bit 0: 1= reset counter - -- 0= counter running - -- bit 1: 1= sample counter (when set to 1) - -- 0=not used - -- Read : counter bit[7:0] - -- 0x9004 Read: counter bit [15:8] - -- 0x9008 Read: counter bit [23:16] - -- 0x900C Read: counter bit [31:24] - -- 0x9010 Read: counter bit [39:32] - -- 0x9014 Read: counter bit [47:40] - -- 0x9018 Read: counter bit [55:48] - -- 0x901C Read: counter bit [63:56] - -- - -- 0x8800 Read: unsigned 8-bit integer with FPGA frequency (in MHz) - - fauxUart: - process(cpu_clk, areset) - begin - if areset = '1' then - io_busy <= '0'; - uartTXPending <= '0'; - timer_we <= '0'; - io_busy <= '0'; - uartData <= x"58"; -- 'X' - readingTimer <= '0'; - elsif (cpu_clk'event and cpu_clk = '1') then - timer_we <= '0'; - io_busy <= '0'; - if uartTXCleared = '1' then - uartTXPending <= '0'; - end if; - - if io_writeEnable = '1' then - if io_addr=x"1000" then - -- Write to UART - uartData <= mem_write(7 downto 0); - uartTXPending <= '1'; - io_busy <= '1'; - elsif io_addr(12)='1' then - timer_we <= '1'; - io_busy <= '1'; - else - report "Illegal IO write" severity failure; - end if; - end if; - if (io_readEnable = '1') then - if io_addr=x"1001" then - io_read <= (0=>'1', -- recieve empty - 1 => uartTXPending, -- tx full - others => '0'); - io_busy <= '1'; - elsif io_addr(12)='1' then - readingTimer <= '1'; - io_busy <= '1'; - elsif io_addr(11)='1' then - io_read <= ZPU_Frequency; - io_busy <= '1'; - else - report "Illegal IO read" severity failure; - end if; - - else - if (readingTimer = '1') then - readingTimer <= '0'; - io_read <= timer_read; - io_busy <= '0'; - else - io_read <= (others => '1'); - end if; - end if; - end if; - end process; - - - forwardUARTOutputToARM: - process(cpu_clk, areset) - begin - if areset = '1' then - uartTXCleared <= '0'; - elsif (cpu_clk = '1' and cpu_clk'event) then - if cpu_we(0) = '1' and cpu_a(3 downto 1) = "000" then - uartTXCleared <= cpu_din(0); - else - uartTXCleared <= uartTXCleared; - end if; - end if; - end process; - - cpu_dout(7 downto 0) <= uartData when (cpu_re = '1' and cpu_a(3 downto 1) = "001") else (others => 'Z'); - cpu_dout <= (0 => uartTXPending, others => '0') when (cpu_re = '1' and cpu_a(3 downto 1) = "000") else (others => 'Z'); - - io_writeEnable <= mem_writeEnable and mem_addr(ioBit); --- io_readEnable <= mem_readEnable and mem_addr(ioBit); - mem_busy <= io_busy or io_readEnable; - - -- Memory reads either come from IO or DRAM. We need to pick the right one. - memorycontrol: - process(cpu_clk, areset) - begin - if areset = '1' then - io_readEnable <= '0'; - - - elsif (cpu_clk'event and cpu_clk = '1') then - mem_read <= (others => '0'); - - if mem_addr(ioBit)='1' and mem_readEnable='1' then - io_readEnable <= '1'; - end if; - if io_readEnable='1' and io_busy='0' then - io_readEnable <= '0'; - mem_read(7 downto 0) <= io_read; - end if; - - end if; - end process; - - -end behave; -- cgit v1.1 From 167263dcae188a8812627ab52cfd96b8fdc5df8a Mon Sep 17 00:00:00 2001 From: oharboe Date: Thu, 17 Apr 2008 08:31:56 +0000 Subject: * deleted duplicate files from example folder. --- zpu/hdl/zpu4/src/sim_small_fpga_top.vhd | 179 ++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 zpu/hdl/zpu4/src/sim_small_fpga_top.vhd (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/sim_small_fpga_top.vhd b/zpu/hdl/zpu4/src/sim_small_fpga_top.vhd new file mode 100644 index 0000000..b51fea0 --- /dev/null +++ b/zpu/hdl/zpu4/src/sim_small_fpga_top.vhd @@ -0,0 +1,179 @@ +-------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 20:15:31 04/14/05 +-- Design Name: +-- Module Name: fpga_top - behave +-- Project Name: +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +library UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; + +entity fpga_top is +end fpga_top; + +architecture behave of fpga_top is + + +signal clk : std_logic; + +signal areset : std_logic; + + +component zpu_io is + generic ( + log_file: string := "log.txt" + ); + port( + clk : in std_logic; + areset : in std_logic; + busy : out std_logic; + writeEnable : in std_logic; + readEnable : in std_logic; + write : in std_logic_vector(wordSize-1 downto 0); + read : out std_logic_vector(wordSize-1 downto 0); + addr : in std_logic_vector(maxAddrBit downto minAddrBit) + ); +end component; + + + + + +signal mem_busy : std_logic; +signal mem_read : std_logic_vector(wordSize-1 downto 0); +signal mem_write : std_logic_vector(wordSize-1 downto 0); +signal mem_addr : std_logic_vector(maxAddrBitIncIO downto 0); +signal mem_writeEnable : std_logic; +signal mem_readEnable : std_logic; +signal mem_writeMask: std_logic_vector(wordBytes-1 downto 0); + +signal enable : std_logic; + +signal dram_mem_busy : std_logic; +signal dram_mem_read : std_logic_vector(wordSize-1 downto 0); +signal dram_mem_write : std_logic_vector(wordSize-1 downto 0); +signal dram_mem_writeEnable : std_logic; +signal dram_mem_readEnable : std_logic; +signal dram_mem_writeMask: std_logic_vector(wordBytes-1 downto 0); + + +signal io_busy : std_logic; + +signal io_mem_read : std_logic_vector(wordSize-1 downto 0); +signal io_mem_writeEnable : std_logic; +signal io_mem_readEnable : std_logic; + + +signal dram_ready : std_logic; +signal io_ready : std_logic; +signal io_reading : std_logic; + + +signal break : std_logic; + +begin + poweronreset: roc port map (O => areset); + + + + zpu: zpu_core port map ( + clk => clk , + areset => areset, + enable => enable, + in_mem_busy => mem_busy, + mem_read => mem_read, + mem_write => mem_write, + out_mem_addr => mem_addr, + out_mem_writeEnable => mem_writeEnable, + out_mem_readEnable => mem_readEnable, + mem_writeMask => mem_writeMask, + interrupt => '0', + break => break); + + + ioMap: zpu_io port map ( + clk => clk, + areset => areset, + busy => io_busy, + writeEnable => io_mem_writeEnable, + readEnable => io_mem_readEnable, + write => mem_write, + read => io_mem_read, + addr => mem_addr(maxAddrBit downto minAddrBit) + ); + + dram_mem_writeEnable <= mem_writeEnable and not mem_addr(ioBit); + dram_mem_readEnable <= mem_readEnable and not mem_addr(ioBit); + io_mem_writeEnable <= mem_writeEnable and mem_addr(ioBit); + io_mem_readEnable <= mem_readEnable and mem_addr(ioBit); + mem_busy <= io_busy; + + + + -- Memory reads either come from IO or DRAM. We need to pick the right one. + memorycontrol: + process(dram_mem_read, dram_ready, io_ready, io_mem_read) + begin + mem_read <= (others => 'U'); + if dram_ready='1' then + mem_read <= dram_mem_read; + end if; + + if io_ready='1' then + mem_read <= (others => '0'); + mem_read <= io_mem_read; + end if; + end process; + + + io_ready <= (io_reading or io_mem_readEnable) and not io_busy; + + memoryControlSync: + process(clk, areset) + begin + if areset = '1' then + enable <= '0'; + io_reading <= '0'; + dram_ready <= '0'; + elsif (clk'event and clk = '1') then + enable <= '1'; + io_reading <= io_busy or io_mem_readEnable; + dram_ready<=dram_mem_readEnable; + + end if; + end process; + + -- wiggle the clock @ 100MHz + clock : PROCESS + begin + clk <= '0'; + wait for 5 ns; + clk <= '1'; + wait for 5 ns; + end PROCESS clock; + + +end behave; -- cgit v1.1 From d09fa3de9df02a66c5084623076ac3e167b58274 Mon Sep 17 00:00:00 2001 From: oharboe Date: Tue, 22 Apr 2008 05:52:16 +0000 Subject: * zpu/hdl/example_ghdl/ghdl_import.sh, zpu/hdl/example_ghdl/ghdl_make.sh, zpu/hdl/example_ghdl/ghdl_options.sh, zpu/hdl/example_ghdl/README: GHDL example * zpu/hdl/zpu4/src/dmipssmalltrace_ghdl.sh: testcase for GHDL * zpu/hdl/zpu4/src/dmipstrace_ghdl.sh: testcase for GHDL * zpu/hdl/zpu4/src/simzpu_medium_ghdl.sh: testcase for GHDL * zpu/hdl/example/helloworld.vhd, zpu/hdl/zpu4/src/bram_dmips.vhd, zpu/hdl/zpu4/src/dmipssmalltrace_ghdl.sh, zpu/hdl/zpu4/src/dram_dmips.vhd, zpu/hdl/zpu4/src/dram_hello.vhd, zpu/hdl/zpu4/src/io.vhd, zpu/hdl/zpu4/src/sim_fpga_top.vhd, zpu/hdl/zpu4/src/sim_small_fpga_top.vhd, zpu/hdl/zpu4/src/timer.vhd, zpu/hdl/zpu4/src/trace.vhd, zpu/hdl/zpu4/src/zpu_config_trace.vhd, zpu/hdl/zpu4/src/zpu_core_small.vhd, zpu/hdl/zpu4/src/zpu_core.vhd, zpu/hdl/zpu4/src/zpupkg.vhd: conversion to numeric_std --- zpu/hdl/zpu4/src/bram_dmips.vhd | 12 +- zpu/hdl/zpu4/src/dmipssmalltrace_ghdl.sh | 26 + zpu/hdl/zpu4/src/dmipstrace_ghdl.sh | 25 + zpu/hdl/zpu4/src/dram_dmips.vhd | 8 +- zpu/hdl/zpu4/src/dram_hello.vhd | 8 +- zpu/hdl/zpu4/src/io.vhd | 6 +- zpu/hdl/zpu4/src/log.txt | 414 +++++-- zpu/hdl/zpu4/src/sim_fpga_top.vhd | 377 ++++--- zpu/hdl/zpu4/src/sim_small_fpga_top.vhd | 356 +++--- zpu/hdl/zpu4/src/simzpu_medium_ghdl.sh | 25 + zpu/hdl/zpu4/src/timer.vhd | 6 +- zpu/hdl/zpu4/src/trace.vhd | 7 +- zpu/hdl/zpu4/src/zpu_config_trace.vhd | 1 - zpu/hdl/zpu4/src/zpu_core.vhd | 1795 +++++++++++++++--------------- zpu/hdl/zpu4/src/zpu_core_small.vhd | 880 ++++++++------- zpu/hdl/zpu4/src/zpupkg.vhd | 44 +- 16 files changed, 2149 insertions(+), 1841 deletions(-) create mode 100644 zpu/hdl/zpu4/src/dmipssmalltrace_ghdl.sh create mode 100644 zpu/hdl/zpu4/src/dmipstrace_ghdl.sh create mode 100644 zpu/hdl/zpu4/src/simzpu_medium_ghdl.sh (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/bram_dmips.vhd b/zpu/hdl/zpu4/src/bram_dmips.vhd index 83bfc28..1d62d21 100644 --- a/zpu/hdl/zpu4/src/bram_dmips.vhd +++ b/zpu/hdl/zpu4/src/bram_dmips.vhd @@ -1,6 +1,6 @@ library ieee; use ieee.std_logic_1164.all; -use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; library work; @@ -22,7 +22,7 @@ end dualport_ram; architecture dualport_ram_arch of dualport_ram is -type ram_type is array(0 to ((2**(maxAddrBitBRAM+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); +type ram_type is array(natural range 0 to ((2**(maxAddrBitBRAM+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); shared variable ram : ram_type := ( @@ -3691,10 +3691,10 @@ begin end if; if (memAWriteEnable = '1') then - ram(conv_integer(memAAddr)) := memAWrite; + ram(to_integer(unsigned(memAAddr))) := memAWrite; memARead <= memAWrite; else - memARead <= ram(conv_integer(memAAddr)); + memARead <= ram(to_integer(unsigned(memAAddr))); end if; end if; end process; @@ -3703,10 +3703,10 @@ process (clk) begin if (clk'event and clk = '1') then if (memBWriteEnable = '1') then - ram(conv_integer(memBAddr)) := memBWrite; + ram(to_integer(unsigned(memBAddr))) := memBWrite; memBRead <= memBWrite; else - memBRead <= ram(conv_integer(memBAddr)); + memBRead <= ram(to_integer(unsigned(memBAddr))); end if; end if; end process; diff --git a/zpu/hdl/zpu4/src/dmipssmalltrace_ghdl.sh b/zpu/hdl/zpu4/src/dmipssmalltrace_ghdl.sh new file mode 100644 index 0000000..5e43b64 --- /dev/null +++ b/zpu/hdl/zpu4/src/dmipssmalltrace_ghdl.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +UNISIM_DIR="'location of GHDL objects for unisim library'/unisim_v93" +IMPORT_OPTIONS="--std=93 --ieee=synopsys --workdir=work -P${UNISIM_DIR}" +MAKE_OPTIONS="${IMPORT_OPTIONS} -Wl,-s -fexplicit --syn-binding" + +if test ! -e work; then + echo "Building work library..." + mkdir work + ghdl -i ${IMPORT_OPTIONS} zpu_config_trace.vhd + ghdl -i ${IMPORT_OPTIONS} zpupkg.vhd + ghdl -i ${IMPORT_OPTIONS} txt_util.vhd + ghdl -i ${IMPORT_OPTIONS} sim_fpga_top.vhd + ghdl -i ${IMPORT_OPTIONS} zpu_core_small.vhd + ghdl -i ${IMPORT_OPTIONS} bram_dmips.vhd + ghdl -i ${IMPORT_OPTIONS} dram_dmips.vhd + ghdl -i ${IMPORT_OPTIONS} timer.vhd + ghdl -i ${IMPORT_OPTIONS} io.vhd + ghdl -i ${IMPORT_OPTIONS} trace.vhd +fi + +echo "Compiling design..." +if ghdl -m ${MAKE_OPTIONS} fpga_top; then + echo "Compilation finished, start simulation with" + echo " ./fpga_top --stop-time=1ms" +fi diff --git a/zpu/hdl/zpu4/src/dmipstrace_ghdl.sh b/zpu/hdl/zpu4/src/dmipstrace_ghdl.sh new file mode 100644 index 0000000..3be392f --- /dev/null +++ b/zpu/hdl/zpu4/src/dmipstrace_ghdl.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +UNISIM_DIR="'location of GHDL objects for unisim library'/unisim_v93" +IMPORT_OPTIONS="--std=93 --ieee=synopsys --workdir=work -P${UNISIM_DIR}" +MAKE_OPTIONS="${IMPORT_OPTIONS} -Wl,-s -fexplicit --syn-binding" + +if test ! -e work; then + echo "Building work library..." + mkdir work + ghdl -i ${IMPORT_OPTIONS} zpu_config_trace.vhd + ghdl -i ${IMPORT_OPTIONS} zpupkg.vhd + ghdl -i ${IMPORT_OPTIONS} txt_util.vhd + ghdl -i ${IMPORT_OPTIONS} sim_fpga_top.vhd + ghdl -i ${IMPORT_OPTIONS} zpu_core.vhd + ghdl -i ${IMPORT_OPTIONS} dram_dmips.vhd + ghdl -i ${IMPORT_OPTIONS} timer.vhd + ghdl -i ${IMPORT_OPTIONS} io.vhd + ghdl -i ${IMPORT_OPTIONS} trace.vhd +fi + +echo "Compiling design..." +if ghdl -m ${MAKE_OPTIONS} fpga_top; then + echo "Compilation finished, start simulation with" + echo " ./fpga_top --stop-time=2500us" +fi diff --git a/zpu/hdl/zpu4/src/dram_dmips.vhd b/zpu/hdl/zpu4/src/dram_dmips.vhd index a289fd7..a9fd59e 100644 --- a/zpu/hdl/zpu4/src/dram_dmips.vhd +++ b/zpu/hdl/zpu4/src/dram_dmips.vhd @@ -1,6 +1,6 @@ library ieee; use ieee.std_logic_1164.all; -use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; library work; @@ -22,7 +22,7 @@ end dram; architecture dram_arch of dram is -type ram_type is array(0 to ((2**(maxAddrBitDRAM+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); +type ram_type is array(natural range 0 to ((2**(maxAddrBitDRAM+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); shared variable ram : ram_type := ( @@ -3294,10 +3294,10 @@ begin if areset = '1' then elsif (clk'event and clk = '1') then if (mem_writeEnable = '1') then - ram(conv_integer(mem_addr(maxAddrBit downto minAddrBit))) := mem_write; + ram(to_integer(unsigned(mem_addr(maxAddrBit downto minAddrBit)))) := mem_write; end if; if (mem_readEnable = '1') then - mem_read <= ram(conv_integer(mem_addr(maxAddrBit downto minAddrBit))); + mem_read <= ram(to_integer(unsigned(mem_addr(maxAddrBit downto minAddrBit)))); end if; end if; end process; diff --git a/zpu/hdl/zpu4/src/dram_hello.vhd b/zpu/hdl/zpu4/src/dram_hello.vhd index 3f7788a..4f02cca 100644 --- a/zpu/hdl/zpu4/src/dram_hello.vhd +++ b/zpu/hdl/zpu4/src/dram_hello.vhd @@ -1,6 +1,6 @@ library ieee; use ieee.std_logic_1164.all; -use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; library work; @@ -22,7 +22,7 @@ end dram; architecture dram_arch of dram is -type ram_type is array(0 to ((2**(maxAddrBitDRAM+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); +type ram_type is array(natural range 0 to ((2**(maxAddrBitDRAM+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); shared variable ram : ram_type := ( @@ -3093,10 +3093,10 @@ begin if areset = '1' then elsif (clk'event and clk = '1') then if (mem_writeEnable = '1') then - ram(conv_integer(mem_addr(maxAddrBit downto minAddrBit))) := mem_write; + ram(to_integer(unsigned(mem_addr(maxAddrBit downto minAddrBit)))) := mem_write; end if; if (mem_readEnable = '1') then - mem_read <= ram(conv_integer(mem_addr(maxAddrBit downto minAddrBit))); + mem_read <= ram(to_integer(unsigned(mem_addr(maxAddrBit downto minAddrBit)))); end if; end if; end process; diff --git a/zpu/hdl/zpu4/src/io.vhd b/zpu/hdl/zpu4/src/io.vhd index 7dbe36f..7a2601f 100644 --- a/zpu/hdl/zpu4/src/io.vhd +++ b/zpu/hdl/zpu4/src/io.vhd @@ -1,6 +1,6 @@ library ieee; use ieee.std_logic_1164.all; -use IEEE.STD_LOGIC_UNSIGNED.ALL; +use ieee.numeric_std.all; use std.textio.all; @@ -63,12 +63,12 @@ begin if addr=x"2028003" then -- Write to UART -- report "" & character'image(conv_integer(memBint)) severity note; - print(l_file, character'val(conv_integer(write))); + print(l_file, character'val(to_integer(unsigned(write)))); elsif addr(12)='1' then -- report "xxx" severity failure; -- timer_we <= '1'; else - print(l_file, character'val(conv_integer(write))); + print(l_file, character'val(to_integer(unsigned(write)))); report "Illegal IO write" severity warning; end if; diff --git a/zpu/hdl/zpu4/src/log.txt b/zpu/hdl/zpu4/src/log.txt index 47b8a65..7a82879 100644 --- a/zpu/hdl/zpu4/src/log.txt +++ b/zpu/hdl/zpu4/src/log.txt @@ -1,156 +1,380 @@ +H +e +l +l +o + +w +o +r +l +d + +1 -D -h -r -y -s -t -o -n + + + +H e +l +l +o -B -e -n -c -h -m -a +w +o r -k -, +l +d -V +2 + + + + + + +H e -r -s -i +l +l o -n -2 -. -1 +w +o +r +l +d -( -L -a -n -g -u -a -g +1 + + + + + + +H e -: +l +l +o + +w +o +r +l +d -C -) +2 -P +H +e +l +l +o + +w +o r +l +d + +1 + + + + + + +H +e +l +l +o + +w o -g r -a -m +l +d + +2 + + + + + + +H +e +l +l +o -c +w o -m -p -i +r l +d + +1 + + + + + + +H e +l +l +o + +w +o +r +l d +2 + + + + + + +H +e +l +l +o + w -i -t -h o -u -t +r +l +d + +1 + + + + + + +H +e +l +l +o -' +w +o r +l +d + +2 + + + + + + +H e -g -i -s -t +l +l +o + +w +o +r +l +d + +1 + + + + + + +H e +l +l +o + +w +o r -' +l +d + +2 + + + + + + +H +e +l +l +o -a -t -t +w +o r -i -b -u -t +l +d + +1 + + + + + + +H e +l +l +o + +w +o +r +l +d + +2 -E -x +H e -c -u -t -i +l +l o -n -s -t -a +w +o r -t -s -, +l +d -5 -0 -0 -0 -0 +1 + + + + + + +H +e +l +l +o +w +o r -u -n -s +l +d -t -h +2 + + + + + + +H +e +l +l +o + +w +o r +l +d + +1 + + + + + + +H +e +l +l o -u -g -h -D -h +w +o r -y -s -t +l +d + +2 + + + + + + +H +e +l +l o -n + +w +o +r +l +d + +1 + + + + + + +H e +l +l +o + +w +o +r +l +d + +2 + + + - diff --git a/zpu/hdl/zpu4/src/sim_fpga_top.vhd b/zpu/hdl/zpu4/src/sim_fpga_top.vhd index 4defc82..29151af 100644 --- a/zpu/hdl/zpu4/src/sim_fpga_top.vhd +++ b/zpu/hdl/zpu4/src/sim_fpga_top.vhd @@ -1,189 +1,188 @@ --------------------------------------------------------------------------------- --- Company: --- Engineer: --- --- Create Date: 20:15:31 04/14/05 --- Design Name: --- Module Name: fpga_top - behave --- Project Name: --- Target Device: --- Tool versions: --- Description: --- --- Dependencies: --- --- Revision: --- Revision 0.01 - File Created --- Additional Comments: --- --------------------------------------------------------------------------------- -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.STD_LOGIC_ARITH.ALL; -use IEEE.STD_LOGIC_UNSIGNED.ALL; - ----- Uncomment the following library declaration if instantiating ----- any Xilinx primitives in this code. -library UNISIM; -use UNISIM.VComponents.all; - -library work; -use work.zpu_config.all; -use work.zpupkg.all; - -entity fpga_top is -end fpga_top; - -architecture behave of fpga_top is - - -signal clk : std_logic; - -signal areset : std_logic; - - -component zpu_io is - generic ( - log_file: string := "log.txt" - ); - port( - clk : in std_logic; - areset : in std_logic; - busy : out std_logic; - writeEnable : in std_logic; - readEnable : in std_logic; - write : in std_logic_vector(wordSize-1 downto 0); - read : out std_logic_vector(wordSize-1 downto 0); - addr : in std_logic_vector(maxAddrBit downto minAddrBit) - ); -end component; - - - - - -signal mem_busy : std_logic; -signal mem_read : std_logic_vector(wordSize-1 downto 0); -signal mem_write : std_logic_vector(wordSize-1 downto 0); -signal mem_addr : std_logic_vector(maxAddrBitIncIO downto 0); -signal mem_writeEnable : std_logic; -signal mem_readEnable : std_logic; -signal mem_writeMask: std_logic_vector(wordBytes-1 downto 0); - -signal enable : std_logic; - -signal dram_mem_busy : std_logic; -signal dram_mem_read : std_logic_vector(wordSize-1 downto 0); -signal dram_mem_write : std_logic_vector(wordSize-1 downto 0); -signal dram_mem_writeEnable : std_logic; -signal dram_mem_readEnable : std_logic; -signal dram_mem_writeMask: std_logic_vector(wordBytes-1 downto 0); - - -signal io_busy : std_logic; - -signal io_mem_read : std_logic_vector(wordSize-1 downto 0); -signal io_mem_writeEnable : std_logic; -signal io_mem_readEnable : std_logic; - - -signal dram_ready : std_logic; -signal io_ready : std_logic; -signal io_reading : std_logic; - - -signal break : std_logic; - -begin - poweronreset: roc port map (O => areset); - - - - zpu: zpu_core port map ( - clk => clk , - areset => areset, - enable => enable, - in_mem_busy => mem_busy, - mem_read => mem_read, - mem_write => mem_write, - out_mem_addr => mem_addr, - out_mem_writeEnable => mem_writeEnable, - out_mem_readEnable => mem_readEnable, - mem_writeMask => mem_writeMask, - interrupt => '0', - break => break); - - dram_imp: dram port map ( - clk => clk , - areset => areset, - mem_busy => dram_mem_busy, - mem_read => dram_mem_read, - mem_write => mem_write, - mem_addr => mem_addr(maxAddrBit downto 0), - mem_writeEnable => dram_mem_writeEnable, - mem_readEnable => dram_mem_readEnable, - mem_writeMask => mem_writeMask); - - - ioMap: zpu_io port map ( - clk => clk, - areset => areset, - busy => io_busy, - writeEnable => io_mem_writeEnable, - readEnable => io_mem_readEnable, - write => mem_write(wordSize-1 downto 0), - read => io_mem_read, - addr => mem_addr(maxAddrBit downto minAddrBit) - ); - - dram_mem_writeEnable <= mem_writeEnable and not mem_addr(ioBit); - dram_mem_readEnable <= mem_readEnable and not mem_addr(ioBit); - io_mem_writeEnable <= mem_writeEnable and mem_addr(ioBit); - io_mem_readEnable <= mem_readEnable and mem_addr(ioBit); - mem_busy <= io_busy or dram_mem_busy or io_busy; - - - - -- Memory reads either come from IO or DRAM. We need to pick the right one. - memorycontrol: - process(dram_mem_read, dram_ready, io_ready, io_mem_read) - begin - mem_read <= (others => 'U'); - if dram_ready='1' then - mem_read <= dram_mem_read; - end if; - - if io_ready='1' then - mem_read <= io_mem_read; - end if; - end process; - - - io_ready <= (io_reading or io_mem_readEnable) and not io_busy; - - memoryControlSync: - process(clk, areset) - begin - if areset = '1' then - enable <= '0'; - io_reading <= '0'; - dram_ready <= '0'; - elsif (clk'event and clk = '1') then - enable <= '1'; - io_reading <= io_busy or io_mem_readEnable; - dram_ready<=dram_mem_readEnable; - - end if; - end process; - - -- wiggle the clock @ 100MHz - clock : PROCESS - begin - clk <= '0'; - wait for 5 ns; - clk <= '1'; - wait for 5 ns; - end PROCESS clock; - - -end behave; +-------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 20:15:31 04/14/05 +-- Design Name: +-- Module Name: fpga_top - behave +-- Project Name: +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +library UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.zpu_config.all; + +entity fpga_top is +end fpga_top; + +use work.zpupkg.all; + +architecture behave of fpga_top is + + +signal clk : std_logic; + +signal areset : std_logic; + + +component zpu_io is + generic ( + log_file: string := "log.txt" + ); + port( + clk : in std_logic; + areset : in std_logic; + busy : out std_logic; + writeEnable : in std_logic; + readEnable : in std_logic; + write : in std_logic_vector(wordSize-1 downto 0); + read : out std_logic_vector(wordSize-1 downto 0); + addr : in std_logic_vector(maxAddrBit downto minAddrBit) + ); +end component; + + + + + +signal mem_busy : std_logic; +signal mem_read : std_logic_vector(wordSize-1 downto 0); +signal mem_write : std_logic_vector(wordSize-1 downto 0); +signal mem_addr : std_logic_vector(maxAddrBitIncIO downto 0); +signal mem_writeEnable : std_logic; +signal mem_readEnable : std_logic; +signal mem_writeMask: std_logic_vector(wordBytes-1 downto 0); + +signal enable : std_logic; + +signal dram_mem_busy : std_logic; +signal dram_mem_read : std_logic_vector(wordSize-1 downto 0); +signal dram_mem_write : std_logic_vector(wordSize-1 downto 0); +signal dram_mem_writeEnable : std_logic; +signal dram_mem_readEnable : std_logic; +signal dram_mem_writeMask: std_logic_vector(wordBytes-1 downto 0); + + +signal io_busy : std_logic; + +signal io_mem_read : std_logic_vector(wordSize-1 downto 0); +signal io_mem_writeEnable : std_logic; +signal io_mem_readEnable : std_logic; + + +signal dram_ready : std_logic; +signal io_ready : std_logic; +signal io_reading : std_logic; + + +signal break : std_logic; + +begin + poweronreset: roc port map (O => areset); + + + + zpu: zpu_core port map ( + clk => clk , + areset => areset, + enable => enable, + in_mem_busy => mem_busy, + mem_read => mem_read, + mem_write => mem_write, + out_mem_addr => mem_addr, + out_mem_writeEnable => mem_writeEnable, + out_mem_readEnable => mem_readEnable, + mem_writeMask => mem_writeMask, + interrupt => '0', + break => break); + + dram_imp: dram port map ( + clk => clk , + areset => areset, + mem_busy => dram_mem_busy, + mem_read => dram_mem_read, + mem_write => mem_write, + mem_addr => mem_addr(maxAddrBit downto 0), + mem_writeEnable => dram_mem_writeEnable, + mem_readEnable => dram_mem_readEnable, + mem_writeMask => mem_writeMask); + + + ioMap: zpu_io port map ( + clk => clk, + areset => areset, + busy => io_busy, + writeEnable => io_mem_writeEnable, + readEnable => io_mem_readEnable, + write => mem_write(wordSize-1 downto 0), + read => io_mem_read, + addr => mem_addr(maxAddrBit downto minAddrBit) + ); + + dram_mem_writeEnable <= mem_writeEnable and not mem_addr(ioBit); + dram_mem_readEnable <= mem_readEnable and not mem_addr(ioBit); + io_mem_writeEnable <= mem_writeEnable and mem_addr(ioBit); + io_mem_readEnable <= mem_readEnable and mem_addr(ioBit); + mem_busy <= io_busy or dram_mem_busy or io_busy; + + + + -- Memory reads either come from IO or DRAM. We need to pick the right one. + memorycontrol: + process(dram_mem_read, dram_ready, io_ready, io_mem_read) + begin + mem_read <= (others => 'U'); + if dram_ready='1' then + mem_read <= dram_mem_read; + end if; + + if io_ready='1' then + mem_read <= io_mem_read; + end if; + end process; + + + io_ready <= (io_reading or io_mem_readEnable) and not io_busy; + + memoryControlSync: + process(clk, areset) + begin + if areset = '1' then + enable <= '0'; + io_reading <= '0'; + dram_ready <= '0'; + elsif (clk'event and clk = '1') then + enable <= '1'; + io_reading <= io_busy or io_mem_readEnable; + dram_ready<=dram_mem_readEnable; + + end if; + end process; + + -- wiggle the clock @ 100MHz + clock : PROCESS + begin + clk <= '0'; + wait for 5 ns; + clk <= '1'; + wait for 5 ns; + end PROCESS clock; + + +end behave; diff --git a/zpu/hdl/zpu4/src/sim_small_fpga_top.vhd b/zpu/hdl/zpu4/src/sim_small_fpga_top.vhd index b51fea0..5c05881 100644 --- a/zpu/hdl/zpu4/src/sim_small_fpga_top.vhd +++ b/zpu/hdl/zpu4/src/sim_small_fpga_top.vhd @@ -1,179 +1,177 @@ --------------------------------------------------------------------------------- --- Company: --- Engineer: --- --- Create Date: 20:15:31 04/14/05 --- Design Name: --- Module Name: fpga_top - behave --- Project Name: --- Target Device: --- Tool versions: --- Description: --- --- Dependencies: --- --- Revision: --- Revision 0.01 - File Created --- Additional Comments: --- --------------------------------------------------------------------------------- -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.STD_LOGIC_ARITH.ALL; -use IEEE.STD_LOGIC_UNSIGNED.ALL; - ----- Uncomment the following library declaration if instantiating ----- any Xilinx primitives in this code. -library UNISIM; -use UNISIM.VComponents.all; - -library work; -use work.zpu_config.all; -use work.zpupkg.all; - -entity fpga_top is -end fpga_top; - -architecture behave of fpga_top is - - -signal clk : std_logic; - -signal areset : std_logic; - - -component zpu_io is - generic ( - log_file: string := "log.txt" - ); - port( - clk : in std_logic; - areset : in std_logic; - busy : out std_logic; - writeEnable : in std_logic; - readEnable : in std_logic; - write : in std_logic_vector(wordSize-1 downto 0); - read : out std_logic_vector(wordSize-1 downto 0); - addr : in std_logic_vector(maxAddrBit downto minAddrBit) - ); -end component; - - - - - -signal mem_busy : std_logic; -signal mem_read : std_logic_vector(wordSize-1 downto 0); -signal mem_write : std_logic_vector(wordSize-1 downto 0); -signal mem_addr : std_logic_vector(maxAddrBitIncIO downto 0); -signal mem_writeEnable : std_logic; -signal mem_readEnable : std_logic; -signal mem_writeMask: std_logic_vector(wordBytes-1 downto 0); - -signal enable : std_logic; - -signal dram_mem_busy : std_logic; -signal dram_mem_read : std_logic_vector(wordSize-1 downto 0); -signal dram_mem_write : std_logic_vector(wordSize-1 downto 0); -signal dram_mem_writeEnable : std_logic; -signal dram_mem_readEnable : std_logic; -signal dram_mem_writeMask: std_logic_vector(wordBytes-1 downto 0); - - -signal io_busy : std_logic; - -signal io_mem_read : std_logic_vector(wordSize-1 downto 0); -signal io_mem_writeEnable : std_logic; -signal io_mem_readEnable : std_logic; - - -signal dram_ready : std_logic; -signal io_ready : std_logic; -signal io_reading : std_logic; - - -signal break : std_logic; - -begin - poweronreset: roc port map (O => areset); - - - - zpu: zpu_core port map ( - clk => clk , - areset => areset, - enable => enable, - in_mem_busy => mem_busy, - mem_read => mem_read, - mem_write => mem_write, - out_mem_addr => mem_addr, - out_mem_writeEnable => mem_writeEnable, - out_mem_readEnable => mem_readEnable, - mem_writeMask => mem_writeMask, - interrupt => '0', - break => break); - - - ioMap: zpu_io port map ( - clk => clk, - areset => areset, - busy => io_busy, - writeEnable => io_mem_writeEnable, - readEnable => io_mem_readEnable, - write => mem_write, - read => io_mem_read, - addr => mem_addr(maxAddrBit downto minAddrBit) - ); - - dram_mem_writeEnable <= mem_writeEnable and not mem_addr(ioBit); - dram_mem_readEnable <= mem_readEnable and not mem_addr(ioBit); - io_mem_writeEnable <= mem_writeEnable and mem_addr(ioBit); - io_mem_readEnable <= mem_readEnable and mem_addr(ioBit); - mem_busy <= io_busy; - - - - -- Memory reads either come from IO or DRAM. We need to pick the right one. - memorycontrol: - process(dram_mem_read, dram_ready, io_ready, io_mem_read) - begin - mem_read <= (others => 'U'); - if dram_ready='1' then - mem_read <= dram_mem_read; - end if; - - if io_ready='1' then - mem_read <= (others => '0'); - mem_read <= io_mem_read; - end if; - end process; - - - io_ready <= (io_reading or io_mem_readEnable) and not io_busy; - - memoryControlSync: - process(clk, areset) - begin - if areset = '1' then - enable <= '0'; - io_reading <= '0'; - dram_ready <= '0'; - elsif (clk'event and clk = '1') then - enable <= '1'; - io_reading <= io_busy or io_mem_readEnable; - dram_ready<=dram_mem_readEnable; - - end if; - end process; - - -- wiggle the clock @ 100MHz - clock : PROCESS - begin - clk <= '0'; - wait for 5 ns; - clk <= '1'; - wait for 5 ns; - end PROCESS clock; - - -end behave; +-------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 20:15:31 04/14/05 +-- Design Name: +-- Module Name: fpga_top - behave +-- Project Name: +-- Target Device: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +-------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +library UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; + +entity fpga_top is +end fpga_top; + +architecture behave of fpga_top is + + +signal clk : std_logic; + +signal areset : std_logic; + + +component zpu_io is + generic ( + log_file: string := "log.txt" + ); + port( + clk : in std_logic; + areset : in std_logic; + busy : out std_logic; + writeEnable : in std_logic; + readEnable : in std_logic; + write : in std_logic_vector(wordSize-1 downto 0); + read : out std_logic_vector(wordSize-1 downto 0); + addr : in std_logic_vector(maxAddrBit downto minAddrBit) + ); +end component; + + + + + +signal mem_busy : std_logic; +signal mem_read : std_logic_vector(wordSize-1 downto 0); +signal mem_write : std_logic_vector(wordSize-1 downto 0); +signal mem_addr : std_logic_vector(maxAddrBitIncIO downto 0); +signal mem_writeEnable : std_logic; +signal mem_readEnable : std_logic; +signal mem_writeMask: std_logic_vector(wordBytes-1 downto 0); + +signal enable : std_logic; + +signal dram_mem_busy : std_logic; +signal dram_mem_read : std_logic_vector(wordSize-1 downto 0); +signal dram_mem_write : std_logic_vector(wordSize-1 downto 0); +signal dram_mem_writeEnable : std_logic; +signal dram_mem_readEnable : std_logic; +signal dram_mem_writeMask: std_logic_vector(wordBytes-1 downto 0); + + +signal io_busy : std_logic; + +signal io_mem_read : std_logic_vector(wordSize-1 downto 0); +signal io_mem_writeEnable : std_logic; +signal io_mem_readEnable : std_logic; + + +signal dram_ready : std_logic; +signal io_ready : std_logic; +signal io_reading : std_logic; + + +signal break : std_logic; + +begin + poweronreset: roc port map (O => areset); + + + + zpu: zpu_core port map ( + clk => clk , + areset => areset, + enable => enable, + in_mem_busy => mem_busy, + mem_read => mem_read, + mem_write => mem_write, + out_mem_addr => mem_addr, + out_mem_writeEnable => mem_writeEnable, + out_mem_readEnable => mem_readEnable, + mem_writeMask => mem_writeMask, + interrupt => '0', + break => break); + + + ioMap: zpu_io port map ( + clk => clk, + areset => areset, + busy => io_busy, + writeEnable => io_mem_writeEnable, + readEnable => io_mem_readEnable, + write => mem_write, + read => io_mem_read, + addr => mem_addr(maxAddrBit downto minAddrBit) + ); + + dram_mem_writeEnable <= mem_writeEnable and not mem_addr(ioBit); + dram_mem_readEnable <= mem_readEnable and not mem_addr(ioBit); + io_mem_writeEnable <= mem_writeEnable and mem_addr(ioBit); + io_mem_readEnable <= mem_readEnable and mem_addr(ioBit); + mem_busy <= io_busy; + + + + -- Memory reads either come from IO or DRAM. We need to pick the right one. + memorycontrol: + process(dram_mem_read, dram_ready, io_ready, io_mem_read) + begin + mem_read <= (others => 'U'); + if dram_ready='1' then + mem_read <= dram_mem_read; + end if; + + if io_ready='1' then + mem_read <= (others => '0'); + mem_read <= io_mem_read; + end if; + end process; + + + io_ready <= (io_reading or io_mem_readEnable) and not io_busy; + + memoryControlSync: + process(clk, areset) + begin + if areset = '1' then + enable <= '0'; + io_reading <= '0'; + dram_ready <= '0'; + elsif (clk'event and clk = '1') then + enable <= '1'; + io_reading <= io_busy or io_mem_readEnable; + dram_ready<=dram_mem_readEnable; + + end if; + end process; + + -- wiggle the clock @ 100MHz + clock : PROCESS + begin + clk <= '0'; + wait for 5 ns; + clk <= '1'; + wait for 5 ns; + end PROCESS clock; + + +end behave; diff --git a/zpu/hdl/zpu4/src/simzpu_medium_ghdl.sh b/zpu/hdl/zpu4/src/simzpu_medium_ghdl.sh new file mode 100644 index 0000000..7a7f3df --- /dev/null +++ b/zpu/hdl/zpu4/src/simzpu_medium_ghdl.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +UNISIM_DIR="'location of GHDL objects for unisim library'/unisim_v93" +IMPORT_OPTIONS="--std=93 --ieee=synopsys --workdir=work -P${UNISIM_DIR}" +MAKE_OPTIONS="${IMPORT_OPTIONS} -Wl,-s -fexplicit --syn-binding" + +if test ! -e work; then + echo "Building work library..." + mkdir work + ghdl -i ${IMPORT_OPTIONS} zpu_config_trace.vhd + ghdl -i ${IMPORT_OPTIONS} zpupkg.vhd + ghdl -i ${IMPORT_OPTIONS} txt_util.vhd + ghdl -i ${IMPORT_OPTIONS} sim_fpga_top.vhd + ghdl -i ${IMPORT_OPTIONS} zpu_core.vhd + ghdl -i ${IMPORT_OPTIONS} dram_hello.vhd + ghdl -i ${IMPORT_OPTIONS} timer.vhd + ghdl -i ${IMPORT_OPTIONS} io.vhd + ghdl -i ${IMPORT_OPTIONS} trace.vhd +fi + +echo "Compiling design..." +if ghdl -m ${MAKE_OPTIONS} fpga_top; then + echo "Compilation finished, start simulation with" + echo " ./fpga_top --stop-time=1ms" +fi diff --git a/zpu/hdl/zpu4/src/timer.vhd b/zpu/hdl/zpu4/src/timer.vhd index 60c8fe2..be1dbb8 100644 --- a/zpu/hdl/zpu4/src/timer.vhd +++ b/zpu/hdl/zpu4/src/timer.vhd @@ -1,6 +1,6 @@ library ieee; use ieee.std_logic_1164.all; -use IEEE.STD_LOGIC_UNSIGNED.ALL; +use ieee.numeric_std.all; entity timer is port( @@ -19,7 +19,7 @@ signal sample : std_logic; signal reset : std_logic; -signal cnt : std_logic_vector(63 downto 0); +signal cnt : unsigned(63 downto 0); signal cnt_smp : std_logic_vector(63 downto 0); begin @@ -36,7 +36,7 @@ begin cnt <= cnt + 1; if sample = '1' then -- report "sampling" severity failure; - cnt_smp <= cnt; + cnt_smp <= std_logic_vector(cnt); end if; end if; end process; diff --git a/zpu/hdl/zpu4/src/trace.vhd b/zpu/hdl/zpu4/src/trace.vhd index bc5279f..e687aaf 100644 --- a/zpu/hdl/zpu4/src/trace.vhd +++ b/zpu/hdl/zpu4/src/trace.vhd @@ -1,7 +1,6 @@ library ieee; use ieee.std_logic_1164.all; ---use IEEE.STD_LOGIC_ARITH.ALL; -use IEEE.STD_LOGIC_UNSIGNED.ALL; +use ieee.numeric_std.all; use std.textio.all; @@ -45,7 +44,7 @@ receive_data: process variable l: line; variable t : std_logic_vector(wordSize-1 downto 0); variable t2 : std_logic_vector(maxAddrBitIncIO downto 0); -variable counter : std_logic_vector(63 downto 0); +variable counter : unsigned(63 downto 0); @@ -69,7 +68,7 @@ counter := (others => '0'); if begin_inst = '1' then t(maxAddrBitIncIO downto 2):=sp; t2:=pc; - print(l_file, "0x" & hstr(t2) & " 0x" & hstr(opcode) & " 0x" & hstr(t) & " 0x" & hstr(memA) & " 0x" & hstr(memB) & " 0x" & hstr(intSp) & " 0x" & hstr(counter)); + print(l_file, "0x" & hstr(t2) & " 0x" & hstr(opcode) & " 0x" & hstr(t) & " 0x" & hstr(memA) & " 0x" & hstr(memB) & " 0x" & hstr(intSp) & " 0x" & hstr(std_logic_vector(counter))); end if; wait until clk = '0'; diff --git a/zpu/hdl/zpu4/src/zpu_config_trace.vhd b/zpu/hdl/zpu4/src/zpu_config_trace.vhd index 4d0f15f..d765d9a 100644 --- a/zpu/hdl/zpu4/src/zpu_config_trace.vhd +++ b/zpu/hdl/zpu4/src/zpu_config_trace.vhd @@ -1,6 +1,5 @@ library ieee; use ieee.std_logic_1164.all; -use ieee.std_logic_unsigned.all; package zpu_config is diff --git a/zpu/hdl/zpu4/src/zpu_core.vhd b/zpu/hdl/zpu4/src/zpu_core.vhd index a603fe9..37fa2d1 100644 --- a/zpu/hdl/zpu4/src/zpu_core.vhd +++ b/zpu/hdl/zpu4/src/zpu_core.vhd @@ -1,898 +1,897 @@ - --- Company: ZPU4 generic memory interface CPU --- Engineer: Øyvind Harboe - -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.STD_LOGIC_UNSIGNED.ALL; -use IEEE.STD_LOGIC_arith.ALL; - -library work; -use work.zpu_config.all; -use work.zpupkg.all; - - --- mem_writeEnable - set to '1' for a single cycle to send off a write request. --- mem_write is valid only while mem_writeEnable='1'. --- mem_readEnable - set to '1' for a single cycle to send off a read request. --- --- mem_busy - It is illegal to send off a read/write request when mem_busy='1'. --- Set to '0' when mem_read is valid after a read request. --- If it goes to '1'(busy), it is on the cycle after mem_read/writeEnable --- is '1'. --- mem_addr - address for read/write request --- mem_read - read data. Valid only on the cycle after mem_busy='0' after --- mem_readEnable='1' for a single cycle. --- mem_write - data to write --- mem_writeMask - set to '1' for those bits that are to be written to memory upon --- write request --- break - set to '1' when CPU hits break instruction --- interrupt - set to '1' until interrupts are cleared by CPU. - - - - -entity zpu_core is - Port ( clk : in std_logic; - areset : in std_logic; - enable : in std_logic; - in_mem_busy : in std_logic; - mem_read : in std_logic_vector(wordSize-1 downto 0); - mem_write : out std_logic_vector(wordSize-1 downto 0); - out_mem_addr : out std_logic_vector(maxAddrBitIncIO downto 0); - out_mem_writeEnable : out std_logic; - out_mem_readEnable : out std_logic; - mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); - interrupt : in std_logic; - break : out std_logic); -end zpu_core; - -architecture behave of zpu_core is - -type InsnType is -( -State_AddTop, -State_Dup, -State_DupStackB, -State_Pop, -State_Popdown, -State_Add, -State_Or, -State_And, -State_Store, -State_AddSP, -State_Shift, -State_Nop, -State_Im, -State_LoadSP, -State_StoreSP, -State_Emulate, -State_Load, -State_PushPC, -State_PushSP, -State_PopPC, -State_PopPCRel, -State_Not, -State_Flip, -State_PopSP, -State_Neqbranch, -State_Eq, -State_Loadb, -State_Mult, -State_Lessthan, -State_Lessthanorequal, -State_Ulessthanorequal, -State_Ulessthan, -State_Pushspadd, -State_Call, -State_Callpcrel, -State_Sub, -State_Break, -State_Storeb, -State_InsnFetch -); - -type StateType is -( -State_Load2, -State_Popped, -State_LoadSP2, -State_LoadSP3, -State_AddSP2, -State_Fetch, -State_Execute, -State_Decode, -State_Decode2, -State_Resync, - -State_StoreSP2, -State_Resync2, -State_Resync3, -State_Loadb2, -State_Storeb2, -State_Mult2, -State_Mult3, -State_Mult5, -State_Mult4, -State_BinaryOpResult2, -State_BinaryOpResult, -State_Idle -); - - -signal pc : std_logic_vector(maxAddrBitIncIO downto 0); -signal sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal incSp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal incIncSp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal decSp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal stackA : std_logic_vector(wordSize-1 downto 0); -signal binaryOpResult : std_logic_vector(wordSize-1 downto 0); -signal binaryOpResult2 : std_logic_vector(wordSize-1 downto 0); -signal multResult2 : std_logic_vector(wordSize-1 downto 0); -signal multResult3 : std_logic_vector(wordSize-1 downto 0); -signal multResult : std_logic_vector(wordSize-1 downto 0); -signal multA : std_logic_vector(wordSize-1 downto 0); -signal multB : std_logic_vector(wordSize-1 downto 0); -signal stackB : std_logic_vector(wordSize-1 downto 0); -signal idim_flag : std_logic; -signal busy : std_logic; -signal mem_writeEnable : std_logic; -signal mem_readEnable : std_logic; -signal mem_addr : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal mem_delayAddr : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal mem_delayReadEnable : std_logic; - -signal decodeWord : std_logic_vector(wordSize-1 downto 0); - - -signal state : StateType; -signal insn : InsnType; -type InsnArray is array(0 to wordBytes-1) of InsnType; -signal decodedOpcode : InsnArray; - -type OpcodeArray is array(0 to wordBytes-1) of std_logic_vector(7 downto 0); - -signal opcode : OpcodeArray; - - - - -signal begin_inst : std_logic; -signal trace_opcode : std_logic_vector(7 downto 0); -signal trace_pc : std_logic_vector(maxAddrBitIncIO downto 0); -signal trace_sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal trace_topOfStack : std_logic_vector(wordSize-1 downto 0); -signal trace_topOfStackB : std_logic_vector(wordSize-1 downto 0); - --- state machine. - -begin - - - traceFileGenerate: - if Generate_Trace generate - trace_file: trace port map ( - clk => clk, - begin_inst => begin_inst, - pc => trace_pc, - opcode => trace_opcode, - sp => trace_sp, - memA => trace_topOfStack, - memB => trace_topOfStackB, - busy => busy, - intsp => (others => 'U') - ); - end generate; - - - -- the memory subsystem will tell us one cycle later whether or - -- not it is busy - out_mem_writeEnable <= mem_writeEnable; - out_mem_readEnable <= mem_readEnable; - out_mem_addr(maxAddrBitIncIO downto minAddrBit) <= mem_addr; - out_mem_addr(minAddrBit-1 downto 0) <= (others => '0'); - - incSp <= sp + 1; - incIncSp <= sp + 2; - decSp <= sp - 1; - - - opcodeControl: - process(clk, areset) - variable tOpcode : std_logic_vector(OpCode_Size-1 downto 0); - variable spOffset : std_logic_vector(4 downto 0); - variable tSpOffset : std_logic_vector(4 downto 0); - variable nextPC : std_logic_vector(maxAddrBitIncIO downto 0); - variable tNextState : InsnType; - variable tDecodedOpcode : InsnArray; - variable tMultResult : std_logic_vector(wordSize*2-1 downto 0); - begin - if areset = '1' then - state <= State_Idle; - break <= '0'; - sp <= spStart(maxAddrBitIncIO downto minAddrBit); - - pc <= (others => '0'); - idim_flag <= '0'; - begin_inst <= '0'; - mem_writeEnable <= '0'; - mem_readEnable <= '0'; - multA <= (others => '0'); - multB <= (others => '0'); - mem_writeMask <= (others => '1'); - elsif (clk'event and clk = '1') then - -- we must multiply unconditionally to get pipelined multiplication - tMultResult := multA * multB; - multResult3 <= multResult2; - multResult2 <= multResult; - multResult <= tMultResult(wordSize-1 downto 0); - - - binaryOpResult2 <= binaryOpResult; -- pipeline a bit. - - - multA <= (others => DontCareValue); - multB <= (others => DontCareValue); - - - mem_addr <= (others => DontCareValue); - mem_readEnable <='0'; - mem_writeEnable <='0'; - mem_write <= (others => DontCareValue); - - if (mem_writeEnable = '1') and (mem_readEnable = '1') then - report "read/write collision" severity failure; - end if; - - - - - spOffset(4):=not opcode(conv_integer(pc(byteBits-1 downto 0)))(4); - spOffset(3 downto 0):=opcode(conv_integer(pc(byteBits-1 downto 0)))(3 downto 0); - nextPC := pc + 1; - - -- prepare trace snapshot - trace_opcode <= opcode(conv_integer(pc(byteBits-1 downto 0))); - trace_pc <= pc; - trace_sp <= sp; - trace_topOfStack <= stackA; - trace_topOfStackB <= stackB; - begin_inst <= '0'; - - - case state is - when State_Idle => - if enable='1' then - state <= State_Resync; - end if; - -- Initial state of ZPU, fetch top of stack + first instruction - when State_Resync => - if in_mem_busy='0' then - mem_addr <= sp; - mem_readEnable <= '1'; - state <= State_Resync2; - end if; - when State_Resync2 => - if in_mem_busy='0' then - stackA <= mem_read; - mem_addr <= incSp; - mem_readEnable <= '1'; - state <= State_Resync3; - end if; - when State_Resync3 => - if in_mem_busy='0' then - stackB <= mem_read; - mem_addr <= pc(maxAddrBitIncIO downto minAddrBit); - mem_readEnable <= '1'; - state <= State_Decode; - end if; - when State_Decode => - if in_mem_busy='0' then - decodeWord <= mem_read; - state <= State_Decode2; - end if; - when State_Decode2 => - -- decode 4 instructions in parallel - for i in 0 to wordBytes-1 loop - tOpcode := decodeWord((wordBytes-1-i+1)*8-1 downto (wordBytes-1-i)*8); - - tSpOffset(4):=not tOpcode(4); - tSpOffset(3 downto 0):=tOpcode(3 downto 0); - - opcode(i) <= tOpcode; - if (tOpcode(7 downto 7)=OpCode_Im) then - tNextState:=State_Im; - elsif (tOpcode(7 downto 5)=OpCode_StoreSP) then - if tSpOffset = 0 then - tNextState := State_Pop; - elsif tSpOffset=1 then - tNextState := State_PopDown; - else - tNextState :=State_StoreSP; - end if; - elsif (tOpcode(7 downto 5)=OpCode_LoadSP) then - if tSpOffset = 0 then - tNextState :=State_Dup; - elsif tSpOffset = 1 then - tNextState :=State_DupStackB; - else - tNextState :=State_LoadSP; - end if; - elsif (tOpcode(7 downto 5)=OpCode_Emulate) then - tNextState :=State_Emulate; - if tOpcode(5 downto 0)=OpCode_Neqbranch then - tNextState :=State_Neqbranch; - elsif tOpcode(5 downto 0)=OpCode_Eq then - tNextState :=State_Eq; - elsif tOpcode(5 downto 0)=OpCode_Lessthan then - tNextState :=State_Lessthan; - elsif tOpcode(5 downto 0)=OpCode_Lessthanorequal then - --tNextState :=State_Lessthanorequal; - elsif tOpcode(5 downto 0)=OpCode_Ulessthan then - tNextState :=State_Ulessthan; - elsif tOpcode(5 downto 0)=OpCode_Ulessthanorequal then - --tNextState :=State_Ulessthanorequal; - elsif tOpcode(5 downto 0)=OpCode_Loadb then - tNextState :=State_Loadb; - elsif tOpcode(5 downto 0)=OpCode_Mult then - tNextState :=State_Mult; - elsif tOpcode(5 downto 0)=OpCode_Storeb then - tNextState :=State_Storeb; - elsif tOpcode(5 downto 0)=OpCode_Pushspadd then - tNextState :=State_Pushspadd; - elsif tOpcode(5 downto 0)=OpCode_Callpcrel then - tNextState :=State_Callpcrel; - elsif tOpcode(5 downto 0)=OpCode_Call then - --tNextState :=State_Call; - elsif tOpcode(5 downto 0)=OpCode_Sub then - tNextState :=State_Sub; - elsif tOpcode(5 downto 0)=OpCode_PopPCRel then - --tNextState :=State_PopPCRel; - end if; - elsif (tOpcode(7 downto 4)=OpCode_AddSP) then - if tSpOffset = 0 then - tNextState := State_Shift; - elsif tSpOffset = 1 then - tNextState := State_AddTop; - else - tNextState :=State_AddSP; - end if; - else - case tOpcode(3 downto 0) is - when OpCode_Nop => - tNextState :=State_Nop; - when OpCode_PushSP => - tNextState :=State_PushSP; - when OpCode_PopPC => - tNextState :=State_PopPC; - when OpCode_Add => - tNextState :=State_Add; - when OpCode_Or => - tNextState :=State_Or; - when OpCode_And => - tNextState :=State_And; - when OpCode_Load => - tNextState :=State_Load; - when OpCode_Not => - tNextState :=State_Not; - when OpCode_Flip => - tNextState :=State_Flip; - when OpCode_Store => - tNextState :=State_Store; - when OpCode_PopSP => - tNextState :=State_PopSP; - when others => - tNextState := State_Break; - - end case; - end if; - tDecodedOpcode(i) := tNextState; - - end loop; - - insn <= tDecodedOpcode(conv_integer(pc(byteBits-1 downto 0))); - - -- once we wrap, we need to fetch - tDecodedOpcode(0) := State_InsnFetch; - - decodedOpcode <= tDecodedOpcode; - state <= State_Execute; - - - - -- Each instruction must: - -- - -- 1. set idim_flag - -- 2. increase pc if applicable - -- 3. set next state if appliable - -- 4. do it's operation - - when State_Execute => - insn <= decodedOpcode(conv_integer(nextPC(byteBits-1 downto 0))); - - case insn is - when State_InsnFetch => - state <= State_Fetch; - when State_Im => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '1'; - pc <= pc + 1; - - if idim_flag='1' then - stackA(wordSize-1 downto 7) <= stackA(wordSize-8 downto 0); - stackA(6 downto 0) <= opcode(conv_integer(pc(byteBits-1 downto 0)))(6 downto 0); - else - mem_writeEnable <= '1'; - mem_addr <= incSp; - mem_write <= stackB; - stackB <= stackA; - sp <= decSp; - for i in wordSize-1 downto 7 loop - stackA(i) <= opcode(conv_integer(pc(byteBits-1 downto 0)))(6); - end loop; - stackA(6 downto 0) <= opcode(conv_integer(pc(byteBits-1 downto 0)))(6 downto 0); - end if; - end if; - when State_StoreSP => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_StoreSP2; - - mem_writeEnable <= '1'; - mem_addr <= sp+spOffset; - mem_write <= stackA; - stackA <= stackB; - sp <= incSp; - end if; - - - when State_LoadSP => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_LoadSP2; - - sp <= decSp; - mem_writeEnable <= '1'; - mem_addr <= incSp; - mem_write <= stackB; - end if; - when State_Emulate => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - sp <= decSp; - mem_writeEnable <= '1'; - mem_addr <= incSp; - mem_write <= stackB; - stackA <= (others => DontCareValue); - stackA(maxAddrBitIncIO downto 0) <= pc + 1; - stackB <= stackA; - - -- The emulate address is: - -- 98 7654 3210 - -- 0000 00aa aaa0 0000 - pc <= (others => '0'); - pc(9 downto 5) <= opcode(conv_integer(pc(byteBits-1 downto 0)))(4 downto 0); - state <= State_Fetch; - end if; - when State_Callpcrel => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - stackA <= (others => DontCareValue); - stackA(maxAddrBitIncIO downto 0) <= pc + 1; - - pc <= pc + stackA(maxAddrBitIncIO downto 0); - state <= State_Fetch; - end if; - when State_Call => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - stackA <= (others => DontCareValue); - stackA(maxAddrBitIncIO downto 0) <= pc + 1; - pc <= stackA(maxAddrBitIncIO downto 0); - state <= State_Fetch; - end if; - when State_AddSP => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_AddSP2; - - mem_readEnable <= '1'; - mem_addr <= sp+spOffset; - end if; - when State_PushSP => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - sp <= decSp; - stackA <= (others => '0'); - stackA(maxAddrBitIncIO downto minAddrBit) <= sp; - stackB <= stackA; - mem_writeEnable <= '1'; - mem_addr <= incSp; - mem_write <= stackB; - end if; - when State_PopPC => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= stackA(maxAddrBitIncIO downto 0); - sp <= incSp; - - mem_writeEnable <= '1'; - mem_addr <= incSp; - mem_write <= stackB; - state <= State_Resync; - end if; - when State_PopPCRel => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= stackA(maxAddrBitIncIO downto 0) + pc; - sp <= incSp; - - mem_writeEnable <= '1'; - mem_addr <= incSp; - mem_write <= stackB; - state <= State_Resync; - end if; - when State_Add => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - stackA <= stackA + stackB; - - mem_readEnable <= '1'; - mem_addr <= incIncSp; - sp <= incSp; - state <= State_Popped; - end if; - when State_Sub => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - binaryOpResult <= stackB - stackA; - state <= State_BinaryOpResult; - end if; - when State_Pop => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - mem_addr <= incIncSp; - mem_readEnable <= '1'; - sp <= incSp; - stackA <= stackB; - state <= State_Popped; - end if; - when State_PopDown => - if in_mem_busy='0' then - -- PopDown leaves top of stack unchanged - begin_inst <= '1'; - idim_flag <= '0'; - mem_addr <= incIncSp; - mem_readEnable <= '1'; - sp <= incSp; - state <= State_Popped; - end if; - when State_Or => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - stackA <= stackA or stackB; - mem_readEnable <= '1'; - mem_addr <= incIncSp; - sp <= incSp; - state <= State_Popped; - end if; - when State_And => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - - stackA <= stackA and stackB; - mem_readEnable <= '1'; - mem_addr <= incIncSp; - sp <= incSp; - state <= State_Popped; - end if; - when State_Eq => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - - binaryOpResult <= (others => '0'); - if (stackA=stackB) then - binaryOpResult(0) <= '1'; - end if; - state <= State_BinaryOpResult; - end if; - when State_Ulessthan => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - - binaryOpResult <= (others => '0'); - if (stackA - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - - binaryOpResult <= (others => '0'); - if (stackA<=stackB) then - binaryOpResult(0) <= '1'; - end if; - state <= State_BinaryOpResult; - end if; - when State_Lessthan => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - - binaryOpResult <= (others => '0'); - if (signed(stackA) - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - - binaryOpResult <= (others => '0'); - if (signed(stackA)<=signed(stackB)) then - binaryOpResult(0) <= '1'; - end if; - state <= State_BinaryOpResult; - end if; - when State_Load => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_Load2; - - mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); - mem_readEnable <= '1'; - end if; - - when State_Dup => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - sp <= decSp; - stackB <= stackA; - mem_write <= stackB; - mem_addr <= incSp; - mem_writeEnable <= '1'; - end if; - when State_DupStackB => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - sp <= decSp; - stackA <= stackB; - stackB <= stackA; - mem_write <= stackB; - mem_addr <= incSp; - mem_writeEnable <= '1'; - end if; - when State_Store => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); - mem_write <= stackB; - mem_writeEnable <= '1'; - sp <= incIncSp; - state <= State_Resync; - end if; - when State_PopSP => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - mem_write <= stackB; - mem_addr <= incSp; - mem_writeEnable <= '1'; - sp <= stackA(maxAddrBitIncIO downto minAddrBit); - state <= State_Resync; - end if; - when State_Nop => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - when State_Not => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - stackA <= not stackA; - when State_Flip => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - for i in 0 to wordSize-1 loop - stackA(i) <= stackA(wordSize-1-i); - end loop; - when State_AddTop => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - stackA <= stackA + stackB; - when State_Shift => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - stackA(wordSize-1 downto 1) <= stackA(wordSize-2 downto 0); - stackA(0) <= '0'; - when State_Pushspadd => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - stackA <= (others => '0'); - stackA(maxAddrBitIncIO downto minAddrBit) <= stackA(maxAddrBitIncIO-minAddrBit downto 0)+sp; - when State_Neqbranch => - -- branches are almost always taken as they form loops - begin_inst <= '1'; - idim_flag <= '0'; - sp <= incIncSp; - if (stackB/=0) then - pc <= stackA(maxAddrBitIncIO downto 0) + pc; - else - pc <= pc + 1; - end if; - -- need to fetch stack again. - state <= State_Resync; - when State_Mult => - begin_inst <= '1'; - idim_flag <= '0'; - - multA <= stackA; - multB <= stackB; - state <= State_Mult2; - when State_Break => - report "Break instruction encountered" severity failure; - break <= '1'; - - when State_Loadb => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_Loadb2; - - mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); - mem_readEnable <= '1'; - end if; - when State_Storeb => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_Storeb2; - - mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); - mem_readEnable <= '1'; - end if; - - when others => - sp <= (others => DontCareValue); - report "Illegal instruction" severity failure; - break <= '1'; - end case; - - - when State_StoreSP2 => - if in_mem_busy='0' then - mem_addr <= incSp; - mem_readEnable <= '1'; - state <= State_Popped; - end if; - when State_LoadSP2 => - if in_mem_busy='0' then - state <= State_LoadSP3; - mem_readEnable <= '1'; - mem_addr <= sp+spOffset+1; - end if; - when State_LoadSP3 => - if in_mem_busy='0' then - pc <= pc + 1; - state <= State_Execute; - stackB <= stackA; - stackA <= mem_read; - end if; - when State_AddSP2 => - if in_mem_busy='0' then - pc <= pc + 1; - state <= State_Execute; - stackA <= stackA + mem_read; - end if; - when State_Load2 => - if in_mem_busy='0' then - stackA <= mem_read; - pc <= pc + 1; - state <= State_Execute; - end if; - when State_Loadb2 => - if in_mem_busy='0' then - stackA <= (others => '0'); - stackA(7 downto 0) <= mem_read(((wordBytes-1-conv_integer(stackA(byteBits-1 downto 0)))*8+7) downto (wordBytes-1-conv_integer(stackA(byteBits-1 downto 0)))*8); - pc <= pc + 1; - state <= State_Execute; - end if; - when State_Storeb2 => - if in_mem_busy='0' then - mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); - mem_write <= mem_read; - mem_write(((wordBytes-1-conv_integer(stackA(byteBits-1 downto 0)))*8+7) downto (wordBytes-1-conv_integer(stackA(byteBits-1 downto 0)))*8) <= stackB(7 downto 0) ; - mem_writeEnable <= '1'; - pc <= pc + 1; - sp <= incIncSp; - state <= State_Resync; - end if; - when State_Fetch => - if in_mem_busy='0' then - mem_addr <= pc(maxAddrBitIncIO downto minAddrBit); - mem_readEnable <= '1'; - state <= State_Decode; - end if; - when State_Mult2 => - state <= State_Mult3; - when State_Mult3 => - state <= State_Mult4; - when State_Mult4 => - state <= State_Mult5; - when State_Mult5 => - if in_mem_busy='0' then - stackA <= multResult3; - mem_readEnable <= '1'; - mem_addr <= incIncSp; - sp <= incSp; - state <= State_Popped; - end if; - when State_BinaryOpResult => - state <= State_BinaryOpResult2; - when State_BinaryOpResult2 => - mem_readEnable <= '1'; - mem_addr <= incIncSp; - sp <= incSp; - stackA <= binaryOpResult2; - state <= State_Popped; - when State_Popped => - if in_mem_busy='0' then - pc <= pc + 1; - stackB <= mem_read; - state <= State_Execute; - end if; - when others => - sp <= (others => DontCareValue); - report "Illegal state" severity failure; - break <= '1'; - end case; - end if; - end process; - - - -end behave; + +-- Company: ZPU4 generic memory interface CPU +-- Engineer: Øyvind Harboe + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use ieee.numeric_std.all; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; + + +-- mem_writeEnable - set to '1' for a single cycle to send off a write request. +-- mem_write is valid only while mem_writeEnable='1'. +-- mem_readEnable - set to '1' for a single cycle to send off a read request. +-- +-- mem_busy - It is illegal to send off a read/write request when mem_busy='1'. +-- Set to '0' when mem_read is valid after a read request. +-- If it goes to '1'(busy), it is on the cycle after mem_read/writeEnable +-- is '1'. +-- mem_addr - address for read/write request +-- mem_read - read data. Valid only on the cycle after mem_busy='0' after +-- mem_readEnable='1' for a single cycle. +-- mem_write - data to write +-- mem_writeMask - set to '1' for those bits that are to be written to memory upon +-- write request +-- break - set to '1' when CPU hits break instruction +-- interrupt - set to '1' until interrupts are cleared by CPU. + + + + +entity zpu_core is + Port ( clk : in std_logic; + areset : in std_logic; + enable : in std_logic; + in_mem_busy : in std_logic; + mem_read : in std_logic_vector(wordSize-1 downto 0); + mem_write : out std_logic_vector(wordSize-1 downto 0); + out_mem_addr : out std_logic_vector(maxAddrBitIncIO downto 0); + out_mem_writeEnable : out std_logic; + out_mem_readEnable : out std_logic; + mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); + interrupt : in std_logic; + break : out std_logic); +end zpu_core; + +architecture behave of zpu_core is + +type InsnType is +( +State_AddTop, +State_Dup, +State_DupStackB, +State_Pop, +State_Popdown, +State_Add, +State_Or, +State_And, +State_Store, +State_AddSP, +State_Shift, +State_Nop, +State_Im, +State_LoadSP, +State_StoreSP, +State_Emulate, +State_Load, +State_PushPC, +State_PushSP, +State_PopPC, +State_PopPCRel, +State_Not, +State_Flip, +State_PopSP, +State_Neqbranch, +State_Eq, +State_Loadb, +State_Mult, +State_Lessthan, +State_Lessthanorequal, +State_Ulessthanorequal, +State_Ulessthan, +State_Pushspadd, +State_Call, +State_Callpcrel, +State_Sub, +State_Break, +State_Storeb, +State_InsnFetch +); + +type StateType is +( +State_Load2, +State_Popped, +State_LoadSP2, +State_LoadSP3, +State_AddSP2, +State_Fetch, +State_Execute, +State_Decode, +State_Decode2, +State_Resync, + +State_StoreSP2, +State_Resync2, +State_Resync3, +State_Loadb2, +State_Storeb2, +State_Mult2, +State_Mult3, +State_Mult5, +State_Mult4, +State_BinaryOpResult2, +State_BinaryOpResult, +State_Idle +); + + +signal pc : unsigned(maxAddrBitIncIO downto 0); +signal sp : unsigned(maxAddrBitIncIO downto minAddrBit); +signal incSp : unsigned(maxAddrBitIncIO downto minAddrBit); +signal incIncSp : unsigned(maxAddrBitIncIO downto minAddrBit); +signal decSp : unsigned(maxAddrBitIncIO downto minAddrBit); +signal stackA : unsigned(wordSize-1 downto 0); +signal binaryOpResult : unsigned(wordSize-1 downto 0); +signal binaryOpResult2 : unsigned(wordSize-1 downto 0); +signal multResult2 : unsigned(wordSize-1 downto 0); +signal multResult3 : unsigned(wordSize-1 downto 0); +signal multResult : unsigned(wordSize-1 downto 0); +signal multA : unsigned(wordSize-1 downto 0); +signal multB : unsigned(wordSize-1 downto 0); +signal stackB : unsigned(wordSize-1 downto 0); +signal idim_flag : std_logic; +signal busy : std_logic; +signal mem_writeEnable : std_logic; +signal mem_readEnable : std_logic; +signal mem_addr : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal mem_delayAddr : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal mem_delayReadEnable : std_logic; + +signal decodeWord : std_logic_vector(wordSize-1 downto 0); + + +signal state : StateType; +signal insn : InsnType; +type InsnArray is array(0 to wordBytes-1) of InsnType; +signal decodedOpcode : InsnArray; + +type OpcodeArray is array(0 to wordBytes-1) of std_logic_vector(7 downto 0); + +signal opcode : OpcodeArray; + + + + +signal begin_inst : std_logic; +signal trace_opcode : std_logic_vector(7 downto 0); +signal trace_pc : std_logic_vector(maxAddrBitIncIO downto 0); +signal trace_sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal trace_topOfStack : std_logic_vector(wordSize-1 downto 0); +signal trace_topOfStackB : std_logic_vector(wordSize-1 downto 0); + +-- state machine. + +begin + + + traceFileGenerate: + if Generate_Trace generate + trace_file: trace port map ( + clk => clk, + begin_inst => begin_inst, + pc => trace_pc, + opcode => trace_opcode, + sp => trace_sp, + memA => trace_topOfStack, + memB => trace_topOfStackB, + busy => busy, + intsp => (others => 'U') + ); + end generate; + + + -- the memory subsystem will tell us one cycle later whether or + -- not it is busy + out_mem_writeEnable <= mem_writeEnable; + out_mem_readEnable <= mem_readEnable; + out_mem_addr(maxAddrBitIncIO downto minAddrBit) <= mem_addr; + out_mem_addr(minAddrBit-1 downto 0) <= (others => '0'); + + incSp <= sp + 1; + incIncSp <= sp + 2; + decSp <= sp - 1; + + + opcodeControl: + process(clk, areset) + variable tOpcode : std_logic_vector(OpCode_Size-1 downto 0); + variable spOffset : unsigned(4 downto 0); + variable tSpOffset : unsigned(4 downto 0); + variable nextPC : unsigned(maxAddrBitIncIO downto 0); + variable tNextState : InsnType; + variable tDecodedOpcode : InsnArray; + variable tMultResult : unsigned(wordSize*2-1 downto 0); + begin + if areset = '1' then + state <= State_Idle; + break <= '0'; + sp <= unsigned(spStart(maxAddrBitIncIO downto minAddrBit)); + + pc <= (others => '0'); + idim_flag <= '0'; + begin_inst <= '0'; + mem_writeEnable <= '0'; + mem_readEnable <= '0'; + multA <= (others => '0'); + multB <= (others => '0'); + mem_writeMask <= (others => '1'); + elsif (clk'event and clk = '1') then + -- we must multiply unconditionally to get pipelined multiplication + tMultResult := multA * multB; + multResult3 <= multResult2; + multResult2 <= multResult; + multResult <= tMultResult(wordSize-1 downto 0); + + + binaryOpResult2 <= binaryOpResult; -- pipeline a bit. + + + multA <= (others => DontCareValue); + multB <= (others => DontCareValue); + + + mem_addr <= (others => DontCareValue); + mem_readEnable <='0'; + mem_writeEnable <='0'; + mem_write <= (others => DontCareValue); + + if (mem_writeEnable = '1') and (mem_readEnable = '1') then + report "read/write collision" severity failure; + end if; + + + + + spOffset(4):=not opcode(to_integer(pc(byteBits-1 downto 0)))(4); + spOffset(3 downto 0):=unsigned(opcode(to_integer(pc(byteBits-1 downto 0)))(3 downto 0)); + nextPC := pc + 1; + + -- prepare trace snapshot + trace_opcode <= opcode(to_integer(pc(byteBits-1 downto 0))); + trace_pc <= std_logic_vector(pc); + trace_sp <= std_logic_vector(sp); + trace_topOfStack <= std_logic_vector(stackA); + trace_topOfStackB <= std_logic_vector(stackB); + begin_inst <= '0'; + + + case state is + when State_Idle => + if enable='1' then + state <= State_Resync; + end if; + -- Initial state of ZPU, fetch top of stack + first instruction + when State_Resync => + if in_mem_busy='0' then + mem_addr <= std_logic_vector(sp); + mem_readEnable <= '1'; + state <= State_Resync2; + end if; + when State_Resync2 => + if in_mem_busy='0' then + stackA <= unsigned(mem_read); + mem_addr <= std_logic_vector(incSp); + mem_readEnable <= '1'; + state <= State_Resync3; + end if; + when State_Resync3 => + if in_mem_busy='0' then + stackB <= unsigned(mem_read); + mem_addr <= std_logic_vector(pc(maxAddrBitIncIO downto minAddrBit)); + mem_readEnable <= '1'; + state <= State_Decode; + end if; + when State_Decode => + if in_mem_busy='0' then + decodeWord <= mem_read; + state <= State_Decode2; + end if; + when State_Decode2 => + -- decode 4 instructions in parallel + for i in 0 to wordBytes-1 loop + tOpcode := decodeWord((wordBytes-1-i+1)*8-1 downto (wordBytes-1-i)*8); + + tSpOffset(4):=not tOpcode(4); + tSpOffset(3 downto 0):=unsigned(tOpcode(3 downto 0)); + + opcode(i) <= tOpcode; + if (tOpcode(7 downto 7)=OpCode_Im) then + tNextState:=State_Im; + elsif (tOpcode(7 downto 5)=OpCode_StoreSP) then + if tSpOffset = 0 then + tNextState := State_Pop; + elsif tSpOffset=1 then + tNextState := State_PopDown; + else + tNextState :=State_StoreSP; + end if; + elsif (tOpcode(7 downto 5)=OpCode_LoadSP) then + if tSpOffset = 0 then + tNextState :=State_Dup; + elsif tSpOffset = 1 then + tNextState :=State_DupStackB; + else + tNextState :=State_LoadSP; + end if; + elsif (tOpcode(7 downto 5)=OpCode_Emulate) then + tNextState :=State_Emulate; + if tOpcode(5 downto 0)=OpCode_Neqbranch then + tNextState :=State_Neqbranch; + elsif tOpcode(5 downto 0)=OpCode_Eq then + tNextState :=State_Eq; + elsif tOpcode(5 downto 0)=OpCode_Lessthan then + tNextState :=State_Lessthan; + elsif tOpcode(5 downto 0)=OpCode_Lessthanorequal then + --tNextState :=State_Lessthanorequal; + elsif tOpcode(5 downto 0)=OpCode_Ulessthan then + tNextState :=State_Ulessthan; + elsif tOpcode(5 downto 0)=OpCode_Ulessthanorequal then + --tNextState :=State_Ulessthanorequal; + elsif tOpcode(5 downto 0)=OpCode_Loadb then + tNextState :=State_Loadb; + elsif tOpcode(5 downto 0)=OpCode_Mult then + tNextState :=State_Mult; + elsif tOpcode(5 downto 0)=OpCode_Storeb then + tNextState :=State_Storeb; + elsif tOpcode(5 downto 0)=OpCode_Pushspadd then + tNextState :=State_Pushspadd; + elsif tOpcode(5 downto 0)=OpCode_Callpcrel then + tNextState :=State_Callpcrel; + elsif tOpcode(5 downto 0)=OpCode_Call then + --tNextState :=State_Call; + elsif tOpcode(5 downto 0)=OpCode_Sub then + tNextState :=State_Sub; + elsif tOpcode(5 downto 0)=OpCode_PopPCRel then + --tNextState :=State_PopPCRel; + end if; + elsif (tOpcode(7 downto 4)=OpCode_AddSP) then + if tSpOffset = 0 then + tNextState := State_Shift; + elsif tSpOffset = 1 then + tNextState := State_AddTop; + else + tNextState :=State_AddSP; + end if; + else + case tOpcode(3 downto 0) is + when OpCode_Nop => + tNextState :=State_Nop; + when OpCode_PushSP => + tNextState :=State_PushSP; + when OpCode_PopPC => + tNextState :=State_PopPC; + when OpCode_Add => + tNextState :=State_Add; + when OpCode_Or => + tNextState :=State_Or; + when OpCode_And => + tNextState :=State_And; + when OpCode_Load => + tNextState :=State_Load; + when OpCode_Not => + tNextState :=State_Not; + when OpCode_Flip => + tNextState :=State_Flip; + when OpCode_Store => + tNextState :=State_Store; + when OpCode_PopSP => + tNextState :=State_PopSP; + when others => + tNextState := State_Break; + + end case; + end if; + tDecodedOpcode(i) := tNextState; + + end loop; + + insn <= tDecodedOpcode(to_integer(pc(byteBits-1 downto 0))); + + -- once we wrap, we need to fetch + tDecodedOpcode(0) := State_InsnFetch; + + decodedOpcode <= tDecodedOpcode; + state <= State_Execute; + + + + -- Each instruction must: + -- + -- 1. set idim_flag + -- 2. increase pc if applicable + -- 3. set next state if appliable + -- 4. do it's operation + + when State_Execute => + insn <= decodedOpcode(to_integer(nextPC(byteBits-1 downto 0))); + + case insn is + when State_InsnFetch => + state <= State_Fetch; + when State_Im => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '1'; + pc <= pc + 1; + + if idim_flag='1' then + stackA(wordSize-1 downto 7) <= stackA(wordSize-8 downto 0); + stackA(6 downto 0) <= unsigned(opcode(to_integer(pc(byteBits-1 downto 0)))(6 downto 0)); + else + mem_writeEnable <= '1'; + mem_addr <= std_logic_vector(incSp); + mem_write <= std_logic_vector(stackB); + stackB <= stackA; + sp <= decSp; + for i in wordSize-1 downto 7 loop + stackA(i) <= opcode(to_integer(pc(byteBits-1 downto 0)))(6); + end loop; + stackA(6 downto 0) <= unsigned(opcode(to_integer(pc(byteBits-1 downto 0)))(6 downto 0)); + end if; + end if; + when State_StoreSP => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_StoreSP2; + + mem_writeEnable <= '1'; + mem_addr <= std_logic_vector(sp+spOffset); + mem_write <= std_logic_vector(stackA); + stackA <= stackB; + sp <= incSp; + end if; + + + when State_LoadSP => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_LoadSP2; + + sp <= decSp; + mem_writeEnable <= '1'; + mem_addr <= std_logic_vector(incSp); + mem_write <= std_logic_vector(stackB); + end if; + when State_Emulate => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + sp <= decSp; + mem_writeEnable <= '1'; + mem_addr <= std_logic_vector(incSp); + mem_write <= std_logic_vector(stackB); + stackA <= (others => DontCareValue); + stackA(maxAddrBitIncIO downto 0) <= pc + 1; + stackB <= stackA; + + -- The emulate address is: + -- 98 7654 3210 + -- 0000 00aa aaa0 0000 + pc <= (others => '0'); + pc(9 downto 5) <= unsigned(opcode(to_integer(pc(byteBits-1 downto 0)))(4 downto 0)); + state <= State_Fetch; + end if; + when State_Callpcrel => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + stackA <= (others => DontCareValue); + stackA(maxAddrBitIncIO downto 0) <= pc + 1; + + pc <= pc + stackA(maxAddrBitIncIO downto 0); + state <= State_Fetch; + end if; + when State_Call => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + stackA <= (others => DontCareValue); + stackA(maxAddrBitIncIO downto 0) <= pc + 1; + pc <= stackA(maxAddrBitIncIO downto 0); + state <= State_Fetch; + end if; + when State_AddSP => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_AddSP2; + + mem_readEnable <= '1'; + mem_addr <= std_logic_vector(sp+spOffset); + end if; + when State_PushSP => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + sp <= decSp; + stackA <= (others => '0'); + stackA(maxAddrBitIncIO downto minAddrBit) <= sp; + stackB <= stackA; + mem_writeEnable <= '1'; + mem_addr <= std_logic_vector(incSp); + mem_write <= std_logic_vector(stackB); + end if; + when State_PopPC => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= stackA(maxAddrBitIncIO downto 0); + sp <= incSp; + + mem_writeEnable <= '1'; + mem_addr <= std_logic_vector(incSp); + mem_write <= std_logic_vector(stackB); + state <= State_Resync; + end if; + when State_PopPCRel => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= stackA(maxAddrBitIncIO downto 0) + pc; + sp <= incSp; + + mem_writeEnable <= '1'; + mem_addr <= std_logic_vector(incSp); + mem_write <= std_logic_vector(stackB); + state <= State_Resync; + end if; + when State_Add => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + stackA <= stackA + stackB; + + mem_readEnable <= '1'; + mem_addr <= std_logic_vector(incIncSp); + sp <= incSp; + state <= State_Popped; + end if; + when State_Sub => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + binaryOpResult <= stackB - stackA; + state <= State_BinaryOpResult; + end if; + when State_Pop => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + mem_addr <= std_logic_vector(incIncSp); + mem_readEnable <= '1'; + sp <= incSp; + stackA <= stackB; + state <= State_Popped; + end if; + when State_PopDown => + if in_mem_busy='0' then + -- PopDown leaves top of stack unchanged + begin_inst <= '1'; + idim_flag <= '0'; + mem_addr <= std_logic_vector(incIncSp); + mem_readEnable <= '1'; + sp <= incSp; + state <= State_Popped; + end if; + when State_Or => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + stackA <= stackA or stackB; + mem_readEnable <= '1'; + mem_addr <= std_logic_vector(incIncSp); + sp <= incSp; + state <= State_Popped; + end if; + when State_And => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + + stackA <= stackA and stackB; + mem_readEnable <= '1'; + mem_addr <= std_logic_vector(incIncSp); + sp <= incSp; + state <= State_Popped; + end if; + when State_Eq => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + + binaryOpResult <= (others => '0'); + if (stackA=stackB) then + binaryOpResult(0) <= '1'; + end if; + state <= State_BinaryOpResult; + end if; + when State_Ulessthan => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + + binaryOpResult <= (others => '0'); + if (stackA + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + + binaryOpResult <= (others => '0'); + if (stackA<=stackB) then + binaryOpResult(0) <= '1'; + end if; + state <= State_BinaryOpResult; + end if; + when State_Lessthan => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + + binaryOpResult <= (others => '0'); + if (signed(stackA) + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + + binaryOpResult <= (others => '0'); + if (signed(stackA)<=signed(stackB)) then + binaryOpResult(0) <= '1'; + end if; + state <= State_BinaryOpResult; + end if; + when State_Load => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_Load2; + + mem_addr <= std_logic_vector(stackA(maxAddrBitIncIO downto minAddrBit)); + mem_readEnable <= '1'; + end if; + + when State_Dup => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + sp <= decSp; + stackB <= stackA; + mem_write <= std_logic_vector(stackB); + mem_addr <= std_logic_vector(incSp); + mem_writeEnable <= '1'; + end if; + when State_DupStackB => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + sp <= decSp; + stackA <= stackB; + stackB <= stackA; + mem_write <= std_logic_vector(stackB); + mem_addr <= std_logic_vector(incSp); + mem_writeEnable <= '1'; + end if; + when State_Store => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + mem_addr <= std_logic_vector(stackA(maxAddrBitIncIO downto minAddrBit)); + mem_write <= std_logic_vector(stackB); + mem_writeEnable <= '1'; + sp <= incIncSp; + state <= State_Resync; + end if; + when State_PopSP => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + mem_write <= std_logic_vector(stackB); + mem_addr <= std_logic_vector(incSp); + mem_writeEnable <= '1'; + sp <= stackA(maxAddrBitIncIO downto minAddrBit); + state <= State_Resync; + end if; + when State_Nop => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + when State_Not => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + stackA <= not stackA; + when State_Flip => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + for i in 0 to wordSize-1 loop + stackA(i) <= stackA(wordSize-1-i); + end loop; + when State_AddTop => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + stackA <= stackA + stackB; + when State_Shift => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + stackA(wordSize-1 downto 1) <= stackA(wordSize-2 downto 0); + stackA(0) <= '0'; + when State_Pushspadd => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + stackA <= (others => '0'); + stackA(maxAddrBitIncIO downto minAddrBit) <= stackA(maxAddrBitIncIO-minAddrBit downto 0)+sp; + when State_Neqbranch => + -- branches are almost always taken as they form loops + begin_inst <= '1'; + idim_flag <= '0'; + sp <= incIncSp; + if (stackB/=0) then + pc <= stackA(maxAddrBitIncIO downto 0) + pc; + else + pc <= pc + 1; + end if; + -- need to fetch stack again. + state <= State_Resync; + when State_Mult => + begin_inst <= '1'; + idim_flag <= '0'; + + multA <= stackA; + multB <= stackB; + state <= State_Mult2; + when State_Break => + report "Break instruction encountered" severity failure; + break <= '1'; + + when State_Loadb => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_Loadb2; + + mem_addr <= std_logic_vector(stackA(maxAddrBitIncIO downto minAddrBit)); + mem_readEnable <= '1'; + end if; + when State_Storeb => + if in_mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_Storeb2; + + mem_addr <= std_logic_vector(stackA(maxAddrBitIncIO downto minAddrBit)); + mem_readEnable <= '1'; + end if; + + when others => + sp <= (others => DontCareValue); + report "Illegal instruction" severity failure; + break <= '1'; + end case; + + + when State_StoreSP2 => + if in_mem_busy='0' then + mem_addr <= std_logic_vector(incSp); + mem_readEnable <= '1'; + state <= State_Popped; + end if; + when State_LoadSP2 => + if in_mem_busy='0' then + state <= State_LoadSP3; + mem_readEnable <= '1'; + mem_addr <= std_logic_vector(sp+spOffset+1); + end if; + when State_LoadSP3 => + if in_mem_busy='0' then + pc <= pc + 1; + state <= State_Execute; + stackB <= stackA; + stackA <= unsigned(mem_read); + end if; + when State_AddSP2 => + if in_mem_busy='0' then + pc <= pc + 1; + state <= State_Execute; + stackA <= stackA + unsigned(mem_read); + end if; + when State_Load2 => + if in_mem_busy='0' then + stackA <= unsigned(mem_read); + pc <= pc + 1; + state <= State_Execute; + end if; + when State_Loadb2 => + if in_mem_busy='0' then + stackA <= (others => '0'); + stackA(7 downto 0) <= unsigned(mem_read(((wordBytes-1-to_integer(stackA(byteBits-1 downto 0)))*8+7) downto (wordBytes-1-to_integer(stackA(byteBits-1 downto 0)))*8)); + pc <= pc + 1; + state <= State_Execute; + end if; + when State_Storeb2 => + if in_mem_busy='0' then + mem_addr <= std_logic_vector(stackA(maxAddrBitIncIO downto minAddrBit)); + mem_write <= mem_read; + mem_write(((wordBytes-1-to_integer(stackA(byteBits-1 downto 0)))*8+7) downto (wordBytes-1-to_integer(stackA(byteBits-1 downto 0)))*8) <= std_logic_vector(stackB(7 downto 0)); + mem_writeEnable <= '1'; + pc <= pc + 1; + sp <= incIncSp; + state <= State_Resync; + end if; + when State_Fetch => + if in_mem_busy='0' then + mem_addr <= std_logic_vector(pc(maxAddrBitIncIO downto minAddrBit)); + mem_readEnable <= '1'; + state <= State_Decode; + end if; + when State_Mult2 => + state <= State_Mult3; + when State_Mult3 => + state <= State_Mult4; + when State_Mult4 => + state <= State_Mult5; + when State_Mult5 => + if in_mem_busy='0' then + stackA <= multResult3; + mem_readEnable <= '1'; + mem_addr <= std_logic_vector(incIncSp); + sp <= incSp; + state <= State_Popped; + end if; + when State_BinaryOpResult => + state <= State_BinaryOpResult2; + when State_BinaryOpResult2 => + mem_readEnable <= '1'; + mem_addr <= std_logic_vector(incIncSp); + sp <= incSp; + stackA <= binaryOpResult2; + state <= State_Popped; + when State_Popped => + if in_mem_busy='0' then + pc <= pc + 1; + stackB <= unsigned(mem_read); + state <= State_Execute; + end if; + when others => + sp <= (others => DontCareValue); + report "Illegal state" severity failure; + break <= '1'; + end case; + end if; + end process; + + + +end behave; diff --git a/zpu/hdl/zpu4/src/zpu_core_small.vhd b/zpu/hdl/zpu4/src/zpu_core_small.vhd index 4d73f88..0d734d2 100644 --- a/zpu/hdl/zpu4/src/zpu_core_small.vhd +++ b/zpu/hdl/zpu4/src/zpu_core_small.vhd @@ -1,433 +1,447 @@ --- Company: ZPU3 --- Engineer: Øyvind Harboe - -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.STD_LOGIC_UNSIGNED.ALL; - -library work; -use work.zpu_config.all; -use work.zpupkg.all; - - -entity zpu_core is - Port ( clk : in std_logic; - areset : in std_logic; - enable : in std_logic; - in_mem_busy : in std_logic; - mem_read : in std_logic_vector(wordSize-1 downto 0); - mem_write : out std_logic_vector(wordSize-1 downto 0); - out_mem_addr : out std_logic_vector(maxAddrBitIncIO downto 0); - out_mem_writeEnable : out std_logic; - out_mem_readEnable : out std_logic; - mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); - interrupt : in std_logic; - break : out std_logic); -end zpu_core; - -architecture behave of zpu_core is - -signal readIO : std_logic; - - - -signal memAWriteEnable : std_logic; -signal memAAddr : std_logic_vector(maxAddrBit downto minAddrBit); -signal memAWrite : std_logic_vector(wordSize-1 downto 0); -signal memARead : std_logic_vector(wordSize-1 downto 0); -signal memBWriteEnable : std_logic; -signal memBAddr : std_logic_vector(maxAddrBit downto minAddrBit); -signal memBWrite : std_logic_vector(wordSize-1 downto 0); -signal memBRead : std_logic_vector(wordSize-1 downto 0); - - - -signal pc : std_logic_vector(maxAddrBit downto 0); -signal sp : std_logic_vector(maxAddrBit downto minAddrBit); - -signal idim_flag : std_logic; - ---signal storeToStack : std_logic; ---signal fetchNextInstruction : std_logic; ---signal extraCycle : std_logic; -signal busy : std_logic; ---signal fetching : std_logic; - -signal begin_inst : std_logic; - - - -signal trace_opcode : std_logic_vector(7 downto 0); -signal trace_pc : std_logic_vector(maxAddrBitIncIO downto 0); -signal trace_sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal trace_topOfStack : std_logic_vector(wordSize-1 downto 0); -signal trace_topOfStackB : std_logic_vector(wordSize-1 downto 0); - --- state machine. -type State_Type is -( -State_Fetch, -State_WriteIODone, -State_Execute, -State_StoreToStack, -State_Add, -State_Or, -State_And, -State_Store, -State_ReadIO, -State_WriteIO, -State_Load, -State_FetchNext, -State_AddSP, -State_ReadIODone, -State_Decode, -State_Resync -); - -type DecodedOpcodeType is -( -Decoded_Nop, -Decoded_Im, -Decoded_ImShift, -Decoded_LoadSP, -Decoded_StoreSP , -Decoded_AddSP, -Decoded_Emulate, -Decoded_Break, -Decoded_PushSP, -Decoded_PopPC, -Decoded_Add, -Decoded_Or, -Decoded_And, -Decoded_Load, -Decoded_Not, -Decoded_Flip, -Decoded_Store, -Decoded_PopSP -); - - - -signal sampledOpcode : std_logic_vector(OpCode_Size-1 downto 0); -signal opcode : std_logic_vector(OpCode_Size-1 downto 0); - -signal decodedOpcode : DecodedOpcodeType; -signal sampledDecodedOpcode : DecodedOpcodeType; - - -signal state : State_Type; - -begin - traceFileGenerate: - if Generate_Trace generate - trace_file: trace port map ( - clk => clk, - begin_inst => begin_inst, - pc => trace_pc, - opcode => trace_opcode, - sp => trace_sp, - memA => trace_topOfStack, - memB => trace_topOfStackB, - busy => busy, - intsp => (others => 'U') - ); - end generate; - - - memory: dualport_ram port map ( - clk => clk, - memAWriteEnable => memAWriteEnable, - memAAddr => memAAddr(maxAddrBitBRAM downto minAddrBit), - memAWrite => memAWrite, - memARead => memARead, - memBWriteEnable => memBWriteEnable, - memBAddr => memBAddr(maxAddrBitBRAM downto minAddrBit), - memBWrite => memBWrite, - memBRead => memBRead - ); - - - - decodeControl: - process(memBRead, pc) - variable tOpcode : std_logic_vector(OpCode_Size-1 downto 0); - begin - tOpcode := memBRead((wordBytes-1-conv_integer(pc(minAddrBit-1 downto 0))+1)*8-1 downto (wordBytes-1-conv_integer(pc(minAddrBit-1 downto 0)))*8); - - sampledOpcode <= tOpcode; - - if (tOpcode(7 downto 7)=OpCode_Im) then - sampledDecodedOpcode<=Decoded_Im; - elsif (tOpcode(7 downto 5)=OpCode_StoreSP) then - sampledDecodedOpcode<=Decoded_StoreSP; - elsif (tOpcode(7 downto 5)=OpCode_LoadSP) then - sampledDecodedOpcode<=Decoded_LoadSP; - elsif (tOpcode(7 downto 5)=OpCode_Emulate) then - sampledDecodedOpcode<=Decoded_Emulate; - elsif (tOpcode(7 downto 4)=OpCode_AddSP) then - sampledDecodedOpcode<=Decoded_AddSP; - else - case tOpcode(3 downto 0) is - when OpCode_Break => - sampledDecodedOpcode<=Decoded_Break; - when OpCode_PushSP => - sampledDecodedOpcode<=Decoded_PushSP; - when OpCode_PopPC => - sampledDecodedOpcode<=Decoded_PopPC; - when OpCode_Add => - sampledDecodedOpcode<=Decoded_Add; - when OpCode_Or => - sampledDecodedOpcode<=Decoded_Or; - when OpCode_And => - sampledDecodedOpcode<=Decoded_And; - when OpCode_Load => - sampledDecodedOpcode<=Decoded_Load; - when OpCode_Not => - sampledDecodedOpcode<=Decoded_Not; - when OpCode_Flip => - sampledDecodedOpcode<=Decoded_Flip; - when OpCode_Store => - sampledDecodedOpcode<=Decoded_Store; - when OpCode_PopSP => - sampledDecodedOpcode<=Decoded_PopSP; - when others => - sampledDecodedOpcode<=Decoded_Nop; - end case; - end if; - end process; - - - opcodeControl: - process(clk, areset) - variable spOffset : std_logic_vector(4 downto 0); - begin - if areset = '1' then - state <= State_Resync; - break <= '0'; - sp <= spStart(maxAddrBit downto minAddrBit); - pc <= (others => '0'); - idim_flag <= '0'; - begin_inst <= '0'; - memAAddr <= (others => '0'); - memBAddr <= (others => '0'); - memAWriteEnable <= '0'; - memBWriteEnable <= '0'; - out_mem_writeEnable <= '0'; - out_mem_readEnable <= '0'; - memAWrite <= (others => '0'); - memBWrite <= (others => '0'); - mem_writeMask <= (others => '1'); - elsif (clk'event and clk = '1') then - memAWriteEnable <= '0'; - memBWriteEnable <= '0'; - -- This saves ca. 100 LUT's, by explicitly declaring that the - -- memAWrite can be left at whatever value if memAWriteEnable is - -- not set. - memAWrite <= (others => DontCareValue); - memBWrite <= (others => DontCareValue); --- out_mem_addr <= (others => DontCareValue); --- mem_write <= (others => DontCareValue); - spOffset := (others => DontCareValue); - memAAddr <= (others => DontCareValue); - memBAddr <= (others => DontCareValue); - - out_mem_writeEnable <= '0'; - out_mem_readEnable <= '0'; - begin_inst <= '0'; - out_mem_addr <= memARead(maxAddrBitIncIO downto 0); - mem_write <= memBRead; - - decodedOpcode <= sampledDecodedOpcode; - opcode <= sampledOpcode; - - case state is - when State_Execute => - state <= State_Fetch; - -- at this point: - -- memBRead contains opcode word - -- memARead contains top of stack - pc <= pc + 1; - - -- trace - begin_inst <= '1'; - trace_pc <= (others => '0'); - trace_pc(maxAddrBit downto 0) <= pc; - trace_opcode <= opcode; - trace_sp <= (others => '0'); - trace_sp(maxAddrBit downto minAddrBit) <= sp; - trace_topOfStack <= memARead; - trace_topOfStackB <= memBRead; - - -- during the next cycle we'll be reading the next opcode - spOffset(4):=not opcode(4); - spOffset(3 downto 0):=opcode(3 downto 0); - - idim_flag <= '0'; - case decodedOpcode is - when Decoded_Im => - idim_flag <= '1'; - memAWriteEnable <= '1'; - if (idim_flag='0') then - sp <= sp - 1; - memAAddr <= sp-1; - for i in wordSize-1 downto 7 loop - memAWrite(i) <= opcode(6); - end loop; - memAWrite(6 downto 0) <= opcode(6 downto 0); - else - memAAddr <= sp; - memAWrite(wordSize-1 downto 7) <= memARead(wordSize-8 downto 0); - memAWrite(6 downto 0) <= opcode(6 downto 0); - end if; - when Decoded_StoreSP => - memBWriteEnable <= '1'; - memBAddr <= sp+spOffset; - memBWrite <= memARead; - sp <= sp + 1; - state <= State_Resync; - when Decoded_LoadSP => - sp <= sp - 1; - memAAddr <= sp+spOffset; - when Decoded_Emulate => - sp <= sp - 1; - memAWriteEnable <= '1'; - memAAddr <= sp - 1; - memAWrite <= (others => DontCareValue); - memAWrite(maxAddrBit downto 0) <= pc + 1; - -- The emulate address is: - -- 98 7654 3210 - -- 0000 00aa aaa0 0000 - pc <= (others => '0'); - pc(9 downto 5) <= opcode(4 downto 0); - when Decoded_AddSP => - memAAddr <= sp; - memBAddr <= sp+spOffset; - state <= State_AddSP; - when Decoded_Break => - report "Break instruction encountered" severity failure; - break <= '1'; - when Decoded_PushSP => - memAWriteEnable <= '1'; - memAAddr <= sp - 1; - sp <= sp - 1; - memAWrite <= (others => DontCareValue); - memAWrite(maxAddrBit downto minAddrBit) <= sp; - when Decoded_PopPC => - pc <= memARead(maxAddrBit downto 0); - sp <= sp + 1; - state <= State_Resync; - when Decoded_Add => - sp <= sp + 1; - state <= State_Add; - when Decoded_Or => - sp <= sp + 1; - state <= State_Or; - when Decoded_And => - sp <= sp + 1; - state <= State_And; - when Decoded_Load => - if (memARead(ioBit)='1') then - out_mem_addr <= memARead(maxAddrBitIncIO downto 0); - out_mem_readEnable <= '1'; - state <= State_ReadIO; - else - memAAddr <= memARead(maxAddrBit downto minAddrBit); - end if; - when Decoded_Not => - memAAddr <= sp(maxAddrBit downto minAddrBit); - memAWriteEnable <= '1'; - memAWrite <= not memARead; - when Decoded_Flip => - memAAddr <= sp(maxAddrBit downto minAddrBit); - memAWriteEnable <= '1'; - for i in 0 to wordSize-1 loop - memAWrite(i) <= memARead(wordSize-1-i); - end loop; - when Decoded_Store => - memBAddr <= sp + 1; - sp <= sp + 1; - if (memARead(ioBit)='1') then - state <= State_WriteIO; - else - state <= State_Store; - end if; - when Decoded_PopSP => - sp <= memARead(maxAddrBit downto minAddrBit); - state <= State_Resync; - when Decoded_Nop => - memAAddr <= sp; - when others => - null; - end case; - when State_ReadIO => - if (in_mem_busy = '0') then - state <= State_Fetch; - memAWriteEnable <= '1'; - memAWrite <= mem_read; - end if; - when State_WriteIO => - sp <= sp + 1; - out_mem_writeEnable <= '1'; - out_mem_addr <= memARead(maxAddrBitIncIO downto 0); - mem_write <= memBRead; - state <= State_WriteIODone; - when State_WriteIODone => - if (in_mem_busy = '0') then - state <= State_Resync; - end if; - when State_Fetch => - -- We need to resync. During the *next* cycle - -- we'll fetch the opcode @ pc and thus it will - -- be available for State_Execute the cycle after - -- next - memBAddr <= pc(maxAddrBit downto minAddrBit); - state <= State_FetchNext; - when State_FetchNext => - -- at this point memARead contains the value that is either - -- from the top of stack or should be copied to the top of the stack - memAWriteEnable <= '1'; - memAWrite <= memARead; - memAAddr <= sp; - memBAddr <= sp + 1; - state <= State_Decode; - when State_Decode => - -- during the State_Execute cycle we'll be fetching SP+1 - memAAddr <= sp; - memBAddr <= sp + 1; - state <= State_Execute; - when State_Store => - sp <= sp + 1; - memAWriteEnable <= '1'; - memAAddr <= memARead(maxAddrBit downto minAddrBit); - memAWrite <= memBRead; - state <= State_Resync; - when State_AddSP => - state <= State_Add; - when State_Add => - memAAddr <= sp; - memAWriteEnable <= '1'; - memAWrite <= memARead + memBRead; - state <= State_Fetch; - when State_Or => - memAAddr <= sp; - memAWriteEnable <= '1'; - memAWrite <= memARead or memBRead; - state <= State_Fetch; - when State_Resync => - memAAddr <= sp; - state <= State_Fetch; - when State_And => - memAAddr <= sp; - memAWriteEnable <= '1'; - memAWrite <= memARead and memBRead; - state <= State_Fetch; - when others => - null; - end case; - - end if; - end process; - - - -end behave; +-- Company: ZPU3 +-- Engineer: Øyvind Harboe + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use ieee.numeric_std.all; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; + + +entity zpu_core is + Port ( clk : in std_logic; + areset : in std_logic; + enable : in std_logic; + in_mem_busy : in std_logic; + mem_read : in std_logic_vector(wordSize-1 downto 0); + mem_write : out std_logic_vector(wordSize-1 downto 0); + out_mem_addr : out std_logic_vector(maxAddrBitIncIO downto 0); + out_mem_writeEnable : out std_logic; + out_mem_readEnable : out std_logic; + mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); + interrupt : in std_logic; + break : out std_logic); +end zpu_core; + +architecture behave of zpu_core is + +signal readIO : std_logic; + + + +signal memAWriteEnable : std_logic; +signal memAAddr : unsigned(maxAddrBit downto minAddrBit); +signal memAWrite : unsigned(wordSize-1 downto 0); +signal memARead : unsigned(wordSize-1 downto 0); +signal memBWriteEnable : std_logic; +signal memBAddr : unsigned(maxAddrBit downto minAddrBit); +signal memBWrite : unsigned(wordSize-1 downto 0); +signal memBRead : unsigned(wordSize-1 downto 0); + + + +signal pc : unsigned(maxAddrBit downto 0); +signal sp : unsigned(maxAddrBit downto minAddrBit); + +signal idim_flag : std_logic; + +--signal storeToStack : std_logic; +--signal fetchNextInstruction : std_logic; +--signal extraCycle : std_logic; +signal busy : std_logic; +--signal fetching : std_logic; + +signal begin_inst : std_logic; + + + +signal trace_opcode : std_logic_vector(7 downto 0); +signal trace_pc : std_logic_vector(maxAddrBitIncIO downto 0); +signal trace_sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal trace_topOfStack : std_logic_vector(wordSize-1 downto 0); +signal trace_topOfStackB : std_logic_vector(wordSize-1 downto 0); + +-- state machine. +type State_Type is +( +State_Fetch, +State_WriteIODone, +State_Execute, +State_StoreToStack, +State_Add, +State_Or, +State_And, +State_Store, +State_ReadIO, +State_WriteIO, +State_Load, +State_FetchNext, +State_AddSP, +State_ReadIODone, +State_Decode, +State_Resync +); + +type DecodedOpcodeType is +( +Decoded_Nop, +Decoded_Im, +Decoded_ImShift, +Decoded_LoadSP, +Decoded_StoreSP , +Decoded_AddSP, +Decoded_Emulate, +Decoded_Break, +Decoded_PushSP, +Decoded_PopPC, +Decoded_Add, +Decoded_Or, +Decoded_And, +Decoded_Load, +Decoded_Not, +Decoded_Flip, +Decoded_Store, +Decoded_PopSP +); + + + +signal sampledOpcode : std_logic_vector(OpCode_Size-1 downto 0); +signal opcode : std_logic_vector(OpCode_Size-1 downto 0); + +signal decodedOpcode : DecodedOpcodeType; +signal sampledDecodedOpcode : DecodedOpcodeType; + + +signal state : State_Type; + +subtype AddrBitBRAM_range is natural range maxAddrBitBRAM downto minAddrBit; +signal memAAddr_stdlogic : std_logic_vector(AddrBitBRAM_range); +signal memAWrite_stdlogic : std_logic_vector(memAWrite'range); +signal memARead_stdlogic : std_logic_vector(memARead'range); +signal memBAddr_stdlogic : std_logic_vector(AddrBitBRAM_range); +signal memBWrite_stdlogic : std_logic_vector(memBWrite'range); +signal memBRead_stdlogic : std_logic_vector(memBRead'range); + +begin + traceFileGenerate: + if Generate_Trace generate + trace_file: trace port map ( + clk => clk, + begin_inst => begin_inst, + pc => trace_pc, + opcode => trace_opcode, + sp => trace_sp, + memA => trace_topOfStack, + memB => trace_topOfStackB, + busy => busy, + intsp => (others => 'U') + ); + end generate; + + + memAAddr_stdlogic <= std_logic_vector(memAAddr(AddrBitBRAM_range)); + memAWrite_stdlogic <= std_logic_vector(memAWrite); + memBAddr_stdlogic <= std_logic_vector(memBAddr(AddrBitBRAM_range)); + memBWrite_stdlogic <= std_logic_vector(memBWrite); + memory: dualport_ram port map ( + clk => clk, + memAWriteEnable => memAWriteEnable, + memAAddr => memAAddr_stdlogic, + memAWrite => memAWrite_stdlogic, + memARead => memARead_stdlogic, + memBWriteEnable => memBWriteEnable, + memBAddr => memBAddr_stdlogic, + memBWrite => memBWrite_stdlogic, + memBRead => memBRead_stdlogic + ); + memARead <= unsigned(memARead_stdlogic); + memBRead <= unsigned(memBRead_stdlogic); + + + + decodeControl: + process(memBRead, pc) + variable tOpcode : std_logic_vector(OpCode_Size-1 downto 0); + begin + tOpcode := std_logic_vector(memBRead((wordBytes-1-to_integer(pc(minAddrBit-1 downto 0))+1)*8-1 downto (wordBytes-1-to_integer(pc(minAddrBit-1 downto 0)))*8)); + + sampledOpcode <= tOpcode; + + if (tOpcode(7 downto 7)=OpCode_Im) then + sampledDecodedOpcode<=Decoded_Im; + elsif (tOpcode(7 downto 5)=OpCode_StoreSP) then + sampledDecodedOpcode<=Decoded_StoreSP; + elsif (tOpcode(7 downto 5)=OpCode_LoadSP) then + sampledDecodedOpcode<=Decoded_LoadSP; + elsif (tOpcode(7 downto 5)=OpCode_Emulate) then + sampledDecodedOpcode<=Decoded_Emulate; + elsif (tOpcode(7 downto 4)=OpCode_AddSP) then + sampledDecodedOpcode<=Decoded_AddSP; + else + case tOpcode(3 downto 0) is + when OpCode_Break => + sampledDecodedOpcode<=Decoded_Break; + when OpCode_PushSP => + sampledDecodedOpcode<=Decoded_PushSP; + when OpCode_PopPC => + sampledDecodedOpcode<=Decoded_PopPC; + when OpCode_Add => + sampledDecodedOpcode<=Decoded_Add; + when OpCode_Or => + sampledDecodedOpcode<=Decoded_Or; + when OpCode_And => + sampledDecodedOpcode<=Decoded_And; + when OpCode_Load => + sampledDecodedOpcode<=Decoded_Load; + when OpCode_Not => + sampledDecodedOpcode<=Decoded_Not; + when OpCode_Flip => + sampledDecodedOpcode<=Decoded_Flip; + when OpCode_Store => + sampledDecodedOpcode<=Decoded_Store; + when OpCode_PopSP => + sampledDecodedOpcode<=Decoded_PopSP; + when others => + sampledDecodedOpcode<=Decoded_Nop; + end case; + end if; + end process; + + + opcodeControl: + process(clk, areset) + variable spOffset : unsigned(4 downto 0); + begin + if areset = '1' then + state <= State_Resync; + break <= '0'; + sp <= unsigned(spStart(maxAddrBit downto minAddrBit)); + pc <= (others => '0'); + idim_flag <= '0'; + begin_inst <= '0'; + memAAddr <= (others => '0'); + memBAddr <= (others => '0'); + memAWriteEnable <= '0'; + memBWriteEnable <= '0'; + out_mem_writeEnable <= '0'; + out_mem_readEnable <= '0'; + memAWrite <= (others => '0'); + memBWrite <= (others => '0'); + mem_writeMask <= (others => '1'); + elsif (clk'event and clk = '1') then + memAWriteEnable <= '0'; + memBWriteEnable <= '0'; + -- This saves ca. 100 LUT's, by explicitly declaring that the + -- memAWrite can be left at whatever value if memAWriteEnable is + -- not set. + memAWrite <= (others => DontCareValue); + memBWrite <= (others => DontCareValue); +-- out_mem_addr <= (others => DontCareValue); +-- mem_write <= (others => DontCareValue); + spOffset := (others => DontCareValue); + memAAddr <= (others => DontCareValue); + memBAddr <= (others => DontCareValue); + + out_mem_writeEnable <= '0'; + out_mem_readEnable <= '0'; + begin_inst <= '0'; + out_mem_addr <= std_logic_vector(memARead(maxAddrBitIncIO downto 0)); + mem_write <= std_logic_vector(memBRead); + + decodedOpcode <= sampledDecodedOpcode; + opcode <= sampledOpcode; + + case state is + when State_Execute => + state <= State_Fetch; + -- at this point: + -- memBRead contains opcode word + -- memARead contains top of stack + pc <= pc + 1; + + -- trace + begin_inst <= '1'; + trace_pc <= (others => '0'); + trace_pc(maxAddrBit downto 0) <= std_logic_vector(pc); + trace_opcode <= opcode; + trace_sp <= (others => '0'); + trace_sp(maxAddrBit downto minAddrBit) <= std_logic_vector(sp); + trace_topOfStack <= std_logic_vector(memARead); + trace_topOfStackB <= std_logic_vector(memBRead); + + -- during the next cycle we'll be reading the next opcode + spOffset(4):=not opcode(4); + spOffset(3 downto 0) := unsigned(opcode(3 downto 0)); + + idim_flag <= '0'; + case decodedOpcode is + when Decoded_Im => + idim_flag <= '1'; + memAWriteEnable <= '1'; + if (idim_flag='0') then + sp <= sp - 1; + memAAddr <= sp-1; + for i in wordSize-1 downto 7 loop + memAWrite(i) <= opcode(6); + end loop; + memAWrite(6 downto 0) <= unsigned(opcode(6 downto 0)); + else + memAAddr <= sp; + memAWrite(wordSize-1 downto 7) <= memARead(wordSize-8 downto 0); + memAWrite(6 downto 0) <= unsigned(opcode(6 downto 0)); + end if; + when Decoded_StoreSP => + memBWriteEnable <= '1'; + memBAddr <= sp+spOffset; + memBWrite <= memARead; + sp <= sp + 1; + state <= State_Resync; + when Decoded_LoadSP => + sp <= sp - 1; + memAAddr <= sp+spOffset; + when Decoded_Emulate => + sp <= sp - 1; + memAWriteEnable <= '1'; + memAAddr <= sp - 1; + memAWrite <= (others => DontCareValue); + memAWrite(maxAddrBit downto 0) <= pc + 1; + -- The emulate address is: + -- 98 7654 3210 + -- 0000 00aa aaa0 0000 + pc <= (others => '0'); + pc(9 downto 5) <= unsigned(opcode(4 downto 0)); + when Decoded_AddSP => + memAAddr <= sp; + memBAddr <= sp+spOffset; + state <= State_AddSP; + when Decoded_Break => + report "Break instruction encountered" severity failure; + break <= '1'; + when Decoded_PushSP => + memAWriteEnable <= '1'; + memAAddr <= sp - 1; + sp <= sp - 1; + memAWrite <= (others => DontCareValue); + memAWrite(maxAddrBit downto minAddrBit) <= sp; + when Decoded_PopPC => + pc <= memARead(maxAddrBit downto 0); + sp <= sp + 1; + state <= State_Resync; + when Decoded_Add => + sp <= sp + 1; + state <= State_Add; + when Decoded_Or => + sp <= sp + 1; + state <= State_Or; + when Decoded_And => + sp <= sp + 1; + state <= State_And; + when Decoded_Load => + if (memARead(ioBit)='1') then + out_mem_addr <= std_logic_vector(memARead(maxAddrBitIncIO downto 0)); + out_mem_readEnable <= '1'; + state <= State_ReadIO; + else + memAAddr <= memARead(maxAddrBit downto minAddrBit); + end if; + when Decoded_Not => + memAAddr <= sp(maxAddrBit downto minAddrBit); + memAWriteEnable <= '1'; + memAWrite <= not memARead; + when Decoded_Flip => + memAAddr <= sp(maxAddrBit downto minAddrBit); + memAWriteEnable <= '1'; + for i in 0 to wordSize-1 loop + memAWrite(i) <= memARead(wordSize-1-i); + end loop; + when Decoded_Store => + memBAddr <= sp + 1; + sp <= sp + 1; + if (memARead(ioBit)='1') then + state <= State_WriteIO; + else + state <= State_Store; + end if; + when Decoded_PopSP => + sp <= memARead(maxAddrBit downto minAddrBit); + state <= State_Resync; + when Decoded_Nop => + memAAddr <= sp; + when others => + null; + end case; + when State_ReadIO => + if (in_mem_busy = '0') then + state <= State_Fetch; + memAWriteEnable <= '1'; + memAWrite <= unsigned(mem_read); + end if; + when State_WriteIO => + sp <= sp + 1; + out_mem_writeEnable <= '1'; + out_mem_addr <= std_logic_vector(memARead(maxAddrBitIncIO downto 0)); + mem_write <= std_logic_vector(memBRead); + state <= State_WriteIODone; + when State_WriteIODone => + if (in_mem_busy = '0') then + state <= State_Resync; + end if; + when State_Fetch => + -- We need to resync. During the *next* cycle + -- we'll fetch the opcode @ pc and thus it will + -- be available for State_Execute the cycle after + -- next + memBAddr <= pc(maxAddrBit downto minAddrBit); + state <= State_FetchNext; + when State_FetchNext => + -- at this point memARead contains the value that is either + -- from the top of stack or should be copied to the top of the stack + memAWriteEnable <= '1'; + memAWrite <= memARead; + memAAddr <= sp; + memBAddr <= sp + 1; + state <= State_Decode; + when State_Decode => + -- during the State_Execute cycle we'll be fetching SP+1 + memAAddr <= sp; + memBAddr <= sp + 1; + state <= State_Execute; + when State_Store => + sp <= sp + 1; + memAWriteEnable <= '1'; + memAAddr <= memARead(maxAddrBit downto minAddrBit); + memAWrite <= memBRead; + state <= State_Resync; + when State_AddSP => + state <= State_Add; + when State_Add => + memAAddr <= sp; + memAWriteEnable <= '1'; + memAWrite <= memARead + memBRead; + state <= State_Fetch; + when State_Or => + memAAddr <= sp; + memAWriteEnable <= '1'; + memAWrite <= memARead or memBRead; + state <= State_Fetch; + when State_Resync => + memAAddr <= sp; + state <= State_Fetch; + when State_And => + memAAddr <= sp; + memAWriteEnable <= '1'; + memAWrite <= memARead and memBRead; + state <= State_Fetch; + when others => + null; + end case; + + end if; + end process; + + + +end behave; diff --git a/zpu/hdl/zpu4/src/zpupkg.vhd b/zpu/hdl/zpu4/src/zpupkg.vhd index 32e162b..f3800b0 100644 --- a/zpu/hdl/zpu4/src/zpupkg.vhd +++ b/zpu/hdl/zpu4/src/zpupkg.vhd @@ -1,6 +1,6 @@ library IEEE; use IEEE.STD_LOGIC_1164.all; -use IEEE.STD_LOGIC_ARITH.all; +use ieee.numeric_std.all; library work; use work.zpu_config.all; @@ -133,33 +133,33 @@ package zpupkg is constant OpCode_Compare : std_logic_vector(3 downto 0) := "1110"; constant OpCode_PopInt : std_logic_vector(3 downto 0) := "1111"; - constant OpCode_Lessthan : std_logic_vector(5 downto 0) := conv_std_logic_vector(36, 6); - constant OpCode_Lessthanorequal : std_logic_vector(5 downto 0) := conv_std_logic_vector(37, 6); - constant OpCode_Ulessthan : std_logic_vector(5 downto 0) := conv_std_logic_vector(38, 6); - constant OpCode_Ulessthanorequal : std_logic_vector(5 downto 0) := conv_std_logic_vector(39, 6); + constant OpCode_Lessthan : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(36, 6)); + constant OpCode_Lessthanorequal : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(37, 6)); + constant OpCode_Ulessthan : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(38, 6)); + constant OpCode_Ulessthanorequal : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(39, 6)); - constant OpCode_Swap : std_logic_vector(5 downto 0) := conv_std_logic_vector(40, 6); - constant OpCode_Mult : std_logic_vector(5 downto 0) := conv_std_logic_vector(41, 6); + constant OpCode_Swap : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(40, 6)); + constant OpCode_Mult : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(41, 6)); - constant OpCode_Lshiftright : std_logic_vector(5 downto 0) := conv_std_logic_vector(42, 6); - constant OpCode_Ashiftleft : std_logic_vector(5 downto 0) := conv_std_logic_vector(43, 6); - constant OpCode_Ashiftright : std_logic_vector(5 downto 0) := conv_std_logic_vector(44, 6); - constant OpCode_Call : std_logic_vector(5 downto 0) := conv_std_logic_vector(45, 6); + constant OpCode_Lshiftright : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(42, 6)); + constant OpCode_Ashiftleft : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(43, 6)); + constant OpCode_Ashiftright : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(44, 6)); + constant OpCode_Call : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(45, 6)); - constant OpCode_Eq : std_logic_vector(5 downto 0) := conv_std_logic_vector(46, 6); - constant OpCode_Neq : std_logic_vector(5 downto 0) := conv_std_logic_vector(47, 6); + constant OpCode_Eq : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(46, 6)); + constant OpCode_Neq : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(47, 6)); - constant OpCode_Sub : std_logic_vector(5 downto 0) := conv_std_logic_vector(49, 6); - constant OpCode_Loadb : std_logic_vector(5 downto 0) := conv_std_logic_vector(51, 6); - constant OpCode_Storeb : std_logic_vector(5 downto 0) := conv_std_logic_vector(52, 6); + constant OpCode_Sub : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(49, 6)); + constant OpCode_Loadb : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(51, 6)); + constant OpCode_Storeb : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(52, 6)); - constant OpCode_Eqbranch : std_logic_vector(5 downto 0) := conv_std_logic_vector(55, 6); - constant OpCode_Neqbranch : std_logic_vector(5 downto 0) := conv_std_logic_vector(56, 6); - constant OpCode_Poppcrel : std_logic_vector(5 downto 0) := conv_std_logic_vector(57, 6); + constant OpCode_Eqbranch : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(55, 6)); + constant OpCode_Neqbranch : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(56, 6)); + constant OpCode_Poppcrel : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(57, 6)); - constant OpCode_Pushspadd : std_logic_vector(5 downto 0) := conv_std_logic_vector(61, 6); - constant OpCode_Mult16x16 : std_logic_vector(5 downto 0) := conv_std_logic_vector(62, 6); - constant OpCode_Callpcrel : std_logic_vector(5 downto 0) := conv_std_logic_vector(63, 6); + constant OpCode_Pushspadd : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(61, 6)); + constant OpCode_Mult16x16 : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(62, 6)); + constant OpCode_Callpcrel : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(63, 6)); -- cgit v1.1 From c641936739878f3c47e248b82a5f318103fd72f2 Mon Sep 17 00:00:00 2001 From: oharboe Date: Wed, 30 Apr 2008 18:11:46 +0000 Subject: wip to fix some synthesizing problems w/Synopsis --- zpu/hdl/zpu4/src/zpu_core_small_wip.vhd | 957 ++++++++++++++++++++++++++++++++ 1 file changed, 957 insertions(+) create mode 100644 zpu/hdl/zpu4/src/zpu_core_small_wip.vhd (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/zpu_core_small_wip.vhd b/zpu/hdl/zpu4/src/zpu_core_small_wip.vhd new file mode 100644 index 0000000..60ad070 --- /dev/null +++ b/zpu/hdl/zpu4/src/zpu_core_small_wip.vhd @@ -0,0 +1,957 @@ +-- Company: ZPU3 + +-- Engineer: �yvind Harboe + + + +library IEEE; + +use IEEE.STD_LOGIC_1164.ALL; + +use ieee.numeric_std.all; + + + +library work; + +use work.zpu_config.all; + +use work.zpupkg.all; + + + +entity zpu_core is + + Port ( clk : in std_logic; + + areset : in std_logic; + + enable : in std_logic; + + in_mem_busy : in std_logic; + + mem_read : in std_logic_vector(wordSize-1 downto 0); + + mem_write : out std_logic_vector(wordSize-1 downto 0); + + out_mem_addr : out std_logic_vector(maxAddrBitIncIO + +downto 0); + + out_mem_writeEnable : out std_logic; + + out_mem_readEnable : out std_logic; + + mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); + + interrupt : in std_logic; + + break : out std_logic + + ); + + + +end zpu_core; + + + +architecture behave of zpu_core is + + + +signal readIO : std_logic; + + + + + + + +signal memAWriteEnable : std_logic; + +signal memAAddr : unsigned(maxAddrBit downto minAddrBit); + +signal memAWrite : unsigned(wordSize-1 downto 0); + +signal memARead : unsigned(wordSize-1 downto 0); + +signal memBWriteEnable : std_logic; + +signal memBAddr : unsigned(maxAddrBit downto minAddrBit); + +signal memBWrite : unsigned(wordSize-1 downto 0); + +signal memBRead : unsigned(wordSize-1 downto 0); + + + +signal pc : unsigned(maxAddrBit downto 0); + +signal sp : unsigned(maxAddrBit downto minAddrBit); + + + +signal idim_flag : std_logic; + + + +--signal storeToStack : std_logic; + +--signal fetchNextInstruction : std_logic; + +--signal extraCycle : std_logic; + + + +signal busy : std_logic; + +--signal fetching : std_logic; + + + +signal begin_inst : std_logic; + + + +signal trace_opcode : std_logic_vector(7 downto 0); + +signal trace_pc : std_logic_vector(maxAddrBitIncIO downto 0); + +signal trace_sp : std_logic_vector(maxAddrBitIncIO downto + +minAddrBit); + +signal trace_topOfStack : std_logic_vector(wordSize-1 downto 0); + +signal trace_topOfStackB : std_logic_vector(wordSize-1 downto 0); + + + +-- state machine. + +type State_Type is + +( + +State_Fetch, + +State_WriteIODone, + +State_Execute, + +State_StoreToStack, + +State_Add, + +State_Or, + +State_And, + +State_Store, + +State_ReadIO, + +State_WriteIO, + +State_Load, + +State_FetchNext, + +State_AddSP, + +State_ReadIODone, + +State_Decode, + +State_Resync + +); + + + +type DecodedOpcodeType is + +( + +Decoded_Nop, + +Decoded_Im, + +Decoded_ImShift, + +Decoded_LoadSP, + +Decoded_StoreSP , + +Decoded_AddSP, + +Decoded_Emulate, + +Decoded_Break, + +Decoded_PushSP, + +Decoded_PopPC, + +Decoded_Add, + +Decoded_Or, + +Decoded_And, + +Decoded_Load, + +Decoded_Not, + +Decoded_Flip, + +Decoded_Store, + +Decoded_PopSP + +); + + + + + +signal sampledOpcode : std_logic_vector(OpCode_Size-1 downto 0); + +signal opcode : std_logic_vector(OpCode_Size-1 downto 0); + + + +signal decodedOpcode : DecodedOpcodeType; + +signal sampledDecodedOpcode : DecodedOpcodeType; + + + + + +signal state : State_Type; + + + +subtype AddrBitBRAM_range is natural range maxAddrBitBRAM downto + +minAddrBit; + +signal memAAddr_stdlogic : std_logic_vector(AddrBitBRAM_range); + +signal memAWrite_stdlogic : std_logic_vector(memAWrite'range); + +signal memARead_stdlogic : std_logic_vector(memARead'range); + +signal memBAddr_stdlogic : std_logic_vector(AddrBitBRAM_range); + +signal memBWrite_stdlogic : std_logic_vector(memBWrite'range); + +signal memBRead_stdlogic : std_logic_vector(memBRead'range); + + + +-- debug + +subtype index is integer range 0 to 31; + +signal tOpcode_sel : index; + + + + + +begin + + traceFileGenerate: + + if Generate_Trace generate + + trace_file: trace port map ( + + clk => clk, + + begin_inst => begin_inst, + + pc => trace_pc, + + opcode => trace_opcode, + + sp => trace_sp, + + memA => trace_topOfStack, + + memB => trace_topOfStackB, + + busy => busy, + + intsp => (others => 'U') + + ); + + end generate; + + + + -- not used in this design + + mem_writeMask <= (others => '1'); + + + + memAAddr_stdlogic <= std_logic_vector(memAAddr(AddrBitBRAM_range)); + + memAWrite_stdlogic <= std_logic_vector(memAWrite); + + memBAddr_stdlogic <= std_logic_vector(memBAddr(AddrBitBRAM_range)); + + memBWrite_stdlogic <= std_logic_vector(memBWrite); + + memory: dualport_ram port map ( + + clk => clk, + + memAWriteEnable => memAWriteEnable, + + memAAddr => memAAddr_stdlogic, + + memAWrite => memAWrite_stdlogic, + + memARead => memARead_stdlogic, + + memBWriteEnable => memBWriteEnable, + + memBAddr => memBAddr_stdlogic, + + memBWrite => memBWrite_stdlogic, + + memBRead => memBRead_stdlogic + + ); + + memARead <= unsigned(memARead_stdlogic); + + memBRead <= unsigned(memBRead_stdlogic); + + + +tOpcode_sel <= to_integer(pc(minAddrBit-1 downto 0)); + + + + decodeControl: + + process(memBRead, pc,tOpcode_sel) + + variable tOpcode : std_logic_vector(OpCode_Size-1 downto 0); + + begin + + -- not worked with synopsys + + -- tOpcode := + +std_logic_vector(memBRead((wordBytes-1-to_integer(pc(minAddrBit-1 + +downto 0))+1)*8-1 downto (wordBytes-1-to_integer(pc(minAddrBit-1 + +downto 0)))*8)); + + case (tOpcode_sel) is + + when 0 => tOpcode := std_logic_vector(memBRead(31 downto 24)); + + when 1 => tOpcode := std_logic_vector(memBRead(23 downto 16)); + + when 2 => tOpcode := std_logic_vector(memBRead(15 downto 8)); + + when 3 => tOpcode := std_logic_vector(memBRead(7 downto 0)); + + when others => tOpcode := std_logic_vector(memBRead(7 + +downto 0)); + + end case; + + sampledOpcode <= tOpcode; + + + + if (tOpcode(7 downto 7)=OpCode_Im) then + + sampledDecodedOpcode<=Decoded_Im; + + elsif (tOpcode(7 downto 5)=OpCode_StoreSP) then + + sampledDecodedOpcode<=Decoded_StoreSP; + + elsif (tOpcode(7 downto 5)=OpCode_LoadSP) then + + sampledDecodedOpcode<=Decoded_LoadSP; + + elsif (tOpcode(7 downto 5)=OpCode_Emulate) then + + sampledDecodedOpcode<=Decoded_Emulate; + + elsif (tOpcode(7 downto 4)=OpCode_AddSP) then + + sampledDecodedOpcode<=Decoded_AddSP; + + else + + case tOpcode(3 downto 0) is + + when OpCode_Break => + + sampledDecodedOpcode<=Decoded_Break; + + when OpCode_PushSP => + + sampledDecodedOpcode<=Decoded_PushSP; + + when OpCode_PopPC => + + sampledDecodedOpcode<=Decoded_PopPC; + + when OpCode_Add => + + sampledDecodedOpcode<=Decoded_Add; + + when OpCode_Or => + + sampledDecodedOpcode<=Decoded_Or; + + when OpCode_And => + + sampledDecodedOpcode<=Decoded_And; + + when OpCode_Load => + + sampledDecodedOpcode<=Decoded_Load; + + when OpCode_Not => + + sampledDecodedOpcode<=Decoded_Not; + + when OpCode_Flip => + + sampledDecodedOpcode<=Decoded_Flip; + + when OpCode_Store => + + sampledDecodedOpcode<=Decoded_Store; + + when OpCode_PopSP => + + sampledDecodedOpcode<=Decoded_PopSP; + + when others => + + sampledDecodedOpcode<=Decoded_Nop; + + end case; + + end if; + + end process; + + + + + + opcodeControl: + + process(clk, areset) + + variable spOffset : unsigned(4 downto 0); + + begin + + if areset = '1' then + + state <= State_Resync; + + break <= '0'; + + sp <= unsigned(spStart(maxAddrBit downto minAddrBit)); + + pc <= (others => '0'); + + idim_flag <= '0'; + + begin_inst <= '0'; + + memAAddr <= (others => '0'); + + memBAddr <= (others => '0'); + + memAWriteEnable <= '0'; + + memBWriteEnable <= '0'; + + out_mem_writeEnable <= '0'; + + out_mem_readEnable <= '0'; + + memAWrite <= (others => '0'); + + memBWrite <= (others => '0'); + + -- avoid Latch in synopsys + + -- mem_writeMask <= (others => '1'); + + elsif (clk'event and clk = '1') then + + memAWriteEnable <= '0'; + + memBWriteEnable <= '0'; + + -- This saves ca. 100 LUT's, by explicitly declaring that the + + -- memAWrite can be left at whatever value if + +memAWriteEnable is + + -- not set. + + memAWrite <= (others => DontCareValue); + + memBWrite <= (others => DontCareValue); + +-- out_mem_addr <= (others => DontCareValue); + +-- mem_write <= (others => DontCareValue); + + spOffset := (others => DontCareValue); + + memAAddr <= (others => DontCareValue); + + memBAddr <= (others => DontCareValue); + + + + out_mem_writeEnable <= '0'; + + out_mem_readEnable <= '0'; + + begin_inst <= '0'; + + out_mem_addr <= std_logic_vector(memARead(maxAddrBitIncIO + +downto 0)); + + mem_write <= std_logic_vector(memBRead); + + + + decodedOpcode <= sampledDecodedOpcode; + + opcode <= sampledOpcode; + + + + case state is + + when State_Execute => + + state <= State_Fetch; + + -- at this point: + + -- memBRead contains opcode word + + -- memARead contains top of stack + + pc <= pc + 1; + + + + -- trace + + begin_inst <= '1'; + + trace_pc <= (others => '0'); + + trace_pc(maxAddrBit downto 0) <= std_logic_vector(pc); + + trace_opcode <= opcode; + + trace_sp <= (others => '0'); + + trace_sp(maxAddrBit downto minAddrBit) <= + +std_logic_vector(sp); + + trace_topOfStack <= std_logic_vector(memARead); + + trace_topOfStackB <= std_logic_vector(memBRead); + + + + -- during the next cycle we'll be reading the next + +opcode + + spOffset(4):=not opcode(4); + + spOffset(3 downto 0) := unsigned(opcode(3 downto 0)); + + + + idim_flag <= '0'; + + case decodedOpcode is + + when Decoded_Im => + + idim_flag <= '1'; + + memAWriteEnable <= '1'; + + if (idim_flag='0') then + + sp <= sp - 1; + + memAAddr <= sp-1; + + for i in wordSize-1 downto 7 loop + + memAWrite(i) <= opcode(6); + + end loop; + + memAWrite(6 downto 0) <= + +unsigned(opcode(6 downto 0)); + + else + + memAAddr <= sp; + + memAWrite(wordSize-1 downto 7) <= + +memARead(wordSize-8 downto 0); + + memAWrite(6 downto 0) <= + +unsigned(opcode(6 downto 0)); + + end if; + + when Decoded_StoreSP => + + memBWriteEnable <= '1'; + + memBAddr <= sp+spOffset; + + memBWrite <= memARead; + + sp <= sp + 1; + + state <= State_Resync; + + when Decoded_LoadSP => + + sp <= sp - 1; + + memAAddr <= sp+spOffset; + + when Decoded_Emulate => + + sp <= sp - 1; + + memAWriteEnable <= '1'; + + memAAddr <= sp - 1; + + memAWrite <= (others => DontCareValue); + + memAWrite(maxAddrBit downto 0) <= pc + 1; + + -- The emulate address is: + + -- 98 7654 3210 + + -- 0000 00aa aaa0 0000 + + pc <= (others => '0'); + + pc(9 downto 5) <= unsigned(opcode(4 downto + +0)); + + when Decoded_AddSP => + + memAAddr <= sp; + + memBAddr <= sp+spOffset; + + state <= State_AddSP; + + when Decoded_Break => + + report "Break instruction encountered" + +severity failure; + + break <= '1'; + + when Decoded_PushSP => + + memAWriteEnable <= '1'; + + memAAddr <= sp - 1; + + sp <= sp - 1; + + memAWrite <= (others => DontCareValue); + + memAWrite(maxAddrBit downto minAddrBit) <= sp; + + when Decoded_PopPC => + + pc <= memARead(maxAddrBit downto 0); + + sp <= sp + 1; + + state <= State_Resync; + + when Decoded_Add => + + sp <= sp + 1; + + state <= State_Add; + + when Decoded_Or => + + sp <= sp + 1; + + state <= State_Or; + + when Decoded_And => + + sp <= sp + 1; + + state <= State_And; + + when Decoded_Load => + + if (memARead(ioBit)='1') then + + out_mem_addr <= + +std_logic_vector(memARead(maxAddrBitIncIO downto 0)); + + out_mem_readEnable <= '1'; + + state <= State_ReadIO; + + else + + memAAddr <= memARead(maxAddrBit downto + +minAddrBit); + + end if; + + when Decoded_Not => + + memAAddr <= sp(maxAddrBit downto minAddrBit); + + memAWriteEnable <= '1'; + + memAWrite <= not memARead; + + when Decoded_Flip => + + memAAddr <= sp(maxAddrBit downto minAddrBit); + + memAWriteEnable <= '1'; + + for i in 0 to wordSize-1 loop + + memAWrite(i) <= memARead(wordSize-1-i); + + end loop; + + when Decoded_Store => + + memBAddr <= sp + 1; + + sp <= sp + 1; + + if (memARead(ioBit)='1') then + + state <= State_WriteIO; + + else + + state <= State_Store; + + end if; + + when Decoded_PopSP => + + sp <= memARead(maxAddrBit downto minAddrBit); + + state <= State_Resync; + + when Decoded_Nop => + + memAAddr <= sp; + + when others => + + null; + + end case; + + when State_ReadIO => + + if (in_mem_busy = '0') then + + state <= State_Fetch; + + memAWriteEnable <= '1'; + + memAWrite <= unsigned(mem_read); + + end if; + + when State_WriteIO => + + sp <= sp + 1; + + out_mem_writeEnable <= '1'; + + out_mem_addr <= + +std_logic_vector(memARead(maxAddrBitIncIO downto 0)); + + mem_write <= std_logic_vector(memBRead); + + state <= State_WriteIODone; + + when State_WriteIODone => + + if (in_mem_busy = '0') then + + state <= State_Resync; + + end if; + + when State_Fetch => + + -- We need to resync. During the *next* cycle + + -- we'll fetch the opcode @ pc and thus it will + + -- be available for State_Execute the cycle after + + -- next + + memBAddr <= pc(maxAddrBit downto minAddrBit); + + state <= State_FetchNext; + + when State_FetchNext => + + -- at this point memARead contains the value that + +is either + + -- from the top of stack or should be copied to + +the top of the stack + + memAWriteEnable <= '1'; + + memAWrite <= memARead; + + memAAddr <= sp; + + memBAddr <= sp + 1; + + state <= State_Decode; + + when State_Decode => + + -- during the State_Execute cycle we'll be + +fetching SP+1 + + memAAddr <= sp; + + memBAddr <= sp + 1; + + state <= State_Execute; + + when State_Store => + + sp <= sp + 1; + + memAWriteEnable <= '1'; + + memAAddr <= memARead(maxAddrBit downto minAddrBit); + + memAWrite <= memBRead; + + state <= State_Resync; + + when State_AddSP => + + state <= State_Add; + + when State_Add => + + memAAddr <= sp; + + memAWriteEnable <= '1'; + + memAWrite <= memARead + memBRead; + + state <= State_Fetch; + + when State_Or => + + memAAddr <= sp; + + memAWriteEnable <= '1'; + + memAWrite <= memARead or memBRead; + + state <= State_Fetch; + + when State_Resync => + + memAAddr <= sp; + + state <= State_Fetch; + + when State_And => + + memAAddr <= sp; + + memAWriteEnable <= '1'; + + memAWrite <= memARead and memBRead; + + state <= State_Fetch; + + when others => + + null; + + end case; + + + + end if; + + end process; + + + +end behave; -- cgit v1.1 From 7a1fb6dbe419749a2acf4ce583d7732480264ba6 Mon Sep 17 00:00:00 2001 From: oharboe Date: Wed, 30 Apr 2008 18:12:06 +0000 Subject: wip to fix some synthesizing problems w/Synopsis --- zpu/hdl/zpu4/src/zpu_core_small_wip.vhd | 1155 +++++++++---------------------- 1 file changed, 338 insertions(+), 817 deletions(-) (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/zpu_core_small_wip.vhd b/zpu/hdl/zpu4/src/zpu_core_small_wip.vhd index 60ad070..63e02e4 100644 --- a/zpu/hdl/zpu4/src/zpu_core_small_wip.vhd +++ b/zpu/hdl/zpu4/src/zpu_core_small_wip.vhd @@ -1,260 +1,131 @@ -- Company: ZPU3 - --- Engineer: �yvind Harboe - - +-- Engineer: Øyvind Harboe library IEEE; - use IEEE.STD_LOGIC_1164.ALL; - use ieee.numeric_std.all; - - library work; - use work.zpu_config.all; - use work.zpupkg.all; - entity zpu_core is - - Port ( clk : in std_logic; - - areset : in std_logic; - - enable : in std_logic; - - in_mem_busy : in std_logic; - - mem_read : in std_logic_vector(wordSize-1 downto 0); - - mem_write : out std_logic_vector(wordSize-1 downto 0); - - out_mem_addr : out std_logic_vector(maxAddrBitIncIO - -downto 0); - - out_mem_writeEnable : out std_logic; - - out_mem_readEnable : out std_logic; - - mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); - - interrupt : in std_logic; - - break : out std_logic - - ); - - - + Port ( clk : in std_logic; + areset : in std_logic; + enable : in std_logic; + in_mem_busy : in std_logic; + mem_read : in std_logic_vector(wordSize-1 downto 0); + mem_write : out std_logic_vector(wordSize-1 downto 0); + out_mem_addr : out std_logic_vector(maxAddrBitIncIO downto 0); + out_mem_writeEnable : out std_logic; + out_mem_readEnable : out std_logic; + mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); + interrupt : in std_logic; + break : out std_logic); end zpu_core; - - architecture behave of zpu_core is - - -signal readIO : std_logic; - - - - +signal readIO : std_logic; signal memAWriteEnable : std_logic; - signal memAAddr : unsigned(maxAddrBit downto minAddrBit); - signal memAWrite : unsigned(wordSize-1 downto 0); - signal memARead : unsigned(wordSize-1 downto 0); - signal memBWriteEnable : std_logic; - signal memBAddr : unsigned(maxAddrBit downto minAddrBit); - signal memBWrite : unsigned(wordSize-1 downto 0); - signal memBRead : unsigned(wordSize-1 downto 0); -signal pc : unsigned(maxAddrBit downto 0); - -signal sp : unsigned(maxAddrBit downto minAddrBit); - - - -signal idim_flag : std_logic; - - - ---signal storeToStack : std_logic; - ---signal fetchNextInstruction : std_logic; - ---signal extraCycle : std_logic; - - - -signal busy : std_logic; - ---signal fetching : std_logic; - - +signal pc : unsigned(maxAddrBit downto 0); +signal sp : unsigned(maxAddrBit downto minAddrBit); -signal begin_inst : std_logic; +signal idim_flag : std_logic; +--signal storeToStack : std_logic; +--signal fetchNextInstruction : std_logic; +--signal extraCycle : std_logic; +signal busy : std_logic; +--signal fetching : std_logic; +signal begin_inst : std_logic; -signal trace_opcode : std_logic_vector(7 downto 0); - -signal trace_pc : std_logic_vector(maxAddrBitIncIO downto 0); - -signal trace_sp : std_logic_vector(maxAddrBitIncIO downto - -minAddrBit); - -signal trace_topOfStack : std_logic_vector(wordSize-1 downto 0); - -signal trace_topOfStackB : std_logic_vector(wordSize-1 downto 0); +signal trace_opcode : std_logic_vector(7 downto 0); +signal trace_pc : std_logic_vector(maxAddrBitIncIO downto 0); +signal trace_sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal trace_topOfStack : std_logic_vector(wordSize-1 downto 0); +signal trace_topOfStackB : std_logic_vector(wordSize-1 downto 0); -- state machine. - type State_Type is - ( - State_Fetch, - State_WriteIODone, - State_Execute, - State_StoreToStack, - State_Add, - State_Or, - State_And, - State_Store, - State_ReadIO, - State_WriteIO, - State_Load, - State_FetchNext, - State_AddSP, - State_ReadIODone, - State_Decode, - State_Resync - ); - - type DecodedOpcodeType is - ( - Decoded_Nop, - Decoded_Im, - Decoded_ImShift, - Decoded_LoadSP, - -Decoded_StoreSP , - +Decoded_StoreSP , Decoded_AddSP, - Decoded_Emulate, - Decoded_Break, - Decoded_PushSP, - Decoded_PopPC, - Decoded_Add, - Decoded_Or, - Decoded_And, - Decoded_Load, - Decoded_Not, - Decoded_Flip, - Decoded_Store, - Decoded_PopSP - ); - - signal sampledOpcode : std_logic_vector(OpCode_Size-1 downto 0); - signal opcode : std_logic_vector(OpCode_Size-1 downto 0); - - signal decodedOpcode : DecodedOpcodeType; - signal sampledDecodedOpcode : DecodedOpcodeType; - - - signal state : State_Type; - - -subtype AddrBitBRAM_range is natural range maxAddrBitBRAM downto - -minAddrBit; - +subtype AddrBitBRAM_range is natural range maxAddrBitBRAM downto minAddrBit; signal memAAddr_stdlogic : std_logic_vector(AddrBitBRAM_range); - signal memAWrite_stdlogic : std_logic_vector(memAWrite'range); - signal memARead_stdlogic : std_logic_vector(memARead'range); - signal memBAddr_stdlogic : std_logic_vector(AddrBitBRAM_range); - signal memBWrite_stdlogic : std_logic_vector(memBWrite'range); - signal memBRead_stdlogic : std_logic_vector(memBRead'range); - - --- debug - -subtype index is integer range 0 to 31; +subtype index is integer range 0 to 3; signal tOpcode_sel : index; @@ -263,34 +134,20 @@ signal tOpcode_sel : index; begin - - traceFileGenerate: - + traceFileGenerate: if Generate_Trace generate - - trace_file: trace port map ( - - clk => clk, - - begin_inst => begin_inst, - - pc => trace_pc, - - opcode => trace_opcode, - - sp => trace_sp, - - memA => trace_topOfStack, - - memB => trace_topOfStackB, - - busy => busy, - - intsp => (others => 'U') - + trace_file: trace port map ( + clk => clk, + begin_inst => begin_inst, + pc => trace_pc, + opcode => trace_opcode, + sp => trace_sp, + memA => trace_topOfStack, + memB => trace_topOfStackB, + busy => busy, + intsp => (others => 'U') ); - - end generate; + end generate; @@ -300,64 +157,36 @@ begin - memAAddr_stdlogic <= std_logic_vector(memAAddr(AddrBitBRAM_range)); - - memAWrite_stdlogic <= std_logic_vector(memAWrite); - - memBAddr_stdlogic <= std_logic_vector(memBAddr(AddrBitBRAM_range)); - - memBWrite_stdlogic <= std_logic_vector(memBWrite); - - memory: dualport_ram port map ( - - clk => clk, - - memAWriteEnable => memAWriteEnable, - - memAAddr => memAAddr_stdlogic, - - memAWrite => memAWrite_stdlogic, - - memARead => memARead_stdlogic, - - memBWriteEnable => memBWriteEnable, - - memBAddr => memBAddr_stdlogic, - - memBWrite => memBWrite_stdlogic, - - memBRead => memBRead_stdlogic - + memAAddr_stdlogic <= std_logic_vector(memAAddr(AddrBitBRAM_range)); + memAWrite_stdlogic <= std_logic_vector(memAWrite); + memBAddr_stdlogic <= std_logic_vector(memBAddr(AddrBitBRAM_range)); + memBWrite_stdlogic <= std_logic_vector(memBWrite); + memory: dualport_ram port map ( + clk => clk, + memAWriteEnable => memAWriteEnable, + memAAddr => memAAddr_stdlogic, + memAWrite => memAWrite_stdlogic, + memARead => memARead_stdlogic, + memBWriteEnable => memBWriteEnable, + memBAddr => memBAddr_stdlogic, + memBWrite => memBWrite_stdlogic, + memBRead => memBRead_stdlogic ); - - memARead <= unsigned(memARead_stdlogic); - - memBRead <= unsigned(memBRead_stdlogic); - - - -tOpcode_sel <= to_integer(pc(minAddrBit-1 downto 0)); - + memARead <= unsigned(memARead_stdlogic); + memBRead <= unsigned(memBRead_stdlogic); - decodeControl: - process(memBRead, pc,tOpcode_sel) + tOpcode_sel <= to_integer(pc(minAddrBit-1 downto 0)); - variable tOpcode : std_logic_vector(OpCode_Size-1 downto 0); - begin - -- not worked with synopsys - - -- tOpcode := - -std_logic_vector(memBRead((wordBytes-1-to_integer(pc(minAddrBit-1 - -downto 0))+1)*8-1 downto (wordBytes-1-to_integer(pc(minAddrBit-1 - -downto 0)))*8)); + decodeControl: + process(memBRead, pc,tOpcode_sel) + variable tOpcode : std_logic_vector(OpCode_Size-1 downto 0); + begin + -- simplify opcode selection a bit so it passes more synthesizers case (tOpcode_sel) is when 0 => tOpcode := std_logic_vector(memBRead(31 downto 24)); @@ -368,589 +197,281 @@ downto 0)))*8)); when 3 => tOpcode := std_logic_vector(memBRead(7 downto 0)); - when others => tOpcode := std_logic_vector(memBRead(7 - -downto 0)); - + when others => tOpcode := std_logic_vector(memBRead(7 downto 0)); end case; - sampledOpcode <= tOpcode; - - - - if (tOpcode(7 downto 7)=OpCode_Im) then - - sampledDecodedOpcode<=Decoded_Im; - - elsif (tOpcode(7 downto 5)=OpCode_StoreSP) then - - sampledDecodedOpcode<=Decoded_StoreSP; - - elsif (tOpcode(7 downto 5)=OpCode_LoadSP) then - - sampledDecodedOpcode<=Decoded_LoadSP; - - elsif (tOpcode(7 downto 5)=OpCode_Emulate) then - - sampledDecodedOpcode<=Decoded_Emulate; - - elsif (tOpcode(7 downto 4)=OpCode_AddSP) then - - sampledDecodedOpcode<=Decoded_AddSP; - - else - - case tOpcode(3 downto 0) is - - when OpCode_Break => - - sampledDecodedOpcode<=Decoded_Break; - - when OpCode_PushSP => - - sampledDecodedOpcode<=Decoded_PushSP; - - when OpCode_PopPC => - - sampledDecodedOpcode<=Decoded_PopPC; - - when OpCode_Add => - - sampledDecodedOpcode<=Decoded_Add; - - when OpCode_Or => - - sampledDecodedOpcode<=Decoded_Or; - - when OpCode_And => - - sampledDecodedOpcode<=Decoded_And; - - when OpCode_Load => - - sampledDecodedOpcode<=Decoded_Load; - - when OpCode_Not => - - sampledDecodedOpcode<=Decoded_Not; - - when OpCode_Flip => - - sampledDecodedOpcode<=Decoded_Flip; - - when OpCode_Store => - - sampledDecodedOpcode<=Decoded_Store; - - when OpCode_PopSP => - - sampledDecodedOpcode<=Decoded_PopSP; - - when others => - - sampledDecodedOpcode<=Decoded_Nop; - - end case; - - end if; - - end process; - - - - - - opcodeControl: - - process(clk, areset) - - variable spOffset : unsigned(4 downto 0); - - begin - - if areset = '1' then - - state <= State_Resync; - - break <= '0'; - - sp <= unsigned(spStart(maxAddrBit downto minAddrBit)); - - pc <= (others => '0'); - - idim_flag <= '0'; - - begin_inst <= '0'; - - memAAddr <= (others => '0'); - - memBAddr <= (others => '0'); - - memAWriteEnable <= '0'; - - memBWriteEnable <= '0'; - - out_mem_writeEnable <= '0'; - - out_mem_readEnable <= '0'; - - memAWrite <= (others => '0'); - - memBWrite <= (others => '0'); - - -- avoid Latch in synopsys - - -- mem_writeMask <= (others => '1'); - - elsif (clk'event and clk = '1') then - - memAWriteEnable <= '0'; - - memBWriteEnable <= '0'; - - -- This saves ca. 100 LUT's, by explicitly declaring that the - - -- memAWrite can be left at whatever value if - -memAWriteEnable is - - -- not set. - - memAWrite <= (others => DontCareValue); - - memBWrite <= (others => DontCareValue); - --- out_mem_addr <= (others => DontCareValue); - --- mem_write <= (others => DontCareValue); - - spOffset := (others => DontCareValue); - - memAAddr <= (others => DontCareValue); - - memBAddr <= (others => DontCareValue); - - - - out_mem_writeEnable <= '0'; - - out_mem_readEnable <= '0'; - - begin_inst <= '0'; - - out_mem_addr <= std_logic_vector(memARead(maxAddrBitIncIO - -downto 0)); - - mem_write <= std_logic_vector(memBRead); - - - - decodedOpcode <= sampledDecodedOpcode; - - opcode <= sampledOpcode; - - - - case state is - - when State_Execute => - - state <= State_Fetch; - - -- at this point: - - -- memBRead contains opcode word - - -- memARead contains top of stack - - pc <= pc + 1; - - - - -- trace - - begin_inst <= '1'; - - trace_pc <= (others => '0'); - - trace_pc(maxAddrBit downto 0) <= std_logic_vector(pc); - - trace_opcode <= opcode; - - trace_sp <= (others => '0'); - - trace_sp(maxAddrBit downto minAddrBit) <= - -std_logic_vector(sp); - - trace_topOfStack <= std_logic_vector(memARead); - - trace_topOfStackB <= std_logic_vector(memBRead); - - - - -- during the next cycle we'll be reading the next - -opcode - - spOffset(4):=not opcode(4); - - spOffset(3 downto 0) := unsigned(opcode(3 downto 0)); - - - - idim_flag <= '0'; - - case decodedOpcode is - - when Decoded_Im => - - idim_flag <= '1'; - - memAWriteEnable <= '1'; - - if (idim_flag='0') then - - sp <= sp - 1; - - memAAddr <= sp-1; - - for i in wordSize-1 downto 7 loop - - memAWrite(i) <= opcode(6); - - end loop; - - memAWrite(6 downto 0) <= - -unsigned(opcode(6 downto 0)); - - else - - memAAddr <= sp; - - memAWrite(wordSize-1 downto 7) <= - -memARead(wordSize-8 downto 0); - - memAWrite(6 downto 0) <= - -unsigned(opcode(6 downto 0)); - - end if; - - when Decoded_StoreSP => - - memBWriteEnable <= '1'; - - memBAddr <= sp+spOffset; - - memBWrite <= memARead; - - sp <= sp + 1; - - state <= State_Resync; - - when Decoded_LoadSP => - - sp <= sp - 1; - - memAAddr <= sp+spOffset; - - when Decoded_Emulate => - - sp <= sp - 1; - - memAWriteEnable <= '1'; - - memAAddr <= sp - 1; - - memAWrite <= (others => DontCareValue); - - memAWrite(maxAddrBit downto 0) <= pc + 1; - - -- The emulate address is: - - -- 98 7654 3210 - - -- 0000 00aa aaa0 0000 - - pc <= (others => '0'); - - pc(9 downto 5) <= unsigned(opcode(4 downto - -0)); - - when Decoded_AddSP => - - memAAddr <= sp; - - memBAddr <= sp+spOffset; - - state <= State_AddSP; - - when Decoded_Break => - - report "Break instruction encountered" - -severity failure; - - break <= '1'; - - when Decoded_PushSP => - - memAWriteEnable <= '1'; - - memAAddr <= sp - 1; - - sp <= sp - 1; - - memAWrite <= (others => DontCareValue); - - memAWrite(maxAddrBit downto minAddrBit) <= sp; - - when Decoded_PopPC => - - pc <= memARead(maxAddrBit downto 0); - - sp <= sp + 1; - - state <= State_Resync; - - when Decoded_Add => - - sp <= sp + 1; - - state <= State_Add; - - when Decoded_Or => - - sp <= sp + 1; - - state <= State_Or; - - when Decoded_And => - - sp <= sp + 1; - - state <= State_And; - - when Decoded_Load => - - if (memARead(ioBit)='1') then - - out_mem_addr <= - -std_logic_vector(memARead(maxAddrBitIncIO downto 0)); - - out_mem_readEnable <= '1'; - - state <= State_ReadIO; - - else - - memAAddr <= memARead(maxAddrBit downto - -minAddrBit); - - end if; - - when Decoded_Not => - - memAAddr <= sp(maxAddrBit downto minAddrBit); - - memAWriteEnable <= '1'; - - memAWrite <= not memARead; - - when Decoded_Flip => - - memAAddr <= sp(maxAddrBit downto minAddrBit); - - memAWriteEnable <= '1'; - - for i in 0 to wordSize-1 loop - - memAWrite(i) <= memARead(wordSize-1-i); - - end loop; - - when Decoded_Store => - - memBAddr <= sp + 1; - - sp <= sp + 1; - - if (memARead(ioBit)='1') then - - state <= State_WriteIO; - - else - - state <= State_Store; - - end if; - - when Decoded_PopSP => - - sp <= memARead(maxAddrBit downto minAddrBit); - - state <= State_Resync; - - when Decoded_Nop => - - memAAddr <= sp; - - when others => - - null; - - end case; - - when State_ReadIO => - - if (in_mem_busy = '0') then - - state <= State_Fetch; - - memAWriteEnable <= '1'; - - memAWrite <= unsigned(mem_read); - - end if; - - when State_WriteIO => - - sp <= sp + 1; - - out_mem_writeEnable <= '1'; - - out_mem_addr <= - -std_logic_vector(memARead(maxAddrBitIncIO downto 0)); - - mem_write <= std_logic_vector(memBRead); - - state <= State_WriteIODone; - - when State_WriteIODone => - - if (in_mem_busy = '0') then - - state <= State_Resync; - - end if; - - when State_Fetch => - - -- We need to resync. During the *next* cycle - - -- we'll fetch the opcode @ pc and thus it will - - -- be available for State_Execute the cycle after - - -- next - - memBAddr <= pc(maxAddrBit downto minAddrBit); - - state <= State_FetchNext; - - when State_FetchNext => - - -- at this point memARead contains the value that - -is either - - -- from the top of stack or should be copied to - -the top of the stack - - memAWriteEnable <= '1'; - - memAWrite <= memARead; - - memAAddr <= sp; - - memBAddr <= sp + 1; - - state <= State_Decode; - - when State_Decode => - - -- during the State_Execute cycle we'll be - -fetching SP+1 - - memAAddr <= sp; - - memBAddr <= sp + 1; - - state <= State_Execute; - - when State_Store => - - sp <= sp + 1; - - memAWriteEnable <= '1'; - - memAAddr <= memARead(maxAddrBit downto minAddrBit); - - memAWrite <= memBRead; - - state <= State_Resync; - - when State_AddSP => - - state <= State_Add; - - when State_Add => - - memAAddr <= sp; - - memAWriteEnable <= '1'; - - memAWrite <= memARead + memBRead; - - state <= State_Fetch; - - when State_Or => - - memAAddr <= sp; - - memAWriteEnable <= '1'; - - memAWrite <= memARead or memBRead; - - state <= State_Fetch; - - when State_Resync => - - memAAddr <= sp; - - state <= State_Fetch; - - when State_And => - - memAAddr <= sp; - - memAWriteEnable <= '1'; - - memAWrite <= memARead and memBRead; - - state <= State_Fetch; - - when others => - - null; - - end case; - - - - end if; - - end process; + sampledOpcode <= tOpcode; + + if (tOpcode(7 downto 7)=OpCode_Im) then + sampledDecodedOpcode<=Decoded_Im; + elsif (tOpcode(7 downto 5)=OpCode_StoreSP) then + sampledDecodedOpcode<=Decoded_StoreSP; + elsif (tOpcode(7 downto 5)=OpCode_LoadSP) then + sampledDecodedOpcode<=Decoded_LoadSP; + elsif (tOpcode(7 downto 5)=OpCode_Emulate) then + sampledDecodedOpcode<=Decoded_Emulate; + elsif (tOpcode(7 downto 4)=OpCode_AddSP) then + sampledDecodedOpcode<=Decoded_AddSP; + else + case tOpcode(3 downto 0) is + when OpCode_Break => + sampledDecodedOpcode<=Decoded_Break; + when OpCode_PushSP => + sampledDecodedOpcode<=Decoded_PushSP; + when OpCode_PopPC => + sampledDecodedOpcode<=Decoded_PopPC; + when OpCode_Add => + sampledDecodedOpcode<=Decoded_Add; + when OpCode_Or => + sampledDecodedOpcode<=Decoded_Or; + when OpCode_And => + sampledDecodedOpcode<=Decoded_And; + when OpCode_Load => + sampledDecodedOpcode<=Decoded_Load; + when OpCode_Not => + sampledDecodedOpcode<=Decoded_Not; + when OpCode_Flip => + sampledDecodedOpcode<=Decoded_Flip; + when OpCode_Store => + sampledDecodedOpcode<=Decoded_Store; + when OpCode_PopSP => + sampledDecodedOpcode<=Decoded_PopSP; + when others => + sampledDecodedOpcode<=Decoded_Nop; + end case; + end if; + end process; + + + opcodeControl: + process(clk, areset) + variable spOffset : unsigned(4 downto 0); + begin + if areset = '1' then + state <= State_Resync; + break <= '0'; + sp <= unsigned(spStart(maxAddrBit downto minAddrBit)); + pc <= (others => '0'); + idim_flag <= '0'; + begin_inst <= '0'; + memAAddr <= (others => '0'); + memBAddr <= (others => '0'); + memAWriteEnable <= '0'; + memBWriteEnable <= '0'; + out_mem_writeEnable <= '0'; + out_mem_readEnable <= '0'; + memAWrite <= (others => '0'); + memBWrite <= (others => '0'); + elsif (clk'event and clk = '1') then + memAWriteEnable <= '0'; + memBWriteEnable <= '0'; + -- This saves ca. 100 LUT's, by explicitly declaring that the + -- memAWrite can be left at whatever value if memAWriteEnable is + -- not set. + memAWrite <= (others => DontCareValue); + memBWrite <= (others => DontCareValue); +-- out_mem_addr <= (others => DontCareValue); +-- mem_write <= (others => DontCareValue); + spOffset := (others => DontCareValue); + memAAddr <= (others => DontCareValue); + memBAddr <= (others => DontCareValue); + + out_mem_writeEnable <= '0'; + out_mem_readEnable <= '0'; + begin_inst <= '0'; + out_mem_addr <= std_logic_vector(memARead(maxAddrBitIncIO downto 0)); + mem_write <= std_logic_vector(memBRead); + + decodedOpcode <= sampledDecodedOpcode; + opcode <= sampledOpcode; + + case state is + when State_Execute => + state <= State_Fetch; + -- at this point: + -- memBRead contains opcode word + -- memARead contains top of stack + pc <= pc + 1; + + -- trace + begin_inst <= '1'; + trace_pc <= (others => '0'); + trace_pc(maxAddrBit downto 0) <= std_logic_vector(pc); + trace_opcode <= opcode; + trace_sp <= (others => '0'); + trace_sp(maxAddrBit downto minAddrBit) <= std_logic_vector(sp); + trace_topOfStack <= std_logic_vector(memARead); + trace_topOfStackB <= std_logic_vector(memBRead); + + -- during the next cycle we'll be reading the next opcode + spOffset(4):=not opcode(4); + spOffset(3 downto 0) := unsigned(opcode(3 downto 0)); + + idim_flag <= '0'; + case decodedOpcode is + when Decoded_Im => + idim_flag <= '1'; + memAWriteEnable <= '1'; + if (idim_flag='0') then + sp <= sp - 1; + memAAddr <= sp-1; + for i in wordSize-1 downto 7 loop + memAWrite(i) <= opcode(6); + end loop; + memAWrite(6 downto 0) <= unsigned(opcode(6 downto 0)); + else + memAAddr <= sp; + memAWrite(wordSize-1 downto 7) <= memARead(wordSize-8 downto 0); + memAWrite(6 downto 0) <= unsigned(opcode(6 downto 0)); + end if; + when Decoded_StoreSP => + memBWriteEnable <= '1'; + memBAddr <= sp+spOffset; + memBWrite <= memARead; + sp <= sp + 1; + state <= State_Resync; + when Decoded_LoadSP => + sp <= sp - 1; + memAAddr <= sp+spOffset; + when Decoded_Emulate => + sp <= sp - 1; + memAWriteEnable <= '1'; + memAAddr <= sp - 1; + memAWrite <= (others => DontCareValue); + memAWrite(maxAddrBit downto 0) <= pc + 1; + -- The emulate address is: + -- 98 7654 3210 + -- 0000 00aa aaa0 0000 + pc <= (others => '0'); + pc(9 downto 5) <= unsigned(opcode(4 downto 0)); + when Decoded_AddSP => + memAAddr <= sp; + memBAddr <= sp+spOffset; + state <= State_AddSP; + when Decoded_Break => + report "Break instruction encountered" severity failure; + break <= '1'; + when Decoded_PushSP => + memAWriteEnable <= '1'; + memAAddr <= sp - 1; + sp <= sp - 1; + memAWrite <= (others => DontCareValue); + memAWrite(maxAddrBit downto minAddrBit) <= sp; + when Decoded_PopPC => + pc <= memARead(maxAddrBit downto 0); + sp <= sp + 1; + state <= State_Resync; + when Decoded_Add => + sp <= sp + 1; + state <= State_Add; + when Decoded_Or => + sp <= sp + 1; + state <= State_Or; + when Decoded_And => + sp <= sp + 1; + state <= State_And; + when Decoded_Load => + if (memARead(ioBit)='1') then + out_mem_addr <= std_logic_vector(memARead(maxAddrBitIncIO downto 0)); + out_mem_readEnable <= '1'; + state <= State_ReadIO; + else + memAAddr <= memARead(maxAddrBit downto minAddrBit); + end if; + when Decoded_Not => + memAAddr <= sp(maxAddrBit downto minAddrBit); + memAWriteEnable <= '1'; + memAWrite <= not memARead; + when Decoded_Flip => + memAAddr <= sp(maxAddrBit downto minAddrBit); + memAWriteEnable <= '1'; + for i in 0 to wordSize-1 loop + memAWrite(i) <= memARead(wordSize-1-i); + end loop; + when Decoded_Store => + memBAddr <= sp + 1; + sp <= sp + 1; + if (memARead(ioBit)='1') then + state <= State_WriteIO; + else + state <= State_Store; + end if; + when Decoded_PopSP => + sp <= memARead(maxAddrBit downto minAddrBit); + state <= State_Resync; + when Decoded_Nop => + memAAddr <= sp; + when others => + null; + end case; + when State_ReadIO => + if (in_mem_busy = '0') then + state <= State_Fetch; + memAWriteEnable <= '1'; + memAWrite <= unsigned(mem_read); + end if; + when State_WriteIO => + sp <= sp + 1; + out_mem_writeEnable <= '1'; + out_mem_addr <= std_logic_vector(memARead(maxAddrBitIncIO downto 0)); + mem_write <= std_logic_vector(memBRead); + state <= State_WriteIODone; + when State_WriteIODone => + if (in_mem_busy = '0') then + state <= State_Resync; + end if; + when State_Fetch => + -- We need to resync. During the *next* cycle + -- we'll fetch the opcode @ pc and thus it will + -- be available for State_Execute the cycle after + -- next + memBAddr <= pc(maxAddrBit downto minAddrBit); + state <= State_FetchNext; + when State_FetchNext => + -- at this point memARead contains the value that is either + -- from the top of stack or should be copied to the top of the stack + memAWriteEnable <= '1'; + memAWrite <= memARead; + memAAddr <= sp; + memBAddr <= sp + 1; + state <= State_Decode; + when State_Decode => + -- during the State_Execute cycle we'll be fetching SP+1 + memAAddr <= sp; + memBAddr <= sp + 1; + state <= State_Execute; + when State_Store => + sp <= sp + 1; + memAWriteEnable <= '1'; + memAAddr <= memARead(maxAddrBit downto minAddrBit); + memAWrite <= memBRead; + state <= State_Resync; + when State_AddSP => + state <= State_Add; + when State_Add => + memAAddr <= sp; + memAWriteEnable <= '1'; + memAWrite <= memARead + memBRead; + state <= State_Fetch; + when State_Or => + memAAddr <= sp; + memAWriteEnable <= '1'; + memAWrite <= memARead or memBRead; + state <= State_Fetch; + when State_Resync => + memAAddr <= sp; + state <= State_Fetch; + when State_And => + memAAddr <= sp; + memAWriteEnable <= '1'; + memAWrite <= memARead and memBRead; + state <= State_Fetch; + when others => + null; + end case; + + end if; + end process; -- cgit v1.1 From 30faee20f811215e6d53ca2434119aa5cd059feb Mon Sep 17 00:00:00 2001 From: oharboe Date: Thu, 1 May 2008 08:20:02 +0000 Subject: work in progress. --- zpu/hdl/zpu4/src/zpu_core_wip.vhd | 948 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 948 insertions(+) create mode 100644 zpu/hdl/zpu4/src/zpu_core_wip.vhd (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/zpu_core_wip.vhd b/zpu/hdl/zpu4/src/zpu_core_wip.vhd new file mode 100644 index 0000000..882719d --- /dev/null +++ b/zpu/hdl/zpu4/src/zpu_core_wip.vhd @@ -0,0 +1,948 @@ + +-- Company: ZPU4 generic memory interface CPU +-- Engineer: Øyvind Harboe + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; +use IEEE.STD_LOGIC_arith.ALL; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; + + + + + +entity zpu_core is + Port ( clk : in std_logic; + areset : in std_logic; + enable : in std_logic; + mem_req : out std_logic; + mem_we : out std_logic; + mem_ack : in std_logic; + mem_read : in std_logic_vector(wordSize-1 downto 0); + mem_write : out std_logic_vector(wordSize-1 downto 0); + out_mem_addr : out std_logic_vector(maxAddrBitIncIO downto 0); + mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); + interrupt : in std_logic; + break : out std_logic; + zpu_status : out std_logic_vector(63 downto 0)); +end zpu_core; + +architecture behave of zpu_core is + +type InsnType is +( +State_AddTop, +State_Dup, +State_DupStackB, +State_Pop, +State_Popdown, +State_Add, +State_Or, +State_And, +State_Store, +State_AddSP, +State_Shift, +State_Nop, +State_Im, +State_LoadSP, +State_StoreSP, +State_Emulate, +State_Load, +State_PushPC, +State_PushSP, +State_PopPC, +State_PopPCRel, +State_Not, +State_Flip, +State_PopSP, +State_Neqbranch, +State_Eq, +State_Loadb, +State_Mult, +State_Lessthan, +State_Lessthanorequal, +State_Ulessthanorequal, +State_Ulessthan, +State_Pushspadd, +State_Call, +State_Callpcrel, +State_Sub, +State_Break, +State_Storeb, +State_Interrupt, +State_InsnFetch +); + +type StateType is +( +State_Idle, -- using first state first on the list out of paranoia +State_Load2, +State_Popped, +State_LoadSP2, +State_LoadSP3, +State_AddSP2, +State_Fetch, +State_Execute, +State_Decode, +State_Decode2, +State_Resync, + +State_StoreSP2, +State_Resync2, +State_Resync3, +State_Loadb2, +State_Storeb2, +State_Mult2, +State_Mult3, +State_Mult5, +State_Mult6, +State_Mult4, +State_BinaryOpResult +); + + +signal pc : std_logic_vector(maxAddrBitIncIO downto 0); +signal sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal incSp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal incIncSp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal decSp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal stackA : std_logic_vector(wordSize-1 downto 0); +signal binaryOpResult : std_logic_vector(wordSize-1 downto 0); +signal multResult2 : std_logic_vector(wordSize-1 downto 0); +signal multResult3 : std_logic_vector(wordSize-1 downto 0); +signal multResult : std_logic_vector(wordSize-1 downto 0); +signal multA : std_logic_vector(wordSize-1 downto 0); +signal multB : std_logic_vector(wordSize-1 downto 0); +signal stackB : std_logic_vector(wordSize-1 downto 0); +signal idim_flag : std_logic; +signal busy : std_logic; +signal mem_readEnable : std_logic; +signal mem_addr : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal mem_delayAddr : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal mem_delayReadEnable : std_logic; +signal mem_busy : std_logic; +signal decodeWord : std_logic_vector(wordSize-1 downto 0); + + +signal state : StateType; +signal insn : InsnType; +type InsnArray is array(0 to wordBytes-1) of InsnType; +signal decodedOpcode : InsnArray; + +type OpcodeArray is array(0 to wordBytes-1) of std_logic_vector(7 downto 0); + +signal opcode : OpcodeArray; + + + + +signal begin_inst : std_logic; +signal trace_opcode : std_logic_vector(7 downto 0); +signal trace_pc : std_logic_vector(maxAddrBitIncIO downto 0); +signal trace_sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); +signal trace_topOfStack : std_logic_vector(wordSize-1 downto 0); +signal trace_topOfStackB : std_logic_vector(wordSize-1 downto 0); + +signal out_mem_req : std_logic; + +signal inInterrupt : std_logic; + +-- state machine. + +begin + + zpu_status(maxAddrBitIncIO downto 0) <= trace_pc; + zpu_status(31) <= '1'; + zpu_status(39 downto 32) <= trace_opcode; + zpu_status(40) <= '1' when (state = State_Idle) else '0'; + zpu_status(62) <= '1'; + + traceFileGenerate: + if Generate_Trace generate + trace_file: trace port map ( + clk => clk, + begin_inst => begin_inst, + pc => trace_pc, + opcode => trace_opcode, + sp => trace_sp, + memA => trace_topOfStack, + memB => trace_topOfStackB, + busy => busy, + intsp => (others => 'U') + ); + end generate; + + + -- the memory subsystem will tell us one cycle later whether or + -- not it is busy + out_mem_addr(maxAddrBitIncIO downto minAddrBit) <= mem_addr; + out_mem_addr(minAddrBit-1 downto 0) <= (others => '0'); + mem_req <= out_mem_req; + + incSp <= sp + 1; + incIncSp <= sp + 2; + decSp <= sp - 1; + + mem_busy <= out_mem_req and not mem_ack; -- '1' when the memory is busy + + opcodeControl: + process(clk, areset) + variable tOpcode : std_logic_vector(OpCode_Size-1 downto 0); + variable spOffset : std_logic_vector(4 downto 0); + variable tSpOffset : std_logic_vector(4 downto 0); + variable nextPC : std_logic_vector(maxAddrBitIncIO downto 0); + variable tNextState : InsnType; + variable tDecodedOpcode : InsnArray; + variable tMultResult : std_logic_vector(wordSize*2-1 downto 0); + begin + if areset = '1' then + state <= State_Idle; + break <= '0'; + sp <= spStart(maxAddrBitIncIO downto minAddrBit); + + pc <= (others => '0'); + idim_flag <= '0'; + begin_inst <= '0'; + mem_we <= '0'; + multA <= (others => '0'); + multB <= (others => '0'); + mem_writeMask <= (others => '1'); + out_mem_req <= '0'; + mem_addr <= (others => DontCareValue); + mem_write <= (others => DontCareValue); + inInterrupt <= '0'; + elsif (clk'event and clk = '1') then + -- we must multiply unconditionally to get pipelined multiplication + tMultResult := multA * multB; + multResult3 <= multResult2; + multResult2 <= multResult; + multResult <= tMultResult(wordSize-1 downto 0); + + + spOffset(4):=not opcode(conv_integer(pc(byteBits-1 downto 0)))(4); + spOffset(3 downto 0):=opcode(conv_integer(pc(byteBits-1 downto 0)))(3 downto 0); + nextPC := pc + 1; + + -- prepare trace snapshot + trace_opcode <= opcode(conv_integer(pc(byteBits-1 downto 0))); + trace_pc <= pc; + trace_sp <= sp; + trace_topOfStack <= stackA; + trace_topOfStackB <= stackB; + begin_inst <= '0'; + + -- we terminate the requeset as soon as we get acknowledge + if mem_ack = '1' then + out_mem_req <= '0'; + mem_we <= '0'; + end if; + + if interrupt='0' then + inInterrupt <= '0'; -- no longer in an interrupt + end if; + + case state is + when State_Idle => + if enable='1' then + state <= State_Resync; + end if; + -- Initial state of ZPU, fetch top of stack + first instruction + when State_Resync => + if mem_busy='0' then + mem_addr <= sp; + out_mem_req <= '1'; + state <= State_Resync2; + end if; + when State_Resync2 => + if mem_busy='0' then + stackA <= mem_read; + mem_addr <= incSp; + out_mem_req <= '1'; + state <= State_Resync3; + end if; + when State_Resync3 => + if mem_busy='0' then + stackB <= mem_read; + mem_addr <= pc(maxAddrBitIncIO downto minAddrBit); + out_mem_req <= '1'; + state <= State_Decode; + end if; + when State_Decode => + if mem_busy='0' then + decodeWord <= mem_read; + state <= State_Decode2; + end if; + when State_Decode2 => + -- decode 4 instructions in parallel + for i in 0 to wordBytes-1 loop + tOpcode := decodeWord((wordBytes-1-i+1)*8-1 downto (wordBytes-1-i)*8); + + tSpOffset(4):=not tOpcode(4); + tSpOffset(3 downto 0):=tOpcode(3 downto 0); + + opcode(i) <= tOpcode; + if (tOpcode(7 downto 7)=OpCode_Im) then + tNextState:=State_Im; + elsif (tOpcode(7 downto 5)=OpCode_StoreSP) then + if tSpOffset = 0 then + tNextState := State_Pop; + elsif tSpOffset=1 then + tNextState := State_PopDown; + else + tNextState :=State_StoreSP; + end if; + elsif (tOpcode(7 downto 5)=OpCode_LoadSP) then + if tSpOffset = 0 then + tNextState :=State_Dup; + elsif tSpOffset = 1 then + tNextState :=State_DupStackB; + else + tNextState :=State_LoadSP; + end if; + elsif (tOpcode(7 downto 5)=OpCode_Emulate) then + tNextState :=State_Emulate; + if tOpcode(5 downto 0)=OpCode_Neqbranch then + tNextState :=State_Neqbranch; + elsif tOpcode(5 downto 0)=OpCode_Eq then + tNextState :=State_Eq; + elsif tOpcode(5 downto 0)=OpCode_Lessthan then + tNextState :=State_Lessthan; + elsif tOpcode(5 downto 0)=OpCode_Lessthanorequal then + --tNextState :=State_Lessthanorequal; + elsif tOpcode(5 downto 0)=OpCode_Ulessthan then + tNextState :=State_Ulessthan; + elsif tOpcode(5 downto 0)=OpCode_Ulessthanorequal then + --tNextState :=State_Ulessthanorequal; + elsif tOpcode(5 downto 0)=OpCode_Loadb then + tNextState :=State_Loadb; + elsif tOpcode(5 downto 0)=OpCode_Mult then + tNextState :=State_Mult; + elsif tOpcode(5 downto 0)=OpCode_Storeb then + tNextState :=State_Storeb; + elsif tOpcode(5 downto 0)=OpCode_Pushspadd then + tNextState :=State_Pushspadd; + elsif tOpcode(5 downto 0)=OpCode_Callpcrel then + tNextState :=State_Callpcrel; + elsif tOpcode(5 downto 0)=OpCode_Call then + --tNextState :=State_Call; + elsif tOpcode(5 downto 0)=OpCode_Sub then + tNextState :=State_Sub; + elsif tOpcode(5 downto 0)=OpCode_PopPCRel then + --tNextState :=State_PopPCRel; + end if; + elsif (tOpcode(7 downto 4)=OpCode_AddSP) then + if tSpOffset = 0 then + tNextState := State_Shift; + elsif tSpOffset = 1 then + tNextState := State_AddTop; + else + tNextState :=State_AddSP; + end if; + else + case tOpcode(3 downto 0) is + when OpCode_Nop => + tNextState :=State_Nop; + when OpCode_PushSP => + tNextState :=State_PushSP; + when OpCode_PopPC => + tNextState :=State_PopPC; + when OpCode_Add => + tNextState :=State_Add; + when OpCode_Or => + tNextState :=State_Or; + when OpCode_And => + tNextState :=State_And; + when OpCode_Load => + tNextState :=State_Load; + when OpCode_Not => + tNextState :=State_Not; + when OpCode_Flip => + tNextState :=State_Flip; + when OpCode_Store => + tNextState :=State_Store; + when OpCode_PopSP => + tNextState :=State_PopSP; + when others => + tNextState := State_Break; + + end case; + end if; + tDecodedOpcode(i) := tNextState; + + end loop; + + insn <= tDecodedOpcode(conv_integer(pc(byteBits-1 downto 0))); + + -- once we wrap, we need to fetch + tDecodedOpcode(0) := State_InsnFetch; + + decodedOpcode <= tDecodedOpcode; + state <= State_Execute; + + + + -- Each instruction must: + -- + -- 1. set idim_flag + -- 2. increase pc if applicable + -- 3. set next state if appliable + -- 4. do it's operation + + when State_Execute => + insn <= decodedOpcode(conv_integer(nextPC(byteBits-1 downto 0))); + + case insn is + when State_InsnFetch => + state <= State_Fetch; + when State_Im => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '1'; + pc <= pc + 1; + + if idim_flag='1' then + stackA(wordSize-1 downto 7) <= stackA(wordSize-8 downto 0); + stackA(6 downto 0) <= opcode(conv_integer(pc(byteBits-1 downto 0)))(6 downto 0); + else + out_mem_req <= '1'; + mem_we <= '1'; + mem_addr <= incSp; + mem_write <= stackB; + stackB <= stackA; + sp <= decSp; + for i in wordSize-1 downto 7 loop + stackA(i) <= opcode(conv_integer(pc(byteBits-1 downto 0)))(6); + end loop; + stackA(6 downto 0) <= opcode(conv_integer(pc(byteBits-1 downto 0)))(6 downto 0); + end if; + else + insn <= insn; + end if; + when State_StoreSP => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_StoreSP2; + + out_mem_req <= '1'; + mem_we <= '1'; + mem_addr <= sp+spOffset; + mem_write <= stackA; + stackA <= stackB; + sp <= incSp; + else + insn <= insn; + end if; + + + when State_LoadSP => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_LoadSP2; + + sp <= decSp; + out_mem_req <= '1'; + mem_we <= '1'; + mem_addr <= incSp; + mem_write <= stackB; + else + insn <= insn; + end if; + when State_Emulate => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + sp <= decSp; + out_mem_req <= '1'; + mem_we <= '1'; + mem_addr <= incSp; + mem_write <= stackB; + stackA <= (others => DontCareValue); + stackA(maxAddrBitIncIO downto 0) <= pc + 1; + stackB <= stackA; + + -- The emulate address is: + -- 98 7654 3210 + -- 0000 00aa aaa0 0000 + pc <= (others => '0'); + pc(9 downto 5) <= opcode(conv_integer(pc(byteBits-1 downto 0)))(4 downto 0); + state <= State_Fetch; + else + insn <= insn; + end if; + when State_Callpcrel => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + stackA <= (others => DontCareValue); + stackA(maxAddrBitIncIO downto 0) <= pc + 1; + + pc <= pc + stackA(maxAddrBitIncIO downto 0); + state <= State_Fetch; + else + insn <= insn; + end if; + when State_Call => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + stackA <= (others => DontCareValue); + stackA(maxAddrBitIncIO downto 0) <= pc + 1; + pc <= stackA(maxAddrBitIncIO downto 0); + state <= State_Fetch; + else + insn <= insn; + end if; + when State_AddSP => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_AddSP2; + + out_mem_req <= '1'; + mem_addr <= sp+spOffset; + else + insn <= insn; + end if; + when State_PushSP => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + sp <= decSp; + stackA <= (others => '0'); + stackA(maxAddrBitIncIO downto minAddrBit) <= sp; + stackB <= stackA; + out_mem_req <= '1'; + mem_we <= '1'; + mem_addr <= incSp; + mem_write <= stackB; + else + insn <= insn; + end if; + when State_PopPC => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= stackA(maxAddrBitIncIO downto 0); + sp <= incSp; + + out_mem_req <= '1'; + mem_we <= '1'; + mem_addr <= incSp; + mem_write <= stackB; + state <= State_Resync; + else + insn <= insn; + end if; + when State_PopPCRel => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= stackA(maxAddrBitIncIO downto 0) + pc; + sp <= incSp; + + out_mem_req <= '1'; + mem_we <= '1'; + mem_addr <= incSp; + mem_write <= stackB; + state <= State_Resync; + else + insn <= insn; + end if; + when State_Add => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + stackA <= stackA + stackB; + + out_mem_req <= '1'; + mem_addr <= incIncSp; + sp <= incSp; + state <= State_Popped; + else + insn <= insn; + end if; + when State_Sub => + begin_inst <= '1'; + idim_flag <= '0'; + binaryOpResult <= stackB - stackA; + state <= State_BinaryOpResult; + when State_Pop => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + mem_addr <= incIncSp; + out_mem_req <= '1'; + sp <= incSp; + stackA <= stackB; + state <= State_Popped; + else + insn <= insn; + end if; + when State_PopDown => + if mem_busy='0' then + -- PopDown leaves top of stack unchanged + begin_inst <= '1'; + idim_flag <= '0'; + mem_addr <= incIncSp; + out_mem_req <= '1'; + sp <= incSp; + state <= State_Popped; + else + insn <= insn; + end if; + when State_Or => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + stackA <= stackA or stackB; + out_mem_req <= '1'; + mem_addr <= incIncSp; + sp <= incSp; + state <= State_Popped; + else + insn <= insn; + end if; + when State_And => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + + stackA <= stackA and stackB; + out_mem_req <= '1'; + mem_addr <= incIncSp; + sp <= incSp; + state <= State_Popped; + else + insn <= insn; + end if; + when State_Eq => + begin_inst <= '1'; + idim_flag <= '0'; + + binaryOpResult <= (others => '0'); + if (stackA=stackB) then + binaryOpResult(0) <= '1'; + end if; + state <= State_BinaryOpResult; + when State_Ulessthan => + begin_inst <= '1'; + idim_flag <= '0'; + + binaryOpResult <= (others => '0'); + if (stackA + begin_inst <= '1'; + idim_flag <= '0'; + + binaryOpResult <= (others => '0'); + if (stackA<=stackB) then + binaryOpResult(0) <= '1'; + end if; + state <= State_BinaryOpResult; + when State_Lessthan => + begin_inst <= '1'; + idim_flag <= '0'; + + binaryOpResult <= (others => '0'); + if (signed(stackA) + begin_inst <= '1'; + idim_flag <= '0'; + + binaryOpResult <= (others => '0'); + if (signed(stackA)<=signed(stackB)) then + binaryOpResult(0) <= '1'; + end if; + state <= State_BinaryOpResult; + when State_Load => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_Load2; + + mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); + out_mem_req <= '1'; + else + insn <= insn; + end if; + + when State_Dup => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + sp <= decSp; + stackB <= stackA; + mem_write <= stackB; + mem_addr <= incSp; + out_mem_req <= '1'; + mem_we <= '1'; + else + insn <= insn; + end if; + when State_DupStackB => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + sp <= decSp; + stackA <= stackB; + stackB <= stackA; + mem_write <= stackB; + mem_addr <= incSp; + out_mem_req <= '1'; + mem_we <= '1'; + else + insn <= insn; + end if; + when State_Store => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); + mem_write <= stackB; + out_mem_req <= '1'; + mem_we <= '1'; + sp <= incIncSp; + state <= State_Resync; + else + insn <= insn; + end if; + when State_PopSP => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + mem_write <= stackB; + mem_addr <= incSp; + out_mem_req <= '1'; + mem_we <= '1'; + sp <= stackA(maxAddrBitIncIO downto minAddrBit); + state <= State_Resync; + else + insn <= insn; + end if; + when State_Nop => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + when State_Not => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + stackA <= not stackA; + when State_Flip => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + for i in 0 to wordSize-1 loop + stackA(i) <= stackA(wordSize-1-i); + end loop; + when State_AddTop => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + stackA <= stackA + stackB; + when State_Shift => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + stackA(wordSize-1 downto 1) <= stackA(wordSize-2 downto 0); + stackA(0) <= '0'; + when State_Pushspadd => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + stackA <= (others => '0'); + stackA(maxAddrBitIncIO downto minAddrBit) <= stackA(maxAddrBitIncIO-minAddrBit downto 0)+sp; + when State_Neqbranch => + -- branches are almost always taken as they form loops + begin_inst <= '1'; + idim_flag <= '0'; + sp <= incIncSp; + if (stackB/=0) then + pc <= stackA(maxAddrBitIncIO downto 0) + pc; + else + pc <= pc + 1; + end if; + -- need to fetch stack again. + state <= State_Resync; + when State_Mult => + begin_inst <= '1'; + idim_flag <= '0'; + + multA <= stackA; + multB <= stackB; + state <= State_Mult2; + when State_Break => + report "Break instruction encountered" severity failure; + break <= '1'; + + when State_Loadb => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_Loadb2; + + mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); + out_mem_req <= '1'; + else + insn <= insn; + end if; + when State_Storeb => + if mem_busy='0' then + begin_inst <= '1'; + idim_flag <= '0'; + state <= State_Storeb2; + + mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); + out_mem_req <= '1'; + else + insn <= insn; + end if; + + when others => +-- sp <= (others => DontCareValue); + report "Illegal instruction" severity failure; + break <= '1'; + end case; + + + when State_StoreSP2 => + if mem_busy='0' then + mem_addr <= incSp; + out_mem_req <= '1'; + state <= State_Popped; + end if; + when State_LoadSP2 => + if mem_busy='0' then + state <= State_LoadSP3; + out_mem_req <= '1'; + mem_addr <= sp+spOffset+1; + end if; + when State_LoadSP3 => + if mem_busy='0' then + pc <= pc + 1; + state <= State_Execute; + stackB <= stackA; + stackA <= mem_read; + end if; + when State_AddSP2 => + if mem_busy='0' then + pc <= pc + 1; + state <= State_Execute; + stackA <= stackA + mem_read; + end if; + when State_Load2 => + if mem_busy='0' then + stackA <= mem_read; + pc <= pc + 1; + state <= State_Execute; + end if; + when State_Loadb2 => + if mem_busy='0' then + stackA <= (others => '0'); + stackA(7 downto 0) <= mem_read(((wordBytes-1-conv_integer(stackA(byteBits-1 downto 0)))*8+7) downto (wordBytes-1-conv_integer(stackA(byteBits-1 downto 0)))*8); + pc <= pc + 1; + state <= State_Execute; + end if; + when State_Storeb2 => + if mem_busy='0' then + mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); + mem_write <= mem_read; + mem_write(((wordBytes-1-conv_integer(stackA(byteBits-1 downto 0)))*8+7) downto (wordBytes-1-conv_integer(stackA(byteBits-1 downto 0)))*8) <= stackB(7 downto 0) ; + out_mem_req <= '1'; + mem_we <= '1'; + pc <= pc + 1; + sp <= incIncSp; + state <= State_Resync; + end if; + when State_Fetch => + if mem_busy='0' then + if interrupt='1' and inInterrupt='0' and idim_flag='0' then + -- We got an interrupt + inInterrupt <= '1'; + + sp <= decSp; + out_mem_req <= '1'; + mem_we <= '1'; + mem_addr <= incSp; + mem_write <= stackB; + stackA <= (others => DontCareValue); + stackA(maxAddrBitIncIO downto 0) <= pc; + stackB <= stackA; + + pc <= conv_std_logic_vector(32, maxAddrBitIncIo+1); -- interrupt address + + report "ZPU jumped to interrupt!" severity note; + else + mem_addr <= pc(maxAddrBitIncIO downto minAddrBit); + out_mem_req <= '1'; + state <= State_Decode; + end if; + end if; + when State_Mult2 => + state <= State_Mult3; + when State_Mult3 => + state <= State_Mult4; + when State_Mult4 => + state <= State_Mult5; + when State_Mult5 => + stackA <= multResult3; + state <= State_Mult6; + when State_Mult6 => + if mem_busy='0' then + out_mem_req <= '1'; + mem_addr <= incIncSp; + sp <= incSp; + state <= State_Popped; + end if; + when State_BinaryOpResult => + if mem_busy='0' then + -- NB!!!! we know that the memory isn't busy at this point!!!! + out_mem_req <= '1'; + mem_addr <= incIncSp; + sp <= incSp; + stackA <= binaryOpResult; + state <= State_Popped; + end if; + when State_Popped => + if mem_busy='0' then + pc <= pc + 1; + stackB <= mem_read; + state <= State_Execute; + end if; + when others => +-- sp <= (others => DontCareValue); + report "Illegal state" severity failure; + break <= '1'; + end case; + end if; + end process; + + + +end behave; -- cgit v1.1 From 0d7bc56eab8ff2d28aa9c4721a56b022385e13d9 Mon Sep 17 00:00:00 2001 From: oharboe Date: Thu, 1 May 2008 08:23:39 +0000 Subject: * zpu/hdl/zy1000 - ZPU implementation used on the zy1000 dev kit --- zpu/hdl/zpu4/src/zpu_core_wip.vhd | 948 -------------------------------------- 1 file changed, 948 deletions(-) delete mode 100644 zpu/hdl/zpu4/src/zpu_core_wip.vhd (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/zpu_core_wip.vhd b/zpu/hdl/zpu4/src/zpu_core_wip.vhd deleted file mode 100644 index 882719d..0000000 --- a/zpu/hdl/zpu4/src/zpu_core_wip.vhd +++ /dev/null @@ -1,948 +0,0 @@ - --- Company: ZPU4 generic memory interface CPU --- Engineer: Øyvind Harboe - -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.STD_LOGIC_UNSIGNED.ALL; -use IEEE.STD_LOGIC_arith.ALL; - -library work; -use work.zpu_config.all; -use work.zpupkg.all; - - - - - -entity zpu_core is - Port ( clk : in std_logic; - areset : in std_logic; - enable : in std_logic; - mem_req : out std_logic; - mem_we : out std_logic; - mem_ack : in std_logic; - mem_read : in std_logic_vector(wordSize-1 downto 0); - mem_write : out std_logic_vector(wordSize-1 downto 0); - out_mem_addr : out std_logic_vector(maxAddrBitIncIO downto 0); - mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); - interrupt : in std_logic; - break : out std_logic; - zpu_status : out std_logic_vector(63 downto 0)); -end zpu_core; - -architecture behave of zpu_core is - -type InsnType is -( -State_AddTop, -State_Dup, -State_DupStackB, -State_Pop, -State_Popdown, -State_Add, -State_Or, -State_And, -State_Store, -State_AddSP, -State_Shift, -State_Nop, -State_Im, -State_LoadSP, -State_StoreSP, -State_Emulate, -State_Load, -State_PushPC, -State_PushSP, -State_PopPC, -State_PopPCRel, -State_Not, -State_Flip, -State_PopSP, -State_Neqbranch, -State_Eq, -State_Loadb, -State_Mult, -State_Lessthan, -State_Lessthanorequal, -State_Ulessthanorequal, -State_Ulessthan, -State_Pushspadd, -State_Call, -State_Callpcrel, -State_Sub, -State_Break, -State_Storeb, -State_Interrupt, -State_InsnFetch -); - -type StateType is -( -State_Idle, -- using first state first on the list out of paranoia -State_Load2, -State_Popped, -State_LoadSP2, -State_LoadSP3, -State_AddSP2, -State_Fetch, -State_Execute, -State_Decode, -State_Decode2, -State_Resync, - -State_StoreSP2, -State_Resync2, -State_Resync3, -State_Loadb2, -State_Storeb2, -State_Mult2, -State_Mult3, -State_Mult5, -State_Mult6, -State_Mult4, -State_BinaryOpResult -); - - -signal pc : std_logic_vector(maxAddrBitIncIO downto 0); -signal sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal incSp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal incIncSp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal decSp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal stackA : std_logic_vector(wordSize-1 downto 0); -signal binaryOpResult : std_logic_vector(wordSize-1 downto 0); -signal multResult2 : std_logic_vector(wordSize-1 downto 0); -signal multResult3 : std_logic_vector(wordSize-1 downto 0); -signal multResult : std_logic_vector(wordSize-1 downto 0); -signal multA : std_logic_vector(wordSize-1 downto 0); -signal multB : std_logic_vector(wordSize-1 downto 0); -signal stackB : std_logic_vector(wordSize-1 downto 0); -signal idim_flag : std_logic; -signal busy : std_logic; -signal mem_readEnable : std_logic; -signal mem_addr : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal mem_delayAddr : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal mem_delayReadEnable : std_logic; -signal mem_busy : std_logic; -signal decodeWord : std_logic_vector(wordSize-1 downto 0); - - -signal state : StateType; -signal insn : InsnType; -type InsnArray is array(0 to wordBytes-1) of InsnType; -signal decodedOpcode : InsnArray; - -type OpcodeArray is array(0 to wordBytes-1) of std_logic_vector(7 downto 0); - -signal opcode : OpcodeArray; - - - - -signal begin_inst : std_logic; -signal trace_opcode : std_logic_vector(7 downto 0); -signal trace_pc : std_logic_vector(maxAddrBitIncIO downto 0); -signal trace_sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal trace_topOfStack : std_logic_vector(wordSize-1 downto 0); -signal trace_topOfStackB : std_logic_vector(wordSize-1 downto 0); - -signal out_mem_req : std_logic; - -signal inInterrupt : std_logic; - --- state machine. - -begin - - zpu_status(maxAddrBitIncIO downto 0) <= trace_pc; - zpu_status(31) <= '1'; - zpu_status(39 downto 32) <= trace_opcode; - zpu_status(40) <= '1' when (state = State_Idle) else '0'; - zpu_status(62) <= '1'; - - traceFileGenerate: - if Generate_Trace generate - trace_file: trace port map ( - clk => clk, - begin_inst => begin_inst, - pc => trace_pc, - opcode => trace_opcode, - sp => trace_sp, - memA => trace_topOfStack, - memB => trace_topOfStackB, - busy => busy, - intsp => (others => 'U') - ); - end generate; - - - -- the memory subsystem will tell us one cycle later whether or - -- not it is busy - out_mem_addr(maxAddrBitIncIO downto minAddrBit) <= mem_addr; - out_mem_addr(minAddrBit-1 downto 0) <= (others => '0'); - mem_req <= out_mem_req; - - incSp <= sp + 1; - incIncSp <= sp + 2; - decSp <= sp - 1; - - mem_busy <= out_mem_req and not mem_ack; -- '1' when the memory is busy - - opcodeControl: - process(clk, areset) - variable tOpcode : std_logic_vector(OpCode_Size-1 downto 0); - variable spOffset : std_logic_vector(4 downto 0); - variable tSpOffset : std_logic_vector(4 downto 0); - variable nextPC : std_logic_vector(maxAddrBitIncIO downto 0); - variable tNextState : InsnType; - variable tDecodedOpcode : InsnArray; - variable tMultResult : std_logic_vector(wordSize*2-1 downto 0); - begin - if areset = '1' then - state <= State_Idle; - break <= '0'; - sp <= spStart(maxAddrBitIncIO downto minAddrBit); - - pc <= (others => '0'); - idim_flag <= '0'; - begin_inst <= '0'; - mem_we <= '0'; - multA <= (others => '0'); - multB <= (others => '0'); - mem_writeMask <= (others => '1'); - out_mem_req <= '0'; - mem_addr <= (others => DontCareValue); - mem_write <= (others => DontCareValue); - inInterrupt <= '0'; - elsif (clk'event and clk = '1') then - -- we must multiply unconditionally to get pipelined multiplication - tMultResult := multA * multB; - multResult3 <= multResult2; - multResult2 <= multResult; - multResult <= tMultResult(wordSize-1 downto 0); - - - spOffset(4):=not opcode(conv_integer(pc(byteBits-1 downto 0)))(4); - spOffset(3 downto 0):=opcode(conv_integer(pc(byteBits-1 downto 0)))(3 downto 0); - nextPC := pc + 1; - - -- prepare trace snapshot - trace_opcode <= opcode(conv_integer(pc(byteBits-1 downto 0))); - trace_pc <= pc; - trace_sp <= sp; - trace_topOfStack <= stackA; - trace_topOfStackB <= stackB; - begin_inst <= '0'; - - -- we terminate the requeset as soon as we get acknowledge - if mem_ack = '1' then - out_mem_req <= '0'; - mem_we <= '0'; - end if; - - if interrupt='0' then - inInterrupt <= '0'; -- no longer in an interrupt - end if; - - case state is - when State_Idle => - if enable='1' then - state <= State_Resync; - end if; - -- Initial state of ZPU, fetch top of stack + first instruction - when State_Resync => - if mem_busy='0' then - mem_addr <= sp; - out_mem_req <= '1'; - state <= State_Resync2; - end if; - when State_Resync2 => - if mem_busy='0' then - stackA <= mem_read; - mem_addr <= incSp; - out_mem_req <= '1'; - state <= State_Resync3; - end if; - when State_Resync3 => - if mem_busy='0' then - stackB <= mem_read; - mem_addr <= pc(maxAddrBitIncIO downto minAddrBit); - out_mem_req <= '1'; - state <= State_Decode; - end if; - when State_Decode => - if mem_busy='0' then - decodeWord <= mem_read; - state <= State_Decode2; - end if; - when State_Decode2 => - -- decode 4 instructions in parallel - for i in 0 to wordBytes-1 loop - tOpcode := decodeWord((wordBytes-1-i+1)*8-1 downto (wordBytes-1-i)*8); - - tSpOffset(4):=not tOpcode(4); - tSpOffset(3 downto 0):=tOpcode(3 downto 0); - - opcode(i) <= tOpcode; - if (tOpcode(7 downto 7)=OpCode_Im) then - tNextState:=State_Im; - elsif (tOpcode(7 downto 5)=OpCode_StoreSP) then - if tSpOffset = 0 then - tNextState := State_Pop; - elsif tSpOffset=1 then - tNextState := State_PopDown; - else - tNextState :=State_StoreSP; - end if; - elsif (tOpcode(7 downto 5)=OpCode_LoadSP) then - if tSpOffset = 0 then - tNextState :=State_Dup; - elsif tSpOffset = 1 then - tNextState :=State_DupStackB; - else - tNextState :=State_LoadSP; - end if; - elsif (tOpcode(7 downto 5)=OpCode_Emulate) then - tNextState :=State_Emulate; - if tOpcode(5 downto 0)=OpCode_Neqbranch then - tNextState :=State_Neqbranch; - elsif tOpcode(5 downto 0)=OpCode_Eq then - tNextState :=State_Eq; - elsif tOpcode(5 downto 0)=OpCode_Lessthan then - tNextState :=State_Lessthan; - elsif tOpcode(5 downto 0)=OpCode_Lessthanorequal then - --tNextState :=State_Lessthanorequal; - elsif tOpcode(5 downto 0)=OpCode_Ulessthan then - tNextState :=State_Ulessthan; - elsif tOpcode(5 downto 0)=OpCode_Ulessthanorequal then - --tNextState :=State_Ulessthanorequal; - elsif tOpcode(5 downto 0)=OpCode_Loadb then - tNextState :=State_Loadb; - elsif tOpcode(5 downto 0)=OpCode_Mult then - tNextState :=State_Mult; - elsif tOpcode(5 downto 0)=OpCode_Storeb then - tNextState :=State_Storeb; - elsif tOpcode(5 downto 0)=OpCode_Pushspadd then - tNextState :=State_Pushspadd; - elsif tOpcode(5 downto 0)=OpCode_Callpcrel then - tNextState :=State_Callpcrel; - elsif tOpcode(5 downto 0)=OpCode_Call then - --tNextState :=State_Call; - elsif tOpcode(5 downto 0)=OpCode_Sub then - tNextState :=State_Sub; - elsif tOpcode(5 downto 0)=OpCode_PopPCRel then - --tNextState :=State_PopPCRel; - end if; - elsif (tOpcode(7 downto 4)=OpCode_AddSP) then - if tSpOffset = 0 then - tNextState := State_Shift; - elsif tSpOffset = 1 then - tNextState := State_AddTop; - else - tNextState :=State_AddSP; - end if; - else - case tOpcode(3 downto 0) is - when OpCode_Nop => - tNextState :=State_Nop; - when OpCode_PushSP => - tNextState :=State_PushSP; - when OpCode_PopPC => - tNextState :=State_PopPC; - when OpCode_Add => - tNextState :=State_Add; - when OpCode_Or => - tNextState :=State_Or; - when OpCode_And => - tNextState :=State_And; - when OpCode_Load => - tNextState :=State_Load; - when OpCode_Not => - tNextState :=State_Not; - when OpCode_Flip => - tNextState :=State_Flip; - when OpCode_Store => - tNextState :=State_Store; - when OpCode_PopSP => - tNextState :=State_PopSP; - when others => - tNextState := State_Break; - - end case; - end if; - tDecodedOpcode(i) := tNextState; - - end loop; - - insn <= tDecodedOpcode(conv_integer(pc(byteBits-1 downto 0))); - - -- once we wrap, we need to fetch - tDecodedOpcode(0) := State_InsnFetch; - - decodedOpcode <= tDecodedOpcode; - state <= State_Execute; - - - - -- Each instruction must: - -- - -- 1. set idim_flag - -- 2. increase pc if applicable - -- 3. set next state if appliable - -- 4. do it's operation - - when State_Execute => - insn <= decodedOpcode(conv_integer(nextPC(byteBits-1 downto 0))); - - case insn is - when State_InsnFetch => - state <= State_Fetch; - when State_Im => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '1'; - pc <= pc + 1; - - if idim_flag='1' then - stackA(wordSize-1 downto 7) <= stackA(wordSize-8 downto 0); - stackA(6 downto 0) <= opcode(conv_integer(pc(byteBits-1 downto 0)))(6 downto 0); - else - out_mem_req <= '1'; - mem_we <= '1'; - mem_addr <= incSp; - mem_write <= stackB; - stackB <= stackA; - sp <= decSp; - for i in wordSize-1 downto 7 loop - stackA(i) <= opcode(conv_integer(pc(byteBits-1 downto 0)))(6); - end loop; - stackA(6 downto 0) <= opcode(conv_integer(pc(byteBits-1 downto 0)))(6 downto 0); - end if; - else - insn <= insn; - end if; - when State_StoreSP => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_StoreSP2; - - out_mem_req <= '1'; - mem_we <= '1'; - mem_addr <= sp+spOffset; - mem_write <= stackA; - stackA <= stackB; - sp <= incSp; - else - insn <= insn; - end if; - - - when State_LoadSP => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_LoadSP2; - - sp <= decSp; - out_mem_req <= '1'; - mem_we <= '1'; - mem_addr <= incSp; - mem_write <= stackB; - else - insn <= insn; - end if; - when State_Emulate => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - sp <= decSp; - out_mem_req <= '1'; - mem_we <= '1'; - mem_addr <= incSp; - mem_write <= stackB; - stackA <= (others => DontCareValue); - stackA(maxAddrBitIncIO downto 0) <= pc + 1; - stackB <= stackA; - - -- The emulate address is: - -- 98 7654 3210 - -- 0000 00aa aaa0 0000 - pc <= (others => '0'); - pc(9 downto 5) <= opcode(conv_integer(pc(byteBits-1 downto 0)))(4 downto 0); - state <= State_Fetch; - else - insn <= insn; - end if; - when State_Callpcrel => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - stackA <= (others => DontCareValue); - stackA(maxAddrBitIncIO downto 0) <= pc + 1; - - pc <= pc + stackA(maxAddrBitIncIO downto 0); - state <= State_Fetch; - else - insn <= insn; - end if; - when State_Call => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - stackA <= (others => DontCareValue); - stackA(maxAddrBitIncIO downto 0) <= pc + 1; - pc <= stackA(maxAddrBitIncIO downto 0); - state <= State_Fetch; - else - insn <= insn; - end if; - when State_AddSP => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_AddSP2; - - out_mem_req <= '1'; - mem_addr <= sp+spOffset; - else - insn <= insn; - end if; - when State_PushSP => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - sp <= decSp; - stackA <= (others => '0'); - stackA(maxAddrBitIncIO downto minAddrBit) <= sp; - stackB <= stackA; - out_mem_req <= '1'; - mem_we <= '1'; - mem_addr <= incSp; - mem_write <= stackB; - else - insn <= insn; - end if; - when State_PopPC => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= stackA(maxAddrBitIncIO downto 0); - sp <= incSp; - - out_mem_req <= '1'; - mem_we <= '1'; - mem_addr <= incSp; - mem_write <= stackB; - state <= State_Resync; - else - insn <= insn; - end if; - when State_PopPCRel => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= stackA(maxAddrBitIncIO downto 0) + pc; - sp <= incSp; - - out_mem_req <= '1'; - mem_we <= '1'; - mem_addr <= incSp; - mem_write <= stackB; - state <= State_Resync; - else - insn <= insn; - end if; - when State_Add => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - stackA <= stackA + stackB; - - out_mem_req <= '1'; - mem_addr <= incIncSp; - sp <= incSp; - state <= State_Popped; - else - insn <= insn; - end if; - when State_Sub => - begin_inst <= '1'; - idim_flag <= '0'; - binaryOpResult <= stackB - stackA; - state <= State_BinaryOpResult; - when State_Pop => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - mem_addr <= incIncSp; - out_mem_req <= '1'; - sp <= incSp; - stackA <= stackB; - state <= State_Popped; - else - insn <= insn; - end if; - when State_PopDown => - if mem_busy='0' then - -- PopDown leaves top of stack unchanged - begin_inst <= '1'; - idim_flag <= '0'; - mem_addr <= incIncSp; - out_mem_req <= '1'; - sp <= incSp; - state <= State_Popped; - else - insn <= insn; - end if; - when State_Or => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - stackA <= stackA or stackB; - out_mem_req <= '1'; - mem_addr <= incIncSp; - sp <= incSp; - state <= State_Popped; - else - insn <= insn; - end if; - when State_And => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - - stackA <= stackA and stackB; - out_mem_req <= '1'; - mem_addr <= incIncSp; - sp <= incSp; - state <= State_Popped; - else - insn <= insn; - end if; - when State_Eq => - begin_inst <= '1'; - idim_flag <= '0'; - - binaryOpResult <= (others => '0'); - if (stackA=stackB) then - binaryOpResult(0) <= '1'; - end if; - state <= State_BinaryOpResult; - when State_Ulessthan => - begin_inst <= '1'; - idim_flag <= '0'; - - binaryOpResult <= (others => '0'); - if (stackA - begin_inst <= '1'; - idim_flag <= '0'; - - binaryOpResult <= (others => '0'); - if (stackA<=stackB) then - binaryOpResult(0) <= '1'; - end if; - state <= State_BinaryOpResult; - when State_Lessthan => - begin_inst <= '1'; - idim_flag <= '0'; - - binaryOpResult <= (others => '0'); - if (signed(stackA) - begin_inst <= '1'; - idim_flag <= '0'; - - binaryOpResult <= (others => '0'); - if (signed(stackA)<=signed(stackB)) then - binaryOpResult(0) <= '1'; - end if; - state <= State_BinaryOpResult; - when State_Load => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_Load2; - - mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); - out_mem_req <= '1'; - else - insn <= insn; - end if; - - when State_Dup => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - sp <= decSp; - stackB <= stackA; - mem_write <= stackB; - mem_addr <= incSp; - out_mem_req <= '1'; - mem_we <= '1'; - else - insn <= insn; - end if; - when State_DupStackB => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - sp <= decSp; - stackA <= stackB; - stackB <= stackA; - mem_write <= stackB; - mem_addr <= incSp; - out_mem_req <= '1'; - mem_we <= '1'; - else - insn <= insn; - end if; - when State_Store => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); - mem_write <= stackB; - out_mem_req <= '1'; - mem_we <= '1'; - sp <= incIncSp; - state <= State_Resync; - else - insn <= insn; - end if; - when State_PopSP => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - mem_write <= stackB; - mem_addr <= incSp; - out_mem_req <= '1'; - mem_we <= '1'; - sp <= stackA(maxAddrBitIncIO downto minAddrBit); - state <= State_Resync; - else - insn <= insn; - end if; - when State_Nop => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - when State_Not => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - stackA <= not stackA; - when State_Flip => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - for i in 0 to wordSize-1 loop - stackA(i) <= stackA(wordSize-1-i); - end loop; - when State_AddTop => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - stackA <= stackA + stackB; - when State_Shift => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - stackA(wordSize-1 downto 1) <= stackA(wordSize-2 downto 0); - stackA(0) <= '0'; - when State_Pushspadd => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - stackA <= (others => '0'); - stackA(maxAddrBitIncIO downto minAddrBit) <= stackA(maxAddrBitIncIO-minAddrBit downto 0)+sp; - when State_Neqbranch => - -- branches are almost always taken as they form loops - begin_inst <= '1'; - idim_flag <= '0'; - sp <= incIncSp; - if (stackB/=0) then - pc <= stackA(maxAddrBitIncIO downto 0) + pc; - else - pc <= pc + 1; - end if; - -- need to fetch stack again. - state <= State_Resync; - when State_Mult => - begin_inst <= '1'; - idim_flag <= '0'; - - multA <= stackA; - multB <= stackB; - state <= State_Mult2; - when State_Break => - report "Break instruction encountered" severity failure; - break <= '1'; - - when State_Loadb => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_Loadb2; - - mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); - out_mem_req <= '1'; - else - insn <= insn; - end if; - when State_Storeb => - if mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_Storeb2; - - mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); - out_mem_req <= '1'; - else - insn <= insn; - end if; - - when others => --- sp <= (others => DontCareValue); - report "Illegal instruction" severity failure; - break <= '1'; - end case; - - - when State_StoreSP2 => - if mem_busy='0' then - mem_addr <= incSp; - out_mem_req <= '1'; - state <= State_Popped; - end if; - when State_LoadSP2 => - if mem_busy='0' then - state <= State_LoadSP3; - out_mem_req <= '1'; - mem_addr <= sp+spOffset+1; - end if; - when State_LoadSP3 => - if mem_busy='0' then - pc <= pc + 1; - state <= State_Execute; - stackB <= stackA; - stackA <= mem_read; - end if; - when State_AddSP2 => - if mem_busy='0' then - pc <= pc + 1; - state <= State_Execute; - stackA <= stackA + mem_read; - end if; - when State_Load2 => - if mem_busy='0' then - stackA <= mem_read; - pc <= pc + 1; - state <= State_Execute; - end if; - when State_Loadb2 => - if mem_busy='0' then - stackA <= (others => '0'); - stackA(7 downto 0) <= mem_read(((wordBytes-1-conv_integer(stackA(byteBits-1 downto 0)))*8+7) downto (wordBytes-1-conv_integer(stackA(byteBits-1 downto 0)))*8); - pc <= pc + 1; - state <= State_Execute; - end if; - when State_Storeb2 => - if mem_busy='0' then - mem_addr <= stackA(maxAddrBitIncIO downto minAddrBit); - mem_write <= mem_read; - mem_write(((wordBytes-1-conv_integer(stackA(byteBits-1 downto 0)))*8+7) downto (wordBytes-1-conv_integer(stackA(byteBits-1 downto 0)))*8) <= stackB(7 downto 0) ; - out_mem_req <= '1'; - mem_we <= '1'; - pc <= pc + 1; - sp <= incIncSp; - state <= State_Resync; - end if; - when State_Fetch => - if mem_busy='0' then - if interrupt='1' and inInterrupt='0' and idim_flag='0' then - -- We got an interrupt - inInterrupt <= '1'; - - sp <= decSp; - out_mem_req <= '1'; - mem_we <= '1'; - mem_addr <= incSp; - mem_write <= stackB; - stackA <= (others => DontCareValue); - stackA(maxAddrBitIncIO downto 0) <= pc; - stackB <= stackA; - - pc <= conv_std_logic_vector(32, maxAddrBitIncIo+1); -- interrupt address - - report "ZPU jumped to interrupt!" severity note; - else - mem_addr <= pc(maxAddrBitIncIO downto minAddrBit); - out_mem_req <= '1'; - state <= State_Decode; - end if; - end if; - when State_Mult2 => - state <= State_Mult3; - when State_Mult3 => - state <= State_Mult4; - when State_Mult4 => - state <= State_Mult5; - when State_Mult5 => - stackA <= multResult3; - state <= State_Mult6; - when State_Mult6 => - if mem_busy='0' then - out_mem_req <= '1'; - mem_addr <= incIncSp; - sp <= incSp; - state <= State_Popped; - end if; - when State_BinaryOpResult => - if mem_busy='0' then - -- NB!!!! we know that the memory isn't busy at this point!!!! - out_mem_req <= '1'; - mem_addr <= incIncSp; - sp <= incSp; - stackA <= binaryOpResult; - state <= State_Popped; - end if; - when State_Popped => - if mem_busy='0' then - pc <= pc + 1; - stackB <= mem_read; - state <= State_Execute; - end if; - when others => --- sp <= (others => DontCareValue); - report "Illegal state" severity failure; - break <= '1'; - end case; - end if; - end process; - - - -end behave; -- cgit v1.1 From 47fd50b7c9654cf750e6c2024c9169a9eab2d6ad Mon Sep 17 00:00:00 2001 From: oharboe Date: Thu, 1 May 2008 08:44:59 +0000 Subject: wip --- zpu/hdl/zpu4/src/zpu_core_small_wip.vhd | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/zpu_core_small_wip.vhd b/zpu/hdl/zpu4/src/zpu_core_small_wip.vhd index 63e02e4..8d87804 100644 --- a/zpu/hdl/zpu4/src/zpu_core_small_wip.vhd +++ b/zpu/hdl/zpu4/src/zpu_core_small_wip.vhd @@ -81,7 +81,9 @@ State_FetchNext, State_AddSP, State_ReadIODone, State_Decode, -State_Resync +State_Resync, +State_Interrupt + ); type DecodedOpcodeType is @@ -130,6 +132,7 @@ subtype index is integer range 0 to 3; signal tOpcode_sel : index; +signal inInterrupt : std_logic; @@ -262,6 +265,7 @@ begin out_mem_readEnable <= '0'; memAWrite <= (others => '0'); memBWrite <= (others => '0'); + inInterrupt <= '0'; elsif (clk'event and clk = '1') then memAWriteEnable <= '0'; memBWriteEnable <= '0'; @@ -284,6 +288,9 @@ begin decodedOpcode <= sampledDecodedOpcode; opcode <= sampledOpcode; + if interrupt='0' then + inInterrupt <= '0'; -- no longer in an interrupt + end if; case state is when State_Execute => @@ -309,6 +316,14 @@ begin idim_flag <= '0'; case decodedOpcode is + when Decoded_Interrupt => + sp <= sp - 1; + memAAddr <= sp - 1; + memAWriteEnable <= '1'; + memAWrite <= (others => DontCareValue); + memAWrite(maxAddrBitIncIO downto 0) <= pc; + pc <= conv_std_logic_vector(32, maxAddrBitIncIo+1); -- interrupt address + report "ZPU jumped to interrupt!" severity note; when Decoded_Im => idim_flag <= '1'; memAWriteEnable <= '1'; @@ -436,6 +451,10 @@ begin memBAddr <= sp + 1; state <= State_Decode; when State_Decode => + if interrupt='1' and inInterrupt='0' and idim_flag='0' then + -- We got an interrupt, execute interrupt instead of next instruction + decodedOpcode <= Decoded_Interrupt; + end if; -- during the State_Execute cycle we'll be fetching SP+1 memAAddr <= sp; memBAddr <= sp + 1; -- cgit v1.1 From 1362bd4ace3ce962ed744a153e5f969154bb6682 Mon Sep 17 00:00:00 2001 From: oharboe Date: Sun, 4 May 2008 19:29:07 +0000 Subject: * Make code synthesize on Synopsis zpu/hdl/zpu4/src/zpu_core_small.vhd zpu/hdl/zpu4/src/io.vhd --- zpu/hdl/zpu4/src/io.vhd | 15 +-- zpu/hdl/zpu4/src/sim_small_fpga_top.vhd | 177 -------------------------------- zpu/hdl/zpu4/src/zpu_core_small.vhd | 25 ++++- 3 files changed, 30 insertions(+), 187 deletions(-) delete mode 100644 zpu/hdl/zpu4/src/sim_small_fpga_top.vhd (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/io.vhd b/zpu/hdl/zpu4/src/io.vhd index 7a2601f..9e65929 100644 --- a/zpu/hdl/zpu4/src/io.vhd +++ b/zpu/hdl/zpu4/src/io.vhd @@ -59,8 +59,9 @@ begin elsif (clk'event and clk = '1') then -- timer_we <= '0'; if writeEnable = '1' then - -- external interface - if addr=x"2028003" then + -- external interface (fixed address) + -- extend compare to avoid waring messages + if ("000" & addr)=x"2028003" then -- Write to UART -- report "" & character'image(conv_integer(memBint)) severity note; print(l_file, character'val(to_integer(unsigned(write)))); @@ -69,24 +70,26 @@ begin -- timer_we <= '1'; else print(l_file, character'val(to_integer(unsigned(write)))); - report "Illegal IO write" severity warning; + -- report "Illegal IO write" severity warning; end if; end if; read <= (others => '0'); if (readEnable = '1') then - if addr=x"1001" then + -- extend compare to avoid waring messages + if ("000" & addr)=x"0001001" then read <= (0=>'1', others => '0'); -- recieve empty elsif addr(12)='1' then read(7 downto 0) <= timer_read; elsif addr(11)='1' then read(7 downto 0) <= ZPU_Frequency; - elsif addr=x"2028003" then + -- extend compare to avoid waring messages + elsif ("000" & addr)=x"2028003" then read <= (others => '0'); else read <= (others => '0'); read(8) <= '1'; - report "Illegal IO read" severity warning; + -- report "Illegal IO read" severity warning; end if; end if; end if; diff --git a/zpu/hdl/zpu4/src/sim_small_fpga_top.vhd b/zpu/hdl/zpu4/src/sim_small_fpga_top.vhd deleted file mode 100644 index 5c05881..0000000 --- a/zpu/hdl/zpu4/src/sim_small_fpga_top.vhd +++ /dev/null @@ -1,177 +0,0 @@ --------------------------------------------------------------------------------- --- Company: --- Engineer: --- --- Create Date: 20:15:31 04/14/05 --- Design Name: --- Module Name: fpga_top - behave --- Project Name: --- Target Device: --- Tool versions: --- Description: --- --- Dependencies: --- --- Revision: --- Revision 0.01 - File Created --- Additional Comments: --- --------------------------------------------------------------------------------- -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; - ----- Uncomment the following library declaration if instantiating ----- any Xilinx primitives in this code. -library UNISIM; -use UNISIM.VComponents.all; - -library work; -use work.zpu_config.all; -use work.zpupkg.all; - -entity fpga_top is -end fpga_top; - -architecture behave of fpga_top is - - -signal clk : std_logic; - -signal areset : std_logic; - - -component zpu_io is - generic ( - log_file: string := "log.txt" - ); - port( - clk : in std_logic; - areset : in std_logic; - busy : out std_logic; - writeEnable : in std_logic; - readEnable : in std_logic; - write : in std_logic_vector(wordSize-1 downto 0); - read : out std_logic_vector(wordSize-1 downto 0); - addr : in std_logic_vector(maxAddrBit downto minAddrBit) - ); -end component; - - - - - -signal mem_busy : std_logic; -signal mem_read : std_logic_vector(wordSize-1 downto 0); -signal mem_write : std_logic_vector(wordSize-1 downto 0); -signal mem_addr : std_logic_vector(maxAddrBitIncIO downto 0); -signal mem_writeEnable : std_logic; -signal mem_readEnable : std_logic; -signal mem_writeMask: std_logic_vector(wordBytes-1 downto 0); - -signal enable : std_logic; - -signal dram_mem_busy : std_logic; -signal dram_mem_read : std_logic_vector(wordSize-1 downto 0); -signal dram_mem_write : std_logic_vector(wordSize-1 downto 0); -signal dram_mem_writeEnable : std_logic; -signal dram_mem_readEnable : std_logic; -signal dram_mem_writeMask: std_logic_vector(wordBytes-1 downto 0); - - -signal io_busy : std_logic; - -signal io_mem_read : std_logic_vector(wordSize-1 downto 0); -signal io_mem_writeEnable : std_logic; -signal io_mem_readEnable : std_logic; - - -signal dram_ready : std_logic; -signal io_ready : std_logic; -signal io_reading : std_logic; - - -signal break : std_logic; - -begin - poweronreset: roc port map (O => areset); - - - - zpu: zpu_core port map ( - clk => clk , - areset => areset, - enable => enable, - in_mem_busy => mem_busy, - mem_read => mem_read, - mem_write => mem_write, - out_mem_addr => mem_addr, - out_mem_writeEnable => mem_writeEnable, - out_mem_readEnable => mem_readEnable, - mem_writeMask => mem_writeMask, - interrupt => '0', - break => break); - - - ioMap: zpu_io port map ( - clk => clk, - areset => areset, - busy => io_busy, - writeEnable => io_mem_writeEnable, - readEnable => io_mem_readEnable, - write => mem_write, - read => io_mem_read, - addr => mem_addr(maxAddrBit downto minAddrBit) - ); - - dram_mem_writeEnable <= mem_writeEnable and not mem_addr(ioBit); - dram_mem_readEnable <= mem_readEnable and not mem_addr(ioBit); - io_mem_writeEnable <= mem_writeEnable and mem_addr(ioBit); - io_mem_readEnable <= mem_readEnable and mem_addr(ioBit); - mem_busy <= io_busy; - - - - -- Memory reads either come from IO or DRAM. We need to pick the right one. - memorycontrol: - process(dram_mem_read, dram_ready, io_ready, io_mem_read) - begin - mem_read <= (others => 'U'); - if dram_ready='1' then - mem_read <= dram_mem_read; - end if; - - if io_ready='1' then - mem_read <= (others => '0'); - mem_read <= io_mem_read; - end if; - end process; - - - io_ready <= (io_reading or io_mem_readEnable) and not io_busy; - - memoryControlSync: - process(clk, areset) - begin - if areset = '1' then - enable <= '0'; - io_reading <= '0'; - dram_ready <= '0'; - elsif (clk'event and clk = '1') then - enable <= '1'; - io_reading <= io_busy or io_mem_readEnable; - dram_ready<=dram_mem_readEnable; - - end if; - end process; - - -- wiggle the clock @ 100MHz - clock : PROCESS - begin - clk <= '0'; - wait for 5 ns; - clk <= '1'; - wait for 5 ns; - end PROCESS clock; - - -end behave; diff --git a/zpu/hdl/zpu4/src/zpu_core_small.vhd b/zpu/hdl/zpu4/src/zpu_core_small.vhd index 0d734d2..9cda01c 100644 --- a/zpu/hdl/zpu4/src/zpu_core_small.vhd +++ b/zpu/hdl/zpu4/src/zpu_core_small.vhd @@ -125,6 +125,11 @@ signal memBAddr_stdlogic : std_logic_vector(AddrBitBRAM_range); signal memBWrite_stdlogic : std_logic_vector(memBWrite'range); signal memBRead_stdlogic : std_logic_vector(memBRead'range); +-- debug +subtype index is integer range 0 to 3; +signal tOpcode_sel : index; + + begin traceFileGenerate: if Generate_Trace generate @@ -141,6 +146,8 @@ begin ); end generate; + -- not used in this design + mem_writeMask <= (others => '1'); memAAddr_stdlogic <= std_logic_vector(memAAddr(AddrBitBRAM_range)); memAWrite_stdlogic <= std_logic_vector(memAWrite); @@ -160,14 +167,23 @@ begin memARead <= unsigned(memARead_stdlogic); memBRead <= unsigned(memBRead_stdlogic); +tOpcode_sel <= to_integer(pc(minAddrBit-1 downto 0)); decodeControl: - process(memBRead, pc) + process(memBRead, pc,tOpcode_sel) variable tOpcode : std_logic_vector(OpCode_Size-1 downto 0); begin - tOpcode := std_logic_vector(memBRead((wordBytes-1-to_integer(pc(minAddrBit-1 downto 0))+1)*8-1 downto (wordBytes-1-to_integer(pc(minAddrBit-1 downto 0)))*8)); - + -- not worked with synopsys + -- tOpcode := std_logic_vector(memBRead((wordBytes-1-to_integer(pc(minAddrBit-1 downto 0))+1)*8-1 downto (wordBytes-1-to_integer(pc(minAddrBit-1 downto 0)))*8)); + -- use full case + case (tOpcode_sel) is + when 0 => tOpcode := std_logic_vector(memBRead(31 downto 24)); + when 1 => tOpcode := std_logic_vector(memBRead(23 downto 16)); + when 2 => tOpcode := std_logic_vector(memBRead(15 downto 8)); + when 3 => tOpcode := std_logic_vector(memBRead(7 downto 0)); + when others => tOpcode := std_logic_vector(memBRead(7 downto 0)); + end case; sampledOpcode <= tOpcode; if (tOpcode(7 downto 7)=OpCode_Im) then @@ -230,7 +246,8 @@ begin out_mem_readEnable <= '0'; memAWrite <= (others => '0'); memBWrite <= (others => '0'); - mem_writeMask <= (others => '1'); + -- avoid Latch in synopsys + -- mem_writeMask <= (others => '1'); elsif (clk'event and clk = '1') then memAWriteEnable <= '0'; memBWriteEnable <= '0'; -- cgit v1.1 From b93ac48f3c323a11a97a39338897c521780a16b9 Mon Sep 17 00:00:00 2001 From: oharboe Date: Sun, 4 May 2008 20:44:27 +0000 Subject: * moved ZPU core files to seperate folder * deleted some obsolete files --- zpu/hdl/zpu4/src/dmipssmalltrace.do | 26 - zpu/hdl/zpu4/src/dmipssmalltrace_ghdl.sh | 26 - zpu/hdl/zpu4/src/dmipstrace.do | 30 -- zpu/hdl/zpu4/src/dmipstrace_ghdl.sh | 25 - zpu/hdl/zpu4/src/log.txt | 380 ------------- zpu/hdl/zpu4/src/niltrace.vhd | 26 - zpu/hdl/zpu4/src/sim_fpga_top.vhd | 188 ------- zpu/hdl/zpu4/src/simzpu_medium.do | 28 - zpu/hdl/zpu4/src/simzpu_medium_ghdl.sh | 25 - zpu/hdl/zpu4/src/testlut.vhd | 114 ---- zpu/hdl/zpu4/src/zpu_config.vhd | 16 - zpu/hdl/zpu4/src/zpu_core.vhd | 897 ------------------------------- zpu/hdl/zpu4/src/zpu_core_small.vhd | 464 ---------------- zpu/hdl/zpu4/src/zpu_core_small_wip.vhd | 497 ----------------- zpu/hdl/zpu4/src/zpupkg.vhd | 170 ------ 15 files changed, 2912 deletions(-) delete mode 100644 zpu/hdl/zpu4/src/dmipssmalltrace.do delete mode 100644 zpu/hdl/zpu4/src/dmipssmalltrace_ghdl.sh delete mode 100644 zpu/hdl/zpu4/src/dmipstrace.do delete mode 100644 zpu/hdl/zpu4/src/dmipstrace_ghdl.sh delete mode 100644 zpu/hdl/zpu4/src/log.txt delete mode 100644 zpu/hdl/zpu4/src/niltrace.vhd delete mode 100644 zpu/hdl/zpu4/src/sim_fpga_top.vhd delete mode 100644 zpu/hdl/zpu4/src/simzpu_medium.do delete mode 100644 zpu/hdl/zpu4/src/simzpu_medium_ghdl.sh delete mode 100644 zpu/hdl/zpu4/src/testlut.vhd delete mode 100644 zpu/hdl/zpu4/src/zpu_config.vhd delete mode 100644 zpu/hdl/zpu4/src/zpu_core.vhd delete mode 100644 zpu/hdl/zpu4/src/zpu_core_small.vhd delete mode 100644 zpu/hdl/zpu4/src/zpu_core_small_wip.vhd delete mode 100644 zpu/hdl/zpu4/src/zpupkg.vhd (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/dmipssmalltrace.do b/zpu/hdl/zpu4/src/dmipssmalltrace.do deleted file mode 100644 index eb4c6fe..0000000 --- a/zpu/hdl/zpu4/src/dmipssmalltrace.do +++ /dev/null @@ -1,26 +0,0 @@ -set BreakOnAssertion 1 -vlib work - -vcom -93 -explicit zpu_config_trace.vhd -vcom -93 -explicit zpupkg.vhd -vcom -93 -explicit txt_util.vhd -vcom -93 -explicit sim_fpga_top.vhd -vcom -93 -explicit zpu_core_small.vhd -vcom -93 -explicit bram_dmips.vhd -vcom -93 -explicit dram_dmips.vhd -vcom -93 -explicit timer.vhd -vcom -93 -explicit io.vhd -vcom -93 -explicit trace.vhd - - -vsim fpga_top -view wave - -add wave -recursive fpga_top/zpu/* -#--add wave -recursive fpga_top/ioMap/* -#add wave -recursive fpga_top/* -view structure - - -# run ZPU -run 5 ms diff --git a/zpu/hdl/zpu4/src/dmipssmalltrace_ghdl.sh b/zpu/hdl/zpu4/src/dmipssmalltrace_ghdl.sh deleted file mode 100644 index 5e43b64..0000000 --- a/zpu/hdl/zpu4/src/dmipssmalltrace_ghdl.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -UNISIM_DIR="'location of GHDL objects for unisim library'/unisim_v93" -IMPORT_OPTIONS="--std=93 --ieee=synopsys --workdir=work -P${UNISIM_DIR}" -MAKE_OPTIONS="${IMPORT_OPTIONS} -Wl,-s -fexplicit --syn-binding" - -if test ! -e work; then - echo "Building work library..." - mkdir work - ghdl -i ${IMPORT_OPTIONS} zpu_config_trace.vhd - ghdl -i ${IMPORT_OPTIONS} zpupkg.vhd - ghdl -i ${IMPORT_OPTIONS} txt_util.vhd - ghdl -i ${IMPORT_OPTIONS} sim_fpga_top.vhd - ghdl -i ${IMPORT_OPTIONS} zpu_core_small.vhd - ghdl -i ${IMPORT_OPTIONS} bram_dmips.vhd - ghdl -i ${IMPORT_OPTIONS} dram_dmips.vhd - ghdl -i ${IMPORT_OPTIONS} timer.vhd - ghdl -i ${IMPORT_OPTIONS} io.vhd - ghdl -i ${IMPORT_OPTIONS} trace.vhd -fi - -echo "Compiling design..." -if ghdl -m ${MAKE_OPTIONS} fpga_top; then - echo "Compilation finished, start simulation with" - echo " ./fpga_top --stop-time=1ms" -fi diff --git a/zpu/hdl/zpu4/src/dmipstrace.do b/zpu/hdl/zpu4/src/dmipstrace.do deleted file mode 100644 index 64cf8fd..0000000 --- a/zpu/hdl/zpu4/src/dmipstrace.do +++ /dev/null @@ -1,30 +0,0 @@ -# Xilinx WebPack modelsim script -# -# cd C:/workspace/zpu/zpu/hdl/zpu4/src -# do dmipstrace.do - -set BreakOnAssertion 1 -vlib work - -vcom -93 -explicit zpu_config_trace.vhd -vcom -93 -explicit zpupkg.vhd -vcom -93 -explicit txt_util.vhd -vcom -93 -explicit sim_fpga_top.vhd -vcom -93 -explicit zpu_core.vhd -vcom -93 -explicit dram_dmips.vhd -vcom -93 -explicit timer.vhd -vcom -93 -explicit io.vhd -vcom -93 -explicit trace.vhd - - -vsim fpga_top -view wave - -add wave -recursive fpga_top/zpu/* -#--add wave -recursive fpga_top/ioMap/* -#add wave -recursive fpga_top/* -view structure - - -# run ZPU -run 5 ms diff --git a/zpu/hdl/zpu4/src/dmipstrace_ghdl.sh b/zpu/hdl/zpu4/src/dmipstrace_ghdl.sh deleted file mode 100644 index 3be392f..0000000 --- a/zpu/hdl/zpu4/src/dmipstrace_ghdl.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh - -UNISIM_DIR="'location of GHDL objects for unisim library'/unisim_v93" -IMPORT_OPTIONS="--std=93 --ieee=synopsys --workdir=work -P${UNISIM_DIR}" -MAKE_OPTIONS="${IMPORT_OPTIONS} -Wl,-s -fexplicit --syn-binding" - -if test ! -e work; then - echo "Building work library..." - mkdir work - ghdl -i ${IMPORT_OPTIONS} zpu_config_trace.vhd - ghdl -i ${IMPORT_OPTIONS} zpupkg.vhd - ghdl -i ${IMPORT_OPTIONS} txt_util.vhd - ghdl -i ${IMPORT_OPTIONS} sim_fpga_top.vhd - ghdl -i ${IMPORT_OPTIONS} zpu_core.vhd - ghdl -i ${IMPORT_OPTIONS} dram_dmips.vhd - ghdl -i ${IMPORT_OPTIONS} timer.vhd - ghdl -i ${IMPORT_OPTIONS} io.vhd - ghdl -i ${IMPORT_OPTIONS} trace.vhd -fi - -echo "Compiling design..." -if ghdl -m ${MAKE_OPTIONS} fpga_top; then - echo "Compilation finished, start simulation with" - echo " ./fpga_top --stop-time=2500us" -fi diff --git a/zpu/hdl/zpu4/src/log.txt b/zpu/hdl/zpu4/src/log.txt deleted file mode 100644 index 7a82879..0000000 --- a/zpu/hdl/zpu4/src/log.txt +++ /dev/null @@ -1,380 +0,0 @@ -H -e -l -l -o - -w -o -r -l -d - -1 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -2 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -1 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -2 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -1 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -2 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -1 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -2 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -1 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -2 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -1 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -2 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -1 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -2 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -1 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -2 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -1 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -2 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -1 - - - - - - -H -e -l -l -o - -w -o -r -l -d - -2 - - - - - - diff --git a/zpu/hdl/zpu4/src/niltrace.vhd b/zpu/hdl/zpu4/src/niltrace.vhd deleted file mode 100644 index 40fc1ca..0000000 --- a/zpu/hdl/zpu4/src/niltrace.vhd +++ /dev/null @@ -1,26 +0,0 @@ -library ieee; -use ieee.std_logic_1164.all; -use IEEE.STD_LOGIC_UNSIGNED.ALL; - -use std.textio.all; -use work.zpu_config.all; - - -entity trace is - port( - clk : in std_logic; - begin_inst : in std_logic; - pc : in std_logic_vector(maxAddrBit downto 0); - opcode : in std_logic_vector(7 downto 0); - sp : in std_logic_vector(maxAddrBit downto 2); - memA : in std_logic_vector(wordSize-1 downto 0); - busy : in std_logic); -end trace; - - -architecture behave of trace is - -begin - -end behave; - diff --git a/zpu/hdl/zpu4/src/sim_fpga_top.vhd b/zpu/hdl/zpu4/src/sim_fpga_top.vhd deleted file mode 100644 index 29151af..0000000 --- a/zpu/hdl/zpu4/src/sim_fpga_top.vhd +++ /dev/null @@ -1,188 +0,0 @@ --------------------------------------------------------------------------------- --- Company: --- Engineer: --- --- Create Date: 20:15:31 04/14/05 --- Design Name: --- Module Name: fpga_top - behave --- Project Name: --- Target Device: --- Tool versions: --- Description: --- --- Dependencies: --- --- Revision: --- Revision 0.01 - File Created --- Additional Comments: --- --------------------------------------------------------------------------------- -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; - ----- Uncomment the following library declaration if instantiating ----- any Xilinx primitives in this code. -library UNISIM; -use UNISIM.VComponents.all; - -library work; -use work.zpu_config.all; - -entity fpga_top is -end fpga_top; - -use work.zpupkg.all; - -architecture behave of fpga_top is - - -signal clk : std_logic; - -signal areset : std_logic; - - -component zpu_io is - generic ( - log_file: string := "log.txt" - ); - port( - clk : in std_logic; - areset : in std_logic; - busy : out std_logic; - writeEnable : in std_logic; - readEnable : in std_logic; - write : in std_logic_vector(wordSize-1 downto 0); - read : out std_logic_vector(wordSize-1 downto 0); - addr : in std_logic_vector(maxAddrBit downto minAddrBit) - ); -end component; - - - - - -signal mem_busy : std_logic; -signal mem_read : std_logic_vector(wordSize-1 downto 0); -signal mem_write : std_logic_vector(wordSize-1 downto 0); -signal mem_addr : std_logic_vector(maxAddrBitIncIO downto 0); -signal mem_writeEnable : std_logic; -signal mem_readEnable : std_logic; -signal mem_writeMask: std_logic_vector(wordBytes-1 downto 0); - -signal enable : std_logic; - -signal dram_mem_busy : std_logic; -signal dram_mem_read : std_logic_vector(wordSize-1 downto 0); -signal dram_mem_write : std_logic_vector(wordSize-1 downto 0); -signal dram_mem_writeEnable : std_logic; -signal dram_mem_readEnable : std_logic; -signal dram_mem_writeMask: std_logic_vector(wordBytes-1 downto 0); - - -signal io_busy : std_logic; - -signal io_mem_read : std_logic_vector(wordSize-1 downto 0); -signal io_mem_writeEnable : std_logic; -signal io_mem_readEnable : std_logic; - - -signal dram_ready : std_logic; -signal io_ready : std_logic; -signal io_reading : std_logic; - - -signal break : std_logic; - -begin - poweronreset: roc port map (O => areset); - - - - zpu: zpu_core port map ( - clk => clk , - areset => areset, - enable => enable, - in_mem_busy => mem_busy, - mem_read => mem_read, - mem_write => mem_write, - out_mem_addr => mem_addr, - out_mem_writeEnable => mem_writeEnable, - out_mem_readEnable => mem_readEnable, - mem_writeMask => mem_writeMask, - interrupt => '0', - break => break); - - dram_imp: dram port map ( - clk => clk , - areset => areset, - mem_busy => dram_mem_busy, - mem_read => dram_mem_read, - mem_write => mem_write, - mem_addr => mem_addr(maxAddrBit downto 0), - mem_writeEnable => dram_mem_writeEnable, - mem_readEnable => dram_mem_readEnable, - mem_writeMask => mem_writeMask); - - - ioMap: zpu_io port map ( - clk => clk, - areset => areset, - busy => io_busy, - writeEnable => io_mem_writeEnable, - readEnable => io_mem_readEnable, - write => mem_write(wordSize-1 downto 0), - read => io_mem_read, - addr => mem_addr(maxAddrBit downto minAddrBit) - ); - - dram_mem_writeEnable <= mem_writeEnable and not mem_addr(ioBit); - dram_mem_readEnable <= mem_readEnable and not mem_addr(ioBit); - io_mem_writeEnable <= mem_writeEnable and mem_addr(ioBit); - io_mem_readEnable <= mem_readEnable and mem_addr(ioBit); - mem_busy <= io_busy or dram_mem_busy or io_busy; - - - - -- Memory reads either come from IO or DRAM. We need to pick the right one. - memorycontrol: - process(dram_mem_read, dram_ready, io_ready, io_mem_read) - begin - mem_read <= (others => 'U'); - if dram_ready='1' then - mem_read <= dram_mem_read; - end if; - - if io_ready='1' then - mem_read <= io_mem_read; - end if; - end process; - - - io_ready <= (io_reading or io_mem_readEnable) and not io_busy; - - memoryControlSync: - process(clk, areset) - begin - if areset = '1' then - enable <= '0'; - io_reading <= '0'; - dram_ready <= '0'; - elsif (clk'event and clk = '1') then - enable <= '1'; - io_reading <= io_busy or io_mem_readEnable; - dram_ready<=dram_mem_readEnable; - - end if; - end process; - - -- wiggle the clock @ 100MHz - clock : PROCESS - begin - clk <= '0'; - wait for 5 ns; - clk <= '1'; - wait for 5 ns; - end PROCESS clock; - - -end behave; diff --git a/zpu/hdl/zpu4/src/simzpu_medium.do b/zpu/hdl/zpu4/src/simzpu_medium.do deleted file mode 100644 index a6c1fe2..0000000 --- a/zpu/hdl/zpu4/src/simzpu_medium.do +++ /dev/null @@ -1,28 +0,0 @@ -# Xilinx WebPack modelsim script -# -# cd C:/workspace/zpu/zpu/hdl/zpu4/src -# do simzpu_medium.do - -set BreakOnAssertion 1 -vlib work - -vcom -93 -explicit zpu_config_trace.vhd -vcom -93 -explicit zpupkg.vhd -vcom -93 -explicit txt_util.vhd -vcom -93 -explicit sim_fpga_top.vhd -vcom -93 -explicit zpu_core.vhd -vcom -93 -explicit dram_hello.vhd -vcom -93 -explicit timer.vhd -vcom -93 -explicit io.vhd -vcom -93 -explicit trace.vhd - -# run ZPU -vsim fpga_top -view wave -add wave -recursive fpga_top/zpu/* -#add wave -recursive fpga_top/* -view structure -#view signals - -# Enough to run tiny programs -run 1000 ms diff --git a/zpu/hdl/zpu4/src/simzpu_medium_ghdl.sh b/zpu/hdl/zpu4/src/simzpu_medium_ghdl.sh deleted file mode 100644 index 7a7f3df..0000000 --- a/zpu/hdl/zpu4/src/simzpu_medium_ghdl.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh - -UNISIM_DIR="'location of GHDL objects for unisim library'/unisim_v93" -IMPORT_OPTIONS="--std=93 --ieee=synopsys --workdir=work -P${UNISIM_DIR}" -MAKE_OPTIONS="${IMPORT_OPTIONS} -Wl,-s -fexplicit --syn-binding" - -if test ! -e work; then - echo "Building work library..." - mkdir work - ghdl -i ${IMPORT_OPTIONS} zpu_config_trace.vhd - ghdl -i ${IMPORT_OPTIONS} zpupkg.vhd - ghdl -i ${IMPORT_OPTIONS} txt_util.vhd - ghdl -i ${IMPORT_OPTIONS} sim_fpga_top.vhd - ghdl -i ${IMPORT_OPTIONS} zpu_core.vhd - ghdl -i ${IMPORT_OPTIONS} dram_hello.vhd - ghdl -i ${IMPORT_OPTIONS} timer.vhd - ghdl -i ${IMPORT_OPTIONS} io.vhd - ghdl -i ${IMPORT_OPTIONS} trace.vhd -fi - -echo "Compiling design..." -if ghdl -m ${MAKE_OPTIONS} fpga_top; then - echo "Compilation finished, start simulation with" - echo " ./fpga_top --stop-time=1ms" -fi diff --git a/zpu/hdl/zpu4/src/testlut.vhd b/zpu/hdl/zpu4/src/testlut.vhd deleted file mode 100644 index 668efcc..0000000 --- a/zpu/hdl/zpu4/src/testlut.vhd +++ /dev/null @@ -1,114 +0,0 @@ --- Company: Zylin AS --- --- Hooks up the ZPU to physical pads to ensure that it is not optimized to --- oblivion. This is purely to have something to measure LUT usage against. --- -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.STD_LOGIC_UNSIGNED.ALL; - -library work; -use work.zpu_config.all; -use work.zpupkg.all; - -entity ic300 is - port ( -- Clock inputs - cpu_clk_p : in std_logic; - - -- CPU interface signals - cpu_a_p : in std_logic_vector(20 downto 0); - cpu_wr_n_p : in std_logic_vector(1 downto 0); - cpu_cs_n_p : in std_logic_vector(3 downto 1); - cpu_oe_n_p : in std_logic; - cpu_d_p : out std_logic_vector(15 downto 0); - cpu_irq_p : out std_logic_vector(1 downto 0); - cpu_fiq_p : out std_logic; - cpu_wait_n_p : out std_logic; - - sdr_clk_fb_p : in std_logic -- DDR clock feedback - ); -end ic300; - -architecture behave of ic300 is - - -signal io_busy : std_logic; -signal io_read : std_logic_vector(7 downto 0); -signal io_write : std_logic_vector(7 downto 0); -signal io_addr : std_logic_vector(maxAddrBit downto minAddrBit); -signal io_writeEnable : std_logic; -signal io_readEnable : std_logic; - - -signal cpu_we : std_logic_vector(1 downto 0); -signal cpu_re : std_logic; -signal areset : std_logic; - --- Clock module signals -signal clk_status : std_logic_vector(2 downto 0); -signal cpu_clk : std_logic; -signal cpu_clk_2x : std_logic; -signal cpu_clk_4x : std_logic; -signal ddr_in_clk : std_logic; - - --- Internal CPU interface signals -signal cpu_din : std_logic_vector(15 downto 0); -signal cpu_dout : std_logic_vector(15 downto 0); -signal cpu_a : std_logic_vector(20 downto 0); - -signal dummy : std_logic_vector(maxAddrBit downto minAddrBit+5); - -signal dummy2 : std_logic_vector(wordSize-1 downto 0); -signal dummy3 : std_logic_vector(wordSize-1 downto 0); -signal dummy4 : std_logic_vector(wordSize-1 downto 0); -begin - - areset <= '0'; -- MUST BE CHANGED TO SOMETHING CORRECT - --- cpu_d_p <= (others => '0'); - cpu_irq_p <= (others => '0'); - cpu_fiq_p <= '0'; - cpu_wait_n_p <= '0'; - - cpu_d_p(15 downto 15) <= (others => '0'); - - -- delay signals going out/in w/1 clk so the - -- ZPU does not have to drive those pins. - -- - -- these registers can be placed close to the ZPU and these - -- registers then have a full clock to drive the pins. - process(cpu_clk_p, areset) - begin - if (cpu_clk_p'event and cpu_clk_p = '1') then - cpu_d_p(0) <= io_writeEnable; - cpu_d_p(1) <= io_readEnable; - cpu_d_p(9 downto 2) <= io_write; - io_read <= cpu_a_p(7 downto 0); - -- 32 read/write registers is plenty realisitic for a minimal size - -- soft-CPU - cpu_d_p(14 downto 10) <= io_addr(minAddrBit+4 downto minAddrBit); - end if; - end process; - - - zpu: zpu_core port map ( - clk => cpu_clk_p , - areset => areset, - enable => '1', - - in_mem_busy => '0', - out_mem_writeEnable => io_writeEnable, - out_mem_readEnable => io_readEnable, - mem_write(7 downto 0) => io_write, - mem_write(wordSize-1 downto 8) => dummy3(wordSize-1 downto 8), - mem_read(7 downto 0) => io_read, - mem_read(wordSize-1 downto 8) => dummy2(wordSize-1 downto 8), - out_mem_addr(maxAddrBitIncIO) => dummy4(maxAddrBitIncIO), - out_mem_addr(minAddrBit-1 downto 0) => dummy4(minAddrBit-1 downto 0) , - out_mem_addr(maxAddrBit downto minAddrBit) => io_addr, - interrupt => '0' - ); - - -end behave; diff --git a/zpu/hdl/zpu4/src/zpu_config.vhd b/zpu/hdl/zpu4/src/zpu_config.vhd deleted file mode 100644 index a13c0bf..0000000 --- a/zpu/hdl/zpu4/src/zpu_config.vhd +++ /dev/null @@ -1,16 +0,0 @@ -library ieee; -use ieee.std_logic_1164.all; -use ieee.std_logic_unsigned.all; - -package zpu_config is - -- generate trace output or not. - constant Generate_Trace : boolean := false; - constant wordPower : integer := 5; - -- during simulation, set this to '0' to get matching trace.txt - constant DontCareValue : std_logic := 'X'; - -- Clock frequency in MHz. - constant ZPU_Frequency : std_logic_vector(7 downto 0) := x"64"; - -- This is the msb address bit. bytes=2^(maxAddrBitIncIO+1) - constant maxAddrBitIncIO : integer := 15; - -end zpu_config; diff --git a/zpu/hdl/zpu4/src/zpu_core.vhd b/zpu/hdl/zpu4/src/zpu_core.vhd deleted file mode 100644 index 37fa2d1..0000000 --- a/zpu/hdl/zpu4/src/zpu_core.vhd +++ /dev/null @@ -1,897 +0,0 @@ - --- Company: ZPU4 generic memory interface CPU --- Engineer: Øyvind Harboe - -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use ieee.numeric_std.all; - -library work; -use work.zpu_config.all; -use work.zpupkg.all; - - --- mem_writeEnable - set to '1' for a single cycle to send off a write request. --- mem_write is valid only while mem_writeEnable='1'. --- mem_readEnable - set to '1' for a single cycle to send off a read request. --- --- mem_busy - It is illegal to send off a read/write request when mem_busy='1'. --- Set to '0' when mem_read is valid after a read request. --- If it goes to '1'(busy), it is on the cycle after mem_read/writeEnable --- is '1'. --- mem_addr - address for read/write request --- mem_read - read data. Valid only on the cycle after mem_busy='0' after --- mem_readEnable='1' for a single cycle. --- mem_write - data to write --- mem_writeMask - set to '1' for those bits that are to be written to memory upon --- write request --- break - set to '1' when CPU hits break instruction --- interrupt - set to '1' until interrupts are cleared by CPU. - - - - -entity zpu_core is - Port ( clk : in std_logic; - areset : in std_logic; - enable : in std_logic; - in_mem_busy : in std_logic; - mem_read : in std_logic_vector(wordSize-1 downto 0); - mem_write : out std_logic_vector(wordSize-1 downto 0); - out_mem_addr : out std_logic_vector(maxAddrBitIncIO downto 0); - out_mem_writeEnable : out std_logic; - out_mem_readEnable : out std_logic; - mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); - interrupt : in std_logic; - break : out std_logic); -end zpu_core; - -architecture behave of zpu_core is - -type InsnType is -( -State_AddTop, -State_Dup, -State_DupStackB, -State_Pop, -State_Popdown, -State_Add, -State_Or, -State_And, -State_Store, -State_AddSP, -State_Shift, -State_Nop, -State_Im, -State_LoadSP, -State_StoreSP, -State_Emulate, -State_Load, -State_PushPC, -State_PushSP, -State_PopPC, -State_PopPCRel, -State_Not, -State_Flip, -State_PopSP, -State_Neqbranch, -State_Eq, -State_Loadb, -State_Mult, -State_Lessthan, -State_Lessthanorequal, -State_Ulessthanorequal, -State_Ulessthan, -State_Pushspadd, -State_Call, -State_Callpcrel, -State_Sub, -State_Break, -State_Storeb, -State_InsnFetch -); - -type StateType is -( -State_Load2, -State_Popped, -State_LoadSP2, -State_LoadSP3, -State_AddSP2, -State_Fetch, -State_Execute, -State_Decode, -State_Decode2, -State_Resync, - -State_StoreSP2, -State_Resync2, -State_Resync3, -State_Loadb2, -State_Storeb2, -State_Mult2, -State_Mult3, -State_Mult5, -State_Mult4, -State_BinaryOpResult2, -State_BinaryOpResult, -State_Idle -); - - -signal pc : unsigned(maxAddrBitIncIO downto 0); -signal sp : unsigned(maxAddrBitIncIO downto minAddrBit); -signal incSp : unsigned(maxAddrBitIncIO downto minAddrBit); -signal incIncSp : unsigned(maxAddrBitIncIO downto minAddrBit); -signal decSp : unsigned(maxAddrBitIncIO downto minAddrBit); -signal stackA : unsigned(wordSize-1 downto 0); -signal binaryOpResult : unsigned(wordSize-1 downto 0); -signal binaryOpResult2 : unsigned(wordSize-1 downto 0); -signal multResult2 : unsigned(wordSize-1 downto 0); -signal multResult3 : unsigned(wordSize-1 downto 0); -signal multResult : unsigned(wordSize-1 downto 0); -signal multA : unsigned(wordSize-1 downto 0); -signal multB : unsigned(wordSize-1 downto 0); -signal stackB : unsigned(wordSize-1 downto 0); -signal idim_flag : std_logic; -signal busy : std_logic; -signal mem_writeEnable : std_logic; -signal mem_readEnable : std_logic; -signal mem_addr : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal mem_delayAddr : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal mem_delayReadEnable : std_logic; - -signal decodeWord : std_logic_vector(wordSize-1 downto 0); - - -signal state : StateType; -signal insn : InsnType; -type InsnArray is array(0 to wordBytes-1) of InsnType; -signal decodedOpcode : InsnArray; - -type OpcodeArray is array(0 to wordBytes-1) of std_logic_vector(7 downto 0); - -signal opcode : OpcodeArray; - - - - -signal begin_inst : std_logic; -signal trace_opcode : std_logic_vector(7 downto 0); -signal trace_pc : std_logic_vector(maxAddrBitIncIO downto 0); -signal trace_sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal trace_topOfStack : std_logic_vector(wordSize-1 downto 0); -signal trace_topOfStackB : std_logic_vector(wordSize-1 downto 0); - --- state machine. - -begin - - - traceFileGenerate: - if Generate_Trace generate - trace_file: trace port map ( - clk => clk, - begin_inst => begin_inst, - pc => trace_pc, - opcode => trace_opcode, - sp => trace_sp, - memA => trace_topOfStack, - memB => trace_topOfStackB, - busy => busy, - intsp => (others => 'U') - ); - end generate; - - - -- the memory subsystem will tell us one cycle later whether or - -- not it is busy - out_mem_writeEnable <= mem_writeEnable; - out_mem_readEnable <= mem_readEnable; - out_mem_addr(maxAddrBitIncIO downto minAddrBit) <= mem_addr; - out_mem_addr(minAddrBit-1 downto 0) <= (others => '0'); - - incSp <= sp + 1; - incIncSp <= sp + 2; - decSp <= sp - 1; - - - opcodeControl: - process(clk, areset) - variable tOpcode : std_logic_vector(OpCode_Size-1 downto 0); - variable spOffset : unsigned(4 downto 0); - variable tSpOffset : unsigned(4 downto 0); - variable nextPC : unsigned(maxAddrBitIncIO downto 0); - variable tNextState : InsnType; - variable tDecodedOpcode : InsnArray; - variable tMultResult : unsigned(wordSize*2-1 downto 0); - begin - if areset = '1' then - state <= State_Idle; - break <= '0'; - sp <= unsigned(spStart(maxAddrBitIncIO downto minAddrBit)); - - pc <= (others => '0'); - idim_flag <= '0'; - begin_inst <= '0'; - mem_writeEnable <= '0'; - mem_readEnable <= '0'; - multA <= (others => '0'); - multB <= (others => '0'); - mem_writeMask <= (others => '1'); - elsif (clk'event and clk = '1') then - -- we must multiply unconditionally to get pipelined multiplication - tMultResult := multA * multB; - multResult3 <= multResult2; - multResult2 <= multResult; - multResult <= tMultResult(wordSize-1 downto 0); - - - binaryOpResult2 <= binaryOpResult; -- pipeline a bit. - - - multA <= (others => DontCareValue); - multB <= (others => DontCareValue); - - - mem_addr <= (others => DontCareValue); - mem_readEnable <='0'; - mem_writeEnable <='0'; - mem_write <= (others => DontCareValue); - - if (mem_writeEnable = '1') and (mem_readEnable = '1') then - report "read/write collision" severity failure; - end if; - - - - - spOffset(4):=not opcode(to_integer(pc(byteBits-1 downto 0)))(4); - spOffset(3 downto 0):=unsigned(opcode(to_integer(pc(byteBits-1 downto 0)))(3 downto 0)); - nextPC := pc + 1; - - -- prepare trace snapshot - trace_opcode <= opcode(to_integer(pc(byteBits-1 downto 0))); - trace_pc <= std_logic_vector(pc); - trace_sp <= std_logic_vector(sp); - trace_topOfStack <= std_logic_vector(stackA); - trace_topOfStackB <= std_logic_vector(stackB); - begin_inst <= '0'; - - - case state is - when State_Idle => - if enable='1' then - state <= State_Resync; - end if; - -- Initial state of ZPU, fetch top of stack + first instruction - when State_Resync => - if in_mem_busy='0' then - mem_addr <= std_logic_vector(sp); - mem_readEnable <= '1'; - state <= State_Resync2; - end if; - when State_Resync2 => - if in_mem_busy='0' then - stackA <= unsigned(mem_read); - mem_addr <= std_logic_vector(incSp); - mem_readEnable <= '1'; - state <= State_Resync3; - end if; - when State_Resync3 => - if in_mem_busy='0' then - stackB <= unsigned(mem_read); - mem_addr <= std_logic_vector(pc(maxAddrBitIncIO downto minAddrBit)); - mem_readEnable <= '1'; - state <= State_Decode; - end if; - when State_Decode => - if in_mem_busy='0' then - decodeWord <= mem_read; - state <= State_Decode2; - end if; - when State_Decode2 => - -- decode 4 instructions in parallel - for i in 0 to wordBytes-1 loop - tOpcode := decodeWord((wordBytes-1-i+1)*8-1 downto (wordBytes-1-i)*8); - - tSpOffset(4):=not tOpcode(4); - tSpOffset(3 downto 0):=unsigned(tOpcode(3 downto 0)); - - opcode(i) <= tOpcode; - if (tOpcode(7 downto 7)=OpCode_Im) then - tNextState:=State_Im; - elsif (tOpcode(7 downto 5)=OpCode_StoreSP) then - if tSpOffset = 0 then - tNextState := State_Pop; - elsif tSpOffset=1 then - tNextState := State_PopDown; - else - tNextState :=State_StoreSP; - end if; - elsif (tOpcode(7 downto 5)=OpCode_LoadSP) then - if tSpOffset = 0 then - tNextState :=State_Dup; - elsif tSpOffset = 1 then - tNextState :=State_DupStackB; - else - tNextState :=State_LoadSP; - end if; - elsif (tOpcode(7 downto 5)=OpCode_Emulate) then - tNextState :=State_Emulate; - if tOpcode(5 downto 0)=OpCode_Neqbranch then - tNextState :=State_Neqbranch; - elsif tOpcode(5 downto 0)=OpCode_Eq then - tNextState :=State_Eq; - elsif tOpcode(5 downto 0)=OpCode_Lessthan then - tNextState :=State_Lessthan; - elsif tOpcode(5 downto 0)=OpCode_Lessthanorequal then - --tNextState :=State_Lessthanorequal; - elsif tOpcode(5 downto 0)=OpCode_Ulessthan then - tNextState :=State_Ulessthan; - elsif tOpcode(5 downto 0)=OpCode_Ulessthanorequal then - --tNextState :=State_Ulessthanorequal; - elsif tOpcode(5 downto 0)=OpCode_Loadb then - tNextState :=State_Loadb; - elsif tOpcode(5 downto 0)=OpCode_Mult then - tNextState :=State_Mult; - elsif tOpcode(5 downto 0)=OpCode_Storeb then - tNextState :=State_Storeb; - elsif tOpcode(5 downto 0)=OpCode_Pushspadd then - tNextState :=State_Pushspadd; - elsif tOpcode(5 downto 0)=OpCode_Callpcrel then - tNextState :=State_Callpcrel; - elsif tOpcode(5 downto 0)=OpCode_Call then - --tNextState :=State_Call; - elsif tOpcode(5 downto 0)=OpCode_Sub then - tNextState :=State_Sub; - elsif tOpcode(5 downto 0)=OpCode_PopPCRel then - --tNextState :=State_PopPCRel; - end if; - elsif (tOpcode(7 downto 4)=OpCode_AddSP) then - if tSpOffset = 0 then - tNextState := State_Shift; - elsif tSpOffset = 1 then - tNextState := State_AddTop; - else - tNextState :=State_AddSP; - end if; - else - case tOpcode(3 downto 0) is - when OpCode_Nop => - tNextState :=State_Nop; - when OpCode_PushSP => - tNextState :=State_PushSP; - when OpCode_PopPC => - tNextState :=State_PopPC; - when OpCode_Add => - tNextState :=State_Add; - when OpCode_Or => - tNextState :=State_Or; - when OpCode_And => - tNextState :=State_And; - when OpCode_Load => - tNextState :=State_Load; - when OpCode_Not => - tNextState :=State_Not; - when OpCode_Flip => - tNextState :=State_Flip; - when OpCode_Store => - tNextState :=State_Store; - when OpCode_PopSP => - tNextState :=State_PopSP; - when others => - tNextState := State_Break; - - end case; - end if; - tDecodedOpcode(i) := tNextState; - - end loop; - - insn <= tDecodedOpcode(to_integer(pc(byteBits-1 downto 0))); - - -- once we wrap, we need to fetch - tDecodedOpcode(0) := State_InsnFetch; - - decodedOpcode <= tDecodedOpcode; - state <= State_Execute; - - - - -- Each instruction must: - -- - -- 1. set idim_flag - -- 2. increase pc if applicable - -- 3. set next state if appliable - -- 4. do it's operation - - when State_Execute => - insn <= decodedOpcode(to_integer(nextPC(byteBits-1 downto 0))); - - case insn is - when State_InsnFetch => - state <= State_Fetch; - when State_Im => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '1'; - pc <= pc + 1; - - if idim_flag='1' then - stackA(wordSize-1 downto 7) <= stackA(wordSize-8 downto 0); - stackA(6 downto 0) <= unsigned(opcode(to_integer(pc(byteBits-1 downto 0)))(6 downto 0)); - else - mem_writeEnable <= '1'; - mem_addr <= std_logic_vector(incSp); - mem_write <= std_logic_vector(stackB); - stackB <= stackA; - sp <= decSp; - for i in wordSize-1 downto 7 loop - stackA(i) <= opcode(to_integer(pc(byteBits-1 downto 0)))(6); - end loop; - stackA(6 downto 0) <= unsigned(opcode(to_integer(pc(byteBits-1 downto 0)))(6 downto 0)); - end if; - end if; - when State_StoreSP => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_StoreSP2; - - mem_writeEnable <= '1'; - mem_addr <= std_logic_vector(sp+spOffset); - mem_write <= std_logic_vector(stackA); - stackA <= stackB; - sp <= incSp; - end if; - - - when State_LoadSP => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_LoadSP2; - - sp <= decSp; - mem_writeEnable <= '1'; - mem_addr <= std_logic_vector(incSp); - mem_write <= std_logic_vector(stackB); - end if; - when State_Emulate => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - sp <= decSp; - mem_writeEnable <= '1'; - mem_addr <= std_logic_vector(incSp); - mem_write <= std_logic_vector(stackB); - stackA <= (others => DontCareValue); - stackA(maxAddrBitIncIO downto 0) <= pc + 1; - stackB <= stackA; - - -- The emulate address is: - -- 98 7654 3210 - -- 0000 00aa aaa0 0000 - pc <= (others => '0'); - pc(9 downto 5) <= unsigned(opcode(to_integer(pc(byteBits-1 downto 0)))(4 downto 0)); - state <= State_Fetch; - end if; - when State_Callpcrel => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - stackA <= (others => DontCareValue); - stackA(maxAddrBitIncIO downto 0) <= pc + 1; - - pc <= pc + stackA(maxAddrBitIncIO downto 0); - state <= State_Fetch; - end if; - when State_Call => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - stackA <= (others => DontCareValue); - stackA(maxAddrBitIncIO downto 0) <= pc + 1; - pc <= stackA(maxAddrBitIncIO downto 0); - state <= State_Fetch; - end if; - when State_AddSP => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_AddSP2; - - mem_readEnable <= '1'; - mem_addr <= std_logic_vector(sp+spOffset); - end if; - when State_PushSP => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - sp <= decSp; - stackA <= (others => '0'); - stackA(maxAddrBitIncIO downto minAddrBit) <= sp; - stackB <= stackA; - mem_writeEnable <= '1'; - mem_addr <= std_logic_vector(incSp); - mem_write <= std_logic_vector(stackB); - end if; - when State_PopPC => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= stackA(maxAddrBitIncIO downto 0); - sp <= incSp; - - mem_writeEnable <= '1'; - mem_addr <= std_logic_vector(incSp); - mem_write <= std_logic_vector(stackB); - state <= State_Resync; - end if; - when State_PopPCRel => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= stackA(maxAddrBitIncIO downto 0) + pc; - sp <= incSp; - - mem_writeEnable <= '1'; - mem_addr <= std_logic_vector(incSp); - mem_write <= std_logic_vector(stackB); - state <= State_Resync; - end if; - when State_Add => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - stackA <= stackA + stackB; - - mem_readEnable <= '1'; - mem_addr <= std_logic_vector(incIncSp); - sp <= incSp; - state <= State_Popped; - end if; - when State_Sub => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - binaryOpResult <= stackB - stackA; - state <= State_BinaryOpResult; - end if; - when State_Pop => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - mem_addr <= std_logic_vector(incIncSp); - mem_readEnable <= '1'; - sp <= incSp; - stackA <= stackB; - state <= State_Popped; - end if; - when State_PopDown => - if in_mem_busy='0' then - -- PopDown leaves top of stack unchanged - begin_inst <= '1'; - idim_flag <= '0'; - mem_addr <= std_logic_vector(incIncSp); - mem_readEnable <= '1'; - sp <= incSp; - state <= State_Popped; - end if; - when State_Or => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - stackA <= stackA or stackB; - mem_readEnable <= '1'; - mem_addr <= std_logic_vector(incIncSp); - sp <= incSp; - state <= State_Popped; - end if; - when State_And => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - - stackA <= stackA and stackB; - mem_readEnable <= '1'; - mem_addr <= std_logic_vector(incIncSp); - sp <= incSp; - state <= State_Popped; - end if; - when State_Eq => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - - binaryOpResult <= (others => '0'); - if (stackA=stackB) then - binaryOpResult(0) <= '1'; - end if; - state <= State_BinaryOpResult; - end if; - when State_Ulessthan => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - - binaryOpResult <= (others => '0'); - if (stackA - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - - binaryOpResult <= (others => '0'); - if (stackA<=stackB) then - binaryOpResult(0) <= '1'; - end if; - state <= State_BinaryOpResult; - end if; - when State_Lessthan => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - - binaryOpResult <= (others => '0'); - if (signed(stackA) - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - - binaryOpResult <= (others => '0'); - if (signed(stackA)<=signed(stackB)) then - binaryOpResult(0) <= '1'; - end if; - state <= State_BinaryOpResult; - end if; - when State_Load => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_Load2; - - mem_addr <= std_logic_vector(stackA(maxAddrBitIncIO downto minAddrBit)); - mem_readEnable <= '1'; - end if; - - when State_Dup => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - sp <= decSp; - stackB <= stackA; - mem_write <= std_logic_vector(stackB); - mem_addr <= std_logic_vector(incSp); - mem_writeEnable <= '1'; - end if; - when State_DupStackB => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - sp <= decSp; - stackA <= stackB; - stackB <= stackA; - mem_write <= std_logic_vector(stackB); - mem_addr <= std_logic_vector(incSp); - mem_writeEnable <= '1'; - end if; - when State_Store => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - mem_addr <= std_logic_vector(stackA(maxAddrBitIncIO downto minAddrBit)); - mem_write <= std_logic_vector(stackB); - mem_writeEnable <= '1'; - sp <= incIncSp; - state <= State_Resync; - end if; - when State_PopSP => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - mem_write <= std_logic_vector(stackB); - mem_addr <= std_logic_vector(incSp); - mem_writeEnable <= '1'; - sp <= stackA(maxAddrBitIncIO downto minAddrBit); - state <= State_Resync; - end if; - when State_Nop => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - when State_Not => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - stackA <= not stackA; - when State_Flip => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - for i in 0 to wordSize-1 loop - stackA(i) <= stackA(wordSize-1-i); - end loop; - when State_AddTop => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - stackA <= stackA + stackB; - when State_Shift => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - stackA(wordSize-1 downto 1) <= stackA(wordSize-2 downto 0); - stackA(0) <= '0'; - when State_Pushspadd => - begin_inst <= '1'; - idim_flag <= '0'; - pc <= pc + 1; - - stackA <= (others => '0'); - stackA(maxAddrBitIncIO downto minAddrBit) <= stackA(maxAddrBitIncIO-minAddrBit downto 0)+sp; - when State_Neqbranch => - -- branches are almost always taken as they form loops - begin_inst <= '1'; - idim_flag <= '0'; - sp <= incIncSp; - if (stackB/=0) then - pc <= stackA(maxAddrBitIncIO downto 0) + pc; - else - pc <= pc + 1; - end if; - -- need to fetch stack again. - state <= State_Resync; - when State_Mult => - begin_inst <= '1'; - idim_flag <= '0'; - - multA <= stackA; - multB <= stackB; - state <= State_Mult2; - when State_Break => - report "Break instruction encountered" severity failure; - break <= '1'; - - when State_Loadb => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_Loadb2; - - mem_addr <= std_logic_vector(stackA(maxAddrBitIncIO downto minAddrBit)); - mem_readEnable <= '1'; - end if; - when State_Storeb => - if in_mem_busy='0' then - begin_inst <= '1'; - idim_flag <= '0'; - state <= State_Storeb2; - - mem_addr <= std_logic_vector(stackA(maxAddrBitIncIO downto minAddrBit)); - mem_readEnable <= '1'; - end if; - - when others => - sp <= (others => DontCareValue); - report "Illegal instruction" severity failure; - break <= '1'; - end case; - - - when State_StoreSP2 => - if in_mem_busy='0' then - mem_addr <= std_logic_vector(incSp); - mem_readEnable <= '1'; - state <= State_Popped; - end if; - when State_LoadSP2 => - if in_mem_busy='0' then - state <= State_LoadSP3; - mem_readEnable <= '1'; - mem_addr <= std_logic_vector(sp+spOffset+1); - end if; - when State_LoadSP3 => - if in_mem_busy='0' then - pc <= pc + 1; - state <= State_Execute; - stackB <= stackA; - stackA <= unsigned(mem_read); - end if; - when State_AddSP2 => - if in_mem_busy='0' then - pc <= pc + 1; - state <= State_Execute; - stackA <= stackA + unsigned(mem_read); - end if; - when State_Load2 => - if in_mem_busy='0' then - stackA <= unsigned(mem_read); - pc <= pc + 1; - state <= State_Execute; - end if; - when State_Loadb2 => - if in_mem_busy='0' then - stackA <= (others => '0'); - stackA(7 downto 0) <= unsigned(mem_read(((wordBytes-1-to_integer(stackA(byteBits-1 downto 0)))*8+7) downto (wordBytes-1-to_integer(stackA(byteBits-1 downto 0)))*8)); - pc <= pc + 1; - state <= State_Execute; - end if; - when State_Storeb2 => - if in_mem_busy='0' then - mem_addr <= std_logic_vector(stackA(maxAddrBitIncIO downto minAddrBit)); - mem_write <= mem_read; - mem_write(((wordBytes-1-to_integer(stackA(byteBits-1 downto 0)))*8+7) downto (wordBytes-1-to_integer(stackA(byteBits-1 downto 0)))*8) <= std_logic_vector(stackB(7 downto 0)); - mem_writeEnable <= '1'; - pc <= pc + 1; - sp <= incIncSp; - state <= State_Resync; - end if; - when State_Fetch => - if in_mem_busy='0' then - mem_addr <= std_logic_vector(pc(maxAddrBitIncIO downto minAddrBit)); - mem_readEnable <= '1'; - state <= State_Decode; - end if; - when State_Mult2 => - state <= State_Mult3; - when State_Mult3 => - state <= State_Mult4; - when State_Mult4 => - state <= State_Mult5; - when State_Mult5 => - if in_mem_busy='0' then - stackA <= multResult3; - mem_readEnable <= '1'; - mem_addr <= std_logic_vector(incIncSp); - sp <= incSp; - state <= State_Popped; - end if; - when State_BinaryOpResult => - state <= State_BinaryOpResult2; - when State_BinaryOpResult2 => - mem_readEnable <= '1'; - mem_addr <= std_logic_vector(incIncSp); - sp <= incSp; - stackA <= binaryOpResult2; - state <= State_Popped; - when State_Popped => - if in_mem_busy='0' then - pc <= pc + 1; - stackB <= unsigned(mem_read); - state <= State_Execute; - end if; - when others => - sp <= (others => DontCareValue); - report "Illegal state" severity failure; - break <= '1'; - end case; - end if; - end process; - - - -end behave; diff --git a/zpu/hdl/zpu4/src/zpu_core_small.vhd b/zpu/hdl/zpu4/src/zpu_core_small.vhd deleted file mode 100644 index 9cda01c..0000000 --- a/zpu/hdl/zpu4/src/zpu_core_small.vhd +++ /dev/null @@ -1,464 +0,0 @@ --- Company: ZPU3 --- Engineer: Øyvind Harboe - -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use ieee.numeric_std.all; - -library work; -use work.zpu_config.all; -use work.zpupkg.all; - - -entity zpu_core is - Port ( clk : in std_logic; - areset : in std_logic; - enable : in std_logic; - in_mem_busy : in std_logic; - mem_read : in std_logic_vector(wordSize-1 downto 0); - mem_write : out std_logic_vector(wordSize-1 downto 0); - out_mem_addr : out std_logic_vector(maxAddrBitIncIO downto 0); - out_mem_writeEnable : out std_logic; - out_mem_readEnable : out std_logic; - mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); - interrupt : in std_logic; - break : out std_logic); -end zpu_core; - -architecture behave of zpu_core is - -signal readIO : std_logic; - - - -signal memAWriteEnable : std_logic; -signal memAAddr : unsigned(maxAddrBit downto minAddrBit); -signal memAWrite : unsigned(wordSize-1 downto 0); -signal memARead : unsigned(wordSize-1 downto 0); -signal memBWriteEnable : std_logic; -signal memBAddr : unsigned(maxAddrBit downto minAddrBit); -signal memBWrite : unsigned(wordSize-1 downto 0); -signal memBRead : unsigned(wordSize-1 downto 0); - - - -signal pc : unsigned(maxAddrBit downto 0); -signal sp : unsigned(maxAddrBit downto minAddrBit); - -signal idim_flag : std_logic; - ---signal storeToStack : std_logic; ---signal fetchNextInstruction : std_logic; ---signal extraCycle : std_logic; -signal busy : std_logic; ---signal fetching : std_logic; - -signal begin_inst : std_logic; - - - -signal trace_opcode : std_logic_vector(7 downto 0); -signal trace_pc : std_logic_vector(maxAddrBitIncIO downto 0); -signal trace_sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal trace_topOfStack : std_logic_vector(wordSize-1 downto 0); -signal trace_topOfStackB : std_logic_vector(wordSize-1 downto 0); - --- state machine. -type State_Type is -( -State_Fetch, -State_WriteIODone, -State_Execute, -State_StoreToStack, -State_Add, -State_Or, -State_And, -State_Store, -State_ReadIO, -State_WriteIO, -State_Load, -State_FetchNext, -State_AddSP, -State_ReadIODone, -State_Decode, -State_Resync -); - -type DecodedOpcodeType is -( -Decoded_Nop, -Decoded_Im, -Decoded_ImShift, -Decoded_LoadSP, -Decoded_StoreSP , -Decoded_AddSP, -Decoded_Emulate, -Decoded_Break, -Decoded_PushSP, -Decoded_PopPC, -Decoded_Add, -Decoded_Or, -Decoded_And, -Decoded_Load, -Decoded_Not, -Decoded_Flip, -Decoded_Store, -Decoded_PopSP -); - - - -signal sampledOpcode : std_logic_vector(OpCode_Size-1 downto 0); -signal opcode : std_logic_vector(OpCode_Size-1 downto 0); - -signal decodedOpcode : DecodedOpcodeType; -signal sampledDecodedOpcode : DecodedOpcodeType; - - -signal state : State_Type; - -subtype AddrBitBRAM_range is natural range maxAddrBitBRAM downto minAddrBit; -signal memAAddr_stdlogic : std_logic_vector(AddrBitBRAM_range); -signal memAWrite_stdlogic : std_logic_vector(memAWrite'range); -signal memARead_stdlogic : std_logic_vector(memARead'range); -signal memBAddr_stdlogic : std_logic_vector(AddrBitBRAM_range); -signal memBWrite_stdlogic : std_logic_vector(memBWrite'range); -signal memBRead_stdlogic : std_logic_vector(memBRead'range); - --- debug -subtype index is integer range 0 to 3; -signal tOpcode_sel : index; - - -begin - traceFileGenerate: - if Generate_Trace generate - trace_file: trace port map ( - clk => clk, - begin_inst => begin_inst, - pc => trace_pc, - opcode => trace_opcode, - sp => trace_sp, - memA => trace_topOfStack, - memB => trace_topOfStackB, - busy => busy, - intsp => (others => 'U') - ); - end generate; - - -- not used in this design - mem_writeMask <= (others => '1'); - - memAAddr_stdlogic <= std_logic_vector(memAAddr(AddrBitBRAM_range)); - memAWrite_stdlogic <= std_logic_vector(memAWrite); - memBAddr_stdlogic <= std_logic_vector(memBAddr(AddrBitBRAM_range)); - memBWrite_stdlogic <= std_logic_vector(memBWrite); - memory: dualport_ram port map ( - clk => clk, - memAWriteEnable => memAWriteEnable, - memAAddr => memAAddr_stdlogic, - memAWrite => memAWrite_stdlogic, - memARead => memARead_stdlogic, - memBWriteEnable => memBWriteEnable, - memBAddr => memBAddr_stdlogic, - memBWrite => memBWrite_stdlogic, - memBRead => memBRead_stdlogic - ); - memARead <= unsigned(memARead_stdlogic); - memBRead <= unsigned(memBRead_stdlogic); - -tOpcode_sel <= to_integer(pc(minAddrBit-1 downto 0)); - - - decodeControl: - process(memBRead, pc,tOpcode_sel) - variable tOpcode : std_logic_vector(OpCode_Size-1 downto 0); - begin - -- not worked with synopsys - -- tOpcode := std_logic_vector(memBRead((wordBytes-1-to_integer(pc(minAddrBit-1 downto 0))+1)*8-1 downto (wordBytes-1-to_integer(pc(minAddrBit-1 downto 0)))*8)); - -- use full case - case (tOpcode_sel) is - when 0 => tOpcode := std_logic_vector(memBRead(31 downto 24)); - when 1 => tOpcode := std_logic_vector(memBRead(23 downto 16)); - when 2 => tOpcode := std_logic_vector(memBRead(15 downto 8)); - when 3 => tOpcode := std_logic_vector(memBRead(7 downto 0)); - when others => tOpcode := std_logic_vector(memBRead(7 downto 0)); - end case; - sampledOpcode <= tOpcode; - - if (tOpcode(7 downto 7)=OpCode_Im) then - sampledDecodedOpcode<=Decoded_Im; - elsif (tOpcode(7 downto 5)=OpCode_StoreSP) then - sampledDecodedOpcode<=Decoded_StoreSP; - elsif (tOpcode(7 downto 5)=OpCode_LoadSP) then - sampledDecodedOpcode<=Decoded_LoadSP; - elsif (tOpcode(7 downto 5)=OpCode_Emulate) then - sampledDecodedOpcode<=Decoded_Emulate; - elsif (tOpcode(7 downto 4)=OpCode_AddSP) then - sampledDecodedOpcode<=Decoded_AddSP; - else - case tOpcode(3 downto 0) is - when OpCode_Break => - sampledDecodedOpcode<=Decoded_Break; - when OpCode_PushSP => - sampledDecodedOpcode<=Decoded_PushSP; - when OpCode_PopPC => - sampledDecodedOpcode<=Decoded_PopPC; - when OpCode_Add => - sampledDecodedOpcode<=Decoded_Add; - when OpCode_Or => - sampledDecodedOpcode<=Decoded_Or; - when OpCode_And => - sampledDecodedOpcode<=Decoded_And; - when OpCode_Load => - sampledDecodedOpcode<=Decoded_Load; - when OpCode_Not => - sampledDecodedOpcode<=Decoded_Not; - when OpCode_Flip => - sampledDecodedOpcode<=Decoded_Flip; - when OpCode_Store => - sampledDecodedOpcode<=Decoded_Store; - when OpCode_PopSP => - sampledDecodedOpcode<=Decoded_PopSP; - when others => - sampledDecodedOpcode<=Decoded_Nop; - end case; - end if; - end process; - - - opcodeControl: - process(clk, areset) - variable spOffset : unsigned(4 downto 0); - begin - if areset = '1' then - state <= State_Resync; - break <= '0'; - sp <= unsigned(spStart(maxAddrBit downto minAddrBit)); - pc <= (others => '0'); - idim_flag <= '0'; - begin_inst <= '0'; - memAAddr <= (others => '0'); - memBAddr <= (others => '0'); - memAWriteEnable <= '0'; - memBWriteEnable <= '0'; - out_mem_writeEnable <= '0'; - out_mem_readEnable <= '0'; - memAWrite <= (others => '0'); - memBWrite <= (others => '0'); - -- avoid Latch in synopsys - -- mem_writeMask <= (others => '1'); - elsif (clk'event and clk = '1') then - memAWriteEnable <= '0'; - memBWriteEnable <= '0'; - -- This saves ca. 100 LUT's, by explicitly declaring that the - -- memAWrite can be left at whatever value if memAWriteEnable is - -- not set. - memAWrite <= (others => DontCareValue); - memBWrite <= (others => DontCareValue); --- out_mem_addr <= (others => DontCareValue); --- mem_write <= (others => DontCareValue); - spOffset := (others => DontCareValue); - memAAddr <= (others => DontCareValue); - memBAddr <= (others => DontCareValue); - - out_mem_writeEnable <= '0'; - out_mem_readEnable <= '0'; - begin_inst <= '0'; - out_mem_addr <= std_logic_vector(memARead(maxAddrBitIncIO downto 0)); - mem_write <= std_logic_vector(memBRead); - - decodedOpcode <= sampledDecodedOpcode; - opcode <= sampledOpcode; - - case state is - when State_Execute => - state <= State_Fetch; - -- at this point: - -- memBRead contains opcode word - -- memARead contains top of stack - pc <= pc + 1; - - -- trace - begin_inst <= '1'; - trace_pc <= (others => '0'); - trace_pc(maxAddrBit downto 0) <= std_logic_vector(pc); - trace_opcode <= opcode; - trace_sp <= (others => '0'); - trace_sp(maxAddrBit downto minAddrBit) <= std_logic_vector(sp); - trace_topOfStack <= std_logic_vector(memARead); - trace_topOfStackB <= std_logic_vector(memBRead); - - -- during the next cycle we'll be reading the next opcode - spOffset(4):=not opcode(4); - spOffset(3 downto 0) := unsigned(opcode(3 downto 0)); - - idim_flag <= '0'; - case decodedOpcode is - when Decoded_Im => - idim_flag <= '1'; - memAWriteEnable <= '1'; - if (idim_flag='0') then - sp <= sp - 1; - memAAddr <= sp-1; - for i in wordSize-1 downto 7 loop - memAWrite(i) <= opcode(6); - end loop; - memAWrite(6 downto 0) <= unsigned(opcode(6 downto 0)); - else - memAAddr <= sp; - memAWrite(wordSize-1 downto 7) <= memARead(wordSize-8 downto 0); - memAWrite(6 downto 0) <= unsigned(opcode(6 downto 0)); - end if; - when Decoded_StoreSP => - memBWriteEnable <= '1'; - memBAddr <= sp+spOffset; - memBWrite <= memARead; - sp <= sp + 1; - state <= State_Resync; - when Decoded_LoadSP => - sp <= sp - 1; - memAAddr <= sp+spOffset; - when Decoded_Emulate => - sp <= sp - 1; - memAWriteEnable <= '1'; - memAAddr <= sp - 1; - memAWrite <= (others => DontCareValue); - memAWrite(maxAddrBit downto 0) <= pc + 1; - -- The emulate address is: - -- 98 7654 3210 - -- 0000 00aa aaa0 0000 - pc <= (others => '0'); - pc(9 downto 5) <= unsigned(opcode(4 downto 0)); - when Decoded_AddSP => - memAAddr <= sp; - memBAddr <= sp+spOffset; - state <= State_AddSP; - when Decoded_Break => - report "Break instruction encountered" severity failure; - break <= '1'; - when Decoded_PushSP => - memAWriteEnable <= '1'; - memAAddr <= sp - 1; - sp <= sp - 1; - memAWrite <= (others => DontCareValue); - memAWrite(maxAddrBit downto minAddrBit) <= sp; - when Decoded_PopPC => - pc <= memARead(maxAddrBit downto 0); - sp <= sp + 1; - state <= State_Resync; - when Decoded_Add => - sp <= sp + 1; - state <= State_Add; - when Decoded_Or => - sp <= sp + 1; - state <= State_Or; - when Decoded_And => - sp <= sp + 1; - state <= State_And; - when Decoded_Load => - if (memARead(ioBit)='1') then - out_mem_addr <= std_logic_vector(memARead(maxAddrBitIncIO downto 0)); - out_mem_readEnable <= '1'; - state <= State_ReadIO; - else - memAAddr <= memARead(maxAddrBit downto minAddrBit); - end if; - when Decoded_Not => - memAAddr <= sp(maxAddrBit downto minAddrBit); - memAWriteEnable <= '1'; - memAWrite <= not memARead; - when Decoded_Flip => - memAAddr <= sp(maxAddrBit downto minAddrBit); - memAWriteEnable <= '1'; - for i in 0 to wordSize-1 loop - memAWrite(i) <= memARead(wordSize-1-i); - end loop; - when Decoded_Store => - memBAddr <= sp + 1; - sp <= sp + 1; - if (memARead(ioBit)='1') then - state <= State_WriteIO; - else - state <= State_Store; - end if; - when Decoded_PopSP => - sp <= memARead(maxAddrBit downto minAddrBit); - state <= State_Resync; - when Decoded_Nop => - memAAddr <= sp; - when others => - null; - end case; - when State_ReadIO => - if (in_mem_busy = '0') then - state <= State_Fetch; - memAWriteEnable <= '1'; - memAWrite <= unsigned(mem_read); - end if; - when State_WriteIO => - sp <= sp + 1; - out_mem_writeEnable <= '1'; - out_mem_addr <= std_logic_vector(memARead(maxAddrBitIncIO downto 0)); - mem_write <= std_logic_vector(memBRead); - state <= State_WriteIODone; - when State_WriteIODone => - if (in_mem_busy = '0') then - state <= State_Resync; - end if; - when State_Fetch => - -- We need to resync. During the *next* cycle - -- we'll fetch the opcode @ pc and thus it will - -- be available for State_Execute the cycle after - -- next - memBAddr <= pc(maxAddrBit downto minAddrBit); - state <= State_FetchNext; - when State_FetchNext => - -- at this point memARead contains the value that is either - -- from the top of stack or should be copied to the top of the stack - memAWriteEnable <= '1'; - memAWrite <= memARead; - memAAddr <= sp; - memBAddr <= sp + 1; - state <= State_Decode; - when State_Decode => - -- during the State_Execute cycle we'll be fetching SP+1 - memAAddr <= sp; - memBAddr <= sp + 1; - state <= State_Execute; - when State_Store => - sp <= sp + 1; - memAWriteEnable <= '1'; - memAAddr <= memARead(maxAddrBit downto minAddrBit); - memAWrite <= memBRead; - state <= State_Resync; - when State_AddSP => - state <= State_Add; - when State_Add => - memAAddr <= sp; - memAWriteEnable <= '1'; - memAWrite <= memARead + memBRead; - state <= State_Fetch; - when State_Or => - memAAddr <= sp; - memAWriteEnable <= '1'; - memAWrite <= memARead or memBRead; - state <= State_Fetch; - when State_Resync => - memAAddr <= sp; - state <= State_Fetch; - when State_And => - memAAddr <= sp; - memAWriteEnable <= '1'; - memAWrite <= memARead and memBRead; - state <= State_Fetch; - when others => - null; - end case; - - end if; - end process; - - - -end behave; diff --git a/zpu/hdl/zpu4/src/zpu_core_small_wip.vhd b/zpu/hdl/zpu4/src/zpu_core_small_wip.vhd deleted file mode 100644 index 8d87804..0000000 --- a/zpu/hdl/zpu4/src/zpu_core_small_wip.vhd +++ /dev/null @@ -1,497 +0,0 @@ --- Company: ZPU3 --- Engineer: Øyvind Harboe - -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use ieee.numeric_std.all; - -library work; -use work.zpu_config.all; -use work.zpupkg.all; - - -entity zpu_core is - Port ( clk : in std_logic; - areset : in std_logic; - enable : in std_logic; - in_mem_busy : in std_logic; - mem_read : in std_logic_vector(wordSize-1 downto 0); - mem_write : out std_logic_vector(wordSize-1 downto 0); - out_mem_addr : out std_logic_vector(maxAddrBitIncIO downto 0); - out_mem_writeEnable : out std_logic; - out_mem_readEnable : out std_logic; - mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); - interrupt : in std_logic; - break : out std_logic); -end zpu_core; - -architecture behave of zpu_core is - -signal readIO : std_logic; - - - -signal memAWriteEnable : std_logic; -signal memAAddr : unsigned(maxAddrBit downto minAddrBit); -signal memAWrite : unsigned(wordSize-1 downto 0); -signal memARead : unsigned(wordSize-1 downto 0); -signal memBWriteEnable : std_logic; -signal memBAddr : unsigned(maxAddrBit downto minAddrBit); -signal memBWrite : unsigned(wordSize-1 downto 0); -signal memBRead : unsigned(wordSize-1 downto 0); - - - -signal pc : unsigned(maxAddrBit downto 0); -signal sp : unsigned(maxAddrBit downto minAddrBit); - -signal idim_flag : std_logic; - ---signal storeToStack : std_logic; ---signal fetchNextInstruction : std_logic; ---signal extraCycle : std_logic; -signal busy : std_logic; ---signal fetching : std_logic; - -signal begin_inst : std_logic; - - - -signal trace_opcode : std_logic_vector(7 downto 0); -signal trace_pc : std_logic_vector(maxAddrBitIncIO downto 0); -signal trace_sp : std_logic_vector(maxAddrBitIncIO downto minAddrBit); -signal trace_topOfStack : std_logic_vector(wordSize-1 downto 0); -signal trace_topOfStackB : std_logic_vector(wordSize-1 downto 0); - --- state machine. -type State_Type is -( -State_Fetch, -State_WriteIODone, -State_Execute, -State_StoreToStack, -State_Add, -State_Or, -State_And, -State_Store, -State_ReadIO, -State_WriteIO, -State_Load, -State_FetchNext, -State_AddSP, -State_ReadIODone, -State_Decode, -State_Resync, -State_Interrupt - -); - -type DecodedOpcodeType is -( -Decoded_Nop, -Decoded_Im, -Decoded_ImShift, -Decoded_LoadSP, -Decoded_StoreSP , -Decoded_AddSP, -Decoded_Emulate, -Decoded_Break, -Decoded_PushSP, -Decoded_PopPC, -Decoded_Add, -Decoded_Or, -Decoded_And, -Decoded_Load, -Decoded_Not, -Decoded_Flip, -Decoded_Store, -Decoded_PopSP -); - - - -signal sampledOpcode : std_logic_vector(OpCode_Size-1 downto 0); -signal opcode : std_logic_vector(OpCode_Size-1 downto 0); - -signal decodedOpcode : DecodedOpcodeType; -signal sampledDecodedOpcode : DecodedOpcodeType; - - -signal state : State_Type; - -subtype AddrBitBRAM_range is natural range maxAddrBitBRAM downto minAddrBit; -signal memAAddr_stdlogic : std_logic_vector(AddrBitBRAM_range); -signal memAWrite_stdlogic : std_logic_vector(memAWrite'range); -signal memARead_stdlogic : std_logic_vector(memARead'range); -signal memBAddr_stdlogic : std_logic_vector(AddrBitBRAM_range); -signal memBWrite_stdlogic : std_logic_vector(memBWrite'range); -signal memBRead_stdlogic : std_logic_vector(memBRead'range); - -subtype index is integer range 0 to 3; - -signal tOpcode_sel : index; - - -signal inInterrupt : std_logic; - - - -begin - traceFileGenerate: - if Generate_Trace generate - trace_file: trace port map ( - clk => clk, - begin_inst => begin_inst, - pc => trace_pc, - opcode => trace_opcode, - sp => trace_sp, - memA => trace_topOfStack, - memB => trace_topOfStackB, - busy => busy, - intsp => (others => 'U') - ); - end generate; - - - - -- not used in this design - - mem_writeMask <= (others => '1'); - - - - memAAddr_stdlogic <= std_logic_vector(memAAddr(AddrBitBRAM_range)); - memAWrite_stdlogic <= std_logic_vector(memAWrite); - memBAddr_stdlogic <= std_logic_vector(memBAddr(AddrBitBRAM_range)); - memBWrite_stdlogic <= std_logic_vector(memBWrite); - memory: dualport_ram port map ( - clk => clk, - memAWriteEnable => memAWriteEnable, - memAAddr => memAAddr_stdlogic, - memAWrite => memAWrite_stdlogic, - memARead => memARead_stdlogic, - memBWriteEnable => memBWriteEnable, - memBAddr => memBAddr_stdlogic, - memBWrite => memBWrite_stdlogic, - memBRead => memBRead_stdlogic - ); - memARead <= unsigned(memARead_stdlogic); - memBRead <= unsigned(memBRead_stdlogic); - - - - tOpcode_sel <= to_integer(pc(minAddrBit-1 downto 0)); - - - - decodeControl: - process(memBRead, pc,tOpcode_sel) - variable tOpcode : std_logic_vector(OpCode_Size-1 downto 0); - begin - - -- simplify opcode selection a bit so it passes more synthesizers - case (tOpcode_sel) is - - when 0 => tOpcode := std_logic_vector(memBRead(31 downto 24)); - - when 1 => tOpcode := std_logic_vector(memBRead(23 downto 16)); - - when 2 => tOpcode := std_logic_vector(memBRead(15 downto 8)); - - when 3 => tOpcode := std_logic_vector(memBRead(7 downto 0)); - - when others => tOpcode := std_logic_vector(memBRead(7 downto 0)); - end case; - - sampledOpcode <= tOpcode; - - if (tOpcode(7 downto 7)=OpCode_Im) then - sampledDecodedOpcode<=Decoded_Im; - elsif (tOpcode(7 downto 5)=OpCode_StoreSP) then - sampledDecodedOpcode<=Decoded_StoreSP; - elsif (tOpcode(7 downto 5)=OpCode_LoadSP) then - sampledDecodedOpcode<=Decoded_LoadSP; - elsif (tOpcode(7 downto 5)=OpCode_Emulate) then - sampledDecodedOpcode<=Decoded_Emulate; - elsif (tOpcode(7 downto 4)=OpCode_AddSP) then - sampledDecodedOpcode<=Decoded_AddSP; - else - case tOpcode(3 downto 0) is - when OpCode_Break => - sampledDecodedOpcode<=Decoded_Break; - when OpCode_PushSP => - sampledDecodedOpcode<=Decoded_PushSP; - when OpCode_PopPC => - sampledDecodedOpcode<=Decoded_PopPC; - when OpCode_Add => - sampledDecodedOpcode<=Decoded_Add; - when OpCode_Or => - sampledDecodedOpcode<=Decoded_Or; - when OpCode_And => - sampledDecodedOpcode<=Decoded_And; - when OpCode_Load => - sampledDecodedOpcode<=Decoded_Load; - when OpCode_Not => - sampledDecodedOpcode<=Decoded_Not; - when OpCode_Flip => - sampledDecodedOpcode<=Decoded_Flip; - when OpCode_Store => - sampledDecodedOpcode<=Decoded_Store; - when OpCode_PopSP => - sampledDecodedOpcode<=Decoded_PopSP; - when others => - sampledDecodedOpcode<=Decoded_Nop; - end case; - end if; - end process; - - - opcodeControl: - process(clk, areset) - variable spOffset : unsigned(4 downto 0); - begin - if areset = '1' then - state <= State_Resync; - break <= '0'; - sp <= unsigned(spStart(maxAddrBit downto minAddrBit)); - pc <= (others => '0'); - idim_flag <= '0'; - begin_inst <= '0'; - memAAddr <= (others => '0'); - memBAddr <= (others => '0'); - memAWriteEnable <= '0'; - memBWriteEnable <= '0'; - out_mem_writeEnable <= '0'; - out_mem_readEnable <= '0'; - memAWrite <= (others => '0'); - memBWrite <= (others => '0'); - inInterrupt <= '0'; - elsif (clk'event and clk = '1') then - memAWriteEnable <= '0'; - memBWriteEnable <= '0'; - -- This saves ca. 100 LUT's, by explicitly declaring that the - -- memAWrite can be left at whatever value if memAWriteEnable is - -- not set. - memAWrite <= (others => DontCareValue); - memBWrite <= (others => DontCareValue); --- out_mem_addr <= (others => DontCareValue); --- mem_write <= (others => DontCareValue); - spOffset := (others => DontCareValue); - memAAddr <= (others => DontCareValue); - memBAddr <= (others => DontCareValue); - - out_mem_writeEnable <= '0'; - out_mem_readEnable <= '0'; - begin_inst <= '0'; - out_mem_addr <= std_logic_vector(memARead(maxAddrBitIncIO downto 0)); - mem_write <= std_logic_vector(memBRead); - - decodedOpcode <= sampledDecodedOpcode; - opcode <= sampledOpcode; - if interrupt='0' then - inInterrupt <= '0'; -- no longer in an interrupt - end if; - - case state is - when State_Execute => - state <= State_Fetch; - -- at this point: - -- memBRead contains opcode word - -- memARead contains top of stack - pc <= pc + 1; - - -- trace - begin_inst <= '1'; - trace_pc <= (others => '0'); - trace_pc(maxAddrBit downto 0) <= std_logic_vector(pc); - trace_opcode <= opcode; - trace_sp <= (others => '0'); - trace_sp(maxAddrBit downto minAddrBit) <= std_logic_vector(sp); - trace_topOfStack <= std_logic_vector(memARead); - trace_topOfStackB <= std_logic_vector(memBRead); - - -- during the next cycle we'll be reading the next opcode - spOffset(4):=not opcode(4); - spOffset(3 downto 0) := unsigned(opcode(3 downto 0)); - - idim_flag <= '0'; - case decodedOpcode is - when Decoded_Interrupt => - sp <= sp - 1; - memAAddr <= sp - 1; - memAWriteEnable <= '1'; - memAWrite <= (others => DontCareValue); - memAWrite(maxAddrBitIncIO downto 0) <= pc; - pc <= conv_std_logic_vector(32, maxAddrBitIncIo+1); -- interrupt address - report "ZPU jumped to interrupt!" severity note; - when Decoded_Im => - idim_flag <= '1'; - memAWriteEnable <= '1'; - if (idim_flag='0') then - sp <= sp - 1; - memAAddr <= sp-1; - for i in wordSize-1 downto 7 loop - memAWrite(i) <= opcode(6); - end loop; - memAWrite(6 downto 0) <= unsigned(opcode(6 downto 0)); - else - memAAddr <= sp; - memAWrite(wordSize-1 downto 7) <= memARead(wordSize-8 downto 0); - memAWrite(6 downto 0) <= unsigned(opcode(6 downto 0)); - end if; - when Decoded_StoreSP => - memBWriteEnable <= '1'; - memBAddr <= sp+spOffset; - memBWrite <= memARead; - sp <= sp + 1; - state <= State_Resync; - when Decoded_LoadSP => - sp <= sp - 1; - memAAddr <= sp+spOffset; - when Decoded_Emulate => - sp <= sp - 1; - memAWriteEnable <= '1'; - memAAddr <= sp - 1; - memAWrite <= (others => DontCareValue); - memAWrite(maxAddrBit downto 0) <= pc + 1; - -- The emulate address is: - -- 98 7654 3210 - -- 0000 00aa aaa0 0000 - pc <= (others => '0'); - pc(9 downto 5) <= unsigned(opcode(4 downto 0)); - when Decoded_AddSP => - memAAddr <= sp; - memBAddr <= sp+spOffset; - state <= State_AddSP; - when Decoded_Break => - report "Break instruction encountered" severity failure; - break <= '1'; - when Decoded_PushSP => - memAWriteEnable <= '1'; - memAAddr <= sp - 1; - sp <= sp - 1; - memAWrite <= (others => DontCareValue); - memAWrite(maxAddrBit downto minAddrBit) <= sp; - when Decoded_PopPC => - pc <= memARead(maxAddrBit downto 0); - sp <= sp + 1; - state <= State_Resync; - when Decoded_Add => - sp <= sp + 1; - state <= State_Add; - when Decoded_Or => - sp <= sp + 1; - state <= State_Or; - when Decoded_And => - sp <= sp + 1; - state <= State_And; - when Decoded_Load => - if (memARead(ioBit)='1') then - out_mem_addr <= std_logic_vector(memARead(maxAddrBitIncIO downto 0)); - out_mem_readEnable <= '1'; - state <= State_ReadIO; - else - memAAddr <= memARead(maxAddrBit downto minAddrBit); - end if; - when Decoded_Not => - memAAddr <= sp(maxAddrBit downto minAddrBit); - memAWriteEnable <= '1'; - memAWrite <= not memARead; - when Decoded_Flip => - memAAddr <= sp(maxAddrBit downto minAddrBit); - memAWriteEnable <= '1'; - for i in 0 to wordSize-1 loop - memAWrite(i) <= memARead(wordSize-1-i); - end loop; - when Decoded_Store => - memBAddr <= sp + 1; - sp <= sp + 1; - if (memARead(ioBit)='1') then - state <= State_WriteIO; - else - state <= State_Store; - end if; - when Decoded_PopSP => - sp <= memARead(maxAddrBit downto minAddrBit); - state <= State_Resync; - when Decoded_Nop => - memAAddr <= sp; - when others => - null; - end case; - when State_ReadIO => - if (in_mem_busy = '0') then - state <= State_Fetch; - memAWriteEnable <= '1'; - memAWrite <= unsigned(mem_read); - end if; - when State_WriteIO => - sp <= sp + 1; - out_mem_writeEnable <= '1'; - out_mem_addr <= std_logic_vector(memARead(maxAddrBitIncIO downto 0)); - mem_write <= std_logic_vector(memBRead); - state <= State_WriteIODone; - when State_WriteIODone => - if (in_mem_busy = '0') then - state <= State_Resync; - end if; - when State_Fetch => - -- We need to resync. During the *next* cycle - -- we'll fetch the opcode @ pc and thus it will - -- be available for State_Execute the cycle after - -- next - memBAddr <= pc(maxAddrBit downto minAddrBit); - state <= State_FetchNext; - when State_FetchNext => - -- at this point memARead contains the value that is either - -- from the top of stack or should be copied to the top of the stack - memAWriteEnable <= '1'; - memAWrite <= memARead; - memAAddr <= sp; - memBAddr <= sp + 1; - state <= State_Decode; - when State_Decode => - if interrupt='1' and inInterrupt='0' and idim_flag='0' then - -- We got an interrupt, execute interrupt instead of next instruction - decodedOpcode <= Decoded_Interrupt; - end if; - -- during the State_Execute cycle we'll be fetching SP+1 - memAAddr <= sp; - memBAddr <= sp + 1; - state <= State_Execute; - when State_Store => - sp <= sp + 1; - memAWriteEnable <= '1'; - memAAddr <= memARead(maxAddrBit downto minAddrBit); - memAWrite <= memBRead; - state <= State_Resync; - when State_AddSP => - state <= State_Add; - when State_Add => - memAAddr <= sp; - memAWriteEnable <= '1'; - memAWrite <= memARead + memBRead; - state <= State_Fetch; - when State_Or => - memAAddr <= sp; - memAWriteEnable <= '1'; - memAWrite <= memARead or memBRead; - state <= State_Fetch; - when State_Resync => - memAAddr <= sp; - state <= State_Fetch; - when State_And => - memAAddr <= sp; - memAWriteEnable <= '1'; - memAWrite <= memARead and memBRead; - state <= State_Fetch; - when others => - null; - end case; - - end if; - end process; - - - -end behave; diff --git a/zpu/hdl/zpu4/src/zpupkg.vhd b/zpu/hdl/zpu4/src/zpupkg.vhd deleted file mode 100644 index f3800b0..0000000 --- a/zpu/hdl/zpu4/src/zpupkg.vhd +++ /dev/null @@ -1,170 +0,0 @@ -library IEEE; -use IEEE.STD_LOGIC_1164.all; -use ieee.numeric_std.all; - -library work; -use work.zpu_config.all; - -package zpupkg is - - -- This bit is set for read/writes to IO - -- FIX!!! eventually this should be set to wordSize-1 so as to - -- to make the address of IO independent of amount of memory - -- reserved for CPU. Requires trivial tweaks in toolchain/runtime - -- libraries. - - constant byteBits : integer := wordPower-3; -- # of bits in a word that addresses bytes - constant maxAddrBit : integer := maxAddrBitIncIO-1; - constant ioBit : integer := maxAddrBit+1; - constant wordSize : integer := 2**wordPower; - constant wordBytes : integer := wordSize/8; - constant minAddrBit : integer := byteBits; - -- configurable internal stack size. Probably going to be 16 after toolchain is done - constant stack_bits : integer := 5; - constant stack_size : integer := 2**stack_bits; - - - component dualport_ram is - port (clk : in std_logic; - memAWriteEnable : in std_logic; - memAAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit); - memAWrite : in std_logic_vector(wordSize-1 downto 0); - memARead : out std_logic_vector(wordSize-1 downto 0); - memBWriteEnable : in std_logic; - memBAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit); - memBWrite : in std_logic_vector(wordSize-1 downto 0); - memBRead : out std_logic_vector(wordSize-1 downto 0)); - end component; - - - component dram is - port (clk : in std_logic; - areset : in std_logic; - mem_writeEnable : in std_logic; - mem_readEnable : in std_logic; - mem_addr : in std_logic_vector(maxAddrBit downto 0); - mem_write : in std_logic_vector(wordSize-1 downto 0); - mem_read : out std_logic_vector(wordSize-1 downto 0); - mem_busy : out std_logic; - mem_writeMask : in std_logic_vector(wordBytes-1 downto 0)); - end component; - - - component trace is - port( - clk : in std_logic; - begin_inst : in std_logic; - pc : in std_logic_vector(maxAddrBitIncIO downto 0); - opcode : in std_logic_vector(7 downto 0); - sp : in std_logic_vector(maxAddrBitIncIO downto minAddrBit); - memA : in std_logic_vector(wordSize-1 downto 0); - memB : in std_logic_vector(wordSize-1 downto 0); - busy : in std_logic; - intSp : in std_logic_vector(stack_bits-1 downto 0) - ); - end component; - - component zpu_core is - port ( clk : in std_logic; - areset : in std_logic; - enable : in std_logic; - in_mem_busy : in std_logic; - mem_read : in std_logic_vector(wordSize-1 downto 0); - mem_write : out std_logic_vector(wordSize-1 downto 0); - out_mem_addr : out std_logic_vector(maxAddrBitIncIO downto 0); - out_mem_writeEnable : out std_logic; - out_mem_readEnable : out std_logic; - mem_writeMask: out std_logic_vector(wordBytes-1 downto 0); - interrupt : in std_logic; - break : out std_logic); - end component; - - - - component timer is - port( - clk : in std_logic; - areset : in std_logic; - we : in std_logic; - din : in std_logic_vector(7 downto 0); - adr : in std_logic_vector(2 downto 0); - dout : out std_logic_vector(7 downto 0)); - end component; - - component zpuio is - port ( areset : in std_logic; - cpu_clk : in std_logic; - clk_status : in std_logic_vector(2 downto 0); - cpu_din : in std_logic_vector(15 downto 0); - cpu_a : in std_logic_vector(20 downto 0); - cpu_we : in std_logic_vector(1 downto 0); - cpu_re : in std_logic; - cpu_dout : inout std_logic_vector(15 downto 0)); - end component; - - - - - -- opcode decode constants - constant OpCode_Im : std_logic_vector(7 downto 7) := "1"; - constant OpCode_StoreSP : std_logic_vector(7 downto 5) := "010"; - constant OpCode_LoadSP : std_logic_vector(7 downto 5) := "011"; - constant OpCode_Emulate : std_logic_vector(7 downto 5) := "001"; - constant OpCode_AddSP : std_logic_vector(7 downto 4) := "0001"; - constant OpCode_Short : std_logic_vector(7 downto 4) := "0000"; - - constant OpCode_Break : std_logic_vector(3 downto 0) := "0000"; - constant OpCode_Shiftleft: std_logic_vector(3 downto 0) := "0001"; - constant OpCode_PushSP : std_logic_vector(3 downto 0) := "0010"; - constant OpCode_PushInt : std_logic_vector(3 downto 0) := "0011"; - - constant OpCode_PopPC : std_logic_vector(3 downto 0) := "0100"; - constant OpCode_Add : std_logic_vector(3 downto 0) := "0101"; - constant OpCode_And : std_logic_vector(3 downto 0) := "0110"; - constant OpCode_Or : std_logic_vector(3 downto 0) := "0111"; - - constant OpCode_Load : std_logic_vector(3 downto 0) := "1000"; - constant OpCode_Not : std_logic_vector(3 downto 0) := "1001"; - constant OpCode_Flip : std_logic_vector(3 downto 0) := "1010"; - constant OpCode_Nop : std_logic_vector(3 downto 0) := "1011"; - - constant OpCode_Store : std_logic_vector(3 downto 0) := "1100"; - constant OpCode_PopSP : std_logic_vector(3 downto 0) := "1101"; - constant OpCode_Compare : std_logic_vector(3 downto 0) := "1110"; - constant OpCode_PopInt : std_logic_vector(3 downto 0) := "1111"; - - constant OpCode_Lessthan : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(36, 6)); - constant OpCode_Lessthanorequal : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(37, 6)); - constant OpCode_Ulessthan : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(38, 6)); - constant OpCode_Ulessthanorequal : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(39, 6)); - - constant OpCode_Swap : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(40, 6)); - constant OpCode_Mult : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(41, 6)); - - constant OpCode_Lshiftright : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(42, 6)); - constant OpCode_Ashiftleft : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(43, 6)); - constant OpCode_Ashiftright : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(44, 6)); - constant OpCode_Call : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(45, 6)); - - constant OpCode_Eq : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(46, 6)); - constant OpCode_Neq : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(47, 6)); - - constant OpCode_Sub : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(49, 6)); - constant OpCode_Loadb : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(51, 6)); - constant OpCode_Storeb : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(52, 6)); - - constant OpCode_Eqbranch : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(55, 6)); - constant OpCode_Neqbranch : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(56, 6)); - constant OpCode_Poppcrel : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(57, 6)); - - constant OpCode_Pushspadd : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(61, 6)); - constant OpCode_Mult16x16 : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(62, 6)); - constant OpCode_Callpcrel : std_logic_vector(5 downto 0) := std_logic_vector(to_unsigned(63, 6)); - - - - constant OpCode_Size : integer := 8; - - - -end zpupkg; -- cgit v1.1 From 6c7ee841131808466eb0c93e5c8f112771004fbf Mon Sep 17 00:00:00 2001 From: oharboe Date: Tue, 6 May 2008 06:39:21 +0000 Subject: * Small ZPU now supports interrupts * added simulation example demonstrating interrupts --- zpu/hdl/zpu4/src/bram.vhd | 3807 --------------------------------- zpu/hdl/zpu4/src/bram_dmips.vhd | 3717 -------------------------------- zpu/hdl/zpu4/src/dram_dmips.vhd | 3308 ---------------------------- zpu/hdl/zpu4/src/dram_hello.vhd | 3107 --------------------------- zpu/hdl/zpu4/src/zpu_config_trace.vhd | 17 - 5 files changed, 13956 deletions(-) delete mode 100644 zpu/hdl/zpu4/src/bram.vhd delete mode 100644 zpu/hdl/zpu4/src/bram_dmips.vhd delete mode 100644 zpu/hdl/zpu4/src/dram_dmips.vhd delete mode 100644 zpu/hdl/zpu4/src/dram_hello.vhd delete mode 100644 zpu/hdl/zpu4/src/zpu_config_trace.vhd (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/bram.vhd b/zpu/hdl/zpu4/src/bram.vhd deleted file mode 100644 index 435f3f4..0000000 --- a/zpu/hdl/zpu4/src/bram.vhd +++ /dev/null @@ -1,3807 +0,0 @@ -library ieee; -use ieee.std_logic_1164.all; -use ieee.std_logic_unsigned.all; - - -library zylin; -use zylin.zpu_config.all; -use zylin.zpupkg.all; - -entity dram is -port (clk : in std_logic; - areset : in std_logic; - mem_writeEnable : in std_logic; - mem_readEnable : in std_logic; - mem_addr : in std_logic_vector(maxAddrBit downto 0); - mem_write : in std_logic_vector(wordSize-1 downto 0); - mem_read : out std_logic_vector(wordSize-1 downto 0); - mem_busy : out std_logic; - mem_writeMask : in std_logic_vector(wordBytes-1 downto 0)); -end dram; - -architecture dram_arch of dram is - -type ram_type is array(0 to ((2**(maxAddrBit+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); - -shared variable ram : ram_type := -( -0 => x"800b0b0b", -1 => x"0b0b8070", -2 => x"0b0b80e5", -3 => x"d00c3a0b", -4 => x"0b0bbed7", -5 => x"04000000", -6 => x"00000000", -7 => x"00000000", -8 => x"80088408", -9 => x"88080b0b", -10 => x"0bbfa72d", -11 => x"880c840c", -12 => x"800c0400", -13 => x"00000000", -14 => x"00000000", -15 => x"00000000", -16 => x"71fd0608", -17 => x"72830609", -18 => x"81058205", -19 => x"832b2a83", -20 => x"ffff0652", -21 => x"0b0b0400", -22 => x"00000000", -23 => x"00000000", -24 => x"71fd0608", -25 => x"83ffff73", -26 => x"83060981", -27 => x"05820583", -28 => x"2b2b0906", -29 => x"7383ffff", -30 => x"0b0b0b0b", -31 => x"83a70400", -32 => x"72098105", -33 => x"72057373", -34 => x"09060906", -35 => x"73097306", -36 => x"070a8106", -37 => x"530b0b51", -38 => x"04000000", -39 => x"00000000", -40 => x"72722473", -41 => x"732e0753", -42 => x"0b0b5104", -43 => x"00000000", -44 => x"00000000", -45 => x"00000000", -46 => x"00000000", -47 => x"00000000", -48 => x"71737109", -49 => x"71068106", -50 => x"30720a10", -51 => x"0a720a10", -52 => x"0a31050a", -53 => x"81065151", -54 => x"530b0b51", -55 => x"04000000", -56 => x"72722673", -57 => x"732e0753", -58 => x"0b0b5104", -59 => x"00000000", -60 => x"00000000", -61 => x"00000000", -62 => x"00000000", -63 => x"00000000", -64 => x"00000000", -65 => x"00000000", -66 => x"00000000", -67 => x"00000000", -68 => x"00000000", -69 => x"00000000", -70 => x"00000000", -71 => x"00000000", -72 => x"0b0b0b88", -73 => x"c6040000", -74 => x"00000000", -75 => x"00000000", -76 => x"00000000", -77 => x"00000000", -78 => x"00000000", -79 => x"00000000", -80 => x"720a722b", -81 => x"0a530b0b", -82 => x"51040000", -83 => x"00000000", -84 => x"00000000", -85 => x"00000000", -86 => x"00000000", -87 => x"00000000", -88 => x"72729f06", -89 => x"0981050b", -90 => x"0b0b88a7", -91 => x"05040000", -92 => x"00000000", -93 => x"00000000", -94 => x"00000000", -95 => x"00000000", -96 => x"72722aff", -97 => x"739f062a", -98 => x"0974090a", -99 => x"8106ff05", -100 => x"0607530b", -101 => x"0b510400", -102 => x"00000000", -103 => x"00000000", -104 => x"7171530b", -105 => x"0b510406", -106 => x"73830609", -107 => x"81058205", -108 => x"832b0b2b", -109 => x"0772fc06", -110 => x"0c515104", -111 => x"00000000", -112 => x"72098105", -113 => x"72050970", -114 => x"81050906", -115 => x"0a810653", -116 => x"0b0b5104", -117 => x"00000000", -118 => x"00000000", -119 => x"00000000", -120 => x"72098105", -121 => x"72050970", -122 => x"81050906", -123 => x"0a098106", -124 => x"530b0b51", -125 => x"04000000", -126 => x"00000000", -127 => x"00000000", -128 => x"71098105", -129 => x"520b0b04", -130 => x"00000000", -131 => x"00000000", -132 => x"00000000", -133 => x"00000000", -134 => x"00000000", -135 => x"00000000", -136 => x"72720981", -137 => x"0505530b", -138 => x"0b510400", -139 => x"00000000", -140 => x"00000000", -141 => x"00000000", -142 => x"00000000", -143 => x"00000000", -144 => x"72097206", -145 => x"73730906", -146 => x"07530b0b", -147 => x"51040000", -148 => x"00000000", -149 => x"00000000", -150 => x"00000000", -151 => x"00000000", -152 => x"71fc0608", -153 => x"72830609", -154 => x"81058305", -155 => x"1010102a", -156 => x"81ff0652", -157 => x"0b0b0400", -158 => x"00000000", -159 => x"00000000", -160 => x"71fc0608", -161 => x"0b0b80e5", -162 => x"bc738306", -163 => x"10100508", -164 => x"060b0b0b", -165 => x"88ac0400", -166 => x"00000000", -167 => x"00000000", -168 => x"80088408", -169 => x"88087575", -170 => x"0b0b0ba3", -171 => x"fa2d5050", -172 => x"80085688", -173 => x"0c840c80", -174 => x"0c510400", -175 => x"00000000", -176 => x"80088408", -177 => x"88087575", -178 => x"0b0b0ba4", -179 => x"ca2d5050", -180 => x"80085688", -181 => x"0c840c80", -182 => x"0c510400", -183 => x"00000000", -184 => x"72097081", -185 => x"0509060a", -186 => x"8106ff05", -187 => x"70540b0b", -188 => x"71067309", -189 => x"727405ff", -190 => x"05060751", -191 => x"51510400", -192 => x"72097081", -193 => x"0509060a", -194 => x"098106ff", -195 => x"0570540b", -196 => x"0b710673", -197 => x"09727405", -198 => x"ff050607", -199 => x"51515104", -200 => x"05ff0504", -201 => x"00000000", -202 => x"00000000", -203 => x"00000000", -204 => x"00000000", -205 => x"00000000", -206 => x"00000000", -207 => x"00000000", -208 => x"810b0b0b", -209 => x"80e5cc0c", -210 => x"51040000", -211 => x"00000000", -212 => x"00000000", -213 => x"00000000", -214 => x"00000000", -215 => x"00000000", -216 => x"71810552", -217 => x"0b0b0400", -218 => x"00000000", -219 => x"00000000", -220 => x"00000000", -221 => x"00000000", -222 => x"00000000", -223 => x"00000000", -224 => x"00000000", -225 => x"00000000", -226 => x"00000000", -227 => x"00000000", -228 => x"00000000", -229 => x"00000000", -230 => x"00000000", -231 => x"00000000", -232 => x"02840572", -233 => x"10100552", -234 => x"0b0b0400", -235 => x"00000000", -236 => x"00000000", -237 => x"00000000", -238 => x"00000000", -239 => x"00000000", -240 => x"00000000", -241 => x"00000000", -242 => x"00000000", -243 => x"00000000", -244 => x"00000000", -245 => x"00000000", -246 => x"00000000", -247 => x"00000000", -248 => x"717105ff", -249 => x"0571530b", -250 => x"0b510400", -251 => x"00000000", -252 => x"00000000", -253 => x"00000000", -254 => x"00000000", -255 => x"00000000", -256 => x"84803f80", -257 => x"cef23f04", -258 => x"10101010", -259 => x"10101010", -260 => x"10101010", -261 => x"10101010", -262 => x"10101010", -263 => x"10101010", -264 => x"10101010", -265 => x"10101053", -266 => x"0b0b5104", -267 => x"7381ff06", -268 => x"73830609", -269 => x"81058305", -270 => x"1010102b", -271 => x"0772fc06", -272 => x"0c515104", -273 => x"3c047272", -274 => x"80728106", -275 => x"ff050972", -276 => x"06057110", -277 => x"520b0b72", -278 => x"0a100a53", -279 => x"0b0b72e9", -280 => x"38515153", -281 => x"0b0b5104", -282 => x"70700b0b", -283 => x"80f5c008", -284 => x"520b0b84", -285 => x"0b720508", -286 => x"70810651", -287 => x"510b0b70", -288 => x"f2387108", -289 => x"81ff0680", -290 => x"0c505004", -291 => x"70700b0b", -292 => x"80f5c008", -293 => x"520b0b84", -294 => x"0b720508", -295 => x"700a100a", -296 => x"70810651", -297 => x"51510b0b", -298 => x"70ed3873", -299 => x"720c5050", -300 => x"0480e5cc", -301 => x"08802ea8", -302 => x"38838080", -303 => x"0b0b0b80", -304 => x"f5c00c82", -305 => x"a0800b0b", -306 => x"0b80f5c4", -307 => x"0c829080", -308 => x"0b80f5d4", -309 => x"0c0b0b80", -310 => x"f5c80b80", -311 => x"f5d80c04", -312 => x"f8808080", -313 => x"a40b0b0b", -314 => x"80f5c00c", -315 => x"f8808082", -316 => x"800b0b0b", -317 => x"80f5c40c", -318 => x"f8808084", -319 => x"800b80f5", -320 => x"d40cf880", -321 => x"8080940b", -322 => x"80f5d80c", -323 => x"f8808080", -324 => x"9c0b80f5", -325 => x"d00cf880", -326 => x"8080a00b", -327 => x"80f5dc0c", -328 => x"04f23d0d", -329 => x"600b0b80", -330 => x"f5c40856", -331 => x"5d82750c", -332 => x"8059805a", -333 => x"800b8f3d", -334 => x"71101017", -335 => x"70085957", -336 => x"5d5b8076", -337 => x"81ff067c", -338 => x"832b5658", -339 => x"520b0b0b", -340 => x"76530b0b", -341 => x"7b5198c6", -342 => x"3f7d7f7a", -343 => x"72077c72", -344 => x"07717160", -345 => x"8105415f", -346 => x"5d5b5957", -347 => x"557a8724", -348 => x"80c1380b", -349 => x"0b80f5c4", -350 => x"087b1010", -351 => x"71057008", -352 => x"58515580", -353 => x"7681ff06", -354 => x"7c832b56", -355 => x"58520b0b", -356 => x"0b76530b", -357 => x"0b7b5198", -358 => x"853f7d7f", -359 => x"7a72077c", -360 => x"72077171", -361 => x"60810541", -362 => x"5f5d5b59", -363 => x"5755877b", -364 => x"25c13876", -365 => x"7d0c7784", -366 => x"1e0c7c80", -367 => x"0c903d0d", -368 => x"04707080", -369 => x"f5cc3351", -370 => x"0b0b70b2", -371 => x"3880e5d8", -372 => x"08700852", -373 => x"0b0b520b", -374 => x"0b0b7080", -375 => x"2e9a3884", -376 => x"720580e5", -377 => x"d80c702d", -378 => x"80e5d808", -379 => x"7008520b", -380 => x"0b520b0b", -381 => x"0b70e838", -382 => x"810b80f5", -383 => x"cc345050", -384 => x"0404700b", -385 => x"0b80f5bc", -386 => x"08802e8e", -387 => x"380b0b0b", -388 => x"0b800b80", -389 => x"2e098106", -390 => x"83385004", -391 => x"0b0b80f5", -392 => x"bc510b0b", -393 => x"0bf3d93f", -394 => x"50040470", -395 => x"70028f05", -396 => x"33520b0b", -397 => x"0b0b718a", -398 => x"2e893871", -399 => x"51fccd3f", -400 => x"5050048d", -401 => x"51fcc53f", -402 => x"7151fcc0", -403 => x"3f505004", -404 => x"cd3d0db6", -405 => x"3d707084", -406 => x"05520b0b", -407 => x"088cab5d", -408 => x"56a63d5f", -409 => x"5d807570", -410 => x"81055733", -411 => x"765c5559", -412 => x"0b730b79", -413 => x"2e80ca38", -414 => x"8f3d5c73", -415 => x"a52e0981", -416 => x"0680cf38", -417 => x"79708105", -418 => x"5b33540b", -419 => x"0b7380e4", -420 => x"2e81c838", -421 => x"7380e424", -422 => x"80d13873", -423 => x"80e32ea8", -424 => x"3880520b", -425 => x"0ba5517a", -426 => x"2d80520b", -427 => x"0b73517a", -428 => x"2d821959", -429 => x"79708105", -430 => x"5b33540b", -431 => x"0b73ffbb", -432 => x"3878800c", -433 => x"b53d0d04", -434 => x"7c841e83", -435 => x"72053356", -436 => x"5e578052", -437 => x"0b0b7351", -438 => x"7a2d8119", -439 => x"7a708105", -440 => x"5c335559", -441 => x"0b73ff93", -442 => x"38d73973", -443 => x"80f32e09", -444 => x"8106ffad", -445 => x"387c841e", -446 => x"7108595e", -447 => x"56807733", -448 => x"56560b74", -449 => x"0b762e8d", -450 => x"38811670", -451 => x"1870335a", -452 => x"555677f5", -453 => x"38ff1655", -454 => x"807625ff", -455 => x"97387670", -456 => x"81055833", -457 => x"5880520b", -458 => x"0b77517a", -459 => x"2d811975", -460 => x"ff175757", -461 => x"59807625", -462 => x"fefa3876", -463 => x"70810558", -464 => x"33588052", -465 => x"0b0b7751", -466 => x"7a2d8119", -467 => x"75ff1757", -468 => x"57590b75", -469 => x"8024c738", -470 => x"feda397c", -471 => x"841e7108", -472 => x"70719f2c", -473 => x"59530b0b", -474 => x"595e5680", -475 => x"7524818d", -476 => x"38757e7d", -477 => x"58595580", -478 => x"57740b77", -479 => x"2e098106", -480 => x"bc38b07c", -481 => x"3402b905", -482 => x"567b0b76", -483 => x"2e9938ff", -484 => x"16560b0b", -485 => x"75337870", -486 => x"81055a34", -487 => x"8117577b", -488 => x"762e0981", -489 => x"06e93880", -490 => x"7834767e", -491 => x"ff720557", -492 => x"58560b0b", -493 => x"758024fe", -494 => x"e538fdf8", -495 => x"398a7536", -496 => x"0b0b80d7", -497 => x"b005540b", -498 => x"0b733376", -499 => x"70810558", -500 => x"348a7535", -501 => x"550b0b74", -502 => x"802effad", -503 => x"388a7536", -504 => x"0b0b80d7", -505 => x"b005540b", -506 => x"0b733376", -507 => x"70810558", -508 => x"348a7535", -509 => x"550b0b74", -510 => x"c438ff8d", -511 => x"3974520b", -512 => x"0b76530b", -513 => x"0bb53dff", -514 => x"b8055192", -515 => x"dc3fa43d", -516 => x"0856fedd", -517 => x"397080c1", -518 => x"0b81c48c", -519 => x"34800b81", -520 => x"c5e40c70", -521 => x"800c5004", -522 => x"7070800b", -523 => x"81c48c33", -524 => x"520b0b52", -525 => x"0b0b0b70", -526 => x"80c12e98", -527 => x"387181c5", -528 => x"e4080781", -529 => x"c5e40c80", -530 => x"c20b81c4", -531 => x"90347080", -532 => x"0c505004", -533 => x"810b81c5", -534 => x"e4080781", -535 => x"c5e40c80", -536 => x"c20b81c4", -537 => x"90347080", -538 => x"0c505004", -539 => x"70707070", -540 => x"7570088a", -541 => x"05530b0b", -542 => x"530b0b81", -543 => x"c48c3351", -544 => x"0b0b7080", -545 => x"c12e8c38", -546 => x"73f13870", -547 => x"800c5050", -548 => x"505004ff", -549 => x"72057081", -550 => x"c4880831", -551 => x"740c800c", -552 => x"50505050", -553 => x"04fc3d0d", -554 => x"81c49408", -555 => x"550b0b74", -556 => x"802e8e38", -557 => x"76750871", -558 => x"0c81c494", -559 => x"0856540b", -560 => x"0b8c1553", -561 => x"0b0b81c4", -562 => x"8808520b", -563 => x"0b8a518e", -564 => x"e93f7380", -565 => x"0c863d0d", -566 => x"04fb3d0d", -567 => x"77700856", -568 => x"56b0530b", -569 => x"0b81c494", -570 => x"08520b0b", -571 => x"7451a1ff", -572 => x"3f850b8c", -573 => x"170c850b", -574 => x"8c160c75", -575 => x"08750c81", -576 => x"c4940854", -577 => x"0b0b7380", -578 => x"2e8c3873", -579 => x"08750c81", -580 => x"c4940854", -581 => x"0b0b8c14", -582 => x"530b0b81", -583 => x"c4880852", -584 => x"0b0b8a51", -585 => x"8e943f84", -586 => x"1508b738", -587 => x"860b8c16", -588 => x"0c881552", -589 => x"0b0b8816", -590 => x"08518d96", -591 => x"3f81c494", -592 => x"08700876", -593 => x"0c540b0b", -594 => x"8c157054", -595 => x"0b0b540b", -596 => x"0b8a520b", -597 => x"0b730851", -598 => x"8de03f73", -599 => x"800c873d", -600 => x"0d047508", -601 => x"540b0bb0", -602 => x"530b0b73", -603 => x"520b0b75", -604 => x"51a0fc3f", -605 => x"73800c87", -606 => x"3d0d04e1", -607 => x"3d0db051", -608 => x"93833f80", -609 => x"0881c484", -610 => x"0cb05192", -611 => x"f83f8008", -612 => x"81c4940c", -613 => x"81c48408", -614 => x"80080c80", -615 => x"0b800884", -616 => x"050c820b", -617 => x"80088805", -618 => x"0ca80b80", -619 => x"088c050c", -620 => x"9f530b0b", -621 => x"0b0b80d7", -622 => x"bc520b0b", -623 => x"80089005", -624 => x"51a0ac3f", -625 => x"993d5c9f", -626 => x"530b0b0b", -627 => x"0b80d7dc", -628 => x"520b0b7b", -629 => x"51a0983f", -630 => x"8a0b8182", -631 => x"cc0c0b0b", -632 => x"80e28051", -633 => x"f8ea3f0b", -634 => x"0b80d7fc", -635 => x"51f8e13f", -636 => x"0b0b80e2", -637 => x"8051f8d8", -638 => x"3f80e5e0", -639 => x"08802e8a", -640 => x"a1380b0b", -641 => x"80d8ac51", -642 => x"f8c63f0b", -643 => x"0b80e280", -644 => x"51f8bd3f", -645 => x"80e5dc08", -646 => x"520b0b0b", -647 => x"0b80d8d8", -648 => x"51f8ad3f", -649 => x"8051b488", -650 => x"3f800880", -651 => x"f5ec0c81", -652 => x"0b923d5c", -653 => x"58800b80", -654 => x"e5dc0825", -655 => x"8383388e", -656 => x"3d5d80c1", -657 => x"0b81c48c", -658 => x"34810b81", -659 => x"c5e40c80", -660 => x"c20b81c4", -661 => x"9034825e", -662 => x"835a9f53", -663 => x"0b0b0b0b", -664 => x"80d98852", -665 => x"0b0b7a51", -666 => x"9f853f81", -667 => x"5f807b53", -668 => x"0b0b7c52", -669 => x"0b0b558c", -670 => x"f43f8008", -671 => x"752e0981", -672 => x"06833881", -673 => x"550b0b74", -674 => x"81c5e40c", -675 => x"7d705755", -676 => x"0b0b7483", -677 => x"25a63874", -678 => x"101015fd", -679 => x"0540a13d", -680 => x"ffbc0553", -681 => x"0b0b8352", -682 => x"0b0b7551", -683 => x"8b8c3f81", -684 => x"1e705f70", -685 => x"5755830b", -686 => x"7524dc38", -687 => x"7f540b0b", -688 => x"74530b0b", -689 => x"80f5f052", -690 => x"0b0b81c4", -691 => x"9c518af6", -692 => x"3f81c494", -693 => x"08700857", -694 => x"57b0530b", -695 => x"0b76520b", -696 => x"0b75519e", -697 => x"8a3f850b", -698 => x"8c180c85", -699 => x"0b8c170c", -700 => x"7608760c", -701 => x"81c49408", -702 => x"550b0b74", -703 => x"802e8a38", -704 => x"7408760c", -705 => x"81c49408", -706 => x"558c1553", -707 => x"0b0b81c4", -708 => x"8808520b", -709 => x"0b8a518a", -710 => x"a13f8416", -711 => x"08888c38", -712 => x"860b8c17", -713 => x"0c881652", -714 => x"0b0b8817", -715 => x"085189a2", -716 => x"3f81c494", -717 => x"08700877", -718 => x"0c578c16", -719 => x"70540b0b", -720 => x"558a520b", -721 => x"0b740851", -722 => x"89f03f80", -723 => x"c10b81c4", -724 => x"90335656", -725 => x"0b0b7575", -726 => x"26a83880", -727 => x"c3520b0b", -728 => x"75518adb", -729 => x"3f80087f", -730 => x"2e87ff38", -731 => x"81167081", -732 => x"ff0681c4", -733 => x"9033520b", -734 => x"0b57550b", -735 => x"0b747627", -736 => x"da38797e", -737 => x"29607072", -738 => x"35704172", -739 => x"72317087", -740 => x"2972315e", -741 => x"530b0b8a", -742 => x"0581c48c", -743 => x"3381c488", -744 => x"085a520b", -745 => x"0b520b0b", -746 => x"58550b76", -747 => x"80c12e87", -748 => x"f03878f6", -749 => x"38811858", -750 => x"80e5dc08", -751 => x"7825fd82", -752 => x"388051b0", -753 => x"eb3f8008", -754 => x"81c4800c", -755 => x"0b0b80d9", -756 => x"a851f4fc", -757 => x"3f0b0b80", -758 => x"e28051f4", -759 => x"f33f0b0b", -760 => x"80d9b851", -761 => x"f4ea3f0b", -762 => x"0b80e280", -763 => x"51f4e13f", -764 => x"81c48808", -765 => x"520b0b0b", -766 => x"0b80d9f0", -767 => x"51f4d13f", -768 => x"85520b0b", -769 => x"0b0b80da", -770 => x"8c51f4c4", -771 => x"3f81c5e4", -772 => x"08520b0b", -773 => x"0b0b80da", -774 => x"a851f4b4", -775 => x"3f81520b", -776 => x"0b0b0b80", -777 => x"da8c51f4", -778 => x"a73f81c4", -779 => x"8c33520b", -780 => x"0b0b0b80", -781 => x"dac451f4", -782 => x"973f80c1", -783 => x"520b0b0b", -784 => x"0b80dae0", -785 => x"51f4893f", -786 => x"81c49033", -787 => x"520b0b0b", -788 => x"0b80dafc", -789 => x"51f3f93f", -790 => x"80c2520b", -791 => x"0b0b0b80", -792 => x"dae051f3", -793 => x"eb3f81c4", -794 => x"bc08520b", -795 => x"0b0b0b80", -796 => x"db9851f3", -797 => x"db3f8752", -798 => x"0b0b0b0b", -799 => x"80da8c51", -800 => x"f3ce3f81", -801 => x"82cc0852", -802 => x"0b0b0b0b", -803 => x"80dbb451", -804 => x"f3be3f0b", -805 => x"0b80dbd0", -806 => x"51f3b53f", -807 => x"0b0b80db", -808 => x"fc51f3ac", -809 => x"3f81c494", -810 => x"08700853", -811 => x"0b0b560b", -812 => x"0b80dc88", -813 => x"51f3993f", -814 => x"0b0b80dc", -815 => x"a451f390", -816 => x"3f81c494", -817 => x"08847105", -818 => x"08530b0b", -819 => x"5d0b0b80", -820 => x"dcd851f2", -821 => x"fb3f8052", -822 => x"0b0b0b0b", -823 => x"80da8c51", -824 => x"f2ee3f81", -825 => x"c4940888", -826 => x"71050853", -827 => x"0b0b580b", -828 => x"0b80dcf4", -829 => x"51f2d93f", -830 => x"82520b0b", -831 => x"0b0b80da", -832 => x"8c51f2cc", -833 => x"3f81c494", -834 => x"088c7105", -835 => x"08530b0b", -836 => x"590b0b80", -837 => x"dd9051f2", -838 => x"b73f9152", -839 => x"0b0b0b0b", -840 => x"80da8c51", -841 => x"f2aa3f81", -842 => x"c4940890", -843 => x"05520b0b", -844 => x"0b0b80dd", -845 => x"ac51f298", -846 => x"3f0b0b80", -847 => x"ddc851f2", -848 => x"8f3f0b0b", -849 => x"80de8051", -850 => x"f2863f81", -851 => x"c4840870", -852 => x"08530b0b", -853 => x"570b0b80", -854 => x"dc8851f1", -855 => x"f33f0b0b", -856 => x"80de9451", -857 => x"f1ea3f81", -858 => x"c4840884", -859 => x"71050853", -860 => x"0b0b550b", -861 => x"0b80dcd8", -862 => x"51f1d53f", -863 => x"80520b0b", -864 => x"0b0b80da", -865 => x"8c51f1c8", -866 => x"3f81c484", -867 => x"08887105", -868 => x"08530b0b", -869 => x"560b0b80", -870 => x"dcf451f1", -871 => x"b33f8152", -872 => x"0b0b0b0b", -873 => x"80da8c51", -874 => x"f1a63f81", -875 => x"c484088c", -876 => x"71050853", -877 => x"0b0b5d0b", -878 => x"0b80dd90", -879 => x"51f1913f", -880 => x"92520b0b", -881 => x"0b0b80da", -882 => x"8c51f184", -883 => x"3f81c484", -884 => x"08900552", -885 => x"0b0b0b0b", -886 => x"80ddac51", -887 => x"f0f23f0b", -888 => x"0b80ddc8", -889 => x"51f0e93f", -890 => x"7d520b0b", -891 => x"0b0b80de", -892 => x"d451f0dc", -893 => x"3f85520b", -894 => x"0b0b0b80", -895 => x"da8c51f0", -896 => x"cf3f7952", -897 => x"0b0b0b0b", -898 => x"80def051", -899 => x"f0c23f8d", -900 => x"520b0b0b", -901 => x"0b80da8c", -902 => x"51f0b53f", -903 => x"7f520b0b", -904 => x"0b0b80df", -905 => x"8c51f0a8", -906 => x"3f87520b", -907 => x"0b0b0b80", -908 => x"da8c51f0", -909 => x"9b3f7e52", -910 => x"0b0b0b0b", -911 => x"80dfa851", -912 => x"f08e3f81", -913 => x"520b0b0b", -914 => x"0b80da8c", -915 => x"51f0813f", -916 => x"7b520b0b", -917 => x"0b0b80df", -918 => x"c451eff4", -919 => x"3f0b0b80", -920 => x"dfe051ef", -921 => x"eb3f7a52", -922 => x"0b0b0b0b", -923 => x"80e09851", -924 => x"efde3f0b", -925 => x"0b80e0b4", -926 => x"51efd53f", -927 => x"0b0b80e2", -928 => x"8051efcc", -929 => x"3f81c480", -930 => x"0880f5ec", -931 => x"08317080", -932 => x"f5e80c52", -933 => x"0b0b0b0b", -934 => x"80e0ec51", -935 => x"efb23f80", -936 => x"f5e80856", -937 => x"810b7625", -938 => x"819d3880", -939 => x"e5dc0870", -940 => x"77bd84c0", -941 => x"293580f5", -942 => x"e00c7671", -943 => x"3580f5e4", -944 => x"0c768ddd", -945 => x"297187e8", -946 => x"293581c4", -947 => x"980c5b0b", -948 => x"0b80e0fc", -949 => x"51eef93f", -950 => x"80f5e008", -951 => x"520b0b0b", -952 => x"0b80e1ac", -953 => x"51eee93f", -954 => x"0b0b80e1", -955 => x"b451eee0", -956 => x"3f80f5e4", -957 => x"08520b0b", -958 => x"0b0b80e1", -959 => x"ac51eed0", -960 => x"3f81c498", -961 => x"08520b0b", -962 => x"0b0b80e1", -963 => x"e451eec0", -964 => x"3f0b0b80", -965 => x"e28051ee", -966 => x"b73f800b", -967 => x"800ca13d", -968 => x"0d040b0b", -969 => x"80e28451", -970 => x"f5de3976", -971 => x"0856b053", -972 => x"0b0b7552", -973 => x"0b0b7651", -974 => x"95b53f80", -975 => x"c10b81c4", -976 => x"90335656", -977 => x"f88e390b", -978 => x"0b80e2b4", -979 => x"51ee813f", -980 => x"0b0b80e2", -981 => x"ec51edf8", -982 => x"3f0b0b80", -983 => x"e28051ed", -984 => x"ef3f800b", -985 => x"800ca13d", -986 => x"0d04a13d", -987 => x"ffb80552", -988 => x"0b0b8051", -989 => x"80dc3f9f", -990 => x"530b0b0b", -991 => x"0b80e38c", -992 => x"520b0b7a", -993 => x"5194e83f", -994 => x"777881c4", -995 => x"880c8117", -996 => x"7081ff06", -997 => x"81c49033", -998 => x"520b0b58", -999 => x"565af7db", -1000 => x"39ff1570", -1001 => x"77317e0c", -1002 => x"59800b81", -1003 => x"19595980", -1004 => x"e5dc0878", -1005 => x"25f58b38", -1006 => x"f8873970", -1007 => x"70738232", -1008 => x"70307072", -1009 => x"07802580", -1010 => x"0c520b0b", -1011 => x"520b0b50", -1012 => x"50047070", -1013 => x"70747671", -1014 => x"530b0b54", -1015 => x"0b0b520b", -1016 => x"0b0b0b71", -1017 => x"822e8338", -1018 => x"83517181", -1019 => x"2e9a3881", -1020 => x"72269f38", -1021 => x"71822eb8", -1022 => x"3871842e", -1023 => x"a9387073", -1024 => x"0c70800c", -1025 => x"50505004", -1026 => x"80e40b81", -1027 => x"c4880825", -1028 => x"8b388073", -1029 => x"0c70800c", -1030 => x"50505004", -1031 => x"83730c70", -1032 => x"800c5050", -1033 => x"50048273", -1034 => x"0c70800c", -1035 => x"50505004", -1036 => x"81730c70", -1037 => x"800c5050", -1038 => x"50047074", -1039 => x"74148205", -1040 => x"710c800c", -1041 => x"5004f73d", -1042 => x"0d7b7d7f", -1043 => x"61857205", -1044 => x"70822b75", -1045 => x"71057074", -1046 => x"71708405", -1047 => x"530b0b0c", -1048 => x"5a5a5d5b", -1049 => x"760c7980", -1050 => x"f8180c79", -1051 => x"86720552", -1052 => x"0b0b5758", -1053 => x"5a5a7676", -1054 => x"249e3876", -1055 => x"b329822b", -1056 => x"79710551", -1057 => x"530b0b76", -1058 => x"73708405", -1059 => x"550c8114", -1060 => x"540b0b75", -1061 => x"7425f038", -1062 => x"7681cc29", -1063 => x"19fc7105", -1064 => x"088105fc", -1065 => x"72050c7a", -1066 => x"1970089f", -1067 => x"a073050c", -1068 => x"5856850b", -1069 => x"81c4880c", -1070 => x"75800c8b", -1071 => x"3d0d0470", -1072 => x"70700293", -1073 => x"05335180", -1074 => x"02840597", -1075 => x"0533540b", -1076 => x"0b520b0b", -1077 => x"70732e88", -1078 => x"3871800c", -1079 => x"50505004", -1080 => x"7081c48c", -1081 => x"34810b80", -1082 => x"0c505050", -1083 => x"04f83d0d", -1084 => x"7a7c5956", -1085 => x"820b8319", -1086 => x"55550b0b", -1087 => x"74167033", -1088 => x"75335b51", -1089 => x"530b0b72", -1090 => x"792e80cf", -1091 => x"3880c10b", -1092 => x"81168116", -1093 => x"56565782", -1094 => x"7525df38", -1095 => x"ffa91770", -1096 => x"81ff0655", -1097 => x"590b7382", -1098 => x"26833887", -1099 => x"5581530b", -1100 => x"0b7680d2", -1101 => x"2e9e3877", -1102 => x"520b0b75", -1103 => x"5193b53f", -1104 => x"80530b0b", -1105 => x"72800825", -1106 => x"8b388715", -1107 => x"81c4880c", -1108 => x"81530b0b", -1109 => x"72800c8a", -1110 => x"3d0d0472", -1111 => x"81c48c34", -1112 => x"827525ff", -1113 => x"9538ffb4", -1114 => x"39f93d0d", -1115 => x"797b7d54", -1116 => x"0b0b5872", -1117 => x"59773079", -1118 => x"70307072", -1119 => x"079f2a73", -1120 => x"71315a52", -1121 => x"0b0b5977", -1122 => x"0b795673", -1123 => x"0c530b0b", -1124 => x"73847305", -1125 => x"0c540b0b", -1126 => x"800c893d", -1127 => x"0d04f93d", -1128 => x"0d797b7d", -1129 => x"7f56540b", -1130 => x"0b520b0b", -1131 => x"540b0b72", -1132 => x"802ea638", -1133 => x"70577158", -1134 => x"a0733152", -1135 => x"0b0b800b", -1136 => x"7225a638", -1137 => x"7770742b", -1138 => x"5770732a", -1139 => x"78752b07", -1140 => x"56510b74", -1141 => x"76530b0b", -1142 => x"510b0b70", -1143 => x"740c7184", -1144 => x"150c7380", -1145 => x"0c893d0d", -1146 => x"04805677", -1147 => x"72302b55", -1148 => x"0b0b7476", -1149 => x"530b0b51", -1150 => x"e039fb3d", -1151 => x"0d777955", -1152 => x"5580560b", -1153 => x"0b757524", -1154 => x"b5388074", -1155 => x"24a53880", -1156 => x"530b0b73", -1157 => x"520b0b74", -1158 => x"5180f33f", -1159 => x"8008540b", -1160 => x"0b75802e", -1161 => x"87388008", -1162 => x"30540b0b", -1163 => x"73800c87", -1164 => x"3d0d0473", -1165 => x"30768132", -1166 => x"57540b0b", -1167 => x"d2397430", -1168 => x"55815673", -1169 => x"8025c838", -1170 => x"ea39fa3d", -1171 => x"0d787a57", -1172 => x"5580570b", -1173 => x"0b767524", -1174 => x"ae38759f", -1175 => x"2c540b0b", -1176 => x"81530b0b", -1177 => x"75743274", -1178 => x"31520b0b", -1179 => x"74519f3f", -1180 => x"8008540b", -1181 => x"0b76802e", -1182 => x"87388008", -1183 => x"30540b0b", -1184 => x"73800c88", -1185 => x"3d0d0474", -1186 => x"30558157", -1187 => x"cd39fc3d", -1188 => x"0d767853", -1189 => x"0b0b540b", -1190 => x"0b81530b", -1191 => x"0b807473", -1192 => x"26520b0b", -1193 => x"5572802e", -1194 => x"9e387080", -1195 => x"2eb73880", -1196 => x"7224b238", -1197 => x"71107310", -1198 => x"75722653", -1199 => x"0b0b540b", -1200 => x"0b520b0b", -1201 => x"72e43873", -1202 => x"51788338", -1203 => x"74510b0b", -1204 => x"70800c86", -1205 => x"3d0d0472", -1206 => x"0a100a72", -1207 => x"0a100a53", -1208 => x"0b0b530b", -1209 => x"0b72802e", -1210 => x"de387174", -1211 => x"26e93873", -1212 => x"72317574", -1213 => x"07740a10", -1214 => x"0a740a10", -1215 => x"0a555556", -1216 => x"540b0be1", -1217 => x"39707073", -1218 => x"520b0b80", -1219 => x"eea80851", -1220 => x"953f5050", -1221 => x"04707073", -1222 => x"520b0b80", -1223 => x"eea80851", -1224 => x"92dc3f50", -1225 => x"5004f43d", -1226 => x"0d7e608b", -1227 => x"710570f8", -1228 => x"065b5555", -1229 => x"5d729626", -1230 => x"83389058", -1231 => x"800b7824", -1232 => x"74792607", -1233 => x"5580540b", -1234 => x"0b74742e", -1235 => x"09810680", -1236 => x"d5387c51", -1237 => x"8edf3f77", -1238 => x"83f72680", -1239 => x"d0387783", -1240 => x"2a701010", -1241 => x"1080e6a0", -1242 => x"058c7105", -1243 => x"08585854", -1244 => x"0b0b7577", -1245 => x"2e828a38", -1246 => x"841608fc", -1247 => x"068c1708", -1248 => x"88180871", -1249 => x"8c72050c", -1250 => x"8872050c", -1251 => x"5b760584", -1252 => x"71050881", -1253 => x"07847205", -1254 => x"0c530b0b", -1255 => x"7c518e96", -1256 => x"3f881654", -1257 => x"0b0b7380", -1258 => x"0c8e3d0d", -1259 => x"0477892a", -1260 => x"78832a58", -1261 => x"540b0b73", -1262 => x"802ebf38", -1263 => x"77862ab8", -1264 => x"05578474", -1265 => x"27b43880", -1266 => x"db145794", -1267 => x"7427ab38", -1268 => x"778c2a80", -1269 => x"ee055780", -1270 => x"d474279e", -1271 => x"38778f2a", -1272 => x"80f70557", -1273 => x"82d47427", -1274 => x"91387792", -1275 => x"2a80fc05", -1276 => x"578ad474", -1277 => x"27843880", -1278 => x"fe570b0b", -1279 => x"76101010", -1280 => x"80e6a005", -1281 => x"8c710508", -1282 => x"56530b0b", -1283 => x"74732ea6", -1284 => x"38841508", -1285 => x"fc067079", -1286 => x"3155560b", -1287 => x"738f2489", -1288 => x"d2387380", -1289 => x"2589d438", -1290 => x"8c150855", -1291 => x"0b0b7473", -1292 => x"2e098106", -1293 => x"dc388117", -1294 => x"5980e6b0", -1295 => x"08560b0b", -1296 => x"7580e6a8", -1297 => x"2e82f938", -1298 => x"841608fc", -1299 => x"06707931", -1300 => x"55550b73", -1301 => x"8f2480c2", -1302 => x"3880e6a8", -1303 => x"0b80e6b4", -1304 => x"0c80e6a8", -1305 => x"0b80e6b0", -1306 => x"0c807424", -1307 => x"80e83874", -1308 => x"16847105", -1309 => x"08810784", -1310 => x"72050c53", -1311 => x"0b0bfe9c", -1312 => x"3988168c", -1313 => x"71050857", -1314 => x"590b750b", -1315 => x"792e0981", -1316 => x"06fde538", -1317 => x"821459ff", -1318 => x"a0397716", -1319 => x"78810784", -1320 => x"180c7080", -1321 => x"e6b40c70", -1322 => x"80e6b00c", -1323 => x"80e6a80b", -1324 => x"8c72050c", -1325 => x"8c710508", -1326 => x"8872050c", -1327 => x"74810784", -1328 => x"72050c74", -1329 => x"0574710c", -1330 => x"5b7c518b", -1331 => x"e93f8816", -1332 => x"540b0bfd", -1333 => x"d13983ff", -1334 => x"752783c1", -1335 => x"3874892a", -1336 => x"75832a54", -1337 => x"0b0b540b", -1338 => x"0b73802e", -1339 => x"80cb3874", -1340 => x"862ab805", -1341 => x"530b0b84", -1342 => x"7427be38", -1343 => x"80db1453", -1344 => x"0b0b9474", -1345 => x"27b33874", -1346 => x"8c2a80ee", -1347 => x"05530b0b", -1348 => x"80d47427", -1349 => x"a438748f", -1350 => x"2a80f705", -1351 => x"530b0b82", -1352 => x"d4742795", -1353 => x"3874922a", -1354 => x"80fc0553", -1355 => x"0b0b8ad4", -1356 => x"74278638", -1357 => x"80fe530b", -1358 => x"0b721010", -1359 => x"1080e6a0", -1360 => x"05887105", -1361 => x"0855570b", -1362 => x"730b772e", -1363 => x"86cd3884", -1364 => x"1408fc06", -1365 => x"5b740b7b", -1366 => x"278f3888", -1367 => x"1408540b", -1368 => x"0b73772e", -1369 => x"098106e7", -1370 => x"388c1408", -1371 => x"80e6a00b", -1372 => x"84050871", -1373 => x"8c190c75", -1374 => x"88190c77", -1375 => x"8873050c", -1376 => x"5c57758c", -1377 => x"150c7853", -1378 => x"0b0b8079", -1379 => x"2483be38", -1380 => x"72822c81", -1381 => x"712b5656", -1382 => x"0b747b26", -1383 => x"80d1387a", -1384 => x"7506570b", -1385 => x"0b7682bc", -1386 => x"3878fc06", -1387 => x"84055974", -1388 => x"10707c06", -1389 => x"55550b73", -1390 => x"82aa3884", -1391 => x"1959f039", -1392 => x"80e6a00b", -1393 => x"84050879", -1394 => x"540b0b5b", -1395 => x"788025c0", -1396 => x"3882fa39", -1397 => x"74097b06", -1398 => x"7080e6a0", -1399 => x"0b84050c", -1400 => x"5b741055", -1401 => x"0b0b747b", -1402 => x"26853874", -1403 => x"85f33880", -1404 => x"e6a00b88", -1405 => x"05087084", -1406 => x"720508fc", -1407 => x"06707b31", -1408 => x"7b72268f", -1409 => x"7225075d", -1410 => x"575c5c55", -1411 => x"78802e80", -1412 => x"e3387915", -1413 => x"80e69808", -1414 => x"19907105", -1415 => x"59540b0b", -1416 => x"5680e694", -1417 => x"08ff2e89", -1418 => x"38a08f73", -1419 => x"05e08006", -1420 => x"570b0b76", -1421 => x"520b0b7c", -1422 => x"5188fc3f", -1423 => x"8008540b", -1424 => x"0b8008ff", -1425 => x"2e903880", -1426 => x"08762782", -1427 => x"c2387480", -1428 => x"e6a02e82", -1429 => x"ba3880e6", -1430 => x"a00b8805", -1431 => x"08558415", -1432 => x"08fc0670", -1433 => x"79317972", -1434 => x"268f7225", -1435 => x"075d555a", -1436 => x"7a849b38", -1437 => x"77810784", -1438 => x"160c7715", -1439 => x"7080e6a0", -1440 => x"0b88050c", -1441 => x"74810784", -1442 => x"72050c56", -1443 => x"7c5188a6", -1444 => x"3f881554", -1445 => x"0b0b7380", -1446 => x"0c8e3d0d", -1447 => x"0474832a", -1448 => x"70540b0b", -1449 => x"540b0b80", -1450 => x"742481a9", -1451 => x"3872822c", -1452 => x"81712b80", -1453 => x"e6a40807", -1454 => x"7080e6a0", -1455 => x"0b84050c", -1456 => x"75101010", -1457 => x"80e6a005", -1458 => x"88710508", -1459 => x"718c1b0c", -1460 => x"70881b0c", -1461 => x"79887305", -1462 => x"0c57555c", -1463 => x"55758c15", -1464 => x"0cfda339", -1465 => x"78791010", -1466 => x"1080e6a0", -1467 => x"0570565b", -1468 => x"5c8c1408", -1469 => x"560b0b75", -1470 => x"742ea738", -1471 => x"841608fc", -1472 => x"06707931", -1473 => x"58530b0b", -1474 => x"768f2484", -1475 => x"98387680", -1476 => x"2584de38", -1477 => x"8c160856", -1478 => x"0b0b7574", -1479 => x"2e098106", -1480 => x"db388814", -1481 => x"811a7083", -1482 => x"06555a54", -1483 => x"0b0b72c1", -1484 => x"387b8306", -1485 => x"560b0b75", -1486 => x"802efd98", -1487 => x"38ff1cf8", -1488 => x"1b5b5c88", -1489 => x"1a087a2e", -1490 => x"e838fd95", -1491 => x"39831953", -1492 => x"0b0bfcbc", -1493 => x"39831470", -1494 => x"822c8171", -1495 => x"2b80e6a4", -1496 => x"08077080", -1497 => x"e6a00b84", -1498 => x"050c7610", -1499 => x"101080e6", -1500 => x"a0058871", -1501 => x"0508718c", -1502 => x"1c0c7088", -1503 => x"1c0c7a88", -1504 => x"73050c58", -1505 => x"530b0b5d", -1506 => x"56530b0b", -1507 => x"fecf3980", -1508 => x"e5e40817", -1509 => x"59800876", -1510 => x"2e819438", -1511 => x"80e69408", -1512 => x"ff2e84b7", -1513 => x"38737631", -1514 => x"1980e5e4", -1515 => x"0c738706", -1516 => x"7056530b", -1517 => x"0b72802e", -1518 => x"88388873", -1519 => x"31701555", -1520 => x"5576149f", -1521 => x"ff06a080", -1522 => x"71311670", -1523 => x"540b0b7e", -1524 => x"530b0b51", -1525 => x"530b0b85", -1526 => x"de3f8008", -1527 => x"568008ff", -1528 => x"2e81a238", -1529 => x"80e5e408", -1530 => x"73057080", -1531 => x"e5e40c74", -1532 => x"7580e6a0", -1533 => x"0b88050c", -1534 => x"77763115", -1535 => x"81075556", -1536 => x"597a80e6", -1537 => x"a02e83e0", -1538 => x"38798f26", -1539 => x"838d3881", -1540 => x"0b84150c", -1541 => x"841508fc", -1542 => x"06707931", -1543 => x"7972268f", -1544 => x"7225075d", -1545 => x"555a7a80", -1546 => x"2efcc938", -1547 => x"80e03980", -1548 => x"089fff06", -1549 => x"550b0b74", -1550 => x"fee23878", -1551 => x"80e5e40c", -1552 => x"80e6a00b", -1553 => x"8805087a", -1554 => x"18810784", -1555 => x"72050c55", -1556 => x"80e69008", -1557 => x"79278638", -1558 => x"7880e690", -1559 => x"0c80e68c", -1560 => x"087927fb", -1561 => x"f9387880", -1562 => x"e68c0c84", -1563 => x"1508fc06", -1564 => x"70793179", -1565 => x"72268f72", -1566 => x"25075d55", -1567 => x"5a7a802e", -1568 => x"fbf2388a", -1569 => x"39807457", -1570 => x"530b0bfe", -1571 => x"d7397c51", -1572 => x"84a43f80", -1573 => x"0b800c8e", -1574 => x"3d0d0480", -1575 => x"7324a538", -1576 => x"72822c81", -1577 => x"712b80e6", -1578 => x"a4080770", -1579 => x"80e6a00b", -1580 => x"84050c5c", -1581 => x"5a768c17", -1582 => x"0c738817", -1583 => x"0c758818", -1584 => x"0cf9bf39", -1585 => x"83730570", -1586 => x"822c8171", -1587 => x"2b80e6a4", -1588 => x"08077080", -1589 => x"e6a00b84", -1590 => x"050c5d5b", -1591 => x"530b0bd5", -1592 => x"397a7506", -1593 => x"5c0b0b7b", -1594 => x"fbfa3884", -1595 => x"19751056", -1596 => x"59ef39ff", -1597 => x"17810559", -1598 => x"f6bf398c", -1599 => x"15088816", -1600 => x"08718c72", -1601 => x"050c8872", -1602 => x"050c5975", -1603 => x"15847105", -1604 => x"08810784", -1605 => x"72050c58", -1606 => x"7c51839a", -1607 => x"3f881554", -1608 => x"0b0bfaf2", -1609 => x"39771678", -1610 => x"81078418", -1611 => x"0c8c1708", -1612 => x"88180871", -1613 => x"8c72050c", -1614 => x"8872050c", -1615 => x"5c7080e6", -1616 => x"b40c7080", -1617 => x"e6b00c80", -1618 => x"e6a80b8c", -1619 => x"72050c8c", -1620 => x"71050888", -1621 => x"72050c77", -1622 => x"81078472", -1623 => x"050c7705", -1624 => x"77710c55", -1625 => x"7c5182ce", -1626 => x"3f881654", -1627 => x"0b0bf4b6", -1628 => x"39721684", -1629 => x"71050881", -1630 => x"07847205", -1631 => x"0c588c16", -1632 => x"08881708", -1633 => x"718c7205", -1634 => x"0c887205", -1635 => x"0c577c51", -1636 => x"82a43f88", -1637 => x"16540b0b", -1638 => x"f48c3972", -1639 => x"84150cf4", -1640 => x"1af80670", -1641 => x"841d0881", -1642 => x"0607841d", -1643 => x"0c701c55", -1644 => x"56850b84", -1645 => x"150c850b", -1646 => x"88150c8f", -1647 => x"7627fd90", -1648 => x"38881b52", -1649 => x"0b0b7c51", -1650 => x"85b43f80", -1651 => x"e6a00b88", -1652 => x"050880e5", -1653 => x"e4085a55", -1654 => x"fcf63978", -1655 => x"80e5e40c", -1656 => x"7380e694", -1657 => x"0cfbc639", -1658 => x"7284150c", -1659 => x"fce239fb", -1660 => x"3d0d7770", -1661 => x"7a7c5855", -1662 => x"530b0b56", -1663 => x"8f752781", -1664 => x"85387276", -1665 => x"07830651", -1666 => x"0b0b7080", -1667 => x"f9387573", -1668 => x"520b0b54", -1669 => x"0b0b7070", -1670 => x"8405520b", -1671 => x"0b087470", -1672 => x"8405560c", -1673 => x"73717084", -1674 => x"05530b0b", -1675 => x"08717084", -1676 => x"05530b0b", -1677 => x"0c717084", -1678 => x"05530b0b", -1679 => x"08717084", -1680 => x"05530b0b", -1681 => x"0c717084", -1682 => x"05530b0b", -1683 => x"08717084", -1684 => x"05530b0b", -1685 => x"0cf01656", -1686 => x"540b0b74", -1687 => x"8f26ffb6", -1688 => x"38837527", -1689 => x"99387070", -1690 => x"8405520b", -1691 => x"0b087470", -1692 => x"8405560c", -1693 => x"fc15550b", -1694 => x"0b748326", -1695 => x"e9387371", -1696 => x"540b0b52", -1697 => x"0b0bff15", -1698 => x"510b0b70", -1699 => x"ff2e9f38", -1700 => x"72708105", -1701 => x"540b0b33", -1702 => x"72708105", -1703 => x"540b0b34", -1704 => x"ff710551", -1705 => x"0b0b70ff", -1706 => x"2e098106", -1707 => x"e3387580", -1708 => x"0c873d0d", -1709 => x"04040470", -1710 => x"70707080", -1711 => x"0b81c5e8", -1712 => x"0c765188", -1713 => x"d93f8008", -1714 => x"530b0b80", -1715 => x"08ff2e89", -1716 => x"3872800c", -1717 => x"50505050", -1718 => x"0481c5e8", -1719 => x"08540b0b", -1720 => x"73802eed", -1721 => x"38757471", -1722 => x"0c520b0b", -1723 => x"72800c50", -1724 => x"50505004", -1725 => x"fb3d0d77", -1726 => x"79707207", -1727 => x"8306530b", -1728 => x"0b540b0b", -1729 => x"520b0b70", -1730 => x"9b387173", -1731 => x"7308540b", -1732 => x"0b56540b", -1733 => x"0b717308", -1734 => x"2e80d838", -1735 => x"7375540b", -1736 => x"0b520b0b", -1737 => x"0b0b7133", -1738 => x"7081ff06", -1739 => x"520b0b54", -1740 => x"0b0b7080", -1741 => x"2ea53872", -1742 => x"3355700b", -1743 => x"752e0981", -1744 => x"069c3881", -1745 => x"72058114", -1746 => x"71337081", -1747 => x"ff06540b", -1748 => x"0b56540b", -1749 => x"0b520b0b", -1750 => x"70dd3872", -1751 => x"33557381", -1752 => x"ff067581", -1753 => x"ff067171", -1754 => x"31800c55", -1755 => x"520b0b87", -1756 => x"3d0d0471", -1757 => x"09f7fbfd", -1758 => x"ff730506", -1759 => x"f8848281", -1760 => x"8006520b", -1761 => x"0b0b0b71", -1762 => x"9f388414", -1763 => x"84167108", -1764 => x"540b0b56", -1765 => x"540b0b71", -1766 => x"75082ed7", -1767 => x"38737554", -1768 => x"0b0b520b", -1769 => x"0bfefd39", -1770 => x"800b800c", -1771 => x"873d0d04", -1772 => x"fb3d0d77", -1773 => x"70520b0b", -1774 => x"56fdfa3f", -1775 => x"80e6a00b", -1776 => x"88050884", -1777 => x"710508fc", -1778 => x"06707b31", -1779 => x"9fef05e0", -1780 => x"8006e080", -1781 => x"05520b0b", -1782 => x"5555a080", -1783 => x"75249838", -1784 => x"80520b0b", -1785 => x"7551fdcf", -1786 => x"3f80e6a8", -1787 => x"0814530b", -1788 => x"0b728008", -1789 => x"2e913875", -1790 => x"51fdbb3f", -1791 => x"80530b0b", -1792 => x"72800c87", -1793 => x"3d0d0474", -1794 => x"30520b0b", -1795 => x"7551fda7", -1796 => x"3f8008ff", -1797 => x"2eab3880", -1798 => x"e6a00b88", -1799 => x"05087476", -1800 => x"31810784", -1801 => x"72050c53", -1802 => x"0b0b80e5", -1803 => x"e4087531", -1804 => x"80e5e40c", -1805 => x"7551fcfe", -1806 => x"3f810b80", -1807 => x"0c873d0d", -1808 => x"0480520b", -1809 => x"0b7551fc", -1810 => x"ee3f80e6", -1811 => x"a00b8805", -1812 => x"08800871", -1813 => x"31540b0b", -1814 => x"540b0b8f", -1815 => x"7325ff97", -1816 => x"38800880", -1817 => x"e6940831", -1818 => x"80e5e40c", -1819 => x"72810784", -1820 => x"150c7551", -1821 => x"fcc03f80", -1822 => x"530b0bff", -1823 => x"8339f73d", -1824 => x"0d7b7d54", -1825 => x"0b0b5a72", -1826 => x"802e82ab", -1827 => x"387951fc", -1828 => x"a43ff873", -1829 => x"05847105", -1830 => x"0870fe06", -1831 => x"70730584", -1832 => x"710508fc", -1833 => x"065c5758", -1834 => x"540b0b57", -1835 => x"80e6a808", -1836 => x"742e838b", -1837 => x"38778415", -1838 => x"0c807381", -1839 => x"0656590b", -1840 => x"740b792e", -1841 => x"81f53877", -1842 => x"14847105", -1843 => x"08810656", -1844 => x"530b0b74", -1845 => x"a3387716", -1846 => x"56788287", -1847 => x"38881408", -1848 => x"550b0b74", -1849 => x"80e6a82e", -1850 => x"83a7388c", -1851 => x"1408708c", -1852 => x"170c7588", -1853 => x"72050c58", -1854 => x"75810784", -1855 => x"180c7517", -1856 => x"76710c54", -1857 => x"0b0b7881", -1858 => x"a93883ff", -1859 => x"762781e5", -1860 => x"3875892a", -1861 => x"76832a54", -1862 => x"0b0b540b", -1863 => x"0b73802e", -1864 => x"80cb3875", -1865 => x"862ab805", -1866 => x"530b0b84", -1867 => x"7427be38", -1868 => x"80db1453", -1869 => x"0b0b9474", -1870 => x"27b33875", -1871 => x"8c2a80ee", -1872 => x"05530b0b", -1873 => x"80d47427", -1874 => x"a438758f", -1875 => x"2a80f705", -1876 => x"530b0b82", -1877 => x"d4742795", -1878 => x"3875922a", -1879 => x"80fc0553", -1880 => x"0b0b8ad4", -1881 => x"74278638", -1882 => x"80fe530b", -1883 => x"0b721010", -1884 => x"1080e6a0", -1885 => x"05887105", -1886 => x"0855550b", -1887 => x"730b752e", -1888 => x"82da3884", -1889 => x"1408fc06", -1890 => x"59750b79", -1891 => x"278f3888", -1892 => x"1408540b", -1893 => x"0b73752e", -1894 => x"098106e7", -1895 => x"388c1408", -1896 => x"708c190c", -1897 => x"7488190c", -1898 => x"77887205", -1899 => x"0c55768c", -1900 => x"150c7951", -1901 => x"fa803f8b", -1902 => x"3d0d0476", -1903 => x"08777131", -1904 => x"58760588", -1905 => x"18085656", -1906 => x"0b7480e6", -1907 => x"a82e80ea", -1908 => x"388c1708", -1909 => x"708c170c", -1910 => x"75887205", -1911 => x"0c530b0b", -1912 => x"fde53988", -1913 => x"14088c15", -1914 => x"08708c73", -1915 => x"050c5988", -1916 => x"190cfe84", -1917 => x"3975832a", -1918 => x"70540b0b", -1919 => x"540b0b80", -1920 => x"742481a2", -1921 => x"3872822c", -1922 => x"81712b80", -1923 => x"e6a40807", -1924 => x"80e6a00b", -1925 => x"84050c74", -1926 => x"10101080", -1927 => x"e6a00588", -1928 => x"71050871", -1929 => x"8c1b0c70", -1930 => x"881b0c79", -1931 => x"8873050c", -1932 => x"565a5576", -1933 => x"8c150cfe", -1934 => x"f9398159", -1935 => x"fd893977", -1936 => x"16738106", -1937 => x"540b0b55", -1938 => x"729a3876", -1939 => x"08777131", -1940 => x"5875058c", -1941 => x"18088819", -1942 => x"08718c72", -1943 => x"050c8872", -1944 => x"050c5555", -1945 => x"0b0b7481", -1946 => x"0784180c", -1947 => x"7680e6a0", -1948 => x"0b88050c", -1949 => x"80e69c08", -1950 => x"7526feb6", -1951 => x"3880e698", -1952 => x"08520b0b", -1953 => x"7951faa8", -1954 => x"3f7951f8", -1955 => x"a93ffea7", -1956 => x"3981778c", -1957 => x"170c7788", -1958 => x"170c758c", -1959 => x"190c7588", -1960 => x"190c59fc", -1961 => x"d3398314", -1962 => x"70822c81", -1963 => x"712b80e6", -1964 => x"a4080780", -1965 => x"e6a00b84", -1966 => x"050c7510", -1967 => x"101080e6", -1968 => x"a0058871", -1969 => x"0508718c", -1970 => x"1c0c7088", -1971 => x"1c0c7a88", -1972 => x"73050c57", -1973 => x"5b56530b", -1974 => x"0bfed839", -1975 => x"807324a3", -1976 => x"3872822c", -1977 => x"81712b80", -1978 => x"e6a40807", -1979 => x"80e6a00b", -1980 => x"84050c58", -1981 => x"748c180c", -1982 => x"7388180c", -1983 => x"7688160c", -1984 => x"fdac3983", -1985 => x"73057082", -1986 => x"2c81712b", -1987 => x"80e6a408", -1988 => x"0780e6a0", -1989 => x"0b84050c", -1990 => x"59530b0b", -1991 => x"d7397070", -1992 => x"7081c5ec", -1993 => x"08510b0b", -1994 => x"708a3881", -1995 => x"c5f47081", -1996 => x"c5ec0c51", -1997 => x"740b7105", -1998 => x"520b0bff", -1999 => x"530b0b71", -2000 => x"87fb8080", -2001 => x"268a3871", -2002 => x"81c5ec0c", -2003 => x"70530b0b", -2004 => x"72800c50", -2005 => x"50500470", -2006 => x"70707080", -2007 => x"0b80e5d0", -2008 => x"08540b0b", -2009 => x"540b0b72", -2010 => x"812e9d38", -2011 => x"7381c5f0", -2012 => x"0ccabe3f", -2013 => x"c98a3f80", -2014 => x"f5a8520b", -2015 => x"0b8151d3", -2016 => x"fa3f8008", -2017 => x"518a8f3f", -2018 => x"7281c5f0", -2019 => x"0ccaa23f", -2020 => x"c8ee3f80", -2021 => x"f5a8520b", -2022 => x"0b8151d3", -2023 => x"de3f8008", -2024 => x"5189f33f", -2025 => x"00ff3900", -2026 => x"ff39f53d", -2027 => x"0d7e6081", -2028 => x"c5f00870", -2029 => x"5b585b5b", -2030 => x"7580c538", -2031 => x"777a25a2", -2032 => x"38771b70", -2033 => x"337081ff", -2034 => x"06585859", -2035 => x"758a2e99", -2036 => x"387681ff", -2037 => x"0651c9b4", -2038 => x"3f811858", -2039 => x"790b7824", -2040 => x"e0387980", -2041 => x"0c8d3d0d", -2042 => x"048d51c9", -2043 => x"9f3f7833", -2044 => x"7081ff06", -2045 => x"520b0b57", -2046 => x"c9923f81", -2047 => x"1858dd39", -2048 => x"79557a54", -2049 => x"0b0b7d53", -2050 => x"0b0b8552", -2051 => x"0b0b8d3d", -2052 => x"fc0551c8", -2053 => x"af3f8008", -2054 => x"5688f43f", -2055 => x"7b80080c", -2056 => x"75800c8d", -2057 => x"3d0d04f6", -2058 => x"3d0d7d7f", -2059 => x"81c5f008", -2060 => x"705a585a", -2061 => x"5a7580ca", -2062 => x"38767925", -2063 => x"b638761a", -2064 => x"58c8a53f", -2065 => x"80087834", -2066 => x"800b8008", -2067 => x"81ff0657", -2068 => x"580b758a", -2069 => x"2ea83875", -2070 => x"8d327030", -2071 => x"7080257a", -2072 => x"07515156", -2073 => x"0b0b7580", -2074 => x"c0388117", -2075 => x"57780b77", -2076 => x"24cc3876", -2077 => x"560b0b75", -2078 => x"800c8c3d", -2079 => x"0d048158", -2080 => x"d6397855", -2081 => x"79540b0b", -2082 => x"7c530b0b", -2083 => x"84520b0b", -2084 => x"8c3dfc05", -2085 => x"51c7ad3f", -2086 => x"80085687", -2087 => x"f23f7a80", -2088 => x"080c7580", -2089 => x"0c8c3d0d", -2090 => x"04811756", -2091 => x"c839f93d", -2092 => x"0d795781", -2093 => x"c5f00880", -2094 => x"2eb23876", -2095 => x"518ac03f", -2096 => x"7b567a55", -2097 => x"80088105", -2098 => x"540b0b76", -2099 => x"530b0b82", -2100 => x"520b0b89", -2101 => x"3dfc0551", -2102 => x"c6ea3f80", -2103 => x"085787af", -2104 => x"3f778008", -2105 => x"0c76800c", -2106 => x"893d0d04", -2107 => x"87a13f85", -2108 => x"0b80080c", -2109 => x"ff0b800c", -2110 => x"893d0d04", -2111 => x"fb3d0d81", -2112 => x"c5f00870", -2113 => x"56540b0b", -2114 => x"73883874", -2115 => x"800c873d", -2116 => x"0d047753", -2117 => x"0b0b8352", -2118 => x"0b0b873d", -2119 => x"fc0551c6", -2120 => x"a33f8008", -2121 => x"540b0b86", -2122 => x"e63f7580", -2123 => x"080c7380", -2124 => x"0c873d0d", -2125 => x"04ff0b80", -2126 => x"0c04fb3d", -2127 => x"0d775581", -2128 => x"c5f00880", -2129 => x"2eae3874", -2130 => x"5189b43f", -2131 => x"80088105", -2132 => x"540b0b74", -2133 => x"530b0b87", -2134 => x"520b0b87", -2135 => x"3dfc0551", -2136 => x"c5e23f80", -2137 => x"085586a7", -2138 => x"3f758008", -2139 => x"0c74800c", -2140 => x"873d0d04", -2141 => x"86993f85", -2142 => x"0b80080c", -2143 => x"ff0b800c", -2144 => x"873d0d04", -2145 => x"fa3d0d81", -2146 => x"c5f00880", -2147 => x"2ea8387a", -2148 => x"5579540b", -2149 => x"0b78530b", -2150 => x"0b86520b", -2151 => x"0b883dfc", -2152 => x"0551c5a0", -2153 => x"3f800856", -2154 => x"85e53f76", -2155 => x"80080c75", -2156 => x"800c883d", -2157 => x"0d0485d7", -2158 => x"3f9d0b80", -2159 => x"080cff0b", -2160 => x"800c883d", -2161 => x"0d04f73d", -2162 => x"0d7b7d5b", -2163 => x"59bc530b", -2164 => x"0b80520b", -2165 => x"0b795186", -2166 => x"fd3f8070", -2167 => x"56579856", -2168 => x"74197033", -2169 => x"70782b79", -2170 => x"078118f8", -2171 => x"1a5a5859", -2172 => x"55588475", -2173 => x"24ea3876", -2174 => x"7a238419", -2175 => x"58807056", -2176 => x"57985674", -2177 => x"18703370", -2178 => x"782b7907", -2179 => x"8118f81a", -2180 => x"5a585951", -2181 => x"540b0b84", -2182 => x"7524e838", -2183 => x"76821b23", -2184 => x"88195880", -2185 => x"70565798", -2186 => x"56741870", -2187 => x"3370782b", -2188 => x"79078118", -2189 => x"f81a5a58", -2190 => x"5951540b", -2191 => x"0b847524", -2192 => x"e8387684", -2193 => x"1b0c8c19", -2194 => x"58807056", -2195 => x"57985674", -2196 => x"18703370", -2197 => x"782b7907", -2198 => x"8118f81a", -2199 => x"5a585951", -2200 => x"540b0b84", -2201 => x"7524e838", -2202 => x"76881b23", -2203 => x"90195880", -2204 => x"70565798", -2205 => x"56741870", -2206 => x"3370782b", -2207 => x"79078118", -2208 => x"f81a5a58", -2209 => x"5951540b", -2210 => x"0b847524", -2211 => x"e838768a", -2212 => x"1b239419", -2213 => x"58807056", -2214 => x"57985674", -2215 => x"18703370", -2216 => x"782b7907", -2217 => x"8118f81a", -2218 => x"5a585951", -2219 => x"540b0b84", -2220 => x"7524e838", -2221 => x"768c1b23", -2222 => x"98195880", -2223 => x"70565798", -2224 => x"56741870", -2225 => x"3370782b", -2226 => x"79078118", -2227 => x"f81a5a58", -2228 => x"5951540b", -2229 => x"0b847524", -2230 => x"e838768e", -2231 => x"1b239c19", -2232 => x"58807056", -2233 => x"57b85674", -2234 => x"18703370", -2235 => x"782b7907", -2236 => x"8118f81a", -2237 => x"5a58595a", -2238 => x"540b0b88", -2239 => x"7524e838", -2240 => x"76901b0c", -2241 => x"8b3d0d04", -2242 => x"e93d0d6a", -2243 => x"81c5f008", -2244 => x"57570b75", -2245 => x"933880c0", -2246 => x"800b8418", -2247 => x"0c75ac18", -2248 => x"0c75800c", -2249 => x"993d0d04", -2250 => x"893d7055", -2251 => x"6a540b0b", -2252 => x"558a520b", -2253 => x"0b993dff", -2254 => x"bc0551c2", -2255 => x"873f8008", -2256 => x"77530b0b", -2257 => x"75520b0b", -2258 => x"56fcfb3f", -2259 => x"82c13f77", -2260 => x"80080c75", -2261 => x"800c993d", -2262 => x"0d04e93d", -2263 => x"0d695781", -2264 => x"c5f00880", -2265 => x"2ebd3876", -2266 => x"5185943f", -2267 => x"893d7056", -2268 => x"80088105", -2269 => x"5577540b", -2270 => x"0b568f52", -2271 => x"0b0b993d", -2272 => x"ffbc0551", -2273 => x"c1be3f80", -2274 => x"086b530b", -2275 => x"0b76520b", -2276 => x"0b57fcb2", -2277 => x"3f81f83f", -2278 => x"7780080c", -2279 => x"76800c99", -2280 => x"3d0d0481", -2281 => x"ea3f850b", -2282 => x"80080cff", -2283 => x"0b800c99", -2284 => x"3d0d04fc", -2285 => x"3d0d8154", -2286 => x"0b0b81c5", -2287 => x"f0088838", -2288 => x"73800c86", -2289 => x"3d0d0476", -2290 => x"530b0b97", -2291 => x"b9520b0b", -2292 => x"863dfc05", -2293 => x"51c0ed3f", -2294 => x"8008540b", -2295 => x"0b81b03f", -2296 => x"7480080c", -2297 => x"73800c86", -2298 => x"3d0d04f4", -2299 => x"3d0d7e80", -2300 => x"f5d40870", -2301 => x"0881ff06", -2302 => x"913df805", -2303 => x"540b0b51", -2304 => x"5959c29d", -2305 => x"3f775780", -2306 => x"540b0b76", -2307 => x"557b7d58", -2308 => x"520b0b0b", -2309 => x"76530b0b", -2310 => x"8e3df005", -2311 => x"5184dc3f", -2312 => x"797b5879", -2313 => x"0c76841a", -2314 => x"0c78800c", -2315 => x"8e3d0d04", -2316 => x"f43d0d7e", -2317 => x"80f5d408", -2318 => x"70087081", -2319 => x"ff06923d", -2320 => x"f8055551", -2321 => x"5a5759c1", -2322 => x"d83f7757", -2323 => x"800b8b3d", -2324 => x"59540b0b", -2325 => x"76557b7d", -2326 => x"58520b0b", -2327 => x"0b76530b", -2328 => x"0b775184", -2329 => x"963f8056", -2330 => x"bd84c076", -2331 => x"5555797b", -2332 => x"58520b0b", -2333 => x"0b76530b", -2334 => x"0b775183", -2335 => x"fe3f7a57", -2336 => x"78802e84", -2337 => x"3876790c", -2338 => x"76800c8e", -2339 => x"3d0d0480", -2340 => x"eea80880", -2341 => x"0c04f73d", -2342 => x"0d7b80ee", -2343 => x"a80882c8", -2344 => x"7105085a", -2345 => x"540b0b5a", -2346 => x"77802e80", -2347 => x"eb388188", -2348 => x"18841908", -2349 => x"ff058171", -2350 => x"2b595559", -2351 => x"80742481", -2352 => x"80388074", -2353 => x"2480c138", -2354 => x"73822b78", -2355 => x"71058805", -2356 => x"56568180", -2357 => x"19087706", -2358 => x"530b0b72", -2359 => x"802e80c3", -2360 => x"38781670", -2361 => x"08530b0b", -2362 => x"530b0b79", -2363 => x"51740853", -2364 => x"0b0b722d", -2365 => x"ff14fc17", -2366 => x"fc177981", -2367 => x"2c5a5757", -2368 => x"540b0b73", -2369 => x"8025cb38", -2370 => x"7708580b", -2371 => x"0b77ff9e", -2372 => x"3880eea8", -2373 => x"08530b0b", -2374 => x"bc730508", -2375 => x"a9387951", -2376 => x"f5823f74", -2377 => x"08530b0b", -2378 => x"722dff14", -2379 => x"fc17fc17", -2380 => x"79812c5a", -2381 => x"5757540b", -2382 => x"0b738025", -2383 => x"ff9438c8", -2384 => x"398057fe", -2385 => x"fd397251", -2386 => x"bc730508", -2387 => x"540b0b73", -2388 => x"2d7951f4", -2389 => x"cf3ffb3d", -2390 => x"0d777a71", -2391 => x"028c05a3", -2392 => x"05335854", -2393 => x"0b0b540b", -2394 => x"0b568373", -2395 => x"2780e738", -2396 => x"75830651", -2397 => x"0b0b7080", -2398 => x"dd387488", -2399 => x"2b750770", -2400 => x"71902b07", -2401 => x"55518f73", -2402 => x"27b33873", -2403 => x"72708405", -2404 => x"540b0b0c", -2405 => x"71747170", -2406 => x"8405530b", -2407 => x"0b0c7471", -2408 => x"70840553", -2409 => x"0b0b0c74", -2410 => x"71708405", -2411 => x"530b0b0c", -2412 => x"f014540b", -2413 => x"0b520b0b", -2414 => x"728f26cf", -2415 => x"38837327", -2416 => x"95387372", -2417 => x"70840554", -2418 => x"0b0b0cfc", -2419 => x"7305530b", -2420 => x"0b728326", -2421 => x"ed38ff73", -2422 => x"05510b0b", -2423 => x"70ff2e98", -2424 => x"38747270", -2425 => x"8105540b", -2426 => x"0b34ff71", -2427 => x"05510b0b", -2428 => x"70ff2e09", -2429 => x"8106ea38", -2430 => x"75800c87", -2431 => x"3d0d0470", -2432 => x"70707075", -2433 => x"70718306", -2434 => x"530b0b55", -2435 => x"520b0b70", -2436 => x"80c53871", -2437 => x"70087009", -2438 => x"f7fbfdff", -2439 => x"720506f8", -2440 => x"84828180", -2441 => x"06540b0b", -2442 => x"520b0b53", -2443 => x"0b0b71a3", -2444 => x"38847305", -2445 => x"70087009", -2446 => x"f7fbfdff", -2447 => x"720506f8", -2448 => x"84828180", -2449 => x"06540b0b", -2450 => x"520b0b53", -2451 => x"0b0b7180", -2452 => x"2edf3872", -2453 => x"520b0b0b", -2454 => x"0b713353", -2455 => x"0b0b7280", -2456 => x"2e8f3881", -2457 => x"72057033", -2458 => x"540b0b52", -2459 => x"0b0b72f3", -2460 => x"38717431", -2461 => x"800c5050", -2462 => x"505004e4", -2463 => x"3d0d6ea1", -2464 => x"3d08a33d", -2465 => x"0859575f", -2466 => x"80764d77", -2467 => x"4ea33d08", -2468 => x"a53d0857", -2469 => x"4b0b754c", -2470 => x"5e0b0b7d", -2471 => x"6c2487b2", -2472 => x"38806a24", -2473 => x"87cd3869", -2474 => x"6b58566b", -2475 => x"6d5d460b", -2476 => x"7b477544", -2477 => x"76450b0b", -2478 => x"64646868", -2479 => x"5c5c5656", -2480 => x"0b7481f5", -2481 => x"38787627", -2482 => x"82dd3875", -2483 => x"81ff2683", -2484 => x"2b5583ff", -2485 => x"ff76278c", -2486 => x"389055fe", -2487 => x"800a7627", -2488 => x"83389855", -2489 => x"750b752a", -2490 => x"80e3bc05", -2491 => x"7033a077", -2492 => x"31713157", -2493 => x"55577480", -2494 => x"2e953875", -2495 => x"752ba076", -2496 => x"317a772b", -2497 => x"7c722a07", -2498 => x"7c782b5d", -2499 => x"5b59560b", -2500 => x"0b75902a", -2501 => x"7683ffff", -2502 => x"0671540b", -2503 => x"0b7a530b", -2504 => x"0b595788", -2505 => x"bf3f8008", -2506 => x"5b88a53f", -2507 => x"80088008", -2508 => x"79297c90", -2509 => x"2b7c902a", -2510 => x"07565659", -2511 => x"73752794", -2512 => x"388008ff", -2513 => x"05761555", -2514 => x"59757426", -2515 => x"87387474", -2516 => x"2687f438", -2517 => x"76520b0b", -2518 => x"73753151", -2519 => x"88863f80", -2520 => x"085587ec", -2521 => x"3f800880", -2522 => x"0879297b", -2523 => x"83ffff06", -2524 => x"77902b07", -2525 => x"56595773", -2526 => x"78279638", -2527 => x"8008ff05", -2528 => x"76155557", -2529 => x"75742689", -2530 => x"38777426", -2531 => x"77713158", -2532 => x"5678902b", -2533 => x"77075880", -2534 => x"5b0b0b7a", -2535 => x"4077417f", -2536 => x"0b615654", -2537 => x"0b0b7d80", -2538 => x"dd38737f", -2539 => x"0c747f84", -2540 => x"050c7e80", -2541 => x"0c9e3d0d", -2542 => x"0480705c", -2543 => x"58747926", -2544 => x"d8387481", -2545 => x"ff26832b", -2546 => x"577483ff", -2547 => x"ff2682bd", -2548 => x"3874772a", -2549 => x"80e3bc05", -2550 => x"7033a079", -2551 => x"31713159", -2552 => x"5c5d7682", -2553 => x"cf387654", -2554 => x"0b0b7479", -2555 => x"27853881", -2556 => x"540b0b79", -2557 => x"76277407", -2558 => x"59815878", -2559 => x"ff993876", -2560 => x"58805bff", -2561 => x"94397352", -2562 => x"0b0b7453", -2563 => x"0b0b9e3d", -2564 => x"e80551d2", -2565 => x"d43f6769", -2566 => x"567f0c74", -2567 => x"7f84050c", -2568 => x"7e800c9e", -2569 => x"3d0d0475", -2570 => x"802e81d2", -2571 => x"387581ff", -2572 => x"26832b55", -2573 => x"83ffff76", -2574 => x"278c3890", -2575 => x"55fe800a", -2576 => x"76278338", -2577 => x"9855750b", -2578 => x"752a80e3", -2579 => x"bc057033", -2580 => x"a0773171", -2581 => x"31575e54", -2582 => x"0b0b7484", -2583 => x"b8387876", -2584 => x"31540b0b", -2585 => x"8176902a", -2586 => x"7783ffff", -2587 => x"065f5d5b", -2588 => x"0b7b520b", -2589 => x"0b735185", -2590 => x"eb3f8008", -2591 => x"5785d13f", -2592 => x"80088008", -2593 => x"7e297890", -2594 => x"2b7c902a", -2595 => x"07565659", -2596 => x"73752794", -2597 => x"388008ff", -2598 => x"05761555", -2599 => x"59757426", -2600 => x"87387474", -2601 => x"26859738", -2602 => x"7b520b0b", -2603 => x"73753151", -2604 => x"85b23f80", -2605 => x"08558598", -2606 => x"3f800880", -2607 => x"087e297b", -2608 => x"83ffff06", -2609 => x"77902b07", -2610 => x"56595773", -2611 => x"78279638", -2612 => x"8008ff05", -2613 => x"76155557", -2614 => x"75742689", -2615 => x"38777426", -2616 => x"77713158", -2617 => x"5a78902b", -2618 => x"77077b41", -2619 => x"410b7f0b", -2620 => x"6156540b", -2621 => x"0b7d802e", -2622 => x"fdb038fe", -2623 => x"89397552", -2624 => x"0b0b8151", -2625 => x"84ca3f80", -2626 => x"0856fea1", -2627 => x"399057fe", -2628 => x"800a7527", -2629 => x"fdbb3898", -2630 => x"75712a80", -2631 => x"e3bc0570", -2632 => x"33a07331", -2633 => x"7131530b", -2634 => x"0b5d5e57", -2635 => x"0b0b7680", -2636 => x"2efdb338", -2637 => x"a0773175", -2638 => x"782b7772", -2639 => x"2a077779", -2640 => x"2b7b7a2b", -2641 => x"7d742a07", -2642 => x"7d7b2b73", -2643 => x"902a7483", -2644 => x"ffff0671", -2645 => x"597f772a", -2646 => x"585e5c41", -2647 => x"5f585c54", -2648 => x"0b0b8480", -2649 => x"3f800854", -2650 => x"0b0b83e4", -2651 => x"3f800880", -2652 => x"08792975", -2653 => x"902b7e90", -2654 => x"2a075656", -2655 => x"59737527", -2656 => x"99388008", -2657 => x"ff057b15", -2658 => x"55597a74", -2659 => x"268c3873", -2660 => x"75278738", -2661 => x"ff197b15", -2662 => x"55597652", -2663 => x"0b0b7375", -2664 => x"315183c0", -2665 => x"3f800855", -2666 => x"83a63f80", -2667 => x"08800879", -2668 => x"297d83ff", -2669 => x"ff067790", -2670 => x"2b075659", -2671 => x"57737827", -2672 => x"99388008", -2673 => x"ff057b15", -2674 => x"55577a74", -2675 => x"268c3873", -2676 => x"78278738", -2677 => x"ff177b15", -2678 => x"55570b73", -2679 => x"78317990", -2680 => x"2b780770", -2681 => x"83ffff06", -2682 => x"71902a79", -2683 => x"83ffff06", -2684 => x"7a902a73", -2685 => x"72297373", -2686 => x"29747329", -2687 => x"76742973", -2688 => x"902a0572", -2689 => x"05575543", -2690 => x"5f5b585a", -2691 => x"57595a74", -2692 => x"7c278638", -2693 => x"84808017", -2694 => x"5774902a", -2695 => x"177983ff", -2696 => x"ff067684", -2697 => x"80802905", -2698 => x"57570b0b", -2699 => x"767a269a", -2700 => x"38767a32", -2701 => x"70307072", -2702 => x"07802556", -2703 => x"5a5b7c76", -2704 => x"27fad438", -2705 => x"73802efa", -2706 => x"ce38ff18", -2707 => x"58805bfa", -2708 => x"c839ff76", -2709 => x"530b0b77", -2710 => x"540b0b9f", -2711 => x"3de80552", -2712 => x"0b0b5ece", -2713 => x"843f6769", -2714 => x"574c0b75", -2715 => x"4d698025", -2716 => x"f8b5387d", -2717 => x"096a6c5c", -2718 => x"530b0b7a", -2719 => x"540b0b9f", -2720 => x"3de80552", -2721 => x"0b0b5ecd", -2722 => x"e03f6769", -2723 => x"714c704d", -2724 => x"5856f897", -2725 => x"39a07531", -2726 => x"76762b7a", -2727 => x"772b7c73", -2728 => x"2a077c78", -2729 => x"2b72902a", -2730 => x"7383ffff", -2731 => x"0671587e", -2732 => x"762a5742", -2733 => x"405d5d57", -2734 => x"5881a93f", -2735 => x"80085781", -2736 => x"8f3f8008", -2737 => x"80087e29", -2738 => x"78902b7d", -2739 => x"902a0756", -2740 => x"56597375", -2741 => x"27993880", -2742 => x"08ff0576", -2743 => x"15555975", -2744 => x"74268c38", -2745 => x"73752787", -2746 => x"38ff1976", -2747 => x"1555597b", -2748 => x"520b0b73", -2749 => x"75315180", -2750 => x"eb3f8008", -2751 => x"5580d13f", -2752 => x"80088008", -2753 => x"7e297c83", -2754 => x"ffff0670", -2755 => x"78902b07", -2756 => x"51565858", -2757 => x"73772799", -2758 => x"388008ff", -2759 => x"05761555", -2760 => x"58757426", -2761 => x"8c387377", -2762 => x"278738ff", -2763 => x"18761555", -2764 => x"5878902b", -2765 => x"78077478", -2766 => x"31555bfa", -2767 => x"b339ff19", -2768 => x"76155559", -2769 => x"fae239ff", -2770 => x"19761555", -2771 => x"59f88539", -2772 => x"70707080", -2773 => x"530b0b75", -2774 => x"520b0b74", -2775 => x"51ceaf3f", -2776 => x"50505004", -2777 => x"70707081", -2778 => x"530b0b75", -2779 => x"520b0b74", -2780 => x"51ce9b3f", -2781 => x"50505004", -2782 => x"707080f5", -2783 => x"b00bfc05", -2784 => x"7008520b", -2785 => x"0b520b0b", -2786 => x"0b70ff2e", -2787 => x"9738702d", -2788 => x"fc720570", -2789 => x"08520b0b", -2790 => x"520b0b0b", -2791 => x"70ff2e09", -2792 => x"8106eb38", -2793 => x"50500404", -2794 => x"ffb4963f", -2795 => x"04000000", -2796 => x"30313233", -2797 => x"34353637", -2798 => x"38390000", -2799 => x"44485259", -2800 => x"53544f4e", -2801 => x"45205052", -2802 => x"4f475241", -2803 => x"4d2c2053", -2804 => x"4f4d4520", -2805 => x"53545249", -2806 => x"4e470000", -2807 => x"44485259", -2808 => x"53544f4e", -2809 => x"45205052", -2810 => x"4f475241", -2811 => x"4d2c2031", -2812 => x"27535420", -2813 => x"53545249", -2814 => x"4e470000", -2815 => x"44687279", -2816 => x"73746f6e", -2817 => x"65204265", -2818 => x"6e63686d", -2819 => x"61726b2c", -2820 => x"20566572", -2821 => x"73696f6e", -2822 => x"20322e31", -2823 => x"20284c61", -2824 => x"6e677561", -2825 => x"67653a20", -2826 => x"43290a00", -2827 => x"50726f67", -2828 => x"72616d20", -2829 => x"636f6d70", -2830 => x"696c6564", -2831 => x"20776974", -2832 => x"68202772", -2833 => x"65676973", -2834 => x"74657227", -2835 => x"20617474", -2836 => x"72696275", -2837 => x"74650a00", -2838 => x"45786563", -2839 => x"7574696f", -2840 => x"6e207374", -2841 => x"61727473", -2842 => x"2c202564", -2843 => x"2072756e", -2844 => x"73207468", -2845 => x"726f7567", -2846 => x"68204468", -2847 => x"72797374", -2848 => x"6f6e650a", -2849 => x"00000000", -2850 => x"44485259", -2851 => x"53544f4e", -2852 => x"45205052", -2853 => x"4f475241", -2854 => x"4d2c2032", -2855 => x"274e4420", -2856 => x"53545249", -2857 => x"4e470000", -2858 => x"45786563", -2859 => x"7574696f", -2860 => x"6e20656e", -2861 => x"64730a00", -2862 => x"46696e61", -2863 => x"6c207661", -2864 => x"6c756573", -2865 => x"206f6620", -2866 => x"74686520", -2867 => x"76617269", -2868 => x"61626c65", -2869 => x"73207573", -2870 => x"65642069", -2871 => x"6e207468", -2872 => x"65206265", -2873 => x"6e63686d", -2874 => x"61726b3a", -2875 => x"0a000000", -2876 => x"496e745f", -2877 => x"476c6f62", -2878 => x"3a202020", -2879 => x"20202020", -2880 => x"20202020", -2881 => x"2025640a", -2882 => x"00000000", -2883 => x"20202020", -2884 => x"20202020", -2885 => x"73686f75", -2886 => x"6c642062", -2887 => x"653a2020", -2888 => x"2025640a", -2889 => x"00000000", -2890 => x"426f6f6c", -2891 => x"5f476c6f", -2892 => x"623a2020", -2893 => x"20202020", -2894 => x"20202020", -2895 => x"2025640a", -2896 => x"00000000", -2897 => x"43685f31", -2898 => x"5f476c6f", -2899 => x"623a2020", -2900 => x"20202020", -2901 => x"20202020", -2902 => x"2025630a", -2903 => x"00000000", -2904 => x"20202020", -2905 => x"20202020", -2906 => x"73686f75", -2907 => x"6c642062", -2908 => x"653a2020", -2909 => x"2025630a", -2910 => x"00000000", -2911 => x"43685f32", -2912 => x"5f476c6f", -2913 => x"623a2020", -2914 => x"20202020", -2915 => x"20202020", -2916 => x"2025630a", -2917 => x"00000000", -2918 => x"4172725f", -2919 => x"315f476c", -2920 => x"6f625b38", -2921 => x"5d3a2020", -2922 => x"20202020", -2923 => x"2025640a", -2924 => x"00000000", -2925 => x"4172725f", -2926 => x"325f476c", -2927 => x"6f625b38", -2928 => x"5d5b375d", -2929 => x"3a202020", -2930 => x"2025640a", -2931 => x"00000000", -2932 => x"20202020", -2933 => x"20202020", -2934 => x"73686f75", -2935 => x"6c642062", -2936 => x"653a2020", -2937 => x"204e756d", -2938 => x"6265725f", -2939 => x"4f665f52", -2940 => x"756e7320", -2941 => x"2b203130", -2942 => x"0a000000", -2943 => x"5074725f", -2944 => x"476c6f62", -2945 => x"2d3e0a00", -2946 => x"20205074", -2947 => x"725f436f", -2948 => x"6d703a20", -2949 => x"20202020", -2950 => x"20202020", -2951 => x"2025640a", -2952 => x"00000000", -2953 => x"20202020", -2954 => x"20202020", -2955 => x"73686f75", -2956 => x"6c642062", -2957 => x"653a2020", -2958 => x"2028696d", -2959 => x"706c656d", -2960 => x"656e7461", -2961 => x"74696f6e", -2962 => x"2d646570", -2963 => x"656e6465", -2964 => x"6e74290a", -2965 => x"00000000", -2966 => x"20204469", -2967 => x"7363723a", -2968 => x"20202020", -2969 => x"20202020", -2970 => x"20202020", -2971 => x"2025640a", -2972 => x"00000000", -2973 => x"2020456e", -2974 => x"756d5f43", -2975 => x"6f6d703a", -2976 => x"20202020", -2977 => x"20202020", -2978 => x"2025640a", -2979 => x"00000000", -2980 => x"2020496e", -2981 => x"745f436f", -2982 => x"6d703a20", -2983 => x"20202020", -2984 => x"20202020", -2985 => x"2025640a", -2986 => x"00000000", -2987 => x"20205374", -2988 => x"725f436f", -2989 => x"6d703a20", -2990 => x"20202020", -2991 => x"20202020", -2992 => x"2025730a", -2993 => x"00000000", -2994 => x"20202020", -2995 => x"20202020", -2996 => x"73686f75", -2997 => x"6c642062", -2998 => x"653a2020", -2999 => x"20444852", -3000 => x"5953544f", -3001 => x"4e452050", -3002 => x"524f4752", -3003 => x"414d2c20", -3004 => x"534f4d45", -3005 => x"20535452", -3006 => x"494e470a", -3007 => x"00000000", -3008 => x"4e657874", -3009 => x"5f507472", -3010 => x"5f476c6f", -3011 => x"622d3e0a", -3012 => x"00000000", -3013 => x"20202020", -3014 => x"20202020", -3015 => x"73686f75", -3016 => x"6c642062", -3017 => x"653a2020", -3018 => x"2028696d", -3019 => x"706c656d", -3020 => x"656e7461", -3021 => x"74696f6e", -3022 => x"2d646570", -3023 => x"656e6465", -3024 => x"6e74292c", -3025 => x"2073616d", -3026 => x"65206173", -3027 => x"2061626f", -3028 => x"76650a00", -3029 => x"496e745f", -3030 => x"315f4c6f", -3031 => x"633a2020", -3032 => x"20202020", -3033 => x"20202020", -3034 => x"2025640a", -3035 => x"00000000", -3036 => x"496e745f", -3037 => x"325f4c6f", -3038 => x"633a2020", -3039 => x"20202020", -3040 => x"20202020", -3041 => x"2025640a", -3042 => x"00000000", -3043 => x"496e745f", -3044 => x"335f4c6f", -3045 => x"633a2020", -3046 => x"20202020", -3047 => x"20202020", -3048 => x"2025640a", -3049 => x"00000000", -3050 => x"456e756d", -3051 => x"5f4c6f63", -3052 => x"3a202020", -3053 => x"20202020", -3054 => x"20202020", -3055 => x"2025640a", -3056 => x"00000000", -3057 => x"5374725f", -3058 => x"315f4c6f", -3059 => x"633a2020", -3060 => x"20202020", -3061 => x"20202020", -3062 => x"2025730a", -3063 => x"00000000", -3064 => x"20202020", -3065 => x"20202020", -3066 => x"73686f75", -3067 => x"6c642062", -3068 => x"653a2020", -3069 => x"20444852", -3070 => x"5953544f", -3071 => x"4e452050", -3072 => x"524f4752", -3073 => x"414d2c20", -3074 => x"31275354", -3075 => x"20535452", -3076 => x"494e470a", -3077 => x"00000000", -3078 => x"5374725f", -3079 => x"325f4c6f", -3080 => x"633a2020", -3081 => x"20202020", -3082 => x"20202020", -3083 => x"2025730a", -3084 => x"00000000", -3085 => x"20202020", -3086 => x"20202020", -3087 => x"73686f75", -3088 => x"6c642062", -3089 => x"653a2020", -3090 => x"20444852", -3091 => x"5953544f", -3092 => x"4e452050", -3093 => x"524f4752", -3094 => x"414d2c20", -3095 => x"32274e44", -3096 => x"20535452", -3097 => x"494e470a", -3098 => x"00000000", -3099 => x"55736572", -3100 => x"2074696d", -3101 => x"653a2025", -3102 => x"640a0000", -3103 => x"4d696372", -3104 => x"6f736563", -3105 => x"6f6e6473", -3106 => x"20666f72", -3107 => x"206f6e65", -3108 => x"2072756e", -3109 => x"20746872", -3110 => x"6f756768", -3111 => x"20446872", -3112 => x"7973746f", -3113 => x"6e653a20", -3114 => x"00000000", -3115 => x"2564200a", -3116 => x"00000000", -3117 => x"44687279", -3118 => x"73746f6e", -3119 => x"65732070", -3120 => x"65722053", -3121 => x"65636f6e", -3122 => x"643a2020", -3123 => x"20202020", -3124 => x"20202020", -3125 => x"20202020", -3126 => x"20202020", -3127 => x"20202020", -3128 => x"00000000", -3129 => x"56415820", -3130 => x"4d495053", -3131 => x"20726174", -3132 => x"696e6720", -3133 => x"2a203130", -3134 => x"3030203d", -3135 => x"20256420", -3136 => x"0a000000", -3137 => x"50726f67", -3138 => x"72616d20", -3139 => x"636f6d70", -3140 => x"696c6564", -3141 => x"20776974", -3142 => x"686f7574", -3143 => x"20277265", -3144 => x"67697374", -3145 => x"65722720", -3146 => x"61747472", -3147 => x"69627574", -3148 => x"650a0000", -3149 => x"4d656173", -3150 => x"75726564", -3151 => x"2074696d", -3152 => x"6520746f", -3153 => x"6f20736d", -3154 => x"616c6c20", -3155 => x"746f206f", -3156 => x"62746169", -3157 => x"6e206d65", -3158 => x"616e696e", -3159 => x"6766756c", -3160 => x"20726573", -3161 => x"756c7473", -3162 => x"0a000000", -3163 => x"506c6561", -3164 => x"73652069", -3165 => x"6e637265", -3166 => x"61736520", -3167 => x"6e756d62", -3168 => x"6572206f", -3169 => x"66207275", -3170 => x"6e730a00", -3171 => x"44485259", -3172 => x"53544f4e", -3173 => x"45205052", -3174 => x"4f475241", -3175 => x"4d2c2033", -3176 => x"27524420", -3177 => x"53545249", -3178 => x"4e470000", -3179 => x"43000000", -3180 => x"64756d6d", -3181 => x"792e6578", -3182 => x"65000000", -3183 => x"00010202", -3184 => x"03030303", -3185 => x"04040404", -3186 => x"04040404", -3187 => x"05050505", -3188 => x"05050505", -3189 => x"05050505", -3190 => x"05050505", -3191 => x"06060606", -3192 => x"06060606", -3193 => x"06060606", -3194 => x"06060606", -3195 => x"06060606", -3196 => x"06060606", -3197 => x"06060606", -3198 => x"06060606", -3199 => x"07070707", -3200 => x"07070707", -3201 => x"07070707", -3202 => x"07070707", -3203 => x"07070707", -3204 => x"07070707", -3205 => x"07070707", -3206 => x"07070707", -3207 => x"07070707", -3208 => x"07070707", -3209 => x"07070707", -3210 => x"07070707", -3211 => x"07070707", -3212 => x"07070707", -3213 => x"07070707", -3214 => x"07070707", -3215 => x"08080808", -3216 => x"08080808", -3217 => x"08080808", -3218 => x"08080808", -3219 => x"08080808", -3220 => x"08080808", -3221 => x"08080808", -3222 => x"08080808", -3223 => x"08080808", -3224 => x"08080808", -3225 => x"08080808", -3226 => x"08080808", -3227 => x"08080808", -3228 => x"08080808", -3229 => x"08080808", -3230 => x"08080808", -3231 => x"08080808", -3232 => x"08080808", -3233 => x"08080808", -3234 => x"08080808", -3235 => x"08080808", -3236 => x"08080808", -3237 => x"08080808", -3238 => x"08080808", -3239 => x"08080808", -3240 => x"08080808", -3241 => x"08080808", -3242 => x"08080808", -3243 => x"08080808", -3244 => x"08080808", -3245 => x"08080808", -3246 => x"08080808", -3247 => x"00ffffff", -3248 => x"ff00ffff", -3249 => x"ffff00ff", -3250 => x"ffffff00", -3251 => x"00000000", -3252 => x"00000000", -3253 => x"00000000", -3254 => x"00003ab8", -3255 => x"000186a0", -- iterations -3256 => x"00000000", -3257 => x"00000000", -3258 => x"00000000", -3259 => x"00000000", -3260 => x"00000000", -3261 => x"00000000", -3262 => x"00000000", -3263 => x"00000000", -3264 => x"00000000", -3265 => x"00000000", -3266 => x"00000000", -3267 => x"00000000", -3268 => x"00000000", -3269 => x"ffffffff", -3270 => x"00000000", -3271 => x"00020000", -3272 => x"00000000", -3273 => x"00000000", -3274 => x"00003320", -3275 => x"00003320", -3276 => x"00003328", -3277 => x"00003328", -3278 => x"00003330", -3279 => x"00003330", -3280 => x"00003338", -3281 => x"00003338", -3282 => x"00003340", -3283 => x"00003340", -3284 => x"00003348", -3285 => x"00003348", -3286 => x"00003350", -3287 => x"00003350", -3288 => x"00003358", -3289 => x"00003358", -3290 => x"00003360", -3291 => x"00003360", -3292 => x"00003368", -3293 => x"00003368", -3294 => x"00003370", -3295 => x"00003370", -3296 => x"00003378", -3297 => x"00003378", -3298 => x"00003380", -3299 => x"00003380", -3300 => x"00003388", -3301 => x"00003388", -3302 => x"00003390", -3303 => x"00003390", -3304 => x"00003398", -3305 => x"00003398", -3306 => x"000033a0", -3307 => x"000033a0", -3308 => x"000033a8", -3309 => x"000033a8", -3310 => x"000033b0", -3311 => x"000033b0", -3312 => x"000033b8", -3313 => x"000033b8", -3314 => x"000033c0", -3315 => x"000033c0", -3316 => x"000033c8", -3317 => x"000033c8", -3318 => x"000033d0", -3319 => x"000033d0", -3320 => x"000033d8", -3321 => x"000033d8", -3322 => x"000033e0", -3323 => x"000033e0", -3324 => x"000033e8", -3325 => x"000033e8", -3326 => x"000033f0", -3327 => x"000033f0", -3328 => x"000033f8", -3329 => x"000033f8", -3330 => x"00003400", -3331 => x"00003400", -3332 => x"00003408", -3333 => x"00003408", -3334 => x"00003410", -3335 => x"00003410", -3336 => x"00003418", -3337 => x"00003418", -3338 => x"00003420", -3339 => x"00003420", -3340 => x"00003428", -3341 => x"00003428", -3342 => x"00003430", -3343 => x"00003430", -3344 => x"00003438", -3345 => x"00003438", -3346 => x"00003440", -3347 => x"00003440", -3348 => x"00003448", -3349 => x"00003448", -3350 => x"00003450", -3351 => x"00003450", -3352 => x"00003458", -3353 => x"00003458", -3354 => x"00003460", -3355 => x"00003460", -3356 => x"00003468", -3357 => x"00003468", -3358 => x"00003470", -3359 => x"00003470", -3360 => x"00003478", -3361 => x"00003478", -3362 => x"00003480", -3363 => x"00003480", -3364 => x"00003488", -3365 => x"00003488", -3366 => x"00003490", -3367 => x"00003490", -3368 => x"00003498", -3369 => x"00003498", -3370 => x"000034a0", -3371 => x"000034a0", -3372 => x"000034a8", -3373 => x"000034a8", -3374 => x"000034b0", -3375 => x"000034b0", -3376 => x"000034b8", -3377 => x"000034b8", -3378 => x"000034c0", -3379 => x"000034c0", -3380 => x"000034c8", -3381 => x"000034c8", -3382 => x"000034d0", -3383 => x"000034d0", -3384 => x"000034d8", -3385 => x"000034d8", -3386 => x"000034e0", -3387 => x"000034e0", -3388 => x"000034e8", -3389 => x"000034e8", -3390 => x"000034f0", -3391 => x"000034f0", -3392 => x"000034f8", -3393 => x"000034f8", -3394 => x"00003500", -3395 => x"00003500", -3396 => x"00003508", -3397 => x"00003508", -3398 => x"00003510", -3399 => x"00003510", -3400 => x"00003518", -3401 => x"00003518", -3402 => x"00003520", -3403 => x"00003520", -3404 => x"00003528", -3405 => x"00003528", -3406 => x"00003530", -3407 => x"00003530", -3408 => x"00003538", -3409 => x"00003538", -3410 => x"00003540", -3411 => x"00003540", -3412 => x"00003548", -3413 => x"00003548", -3414 => x"00003550", -3415 => x"00003550", -3416 => x"00003558", -3417 => x"00003558", -3418 => x"00003560", -3419 => x"00003560", -3420 => x"00003568", -3421 => x"00003568", -3422 => x"00003570", -3423 => x"00003570", -3424 => x"00003578", -3425 => x"00003578", -3426 => x"00003580", -3427 => x"00003580", -3428 => x"00003588", -3429 => x"00003588", -3430 => x"00003590", -3431 => x"00003590", -3432 => x"00003598", -3433 => x"00003598", -3434 => x"000035a0", -3435 => x"000035a0", -3436 => x"000035a8", -3437 => x"000035a8", -3438 => x"000035b0", -3439 => x"000035b0", -3440 => x"000035b8", -3441 => x"000035b8", -3442 => x"000035c0", -3443 => x"000035c0", -3444 => x"000035c8", -3445 => x"000035c8", -3446 => x"000035d0", -3447 => x"000035d0", -3448 => x"000035d8", -3449 => x"000035d8", -3450 => x"000035e0", -3451 => x"000035e0", -3452 => x"000035e8", -3453 => x"000035e8", -3454 => x"000035f0", -3455 => x"000035f0", -3456 => x"000035f8", -3457 => x"000035f8", -3458 => x"00003600", -3459 => x"00003600", -3460 => x"00003608", -3461 => x"00003608", -3462 => x"00003610", -3463 => x"00003610", -3464 => x"00003618", -3465 => x"00003618", -3466 => x"00003620", -3467 => x"00003620", -3468 => x"00003628", -3469 => x"00003628", -3470 => x"00003630", -3471 => x"00003630", -3472 => x"00003638", -3473 => x"00003638", -3474 => x"00003640", -3475 => x"00003640", -3476 => x"00003648", -3477 => x"00003648", -3478 => x"00003650", -3479 => x"00003650", -3480 => x"00003658", -3481 => x"00003658", -3482 => x"00003660", -3483 => x"00003660", -3484 => x"00003668", -3485 => x"00003668", -3486 => x"00003670", -3487 => x"00003670", -3488 => x"00003678", -3489 => x"00003678", -3490 => x"00003680", -3491 => x"00003680", -3492 => x"00003688", -3493 => x"00003688", -3494 => x"00003690", -3495 => x"00003690", -3496 => x"00003698", -3497 => x"00003698", -3498 => x"000036a0", -3499 => x"000036a0", -3500 => x"000036a8", -3501 => x"000036a8", -3502 => x"000036b0", -3503 => x"000036b0", -3504 => x"000036b8", -3505 => x"000036b8", -3506 => x"000036c0", -3507 => x"000036c0", -3508 => x"000036c8", -3509 => x"000036c8", -3510 => x"000036d0", -3511 => x"000036d0", -3512 => x"000036d8", -3513 => x"000036d8", -3514 => x"000036e0", -3515 => x"000036e0", -3516 => x"000036e8", -3517 => x"000036e8", -3518 => x"000036f0", -3519 => x"000036f0", -3520 => x"000036f8", -3521 => x"000036f8", -3522 => x"00003700", -3523 => x"00003700", -3524 => x"00003708", -3525 => x"00003708", -3526 => x"00003710", -3527 => x"00003710", -3528 => x"00003718", -3529 => x"00003718", -3530 => x"0000372c", -3531 => x"00000000", -3532 => x"00003994", -3533 => x"000039f0", -3534 => x"00003a4c", -3535 => x"00000000", -3536 => x"00000000", -3537 => x"00000000", -3538 => x"00000000", -3539 => x"00000000", -3540 => x"00000000", -3541 => x"00000000", -3542 => x"00000000", -3543 => x"00000000", -3544 => x"000031ac", -3545 => x"00000000", -3546 => x"00000000", -3547 => x"00000000", -3548 => x"00000000", -3549 => x"00000000", -3550 => x"00000000", -3551 => x"00000000", -3552 => x"00000000", -3553 => x"00000000", -3554 => x"00000000", -3555 => x"00000000", -3556 => x"00000000", -3557 => x"00000000", -3558 => x"00000000", -3559 => x"00000000", -3560 => x"00000000", -3561 => x"00000000", -3562 => x"00000000", -3563 => x"00000000", -3564 => x"00000000", -3565 => x"00000000", -3566 => x"00000000", -3567 => x"00000000", -3568 => x"00000000", -3569 => x"00000000", -3570 => x"00000000", -3571 => x"00000000", -3572 => x"00000000", -3573 => x"00000001", -3574 => x"330eabcd", -3575 => x"1234e66d", -3576 => x"deec0005", -3577 => x"000b0000", -3578 => x"00000000", -3579 => x"00000000", -3580 => x"00000000", -3581 => x"00000000", -3582 => x"00000000", -3583 => x"00000000", -3584 => x"00000000", -3585 => x"00000000", -3586 => x"00000000", -3587 => x"00000000", -3588 => x"00000000", -3589 => x"00000000", -3590 => x"00000000", -3591 => x"00000000", -3592 => x"00000000", -3593 => x"00000000", -3594 => x"00000000", -3595 => x"00000000", -3596 => x"00000000", -3597 => x"00000000", -3598 => x"00000000", -3599 => x"00000000", -3600 => x"00000000", -3601 => x"00000000", -3602 => x"00000000", -3603 => x"00000000", -3604 => x"00000000", -3605 => x"00000000", -3606 => x"00000000", -3607 => x"00000000", -3608 => x"00000000", -3609 => x"00000000", -3610 => x"00000000", -3611 => x"00000000", -3612 => x"00000000", -3613 => x"00000000", -3614 => x"00000000", -3615 => x"00000000", -3616 => x"00000000", -3617 => x"00000000", -3618 => x"00000000", -3619 => x"00000000", -3620 => x"00000000", -3621 => x"00000000", -3622 => x"00000000", -3623 => x"00000000", -3624 => x"00000000", -3625 => x"00000000", -3626 => x"00000000", -3627 => x"00000000", -3628 => x"00000000", -3629 => x"00000000", -3630 => x"00000000", -3631 => x"00000000", -3632 => x"00000000", -3633 => x"00000000", -3634 => x"00000000", -3635 => x"00000000", -3636 => x"00000000", -3637 => x"00000000", -3638 => x"00000000", -3639 => x"00000000", -3640 => x"00000000", -3641 => x"00000000", -3642 => x"00000000", -3643 => x"00000000", -3644 => x"00000000", -3645 => x"00000000", -3646 => x"00000000", -3647 => x"00000000", -3648 => x"00000000", -3649 => x"00000000", -3650 => x"00000000", -3651 => x"00000000", -3652 => x"00000000", -3653 => x"00000000", -3654 => x"00000000", -3655 => x"00000000", -3656 => x"00000000", -3657 => x"00000000", -3658 => x"00000000", -3659 => x"00000000", -3660 => x"00000000", -3661 => x"00000000", -3662 => x"00000000", -3663 => x"00000000", -3664 => x"00000000", -3665 => x"00000000", -3666 => x"00000000", -3667 => x"00000000", -3668 => x"00000000", -3669 => x"00000000", -3670 => x"00000000", -3671 => x"00000000", -3672 => x"00000000", -3673 => x"00000000", -3674 => x"00000000", -3675 => x"00000000", -3676 => x"00000000", -3677 => x"00000000", -3678 => x"00000000", -3679 => x"00000000", -3680 => x"00000000", -3681 => x"00000000", -3682 => x"00000000", -3683 => x"00000000", -3684 => x"00000000", -3685 => x"00000000", -3686 => x"00000000", -3687 => x"00000000", -3688 => x"00000000", -3689 => x"00000000", -3690 => x"00000000", -3691 => x"00000000", -3692 => x"00000000", -3693 => x"00000000", -3694 => x"00000000", -3695 => x"00000000", -3696 => x"00000000", -3697 => x"00000000", -3698 => x"00000000", -3699 => x"00000000", -3700 => x"00000000", -3701 => x"00000000", -3702 => x"00000000", -3703 => x"00000000", -3704 => x"00000000", -3705 => x"00000000", -3706 => x"00000000", -3707 => x"00000000", -3708 => x"00000000", -3709 => x"00000000", -3710 => x"00000000", -3711 => x"00000000", -3712 => x"00000000", -3713 => x"00000000", -3714 => x"00000000", -3715 => x"00000000", -3716 => x"00000000", -3717 => x"00000000", -3718 => x"00000000", -3719 => x"00000000", -3720 => x"00000000", -3721 => x"00000000", -3722 => x"00000000", -3723 => x"00000000", -3724 => x"00000000", -3725 => x"00000000", -3726 => x"00000000", -3727 => x"00000000", -3728 => x"00000000", -3729 => x"00000000", -3730 => x"00000000", -3731 => x"00000000", -3732 => x"00000000", -3733 => x"00000000", -3734 => x"00000000", -3735 => x"00000000", -3736 => x"00000000", -3737 => x"00000000", -3738 => x"00000000", -3739 => x"00000000", -3740 => x"00000000", -3741 => x"00000000", -3742 => x"00000000", -3743 => x"00000000", -3744 => x"00000000", -3745 => x"00000000", -3746 => x"00000000", -3747 => x"00000000", -3748 => x"00000000", -3749 => x"00000000", -3750 => x"00000000", -3751 => x"00000000", -3752 => x"00000000", -3753 => x"00000000", -3754 => x"000031b0", -3755 => x"ffffffff", -3756 => x"00000000", -3757 => x"ffffffff", -3758 => x"00000000", - others => x"00000000" -); - -begin - -mem_busy <= '0'; - -process (clk) -begin - if (clk'event and clk = '1') then - if (mem_writeEnable = '1') then - ram(conv_integer(mem_addr)) := mem_write; - end if; - mem_read <= ram(conv_integer(mem_addr)); - end if; -end process; - - - - -end dram_arch; diff --git a/zpu/hdl/zpu4/src/bram_dmips.vhd b/zpu/hdl/zpu4/src/bram_dmips.vhd deleted file mode 100644 index 1d62d21..0000000 --- a/zpu/hdl/zpu4/src/bram_dmips.vhd +++ /dev/null @@ -1,3717 +0,0 @@ -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; - - -library work; -use work.zpu_config.all; -use work.zpupkg.all; - -entity dualport_ram is -port (clk : in std_logic; - memAWriteEnable : in std_logic; - memAAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit); - memAWrite : in std_logic_vector(wordSize-1 downto 0); - memARead : out std_logic_vector(wordSize-1 downto 0); - memBWriteEnable : in std_logic; - memBAddr : in std_logic_vector(maxAddrBitBRAM downto minAddrBit); - memBWrite : in std_logic_vector(wordSize-1 downto 0); - memBRead : out std_logic_vector(wordSize-1 downto 0)); -end dualport_ram; - -architecture dualport_ram_arch of dualport_ram is - - -type ram_type is array(natural range 0 to ((2**(maxAddrBitBRAM+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); - -shared variable ram : ram_type := -( -0 => x"0b0b0b0b", -1 => x"80700b0b", -2 => x"80e2a40c", -3 => x"3a0b0b80", -4 => x"c6fc0400", -5 => x"00000000", -6 => x"00000000", -7 => x"00000000", -8 => x"80088408", -9 => x"88080b0b", -10 => x"80c7c32d", -11 => x"880c840c", -12 => x"800c0400", -13 => x"00000000", -14 => x"00000000", -15 => x"00000000", -16 => x"71fd0608", -17 => x"72830609", -18 => x"81058205", -19 => x"832b2a83", -20 => x"ffff0652", -21 => x"04000000", -22 => x"00000000", -23 => x"00000000", -24 => x"71fd0608", -25 => x"83ffff73", -26 => x"83060981", -27 => x"05820583", -28 => x"2b2b0906", -29 => x"7383ffff", -30 => x"0b0b0b0b", -31 => x"83a70400", -32 => x"72098105", -33 => x"72057373", -34 => x"09060906", -35 => x"73097306", -36 => x"070a8106", -37 => x"53510400", -38 => x"00000000", -39 => x"00000000", -40 => x"72722473", -41 => x"732e0753", -42 => x"51040000", -43 => x"00000000", -44 => x"00000000", -45 => x"00000000", -46 => x"00000000", -47 => x"00000000", -48 => x"71737109", -49 => x"71068106", -50 => x"30720a10", -51 => x"0a720a10", -52 => x"0a31050a", -53 => x"81065151", -54 => x"53510400", -55 => x"00000000", -56 => x"72722673", -57 => x"732e0753", -58 => x"51040000", -59 => x"00000000", -60 => x"00000000", -61 => x"00000000", -62 => x"00000000", -63 => x"00000000", -64 => x"00000000", -65 => x"00000000", -66 => x"00000000", -67 => x"00000000", -68 => x"00000000", -69 => x"00000000", -70 => x"00000000", -71 => x"00000000", -72 => x"0b0b0b88", -73 => x"c4040000", -74 => x"00000000", -75 => x"00000000", -76 => x"00000000", -77 => x"00000000", -78 => x"00000000", -79 => x"00000000", -80 => x"720a722b", -81 => x"0a535104", -82 => x"00000000", -83 => x"00000000", -84 => x"00000000", -85 => x"00000000", -86 => x"00000000", -87 => x"00000000", -88 => x"72729f06", -89 => x"0981050b", -90 => x"0b0b88a7", -91 => x"05040000", -92 => x"00000000", -93 => x"00000000", -94 => x"00000000", -95 => x"00000000", -96 => x"72722aff", -97 => x"739f062a", -98 => x"0974090a", -99 => x"8106ff05", -100 => x"06075351", -101 => x"04000000", -102 => x"00000000", -103 => x"00000000", -104 => x"71715351", -105 => x"020d0406", -106 => x"73830609", -107 => x"81058205", -108 => x"832b0b2b", -109 => x"0772fc06", -110 => x"0c515104", -111 => x"00000000", -112 => x"72098105", -113 => x"72050970", -114 => x"81050906", -115 => x"0a810653", -116 => x"51040000", -117 => x"00000000", -118 => x"00000000", -119 => x"00000000", -120 => x"72098105", -121 => x"72050970", -122 => x"81050906", -123 => x"0a098106", -124 => x"53510400", -125 => x"00000000", -126 => x"00000000", -127 => x"00000000", -128 => x"71098105", -129 => x"52040000", -130 => x"00000000", -131 => x"00000000", -132 => x"00000000", -133 => x"00000000", -134 => x"00000000", -135 => x"00000000", -136 => x"72720981", -137 => x"05055351", -138 => x"04000000", -139 => x"00000000", -140 => x"00000000", -141 => x"00000000", -142 => x"00000000", -143 => x"00000000", -144 => x"72097206", -145 => x"73730906", -146 => x"07535104", -147 => x"00000000", -148 => x"00000000", -149 => x"00000000", -150 => x"00000000", -151 => x"00000000", -152 => x"71fc0608", -153 => x"72830609", -154 => x"81058305", -155 => x"1010102a", -156 => x"81ff0652", -157 => x"04000000", -158 => x"00000000", -159 => x"00000000", -160 => x"71fc0608", -161 => x"0b0b80e2", -162 => x"90738306", -163 => x"10100508", -164 => x"060b0b0b", -165 => x"88aa0400", -166 => x"00000000", -167 => x"00000000", -168 => x"80088408", -169 => x"88087575", -170 => x"0b0b0baf", -171 => x"ac2d5050", -172 => x"80085688", -173 => x"0c840c80", -174 => x"0c510400", -175 => x"00000000", -176 => x"80088408", -177 => x"88087575", -178 => x"0b0b0baf", -179 => x"f02d5050", -180 => x"80085688", -181 => x"0c840c80", -182 => x"0c510400", -183 => x"00000000", -184 => x"72097081", -185 => x"0509060a", -186 => x"8106ff05", -187 => x"70547106", -188 => x"73097274", -189 => x"05ff0506", -190 => x"07515151", -191 => x"04000000", -192 => x"72097081", -193 => x"0509060a", -194 => x"098106ff", -195 => x"05705471", -196 => x"06730972", -197 => x"7405ff05", -198 => x"06075151", -199 => x"51040000", -200 => x"05ff0504", -201 => x"00000000", -202 => x"00000000", -203 => x"00000000", -204 => x"00000000", -205 => x"00000000", -206 => x"00000000", -207 => x"00000000", -208 => x"810b0b0b", -209 => x"80e2a00c", -210 => x"51040000", -211 => x"00000000", -212 => x"00000000", -213 => x"00000000", -214 => x"00000000", -215 => x"00000000", -216 => x"71810552", -217 => x"04000000", -218 => x"00000000", -219 => x"00000000", -220 => x"00000000", -221 => x"00000000", -222 => x"00000000", -223 => x"00000000", -224 => x"00000000", -225 => x"00000000", -226 => x"00000000", -227 => x"00000000", -228 => x"00000000", -229 => x"00000000", -230 => x"00000000", -231 => x"00000000", -232 => x"02840572", -233 => x"10100552", -234 => x"04000000", -235 => x"00000000", -236 => x"00000000", -237 => x"00000000", -238 => x"00000000", -239 => x"00000000", -240 => x"00000000", -241 => x"00000000", -242 => x"00000000", -243 => x"00000000", -244 => x"00000000", -245 => x"00000000", -246 => x"00000000", -247 => x"00000000", -248 => x"717105ff", -249 => x"05715351", -250 => x"020d0400", -251 => x"00000000", -252 => x"00000000", -253 => x"00000000", -254 => x"00000000", -255 => x"00000000", -256 => x"83d93f80", -257 => x"cbcf3f04", -258 => x"10101010", -259 => x"10101010", -260 => x"10101010", -261 => x"10101010", -262 => x"10101010", -263 => x"10101010", -264 => x"10101010", -265 => x"10101053", -266 => x"51047381", -267 => x"ff067383", -268 => x"06098105", -269 => x"83051010", -270 => x"102b0772", -271 => x"fc060c51", -272 => x"51043c04", -273 => x"72728072", -274 => x"8106ff05", -275 => x"09720605", -276 => x"71105272", -277 => x"0a100a53", -278 => x"72ed3851", -279 => x"51535104", -280 => x"ff3d0d0b", -281 => x"0b80f294", -282 => x"08528412", -283 => x"08708106", -284 => x"515170f6", -285 => x"38710881", -286 => x"ff06800c", -287 => x"833d0d04", -288 => x"ff3d0d0b", -289 => x"0b80f294", -290 => x"08528412", -291 => x"08700a10", -292 => x"0a708106", -293 => x"51515170", -294 => x"f1387372", -295 => x"0c833d0d", -296 => x"0480e2a0", -297 => x"08802ea8", -298 => x"38838080", -299 => x"0b0b0b80", -300 => x"f2940c82", -301 => x"a0800b0b", -302 => x"0b80f298", -303 => x"0c829080", -304 => x"0b80f2a8", -305 => x"0c0b0b80", -306 => x"f29c0b80", -307 => x"f2ac0c04", -308 => x"f8808080", -309 => x"a40b0b0b", -310 => x"80f2940c", -311 => x"f8808082", -312 => x"800b0b0b", -313 => x"80f2980c", -314 => x"f8808084", -315 => x"800b80f2", -316 => x"a80cf880", -317 => x"8080940b", -318 => x"80f2ac0c", -319 => x"f8808080", -320 => x"9c0b80f2", -321 => x"a40cf880", -322 => x"8080a00b", -323 => x"80f2b00c", -324 => x"04f23d0d", -325 => x"600b0b80", -326 => x"f2980856", -327 => x"5d82750c", -328 => x"8059805a", -329 => x"800b8f3d", -330 => x"71101017", -331 => x"70085957", -332 => x"5d5b8076", -333 => x"81ff067c", -334 => x"832b5658", -335 => x"5276537b", -336 => x"519af33f", -337 => x"7d7f7a72", -338 => x"077c7207", -339 => x"71716081", -340 => x"05415f5d", -341 => x"5b595755", -342 => x"7a8724bb", -343 => x"380b0b80", -344 => x"f298087b", -345 => x"10101170", -346 => x"08585155", -347 => x"807681ff", -348 => x"067c832b", -349 => x"56585276", -350 => x"537b519a", -351 => x"b93f7d7f", -352 => x"7a72077c", -353 => x"72077171", -354 => x"60810541", -355 => x"5f5d5b59", -356 => x"5755877b", -357 => x"25c73876", -358 => x"7d0c7784", -359 => x"1e0c7c80", -360 => x"0c903d0d", -361 => x"04ff3d0d", -362 => x"80f2a033", -363 => x"5170a738", -364 => x"80e2ac08", -365 => x"70085252", -366 => x"70802e94", -367 => x"38841280", -368 => x"e2ac0c70", -369 => x"2d80e2ac", -370 => x"08700852", -371 => x"5270ee38", -372 => x"810b80f2", -373 => x"a034833d", -374 => x"0d040480", -375 => x"3d0d0b0b", -376 => x"80f29008", -377 => x"802e8e38", -378 => x"0b0b0b0b", -379 => x"800b802e", -380 => x"09810685", -381 => x"38823d0d", -382 => x"040b0b80", -383 => x"f290510b", -384 => x"0b0bf3fc", -385 => x"3f823d0d", -386 => x"0404ff3d", -387 => x"0d028f05", -388 => x"3352718a", -389 => x"2e8a3871", -390 => x"51fce53f", -391 => x"833d0d04", -392 => x"8d51fcdc", -393 => x"3f7151fc", -394 => x"d73f833d", -395 => x"0d04ce3d", -396 => x"0db53d70", -397 => x"70840552", -398 => x"088c8a5c", -399 => x"56a53d5e", -400 => x"5c807570", -401 => x"81055733", -402 => x"765b5558", -403 => x"73782e80", -404 => x"c1388e3d", -405 => x"5b73a52e", -406 => x"09810680", -407 => x"c5387870", -408 => x"81055a33", -409 => x"547380e4", -410 => x"2e81b638", -411 => x"7380e424", -412 => x"80c63873", -413 => x"80e32ea1", -414 => x"388052a5", -415 => x"51792d80", -416 => x"52735179", -417 => x"2d821858", -418 => x"78708105", -419 => x"5a335473", -420 => x"c4387780", -421 => x"0cb43d0d", -422 => x"047b841d", -423 => x"83123356", -424 => x"5d578052", -425 => x"7351792d", -426 => x"81187970", -427 => x"81055b33", -428 => x"555873ff", -429 => x"a038db39", -430 => x"7380f32e", -431 => x"098106ff", -432 => x"b8387b84", -433 => x"1d710859", -434 => x"5d568077", -435 => x"33555673", -436 => x"762e8d38", -437 => x"81167018", -438 => x"70335755", -439 => x"5674f538", -440 => x"ff165580", -441 => x"7625ffa0", -442 => x"38767081", -443 => x"05583354", -444 => x"80527351", -445 => x"792d8118", -446 => x"75ff1757", -447 => x"57588076", -448 => x"25ff8538", -449 => x"76708105", -450 => x"58335480", -451 => x"52735179", -452 => x"2d811875", -453 => x"ff175757", -454 => x"58758024", -455 => x"cc38fee8", -456 => x"397b841d", -457 => x"71087071", -458 => x"9f2c5953", -459 => x"595d5680", -460 => x"75248195", -461 => x"38757d7c", -462 => x"58565480", -463 => x"5773772e", -464 => x"098106b6", -465 => x"38b07b34", -466 => x"02b50556", -467 => x"7a762e97", -468 => x"38ff1656", -469 => x"75337570", -470 => x"81055734", -471 => x"8117577a", -472 => x"762e0981", -473 => x"06eb3880", -474 => x"7534767d", -475 => x"ff125758", -476 => x"56758024", -477 => x"fef338fe", -478 => x"8f398a52", -479 => x"7351a0f0", -480 => x"3f80080b", -481 => x"0b80d484", -482 => x"05337670", -483 => x"81055834", -484 => x"8a527351", -485 => x"a0963f80", -486 => x"08548008", -487 => x"802effac", -488 => x"388a5273", -489 => x"51a0c93f", -490 => x"80080b0b", -491 => x"80d48405", -492 => x"33767081", -493 => x"0558348a", -494 => x"5273519f", -495 => x"ef3f8008", -496 => x"548008ff", -497 => x"b538ff84", -498 => x"39745276", -499 => x"53b43dff", -500 => x"b8055195", -501 => x"b63fa33d", -502 => x"0856fed9", -503 => x"39803d0d", -504 => x"80c10b81", -505 => x"c0f43480", -506 => x"0b81c2d0", -507 => x"0c70800c", -508 => x"823d0d04", -509 => x"ff3d0d80", -510 => x"0b81c0f4", -511 => x"33525270", -512 => x"80c12e99", -513 => x"387181c2", -514 => x"d0080781", -515 => x"c2d00c80", -516 => x"c20b81c0", -517 => x"f8347080", -518 => x"0c833d0d", -519 => x"04810b81", -520 => x"c2d00807", -521 => x"81c2d00c", -522 => x"80c20b81", -523 => x"c0f83470", -524 => x"800c833d", -525 => x"0d04fd3d", -526 => x"0d757008", -527 => x"8a055353", -528 => x"81c0f433", -529 => x"517080c1", -530 => x"2e8b3873", -531 => x"f3387080", -532 => x"0c853d0d", -533 => x"04ff1270", -534 => x"81c0f008", -535 => x"31740c80", -536 => x"0c853d0d", -537 => x"04fc3d0d", -538 => x"81c0fc08", -539 => x"5574802e", -540 => x"8c387675", -541 => x"08710c81", -542 => x"c0fc0856", -543 => x"548c1553", -544 => x"81c0f008", -545 => x"528a5190", -546 => x"f03f7380", -547 => x"0c863d0d", -548 => x"04fb3d0d", -549 => x"77700856", -550 => x"56b05381", -551 => x"c0fc0852", -552 => x"7451acb4", -553 => x"3f850b8c", -554 => x"170c850b", -555 => x"8c160c75", -556 => x"08750c81", -557 => x"c0fc0854", -558 => x"73802e8a", -559 => x"38730875", -560 => x"0c81c0fc", -561 => x"08548c14", -562 => x"5381c0f0", -563 => x"08528a51", -564 => x"90a73f84", -565 => x"1508ad38", -566 => x"860b8c16", -567 => x"0c881552", -568 => x"88160851", -569 => x"8fb33f81", -570 => x"c0fc0870", -571 => x"08760c54", -572 => x"8c157054", -573 => x"548a5273", -574 => x"08518ffd", -575 => x"3f73800c", -576 => x"873d0d04", -577 => x"750854b0", -578 => x"53735275", -579 => x"51abc93f", -580 => x"73800c87", -581 => x"3d0d04d9", -582 => x"3d0db051", -583 => x"9eeb3f80", -584 => x"0881c0ec", -585 => x"0cb0519e", -586 => x"e03f8008", -587 => x"81c0fc0c", -588 => x"81c0ec08", -589 => x"80080c80", -590 => x"0b800884", -591 => x"050c820b", -592 => x"80088805", -593 => x"0ca80b80", -594 => x"088c050c", -595 => x"9f530b0b", -596 => x"80d49052", -597 => x"80089005", -598 => x"51aafd3f", -599 => x"a13d5e9f", -600 => x"530b0b80", -601 => x"d4b0527d", -602 => x"51aaed3f", -603 => x"8a0b80ff", -604 => x"b00c0b0b", -605 => x"80ded451", -606 => x"f9b43f0b", -607 => x"0b80d4d0", -608 => x"51f9ab3f", -609 => x"0b0b80de", -610 => x"d451f9a2", -611 => x"3f80e2b4", -612 => x"08802e8a", -613 => x"cf380b0b", -614 => x"80d58051", -615 => x"f9903f0b", -616 => x"0b80ded4", -617 => x"51f9873f", -618 => x"80e2b008", -619 => x"520b0b80", -620 => x"d5ac51f8", -621 => x"f93f80f2", -622 => x"cc51bbf8", -623 => x"3f810b9a", -624 => x"3d5e5b80", -625 => x"0b80e2b0", -626 => x"082582d6", -627 => x"38903d5f", -628 => x"80c10b81", -629 => x"c0f43481", -630 => x"0b81c2d0", -631 => x"0c80c20b", -632 => x"81c0f834", -633 => x"8240835a", -634 => x"9f530b0b", -635 => x"80d5dc52", -636 => x"7c51a9e4", -637 => x"3f814180", -638 => x"7d537e52", -639 => x"568f9e3f", -640 => x"8008762e", -641 => x"09810683", -642 => x"38815675", -643 => x"81c2d00c", -644 => x"7f705856", -645 => x"758325a2", -646 => x"38751010", -647 => x"16fd0542", -648 => x"a93dffa4", -649 => x"05538352", -650 => x"76518dcd", -651 => x"3f7f8105", -652 => x"70417058", -653 => x"56837624", -654 => x"e0386154", -655 => x"755380f2", -656 => x"d45281c1", -657 => x"88518dc1", -658 => x"3f81c0fc", -659 => x"08700858", -660 => x"58b05377", -661 => x"527651a8", -662 => x"ff3f850b", -663 => x"8c190c85", -664 => x"0b8c180c", -665 => x"7708770c", -666 => x"81c0fc08", -667 => x"5675802e", -668 => x"8a387508", -669 => x"770c81c0", -670 => x"fc08568c", -671 => x"165381c0", -672 => x"f008528a", -673 => x"518cf23f", -674 => x"84170888", -675 => x"e038860b", -676 => x"8c180c88", -677 => x"17528818", -678 => x"08518bfd", -679 => x"3f81c0fc", -680 => x"08700878", -681 => x"0c568c17", -682 => x"7054598a", -683 => x"52780851", -684 => x"8cc73f80", -685 => x"c10b81c0", -686 => x"f8335757", -687 => x"767626a2", -688 => x"3880c352", -689 => x"76518dab", -690 => x"3f800861", -691 => x"2e8aec38", -692 => x"81177081", -693 => x"ff0681c0", -694 => x"f8335858", -695 => x"58757727", -696 => x"e0387960", -697 => x"29627054", -698 => x"71535b59", -699 => x"99be3f80", -700 => x"0840787a", -701 => x"31708729", -702 => x"80083180", -703 => x"088a0581", -704 => x"c0f43381", -705 => x"c0f0085e", -706 => x"5b525a56", -707 => x"7780c12e", -708 => x"8ad8387b", -709 => x"f738811b", -710 => x"5b80e2b0", -711 => x"087b25fd", -712 => x"af3881c0", -713 => x"e451b98c", -714 => x"3f0b0b80", -715 => x"d5fc51f5", -716 => x"fd3f0b0b", -717 => x"80ded451", -718 => x"f5f43f0b", -719 => x"0b80d68c", -720 => x"51f5eb3f", -721 => x"0b0b80de", -722 => x"d451f5e2", -723 => x"3f81c0f0", -724 => x"08520b0b", -725 => x"80d6c451", -726 => x"f5d43f85", -727 => x"520b0b80", -728 => x"d6e051f5", -729 => x"c93f81c2", -730 => x"d008520b", -731 => x"0b80d6fc", -732 => x"51f5bb3f", -733 => x"81520b0b", -734 => x"80d6e051", -735 => x"f5b03f81", -736 => x"c0f43352", -737 => x"0b0b80d7", -738 => x"9851f5a2", -739 => x"3f80c152", -740 => x"0b0b80d7", -741 => x"b451f596", -742 => x"3f81c0f8", -743 => x"33520b0b", -744 => x"80d7d051", -745 => x"f5883f80", -746 => x"c2520b0b", -747 => x"80d7b451", -748 => x"f4fc3f81", -749 => x"c1a80852", -750 => x"0b0b80d7", -751 => x"ec51f4ee", -752 => x"3f87520b", -753 => x"0b80d6e0", -754 => x"51f4e33f", -755 => x"80ffb008", -756 => x"520b0b80", -757 => x"d88851f4", -758 => x"d53f0b0b", -759 => x"80d8a451", -760 => x"f4cc3f0b", -761 => x"0b80d8d0", -762 => x"51f4c33f", -763 => x"81c0fc08", -764 => x"7008535a", -765 => x"0b0b80d8", -766 => x"dc51f4b2", -767 => x"3f0b0b80", -768 => x"d8f851f4", -769 => x"a93f81c0", -770 => x"fc088411", -771 => x"0853560b", -772 => x"0b80d9ac", -773 => x"51f4973f", -774 => x"80520b0b", -775 => x"80d6e051", -776 => x"f48c3f81", -777 => x"c0fc0888", -778 => x"11085358", -779 => x"0b0b80d9", -780 => x"c851f3fa", -781 => x"3f82520b", -782 => x"0b80d6e0", -783 => x"51f3ef3f", -784 => x"81c0fc08", -785 => x"8c110853", -786 => x"570b0b80", -787 => x"d9e451f3", -788 => x"dd3f9152", -789 => x"0b0b80d6", -790 => x"e051f3d2", -791 => x"3f81c0fc", -792 => x"08900552", -793 => x"0b0b80da", -794 => x"8051f3c2", -795 => x"3f0b0b80", -796 => x"da9c51f3", -797 => x"b93f0b0b", -798 => x"80dad451", -799 => x"f3b03f81", -800 => x"c0ec0870", -801 => x"08535f0b", -802 => x"0b80d8dc", -803 => x"51f39f3f", -804 => x"0b0b80da", -805 => x"e851f396", -806 => x"3f81c0ec", -807 => x"08841108", -808 => x"535b0b0b", -809 => x"80d9ac51", -810 => x"f3843f80", -811 => x"520b0b80", -812 => x"d6e051f2", -813 => x"f93f81c0", -814 => x"ec088811", -815 => x"08535c0b", -816 => x"0b80d9c8", -817 => x"51f2e73f", -818 => x"81520b0b", -819 => x"80d6e051", -820 => x"f2dc3f81", -821 => x"c0ec088c", -822 => x"1108535a", -823 => x"0b0b80d9", -824 => x"e451f2ca", -825 => x"3f92520b", -826 => x"0b80d6e0", -827 => x"51f2bf3f", -828 => x"81c0ec08", -829 => x"9005520b", -830 => x"0b80da80", -831 => x"51f2af3f", -832 => x"0b0b80da", -833 => x"9c51f2a6", -834 => x"3f7f520b", -835 => x"0b80dba8", -836 => x"51f29b3f", -837 => x"85520b0b", -838 => x"80d6e051", -839 => x"f2903f78", -840 => x"520b0b80", -841 => x"dbc451f2", -842 => x"853f8d52", -843 => x"0b0b80d6", -844 => x"e051f1fa", -845 => x"3f61520b", -846 => x"0b80dbe0", -847 => x"51f1ef3f", -848 => x"87520b0b", -849 => x"80d6e051", -850 => x"f1e43f60", -851 => x"520b0b80", -852 => x"dbfc51f1", -853 => x"d93f8152", -854 => x"0b0b80d6", -855 => x"e051f1ce", -856 => x"3f7d520b", -857 => x"0b80dc98", -858 => x"51f1c33f", -859 => x"0b0b80dc", -860 => x"b451f1ba", -861 => x"3f7c520b", -862 => x"0b80dcec", -863 => x"51f1af3f", -864 => x"0b0b80dd", -865 => x"8851f1a6", -866 => x"3f0b0b80", -867 => x"ded451f1", -868 => x"9d3f81c0", -869 => x"e40881c0", -870 => x"e80880f2", -871 => x"cc0880f2", -872 => x"d0087271", -873 => x"31707426", -874 => x"75743170", -875 => x"723180f2", -876 => x"c40c4444", -877 => x"80f2c80c", -878 => x"80f2c808", -879 => x"560b0b80", -880 => x"ddc0555c", -881 => x"595758f0", -882 => x"e53f80f2", -883 => x"c4085680", -884 => x"762582b1", -885 => x"3880e2b0", -886 => x"0870719f", -887 => x"2c9a3d53", -888 => x"565680f2", -889 => x"c40880f2", -890 => x"c8084153", -891 => x"7f547052", -892 => x"5a8a8d3f", -893 => x"66685f80", -894 => x"f2b40c7d", -895 => x"80f2b80c", -896 => x"80e2b008", -897 => x"709f2c58", -898 => x"568058bd", -899 => x"84c07855", -900 => x"55765275", -901 => x"53795187", -902 => x"f33f953d", -903 => x"80f2c408", -904 => x"80f2c808", -905 => x"41557f56", -906 => x"67694053", -907 => x"7e547052", -908 => x"5c89cd3f", -909 => x"64665e80", -910 => x"f2bc0c7c", -911 => x"80f2c00c", -912 => x"80e2b008", -913 => x"709f2c40", -914 => x"58805783", -915 => x"dceb9480", -916 => x"7755557e", -917 => x"5277537b", -918 => x"5187b13f", -919 => x"64665d5b", -920 => x"805e8ddd", -921 => x"7e555580", -922 => x"f2c40880", -923 => x"f2c80859", -924 => x"52775379", -925 => x"5187953f", -926 => x"66684054", -927 => x"7e557a52", -928 => x"7b53a93d", -929 => x"ffa80551", -930 => x"88f63f62", -931 => x"645e81c1", -932 => x"800c7c81", -933 => x"c1840c0b", -934 => x"0b80ddd0", -935 => x"51ef8f3f", -936 => x"80f2b808", -937 => x"520b0b80", -938 => x"de8051ef", -939 => x"813f0b0b", -940 => x"80de8851", -941 => x"eef83f80", -942 => x"f2c00852", -943 => x"0b0b80de", -944 => x"8051eeea", -945 => x"3f81c184", -946 => x"08520b0b", -947 => x"80deb851", -948 => x"eedc3f0b", -949 => x"0b80ded4", -950 => x"51eed33f", -951 => x"800b800c", -952 => x"a93d0d04", -953 => x"0b0b80de", -954 => x"d851f5b0", -955 => x"39770857", -956 => x"b0537652", -957 => x"77519fe0", -958 => x"3f80c10b", -959 => x"81c0f833", -960 => x"5757f7b8", -961 => x"39758a38", -962 => x"80f2c808", -963 => x"8126fdc5", -964 => x"380b0b80", -965 => x"df8851ee", -966 => x"953f0b0b", -967 => x"80dfc051", -968 => x"ee8c3f0b", -969 => x"0b80ded4", -970 => x"51ee833f", -971 => x"80e2b008", -972 => x"70719f2c", -973 => x"9a3d5356", -974 => x"5680f2c4", -975 => x"0880f2c8", -976 => x"0841537f", -977 => x"5470525a", -978 => x"87b63f66", -979 => x"685f80f2", -980 => x"b40c7d80", -981 => x"f2b80c80", -982 => x"e2b00870", -983 => x"9f2c5856", -984 => x"8058bd84", -985 => x"c0785555", -986 => x"76527553", -987 => x"7951859c", -988 => x"3f953d80", -989 => x"f2c40880", -990 => x"f2c80841", -991 => x"557f5667", -992 => x"6940537e", -993 => x"5470525c", -994 => x"86f63f64", -995 => x"665e80f2", -996 => x"bc0c7c80", -997 => x"f2c00c80", -998 => x"e2b00870", -999 => x"9f2c4058", -1000 => x"805783dc", -1001 => x"eb948077", -1002 => x"55557e52", -1003 => x"77537b51", -1004 => x"84da3f64", -1005 => x"665d5b80", -1006 => x"5e8ddd7e", -1007 => x"555580f2", -1008 => x"c40880f2", -1009 => x"c8085952", -1010 => x"77537951", -1011 => x"84be3f66", -1012 => x"6840547e", -1013 => x"557a527b", -1014 => x"53a93dff", -1015 => x"a8055186", -1016 => x"9f3f6264", -1017 => x"5e81c180", -1018 => x"0c7c81c1", -1019 => x"840c0b0b", -1020 => x"80ddd051", -1021 => x"ecb83f80", -1022 => x"f2b80852", -1023 => x"0b0b80de", -1024 => x"8051ecaa", -1025 => x"3f0b0b80", -1026 => x"de8851ec", -1027 => x"a13f80f2", -1028 => x"c008520b", -1029 => x"0b80de80", -1030 => x"51ec933f", -1031 => x"81c18408", -1032 => x"520b0b80", -1033 => x"deb851ec", -1034 => x"853f0b0b", -1035 => x"80ded451", -1036 => x"ebfc3f80", -1037 => x"0b800ca9", -1038 => x"3d0d04a9", -1039 => x"3dffa005", -1040 => x"52805180", -1041 => x"d43f9f53", -1042 => x"0b0b80df", -1043 => x"e0527c51", -1044 => x"9d863f7a", -1045 => x"7b81c0f0", -1046 => x"0c811870", -1047 => x"81ff0681", -1048 => x"c0f83359", -1049 => x"59595af4", -1050 => x"f439ff16", -1051 => x"707b3160", -1052 => x"0c5c800b", -1053 => x"811c5c5c", -1054 => x"80e2b008", -1055 => x"7b25f2d0", -1056 => x"38f59f39", -1057 => x"ff3d0d73", -1058 => x"82327030", -1059 => x"70720780", -1060 => x"25800c52", -1061 => x"52833d0d", -1062 => x"04fe3d0d", -1063 => x"74767153", -1064 => x"54527182", -1065 => x"2e833883", -1066 => x"5171812e", -1067 => x"9a388172", -1068 => x"269f3871", -1069 => x"822eb838", -1070 => x"71842ea9", -1071 => x"3870730c", -1072 => x"70800c84", -1073 => x"3d0d0480", -1074 => x"e40b81c0", -1075 => x"f008258b", -1076 => x"3880730c", -1077 => x"70800c84", -1078 => x"3d0d0483", -1079 => x"730c7080", -1080 => x"0c843d0d", -1081 => x"0482730c", -1082 => x"70800c84", -1083 => x"3d0d0481", -1084 => x"730c7080", -1085 => x"0c843d0d", -1086 => x"04803d0d", -1087 => x"74741482", -1088 => x"05710c80", -1089 => x"0c823d0d", -1090 => x"04f73d0d", -1091 => x"7b7d7f61", -1092 => x"85127082", -1093 => x"2b751170", -1094 => x"74717084", -1095 => x"05530c5a", -1096 => x"5a5d5b76", -1097 => x"0c7980f8", -1098 => x"180c7986", -1099 => x"12525758", -1100 => x"5a5a7676", -1101 => x"24993876", -1102 => x"b329822b", -1103 => x"79115153", -1104 => x"76737084", -1105 => x"05550c81", -1106 => x"14547574", -1107 => x"25f23876", -1108 => x"81cc2919", -1109 => x"fc110881", -1110 => x"05fc120c", -1111 => x"7a197008", -1112 => x"9fa0130c", -1113 => x"5856850b", -1114 => x"81c0f00c", -1115 => x"75800c8b", -1116 => x"3d0d04fe", -1117 => x"3d0d0293", -1118 => x"05335180", -1119 => x"02840597", -1120 => x"05335452", -1121 => x"70732e88", -1122 => x"3871800c", -1123 => x"843d0d04", -1124 => x"7081c0f4", -1125 => x"34810b80", -1126 => x"0c843d0d", -1127 => x"04f83d0d", -1128 => x"7a7c5956", -1129 => x"820b8319", -1130 => x"55557416", -1131 => x"70337533", -1132 => x"5b515372", -1133 => x"792e80c6", -1134 => x"3880c10b", -1135 => x"81168116", -1136 => x"56565782", -1137 => x"7525e338", -1138 => x"ffa91770", -1139 => x"81ff0655", -1140 => x"59738226", -1141 => x"83388755", -1142 => x"81537680", -1143 => x"d22e9838", -1144 => x"77527551", -1145 => x"9bc43f80", -1146 => x"53728008", -1147 => x"25893887", -1148 => x"1581c0f0", -1149 => x"0c815372", -1150 => x"800c8a3d", -1151 => x"0d047281", -1152 => x"c0f43482", -1153 => x"7525ffa2", -1154 => x"38ffbd39", -1155 => x"ef3d0d63", -1156 => x"65675b42", -1157 => x"79436769", -1158 => x"59407741", -1159 => x"5a805d80", -1160 => x"5e617083", -1161 => x"ffff0671", -1162 => x"902a6270", -1163 => x"83ffff06", -1164 => x"71902a74", -1165 => x"72297473", -1166 => x"29757329", -1167 => x"77742973", -1168 => x"902a0572", -1169 => x"11515856", -1170 => x"535f5a57", -1171 => x"5a585558", -1172 => x"73732786", -1173 => x"38848080", -1174 => x"16567390", -1175 => x"2a165b78", -1176 => x"83ffff06", -1177 => x"74848080", -1178 => x"29055c7a", -1179 => x"7c5a5d78", -1180 => x"5e777f29", -1181 => x"61782905", -1182 => x"7d055d7c", -1183 => x"7e567a0c", -1184 => x"74841b0c", -1185 => x"79800c93", -1186 => x"3d0d04f9", -1187 => x"3d0d797b", -1188 => x"7d545872", -1189 => x"59773079", -1190 => x"70307072", -1191 => x"079f2a73", -1192 => x"71315a52", -1193 => x"59777956", -1194 => x"730c5373", -1195 => x"84130c54", -1196 => x"800c893d", -1197 => x"0d04f93d", -1198 => x"0d797b7d", -1199 => x"7f565452", -1200 => x"5472802e", -1201 => x"a0387057", -1202 => x"7158a073", -1203 => x"31528072", -1204 => x"25a13877", -1205 => x"70742b57", -1206 => x"70732a78", -1207 => x"752b0756", -1208 => x"51747653", -1209 => x"5170740c", -1210 => x"7184150c", -1211 => x"73800c89", -1212 => x"3d0d0480", -1213 => x"56777230", -1214 => x"2b557476", -1215 => x"5351e639", -1216 => x"e43d0d6e", -1217 => x"a13d08a3", -1218 => x"3d085957", -1219 => x"5f80764d", -1220 => x"774ea33d", -1221 => x"08a53d08", -1222 => x"574b754c", -1223 => x"5e7d6c24", -1224 => x"86fb3880", -1225 => x"6a24878f", -1226 => x"38696b58", -1227 => x"566b6d5d", -1228 => x"467b4775", -1229 => x"44764564", -1230 => x"6468685c", -1231 => x"5c565674", -1232 => x"81e73878", -1233 => x"762782c7", -1234 => x"387581ff", -1235 => x"26832b55", -1236 => x"83ffff76", -1237 => x"278c3890", -1238 => x"55fe800a", -1239 => x"76278338", -1240 => x"98557575", -1241 => x"2a80e080", -1242 => x"057033a0", -1243 => x"77317131", -1244 => x"57555774", -1245 => x"802e9538", -1246 => x"75752ba0", -1247 => x"76317a77", -1248 => x"2b7c722a", -1249 => x"077c782b", -1250 => x"5d5b5956", -1251 => x"75902a76", -1252 => x"83ffff06", -1253 => x"71547a53", -1254 => x"59578880", -1255 => x"3f80085b", -1256 => x"87ea3f80", -1257 => x"08800879", -1258 => x"297c902b", -1259 => x"7c902a07", -1260 => x"56565973", -1261 => x"75279438", -1262 => x"8008ff05", -1263 => x"76155559", -1264 => x"75742687", -1265 => x"38747426", -1266 => x"87b93876", -1267 => x"52737531", -1268 => x"5187c93f", -1269 => x"80085587", -1270 => x"b33f8008", -1271 => x"80087929", -1272 => x"7b83ffff", -1273 => x"0677902b", -1274 => x"07565957", -1275 => x"73782796", -1276 => x"388008ff", -1277 => x"05761555", -1278 => x"57757426", -1279 => x"89387774", -1280 => x"26777131", -1281 => x"58567890", -1282 => x"2b770758", -1283 => x"805b7a40", -1284 => x"77417f61", -1285 => x"56547d80", -1286 => x"d938737f", -1287 => x"0c747f84", -1288 => x"050c7e80", -1289 => x"0c9e3d0d", -1290 => x"0480705c", -1291 => x"58747926", -1292 => x"dd387481", -1293 => x"ff26832b", -1294 => x"577483ff", -1295 => x"ff2682a5", -1296 => x"3874772a", -1297 => x"80e08005", -1298 => x"7033a079", -1299 => x"31713159", -1300 => x"5c5d7682", -1301 => x"b3387654", -1302 => x"74792783", -1303 => x"38815479", -1304 => x"76277407", -1305 => x"59815878", -1306 => x"ffa23876", -1307 => x"58805bff", -1308 => x"9d397352", -1309 => x"74539e3d", -1310 => x"e80551fc", -1311 => x"8e3f6769", -1312 => x"567f0c74", -1313 => x"7f84050c", -1314 => x"7e800c9e", -1315 => x"3d0d0475", -1316 => x"802e81c4", -1317 => x"387581ff", -1318 => x"26832b55", -1319 => x"83ffff76", -1320 => x"278c3890", -1321 => x"55fe800a", -1322 => x"76278338", -1323 => x"98557575", -1324 => x"2a80e080", -1325 => x"057033a0", -1326 => x"77317131", -1327 => x"575e5474", -1328 => x"84913878", -1329 => x"76315481", -1330 => x"76902a77", -1331 => x"83ffff06", -1332 => x"5f5d5b7b", -1333 => x"52735185", -1334 => x"c33f8008", -1335 => x"5785ad3f", -1336 => x"80088008", -1337 => x"7e297890", -1338 => x"2b7c902a", -1339 => x"07565659", -1340 => x"73752794", -1341 => x"388008ff", -1342 => x"05761555", -1343 => x"59757426", -1344 => x"87387474", -1345 => x"2684f338", -1346 => x"7b527375", -1347 => x"3151858c", -1348 => x"3f800855", -1349 => x"84f63f80", -1350 => x"0880087e", -1351 => x"297b83ff", -1352 => x"ff067790", -1353 => x"2b075659", -1354 => x"57737827", -1355 => x"96388008", -1356 => x"ff057615", -1357 => x"55577574", -1358 => x"26893877", -1359 => x"74267771", -1360 => x"31585a78", -1361 => x"902b7707", -1362 => x"7b41417f", -1363 => x"6156547d", -1364 => x"802efdc6", -1365 => x"38fe9b39", -1366 => x"75528151", -1367 => x"84ae3f80", -1368 => x"0856feb1", -1369 => x"399057fe", -1370 => x"800a7527", -1371 => x"fdd33898", -1372 => x"75712a80", -1373 => x"e0800570", -1374 => x"33a07331", -1375 => x"7131535d", -1376 => x"5e577680", -1377 => x"2efdcf38", -1378 => x"a0773175", -1379 => x"782b7772", -1380 => x"2a077779", -1381 => x"2b7b7a2b", -1382 => x"7d742a07", -1383 => x"7d7b2b73", -1384 => x"902a7483", -1385 => x"ffff0671", -1386 => x"597f772a", -1387 => x"585e5c41", -1388 => x"5f585c54", -1389 => x"83e63f80", -1390 => x"085483d0", -1391 => x"3f800880", -1392 => x"08792975", -1393 => x"902b7e90", -1394 => x"2a075656", -1395 => x"59737527", -1396 => x"99388008", -1397 => x"ff057b15", -1398 => x"55597a74", -1399 => x"268c3873", -1400 => x"75278738", -1401 => x"ff197b15", -1402 => x"55597652", -1403 => x"73753151", -1404 => x"83aa3f80", -1405 => x"08558394", -1406 => x"3f800880", -1407 => x"0879297d", -1408 => x"83ffff06", -1409 => x"77902b07", -1410 => x"56595773", -1411 => x"78279938", -1412 => x"8008ff05", -1413 => x"7b155557", -1414 => x"7a74268c", -1415 => x"38737827", -1416 => x"8738ff17", -1417 => x"7b155557", -1418 => x"73783179", -1419 => x"902b7807", -1420 => x"7083ffff", -1421 => x"0671902a", -1422 => x"7983ffff", -1423 => x"067a902a", -1424 => x"73722973", -1425 => x"73297473", -1426 => x"29767429", -1427 => x"73902a05", -1428 => x"72055755", -1429 => x"435f5b58", -1430 => x"5a57595a", -1431 => x"747c2786", -1432 => x"38848080", -1433 => x"17577490", -1434 => x"2a177983", -1435 => x"ffff0676", -1436 => x"84808029", -1437 => x"05575776", -1438 => x"7a269a38", -1439 => x"767a3270", -1440 => x"30707207", -1441 => x"8025565a", -1442 => x"5b7c7627", -1443 => x"fafe3873", -1444 => x"802efaf8", -1445 => x"38ff1858", -1446 => x"805bfaf2", -1447 => x"39ff7653", -1448 => x"77549f3d", -1449 => x"e805525e", -1450 => x"f7e13f67", -1451 => x"69574c75", -1452 => x"4d698025", -1453 => x"f8f3387d", -1454 => x"096a6c5c", -1455 => x"537a549f", -1456 => x"3de80552", -1457 => x"5ef7c43f", -1458 => x"6769714c", -1459 => x"704d5856", -1460 => x"f8db39a0", -1461 => x"75317676", -1462 => x"2b7a772b", -1463 => x"7c732a07", -1464 => x"7c782b72", -1465 => x"902a7383", -1466 => x"ffff0671", -1467 => x"587e762a", -1468 => x"5742405d", -1469 => x"5d575881", -1470 => x"a33f8008", -1471 => x"57818d3f", -1472 => x"80088008", -1473 => x"7e297890", -1474 => x"2b7d902a", -1475 => x"07565659", -1476 => x"73752799", -1477 => x"388008ff", -1478 => x"05761555", -1479 => x"59757426", -1480 => x"8c387375", -1481 => x"278738ff", -1482 => x"19761555", -1483 => x"597b5273", -1484 => x"75315180", -1485 => x"e73f8008", -1486 => x"5580d13f", -1487 => x"80088008", -1488 => x"7e297c83", -1489 => x"ffff0670", -1490 => x"78902b07", -1491 => x"51565858", -1492 => x"73772799", -1493 => x"388008ff", -1494 => x"05761555", -1495 => x"58757426", -1496 => x"8c387377", -1497 => x"278738ff", -1498 => x"18761555", -1499 => x"5878902b", -1500 => x"78077478", -1501 => x"31555bfa", -1502 => x"da39ff19", -1503 => x"76155559", -1504 => x"fb8639ff", -1505 => x"19761555", -1506 => x"59f8c039", -1507 => x"fe3d0d80", -1508 => x"53755274", -1509 => x"5181913f", -1510 => x"843d0d04", -1511 => x"fe3d0d81", -1512 => x"53755274", -1513 => x"5181813f", -1514 => x"843d0d04", -1515 => x"fb3d0d77", -1516 => x"79555580", -1517 => x"56757524", -1518 => x"ab388074", -1519 => x"249d3880", -1520 => x"53735274", -1521 => x"5180e13f", -1522 => x"80085475", -1523 => x"802e8538", -1524 => x"80083054", -1525 => x"73800c87", -1526 => x"3d0d0473", -1527 => x"30768132", -1528 => x"5754dc39", -1529 => x"74305581", -1530 => x"56738025", -1531 => x"d238ec39", -1532 => x"fa3d0d78", -1533 => x"7a575580", -1534 => x"57767524", -1535 => x"a438759f", -1536 => x"2c548153", -1537 => x"75743274", -1538 => x"31527451", -1539 => x"9b3f8008", -1540 => x"5476802e", -1541 => x"85388008", -1542 => x"30547380", -1543 => x"0c883d0d", -1544 => x"04743055", -1545 => x"8157d739", -1546 => x"fc3d0d76", -1547 => x"78535481", -1548 => x"53807473", -1549 => x"26525572", -1550 => x"802e9838", -1551 => x"70802eab", -1552 => x"38807224", -1553 => x"a6387110", -1554 => x"73107572", -1555 => x"26535452", -1556 => x"72ea3873", -1557 => x"51788338", -1558 => x"74517080", -1559 => x"0c863d0d", -1560 => x"04720a10", -1561 => x"0a720a10", -1562 => x"0a535372", -1563 => x"802ee438", -1564 => x"717426ed", -1565 => x"38737231", -1566 => x"75740774", -1567 => x"0a100a74", -1568 => x"0a100a55", -1569 => x"555654e3", -1570 => x"39ff3d0d", -1571 => x"735280ea", -1572 => x"fc085196", -1573 => x"3f833d0d", -1574 => x"04ff3d0d", -1575 => x"735280ea", -1576 => x"fc085190", -1577 => x"cc3f833d", -1578 => x"0d04f43d", -1579 => x"0d7e608b", -1580 => x"1170f806", -1581 => x"5b55555d", -1582 => x"72962683", -1583 => x"38905880", -1584 => x"78247479", -1585 => x"26075580", -1586 => x"5474742e", -1587 => x"09810680", -1588 => x"ca387c51", -1589 => x"8d9e3f77", -1590 => x"83f72680", -1591 => x"c5387783", -1592 => x"2a701010", -1593 => x"1080e2f4", -1594 => x"058c1108", -1595 => x"58585475", -1596 => x"772e81f0", -1597 => x"38841608", -1598 => x"fc068c17", -1599 => x"08881808", -1600 => x"718c120c", -1601 => x"88120c5b", -1602 => x"76058411", -1603 => x"08810784", -1604 => x"120c537c", -1605 => x"518cde3f", -1606 => x"88165473", -1607 => x"800c8e3d", -1608 => x"0d047789", -1609 => x"2a78832a", -1610 => x"58547380", -1611 => x"2ebf3877", -1612 => x"862ab805", -1613 => x"57847427", -1614 => x"b43880db", -1615 => x"14579474", -1616 => x"27ab3877", -1617 => x"8c2a80ee", -1618 => x"055780d4", -1619 => x"74279e38", -1620 => x"778f2a80", -1621 => x"f7055782", -1622 => x"d4742791", -1623 => x"3877922a", -1624 => x"80fc0557", -1625 => x"8ad47427", -1626 => x"843880fe", -1627 => x"57761010", -1628 => x"1080e2f4", -1629 => x"058c1108", -1630 => x"56537473", -1631 => x"2ea33884", -1632 => x"1508fc06", -1633 => x"70793155", -1634 => x"56738f24", -1635 => x"88e43873", -1636 => x"802588e6", -1637 => x"388c1508", -1638 => x"5574732e", -1639 => x"098106df", -1640 => x"38811759", -1641 => x"80e38408", -1642 => x"567580e2", -1643 => x"fc2e82cc", -1644 => x"38841608", -1645 => x"fc067079", -1646 => x"31555573", -1647 => x"8f24bb38", -1648 => x"80e2fc0b", -1649 => x"80e3880c", -1650 => x"80e2fc0b", -1651 => x"80e3840c", -1652 => x"80742480", -1653 => x"db387416", -1654 => x"84110881", -1655 => x"0784120c", -1656 => x"53feb039", -1657 => x"88168c11", -1658 => x"08575975", -1659 => x"792e0981", -1660 => x"06fe8238", -1661 => x"821459ff", -1662 => x"ab397716", -1663 => x"78810784", -1664 => x"180c7080", -1665 => x"e3880c70", -1666 => x"80e3840c", -1667 => x"80e2fc0b", -1668 => x"8c120c8c", -1669 => x"11088812", -1670 => x"0c748107", -1671 => x"84120c74", -1672 => x"0574710c", -1673 => x"5b7c518a", -1674 => x"cc3f8816", -1675 => x"54fdec39", -1676 => x"83ff7527", -1677 => x"83913874", -1678 => x"892a7583", -1679 => x"2a545473", -1680 => x"802ebf38", -1681 => x"74862ab8", -1682 => x"05538474", -1683 => x"27b43880", -1684 => x"db145394", -1685 => x"7427ab38", -1686 => x"748c2a80", -1687 => x"ee055380", -1688 => x"d474279e", -1689 => x"38748f2a", -1690 => x"80f70553", -1691 => x"82d47427", -1692 => x"91387492", -1693 => x"2a80fc05", -1694 => x"538ad474", -1695 => x"27843880", -1696 => x"fe537210", -1697 => x"101080e2", -1698 => x"f4058811", -1699 => x"08555773", -1700 => x"772e868b", -1701 => x"38841408", -1702 => x"fc065b74", -1703 => x"7b278d38", -1704 => x"88140854", -1705 => x"73772e09", -1706 => x"8106ea38", -1707 => x"8c140880", -1708 => x"e2f40b84", -1709 => x"0508718c", -1710 => x"190c7588", -1711 => x"190c7788", -1712 => x"130c5c57", -1713 => x"758c150c", -1714 => x"78538079", -1715 => x"24839838", -1716 => x"72822c81", -1717 => x"712b5656", -1718 => x"747b2680", -1719 => x"ca387a75", -1720 => x"06577682", -1721 => x"a33878fc", -1722 => x"06840559", -1723 => x"7410707c", -1724 => x"06555573", -1725 => x"82923884", -1726 => x"1959f139", -1727 => x"80e2f40b", -1728 => x"84050879", -1729 => x"545b7880", -1730 => x"25c63882", -1731 => x"da397409", -1732 => x"7b067080", -1733 => x"e2f40b84", -1734 => x"050c5b74", -1735 => x"1055747b", -1736 => x"26853874", -1737 => x"85bc3880", -1738 => x"e2f40b88", -1739 => x"05087084", -1740 => x"1208fc06", -1741 => x"707b317b", -1742 => x"72268f72", -1743 => x"25075d57", -1744 => x"5c5c5578", -1745 => x"802e80d9", -1746 => x"38791580", -1747 => x"e2ec0819", -1748 => x"90115954", -1749 => x"5680e2e8", -1750 => x"08ff2e88", -1751 => x"38a08f13", -1752 => x"e0800657", -1753 => x"76527c51", -1754 => x"888c3f80", -1755 => x"08548008", -1756 => x"ff2e9038", -1757 => x"80087627", -1758 => x"82a73874", -1759 => x"80e2f42e", -1760 => x"829f3880", -1761 => x"e2f40b88", -1762 => x"05085584", -1763 => x"1508fc06", -1764 => x"70793179", -1765 => x"72268f72", -1766 => x"25075d55", -1767 => x"5a7a83f2", -1768 => x"38778107", -1769 => x"84160c77", -1770 => x"157080e2", -1771 => x"f40b8805", -1772 => x"0c748107", -1773 => x"84120c56", -1774 => x"7c5187b9", -1775 => x"3f881554", -1776 => x"73800c8e", -1777 => x"3d0d0474", -1778 => x"832a7054", -1779 => x"54807424", -1780 => x"819b3872", -1781 => x"822c8171", -1782 => x"2b80e2f8", -1783 => x"08077080", -1784 => x"e2f40b84", -1785 => x"050c7510", -1786 => x"101080e2", -1787 => x"f4058811", -1788 => x"08718c1b", -1789 => x"0c70881b", -1790 => x"0c798813", -1791 => x"0c57555c", -1792 => x"55758c15", -1793 => x"0cfdc139", -1794 => x"78791010", -1795 => x"1080e2f4", -1796 => x"0570565b", -1797 => x"5c8c1408", -1798 => x"5675742e", -1799 => x"a3388416", -1800 => x"08fc0670", -1801 => x"79315853", -1802 => x"768f2483", -1803 => x"f1387680", -1804 => x"2584af38", -1805 => x"8c160856", -1806 => x"75742e09", -1807 => x"8106df38", -1808 => x"8814811a", -1809 => x"70830655", -1810 => x"5a5472c9", -1811 => x"387b8306", -1812 => x"5675802e", -1813 => x"fdb838ff", -1814 => x"1cf81b5b", -1815 => x"5c881a08", -1816 => x"7a2eea38", -1817 => x"fdb53983", -1818 => x"1953fce4", -1819 => x"39831470", -1820 => x"822c8171", -1821 => x"2b80e2f8", -1822 => x"08077080", -1823 => x"e2f40b84", -1824 => x"050c7610", -1825 => x"101080e2", -1826 => x"f4058811", -1827 => x"08718c1c", -1828 => x"0c70881c", -1829 => x"0c7a8813", -1830 => x"0c58535d", -1831 => x"5653fee1", -1832 => x"3980e2b8", -1833 => x"08175980", -1834 => x"08762e81", -1835 => x"8b3880e2", -1836 => x"e808ff2e", -1837 => x"848e3873", -1838 => x"76311980", -1839 => x"e2b80c73", -1840 => x"87067056", -1841 => x"5372802e", -1842 => x"88388873", -1843 => x"31701555", -1844 => x"5576149f", -1845 => x"ff06a080", -1846 => x"71311670", -1847 => x"547e5351", -1848 => x"5385933f", -1849 => x"80085680", -1850 => x"08ff2e81", -1851 => x"9e3880e2", -1852 => x"b8081370", -1853 => x"80e2b80c", -1854 => x"747580e2", -1855 => x"f40b8805", -1856 => x"0c777631", -1857 => x"15810755", -1858 => x"56597a80", -1859 => x"e2f42e83", -1860 => x"c038798f", -1861 => x"2682ef38", -1862 => x"810b8415", -1863 => x"0c841508", -1864 => x"fc067079", -1865 => x"31797226", -1866 => x"8f722507", -1867 => x"5d555a7a", -1868 => x"802efced", -1869 => x"3880db39", -1870 => x"80089fff", -1871 => x"065574fe", -1872 => x"ed387880", -1873 => x"e2b80c80", -1874 => x"e2f40b88", -1875 => x"05087a18", -1876 => x"81078412", -1877 => x"0c5580e2", -1878 => x"e4087927", -1879 => x"86387880", -1880 => x"e2e40c80", -1881 => x"e2e00879", -1882 => x"27fca038", -1883 => x"7880e2e0", -1884 => x"0c841508", -1885 => x"fc067079", -1886 => x"31797226", -1887 => x"8f722507", -1888 => x"5d555a7a", -1889 => x"802efc99", -1890 => x"38883980", -1891 => x"745753fe", -1892 => x"dd397c51", -1893 => x"83df3f80", -1894 => x"0b800c8e", -1895 => x"3d0d0480", -1896 => x"7324a538", -1897 => x"72822c81", -1898 => x"712b80e2", -1899 => x"f8080770", -1900 => x"80e2f40b", -1901 => x"84050c5c", -1902 => x"5a768c17", -1903 => x"0c738817", -1904 => x"0c758818", -1905 => x"0cf9fd39", -1906 => x"83137082", -1907 => x"2c81712b", -1908 => x"80e2f808", -1909 => x"077080e2", -1910 => x"f40b8405", -1911 => x"0c5d5b53", -1912 => x"d8397a75", -1913 => x"065c7bfc", -1914 => x"9f388419", -1915 => x"75105659", -1916 => x"f139ff17", -1917 => x"810559f7", -1918 => x"ab398c15", -1919 => x"08881608", -1920 => x"718c120c", -1921 => x"88120c59", -1922 => x"75158411", -1923 => x"08810784", -1924 => x"120c587c", -1925 => x"5182de3f", -1926 => x"881554fb", -1927 => x"a3397716", -1928 => x"78810784", -1929 => x"180c8c17", -1930 => x"08881808", -1931 => x"718c120c", -1932 => x"88120c5c", -1933 => x"7080e388", -1934 => x"0c7080e3", -1935 => x"840c80e2", -1936 => x"fc0b8c12", -1937 => x"0c8c1108", -1938 => x"88120c77", -1939 => x"81078412", -1940 => x"0c770577", -1941 => x"710c557c", -1942 => x"51829a3f", -1943 => x"881654f5", -1944 => x"ba397216", -1945 => x"84110881", -1946 => x"0784120c", -1947 => x"588c1608", -1948 => x"88170871", -1949 => x"8c120c88", -1950 => x"120c577c", -1951 => x"5181f63f", -1952 => x"881654f5", -1953 => x"96397284", -1954 => x"150cf41a", -1955 => x"f8067084", -1956 => x"1d088106", -1957 => x"07841d0c", -1958 => x"701c5556", -1959 => x"850b8415", -1960 => x"0c850b88", -1961 => x"150c8f76", -1962 => x"27fdab38", -1963 => x"881b527c", -1964 => x"5184be3f", -1965 => x"80e2f40b", -1966 => x"88050880", -1967 => x"e2b8085a", -1968 => x"55fd9339", -1969 => x"7880e2b8", -1970 => x"0c7380e2", -1971 => x"e80cfbef", -1972 => x"39728415", -1973 => x"0cfcff39", -1974 => x"fb3d0d77", -1975 => x"707a7c58", -1976 => x"5553568f", -1977 => x"752780e6", -1978 => x"38727607", -1979 => x"83065170", -1980 => x"80dc3875", -1981 => x"73525470", -1982 => x"70840552", -1983 => x"08747084", -1984 => x"05560c73", -1985 => x"71708405", -1986 => x"53087170", -1987 => x"8405530c", -1988 => x"71708405", -1989 => x"53087170", -1990 => x"8405530c", -1991 => x"71708405", -1992 => x"53087170", -1993 => x"8405530c", -1994 => x"f0165654", -1995 => x"748f26c7", -1996 => x"38837527", -1997 => x"95387070", -1998 => x"84055208", -1999 => x"74708405", -2000 => x"560cfc15", -2001 => x"55748326", -2002 => x"ed387371", -2003 => x"5452ff15", -2004 => x"5170ff2e", -2005 => x"98387270", -2006 => x"81055433", -2007 => x"72708105", -2008 => x"5434ff11", -2009 => x"5170ff2e", -2010 => x"098106ea", -2011 => x"3875800c", -2012 => x"873d0d04", -2013 => x"0404fd3d", -2014 => x"0d800b81", -2015 => x"c2d40c76", -2016 => x"5187ca3f", -2017 => x"80085380", -2018 => x"08ff2e88", -2019 => x"3872800c", -2020 => x"853d0d04", -2021 => x"81c2d408", -2022 => x"5473802e", -2023 => x"f0387574", -2024 => x"710c5272", -2025 => x"800c853d", -2026 => x"0d04fb3d", -2027 => x"0d777970", -2028 => x"72078306", -2029 => x"53545270", -2030 => x"93387173", -2031 => x"73085456", -2032 => x"54717308", -2033 => x"2e80c438", -2034 => x"73755452", -2035 => x"71337081", -2036 => x"ff065254", -2037 => x"70802e9d", -2038 => x"38723355", -2039 => x"70752e09", -2040 => x"81069538", -2041 => x"81128114", -2042 => x"71337081", -2043 => x"ff065456", -2044 => x"545270e5", -2045 => x"38723355", -2046 => x"7381ff06", -2047 => x"7581ff06", -2048 => x"71713180", -2049 => x"0c555287", -2050 => x"3d0d0471", -2051 => x"09f7fbfd", -2052 => x"ff1306f8", -2053 => x"84828180", -2054 => x"06527197", -2055 => x"38841484", -2056 => x"16710854", -2057 => x"56547175", -2058 => x"082ee038", -2059 => x"73755452", -2060 => x"ff9a3980", -2061 => x"0b800c87", -2062 => x"3d0d04fb", -2063 => x"3d0d7770", -2064 => x"5256feb0", -2065 => x"3f80e2f4", -2066 => x"0b880508", -2067 => x"841108fc", -2068 => x"06707b31", -2069 => x"9fef05e0", -2070 => x"8006e080", -2071 => x"05525555", -2072 => x"a0807524", -2073 => x"94388052", -2074 => x"7551fe8a", -2075 => x"3f80e2fc", -2076 => x"08145372", -2077 => x"80082e8f", -2078 => x"387551fd", -2079 => x"f83f8053", -2080 => x"72800c87", -2081 => x"3d0d0474", -2082 => x"30527551", -2083 => x"fde83f80", -2084 => x"08ff2ea8", -2085 => x"3880e2f4", -2086 => x"0b880508", -2087 => x"74763181", -2088 => x"0784120c", -2089 => x"5380e2b8", -2090 => x"08753180", -2091 => x"e2b80c75", -2092 => x"51fdc23f", -2093 => x"810b800c", -2094 => x"873d0d04", -2095 => x"80527551", -2096 => x"fdb43f80", -2097 => x"e2f40b88", -2098 => x"05088008", -2099 => x"71315454", -2100 => x"8f7325ff", -2101 => x"a4388008", -2102 => x"80e2e808", -2103 => x"3180e2b8", -2104 => x"0c728107", -2105 => x"84150c75", -2106 => x"51fd8a3f", -2107 => x"8053ff90", -2108 => x"39f73d0d", -2109 => x"7b7d545a", -2110 => x"72802e82", -2111 => x"83387951", -2112 => x"fcf23ff8", -2113 => x"13841108", -2114 => x"70fe0670", -2115 => x"13841108", -2116 => x"fc065c57", -2117 => x"58545780", -2118 => x"e2fc0874", -2119 => x"2e82de38", -2120 => x"7784150c", -2121 => x"80738106", -2122 => x"56597479", -2123 => x"2e81d538", -2124 => x"77148411", -2125 => x"08810656", -2126 => x"5374a038", -2127 => x"77165678", -2128 => x"81e63888", -2129 => x"14085574", -2130 => x"80e2fc2e", -2131 => x"82f9388c", -2132 => x"1408708c", -2133 => x"170c7588", -2134 => x"120c5875", -2135 => x"81078418", -2136 => x"0c751776", -2137 => x"710c5478", -2138 => x"81913883", -2139 => x"ff762781", -2140 => x"c8387589", -2141 => x"2a76832a", -2142 => x"54547380", -2143 => x"2ebf3875", -2144 => x"862ab805", -2145 => x"53847427", -2146 => x"b43880db", -2147 => x"14539474", -2148 => x"27ab3875", -2149 => x"8c2a80ee", -2150 => x"055380d4", -2151 => x"74279e38", -2152 => x"758f2a80", -2153 => x"f7055382", -2154 => x"d4742791", -2155 => x"3875922a", -2156 => x"80fc0553", -2157 => x"8ad47427", -2158 => x"843880fe", -2159 => x"53721010", -2160 => x"1080e2f4", -2161 => x"05881108", -2162 => x"55557375", -2163 => x"2e82bf38", -2164 => x"841408fc", -2165 => x"06597579", -2166 => x"278d3888", -2167 => x"14085473", -2168 => x"752e0981", -2169 => x"06ea388c", -2170 => x"1408708c", -2171 => x"190c7488", -2172 => x"190c7788", -2173 => x"120c5576", -2174 => x"8c150c79", -2175 => x"51faf63f", -2176 => x"8b3d0d04", -2177 => x"76087771", -2178 => x"31587605", -2179 => x"88180856", -2180 => x"567480e2", -2181 => x"fc2e80e0", -2182 => x"388c1708", -2183 => x"708c170c", -2184 => x"7588120c", -2185 => x"53fe8939", -2186 => x"8814088c", -2187 => x"1508708c", -2188 => x"130c5988", -2189 => x"190cfea3", -2190 => x"3975832a", -2191 => x"70545480", -2192 => x"74248198", -2193 => x"3872822c", -2194 => x"81712b80", -2195 => x"e2f80807", -2196 => x"80e2f40b", -2197 => x"84050c74", -2198 => x"10101080", -2199 => x"e2f40588", -2200 => x"1108718c", -2201 => x"1b0c7088", -2202 => x"1b0c7988", -2203 => x"130c565a", -2204 => x"55768c15", -2205 => x"0cff8439", -2206 => x"8159fdb4", -2207 => x"39771673", -2208 => x"81065455", -2209 => x"72983876", -2210 => x"08777131", -2211 => x"5875058c", -2212 => x"18088819", -2213 => x"08718c12", -2214 => x"0c88120c", -2215 => x"55557481", -2216 => x"0784180c", -2217 => x"7680e2f4", -2218 => x"0b88050c", -2219 => x"80e2f008", -2220 => x"7526fec7", -2221 => x"3880e2ec", -2222 => x"08527951", -2223 => x"fafd3f79", -2224 => x"51f9b23f", -2225 => x"feba3981", -2226 => x"778c170c", -2227 => x"7788170c", -2228 => x"758c190c", -2229 => x"7588190c", -2230 => x"59fd8039", -2231 => x"83147082", -2232 => x"2c81712b", -2233 => x"80e2f808", -2234 => x"0780e2f4", -2235 => x"0b84050c", -2236 => x"75101010", -2237 => x"80e2f405", -2238 => x"88110871", -2239 => x"8c1c0c70", -2240 => x"881c0c7a", -2241 => x"88130c57", -2242 => x"5b5653fe", -2243 => x"e4398073", -2244 => x"24a33872", -2245 => x"822c8171", -2246 => x"2b80e2f8", -2247 => x"080780e2", -2248 => x"f40b8405", -2249 => x"0c58748c", -2250 => x"180c7388", -2251 => x"180c7688", -2252 => x"160cfdc3", -2253 => x"39831370", -2254 => x"822c8171", -2255 => x"2b80e2f8", -2256 => x"080780e2", -2257 => x"f40b8405", -2258 => x"0c5953da", -2259 => x"39fe3d0d", -2260 => x"81c2d808", -2261 => x"51708a38", -2262 => x"81c2e070", -2263 => x"81c2d80c", -2264 => x"51741152", -2265 => x"ff537187", -2266 => x"fb808026", -2267 => x"88387181", -2268 => x"c2d80c70", -2269 => x"5372800c", -2270 => x"843d0d04", -2271 => x"fd3d0d80", -2272 => x"0b80e2a4", -2273 => x"08545472", -2274 => x"812e9b38", -2275 => x"7381c2dc", -2276 => x"0cc28e3f", -2277 => x"c0ea3f80", -2278 => x"f1fc5281", -2279 => x"51caf83f", -2280 => x"80085189", -2281 => x"a73f7281", -2282 => x"c2dc0cc1", -2283 => x"f43fc0d0", -2284 => x"3f80f1fc", -2285 => x"528151ca", -2286 => x"de3f8008", -2287 => x"51898d3f", -2288 => x"00ff3900", -2289 => x"ff39f53d", -2290 => x"0d7e6081", -2291 => x"c2dc0870", -2292 => x"5b585b5b", -2293 => x"7580c238", -2294 => x"777a25a1", -2295 => x"38771b70", -2296 => x"337081ff", -2297 => x"06585859", -2298 => x"758a2e98", -2299 => x"387681ff", -2300 => x"0651c18c", -2301 => x"3f811858", -2302 => x"797824e1", -2303 => x"3879800c", -2304 => x"8d3d0d04", -2305 => x"8d51c0f8", -2306 => x"3f783370", -2307 => x"81ff0652", -2308 => x"57c0ed3f", -2309 => x"811858e0", -2310 => x"3979557a", -2311 => x"547d5385", -2312 => x"528d3dfc", -2313 => x"0551c09a", -2314 => x"3f800856", -2315 => x"88973f7b", -2316 => x"80080c75", -2317 => x"800c8d3d", -2318 => x"0d04f63d", -2319 => x"0d7d7f81", -2320 => x"c2dc0870", -2321 => x"5a585a5a", -2322 => x"7580c338", -2323 => x"767925b1", -2324 => x"38761a58", -2325 => x"c08a3f80", -2326 => x"08783480", -2327 => x"0b800881", -2328 => x"ff065758", -2329 => x"758a2ea2", -2330 => x"38758d32", -2331 => x"70307080", -2332 => x"257a0751", -2333 => x"515675b8", -2334 => x"38811757", -2335 => x"787724d1", -2336 => x"38765675", -2337 => x"800c8c3d", -2338 => x"0d048158", -2339 => x"dc397855", -2340 => x"79547c53", -2341 => x"84528c3d", -2342 => x"fc0551ff", -2343 => x"bfa43f80", -2344 => x"085687a1", -2345 => x"3f7a8008", -2346 => x"0c75800c", -2347 => x"8c3d0d04", -2348 => x"811756cf", -2349 => x"39f93d0d", -2350 => x"795781c2", -2351 => x"dc08802e", -2352 => x"ad387651", -2353 => x"89b43f7b", -2354 => x"567a5580", -2355 => x"08810554", -2356 => x"76538252", -2357 => x"893dfc05", -2358 => x"51ffbee6", -2359 => x"3f800857", -2360 => x"86e33f77", -2361 => x"80080c76", -2362 => x"800c893d", -2363 => x"0d0486d5", -2364 => x"3f850b80", -2365 => x"080cff0b", -2366 => x"800c893d", -2367 => x"0d04fb3d", -2368 => x"0d81c2dc", -2369 => x"08705654", -2370 => x"73883874", -2371 => x"800c873d", -2372 => x"0d047753", -2373 => x"8352873d", -2374 => x"fc0551ff", -2375 => x"bea43f80", -2376 => x"085486a1", -2377 => x"3f758008", -2378 => x"0c73800c", -2379 => x"873d0d04", -2380 => x"ff0b800c", -2381 => x"04fb3d0d", -2382 => x"775581c2", -2383 => x"dc08802e", -2384 => x"a9387451", -2385 => x"88b43f80", -2386 => x"08810554", -2387 => x"74538752", -2388 => x"873dfc05", -2389 => x"51ffbdea", -2390 => x"3f800855", -2391 => x"85e73f75", -2392 => x"80080c74", -2393 => x"800c873d", -2394 => x"0d0485d9", -2395 => x"3f850b80", -2396 => x"080cff0b", -2397 => x"800c873d", -2398 => x"0d04fa3d", -2399 => x"0d81c2dc", -2400 => x"08802ea3", -2401 => x"387a5579", -2402 => x"54785386", -2403 => x"52883dfc", -2404 => x"0551ffbd", -2405 => x"ad3f8008", -2406 => x"5685aa3f", -2407 => x"7680080c", -2408 => x"75800c88", -2409 => x"3d0d0485", -2410 => x"9c3f9d0b", -2411 => x"80080cff", -2412 => x"0b800c88", -2413 => x"3d0d04f7", -2414 => x"3d0d7b7d", -2415 => x"5b59bc53", -2416 => x"80527951", -2417 => x"86aa3f80", -2418 => x"70565798", -2419 => x"56741970", -2420 => x"3370782b", -2421 => x"79078118", -2422 => x"f81a5a58", -2423 => x"59555884", -2424 => x"7524ea38", -2425 => x"767a2384", -2426 => x"19588070", -2427 => x"56579856", -2428 => x"74187033", -2429 => x"70782b79", -2430 => x"078118f8", -2431 => x"1a5a5859", -2432 => x"51548475", -2433 => x"24ea3876", -2434 => x"821b2388", -2435 => x"19588070", -2436 => x"56579856", -2437 => x"74187033", -2438 => x"70782b79", -2439 => x"078118f8", -2440 => x"1a5a5859", -2441 => x"51548475", -2442 => x"24ea3876", -2443 => x"841b0c8c", -2444 => x"19588070", -2445 => x"56579856", -2446 => x"74187033", -2447 => x"70782b79", -2448 => x"078118f8", -2449 => x"1a5a5859", -2450 => x"51548475", -2451 => x"24ea3876", -2452 => x"881b2390", -2453 => x"19588070", -2454 => x"56579856", -2455 => x"74187033", -2456 => x"70782b79", -2457 => x"078118f8", -2458 => x"1a5a5859", -2459 => x"51548475", -2460 => x"24ea3876", -2461 => x"8a1b2394", -2462 => x"19588070", -2463 => x"56579856", -2464 => x"74187033", -2465 => x"70782b79", -2466 => x"078118f8", -2467 => x"1a5a5859", -2468 => x"51548475", -2469 => x"24ea3876", -2470 => x"8c1b2398", -2471 => x"19588070", -2472 => x"56579856", -2473 => x"74187033", -2474 => x"70782b79", -2475 => x"078118f8", -2476 => x"1a5a5859", -2477 => x"51548475", -2478 => x"24ea3876", -2479 => x"8e1b239c", -2480 => x"19588070", -2481 => x"5657b856", -2482 => x"74187033", -2483 => x"70782b79", -2484 => x"078118f8", -2485 => x"1a5a5859", -2486 => x"5a548875", -2487 => x"24ea3876", -2488 => x"901b0c8b", -2489 => x"3d0d04e9", -2490 => x"3d0d6a81", -2491 => x"c2dc0857", -2492 => x"57759338", -2493 => x"80c0800b", -2494 => x"84180c75", -2495 => x"ac180c75", -2496 => x"800c993d", -2497 => x"0d04893d", -2498 => x"70556a54", -2499 => x"558a5299", -2500 => x"3dffbc05", -2501 => x"51ffbaaa", -2502 => x"3f800877", -2503 => x"53755256", -2504 => x"fd953f82", -2505 => x"a03f7780", -2506 => x"080c7580", -2507 => x"0c993d0d", -2508 => x"04e93d0d", -2509 => x"695781c2", -2510 => x"dc08802e", -2511 => x"b6387651", -2512 => x"84b83f89", -2513 => x"3d705680", -2514 => x"08810555", -2515 => x"7754568f", -2516 => x"52993dff", -2517 => x"bc0551ff", -2518 => x"b9e83f80", -2519 => x"086b5376", -2520 => x"5257fcd3", -2521 => x"3f81de3f", -2522 => x"7780080c", -2523 => x"76800c99", -2524 => x"3d0d0481", -2525 => x"d03f850b", -2526 => x"80080cff", -2527 => x"0b800c99", -2528 => x"3d0d04fc", -2529 => x"3d0d8154", -2530 => x"81c2dc08", -2531 => x"88387380", -2532 => x"0c863d0d", -2533 => x"04765397", -2534 => x"b952863d", -2535 => x"fc0551ff", -2536 => x"b9a03f80", -2537 => x"0854819d", -2538 => x"3f748008", -2539 => x"0c73800c", -2540 => x"863d0d04", -2541 => x"f43d0d7e", -2542 => x"80f2a808", -2543 => x"700881ff", -2544 => x"06913df8", -2545 => x"05545159", -2546 => x"59ffbac5", -2547 => x"3f775780", -2548 => x"5476557b", -2549 => x"7d585276", -2550 => x"538e3df0", -2551 => x"0551d6a0", -2552 => x"3f797b58", -2553 => x"790c7684", -2554 => x"1a0c7880", -2555 => x"0c8e3d0d", -2556 => x"04f43d0d", -2557 => x"7e80f2a8", -2558 => x"08700870", -2559 => x"81ff0692", -2560 => x"3df80555", -2561 => x"515a5759", -2562 => x"ffba863f", -2563 => x"7757800b", -2564 => x"8b3d5954", -2565 => x"76557b7d", -2566 => x"58527653", -2567 => x"7751d5e0", -2568 => x"3f8056bd", -2569 => x"84c07655", -2570 => x"55797b58", -2571 => x"52765377", -2572 => x"51d5cd3f", -2573 => x"7a577880", -2574 => x"2e843876", -2575 => x"790c7680", -2576 => x"0c8e3d0d", -2577 => x"0480eafc", -2578 => x"08800c04", -2579 => x"f73d0d7b", -2580 => x"80eafc08", -2581 => x"82c81108", -2582 => x"5a545a77", -2583 => x"802e80da", -2584 => x"38818818", -2585 => x"841908ff", -2586 => x"0581712b", -2587 => x"59555980", -2588 => x"742480ea", -2589 => x"38807424", -2590 => x"b5387382", -2591 => x"2b781188", -2592 => x"05565681", -2593 => x"80190877", -2594 => x"06537280", -2595 => x"2eb63878", -2596 => x"16700853", -2597 => x"53795174", -2598 => x"0853722d", -2599 => x"ff14fc17", -2600 => x"fc177981", -2601 => x"2c5a5757", -2602 => x"54738025", -2603 => x"d6387708", -2604 => x"5877ffad", -2605 => x"3880eafc", -2606 => x"0853bc13", -2607 => x"08a53879", -2608 => x"51f5fd3f", -2609 => x"74085372", -2610 => x"2dff14fc", -2611 => x"17fc1779", -2612 => x"812c5a57", -2613 => x"57547380", -2614 => x"25ffa838", -2615 => x"d1398057", -2616 => x"ff933972", -2617 => x"51bc1308", -2618 => x"54732d79", -2619 => x"51f5d13f", -2620 => x"fb3d0d77", -2621 => x"7a71028c", -2622 => x"05a30533", -2623 => x"58545456", -2624 => x"83732780", -2625 => x"d4387583", -2626 => x"06517080", -2627 => x"cc387488", -2628 => x"2b750770", -2629 => x"71902b07", -2630 => x"55518f73", -2631 => x"27a73873", -2632 => x"72708405", -2633 => x"540c7174", -2634 => x"71708405", -2635 => x"530c7471", -2636 => x"70840553", -2637 => x"0c747170", -2638 => x"8405530c", -2639 => x"f0145452", -2640 => x"728f26db", -2641 => x"38837327", -2642 => x"90387372", -2643 => x"70840554", -2644 => x"0cfc1353", -2645 => x"728326f2", -2646 => x"38ff1351", -2647 => x"70ff2e93", -2648 => x"38747270", -2649 => x"81055434", -2650 => x"ff115170", -2651 => x"ff2e0981", -2652 => x"06ef3875", -2653 => x"800c873d", -2654 => x"0d04fd3d", -2655 => x"0d757071", -2656 => x"83065355", -2657 => x"5270b438", -2658 => x"71700870", -2659 => x"09f7fbfd", -2660 => x"ff1206f8", -2661 => x"84828180", -2662 => x"06545253", -2663 => x"719b3884", -2664 => x"13700870", -2665 => x"09f7fbfd", -2666 => x"ff1206f8", -2667 => x"84828180", -2668 => x"06545253", -2669 => x"71802ee7", -2670 => x"38725271", -2671 => x"33537280", -2672 => x"2e8a3881", -2673 => x"12703354", -2674 => x"5272f838", -2675 => x"71743180", -2676 => x"0c853d0d", -2677 => x"04ff3d0d", -2678 => x"80f2840b", -2679 => x"fc057008", -2680 => x"525270ff", -2681 => x"2e913870", -2682 => x"2dfc1270", -2683 => x"08525270", -2684 => x"ff2e0981", -2685 => x"06f13883", -2686 => x"3d0d0404", -2687 => x"ffb7a63f", -2688 => x"04000000", -2689 => x"30313233", -2690 => x"34353637", -2691 => x"38390000", -2692 => x"44485259", -2693 => x"53544f4e", -2694 => x"45205052", -2695 => x"4f475241", -2696 => x"4d2c2053", -2697 => x"4f4d4520", -2698 => x"53545249", -2699 => x"4e470000", -2700 => x"44485259", -2701 => x"53544f4e", -2702 => x"45205052", -2703 => x"4f475241", -2704 => x"4d2c2031", -2705 => x"27535420", -2706 => x"53545249", -2707 => x"4e470000", -2708 => x"44687279", -2709 => x"73746f6e", -2710 => x"65204265", -2711 => x"6e63686d", -2712 => x"61726b2c", -2713 => x"20566572", -2714 => x"73696f6e", -2715 => x"20322e31", -2716 => x"20284c61", -2717 => x"6e677561", -2718 => x"67653a20", -2719 => x"43290a00", -2720 => x"50726f67", -2721 => x"72616d20", -2722 => x"636f6d70", -2723 => x"696c6564", -2724 => x"20776974", -2725 => x"68202772", -2726 => x"65676973", -2727 => x"74657227", -2728 => x"20617474", -2729 => x"72696275", -2730 => x"74650a00", -2731 => x"45786563", -2732 => x"7574696f", -2733 => x"6e207374", -2734 => x"61727473", -2735 => x"2c202564", -2736 => x"2072756e", -2737 => x"73207468", -2738 => x"726f7567", -2739 => x"68204468", -2740 => x"72797374", -2741 => x"6f6e650a", -2742 => x"00000000", -2743 => x"44485259", -2744 => x"53544f4e", -2745 => x"45205052", -2746 => x"4f475241", -2747 => x"4d2c2032", -2748 => x"274e4420", -2749 => x"53545249", -2750 => x"4e470000", -2751 => x"45786563", -2752 => x"7574696f", -2753 => x"6e20656e", -2754 => x"64730a00", -2755 => x"46696e61", -2756 => x"6c207661", -2757 => x"6c756573", -2758 => x"206f6620", -2759 => x"74686520", -2760 => x"76617269", -2761 => x"61626c65", -2762 => x"73207573", -2763 => x"65642069", -2764 => x"6e207468", -2765 => x"65206265", -2766 => x"6e63686d", -2767 => x"61726b3a", -2768 => x"0a000000", -2769 => x"496e745f", -2770 => x"476c6f62", -2771 => x"3a202020", -2772 => x"20202020", -2773 => x"20202020", -2774 => x"2025640a", -2775 => x"00000000", -2776 => x"20202020", -2777 => x"20202020", -2778 => x"73686f75", -2779 => x"6c642062", -2780 => x"653a2020", -2781 => x"2025640a", -2782 => x"00000000", -2783 => x"426f6f6c", -2784 => x"5f476c6f", -2785 => x"623a2020", -2786 => x"20202020", -2787 => x"20202020", -2788 => x"2025640a", -2789 => x"00000000", -2790 => x"43685f31", -2791 => x"5f476c6f", -2792 => x"623a2020", -2793 => x"20202020", -2794 => x"20202020", -2795 => x"2025630a", -2796 => x"00000000", -2797 => x"20202020", -2798 => x"20202020", -2799 => x"73686f75", -2800 => x"6c642062", -2801 => x"653a2020", -2802 => x"2025630a", -2803 => x"00000000", -2804 => x"43685f32", -2805 => x"5f476c6f", -2806 => x"623a2020", -2807 => x"20202020", -2808 => x"20202020", -2809 => x"2025630a", -2810 => x"00000000", -2811 => x"4172725f", -2812 => x"315f476c", -2813 => x"6f625b38", -2814 => x"5d3a2020", -2815 => x"20202020", -2816 => x"2025640a", -2817 => x"00000000", -2818 => x"4172725f", -2819 => x"325f476c", -2820 => x"6f625b38", -2821 => x"5d5b375d", -2822 => x"3a202020", -2823 => x"2025640a", -2824 => x"00000000", -2825 => x"20202020", -2826 => x"20202020", -2827 => x"73686f75", -2828 => x"6c642062", -2829 => x"653a2020", -2830 => x"204e756d", -2831 => x"6265725f", -2832 => x"4f665f52", -2833 => x"756e7320", -2834 => x"2b203130", -2835 => x"0a000000", -2836 => x"5074725f", -2837 => x"476c6f62", -2838 => x"2d3e0a00", -2839 => x"20205074", -2840 => x"725f436f", -2841 => x"6d703a20", -2842 => x"20202020", -2843 => x"20202020", -2844 => x"2025640a", -2845 => x"00000000", -2846 => x"20202020", -2847 => x"20202020", -2848 => x"73686f75", -2849 => x"6c642062", -2850 => x"653a2020", -2851 => x"2028696d", -2852 => x"706c656d", -2853 => x"656e7461", -2854 => x"74696f6e", -2855 => x"2d646570", -2856 => x"656e6465", -2857 => x"6e74290a", -2858 => x"00000000", -2859 => x"20204469", -2860 => x"7363723a", -2861 => x"20202020", -2862 => x"20202020", -2863 => x"20202020", -2864 => x"2025640a", -2865 => x"00000000", -2866 => x"2020456e", -2867 => x"756d5f43", -2868 => x"6f6d703a", -2869 => x"20202020", -2870 => x"20202020", -2871 => x"2025640a", -2872 => x"00000000", -2873 => x"2020496e", -2874 => x"745f436f", -2875 => x"6d703a20", -2876 => x"20202020", -2877 => x"20202020", -2878 => x"2025640a", -2879 => x"00000000", -2880 => x"20205374", -2881 => x"725f436f", -2882 => x"6d703a20", -2883 => x"20202020", -2884 => x"20202020", -2885 => x"2025730a", -2886 => x"00000000", -2887 => x"20202020", -2888 => x"20202020", -2889 => x"73686f75", -2890 => x"6c642062", -2891 => x"653a2020", -2892 => x"20444852", -2893 => x"5953544f", -2894 => x"4e452050", -2895 => x"524f4752", -2896 => x"414d2c20", -2897 => x"534f4d45", -2898 => x"20535452", -2899 => x"494e470a", -2900 => x"00000000", -2901 => x"4e657874", -2902 => x"5f507472", -2903 => x"5f476c6f", -2904 => x"622d3e0a", -2905 => x"00000000", -2906 => x"20202020", -2907 => x"20202020", -2908 => x"73686f75", -2909 => x"6c642062", -2910 => x"653a2020", -2911 => x"2028696d", -2912 => x"706c656d", -2913 => x"656e7461", -2914 => x"74696f6e", -2915 => x"2d646570", -2916 => x"656e6465", -2917 => x"6e74292c", -2918 => x"2073616d", -2919 => x"65206173", -2920 => x"2061626f", -2921 => x"76650a00", -2922 => x"496e745f", -2923 => x"315f4c6f", -2924 => x"633a2020", -2925 => x"20202020", -2926 => x"20202020", -2927 => x"2025640a", -2928 => x"00000000", -2929 => x"496e745f", -2930 => x"325f4c6f", -2931 => x"633a2020", -2932 => x"20202020", -2933 => x"20202020", -2934 => x"2025640a", -2935 => x"00000000", -2936 => x"496e745f", -2937 => x"335f4c6f", -2938 => x"633a2020", -2939 => x"20202020", -2940 => x"20202020", -2941 => x"2025640a", -2942 => x"00000000", -2943 => x"456e756d", -2944 => x"5f4c6f63", -2945 => x"3a202020", -2946 => x"20202020", -2947 => x"20202020", -2948 => x"2025640a", -2949 => x"00000000", -2950 => x"5374725f", -2951 => x"315f4c6f", -2952 => x"633a2020", -2953 => x"20202020", -2954 => x"20202020", -2955 => x"2025730a", -2956 => x"00000000", -2957 => x"20202020", -2958 => x"20202020", -2959 => x"73686f75", -2960 => x"6c642062", -2961 => x"653a2020", -2962 => x"20444852", -2963 => x"5953544f", -2964 => x"4e452050", -2965 => x"524f4752", -2966 => x"414d2c20", -2967 => x"31275354", -2968 => x"20535452", -2969 => x"494e470a", -2970 => x"00000000", -2971 => x"5374725f", -2972 => x"325f4c6f", -2973 => x"633a2020", -2974 => x"20202020", -2975 => x"20202020", -2976 => x"2025730a", -2977 => x"00000000", -2978 => x"20202020", -2979 => x"20202020", -2980 => x"73686f75", -2981 => x"6c642062", -2982 => x"653a2020", -2983 => x"20444852", -2984 => x"5953544f", -2985 => x"4e452050", -2986 => x"524f4752", -2987 => x"414d2c20", -2988 => x"32274e44", -2989 => x"20535452", -2990 => x"494e470a", -2991 => x"00000000", -2992 => x"55736572", -2993 => x"2074696d", -2994 => x"653a2025", -2995 => x"640a0000", -2996 => x"4d696372", -2997 => x"6f736563", -2998 => x"6f6e6473", -2999 => x"20666f72", -3000 => x"206f6e65", -3001 => x"2072756e", -3002 => x"20746872", -3003 => x"6f756768", -3004 => x"20446872", -3005 => x"7973746f", -3006 => x"6e653a20", -3007 => x"00000000", -3008 => x"2564200a", -3009 => x"00000000", -3010 => x"44687279", -3011 => x"73746f6e", -3012 => x"65732070", -3013 => x"65722053", -3014 => x"65636f6e", -3015 => x"643a2020", -3016 => x"20202020", -3017 => x"20202020", -3018 => x"20202020", -3019 => x"20202020", -3020 => x"20202020", -3021 => x"00000000", -3022 => x"56415820", -3023 => x"4d495053", -3024 => x"20726174", -3025 => x"696e6720", -3026 => x"2a203130", -3027 => x"3030203d", -3028 => x"20256420", -3029 => x"0a000000", -3030 => x"50726f67", -3031 => x"72616d20", -3032 => x"636f6d70", -3033 => x"696c6564", -3034 => x"20776974", -3035 => x"686f7574", -3036 => x"20277265", -3037 => x"67697374", -3038 => x"65722720", -3039 => x"61747472", -3040 => x"69627574", -3041 => x"650a0000", -3042 => x"4d656173", -3043 => x"75726564", -3044 => x"2074696d", -3045 => x"6520746f", -3046 => x"6f20736d", -3047 => x"616c6c20", -3048 => x"746f206f", -3049 => x"62746169", -3050 => x"6e206d65", -3051 => x"616e696e", -3052 => x"6766756c", -3053 => x"20726573", -3054 => x"756c7473", -3055 => x"0a000000", -3056 => x"506c6561", -3057 => x"73652069", -3058 => x"6e637265", -3059 => x"61736520", -3060 => x"6e756d62", -3061 => x"6572206f", -3062 => x"66207275", -3063 => x"6e730a00", -3064 => x"44485259", -3065 => x"53544f4e", -3066 => x"45205052", -3067 => x"4f475241", -3068 => x"4d2c2033", -3069 => x"27524420", -3070 => x"53545249", -3071 => x"4e470000", -3072 => x"00010202", -3073 => x"03030303", -3074 => x"04040404", -3075 => x"04040404", -3076 => x"05050505", -3077 => x"05050505", -3078 => x"05050505", -3079 => x"05050505", -3080 => x"06060606", -3081 => x"06060606", -3082 => x"06060606", -3083 => x"06060606", -3084 => x"06060606", -3085 => x"06060606", -3086 => x"06060606", -3087 => x"06060606", -3088 => x"07070707", -3089 => x"07070707", -3090 => x"07070707", -3091 => x"07070707", -3092 => x"07070707", -3093 => x"07070707", -3094 => x"07070707", -3095 => x"07070707", -3096 => x"07070707", -3097 => x"07070707", -3098 => x"07070707", -3099 => x"07070707", -3100 => x"07070707", -3101 => x"07070707", -3102 => x"07070707", -3103 => x"07070707", -3104 => x"08080808", -3105 => x"08080808", -3106 => x"08080808", -3107 => x"08080808", -3108 => x"08080808", -3109 => x"08080808", -3110 => x"08080808", -3111 => x"08080808", -3112 => x"08080808", -3113 => x"08080808", -3114 => x"08080808", -3115 => x"08080808", -3116 => x"08080808", -3117 => x"08080808", -3118 => x"08080808", -3119 => x"08080808", -3120 => x"08080808", -3121 => x"08080808", -3122 => x"08080808", -3123 => x"08080808", -3124 => x"08080808", -3125 => x"08080808", -3126 => x"08080808", -3127 => x"08080808", -3128 => x"08080808", -3129 => x"08080808", -3130 => x"08080808", -3131 => x"08080808", -3132 => x"08080808", -3133 => x"08080808", -3134 => x"08080808", -3135 => x"08080808", -3136 => x"43000000", -3137 => x"64756d6d", -3138 => x"792e6578", -3139 => x"65000000", -3140 => x"00ffffff", -3141 => x"ff00ffff", -3142 => x"ffff00ff", -3143 => x"ffffff00", -3144 => x"00000000", -3145 => x"00000000", -3146 => x"00000000", -3147 => x"0000390c", -3148 => x"000004d2", -- iterations 0x4d2=1234 -3149 => x"00000000", -3150 => x"00000000", -3151 => x"00000000", -3152 => x"00000000", -3153 => x"00000000", -3154 => x"00000000", -3155 => x"00000000", -3156 => x"00000000", -3157 => x"00000000", -3158 => x"00000000", -3159 => x"00000000", -3160 => x"00000000", -3161 => x"00000000", -3162 => x"ffffffff", -3163 => x"00000000", -3164 => x"00020000", -3165 => x"00000000", -3166 => x"00000000", -3167 => x"00003174", -3168 => x"00003174", -3169 => x"0000317c", -3170 => x"0000317c", -3171 => x"00003184", -3172 => x"00003184", -3173 => x"0000318c", -3174 => x"0000318c", -3175 => x"00003194", -3176 => x"00003194", -3177 => x"0000319c", -3178 => x"0000319c", -3179 => x"000031a4", -3180 => x"000031a4", -3181 => x"000031ac", -3182 => x"000031ac", -3183 => x"000031b4", -3184 => x"000031b4", -3185 => x"000031bc", -3186 => x"000031bc", -3187 => x"000031c4", -3188 => x"000031c4", -3189 => x"000031cc", -3190 => x"000031cc", -3191 => x"000031d4", -3192 => x"000031d4", -3193 => x"000031dc", -3194 => x"000031dc", -3195 => x"000031e4", -3196 => x"000031e4", -3197 => x"000031ec", -3198 => x"000031ec", -3199 => x"000031f4", -3200 => x"000031f4", -3201 => x"000031fc", -3202 => x"000031fc", -3203 => x"00003204", -3204 => x"00003204", -3205 => x"0000320c", -3206 => x"0000320c", -3207 => x"00003214", -3208 => x"00003214", -3209 => x"0000321c", -3210 => x"0000321c", -3211 => x"00003224", -3212 => x"00003224", -3213 => x"0000322c", -3214 => x"0000322c", -3215 => x"00003234", -3216 => x"00003234", -3217 => x"0000323c", -3218 => x"0000323c", -3219 => x"00003244", -3220 => x"00003244", -3221 => x"0000324c", -3222 => x"0000324c", -3223 => x"00003254", -3224 => x"00003254", -3225 => x"0000325c", -3226 => x"0000325c", -3227 => x"00003264", -3228 => x"00003264", -3229 => x"0000326c", -3230 => x"0000326c", -3231 => x"00003274", -3232 => x"00003274", -3233 => x"0000327c", -3234 => x"0000327c", -3235 => x"00003284", -3236 => x"00003284", -3237 => x"0000328c", -3238 => x"0000328c", -3239 => x"00003294", -3240 => x"00003294", -3241 => x"0000329c", -3242 => x"0000329c", -3243 => x"000032a4", -3244 => x"000032a4", -3245 => x"000032ac", -3246 => x"000032ac", -3247 => x"000032b4", -3248 => x"000032b4", -3249 => x"000032bc", -3250 => x"000032bc", -3251 => x"000032c4", -3252 => x"000032c4", -3253 => x"000032cc", -3254 => x"000032cc", -3255 => x"000032d4", -3256 => x"000032d4", -3257 => x"000032dc", -3258 => x"000032dc", -3259 => x"000032e4", -3260 => x"000032e4", -3261 => x"000032ec", -3262 => x"000032ec", -3263 => x"000032f4", -3264 => x"000032f4", -3265 => x"000032fc", -3266 => x"000032fc", -3267 => x"00003304", -3268 => x"00003304", -3269 => x"0000330c", -3270 => x"0000330c", -3271 => x"00003314", -3272 => x"00003314", -3273 => x"0000331c", -3274 => x"0000331c", -3275 => x"00003324", -3276 => x"00003324", -3277 => x"0000332c", -3278 => x"0000332c", -3279 => x"00003334", -3280 => x"00003334", -3281 => x"0000333c", -3282 => x"0000333c", -3283 => x"00003344", -3284 => x"00003344", -3285 => x"0000334c", -3286 => x"0000334c", -3287 => x"00003354", -3288 => x"00003354", -3289 => x"0000335c", -3290 => x"0000335c", -3291 => x"00003364", -3292 => x"00003364", -3293 => x"0000336c", -3294 => x"0000336c", -3295 => x"00003374", -3296 => x"00003374", -3297 => x"0000337c", -3298 => x"0000337c", -3299 => x"00003384", -3300 => x"00003384", -3301 => x"0000338c", -3302 => x"0000338c", -3303 => x"00003394", -3304 => x"00003394", -3305 => x"0000339c", -3306 => x"0000339c", -3307 => x"000033a4", -3308 => x"000033a4", -3309 => x"000033ac", -3310 => x"000033ac", -3311 => x"000033b4", -3312 => x"000033b4", -3313 => x"000033bc", -3314 => x"000033bc", -3315 => x"000033c4", -3316 => x"000033c4", -3317 => x"000033cc", -3318 => x"000033cc", -3319 => x"000033d4", -3320 => x"000033d4", -3321 => x"000033dc", -3322 => x"000033dc", -3323 => x"000033e4", -3324 => x"000033e4", -3325 => x"000033ec", -3326 => x"000033ec", -3327 => x"000033f4", -3328 => x"000033f4", -3329 => x"000033fc", -3330 => x"000033fc", -3331 => x"00003404", -3332 => x"00003404", -3333 => x"0000340c", -3334 => x"0000340c", -3335 => x"00003414", -3336 => x"00003414", -3337 => x"0000341c", -3338 => x"0000341c", -3339 => x"00003424", -3340 => x"00003424", -3341 => x"0000342c", -3342 => x"0000342c", -3343 => x"00003434", -3344 => x"00003434", -3345 => x"0000343c", -3346 => x"0000343c", -3347 => x"00003444", -3348 => x"00003444", -3349 => x"0000344c", -3350 => x"0000344c", -3351 => x"00003454", -3352 => x"00003454", -3353 => x"0000345c", -3354 => x"0000345c", -3355 => x"00003464", -3356 => x"00003464", -3357 => x"0000346c", -3358 => x"0000346c", -3359 => x"00003474", -3360 => x"00003474", -3361 => x"0000347c", -3362 => x"0000347c", -3363 => x"00003484", -3364 => x"00003484", -3365 => x"0000348c", -3366 => x"0000348c", -3367 => x"00003494", -3368 => x"00003494", -3369 => x"0000349c", -3370 => x"0000349c", -3371 => x"000034a4", -3372 => x"000034a4", -3373 => x"000034ac", -3374 => x"000034ac", -3375 => x"000034b4", -3376 => x"000034b4", -3377 => x"000034bc", -3378 => x"000034bc", -3379 => x"000034c4", -3380 => x"000034c4", -3381 => x"000034cc", -3382 => x"000034cc", -3383 => x"000034d4", -3384 => x"000034d4", -3385 => x"000034dc", -3386 => x"000034dc", -3387 => x"000034e4", -3388 => x"000034e4", -3389 => x"000034ec", -3390 => x"000034ec", -3391 => x"000034f4", -3392 => x"000034f4", -3393 => x"000034fc", -3394 => x"000034fc", -3395 => x"00003504", -3396 => x"00003504", -3397 => x"0000350c", -3398 => x"0000350c", -3399 => x"00003514", -3400 => x"00003514", -3401 => x"0000351c", -3402 => x"0000351c", -3403 => x"00003524", -3404 => x"00003524", -3405 => x"0000352c", -3406 => x"0000352c", -3407 => x"00003534", -3408 => x"00003534", -3409 => x"0000353c", -3410 => x"0000353c", -3411 => x"00003544", -3412 => x"00003544", -3413 => x"0000354c", -3414 => x"0000354c", -3415 => x"00003554", -3416 => x"00003554", -3417 => x"0000355c", -3418 => x"0000355c", -3419 => x"00003564", -3420 => x"00003564", -3421 => x"0000356c", -3422 => x"0000356c", -3423 => x"00003580", -3424 => x"00000000", -3425 => x"000037e8", -3426 => x"00003844", -3427 => x"000038a0", -3428 => x"00000000", -3429 => x"00000000", -3430 => x"00000000", -3431 => x"00000000", -3432 => x"00000000", -3433 => x"00000000", -3434 => x"00000000", -3435 => x"00000000", -3436 => x"00000000", -3437 => x"00003100", -3438 => x"00000000", -3439 => x"00000000", -3440 => x"00000000", -3441 => x"00000000", -3442 => x"00000000", -3443 => x"00000000", -3444 => x"00000000", -3445 => x"00000000", -3446 => x"00000000", -3447 => x"00000000", -3448 => x"00000000", -3449 => x"00000000", -3450 => x"00000000", -3451 => x"00000000", -3452 => x"00000000", -3453 => x"00000000", -3454 => x"00000000", -3455 => x"00000000", -3456 => x"00000000", -3457 => x"00000000", -3458 => x"00000000", -3459 => x"00000000", -3460 => x"00000000", -3461 => x"00000000", -3462 => x"00000000", -3463 => x"00000000", -3464 => x"00000000", -3465 => x"00000000", -3466 => x"00000001", -3467 => x"330eabcd", -3468 => x"1234e66d", -3469 => x"deec0005", -3470 => x"000b0000", -3471 => x"00000000", -3472 => x"00000000", -3473 => x"00000000", -3474 => x"00000000", -3475 => x"00000000", -3476 => x"00000000", -3477 => x"00000000", -3478 => x"00000000", -3479 => x"00000000", -3480 => x"00000000", -3481 => x"00000000", -3482 => x"00000000", -3483 => x"00000000", -3484 => x"00000000", -3485 => x"00000000", -3486 => x"00000000", -3487 => x"00000000", -3488 => x"00000000", -3489 => x"00000000", -3490 => x"00000000", -3491 => x"00000000", -3492 => x"00000000", -3493 => x"00000000", -3494 => x"00000000", -3495 => x"00000000", -3496 => x"00000000", -3497 => x"00000000", -3498 => x"00000000", -3499 => x"00000000", -3500 => x"00000000", -3501 => x"00000000", -3502 => x"00000000", -3503 => x"00000000", -3504 => x"00000000", -3505 => x"00000000", -3506 => x"00000000", -3507 => x"00000000", -3508 => x"00000000", -3509 => x"00000000", -3510 => x"00000000", -3511 => x"00000000", -3512 => x"00000000", -3513 => x"00000000", -3514 => x"00000000", -3515 => x"00000000", -3516 => x"00000000", -3517 => x"00000000", -3518 => x"00000000", -3519 => x"00000000", -3520 => x"00000000", -3521 => x"00000000", -3522 => x"00000000", -3523 => x"00000000", -3524 => x"00000000", -3525 => x"00000000", -3526 => x"00000000", -3527 => x"00000000", -3528 => x"00000000", -3529 => x"00000000", -3530 => x"00000000", -3531 => x"00000000", -3532 => x"00000000", -3533 => x"00000000", -3534 => x"00000000", -3535 => x"00000000", -3536 => x"00000000", -3537 => x"00000000", -3538 => x"00000000", -3539 => x"00000000", -3540 => x"00000000", -3541 => x"00000000", -3542 => x"00000000", -3543 => x"00000000", -3544 => x"00000000", -3545 => x"00000000", -3546 => x"00000000", -3547 => x"00000000", -3548 => x"00000000", -3549 => x"00000000", -3550 => x"00000000", -3551 => x"00000000", -3552 => x"00000000", -3553 => x"00000000", -3554 => x"00000000", -3555 => x"00000000", -3556 => x"00000000", -3557 => x"00000000", -3558 => x"00000000", -3559 => x"00000000", -3560 => x"00000000", -3561 => x"00000000", -3562 => x"00000000", -3563 => x"00000000", -3564 => x"00000000", -3565 => x"00000000", -3566 => x"00000000", -3567 => x"00000000", -3568 => x"00000000", -3569 => x"00000000", -3570 => x"00000000", -3571 => x"00000000", -3572 => x"00000000", -3573 => x"00000000", -3574 => x"00000000", -3575 => x"00000000", -3576 => x"00000000", -3577 => x"00000000", -3578 => x"00000000", -3579 => x"00000000", -3580 => x"00000000", -3581 => x"00000000", -3582 => x"00000000", -3583 => x"00000000", -3584 => x"00000000", -3585 => x"00000000", -3586 => x"00000000", -3587 => x"00000000", -3588 => x"00000000", -3589 => x"00000000", -3590 => x"00000000", -3591 => x"00000000", -3592 => x"00000000", -3593 => x"00000000", -3594 => x"00000000", -3595 => x"00000000", -3596 => x"00000000", -3597 => x"00000000", -3598 => x"00000000", -3599 => x"00000000", -3600 => x"00000000", -3601 => x"00000000", -3602 => x"00000000", -3603 => x"00000000", -3604 => x"00000000", -3605 => x"00000000", -3606 => x"00000000", -3607 => x"00000000", -3608 => x"00000000", -3609 => x"00000000", -3610 => x"00000000", -3611 => x"00000000", -3612 => x"00000000", -3613 => x"00000000", -3614 => x"00000000", -3615 => x"00000000", -3616 => x"00000000", -3617 => x"00000000", -3618 => x"00000000", -3619 => x"00000000", -3620 => x"00000000", -3621 => x"00000000", -3622 => x"00000000", -3623 => x"00000000", -3624 => x"00000000", -3625 => x"00000000", -3626 => x"00000000", -3627 => x"00000000", -3628 => x"00000000", -3629 => x"00000000", -3630 => x"00000000", -3631 => x"00000000", -3632 => x"00000000", -3633 => x"00000000", -3634 => x"00000000", -3635 => x"00000000", -3636 => x"00000000", -3637 => x"00000000", -3638 => x"00000000", -3639 => x"00000000", -3640 => x"00000000", -3641 => x"00000000", -3642 => x"00000000", -3643 => x"00000000", -3644 => x"00000000", -3645 => x"00000000", -3646 => x"00000000", -3647 => x"00003104", -3648 => x"ffffffff", -3649 => x"00000000", -3650 => x"ffffffff", -3651 => x"00000000", - others => x"00000000" -); - -begin - -process (clk) -begin - if (clk'event and clk = '1') then - if (memAWriteEnable = '1') and (memBWriteEnable = '1') and (memAAddr=memBAddr) and (memAWrite/=memBWrite) then - report "write collision" severity failure; - end if; - - if (memAWriteEnable = '1') then - ram(to_integer(unsigned(memAAddr))) := memAWrite; - memARead <= memAWrite; - else - memARead <= ram(to_integer(unsigned(memAAddr))); - end if; - end if; -end process; - -process (clk) -begin - if (clk'event and clk = '1') then - if (memBWriteEnable = '1') then - ram(to_integer(unsigned(memBAddr))) := memBWrite; - memBRead <= memBWrite; - else - memBRead <= ram(to_integer(unsigned(memBAddr))); - end if; - end if; -end process; - - - - -end dualport_ram_arch; diff --git a/zpu/hdl/zpu4/src/dram_dmips.vhd b/zpu/hdl/zpu4/src/dram_dmips.vhd deleted file mode 100644 index a9fd59e..0000000 --- a/zpu/hdl/zpu4/src/dram_dmips.vhd +++ /dev/null @@ -1,3308 +0,0 @@ -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; - - -library work; -use work.zpu_config.all; -use work.zpupkg.all; - -entity dram is -port (clk : in std_logic; -areset : std_logic; - mem_writeEnable : in std_logic; - mem_readEnable : in std_logic; - mem_addr : in std_logic_vector(maxAddrBit downto 0); - mem_write : in std_logic_vector(wordSize-1 downto 0); - mem_read : out std_logic_vector(wordSize-1 downto 0); - mem_busy : out std_logic; - mem_writeMask : in std_logic_vector(wordBytes-1 downto 0)); -end dram; - -architecture dram_arch of dram is - - -type ram_type is array(natural range 0 to ((2**(maxAddrBitDRAM+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); - -shared variable ram : ram_type := -( -0 => x"0b0b0b0b", -1 => x"82700b0b", -2 => x"80d5f40c", -3 => x"3a0b0b80", -4 => x"c4fb0400", -5 => x"00000000", -6 => x"00000000", -7 => x"00000000", -8 => x"80088408", -9 => x"88080b0b", -10 => x"80c5c22d", -11 => x"880c840c", -12 => x"800c0400", -13 => x"00000000", -14 => x"00000000", -15 => x"00000000", -16 => x"71fd0608", -17 => x"72830609", -18 => x"81058205", -19 => x"832b2a83", -20 => x"ffff0652", -21 => x"04000000", -22 => x"00000000", -23 => x"00000000", -24 => x"71fd0608", -25 => x"83ffff73", -26 => x"83060981", -27 => x"05820583", -28 => x"2b2b0906", -29 => x"7383ffff", -30 => x"0b0b0b0b", -31 => x"83a70400", -32 => x"72098105", -33 => x"72057373", -34 => x"09060906", -35 => x"73097306", -36 => x"070a8106", -37 => x"53510400", -38 => x"00000000", -39 => x"00000000", -40 => x"72722473", -41 => x"732e0753", -42 => x"51040000", -43 => x"00000000", -44 => x"00000000", -45 => x"00000000", -46 => x"00000000", -47 => x"00000000", -48 => x"71737109", -49 => x"71068106", -50 => x"30720a10", -51 => x"0a720a10", -52 => x"0a31050a", -53 => x"81065151", -54 => x"53510400", -55 => x"00000000", -56 => x"72722673", -57 => x"732e0753", -58 => x"51040000", -59 => x"00000000", -60 => x"00000000", -61 => x"00000000", -62 => x"00000000", -63 => x"00000000", -64 => x"00000000", -65 => x"00000000", -66 => x"00000000", -67 => x"00000000", -68 => x"00000000", -69 => x"00000000", -70 => x"00000000", -71 => x"00000000", -72 => x"0b0b0b88", -73 => x"c3040000", -74 => x"00000000", -75 => x"00000000", -76 => x"00000000", -77 => x"00000000", -78 => x"00000000", -79 => x"00000000", -80 => x"720a722b", -81 => x"0a535104", -82 => x"00000000", -83 => x"00000000", -84 => x"00000000", -85 => x"00000000", -86 => x"00000000", -87 => x"00000000", -88 => x"72729f06", -89 => x"0981050b", -90 => x"0b0b88a6", -91 => x"05040000", -92 => x"00000000", -93 => x"00000000", -94 => x"00000000", -95 => x"00000000", -96 => x"72722aff", -97 => x"739f062a", -98 => x"0974090a", -99 => x"8106ff05", -100 => x"06075351", -101 => x"04000000", -102 => x"00000000", -103 => x"00000000", -104 => x"71715351", -105 => x"020d0406", -106 => x"73830609", -107 => x"81058205", -108 => x"832b0b2b", -109 => x"0772fc06", -110 => x"0c515104", -111 => x"00000000", -112 => x"72098105", -113 => x"72050970", -114 => x"81050906", -115 => x"0a810653", -116 => x"51040000", -117 => x"00000000", -118 => x"00000000", -119 => x"00000000", -120 => x"72098105", -121 => x"72050970", -122 => x"81050906", -123 => x"0a098106", -124 => x"53510400", -125 => x"00000000", -126 => x"00000000", -127 => x"00000000", -128 => x"71098105", -129 => x"52040000", -130 => x"00000000", -131 => x"00000000", -132 => x"00000000", -133 => x"00000000", -134 => x"00000000", -135 => x"00000000", -136 => x"72720981", -137 => x"05055351", -138 => x"04000000", -139 => x"00000000", -140 => x"00000000", -141 => x"00000000", -142 => x"00000000", -143 => x"00000000", -144 => x"72097206", -145 => x"73730906", -146 => x"07535104", -147 => x"00000000", -148 => x"00000000", -149 => x"00000000", -150 => x"00000000", -151 => x"00000000", -152 => x"71fc0608", -153 => x"72830609", -154 => x"81058305", -155 => x"1010102a", -156 => x"81ff0652", -157 => x"04000000", -158 => x"00000000", -159 => x"00000000", -160 => x"71fc0608", -161 => x"0b0b80d5", -162 => x"e0738306", -163 => x"10100508", -164 => x"060b0b0b", -165 => x"88a90400", -166 => x"00000000", -167 => x"00000000", -168 => x"80088408", -169 => x"88087575", -170 => x"0b0b0bad", -171 => x"aa2d5050", -172 => x"80085688", -173 => x"0c840c80", -174 => x"0c510400", -175 => x"00000000", -176 => x"80088408", -177 => x"88087575", -178 => x"0b0b0bad", -179 => x"ee2d5050", -180 => x"80085688", -181 => x"0c840c80", -182 => x"0c510400", -183 => x"00000000", -184 => x"72097081", -185 => x"0509060a", -186 => x"8106ff05", -187 => x"70547106", -188 => x"73097274", -189 => x"05ff0506", -190 => x"07515151", -191 => x"04000000", -192 => x"72097081", -193 => x"0509060a", -194 => x"098106ff", -195 => x"05705471", -196 => x"06730972", -197 => x"7405ff05", -198 => x"06075151", -199 => x"51040000", -200 => x"05ff0504", -201 => x"00000000", -202 => x"00000000", -203 => x"00000000", -204 => x"00000000", -205 => x"00000000", -206 => x"00000000", -207 => x"00000000", -208 => x"810b0b0b", -209 => x"80d5f00c", -210 => x"51040000", -211 => x"00000000", -212 => x"00000000", -213 => x"00000000", -214 => x"00000000", -215 => x"00000000", -216 => x"71810552", -217 => x"04000000", -218 => x"00000000", -219 => x"00000000", -220 => x"00000000", -221 => x"00000000", -222 => x"00000000", -223 => x"00000000", -224 => x"00000000", -225 => x"00000000", -226 => x"00000000", -227 => x"00000000", -228 => x"00000000", -229 => x"00000000", -230 => x"00000000", -231 => x"00000000", -232 => x"02840572", -233 => x"10100552", -234 => x"04000000", -235 => x"00000000", -236 => x"00000000", -237 => x"00000000", -238 => x"00000000", -239 => x"00000000", -240 => x"00000000", -241 => x"00000000", -242 => x"00000000", -243 => x"00000000", -244 => x"00000000", -245 => x"00000000", -246 => x"00000000", -247 => x"00000000", -248 => x"717105ff", -249 => x"05715351", -250 => x"020d0400", -251 => x"00000000", -252 => x"00000000", -253 => x"00000000", -254 => x"00000000", -255 => x"00000000", -256 => x"82fd3fbf", -257 => x"a03f0410", -258 => x"10101010", -259 => x"10101010", -260 => x"10101010", -261 => x"10101010", -262 => x"10101010", -263 => x"10101010", -264 => x"10101010", -265 => x"10105351", -266 => x"047381ff", -267 => x"06738306", -268 => x"09810583", -269 => x"05101010", -270 => x"2b0772fc", -271 => x"060c5151", -272 => x"043c0472", -273 => x"72807281", -274 => x"06ff0509", -275 => x"72060571", -276 => x"1052720a", -277 => x"100a5372", -278 => x"ed385151", -279 => x"535104ff", -280 => x"3d0d0b0b", -281 => x"80e5e408", -282 => x"52710870", -283 => x"882a8132", -284 => x"70810651", -285 => x"515170f1", -286 => x"3873720c", -287 => x"833d0d04", -288 => x"80d5f008", -289 => x"802ea438", -290 => x"80d5f408", -291 => x"822ebd38", -292 => x"8380800b", -293 => x"0b0b80e5", -294 => x"e40c82a0", -295 => x"800b80e5", -296 => x"e80c8290", -297 => x"800b80e5", -298 => x"ec0c04f8", -299 => x"808080a4", -300 => x"0b0b0b80", -301 => x"e5e40cf8", -302 => x"80808280", -303 => x"0b80e5e8", -304 => x"0cf88080", -305 => x"84800b80", -306 => x"e5ec0c04", -307 => x"80c0a880", -308 => x"8c0b0b0b", -309 => x"80e5e40c", -310 => x"80c0a880", -311 => x"940b80e5", -312 => x"e80c0b0b", -313 => x"80c7d00b", -314 => x"80e5ec0c", -315 => x"04f23d0d", -316 => x"6080e5e8", -317 => x"08565d82", -318 => x"750c8059", -319 => x"805a800b", -320 => x"8f3d5d5b", -321 => x"7a101015", -322 => x"70087108", -323 => x"719f2c7e", -324 => x"852b5855", -325 => x"557d5359", -326 => x"5799993f", -327 => x"7d7f7a72", -328 => x"077c7207", -329 => x"71716081", -330 => x"05415f5d", -331 => x"5b595755", -332 => x"817b278f", -333 => x"38767d0c", -334 => x"77841e0c", -335 => x"7c800c90", -336 => x"3d0d0480", -337 => x"e5e80855", -338 => x"ffba3970", -339 => x"7080e5f0", -340 => x"335170a7", -341 => x"3880d5fc", -342 => x"08700852", -343 => x"5270802e", -344 => x"94388412", -345 => x"80d5fc0c", -346 => x"702d80d5", -347 => x"fc087008", -348 => x"525270ee", -349 => x"38810b80", -350 => x"e5f03450", -351 => x"50040470", -352 => x"0b0b80e5", -353 => x"e008802e", -354 => x"8e380b0b", -355 => x"0b0b800b", -356 => x"802e0981", -357 => x"06833850", -358 => x"040b0b80", -359 => x"e5e0510b", -360 => x"0b0bf4dc", -361 => x"3f500404", -362 => x"ff3d0d02", -363 => x"8f053352", -364 => x"718a2e8a", -365 => x"387151fd", -366 => x"a63f833d", -367 => x"0d048d51", -368 => x"fd9d3f71", -369 => x"51fd983f", -370 => x"833d0d04", -371 => x"ce3d0db5", -372 => x"3d707084", -373 => x"0552088b", -374 => x"a85c56a5", -375 => x"3d5e5c80", -376 => x"75708105", -377 => x"5733765b", -378 => x"55587378", -379 => x"2e80c138", -380 => x"8e3d5b73", -381 => x"a52e0981", -382 => x"0680c538", -383 => x"78708105", -384 => x"5a335473", -385 => x"80e42e81", -386 => x"b6387380", -387 => x"e42480c6", -388 => x"387380e3", -389 => x"2ea13880", -390 => x"52a55179", -391 => x"2d805273", -392 => x"51792d82", -393 => x"18587870", -394 => x"81055a33", -395 => x"5473c438", -396 => x"77800cb4", -397 => x"3d0d047b", -398 => x"841d8312", -399 => x"33565d57", -400 => x"80527351", -401 => x"792d8118", -402 => x"79708105", -403 => x"5b335558", -404 => x"73ffa038", -405 => x"db397380", -406 => x"f32e0981", -407 => x"06ffb838", -408 => x"7b841d71", -409 => x"08595d56", -410 => x"80773355", -411 => x"5673762e", -412 => x"8d388116", -413 => x"70187033", -414 => x"57555674", -415 => x"f538ff16", -416 => x"55807625", -417 => x"ffa03876", -418 => x"70810558", -419 => x"33548052", -420 => x"7351792d", -421 => x"811875ff", -422 => x"17575758", -423 => x"807625ff", -424 => x"85387670", -425 => x"81055833", -426 => x"54805273", -427 => x"51792d81", -428 => x"1875ff17", -429 => x"57575875", -430 => x"8024cc38", -431 => x"fee8397b", -432 => x"841d7108", -433 => x"70719f2c", -434 => x"5953595d", -435 => x"56807524", -436 => x"81913875", -437 => x"7d7c5856", -438 => x"54805773", -439 => x"772e0981", -440 => x"06b638b0", -441 => x"7b3402b5", -442 => x"05567a76", -443 => x"2e9738ff", -444 => x"16567533", -445 => x"75708105", -446 => x"57348117", -447 => x"577a762e", -448 => x"098106eb", -449 => x"38807534", -450 => x"767dff12", -451 => x"57585675", -452 => x"8024fef3", -453 => x"38fe8f39", -454 => x"8a527351", -455 => x"9fd03f80", -456 => x"0880c7d4", -457 => x"05337670", -458 => x"81055834", -459 => x"8a527351", -460 => x"9ef83f80", -461 => x"08548008", -462 => x"802effae", -463 => x"388a5273", -464 => x"519fab3f", -465 => x"800880c7", -466 => x"d4053376", -467 => x"70810558", -468 => x"348a5273", -469 => x"519ed33f", -470 => x"80085480", -471 => x"08ffb938", -472 => x"ff883974", -473 => x"527653b4", -474 => x"3dffb805", -475 => x"51949a3f", -476 => x"a33d0856", -477 => x"fedd3980", -478 => x"3d0d80c1", -479 => x"0b81b4bc", -480 => x"34800b81", -481 => x"b6980c70", -482 => x"800c823d", -483 => x"0d04ff3d", -484 => x"0d800b81", -485 => x"b4bc3352", -486 => x"527080c1", -487 => x"2e993871", -488 => x"81b69808", -489 => x"0781b698", -490 => x"0c80c20b", -491 => x"81b4c034", -492 => x"70800c83", -493 => x"3d0d0481", -494 => x"0b81b698", -495 => x"080781b6", -496 => x"980c80c2", -497 => x"0b81b4c0", -498 => x"3470800c", -499 => x"833d0d04", -500 => x"fd3d0d75", -501 => x"70088a05", -502 => x"535381b4", -503 => x"bc335170", -504 => x"80c12e8b", -505 => x"3873f338", -506 => x"70800c85", -507 => x"3d0d04ff", -508 => x"127081b4", -509 => x"b8083174", -510 => x"0c800c85", -511 => x"3d0d04fc", -512 => x"3d0d81b4", -513 => x"c4085574", -514 => x"802e8c38", -515 => x"76750871", -516 => x"0c81b4c4", -517 => x"0856548c", -518 => x"155381b4", -519 => x"b808528a", -520 => x"518fd43f", -521 => x"73800c86", -522 => x"3d0d04fb", -523 => x"3d0d7770", -524 => x"085656b0", -525 => x"5381b4c4", -526 => x"08527451", -527 => x"ab943f85", -528 => x"0b8c170c", -529 => x"850b8c16", -530 => x"0c750875", -531 => x"0c81b4c4", -532 => x"08547380", -533 => x"2e8a3873", -534 => x"08750c81", -535 => x"b4c40854", -536 => x"8c145381", -537 => x"b4b80852", -538 => x"8a518f8b", -539 => x"3f841508", -540 => x"ad38860b", -541 => x"8c160c88", -542 => x"15528816", -543 => x"08518e97", -544 => x"3f81b4c4", -545 => x"08700876", -546 => x"0c548c15", -547 => x"7054548a", -548 => x"52730851", -549 => x"8ee13f73", -550 => x"800c873d", -551 => x"0d047508", -552 => x"54b05373", -553 => x"527551aa", -554 => x"a93f7380", -555 => x"0c873d0d", -556 => x"04d93d0d", -557 => x"b0519dcf", -558 => x"3f800881", -559 => x"b4b40cb0", -560 => x"519dc43f", -561 => x"800881b4", -562 => x"c40c81b4", -563 => x"b4088008", -564 => x"0c800b80", -565 => x"0884050c", -566 => x"820b8008", -567 => x"88050ca8", -568 => x"0b80088c", -569 => x"050c9f53", -570 => x"80c7e052", -571 => x"80089005", -572 => x"51a9df3f", -573 => x"a13d5e9f", -574 => x"5380c880", -575 => x"527d51a9", -576 => x"d13f8a0b", -577 => x"80f2f80c", -578 => x"80d2a451", -579 => x"f9be3f80", -580 => x"c8a051f9", -581 => x"b73f80d2", -582 => x"a451f9b0", -583 => x"3f80d684", -584 => x"08802e89", -585 => x"d33880c8", -586 => x"d051f9a0", -587 => x"3f80d2a4", -588 => x"51f9993f", -589 => x"80d68008", -590 => x"5280c8fc", -591 => x"51f98d3f", -592 => x"80e69451", -593 => x"b2ff3f81", -594 => x"0b9a3d5e", -595 => x"5b800b80", -596 => x"d6800825", -597 => x"82d43890", -598 => x"3d5f80c1", -599 => x"0b81b4bc", -600 => x"34810b81", -601 => x"b6980c80", -602 => x"c20b81b4", -603 => x"c0348240", -604 => x"835a9f53", -605 => x"80c9ac52", -606 => x"7c51a8d6", -607 => x"3f814180", -608 => x"7d537e52", -609 => x"568e943f", -610 => x"8008762e", -611 => x"09810683", -612 => x"38815675", -613 => x"81b6980c", -614 => x"7f705856", -615 => x"758325a2", -616 => x"38751010", -617 => x"16fd0542", -618 => x"a93dffa4", -619 => x"05538352", -620 => x"76518cc3", -621 => x"3f7f8105", -622 => x"70417058", -623 => x"56837624", -624 => x"e0386154", -625 => x"755380e6", -626 => x"9c5281b4", -627 => x"d0518cb7", -628 => x"3f81b4c4", -629 => x"08700858", -630 => x"58b05377", -631 => x"527651a7", -632 => x"f13f850b", -633 => x"8c190c85", -634 => x"0b8c180c", -635 => x"7708770c", -636 => x"81b4c408", -637 => x"5675802e", -638 => x"8a387508", -639 => x"770c81b4", -640 => x"c408568c", -641 => x"165381b4", -642 => x"b808528a", -643 => x"518be83f", -644 => x"84170887", -645 => x"ea38860b", -646 => x"8c180c88", -647 => x"17528818", -648 => x"08518af3", -649 => x"3f81b4c4", -650 => x"08700878", -651 => x"0c568c17", -652 => x"7054598a", -653 => x"52780851", -654 => x"8bbd3f80", -655 => x"c10b81b4", -656 => x"c0335757", -657 => x"767626a2", -658 => x"3880c352", -659 => x"76518ca1", -660 => x"3f800861", -661 => x"2e89e438", -662 => x"81177081", -663 => x"ff0681b4", -664 => x"c0335858", -665 => x"58757727", -666 => x"e0387960", -667 => x"29627054", -668 => x"71535b59", -669 => x"98b43f80", -670 => x"0840787a", -671 => x"31708729", -672 => x"80083180", -673 => x"088a0581", -674 => x"b4bc3381", -675 => x"b4b8085e", -676 => x"5b525a56", -677 => x"7780c12e", -678 => x"89ce387b", -679 => x"f738811b", -680 => x"5b80d680", -681 => x"087b25fd", -682 => x"b13881b4", -683 => x"ac51b095", -684 => x"3f80c9cc", -685 => x"51f6953f", -686 => x"80d2a451", -687 => x"f68e3f80", -688 => x"c9dc51f6", -689 => x"873f80d2", -690 => x"a451f680", -691 => x"3f81b4b8", -692 => x"085280ca", -693 => x"9451f5f4", -694 => x"3f855280", -695 => x"cab051f5", -696 => x"eb3f81b6", -697 => x"98085280", -698 => x"cacc51f5", -699 => x"df3f8152", -700 => x"80cab051", -701 => x"f5d63f81", -702 => x"b4bc3352", -703 => x"80cae851", -704 => x"f5ca3f80", -705 => x"c15280cb", -706 => x"8451f5c0", -707 => x"3f81b4c0", -708 => x"335280cb", -709 => x"a051f5b4", -710 => x"3f80c252", -711 => x"80cb8451", -712 => x"f5aa3f81", -713 => x"b4f00852", -714 => x"80cbbc51", -715 => x"f59e3f87", -716 => x"5280cab0", -717 => x"51f5953f", -718 => x"80f2f808", -719 => x"5280cbd8", -720 => x"51f5893f", -721 => x"80cbf451", -722 => x"f5823f80", -723 => x"cca051f4", -724 => x"fb3f81b4", -725 => x"c4087008", -726 => x"535a80cc", -727 => x"ac51f4ec", -728 => x"3f80ccc8", -729 => x"51f4e53f", -730 => x"81b4c408", -731 => x"84110853", -732 => x"5680ccfc", -733 => x"51f4d53f", -734 => x"805280ca", -735 => x"b051f4cc", -736 => x"3f81b4c4", -737 => x"08881108", -738 => x"535880cd", -739 => x"9851f4bc", -740 => x"3f825280", -741 => x"cab051f4", -742 => x"b33f81b4", -743 => x"c4088c11", -744 => x"08535780", -745 => x"cdb451f4", -746 => x"a33f9152", -747 => x"80cab051", -748 => x"f49a3f81", -749 => x"b4c40890", -750 => x"055280cd", -751 => x"d051f48c", -752 => x"3f80cdec", -753 => x"51f4853f", -754 => x"80cea451", -755 => x"f3fe3f81", -756 => x"b4b40870", -757 => x"08535f80", -758 => x"ccac51f3", -759 => x"ef3f80ce", -760 => x"b851f3e8", -761 => x"3f81b4b4", -762 => x"08841108", -763 => x"535b80cc", -764 => x"fc51f3d8", -765 => x"3f805280", -766 => x"cab051f3", -767 => x"cf3f81b4", -768 => x"b4088811", -769 => x"08535c80", -770 => x"cd9851f3", -771 => x"bf3f8152", -772 => x"80cab051", -773 => x"f3b63f81", -774 => x"b4b4088c", -775 => x"1108535a", -776 => x"80cdb451", -777 => x"f3a63f92", -778 => x"5280cab0", -779 => x"51f39d3f", -780 => x"81b4b408", -781 => x"90055280", -782 => x"cdd051f3", -783 => x"8f3f80cd", -784 => x"ec51f388", -785 => x"3f7f5280", -786 => x"cef851f2", -787 => x"ff3f8552", -788 => x"80cab051", -789 => x"f2f63f78", -790 => x"5280cf94", -791 => x"51f2ed3f", -792 => x"8d5280ca", -793 => x"b051f2e4", -794 => x"3f615280", -795 => x"cfb051f2", -796 => x"db3f8752", -797 => x"80cab051", -798 => x"f2d23f60", -799 => x"5280cfcc", -800 => x"51f2c93f", -801 => x"815280ca", -802 => x"b051f2c0", -803 => x"3f7d5280", -804 => x"cfe851f2", -805 => x"b73f80d0", -806 => x"8451f2b0", -807 => x"3f7c5280", -808 => x"d0bc51f2", -809 => x"a73f80d0", -810 => x"d851f2a0", -811 => x"3f80d2a4", -812 => x"51f2993f", -813 => x"81b4ac08", -814 => x"81b4b008", -815 => x"80e69408", -816 => x"80e69808", -817 => x"72713170", -818 => x"74267574", -819 => x"31707231", -820 => x"80e68c0c", -821 => x"444480e6", -822 => x"900c80e6", -823 => x"90085680", -824 => x"d190555c", -825 => x"595758f1", -826 => x"e33f80e6", -827 => x"8c085680", -828 => x"762582a3", -829 => x"3880d680", -830 => x"0870719f", -831 => x"2c9a3d53", -832 => x"565680e6", -833 => x"8c0880e6", -834 => x"90084153", -835 => x"7f547052", -836 => x"5a89eb3f", -837 => x"66685f80", -838 => x"e5fc0c7d", -839 => x"80e6800c", -840 => x"80d68008", -841 => x"709f2c58", -842 => x"568058bd", -843 => x"84c07855", -844 => x"55765275", -845 => x"53795187", -846 => x"d13f953d", -847 => x"80e68c08", -848 => x"80e69008", -849 => x"41557f56", -850 => x"67694053", -851 => x"7e547052", -852 => x"5c89ab3f", -853 => x"64665e80", -854 => x"e6840c7c", -855 => x"80e6880c", -856 => x"80d68008", -857 => x"709f2c40", -858 => x"58805783", -859 => x"dceb9480", -860 => x"7755557e", -861 => x"5277537b", -862 => x"51878f3f", -863 => x"64665d5b", -864 => x"805e8ddd", -865 => x"7e555580", -866 => x"e68c0880", -867 => x"e6900859", -868 => x"52775379", -869 => x"5186f33f", -870 => x"66684054", -871 => x"7e557a52", -872 => x"7b53a93d", -873 => x"ffa80551", -874 => x"88d43f62", -875 => x"645e81b4", -876 => x"c80c7c81", -877 => x"b4cc0c80", -878 => x"d1a051f0", -879 => x"8f3f80e6", -880 => x"80085280", -881 => x"d1d051f0", -882 => x"833f80d1", -883 => x"d851effc", -884 => x"3f80e688", -885 => x"085280d1", -886 => x"d051eff0", -887 => x"3f81b4cc", -888 => x"085280d2", -889 => x"8851efe4", -890 => x"3f80d2a4", -891 => x"51efdd3f", -892 => x"800b800c", -893 => x"a93d0d04", -894 => x"80d2a851", -895 => x"f6ac3977", -896 => x"0857b053", -897 => x"76527751", -898 => x"9fc83f80", -899 => x"c10b81b4", -900 => x"c0335757", -901 => x"f8ae3975", -902 => x"8a3880e6", -903 => x"90088126", -904 => x"fdd33880", -905 => x"d2d851ef", -906 => x"a33f80d3", -907 => x"9051ef9c", -908 => x"3f80d2a4", -909 => x"51ef953f", -910 => x"80d68008", -911 => x"70719f2c", -912 => x"9a3d5356", -913 => x"5680e68c", -914 => x"0880e690", -915 => x"0841537f", -916 => x"5470525a", -917 => x"87a83f66", -918 => x"685f80e5", -919 => x"fc0c7d80", -920 => x"e6800c80", -921 => x"d6800870", -922 => x"9f2c5856", -923 => x"8058bd84", -924 => x"c0785555", -925 => x"76527553", -926 => x"7951858e", -927 => x"3f953d80", -928 => x"e68c0880", -929 => x"e6900841", -930 => x"557f5667", -931 => x"6940537e", -932 => x"5470525c", -933 => x"86e83f64", -934 => x"665e80e6", -935 => x"840c7c80", -936 => x"e6880c80", -937 => x"d6800870", -938 => x"9f2c4058", -939 => x"805783dc", -940 => x"eb948077", -941 => x"55557e52", -942 => x"77537b51", -943 => x"84cc3f64", -944 => x"665d5b80", -945 => x"5e8ddd7e", -946 => x"555580e6", -947 => x"8c0880e6", -948 => x"90085952", -949 => x"77537951", -950 => x"84b03f66", -951 => x"6840547e", -952 => x"557a527b", -953 => x"53a93dff", -954 => x"a8055186", -955 => x"913f6264", -956 => x"5e81b4c8", -957 => x"0c7c81b4", -958 => x"cc0c80d1", -959 => x"a051edcc", -960 => x"3f80e680", -961 => x"085280d1", -962 => x"d051edc0", -963 => x"3f80d1d8", -964 => x"51edb93f", -965 => x"80e68808", -966 => x"5280d1d0", -967 => x"51edad3f", -968 => x"81b4cc08", -969 => x"5280d288", -970 => x"51eda13f", -971 => x"80d2a451", -972 => x"ed9a3f80", -973 => x"0b800ca9", -974 => x"3d0d04a9", -975 => x"3dffa005", -976 => x"52805180", -977 => x"d23f9f53", -978 => x"80d3b052", -979 => x"7c519d82", -980 => x"3f7a7b81", -981 => x"b4b80c81", -982 => x"187081ff", -983 => x"0681b4c0", -984 => x"33595959", -985 => x"5af5fe39", -986 => x"ff16707b", -987 => x"31600c5c", -988 => x"800b811c", -989 => x"5c5c80d6", -990 => x"80087b25", -991 => x"f3dc38f6", -992 => x"a939ff3d", -993 => x"0d738232", -994 => x"70307072", -995 => x"07802580", -996 => x"0c525283", -997 => x"3d0d04fe", -998 => x"3d0d7476", -999 => x"71535452", -1000 => x"71822e83", -1001 => x"38835171", -1002 => x"812e9a38", -1003 => x"8172269f", -1004 => x"3871822e", -1005 => x"b8387184", -1006 => x"2ea93870", -1007 => x"730c7080", -1008 => x"0c843d0d", -1009 => x"0480e40b", -1010 => x"81b4b808", -1011 => x"258b3880", -1012 => x"730c7080", -1013 => x"0c843d0d", -1014 => x"0483730c", -1015 => x"70800c84", -1016 => x"3d0d0482", -1017 => x"730c7080", -1018 => x"0c843d0d", -1019 => x"0481730c", -1020 => x"70800c84", -1021 => x"3d0d0480", -1022 => x"3d0d7474", -1023 => x"14820571", -1024 => x"0c800c82", -1025 => x"3d0d04f7", -1026 => x"3d0d7b7d", -1027 => x"7f618512", -1028 => x"70822b75", -1029 => x"11707471", -1030 => x"70840553", -1031 => x"0c5a5a5d", -1032 => x"5b760c79", -1033 => x"80f8180c", -1034 => x"79861252", -1035 => x"57585a5a", -1036 => x"76762499", -1037 => x"3876b329", -1038 => x"822b7911", -1039 => x"51537673", -1040 => x"70840555", -1041 => x"0c811454", -1042 => x"757425f2", -1043 => x"387681cc", -1044 => x"2919fc11", -1045 => x"088105fc", -1046 => x"120c7a19", -1047 => x"70089fa0", -1048 => x"130c5856", -1049 => x"850b81b4", -1050 => x"b80c7580", -1051 => x"0c8b3d0d", -1052 => x"04fe3d0d", -1053 => x"02930533", -1054 => x"51800284", -1055 => x"05970533", -1056 => x"54527073", -1057 => x"2e883871", -1058 => x"800c843d", -1059 => x"0d047081", -1060 => x"b4bc3481", -1061 => x"0b800c84", -1062 => x"3d0d04f8", -1063 => x"3d0d7a7c", -1064 => x"5956820b", -1065 => x"83195555", -1066 => x"74167033", -1067 => x"75335b51", -1068 => x"5372792e", -1069 => x"80c63880", -1070 => x"c10b8116", -1071 => x"81165656", -1072 => x"57827525", -1073 => x"e338ffa9", -1074 => x"177081ff", -1075 => x"06555973", -1076 => x"82268338", -1077 => x"87558153", -1078 => x"7680d22e", -1079 => x"98387752", -1080 => x"75519bc3", -1081 => x"3f805372", -1082 => x"80082589", -1083 => x"38871581", -1084 => x"b4b80c81", -1085 => x"5372800c", -1086 => x"8a3d0d04", -1087 => x"7281b4bc", -1088 => x"34827525", -1089 => x"ffa238ff", -1090 => x"bd39ef3d", -1091 => x"0d636567", -1092 => x"5b427943", -1093 => x"67695940", -1094 => x"77415a80", -1095 => x"5d805e61", -1096 => x"7083ffff", -1097 => x"0671902a", -1098 => x"627083ff", -1099 => x"ff067190", -1100 => x"2a747229", -1101 => x"74732975", -1102 => x"73297774", -1103 => x"2973902a", -1104 => x"05721151", -1105 => x"5856535f", -1106 => x"5a575a58", -1107 => x"55587373", -1108 => x"27863884", -1109 => x"80801656", -1110 => x"73902a16", -1111 => x"5b7883ff", -1112 => x"ff067484", -1113 => x"80802905", -1114 => x"5c7a7c5a", -1115 => x"5d785e77", -1116 => x"7f296178", -1117 => x"29057d05", -1118 => x"5d7c7e56", -1119 => x"7a0c7484", -1120 => x"1b0c7980", -1121 => x"0c933d0d", -1122 => x"04f93d0d", -1123 => x"797b7d54", -1124 => x"58725977", -1125 => x"30797030", -1126 => x"7072079f", -1127 => x"2a737131", -1128 => x"5a525977", -1129 => x"7956730c", -1130 => x"53738413", -1131 => x"0c54800c", -1132 => x"893d0d04", -1133 => x"f93d0d79", -1134 => x"7b7d7f56", -1135 => x"54525472", -1136 => x"802ea038", -1137 => x"70577158", -1138 => x"a0733152", -1139 => x"807225a1", -1140 => x"38777074", -1141 => x"2b577073", -1142 => x"2a78752b", -1143 => x"07565174", -1144 => x"76535170", -1145 => x"740c7184", -1146 => x"150c7380", -1147 => x"0c893d0d", -1148 => x"04805677", -1149 => x"72302b55", -1150 => x"74765351", -1151 => x"e639e43d", -1152 => x"0d6ea13d", -1153 => x"08a33d08", -1154 => x"59575f80", -1155 => x"764d774e", -1156 => x"a33d08a5", -1157 => x"3d08574b", -1158 => x"754c5e7d", -1159 => x"6c2486fb", -1160 => x"38806a24", -1161 => x"878f3869", -1162 => x"6b58566b", -1163 => x"6d5d467b", -1164 => x"47754476", -1165 => x"45646468", -1166 => x"685c5c56", -1167 => x"567481e7", -1168 => x"38787627", -1169 => x"82c73875", -1170 => x"81ff2683", -1171 => x"2b5583ff", -1172 => x"ff76278c", -1173 => x"389055fe", -1174 => x"800a7627", -1175 => x"83389855", -1176 => x"75752a80", -1177 => x"d3d00570", -1178 => x"33a07731", -1179 => x"71315755", -1180 => x"5774802e", -1181 => x"95387575", -1182 => x"2ba07631", -1183 => x"7a772b7c", -1184 => x"722a077c", -1185 => x"782b5d5b", -1186 => x"59567590", -1187 => x"2a7683ff", -1188 => x"ff067154", -1189 => x"7a535957", -1190 => x"88803f80", -1191 => x"085b87ea", -1192 => x"3f800880", -1193 => x"0879297c", -1194 => x"902b7c90", -1195 => x"2a075656", -1196 => x"59737527", -1197 => x"94388008", -1198 => x"ff057615", -1199 => x"55597574", -1200 => x"26873874", -1201 => x"742687b9", -1202 => x"38765273", -1203 => x"75315187", -1204 => x"c93f8008", -1205 => x"5587b33f", -1206 => x"80088008", -1207 => x"79297b83", -1208 => x"ffff0677", -1209 => x"902b0756", -1210 => x"59577378", -1211 => x"27963880", -1212 => x"08ff0576", -1213 => x"15555775", -1214 => x"74268938", -1215 => x"77742677", -1216 => x"71315856", -1217 => x"78902b77", -1218 => x"0758805b", -1219 => x"7a407741", -1220 => x"7f615654", -1221 => x"7d80d938", -1222 => x"737f0c74", -1223 => x"7f84050c", -1224 => x"7e800c9e", -1225 => x"3d0d0480", -1226 => x"705c5874", -1227 => x"7926dd38", -1228 => x"7481ff26", -1229 => x"832b5774", -1230 => x"83ffff26", -1231 => x"82a53874", -1232 => x"772a80d3", -1233 => x"d0057033", -1234 => x"a0793171", -1235 => x"31595c5d", -1236 => x"7682b338", -1237 => x"76547479", -1238 => x"27833881", -1239 => x"54797627", -1240 => x"74075981", -1241 => x"5878ffa2", -1242 => x"38765880", -1243 => x"5bff9d39", -1244 => x"73527453", -1245 => x"9e3de805", -1246 => x"51fc8e3f", -1247 => x"6769567f", -1248 => x"0c747f84", -1249 => x"050c7e80", -1250 => x"0c9e3d0d", -1251 => x"0475802e", -1252 => x"81c43875", -1253 => x"81ff2683", -1254 => x"2b5583ff", -1255 => x"ff76278c", -1256 => x"389055fe", -1257 => x"800a7627", -1258 => x"83389855", -1259 => x"75752a80", -1260 => x"d3d00570", -1261 => x"33a07731", -1262 => x"7131575e", -1263 => x"54748491", -1264 => x"38787631", -1265 => x"54817690", -1266 => x"2a7783ff", -1267 => x"ff065f5d", -1268 => x"5b7b5273", -1269 => x"5185c33f", -1270 => x"80085785", -1271 => x"ad3f8008", -1272 => x"80087e29", -1273 => x"78902b7c", -1274 => x"902a0756", -1275 => x"56597375", -1276 => x"27943880", -1277 => x"08ff0576", -1278 => x"15555975", -1279 => x"74268738", -1280 => x"74742684", -1281 => x"f3387b52", -1282 => x"73753151", -1283 => x"858c3f80", -1284 => x"085584f6", -1285 => x"3f800880", -1286 => x"087e297b", -1287 => x"83ffff06", -1288 => x"77902b07", -1289 => x"56595773", -1290 => x"78279638", -1291 => x"8008ff05", -1292 => x"76155557", -1293 => x"75742689", -1294 => x"38777426", -1295 => x"77713158", -1296 => x"5a78902b", -1297 => x"77077b41", -1298 => x"417f6156", -1299 => x"547d802e", -1300 => x"fdc638fe", -1301 => x"9b397552", -1302 => x"815184ae", -1303 => x"3f800856", -1304 => x"feb13990", -1305 => x"57fe800a", -1306 => x"7527fdd3", -1307 => x"38987571", -1308 => x"2a80d3d0", -1309 => x"057033a0", -1310 => x"73317131", -1311 => x"535d5e57", -1312 => x"76802efd", -1313 => x"cf38a077", -1314 => x"3175782b", -1315 => x"77722a07", -1316 => x"77792b7b", -1317 => x"7a2b7d74", -1318 => x"2a077d7b", -1319 => x"2b73902a", -1320 => x"7483ffff", -1321 => x"0671597f", -1322 => x"772a585e", -1323 => x"5c415f58", -1324 => x"5c5483e6", -1325 => x"3f800854", -1326 => x"83d03f80", -1327 => x"08800879", -1328 => x"2975902b", -1329 => x"7e902a07", -1330 => x"56565973", -1331 => x"75279938", -1332 => x"8008ff05", -1333 => x"7b155559", -1334 => x"7a74268c", -1335 => x"38737527", -1336 => x"8738ff19", -1337 => x"7b155559", -1338 => x"76527375", -1339 => x"315183aa", -1340 => x"3f800855", -1341 => x"83943f80", -1342 => x"08800879", -1343 => x"297d83ff", -1344 => x"ff067790", -1345 => x"2b075659", -1346 => x"57737827", -1347 => x"99388008", -1348 => x"ff057b15", -1349 => x"55577a74", -1350 => x"268c3873", -1351 => x"78278738", -1352 => x"ff177b15", -1353 => x"55577378", -1354 => x"3179902b", -1355 => x"78077083", -1356 => x"ffff0671", -1357 => x"902a7983", -1358 => x"ffff067a", -1359 => x"902a7372", -1360 => x"29737329", -1361 => x"74732976", -1362 => x"74297390", -1363 => x"2a057205", -1364 => x"5755435f", -1365 => x"5b585a57", -1366 => x"595a747c", -1367 => x"27863884", -1368 => x"80801757", -1369 => x"74902a17", -1370 => x"7983ffff", -1371 => x"06768480", -1372 => x"80290557", -1373 => x"57767a26", -1374 => x"9a38767a", -1375 => x"32703070", -1376 => x"72078025", -1377 => x"565a5b7c", -1378 => x"7627fafe", -1379 => x"3873802e", -1380 => x"faf838ff", -1381 => x"1858805b", -1382 => x"faf239ff", -1383 => x"76537754", -1384 => x"9f3de805", -1385 => x"525ef7e1", -1386 => x"3f676957", -1387 => x"4c754d69", -1388 => x"8025f8f3", -1389 => x"387d096a", -1390 => x"6c5c537a", -1391 => x"549f3de8", -1392 => x"05525ef7", -1393 => x"c43f6769", -1394 => x"714c704d", -1395 => x"5856f8db", -1396 => x"39a07531", -1397 => x"76762b7a", -1398 => x"772b7c73", -1399 => x"2a077c78", -1400 => x"2b72902a", -1401 => x"7383ffff", -1402 => x"0671587e", -1403 => x"762a5742", -1404 => x"405d5d57", -1405 => x"5881a33f", -1406 => x"80085781", -1407 => x"8d3f8008", -1408 => x"80087e29", -1409 => x"78902b7d", -1410 => x"902a0756", -1411 => x"56597375", -1412 => x"27993880", -1413 => x"08ff0576", -1414 => x"15555975", -1415 => x"74268c38", -1416 => x"73752787", -1417 => x"38ff1976", -1418 => x"1555597b", -1419 => x"52737531", -1420 => x"5180e73f", -1421 => x"80085580", -1422 => x"d13f8008", -1423 => x"80087e29", -1424 => x"7c83ffff", -1425 => x"06707890", -1426 => x"2b075156", -1427 => x"58587377", -1428 => x"27993880", -1429 => x"08ff0576", -1430 => x"15555875", -1431 => x"74268c38", -1432 => x"73772787", -1433 => x"38ff1876", -1434 => x"15555878", -1435 => x"902b7807", -1436 => x"74783155", -1437 => x"5bfada39", -1438 => x"ff197615", -1439 => x"5559fb86", -1440 => x"39ff1976", -1441 => x"155559f8", -1442 => x"c0397070", -1443 => x"70805375", -1444 => x"52745181", -1445 => x"913f5050", -1446 => x"50047070", -1447 => x"70815375", -1448 => x"52745181", -1449 => x"813f5050", -1450 => x"5004fb3d", -1451 => x"0d777955", -1452 => x"55805675", -1453 => x"7524ab38", -1454 => x"8074249d", -1455 => x"38805373", -1456 => x"52745180", -1457 => x"e13f8008", -1458 => x"5475802e", -1459 => x"85388008", -1460 => x"30547380", -1461 => x"0c873d0d", -1462 => x"04733076", -1463 => x"81325754", -1464 => x"dc397430", -1465 => x"55815673", -1466 => x"8025d238", -1467 => x"ec39fa3d", -1468 => x"0d787a57", -1469 => x"55805776", -1470 => x"7524a438", -1471 => x"759f2c54", -1472 => x"81537574", -1473 => x"32743152", -1474 => x"74519b3f", -1475 => x"80085476", -1476 => x"802e8538", -1477 => x"80083054", -1478 => x"73800c88", -1479 => x"3d0d0474", -1480 => x"30558157", -1481 => x"d739fc3d", -1482 => x"0d767853", -1483 => x"54815380", -1484 => x"74732652", -1485 => x"5572802e", -1486 => x"98387080", -1487 => x"2eab3880", -1488 => x"7224a638", -1489 => x"71107310", -1490 => x"75722653", -1491 => x"545272ea", -1492 => x"38735178", -1493 => x"83387451", -1494 => x"70800c86", -1495 => x"3d0d0472", -1496 => x"0a100a72", -1497 => x"0a100a53", -1498 => x"5372802e", -1499 => x"e4387174", -1500 => x"26ed3873", -1501 => x"72317574", -1502 => x"07740a10", -1503 => x"0a740a10", -1504 => x"0a555556", -1505 => x"54e33970", -1506 => x"70735280", -1507 => x"decc0851", -1508 => x"933f5050", -1509 => x"04707073", -1510 => x"5280decc", -1511 => x"085190ce", -1512 => x"3f505004", -1513 => x"f43d0d7e", -1514 => x"608b1170", -1515 => x"f8065b55", -1516 => x"555d7296", -1517 => x"26833890", -1518 => x"58807824", -1519 => x"74792607", -1520 => x"55805474", -1521 => x"742e0981", -1522 => x"0680ca38", -1523 => x"7c518d9e", -1524 => x"3f7783f7", -1525 => x"2680c538", -1526 => x"77832a70", -1527 => x"10101080", -1528 => x"d6c4058c", -1529 => x"11085858", -1530 => x"5475772e", -1531 => x"81f03884", -1532 => x"1608fc06", -1533 => x"8c170888", -1534 => x"1808718c", -1535 => x"120c8812", -1536 => x"0c5b7605", -1537 => x"84110881", -1538 => x"0784120c", -1539 => x"537c518c", -1540 => x"de3f8816", -1541 => x"5473800c", -1542 => x"8e3d0d04", -1543 => x"77892a78", -1544 => x"832a5854", -1545 => x"73802ebf", -1546 => x"3877862a", -1547 => x"b8055784", -1548 => x"7427b438", -1549 => x"80db1457", -1550 => x"947427ab", -1551 => x"38778c2a", -1552 => x"80ee0557", -1553 => x"80d47427", -1554 => x"9e38778f", -1555 => x"2a80f705", -1556 => x"5782d474", -1557 => x"27913877", -1558 => x"922a80fc", -1559 => x"05578ad4", -1560 => x"74278438", -1561 => x"80fe5776", -1562 => x"10101080", -1563 => x"d6c4058c", -1564 => x"11085653", -1565 => x"74732ea3", -1566 => x"38841508", -1567 => x"fc067079", -1568 => x"31555673", -1569 => x"8f2488e4", -1570 => x"38738025", -1571 => x"88e6388c", -1572 => x"15085574", -1573 => x"732e0981", -1574 => x"06df3881", -1575 => x"175980d6", -1576 => x"d4085675", -1577 => x"80d6cc2e", -1578 => x"82cc3884", -1579 => x"1608fc06", -1580 => x"70793155", -1581 => x"55738f24", -1582 => x"bb3880d6", -1583 => x"cc0b80d6", -1584 => x"d80c80d6", -1585 => x"cc0b80d6", -1586 => x"d40c8074", -1587 => x"2480db38", -1588 => x"74168411", -1589 => x"08810784", -1590 => x"120c53fe", -1591 => x"b0398816", -1592 => x"8c110857", -1593 => x"5975792e", -1594 => x"098106fe", -1595 => x"82388214", -1596 => x"59ffab39", -1597 => x"77167881", -1598 => x"0784180c", -1599 => x"7080d6d8", -1600 => x"0c7080d6", -1601 => x"d40c80d6", -1602 => x"cc0b8c12", -1603 => x"0c8c1108", -1604 => x"88120c74", -1605 => x"81078412", -1606 => x"0c740574", -1607 => x"710c5b7c", -1608 => x"518acc3f", -1609 => x"881654fd", -1610 => x"ec3983ff", -1611 => x"75278391", -1612 => x"3874892a", -1613 => x"75832a54", -1614 => x"5473802e", -1615 => x"bf387486", -1616 => x"2ab80553", -1617 => x"847427b4", -1618 => x"3880db14", -1619 => x"53947427", -1620 => x"ab38748c", -1621 => x"2a80ee05", -1622 => x"5380d474", -1623 => x"279e3874", -1624 => x"8f2a80f7", -1625 => x"055382d4", -1626 => x"74279138", -1627 => x"74922a80", -1628 => x"fc05538a", -1629 => x"d4742784", -1630 => x"3880fe53", -1631 => x"72101010", -1632 => x"80d6c405", -1633 => x"88110855", -1634 => x"5773772e", -1635 => x"868b3884", -1636 => x"1408fc06", -1637 => x"5b747b27", -1638 => x"8d388814", -1639 => x"08547377", -1640 => x"2e098106", -1641 => x"ea388c14", -1642 => x"0880d6c4", -1643 => x"0b840508", -1644 => x"718c190c", -1645 => x"7588190c", -1646 => x"7788130c", -1647 => x"5c57758c", -1648 => x"150c7853", -1649 => x"80792483", -1650 => x"98387282", -1651 => x"2c81712b", -1652 => x"5656747b", -1653 => x"2680ca38", -1654 => x"7a750657", -1655 => x"7682a338", -1656 => x"78fc0684", -1657 => x"05597410", -1658 => x"707c0655", -1659 => x"55738292", -1660 => x"38841959", -1661 => x"f13980d6", -1662 => x"c40b8405", -1663 => x"0879545b", -1664 => x"788025c6", -1665 => x"3882da39", -1666 => x"74097b06", -1667 => x"7080d6c4", -1668 => x"0b84050c", -1669 => x"5b741055", -1670 => x"747b2685", -1671 => x"387485bc", -1672 => x"3880d6c4", -1673 => x"0b880508", -1674 => x"70841208", -1675 => x"fc06707b", -1676 => x"317b7226", -1677 => x"8f722507", -1678 => x"5d575c5c", -1679 => x"5578802e", -1680 => x"80d93879", -1681 => x"1580d6bc", -1682 => x"08199011", -1683 => x"59545680", -1684 => x"d6b808ff", -1685 => x"2e8838a0", -1686 => x"8f13e080", -1687 => x"06577652", -1688 => x"7c51888c", -1689 => x"3f800854", -1690 => x"8008ff2e", -1691 => x"90388008", -1692 => x"762782a7", -1693 => x"387480d6", -1694 => x"c42e829f", -1695 => x"3880d6c4", -1696 => x"0b880508", -1697 => x"55841508", -1698 => x"fc067079", -1699 => x"31797226", -1700 => x"8f722507", -1701 => x"5d555a7a", -1702 => x"83f23877", -1703 => x"81078416", -1704 => x"0c771570", -1705 => x"80d6c40b", -1706 => x"88050c74", -1707 => x"81078412", -1708 => x"0c567c51", -1709 => x"87b93f88", -1710 => x"15547380", -1711 => x"0c8e3d0d", -1712 => x"0474832a", -1713 => x"70545480", -1714 => x"7424819b", -1715 => x"3872822c", -1716 => x"81712b80", -1717 => x"d6c80807", -1718 => x"7080d6c4", -1719 => x"0b84050c", -1720 => x"75101010", -1721 => x"80d6c405", -1722 => x"88110871", -1723 => x"8c1b0c70", -1724 => x"881b0c79", -1725 => x"88130c57", -1726 => x"555c5575", -1727 => x"8c150cfd", -1728 => x"c1397879", -1729 => x"10101080", -1730 => x"d6c40570", -1731 => x"565b5c8c", -1732 => x"14085675", -1733 => x"742ea338", -1734 => x"841608fc", -1735 => x"06707931", -1736 => x"5853768f", -1737 => x"2483f138", -1738 => x"76802584", -1739 => x"af388c16", -1740 => x"08567574", -1741 => x"2e098106", -1742 => x"df388814", -1743 => x"811a7083", -1744 => x"06555a54", -1745 => x"72c9387b", -1746 => x"83065675", -1747 => x"802efdb8", -1748 => x"38ff1cf8", -1749 => x"1b5b5c88", -1750 => x"1a087a2e", -1751 => x"ea38fdb5", -1752 => x"39831953", -1753 => x"fce43983", -1754 => x"1470822c", -1755 => x"81712b80", -1756 => x"d6c80807", -1757 => x"7080d6c4", -1758 => x"0b84050c", -1759 => x"76101010", -1760 => x"80d6c405", -1761 => x"88110871", -1762 => x"8c1c0c70", -1763 => x"881c0c7a", -1764 => x"88130c58", -1765 => x"535d5653", -1766 => x"fee13980", -1767 => x"d6880817", -1768 => x"59800876", -1769 => x"2e818b38", -1770 => x"80d6b808", -1771 => x"ff2e848e", -1772 => x"38737631", -1773 => x"1980d688", -1774 => x"0c738706", -1775 => x"70565372", -1776 => x"802e8838", -1777 => x"88733170", -1778 => x"15555576", -1779 => x"149fff06", -1780 => x"a0807131", -1781 => x"1670547e", -1782 => x"53515385", -1783 => x"933f8008", -1784 => x"568008ff", -1785 => x"2e819e38", -1786 => x"80d68808", -1787 => x"137080d6", -1788 => x"880c7475", -1789 => x"80d6c40b", -1790 => x"88050c77", -1791 => x"76311581", -1792 => x"07555659", -1793 => x"7a80d6c4", -1794 => x"2e83c038", -1795 => x"798f2682", -1796 => x"ef38810b", -1797 => x"84150c84", -1798 => x"1508fc06", -1799 => x"70793179", -1800 => x"72268f72", -1801 => x"25075d55", -1802 => x"5a7a802e", -1803 => x"fced3880", -1804 => x"db398008", -1805 => x"9fff0655", -1806 => x"74feed38", -1807 => x"7880d688", -1808 => x"0c80d6c4", -1809 => x"0b880508", -1810 => x"7a188107", -1811 => x"84120c55", -1812 => x"80d6b408", -1813 => x"79278638", -1814 => x"7880d6b4", -1815 => x"0c80d6b0", -1816 => x"087927fc", -1817 => x"a0387880", -1818 => x"d6b00c84", -1819 => x"1508fc06", -1820 => x"70793179", -1821 => x"72268f72", -1822 => x"25075d55", -1823 => x"5a7a802e", -1824 => x"fc993888", -1825 => x"39807457", -1826 => x"53fedd39", -1827 => x"7c5183df", -1828 => x"3f800b80", -1829 => x"0c8e3d0d", -1830 => x"04807324", -1831 => x"a5387282", -1832 => x"2c81712b", -1833 => x"80d6c808", -1834 => x"077080d6", -1835 => x"c40b8405", -1836 => x"0c5c5a76", -1837 => x"8c170c73", -1838 => x"88170c75", -1839 => x"88180cf9", -1840 => x"fd398313", -1841 => x"70822c81", -1842 => x"712b80d6", -1843 => x"c8080770", -1844 => x"80d6c40b", -1845 => x"84050c5d", -1846 => x"5b53d839", -1847 => x"7a75065c", -1848 => x"7bfc9f38", -1849 => x"84197510", -1850 => x"5659f139", -1851 => x"ff178105", -1852 => x"59f7ab39", -1853 => x"8c150888", -1854 => x"1608718c", -1855 => x"120c8812", -1856 => x"0c597515", -1857 => x"84110881", -1858 => x"0784120c", -1859 => x"587c5182", -1860 => x"de3f8815", -1861 => x"54fba339", -1862 => x"77167881", -1863 => x"0784180c", -1864 => x"8c170888", -1865 => x"1808718c", -1866 => x"120c8812", -1867 => x"0c5c7080", -1868 => x"d6d80c70", -1869 => x"80d6d40c", -1870 => x"80d6cc0b", -1871 => x"8c120c8c", -1872 => x"11088812", -1873 => x"0c778107", -1874 => x"84120c77", -1875 => x"0577710c", -1876 => x"557c5182", -1877 => x"9a3f8816", -1878 => x"54f5ba39", -1879 => x"72168411", -1880 => x"08810784", -1881 => x"120c588c", -1882 => x"16088817", -1883 => x"08718c12", -1884 => x"0c88120c", -1885 => x"577c5181", -1886 => x"f63f8816", -1887 => x"54f59639", -1888 => x"7284150c", -1889 => x"f41af806", -1890 => x"70841d08", -1891 => x"81060784", -1892 => x"1d0c701c", -1893 => x"5556850b", -1894 => x"84150c85", -1895 => x"0b88150c", -1896 => x"8f7627fd", -1897 => x"ab38881b", -1898 => x"527c5184", -1899 => x"c13f80d6", -1900 => x"c40b8805", -1901 => x"0880d688", -1902 => x"085a55fd", -1903 => x"93397880", -1904 => x"d6880c73", -1905 => x"80d6b80c", -1906 => x"fbef3972", -1907 => x"84150cfc", -1908 => x"ff39fb3d", -1909 => x"0d77707a", -1910 => x"7c585553", -1911 => x"568f7527", -1912 => x"80e63872", -1913 => x"76078306", -1914 => x"517080dc", -1915 => x"38757352", -1916 => x"54707084", -1917 => x"05520874", -1918 => x"70840556", -1919 => x"0c737170", -1920 => x"84055308", -1921 => x"71708405", -1922 => x"530c7170", -1923 => x"84055308", -1924 => x"71708405", -1925 => x"530c7170", -1926 => x"84055308", -1927 => x"71708405", -1928 => x"530cf016", -1929 => x"5654748f", -1930 => x"26c73883", -1931 => x"75279538", -1932 => x"70708405", -1933 => x"52087470", -1934 => x"8405560c", -1935 => x"fc155574", -1936 => x"8326ed38", -1937 => x"73715452", -1938 => x"ff155170", -1939 => x"ff2e9838", -1940 => x"72708105", -1941 => x"54337270", -1942 => x"81055434", -1943 => x"ff115170", -1944 => x"ff2e0981", -1945 => x"06ea3875", -1946 => x"800c873d", -1947 => x"0d040404", -1948 => x"70707070", -1949 => x"800b81b6", -1950 => x"9c0c7651", -1951 => x"87cc3f80", -1952 => x"08538008", -1953 => x"ff2e8938", -1954 => x"72800c50", -1955 => x"50505004", -1956 => x"81b69c08", -1957 => x"5473802e", -1958 => x"ef387574", -1959 => x"710c5272", -1960 => x"800c5050", -1961 => x"505004fb", -1962 => x"3d0d7779", -1963 => x"70720783", -1964 => x"06535452", -1965 => x"70933871", -1966 => x"73730854", -1967 => x"56547173", -1968 => x"082e80c4", -1969 => x"38737554", -1970 => x"52713370", -1971 => x"81ff0652", -1972 => x"5470802e", -1973 => x"9d387233", -1974 => x"5570752e", -1975 => x"09810695", -1976 => x"38811281", -1977 => x"14713370", -1978 => x"81ff0654", -1979 => x"56545270", -1980 => x"e5387233", -1981 => x"557381ff", -1982 => x"067581ff", -1983 => x"06717131", -1984 => x"800c5552", -1985 => x"873d0d04", -1986 => x"7109f7fb", -1987 => x"fdff1306", -1988 => x"f8848281", -1989 => x"80065271", -1990 => x"97388414", -1991 => x"84167108", -1992 => x"54565471", -1993 => x"75082ee0", -1994 => x"38737554", -1995 => x"52ff9a39", -1996 => x"800b800c", -1997 => x"873d0d04", -1998 => x"fb3d0d77", -1999 => x"705256fe", -2000 => x"ad3f80d6", -2001 => x"c40b8805", -2002 => x"08841108", -2003 => x"fc06707b", -2004 => x"319fef05", -2005 => x"e08006e0", -2006 => x"80055255", -2007 => x"55a08075", -2008 => x"24943880", -2009 => x"527551fe", -2010 => x"873f80d6", -2011 => x"cc081453", -2012 => x"7280082e", -2013 => x"8f387551", -2014 => x"fdf53f80", -2015 => x"5372800c", -2016 => x"873d0d04", -2017 => x"74305275", -2018 => x"51fde53f", -2019 => x"8008ff2e", -2020 => x"a83880d6", -2021 => x"c40b8805", -2022 => x"08747631", -2023 => x"81078412", -2024 => x"0c5380d6", -2025 => x"88087531", -2026 => x"80d6880c", -2027 => x"7551fdbf", -2028 => x"3f810b80", -2029 => x"0c873d0d", -2030 => x"04805275", -2031 => x"51fdb13f", -2032 => x"80d6c40b", -2033 => x"88050880", -2034 => x"08713154", -2035 => x"548f7325", -2036 => x"ffa43880", -2037 => x"0880d6b8", -2038 => x"083180d6", -2039 => x"880c7281", -2040 => x"0784150c", -2041 => x"7551fd87", -2042 => x"3f8053ff", -2043 => x"9039f73d", -2044 => x"0d7b7d54", -2045 => x"5a72802e", -2046 => x"82833879", -2047 => x"51fcef3f", -2048 => x"f8138411", -2049 => x"0870fe06", -2050 => x"70138411", -2051 => x"08fc065c", -2052 => x"57585457", -2053 => x"80d6cc08", -2054 => x"742e82de", -2055 => x"38778415", -2056 => x"0c807381", -2057 => x"06565974", -2058 => x"792e81d5", -2059 => x"38771484", -2060 => x"11088106", -2061 => x"565374a0", -2062 => x"38771656", -2063 => x"7881e638", -2064 => x"88140855", -2065 => x"7480d6cc", -2066 => x"2e82f938", -2067 => x"8c140870", -2068 => x"8c170c75", -2069 => x"88120c58", -2070 => x"75810784", -2071 => x"180c7517", -2072 => x"76710c54", -2073 => x"78819138", -2074 => x"83ff7627", -2075 => x"81c83875", -2076 => x"892a7683", -2077 => x"2a545473", -2078 => x"802ebf38", -2079 => x"75862ab8", -2080 => x"05538474", -2081 => x"27b43880", -2082 => x"db145394", -2083 => x"7427ab38", -2084 => x"758c2a80", -2085 => x"ee055380", -2086 => x"d474279e", -2087 => x"38758f2a", -2088 => x"80f70553", -2089 => x"82d47427", -2090 => x"91387592", -2091 => x"2a80fc05", -2092 => x"538ad474", -2093 => x"27843880", -2094 => x"fe537210", -2095 => x"101080d6", -2096 => x"c4058811", -2097 => x"08555573", -2098 => x"752e82bf", -2099 => x"38841408", -2100 => x"fc065975", -2101 => x"79278d38", -2102 => x"88140854", -2103 => x"73752e09", -2104 => x"8106ea38", -2105 => x"8c140870", -2106 => x"8c190c74", -2107 => x"88190c77", -2108 => x"88120c55", -2109 => x"768c150c", -2110 => x"7951faf3", -2111 => x"3f8b3d0d", -2112 => x"04760877", -2113 => x"71315876", -2114 => x"05881808", -2115 => x"56567480", -2116 => x"d6cc2e80", -2117 => x"e0388c17", -2118 => x"08708c17", -2119 => x"0c758812", -2120 => x"0c53fe89", -2121 => x"39881408", -2122 => x"8c150870", -2123 => x"8c130c59", -2124 => x"88190cfe", -2125 => x"a3397583", -2126 => x"2a705454", -2127 => x"80742481", -2128 => x"98387282", -2129 => x"2c81712b", -2130 => x"80d6c808", -2131 => x"0780d6c4", -2132 => x"0b84050c", -2133 => x"74101010", -2134 => x"80d6c405", -2135 => x"88110871", -2136 => x"8c1b0c70", -2137 => x"881b0c79", -2138 => x"88130c56", -2139 => x"5a55768c", -2140 => x"150cff84", -2141 => x"398159fd", -2142 => x"b4397716", -2143 => x"73810654", -2144 => x"55729838", -2145 => x"76087771", -2146 => x"31587505", -2147 => x"8c180888", -2148 => x"1908718c", -2149 => x"120c8812", -2150 => x"0c555574", -2151 => x"81078418", -2152 => x"0c7680d6", -2153 => x"c40b8805", -2154 => x"0c80d6c0", -2155 => x"087526fe", -2156 => x"c73880d6", -2157 => x"bc085279", -2158 => x"51fafd3f", -2159 => x"7951f9af", -2160 => x"3ffeba39", -2161 => x"81778c17", -2162 => x"0c778817", -2163 => x"0c758c19", -2164 => x"0c758819", -2165 => x"0c59fd80", -2166 => x"39831470", -2167 => x"822c8171", -2168 => x"2b80d6c8", -2169 => x"080780d6", -2170 => x"c40b8405", -2171 => x"0c751010", -2172 => x"1080d6c4", -2173 => x"05881108", -2174 => x"718c1c0c", -2175 => x"70881c0c", -2176 => x"7a88130c", -2177 => x"575b5653", -2178 => x"fee43980", -2179 => x"7324a338", -2180 => x"72822c81", -2181 => x"712b80d6", -2182 => x"c8080780", -2183 => x"d6c40b84", -2184 => x"050c5874", -2185 => x"8c180c73", -2186 => x"88180c76", -2187 => x"88160cfd", -2188 => x"c3398313", -2189 => x"70822c81", -2190 => x"712b80d6", -2191 => x"c8080780", -2192 => x"d6c40b84", -2193 => x"050c5953", -2194 => x"da397070", -2195 => x"7080e5f4", -2196 => x"08893881", -2197 => x"b6a00b80", -2198 => x"e5f40c80", -2199 => x"e5f40875", -2200 => x"115252ff", -2201 => x"537087fb", -2202 => x"80802688", -2203 => x"387080e5", -2204 => x"f40c7153", -2205 => x"72800c50", -2206 => x"505004fd", -2207 => x"3d0d800b", -2208 => x"80d5f408", -2209 => x"54547281", -2210 => x"2e9b3873", -2211 => x"80e5f80c", -2212 => x"c3ee3fc2", -2213 => x"eb3f80e5", -2214 => x"cc528151", -2215 => x"cc933f80", -2216 => x"085180dd", -2217 => x"3f7280e5", -2218 => x"f80cc3d4", -2219 => x"3fc2d13f", -2220 => x"80e5cc52", -2221 => x"8151cbf9", -2222 => x"3f800851", -2223 => x"80c33f00", -2224 => x"ff3900ff", -2225 => x"39f43d0d", -2226 => x"7e80e5ec", -2227 => x"08700870", -2228 => x"81ff0692", -2229 => x"3df80555", -2230 => x"515a5759", -2231 => x"c48f3f80", -2232 => x"5477557b", -2233 => x"7d585276", -2234 => x"538e3df0", -2235 => x"0551de8e", -2236 => x"3f797b58", -2237 => x"790c7684", -2238 => x"1a0c7880", -2239 => x"0c8e3d0d", -2240 => x"04f73d0d", -2241 => x"7b80decc", -2242 => x"0882c811", -2243 => x"085a545a", -2244 => x"77802e80", -2245 => x"da388188", -2246 => x"18841908", -2247 => x"ff058171", -2248 => x"2b595559", -2249 => x"80742480", -2250 => x"ea388074", -2251 => x"24b53873", -2252 => x"822b7811", -2253 => x"88055656", -2254 => x"81801908", -2255 => x"77065372", -2256 => x"802eb638", -2257 => x"78167008", -2258 => x"53537951", -2259 => x"74085372", -2260 => x"2dff14fc", -2261 => x"17fc1779", -2262 => x"812c5a57", -2263 => x"57547380", -2264 => x"25d63877", -2265 => x"085877ff", -2266 => x"ad3880de", -2267 => x"cc0853bc", -2268 => x"1308a538", -2269 => x"7951fec7", -2270 => x"3f740853", -2271 => x"722dff14", -2272 => x"fc17fc17", -2273 => x"79812c5a", -2274 => x"57575473", -2275 => x"8025ffa8", -2276 => x"38d13980", -2277 => x"57ff9339", -2278 => x"7251bc13", -2279 => x"0854732d", -2280 => x"7951fe9b", -2281 => x"3f707080", -2282 => x"e5d40bfc", -2283 => x"05700852", -2284 => x"5270ff2e", -2285 => x"9138702d", -2286 => x"fc127008", -2287 => x"525270ff", -2288 => x"2e098106", -2289 => x"f1385050", -2290 => x"0404c2ff", -2291 => x"3f040000", -2292 => x"00000040", -2293 => x"30313233", -2294 => x"34353637", -2295 => x"38390000", -2296 => x"44485259", -2297 => x"53544f4e", -2298 => x"45205052", -2299 => x"4f475241", -2300 => x"4d2c2053", -2301 => x"4f4d4520", -2302 => x"53545249", -2303 => x"4e470000", -2304 => x"44485259", -2305 => x"53544f4e", -2306 => x"45205052", -2307 => x"4f475241", -2308 => x"4d2c2031", -2309 => x"27535420", -2310 => x"53545249", -2311 => x"4e470000", -2312 => x"44687279", -2313 => x"73746f6e", -2314 => x"65204265", -2315 => x"6e63686d", -2316 => x"61726b2c", -2317 => x"20566572", -2318 => x"73696f6e", -2319 => x"20322e31", -2320 => x"20284c61", -2321 => x"6e677561", -2322 => x"67653a20", -2323 => x"43290a00", -2324 => x"50726f67", -2325 => x"72616d20", -2326 => x"636f6d70", -2327 => x"696c6564", -2328 => x"20776974", -2329 => x"68202772", -2330 => x"65676973", -2331 => x"74657227", -2332 => x"20617474", -2333 => x"72696275", -2334 => x"74650a00", -2335 => x"45786563", -2336 => x"7574696f", -2337 => x"6e207374", -2338 => x"61727473", -2339 => x"2c202564", -2340 => x"2072756e", -2341 => x"73207468", -2342 => x"726f7567", -2343 => x"68204468", -2344 => x"72797374", -2345 => x"6f6e650a", -2346 => x"00000000", -2347 => x"44485259", -2348 => x"53544f4e", -2349 => x"45205052", -2350 => x"4f475241", -2351 => x"4d2c2032", -2352 => x"274e4420", -2353 => x"53545249", -2354 => x"4e470000", -2355 => x"45786563", -2356 => x"7574696f", -2357 => x"6e20656e", -2358 => x"64730a00", -2359 => x"46696e61", -2360 => x"6c207661", -2361 => x"6c756573", -2362 => x"206f6620", -2363 => x"74686520", -2364 => x"76617269", -2365 => x"61626c65", -2366 => x"73207573", -2367 => x"65642069", -2368 => x"6e207468", -2369 => x"65206265", -2370 => x"6e63686d", -2371 => x"61726b3a", -2372 => x"0a000000", -2373 => x"496e745f", -2374 => x"476c6f62", -2375 => x"3a202020", -2376 => x"20202020", -2377 => x"20202020", -2378 => x"2025640a", -2379 => x"00000000", -2380 => x"20202020", -2381 => x"20202020", -2382 => x"73686f75", -2383 => x"6c642062", -2384 => x"653a2020", -2385 => x"2025640a", -2386 => x"00000000", -2387 => x"426f6f6c", -2388 => x"5f476c6f", -2389 => x"623a2020", -2390 => x"20202020", -2391 => x"20202020", -2392 => x"2025640a", -2393 => x"00000000", -2394 => x"43685f31", -2395 => x"5f476c6f", -2396 => x"623a2020", -2397 => x"20202020", -2398 => x"20202020", -2399 => x"2025630a", -2400 => x"00000000", -2401 => x"20202020", -2402 => x"20202020", -2403 => x"73686f75", -2404 => x"6c642062", -2405 => x"653a2020", -2406 => x"2025630a", -2407 => x"00000000", -2408 => x"43685f32", -2409 => x"5f476c6f", -2410 => x"623a2020", -2411 => x"20202020", -2412 => x"20202020", -2413 => x"2025630a", -2414 => x"00000000", -2415 => x"4172725f", -2416 => x"315f476c", -2417 => x"6f625b38", -2418 => x"5d3a2020", -2419 => x"20202020", -2420 => x"2025640a", -2421 => x"00000000", -2422 => x"4172725f", -2423 => x"325f476c", -2424 => x"6f625b38", -2425 => x"5d5b375d", -2426 => x"3a202020", -2427 => x"2025640a", -2428 => x"00000000", -2429 => x"20202020", -2430 => x"20202020", -2431 => x"73686f75", -2432 => x"6c642062", -2433 => x"653a2020", -2434 => x"204e756d", -2435 => x"6265725f", -2436 => x"4f665f52", -2437 => x"756e7320", -2438 => x"2b203130", -2439 => x"0a000000", -2440 => x"5074725f", -2441 => x"476c6f62", -2442 => x"2d3e0a00", -2443 => x"20205074", -2444 => x"725f436f", -2445 => x"6d703a20", -2446 => x"20202020", -2447 => x"20202020", -2448 => x"2025640a", -2449 => x"00000000", -2450 => x"20202020", -2451 => x"20202020", -2452 => x"73686f75", -2453 => x"6c642062", -2454 => x"653a2020", -2455 => x"2028696d", -2456 => x"706c656d", -2457 => x"656e7461", -2458 => x"74696f6e", -2459 => x"2d646570", -2460 => x"656e6465", -2461 => x"6e74290a", -2462 => x"00000000", -2463 => x"20204469", -2464 => x"7363723a", -2465 => x"20202020", -2466 => x"20202020", -2467 => x"20202020", -2468 => x"2025640a", -2469 => x"00000000", -2470 => x"2020456e", -2471 => x"756d5f43", -2472 => x"6f6d703a", -2473 => x"20202020", -2474 => x"20202020", -2475 => x"2025640a", -2476 => x"00000000", -2477 => x"2020496e", -2478 => x"745f436f", -2479 => x"6d703a20", -2480 => x"20202020", -2481 => x"20202020", -2482 => x"2025640a", -2483 => x"00000000", -2484 => x"20205374", -2485 => x"725f436f", -2486 => x"6d703a20", -2487 => x"20202020", -2488 => x"20202020", -2489 => x"2025730a", -2490 => x"00000000", -2491 => x"20202020", -2492 => x"20202020", -2493 => x"73686f75", -2494 => x"6c642062", -2495 => x"653a2020", -2496 => x"20444852", -2497 => x"5953544f", -2498 => x"4e452050", -2499 => x"524f4752", -2500 => x"414d2c20", -2501 => x"534f4d45", -2502 => x"20535452", -2503 => x"494e470a", -2504 => x"00000000", -2505 => x"4e657874", -2506 => x"5f507472", -2507 => x"5f476c6f", -2508 => x"622d3e0a", -2509 => x"00000000", -2510 => x"20202020", -2511 => x"20202020", -2512 => x"73686f75", -2513 => x"6c642062", -2514 => x"653a2020", -2515 => x"2028696d", -2516 => x"706c656d", -2517 => x"656e7461", -2518 => x"74696f6e", -2519 => x"2d646570", -2520 => x"656e6465", -2521 => x"6e74292c", -2522 => x"2073616d", -2523 => x"65206173", -2524 => x"2061626f", -2525 => x"76650a00", -2526 => x"496e745f", -2527 => x"315f4c6f", -2528 => x"633a2020", -2529 => x"20202020", -2530 => x"20202020", -2531 => x"2025640a", -2532 => x"00000000", -2533 => x"496e745f", -2534 => x"325f4c6f", -2535 => x"633a2020", -2536 => x"20202020", -2537 => x"20202020", -2538 => x"2025640a", -2539 => x"00000000", -2540 => x"496e745f", -2541 => x"335f4c6f", -2542 => x"633a2020", -2543 => x"20202020", -2544 => x"20202020", -2545 => x"2025640a", -2546 => x"00000000", -2547 => x"456e756d", -2548 => x"5f4c6f63", -2549 => x"3a202020", -2550 => x"20202020", -2551 => x"20202020", -2552 => x"2025640a", -2553 => x"00000000", -2554 => x"5374725f", -2555 => x"315f4c6f", -2556 => x"633a2020", -2557 => x"20202020", -2558 => x"20202020", -2559 => x"2025730a", -2560 => x"00000000", -2561 => x"20202020", -2562 => x"20202020", -2563 => x"73686f75", -2564 => x"6c642062", -2565 => x"653a2020", -2566 => x"20444852", -2567 => x"5953544f", -2568 => x"4e452050", -2569 => x"524f4752", -2570 => x"414d2c20", -2571 => x"31275354", -2572 => x"20535452", -2573 => x"494e470a", -2574 => x"00000000", -2575 => x"5374725f", -2576 => x"325f4c6f", -2577 => x"633a2020", -2578 => x"20202020", -2579 => x"20202020", -2580 => x"2025730a", -2581 => x"00000000", -2582 => x"20202020", -2583 => x"20202020", -2584 => x"73686f75", -2585 => x"6c642062", -2586 => x"653a2020", -2587 => x"20444852", -2588 => x"5953544f", -2589 => x"4e452050", -2590 => x"524f4752", -2591 => x"414d2c20", -2592 => x"32274e44", -2593 => x"20535452", -2594 => x"494e470a", -2595 => x"00000000", -2596 => x"55736572", -2597 => x"2074696d", -2598 => x"653a2025", -2599 => x"640a0000", -2600 => x"4d696372", -2601 => x"6f736563", -2602 => x"6f6e6473", -2603 => x"20666f72", -2604 => x"206f6e65", -2605 => x"2072756e", -2606 => x"20746872", -2607 => x"6f756768", -2608 => x"20446872", -2609 => x"7973746f", -2610 => x"6e653a20", -2611 => x"00000000", -2612 => x"2564200a", -2613 => x"00000000", -2614 => x"44687279", -2615 => x"73746f6e", -2616 => x"65732070", -2617 => x"65722053", -2618 => x"65636f6e", -2619 => x"643a2020", -2620 => x"20202020", -2621 => x"20202020", -2622 => x"20202020", -2623 => x"20202020", -2624 => x"20202020", -2625 => x"00000000", -2626 => x"56415820", -2627 => x"4d495053", -2628 => x"20726174", -2629 => x"696e6720", -2630 => x"2a203130", -2631 => x"3030203d", -2632 => x"20256420", -2633 => x"0a000000", -2634 => x"50726f67", -2635 => x"72616d20", -2636 => x"636f6d70", -2637 => x"696c6564", -2638 => x"20776974", -2639 => x"686f7574", -2640 => x"20277265", -2641 => x"67697374", -2642 => x"65722720", -2643 => x"61747472", -2644 => x"69627574", -2645 => x"650a0000", -2646 => x"4d656173", -2647 => x"75726564", -2648 => x"2074696d", -2649 => x"6520746f", -2650 => x"6f20736d", -2651 => x"616c6c20", -2652 => x"746f206f", -2653 => x"62746169", -2654 => x"6e206d65", -2655 => x"616e696e", -2656 => x"6766756c", -2657 => x"20726573", -2658 => x"756c7473", -2659 => x"0a000000", -2660 => x"506c6561", -2661 => x"73652069", -2662 => x"6e637265", -2663 => x"61736520", -2664 => x"6e756d62", -2665 => x"6572206f", -2666 => x"66207275", -2667 => x"6e730a00", -2668 => x"44485259", -2669 => x"53544f4e", -2670 => x"45205052", -2671 => x"4f475241", -2672 => x"4d2c2033", -2673 => x"27524420", -2674 => x"53545249", -2675 => x"4e470000", -2676 => x"00010202", -2677 => x"03030303", -2678 => x"04040404", -2679 => x"04040404", -2680 => x"05050505", -2681 => x"05050505", -2682 => x"05050505", -2683 => x"05050505", -2684 => x"06060606", -2685 => x"06060606", -2686 => x"06060606", -2687 => x"06060606", -2688 => x"06060606", -2689 => x"06060606", -2690 => x"06060606", -2691 => x"06060606", -2692 => x"07070707", -2693 => x"07070707", -2694 => x"07070707", -2695 => x"07070707", -2696 => x"07070707", -2697 => x"07070707", -2698 => x"07070707", -2699 => x"07070707", -2700 => x"07070707", -2701 => x"07070707", -2702 => x"07070707", -2703 => x"07070707", -2704 => x"07070707", -2705 => x"07070707", -2706 => x"07070707", -2707 => x"07070707", -2708 => x"08080808", -2709 => x"08080808", -2710 => x"08080808", -2711 => x"08080808", -2712 => x"08080808", -2713 => x"08080808", -2714 => x"08080808", -2715 => x"08080808", -2716 => x"08080808", -2717 => x"08080808", -2718 => x"08080808", -2719 => x"08080808", -2720 => x"08080808", -2721 => x"08080808", -2722 => x"08080808", -2723 => x"08080808", -2724 => x"08080808", -2725 => x"08080808", -2726 => x"08080808", -2727 => x"08080808", -2728 => x"08080808", -2729 => x"08080808", -2730 => x"08080808", -2731 => x"08080808", -2732 => x"08080808", -2733 => x"08080808", -2734 => x"08080808", -2735 => x"08080808", -2736 => x"08080808", -2737 => x"08080808", -2738 => x"08080808", -2739 => x"08080808", -2740 => x"43000000", -2741 => x"64756d6d", -2742 => x"792e6578", -2743 => x"65000000", -2744 => x"00ffffff", -2745 => x"ff00ffff", -2746 => x"ffff00ff", -2747 => x"ffffff00", -2748 => x"00000000", -2749 => x"00000000", -2750 => x"00000000", -2751 => x"000032dc", -2752 => x"0000c350", -2753 => x"00000000", -2754 => x"00000000", -2755 => x"00000000", -2756 => x"00000000", -2757 => x"00000000", -2758 => x"00000000", -2759 => x"00000000", -2760 => x"00000000", -2761 => x"00000000", -2762 => x"00000000", -2763 => x"00000000", -2764 => x"00000000", -2765 => x"00000000", -2766 => x"ffffffff", -2767 => x"00000000", -2768 => x"00020000", -2769 => x"00000000", -2770 => x"00000000", -2771 => x"00002b44", -2772 => x"00002b44", -2773 => x"00002b4c", -2774 => x"00002b4c", -2775 => x"00002b54", -2776 => x"00002b54", -2777 => x"00002b5c", -2778 => x"00002b5c", -2779 => x"00002b64", -2780 => x"00002b64", -2781 => x"00002b6c", -2782 => x"00002b6c", -2783 => x"00002b74", -2784 => x"00002b74", -2785 => x"00002b7c", -2786 => x"00002b7c", -2787 => x"00002b84", -2788 => x"00002b84", -2789 => x"00002b8c", -2790 => x"00002b8c", -2791 => x"00002b94", -2792 => x"00002b94", -2793 => x"00002b9c", -2794 => x"00002b9c", -2795 => x"00002ba4", -2796 => x"00002ba4", -2797 => x"00002bac", -2798 => x"00002bac", -2799 => x"00002bb4", -2800 => x"00002bb4", -2801 => x"00002bbc", -2802 => x"00002bbc", -2803 => x"00002bc4", -2804 => x"00002bc4", -2805 => x"00002bcc", -2806 => x"00002bcc", -2807 => x"00002bd4", -2808 => x"00002bd4", -2809 => x"00002bdc", -2810 => x"00002bdc", -2811 => x"00002be4", -2812 => x"00002be4", -2813 => x"00002bec", -2814 => x"00002bec", -2815 => x"00002bf4", -2816 => x"00002bf4", -2817 => x"00002bfc", -2818 => x"00002bfc", -2819 => x"00002c04", -2820 => x"00002c04", -2821 => x"00002c0c", -2822 => x"00002c0c", -2823 => x"00002c14", -2824 => x"00002c14", -2825 => x"00002c1c", -2826 => x"00002c1c", -2827 => x"00002c24", -2828 => x"00002c24", -2829 => x"00002c2c", -2830 => x"00002c2c", -2831 => x"00002c34", -2832 => x"00002c34", -2833 => x"00002c3c", -2834 => x"00002c3c", -2835 => x"00002c44", -2836 => x"00002c44", -2837 => x"00002c4c", -2838 => x"00002c4c", -2839 => x"00002c54", -2840 => x"00002c54", -2841 => x"00002c5c", -2842 => x"00002c5c", -2843 => x"00002c64", -2844 => x"00002c64", -2845 => x"00002c6c", -2846 => x"00002c6c", -2847 => x"00002c74", -2848 => x"00002c74", -2849 => x"00002c7c", -2850 => x"00002c7c", -2851 => x"00002c84", -2852 => x"00002c84", -2853 => x"00002c8c", -2854 => x"00002c8c", -2855 => x"00002c94", -2856 => x"00002c94", -2857 => x"00002c9c", -2858 => x"00002c9c", -2859 => x"00002ca4", -2860 => x"00002ca4", -2861 => x"00002cac", -2862 => x"00002cac", -2863 => x"00002cb4", -2864 => x"00002cb4", -2865 => x"00002cbc", -2866 => x"00002cbc", -2867 => x"00002cc4", -2868 => x"00002cc4", -2869 => x"00002ccc", -2870 => x"00002ccc", -2871 => x"00002cd4", -2872 => x"00002cd4", -2873 => x"00002cdc", -2874 => x"00002cdc", -2875 => x"00002ce4", -2876 => x"00002ce4", -2877 => x"00002cec", -2878 => x"00002cec", -2879 => x"00002cf4", -2880 => x"00002cf4", -2881 => x"00002cfc", -2882 => x"00002cfc", -2883 => x"00002d04", -2884 => x"00002d04", -2885 => x"00002d0c", -2886 => x"00002d0c", -2887 => x"00002d14", -2888 => x"00002d14", -2889 => x"00002d1c", -2890 => x"00002d1c", -2891 => x"00002d24", -2892 => x"00002d24", -2893 => x"00002d2c", -2894 => x"00002d2c", -2895 => x"00002d34", -2896 => x"00002d34", -2897 => x"00002d3c", -2898 => x"00002d3c", -2899 => x"00002d44", -2900 => x"00002d44", -2901 => x"00002d4c", -2902 => x"00002d4c", -2903 => x"00002d54", -2904 => x"00002d54", -2905 => x"00002d5c", -2906 => x"00002d5c", -2907 => x"00002d64", -2908 => x"00002d64", -2909 => x"00002d6c", -2910 => x"00002d6c", -2911 => x"00002d74", -2912 => x"00002d74", -2913 => x"00002d7c", -2914 => x"00002d7c", -2915 => x"00002d84", -2916 => x"00002d84", -2917 => x"00002d8c", -2918 => x"00002d8c", -2919 => x"00002d94", -2920 => x"00002d94", -2921 => x"00002d9c", -2922 => x"00002d9c", -2923 => x"00002da4", -2924 => x"00002da4", -2925 => x"00002dac", -2926 => x"00002dac", -2927 => x"00002db4", -2928 => x"00002db4", -2929 => x"00002dbc", -2930 => x"00002dbc", -2931 => x"00002dc4", -2932 => x"00002dc4", -2933 => x"00002dcc", -2934 => x"00002dcc", -2935 => x"00002dd4", -2936 => x"00002dd4", -2937 => x"00002ddc", -2938 => x"00002ddc", -2939 => x"00002de4", -2940 => x"00002de4", -2941 => x"00002dec", -2942 => x"00002dec", -2943 => x"00002df4", -2944 => x"00002df4", -2945 => x"00002dfc", -2946 => x"00002dfc", -2947 => x"00002e04", -2948 => x"00002e04", -2949 => x"00002e0c", -2950 => x"00002e0c", -2951 => x"00002e14", -2952 => x"00002e14", -2953 => x"00002e1c", -2954 => x"00002e1c", -2955 => x"00002e24", -2956 => x"00002e24", -2957 => x"00002e2c", -2958 => x"00002e2c", -2959 => x"00002e34", -2960 => x"00002e34", -2961 => x"00002e3c", -2962 => x"00002e3c", -2963 => x"00002e44", -2964 => x"00002e44", -2965 => x"00002e4c", -2966 => x"00002e4c", -2967 => x"00002e54", -2968 => x"00002e54", -2969 => x"00002e5c", -2970 => x"00002e5c", -2971 => x"00002e64", -2972 => x"00002e64", -2973 => x"00002e6c", -2974 => x"00002e6c", -2975 => x"00002e74", -2976 => x"00002e74", -2977 => x"00002e7c", -2978 => x"00002e7c", -2979 => x"00002e84", -2980 => x"00002e84", -2981 => x"00002e8c", -2982 => x"00002e8c", -2983 => x"00002e94", -2984 => x"00002e94", -2985 => x"00002e9c", -2986 => x"00002e9c", -2987 => x"00002ea4", -2988 => x"00002ea4", -2989 => x"00002eac", -2990 => x"00002eac", -2991 => x"00002eb4", -2992 => x"00002eb4", -2993 => x"00002ebc", -2994 => x"00002ebc", -2995 => x"00002ec4", -2996 => x"00002ec4", -2997 => x"00002ecc", -2998 => x"00002ecc", -2999 => x"00002ed4", -3000 => x"00002ed4", -3001 => x"00002edc", -3002 => x"00002edc", -3003 => x"00002ee4", -3004 => x"00002ee4", -3005 => x"00002eec", -3006 => x"00002eec", -3007 => x"00002ef4", -3008 => x"00002ef4", -3009 => x"00002efc", -3010 => x"00002efc", -3011 => x"00002f04", -3012 => x"00002f04", -3013 => x"00002f0c", -3014 => x"00002f0c", -3015 => x"00002f14", -3016 => x"00002f14", -3017 => x"00002f1c", -3018 => x"00002f1c", -3019 => x"00002f24", -3020 => x"00002f24", -3021 => x"00002f2c", -3022 => x"00002f2c", -3023 => x"00002f34", -3024 => x"00002f34", -3025 => x"00002f3c", -3026 => x"00002f3c", -3027 => x"00002f50", -3028 => x"00000000", -3029 => x"000031b8", -3030 => x"00003214", -3031 => x"00003270", -3032 => x"00000000", -3033 => x"00000000", -3034 => x"00000000", -3035 => x"00000000", -3036 => x"00000000", -3037 => x"00000000", -3038 => x"00000000", -3039 => x"00000000", -3040 => x"00000000", -3041 => x"00002ad0", -3042 => x"00000000", -3043 => x"00000000", -3044 => x"00000000", -3045 => x"00000000", -3046 => x"00000000", -3047 => x"00000000", -3048 => x"00000000", -3049 => x"00000000", -3050 => x"00000000", -3051 => x"00000000", -3052 => x"00000000", -3053 => x"00000000", -3054 => x"00000000", -3055 => x"00000000", -3056 => x"00000000", -3057 => x"00000000", -3058 => x"00000000", -3059 => x"00000000", -3060 => x"00000000", -3061 => x"00000000", -3062 => x"00000000", -3063 => x"00000000", -3064 => x"00000000", -3065 => x"00000000", -3066 => x"00000000", -3067 => x"00000000", -3068 => x"00000000", -3069 => x"00000000", -3070 => x"00000001", -3071 => x"330eabcd", -3072 => x"1234e66d", -3073 => x"deec0005", -3074 => x"000b0000", -3075 => x"00000000", -3076 => x"00000000", -3077 => x"00000000", -3078 => x"00000000", -3079 => x"00000000", -3080 => x"00000000", -3081 => x"00000000", -3082 => x"00000000", -3083 => x"00000000", -3084 => x"00000000", -3085 => x"00000000", -3086 => x"00000000", -3087 => x"00000000", -3088 => x"00000000", -3089 => x"00000000", -3090 => x"00000000", -3091 => x"00000000", -3092 => x"00000000", -3093 => x"00000000", -3094 => x"00000000", -3095 => x"00000000", -3096 => x"00000000", -3097 => x"00000000", -3098 => x"00000000", -3099 => x"00000000", -3100 => x"00000000", -3101 => x"00000000", -3102 => x"00000000", -3103 => x"00000000", -3104 => x"00000000", -3105 => x"00000000", -3106 => x"00000000", -3107 => x"00000000", -3108 => x"00000000", -3109 => x"00000000", -3110 => x"00000000", -3111 => x"00000000", -3112 => x"00000000", -3113 => x"00000000", -3114 => x"00000000", -3115 => x"00000000", -3116 => x"00000000", -3117 => x"00000000", -3118 => x"00000000", -3119 => x"00000000", -3120 => x"00000000", -3121 => x"00000000", -3122 => x"00000000", -3123 => x"00000000", -3124 => x"00000000", -3125 => x"00000000", -3126 => x"00000000", -3127 => x"00000000", -3128 => x"00000000", -3129 => x"00000000", -3130 => x"00000000", -3131 => x"00000000", -3132 => x"00000000", -3133 => x"00000000", -3134 => x"00000000", -3135 => x"00000000", -3136 => x"00000000", -3137 => x"00000000", -3138 => x"00000000", -3139 => x"00000000", -3140 => x"00000000", -3141 => x"00000000", -3142 => x"00000000", -3143 => x"00000000", -3144 => x"00000000", -3145 => x"00000000", -3146 => x"00000000", -3147 => x"00000000", -3148 => x"00000000", -3149 => x"00000000", -3150 => x"00000000", -3151 => x"00000000", -3152 => x"00000000", -3153 => x"00000000", -3154 => x"00000000", -3155 => x"00000000", -3156 => x"00000000", -3157 => x"00000000", -3158 => x"00000000", -3159 => x"00000000", -3160 => x"00000000", -3161 => x"00000000", -3162 => x"00000000", -3163 => x"00000000", -3164 => x"00000000", -3165 => x"00000000", -3166 => x"00000000", -3167 => x"00000000", -3168 => x"00000000", -3169 => x"00000000", -3170 => x"00000000", -3171 => x"00000000", -3172 => x"00000000", -3173 => x"00000000", -3174 => x"00000000", -3175 => x"00000000", -3176 => x"00000000", -3177 => x"00000000", -3178 => x"00000000", -3179 => x"00000000", -3180 => x"00000000", -3181 => x"00000000", -3182 => x"00000000", -3183 => x"00000000", -3184 => x"00000000", -3185 => x"00000000", -3186 => x"00000000", -3187 => x"00000000", -3188 => x"00000000", -3189 => x"00000000", -3190 => x"00000000", -3191 => x"00000000", -3192 => x"00000000", -3193 => x"00000000", -3194 => x"00000000", -3195 => x"00000000", -3196 => x"00000000", -3197 => x"00000000", -3198 => x"00000000", -3199 => x"00000000", -3200 => x"00000000", -3201 => x"00000000", -3202 => x"00000000", -3203 => x"00000000", -3204 => x"00000000", -3205 => x"00000000", -3206 => x"00000000", -3207 => x"00000000", -3208 => x"00000000", -3209 => x"00000000", -3210 => x"00000000", -3211 => x"00000000", -3212 => x"00000000", -3213 => x"00000000", -3214 => x"00000000", -3215 => x"00000000", -3216 => x"00000000", -3217 => x"00000000", -3218 => x"00000000", -3219 => x"00000000", -3220 => x"00000000", -3221 => x"00000000", -3222 => x"00000000", -3223 => x"00000000", -3224 => x"00000000", -3225 => x"00000000", -3226 => x"00000000", -3227 => x"00000000", -3228 => x"00000000", -3229 => x"00000000", -3230 => x"00000000", -3231 => x"00000000", -3232 => x"00000000", -3233 => x"00000000", -3234 => x"00000000", -3235 => x"00000000", -3236 => x"00000000", -3237 => x"00000000", -3238 => x"00000000", -3239 => x"00000000", -3240 => x"00000000", -3241 => x"00000000", -3242 => x"00000000", -3243 => x"00000000", -3244 => x"00000000", -3245 => x"00000000", -3246 => x"00000000", -3247 => x"00000000", -3248 => x"00000000", -3249 => x"00000000", -3250 => x"00000000", -3251 => x"00002ad4", -3252 => x"ffffffff", -3253 => x"00000000", -3254 => x"ffffffff", -3255 => x"00000000", - others => x"00000000" -); - -begin - -mem_busy<=mem_readEnable; -- we're done on the cycle after we serve the read request - -process (clk, areset) -begin - if areset = '1' then - elsif (clk'event and clk = '1') then - if (mem_writeEnable = '1') then - ram(to_integer(unsigned(mem_addr(maxAddrBit downto minAddrBit)))) := mem_write; - end if; - if (mem_readEnable = '1') then - mem_read <= ram(to_integer(unsigned(mem_addr(maxAddrBit downto minAddrBit)))); - end if; - end if; -end process; - - - - -end dram_arch; diff --git a/zpu/hdl/zpu4/src/dram_hello.vhd b/zpu/hdl/zpu4/src/dram_hello.vhd deleted file mode 100644 index 4f02cca..0000000 --- a/zpu/hdl/zpu4/src/dram_hello.vhd +++ /dev/null @@ -1,3107 +0,0 @@ -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; - - -library work; -use work.zpu_config.all; -use work.zpupkg.all; - -entity dram is -port (clk : in std_logic; -areset : std_logic; - mem_writeEnable : in std_logic; - mem_readEnable : in std_logic; - mem_addr : in std_logic_vector(maxAddrBit downto 0); - mem_write : in std_logic_vector(wordSize-1 downto 0); - mem_read : out std_logic_vector(wordSize-1 downto 0); - mem_busy : out std_logic; - mem_writeMask : in std_logic_vector(wordBytes-1 downto 0)); -end dram; - -architecture dram_arch of dram is - - -type ram_type is array(natural range 0 to ((2**(maxAddrBitDRAM+1))/4)-1) of std_logic_vector(wordSize-1 downto 0); - -shared variable ram : ram_type := -( -0 => x"0b0b0b0b", -1 => x"82700b0b", -2 => x"80cfd80c", -3 => x"3a0b0b80", -4 => x"c6d00400", -5 => x"00000000", -6 => x"00000000", -7 => x"00000000", -8 => x"80088408", -9 => x"88080b0b", -10 => x"80c7972d", -11 => x"880c840c", -12 => x"800c0400", -13 => x"00000000", -14 => x"00000000", -15 => x"00000000", -16 => x"71fd0608", -17 => x"72830609", -18 => x"81058205", -19 => x"832b2a83", -20 => x"ffff0652", -21 => x"04000000", -22 => x"00000000", -23 => x"00000000", -24 => x"71fd0608", -25 => x"83ffff73", -26 => x"83060981", -27 => x"05820583", -28 => x"2b2b0906", -29 => x"7383ffff", -30 => x"0b0b0b0b", -31 => x"83a70400", -32 => x"72098105", -33 => x"72057373", -34 => x"09060906", -35 => x"73097306", -36 => x"070a8106", -37 => x"53510400", -38 => x"00000000", -39 => x"00000000", -40 => x"72722473", -41 => x"732e0753", -42 => x"51040000", -43 => x"00000000", -44 => x"00000000", -45 => x"00000000", -46 => x"00000000", -47 => x"00000000", -48 => x"71737109", -49 => x"71068106", -50 => x"30720a10", -51 => x"0a720a10", -52 => x"0a31050a", -53 => x"81065151", -54 => x"53510400", -55 => x"00000000", -56 => x"72722673", -57 => x"732e0753", -58 => x"51040000", -59 => x"00000000", -60 => x"00000000", -61 => x"00000000", -62 => x"00000000", -63 => x"00000000", -64 => x"00000000", -65 => x"00000000", -66 => x"00000000", -67 => x"00000000", -68 => x"00000000", -69 => x"00000000", -70 => x"00000000", -71 => x"00000000", -72 => x"0b0b0b88", -73 => x"c4040000", -74 => x"00000000", -75 => x"00000000", -76 => x"00000000", -77 => x"00000000", -78 => x"00000000", -79 => x"00000000", -80 => x"720a722b", -81 => x"0a535104", -82 => x"00000000", -83 => x"00000000", -84 => x"00000000", -85 => x"00000000", -86 => x"00000000", -87 => x"00000000", -88 => x"72729f06", -89 => x"0981050b", -90 => x"0b0b88a7", -91 => x"05040000", -92 => x"00000000", -93 => x"00000000", -94 => x"00000000", -95 => x"00000000", -96 => x"72722aff", -97 => x"739f062a", -98 => x"0974090a", -99 => x"8106ff05", -100 => x"06075351", -101 => x"04000000", -102 => x"00000000", -103 => x"00000000", -104 => x"71715351", -105 => x"020d0406", -106 => x"73830609", -107 => x"81058205", -108 => x"832b0b2b", -109 => x"0772fc06", -110 => x"0c515104", -111 => x"00000000", -112 => x"72098105", -113 => x"72050970", -114 => x"81050906", -115 => x"0a810653", -116 => x"51040000", -117 => x"00000000", -118 => x"00000000", -119 => x"00000000", -120 => x"72098105", -121 => x"72050970", -122 => x"81050906", -123 => x"0a098106", -124 => x"53510400", -125 => x"00000000", -126 => x"00000000", -127 => x"00000000", -128 => x"71098105", -129 => x"52040000", -130 => x"00000000", -131 => x"00000000", -132 => x"00000000", -133 => x"00000000", -134 => x"00000000", -135 => x"00000000", -136 => x"72720981", -137 => x"05055351", -138 => x"04000000", -139 => x"00000000", -140 => x"00000000", -141 => x"00000000", -142 => x"00000000", -143 => x"00000000", -144 => x"72097206", -145 => x"73730906", -146 => x"07535104", -147 => x"00000000", -148 => x"00000000", -149 => x"00000000", -150 => x"00000000", -151 => x"00000000", -152 => x"71fc0608", -153 => x"72830609", -154 => x"81058305", -155 => x"1010102a", -156 => x"81ff0652", -157 => x"04000000", -158 => x"00000000", -159 => x"00000000", -160 => x"71fc0608", -161 => x"0b0b80cf", -162 => x"c4738306", -163 => x"10100508", -164 => x"060b0b0b", -165 => x"88aa0400", -166 => x"00000000", -167 => x"00000000", -168 => x"80088408", -169 => x"88087575", -170 => x"0b0b0b8b", -171 => x"9f2d5050", -172 => x"80085688", -173 => x"0c840c80", -174 => x"0c510400", -175 => x"00000000", -176 => x"80088408", -177 => x"88087575", -178 => x"0b0b0b8b", -179 => x"e32d5050", -180 => x"80085688", -181 => x"0c840c80", -182 => x"0c510400", -183 => x"00000000", -184 => x"72097081", -185 => x"0509060a", -186 => x"8106ff05", -187 => x"70547106", -188 => x"73097274", -189 => x"05ff0506", -190 => x"07515151", -191 => x"04000000", -192 => x"72097081", -193 => x"0509060a", -194 => x"098106ff", -195 => x"05705471", -196 => x"06730972", -197 => x"7405ff05", -198 => x"06075151", -199 => x"51040000", -200 => x"05ff0504", -201 => x"00000000", -202 => x"00000000", -203 => x"00000000", -204 => x"00000000", -205 => x"00000000", -206 => x"00000000", -207 => x"00000000", -208 => x"810b0b0b", -209 => x"80cfd40c", -210 => x"51040000", -211 => x"00000000", -212 => x"00000000", -213 => x"00000000", -214 => x"00000000", -215 => x"00000000", -216 => x"71810552", -217 => x"04000000", -218 => x"00000000", -219 => x"00000000", -220 => x"00000000", -221 => x"00000000", -222 => x"00000000", -223 => x"00000000", -224 => x"00000000", -225 => x"00000000", -226 => x"00000000", -227 => x"00000000", -228 => x"00000000", -229 => x"00000000", -230 => x"00000000", -231 => x"00000000", -232 => x"02840572", -233 => x"10100552", -234 => x"04000000", -235 => x"00000000", -236 => x"00000000", -237 => x"00000000", -238 => x"00000000", -239 => x"00000000", -240 => x"00000000", -241 => x"00000000", -242 => x"00000000", -243 => x"00000000", -244 => x"00000000", -245 => x"00000000", -246 => x"00000000", -247 => x"00000000", -248 => x"717105ff", -249 => x"05715351", -250 => x"020d0400", -251 => x"00000000", -252 => x"00000000", -253 => x"00000000", -254 => x"00000000", -255 => x"00000000", -256 => x"82c53f80", -257 => x"c6d93f04", -258 => x"10101010", -259 => x"10101010", -260 => x"10101010", -261 => x"10101010", -262 => x"10101010", -263 => x"10101010", -264 => x"10101010", -265 => x"10101053", -266 => x"51047381", -267 => x"ff067383", -268 => x"06098105", -269 => x"83051010", -270 => x"102b0772", -271 => x"fc060c51", -272 => x"51043c04", -273 => x"72728072", -274 => x"8106ff05", -275 => x"09720605", -276 => x"71105272", -277 => x"0a100a53", -278 => x"72ed3851", -279 => x"51535104", -280 => x"fe3d0d0b", -281 => x"0b80dfc0", -282 => x"08538413", -283 => x"0870882a", -284 => x"70810651", -285 => x"52527080", -286 => x"2ef03871", -287 => x"81ff0680", -288 => x"0c843d0d", -289 => x"04ff3d0d", -290 => x"0b0b80df", -291 => x"c0085271", -292 => x"0870882a", -293 => x"81327081", -294 => x"06515151", -295 => x"70f13873", -296 => x"720c833d", -297 => x"0d0480cf", -298 => x"d408802e", -299 => x"a43880cf", -300 => x"d808822e", -301 => x"bd388380", -302 => x"800b0b0b", -303 => x"80dfc00c", -304 => x"82a0800b", -305 => x"80dfc40c", -306 => x"8290800b", -307 => x"80dfc80c", -308 => x"04f88080", -309 => x"80a40b0b", -310 => x"0b80dfc0", -311 => x"0cf88080", -312 => x"82800b80", -313 => x"dfc40cf8", -314 => x"80808480", -315 => x"0b80dfc8", -316 => x"0c0480c0", -317 => x"a8808c0b", -318 => x"0b0b80df", -319 => x"c00c80c0", -320 => x"a880940b", -321 => x"80dfc40c", -322 => x"0b0b80cf", -323 => x"8c0b80df", -324 => x"c80c0470", -325 => x"7080dfcc", -326 => x"335170a7", -327 => x"3880cfe0", -328 => x"08700852", -329 => x"5270802e", -330 => x"94388412", -331 => x"80cfe00c", -332 => x"702d80cf", -333 => x"e0087008", -334 => x"525270ee", -335 => x"38810b80", -336 => x"dfcc3450", -337 => x"50040470", -338 => x"0b0b80df", -339 => x"bc08802e", -340 => x"8e380b0b", -341 => x"0b0b800b", -342 => x"802e0981", -343 => x"06833850", -344 => x"040b0b80", -345 => x"dfbc510b", -346 => x"0b0bf594", -347 => x"3f500404", -348 => x"fe3d0d89", -349 => x"5380cf90", -350 => x"5182c13f", -351 => x"80cfa051", -352 => x"82ba3f81", -353 => x"0a0b80df", -354 => x"d80cff0b", -355 => x"80dfdc0c", -356 => x"ff135372", -357 => x"8025de38", -358 => x"72800c84", -359 => x"3d0d04fb", -360 => x"3d0d7779", -361 => x"55558056", -362 => x"757524ab", -363 => x"38807424", -364 => x"9d388053", -365 => x"73527451", -366 => x"80e13f80", -367 => x"08547580", -368 => x"2e853880", -369 => x"08305473", -370 => x"800c873d", -371 => x"0d047330", -372 => x"76813257", -373 => x"54dc3974", -374 => x"30558156", -375 => x"738025d2", -376 => x"38ec39fa", -377 => x"3d0d787a", -378 => x"57558057", -379 => x"767524a4", -380 => x"38759f2c", -381 => x"54815375", -382 => x"74327431", -383 => x"5274519b", -384 => x"3f800854", -385 => x"76802e85", -386 => x"38800830", -387 => x"5473800c", -388 => x"883d0d04", -389 => x"74305581", -390 => x"57d739fc", -391 => x"3d0d7678", -392 => x"53548153", -393 => x"80747326", -394 => x"52557280", -395 => x"2e983870", -396 => x"802eab38", -397 => x"807224a6", -398 => x"38711073", -399 => x"10757226", -400 => x"53545272", -401 => x"ea387351", -402 => x"78833874", -403 => x"5170800c", -404 => x"863d0d04", -405 => x"720a100a", -406 => x"720a100a", -407 => x"53537280", -408 => x"2ee43871", -409 => x"7426ed38", -410 => x"73723175", -411 => x"7407740a", -412 => x"100a740a", -413 => x"100a5555", -414 => x"5654e339", -415 => x"f73d0d7c", -416 => x"70525380", -417 => x"f93f7254", -418 => x"80085580", -419 => x"cfb05681", -420 => x"57800881", -421 => x"055a8b3d", -422 => x"e4115953", -423 => x"8259f413", -424 => x"527b8811", -425 => x"08525381", -426 => x"b23f8008", -427 => x"30708008", -428 => x"079f2c8a", -429 => x"07800c53", -430 => x"8b3d0d04", -431 => x"f63d0d7c", -432 => x"80cfe408", -433 => x"71535553", -434 => x"b53f7255", -435 => x"80085680", -436 => x"cfb05781", -437 => x"58800881", -438 => x"055b8c3d", -439 => x"e4115a53", -440 => x"825af413", -441 => x"52881408", -442 => x"5180f03f", -443 => x"80083070", -444 => x"8008079f", -445 => x"2c8a0780", -446 => x"0c548c3d", -447 => x"0d047070", -448 => x"70707570", -449 => x"71830653", -450 => x"555270b4", -451 => x"38717008", -452 => x"7009f7fb", -453 => x"fdff1206", -454 => x"f8848281", -455 => x"80065452", -456 => x"53719b38", -457 => x"84137008", -458 => x"7009f7fb", -459 => x"fdff1206", -460 => x"f8848281", -461 => x"80065452", -462 => x"5371802e", -463 => x"e7387252", -464 => x"71335372", -465 => x"802e8a38", -466 => x"81127033", -467 => x"545272f8", -468 => x"38717431", -469 => x"800c5050", -470 => x"505004f2", -471 => x"3d0d6062", -472 => x"88110870", -473 => x"58565f5a", -474 => x"73802e81", -475 => x"8c388c1a", -476 => x"2270832a", -477 => x"81328106", -478 => x"56587486", -479 => x"38901a08", -480 => x"91387951", -481 => x"90b73fff", -482 => x"55800880", -483 => x"ec388c1a", -484 => x"22587d08", -485 => x"55807883", -486 => x"ffff0670", -487 => x"0a100a81", -488 => x"06415c57", -489 => x"7e772e80", -490 => x"d7387690", -491 => x"38740884", -492 => x"16088817", -493 => x"57585676", -494 => x"802ef238", -495 => x"76548880", -496 => x"77278438", -497 => x"88805473", -498 => x"5375529c", -499 => x"1a0851a4", -500 => x"1a085877", -501 => x"2d800b80", -502 => x"082582e0", -503 => x"38800816", -504 => x"77800831", -505 => x"7f880508", -506 => x"80083170", -507 => x"6188050c", -508 => x"5b585678", -509 => x"ffb43880", -510 => x"5574800c", -511 => x"903d0d04", -512 => x"7a813281", -513 => x"06774056", -514 => x"75802e81", -515 => x"bd387690", -516 => x"38740884", -517 => x"16088817", -518 => x"57585976", -519 => x"802ef238", -520 => x"881a0878", -521 => x"83ffff06", -522 => x"70892a81", -523 => x"06565956", -524 => x"73802e82", -525 => x"f8387577", -526 => x"278b3877", -527 => x"872a8106", -528 => x"5c7b82b5", -529 => x"38767627", -530 => x"83387656", -531 => x"75537852", -532 => x"79085185", -533 => x"833f881a", -534 => x"08763188", -535 => x"1b0c7908", -536 => x"167a0c76", -537 => x"56751977", -538 => x"77317f88", -539 => x"05087831", -540 => x"70618805", -541 => x"0c415859", -542 => x"7e802efe", -543 => x"fa388c1a", -544 => x"2258ff8a", -545 => x"39787954", -546 => x"7c537b52", -547 => x"5684c93f", -548 => x"881a0879", -549 => x"31881b0c", -550 => x"7908197a", -551 => x"0c7c7631", -552 => x"5d7c8e38", -553 => x"79518ff2", -554 => x"3f800881", -555 => x"8f388008", -556 => x"5f751c77", -557 => x"77317f88", -558 => x"05087831", -559 => x"70618805", -560 => x"0c5d585c", -561 => x"7a802efe", -562 => x"ae387681", -563 => x"83387408", -564 => x"84160888", -565 => x"1757585c", -566 => x"76802ef2", -567 => x"3876538a", -568 => x"527b5182", -569 => x"d33f8008", -570 => x"7c318105", -571 => x"5d800884", -572 => x"3881175d", -573 => x"815f7c59", -574 => x"767d2783", -575 => x"38765994", -576 => x"1a08881b", -577 => x"08115758", -578 => x"807a085c", -579 => x"54901a08", -580 => x"7b278338", -581 => x"81547579", -582 => x"25843873", -583 => x"ba387779", -584 => x"24fee238", -585 => x"77537b52", -586 => x"9c1a0851", -587 => x"a41a0859", -588 => x"782d8008", -589 => x"56800880", -590 => x"24fee238", -591 => x"8c1a2280", -592 => x"c0075e7d", -593 => x"8c1b23ff", -594 => x"5574800c", -595 => x"903d0d04", -596 => x"7effa338", -597 => x"ff873975", -598 => x"537b527a", -599 => x"5182f93f", -600 => x"7908167a", -601 => x"0c79518e", -602 => x"b13f8008", -603 => x"cf387c76", -604 => x"315d7cfe", -605 => x"bc38feac", -606 => x"39901a08", -607 => x"7a087131", -608 => x"78117056", -609 => x"5a575280", -610 => x"cfe40851", -611 => x"84943f80", -612 => x"08802eff", -613 => x"a7388008", -614 => x"901b0c80", -615 => x"08167a0c", -616 => x"77941b0c", -617 => x"76881b0c", -618 => x"7656fd99", -619 => x"39790858", -620 => x"901a0878", -621 => x"27833881", -622 => x"54757727", -623 => x"843873b3", -624 => x"38941a08", -625 => x"54737726", -626 => x"80d33873", -627 => x"5378529c", -628 => x"1a0851a4", -629 => x"1a085877", -630 => x"2d800856", -631 => x"80088024", -632 => x"fd83388c", -633 => x"1a2280c0", -634 => x"075e7d8c", -635 => x"1b23ff55", -636 => x"fed73975", -637 => x"53785277", -638 => x"5181dd3f", -639 => x"7908167a", -640 => x"0c79518d", -641 => x"953f8008", -642 => x"802efcd9", -643 => x"388c1a22", -644 => x"80c0075e", -645 => x"7d8c1b23", -646 => x"ff55fead", -647 => x"39767754", -648 => x"79537852", -649 => x"5681b13f", -650 => x"881a0877", -651 => x"31881b0c", -652 => x"7908177a", -653 => x"0cfcae39", -654 => x"fa3d0d7a", -655 => x"79028805", -656 => x"a7053355", -657 => x"53548374", -658 => x"2780df38", -659 => x"71830651", -660 => x"7080d738", -661 => x"71715755", -662 => x"83517582", -663 => x"802913ff", -664 => x"12525670", -665 => x"8025f338", -666 => x"837427bc", -667 => x"38740876", -668 => x"327009f7", -669 => x"fbfdff12", -670 => x"06f88482", -671 => x"81800651", -672 => x"5170802e", -673 => x"98387451", -674 => x"80527033", -675 => x"5772772e", -676 => x"b9388111", -677 => x"81135351", -678 => x"837227ee", -679 => x"38fc1484", -680 => x"16565473", -681 => x"8326c638", -682 => x"7452ff14", -683 => x"5170ff2e", -684 => x"97387133", -685 => x"5472742e", -686 => x"98388112", -687 => x"ff125252", -688 => x"70ff2e09", -689 => x"8106eb38", -690 => x"80517080", -691 => x"0c883d0d", -692 => x"0471800c", -693 => x"883d0d04", -694 => x"fa3d0d78", -695 => x"7a7c7272", -696 => x"72595755", -697 => x"58565774", -698 => x"7727b238", -699 => x"75155176", -700 => x"7127aa38", -701 => x"707618ff", -702 => x"18535353", -703 => x"70ff2e96", -704 => x"38ff12ff", -705 => x"14545272", -706 => x"337234ff", -707 => x"115170ff", -708 => x"2e098106", -709 => x"ec387680", -710 => x"0c883d0d", -711 => x"048f7627", -712 => x"80e63874", -713 => x"77078306", -714 => x"517080dc", -715 => x"38767552", -716 => x"53707084", -717 => x"05520873", -718 => x"70840555", -719 => x"0c727170", -720 => x"84055308", -721 => x"71708405", -722 => x"530c7170", -723 => x"84055308", -724 => x"71708405", -725 => x"530c7170", -726 => x"84055308", -727 => x"71708405", -728 => x"530cf015", -729 => x"5553738f", -730 => x"26c73883", -731 => x"74279538", -732 => x"70708405", -733 => x"52087370", -734 => x"8405550c", -735 => x"fc145473", -736 => x"8326ed38", -737 => x"72715452", -738 => x"ff145170", -739 => x"ff2eff86", -740 => x"38727081", -741 => x"05543372", -742 => x"70810554", -743 => x"34ff1151", -744 => x"ea39ef3d", -745 => x"0d636567", -746 => x"405d427b", -747 => x"802e8582", -748 => x"386151a9", -749 => x"e73ff81c", -750 => x"70841208", -751 => x"70fc0670", -752 => x"628b0570", -753 => x"f8064159", -754 => x"455c5f41", -755 => x"57967427", -756 => x"82c53880", -757 => x"7b247e7c", -758 => x"26075880", -759 => x"5477742e", -760 => x"09810682", -761 => x"ab38787b", -762 => x"2581fe38", -763 => x"781780d7", -764 => x"a00b8805", -765 => x"085b5679", -766 => x"762e84c5", -767 => x"38841608", -768 => x"70fe0617", -769 => x"84110881", -770 => x"06415555", -771 => x"7e828d38", -772 => x"74fc0658", -773 => x"79762e84", -774 => x"e3387818", -775 => x"5f7e7b25", -776 => x"81ff387c", -777 => x"81065473", -778 => x"82c13876", -779 => x"77083184", -780 => x"1108fc06", -781 => x"56577580", -782 => x"2e913879", -783 => x"762e84f0", -784 => x"38741819", -785 => x"58777b25", -786 => x"84913876", -787 => x"802e829b", -788 => x"38781556", -789 => x"7a762482", -790 => x"92388c17", -791 => x"08881808", -792 => x"718c120c", -793 => x"88120c5e", -794 => x"75598817", -795 => x"61fc055b", -796 => x"5679a426", -797 => x"85ff387b", -798 => x"76595593", -799 => x"7a2780c9", -800 => x"387b7084", -801 => x"055d087c", -802 => x"56760c74", -803 => x"70840556", -804 => x"088c180c", -805 => x"9017589b", -806 => x"7a27ae38", -807 => x"74708405", -808 => x"5608780c", -809 => x"74708405", -810 => x"56089418", -811 => x"0c981758", -812 => x"a37a2795", -813 => x"38747084", -814 => x"05560878", -815 => x"0c747084", -816 => x"0556089c", -817 => x"180ca017", -818 => x"58747084", -819 => x"05560875", -820 => x"5f787084", -821 => x"055a0c77", -822 => x"7e708405", -823 => x"40087170", -824 => x"8405530c", -825 => x"7e08710c", -826 => x"5d787b31", -827 => x"56758f26", -828 => x"80c93884", -829 => x"17088106", -830 => x"79078418", -831 => x"0c781784", -832 => x"11088107", -833 => x"84120c5b", -834 => x"6151a791", -835 => x"3f881754", -836 => x"73800c93", -837 => x"3d0d0490", -838 => x"5bfdb839", -839 => x"7756fe83", -840 => x"398c1608", -841 => x"88170871", -842 => x"8c120c88", -843 => x"120c587e", -844 => x"707c3157", -845 => x"598f7627", -846 => x"ffb9387a", -847 => x"17841808", -848 => x"81067c07", -849 => x"84190c76", -850 => x"81078412", -851 => x"0c761184", -852 => x"11088107", -853 => x"84120c5b", -854 => x"88055261", -855 => x"518fda3f", -856 => x"6151a6b9", -857 => x"3f881754", -858 => x"ffa6397d", -859 => x"52615197", -860 => x"d73f8008", -861 => x"5a800880", -862 => x"2e81ab38", -863 => x"8008f805", -864 => x"60840508", -865 => x"fe066105", -866 => x"58557477", -867 => x"2e83f238", -868 => x"fc195877", -869 => x"a42681b0", -870 => x"387b8008", -871 => x"56579378", -872 => x"2780dc38", -873 => x"7b707084", -874 => x"05520880", -875 => x"08708405", -876 => x"800c0c80", -877 => x"08717084", -878 => x"0553085d", -879 => x"567b7670", -880 => x"8405580c", -881 => x"579b7827", -882 => x"b6387670", -883 => x"84055808", -884 => x"75708405", -885 => x"570c7670", -886 => x"84055808", -887 => x"75708405", -888 => x"570ca378", -889 => x"27993876", -890 => x"70840558", -891 => x"08757084", -892 => x"05570c76", -893 => x"70840558", -894 => x"08757084", -895 => x"05570c76", -896 => x"70840558", -897 => x"08775e75", -898 => x"70840557", -899 => x"0c747d70", -900 => x"84055f08", -901 => x"71708405", -902 => x"530c7d08", -903 => x"710c5f7b", -904 => x"5261518e", -905 => x"943f6151", -906 => x"a4f33f79", -907 => x"800c933d", -908 => x"0d047d52", -909 => x"61519690", -910 => x"3f800880", -911 => x"0c933d0d", -912 => x"04841608", -913 => x"55fbc939", -914 => x"77537b52", -915 => x"800851a2", -916 => x"a53f7b52", -917 => x"61518de1", -918 => x"3fcc398c", -919 => x"16088817", -920 => x"08718c12", -921 => x"0c88120c", -922 => x"5d8c1708", -923 => x"88180871", -924 => x"8c120c88", -925 => x"120c5977", -926 => x"59fbef39", -927 => x"7818901c", -928 => x"40557e75", -929 => x"24fb9c38", -930 => x"7a177080", -931 => x"d7a00b88", -932 => x"050c757c", -933 => x"31810784", -934 => x"120c5684", -935 => x"17088106", -936 => x"7b078418", -937 => x"0c6151a3", -938 => x"f43f8817", -939 => x"54fce139", -940 => x"74181990", -941 => x"1c5e5a7c", -942 => x"7a24fb8f", -943 => x"388c1708", -944 => x"88180871", -945 => x"8c120c88", -946 => x"120c5e88", -947 => x"1761fc05", -948 => x"575975a4", -949 => x"2681b638", -950 => x"7b795955", -951 => x"93762780", -952 => x"c9387b70", -953 => x"84055d08", -954 => x"7c56790c", -955 => x"74708405", -956 => x"56088c18", -957 => x"0c901758", -958 => x"9b7627ae", -959 => x"38747084", -960 => x"05560878", -961 => x"0c747084", -962 => x"05560894", -963 => x"180c9817", -964 => x"58a37627", -965 => x"95387470", -966 => x"84055608", -967 => x"780c7470", -968 => x"84055608", -969 => x"9c180ca0", -970 => x"17587470", -971 => x"84055608", -972 => x"75417870", -973 => x"84055a0c", -974 => x"77607084", -975 => x"05420871", -976 => x"70840553", -977 => x"0c600871", -978 => x"0c5e7a17", -979 => x"7080d7a0", -980 => x"0b88050c", -981 => x"7a7c3181", -982 => x"0784120c", -983 => x"58841708", -984 => x"81067b07", -985 => x"84180c61", -986 => x"51a2b23f", -987 => x"78547380", -988 => x"0c933d0d", -989 => x"0479537b", -990 => x"5275519f", -991 => x"f93ffae9", -992 => x"39841508", -993 => x"fc061960", -994 => x"5859fadd", -995 => x"3975537b", -996 => x"5278519f", -997 => x"e13f7a17", -998 => x"7080d7a0", -999 => x"0b88050c", -1000 => x"7a7c3181", -1001 => x"0784120c", -1002 => x"58841708", -1003 => x"81067b07", -1004 => x"84180c61", -1005 => x"51a1e63f", -1006 => x"7854ffb2", -1007 => x"39fa3d0d", -1008 => x"7880cfe4", -1009 => x"085455b8", -1010 => x"1308802e", -1011 => x"81af388c", -1012 => x"15227083", -1013 => x"ffff0670", -1014 => x"832a8132", -1015 => x"81065555", -1016 => x"5672802e", -1017 => x"80da3873", -1018 => x"842a8132", -1019 => x"810657ff", -1020 => x"537680f2", -1021 => x"3873822a", -1022 => x"81065473", -1023 => x"802eb938", -1024 => x"b0150854", -1025 => x"73802e9c", -1026 => x"3880c015", -1027 => x"5373732e", -1028 => x"8f387352", -1029 => x"80cfe408", -1030 => x"518a9e3f", -1031 => x"8c152256", -1032 => x"76b0160c", -1033 => x"75db0657", -1034 => x"768c1623", -1035 => x"800b8416", -1036 => x"0c901508", -1037 => x"750c7656", -1038 => x"75880754", -1039 => x"738c1623", -1040 => x"90150880", -1041 => x"2ebf388c", -1042 => x"15227081", -1043 => x"06555373", -1044 => x"9c38720a", -1045 => x"100a8106", -1046 => x"56758538", -1047 => x"94150854", -1048 => x"7388160c", -1049 => x"80537280", -1050 => x"0c883d0d", -1051 => x"04800b88", -1052 => x"160c9415", -1053 => x"08309816", -1054 => x"0c8053ea", -1055 => x"39725182", -1056 => x"a63ffecb", -1057 => x"3974518f", -1058 => x"bc3f8c15", -1059 => x"22708106", -1060 => x"55537380", -1061 => x"2effbb38", -1062 => x"d439f83d", -1063 => x"0d7a5776", -1064 => x"802e8197", -1065 => x"3880cfe4", -1066 => x"0854b814", -1067 => x"08802e80", -1068 => x"eb388c17", -1069 => x"2270902b", -1070 => x"70902c70", -1071 => x"832a8132", -1072 => x"81065b5b", -1073 => x"57557780", -1074 => x"cb389017", -1075 => x"08567580", -1076 => x"2e80c138", -1077 => x"76087631", -1078 => x"76780c79", -1079 => x"83065555", -1080 => x"73853894", -1081 => x"17085877", -1082 => x"88180c80", -1083 => x"7525a538", -1084 => x"74537552", -1085 => x"9c170851", -1086 => x"a4170854", -1087 => x"732d800b", -1088 => x"80082580", -1089 => x"c9388008", -1090 => x"16758008", -1091 => x"31565674", -1092 => x"8024dd38", -1093 => x"800b800c", -1094 => x"8a3d0d04", -1095 => x"73518187", -1096 => x"3f8c1722", -1097 => x"70902b70", -1098 => x"902c7083", -1099 => x"2a813281", -1100 => x"065b5b57", -1101 => x"5577dd38", -1102 => x"ff9039a1", -1103 => x"9a5280cf", -1104 => x"e408518c", -1105 => x"d03f8008", -1106 => x"800c8a3d", -1107 => x"0d048c17", -1108 => x"2280c007", -1109 => x"58778c18", -1110 => x"23ff0b80", -1111 => x"0c8a3d0d", -1112 => x"04fa3d0d", -1113 => x"797080dc", -1114 => x"298c1154", -1115 => x"7a535657", -1116 => x"8fd63f80", -1117 => x"08800855", -1118 => x"56800880", -1119 => x"2ea23880", -1120 => x"088c0554", -1121 => x"800b8008", -1122 => x"0c768008", -1123 => x"84050c73", -1124 => x"80088805", -1125 => x"0c745380", -1126 => x"5273519c", -1127 => x"f53f7554", -1128 => x"73800c88", -1129 => x"3d0d0470", -1130 => x"707074a8", -1131 => x"e60bbc12", -1132 => x"0c53810b", -1133 => x"b8140c80", -1134 => x"0b84dc14", -1135 => x"0c830b84", -1136 => x"e0140c84", -1137 => x"e81384e4", -1138 => x"140c8413", -1139 => x"08518070", -1140 => x"720c7084", -1141 => x"130c7088", -1142 => x"130c5284", -1143 => x"0b8c1223", -1144 => x"718e1223", -1145 => x"7190120c", -1146 => x"7194120c", -1147 => x"7198120c", -1148 => x"709c120c", -1149 => x"80c1d50b", -1150 => x"a0120c80", -1151 => x"c2a10ba4", -1152 => x"120c80c3", -1153 => x"9d0ba812", -1154 => x"0c80c3ee", -1155 => x"0bac120c", -1156 => x"88130872", -1157 => x"710c7284", -1158 => x"120c7288", -1159 => x"120c5189", -1160 => x"0b8c1223", -1161 => x"810b8e12", -1162 => x"23719012", -1163 => x"0c719412", -1164 => x"0c719812", -1165 => x"0c709c12", -1166 => x"0c80c1d5", -1167 => x"0ba0120c", -1168 => x"80c2a10b", -1169 => x"a4120c80", -1170 => x"c39d0ba8", -1171 => x"120c80c3", -1172 => x"ee0bac12", -1173 => x"0c8c1308", -1174 => x"72710c72", -1175 => x"84120c72", -1176 => x"88120c51", -1177 => x"8a0b8c12", -1178 => x"23820b8e", -1179 => x"12237190", -1180 => x"120c7194", -1181 => x"120c7198", -1182 => x"120c709c", -1183 => x"120c80c1", -1184 => x"d50ba012", -1185 => x"0c80c2a1", -1186 => x"0ba4120c", -1187 => x"80c39d0b", -1188 => x"a8120c80", -1189 => x"c3ee0bac", -1190 => x"120c5050", -1191 => x"5004f83d", -1192 => x"0d7a80cf", -1193 => x"e408b811", -1194 => x"08575758", -1195 => x"7481ec38", -1196 => x"a8e60bbc", -1197 => x"170c810b", -1198 => x"b8170c74", -1199 => x"84dc170c", -1200 => x"830b84e0", -1201 => x"170c84e8", -1202 => x"1684e417", -1203 => x"0c841608", -1204 => x"75710c75", -1205 => x"84120c75", -1206 => x"88120c59", -1207 => x"840b8c1a", -1208 => x"23748e1a", -1209 => x"2374901a", -1210 => x"0c74941a", -1211 => x"0c74981a", -1212 => x"0c789c1a", -1213 => x"0c80c1d5", -1214 => x"0ba01a0c", -1215 => x"80c2a10b", -1216 => x"a41a0c80", -1217 => x"c39d0ba8", -1218 => x"1a0c80c3", -1219 => x"ee0bac1a", -1220 => x"0c881608", -1221 => x"75710c75", -1222 => x"84120c75", -1223 => x"88120c57", -1224 => x"890b8c18", -1225 => x"23810b8e", -1226 => x"18237490", -1227 => x"180c7494", -1228 => x"180c7498", -1229 => x"180c769c", -1230 => x"180c80c1", -1231 => x"d50ba018", -1232 => x"0c80c2a1", -1233 => x"0ba4180c", -1234 => x"80c39d0b", -1235 => x"a8180c80", -1236 => x"c3ee0bac", -1237 => x"180c8c16", -1238 => x"0875710c", -1239 => x"7584120c", -1240 => x"7588120c", -1241 => x"548a0b8c", -1242 => x"1523820b", -1243 => x"8e152374", -1244 => x"90150c74", -1245 => x"94150c74", -1246 => x"98150c73", -1247 => x"9c150c80", -1248 => x"c1d50ba0", -1249 => x"150c80c2", -1250 => x"a10ba415", -1251 => x"0c80c39d", -1252 => x"0ba8150c", -1253 => x"80c3ee0b", -1254 => x"ac150c84", -1255 => x"dc168811", -1256 => x"08841208", -1257 => x"ff055757", -1258 => x"57807524", -1259 => x"9f388c16", -1260 => x"2270902b", -1261 => x"70902c51", -1262 => x"55597380", -1263 => x"2e80ed38", -1264 => x"80dc16ff", -1265 => x"16565674", -1266 => x"8025e338", -1267 => x"76085574", -1268 => x"802e8f38", -1269 => x"74881108", -1270 => x"841208ff", -1271 => x"05575757", -1272 => x"c83982fc", -1273 => x"5277518a", -1274 => x"df3f8008", -1275 => x"80085556", -1276 => x"8008802e", -1277 => x"a3388008", -1278 => x"8c057580", -1279 => x"080c5484", -1280 => x"0b800884", -1281 => x"050c7380", -1282 => x"0888050c", -1283 => x"82f05374", -1284 => x"52735197", -1285 => x"fd3f7554", -1286 => x"7374780c", -1287 => x"5573ffb4", -1288 => x"388c780c", -1289 => x"800b800c", -1290 => x"8a3d0d04", -1291 => x"810b8c17", -1292 => x"2373760c", -1293 => x"7388170c", -1294 => x"7384170c", -1295 => x"7390170c", -1296 => x"7394170c", -1297 => x"7398170c", -1298 => x"ff0b8e17", -1299 => x"2373b017", -1300 => x"0c73b417", -1301 => x"0c7380c4", -1302 => x"170c7380", -1303 => x"c8170c75", -1304 => x"800c8a3d", -1305 => x"0d047070", -1306 => x"a19a5273", -1307 => x"5186a63f", -1308 => x"50500470", -1309 => x"70a19a52", -1310 => x"80cfe408", -1311 => x"5186963f", -1312 => x"505004fb", -1313 => x"3d0d7770", -1314 => x"52569890", -1315 => x"3f80d7a0", -1316 => x"0b880508", -1317 => x"841108fc", -1318 => x"06707b31", -1319 => x"9fef05e0", -1320 => x"8006e080", -1321 => x"05525555", -1322 => x"a0807524", -1323 => x"94388052", -1324 => x"755197ea", -1325 => x"3f80d7a8", -1326 => x"08145372", -1327 => x"80082e8f", -1328 => x"38755197", -1329 => x"d83f8053", -1330 => x"72800c87", -1331 => x"3d0d0474", -1332 => x"30527551", -1333 => x"97c83f80", -1334 => x"08ff2ea8", -1335 => x"3880d7a0", -1336 => x"0b880508", -1337 => x"74763181", -1338 => x"0784120c", -1339 => x"5380d6e4", -1340 => x"08753180", -1341 => x"d6e40c75", -1342 => x"5197a23f", -1343 => x"810b800c", -1344 => x"873d0d04", -1345 => x"80527551", -1346 => x"97943f80", -1347 => x"d7a00b88", -1348 => x"05088008", -1349 => x"71315454", -1350 => x"8f7325ff", -1351 => x"a4388008", -1352 => x"80d79408", -1353 => x"3180d6e4", -1354 => x"0c728107", -1355 => x"84150c75", -1356 => x"5196ea3f", -1357 => x"8053ff90", -1358 => x"39f73d0d", -1359 => x"7b7d545a", -1360 => x"72802e82", -1361 => x"83387951", -1362 => x"96d23ff8", -1363 => x"13841108", -1364 => x"70fe0670", -1365 => x"13841108", -1366 => x"fc065c57", -1367 => x"58545780", -1368 => x"d7a80874", -1369 => x"2e82de38", -1370 => x"7784150c", -1371 => x"80738106", -1372 => x"56597479", -1373 => x"2e81d538", -1374 => x"77148411", -1375 => x"08810656", -1376 => x"5374a038", -1377 => x"77165678", -1378 => x"81e63888", -1379 => x"14085574", -1380 => x"80d7a82e", -1381 => x"82f9388c", -1382 => x"1408708c", -1383 => x"170c7588", -1384 => x"120c5875", -1385 => x"81078418", -1386 => x"0c751776", -1387 => x"710c5478", -1388 => x"81913883", -1389 => x"ff762781", -1390 => x"c8387589", -1391 => x"2a76832a", -1392 => x"54547380", -1393 => x"2ebf3875", -1394 => x"862ab805", -1395 => x"53847427", -1396 => x"b43880db", -1397 => x"14539474", -1398 => x"27ab3875", -1399 => x"8c2a80ee", -1400 => x"055380d4", -1401 => x"74279e38", -1402 => x"758f2a80", -1403 => x"f7055382", -1404 => x"d4742791", -1405 => x"3875922a", -1406 => x"80fc0553", -1407 => x"8ad47427", -1408 => x"843880fe", -1409 => x"53721010", -1410 => x"1080d7a0", -1411 => x"05881108", -1412 => x"55557375", -1413 => x"2e82bf38", -1414 => x"841408fc", -1415 => x"06597579", -1416 => x"278d3888", -1417 => x"14085473", -1418 => x"752e0981", -1419 => x"06ea388c", -1420 => x"1408708c", -1421 => x"190c7488", -1422 => x"190c7788", -1423 => x"120c5576", -1424 => x"8c150c79", -1425 => x"5194d63f", -1426 => x"8b3d0d04", -1427 => x"76087771", -1428 => x"31587605", -1429 => x"88180856", -1430 => x"567480d7", -1431 => x"a82e80e0", -1432 => x"388c1708", -1433 => x"708c170c", -1434 => x"7588120c", -1435 => x"53fe8939", -1436 => x"8814088c", -1437 => x"1508708c", -1438 => x"130c5988", -1439 => x"190cfea3", -1440 => x"3975832a", -1441 => x"70545480", -1442 => x"74248198", -1443 => x"3872822c", -1444 => x"81712b80", -1445 => x"d7a40807", -1446 => x"80d7a00b", -1447 => x"84050c74", -1448 => x"10101080", -1449 => x"d7a00588", -1450 => x"1108718c", -1451 => x"1b0c7088", -1452 => x"1b0c7988", -1453 => x"130c565a", -1454 => x"55768c15", -1455 => x"0cff8439", -1456 => x"8159fdb4", -1457 => x"39771673", -1458 => x"81065455", -1459 => x"72983876", -1460 => x"08777131", -1461 => x"5875058c", -1462 => x"18088819", -1463 => x"08718c12", -1464 => x"0c88120c", -1465 => x"55557481", -1466 => x"0784180c", -1467 => x"7680d7a0", -1468 => x"0b88050c", -1469 => x"80d79c08", -1470 => x"7526fec7", -1471 => x"3880d798", -1472 => x"08527951", -1473 => x"fafd3f79", -1474 => x"5193923f", -1475 => x"feba3981", -1476 => x"778c170c", -1477 => x"7788170c", -1478 => x"758c190c", -1479 => x"7588190c", -1480 => x"59fd8039", -1481 => x"83147082", -1482 => x"2c81712b", -1483 => x"80d7a408", -1484 => x"0780d7a0", -1485 => x"0b84050c", -1486 => x"75101010", -1487 => x"80d7a005", -1488 => x"88110871", -1489 => x"8c1c0c70", -1490 => x"881c0c7a", -1491 => x"88130c57", -1492 => x"5b5653fe", -1493 => x"e4398073", -1494 => x"24a33872", -1495 => x"822c8171", -1496 => x"2b80d7a4", -1497 => x"080780d7", -1498 => x"a00b8405", -1499 => x"0c58748c", -1500 => x"180c7388", -1501 => x"180c7688", -1502 => x"160cfdc3", -1503 => x"39831370", -1504 => x"822c8171", -1505 => x"2b80d7a4", -1506 => x"080780d7", -1507 => x"a00b8405", -1508 => x"0c5953da", -1509 => x"39f93d0d", -1510 => x"797b5853", -1511 => x"800b80cf", -1512 => x"e4085356", -1513 => x"72722ebc", -1514 => x"3884dc13", -1515 => x"5574762e", -1516 => x"b3388815", -1517 => x"08841608", -1518 => x"ff055454", -1519 => x"80732499", -1520 => x"388c1422", -1521 => x"70902b53", -1522 => x"587180d4", -1523 => x"3880dc14", -1524 => x"ff145454", -1525 => x"728025e9", -1526 => x"38740855", -1527 => x"74d43880", -1528 => x"cfe40852", -1529 => x"84dc1255", -1530 => x"74802ead", -1531 => x"38881508", -1532 => x"841608ff", -1533 => x"05545480", -1534 => x"73249838", -1535 => x"8c142270", -1536 => x"902b5358", -1537 => x"71ad3880", -1538 => x"dc14ff14", -1539 => x"54547280", -1540 => x"25ea3874", -1541 => x"085574d5", -1542 => x"3875800c", -1543 => x"893d0d04", -1544 => x"7351762d", -1545 => x"75800807", -1546 => x"80dc15ff", -1547 => x"15555556", -1548 => x"ffa23973", -1549 => x"51762d75", -1550 => x"80080780", -1551 => x"dc15ff15", -1552 => x"555556ca", -1553 => x"39ea3d0d", -1554 => x"688c1122", -1555 => x"700a100a", -1556 => x"81065758", -1557 => x"567480e4", -1558 => x"388e1622", -1559 => x"70902b70", -1560 => x"902c5155", -1561 => x"58807424", -1562 => x"b138983d", -1563 => x"c4055373", -1564 => x"5280cfe4", -1565 => x"08519481", -1566 => x"3f800b80", -1567 => x"08249738", -1568 => x"7983e080", -1569 => x"06547380", -1570 => x"c0802e81", -1571 => x"8f387382", -1572 => x"80802e81", -1573 => x"91388c16", -1574 => x"22577690", -1575 => x"80075473", -1576 => x"8c172388", -1577 => x"805280cf", -1578 => x"e4085181", -1579 => x"9b3f8008", -1580 => x"9d388c16", -1581 => x"22820755", -1582 => x"748c1723", -1583 => x"80c31670", -1584 => x"770c9017", -1585 => x"0c810b94", -1586 => x"170c983d", -1587 => x"0d0480cf", -1588 => x"e408a8e6", -1589 => x"0bbc120c", -1590 => x"588c1622", -1591 => x"81800754", -1592 => x"738c1723", -1593 => x"8008760c", -1594 => x"80089017", -1595 => x"0c88800b", -1596 => x"94170c74", -1597 => x"802ed338", -1598 => x"8e162270", -1599 => x"902b7090", -1600 => x"2c535654", -1601 => x"9afe3f80", -1602 => x"08802eff", -1603 => x"bd388c16", -1604 => x"22810757", -1605 => x"768c1723", -1606 => x"983d0d04", -1607 => x"810b8c17", -1608 => x"225855fe", -1609 => x"f539a816", -1610 => x"0880c39d", -1611 => x"2e098106", -1612 => x"fee4388c", -1613 => x"16228880", -1614 => x"0754738c", -1615 => x"17238880", -1616 => x"0b80cc17", -1617 => x"0cfedc39", -1618 => x"f43d0d7e", -1619 => x"608b1170", -1620 => x"f8065b55", -1621 => x"555d7296", -1622 => x"26833890", -1623 => x"58807824", -1624 => x"74792607", -1625 => x"55805474", -1626 => x"742e0981", -1627 => x"0680ca38", -1628 => x"7c518ea8", -1629 => x"3f7783f7", -1630 => x"2680c538", -1631 => x"77832a70", -1632 => x"10101080", -1633 => x"d7a0058c", -1634 => x"11085858", -1635 => x"5475772e", -1636 => x"81f03884", -1637 => x"1608fc06", -1638 => x"8c170888", -1639 => x"1808718c", -1640 => x"120c8812", -1641 => x"0c5b7605", -1642 => x"84110881", -1643 => x"0784120c", -1644 => x"537c518d", -1645 => x"e83f8816", -1646 => x"5473800c", -1647 => x"8e3d0d04", -1648 => x"77892a78", -1649 => x"832a5854", -1650 => x"73802ebf", -1651 => x"3877862a", -1652 => x"b8055784", -1653 => x"7427b438", -1654 => x"80db1457", -1655 => x"947427ab", -1656 => x"38778c2a", -1657 => x"80ee0557", -1658 => x"80d47427", -1659 => x"9e38778f", -1660 => x"2a80f705", -1661 => x"5782d474", -1662 => x"27913877", -1663 => x"922a80fc", -1664 => x"05578ad4", -1665 => x"74278438", -1666 => x"80fe5776", -1667 => x"10101080", -1668 => x"d7a0058c", -1669 => x"11085653", -1670 => x"74732ea3", -1671 => x"38841508", -1672 => x"fc067079", -1673 => x"31555673", -1674 => x"8f2488e4", -1675 => x"38738025", -1676 => x"88e6388c", -1677 => x"15085574", -1678 => x"732e0981", -1679 => x"06df3881", -1680 => x"175980d7", -1681 => x"b0085675", -1682 => x"80d7a82e", -1683 => x"82cc3884", -1684 => x"1608fc06", -1685 => x"70793155", -1686 => x"55738f24", -1687 => x"bb3880d7", -1688 => x"a80b80d7", -1689 => x"b40c80d7", -1690 => x"a80b80d7", -1691 => x"b00c8074", -1692 => x"2480db38", -1693 => x"74168411", -1694 => x"08810784", -1695 => x"120c53fe", -1696 => x"b0398816", -1697 => x"8c110857", -1698 => x"5975792e", -1699 => x"098106fe", -1700 => x"82388214", -1701 => x"59ffab39", -1702 => x"77167881", -1703 => x"0784180c", -1704 => x"7080d7b4", -1705 => x"0c7080d7", -1706 => x"b00c80d7", -1707 => x"a80b8c12", -1708 => x"0c8c1108", -1709 => x"88120c74", -1710 => x"81078412", -1711 => x"0c740574", -1712 => x"710c5b7c", -1713 => x"518bd63f", -1714 => x"881654fd", -1715 => x"ec3983ff", -1716 => x"75278391", -1717 => x"3874892a", -1718 => x"75832a54", -1719 => x"5473802e", -1720 => x"bf387486", -1721 => x"2ab80553", -1722 => x"847427b4", -1723 => x"3880db14", -1724 => x"53947427", -1725 => x"ab38748c", -1726 => x"2a80ee05", -1727 => x"5380d474", -1728 => x"279e3874", -1729 => x"8f2a80f7", -1730 => x"055382d4", -1731 => x"74279138", -1732 => x"74922a80", -1733 => x"fc05538a", -1734 => x"d4742784", -1735 => x"3880fe53", -1736 => x"72101010", -1737 => x"80d7a005", -1738 => x"88110855", -1739 => x"5773772e", -1740 => x"868b3884", -1741 => x"1408fc06", -1742 => x"5b747b27", -1743 => x"8d388814", -1744 => x"08547377", -1745 => x"2e098106", -1746 => x"ea388c14", -1747 => x"0880d7a0", -1748 => x"0b840508", -1749 => x"718c190c", -1750 => x"7588190c", -1751 => x"7788130c", -1752 => x"5c57758c", -1753 => x"150c7853", -1754 => x"80792483", -1755 => x"98387282", -1756 => x"2c81712b", -1757 => x"5656747b", -1758 => x"2680ca38", -1759 => x"7a750657", -1760 => x"7682a338", -1761 => x"78fc0684", -1762 => x"05597410", -1763 => x"707c0655", -1764 => x"55738292", -1765 => x"38841959", -1766 => x"f13980d7", -1767 => x"a00b8405", -1768 => x"0879545b", -1769 => x"788025c6", -1770 => x"3882da39", -1771 => x"74097b06", -1772 => x"7080d7a0", -1773 => x"0b84050c", -1774 => x"5b741055", -1775 => x"747b2685", -1776 => x"387485bc", -1777 => x"3880d7a0", -1778 => x"0b880508", -1779 => x"70841208", -1780 => x"fc06707b", -1781 => x"317b7226", -1782 => x"8f722507", -1783 => x"5d575c5c", -1784 => x"5578802e", -1785 => x"80d93879", -1786 => x"1580d798", -1787 => x"08199011", -1788 => x"59545680", -1789 => x"d79408ff", -1790 => x"2e8838a0", -1791 => x"8f13e080", -1792 => x"06577652", -1793 => x"7c518996", -1794 => x"3f800854", -1795 => x"8008ff2e", -1796 => x"90388008", -1797 => x"762782a7", -1798 => x"387480d7", -1799 => x"a02e829f", -1800 => x"3880d7a0", -1801 => x"0b880508", -1802 => x"55841508", -1803 => x"fc067079", -1804 => x"31797226", -1805 => x"8f722507", -1806 => x"5d555a7a", -1807 => x"83f23877", -1808 => x"81078416", -1809 => x"0c771570", -1810 => x"80d7a00b", -1811 => x"88050c74", -1812 => x"81078412", -1813 => x"0c567c51", -1814 => x"88c33f88", -1815 => x"15547380", -1816 => x"0c8e3d0d", -1817 => x"0474832a", -1818 => x"70545480", -1819 => x"7424819b", -1820 => x"3872822c", -1821 => x"81712b80", -1822 => x"d7a40807", -1823 => x"7080d7a0", -1824 => x"0b84050c", -1825 => x"75101010", -1826 => x"80d7a005", -1827 => x"88110871", -1828 => x"8c1b0c70", -1829 => x"881b0c79", -1830 => x"88130c57", -1831 => x"555c5575", -1832 => x"8c150cfd", -1833 => x"c1397879", -1834 => x"10101080", -1835 => x"d7a00570", -1836 => x"565b5c8c", -1837 => x"14085675", -1838 => x"742ea338", -1839 => x"841608fc", -1840 => x"06707931", -1841 => x"5853768f", -1842 => x"2483f138", -1843 => x"76802584", -1844 => x"af388c16", -1845 => x"08567574", -1846 => x"2e098106", -1847 => x"df388814", -1848 => x"811a7083", -1849 => x"06555a54", -1850 => x"72c9387b", -1851 => x"83065675", -1852 => x"802efdb8", -1853 => x"38ff1cf8", -1854 => x"1b5b5c88", -1855 => x"1a087a2e", -1856 => x"ea38fdb5", -1857 => x"39831953", -1858 => x"fce43983", -1859 => x"1470822c", -1860 => x"81712b80", -1861 => x"d7a40807", -1862 => x"7080d7a0", -1863 => x"0b84050c", -1864 => x"76101010", -1865 => x"80d7a005", -1866 => x"88110871", -1867 => x"8c1c0c70", -1868 => x"881c0c7a", -1869 => x"88130c58", -1870 => x"535d5653", -1871 => x"fee13980", -1872 => x"d6e40817", -1873 => x"59800876", -1874 => x"2e818b38", -1875 => x"80d79408", -1876 => x"ff2e848e", -1877 => x"38737631", -1878 => x"1980d6e4", -1879 => x"0c738706", -1880 => x"70565372", -1881 => x"802e8838", -1882 => x"88733170", -1883 => x"15555576", -1884 => x"149fff06", -1885 => x"a0807131", -1886 => x"1670547e", -1887 => x"53515386", -1888 => x"9d3f8008", -1889 => x"568008ff", -1890 => x"2e819e38", -1891 => x"80d6e408", -1892 => x"137080d6", -1893 => x"e40c7475", -1894 => x"80d7a00b", -1895 => x"88050c77", -1896 => x"76311581", -1897 => x"07555659", -1898 => x"7a80d7a0", -1899 => x"2e83c038", -1900 => x"798f2682", -1901 => x"ef38810b", -1902 => x"84150c84", -1903 => x"1508fc06", -1904 => x"70793179", -1905 => x"72268f72", -1906 => x"25075d55", -1907 => x"5a7a802e", -1908 => x"fced3880", -1909 => x"db398008", -1910 => x"9fff0655", -1911 => x"74feed38", -1912 => x"7880d6e4", -1913 => x"0c80d7a0", -1914 => x"0b880508", -1915 => x"7a188107", -1916 => x"84120c55", -1917 => x"80d79008", -1918 => x"79278638", -1919 => x"7880d790", -1920 => x"0c80d78c", -1921 => x"087927fc", -1922 => x"a0387880", -1923 => x"d78c0c84", -1924 => x"1508fc06", -1925 => x"70793179", -1926 => x"72268f72", -1927 => x"25075d55", -1928 => x"5a7a802e", -1929 => x"fc993888", -1930 => x"39807457", -1931 => x"53fedd39", -1932 => x"7c5184e9", -1933 => x"3f800b80", -1934 => x"0c8e3d0d", -1935 => x"04807324", -1936 => x"a5387282", -1937 => x"2c81712b", -1938 => x"80d7a408", -1939 => x"077080d7", -1940 => x"a00b8405", -1941 => x"0c5c5a76", -1942 => x"8c170c73", -1943 => x"88170c75", -1944 => x"88180cf9", -1945 => x"fd398313", -1946 => x"70822c81", -1947 => x"712b80d7", -1948 => x"a4080770", -1949 => x"80d7a00b", -1950 => x"84050c5d", -1951 => x"5b53d839", -1952 => x"7a75065c", -1953 => x"7bfc9f38", -1954 => x"84197510", -1955 => x"5659f139", -1956 => x"ff178105", -1957 => x"59f7ab39", -1958 => x"8c150888", -1959 => x"1608718c", -1960 => x"120c8812", -1961 => x"0c597515", -1962 => x"84110881", -1963 => x"0784120c", -1964 => x"587c5183", -1965 => x"e83f8815", -1966 => x"54fba339", -1967 => x"77167881", -1968 => x"0784180c", -1969 => x"8c170888", -1970 => x"1808718c", -1971 => x"120c8812", -1972 => x"0c5c7080", -1973 => x"d7b40c70", -1974 => x"80d7b00c", -1975 => x"80d7a80b", -1976 => x"8c120c8c", -1977 => x"11088812", -1978 => x"0c778107", -1979 => x"84120c77", -1980 => x"0577710c", -1981 => x"557c5183", -1982 => x"a43f8816", -1983 => x"54f5ba39", -1984 => x"72168411", -1985 => x"08810784", -1986 => x"120c588c", -1987 => x"16088817", -1988 => x"08718c12", -1989 => x"0c88120c", -1990 => x"577c5183", -1991 => x"803f8816", -1992 => x"54f59639", -1993 => x"7284150c", -1994 => x"f41af806", -1995 => x"70841d08", -1996 => x"81060784", -1997 => x"1d0c701c", -1998 => x"5556850b", -1999 => x"84150c85", -2000 => x"0b88150c", -2001 => x"8f7627fd", -2002 => x"ab38881b", -2003 => x"527c51eb", -2004 => x"e83f80d7", -2005 => x"a00b8805", -2006 => x"0880d6e4", -2007 => x"085a55fd", -2008 => x"93397880", -2009 => x"d6e40c73", -2010 => x"80d7940c", -2011 => x"fbef3972", -2012 => x"84150cfc", -2013 => x"ff39fb3d", -2014 => x"0d77707a", -2015 => x"7c585553", -2016 => x"568f7527", -2017 => x"80e63872", -2018 => x"76078306", -2019 => x"517080dc", -2020 => x"38757352", -2021 => x"54707084", -2022 => x"05520874", -2023 => x"70840556", -2024 => x"0c737170", -2025 => x"84055308", -2026 => x"71708405", -2027 => x"530c7170", -2028 => x"84055308", -2029 => x"71708405", -2030 => x"530c7170", -2031 => x"84055308", -2032 => x"71708405", -2033 => x"530cf016", -2034 => x"5654748f", -2035 => x"26c73883", -2036 => x"75279538", -2037 => x"70708405", -2038 => x"52087470", -2039 => x"8405560c", -2040 => x"fc155574", -2041 => x"8326ed38", -2042 => x"73715452", -2043 => x"ff155170", -2044 => x"ff2e9838", -2045 => x"72708105", -2046 => x"54337270", -2047 => x"81055434", -2048 => x"ff115170", -2049 => x"ff2e0981", -2050 => x"06ea3875", -2051 => x"800c873d", -2052 => x"0d04fb3d", -2053 => x"0d777a71", -2054 => x"028c05a3", -2055 => x"05335854", -2056 => x"54568373", -2057 => x"2780d438", -2058 => x"75830651", -2059 => x"7080cc38", -2060 => x"74882b75", -2061 => x"07707190", -2062 => x"2b075551", -2063 => x"8f7327a7", -2064 => x"38737270", -2065 => x"8405540c", -2066 => x"71747170", -2067 => x"8405530c", -2068 => x"74717084", -2069 => x"05530c74", -2070 => x"71708405", -2071 => x"530cf014", -2072 => x"5452728f", -2073 => x"26db3883", -2074 => x"73279038", -2075 => x"73727084", -2076 => x"05540cfc", -2077 => x"13537283", -2078 => x"26f238ff", -2079 => x"135170ff", -2080 => x"2e933874", -2081 => x"72708105", -2082 => x"5434ff11", -2083 => x"5170ff2e", -2084 => x"098106ef", -2085 => x"3875800c", -2086 => x"873d0d04", -2087 => x"04047070", -2088 => x"7070800b", -2089 => x"80dfe00c", -2090 => x"765184f3", -2091 => x"3f800853", -2092 => x"8008ff2e", -2093 => x"89387280", -2094 => x"0c505050", -2095 => x"500480df", -2096 => x"e0085473", -2097 => x"802eef38", -2098 => x"7574710c", -2099 => x"5272800c", -2100 => x"50505050", -2101 => x"04f93d0d", -2102 => x"797c557b", -2103 => x"548e1122", -2104 => x"70902b70", -2105 => x"902c5557", -2106 => x"80cfe408", -2107 => x"53585683", -2108 => x"f63f8008", -2109 => x"57800b80", -2110 => x"08249338", -2111 => x"80d01608", -2112 => x"80080580", -2113 => x"d0170c76", -2114 => x"800c893d", -2115 => x"0d048c16", -2116 => x"2283dfff", -2117 => x"0655748c", -2118 => x"17237680", -2119 => x"0c893d0d", -2120 => x"04fa3d0d", -2121 => x"788c1122", -2122 => x"70882a70", -2123 => x"81065157", -2124 => x"585674a9", -2125 => x"388c1622", -2126 => x"83dfff06", -2127 => x"55748c17", -2128 => x"237a5479", -2129 => x"538e1622", -2130 => x"70902b70", -2131 => x"902c5456", -2132 => x"80cfe408", -2133 => x"525681b2", -2134 => x"3f883d0d", -2135 => x"04825480", -2136 => x"538e1622", -2137 => x"70902b70", -2138 => x"902c5456", -2139 => x"80cfe408", -2140 => x"525782bb", -2141 => x"3f8c1622", -2142 => x"83dfff06", -2143 => x"55748c17", -2144 => x"237a5479", -2145 => x"538e1622", -2146 => x"70902b70", -2147 => x"902c5456", -2148 => x"80cfe408", -2149 => x"525680f2", -2150 => x"3f883d0d", -2151 => x"04f93d0d", -2152 => x"797c557b", -2153 => x"548e1122", -2154 => x"70902b70", -2155 => x"902c5557", -2156 => x"80cfe408", -2157 => x"53585681", -2158 => x"f63f8008", -2159 => x"578008ff", -2160 => x"2e99388c", -2161 => x"1622a080", -2162 => x"0755748c", -2163 => x"17238008", -2164 => x"80d0170c", -2165 => x"76800c89", -2166 => x"3d0d048c", -2167 => x"162283df", -2168 => x"ff065574", -2169 => x"8c172376", -2170 => x"800c893d", -2171 => x"0d047070", -2172 => x"70748e11", -2173 => x"2270902b", -2174 => x"70902c55", -2175 => x"51515380", -2176 => x"cfe40851", -2177 => x"bd3f5050", -2178 => x"5004fb3d", -2179 => x"0d800b80", -2180 => x"dfe00c7a", -2181 => x"53795278", -2182 => x"5182ff3f", -2183 => x"80085580", -2184 => x"08ff2e88", -2185 => x"3874800c", -2186 => x"873d0d04", -2187 => x"80dfe008", -2188 => x"5675802e", -2189 => x"f0387776", -2190 => x"710c5474", -2191 => x"800c873d", -2192 => x"0d047070", -2193 => x"7070800b", -2194 => x"80dfe00c", -2195 => x"765184cc", -2196 => x"3f800853", -2197 => x"8008ff2e", -2198 => x"89387280", -2199 => x"0c505050", -2200 => x"500480df", -2201 => x"e0085473", -2202 => x"802eef38", -2203 => x"7574710c", -2204 => x"5272800c", -2205 => x"50505050", -2206 => x"04fc3d0d", -2207 => x"800b80df", -2208 => x"e00c7852", -2209 => x"775187b3", -2210 => x"3f800854", -2211 => x"8008ff2e", -2212 => x"88387380", -2213 => x"0c863d0d", -2214 => x"0480dfe0", -2215 => x"08557480", -2216 => x"2ef03876", -2217 => x"75710c53", -2218 => x"73800c86", -2219 => x"3d0d04fb", -2220 => x"3d0d800b", -2221 => x"80dfe00c", -2222 => x"7a537952", -2223 => x"7851848e", -2224 => x"3f800855", -2225 => x"8008ff2e", -2226 => x"88387480", -2227 => x"0c873d0d", -2228 => x"0480dfe0", -2229 => x"08567580", -2230 => x"2ef03877", -2231 => x"76710c54", -2232 => x"74800c87", -2233 => x"3d0d04fb", -2234 => x"3d0d800b", -2235 => x"80dfe00c", -2236 => x"7a537952", -2237 => x"78518296", -2238 => x"3f800855", -2239 => x"8008ff2e", -2240 => x"88387480", -2241 => x"0c873d0d", -2242 => x"0480dfe0", -2243 => x"08567580", -2244 => x"2ef03877", -2245 => x"76710c54", -2246 => x"74800c87", -2247 => x"3d0d0470", -2248 => x"707080df", -2249 => x"d0088938", -2250 => x"80dfe40b", -2251 => x"80dfd00c", -2252 => x"80dfd008", -2253 => x"75115252", -2254 => x"ff537087", -2255 => x"fb808026", -2256 => x"88387080", -2257 => x"dfd00c71", -2258 => x"5372800c", -2259 => x"50505004", -2260 => x"fd3d0d80", -2261 => x"0b80cfd8", -2262 => x"08545472", -2263 => x"812e9b38", -2264 => x"7380dfd4", -2265 => x"0cc2bf3f", -2266 => x"c1963f80", -2267 => x"dfa85281", -2268 => x"51c3fd3f", -2269 => x"80085186", -2270 => x"c23f7280", -2271 => x"dfd40cc2", -2272 => x"a53fc0fc", -2273 => x"3f80dfa8", -2274 => x"528151c3", -2275 => x"e33f8008", -2276 => x"5186a83f", -2277 => x"00ff3900", -2278 => x"ff39f53d", -2279 => x"0d7e6080", -2280 => x"dfd40870", -2281 => x"5b585b5b", -2282 => x"7580c238", -2283 => x"777a25a1", -2284 => x"38771b70", -2285 => x"337081ff", -2286 => x"06585859", -2287 => x"758a2e98", -2288 => x"387681ff", -2289 => x"0651c1bd", -2290 => x"3f811858", -2291 => x"797824e1", -2292 => x"3879800c", -2293 => x"8d3d0d04", -2294 => x"8d51c1a9", -2295 => x"3f783370", -2296 => x"81ff0652", -2297 => x"57c19e3f", -2298 => x"811858e0", -2299 => x"3979557a", -2300 => x"547d5385", -2301 => x"528d3dfc", -2302 => x"0551c0c6", -2303 => x"3f800856", -2304 => x"85b23f7b", -2305 => x"80080c75", -2306 => x"800c8d3d", -2307 => x"0d04f63d", -2308 => x"0d7d7f80", -2309 => x"dfd40870", -2310 => x"5b585a5a", -2311 => x"7580c138", -2312 => x"777925b3", -2313 => x"38c0b93f", -2314 => x"800881ff", -2315 => x"06708d32", -2316 => x"7030709f", -2317 => x"2a515157", -2318 => x"57768a2e", -2319 => x"80c43875", -2320 => x"802ebf38", -2321 => x"771a5676", -2322 => x"76347651", -2323 => x"c0b73f81", -2324 => x"18587878", -2325 => x"24cf3877", -2326 => x"5675800c", -2327 => x"8c3d0d04", -2328 => x"78557954", -2329 => x"7c538452", -2330 => x"8c3dfc05", -2331 => x"51ffbfd2", -2332 => x"3f800856", -2333 => x"84be3f7a", -2334 => x"80080c75", -2335 => x"800c8c3d", -2336 => x"0d04771a", -2337 => x"598a7934", -2338 => x"8118588d", -2339 => x"51ffbff5", -2340 => x"3f8a51ff", -2341 => x"bfef3f77", -2342 => x"56ffbe39", -2343 => x"fb3d0d80", -2344 => x"dfd40870", -2345 => x"56547388", -2346 => x"3874800c", -2347 => x"873d0d04", -2348 => x"77538352", -2349 => x"873dfc05", -2350 => x"51ffbf86", -2351 => x"3f800854", -2352 => x"83f23f75", -2353 => x"80080c73", -2354 => x"800c873d", -2355 => x"0d04fa3d", -2356 => x"0d80dfd4", -2357 => x"08802ea3", -2358 => x"387a5579", -2359 => x"54785386", -2360 => x"52883dfc", -2361 => x"0551ffbe", -2362 => x"d93f8008", -2363 => x"5683c53f", -2364 => x"7680080c", -2365 => x"75800c88", -2366 => x"3d0d0483", -2367 => x"b73f9d0b", -2368 => x"80080cff", -2369 => x"0b800c88", -2370 => x"3d0d04f7", -2371 => x"3d0d7b7d", -2372 => x"5b59bc53", -2373 => x"80527951", -2374 => x"f5f83f80", -2375 => x"70565798", -2376 => x"56741970", -2377 => x"3370782b", -2378 => x"79078118", -2379 => x"f81a5a58", -2380 => x"59555884", -2381 => x"7524ea38", -2382 => x"767a2384", -2383 => x"19588070", -2384 => x"56579856", -2385 => x"74187033", -2386 => x"70782b79", -2387 => x"078118f8", -2388 => x"1a5a5859", -2389 => x"51548475", -2390 => x"24ea3876", -2391 => x"821b2388", -2392 => x"19588070", -2393 => x"56579856", -2394 => x"74187033", -2395 => x"70782b79", -2396 => x"078118f8", -2397 => x"1a5a5859", -2398 => x"51548475", -2399 => x"24ea3876", -2400 => x"841b0c8c", -2401 => x"19588070", -2402 => x"56579856", -2403 => x"74187033", -2404 => x"70782b79", -2405 => x"078118f8", -2406 => x"1a5a5859", -2407 => x"51548475", -2408 => x"24ea3876", -2409 => x"881b2390", -2410 => x"19588070", -2411 => x"56579856", -2412 => x"74187033", -2413 => x"70782b79", -2414 => x"078118f8", -2415 => x"1a5a5859", -2416 => x"51548475", -2417 => x"24ea3876", -2418 => x"8a1b2394", -2419 => x"19588070", -2420 => x"56579856", -2421 => x"74187033", -2422 => x"70782b79", -2423 => x"078118f8", -2424 => x"1a5a5859", -2425 => x"51548475", -2426 => x"24ea3876", -2427 => x"8c1b2398", -2428 => x"19588070", -2429 => x"56579856", -2430 => x"74187033", -2431 => x"70782b79", -2432 => x"078118f8", -2433 => x"1a5a5859", -2434 => x"51548475", -2435 => x"24ea3876", -2436 => x"8e1b239c", -2437 => x"19588070", -2438 => x"5657b856", -2439 => x"74187033", -2440 => x"70782b79", -2441 => x"078118f8", -2442 => x"1a5a5859", -2443 => x"5a548875", -2444 => x"24ea3876", -2445 => x"901b0c8b", -2446 => x"3d0d04e9", -2447 => x"3d0d6a80", -2448 => x"dfd40857", -2449 => x"57759338", -2450 => x"80c0800b", -2451 => x"84180c75", -2452 => x"ac180c75", -2453 => x"800c993d", -2454 => x"0d04893d", -2455 => x"70556a54", -2456 => x"558a5299", -2457 => x"3dffbc05", -2458 => x"51ffbbd6", -2459 => x"3f800877", -2460 => x"53755256", -2461 => x"fd953fbc", -2462 => x"3f778008", -2463 => x"0c75800c", -2464 => x"993d0d04", -2465 => x"fc3d0d81", -2466 => x"5480dfd4", -2467 => x"08883873", -2468 => x"800c863d", -2469 => x"0d047653", -2470 => x"97b95286", -2471 => x"3dfc0551", -2472 => x"ffbb9f3f", -2473 => x"8008548c", -2474 => x"3f748008", -2475 => x"0c73800c", -2476 => x"863d0d04", -2477 => x"80cfe408", -2478 => x"800c04f7", -2479 => x"3d0d7b80", -2480 => x"cfe40882", -2481 => x"c811085a", -2482 => x"545a7780", -2483 => x"2e80da38", -2484 => x"81881884", -2485 => x"1908ff05", -2486 => x"81712b59", -2487 => x"55598074", -2488 => x"2480ea38", -2489 => x"807424b5", -2490 => x"3873822b", -2491 => x"78118805", -2492 => x"56568180", -2493 => x"19087706", -2494 => x"5372802e", -2495 => x"b6387816", -2496 => x"70085353", -2497 => x"79517408", -2498 => x"53722dff", -2499 => x"14fc17fc", -2500 => x"1779812c", -2501 => x"5a575754", -2502 => x"738025d6", -2503 => x"38770858", -2504 => x"77ffad38", -2505 => x"80cfe408", -2506 => x"53bc1308", -2507 => x"a5387951", -2508 => x"f8e23f74", -2509 => x"0853722d", -2510 => x"ff14fc17", -2511 => x"fc177981", -2512 => x"2c5a5757", -2513 => x"54738025", -2514 => x"ffa838d1", -2515 => x"398057ff", -2516 => x"93397251", -2517 => x"bc130854", -2518 => x"732d7951", -2519 => x"f8b63f70", -2520 => x"7080dfb0", -2521 => x"0bfc0570", -2522 => x"08525270", -2523 => x"ff2e9138", -2524 => x"702dfc12", -2525 => x"70085252", -2526 => x"70ff2e09", -2527 => x"8106f138", -2528 => x"50500404", -2529 => x"ffbb8c3f", -2530 => x"04000000", -2531 => x"00000040", -2532 => x"48656c6c", -2533 => x"6f20776f", -2534 => x"726c6420", -2535 => x"310a0000", -2536 => x"48656c6c", -2537 => x"6f20776f", -2538 => x"726c6420", -2539 => x"320a0000", -2540 => x"0a000000", -2541 => x"43000000", -2542 => x"64756d6d", -2543 => x"792e6578", -2544 => x"65000000", -2545 => x"00ffffff", -2546 => x"ff00ffff", -2547 => x"ffff00ff", -2548 => x"ffffff00", -2549 => x"00000000", -2550 => x"00000000", -2551 => x"00000000", -2552 => x"00002fb8", -2553 => x"000027e8", -2554 => x"00000000", -2555 => x"00002a50", -2556 => x"00002aac", -2557 => x"00002b08", -2558 => x"00000000", -2559 => x"00000000", -2560 => x"00000000", -2561 => x"00000000", -2562 => x"00000000", -2563 => x"00000000", -2564 => x"00000000", -2565 => x"00000000", -2566 => x"00000000", -2567 => x"000027b4", -2568 => x"00000000", -2569 => x"00000000", -2570 => x"00000000", -2571 => x"00000000", -2572 => x"00000000", -2573 => x"00000000", -2574 => x"00000000", -2575 => x"00000000", -2576 => x"00000000", -2577 => x"00000000", -2578 => x"00000000", -2579 => x"00000000", -2580 => x"00000000", -2581 => x"00000000", -2582 => x"00000000", -2583 => x"00000000", -2584 => x"00000000", -2585 => x"00000000", -2586 => x"00000000", -2587 => x"00000000", -2588 => x"00000000", -2589 => x"00000000", -2590 => x"00000000", -2591 => x"00000000", -2592 => x"00000000", -2593 => x"00000000", -2594 => x"00000000", -2595 => x"00000000", -2596 => x"00000001", -2597 => x"330eabcd", -2598 => x"1234e66d", -2599 => x"deec0005", -2600 => x"000b0000", -2601 => x"00000000", -2602 => x"00000000", -2603 => x"00000000", -2604 => x"00000000", -2605 => x"00000000", -2606 => x"00000000", -2607 => x"00000000", -2608 => x"00000000", -2609 => x"00000000", -2610 => x"00000000", -2611 => x"00000000", -2612 => x"00000000", -2613 => x"00000000", -2614 => x"00000000", -2615 => x"00000000", -2616 => x"00000000", -2617 => x"00000000", -2618 => x"00000000", -2619 => x"00000000", -2620 => x"00000000", -2621 => x"00000000", -2622 => x"00000000", -2623 => x"00000000", -2624 => x"00000000", -2625 => x"00000000", -2626 => x"00000000", -2627 => x"00000000", -2628 => x"00000000", -2629 => x"00000000", -2630 => x"00000000", -2631 => x"00000000", -2632 => x"00000000", -2633 => x"00000000", -2634 => x"00000000", -2635 => x"00000000", -2636 => x"00000000", -2637 => x"00000000", -2638 => x"00000000", -2639 => x"00000000", -2640 => x"00000000", -2641 => x"00000000", -2642 => x"00000000", -2643 => x"00000000", -2644 => x"00000000", -2645 => x"00000000", -2646 => x"00000000", -2647 => x"00000000", -2648 => x"00000000", -2649 => x"00000000", -2650 => x"00000000", -2651 => x"00000000", -2652 => x"00000000", -2653 => x"00000000", -2654 => x"00000000", -2655 => x"00000000", -2656 => x"00000000", -2657 => x"00000000", -2658 => x"00000000", -2659 => x"00000000", -2660 => x"00000000", -2661 => x"00000000", -2662 => x"00000000", -2663 => x"00000000", -2664 => x"00000000", -2665 => x"00000000", -2666 => x"00000000", -2667 => x"00000000", -2668 => x"00000000", -2669 => x"00000000", -2670 => x"00000000", -2671 => x"00000000", -2672 => x"00000000", -2673 => x"00000000", -2674 => x"00000000", -2675 => x"00000000", -2676 => x"00000000", -2677 => x"00000000", -2678 => x"00000000", -2679 => x"00000000", -2680 => x"00000000", -2681 => x"00000000", -2682 => x"00000000", -2683 => x"00000000", -2684 => x"00000000", -2685 => x"00000000", -2686 => x"00000000", -2687 => x"00000000", -2688 => x"00000000", -2689 => x"00000000", -2690 => x"00000000", -2691 => x"00000000", -2692 => x"00000000", -2693 => x"00000000", -2694 => x"00000000", -2695 => x"00000000", -2696 => x"00000000", -2697 => x"00000000", -2698 => x"00000000", -2699 => x"00000000", -2700 => x"00000000", -2701 => x"00000000", -2702 => x"00000000", -2703 => x"00000000", -2704 => x"00000000", -2705 => x"00000000", -2706 => x"00000000", -2707 => x"00000000", -2708 => x"00000000", -2709 => x"00000000", -2710 => x"00000000", -2711 => x"00000000", -2712 => x"00000000", -2713 => x"00000000", -2714 => x"00000000", -2715 => x"00000000", -2716 => x"00000000", -2717 => x"00000000", -2718 => x"00000000", -2719 => x"00000000", -2720 => x"00000000", -2721 => x"00000000", -2722 => x"00000000", -2723 => x"00000000", -2724 => x"00000000", -2725 => x"00000000", -2726 => x"00000000", -2727 => x"00000000", -2728 => x"00000000", -2729 => x"00000000", -2730 => x"00000000", -2731 => x"00000000", -2732 => x"00000000", -2733 => x"00000000", -2734 => x"00000000", -2735 => x"00000000", -2736 => x"00000000", -2737 => x"00000000", -2738 => x"00000000", -2739 => x"00000000", -2740 => x"00000000", -2741 => x"00000000", -2742 => x"00000000", -2743 => x"00000000", -2744 => x"00000000", -2745 => x"00000000", -2746 => x"00000000", -2747 => x"00000000", -2748 => x"00000000", -2749 => x"00000000", -2750 => x"00000000", -2751 => x"00000000", -2752 => x"00000000", -2753 => x"00000000", -2754 => x"00000000", -2755 => x"00000000", -2756 => x"00000000", -2757 => x"00000000", -2758 => x"00000000", -2759 => x"00000000", -2760 => x"00000000", -2761 => x"00000000", -2762 => x"00000000", -2763 => x"00000000", -2764 => x"00000000", -2765 => x"00000000", -2766 => x"00000000", -2767 => x"00000000", -2768 => x"00000000", -2769 => x"00000000", -2770 => x"00000000", -2771 => x"00000000", -2772 => x"00000000", -2773 => x"00000000", -2774 => x"00000000", -2775 => x"00000000", -2776 => x"00000000", -2777 => x"00000000", -2778 => x"00000000", -2779 => x"00000000", -2780 => x"00000000", -2781 => x"00000000", -2782 => x"00000000", -2783 => x"00000000", -2784 => x"00000000", -2785 => x"00000000", -2786 => x"00000000", -2787 => x"00000000", -2788 => x"00000000", -2789 => x"ffffffff", -2790 => x"00000000", -2791 => x"00020000", -2792 => x"00000000", -2793 => x"00000000", -2794 => x"00002ba0", -2795 => x"00002ba0", -2796 => x"00002ba8", -2797 => x"00002ba8", -2798 => x"00002bb0", -2799 => x"00002bb0", -2800 => x"00002bb8", -2801 => x"00002bb8", -2802 => x"00002bc0", -2803 => x"00002bc0", -2804 => x"00002bc8", -2805 => x"00002bc8", -2806 => x"00002bd0", -2807 => x"00002bd0", -2808 => x"00002bd8", -2809 => x"00002bd8", -2810 => x"00002be0", -2811 => x"00002be0", -2812 => x"00002be8", -2813 => x"00002be8", -2814 => x"00002bf0", -2815 => x"00002bf0", -2816 => x"00002bf8", -2817 => x"00002bf8", -2818 => x"00002c00", -2819 => x"00002c00", -2820 => x"00002c08", -2821 => x"00002c08", -2822 => x"00002c10", -2823 => x"00002c10", -2824 => x"00002c18", -2825 => x"00002c18", -2826 => x"00002c20", -2827 => x"00002c20", -2828 => x"00002c28", -2829 => x"00002c28", -2830 => x"00002c30", -2831 => x"00002c30", -2832 => x"00002c38", -2833 => x"00002c38", -2834 => x"00002c40", -2835 => x"00002c40", -2836 => x"00002c48", -2837 => x"00002c48", -2838 => x"00002c50", -2839 => x"00002c50", -2840 => x"00002c58", -2841 => x"00002c58", -2842 => x"00002c60", -2843 => x"00002c60", -2844 => x"00002c68", -2845 => x"00002c68", -2846 => x"00002c70", -2847 => x"00002c70", -2848 => x"00002c78", -2849 => x"00002c78", -2850 => x"00002c80", -2851 => x"00002c80", -2852 => x"00002c88", -2853 => x"00002c88", -2854 => x"00002c90", -2855 => x"00002c90", -2856 => x"00002c98", -2857 => x"00002c98", -2858 => x"00002ca0", -2859 => x"00002ca0", -2860 => x"00002ca8", -2861 => x"00002ca8", -2862 => x"00002cb0", -2863 => x"00002cb0", -2864 => x"00002cb8", -2865 => x"00002cb8", -2866 => x"00002cc0", -2867 => x"00002cc0", -2868 => x"00002cc8", -2869 => x"00002cc8", -2870 => x"00002cd0", -2871 => x"00002cd0", -2872 => x"00002cd8", -2873 => x"00002cd8", -2874 => x"00002ce0", -2875 => x"00002ce0", -2876 => x"00002ce8", -2877 => x"00002ce8", -2878 => x"00002cf0", -2879 => x"00002cf0", -2880 => x"00002cf8", -2881 => x"00002cf8", -2882 => x"00002d00", -2883 => x"00002d00", -2884 => x"00002d08", -2885 => x"00002d08", -2886 => x"00002d10", -2887 => x"00002d10", -2888 => x"00002d18", -2889 => x"00002d18", -2890 => x"00002d20", -2891 => x"00002d20", -2892 => x"00002d28", -2893 => x"00002d28", -2894 => x"00002d30", -2895 => x"00002d30", -2896 => x"00002d38", -2897 => x"00002d38", -2898 => x"00002d40", -2899 => x"00002d40", -2900 => x"00002d48", -2901 => x"00002d48", -2902 => x"00002d50", -2903 => x"00002d50", -2904 => x"00002d58", -2905 => x"00002d58", -2906 => x"00002d60", -2907 => x"00002d60", -2908 => x"00002d68", -2909 => x"00002d68", -2910 => x"00002d70", -2911 => x"00002d70", -2912 => x"00002d78", -2913 => x"00002d78", -2914 => x"00002d80", -2915 => x"00002d80", -2916 => x"00002d88", -2917 => x"00002d88", -2918 => x"00002d90", -2919 => x"00002d90", -2920 => x"00002d98", -2921 => x"00002d98", -2922 => x"00002da0", -2923 => x"00002da0", -2924 => x"00002da8", -2925 => x"00002da8", -2926 => x"00002db0", -2927 => x"00002db0", -2928 => x"00002db8", -2929 => x"00002db8", -2930 => x"00002dc0", -2931 => x"00002dc0", -2932 => x"00002dc8", -2933 => x"00002dc8", -2934 => x"00002dd0", -2935 => x"00002dd0", -2936 => x"00002dd8", -2937 => x"00002dd8", -2938 => x"00002de0", -2939 => x"00002de0", -2940 => x"00002de8", -2941 => x"00002de8", -2942 => x"00002df0", -2943 => x"00002df0", -2944 => x"00002df8", -2945 => x"00002df8", -2946 => x"00002e00", -2947 => x"00002e00", -2948 => x"00002e08", -2949 => x"00002e08", -2950 => x"00002e10", -2951 => x"00002e10", -2952 => x"00002e18", -2953 => x"00002e18", -2954 => x"00002e20", -2955 => x"00002e20", -2956 => x"00002e28", -2957 => x"00002e28", -2958 => x"00002e30", -2959 => x"00002e30", -2960 => x"00002e38", -2961 => x"00002e38", -2962 => x"00002e40", -2963 => x"00002e40", -2964 => x"00002e48", -2965 => x"00002e48", -2966 => x"00002e50", -2967 => x"00002e50", -2968 => x"00002e58", -2969 => x"00002e58", -2970 => x"00002e60", -2971 => x"00002e60", -2972 => x"00002e68", -2973 => x"00002e68", -2974 => x"00002e70", -2975 => x"00002e70", -2976 => x"00002e78", -2977 => x"00002e78", -2978 => x"00002e80", -2979 => x"00002e80", -2980 => x"00002e88", -2981 => x"00002e88", -2982 => x"00002e90", -2983 => x"00002e90", -2984 => x"00002e98", -2985 => x"00002e98", -2986 => x"00002ea0", -2987 => x"00002ea0", -2988 => x"00002ea8", -2989 => x"00002ea8", -2990 => x"00002eb0", -2991 => x"00002eb0", -2992 => x"00002eb8", -2993 => x"00002eb8", -2994 => x"00002ec0", -2995 => x"00002ec0", -2996 => x"00002ec8", -2997 => x"00002ec8", -2998 => x"00002ed0", -2999 => x"00002ed0", -3000 => x"00002ed8", -3001 => x"00002ed8", -3002 => x"00002ee0", -3003 => x"00002ee0", -3004 => x"00002ee8", -3005 => x"00002ee8", -3006 => x"00002ef0", -3007 => x"00002ef0", -3008 => x"00002ef8", -3009 => x"00002ef8", -3010 => x"00002f00", -3011 => x"00002f00", -3012 => x"00002f08", -3013 => x"00002f08", -3014 => x"00002f10", -3015 => x"00002f10", -3016 => x"00002f18", -3017 => x"00002f18", -3018 => x"00002f20", -3019 => x"00002f20", -3020 => x"00002f28", -3021 => x"00002f28", -3022 => x"00002f30", -3023 => x"00002f30", -3024 => x"00002f38", -3025 => x"00002f38", -3026 => x"00002f40", -3027 => x"00002f40", -3028 => x"00002f48", -3029 => x"00002f48", -3030 => x"00002f50", -3031 => x"00002f50", -3032 => x"00002f58", -3033 => x"00002f58", -3034 => x"00002f60", -3035 => x"00002f60", -3036 => x"00002f68", -3037 => x"00002f68", -3038 => x"00002f70", -3039 => x"00002f70", -3040 => x"00002f78", -3041 => x"00002f78", -3042 => x"00002f80", -3043 => x"00002f80", -3044 => x"00002f88", -3045 => x"00002f88", -3046 => x"00002f90", -3047 => x"00002f90", -3048 => x"00002f98", -3049 => x"00002f98", -3050 => x"000027b8", -3051 => x"ffffffff", -3052 => x"00000000", -3053 => x"ffffffff", -3054 => x"00000000", - others => x"00000000" -); - -begin - -mem_busy<=mem_readEnable; -- we're done on the cycle after we serve the read request - -process (clk, areset) -begin - if areset = '1' then - elsif (clk'event and clk = '1') then - if (mem_writeEnable = '1') then - ram(to_integer(unsigned(mem_addr(maxAddrBit downto minAddrBit)))) := mem_write; - end if; - if (mem_readEnable = '1') then - mem_read <= ram(to_integer(unsigned(mem_addr(maxAddrBit downto minAddrBit)))); - end if; - end if; -end process; - - - - -end dram_arch; diff --git a/zpu/hdl/zpu4/src/zpu_config_trace.vhd b/zpu/hdl/zpu4/src/zpu_config_trace.vhd deleted file mode 100644 index d765d9a..0000000 --- a/zpu/hdl/zpu4/src/zpu_config_trace.vhd +++ /dev/null @@ -1,17 +0,0 @@ -library ieee; -use ieee.std_logic_1164.all; - -package zpu_config is - - constant Generate_Trace : boolean := true; - constant wordPower : integer := 5; - -- during simulation, set this to '0' to get matching trace.txt - constant DontCareValue : std_logic := '0'; - -- Clock frequency in MHz. - constant ZPU_Frequency : std_logic_vector(7 downto 0) := x"64"; - constant maxAddrBitIncIO : integer := 27; - constant maxAddrBitDRAM : integer := 16; - constant maxAddrBitBRAM : integer := 16; - constant spStart : std_logic_vector(maxAddrBitIncIO downto 0) := x"001fff8"; - -end zpu_config; -- cgit v1.1 From 6647b91cf267e7e155c95c6adbcfbc43f083356b Mon Sep 17 00:00:00 2001 From: oharboe Date: Tue, 17 Jun 2008 22:09:13 +0000 Subject: * io.vhd: fix address comparsion and added numerous outputs during simulation to make things a bit easier * zpu_config.vhd: do not use hardcoded startSp, allows more easily tinkering w/RAM size --- zpu/hdl/zpu4/src/io.vhd | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/io.vhd b/zpu/hdl/zpu4/src/io.vhd index 9e65929..f71f51d 100644 --- a/zpu/hdl/zpu4/src/io.vhd +++ b/zpu/hdl/zpu4/src/io.vhd @@ -37,6 +37,7 @@ signal timer_we : std_logic; signal serving : std_logic; file l_file : TEXT open write_mode is log_file; +constant lowAddrBits: std_logic_vector(minAddrBit-1 downto 0) := (others=>'0'); begin @@ -54,42 +55,50 @@ begin process(areset, clk) begin + taddr := (others => '0'); + taddr(maxAddrBit downto minAddrBit) := addr; + if (areset = '1') then -- timer_we <= '0'; elsif (clk'event and clk = '1') then -- timer_we <= '0'; if writeEnable = '1' then - -- external interface (fixed address) - -- extend compare to avoid waring messages - if ("000" & addr)=x"2028003" then + -- external interface (fixed address) + -- extend compare to avoid waring messages + if ("1" & addr & lowAddrBits)=x"80a000c" then + report "Write to UART[0]" & " :0x" & hstr(write); -- Write to UART -- report "" & character'image(conv_integer(memBint)) severity note; print(l_file, character'val(to_integer(unsigned(write)))); elsif addr(12)='1' then + report "Write to TIMER" & " :0x" & hstr(write); -- report "xxx" severity failure; -- timer_we <= '1'; else print(l_file, character'val(to_integer(unsigned(write)))); - -- report "Illegal IO write" severity warning; + report "Illegal IO write @" & "0x" & hstr(taddr) severity warning; end if; end if; read <= (others => '0'); if (readEnable = '1') then - -- extend compare to avoid waring messages - if ("000" & addr)=x"0001001" then - read <= (0=>'1', others => '0'); -- recieve empty + -- extend compare to avoid waring messages + if ("1" & addr & lowAddrBits)=x"80a000c" then + report "Read UART[0]"; + read(8) <= '0'; -- output fifo not full + read(9) <= '1'; -- receiver not empty + elsif ("1" & addr & lowAddrBits)=x"80a0010" then + report "Read UART[1]"; + read(8) <= '1'; -- receiver not empty + read(7 downto 0) <= (others => '0'); elsif addr(12)='1' then + report "Read TIMER"; read(7 downto 0) <= timer_read; elsif addr(11)='1' then + report "Read ZPU Freq"; read(7 downto 0) <= ZPU_Frequency; - -- extend compare to avoid waring messages - elsif ("000" & addr)=x"2028003" then - read <= (others => '0'); else - read <= (others => '0'); - read(8) <= '1'; - -- report "Illegal IO read" severity warning; + report "Illegal IO read @" & "0x" & hstr(taddr) severity warning; end if; end if; end if; -- cgit v1.1 From 8c213415fe0ddc1f9eae0b96e023eb89f89d1c47 Mon Sep 17 00:00:00 2001 From: oharboe Date: Wed, 18 Jun 2008 17:04:44 +0000 Subject: I'm also attaching another patch which removes unisim/roc dependency (it was used just to pulse the areset) and fixes paths for building the ghdl examples out of the box. I guess this is the easiest way to get zpu running on linux with minimum effort. You should check if the areset change doesn't break modelsim. It feels much simpler this way and seems to work the same, i might be missing something. --- zpu/hdl/zpu4/src/io.vhd | 1 + 1 file changed, 1 insertion(+) (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/io.vhd b/zpu/hdl/zpu4/src/io.vhd index f71f51d..e2576e2 100644 --- a/zpu/hdl/zpu4/src/io.vhd +++ b/zpu/hdl/zpu4/src/io.vhd @@ -54,6 +54,7 @@ begin timer_we <= writeEnable and addr(12); process(areset, clk) + variable taddr : std_logic_vector(maxAddrBit downto 0); begin taddr := (others => '0'); taddr(maxAddrBit downto minAddrBit) := addr; -- cgit v1.1 From 24d353cdac17eca4851271c824f421e8ab5697f3 Mon Sep 17 00:00:00 2001 From: oharboe Date: Wed, 18 Jun 2008 17:21:36 +0000 Subject: take 2 --- zpu/hdl/zpu4/src/io.vhd | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/io.vhd b/zpu/hdl/zpu4/src/io.vhd index e2576e2..a0e494a 100644 --- a/zpu/hdl/zpu4/src/io.vhd +++ b/zpu/hdl/zpu4/src/io.vhd @@ -38,6 +38,8 @@ signal serving : std_logic; file l_file : TEXT open write_mode is log_file; constant lowAddrBits: std_logic_vector(minAddrBit-1 downto 0) := (others=>'0'); +constant tx_full: std_logic := '0'; +constant rx_empty: std_logic := '1'; begin @@ -86,11 +88,11 @@ begin -- extend compare to avoid waring messages if ("1" & addr & lowAddrBits)=x"80a000c" then report "Read UART[0]"; - read(8) <= '0'; -- output fifo not full - read(9) <= '1'; -- receiver not empty + read(8) <= not tx_full; -- output fifo not full + read(9) <= not rx_empty; -- receiver not empty elsif ("1" & addr & lowAddrBits)=x"80a0010" then report "Read UART[1]"; - read(8) <= '1'; -- receiver not empty + read(8) <= not rx_empty; -- receiver not empty read(7 downto 0) <= (others => '0'); elsif addr(12)='1' then report "Read TIMER"; -- cgit v1.1 From 5d329cc628e4174874382547397149e414ec0ad8 Mon Sep 17 00:00:00 2001 From: oharboe Date: Fri, 15 Aug 2008 20:11:36 +0000 Subject: added FreeBSD license. Finally. --- zpu/hdl/zpu4/src/trace.vhd | 34 ++++++++++++++++++++++++++++++++++ zpu/hdl/zpu4/src/txt_util.vhd | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/trace.vhd b/zpu/hdl/zpu4/src/trace.vhd index e687aaf..2413970 100644 --- a/zpu/hdl/zpu4/src/trace.vhd +++ b/zpu/hdl/zpu4/src/trace.vhd @@ -1,3 +1,37 @@ +-- ZPU +-- +-- Copyright 2004-2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com +-- +-- The FreeBSD license +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above +-- copyright notice, this list of conditions and the following +-- disclaimer in the documentation and/or other materials +-- provided with the distribution. +-- +-- THIS SOFTWARE IS PROVIDED BY THE ZPU PROJECT ``AS IS'' AND ANY +-- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +-- ZPU PROJECT 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. +-- +-- The views and conclusions contained in the software and documentation +-- are those of the authors and should not be interpreted as representing +-- official policies, either expressed or implied, of the ZPU Project. + library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; diff --git a/zpu/hdl/zpu4/src/txt_util.vhd b/zpu/hdl/zpu4/src/txt_util.vhd index d3bf01a..3d5297a 100644 --- a/zpu/hdl/zpu4/src/txt_util.vhd +++ b/zpu/hdl/zpu4/src/txt_util.vhd @@ -1,3 +1,37 @@ +-- ZPU +-- +-- Copyright 2004-2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com +-- +-- The FreeBSD license +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above +-- copyright notice, this list of conditions and the following +-- disclaimer in the documentation and/or other materials +-- provided with the distribution. +-- +-- THIS SOFTWARE IS PROVIDED BY THE ZPU PROJECT ``AS IS'' AND ANY +-- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +-- ZPU PROJECT 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. +-- +-- The views and conclusions contained in the software and documentation +-- are those of the authors and should not be interpreted as representing +-- official policies, either expressed or implied, of the ZPU Project. + library ieee; use ieee.std_logic_1164.all; use std.textio.all; -- cgit v1.1 From 04772b6a0bbe7017f5f7b44cfa203c3f7efbff64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Tue, 1 Mar 2011 20:52:55 +0100 Subject: whitespace fixes: use fromdos on all .vhd files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Øyvind Harboe --- zpu/hdl/zpu4/src/clocks.vhd | 490 ++++++++-------- zpu/hdl/zpu4/src/io.vhd | 224 ++++---- zpu/hdl/zpu4/src/timer.vhd | 122 ++-- zpu/hdl/zpu4/src/trace.vhd | 234 ++++---- zpu/hdl/zpu4/src/txt_util.vhd | 1242 ++++++++++++++++++++--------------------- zpu/hdl/zpu4/src/zpuio.vhd | 464 +++++++-------- 6 files changed, 1388 insertions(+), 1388 deletions(-) (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/clocks.vhd b/zpu/hdl/zpu4/src/clocks.vhd index a352b3c..704d790 100644 --- a/zpu/hdl/zpu4/src/clocks.vhd +++ b/zpu/hdl/zpu4/src/clocks.vhd @@ -1,246 +1,246 @@ -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.STD_LOGIC_UNSIGNED.ALL; - -library UNISIM; -use UNISIM.vcomponents.all; - -entity clocks is - port ( areset : in std_logic; - cpu_clk_p : in std_logic; - sdr_clk_fb_p : in std_logic; - cpu_clk : out std_logic; - cpu_clk_2x : out std_logic; - cpu_clk_4x : out std_logic; - ddr_in_clk : out std_logic; - ddr_in_clk_2x : out std_logic; - locked : out std_logic_vector(2 downto 0)); -end clocks; - -architecture behave of clocks is - -signal low : std_logic; - -signal cpu_clk_in : std_logic; -signal sdr_clk_fb_in : std_logic; - -signal dcm_cpu1 : std_logic; -signal dcm_cpu2 : std_logic; -signal dcm_cpu2_dum : std_logic; -signal dcm_cpu4 : std_logic; -signal dcm_ddr2 : std_logic; -signal dcm_ddr2_2x : std_logic; - -signal cpu_clk_int : std_logic; -signal cpu_clk_2x_int : std_logic; -signal cpu_clk_2x_dum_int : std_logic; -signal cpu_clk_4x_int : std_logic; -signal ddr_in_clk_int : std_logic; -signal ddr_in_clk_2x_int : std_logic; - -signal dcm1_locked_del : std_logic; -signal dcm2_locked_del : std_logic; -signal dcm2_reset : std_logic; -signal dcm3_reset : std_logic; - -signal locked_int : std_logic_vector(2 downto 0); -signal del_addr : std_logic_vector(3 downto 0); - -begin - - low <= '0'; - del_addr <= "1111"; - - cpu_clk <= cpu_clk_int; - cpu_clk_2x <= cpu_clk_2x_int; - cpu_clk_4x <= cpu_clk_4x_int; - ddr_in_clk <= ddr_in_clk_int; - ddr_in_clk_2x <= ddr_in_clk_2x_int; - locked <= locked_int; - - - CPU_IBUFG: - IBUFG port map ( - O => cpu_clk_in, - I => cpu_clk_p); - - SDR_FB_IBUFG: - IBUFG port map ( - O => sdr_clk_fb_in, - I => sdr_clk_fb_p); - - dcm2_rst: - SRL16 generic map ( - INIT => X"0000") - port map ( - Q => dcm1_locked_del, - A0 => del_addr(0), - A1 => del_addr(1), - A2 => del_addr(2), - A3 => del_addr(3), - CLK => cpu_clk_int, - D => locked_int(0)); - - dcm2_reset <= not(dcm1_locked_del); - - dcm3_rst: - SRL16 generic map ( - INIT => X"0000") - port map ( - Q => dcm2_locked_del, - A0 => del_addr(0), - A1 => del_addr(1), - A2 => del_addr(2), - A3 => del_addr(3), - CLK => cpu_clk_int, - D => locked_int(1)); - - dcm3_reset <= not(dcm2_locked_del); - - cpu1_dcm: - DCM generic map ( - CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5 - -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0 - CLKFX_DIVIDE => 1, -- Can be any interger from 1 to 32 - CLKFX_MULTIPLY => 4, -- Can be any integer from 1 to 32 - CLKIN_DIVIDE_BY_2 => FALSE, -- TRUE/FALSE to enable CLKIN divide by two feature - CLKIN_PERIOD => 15.625, -- Specify period of input clock - CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift of NONE, FIXED or VARIABLE - CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE, 1X or 2X - DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or - -- an integer from 0 to 15 - DFS_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for frequency synthesis - DLL_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for DLL - DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSE - FACTORY_JF => X"8080", -- FACTORY JF Values - PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 255 - STARTUP_WAIT => FALSE) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE - port map ( - CLK0 => dcm_cpu1, -- 0 degree DCM CLK ouptput - CLK180 => open, -- 180 degree DCM CLK output - CLK270 => open, -- 270 degree DCM CLK output - CLK2X => dcm_cpu2, -- 2X DCM CLK output - CLK2X180 => open, -- 2X, 180 degree DCM CLK out - CLK90 => open, -- 90 degree DCM CLK output - CLKDV => open, -- Divided DCM CLK out (CLKDV_DIVIDE) - CLKFX => open, -- DCM CLK synthesis out (M/D) - CLKFX180 => open, -- 180 degree CLK synthesis out - LOCKED => locked_int(0), -- DCM LOCK status output - PSDONE => open, -- Dynamic phase adjust done output - STATUS => open, -- 8-bit DCM status bits output - CLKFB => cpu_clk_int, -- DCM clock feedback - CLKIN => cpu_clk_in, -- Clock input (from IBUFG, BUFG or DCM) - PSCLK => low, -- Dynamic phase adjust clock input - PSEN => low, -- Dynamic phase adjust enable input - PSINCDEC => low, -- Dynamic phase adjust increment/decrement - RST => areset); -- DCM asynchronous reset input - - cpu2_dcm: - DCM generic map ( - CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5 - -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0 - CLKFX_DIVIDE => 1, -- Can be any interger from 1 to 32 - CLKFX_MULTIPLY => 4, -- Can be any integer from 1 to 32 - CLKIN_DIVIDE_BY_2 => FALSE, -- TRUE/FALSE to enable CLKIN divide by two feature - CLKIN_PERIOD => 7.8125, -- Specify period of input clock - CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift of NONE, FIXED or VARIABLE - CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE, 1X or 2X - DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or - -- an integer from 0 to 15 - DFS_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for frequency synthesis - DLL_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for DLL - DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSE - FACTORY_JF => X"8080", -- FACTORY JF Values - PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 255 - STARTUP_WAIT => FALSE) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE - port map ( - CLK0 => dcm_cpu2_dum, -- 0 degree DCM CLK ouptput - CLK180 => open, -- 180 degree DCM CLK output - CLK270 => open, -- 270 degree DCM CLK output - CLK2X => dcm_cpu4, -- 2X DCM CLK output - CLK2X180 => open, -- 2X, 180 degree DCM CLK out - CLK90 => open, -- 90 degree DCM CLK output - CLKDV => open, -- Divided DCM CLK out (CLKDV_DIVIDE) - CLKFX => open, -- DCM CLK synthesis out (M/D) - CLKFX180 => open, -- 180 degree CLK synthesis out - LOCKED => locked_int(1), -- DCM LOCK status output - PSDONE => open, -- Dynamic phase adjust done output - STATUS => open, -- 8-bit DCM status bits output - CLKFB => cpu_clk_2x_dum_int, -- DCM clock feedback - CLKIN => cpu_clk_2x_int, -- Clock input (from IBUFG, BUFG or DCM) - PSCLK => low, -- Dynamic phase adjust clock input - PSEN => low, -- Dynamic phase adjust enable input - PSINCDEC => low, -- Dynamic phase adjust increment/decrement - RST => dcm2_reset); -- DCM asynchronous reset input - - ddr_read_dcm: - DCM generic map ( - CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5 - -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0 - CLKFX_DIVIDE => 1, -- Can be any interger from 1 to 32 - CLKFX_MULTIPLY => 4, -- Can be any integer from 1 to 32 - CLKIN_DIVIDE_BY_2 => FALSE, -- TRUE/FALSE to enable CLKIN divide by two feature - CLKIN_PERIOD => 7.8125, -- Specify period of input clock - CLKOUT_PHASE_SHIFT => "FIXED", -- Specify phase shift of NONE, FIXED or VARIABLE --- CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift of NONE, FIXED or VARIABLE - CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE, 1X or 2X - DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or - -- an integer from 0 to 15 - DFS_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for frequency synthesis - DLL_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for DLL - DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSE - FACTORY_JF => X"8080", -- FACTORY JF Values - PHASE_SHIFT => 103, -- Amount of fixed phase shift from -255 to 255 --- PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 255 - STARTUP_WAIT => FALSE) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE - port map ( - CLK0 => dcm_ddr2, -- 0 degree DCM CLK ouptput - CLK180 => open, -- 180 degree DCM CLK output - CLK270 => open, -- 270 degree DCM CLK output - CLK2X => dcm_ddr2_2x, -- 2X DCM CLK output - CLK2X180 => open, -- 2X, 180 degree DCM CLK out - CLK90 => open, -- 90 degree DCM CLK output - CLKDV => open, -- Divided DCM CLK out (CLKDV_DIVIDE) - CLKFX => open, -- DCM CLK synthesis out (M/D) - CLKFX180 => open, -- 180 degree CLK synthesis out - LOCKED => locked_int(2), -- DCM LOCK status output - PSDONE => open, -- Dynamic phase adjust done output - STATUS => open, -- 8-bit DCM status bits output - CLKFB => ddr_in_clk_int, -- DCM clock feedback - CLKIN => sdr_clk_fb_in, -- Clock input (from IBUFG, BUFG or DCM) - PSCLK => low, -- Dynamic phase adjust clock input - PSEN => low, -- Dynamic phase adjust enable input - PSINCDEC => low, -- Dynamic phase adjust increment/decrement - RST => dcm3_reset); -- DCM asynchronous reset input - - cpu1: - BUFG port map ( - I => dcm_cpu1, - O => cpu_clk_int); - - cpu2: - BUFG port map ( - I => dcm_cpu2, - O => cpu_clk_2x_int); - - cpu2_dum: - BUFG port map ( - I => dcm_cpu2_dum, - O => cpu_clk_2x_dum_int); - - cpu4: - BUFG port map ( - I => dcm_cpu4, - O => cpu_clk_4x_int); - - ddr_clk: - BUFG port map ( - I => dcm_ddr2, - O => ddr_in_clk_int); - - ddr_clk_2x: - BUFG port map ( - I => dcm_ddr2_2x, - O => ddr_in_clk_2x_int); - +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +library UNISIM; +use UNISIM.vcomponents.all; + +entity clocks is + port ( areset : in std_logic; + cpu_clk_p : in std_logic; + sdr_clk_fb_p : in std_logic; + cpu_clk : out std_logic; + cpu_clk_2x : out std_logic; + cpu_clk_4x : out std_logic; + ddr_in_clk : out std_logic; + ddr_in_clk_2x : out std_logic; + locked : out std_logic_vector(2 downto 0)); +end clocks; + +architecture behave of clocks is + +signal low : std_logic; + +signal cpu_clk_in : std_logic; +signal sdr_clk_fb_in : std_logic; + +signal dcm_cpu1 : std_logic; +signal dcm_cpu2 : std_logic; +signal dcm_cpu2_dum : std_logic; +signal dcm_cpu4 : std_logic; +signal dcm_ddr2 : std_logic; +signal dcm_ddr2_2x : std_logic; + +signal cpu_clk_int : std_logic; +signal cpu_clk_2x_int : std_logic; +signal cpu_clk_2x_dum_int : std_logic; +signal cpu_clk_4x_int : std_logic; +signal ddr_in_clk_int : std_logic; +signal ddr_in_clk_2x_int : std_logic; + +signal dcm1_locked_del : std_logic; +signal dcm2_locked_del : std_logic; +signal dcm2_reset : std_logic; +signal dcm3_reset : std_logic; + +signal locked_int : std_logic_vector(2 downto 0); +signal del_addr : std_logic_vector(3 downto 0); + +begin + + low <= '0'; + del_addr <= "1111"; + + cpu_clk <= cpu_clk_int; + cpu_clk_2x <= cpu_clk_2x_int; + cpu_clk_4x <= cpu_clk_4x_int; + ddr_in_clk <= ddr_in_clk_int; + ddr_in_clk_2x <= ddr_in_clk_2x_int; + locked <= locked_int; + + + CPU_IBUFG: + IBUFG port map ( + O => cpu_clk_in, + I => cpu_clk_p); + + SDR_FB_IBUFG: + IBUFG port map ( + O => sdr_clk_fb_in, + I => sdr_clk_fb_p); + + dcm2_rst: + SRL16 generic map ( + INIT => X"0000") + port map ( + Q => dcm1_locked_del, + A0 => del_addr(0), + A1 => del_addr(1), + A2 => del_addr(2), + A3 => del_addr(3), + CLK => cpu_clk_int, + D => locked_int(0)); + + dcm2_reset <= not(dcm1_locked_del); + + dcm3_rst: + SRL16 generic map ( + INIT => X"0000") + port map ( + Q => dcm2_locked_del, + A0 => del_addr(0), + A1 => del_addr(1), + A2 => del_addr(2), + A3 => del_addr(3), + CLK => cpu_clk_int, + D => locked_int(1)); + + dcm3_reset <= not(dcm2_locked_del); + + cpu1_dcm: + DCM generic map ( + CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5 + -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0 + CLKFX_DIVIDE => 1, -- Can be any interger from 1 to 32 + CLKFX_MULTIPLY => 4, -- Can be any integer from 1 to 32 + CLKIN_DIVIDE_BY_2 => FALSE, -- TRUE/FALSE to enable CLKIN divide by two feature + CLKIN_PERIOD => 15.625, -- Specify period of input clock + CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift of NONE, FIXED or VARIABLE + CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE, 1X or 2X + DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or + -- an integer from 0 to 15 + DFS_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for frequency synthesis + DLL_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for DLL + DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSE + FACTORY_JF => X"8080", -- FACTORY JF Values + PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 255 + STARTUP_WAIT => FALSE) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE + port map ( + CLK0 => dcm_cpu1, -- 0 degree DCM CLK ouptput + CLK180 => open, -- 180 degree DCM CLK output + CLK270 => open, -- 270 degree DCM CLK output + CLK2X => dcm_cpu2, -- 2X DCM CLK output + CLK2X180 => open, -- 2X, 180 degree DCM CLK out + CLK90 => open, -- 90 degree DCM CLK output + CLKDV => open, -- Divided DCM CLK out (CLKDV_DIVIDE) + CLKFX => open, -- DCM CLK synthesis out (M/D) + CLKFX180 => open, -- 180 degree CLK synthesis out + LOCKED => locked_int(0), -- DCM LOCK status output + PSDONE => open, -- Dynamic phase adjust done output + STATUS => open, -- 8-bit DCM status bits output + CLKFB => cpu_clk_int, -- DCM clock feedback + CLKIN => cpu_clk_in, -- Clock input (from IBUFG, BUFG or DCM) + PSCLK => low, -- Dynamic phase adjust clock input + PSEN => low, -- Dynamic phase adjust enable input + PSINCDEC => low, -- Dynamic phase adjust increment/decrement + RST => areset); -- DCM asynchronous reset input + + cpu2_dcm: + DCM generic map ( + CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5 + -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0 + CLKFX_DIVIDE => 1, -- Can be any interger from 1 to 32 + CLKFX_MULTIPLY => 4, -- Can be any integer from 1 to 32 + CLKIN_DIVIDE_BY_2 => FALSE, -- TRUE/FALSE to enable CLKIN divide by two feature + CLKIN_PERIOD => 7.8125, -- Specify period of input clock + CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift of NONE, FIXED or VARIABLE + CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE, 1X or 2X + DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or + -- an integer from 0 to 15 + DFS_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for frequency synthesis + DLL_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for DLL + DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSE + FACTORY_JF => X"8080", -- FACTORY JF Values + PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 255 + STARTUP_WAIT => FALSE) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE + port map ( + CLK0 => dcm_cpu2_dum, -- 0 degree DCM CLK ouptput + CLK180 => open, -- 180 degree DCM CLK output + CLK270 => open, -- 270 degree DCM CLK output + CLK2X => dcm_cpu4, -- 2X DCM CLK output + CLK2X180 => open, -- 2X, 180 degree DCM CLK out + CLK90 => open, -- 90 degree DCM CLK output + CLKDV => open, -- Divided DCM CLK out (CLKDV_DIVIDE) + CLKFX => open, -- DCM CLK synthesis out (M/D) + CLKFX180 => open, -- 180 degree CLK synthesis out + LOCKED => locked_int(1), -- DCM LOCK status output + PSDONE => open, -- Dynamic phase adjust done output + STATUS => open, -- 8-bit DCM status bits output + CLKFB => cpu_clk_2x_dum_int, -- DCM clock feedback + CLKIN => cpu_clk_2x_int, -- Clock input (from IBUFG, BUFG or DCM) + PSCLK => low, -- Dynamic phase adjust clock input + PSEN => low, -- Dynamic phase adjust enable input + PSINCDEC => low, -- Dynamic phase adjust increment/decrement + RST => dcm2_reset); -- DCM asynchronous reset input + + ddr_read_dcm: + DCM generic map ( + CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5 + -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0 + CLKFX_DIVIDE => 1, -- Can be any interger from 1 to 32 + CLKFX_MULTIPLY => 4, -- Can be any integer from 1 to 32 + CLKIN_DIVIDE_BY_2 => FALSE, -- TRUE/FALSE to enable CLKIN divide by two feature + CLKIN_PERIOD => 7.8125, -- Specify period of input clock + CLKOUT_PHASE_SHIFT => "FIXED", -- Specify phase shift of NONE, FIXED or VARIABLE +-- CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift of NONE, FIXED or VARIABLE + CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE, 1X or 2X + DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or + -- an integer from 0 to 15 + DFS_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for frequency synthesis + DLL_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for DLL + DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSE + FACTORY_JF => X"8080", -- FACTORY JF Values + PHASE_SHIFT => 103, -- Amount of fixed phase shift from -255 to 255 +-- PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 255 + STARTUP_WAIT => FALSE) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE + port map ( + CLK0 => dcm_ddr2, -- 0 degree DCM CLK ouptput + CLK180 => open, -- 180 degree DCM CLK output + CLK270 => open, -- 270 degree DCM CLK output + CLK2X => dcm_ddr2_2x, -- 2X DCM CLK output + CLK2X180 => open, -- 2X, 180 degree DCM CLK out + CLK90 => open, -- 90 degree DCM CLK output + CLKDV => open, -- Divided DCM CLK out (CLKDV_DIVIDE) + CLKFX => open, -- DCM CLK synthesis out (M/D) + CLKFX180 => open, -- 180 degree CLK synthesis out + LOCKED => locked_int(2), -- DCM LOCK status output + PSDONE => open, -- Dynamic phase adjust done output + STATUS => open, -- 8-bit DCM status bits output + CLKFB => ddr_in_clk_int, -- DCM clock feedback + CLKIN => sdr_clk_fb_in, -- Clock input (from IBUFG, BUFG or DCM) + PSCLK => low, -- Dynamic phase adjust clock input + PSEN => low, -- Dynamic phase adjust enable input + PSINCDEC => low, -- Dynamic phase adjust increment/decrement + RST => dcm3_reset); -- DCM asynchronous reset input + + cpu1: + BUFG port map ( + I => dcm_cpu1, + O => cpu_clk_int); + + cpu2: + BUFG port map ( + I => dcm_cpu2, + O => cpu_clk_2x_int); + + cpu2_dum: + BUFG port map ( + I => dcm_cpu2_dum, + O => cpu_clk_2x_dum_int); + + cpu4: + BUFG port map ( + I => dcm_cpu4, + O => cpu_clk_4x_int); + + ddr_clk: + BUFG port map ( + I => dcm_ddr2, + O => ddr_in_clk_int); + + ddr_clk_2x: + BUFG port map ( + I => dcm_ddr2_2x, + O => ddr_in_clk_2x_int); + end behave; \ No newline at end of file diff --git a/zpu/hdl/zpu4/src/io.vhd b/zpu/hdl/zpu4/src/io.vhd index a0e494a..159df6f 100644 --- a/zpu/hdl/zpu4/src/io.vhd +++ b/zpu/hdl/zpu4/src/io.vhd @@ -1,112 +1,112 @@ -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; - -use std.textio.all; - -library work; -use work.zpu_config.all; -use work.zpupkg.all; -use work.txt_util.all; - -entity zpu_io is - generic ( - log_file: string := "log.txt" - ); - port( - clk : in std_logic; - areset : in std_logic; - busy : out std_logic; - writeEnable : in std_logic; - readEnable : in std_logic; - write : in std_logic_vector(wordSize-1 downto 0); - read : out std_logic_vector(wordSize-1 downto 0); - addr : in std_logic_vector(maxAddrBit downto minAddrBit) - ); -end zpu_io; - - -architecture behave of zpu_io is - - - -signal timer_read : std_logic_vector(7 downto 0); ---signal timer_write : std_logic_vector(7 downto 0); -signal timer_we : std_logic; - -signal serving : std_logic; - -file l_file : TEXT open write_mode is log_file; -constant lowAddrBits: std_logic_vector(minAddrBit-1 downto 0) := (others=>'0'); -constant tx_full: std_logic := '0'; -constant rx_empty: std_logic := '1'; - -begin - - - timerinst: timer port map ( - clk => clk, - areset => areset, - we => timer_we, - din => write(7 downto 0), - adr => addr(4 downto 2), - dout => timer_read); - - busy <= writeEnable or readEnable; - timer_we <= writeEnable and addr(12); - - process(areset, clk) - variable taddr : std_logic_vector(maxAddrBit downto 0); - begin - taddr := (others => '0'); - taddr(maxAddrBit downto minAddrBit) := addr; - - if (areset = '1') then --- timer_we <= '0'; - elsif (clk'event and clk = '1') then --- timer_we <= '0'; - if writeEnable = '1' then - -- external interface (fixed address) - -- extend compare to avoid waring messages - if ("1" & addr & lowAddrBits)=x"80a000c" then - report "Write to UART[0]" & " :0x" & hstr(write); - -- Write to UART - -- report "" & character'image(conv_integer(memBint)) severity note; - print(l_file, character'val(to_integer(unsigned(write)))); - elsif addr(12)='1' then - report "Write to TIMER" & " :0x" & hstr(write); --- report "xxx" severity failure; --- timer_we <= '1'; - else - print(l_file, character'val(to_integer(unsigned(write)))); - report "Illegal IO write @" & "0x" & hstr(taddr) severity warning; - end if; - - end if; - read <= (others => '0'); - if (readEnable = '1') then - -- extend compare to avoid waring messages - if ("1" & addr & lowAddrBits)=x"80a000c" then - report "Read UART[0]"; - read(8) <= not tx_full; -- output fifo not full - read(9) <= not rx_empty; -- receiver not empty - elsif ("1" & addr & lowAddrBits)=x"80a0010" then - report "Read UART[1]"; - read(8) <= not rx_empty; -- receiver not empty - read(7 downto 0) <= (others => '0'); - elsif addr(12)='1' then - report "Read TIMER"; - read(7 downto 0) <= timer_read; - elsif addr(11)='1' then - report "Read ZPU Freq"; - read(7 downto 0) <= ZPU_Frequency; - else - report "Illegal IO read @" & "0x" & hstr(taddr) severity warning; - end if; - end if; - end if; - end process; - - -end behave; - +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +use std.textio.all; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; +use work.txt_util.all; + +entity zpu_io is + generic ( + log_file: string := "log.txt" + ); + port( + clk : in std_logic; + areset : in std_logic; + busy : out std_logic; + writeEnable : in std_logic; + readEnable : in std_logic; + write : in std_logic_vector(wordSize-1 downto 0); + read : out std_logic_vector(wordSize-1 downto 0); + addr : in std_logic_vector(maxAddrBit downto minAddrBit) + ); +end zpu_io; + + +architecture behave of zpu_io is + + + +signal timer_read : std_logic_vector(7 downto 0); +--signal timer_write : std_logic_vector(7 downto 0); +signal timer_we : std_logic; + +signal serving : std_logic; + +file l_file : TEXT open write_mode is log_file; +constant lowAddrBits: std_logic_vector(minAddrBit-1 downto 0) := (others=>'0'); +constant tx_full: std_logic := '0'; +constant rx_empty: std_logic := '1'; + +begin + + + timerinst: timer port map ( + clk => clk, + areset => areset, + we => timer_we, + din => write(7 downto 0), + adr => addr(4 downto 2), + dout => timer_read); + + busy <= writeEnable or readEnable; + timer_we <= writeEnable and addr(12); + + process(areset, clk) + variable taddr : std_logic_vector(maxAddrBit downto 0); + begin + taddr := (others => '0'); + taddr(maxAddrBit downto minAddrBit) := addr; + + if (areset = '1') then +-- timer_we <= '0'; + elsif (clk'event and clk = '1') then +-- timer_we <= '0'; + if writeEnable = '1' then + -- external interface (fixed address) + -- extend compare to avoid waring messages + if ("1" & addr & lowAddrBits)=x"80a000c" then + report "Write to UART[0]" & " :0x" & hstr(write); + -- Write to UART + -- report "" & character'image(conv_integer(memBint)) severity note; + print(l_file, character'val(to_integer(unsigned(write)))); + elsif addr(12)='1' then + report "Write to TIMER" & " :0x" & hstr(write); +-- report "xxx" severity failure; +-- timer_we <= '1'; + else + print(l_file, character'val(to_integer(unsigned(write)))); + report "Illegal IO write @" & "0x" & hstr(taddr) severity warning; + end if; + + end if; + read <= (others => '0'); + if (readEnable = '1') then + -- extend compare to avoid waring messages + if ("1" & addr & lowAddrBits)=x"80a000c" then + report "Read UART[0]"; + read(8) <= not tx_full; -- output fifo not full + read(9) <= not rx_empty; -- receiver not empty + elsif ("1" & addr & lowAddrBits)=x"80a0010" then + report "Read UART[1]"; + read(8) <= not rx_empty; -- receiver not empty + read(7 downto 0) <= (others => '0'); + elsif addr(12)='1' then + report "Read TIMER"; + read(7 downto 0) <= timer_read; + elsif addr(11)='1' then + report "Read ZPU Freq"; + read(7 downto 0) <= ZPU_Frequency; + else + report "Illegal IO read @" & "0x" & hstr(taddr) severity warning; + end if; + end if; + end if; + end process; + + +end behave; + diff --git a/zpu/hdl/zpu4/src/timer.vhd b/zpu/hdl/zpu4/src/timer.vhd index be1dbb8..c60c172 100644 --- a/zpu/hdl/zpu4/src/timer.vhd +++ b/zpu/hdl/zpu4/src/timer.vhd @@ -1,61 +1,61 @@ -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; - -entity timer is - port( - clk : in std_logic; - areset : in std_logic; - we : in std_logic; - din : in std_logic_vector(7 downto 0); - adr : in std_logic_vector(2 downto 0); - dout : out std_logic_vector(7 downto 0)); -end timer; - - -architecture behave of timer is - -signal sample : std_logic; -signal reset : std_logic; - - -signal cnt : unsigned(63 downto 0); -signal cnt_smp : std_logic_vector(63 downto 0); - -begin - - reset <= '1' when (we = '1' and din(0) = '1') else '0'; - sample <= '1' when (we = '1' and din(1) = '1') else '0'; - - process(clk, areset) -- Carry generation - begin - if areset = '1' then - cnt <= (others => '0'); - cnt_smp <= (others => '0'); - elsif (clk'event and clk = '1') then - cnt <= cnt + 1; - if sample = '1' then --- report "sampling" severity failure; - cnt_smp <= std_logic_vector(cnt); - end if; - end if; - end process; - - - process(cnt_smp, adr) - begin - case adr is - when "000" => dout <= cnt_smp(7 downto 0); - when "001" => dout <= cnt_smp(15 downto 8); - when "010" => dout <= cnt_smp(23 downto 16); - when "011" => dout <= cnt_smp(31 downto 24); - when "100" => dout <= cnt_smp(39 downto 32); - when "101" => dout <= cnt_smp(47 downto 40); - when "110" => dout <= cnt_smp(55 downto 48); - when others => dout <= cnt_smp(63 downto 56); - end case; - end process; - - -end behave; - +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity timer is + port( + clk : in std_logic; + areset : in std_logic; + we : in std_logic; + din : in std_logic_vector(7 downto 0); + adr : in std_logic_vector(2 downto 0); + dout : out std_logic_vector(7 downto 0)); +end timer; + + +architecture behave of timer is + +signal sample : std_logic; +signal reset : std_logic; + + +signal cnt : unsigned(63 downto 0); +signal cnt_smp : std_logic_vector(63 downto 0); + +begin + + reset <= '1' when (we = '1' and din(0) = '1') else '0'; + sample <= '1' when (we = '1' and din(1) = '1') else '0'; + + process(clk, areset) -- Carry generation + begin + if areset = '1' then + cnt <= (others => '0'); + cnt_smp <= (others => '0'); + elsif (clk'event and clk = '1') then + cnt <= cnt + 1; + if sample = '1' then +-- report "sampling" severity failure; + cnt_smp <= std_logic_vector(cnt); + end if; + end if; + end process; + + + process(cnt_smp, adr) + begin + case adr is + when "000" => dout <= cnt_smp(7 downto 0); + when "001" => dout <= cnt_smp(15 downto 8); + when "010" => dout <= cnt_smp(23 downto 16); + when "011" => dout <= cnt_smp(31 downto 24); + when "100" => dout <= cnt_smp(39 downto 32); + when "101" => dout <= cnt_smp(47 downto 40); + when "110" => dout <= cnt_smp(55 downto 48); + when others => dout <= cnt_smp(63 downto 56); + end case; + end process; + + +end behave; + diff --git a/zpu/hdl/zpu4/src/trace.vhd b/zpu/hdl/zpu4/src/trace.vhd index 2413970..00ac3a8 100644 --- a/zpu/hdl/zpu4/src/trace.vhd +++ b/zpu/hdl/zpu4/src/trace.vhd @@ -1,117 +1,117 @@ --- ZPU --- --- Copyright 2004-2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com --- --- The FreeBSD license --- --- Redistribution and use in source and binary forms, with or without --- modification, are permitted provided that the following conditions --- are met: --- --- 1. Redistributions of source code must retain the above copyright --- notice, this list of conditions and the following disclaimer. --- 2. Redistributions in binary form must reproduce the above --- copyright notice, this list of conditions and the following --- disclaimer in the documentation and/or other materials --- provided with the distribution. --- --- THIS SOFTWARE IS PROVIDED BY THE ZPU PROJECT ``AS IS'' AND ANY --- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, --- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A --- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE --- ZPU PROJECT 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. --- --- The views and conclusions contained in the software and documentation --- are those of the authors and should not be interpreted as representing --- official policies, either expressed or implied, of the ZPU Project. - -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; - -use std.textio.all; - -library work; -use work.zpu_config.all; -use work.zpupkg.all; -use work.txt_util.all; - - -entity trace is - generic ( - log_file: string := "trace.txt" - ); - port( - clk : in std_logic; - begin_inst : in std_logic; - pc : in std_logic_vector(maxAddrBitIncIO downto 0); - opcode : in std_logic_vector(7 downto 0); - sp : in std_logic_vector(maxAddrBitIncIO downto 2); - memA : in std_logic_vector(wordSize-1 downto 0); - memB : in std_logic_vector(wordSize-1 downto 0); - busy : in std_logic; - intSp : in std_logic_vector(stack_bits-1 downto 0) - ); -end trace; - - -architecture behave of trace is - - -file l_file : TEXT open write_mode is log_file; - - -begin - - --- write data and control information to a file - -receive_data: process - -variable l: line; -variable t : std_logic_vector(wordSize-1 downto 0); -variable t2 : std_logic_vector(maxAddrBitIncIO downto 0); -variable counter : unsigned(63 downto 0); - - - -begin - - t:= (others => '0'); - t2:= (others => '0'); - -counter := (others => '0'); - -- print header for the logfile - print(l_file, "#pc,opcode,sp,top_of_stack "); - print(l_file, "#----------"); - print(l_file, " "); - - wait until clk = '1'; - wait until clk = '0'; - - while true loop - - counter := counter + 1; - if begin_inst = '1' then - t(maxAddrBitIncIO downto 2):=sp; - t2:=pc; - print(l_file, "0x" & hstr(t2) & " 0x" & hstr(opcode) & " 0x" & hstr(t) & " 0x" & hstr(memA) & " 0x" & hstr(memB) & " 0x" & hstr(intSp) & " 0x" & hstr(std_logic_vector(counter))); - end if; - - wait until clk = '0'; - - end loop; - - end process receive_data; - - - -end behave; - +-- ZPU +-- +-- Copyright 2004-2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com +-- +-- The FreeBSD license +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above +-- copyright notice, this list of conditions and the following +-- disclaimer in the documentation and/or other materials +-- provided with the distribution. +-- +-- THIS SOFTWARE IS PROVIDED BY THE ZPU PROJECT ``AS IS'' AND ANY +-- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +-- ZPU PROJECT 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. +-- +-- The views and conclusions contained in the software and documentation +-- are those of the authors and should not be interpreted as representing +-- official policies, either expressed or implied, of the ZPU Project. + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +use std.textio.all; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; +use work.txt_util.all; + + +entity trace is + generic ( + log_file: string := "trace.txt" + ); + port( + clk : in std_logic; + begin_inst : in std_logic; + pc : in std_logic_vector(maxAddrBitIncIO downto 0); + opcode : in std_logic_vector(7 downto 0); + sp : in std_logic_vector(maxAddrBitIncIO downto 2); + memA : in std_logic_vector(wordSize-1 downto 0); + memB : in std_logic_vector(wordSize-1 downto 0); + busy : in std_logic; + intSp : in std_logic_vector(stack_bits-1 downto 0) + ); +end trace; + + +architecture behave of trace is + + +file l_file : TEXT open write_mode is log_file; + + +begin + + +-- write data and control information to a file + +receive_data: process + +variable l: line; +variable t : std_logic_vector(wordSize-1 downto 0); +variable t2 : std_logic_vector(maxAddrBitIncIO downto 0); +variable counter : unsigned(63 downto 0); + + + +begin + + t:= (others => '0'); + t2:= (others => '0'); + +counter := (others => '0'); + -- print header for the logfile + print(l_file, "#pc,opcode,sp,top_of_stack "); + print(l_file, "#----------"); + print(l_file, " "); + + wait until clk = '1'; + wait until clk = '0'; + + while true loop + + counter := counter + 1; + if begin_inst = '1' then + t(maxAddrBitIncIO downto 2):=sp; + t2:=pc; + print(l_file, "0x" & hstr(t2) & " 0x" & hstr(opcode) & " 0x" & hstr(t) & " 0x" & hstr(memA) & " 0x" & hstr(memB) & " 0x" & hstr(intSp) & " 0x" & hstr(std_logic_vector(counter))); + end if; + + wait until clk = '0'; + + end loop; + + end process receive_data; + + + +end behave; + diff --git a/zpu/hdl/zpu4/src/txt_util.vhd b/zpu/hdl/zpu4/src/txt_util.vhd index 3d5297a..6432294 100644 --- a/zpu/hdl/zpu4/src/txt_util.vhd +++ b/zpu/hdl/zpu4/src/txt_util.vhd @@ -1,621 +1,621 @@ --- ZPU --- --- Copyright 2004-2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com --- --- The FreeBSD license --- --- Redistribution and use in source and binary forms, with or without --- modification, are permitted provided that the following conditions --- are met: --- --- 1. Redistributions of source code must retain the above copyright --- notice, this list of conditions and the following disclaimer. --- 2. Redistributions in binary form must reproduce the above --- copyright notice, this list of conditions and the following --- disclaimer in the documentation and/or other materials --- provided with the distribution. --- --- THIS SOFTWARE IS PROVIDED BY THE ZPU PROJECT ``AS IS'' AND ANY --- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, --- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A --- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE --- ZPU PROJECT 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. --- --- The views and conclusions contained in the software and documentation --- are those of the authors and should not be interpreted as representing --- official policies, either expressed or implied, of the ZPU Project. - -library ieee; -use ieee.std_logic_1164.all; -use std.textio.all; - -library work; - -package txt_util is - - -- prints a message to the screen - procedure print(text: string); - - -- prints the message when active - -- useful for debug switches - procedure print(active: boolean; text: string); - - -- converts std_logic into a character - function chr(sl: std_logic) return character; - - -- converts std_logic into a string (1 to 1) - function str(sl: std_logic) return string; - - -- converts std_logic_vector into a string (binary base) - function str(slv: std_logic_vector) return string; - - -- converts boolean into a string - function str(b: boolean) return string; - - -- converts an integer into a single character - -- (can also be used for hex conversion and other bases) - function chr(int: integer) return character; - - -- converts integer into string using specified base - function str(int: integer; base: integer) return string; - - -- converts integer to string, using base 10 - function str(int: integer) return string; - - -- convert std_logic_vector into a string in hex format - function hstr(slv: std_logic_vector) return string; - - - -- functions to manipulate strings - ----------------------------------- - - -- convert a character to upper case - function to_upper(c: character) return character; - - -- convert a character to lower case - function to_lower(c: character) return character; - - -- convert a string to upper case - function to_upper(s: string) return string; - - -- convert a string to lower case - function to_lower(s: string) return string; - - - - -- functions to convert strings into other formats - -------------------------------------------------- - - -- converts a character into std_logic - function to_std_logic(c: character) return std_logic; - - -- converts a string into std_logic_vector - function to_std_logic_vector(s: string) return std_logic_vector; - - - - -- file I/O - ----------- - - -- read variable length string from input file - procedure str_read(file in_file: TEXT; - res_string: out string); - - -- print string to a file and start new line - procedure print(file out_file: TEXT; - new_string: in string); - - -- print character to a file and start new line - procedure print(file out_file: TEXT; - char: in character); - -end txt_util; - - - - -package body txt_util is - - - - - -- prints text to the screen - - procedure print(text: string) is - variable msg_line: line; - begin - write(msg_line, text); - writeline(output, msg_line); - end print; - - - - - -- prints text to the screen when active - - procedure print(active: boolean; text: string) is - begin - if active then - print(text); - end if; - end print; - - - -- converts std_logic into a character - - function chr(sl: std_logic) return character is - variable c: character; - begin - case sl is - when 'U' => c:= 'U'; - when 'X' => c:= 'X'; - when '0' => c:= '0'; - when '1' => c:= '1'; - when 'Z' => c:= 'Z'; - when 'W' => c:= 'W'; - when 'L' => c:= 'L'; - when 'H' => c:= 'H'; - when '-' => c:= '-'; - end case; - return c; - end chr; - - - - -- converts std_logic into a string (1 to 1) - - function str(sl: std_logic) return string is - variable s: string(1 to 1); - begin - s(1) := chr(sl); - return s; - end str; - - - - -- converts std_logic_vector into a string (binary base) - -- (this also takes care of the fact that the range of - -- a string is natural while a std_logic_vector may - -- have an integer range) - - function str(slv: std_logic_vector) return string is - variable result : string (1 to slv'length); - variable r : integer; - begin - r := 1; - for i in slv'range loop - result(r) := chr(slv(i)); - r := r + 1; - end loop; - return result; - end str; - - - function str(b: boolean) return string is - - begin - if b then - return "true"; - else - return "false"; - end if; - end str; - - - -- converts an integer into a character - -- for 0 to 9 the obvious mapping is used, higher - -- values are mapped to the characters A-Z - -- (this is usefull for systems with base > 10) - -- (adapted from Steve Vogwell's posting in comp.lang.vhdl) - - function chr(int: integer) return character is - variable c: character; - begin - case int is - when 0 => c := '0'; - when 1 => c := '1'; - when 2 => c := '2'; - when 3 => c := '3'; - when 4 => c := '4'; - when 5 => c := '5'; - when 6 => c := '6'; - when 7 => c := '7'; - when 8 => c := '8'; - when 9 => c := '9'; - when 10 => c := 'A'; - when 11 => c := 'B'; - when 12 => c := 'C'; - when 13 => c := 'D'; - when 14 => c := 'E'; - when 15 => c := 'F'; - when 16 => c := 'G'; - when 17 => c := 'H'; - when 18 => c := 'I'; - when 19 => c := 'J'; - when 20 => c := 'K'; - when 21 => c := 'L'; - when 22 => c := 'M'; - when 23 => c := 'N'; - when 24 => c := 'O'; - when 25 => c := 'P'; - when 26 => c := 'Q'; - when 27 => c := 'R'; - when 28 => c := 'S'; - when 29 => c := 'T'; - when 30 => c := 'U'; - when 31 => c := 'V'; - when 32 => c := 'W'; - when 33 => c := 'X'; - when 34 => c := 'Y'; - when 35 => c := 'Z'; - when others => c := '?'; - end case; - return c; - end chr; - - - - -- convert integer to string using specified base - -- (adapted from Steve Vogwell's posting in comp.lang.vhdl) - - function str(int: integer; base: integer) return string is - - variable temp: string(1 to 10); - variable num: integer; - variable abs_int: integer; - variable len: integer := 1; - variable power: integer := 1; - - begin - - -- bug fix for negative numbers - abs_int := abs(int); - - num := abs_int; - - while num >= base loop -- Determine how many - len := len + 1; -- characters required - num := num / base; -- to represent the - end loop ; -- number. - - for i in len downto 1 loop -- Convert the number to - temp(i) := chr(abs_int/power mod base); -- a string starting - power := power * base; -- with the right hand - end loop ; -- side. - - -- return result and add sign if required - if int < 0 then - return '-'& temp(1 to len); - else - return temp(1 to len); - end if; - - end str; - - - -- convert integer to string, using base 10 - function str(int: integer) return string is - - begin - - return str(int, 10) ; - - end str; - - - - -- converts a std_logic_vector into a hex string. - function hstr(slv: std_logic_vector) return string is - variable hexlen: integer; - variable longslv : std_logic_vector(67 downto 0) := (others => '0'); - variable hex : string(1 to 16); - variable fourbit : std_logic_vector(3 downto 0); - begin - hexlen := (slv'left+1)/4; - if (slv'left+1) mod 4 /= 0 then - hexlen := hexlen + 1; - end if; - longslv(slv'left downto 0) := slv; - for i in (hexlen -1) downto 0 loop - fourbit := longslv(((i*4)+3) downto (i*4)); - case fourbit is - when "0000" => hex(hexlen -I) := '0'; - when "0001" => hex(hexlen -I) := '1'; - when "0010" => hex(hexlen -I) := '2'; - when "0011" => hex(hexlen -I) := '3'; - when "0100" => hex(hexlen -I) := '4'; - when "0101" => hex(hexlen -I) := '5'; - when "0110" => hex(hexlen -I) := '6'; - when "0111" => hex(hexlen -I) := '7'; - when "1000" => hex(hexlen -I) := '8'; - when "1001" => hex(hexlen -I) := '9'; - when "1010" => hex(hexlen -I) := 'A'; - when "1011" => hex(hexlen -I) := 'B'; - when "1100" => hex(hexlen -I) := 'C'; - when "1101" => hex(hexlen -I) := 'D'; - when "1110" => hex(hexlen -I) := 'E'; - when "1111" => hex(hexlen -I) := 'F'; - when "ZZZZ" => hex(hexlen -I) := 'z'; - when "UUUU" => hex(hexlen -I) := 'u'; - when "XXXX" => hex(hexlen -I) := 'x'; - when others => hex(hexlen -I) := '?'; - end case; - end loop; - return hex(1 to hexlen); - end hstr; - - - - -- functions to manipulate strings - ----------------------------------- - - - -- convert a character to upper case - - function to_upper(c: character) return character is - - variable u: character; - - begin - - case c is - when 'a' => u := 'A'; - when 'b' => u := 'B'; - when 'c' => u := 'C'; - when 'd' => u := 'D'; - when 'e' => u := 'E'; - when 'f' => u := 'F'; - when 'g' => u := 'G'; - when 'h' => u := 'H'; - when 'i' => u := 'I'; - when 'j' => u := 'J'; - when 'k' => u := 'K'; - when 'l' => u := 'L'; - when 'm' => u := 'M'; - when 'n' => u := 'N'; - when 'o' => u := 'O'; - when 'p' => u := 'P'; - when 'q' => u := 'Q'; - when 'r' => u := 'R'; - when 's' => u := 'S'; - when 't' => u := 'T'; - when 'u' => u := 'U'; - when 'v' => u := 'V'; - when 'w' => u := 'W'; - when 'x' => u := 'X'; - when 'y' => u := 'Y'; - when 'z' => u := 'Z'; - when others => u := c; - end case; - - return u; - - end to_upper; - - - -- convert a character to lower case - - function to_lower(c: character) return character is - - variable l: character; - - begin - - case c is - when 'A' => l := 'a'; - when 'B' => l := 'b'; - when 'C' => l := 'c'; - when 'D' => l := 'd'; - when 'E' => l := 'e'; - when 'F' => l := 'f'; - when 'G' => l := 'g'; - when 'H' => l := 'h'; - when 'I' => l := 'i'; - when 'J' => l := 'j'; - when 'K' => l := 'k'; - when 'L' => l := 'l'; - when 'M' => l := 'm'; - when 'N' => l := 'n'; - when 'O' => l := 'o'; - when 'P' => l := 'p'; - when 'Q' => l := 'q'; - when 'R' => l := 'r'; - when 'S' => l := 's'; - when 'T' => l := 't'; - when 'U' => l := 'u'; - when 'V' => l := 'v'; - when 'W' => l := 'w'; - when 'X' => l := 'x'; - when 'Y' => l := 'y'; - when 'Z' => l := 'z'; - when others => l := c; - end case; - - return l; - - end to_lower; - - - - -- convert a string to upper case - - function to_upper(s: string) return string is - - variable uppercase: string (s'range); - - begin - - for i in s'range loop - uppercase(i):= to_upper(s(i)); - end loop; - return uppercase; - - end to_upper; - - - - -- convert a string to lower case - - function to_lower(s: string) return string is - - variable lowercase: string (s'range); - - begin - - for i in s'range loop - lowercase(i):= to_lower(s(i)); - end loop; - return lowercase; - - end to_lower; - - - --- functions to convert strings into other types - - --- converts a character into a std_logic - -function to_std_logic(c: character) return std_logic is - variable sl: std_logic; - begin - case c is - when 'U' => - sl := 'U'; - when 'X' => - sl := 'X'; - when '0' => - sl := '0'; - when '1' => - sl := '1'; - when 'Z' => - sl := 'Z'; - when 'W' => - sl := 'W'; - when 'L' => - sl := 'L'; - when 'H' => - sl := 'H'; - when '-' => - sl := '-'; - when others => - sl := 'X'; - end case; - return sl; - end to_std_logic; - - --- converts a string into std_logic_vector - -function to_std_logic_vector(s: string) return std_logic_vector is - variable slv: std_logic_vector(s'high-s'low downto 0); - variable k: integer; -begin - k := s'high-s'low; - for i in s'range loop - slv(k) := to_std_logic(s(i)); - k := k - 1; - end loop; - return slv; -end to_std_logic_vector; - - - - - - ----------------- --- file I/O -- ----------------- - - - --- read variable length string from input file - -procedure str_read(file in_file: TEXT; - res_string: out string) is - - variable l: line; - variable c: character; - variable is_string: boolean; - - begin - - readline(in_file, l); - -- clear the contents of the result string - for i in res_string'range loop - res_string(i) := ' '; - end loop; - -- read all characters of the line, up to the length - -- of the results string - for i in res_string'range loop - read(l, c, is_string); - res_string(i) := c; - if not is_string then -- found end of line - exit; - end if; - end loop; - -end str_read; - - --- print string to a file -procedure print(file out_file: TEXT; - new_string: in string) is - - variable l: line; - - begin - - write(l, new_string); - writeline(out_file, l); - -end print; - - --- print character to a file and start new line -procedure print(file out_file: TEXT; - char: in character) is - - variable l: line; - - begin - - write(l, char); - writeline(out_file, l); - -end print; - - - --- appends contents of a string to a file until line feed occurs --- (LF is considered to be the end of the string) - -procedure str_write(file out_file: TEXT; - new_string: in string) is - begin - - for i in new_string'range loop - print(out_file, new_string(i)); - if new_string(i) = LF then -- end of string - exit; - end if; - end loop; - -end str_write; - - - - -end txt_util; - - - - +-- ZPU +-- +-- Copyright 2004-2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com +-- +-- The FreeBSD license +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above +-- copyright notice, this list of conditions and the following +-- disclaimer in the documentation and/or other materials +-- provided with the distribution. +-- +-- THIS SOFTWARE IS PROVIDED BY THE ZPU PROJECT ``AS IS'' AND ANY +-- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +-- ZPU PROJECT 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. +-- +-- The views and conclusions contained in the software and documentation +-- are those of the authors and should not be interpreted as representing +-- official policies, either expressed or implied, of the ZPU Project. + +library ieee; +use ieee.std_logic_1164.all; +use std.textio.all; + +library work; + +package txt_util is + + -- prints a message to the screen + procedure print(text: string); + + -- prints the message when active + -- useful for debug switches + procedure print(active: boolean; text: string); + + -- converts std_logic into a character + function chr(sl: std_logic) return character; + + -- converts std_logic into a string (1 to 1) + function str(sl: std_logic) return string; + + -- converts std_logic_vector into a string (binary base) + function str(slv: std_logic_vector) return string; + + -- converts boolean into a string + function str(b: boolean) return string; + + -- converts an integer into a single character + -- (can also be used for hex conversion and other bases) + function chr(int: integer) return character; + + -- converts integer into string using specified base + function str(int: integer; base: integer) return string; + + -- converts integer to string, using base 10 + function str(int: integer) return string; + + -- convert std_logic_vector into a string in hex format + function hstr(slv: std_logic_vector) return string; + + + -- functions to manipulate strings + ----------------------------------- + + -- convert a character to upper case + function to_upper(c: character) return character; + + -- convert a character to lower case + function to_lower(c: character) return character; + + -- convert a string to upper case + function to_upper(s: string) return string; + + -- convert a string to lower case + function to_lower(s: string) return string; + + + + -- functions to convert strings into other formats + -------------------------------------------------- + + -- converts a character into std_logic + function to_std_logic(c: character) return std_logic; + + -- converts a string into std_logic_vector + function to_std_logic_vector(s: string) return std_logic_vector; + + + + -- file I/O + ----------- + + -- read variable length string from input file + procedure str_read(file in_file: TEXT; + res_string: out string); + + -- print string to a file and start new line + procedure print(file out_file: TEXT; + new_string: in string); + + -- print character to a file and start new line + procedure print(file out_file: TEXT; + char: in character); + +end txt_util; + + + + +package body txt_util is + + + + + -- prints text to the screen + + procedure print(text: string) is + variable msg_line: line; + begin + write(msg_line, text); + writeline(output, msg_line); + end print; + + + + + -- prints text to the screen when active + + procedure print(active: boolean; text: string) is + begin + if active then + print(text); + end if; + end print; + + + -- converts std_logic into a character + + function chr(sl: std_logic) return character is + variable c: character; + begin + case sl is + when 'U' => c:= 'U'; + when 'X' => c:= 'X'; + when '0' => c:= '0'; + when '1' => c:= '1'; + when 'Z' => c:= 'Z'; + when 'W' => c:= 'W'; + when 'L' => c:= 'L'; + when 'H' => c:= 'H'; + when '-' => c:= '-'; + end case; + return c; + end chr; + + + + -- converts std_logic into a string (1 to 1) + + function str(sl: std_logic) return string is + variable s: string(1 to 1); + begin + s(1) := chr(sl); + return s; + end str; + + + + -- converts std_logic_vector into a string (binary base) + -- (this also takes care of the fact that the range of + -- a string is natural while a std_logic_vector may + -- have an integer range) + + function str(slv: std_logic_vector) return string is + variable result : string (1 to slv'length); + variable r : integer; + begin + r := 1; + for i in slv'range loop + result(r) := chr(slv(i)); + r := r + 1; + end loop; + return result; + end str; + + + function str(b: boolean) return string is + + begin + if b then + return "true"; + else + return "false"; + end if; + end str; + + + -- converts an integer into a character + -- for 0 to 9 the obvious mapping is used, higher + -- values are mapped to the characters A-Z + -- (this is usefull for systems with base > 10) + -- (adapted from Steve Vogwell's posting in comp.lang.vhdl) + + function chr(int: integer) return character is + variable c: character; + begin + case int is + when 0 => c := '0'; + when 1 => c := '1'; + when 2 => c := '2'; + when 3 => c := '3'; + when 4 => c := '4'; + when 5 => c := '5'; + when 6 => c := '6'; + when 7 => c := '7'; + when 8 => c := '8'; + when 9 => c := '9'; + when 10 => c := 'A'; + when 11 => c := 'B'; + when 12 => c := 'C'; + when 13 => c := 'D'; + when 14 => c := 'E'; + when 15 => c := 'F'; + when 16 => c := 'G'; + when 17 => c := 'H'; + when 18 => c := 'I'; + when 19 => c := 'J'; + when 20 => c := 'K'; + when 21 => c := 'L'; + when 22 => c := 'M'; + when 23 => c := 'N'; + when 24 => c := 'O'; + when 25 => c := 'P'; + when 26 => c := 'Q'; + when 27 => c := 'R'; + when 28 => c := 'S'; + when 29 => c := 'T'; + when 30 => c := 'U'; + when 31 => c := 'V'; + when 32 => c := 'W'; + when 33 => c := 'X'; + when 34 => c := 'Y'; + when 35 => c := 'Z'; + when others => c := '?'; + end case; + return c; + end chr; + + + + -- convert integer to string using specified base + -- (adapted from Steve Vogwell's posting in comp.lang.vhdl) + + function str(int: integer; base: integer) return string is + + variable temp: string(1 to 10); + variable num: integer; + variable abs_int: integer; + variable len: integer := 1; + variable power: integer := 1; + + begin + + -- bug fix for negative numbers + abs_int := abs(int); + + num := abs_int; + + while num >= base loop -- Determine how many + len := len + 1; -- characters required + num := num / base; -- to represent the + end loop ; -- number. + + for i in len downto 1 loop -- Convert the number to + temp(i) := chr(abs_int/power mod base); -- a string starting + power := power * base; -- with the right hand + end loop ; -- side. + + -- return result and add sign if required + if int < 0 then + return '-'& temp(1 to len); + else + return temp(1 to len); + end if; + + end str; + + + -- convert integer to string, using base 10 + function str(int: integer) return string is + + begin + + return str(int, 10) ; + + end str; + + + + -- converts a std_logic_vector into a hex string. + function hstr(slv: std_logic_vector) return string is + variable hexlen: integer; + variable longslv : std_logic_vector(67 downto 0) := (others => '0'); + variable hex : string(1 to 16); + variable fourbit : std_logic_vector(3 downto 0); + begin + hexlen := (slv'left+1)/4; + if (slv'left+1) mod 4 /= 0 then + hexlen := hexlen + 1; + end if; + longslv(slv'left downto 0) := slv; + for i in (hexlen -1) downto 0 loop + fourbit := longslv(((i*4)+3) downto (i*4)); + case fourbit is + when "0000" => hex(hexlen -I) := '0'; + when "0001" => hex(hexlen -I) := '1'; + when "0010" => hex(hexlen -I) := '2'; + when "0011" => hex(hexlen -I) := '3'; + when "0100" => hex(hexlen -I) := '4'; + when "0101" => hex(hexlen -I) := '5'; + when "0110" => hex(hexlen -I) := '6'; + when "0111" => hex(hexlen -I) := '7'; + when "1000" => hex(hexlen -I) := '8'; + when "1001" => hex(hexlen -I) := '9'; + when "1010" => hex(hexlen -I) := 'A'; + when "1011" => hex(hexlen -I) := 'B'; + when "1100" => hex(hexlen -I) := 'C'; + when "1101" => hex(hexlen -I) := 'D'; + when "1110" => hex(hexlen -I) := 'E'; + when "1111" => hex(hexlen -I) := 'F'; + when "ZZZZ" => hex(hexlen -I) := 'z'; + when "UUUU" => hex(hexlen -I) := 'u'; + when "XXXX" => hex(hexlen -I) := 'x'; + when others => hex(hexlen -I) := '?'; + end case; + end loop; + return hex(1 to hexlen); + end hstr; + + + + -- functions to manipulate strings + ----------------------------------- + + + -- convert a character to upper case + + function to_upper(c: character) return character is + + variable u: character; + + begin + + case c is + when 'a' => u := 'A'; + when 'b' => u := 'B'; + when 'c' => u := 'C'; + when 'd' => u := 'D'; + when 'e' => u := 'E'; + when 'f' => u := 'F'; + when 'g' => u := 'G'; + when 'h' => u := 'H'; + when 'i' => u := 'I'; + when 'j' => u := 'J'; + when 'k' => u := 'K'; + when 'l' => u := 'L'; + when 'm' => u := 'M'; + when 'n' => u := 'N'; + when 'o' => u := 'O'; + when 'p' => u := 'P'; + when 'q' => u := 'Q'; + when 'r' => u := 'R'; + when 's' => u := 'S'; + when 't' => u := 'T'; + when 'u' => u := 'U'; + when 'v' => u := 'V'; + when 'w' => u := 'W'; + when 'x' => u := 'X'; + when 'y' => u := 'Y'; + when 'z' => u := 'Z'; + when others => u := c; + end case; + + return u; + + end to_upper; + + + -- convert a character to lower case + + function to_lower(c: character) return character is + + variable l: character; + + begin + + case c is + when 'A' => l := 'a'; + when 'B' => l := 'b'; + when 'C' => l := 'c'; + when 'D' => l := 'd'; + when 'E' => l := 'e'; + when 'F' => l := 'f'; + when 'G' => l := 'g'; + when 'H' => l := 'h'; + when 'I' => l := 'i'; + when 'J' => l := 'j'; + when 'K' => l := 'k'; + when 'L' => l := 'l'; + when 'M' => l := 'm'; + when 'N' => l := 'n'; + when 'O' => l := 'o'; + when 'P' => l := 'p'; + when 'Q' => l := 'q'; + when 'R' => l := 'r'; + when 'S' => l := 's'; + when 'T' => l := 't'; + when 'U' => l := 'u'; + when 'V' => l := 'v'; + when 'W' => l := 'w'; + when 'X' => l := 'x'; + when 'Y' => l := 'y'; + when 'Z' => l := 'z'; + when others => l := c; + end case; + + return l; + + end to_lower; + + + + -- convert a string to upper case + + function to_upper(s: string) return string is + + variable uppercase: string (s'range); + + begin + + for i in s'range loop + uppercase(i):= to_upper(s(i)); + end loop; + return uppercase; + + end to_upper; + + + + -- convert a string to lower case + + function to_lower(s: string) return string is + + variable lowercase: string (s'range); + + begin + + for i in s'range loop + lowercase(i):= to_lower(s(i)); + end loop; + return lowercase; + + end to_lower; + + + +-- functions to convert strings into other types + + +-- converts a character into a std_logic + +function to_std_logic(c: character) return std_logic is + variable sl: std_logic; + begin + case c is + when 'U' => + sl := 'U'; + when 'X' => + sl := 'X'; + when '0' => + sl := '0'; + when '1' => + sl := '1'; + when 'Z' => + sl := 'Z'; + when 'W' => + sl := 'W'; + when 'L' => + sl := 'L'; + when 'H' => + sl := 'H'; + when '-' => + sl := '-'; + when others => + sl := 'X'; + end case; + return sl; + end to_std_logic; + + +-- converts a string into std_logic_vector + +function to_std_logic_vector(s: string) return std_logic_vector is + variable slv: std_logic_vector(s'high-s'low downto 0); + variable k: integer; +begin + k := s'high-s'low; + for i in s'range loop + slv(k) := to_std_logic(s(i)); + k := k - 1; + end loop; + return slv; +end to_std_logic_vector; + + + + + + +---------------- +-- file I/O -- +---------------- + + + +-- read variable length string from input file + +procedure str_read(file in_file: TEXT; + res_string: out string) is + + variable l: line; + variable c: character; + variable is_string: boolean; + + begin + + readline(in_file, l); + -- clear the contents of the result string + for i in res_string'range loop + res_string(i) := ' '; + end loop; + -- read all characters of the line, up to the length + -- of the results string + for i in res_string'range loop + read(l, c, is_string); + res_string(i) := c; + if not is_string then -- found end of line + exit; + end if; + end loop; + +end str_read; + + +-- print string to a file +procedure print(file out_file: TEXT; + new_string: in string) is + + variable l: line; + + begin + + write(l, new_string); + writeline(out_file, l); + +end print; + + +-- print character to a file and start new line +procedure print(file out_file: TEXT; + char: in character) is + + variable l: line; + + begin + + write(l, char); + writeline(out_file, l); + +end print; + + + +-- appends contents of a string to a file until line feed occurs +-- (LF is considered to be the end of the string) + +procedure str_write(file out_file: TEXT; + new_string: in string) is + begin + + for i in new_string'range loop + print(out_file, new_string(i)); + if new_string(i) = LF then -- end of string + exit; + end if; + end loop; + +end str_write; + + + + +end txt_util; + + + + diff --git a/zpu/hdl/zpu4/src/zpuio.vhd b/zpu/hdl/zpu4/src/zpuio.vhd index 09a1ddd..2c7fd41 100644 --- a/zpu/hdl/zpu4/src/zpuio.vhd +++ b/zpu/hdl/zpu4/src/zpuio.vhd @@ -1,232 +1,232 @@ -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.STD_LOGIC_UNSIGNED.ALL; - -library work; -use work.zpu_config.all; -use work.zpupkg.all; - -entity zpuio is - port ( areset : in std_logic; - cpu_clk : in std_logic; - clk_status : in std_logic_vector(2 downto 0); - cpu_din : in std_logic_vector(15 downto 0); - cpu_a : in std_logic_vector(20 downto 0); - cpu_we : in std_logic_vector(1 downto 0); - cpu_re : in std_logic; - cpu_dout : inout std_logic_vector(15 downto 0)); -end zpuio; - -architecture behave of zpuio is - -signal timer_read : std_logic_vector(7 downto 0); ---signal timer_write : std_logic_vector(7 downto 0); -signal timer_we : std_logic; - - -signal io_busy : std_logic; -signal io_read : std_logic_vector(7 downto 0); ---signal io_write : std_logic_vector(7 downto 0); -signal io_addr : std_logic_vector(maxAddrBit downto minAddrBit); -signal io_writeEnable : std_logic; -signal Enable : std_logic; - -signal din : std_logic_vector(7 downto 0); -signal dout : std_logic_vector(7 downto 0); -signal adr : std_logic_vector(15 downto 0); -signal break : std_logic; -signal we : std_logic; -signal re : std_logic; - - --- uart forwarding... - -signal uartTXPending : std_logic; -signal uartTXCleared : std_logic; -signal uartData : std_logic_vector(7 downto 0); - -signal readingTimer : std_logic; - - - - -signal mem_busy : std_logic; -signal mem_read : std_logic_vector(wordSize-1 downto 0); -signal mem_write : std_logic_vector(wordSize-1 downto 0); -signal mem_addr : std_logic_vector(maxAddrBitIncIO downto 0); -signal mem_writeEnable : std_logic; -signal mem_readEnable : std_logic; -signal mem_writeMask: std_logic_vector(wordBytes-1 downto 0); - -signal dram_mem_busy : std_logic; -signal dram_mem_read : std_logic_vector(wordSize-1 downto 0); -signal dram_mem_write : std_logic_vector(wordSize-1 downto 0); -signal dram_mem_writeEnable : std_logic; -signal dram_mem_readEnable : std_logic; -signal dram_mem_writeMask: std_logic_vector(wordBytes-1 downto 0); - - - ---signal io_mem_read : std_logic_vector(7 downto 0); ---signal io_mem_writeEnable : std_logic; ---signal io_mem_readEnable : std_logic; -signal io_readEnable : std_logic; - - -signal dram_read : std_logic; - - - -begin - - io_addr <= mem_addr(maxAddrBit downto minAddrBit); - - timerinst: timer port map ( - clk => cpu_clk, - areset => areset, - we => timer_we, - din => mem_write(7 downto 0), - adr => io_addr(4 downto 2), - dout => timer_read); - - zpu: zpu_core port map ( - clk => cpu_clk , - areset => areset, - in_mem_busy => mem_busy, - mem_read => mem_read, - mem_write => mem_write, - out_mem_addr => mem_addr, - out_mem_writeEnable => mem_writeEnable, - out_mem_readEnable => mem_readEnable, - mem_writeMask => mem_writeMask, - interrupt => '0', - break => break); - - -ram_imp: dram port map ( - clk => cpu_clk , - areset => areset, - mem_busy => dram_mem_busy, - mem_read => dram_mem_read, - mem_write => mem_write, - mem_addr => mem_addr(maxAddrBit downto 0), - mem_writeEnable => dram_mem_writeEnable, - mem_readEnable => dram_mem_readEnable, - mem_writeMask => mem_writeMask); - - - - fauxUart: - process(cpu_clk, areset) - begin - if areset = '1' then - io_busy <= '0'; - uartTXPending <= '0'; - timer_we <= '0'; - io_busy <= '0'; - uartData <= x"58"; -- 'X' - readingTimer <= '0'; - elsif (cpu_clk'event and cpu_clk = '1') then - timer_we <= '0'; - io_busy <= '0'; - if uartTXCleared = '1' then - uartTXPending <= '0'; - end if; - - if io_writeEnable = '1' then - if io_addr=x"2028003" then - -- Write to UART - uartData <= mem_write(7 downto 0); - uartTXPending <= '1'; - io_busy <= '1'; - elsif io_addr(12)='1' then - timer_we <= '1'; - io_busy <= '1'; - else --- report "Illegal IO write" severity failure; - end if; - end if; - if (io_readEnable = '1') then - if io_addr=x"2028003" then - io_read <= (0=>'1', -- recieve empty - 1 => uartTXPending, -- tx full - others => '0'); - io_busy <= '1'; - elsif io_addr(12)='1' then - readingTimer <= '1'; - io_busy <= '1'; - elsif io_addr(11)='1' then - io_read <= ZPU_Frequency; - io_busy <= '1'; - else --- report "Illegal IO read" severity failure; - end if; - - else - if (readingTimer = '1') then - readingTimer <= '0'; - io_read <= timer_read; - io_busy <= '0'; - else - io_read <= (others => '1'); - end if; - end if; - end if; - end process; - - - forwardUARTOutputToARM: - process(cpu_clk, areset) - begin - if areset = '1' then - uartTXCleared <= '0'; - elsif (cpu_clk = '1' and cpu_clk'event) then - if cpu_we(0) = '1' and cpu_a(3 downto 1) = "000" then - uartTXCleared <= cpu_din(0); - else - uartTXCleared <= uartTXCleared; - end if; - end if; - end process; - - cpu_dout(7 downto 0) <= uartData when (cpu_re = '1' and cpu_a(3 downto 1) = "001") else (others => 'Z'); - cpu_dout <= (0 => uartTXPending, others => '0') when (cpu_re = '1' and cpu_a(3 downto 1) = "000") else (others => 'Z'); - - dram_mem_writeEnable <= mem_writeEnable and not mem_addr(ioBit); - dram_mem_readEnable <= mem_readEnable and not mem_addr(ioBit); - io_writeEnable <= mem_writeEnable and mem_addr(ioBit); --- io_readEnable <= mem_readEnable and mem_addr(ioBit); - mem_busy <= io_busy or dram_mem_busy or dram_read or io_readEnable; - - -- Memory reads either come from IO or DRAM. We need to pick the right one. - memorycontrol: - process(cpu_clk, areset) - begin - if areset = '1' then - dram_read <= '0'; - io_readEnable <= '0'; - - - elsif (cpu_clk'event and cpu_clk = '1') then - mem_read <= (others => '0'); - if mem_addr(ioBit)='0' and mem_readEnable='1' then - dram_read <= '1'; - end if; - if dram_read='1' and dram_mem_busy='0' then - dram_read <= '0'; - mem_read <= dram_mem_read; - end if; - - if mem_addr(ioBit)='1' and mem_readEnable='1' then - io_readEnable <= '1'; - end if; - if io_readEnable='1' and io_busy='0' then - io_readEnable <= '0'; - mem_read(7 downto 0) <= io_read; - end if; - - end if; - end process; - - -end behave; +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; + +entity zpuio is + port ( areset : in std_logic; + cpu_clk : in std_logic; + clk_status : in std_logic_vector(2 downto 0); + cpu_din : in std_logic_vector(15 downto 0); + cpu_a : in std_logic_vector(20 downto 0); + cpu_we : in std_logic_vector(1 downto 0); + cpu_re : in std_logic; + cpu_dout : inout std_logic_vector(15 downto 0)); +end zpuio; + +architecture behave of zpuio is + +signal timer_read : std_logic_vector(7 downto 0); +--signal timer_write : std_logic_vector(7 downto 0); +signal timer_we : std_logic; + + +signal io_busy : std_logic; +signal io_read : std_logic_vector(7 downto 0); +--signal io_write : std_logic_vector(7 downto 0); +signal io_addr : std_logic_vector(maxAddrBit downto minAddrBit); +signal io_writeEnable : std_logic; +signal Enable : std_logic; + +signal din : std_logic_vector(7 downto 0); +signal dout : std_logic_vector(7 downto 0); +signal adr : std_logic_vector(15 downto 0); +signal break : std_logic; +signal we : std_logic; +signal re : std_logic; + + +-- uart forwarding... + +signal uartTXPending : std_logic; +signal uartTXCleared : std_logic; +signal uartData : std_logic_vector(7 downto 0); + +signal readingTimer : std_logic; + + + + +signal mem_busy : std_logic; +signal mem_read : std_logic_vector(wordSize-1 downto 0); +signal mem_write : std_logic_vector(wordSize-1 downto 0); +signal mem_addr : std_logic_vector(maxAddrBitIncIO downto 0); +signal mem_writeEnable : std_logic; +signal mem_readEnable : std_logic; +signal mem_writeMask: std_logic_vector(wordBytes-1 downto 0); + +signal dram_mem_busy : std_logic; +signal dram_mem_read : std_logic_vector(wordSize-1 downto 0); +signal dram_mem_write : std_logic_vector(wordSize-1 downto 0); +signal dram_mem_writeEnable : std_logic; +signal dram_mem_readEnable : std_logic; +signal dram_mem_writeMask: std_logic_vector(wordBytes-1 downto 0); + + + +--signal io_mem_read : std_logic_vector(7 downto 0); +--signal io_mem_writeEnable : std_logic; +--signal io_mem_readEnable : std_logic; +signal io_readEnable : std_logic; + + +signal dram_read : std_logic; + + + +begin + + io_addr <= mem_addr(maxAddrBit downto minAddrBit); + + timerinst: timer port map ( + clk => cpu_clk, + areset => areset, + we => timer_we, + din => mem_write(7 downto 0), + adr => io_addr(4 downto 2), + dout => timer_read); + + zpu: zpu_core port map ( + clk => cpu_clk , + areset => areset, + in_mem_busy => mem_busy, + mem_read => mem_read, + mem_write => mem_write, + out_mem_addr => mem_addr, + out_mem_writeEnable => mem_writeEnable, + out_mem_readEnable => mem_readEnable, + mem_writeMask => mem_writeMask, + interrupt => '0', + break => break); + + +ram_imp: dram port map ( + clk => cpu_clk , + areset => areset, + mem_busy => dram_mem_busy, + mem_read => dram_mem_read, + mem_write => mem_write, + mem_addr => mem_addr(maxAddrBit downto 0), + mem_writeEnable => dram_mem_writeEnable, + mem_readEnable => dram_mem_readEnable, + mem_writeMask => mem_writeMask); + + + + fauxUart: + process(cpu_clk, areset) + begin + if areset = '1' then + io_busy <= '0'; + uartTXPending <= '0'; + timer_we <= '0'; + io_busy <= '0'; + uartData <= x"58"; -- 'X' + readingTimer <= '0'; + elsif (cpu_clk'event and cpu_clk = '1') then + timer_we <= '0'; + io_busy <= '0'; + if uartTXCleared = '1' then + uartTXPending <= '0'; + end if; + + if io_writeEnable = '1' then + if io_addr=x"2028003" then + -- Write to UART + uartData <= mem_write(7 downto 0); + uartTXPending <= '1'; + io_busy <= '1'; + elsif io_addr(12)='1' then + timer_we <= '1'; + io_busy <= '1'; + else +-- report "Illegal IO write" severity failure; + end if; + end if; + if (io_readEnable = '1') then + if io_addr=x"2028003" then + io_read <= (0=>'1', -- recieve empty + 1 => uartTXPending, -- tx full + others => '0'); + io_busy <= '1'; + elsif io_addr(12)='1' then + readingTimer <= '1'; + io_busy <= '1'; + elsif io_addr(11)='1' then + io_read <= ZPU_Frequency; + io_busy <= '1'; + else +-- report "Illegal IO read" severity failure; + end if; + + else + if (readingTimer = '1') then + readingTimer <= '0'; + io_read <= timer_read; + io_busy <= '0'; + else + io_read <= (others => '1'); + end if; + end if; + end if; + end process; + + + forwardUARTOutputToARM: + process(cpu_clk, areset) + begin + if areset = '1' then + uartTXCleared <= '0'; + elsif (cpu_clk = '1' and cpu_clk'event) then + if cpu_we(0) = '1' and cpu_a(3 downto 1) = "000" then + uartTXCleared <= cpu_din(0); + else + uartTXCleared <= uartTXCleared; + end if; + end if; + end process; + + cpu_dout(7 downto 0) <= uartData when (cpu_re = '1' and cpu_a(3 downto 1) = "001") else (others => 'Z'); + cpu_dout <= (0 => uartTXPending, others => '0') when (cpu_re = '1' and cpu_a(3 downto 1) = "000") else (others => 'Z'); + + dram_mem_writeEnable <= mem_writeEnable and not mem_addr(ioBit); + dram_mem_readEnable <= mem_readEnable and not mem_addr(ioBit); + io_writeEnable <= mem_writeEnable and mem_addr(ioBit); +-- io_readEnable <= mem_readEnable and mem_addr(ioBit); + mem_busy <= io_busy or dram_mem_busy or dram_read or io_readEnable; + + -- Memory reads either come from IO or DRAM. We need to pick the right one. + memorycontrol: + process(cpu_clk, areset) + begin + if areset = '1' then + dram_read <= '0'; + io_readEnable <= '0'; + + + elsif (cpu_clk'event and cpu_clk = '1') then + mem_read <= (others => '0'); + if mem_addr(ioBit)='0' and mem_readEnable='1' then + dram_read <= '1'; + end if; + if dram_read='1' and dram_mem_busy='0' then + dram_read <= '0'; + mem_read <= dram_mem_read; + end if; + + if mem_addr(ioBit)='1' and mem_readEnable='1' then + io_readEnable <= '1'; + end if; + if io_readEnable='1' and io_busy='0' then + io_readEnable <= '0'; + mem_read(7 downto 0) <= io_read; + end if; + + end if; + end process; + + +end behave; -- cgit v1.1 From bb1b38ce7d74dbf5ff5bb57576011ed825a8330d Mon Sep 17 00:00:00 2001 From: Bert Lange Date: Tue, 2 Aug 2011 14:17:00 +0200 Subject: change: prettier logifle output --- zpu/hdl/zpu4/src/io.vhd | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/io.vhd b/zpu/hdl/zpu4/src/io.vhd index 159df6f..f05b29b 100644 --- a/zpu/hdl/zpu4/src/io.vhd +++ b/zpu/hdl/zpu4/src/io.vhd @@ -56,7 +56,11 @@ begin timer_we <= writeEnable and addr(12); process(areset, clk) - variable taddr : std_logic_vector(maxAddrBit downto 0); + variable taddr : std_logic_vector(maxAddrBit downto 0); + -- pragma translate_off + variable line_out : line := new string'(""); + variable char : character; + -- pragma translate_on begin taddr := (others => '0'); taddr(maxAddrBit downto minAddrBit) := addr; @@ -69,17 +73,25 @@ begin -- external interface (fixed address) -- extend compare to avoid waring messages if ("1" & addr & lowAddrBits)=x"80a000c" then - report "Write to UART[0]" & " :0x" & hstr(write); -- Write to UART - -- report "" & character'image(conv_integer(memBint)) severity note; - print(l_file, character'val(to_integer(unsigned(write)))); + report "Write to UART[0]" & " :0x" & hstr(write); + -- pragma translate_off + char := character'val(to_integer(unsigned(write))); + if char = lf then + std.textio.writeline( l_file, line_out); + else + std.textio.write( line_out, char); + end if; + -- pragma translate_on + elsif addr(12)='1' then report "Write to TIMER" & " :0x" & hstr(write); -- report "xxx" severity failure; -- timer_we <= '1'; + else - print(l_file, character'val(to_integer(unsigned(write)))); - report "Illegal IO write @" & "0x" & hstr(taddr) severity warning; + + report "Illegal IO write @" & "0x" & hstr(taddr) severity warning; end if; end if; -- cgit v1.1 From ec177759929085f161b9a5c7c82016406d8867cb Mon Sep 17 00:00:00 2001 From: Bert Lange Date: Tue, 16 Aug 2011 23:43:12 +0200 Subject: beautify indentation --- zpu/hdl/zpu4/src/clocks.vhd | 418 +++++++++------------ zpu/hdl/zpu4/src/io.vhd | 191 +++++----- zpu/hdl/zpu4/src/timer.vhd | 102 ++--- zpu/hdl/zpu4/src/trace.vhd | 106 +++--- zpu/hdl/zpu4/src/txt_util.vhd | 852 +++++++++++++++++++----------------------- zpu/hdl/zpu4/src/zpuio.vhd | 424 ++++++++++----------- 6 files changed, 967 insertions(+), 1126 deletions(-) (limited to 'zpu/hdl/zpu4/src') diff --git a/zpu/hdl/zpu4/src/clocks.vhd b/zpu/hdl/zpu4/src/clocks.vhd index 704d790..67433be 100644 --- a/zpu/hdl/zpu4/src/clocks.vhd +++ b/zpu/hdl/zpu4/src/clocks.vhd @@ -1,246 +1,198 @@ -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.STD_LOGIC_UNSIGNED.ALL; +library ieee; +use ieee.std_logic_1164.all; + +library unisim; +use unisim.vcomponents.ibufg; +use unisim.vcomponents.srl16; +use unisim.vcomponents.dcm; +use unisim.vcomponents.bufg; -library UNISIM; -use UNISIM.vcomponents.all; entity clocks is - port ( areset : in std_logic; - cpu_clk_p : in std_logic; - sdr_clk_fb_p : in std_logic; - cpu_clk : out std_logic; - cpu_clk_2x : out std_logic; - cpu_clk_4x : out std_logic; - ddr_in_clk : out std_logic; - ddr_in_clk_2x : out std_logic; - locked : out std_logic_vector(2 downto 0)); -end clocks; + port ( + areset : in std_logic; + cpu_clk_p : in std_logic; + sdr_clk_fb_p : in std_logic; + cpu_clk : out std_logic; + cpu_clk_2x : out std_logic; + cpu_clk_4x : out std_logic; + ddr_in_clk : out std_logic; + ddr_in_clk_2x : out std_logic; + locked : out std_logic_vector(2 downto 0) + ); +end entity clocks; architecture behave of clocks is -signal low : std_logic; + signal low : std_logic; + -- + signal cpu_clk_in : std_logic; + signal sdr_clk_fb_in : std_logic; + -- + signal dcm_cpu1 : std_logic; + signal dcm_cpu2 : std_logic; + signal dcm_cpu2_dum : std_logic; + signal dcm_cpu4 : std_logic; + signal dcm_ddr2 : std_logic; + signal dcm_ddr2_2x : std_logic; + -- + signal cpu_clk_int : std_logic; + signal cpu_clk_2x_int : std_logic; + signal cpu_clk_2x_dum_int : std_logic; + signal cpu_clk_4x_int : std_logic; + signal ddr_in_clk_int : std_logic; + signal ddr_in_clk_2x_int : std_logic; + -- + signal dcm1_locked_del : std_logic; + signal dcm2_locked_del : std_logic; + signal dcm2_reset : std_logic; + signal dcm3_reset : std_logic; + -- + signal locked_int : std_logic_vector(2 downto 0); + signal del_addr : std_logic_vector(3 downto 0); + +begin -signal cpu_clk_in : std_logic; -signal sdr_clk_fb_in : std_logic; + low <= '0'; + del_addr <= "1111"; + -- + cpu_clk <= cpu_clk_int; + cpu_clk_2x <= cpu_clk_2x_int; + cpu_clk_4x <= cpu_clk_4x_int; + ddr_in_clk <= ddr_in_clk_int; + ddr_in_clk_2x <= ddr_in_clk_2x_int; + locked <= locked_int; -signal dcm_cpu1 : std_logic; -signal dcm_cpu2 : std_logic; -signal dcm_cpu2_dum : std_logic; -signal dcm_cpu4 : std_logic; -signal dcm_ddr2 : std_logic; -signal dcm_ddr2_2x : std_logic; -signal cpu_clk_int : std_logic; -signal cpu_clk_2x_int : std_logic; -signal cpu_clk_2x_dum_int : std_logic; -signal cpu_clk_4x_int : std_logic; -signal ddr_in_clk_int : std_logic; -signal ddr_in_clk_2x_int : std_logic; + cpu_ibufg : ibufg + port map ( + O => cpu_clk_in, + I => cpu_clk_p + ); -signal dcm1_locked_del : std_logic; -signal dcm2_locked_del : std_logic; -signal dcm2_reset : std_logic; -signal dcm3_reset : std_logic; + sdr_fb_ibufg : ibufg + port map ( + O => sdr_clk_fb_in, + I => sdr_clk_fb_p + ); -signal locked_int : std_logic_vector(2 downto 0); -signal del_addr : std_logic_vector(3 downto 0); + dcm2_rst : srl16 + generic map ( + init => x"0000" + ) + port map ( + Q => dcm1_locked_del, + A0 => del_addr(0), + A1 => del_addr(1), + A2 => del_addr(2), + A3 => del_addr(3), + CLK => cpu_clk_int, + D => locked_int(0) + ); -begin + dcm2_reset <= not(dcm1_locked_del); + + dcm3_rst : srl16 + generic map ( + init => x"0000" + ) + port map ( + Q => dcm2_locked_del, + A0 => del_addr(0), + A1 => del_addr(1), + A2 => del_addr(2), + A3 => del_addr(3), + CLK => cpu_clk_int, + D => locked_int(1) + ); + + dcm3_reset <= not(dcm2_locked_del); + + cpu1_dcm : + dcm generic map ( + clkin_period => 15.625, -- Specify period of input clock + factory_jf => X"8080" -- FACTORY JF Values + ) + port map ( + clk0 => dcm_cpu1, -- 0 degree DCM CLK ouptput + clk2x => dcm_cpu2, -- 2X DCM CLK output + locked => locked_int(0), -- DCM LOCK status output + clkfb => cpu_clk_int, -- DCM clock feedback + clkin => cpu_clk_in, -- Clock input (from IBUFG, BUFG or DCM) + psclk => low, -- Dynamic phase adjust clock input + psen => low, -- Dynamic phase adjust enable input + psincdec => low, -- Dynamic phase adjust increment/decrement + rst => areset -- DCM asynchronous reset input + ); + + cpu2_dcm : dcm + generic map ( + clkin_period => 7.8125, -- Specify period of input clock + factory_jf => X"8080" -- FACTORY JF Values + ) + port map ( + clk0 => dcm_cpu2_dum, -- 0 degree DCM CLK ouptput + clk2x => dcm_cpu4, -- 2X DCM CLK output + locked => locked_int(1), -- DCM LOCK status output + clkfb => cpu_clk_2x_dum_int, -- DCM clock feedback + clkin => cpu_clk_2x_int, -- Clock input (from IBUFG, BUFG or DCM) + psclk => low, -- Dynamic phase adjust clock input + psen => low, -- Dynamic phase adjust enable input + psincdec => low, -- Dynamic phase adjust increment/decrement + rst => dcm2_reset -- DCM asynchronous reset input + ); + + ddr_read_dcm : dcm + generic map ( + clkin_period => 7.8125, -- Specify period of input clock + clkout_phase_shift => "FIXED", -- Specify phase shift of NONE, FIXED or VARIABLE + factory_jf => X"8080", -- FACTORY JF Values + phase_shift => 103 -- Amount of fixed phase shift from -255 to 255 + ) + port map ( + clk0 => dcm_ddr2, -- 0 degree DCM CLK ouptput + clk2x => dcm_ddr2_2x, -- 2X DCM CLK output + locked => locked_int(2), -- DCM LOCK status output + clkfb => ddr_in_clk_int, -- DCM clock feedback + clkin => sdr_clk_fb_in, -- Clock input (from IBUFG, BUFG or DCM) + psclk => low, -- Dynamic phase adjust clock input + psen => low, -- Dynamic phase adjust enable input + psincdec => low, -- Dynamic phase adjust increment/decrement + rst => dcm3_reset -- DCM asynchronous reset input + ); + + cpu1 : bufg + port map ( + I => dcm_cpu1, + O => cpu_clk_int + ); + + cpu2 : bufg + port map ( + I => dcm_cpu2, + O => cpu_clk_2x_int + ); + + cpu2_dum : bufg + port map ( + i => dcm_cpu2_dum, + o => cpu_clk_2x_dum_int + ); + + cpu4 : bufg + port map ( + i => dcm_cpu4, + o => cpu_clk_4x_int + ); + + ddr_clk : bufg port map ( + i => dcm_ddr2, + o => ddr_in_clk_int + ); + + ddr_clk_2x : bufg port map ( + i => dcm_ddr2_2x, + o => ddr_in_clk_2x_int + ); - low <= '0'; - del_addr <= "1111"; - - cpu_clk <= cpu_clk_int; - cpu_clk_2x <= cpu_clk_2x_int; - cpu_clk_4x <= cpu_clk_4x_int; - ddr_in_clk <= ddr_in_clk_int; - ddr_in_clk_2x <= ddr_in_clk_2x_int; - locked <= locked_int; - - - CPU_IBUFG: - IBUFG port map ( - O => cpu_clk_in, - I => cpu_clk_p); - - SDR_FB_IBUFG: - IBUFG port map ( - O => sdr_clk_fb_in, - I => sdr_clk_fb_p); - - dcm2_rst: - SRL16 generic map ( - INIT => X"0000") - port map ( - Q => dcm1_locked_del, - A0 => del_addr(0), - A1 => del_addr(1), - A2 => del_addr(2), - A3 => del_addr(3), - CLK => cpu_clk_int, - D => locked_int(0)); - - dcm2_reset <= not(dcm1_locked_del); - - dcm3_rst: - SRL16 generic map ( - INIT => X"0000") - port map ( - Q => dcm2_locked_del, - A0 => del_addr(0), - A1 => del_addr(1), - A2 => del_addr(2), - A3 => del_addr(3), - CLK => cpu_clk_int, - D => locked_int(1)); - - dcm3_reset <= not(dcm2_locked_del); - - cpu1_dcm: - DCM generic map ( - CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5 - -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0 - CLKFX_DIVIDE => 1, -- Can be any interger from 1 to 32 - CLKFX_MULTIPLY => 4, -- Can be any integer from 1 to 32 - CLKIN_DIVIDE_BY_2 => FALSE, -- TRUE/FALSE to enable CLKIN divide by two feature - CLKIN_PERIOD => 15.625, -- Specify period of input clock - CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift of NONE, FIXED or VARIABLE - CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE, 1X or 2X - DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or - -- an integer from 0 to 15 - DFS_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for frequency synthesis - DLL_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for DLL - DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSE - FACTORY_JF => X"8080", -- FACTORY JF Values - PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 255 - STARTUP_WAIT => FALSE) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE - port map ( - CLK0 => dcm_cpu1, -- 0 degree DCM CLK ouptput - CLK180 => open, -- 180 degree DCM CLK output - CLK270 => open, -- 270 degree DCM CLK output - CLK2X => dcm_cpu2, -- 2X DCM CLK output - CLK2X180 => open, -- 2X, 180 degree DCM CLK out - CLK90 => open, -- 90 degree DCM CLK output - CLKDV => open, -- Divided DCM CLK out (CLKDV_DIVIDE) - CLKFX => open, -- DCM CLK synthesis out (M/D) - CLKFX180 => open, -- 180 degree CLK synthesis out - LOCKED => locked_int(0), -- DCM LOCK status output - PSDONE => open, -- Dynamic phase adjust done output - STATUS => open, -- 8-bit DCM status bits output - CLKFB => cpu_clk_int, -- DCM clock feedback - CLKIN => cpu_clk_in, -- Clock input (from IBUFG, BUFG or DCM) - PSCLK => low, -- Dynamic phase adjust clock input - PSEN => low, -- Dynamic phase adjust enable input - PSINCDEC => low, -- Dynamic phase adjust increment/decrement - RST => areset); -- DCM asynchronous reset input - - cpu2_dcm: - DCM generic map ( - CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5 - -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0 - CLKFX_DIVIDE => 1, -- Can be any interger from 1 to 32 - CLKFX_MULTIPLY => 4, -- Can be any integer from 1 to 32 - CLKIN_DIVIDE_BY_2 => FALSE, -- TRUE/FALSE to enable CLKIN divide by two feature - CLKIN_PERIOD => 7.8125, -- Specify period of input clock - CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift of NONE, FIXED or VARIABLE - CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE, 1X or 2X - DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or - -- an integer from 0 to 15 - DFS_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for frequency synthesis - DLL_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for DLL - DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSE - FACTORY_JF => X"8080", -- FACTORY JF Values - PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 255 - STARTUP_WAIT => FALSE) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE - port map ( - CLK0 => dcm_cpu2_dum, -- 0 degree DCM CLK ouptput - CLK180 => open, -- 180 degree DCM CLK output - CLK270 => open, -- 270 degree DCM CLK output - CLK2X => dcm_cpu4, -- 2X DCM CLK output - CLK2X180 => open, -- 2X, 180 degree DCM CLK out - CLK90 => open, -- 90 degree DCM CLK output - CLKDV => open, -- Divided DCM CLK out (CLKDV_DIVIDE) - CLKFX => open, -- DCM CLK synthesis out (M/D) - CLKFX180 => open, -- 180 degree CLK synthesis out - LOCKED => locked_int(1), -- DCM LOCK status output - PSDONE => open, -- Dynamic phase adjust done output - STATUS => open, -- 8-bit DCM status bits output - CLKFB => cpu_clk_2x_dum_int, -- DCM clock feedback - CLKIN => cpu_clk_2x_int, -- Clock input (from IBUFG, BUFG or DCM) - PSCLK => low, -- Dynamic phase adjust clock input - PSEN => low, -- Dynamic phase adjust enable input - PSINCDEC => low, -- Dynamic phase adjust increment/decrement - RST => dcm2_reset); -- DCM asynchronous reset input - - ddr_read_dcm: - DCM generic map ( - CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5 - -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0 - CLKFX_DIVIDE => 1, -- Can be any interger from 1 to 32 - CLKFX_MULTIPLY => 4, -- Can be any integer from 1 to 32 - CLKIN_DIVIDE_BY_2 => FALSE, -- TRUE/FALSE to enable CLKIN divide by two feature - CLKIN_PERIOD => 7.8125, -- Specify period of input clock - CLKOUT_PHASE_SHIFT => "FIXED", -- Specify phase shift of NONE, FIXED or VARIABLE --- CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift of NONE, FIXED or VARIABLE - CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE, 1X or 2X - DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or - -- an integer from 0 to 15 - DFS_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for frequency synthesis - DLL_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for DLL - DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSE - FACTORY_JF => X"8080", -- FACTORY JF Values - PHASE_SHIFT => 103, -- Amount of fixed phase shift from -255 to 255 --- PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 255 - STARTUP_WAIT => FALSE) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE - port map ( - CLK0 => dcm_ddr2, -- 0 degree DCM CLK ouptput - CLK180 => open, -- 180 degree DCM CLK output - CLK270 => open, -- 270 degree DCM CLK output - CLK2X => dcm_ddr2_2x, -- 2X DCM CLK output - CLK2X180 => open, -- 2X, 180 degree DCM CLK out - CLK90 => open, -- 90 degree DCM CLK output - CLKDV => open, -- Divided DCM CLK out (CLKDV_DIVIDE) - CLKFX => open, -- DCM CLK synthesis out (M/D) - CLKFX180 => open, -- 180 degree CLK synthesis out - LOCKED => locked_int(2), -- DCM LOCK status output - PSDONE => open, -- Dynamic phase adjust done output - STATUS => open, -- 8-bit DCM status bits output - CLKFB => ddr_in_clk_int, -- DCM clock feedback - CLKIN => sdr_clk_fb_in, -- Clock input (from IBUFG, BUFG or DCM) - PSCLK => low, -- Dynamic phase adjust clock input - PSEN => low, -- Dynamic phase adjust enable input - PSINCDEC => low, -- Dynamic phase adjust increment/decrement - RST => dcm3_reset); -- DCM asynchronous reset input - - cpu1: - BUFG port map ( - I => dcm_cpu1, - O => cpu_clk_int); - - cpu2: - BUFG port map ( - I => dcm_cpu2, - O => cpu_clk_2x_int); - - cpu2_dum: - BUFG port map ( - I => dcm_cpu2_dum, - O => cpu_clk_2x_dum_int); - - cpu4: - BUFG port map ( - I => dcm_cpu4, - O => cpu_clk_4x_int); - - ddr_clk: - BUFG port map ( - I => dcm_ddr2, - O => ddr_in_clk_int); - - ddr_clk_2x: - BUFG port map ( - I => dcm_ddr2_2x, - O => ddr_in_clk_2x_int); - -end behave; \ No newline at end of file +end architecture behave; diff --git a/zpu/hdl/zpu4/src/io.vhd b/zpu/hdl/zpu4/src/io.vhd index f05b29b..56c7fb5 100644 --- a/zpu/hdl/zpu4/src/io.vhd +++ b/zpu/hdl/zpu4/src/io.vhd @@ -8,117 +8,112 @@ library work; use work.zpu_config.all; use work.zpupkg.all; use work.txt_util.all; - -entity zpu_io is - generic ( - log_file: string := "log.txt" - ); - port( - clk : in std_logic; - areset : in std_logic; - busy : out std_logic; - writeEnable : in std_logic; - readEnable : in std_logic; - write : in std_logic_vector(wordSize-1 downto 0); - read : out std_logic_vector(wordSize-1 downto 0); - addr : in std_logic_vector(maxAddrBit downto minAddrBit) - ); -end zpu_io; - - -architecture behave of zpu_io is +entity zpu_io is + generic ( + log_file : string := "log.txt" + ); + port( + clk : in std_logic; + areset : in std_logic; + busy : out std_logic; + writeEnable : in std_logic; + readEnable : in std_logic; + write : in std_logic_vector(wordSize-1 downto 0); + read : out std_logic_vector(wordSize-1 downto 0); + addr : in std_logic_vector(maxAddrBit downto minAddrBit) + ); +end entity zpu_io; -signal timer_read : std_logic_vector(7 downto 0); ---signal timer_write : std_logic_vector(7 downto 0); -signal timer_we : std_logic; -signal serving : std_logic; +architecture behave of zpu_io is -file l_file : TEXT open write_mode is log_file; -constant lowAddrBits: std_logic_vector(minAddrBit-1 downto 0) := (others=>'0'); -constant tx_full: std_logic := '0'; -constant rx_empty: std_logic := '1'; + signal timer_read : std_logic_vector(7 downto 0); + signal timer_we : std_logic; + -- + signal serving : std_logic; + -- + file l_file : text open write_mode is log_file; + constant lowAddrBits : std_logic_vector(minAddrBit-1 downto 0) := (others => '0'); + constant tx_full : std_logic := '0'; + constant rx_empty : std_logic := '1'; begin - - timerinst: timer port map ( - clk => clk, - areset => areset, - we => timer_we, - din => write(7 downto 0), - adr => addr(4 downto 2), - dout => timer_read); - - busy <= writeEnable or readEnable; - timer_we <= writeEnable and addr(12); - - process(areset, clk) - variable taddr : std_logic_vector(maxAddrBit downto 0); - -- pragma translate_off - variable line_out : line := new string'(""); - variable char : character; - -- pragma translate_on - begin - taddr := (others => '0'); - taddr(maxAddrBit downto minAddrBit) := addr; - - if (areset = '1') then --- timer_we <= '0'; - elsif (clk'event and clk = '1') then --- timer_we <= '0'; - if writeEnable = '1' then - -- external interface (fixed address) - -- extend compare to avoid waring messages - if ("1" & addr & lowAddrBits)=x"80a000c" then - -- Write to UART - report "Write to UART[0]" & " :0x" & hstr(write); + + timerinst : timer + port map ( + clk => clk, + areset => areset, + we => timer_we, + din => write(7 downto 0), + adr => addr(4 downto 2), + dout => timer_read + ); + + busy <= writeEnable or readEnable; + timer_we <= writeEnable and addr(12); + + process(areset, clk) + variable taddr : std_logic_vector(maxAddrBit downto 0); + -- pragma translate_off + variable line_out : line := new string'(""); + variable char : character; + -- pragma translate_on + begin + taddr := (others => '0'); + taddr(maxAddrBit downto minAddrBit) := addr; + + if (areset = '1') then + elsif (clk'event and clk = '1') then + if writeEnable = '1' then + -- external interface (fixed address) + -- extend compare to avoid waring messages + if ("1" & addr & lowAddrBits) = x"80a000c" then + -- Write to UART + report "Write to UART[0]" & " :0x" & hstr(write); -- pragma translate_off - char := character'val(to_integer(unsigned(write))); + char := character'val(to_integer(unsigned(write))); if char = lf then - std.textio.writeline( l_file, line_out); + std.textio.writeline(l_file, line_out); else - std.textio.write( line_out, char); + std.textio.write(line_out, char); end if; -- pragma translate_on - elsif addr(12)='1' then - report "Write to TIMER" & " :0x" & hstr(write); --- report "xxx" severity failure; --- timer_we <= '1'; + elsif addr(12) = '1' then + report "Write to TIMER" & " :0x" & hstr(write); - else - + else + report "Illegal IO write @" & "0x" & hstr(taddr) severity warning; - end if; - - end if; - read <= (others => '0'); - if (readEnable = '1') then - -- extend compare to avoid waring messages - if ("1" & addr & lowAddrBits)=x"80a000c" then - report "Read UART[0]"; - read(8) <= not tx_full; -- output fifo not full - read(9) <= not rx_empty; -- receiver not empty - elsif ("1" & addr & lowAddrBits)=x"80a0010" then - report "Read UART[1]"; - read(8) <= not rx_empty; -- receiver not empty - read(7 downto 0) <= (others => '0'); - elsif addr(12)='1' then - report "Read TIMER"; - read(7 downto 0) <= timer_read; - elsif addr(11)='1' then - report "Read ZPU Freq"; - read(7 downto 0) <= ZPU_Frequency; - else - report "Illegal IO read @" & "0x" & hstr(taddr) severity warning; - end if; - end if; - end if; - end process; - - -end behave; - + end if; + + end if; + read <= (others => '0'); + if (readEnable = '1') then + -- extend compare to avoid waring messages + if ("1" & addr & lowAddrBits) = x"80a000c" then + report "Read UART[0]"; + read(8) <= not tx_full; -- output fifo not full + read(9) <= not rx_empty; -- receiver not empty + elsif ("1" & addr & lowAddrBits) = x"80a0010" then + report "Read UART[1]"; + read(8) <= not rx_empty; -- receiver not empty + read(7 downto 0) <= (others => '0'); + elsif addr(12) = '1' then + report "Read TIMER"; + read(7 downto 0) <= timer_read; + elsif addr(11) = '1' then + report "Read ZPU Freq"; + read(7 downto 0) <= ZPU_Frequency; + else + report "Illegal IO read @" & "0x" & hstr(taddr) severity warning; + end if; + end if; + end if; + end process; + +end architecture behave; + diff --git a/zpu/hdl/zpu4/src/timer.vhd b/zpu/hdl/zpu4/src/timer.vhd index c60c172..d6d9358 100644 --- a/zpu/hdl/zpu4/src/timer.vhd +++ b/zpu/hdl/zpu4/src/timer.vhd @@ -1,61 +1,61 @@ library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; - + entity timer is - port( - clk : in std_logic; - areset : in std_logic; - we : in std_logic; - din : in std_logic_vector(7 downto 0); - adr : in std_logic_vector(2 downto 0); - dout : out std_logic_vector(7 downto 0)); -end timer; - - -architecture behave of timer is + port( + clk : in std_logic; + areset : in std_logic; + we : in std_logic; + din : in std_logic_vector(7 downto 0); + adr : in std_logic_vector(2 downto 0); + dout : out std_logic_vector(7 downto 0) + ); +end entity timer; -signal sample : std_logic; -signal reset : std_logic; +architecture behave of timer is -signal cnt : unsigned(63 downto 0); -signal cnt_smp : std_logic_vector(63 downto 0); + signal sample : std_logic; + signal reset : std_logic; + -- + signal cnt : unsigned(63 downto 0); + signal cnt_smp : std_logic_vector(63 downto 0); begin - reset <= '1' when (we = '1' and din(0) = '1') else '0'; - sample <= '1' when (we = '1' and din(1) = '1') else '0'; - - process(clk, areset) -- Carry generation - begin - if areset = '1' then - cnt <= (others => '0'); - cnt_smp <= (others => '0'); - elsif (clk'event and clk = '1') then - cnt <= cnt + 1; - if sample = '1' then --- report "sampling" severity failure; - cnt_smp <= std_logic_vector(cnt); - end if; - end if; - end process; - - - process(cnt_smp, adr) - begin - case adr is - when "000" => dout <= cnt_smp(7 downto 0); - when "001" => dout <= cnt_smp(15 downto 8); - when "010" => dout <= cnt_smp(23 downto 16); - when "011" => dout <= cnt_smp(31 downto 24); - when "100" => dout <= cnt_smp(39 downto 32); - when "101" => dout <= cnt_smp(47 downto 40); - when "110" => dout <= cnt_smp(55 downto 48); - when others => dout <= cnt_smp(63 downto 56); - end case; - end process; - - -end behave; - + reset <= '1' when (we = '1' and din(0) = '1') else '0'; + sample <= '1' when (we = '1' and din(1) = '1') else '0'; + + process(clk, areset) -- Carry generation + begin + if areset = '1' then + cnt <= (others => '0'); + cnt_smp <= (others => '0'); + elsif rising_edge(clk) then + cnt <= cnt + 1; + if sample = '1' then +-- report "sampling" severity failure; + cnt_smp <= std_logic_vector(cnt); + end if; + end if; + end process; + + + process(cnt_smp, adr) + begin + case adr is + when "000" => dout <= cnt_smp(7 downto 0); + when "001" => dout <= cnt_smp(15 downto 8); + when "010" => dout <= cnt_smp(23 downto 16); + when "011" => dout <= cnt_smp(31 downto 24); + when "100" => dout <= cnt_smp(39 downto 32); + when "101" => dout <= cnt_smp(47 downto 40); + when "110" => dout <= cnt_smp(55 downto 48); + when others => dout <= cnt_smp(63 downto 56); + end case; + end process; + + +end architecture behave; + diff --git a/zpu/hdl/zpu4/src/trace.vhd b/zpu/hdl/zpu4/src/trace.vhd index 00ac3a8..01678c8 100644 --- a/zpu/hdl/zpu4/src/trace.vhd +++ b/zpu/hdl/zpu4/src/trace.vhd @@ -42,76 +42,66 @@ library work; use work.zpu_config.all; use work.zpupkg.all; use work.txt_util.all; - - -entity trace is - generic ( - log_file: string := "trace.txt" - ); - port( - clk : in std_logic; - begin_inst : in std_logic; - pc : in std_logic_vector(maxAddrBitIncIO downto 0); - opcode : in std_logic_vector(7 downto 0); - sp : in std_logic_vector(maxAddrBitIncIO downto 2); - memA : in std_logic_vector(wordSize-1 downto 0); - memB : in std_logic_vector(wordSize-1 downto 0); - busy : in std_logic; - intSp : in std_logic_vector(stack_bits-1 downto 0) - ); -end trace; - - -architecture behave of trace is - - -file l_file : TEXT open write_mode is log_file; -begin +entity trace is + generic ( + log_file : string := "trace.txt" + ); + port( + clk : in std_logic; + begin_inst : in std_logic; + pc : in std_logic_vector(maxAddrBitIncIO downto 0); + opcode : in std_logic_vector(7 downto 0); + sp : in std_logic_vector(maxAddrBitIncIO downto 2); + memA : in std_logic_vector(wordSize-1 downto 0); + memB : in std_logic_vector(wordSize-1 downto 0); + busy : in std_logic; + intSp : in std_logic_vector(stack_bits-1 downto 0) + ); +end entity trace; --- write data and control information to a file +architecture behave of trace is + + file l_file : text open write_mode is log_file; -receive_data: process +begin -variable l: line; -variable t : std_logic_vector(wordSize-1 downto 0); -variable t2 : std_logic_vector(maxAddrBitIncIO downto 0); -variable counter : unsigned(63 downto 0); - - - -begin + -- write data and control information to a file + receive_data : process + variable l : line; + variable t : std_logic_vector(wordSize-1 downto 0); + variable t2 : std_logic_vector(maxAddrBitIncIO downto 0); + variable counter : unsigned(63 downto 0); + begin - t:= (others => '0'); - t2:= (others => '0'); + t := (others => '0'); + t2 := (others => '0'); -counter := (others => '0'); - -- print header for the logfile - print(l_file, "#pc,opcode,sp,top_of_stack "); - print(l_file, "#----------"); - print(l_file, " "); + counter := (others => '0'); - wait until clk = '1'; - wait until clk = '0'; + -- print header for the logfile + print(l_file, "#pc,opcode,sp,top_of_stack "); + print(l_file, "#----------"); + print(l_file, " "); - while true loop + wait until clk = '1'; + wait until clk = '0'; - counter := counter + 1; - if begin_inst = '1' then - t(maxAddrBitIncIO downto 2):=sp; - t2:=pc; - print(l_file, "0x" & hstr(t2) & " 0x" & hstr(opcode) & " 0x" & hstr(t) & " 0x" & hstr(memA) & " 0x" & hstr(memB) & " 0x" & hstr(intSp) & " 0x" & hstr(std_logic_vector(counter))); - end if; - - wait until clk = '0'; - - end loop; + while true loop - end process receive_data; + counter := counter + 1; + if begin_inst = '1' then + t(maxAddrBitIncIO downto 2) := sp; + t2 := pc; + print(l_file, "0x" & hstr(t2) & " 0x" & hstr(opcode) & " 0x" & hstr(t) & " 0x" & hstr(memA) & " 0x" & hstr(memB) & " 0x" & hstr(intSp) & " 0x" & hstr(std_logic_vector(counter))); + end if; + wait until clk = '0'; + + end loop; + end process receive_data; +end architecture behave; -end behave; - diff --git a/zpu/hdl/zpu4/src/txt_util.vhd b/zpu/hdl/zpu4/src/txt_util.vhd index 6432294..4dca901 100644 --- a/zpu/hdl/zpu4/src/txt_util.vhd +++ b/zpu/hdl/zpu4/src/txt_util.vhd @@ -36,586 +36,504 @@ library ieee; use ieee.std_logic_1164.all; use std.textio.all; -library work; package txt_util is -- prints a message to the screen - procedure print(text: string); + procedure print(text : string); -- prints the message when active -- useful for debug switches - procedure print(active: boolean; text: string); + procedure print(active : boolean; text : string); -- converts std_logic into a character - function chr(sl: std_logic) return character; + function chr(sl : std_logic) return character; -- converts std_logic into a string (1 to 1) - function str(sl: std_logic) return string; + function str(sl : std_logic) return string; -- converts std_logic_vector into a string (binary base) - function str(slv: std_logic_vector) return string; + function str(slv : std_logic_vector) return string; -- converts boolean into a string - function str(b: boolean) return string; + function str(b : boolean) return string; -- converts an integer into a single character -- (can also be used for hex conversion and other bases) - function chr(int: integer) return character; + function chr(int : integer) return character; -- converts integer into string using specified base - function str(int: integer; base: integer) return string; + function str(int : integer; base : integer) return string; -- converts integer to string, using base 10 - function str(int: integer) return string; + function str(int : integer) return string; -- convert std_logic_vector into a string in hex format - function hstr(slv: std_logic_vector) return string; + function hstr(slv : std_logic_vector) return string; -- functions to manipulate strings ----------------------------------- -- convert a character to upper case - function to_upper(c: character) return character; + function to_upper(c : character) return character; -- convert a character to lower case - function to_lower(c: character) return character; + function to_lower(c : character) return character; -- convert a string to upper case - function to_upper(s: string) return string; + function to_upper(s : string) return string; -- convert a string to lower case - function to_lower(s: string) return string; + function to_lower(s : string) return string; + + - - -- functions to convert strings into other formats -------------------------------------------------- - + -- converts a character into std_logic - function to_std_logic(c: character) return std_logic; - + function to_std_logic(c : character) return std_logic; + -- converts a string into std_logic_vector - function to_std_logic_vector(s: string) return std_logic_vector; + function to_std_logic_vector(s : string) return std_logic_vector; + - -- file I/O ----------- - - -- read variable length string from input file - procedure str_read(file in_file: TEXT; - res_string: out string); - - -- print string to a file and start new line - procedure print(file out_file: TEXT; - new_string: in string); - - -- print character to a file and start new line - procedure print(file out_file: TEXT; - char: in character); - -end txt_util; - + -- read variable length string from input file + procedure str_read(file in_file : text; res_string : out string); + -- print string to a file and start new line + procedure print(file out_file : text; new_string : in string); -package body txt_util is + -- print character to a file and start new line + procedure print(file out_file : text; char : in character); +end package txt_util; - -- prints text to the screen - procedure print(text: string) is - variable msg_line: line; - begin - write(msg_line, text); - writeline(output, msg_line); - end print; +package body txt_util is + -- prints text to the screen + procedure print(text : string) is + variable msg_line : line; + begin + write(msg_line, text); + writeline(output, msg_line); + end procedure print; - -- prints text to the screen when active + -- prints text to the screen when active + procedure print(active : boolean; text : string) is + begin + if active then + print(text); + end if; + end procedure print; - procedure print(active: boolean; text: string) is - begin - if active then - print(text); - end if; - end print; + -- converts std_logic into a character + function chr(sl : std_logic) return character is + variable c : character; + begin + case sl is + when 'U' => c := 'U'; + when 'X' => c := 'X'; + when '0' => c := '0'; + when '1' => c := '1'; + when 'Z' => c := 'Z'; + when 'W' => c := 'W'; + when 'L' => c := 'L'; + when 'H' => c := 'H'; + when '-' => c := '-'; + end case; + return c; + end function chr; - -- converts std_logic into a character - function chr(sl: std_logic) return character is - variable c: character; - begin - case sl is - when 'U' => c:= 'U'; - when 'X' => c:= 'X'; - when '0' => c:= '0'; - when '1' => c:= '1'; - when 'Z' => c:= 'Z'; - when 'W' => c:= 'W'; - when 'L' => c:= 'L'; - when 'H' => c:= 'H'; - when '-' => c:= '-'; - end case; - return c; - end chr; - - - - -- converts std_logic into a string (1 to 1) - - function str(sl: std_logic) return string is - variable s: string(1 to 1); + -- converts std_logic into a string (1 to 1) + function str(sl : std_logic) return string is + variable s : string(1 to 1); begin s(1) := chr(sl); return s; - end str; + end function str; + -- converts std_logic_vector into a string (binary base) + -- (this also takes care of the fact that the range of + -- a string is natural while a std_logic_vector may + -- have an integer range) + function str(slv : std_logic_vector) return string is + variable result : string (1 to slv'length); + variable r : integer; + begin + r := 1; + for i in slv'range loop + result(r) := chr(slv(i)); + r := r + 1; + end loop; + return result; + end function str; - -- converts std_logic_vector into a string (binary base) - -- (this also takes care of the fact that the range of - -- a string is natural while a std_logic_vector may - -- have an integer range) - - function str(slv: std_logic_vector) return string is - variable result : string (1 to slv'length); - variable r : integer; - begin - r := 1; - for i in slv'range loop - result(r) := chr(slv(i)); - r := r + 1; - end loop; - return result; - end str; - - - function str(b: boolean) return string is + function str(b : boolean) return string is + begin + if b then + return "true"; + else + return "false"; + end if; + end function str; + + + -- converts an integer into a character + -- for 0 to 9 the obvious mapping is used, higher + -- values are mapped to the characters A-Z + -- (this is usefull for systems with base > 10) + -- (adapted from Steve Vogwell's posting in comp.lang.vhdl) + function chr(int : integer) return character is + variable c : character; begin - if b then - return "true"; - else - return "false"; - end if; - end str; - - - -- converts an integer into a character - -- for 0 to 9 the obvious mapping is used, higher - -- values are mapped to the characters A-Z - -- (this is usefull for systems with base > 10) - -- (adapted from Steve Vogwell's posting in comp.lang.vhdl) - - function chr(int: integer) return character is - variable c: character; - begin case int is - when 0 => c := '0'; - when 1 => c := '1'; - when 2 => c := '2'; - when 3 => c := '3'; - when 4 => c := '4'; - when 5 => c := '5'; - when 6 => c := '6'; - when 7 => c := '7'; - when 8 => c := '8'; - when 9 => c := '9'; - when 10 => c := 'A'; - when 11 => c := 'B'; - when 12 => c := 'C'; - when 13 => c := 'D'; - when 14 => c := 'E'; - when 15 => c := 'F'; - when 16 => c := 'G'; - when 17 => c := 'H'; - when 18 => c := 'I'; - when 19 => c := 'J'; - when 20 => c := 'K'; - when 21 => c := 'L'; - when 22 => c := 'M'; - when 23 => c := 'N'; - when 24 => c := 'O'; - when 25 => c := 'P'; - when 26 => c := 'Q'; - when 27 => c := 'R'; - when 28 => c := 'S'; - when 29 => c := 'T'; - when 30 => c := 'U'; - when 31 => c := 'V'; - when 32 => c := 'W'; - when 33 => c := 'X'; - when 34 => c := 'Y'; - when 35 => c := 'Z'; - when others => c := '?'; + when 0 => c := '0'; + when 1 => c := '1'; + when 2 => c := '2'; + when 3 => c := '3'; + when 4 => c := '4'; + when 5 => c := '5'; + when 6 => c := '6'; + when 7 => c := '7'; + when 8 => c := '8'; + when 9 => c := '9'; + when 10 => c := 'A'; + when 11 => c := 'B'; + when 12 => c := 'C'; + when 13 => c := 'D'; + when 14 => c := 'E'; + when 15 => c := 'F'; + when 16 => c := 'G'; + when 17 => c := 'H'; + when 18 => c := 'I'; + when 19 => c := 'J'; + when 20 => c := 'K'; + when 21 => c := 'L'; + when 22 => c := 'M'; + when 23 => c := 'N'; + when 24 => c := 'O'; + when 25 => c := 'P'; + when 26 => c := 'Q'; + when 27 => c := 'R'; + when 28 => c := 'S'; + when 29 => c := 'T'; + when 30 => c := 'U'; + when 31 => c := 'V'; + when 32 => c := 'W'; + when 33 => c := 'X'; + when 34 => c := 'Y'; + when 35 => c := 'Z'; + when others => c := '?'; end case; return c; - end chr; - - - - -- convert integer to string using specified base - -- (adapted from Steve Vogwell's posting in comp.lang.vhdl) - - function str(int: integer; base: integer) return string is - - variable temp: string(1 to 10); - variable num: integer; - variable abs_int: integer; - variable len: integer := 1; - variable power: integer := 1; - - begin + end function chr; - -- bug fix for negative numbers - abs_int := abs(int); - num := abs_int; - - while num >= base loop -- Determine how many - len := len + 1; -- characters required - num := num / base; -- to represent the - end loop ; -- number. - - for i in len downto 1 loop -- Convert the number to - temp(i) := chr(abs_int/power mod base); -- a string starting - power := power * base; -- with the right hand - end loop ; -- side. - - -- return result and add sign if required - if int < 0 then - return '-'& temp(1 to len); - else - return temp(1 to len); - end if; - - end str; - - - -- convert integer to string, using base 10 - function str(int: integer) return string is + -- convert integer to string using specified base + -- (adapted from Steve Vogwell's posting in comp.lang.vhdl) + function str(int : integer; base : integer) return string is + variable temp : string(1 to 10); + variable num : integer; + variable abs_int : integer; + variable len : integer := 1; + variable power : integer := 1; + begin - begin + -- bug fix for negative numbers + abs_int := abs(int); - return str(int, 10) ; + num := abs_int; - end str; + while num >= base loop -- Determine how many + len := len + 1; -- characters required + num := num / base; -- to represent the + end loop; -- number. + for i in len downto 1 loop -- Convert the number to + temp(i) := chr(abs_int/power mod base); -- a string starting + power := power * base; -- with the right hand + end loop; -- side. + -- return result and add sign if required + if int < 0 then + return '-'& temp(1 to len); + else + return temp(1 to len); + end if; - -- converts a std_logic_vector into a hex string. - function hstr(slv: std_logic_vector) return string is - variable hexlen: integer; - variable longslv : std_logic_vector(67 downto 0) := (others => '0'); - variable hex : string(1 to 16); - variable fourbit : std_logic_vector(3 downto 0); - begin - hexlen := (slv'left+1)/4; - if (slv'left+1) mod 4 /= 0 then - hexlen := hexlen + 1; - end if; - longslv(slv'left downto 0) := slv; - for i in (hexlen -1) downto 0 loop - fourbit := longslv(((i*4)+3) downto (i*4)); - case fourbit is - when "0000" => hex(hexlen -I) := '0'; - when "0001" => hex(hexlen -I) := '1'; - when "0010" => hex(hexlen -I) := '2'; - when "0011" => hex(hexlen -I) := '3'; - when "0100" => hex(hexlen -I) := '4'; - when "0101" => hex(hexlen -I) := '5'; - when "0110" => hex(hexlen -I) := '6'; - when "0111" => hex(hexlen -I) := '7'; - when "1000" => hex(hexlen -I) := '8'; - when "1001" => hex(hexlen -I) := '9'; - when "1010" => hex(hexlen -I) := 'A'; - when "1011" => hex(hexlen -I) := 'B'; - when "1100" => hex(hexlen -I) := 'C'; - when "1101" => hex(hexlen -I) := 'D'; - when "1110" => hex(hexlen -I) := 'E'; - when "1111" => hex(hexlen -I) := 'F'; - when "ZZZZ" => hex(hexlen -I) := 'z'; - when "UUUU" => hex(hexlen -I) := 'u'; - when "XXXX" => hex(hexlen -I) := 'x'; - when others => hex(hexlen -I) := '?'; - end case; - end loop; - return hex(1 to hexlen); - end hstr; + end function str; + -- convert integer to string, using base 10 + function str(int : integer) return string is + begin + return str(int, 10); + end function str; - -- functions to manipulate strings - ----------------------------------- + -- converts a std_logic_vector into a hex string. + function hstr(slv : std_logic_vector) return string is + variable hexlen : integer; + variable longslv : std_logic_vector(67 downto 0) := (others => '0'); + variable hex : string(1 to 16); + variable fourbit : std_logic_vector(3 downto 0); + begin + hexlen := (slv'left+1)/4; + if (slv'left+1) mod 4 /= 0 then + hexlen := hexlen + 1; + end if; + longslv(slv'left downto 0) := slv; + for i in (hexlen -1) downto 0 loop + fourbit := longslv(((i*4)+3) downto (i*4)); + case fourbit is + when "0000" => hex(hexlen -I) := '0'; + when "0001" => hex(hexlen -I) := '1'; + when "0010" => hex(hexlen -I) := '2'; + when "0011" => hex(hexlen -I) := '3'; + when "0100" => hex(hexlen -I) := '4'; + when "0101" => hex(hexlen -I) := '5'; + when "0110" => hex(hexlen -I) := '6'; + when "0111" => hex(hexlen -I) := '7'; + when "1000" => hex(hexlen -I) := '8'; + when "1001" => hex(hexlen -I) := '9'; + when "1010" => hex(hexlen -I) := 'A'; + when "1011" => hex(hexlen -I) := 'B'; + when "1100" => hex(hexlen -I) := 'C'; + when "1101" => hex(hexlen -I) := 'D'; + when "1110" => hex(hexlen -I) := 'E'; + when "1111" => hex(hexlen -I) := 'F'; + when "ZZZZ" => hex(hexlen -I) := 'z'; + when "UUUU" => hex(hexlen -I) := 'u'; + when "XXXX" => hex(hexlen -I) := 'x'; + when others => hex(hexlen -I) := '?'; + end case; + end loop; + return hex(1 to hexlen); + end function hstr; - -- convert a character to upper case - function to_upper(c: character) return character is - variable u: character; + -- functions to manipulate strings + ----------------------------------- + -- convert a character to upper case + function to_upper(c : character) return character is + variable u : character; begin + case c is + when 'a' => u := 'A'; + when 'b' => u := 'B'; + when 'c' => u := 'C'; + when 'd' => u := 'D'; + when 'e' => u := 'E'; + when 'f' => u := 'F'; + when 'g' => u := 'G'; + when 'h' => u := 'H'; + when 'i' => u := 'I'; + when 'j' => u := 'J'; + when 'k' => u := 'K'; + when 'l' => u := 'L'; + when 'm' => u := 'M'; + when 'n' => u := 'N'; + when 'o' => u := 'O'; + when 'p' => u := 'P'; + when 'q' => u := 'Q'; + when 'r' => u := 'R'; + when 's' => u := 'S'; + when 't' => u := 'T'; + when 'u' => u := 'U'; + when 'v' => u := 'V'; + when 'w' => u := 'W'; + when 'x' => u := 'X'; + when 'y' => u := 'Y'; + when 'z' => u := 'Z'; + when others => u := c; + end case; + return u; + end function to_upper; - case c is - when 'a' => u := 'A'; - when 'b' => u := 'B'; - when 'c' => u := 'C'; - when 'd' => u := 'D'; - when 'e' => u := 'E'; - when 'f' => u := 'F'; - when 'g' => u := 'G'; - when 'h' => u := 'H'; - when 'i' => u := 'I'; - when 'j' => u := 'J'; - when 'k' => u := 'K'; - when 'l' => u := 'L'; - when 'm' => u := 'M'; - when 'n' => u := 'N'; - when 'o' => u := 'O'; - when 'p' => u := 'P'; - when 'q' => u := 'Q'; - when 'r' => u := 'R'; - when 's' => u := 'S'; - when 't' => u := 'T'; - when 'u' => u := 'U'; - when 'v' => u := 'V'; - when 'w' => u := 'W'; - when 'x' => u := 'X'; - when 'y' => u := 'Y'; - when 'z' => u := 'Z'; - when others => u := c; - end case; - - return u; - - end to_upper; - - - -- convert a character to lower case - - function to_lower(c: character) return character is - - variable l: character; + -- convert a character to lower case + function to_lower(c : character) return character is + variable l : character; begin + case c is + when 'A' => l := 'a'; + when 'B' => l := 'b'; + when 'C' => l := 'c'; + when 'D' => l := 'd'; + when 'E' => l := 'e'; + when 'F' => l := 'f'; + when 'G' => l := 'g'; + when 'H' => l := 'h'; + when 'I' => l := 'i'; + when 'J' => l := 'j'; + when 'K' => l := 'k'; + when 'L' => l := 'l'; + when 'M' => l := 'm'; + when 'N' => l := 'n'; + when 'O' => l := 'o'; + when 'P' => l := 'p'; + when 'Q' => l := 'q'; + when 'R' => l := 'r'; + when 'S' => l := 's'; + when 'T' => l := 't'; + when 'U' => l := 'u'; + when 'V' => l := 'v'; + when 'W' => l := 'w'; + when 'X' => l := 'x'; + when 'Y' => l := 'y'; + when 'Z' => l := 'z'; + when others => l := c; + end case; + return l; + end function to_lower; - case c is - when 'A' => l := 'a'; - when 'B' => l := 'b'; - when 'C' => l := 'c'; - when 'D' => l := 'd'; - when 'E' => l := 'e'; - when 'F' => l := 'f'; - when 'G' => l := 'g'; - when 'H' => l := 'h'; - when 'I' => l := 'i'; - when 'J' => l := 'j'; - when 'K' => l := 'k'; - when 'L' => l := 'l'; - when 'M' => l := 'm'; - when 'N' => l := 'n'; - when 'O' => l := 'o'; - when 'P' => l := 'p'; - when 'Q' => l := 'q'; - when 'R' => l := 'r'; - when 'S' => l := 's'; - when 'T' => l := 't'; - when 'U' => l := 'u'; - when 'V' => l := 'v'; - when 'W' => l := 'w'; - when 'X' => l := 'x'; - when 'Y' => l := 'y'; - when 'Z' => l := 'z'; - when others => l := c; - end case; - - return l; - - end to_lower; - - - - -- convert a string to upper case - function to_upper(s: string) return string is + -- convert a string to upper case + function to_upper(s : string) return string is + variable uppercase : string (s'range); + begin - variable uppercase: string (s'range); + for i in s'range loop + uppercase(i) := to_upper(s(i)); + end loop; + return uppercase; - begin + end function to_upper; - for i in s'range loop - uppercase(i):= to_upper(s(i)); - end loop; - return uppercase; - end to_upper; + -- convert a string to lower case + function to_lower(s : string) return string is + variable lowercase : string (s'range); + begin + for i in s'range loop + lowercase(i) := to_lower(s(i)); + end loop; + return lowercase; + end function to_lower; - -- convert a string to lower case + -- functions to convert strings into other types + ------------------------------------------------ - function to_lower(s: string) return string is + -- converts a character into a std_logic + function to_std_logic(c : character) return std_logic is + variable sl : std_logic; + begin + case c is + when 'U' => + sl := 'U'; + when 'X' => + sl := 'X'; + when '0' => + sl := '0'; + when '1' => + sl := '1'; + when 'Z' => + sl := 'Z'; + when 'W' => + sl := 'W'; + when 'L' => + sl := 'L'; + when 'H' => + sl := 'H'; + when '-' => + sl := '-'; + when others => + sl := 'X'; + end case; + return sl; + end function to_std_logic; - variable lowercase: string (s'range); - begin + -- converts a string into std_logic_vector + function to_std_logic_vector(s : string) return std_logic_vector is + variable slv : std_logic_vector(s'high-s'low downto 0); + variable k : integer; + begin + k := s'high-s'low; + for i in s'range loop + slv(k) := to_std_logic(s(i)); + k := k - 1; + end loop; + return slv; + end function to_std_logic_vector; - for i in s'range loop - lowercase(i):= to_lower(s(i)); - end loop; - return lowercase; - end to_lower; + -- file I/O + ------------- + -- read variable length string from input file + procedure str_read(file in_file : text; res_string : out string) is + variable l : line; + variable c : character; + variable is_string : boolean; + begin + readline(in_file, l); + -- clear the contents of the result string + for i in res_string'range loop + res_string(i) := ' '; + end loop; + -- read all characters of the line, up to the length + -- of the results string + for i in res_string'range loop + read(l, c, is_string); + res_string(i) := c; + if not is_string then -- found end of line + exit; + end if; + end loop; + end procedure str_read; + + + -- print string to a file + procedure print(file out_file : text; new_string : in string) is + variable l : line; + begin + write(l, new_string); + writeline(out_file, l); + end procedure print; --- functions to convert strings into other types + -- print character to a file and start new line + procedure print(file out_file : text; char : in character) is + variable l : line; + begin + write(l, char); + writeline(out_file, l); + end procedure print; --- converts a character into a std_logic -function to_std_logic(c: character) return std_logic is - variable sl: std_logic; + -- appends contents of a string to a file until line feed occurs + -- (LF is considered to be the end of the string) + procedure str_write(file out_file : text; new_string : in string) is begin - case c is - when 'U' => - sl := 'U'; - when 'X' => - sl := 'X'; - when '0' => - sl := '0'; - when '1' => - sl := '1'; - when 'Z' => - sl := 'Z'; - when 'W' => - sl := 'W'; - when 'L' => - sl := 'L'; - when 'H' => - sl := 'H'; - when '-' => - sl := '-'; - when others => - sl := 'X'; - end case; - return sl; - end to_std_logic; - - --- converts a string into std_logic_vector - -function to_std_logic_vector(s: string) return std_logic_vector is - variable slv: std_logic_vector(s'high-s'low downto 0); - variable k: integer; -begin - k := s'high-s'low; - for i in s'range loop - slv(k) := to_std_logic(s(i)); - k := k - 1; - end loop; - return slv; -end to_std_logic_vector; - - - - - - ----------------- --- file I/O -- ----------------- - - - --- read variable length string from input file - -procedure str_read(file in_file: TEXT; - res_string: out string) is - - variable l: line; - variable c: character; - variable is_string: boolean; - - begin - - readline(in_file, l); - -- clear the contents of the result string - for i in res_string'range loop - res_string(i) := ' '; - end loop; - -- read all characters of the line, up to the length - -- of the results string - for i in res_string'range loop - read(l, c, is_string); - res_string(i) := c; - if not is_string then -- found end of line - exit; - end if; - end loop; - -end str_read; - - --- print string to a file -procedure print(file out_file: TEXT; - new_string: in string) is - - variable l: line; - - begin - - write(l, new_string); - writeline(out_file, l); - -end print; - - --- print character to a file and start new line -procedure print(file out_file: TEXT; - char: in character) is - - variable l: line; - - begin - - write(l, char); - writeline(out_file, l); - -end print; - - - --- appends contents of a string to a file until line feed occurs --- (LF is considered to be the end of the string) - -procedure str_write(file out_file: TEXT; - new_string: in string) is - begin - - for i in new_string'range loop - print(out_file, new_string(i)); - if new_string(i) = LF then -- end of string - exit; - end if; - end loop; - -end str_write; - - - - -end txt_util; - + for i in new_string'range loop + print(out_file, new_string(i)); + if new_string(i) = LF then -- end of string + exit; + end if; + end loop; + end procedure str_write; +end package body txt_util; diff --git a/zpu/hdl/zpu4/src/zpuio.vhd b/zpu/hdl/zpu4/src/zpuio.vhd index 2c7fd41..9ca9050 100644 --- a/zpu/hdl/zpu4/src/zpuio.vhd +++ b/zpu/hdl/zpu4/src/zpuio.vhd @@ -1,232 +1,218 @@ -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.STD_LOGIC_UNSIGNED.ALL; +library ieee; +use ieee.std_logic_1164.all; library work; use work.zpu_config.all; use work.zpupkg.all; entity zpuio is - port ( areset : in std_logic; - cpu_clk : in std_logic; - clk_status : in std_logic_vector(2 downto 0); - cpu_din : in std_logic_vector(15 downto 0); - cpu_a : in std_logic_vector(20 downto 0); - cpu_we : in std_logic_vector(1 downto 0); - cpu_re : in std_logic; - cpu_dout : inout std_logic_vector(15 downto 0)); + port ( + areset : in std_logic; + cpu_clk : in std_logic; + clk_status : in std_logic_vector(2 downto 0); + cpu_din : in std_logic_vector(15 downto 0); + cpu_a : in std_logic_vector(20 downto 0); + cpu_we : in std_logic_vector(1 downto 0); + cpu_re : in std_logic; + cpu_dout : inout std_logic_vector(15 downto 0) + ); end zpuio; architecture behave of zpuio is -signal timer_read : std_logic_vector(7 downto 0); ---signal timer_write : std_logic_vector(7 downto 0); -signal timer_we : std_logic; - - -signal io_busy : std_logic; -signal io_read : std_logic_vector(7 downto 0); ---signal io_write : std_logic_vector(7 downto 0); -signal io_addr : std_logic_vector(maxAddrBit downto minAddrBit); -signal io_writeEnable : std_logic; -signal Enable : std_logic; - -signal din : std_logic_vector(7 downto 0); -signal dout : std_logic_vector(7 downto 0); -signal adr : std_logic_vector(15 downto 0); -signal break : std_logic; -signal we : std_logic; -signal re : std_logic; - - --- uart forwarding... - -signal uartTXPending : std_logic; -signal uartTXCleared : std_logic; -signal uartData : std_logic_vector(7 downto 0); - -signal readingTimer : std_logic; - - - - -signal mem_busy : std_logic; -signal mem_read : std_logic_vector(wordSize-1 downto 0); -signal mem_write : std_logic_vector(wordSize-1 downto 0); -signal mem_addr : std_logic_vector(maxAddrBitIncIO downto 0); -signal mem_writeEnable : std_logic; -signal mem_readEnable : std_logic; -signal mem_writeMask: std_logic_vector(wordBytes-1 downto 0); - -signal dram_mem_busy : std_logic; -signal dram_mem_read : std_logic_vector(wordSize-1 downto 0); -signal dram_mem_write : std_logic_vector(wordSize-1 downto 0); -signal dram_mem_writeEnable : std_logic; -signal dram_mem_readEnable : std_logic; -signal dram_mem_writeMask: std_logic_vector(wordBytes-1 downto 0); - - - ---signal io_mem_read : std_logic_vector(7 downto 0); ---signal io_mem_writeEnable : std_logic; ---signal io_mem_readEnable : std_logic; -signal io_readEnable : std_logic; - - -signal dram_read : std_logic; - - + signal timer_read : std_logic_vector(7 downto 0); + signal timer_we : std_logic; + -- + signal io_busy : std_logic; + signal io_read : std_logic_vector(7 downto 0); + signal io_addr : std_logic_vector(maxAddrBit downto minAddrBit); + signal io_writeEnable : std_logic; + signal Enable : std_logic; + -- + signal din : std_logic_vector(7 downto 0); + signal dout : std_logic_vector(7 downto 0); + signal adr : std_logic_vector(15 downto 0); + signal break : std_logic; + signal we : std_logic; + signal re : std_logic; + -- + -- uart forwarding... + signal uartTXPending : std_logic; + signal uartTXCleared : std_logic; + signal uartData : std_logic_vector(7 downto 0); + -- + signal readingTimer : std_logic; + -- + -- + signal mem_busy : std_logic; + signal mem_read : std_logic_vector(wordSize-1 downto 0); + signal mem_write : std_logic_vector(wordSize-1 downto 0); + signal mem_addr : std_logic_vector(maxAddrBitIncIO downto 0); + signal mem_writeEnable : std_logic; + signal mem_readEnable : std_logic; + signal mem_writeMask : std_logic_vector(wordBytes-1 downto 0); + -- + signal dram_mem_busy : std_logic; + signal dram_mem_read : std_logic_vector(wordSize-1 downto 0); + signal dram_mem_write : std_logic_vector(wordSize-1 downto 0); + signal dram_mem_writeEnable : std_logic; + signal dram_mem_readEnable : std_logic; + signal dram_mem_writeMask : std_logic_vector(wordBytes-1 downto 0); + -- + signal io_readEnable : std_logic; + -- + signal dram_read : std_logic; begin - io_addr <= mem_addr(maxAddrBit downto minAddrBit); - - timerinst: timer port map ( - clk => cpu_clk, - areset => areset, - we => timer_we, - din => mem_write(7 downto 0), - adr => io_addr(4 downto 2), - dout => timer_read); - - zpu: zpu_core port map ( - clk => cpu_clk , - areset => areset, - in_mem_busy => mem_busy, - mem_read => mem_read, - mem_write => mem_write, - out_mem_addr => mem_addr, - out_mem_writeEnable => mem_writeEnable, - out_mem_readEnable => mem_readEnable, - mem_writeMask => mem_writeMask, - interrupt => '0', - break => break); - - -ram_imp: dram port map ( - clk => cpu_clk , - areset => areset, - mem_busy => dram_mem_busy, - mem_read => dram_mem_read, - mem_write => mem_write, - mem_addr => mem_addr(maxAddrBit downto 0), - mem_writeEnable => dram_mem_writeEnable, - mem_readEnable => dram_mem_readEnable, - mem_writeMask => mem_writeMask); - - - - fauxUart: - process(cpu_clk, areset) - begin - if areset = '1' then - io_busy <= '0'; - uartTXPending <= '0'; - timer_we <= '0'; - io_busy <= '0'; - uartData <= x"58"; -- 'X' - readingTimer <= '0'; - elsif (cpu_clk'event and cpu_clk = '1') then - timer_we <= '0'; - io_busy <= '0'; - if uartTXCleared = '1' then - uartTXPending <= '0'; - end if; - - if io_writeEnable = '1' then - if io_addr=x"2028003" then - -- Write to UART - uartData <= mem_write(7 downto 0); - uartTXPending <= '1'; - io_busy <= '1'; - elsif io_addr(12)='1' then - timer_we <= '1'; - io_busy <= '1'; - else --- report "Illegal IO write" severity failure; - end if; - end if; - if (io_readEnable = '1') then - if io_addr=x"2028003" then - io_read <= (0=>'1', -- recieve empty - 1 => uartTXPending, -- tx full - others => '0'); - io_busy <= '1'; - elsif io_addr(12)='1' then - readingTimer <= '1'; - io_busy <= '1'; - elsif io_addr(11)='1' then - io_read <= ZPU_Frequency; - io_busy <= '1'; - else --- report "Illegal IO read" severity failure; - end if; - - else - if (readingTimer = '1') then - readingTimer <= '0'; - io_read <= timer_read; - io_busy <= '0'; - else - io_read <= (others => '1'); - end if; - end if; - end if; - end process; - - - forwardUARTOutputToARM: - process(cpu_clk, areset) - begin - if areset = '1' then - uartTXCleared <= '0'; - elsif (cpu_clk = '1' and cpu_clk'event) then - if cpu_we(0) = '1' and cpu_a(3 downto 1) = "000" then - uartTXCleared <= cpu_din(0); - else - uartTXCleared <= uartTXCleared; - end if; - end if; - end process; - - cpu_dout(7 downto 0) <= uartData when (cpu_re = '1' and cpu_a(3 downto 1) = "001") else (others => 'Z'); - cpu_dout <= (0 => uartTXPending, others => '0') when (cpu_re = '1' and cpu_a(3 downto 1) = "000") else (others => 'Z'); - - dram_mem_writeEnable <= mem_writeEnable and not mem_addr(ioBit); - dram_mem_readEnable <= mem_readEnable and not mem_addr(ioBit); - io_writeEnable <= mem_writeEnable and mem_addr(ioBit); --- io_readEnable <= mem_readEnable and mem_addr(ioBit); - mem_busy <= io_busy or dram_mem_busy or dram_read or io_readEnable; - - -- Memory reads either come from IO or DRAM. We need to pick the right one. - memorycontrol: - process(cpu_clk, areset) - begin - if areset = '1' then - dram_read <= '0'; - io_readEnable <= '0'; - - - elsif (cpu_clk'event and cpu_clk = '1') then - mem_read <= (others => '0'); - if mem_addr(ioBit)='0' and mem_readEnable='1' then - dram_read <= '1'; - end if; - if dram_read='1' and dram_mem_busy='0' then - dram_read <= '0'; - mem_read <= dram_mem_read; - end if; - - if mem_addr(ioBit)='1' and mem_readEnable='1' then - io_readEnable <= '1'; - end if; - if io_readEnable='1' and io_busy='0' then - io_readEnable <= '0'; - mem_read(7 downto 0) <= io_read; - end if; - - end if; - end process; - - -end behave; + io_addr <= mem_addr(maxAddrBit downto minAddrBit); + + timerinst : timer + port map ( + clk => cpu_clk, + areset => areset, + we => timer_we, + din => mem_write(7 downto 0), + adr => io_addr(4 downto 2), + dout => timer_read + ); + + zpu : zpu_core + port map ( + clk => cpu_clk , + areset => areset, + in_mem_busy => mem_busy, + mem_read => mem_read, + mem_write => mem_write, + out_mem_addr => mem_addr, + out_mem_writeEnable => mem_writeEnable, + out_mem_readEnable => mem_readEnable, + mem_writeMask => mem_writeMask, + interrupt => '0', + break => break + ); + + + ram_imp : dram + port map ( + clk => cpu_clk, + areset => areset, + mem_busy => dram_mem_busy, + mem_read => dram_mem_read, + mem_write => mem_write, + mem_addr => mem_addr(maxAddrBit downto 0), + mem_writeEnable => dram_mem_writeEnable, + mem_readEnable => dram_mem_readEnable, + mem_writeMask => mem_writeMask + ); + + + fauxUart : process(cpu_clk, areset) + begin + if areset = '1' then + io_busy <= '0'; + uartTXPending <= '0'; + timer_we <= '0'; + io_busy <= '0'; + uartData <= x"58"; -- 'X' + readingTimer <= '0'; + elsif rising_edge(cpu_clk) then + timer_we <= '0'; + io_busy <= '0'; + if uartTXCleared = '1' then + uartTXPending <= '0'; + end if; + + if io_writeEnable = '1' then + if io_addr = x"2028003" then + -- Write to UART + uartData <= mem_write(7 downto 0); + uartTXPending <= '1'; + io_busy <= '1'; + elsif io_addr(12) = '1' then + timer_we <= '1'; + io_busy <= '1'; + else + -- report "Illegal IO write" severity failure; + end if; + end if; + if (io_readEnable = '1') then + if io_addr = x"2028003" then + io_read <= (0 => '1', -- recieve empty + 1 => uartTXPending, -- tx full + others => '0'); + io_busy <= '1'; + elsif io_addr(12) = '1' then + readingTimer <= '1'; + io_busy <= '1'; + elsif io_addr(11) = '1' then + io_read <= ZPU_Frequency; + io_busy <= '1'; + else + -- report "Illegal IO read" severity failure; + end if; + + else + if (readingTimer = '1') then + readingTimer <= '0'; + io_read <= timer_read; + io_busy <= '0'; + else + io_read <= (others => '1'); + end if; + end if; + end if; + end process; + + + forwardUARTOutputToARM : process(cpu_clk, areset) + begin + if areset = '1' then + uartTXCleared <= '0'; + elsif rising_edge(cpu_clkt) then + if cpu_we(0) = '1' and cpu_a(3 downto 1) = "000" then + uartTXCleared <= cpu_din(0); + else + uartTXCleared <= uartTXCleared; + end if; + end if; + end process; + + cpu_dout(7 downto 0) <= uartData when (cpu_re = '1' and cpu_a(3 downto 1) = "001") else (others => 'Z'); + cpu_dout <= (0 => uartTXPending, others => '0') when (cpu_re = '1' and cpu_a(3 downto 1) = "000") else (others => 'Z'); + + dram_mem_writeEnable <= mem_writeEnable and not mem_addr(ioBit); + dram_mem_readEnable <= mem_readEnable and not mem_addr(ioBit); + io_writeEnable <= mem_writeEnable and mem_addr(ioBit); + mem_busy <= io_busy or dram_mem_busy or dram_read or io_readEnable; + + -- Memory reads either come from IO or DRAM. We need to pick the right one. + memorycontrol : process(cpu_clk, areset) + begin + if areset = '1' then + dram_read <= '0'; + io_readEnable <= '0'; + + elsif rising_edge(cpu_clk) then + mem_read <= (others => '0'); + if mem_addr(ioBit) = '0' and mem_readEnable = '1' then + dram_read <= '1'; + end if; + if dram_read = '1' and dram_mem_busy = '0' then + dram_read <= '0'; + mem_read <= dram_mem_read; + end if; + + if mem_addr(ioBit) = '1' and mem_readEnable = '1' then + io_readEnable <= '1'; + end if; + if io_readEnable = '1' and io_busy = '0' then + io_readEnable <= '0'; + mem_read(7 downto 0) <= io_read; + end if; + + end if; + end process; + + +end architecture behave; -- cgit v1.1